From lkp at intel.com  Sun Sep  1 05:46:43 2024
From: lkp at intel.com (kernel test robot)
Date: Sun, 1 Sep 2024 20:46:43 +0800
Subject: [PATCH v3 4/5] pinctrl: airoha: Add support for EN7581 SoC
In-Reply-To: <20240831-en7581-pinctrl-v3-4-98eebfb4da66@kernel.org>
References: <20240831-en7581-pinctrl-v3-4-98eebfb4da66@kernel.org>
Message-ID: <202409012015.isPMHBiL-lkp@intel.com>

Hi Lorenzo,

kernel test robot noticed the following build errors:

[auto build test ERROR on defaf1a2113a22b00dfa1abc0fd2014820eaf065]

url:    https://github.com/intel-lab-lkp/linux/commits/Lorenzo-Bianconi/dt-bindings-arm-airoha-Add-the-chip-scu-node-for-EN7581-SoC/20240831-222958
base:   defaf1a2113a22b00dfa1abc0fd2014820eaf065
patch link:    https://lore.kernel.org/r/20240831-en7581-pinctrl-v3-4-98eebfb4da66%40kernel.org
patch subject: [PATCH v3 4/5] pinctrl: airoha: Add support for EN7581 SoC
config: sh-allmodconfig (https://download.01.org/0day-ci/archive/20240901/202409012015.isPMHBiL-lkp at intel.com/config)
compiler: sh4-linux-gcc (GCC) 14.1.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240901/202409012015.isPMHBiL-lkp at intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp at intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202409012015.isPMHBiL-lkp at intel.com/

All errors (new ones prefixed by >>, old ones prefixed by <<):

WARNING: modpost: missing MODULE_DESCRIPTION() in kernel/locking/test-ww_mutex.o
WARNING: modpost: missing MODULE_DESCRIPTION() in lib/test_objpool.o
WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/usb/serial/ch341.o
WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/usb/serial/usb_debug.o
WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/usb/serial/mxuport.o
WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/usb/serial/navman.o
WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/usb/serial/qcaux.o
WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/usb/serial/usb-serial-simple.o
WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/usb/serial/symbolserial.o
WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/devfreq/governor_simpleondemand.o
WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/devfreq/governor_performance.o
WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/devfreq/governor_powersave.o
WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/devfreq/governor_userspace.o
WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/fsi/fsi-core.o
WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/fsi/fsi-master-hub.o
WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/fsi/fsi-master-aspeed.o
WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/fsi/fsi-master-gpio.o
WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/fsi/fsi-master-ast-cf.o
WARNING: modpost: missing MODULE_DESCRIPTION() in drivers/fsi/fsi-scom.o
>> ERROR: modpost: "__ffsdi2" [drivers/pinctrl/mediatek/pinctrl-airoha.ko] undefined!
ERROR: modpost: "__delay" [drivers/net/mdio/mdio-cavium.ko] undefined!
ERROR: modpost: "devm_of_clk_add_hw_provider" [drivers/media/i2c/tc358746.ko] undefined!
ERROR: modpost: "devm_clk_hw_register" [drivers/media/i2c/tc358746.ko] undefined!
ERROR: modpost: "of_clk_hw_simple_get" [drivers/media/i2c/tc358746.ko] undefined!

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki


From zillevdr at gmx.de  Sun Sep  1 05:58:46 2024
From: zillevdr at gmx.de (Jens Ziller)
Date: Sun, 1 Sep 2024 14:58:46 +0200
Subject: mt8186-corsola-tentacruel panel flickers
Message-ID: <20240901145846.56b07482@zotac.lan>

Hi list,

I wish boot linux on an ASUS Chromebook CM14 Flip (CM1402F). I test
with Kernel from Collabora for-kernelci branch and linux-6.11.0-rc5.
The patch from [1] enable the display. But the panel flickers. It
looks like 1 or 2 times per second are a black framebuffer. Xorg
flickers also. I found no relevant fail message. With vendor kernel are
no flickers, but no panfrost acceleration for xorg.

Thank's for help
Jens

[1] https://www.spinics.net/lists/kernel/msg5332153.html

dmesg:
[    0.000000] Booting Linux on physical CPU 0x0000000000 [0x411fd050]
[    0.000000] Linux version 6.11.0-rc5 (root at book) (aarch64-unknown-linux-gnu-gcc (Gentoo 13.2.1_p20240210 p14) 13.2.1 20240210, GNU ld (Gentoo 2.42 p3) 2.42.0) #2 SMP PREEMPT Sat Aug 31 19:14:13 CEST 2024
[    0.000000] KASLR enabled
[    0.000000] random: crng init done
[    0.000000] Machine model: Google Tentacruel board
[    0.000000] Reserved memory: created DMA memory pool at 0x0000000050000000, size 16 MiB
[    0.000000] OF: reserved mem: initialized node memory at 50000000, compatible id shared-dma-pool
[    0.000000] OF: reserved mem: 0x0000000050000000..0x000000005109ffff (17024 KiB) nomap non-reusable memory at 50000000
[    0.000000] Reserved memory: created DMA memory pool at 0x0000000060000000, size 10 MiB
[    0.000000] OF: reserved mem: initialized node memory at 60000000, compatible id shared-dma-pool
[    0.000000] OF: reserved mem: 0x0000000060000000..0x00000000609fffff (10240 KiB) nomap non-reusable memory at 60000000
[    0.000000] Reserved memory: created DMA memory pool at 0x0000000061000000, size 1 MiB
[    0.000000] OF: reserved mem: initialized node memory at 61000000, compatible id shared-dma-pool
[    0.000000] OF: reserved mem: 0x0000000061000000..0x00000000610fffff (1024 KiB) nomap non-reusable memory at 61000000
[    0.000000] OF: reserved mem: 0x00000000ffec4000..0x00000000fffc3fff (1024 KiB) map non-reusable ramoops
[    0.000000] Zone ranges:
[    0.000000]   DMA      [mem 0x0000000040000000-0x00000000ffffffff]
[    0.000000]   DMA32    empty
[    0.000000]   Normal   [mem 0x0000000100000000-0x000000023fffffff]
[    0.000000] Movable zone start for each node
[    0.000000] Early memory node ranges
[    0.000000]   node   0: [mem 0x0000000040000000-0x000000004fffffff]
[    0.000000]   node   0: [mem 0x0000000050000000-0x000000005109ffff]
[    0.000000]   node   0: [mem 0x00000000510a0000-0x00000000545fffff]
[    0.000000]   node   0: [mem 0x0000000054700000-0x000000005fffffff]
[    0.000000]   node   0: [mem 0x0000000060000000-0x00000000609fffff]
[    0.000000]   node   0: [mem 0x0000000060a00000-0x0000000060ffffff]
[    0.000000]   node   0: [mem 0x0000000061000000-0x00000000610fffff]
[    0.000000]   node   0: [mem 0x0000000061100000-0x0000000069ffffff]
[    0.000000]   node   0: [mem 0x000000006a100000-0x00000000ffdfffff]
[    0.000000]   node   0: [mem 0x0000000100000000-0x000000023fffffff]
[    0.000000] Initmem setup node 0 [mem 0x0000000040000000-0x000000023fffffff]
[    0.000000] On node 0, zone DMA: 256 pages in unavailable ranges
[    0.000000] On node 0, zone DMA: 256 pages in unavailable ranges
[    0.000000] On node 0, zone Normal: 512 pages in unavailable ranges
[    0.000000] psci: probing for conduit method from DT.
[    0.000000] psci: PSCIv1.1 detected in firmware.
[    0.000000] psci: Using standard PSCI v0.2 function IDs
[    0.000000] psci: MIGRATE_INFO_TYPE not supported.
[    0.000000] psci: SMC Calling Convention v1.2
[    0.000000] percpu: Embedded 31 pages/cpu s88088 r8192 d30696 u126976
[    0.000000] pcpu-alloc: s88088 r8192 d30696 u126976 alloc=31*4096
[    0.000000] pcpu-alloc: [0] 0 [0] 1 [0] 2 [0] 3 [0] 4 [0] 5 [0] 6 [0] 7
[    0.000000] Detected VIPT I-cache on CPU0
[    0.000000] CPU features: detected: GIC system register CPU interface
[    0.000000] CPU features: detected: Virtualization Host Extensions
[    0.000000] CPU features: kernel page table isolation forced ON by KASLR
[    0.000000] CPU features: detected: Kernel page table isolation (KPTI)
[    0.000000] CPU features: detected: Qualcomm erratum 1009, or ARM erratum 1286807, 2441009
[    0.000000] CPU features: detected: ARM errata 1165522, 1319367, or 1530923
[    0.000000] alternatives: applying boot alternatives
[    0.000000] Kernel command line: cros_secure console=ttyS0,115200n8 console=tty0 noinitrd root=/dev/sda3 rootfstype=ext4 rw rootwait lsm.module_locking=0 vt.global_cursor_default=1
[    0.000000] Unknown kernel command line parameters "cros_secure noinitrd", will be passed to user space.
[    0.000000] Dentry cache hash table entries: 1048576 (order: 11, 8388608 bytes, linear)
[    0.000000] Inode-cache hash table entries: 524288 (order: 10, 4194304 bytes, linear)
[    0.000000] Built 1 zonelists, mobility grouping on.  Total pages: 2096128
[    0.000000] mem auto-init: stack:all(zero), heap alloc:on, heap free:off
[    0.000000] software IO TLB: area num 8.
[    0.000000] software IO TLB: mapped [mem 0x00000000fbe00000-0x00000000ffe00000] (64MB)
[    0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=8, Nodes=1
[    0.000000] ftrace: allocating 42001 entries in 165 pages
[    0.000000] ftrace: allocated 165 pages with 4 groups
[    0.000000] trace event string verifier disabled
[    0.000000] rcu: Preemptible hierarchical RCU implementation.
[    0.000000] 	Trampoline variant of Tasks RCU enabled.
[    0.000000] 	Rude variant of Tasks RCU enabled.
[    0.000000] 	Tracing variant of Tasks RCU enabled.
[    0.000000] rcu: RCU calculated value of scheduler-enlistment delay is 100 jiffies.
[    0.000000] RCU Tasks: Setting shift to 3 and lim to 1 rcu_task_cb_adjust=1.
[    0.000000] RCU Tasks Rude: Setting shift to 3 and lim to 1 rcu_task_cb_adjust=1.
[    0.000000] RCU Tasks Trace: Setting shift to 3 and lim to 1 rcu_task_cb_adjust=1.
[    0.000000] NR_IRQS: 64, nr_irqs: 64, preallocated irqs: 0
[    0.000000] GICv3: GIC: Using split EOI/Deactivate mode
[    0.000000] GICv3: 480 SPIs implemented
[    0.000000] GICv3: 0 Extended SPIs implemented
[    0.000000] Root IRQ handler: gic_handle_irq
[    0.000000] GICv3: GICv3 features: 16 PPIs
[    0.000000] GICv3: GICD_CTRL.DS=0, SCR_EL3.FIQ=0
[    0.000000] GICv3: CPU0: found redistributor 0 region 0:0x000000000c040000
[    0.000000] GICv3: GIC: PPI partition interrupt-partition-0[0] { /cpus/cpu at 0[0] /cpus/cpu at 100[1] /cpus/cpu at 200[2] /cpus/cpu at 300[3] /cpus/cpu at 400[4] /cpus/cpu at 500[5] }
[    0.000000] GICv3: GIC: PPI partition interrupt-partition-1[1] { /cpus/cpu at 600[6] /cpus/cpu at 700[7] }
[    0.000000] rcu: 	Offload RCU callbacks from CPUs: 0-7.
[    0.000000] rcu: srcu_init: Setting srcu_struct sizes based on contention.
[    0.000000] arch_timer: cp15 timer(s) running at 13.00MHz (phys).
[    0.000000] clocksource: arch_sys_counter: mask: 0xffffffffffffff max_cycles: 0x2ff89eacb, max_idle_ns: 440795202429 ns
[    0.000000] sched_clock: 56 bits at 13MHz, resolution 76ns, wraps every 4398046511101ns
[    0.000410] kfence: initialized - using 2097152 bytes for 255 objects at 0x(____ptrval____)-0x(____ptrval____)
[    0.000516] Console: colour dummy device 80x25
[    0.000524] printk: legacy console [tty0] enabled
[    0.000996] Calibrating delay loop (skipped), value calculated using timer frequency.. 26.00 BogoMIPS (lpj=13000)
[    0.001011] pid_max: default: 32768 minimum: 301
[    0.001093] LSM: initializing lsm=capability,landlock,yama,loadpin,safesetid,selinux
[    0.001143] landlock: Up and running.
[    0.001149] Yama: becoming mindful.
[    0.001163] LoadPin: ready to pin (currently enforcing)
[    0.001176] SELinux:  Initializing.
[    0.001314] Mount-cache hash table entries: 16384 (order: 5, 131072 bytes, linear)
[    0.001337] Mountpoint-cache hash table entries: 16384 (order: 5, 131072 bytes, linear)
[    0.002853] rcu: Hierarchical SRCU implementation.
[    0.002868] rcu: 	Max phase no-delay instances is 400.
[    0.003121] Timer migration: 1 hierarchy levels; 8 children per group; 1 crossnode level
[    0.003497] smp: Bringing up secondary CPUs ...
[    0.003840] Detected VIPT I-cache on CPU1
[    0.003892] GICv3: CPU1: found redistributor 100 region 0:0x000000000c060000
[    0.003918] CPU1: Booted secondary processor 0x0000000100 [0x411fd050]
[    0.004304] Detected VIPT I-cache on CPU2
[    0.004338] GICv3: CPU2: found redistributor 200 region 0:0x000000000c080000
[    0.004354] CPU2: Booted secondary processor 0x0000000200 [0x411fd050]
[    0.004688] Detected VIPT I-cache on CPU3
[    0.004719] GICv3: CPU3: found redistributor 300 region 0:0x000000000c0a0000
[    0.004733] CPU3: Booted secondary processor 0x0000000300 [0x411fd050]
[    0.005118] Detected VIPT I-cache on CPU4
[    0.005150] GICv3: CPU4: found redistributor 400 region 0:0x000000000c0c0000
[    0.005164] CPU4: Booted secondary processor 0x0000000400 [0x411fd050]
[    0.005497] Detected VIPT I-cache on CPU5
[    0.005530] GICv3: CPU5: found redistributor 500 region 0:0x000000000c0e0000
[    0.005544] CPU5: Booted secondary processor 0x0000000500 [0x411fd050]
[    0.006007] CPU features: detected: Spectre-v4
[    0.006012] CPU features: detected: Spectre-BHB
[    0.006015] CPU features: detected: ARM erratum 1463225
[    0.006018] Detected PIPT I-cache on CPU6
[    0.006053] GICv3: CPU6: found redistributor 600 region 0:0x000000000c100000
[    0.006066] CPU6: Booted secondary processor 0x0000000600 [0x413fd0b0]
[    0.006444] Detected PIPT I-cache on CPU7
[    0.006484] GICv3: CPU7: found redistributor 700 region 0:0x000000000c120000
[    0.006497] CPU7: Booted secondary processor 0x0000000700 [0x413fd0b0]
[    0.006554] smp: Brought up 1 node, 8 CPUs
[    0.006676] SMP: Total of 8 processors activated.
[    0.006683] CPU: All CPU(s) started at EL2
[    0.006689] CPU features: detected: 32-bit EL0 Support
[    0.006696] CPU features: detected: Data cache clean to the PoU not required for I/D coherence
[    0.006705] CPU features: detected: Common not Private translations
[    0.006712] CPU features: detected: CRC32 instructions
[    0.006721] CPU features: detected: RCpc load-acquire (LDAPR)
[    0.006728] CPU features: detected: LSE atomic instructions
[    0.006735] CPU features: detected: Privileged Access Never
[    0.006741] CPU features: detected: RAS Extension Support
[    0.006749] CPU features: detected: Speculative Store Bypassing Safe (SSBS)
[    0.006794] alternatives: applying system-wide alternatives
[    0.008948] CPU features: detected: Hardware dirty bit management on CPU6-7
[    0.009125] Memory: 8092716K/8384512K available (12544K kernel code, 2734K rwdata, 4708K rodata, 5504K init, 582K bss, 284408K reserved, 0K cma-reserved)
[    0.010216] devtmpfs: initialized
[    0.014532] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 1911260446275000 ns
[    0.014561] futex hash table entries: 2048 (order: 5, 131072 bytes, linear)
[    0.014611] 2G module region forced by RANDOMIZE_MODULE_REGION_FULL
[    0.014616] 0 pages in range for non-PLT usage
[    0.014619] 517712 pages in range for PLT usage
[    0.014737] pinctrl core: initialized pinctrl subsystem
[    0.015073] NET: Registered PF_NETLINK/PF_ROUTE protocol family
[    0.015532] DMA: preallocated 1024 KiB GFP_KERNEL pool for atomic allocations
[    0.015692] DMA: preallocated 1024 KiB GFP_KERNEL|GFP_DMA pool for atomic allocations
[    0.015843] DMA: preallocated 1024 KiB GFP_KERNEL|GFP_DMA32 pool for atomic allocations
[    0.015863] audit: initializing netlink subsys (disabled)
[    0.015954] audit: type=2000 audit(0.014:1): state=initialized audit_enabled=0 res=1
[    0.016237] thermal_sys: Registered thermal governor 'step_wise'
[    0.016241] thermal_sys: Registered thermal governor 'user_space'
[    0.016248] thermal_sys: Registered thermal governor 'power_allocator'
[    0.016281] cpuidle: using governor ladder
[    0.016300] cpuidle: using governor menu
[    0.016371] hw-breakpoint: found 6 breakpoint and 4 watchpoint registers.
[    0.016462] ASID allocator initialised with 32768 entries
[    0.023397] gpiochip_find_base_unlocked: found new base at 512
[    0.023531] gpio gpiochip0: (pinctrl_paris): created GPIO range 0->184 ==> 10005000.pinctrl PIN 0->184
[    0.023700] gpio gpiochip0: (pinctrl_paris): added GPIO chardev (254:0)
[    0.023729] gpio gpiochip0: registered GPIOs 512 to 708 on pinctrl_paris
[    0.027414] platform 14013000.dsi: Fixed dependency cycle(s) with /soc/i2c at 11007000/edp-bridge at 8
[    0.031415] cryptd: max_cpu_qlen set to 1000
[    0.031901] iommu: Default domain type: Translated
[    0.031911] iommu: DMA domain TLB invalidation policy: strict mode
[    0.031941] reg-fixed-voltage regulator-ppvar-sys: using DT '/regulator-ppvar-sys' for '(default)' GPIO lookup
[    0.031953] of_get_named_gpiod_flags: can't parse 'gpios' property of node '/regulator-ppvar-sys[0]'
[    0.031960] of_get_named_gpiod_flags: can't parse 'gpio' property of node '/regulator-ppvar-sys[0]'
[    0.031966] reg-fixed-voltage regulator-ppvar-sys: using lookup tables for GPIO lookup
[    0.031969] reg-fixed-voltage regulator-ppvar-sys: No GPIO consumer (default) found
[    0.034338] SCSI subsystem initialized
[    0.034402] usbcore: registered new interface driver usbfs
[    0.034417] usbcore: registered new interface driver hub
[    0.034435] usbcore: registered new device driver usb
[    0.034484] mc: Linux media interface: v0.10
[    0.034504] videodev: Linux video capture interface: v2.00
[    0.034938] mediatek,efuse 11cb0000.efuse: using DT '/soc/efuse at 11cb0000' for 'wp' GPIO lookup
[    0.034949] of_get_named_gpiod_flags: can't parse 'wp-gpios' property of node '/soc/efuse at 11cb0000[0]'
[    0.034957] of_get_named_gpiod_flags: can't parse 'wp-gpio' property of node '/soc/efuse at 11cb0000[0]'
[    0.034963] mediatek,efuse 11cb0000.efuse: using lookup tables for GPIO lookup
[    0.034967] mediatek,efuse 11cb0000.efuse: No GPIO consumer wp found
[    0.035165] Advanced Linux Sound Architecture Driver Initialized.
[    0.035737] clocksource: Switched to clocksource arch_sys_counter
[    0.484904] NET: Registered PF_INET protocol family
[    0.485039] IP idents hash table entries: 131072 (order: 8, 1048576 bytes, linear)
[    0.488319] tcp_listen_portaddr_hash hash table entries: 4096 (order: 4, 65536 bytes, linear)
[    0.488420] Table-perturb hash table entries: 65536 (order: 6, 262144 bytes, linear)
[    0.488471] TCP established hash table entries: 65536 (order: 7, 524288 bytes, linear)
[    0.489012] TCP bind hash table entries: 65536 (order: 9, 2097152 bytes, linear)
[    0.490445] TCP: Hash tables configured (established 65536 bind 65536)
[    0.490517] UDP hash table entries: 4096 (order: 5, 131072 bytes, linear)
[    0.490670] UDP-Lite hash table entries: 4096 (order: 5, 131072 bytes, linear)
[    0.490881] NET: Registered PF_UNIX/PF_LOCAL protocol family
[    0.491111] RPC: Registered named UNIX socket transport module.
[    0.491120] RPC: Registered udp transport module.
[    0.491124] RPC: Registered tcp transport module.
[    0.491128] RPC: Registered tcp-with-tls transport module.
[    0.491133] RPC: Registered tcp NFSv4.1 backchannel transport module.
[    0.492006] Initialise system trusted keyrings
[    0.492083] workingset: timestamp_bits=62 max_order=21 bucket_order=0
[    0.492524] NFS: Registering the id_resolver key type
[    0.492537] Key type id_resolver registered
[    0.492542] Key type id_legacy registered
[    0.492555] nfs4filelayout_init: NFSv4 File Layout Driver Registering...
[    0.492562] nfs4flexfilelayout_init: NFSv4 Flexfile Layout Driver Registering...
[    0.521344] Key type asymmetric registered
[    0.521352] Asymmetric key parser 'x509' registered
[    0.521404] io scheduler bfq registered
[    0.522524] mediatek-mipi-tx 11cc0000.dsi-phy: can't get nvmem_cell_get, ignore it
[    0.524602] cannot find "mediatek,mt8186-fhctl"
[    0.531055] mtk-socinfo mtk-socinfo.0.auto: MediaTek Kompanio 520 (MT8186) SoC detected.
[    0.531840] Serial: 8250/16550 driver, 4 ports, IRQ sharing disabled
[    0.532801] printk: legacy console [ttyS0] disabled
[    0.553028] 11002000.serial: ttyS0 at MMIO 0x11002000 (irq = 245, base_baud = 1625000) is a ST16650V2
[    0.553067] printk: legacy console [ttyS0] enabled
[    1.816937] usbcore: registered new interface driver udl
[    1.827949] loop: module loaded
[    1.831158] lkdtm: No crash points registered, enable through debugfs
[    1.838058] mt6359-auxadc: Failed to locate of_node [id: -1]
[    1.843974] platform mt6358-regulator: Fixed dependency cycle(s) with /soc/pwrap at 1000d000/pmic/regulators/vs2
[    1.853908] platform mt6358-regulator: Fixed dependency cycle(s) with /soc/pwrap at 1000d000/pmic/regulators/vdram1
[    1.864103] platform mt6358-regulator: Fixed dependency cycle(s) with /soc/pwrap at 1000d000/pmic/regulators/vs1
[    1.874549] mt6358-keys: Failed to locate of_node [id: -1]
[    1.881225] spi_master spi1: using DT '/soc/spi at 11012000' for 'cs' GPIO lookup
[    1.881242] of_get_named_gpiod_flags: parsed 'cs-gpios' property of node '/soc/spi at 11012000[0]' - status (0)
[    1.881256] gpio gpiochip0: Persistence not supported for GPIO 45
[    1.882086] spi-nor spi2.0: using DT '/soc/spi at 11000000/flash at 0' for 'reset' GPIO lookup
[    1.882097] of_get_named_gpiod_flags: can't parse 'reset-gpios' property of node '/soc/spi at 11000000/flash at 0[0]'
[    1.882106] of_get_named_gpiod_flags: can't parse 'reset-gpio' property of node '/soc/spi at 11000000/flash at 0[0]'
[    1.882112] spi-nor spi2.0: using lookup tables for GPIO lookup
[    1.882115] spi-nor spi2.0: No GPIO consumer reset found
[    1.883291] mtk-spi-nor 11000000.spi: spi frequency: 39000000 Hz
[    1.889723] mdio_bus fixed-0: using lookup tables for GPIO lookup
[    1.889728] mdio_bus fixed-0: No GPIO consumer reset found
[    1.890450] usbcore: registered new interface driver cdc_acm
[    1.892789] tpm_tis_spi spi1.0: TPM ready IRQ confirmed on attempt 2
[    1.896113] cdc_acm: USB Abstract Control Model driver for USB modems and ISDN adapters
[    1.896125] usbcore: registered new interface driver usb-storage
[    1.912213] tpm_tis_spi spi1.0: 2.0 TPM (device-id 0x504A, rev-id 83)
[    1.917464] mt6397-rtc mt6358-rtc: registered as rtc0
[    1.928104] mt6397-rtc mt6358-rtc: setting system clock to 2024-09-01T09:27:19 UTC (1725182839)
[    1.936827] i2c_dev: i2c /dev entries driver
[    1.941618] platform 14013000.dsi: Fixed dependency cycle(s) with /soc/i2c at 11007000/edp-bridge at 8
[    1.950436] i2c 0-0008: Fixed dependency cycle(s) with /soc/i2c at 11007000/edp-bridge at 8/aux-bus/panel
[    1.959488] i2c 0-0008: Fixed dependency cycle(s) with /soc/dsi at 14013000
[    1.965222] tpm_tis_spi spi1.0: Cr50 firmware version: Ti50/D3C1 RO_B:0.0.46/- RW_B:0.23.40/ti50_common_mp-15224.B:v0.0
[    1.969507] mtk-wdt 10007000.watchdog: Watchdog enabled (timeout=31 sec, nowayout=0)
[    1.985721] pwrseq_simple wifi-pwrseq: using DT '/wifi-pwrseq' for 'reset' GPIO lookup
[    1.985746] of_get_named_gpiod_flags: parsed 'reset-gpios' property of node '/wifi-pwrseq[0]' - status (0)
[    1.985761] gpio gpiochip0: Persistence not supported for GPIO 54
[    1.985864] sdhci: Secure Digital Host Controller Interface driver
[    1.992049] sdhci: Copyright(c) Pierre Ossman
[    1.996629] sdhci-pltfm: SDHCI platform and OF driver helper
[    2.003033] SMCCC: SOC_ID: ID = jep106:0426:8186 Revision = 0x00000000
[    2.009579] hid: raw HID events driver (C) Jiri Kosina
[    2.015150] spi_master spi0: will run message pump with realtime priority
[    2.022170] hw perfevents: enabled with armv8_cortex_a55 PMU driver, 7 counters available
[    2.031538] hw perfevents: enabled with armv8_cortex_a76 PMU driver, 7 counters available
[    2.040118] watchdog: Delayed init of the lockup detector failed: -19
[    2.042240] rt1015p speaker-codec: using DT '/speaker-codec' for 'sdb' GPIO lookup
[    2.046562] watchdog: Hard watchdog permanently disabled
[    2.046568] of_get_named_gpiod_flags: parsed 'sdb-gpios' property of node '/speaker-codec[0]' - status (0)
[    2.051878] gpio gpiochip0: Persistence not supported for GPIO 150
[    2.052819] mt8186-audio 11210000.audio-controller: mtk_afe_combine_sub_dai(), num of dai 41
[    2.061417] mt8186-audio 11210000.audio-controller: No cache defaults, reading back from HW
[    2.071186] Initializing XFRM netlink socket
[    2.075475] NET: Registered PF_PACKET protocol family
[    2.080534] Key type dns_resolver registered
[    2.087800] registered taskstats version 1
[    2.092012] Loading compiled-in X.509 certificates
[    2.100680] Key type .fscrypt registered
[    2.104608] Key type fscrypt-provisioning registered
[    2.109658] Key type encrypted registered
[    2.122850] reg-fixed-voltage regulator-pp3300-ldo-z5: using DT '/regulator-pp3300-ldo-z5' for '(default)' GPIO lookup
[    2.122877] of_get_named_gpiod_flags: can't parse 'gpios' property of node '/regulator-pp3300-ldo-z5[0]'
[    2.122888] of_get_named_gpiod_flags: can't parse 'gpio' property of node '/regulator-pp3300-ldo-z5[0]'
[    2.122897] reg-fixed-voltage regulator-pp3300-ldo-z5: using lookup tables for GPIO lookup
[    2.122902] reg-fixed-voltage regulator-pp3300-ldo-z5: No GPIO consumer (default) found
[    2.123322] reg-fixed-voltage regulator-pp4200-z2: using DT '/regulator-pp4200-z2' for '(default)' GPIO lookup
[    2.123322] reg-fixed-voltage regulator-pp3300-z2: using DT '/regulator-pp3300-z2' for '(default)' GPIO lookup
[    2.123341] of_get_named_gpiod_flags: can't parse 'gpios' property of node '/regulator-pp4200-z2[0]'
[    2.123344] of_get_named_gpiod_flags: can't parse 'gpios' property of node '/regulator-pp3300-z2[0]'
[    2.123351] of_get_named_gpiod_flags: can't parse 'gpio' property of node '/regulator-pp4200-z2[0]'
[    2.123354] of_get_named_gpiod_flags: can't parse 'gpio' property of node '/regulator-pp3300-z2[0]'
[    2.123361] reg-fixed-voltage regulator-pp3300-z2: using lookup tables for GPIO lookup
[    2.123361] reg-fixed-voltage regulator-pp4200-z2: using lookup tables for GPIO lookup
[    2.123365] reg-fixed-voltage regulator-pp3300-z2: No GPIO consumer (default) found
[    2.123367] reg-fixed-voltage regulator-pp4200-z2: No GPIO consumer (default) found
[    2.123532] reg-fixed-voltage regulator-pp5000-z2: using DT '/regulator-pp5000-z2' for '(default)' GPIO lookup
[    2.123546] of_get_named_gpiod_flags: can't parse 'gpios' property of node '/regulator-pp5000-z2[0]'
[    2.123555] of_get_named_gpiod_flags: can't parse 'gpio' property of node '/regulator-pp5000-z2[0]'
[    2.123560] reg-fixed-voltage regulator-pp5000-z2: using lookup tables for GPIO lookup
[    2.123564] reg-fixed-voltage regulator-pp5000-z2: No GPIO consumer (default) found
[    2.124283] pwm-backlight backlight-lcd0: using DT '/backlight-lcd0' for 'enable' GPIO lookup
[    2.124306] of_get_named_gpiod_flags: parsed 'enable-gpios' property of node '/backlight-lcd0[0]' - status (0)
[    2.124326] gpio gpiochip0: Persistence not supported for GPIO 152
[    2.124331] gpio-664 (enable): no flags found for GPIO enable
[    2.127377] mediatek-drm mediatek-drm.6.auto: Adding component match for /soc/ovl at 14005000
[    2.135722] mediatek-drm mediatek-drm.6.auto: Adding component match for /soc/ovl at 14006000
[    2.137202] gpiochip_find_base_unlocked: found new base at 709
[    2.144031] mediatek-drm mediatek-drm.6.auto: Adding component match for /soc/rdma at 14007000
[    2.152415] mediatek-drm mediatek-drm.6.auto: Adding component match for /soc/color at 14009000
[    2.160898] mediatek-drm mediatek-drm.6.auto: Adding component match for /soc/ccorr at 1400b000
[    2.169368] mediatek-drm mediatek-drm.6.auto: Adding component match for /soc/aal at 1400c000
[    2.177767] mediatek-drm mediatek-drm.6.auto: Adding component match for /soc/gamma at 1400d000
[    2.186297] mediatek-drm mediatek-drm.6.auto: Adding component match for /soc/dsi at 14013000
[    2.194592] mediatek-drm mediatek-drm.6.auto: Adding component match for /soc/rdma at 1401f000
[    2.208654] reg-fixed-voltage regulator-pp3300-disp-x: using DT '/regulator-pp3300-disp-x' for '(default)' GPIO lookup
[    2.208702] of_get_named_gpiod_flags: parsed 'gpios' property of node '/regulator-pp3300-disp-x[0]' - status (0)
[    2.208722] gpio gpiochip0: Persistence not supported for GPIO 153
[    2.208751] reg-fixed-voltage regulator-pp3300-s3: using DT '/regulator-pp3300-s3' for '(default)' GPIO lookup
[    2.208766] of_get_named_gpiod_flags: can't parse 'gpios' property of node '/regulator-pp3300-s3[0]'
[    2.208776] of_get_named_gpiod_flags: can't parse 'gpio' property of node '/regulator-pp3300-s3[0]'
[    2.208782] reg-fixed-voltage regulator-usb-p1-vbus: using DT '/regulator-usb-p1-vbus' for '(default)' GPIO lookup
[    2.208784] reg-fixed-voltage regulator-pp3300-s3: using lookup tables for GPIO lookup
[    2.208790] reg-fixed-voltage regulator-pp3300-s3: No GPIO consumer (default) found
[    2.208791] of_get_named_gpiod_flags: can't parse 'gpios' property of node '/regulator-usb-p1-vbus[0]'
[    2.208803] of_get_named_gpiod_flags: parsed 'gpio' property of node '/regulator-usb-p1-vbus[0]' - status (0)
[    2.208815] gpio gpiochip0: Persistence not supported for GPIO 148
[    2.213361] cpufreq: cpufreq_online: CPU0: Running at unlisted initial frequency: 1999998 KHz, changing to: 2000000 KHz
[    2.221297] pp2760_vsim2_x: Bringing 1860000uV into 2700000-2700000uV
[    2.224470] cpu cpu0: EM: created perf domain
[    2.235336] cpufreq: cpufreq_online: CPU6: Running at unlisted initial frequency: 1084999 KHz, changing to: 1085000 KHz
[    2.238994] gpio gpiochip1: (cros-ec-gpio.4.auto): added GPIO chardev (254:1)
[    2.246174] gpio gpiochip1: registered GPIOs 709 to 748 on cros-ec-gpio.4.auto
[    2.246354] cpu cpu6: EM: created perf domain
[    2.251794] i2c_hid_of 1-0010: using DT '/soc/i2c at 11008000/touchscreen at 10' for 'reset' GPIO lookup
[    2.251900] of_get_named_gpiod_flags: can't parse 'reset-gpios' property of node '/soc/i2c at 11008000/touchscreen at 10[0]'
[    2.252001] of_get_named_gpiod_flags: can't parse 'reset-gpio' property of node '/soc/i2c at 11008000/touchscreen at 10[0]'
[    2.252075] i2c_hid_of 1-0010: using lookup tables for GPIO lookup
[    2.252084] i2c_hid_of 1-0010: No GPIO consumer reset found
[    2.252337] i2c_hid_of 1-0010: supply vddl not found, using dummy regulator
[    2.252803] mtk-msdc 11230000.mmc: using DT '/soc/mmc at 11230000' for 'wp' GPIO lookup
[    2.252950] mtk-msdc 11240000.mmc: using DT '/soc/mmc at 11240000' for 'wp' GPIO lookup
[    2.252968] of_get_named_gpiod_flags: can't parse 'wp-gpios' property of node '/soc/mmc at 11240000[0]'
[    2.252982] of_get_named_gpiod_flags: can't parse 'wp-gpio' property of node '/soc/mmc at 11240000[0]'
[    2.252992] mtk-msdc 11240000.mmc: using lookup tables for GPIO lookup
[    2.252997] mtk-msdc 11240000.mmc: No GPIO consumer wp found
[    2.253092] mtk-msdc 11240000.mmc: allocated mmc-pwrseq
[    2.254248] mt6358-sound mt6358-sound: mt6358_platform_driver_probe(), dev name mt6358-sound
[    2.254403] rt5682s 5-001a: Using default DAI clk names: rt5682-dai-wclk, rt5682-dai-bclk
[    2.254974] reg-fixed-voltage regulator-pp1800-dpbrdg-dx: using DT '/regulator-pp1800-dpbrdg-dx' for '(default)' GPIO lookup
[    2.254986] of_get_named_gpiod_flags: parsed 'gpios' property of node '/regulator-pp1800-dpbrdg-dx[0]' - status (0)
[    2.254997] gpio gpiochip0: Persistence not supported for GPIO 39
[    2.256627] stackdepot: allocating hash table of 524288 entries via kvcalloc
[    2.256740] rt5682s 5-001a: using DT '/soc/i2c at 11016000/codec at 1a' for 'realtek,ldo1-en' GPIO lookup
[    2.256748] of_get_named_gpiod_flags: can't parse 'realtek,ldo1-en-gpios' property of node '/soc/i2c at 11016000/codec at 1a[0]'
[    2.256753] of_get_named_gpiod_flags: can't parse 'realtek,ldo1-en-gpio' property of node '/soc/i2c at 11016000/codec at 1a[0]'
[    2.256757] rt5682s 5-001a: using lookup tables for GPIO lookup
[    2.256759] rt5682s 5-001a: No GPIO consumer realtek,ldo1-en found
[    2.258059] panfrost 13040000.gpu: clock rate = 249999863
[    2.259341] panfrost 13040000.gpu: EM: created perf domain
[    2.264585] of_get_named_gpiod_flags: can't parse 'wp-gpios' property of node '/soc/mmc at 11230000[0]'
[    2.273400] panfrost 13040000.gpu: mali-g52 id 0x7402 major 0x1 minor 0x0 status 0x0
[    2.281173] of_get_named_gpiod_flags: can't parse 'wp-gpio' property of node '/soc/mmc at 11230000[0]'
[    2.288217] panfrost 13040000.gpu: features: 00000000,00000cf7, issues: 00000000,00000400
[    2.288220] panfrost 13040000.gpu: Features: L2:0x07120206 Shader:0x00000002 Tiler:0x00000209 Mem:0x1 MMU:0x00002823 AS:0xff JS:0x7
[    2.288223] panfrost 13040000.gpu: shader_present=0x3 l2_present=0x1
[    2.289004] [drm] Initialized panfrost 1.2.0 for 13040000.gpu on minor 0
[    2.293676] mtk-msdc 11230000.mmc: using lookup tables for GPIO lookup
[    2.299304] mtu3 11201000.usb: supply vusb33 not found, using dummy regulator
[    2.306876] mtk-msdc 11230000.mmc: No GPIO consumer wp found
[    2.315215] mtu3 11201000.usb: dr_mode: 3, drd: auto
[    2.324824] elan_i2c 2-0015: Elan Touchpad: Module ID: 0x0124, Firmware: 0x0002, Sample: 0x0004, IAP: 0x0003
[    2.325150] input: Elan Touchpad as /devices/platform/soc/11009000.i2c/i2c-2/2-0015/input/input0
[    2.327394] mmc0: CQHCI version 5.10
[    2.332918] mtk-msdc 11240000.mmc: msdc_track_cmd_data: cmd=52 arg=00000C00; host->error=0x00000002
[    2.333203] mtu3 11201000.usb: u2p_dis_msk: 0, u3p_dis_msk: 0
[    2.333532] mtk-msdc 11240000.mmc: msdc_track_cmd_data: cmd=52 arg=80000C08; host->error=0x00000002
[    2.362911] mmc1: new ultra high speed SDR104 SDIO card at address 0001
[    2.370661] mtu3 11201000.usb: usb3-drd: 0
[    2.384344] i2c_hid_of 1-0010: i2c_hid_get_input: IRQ triggered but there's no data
[    2.389369] xhci-mtk 11200000.usb: supply vusb33 not found, using dummy regulator
[    2.398375] input: hid-over-i2c 04F3:4112 Touchscreen as /devices/platform/soc/11008000.i2c/i2c-1/1-0010/0018:04F3:4112.0001/input/input1
[    2.404680] xhci-mtk 11200000.usb: uwk - reg:0x420, version:2
[    2.408880] input: hid-over-i2c 04F3:4112 as /devices/platform/soc/11008000.i2c/i2c-1/1-0010/0018:04F3:4112.0001/input/input2
[    2.416440] xhci-mtk 11200000.usb: xHCI Host Controller
[    2.424030] input: hid-over-i2c 04F3:4112 as /devices/platform/soc/11008000.i2c/i2c-1/1-0010/0018:04F3:4112.0001/input/input3
[    2.431422] sbs-battery 6-000b: using DT '/soc/spi at 11010000/ec at 0/i2c-tunnel/sbs-battery at b' for 'sbs,battery-detect' GPIO lookup
[    2.431436] of_get_named_gpiod_flags: can't parse 'sbs,battery-detect-gpios' property of node '/soc/spi at 11010000/ec at 0/i2c-tunnel/sbs-battery at b[0]'
[    2.431448] of_get_named_gpiod_flags: can't parse 'sbs,battery-detect-gpio' property of node '/soc/spi at 11010000/ec at 0/i2c-tunnel/sbs-battery at b[0]'
[    2.431457] sbs-battery 6-000b: using lookup tables for GPIO lookup
[    2.431461] sbs-battery 6-000b: No GPIO consumer sbs,battery-detect found
[    2.432872] thermal thermal_zone0: power_allocator: sustainable_power will be estimated
[    2.432957] sbs-battery 6-000b: sbs-battery: battery gas gauge device registered
[    2.434641] mtk-msdc 11230000.mmc: Final PAD_DS_TUNE: 0x11814
[    2.436245] xhci-mtk 11200000.usb: new USB bus registered, assigned bus number 1
[    2.438329] mmc0: Command Queue Engine enabled
[    2.438334] mmc0: new HS400 MMC card at address 0001
[    2.438645] mmcblk0: mmc0:0001 DA4128 116 GiB
[    2.440440]  mmcblk0: p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12
[    2.441293] mmcblk0boot0: mmc0:0001 DA4128 4.00 MiB
[    2.441483] mmcblk0boot1: mmc0:0001 DA4128 4.00 MiB
[    2.441639] mmcblk0rpmb: mmc0:0001 DA4128 16.0 MiB, chardev (245:0)
[    2.442203] input: hid-over-i2c 04F3:4112 Stylus as /devices/platform/soc/11008000.i2c/i2c-1/1-0010/0018:04F3:4112.0001/input/input4
[    2.449049] input: cros_ec as /devices/platform/soc/11010000.spi/spi_master/spi0/spi0.0/11010000.spi:ec at 0:keyboard-controller/input/input7
[    2.453246] xhci-mtk 11200000.usb: USB3 root hub has no ports
[    2.458801] hid-generic 0018:04F3:4112.0001: input,hidraw0: I2C HID v1.00 Device [hid-over-i2c 04F3:4112] on 1-0010
[    2.459398] input: cros_ec_buttons as /devices/platform/soc/11010000.spi/spi_master/spi0/spi0.0/11010000.spi:ec at 0:keyboard-controller/input/input8
[    2.469721] xhci-mtk 11200000.usb: hcc params 0x01400f99 hci version 0x110 quirks 0x0000000000200010
[    2.469745] cros-ec-spi spi0.0: Chrome EC device registered
[    2.469746] xhci-mtk 11200000.usb: irq 273, io mem 0x11200000
[    2.480397] sbs-battery 6-000b: I2C adapter does not support I2C_FUNC_SMBUS_READ_BLOCK_DATA.
               Fallback method does not support PEC.
[    2.485365] usb usb1: New USB device found, idVendor=1d6b, idProduct=0002, bcdDevice= 6.11
[    2.495052] sbs-battery 6-000b: Unknown chemistry: OTI0
[    2.498275] usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[    2.498278] usb usb1: Product: xHCI Host Controller
[    2.498280] usb usb1: Manufacturer: Linux 6.11.0-rc5 xhci-hcd
[    2.498282] usb usb1: SerialNumber: 11200000.usb
[    2.498835] hub 1-0:1.0: USB hub found
[    2.660760] hub 1-0:1.0: 1 port detected
[    2.665213] mtu3 11201000.usb: xHCI platform device register success...
[    2.672374] mtu3 11281000.usb: supply vusb33 not found, using dummy regulator
[    2.679849] mtu3 11281000.usb: dr_mode: 3, drd: auto
[    2.684826] mtu3 11281000.usb: u2p_dis_msk: 0, u3p_dis_msk: 0
[    2.690726] mtu3 11281000.usb: usb3-drd: 1
[    2.695133] xhci-mtk 11280000.usb: supply vusb33 not found, using dummy regulator
[    2.702705] xhci-mtk 11280000.usb: uwk - reg:0x424, version:2
[    2.708587] xhci-mtk 11280000.usb: xHCI Host Controller
[    2.713999] xhci-mtk 11280000.usb: new USB bus registered, assigned bus number 2
[    2.722889] xhci-mtk 11280000.usb: hcc params 0x01400f99 hci version 0x110 quirks 0x0000000000200010
[    2.732033] xhci-mtk 11280000.usb: irq 274, io mem 0x11280000
[    2.737818] xhci-mtk 11280000.usb: xHCI Host Controller
[    2.743138] xhci-mtk 11280000.usb: new USB bus registered, assigned bus number 3
[    2.750533] xhci-mtk 11280000.usb: Host supports USB 3.2 Enhanced SuperSpeed
[    2.758162] usb usb2: New USB device found, idVendor=1d6b, idProduct=0002, bcdDevice= 6.11
[    2.766478] usb usb2: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[    2.773713] usb usb2: Product: xHCI Host Controller
[    2.778586] usb usb2: Manufacturer: Linux 6.11.0-rc5 xhci-hcd
[    2.784340] usb usb2: SerialNumber: 11280000.usb
[    2.789333] hub 2-0:1.0: USB hub found
[    2.793169] hub 2-0:1.0: 1 port detected
[    2.797258] usb usb3: We don't know the algorithms for LPM for this host, disabling LPM.
[    2.805670] usb usb3: New USB device found, idVendor=1d6b, idProduct=0003, bcdDevice= 6.11
[    2.814124] usb usb3: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[    2.821399] usb usb3: Product: xHCI Host Controller
[    2.826323] usb usb3: Manufacturer: Linux 6.11.0-rc5 xhci-hcd
[    2.832075] usb usb3: SerialNumber: 11280000.usb
[    2.837138] hub 3-0:1.0: USB hub found
[    2.840907] hub 3-0:1.0: 1 port detected
[    2.844959] mtu3 11281000.usb: xHCI platform device register success...
[    2.851851] ps8640 0-0008: using DT '/soc/i2c at 11007000/edp-bridge at 8' for 'powerdown' GPIO lookup
[    2.851863] of_get_named_gpiod_flags: parsed 'powerdown-gpios' property of node '/soc/i2c at 11007000/edp-bridge at 8[0]' - status (0)
[    2.851886] gpio gpiochip0: Persistence not supported for GPIO 96
[    2.851892] ps8640 0-0008: using DT '/soc/i2c at 11007000/edp-bridge at 8' for 'reset' GPIO lookup
[    2.851897] of_get_named_gpiod_flags: parsed 'reset-gpios' property of node '/soc/i2c at 11007000/edp-bridge at 8[0]' - status (0)
[    2.851903] gpio gpiochip0: Persistence not supported for GPIO 98
[    3.059863] usb 1-1: new high-speed USB device number 2 using xhci-mtk
[    3.161994] panel-simple-dp-aux aux-0-0008: using DT '/soc/i2c at 11007000/edp-bridge at 8/aux-bus/panel' for 'hpd' GPIO lookup
[    3.162023] of_get_named_gpiod_flags: can't parse 'hpd-gpios' property of node '/soc/i2c at 11007000/edp-bridge at 8/aux-bus/panel[0]'
[    3.162039] of_get_named_gpiod_flags: can't parse 'hpd-gpio' property of node '/soc/i2c at 11007000/edp-bridge at 8/aux-bus/panel[0]'
[    3.162050] panel-simple-dp-aux aux-0-0008: using lookup tables for GPIO lookup
[    3.162055] panel-simple-dp-aux aux-0-0008: No GPIO consumer hpd found
[    3.162236] panel-simple-dp-aux aux-0-0008: using DT '/soc/i2c at 11007000/edp-bridge at 8/aux-bus/panel' for 'enable' GPIO lookup
[    3.162250] of_get_named_gpiod_flags: can't parse 'enable-gpios' property of node '/soc/i2c at 11007000/edp-bridge at 8/aux-bus/panel[0]'
[    3.162262] of_get_named_gpiod_flags: can't parse 'enable-gpio' property of node '/soc/i2c at 11007000/edp-bridge at 8/aux-bus/panel[0]'
[    3.162271] panel-simple-dp-aux aux-0-0008: using lookup tables for GPIO lookup
[    3.162275] panel-simple-dp-aux aux-0-0008: No GPIO consumer enable found
[    3.188064] usb 2-1: new high-speed USB device number 2 using xhci-mtk
[    3.197181] usb 1-1: New USB device found, idVendor=13d3, idProduct=56ee, bcdDevice=22.01
[    3.205377] usb 1-1: New USB device strings: Mfr=3, Product=1, SerialNumber=2
[    3.212510] usb 1-1: Product: USB2.0 HD UVC WebCam
[    3.217295] usb 1-1: Manufacturer: Azurewave
[    3.221557] usb 1-1: SerialNumber: 0x0001
[    3.318191] panel-simple-dp-aux aux-0-0008: Detected AUO B140HAN04.0 (0x403d)
[    3.326281] it6505 3-005c: can not get extcon device!
[    3.333237] usb 2-1: New USB device found, idVendor=05e3, idProduct=0610, bcdDevice=20.03
[    3.339100] mtk-iommu 14016000.iommu: bound 14003000.smi (ops 0xffffffdbe59f7e80)
[    3.341485] usb 2-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[    3.349004] mtk-iommu 14016000.iommu: bound 14004000.smi (ops 0xffffffdbe59f7e80)
[    3.356067] usb 2-1: Product: USB2.1 Hub
[    3.356072] usb 2-1: Manufacturer: GenesysLogic
[    3.363547] mtk-iommu 14016000.iommu: bound 1b002000.smi (ops 0xffffffdbe59f7e80)
[    3.363556] mtk-iommu 14016000.iommu: bound 1602e000.smi (ops 0xffffffdbe59f7e80)
[    3.368385] hub 2-1:1.0: USB hub found
[    3.372021] mtk-iommu 14016000.iommu: bound 17010000.smi (ops 0xffffffdbe59f7e80)
[    3.379786] hub 2-1:1.0: 4 ports detected
[    3.402321] mtk-iommu 14016000.iommu: bound 14023000.smi (ops 0xffffffdbe59f7e80)
[    3.409810] mtk-iommu 14016000.iommu: bound 1502e000.smi (ops 0xffffffdbe59f7e80)
[    3.417286] mtk-iommu 14016000.iommu: bound 1582e000.smi (ops 0xffffffdbe59f7e80)
[    3.424759] mtk-iommu 14016000.iommu: bound 1a001000.smi (ops 0xffffffdbe59f7e80)
[    3.432232] mtk-iommu 14016000.iommu: bound 1a002000.smi (ops 0xffffffdbe59f7e80)
[    3.439704] mtk-iommu 14016000.iommu: bound 1a00f000.smi (ops 0xffffffdbe59f7e80)
[    3.447176] mtk-iommu 14016000.iommu: bound 1a010000.smi (ops 0xffffffdbe59f7e80)
[    3.454517] usb 3-1: new SuperSpeed USB device number 2 using xhci-mtk
[    3.454648] mtk-iommu 14016000.iommu: bound 1c10f000.smi (ops 0xffffffdbe59f7e80)
[    3.454651] mtk-iommu 14016000.iommu: bound 1c00f000.smi (ops 0xffffffdbe59f7e80)
[    3.476301] mediatek-disp-ovl 14005000.ovl: Adding to iommu group 0
[    3.478054] usb 3-1: New USB device found, idVendor=05e3, idProduct=0620, bcdDevice=20.03
[    3.482998] mediatek-disp-ovl 14006000.ovl: Adding to iommu group 0
[    3.490781] usb 3-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[    3.497203] mediatek-disp-rdma 14007000.rdma: Adding to iommu group 0
[    3.504185] usb 3-1: Product: USB3.2 Hub
[    3.510762] mediatek-disp-rdma 1401f000.rdma: Adding to iommu group 0
[    3.514545] usb 3-1: Manufacturer: GenesysLogic
[    3.521208] mediatek-drm mediatek-drm.6.auto: bound 14005000.ovl (ops 0xffffffdbe598b0e0)
[    3.526413] hub 3-1:1.0: USB hub found
[    3.533687] mediatek-drm mediatek-drm.6.auto: bound 14006000.ovl (ops 0xffffffdbe598b0e0)
[    3.533691] mediatek-drm mediatek-drm.6.auto: bound 14007000.rdma (ops 0xffffffdbe598c290)
[    3.533693] mediatek-drm mediatek-drm.6.auto: bound 14009000.color (ops 0xffffffdbe598a890)
[    3.533696] mediatek-drm mediatek-drm.6.auto: bound 1400b000.ccorr (ops 0xffffffdbe598a618)
[    3.533699] mediatek-drm mediatek-drm.6.auto: bound 1400c000.aal (ops 0xffffffdbe598a3a8)
[    3.533701] mediatek-drm mediatek-drm.6.auto: bound 1400d000.gamma (ops 0xffffffdbe598abd8)
[    3.534033] hub 3-1:1.0: 4 ports detected
[    3.539047] mediatek-drm mediatek-drm.6.auto: bound 14013000.dsi (ops 0xffffffdbe5990a70)
[    3.599341] mediatek-drm mediatek-drm.6.auto: bound 1401f000.rdma (ops 0xffffffdbe598c290)
[    3.607783] mediatek-drm mediatek-drm.6.auto: Not creating crtc 1 because component 10 is disabled or missing
[    3.618925] [drm] Initialized mediatek 1.0.0 for mediatek-drm.6.auto on minor 1
[    3.772082] Console: switching to colour frame buffer device 240x67
[    3.791363] mediatek-drm mediatek-drm.6.auto: [drm] fb0: mediatekdrmfb frame buffer device
[    3.800520] gpio-keys gpio-keys: using DT '/gpio-keys/pen-insert-switch' for '(default)' GPIO lookup
[    3.800536] of_get_named_gpiod_flags: parsed 'gpios' property of node '/gpio-keys/pen-insert-switch[0]' - status (0)
[    3.800546] gpio gpiochip0: Persistence not supported for GPIO 18
[    3.800624] input: gpio-keys as /devices/platform/gpio-keys/input/input9
[    3.807724] gpio-keys wifi-wakeup: using DT '/wifi-wakeup/wowlan-event' for '(default)' GPIO lookup
[    3.807752] of_get_named_gpiod_flags: parsed 'gpios' property of node '/wifi-wakeup/wowlan-event[0]' - status (0)
[    3.807763] gpio gpiochip0: Persistence not supported for GPIO 7
[    3.807835] input: wifi-wakeup as /devices/platform/wifi-wakeup/input/input10
[    3.815507] clk: Disabling unused clocks
[    3.819806] PM: genpd: Disabling unused power domains
[    3.824962] ALSA device list:
[    3.827963]   No soundcards found.
[    3.831432] Waiting for root device /dev/sda3...
[    5.434880] usb 2-1.2: new high-speed USB device number 3 using xhci-mtk
[    6.189085] usb 3-1.2: new SuperSpeed USB device number 3 using xhci-mtk
[    6.209312] usb 3-1.2: New USB device found, idVendor=152d, idProduct=0578, bcdDevice= 4.04
[    6.217957] usb 3-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[    6.225490] usb 3-1.2: Product: USB 3.0 Device
[    6.230076] usb 3-1.2: Manufacturer: USB 3.0 Device
[    6.235186] usb 3-1.2: SerialNumber: 000000004590
[    6.241623] usb-storage 3-1.2:1.0: USB Mass Storage device detected
[    6.248354] usb-storage 3-1.2:1.0: Quirks match for vid 152d pid 0578: 1000000
[    6.255824] scsi host0: usb-storage 3-1.2:1.0
[    7.267713] scsi 0:0:0:0: Direct-Access     TOSHIBA  MQ01ABD075       0404 PQ: 0 ANSI: 6
[    7.304124] sd 0:0:0:0: [sda] 1465149168 512-byte logical blocks: (750 GB/699 GiB)
[    7.312782] sd 0:0:0:0: [sda] Write Protect is off
[    7.317603] sd 0:0:0:0: [sda] Mode Sense: 47 00 00 08
[    7.318062] sd 0:0:0:0: [sda] Disabling FUA
[    7.322289] sd 0:0:0:0: [sda] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
[    7.447302]  sda: sda1 sda2 sda3
[    7.451363] sd 0:0:0:0: [sda] Attached SCSI disk
[    7.575863] EXT4-fs (sda3): mounted filesystem a9105ace-70f4-4ead-80ee-101047c8bc0e r/w with ordered data mode. Quota mode: disabled.
[    7.588052] VFS: Mounted root (ext4 filesystem) on device 8:3.
[    7.619419] devtmpfs: mounted
[    7.625648] Freeing unused kernel memory: 5504K
[    7.630387] Run /sbin/init as init process
[    7.634539]   with arguments:
[    7.634542]     /sbin/init
[    7.634545]     cros_secure
[    7.634548]     noinitrd
[    7.634551]   with environment:
[    7.634553]     HOME=/
[    7.634556]     TERM=linux
[   14.306874] platform sound: deferred probe pending: mt8186_mt6366: I2S3: codec dai not found
[   19.052320] LoadPin: sda3 (8:3): writable
[   19.052359] LoadPin: kernel-module pinned obj="/lib/modules/6.11.0-rc5/kernel/drivers/hid/hid-multitouch.ko" pid=616 cmdline="(udev-worker)"
[   19.368186] input: hid-over-i2c 04F3:4112 as /devices/platform/soc/11008000.i2c/i2c-1/1-0010/0018:04F3:4112.0001/input/input11
[   19.368449] input: hid-over-i2c 04F3:4112 UNKNOWN as /devices/platform/soc/11008000.i2c/i2c-1/1-0010/0018:04F3:4112.0001/input/input12
[   19.368696] input: hid-over-i2c 04F3:4112 UNKNOWN as /devices/platform/soc/11008000.i2c/i2c-1/1-0010/0018:04F3:4112.0001/input/input13
[   19.368898] input: hid-over-i2c 04F3:4112 Stylus as /devices/platform/soc/11008000.i2c/i2c-1/1-0010/0018:04F3:4112.0001/input/input14
[   19.369080] input: hid-over-i2c 04F3:4112 UNKNOWN as /devices/platform/soc/11008000.i2c/i2c-1/1-0010/0018:04F3:4112.0001/input/input15
[   19.369421] hid-multitouch 0018:04F3:4112.0001: input,hidraw0: I2C HID v1.00 Device [hid-over-i2c 04F3:4112] on 1-0010
[   21.257490] mtk-scp 10500000.scp: assigned reserved memory node memory at 50000000
[   21.258407] remoteproc remoteproc0: scp is available
[   22.161303] remoteproc remoteproc0: powering up scp
[   22.161320] remoteproc remoteproc0: Booting fw image mediatek/mt8186/scp.img, size 419212
[   22.161332] mtk-scp 10500000.scp: IPI buf addr 0x0003bdb0
[   22.249273] mtk-scp 10500000.scp: creating channel cros-ec-rpmsg addr 0xd
[   22.249349] mtk-scp 10500000.scp: SCP is ready. FW version corsola_scp_v2.0.19842-a90fda81
[   22.249361] remoteproc remoteproc0: remote processor scp is now up
[   22.249951] cros-ec-dev cros-ec-dev.19.auto: CrOS System Control Processor MCU detected
[   22.250253] gpiochip_find_base_unlocked: found new base at 749
[   22.250629] gpio gpiochip2: (cros-ec-gpio.20.auto): added GPIO chardev (254:2)
[   22.250696] gpio gpiochip2: registered GPIOs 749 to 750 on cros-ec-gpio.20.auto
[   22.252181] cros-ec-rpmsg 10500000.scp.cros-ec-rpmsg.13.-1: Chrome EC device registered
[   22.968966] Bluetooth: Core ver 2.22
[   22.969058] NET: Registered PF_BLUETOOTH protocol family
[   22.969062] Bluetooth: HCI device and connection manager initialized
[   22.969080] Bluetooth: HCI socket layer initialized
[   22.969085] Bluetooth: L2CAP socket layer initialized
[   22.969097] Bluetooth: SCO socket layer initialized
[   23.649963] sx9324 4-0028: error -ETIMEDOUT: Unable to initialize sensor
[   23.650918] sx9324 4-0028: probe with driver sx9324 failed with error -110
[   24.213358] usb 1-1: using lookup tables for GPIO lookup
[   24.213377] usb 1-1: No GPIO consumer privacy found
[   24.213382] usb 1-1: Found UVC 1.10 device USB2.0 HD UVC WebCam (13d3:56ee)
[   24.215025] usbcore: registered new interface driver uvcvideo
[   24.322277] btmtksdio mmc1:0001:2: using DT '/soc/mmc at 11240000/bluetooth at 2' for 'reset' GPIO lookup
[   24.322321] of_get_named_gpiod_flags: parsed 'reset-gpios' property of node '/soc/mmc at 11240000/bluetooth at 2[0]' - status (0)
[   24.322352] gpio gpiochip0: Persistence not supported for GPIO 155
[   24.341662] mtk-jpeg 17030000.jpeg-encoder: Adding to iommu group 1
[   24.342745] mtk-jpeg 17030000.jpeg-encoder: mtk-jpeg-enc device registered as /dev/video2 (81,2)
[   24.403427] Bluetooth: hci0: HW/SW Version: 0x008a008a, Build Time: 20230526131214
[   24.421448] mtk-vcodec-enc 17020000.video-encoder: Adding to iommu group 1
[   24.621415] sof-audio-of-mt8186 10680000.adsp: DT DSP detected
[   24.621584] sof-audio-of-mt8186 10680000.adsp: assigned reserved memory node memory at 61000000
[   24.796260] sof-audio-of-mt8186 10680000.adsp: Firmware paths/files for ipc type 0:
[   24.796283] sof-audio-of-mt8186 10680000.adsp:  Firmware file:     mediatek/sof/sof-mt8186.ri
[   24.796290] sof-audio-of-mt8186 10680000.adsp:  Topology file:     mediatek/sof-tplg/sof-mt8186.tplg
[   24.796614] sof-audio-of-mt8186 10680000.adsp: Firmware info: version 2:0:0-714c6
[   24.796635] sof-audio-of-mt8186 10680000.adsp: Firmware: ABI 3:22:1 Kernel ABI 3:23:0
[   24.796663] sof-audio-of-mt8186 10680000.adsp: unknown sof_ext_man header type 3 size 0x30
[   24.801693] sof-audio-of-mt8186 10680000.adsp: Firmware info: version 2:0:0-714c6
[   24.801715] sof-audio-of-mt8186 10680000.adsp: Firmware: ABI 3:22:1 Kernel ABI 3:23:0
[   25.095285] mtk-vcodec-dec 16000000.video-decoder: Adding to iommu group 1
[   25.199190] mtk-vdec-comp 16025000.video-codec: Adding to iommu group 1
[   25.760881] mt7921s mmc1:0001:1: HW/SW Version: 0x8a108a10, Build Time: 20230331110902a

[   26.023720] mt7921s mmc1:0001:1: WM Firmware Version: ____010000, Build Time: 20230331110939
[   27.663146] Bluetooth: hci0: Device setup in 3260231 usecs
[   27.744137] Bluetooth: hci0: AOSP extensions version v1.00
[   27.744160] Bluetooth: hci0: AOSP quality report is supported
[   31.420497] wlan0: authenticate with 94:10:3e:8c:ab:ae (local address=cc:47:40:a3:19:2a)
[   31.562664] wlan0: send auth to 94:10:3e:8c:ab:ae (try 1/3)
[   31.567625] wlan0: authenticated
[   31.568821] wlan0: associate with 94:10:3e:8c:ab:ae (try 1/3)
[   31.601217] wlan0: RX AssocResp from 94:10:3e:8c:ab:ae (capab=0x431 status=0 aid=1)
[   31.668122] wlan0: associated
[   34.274342] pp1840_vaux18: disabling
[   34.274634] pp2800_vaud28: disabling

cat /sys/kernel/debug/devices_deferred
sound	mt8186_mt6366: I2S3: codec dai not found


From chunkuang.hu at kernel.org  Sun Sep  1 06:13:54 2024
From: chunkuang.hu at kernel.org (Chun-Kuang Hu)
Date: Sun,  1 Sep 2024 13:13:54 +0000
Subject: [GIT PULL] mediatek drm next for 6.12
Message-ID: <20240901131354.2686-1-chunkuang.hu@kernel.org>

Hi, Dave & Daniel:

This includes:

1. Support alpha blending
2. Remove cl in struct cmdq_pkt
3. Fixup for ovl adaptor
4. Declare Z Position for all planes
5. Drop unnecessary check for property presence
6. Add dsi per-frame lp code for mt8188
7. Fix missing configuration flags in mtk_crtc_ddp_config()
8. Use spin_lock_irqsave() for CRTC event lock
9. Add power domain binding to the mediatek DPI controller

Regards,
Chun-Kuang.

The following changes since commit 8400291e289ee6b2bf9779ff1c83a291501f017b:

  Linux 6.11-rc1 (2024-07-28 14:19:55 -0700)

are available in the Git repository at:

  https://git.kernel.org/pub/scm/linux/kernel/git/chunkuang.hu/linux.git tags/mediatek-drm-next-6.12

for you to fetch changes up to 5474d49b2f79b41f2ab09b0deb9d97d47b18d094:

  dt-bindings: display: mediatek: dpi: Add power domains (2024-08-30 12:12:40 +0000)

----------------------------------------------------------------
Mediatek DRM Next for Linux 6.12

1. Support alpha blending
2. Remove cl in struct cmdq_pkt
3. Fixup for ovl adaptor
4. Declare Z Position for all planes
5. Drop unnecessary check for property presence
6. Add dsi per-frame lp code for mt8188
7. Fix missing configuration flags in mtk_crtc_ddp_config()
8. Use spin_lock_irqsave() for CRTC event lock
9. Add power domain binding to the mediatek DPI controller

----------------------------------------------------------------
AngeloGioacchino Del Regno (1):
      drm/mediatek: Declare Z Position for all planes

Chun-Kuang Hu (2):
      drm/mediatek: Use cmdq_pkt_eoc() instead of cmdq_pkt_finalize()
      drm/mediatek: Use cmdq_pkt_create() and cmdq_pkt_destroy()

Fei Shao (1):
      drm/mediatek: Use spin_lock_irqsave() for CRTC event lock

Hsiao Chien Sung (5):
      drm/mediatek: Support "None" blending in OVL
      drm/mediatek: Support "None" blending in Mixer
      drm/mediatek: Support "Pre-multiplied" blending in OVL
      drm/mediatek: Support "Pre-multiplied" blending in Mixer
      drm/mediatek: Support alpha blending in display driver

Jason-JH.Lin (1):
      drm/mediatek: Fix missing configuration flags in mtk_crtc_ddp_config()

Javier Carrasco (3):
      drm/mediatek: ovl_adaptor: Drop unused mtk_crtc.h header
      drm/mediatek: ovl_adaptor: Add missing of_node_put()
      drm/mediatek: ovl_adaptor: Use scoped variant of for_each_child_of_node()

Rob Herring (Arm) (1):
      drm/mediatek: Drop unnecessary check for property presence

Rohit Agarwal (1):
      dt-bindings: display: mediatek: dpi: Add power domains

Shuijing Li (1):
      drm/mediatek: dsi: Add dsi per-frame lp code for mt8188

 .../bindings/display/mediatek/mediatek,dpi.yaml    |  17 ++++
 drivers/gpu/drm/mediatek/mtk_crtc.c                |  82 +++++++---------
 drivers/gpu/drm/mediatek/mtk_disp_ovl.c            |  36 +++++--
 drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c    |   5 +-
 drivers/gpu/drm/mediatek/mtk_disp_rdma.c           |  13 +--
 drivers/gpu/drm/mediatek/mtk_dsi.c                 | 106 ++++++++++++++++++---
 drivers/gpu/drm/mediatek/mtk_ethdr.c               |  13 ++-
 drivers/gpu/drm/mediatek/mtk_plane.c               |  29 +++++-
 drivers/gpu/drm/mediatek/mtk_plane.h               |   3 +-
 9 files changed, 221 insertions(+), 83 deletions(-)


From lkp at intel.com  Sun Sep  1 06:28:15 2024
From: lkp at intel.com (kernel test robot)
Date: Sun, 1 Sep 2024 21:28:15 +0800
Subject: [PATCH v3 4/5] pinctrl: airoha: Add support for EN7581 SoC
In-Reply-To: <20240831-en7581-pinctrl-v3-4-98eebfb4da66@kernel.org>
References: <20240831-en7581-pinctrl-v3-4-98eebfb4da66@kernel.org>
Message-ID: <202409012045.91oDLtEE-lkp@intel.com>

Hi Lorenzo,

kernel test robot noticed the following build errors:

[auto build test ERROR on defaf1a2113a22b00dfa1abc0fd2014820eaf065]

url:    https://github.com/intel-lab-lkp/linux/commits/Lorenzo-Bianconi/dt-bindings-arm-airoha-Add-the-chip-scu-node-for-EN7581-SoC/20240831-222958
base:   defaf1a2113a22b00dfa1abc0fd2014820eaf065
patch link:    https://lore.kernel.org/r/20240831-en7581-pinctrl-v3-4-98eebfb4da66%40kernel.org
patch subject: [PATCH v3 4/5] pinctrl: airoha: Add support for EN7581 SoC
config: m68k-allyesconfig (https://download.01.org/0day-ci/archive/20240901/202409012045.91oDLtEE-lkp at intel.com/config)
compiler: m68k-linux-gcc (GCC) 14.1.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240901/202409012045.91oDLtEE-lkp at intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp at intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202409012045.91oDLtEE-lkp at intel.com/

All errors (new ones prefixed by >>):

   m68k-linux-ld: drivers/pinctrl/mediatek/pinctrl-airoha.o: in function `airoha_pinconf_get':
   pinctrl-airoha.c:(.text+0xa7a): undefined reference to `__ffsdi2'
>> m68k-linux-ld: pinctrl-airoha.c:(.text+0xb5e): undefined reference to `__ffsdi2'
   m68k-linux-ld: pinctrl-airoha.c:(.text+0xc2a): undefined reference to `__ffsdi2'
   m68k-linux-ld: drivers/pinctrl/mediatek/pinctrl-airoha.o: in function `airoha_pinconf_set':
   pinctrl-airoha.c:(.text+0xf84): undefined reference to `__ffsdi2'
   m68k-linux-ld: pinctrl-airoha.c:(.text+0xfda): undefined reference to `__ffsdi2'
   m68k-linux-ld: drivers/pinctrl/mediatek/pinctrl-airoha.o:pinctrl-airoha.c:(.text+0x10b0): more undefined references to `__ffsdi2' follow

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki


From chunkuang.hu at kernel.org  Sun Sep  1 07:32:56 2024
From: chunkuang.hu at kernel.org (Chun-Kuang Hu)
Date: Sun,  1 Sep 2024 14:32:56 +0000
Subject: [PATCH v4 0/3] Remove cl in struct cmdq_pkt
Message-ID: <20240901143259.16849-1-chunkuang.hu@kernel.org>

cl in struct cmdq_pkt is used to store struct cmdq_client, but every client
driver has the struct cmdq_client information, so it's not necessary to
store struct cmdq_client in struct cmdq_pkt. Because mailbox maintainer
do not like to mix mailbox patch with other patches in a series, so
mailbox patch [1] would be sent independently.

Changes in v4:
1. Rebase onto mediatek-drm-next-6.12
2. Fix build error in mpd3 driver
Changes in v3:
1. Rebase onto Linux 6.11-rc1 and fix conflicts.
Changes in v2:
1. Fix typo of CMDQ_JUMP_RELATIVE
2. Refine cmdq_pkt_create() and cmdq_pkt_destroy()
3. Rename cmdq_pkt_jump() to cmdq_pkt_jump_abs()
4. Add cmdq_pkt_jump_rel() helper function
5. drm/mediatek: Use cmdq_pkt_create() and cmdq_pkt_destroy()
6. mtk-mdp3: Get fine-grain control of cmdq_pkt_finalize()
7. mtk-mdp3: Use cmdq_pkt_create() and cmdq_pkt_destroy()

[1] https://git.kernel.org/pub/scm/linux/kernel/git/chunkuang.hu/linux.git/commit/?h=mediatek-cmdq8&id=a1b2f7a7488285975c1f439086f1c4cc51a13bb9


Chun-Kuang Hu (3):
  media: platform: mtk-mdp3: Get fine-grain control of
    cmdq_pkt_finalize()
  media: platform: mtk-mdp3: Use cmdq_pkt_create() and
    cmdq_pkt_destroy()
  soc: mediatek: cmdq: Remove cmdq_pkt_finalize() helper function

 .../platform/mediatek/mdp3/mtk-mdp3-cmdq.c    | 49 +++----------------
 .../platform/mediatek/mdp3/mtk-mdp3-cmdq.h    |  1 +
 .../platform/mediatek/mdp3/mtk-mdp3-core.c    |  2 +
 .../platform/mediatek/mdp3/mtk-mdp3-core.h    |  1 +
 drivers/soc/mediatek/mtk-cmdq-helper.c        | 22 ---------
 include/linux/soc/mediatek/mtk-cmdq.h         | 13 -----
 6 files changed, 11 insertions(+), 77 deletions(-)

-- 
2.34.1



From chunkuang.hu at kernel.org  Sun Sep  1 07:32:57 2024
From: chunkuang.hu at kernel.org (Chun-Kuang Hu)
Date: Sun,  1 Sep 2024 14:32:57 +0000
Subject: [PATCH v4 1/3] media: platform: mtk-mdp3: Get fine-grain control of cmdq_pkt_finalize()
In-Reply-To: <20240901143259.16849-1-chunkuang.hu@kernel.org>
References: <20240901143259.16849-1-chunkuang.hu@kernel.org>
Message-ID: <20240901143259.16849-2-chunkuang.hu@kernel.org>

In order to have fine-grained control, use cmdq_pkt_eoc() and
cmdq_pkt_jump_rel() to replace cmdq_pkt_finalize().

Signed-off-by: Chun-Kuang Hu <chunkuang.hu at kernel.org>
---
 drivers/media/platform/mediatek/mdp3/mtk-mdp3-cmdq.c | 3 ++-
 drivers/media/platform/mediatek/mdp3/mtk-mdp3-core.c | 2 ++
 drivers/media/platform/mediatek/mdp3/mtk-mdp3-core.h | 1 +
 3 files changed, 5 insertions(+), 1 deletion(-)

diff --git a/drivers/media/platform/mediatek/mdp3/mtk-mdp3-cmdq.c b/drivers/media/platform/mediatek/mdp3/mtk-mdp3-cmdq.c
index ea2ea119dd2a..ef5dade35fd3 100644
--- a/drivers/media/platform/mediatek/mdp3/mtk-mdp3-cmdq.c
+++ b/drivers/media/platform/mediatek/mdp3/mtk-mdp3-cmdq.c
@@ -676,7 +676,8 @@ static struct mdp_cmdq_cmd *mdp_cmdq_prepare(struct mdp_dev *mdp,
 		dev_err(dev, "mdp_path_config error %d\n", pp_idx);
 		goto err_free_path;
 	}
-	cmdq_pkt_finalize(&cmd->pkt);
+	cmdq_pkt_eoc(&cmd->pkt);
+	cmdq_pkt_jump_rel(&cmd->pkt, CMDQ_INST_SIZE, mdp->cmdq_shift_pa[pp_idx]);
 
 	for (i = 0; i < num_comp; i++) {
 		s32 inner_id = MDP_COMP_NONE;
diff --git a/drivers/media/platform/mediatek/mdp3/mtk-mdp3-core.c b/drivers/media/platform/mediatek/mdp3/mtk-mdp3-core.c
index 37e7b985d52c..40623c1980bf 100644
--- a/drivers/media/platform/mediatek/mdp3/mtk-mdp3-core.c
+++ b/drivers/media/platform/mediatek/mdp3/mtk-mdp3-core.c
@@ -312,6 +312,8 @@ static int mdp_probe(struct platform_device *pdev)
 			ret = PTR_ERR(mdp->cmdq_clt[i]);
 			goto err_mbox_destroy;
 		}
+
+		mdp->cmdq_shift_pa[i] = cmdq_get_shift_pa(mdp->cmdq_clt[i]->chan);
 	}
 
 	init_waitqueue_head(&mdp->callback_wq);
diff --git a/drivers/media/platform/mediatek/mdp3/mtk-mdp3-core.h b/drivers/media/platform/mediatek/mdp3/mtk-mdp3-core.h
index 430251f63754..05cade1d098e 100644
--- a/drivers/media/platform/mediatek/mdp3/mtk-mdp3-core.h
+++ b/drivers/media/platform/mediatek/mdp3/mtk-mdp3-core.h
@@ -126,6 +126,7 @@ struct mdp_dev {
 	u32					id_count;
 	struct ida				mdp_ida;
 	struct cmdq_client			*cmdq_clt[MDP_PP_MAX];
+	u8					cmdq_shift_pa[MDP_PP_MAX];
 	wait_queue_head_t			callback_wq;
 
 	struct v4l2_device			v4l2_dev;
-- 
2.34.1



From chunkuang.hu at kernel.org  Sun Sep  1 07:32:58 2024
From: chunkuang.hu at kernel.org (Chun-Kuang Hu)
Date: Sun,  1 Sep 2024 14:32:58 +0000
Subject: [PATCH v4 2/3] media: platform: mtk-mdp3: Use cmdq_pkt_create() and cmdq_pkt_destroy()
In-Reply-To: <20240901143259.16849-1-chunkuang.hu@kernel.org>
References: <20240901143259.16849-1-chunkuang.hu@kernel.org>
Message-ID: <20240901143259.16849-3-chunkuang.hu@kernel.org>

Use cmdq_pkt_create() and cmdq_pkt_destroy() common function
instead of implementing mdp3 version.

Signed-off-by: Chun-Kuang Hu <chunkuang.hu at kernel.org>
---
 .../platform/mediatek/mdp3/mtk-mdp3-cmdq.c    | 46 ++-----------------
 .../platform/mediatek/mdp3/mtk-mdp3-cmdq.h    |  1 +
 2 files changed, 6 insertions(+), 41 deletions(-)

diff --git a/drivers/media/platform/mediatek/mdp3/mtk-mdp3-cmdq.c b/drivers/media/platform/mediatek/mdp3/mtk-mdp3-cmdq.c
index ef5dade35fd3..740a484c8eb4 100644
--- a/drivers/media/platform/mediatek/mdp3/mtk-mdp3-cmdq.c
+++ b/drivers/media/platform/mediatek/mdp3/mtk-mdp3-cmdq.c
@@ -471,43 +471,6 @@ static int mdp_path_config(struct mdp_dev *mdp, struct mdp_cmdq_cmd *cmd,
 	return 0;
 }
 
-static int mdp_cmdq_pkt_create(struct cmdq_client *client, struct cmdq_pkt *pkt,
-			       size_t size)
-{
-	struct device *dev;
-	dma_addr_t dma_addr;
-
-	pkt->va_base = kzalloc(size, GFP_KERNEL);
-	if (!pkt->va_base)
-		return -ENOMEM;
-
-	pkt->buf_size = size;
-	pkt->cl = (void *)client;
-
-	dev = client->chan->mbox->dev;
-	dma_addr = dma_map_single(dev, pkt->va_base, pkt->buf_size,
-				  DMA_TO_DEVICE);
-	if (dma_mapping_error(dev, dma_addr)) {
-		dev_err(dev, "dma map failed, size=%u\n", (u32)(u64)size);
-		kfree(pkt->va_base);
-		return -ENOMEM;
-	}
-
-	pkt->pa_base = dma_addr;
-
-	return 0;
-}
-
-static void mdp_cmdq_pkt_destroy(struct cmdq_pkt *pkt)
-{
-	struct cmdq_client *client = (struct cmdq_client *)pkt->cl;
-
-	dma_unmap_single(client->chan->mbox->dev, pkt->pa_base, pkt->buf_size,
-			 DMA_TO_DEVICE);
-	kfree(pkt->va_base);
-	pkt->va_base = NULL;
-}
-
 static void mdp_auto_release_work(struct work_struct *work)
 {
 	struct mdp_cmdq_cmd *cmd;
@@ -538,7 +501,7 @@ static void mdp_auto_release_work(struct work_struct *work)
 		wake_up(&mdp->callback_wq);
 	}
 
-	mdp_cmdq_pkt_destroy(&cmd->pkt);
+	cmdq_pkt_destroy(mdp->cmdq_clt[cmd->pp_idx], &cmd->pkt);
 	kfree(cmd->comps);
 	cmd->comps = NULL;
 	kfree(cmd);
@@ -578,7 +541,7 @@ static void mdp_handle_cmdq_callback(struct mbox_client *cl, void *mssg)
 		if (refcount_dec_and_test(&mdp->job_count))
 			wake_up(&mdp->callback_wq);
 
-		mdp_cmdq_pkt_destroy(&cmd->pkt);
+		cmdq_pkt_destroy(mdp->cmdq_clt[cmd->pp_idx], &cmd->pkt);
 		kfree(cmd->comps);
 		cmd->comps = NULL;
 		kfree(cmd);
@@ -620,7 +583,7 @@ static struct mdp_cmdq_cmd *mdp_cmdq_prepare(struct mdp_dev *mdp,
 		goto err_uninit;
 	}
 
-	ret = mdp_cmdq_pkt_create(mdp->cmdq_clt[pp_idx], &cmd->pkt, SZ_16K);
+	ret = cmdq_pkt_create(mdp->cmdq_clt[pp_idx], &cmd->pkt, SZ_16K);
 	if (ret)
 		goto err_free_cmd;
 
@@ -700,6 +663,7 @@ static struct mdp_cmdq_cmd *mdp_cmdq_prepare(struct mdp_dev *mdp,
 	cmd->comps = comps;
 	cmd->num_comps = num_comp;
 	cmd->mdp_ctx = param->mdp_ctx;
+	cmd->pp_idx = pp_idx;
 
 	kfree(path);
 	return cmd;
@@ -711,7 +675,7 @@ static struct mdp_cmdq_cmd *mdp_cmdq_prepare(struct mdp_dev *mdp,
 err_free_comps:
 	kfree(comps);
 err_destroy_pkt:
-	mdp_cmdq_pkt_destroy(&cmd->pkt);
+	cmdq_pkt_destroy(mdp->cmdq_clt[pp_idx], &cmd->pkt);
 err_free_cmd:
 	kfree(cmd);
 err_uninit:
diff --git a/drivers/media/platform/mediatek/mdp3/mtk-mdp3-cmdq.h b/drivers/media/platform/mediatek/mdp3/mtk-mdp3-cmdq.h
index 53a30ad7e0b0..935ae9825728 100644
--- a/drivers/media/platform/mediatek/mdp3/mtk-mdp3-cmdq.h
+++ b/drivers/media/platform/mediatek/mdp3/mtk-mdp3-cmdq.h
@@ -35,6 +35,7 @@ struct mdp_cmdq_cmd {
 	struct mdp_comp *comps;
 	void *mdp_ctx;
 	u8 num_comps;
+	u8 pp_idx;
 };
 
 struct mdp_dev;
-- 
2.34.1



From chunkuang.hu at kernel.org  Sun Sep  1 07:32:59 2024
From: chunkuang.hu at kernel.org (Chun-Kuang Hu)
Date: Sun,  1 Sep 2024 14:32:59 +0000
Subject: [PATCH v4 3/3] soc: mediatek: cmdq: Remove cmdq_pkt_finalize() helper function
In-Reply-To: <20240901143259.16849-1-chunkuang.hu@kernel.org>
References: <20240901143259.16849-1-chunkuang.hu@kernel.org>
Message-ID: <20240901143259.16849-4-chunkuang.hu@kernel.org>

In order to have fine-grained control, use cmdq_pkt_eoc() and
cmdq_pkt_jump_rel() to replace cmdq_pkt_finalize().

Signed-off-by: Chun-Kuang Hu <chunkuang.hu at kernel.org>
---
 drivers/soc/mediatek/mtk-cmdq-helper.c | 22 ----------------------
 include/linux/soc/mediatek/mtk-cmdq.h  | 13 -------------
 2 files changed, 35 deletions(-)

diff --git a/drivers/soc/mediatek/mtk-cmdq-helper.c b/drivers/soc/mediatek/mtk-cmdq-helper.c
index a8fccedba83f..2a47dda4dd4a 100644
--- a/drivers/soc/mediatek/mtk-cmdq-helper.c
+++ b/drivers/soc/mediatek/mtk-cmdq-helper.c
@@ -538,27 +538,5 @@ int cmdq_pkt_eoc(struct cmdq_pkt *pkt)
 }
 EXPORT_SYMBOL(cmdq_pkt_eoc);
 
-int cmdq_pkt_finalize(struct cmdq_pkt *pkt)
-{
-	struct cmdq_instruction inst = { {0} };
-	int err;
-
-	/* insert EOC and generate IRQ for each command iteration */
-	inst.op = CMDQ_CODE_EOC;
-	inst.value = CMDQ_EOC_IRQ_EN;
-	err = cmdq_pkt_append_command(pkt, inst);
-	if (err < 0)
-		return err;
-
-	/* JUMP to end */
-	inst.op = CMDQ_CODE_JUMP;
-	inst.value = CMDQ_JUMP_PASS >>
-		cmdq_get_shift_pa(((struct cmdq_client *)pkt->cl)->chan);
-	err = cmdq_pkt_append_command(pkt, inst);
-
-	return err;
-}
-EXPORT_SYMBOL(cmdq_pkt_finalize);
-
 MODULE_DESCRIPTION("MediaTek Command Queue (CMDQ) driver");
 MODULE_LICENSE("GPL v2");
diff --git a/include/linux/soc/mediatek/mtk-cmdq.h b/include/linux/soc/mediatek/mtk-cmdq.h
index 5bee6f7fc400..0c3906e8ad19 100644
--- a/include/linux/soc/mediatek/mtk-cmdq.h
+++ b/include/linux/soc/mediatek/mtk-cmdq.h
@@ -391,14 +391,6 @@ int cmdq_pkt_jump_rel(struct cmdq_pkt *pkt, s32 offset, u8 shift_pa);
  */
 int cmdq_pkt_eoc(struct cmdq_pkt *pkt);
 
-/**
- * cmdq_pkt_finalize() - Append EOC and jump command to pkt.
- * @pkt:	the CMDQ packet
- *
- * Return: 0 for success; else the error code is returned
- */
-int cmdq_pkt_finalize(struct cmdq_pkt *pkt);
-
 #else /* IS_ENABLED(CONFIG_MTK_CMDQ) */
 
 static inline int cmdq_dev_get_client_reg(struct device *dev,
@@ -519,11 +511,6 @@ static inline int cmdq_pkt_eoc(struct cmdq_pkt *pkt)
 	return -EINVAL;
 }
 
-static inline int cmdq_pkt_finalize(struct cmdq_pkt *pkt)
-{
-	return -EINVAL;
-}
-
 #endif /* IS_ENABLED(CONFIG_MTK_CMDQ) */
 
 #endif	/* __MTK_CMDQ_H__ */
-- 
2.34.1



From peter.wang at mediatek.com  Sun Sep  1 19:18:04 2024
From: peter.wang at mediatek.com (peter.wang at mediatek.com)
Date: Mon, 2 Sep 2024 10:18:04 +0800
Subject: [PATCH v2 1/2] ufs: core: fix the issue of ICU failure
In-Reply-To: <20240902021805.1125-1-peter.wang@mediatek.com>
References: <20240902021805.1125-1-peter.wang@mediatek.com>
Message-ID: <20240902021805.1125-2-peter.wang@mediatek.com>

From: Peter Wang <peter.wang at mediatek.com>

When setting the ICU bit without using read-modify-write,
SQRTCy will restart SQ again and receive an RTC return
error code 2 (Failure - SQ not stopped).

Additionally, the error log has been modified so that
this type of error can be observed.

Fixes: ab248643d3d6 ("scsi: ufs: core: Add error handling for MCQ mode")
Cc: stable at vger.kernel.org
Signed-off-by: Peter Wang <peter.wang at mediatek.com>
---
 drivers/ufs/core/ufs-mcq.c | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/drivers/ufs/core/ufs-mcq.c b/drivers/ufs/core/ufs-mcq.c
index 5891cdacd0b3..afd9541f4bd8 100644
--- a/drivers/ufs/core/ufs-mcq.c
+++ b/drivers/ufs/core/ufs-mcq.c
@@ -570,15 +570,16 @@ int ufshcd_mcq_sq_cleanup(struct ufs_hba *hba, int task_tag)
 	writel(nexus, opr_sqd_base + REG_SQCTI);
 
 	/* SQRTCy.ICU = 1 */
-	writel(SQ_ICU, opr_sqd_base + REG_SQRTC);
+	writel(readl(opr_sqd_base + REG_SQRTC) | SQ_ICU,
+		opr_sqd_base + REG_SQRTC);
 
 	/* Poll SQRTSy.CUS = 1. Return result from SQRTSy.RTC */
 	reg = opr_sqd_base + REG_SQRTS;
 	err = read_poll_timeout(readl, val, val & SQ_CUS, 20,
 				MCQ_POLL_US, false, reg);
-	if (err)
-		dev_err(hba->dev, "%s: failed. hwq=%d, tag=%d err=%ld\n",
-			__func__, id, task_tag,
+	if (err || FIELD_GET(SQ_ICU_ERR_CODE_MASK, readl(reg)))
+		dev_err(hba->dev, "%s: failed. hwq=%d, tag=%d err=%d RTC=%ld\n",
+			__func__, id, task_tag, err,
 			FIELD_GET(SQ_ICU_ERR_CODE_MASK, readl(reg)));
 
 	if (ufshcd_mcq_sq_start(hba, hwq))
-- 
2.45.2



From peter.wang at mediatek.com  Sun Sep  1 19:18:05 2024
From: peter.wang at mediatek.com (peter.wang at mediatek.com)
Date: Mon, 2 Sep 2024 10:18:05 +0800
Subject: [PATCH v2 2/2] ufs: core: requeue MCQ abort request
In-Reply-To: <20240902021805.1125-1-peter.wang@mediatek.com>
References: <20240902021805.1125-1-peter.wang@mediatek.com>
Message-ID: <20240902021805.1125-3-peter.wang@mediatek.com>

From: Peter Wang <peter.wang at mediatek.com>

MCQ aborts a command using two methods below:
1. Nullified UTRD, Host controller skips this transfer request,
   reply Completion Queue entry to Host SW with OCS=ABORTED
2. SQ cleanup, The host controller will post to the Completion Queue
   to update the OCS field with ABORTED.

For these two cases, set a flag to notify SCSI to requeue the
command after receiving OCS_ABORTED.

Fixes: ab248643d3d6 ("scsi: ufs: core: Add error handling for MCQ mode")
Cc: stable at vger.kernel.org
Signed-off-by: Peter Wang <peter.wang at mediatek.com>
---
 drivers/ufs/core/ufs-mcq.c |  1 +
 drivers/ufs/core/ufshcd.c  | 21 ++++++++-------------
 include/ufs/ufshcd.h       |  2 ++
 3 files changed, 11 insertions(+), 13 deletions(-)

diff --git a/drivers/ufs/core/ufs-mcq.c b/drivers/ufs/core/ufs-mcq.c
index afd9541f4bd8..abdc55a8b960 100644
--- a/drivers/ufs/core/ufs-mcq.c
+++ b/drivers/ufs/core/ufs-mcq.c
@@ -642,6 +642,7 @@ static bool ufshcd_mcq_sqe_search(struct ufs_hba *hba,
 		match = le64_to_cpu(utrd->command_desc_base_addr) & CQE_UCD_BA;
 		if (addr == match) {
 			ufshcd_mcq_nullify_sqe(utrd);
+			lrbp->host_initiate_abort = true;
 			ret = true;
 			goto out;
 		}
diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
index a6f818cdef0e..fadea691d69d 100644
--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -3006,6 +3006,7 @@ static int ufshcd_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd)
 	ufshcd_prepare_lrbp_crypto(scsi_cmd_to_rq(cmd), lrbp);
 
 	lrbp->req_abort_skip = false;
+	lrbp->host_initiate_abort = false;
 
 	ufshcd_comp_scsi_upiu(hba, lrbp);
 
@@ -5404,7 +5405,10 @@ ufshcd_transfer_rsp_status(struct ufs_hba *hba, struct ufshcd_lrb *lrbp,
 		}
 		break;
 	case OCS_ABORTED:
-		result |= DID_ABORT << 16;
+		if (lrbp->host_initiate_abort)
+			result |= DID_REQUEUE << 16;
+		else
+			result |= DID_ABORT << 16;
 		break;
 	case OCS_INVALID_COMMAND_STATUS:
 		result |= DID_REQUEUE << 16;
@@ -6472,24 +6476,15 @@ static bool ufshcd_abort_one(struct request *rq, void *priv)
 	struct Scsi_Host *shost = sdev->host;
 	struct ufs_hba *hba = shost_priv(shost);
 	struct ufshcd_lrb *lrbp = &hba->lrb[tag];
-	struct ufs_hw_queue *hwq;
-	unsigned long flags;
 
 	*ret = ufshcd_try_to_abort_task(hba, tag);
 	dev_err(hba->dev, "Aborting tag %d / CDB %#02x %s\n", tag,
 		hba->lrb[tag].cmd ? hba->lrb[tag].cmd->cmnd[0] : -1,
 		*ret ? "failed" : "succeeded");
 
-	/* Release cmd in MCQ mode if abort succeeds */
-	if (hba->mcq_enabled && (*ret == 0)) {
-		hwq = ufshcd_mcq_req_to_hwq(hba, scsi_cmd_to_rq(lrbp->cmd));
-		if (!hwq)
-			return 0;
-		spin_lock_irqsave(&hwq->cq_lock, flags);
-		if (ufshcd_cmd_inflight(lrbp->cmd))
-			ufshcd_release_scsi_cmd(hba, lrbp);
-		spin_unlock_irqrestore(&hwq->cq_lock, flags);
-	}
+	/* Host will post to CQ with OCS_ABORTED after SQ cleanup */
+	if (hba->mcq_enabled && (*ret == 0))
+		lrbp->host_initiate_abort = true;
 
 	return *ret == 0;
 }
diff --git a/include/ufs/ufshcd.h b/include/ufs/ufshcd.h
index 0fd2aebac728..49dd5ca8a4e7 100644
--- a/include/ufs/ufshcd.h
+++ b/include/ufs/ufshcd.h
@@ -173,6 +173,7 @@ struct ufs_pm_lvl_states {
  * @crypto_key_slot: the key slot to use for inline crypto (-1 if none)
  * @data_unit_num: the data unit number for the first block for inline crypto
  * @req_abort_skip: skip request abort task flag
+ * @host_initiate_abort: Abort flag initiated by host
  */
 struct ufshcd_lrb {
 	struct utp_transfer_req_desc *utr_descriptor_ptr;
@@ -202,6 +203,7 @@ struct ufshcd_lrb {
 #endif
 
 	bool req_abort_skip;
+	bool host_initiate_abort;
 };
 
 /**
-- 
2.45.2



From peter.wang at mediatek.com  Sun Sep  1 19:18:03 2024
From: peter.wang at mediatek.com (peter.wang at mediatek.com)
Date: Mon, 2 Sep 2024 10:18:03 +0800
Subject: [PATCH v2 0/2] fix MCQ abort defect
Message-ID: <20240902021805.1125-1-peter.wang@mediatek.com>

From: Peter Wang <peter.wang at mediatek.com>

This series fixes MCQ abort defect.

V2:
 - Fix mcq_enabled build error.

Peter Wang (2):
  ufs: core: fix the issue of ICU failure
  ufs: core: requeue MCQ abort request

 drivers/ufs/core/ufs-mcq.c | 10 ++++++----
 drivers/ufs/core/ufshcd.c  | 21 ++++++++-------------
 include/ufs/ufshcd.h       |  2 ++
 3 files changed, 16 insertions(+), 17 deletions(-)

-- 
2.45.2



From yenchia.chen at mediatek.com  Sun Sep  1 20:10:44 2024
From: yenchia.chen at mediatek.com (Yenchia Chen)
Date: Mon, 2 Sep 2024 11:10:44 +0800
Subject: [PATCH 5.15 0/1] pm, restore async device resume optimization
Message-ID: <20240902031047.9865-1-yenchia.chen@mediatek.com>

From: "yenchia.chen" <yenchia.chen at mediatek.com>

We have met a deadlock issue on our device when resuming.
After applying this patch which is picked from mainline, issue solved.
We'd like to backport to 5.15.y and could you help to review? thanks.

[ Upstream commit 3e999770ac1c7c31a70685dd5b88e89473509e9c ]

Rafael J. Wysocki (1):
  PM: sleep: Restore asynchronous device resume optimization

 drivers/base/power/main.c | 117 +++++++++++++++++++++-----------------
 include/linux/pm.h        |   1 +
 2 files changed, 65 insertions(+), 53 deletions(-)

-- 
2.18.0



From yenchia.chen at mediatek.com  Sun Sep  1 20:10:45 2024
From: yenchia.chen at mediatek.com (Yenchia Chen)
Date: Mon, 2 Sep 2024 11:10:45 +0800
Subject: [PATCH 5.15 1/1] PM: sleep: Restore asynchronous device resume optimization
In-Reply-To: <20240902031047.9865-1-yenchia.chen@mediatek.com>
References: <20240902031047.9865-1-yenchia.chen@mediatek.com>
Message-ID: <20240902031047.9865-2-yenchia.chen@mediatek.com>

From: "Rafael J. Wysocki" <rafael.j.wysocki at intel.com>

Before commit 7839d0078e0d ("PM: sleep: Fix possible deadlocks in core
system-wide PM code"), the resume of devices that were allowed to resume
asynchronously was scheduled before starting the resume of the other
devices, so the former did not have to wait for the latter unless
functional dependencies were present.

Commit 7839d0078e0d removed that optimization in order to address a
correctness issue, but it can be restored with the help of a new device
power management flag, so do that now.

Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki at intel.com>
Reviewed-by: Stanislaw Gruszka <stanislaw.gruszka at linux.intel.com>
Signed-off-by: yenchia.chen <yenchia.chen at mediatek.com>
---
 drivers/base/power/main.c | 117 +++++++++++++++++++++-----------------
 include/linux/pm.h        |   1 +
 2 files changed, 65 insertions(+), 53 deletions(-)

diff --git a/drivers/base/power/main.c b/drivers/base/power/main.c
index 185ea0d93a5e..01591c105511 100644
--- a/drivers/base/power/main.c
+++ b/drivers/base/power/main.c
@@ -580,7 +580,7 @@ bool dev_pm_skip_resume(struct device *dev)
 }
 
 /**
- * __device_resume_noirq - Execute a "noirq resume" callback for given device.
+ * device_resume_noirq - Execute a "noirq resume" callback for given device.
  * @dev: Device to handle.
  * @state: PM transition of the system being carried out.
  * @async: If true, the device is being resumed asynchronously.
@@ -588,7 +588,7 @@ bool dev_pm_skip_resume(struct device *dev)
  * The driver of @dev will not receive interrupts while this function is being
  * executed.
  */
-static void __device_resume_noirq(struct device *dev, pm_message_t state, bool async)
+static void device_resume_noirq(struct device *dev, pm_message_t state, bool async)
 {
 	pm_callback_t callback = NULL;
 	const char *info = NULL;
@@ -675,16 +675,22 @@ static bool dpm_async_fn(struct device *dev, async_func_t func)
 {
 	reinit_completion(&dev->power.completion);
 
-	if (!is_async(dev))
-		return false;
-
-	get_device(dev);
+	if (is_async(dev)) {
+		dev->power.async_in_progress = true;
 
-	if (async_schedule_dev_nocall(func, dev))
-		return true;
+		get_device(dev);
 
-	put_device(dev);
+		if (async_schedule_dev_nocall(func, dev))
+			return true;
 
+		put_device(dev);
+	}
+	/*
+	 * Because async_schedule_dev_nocall() above has returned false or it
+	 * has not been called at all, func() is not running and it is safe to
+	 * update the async_in_progress flag without extra synchronization.
+	 */
+	dev->power.async_in_progress = false;
 	return false;
 }
 
@@ -692,18 +698,10 @@ static void async_resume_noirq(void *data, async_cookie_t cookie)
 {
 	struct device *dev = data;
 
-	__device_resume_noirq(dev, pm_transition, true);
+	device_resume_noirq(dev, pm_transition, true);
 	put_device(dev);
 }
 
-static void device_resume_noirq(struct device *dev)
-{
-	if (dpm_async_fn(dev, async_resume_noirq))
-		return;
-
-	__device_resume_noirq(dev, pm_transition, false);
-}
-
 static void dpm_noirq_resume_devices(pm_message_t state)
 {
 	struct device *dev;
@@ -713,18 +711,28 @@ static void dpm_noirq_resume_devices(pm_message_t state)
 	mutex_lock(&dpm_list_mtx);
 	pm_transition = state;
 
+	/*
+	 * Trigger the resume of "async" devices upfront so they don't have to
+	 * wait for the "non-async" ones they don't depend on.
+	 */
+	list_for_each_entry(dev, &dpm_noirq_list, power.entry)
+		dpm_async_fn(dev, async_resume_noirq);
+
 	while (!list_empty(&dpm_noirq_list)) {
 		dev = to_device(dpm_noirq_list.next);
-		get_device(dev);
 		list_move_tail(&dev->power.entry, &dpm_late_early_list);
 
-		mutex_unlock(&dpm_list_mtx);
+		if (!dev->power.async_in_progress) {
+			get_device(dev);
 
-		device_resume_noirq(dev);
+			mutex_unlock(&dpm_list_mtx);
 
-		put_device(dev);
+			device_resume_noirq(dev, state, false);
 
-		mutex_lock(&dpm_list_mtx);
+			put_device(dev);
+
+			mutex_lock(&dpm_list_mtx);
+		}
 	}
 	mutex_unlock(&dpm_list_mtx);
 	async_synchronize_full();
@@ -750,14 +758,14 @@ void dpm_resume_noirq(pm_message_t state)
 }
 
 /**
- * __device_resume_early - Execute an "early resume" callback for given device.
+ * device_resume_early - Execute an "early resume" callback for given device.
  * @dev: Device to handle.
  * @state: PM transition of the system being carried out.
  * @async: If true, the device is being resumed asynchronously.
  *
  * Runtime PM is disabled for @dev while this function is being executed.
  */
-static void __device_resume_early(struct device *dev, pm_message_t state, bool async)
+static void device_resume_early(struct device *dev, pm_message_t state, bool async)
 {
 	pm_callback_t callback = NULL;
 	const char *info = NULL;
@@ -823,18 +831,10 @@ static void async_resume_early(void *data, async_cookie_t cookie)
 {
 	struct device *dev = data;
 
-	__device_resume_early(dev, pm_transition, true);
+	device_resume_early(dev, pm_transition, true);
 	put_device(dev);
 }
 
-static void device_resume_early(struct device *dev)
-{
-	if (dpm_async_fn(dev, async_resume_early))
-		return;
-
-	__device_resume_early(dev, pm_transition, false);
-}
-
 /**
  * dpm_resume_early - Execute "early resume" callbacks for all devices.
  * @state: PM transition of the system being carried out.
@@ -848,18 +848,28 @@ void dpm_resume_early(pm_message_t state)
 	mutex_lock(&dpm_list_mtx);
 	pm_transition = state;
 
+	/*
+	 * Trigger the resume of "async" devices upfront so they don't have to
+	 * wait for the "non-async" ones they don't depend on.
+	 */
+	list_for_each_entry(dev, &dpm_late_early_list, power.entry)
+		dpm_async_fn(dev, async_resume_early);
+
 	while (!list_empty(&dpm_late_early_list)) {
 		dev = to_device(dpm_late_early_list.next);
-		get_device(dev);
 		list_move_tail(&dev->power.entry, &dpm_suspended_list);
 
-		mutex_unlock(&dpm_list_mtx);
+		if (!dev->power.async_in_progress) {
+			get_device(dev);
 
-		device_resume_early(dev);
+			mutex_unlock(&dpm_list_mtx);
 
-		put_device(dev);
+			device_resume_early(dev, state, false);
 
-		mutex_lock(&dpm_list_mtx);
+			put_device(dev);
+
+			mutex_lock(&dpm_list_mtx);
+		}
 	}
 	mutex_unlock(&dpm_list_mtx);
 	async_synchronize_full();
@@ -879,12 +889,12 @@ void dpm_resume_start(pm_message_t state)
 EXPORT_SYMBOL_GPL(dpm_resume_start);
 
 /**
- * __device_resume - Execute "resume" callbacks for given device.
+ * device_resume - Execute "resume" callbacks for given device.
  * @dev: Device to handle.
  * @state: PM transition of the system being carried out.
  * @async: If true, the device is being resumed asynchronously.
  */
-static void __device_resume(struct device *dev, pm_message_t state, bool async)
+static void device_resume(struct device *dev, pm_message_t state, bool async)
 {
 	pm_callback_t callback = NULL;
 	const char *info = NULL;
@@ -978,18 +988,10 @@ static void async_resume(void *data, async_cookie_t cookie)
 {
 	struct device *dev = data;
 
-	__device_resume(dev, pm_transition, true);
+	device_resume(dev, pm_transition, true);
 	put_device(dev);
 }
 
-static void device_resume(struct device *dev)
-{
-	if (dpm_async_fn(dev, async_resume))
-		return;
-
-	__device_resume(dev, pm_transition, false);
-}
-
 /**
  * dpm_resume - Execute "resume" callbacks for non-sysdev devices.
  * @state: PM transition of the system being carried out.
@@ -1009,16 +1011,25 @@ void dpm_resume(pm_message_t state)
 	pm_transition = state;
 	async_error = 0;
 
+	/*
+	 * Trigger the resume of "async" devices upfront so they don't have to
+	 * wait for the "non-async" ones they don't depend on.
+	 */
+	list_for_each_entry(dev, &dpm_suspended_list, power.entry)
+		dpm_async_fn(dev, async_resume);
+
 	while (!list_empty(&dpm_suspended_list)) {
 		dev = to_device(dpm_suspended_list.next);
 
 		get_device(dev);
 
-		mutex_unlock(&dpm_list_mtx);
+		if (!dev->power.async_in_progress) {
+			mutex_unlock(&dpm_list_mtx);
 
-		device_resume(dev);
+			device_resume(dev, state, false);
 
-		mutex_lock(&dpm_list_mtx);
+			mutex_lock(&dpm_list_mtx);
+		}
 
 		if (!list_empty(&dev->power.entry))
 			list_move_tail(&dev->power.entry, &dpm_prepared_list);
diff --git a/include/linux/pm.h b/include/linux/pm.h
index d1c19f5b1380..8f46e9f01929 100644
--- a/include/linux/pm.h
+++ b/include/linux/pm.h
@@ -606,6 +606,7 @@ struct dev_pm_info {
 	bool			wakeup_path:1;
 	bool			syscore:1;
 	bool			no_pm_callbacks:1;	/* Owned by the PM core */
+	bool			async_in_progress:1;	/* Owned by the PM core */
 	unsigned int		must_resume:1;	/* Owned by the PM core */
 	unsigned int		may_skip_resume:1;	/* Set by subsystems */
 #else
-- 
2.18.0



From Chris.Lu at mediatek.com  Sun Sep  1 20:39:33 2024
From: Chris.Lu at mediatek.com (=?utf-8?B?Q2hyaXMgTHUgKOmZuOeomuazkyk=?=)
Date: Mon, 2 Sep 2024 03:39:33 +0000
Subject: [PATCH] Bluetooth: btmtk: avoid UAF in btmtk_process_coredump
In-Reply-To: <ZscLmFqTGpAdWCdJ@quatroqueijos.cascardo.eti.br>
References: <20240731190330.1619718-1-cascardo@igalia.com>
	 <ZscLmFqTGpAdWCdJ@quatroqueijos.cascardo.eti.br>
Message-ID: <2306bbd971726aa3324c6f2d13ab66f9d4d6b835.camel@mediatek.com>

On Thu, 2024-08-22 at 06:57 -0300, Thadeu Lima de Souza Cascardo wrote:
>  	 
> External email : Please do not click links or open attachments until
> you have verified the sender or the content.
>  On Wed, Jul 31, 2024 at 04:03:30PM -0300, Thadeu Lima de Souza
> Cascardo wrote:
> > hci_devcd_append may lead to the release of the skb, so it cannot
> be
> > accessed once it is called.
> > 
> > ==================================================================
> > BUG: KASAN: slab-use-after-free in
> btmtk_process_coredump+0x2a7/0x2d0 [btmtk]
> > Read of size 4 at addr ffff888033cfabb0 by task kworker/0:3/82
> > 
> > CPU: 0 PID: 82 Comm: kworker/0:3 Tainted:
> G     U             6.6.40-lockdep-03464-g1d8b4eb3060e #1
> b0b3c1cc0c842735643fb411799d97921d1f688c
> > Hardware name: Google Yaviks_Ufs/Yaviks_Ufs, BIOS
> Google_Yaviks_Ufs.15217.552.0 05/07/2024
> > Workqueue: events btusb_rx_work [btusb]
> > Call Trace:
> >  <TASK>
> >  dump_stack_lvl+0xfd/0x150
> >  print_report+0x131/0x780
> >  kasan_report+0x177/0x1c0
> >  btmtk_process_coredump+0x2a7/0x2d0 [btmtk
> 03edd567dd71a65958807c95a65db31d433e1d01]
> >  btusb_recv_acl_mtk+0x11c/0x1a0 [btusb
> 675430d1e87c4f24d0c1f80efe600757a0f32bec]
> >  btusb_rx_work+0x9e/0xe0 [btusb
> 675430d1e87c4f24d0c1f80efe600757a0f32bec]
> >  worker_thread+0xe44/0x2cc0
> >  kthread+0x2ff/0x3a0
> >  ret_from_fork+0x51/0x80
> >  ret_from_fork_asm+0x1b/0x30
> >  </TASK>
> > 
> > Allocated by task 82:
> >  stack_trace_save+0xdc/0x190
> >  kasan_set_track+0x4e/0x80
> >  __kasan_slab_alloc+0x4e/0x60
> >  kmem_cache_alloc+0x19f/0x360
> >  skb_clone+0x132/0xf70
> >  btusb_recv_acl_mtk+0x104/0x1a0 [btusb]
> >  btusb_rx_work+0x9e/0xe0 [btusb]
> >  worker_thread+0xe44/0x2cc0
> >  kthread+0x2ff/0x3a0
> >  ret_from_fork+0x51/0x80
> >  ret_from_fork_asm+0x1b/0x30
> > 
> > Freed by task 1733:
> >  stack_trace_save+0xdc/0x190
> >  kasan_set_track+0x4e/0x80
> >  kasan_save_free_info+0x28/0xb0
> >  ____kasan_slab_free+0xfd/0x170
> >  kmem_cache_free+0x183/0x3f0
> >  hci_devcd_rx+0x91a/0x2060 [bluetooth]
> >  worker_thread+0xe44/0x2cc0
> >  kthread+0x2ff/0x3a0
> >  ret_from_fork+0x51/0x80
> >  ret_from_fork_asm+0x1b/0x30
> > 
> > The buggy address belongs to the object at ffff888033cfab40
> >  which belongs to the cache skbuff_head_cache of size 232
> > The buggy address is located 112 bytes inside of
> >  freed 232-byte region [ffff888033cfab40, ffff888033cfac28)
> > 
> > The buggy address belongs to the physical page:
> > page:00000000a174ba93 refcount:1 mapcount:0
> mapping:0000000000000000 index:0x0 pfn:0x33cfa
> > head:00000000a174ba93 order:1 entire_mapcount:0 nr_pages_mapped:0
> pincount:0
> > anon flags: 0x4000000000000840(slab|head|zone=1)
> > page_type: 0xffffffff()
> > raw: 4000000000000840 ffff888100848a00 0000000000000000
> 0000000000000001
> > raw: 0000000000000000 0000000080190019 00000001ffffffff
> 0000000000000000
> > page dumped because: kasan: bad access detected
> > 
> > Memory state around the buggy address:
> >  ffff888033cfaa80: fb fb fb fb fb fb fb fb fb fb fb fb fb fc fc fc
> >  ffff888033cfab00: fc fc fc fc fc fc fc fc fa fb fb fb fb fb fb fb
> > >ffff888033cfab80: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
> >                                      ^
> >  ffff888033cfac00: fb fb fb fb fb fc fc fc fc fc fc fc fc fc fc fc
> >  ffff888033cfac80: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
> > ==================================================================
> > 
> > Check if we need to call hci_devcd_complete before calling
> > hci_devcd_append. That requires that we check data->cd_info.cnt >=
> > MTK_COREDUMP_NUM instead of data->cd_info.cnt > MTK_COREDUMP_NUM,
> as we
> > increment data->cd_info.cnt only once the call to hci_devcd_append
> > succeeds.
> > 
> > Fixes: 0b7015132878 ("Bluetooth: btusb: mediatek: add MediaTek
> devcoredump support")
> > Signed-off-by: Thadeu Lima de Souza Cascardo <cascardo at igalia.com>
> > ---
> >  drivers/bluetooth/btmtk.c | 20 ++++++++++++--------
> >  1 file changed, 12 insertions(+), 8 deletions(-)
> > 
> > diff --git a/drivers/bluetooth/btmtk.c b/drivers/bluetooth/btmtk.c
> > index b7c348687a77..46f605249df7 100644
> > --- a/drivers/bluetooth/btmtk.c
> > +++ b/drivers/bluetooth/btmtk.c
> > @@ -395,6 +395,7 @@ int btmtk_process_coredump(struct hci_dev
> *hdev, struct sk_buff *skb)
> >  {
> >  struct btmtk_data *data = hci_get_priv(hdev);
> >  int err;
> > +bool complete = false;
> >  
> >  if (!IS_ENABLED(CONFIG_DEV_COREDUMP)) {
> >  kfree_skb(skb);
> > @@ -416,19 +417,22 @@ int btmtk_process_coredump(struct hci_dev
> *hdev, struct sk_buff *skb)
> >  fallthrough;
> >  case HCI_DEVCOREDUMP_ACTIVE:
> >  default:
> > +/* Mediatek coredump data would be more than MTK_COREDUMP_NUM */
> > +if (data->cd_info.cnt >= MTK_COREDUMP_NUM &&
> > +    skb->len > MTK_COREDUMP_END_LEN)
> > +if (!memcmp((char *)&skb->data[skb->len - MTK_COREDUMP_END_LEN],
> > +    MTK_COREDUMP_END, MTK_COREDUMP_END_LEN - 1))
> > +complete = true;
> > +
> >  err = hci_devcd_append(hdev, skb);
> >  if (err < 0)
> >  break;
> >  data->cd_info.cnt++;
> >  
> > -/* Mediatek coredump data would be more than MTK_COREDUMP_NUM */
> > -if (data->cd_info.cnt > MTK_COREDUMP_NUM &&
> > -    skb->len > MTK_COREDUMP_END_LEN)
> > -if (!memcmp((char *)&skb->data[skb->len - MTK_COREDUMP_END_LEN],
> > -    MTK_COREDUMP_END, MTK_COREDUMP_END_LEN - 1)) {
> > -bt_dev_info(hdev, "Mediatek coredump end");
> > -hci_devcd_complete(hdev);
> > -}
> > +if (complete) {
> > +bt_dev_info(hdev, "Mediatek coredump end");
> > +hci_devcd_complete(hdev);
> > +}
> >  
> >  break;
> >  }
> > -- 
> > 2.34.1
> > 
> > 
> 
> Hi, anyone can help review this?
> 
> Thanks.

Hi Thadeu,

Sorry for late reply.
I've also verified on the platform which supports devcoredump feature
that Bluetooth can recover after triggerring devcoredump.
LGTM. It may need maintainer's approval for the next step.


Thanks a lot!
Chris

> Cascardo.

From yanzhen at vivo.com  Sun Sep  1 22:30:01 2024
From: yanzhen at vivo.com (Yan Zhen)
Date: Mon,  2 Sep 2024 13:30:01 +0800
Subject: [PATCH v3] soc: mediatek: mtk-mmsys: Simplify with dev_err_probe()
Message-ID: <20240902053001.930379-1-yanzhen@vivo.com>

Use dev_err_probe() to simplify the error path and unify a 
message template.

Using this helper is totally fine even if err is known to never
be -EPROBE_DEFER.

The benefit compared to a normal dev_err() is the standardized format
of the error code, it being emitted symbolically and the fact that
the error code is returned which allows more compact error paths.

Signed-off-by: Yan Zhen <yanzhen at vivo.com>
---

Changes in v3:
- Modify the message.
- Add the '\n' at the end of the string.

 drivers/soc/mediatek/mtk-mmsys.c | 15 ++++++---------
 1 file changed, 6 insertions(+), 9 deletions(-)

diff --git a/drivers/soc/mediatek/mtk-mmsys.c b/drivers/soc/mediatek/mtk-mmsys.c
index 938240714e54..170319163c28 100644
--- a/drivers/soc/mediatek/mtk-mmsys.c
+++ b/drivers/soc/mediatek/mtk-mmsys.c
@@ -397,11 +397,9 @@ static int mtk_mmsys_probe(struct platform_device *pdev)
 		return -ENOMEM;
 
 	mmsys->regs = devm_platform_ioremap_resource(pdev, 0);
-	if (IS_ERR(mmsys->regs)) {
-		ret = PTR_ERR(mmsys->regs);
-		dev_err(dev, "Failed to ioremap mmsys registers: %d\n", ret);
-		return ret;
-	}
+	if (IS_ERR(mmsys->regs))
+		return dev_err_probe(dev, PTR_ERR(mmsys->regs),
+				     "Failed to ioremap mmsys registers\n");
 
 	mmsys->data = of_device_get_match_data(&pdev->dev);
 
@@ -413,10 +411,9 @@ static int mtk_mmsys_probe(struct platform_device *pdev)
 		mmsys->rcdev.ops = &mtk_mmsys_reset_ops;
 		mmsys->rcdev.of_node = pdev->dev.of_node;
 		ret = devm_reset_controller_register(&pdev->dev, &mmsys->rcdev);
-		if (ret) {
-			dev_err(&pdev->dev, "Couldn't register mmsys reset controller: %d\n", ret);
-			return ret;
-		}
+		if (ret)
+			dev_err_probe(&pdev->dev, ret,
+				      "Couldn't register mmsys reset controller\n");
 	}
 
 	/* CMDQ is optional */
-- 
2.34.1



From mingyen.hsieh at mediatek.com  Sun Sep  1 22:44:28 2024
From: mingyen.hsieh at mediatek.com (Mingyen Hsieh)
Date: Mon, 2 Sep 2024 13:44:28 +0800
Subject: [PATCH v2] wifi: mac80211: introduce EHT rate support in AQL airtime
Message-ID: <20240902054428.13273-1-mingyen.hsieh@mediatek.com>

From: Ming Yen Hsieh <mingyen.hsieh at mediatek.com>

Add definitions related to EHT mode and airtime calculation
according to the 802.11BE_D4.0.

Co-developed-by: Bo Jiao <Bo.Jiao at mediatek.com>
Signed-off-by: Bo Jiao <Bo.Jiao at mediatek.com>
Signed-off-by: Deren Wu <deren.wu at mediatek.com>
Signed-off-by: Quan Zhou <quan.zhou at mediatek.com>
Signed-off-by: Ming Yen Hsieh <mingyen.hsieh at mediatek.com>
---
v2: 
 - add BW_320 support in ieee80211_get_rate_duration().
 - rewrite the existing WARN_ON for property stream condition.
---
 net/mac80211/airtime.c | 356 ++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 351 insertions(+), 5 deletions(-)

diff --git a/net/mac80211/airtime.c b/net/mac80211/airtime.c
index fdf8b658fede..920718640962 100644
--- a/net/mac80211/airtime.c
+++ b/net/mac80211/airtime.c
@@ -55,10 +55,21 @@
 #define HE_DURATION_S(shift, streams, gi, bps)		\
 	(HE_DURATION(streams, gi, bps) >> shift)
 
+/* gi in HE/EHT is identical. It matches enum nl80211_eht_gi as well */
+#define EHT_GI_08 HE_GI_08
+#define EHT_GI_16 HE_GI_16
+#define EHT_GI_32 HE_GI_32
+
+#define EHT_DURATION(streams, gi, bps)			\
+	HE_DURATION(streams, gi, bps)
+#define EHT_DURATION_S(shift, streams, gi, bps)		\
+	HE_DURATION_S(shift, streams, gi, bps)
+
 #define BW_20			0
 #define BW_40			1
 #define BW_80			2
 #define BW_160			3
+#define BW_320			4
 
 /*
  * Define group sort order: HT40 -> SGI -> #streams
@@ -68,17 +79,26 @@
 #define IEEE80211_VHT_STREAM_GROUPS	8 /* BW(=4) * SGI(=2) */
 
 #define IEEE80211_HE_MAX_STREAMS	8
+#define IEEE80211_HE_STREAM_GROUPS	12 /* BW(=4) * GI(=3) */
+
+#define IEEE80211_EHT_MAX_STREAMS	16
+#define IEEE80211_EHT_STREAM_GROUPS	15 /* BW(=5) * GI(=3) */
 
 #define IEEE80211_HT_GROUPS_NB	(IEEE80211_MAX_STREAMS *	\
 				 IEEE80211_HT_STREAM_GROUPS)
 #define IEEE80211_VHT_GROUPS_NB	(IEEE80211_MAX_STREAMS *	\
 					 IEEE80211_VHT_STREAM_GROUPS)
+#define IEEE80211_HE_GROUPS_NB	(IEEE80211_HE_MAX_STREAMS *	\
+				 IEEE80211_HE_STREAM_GROUPS)
+#define IEEE80211_EHT_GROUPS_NB	(IEEE80211_EHT_MAX_STREAMS *	\
+				 IEEE80211_EHT_STREAM_GROUPS)
 
 #define IEEE80211_HT_GROUP_0	0
 #define IEEE80211_VHT_GROUP_0	(IEEE80211_HT_GROUP_0 + IEEE80211_HT_GROUPS_NB)
 #define IEEE80211_HE_GROUP_0	(IEEE80211_VHT_GROUP_0 + IEEE80211_VHT_GROUPS_NB)
+#define IEEE80211_EHT_GROUP_0	(IEEE80211_HE_GROUP_0 + IEEE80211_HE_GROUPS_NB)
 
-#define MCS_GROUP_RATES		12
+#define MCS_GROUP_RATES		14
 
 #define HT_GROUP_IDX(_streams, _sgi, _ht40)	\
 	IEEE80211_HT_GROUP_0 +			\
@@ -203,6 +223,59 @@
 #define HE_GROUP(_streams, _gi, _bw)					\
 	__HE_GROUP(_streams, _gi, _bw,				\
 		   HE_GROUP_SHIFT(_streams, _gi, _bw))
+
+#define EHT_BW2VBPS(_bw, r5, r4, r3, r2, r1)					\
+	((_bw) == BW_320 ? r5 : BW2VBPS(_bw, r4, r3, r2, r1))
+
+#define EHT_GROUP_IDX(_streams, _gi, _bw)				\
+	(IEEE80211_EHT_GROUP_0 +					\
+	 IEEE80211_EHT_MAX_STREAMS * 3 * (_bw) +			\
+	 IEEE80211_EHT_MAX_STREAMS * (_gi) +				\
+	 (_streams) - 1)
+
+#define __EHT_GROUP(_streams, _gi, _bw, _s)						\
+	[EHT_GROUP_IDX(_streams, _gi, _bw)] = {						\
+	.shift = _s,									\
+	.duration = {									\
+		EHT_DURATION_S(_s, _streams, _gi,					\
+			       EHT_BW2VBPS(_bw,  1960,   980,  490,  234,  117)),	\
+		EHT_DURATION_S(_s, _streams, _gi,					\
+			       EHT_BW2VBPS(_bw,  3920,  1960,  980,  468,  234)),	\
+		EHT_DURATION_S(_s, _streams, _gi,					\
+			       EHT_BW2VBPS(_bw,  5880,  2937, 1470,  702,  351)),	\
+		EHT_DURATION_S(_s, _streams, _gi,					\
+			       EHT_BW2VBPS(_bw,  7840,  3920, 1960,  936,  468)),	\
+		EHT_DURATION_S(_s, _streams, _gi,					\
+			       EHT_BW2VBPS(_bw, 11760,  5880, 2940, 1404,  702)),	\
+		EHT_DURATION_S(_s, _streams, _gi,					\
+			       EHT_BW2VBPS(_bw, 15680,  7840, 3920, 1872,  936)),	\
+		EHT_DURATION_S(_s, _streams, _gi,					\
+			       EHT_BW2VBPS(_bw, 17640,  8820, 4410, 2106, 1053)),	\
+		EHT_DURATION_S(_s, _streams, _gi,					\
+			       EHT_BW2VBPS(_bw, 19600,  9800, 4900, 2340, 1170)),	\
+		EHT_DURATION_S(_s, _streams, _gi,					\
+			       EHT_BW2VBPS(_bw, 23520, 11760, 5880, 2808, 1404)),	\
+		EHT_DURATION_S(_s, _streams, _gi,					\
+			       EHT_BW2VBPS(_bw, 26133, 13066, 6533, 3120, 1560)),	\
+		EHT_DURATION_S(_s, _streams, _gi,					\
+			       EHT_BW2VBPS(_bw, 29400, 14700, 7350, 3510, 1755)),	\
+		EHT_DURATION_S(_s, _streams, _gi,					\
+			       EHT_BW2VBPS(_bw, 32666, 16333, 8166, 3900, 1950)),	\
+		EHT_DURATION_S(_s, _streams, _gi,					\
+			       EHT_BW2VBPS(_bw, 35280, 17640, 8820, 4212, 2106)),	\
+		EHT_DURATION_S(_s, _streams, _gi,					\
+			       EHT_BW2VBPS(_bw, 39200, 19600, 9800, 4680, 2340))	\
+		}									\
+}
+
+#define EHT_GROUP_SHIFT(_streams, _gi, _bw)						\
+	GROUP_SHIFT(EHT_DURATION(_streams, _gi,						\
+				 EHT_BW2VBPS(_bw, 1960, 980, 490, 234, 117)))
+
+#define EHT_GROUP(_streams, _gi, _bw)					\
+	__EHT_GROUP(_streams, _gi, _bw,				\
+		   EHT_GROUP_SHIFT(_streams, _gi, _bw))
+
 struct mcs_group {
 	u8 shift;
 	u16 duration[MCS_GROUP_RATES];
@@ -376,6 +449,261 @@ static const struct mcs_group airtime_mcs_groups[] = {
 	HE_GROUP(6, HE_GI_32, BW_160),
 	HE_GROUP(7, HE_GI_32, BW_160),
 	HE_GROUP(8, HE_GI_32, BW_160),
+
+	EHT_GROUP(1, EHT_GI_08, BW_20),
+	EHT_GROUP(2, EHT_GI_08, BW_20),
+	EHT_GROUP(3, EHT_GI_08, BW_20),
+	EHT_GROUP(4, EHT_GI_08, BW_20),
+	EHT_GROUP(5, EHT_GI_08, BW_20),
+	EHT_GROUP(6, EHT_GI_08, BW_20),
+	EHT_GROUP(7, EHT_GI_08, BW_20),
+	EHT_GROUP(8, EHT_GI_08, BW_20),
+	EHT_GROUP(9, EHT_GI_08, BW_20),
+	EHT_GROUP(10, EHT_GI_08, BW_20),
+	EHT_GROUP(11, EHT_GI_08, BW_20),
+	EHT_GROUP(12, EHT_GI_08, BW_20),
+	EHT_GROUP(13, EHT_GI_08, BW_20),
+	EHT_GROUP(14, EHT_GI_08, BW_20),
+	EHT_GROUP(15, EHT_GI_08, BW_20),
+	EHT_GROUP(16, EHT_GI_08, BW_20),
+
+	EHT_GROUP(1, EHT_GI_16, BW_20),
+	EHT_GROUP(2, EHT_GI_16, BW_20),
+	EHT_GROUP(3, EHT_GI_16, BW_20),
+	EHT_GROUP(4, EHT_GI_16, BW_20),
+	EHT_GROUP(5, EHT_GI_16, BW_20),
+	EHT_GROUP(6, EHT_GI_16, BW_20),
+	EHT_GROUP(7, EHT_GI_16, BW_20),
+	EHT_GROUP(8, EHT_GI_16, BW_20),
+	EHT_GROUP(9, EHT_GI_16, BW_20),
+	EHT_GROUP(10, EHT_GI_16, BW_20),
+	EHT_GROUP(11, EHT_GI_16, BW_20),
+	EHT_GROUP(12, EHT_GI_16, BW_20),
+	EHT_GROUP(13, EHT_GI_16, BW_20),
+	EHT_GROUP(14, EHT_GI_16, BW_20),
+	EHT_GROUP(15, EHT_GI_16, BW_20),
+	EHT_GROUP(16, EHT_GI_16, BW_20),
+
+	EHT_GROUP(1, EHT_GI_32, BW_20),
+	EHT_GROUP(2, EHT_GI_32, BW_20),
+	EHT_GROUP(3, EHT_GI_32, BW_20),
+	EHT_GROUP(4, EHT_GI_32, BW_20),
+	EHT_GROUP(5, EHT_GI_32, BW_20),
+	EHT_GROUP(6, EHT_GI_32, BW_20),
+	EHT_GROUP(7, EHT_GI_32, BW_20),
+	EHT_GROUP(8, EHT_GI_32, BW_20),
+	EHT_GROUP(9, EHT_GI_32, BW_20),
+	EHT_GROUP(10, EHT_GI_32, BW_20),
+	EHT_GROUP(11, EHT_GI_32, BW_20),
+	EHT_GROUP(12, EHT_GI_32, BW_20),
+	EHT_GROUP(13, EHT_GI_32, BW_20),
+	EHT_GROUP(14, EHT_GI_32, BW_20),
+	EHT_GROUP(15, EHT_GI_32, BW_20),
+	EHT_GROUP(16, EHT_GI_32, BW_20),
+
+	EHT_GROUP(1, EHT_GI_08, BW_40),
+	EHT_GROUP(2, EHT_GI_08, BW_40),
+	EHT_GROUP(3, EHT_GI_08, BW_40),
+	EHT_GROUP(4, EHT_GI_08, BW_40),
+	EHT_GROUP(5, EHT_GI_08, BW_40),
+	EHT_GROUP(6, EHT_GI_08, BW_40),
+	EHT_GROUP(7, EHT_GI_08, BW_40),
+	EHT_GROUP(8, EHT_GI_08, BW_40),
+	EHT_GROUP(9, EHT_GI_08, BW_40),
+	EHT_GROUP(10, EHT_GI_08, BW_40),
+	EHT_GROUP(11, EHT_GI_08, BW_40),
+	EHT_GROUP(12, EHT_GI_08, BW_40),
+	EHT_GROUP(13, EHT_GI_08, BW_40),
+	EHT_GROUP(14, EHT_GI_08, BW_40),
+	EHT_GROUP(15, EHT_GI_08, BW_40),
+	EHT_GROUP(16, EHT_GI_08, BW_40),
+
+	EHT_GROUP(1, EHT_GI_16, BW_40),
+	EHT_GROUP(2, EHT_GI_16, BW_40),
+	EHT_GROUP(3, EHT_GI_16, BW_40),
+	EHT_GROUP(4, EHT_GI_16, BW_40),
+	EHT_GROUP(5, EHT_GI_16, BW_40),
+	EHT_GROUP(6, EHT_GI_16, BW_40),
+	EHT_GROUP(7, EHT_GI_16, BW_40),
+	EHT_GROUP(8, EHT_GI_16, BW_40),
+	EHT_GROUP(9, EHT_GI_16, BW_40),
+	EHT_GROUP(10, EHT_GI_16, BW_40),
+	EHT_GROUP(11, EHT_GI_16, BW_40),
+	EHT_GROUP(12, EHT_GI_16, BW_40),
+	EHT_GROUP(13, EHT_GI_16, BW_40),
+	EHT_GROUP(14, EHT_GI_16, BW_40),
+	EHT_GROUP(15, EHT_GI_16, BW_40),
+	EHT_GROUP(16, EHT_GI_16, BW_40),
+
+	EHT_GROUP(1, EHT_GI_32, BW_40),
+	EHT_GROUP(2, EHT_GI_32, BW_40),
+	EHT_GROUP(3, EHT_GI_32, BW_40),
+	EHT_GROUP(4, EHT_GI_32, BW_40),
+	EHT_GROUP(5, EHT_GI_32, BW_40),
+	EHT_GROUP(6, EHT_GI_32, BW_40),
+	EHT_GROUP(7, EHT_GI_32, BW_40),
+	EHT_GROUP(8, EHT_GI_32, BW_40),
+	EHT_GROUP(9, EHT_GI_32, BW_40),
+	EHT_GROUP(10, EHT_GI_32, BW_40),
+	EHT_GROUP(11, EHT_GI_32, BW_40),
+	EHT_GROUP(12, EHT_GI_32, BW_40),
+	EHT_GROUP(13, EHT_GI_32, BW_40),
+	EHT_GROUP(14, EHT_GI_32, BW_40),
+	EHT_GROUP(15, EHT_GI_32, BW_40),
+	EHT_GROUP(16, EHT_GI_32, BW_40),
+
+	EHT_GROUP(1, EHT_GI_08, BW_80),
+	EHT_GROUP(2, EHT_GI_08, BW_80),
+	EHT_GROUP(3, EHT_GI_08, BW_80),
+	EHT_GROUP(4, EHT_GI_08, BW_80),
+	EHT_GROUP(5, EHT_GI_08, BW_80),
+	EHT_GROUP(6, EHT_GI_08, BW_80),
+	EHT_GROUP(7, EHT_GI_08, BW_80),
+	EHT_GROUP(8, EHT_GI_08, BW_80),
+	EHT_GROUP(9, EHT_GI_08, BW_80),
+	EHT_GROUP(10, EHT_GI_08, BW_80),
+	EHT_GROUP(11, EHT_GI_08, BW_80),
+	EHT_GROUP(12, EHT_GI_08, BW_80),
+	EHT_GROUP(13, EHT_GI_08, BW_80),
+	EHT_GROUP(14, EHT_GI_08, BW_80),
+	EHT_GROUP(15, EHT_GI_08, BW_80),
+	EHT_GROUP(16, EHT_GI_08, BW_80),
+
+	EHT_GROUP(1, EHT_GI_16, BW_80),
+	EHT_GROUP(2, EHT_GI_16, BW_80),
+	EHT_GROUP(3, EHT_GI_16, BW_80),
+	EHT_GROUP(4, EHT_GI_16, BW_80),
+	EHT_GROUP(5, EHT_GI_16, BW_80),
+	EHT_GROUP(6, EHT_GI_16, BW_80),
+	EHT_GROUP(7, EHT_GI_16, BW_80),
+	EHT_GROUP(8, EHT_GI_16, BW_80),
+	EHT_GROUP(9, EHT_GI_16, BW_80),
+	EHT_GROUP(10, EHT_GI_16, BW_80),
+	EHT_GROUP(11, EHT_GI_16, BW_80),
+	EHT_GROUP(12, EHT_GI_16, BW_80),
+	EHT_GROUP(13, EHT_GI_16, BW_80),
+	EHT_GROUP(14, EHT_GI_16, BW_80),
+	EHT_GROUP(15, EHT_GI_16, BW_80),
+	EHT_GROUP(16, EHT_GI_16, BW_80),
+
+	EHT_GROUP(1, EHT_GI_32, BW_80),
+	EHT_GROUP(2, EHT_GI_32, BW_80),
+	EHT_GROUP(3, EHT_GI_32, BW_80),
+	EHT_GROUP(4, EHT_GI_32, BW_80),
+	EHT_GROUP(5, EHT_GI_32, BW_80),
+	EHT_GROUP(6, EHT_GI_32, BW_80),
+	EHT_GROUP(7, EHT_GI_32, BW_80),
+	EHT_GROUP(8, EHT_GI_32, BW_80),
+	EHT_GROUP(9, EHT_GI_32, BW_80),
+	EHT_GROUP(10, EHT_GI_32, BW_80),
+	EHT_GROUP(11, EHT_GI_32, BW_80),
+	EHT_GROUP(12, EHT_GI_32, BW_80),
+	EHT_GROUP(13, EHT_GI_32, BW_80),
+	EHT_GROUP(14, EHT_GI_32, BW_80),
+	EHT_GROUP(15, EHT_GI_32, BW_80),
+	EHT_GROUP(16, EHT_GI_32, BW_80),
+
+	EHT_GROUP(1, EHT_GI_08, BW_160),
+	EHT_GROUP(2, EHT_GI_08, BW_160),
+	EHT_GROUP(3, EHT_GI_08, BW_160),
+	EHT_GROUP(4, EHT_GI_08, BW_160),
+	EHT_GROUP(5, EHT_GI_08, BW_160),
+	EHT_GROUP(6, EHT_GI_08, BW_160),
+	EHT_GROUP(7, EHT_GI_08, BW_160),
+	EHT_GROUP(8, EHT_GI_08, BW_160),
+	EHT_GROUP(9, EHT_GI_08, BW_160),
+	EHT_GROUP(10, EHT_GI_08, BW_160),
+	EHT_GROUP(11, EHT_GI_08, BW_160),
+	EHT_GROUP(12, EHT_GI_08, BW_160),
+	EHT_GROUP(13, EHT_GI_08, BW_160),
+	EHT_GROUP(14, EHT_GI_08, BW_160),
+	EHT_GROUP(15, EHT_GI_08, BW_160),
+	EHT_GROUP(16, EHT_GI_08, BW_160),
+
+	EHT_GROUP(1, EHT_GI_16, BW_160),
+	EHT_GROUP(2, EHT_GI_16, BW_160),
+	EHT_GROUP(3, EHT_GI_16, BW_160),
+	EHT_GROUP(4, EHT_GI_16, BW_160),
+	EHT_GROUP(5, EHT_GI_16, BW_160),
+	EHT_GROUP(6, EHT_GI_16, BW_160),
+	EHT_GROUP(7, EHT_GI_16, BW_160),
+	EHT_GROUP(8, EHT_GI_16, BW_160),
+	EHT_GROUP(9, EHT_GI_16, BW_160),
+	EHT_GROUP(10, EHT_GI_16, BW_160),
+	EHT_GROUP(11, EHT_GI_16, BW_160),
+	EHT_GROUP(12, EHT_GI_16, BW_160),
+	EHT_GROUP(13, EHT_GI_16, BW_160),
+	EHT_GROUP(14, EHT_GI_16, BW_160),
+	EHT_GROUP(15, EHT_GI_16, BW_160),
+	EHT_GROUP(16, EHT_GI_16, BW_160),
+
+	EHT_GROUP(1, EHT_GI_32, BW_160),
+	EHT_GROUP(2, EHT_GI_32, BW_160),
+	EHT_GROUP(3, EHT_GI_32, BW_160),
+	EHT_GROUP(4, EHT_GI_32, BW_160),
+	EHT_GROUP(5, EHT_GI_32, BW_160),
+	EHT_GROUP(6, EHT_GI_32, BW_160),
+	EHT_GROUP(7, EHT_GI_32, BW_160),
+	EHT_GROUP(8, EHT_GI_32, BW_160),
+	EHT_GROUP(9, EHT_GI_32, BW_160),
+	EHT_GROUP(10, EHT_GI_32, BW_160),
+	EHT_GROUP(11, EHT_GI_32, BW_160),
+	EHT_GROUP(12, EHT_GI_32, BW_160),
+	EHT_GROUP(13, EHT_GI_32, BW_160),
+	EHT_GROUP(14, EHT_GI_32, BW_160),
+	EHT_GROUP(15, EHT_GI_32, BW_160),
+	EHT_GROUP(16, EHT_GI_32, BW_160),
+
+	EHT_GROUP(1, EHT_GI_08, BW_320),
+	EHT_GROUP(2, EHT_GI_08, BW_320),
+	EHT_GROUP(3, EHT_GI_08, BW_320),
+	EHT_GROUP(4, EHT_GI_08, BW_320),
+	EHT_GROUP(5, EHT_GI_08, BW_320),
+	EHT_GROUP(6, EHT_GI_08, BW_320),
+	EHT_GROUP(7, EHT_GI_08, BW_320),
+	EHT_GROUP(8, EHT_GI_08, BW_320),
+	EHT_GROUP(9, EHT_GI_08, BW_320),
+	EHT_GROUP(10, EHT_GI_08, BW_320),
+	EHT_GROUP(11, EHT_GI_08, BW_320),
+	EHT_GROUP(12, EHT_GI_08, BW_320),
+	EHT_GROUP(13, EHT_GI_08, BW_320),
+	EHT_GROUP(14, EHT_GI_08, BW_320),
+	EHT_GROUP(15, EHT_GI_08, BW_320),
+	EHT_GROUP(16, EHT_GI_08, BW_320),
+
+	EHT_GROUP(1, EHT_GI_16, BW_320),
+	EHT_GROUP(2, EHT_GI_16, BW_320),
+	EHT_GROUP(3, EHT_GI_16, BW_320),
+	EHT_GROUP(4, EHT_GI_16, BW_320),
+	EHT_GROUP(5, EHT_GI_16, BW_320),
+	EHT_GROUP(6, EHT_GI_16, BW_320),
+	EHT_GROUP(7, EHT_GI_16, BW_320),
+	EHT_GROUP(8, EHT_GI_16, BW_320),
+	EHT_GROUP(9, EHT_GI_16, BW_320),
+	EHT_GROUP(10, EHT_GI_16, BW_320),
+	EHT_GROUP(11, EHT_GI_16, BW_320),
+	EHT_GROUP(12, EHT_GI_16, BW_320),
+	EHT_GROUP(13, EHT_GI_16, BW_320),
+	EHT_GROUP(14, EHT_GI_16, BW_320),
+	EHT_GROUP(15, EHT_GI_16, BW_320),
+	EHT_GROUP(16, EHT_GI_16, BW_320),
+
+	EHT_GROUP(1, EHT_GI_32, BW_320),
+	EHT_GROUP(2, EHT_GI_32, BW_320),
+	EHT_GROUP(3, EHT_GI_32, BW_320),
+	EHT_GROUP(4, EHT_GI_32, BW_320),
+	EHT_GROUP(5, EHT_GI_32, BW_320),
+	EHT_GROUP(6, EHT_GI_32, BW_320),
+	EHT_GROUP(7, EHT_GI_32, BW_320),
+	EHT_GROUP(8, EHT_GI_32, BW_320),
+	EHT_GROUP(9, EHT_GI_32, BW_320),
+	EHT_GROUP(10, EHT_GI_32, BW_320),
+	EHT_GROUP(11, EHT_GI_32, BW_320),
+	EHT_GROUP(12, EHT_GI_32, BW_320),
+	EHT_GROUP(13, EHT_GI_32, BW_320),
+	EHT_GROUP(14, EHT_GI_32, BW_320),
+	EHT_GROUP(15, EHT_GI_32, BW_320),
+	EHT_GROUP(16, EHT_GI_32, BW_320),
 };
 
 static u32
@@ -422,6 +750,9 @@ static u32 ieee80211_get_rate_duration(struct ieee80211_hw *hw,
 	case RATE_INFO_BW_160:
 		bw = BW_160;
 		break;
+	case RATE_INFO_BW_320:
+		bw = BW_320;
+		break;
 	default:
 		WARN_ON_ONCE(1);
 		return 0;
@@ -443,13 +774,19 @@ static u32 ieee80211_get_rate_duration(struct ieee80211_hw *hw,
 		idx = status->rate_idx;
 		group = HE_GROUP_IDX(streams, status->he_gi, bw);
 		break;
+	case RX_ENC_EHT:
+		streams = status->nss;
+		idx = status->rate_idx;
+		group = EHT_GROUP_IDX(streams, status->eht.gi, bw);
+		break;
 	default:
 		WARN_ON_ONCE(1);
 		return 0;
 	}
 
-	if (WARN_ON_ONCE((status->encoding != RX_ENC_HE && streams > 4) ||
-			 (status->encoding == RX_ENC_HE && streams > 8)))
+	if (WARN_ON_ONCE((status->encoding == RX_ENC_EHT && streams > 16) ||
+			 (status->encoding == RX_ENC_HE && streams > 8) ||
+			 (status->encoding < RX_ENC_HE && streams > 4)))
 		return 0;
 
 	if (idx >= MCS_GROUP_RATES)
@@ -517,7 +854,9 @@ static bool ieee80211_fill_rate_info(struct ieee80211_hw *hw,
 	stat->nss = ri->nss;
 	stat->rate_idx = ri->mcs;
 
-	if (ri->flags & RATE_INFO_FLAGS_HE_MCS)
+	if (ri->flags & RATE_INFO_FLAGS_EHT_MCS)
+		stat->encoding = RX_ENC_EHT;
+	else if (ri->flags & RATE_INFO_FLAGS_HE_MCS)
 		stat->encoding = RX_ENC_HE;
 	else if (ri->flags & RATE_INFO_FLAGS_VHT_MCS)
 		stat->encoding = RX_ENC_VHT;
@@ -529,7 +868,14 @@ static bool ieee80211_fill_rate_info(struct ieee80211_hw *hw,
 	if (ri->flags & RATE_INFO_FLAGS_SHORT_GI)
 		stat->enc_flags |= RX_ENC_FLAG_SHORT_GI;
 
-	stat->he_gi = ri->he_gi;
+	switch (stat->encoding) {
+	case RX_ENC_EHT:
+		stat->eht.gi = ri->eht_gi;
+		break;
+	default:
+		stat->he_gi = ri->he_gi;
+		break;
+	}
 
 	if (stat->encoding != RX_ENC_LEGACY)
 		return true;
-- 
2.45.2



From gregkh at linuxfoundation.org  Sun Sep  1 23:00:08 2024
From: gregkh at linuxfoundation.org (Greg Kroah-Hartman)
Date: Mon, 2 Sep 2024 08:00:08 +0200
Subject: [PATCH 5.15 1/1] PM: sleep: Restore asynchronous device resume
 optimization
In-Reply-To: <20240902031047.9865-2-yenchia.chen@mediatek.com>
References: <20240902031047.9865-1-yenchia.chen@mediatek.com>
 <20240902031047.9865-2-yenchia.chen@mediatek.com>
Message-ID: <2024090250-reliably-ecard-3b58@gregkh>

On Mon, Sep 02, 2024 at 11:10:45AM +0800, Yenchia Chen wrote:
> From: "Rafael J. Wysocki" <rafael.j.wysocki at intel.com>
> 
> Before commit 7839d0078e0d ("PM: sleep: Fix possible deadlocks in core
> system-wide PM code"), the resume of devices that were allowed to resume
> asynchronously was scheduled before starting the resume of the other
> devices, so the former did not have to wait for the latter unless
> functional dependencies were present.
> 
> Commit 7839d0078e0d removed that optimization in order to address a
> correctness issue, but it can be restored with the help of a new device
> power management flag, so do that now.
> 
> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki at intel.com>
> Reviewed-by: Stanislaw Gruszka <stanislaw.gruszka at linux.intel.com>
> Signed-off-by: yenchia.chen <yenchia.chen at mediatek.com>

Please sign off using your name, not your email alias.

Also, what git id is this?

thanks,

greg k-h


From gregkh at linuxfoundation.org  Sun Sep  1 23:01:10 2024
From: gregkh at linuxfoundation.org (Greg Kroah-Hartman)
Date: Mon, 2 Sep 2024 08:01:10 +0200
Subject: [PATCH 5.15 0/1] pm, restore async device resume optimization
In-Reply-To: <20240902031047.9865-1-yenchia.chen@mediatek.com>
References: <20240902031047.9865-1-yenchia.chen@mediatek.com>
Message-ID: <2024090220-uncaring-pretext-4391@gregkh>

On Mon, Sep 02, 2024 at 11:10:44AM +0800, Yenchia Chen wrote:
> From: "yenchia.chen" <yenchia.chen at mediatek.com>
> 
> We have met a deadlock issue on our device when resuming.
> After applying this patch which is picked from mainline, issue solved.
> We'd like to backport to 5.15.y and could you help to review? thanks.
> 
> [ Upstream commit 3e999770ac1c7c31a70685dd5b88e89473509e9c ]

For obvious reasons (and as per the documentation), we can't take
commits that are not also in all newer kernel releases, otherwise you
would have a regression if you moved to a newer kernel, right?

Please submit a series for all affected releases if you wish for a patch
to be applied to the trees.

thanks,

greg k-h


From vkoul at kernel.org  Mon Sep  2 01:29:03 2024
From: vkoul at kernel.org (Vinod Koul)
Date: Mon, 02 Sep 2024 13:59:03 +0530
Subject: [PATCH RESEND V2] dmaengine: Fix spelling mistakes
In-Reply-To: <20240831172949.13189-1-av2082000@gmail.com>
References: <20240831172949.13189-1-av2082000@gmail.com>
Message-ID: <172526574398.510261.10954732298871538.b4-ty@kernel.org>


On Sat, 31 Aug 2024 22:59:49 +0530, Amit Vadhavana wrote:
> Correct spelling mistakes in the DMA engine to improve readability
> and clarity without altering functionality.
> 
> 

Applied, thanks!

[1/1] dmaengine: Fix spelling mistakes
      commit: a688efea0f2a084aee372e5b7b12d4d2d172f99a

Best regards,
-- 
~Vinod




From mingyen.hsieh at mediatek.com  Mon Sep  2 02:00:54 2024
From: mingyen.hsieh at mediatek.com (Mingyen Hsieh)
Date: Mon, 2 Sep 2024 17:00:54 +0800
Subject: [PATCH] wifi: mt76: mt7925: fix a potential association failure upon resuming
Message-ID: <20240902090054.15806-1-mingyen.hsieh@mediatek.com>

From: Michael Lo <michael.lo at mediatek.com>

In multi-channel scenarios, the granted channel must be aborted before
suspending. Otherwise, the firmware will be put into a wrong state,
resulting in an association failure after resuming.

With this patch, the granted channel will be aborted before suspending
if necessary.

Cc: stable at vger.kernel.org
Fixes: c948b5da6bbe ("wifi: mt76: mt7925: add Mediatek Wi-Fi7 driver for mt7925 chips")
Signed-off-by: Michael Lo <michael.lo at mediatek.com>
Signed-off-by: Ming Yen Hsieh <mingyen.hsieh at mediatek.com>
---
 drivers/net/wireless/mediatek/mt76/mt7925/main.c  | 15 +++++++++++++++
 .../net/wireless/mediatek/mt76/mt7925/mt7925.h    |  1 +
 drivers/net/wireless/mediatek/mt76/mt7925/pci.c   |  2 ++
 3 files changed, 18 insertions(+)

diff --git a/drivers/net/wireless/mediatek/mt76/mt7925/main.c b/drivers/net/wireless/mediatek/mt76/mt7925/main.c
index 8c0768bf9343..7c05aebd3c20 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7925/main.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7925/main.c
@@ -439,6 +439,19 @@ static void mt7925_roc_iter(void *priv, u8 *mac,
 	mt7925_mcu_abort_roc(phy, &mvif->bss_conf, phy->roc_token_id);
 }
 
+void mt7925_roc_abort_sync(struct mt792x_dev *dev)
+{
+	struct mt792x_phy *phy = &dev->phy;
+
+	del_timer_sync(&phy->roc_timer);
+	cancel_work_sync(&phy->roc_work);
+	if (test_and_clear_bit(MT76_STATE_ROC, &phy->mt76->state))
+		ieee80211_iterate_interfaces(mt76_hw(dev),
+					     IEEE80211_IFACE_ITER_RESUME_ALL,
+					     mt7925_roc_iter, (void *)phy);
+}
+EXPORT_SYMBOL_GPL(mt7925_roc_abort_sync);
+
 void mt7925_roc_work(struct work_struct *work)
 {
 	struct mt792x_phy *phy;
@@ -1109,6 +1122,8 @@ static void mt7925_mac_link_sta_remove(struct mt76_dev *mdev,
 	msta = (struct mt792x_sta *)link_sta->sta->drv_priv;
 	mlink = mt792x_sta_to_link(msta, link_id);
 
+	mt7925_roc_abort_sync(dev);
+
 	mt76_connac_free_pending_tx_skbs(&dev->pm, &mlink->wcid);
 	mt76_connac_pm_wake(&dev->mphy, &dev->pm);
 
diff --git a/drivers/net/wireless/mediatek/mt76/mt7925/mt7925.h b/drivers/net/wireless/mediatek/mt76/mt7925/mt7925.h
index 669f3a079d04..c5ea431998e0 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7925/mt7925.h
+++ b/drivers/net/wireless/mediatek/mt76/mt7925/mt7925.h
@@ -307,6 +307,7 @@ int mt7925_mcu_set_roc(struct mt792x_phy *phy, struct mt792x_bss_conf *mconf,
 		       enum mt7925_roc_req type, u8 token_id);
 int mt7925_mcu_abort_roc(struct mt792x_phy *phy, struct mt792x_bss_conf *mconf,
 			 u8 token_id);
+void mt7925_roc_abort_sync(struct mt792x_dev *dev);
 int mt7925_mcu_fill_message(struct mt76_dev *mdev, struct sk_buff *skb,
 			    int cmd, int *wait_seq);
 int mt7925_mcu_add_key(struct mt76_dev *dev, struct ieee80211_vif *vif,
diff --git a/drivers/net/wireless/mediatek/mt76/mt7925/pci.c b/drivers/net/wireless/mediatek/mt76/mt7925/pci.c
index 6e4f4e78c350..39305c39362f 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7925/pci.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7925/pci.c
@@ -449,6 +449,8 @@ static int mt7925_pci_suspend(struct device *device)
 	cancel_delayed_work_sync(&pm->ps_work);
 	cancel_work_sync(&pm->wake_work);
 
+	mt7925_roc_abort_sync(dev);
+
 	err = mt792x_mcu_drv_pmctrl(dev);
 	if (err < 0)
 		goto restore_suspend;
-- 
2.45.2



From yenchia.chen at mediatek.com  Mon Sep  2 02:21:19 2024
From: yenchia.chen at mediatek.com (Yenchia Chen)
Date: Mon, 2 Sep 2024 17:21:19 +0800
Subject: [PATCH 6.1 0/1] pm, restore async device resume optimization
Message-ID: <20240902092121.16369-1-yenchia.chen@mediatek.com>

We have met a deadlock issue on our device which use 5.15.y when resuming.
After applying this patch which is picked from mainline, issue solved.
Backport to 6.1.y also.

Rafael J. Wysocki (1):
  PM: sleep: Restore asynchronous device resume optimization

 drivers/base/power/main.c | 117 +++++++++++++++++++++-----------------
 include/linux/pm.h        |   1 +
 2 files changed, 65 insertions(+), 53 deletions(-)

-- 
2.18.0



From yenchia.chen at mediatek.com  Mon Sep  2 02:21:20 2024
From: yenchia.chen at mediatek.com (Yenchia Chen)
Date: Mon, 2 Sep 2024 17:21:20 +0800
Subject: [PATCH 6.1 1/1] PM: sleep: Restore asynchronous device resume optimization
In-Reply-To: <20240902092121.16369-1-yenchia.chen@mediatek.com>
References: <20240902092121.16369-1-yenchia.chen@mediatek.com>
Message-ID: <20240902092121.16369-2-yenchia.chen@mediatek.com>

From: "Rafael J. Wysocki" <rafael.j.wysocki at intel.com>

commit 3e999770ac1c7c31a70685dd5b88e89473509e9c upstream.

Before commit 7839d0078e0d ("PM: sleep: Fix possible deadlocks in core
system-wide PM code"), the resume of devices that were allowed to resume
asynchronously was scheduled before starting the resume of the other
devices, so the former did not have to wait for the latter unless
functional dependencies were present.

Commit 7839d0078e0d removed that optimization in order to address a
correctness issue, but it can be restored with the help of a new device
power management flag, so do that now.

Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki at intel.com>
Reviewed-by: Stanislaw Gruszka <stanislaw.gruszka at linux.intel.com>
Signed-off-by: Yenchia Chen <yenchia.chen at mediatek.com>
---
 drivers/base/power/main.c | 117 +++++++++++++++++++++-----------------
 include/linux/pm.h        |   1 +
 2 files changed, 65 insertions(+), 53 deletions(-)

diff --git a/drivers/base/power/main.c b/drivers/base/power/main.c
index 9c5a5f4dba5a..fadcd0379dc2 100644
--- a/drivers/base/power/main.c
+++ b/drivers/base/power/main.c
@@ -579,7 +579,7 @@ bool dev_pm_skip_resume(struct device *dev)
 }
 
 /**
- * __device_resume_noirq - Execute a "noirq resume" callback for given device.
+ * device_resume_noirq - Execute a "noirq resume" callback for given device.
  * @dev: Device to handle.
  * @state: PM transition of the system being carried out.
  * @async: If true, the device is being resumed asynchronously.
@@ -587,7 +587,7 @@ bool dev_pm_skip_resume(struct device *dev)
  * The driver of @dev will not receive interrupts while this function is being
  * executed.
  */
-static void __device_resume_noirq(struct device *dev, pm_message_t state, bool async)
+static void device_resume_noirq(struct device *dev, pm_message_t state, bool async)
 {
 	pm_callback_t callback = NULL;
 	const char *info = NULL;
@@ -674,16 +674,22 @@ static bool dpm_async_fn(struct device *dev, async_func_t func)
 {
 	reinit_completion(&dev->power.completion);
 
-	if (!is_async(dev))
-		return false;
-
-	get_device(dev);
+	if (is_async(dev)) {
+		dev->power.async_in_progress = true;
 
-	if (async_schedule_dev_nocall(func, dev))
-		return true;
+		get_device(dev);
 
-	put_device(dev);
+		if (async_schedule_dev_nocall(func, dev))
+			return true;
 
+		put_device(dev);
+	}
+	/*
+	 * Because async_schedule_dev_nocall() above has returned false or it
+	 * has not been called at all, func() is not running and it is safe to
+	 * update the async_in_progress flag without extra synchronization.
+	 */
+	dev->power.async_in_progress = false;
 	return false;
 }
 
@@ -691,18 +697,10 @@ static void async_resume_noirq(void *data, async_cookie_t cookie)
 {
 	struct device *dev = data;
 
-	__device_resume_noirq(dev, pm_transition, true);
+	device_resume_noirq(dev, pm_transition, true);
 	put_device(dev);
 }
 
-static void device_resume_noirq(struct device *dev)
-{
-	if (dpm_async_fn(dev, async_resume_noirq))
-		return;
-
-	__device_resume_noirq(dev, pm_transition, false);
-}
-
 static void dpm_noirq_resume_devices(pm_message_t state)
 {
 	struct device *dev;
@@ -712,18 +710,28 @@ static void dpm_noirq_resume_devices(pm_message_t state)
 	mutex_lock(&dpm_list_mtx);
 	pm_transition = state;
 
+	/*
+	 * Trigger the resume of "async" devices upfront so they don't have to
+	 * wait for the "non-async" ones they don't depend on.
+	 */
+	list_for_each_entry(dev, &dpm_noirq_list, power.entry)
+		dpm_async_fn(dev, async_resume_noirq);
+
 	while (!list_empty(&dpm_noirq_list)) {
 		dev = to_device(dpm_noirq_list.next);
-		get_device(dev);
 		list_move_tail(&dev->power.entry, &dpm_late_early_list);
 
-		mutex_unlock(&dpm_list_mtx);
+		if (!dev->power.async_in_progress) {
+			get_device(dev);
 
-		device_resume_noirq(dev);
+			mutex_unlock(&dpm_list_mtx);
 
-		put_device(dev);
+			device_resume_noirq(dev, state, false);
 
-		mutex_lock(&dpm_list_mtx);
+			put_device(dev);
+
+			mutex_lock(&dpm_list_mtx);
+		}
 	}
 	mutex_unlock(&dpm_list_mtx);
 	async_synchronize_full();
@@ -747,14 +755,14 @@ void dpm_resume_noirq(pm_message_t state)
 }
 
 /**
- * __device_resume_early - Execute an "early resume" callback for given device.
+ * device_resume_early - Execute an "early resume" callback for given device.
  * @dev: Device to handle.
  * @state: PM transition of the system being carried out.
  * @async: If true, the device is being resumed asynchronously.
  *
  * Runtime PM is disabled for @dev while this function is being executed.
  */
-static void __device_resume_early(struct device *dev, pm_message_t state, bool async)
+static void device_resume_early(struct device *dev, pm_message_t state, bool async)
 {
 	pm_callback_t callback = NULL;
 	const char *info = NULL;
@@ -820,18 +828,10 @@ static void async_resume_early(void *data, async_cookie_t cookie)
 {
 	struct device *dev = data;
 
-	__device_resume_early(dev, pm_transition, true);
+	device_resume_early(dev, pm_transition, true);
 	put_device(dev);
 }
 
-static void device_resume_early(struct device *dev)
-{
-	if (dpm_async_fn(dev, async_resume_early))
-		return;
-
-	__device_resume_early(dev, pm_transition, false);
-}
-
 /**
  * dpm_resume_early - Execute "early resume" callbacks for all devices.
  * @state: PM transition of the system being carried out.
@@ -845,18 +845,28 @@ void dpm_resume_early(pm_message_t state)
 	mutex_lock(&dpm_list_mtx);
 	pm_transition = state;
 
+	/*
+	 * Trigger the resume of "async" devices upfront so they don't have to
+	 * wait for the "non-async" ones they don't depend on.
+	 */
+	list_for_each_entry(dev, &dpm_late_early_list, power.entry)
+		dpm_async_fn(dev, async_resume_early);
+
 	while (!list_empty(&dpm_late_early_list)) {
 		dev = to_device(dpm_late_early_list.next);
-		get_device(dev);
 		list_move_tail(&dev->power.entry, &dpm_suspended_list);
 
-		mutex_unlock(&dpm_list_mtx);
+		if (!dev->power.async_in_progress) {
+			get_device(dev);
 
-		device_resume_early(dev);
+			mutex_unlock(&dpm_list_mtx);
 
-		put_device(dev);
+			device_resume_early(dev, state, false);
 
-		mutex_lock(&dpm_list_mtx);
+			put_device(dev);
+
+			mutex_lock(&dpm_list_mtx);
+		}
 	}
 	mutex_unlock(&dpm_list_mtx);
 	async_synchronize_full();
@@ -876,12 +886,12 @@ void dpm_resume_start(pm_message_t state)
 EXPORT_SYMBOL_GPL(dpm_resume_start);
 
 /**
- * __device_resume - Execute "resume" callbacks for given device.
+ * device_resume - Execute "resume" callbacks for given device.
  * @dev: Device to handle.
  * @state: PM transition of the system being carried out.
  * @async: If true, the device is being resumed asynchronously.
  */
-static void __device_resume(struct device *dev, pm_message_t state, bool async)
+static void device_resume(struct device *dev, pm_message_t state, bool async)
 {
 	pm_callback_t callback = NULL;
 	const char *info = NULL;
@@ -975,18 +985,10 @@ static void async_resume(void *data, async_cookie_t cookie)
 {
 	struct device *dev = data;
 
-	__device_resume(dev, pm_transition, true);
+	device_resume(dev, pm_transition, true);
 	put_device(dev);
 }
 
-static void device_resume(struct device *dev)
-{
-	if (dpm_async_fn(dev, async_resume))
-		return;
-
-	__device_resume(dev, pm_transition, false);
-}
-
 /**
  * dpm_resume - Execute "resume" callbacks for non-sysdev devices.
  * @state: PM transition of the system being carried out.
@@ -1006,16 +1008,25 @@ void dpm_resume(pm_message_t state)
 	pm_transition = state;
 	async_error = 0;
 
+	/*
+	 * Trigger the resume of "async" devices upfront so they don't have to
+	 * wait for the "non-async" ones they don't depend on.
+	 */
+	list_for_each_entry(dev, &dpm_suspended_list, power.entry)
+		dpm_async_fn(dev, async_resume);
+
 	while (!list_empty(&dpm_suspended_list)) {
 		dev = to_device(dpm_suspended_list.next);
 
 		get_device(dev);
 
-		mutex_unlock(&dpm_list_mtx);
+		if (!dev->power.async_in_progress) {
+			mutex_unlock(&dpm_list_mtx);
 
-		device_resume(dev);
+			device_resume(dev, state, false);
 
-		mutex_lock(&dpm_list_mtx);
+			mutex_lock(&dpm_list_mtx);
+		}
 
 		if (!list_empty(&dev->power.entry))
 			list_move_tail(&dev->power.entry, &dpm_prepared_list);
diff --git a/include/linux/pm.h b/include/linux/pm.h
index 93cd34f00822..bfc441099d8e 100644
--- a/include/linux/pm.h
+++ b/include/linux/pm.h
@@ -653,6 +653,7 @@ struct dev_pm_info {
 	bool			wakeup_path:1;
 	bool			syscore:1;
 	bool			no_pm_callbacks:1;	/* Owned by the PM core */
+	bool			async_in_progress:1;	/* Owned by the PM core */
 	unsigned int		must_resume:1;	/* Owned by the PM core */
 	unsigned int		may_skip_resume:1;	/* Set by subsystems */
 #else
-- 
2.18.0



From yenchia.chen at mediatek.com  Mon Sep  2 02:04:11 2024
From: yenchia.chen at mediatek.com (Yenchia Chen)
Date: Mon, 2 Sep 2024 17:04:11 +0800
Subject: [PATCH 5.15 v2] PM: sleep: Restore asynchronous device resume optimization
In-Reply-To: <2024090250-reliably-ecard-3b58@gregkh>
References: <2024090250-reliably-ecard-3b58@gregkh>
Message-ID: <20240902090413.15942-1-yenchia.chen@mediatek.com>

From: "Rafael J. Wysocki" <rafael.j.wysocki at intel.com>

commit 3e999770ac1c7c31a70685dd5b88e89473509e9c upstream.

Before commit 7839d0078e0d ("PM: sleep: Fix possible deadlocks in core
system-wide PM code"), the resume of devices that were allowed to resume
asynchronously was scheduled before starting the resume of the other
devices, so the former did not have to wait for the latter unless
functional dependencies were present.

Commit 7839d0078e0d removed that optimization in order to address a
correctness issue, but it can be restored with the help of a new device
power management flag, so do that now.

Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki at intel.com>
Reviewed-by: Stanislaw Gruszka <stanislaw.gruszka at linux.intel.com>
Signed-off-by: Yenchia Chen <yenchia.chen at mediatek.com>
---
 drivers/base/power/main.c | 117 +++++++++++++++++++++-----------------
 include/linux/pm.h        |   1 +
 2 files changed, 65 insertions(+), 53 deletions(-)

diff --git a/drivers/base/power/main.c b/drivers/base/power/main.c
index 185ea0d93a5e..01591c105511 100644
--- a/drivers/base/power/main.c
+++ b/drivers/base/power/main.c
@@ -580,7 +580,7 @@ bool dev_pm_skip_resume(struct device *dev)
 }
 
 /**
- * __device_resume_noirq - Execute a "noirq resume" callback for given device.
+ * device_resume_noirq - Execute a "noirq resume" callback for given device.
  * @dev: Device to handle.
  * @state: PM transition of the system being carried out.
  * @async: If true, the device is being resumed asynchronously.
@@ -588,7 +588,7 @@ bool dev_pm_skip_resume(struct device *dev)
  * The driver of @dev will not receive interrupts while this function is being
  * executed.
  */
-static void __device_resume_noirq(struct device *dev, pm_message_t state, bool async)
+static void device_resume_noirq(struct device *dev, pm_message_t state, bool async)
 {
 	pm_callback_t callback = NULL;
 	const char *info = NULL;
@@ -675,16 +675,22 @@ static bool dpm_async_fn(struct device *dev, async_func_t func)
 {
 	reinit_completion(&dev->power.completion);
 
-	if (!is_async(dev))
-		return false;
-
-	get_device(dev);
+	if (is_async(dev)) {
+		dev->power.async_in_progress = true;
 
-	if (async_schedule_dev_nocall(func, dev))
-		return true;
+		get_device(dev);
 
-	put_device(dev);
+		if (async_schedule_dev_nocall(func, dev))
+			return true;
 
+		put_device(dev);
+	}
+	/*
+	 * Because async_schedule_dev_nocall() above has returned false or it
+	 * has not been called at all, func() is not running and it is safe to
+	 * update the async_in_progress flag without extra synchronization.
+	 */
+	dev->power.async_in_progress = false;
 	return false;
 }
 
@@ -692,18 +698,10 @@ static void async_resume_noirq(void *data, async_cookie_t cookie)
 {
 	struct device *dev = data;
 
-	__device_resume_noirq(dev, pm_transition, true);
+	device_resume_noirq(dev, pm_transition, true);
 	put_device(dev);
 }
 
-static void device_resume_noirq(struct device *dev)
-{
-	if (dpm_async_fn(dev, async_resume_noirq))
-		return;
-
-	__device_resume_noirq(dev, pm_transition, false);
-}
-
 static void dpm_noirq_resume_devices(pm_message_t state)
 {
 	struct device *dev;
@@ -713,18 +711,28 @@ static void dpm_noirq_resume_devices(pm_message_t state)
 	mutex_lock(&dpm_list_mtx);
 	pm_transition = state;
 
+	/*
+	 * Trigger the resume of "async" devices upfront so they don't have to
+	 * wait for the "non-async" ones they don't depend on.
+	 */
+	list_for_each_entry(dev, &dpm_noirq_list, power.entry)
+		dpm_async_fn(dev, async_resume_noirq);
+
 	while (!list_empty(&dpm_noirq_list)) {
 		dev = to_device(dpm_noirq_list.next);
-		get_device(dev);
 		list_move_tail(&dev->power.entry, &dpm_late_early_list);
 
-		mutex_unlock(&dpm_list_mtx);
+		if (!dev->power.async_in_progress) {
+			get_device(dev);
 
-		device_resume_noirq(dev);
+			mutex_unlock(&dpm_list_mtx);
 
-		put_device(dev);
+			device_resume_noirq(dev, state, false);
 
-		mutex_lock(&dpm_list_mtx);
+			put_device(dev);
+
+			mutex_lock(&dpm_list_mtx);
+		}
 	}
 	mutex_unlock(&dpm_list_mtx);
 	async_synchronize_full();
@@ -750,14 +758,14 @@ void dpm_resume_noirq(pm_message_t state)
 }
 
 /**
- * __device_resume_early - Execute an "early resume" callback for given device.
+ * device_resume_early - Execute an "early resume" callback for given device.
  * @dev: Device to handle.
  * @state: PM transition of the system being carried out.
  * @async: If true, the device is being resumed asynchronously.
  *
  * Runtime PM is disabled for @dev while this function is being executed.
  */
-static void __device_resume_early(struct device *dev, pm_message_t state, bool async)
+static void device_resume_early(struct device *dev, pm_message_t state, bool async)
 {
 	pm_callback_t callback = NULL;
 	const char *info = NULL;
@@ -823,18 +831,10 @@ static void async_resume_early(void *data, async_cookie_t cookie)
 {
 	struct device *dev = data;
 
-	__device_resume_early(dev, pm_transition, true);
+	device_resume_early(dev, pm_transition, true);
 	put_device(dev);
 }
 
-static void device_resume_early(struct device *dev)
-{
-	if (dpm_async_fn(dev, async_resume_early))
-		return;
-
-	__device_resume_early(dev, pm_transition, false);
-}
-
 /**
  * dpm_resume_early - Execute "early resume" callbacks for all devices.
  * @state: PM transition of the system being carried out.
@@ -848,18 +848,28 @@ void dpm_resume_early(pm_message_t state)
 	mutex_lock(&dpm_list_mtx);
 	pm_transition = state;
 
+	/*
+	 * Trigger the resume of "async" devices upfront so they don't have to
+	 * wait for the "non-async" ones they don't depend on.
+	 */
+	list_for_each_entry(dev, &dpm_late_early_list, power.entry)
+		dpm_async_fn(dev, async_resume_early);
+
 	while (!list_empty(&dpm_late_early_list)) {
 		dev = to_device(dpm_late_early_list.next);
-		get_device(dev);
 		list_move_tail(&dev->power.entry, &dpm_suspended_list);
 
-		mutex_unlock(&dpm_list_mtx);
+		if (!dev->power.async_in_progress) {
+			get_device(dev);
 
-		device_resume_early(dev);
+			mutex_unlock(&dpm_list_mtx);
 
-		put_device(dev);
+			device_resume_early(dev, state, false);
 
-		mutex_lock(&dpm_list_mtx);
+			put_device(dev);
+
+			mutex_lock(&dpm_list_mtx);
+		}
 	}
 	mutex_unlock(&dpm_list_mtx);
 	async_synchronize_full();
@@ -879,12 +889,12 @@ void dpm_resume_start(pm_message_t state)
 EXPORT_SYMBOL_GPL(dpm_resume_start);
 
 /**
- * __device_resume - Execute "resume" callbacks for given device.
+ * device_resume - Execute "resume" callbacks for given device.
  * @dev: Device to handle.
  * @state: PM transition of the system being carried out.
  * @async: If true, the device is being resumed asynchronously.
  */
-static void __device_resume(struct device *dev, pm_message_t state, bool async)
+static void device_resume(struct device *dev, pm_message_t state, bool async)
 {
 	pm_callback_t callback = NULL;
 	const char *info = NULL;
@@ -978,18 +988,10 @@ static void async_resume(void *data, async_cookie_t cookie)
 {
 	struct device *dev = data;
 
-	__device_resume(dev, pm_transition, true);
+	device_resume(dev, pm_transition, true);
 	put_device(dev);
 }
 
-static void device_resume(struct device *dev)
-{
-	if (dpm_async_fn(dev, async_resume))
-		return;
-
-	__device_resume(dev, pm_transition, false);
-}
-
 /**
  * dpm_resume - Execute "resume" callbacks for non-sysdev devices.
  * @state: PM transition of the system being carried out.
@@ -1009,16 +1011,25 @@ void dpm_resume(pm_message_t state)
 	pm_transition = state;
 	async_error = 0;
 
+	/*
+	 * Trigger the resume of "async" devices upfront so they don't have to
+	 * wait for the "non-async" ones they don't depend on.
+	 */
+	list_for_each_entry(dev, &dpm_suspended_list, power.entry)
+		dpm_async_fn(dev, async_resume);
+
 	while (!list_empty(&dpm_suspended_list)) {
 		dev = to_device(dpm_suspended_list.next);
 
 		get_device(dev);
 
-		mutex_unlock(&dpm_list_mtx);
+		if (!dev->power.async_in_progress) {
+			mutex_unlock(&dpm_list_mtx);
 
-		device_resume(dev);
+			device_resume(dev, state, false);
 
-		mutex_lock(&dpm_list_mtx);
+			mutex_lock(&dpm_list_mtx);
+		}
 
 		if (!list_empty(&dev->power.entry))
 			list_move_tail(&dev->power.entry, &dpm_prepared_list);
diff --git a/include/linux/pm.h b/include/linux/pm.h
index d1c19f5b1380..8f46e9f01929 100644
--- a/include/linux/pm.h
+++ b/include/linux/pm.h
@@ -606,6 +606,7 @@ struct dev_pm_info {
 	bool			wakeup_path:1;
 	bool			syscore:1;
 	bool			no_pm_callbacks:1;	/* Owned by the PM core */
+	bool			async_in_progress:1;	/* Owned by the PM core */
 	unsigned int		must_resume:1;	/* Owned by the PM core */
 	unsigned int		may_skip_resume:1;	/* Set by subsystems */
 #else
-- 
2.18.0



From yenchia.chen at mediatek.com  Mon Sep  2 02:32:47 2024
From: yenchia.chen at mediatek.com (Yenchia Chen)
Date: Mon, 2 Sep 2024 17:32:47 +0800
Subject: [PATCH 6.6 0/1] pm, restore async device resume optimization
Message-ID: <20240902093249.17275-1-yenchia.chen@mediatek.com>

We have met a deadlock issue on our device which use 5.15.y when resuming.
After applying this patch which is picked from mainline, issue solved.
Backport to 6.6.y also.

Rafael J. Wysocki (1):
  PM: sleep: Restore asynchronous device resume optimization

 drivers/base/power/main.c | 117 +++++++++++++++++++++-----------------
 include/linux/pm.h        |   1 +
 2 files changed, 65 insertions(+), 53 deletions(-)

-- 
2.18.0



From yenchia.chen at mediatek.com  Mon Sep  2 02:32:48 2024
From: yenchia.chen at mediatek.com (Yenchia Chen)
Date: Mon, 2 Sep 2024 17:32:48 +0800
Subject: [PATCH 6.6 1/1] PM: sleep: Restore asynchronous device resume optimization
In-Reply-To: <20240902093249.17275-1-yenchia.chen@mediatek.com>
References: <20240902093249.17275-1-yenchia.chen@mediatek.com>
Message-ID: <20240902093249.17275-2-yenchia.chen@mediatek.com>

From: "Rafael J. Wysocki" <rafael.j.wysocki at intel.com>

commit 3e999770ac1c7c31a70685dd5b88e89473509e9c upstream.

Before commit 7839d0078e0d ("PM: sleep: Fix possible deadlocks in core
system-wide PM code"), the resume of devices that were allowed to resume
asynchronously was scheduled before starting the resume of the other
devices, so the former did not have to wait for the latter unless
functional dependencies were present.

Commit 7839d0078e0d removed that optimization in order to address a
correctness issue, but it can be restored with the help of a new device
power management flag, so do that now.

Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki at intel.com>
Reviewed-by: Stanislaw Gruszka <stanislaw.gruszka at linux.intel.com>
Signed-off-by: Yenchia Chen <yenchia.chen at mediatek.com>
---
 drivers/base/power/main.c | 117 +++++++++++++++++++++-----------------
 include/linux/pm.h        |   1 +
 2 files changed, 65 insertions(+), 53 deletions(-)

diff --git a/drivers/base/power/main.c b/drivers/base/power/main.c
index 9c5a5f4dba5a..fadcd0379dc2 100644
--- a/drivers/base/power/main.c
+++ b/drivers/base/power/main.c
@@ -579,7 +579,7 @@ bool dev_pm_skip_resume(struct device *dev)
 }
 
 /**
- * __device_resume_noirq - Execute a "noirq resume" callback for given device.
+ * device_resume_noirq - Execute a "noirq resume" callback for given device.
  * @dev: Device to handle.
  * @state: PM transition of the system being carried out.
  * @async: If true, the device is being resumed asynchronously.
@@ -587,7 +587,7 @@ bool dev_pm_skip_resume(struct device *dev)
  * The driver of @dev will not receive interrupts while this function is being
  * executed.
  */
-static void __device_resume_noirq(struct device *dev, pm_message_t state, bool async)
+static void device_resume_noirq(struct device *dev, pm_message_t state, bool async)
 {
 	pm_callback_t callback = NULL;
 	const char *info = NULL;
@@ -674,16 +674,22 @@ static bool dpm_async_fn(struct device *dev, async_func_t func)
 {
 	reinit_completion(&dev->power.completion);
 
-	if (!is_async(dev))
-		return false;
-
-	get_device(dev);
+	if (is_async(dev)) {
+		dev->power.async_in_progress = true;
 
-	if (async_schedule_dev_nocall(func, dev))
-		return true;
+		get_device(dev);
 
-	put_device(dev);
+		if (async_schedule_dev_nocall(func, dev))
+			return true;
 
+		put_device(dev);
+	}
+	/*
+	 * Because async_schedule_dev_nocall() above has returned false or it
+	 * has not been called at all, func() is not running and it is safe to
+	 * update the async_in_progress flag without extra synchronization.
+	 */
+	dev->power.async_in_progress = false;
 	return false;
 }
 
@@ -691,18 +697,10 @@ static void async_resume_noirq(void *data, async_cookie_t cookie)
 {
 	struct device *dev = data;
 
-	__device_resume_noirq(dev, pm_transition, true);
+	device_resume_noirq(dev, pm_transition, true);
 	put_device(dev);
 }
 
-static void device_resume_noirq(struct device *dev)
-{
-	if (dpm_async_fn(dev, async_resume_noirq))
-		return;
-
-	__device_resume_noirq(dev, pm_transition, false);
-}
-
 static void dpm_noirq_resume_devices(pm_message_t state)
 {
 	struct device *dev;
@@ -712,18 +710,28 @@ static void dpm_noirq_resume_devices(pm_message_t state)
 	mutex_lock(&dpm_list_mtx);
 	pm_transition = state;
 
+	/*
+	 * Trigger the resume of "async" devices upfront so they don't have to
+	 * wait for the "non-async" ones they don't depend on.
+	 */
+	list_for_each_entry(dev, &dpm_noirq_list, power.entry)
+		dpm_async_fn(dev, async_resume_noirq);
+
 	while (!list_empty(&dpm_noirq_list)) {
 		dev = to_device(dpm_noirq_list.next);
-		get_device(dev);
 		list_move_tail(&dev->power.entry, &dpm_late_early_list);
 
-		mutex_unlock(&dpm_list_mtx);
+		if (!dev->power.async_in_progress) {
+			get_device(dev);
 
-		device_resume_noirq(dev);
+			mutex_unlock(&dpm_list_mtx);
 
-		put_device(dev);
+			device_resume_noirq(dev, state, false);
 
-		mutex_lock(&dpm_list_mtx);
+			put_device(dev);
+
+			mutex_lock(&dpm_list_mtx);
+		}
 	}
 	mutex_unlock(&dpm_list_mtx);
 	async_synchronize_full();
@@ -747,14 +755,14 @@ void dpm_resume_noirq(pm_message_t state)
 }
 
 /**
- * __device_resume_early - Execute an "early resume" callback for given device.
+ * device_resume_early - Execute an "early resume" callback for given device.
  * @dev: Device to handle.
  * @state: PM transition of the system being carried out.
  * @async: If true, the device is being resumed asynchronously.
  *
  * Runtime PM is disabled for @dev while this function is being executed.
  */
-static void __device_resume_early(struct device *dev, pm_message_t state, bool async)
+static void device_resume_early(struct device *dev, pm_message_t state, bool async)
 {
 	pm_callback_t callback = NULL;
 	const char *info = NULL;
@@ -820,18 +828,10 @@ static void async_resume_early(void *data, async_cookie_t cookie)
 {
 	struct device *dev = data;
 
-	__device_resume_early(dev, pm_transition, true);
+	device_resume_early(dev, pm_transition, true);
 	put_device(dev);
 }
 
-static void device_resume_early(struct device *dev)
-{
-	if (dpm_async_fn(dev, async_resume_early))
-		return;
-
-	__device_resume_early(dev, pm_transition, false);
-}
-
 /**
  * dpm_resume_early - Execute "early resume" callbacks for all devices.
  * @state: PM transition of the system being carried out.
@@ -845,18 +845,28 @@ void dpm_resume_early(pm_message_t state)
 	mutex_lock(&dpm_list_mtx);
 	pm_transition = state;
 
+	/*
+	 * Trigger the resume of "async" devices upfront so they don't have to
+	 * wait for the "non-async" ones they don't depend on.
+	 */
+	list_for_each_entry(dev, &dpm_late_early_list, power.entry)
+		dpm_async_fn(dev, async_resume_early);
+
 	while (!list_empty(&dpm_late_early_list)) {
 		dev = to_device(dpm_late_early_list.next);
-		get_device(dev);
 		list_move_tail(&dev->power.entry, &dpm_suspended_list);
 
-		mutex_unlock(&dpm_list_mtx);
+		if (!dev->power.async_in_progress) {
+			get_device(dev);
 
-		device_resume_early(dev);
+			mutex_unlock(&dpm_list_mtx);
 
-		put_device(dev);
+			device_resume_early(dev, state, false);
 
-		mutex_lock(&dpm_list_mtx);
+			put_device(dev);
+
+			mutex_lock(&dpm_list_mtx);
+		}
 	}
 	mutex_unlock(&dpm_list_mtx);
 	async_synchronize_full();
@@ -876,12 +886,12 @@ void dpm_resume_start(pm_message_t state)
 EXPORT_SYMBOL_GPL(dpm_resume_start);
 
 /**
- * __device_resume - Execute "resume" callbacks for given device.
+ * device_resume - Execute "resume" callbacks for given device.
  * @dev: Device to handle.
  * @state: PM transition of the system being carried out.
  * @async: If true, the device is being resumed asynchronously.
  */
-static void __device_resume(struct device *dev, pm_message_t state, bool async)
+static void device_resume(struct device *dev, pm_message_t state, bool async)
 {
 	pm_callback_t callback = NULL;
 	const char *info = NULL;
@@ -975,18 +985,10 @@ static void async_resume(void *data, async_cookie_t cookie)
 {
 	struct device *dev = data;
 
-	__device_resume(dev, pm_transition, true);
+	device_resume(dev, pm_transition, true);
 	put_device(dev);
 }
 
-static void device_resume(struct device *dev)
-{
-	if (dpm_async_fn(dev, async_resume))
-		return;
-
-	__device_resume(dev, pm_transition, false);
-}
-
 /**
  * dpm_resume - Execute "resume" callbacks for non-sysdev devices.
  * @state: PM transition of the system being carried out.
@@ -1006,16 +1008,25 @@ void dpm_resume(pm_message_t state)
 	pm_transition = state;
 	async_error = 0;
 
+	/*
+	 * Trigger the resume of "async" devices upfront so they don't have to
+	 * wait for the "non-async" ones they don't depend on.
+	 */
+	list_for_each_entry(dev, &dpm_suspended_list, power.entry)
+		dpm_async_fn(dev, async_resume);
+
 	while (!list_empty(&dpm_suspended_list)) {
 		dev = to_device(dpm_suspended_list.next);
 
 		get_device(dev);
 
-		mutex_unlock(&dpm_list_mtx);
+		if (!dev->power.async_in_progress) {
+			mutex_unlock(&dpm_list_mtx);
 
-		device_resume(dev);
+			device_resume(dev, state, false);
 
-		mutex_lock(&dpm_list_mtx);
+			mutex_lock(&dpm_list_mtx);
+		}
 
 		if (!list_empty(&dev->power.entry))
 			list_move_tail(&dev->power.entry, &dpm_prepared_list);
diff --git a/include/linux/pm.h b/include/linux/pm.h
index 629c1633bbd0..943b553720f8 100644
--- a/include/linux/pm.h
+++ b/include/linux/pm.h
@@ -681,6 +681,7 @@ struct dev_pm_info {
 	bool			wakeup_path:1;
 	bool			syscore:1;
 	bool			no_pm_callbacks:1;	/* Owned by the PM core */
+	bool			async_in_progress:1;	/* Owned by the PM core */
 	unsigned int		must_resume:1;	/* Owned by the PM core */
 	unsigned int		may_skip_resume:1;	/* Set by subsystems */
 #else
-- 
2.18.0



From matthias.bgg at gmail.com  Mon Sep  2 04:12:04 2024
From: matthias.bgg at gmail.com (Matthias Brugger)
Date: Mon, 2 Sep 2024 13:12:04 +0200
Subject: [PATCH -next] pmdomain: mediatek: make use of
 dev_err_cast_probe()
In-Reply-To: <20240828121230.3696315-1-lihongbo22@huawei.com>
References: <20240828121230.3696315-1-lihongbo22@huawei.com>
Message-ID: <0d8c7614-809a-4bf1-b91d-4517e888e15d@gmail.com>



On 28/08/2024 14:12, Hongbo Li wrote:
> Using dev_err_cast_probe() to simplify the code.
> 
> Signed-off-by: Hongbo Li <lihongbo22 at huawei.com>

Reviewed-by: Matthias Brugger <matthias.bgg at gmail.com>

> ---
>   drivers/pmdomain/mediatek/mtk-pm-domains.c | 6 ++----
>   1 file changed, 2 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/pmdomain/mediatek/mtk-pm-domains.c b/drivers/pmdomain/mediatek/mtk-pm-domains.c
> index e274e3315fe7..88406e9ac63c 100644
> --- a/drivers/pmdomain/mediatek/mtk-pm-domains.c
> +++ b/drivers/pmdomain/mediatek/mtk-pm-domains.c
> @@ -398,12 +398,10 @@ generic_pm_domain *scpsys_add_one_domain(struct scpsys *scpsys, struct device_no
>   		scpsys->dev->of_node = node;
>   		pd->supply = devm_regulator_get(scpsys->dev, "domain");
>   		scpsys->dev->of_node = root_node;
> -		if (IS_ERR(pd->supply)) {
> -			dev_err_probe(scpsys->dev, PTR_ERR(pd->supply),
> +		if (IS_ERR(pd->supply))
> +			return dev_err_cast_probe(scpsys->dev, pd->supply,
>   				      "%pOF: failed to get power supply.\n",
>   				      node);
> -			return ERR_CAST(pd->supply);
> -		}
>   	}
>   
>   	pd->infracfg = syscon_regmap_lookup_by_phandle_optional(node, "mediatek,infracfg");


From liankun.yang at mediatek.com  Mon Sep  2 06:36:35 2024
From: liankun.yang at mediatek.com (Liankun Yang)
Date: Mon, 2 Sep 2024 21:36:35 +0800
Subject: [PATCH v2 1/1] drm/mediatek: Fix get efuse issue for MT8188 DPTX
Message-ID: <20240902133736.16461-1-liankun.yang@mediatek.com>

Update efuse data for MT8188 displayport.

The DP monitor can not display when DUT connected to USB-c to DP dongle.
Analysis view is invalid DP efuse data.

Fixes: 350c3fe907fb ("drm/mediatek: dp: Add support MT8188 dp/edp function")

Changes in V2:
- Add Fixes tag.
- Update the commit title.
- Update the commit description.
Per suggestion from the previous thread:
https://patchwork.kernel.org/project/linux-mediatek/patch/
20240510061716.31103-1-liankun.yang at mediatek.com/

Signed-off-by: Liankun Yang <liankun.yang at mediatek.com>
---
 drivers/gpu/drm/mediatek/mtk_dp.c | 85 ++++++++++++++++++++++++++++++-
 1 file changed, 84 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/mediatek/mtk_dp.c b/drivers/gpu/drm/mediatek/mtk_dp.c
index d8796a904eca..f2bee617f063 100644
--- a/drivers/gpu/drm/mediatek/mtk_dp.c
+++ b/drivers/gpu/drm/mediatek/mtk_dp.c
@@ -145,6 +145,89 @@ struct mtk_dp_data {
 	u16 audio_m_div2_bit;
 };
 
+static const struct mtk_dp_efuse_fmt mt8188_dp_efuse_fmt[MTK_DP_CAL_MAX] = {
+	[MTK_DP_CAL_GLB_BIAS_TRIM] = {
+		.idx = 0,
+		.shift = 10,
+		.mask = 0x1f,
+		.min_val = 1,
+		.max_val = 0x1e,
+		.default_val = 0xf,
+	},
+	[MTK_DP_CAL_CLKTX_IMPSE] = {
+		.idx = 0,
+		.shift = 15,
+		.mask = 0xf,
+		.min_val = 1,
+		.max_val = 0xe,
+		.default_val = 0x8,
+	},
+	[MTK_DP_CAL_LN_TX_IMPSEL_PMOS_0] = {
+		.idx = 1,
+		.shift = 0,
+		.mask = 0xf,
+		.min_val = 1,
+		.max_val = 0xe,
+		.default_val = 0x8,
+	},
+	[MTK_DP_CAL_LN_TX_IMPSEL_PMOS_1] = {
+		.idx = 1,
+		.shift = 8,
+		.mask = 0xf,
+		.min_val = 1,
+		.max_val = 0xe,
+		.default_val = 0x8,
+	},
+	[MTK_DP_CAL_LN_TX_IMPSEL_PMOS_2] = {
+		.idx = 1,
+		.shift = 16,
+		.mask = 0xf,
+		.min_val = 1,
+		.max_val = 0xe,
+		.default_val = 0x8,
+	},
+	[MTK_DP_CAL_LN_TX_IMPSEL_PMOS_3] = {
+		.idx = 1,
+		.shift = 24,
+		.mask = 0xf,
+		.min_val = 1,
+		.max_val = 0xe,
+		.default_val = 0x8,
+	},
+	[MTK_DP_CAL_LN_TX_IMPSEL_NMOS_0] = {
+		.idx = 1,
+		.shift = 4,
+		.mask = 0xf,
+		.min_val = 1,
+		.max_val = 0xe,
+		.default_val = 0x8,
+	},
+	[MTK_DP_CAL_LN_TX_IMPSEL_NMOS_1] = {
+		.idx = 1,
+		.shift = 12,
+		.mask = 0xf,
+		.min_val = 1,
+		.max_val = 0xe,
+		.default_val = 0x8,
+	},
+	[MTK_DP_CAL_LN_TX_IMPSEL_NMOS_2] = {
+		.idx = 1,
+		.shift = 20,
+		.mask = 0xf,
+		.min_val = 1,
+		.max_val = 0xe,
+		.default_val = 0x8,
+	},
+	[MTK_DP_CAL_LN_TX_IMPSEL_NMOS_3] = {
+		.idx = 1,
+		.shift = 28,
+		.mask = 0xf,
+		.min_val = 1,
+		.max_val = 0xe,
+		.default_val = 0x8,
+	},
+};
+
 static const struct mtk_dp_efuse_fmt mt8195_edp_efuse_fmt[MTK_DP_CAL_MAX] = {
 	[MTK_DP_CAL_GLB_BIAS_TRIM] = {
 		.idx = 3,
@@ -2771,7 +2854,7 @@ static SIMPLE_DEV_PM_OPS(mtk_dp_pm_ops, mtk_dp_suspend, mtk_dp_resume);
 static const struct mtk_dp_data mt8188_dp_data = {
 	.bridge_type = DRM_MODE_CONNECTOR_DisplayPort,
 	.smc_cmd = MTK_DP_SIP_ATF_VIDEO_UNMUTE,
-	.efuse_fmt = mt8195_dp_efuse_fmt,
+	.efuse_fmt = mt8188_dp_efuse_fmt,
 	.audio_supported = true,
 	.audio_pkt_in_hblank_area = true,
 	.audio_m_div2_bit = MT8188_AUDIO_M_CODE_MULT_DIV_SEL_DP_ENC0_P0_DIV_2,
-- 
2.45.2



From colin.i.king at gmail.com  Mon Sep  2 07:07:58 2024
From: colin.i.king at gmail.com (Colin Ian King)
Date: Mon,  2 Sep 2024 15:07:58 +0100
Subject: [PATCH][next] media: mediatek: vcodec: Remove trailing space after \n newline
Message-ID: <20240902140758.308202-1-colin.i.king@gmail.com>

There is a extraneous space after a newline in a mtk_venc_debug message.
Remove it.

Signed-off-by: Colin Ian King <colin.i.king at gmail.com>
---
 .../media/platform/mediatek/vcodec/encoder/venc/venc_h264_if.c  | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/media/platform/mediatek/vcodec/encoder/venc/venc_h264_if.c b/drivers/media/platform/mediatek/vcodec/encoder/venc/venc_h264_if.c
index f8145998fcaf..59e56b81d5e0 100644
--- a/drivers/media/platform/mediatek/vcodec/encoder/venc/venc_h264_if.c
+++ b/drivers/media/platform/mediatek/vcodec/encoder/venc/venc_h264_if.c
@@ -515,7 +515,7 @@ static int h264_encode_frame(struct venc_h264_inst *inst,
 	struct venc_frame_info frame_info;
 	struct mtk_vcodec_enc_ctx *ctx = inst->ctx;
 
-	mtk_venc_debug(ctx, "frm_cnt = %d\n ", inst->frm_cnt);
+	mtk_venc_debug(ctx, "frm_cnt = %d\n", inst->frm_cnt);
 
 	if (MTK_ENC_IOVA_IS_34BIT(ctx)) {
 		gop_size = inst->vsi_34->config.gop_size;
-- 
2.39.2



From matthias.bgg at gmail.com  Mon Sep  2 08:05:00 2024
From: matthias.bgg at gmail.com (Matthias Brugger)
Date: Mon, 2 Sep 2024 17:05:00 +0200
Subject: [PATCH v2 1/1] drm/mediatek: Fix get efuse issue for MT8188 DPTX
In-Reply-To: <20240902133736.16461-1-liankun.yang@mediatek.com>
References: <20240902133736.16461-1-liankun.yang@mediatek.com>
Message-ID: <6cd86103-8ebf-469d-8e68-444fffa56c68@gmail.com>



On 02/09/2024 15:36, Liankun Yang wrote:
> Update efuse data for MT8188 displayport.
> 
> The DP monitor can not display when DUT connected to USB-c to DP dongle.
> Analysis view is invalid DP efuse data.
> 
> Fixes: 350c3fe907fb ("drm/mediatek: dp: Add support MT8188 dp/edp function")
> 
> Changes in V2:
> - Add Fixes tag.
> - Update the commit title.
> - Update the commit description.
> Per suggestion from the previous thread:
> https://patchwork.kernel.org/project/linux-mediatek/patch/
> 20240510061716.31103-1-liankun.yang at mediatek.com/

Changelog should go after '---' below your Signed-off-by, as we don't want that 
in the commit message later.

Reviewed-by: Matthias Brugger <matthias.bgg at gmail.com>

> 
> Signed-off-by: Liankun Yang <liankun.yang at mediatek.com>
> ---
>   drivers/gpu/drm/mediatek/mtk_dp.c | 85 ++++++++++++++++++++++++++++++-
>   1 file changed, 84 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/mediatek/mtk_dp.c b/drivers/gpu/drm/mediatek/mtk_dp.c
> index d8796a904eca..f2bee617f063 100644
> --- a/drivers/gpu/drm/mediatek/mtk_dp.c
> +++ b/drivers/gpu/drm/mediatek/mtk_dp.c
> @@ -145,6 +145,89 @@ struct mtk_dp_data {
>   	u16 audio_m_div2_bit;
>   };
>   
> +static const struct mtk_dp_efuse_fmt mt8188_dp_efuse_fmt[MTK_DP_CAL_MAX] = {
> +	[MTK_DP_CAL_GLB_BIAS_TRIM] = {
> +		.idx = 0,
> +		.shift = 10,
> +		.mask = 0x1f,
> +		.min_val = 1,
> +		.max_val = 0x1e,
> +		.default_val = 0xf,
> +	},
> +	[MTK_DP_CAL_CLKTX_IMPSE] = {
> +		.idx = 0,
> +		.shift = 15,
> +		.mask = 0xf,
> +		.min_val = 1,
> +		.max_val = 0xe,
> +		.default_val = 0x8,
> +	},
> +	[MTK_DP_CAL_LN_TX_IMPSEL_PMOS_0] = {
> +		.idx = 1,
> +		.shift = 0,
> +		.mask = 0xf,
> +		.min_val = 1,
> +		.max_val = 0xe,
> +		.default_val = 0x8,
> +	},
> +	[MTK_DP_CAL_LN_TX_IMPSEL_PMOS_1] = {
> +		.idx = 1,
> +		.shift = 8,
> +		.mask = 0xf,
> +		.min_val = 1,
> +		.max_val = 0xe,
> +		.default_val = 0x8,
> +	},
> +	[MTK_DP_CAL_LN_TX_IMPSEL_PMOS_2] = {
> +		.idx = 1,
> +		.shift = 16,
> +		.mask = 0xf,
> +		.min_val = 1,
> +		.max_val = 0xe,
> +		.default_val = 0x8,
> +	},
> +	[MTK_DP_CAL_LN_TX_IMPSEL_PMOS_3] = {
> +		.idx = 1,
> +		.shift = 24,
> +		.mask = 0xf,
> +		.min_val = 1,
> +		.max_val = 0xe,
> +		.default_val = 0x8,
> +	},
> +	[MTK_DP_CAL_LN_TX_IMPSEL_NMOS_0] = {
> +		.idx = 1,
> +		.shift = 4,
> +		.mask = 0xf,
> +		.min_val = 1,
> +		.max_val = 0xe,
> +		.default_val = 0x8,
> +	},
> +	[MTK_DP_CAL_LN_TX_IMPSEL_NMOS_1] = {
> +		.idx = 1,
> +		.shift = 12,
> +		.mask = 0xf,
> +		.min_val = 1,
> +		.max_val = 0xe,
> +		.default_val = 0x8,
> +	},
> +	[MTK_DP_CAL_LN_TX_IMPSEL_NMOS_2] = {
> +		.idx = 1,
> +		.shift = 20,
> +		.mask = 0xf,
> +		.min_val = 1,
> +		.max_val = 0xe,
> +		.default_val = 0x8,
> +	},
> +	[MTK_DP_CAL_LN_TX_IMPSEL_NMOS_3] = {
> +		.idx = 1,
> +		.shift = 28,
> +		.mask = 0xf,
> +		.min_val = 1,
> +		.max_val = 0xe,
> +		.default_val = 0x8,
> +	},
> +};
> +
>   static const struct mtk_dp_efuse_fmt mt8195_edp_efuse_fmt[MTK_DP_CAL_MAX] = {
>   	[MTK_DP_CAL_GLB_BIAS_TRIM] = {
>   		.idx = 3,
> @@ -2771,7 +2854,7 @@ static SIMPLE_DEV_PM_OPS(mtk_dp_pm_ops, mtk_dp_suspend, mtk_dp_resume);
>   static const struct mtk_dp_data mt8188_dp_data = {
>   	.bridge_type = DRM_MODE_CONNECTOR_DisplayPort,
>   	.smc_cmd = MTK_DP_SIP_ATF_VIDEO_UNMUTE,
> -	.efuse_fmt = mt8195_dp_efuse_fmt,
> +	.efuse_fmt = mt8188_dp_efuse_fmt,
>   	.audio_supported = true,
>   	.audio_pkt_in_hblank_area = true,
>   	.audio_m_div2_bit = MT8188_AUDIO_M_CODE_MULT_DIV_SEL_DP_ENC0_P0_DIV_2,


From matthias.bgg at gmail.com  Mon Sep  2 08:06:37 2024
From: matthias.bgg at gmail.com (Matthias Brugger)
Date: Mon, 2 Sep 2024 17:06:37 +0200
Subject: [PATCH][next] media: mediatek: vcodec: Remove trailing space
 after \n newline
In-Reply-To: <20240902140758.308202-1-colin.i.king@gmail.com>
References: <20240902140758.308202-1-colin.i.king@gmail.com>
Message-ID: <cc3e30c6-3e97-4db8-a978-9c2048bfad0e@gmail.com>



On 02/09/2024 16:07, Colin Ian King wrote:
> There is a extraneous space after a newline in a mtk_venc_debug message.
> Remove it.
> 
> Signed-off-by: Colin Ian King <colin.i.king at gmail.com>

Reviewed-by: Matthias Brugger <matthias.bgg at gmail.com>

> ---
>   .../media/platform/mediatek/vcodec/encoder/venc/venc_h264_if.c  | 2 +-
>   1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/drivers/media/platform/mediatek/vcodec/encoder/venc/venc_h264_if.c b/drivers/media/platform/mediatek/vcodec/encoder/venc/venc_h264_if.c
> index f8145998fcaf..59e56b81d5e0 100644
> --- a/drivers/media/platform/mediatek/vcodec/encoder/venc/venc_h264_if.c
> +++ b/drivers/media/platform/mediatek/vcodec/encoder/venc/venc_h264_if.c
> @@ -515,7 +515,7 @@ static int h264_encode_frame(struct venc_h264_inst *inst,
>   	struct venc_frame_info frame_info;
>   	struct mtk_vcodec_enc_ctx *ctx = inst->ctx;
>   
> -	mtk_venc_debug(ctx, "frm_cnt = %d\n ", inst->frm_cnt);
> +	mtk_venc_debug(ctx, "frm_cnt = %d\n", inst->frm_cnt);
>   
>   	if (MTK_ENC_IOVA_IS_34BIT(ctx)) {
>   		gop_size = inst->vsi_34->config.gop_size;


From matthias.bgg at gmail.com  Mon Sep  2 08:11:09 2024
From: matthias.bgg at gmail.com (Matthias Brugger)
Date: Mon, 2 Sep 2024 17:11:09 +0200
Subject: [PATCH v4 1/3] media: platform: mtk-mdp3: Get fine-grain control
 of cmdq_pkt_finalize()
In-Reply-To: <20240901143259.16849-2-chunkuang.hu@kernel.org>
References: <20240901143259.16849-1-chunkuang.hu@kernel.org>
 <20240901143259.16849-2-chunkuang.hu@kernel.org>
Message-ID: <a47e464c-6a6e-4121-b521-7dec741caa66@gmail.com>



On 01/09/2024 16:32, Chun-Kuang Hu wrote:
> In order to have fine-grained control, use cmdq_pkt_eoc() and
> cmdq_pkt_jump_rel() to replace cmdq_pkt_finalize().
> 
> Signed-off-by: Chun-Kuang Hu <chunkuang.hu at kernel.org>

Reviewed-by: Matthias Brugger <matthias.bgg at gmail.com>

> ---
>   drivers/media/platform/mediatek/mdp3/mtk-mdp3-cmdq.c | 3 ++-
>   drivers/media/platform/mediatek/mdp3/mtk-mdp3-core.c | 2 ++
>   drivers/media/platform/mediatek/mdp3/mtk-mdp3-core.h | 1 +
>   3 files changed, 5 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/media/platform/mediatek/mdp3/mtk-mdp3-cmdq.c b/drivers/media/platform/mediatek/mdp3/mtk-mdp3-cmdq.c
> index ea2ea119dd2a..ef5dade35fd3 100644
> --- a/drivers/media/platform/mediatek/mdp3/mtk-mdp3-cmdq.c
> +++ b/drivers/media/platform/mediatek/mdp3/mtk-mdp3-cmdq.c
> @@ -676,7 +676,8 @@ static struct mdp_cmdq_cmd *mdp_cmdq_prepare(struct mdp_dev *mdp,
>   		dev_err(dev, "mdp_path_config error %d\n", pp_idx);
>   		goto err_free_path;
>   	}
> -	cmdq_pkt_finalize(&cmd->pkt);
> +	cmdq_pkt_eoc(&cmd->pkt);
> +	cmdq_pkt_jump_rel(&cmd->pkt, CMDQ_INST_SIZE, mdp->cmdq_shift_pa[pp_idx]);
>   
>   	for (i = 0; i < num_comp; i++) {
>   		s32 inner_id = MDP_COMP_NONE;
> diff --git a/drivers/media/platform/mediatek/mdp3/mtk-mdp3-core.c b/drivers/media/platform/mediatek/mdp3/mtk-mdp3-core.c
> index 37e7b985d52c..40623c1980bf 100644
> --- a/drivers/media/platform/mediatek/mdp3/mtk-mdp3-core.c
> +++ b/drivers/media/platform/mediatek/mdp3/mtk-mdp3-core.c
> @@ -312,6 +312,8 @@ static int mdp_probe(struct platform_device *pdev)
>   			ret = PTR_ERR(mdp->cmdq_clt[i]);
>   			goto err_mbox_destroy;
>   		}
> +
> +		mdp->cmdq_shift_pa[i] = cmdq_get_shift_pa(mdp->cmdq_clt[i]->chan);
>   	}
>   
>   	init_waitqueue_head(&mdp->callback_wq);
> diff --git a/drivers/media/platform/mediatek/mdp3/mtk-mdp3-core.h b/drivers/media/platform/mediatek/mdp3/mtk-mdp3-core.h
> index 430251f63754..05cade1d098e 100644
> --- a/drivers/media/platform/mediatek/mdp3/mtk-mdp3-core.h
> +++ b/drivers/media/platform/mediatek/mdp3/mtk-mdp3-core.h
> @@ -126,6 +126,7 @@ struct mdp_dev {
>   	u32					id_count;
>   	struct ida				mdp_ida;
>   	struct cmdq_client			*cmdq_clt[MDP_PP_MAX];
> +	u8					cmdq_shift_pa[MDP_PP_MAX];
>   	wait_queue_head_t			callback_wq;
>   
>   	struct v4l2_device			v4l2_dev;


From matthias.bgg at gmail.com  Mon Sep  2 08:31:24 2024
From: matthias.bgg at gmail.com (Matthias Brugger)
Date: Mon, 2 Sep 2024 17:31:24 +0200
Subject: [PATCH v4 2/3] media: platform: mtk-mdp3: Use cmdq_pkt_create()
 and cmdq_pkt_destroy()
In-Reply-To: <20240901143259.16849-3-chunkuang.hu@kernel.org>
References: <20240901143259.16849-1-chunkuang.hu@kernel.org>
 <20240901143259.16849-3-chunkuang.hu@kernel.org>
Message-ID: <1d4e9e86-aaaf-4d19-b89f-6f7207ab72d8@gmail.com>



On 01/09/2024 16:32, Chun-Kuang Hu wrote:
> Use cmdq_pkt_create() and cmdq_pkt_destroy() common function
> instead of implementing mdp3 version.
> 
> Signed-off-by: Chun-Kuang Hu <chunkuang.hu at kernel.org>
> ---
>   .../platform/mediatek/mdp3/mtk-mdp3-cmdq.c    | 46 ++-----------------
>   .../platform/mediatek/mdp3/mtk-mdp3-cmdq.h    |  1 +
>   2 files changed, 6 insertions(+), 41 deletions(-)
> 
> diff --git a/drivers/media/platform/mediatek/mdp3/mtk-mdp3-cmdq.c b/drivers/media/platform/mediatek/mdp3/mtk-mdp3-cmdq.c
> index ef5dade35fd3..740a484c8eb4 100644
> --- a/drivers/media/platform/mediatek/mdp3/mtk-mdp3-cmdq.c
> +++ b/drivers/media/platform/mediatek/mdp3/mtk-mdp3-cmdq.c
> @@ -471,43 +471,6 @@ static int mdp_path_config(struct mdp_dev *mdp, struct mdp_cmdq_cmd *cmd,
>   	return 0;
>   }
>   
> -static int mdp_cmdq_pkt_create(struct cmdq_client *client, struct cmdq_pkt *pkt,
> -			       size_t size)
> -{
> -	struct device *dev;
> -	dma_addr_t dma_addr;
> -
> -	pkt->va_base = kzalloc(size, GFP_KERNEL);
> -	if (!pkt->va_base)
> -		return -ENOMEM;
> -
> -	pkt->buf_size = size;
> -	pkt->cl = (void *)client;

cmdq_pkt_create does not set the callback. Why doesn't that break things?
Same holds for the crtc driver that is already in linux-next.

Regards,
Matthias

> -
> -	dev = client->chan->mbox->dev;
> -	dma_addr = dma_map_single(dev, pkt->va_base, pkt->buf_size,
> -				  DMA_TO_DEVICE);
> -	if (dma_mapping_error(dev, dma_addr)) {
> -		dev_err(dev, "dma map failed, size=%u\n", (u32)(u64)size);
> -		kfree(pkt->va_base);
> -		return -ENOMEM;
> -	}
> -
> -	pkt->pa_base = dma_addr;
> -
> -	return 0;
> -}
> -
> -static void mdp_cmdq_pkt_destroy(struct cmdq_pkt *pkt)
> -{
> -	struct cmdq_client *client = (struct cmdq_client *)pkt->cl;
> -
> -	dma_unmap_single(client->chan->mbox->dev, pkt->pa_base, pkt->buf_size,
> -			 DMA_TO_DEVICE);
> -	kfree(pkt->va_base);
> -	pkt->va_base = NULL;
> -}
> -
>   static void mdp_auto_release_work(struct work_struct *work)
>   {
>   	struct mdp_cmdq_cmd *cmd;
> @@ -538,7 +501,7 @@ static void mdp_auto_release_work(struct work_struct *work)
>   		wake_up(&mdp->callback_wq);
>   	}
>   
> -	mdp_cmdq_pkt_destroy(&cmd->pkt);
> +	cmdq_pkt_destroy(mdp->cmdq_clt[cmd->pp_idx], &cmd->pkt);
>   	kfree(cmd->comps);
>   	cmd->comps = NULL;
>   	kfree(cmd);
> @@ -578,7 +541,7 @@ static void mdp_handle_cmdq_callback(struct mbox_client *cl, void *mssg)
>   		if (refcount_dec_and_test(&mdp->job_count))
>   			wake_up(&mdp->callback_wq);
>   
> -		mdp_cmdq_pkt_destroy(&cmd->pkt);
> +		cmdq_pkt_destroy(mdp->cmdq_clt[cmd->pp_idx], &cmd->pkt);
>   		kfree(cmd->comps);
>   		cmd->comps = NULL;
>   		kfree(cmd);
> @@ -620,7 +583,7 @@ static struct mdp_cmdq_cmd *mdp_cmdq_prepare(struct mdp_dev *mdp,
>   		goto err_uninit;
>   	}
>   
> -	ret = mdp_cmdq_pkt_create(mdp->cmdq_clt[pp_idx], &cmd->pkt, SZ_16K);
> +	ret = cmdq_pkt_create(mdp->cmdq_clt[pp_idx], &cmd->pkt, SZ_16K);
>   	if (ret)
>   		goto err_free_cmd;
>   
> @@ -700,6 +663,7 @@ static struct mdp_cmdq_cmd *mdp_cmdq_prepare(struct mdp_dev *mdp,
>   	cmd->comps = comps;
>   	cmd->num_comps = num_comp;
>   	cmd->mdp_ctx = param->mdp_ctx;
> +	cmd->pp_idx = pp_idx;
>   
>   	kfree(path);
>   	return cmd;
> @@ -711,7 +675,7 @@ static struct mdp_cmdq_cmd *mdp_cmdq_prepare(struct mdp_dev *mdp,
>   err_free_comps:
>   	kfree(comps);
>   err_destroy_pkt:
> -	mdp_cmdq_pkt_destroy(&cmd->pkt);
> +	cmdq_pkt_destroy(mdp->cmdq_clt[pp_idx], &cmd->pkt);
>   err_free_cmd:
>   	kfree(cmd);
>   err_uninit:
> diff --git a/drivers/media/platform/mediatek/mdp3/mtk-mdp3-cmdq.h b/drivers/media/platform/mediatek/mdp3/mtk-mdp3-cmdq.h
> index 53a30ad7e0b0..935ae9825728 100644
> --- a/drivers/media/platform/mediatek/mdp3/mtk-mdp3-cmdq.h
> +++ b/drivers/media/platform/mediatek/mdp3/mtk-mdp3-cmdq.h
> @@ -35,6 +35,7 @@ struct mdp_cmdq_cmd {
>   	struct mdp_comp *comps;
>   	void *mdp_ctx;
>   	u8 num_comps;
> +	u8 pp_idx;
>   };
>   
>   struct mdp_dev;


From matthias.bgg at gmail.com  Mon Sep  2 08:31:52 2024
From: matthias.bgg at gmail.com (Matthias Brugger)
Date: Mon, 2 Sep 2024 17:31:52 +0200
Subject: [PATCH v4 3/3] soc: mediatek: cmdq: Remove cmdq_pkt_finalize()
 helper function
In-Reply-To: <20240901143259.16849-4-chunkuang.hu@kernel.org>
References: <20240901143259.16849-1-chunkuang.hu@kernel.org>
 <20240901143259.16849-4-chunkuang.hu@kernel.org>
Message-ID: <f6566469-36fe-4cf8-b1c1-4a476e5c5645@gmail.com>



On 01/09/2024 16:32, Chun-Kuang Hu wrote:
> In order to have fine-grained control, use cmdq_pkt_eoc() and
> cmdq_pkt_jump_rel() to replace cmdq_pkt_finalize().
> 
> Signed-off-by: Chun-Kuang Hu <chunkuang.hu at kernel.org>

Acked-by: Matthias Brugger <matthias.bgg at gmail.com>

> ---
>   drivers/soc/mediatek/mtk-cmdq-helper.c | 22 ----------------------
>   include/linux/soc/mediatek/mtk-cmdq.h  | 13 -------------
>   2 files changed, 35 deletions(-)
> 
> diff --git a/drivers/soc/mediatek/mtk-cmdq-helper.c b/drivers/soc/mediatek/mtk-cmdq-helper.c
> index a8fccedba83f..2a47dda4dd4a 100644
> --- a/drivers/soc/mediatek/mtk-cmdq-helper.c
> +++ b/drivers/soc/mediatek/mtk-cmdq-helper.c
> @@ -538,27 +538,5 @@ int cmdq_pkt_eoc(struct cmdq_pkt *pkt)
>   }
>   EXPORT_SYMBOL(cmdq_pkt_eoc);
>   
> -int cmdq_pkt_finalize(struct cmdq_pkt *pkt)
> -{
> -	struct cmdq_instruction inst = { {0} };
> -	int err;
> -
> -	/* insert EOC and generate IRQ for each command iteration */
> -	inst.op = CMDQ_CODE_EOC;
> -	inst.value = CMDQ_EOC_IRQ_EN;
> -	err = cmdq_pkt_append_command(pkt, inst);
> -	if (err < 0)
> -		return err;
> -
> -	/* JUMP to end */
> -	inst.op = CMDQ_CODE_JUMP;
> -	inst.value = CMDQ_JUMP_PASS >>
> -		cmdq_get_shift_pa(((struct cmdq_client *)pkt->cl)->chan);
> -	err = cmdq_pkt_append_command(pkt, inst);
> -
> -	return err;
> -}
> -EXPORT_SYMBOL(cmdq_pkt_finalize);
> -
>   MODULE_DESCRIPTION("MediaTek Command Queue (CMDQ) driver");
>   MODULE_LICENSE("GPL v2");
> diff --git a/include/linux/soc/mediatek/mtk-cmdq.h b/include/linux/soc/mediatek/mtk-cmdq.h
> index 5bee6f7fc400..0c3906e8ad19 100644
> --- a/include/linux/soc/mediatek/mtk-cmdq.h
> +++ b/include/linux/soc/mediatek/mtk-cmdq.h
> @@ -391,14 +391,6 @@ int cmdq_pkt_jump_rel(struct cmdq_pkt *pkt, s32 offset, u8 shift_pa);
>    */
>   int cmdq_pkt_eoc(struct cmdq_pkt *pkt);
>   
> -/**
> - * cmdq_pkt_finalize() - Append EOC and jump command to pkt.
> - * @pkt:	the CMDQ packet
> - *
> - * Return: 0 for success; else the error code is returned
> - */
> -int cmdq_pkt_finalize(struct cmdq_pkt *pkt);
> -
>   #else /* IS_ENABLED(CONFIG_MTK_CMDQ) */
>   
>   static inline int cmdq_dev_get_client_reg(struct device *dev,
> @@ -519,11 +511,6 @@ static inline int cmdq_pkt_eoc(struct cmdq_pkt *pkt)
>   	return -EINVAL;
>   }
>   
> -static inline int cmdq_pkt_finalize(struct cmdq_pkt *pkt)
> -{
> -	return -EINVAL;
> -}
> -
>   #endif /* IS_ENABLED(CONFIG_MTK_CMDQ) */
>   
>   #endif	/* __MTK_CMDQ_H__ */


From matthias.bgg at gmail.com  Mon Sep  2 08:35:48 2024
From: matthias.bgg at gmail.com (Matthias Brugger)
Date: Mon, 2 Sep 2024 17:35:48 +0200
Subject: [PATCH v3] soc: mediatek: mtk-mmsys: Simplify with
 dev_err_probe()
In-Reply-To: <20240902053001.930379-1-yanzhen@vivo.com>
References: <20240902053001.930379-1-yanzhen@vivo.com>
Message-ID: <0cd84a80-589c-4706-b798-0d7808488ee2@gmail.com>



On 02/09/2024 07:30, Yan Zhen wrote:
> Use dev_err_probe() to simplify the error path and unify a
> message template.
> 
> Using this helper is totally fine even if err is known to never
> be -EPROBE_DEFER.
> 
> The benefit compared to a normal dev_err() is the standardized format
> of the error code, it being emitted symbolically and the fact that
> the error code is returned which allows more compact error paths.
> 
> Signed-off-by: Yan Zhen <yanzhen at vivo.com>
> ---
> 
> Changes in v3:
> - Modify the message.
> - Add the '\n' at the end of the string.
> 
>   drivers/soc/mediatek/mtk-mmsys.c | 15 ++++++---------
>   1 file changed, 6 insertions(+), 9 deletions(-)
> 
> diff --git a/drivers/soc/mediatek/mtk-mmsys.c b/drivers/soc/mediatek/mtk-mmsys.c
> index 938240714e54..170319163c28 100644
> --- a/drivers/soc/mediatek/mtk-mmsys.c
> +++ b/drivers/soc/mediatek/mtk-mmsys.c
> @@ -397,11 +397,9 @@ static int mtk_mmsys_probe(struct platform_device *pdev)
>   		return -ENOMEM;
>   
>   	mmsys->regs = devm_platform_ioremap_resource(pdev, 0);
> -	if (IS_ERR(mmsys->regs)) {
> -		ret = PTR_ERR(mmsys->regs);
> -		dev_err(dev, "Failed to ioremap mmsys registers: %d\n", ret);
> -		return ret;
> -	}
> +	if (IS_ERR(mmsys->regs))
> +		return dev_err_probe(dev, PTR_ERR(mmsys->regs),
> +				     "Failed to ioremap mmsys registers\n");
>   
>   	mmsys->data = of_device_get_match_data(&pdev->dev);
>   
> @@ -413,10 +411,9 @@ static int mtk_mmsys_probe(struct platform_device *pdev)
>   		mmsys->rcdev.ops = &mtk_mmsys_reset_ops;
>   		mmsys->rcdev.of_node = pdev->dev.of_node;
>   		ret = devm_reset_controller_register(&pdev->dev, &mmsys->rcdev);
> -		if (ret) {
> -			dev_err(&pdev->dev, "Couldn't register mmsys reset controller: %d\n", ret);
> -			return ret;
> -		}
> +		if (ret)
> +			dev_err_probe(&pdev->dev, ret,
> +				      "Couldn't register mmsys reset controller\n");

Your missing return of the error value.

>   	}
>   
>   	/* CMDQ is optional */


From matthias.bgg at gmail.com  Mon Sep  2 08:44:24 2024
From: matthias.bgg at gmail.com (Matthias Brugger)
Date: Mon, 2 Sep 2024 17:44:24 +0200
Subject: [RESEND PATCH v2 2/2] arm64: dts: mediatek: mt8183-pumpkin: add
 HDMI support
In-Reply-To: <20240819120735.1508789-2-treapking@chromium.org>
References: <20240819120735.1508789-1-treapking@chromium.org>
 <20240819120735.1508789-2-treapking@chromium.org>
Message-ID: <434edbf2-da3f-49b2-9ee4-d12e84428d44@gmail.com>



On 19/08/2024 14:05, Pin-yen Lin wrote:
> From: Fabien Parent <fparent at baylibre.com>
> 
> The MT8183 Pumpkin board has a micro-HDMI connector. HDMI support is
> provided by an IT66121 DPI <-> HDMI bridge.
> 
> This commit enables DPI and add the node for the IT66121 bridge.
> 
> Signed-off-by: Fabien Parent <fparent at baylibre.com>
> Signed-off-by: Pin-yen Lin <treapking at chromium.org>
> 

Building DTB fais with:
arch/arm64/boot/dts/mediatek/mt8183-pumpkin.dts:138.27-169.4: ERROR 
(phandle_references): /soc/i2c at 11005000/hdmitx at 4c: Reference to non-existent 
node or label "mt6358_vcn33_wifi_reg"

Please check your code before submitting.

Regards,
Matthias

> ---
> 
> (no changes since v1)
> 
>   .../boot/dts/mediatek/mt8183-pumpkin.dts      | 121 ++++++++++++++++++
>   1 file changed, 121 insertions(+)
> 
> diff --git a/arch/arm64/boot/dts/mediatek/mt8183-pumpkin.dts b/arch/arm64/boot/dts/mediatek/mt8183-pumpkin.dts
> index 1aa668c3ccf9..ecc237355b56 100644
> --- a/arch/arm64/boot/dts/mediatek/mt8183-pumpkin.dts
> +++ b/arch/arm64/boot/dts/mediatek/mt8183-pumpkin.dts
> @@ -63,6 +63,18 @@ thermistor {
>   		pulldown-ohm = <0>;
>   		io-channels = <&auxadc 0>;
>   	};
> +
> +	connector {
> +		compatible = "hdmi-connector";
> +		label = "hdmi";
> +		type = "d";
> +
> +		port {
> +			hdmi_connector_in: endpoint {
> +				remote-endpoint = <&hdmi_connector_out>;
> +			};
> +		};
> +	};
>   };
>   
>   &auxadc {
> @@ -120,6 +132,41 @@ &i2c6 {
>   	pinctrl-0 = <&i2c6_pins>;
>   	status = "okay";
>   	clock-frequency = <100000>;
> +	#address-cells = <1>;
> +	#size-cells = <0>;
> +
> +	it66121hdmitx: hdmitx at 4c {
> +		compatible = "ite,it66121";
> +		pinctrl-names = "default";
> +		pinctrl-0 = <&ite_pins>;
> +		vcn33-supply = <&mt6358_vcn33_wifi_reg>;
> +		vcn18-supply = <&mt6358_vcn18_reg>;
> +		vrf12-supply = <&mt6358_vrf12_reg>;
> +		reset-gpios = <&pio 160 GPIO_ACTIVE_LOW>;
> +		interrupt-parent = <&pio>;
> +		interrupts = <4 IRQ_TYPE_LEVEL_LOW>;
> +		reg = <0x4c>;
> +
> +		ports {
> +			#address-cells = <1>;
> +			#size-cells = <0>;
> +
> +			port at 0 {
> +				reg = <0>;
> +				it66121_in: endpoint {
> +					bus-width = <12>;
> +					remote-endpoint = <&dpi_out>;
> +				};
> +			};
> +
> +			port at 1 {
> +				reg = <1>;
> +				hdmi_connector_out: endpoint {
> +					remote-endpoint = <&hdmi_connector_in>;
> +				};
> +			};
> +		};
> +	};
>   };
>   
>   &keyboard {
> @@ -362,6 +409,67 @@ pins_clk {
>   			input-enable;
>   		};
>   	};
> +
> +	ite_pins: ite-pins {
> +		pins-irq {
> +			pinmux = <PINMUX_GPIO4__FUNC_GPIO4>;
> +			input-enable;
> +			bias-pull-up;
> +		};
> +
> +		pins-rst {
> +			pinmux = <PINMUX_GPIO160__FUNC_GPIO160>;
> +			output-high;
> +		};
> +	};
> +
> +	dpi_func_pins: dpi-func-pins {
> +		pins-dpi {
> +			pinmux = <PINMUX_GPIO12__FUNC_I2S5_BCK>,
> +				 <PINMUX_GPIO46__FUNC_I2S5_LRCK>,
> +				 <PINMUX_GPIO47__FUNC_I2S5_DO>,
> +				 <PINMUX_GPIO13__FUNC_DBPI_D0>,
> +				 <PINMUX_GPIO14__FUNC_DBPI_D1>,
> +				 <PINMUX_GPIO15__FUNC_DBPI_D2>,
> +				 <PINMUX_GPIO16__FUNC_DBPI_D3>,
> +				 <PINMUX_GPIO17__FUNC_DBPI_D4>,
> +				 <PINMUX_GPIO18__FUNC_DBPI_D5>,
> +				 <PINMUX_GPIO19__FUNC_DBPI_D6>,
> +				 <PINMUX_GPIO20__FUNC_DBPI_D7>,
> +				 <PINMUX_GPIO21__FUNC_DBPI_D8>,
> +				 <PINMUX_GPIO22__FUNC_DBPI_D9>,
> +				 <PINMUX_GPIO23__FUNC_DBPI_D10>,
> +				 <PINMUX_GPIO24__FUNC_DBPI_D11>,
> +				 <PINMUX_GPIO25__FUNC_DBPI_HSYNC>,
> +				 <PINMUX_GPIO26__FUNC_DBPI_VSYNC>,
> +				 <PINMUX_GPIO27__FUNC_DBPI_DE>,
> +				 <PINMUX_GPIO28__FUNC_DBPI_CK>;
> +		};
> +	};
> +
> +	dpi_idle_pins: dpi-idle-pins {
> +		pins-idle {
> +			pinmux = <PINMUX_GPIO12__FUNC_GPIO12>,
> +				 <PINMUX_GPIO46__FUNC_GPIO46>,
> +				 <PINMUX_GPIO47__FUNC_GPIO47>,
> +				 <PINMUX_GPIO13__FUNC_GPIO13>,
> +				 <PINMUX_GPIO14__FUNC_GPIO14>,
> +				 <PINMUX_GPIO15__FUNC_GPIO15>,
> +				 <PINMUX_GPIO16__FUNC_GPIO16>,
> +				 <PINMUX_GPIO17__FUNC_GPIO17>,
> +				 <PINMUX_GPIO18__FUNC_GPIO18>,
> +				 <PINMUX_GPIO19__FUNC_GPIO19>,
> +				 <PINMUX_GPIO20__FUNC_GPIO20>,
> +				 <PINMUX_GPIO21__FUNC_GPIO21>,
> +				 <PINMUX_GPIO22__FUNC_GPIO22>,
> +				 <PINMUX_GPIO23__FUNC_GPIO23>,
> +				 <PINMUX_GPIO24__FUNC_GPIO24>,
> +				 <PINMUX_GPIO25__FUNC_GPIO25>,
> +				 <PINMUX_GPIO26__FUNC_GPIO26>,
> +				 <PINMUX_GPIO27__FUNC_GPIO27>,
> +				 <PINMUX_GPIO28__FUNC_GPIO28>;
> +		};
> +	};
>   };
>   
>   &pmic {
> @@ -415,3 +523,16 @@ &scp {
>   &dsi0 {
>   	status = "disabled";
>   };
> +
> +&dpi0 {
> +	pinctrl-names = "default", "sleep";
> +	pinctrl-0 = <&dpi_func_pins>;
> +	pinctrl-1 = <&dpi_idle_pins>;
> +	status = "okay";
> +
> +	port {
> +		dpi_out: endpoint {
> +			remote-endpoint = <&it66121_in>;
> +		};
> +	};
> +};


From matthias.bgg at gmail.com  Mon Sep  2 08:49:38 2024
From: matthias.bgg at gmail.com (Matthias Brugger)
Date: Mon, 2 Sep 2024 17:49:38 +0200
Subject: [RESEND PATCH v2 1/2] arm64: dts: mt8183: add dpi node to mt8183
In-Reply-To: <20240819120735.1508789-1-treapking@chromium.org>
References: <20240819120735.1508789-1-treapking@chromium.org>
Message-ID: <dad2df65-4321-497d-bb39-e96ca3df9bf1@gmail.com>



On 19/08/2024 14:05, Pin-yen Lin wrote:
> From: Pi-Hsun Shih <pihsun at chromium.org>
> 
> Add dpi node to mt8183.
> 
> Signed-off-by: Jitao Shi <jitao.shi at mediatek.com>
> Signed-off-by: Pi-Hsun Shih <pihsun at chromium.org>
> Signed-off-by: Fabien Parent <fparent at baylibre.com>
> Signed-off-by: Pin-yen Lin <treapking at chromium.org>

Applied, thanks!

> ---
> 
> (no changes since v1)
> 
>   arch/arm64/boot/dts/mediatek/mt8183.dtsi | 11 +++++++++++
>   1 file changed, 11 insertions(+)
> 
> diff --git a/arch/arm64/boot/dts/mediatek/mt8183.dtsi b/arch/arm64/boot/dts/mediatek/mt8183.dtsi
> index 267378fa46c0..266441e999f2 100644
> --- a/arch/arm64/boot/dts/mediatek/mt8183.dtsi
> +++ b/arch/arm64/boot/dts/mediatek/mt8183.dtsi
> @@ -1836,6 +1836,17 @@ dsi0: dsi at 14014000 {
>   			phy-names = "dphy";
>   		};
>   
> +		dpi0: dpi at 14015000 {
> +			compatible = "mediatek,mt8183-dpi";
> +			reg = <0 0x14015000 0 0x1000>;
> +			interrupts = <GIC_SPI 237 IRQ_TYPE_LEVEL_LOW>;
> +			power-domains = <&spm MT8183_POWER_DOMAIN_DISP>;
> +			clocks = <&mmsys CLK_MM_DPI_IF>,
> +				 <&mmsys CLK_MM_DPI_MM>,
> +				 <&apmixedsys CLK_APMIXED_TVDPLL>;
> +			clock-names = "pixel", "engine", "pll";
> +		};
> +
>   		mutex: mutex at 14016000 {
>   			compatible = "mediatek,mt8183-disp-mutex";
>   			reg = <0 0x14016000 0 0x1000>;


From matthias.bgg at gmail.com  Mon Sep  2 08:50:37 2024
From: matthias.bgg at gmail.com (Matthias Brugger)
Date: Mon, 2 Sep 2024 17:50:37 +0200
Subject: [PATCH] arm64: dts: mediatek: mt8195: Correct clock order for
 dp_intf*
In-Reply-To: <20240802070951.1086616-1-wenst@chromium.org>
References: <20240802070951.1086616-1-wenst@chromium.org>
Message-ID: <b0d83115-db4f-4c3b-9cfe-e889b1410c44@gmail.com>



On 02/08/2024 09:09, Chen-Yu Tsai wrote:
> The clocks for dp_intf* device nodes are given in the wrong order,
> causing the binding validation to fail.
> 
> Fixes: 6c2503b5856a ("arm64: dts: mt8195: Add dp-intf nodes")
> Signed-off-by: Chen-Yu Tsai <wenst at chromium.org>

Applied, thanks!

> ---
>   arch/arm64/boot/dts/mediatek/mt8195.dtsi | 12 ++++++------
>   1 file changed, 6 insertions(+), 6 deletions(-)
> 
> diff --git a/arch/arm64/boot/dts/mediatek/mt8195.dtsi b/arch/arm64/boot/dts/mediatek/mt8195.dtsi
> index 989e8ac545ac..e89ba384c4aa 100644
> --- a/arch/arm64/boot/dts/mediatek/mt8195.dtsi
> +++ b/arch/arm64/boot/dts/mediatek/mt8195.dtsi
> @@ -3252,10 +3252,10 @@ dp_intf0: dp-intf at 1c015000 {
>   			compatible = "mediatek,mt8195-dp-intf";
>   			reg = <0 0x1c015000 0 0x1000>;
>   			interrupts = <GIC_SPI 657 IRQ_TYPE_LEVEL_HIGH 0>;
> -			clocks = <&vdosys0  CLK_VDO0_DP_INTF0>,
> -				 <&vdosys0 CLK_VDO0_DP_INTF0_DP_INTF>,
> +			clocks = <&vdosys0 CLK_VDO0_DP_INTF0_DP_INTF>,
> +				 <&vdosys0  CLK_VDO0_DP_INTF0>,
>   				 <&apmixedsys CLK_APMIXED_TVDPLL1>;
> -			clock-names = "engine", "pixel", "pll";
> +			clock-names = "pixel", "engine", "pll";
>   			status = "disabled";
>   		};
>   
> @@ -3522,10 +3522,10 @@ dp_intf1: dp-intf at 1c113000 {
>   			reg = <0 0x1c113000 0 0x1000>;
>   			interrupts = <GIC_SPI 513 IRQ_TYPE_LEVEL_HIGH 0>;
>   			power-domains = <&spm MT8195_POWER_DOMAIN_VDOSYS1>;
> -			clocks = <&vdosys1 CLK_VDO1_DP_INTF0_MM>,
> -				 <&vdosys1 CLK_VDO1_DPINTF>,
> +			clocks = <&vdosys1 CLK_VDO1_DPINTF>,
> +				 <&vdosys1 CLK_VDO1_DP_INTF0_MM>,
>   				 <&apmixedsys CLK_APMIXED_TVDPLL2>;
> -			clock-names = "engine", "pixel", "pll";
> +			clock-names = "pixel", "engine", "pll";
>   			status = "disabled";
>   		};
>   


From matthias.bgg at gmail.com  Mon Sep  2 08:54:14 2024
From: matthias.bgg at gmail.com (Matthias Brugger)
Date: Mon, 2 Sep 2024 17:54:14 +0200
Subject: [PATCH v4 2/3] arm64: dts: mediatek: mt8186: Add power domain for
 DPI
In-Reply-To: <20240830084544.2898512-3-rohiagar@chromium.org>
References: <20240830084544.2898512-1-rohiagar@chromium.org>
 <20240830084544.2898512-3-rohiagar@chromium.org>
Message-ID: <9649e485-1f46-4dff-9dac-9bd13740e558@gmail.com>



On 30/08/2024 10:45, Rohit Agarwal wrote:
> Add power domain phandle to the DPI controller in mediatek
> mt8186 SoC.
> 
> Signed-off-by: Rohit Agarwal <rohiagar at chromium.org>

Applied, thanks

> ---
>   arch/arm64/boot/dts/mediatek/mt8186.dtsi | 1 +
>   1 file changed, 1 insertion(+)
> 
> diff --git a/arch/arm64/boot/dts/mediatek/mt8186.dtsi b/arch/arm64/boot/dts/mediatek/mt8186.dtsi
> index caec83f5eece..85b77ec033c1 100644
> --- a/arch/arm64/boot/dts/mediatek/mt8186.dtsi
> +++ b/arch/arm64/boot/dts/mediatek/mt8186.dtsi
> @@ -1843,6 +1843,7 @@ dpi: dpi at 1400a000 {
>   			assigned-clocks = <&topckgen CLK_TOP_DPI>;
>   			assigned-clock-parents = <&topckgen CLK_TOP_TVDPLL_D2>;
>   			interrupts = <GIC_SPI 309 IRQ_TYPE_LEVEL_LOW 0>;
> +			power-domains = <&spm MT8186_POWER_DOMAIN_DIS>;
>   			status = "disabled";
>   
>   			port {


From matthias.bgg at gmail.com  Mon Sep  2 08:56:00 2024
From: matthias.bgg at gmail.com (Matthias Brugger)
Date: Mon, 2 Sep 2024 17:56:00 +0200
Subject: [PATCH v4 3/3] arm64: dts: mediatek: mt8186: Add svs node
In-Reply-To: <20240830084544.2898512-4-rohiagar@chromium.org>
References: <20240830084544.2898512-1-rohiagar@chromium.org>
 <20240830084544.2898512-4-rohiagar@chromium.org>
Message-ID: <200d30d0-783f-4ca9-8bad-60499b65a33d@gmail.com>



On 30/08/2024 10:45, Rohit Agarwal wrote:
> Add clock/irq/efuse setting in svs nodes for mt8186 SoC.
> 
> Signed-off-by: Rohit Agarwal <rohiagar at chromium.org>

Applied, thanks

> ---
>   arch/arm64/boot/dts/mediatek/mt8186.dtsi | 16 ++++++++++++++++
>   1 file changed, 16 insertions(+)
> 
> diff --git a/arch/arm64/boot/dts/mediatek/mt8186.dtsi b/arch/arm64/boot/dts/mediatek/mt8186.dtsi
> index 85b77ec033c1..3bd023cdcac0 100644
> --- a/arch/arm64/boot/dts/mediatek/mt8186.dtsi
> +++ b/arch/arm64/boot/dts/mediatek/mt8186.dtsi
> @@ -1372,6 +1372,18 @@ lvts: thermal-sensor at 1100b000 {
>   			#thermal-sensor-cells = <1>;
>   		};
>   
> +		svs: svs at 1100bc00 {
> +			compatible = "mediatek,mt8186-svs";
> +			reg = <0 0x1100bc00 0 0x400>;
> +			interrupts = <GIC_SPI 142 IRQ_TYPE_LEVEL_HIGH 0>;
> +			clocks = <&infracfg_ao CLK_INFRA_AO_THERM>;
> +			clock-names = "main";
> +			nvmem-cells = <&svs_calibration>, <&lvts_efuse_data1>;
> +			nvmem-cell-names = "svs-calibration-data", "t-calibration-data";
> +			resets = <&infracfg_ao MT8186_INFRA_PTP_CTRL_RST>;
> +			reset-names = "svs_rst";
> +		};
> +
>   		pwm0: pwm at 1100e000 {
>   			compatible = "mediatek,mt8186-disp-pwm", "mediatek,mt8183-disp-pwm";
>   			reg = <0 0x1100e000 0 0x1000>;
> @@ -1695,6 +1707,10 @@ lvts_efuse_data2: lvts2-calib at 2f8 {
>   				reg = <0x2f8 0x14>;
>   			};
>   
> +			svs_calibration: calib at 550 {
> +				reg = <0x550 0x50>;
> +			};
> +
>   			gpu_speedbin: gpu-speedbin at 59c {
>   				reg = <0x59c 0x4>;
>   				bits = <0 3>;


From matthias.bgg at gmail.com  Mon Sep  2 09:03:28 2024
From: matthias.bgg at gmail.com (Matthias Brugger)
Date: Mon, 2 Sep 2024 18:03:28 +0200
Subject: [PATCH] arm64: dts: mediatek: mt8186-corsola: Disable DPI display
 interface
In-Reply-To: <20240821042836.2631815-1-wenst@chromium.org>
References: <20240821042836.2631815-1-wenst@chromium.org>
Message-ID: <bb0dba5a-68e9-4c03-bbea-6788f4cc7d16@gmail.com>



On 21/08/2024 06:28, Chen-Yu Tsai wrote:
> The DPI display interface feeds the external display pipeline. However
> the pipeline representation is currently incomplete. Efforts are still
> under way to come up with a way to represent the "creative" repurposing
> of the DP bridge chip's internal output mux, which is meant to support
> USB type-C orientation changes, to output to one of two type-C ports.
> 
> Until that is finalized, the external display can't be fully described,
> and thus won't work. Even worse, the half complete graph potentially
> confuses the OS, breaking the internal display as well.
> 
> Disable the external display interface across the whole Corsola family
> until the DP / USB Type-C muxing graph binding is ready.
> 
> Reported-by: Alper Nebi Yasak <alpernebiyasak at gmail.com>
> Closes: https://lore.kernel.org/linux-mediatek/38a703a9-6efb-456a-a248-1dd3687e526d at gmail.com/
> Fixes: 8855d01fb81f ("arm64: dts: mediatek: Add MT8186 Krabby platform based Tentacruel / Tentacool")
> Cc: <stable at vger.kernel.org>
> Signed-off-by: Chen-Yu Tsai <wenst at chromium.org>

Applied, thanks

> ---
> Stephen has recently posted the "platform/chrome: Add DT USB/DP
> muxing/topology support" patch series, which is now up to v3 [1].
> More work based on this series is needed for the DP bridge drivers.
> 
> [1] https://lore.kernel.org/dri-devel/20240819223834.2049862-1-swboyd at chromium.org/
> ---
>   arch/arm64/boot/dts/mediatek/mt8186-corsola.dtsi | 3 ++-
>   1 file changed, 2 insertions(+), 1 deletion(-)
> 
> diff --git a/arch/arm64/boot/dts/mediatek/mt8186-corsola.dtsi b/arch/arm64/boot/dts/mediatek/mt8186-corsola.dtsi
> index 0c4a26117428..682c6ad2574d 100644
> --- a/arch/arm64/boot/dts/mediatek/mt8186-corsola.dtsi
> +++ b/arch/arm64/boot/dts/mediatek/mt8186-corsola.dtsi
> @@ -353,7 +353,8 @@ &dpi {
>   	pinctrl-names = "default", "sleep";
>   	pinctrl-0 = <&dpi_pins_default>;
>   	pinctrl-1 = <&dpi_pins_sleep>;
> -	status = "okay";
> +	/* TODO Re-enable after DP to Type-C port muxing can be described */
> +	status = "disabled";
>   };
>   
>   &dpi_out {


From matthias.bgg at gmail.com  Mon Sep  2 09:07:06 2024
From: matthias.bgg at gmail.com (Matthias Brugger)
Date: Mon, 2 Sep 2024 18:07:06 +0200
Subject: [PATCH] arm64: dts: mediatek: mt8186: Fix supported-hw mask for
 GPU OPPs
In-Reply-To: <20240725072243.173104-1-angelogioacchino.delregno@collabora.com>
References: <20240725072243.173104-1-angelogioacchino.delregno@collabora.com>
Message-ID: <9aec2480-5b49-4fd0-8ad0-9fd87c865630@gmail.com>



On 25/07/2024 09:22, AngeloGioacchino Del Regno wrote:
> The speedbin eFuse reads a value 'x' from 0 to 7 and, in order to
> make that compatible with opp-supported-hw, it gets post processed
> as BIT(x).
> 
> Change all of the 0x30 supported-hw to 0x20 to avoid getting
> duplicate OPPs for speedbin 4, and also change all of the 0x8 to
> 0xcf because speedbins different from 4 and 5 do support 900MHz,
> 950MHz, 1000MHz with the higher voltage of 850mV, 900mV, 950mV
> respectively.
> 
> Fixes: f38ea593ad0d ("arm64: dts: mediatek: mt8186: Wire up GPU voltage/frequency scaling")
> Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>

Patch got applied and is queued for v6.12 (v6.11-next/dts64 branch).
Somehow no email was send to inform about this.

Angelo, not sure if it's worth investigating what happened.

Regards,
Matthias

> ---
>   arch/arm64/boot/dts/mediatek/mt8186.dtsi | 12 ++++++------
>   1 file changed, 6 insertions(+), 6 deletions(-)
> 
> diff --git a/arch/arm64/boot/dts/mediatek/mt8186.dtsi b/arch/arm64/boot/dts/mediatek/mt8186.dtsi
> index 4763ed5dc86c..d63a9defe73e 100644
> --- a/arch/arm64/boot/dts/mediatek/mt8186.dtsi
> +++ b/arch/arm64/boot/dts/mediatek/mt8186.dtsi
> @@ -731,7 +731,7 @@ opp-850000000 {
>   		opp-900000000-3 {
>   			opp-hz = /bits/ 64 <900000000>;
>   			opp-microvolt = <850000>;
> -			opp-supported-hw = <0x8>;
> +			opp-supported-hw = <0xcf>;
>   		};
>   
>   		opp-900000000-4 {
> @@ -743,13 +743,13 @@ opp-900000000-4 {
>   		opp-900000000-5 {
>   			opp-hz = /bits/ 64 <900000000>;
>   			opp-microvolt = <825000>;
> -			opp-supported-hw = <0x30>;
> +			opp-supported-hw = <0x20>;
>   		};
>   
>   		opp-950000000-3 {
>   			opp-hz = /bits/ 64 <950000000>;
>   			opp-microvolt = <900000>;
> -			opp-supported-hw = <0x8>;
> +			opp-supported-hw = <0xcf>;
>   		};
>   
>   		opp-950000000-4 {
> @@ -761,13 +761,13 @@ opp-950000000-4 {
>   		opp-950000000-5 {
>   			opp-hz = /bits/ 64 <950000000>;
>   			opp-microvolt = <850000>;
> -			opp-supported-hw = <0x30>;
> +			opp-supported-hw = <0x20>;
>   		};
>   
>   		opp-1000000000-3 {
>   			opp-hz = /bits/ 64 <1000000000>;
>   			opp-microvolt = <950000>;
> -			opp-supported-hw = <0x8>;
> +			opp-supported-hw = <0xcf>;
>   		};
>   
>   		opp-1000000000-4 {
> @@ -779,7 +779,7 @@ opp-1000000000-4 {
>   		opp-1000000000-5 {
>   			opp-hz = /bits/ 64 <1000000000>;
>   			opp-microvolt = <875000>;
> -			opp-supported-hw = <0x30>;
> +			opp-supported-hw = <0x20>;
>   		};
>   	};
>   


From make24 at iscas.ac.cn  Mon Sep  2 18:39:13 2024
From: make24 at iscas.ac.cn (Ma Ke)
Date: Tue,  3 Sep 2024 09:39:13 +0800
Subject: [PATCH RESEND] wifi: mt76: mt7996: fix NULL pointer dereference in mt7996_mcu_sta_bfer_he
Message-ID: <20240903013913.4143602-1-make24@iscas.ac.cn>

Fix the NULL pointer dereference in mt7996_mcu_sta_bfer_he
routine adding an sta interface to the mt7996 driver.

Found by code review.

Cc: stable at vger.kernel.org
Fixes: 98686cd21624 ("wifi: mt76: mt7996: add driver for MediaTek Wi-Fi 7 (802.11be) devices")
Signed-off-by: Ma Ke <make24 at iscas.ac.cn>
---
 drivers/net/wireless/mediatek/mt76/mt7996/mcu.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c
index 2e4fa9f48dfb..cba28d8d5562 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c
@@ -1544,6 +1544,9 @@ mt7996_mcu_sta_bfer_he(struct ieee80211_sta *sta, struct ieee80211_vif *vif,
 	u8 nss_mcs = mt7996_mcu_get_sta_nss(mcs_map);
 	u8 snd_dim, sts;
 
+	if (!vc)
+		return;
+
 	bf->tx_mode = MT_PHY_TYPE_HE_SU;
 
 	mt7996_mcu_sta_sounding_rate(bf);
-- 
2.25.1



From make24 at iscas.ac.cn  Mon Sep  2 18:44:55 2024
From: make24 at iscas.ac.cn (Ma Ke)
Date: Tue,  3 Sep 2024 09:44:55 +0800
Subject: [PATCH RESEND] wifi: mt76: mt7921: Check devm_kasprintf() returned value
Message-ID: <20240903014455.4144536-1-make24@iscas.ac.cn>

devm_kasprintf() can return a NULL pointer on failure but this returned
value is not checked. Fix this lack and check the returned value.

Found by code review.

Cc: stable at vger.kernel.org
Fixes: 6ae39b7c7ed4 ("wifi: mt76: mt7921: Support temp sensor")
Signed-off-by: Ma Ke <make24 at iscas.ac.cn>
---
 drivers/net/wireless/mediatek/mt76/mt7921/init.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/init.c b/drivers/net/wireless/mediatek/mt76/mt7921/init.c
index ef0c721d26e3..5ab395d9d93e 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7921/init.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7921/init.c
@@ -52,6 +52,8 @@ static int mt7921_thermal_init(struct mt792x_phy *phy)
 
 	name = devm_kasprintf(&wiphy->dev, GFP_KERNEL, "mt7921_%s",
 			      wiphy_name(wiphy));
+	if (!name)
+		return -ENOMEM;
 
 	hwmon = devm_hwmon_device_register_with_groups(&wiphy->dev, name, phy,
 						       mt7921_hwmon_groups);
-- 
2.25.1



From make24 at iscas.ac.cn  Mon Sep  2 18:49:55 2024
From: make24 at iscas.ac.cn (Ma Ke)
Date: Tue,  3 Sep 2024 09:49:55 +0800
Subject: [PATCH RESEND] mt76: mt7915: check devm_kasprintf() returned value
Message-ID: <20240903014955.4145423-1-make24@iscas.ac.cn>

devm_kasprintf() can return a NULL pointer on failure but this returned
value is not checked. Fix this lack and check the returned value.

Found by code review.

Cc: stable at vger.kernel.org
Fixes: 6ae39b7c7ed4 ("wifi: mt76: mt7921: Support temp sensor")
Signed-off-by: Ma Ke <make24 at iscas.ac.cn>
---
 drivers/net/wireless/mediatek/mt76/mt7915/init.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/init.c b/drivers/net/wireless/mediatek/mt76/mt7915/init.c
index a978f434dc5e..7bc3b4cd3592 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/init.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/init.c
@@ -194,6 +194,8 @@ static int mt7915_thermal_init(struct mt7915_phy *phy)
 
 	name = devm_kasprintf(&wiphy->dev, GFP_KERNEL, "mt7915_%s",
 			      wiphy_name(wiphy));
+	if (!name)
+		return -ENOMEM;
 
 	cdev = thermal_cooling_device_register(name, phy, &mt7915_thermal_ops);
 	if (!IS_ERR(cdev)) {
-- 
2.25.1



From dmitry.baryshkov at linaro.org  Mon Sep  2 19:01:55 2024
From: dmitry.baryshkov at linaro.org (Dmitry Baryshkov)
Date: Tue, 03 Sep 2024 05:01:55 +0300
Subject: [PATCH v5 0/3] drm: fix two issues related to HDMI Connector
 implementation
Message-ID: <20240903-drm-bridge-connector-fix-hdmi-reset-v5-0-daebde6d9857@linaro.org>

Running IGT tests on Qualcomm Dragonboard820c uncovered two issues with
the HDMI Connector implementation and with its integration into the
drm_bridge_connector. Fix those issues.

Note, I'm not fully satisfied with the drm_bridge_connector move. Maybe
it's better to add drm_bridge_funcs::connector_reset() and call it from
__drm_atomic_helper_connector_reset().

Depends on https://lore.kernel.org/dri-devel/20240704-panel-sw43408-fix-v6-1-3ea1c94bbb9b at linaro.org

Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov at linaro.org>
---
Changes in v5:
- Rebased on top of drm-misc-next
- Dropped the DRM_MODE_PROP_IMMUTABLE patches, replaced with the IGT
  patch.
- Link to v4: https://lore.kernel.org/r/20240715-drm-bridge-connector-fix-hdmi-reset-v4-0-61e6417cfd99 at linaro.org

Changes in v4:
- Fixed DRM_MODE_PROP_IMMUTABLE to use MUST in the single-value clause (Maxime)
- Rebased on top of DRM_DSC_HELPERS patch
- Removed 'depends on DRM_DISPLAY_HELPER' (Maxime)
- Link to v3: https://lore.kernel.org/r/20240702-drm-bridge-connector-fix-hdmi-reset-v3-0-12b0e3124ca4 at linaro.org

Changes in v3:
- Document the DRM_MODE_PROP_IMMUTABLE requirements currently exposed
  only via IGT tests (Maxime).
- Move drm_bridge_connector to drm_display_helper.
- Link to v2: https://lore.kernel.org/r/20240623-drm-bridge-connector-fix-hdmi-reset-v2-0-8590d44912ce at linaro.org

Changes in v2:
- Actually pass the flags to drm_property_create_range().
- Link to v1: https://lore.kernel.org/r/20240623-drm-bridge-connector-fix-hdmi-reset-v1-0-41e9894dcdec at linaro.org

---
Dmitry Baryshkov (3):
      drm/display: stop depending on DRM_DISPLAY_HELPER
      drm/bridge-connector: move to DRM_DISPLAY_HELPER module
      drm/bridge-connector: reset the HDMI connector state

 MAINTAINERS                                        |  2 +-
 drivers/gpu/drm/Makefile                           |  1 -
 drivers/gpu/drm/bridge/Kconfig                     |  1 +
 drivers/gpu/drm/display/Kconfig                    | 25 ++++++++++++----------
 drivers/gpu/drm/display/Makefile                   |  2 ++
 .../gpu/drm/{ => display}/drm_bridge_connector.c   | 13 ++++++++++-
 drivers/gpu/drm/imx/dcss/Kconfig                   |  2 ++
 drivers/gpu/drm/imx/lcdc/Kconfig                   |  2 ++
 drivers/gpu/drm/ingenic/Kconfig                    |  2 ++
 drivers/gpu/drm/kmb/Kconfig                        |  2 ++
 drivers/gpu/drm/mediatek/Kconfig                   |  2 ++
 drivers/gpu/drm/meson/Kconfig                      |  2 ++
 drivers/gpu/drm/msm/Kconfig                        |  1 +
 drivers/gpu/drm/omapdrm/Kconfig                    |  2 ++
 drivers/gpu/drm/renesas/rcar-du/Kconfig            |  2 ++
 drivers/gpu/drm/renesas/rz-du/Kconfig              |  2 ++
 drivers/gpu/drm/renesas/shmobile/Kconfig           |  2 ++
 drivers/gpu/drm/rockchip/Kconfig                   |  4 ++++
 drivers/gpu/drm/tegra/Kconfig                      |  1 +
 drivers/gpu/drm/tidss/Kconfig                      |  2 ++
 drivers/gpu/drm/xlnx/Kconfig                       |  1 +
 21 files changed, 59 insertions(+), 14 deletions(-)
---
base-commit: ca097d4d94d808409386fde414370900cc41adad
change-id: 20240623-drm-bridge-connector-fix-hdmi-reset-0ce86af053aa

Best regards,
-- 
Dmitry Baryshkov <dmitry.baryshkov at linaro.org>



From dmitry.baryshkov at linaro.org  Mon Sep  2 19:01:56 2024
From: dmitry.baryshkov at linaro.org (Dmitry Baryshkov)
Date: Tue, 03 Sep 2024 05:01:56 +0300
Subject: [PATCH v5 1/3] drm/display: stop depending on DRM_DISPLAY_HELPER
In-Reply-To: <20240903-drm-bridge-connector-fix-hdmi-reset-v5-0-daebde6d9857@linaro.org>
References: <20240903-drm-bridge-connector-fix-hdmi-reset-v5-0-daebde6d9857@linaro.org>
Message-ID: <20240903-drm-bridge-connector-fix-hdmi-reset-v5-1-daebde6d9857@linaro.org>

Kconfig symbols should not declare dependency on DRM_DISPLAY_HELPER.
Move all parts of DRM_DISPLAY_HELPER to an if DRM_DISPLAY_HELPER block.

It is not possible to make those symbols select DRM_DISPLAY_HELPER
because of the link issues when a part of the helper is selected to be
built-in, while other part is selected to be as module. In such a case
the modular part doesn't get built at all, leading to undefined symbols.

The only viable alternative is to split drm_display_helper.ko into
several small modules, each of them having their own dependencies.

Suggested-by: Maxime Ripard <mripard at kernel.org>
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov at linaro.org>
---
 drivers/gpu/drm/display/Kconfig | 19 ++++++++-----------
 1 file changed, 8 insertions(+), 11 deletions(-)

diff --git a/drivers/gpu/drm/display/Kconfig b/drivers/gpu/drm/display/Kconfig
index a2e42014ffe0..9c2da1e48b75 100644
--- a/drivers/gpu/drm/display/Kconfig
+++ b/drivers/gpu/drm/display/Kconfig
@@ -1,19 +1,20 @@
 # SPDX-License-Identifier: MIT
 
+config DRM_DISPLAY_DP_AUX_BUS
+	tristate
+	depends on DRM
+	depends on OF || COMPILE_TEST
+
 config DRM_DISPLAY_HELPER
 	tristate
 	depends on DRM
 	help
 	  DRM helpers for display adapters.
 
-config DRM_DISPLAY_DP_AUX_BUS
-	tristate
-	depends on DRM
-	depends on OF || COMPILE_TEST
+if DRM_DISPLAY_HELPER
 
 config DRM_DISPLAY_DP_AUX_CEC
 	bool "Enable DisplayPort CEC-Tunneling-over-AUX HDMI support"
-	depends on DRM && DRM_DISPLAY_HELPER
 	select DRM_DISPLAY_DP_HELPER
 	select CEC_CORE
 	help
@@ -25,7 +26,6 @@ config DRM_DISPLAY_DP_AUX_CEC
 
 config DRM_DISPLAY_DP_AUX_CHARDEV
 	bool "DRM DP AUX Interface"
-	depends on DRM && DRM_DISPLAY_HELPER
 	select DRM_DISPLAY_DP_HELPER
 	help
 	  Choose this option to enable a /dev/drm_dp_auxN node that allows to
@@ -34,7 +34,6 @@ config DRM_DISPLAY_DP_AUX_CHARDEV
 
 config DRM_DISPLAY_DP_HELPER
 	bool
-	depends on DRM_DISPLAY_HELPER
 	help
 	  DRM display helpers for DisplayPort.
 
@@ -61,25 +60,23 @@ config DRM_DISPLAY_DP_TUNNEL_STATE_DEBUG
 
 config DRM_DISPLAY_DSC_HELPER
 	bool
-	depends on DRM_DISPLAY_HELPER
 	help
 	  DRM display helpers for VESA DSC (used by DSI and DisplayPort).
 
 config DRM_DISPLAY_HDCP_HELPER
 	bool
-	depends on DRM_DISPLAY_HELPER
 	help
 	  DRM display helpers for HDCP.
 
 config DRM_DISPLAY_HDMI_HELPER
 	bool
-	depends on DRM_DISPLAY_HELPER
 	help
 	  DRM display helpers for HDMI.
 
 config DRM_DISPLAY_HDMI_STATE_HELPER
 	bool
-	depends on DRM_DISPLAY_HELPER
 	select DRM_DISPLAY_HDMI_HELPER
 	help
 	  DRM KMS state helpers for HDMI.
+
+endif # DRM_DISPLAY_HELPER

-- 
2.39.2



From dmitry.baryshkov at linaro.org  Mon Sep  2 19:01:57 2024
From: dmitry.baryshkov at linaro.org (Dmitry Baryshkov)
Date: Tue, 03 Sep 2024 05:01:57 +0300
Subject: [PATCH v5 2/3] drm/bridge-connector: move to DRM_DISPLAY_HELPER
 module
In-Reply-To: <20240903-drm-bridge-connector-fix-hdmi-reset-v5-0-daebde6d9857@linaro.org>
References: <20240903-drm-bridge-connector-fix-hdmi-reset-v5-0-daebde6d9857@linaro.org>
Message-ID: <20240903-drm-bridge-connector-fix-hdmi-reset-v5-2-daebde6d9857@linaro.org>

drm_bridge_connector is a "leaf" driver, belonging to the display
helper, rather than the "CRTC" drm_kms_helper module. Move the driver
to the drm/display and add necessary Kconfig selection clauses.

Suggested-by: Maxime Ripard <mripard at kernel.org>
Acked-by: Maxime Ripard <mripard at kernel.org>
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov at linaro.org>
---
 MAINTAINERS                                          | 2 +-
 drivers/gpu/drm/Makefile                             | 1 -
 drivers/gpu/drm/bridge/Kconfig                       | 1 +
 drivers/gpu/drm/display/Kconfig                      | 5 +++++
 drivers/gpu/drm/display/Makefile                     | 2 ++
 drivers/gpu/drm/{ => display}/drm_bridge_connector.c | 0
 drivers/gpu/drm/imx/dcss/Kconfig                     | 2 ++
 drivers/gpu/drm/imx/lcdc/Kconfig                     | 2 ++
 drivers/gpu/drm/ingenic/Kconfig                      | 2 ++
 drivers/gpu/drm/kmb/Kconfig                          | 2 ++
 drivers/gpu/drm/mediatek/Kconfig                     | 2 ++
 drivers/gpu/drm/meson/Kconfig                        | 2 ++
 drivers/gpu/drm/msm/Kconfig                          | 1 +
 drivers/gpu/drm/omapdrm/Kconfig                      | 2 ++
 drivers/gpu/drm/renesas/rcar-du/Kconfig              | 2 ++
 drivers/gpu/drm/renesas/rz-du/Kconfig                | 2 ++
 drivers/gpu/drm/renesas/shmobile/Kconfig             | 2 ++
 drivers/gpu/drm/rockchip/Kconfig                     | 4 ++++
 drivers/gpu/drm/tegra/Kconfig                        | 1 +
 drivers/gpu/drm/tidss/Kconfig                        | 2 ++
 drivers/gpu/drm/xlnx/Kconfig                         | 1 +
 21 files changed, 38 insertions(+), 2 deletions(-)

diff --git a/MAINTAINERS b/MAINTAINERS
index a38754d1cc86..6b152eae4f5f 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -7463,8 +7463,8 @@ S:	Maintained
 T:	git https://gitlab.freedesktop.org/drm/misc/kernel.git
 F:	Documentation/devicetree/bindings/display/bridge/
 F:	drivers/gpu/drm/bridge/
+F:	drivers/gpu/drm/display/drm_bridge_connector.c
 F:	drivers/gpu/drm/drm_bridge.c
-F:	drivers/gpu/drm/drm_bridge_connector.c
 F:	include/drm/drm_bridge.h
 F:	include/drm/drm_bridge_connector.h
 
diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile
index c62339b89d46..784229d4504d 100644
--- a/drivers/gpu/drm/Makefile
+++ b/drivers/gpu/drm/Makefile
@@ -129,7 +129,6 @@ obj-$(CONFIG_DRM_TTM_HELPER) += drm_ttm_helper.o
 drm_kms_helper-y := \
 	drm_atomic_helper.o \
 	drm_atomic_state_helper.o \
-	drm_bridge_connector.o \
 	drm_crtc_helper.o \
 	drm_damage_helper.o \
 	drm_encoder_slave.o \
diff --git a/drivers/gpu/drm/bridge/Kconfig b/drivers/gpu/drm/bridge/Kconfig
index c621be1a99a8..3eb955333c80 100644
--- a/drivers/gpu/drm/bridge/Kconfig
+++ b/drivers/gpu/drm/bridge/Kconfig
@@ -390,6 +390,7 @@ config DRM_TI_SN65DSI86
 	depends on OF
 	select DRM_DISPLAY_DP_HELPER
 	select DRM_DISPLAY_HELPER
+	select DRM_BRIDGE_CONNECTOR
 	select DRM_KMS_HELPER
 	select REGMAP_I2C
 	select DRM_PANEL
diff --git a/drivers/gpu/drm/display/Kconfig b/drivers/gpu/drm/display/Kconfig
index 9c2da1e48b75..8c174ceb0c4d 100644
--- a/drivers/gpu/drm/display/Kconfig
+++ b/drivers/gpu/drm/display/Kconfig
@@ -13,6 +13,11 @@ config DRM_DISPLAY_HELPER
 
 if DRM_DISPLAY_HELPER
 
+config DRM_BRIDGE_CONNECTOR
+	bool
+	help
+	  DRM connector implementation terminating DRM bridge chains.
+
 config DRM_DISPLAY_DP_AUX_CEC
 	bool "Enable DisplayPort CEC-Tunneling-over-AUX HDMI support"
 	select DRM_DISPLAY_DP_HELPER
diff --git a/drivers/gpu/drm/display/Makefile b/drivers/gpu/drm/display/Makefile
index a023f72fa139..629c834c3192 100644
--- a/drivers/gpu/drm/display/Makefile
+++ b/drivers/gpu/drm/display/Makefile
@@ -3,6 +3,8 @@
 obj-$(CONFIG_DRM_DISPLAY_DP_AUX_BUS) += drm_dp_aux_bus.o
 
 drm_display_helper-y := drm_display_helper_mod.o
+drm_display_helper-$(CONFIG_DRM_BRIDGE_CONNECTOR) += \
+	drm_bridge_connector.o
 drm_display_helper-$(CONFIG_DRM_DISPLAY_DP_HELPER) += \
 	drm_dp_dual_mode_helper.o \
 	drm_dp_helper.o \
diff --git a/drivers/gpu/drm/drm_bridge_connector.c b/drivers/gpu/drm/display/drm_bridge_connector.c
similarity index 100%
rename from drivers/gpu/drm/drm_bridge_connector.c
rename to drivers/gpu/drm/display/drm_bridge_connector.c
diff --git a/drivers/gpu/drm/imx/dcss/Kconfig b/drivers/gpu/drm/imx/dcss/Kconfig
index 3ffc061d392b..59e3b6a1dff0 100644
--- a/drivers/gpu/drm/imx/dcss/Kconfig
+++ b/drivers/gpu/drm/imx/dcss/Kconfig
@@ -2,6 +2,8 @@ config DRM_IMX_DCSS
 	tristate "i.MX8MQ DCSS"
 	select IMX_IRQSTEER
 	select DRM_KMS_HELPER
+	select DRM_DISPLAY_HELPER
+	select DRM_BRIDGE_CONNECTOR
 	select DRM_GEM_DMA_HELPER
 	select VIDEOMODE_HELPERS
 	depends on DRM && ARCH_MXC && ARM64
diff --git a/drivers/gpu/drm/imx/lcdc/Kconfig b/drivers/gpu/drm/imx/lcdc/Kconfig
index 7e57922bbd9d..9c28bb0f4662 100644
--- a/drivers/gpu/drm/imx/lcdc/Kconfig
+++ b/drivers/gpu/drm/imx/lcdc/Kconfig
@@ -3,5 +3,7 @@ config DRM_IMX_LCDC
       depends on DRM && (ARCH_MXC || COMPILE_TEST)
       select DRM_GEM_DMA_HELPER
       select DRM_KMS_HELPER
+      select DRM_DISPLAY_HELPER
+      select DRM_BRIDGE_CONNECTOR
       help
         Found on i.MX1, i.MX21, i.MX25 and i.MX27.
diff --git a/drivers/gpu/drm/ingenic/Kconfig b/drivers/gpu/drm/ingenic/Kconfig
index 3db117c5edd9..8cd7b750dffe 100644
--- a/drivers/gpu/drm/ingenic/Kconfig
+++ b/drivers/gpu/drm/ingenic/Kconfig
@@ -8,6 +8,8 @@ config DRM_INGENIC
 	select DRM_BRIDGE
 	select DRM_PANEL_BRIDGE
 	select DRM_KMS_HELPER
+	select DRM_DISPLAY_HELPER
+	select DRM_BRIDGE_CONNECTOR
 	select DRM_GEM_DMA_HELPER
 	select REGMAP
 	select REGMAP_MMIO
diff --git a/drivers/gpu/drm/kmb/Kconfig b/drivers/gpu/drm/kmb/Kconfig
index fd011367db1d..e5ae3ec52392 100644
--- a/drivers/gpu/drm/kmb/Kconfig
+++ b/drivers/gpu/drm/kmb/Kconfig
@@ -3,6 +3,8 @@ config DRM_KMB_DISPLAY
 	depends on DRM
 	depends on ARCH_KEEMBAY || COMPILE_TEST
 	select DRM_KMS_HELPER
+	select DRM_DISPLAY_HELPER
+	select DRM_BRIDGE_CONNECTOR
 	select DRM_GEM_DMA_HELPER
 	select DRM_MIPI_DSI
 	help
diff --git a/drivers/gpu/drm/mediatek/Kconfig b/drivers/gpu/drm/mediatek/Kconfig
index d6449ebae838..417ac8c9af41 100644
--- a/drivers/gpu/drm/mediatek/Kconfig
+++ b/drivers/gpu/drm/mediatek/Kconfig
@@ -9,6 +9,8 @@ config DRM_MEDIATEK
 	depends on MTK_MMSYS
 	select DRM_GEM_DMA_HELPER if DRM_FBDEV_EMULATION
 	select DRM_KMS_HELPER
+	select DRM_DISPLAY_HELPER
+	select DRM_BRIDGE_CONNECTOR
 	select DRM_MIPI_DSI
 	select DRM_PANEL
 	select MEMORY
diff --git a/drivers/gpu/drm/meson/Kconfig b/drivers/gpu/drm/meson/Kconfig
index 615fdd0ce41b..2544756538cc 100644
--- a/drivers/gpu/drm/meson/Kconfig
+++ b/drivers/gpu/drm/meson/Kconfig
@@ -4,6 +4,8 @@ config DRM_MESON
 	depends on DRM && OF && (ARM || ARM64)
 	depends on ARCH_MESON || COMPILE_TEST
 	select DRM_KMS_HELPER
+	select DRM_DISPLAY_HELPER
+	select DRM_BRIDGE_CONNECTOR
 	select DRM_GEM_DMA_HELPER
 	select DRM_DISPLAY_CONNECTOR
 	select VIDEOMODE_HELPERS
diff --git a/drivers/gpu/drm/msm/Kconfig b/drivers/gpu/drm/msm/Kconfig
index 420385c47193..94d3ed4f7761 100644
--- a/drivers/gpu/drm/msm/Kconfig
+++ b/drivers/gpu/drm/msm/Kconfig
@@ -17,6 +17,7 @@ config DRM_MSM
 	select DRM_DISPLAY_DP_AUX_BUS
 	select DRM_DISPLAY_DP_HELPER
 	select DRM_DISPLAY_HELPER
+	select DRM_BRIDGE_CONNECTOR
 	select DRM_EXEC
 	select DRM_KMS_HELPER
 	select DRM_PANEL
diff --git a/drivers/gpu/drm/omapdrm/Kconfig b/drivers/gpu/drm/omapdrm/Kconfig
index 64e440a2649b..fbd9af758581 100644
--- a/drivers/gpu/drm/omapdrm/Kconfig
+++ b/drivers/gpu/drm/omapdrm/Kconfig
@@ -5,6 +5,8 @@ config DRM_OMAP
 	depends on DRM && OF
 	depends on ARCH_OMAP2PLUS || (COMPILE_TEST && PAGE_SIZE_LESS_THAN_64KB)
 	select DRM_KMS_HELPER
+	select DRM_DISPLAY_HELPER
+	select DRM_BRIDGE_CONNECTOR
 	select FB_DMAMEM_HELPERS_DEFERRED if DRM_FBDEV_EMULATION
 	select VIDEOMODE_HELPERS
 	select HDMI
diff --git a/drivers/gpu/drm/renesas/rcar-du/Kconfig b/drivers/gpu/drm/renesas/rcar-du/Kconfig
index be86ecb9f559..e1f41468a9a6 100644
--- a/drivers/gpu/drm/renesas/rcar-du/Kconfig
+++ b/drivers/gpu/drm/renesas/rcar-du/Kconfig
@@ -5,6 +5,8 @@ config DRM_RCAR_DU
 	depends on ARM || ARM64 || COMPILE_TEST
 	depends on ARCH_RENESAS || COMPILE_TEST
 	select DRM_KMS_HELPER
+	select DRM_DISPLAY_HELPER
+	select DRM_BRIDGE_CONNECTOR
 	select DRM_GEM_DMA_HELPER
 	select VIDEOMODE_HELPERS
 	help
diff --git a/drivers/gpu/drm/renesas/rz-du/Kconfig b/drivers/gpu/drm/renesas/rz-du/Kconfig
index 8ec14271ebba..89bdb598e0ae 100644
--- a/drivers/gpu/drm/renesas/rz-du/Kconfig
+++ b/drivers/gpu/drm/renesas/rz-du/Kconfig
@@ -6,6 +6,8 @@ config DRM_RZG2L_DU
 	depends on VIDEO_RENESAS_VSP1
 	select DRM_GEM_DMA_HELPER
 	select DRM_KMS_HELPER
+	select DRM_DISPLAY_HELPER
+	select DRM_BRIDGE_CONNECTOR
 	select VIDEOMODE_HELPERS
 	help
 	  Choose this option if you have an RZ/G2L alike chipset.
diff --git a/drivers/gpu/drm/renesas/shmobile/Kconfig b/drivers/gpu/drm/renesas/shmobile/Kconfig
index 027220b8fe1c..c329ab8a7a8b 100644
--- a/drivers/gpu/drm/renesas/shmobile/Kconfig
+++ b/drivers/gpu/drm/renesas/shmobile/Kconfig
@@ -5,6 +5,8 @@ config DRM_SHMOBILE
 	depends on ARCH_RENESAS || ARCH_SHMOBILE || COMPILE_TEST
 	select BACKLIGHT_CLASS_DEVICE
 	select DRM_KMS_HELPER
+	select DRM_DISPLAY_HELPER
+	select DRM_BRIDGE_CONNECTOR
 	select DRM_GEM_DMA_HELPER
 	select VIDEOMODE_HELPERS
 	help
diff --git a/drivers/gpu/drm/rockchip/Kconfig b/drivers/gpu/drm/rockchip/Kconfig
index 7df875e38517..23c49e91f1cc 100644
--- a/drivers/gpu/drm/rockchip/Kconfig
+++ b/drivers/gpu/drm/rockchip/Kconfig
@@ -86,6 +86,8 @@ config ROCKCHIP_LVDS
 	bool "Rockchip LVDS support"
 	depends on DRM_ROCKCHIP
 	depends on PINCTRL && OF
+	select DRM_DISPLAY_HELPER
+	select DRM_BRIDGE_CONNECTOR
 	help
 	  Choose this option to enable support for Rockchip LVDS controllers.
 	  Rockchip rk3288 SoC has LVDS TX Controller can be used, and it
@@ -96,6 +98,8 @@ config ROCKCHIP_RGB
 	bool "Rockchip RGB support"
 	depends on DRM_ROCKCHIP
 	depends on PINCTRL
+	select DRM_DISPLAY_HELPER
+	select DRM_BRIDGE_CONNECTOR
 	help
 	  Choose this option to enable support for Rockchip RGB output.
 	  Some Rockchip CRTCs, like rv1108, can directly output parallel
diff --git a/drivers/gpu/drm/tegra/Kconfig b/drivers/gpu/drm/tegra/Kconfig
index 782f51d3044a..e688d8104652 100644
--- a/drivers/gpu/drm/tegra/Kconfig
+++ b/drivers/gpu/drm/tegra/Kconfig
@@ -8,6 +8,7 @@ config DRM_TEGRA
 	select DRM_DISPLAY_DP_HELPER
 	select DRM_DISPLAY_HDMI_HELPER
 	select DRM_DISPLAY_HELPER
+	select DRM_BRIDGE_CONNECTOR
 	select DRM_DISPLAY_DP_AUX_BUS
 	select DRM_KMS_HELPER
 	select DRM_MIPI_DSI
diff --git a/drivers/gpu/drm/tidss/Kconfig b/drivers/gpu/drm/tidss/Kconfig
index 378600806167..2385c56493b9 100644
--- a/drivers/gpu/drm/tidss/Kconfig
+++ b/drivers/gpu/drm/tidss/Kconfig
@@ -3,6 +3,8 @@ config DRM_TIDSS
 	depends on DRM && OF
 	depends on ARM || ARM64 || COMPILE_TEST
 	select DRM_KMS_HELPER
+	select DRM_DISPLAY_HELPER
+	select DRM_BRIDGE_CONNECTOR
 	select DRM_GEM_DMA_HELPER
 	help
 	  The TI Keystone family SoCs introduced a new generation of
diff --git a/drivers/gpu/drm/xlnx/Kconfig b/drivers/gpu/drm/xlnx/Kconfig
index 68ee897de9d7..626e5ac4c33d 100644
--- a/drivers/gpu/drm/xlnx/Kconfig
+++ b/drivers/gpu/drm/xlnx/Kconfig
@@ -8,6 +8,7 @@ config DRM_ZYNQMP_DPSUB
 	select DMA_ENGINE
 	select DRM_DISPLAY_DP_HELPER
 	select DRM_DISPLAY_HELPER
+	select DRM_BRIDGE_CONNECTOR
 	select DRM_GEM_DMA_HELPER
 	select DRM_KMS_HELPER
 	select GENERIC_PHY

-- 
2.39.2



From dmitry.baryshkov at linaro.org  Mon Sep  2 19:01:58 2024
From: dmitry.baryshkov at linaro.org (Dmitry Baryshkov)
Date: Tue, 03 Sep 2024 05:01:58 +0300
Subject: [PATCH v5 3/3] drm/bridge-connector: reset the HDMI connector
 state
In-Reply-To: <20240903-drm-bridge-connector-fix-hdmi-reset-v5-0-daebde6d9857@linaro.org>
References: <20240903-drm-bridge-connector-fix-hdmi-reset-v5-0-daebde6d9857@linaro.org>
Message-ID: <20240903-drm-bridge-connector-fix-hdmi-reset-v5-3-daebde6d9857@linaro.org>

On HDMI connectors which use drm_bridge_connector and DRM_BRIDGE_OP_HDMI
IGT chokes on the max_bpc property in several kms_properties tests due
to the drm_bridge_connector failing to reset HDMI-related
properties.

Call __drm_atomic_helper_connector_hdmi_reset() if the
drm_bridge_connector has bridge_hdmi.

It is impossible to call this function from HDMI bridges, none of the
bridge callbacks correspond to the drm_connector_funcs::reset().

Fixes: 6b4468b0c6ba ("drm/bridge-connector: implement glue code for HDMI connector")
Reviewed-by: Maxime Ripard <mripard at kernel.org>
Acked-by: Maxime Ripard <mripard at kernel.org>
Reviewed-by: Abhinav Kumar <quic_abhinavk at quicinc.com>
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov at linaro.org>
---
 drivers/gpu/drm/display/Kconfig                |  1 +
 drivers/gpu/drm/display/drm_bridge_connector.c | 13 ++++++++++++-
 2 files changed, 13 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/display/Kconfig b/drivers/gpu/drm/display/Kconfig
index 8c174ceb0c4d..3763649ba251 100644
--- a/drivers/gpu/drm/display/Kconfig
+++ b/drivers/gpu/drm/display/Kconfig
@@ -15,6 +15,7 @@ if DRM_DISPLAY_HELPER
 
 config DRM_BRIDGE_CONNECTOR
 	bool
+	select DRM_DISPLAY_HDMI_STATE_HELPER
 	help
 	  DRM connector implementation terminating DRM bridge chains.
 
diff --git a/drivers/gpu/drm/display/drm_bridge_connector.c b/drivers/gpu/drm/display/drm_bridge_connector.c
index a4fbf1eb7ac5..3da5b8bf8259 100644
--- a/drivers/gpu/drm/display/drm_bridge_connector.c
+++ b/drivers/gpu/drm/display/drm_bridge_connector.c
@@ -216,8 +216,19 @@ static void drm_bridge_connector_debugfs_init(struct drm_connector *connector,
 	}
 }
 
+static void drm_bridge_connector_reset(struct drm_connector *connector)
+{
+	struct drm_bridge_connector *bridge_connector =
+		to_drm_bridge_connector(connector);
+
+	drm_atomic_helper_connector_reset(connector);
+	if (bridge_connector->bridge_hdmi)
+		__drm_atomic_helper_connector_hdmi_reset(connector,
+							 connector->state);
+}
+
 static const struct drm_connector_funcs drm_bridge_connector_funcs = {
-	.reset = drm_atomic_helper_connector_reset,
+	.reset = drm_bridge_connector_reset,
 	.detect = drm_bridge_connector_detect,
 	.fill_modes = drm_helper_probe_single_connector_modes,
 	.atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,

-- 
2.39.2



From greg at kroah.com  Mon Sep  2 21:55:55 2024
From: greg at kroah.com (Greg KH)
Date: Tue, 3 Sep 2024 06:55:55 +0200
Subject: [PATCH RESEND] wifi: mt76: mt7996: fix NULL pointer dereference
 in mt7996_mcu_sta_bfer_he
In-Reply-To: <20240903013913.4143602-1-make24@iscas.ac.cn>
References: <20240903013913.4143602-1-make24@iscas.ac.cn>
Message-ID: <2024090332-waged-yummy-296b@gregkh>

On Tue, Sep 03, 2024 at 09:39:13AM +0800, Ma Ke wrote:
> Fix the NULL pointer dereference in mt7996_mcu_sta_bfer_he
> routine adding an sta interface to the mt7996 driver.
> 
> Found by code review.
> 
> Cc: stable at vger.kernel.org
> Fixes: 98686cd21624 ("wifi: mt76: mt7996: add driver for MediaTek Wi-Fi 7 (802.11be) devices")
> Signed-off-by: Ma Ke <make24 at iscas.ac.cn>
> ---
>  drivers/net/wireless/mediatek/mt76/mt7996/mcu.c | 3 +++
>  1 file changed, 3 insertions(+)
> 
> diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c
> index 2e4fa9f48dfb..cba28d8d5562 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c
> +++ b/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c
> @@ -1544,6 +1544,9 @@ mt7996_mcu_sta_bfer_he(struct ieee80211_sta *sta, struct ieee80211_vif *vif,
>  	u8 nss_mcs = mt7996_mcu_get_sta_nss(mcs_map);
>  	u8 snd_dim, sts;
>  
> +	if (!vc)
> +		return;

Why is this the only place you are checking the return value of
mt76_connac_get_he_phy_cap()?  Either fix them all in this driver or
none as obviously it can not fail :(

thanks,

greg k-h


From kvalo at kernel.org  Tue Sep  3 00:50:54 2024
From: kvalo at kernel.org (Kalle Valo)
Date: Tue, 03 Sep 2024 10:50:54 +0300
Subject: [PATCH RESEND] wifi: mt76: mt7921: Check devm_kasprintf()
 returned value
In-Reply-To: <20240903014455.4144536-1-make24@iscas.ac.cn> (Ma Ke's message of
	"Tue, 3 Sep 2024 09:44:55 +0800")
References: <20240903014455.4144536-1-make24@iscas.ac.cn>
Message-ID: <87wmjtjhup.fsf@kernel.org>

Ma Ke <make24 at iscas.ac.cn> writes:

> devm_kasprintf() can return a NULL pointer on failure but this returned
> value is not checked. Fix this lack and check the returned value.
>
> Found by code review.
>
> Cc: stable at vger.kernel.org
> Fixes: 6ae39b7c7ed4 ("wifi: mt76: mt7921: Support temp sensor")
> Signed-off-by: Ma Ke <make24 at iscas.ac.cn>
> ---
>  drivers/net/wireless/mediatek/mt76/mt7921/init.c | 2 ++
>  1 file changed, 2 insertions(+)
>
> diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/init.c b/drivers/net/wireless/mediatek/mt76/mt7921/init.c
> index ef0c721d26e3..5ab395d9d93e 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt7921/init.c
> +++ b/drivers/net/wireless/mediatek/mt76/mt7921/init.c
> @@ -52,6 +52,8 @@ static int mt7921_thermal_init(struct mt792x_phy *phy)
>  
>  	name = devm_kasprintf(&wiphy->dev, GFP_KERNEL, "mt7921_%s",
>  			      wiphy_name(wiphy));
> +	if (!name)
> +		return -ENOMEM;
>  
>  	hwmon = devm_hwmon_device_register_with_groups(&wiphy->dev, name, phy,
>  						       mt7921_hwmon_groups);

You sent the previous version of this on August 26th:

https://patchwork.kernel.org/project/linux-wireless/patch/20240826095535.2603538-1-make24 at iscas.ac.cn/

Please stop spamming like this and understand that maintainers are busy.

-- 
https://patchwork.kernel.org/project/linux-wireless/list/

https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches
https://docs.kernel.org/process/submitting-patches.html


From konrad.zielinski at synergyflux.pl  Tue Sep  3 00:55:44 2024
From: konrad.zielinski at synergyflux.pl (=?UTF-8?Q? Konrad_Zieli=C5=84ski_ ?=)
Date: Tue,  3 Sep 2024 07:55:44 GMT
Subject: Instalacja pv
Message-ID: <20240903084500-0.1.dp.3gcgy.0.u543kcg33o@synergyflux.pl>

Dzie? dobry,

czy s? Pa?stwo otwarci na niezobowi?zuj?c? rozmow? na temat fotowoltaiki?

Jako firma specjalizuj?ca si? w instalacji i serwisie najlepszych jako?ciowo paneli s?onecznych na rynku chcia?bym przedstawi? propozycj?, jak? wsp?lnie z zespo?em przygotowali?my dla Pa?stwa obiektu.

B?d? wdzi?czny za wiadomo?? od Pa?stwa czy mo?emy porozmawia?.


Pozdrawiam
Konrad Zieli?ski 


From mripard at kernel.org  Tue Sep  3 01:18:50 2024
From: mripard at kernel.org (Maxime Ripard)
Date: Tue,  3 Sep 2024 10:18:50 +0200
Subject: [PATCH v5 0/3] drm: fix two issues related to HDMI Connector implementation
In-Reply-To: <20240903-drm-bridge-connector-fix-hdmi-reset-v5-0-daebde6d9857@linaro.org>
References: <20240903-drm-bridge-connector-fix-hdmi-reset-v5-0-daebde6d9857@linaro.org>
Message-ID: <172535151881.1826612.11747911526055879779.b4-ty@kernel.org>

On Tue, 03 Sep 2024 05:01:55 +0300, Dmitry Baryshkov wrote:
> Running IGT tests on Qualcomm Dragonboard820c uncovered two issues with
> the HDMI Connector implementation and with its integration into the
> drm_bridge_connector. Fix those issues.
> 
> Note, I'm not fully satisfied with the drm_bridge_connector move. Maybe
> it's better to add drm_bridge_funcs::connector_reset() and call it from
> __drm_atomic_helper_connector_reset().
> 
> [...]

Applied to misc/kernel.git (drm-misc-fixes).

Thanks!
Maxime


From liujing at cmss.chinamobile.com  Tue Sep  3 02:36:23 2024
From: liujing at cmss.chinamobile.com (Liu Jing)
Date: Tue,  3 Sep 2024 17:36:23 +0800
Subject: [PATCH] ASoC: mediatek: mt2701-cs42448: Optimize redundant code in mt2701_cs42448_machine_probe
Message-ID: <20240903093623.7120-1-liujing@cmss.chinamobile.com>

Utilize the defined parameter 'dev' to make the code cleaner.

Signed-off-by: Liu Jing <liujing at cmss.chinamobile.com>
---
 sound/soc/mediatek/mt2701/mt2701-cs42448.c | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/sound/soc/mediatek/mt2701/mt2701-cs42448.c b/sound/soc/mediatek/mt2701/mt2701-cs42448.c
index 1262e8a1bc9a..4974b0536b7b 100644
--- a/sound/soc/mediatek/mt2701/mt2701-cs42448.c
+++ b/sound/soc/mediatek/mt2701/mt2701-cs42448.c
@@ -329,10 +329,10 @@ static int mt2701_cs42448_machine_probe(struct platform_device *pdev)
 	int ret;
 	int i;
 	struct device_node *platform_node, *codec_node, *codec_node_bt_mrg;
+	struct device *dev = &pdev->dev;
 	struct mt2701_cs42448_private *priv =
-		devm_kzalloc(&pdev->dev, sizeof(struct mt2701_cs42448_private),
+		devm_kzalloc(dev, sizeof(struct mt2701_cs42448_private),
 			     GFP_KERNEL);
-	struct device *dev = &pdev->dev;
 	struct snd_soc_dai_link *dai_link;
 
 	if (!priv)
@@ -341,7 +341,7 @@ static int mt2701_cs42448_machine_probe(struct platform_device *pdev)
 	platform_node = of_parse_phandle(pdev->dev.of_node,
 					 "mediatek,platform", 0);
 	if (!platform_node) {
-		dev_err(&pdev->dev, "Property 'platform' missing or invalid\n");
+		dev_err(dev, "Property 'platform' missing or invalid\n");
 		return -EINVAL;
 	}
 	for_each_card_prelinks(card, i, dai_link) {
@@ -355,7 +355,7 @@ static int mt2701_cs42448_machine_probe(struct platform_device *pdev)
 	codec_node = of_parse_phandle(pdev->dev.of_node,
 				      "mediatek,audio-codec", 0);
 	if (!codec_node) {
-		dev_err(&pdev->dev,
+		dev_err(dev,
 			"Property 'audio-codec' missing or invalid\n");
 		return -EINVAL;
 	}
@@ -368,7 +368,7 @@ static int mt2701_cs42448_machine_probe(struct platform_device *pdev)
 	codec_node_bt_mrg = of_parse_phandle(pdev->dev.of_node,
 					     "mediatek,audio-codec-bt-mrg", 0);
 	if (!codec_node_bt_mrg) {
-		dev_err(&pdev->dev,
+		dev_err(dev,
 			"Property 'audio-codec-bt-mrg' missing or invalid\n");
 		return -EINVAL;
 	}
@@ -377,7 +377,7 @@ static int mt2701_cs42448_machine_probe(struct platform_device *pdev)
 
 	ret = snd_soc_of_parse_audio_routing(card, "audio-routing");
 	if (ret) {
-		dev_err(&pdev->dev, "failed to parse audio-routing: %d\n", ret);
+		dev_err(dev, "failed to parse audio-routing: %d\n", ret);
 		return ret;
 	}
 
@@ -395,10 +395,10 @@ static int mt2701_cs42448_machine_probe(struct platform_device *pdev)
 
 	snd_soc_card_set_drvdata(card, priv);
 
-	ret = devm_snd_soc_register_card(&pdev->dev, card);
+	ret = devm_snd_soc_register_card(dev, card);
 
 	if (ret)
-		dev_err(&pdev->dev, "%s snd_soc_register_card fail %d\n",
+		dev_err(dev, "%s snd_soc_register_card fail %d\n",
 			__func__, ret);
 	return ret;
 }
-- 
2.33.0





From ck.hu at mediatek.com  Tue Sep  3 02:39:25 2024
From: ck.hu at mediatek.com (=?utf-8?B?Q0sgSHUgKOiDoeS/iuWFiSk=?=)
Date: Tue, 3 Sep 2024 09:39:25 +0000
Subject: [PATCH v4 2/3] media: platform: mtk-mdp3: Use cmdq_pkt_create()
 and cmdq_pkt_destroy()
In-Reply-To: <1d4e9e86-aaaf-4d19-b89f-6f7207ab72d8@gmail.com>
References: <20240901143259.16849-1-chunkuang.hu@kernel.org>
	 <20240901143259.16849-3-chunkuang.hu@kernel.org>
	 <1d4e9e86-aaaf-4d19-b89f-6f7207ab72d8@gmail.com>
Message-ID: <d5c512d06e013555397722137d5790dc8a627bfd.camel@mediatek.com>

Hi, Matthias:

On Mon, 2024-09-02 at 17:31 +0200, Matthias Brugger wrote:
>  	 
> External email : Please do not click links or open attachments until you have verified the sender or the content.
>  
> 
> On 01/09/2024 16:32, Chun-Kuang Hu wrote:
> > Use cmdq_pkt_create() and cmdq_pkt_destroy() common function
> > instead of implementing mdp3 version.
> > 
> > Signed-off-by: Chun-Kuang Hu <chunkuang.hu at kernel.org>
> > ---
> >   .../platform/mediatek/mdp3/mtk-mdp3-cmdq.c    | 46 ++-----------------
> >   .../platform/mediatek/mdp3/mtk-mdp3-cmdq.h    |  1 +
> >   2 files changed, 6 insertions(+), 41 deletions(-)
> > 
> > diff --git a/drivers/media/platform/mediatek/mdp3/mtk-mdp3-cmdq.c b/drivers/media/platform/mediatek/mdp3/mtk-mdp3-cmdq.c
> > index ef5dade35fd3..740a484c8eb4 100644
> > --- a/drivers/media/platform/mediatek/mdp3/mtk-mdp3-cmdq.c
> > +++ b/drivers/media/platform/mediatek/mdp3/mtk-mdp3-cmdq.c
> > @@ -471,43 +471,6 @@ static int mdp_path_config(struct mdp_dev *mdp, struct mdp_cmdq_cmd *cmd,
> >   return 0;
> >   }
> >   
> > -static int mdp_cmdq_pkt_create(struct cmdq_client *client, struct cmdq_pkt *pkt,
> > -       size_t size)
> > -{
> > -struct device *dev;
> > -dma_addr_t dma_addr;
> > -
> > -pkt->va_base = kzalloc(size, GFP_KERNEL);
> > -if (!pkt->va_base)
> > -return -ENOMEM;
> > -
> > -pkt->buf_size = size;
> > -pkt->cl = (void *)client;
> 
> cmdq_pkt_create does not set the callback. Why doesn't that break things?
> Same holds for the crtc driver that is already in linux-next.

This series is to remove pkt->cl.
For the helper function whick need pkt->cl, add parameter to pass the cmdq_client information.
Up to now, only cmdq_pkt_finalize() use pkt->cl, but it is replaced by cmdq_pkt_eoc() and cmdq_pkt_jump_rel() in [PATCH v4 1/3].
So this would not break any thing.

Regards,
CK

> 
> Regards,
> Matthias
> 
> > -
> > -dev = client->chan->mbox->dev;
> > -dma_addr = dma_map_single(dev, pkt->va_base, pkt->buf_size,
> > -  DMA_TO_DEVICE);
> > -if (dma_mapping_error(dev, dma_addr)) {
> > -dev_err(dev, "dma map failed, size=%u\n", (u32)(u64)size);
> > -kfree(pkt->va_base);
> > -return -ENOMEM;
> > -}
> > -
> > -pkt->pa_base = dma_addr;
> > -
> > -return 0;
> > -}
> > -
> > -static void mdp_cmdq_pkt_destroy(struct cmdq_pkt *pkt)
> > -{
> > -struct cmdq_client *client = (struct cmdq_client *)pkt->cl;
> > -
> > -dma_unmap_single(client->chan->mbox->dev, pkt->pa_base, pkt->buf_size,
> > - DMA_TO_DEVICE);
> > -kfree(pkt->va_base);
> > -pkt->va_base = NULL;
> > -}
> > -
> >   static void mdp_auto_release_work(struct work_struct *work)
> >   {
> >   struct mdp_cmdq_cmd *cmd;
> > @@ -538,7 +501,7 @@ static void mdp_auto_release_work(struct work_struct *work)
> >   wake_up(&mdp->callback_wq);
> >   }
> >   
> > -mdp_cmdq_pkt_destroy(&cmd->pkt);
> > +cmdq_pkt_destroy(mdp->cmdq_clt[cmd->pp_idx], &cmd->pkt);
> >   kfree(cmd->comps);
> >   cmd->comps = NULL;
> >   kfree(cmd);
> > @@ -578,7 +541,7 @@ static void mdp_handle_cmdq_callback(struct mbox_client *cl, void *mssg)
> >   if (refcount_dec_and_test(&mdp->job_count))
> >   wake_up(&mdp->callback_wq);
> >   
> > -mdp_cmdq_pkt_destroy(&cmd->pkt);
> > +cmdq_pkt_destroy(mdp->cmdq_clt[cmd->pp_idx], &cmd->pkt);
> >   kfree(cmd->comps);
> >   cmd->comps = NULL;
> >   kfree(cmd);
> > @@ -620,7 +583,7 @@ static struct mdp_cmdq_cmd *mdp_cmdq_prepare(struct mdp_dev *mdp,
> >   goto err_uninit;
> >   }
> >   
> > -ret = mdp_cmdq_pkt_create(mdp->cmdq_clt[pp_idx], &cmd->pkt, SZ_16K);
> > +ret = cmdq_pkt_create(mdp->cmdq_clt[pp_idx], &cmd->pkt, SZ_16K);
> >   if (ret)
> >   goto err_free_cmd;
> >   
> > @@ -700,6 +663,7 @@ static struct mdp_cmdq_cmd *mdp_cmdq_prepare(struct mdp_dev *mdp,
> >   cmd->comps = comps;
> >   cmd->num_comps = num_comp;
> >   cmd->mdp_ctx = param->mdp_ctx;
> > +cmd->pp_idx = pp_idx;
> >   
> >   kfree(path);
> >   return cmd;
> > @@ -711,7 +675,7 @@ static struct mdp_cmdq_cmd *mdp_cmdq_prepare(struct mdp_dev *mdp,
> >   err_free_comps:
> >   kfree(comps);
> >   err_destroy_pkt:
> > -mdp_cmdq_pkt_destroy(&cmd->pkt);
> > +cmdq_pkt_destroy(mdp->cmdq_clt[pp_idx], &cmd->pkt);
> >   err_free_cmd:
> >   kfree(cmd);
> >   err_uninit:
> > diff --git a/drivers/media/platform/mediatek/mdp3/mtk-mdp3-cmdq.h b/drivers/media/platform/mediatek/mdp3/mtk-mdp3-cmdq.h
> > index 53a30ad7e0b0..935ae9825728 100644
> > --- a/drivers/media/platform/mediatek/mdp3/mtk-mdp3-cmdq.h
> > +++ b/drivers/media/platform/mediatek/mdp3/mtk-mdp3-cmdq.h
> > @@ -35,6 +35,7 @@ struct mdp_cmdq_cmd {
> >   struct mdp_comp *comps;
> >   void *mdp_ctx;
> >   u8 num_comps;
> > +u8 pp_idx;
> >   };
> >   
> >   struct mdp_dev;

From johannes at sipsolutions.net  Tue Sep  3 02:54:01 2024
From: johannes at sipsolutions.net (Johannes Berg)
Date: Tue, 03 Sep 2024 11:54:01 +0200
Subject: [PATCH v2] wifi: mac80211: introduce EHT rate support in AQL
 airtime
In-Reply-To: <20240902054428.13273-1-mingyen.hsieh@mediatek.com>
References: <20240902054428.13273-1-mingyen.hsieh@mediatek.com>
Message-ID: <d7d8b63a1c13fb3770a521155b10b964dfa6b74a.camel@sipsolutions.net>

On Mon, 2024-09-02 at 13:44 +0800, Mingyen Hsieh wrote:
> 
> +	EHT_GROUP(1, EHT_GI_08, BW_20),
> +	EHT_GROUP(2, EHT_GI_08, BW_20),
> +	EHT_GROUP(3, EHT_GI_08, BW_20),
> +	EHT_GROUP(4, EHT_GI_08, BW_20),
> +	EHT_GROUP(5, EHT_GI_08, BW_20),
> +	EHT_GROUP(6, EHT_GI_08, BW_20),
> +	EHT_GROUP(7, EHT_GI_08, BW_20),
> +	EHT_GROUP(8, EHT_GI_08, BW_20),
> +	EHT_GROUP(9, EHT_GI_08, BW_20),
> +	EHT_GROUP(10, EHT_GI_08, BW_20),
> +	EHT_GROUP(11, EHT_GI_08, BW_20),
> +	EHT_GROUP(12, EHT_GI_08, BW_20),
> +	EHT_GROUP(13, EHT_GI_08, BW_20),
> +	EHT_GROUP(14, EHT_GI_08, BW_20),
> +	EHT_GROUP(15, EHT_GI_08, BW_20),
> +	EHT_GROUP(16, EHT_GI_08, BW_20),

This is really long and repetitive - maybe we can have a macro that does
the 1..16, and gets the other two arguments? Then we only have 16 lines
for the macro, and 16 invocations, rather than 256 new lines ...

> -	if (WARN_ON_ONCE((status->encoding != RX_ENC_HE && streams > 4) ||
> -			 (status->encoding == RX_ENC_HE && streams > 8)))
> +	if (WARN_ON_ONCE((status->encoding == RX_ENC_EHT && streams > 16) ||
> +			 (status->encoding == RX_ENC_HE && streams > 8) ||
> +			 (status->encoding < RX_ENC_HE && streams > 4)))

However, you also seem to consistently assume that 16 streams are
possible with EHT ... why?! That's not even supported by the spec, much
less being practical...

Fixing that would already halve the number of lines needed, though it
might still be good to have nested macros.

johannes


From u.kleine-koenig at baylibre.com  Tue Sep  3 03:46:57 2024
From: u.kleine-koenig at baylibre.com (Uwe =?utf-8?Q?Kleine-K=C3=B6nig?=)
Date: Tue, 3 Sep 2024 12:46:57 +0200
Subject: [PATCH v3 5/5] pwm: airoha: Add support for EN7581 SoC
In-Reply-To: <20240831-en7581-pinctrl-v3-5-98eebfb4da66@kernel.org>
References: <20240831-en7581-pinctrl-v3-0-98eebfb4da66@kernel.org>
 <20240831-en7581-pinctrl-v3-5-98eebfb4da66@kernel.org>
Message-ID: <yfqmlca6cnhrghpo5s6tml36tngmekcfbyjakxs7or7wtap3ka@7qlrxjowo4ou>

Hello,

On Sat, Aug 31, 2024 at 04:27:50PM +0200, Lorenzo Bianconi wrote:
> From: Benjamin Larsson <benjamin.larsson at genexis.eu>
> 
> Introduce driver for PWM module available on EN7581 SoC.
> 
> Signed-off-by: Benjamin Larsson <benjamin.larsson at genexis.eu>
> Co-developed-by: Lorenzo Bianconi <lorenzo at kernel.org>
> Signed-off-by: Lorenzo Bianconi <lorenzo at kernel.org>
> ---
>  drivers/pwm/Kconfig      |  10 ++
>  drivers/pwm/Makefile     |   1 +
>  drivers/pwm/pwm-airoha.c | 435 +++++++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 446 insertions(+)
> 
> diff --git a/drivers/pwm/Kconfig b/drivers/pwm/Kconfig
> index 3e53838990f5..0a78bda0707d 100644
> --- a/drivers/pwm/Kconfig
> +++ b/drivers/pwm/Kconfig
> @@ -47,6 +47,16 @@ config PWM_AB8500
>  	  To compile this driver as a module, choose M here: the module
>  	  will be called pwm-ab8500.
>  
> +config PWM_AIROHA
> +	tristate "Airoha PWM support"
> +	depends on ARCH_AIROHA || COMPILE_TEST
> +	depends on OF
> +	help
> +	  Generic PWM framework driver for Airoha SoC.
> +
> +	  To compile this driver as a module, choose M here: the module
> +	  will be called pwm-airoha.
> +
>  config PWM_APPLE
>  	tristate "Apple SoC PWM support"
>  	depends on ARCH_APPLE || COMPILE_TEST
> diff --git a/drivers/pwm/Makefile b/drivers/pwm/Makefile
> index 0be4f3e6dd43..7ee61822d88d 100644
> --- a/drivers/pwm/Makefile
> +++ b/drivers/pwm/Makefile
> @@ -1,6 +1,7 @@
>  # SPDX-License-Identifier: GPL-2.0
>  obj-$(CONFIG_PWM)		+= core.o
>  obj-$(CONFIG_PWM_AB8500)	+= pwm-ab8500.o
> +obj-$(CONFIG_PWM_AIROHA)	+= pwm-airoha.o
>  obj-$(CONFIG_PWM_APPLE)		+= pwm-apple.o
>  obj-$(CONFIG_PWM_ATMEL)		+= pwm-atmel.o
>  obj-$(CONFIG_PWM_ATMEL_HLCDC_PWM)	+= pwm-atmel-hlcdc.o
> diff --git a/drivers/pwm/pwm-airoha.c b/drivers/pwm/pwm-airoha.c
> new file mode 100644
> index 000000000000..54dc12d20da4
> --- /dev/null
> +++ b/drivers/pwm/pwm-airoha.c
> @@ -0,0 +1,435 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * Copyright 2022 Markus Gothe <markus.gothe at genexis.eu>
> + */

Would you please add a "Limitations" paragraph here covering the
following questions:

 - How does the hardware behave on changes of configuration (does it
   complete the currently running period? Are there any glitches?)
 - How does the hardware behave on disabling?

Please stick to the format used in several other drivers such that 

	sed -rn '/Limitations:/,/\*\/?$/p' drivers/pwm/*.c

emits the informations.

> +
> +#include <linux/bitfield.h>
> +#include <linux/err.h>
> +#include <linux/io.h>
> +#include <linux/iopoll.h>
> +#include <linux/mfd/airoha-en7581-mfd.h>
> +#include <linux/module.h>
> +#include <linux/of.h>
> +#include <linux/platform_device.h>
> +#include <linux/pwm.h>
> +#include <linux/gpio.h>
> +#include <linux/bitops.h>
> +#include <asm/div64.h>
> +
> +#define REG_SGPIO_CFG			0x0024
> +#define REG_FLASH_CFG			0x0038
> +#define REG_CYCLE_CFG			0x0098
> +
> +#define REG_SGPIO_LED_DATE		0x0000
> +#define SGPIO_LED_SHIFT_FLAG		BIT(31)
> +#define SGPIO_LED_DATA			GENMASK(16, 0)

Please make the bit fields's names start with the register name.

> +#define REG_SGPIO_CLK_DIVR		0x0004
> +#define REG_SGPIO_CLK_DLY		0x0008
> +
> +#define REG_SIPO_FLASH_MODE_CFG		0x000c
> +#define SERIAL_GPIO_FLASH_MODE		BIT(1)
> +#define SERIAL_GPIO_MODE		BIT(0)
> +
> +#define REG_GPIO_FLASH_PRD_SET(_n)	(0x0004 + ((_n) << 2))
> +#define GPIO_FLASH_PRD_MASK(_n)		GENMASK(15 + ((_n) << 4), ((_n) << 4))
> +
> +#define REG_GPIO_FLASH_MAP(_n)		(0x0014 + ((_n) << 2))
> +#define GPIO_FLASH_SETID_MASK(_n)	GENMASK(2 + ((_n) << 2), ((_n) << 2))
> +#define GPIO_FLASH_EN(_n)		BIT(3 + ((_n) << 2))
> +
> +#define REG_SIPO_FLASH_MAP(_n)		(0x001c + ((_n) << 2))
> +
> +#define REG_CYCLE_CFG_VALUE(_n)		(0x0000 + ((_n) << 2))
> +#define WAVE_GEN_CYCLE_MASK(_n)		GENMASK(7 + ((_n) << 3), ((_n) << 3))
> +
> +struct airoha_pwm {
> +	void __iomem *sgpio_cfg;
> +	void __iomem *flash_cfg;
> +	void __iomem *cycle_cfg;
> +
> +	struct device_node *np;
> +	u64 initialized;
> +
> +	struct {
> +		/* Bitmask of PWM channels using this bucket */
> +		u64 used;
> +		u64 period_ns;
> +		u64 duty_ns;
> +		enum pwm_polarity polarity;
> +	} bucket[8];
> +};
> +
> +/*
> + * The first 16 GPIO pins, GPIO0-GPIO15, are mapped into 16 PWM channels, 0-15.
> + * The SIPO GPIO pins are 16 pins which are mapped into 17 PWM channels, 16-32.

How can 16 pins be mapped to 17 PWM channels?

> + * However, we've only got 8 concurrent waveform generators and can therefore
> + * only use up to 8 different combinations of duty cycle and period at a time.

That's an information to add to the Limitations paragraph.

> + */
> +#define PWM_NUM_GPIO	16
> +#define PWM_NUM_SIPO	17
> +
> +/* The PWM hardware supports periods between 4 ms and 1 s */
> +#define PERIOD_MIN_NS	4000000
> +#define PERIOD_MAX_NS	1000000000
> +/* It is represented internally as 1/250 s between 1 and 250 */
> +#define PERIOD_MIN	1
> +#define PERIOD_MAX	250
> +/* Duty cycle is relative with 255 corresponding to 100% */
> +#define DUTY_FULL	255
> +
> +static u32 airoha_pwm_rmw(struct airoha_pwm *pc, void __iomem *addr,
> +			  u32 mask, u32 val)
> +{
> +	val |= (readl(addr) & ~mask);
> +	writel(val, addr);
> +
> +	return val;
> +}

pc is unused here, please drop it.

> +#define airoha_pwm_sgpio_rmw(pc, offset, mask, val)				\
> +	airoha_pwm_rmw((pc), (pc)->sgpio_cfg + (offset), (mask), (val))
> +#define airoha_pwm_flash_rmw(pc, offset, mask, val)				\
> +	airoha_pwm_rmw((pc), (pc)->flash_cfg + (offset), (mask), (val))
> +#define airoha_pwm_cycle_rmw(pc, offset, mask, val)				\
> +	airoha_pwm_rmw((pc), (pc)->cycle_cfg + (offset), (mask), (val))
> +
> +#define airoha_pwm_sgpio_set(pc, offset, val)					\
> +	airoha_pwm_sgpio_rmw((pc), (offset), 0, (val))

That does the right thing, but I'd consider

	#define airoha_pwm_sgpio_set(pc, offset, val)					\
		airoha_pwm_sgpio_rmw((pc), (offset), (val), (val))

to be more understandable (or ~0 instead of the last (val)?)

> +#define airoha_pwm_sgpio_clear(pc, offset, mask)				\
> +	airoha_pwm_sgpio_rmw((pc), (offset), (mask), 0)
> +#define airoha_pwm_flash_set(pc, offset, val)					\
> +	airoha_pwm_flash_rmw((pc), (offset), 0, (val))
> +#define airoha_pwm_flash_clear(pc, offset, mask)				\
> +	airoha_pwm_flash_rmw((pc), (offset), (mask), 0)
> +
> +static int airoha_pwm_get_waveform(struct airoha_pwm *pc, u64 duty_ns,
> +				   u64 period_ns)

Given that "waveform" will gain some specific semantic soon, but this
usage is different, I'd like to see this function renamed.

> +{
> +	int i;
> +
> +	for (i = 0; i < ARRAY_SIZE(pc->bucket); i++) {
> +		if (!pc->bucket[i].used)
> +			continue;
> +
> +		if (duty_ns == pc->bucket[i].duty_ns &&
> +		    period_ns == pc->bucket[i].period_ns)
> +			return i;
> +
> +		/*
> +		 * Unlike duty cycle zero, which can be handled by
> +		 * disabling PWM, a generator is needed for full duty
> +		 * cycle but it can be reused regardless of period
> +		 */
> +		if (duty_ns == DUTY_FULL && pc->bucket[i].duty_ns == DUTY_FULL)
> +			return i;
> +	}
> +
> +	return -1;
> +}
> +
> +static void airoha_pwm_free_waveform(struct airoha_pwm *pc, unsigned int hwpwm)
> +{
> +	int i;
> +
> +	for (i = 0; i < ARRAY_SIZE(pc->bucket); i++)
> +		pc->bucket[i].used &= ~BIT_ULL(hwpwm);
> +}
> +
> +static int airoha_pwm_consume_waveform(struct airoha_pwm *pc,
> +				       u64 duty_ns, u64 period_ns,
> +				       enum pwm_polarity polarity,
> +				       unsigned int hwpwm)
> +{
> +	int id = airoha_pwm_get_waveform(pc, duty_ns, period_ns);
> +
> +	if (id < 0) {
> +		int i;
> +
> +		/* find an unused waveform generator */
> +		for (i = 0; i < ARRAY_SIZE(pc->bucket); i++) {
> +			if (!(pc->bucket[i].used & ~BIT_ULL(hwpwm))) {
> +				id = i;
> +				break;
> +			}
> +		}
> +	}
> +
> +	if (id >= 0) {
> +		airoha_pwm_free_waveform(pc, hwpwm);
> +		pc->bucket[id].used |= BIT_ULL(hwpwm);
> +		pc->bucket[id].period_ns = period_ns;
> +		pc->bucket[id].duty_ns = duty_ns;
> +		pc->bucket[id].polarity = polarity;
> +	}

One downside of the (nearly) maximal flexibility implemented here is
that if you have 9 (or more) requested pwm devices configuration is
quite limited.  So it might happen that a consumer changes the
configuration for pwm#2 from pwm_state A to pwm_state B but cannot
change back to A later.

If you limit the number of requested pwm devices to 8, the code gets a
tad simpler (because you can map a fixed bucket to each pwm device and
don't need to search during .apply()) and each consumer has maximal
freedom to configure its device.

> +
> +	return id;
> +}
> +
> +static int airoha_pwm_sipo_init(struct airoha_pwm *pc)
> +{
> +	u32 clk_divr_val = 3, sipo_clock_delay = 1;
> +	u32 val, sipo_clock_divisor = 32;
> +
> +	if (!(pc->initialized >> PWM_NUM_GPIO))
> +		return 0;
> +
> +	/* Select the right shift register chip */
> +	if (of_property_read_bool(pc->np, "hc74595"))
> +		airoha_pwm_sgpio_set(pc, REG_SIPO_FLASH_MODE_CFG,
> +				     SERIAL_GPIO_MODE);
> +	else
> +		airoha_pwm_sgpio_clear(pc, REG_SIPO_FLASH_MODE_CFG,
> +				       SERIAL_GPIO_MODE);
> +
> +	if (!of_property_read_u32(pc->np, "sipo-clock-divisor",
> +				  &sipo_clock_divisor)) {
> +		switch (sipo_clock_divisor) {
> +		case 4:
> +			clk_divr_val = 0;
> +			break;
> +		case 8:
> +			clk_divr_val = 1;
> +			break;
> +		case 16:
> +			clk_divr_val = 2;
> +			break;
> +		case 32:
> +			clk_divr_val = 3;
> +			break;
> +		default:
> +			return -EINVAL;
> +		}
> +	}
> +	/* Configure shift register timings */
> +	writel(clk_divr_val, pc->sgpio_cfg + REG_SGPIO_CLK_DIVR);
> +
> +	of_property_read_u32(pc->np, "sipo-clock-delay", &sipo_clock_delay);
> +	if (sipo_clock_delay < 1 || sipo_clock_delay > sipo_clock_divisor / 2)
> +		return -EINVAL;
> +
> +	/*
> +	 * The actual delay is sclkdly + 1 so subtract 1 from
> +	 * sipo-clock-delay to calculate the register value
> +	 */
> +	sipo_clock_delay--;
> +	writel(sipo_clock_delay, pc->sgpio_cfg + REG_SGPIO_CLK_DLY);
> +
> +	/*
> +	 * It it necessary to after muxing explicitly shift out all
> +	 * zeroes to initialize the shift register before enabling PWM
> +	 * mode because in PWM mode SIPO will not start shifting until
> +	 * it needs to output a non-zero value (bit 31 of led_data
> +	 * indicates shifting in progress and it must return to zero
> +	 * before led_data can be written or PWM mode can be set)
> +	 */
> +	if (readl_poll_timeout(pc->sgpio_cfg + REG_SGPIO_LED_DATE, val,
> +			       !(val & SGPIO_LED_SHIFT_FLAG), 10,
> +			       200 * USEC_PER_MSEC))
> +		return -ETIMEDOUT;
> +
> +	airoha_pwm_sgpio_clear(pc, REG_SGPIO_LED_DATE, SGPIO_LED_DATA);
> +	if (readl_poll_timeout(pc->sgpio_cfg + REG_SGPIO_LED_DATE, val,
> +			       !(val & SGPIO_LED_SHIFT_FLAG), 10,
> +			       200 * USEC_PER_MSEC))
> +		return -ETIMEDOUT;
> +
> +	/* Set SIPO in PWM mode */
> +	airoha_pwm_sgpio_set(pc, REG_SIPO_FLASH_MODE_CFG,
> +			     SERIAL_GPIO_FLASH_MODE);
> +
> +	return 0;
> +}
> +
> +static void airoha_pwm_config_waveform(struct airoha_pwm *pc, int index,
> +				       u64 duty_ns, u64 period_ns,
> +				       enum pwm_polarity polarity)
> +{
> +	u32 period, duty, mask, val;
> +
> +	duty = clamp_val(div64_u64(DUTY_FULL * duty_ns, period_ns), 0,
> +			 DUTY_FULL);

DUTY_FULL * duty_ns might overflow. Also the calculation is wrong.
For example if the following is requested:

	.period = 23999999,
	.duty_cycle = 8000000,

you're supposed to configure period = 16000000 ns and duty_cycle =
8000000 ns.

(I.e.: Pick the biggest possible period not bigger than the requested
period. For that pick the biggest possible duty_cycle not bigger than
the requested duty_cycle.)

If you implement .get_state() in a way to return the actually configured
state, enabling PWM_DEBUG and intensive testing helps to get this right.

> +	if (polarity == PWM_POLARITY_INVERSED)
> +		duty = DUTY_FULL - duty;

This alone doesn't switch the polarity of the signal. Please only claim
to be able to implement the settings that the hardware actually can do.

> +	period = clamp_val(div64_u64(25 * period_ns, 100000000), PERIOD_MIN,
> +			   PERIOD_MAX);
> +
> +	/* Configure frequency divisor */
> +	mask = WAVE_GEN_CYCLE_MASK(index % 4);
> +	val = (period << __ffs(mask)) & mask;
> +	airoha_pwm_cycle_rmw(pc, REG_CYCLE_CFG_VALUE(index / 4), mask, val);
> +
> +	/* Configure duty cycle */
> +	duty = ((DUTY_FULL - duty) << 8) | duty;
> +	mask = GPIO_FLASH_PRD_MASK(index % 2);
> +	val = (duty << __ffs(mask)) & mask;
> +	airoha_pwm_flash_rmw(pc, REG_GPIO_FLASH_PRD_SET(index / 2), mask, val);
> +}
> +
> +static void airoha_pwm_config_flash_map(struct airoha_pwm *pc,
> +					unsigned int hwpwm, int index)
> +{
> +	u32 addr, mask, val;
> +
> +	if (hwpwm < PWM_NUM_GPIO) {
> +		addr = REG_GPIO_FLASH_MAP(hwpwm / 8);
> +	} else {
> +		addr = REG_SIPO_FLASH_MAP(hwpwm / 8);
> +		hwpwm -= PWM_NUM_GPIO;
> +	}
> +
> +	if (index < 0) {
> +		/*
> +		 * Change of waveform takes effect immediately but
> +		 * disabling has some delay so to prevent glitching
> +		 * only the enable bit is touched when disabling
> +		 */
> +		airoha_pwm_flash_clear(pc, addr, GPIO_FLASH_EN(hwpwm % 8));
> +		return;
> +	}
> +
> +	mask = GPIO_FLASH_SETID_MASK(hwpwm % 8);
> +	val = ((index & 7) << __ffs(mask)) & mask;
> +	airoha_pwm_flash_rmw(pc, addr, mask, val);
> +	airoha_pwm_flash_set(pc, addr, GPIO_FLASH_EN(hwpwm % 8));
> +}
> +
> +static int airoha_pwm_config(struct airoha_pwm *pc, struct pwm_device *pwm,
> +			     u64 duty_ns, u64 period_ns,
> +			     enum pwm_polarity polarity)
> +{
> +	int index = -1;
> +
> +	index = airoha_pwm_consume_waveform(pc, duty_ns, period_ns, polarity,
> +					    pwm->hwpwm);
> +	if (index < 0)
> +		return -EBUSY;
> +
> +	if (!(pc->initialized & BIT_ULL(pwm->hwpwm)) &&
> +	    pwm->hwpwm >= PWM_NUM_GPIO)
> +		airoha_pwm_sipo_init(pc);
> +
> +	if (index >= 0) {
> +		airoha_pwm_config_waveform(pc, index, duty_ns, period_ns,
> +					   polarity);
> +		airoha_pwm_config_flash_map(pc, pwm->hwpwm, index);
> +	} else {
> +		airoha_pwm_config_flash_map(pc, pwm->hwpwm, index);
> +		airoha_pwm_free_waveform(pc, pwm->hwpwm);
> +	}
> +
> +	pc->initialized |= BIT_ULL(pwm->hwpwm);
> +
> +	return 0;
> +}
> +
> +static void airoha_pwm_free(struct pwm_chip *chip, struct pwm_device *pwm)
> +{
> +	struct airoha_pwm *pc = pwmchip_get_drvdata(chip);
> +
> +	/* Disable PWM and release the waveform */
> +	airoha_pwm_config_flash_map(pc, pwm->hwpwm, -1);
> +	airoha_pwm_free_waveform(pc, pwm->hwpwm);
> +
> +	pc->initialized &= ~BIT_ULL(pwm->hwpwm);
> +	if (!(pc->initialized >> PWM_NUM_GPIO))
> +		airoha_pwm_sgpio_clear(pc, REG_SIPO_FLASH_MODE_CFG,
> +				       SERIAL_GPIO_FLASH_MODE);
> +
> +	/*
> +	 * Clear the state to force re-initialization the next time
> +	 * this PWM channel is used since we cannot retain state in
> +	 * hardware due to limited number of waveform generators
> +	 */
> +	memset(&pwm->state, 0, sizeof(pwm->state));

Please don't reconfigure the hardware in .free(). Instead assume that
the consumer disabled the PWM before releasing it or that they know what
they do.

Also don't write to pwm->state, that is supposed to only happen in the
core.

> +}
> +
> +static int airoha_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm,
> +			    const struct pwm_state *state)
> +{
> +	struct airoha_pwm *pc = pwmchip_get_drvdata(chip);
> +	u64 duty = state->enabled ? state->duty_cycle : 0;
> +
> +	if (!state->enabled) {
> +		airoha_pwm_free(chip, pwm);
> +		return 0;
> +	}
> +
> +	if (state->period < PERIOD_MIN_NS || state->period > PERIOD_MAX_NS)
> +		return -EINVAL;

Please handle state->period > PERIOD_MAX_NS by configuring a period of
PERIOD_MAX_NS.

> +	return airoha_pwm_config(pc, pwm, duty, state->period,
> +				 state->polarity);
> +}
> +
> +static int airoha_pwm_get_state(struct pwm_chip *chip, struct pwm_device *pwm,
> +				struct pwm_state *state)
> +{
> +	struct airoha_pwm *pc = pwmchip_get_drvdata(chip);
> +	int i;
> +
> +	/* find hwpwm in waveform generator bucket */
> +	for (i = 0; i < ARRAY_SIZE(pc->bucket); i++) {
> +		if (pc->bucket[i].used & BIT_ULL(pwm->hwpwm)) {
> +			state->enabled = pc->initialized & BIT_ULL(pwm->hwpwm);
> +			state->polarity = pc->bucket[i].polarity;
> +			state->period = pc->bucket[i].period_ns;
> +			state->duty_cycle = pc->bucket[i].duty_ns;
> +			break;
> +		}
> +	}
> +
> +	if (i == ARRAY_SIZE(pc->bucket))
> +		state->enabled = false;
> +
> +	return 0;
> +}
> +
> +static const struct pwm_ops airoha_pwm_ops = {
> +	.get_state = airoha_pwm_get_state,
> +	.apply = airoha_pwm_apply,
> +	.free = airoha_pwm_free,
> +};
> +
> +static int airoha_pwm_probe(struct platform_device *pdev)
> +{
> +	struct device *dev = &pdev->dev;
> +	struct airoha_mfd *mfd;
> +	struct airoha_pwm *pc;
> +	struct pwm_chip *chip;
> +
> +	/* Assign parent MFD of_node to dev */
> +	dev->of_node = of_node_get(dev->parent->of_node);

I think you want
device_set_of_node_from_dev(dev->parent, dev)
here.

> +	mfd = dev_get_drvdata(dev->parent);
> +
> +	chip = devm_pwmchip_alloc(dev, PWM_NUM_GPIO + PWM_NUM_SIPO,
> +				  sizeof(*pc));
> +	if (IS_ERR(chip))
> +		return PTR_ERR(chip);
> +
> +	pc = pwmchip_get_drvdata(chip);
> +	pc->np = dev->of_node;
> +	pc->sgpio_cfg = mfd->base + REG_SGPIO_CFG;
> +	pc->flash_cfg = mfd->base + REG_FLASH_CFG;
> +	pc->cycle_cfg = mfd->base + REG_CYCLE_CFG;

Is it really worth to store these values in the private data struct? My
intuition would be to only store .base in pc and then define the
register accessors macros like:

	#define airoha_pwm_cycle_rmw(pc, offset, mask, val)				\
		airoha_pwm_rmw((pc), (pc)->base + REG_CYCLE_CFG + (offset), (mask), (val))

> +	chip->ops = &airoha_pwm_ops;
> +	chip->of_xlate = of_pwm_xlate_with_flags;

Please don't assign .of_xlate, the core does

        if (!chip->of_xlate)
                chip->of_xlate = of_pwm_xlate_with_flags;

> +
> +	return devm_pwmchip_add(&pdev->dev, chip);
> +}
> +
> +static struct platform_driver airoha_pwm_driver = {
> +	.driver = {
> +		.name = "airoha-pwm",
> +	},
> +	.probe = airoha_pwm_probe,
> +};
> +module_platform_driver(airoha_pwm_driver);
> +
> +MODULE_AUTHOR("Lorenzo Bianconi <lorenzo at kernel.org>");
> +MODULE_AUTHOR("Markus Gothe <markus.gothe at genexis.eu>");
> +MODULE_AUTHOR("Benjamin Larsson <benjamin.larsson at genexis.eu>");
> +MODULE_DESCRIPTION("Airoha EN7581 PWM driver");
> +MODULE_LICENSE("GPL");

Best regards
Uwe
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-mediatek/attachments/20240903/9469338f/attachment-0001.sig>

From jwboyer at kernel.org  Tue Sep  3 04:19:24 2024
From: jwboyer at kernel.org (Josh Boyer)
Date: Tue, 3 Sep 2024 07:19:24 -0400
Subject: [PATCH] linux-firmware: update firmware for MT7921 WiFi device
In-Reply-To: <e1f2a561dae11ab53b207e4cabb38de3829b54d0.1724978601.git.deren.wu@mediatek.com>
References: <e1f2a561dae11ab53b207e4cabb38de3829b54d0.1724978601.git.deren.wu@mediatek.com>
Message-ID: <CA+5PVA6VH8+m0mgL3Jo5pxGiBMQrAwDVx5op_GYJWe9FFDsNVA@mail.gmail.com>

Applied and pushed out.

https://gitlab.com/kernel-firmware/linux-firmware/-/merge_requests/286

josh

On Fri, Aug 30, 2024 at 5:36?AM Deren Wu <Deren.Wu at mediatek.com> wrote:
>
> From: Deren Wu <deren.wu at mediatek.com>
>
> Update binary firmware for MT7921 WiFi devices
>
> File: mediatek/WIFI_MT7961_patch_mcu_1_2_hdr.bin
> Version: 20240826150948a
> File: mediatek/WIFI_RAM_CODE_MT7961_1.bin
> Version: 20240826151030
>
> Signed-off-by: Deren Wu <deren.wu at mediatek.com>
> ---
>  WHENCE                                     |   4 ++--
>  mediatek/WIFI_MT7961_patch_mcu_1_2_hdr.bin | Bin 92192 -> 92192 bytes
>  mediatek/WIFI_RAM_CODE_MT7961_1.bin        | Bin 794804 -> 792420 bytes
>  3 files changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/WHENCE b/WHENCE
> index 4d9cd340..2b10e687 100644
> --- a/WHENCE
> +++ b/WHENCE
> @@ -5762,9 +5762,9 @@ Licence: Redistributable. See LICENCE.mediatek for details.
>  Driver: mt7921 - MediaTek MT7921 Wireless MACs
>
>  File: mediatek/WIFI_MT7961_patch_mcu_1_2_hdr.bin
> -Version: 20240716150944a
> +Version: 20240826150948a
>  File: mediatek/WIFI_RAM_CODE_MT7961_1.bin
> -Version: 20240716151027
> +Version: 20240826151030
>
>  Licence: Redistributable. See LICENCE.mediatek for details.
>
> diff --git a/mediatek/WIFI_MT7961_patch_mcu_1_2_hdr.bin b/mediatek/WIFI_MT7961_patch_mcu_1_2_hdr.bin
> index a0aa3fe1cd0490b366dcb2b33428d3108067e65d..960e23cdb131a73e959590c32b5cfc06762852de 100644
> GIT binary patch
> delta 14572
> zc-pOdeOy%4_Ws^8!@R)29OPX<1_2RY at io#B2OJL`H67Cu$rLM*O3ljD%9?|WhJ{9M
> zUqAuJG&55~2bIjaqnUBd)LT;Ib-ZY1R$c|v7-)p=+UJ}Z2fe at lejh(G^Q>pBz4qGc
> z?6dYd!)QC_XFKN?G&pte(A2cS!v_sZeROEr{-Dh`VPS9yGAK(>Wn2kz$x6@#c?miX
> zpBH<Sph$fQiqV&lj1DK+B|EG+&8BLCvIo7Vx97_<<d0rA82Y?pnAoSt*=qpWzS|LO
> z<yiy<$iJV7QEg}SfaCqgfz at h$2iMv;(#^XOhn@(rUr~<5Btt!T#w`;<oH>qHSu;4-
> zyw<uXy^dE+QlM~l9`Z9ki>4VKyI0fRj~$4R^*LVYOr$ceY)@qMI%IvG%5J+ATYE{9
> z<w_9_B{uaY)kG`eT!$x;bWH>|$|?g4?|d)#{J~8_MG)#xgU%f%;kAG<VE=5SI%&||
> zJ1AmxKSR)1y=W6qN-8x2N0l0M9nVPG=U`Negl_^K3>ar4`4zy!M6BoyxDVg}@Vtxo
> z`!5ZF6v;oAqMpy^ajo~BAnX0(HIzRE(gO0OfBXb0{TrlgH}9;3B%gPL8MLaLx^8Y{
> zJ!V*_%Hdo~^>k$ciw&_IvmrzAg0z6zyAh1om7~TA&UNl8=@T#zPb4`3v0>MECD at D*
> zMyQ<ef;5B_2PES-QWLNN-z4L;qwsH}NINQ|&Wa2%-FiCX2dG^Ata{Ehbp>hAj>OwY
> zXkbG0<6c%k at cFj%`HKDVz)x`CBH`kQ7e#GX>ki5+MbfHE;o7IO3}lsAQN^|X{TG$N
> zSL?mu6v1bXH7-<+9q>A4LUEn&c^tM7<~rMdg;z5h$s>iH=h+~HIwC?5&vR&8Pp<Rt
> zk2oZEa7YE4ZNg2kyv8AAAiUb(^>r#347DO_Jm=E1)pcX%Ii at P)a at j^jorXix_EDUT
> z5DtY;x_vZGGQZov=&!AMSQx{(%v+?-)6%Dd9O^b^LIKx#uRqt>@u(H2qtSm_F=!rV
> zBN at E{@xju9_XvKeENm8K4Qz^pb_^*9$Yxe1LJBgtwuo-T6vE+O$=Z+zOSMn-OwL4B
> zEB}`n1x+#p_5OVT3j3n2S5rZIVmn+u%`mvkI^kyU+zO8S<J<++m}_;fWg}p%s8Aus
> zQK)F5Y^^Xpz+K?R?J|%v($#xQVKp*-c6Te?^<kWALKchkVbulJcr(&MQYMTh>7kGK
> zZQ at +7#*jBcV|6__7d}I8Z|dUj2C_4h!`Dbt=&MNwrEo5`%fxHFb|Tl>o at mtzmUD&o
> zcS%v$D13pO42utbL71t~Gt>BIh%0P#LX$Xl<;j8s{wmkn_Jvh1?veI;;^*J-Bqw|Z
> z&LK77LxvPv<E?V at KwihS{j|y$qStJkofC-zk&X{?XxL=OR4Y=%%bU5jsAt?OAPH?D
> zgGl#?=)k!?<7Si0h~yzX>nG4lsmiI(f&}**5Zq%|PGo0<iIHUkJA-!s8(<i9KkWgz
> zq&y<Z@^yV+j#?fx0E0d1R9lrM2Cc9fxwhb2R!4nAj#}2uiX|`oz{h{P_$YEF)c+#H
> z^(OByXtO at eQ5R@7xpEd2z@<VKxcq<dO819uY()&zONbgl)GDs+$KPR%svOi0M|j*T
> z?}2;&F79ib2?nhRJN0yF%3nxsWUT7PdVg at u5^H2a!gp3ocSCbQj#{hX at kaB;QqHyG
> zO)GL2aIV*PQyoc-iX*>Ah9<nhwe5MHjX=1tpf(Ejm8`am+6}-l1022KR&A?VM)Xl*
> za29zkYM^Cc&Wpddfu4sMV6%wDQ9T06Ym$Ul0ZtU}57gTbWYUVf{{_H-B31?gmPvRm
> zU^(2Ut)0^$Ev+J}Dh5{a?$-n!6GS{y-2>|O8mMTxj{cl${$Y_0nhCX at 283ZRy;hw;
> z&!XA#x}hK~fwRev%Cr8i>j&~1AS(s=c3mRKZ+gzIS$~p+-TTJxhgym<IN==<g;0(D
> zTH^IlZav!sGqt{(Mryk!Syscfa=p}tR%&^n7rmXHyZ!u`aNjyEU+lJlzPnWpcp;!L
> zkUL!?g!dk98`O9?+)2i2usyfRgyc=tnQ)ipa;~TMHem+?yCDq4@!>{fR2z|>0&ql!
> zj?9dH87Gl5(PJ$~#S_%leE$s9E|<6#AFf#9Zu at ZM5_iXk+aqyzeYn#S_m>ZMQRISb
> ztv=)pVv7lz=XNIAmK+*wTiRUknYww!&Q#mWwga}?+lFp?jdOin=sw={$Pc(G*10uC
> zXX4J(bhP~w;lS&3<DF3HT|acS)<$})Nlfel%Twv<?R5i~?I$=_-^Jj0R2N&bGoeNa
> zyXw}1b87Qz@*ZqGw99SH4{^n|mWQ}<+iefW-p`xujx(`F=~*i0IuUtD<vxC}=T5b4
> z3P@>;f=3WWkKUKv$N64-7S|To<US7VROh`GGO3427N{lbdkl-%YJ5U3`%%00@>$pY
> zIRo{iu}9yCR7Vh)Kk5iD#JYQ0F>Eoo|H%Z>GcFm=A>-qs at mP`<w*U_(=i|Q6{QzY}
> z!L`NetWb1h$L%)#e=u$&e9uqu6Qo~4f^H|=F~)+P{AK<tuI&s*W+kNH^Q0(Y8xAIY
> z5<d#4g`GK(_7>mT$%Vw}xS9-3nu9~h`lR^TxzN{4<63XsFd^B at 4#TGXR~(aC&<kSw
> z7)Z6b;}FVCXSO%Gk4+-T-$yea#+@@U0gKX0W|%YO*2GQw%}q-F%Gv9j$BKmZnv-1X
> zKE^-SHTi+CkMDc(y9}P*BIUilz(+|=a;!xUrD6@}p#e~o0Delu^2LCk6tV0>z%xaR
> zivUlQ_>+LgOZJU`Imr(Lm=!T<Fa)vPCENixO7imx*qGf8@>g<#rd-;fJM2As&j<=@
> zbQ<`4!y4a31Zhdh at ctp7F+AOcH`>n)m&@=p`}wq3B}Vp^^vO6nd*dV5u5OYWi9_8Y
> zy9=fAx=PGIki$OH7>x08vM{3!k0<$=?_mYGlUabjB1^^;;sVk>W=g~&KA&IZOp=DI
> zhqV96wKi at h&zNq(Vf*;lgZKbZvq at M(2C$>>8T)*;FUD!4G>Z!u$S1c?tPbW}NBWQ(
> zS<mXGY<#3?6`x{4s(h|(-*_@>9EYpzyT<LsmPy%+7V)eJ`CWw*V<O)RkQq=W%UB#8
> zS%QYjqp3!l251-?1345lf;^aNWUybWdYeK#8kxfQs!<JG0=tbzlM0bmuv!dEn33tN
> zpt#<j?_~z}S|9^N(of5?AZa`<_ja<8x=u6merE^Evzg3wwZyx;7B at 4Q<!W(CkZzE~
> z34Q1ME0bBQ5kh|sxU<5dDEc~&L257mmB2$r_I{ShEEDaiblA)9_4=XGrvje~Xd9`X
> z5M?Rz%I~w0ol=x+0;FI%<>^ZHzT>rd3+C2kGrY>Hdp)NVr+M`YvKgazA*l4Cm!Ff#
> z7}Q>VcDsUW{o at MN_7jN5L9Ows&E8>bp07I-Sv>Kzv5GFPWP+=eo)LTQ`g+=Pn^mU<
> z7ORUIO(?eH5CpB%!{b}qo-1U)V{@>9lsvWt9#%>oOC!%sN{QW&9=ZKay(%Y7t>M}(
> ztOe;t8rtn&F9+!zvU}3|(HCL)vYq?I%l+vEUfGOWWVb>8k6bcsa(qM{@2HD}M^FVk
> zf`-wUf)Lo*N%7?9gxw~j=<aC;Osrt%NA0ZflHGc8YI1badtjI9X%kGz;ITVcD#0>B
> z*e=V!axw8Y$0a-umV-PEgvn2^qYu9k)T3ZGl}t3p;c at o)=ILsUx(Qd0;o6QX$m#6I
> za4G3NV*<WP^58v{9GEc{FC(rQ$Kc*Ol5<k_9wIBAT5pj<tHh3go7WGjQa<2E0Ym$*
> zy93xD@;DRlNU;*Bb^|twSbYibXu$Gpq=83{u{T8C|4HDbO6T7Luv7v4p<=S*ME|lF
> zz!O-DD3pW1i3&L#kR=T`1vpaV6_lSW;X1&RMC`W$aHxot*8vBMV*?a`83{vhtWLsE
> zo>`TIZ$PKaD#aD((g6F3j#PsI%S0n>4qzl<XeP&YO8BTDD13v61D63_FJZ`BI1zDB
> zIM}--{5JR*C}CJY_(s4M5Old9tP>~J90H>_(MZ<<I93c!K`+N(5&P3iFjTbH0v`K^
> z$g2?G-z97Ud|k>YU9nl@)sX429TEor1IFGG1?_S$N*8fpDBw}z;J}+OpjpI0sdnS6
> zzm at pk#4tA&pC&nT6Yvr8_S`tUn^ew?!WE<z at EX!EH!0(dH2G%#;$u1aelF`kgEstU
> zuFbXxI;AUubOEI2LHfly5L)C#AUy-+QDdDfNx5*;>F0)P(?T}OT5$0(peB*ry!g?h
> z*b=old;L3&Ir*V2R!8aEX^K*rg5g808O0~Ss(((txz*}OFMZ0IzU;u_G{t6_kB=V2
> zkr#_~<WgP~mXS+yyZ56?>tw3jdW*(th=B+vi}7x~2GTEr1o3YD4 at sYwY&l75Qwux>
> z_%{M~qS=Fv<T0tp%h$4zXmkrUGw*$CLKsf0t^24Yz7FUkdJwdDr0tZaN5a;!Y(^<~
> z5Ts3@&uzxg*hGNz9xd=xHv&V^+qznqmb$e-xoU!HZKiU46fjG`RCG@*7ke#VAU*P<
> zEYIZR<G!9Fa_f^_kI1c4skH`<(XAXCPBkqanQg*#slpPduMse-qs1eo)hC?k>Gj#~
> z0iP)_GQ{K8vNe{C@*F{4=aB|2`<qiwjZitr0r0daO)ki4VPeQiWk)uHaEnKBd-)dN
> z886 at D<*#Kk7<u`t%@z;500Y!sMFU(e*al{%AYR;nm1jMdrSfZ2Os5cRCUZhM)hiuB
> zRxbiNl*!B#w*!@G3^UnBZeuHN%`l;WizcQKIg`A$woJw{Q{y$Rq>2EF))yGPcx{2+
> zJD at 0&nReg#Dlfm>nCQ@$;!x+tk`C6$tX5FI1)iiU7kh19fJ at Zbf{o0lVG@%EI*Yj8
> znR&ix%<-nnoadXyNnYNR=bOe%FQ3MKFlSDlkV*6URpAmlm`@Rcz5%$Ogqr~OYQZzx
> zVVn5h0YO}41E6p=ZnSqtWHL9 at 60h@G_+>ICF>h3od-#er&z&Sltt9Bh*#5uJI^yLn
> z=j3AfnLy9xtT?|ub6ro0X=79IJ;{D?WdD71kI)kzL0lDkcfJf~e<YyoY at Da1qs-3z
> zz*Q2*i=*%xq~pb at flt74t+qGmS2h)s$*lPamNYhw?pv!7wh3j2<t)RBaY(MAUq#W4
> zQ<2QZ-Ijb>jhW0vX+u@$1&bI!;if3M-7=Xvs*AB2Vf=8RE1(`#>#b~egp5ql2FeJl
> zkO{p2c(Ihb*hN}U#wh6iqg44FK?#n_|1jmzfsvw)GS_l!G(4Hz6JB|PFxDtZKYD^H
> zKP`+iO42E7<Kfx-DRU=3O=|iZM(9HoJh3c@#BNf$p!v})*4a%fnhQDC$7L<Jsi=9i
> zQDN1Xpj2gI#j8e?7|*#rTHT_)t>Ij at vqFF6+CGwV?bu3=FB}}YrGu6`W2izws~BD6
> zmUg0kDFy#Z2ER1K at -1%=s>^)fzZNbnG(uZGXX83i at j!a9w9D!v1dCn3*GSfT09Ogt
> zwSac`Sl1ev9SUKVN~#ak16mKeT0zGN(mG)roG)A8mb5GrdQ(AM#fGLl$+Kq0`YJF`
> z`M10!nAQP$mDVc3l1eXoUCg5e+UsF1Eg9Afeg&TglPzZ%8I%mK?G#UAFG!OGK83=u
> zo+kl8F-C}+X5rBSy<h~*>y{y;cu};ak2fHFo^L=sylV~3_FZc?x)7^g$cI+kA?QWA
> z6X<!eS-3J*qmi*GB&MC}=*Z1YG-q^|2+~c;Yfo4JUWH)QR6&E?e1&Du5v$S66ulzm
> zZ1c~eDWJ17H(tx{gxuuv at ABjC=f-RMnHY*B9rp5jX==Q@<x_8b+p>M*+nTdTSldZH
> zSz5^lLb9`b*0zS~1nWX!KV(T#0p$hvOX<=mFG#P^rSVxlOPe3*HGM|7?jF-zVt6Ii
> zGEtmT;>LSzjl$*i at af(#hGzSQG1z_9idPyB#qodej&Ys$=2AOaCpPOJs1sShMYH>E
> zcY1F1%{uc(x=sr`&B}ZW(PoY3o-gY(J=)o6WVC`_EJlamVwSmtNx-)3CLPUZ-5*`{
> zhoGaQ8*3~ylUkW)>`Dl$?84#M5N0>`S$9T(aVKsf(_am at 9QW<0${e1Ks_c+&M^#pH
> zHk at VRc-m7Hel0d0WxJ`ZA9PV=HqSXPNR^&mt8Be*uT{40Y`k#J!p%|kP97tN^D&zV
> zU9m`_3cbqL*Da2+yzK43R6xz8SE}9*P_A!-RW{3W;+9SGJ*~?g_wwWDNiB9ef;`r%
> z87ZF8lJuz1a`Xc<Fq4_DwzPP}{(>SEP(mh?D at -9s!eV5hfFjn*jEq`Ck59K+;<|a0
> zqlRggd6T2`?Ep*LyLM}(t)5P;)bii1Enw*%zAa$sCEpgX^rCMISbFXOr{DRufThPC
> z?f^@ViX9+5wOOX5H|=GNr3WUxie7{C8~EQnYbo7M*J5PKpYyDzbgQQwDBa-O4wMoy
> zX-Vu;miz5M at nv9_=PYB+LQ_ER{H5?(l3to)^Lo!uODsn)gGKme<T?$b^jWX}8D0EO
> zr~ZS-JmB9*mM at 9z+t0`(!WG%7 at J89&>!n8*FEP~15cLCI{BoA5&yMTtTz$WF+4Prh
> z>$2$%30-<{$VjNuS&AUb4bJu9FbQ7=JW#^F0Zy^%6$32IAl(G1Cvh(w4bMJ?WoP4V
> z(~WHV9QF$ola0+asyar|!*W}auaZ8m$41nfB7NEs>ghJ<&XQTLZ@@+NJFjn4Sl-u~
> z^k_aGV}74s%(*J3n)mUIECYQ3^ZqhHqXu at Id27K$iM=YY{=kj`MkhSIPzIWT%Apc-
> zlrm;rK`n57M6RH>$gM~OPA~mk3-KDg at Q1C|A5M^NmXGlaa>P>dKui^{N-<F{>pd}5
> z<o~ajDxMbYRv=GI71JJ$sbaijHUEB06~>2R`u?i at dp-%{>BLnK3!#Ot7^0d%|7zDU
> zfS6Y#<Dbbgcz=V~;60Yq!TS)>v?4yZ)?MJvKwJ6VhezK_<=SOR(zEbm3-lyPBt(XS
> zjI<s7pk(Lp95rTW%Nhjr^@GBPEG#<*)dlYyUZ;arG>ATI%T2((l+CCSeb^SH1z^)n
> z^wh;_W*4iRUONYYNw+S}7K4KGno%i>EVM=?59`7W5qfH<mLH_hjV^q<Mx|s at Wqo~E
> zaYko3u2!0RSgfHzmdiC5HrWmOgMlp;uZ9OrqmSklGIM1Vo=cXjOvY14<;tlzz}~WQ
> zjgtQLp*VS1lBdO at J9$k4-TQSyc at pGsaZj71Z$M>2ud{|B7mNFb-MzoxJ>!d;>@jOX
> zFuq|=T^lU3tTzO)SH<te0*?Ux1+X$3`DFvXBH;soFH1HT05^)f@)f}Uk@$AN$3+~(
> z06r$+UVt4EHUR#IgeL<2l0_Clm<hrcl43sKqY|cHF?}v!`eoY at 3Da+kK9evFx>myU
> z`?bRorhy)k at E?E=N|**(BVwJu!4kyUC80Yg4oJ8U;QbP&-<MTOcoE=z5?%$kO2Qif
> z?***RMzTb}Jd4z(Y^0*W?U8Ku0Je!X3Tm^EVvG345SEAvyczHZ5<U-DFQvK$@N$WF
> z1AbHFF%4p+gz3txQV>Oe-w}ELzW~n>`M at T?(?njT1#Ed;66p7)zlk`24t`5=M6Xi;
> zU=`pKfZvep=`~&;*(?T}D+NKncbhHR2htVK6tQkR;2g>34Zy|DO1H59lcVeUV~zcf
> zb%`=r(O-nwFbe-<pS0m`48>&prYX4EUcTv=-0~cZxC^5-*+_!`-;pq#?Y4wnfLlcD
> zPd8MvgpUJm60wZVd{e^oOWOZR_$1&P5~eBoQ^fM2fPZ&Z+AnT-5#u`hxQe?NH`vp+
> zF2XXomQ>qTVgnhzZ7J#87EHd}mVuYA`*4oss6pqZn at 0;Na2s^@R1#heJpJ-CFdLy2
> zz-vT|2LtvOvFr}m{3T*J3;2|Tiva&q!gYY_M6A#Qu1?qeMSm{hpUo62ca7;G!Zqi2
> zWl88#D1!ndeBIvh;ZO3E$z1Ebqcuu40?FVx8Xr>Hw3*1H-lgSQJKloVpImF_RIb(a
> zCh6EYS@#<K3p2DA7W%8213#0QA16h3GsL>t;&`KtN8sljgfdY~K%J6nJ?clwKb{fY
> zK=tg$D5N;PtjPS464m%`R5;)i`TSeL>>AYfF#Rpgfzoyu@#UZHWAHDDb4C2bJFJb+
> zg-L(b=ilL6A+M16yAp6NDcLm&Pb6n{4NF-<e=;EaJy!<vy=3*{T)i0qKTlCTawGm2
> z=bE*J^!p^M?<vkTkN%7b8MLYynL$YSE3je={rQ6xH5F86m=HQ+HNotUlgdxB at Bnh{
> zlcc~nuCw!sc;%F9N#yQLQFXkAPp&Ss&Y83w!Hi)y>os at 4Q#X^nZuft2?6Dk#@9--6
> zYrAm1KwoF(Rl*|XaIVl_$@hDn$76_LZ=7yOdP&wl9Y+fE)<6jOY4XC}l=#PC>}@)h
> z=fGiQfw69eXEeW>b1`Q~&E9A6vm~-A9zRY-!24A)vuY%+C#6*>7Dt^Q(($s5J?i9E
> zR4=n)MvnZ=alG7w6o~$*C3K%)A&2uEo&^<3suTF_bqdN?4FXo{WlJS?FtFXc>>7z3
> z0<7H2uBcNO1$rpZ8ZW(6G9Cu3pO>94vBQB4 at Un9Vzc0-4q!gkYDkoAzc(vobyaujY
> z>y->%X^n@^nb4T%(?XEC80V<{@4=Wz7$XzLq)G`1{~rm#f<;`Hgs9AM7HPT=pNs^0
> zgHZcqB*epp-1EtZ&dat)EKNw5m;KErAqp>h(VLJ!r11CB|01^Put!gJ$w;_Yd&DOr
> zh-<yPAKGKMi!PsrR~fuMAvdcx#9k=mX<JzMBd_OUI9Gv at 4QWE0>#e_l%O<w{`|vrt
> z`G8%9R}jU)6uf{8IM^RQNoF2=3Qw}v9t^{A{S5u at we!hVnX_j*WPbN0x6K{TJE}2%
> znQQ$tnA|vI8KQJ=b7x$W73lfP{PEuz;rFmQs8OXRCh#X#4>(?alz*Q78g}RRw0i8W
> zC6$K<2HZQuQmrB$b&!U`Gw^o%;M#0FSb>}g?qgi*zAvUYke@=%Gv-3xI1TCHKD9Oi
> zzyC_i_3)bBbe6mHXQqkd=x5n7MJNeB@(BJHnFQ|#$*LpCc$>ZI$R`+|CfP?VxR^8?
> z9XN7vZFDADuCCqE9to9aL2WS9VW##2+Swk+qq=<1)%F!^KBb?F;8V~}Cz)Rq1dQZb
> z8>Z8YUm8x%eDO2>&c5r*tr(vt;~dG at VPE9nv20(bz2(>tjOW^Wef6^pv+GXA<66 at 5
> z<aGQW^2W(`@CQWpO at CFeo9A48^U3gU3UF^y`%MxaM=pKCspj)}&cuyF$*j5vGPbT;
> zRIxK*nj9${{)SQaR92bry9daqqMR(Mi-_7IXqkt!Cx{KS=LD_sA?;Oit}YD9$F;h_
> z;UBlB=i7~j*n7BeRqblH&~RgY+(ZWab6J`nTnVd^j^*{@NWXs0gs#5)rai>)<kCM!
> z`R(Fbk7$YhRG6ifYyGU#tl(Aka(Kt$W5!Cy2z?RUz3`q$$Dw$?6IE6TeO<L$LMN-<
> zmAuxCh*zWXEU?#84~SWLnt>zDoQt%)vU-f6pDG;6Z0nIno8(q~k+Qk4J+;bch*5=G
> z$_sKLu}YfuT)i?qjX7@&w%TgqM=(}2B3R*BT!S#hSf42_!W0?_I|2K{bOF+Ij|tPs
> zn&c~uq5F7wky4tW at qvX|;{C3ASN3bw>WWo at 1AXAH)WK(0n&otO=^$zNbvk^6UhN6t
> zMwO{zB^}X%1^ZJE*f%|t$2;EH?$X&Nit(mADGdMgf#I%)hP%DP?|Fmmmoi-#T}(Q@
> z?P*aWnkYVZM7(E^QsEh-^s6e9kg{rX#W(9$!yz_i-4tQ?tR`XdBI#nRQjgFV!&<d^
> zNUK_!=n27+qgS!HP_hf9c123bGSFi>iEFKGAbU<v#o6n=n~wD)`@6X4`38gEXv4&m
> zCk!)FraODx-<Qf_0#*@wKySRGuKB2ou4&yFy<Qaxd)bgO;VXZ`W4=3DmFi67T0fdc
> zjAsUgOmil6-S4VmVm;Fr4<yxRM&m=I>C8W%gjSyo!@J1Iv*To;(9xcY!#haoxz)Jb
> ze&k#T9&!S1vjoF}dn$uAWg2Xv-<t|<V;_%KoxL8I!@chNh(}@`yw%hX-F)hYZJr~O
> zz8{Ehkhi~|9>qKR)a<kkI``EBHs$2z_gwUeZ7(<tYclG8aT~kpHHqZ$9}@6TvgC)6
> z*hCKekcFQk?LUmhC1k|;u~6Lj^T{cCDBBLVsi5cW!aLTxE1Op|6>y#Hv#X(amM3wo
> zA0`-r=oR}gj+{Fm`^b&-{Da}?>Vtuy at 6&^;rlJ`OpJlWqtg#h2_-lWgBe(Oi_K>PU
> z)hw at Sf!403oFvxAt6t|dfO#^pJ_<LGy!yCj>zb7<ex-wWM`R(ARkQn!LC>Uwtwuc_
> zX;q2`lEy_DxV2ExwGjzL^s!2Zkj7nQn6wV7MH_!8?KOs`0&(NLi+D{7uJ{7D7;?RS
> zkVPlV9PYi>|Nj;-)>Fi4#y2U89MG7qYG<laX%Q>mPivSIq~AGW`!U+mKqoIBCe#XH
> zDSj7eKOkWz?RSd5mD~!&swT8aX>Dv>RpgNTG}2 at UDM^&VxmvYYLcdmJ6rU7EOO?ug
> zw^`Y`>VBOX_x~tVFrDsqVSv+jz`NQ9Zgy6 at gY65*il0(*{Ug)U4r-l=21D;Hur0LB
> zN^7Pwfot8A(*zr6^AGM5?IX(5tKJ&d*_p^ULO*v|aw}{bdxCWNVDs3MiyUSGkHV2v
> zsjzW0d=_v?q+3H at 97EC@qR2}Pexas-2M<O6T(YPkf@}rl#D|ro#MTfIRpU&^e0EyE
> z$p^LP$hn4CxW#TZL`A`EkSTxIeSneZe~yUCrP_!62k^xFa|E`L{GXGsgRK2I`4LC)
> z31`y8XFKme$EELj3I|+wCb0QT6R=O;Q`M~E^Sl}tx$$!>b`k#z^u70mxG0x1Nwhoa
> z$Lq~Q6eh1_?uCf{_q8fPJJF-{@@gO7J1!&yCo~oC^X^BkRg;DbeNz&hN&LK=W%^sR
> zs<G-4vtkkAxz at _I2dvXbzkesiPAfj<Ov=gEx4;vhzH275`DEe0qagO8f5%!}#aEq4
> zY#P%v at l{KUu+~DKoI#9iK949r<ts(%Q3b?r?5Y>nO;`OeUsDcz>i at 7;(L7K-<^hG;
> z*O(YDK8 at 2z<;5Y<^ta>M-oI^ps7ce7k{cJJqJ{r at 0Qzu;_5uAlqIc4blkSWh5y(hp
> z10FOB><xE9=e=tB|IOejJlIgtMLUj^I2Yhp(&0?T&7{|*IOuiROH-gMmtIPSgU4|x
> z9`CSUx%8154yK~tlJPWB{Tqk3k at nyE;`d0e>x1x3d-nB>GIj5ietOeO3+LKz{;@IX
> zu#Le68Fn3ZcEfU2*wvmT$fz$tAHu5$UI7Rp{ieH7_|IWiQ%cag at X8%ng6{M$LCfHE
> zv|kCT8&HA<05{86f)wc`sAgITS^}>g at M_!?7L619PE9I7#}AK+#v^rj*WuUu;OI1s
> zc?%4&m7oKgDxSeF#m=fLL2rChg3?ZxARe&(LJ3+7a(8&`Ih^t=Zk1b>{$t_oKh38i
> zdX5|2zJC8<S?U{&x<O4ddtL7Sd*^@q9 at H;h|K`+{=NEpqC+lCaE9%GRZ(rSKeGg;x
> zkYjJ2?Db;`DH-{~ni%!msTuQM7#Oo-!0EO7m!}>$_+?hs;NHu~FZo+Ocp>?<jeT+Z
> zhCZ(*O_?`CnWy<+&4%U>(sRh&@FR|GiI(@zzJBNZtxx>(uXa_&^M|Un(Kh$nFUP)l
> zVfqh6EmJu2SGW5AWIiuvU%OQwaVL1{gvJ-ud&+mNtcor>ocm+ep_QMEsFy8aPWitQ
> z=Gb-m><>@-^QNT-U(<iTBc*hsd-9^isy@$dmN_n;PTSh+mFGsyYq(`Ru=10eui28G
> OHnpDHy|Y3VX#YQ~z|>Iy
>
> delta 14462
> zc-pOddt6ji*Z<x#!(3p1gWLsV5D at TwOVLIgaXfguPLEWGrg(YK%97N~%Evj#@fsGo
> z6+uBMZ&*s?V49hY=4)i8yd|dQ_ at Mci6&a$*NTdALKIhCh$ou=e|GXbRGxJ^Fwf5R;
> z-_~Ad7%S?0D(ZX!`uFWWu<zi0gZe$ycgVnjp9E~d at l%6}kWpQP*2Wegr=kd5Ru-Z2
> z at LAiX2&oK3NNXq}GaflerQ(q8Fxyubkk#)Um2IwagmTDvqp|xc<GAjt9o>4P9Ut0*
> z1fE4;fP5p&jHZG$0FLt=2v%$Oom at -X(=OhHIP|Q}c3nLRM~-*dgl+<s&Bn>TBOD2&
> zn|462>t=*FODwMuMsUtKztu8^KwdLJh5T6!@-dEoSYtsbv$ZGN2O(iLIiTIFc~(H2
> z^U$-zq6_C(K>--v`EKxe#YF={5Lj1Zpet6!O95lRzFA0fz!>=OpoFy%#(+@<$;NLb
> zsn+!wCKv-B&6KqkXw at v^%Ygd>##u;N2ly!otHJ<x2kZx)H<D=IH-ce8l!xV!TKHV9
> z<>554+c!=}`L97*OzLFmB1khxt8Y|N3LS&rzl<@Drt at k?oG2}J at s4dS1k+uat;H(N
> zS@#Dq`t`xjl6ihHp?~sfuo)?~&^Y2m$w;>OCE;Xp%5M{HAyf6k at J+HsKP>ob0U4t^
> zb#=t`);N0#2F^L at 9rBz0X<R|N`Nv01 at vtI-&sFm0+qT*Md$E6}fQ4?-lC5pDbq+kJ
> zu&$TKw-i<`jb&i|nB`Sm%inEO245`?hf at TfvxL|XCAP!sxEaN^!RHCs8klQqy$!Ec
> zHiCz($Mb9eLXW~j5YKaHbR5_A_bv`8?Hp3KacJxxVEHFtJ-nRoI at uQt1`0 at s<D9;V
> z+D_~o`y`c8sVG*}>Nu2HMR68FI0QcFM$z3Q%R2RmIx84pU<~K9?36$2<<D<OZKsiA
> zd9LkYFRty;5CNy5;lB$QG*j3J#-KuckUZcb(Jz(7ZK1A!<&SU0Fa>^D%nAmkU<~&l
> zJc>LQ%;DRlA~@W-@$u}vlk7-f^~(RYpnwU+faG6$qtGvEyEWyvCbYux>C#}C1C8QQ
> zk$c<uxScD%8gnhK&1^V~6&0wYI0{rvlszuC4{_zYaH|63F=^WUB`_KVKfSX+_jf4g
> z9BW~bA+$PQh_fI)Ov>2N#1b;tr-E}XOeBRNF at ZfeC;pKhTk7KPYvgbUhyNss(1nS|
> z<Z$e*3Tdt19m=(|_7V)D<*VX5AzMO+;h)LH(72$5VowF`p2oaPe8YyvpO at OMIF%pI
> z-{4vvoDvMu9{F1>e|9JH!Y1Qc<W$&z0h@$4L22p32XYU7e9shY&=pV5j==sXkPooy
> z*d+TT0jc7Ycen?UFT0k*Bs>TnN_vJz`M>JbZZ63TPa4ppek@%|&8+$inBcCxgSu2^
> zN3?~T8ATSbGkH6(e#T*sr`^v?s=_0!XY2j5waS3r80=A-R#2N6v|KQ84}zS6y*@l!
> ztLP+P*~?Sl<BxVe<~ic)e-`5sc)L-b at lm!mU$@zrotF<wg;vAz-{;k?4_sJ43}icq
> z8bQ<=?!kp-7^5Z|S#Y?=y&By6wsT+Nh&SrZ*kPbUQ#Z;TL>l$U_iKIOy`{pO&EP;G
> z5f=5|^}f*ML{c0PAA3Q-beG)8&(`X7JTA5rmvGLVf`DB4obyc^xfn4xzJPnMZvh*Q
> za6$gzNZ4nJ!=+T;8%OuHC&STwP?b;mM~=i6vN*DjH8uO?Umt*;2hXs1q_n6_hQyjE
> z<3)fIr1OG8i~(l7#QUBC>@Q&-7hr{i)k^^@;oP>g<-jzxNUY{9U}f(<SHWYvgr{ot
> zkg?Z6h6{Yui*wGiOLV|!$nrEG414SK>Jjv2nXa!L2-0G>X?#RkRofHfw?I}?d77&>
> z0pz#cH_^0vgzwxVwi<FP8ZlaY-|Nb+G2BeJHOysTo1mYTwF%@*=R_-km2=J?Nb|OG
> zod>N>%h_ at MY?yaeS1xnGiJPAwC;=}46bo{j^J(!NFl2lsoGVi`*wz)9k+P{e9nNeH
> z=X~K%6Sgz3H$qV?A7(-(tqJ+40Ea&cBzaM<;XdSg)F^9(BY~!niaTQ35jTrIN9LNn
> zxICG=>&5Xhch8F}lDWUUxN4cZ at 5R|AE}^2ui>#B#f|Z|Zz1RkFIy#11=Q<(gIuGwx
> zD`mTN366x_ebdm6z2ddk=2Gm2eD6H}gtg0UP5Q>X68q0I?T*^s%#M?sv&S;<Jj~lx
> zKad=aiL{QZ$(7>qo|=j~9k{%T<_;WRakm3kRB_LdP@}GRt>Qq%-S-D_&XZj~)woU^
> z?7CZ9 at eD}mjEYAPOPAzpt`mH>06v3z;NR*x0fkZ9!@Fc=7qdd&L at K*H6~5Q>tU+->
> z|L(PO&d2`!Rpefm9^w7$0boAV?q`f~brmpdBRKKoSu!X#3C|?cVx#ax@>c9C*hFr{
> zei7(^M55vz#6${^W)x>^HHLp<{2STW^&>o;nBwCDtKm$T^1Jfa_^-GJXD5*b at hSK!
> zDT{v}N0GFIU4AEE_l={~#J69N+X>I(GQuX#z=%{P#*HvT&63Hr{CVGu6jL7=H-B>7
> zKA{=CBo%`GRGTvzp`0{kM}zD51cH3MH1nX{W#Zc{2AfH8w;4$%T*vv@?I+Y9_T=Lh
> zKG&edDpK9;3#e0GO^UJV;n1%GJzVW7ND-r^NLUF;V$^dIR=f*%s)R93JL6>j0N^pQ
> z{TaZVj3MoeVkL}D8UxtQGX4#4r0i!J*jQY4;+q_=<K<1a+BPV8azN-whmoIaT-R<8
> zO=RbwUcsO-zTnLVB-m~YQYx^?b}KbTjeTwE;S+Jx%;Lc}Z){eYh+W&P_zRNWEsZn-
> z0XuDZrXY;ZkmVyD;7qbK{T&=Yv?KHJcVz9z0{jjMFh3KX$<O6iIuhk3OU#Vl?_5j6
> zPO{kiC!S4mM;*jRNi>^?gGo9&3}3YIY!8gn$-WHEZwQ~%I<7j1a~>JEVf3uPDaC`E
> zR`Mxkq?yY-_&Ad+7|r1$wxgr>V{29xqenbzMm{$n^*_gV17ra-j%BR&M;W4q${f|`
> zQvnTUqoJA;HKJ^!8U<|2s{ZC+w??5dEi`F?>&3p$qX`8_FIp`ECf39xt0=Db<-1wH
> zy&lL=iS*I)EJ(o~mpV2gu+74}*Y=3z*>vWXR^}CMi~Y`YW~o-{5~TYib!-poPwC7e
> zof!IT;4X=SqUc;MgR~z0JCTPO+5c5KvqZ9|(s2)e$m54f2Sq*y&_`@6A1Fn|8UmXh
> zJx_TW`TiZ$#wr?>vJq`^=xjX9%VVSU9!IMnpujAK*LZXV*(EsDqkkidF-faKrPn?D
> z%jt|!>)~H)RdFr9HF~s3Q$elssIxr^ORl%O31s!S*GC1kbEOwuz2|PRug%-jzK5)~
> zuYaL-b%Pnj6nzRos}1m2_F!KlNgqE0v&1wZm0TG=3p)YLh}oVNvEyF7COcKD;~rct
> z0jV(+edt at S1Zh1vHsQUfn=pLE?oXsW at X-xkeFrxy?t=cym&n|Sap8Hqy*2_K7gg}M
> z7)oObKw$R;shAiQUt>n9&hE?JY!U5zsGSfe+ifFPCq^Z10=vHMBEZ}aJaz_4HCTp=
> zduRz*E+btmvGEJRvY)#=Fb9fu^g%V8dKB$mAUT#;{0|#%d0wmQ)P$=?at}@fkcO=B
> zSRlP8kHvN5EqIS6rzVerBdX6njuXh)>{E)hjih+WMysL~GS5&r&_0lzG64?(48?w6
> z17M at X<KBRuma>zk7_dpg+S7oC16F1s-B8F{jS}yh4!oTGe0>4SSrML!1K81$e}xwC
> zSk@{DP at b}!q)^fZ8FGV90Y^x at it-a>TmyK5gneEG93o-$dB8z(+a|z_g#92mHc-Zp
> zvRRFcFIquROCtzO0PG_<(sTi=kc{*!U?gKG3P-icxY8I9wn at VNvjK0EG0a>Tk#K+l
> z>|HW`3H<btF$^HA7_b$Dz;PgKkUG|V07kKrQ6N;EY>X6~iY`Zg3H#C|7%1860gw7k
> z;-M-J81<`!HGKi!l4q2T*dp;-nCVfEWDNd$kNQ&*^mD-|O~U>N at Gz;d|7B=!N5TQo
> zw#;dNtMPw`<)1P50(teH at lT&DSyp%wo=-!v=UQ3>ds at j9A#KTlMX9PSiaSubSJb2`
> zxA+zw&z`G>hnTd=Df3c&IxFCT{XxYZa^|10cr$7IXX0?dZRO(>`WW?Lmp~6woqS!C
> zE`ziXq at RU8P%h_zG!HVYPM9c5FA+;_JkBDEa^r9YDb9_3esITVQiHcBnsMQAuupy*
> zP1=(Ew`fFEE0{!WB($0b7WV{u$+A>ciK1eHFrx4zX!JxsCo%2;jnWtmu}zdB-QEP!
> z&!Pm8ZvU11V@{H_j^?mtco^_)0PgG^H#(Wi^hF;21RH^dH)9L)&bMZS;kw)Y8MVZ>
> z0DVkvk!H8FpYrrR*}fx-QHvf#>3z`W+`&-%goCt+-VRh}#gH7g6R}(Bb`7MpCdld*
> zD%VE>!-J{ho?0&RST15?o7{JV!3R<H(eur)l-praa1ZyLyFI7<oxA-7>Olwh^7ct=
> z7_x$@*-coQaBW|4T(ko-gko=YOX>CTXS;fw4tm1r0B9NPah$|Py00&f at 2*BY`-{Us
> zZBQA=q3|3D9<0r7qLbJ$ohoe>gK)E3QoH$WF5nqAzpd57!+c at n;ct8R8(^>X at Yi7p
> z6~aUdlOHE-$8DFua)7ux+s>Jz+r((onUivzu<f)s)mH%7)0wH#9--1PQu$&G_aSgP
> z4_8TT{V3X&Z}Q-he1pfwhIA(Lv5z7Tzmf#J6lq=Nkr%<Nw>4uE^HHeG<aq{^o9i_(
> z+h%+C>|F1O$@1_Ma=j;JoQF?m*Uy-dD^8AO<H|6)3n^{nQ^Wup0S}UK6X3qhxD^)O
> z_a5NxVxSiR8Q9q2o<&Y)8nrSX>9Gh*XUx(RQOV!KE8Pc1l(2Csn=x1z0dv;G#v*hV
> z3%n!IZCw5b%^+^$^53&_u=1?Gdmolx-I%_iE5)<`D!)SJz5H~q&**lbl>vf)%Ma~-
> z4Qhl4K>OKPcRfg%-JbwgNzT7K3 at +eK^CtOEhuIM--lkvVlusrL=EaXnr|~?>5KOQm
> zC_6lR3093pN*(=zitdr}er)Vr*{5JiXRgS5r at Xsp5e>*dF3*dx25l7B&Ip;9)tjg<
> zF<QM?8&GQno2Lg|w2ICGWy&6jI%r>Z&zwu!MMyfzG-X%NC=@n#6lK at NwkBC>aQ9ty
> zL2L(ngeaaD8V*h8Pg~mfO!>j!D0%ml7~DYiy>e&BE at 67p@;e2bbI*=u+_d`68k0)U
> znIRjcW7R?vN{Hi}yGXP4u8wn7ToOwy=Z;aFbLU=i;nn^jWm=liOd%>2O;mJzWhxRq
> zKL!6u*!cs(>v^M?E9P+zww at DL4{D;V|3!-Chg*-yx_!VL7IlXKRk5*csIU)REB#>;
> zvr|QVZmpzxf4G&lZiD at +qU}VfOl$|ae=D4`C1On~N=0l)%5ywxVFakq^pMH7t`aS4
> z0sV`n8J at Mu;@ch<uhER_aWNnECu~oCIiCxiEoB)6awK|er?|^}QJU=GC%PXCL}|Pj
> zHXZWFe1m8MMeEjKZ0yf%7P2cZ%sS8$Rrg#mDp^YQjJHdc_jse}Xas{eCt=clKrhpE
> zr<cT5aV-RsiK$S at jEd@L%Pp;R-sqkXB`4+eC#?W)(}|-B8u6A!mO)1ZlZ9EmK$^HM
> zKTD>7F46h%SpF!^PY%D9AM<#AJhop+p~%v44}XZxkB7G&^u+g3mUn!6v-8BUo#K<E
> zk!;y2PI$)Sv2EE*b)xk;aZhB((mRwF-RFyYBE#Jo9U7nEHMGSM9 at BZ^+Ph7mU|A3|
> z{5h#hnalLpjuF?`&5!nkk(T8hhLP-B5NYlHL;}bFO(Og8-8T0j-V$lq71#!kvI_4+
> zvL)Dkn78Q6L)t*E7xlGNAN?s^HwEpN+Lk(LYd+&~>(YCo4q8W){#Ik9v!++L8?S(j
> zR(gX>U6^P+<6Q%lo_5zjrFQQcsPx#mFqVnsX%$rPUs6?2T0?DppzbOC(0vJuQl+~(
> zD&6K?9hH`yixY20*#4#Ka~UPvbXkmbd7ezI^C%10SQm0vH;O#^1nj4$)lKQ!o<d3k
> z(tNr$^*(@J@~)Fg=ejS{(rMloZ|PJI{||F4k_r^7L`?LkMoD+DER7T^x}JcBq%-qG
> zSE4jn<og2ZmCocyJe7Kgd<dYpjS3T^)zRzGrIop8&y00~UY3Y8peQolRa>d5eSuYq
> z-NjW&3sh}hMO(=|@1m{bmUq!sa?`tLE4kd>XUUIp(Pot#ecQ2WD>)@qZS?kKnWAL6
> z03}B!EJUxv^c(qK-D4@)Psd_n%4WNFK*?VB4PLU{`?@bFm(nS{<=r<valP&rwC3?W
> zUw94dR+5OtF})U~CX^xYZ56))xh3}hipTS;cAjUD-(HUi8vlf!F{Eg5Opie(CIQxB
> zyUG(^e~*{sc3!$sF9SL~;UzG8iT2#+wzf5oYmXA-U3+YPM3Ub)IA9dy<P24SwUKjv
> zFkHsB01uJzFMtOK232qC9guE=)RQnvhGRXkEIAkZkZ$3M&ta!P;wb*RMpMhEx>)bZ
> z@@<m#W=#0M%@MRxl}|DCbQg4&$bvUF;SDzJTg58tyG>>Tn#V_5-s2Z>&TTJPKIR)(
> z1}=Q&y{V!`3+z8E+w;fCY^})p0-FI0{ZeV5$iP*<Elp-BC}RoCKMdSJiObhZ-0}qA
> zy32pALcGo({=KT at hqI)cbq}6J&RUC}h^hQva!l0A5_e4H3;w5=%IC;-H{3CmPwN;{
> zd8WiIw>*xid`yR!zQ1j|$tPkwgXovXKxo~U575k_e~f#SN at g!l!atKjco#?wyeE+>
> z at IH*F3gUuJxbj^i&~`rg(C~+SxmE>31{LhFLJgv(f8d6PuK*LRC)aP;Jt$j?8Cr7&
> zKz?1nu7kyz-Ti8Vb`PqB9fbqvbF$J5?3-DP7SZQqQF;SxI!T_|S>?8~nr+?P4@^3>
> zbG8T+lRRcrdPcMge!?Bq3~y&QOe~Zkcdj2mH^2DR8kPFFDqK^ZImbIKy{(m%p}Ub_
> zF!8*)B6JV=Nyx#)#JD0dYR!nYGF+{;bg}Xw0oH~Z4EwT?{&ZmLQj)hK63-`VS0v#n
> z<iLtaIMk+IxlT?0_E4DgR3CS(MYs66Ui47ZiWy6k4bo;e%in=2#DZsCXVO&IBed=D
> zL2$P(Y_;`W7mV?JoB7=!g_So3us5V{#{72!{u!`33;CD<UzhPVz}IA(Q-B*JUOf%)
> zzh(X=;1e=-0X{C_fKGtzGEN5krHoSnA7hbK6h?#ag{;T|d{oBtOQz3dOuueBB4hfU
> z(PuKIK_8Ye{f6z3jA@{s%J>4{gEFRp*2wt2(Hg+oBq2}@iUTqZ1N at 1M={IK8GM)<f
> zV;L_1TqWb>fcFE|W+4Rwm}imJoP{(;0PmA+N&r_#HY#fKD#cdmPb4gn6nG`z^)j{t
> zHpo+50eGp*-va!$#A6!73K`Rp333pN0I!mG-|K*9NWA|Qz?rhW6R`D7S)kvX{vu&N
> z+W23xBf3ucfHi=t0ly{N(=~oYw#fmUBlGl|x9O6-KOON at 2?q`WoGshr0xooHbD8on
> zsoT&C2iqQPNKh!&Ad;|Y7`|qkx#@2VS!UYiXYdhQ_2%PBs|8y81+8^iNZSbbo`iL@
> zx4SaF0k~PhzH~#~k#QB^CJ8HO&$nevzoz{|#s>g5%9u{k?-EuT0RQUPW^3B|GR8Hw
> zspWrReAM=j?Ri+CXd)*oR$v1e^ZpyyOisN249+1TAIz{;8UtN)@91F$ZW#j~YGgbY
> zc>3+Be-=Wo0<V)W?gH3X!iom4xi4X5f54|@ya at 0&GOht!D`Ax$aCKVX{U%84zFEvW
> z&6Oj&NN}CKGDAkELm1>I<MXyoJAPF9Oy*i1o+7t*hx at PMS|0tywY0s!wK!LhPJ1Q>
> zTInB-;c>!Be=>96XOg!kF)G>^<6;ZrOcgw;QM0QMN=MOtwQ8>AXdtQHGdb!y)w6q0
> zaA92OYRfJ)s_`vW+2Jnvyq+Xf_Umz+{?O*Y2d&WJ*k7*W at Gp^bhF|0DLIYG`@?Yus
> zRh%<;Dd8*Q at k?Z9<uIH|u2(*l!qZ;>h=00OK!0xvKAbbTvxpZ`RF7PUKh8O)?INbV
> z89mN(&N*l3PbrLg&E)g|B>uryHJ<*KK|oFU)g#OZofXW``&4pZZwB<yx;N23g==fO
> zF0GULEz<MD&5_^pIzFkoK$tOM2ZA0$o%OnV;HlFD+m#Rhz%k!uBYcn7&>zi(t<5*o
> zT6m2(h#8zS<WF*Q--~!WvFwix9F|s;@s0gRzCrMZfaj29`%~hkLfgBvEzg0&%6wDp
> zWOr+R4d-MolG^>V at GGQeRUDp5Ccyh`l2`RK{x{iIm4Z)`3srHEpVj)HKwb$qH$35~
> z)RtIYN&l)6vY#*?hgv_VRZ(qKf6#UE=r+sj0AQ6KwoqmV0;}_|`7-+yus$AkvCIwv
> z*3ZMfEVF}w4WjHYk<O7rR6;65s&J2aria(T+O%9B%d3Sr_{@b8#E=?{$nmNWJe1u3
> zI4&}!-6%C47cr!7b*QzI*C>NMI*r#T1Kn(}%WIUO9`=scC{-Tzrq?KaJ?u|jqhu(X
> zCen57Mj7TYKj}3}#I;=e9Ew}m{nswQYX`h+MDfX{m>UH=E$Rvycmp5JIrGP`!A*#B
> zE`wLWOj7g7$B=DiAFwHKA&EGcg5Mx{2SdoCnn*}Bc?YN9EZdobp*VJsvDd>^K1onG
> zy0*fMes~M2kvQI7jrnU_%STZg4p}in_(S1QOU;b`53B)dz&K?E|04aZ>Fz7^n16VJ
> z95~d+ at BXJO)vDr93u!zw8Sl5ThqG{h<qb!?>p0i)@z>ATk&jBrGnNA0l!***po9kC
> zKffM*E376N4p87<^k<z~QukSwLg^&kj||2?k(u!RCE0Q$34dfeabz#X7s$M$R;Y>^
> zkM at aKb~q{>E!7_0+8O~V;*G;WkRF-C>uDi+AdjSe5d(GTb6 at 29jpAA^&Y)9y)kLm;
> zaS8uuJ9=z8##hNydlEiv6YM-zRO at W&69X`wZyWm6B?Y#SkW+E^1Q~SddHgGR_tYx9
> zm4toWOB3bdIcJXrWX#w3 at KAB)>qOj>G=I%mEqtycp?IL(*EsB<Mo@@9K7grG&343R
> zDv_cCpC|IF4m>aN+75h?$TJ=IN|861Iw)#HMMu8Y5x at D^sSYe at t?eIHsY;t`GZ|wZ
> z;)0cj*T9~Dv$dy{q<^y{RR!xPsA((SAhq#f9P#bF_ at s7VW|QV`hFJ at _mLp*n74Kiq
> zWNS74fUxv5v7!t#I*>K>N-uWjP{V3C(D0r>{h&CX$|^xdd#l#S=)<bDaxeRa#%WPm
> z2G|>@2gIzXX5ikk<RCq-t{&-Y?5PQZ^xAS{BsqLK=INSxby_NO-V`KM)Wi*C1T-{A
> z<sQ^g(bXs~S9WlvlksuFd>d-jHz`+`LO$k|tJQMACp!dO>k0Uqsx{>+X&6R>|9 at x{
> zpEcf5($*#Y<kn|s>!Aj%yT`gJbNLF|q8W?!=iA#`SDf$A-9=A#mpt9|OnFXhe(;Iz
> zu5 at VK;Awr$tM&6@>*8jmF*+r)q(AkM9ii%JB=Kj0#`xTz6UFBYjq`Z9<?- at sRjG`A
> ztJ+fj^~N=DM~&R at jOcG}lNilvjT}uQS#~BeWm1z;Fx)ASIp<JAAzG~-YS0^C4YhJS
> z6S$Vc*NOeiBs`OZeD^$7k$K<6!a*(kE)wUF-QPVQUSu at -nC@w7b~(B|-h=A%B;>5Y
> zpmxIMG^ULG%GWsFdy8s990^>@uGdKB*?z&Pj>PsGSd&Le&i24V$jP(Av7M;SeHorp
> z at Au4cUR5(PO<R+d7O^W?$l+QJ9Uzy_jqVzXeo4QjGa8e(QYFmW7(N5e4KfC#jA>GG
> zE!(Pyxo!>SZD;F(v9%ITSiJF-hZ>_kB@=e%-KPAz*sJeaN4F=UX at F#!?=n+19|<r>
> ziPxeh51zKeQS4}=(2gcEzwd+V$cFEqkDTr3UbDNRU)@(vG~<cl2M$+~aX&<2Ey?{M
> z9!HS1KRiu;?EXUr9!&zy566qhg!7|t8QFL~30CFk`6#Xr*YZIx7&WZf2PwvYo<A9*
> zlPhQ;1|`(fY3QJS1(Mc!O<mgDgJEgfgZ?4!(Mzso&mAm&?x1B~&4<KLAC7mE)cQD0
> z0j~pQEy<~m#MjAN^|APSvZX%C?_>-8;X)vk at mGkwJ~XMJ$~a*I*2>%sXu~$;%e~#;
> zb<Mc^3*fpDSAD-pk)lt7=OF(dWFEp_2(@N5saM;fXk6LKRP{ARYr at Jt$&SDpDJCD9
> zfV7Z+7*$0L9*PheijhH%;3$ot>?tuFfHgusc3KF?_&8wS!f)Y3u#nWo(-T$GrAaL`
> zw5(ihm%T$WdI^pu93O3h98_)9A{l*CHKOp8*j&y=wzfO!mX-f&E`sg?e--V2 at wQ*n
> zM3(&+4#h?Bk9~7=uC&yHdPjn^{}1Z#sD*S#JlC>$b`#vlTO6*FtwYPws{S>)tu29X
> zs8<NrWGDZjD{kv0uh at S8_gihZ5O}hTsOnqILOGoQTp!ZyVvkfrFWPja$?wUV%{SQ*
> zpRP1_<js^HO<ubg9yzX~b}7|b$om(=tg|xxp1c at +;TjcxT&?AiDhDgu=MLYx|6eeE
> zs{c6{zXUOujywd}J6+i^K0hcR(r4v#2+U6)OD`qjo#cZ{N$`I9QdHC#M?5>1X at Xn&
> zg@>A&m3*%IruMtC;c^VVLb{0W#>=rUTyZ2yW=DN^gJpoq>^5}sHDw~-_euV!M&!qJ
> z;I)rCBZn`?2lZ;o=jV8Z+ejKO_ejw?68SmVOALR~tjB7LEUG-jb1mDI?XC6E#Pn0*
> z;MBt7j>PP_hGux?GqfMRew;K|_fWlhx<bl+qT at UwzF+()HWH$g#!5%p&XTzj-pj4k
> z&~bTdWnSB^Mdp<ka5_0~Wk3}DZMQ!8m*NgJoPOyBM<i*xq8%G%*FT|x?ZmY`%oiJW
> z>Cmu_{@()7bnBqGN9H*qWA$R|YWn}c;6XdcSnh4(-;?Zgyn>TRr>jZ$Z!+|1EZmCO
> zSD%3*b{{ZR<owk*yxMmE>Mkuj0+judgr|{{zi{{?5^$>r-b9Ap>W7`SdAEucHs9Zi
> z6W2FHAF5!mQGstBa&*E<O=w-$BGl7Rgx-bMB6#^h;?i&aD-!?yR9#9DS`4poeTq;+
> zuOc)XUX?wIP)+Y5)ET%jrXtidtO!+P7NME&@`cx#&7n~^-sjT^MX2h~uqga=Al`WB
> z&F(lVRcG7^O)84ew$0@;@%)%EwM8iR>mrnJrU=agtiN1 at azIwYtK?A1EZm~Bt{FyB
> zUqAELAG4FXZ64D9KbzRz4KFUrnH at VnXl+Q@psxMiYB>Gg5$(`^tH+_h=vz(x*QdDZ
> zs at 61yyu9zT)RCo$UpG%})Vz4<{=(1ukG|bju+g4=c>k(71M<vz#7?~YX_x&|GRUI)
> zccRV~X09#&Ip#rm+Ma!lsB_)3iGRL>xz-5lx|HeHHHT8l*M6|<*!3 at 0_unzpw`(^?
> z*xLtR{Qh(RxsfvC$~$VobnLq`V`qN%cFfK;=k3ACG5s&aUfcfVt7ozbs!MAwbejH#
> zrt~zwe$JamufF*GaNqB at WkyWxzhuO&wu&BA`v3k^KYq*lWudVRX=@ILR!**RejB{I
> RIADL<nJV<uV#Vek{~xhzhw}gc
>
> diff --git a/mediatek/WIFI_RAM_CODE_MT7961_1.bin b/mediatek/WIFI_RAM_CODE_MT7961_1.bin
> index cecbe5d21bcd9163c8f5e5a8b14088563c2d6a85..b3b58b4ee551c4a828d948f5cdf435907b11bcb1 100644
> GIT binary patch
> delta 277217
> zc-oY_3w#q*_BeiLGD(v*Z9^ZFzG%{S3zPx{3xtriA?-jZ;iaV(C=Wqc7g11HL32Z=
> zP_SZU<e{<{w8rAHY}HzdB2Gae0t at IG*L4|1(ArMaO#!8JBmJE_X-nPR at Bj1pfBNZU
> z?!D)pd+s^sp2xj2)7+N(?UCI2Xl0&hgl7G7afz{cr4&+e`Zo$nDSNLeM6=PV*W1bs
> zA;+Jyjil-PH=p`h9iL{sLvJp>Rl8ao%_7DErA_6xwoMmDdzbM$HKkfF%_*fcAH||l
> zj&IlGm92f;!}=(<Qfgoj-5}~olV+P|YENoE;LPisvS*}}<{6JwT@*{Fw|a6pnnkJy
> zJR at 0p!%cvppZL|2&eCg3_y>d2lezWcXiu1RtvZ>*qRpf!&a~*51*YtfT)YA|h#5di
> zQ*g9BjYUD{0d<a)=3T}VQW+K$#&BuadV>;Eq3soXMNq=;N-oJ`7zB|XfbeP<okNR*
> zM1wmNu#A?{jM|HL+zJ-a(VWtvLo=l`c~UM>&msRoKgIU;yi95+J=Z4cgXP=dqF!p?
> z%R&<EQ?aU>g?Uj=x+Iokyd~x&jDB%&W-&!Zb6M2OLk4k3G#C at A|BVIlE?KnmQRmyv
> zn_{YStaBaPd*>fz42r at kxrYYeWMWBAEC@sI;_>(b7 at Uvh0}@35MW7Q_L9?5s?#~86
> z{t}>D)MJ(3;YTt-uaS9qX+BvyBc-owQ6O|@f-oU!IW|j+7z4E%r^7JGQiFIOU$0G5
> zkl$8qhO*QYTfCP4R%=O6PCcU{Xt0?@sM0U^;aByLFgk~x(#Bgt(}sM-2{i`G+TLCu
> z$l@@2zvG_>jlcg^#e>XGo_}x@^gz%fUoem!LRbz}zzQLpp(j=>FlksM7IKt{Dwyua
> zIZFykE`+gE4Fch;#42os5!I$81=D4S5<m8vu>jKWg+|8`;?;+?V^vf=rVpJHld- at J
> zzYqedGd%2`pbt2TrB(=hWmsa+pRo$=kMKAw)y{>vm86La78HauXvoG_aumrAvee<N
> z4*i+&ELE}GJ+^EY8UqNwaR3K#I!itKH at BvuK2z=0NbhshGX~)NO^%XVPWPU!sG=CI
> z&Eo}ZiO?&xM|nnlA&5+`YMxjK5)tJ4wb-74t=tlrv4RX;k=vu>Qst(@I0Lg#PXo6M
> z9P&AOa>?p4g(SO8vCA2YJ}6zB2}(RhN^61 at SMs(y97<yYC3Ypg;tqoHII<oq)QXUv
> z38XhjZ3fidQ-Y}R at H<&bvvZj^h^4mHL(wRu{X(7A^-Sqo#?)S+XDYeJL8P1aIp`J#
> zyrP#6fh$^mlB2*_JX(IM+CSrpk&;&s5Fr1;z(B?!LBk~zW<S`8Ra`Pl)qM|b69W at D
> z2ud)+u7!$8qyo&#@8Etix$i+N^}yRQ33d*d6v^KL)Adjq-S;~JAdT{jC_);PrbuZP
> zy?QqAr=IYK at CIs4WT47n0gkEXi!<5Y-k^46*>&`o)u$O+e#?#<z1`9%F+3POjvCNg
> zNI=9m=?moUQ-Lgcc^peWVug}fCX?E767CE7<^ZZc{ZBG%ArO;6G^qxpzN-@!bgNun
> zB&Frh5nBW!Tphwht4^K5=<pJb0*x6f*$evR0<3(Z{8mkwIGX!L$m%PN6-T at EIgdtQ
> z^V$TJXSj^e8i4mG<x(+}u7Iiyf%}qvT%bh;qD4y*K!dK}Gaee0kU+Ci+L at s&wIHoR
> zO=*a(*=4X?vCyNH0j7}|E=Yi82ILoUS})g5AFOzq3~{!g9#qckWA=;y6qjbog8E#|
> z2yvlYUn- at 6Ej3R)m;4Z?<dT6ORKXAO2=p at hL%^sIE at coqL65mqDQ$pJVDmU7))T^(
> zw+Qhpwfk%<s-s#lSynRn<ziv~x>>UE7#dW97U=Z~OFicSl7k~EL3f at bLVE6RoPbrP
> zIJ;a`Re`9{oYfTf?0Fy}lckpZLV%WUYIO{-(uvavGfgiY%na1!M;)M{zPaujv9MyJ
> z>egNFRdorxSJYka)n^SpCYBY*zlhVxn%I2~N_Hr6=>f%Z><=so_F3RS2CxbA-fb{y
> zZJS+40P%2{Al<CMTA8s8$|H!hS$gSAxT2+ZIMlx!!IRSuw}XuY3 at j?{6vD{B4>VLD
> zMKJIh?w<xyxD=MkSqT#EF%Uf;{x;mDfUE>y`2jG|y}iE*3ej9gftjVe8cy(D=iQMh
> z(eho7<`;)(XmSK>-uB(QqN42@?{y18Q$#}!RhaJ9at70o!gOQUXTwb+Y#Tule$V#$
> zzw~23PMI{;Jh4z>y(Lzp8CH&%2~7o@*$3#v6c#Ob3I6{iyQ6fYw%TusugnvZ!6g$%
> z#xi3Z7O$pfIHTKg$dqL*2X9Lti|swbIlY+d)p%d&87>+I0Fwal4FFu*57?750GC7@
> zE&PV`{Ra2<BNMUez(nY{2<The-<Q<)_YO>UU>ti04D>1h?;jW_gn$kJ1oyQc9%v8#
> zO?zZt`|*MH$N at ql2MrY62lv?kTr`2R%Yf1SfIaE}{nY}1`UXJN11Qx4keWWo4pUaK
> zb^uZ{014p;=l}`?iaRcdqXT!_UjbtU3b^i5fV$peA0CKWw)}+{H at PZlpoZ?N3F-R{
> z?)#1G`z2)e#glSb-B;f?G)E!;CpLR2LYyL!8x3P558NZ79SH;wzz%W+U<3nz5!}=O
> zAb)sh?0gEXg_VbHKV)2UauI><nFNNBfn}uUC}}>&5SIuVt(WHa7)d>>feTOz&gFuF
> zr8b=HG0D)dfL69~42%Wtmye5?Y$tUnI2;1uuUP8daYpUQDwcA={e$<yf_}FrAMnEx
> zpI->k>3ojv^OSVIr__`}{jV&F{amigBX#$?;ch%flYWh`#{RIW6+x^@;bl-iL9RzL
> zOId2lzgT1sAHh<0cCb|YP!f-BctA#T59#{l{qlW2S>j3A^8G~8_1sdHp1)BpPwFFO
> za^J6!v>*6Vz9)Va{HQz}J?d%M#(-yf`lhS|kCorrk_&hCJM`M}TNsI>$;`o;f^B~s
> zI*eQ_BO!j2`uH-7UOgcDQJMDNf6h|kariyWqMv88NLnDn7Dyx^*$6|_gLcsY&&r}{
> z$t<!?CGH>O1ObsWpZHc8Q}3M%cDN~!DV;{DtcU`&ObR7JVGF<lHuRyqIiR}72kvS~
> z-m~g!mabSK4`(H50ht6H6tJhyXaR!Su$l~x%@_o`@d at rDPX^)i<L?pJowKNRx+97E
> z(38lbYuh|=Fw;MP2kE_YR94*IL8#o at WBg5qQ)|&F^mlzkD^*(cl-uw0qp9aKn|Wt!
> z(hQ<gy?3_DdNx+J(DUSbS!0SUL{DTLMe0}N`tkDp5Ayv4u;bVmcCt!5KnUc6<7Q|4
> z3fN}=cJ9qBoW7?VtKK{>7FqY{-8hJp#iE)*(~k4|_$_f+Gd7swm*h#Sr47<*?}SPE
> zI=$)NOKNeDv;mJET<cxNnftRWoQ;=?sm<vY)a$<!)&ePlCj_#H`TQ?&xkEXhIJ%5R
> zUCuFk7zhff7L9X^^f%rZUz*##!a2s8(Tnd46?7zmYFP|A{w at h)nisdQ&PS|jWS4U9
> zgf)&~BC*Chg>Q{dr2fW#9)Dj9U>Ei7_+!+&C|?mw-w6|<O~Eh&OTq|y(;gOFUOsTT
> zx#1DG8`lgz*TOp=X^VimR=G6`?v6LCgS*t8#DJeK7MzcWh0Q7<)S{z(Q2tiRmKKTk
> zlRHu)COgN-ZP)*+?Yfx!OhJWH$&`Rb>ZH%PRF;nYhgDu0wbS`K3F$h#38(ugbLxIn
> z*9NnElFv&tP#XT;#NoyzO;`o&%?_}4k{*_&zFu$o(~?T8`R{s?gy7<U26H~XDN&#O
> zF*sZpzcJ)`g^p6yAk!N<t;fh!nSyl*`8q9K>BHkXa!qeoD*2woq$KJFO<HOdPRB{L
> zDUQI@(U2P_2kQC!;iIYZ{DZ at DXq}edH++;`ZHg_)&o at NUV&OCDidx-AHRk-tY`RTr
> z(v;-xVY^kN1owHnav^}aEtAp(Fp6xNFidgnKN+UDCNr!t#OI^xs6CM5Kzsts>m4rp
> zj3Xpb_y4s4Rr-*jQ^8x3##4XcpGeB2m+Se4q}eIo!1Oo3qP{GSMyZ&rvw5bFcN!$#
> zn=NQCB$B*_AEuu;*MJ~t6x6PKoE|U(HEYDtk{1+lI9Ao at S+qH(dOOY{dC({S+GBQo
> zAl+f9-X8>do8uWn#Xjcdtdl4h2SM~^hW?M2->S>y8}w6Gy#;&@t{6ruSrk#~VLn!X
> zw|EI_I0H+^eCikK+V(a<%KI(kdJs(oypdJMAmXgR_gJQ$Jz=ySMmnFvrbOY~73+S4
> zd|OOUr&OYcF+<|2rW%%d>;uWeml_gmkLR}{kU)n;ul&0>yG(%^TM?IS%7U6)<v&Ug
> zdcj%LRgH<!`MgUZL;?ac$(3ID)uL1W3*=(!=Y5Hd)bOo_Oj at PnuNqPe9Ry+Tiv(d^
> zLI9;INL&b_sK>!9Dr5Qd<g_tspu7>v)Gs%?=u#v^4-D~=MW-_T=MX9rzd6~EcA%eZ
> z)pT*TJM1pes#0;GM<wG+;ZG)yP(UWl`;rsr?!A0iih=rw&rOM0C6qEk2uE>MV0*2&
> z8f<TqkmiZ-(XLawmR01dlq}W#kVkorfxNf3_fK%8$}Dx?c)l`f|MDyhd`bE{<jO at b
> zbTFym4AS3W_)C`DplRYl|4A_08e_s=p7o~kO({|K^+Vn2CTb_F&9b-)-5llL0zu~%
> ze-V+D$kv5>vugApuXXrE)1Oi*Swx+5>*V<zhe7@&i{((?43EPQU7nOC at Yw6FV?DI&
> zZz4NQ!?56vC$%#>!H+43%_-R|7Rp#+0gZa1jArXyH0sIXLcTIJUIR>3PbV&e$El;K
> z`}wBSB>Qn$boB$GBk&7l(QPH6PU*L$ie883pVA`&<5UQ=^w;l`JD7ZBDsm^1B;@D4
> zT@;8?2bk;rQ-JC^F&XeIEma7ioFZTzOPpl;0=P(&VLn!Y^l$zXZf*WkewuR=_OB~&
> z2kmTYqV_hi)HetDHE9MapRZ4go;_vHa3R!+^rIQ1$mcR!^wnEiHQt)m?I5_ndZ&=J
> z0Tz4!BG6ul$~7{?#{@!6AR_xA_+QeJ?a{CMF^5c40ZVp-<fSINg$gx2gzS{jJrLYR
> zm+PL%x9Z{75bETrfbFRsRUaHu{6zMVj1RTEZF=L&^Q8}<Jm;IuD;i&DS<0DPtc`CP
> zN4C7Pv%r|s^3LgWA>FnX4YTn`y=NlMVyRMlyj$ZO$LVpgSi~Wn0&Vm}gYBV8584zc
> z3V#1+)V4Gm*R(V at jyY;=5uo%=9c2t_d50vRWb+JP88o!fIi at +i1~qD0^hZ at u)rcbS
> zJ7xIOqsXvWGy9Z`_mRD~aRN)(OMh>R#A>YG!(wo0Gj6%Vpse4+(kTGE836CaSA+<e
> zq$U41DV`7+q7Et0G~GJ%gx3gDnMMdCP=u>ks8a*PguZEwB|MvY_DlPD(-Suvj8DCv
> z1^?NcU|jS52#Zsx2U at k;GXQCC at 3%(n``N|=?`Q9Os!@CB+)+K0N7PZaWvIaz_Wp>{
> z2kc(c6W<LpK6T6r|HTByu at Z|j91p^A(x^RFY&>wR_%4oPB?Lzp+H4FvRw5$_{_;GZ
> zoSCn_+2B!_;-IiJb6mU_Ab7?b9$Mx&ME%BxjzO;f-7vl>GumFV(_kEatmJeEajo8`
> zz5Vbz2H^GhN*iNZEn{8%<$0R|10!ZU0lx(9ap#yrT`gxCC$?O1j;*5_$NHUwWn}zz
> zMQ4PuvgPeh!kw#{r!~%QDd6-iX^pFl2_RD#wdEbG<SkhS`+Bn5uy~g{lup7y?V~z_
> z2}FBJr^-jn`JVz-sIN{*GV?nJiPD2u%%<#{O;_not!)gm`D#_C+F1F1*3QyT<1ghm
> zzvlVXl>J?5pf#Kcv>vlUtM*bBX(hCovcEiE{wZ_GKq~M at 4g*X!$f**Pebb{k)MzT(
> zh1AZ;ave;4dN<Tf{;z2Zeq>sG`x00OIhZtsEV;}ZvooR}n*&Y)f<c|1##B=Q^dAW>
> zZDV%I_{U7yw=dP2bwiNam~djf8DXb*K%N#Y<U#;?`6|_!WYbmmUe$NT6A06!+n4xD
> z*@;6Q<IH!$bq1_9hMjoKzs0NJ?_>`(PTv5w8p*-KGbT+zsR(%jk$0d*-bjM7G2!Iu
> zws at k@n3DI+N$Po=w~dIgle{+y;^o!ELz8U^h?e)6;x+q@;bRU?e{9P!#^?ArO75i)
> z4HzHi&PQ0Q)XCy3X*a|l=S*2_`3(x<`E>AX1K6$MKc2Ip;C-#tWCKIS8KT+Oid!8V
> zYTa_2Ij;@i7%L<35hU*^2$BGTR;KSXAeh`i7Y-0%e*r<n4;z_eUr)BCr17M;Vvo0u
> ztI`)?^fM)9fm8XDW}l#FrQDIyWn#gt_3C7khHV<u<1KI9d+0bt;NM54mo)oI=cBm4
> z#s%O3_6M9L77~mkc at b@LpHIDYrpcOp&?n=9f^QiaGd0zsM|-g#&K8mg15G1f+&E&)
> zh$-Vxi>h%9)IUf}*~tg3C?d~>lq(y at 8Y@q(_)-P((~e5d)a=88!*Jc<4!t`R)n&?>
> zo`6?)FO$Jq8Pg`1bj7H|$iSqh5EwA at Flp~)e#fYkaj9U7t<LLWq4zSGY+#b~NCH8o
> z2u`oJ_sRFs-zUGXbdLKXUq0u!GAfbE<?oD236aO7m%^Cy_>noOIWkEF*By?OmX`;3
> zxR&s6dNbimACY6cb$B%p at KjD>KpK7ZGl91X at 8#wXfOO;z8#JvIFvKOo!{gNZw3zV$
> zA}Ue37L7WiC|zgH?C1V;;C}OBvG8KJ)u&EowmB%dcfBcVhL-e}ac4r0a4Uw%ZjyG7
> zg=Qx-C){mr{@(NHX+2h%VoQw{J at pz0DQKYdwm6e79i5%5+4pO%Bl!klz7sG780(ao
> zzfxv?Hos_8>~Glq{s7zcM$!q$P2~&$?)QOw5db0G<q@?OJ$-p#d{UBNe0^?gxD2mQ
> z0Ok2)K)xh*e8wONDsrIZA-s~v(0t>#+7?v({nc=D%mJep at eR2X#|0GA;;j=i%6O!x
> zF%ZcT^%wQ#wW;WR1Zu5nRlb;C#vsiHH8~1RJ+B*+ZPq+bIPa?_yQP}?_o!2fR at xnM
> zcTqDMZ{2bFeTA4#5L);4_KJGj^UwC;E8F$P11EpSKQShL^urg1_UQ)n!<l5&fDQ!u
> zCkNKbn+p88m=1CJQ{H9#hhtLGQn{2qR&A2u77T*RbdGy*V_7sB!E47R*@qt5-jd!p
> zrbXydID^5~275xCEhj^~H}^1Z#yMV0_9$DCpm07WCjX)!G<j6VR4*2kMIlA&R)?zj
> zGz4h7nq8k8T2(N8NHzw|?vKFM#=G>9If{C$2S`U*Dq?zuc$nlK8{7Nqc(&I+jU2{k
> z>isAENUj?}tSjWPllco{^|>pwj>1}3MJ5&2D7DlyLUc6O3Taaoo(>>O!So8?P_2jF
> zX!+>SA!y6zhmRY%VuiL=@7!@x<wwnwlkKy+fOFFc*>;=TlkqnlY3;N_-;vzouF>|^
> z6;|ojneKn!a^GN~jjPCT-Jw{6GssYzS^`5gt_lnWHK+Kdaigfq{8!^*Vr*ieJVsDY
> zrO$!eniQN~ERq)S+Pp;B{y+Z9Gd`-R2q at X+r&^M7=pl7ojtVuUgt^0gb5a*M;4X0c
> z!Ita6)(9LWovT39a7KaRg*aOZ$~<@qQD|cIwqsh;#L}icN%<5;I)ta3&~nMHsVwzR
> zP*gP4WrvIt>2CwI&UU&J9Bq1gT8EmOCOJ$YkK4?M!F}G)YzkSi7QCtjyz1{BxA7P9
> z7KV=QYXdhXZRGRE3vsXM^O1_?^g12Vi)5e8R;XuEO_QNR#Dt6tAH=76i$2^9$ZBOo
> zKFDU*mEYoqilezJrtJmiO at CTZ%U4Y>TL09FvmjxsHHEyED;9wSRbbuyVv%u;ZG$Of
> zU8XTi>X8lU^CW<E=z9?UMqCVujh0iBRUnp|G^LgN)d|J+2Z_B11iB7=K)W1ftm&R>
> zO+dQ3yi$ZmGxKo#M?uaJ+)1bE5;-WL at kd52w}QKJRp`_jM{>(eaYO2{Mocz_aVw2S
> zxCbF*)^fjt)-Y&Y1+5Kztq)zj0`0#yuQkTEU+qv~jh&<_<Xo5Nguf_2f{nwOqTW|s
> zwgnwRQHY`$q^hMB`A}v at 5Xs+34_K%#laSc6te?;iZpwsem{+iZD`b>NbxFw;cocY=
> zW18uSA+7jzPH<*lHFt(L*Wfg)xnA=#C)!hgX1Wwtg~kz$51Ffs at z<4g&8Fap at -Kd<
> zsG@>Shg4M2Q83gh?^c|yt5PIkjpt-VCjEgo-hCV~Xc9|pzUn^eDTliIyz#<3W;vpW
> z7^#t9wVK2tRD_0jZ=!LaUvrThiZIKlNi9j>1Y`)iDXVn7n2s?gfNO7ZPKLB-#KFxz
> z#TOZ7rXJ0Sphn*0AWfP>O~T-kN}XcbO~!fKjCJUg+8pIXb5g01(or#GI|@J%q_yff
> zQGh<H^e|T?rkTxpRM%E_v*JPZryho!7eVBV{HJo}M3i4rhU7#<EZ|2 at OtzE?Vj;Iw
> zoaG&3(FODJ&Sy2}6w^66U`2jP7lL3K)5>+21|6P8B5!FCzT$n7)**G at F8;2GBcf#`
> zic*lE60S)IBp_YlKbx3xpF~!+3&|s^;JN at L!~_-!^grOA;V}4WuX8t^k=|}VzB;MA
> zON|iqxo?|K%~at~8ljk4;X+^ZLFiO;o3dsyeA%Sf`(?Tr6``BkLg+3*^cYjf(C70}
> zDCOHCg!vdjE0s%<TVo0dzHHGcFBekWI$yOX6rlFsEkk755$J<eU5e|pIEOzu>5!dZ
> zw-D^aS4!osE|>DfQ$DIzv4`?GpsYMHhKa&j*E1*8m0ifNe{5ZPC*5Nc=eWk;%sRSO
> zbzLLQDM8dDOdbxY$ff(-xJ>l|n1xoRI@`yTDX1wv%J;NX4s-wU$k at Pds#__2!&2A3
> z at +eR^)*Z<MCmMDa1%fbariBkPE~T%(#Xo9%M>B?mH&D5m&z(|3+4z<z>muj)LVOO-
> zSjdCJu^Ftf>h^iwXv(1G at XJk4kCHh^_duV98yb!yJoITqi$h=bDvA^<nJP5Frxi5B
> zu>3lnPnc>@-Z8}weV#9znr-(Quuw*$Z#d+u_0Xrkf+Wr8+ksWm+xUt}GmDW<H-$+i
> zBYK^S2*<-o%J^$;JMDYAGyJYF=_Q1{H$r4aWN=qJvo419M^$qBS|IHbUWvC64-7=9
> zVBYx6Fb{)y at 6_xh6IkR3odSo!ZzTMN+oG^qvO-d%lT6-Deu8=U(4qVCk&=o~;33=(
> zggW2T<jSu$C(}RZ_?_lh!&p4M5S6N<5LVv^#VVWyezmD at -qe*VQaSH7XV~9sNp?Pd
> zUA=>DF4#leiD{uEFCB?uoNu$#3xD$j2h6NVGxIXefEcPAR+iouj0^A*>^S&1OI2=z
> zgi9fsrF;Euf3YbR7-VglE~OiFz at Q{N)D&B$^?uk?O7`$`BBtbhtbi4J#->A=uI=sR
> zWjFXW1 at Y8men-Iw>L}k*V4xo3zbF_3HNk}=V$Xme{s2a69g~MbD)Q-hSlzXi?fv(c
> zd|9D^YUbA#CZ$Z4MtElAM2?DTD<U$?M-ECbp$629!q7d}x3VaQ=ie$!88KNfR5S*q
> z;OR};{ZB}f9aeXuC$=JAF`TF#hXcx|Y#@T$RrCP0hF?*Xl6Dy4nS#5E{EIM7HaVPG
> z9!l at fnBpSJ`6ES%86Q?}J*IWFARQLTq21n}j%hiHlw2)P`o1*;9DA(vFn_&ha=f}n
> zA^nOodT6|urFQQUg8G?U7R8rX(nfths3sHAi|<@?jltZ2wQxsaFsE2+MwyK3EtZmA
> z=3lfVtlo<`FxK)=n?x&v&;)^T<+7Cb6|TU0pKHQSgBRn~EcIB$Ak;<(9IeEQD~6LH
> zxNppS-w at em1=dRU%LA+gZw9f4R0I>yN(Np(Eq2@^oSwuf-ureYdoeQ(X#v|jWN`c)
> zjd6SqQIFG=i!)eM`GD-Y_j6itG5^rC at zh)VE7K-Ut_KJ~dYGxlLtyC#1CzcY=LiU)
> zX?upcEo67x8(d>(|F(0GWkGL|)yxmIjw1E|xlLJR4ScCJ+5Ap}<n(3>vq^|!?{&}g
> z1mjHCTig<hxlG?fvlO4_IR?Q~5N7cbSOCc|WDsyZlT2>cr!b)-)>tZ$cUu!jSAh(J
> zTeTI#s1Wac6~kyXIElZ1%z)aC_bA{x0Z9D(PMBLs#+shUM-`{i((n06#hWs=f|ee^
> z!QIc|D&lnWom#c`1aJva<czFvUwFedu+97U%f$)#L-*I^7E<-=#5urz12~|s7#?Yv
> z^>{+rI`otU(dBG!_Zv|Ro>0BDRqIXHt))6$xzZUvw`928d*Qc=w)^m4Mce(_djX5w
> zclsxLz at LdtCMSR3yze=uy=$g|e*rFji?`xep-qAAksjVj>5$_`vYoqPv1bIZDzs0V
> z(txBo>0!<eQ4F5o7b^DAi8vT4(@`Wi0Ub=U9$6Yrm?j5b-oaYT%FASh?0K#*SGSI=
> z6LZvlgcWr;;v5nliHks~Qd^R`9QZ0eMFQiVLb2$=Jr_fz45FOUK1*cieb=dGJKhFL
> zy2#(qoYYjrQVX|-VF7$!MnHpSrScVQQurw>oDLsUSIcI^XY?VNgQw$FeMkf at nMJzu
> zZ=YqiQz4f*!Q!NbnO at rd1HWj-WWy|P5xAMrrmR`Z#dN>(HG#xFs8K9}2xyoo1fbrX
> zF*@e5<iJ$G&9_H&1aqaP_*%c@*j1V~OKu{2Wn{wypCXfUBug7FqyrbVgQis?PiwnJ
> zi?6r`PnR7u-8OF*zrHlZz7hJ4y%;hGYI*<)dJDhlJwvYF8tA=$vvi*gA)91`h(!$<
> zz&!ZX!0&wc4Tj%)y(i#$pZ5k_7XZa={(=C#_>{B}U%3!VT(Xp5A3$FbAUc4)If+Y#
> z)wF^|;q%UDykBz$4<jhOW95XPgP=QC<~QJzU5=KdvxA9W7$DLUN(T82`HKck{-AfP
> zYXe|v at rHcudK_*(F>0SJ<y|uuj=tMr at pZ)wI)KWd{|%}txkV<GA6u4N@&Si~{3nUT
> z&W#{~!B_u_t|fg;{cmJT at 6MZlqin<=0t)`mK81t&FthHN7|^Vfpjm4{6}RI<5F~5-
> zg2Qb3-KNVu-<}SGrI#v%ILEziE}d^yL%b1(vpB0XnO{E(Q~(q{39Ut`7ZV`T_yx?o
> z0fd$sRgDx8U_7H<MT~A8N+X8$`nP1^rgkHFTlup)#Lb_0p?~Y&-It3KYUtfS4epCS
> z(t$q$q2=GHr-Nl$f^d*662%c3;so`x2HP^!SjP9>AY>DCST6)i0-tM(i4_Dj1MvkI
> z#!m`SRET&$JkZx#Ws9K%exohdjvvG6*h=SNikNo1hAV;`-5}pT$Qigoyh6Swb=JQ7
> zN-miz;+Dww_ky+sLBO#B?rriBC+#f4Lbc=F5ZAe5BPDmsR1}FG>vBMb@;k^)R&$0*
> z1EN at J!Ej%-GjGr634)Sr6 at w=_>{Ix+_zN9HzUr<m_$sKO;G;zg1Yk=p4y;i=cTRMo
> ze9s|BZz4nQ1*=kjoxY&};kjh7*3KRkL{`um?+yOM>~Yj={`%~!=)2f<{{O<Zbk0m_
> zH{Ud81a*SHJZBtSb#q5h-|)t{X^C(8C|eQ^^{)4VH!p|87kJxm>6-Yb<|gRM%}^OJ
> zQ28PM#@r11#?vIsYWok<WBor&Pw`;WgBq~1qLIo$^DuczJP1UaZk`{dZPWD@>*nHg
> zvMqt912b!di&6&8mPhq at hM23OB6Q1e`h^dhlcE5`3LqPV69XU}{L*=279aGNv`0Dg
> z*Bxco(W0`sXo;h!e}4Ew-C`UH|6%YS&QkZa;44B<|HN#1PlQcr?`>x~=^6{xG?g at Q
> zEH(0LfEnP3EswuG&lGpxdZ^R|Do-;z+xD)7Jl_S)CH(aHX|t<9 at Ybe6DIK3O>JGgH
> zL8?mHShft^dvP$Y=JoT$6MA=j1CEEF?E%szbL*sW<X;}*h55O*<D;$$ol26&AJ4=B
> zOTG80%a6BStup5t<GQHkB-e>OUvN&~$<)Cf%!Zq%_E=yLBCeCLwodwsAY1!J+Q^&l
> zjTs>gmba}5r$Y``=$UXvWvNo(-s3yT2F4jO=6m1qTkaigZwB}%&LDyJlWULos?lOR
> z^yp&f{UPa%SKd^}n<S at n>v5*X4^uehFYtlq!dFRt<fF)%02QDSm`x$OVank#41+@;
> zWh-xZGD3$UeH3}d<=$b=yb5)J=6g$rs$mSy#w9HE)Ia##`$naJc~Qrb6b>)<Xz-Gc
> z!->IBClSYrs{<y8$M+ at EBaD2*eWPUiR>YNZ`X;4VM6B5DzjKD at Q+?L08m!x^D7D|h
> z{dC%b(2NKL(z4XMpVUznoeG-~69Y>zv#E$odD`2=2I at Z!*uYB{i4A;rwR0Uu1I%Nt
> zbDUnf({CqQrgF*lE(e&M0+yN&IkNvlvdP6#$F7lXf2$$ab5{t$xtvrIaBoneGpA!!
> z-vh9@;%Ks`K)5DEf^@$LSel<6B}dmRN;JtQwW;1JAUc at D27OPtS_sd(wut=2a at FjO
> za>i+MTJ}8Erk37nQw1J3aqJXFgZ;`8!kd(wo+}lLq&tvv26Gf7y$MZ9AbO at dPaY8c
> zZlWA&ALOo>UYPqJpT1yJXt$slunHY~)q)J_GGDtOCB{Iu#P5y}AT;3}{^Wv;pnjv}
> zTM!+;@jpV0nRi1BUSBafDW9<C(`n>-X%xABvR1zCkgvV`nu?*>wG;XV=>732&(IEr
> z5P9d at fN(DEfv_CPKY~6T!~BtoG4>KB3R5lm07<K7k-VOzM?TrlZSnvh2hzx#?1?%s
> zv7PP+@=+)Wljn!?JR!eXqGf?4D#td{%4mh!TWn*n-pA1l)>WX6yQ}I4ItuGNAwI^X
> z3Ul`%>0(Tp*?Rt=`(tA+dpF^Z!pG3MvPbE!f$(vHk{k&0`|nQ~*V&~og>1T9mtU*5
> zrQ$*<d4I4(Qg`bSlDHQi374*kmK#cUNPo&T+s0qNKO_E97tK*ev|S1p=<$WW5ii%e
> z2FA&hn)$rS6j;WT>ybtaZ9~K#Pq-8Uq56;BqQDaqWH|- at C?*HsU1JWG%I!b>rv0b>
> zc4x at zX6c#?aq~A2H)V*D!Zft5VZAf*@NDU=kCkF&!}<sv|9Rz0pev6q98Z<<jSCN`
> zj_xAU<VzP#kGkl!6(M~yV~fIW$!g0*cf4)<8;cfDt9fSeiKT!20|KW(f{6-5GmsPA
> z=Tiv5Bwd>I2$|-^r+l>ZBv?4O|LZbxz2K6sg4{ZuJRb;2g&C5GMyx7Srmk}`drTxC
> z2`Fss1U|KDT-qUrUg%fNLSXA!n{MYa@)8S-xCU^5zDc$G=Bl`g^DmLy4~mboR7=eu
> zi^1Sb84#^p)kOmYowXMS{Z`G==EG#h2~&NH^w%CnTnt`wU`5T|%=@ZFQ^~x3$@ua2
> z`agp8yWL-Su$opNooyY0#4mL~#b(#hkx1v!xJ-lk3;d2HiL!RJ6YaVfK4>~V{=|})
> z=)HHRP1Y$urh|S+OA=>)KpuXvT at d6gP>5~G4AF|CWS;*{@@^`80IlPYw*$g9{gJRE
> zd2+0UhHdaf?WEf2PS6GInZdfCJ;RqTO#z8-UOFxOX;ap0KMoc%@RdCUQVD-)>0Ho)
> z)MXh|BVW4gfp87ubWCztnR+y`Ype7sFD#2q{PO3ZpSSpGj!yl>5%nxqL|?=VIlq?x
> z*PP at 0FUvAm7PmPyVi{0cAf`wxrx(i{aPJ%|rtC4}V(;H9xs(}}@h%eIwJSQ~AY#2H
> z{f}P!isg_47o$|1i!69VyM?UYj(Ig;J+ZzT+t%ZJ+_;?u^~`P1Ty=Kbv)_2l+?m&K
> zY#xOacMalPZNneHljfi7Zs;~;&3!O`38G4u2t!}ka`4U55w0*7yC+=w5f?)Ml*?7!
> zbhLZ`VY1Nt!A+_{qp$~glIzqJ>V4mP7;#Z)6$)yYSa-1Yisv*Zlx;x at u5BKTXm{A&
> z)DN{~)hGlf;B*#^jP)qJN68}}{x)zmZ8enVJHMgJaSl>ieD&;LOS|kk1#xg+HiQgF
> z{qm6ZEf6p*<VKo8YW>O56_@#AhBF*7|Cys9v)dCU6p<jt9Z-ma5Pk1|U|jf{gM}Ra
> zCjZp~W9%P$lmt at vKoW%a$t#n%7}nb&@($wJJK%g-|G~0xXgMTGS4aZ)8?wwm*2?}I
> zlP*9Sm>>f}dlZ63AhIHpig&)r_TH=&Ml?KjxWG0SX>B at 0&Z#2QV=*->7gPMs6=A_=
> z)t;gFL)lNcR;1XkwcqRrA_m5yLyeO2Zmcyo4+dS1i(x=Atu}DRt;C?qr%`&-Cdi&X
> zJfne>HdRnLH+g5f%2;ap8xZfkX<LUIFWdkwJIPynPQ~4IH`m;-mTW)4IyKeM^XifI
> z?UI#=RAh;~5%WG*K;9nXs#rSh62I|517+i1d~jW2xBo*9RqRttkv_sf(&kB#43doG
> z?2e^ozQAX%dSptNYo52-HD3q8r0ZVkC)a)6ndAW!{b9eOVwhs+B!do3O3~@%I=ed@
> zyq5CFdbp~NJSJV>KVN0Yn(3Mk819uZ+$a4cLw@!@dhh4;tD~t4{N+`#1^0Sq4jQ+=
> z*AM at r*9Y>L%#p|cW90hPqepf4Ujg`GlMGsb*XpGfmYQ+HJw#e7D8WtT9U1RY9Lf93
> z&*UY!(s}$3tK*}u_%ZYdmU|>?_4}8 at 2!G`heiv{5L~aSi)svFz0&NfMZ`j`s7(W?^
> zeG2i(1KZmRebpTX*LvHlNLyJC4sS!nFeVfdIZeedy{21 at vyLw2T;3n?6%Wl_alPaE
> z1;RFUb?@sNe2SxsahCVTJ5&89$vp8joYGB6A4#jLd+jh``Ke{wT&&&y<o*-3aajGw
> zsVueO&;FAEYw5Q-k`HX>g!aOgq#KT3syl3K at 3*fxkigJRM0 at CW7Ng~uA^S~WOw=ru
> zv~Zi_^tc{d6GM(~IV9a|Dr!!G`t_W-If*=qj<>vN>5liGhPEX)UHLnic4dcR$VD9L
> z%Aco0|E|zcaTO?NSYNjVq!U-*>VAFFA2$PG``z)biFIwYSN1kR(4d4YLWDJ{W>KWZ
> z^F65hX_%wNN8v0w6;t9Ie$PXr?EBp&AKd^ht#mQr0W|?u^l0h3woy*S>o*ZbK?tUT
> z>XD*h0!tmf1X%z?pDjr^(?<vP!+utP#1drw4I}&`-0NqZYqKo{tATMLwj%P(Y|?lB
> zlU4 at l>a_hVoaCqaMCj-Ug`s0$=xFCD*LoiXg8CX(;dinM>Oc)r`c-8AYfyiY-~4+$
> zRlpn8MCNSi9?%Gcs}FqKzO+N>ng^N^^xxVwL&bmf`<VG3_O}3~$@TjE53$swH~%-5
> zq(A>RmZTT^VJn8wL4HKw^o9KNHS=uxT>q=U>{riOz+#+q6gc!}!v>;fE!d&CGUEcq
> zPq00Q7;l$r-kxx?)4_Z{uOl78N~%4oBf0K8zGm7!5Ai>(DW38F;r04T2ukAyN at ghK
> z^_M_g1<vsUeh)uvh`a>BEF~X#1$iH~BFZdH;+r4Npep&x4`)PIR`*8fkd_?s`}Meu
> zBy?gWKWyzNXt%DNo6^zOauv6UmWzyQJxh7xNZnb&ic%I8cJs&A8Z at u!s_ at q=vaI3T
> z*CtV2yy}suG0iy0qK~>EKTZ>5ik;sKrJLeRzVea8lviCxk38c#dNN$BB*%qyDqAE{
> z2M!E9khdJE1S<AFQb<2s&tG|D2K7BZ@=*izIbZf at 4D~9%;?eO*4;P|@kSK)Xjav6^
> zceI>g{m$nA-vmKe*ckrZM|17(l$h5h=)oLKY#0k6B6av(P61iVL{GR&1rA2-y2Vn(
> z_Y3O&NPFHsoDq0_7-l)tmCK at +>d0KJdgWoSRje!>VpbxA=86a4Y7-AwbD{ns)EfjP
> zI0C4LE2$5_uk7zIPwp`LzdFp5JIo&F&<{UfhM)6a at bhJOs0UB`jU!pKK;B7b{FA at 5
> zZUgltU$TB0b%Niye*XOl5WE2wLWdEqL_g5{K^OIjQhqg=&Zv^Jn-oaX22Sbb9kvYF
> z>H-J%s#w`%p%F at i9Q1?`YfHjI$YHB(G>))M#gR~ZiZ?wL8`JCwmL8^cIG$|b!+K#z
> zf-ODFuX!xi{`Tv?_#Exubq=I2^Ny2EBv%W0JGC2d>^<t+;#$j at xg|sxdz*aKHx;jM
> zz(HLUXTCwRlyw$o#!CT00e1TqK)ftV6(aqop61N1wRkC~kn8#WdP}2pLeTn at P16by
> zuX;R;e#*`deSAX1v#I30 at AlIj(N>=(q5Rg?<@}<@lcwz?J~$AxZ!3XJoRj00HbK#z
> zJcw#H+2X=h;7S|VMU{Cs(n%-WDn@}vLgsmkKlym_^m(6=t$9z3dziErQkS9MrFH~k
> z6*1H~V~yQ6!Sz}GefKa_hGt2^;Uh1l_V(@sL6EHj^v4E1XTxy1b1q-DVQA{SD}kM2
> zuo`S#G(<4Hz5ft&&?kfK{n`bBQ%dE0?S at gYL~O6&Vs0rR()*pOfNL}JjMn=de_=zy
> zioabTzW38`A0_W%{@LF~9 at TM}9R{+<$=RHsB5yfE_Val6qmrRafgX?^)**aZzKYKA
> z6&tB2s68oKExN~YZHTTkWzENy+ at Wr9p)0rHQP8lBylrFrTuj<5`k}vwGes*bbnN{z
> zl)A}#*n`SF;!HUwCoj64lwWUK4{6g)NSl&5h3lxx$6;8aJsdK{AHT_;*f>o4eiZ3!
> z(Z|Gq)wsHG)RaNwxz;wkMUO*Iu#~W}qMnX(-Qxn+wkX{@g}luZGavZ<L;u?X^L`*T
> zeCZ#?+kyO;_2NQ^<SOSOBnS~6?L{51Av{26U?MRbkQ(ILKn}+?A99W_U5kcD4}%Rw
> zj$g>=j$6bwj9<bbW7x-q at Lxa{TIy$zV8(F<uq<J&TduJzRrIS|0z2aZms<2KR at uo{
> z2EKn?GPolGW at hhcPvDdt1!MV_+WUUsTLj-f4-!yQ at vhw4h2&KBy_kzC=tp)#DA!6b
> zmkHdJ#tm3?=xie^!*3>Qq4BZ at uKP8vTw?HEe;6XX4Q%h7(7<_n9dCbPsFHAXKmXzr
> ziS{nH8EbIzb;s?`9LODtjhvcj>io>Wi3DCnl4EL$%cNsa7<tMoA7=+ceycq)7Or8o
> zD8w9 at fGO{*ws9!T+vY0OMWP57rBk3t(K_T5qJ{{_<ehzZtammxvede-L~HaZq>L62
> z!ojx{Dvy#N<&B%-Da4m=N{oJ(D+J;G-4kMkP^3=BSxar^@A(~@3Tf{R{?evw^-I%^
> z+yfcMXFR>Rc-)T>AVzZBNk`(a2px(K3`O|5&fFT}RzjW=Dm~vg!3OP;)%&z$;x}*3
> zNF>uM>Q4}y<9!Ys%s|S;_Wt?^STSL90zLmc|JCNC5W`Noo$iQ{iBvy1X50hh^s?uI
> z&%p)3uupTSbqB|=C?>)Oh(xnE4OX<Ce9?e>S;SS)HUx6rhn`HN+W8$%rcwEP)05HE
> zZvOO>hM?W}jOh at J^3#)3pnl|2X(NbK9_nB7=rNQFAsMWB2<m$OIsERkYaksnzxk=D
> z_R~0cl3tyPB5|-T8l(}4Lyi<k*L2kg<Op%cgDh3B6+*aB0VdX6g;G$cY%mk>QkI%_
> z5Q64V@|vnA5~M|Tj6z`?JNeiMX_4kj*B}C!j>bVfRj{;SB4nyZW!F)}=_8V`nxABk
> zoAk%=Wi<NLiu5xXgq{HtsB=!LP=|zadX5e}?ZHwnE%7il2)jLs8k!THf6EkG=$Ag@
> zciKl}jF;Yn^v!F^y0;E*<D6oaR*9&0^o-KpTUw7EB at bt^)Q*w-6?+uDV=DiPJvra~
> zS27wxw8gC<aHiPG%XM0d9v1LSGPXLDylhh#M%tu*lIIOb{Je7sZ^JPm|8#3T5#T|s
> z-c$UecnZbvP1s=Xg}{h;^P_93&S>(uTfQOz2}&Q$8KfMKx{1k0!;qkYa<Y_zt<o=b
> zZ5}Uq^8#$>6=67eVW~4L;1%}0i}kLlr8*RK#O|5|3%<t_=2LiKZEk;A_*WO5uXEAh
> zExpKwv|oMS_x_#8+Z?e&UKTBk9+Lj5icC64tdu1F2}g1^LjFQWfmH|Wt-|{ph(p&M
> zzAZqcDrZ^hJag4B6;?MDf^m2AA39PJ0f`F{<-fSu&D4Ffx7*W2j*on_E6D5NnJp;~
> z0J{}4f!*iv3cMW{ZZt>jGn<0nPbH6L`l>G^eV^Kq1kN%M40C0EPy;gijA%MCA|`m4
> z&ZvEMwMPZlRUQRgAM{mwG+2$Zo2psLS?f^%U1M|TDTn#GEn_I2Ke462K7|Na`I9N@
> zzFLTb8^mnsTW_-WlsEGergSM*{8izd;)fIpt6yv_G^`IXD{ABXg1;aqV#<+^l{t~A
> z^U5NqXrDv0yuPjdWZ88p9Qt2iFn-yFwrnoN$XK=oO=|8aU29h0j&0ac3F|<2&D=5G
> z{Cp<zcIJr|si*=`YHz1}r=}7-A at cpP3N?L;+;y|=>)<^5>$KiZ{zP?RR+DtmbCF{L
> z3+}#Fk9yWAq!}n*CJy(aTKY`N;TbMv2ElAbN~G<>GAVFR<XGM7CQSJYtdl(^O%WsI
> zkf%Gq=RRv=&`8i;!J=2r3cON>Rg#Z?luL>EqEmHM-^oNVD9GOy6-BPnbCR7u%o#G6
> z{Q5Y$VjneUQ2!m`Y&T1KLmZ<g2BTNO-{evTU`GvtZ3Ng<0t<<Q414D*-c)l>WGgIf
> zNX>e*4(j?AN72n{aWP+8GoE7k6E#`Xy?jSaRvHL1D8ZCf&dBeC8>O>urs6?L2}$fX
> zjv%rw%MqQ&PuQ9iyRSJV%86GtD|GeL3({F%?R9kzg!R&Pe$CdA%g4^}pY~6a-(092
> zc$tDA{~D0z0rIWbB|mtgYk#0qJE&cPb~D~eo{wY3q4f5pfmZU+irfySq#TonR;081
> zovp*{bY88V17CxKj)W7x`I3uV_vgvi$K>lWa{c2TMu9SzNR)p2X}HS*c}7VoFhquw
> zTAFJPJchT|L6Je!F)+x7G7(uYv+bO|M|oW%Z72O&lHi)|<2dB2 at u_{q+rX9%K}F~g
> znv33$uHV{nt2*jgtRjPPvjBZ2OOHA3|HyA?PyRI*nUS_b(Ov^{3cOYTgJ~APVBhkW
> zw at tKPyTyU9Ix+c(4;}YfQ!zw-h^0m>>k7ifD|EFwPT951dkF{K*0!o~#_dr5hkkQ=
> zA>lH<`af}hPH^LuWFk(8R%$+R=qu2$JP!3_N?+hAkWAn?d;;4ZVai%C4_D(?#dJ?{
> zR6U}lYrLy=?i9H>c$B=v8^rXUC~<K$c1N3575eiP=`?6v1F_G+lf;>%%w^YUO<9!<
> zmfT?S+USJsdBn4?*&ZMBtn|tk3Qpk(k~nF{C58OV9PORTJGbXTO2S{-9&N9}>6Iy%
> zB3p6Jt?h-Kii%7oh`jmCQhTC2VHKH*P^%t{r2*}$(GyDw(UilX_s}&4>02pB-mRNf
> zwhJjqb`;U-oYWrDkrgm^JMyK4<U32*g at xKe`Cp5OW^Dby`!&J8e|*_4BZ?(Q4djse
> z&QE at U4BV{+bYY~{c^t2Rg_j$s2Z+6%4!^Jqk*6qN at h|5O?1(J_F7rQO!NUN-8~lRz
> z2HEs!KiL_2S1NQWFuIOxnG(5}UMTeAp!}#8Au-x2I1o5a|Bey%99<L&t57R6SmpJU
> zVzW}tCuR^w<`)RGbNiu>TQVAtwOq|leUX-OoO9|7jdO4&abV=hj at QrNw)U%maXB0q
> zISk1{TnS>#B2GFV9iY9ZY<hb0m!ml+exSw>#Uq+AqnCNt)A{yo)extql9xKGOXcH4
> zs`ejX%yW^`^C=85jS^50*rNoN;$~q%U at Gq*dhkR;kD9V7=HbnOiQ0HH5^F$P>Mi=v
> zcg2~uzhEu-uz(|YQfgGH&mn(UAXTTAAFw(O-j`okr=vuEO<iJSF$5pOq7*2TiNqtx
> zdB%;^{DHcd1z$p47CA2Dz(@A1hf**^pXo+w_!o`$NT21SM`_?;K!JLDi#*DJD%CY$
> zRbWlxD-J`ayb8d=$ci31k?@EQdnP6YmifSV`M#RKz4T=@mWmmSh7nK4mpo&oYhLB+
> zpBZPr-OdD_Oe9Z@%BY@%`Pa*qG+Vm8zW_pKU9Acw;bEYqTIn-yGWjqXK_mUMo$l--
> z?rFb#;%s*4aa)^8P>Pj|4aIyi$cTnb2fXe+2cLnS$Eb&KSoy-8v6PLk+&L{NAnbZm
> z*8L-YO#vHrdndJroHy&-c|`2Iuyf+#jp9rQ2_poJ^liRwIIKTxB~ST*`h4c~av7z|
> z1qGLmi)Cek?77+jIdTxHhm1=3ePM^<`_#@s#zR{RV`01+ZzGQ}nYP0i<<Cx`&hmSn
> zog7`v)T5YE-n at c%*uavKiuv|uv+TuSWn#*B6kDVB#GSq)-3F^1Il$(vt%v&A-?bm8
> zKP1U&(AtO?tZP?x>h6voIt0e=z^jl2>&R2xuw)bSnQU4PL}E&J2}8+_W!<;J5S-mZ
> zi=`0W>#>I4Ssy(1g(t{|8p59f=h)^qdzaas!)k9MzD7=|D)USeEAz2NO!Y3?QvkIB
> z)RpsR>*I8=cywE6l)HsHrQ?vdfxlT_6j_N7Rqb~Im1<6p5bBU#<flKEGqm!id`zOi
> zt9v+4*6D0cYZ_7O=XXArqYKN0l{1;^`^MKoEr0&GVZ*eKHJ!1|!twZ!EeXfkM&me=
> z_$~h<?|)98%~IM;Xf%#RQ*j)cg%gfWB?p$+<^9p`u0Trlf#UY$PKaY*Z0jyVOd+JU
> z3_jyg^jzbFtL>c;#O7rm<Dc3!lwNM*_v}iVkxFtwFu7-H^ipxH1|~5@$a0$A+}iXJ
> zP!Wk;WSfX=5lL>K0 at hoP4VGt-_bs!o0o!zr0<Xzwnv at cym)yJfVVT|^<&Rc;>NFAf
> z?B)J5LYSZIXcl3?1#uCIg0-meR`G>=u3ctLF|NcbdN?5AEKVR%casIHY%gQTiSt*(
> z;8`$ucGEc^W&}P&=wAlu7dd4Ksb{KjNClSTtpzp(4(nck6ga|L2G>aMyHc_AYK4v}
> zM>?vyECRg=Q{!~c;w)V_9sxvTNcNk6Ks)~<)N5ukkv#J;^87Sn5!7HCq6(x9I7?bB
> z?e|Vb^C%8jp9QSX2DU?bkN10jl!}p!+ETj69NkoeRl3C_Q3zQHwFJ at zJpdX6H8Rix
> zxKmKk$ei|{t*E7k*yRJ!(@l(Is_ymP at RoTud*6k*SzzW<{b$RnQ8}4!)}Oo6VQr)Z
> z9xN at 4RIlR}9j at aRA5jkxFm+@{6vmVe<6!9n>7=xi3xoL$b(*^4VMa;bcL_HEUrZm*
> z;-q4+5~9`&r^%fdJfM0+3l<X*ki$92+GLT^`LNwF@$ztu8mFlN9o7a&yQfnos)9G~
> zj*dwc3vovGDsQ%EfeaNKLB%jC3>Nr9yWg>om6yS<W*t_6fbMlCK>!xqrj#D(p5|71
> zqPq))e|sj1R_T~KoHKAru|Rs{bzk>AJ_p%H1DbMi at eK$D0DhEb3?%QXg;a(|!C*4N
> zyTf6eY)=0E-a-p`1Qw;>kz%0-bdMSiIA5*q%><D6K_D{%Ae`Q#6Rpfzq`mlW=@CGi
> z#k=<;=;Zguf;mk;Klqz_GGcAr!8t<~&eMV6fZzEZtt|z|Ny)&QyuG$KS$m5h at eal-
> ziT;)#Dxw;b!&v^n-f<yLPG6@!QrN1M-r_IsU9Fuk1P3=wV<}Cc_YHo|z6tiUWuV<-
> zK)c5_{S^m;evf;zjHQ;$<S1{4_d}54SX(3-))XNfXo~WFC>^No?N-au9quXhDcZw2
> zR9+TJ<Enc-Ap?Re2bwB at rVz2v+fnE9nwr9D+n>pmp4pz>6fr5K4nfEoLNHEJrq&_p
> z0Iz+a)V`#cqxP@&mJ!W?{}{66({x(i at JYf6E()i3za=(w{6|gG$gkSn6xNaiDn16(
> zdn~AT9$JjY;b5ZRuCbu2khr4Z2z8$&8!G-X4*AddOC5SaM^~ZX_Rl(_2k2c6^hR2-
> zwP!hK-}$@x$V)FI4*AzMhYOK!xCYL+r7Qff7e|`MM?jzhDySw;2~Gt5O=`Lb+?)KS
> zjnr2C4y7R)tLSJ%qw(Z}5)h}n4s8FMPXTL9Etz=kMMKKgAs2B1vDm_brqEl})ffVI
> z<(_;W=iR!m80j2S+6s90i;4FAwr8=KGeDFAfd(=m)lKGT5-z}h@&4%DN|wHl`68~V
> z1eX3Hr2ZLF<-DFQ5`R)bze0NsWQxQHKtHTHn#37yD!e~(l&_kJ!V0W$m4N=8uluHA
> zBh%_rxOD^%VE6|tv|>*XDTP7tQ>?<7fY9SV&p-82qJ1N<tdwkBcb~B>hsYn|9$0;l
> z%scdDub|uBH!9Raf~0a14pX~t8(fdVLKp!lqNU5h_I|0wSGp)6+NpS5?s+MgED`6w
> zf#)1~o~zprit{xnNjQWlzk1Yt3y9c<GH7|j=Cs at IRKA8NkD|tmCD#~X2uGb!fv;9W
> z{LtY^sos7}t3!_JRxKdW0ts8BYwZjq_j9Yazf0=EYH6s=JEoPc)lxE%`9MgR_ZM;{
> z+Z)RY$z28N)sd;FLaVp8Y6FvzaoWS+cCRPU7&f3WO+cXy6hF+8i+TyAeaEb-3KT>f
> z#0)}4ho0<&wGZh?aNo6kA41Ra?l|D5Oi=gRwkSj}g^F|J0YhLs?gQ1uNKYK;qY8B5
> z^?!`9zbBQ8m2MSz;j8CpO at SvofRxF@T7V%N{j+f~GX`rRz$^q2n92Of(-r=n3MZxL
> zo?$_MSi+)sBcu?=$hVH-{tb7{{hyFw6y1}`9z}<}vvD>D);lYsd#o(ZNda-%+1`I7
> z%JR(ej at 3EQuimfW+Tol`zP>Ay+1;?wW9XA~*l#2~r=ivL1>~;5)xa(1CUBWit`g47
> z_TK&zdAVwk+~<N_wThLH<7&Z`Zb9o%*gq6HCso~Uzu7TcW@{OFH?WpMYpE$`h7sw(
> zJcDIqHQi%+%)nMXFmZ}>?U>dK={j+&)xG5C++zZi`E8Tonn(JTBHU*iq-#tnCWowx
> zYR$+%<(V{#bZ8t3>)+QUBP=JZygiSooOG?ax0cearSe+|mAipS5m4Ig8PJeLWG?e?
> zanEv?wU%oLJP0Ujk)m5Wpbh&0Y8FUe%Yj8I>Amv~pZRi1v>9sWdkSo8L4*jI$pMRC
> z<f~pDRq&ld&lv<wfM1JB$-~^3^~8!+Fpoo!ncAY8g`*nAf}xB6BN^G!>-`b>h7M3w
> z%3pf<zEO}9iw7jgk>Q#mrHTjI>5id(iZkQ3JxH3w(&jFK;b>`^C&>F1KhK$xHOgBG
> z%+h!#N;mF=N+ZMr91Z^p@~}PmBd at d;PhhF|%e>P$G(T~<ED?&O5*L%*Tll>neiiV0
> zA4|=g?8=2HKo{$F0%P3 at 9nS&+75|enK4wu)L_~Fs;bVolo;;g*e3wA3&+__%(W_1f
> zB>O%~`f|J7OmmR*WJ{2AR#3}dwXTzEF0}-i{`5`>CrlF*7P7NSo<<<Q@}6BHxg&dN
> z?ih0CRJxVk45(Lh=a4eQ)1yuCujTU2gBes2?>?AFRr2izCsOBl{VTChGwGGgF!J4E
> zLEZn=Vt(x_v5|&|zhLs2tMlZ^R$^8@*vRjHCDSg0rr-U*F?b~vdAB~o;Yjxk at 2g)e
> zj&9CqQ<-)}IN%?9l%}O{w=@EC2GCz^b4HCGej{3f?zUhJIf!Se at bf;0k0M`MF|Atm
> z171PCNo>_=lFD_sk~3TEX3Z at r(>RiQS#CNUXnK0N^Er!I(<5c}fi42cuYj66<crc$
> zX5h_rW0>uE`N86|SYUhKTkd8mmm#u`B0$KHPgvIfiJ__Ik}G?V9Mi-HzDd2T*`g1A
> zNt~T3e>=IqV!t?(l#B`70aF&#<OaViE|gy4+g}}R4}6M20LV)O2A~&;v)#Eyt?l`%
> z!i%|`3M_c&mmS8<+yO88?Kd&FDz^8?gsVa)c at oU!87dtwRG?KBy}h^AeASGp+VEYo
> z%tPqZx~l~9i+_NzFTvPPhzrTXSyRs)L=J=9tHD>9Tt}pkFMo5UrgdxU^R2sE_lPO2
> znDE2A?6_Lg*Q#0_0q(Tc2Y#XEIY7G}2;U5;V2ni{GOh2E(Q+M>t>R3nf|T!UhM_lG
> zazjeQg`Tm{GSia-_#N*e3m^Gf>XHEB=Z@*1sbU9Jh!R%S3Ri{N(Po8FV at 9gfV^KS(
> z*4_Q6#hK(YL_J?%E2k$PQx=Q*?#$$aM9J#|!mU}unN1Uy?X#FeV)_3^*_#J8Rb`Lk
> z_rAQONt>2*0a{vU(sX4h1qv1jA#Fq3Xekkk)(&b>+)+VLnUNtk^cAb3GKA at 4l+hp<
> za8#^X5EL~<lpu)P#K9S(wPGzVd^82bS_}Q2^Ilr2GrvE6e<bhj_uTC)cR6RvbCX at N
> zw)2wPrQilrHSv!a+>lT-IqPnepAE}eeJ&~KhJlTdwOjv5%3+#d?4|h(k~@JZLBm%-
> z?1QMT`O at TpkTr^uZWxz6a{fO{IaLm_zC`w{m2z<6_T`|yZb`mfKd at U+_vNBGPg&Q4
> zT-2^<0-gb8^rK#hjP|*T7W~jPp2vMIn&U~>Im*@0%Ox{IUu_gydv~sXe=@m=+1{Th
> z at Th|u{>`$&)Tp*x)a8dhaPg>Y8{#Jn>BW^b;-aQ|X=BJFt6b-WiKx>xz76$XI0jz-
> zM&SEO5a51q=xMKtc((6MGXIa8HWByW{Zj1ma=quoPV?j at mbv%qaHE5pV+oGJOF)8Y
> z?_8-V+!)l>r>cM at k(z{Yd*_CCvrI at +>>0mnT<Qi*Xfg;q6PzoVv8B3Qr(C#?ebUpg
> zYn0ZzIaF at Z3xD^l-IeKTu*P{$!f at Yaw<XSz@@1tWJp1O<Xvy(==vb-b^3EFa`2p71
> zAv5a;s+&yq1`-gylgmoGsn%{xyjGdhL;m{Ee0lTC31L`&hVXZRJb&Di at q8v-<*__J
> zW$r(PC3r~$(oEg!VvWoTJ+N1(7P5n>vOdoWd1oF%=e;wO?(4y@@@<|MpEqCm(>~JN
> zfuql~DITVd)^CCO_YZ>y{cnWk_h|=&eFRpRWlM#(+Fq1+0OLc~y at NXPu4z6TGKPuA
> z_>Zx!>y<l9ihf(h95i*0K!hbx7&4=<&Wn}~p-K6}YD0fPXg>D1VBBq!zoy-#Fq3U_
> zKS)}&k8EpK=Iz_Wx4iu_-wNOgr$7D2uB`4Uefeb`A=`7{A0ueJ=h#0?$=%&4Ufl)?
> z67T(;^b~O4skd%=!Q?uLYS4kld&faXl_O=F_Y6ec=oolyovhI<LwIJF&OtA~6<zf@
> zRhB?@gD4qQ5Pu+4hNvDu)dQ%nMUl~<zfH!$FQU3d at E0ZR1yrOGDCC#5hrts3Bnh97
> z%IC5KejHZfX?sDw<Mo1>nl`=o(X?xhXuLCQAfv$AxAEop`g+MpGL_hvg_M!fk{h;?
> zP}!Bo3H^hgM<u6sNFR8(m-4k6`b$Q`0{qZ3^`$9yYD*dz8Pr~XV=C&-VYh_Js&AIJ
> z)CVqh^ta=VH}vY7E>+E0^0wrVmU(roU8u08-B=5A)fmW>9HAQTRGif!+ed`#ml<}$
> zaUN1s2UYNIhq4!Yj=wZ|B<7w1A<F~@&hx-*%<JiUY3$h5P<N#u-%lX-v%_*Z>y+-i
> z(d#MRo#&GEUm at dt@g7KX6+!|f1-w&)DjAMZSQfM4Y8M&HMOJ6jpN87 at Pem_`gY11J
> zSRBoJ8uFIQdDDNF7ucmyi<P{C?QlgK5|N9cRhhxWXfgdmAZRZYV^w9{hHvJD?AqmI
> z1oKCm(uNn(x};O_Lx8Pjd4dfaE?*Sz;{NA_fwG$nalftJI{H%e3ViVhM&*~D<u7NB
> z{7_a7<Yyhg)f+nf-SJzj(leeNFBj00p5rf at X}9Oh%ZuQ at s`Xm<f423x<m*F|BaK`4
> zqe_sLjc4gOPWswY|H at c;#<TjBGVYbFo&&GkmpKe!wUB^8*3({SO<S6QdV9k<kMq^}
> zvJRuU*4VLtR%AW1R|p+|$nyGXLCRhqD&O{+biGqWjLu|Y^Tj~g89nPFg7heaRYlyP
> zta_b|H>{)&IXwh55OI4mr5$_`o!XYktzuk_iZe$j)R-;I3z-9PUEkN7<^Be8LyeQT
> zKDH!0QSAyFaTw%86Xiss<wST=S5u!_q-~q)prc=E15rE}(>52E@@O9t82COrEN`(;
> z0eMHXxs;7}t8S^qZqSTT)W+b`_+e=qgfd90D6 at B!MrdnA>ti8vL~|0B2zN!>TzM9h
> zMiN41#T{t`-v~tWk*4tb5mk at 6?S_zfSb<9gI}}(h7x??~%)`r*M_ at ebXsv|uvM^@6
> z9Ay}+3h$Ce5{G;?@FflUJoYx at jZJ?FO&(VBGNBS`p8H=lYirKZFaEnFtkiA9mPFh2
> zkWzJ|xow~|9*J0U3{>-eTc+!)pqlCMwnxklFow?$t8tY)NVfl~Q3Ex4{<}u0Q|Y^?
> z at 1x<3m0Xt^+d`xL49yk&o~3)ny3P%&b&YU&$XvtGtA|3G<(BKaPC>m_z>IR at jA{X?
> zW`k;2zKz3Dl?+ey=;>jpwqWT2-EZ48YgmFEh#>G`WsQf_D9J7j@~I-Z(FM#Q4>69^
> zti2Pc(R0gQ6Z|*t&2t$QRI{{IMl>A}`qAv)mBImb-YXAE0?T6nbUmTa5O<|J&(;Kt
> zi?+40_C7L@@(jKL>T3y%klzoEYpujf=6$dDNA#sA^6An8LCui+7^17NaVc(M8@>t~
> z0faAwd8kxQZq`Y8-cIl83ZIASAAlt{-)R{5xTWgIFkBI#h%0!5dwK-TG at KVy!88!o
> z^*uC|Fj*0Iz1G+tKJVG`y2(}X+eIcfHRJb9JvB}4FleT-CV;;zFyQ`LUMMR?MUn(Q
> zd_HK3c9}B6H4#pF)Iq<l503oZOdO24GpLPFK=MmZ3l2<zBk|iQTEmgPNId-iZ2i;N
> zWzNQ at S2x)ZZTU(dY`NUvDJ-TZK9m)>tu50(lP_nwLo)y)=YymcU*XhdNv9(ePnwqY
> zo{isW4CUY!7{+oVFfF8T{U*tC!;<iWNq&=}O~4d_%D^*Kun<xjdo&%!Qw3ezsa#&g
> zbp9bm6MKqJW^useq=jGYG at cp-lLB|l)u`ouw^s3a3~#2+0v5NpdX?+3nrBIjJa9I&
> zreXb4l3-_Kp0C6|Lm5ugm#(;AX2+v(56{N^Y4kJCKlWeaTA*N1ZH<gUo7t{VF7!#d
> zozPm8QvK;(RoLz{kks89$Yf^N{g~ZAYm*EFuYOhaaNz}^g-jzA!*42xHyT;Zm!e?k
> zX#WBb7;hs+qCMk2qCr)u`x}L<{p(;f8i>I?K0?1Wde|GulTV}Z2W!F2Ji7(oE4C(t
> za-vfyq1E2n1VkFf5!%!OZJI7!?>YE}IaxtJnxW1b6Mogx`^KC}gKfX;_if*s8BvE!
> zk#%jEJ?a)eD?i%^{cz)(S55zmZ6ir`-bC!ceBCgtFJTe%f7D+J0$svzTB9qq7F_?a
> zM|yLn1ASLvzg;kg^0{KBUfknOJf&AOZbnmII~Y%jnYQcZQweOnazGl5zd_d9z3e~^
> z at VT1~m@^lnEgl=M)t#lC4c)p8OIp4N_A}m+(S04O3N7^f^FYNy at oxXmJNH{}GAH?F
> zSykr5`rBw68qN_qLS;X at nWnXrRR-gak5G*13>wmjxLZqspjM!9ose0!V`tmeDCpfL
> z)c5n&l#x&21%+*meLOxzbeqU_5(6=>zICM;V@%$1*5NcTBQdgA<qn8SYq2~rAo#7i
> zo9&+5w<ps9&(&`)*UIx|RJhV}{Oy8CPbvB=yeb%TBOZUWJl?YL1C1r)iF>WH<{S%-
> zwM^V-aaRb$I>vU+ll{)++>3KP%isCyoU5xFNIX%KxLQKge)+OMZ)#8l=u(H%3u4uH
> z!YbXZ7=&^!la1hwfdPz{f}S#e&b4;~x85E+gE}zeM`*yPvyMx0E6S%Y+%+V<0<AEY
> z`T0=Y27IUQA2dWH*uqt3+yZR{-b&E(9;Sjm@%v}r0O{~yU_Sv_SnVJ$tdOOGvTcnO
> zM&mr7KzR{&_)~9bN+P+XasB=z3<dYC#7k8BlhL;?1^l;F7$BUm+X)~j+;ax_^BhFC
> z#8cm1aOXt-X>t>>)i==enj6VW^$lEZ$R>3D-3^%i1xRJ7QIR_<(3;;BPNLNSF~|ZG
> zR~M?=I;H=hgH9-R47|F)LH_=ptY`i)Sfq=XhUH3&ddmg>L+&9{d?fsx=ZE$&`MW#N
> z79V7ImKo6+NBD|9U0=3?415;Q_GVt{I#1ETEbi}aPwl}8bhn2cG%wPJ${Yi)eB~H;
> z?rF%r5Ee}eCX`jeFA63=SQXwykqwl^42$U%{MhqkhtL_+2%Ul-#_SvBw-ZtX{oH%-
> zssc*xaS-oke%Yd)o#<J}1hp7Y`+}kbbKARstO%sO|J at 0$rQzPetCM<?LGsB~@*+7&
> zSe6h+%*-yW6tbc3fC4f*z#@SAP7F7gNj`AC69pozgl`c{)O=_zx{GBuC%a2zw at P+f
> zWOst>w#n`oX=O2Z?6OBMM^vG^FJ5+6_a&fDTG>|;#Ea2YKnCm%x~|$&duVdz6B{y0
> zD8~U=j0+|Wf+rAkIcSN-^X#EK^Jh#4m{y0Fw%;$|$|{3(<t0Xr5QB50s{=aW^r7+G
> zeb0DO-&^2%3VH~i(AmP3Zkuxzv-$prFD(?N0abC{T;%&>s0`-25jc7qkT(sE#f8k^
> zXa|>7<xf&VX`DcOe}ob92lT!_I%vX at pgN!ts1k;ooRDrp3-4F6SiI2l>$kY#3b|Ws
> z6JhCIuyVGEp{M=D{Wcz^J`AjrznK{1_u0w=SpWMM!j;Z>AbRjD)wdHBl#+R5yuFBA
> zgBrkiH8G^{(CYV`DJ);QLwb)<X^r%rv}Tq$g-DNis^2egy^6a-p~a+u{0sGG;vL-j
> z)qF$%Fy>qyKy at Ad#pl?)-8s@%^;$Lmetb}kF8-(BuaM#jKq_jBzWZJO=|c0Qln=Dl
> zxa}z=B%9dOgbRXi+iLU)HuT#lf#w0q)nd*7kNL*<KL$^AKow3897V07XkF)tTI+=E
> zDV~JGX7wWLgl((AWz6cQk^_}D0d;c<nzp%TXvo~}w&*v;dMRX at xG~nV`taDyg>pz~
> zbNln|K{XVir$O)>)z1(%Put<~Rohd9hpg$_Rtx1NrA%95WZDh1UVHDa^3KGUxI<yR
> zbGsJzzfc*4K=;ZU(9oFE6$YKD&d{_KcRO$E_T&b#EjUJ@>tQ*SiKe}ohpOJIEW9Zz
> za@=lTPDziu?A{D2TaAl2RctKMOQv&||I~P9onxT&G0*zIT-U;qn=`aboAfl%!yMI0
> zQ>~C67pb)|D<bm)gU=B&H(P$}pLLJ-Kw*+?VoefRT9|CEg>M71SrY&9g7v{?wTmNe
> za!MU;u;~8sLNHynYg)2pX6t(k4QwEkjj5VxOQ|L8FE3y}0bS9%4yxf3{{gqlUZ^rJ
> z3e2=D`O6Ce!2(KDTVSYc6I&Ae$@1_gI0nv6_s4 at YZ)P{L_0~T;s}<-kfglgDgg+~%
> z<^39K+_PHwLSd*d769c*ygVrOEi<270ioZZPcZJXqwZsKWi7NwIGu_J=|T}iR{<iv
> z7W>Rx3%^B{jE%7d!t`?Cqx^A&$yq&3lWk<jWmerSt6Hi;Wx;XsPHpT5W*5fL9S_(>
> z3)evGnwArxvO-l>&jxDSm^}(cp$BH7syP9GjJM9bowuglZiI9jN(@hOC8kGE=?uT2
> zv_3!PM;WxCx`Qf&2I+C3*<5?j;x;kA&{4gLO{?9`M$~M_V<=4Tg2FcAHcT+4R>f2S
> z9{gKFW$^FSCKHP1r2_-i%WXQPc&jdW8>CIB-!&qBc*v#3Z}=v7JQ@=PVD1ODeCB_X
> zxJ_*;*6B}pKVI&b%Me+#Ei!wbgvt)!RXQ|)A{h7j_mMW+u2Q`IYFJL<apoM<gu5<Q
> zTEP`mw>*H~UF&3JzNQOBO4Y0qN;xO%B}a2p>}Yj at FVUFEc%;`peOTxD_tEq?{orGz
> zTlJfc<+<Jk_C{+pZ#TeK2j4_wcZh+-fjh~XyggaS^Tz_dh(V=_oJQIfQ~}1i2bu?q
> zy(Ez+i|~SD;KH`x1k1$kgDFO0Kpe44SE$-<fN{{mHxa(*2S%F3!Z#Vdaecr!d3?tT
> zMql0UA6z9{5Bzv8d{e}YtHRTDY<w}!RVe(Kphljp=WtP-)<Z&N^3lSDHr{%<jsI8&
> zF2l!K_|NdzKXj=a;rBi7f4C^8uhZ78t56YAVHy}{)=1z#^`Td{R}=gIPyhP(Gj0IG
> zcD$5c?^$<zL1J^KF`7P6PT%b5JU)S5?Me7()GV3P8 at uh@9?Gf!Gh~MrI=8b_!C+7m
> z9+qJ;eAP^o<Y9V6Lcp*MI5x?i>pz;v*@`?HK6=EZyIk4l(N*BPt|zL435p?1omDv>
> z)XlQ2g-}(^O0vGC$U(|C^rl&FoO4(pt>w(-pfPs<bMwcD3a`Z90+cYwg)NcB9u+Kb
> zb@=06mF4ays)5koR%@W7UEM;Y)e(1)>v2b at U=kdHt06e~e?%GWCPIRy`qeZ+d<6iC
> z5umCOpCTX1D#7((aBlr-&Wc-=m0WP<|0p5bZYBg3q4m5HEP!$nkLM~^><0yaJGw!b
> z`mhWofKYBQwSKiqYg5^DEh`*!?M*=gP_Pl`mo~EwXg6Iu|FA~Zjadrr?@$HR^Pd3g
> zlLEta^(Qza>prn%36F;+2MtUo+q7C$_cJqqUpvgd*>m!fro>Li!1EWNQz|Z*V*Yf@
> zc;8bB|M%DHP%Ydg{_p3<{kgKT>`NTr+n;8S`s=L!#nX9uKfOGo_r5-T=mxjZ-?6Q{
> zuiDA6RCb48{>kka_-U)>`p-(n^<J at KO0z$B5Rdu`lV1N4B;C>dM#20zwchc1ho|kc
> zf_WI0ekrW1fnT{Z;-JarI%B$#q<eSvfbVQ)%&ESeugc+?t791L_YNvRhp>nz>z`{!
> zy?*=SrY at 5qLI9WSE-f@qw?LJ*d-nd*l=*b%X}~W=#M^?gua@~k<(9=y+>2)(*30J{
> z^H_t^JOx3$Za at xkfS_Xy&Y=#^nqWHoZwcn$Lye%BzVGP_W+#<aOV?~ImMlQX7aoi$
> zTv%%Nq<&t<?M(38`}tH`(w<$@@XBb?7rTn_aW`_hFZ*9^FXUdo`Q<Z@(=KW_OX37>
> z_cZ9!lHJ7+zVzkuk5g&F?&*ce(=DEppU>dFUgXL6SK8=>c#7gx!II4bo{B+V+x%9L
> zxvKy5=t#Xlwv>4t8}u9Uo7?MkDZj!X184XzGu3+xC#EMWqKn_#$Wh=M6G?H{=BYc8
> zk!o&eGFl%rFJ=XTDpcLVq*-_g_hO}I!-*Nz*qROP^&2VQWD1 at DW@n3E539M(ud~LP
> zmxeiO!7>3jw%0<}p-6;bz+`0A8Je?^$yl~*(-)&SbDbykiwxJCzxjEmIu at 1ma&w;a
> z$5hw)H8R4k3u<L5Q5Suo)rA$v=3~;9c|j&HlGRwSa!O-filGqpr_lW4BNTvu?|Ew&
> zKwbcd0YJ)G%~w&&I1bbQ(o`eA-=C`N>Vc4G^iJ!u{pM`47{tE at +Z3j0S>2X-29;|}
> z_w;{JKKevZkBiGe=g$nr4DQD*JK(wc-&tc)myi)`TmbKuXNKL419<w2NmCblHvK!F
> zo3qVx;NRnl<~$foWVy}}Eb~kg6dNHo;IStZI{u8Btzpd&_BqV<LuhXZuMT)(|AX&>
> zivN=}PLt)GCWY!#sa8S`SdEu8{CLIZ56~eN&#M2J3job5I|dZ$8|aV-yH!!Ijhsf4
> z5jF1Hc$N(K#V`3i{{Q4$hADrw7Tm>0Q|5c8;XOaOj(E9_SZO;@!++t1RAJJb%VbTv
> zGd&q!=4<E7l07A!>Mtv5=FIMNpHlBAl9hc;2F{$2Vt<N+_l(>82EkZCV0Mt$A0qC(
> zc>i`DTOzpGHV2m*494QifeItUn__=pOB`IzK2OJ&`SL|je-REE&~K_P^Q4AmRd3|b
> zq+iHBsDNNoPH+TLn&8l@&AY1Y$;C^VgWcB0fD`y!fC1S58osCO;(^PI?TbDxyK9-}
> z>Cm*X0?TKPv#N7^s4SxDf7kkgS&;TsL;#wfA8Yme5PFlo<@v`~<MQ*%Bb=-^k&Yj|
> zPydtJ&_GYUpH#m^uidX_8N7kL?;xsg!*6*aU*+p3{1uh>^_N<oG7FyUuWJnj6{yP@
> zFW>g@)(LxRJ<VT_;|eBwc72^2`$m^w_H)7{$a~`J`849m?J(u-K<gAf(#4+|de(l|
> z0ha4)#c)^!#nyBH)a|*uBRAJ9)Objuk}UidyQORzTM2!z1hRa|D#;X<7rYt at f1@LF
> z(T_duKBFO%Y5i%wQW(=1 at 4O?t{B$n~hH~W*Z3W?)BW{>Y_l5((81Pj^+|tI2`bZ<{
> z at 7t_J4R@`jOb6p-t~1fQL2x|nDf}jX#$CNo<&98XvAi|?mh_OIGN?!)ss}|=grV#E
> z56LHKhr0Ogk+4#WtrMVgHhg2{;B)MoCGnsA6ca&%34kzTyFIfy)6-Y%JcMdeP`Z2h
> z5J?~qv;S{?RpF*NH+YtJ=8Z^!DsKqJC~v9nPVx9UuZYQKJF$9CZ)d(UN880SfA`do
> zo!<zINrzCtG|*MR<6jsbe#<)BER;<nE4>*T=&lUhRy<-fB(gmDeZ!meT9rmIFCH{h
> zkm(>N at 9*&}|JKUYc6eI9O<TZF=SIxKgE}|vhCzvWBs9P9CNn!ehTqKac64lE)|?f+
> zvDN~JEsFU|Fur~Zjfb$cQvJnR7SlKojrnWnI#23JBX1S}aLdW`%ih8vgy9)esLEah
> zFy;8Qd?Ja(Md&j)NWwJ0lq`_yRFTbSW&Q5WP)HpV^7zRq=4AlLo1yu#7zzE2gbpUY
> zvD<-k-+HH9N9W19tU1?%s2{U?WiS>-`???^=j%F+HgaIh?rD8?YaC3{#ovv=!CC!X
> z_PEA>T4&x}XSZozkn&OIK45!uoniegtOCP5Z+vH>g6GTczN4+4gIzP>zrU-2gCef~
> zevC5*J3ZDy$L$U1EKA0{)?^Yc4{F$#O~xR{zGM!l`8K~UobHdQSw}RGVo%|{bC$AL
> zA^VKmLHC|HL;bOvN*7-wBU?5?%uSxa_n9MG?FN-qRvU3}@mbY{Qz|Uk)Bk;jCHEoB
> z3K`!5VZC(R>p`wh5KIuZ0FaK?L35Y%AM8I!NWT$h$0-%eOfUN;WVg-+cx$^SP`ih9
> zkETmJTe_{|vc=%2zU;DT{K_4F at 4DiYo->d!k7Vt-7I+A=wB2*AJC9!D$vBleW>0M&
> zUuI at 2vz8FvIfZCzZY3j}r15*H-m~~r+RbGrc-*}Vs^C8xkmL<PtaqEdD{DkECNJN`
> z+M6kHk`w<*1Ci&%;RJjDC#b?7R~R_DAxluRitxt*FoZ#sz_UE`DKC|#K90PRCFAA0
> zJpVpb!aaP#lOh$UUXeC=Y|`{e9Qh;j at 0jIJ7K}o<a4W9jY0pB at ON27ny%nF}u+klU
> z;BN6eE8UiRclV%#bayw3I-#tO;^Dg-{g+}qMPb|3zf1a5C<~;@1aLk5+r$_GagB1^
> zGyfI$Oem{|vlEs5qF%mW_<s0S^TKnyu<fjRXV2p&#b3gz>mw?9ieI>@k%+$>PL8PL
> zbk5VG=|azKr>~&Ar|q<95#D#8c*LJw8yw?Y!L+i46dQ{Pm4|N%?*iuAW-VCKS~x8m
> zR$nOl(uu)~Qw7!TX=rp=zPWRoHSWc>P`Px#k`SKc8UKH?%3eIcD)8}PsC<hR$0bxQ
> zD=+In!pho#uo^8B!;^qv=&{MS?>1kF_wUwQ!oZ0<{5MNRxX|PKzh#ye+oZy%2^!nn
> zqc65?YZOefPQr+*WAV?xZzh&$YtE9}!=LUbT^w<jfcqvdRc_gNYJNyd!{Unf(`G8$
> zZ&JfVS{Y0PXb*VU582#{Z64nbi&GC6qDm-`gST1ZUNW*91*7z|XUvaNYhMC~_Yv<=
> z2+jwW-a6r>BJccJls787t8<UOWaJGb{Rr^+RfLjlk2*J!e96SGVqD;7X+_|tsI{P~
> z&}4stZ at D$@Iitt>V+JQwdEWjpht7WO<d3r{o$WF9T<1E8l{;<jiQa8(OLw`w+xIr?
> zYV>w`pYtx=b#Rw`R}-p=1NQ8jOYE8Tj at c(AM~aGEp`4E?*Ra4}9re$S`sYXemZ-lb
> z>Yt;qaS*b=B?nkTX7D(nulC~zvxY)irt^br`Vww-PP8O`zO8*cPg%NO?``ys3}gYS
> zjXRRXQxY2(=e at c;LmuRJLq_K`lE3qB&yBM=ExP9QmSy29F|XaICEhO{@j+9o9OU6g
> zqzQ_ec at RuI51vWpfPve1rYz&7s+KRD38cE&99mf2WYc0+fpk*q*_UjdAI_K)haIc+
> z`*8!!lXW)xj+bom30sM;$2#pL+cRlh>rScaOZZ6#3w+Z8DvR#(Z5I0Zwk-!2_cYV)
> zZtLuqY#X#r1FLRUg%*16#kgjQseDuLIefjAPf%`PZ5jb{`$`Da@@izp0f^SKnUgAk
> zU$gp4comBcOqayKH0#4<%S-rd5-2R({!(fEE;<2_&UiGhwc>40|JkVtD|Rq{AWl}+
> zNmn#_Ea!?-0p at bWXqV7o_mZW*7Qz~{1Ga2FmlbO&PcpJti^){xX**|e?Wqcthbn-Y
> z<kcCTXmb*-A1TW6V!MqJDPNAsuQNRMzO;5IoR5Y>4p?9>4TZ<blxejR)2JT`A1Q~|
> zDd7*@KNOw@<+!31JaGc5)(%BwT&iN7K5QNe&m30u4pd<?6q6N=$%V2SoIqTLVsbC#
> zdE_+YSv?dpQOY-py*}WXe}21uxqKPS?jSh}9YkF&pQ8Cgi#-YF$7weY_=>{0(qT{W
> z`77d#hUMJmeRv$}@;q{W?1K5B3bg$~P;bxyKw2=oXs{w=OySw9p$arlVOe{`=9>Y0
> zSDbZ1PHM>tF4lLy at 3In;25+A)==TG-CZvFJh3C(gaO=-`ihfRat+l4z^ReB?*9|Hd
> zy60nQE%@t0^ZAuTFRRZX84sc%<aODoSjt)e>5KU5KnUAblSCHOn8|$P(#KxazwLvO
> z5K<uxmU++b%3KjrQU?0B)tAtz_4!;8-b9~-3V<}f^l$4;g2<v_86JfK#trj7794eS
> z)CVKmQ<$c40MhOl7WdTeD*JnAz9+Xgk8bzW^gc#cdA{sT(=F?FN2r4sws<b~rn^=F
> zV<A6zVoWOU;=0rMsU)txh^D?9Q(wZxV#=iFlpLn*{qDgXo_lKT22F)*8w$j(emCN`
> z;Rnic{Oz*-?WpnvUy*f8DYFsg|9hEWgPBt%7`Oi5+49RwSLNgF!MNjELRA at lH3Qkh
> zx3*U&Rc>fEG^ob*`ys^PTk9YZr&MX!sLDXQW^<3`08fJ_0Ie!qSkU5ryOFyR=c?Sn
> z0~gLHhC}zQ+vncLuy=F4FqpBv%OdWNs=yWZQ3)_)4F;8q%nVid?mt60LXsVH()B_q
> zyU};QVI?__cXrcKWs3m7+z&j7BbU4x|Fb^A`F!qCn2-TXjVZ at o<+~sKvim~}6G|QA
> z$A!Kk!Gt#k>z6AJN1 at sqL1d71W$$RI at _f`c*7aPG<T*nP8wr8fB^Zk^MIq9$TYdMl
> zN-Q_^J!FYw6Ty`-G^H{$Yh-9jegh2|2F;%^j8!_w4+FAMoPqNz1vBP3e-A)6(cv2C
> zN%YN-4hlqi-1k7Zrd8D=I4D2GuNxF2 at 7WT)S^ciu`vge3ky}X&ttvc)sb8KAO{3Qk
> z6+TsQ+iEykD}Cq#GJfs>d}YL~a;k|%`q6Gw!T5l?PIh0vHxrhanrK{pZFnj%khXSS
> zR&d at 1Nmk2A?ufV{LlY@#(@H-g@`A8sq50^;DXzLpafi*|zFToCI=58!4EhL64b}3{
> zeCc&WE`mwu*j at Tg(>uaDjqj{`$BiI6TqNhAHV`aRmXpLbv?CEhCB at R~r#R>=`j=0`
> z>jl5zW-<e$;gizq(5kTz(qU*IU%$i1NTOktxTEyL!XY>1KDp#hx5;iD?ysg<`6d#J
> zeqa+9fcUO;(1~Lb*llu>Doj2)=sDj%#q}sYW!(NnTc+F({?Pmgm0j)7t{AzM*sg<$
> z&(Oe~Zv#n9bqM=N36uNhJ#+)u-^0wiA^LRr4^S=0m=lh$TQ31QT40yM+(IE1jnof#
> zd>72FSuzaG2t$|*L2xQG|5Z8!fu#5lf>$Z{Pb(0-s-*otX)U at D0_ZqG_u{`U4kv}_
> zu~$jGmQ!PgKKl`YX at C<DAc~P5SEir~`tg`Qe)t>=@*wS{MA^P~`zhMA#MeB7V-}&^
> zD#7$Vhx#KnhH>&Qn%nQjbPC=VOqWugQc}Gmr<yEdkv5!2n(v}`bkbnJ_lhFAd)k!Q
> zq>&(j?l&Q)0o9(rIB)tY*{qZa+l4Dre_mPv+*h$2G9^?Y+j5$Sf;WO7tD-0BBcA00
> z<DGkUNN!?a6Wdh|LV6HmnV%1!{Vbv_ldWHMcvUi{_M<j`mP1smMEVR|CC5=0PL|w5
> zSiM)SY=TD`m{55S(-4FE1OQ?Pe+}HCfs|mrTL{r$P8mcOu#3Pj0>68I-Omqmp~=8R
> zKZ(1Gd;^Kaht|@of4!cX62mP#uzVC)J`En%K3DYDjdTW&nCq_}(6O!$nO0E)2prg;
> z`iQ&i2JW)(Vju#|s60Y4`G?1pSPPbK9Ew|KeQ?i?vQ=cIvytT!p78#>nrF#K+&ax(
> zB$NUM)b(!1e^^8wKA9!hh}-5|$%=N(3?})C8UPI*^Cv*-Y=JmAyA~O~>_srGb-w$1
> z*DDuxWDq}$0;w4O1yEFNGLWcGVmt_HwFAejFYMW28<|0X$;|iZ{VCE4 at qJ3o^sp#V
> znwhEOS2RLkei!7wl|9T3gmSHS?%5&cb2KwXkk+wWX^#ll(Ck`Qwv?@G%S-{m5!mz*
> zzO_JRG8|;!G|NCY?w&e5q$s74=moSDpZ{>x?&6dkvbh?PxfJg^xCv`_XSvH!XMx-T
> zS&xwVu$#&-gk>18GcC}WS3qal$x6Zzn=^^n#0W?8OhvLC9%V5!$VKQcHG<C#FBVHw
> zbR73Yjaa9m(<dvfR17Uc0(FVpOQ;7VUmnU!F*9)}#RDp8%2{VkhpD`W5H``D!6Y<O
> z>!1ry`bWWNCc*dt!b`0aIi60+S&Yk}CYjuiLb3JH=ZebQWM%k4l1*rjdqb%KzM&h$
> zTAt3}piejObXNYHr|R>m8WxZaP2lY+W~I_PG#}77Ah^AwcTEp+Y at M`DY7>9p=^WSZ
> z=i-CdfOAxti}i#{7#6oiHc%Fg<&()|8K^4&C>vYJ-%HvTpWQ{e2lX9c4i_{!0A212
> z6@;(xT~?pUjYOT1qno*DWQ^UQC*nWUH0K%xh)da?RpuIMsR0f)u6_%bf^*Iq7d0ZM
> zm+#=eE3+K&3P%i#0hPsR;GcYa$nGzewu`wMTERV6B;Ku|v#Cw|hlZwS{%%OskAxSu
> zJ%c=2FChFY?-oyL=;Z6<_QvGM)*qwnnQZ-Xs4rr2WkV^7ov6I<k22cn2>b at k^j>~x
> z3d(l6F<%kPpye at iWFC5^SPNEU%j%%=`EoWHL^}PY851)VIxix=7(=Hd%b><6H#K+2
> zHlv>sBQbO=eP2w_($P6tAlINx3l*B9B)G&;$KVK55G`RGnxi}`R%_`#><*2N&MI2}
> z2iD=AB)#U$WHZia&+5*_{uH<O>mE0npS<{4_(#D{yf8y!q}L+N_%ANk(X1H{wIW?y
> zgVw4J%Xd2t_s?@1eR_eh_A^cA9y-^2?qR?FQa@>VXyRfqprbi)N<a(*tPy*4^kZ(p
> zTJeKenn_QIQY at W02Vb6!kl&!9Mz`3ZH>kYf9>xdN(X*lNzc-&6HF#&%J9F@;Mr?=!
> z40|Q&j8RY+5;8#MiIOQW7O4t7d4$Ia)7?irWJdiK)fi4iW(7tekJ(ohNP;wkJ0D26
> zG at XK403$~63+COW!>3?C1?8$06Bc`diaCs5W>3XS2*9x^)gvuQ3}16(-nO4=R+1|O
> zQ(Gof|E3Jg*><hWoW_cUdVsqrXqFXZ{T$3hx#-?ic4O?@gQCj4tB_BLeMgbCge**%
> z*gIU-g7ihP2Se9k1=1gbI<$!h;>3hKRUkYYcb8&#?@xjezk60jTa>lCw0|3jd+n at 4
> z{6J4fy5va~*8t<whLfy+n_quRG9^bw0+WmlKTxJ>UfE|4>W=F#bwytl%MF#I^fP7>
> z6jz3Necjwy_ugmFPSLOhuv1w8u|L7uzFl71<6GAekkJSXOITnrfDb4h*S(_j=D<sB
> znTRKW$y_I{j;AXpAFjV=z;tP9#a#)I{*&Dzuim_1@})H$C(B*pm;^d)nw*q>9x7dP
> zPW_W6lqba7lF4Nk^*us$gUtt$=#D0vbSC9xrV48!T#br6DzXHc%7ssfTN7Y%_J{`(
> zXbu&`&IIbsoxkI!7=KJe&2rg1BqhJJMYtY*1MQ at dbv0)P?m>bzCPv&ff|{nwxGd%b
> z+QU>-eBtH?Z&cn+Lq9D+^jS8AtlYVBXWEx4--)Bf at PEXMBWRxM72mzSS8OIV|9F|N
> zWb1t`e}OeQ at c&Jh;sA-sSUFcwJ$!L$getvxaT2h0CWW>8J>L<xZ5Xac9xPpEi&8 at s
> zoFs`p1D&pdc_Mygpc9Ms>;QlZq;=s8r<dh33Opzee4Wk5wNLS at nry)goRwn&;4Tf0
> zl0<P<A}w%<$Yse9{|Mv)sV at j;07 at wg$o7PKzYUBFrU#UaPcm;{EHb$MVLXTKYZ>98
> ziH-3=dA*GJb09XTs at YDoinXHePC?Zg#g@}|-!_#>mAKH`k at _Xp6R|Uq&UUo*`;W<Q
> z<@$f<_h0I>*vsX at Z<WP!KafZd at Ku|UuVU(e7XDFHvz)K at M!D(|@s=duQshyM`$8dw
> z09k?Dbyvt;SJgY|$UJ0sVbRvwjd9^YCivc3g$a&3jcjs{T24~{X^P^02wnFZ+Q!S<
> zK+YcOD?;mY=XjuWBi%-YF>V|XwaG9){v70*<}w|!_jso;I=WhFlED}k<)YJ~pcLDU
> z`e{R;6f2<Ur-R&srt1g#eKLNys^2{*My!am&E;i<HF(#+P28o at X1CE_<`{Uy(533;
> zV-fWS=ir&NxG$NSr$1rX&gkwx?S7D-N>Yyw-Gje(Gps!)G_;Lv59I at QgGU*_ovy#m
> zlJW8rq9FzPb83$Oqg4`VJT4n%<~?qzWaK`RNvuMC3zXw%w=JL(vXqy4NMc!R{~_ta
> z at OOj}qI#Fa!qm(_{dnt>ffzeble&Y}6-NZ%TW at 9AEcWa}=hj0AC)!vJh<F)4HSrGG
> zbV1ykLd*2h#n<PabF*Cz@?)IHkE9bu%*V#cWX><Q)jE>Sj at gWFBP74bM#4aZ539lx
> zf?T*M{0S=AO8FWVY1Z(49=Qvi8otjX at 5#_mxo<{Ti|QkMmqpgK0{%ST4+L2|T$1a5
> z7N=j!uhx~>zre2-e(3J&f409==&(MOy~~9trBIdK7f{3huYt7Sbir?ZA-fKIy`BDU
> zeTjMu=hp}}!NhKKa5{=aG<Zgq7<%E?hq?Ueg5O;Mu3sRBp at e^u^T!HH1mo*BNM~3n
> zzO93tKg&6PkaPY5zhC8>wo6v?sHROpFdd4%R|!{r8mvUTl6xCXk#__td7y>$2AYu4
> zKoS|CDaSzT4Zadww`bqOo5a9SZ0olTO=Pn?k&V(lqGmLmtb5H at gnUWs6wx}Gj&WW6
> zyxWKdkejGYAb293$F!(9-2DfbW3zkB4mz<127mOTLu_CnAtNMLldXCOi`_AmS#XO%
> zc(jECQr+WO3~<{pT_&8t)Xh5J#<eU at E@>*pIVZExjRR2H2f-2HRv5Sj>7yR^4)I^3
> zX?)WEJsJEA7NAY&aNAmDN}Hwc#Pg%6X~Yv8Oh&SiHK6D$IK|vlI*oRT^{F&-^s49<
> z(Lw1$ZaV=9e}1~3m%`%4RA5xc?-Wm@(tJ&0r at T5eX>=z2QnaPfi4!MX1=6MwP2|Xz
> zGXBOH*}Vtre$R0BdwuSM^TaJ_wA>XAZwh}RGsrJWRgLV8qWx2!{G_Is=tvRy{-|0C
> zgMiBg^&fEUcx$AjrKY9oh|XXj-%DZX<7mz&8rSdFq7HU;azCmP`VNHP${LQF0Ag=?
> z&5c~1+ZbJzu=>a-#grJALCVQ2SJ%c<@xNIE5}<(->=s!=VmX=lU-4mU!OAKn-nok9
> zbHKtz1i at J5Es7JWTJ@oFDcoYO_Oi=ih<OPRp!8Yz6Dcg1T7-k+oMvKd;{g0F`Tu)C
> z{LdJg3Pk(d7;18jl)_CmXfGfB1n_1lUrS<~DI}xX>3-<(9a|?>8)zfpSV;?CqoV7!
> z-5xv-907>(Ae4G}p6HR7K+KaQnUzF%VkWa3M74z(d7h=qX3yf7uBS=a9B8f&P3}=&
> z9MNI}&f+u>Dv6D+Qs4)PJBFkXP3wlRfW_j)7^q^d^f#c1ZQz;(m5%bqp3&PA{@BpW
> z at kTb~5w1o}3&UTh5H>}s62D3ZqN*+NGNSZ*L<s1HPXLe$evI(Gn8<oq9VGHl&AsG%
> z=&tXii;*Ve+iP!NOsWz(QkIkHQk6RozB8mMc58}_TqbO5DFIGDFT(%y=-EfkJq)Qc
> z&+siapBPa)=(_Zu;?C)8Nn7<Un{gv|Huj+2ANR0Ps at kvwIGPz3uK`|nMnoHFlr?9C
> zQl4SznyKV at sfsTmGmiddr0HES()$!^)>2i9mrSqOL^exR-#XBOb)@-}s&)q(2!GmS
> ziaZR!zZFs0Rxv%41hE&bex12T6#=Y$)hA-YSZdBZFICk(M+N}D%&;xrnuJY?s2``1
> zridyK1AXR%L~&K93=2Rkf`GMSf#L280`pB~wvVkhjEI+aK at b)8cBORB5scQ^*>yoZ
> z;@)3p`p*Q5H<)ZD!Ny<d8u+}hrMc5~syDb0 at o+RpHm1k$?#fFkzv>O9ItGOAy0oWK
> z<nn(-1PiI-v3z6pE;&QN at C@>%{IjSa`j>0PS>tHt<QP7M=$TgDpBm`zsT#Pr!n!^C
> z*WlM%ORdR(hSRfm1vRp}7u<DX^Ef&!{^p1q$YAUlAStJvVqhGdAG1m}SMjQtkx8ey
> z6cbwC$+acmI`4h2zrEJT_=BTs2{}-&ZBD_x$J1FYxq%pR6+t!Is>Xp6qk47FgVSWp
> z!3X17YTDyrP)3qC*`Cc*z#E?_c%wgnI{A4UiDUkH8}}Ph7&AL5$~nm=9>~Kz`i$6-
> zNvEbh`GFrzxZf1iN-F~BYLIW0EfL2XsnIs#E&yfb$1&19Oe5d18u)e!FuM~R17AHQ
> z(EfH71C_#puxuN*4%Ib9nj}H^MtY>l$PUjvx~EEf#7Hma=4iyvjWkm=DO at e~8iB3f
> zD2_AHH29R5XfDTX6dO!*4A)d6t})T<!k9fk)HllKarep>@yd1{W`18q>pB!!8rQ#}
> zM=C)~<Vy$Dof40m=*-d6!`}k$@_AHLF90EPOn{f5o-CSWiMe^7o;eH~RpWs0#IW1Z
> z{)RS9u|6Tr?>`9LR)pR5?vRpgEKT*DwP4jmaZMIYo88mztu2C4Drp{3TVx<DX?}e_
> zVU!(oP-m}AMdIZxNP_yNYE6(Xzd07-+adOp_;D7kq|b<{W|}=l^{hW;kk?qXG*o8M
> zAF*$smV_gA at oF>8)$XY}lHeHlVX62-9yN<Q&9uN0`zhYZ<H~|#eAfasi}U{d11+D(
> z<jY8?IsOPIR0_t5B3*vnlt(^2i}(AYcl%VcMSV8SbOq3m<Dr$no^GV!8V{LpLDgFc
> ztMnd&*Byqs=LSs%56kh+08s<jw?o$>!}`E#v}K~}9~6h9{)@;-I|*mAWNh?W3m#Yv
> zA}|eI2l8YxnV}%#$7(~9hY7oWmvRUvQ#7pP8!3P)Vh&9ZjA-uT&#zxl0oA+9Z<e*G
> zKnlSmgOM&*yBMpDEgb?w at t6M&jKu&(1*!|d=KKzr<l)eGm1AAek^^kyJ%Hfdp$b4^
> zZ-VR|C+}9o;7-5;cBo^yvbX+#U9NFuXg(h6qTk7{15Q5n&x5=@gvcijv1>!~FDWJh
> zk?N8vqV!%3Kxqdk*9YTZAX3&n=OigyKVCtTgP%Z4GYF-4J_m*@JrEn+8PQzY8G(hH
> z?Vy`<vgl&~NntWfQaf&VOCH}kUr}u$ac!!E>9bXqM2g$TApRu=*491}dgOujq_8>K
> zw&MVMT(os&@P86LoD8G1JNGD;-7mJ}QZx06Z{*U<s}@7TeC&oeacCeE|KCFM`<b^1
> zjbsVAc&_#zSO_rS^YHGhgFbMd+Zc!)lpR)WKt>Gs`uC*Q#EE%ydO?=cKw_m_pz&y~
> z0(c^p4Brt<$2Y<#Zf8V#E%GqaLGnlPXjal{A5j0%VP6XTqeOGpBjVe6G(Wm*PEW>V
> zGc9p3 at I{$^pf4cyKzDQ>5~t<^HIh+;{u>ku#D;ueP`08 at XF%KExXW<YWKaz}CX3f$
> zva?h%NPpNOeKT}QT<&C~T=4ty{Rw!fX^Yi1GL at 340~Y{W?EA?b%5L`mL^rfn*SaEw
> z(<Y at HjlGl#Qur}ms<Woue|n;F9vD9cx-|Ybi2_0cCX>xqYx>)*^`%UlSU^{p6xg1C
> zBq!J%xLd at lN&1!Vk$j#J72Z4$-!7oWB!HCL;g7hXLuWmH%t84oF;YNNIa(sdj;AHu
> zs?)FA$J3G21><`Emv|?_ZcNyZBZ>F;WkPj6v{;yoG1h|nkJ*b7-oty{FsaVBkHo#+
> z5a!$$&G|7d6k&Wc^*%`b8K%bDOsH6Vc)uoeS_|&W2C48NwlkC~o|r&KxaP<aC$YoH
> zG`2z(*TxeST5nNV{h1`2afD|opxYYX4BrC|vikF2+#nLYZz4&7_-rN{?gl)vA>7l#
> z`(;zg10uemKo#P at 0ijX`LD at sjC44GdA#Wll3`^pWC&}80AVO4%uTG>-m=<${US7kI
> zSH0(}r?GgpQz5UIdc+YZ&?(+HiO!4JYB!GfGBjV at J&BIZ*@{<GNBlT=MfHA+jG)0K
> zsUG at itG#H%+0b=jWD+gFd<GTdGZxaZbL4!6QN!~YMi0+t7!$e<w^OYT?y0KZqDq#x
> zRMGCkK=&!}Pla@?OH*Q_q`{{S at C>&aR6u9u$#iC(JTCHvmK5sB>W-IQJrd_*6$WEX
> zond`Rgq9c{g;o6RH~sGZdC<MPq^+$~dhC_=z`aj;z+KAnq&s%77n^<D?pS3H80H|w
> zn`6$1YwO~leJ{C<-MSpbaEx at l$R^X#vM!t{ZLz3_BETnYrq>3CsNj98 at kOk>$K3JT
> z(Ej)Q8Qyo_9fL}<f&5>8FcHZ@*PTMXKtOK)o1k})4`z6$0U6PNYi>W=0pVS at Vhe#g
> z)(Z`WDcpIG%|?l%is;BhLqHeBsp=@IwG`2@<v;j&j*{3Qw_{Aw2*%-_z^V5Bb-?%P
> z at p0-A^#^(w`?}E6Fu%7R<T*m(LQhM9(9?bR{wqtSCR>XDom?=Gb({Agh1hIZ&ixhd
> zJQ-G!Rq(qnG#_t9VT|3V1rn;HQmBS at V9+lUSc1NAE|hTISELZFeflVca>%p^%Fv~R
> zu4D}X8=8b-jfNub+&;Z%nL@|8EDres(n|RPk_s;%VGi8M*5wbOZpB|PoLVthBl4PA
> z7HJGs^r)bw0;s7-Hw6ik0J8mtO6)z_<=5g?S=Zfoq26GiT{1Nq5v4}SQF0{Md}Y3(
> zmIq))ek`7zLML+WkHs-l>71OW5XIPy8j<;(WStG52 at Js%z#h;5NfFmfg>~>0D*Nhj
> zD?9tBcR#ea$z<3_PkN_I_XH+Lra%F|oF&#Tr&E+&{%4l~e;12qmh@)v^QpjfZwn>}
> z-=sjIwoJTT^6Wg>T-d;OFCgQJb*|2qZ)jXI2t(9gCvO;1pqB-!v+YHyKZLHshg1Fn
> zX*&priS at w55~I8O0}Y6iGyI%1*s6aIwdzGI at fNvRFUrmOQpS?lW!*C8iF((c8hmPu
> zdoa>=JOL)eeG>4 at EwT}|uEzEI^#IO#aG%6UvYHQ at hd||JP at AE<ewapUxce at M)?zw#
> za+Y$FW}6qrM2|<z3a3n3f^i^&t{{mxe&3CVrg}_#q!<YODsgu)y(|spj`KNgD_*EY
> z+v;2n(ba2J-%1C>i^cSIS})!<otk3^s<pg%r?_c4y(UM-n2E0{2XnZo>s{rY*0Q!;
> z%W|1RVZt8YBqq$D1*4&K^}7sbW&(K|F#HTCd$Lq1*36)3y2`;PE8_AQ^vXpbJO#_7
> z?a&=Rk_Pt=TrwNuSC!pF=)eYP$A%A3>t((+WOUx7`kvnof at -}jnZL|U02%pgkpo)W
> zW<m$maN;#!gm~$9;;75$EG|bcF1(CBHB!OeO8|QxldV(aS at hR=MXrR}6Mh*xoKF{P
> zOX$_sJ++eCTV0>3QZtKV;6xEHj)c4~>-d&;!awiB1 at zgQim^P&<X1HrgQ)j<mV@*k
> z6T3_3AI9QZsdQ$$&Oz at UaE>F{Eq`fkcP?O at W8e$5*f0}1$%N?1F%TXdG!8;=KOeqE
> z^v<LyR}Z_3G4Smv`EK5}00 at d~1>~5CV&KpJcH0V9PD(i(Q}3l}p`(5mr(zN!3ZNu{
> z!g3_83|+ZjAArf*Xv8=4V(ctBxAJLVh4S!i0m`snHP;$=awGz>>6&^{^?%Ze!Al;$
> z-TVrE&2J=n;L6^t*K+ at sS&)sh=*Y44WrV-oZgUMZvrfhpyRT`UY+Gp2*%q$P2C3}e
> zEIOIqBc7Q>mlU8q#-~A`jcw-%W21wdo8sl3m*OLC=X1m|C{%~ei)&`X6x<?q&8B(u
> zkeFbhGiTlddEVGSfscPfK2huqW(;+j5r|V+Fa-w33^DB>_-L?Wx35Q|o+7i*oYBz(
> zWWUO*_764d{wnc+g&H*v-x!)4zE<qC&}oxOE=l(x^CCZ4<0gObS49W@;;*$l(bsFW
> zYF`OVfEi-h99o`!t-M90>2XK5sQwX}+(U7T3MRaF4owHn;=mlbfW9i~tu)<rG%!U*
> z7AFxmt8<2MqT<i}jbxE at NwNS`(IuZv4*a6-{Ty)iNqdpHsCSAI*86Mkv1r)L-aIau
> zjDdM~*+u>Jk(f_v&X6O%%kXv9qwD<XvxZf+ at OPD86`CI{?w`HSMT=WhMac8GV<4Ht
> z4lB)5;mF6%r5XJ6o1k~c&!wd~C|>OgRiqS=J at 9WNuOF6ASw0;ZP7i1-iR0QWbevz@
> zIG3il9;E?IFwQ})|4*Pd7%T5k(B=N<MWlgW$}T~pnfzPmG)2GZn#5s3S6US6nfL?<
> zq1Ma<a$u6fCJ&N1Spu7Ykv3pj-$jD%tMJ9Nt_uskDgK$>>4D3n6#z)Fd^K|lES4G@
> zEw~8 at vDR+XYlooGA~bs4U|;?Gf52k_36Tk@)?TF7L-Eh{+XTEFDqoH~wh3TST#pG^
> z(XeL09CbB{|F%(M%CQ~w4U`w!gC_*P-Aih%Pwm+uCX~{&k(C?TorI=V7<2`|x>d7E
> z>&!Jy(NapYF5k1Gj5M#r=Mo6o8Vjbg8_6e87T at lx>}m3q5=JyT{b+ekuvy2HH8+8j
> zj`q4s3{R7Yy7!CM=Z5RVU8OYNzO2BeUQT*r9duc?Q%$&DHMlaJh<K`O2}Iwc#{K$b
> zqkQ+bu8*k0f_&3v9b1CWsDL?4wHEwQ`+7<lO!@+&y@*}_N!?PCGLHE6vO5G8Q9A}6
> z2n!7nHHJa+8^PZ#)|Jy*?JsyxIncFLY%8bPv3que2k$O*meXk_JoAW`DkUkP!==~3
> z2i1Zp$O*>XWzl3a?DUGsm at Gw3X24`$9}nvH%=4D=X9#H?zpM1&1y5f4y1gc4pd*^8
> z)lNq)m}AxbQExYJZvyZW@&1((d6wH2`(#Fqnv76ROrxm|Kq at b$3Ua$`N=in9s!Py_
> zDf6g>`?*bAIFHU=6wRh0)`CB!;Gz6r;k=E-%f-hJFJ1*w;h%&{>70b+L$MV>UZ4iN
> zpBU|vd35gV!7LLX%emhbo%BD7o at gz2@HQo#xVVC*$It3N2m(P72n18smxw|Io$5le
> z<BP at XccG`{YYFKxAtG#y5{7=(fH91g(dLyq=`r5N;c0pJA%Hd2S9(P4<M3g1=xO<x
> ziwW3f#bjZUw1ZzxDM||wH-PgVf(0O*7&;?gXH`S-;S6zBB^`THc>v$R-oJZ!Kg0KP
> zh1{G6b{FAm2XNiLyGSu$t}s<ye77FCGRmy!d(TO3Mim?NmzXY;4DAN;y;Zkn@!*T7
> zHH*bJDyb>)+!m{BYhevEYYi(1Efh~z(zFQ+p`9?L%kCp9VfpHI{VLrpE1;2I`$V7m
> zWryt63470pMOAd1p{AVq{Tc^#il}43xl6phiWbBTuWnNny?N2F0K0*%4P^nQmIYG~
> zWn#nWcp;15PSX8o*&<UC0~sI_rv=hlHg=VDCt+G?7O<3B=~~p4A-%$1#U at Id#A*l4
> zO2{de+(HARP8+KW?-18G=xkTD(0+ at Fa2H><6dtK&xxIMPtIZk*Nxg;!a=H9ar`<B~
> zNHwIQb&wL%;kMneYoI^ml;I_U(Md?v?lMIsb|Beu_mSJJX)Fa|YwgB_G{B7pbYmF!
> zGZ6jsB_MfrK|2|03W2N at bC2faTkp&%cH3B&bSL&~&%@4g<^=5GJl72K<U=Rm8MG36
> zP8)fM<@-#`;hf9Hhda3uY~(p at m%2O0XM)jiv>pw2p3^di&jj&>f-&5wR2PXkr`=g9
> zm0|jwCT=o|8@)G^o6AN47%z(c%W0<TW4kft>p_uQ_I09ebnq2`uPEmGvJ at dZbREEV
> zGmgA-C294|+(38F>`Mqi$xzTCr{VD>#7wRv(}-i|Ozs9YGE}yYD<iA4AYM-grm(t-
> z&=SGsOlGaSA9k8qgYW7cpY$|8S-SHY@%k(1?W6Bx>&xar at kZyp#Oa&K9OoW#P*sii
> z)fLn at Ms+W6D&~D$9pT8nbxOmeJ7I0NiK*2zQ&$#g{8<1vPKdT at +MYgPmkwgPl!@wW
> zgzn^F-Z~tVds)nwPsej>`o*gGG%w8%DpQJq^?Z2%)sv0~o at TUkr`SB77L2 at nzq|ka
> z{z at 36BI|=W#Syo=5~ALpPiH3s%};rP#o}wG$fGPzx)T;@N)4SfqEj$32i6C}FfQCF
> zI%{ZN-kq#6{5<y5pR=K-?f|L80Yfl?Tfh=f>r5G`((YqW^wTwTjMmi+6Xp<zHvSrF
> z<w7^KETGq2SKKxpIJ(P~rb9V(vVUI1RzjSc*^|<p?#i<5WTkT?S*_@<R^D2rs7YQ^
> zslc&Z2O(2xHjzxF1a}OKW+PcC!&D`{v4BpXcZyvL=r}D*Mx(m|fYCc?`q+ZHpPx8c
> zB0fiL=MKoK&dv}m{LaYQyG6T`PEq{|tz7M-Ce at wNL*iB^o#_Gx%zJ*rA*Qh#<6e at d
> zmIgz>*D6mf4NfU*0fZFA?E#XQ6dh9pXBl+SQdZe^hkQm*T}Ox(ClJ~$9UKW*E{B!r
> z*hGMBckazZJ*+54I&UIX%g9DH$IwV<cqZ>86Q#3BPcRMqVt#g4JN-8Zrrj%c9!BlI
> ztg`i89}Rbc+vuaL5{4{6URg1VBjh4{HQo8>>du0mi@{yj1EssC1m_M1R`g#<Ev^G&
> zc2C(y>WGc(W5JZ)HRd*0bulpB8fC04+Mo%_%a-o^nc@^>I_FKS3KfjJ`E&Jhk~%E+
> z8pwV7VD6n$fXK=v*oIb>K;;>ma|rJu%ZS7TeUmHQDeY-9;UjxoqEOIAoamx=A)S<n
> z3u6^qDW5pZmq+odg|s04PP_{ZvQpk7HV}DJuA;fKps%4s_D!_JcYjmjj_A^P7nV*{
> zAZBP{w#hZEx{8{vJjBK;@GjE^6Jf2`rB~ggJ#i at Mmux(rjdy<bk+5a3MZqgr4B9B_
> zJBFs^U?FJ?JiAib(L({!uB+&L7b!DpZ?_YWueeT*l{YWgG{Qz=vw`Ez2Phws%@Qn-
> zO{flB_!O^a%B|?=O$4$5a|Cx&+H}JpM)lbsJ at zekLo3TX4DT%ysI>L5Y_wMC+Gsb9
> z=#=NM>~n$lWN1E%#XW?+$FWL~9d9BVy;ES_O+m8?7eu at kjFYvHvwZ1{xWbEnW{10Z
> zi*8dO7+X&+UI-sWH};JaR(@fU<!ejYrlXL$qtgg6$4;rcrk_%EjqHw<Q{wL!rmofQ
> za{;-xbausc^Hx=kC#V%T{9<Gs7R6b<1OFQMcENWud_(Yk5~}#hnw;|#e7}e9*1{}H
> zx7D2Uw8b>;K1;!-kHLQ${Lg^@0q}nU{s{R04&NT|{}aAv!2hDf<l1z!nd>litDxAe
> zxJ}iSjaM*FB at Egbwd&ULz!u(VEm)f^Z!Q$bf{dRTaUh_J8`#Pox3XY;F-|k7>Y??k
> zsk(5g<(r at iC`grWQ+)~5e1PZDNBi6B^C=ImfA_cJY1&*DbgKZ%tWcFBgzP&H|5ppA
> zLJOxs3zM+x2L`)74Z1$A-f-~(Du6}beo|)mSi7G=%f5yd9)<KBouv?ioxcb=e|mRZ
> zH0 at Cg#q|G#^p{%_p$BM3gVF>4e+EO)3V!%*dfP4c$Sm>1)zs)>CxB5X!KayQqTQzE
> zrF>)@6xrtCSBJv2Qodk<MmOP`u?sExNd<`^7ZX5uk51&Z)%yuv$?<an#nps0EBvO?
> zRhEn+cWp3P#vQq<Fga&!`#j%6)n;3Hp({D(&+Qt^icRlXmTWp4RD<gfxZcOAq+exp
> zs1l5w9o;cdz}<2IcMDmC<{Z~SRVNn&EHA#&sp(FILjQ~hv(P<<gDUuczrqMhdfbtf
> z__`XFN(iv|1M*J%1O40TQ&9sXp2p|?GOB-DKfwdE-t97jm5y8+pq14yyX-yd+}vK5
> zv|7xlqiJyu%h=y2(_vd39er5?3>z%q{zHh#&IvtDAtOCbVw{VJGve-1`wH0N*26zF
> zhC6>!v0U^;$@1fMbS6-|KpkD;+Jy!@@Zdr7<q#LN3w&SW!Gqlpw-5NBT_7c&1Tpqd
> z3*dMY56r|sUxqW8c)ftV$!esy0!dN1F7BR+rdx6C2jYfCW)<Q%AY?44-`03MX(+rI
> z!}H6?(jkP7%ybnY`|)XhJt;~44XOF~T3Vo%xd`#%wKT((BUCT4B^Ea3oUCuA@$wS|
> zeP060m&@MD^4R5}vci=)CqIh83n4itt=n^iV1`m89^yc%1Bj#X*k4(-^jTQ7=Y%D=
> zB`ACowBdHt&o`k}22#vox|UutZwu+Kf(&{;bPkX9ZMmC>k>eRXu13VzKQ)+Kf165!
> z?q5F+#@FA*YvijM2ZAy6w{coQC8JM4Ai>;AZM at zlp01}Rml0u->%c1ZAx!dx=J8bn
> z1FeI&H4r=4k1nT7Lk<Kppm&FQ-L+JqKDTLu2BkamQ-<PJbIHWeS10Fl4)6S621#}i
> z8(@+(B$?R4pSCBXLIgJRlnSwi&)ziw7JhP$$ESH3!<Wiv;IHzda}JOClYo7|;{r0r
> zL0=z-%7T0|e6L?(E&OUA0DOJiK!SIMKTi6tT}KQAP0rwkdOhZD6vK;Yn(IU#@E)OV
> zej^Qk(2x2C*VS<38JO>9Ym&%Q{Wfno$d at +MQuBTGsW`!8C!_ at 1#w=085q|4~2hI@#
> zv)OiR(E8jn-`xolYNytgyo>C9*tc#6xBHO*Zzpm4V9_U<syk`78hRqnqBB)9UC3p3
> z6I6HPqabW1@=J;Ocs$RO*g%|om#l%zd0)e{y#YlpYl&(nfpoS7 at 1pUUw^D%HYlg-A
> zZ$*RFkpDlS`G5 at 1`As&}E at C8v>(F$oo-7J-k7%G_KLJ^ZYnF^EMmsdFZq*}D^i%6Q
> za!<u#5thVp4+6{BY%d}mL7fuv|44iL_@;`i0eB|4Ns~5h(>8?ym8Rb<w4p$iiZP at i
> zlm<%;P?W8RRb0f6Wl>xgSC&lLTL at 5~0`?*z8w6`n7Na5*7cd1sDpjoVWI at -gfIPL_
> zpr)mTij}<Q+_VMv-S_$DZGX9UzGv>4GiT13IWs4<Y#`)3Fp&v7d|wTz)Y4eI8Ik+t
> zriy>`&%|p_PzJ}XZ=l039qw@|S;yStB!nhsfyqf8_}Gb at f+$+Yje}QYYhGX#_N8|M
> zi|m`@H0uGw&qiKU=zEy#+})kGd_EE{p9AS6O}OoTI at Ym!WMo~-`W!&_;~xXUi!f@$
> z31Q2^Afvv6hM*4j6zL;Kg`0(5Scg3X^V at Xfj+}aYN-fZGI;Qvp*Omd?;ygf*J6j?o
> zJ16h at I5h3VD1fV{MZa~WUdyD}cv~?5QSX4+toLj&K=EUJ0-+eOmilDdRA<e<0piov
> z0=nThK*W%GAaLF~;PSY)q`T1WINW2_R;e3UQR- at yIgYO~7wFZSwEH6WeKG*r`Ox at S
> ztDe4t_G_T5d&7mzhr;&bMmR(rMA5h3+ at UP*CJUUYB|-I=c~>{|giWz4wI=(b?M6-a
> z7v?HX?wf(GN+O at ZpJg8hPQ#=#4UgKzjTVdxU_ at ZlMB@{^or at L{nJ*XjLgONKI)T$8
> zadLODd7*;yr4JO5GE at YbPA1yRZs(3U9T^uDDEn9Ds3Sl$xL#J_mGdoi=X{q83r`=~
> z&@yOB4Ugn)BH=4pVnB{RQsAH3&kBK+j5^K3%sg(M*7*_MHdlSYYNn%LW<G0N+1+kh
> zcKVQUWpBXr_~-L%WO$pAj{aIuJwVe`8|L8}W%UJN!UJ^d)Uv)D(`KIre$mDk#nte0
> zA-rKeOc&em$VB)XC{PMnluv`-89C7hUlEmuM+9sndZ*xifQ}p%Zdd;_)XhFpV0Dv1
> zgZxN=(Eb3ucSI8~FUxkO?R>QEoZlk!`P%wF1RNyVWWiiThdZ=*D7NFFuug1v0&wO4
> z+xDU<*J(xak0qI&J5qq!en$$NFcFeM3*(jn&;R}UWVF~We(x-uoQZGgdGF*zPA^L*
> zk;deo%3W#3(La at gFA98jJEu$jyTPvkzulEK54?8pMuT^j6gkV7_tR|mQ?6p8;iuUx
> zO84aexxU>T$4!Fpndgf;BY>SSLAseH`H}H3GJ=hN!fP at +KJ&`@z3l9iwj%`w`H3>Y
> z at F3NXK2i4VC}2&_!FONmxZat#{dN<?*=wA;OrromPdo^6D~dku2k9{7K*qxl(xjXn
> z$H*L}Iy2gR#|An-=(v7S&ZqPbn2vJ)<GguW^+nl+VvvyfAB1_T1jg(+r^UnZ`fKHv
> zo&KpX0S at OLX3;M1$(X at 22?$pC=9^CT<?v)*fp!<6<*yLk=f6$&5`e#MKuIKL`vhqY
> zpN*w9K3OMo(RgqLsfVx7lGs3jjzA%{P~#HfV6h#c&N1sPt`oxR57ArbY at zibn(mOY
> zLdLW4PqX3u9~t8B%xTHA7I1~8QEg_6R<q1~S7nm&7SxKck(j;qD!I3@(3 at b?^jtzR
> z#7FWHGvVA0z5h%%ZR~}KS=|NWEy;*COyF%jExLaF&Nk*nb>BDLUM*_l)9ApxXxCa<
> zSHPEucL+-t(ov3P5aBF_g_%Lrc`(77SD5AGwBR|Z;_;@_5*ulG0K at SJh}}($s6m5c
> zf~zG8v8~l&Oz!Oj;*JDR$GkAMy`9n-ofzDWyk5r4Dnr8Q!%SIL<yH88tZVW81aU=9
> zf?wrcnS?r~pDcoTKNjF9C$a98Qiw%Jdzfa at Ori8)fZK<{qKD}nYUql{0CX8Ay#6qq
> zm<p`P{mbpzjrFn&$&PgknMUaLG?)CWzWg#-As!U2KTPkXcL?|Vp00-1zkg51!YgtS
> zy%+g4XS=Xy5ugh|sa#H;$D0|YagGQ7>p&`vwS~5)1IHV7jj_?pXFFu<EE;gQaf2(O
> zN5nNik52Z8KPxbCApa8nCP-*LkRY+t92YoUR%OQi8{n*}wRY`<jdiRPGFyCe05}~T
> z$1cYFcJQmROu5y0;SFJ_xR-^ZM`(qn&CDKwx#vOX08!Zb2+huXA%Lbw^<K4UlrImB
> zMa1(ACRV2z_#ciDphu7U@`MYI&`E%a$&2Z23w(;;CL<MJ00w8=$srA0td+xBmku6Q
> zF~}k11|sLiNq4EY529f83P8c9Njf*~a*W?%j1yll(oH?RY8OT8r-ElO&CK2?z7kv~
> zrjrD2oS30a;PQj at Tmq#~SpIo^=Lv)SbhGJ>HnY&bm==u&{NF;BF_nGGnlF7i(@Va1
> zp44)_SYBxw3u$IQO2=fKZpI@{m5fVqEhe<?=}N-Q!V=8mncF_zRdcycD({s?=~CIL
> zgM#icdMo`vnDH1*UNG0d&X&vQt#&Ojc5N2lahf?f2?jU9mwY3B<QXZNjHG3$XFkB=
> zHZcpHlX<;oG+*MMTE2_K4IUyNpb9eqLR;8lrn`Jf_PXB~XcInojAqUDDa8`I0?*+B
> z)FQPC5(Dojc*lk(5Sbzv)f;;zj;TEha2$FyOdZ%|Pb69~i|81qO(eQT>eG1ULn&IZ
> zL^KJ;$7xQ|sdoo<D6aC9OCZ<%WoX{$+;hT;$7#xaw*)ux8GK}|Uh0<p2OkK`1HoZN
> zcPv}M*7WM2bEvoqX#l)k at gR2L8{|H<=qjn_h#~#dyDXyn1 at WEW7Ch!_x09q2q8>Ys
> zaNC6|kJIe&UyuZr$L6yYyxc~TX>d!It~-{0m~Cf=g9$eB!8<IXOVb_69s>cQ6NJ*|
> zgz_ioGmaULa&k)Rs1BZ`q3aq+-Ll>O{F*O$Gx%rqn~{w3UO$@VASSslS~5dhPiW;<
> zsva;q%i*Lvbo95Y;ZA7wYHT`8&?Qc at mC*jKRo$yEyYR+g;K$p5+RJf at Gs-nTl?x?*
> zpgH;@1=`UBZ(>b`IdnX at 6<vx$)i{4%*O=~u>1V?qXnHI!u5FJ*YrpMkR38_-f1s%&
> zUIRhxxg%xT4Mb~<sc-r`-4torZX+Ywglm7GqxIF7x>ZJF_ZL0N-UzgU(RZTKP4C8!
> z$?WmX5H|`%OK7J2w!jxc)e?I9U3<`Mj|(L3`aQCQ&~>Ax{`I;R$^SYR_P-(d-q=2(
> z!RtE;!|fw!Gv_1tu;=^BcOI9?nby9Uy&W(M7nabe(=+ at QyvzZr>unql&nuE#*~4>C
> z$ZNbDn~W+T^?MrkV<lMhv8ef7B(;0<McFmGM`ur9W&YX1l0VYrksBh}bY$HUqlMrf
> z>8;aV<I{Psaddr?aY_9i_`MD at h#B5*z-;rO(~KGgfEZ?eI$H$9=rLzWDWR?Qh0NTi
> zvk~Q<zBqX96&_m(#QX=LekmPw`wu~$$jM6}$88gT2-br8WpHl?_bPDj2(E_b--0f9
> zo`dkS5Wa?uF{x{o3Ky2r$zx6*3f4B>#-}!L!BytjJ2{B?^uGf at D1DNy14{QlPtrAt
> z+2Zq}LwM*ZiS})Kil*Qc!0UvgPtj58kGDK;PpDZ5FgX7dJ at 42M$(wnK7PxdFysjo;
> zq)%0{muT0|^>Na>f<?{>Rojt0G$5qCFtCOj5;A*jM7IIN&HoqV2jPBF4pV8*Aob)6
> z_zb+UQnCy at jZdp#Jb@`_IH55&<_NyjuHEo~F|Ydzq4H^3B+Gt6*zz<TKcc@&abAD1
> z*Y{Z<o1`;+ncmSIRIzNB*Z=)Az3&b#7=a?{{L948n>%HFsRyQXR|lQIqS1hCH(}E&
> z2<Z>jK>1aEi<F9Va%MRf88{&<{}V7NyID3jF%&{e+o3ueY24!-Swi&F2%&#(FnD!C
> z-|#=cKFIF;2zU9Ik&m*G;x?axk77m}u_R$f<n{2f{tpfEd^zf*nWDxl23|dHo_75`
> z$g8hvwVGvbOV(GXq0yaH%YhCnMH6Qv$4$cMXXqV{0>7oP06Mf!>fE0j3p?U2YM}nK
> zFo0^80)Sc at _xml^$iNC)e`BHaoCwcf8YjGZ8Q#~7&%RKGgEFt1?2>nxc4c0NDaZx>
> zULu!6ihLPRs&r#an+g35oOh&sGq;_o9i9 at 2OeX-rE|pv{lQUfKA$k3H)dJ^+tOVXW
> z;Z5gXuKt}pfottlz=v*Q(|u|yk<BxzUnoPrRWF<8pAE$a=l7CgXw<J4If+hO2Q<3w
> zjU?&vE_;H!XUp at ZsN7EfY&6)A>G%~gbhjp7i-BS+0T(={S_xSWZ!5fm at SX+~Fc01(
> z at S6_5Qux{6H^Y}LlglP!K6u}OIpJ- at obbLAbHdw%IpIA8bHm$=CBVBFOOeSlWELz6
> z0;Wn!GU^xZGCi05gncu8y4Gyn7}^eP?-#E9nWn(V8o8XNkE-)q))xbn%fW-xzJHqT
> z$l~fg<<CO8UxazfX^LYutExL^AI~!E3rU8r6G+^Lcx{gXa0NzE65^8=$j7UwK7%-?
> z1)N*b62<56k%)7(O~CL*;pVS-E~HBK4hv(Z44B-gIBA`AnwC`W#!&52*{kSB^~LH&
> z-|%ZX{{zC6<@Av`y(rf6xM|NBrsnnXR->VQZ}%$G<GG!@+>oC63k=x5^ZM at 9_Vg7=
> zKmqp|=4Afby#`!w8q)J+y*1$SK-l%}_4ahR&M-0aXTkF<9qmwz4kP%wAiwiK%9UCW
> z?}m9t*yV(oMyvwiThW2*FTe56#9?984qs}@g^&UWLG{ix{S?=w=<UE!&c~sY5BQLG
> zd2r~};$_{BK}-9g?q3X30gIr8euu at VX)}3~u}G-EW7Ts<!wWt)`DYsQ+Dv%suoRjL
> zp#>0nzb~iniZ6 at znil5Efu8-$%Rq>?1f4^W?|~{G?*@^<v at q{7{CcoNsquR5%K`Jb
> zL)CmK-8$^-r#$V8yHN;VApH0jnpJe903f`Vmm!=%nlEGLFFRW`Ft>Vu<c<eqxNLeU
> zvk&^m;!80a>-QP+>fbab*L#Gr=V)f^KIpDDu?u`>47>7r1oj+FboB6P;W}1np`lN7
> zQ}&p#tow`o at 8i7O9RV14%`3;IW9b9DdRgVt2t{87xb7YR(H7{F#W#U0?4JpFy2VN}
> z$MiD2tOR;#@eug7Kz~86RQQVx6Z5+9a$NJ4Iz2R_NS0Aug4SCyLxzOB?$)S|+)jBN
> zD&gefLc9sW`dc>Ol8~Y<6 at 5MpQYfE#u#;EK6Be(aX^wo3O$n1BLqdLJr8cCgTuiwJ
> zjZay*Sf;KZOx8fWKy>oCezX{b7KPqIlV at ll5qE;zYJMtw${Bw;2s=w9>%bGh{|$c^
> z+PiGc?fBn|*<qulZV*HBIe(hdT+R`NX>)$0Pc1qm!<X)f%!b$L=0`&FGT>vODKHi|
> z!^C`rVQRk8Feg9a-~-U;PPCkcRvlMoxF_&slFi-tjtdvH19o>OVkxIT43}b3uPy``
> z at x!4!cF1E3oBM at 4BQTExsxJ1YcgQ<6fG%$hWt<NP at fI4Y2~U_1@&q1oY%sKPJTOrk
> z at AB`cfRT?rsPF^-4(|x?ngM>pP({Qbm$+)Y*Ph#b%qP3H&>9C4Upl$Y^JszAJ`45J
> zV5U at 0#Z_eSn7BcRSxHB#HYODfucd*{go2ec^;X~)eGz@*d<qfxN4##SFR#x4RJ(`#
> zjm6G(lO+KIf7as8q2f|k<ahc`oyQtDC9GOW$4v(&vnC`S2t17nYyUionJ~luPQ56r
> zom#6G->O+7ZsPyfvNAb?Y-F*xcp`cN1{Xa?I!7~=$BI{C|MP;-zmn$D^THSh%`n`V
> z`*~D&egt^%AO;wuGr>H_I?)}G<=w<t5>)5UyUHF8^ojYx3J3jb+_}~`%+l)&PpYf8
> z2$76FdPgTNNmS-g6%6M>)L5!h;lTr at lAxmhwZKM(wL`hrfn&Vx&Fbjr)Q8J<ZWs13
> zI&17DTv9|81*IlFX*4lve!3fNWBpVvJ?+wSmh_x0jB(P`+_x*WGL?H;iy~}ipe3Tw
> zV%G5*vz+Gy at AmNxvPu=#0qF9c at U)YrjmG{%U!%;dWzh{~pD4q9+9>Py2C9VpPO48j
> z{T@%vBw1r7EFQ4nJ#H7d4nodk;gXXkW%-miuJFoQU^h$c>BPnrGT?yUf65m*I0{$q
> z7RFRleTGlzOw|>TIJ=(M7)ASTkggQ(1>{q?i3o-FX9!EGX=d)1xW1W4y(#YLFgtvD
> zAWeL`Y1V#y(_FW#X&8z;_JwlqfSL8-ad at oMeS_z#XcaD0(<#zoSXK>9mmFm^bdGd6
> z5|FWs3V6$%#I9qsqMn5+w{kyx9?dI&|7&a2mDi92<AbBWu0^dNl`r;uM<?E*{<ZK;
> z4XWjU5Vr_E>97EUB13lSU11DQN6F`lqEO0Hz0Ai6kMZ<2e80leu?{;^@Fl%Y at s3{V
> zRWpTY#D-3Z5Xn&-t2 at _FbY6AwqEE&?83LAM!kZ^2qiR+$rD36u^C`iV?31%ke7{aP
> ze(IoU*Qo<Q{(ximDG<R-3xU(we5%>*c0Fs|@$*z`Z0Ownkfok2V<&{NT6*iPvw at w+
> z at O_8sCWO>n4LZrvnqF}A)Hq-IxS=Rm9XK7V2~6awn5I^bD)2Ts{5|17Ej6eBR!KBM
> zoGM(ZrO8RB|AAV7XzQxHnnWTbTa^aOogWJNRdfXXT9~|wj+U(s3YDwqICZ{VySBji
> zM9(E*(<(at_TO2b%;>Y~kJ~NvNf|gIElX4xV!e48yJ}uYPS=+D5{|_Zo%};v=!XSX
> zE&us>AnO45e+m7oK>pDQX{+g6^<52hC(awv4n8cf)ig<#7%6O9P4CFwhSqiZy~eza
> zcQrH~OEu>8c2?%dN8?4j%qyPo4)*{((tRcLuco7>_4e-^5Qf2pX5*y9se_4I<xtd4
> zDZ_!*U${BsdKdlbDwB>tq4LeQN~31uUBY}9%^qQ4Hj~-~LdM1y(V~10b!G%6nx1Pj
> z3)@}vew312i-qehS`6Hsc?}&k>)1yyDV#ozTQ-I{r;jsbSp~Z_ at Vt12o%N2dovL#a
> z8P93uOas06BfO)<Z<>rq7<F={x~7AWSmXqByP!3IEiPWzyN0IPj!P8!nD66$uYVpe
> zN88Z4p|cp57fp`?4N9U)tClN7BS1XC>grl?Er&eDlWThM49sD8ffVO^P#Crruo%#~
> zXf2&waOzzx$5eq8 at Koz|GdZ#cZX=n<G-M8oK9Cal7H|og6s%^Y(3t(g?zMDM+&$r2
> z1f9iDcm_K!o)Ipsr8$MJ3qVY7_ghK|ROvk7#ycNpX2A9I!5g}96N{Mvd`L8buMAWN
> z{w0*IqvL*;=AKxolE)h4r at h`N=uIVyz(h6 at m5l<xX)lPoDxg1V_dB*wXa~&L$^iFq
> zT$qZJi4ZrHs71?xkV(CUgTDG3v+Z2wxA+$b?dxdDl)E9g(5lrGOG|~gDVr6jzHY=S
> zwz}M#EA at CK2e}Z&6RNCJnd>>?liTZ=%CPJ7VZl&GM>yUy%ab*8y(9#!JYtR^9JK3*
> zc%n<;B<6*jX2<x@>M#oj^!6yG!8?bp$Aa(u>#=4zi8o9=?G?uYQnUoC0Z@~nQ59^u
> z(bx;@Kwu)IJ2Jp>Jy7YQsfP5^-V?V#IV}*HWSBGT^!wmB+LvUiIo-mJoj=j3!AgX0
> z>gY&iI8NxV0|^+yZd*@N9fKczdC2yAR{sa)1xppzmjJBeO;8_<ajgdpE)8Se*2u01
> z7E!6Ca+cMn^r<jDY<%H*8t>&er?NwKQMw!M`Ukc8 at 5Xe-ek3p3>{VgKW|9#to#Mp%
> zgyri~eO;y+$LW^-58%JVknYnMo#JZ4!qbOw4X%3~fN0mL{l at J*mki5%a>E>-;?7Td
> zJJC*T?^>}fSZ$E|l))N!Mg)0ys)DufRCh-OS9Pz(ThS6fXXJ`gw~?vf6I}pGBb(71
> z2{iSr>7_Qaw11`#I40s;5U6IKh^y;bfq*{VRvPAuYF0Hzl8N%GsDLN$2|CdZ-Wo*R
> zI}b-4(fBQO=X~Gxe+07l*fujS=c{;cQydK0 at v5ioahj?FEqm7NS*v|e^B3)S4TGN(
> zek<VjSNN at jp96mUo;rt?YMzGQpWycl{QeBV%k5PCCCj>2>Ypl|{`?(k;u at dmz4*~^
> zL&B;3{B*;_({6tj^Lk@%%yw&afY7hu3J0J{fUO!>5Glr`lkQW-n9FAergUWo*BKdh
> zgEZlwOy5myq5WG>yQ{w+fb#|dr(rpe-JHN6bWYrW4pZ7U6OAqO^Keue+gN4Q$3Hu$
> zLN?%=DfPdOM?0+7@%mVK4?ydmxWhP*rY0;HoaQGF1<VZZL_urY0X^=;gLzoJT!mD&
> zVVD<*&JJD{rqehkg-aW0>a4f$`lDY@^Rj+trJizp1SC at 7X^0vIB;;|4geU^lmL+6a
> zT`Te|-&+hdr`{#Y<h?iRb>SFD$S~#3<AeqEG&A$f)~v1wotzR~0tw+&v(imUap;on
> zQH;WUB%!IEW{+xTHoWWLmp_H4Zl0pXI|ZV=wnz}`siE}Qb7<7nM(ScDUTC1h<`zMR
> zy^RWbEEjkCPVV)pewCy4%`XqmXN3BqL4wbzMRp+q?`!HDE>t~Fa~wXoR?dyXJq(pj
> zI`r}wLYOPS_13bb=2+C#A=lvdOT3)+`IORjijt4$|A3dnPlYD1{@Z*2GeMRubZruR
> zv`k{Hq|>H>uu7uV5pt!SPh)b|=5en_2r-+e+F`Zob+v<9MH|CD=y@)I%1pW7F984j
> z?(ujzgJId}!&skvb0}1yW1)^T;GdUBn_f4y04X9`3^$V;&Gp#2R-l|mnX>LvTj**X
> zD%oz-Lmlr9s at ysTyfclO?o*X2RisgK`7FGp>!kagJ`)y{p=lsHih;b&Iei34Yy%11
> zjn#zi4walqmQp?e1owR)qepmh{k8KEoqF?l65a64 at hCnOm|=}Mo<kz|KBT<g7hgwx
> zKjHM#8ZA0bw5kT>gS8K%u8~ySG=Q)dpzVbr`(L44_o?(PoK>GFAN-a9-%Lrvve`Rq
> zC at ktXDWdQ`2VM`*<*Wq`@ZJv<F%Th&JJN7R at uGCvooD_5qMkU;l)Kgiv{0JKEF8<2
> z($;1UI$g<jH&KNLcaYkvh|2X%cyNoU2U2i);%W#?QCudWrrS5xp*d9eNH5DR8oxt^
> zYXOEir?U6^Ee%DwKM{&OYNHD*cx1do13kMFq!+`ytF>lHGAh~v)6D&SDkS^A9_*9I
> z|F1`30&_~PuK;OR*lX}^9^i_BGfZ41ee at 0AOf)%T$^~CR;ws+=T at 97}CjI)~q+gHe
> z!$>IQSnt2zH=}%i3P!J0VMfGoNca*{{U+l}|B>+}$T(WkOu5fDHcXrVEV28i1c;FJ
> z0?l<i<cmg4+ at FI!wUq2hpHg~%4}5&Yp6)U^Q?Rq8q0l%q<_B1FoKO9m6ZJ4`G^T|g
> z2RL^ew+4BcE%fI_RxSCF=lH2G1nVSb=2#f7BbB^NI*!<dDuYwnPP>6glls{)*v-)^
> zpqqn(cOL{U25SSqgNYGX5{_pIyTTFbkP$13#+mA3^i5MnKTx2ZYzF^ODWOmG at ZGD$
> z6FppTRi*jI$nJ<{!h7vc5*1>uFBV9$8&Xx_<`+9}Sq7La+}%LqMz)puuJVy(zc<J8
> zX+6BZxQ7!h%xY4v(+PiRptmIMIhbOnL>1&Ob3u8~*{gu4B4KX>9gAG?x`%~t8fc1R
> z&iNA;uc2Wa02vw!z6;RfS|yVspYvc)*{TM<R^s#&GbIk!Tf)fe{8>96ySteTP<db!
> z#nm|T^mNp<25TxwC=X`t-nz&lxm;$W(K?)s0>6Xam-HE_Jlv;Nv%FKVZ>1xPXe83p
> z-l<^)zF$K=-Qf6MhxY8I`z=U9!cy?{SZKxjSliFP2%ie{j;U_<<E#{!|6aMSn#m<n
> zAI{v)B{-GgEedGdGO1~qx*8 at m#wj(%8NTOZ##Wkr`x&Sojj3(%4I8X4X`sFv>-Fof
> z?_M1&^k*0Hi^A($Y4ZHjNBOg%lJ=1xQbu+TF9X?CYULBs^N%nO_k>Hi%waioS}3QH
> zmAJoxlGFhXW`|;6k4pKo5`$DG5eW`NPKi7SX)n^TaoslZN~!cM-u>|W?g3%Ji*)#%
> z?HJUJM3roibj7cJ<%=HN;zv9kRw(h9cwKE)-8uUfzR>p$+5-iu*(bdHBE6L^5ISF^
> zwumpf<%Wr;_6tSZXr5zVh@>!$2^gO)&N#Z~5{S6(cBzaTfYBM<d$CImPf;2${|G9)
> zxHYLWC4jKZp}w+ at gJE~5L)ICA_Hs`jl9qopeRAACwuOQ}`BW8hruW8*C*Uhp(wes!
> zOY%u3+*KoC=A3nvWwYdN<>eGx=t`n72Bs`vzj at T9k_{w3ES`X83y_hZN7`yOYCrx<
> zd<sjeNMNdlQgc<(NK=$AzGVboY)U`fEEK*33`Ux0@<qeM(##f3PIYmj33pq3!x~4x
> zbGT%}=y6}Xu<|83$}!0zuaAOY4KM^_Hhk*MXR1EAHwiB{3(jTw$$A$zIbEf11X05m
> z*{BY;$`=LPum(O0P`PutFJ0*WI4+p$jrEjE>kd)D+`ul()s@>=1^|m}q`nJbuF$R}
> zF=7eE5iNna&*6(Cgd|{*#y#Q-<*$%Y^Lu5#yBK!^8|(4_i}tb^)&ki)za_j`BfbD1
> zo!6CROch`7&ql38iRt!srb;-a0<Q9+Wf^c~oq$`<0bdzmOzyeV9d$Xf2e`}2e?YFL
> zrk5$1!-yQ;Wn~ZaK<`&|ExvyP)3eqTh2%iCZh)y=4m{+ogG}X+e<u2 at +6k>NWiGcC
> zK*;?AIwcV-3u*T+_d<Dnz-xX2{}xnv3N!!4y)efu1YR4YQis?kjy;e9Jlz!dQY)Lm
> z9{n{Pmu66<tu@*>zx#`_3a<vH#Qoo at f;BL5&jscEXp;Ase}QBYZ at N=&Qf~-~A9*5C
> zHv*6&mJQ?e9u4Y5e4qB8)Aq0 at Z<@9znzG-J$eS7oF*{*-m|uphxc&D;(h2HXCF#x4
> zs3zgPmuYTF9kg*VOw_6IGQZ_=g!`+GC(66&9pM>yqgIgZpxOBwxj7^V?4q5H8_<W!
> z22y#YHJwW!k^F`71ey=nBQKZHG%;1UX9v}f3|{v}+S56ed)9uLi-M?wcFdH>bPDx5
> zK<<4>8vO}K5YE00vnUCwxpWdT6E6Px2D4VhN$bIit~CLPPW*)Qh^%vBHK at pPUJrc3
> z{2Oyq-8X<yhd?Nla}z0*R$ga at y9OAU-E0}4>cImk at N5oZ8SycaJeUxySzij7UBYdD
> zqoWH?9c<NNlGbP(f1VlPrGLp?Cb^?g8K+zpT0giHUiX3E`WwxSkY)z4QfU4gy*u}W
> zH at 2*n#0;*?)m;Kqn2x4U*;>EFH>z97kK^PtLfkAAxasgoT8J)XHfVPQH<hZ<awg!)
> zd0(2uiH`>N_rBzt>EiHTr7N~qy6G4hh&8Xf=`D@`o+juG3?SL9#$@0Hv=I|ZmXg<*
> z*S>7yn-Uf$h5;6+MqM4Wy2(mR>h(sJ?fw^XX~y}z0lbIDCnAq=<t#{yH%<TRs{q6v
> zR)X>(?(F>1F}Qka%(HZ#;;T+5jK<4n=Z|MpO1=V<8_O_pm}>t#QaVuTb#txJ`<3u*
> zQ8x<Tcvx`lgzxwi4}*g2hL`9`b~EuGZ=(Y8+K6&(_(~y3HCQJps??r{C3<pOWsY1U
> zUCZ(h5bGj1EsOgEgsj$x!JF&xXt3o|{|;|POKPQ->MN6EddV(}xkGkQabiSU5-<1f
> za6qdPf%$sq&gp0j8bHPY5uNUnqi=((gI<gXRH0Ql|BgTvNRD!eou10h3e1^mh`)0h
> zq%H|MFV`3*gnrjmdztU97EgSid70}{TvS;Jxih?9vhjjX-I0D#eIulv0BTg$2)kaP
> z!)2ja!r at n_K~~c*TzZ8%6Vt_vGcYsVYV<|ol3x2S(lDytMKj}0b~(ipU9 at E^e7S~<
> zr(1>QT{La<#tTqfVyh0-Y1$*COdMu9qrhT>zFl-&I^Lx`Yp1-6HtIVRH at 8K~Y&Bpr
> zX6&Y!^eJKKZkjr(&r+;grcWcX@=OxjxS(-c<F_T(WlQH>UB6b?yPJ+3UW8M>jc)#@
> z)K4I7$?QN+TZJDXH%%6_uhQYST5*+HQptC_pXDDmYwK?7$m~>_ZhwAvQ5>ps^JzO@
> zIH}^sqn$6AqEWDsf6fr*ze<z!Xo;9lZN-L8l0e2w!+bMSi%XnYfuDq}uhNvnS5fiK
> zZ^avVczv-~uj1umoABwYbX5NGrb1*het5d+R>bcgmNwnS1CIRgM6J1Ll5Q8s$GeDH
> zhgSpBt@{LBBfWFZe2$QJn>V92x*y#Ko3{+P|Iz${QPUf0eg&RA&AZ^)+q at f|SDIfn
> zYOZk2jqp at 7zXnfLa}$LB()=d4BZS?JbPZi97+#~(=##?JuhEJ0k3!RHG at Gsw+Fzq%
> zl#*5P=?zWv*8B9_7N#iQOp=+hPa&OwP)YYQO+q!31{nwr>U~Ap8irPwsq>1NEFHf0
> zcAi2Ax9?7AtDqB*|Fn%Xe9t1qLii0CHWW5BQU9%5#px`|PN*AKkNTVX=eXshie!^|
> zVh%iq4QbUNya$kUfB5D;VfP+-`+d(cwLep|apS9B^epi3;7iB7OxYyQJ>X80+(n+U
> zA at _KXWyoFNnKk4d=P5<^wRtdi=lG|3MvET_MX%GJ=oBI64f<r}_jWm3F0Nqa$%K)~
> zl;}N{zy}akC+_gvBcgKc7SSjieS_AF at _SVFWy~XPpPar$@6%qxgPj at I;`fagvxWJ4
> zX>MXW?xuwa$`BfTBW&ACvxoOtflrgZIO?Xz9^uShnxEV5pDI}~C8nq|eg3JwqKYjn
> z#By;?+V+iAPnzv=lEJe5vjxN7>D+{?Hv_vLWZ~zx3Jrg!>5j!bWqJmT$k%K8t0e>J
> z7Yqwex1I#n?3Xo?q|$0!(q<i8+UmWGoa*5o`1PCQM}T2FqCs1tM|34x^_Y3u^=Dz=
> zd|)-JGbLRfg6JK>yRFE!`;c7;jloMlx6Q><2iUPf(LS1#g!+0nf8_JY1KqlKAH8Lq
> zO($m>p0kB6W*YO_tkx=;WBGkjhD!$FT4PL`)wJ$(YhWE4<5EG<3Bvw;bmDzddzlxo
> z{IWHLkhOYOR(T?kZsId8>Afs1ELH)#)Pm{;rbtVBkv*1}ch;%?eMe<gg_0>f#mpuy
> zGd*T$cb$;zVaB+hgbv9O-xVxx(z{a3rV-EYZG6iYUH4#R(JkH^IQje&7$fX`lg=rA
> z#-73yfz-;abZXc<YVAM$<50vt=ma7$**=ab#9sztR{F=G1=32DOoi)ZcqBgls$llO
> z9MtKHFeLoFxP`-Iw4F*|^TW1QUH)-A#gkBdKcQJRKDF;E at bzWkSQiJe0RDqOe*Ukj
> z_*7iHi$CDQbJ}Lpi)h%B5y{+^mQRIvGmy~u*Mzekn(UCOBvO at cNG8~!Pv83|X6$=I
> zYJwiZ2lTJ<b!aaXnLAMcc|{d?n?-~#>)n>nx7Qml at r+f-Lp<MZ)yiZy*6)Yx)V84Y
> zX9<hQ+Zp26{%q+cNcf6B&AaOC_m8uMe*b%0=&k99YLYU;fO>=Q%3JhS$7mqNPXz}1
> zU@=X*sSf}X4r~eoMV!o(Hvlu}#xMO<-j|BTl>5e*7Ut`GdA|khfv3b at q!K3c<VOBM
> zH}A?p4+`R6D2G5b28GxY1!1Em at 4bnGDPJe7e48fcz4!=P-TY6m$p3sZSo&MSU=dp1
> zrsKzJe4}<3bSOF#fj2II8nuJxcH-mX2~(pC9-8h`))q@{lJUJT<{jw6&tkXSy47yi
> zR(l#hI}WpvN&c=48X}9Y at kP31b|P!ueU~Zs<s554a<2dWz(&!)>zhgt#8cV|jRD6_
> zXUDP5TR=+qdou}~Y)Pt9nMUmD199aO6knPN`s!5RKjEL*Osv|7c1V#6DGK6G`tR>|
> z;Ls~!US}#x!HZ8ijsfFbS+Z0{>&_!w`tlJc0p!mW7FKSZc8B;(#V!&8l+>12OC}?V
> zStMK3mn}ZSX^9rNrYv6X%ditt7FLbHn_VFV3?N9Q6Q9x66Kj79%eoeCBQG9fStCL0
> zBrkqkl)g>IfZMaDLdHcl^3`tf8KGi7O&@*-9 at 5py$u!(%?vOEWXMyRB!a`xgep=$#
> zo>z41NZB<4(pRx;Jd3fBe<k)G>o4w*;j*FAY}Jx2fw>k1w~VVIvny&y=zGn8Dt{F!
> z)i*qC)oS#n+=i`EpJv}kFL*jWCH1tVb9}fvS5*`}vXulbq1J@%9!-{^yu7?nnENgr
> zMjgTv?^3G_+Vu9j^u^!bRUs!bFRtK!D>Qr*YZ`UBJv=k`Tm7?5QU7i=jXKkZA^zFW
> zi<H-QIn7$LTCClq(xxzFU>_RvbAN{_T4Jq-YGDinY9Qo5zY~Z+3QQNHpeoM+5R!fc
> zu1*hv?Kmb2)(|~g!BW7D+3WhNVQk7Ic;)bVeg;~#z+ra%XUtxt-6jK}k%K%gj<Asd
> z737Q1{*guQFBW+_iJEdApng#Xw5k?Z+kKEGCeVs|*X~M~n8M|1h0=pGI#VUq2KHej
> zX19^8t095em~7v<bB*^Nz|9KdiqB$&zZ|4_j=~IYL=o903rvs^Vs9@*H-g-<nac=F
> zn9_DG$2>ZN#M=ps2dB%<5l+$q8IGagi-gc>DI_MaF>unnY^&QHZC_UHsiRHNjYibI
> z*mq~etE9iOiA7)vcMQbD;BCdIC=^IkiPLz!Jr<ZHdEgnG`nKK|m at 7<frX%A&)A&@I
> za>xTr*--jbv@!X!C}B}E9UE&c(#ObH3r9(`bb7+wOmin4)yJ}k14>lsl6X}o+E(g7
> zXl>}kqo%BZ&JR-3d8Y{3N6W-??s*a|W;7h4*&_;=ns?f0(>mVCO7v4$ti&eJ*LDl$
> zLsVC&umg8_AImnR at 3Ns%f5S3K at W)z?^^<|&K0Gkjn`jG-YxBkj=86Wvb%;((oI7yU
> z4j=C5Ul)j0h-yDXlN|Xl=L2rV1lD4|G?rE-;f^mws316C*a%O;I~GAAJOR8)PS6P)
> za&ftg{Iv6(@`uPJ_rzMWg;YfyNU3W#tvjoQuY>sS%rMOUUAb5l``aOvPy|ED8y-?H
> zwF!^BN8>XA`=R90z-^N=G<v*>MBHwQI-4Y}w<nOQIxTQXcHob8yhq2`Ho7O2X#2_a
> zm`%gV<%H)`eYfvV0oMkW1<6Vw+w#G}!0i=x3>DY<AH at y(2OXO~|3-1Gb9jAVW6 at Hj
> zj7w+gj%l5<fK~8Z*VPs4z;E0Rn7ZU2FtTRjWXb8+Q+RigOHwKdd?4<)Dby~7+5;wW
> z{Y{}&E{Zi{8~n2a-`W?FW;|xWQ~{6pIj-GTs;1zT^(&fb9c^}k>(7;B%D%AAw+H%|
> ziobR_OD4zSis8!*lA at +w{4o&GV3tC*ioXkoZPIo*8_WRRq`=HpCGMc3UZ}4<;BeD0
> z4SD%Nq5LpSO`jaTEAGWsri96{7+k)7CnAE|){)j}G>rvvvgt6bHx_0T5v43x2UuIB
> zlmVESQf83nXL`qQ9FetV8<X2+{F2j5EoAqy{Y1RFNeffjRt#;X!h$1oT*MxnP=9$-
> z*m7jxvcIE8XnM+nKDmvK{XJfv98{OfLYw!ix*}clfGViA(bU5YN9iMp at 9_F-Gn_C1
> z;TL(8z`c}+r-T(p=~!wKnvR0>^Oewklx9ZkvKKOKphf6EN at vK<<p`zk)4bb&qEVU5
> zt|w(;nwUkj#IDsb9iZqepN{2P^~J7{dZxlJ9Y|M#>4ewcr{iwb1-?S<K=-m>eW0r{
> zDRNu`$Lm{VT^bhA^+L}U at txpiJbcrm>q>mlT0+zl=Mnh_LX4ND&_ja3OGl0_EGyEw
> zNK5K}&nPVN(%TaUOG!NVz)hv>_tM<C4@#dL8;tf;dKzrx8GBG8w#LiZXuzxC;$H!K
> zh6lRro0+kJ^D2VTe(P?TPd=CiprPN7I^gE(_wwXGdRJ7_2vbyHnJ}S+=IGAlSoGX7
> z5+_>>-=2Zr9+)63X`zcIe5DFTUR_g1gKJAezh3SCA~1J9o=Vq-g at j+%wW<Si1G2!~
> zrrh0HU==R<?-!KEKtlQTiW6}Ycj&hLxqs)4`72N()*{wz+alqox!XAu@&bhDkz2uS
> zMb^?eyqSEgYK;Oevxk?7XPTK$;f)S(?=xTIdj!Vg{J@@u0(%^3wvjcj_q+S2O=&yb
> z-jP<T4>~K at Id)7s1oAhgD(~jfBr)a`%k_Y$wW-0QLK3!VlTq_obg;T|IgK#x{Vc}x
> z(zmTX1@|VCnO-`(+*tQn?C09|pJ&;osMGB>vhfF@{}>(R=mV$!(0w3-uXNG#)R=t5
> zVT=LyIOAw=X|6tXhy;>?wH}37Gg(gbL0YLQ(?EFLp^@S6x(~uJhoT_#uTt1F@!su)
> zqS0PRn%xV!YCW}L8juE+nB{(8$fpsr_NRB%I?x;F6tiHWYjzh8Me88(eM7z^@Kp}^
> zlEHUB`oOJ6jCLnur6_EQ_liam%h37`Ud+V0A}-49#6g0qJW6OLh{+I>7f31Bp|Lm!
> zS4a`U$PYlm8H_KyDSjv)(1P27;TFhAk!S+{r0}QWwXmWQU?1g~=H`O6;=O?{!Efx#
> z at Jwq+LO-OiibjrON~EZjOR0R5s)2-oDt1Cx8T1*a+OPJ>jhepE!qE?CcErSngT}JH
> z3BsihXnr~*>yjb457q$6?kv$On(V2uTRBw5Px~@Xd`sLU7(WC=_1?G=0*807mQTH=
> z^cM%_@)qD!=Lco`-6aGvli028akvgvrZuZdh-`tKMCkeQ_K0nJto8(#IaPOWLp at Au
> zt$s_Fe4w3jQW31dssnSmLiiSF!2U7N@;jj!&ayb at v$vGoT$u7V2^}BO-1J9-)q}O~
> ze;sOf4%J)+yg?@N2Ev4oXu2F*Kkp-&pJMor9P at wMR$=!?G}8f13d(-_nO*WhU>>4?
> zh06x95bqfmjfb=lR((_0eC)2PZy%a5h}rgCq-wHa0K20h?$bjLhvOjTVL$+gJ2V%<
> zj|7skBwSMv4sp#OKfA at ANK}Yx1DH0 at 5Mk-Zbjl=fU?)iR;t5J4Jat%mUlwFbsvs%B
> zO^W}Lx#MHt2Y#DbFJ;aUja?D;Op^28aI{-xzm?>fX_dM><K{SFK`Xt}aWB?0ISzQA
> zL}I*oSnyu4^U5kuiByeQss_;2GYzND&z}n_JS7%ljS8-k;!7buQ$pBi7U7xJT at 7g-
> z4Jx{2;WR$km7(UqkkAYc3A-YP*m)?tI}GqdQUMs12;GCv`O>pW>@+3=##=t2;~l^K
> z_$Q=RErq_k3wq(5p}tg*ry;Bo!j9b(wj2hVj!YXM7>Q&Bk{7BQA}@)AiCK`MbjZ(3
> z{^>)0mqQAeF%(cI`E8!suCTve^3NQK-y-?Thx}V5|6N1=?cnD~*-#VRfCR~HGmV<I
> zG8Y{R-7OlMqa>dLy-nbqI~2JWeA*$O2Yi)7zWo3N(lzL71|*@CNoDFoBfG-LdKi)Q
> zkn}m*tw=JZc-5hYF}_ZPu^^k}ptOdPn<b&hwaiRzAp-*2htMynt?~wyk24dux&a6Y
> z`KD75UT*d8u*QZqf!w8>a$;(;Fs6-W(x6~(qa)^gSGkzG667{%8d5qmomn7Lj-Pk6
> z&L!S&4jPF+R)c?&Cr^%#ADv at TzmnvOF{$14%?u{P at jk6dy`!(0iP^p=lltW%>EfA~
> z`X7bEZNS<W<{9%q)N0xJ{8d-SvHhgHTkRFko9oSLJLd at 1nxTDf>fU5(2;U#Bb-gyw
> z7p`>ytx~R3x|9_O4az2^M>#B_B4O}<OT@^C$D*1e9#-85t4LS^zNc;uaU at jy|M*|2
> z+MwF1Itl;PYLz-oJwa_z&sP86dGwK$kq<?N-MiI}{pzFYcJ*0xxB4$p{py&=$0A>c
> z$hRZkladrh&5PO;^`Av7iQX=Sxuf5UZjJtD^o8i|Xc8keC_bD*8DALxe>EZ|CMhO4
> zMjw;mh{=h`iz$dHjJZd9DGs9^i|-rAx-!0*6Aj*xl_YuuD&9yc4*%;@RH|Y*8-1a;
> z8Q8 at l?Z`;0{uZaSYSZbT2_hfWoC&Hr;>x>K{&0tFIE;Ev{@9h2$VSW4h=rTaHN}Ph
> zN3Q^9o#frkZRKG8Dzmfbvv%^Ad8U_uumABgS~x7<D!O%)rCSL{nv%uCO}FsQK$TE*
> zl8$v;<8#?`T+yqahr4jh%pM6$`aFiM=Jm|VQ}$p_ZD3N5qRuJkD at zqueM-q-PBE(r
> zOp?-1w~;SzmqH%lWe}!kkFa81F1e&L%k_VeTp*j&|4DLzP+Pwg2;j^1TOA?c{7ITX
> zi-jvE>4c1YtADEa=^8We1q%Kg$VOEt!n);Q;Nh}$`{zR0=OCV;b>}Ipge^i*I@^T|
> zZxKl%-VrC`nhBr2r+QBfh+z)titG$N9o^WLPe=Py%~agE=h&X(*p9mQS=OMSy>6zz
> z0(vABdqnD~UPGKE375S-874jhqC}Nf3k-5hz|pl!xbQiRbJU|!h>f)M@<bcU=6UYn
> zNnkTc0oOioEkJQ?`~Qm1RBR at pozp&4l&C@>vEWR~P-91W?!$x3Yj@*SM}=mr_ at oA{
> zK3p?HsmJk+jcz;YQ}D8D8PME^#An=7K|~pb&2a>)A=|@&+YYHGkE_$a7x|B<!<r*#
> zpM$h7mrU at I_FR_56LBtomX}>!1C7iGI9PTgHaAoIH<pF+*QQFIV$6*&w0OViZiK;=
> zWPgQe9SBX_NEvhkiA4RWKLi|HJ)z$#Q0ej!p}(Du%1wn&0S5eu*#PM+mffxl(;esC
> zX4*t9^I8YnB-w8&@hk+9%lrj&->iY;6_)|v=F}!qH-kNjA;KPbXG0-V(D(inmd$Jk
> zgO;okExm5nZrlcbMW9^@R|eXPxGWjM;{O8_0Nu~Og-%UF*z$T_-nB*uYGZ|eegWP0
> zA%5ZI3o!AN+Csgf0oSu_p+19z1!FJ+A|Icw(~=k|<>yk&xS<%mR!de$hQuY4$(P^1
> zkyG*?^j9=2g;I-c^v}0TZX&rShRc~ZlyH~7Lg*8%^Di at Y)g>B$Az2n84bSbhO0oI=
> z3an1MltlU~IxdxWD}RsvJ;%Y<*D1fI3cAqWrE0Q<Qwm4F1WwW#I4NBCk`||L^H;q2
> z1;zwULPIt7 at s7TRGaV0=Usm*1=0rh<DlQ78r|2yS(K~MM;5w6l=1iD(m0yml*TP>;
> z(TU@~#Zq-k$w>H(!nLZJO+g+IOWw_iYy1@@vA at 1!Co;V&!WuWid|oeFg at 2!dPCi+_
> znQ#Zr`DA-O=~b0zfw9)E)}PP37!f#$EUb>OXn#c at ->zRf?)<ci%0W*4Yo%xilmS#B
> zwnWQ)VArpka(-H8glMp9*O>>y<?VL8D|CKZdADK}#;hUX7$_SLwLsa9A-H7%1ipk0
> zFj^AoqF}s at 1;}+m#>WP}D`qIA(O>b_KBP3)%>Jp1cC%Q~w%Njscg|p0ERwgPJ^Kod
> z#X`tkMW_fj5E{;3>9V5j=n|hCSHH{En~Bm>iu{Cd{eM8btPH0 at I3f(I{Wrs~<9ldN
> z(m?#Ef%a(!TD27X=fSTUh#w99 at 4!!Rb#bIj_awQc{3-5dp6DnUwcQBMkx>5Me^dSi
> z2MEiZSb$Yara>WENoxk4Vllim{tC0)3+zn8Us#DP6#U~5NLHW=tBHS-ST+UWITecg
> zUns3*pgH=RQshc0#)NanFC}BcP3PX&<M;wsIc%i$Gw41QA?G8?FLQ1Q659d)gM0*3
> z8;PUdbpg*907n?pR%RMin1^fCO&aJ at HT<NjWPAI=gSEHMUx5owy%z`GC;b%$d47gh
> zjUQ8~k}0iI2?>3F)fH6TW=$tpY^m9<k_|3_e=X-NAT<?h_3R;B%<2yKD^T~oyD?ng
> zPyZG^{U`LD2PEm{Ry}Uc+DL7NZxm7%p)SamZz2k$Pg|er;`m}I^mX3Mr?H37{bKYr
> z1+Q;t7T1(-4*kn8%aT-9f#Hs|c&`yqxsbTV^t>fW0$}|}8H><9&0J9Z%O-X4r=o%A
> zSQRU2Bn}%nndq;8 at hL0smiG_z%)&5i<vj!bhoKJ>yy}j02ot5g(URd1K5wWmT{l24
> z{|fv6$H%U!YW2Fmv0>#;$=jLIbB~Rzye~M+E5|T<3L70922<KC;PAWz&IQ3?U8786
> zr);sm$?}Ro+LL$;*%_Lze(Q2N%pfm={91H|&Y?$zx-&G}F_%x}IdQH at EpWEbvx}j`
> z6wg|Z!A6~Oqyd3 at oCL=!y!CuBOr7<?bnz1jaaH~@fdJT3g4OWM3Cs)Dc$Ro}u}6Bj
> zgDJSrupCc?kmY}coZfPdpy}=i5$lVP>Pv$93V;T%EYEt+7gEwEAUKa at cSm22gUB?m
> zCZHDoBG&s;e-l2euBGhZP{%+Ku{RfsG(<QFpV|DmvSg|3F8i{z^L&bur9h;Xtuq5P
> z0A}camg5#BZ~zb5$ln}${T0`8uCKsVE at O=Sm7oeR at GePf6o`^hV}IpZj)miw9XN~W
> z(2u at 7Ex+*{`;G7TZ+sv8#`hsKu%O{t8{Kf!U-3Q+dqMv-&C+iVqQZkt55fZxKk`JO
> z&fv-F at 6+OASyFko>^Wi4*K{;4rLOv#j+->Qmt#4e32d5wc8|g{i*Yux#au3zP4~>O
> zkw=z-%i_7uMx1frx)Tw`c?-CTgiBx35yR6wUj$lqM?lFLTW{w}?1Z{JcZqih$^W9c
> z>UQW>1z#L!7s~%d(`l*j)W7IdI$t>OFZ!qavz{5qg)aJzjAPHk^uLMR&9;yS*ye*%
> z0Qe;EgXca^1OI1C!zK#zzM-j#CyjeQixpOWLk*7eO`;o^3{{xP*sb(Mnxf9TrLY0U
> zV|N7K;`t65RtijL$$@VXBkIqyY|p-Hz{9n^386b><5(PO(1&C9%;h(-Mqn}Z{0#KJ
> z at gTCV$X@;99*N<75JO*!2e+dHolU<-9pQIvribEdnmL!6=w<I7`|XbIur*`sTdJFx
> zx<sokn5X3 at n{MBA#%fM}Qp{m$Sqh6Y<$}K;`6=A#4Fq`ao>lxbqv4YhKrU?3-S`F&
> z((v0xUe88!bD;D2zxyj{Q%%+JHE-6ktX~tbrA-R}jH$8*;JdO|iRZh65?@vS2!1Jk
> zC4{1ye<P&)7LaF!v~qm1NSmbknBz(FYJUY!@%i0!Q&hgWD43)&y=bYw=g*8 at 0|v9`
> z>8&b%aglE8y#$8K)8<4 at QcL$&ls`r4!wgN}q*EVeXoO$>{wZ|79+=`Z&k|tb))(ov
> z$(S-t3n&))VG>r)D_Rt&%C|kvUjfe;f&H7NqEYQ?S*7dEIHqK|Y=(L2SzudV;k<Ti
> z1L}AP^?r-bR_R(3FPvdxaHko7;{>AVfiIN&lJ5uKq at f)9Sq|hG*RV7!r0lZ$a*_SH
> z7$X^=tuGB-E0Fw3p4>7JFcLVUiSw>9Yf(hC4COIhPbj1liod10$0<)rLqA{d|8^7U
> zziUccVFoWRxh`8V at 2YF1f1D}mTu$>UU<xXL2JEaQCZ{FIO2e}eNK;<K4Bi4$!b2cW
> zt+LvQ<G{Bza{PnZRNlfKLO)x at a-r*B>NtK#@P13j+*4R)m$S3YHFmkPy}7n_>J{Ep
> zQ#f+~t5)KLf_NMD?i{OG_42{#x?PNlIn7FlA3sl9Ee7r$igk-Q(4OIkl+eLe!F-lZ
> zN(89+t#2OZQ?G$o^zJ`A3Yb~lLfu*5>8=Mk4?mAMLP1`V{;Jq28#$!I=?vOdGhl at 1
> zM;xU!FH3_2kZ|=%NxzdYBS>tL7`OUQD3{<!wh{%rkH_*}m=K8$^R4AmSqa8Ee!VeG
> zhD*-#{U{!QB0xT>StWWtLAy`H0o(wDV%Q3CX{#bUOFOy*`#Cyd3d(--(Vh#?+}mNg
> z%7Awff7Yos?_vooQrvPt&Ajn$5-BMeWZ<VaP28^zTNi$JjL>wBrssA8<4)@D_&lMR
> zxTg{`dAzZW*vVrDLLhtmiBAnWSuw(@evHs_j%Fu9&cDt=<<s3VPq}9e|7Y;qgo5)l
> zKdue6DeBH$TfiO^`fTLDabd}MdW&OeSoXG&RT~DRRrvm6TP0UIBIvPA;!c!OYbM#q
> zv&Z|}`irNu<>#Q<MvK-vJTS&@C32GIx4w2P{BE3%1Krv0lX)Y^LXtOlVJm9^i8c?!
> z$l|)xrsB$aWu)6umnuYlM`Ikgjg>?Kb3Z8pW>!V-L=NH74@}=WNfN^q-ifHC;ofxK
> ze9>@()a^XNq|HHjGd&ZJczgh6_bX12oNqNP%+EZ^a9;9`2yn(F_E&s~*bheIXR(%v
> zs%3V{26m}09r39!Ch#DiJ+OI=dNpWCq%hA|X5V>;V`sTdgqFw4hkp+er(7o-{f^#}
> zDJQd-xzaAvR?bs^5F@)(X~#Wn*%c_;3Sv_yxPuKBXiC(QYn=aqptD>i`?oOW0-ZVW
> zh04Wgxc#lHtV+i$>rvaY^Iy`k->B2A7M*JuF8`THCfQHiGXhD0MB()dK!_f%T%3m)
> ze>eX!$uIAwzpJboiv>I&EdZn-cQddA0B_G)V3#7%Z6?*+Ar6?=_&{Ri;&qrq0VULR
> zrc^HeBbN6I_?C9YR4$%?z8@;9p1?GPxRYxO1s=s*E(meR(kd6P#UufU&a7PgJSH0r
> znKyNgtE}2Mt+J{fLz1NLS%m6wrm^rn8El#94)~r2UnTC@`;|^vASqY_?TP2)L>owQ
> z>cO21?va6{D{|K-!dqs!j5OVjI)0r~p|<YI#rv>Uho^FJ03Bjw)n0sGz)fVHHkJXa
> z6AUDxIq5oCAThkakwID`0vn68Su%Ij?lNDbr&Jo#&CQA~m5VmlHWUZm4J2BqKB{$?
> zA)&DBlc<2B5w{?fF!QCk<-QTk#24);g*-dLdCbkVzF332aAqslOx-dc-uwka!?Ceh
> zDHXY@>2_pU2fARiXDzP6Kr=Uo3xr;DbpTHa9 at KwuD*}mbE|6%|;%YB|2{<UzSOAkV
> zlK at CSn&dbV6-Z)UPRC^XRe_{!1<(^LH at 4C>2EYE^N|uA`At$hSju3Sq at fx5?Gh_p>
> zCSs^KwSz0aOf4I@^D20o4slk!VECR6cNn1n!~7nS31~E?yoN+U6e07)cLS&FTGnhM
> zf3{!&_C%5cqoUAUpeK`4T|~@+eDP8h34z47)}o{egl4K}<BFX#7I7qYlMG0!)t^yO
> zNMeiR8WKn}KG9a%Ot698S<()8T$U`Ugvi_X at 3a$DsJrI80(Z?iIpoBJZ@#BvGS1f9
> z=%z=VBq$f(!XCVl8q(gBGTTvXn0WSiNDN|>li-5cCnMpj{GAbID;H_EI5r7-AUe)X
> z?Ski{NNKA|S}PZ?;$~GSVh`S;<tpDyqJNvKK_5tD0MJA78&!*MVdWR)Oy-kg12`><
> z7A|~GQ?L==p0m;CFJlGe-DK846*KJ$k|UiaC5|P&=_r8urZN?97Tbesd?vH5RBh($
> zYI8=Bs^RX2luh?kYUL3o+snyC at k$w*WP{-b0_yfP!8J{{`{H33#F-1L)NcX%vAw|?
> z$)^O@;3l1PibJ^Ie%5ap<S({nu&i#i-x5^&qL><c(H8ptSz+5nS{(JRPS5VfX+T^e
> zbX=sPCk$t0OUZEecw1=r@*u@<R68F=d=cWmD^;8ZPozutknHr^>U91c{sqEqBAp=f
> zKOj6N(kaomcT=wdCVY^H16PCtBAuFO^hH8xcrHyn)TAmQCO}i;R`&12P5D*)z<ZTo
> z4$!3zm`;+IyOPL9p+Ph}<^b}uzF7@(TgrhcAPR?kNmioFX^*iIRo0n!v=|-whcEKb
> z8lMK|<G+scsid&hu!(@Sl76REtIR1QOoP|u!dr!>j{1QJ+!x;ulS5m{fSES}!#{4R
> zmt&Mq_sQW29N?B$1 at k33(oy(iE8aYJ%qy3U$Z4SP+f4GprD)%ya4Dqw%aE%Y<*LFb
> zG4=d<AW}bjlS;IzbU>3<5A~-8zVA?U!tCBy0)t>VkOrQq`_z~sAO<1cr?^KlgB|kV
> zZFJ1*O><A><IGw;%dneS#<kMDJ29gmUZUe?-qYVwqF3w<l(4F at ICCuOev|u6cl}h@
> z7khqJXA)ivAKQ<b<WkHlC1$;4o`q|&*j*V7s-oFCQWH9*z*N)w0#(A|A87JoV6RCM
> zX$3ySG{RC}M7FBny#?O`C-I|!k;PSAT4%vGY9!Y!_l*Fu at k&Vnls}$tvJ|pqe6i~x
> zhIbOvx|grTneOP&ghPLoyB>nD1Hz>rXj(kiL}Cbc-rHG%`I#}0Ea-ovNd~T|Y^m2^
> zh$>_tQ%5nQB|)`}aV`ZAr9A&^UphNnYi8#yb5zSrW2PP!7X3&|WE~n|-;Z>B#P^f4
> zw`7Rl3mrew>`7;Uv4iqqG(IlXFeZ at 9Gg83vBuI_=sn8-*Wti^!sj!GK;>;{_dhLcg
> z3YlR2iRMq7?JK(ew7!c_^Q|1wk7wi0{;@N{H3k|netR71VL_4iTPBc<nzdNCX)QEm
> z_fOO=yO1ng`H4;pHzi;a3W79Sz0JR)qyReWbD=6o7Znt;d4!DisYJe4CayiB0`y_x
> zsR6`d2<)0ra1~M*V9l}QD?wT&!=`mny}l6l<Q&=<5 at F{;p$1ZG4)Rtlv?h_uFpd4G
> zP~f|$E&4D}O;iM%Z&L3r6u$1F=G(ZYqD+o-aY3%p)<^;$0v9!=alvc%o8xP_^Jy0|
> zczw6(@*2F!1cn2<ti}_%P^rC}-j`6#TF`Prt43 at N59ZyAg`?f{QCcVDT&831{=6*J
> zt1|0V>V}Oc<P}<WPCCS34e};+<C(y1LGCT(&f}BQG<v)Pw(+3&UBiZk`d|&IA&T8k
> z9*Y5z(=3(Rjz^NA(pN6i$D?g#H&FyOkOWpI{veF(p at p*Dor1jwsJ;&Gb|sPa&A@`G
> z@}qcyYarNMTn7P)z7q)KB)kH6&RlRAb{7U~dll$AGr92@`z|)4LE|0OQ2xmX=_0&H
> z(}-8gc#A)snXx4&6xfzm?Y<Q0z1TG3HO_D0-ed}2R`~m8KrkN;9xA|%1+?n^AKKmp
> zE~;wnA76XTFwDRp!$k!}nc<EXE-H$~83x3WQ9?2^&SXkzre=kg%F3EOxHUBL9^1?e
> zJBH*-hDAu`TZ5WX$IMghj&__5nGx>kbOt1yXb$s#*4ldzsQ3N<{-4k9|KY>zwZ6}@
> zp7pHzv-VyWe+IpANTP!>d-|}G5+*1LYVN*=4YDw=e8-!9VWJ8)FO}D7Ke}+~N+eoJ
> z*0QreZXn3LLgj|^$!J3nC<w)qySPC1{WN~yt3~|&UzpVqpVdyTRysxs!TtcXN?w1H
> zi5fkLWoKG^z0dmV8HZ}0tS)L%xs^1>=ig)!nQ{Dvo6M+(7J#@mm`0aYwLlbettn)4
> zv3Hz6mK4|38jCS16hCytk|~3;NNlp8U5i?kho2Q2{-!0bN at VPw)<D3 at FDYSmv<+&z
> zUmv#iS>X##B{o#wV#ZEw;8YuZ&Z26zlOdP3RZbSmtC(tZHBj7k{VJ>Sp7Q1&+{o!&
> zU+`yKThHB=a)@7gi%GP6=!m<m#?D_sjmHP7vGd=c#^Zfz1ou<pac90Owdy+|nJB}5
> z0ovFGY4iMNvNkHJO(19kb1ia!DBFU{nZ{3))^bI(kRcv&-s9B6P)W8~qis8dAQ?fb
> zUnQ5L+kzf6wMGeP@^QKEk>f|rdUA}Zy-8_6kCH=8Y%t`F-~z~2Yzx|6Bt(G45Z(H@
> zpA~x98Eyu~lVuQKg));}Zb3_H&#FnJ4-OTGGG0OS9`x$zo(po?>CPU7?BXRX9NEc@
> z9S))fm}GU1SlLzU7}{vllV~EtQ0*rHvg>eD8wm!H))8cz0kAq<8Cp-w1mRmQm!P^Z
> zyo)m!!}6p3hpc*Q$kDC-qk-x1 at HHeSpdW#J!htlO#yA3nZhuZGJZ5C`pVu0pl22*n
> z&!+k{Z4c at ow~elEjcroN*kOmF$sq&~Ut}4om7j<GA&4^c*6lhvw_eY+kPAb|_habg
> zMnmPQ@#e8DgbNDct(Ilxsd84GeSnH!QQeQh9rr0GqF~~mw+H!@<*4>~w&WnIE8d0D
> z&y6R2uxJx`KCOotX}jYF(>iR<X%y(!NWe{3sHhTj_ at 4@*TO(PvZD0c-^G0rbzVS!l
> z3o9EmoJ0N66w&1Pe at h9B{{9$TFj<`r{YuO+yH5Pku4h%^hDJk^zK57+mwFhJ4Kfr(
> z<Zx|}=!@*RKP>qF59Mw_H~%htD`i^6p_b78$LdlP;WvO%Yw>;fFfD%@!aE(&)Tzh2
> ztSO9^vg#>oHJ6GF%q$`BQ?-0rZ#B6G{jnS5lpTufU>dD^6+@}J44MsjmNQM{f^7Z*
> z*b^TRTjU&OQ^9 at 8>mV(LoN#K7C%1i&o8b9jUa;e&T{@oPemip at tH^7WpMJi*Ly7F{
> zVhU at rT4#uc*6HHv);#NahH9p(!8_PMAwW*<4vTN6MSP4^NjsR<t at O5dhTh&!<caRT
> zgNVGKoe2 at 002A^&2yFImLfYu-w*@KCzbmT`g}}m(-WG(wa9nz*a$8<|LB|qu<E`1P
> znN)gfTU2&(B{Fs9(91rR3D4EkY9;mT^|e{D>#f?!#AO3#qcF23h<KnLJz6_SW_YiU
> zwW)TJRqdNBH`+HHT6!P^<>3PSJVGL8keWR69v3gWn!GHvGifC#Ma+5U^!@7w_ygw(
> z8VmXv at s0ms5^ZxE6fj9N-GIsSl5n=|tdd+W2bQ;ri|b;z$H+Uq>whyYnN-Cg6N*uJ
> zo4gnXfrL)GEU&&K0+~SmHRoJ^cM6(E^=Yo|uelKDKl>Scv^O-9grFtJ#3Ac)Ced at 4
> zDB~CHVcE@`36x0U0zi#z9NFB3c8vt((&0JWld5}+4Y8mj@%({as8|r<e$K>JaF4;D
> zLqa?(h1lug^yKZp&TewTn*}Yt9|oXq=`~wJ3(IbVN#UEfIL31y{4em_?^#H$4f7(o
> zqSsU1#(3ro&@F}dNCwfECWG4s9yW=*hP<9GM|_f_r)lkMhWb99Re91p=`egBGd_?X
> z?PWd5<gKV*Al-pUlsAC-L}Um#;~pZYAg?g5t7M70<)mzvlJbCu_!b+;FJ3&HZ}u^%
> zi!y3gA8I0-<7-wU#6}|>8zuhBKjL^<+TIP&{`E|Xmmwn=m!~sS?5u5txycOO1YGTa
> zL4npM2Je#kbRF~;wQ9D-;#>XtOC~&Y{9EKA8?r;c at 67om2&E=F+q^3;XrLA{zwSCq
> zmg>OZ^il<WB4rZCnaIu}DSGBDb2%h at t$lBC9Af9~U>&Rj`tcm+0$$JHROUQCi^1v4
> zXZ+I)j%TLv2N-P7{7W7nKIdB*JgU!of&ZDov9|r>JpwroNwl~Md!RRjmZ{qk$C;e*
> z(k^p3tM?Y at 86ABM3>}nz%u@!@cg4(>D#-MBc)kP$as|Q}lqRG(52L1Fs<}4rt_t*V
> zpt%I1U1NWXzi{ps*6~I%`#PJ)>1`&aS)+?U>*s~lpz35kv_;)Fo{`|A9cnNKL!hTi
> zv>=yCh~9JGuE{L{bdPqF5N<7G=;;-YzX9gQU;A=(h~o^WCAs?Bc(>inkX80K>}i?#
> znkJZ+rp1qsJe{64 at hy`zo3V|{$^81@>6BAY;r_LeGnouX1ry*i?aJ%n{lt+=4FUaB
> zLv}22n7S20$f+R03kpIJ_8^O|=cd;V+&{Cb#$0lUpYJ&`;FIP2O|f#jc&pRSSMv>L
> z135)wuEl5TaW=&YL2ib4dPlG-nEd#9Cp7)DG1hAb;VrH5xWY8Z_qxNx#F61e2RHf)
> zhV&&aW4l>=@p>}ZPALz2%dAnDoJ4OrxVk{+^IcYODRrx5+6pk7hmtC#oMJ%B3&J+n
> zT#f4pkw?zu{)^km&KxL$%k&6_qK%y0V8?b7r*BZZ-seq9d<V0W-=M at B@MbOFqr`jg
> z=0p6B0BmRO;KNmTpZa-+wBzr1qY6W#sJz6V4a76<v_gYjTr!7cU>^8{c*f=TWAH!i
> z_k;Tx at eH5}mlcJw7{#)T37OQckHH0XwKo)=3RfXts>Yd20>4!a!*C^Euf}_W?%Ys7
> zPCXy7Y#d*#fhry^CfE(^_eDCB(yAX4D0<mc*FRW>v{7lXx&;kA&>nFebIeP2zJV;D
> zCp-JOD&w at -`#FVi#GOmonfViSYdz0dP|**LAmg-IUZ at ZwX76EVnlksAJZtD1h8?DO
> zP+h|&a}R*xf$ZxRWLel6#s8$i6AhpQds<dOC3<BA$f6$fJW*gKZwkUg1HGKuIAYdG
> zenAj6r2mnkql<Q%0yvmo2+B?0e~vd at HQq642T^85H(wuwW10EK&j;bLOn~M+i}*C}
> z4aS90FP3Icse*y_ByxtThYTB?G;R{=ak$*PE(DKa-2Bs8oCtkKjTV<iZPWhmylEl*
> zcpd*c at 6~?1+t>Z?ywyYeypwqM5Ij6!a_KEr&uc^RB7j$g;yEMNyNt(9<;1MGN)8|B
> zw3}*7YR*ye8mkna;J*&VV^iO2)aUEE)lGW(R?H-Ambo5MpbLG)s5$Hr$A}A^_YoIA
> zMu(G!J_~ll>t?myRe}@+rm_*JQ6)ahFVo=<n9IlG!f+RZcSP~SBJf?zY<_tJo)cTe
> zem~8iMP!MbG4=2s;x2icRZmMKTVN0G=f94?j|7nUcKz|fNF2d19KT>FB<~Ra^iVv~
> zcE*|C6HTUX$_TdDsHtl+KjcWhjiE53=1t{oKQkTt`hNZb at SFPiXMlfsKff9LJNo%&
> zg5Po5Z(|ApaQ9=d7&S+t`uS&pzp$TwHu%@~^A~}?hFs<cGc-d_G?|AUX?5nCpEMzf
> zr{+08E;;j|T-I)MNEn;c2#Or(t_o{$=3AGmZ+UCl13T1^VGjP#Fl at M2=?EepT<&jk
> zsEnF-&u61ijG)Ltm#@`l&;!Kjc at mc1TZhewr?#6XDLP6F0jEncE4EvDZ-#+!k%NHx
> z%V^*zuVxP9n{*XQ=qvxl#|(#du#hhtjwg?P*OQj_?yqT?@AjmHz581l^R8D2fqC3e
> zZW%=R6~7;NM%@3btjM3KA~oC?u|`mUYY+d^a6CS`%NVr%n)u|j_{aqDNj6DbDLx7R
> z8^w;}6Qb}`hUwu~MdPO;#x^me{<SMQCU{Lf(1|QR#CxLgKbc*}FO9%U80e;QVsP^C
> zeZUjf5z(&f2m`ArgSqJX;1#v_D*tp0w1jlN26%?13#yhNYZMa()wCO`X@(Fert?>T
> z6rC;vwrGJAC7zLq*@A}41#-+NoCV}zo{?g at ptI^2Z40^cHPIaF&J`>9m7~B4fY4^0
> z%?I8cqac^k`IDo-V$ktzqww8^6fjNavELh4{MQEO+y+Mc*xp9pOn%I!LxMjRSMu{l
> zL$BM&Zyt at e1WbX3n!-oM;y(vBvJMDZ!^S%2^6O)9Vnn)YO-TlG?XbFXannY<iAB)h
> z8)EUxp(h2!GQ^;d72>l37Qf_6_4pnTcvO!c2wX)hZ_&;VGvEYOMG;*`X)@qqRYeVT
> z?=j$qnV#x6{EOyUL8(M+hxq03-Z*?O!?g4B6Yv&hAK#XMr{8%<iSRk69?U9qG*Ws~
> z?pgvBMwhY7X)V!h+QBaF32-J5JBQ#-Yrbx&+K<6#ScLL|FN3L9RGRt1CB8fnkDq>t
> zyiRFXU6&4<E7GACE|IRrPE6b)R2F;*478%swJ%&UDfXI5b|9ry=L<Ppa5=~m>gV9w
> z5^?Oz%k8QT6&<XJkjvy2P%l%9$W~QHG+0){tm+{FU~$h7bmFvMx3)qrhU<))qgDQ1
> z>}VB1cykht)2_%-zRqe{*0|+umS2~IpSriep_A+e#W+W>>?&$inIEhFyktq}c^Fbw
> z)t at g}qCNk05Ey=E$<4fAn$K~@=RCTvfMgh?3QW5Kq(fxTD$pU;wZv)V3zBiBf;iSE
> z<EioBfa$<uXrT$@MhS1e+iujnJ<lE|o^8NnmDJzs`LB|3UKr%AaxPxYk at Y8wor$g`
> zd{PR2oLRu{Pr)OZ<$QAr9v=(RI3=6Z#Wb9DCb$*4P&V8?#<fIEzH30?@XA!2nELbC
> zOuOD%rW|cuF6U1a*_8`Mla6g`jX+9P;n3u0KTGB3rsC-{h=wg(A)CsTk&|ql2_zL@
> zw5Il$xH4w~Jqaa*(;qE|3V at teute45@N*Vu+;?xgC6xar6_321I)P+j%XDjz8W;kP
> zX1IQjs{atx{2?0TNBOy9 at Wj~GO=D_TUrp|a0#NC+*1luPWf9TYE#<(WF?dQ?w{9b1
> zYBR5DI<&yX0Q}P!yn<2k^T*=t0TLpP#iMLXTqm5?9>#U8_ML`PH#dXC1Tdx45a_$w
> za`6=81JcE^A&}2HDEmULOlM<5{dok4nJeSe#K#4a*xALdV)3Jf>A)4ksVEMLH_RZ(
> zp+5CMuG0U3P4j;wEa-pc;=dh-r-!|5L79KCpp2iqXNYnB at K5}N@%Y~1s>rul1<X at o
> zUBw*ZI^kN<fZdxROwD*ah1M`I)w}Qwg)>378=<1ztk#XIhdI==cHac1yK~7m;RXyc
> zFzFS<ZqSQi7rQq#<ln3q>SM`~)^Zj#F7juQS&u<8m|i4Fhy_inbc`psl4#7P;rKf~
> z0&)0%6G(I;BAp4JAN8L0GOi^oO!3`zlH at czoLR@;Ov8Da4bu{Is4B<h<W1=~Z)7(c
> z<Jt;yjau;($7ToUP`BN+gtRvCBYuB6j%L2(o6_;0vVJ-jNY{TY0N$s`wS=sRoXE~5
> z-BA1|!ISK=K!z|!CqeB(C;&w|Qgc>8D at w`0aTuOO8F>77+Ii~ir1Pw3yWM%3%b?F&
> z5`2liLs=@#OYj-KHUno)y*9Yd3cKcvGcA3Eo2OtyO$vpQ7!!1Mn}<K<>LG$M2)+b@
> z>oV~~+ZnFN59BYYTx&P%pF|E>k?zmJXCnWCm?}ecVS5TFukBFk03&CG%5S;O$b28S
> zr*tT*3_$&uB_~0f+SSA~w8s(SFns-B6~os%;~-u#S1Q$2oZ-)A;#3>GxdBSV;k2S1
> z2(fz7Vn}PLg(mDe3Z;j|ZkPt<ab-6v2yQ{y$E12iR$=wzlX8VBxrA$T<&w77kViWL
> z8>@wXXq#MsYl*mNAO%pBgxdTti4g3Rz=6!bh;NJb3-!~)LrN3$zRKd=$l%H)M?tYG
> zbgxM~tVU|QPOB@|ACA>XJkEq3B%|>Z7Ghnwf1o*}l0?kwCgP#CJ}Dd`iSN at 7c~5x@
> zn#fld$arxZ%p(K1BKvf^(mB0&F{*P-ZM-htsF~RKQBk?0Z at WVgVl`U>3(6xZP31AS
> zc#nX&pQQ?>SYDT9Em0_~r2z(V!7=x5=o8f)Qzp2UKrLixN4prhS&h^jr~Kg1_?shX
> zXD|#w?_b3n%@ls%FHFQ^Y**FSgJAdwJ1_&xGJJFr7!8 at itel+BQckPM_h3&lc`w76
> zgcNep#|^s$rLU*wgcR4TMd{=^-CmRHTvIGO|7<srH|d?qM&euTlE%qd;wg3|X*2Ze
> zvak0P{R%zHqZPt|Bh|`IhdJ#K!T>N?_~-MsxY9b6WJ5u(O;Wbd=X>k;o=JEj!z|%j
> zvv4ZRExNLB8deqZag*^X^4u{Q&k400oeZ75?&uWKp2b7_&y#U_tVVp=ZRdiV2Cl7W
> zEgIs|D0TJ`<l8;eQ=suVQ}Afp!)msSHSH~^(jNVUbJT6Ms#pCcLLK%zPSdfBt}Yw`
> zmF9gmNiK>M=q%-TlpAM*+T~pV>@sq3=<(cJ^qr?`7H7CwLB7qB9Vrq*cB5E)xBf}B
> z7zr)LkOsZD(Y9};V?hmKdakD7<15I`<l=YjnvP7W!X%WyD$pbri{HsjysmPwYn$vo
> zQhkY~FNj at tcPlNvUuV#laAo+2{CrcQvE(Am2Pns++mUbkj`zHn at cG#U5)o*+z=G6D
> z3mWTz|2%V4##<#OE~Bx)9O at 1gGx!bJ*l>@fWKU(O>n!xCGYgR7j5FT6WFr<WRTlwE
> zqS$$|<Arc=c at l?YY$?u@^Ol_Pw_}IaamHJm``1Y|d{;J3q(^^@m<rSRS^TuAFm<Fl
> z^?oavsqA7lxknnA_2A26AK-$aj{AQ3v{mK$ahswYtW)wf!_ARB0`46p0k+O|ya`46
> z*f1&YLA}C;FG}W++YN60$*pdRb!(tz#7Wf1?JVxnLJ5ZaG6d at PP1ldv2c|=#P|<v5
> zD~<@E^7oVf`b5DQ1SN_<LqGA#U($|%L9xKq4ZjP;U-==^@Gu)b3LN1m9t{O_NrNCo
> z1IEYwx^#Ax1u5^75UBqP30K3HfUS``?>gg{ht- at mU(c?E8eQ16xhWQ&maagz-Cv$J
> z)ZLn2$khwbQhqT>??@}?cb`&&BE=f4W+G%^NBE=D at Yn#ZQ4bTPZ>Qnt=vh!-FXrt3
> zY|OOyJ<1X#s}wg(i{F7 at bk*H~hu`~_+zW-sUz^_A8bD7qD2Y7IFNfaf=-VY0G-+}(
> z>lkVAb$@GBGogONyIpf#?Ki!*G41N>3Jx{1QW5gc-GPS<Q>1{tcSGkf8&W>YwZx>`
> z0%jk7<PMxLuHsGkgVLKow_GLXaXr*iU>va`QnWWRc0*%Zji#~e#&(E(I^S~#P7Haw
> zE3{R%`e9-)E(gcjUUqNq3<Z;%tkuSBTfgcPM5_<jigF%ObC@)6$<NJ}1~+N=k}%0+
> z_G?weKwq?@Z>W9K9p;FHR1``jY4P3sgkvU20U-f}D3`T#2LgOuP*`i+>V}~fl=^i;
> z1pGc|K@&f9MD=Ojn}f$;T+fgD6CPp1^);(&-mxIX37K9Gk(42++RW_3B9N};7$DF0
> z`!+{WWWaS0H{pH<+D1S-?oiUzrVAQ|TTsZf8!9vhl$J8Vj26ML7X%%H0_+3QyV*!%
> zDYW>0d#Ha-aI>h9rf>&1qCSElz3LjtN$A%5a*<6Qn1kS_VW5sI^7l~?T`pt{ZG=4)
> zw{z0<BOQWNL`fsjQrkhkha^5$qC|{%)vYXIpFJd<U^$=zx!^UsH>2%r35R5xsgAEO
> z;<5La-l`xM0{ym$RdoiiGfQ&WG-&$ipv${#VC|aP2GAo7Nr=EELFT3blHMIiI-Osx
> z5-ZX5luH%)8mn-tIs>}`3NnzpTm6d$noc(#l#53}H<gl$?-;p_+|YfqLhkb8yOcKq
> zy93xdh}*zFmy63uvAT2duxwmkyaw&w6i-et at r>FO=NYnTj7R#&T25(|o6;yPbkq1k
> zgm(BTywQZCh?G(jj<>BSM9jF`87D>S-owR0*3D}Oa#w at -AMEDIHzAnYg|hcF%;N&d
> z$nURfttyecBq(?4=@%PwDN+^6Ul`vWD3?@ua)hL0r%MGG(-m|hxPOZvm%jP~@x$_P
> zzU_~r07Haa-U at AzM8qzZYZcQc>j*(gYHU6ZEqDVlR0$S}l*4tL-5=lgrt1cOLUeQ3
> zJG(j85=i6>I at 6YFs_ky*%fo54O!NnnzQq%f-Adsfzfa}&rs5mEX?=o0AgC+l>@KIY
> z*ZEGr!o&u4CTyY~{k{)`{`Jj{d}}46uqV;3L?1^#njL94PbQz79s2DI&~!>SM+Gc_
> z5u}b^pN~`KN)eG%$YaACwg{%ZyQnq$8e7nCmt;l0$OtE>A^)bZ*B#Il+gC4 at ovN<D
> z+x7A{#CPT6-HesrJRLv9SgQ;09n48SrvN|0^c-(4z>}G9Z(e&K>#*l{gqq!&sin7`
> zPvEf`$HlB7H~d}^l*O<6ZVE{zg&SofJ?^wOX<QoKWX3U(5{F4q2b3sGa4??A&A5K@
> zWL*w3In0z1!of2<$1piUFhE<5GmcrM%gzj7_6K=F_G_~lhN(&t!rK!%hQjFP=I74D
> zB{4HzY*kv<GmBvYgDt)p%N#wzeQu`p&*DO`-#(lPRscA}RAo6{*~t{3fEZ_-Io6je
> zR`#0nb**ZGbTQ6k>vB9<q at 3a}os7%jj9aEdj#3?K>LR`*v7Z!|!~AHd&ly*;B-Cfp
> zM`5$hje75OIfxu_Ky1Ot8ON6v;>3u`-XZyDof`53H^!MmxBI{x+EIw}rra_y%uuM%
> zLmQcbbmZ$D<~rHLG&1Il07q|9Z!C3B&><1{>_eNF8cjjQX(V3e)fSu>O2Il!O;AC`
> zuLR5iFyz)QbzM+Ru-UC(0eTdm;FA!6S_%K+E&hN7k7q9P=Ph_F#kGKI0mrj&Cg781
> z;dF}Y0M`NjC;)&Tn1x41+%hSsvf)6BFqdH+L~wo<o)UVw6ru4zhyg;3c<XrhY#gr&
> zyDVOe#Oy{TQ;}>g&9IA?j~CvB0~uxwUosbr at ijarJ(}l26l?g7xnP<191p)6Ynb4Z
> zbzwEp%TOS4o#d0|VMCx?IDGLu9Np)6w7+NDJUp_`)6k!CaULFepX_POg)(32jLX-p
> zQ#UT6?j-SdwDSLvR;okF!8G1<4<6bV+k$&=maQ+8YdB2Zb$a!#l*UEi?k7*8#Nd40
> zMRk9gtDMjZ9z#AtkHV$8Lx|GH^rzDr>Vq1p9!x7hOn1rcNQrkaS&I07rbYdZ#+S|a
> zClNdw=HqBv|4^QO5<P<?di=@QgZ_~29iXfCkEkS*TGa#T^ZPT%3jaZ1l1qO?!{~N6
> zaF6LL%a!-yWPkB-dP#qOR&yrmA5ba$baAtsx+HIlIRnpjeM2q?DGFnQU2BXZ9$hXB
> z0e28}so~dMU_eMv5*G}$$Y_0RefES3oNcPWm5X^@DSjj*r!JwJtI?YGW*}D%zqJ$^
> z%dX=emf}1H`jh!)J!<Q{w=S>7ZjN=6j}qZlJpPVDu4WiI^>~FF-`K>Z%eO3U5qJE;
> z5j8_msjdQXbHp9aRPk6hLyrg91v9ms&>=l-#Zz-LdWZSWHGOAJ$#|s^@4>sU35A}4
> zUaP_!nhU*FZ;~k^w4iA*&_^j5G;$e2>s=+}3;=UzDCyO at tk`1HD9b8Vf}N$WSm7GZ
> z8JuwivCy}fOLZ3!`171eW_3o4q*pgbsG*d)L)Hwa_C~!q1$67_ou99Rxt3lz6tVfb
> zuQZYHd{1wV^+1wMksS7Y-qdDZpYcLt@{NE!vvxt5Za)*$l>A<@IX0K%%9;D{me_&%
> z=m+Uz;ukK&!;;+C&4F#C^cOCdF7CL&-R6ClYRA_tz?ow=OZn~#6{V7J(2~eAr at N`j
> zy${vp9c0XqEYLuCKh7N5mvO%^;xQ at LA+u)PkMCkC`Th6fkxUQYd_P`s$M03OAs=Z0
> zL|M+%zYF0E{w_pH2)|$<zB_={0KRb{&XZecGZ~7QRis<npze~~sp23SX$s^!@bBrr
> z8w>~0Nc<*UopLa(00oip&m2QD;kiZF at PAz&_K);2hrw_>^Y_{WBXyrPNo6=bv<~X<
> zc4ZhEA=PZYv<w?!D{p_LY(z~=!%Ub6)&uq(%ybjP{ruiCd at u7X?=Hh5!^pSrDDU}}
> zOz(8yIxjxS$2@@JnM1tk0sJR;Jof<pf%!YXbTNL3xyAP^#>b=IYt%2(v4Nm_K$BjW
> zW{tvAy>Z6qx33-lbO|28*sAuL=2q1RLG)-qJqj>d%a;lY_~oqGOh7><B9~E=xfw3S
> zIHvp%$69>8550Ep%!3=z4it6)AG8}&8`KSjEcxEAw0}oFK~9UWMAMQh^*Q=WL&DS9
> z5x}9JW{5<`&X6?$;LA9c$5u>>(<<%5f0&kBm2jvnd<u&iO|lZB#FPBf58 at eNIn(r7
> zC3|RE9I&AJ6o4;2h-Zgpm;w+sl?*R1hk8jqj#-8cOa@=H49|HGY&=%uG?3*XVzz+A
> zsV);_tE!)WP9v(z?B`z%{t37JB?yfJWa0oM1CU9#k?MzF!2Q1#6M5&#G2T-!aVa=8
> z-HXZnA)*O5a;s7rUvE0t&p+<qU4H*03S=CdJAh%*!Mg|evk%Ve at 8>%n!lUwt<|;ZF
> zC9l8_K)mBmjr%{1mx?hj$FT}xPA^}Mr;?n&p={Lu-?>h92m+FI8xj8w{>irfEKCkS
> zQwAWQN~8j*2Veyh(+t20DHb#UE23EN0IY;!+CI!iz<Cr58NgUdu^|Jn1r!S%fR#~9
> zHvn5ov9JNya*Blyz*aRP8-Ni5z;enMIRINnv7rO7^%NU60NX&Z;R7(1Vo?Jyj$+Y(
> z*=~cC6dW;tv5I0N2VgrW7Bc|bL$Of<u)P!;JpkKJvDn)fAM-GdxA`mXsiu|z6?f+V
> zf5yRG1N at T??jGRJKDcLqKj+{}{rx36`=Nu?gOIv|d{c{U093Dh0I3JDH2|g=gf#*d
> zGze=3EO-!h5-{x`%mG+PA7+!lGXM at 5#Mla0=pgJoV7furMZm%aVP63jJ_x%6Si~Ug
> ziVeWXL0}tTLkD5k02?+4>i}%{AnYf=q6T4Zz at i6X-GGe%EVDo80dV9XMlWD7{V{&k
> zBiKMYu^o@#ITPPw;{=U0iU~IB0?JBs>|)n at os4s~GtO&=&e;wY>$b)`Gqi=?;be|1
> zUKXF_!ym<)hQ_BE@}oXglGEB@;0*p}Yg$Cx4!-_T92;75T~UD0m0gVMQzMgqkiYUM
> z&c>_j`C*UYVtrPM39)5h;K%ydqZLOBj?Or0KKi`#0A13OsolwQkKswStjOXC=uc!d
> zvKY_4E+%|3BInUpCtlJTgVyX|lRV?#>40YnJnMu6_`L)^gE45W8lI!T?-rsVgo=hh
> zfJMMF1D>Jqj1q$3w-9`4c&>-15}sxB4v)iRt%%u1=M}BmqA*7wr#Pwu!3E9(@C?q1
> zavtc1>d7uwKb}+cS%EYoY1LZ`aq!zZ;0z!tI}Z>Q$&J)Ub=E>fkc>MBzE({o5`P`#
> zbAzM-!4ZWEe-}K1;_Lf at M^S$n-&Kw$+g87()T1 at M^LJ$!!}5<Qb!g45N!5$M{SI|!
> zQ}?^nodd2$aNV~nt@<%z`04{ngdW)yW5lcXlU=u2k;W10VuV0Pu-~_KITtFZj3cw6
> zpy=V3tGO7|m{)bMadFKSetGYKx~*0G;ng^#w2y&YP4r3{1a<_SRT2S!gHVoK6}#Qb
> zvU<7z32E0_)jm~=qIQV$0NLfpmJwW!v}=k3(1hB`+L(R1oN at b?^V&7I3~L|fA6<i^
> zCTZ8np+colWK|T(ta_q&BC>k(j1#j$;9r}ju>5MzXY(A&w5J_~{E0O<A7_Q|y=!pH
> zh%9aKP!u32H=&J{E^Lg*ipo8m6>Z#@HG-eC7LUQ&C;76qcySb^#Ta*IjWVvy8qHUd
> zl~Fk{+wbDPS&L(ERtoP~i>EL(e8xJQgtgD|rSP<6WgoLwF(t3D>SL!N|FX$3L*#NH
> zFWEHo8e5hPgP<ccTUn)ZXtNdYt1)WwYqF76=TI(m+g|MmgpAAHM)E$}dy3phNAA_l
> z(U!bvRnt3fm(ZmXGdWg>6hF*~DS6WoVbv)DxH3<mCpbr;Ejd#CI8L!;jce0)C_u_M
> zeFDqqV_9{+t`en<%^Kg92Y5u*czry at wKAS2<7sKp`88>&`3DKU(CyoOJuvOJtn{{Y
> zN=;82nUzjkuR;6lzB~w{0j(X^RiO14a+7M-7_!kYH{!2ZI=g|aDMPxdolUvMr&l-d
> zCmx54f_%IBI4()hK4<bp26iY)4M=Y`0bjn>*1fT<k|MfI-x<4Bzsk>l0%zKu0Dv*+
> zgO!}3ndMM+{JtQlt*;ulu5J^O-HJAKM~FyxFy+C7-pm5kAw*GJL2+dteo at c@suZ7~
> zIMau_N%d1A#mH7=GfU>tIokcpt?D=>$@Y!p2u!z~Ro|$v`2Mp*PTA at kxL51Ke9DtJ
> znOV-4Jc*-cKH)kk1VW~KaGj`yFv?c!3o1~?&xll#mF8h#LMl+-lc)+mb)rNKj}t}!
> z^=<J9zTruH=ZueyBUU$OqkTc*6TZOg>HC5pcjMSoIpaPn=(M-zcPOD|o%6o#TFgTI
> z@&<a;@VlgwVFO)@!8M{OwlP;M=kwRY)agT>U5_JIX6fjS;Ca`z9F{h4Hmoy7H<Yon
> z$TnEz{b>_clkI;+IWhZ}qcZKzw4l|8p at Icjqewm|?|dJ%#}(gDTDB^h7KvA(Qh!Ra
> z$+QRQ4&=4RH7>fY(JR=%v=OV{;Ct8ODd`zLl_`HH7inVilzD7k&0LtXqW~_FVe at GI
> zBE>_{0`_K?jKTCc^rcVX)Ue9lAut3fl at m~&bk-_=;3;Tp8OOhV3J+sOtbQ%+&-smM
> zmi%|qrslr`mGv0JcK|fq&#RuniBnG+^YTA1X6BzT8uH(V{%!<}OrwoE^9?0Rguxw0
> zVkQ at H72ja)ON)~d3?0%2e(5v#TYc5jkO_5FY5VqVjVo}Y3Dt%9x|2-jR=Loh;TLbf
> z1w*QyI;(siS#?Z6TKMWieB%Z at o9U^37AG=2$CIAL3oz7Cp0nY{Lo#}ezUSZERuhu8
> z7$6mkpC1J6WAO~;1HO&LOKqz;n9DM~_eScN%6G<sa<~0eLO=n_phDk&UiO~##^rvJ
> zzn3f?BDXz}Q!YuL=TM7ZgPL<(^{#Xa`uAEXi<KIG)h@>9Ibo>yp+noOfUFOomoa;r
> zmC(7Upq7_gY`$B+kdJM*y1=`lHUo02rZ$s|>=xgzg=rC4*>Ya3zN+U8#W&D=@k7?}
> zzQU0Sl?1weHW&CVa_D`;F0%N3V_>jM;q=sfhqPbx<|Y#9%~v5(q?pJtG{kX^d7mL%
> zww?|MlEE2hkT|lP4VYJPj4%=+h at s2}S(PNd=L-lXxjrKiu}L&kAl(b(yLlHq_;v+3
> zFe)pX(;r<Av%%NB$QZP`QhbsWW~r`fmGnx2>?ZRlAT}FBcPj-LS+9v?Fe*nw?fK+%
> zMzpN966({T+AZ+=Mx*J(CZtDU;2s6Sc7U)wRV?dZHRP+k7KsO at C2A3=+2VnInLi^N
> z?MIOAY?5mnb9VUWT5{OO&41@;U!BM%pFpMHxq}T9;%Ex40j%N-C!j!XW(dQH(Q at +}
> zIdxytAW0`kX2!{U#2rIYeJhd{VwiNMCZxEY-?0%7Tbe~~?$mq|#32u+-&DU8l&uP=
> z#J`dx%SBt>w>6CT*0(B-W_Ve7unF4qoi$1k1Ow6$PQOiYRWB&E#b0ImDu!OWnh)ae
> zXw{}7a?~}S#^F`AjU$T{=#)TKE)?l>+V$i-<&^h4ORFt8qxUbT)!}iX&CN9)t1Ffa
> zFFHoM!PO+Yo+anA%kJl788*+1KKfJr=ugY^XFOT1SQsYUt|p at mukPHH0=7<<XDkJ8
> z0Ekz2lVI at t1t>Q?qbcQAO6id)zX8ST38R$%fNd4Ny4Mp#eHSU;->B3tpry>C=$91z
> zN)9am?Q6m8inW2~G9`T at ll}puE5cM7$Vml%D@>riHp=%M6?|1lq1g8nyC#SI0VwUl
> zNJ?=~N(<#aB}j^%rq~&o`(vPJ&I-!vB5-iLels4XdVT>dnw-s0G>VbV1O9>rQxv)j
> z^7~nVgz9zL4Knpv&$Dv>XX_1>UC#;8GS^eG>GrgE%Y;-)Lf1o2*$YM*^p5T{C;`v?
> z;OcUH3<%^oxNnO8O0$JSVPt`)8#1vBp1%UI$5RL{Z*M64{w8$5Z!e(#5#qsh5nO-s
> zWP|Gq;UC}@!1Xl<3Wv-ma=sFB;P*06zVRf2>k5_f58-3@{T5KC36-gZG2m+h-*@vo
> z5#YS)83vvoz|~GgeNRPQ6NbaD11K$Y!&lZuANWrd`g}Ej5rJnZ_i4&~hNPROjpKWs
> z$2qpuwbvD#RtRX1=7Ksf7YKPW1`4DOhN(BxdREu9g at Q#T`Ria9{oKpuEZD#Nq9SLA
> zR0d>(BKz#T2G-GOXTNu7%q7sv%&i(n-ez*IK{rlcC7RTp at vUUZy>)e at pky~2t>xE@
> zV^-UiatT5p^>%|dflJ}a$omBHx|1A3^sg&qGa?8+?Ff<tztG*I&A*FX3!-(h=paz+
> zza1*GDe%dX{J<v#%smhCbRcQDUlNyW98*3H<TZNjUXxwl=&<;Hif7ySNn7wD<`lnY
> z3(k$VlLdxd4Eqq-iAa{U{ObppZ2p&0Z@<@}Hf!hze{&0tWsdQ~w&JV at 7yid&pRRm>
> znbw+2?0aG#vVq3bh8 at bxjU&NQT<=VBEve3P)v*phoA*x5$pITAlB`>(RJoS$c30hA
> zqbYJP1Js{#a-cdV5E~9Gx6|%T<d!yL>ai5QVJl3Xj$PY3m4-~IRGCZEalBppiG<v1
> zG^W0zPlNeH+Vm`~GqF;|+rio}fYlKP*2idKZ8XL1HInPnlxywNq}bkB?o1XYSLcBN
> z at fvV80_VGFn*4W~V&V6g+iqsnaS-wV*qzhd6`+N!;CA#p*%=xO!A?T34<Nt^8ti?y
> z9ezi+D+Wh)Y>zXUgera=DZ?K`$a^}?y86&XQmYP;T at z&da@%2~(KjnvLSfVigyPbZ
> zL88+|N8d0v!(V#=hXsF24y&Ss%hgqQJhO{WtHLXoL;T(<{G?4I{x_#^8mwh_hPY5n
> zEkGgV<nvQ?s3V8?$@Q{0#u-Oe6q+Lt>YYi}7y=USr)tkgRPuS4(6nd%kfs?-BT~&V
> z!~nF2m9DdV^^17o at Mj}YMGD;(q5#{qaGG8R!)(JmzU at V9#FOfI{WhF{%Mowhh6~Aa
> z$2Pp^fuD>cY|RCFG|l7ivbA}&tSL;XudS#(ZPHbmxFXl{wP$(?;dfI3LK&`qfXOgs
> zOF{Ns2>ne_#Ry*Kf!dZ at 6E__=PH`6aJ>8QJzg$nG#Ji!9FWHXQhFmm`*zlEcjIG%?
> zZM~AexE*f^=r-<qVGqA>2cCtul=4S*;4!6JN{vC>N#mFo_86x<pVPDT7X?|^1WjWq
> z#~jb)^bmJxK?d5+vh3lFK2Jzhi|{Sr%x%it83?h5A;kUOQ!JY{p$VFJlZPL-6DLE2
> zBfwd at 6Q|+##_^RqaY4{~<2LEp?~K-_EBx0x at x3-v&A6smgxN^9y>Uj(^@C%Knnvxx
> zhsoW*<Py{u4OQ9Jz2T?HcI;MVTKI98z{BrD<U(;PV$}2W?0-0XN|BG0WJeq$S~%n?
> zblV&9IJI$X7TK_E_hQhlJ7?8rCG=psSbDHsrhQhAlFjAocj1__tQ>NZ?(wD7lN?Iw
> zS}{+dM6!F?JO%c<AEdW%O75jF39o?XawF&?A3A0-?PSq{?yXG6_?KR3J9T}`CX?}*
> ztO7n^H%`IuEZ&XBk>>{ad1N=#a0`EFHy*{z<!|oBvu$hXA*Rd>gY+!;kyt}SxN*es
> z#wI-%<UCNE&phYV`_GDITWXdn^HFe-!f~+u)8Z~>joGa+mfqUb;HhzjMxtqGCE`#W
> zYDZsT@)yUnF9oheGS`*tDK9e87SvsM7apNTYE)$?L`*^Za$qZx*}T8%_;2>$*t^D2
> zc#;Hf9_R5mLuVBi&z(Epy0Co(P?BXzVKG83XXwgDA6>KNiKm|nLRBdsG^Bkc at C=oC
> zRsqjte%4DkGx(+q)p<_vn_t4|!!K85LqGY~Z7uDefWiBPO!n~SU&2wts+cNf8ACKd
> zCnd`BF&>uhd5LV^r|=;eF7hmw6)au2lqd+TQKBq|$nSH8KCxj#MMdSdJwa&yGKlb5
> zq9EEN^Hc$k#TgnjWJq{;)aZmU8T%g;9^U_uu%aX!sfA_ms}YvKZ;((1zrn)&CE+%t
> z6|CS15$<hY*-<77`U(Ukf*_r4*sz$ml(b2}F+?!KZ>TUGeszKge#3-6!Ed-Q4Spkp
> zDexO95YC}OCdiuRT3>prGJ$LvcD2m{8)cBZ;lgP6<wx>(7PF9F#^bmlSp}5}OYiYE
> z@&YZlfUo9pvcf7};2k`U4p>mT-t{g2EssaVTe}$77P`TFJ=tt7Hn`GAi#nRYCG;rB
> z#Jq6_KYA~IXsmRj+2{hqJS_|%r<oP$kcMvb)|nyz-5 at C7_Zj0zsN4;E at n*cWl+S({
> z7vQZm{BtkkB)s(^U;8qi9ZLk&m`1hdZ#NjH9ba`_)n3q}zOJ_Fl_5Q9 at jYI*50BMY
> zt$Q(*&KK;%^YII3`2G7}EO?Vwy at HpK_Vef~*ov#%{HL$r4C42`g0rHhiZ_Z7J48sK
> z7d_}+Fp<*&UE^Iv{H*;_GhDYHPocM>9o>(IGoSNk_v3rUT1i7ASE4!((2G%7>6K~`
> zL(Z@`s#}1hSA6uyH}k95z*za^uR`-R at YSzEfBUm|hBL7%$tHJ~l^=Eh9|wjD2k;bN
> zP`!rl4#+LN#d7?@*KqFe4_br73($4xPpM!=ttVgJ#h;;A8ehYD?bHR3^}*2I$AYG9
> zui+%q)R{-sX^N?L3W2SG at VuM){(MwN3^GpNt`L9j7-?M5*k)RS*qTgnnnzu-7O86{
> zfJ;#`Rh-6~Yj9i|&=JcvB2qTlIu at DGevKnw9%5}$=LIq$W;Ka<HpE<AgP&x+;fEZ=
> z$&irA2k{+{QELw3^id>B;tG%o31Q|8$l*-LVTKKov*yEt(3e^HD-bT=SYr)jvifyA
> zHCQSX4K0SE*Qv~PuhUGdejUd%f&7Wr@!iY?e#l>d_6<K79<iSnF}`mLP(ZZs6a0n=
> z*V7c!e#l3<V501_ANUP_!DGV!&`Q7t@|)GdH~$4&Xf0PBg53X{&p8A`bzkXvSzx_Z
> zt)xM&@tY6fOh(5yAHrD*FfMraAv}XRvfqGooaE=ff%8K1J1aZ4bZ+f@!M)f0vP;9)
> zz5z-u;V-;_ at 1VTeT0EXQa%%Amri8Dk#i>jcUtfzS`st~G%Ua0Q0RPR0AI1+;ls$~o
> zspFl)I6+nErTciV9EPe%z+rWA;G#Nwn91O~>+saD_lU9MknT+<8+0|i at lA;FRi1kj
> zPlSP_nfNSxn?eyex;9f6$_CX=aJAM>6hErX0H3D8>}DD&EKG4apK%1o4~KEE;$?t}
> z8!DXf4keZQg1C at hc?73UT&OhQ*=$QK45tt&B?`ktg3fX?wX2<Rt+%Kz7kq2M=Z1i1
> zkKja5;HM*fdhq7|!iFWgTYvIC55qIzFKUYI?33uV6HKwEF}9N-5 at EPTYztY!y>X}0
> za5RIy{y>yxN57;qO|duZkd7U<rSPBr7amJf^pu<F#9fNM6m0=BTw9N$L8GL4oEQee
> zEAsmb=NHuD^u*x~kM}e&4Jy{N$!;p3>O0dOR%u<YzA2E8(pu5NH`GJfy7_PFah~my
> z)@Xj)g<v7fjmg<2CAsV{3(9=eanrkzASLP4|4^$66jE5w*dyMJ at F%5aSO0>f`7(U~
> zLW>5H(1%!<BKz(1Lz&Fx_q|2y;i<Rqba<$a;zw-vvon38or$eZZ;f<d35e?3@=XfB
> zZC4tYe|0io=f{y~nHyyB3=Afcue%@RW<U48`?=ly+ at 1a0U7gGVPDN~J&>eL#Tmtkf
> z at icA9PO|?$j+_)DrIzWUzCM){7g&bW0LtN4)5C?bFyU2x+exF~i{Hk7iY0-)ofT}t
> zjg8%QIp+VkF=06y2uw%b#v^TD20G`nde-cWPgCR;y51Et!EnFNIUmNsLe at -=5+oE0
> zpqVmm0X$B|XZ6Ep0Uj^ov-{z*0Z*0jyZYgGv1S`LMkdVdN0<u%#>)8J{qVcV$@JVf
> ziq8`>U3-kXbLZtN9KppHEfFnFaxsJ%a+%PV(xlucS|Hp~pfG)je6XKH+k-SMQjlf+
> z2+L?%B>bU%_(L=;68=a({1L#%$oQlE at JDG<B>b^{_+vy-Zk&x0%H_0_&r`72kwj9`
> zGlry<QWp;>l*O#MCq<@|^%Gb|_<K?*{(vm+fqcc8;C}KXHJ<Ay&jwy9P$F&UCvXD^
> zAPam}7WgbEsC0~=S)JUc;G6*p&Y^{rL at C8`xZ-?8YjD4CQfv>q-nI1$_%O{9Dd0*u
> z;7W*4EeA~Li?C!sge5e>bV|8b4tH<9;(Tzwa8iV;283G$xQ&qmu9X9>g$Q+y2{d3r
> zUxY;i0u}+DC{yn2mt%JVK3>M}>4)D#6-=Y}d^w)^`HG9djtREDh$Ib{4~S?vjYy)b
> z=qGRmjYz^*_rq7y9F!tjBS*9b5~O$NXdQsYN!vg~?tL&n3k8$P7D^7f&Al&Q at l|ji
> z6C*P{DKkkt;A2fvmi8F>a^}wi6#g@<gnCLTl@%z>S6mA27fw?9aVeZl4){2&Y*N5=
> za=>*EAuB5t*QdF4fKt|c#g*Vb9>3yG4B!Eu9mzZieR3919-E(OLB66bxR1#%X#D^|
> z;H&TpO6(JK{{Wu*^A*>E`*{3vo*KXdJ`Ool&e;WspY|ReWh2Z<eObD2K$b3~S(;2K
> zi{zYHl)v_;;BzBIe>f>ipPsiCg_4lHxisX{G*6|F&xo16bH=r~&%m(Z at a7qx$t^6#
> z%v^FlK*?WhEK{<Z#Zm{#&2fV`H`8<8$BCA`&(*4(^IbVd)!ZD;Kq#h&6jZAgEv_8r
> ze2T_VG;(hrYJ4GgHl at T%{Q80X2?QmZ(JEE7CP?OHr)~aG6A%(*0`4P7c#@1O2I0vv
> zt{jA?$aug&yvHEpLk8jTHkqIsMDS}GHVF4e961P2mGNPN at G&wzd;ng|`T1?CK?Hw*
> zz(M#}8CMU&$H};65I$bUgZ%hW6BKb8n<wMJ5^n1YkS-In0|oWyWjtgM9w+0WgK&RQ
> zh7ZF1MHz7$e{ty1P*Y_qRJatb*co4&;mYC5nsIulMVVKjCJQI3Uvnmi$N2-zFbi79
> zJDTxGcwA|QDa%4W at _lTGSV)hN(5vH>2DB7xL+o707ru|bizfz^MzVY`Jtfa?Ho5Jc
> zj4R*5<SgQgPT*JzWh5W>I_-XT$qu9Lkm`&+iwk#cq?i^AtN0s!?jfCw8&k`x at dUmP
> z^wNERYjD*i{+$nCvbONJ>LlL8+_#)sr at l8=Np>l?9wTq{-+Y?>Zn|yrDN@*$>O5jD
> zvU;(-NM{P=P~C(kRb3{>)URVr<ao+?cS{y7hnrLoZ~K4aSQ`nNT5YMm9Wclr&}ph)
> zN7)&|?s~R<9Z4PtB&KDa+b*`V-vNIx7<>w6p0m`bd9T%(zdzI4;`(bRV~?Z9=Q>)G
> zS-tChr4nZN)0L4dV-Ee%*O(_}^bTucl#x95A)d;p`42zDS at -9`EIx+J)X4FyaY4#q
> z<XxyhKGzz^MQw at y7L??UoWz$|ha*Oa;2dK6n<tviz4?B9ju6Qy$TA0_MN@(?x~aTz
> zrZc~)MM42H at g*PO_~>#+n4~U1rOte6;+ZVy?x*>xk6=!^lt1zj&a|EEN!#eN_-<4=
> ze&Uqecrg*&A3EB>okrc~9c}RYp2G=9x|qnSdeXoj<PbPzk6tAGd{R%bNA36w{01?R
> z9>-B^@pYMtvF{9EaeX`*Kt2E at z8_a9Z*@QqzoYdx)?q=~FIc@*%?$rOsYBHhNfl>>
> zXs)g3aYW8g`0t)Dr=jXQ;a75kpm3f1LYM=sLxDf2CsIy*jr`8n!9uv)fA<eZdv_!q
> zu-Qs(Qp}XxHmh2xgj9|8pVf_Z&e>+fm^ecT(j1g(vEu$7JqNW|Q1zWk{cn0=X9BGx
> zdKa`1W%<T)jzBU|QnWhtr3fjU$#Qfmx}Eq%c?EZk7jX;;OR4wC<cbETLD2La02<&l
> zIcLx#M9E>HjHiN5=x!e;jxA_RiZHxS=>YJ*B82v-*F#+V#TGo&Mo-snS_Cap->S8s
> z)Jv^7=agn8LIPRahEfj+lllY?O=I%o9f9&Wn`q2BAqhA>YK=eV;uxBWji6 at C?P#sb
> znPIopR`k#reh8JKA;%~v^ZBKxaG1>>K*=E?vXA|@zVzOdvkHo$cZ;APslT1#)&P>N
> z%=1n?$qypjdB8}2`|<=~S&3~5PA~2wue(Y3_K=PMXeAD{E1hJfOT&9l;Xg4Ne%fiA
> zI((IX=I^!pC%P6UdlUckX{=Xsj_lzO;xqpB(>PhP(0O1NqHjySIE|Asn!0anJa&QH
> zUbsikw)Bw0JHwsRbF`1Nl)T19xi^tBn>bsKL8oMKPSGQ$_>?pF8O1_ZB42w3Z;CkX
> zNFg8RT=#LwFe;aID>xOu<6}IWzvp8-dML1Q<ZhHWSF*&%1-kCzD?i46qNG4VLIDUn
> zQY9h$Hy`6XN>a-tMIR~SEY73xt~-lgVB)LK;c2$IYpnsre?dypBrLskPKUx;<NM9Z
> z;$N+0id)t)93Xz^2o|*D@|~icxj%~^wz{nAnOj1KwVe5p4I~QyuYKwG4seBaIaZNt
> zFxwR!mpN#72(>45M4R0j=;SKTlN>a;PttR!gLF}mX)2i82OJ<J#D91WN5 at 7%-xLUi
> z72rI8&^D%B*`b%hZi%F?vTmNkv!~~K&E(8(R^L<Dpkhzk6Uoswwb`!X+NrJ+jVkx%
> znoRfeH51&GH51)i#9wvfR?Z*cHx(&RI6TL=y7{P2a1vkNiih7l+<R6!vd-drJK4*&
> z=KkN2K84xMmwbYUk2(t3G0t_T#dqxQ4Gf#Yk_)7tM~m1Li?6Aj=RU#Hr at SHP%$*1w
> zj}^NjUt{sDjT?PMQyc-nu#eoOaH87rPg*Ze5haiE(%5*kmhXkYBTrNpvaz~cHqzpI
> zYlZwWXCq~JiC^$3o<8*ikkbkIub=lPUs*57xw2V)J}*80Q7k`y;4giO6Ky1gdYVFm
> zoWeMI=tw;HBFTN+ at Fd5LBz7_lN^;^C1U>KFL`1ZirB=tDY6)nBaq-H-0<>pmd6P=Q
> zExvD8_PI9sUH^PcdWi$WK03N+2wCn8odhN$e_Iq^^;aA<8bQ-*k7FGy?ot**$JBm_
> z{7N;Y>KgC(E6%fB^E?JY1B}7B*F5FWA1FL$iMtS?)vZe7*xWYHS+dy at u(oWZL`_Oh
> z6Xkl>I5M}bDX|HAj#9p_JhNpvUwMis$Lqu`+)1hDJvlP<yys7px|_HKqm7bV1%KdH
> z;Q}RdAih=j8>OBR{DIF1A5rS#Ks_UzqEv at 4UZy%cPg3eKpgM$iTLXaF3<<H5OUQsu
> z+!d7L9^z{X;M9dSpYI?Q(<lU45u at -F0;$n+cdH7phU`qG+RIWr2k-{ZOyHfE`?ict
> zfO*i{p64ibRK`*OJL*|SvA1MwG+=LeR#L29#v%c$_mn~UbBv#hG8mMj{ap0Sr;LXv
> zMpm891J*;H*)%;@3Vpuga(ak+Dhv(<kY3`>fp8O=M?g3=Gc64_kMLyDWbDt*R0UBq
> z9YXETMk?${puExETmmNmbF^n9jrJAFI1-|K#S>1EeG~}?WS>Vvk(Vi=0p#W5ITy$o
> zqWk!o&+!9cFT)gY|K~w&b!Tu_sKw_E<HIlF?YUdH5RRNTwZ&Sl&<Fw09nQEJEKGN6
> z9n%+dv&TEa#rR*;V!|bjb?*?h5D)lV`^;Ng?8&0HlYEhCyNE}HNG#Cj4tYTI@<D&Y
> ziHw)e_!}NNl2R_FmndxA)o6hm9VxznTnlcXCg3ak8;(xg4h*kfQkhKw^(Fa18NzTN
> z9`DeJevxHEVu1Aku!6|uzv1yVXEk!~W>Yw(D_GpZDWE@^2~W(XbcMnb!BY*-KzNRV
> zrxKoF at C<-wxVWW<(1(Cu4bKpGYT&68x45B^hHBgqox!a6hQ{LSx#-?jyb(n~uIQ}g
> zSaI`37{Bx+gb}>6IW2klC~gsEbOz;&E;*KSpyVAPm{Wl=fYL05XU@@*cie`8GDU}v
> zgSqw)g7L3^fi1&7?2OkTHd4p3LpdxM+}hR;fcY4Yzr<q$XqNC3zQkGaYrGXunt}91
> zx$oQ~-U{0JRkY&{jTcozPjl`;e(RSoN7~EReu>i~-fxW}CytSm!OtDE>s!Oba=znB
> zoH at nP8h{>SLrhEes@`rEM!*;s4V`*$Ymm#*ss>j`Yk(__GhH<ac++>f8!QskpD0}x
> zzT_*MNxunlU*S9NXf1i0)rudrU*#BG0Ah-}&{J$OxqhZ87M?0+k$AN+mtz_#xH1be
> z9EB-_o*X0T7$ttlYXv+p^su8FO3u_6D}F-Oz3{~XevmoNHwrk_CiHu$@B8>hf8W`^
> z_V=BO8sJOq at B4?Rzpr7P)FbD9+8o)83Us#KZOm1Dhk|38*=C^E?QceVm}Y8O*`Uen
> zA%iGg(Tc`S^nW05$hVx19Yd{X2eG0V|10(r<hp=9H}E;*K+aEKXFg*=6S^e#v_+m&
> z#}IQFm_23AIY!O#i~=1KV;mEl!ER*#;skqi?3Of}BKKztn)nO^`M1S)u${b&_b8;L
> zq^~BC#h0&6Aqz3z=#fVmG<M<dgwDAwlyU`Ge6QVbSHSOYWC~gn?B3X^aAUF*v(yk$
> zO%O?jbB;|Gv4V)Wfx&>Qal#C~p#Yd-<%rn6h*nW9hCSp=Y6t|5%-^Z<*lkse(fQ-Z
> z*!SAHhQNjbDRS+l+o5Qfu_VxwBv8Y-V at eV^q+lxylZN&Lx1D`}J=GBb!(%=eQYpOh
> z5{}O;fdKy|vC)_gIg<-?=n(rIOgqPL?QZ5Q7_2S^M%ZL>B&r}?<t+KY)jNg%^b(H2
> zTk3cYgvEm}oHtk)7}y39_yQ(DqySsBe1|{4Q-2U3tzUq&%lM8EIYaOp#?<2_{1caP
> z7PE)1zl<#_wvo1K@$Ib_VRUDPcmf<DTwG6pGtc6CWhZ%S0U<YlIZ3z3k_$8FoZ;`}
> zn-!RqQBrQau)sg>RtD*Y86$Fk5;XApFF^&rKMM-@{Wrhx8$3SL*uQDKHkIG^4J6}T
> z$y;;M%eF+wpWM<}N8g7?R$R!peFMGkLcZr4{9xEgfm|&Z+ at 1oB|5anq2lagUKXB=!
> zs-Lo-+>cB*$buQF$A}X|j}a%vfgU5?Uqv<;HP`=GP}$N^D(U^Ap7;I(=MB%k8c2 at W
> za%Hn^KNfV1lZos3c~`LB*1R+uB{ID^z2k%-++u5uLcu-2De`xtwZ@?47?~DR4OY6V
> z((54BKc|7wb~%|CyOt>P at nmO0zpsa6Ci^h`<cE4DwbB~FF+G!5Qah%D4%Ej at hbJ^1
> z7_Bs>4sA;?{TAxILSIOYcH&X-YfPD_rqeFIS`r>;D#;JbtBmhrDwlFf&hAWvsh0ux
> z7dr8ufxp>_4auZ)fN8hmS2~r{Tu_23 at gG3}zuu-mGJSTaNgUPR;^?7YwFg4Za%>xW
> zs?#oI#`Y3E?OSrB4~VIALvP~<AcDa9c!(T&!MuJ!Y1HJmk at Ls%FR at 9^xYkZ{pof9E
> z{zYL1<v4hOY+|}XY2Q;`HT-@>{r at 1LX#e#(^?ym-b>uAv_|6LnR6^Z_kcG{dLZ>Oi
> zo6QR9J1N98ORUFboT0u3A%cZ&(ajKHg38T^3)v(>cg7Vfe4uj9b2Ja0``k-RW9LFX
> z>7RHC$tuOyN(CEAh5XW(%$i*nTRYj5l6W?<WFi|yF3gz<ZT6pdY~V`P)cQBq629r5
> z_z~NWAa*ZR;Rp!}zMV+HlGXGhH<{?2t at SV}2eD>n0;>mV1;yT$5b!@;l7*Og2U(xB
> zPAQ7#x9F{9OaRvcwdp}tMQ(JrpviXNTjp)?;!b;4#f^=QAdns=TF8g>pe}_nvtpkR
> zC|daXHmEDF@)yWsFYj){L+^OCBy2OwDH|7+WNx;1GtNZ0R{FpD9_jxTpDS?NTQE1>
> z&GckJFJk%*Pq7_x<_pmaI at L_autT35Dz2~H`atF4>Oa>%0NJtIF@(;p^PHwv?Q9bC
> z8V+YZtMaex at FEBPBnZY66?vm{93)A&P7m1`2jQP`1pjgP+aYZOgF>Jc|6?HNWt(!l
> z?5%405-6IyBWl%1D;n?!X+?wMM*q~~Cx7?V|B2g(Bg)ITrZ4HTvkqlGQ_ki!qMFq=
> z7--o2mP#<IYbN-YN{~Uk6>K<ui at y&e%^Aw2`6`aLt=+i!{h at 9JG+3tjrH1KT;H{0~
> z+V_KH<OM)96w%4Zj)v(h<#8(-lT5mbn5LxnM^qEazJ}>t&|?r<&1#9eE)&9IimZ{5
> z34o}n#886RAmDa at 6qM;nnQ00jO3I{`qpbu)MUfyG*$PMiMKm(91&|>WiI9=qfCN({
> zOh$HcT2m~GC>9QwjexrvruT$UC{kwI1BjL)S{bQonC|*3MM7lc#fIqx2<1_1h>UH6
> z2!m)+*2+nl2$HB$HS1(#5+I=zdEBkAQ78)_9fh8dnI;1w<-jmmbTuGSdWXvh4~Uc}
> zQ8Ka at 5UBv8-3og$ATO6FSOX~-&lHgqb&||k3wWYuoH%{0G6GGIz(@s}0C1|uAQCjL
> z4~+wKyk{6iC-<R~0nPLTi);B2Kj2Z!T0Z*+96yv)zUTVaU#NJi`0^icbml@=09{f6
> z{U8i30mL{Iv?4+2q7PP2+{7gW0|(;@;7|O3?-?b%APgh7*N}U`_hy4j$pwIGqD#Y%
> zYsaHi&#$8Il1kd~?5rAk(GY$A!~Q>XeR*J$Mf(4|@4UHsrU$g8g(f{|xmpgXSVG!{
> zLZs9xptT|t at xYTCQQ7UJeG3&qt6~RTgrHcfvRK at TETX1>5L_2oHHt^pf^02sTn**0
> z*4X@>nKv!P{r>()-uIpRc;<ON&&)G3hxpWPv^Q;c$cl#vK^()6R8~*wN9-mm<e(=z
> zxlC6&#bkUxB&+{HOpX32HkD}Lr>#JmJAB9JH9v at B5;{*x%B^LMNVBP(?)Ch at rf^t3
> z^wA$g^CAi=W1=A0g{+-dY?6eQKaOX{_6OVSj5G}X%2uxW`spfDF69StoM5NJy2Md&
> z*M at v{2GFkJW-WyMnpSp+srD6D*r{E}8FD27Qr%qJjM~FZF+{Knxxe%48Hwt<?N+-m
> z%Ha8h&C at V58~D;vR~NL)Qu=k5m>hj>aIr=WrP4Vu8~FO at bK-CVJ6f@<5=Bp>H=PsH
> zraU#Vz_?MgA`;1L=t2jYgsEHDo|?}L3xNV0s!1VY8#KEGUBGI2{oNyUH^d+Djvv5m
> zEQgZ!GBEi=KA->}$o~>Rcq#P9bK-dMiArix#7Q;N3yg{S2JIf(o>I>>vYB0;%?jh=
> z?w&i<_Xgn29__%pX-~1|mj92B&2#;guR%U$NPp at TAEOcJJ(Eh&0|SZl{ND*ez%Y*)
> zG#9HSIUVZ07201meWdFTfs7~$X#P6)fQz!jBNE}G@%`=9kmbo${ixL^TE+DFwALr4
> z#{qgTcy3r20ldei)4kgj58dw*?-Lb2&G=EgM<}A3eiY5=qd-R6rXANukPddR0lP)m
> zch<=6t9O+;A&XZcJLt(D0a7)vT;h%RpP}c8(DRef^JM7xuh8?;(DSp<^YhTt6MB9T
> zn%&oNTlz*hch`Pzx@`q=$u2I|au}>KMw3*&+^3c7sJNIu^k4DXTiLk%hGfZNXnE#a
> zX6Wust4JloNhyF{(D!cmn=HWh2vSNwy}p6LnMK4wikNQr%;yJ?zy7?Y0tcNeWqU9<
> z8dA_J^O}AVhu3spu4Put-jU2_GjyU*aR328T;HH0IS at Vz7!9)i0I8?4o3D*KNU9xa
> zF0#;DA67nY=qS6BXvlE at LyvGH#7||t*UaBOW8$5s8o|H4?E3)J(k3E+Vf+o#Z9j?8
> zw=IzJ#W~(|*=#j!jVO%S(bxA>Va|>|Pqgf?rs*RJi+1$EGnTo1q~pys2L!qlAkg3B
> zDhoi<RThB3O-`!)S)5?7RsKSjamHBuvv`;AH`?;ExIyzaN%JkG6a8X^$+16l_i)7c
> z0t<o?W_wcVP4FC9IJ#K$RnlF4aTJXHlYTKl=%8JG at hRNl+dv;ZFHROb^sV!v!~7q&
> z_LyXRmY~34q6-`jSfyo1?=UqLl6IHm3|Ia{=XQ(fI*oIJY*tQE(k<>xKiD#UE^a_B
> zjdMKPZ{9M#7<Yxc^z2K5FXse^WxF8G5c24z3*zwW^7=}P at sHsxD_vpENy=9(lTbXt
> zebGGbByL?5?_8lCFWwi`GG2-&1|$)SJs2?3vlql`g@$)VToluVm_?<gXuorXRS?C}
> zaS*(h-gHTv9y!XtzO_`j1?1UCrI7BrBu)cSaQ2dzFN~){FN at a+>*-CG!LgV=b6G4(
> zF7~oBD2y(t4Lvi=BeiRshG*iN61>}e)%2&!;x|z2kA4wzN?2hgi}6G%H3j|F7_HbB
> z-7=XJ61|iG+!syV=K=6k{t_DId{{j+tH)4k!U#eZ_eHD6%F%0j#Az|dN{vwLx2&jE
> zEKT(@=k-0})VM>w_Zgh8h=XE7;ZY(K{)--Q%+v#_p^F36IZAaX+Ic^3mr+tYf_6a`
> z$8<;91qV565B_>TOPQrh?sL8nO56IYI2)?)<genGxCP$rDrX5;fq^I0BVP_Z0UnW+
> zzPbG39U!+2rBvT5F0NtP<b$d<$u-M|2E8vG^uC<EBNPxiwR|lI$n=R*AwrBAIwCKN
> zhg#t=^5;r`2<*Aaqvy}n9*IBKc};A+k6%*gcm^RvyL!cl1)E0xPfBY-DLouYX>BN_
> zM?xt*dUZ-6D+H at Ijh&!>1u%29_om;(ISJh%9PJ|dg1D_nE at DgUe;4RM at QhS%&h91I
> zb|HTXO$mroL0VS@#N;8TN!GsaesKW1x|^&g&E8!15#==97!Y&vPm at JVMPS^E?DS?6
> zllv9BFm4X%aPK6hR)9MGjTbaz#@#W*Bx}#t`%coc0dbP>E*<teH=(ZnT^tqj2(X%5
> zuFF|Uo%%H2BXryE;<TENz#)lb at l=HK8kuh<Af+r7#>ocMy2oS}^ypzG+sFQPMfp1K
> zVD~aSV<fKg0=tvpnWW%`&|6yH<SRJCme-itfPFBwkW;o=V<as<r-#t0J~0_k!kRuY
> zQ&>#5^@;OF0SFUXL5I9YE at Gz}bK&6PS31n_rh6pW%r*$xjByR1q@)DJOx;qDkHw(b
> z&J2pvQ$w-4F~lE;eIB!eOV}*|baxO&yq$Ii#S-Dg=W=l>{9lg&G(GnyPM*wWK}HOo
> z1!0g-SocR4G4-mM68m!>;~YrgGF}dKSt4Mwc>y^MEP1wU@@-W1G2?gQaz}HX{~Ws)
> zLTRP13pjZ;<IgwjOC2yXSM|Od2V1hs=3bHMllzS!;|B77y8->hig?;ImVni-&MWxY
> z1*AOJXT4^Q at T@Qv^lk%dmOAQ;k<*)>g+?_1rwH3+Y at P#&G>SN37E5H_|LB=FU$t?7
> zwam*+GykV;s;+jS-6Eb9GUQM53%)LpwjTGdz*0*|))Z4i1{z0F_O!wO at I8-1yR5>v
> zNVuKu!>mbJtc19iA#hgnD!?Qu&FtExYm_Hxn1rVa$#kZKQ?H|L&=ytWf<W#33#dpo
> zpA(t&on0`kbzN4M0T}6~esQH_)_g0w749Vo&x`4|LeN?6`zT;}^dF<CUV~Gwodhjx
> zwHeX#mYn at d`0Q*>X`Vh^$|rBKljoTQ<KUTG9(FqmORF{bIeaGo@*WKy9%oP<RSv2U
> zptgw}Di0nbwNP- at sGrKrge;AFe#Sg`Q-7-biLK?2O;4YHNW(3ItR6nU-4k&%YAjB_
> zoz`mcjFRW9_yu$THyBu8&eu(r`x-~Km6jSMsnXbBwCMlYVGo`wvOKzTv~#cODkBJ!
> zXwkRZz-J<j(BaJReAO^z+DDCvv``1*VHSNrhbPyRm6{-mIl}a=K-SxXkFR%oLTkJ(
> z7iP<M_F(;%D_X*p;W2pdz<Y+ at A(xW&R*Bs*B%9>YR;{;0^_Lg<1!Z6BdT$1)cIkUl
> zR9l|?TL4~9uTg{ej`@XFnaxEh%OKOV<FTlQuv7Y?TeYn=xm3B%W#~;I*=j_R-7R>F
> zfpz7m7ARsWGwYKVc{3oR*4Fi&sN-=*hp7c+mwZ6;gAcnSrd1BP-tEosK#Fore_7I4
> zl7U?TtQH8$D?_;*P$ZWte4xzxWfKbr?NK+l;4C>_bR>kg>j#C-^qeDXc^>#EKhE_i
> zn at c_~bmn#Gm<f`17Bw00kQp$TnIanFVhXYyWiDof;7O1LIg?n~JS_NCG7f1E${N0{
> zRWIn+rP=nNZ-++%Z|M+gCS7NMG4&#CHsJK(w-4S2bKU{nIM%IYd<WhNX{Q0t9%By;
> z9P8UA(oxlj_5D_6`@i+*ouWI87((AY-bz{>hKDD`d;IK-j;~Ej{5xw8 at f#TR>Aru^
> zrZBv4)aZV8#raRJH=SYOue_Y1(wN1{zEtU^x(LwzW>Zr*PS#X{_hD)c#|ePBD#LNw
> zP)J-yOc!t!8m1 at OZs8)^nR|#n8IFhJ*}gq=54_A^(H`B@?umh})F_?1*OeKkU6#dt
> zI%eO;w278$J=m+Fl$Qd<4yz-L9A;TTJ at vy>vCg!1V+77FneOfaHC|*lEcy1xC^nkF
> zK=jRy9S0!aL>Bf;3bkbIpoE_MLqcmK at Pr9_SiM+u7M0ojvEyByc=bwj(%}#s#f}VM
> zWidblQ4sOp5!e(32^K?re_<`8)YGs?kXql<+(?{L!|H=bhBs|z(cGKrf?x71J=5h5
> zGO}AB28gM1pl%Eu3+?n3Xqi=Hm><&msVx<9iS>(}#;&ODTHrZF7<4F->&@6%)Ge~K
> z{{0OA9~X)ylJ5Y^xh>V-z<S4LH;yA2%mO5S2R*^ca)AC6iSuIZ!BcNu0%{_eM91#-
> zIMqT&M`5#|rR7n0iUba8=|*r!?ey3C!<r=jCQm+}atVXsrKy-krpf$LKKfA<PS$mn
> z5p)Bzz>iUQg3w7#(YU1KX{DxW>-aN_4lmX-%KLknCF$?q+DzKpE`(pysMO`j^R+6U
> zR5`~>fLosVV_4c8jmOMB<UZxspV#j~(o;mUN!YE2pw9-}YA=&R%9Cvidx2xvtbal<
> zHqe+a-6m!v>$}5_#&v{bbuGVK8jbsbnv6Iha at nc>_6mS~7DDjF)Mmu#*S_M8?nUPX
> zdHMxWc3i^tU|+zkWiD)fd`vNPd5Oa&JIH_b?T}yc*E!7H@`ZZv2~ejIn`0i4MSwx}
> z3s|nRRiK)lSLvrloEi7;eL+7aIo%R~z76tA5dIhqi at _Ptz+Yz2ycm4lkj^sewDSlf
> z3j?WseVNrd5?YePfFNE#KaRn3Vmix3^fExv7RW(oNBPk-FBT_3J6|6Q9ok9ni^U}q
> zSTnYaKh2v^9%#ZAn<;F>1)V2rpzkDduZ%8j;C<H-i$|sQ2fKmXcTo!U$|!~PXqumy
> z<mSfVF_1}R93Bg$_WVK{;_##~m5_lS<U=ux+#9(({9ToYY-W(KO=0YfFB`L|t~hM2
> z;enVE&Aiyk1Av|=cC3WA!eTgJ0(sodr- at WdovkLoPRu6N?#QdceK at cJo6P~!e4s_h
> z6og_C>9}I=D0eurJ=gRb9U4_TOKv)u!!0gfh{x$S+5n>Co-l{0)Cjy!VSvx0B|65R
> zA1iX0WV7e2+~LtYdAi<YU9~M_Qwji4$9Sjv1qX0X&^|mBh`d|=41zZrH3TZ#AIzxQ
> zi}KrP%rcM_d6JuEmav8xumROe240avL<iwqD!)^WR(Z7qzhj_U+Oa~>^)9nV*YAQg
> zo?ie}4;x5J?=!?hVjuFlgiI~n?B0$;LvVi0bomJ5<nGVh2K8=YXw;dOqyu+)l9{D$
> z)snDowi<tYwv2jim!+P3S<^F47J4QCBb@~j)Ob~_W!_3g1NLCePw-ppNr9Bt{vqYH
> z9`JMjOLZ+DaF#vaL-Hb<|8<{I7iCz+?jL~l&bosA*d&m<2MUk?&spw>tCOa#p*T5G
> zwF$67dqW4&uAz9;?J4qUkA~Sh1QX=%p=bF0B<w`#-!ZsFGW?~getg}>6)^KnB*5_P
> z!S`==>3T<ma%uDyw?YX%>;t&d at 8+b-67cZp4^%BNU4n#ms+Rby at bAxJ#`Uu4eBJq4
> zc3uVaS6nMgvdE*e8KV%JhHfoBU&q4x!Tr6j=%)$z+VsEm!?Mu95|GpfZ}l79eef}R
> zqj`yV==F~`_AiQSV at Kp(gVe3B5augS;=ubip4dU|5d-gEvgOLqyN5O=Vsn0*TQjf=
> zo;Ua*Ezk1c|Hr+Jo=L>%!cMA90%?&&M<&77JX)3nXk{H;lY}P;C+Y4aU>S+ at YX~y=
> z%ReUM;t3tL{7(kgcaH5ETIx5HR{rwDIy!zBZW0guL_ZpalkfkZz())L)R{rryY!IM
> zoo at ZrJNeZx?P^B1|1oaJeaj!+OHJY|<r!L$j5CEF>6&Cb0~ql8$v7Jxoyj;OVs+R2
> z3uHo9q-B_GJ{_8ZXVz@!@s4Y`M%I<~iH}wO!oMc}kl8hksdQ>hHh)||cOmOVW<C%<
> z(xS~%R}Izx at 6)qT{A=~Ve(QJ`$g$jQmFKehgpd~oLay=nxViN)K3^D<?|69dgdwQR
> zKc(Qkf`K}R;|YA<^9SlIrkqYnf#IJWj?MN;VA-=dTlxUJfQtop0<Q%ez<I69?ca2|
> zYHe5#xNqX>&3h1?`E<CyR~dxyGWe}#`*TO&)LU4Pc92Zk&?b_0mH+dZ+UvNB3m|cH
> z$k!!DGxdjaHCwl=X5fJFLV(p at sK2-#L=$U_N_u1jW{2*JsW>Nwg?iVouFD%dIgoW>
> zD!z-`O7BX=x5wS)$LA$>-=a6u{e8%qI^Kk{c?gRMPZ~8i#051(zYDW%aG&#h7B~_p
> zVhusJn{Z;yeu+)J$X4kU at oiGuoVPDXMv^-$w at s71xrDfVn}w<djbBZvIj?zn^IOdq
> zA)W88c428dtnSZWy#NZ(><WxBl{!oEG@^8s`t at njhT69+!`|uHH;r6Ra>+epgQaRe
> zYR>bHBy^G)CyDzdT4Ba1P#Et>c779!D#_y8EP|Xa-_Ihv)5Rjd^G7J;2XY4ZJVZ8l
> zN<X=tS6~rj5a5-lgIF_2b|{NnaQCwi`=&8p=rjkJA>Rq<Tx7l^OOMEykU#aAaU?5D
> zFBC=(g~?^v(Gh7lnYVCZ8otG at _C42+nRNuSi4fb_svxI;0e9KVzWLgq=v at HZvb4Lt
> zaP&iOc5gsCNQEWmfQx>chLdJMx(qo%hZlIJLn00+<D%m+mfUv&P?LqM7Np2KQZ~P{
> z5W*G7cN53n8J-xmIRUO0kvbNJ7N+COq(QwO8fXzADtR;=KbXz(5&=%9xeGmZWtT))
> zUZ2ES!gyY(B%93OX+>q=r0^b=^uAQ?Fg^q4K;q(g47lol6JM2q(`x{ro=|s<?BruH
> zhZ&4Le5oy!oxZqM$HvLpVMkMZ$7CzFni6yyePiWzD at GBt-FJ+XhFoiWV|@neViaM;
> zTP2oSlX~ObA>f4iu8EdW){24{q?Zx=qvHUStMvMS$5;a*D4H$F+EGLnv+09p8lRkq
> zl(8pD)lwspR7=2!A^f0B6p<o}g(-V}VJE4S8ckyhqxSq_53Y{#3^F?i2;C01hKP1S
> z|C&e3tfAQ)j{Y}w|Cd{W_YDD3r2`Lm-AuP-;-qVrI?RC3rZ5H}FY^7{n!hXJ81DPh
> zgRS`yvBqfte`XP_a$;casy%>6nq3%nC;cfC&&xSWN?HYSXKOL3M+- at wJ-A^+K=y9$
> zl)7{P6ioKuiubu7T|ghm!s#>eNCWBUNhVrA@$B-&XnSzgJ>@T<2pG!DMhg6UA|St3
> zaK9Ze0<&&)fKRaxl76o)<Z~1KA`4hak>Y8}#^Z!xG%p+frDo-(_NuM8LrHI&CR>#Z
> zdvJd)(E$js!doUgzKRK%mGAe<@a_K at csnz|uxB_--SVY+cM&<=swX+UGs$6xjcsTE
> zg)OD|THo0=t-ryU?|<Am-oMc~!T$u`(vZgt{v$|!$l`yz?;@=niKmT94jh9#j<G!U
> zwySx)^<e1v at ZeRYw;rK~MuMWYm|h-<Z<xB2P43G4I4#-KDJnm8L7xjQn+drpjI~9I
> z!?%<O$`lyBw+0-YX<e~wo<KNhwYu1xTx|}{o~m_4+Kj?H<r?({Y2_OB<xLCCC<}`H
> zyhF-&>?dqyCY^_U at Jd+PnFGT_aD{`j<EkVa{Tm(8Qj)muyUV)E4(JcW6L4M?(m6OY
> zDZe(GpE;85iUPm)uL}9T8q%ZZYXi52W^ey{^T4LXDj+_V!Dm-R`z(|}|KTLJsiDNO
> z!J)*mE1^icUBGkczjJXBG_+|H9x*z489OW27n=2!bz}xJ_F>!Fs}h9>W=J`xQSKWB
> zFys_%9EE2v&B^gLXC7fN3YRdJv8E;#qXqoNTyrM?PU2F2Iw$#ZHl6kqaHMdQ$!vGe
> z%@{%7HSw)l%8B+c?)MFZXCm6<?o!)9_?msYPkYYuudldohx;paH!8h(G>#rMDY&8V
> zp&KWuR=f{K5nW&>gQ}fk7n?Y`LNHdvK^sToaono!C at VuKO`U4N7s^llQq=N<zP at Kx
> z$e`a<SFqEwW+_hQ>M*&#RLdc(VG6J}tuW%oN!G<F5!UL&SXLx9b+TqJM>5SGP3bm-
> zDz=b!sbvff7xeV{F~A9yDjl4HPcUNzW>lhHJHST6>Z60l#%kYHU!BCI+8|US)_b&V
> z49<yDJFxV;&{hN8XLXwZclpQQA=fd=Yw)InQ?%O413`350Jbf(2Y<iYbIw~?HIntW
> zG-$w3>sUN0MgZodJK-nV-U+hJ2c%5bjm73T)<*wS+X%pfpWn3DIu_>(c6w$ko-m3b
> zx-lTZ4IrBCu?GW}+`pU%53R)*)U_DEb^rB*L4wwCc=!;OPuM4*=0ZLtK0(zt>56gq
> z!MMt*N>(<_^g(6o9*6S{S3XDQ;W;%EI`8bt at 4xmwdf9VfhoYWe+|Vpn at 9C1ATQ3#l
> zH==)}ZrWK at DgEZrG}Ot93MLr!A=<B&wcZR at 49E<Y(_aS<A<bX=hmi7 at evOFt#17~Y
> zGh4zUhe$d(TjLiFkKk22LDJe5dehxmC-AX2Rz+}YXE=kqCIgJ-4Kd&n3&=x_>EhpE
> zM|;$C7-nHEo}ZzEc+s at d;G$_IZ`!te(Dp>%V*iZ}sL5VgxFDRb?XL4?xWm-C$y~qU
> zMtso&$&9-ynQ=Us+JFfZm^0 at jzIk*Qfb*02cxe2|q1ODZOeTH;GBIycY at y}kP}-Z1
> zvug$?@xm2$*X>Xi>`Mg#IRb(Rk;A|;Guu)@gb4s-j6!Ey>QSB7%%;D3w6frd^qSkI
> z`HJnq-}nY_;fT!llY^*Rpr$c!B#+(Cc=ll;s9d{-u{-UTSJmXp!CaRI|FA#!pxXa@
> zRh*xB?LkQn#W==iX?4C;{5+s^QtgW9x5#JVbtq(oK0Hf=V9;z>u|s_!;&}&)1SMum
> zg at qF^vtnK_0go9(saq!CIY}=zWXKY?OobZgc3mk=(?pz<dE1qe>JAPrsqSE?qynfL
> zmWd$wE9pZJBYAL`UT>v04MtxiLlw}6FHOXArhUy$&s7=7ns3>b<7vljpOX&Dz0=EV
> z2(40pk5)L2#!C~B(f8@$a48N&w}&|$hr-z8!>5UK;v{UIeyT94!m&TbW%#?XU3Vb%
> zkj5VT*YCvT;WJ^-Iu$Jc=or>I@?vIK#Z at X~$+5ZH(ws5QXCVB4=nIqZJHsnW{nbd?
> zL4<-WSt7ukurf;Y?0d7>2X(pz`-GXaYBF9eOr<9$<NL#xmzt_kfk_HemebM#kVEg#
> z2MX{^F-)QR3UG!P_VKIV7GS}&bF{@Uy{xU&Qu(zh-h?7r>Mb+BPHdYF?~#@%jU#E`
> zTAY#iqOoOzC3h<USG^^dCc at KT$!$WkU<!UBvnRd+Wmu}V>fxDb8F~7wrK)Kp1Q`n7
> zS(cF<ODt8-ouXY+ at GBq<pS%uFtl4E~S#O#0w97K``|6fs at m3TA!Q;VYCUc3;L;Aw9
> zv4!9^1j<lp$tiY$n*qYbvSh(6&vN}s`$O(w;2sU`2^RZk#M}xCTdoH;Be*4&S|zEn
> zSVEz&5#SydPm2n1+=87GEe4x=pUIMBS=CZhn6gXXQmih^u_j^iiuE51sTClt=J8|P
> z2Iwqd_Fy_on9b>olgrr=?AF_}_tCcs at m-+CCr-s<fT~NUVsj0Mc5apf!5$I^3#o@<
> zL(i~5hSn;OGk{z^Sz%mX>Ral2yC1>@iVD}AOz2d)%zlUE`L}k-5yj7vm9oq7cpI|5
> ztk-`Mc4hB6(H6vy6g?8r))d6Ih}{C4>U;1%RZH-H8OG()E$soo^fFSWHx<e*ck0-<
> zX+Itx#$bZmD5GDqRNdpBbxgK<XMtol^9cZ#Ck(>;<ocQ4*|Oi`>xuDn%79hu!Ar}O
> zTV0r*I3}H7v${LkUL#kg#3llND`yG2bUdo0UiTuSo{Oqt^UoXUMhiBLKAB*7<ZmhR
> z=;CG4N at fdD5ch(}3%(Z$-pk at bycO(lerq-T!h)wJe9jKKhMZH%Mda9zs`Pjq^zSK}
> zI}PWL<3la-hbu#^Fr`AZ&Hk8OoGTegtT&B~Y)jJgGG7YaI1OJ{!y`q-hi0_ at Kauz?
> z0rve!K5bpRmE)QB39n#OVZ_M<DCBIHp;x1>l^*CROgWjr7c6%M(#|^==JRc=LPE4+
> zXXb^#5<enZ(YXF2+3HQ7NIF~wPpq=f9=y0*S?2zkt)B6Q)G&1jlD?U>=S9<eOoYHo
> z0f8|Ny4H#p3)j8#trcTISolsy5pX?t8cVPSo^+ at UZ-B>k8$geR^rQ{v2pP23hST9O
> zVmf|)>O$brrNGaI)&)z=)rs5ME6jozJB^h327I=)gI~HCm80OL?h)|c-ECGw(2LXY
> zC`idv3b`(%6{UDNd>ty~$#<6GrNT;j^9=k5JWkHQLlRa>7Z79tk!O_V-+{JO6(rP#
> z`Bu`v44e&NGG^jByb!)$pUIQ`VkVwGirGCU`ZDT*@1W9{MJV2hg!o2;TZ&&h;^Tgs
> zG))4?qZz&oT51Qak0r3oj+3B38|`>_(n={EGA)Wtg-m0rwG|aaUvQ(yvUS;ULi9>$
> z4obYJ>(Lez^Rjf>@h^gj{`-268)afDDeW!y7W-Dt_oKpd;k}_-P~KffV`pKzFp18e
> zg_DIcx^@<x7B at uQ3-^0||E{>+KKjut{Pw~%c68y*|2Yl843hT at IegJ^JpK>|LAB3<
> zCd*~9d$=d|AMxs*hR|Mz1)d>l7`_Oe?vD86hZC4+0X{9D|1QH%l`!nE-TJIvZ+Wfw
> z?6E|)z!Hj(MoO)k40h0;-B%1QPx~1umbOANGLixOdZPGBke#;9#zR2&IXW9Nd!ZlI
> zM{GI14mewRIi6}>?5~rG#iwN4jmf=$p}w=BM;6)p+JAHDfDiVye at S<j<09Qy0MKoa
> z-o<h}CWafs0IE&%rkCSj6O?!S4LJRVrw$;(4_g4oKXGfQMnO|=o*4`-bB?#8?l^E?
> z&T-x@(3|s69Lh)OXgp8kF24413fw1n&G3CY<hAPtJT>`6QY%Z{LjSx at U?+o!WQIL>
> z&rLLN1D*}lxxNCgo^S`pey^MtE{Fs6G_|TRkK;wJxt}d}7Bk(MnOFH%(C!NSn6QFA
> zbR)i2c#*c;h;Iv5O->LuIf=RnPq>{G_YL1MGJ~J1$iI|*M9c8JYM;WEi`Zl-AP^BW
> zz!znS<f3sTg4~O4Ad!484*2=Tx^(JZ9N@*-AOx1NZ at T>^K$SoYJyD0E+tS)}eNp`z
> zUw|Z?ZP{(5>{=c)R|bBe%<}_(z5Kl^e(>_kyMAvmo6QO~xb*$*2a&hfGeP;bN9&HU
> z_uX-hT{~?TG<oi@!7&e}Kq%8ExaLGSFeye at PqX=FPK!fS$PO;r5dB85^&38s*hmaq
> zU&rbq*{1gMf~-^Kd9ZB}0{RWKcV=`MLHS-pOg7Ybjc-K*W at c>6fX#(v5e5>GMW#{k
> z_0aFU^za-!BKgHqs~D6exxAt{IykU{i3He5NP#&xxn>^M`M)4KhL5i_xF4VC=n7Nb
> zXRA5Pj_xm?$q+)B$1N2^w3L|keFy&;mmQbGF4x-8rA1eW1HQHnlH%ynD}!bFJu~~i
> zb~&uZcbeuhM*I(YbRIsO&NfVisU20Cf{bi`(x!1B7r2Y!Vc&H3&G at d#yUqyZ7trY@
> zJB)($#1KZ1pd4)#d)`$(KoZd at 7sXXX@~w$Ej56)$rvhjo<Qc7;pfhj5Q-v(L{uaDw
> z$j_eSxfvL}nqM^v>E?H%jC0sGo(5QmG&-dcP>O{*D{=bdpV_6IqC_;Y7$rBQ`u^pK
> z_&;}19pY1#(;ev!iQEZ at xwn$fM2)=_C+XHrN#BB$&9odo%*?oFQClj>L751Vdw at NB
> z%<jNtxB0SQzUyeit$6CRn>?XCY`<)DUu0&H?3jy-(q3 at 6sB`-Q8v;mnz1i?)BeBT@
> zG{?KhE+E)-Z1&BPbFhF)RX8(gbb*tgs;%0{z3Y1`_;N={1tvyi8!fH^g`%J!ZxaHd
> z9ZlC(;Zy)*TdVNH?0Br(_!?2=Z8&F~*_IkSr35SDf~Sbqr&EH;ttgdfHwsONO_Z>m
> z9i at 4KsUp9@*^usgo3`GDhm3ifq^Y)*{hk|7Gtd8Vb at 3?Ox8XM;>)Z#34%k<e9VySh
> z^ZI;TBE$i(bAPJb+A`$;s*oTFtum!)0e)WSdgp}&_$fj7^qt&lTq8hHUth$_|Is2m
> zJe$oGnH^~k!C~D%IDc3|!bl;X`ROLEru;L8u1H{oQFq{+1m=A&X;%*m8*~V7`5pKM
> z!A`f|frn?lU6INrjzH35hBDzxXGfh0%#anWQEs*5ezc7l9o&J3O*|M-0Wk23fX#?N
> zYgIhk44z8We!!b%dExkx-ZN+#Fa>R2pm+jW2{Fem#tAh88;;bCMeGfr>!U|gY>j{^
> zc!c8oT^VYWhI?R?8=EV4JueHpzTVXC&8S)u`7`I8N4Q8EurXlUl%XI#R-mhj=3@%6
> zJ-F}*KBp_x_!i5E?K}dIAae7fk*yBpH+KC8t2aN-$Pp-EccL}@o48y9c3AJRYe4?W
> z`N#rR=&EHx{IU3|wPF>wuQHL)fudX%nE_1_uUXc3hR9k^9H4;5nURuIq?mbNIZZBN
> zHnM79J~PN>zpk;P|2#qOyc6eH7xXB0S%k3A{Jq7h^r%aK!ld<<dea?Qu}eu9{K846
> zC(Mq{20R}R6tv7^gU0^+PCOaLWyD>0>hx-22maFU-)KpC?<8OdV1nGt*y=D9Mtsue
> z&K^6*x}<C_i6sB-)yNq<EVB)UxRz(FOX!n#0iI%0SNre6vnF+(l<G|m<VmYq8_Z-I
> zur6tv@=pB+SWqg-ytDxtDxVoSdDGd(e%1r7X;7+yyYZy!9z2Ha=(m`o;j+*JT0sxH
> zN(}wBkpJJxl`xasL0syNF<EF at 3ltl{8pxGJTkgi0(eJC9rPLz`<~r!NcjG6Zu1oI0
> zlg9COVo*k9#B&t>Hl6LcVdm3^Rzj!t?^6B+1og-F;9G<}G-C;0CoWrpM@?W!d~SUO
> zN%Cl7m-XIs_TDzFEtMNArti95wvu~y0mWQ#r>`%;H$wct5|B0z1~-s<WmE55rVLiy
> z9ozu;%FfVw)wS%scP{v{uUjt(+)u+?;QPjbc%W8PT at QX~5DzL*H5}gAv2u2JPY7<P
> zx6aj|Ajy%7?7`dqzPTv4p{hmdVW`O_Ar!mWT(+zxohekzV9he at U>9w<7Y`SP(xdkR
> z8(Bt6?}NfFqg(F-W at 4cG@57Uz^?te!-zh#dk<Psz*9*Jo*Z1QkV)R66djMzO5+P@*
> zqr at J3FWSSWyg+&63p|~9T^iQVxAleg at s)JO6Bnu>1?RALLEv!bopp6xfzIi`rqUd?
> zbDF2}e;C(wvEF0}w~nNT9>5dFTTuZ at 5}5P~@EzRPPWXvju8%xXByHb9PD*w*T-p}8
> zTo4b at kq?4W at d_<_5LCZE!MHU5G!J9vXW090s{oLf<3rT>AWpJ#tE!08vRT$~dhTN9
> z^R-PQ^X<WdW?q5AY_(iE2B<8Z%-mOFM`s>%UzE)(n*w7J+p}NGX2+=b5dI{a!J2;p
> zlg-(600tp5-oUI+et)jK4rx7FHVeyO4efadub#{T1LPpN>|Aj`K~i&`Z`7W=xtQRJ
> zE%nvU{nlWZyK+Z|Z)t-LSnUwDqlh0nxoasNlgcO8YEP&Ja=ts%$u*^Q&$2)*pV0Cz
> z#jhqu at Nv*@2g5qWr5?U=^WF5VW%zc at QUaoc#xKXW*E|8}Ob5713&X9tTd!KM&U>-j
> zz{F*bzB`P$^hn*|sx9lhw}}?yUtW(vMnCGOEZr*qn8<J!OMTu={iEyV^@BmrE$<F|
> zl~}8-dLYJ^8?=50Je}0P9Mr)D^o|uUR9~b&t-uL$*pX*~HJnlSytcvnA7z2<eY~vQ
> z_Z?($)1V!c!JF3&&hX~PuYB3^_D2FNuUrW<jp*8yAU8)*{VF_4*T0)+$|^iUdQb2B
> ziq2n!KaRIHTI&dsO~!bHY$jA=Nwzl7!qs^A at OrlnMU$bjnHg4odIwv^hAvEytL?#m
> zeM#4>#({Y2R_o$jsNvgsu{n>FHiYfTQ+CqzYjDOyNOolgYEYD&4EFbEHyx4%w$+cR
> z9qo&%mT0 at V>G(_sl92*^YcaeJ`sEs&Amq`@YXFZlQp>|Qt;V{wK`{9dIz6r{$=C?u
> zBpdk5D!KaCFWE>@4*AB)8SJLcf87YAy0yWjENgIE=MrR`BNT5sO?x~a-gp8Dx4EO+
> zAwPGZxN!8+#_n49f4aNQ@|d-;snIga+OTh7Lx*gg_76ybwAEDXL;^r1V^v-a{qAA>
> zWRb=l{z-&#0;p~$pDNnPiEL+RtE-LG!KYWILmg(4Gka^5qf^rLrm at 2NWy%M8ZQz<m
> z_pHUUa%5$r2eW&@U|^b|3el_zK0Q=G_uO7+YG8LKH?V5Zv_}9ao9IoC;4~3F*F1tP
> z?78m|JSluZ;7Fj1xFFdIdifDNA*p(b$tbl}OffZPkfL4I-4)H^o>-o1 at uN5=vdI--
> zb64Ineu>4}M{%lIRz~^j%2%Koxr5cYHKG6$<d+>Lzhsq&pq!!mAH`!5!r0UlTf>#j
> z(DB2egemsmCtGQNd0GZMGr)61$a4*~K8E92S#N#}oAJ|14Sn=6wG!JO!->PJjRk0{
> zzM*~3_&pP$Lq6^lyN0$WLKigBlaJw=nB)Gsg7~e7U1PwGDEikgw0a$W1)SHjjZJ<{
> zx0X9^qeK6MM-9nwSOJr*hP<<Q5wq>V6Zg}b|Ac1=o%E$Y;mqsed!SKg+~0%Y|4{1*
> zQb?{Z$bSLt4U=~kNZSzGCpFX9dV;+V_Ol0PJwe4kgLo*XbN`GNrXTk^3Pz-$w$yH+
> z^^i;;pD1E-CqteFc7T#S_|G@!7k|co5?-J!HF%EjwEDQ025NAA&2cuj(5qp`FOiW%
> z+bWa$e2>d6-)cvevh0kjD_*W{OD!0Zh`NP}8%Pv+*&h5 at c58iOI}GQrwGkQl38cRA
> zS~T1qeELaO(v=P^L#{Z!hrR5|wK1+RwjAtR1!4EPv1te0P4G%+!+N;`3Y!MXp0(cO
> z`;6u}usQkNZc*`UGFwd~xx1FPq8S1Kp!m3&KH$K&#$D&I$|gC&3pD3D#?-@)-=n7-
> zINQuho+Y2Y2 at _qtNjbwTL5RI#8i at o2<#l`Ti3)0}1^wy}T~LeDZ(yNEs#{qc8s$^p
> zF}cW_9{R at 0r>!M}z9r>T5CxIUMfI@<?b-cqYzEYxMo-p)3_ngQ>VReJrAz8S{i1YR
> z9d!MZw5twJin$5!|4aw3sqFGQlx1|RjK=_9nJ?pcLJoaPX6$9zi(i$$jI<3)3U+SQ
> zd%_y-1|VV}Ga8l<hdsD?o?A=qsamW5`HFlA6a(9N60rJTO7bjkl%za&9$Kf^hxrzh
> zVyh<6>MgN^myDE)WmALBTf(;qmys;r9db20;^}z1OI_cN at e9iI)?dS+n7_iHf1qGl
> zqMosUvaYIXL6X}&pA#LZn5F(YU=nAc$J6U-0jb9lQ7%!A`)m15V;FNEdFj at A7;Eh6
> z--Gq|D<PIPt;Y)&orS?Uf^B7nfC)0%x9~!pZ!=&%bwA*Pvea7Y+wA^T7QsIW-Y&`*
> z-iE>3&oYz5!{JSl^(-5B`;Tm3n~&kGgKu(9_HCv&Z-DlEnaUgRQg+kJ29-%oY`~8V
> znGQ6R;QHab$POKAvdSgIpd6=18n9VdK|34pDB(*Q`#3~DL#>bF+o2=3KMs&_zV%L&
> ztSsAH)X+hD0L*nmU%;R){+emroar74r1ADg#7fTk@(4NaARpR;8}f-Yq|Uv>w)TL_
> zT=%aFE(A|?vAb7aT5y3Bozp9=b4^6ow4iTp-}S)EUxLQ1WsTe4QnX+r at ZB!DWFsDx
> z4BVQy{q<0hj5DtCZec2;B){XlsC-KIY{cfw1 at 2G$n6V{(g-Vt^SaOT|=pdI&aH*gd
> zH{w at HKJ6CdML=hx?ZKim<v4gJko8RF2H&UPdw!`E2)`Khaw0c(^PNNBUJ-KdgFL@|
> z0_TqlMdO~ML!Q6<A(AQN{u at Lp+=R!~d}<H&?JunW$D14o;Ia)0mo5|KQ*S2JZUo?)
> zbmprZWB%;e&4Dlu7KZuBRvxz&AON`k-!WxJD6X|X3<nJ98FIDqX-`yt1m&0-3`z~2
> z@}kW!x{LB?)MlIvA}@C{&J~~BMsMDXYlci!Og3ZGex- at rLw0#{m9svd@(oos<Eb$f
> z%**f{c=1&U<t#0D66ZuqMA!C%=O-AZRzkpW*^_v9`VA~BK4Zyo{YdWN2bZ~ilN_Z8
> z6C*ICxUCjt2W@>4$Jey4Htr%bRc6bQ=oB5Mb63`JAr<3n$dMfYktKK37ZIJ;_Ua7c
> zDx2$?=$#KbM}kWun_7yEMilQYwIm&x=u5YmjCXl&bPe^EBBOA&Jr=%~_|lo5ceb}w
> zHpM#;yJNU--)H1rtsNyfJW<MWw!o&CtMsD5TdF9`D2)X<^c_Pq0Mn1M&D5R6qyvcm
> z5EQVH6;PSPtC<>VlAO-}oD=1<%I5_Y!$eDR$=ZTt!@>$GUI?>1f8<WO`zbuFhPPo9
> zw&b*r?%%E8(LgP-I>mFL9SuB07=)Ne?v_eW7PMYA(Moa105tV6=@=_cebbdtw|;+?
> z;{SVA%Qc;8g~EtaT}DezNkl=6R;)@C!<`RT7&n|eBUsVFVIIu<E1pH8TPD{)Ba{(?
> z%@man4WuIm_6=X-y|XJ;)&-wY=&$uA8^K-5uiu-xlB_rbDLcG2hgJDIz=kO2!^%4q
> z#z2DA=$vftJ2_f;ho5EMck~klV27tuN=I2xdlV+h8Omk0O|erXE at -X(h36rRf(~Ax
> zAZ2Xt5#M3j*NA5i=bar^sx+xb=mAUdlMc{4!|Z)))9I3@@r%Ptpj&Q}5DABFx&@vQ
> zisHVhb-iC`F89ea?HQaQe$Yl|J_8E%S9IAk*qnOMy2UZMSE}1sas)vIFGxiH_xJ-t
> zWCwZ8-uFQgZG8q$#!kgS6&A@!W1q#@>AVZVOP~wn{!VIZ{sI$CfSoJjv?LV===^8#
> zq)}?X)&2FcJW?D`)>x7b|L9w8Glf6uy^)Y#<Z>+JDr at M$XK`u?kC5_4e}qzGnk^a8
> z)+!@EIQ0_$Mre!GxHZDMjELv!%2%QwzqxpJJR)1h#+59mBevk=gy)!(EP~@!P_+E}
> zQhzV;OTIK(u?3q|A{+KOlz)@D)urCb&03))SDzytNP{B0HjoZ}Q2!9_^33!dzEoRQ
> z;d(>v;D*1|3g-gD{yUIDu8jP(pG0xX<5wL5_x%Zcw=v6O@~Su2FG_L50A)9nrcpnX
> zP}o5up2M@}G_g7v8^!tLT)ox0#Tnt33Q(@7eB+KOtGDL%*O*nuiZWtZEz9cA2%`5G
> znVV!HTcFdUtY~C}RY2UI?tTs at kJ?h at 6r}nh&x!sd&f~sPB6z}q{u5-uTAdit??bzv
> z!<jW6msa^)8Ox6$y&NF!Xm%(UVS6$?F8z7I-uFnhj7e6v0KN|OGI8G@;`|RiGxk)_
> z-<#ZSy;I$WIe$8vOBx)yMhza`+#g)-U`x+r23h2rJQkNMcWL=%!5O65H(6ymn)B?A
> z6$T7{((n$vTNZtj;q7ixBxB!XQpy*vgS$)ln+R`3{0*S@?n3Kgt6sJ$FWO>-MYiz*
> z9YV2j((h0#D-5gl<B^PosSGTFahu&CQqTEhuur%pXQTg}DvG}o#{CK?HgW4@&JaxY
> zz6Yn(J-$C;(`lnq*t$Og_)~Vg5#6&t0>z;iqfvOCE_oiO)U56T{EFglf&adZ^LfKs
> z*$K}MGdZL9U+@<T7sK7!E#Fwpn+#{CcZu?JsGrVi+ at _Tm{TgmDlt=}QBf_|F=}^uV
> z7)OW>t5i*PRG4bll`TTrqnge$UCbKUb*0pX<(8bPxlo at C@@-CUj_)G7ae(L)zr$3Z
> z83DA%cs<dves|iGgPSbHjbvr~v&;h8h*6v}Q%++#bMUXKKq4+ySm;M5=lOhW7<!Z@
> zTKxhHw#z+3l(Ri4K8X{GnGuS|#7N;cvnz>{1O>9<1mwK7ExX0A&jiR&*K%!L5QOUq
> zXV{ZMOBm7B1$`1TmaqqZeTAK{&Q*1mdB?e^!O}4Lx{zqj0)}y~<@sxh0|ip8C{?2!
> zzL90spx(N8qnSpCvI&|itZJlaIuXgru9iG{I&}7add**OX7cAgpC_|wq>z18fH^$C
> zn!f;6Uva1MJU{2lpg>qToy>sR8IMK-qc<osU#KWHUJP%S03Ndwmw2P~b+MTsPOXcG
> z%O3nko{TI>P$2X|7`teLzZ+|zUhP1o!5`V=>aWa-%R^i)9nZzYatXAz7LlYG{Djt{
> zu4uJ$ZASPvF~bO&w+*MyI~iyXlt_&zi*)>ucE0Xv+z|ajKW<>G4v>_I3G@|Pc79Mt
> z8r&OQ#fw*k!7u!1688!AJVUA>|1{dN4Nr<YX){ItZC{Pw;ho)9Q}GJ^K{-hM+pu}w
> zj(w?KoAMSrt_sb89!%rp6y?X|BD%dTwP(I;0=2Bj-sgH2dgz7|x!`t_AG@^R%2u2D
> zTpRoX$Ox9fC*B*~Q=QY4Dth;eIKAeiU$Esxf9Ad2lfi|&Mgo4M_**RJHEj4CZ#yq`
> zOYF^c3oEFcLF~{SQIZKkFAI$E8NBmV?7~95dz|f%WxHbohfkbhE*}ktuQtZn?7`nZ
> zP$%MoV`QOaJlg{&S)K>M7PTEGBzqjz`F%*wDT#~_0g7K+>Nk{E{_>Pet=n<Ym~k#$
> z`Ab5K+Fv~t6;e$Q0K!=|$m$4d&AzQw4FXrLdS0Y^w&N1vFzw!sZx}T;;5w>zE^jMk
> z7qhh7xUa}Fim^=3oC0Y(aIjw$hZS0K2N$vr>;PoC>~6Ys2QI1k#>Eg>FwhflvFGm>
> z88$@-O?Tf)!T{)-<!nwkE<Vyx`Aew$Xc_O=yIeC_;yi4Ll!+vzN|{;gkXBkHBow1n
> z;jRJ_21-xgsw^m6fEBv$i-P#=qHHz7z?CY1-5^@!#Q8B*%Cq|$>VmT9;f1;EquZQ#
> zcnv2w{VV+h#~4-CRgB6C<B}MF$U9)D5uoD7c#PLAIh7MbjCW*#CQGa at 0&-H1QQz{(
> zph2l;(%juIZJ7}^Xy|=QpC_hz>u*t2C><HUFYby5GB7%)ROxk*Ry-1*TX((J)~zv`
> z(8+oYJ4=NTghv^RGv>N9EF8x5VZ?C0Uh$vTIIIn(ctDv>3%K{o&L;ZIPJD~-DOGmj
> zNi|iEBj40wNm>aUA;c_wQ-SB%f!pnc24^$48Eop{m$hte7dlC!nw<r68G&`CIjp4p
> zYVoPL>5BNYJYF2|c?#l(fes)ogQnBe{LY%MQ&YAa^_F+j?Jr at ywyw+9ql}@uUjmJ`
> ziJp21FHZlY{24Tqp~;?Gx?=d2HCCc^<rwXSF=v2LPw9e}vDvI<xt=jN6&cALtQ&j%
> z>bBj$0_uDjkHOH(^yJGpY4KV}IJrO?CL$v$RlYeRu*;Nr7Fj$Cwmvxz6y_|*;yOk*
> zz2C~%lfu({jhkpyx!IOr-YAzHp<JSP$YU&B(5=dL;o)Q6t~aZmzg;BS_-6@>gp0kz
> zz|JIM_XRSt?uv&Ycthnc^`~glE}X6rfL)c)s%AW5=;g5iho5b~3I28<;0Rb>ong5a
> zhR>7Dc&dSE6ZbQyMn7-HlWYDHa7inW)8l5Bc>Ld8A|+hu5}${43dl_;>kl)eWoSo*
> zQCwHHjGP4a*Qpk0gTCO^*97aOLVf{A6si{5gny$pAxp3b<txzL(1!nFHNNy{Ij%t;
> zOCT at Y8NPGCMN8Z!^fED4wFtw}ToU2Ca4L~C-9?3ATIUB!RfAZ!VgKV&29Zd0alW*Y
> z<W`uU*ngk__-OFgw*syTOh$tWqqmu)6~Id)7{gM=y7i2<1ue_;_w0a+=jG)fy9S|6
> z-ucLizAP_68#)i23%{atMSA<|&1&mA4Dz&stS-L^t&|0$NaC1K_6%X9#uC0bKxn at n
> z0V-IeQo*wCxCkdq<a=_Cg{z&~dyu=X4!CN{pACM`jGa8m#|*%Dr@;4{oE+|9$;+7@
> zJ}2E<&HgXcu?_&X#}fXVjDhGlB^=A;GH0ZUj)sX<TLo?p*gIXlwWYTns3lSDoCasX
> ztFMc!bG*^T!Qef?6kvnwCkKQ4-3iZT_yt_-*ekD%4^#<oYvffZ_f1RA>|Om-0V?=0
> zhpF=qn8<iwVAi0LR=<i942nCkS0Y8e*C=@v$B%w{mv0f|nCRB_O1>1}ABfCUCm7iE
> z47}%WbF)jag1<yj*Q+?SW at i63?q5q-xnA8sNarC(5o$zeaL>h#Wj)6fWu}4wBg*8m
> z4b3Uy>exZ1j>Q&uXDe%flTP#jJUo2RmKQtCd%LnmHW?cc6dslO4p$&?-ARoxmc+Kb
> z;t2#?3zRje0@=#ux}pb?ndP0$2ligRT7~8q11^T%0oR&1TDuB^#5VS$HO^0~(bf~;
> z4C}bV00%|TgDrSQIESn;5^G-?^%_n}QXRtjCl#1fE|6Yetit*lo)FG!95a=Jv_HRw
> zhej!W5O?v2&2ei%4Swl0yt3wrOH7y0fbjbdpvl9X;<;$H<3cSNsfLp6Q%sP<F7;4+
> zCT)G=7|DNy*-|Re at a;JoR!ZME?{-;I5ARgNDc`uX?8pgb4<%!U=q>k`5X)=DfqIkW
> ziITN)hp2o`n_kDc3+gsjU=%^@mTM2U+N^O&`;NZ0R~gxsQfdS=VcgK<TRz~IqNoJD
> zEGulf3mudu)dY*<{2Abry)~)AL}oUWR3NlUjp;~XvFM05aPkbnj=}<bug&aAB$oBg
> z^_GO*?+hu<&xf8b$fz*tq?hg4SM82{OW6TD6(~GinL-I9CM==b-oRs`3)KC}(xt#o
> zu5_Pz0}ltk%WvRoi+IltVLbJeD((v-Dn0-;e&=y5yt&w0dlGBQe~JGbI5&#C%ww&#
> z<Q$5p%XZ at _A~5LPyK&JBL^|A)ZN{Og&>^a6w~2ju(>$Y@@fzEr^w$Jn6Fzdz6Hm^`
> zrLCVAPiR=#I;*LmA)AzJI?YxG|C&fA{uO6c?(Xya3 at r{!@$g!kX=u84w#p*;SB8JR
> zceY<!@g|w5JnU~EVahuH<9<CmpUa5+2A|hvLI;V?dy`)~B{N<EUjz5i`@Hn6zv6|$
> zZ8UZdo-~O!z|dJ&E;I0WLlb*L*u);2FCsb3I+Te-Gzr0AdE-mpdb(~8UQ@#+NPv8j
> z3vjbI&_tm*2epZYu2H2kpd6<p5<RmT1=)dA<>+!kRkaW%w|l%?WtNx?;Ts3qQUfOf
> zMSS>04jz8-UfxN30CMuA%iqK!V at C2ry^1{}o!3+$oUY8IufK_JyaBK*e1-v^W!I-%
> zW}FFF!}Jgm+6t&>LO)&EgXd?1zLF~=-_yz|hsl-HBPbs#>*|72(&Le`nWNY1TXA~0
> zN-S2cv#f2!sX8{%s8P&xJA6d*lWrt{%}i<fbu9h36;BY}YTApFvQ at 8hbDt$bIjE+L
> z43>V}V<<x|WAREk{1YQ%i%Snv>t38@@h&7T_Xybx<Fv?PIAmkC28`y7sMf})69{0-
> zrU;uUVS#rx`<8PzMF11rV#`Zd=)Ijf_u^}6M4K`Z<StVMOvJ@%imamTh{SB{1J0{O
> zr7?amMBt~a at H;EG-%t)!Ibj5xvdJlvyX}4Vt>eZuE+#xk2ejvC07A!ziFKn}v!|xH
> zW{N%d`V;D~)BMa2WC4LlPBX3j69WWWb`&dr@<h%>sLvBtwN{7>xt;W2aQhvqJJ|v*
> zW9O7CFPnqDJE39zAep~rbn{wOhy^q<#OJj&I{+$2DQ~gKQsreSk6cr8SPNkP-_6L5
> zCbWkpegDfMSr(Tp2LOO-uM4$k;ZcohKE%%40#$(@^%`hkHa@|pdAm8qf~uCjq2Ra2
> zVGYsGGZ3bNT@%4lLB`rCRwPAOHK2 at qax_jxrIVLQN9@6e_EoHW!dj2YFnN%5 at I!n0
> zrp_mbnGD_K&_a`INiMSuc)eb&hj%{R^f#PUUj6*hSoV#aNJl_5LwfZcpp{MyXLO=z
> zp=l)#J5$#l+<!AG3eieN(#SR#wwzH9Alneu)P at sl9{mzHq<^EK*tjaZT~oRpA>}p?
> z-h!XOtf at I4ZHIC%6K6p&iz-%btdy(E at CTF^`&uY=9uzwmd at 9ghm~zsq9JC^mz;+4~
> zm$Ku$!)tTCRb|4u^TM7P%}|)vRtFrV6)?JPs-3t`v*&?5HGkdn(`#dxSS1~yCfr<w
> zL~Rq_t=;!E{N~B1H$yoEq#t234oe!$KZhj&|4fs^TgLk?fSMBFTL=G<&Z#XELHtT=
> z%~M8FzT<vkCH%f^;3eT~(gFs at VdXOXADJtg<RU;@&H(ShdQ*HO+Hz(5|Kuhv&{J<y
> z#~GW4<%x`8Y)0h at q{9V3QF)kTEB7f6!*84KI{LudI5RXq+rW5&H at m7)7*lWdd>M)|
> zgs~C!QyB>xtj?m>+V|;N9@%%gFa^HCHVG|Zp4ck`ZrE1NiB;V&%cEh1j0dQ}CXl8b
> zFAg|MiL1(pnNGR8w9z!XrgBT|oeU at X=R$_*ym2eg^JQ}h{wH690C~lWnEVY$tNE&;
> z<OwfZ0ZMX~@&l;X>y#gqbv}!-8Ad-#*1 at N0jpT(=6J)&zz0k7!oveNBA=ke!*G=a5
> z81xs8!KWg0FAo at lwhqi}KU=aKq}^oJe3r*cA_f at iaNdMDgPQQ;eK_;l%brM5O$c#b
> zne|K2 at CMDPS|;Smr#&Y_4VrLugVNl0aB>YqztVmwLkG7XU$sd4qfV4^&A^<!IxGF0
> zELc%uL|+1w{y7E_+9h@;rAOqqDUIT60EzRtZIKg(iOM?WtCU=Wwlvw=^~z`c)t6CE
> zbpLGiTq6?OJMV_r1HLe#e!A%SmUpZlsdN9B(HvkqXTa=tgwW;lrOSXmSJvKHwwPqF
> z9S8Q{f5*D;3CWYvcGPoufO^LS|64>loXgv^Ek*kT6*}$9YFQ4@<u6Z~<KdrmEF_}!
> z3qFZ1+mF*1u2S#0n2CfY(TI!{Mq+9ZeAg-${I%!nWz;QhTXm+W{DQDy*Ya+$A&b8|
> z#Agu#0>2r$R#&xEWVBM-)7C#e+&WoOEkh4&rQQ2sWIUz3<k7JMxD;l%Bl<P*nCKBk
> z26!6a8D_*}r0;e3XZJEjw at j6#7K?LYOQG^TxQzz4NO<PLGpchsyp8G-kB?*hH+%(<
> z at _yh5D#z$>N5~S%VObweX<qFuhUcm_RMT?{jB>GgB1Da7UTusck)0Yjqh;N>NS?^k
> zmYkb6^)LN#SdlY`m1GmEHyvu&&1D+M2fxE3`YPEFR=(MSE1W3NFF at t=3?(YxSYJWa
> zn`g=$`+|;aV({8r+O`R)n@(@i?@OgU3K##H%WbKfXFhHvVcvxflRLb>xei;|X=}>O
> zklA~5<^eo<qH at wGA+0UC1I0>6n05}BP_-=V){_Mh(MV9f+4J!xVGG`EkkOvVHWARY
> z9 at L4~58&gPxAv at 6UZ!i`#rZnB5eJX?T50RMI3a0m;BcVGi7Tqn#H#3%k^R`>a0Tsn
> z7uyO;mY*^*0sA2n%1i+F^$TFoKc9txFq!CiFIT&x)Cn(}am0zx<ZbmqJWbe4od at yc
> zaLfQByBfIm&-Bbed~40uZd`Bm6afWJRK8}{MAjF1ri8wbIH~^)=UEI#PTGt at KHpte
> z?J+4|yUzCe3O@|Q(DkQ;4a!nvB)2r(Y;{V>9%Cr}EqwGZQTYL>qX*u at QxjO3I_${t
> zvny4MBlG7PNn-mj-&-{5eVimvI`Vyd?eGWHtD`~uu;UzLmR!I6_mPwI&+lV%99uG(
> z$d*jH9Sjvif=%?T_wj?1zmww7D7nKLCu at n0Et}fW3+ZFyW}Z5pD!q(GRXN4DDkmNS
> z;yVF+vz2sdB^s+_(3?NNqjKg+7>#rdf&a1WbVqoOa`8q66#ZDJR&|z~BNyrGAK<Aq
> zzkZLpE?cn)DLd at wkrnLbdF71fQsMkhC!NHFQJ+p?rcJ~uO+Z<`$&gr<JJx{|7Aszj
> z1#qdB<j8_t?VB8meV)&+<j7XGT2-}G(DT9|K~m?eh>6!J_?3a=hRLEFN}Mip;e_dv
> zNwzGs0f?c+ZF)J=j_gmcU0bpm2R(l;v`rS<o5StqP4YQF+R1W<!WuJNU4H`D^RWvL
> zuX)fCKJ#mjrtrpH55e2FUq=3wofxH2=CLdInBLIzj;sTrH4gx6T9?rk9S~&Ad51F3
> zW<+zl1-4Mu)U0j<QkSMcK{V`o2!0RBuEK{ton(1z<`&BvGaDTyw#lfsg75B#P<G1Y
> z1<xhw_55>~vXd at r$7zY1zwisPs}kvrppdHyk&#<Eyxxw@(@&}gy9B>dEl7hN{_NZP
> z=KyKPWk&0 at 2-s>>qA)2?r0gJP*dp7e6qin#OLV6s8(P%j$y6$- at eodq97kLz9-!bt
> z5(Wx?!6BSo)8P{N_M{Bo2usq3kficq1ro}Xb)<7jdZPq-Tt at T$J*4^XdmJFbr?H(d
> zMk!>!xR#{uuCNEcJRaC(8TMX_?<@G<<ogO#{){d|GqxIu)e`nzBfC%4yS-QI-40()
> z_|JW>r5P8*NXVD50HQRiQJQgA1bFT0l$ckS)|b)m$D#trs+Ju at uvERb%W9S*o3<R%
> z764mjw;l8)Y%*6RN|!^6uem^Xn8(eag@^I|ak;EbpkZ&QSWMXAx8X1#4;;p3VFvy7
> zFrHjAx_|h6I2s1z5N}%ZL{=Ym(+H9X?k@;vlAufl=k6KLv at SIxWhoT7k<LAWGqd57
> zWx%pRhNclNsTb`T at 5xYR7Nfc0E~$BZ=g at P*l^N7|1W!n+ at D?l27aKdmk4tQ4RLi7*
> zi#Q7l-+X}ncm$8Gd2g=lsy8t^3TtLYbrT}lo6Yv%=f$Af{j%u at KN78*WJBJom=f{%
> zHT->DF9`h4^Lj=8CBu6zfEo!v&DRXmffCiB{F5nC%|$>jI_LD`(yJxS*PToVO<G)(
> zU6zgSHCkSO&pfyJU6Nx>*INrDJrp6anwj!_j`_ at ntFR1;x&K3aL(&L21El_K-tEoS
> zN+S{XSjWareSc4pZv-_R#W at MxdnObL!+ZAR7e+k!+n(|8erfl3 at T@+HP4nN|#LP#n
> zSgtOJ+kl#Djj1HOxu{t(jw6xq9-$l}?9Rkm$alS4+SCqtp9>rcn0D5Q7;wY|Wb;`Y
> zv}dBbn9;toVkNRR7XtUSx_*UG{_Rm*B)m^Y9K)l82k7<3_$Jr8;VXR9o;({uOL#f9
> z9mDC#4=})k%;K`vL!cX6@{K at 7aoO=ng(**!(XWr;w1SMe?cp+8q`r;Wk1BsM!oMu|
> z+$S_pykek;zl{~I>vHK%Xjw|Ez<qsV#i{SniEcb at a!cSP^~k@#OM#;Qv+V5^i;)#*
> zW~A5ls>@;OJlk~{YVd*^XF}0kZhX&TJ2~w%c*~ih!S>b2CT}?@QqDL`&M8;E9aiUc
> z{a^c1Ns+VAoBo4DI at lF>bEl(Vrwng3zE|h_(S7jtDA8Z6oBIk1djB71Zyp~-kv@!9
> zcULAelWTH8LP9b*$iWd3&H!PUBtu{@h5 at 36Y?KIy%6fo7L>EmBX)r)UL`<<RtAoZ6
> zkHxG;#N(?SKo}7bk3n!9IfR(>pgZA^5QohBRQDvn?)&}x-p}uknXay@>v-z9>ZzwJ
> z1tVcTH+&9IIUiwrw|Q)gE@~X<^^9<pRT}OcUm17bt at POEz-A>Gs`+KE36=K=!9+{a
> znO%`<bme_~jv<m?Mwm-JEyV5JzMR&>Z1uWQSapUK_TPcl$J46~r$w~o^g-OfHF7SW
> z0oyOKbk7!7$W5^qSS({q?A^Y-p1lTSU+R9z8R0|e7K45kTctOySN$w at ZViT)_tsha
> z#yw6QhlCt{+}-r(Az_s6QFicg+M)kxrJ65<?9qysfe%n6!h#6gsJ)m8==MJ|m9l-Q
> z)&IvP5Vp at SZw5_fSl>zXt}le)yxd1Od?6$x!~>l at y?wphXG)uS8m4^%Gw^Rh1rNaJ
> zNnZ$KlamnQirp`Hl7Jnb<9>+^E66HyVmLIH#nPz5LIz)0LMI;<GKXe3FSyP#ooN&D
> z>;)N at Gy|4%0CXTTWPR$ekZLmbN;;sAF^v&GA=7~+8Rp7{<=$sLBk2H+GRlz_Ifq&d
> z;eJ>0!E5rfcpe!kzjC}s$<s-HIxLI=2nzjDNaA4tMt&*8@$Ln*<V&Gu-t9nCQaga8
> zbsCsLK;Ft6nSz*qwQ^NVukRK4Tzl`;GO5QE0w8^crAnhAZqz~HYOyq&uR(fd;LCid
> zFu!FlPIe|hn?sKXdBX;=Jw{Rp!?PR!-b_x}Q|v`b1yN9eq3l%@23Z##5z=Z|WEMnb
> zK&0N2WJZa^uo-FOm!+XD+~aXx at wErO6a-&Nu}xzd{=c4b>ey}t8cj4vjX5&#$!zFV
> zp=`BtL~@robT_XTAjO^6*Nfep0ZRlHOvh(b605u7)o9GHF%)WSudEI-T(rwpI{Ygk
> z;f^Gd7UO`a+>GWLmT|?3ea2YzYu9rBb8VU(C>kn<Z#ANh{a$<5AT{1Gh2>d`%v+JB
> zvKmJ~<=ej!3Ky_}5M;@j8km3{SD0+QUTGsI_veW8Eb_DvoxIVMT{X@$>9h0h^hPc!
> z2=Ss|2ttByKQjiF`<RtK3|BG?4m;Uha8$?)-bi+uvOjx(E<GwF41U1OApkhB`b at Qp
> zx1U1AD67#bH_`1!h4B+xF7lUxE(`9g`e4_~H+<~4J8P!jPnpwC`2iT+VpIIO<L)$A
> zE|zJZ7spWj*T7HMMeaky_PWf5xKJ~y#~lau5I{GJO1!$c6<5~y^6v$tf01n~<;=Q$
> z at zz(EG|VitIt~<s+dk_oQ}flOU(csW%_)803E<1Jt^QRXc!T68y=zMl^2 at p2brx7J
> zuJIzLq`m3+;&#_)kyl<`vmhS1vOwH+WQFE%#c}NDn at fAcyCW;gw4*o<xKUu|Ry|`u
> z9C8_$cn5D#F-9((7^J+_Qq4EQ_}jL4*8<)@+gj8rwtjX=@xJ?M-yXzHU_z!RK&al&
> z_QFKT>VJ(|`<_|ATwE4BWc!Sih!3;t=ls)|I7AA?hndN`-vns~>E>^Q5w-7&?9w#<
> z&UX(CVyC@&Vh3!bn}EYjBMaMJw)#K5;53RUB}U_PLnPPYYa*JqY49n%^SlKaEnd-r
> z7JTGg(^@35EuAH-#HZVxKY at HT-B4|Z{6K4(*d-qhcJ1R9Xuvx at k`q}RhjQuUZv`W7
> z&!tu03fWvDUH7e!oVS|YoKPkp@{6|YB6 at PpepqFRruYN(Vv#(>Y4|0~7DGZib-jaB
> z;qrye^w_sT@!hTi<JfsKh9F%dl>(wXMU<QoEViVNuc^4QaitqrQHgDP9BklV-VZAI
> zwkZ|I61|%1*=_F8t`NthrcdyAlt4B>?5c_@^;PtV?}Q=zptH2`JK>h%CKqGM*j;N%
> zq52~CXuBDKlmt}O*jU=0+5CR57R0CpOlO4&5_+=$-1Q)j#9iRX-PXREcWAmx7|s2S
> zmb-*J?nS!JB at 7D&(NggV`;JSPF)7>mFJ{&5Gs{-e{-3MeZicl!X5bA{9Ao?6=$K<d
> zcJLbXD#`@RyYQGWJMEf?fq^LK<$%X2gwUMU*(AAVL(}+1EG3G;;xzdh{qC6XD0hv{
> z`W~dPYf3uvO+L)Cllf9ma)yBDp{5K`Q`m`ONJ)YeZ6GD=rj$WasHjs at tp29a*VCBD
> zWA#6}p{b_%QuBLF<E;MX!JdCxM*H8f8BiS692e$|es%KbdSi2`=hkM<v&+U2gM7di
> zK{T=naU=#hp@(Oz$0@%rf9lDUFVXtrLLwiuhc+J<Y*E}l8Yd|FtfR2h^j3eww^Vxq
> zXf&kfpAd?<xpegj;rXzkQdmDI9k9{FAB4=1*`CQ3Lx|p#{b)KZ`#~6-_Yw1?ET+g0
> z!CE6kb=1~3szH^A#;jMLqdrr&BCLMHgS7DnAtmqQ=EvPduIMIIj*zbsIdG*`Qrw`%
> z1UW-o!2_T5F at FK9dfNGe@L=s=m$Ip;xb5R9X$9QIRAba#G7_PN!cxwxTq)DaS^I|V
> zcgB+p9*7cCx^26yAoT4AP4Uhqi;?@yJqL*Ec@`rMH)TUyF6VXM2>`XmH=`i&k)hq|
> zA?GT&q;-~@QD8W0ib^JfAcp86s#J+8qCfphn8fANxF3ZlxpTDfM`0rOAU*P<FnEdv
> zh1d2;$?)&*W)3xmcsWT+61xSqdSTc(?;55>BZ;lE)SFNa=pbCm!qn&%)=!Ufg;|h$
> z-SL>F3BVd=0Yeb*$Z at c=X{9T8;7x2^4uhDZ7-{`xSB&DGK1!HPRp0s~`kPxwiC5+e
> z=bEw)?qOSJSRe at wK?;^%rCC1-sp$<fm3 at z;*FBH3Y3lcu&ks^u<UjP2FgSY&PC at tM
> zJaV7azx-aCfNa*jiHCv3&x#RH0ua~e_H-!>vfn{>{UpTe^dQ_#w)$IsqDOxcVp3n5
> z at 4{}2wePhFsv~=AU*e}uXl7!&vhmmV>oBT0DU42-%9^VgYRY~PGwTD#*k+_^Tb5g?
> z?WB+fxM0Oep&%x4VHuBB!)LQ94T>&urRNvA|D=$bx*&IVa at iV$E9<#%rdYK0ElBX%
> z$x?Qxi_Em5#$>8JB at 7=l!5;%-Atl3T3~erHPiS4!91Ifp%u_;LrWT~)9%i7*4%Gvr
> z7bm-H2J%rUl63U@%2mOd07zaqCFJGdey<yzsZEaq?)ng9ix}0sT-7M4du^;^y62U3
> zQ+`@lGN#V$oW##2Tu)qANVBstKU5>1w)VYn&DUOEc){+v>}v<M=i}CP+ib$u`K^6*
> zpV9NDg`C7KUj=e>`q}~eXIuN8U%}K744CPJGs2|W2TKgPc@>8GS46XEl5 at Mo9P*x=
> z1ybO2QGme;V%lyTaOnH?lOkv0|EClByT|H(@|ya5?|v(qxrMD<Y(NQ~<p3ZzU7mF_
> zt07JC71^p$7CA*S974|s`r8>HI(v}a?EIbCYo+*M41$=L{@_m6P{&`$Oo!l}OEN7+
> zv>JwYE*<`}kWd at RJW{bSb$zY62T>IV&Jc^i at QP=$DqXN4G`!+Yl~WKx at iuSmDUm-D
> z(G{c^sP(nSGaz<``<MyH_cxXKUh!wBo-8-sJSBP?o09bY!vPGSn;&m7)pKWubOs#Z
> zG=I?alu74Ir=33wDcsLge^wY4!qA-q)((2eNhhBbMg*<2`rmcYrDui5M<^9*HnWOv
> ztk-e%i%@lsLrDi%a8}UpbHbpi`hS6Nx?LJnxhg&O2y{7ExUu=c0`n1e^$ml7ma#8#
> zW7!5e8!Vs1_Tai<HPwFz&<!j33L-|PP9co;J_^hoqU4+qJ9_m^6|Pn)d}5$NMhWbM
> z;Z%^ZtbOtG=>BtpF(&?2AkfV8s;~1)SYq>))!lPWm>*lJ*kg at yjW9<$6x%F+t?Z&p
> zI)w3&4*`po;=0BfSh5-!V3oYpA*7^bNO1uKTyHT({L?+hX;9E_3XDR%B{$+-_np++
> zA*AY)|8OdMv43u&iN6R5!_MZU%{<F&VynFC%$-;?nxbc(RXR`Lv*VqDwXgBdwCWed
> zrOE1Fgz3{~!(@GIF`ze;2?*>30r-uTBKk3>^Ax1N3#28O)fBkx<iC;LoEwnd1Ah|{
> z;G1Q98k4A>JFK1sgsuvJZ~^to5A|Qt0eLS=5xqgzKgIonxkyq_#zURL?Yz at V4|EC^
> z{rG~)I4)8Cr at V#6bP2<v6G?_>R-C&LwqA2mr_Q9MT|!~8g=D%6WN#}crg}D$CCn?o
> z-7M(`ym?7vxKgZL{zMA0VZUD<0r(>t6 at 0E$abRTuJ=!JQ0u(Ay7SiL|x+Mc?R`ulS
> zXbCn&onIjf6K|`OBG~bepo4ZUkoZ3=v8|S at 6CLh?Rv@`ogZ?YeUY6$~r{=K*A#<~(
> z(!dRE$AENZxXS5SS;!7Dd2Fr%8s!o41YSN$XL^KN#vf(ArAUeA=)m2DHHx~JxfEIb
> z_JelL_A03qB at _fiHIZn^aD`AhJ;JmI6Nm(Om#H~^*E9wH4LT1i^g)_`Ua)CK#S|n$
> z)TZ-7TI8$%=ic6`unVjHME9N-=8aGdGrkvt+L-UTqfTdkOPu=xr$|3w0_C(r|I<dz
> zzY1fyFX at V3g^##2n){oOVns{?W?*gv)1*kb30HH>4c1VvT_oz5XoSF+sJ2<{3i27a
> z?MBHl!IV9FF at 5njVOsDJQ7RY-Ek5;|kX-n>QunXE9WV at L($4lJv;r&BuV`VVwSXCp
> zuoV1XDVUo7Eez$V=w1I7ii1>tP|g1a0$N26{aaXH`;er&(N|PMio3`swdZaB;!JT@
> z&d!kShxcRhYW-ptPnsZRn9sO#+X12BZg^j^Q>t9%$7H%ImejrYYUAcJC7pwJTF*@H
> zjM1hdZfDUCzq=xvKR+XMhH5#)l?o)}#n?u426z1)VBUZ-W+>a8<~jarEh6!5xKwv(
> zEy4D5+r##X?d_))c42RjGvjI at J?j-lfEZxt7E)?AH1pn#WjwdetM at E#D!~rKZyMQX
> z-BC!mXG%A5^?GlEh`QH%*Ldr_cCTnhUfiu~;7)NM>;B!7>0Q^rd!OzO_TqZ3TX)I`
> z0 at N1tC_<I1MhQKMRToK4XF^A3XJ|)9*#+*;m8%4yC$e%?5HJ_qLf53qRdiRkFnH4K
> zkg>fp0{%aRY_s7xr7IQwO=TCknU%|C%yT8c+up7?_}>q4rpi_RXs<@H(!Oq>b0gUe
> zU9dQK?=z=9hYDucBJ35Dq#^w5y(kNXBUCC#>G0&BpJ`Au7{!9j9FBO`pvq-#)|NQ0
> z2GU}^VYVd1i^Z3py|hW5aw+_Bgp=hBg1kYc29Dik{*LP_kEW8CL%o`A+`!ix8+938
> z(Hp$p3`^{8FAp5l5fRyv?G^tVbV}D1W8;|+(Hbe6=$;G0mfIJfwHq0f0B!*sb7;Hb
> z2=3w5Xdn=uF+&Ylh#Dp3V|Nk6`tP|H(jS3o5l8`<LG<pqUOh at Caq<TsS6MeC*6UlJ
> zlT)eVq7WOL3WAJ5&Y&M(6sCc+;kzhgFM5uh)psd2K9?O*fX5P%YdQ#p`i4?lG|Fmx
> z&gx$|)p^ki!omgM&bqbDAT(clk!W0FV%{d&)<OA>RQ(0c8*CegxO#JAWVxOAz4o3I
> zHqLSmt-l1T_z?a0k}!)u^dr??1{r(Bc{=>EFpi)4B(1(IByg>CH9U0BU*seVO<7GH
> zmxUyjDqR**#-8xC1A7 at vbR>)UKk(Hu(;46^3T*@x)UnIB at 9VbX70BRTpd5eL=9xib
> zeiyQ$KCuCGa`|)W_^ov(G$#EgHd^+(FnHqbxAH#FFq%?(c-Qzq==fV>1EHTi(*T2O
> zD-4J;L?bPVL80&rKUhk)|1R8G`((=m$K)ckDn!DL3Gz|)R)$fKV}fT(%Y?RIb(;g;
> zMzFU)N<qs6TMRKPe$+TQ;BE~>n{n_Pqd0Um%S;)`E at JA7eL(SDeCU$`PqwXwytoJ9
> zY7`5zS6*68M$n~KgrwSqAC(IJu06<-tNkl*jIlN&Dt~?b?u?dy#z5XZ$dvtE9K;W9
> zNNivh2?lYv`%dO07iz!8Y=LddP(kw(L|U6-juAt#5ygmrX2fT#DC$!46h0ay5vvtN
> z3}eTG#Ud*T*UQJmOe-4k7%)IWZ*38^w=(}-#jS-5c-9t+$m0xzH!<e$YNL8UX8s&s
> zoo_@(dAEJ{f-aEPRqFZmW_Af&?_$7!Z}t|6l4xwj<Y&XfBm!!*FrN);hp;Ea42JMM
> zVhW3^%wYOfrfscduj1_ at Cz{#y67nUM0Wycf2Tkk<(bYTDBJ-nK%h+ at I5e5mwOscJY
> zu2PWIEv;51{#y~XTI-Ds{67v=Y7M@&<kqs*_2OfYveoyduZ&3iGNkv60m5EsFrf1w
> z9Z4OFyP^Z9{GccMfet5`vcK+ZyeeeH%>S~rlv!0SU+d*sXTWodJd+k&1rXmzE3OLj
> z!fb&e_b9Y~&s8Bsr%|QwF3tOAt_lJdJPMbSk)Bd|zE>#BTi#mNTFz>$_)0yaP|-><
> z+4~(IvM;qhE!JB7%jS7GcA>Y`U-vz|>knXSoV!mV19`ODUX_A4HV<nq)5bqw;Zu6-
> z4`F#oKC?iUKVeEcI at c$Rz4cCj!IxA6GgwczL<uNVp4nQ+BQ(w0H-C^6#}v at YJ%_3a
> zx^I3Wyah2=duTQZuG9tzqE<AMg;sw^82!d46ea0e>ehYm+6T=a?EIhw7SNyAEh$aj
> z5~Fc;MG9x5W3CC7;d0;Zm&InQ|NUZ1Btp%f@?()+Y+!bDhDcw#l%;GI<s$t7Kw{T~
> zn4$=O^JC5LG+*@0A?x3trj$%>p4j{du`*9wA7pz at ibj|xk7th6-%-N)#9)5Jr2hL@
> zJ;Q0wHDNUOFwN=%`nFus%1&3XV#$b`co*L*K+ltyBc#t&Z<9uH+HT|#(YF>_{SRFP
> zBz&0!^KTPuMRVsc`HRPd9Wz~G?W>r1=2WM)JV=nFAY}|$isGnk#{ti9eh~>{JFv|&
> zuKPZz-DoafG|gWM*#fRnBFYyD(vcX)QzfBDxr-e#w)RD|n0ykm7J?iM4Q4XGi$nJ+
> zzCD1y!JCn$drfzpwXgO$N#~jB3@$;s@(L8Zi=936Oa)1(K#FOe;*5gH0uI%RLbHHk
> zL`m6tVs*sICt6~g{}Q+iK9(go=Kum6$+Q4c1(QXry>yvh7#HI?*@=tLeOi|Q|IDgL
> z>zPVF^b6y;JnHoe#@Y{#w`H4AUHWbvJEy{spCYN0wDPUR*1jcMp>k8;Yzfj6#V8r+
> zpJz0WVG9vZj_zCaK2XT1^K3D&|EW?Et|2<x^GIYz?!UtpV at Rm`)`Oakb0o7fNF3%8
> zEQSaNqz%o6#N3cEOs`}`AzJ40k_qe#m+5xC at D@%PcE7w_(#Vn%J`JRE5tFaj at VJdI
> zR7R!mR?o>7F5%G$%R9JEp*I3xA{?5b_k7~a6gdcm$jhmT!zr`ZGH{3S94Uf8bo4jI
> zgR+}w_|YKZEN0#=AAecV^h{#^rx!L)?ifTgok0-ukreFGLw{#Nvqrdr$meB?{Ojp1
> z4#$Vwbs%x;KF<pk2v*299G)^C8mKgGu%QP1$>(Syz2nqm`T5FK8ckDSL&{r)5O0R3
> zS<!!-_B<y$>_v8?D6QqpF>#@0Lkr)S+a5_WTR~D<DL8cpvHS^L!s98!wi2m%vUg4M
> z6mK2$UeDC$T)un3?qsLF-}%}%ar6L>m#`hc908|rCTbIK?4+~eFf+n~qc93>YE_%m
> zJ5D`lbct))7LyLEy;XfTy?C{!>8}u at BlmkO^d$i=9CNRmIc4!`J<kIUNoai<LU(y#
> z_zW18yXUhr#Rx!XOEA3O#%6Q&zvvi at r*b`X8OF)+Kf>y=<naDE25gUk=X`j^7I3dk
> zpe+~=;|k~zjOTGhG&Kl2YQMSaT`OfXZTv&27lKR)*6;ES&AcOO1819Fdww^Dn8R&6
> zi`&4pq`=#LM`V63ya_F-jwsU<$j>$F+js~aW+6yL&3cmE8fo=EJlz`^19Fl#3jY1J
> z2y(mp7#XfwTh2Lxa-Rvc(LxQ52~y{@QiF#E70Qpu&(qZ!oD%V5%OqE#Xe==URxE<_
> zw={Td?e>5x&y at e0rkzSRYTA`O?g34^*A8#v+-a16c(nxJ&}{YB>{sqbDr7Qj%_kt;
> z6#n08Rq6 at UYWOb&z7&jO|1^<#od5qS>n;PNs1)_u8&@&+Q}ESg at YNaKwTk<#c=!!5
> z>AwB=VjVecvlA`QpvP#g7RP2<-DQqR>Rz8$bn)FH^P6C2?$#H1TFf{OdA>7ce^W&t
> z(Be at OUve@>R`HdqFm?vJbWW`co2=hhTpH7?kX)Al|28Hqw>t4o`{aSbE9g-z&aSm8
> zp5o%2!AfS0Qcx{o)28+=md~pN%z4{Gp%8Hot7qH7cKFyy=5na at X{KDO8ROAm8&sao
> z@=995n<jl at f&2~bVJ;o;B|`|`a5ubfzZA at Bpms06Hl-9W4_&3hku$bRk&L;JB`Jb1
> z|3wK_e_MhR at IHZmrC}kKWylYWv;Aii`x^+A at 1aL^ctZZd9#i(W$W;;8V^xOHyB57o
> zVty&^0{+4jujDYeW>nVe(i=M0qQKOe^mxX+&G6A=#u8Mva3L<C(!mZN2Z|V7VUQZr
> zI#Zl&^}jh!3K>YTDXy_6xzk)m5XF~qlgeH}sZcfzn$<~<>v48MwL7zs^ZYIf1`H7G
> zgaoha4E*=FPST_hoR%^cR{vnNbi1a~z-d`o=q}4Bu#9wJ2+od%dfpl%3cJSo4uV8~
> znn?1y^ra9yBFttnM9yNo6yvMtu at HPK_byEj#aaB*@6fVPd<*voeK8bg)Yf$PK8s01
> zI^SnLW0SecOHw*Dp7$-wB2PAa1w!&Ea?rt*8w7vHxUL{2zN6tQv%#!uoLw2msX2db
> z_^K=jso_fvUu}tN9NiJoDIAD!sU`ks_^O}5{Z=%^e|w(HP+TuFq#S#L7J at N=QAQZR
> z7Fr&LM+MId=(g*_ at JQn$7s+t8yYNo4wJ+!v=WHB{IHEHfy!@7YYhTo9`dt_v8@;Oe
> zn%CX|LVIN{AMF}KG%y}R!f`_85%tnFATk}wsmXj_d%q=i;KOezoM%-y9>L9^_2D?B
> zHpey{aTmB!9^Fg$rq!)$F9DgjW9cP`F>6>`?%3m+uROh;ovqUWBbz20HzS*XVmxlg
> z1iMu|?*#uK)!<hNXUnNQ1 at exu@i~yYweGpLq*`aAmCWh|@#>%F94kvAe(|>z0(&!P
> zH|JP6vjoMVw!*%_yE%lF>zJch78K!lmSt&)aI9=9C^7oIW{&3_&-M*&iD+=L&fW3g
> z<h0Fba+<*i<#e6`x-0?@nR%(HC#J*z{EuP%Q}r`UlfM1YVvhby&ay2+O%@bnEUm8X
> zW}b_GI1C-wY)eC-^}%)i|0;2qeiMQ3j2%-)#5C6T6Qh8js-Y}uG2nuj1&Nl2?T8dx
> zP_3<G8Q||4aU0!gz!{|r5+|n`(B#z3#+E<(q|&_Fj)F-G5<NxCI-ZrO*EALa1kUM<
> zEiphjgShPlaa(wsnVjAm>L_jxB8uYD1^oQ&f1{d6oTgi4Hy;5;EF_YSQC at d5AJ2V}
> z!St?3oWuveL!XMo6}-+%k4NIMR_3iu&yKOkD)$hC;#@qD+14}jGSRz)9k(U3$bBV!
> z{1X*d>h$i>2jXn6qJr7`P>^Rn<PTwN-y?Hqc@!Q!aWmt6TYqRcD at s6^_%l*xM8jDU
> z3 at cagfN0U`a$as|XC#aMv*!=jzX91B3m$m;S^8lV&WixDhqt+l+4&_UvNsB+)js6v
> zW)V!r6^#}nTD1qci}xT=0x5Sf$gA<D$G`pV^$jgnaX7riU5i$yr at qf(j&aFZd(gG$
> zhQz>>X(8^I8V8~8<?jRWE9I;YkPVUY7(`-UU(*6Ih2|NP{*!H1fBNeOdSP%c3?~`v
> z`LETG1cJ*onPgauK?aY~W-3MF!6`5HUkpr4Q-8CyTKjaz6-lE1?HAe;ji-!tuT25Q
> z68J!S8M`aazgG&9my_XE|L^Q at pRO@n;@27h-T*CpH_~F{Ho0%5OJeYhVGj`<vr5Dc
> zq+vJPD=T9-WBhmP$t=emB at s{i<y`tr41R{Q(&|_|B`nW*1vsPG%x#8TL0cfoIum20
> zy}%Wrst}M55 at Bxdwfdjv^0g0yclp{KLW9=*QbFk3&te;jX9L|9^fe}qHsrd-jCTtP
> zV0K0h!t1$b>Fz=JWr1xyR1C(}VRH=vnx<Hnp^kB+y-U}R<-W@&86d(FtN#I!9vF->
> z!>le1yAi$&1l89m?HvqwIIM}L$6*Wq`ZsiG98R0Klt at xIS*m(xfI7-82Cmzb{oRU7
> zn0)LWK6 at _;7s>9Iy|`Pr5Jc{+^NX)RWv|iwaX6bBPJfHTw{iDSOFYg>f8!6L?a^Jt
> zR{vi%hy+T8LOJC=_&WbZK`A$lZjJ|ju!HW7$Hq|2Cz4SG51<Zb;_;Nx5o|+eck%_h
> z$T!xD)os%*0mJgR;$afRGG&*>SLn9vd>U;=yt|5)4#CMO9Y<&NDxb0X at 6EI$r%rwA
> z?|DlZZ5V=wj&0(TP&k>zn~?Sr=PqKx4+DvN-euX_7O;2#l{ci|f${XxABW%}{LcNf
> zX9!M-{j!;ZX&x({y7Mz20>ScDDNa5|a}scTw3A7}Bs=yikTJK5AZ)Z$(#iy!#?7Qp
> zCE&?JLVmLw%Xrk-jJ$QQtezz?jmwzAW6AyWn*?B^-=Ky>Jfik_n2ZSCLim1thB6&h
> zY&yujZJ)Zc*BXgV-dabbRNzyLdxV{4uW&q(&q4Z*^3Grd2_S&4hlz9`@_z)zaq(qH
> zukKMObv>chwevoAfy~s6(Usd`j(a&tCmOv1{V)+fQX4YP6+%xCj?7?|Jl7spx6?yn
> z0Ow6awFJ3hiM at a0gw-i1I)1YBGUv{4rI&3%5v>BV8|q6^oNdn#tN#hBdgZIqMb}_2
> zZZmF~R2gT`u`B)nfy3(j<}ZzAktZ|wY3yxf at V}&Uu2am)Whfqz5+)84xz?v`(@2ul
> zzc>QWS~#Cf!nSZ{j9sw4`Qx;2D4qh6#pEQQpha{^5-#M1(Uv4UG%PTFK`)uIT_fo?
> zN%&8Lza$;X#0`?qwZ}M$cg`#=H%H1&YDvcP25*Hi4TTZT1_l5)b^ogRQ|#yp-IWY8
> zR8G$)<MDZcK5PEY>TEvV_A=|WXQ$Qw^=)=DlkgND9saL}HJVX63HHpPbB*{xZZ4IK
> zIDz{s{m}>nqVyx`Gve$~UjR4>_ThnZqQB-uP5rPWSek>4{1)Yj_~$>5EXf6$l(#XI
> z&P~Ci$1 at WL6!{MybBvTO8h4pRV at si;RzV at TR>V`lopY?nP-;b?Q`v^Ei7PhJ-6?oj
> ztqi~wDH_GQMS<PjYem}b5~RDM0`YAvV?}P4a>EW#MdqadKBE0*Ab)Tm|A|2U1OJsD
> zBtq?nO8yj4qqs}5Lri-h|2r&y?TrOsbYFuO-(^M7W-H<jLyOPA`w?jUn~?T8{5}mF
> zD=1_>=b^I4*^F3`eha&y-clW0h+ZbxvK*nyoVcO4T1 at M;T9|swf6JRpAvgV5w%-WE
> z%xXmmkH~jndLk7MHB3J#qTbp|0GP~+$@KG7lLjo8kzMOz_(8e-;VMXHoO(?+*Q<ur
> zOYKW{2A;c^@)Dl!dAa(7z#nPY>8P20KP>x4E{W(ORL(qMLrXq{60^wNtkf-SOkv34
> zNj1Fv!^={PN_Zz^^)Co$(UIb3P2Vf1R|mK(45zb!lfRZC7%2=1m2=q9Zb{2v1R;H<
> zde5F1xbe)h5-_Gqp6?WT!{zB}J at OH#slr_(&o3D)%`u=28CH~5CC~4PQ|^1c!+PB^
> zl at eC1p<2(f+#(-iERp9e&uA-3`a9$D=8g1`4!$ddnLH7xS5O-HfJ%5&I82Cuco<LJ
> z6ZENcoKq6g at 5xc)c>$sDHdhcc^oK5=?FjA+cJU$zFs>fY34o0+nB8Uvf5F~a^1?d6
> zGAO)EWyv;#(hKQ8wSrF5{9$;S^$TV1`!AA at jfg(fjN+tbbGy(4V^9!kJH)m){URF=
> zWi)lYflC`)+m(hgJI5bEIM>KtDh<O);p;yxSq6|=vo6te|FLoO{4kt3_A7>q8Tj{d
> zD)?)Tso)&ERRw?b)8ZP at Y{^At(|lJCEy=*QjB=7p_=cl5uA~~8zDW16{In_l7$O>r
> zQFvVORH<R_ at b(vAJ3h(4NwqLUDLh|kR1A4+OzUe!5n0j{nDa?6Xom1XB09q<!#7wG
> zDy|S-2`4CFtb`MluvQ5tDPe;Wj#9!#B|KCKn at g%^BlEr6a6gP4n_^?b!qhs0PWkL&
> zDw|dI7XHibWch2ay=@v~T6TeBL&xS=K1PVDI1csE#!Mhw6>OT2Vbcnm!GHKgEqgPd
> zP4D$=DoC^)l0rQ%7*Y6p00P>E;QlmMXk*#udNy0-2+gcSGlM)Y7!2X>DJ=~H%&1pN
> zg-b#GC6tsD<$fNl*4R_Ykjb<!!mX#QD5Z^MG#WO&N6WHsVy)+`{AFwS%2oUjk)7V1
> z&01`z-V`kw4UyqVjYz4sdQ(DAD#NJ>3*htB;VB~O8OE4l748EyB#TlYcQhdBPnDW(
> zssjKDDYX=+wLtS~p?y}r?N?==2Sq=xdgg~_-hP+2_M@&|*7G7XGK5{|3Y>S-^`%y+
> z<;Td!m>GqCJ&~BdKb9Am)~G#*8QrV%_5p%P*~WZ7sCQ3^+#ceJh0r1AuQ`uQm1 at 6|
> z_aG^3V3N0efCe%@|0w~n0I-%aq))ZSJ5zJ`_m{w at k^_Ss7kI`7o=^33F&r764;@JH
> z+12TR>3T{`E(m}7b%>qpvj>RQ4hAD7qZH^54`tg=y))g#uw*6}*j?QM(koU}$E+yM
> zqAu at Ep>)V_{7mf)2Ifk~HOgp40vC${?TA!b913YFct^sp3V=iSK>Cx+RZhazfnH1O
> zrZRxr9c16W2<Z75&m!n`i)SOVAU}4A-B26QWbEkRYrA5Zb(cej^XwDVW+<l3Y_h`w
> z9|#A=rhuV3K!VZ#Ywn0ZZUf7y4l*=3I?(HRP{(Hl4}9~O6&b at ys}U?Uqpl$Qo7%@z
> z9NHUcMOaYDZ*L?cry`J3tXJ_*NSTU%pf{mD;;?rVb&d!?t6>BG(xHxpT|#@DD+QL@
> zpxzbg06)`O6d78B48-_(2x}rr36HMK;xx#JbZ1gs{MyqF!KtSiBXPoluVF}eSFHR~
> zr55WvFJPNc!!8{-{<}+GSuN;9Tv^Qpi$djn{BJPu08X=qDdzTHSUW{YM8Au_ul;>p
> zR0Pqm3vK0N@)@FKelI*P{Qfkq=HH}_k+3*f%%|j2yXjTyIrxTwe{+d}7-HbbAfH`<
> z)(UdO^l#YP1<rG at 6<EmW|6p(3Tq_Wd=|@_Fto|9hTbY0U|B;V<z%`_NU at v&-n<t<)
> z#J|~SX)i2a#GwNtRm`;E-On>~(yZsIy3v@<7_pW!3D&a~BTqdqc&?b at zwdP4%0kQ-
> z_WMptF2Buvr%Sg4s4E+-7><9_6m315BUsNhu#)Fo(d^nxrG|I at qlT0~4ez?|^zCQf
> zBYP`YyjyYlWV-)&E?H8tc?e9()(veybt)=q>fT@(KoGhER>C-XY7`(;rOx9qz%LvE
> zlA-lne?RQLmH7u%D`1yokl;Ydw+eCTe{;ESwJky;EAOlLH#-^#&~l6|J81|TkQlV)
> zO~u;-0O^KzK?05pd;zJwsASzZjx4!c6m)~!ka6(!jI2X;GmQ6Um^DSUK~BM2HU9?C
> zt^7&{$9#8;|Haa!^+^?5?ctsmVjw5|EeGdLK)xz(@Yh`iwOpV{Z&;9ufLQZjjWjc9
> z&})a<v<&&gzCz1K<NR7-wYmTpefQd{5WCd{NY at KYMX&hH8KC#yhbpvqM{j{ji}h_q
> z)wo79+R{+gt~tBr8lq8_)qnL522~{Zs-02h?+*iIwn6W9DA#(kQVq}+H~h}9b9Le<
> z<|{B$ZFtK><?_`7Y#I3XG0vznJzzh42RZFF%9S)f7aOs@&GR~~%EcL}&?JRd+8f^<
> zr`F*?MMmxY&_rd^LElE3a&cPr<5ABN?xvowV(oTg4nK7dh?0+~I<5_E)SHX{vS2$j
> z`UEt(T~RZRa*kBxkmAGY)3Tbu#rG`NIrkjrP!xoCNk at V$2IK^I-EPShx?EcJ9(*+L
> z{wqv8u%wD(`q$~9JP?Gx52YP>ctTvDF?-q0XRFXt*AI<!+!&mxC at St61KcyBWDHKb
> z^_qXu&!{t=1mjqwvtIL$fww4;GlU~vWi>8>aQZ!K at C?TZJRRwP-{oCVio4Axl$l}M
> zb``yeB- at iny-@S$HfY}#Xy0C63IIm}pq*1nTevIss9FMZQS=^rw?#1DgGJ9#^H`k4
> z!^kcji&Mf at GpA?3Y%07o-8L2v%}#I06Vp{*_IRmdxx2{f?*$?y8cmZwY1!J4Kc^lY
> z4>IXLX`w%j#bfwR|NBwna4?sqRFR*n0VcEKp02QdZwgRLmBqjhgC*2J3&!L0+D}^6
> zns+Df%)N$*<&wQeNB5gTtlr58qf6XZ8e*|t>m1XFrLg9)K<4$$d6IU=*!`NfFR)87
> z9RGBuGhdetM=M(*PbuX{x{;X&D$MPG9-DoWyUUb)BA+Y)uGHbqWGFl+v}11<Jvkoh
> zs?=%g!PaZtMb1mWX)aV at Xk%#p*cbVZ#a#nt6iQWphN@;N#*EpvR}r5-?+spFsZRCA
> z(4%HXVr_Luainl!JGD%}DfckcyKfWMA#?^PHZ0`*^2$oB5Cjr_Mo$O}^B6)J76Qph
> z!{BSm6?vt?vQLy(I<XZE-s=+J{}slAMlbP69jTpRuoxAN6Q=CY1f0mjTy##rnenv^
> zN6Vh~|LT)~+$EOpKz`HGPg=xNAhu^s#ChCdS~(F<=f0+niFhb?jD9i^4~ECFiFnE#
> zZ1&O_URE9RkoLVHl}0YCf61NjGQrEGu^=JHC6u6Cn>hSnXis}TZ*jusE-FF6sDX3o
> zdv^E7{t!d&%f~6vBT1?vx7qEd)rB3BPPgadQQW`ip?sXD3*a=vA&MvAd|p>iO_OkD
> zt(W13>tAH-bK}a-LwYhqjY`Qkrh5{ZLV6c-ZfKPBzz~Ms*kYf<vP>zx4BDHaBCwEj
> zhW47r0Y9N^W=wuZM7zfIL;MfbBvYJKP+&XcE;6VFy!{y0Fqd9pt>Z4xoXPl3W-jx?
> zc7W`!P1!#jrrRdtJGdXIcQPJVIyuJ9++PMWaRFAWzF?&7P?OinZrn7=)QKHanV>As
> z;1No62^KU>`Z=XDT`X+fXYHFDp%@Zbm4lmolfI+Nrr@}I&u1mkey<s=;Y&uM2**mf
> zw{KJ5;Fbx#y;8P(u00bOPz(rO7Sr&nJw?Wbnt-0fLZvCVIIO2AHKryoVisyBz{RzP
> z8ZDpe$_>c;xwbJ0FzCa8WiU)I at G!mkrpizEn3h6KHeAy)%07KZsY(9>IUWo{o2m>_
> z53HONlm0~Kj?(L~|H^{cK at eMgQ!Gf at Js~Fj at rD~?lm1ojE^^N&8S;B|ev|(Dvo{s_
> zn0gDamGjccQ*m<0m-5%UliQ}TL8ObP;*{|xFLQyZw3rvgkmhBd4>^<A87F2aSS-B=
> zi#5%>)6ksf4DX-TAGP$usW^S|MvMHVD4A<S0`e|XaS6?noI}`EgO&Hi^xRm(&NY?y
> zao5X_q;V#kIw-{QLYw)OIE2O{WKZ9hZa-a+_u3F at GvV=E1zl&tdDfFvUgQP*9o&h5
> z at wf%%S5do!t at TN;w2GK>oc at mfD7wP=YNTflv-{Q}fuuXN18I)NX*hP0(s`m&yU+Xq
> zUVBclBYdFzdE_U-J+Jmps~K<B?gr7Uo_pOcKjN{_vT3l!Ptpgb;mn~Y&*(1$8Zz_S
> zLJN<es5(D0C)Rr1^Se3uJ=!`ACqvGo)A0288UCEz(}>i3J3?q(GnG%0Q)nxLWSV2f
> zS;Ipt%D9~)r<lf&w;_Ggtgj>3 at g=r60m7XwEwpi~XAUK1Y|McfS{O&r^9VWil|7F}
> z7ZkoW<cz&@c!6QZ;4`UR8BqHUb)6{Fd&G=~K}#-~@yIMFx^=U*&Q8uCyK<!Isr;aH
> z<kS!ivnOTBX?3#b%tAcr*3mvYup4pgv<E66)hsDgEaJo(({L#lR!4q5r{T;g*xWpK
> zOHlLkR)4`r1=X2V9Nth5+~@p?8u4S({ca~cQizA=H;8|~RNuu|1$QgV;qiWkQh7U}
> zFq8$A_pSQ3>K2{t6scdOxkWgg*KDD;7vYr1!wS<SsQ?=)dg^ICOO|r!t|FXJTW>EZ
> zdX?0m+Yt9{oQgI*nNDnq|Iz6ZOz{hkdg at 6@Q5vZ+>D&mVpnS8X-rRg<XPUdnQ!hVF
> zW{7<Aav;!c>=qMt^uVULnVm9^XnIblu+ab?C8vvOP>nd-_B=5%+ZE5<o^(E$2y|vK
> zPOIGttnEI=;lL0M^RccJ^tZRDT3b^Y$3_4BlG63n!1R6xJX0hI=A)6plnpVt+%aar
> zNi+>OkmFy#dpX$P-pqgkOZ*>W0qcJs;nJIDwnsE`Qds}`lO4^1q+yO at lr6!0)>9g8
> z!S~l5a)ts0<Zr06T;aYX=<e77g`k$pC>MxTN^LA~;-Z>uA%ND-c<KXFEfzhGYKX?L
> zg5(2Ku_M4GjBlO1kPY1Ahk+Txgz58`b=XWcx$T+&aDP&wXxd&KxG&;*Gk#Q>;mBED
> zY&@v7Ak at fimVoLK0bDcT$@?752YSmD2=UQ^>3CF-PsE-d=tI+ScF+qv3XY=Nr{mi=
> zAH6Ug537A4DmOT)T~mU>P+zhY1#e>HU-(MVf31cI2~*_gCxMQDIK)ajfk_DKR>P7G
> z1mv|o(!0#H$DA8F#C1f0^}?M8fHgZOf7un at zr*#D7S_v?rtF{c$-UxQ;BJPiFvB<a
> z=(Z9(G3|~`DIKX|N*Bz<uEKtLrfdk@#tty_#<>^J3ne%&+qbO<8;I63`;Fz5+O|Jn
> zQICTkGaz;-2E+~@- at S$rQ(8I$$3r)l%)pblWz;bPCy!u*dqh4ariw7%SL&5fzE#ns
> z8~ex1T^txYc?Mok%R0ZBoM!v+zod7?_wT^4?g&~__7|(j{i4WjCvt at h4Aig8JG1<S
> zvlF02=eF!z*YVlS10jUMKx_tnQ5lGr9`8u+OzQu<=k5|OAc!j)R^<;C5p~YQqegfY
> zz=NuqgRMx{#N0faxZ;tD;@9v0Lv24R9 at a{YR-6~|g>!g`4Tg6vjBb?`NQRYevEr<x
> zXIf>uoVH`OoPJyofq`N^(vCB|Ly-Ke{0cp8#WR9`C>n!nK!VDcg-iKoTIq^eczyBy
> z{zD!=?FSxpv^$kFyE^-sub+TQlV;KE638pPmS0jk$8Q_InQKJ5ll#>my)l6O&9~s>
> z2>lJZZNGN~U3Lo|7CVAn!f-R3pNyez+=A~2E9{L?Inc0HkmbTlaeU#%##~rV67=J7
> z=!cGZoOG80hoRu3X^WYy>CNcir1?g40AqAtDV`GaG$cGgTOi0iP0yC%nXI!px8l^S
> zO{**OIRoQtP~N5|D|0zL3-ftTM}2`SI1~Xj<?^?{l3H~uUNG9G at cz||_g9C9m)x2E
> zAwcfv9j7w=@Ci*B&aREk;fm7%eP~Hw$zOU2B;OrAZY$Tw-{nQ-E`e>U$kRn6PbOw|
> z<=D%^#X<-#WGLk2bdb6gMM8NsFl4B1!x4j;A99q4ce9arIf`A=%t}Bwl%28b;IHKZ
> zAcC|}%fyY7O#q2eH%Kno$`OcoX>jE-PIoY*<7}r+iMfkmJ$O#`NdrTA+!TLmq at v>k
> zW&<I{zLIueU`M at _*Ad*A1~6P%afR%c?=*Xv;|6W$prrJykw|6yy6K47I47-B-4^g6
> zMPiC!cRcqD%2{OX0fs0{(e(7t)w2O;#)#YjUJ-33Dv at u@#z`5nqS;kkX2!5H10~hW
> zji_;jZIQmBR6shW956mef18aH1_u`W#U)I->|LRX2C&49He47&of?Np3IQ28i9TS%
> z>$%DFcN at NEaIs^&(~P5mYr>TVF41?md1CWQPda^M4xScL0?e1Y%K-f`(2wUZz4xI;
> z-glVYjwzzIh8Q at aWrpPP4SPIZdq0zR%F at lLI^o}PS^oz%pOmpZRo=h(q|%xE>LGlu
> z!Ro*8h7-S(H?Zl1Se#cPlB9<|)fz~l$oBvI-h%-x&3{(g&|fX%o|L=7|2t1>f1aN0
> z|4WXu135O{m?QssmeVmeY at S8;X0cv`kCRUUqi2vpRLkA4R{4};22*fS!#q4Vq=2nZ
> zhQfO)=$LtU*x&~SK4X at 2*Xy7U&BO7v+X9IWrlGg`f5`+fQqz+vVbN$t+ciE11IU~4
> z$!Up|ais#4$>>a0!E-HPDAw%#n0XcnjfzW3XMQ<ck<7D~D;)k8x<cT83*$8XJ6%EW
> z|1on-SL(HUIiH<5_+aPmtbUJT4r4{DbFC<-zQh2P8=iin1Q~4=NH4X_XhUwJ6=@Gz
> z(O*6S;u+0y2ar(@wUvW-noFN52PSP4Fd-(W^ZmeX?FaDt1v<!;ph2i7rUZqfh6pP{
> zg(WCb4Hc+4JH!&CK|LV7#-jdMSS~hfShL%m5+HD9WfT?JyZ`&)=`CXdI<>JrLgQ}3
> zc?s`&?d}w1!{UT`Z?XT9dTszn>f+l#TuPw3Zo_G#=P*tIedr^B9nqMa$l`R-%=Sgi
> zk(e<x#}wA)IR<gQ^v2uql-hT_95lz?PdQGXXSZc3NI+Gq3<{`KZa}GL;w%On|6eFo
> z^1M)Dt3}u$Z1k70fgz`l4^s*6+7v0s{6eBowG~8m46NT5QWVQ;zAYw(XIYP8Hh#x}
> zp}|IBBRz6E&ICT;_uFyKgp#kAD-~w2du0sp-RY%^{2jh_hOHU22kfBCY%Gcv#f8)n
> z)7{1CFfNsM;6m;Y-F^p7o1=hg at 5~~hzD6`g8IW=<LC58Q|20?HD=1OX@<-lC3guit
> ze*h%GqeKDtI24 at SKSpO}(x?iY&7GzN6*#ecV<_1xAIlfk at JzpBLHu%`qyIgy*BdQe
> zKBAF*J_n>8b-!dmA$xp|&j<O8WG^{&!-f~)Ls--NAJSbFIHk5g*<ud8af|s(6&q`)
> zipahIn=N&Y>Sup9!5Zt#U^iQ>E&3ezMBbt4QyQRU7m*Rg*n0R6WH^~YmN0eb=rw>4
> z!h5xW-KTM$#D?70tltOy<8#)GTK`9k2fi8IoN4%PTqweF{CDWhxRAyDnmS-Qp;h*d
> z{l8|HAXtkiT%)S4dkukWiZ&yToC1n=0GJh>Vrk>=;$rEM`FLn;KkzZolK}Lp{tNWl
> z?d;N{9g=cg+aCz<y1AQ!X<KORYkIX`bvk at J2&;pyW4j$Q7_)Vh7k|Ev%}C}y4k~$>
> zx2kr)=&;yo&$lUC;3>T*VA0_}|B>1aoiw0<XJ_P4?Hh{fTi-jge?(<FLX7Y*D20^J
> z8&gC;zrZ%z127D8jFzEf2V3Xor5Oy9qG+URq+OMGR`x&TEq!a*u_>2^m|d6 at 0^Tz-
> zPDQLPHxR2iQq(XE(YK0L{fX(%6b5TwK;H7r`HF;E9MScneJ$Ft9HpV;lVj05q^+#r
> zavfuxqm&PAWuLrk-~BRFbAQ{*cB6R<O1KW4mzkei!9ENSJ3gcDRL{_?u$vXN^v{NH
> zpe8`%4V#cw9zk&xAWt^X4eZ|V((2le2L{<eW*N*VhNLT^{rpz8y8JmN;1ZQ1^Zw at s
> z3|9PopWcA)%!&u+0s8T?QN=oTqsqu_8rQ2WT1IMit|~2Ow`m)mr!Q6Eh>%hcrY9}5
> zK!KTbPZe-_)d8{blqwV|<=DB7a-#h{jc}|ro>3y>1w+&|_j3cZR;#jBAUbMU>{r;7
> zy^vL%tyJw)3<rXl@^+M0-K_x*MVXPGEzHis_lMN0SnZ|I>O1j_JAPCd;FmYpQ`BMU
> z&5|8eix7uw$Z#ylP>l at zyvbQD)8Ui*-9=2np(+|cOh%H11m7Nw;1d`2GsOR7k9>^w
> z-HFFe`dwWBz?llxzE}Rr%-3 at M&PGxU1H86xU{Qvti&8$MLUY7^y7VqQbaa)<1&Zd@
> zLZ|}BZqJK=A{3rKe4OX?ZmwkxBM$+3HIDAS3(uIRbi!Q>bM=bVf2|OH|A3za?}r&R
> z0<w#gGjJQ=_l!!Mxptsb0g?<P`cD-G at qriv(yC!{gxVJ1w4qbfz2JaN!#gF_2?*d&
> z6 at sJb<^?!`>!oikz(Z;!=06k{En1=N$JA%*`wcoCeTaP%5OiFQV7)5ofi3v0Ah9*_
> zl(7@%ES1cPB}H}kyXHl?+7gt9%+>KPxPnTm^AOOSX*vA=rS6u2x|w-aN=GeE_H{+y
> z=o}6tPr)ewgM9V+D(ZR1HF)2koUzucIkTjhjJW3LB{QzEPu`s at Z}e<5WuJ8xRJBG9
> zoGjR(Z07Cj3b}cU-NZ{XZ?38K|GBD2<%Gn<el{4YGT+d^h5tVrIQ>7WEeLPDfuQzG
> z{C}&KF1s7Y)oxk=3n!TktGPN?%kIaO3bq_(M?p#ea9lzOZ$<v6mBEitC}yaFOuk_;
> zE0(kHxdL^QoLQsr6JhD?=r;<hJjL3?oJ($6Eg$)u7lnSC33Y1Wt#-CacMg`|rYAi=
> zF=E$q3jn;4oTfxRX7zV(Rrb=2n^sHOy`u+|3<8lV at 8h-1fJEHKEE>hVm04WmKze9E
> zL!)85i at 6#NaRFgf><Zrdi9g78g{y@&<^MgpZXqD5ulpU<+$ggUiAoGJ&{hV7=M(_%
> zINKFIU>UMn!~- at U&|_Cf|Ni!-)t(m&%fg=w=(p+>J>86p>u-cuD#^!)(W|pnBW-P2
> z4f;@S!kf9tIeEqDjWb2=;xq12Z#_G2Ab;WAQ1F)R5F1|1+1Y(gNVw+RD8j at DSG^5@
> zd600~D=Jn9`?^ECYcK1S at c!;K-J$O<@I2mK=UpdnBpOrpx$PIj&}?F?noBr$w%yoR
> z2xFETUK<Vcs0NbHE0=o}Dom|SpUJ8bcI-~RvIZDVfFpQ&g~5^6zAbOA!ESbE*6V1y
> z+HhFZW at bvoli)v at Urj`p>H)5T0pfay-jv;u+k4L?EopIQ*9Z5PfbNX+)-xnwtUoyS
> zRpwj;deT0CD`o|7g*p6PTDlnD!d202i}83)qDL0vJnn4cJ$P#EJIoiABgi?3WQf?>
> zS3F4ZI+-B`LD*1)jGTEh*26oX=VGmGtA9)Vseqf`AGdS^2rLsEz^eo?Ljhqsu%{4;
> zas*Fc+?YZwHmfMo9>*Lz{gQ7nYtrPb>oP=b_+rJ{sESz|83YtBYT)1C`2zkUne7ow
> zznf)OD>KFaVzd}FBiwT&-Ays0m=OefSGUI at E?1Ms>>zF^sfB!#ZYrs at 1Q|6`+_zHm
> z68u%f;R9iobcA~L_oVmil at HUTdvRLr;htR<9s$JWB2wZSvWW-QD7nOdBvL3J?s2Fg
> zmZQ$!^H-KjK1>RGwz3e5h43aZNHq2cqH-hQ at I|aiW|XVl68bqn|0ISXq9&m}kjEa0
> zQp`btN)CU88GW*KZ`fc^b>+jKV+djR7JBqv9LtTN9rxm7?l9HdherZ6VG`7)yP5PP
> zrikXMJi_&C%!!hK1aC?KpnJ(fdY)rcRjC#+(#BT7sx}d7&R%1QmXK(+K(l%x`@;nF
> zgs5TYrX~;z9fJI46p60=b7gxo3O$`L&J`30jt8~^t=i1)7*b&WJ$m>)oSu{Iviftc
> z0nZhaGe#=d#BI7ezz8kAp~2|@5w?m&dWk08k8?Am0ugPx8!&*9$}UN?qUECkvgzy?
> zRQD3=AYE}kemabqwJm0Bev~12EY&W>6KbE;wqvCU`;>bLJNq}c>)usi0#e?U24A;j
> z!G=1CF%B?ZDZ;zv$e>d%YRfPRR&us6!)68lwW-}Ys%T8Z&jJjcw;1u?2B4}xCi(B~
> zTUm8bnIu>Cl?M{DAu$*4aNkLPT#AQ{Vo2^C#bEB;eirH%8#`h|mN0{cpKfF4om6G)
> zvqqZpXFRfWR7_4vk+vhne5IZT&aH=w2JrzFt62cZ|FH-#+-A<^MNw5(h`lp}DVCUH
> z%L^+5z2ELqbz!W(`)SLcadNGqIo`I+vGI_8M`>xfq|HZhjFJ7MsD^M%jIF${?ceGZ
> zQLGmcW_3kB)5lhHXSv19T~SxGnre#g9A`1|sDDTXVt93lMwsPFQ#Qop@*1{4Yki2R
> za;*N7+u@@pZ>lH`iiO`)5sNV}J0?b}BD9hUW=GsF1 at s6RZ1+;p;Es|1(=<`9njex3
> zpl~`-U_QS<jHRDFfFo}Y4-J?BuD-!4(ck;meirJN6#=Wny=33M1m(CTU~IHGTv7OV
> z>j2H#0*0`m{anH?Ep+6Ac*^K6oD33yRw`80RH@@)<YT?%{rc?zt-4m#K+whq at u<Q7
> z#PiTddCL##&cJFm1dKS-A0EW%wVPU*8r$zOM{hGXw72Lh?+d!BK-eDT4k&ec+e#79
> z2d2G^5dxKHE2#j|kmEhbfr0hC!VF$}%3<h%fe`zJjk5u+xz)SITgQAR^xFO~U$MK3
> z34QV*JbYrIxL6D&Gc0EOOv{Cqi!GO0F1P$%x9+3$AJxZT5)81hjObKYX^43pU<A0H
> z26+el=^@~QFVo(K at X(0Ot?fPOD1r!5m}$f;Ofw$FsY$ai$>=rzZZ|wk1o&D;L%WDP
> zkdwAr{mWwLl8146S>?CPhrGp%zA%N%Vy6|WfDPXx7Mdo>`{gVa=iyD+ at _tJ$I^w=l
> zabA(ayv{j<x^*Au9q)Xkv!cgd+7luH at qgS*k3Wo!6_4$#Tel|+;{V1BDOR!2CrT(3
> zLhUT{c>JfKm8-Z&sKc-)oTbAPF!y778FTTNvw0l+AF at TG7{^!^a*T)n!_>A6CtIiC
> zXcXp|3K1*>O;ECAvoO2P8jnR`EN0ae#~6syK^$v9j?#3l&CD9VcUZy5))=~H8P1;n
> zrK7nZ$94qfdnrTZkJYhbtMIm)9eVV?r3i4qe?C at A$pOp+{#6^836)f!9F=1m1UAyn
> zyxBTo8T2Y{3gqwHMe^V1<mEV>A68GRm*W^7KDTl?9$wTM<1Q`;Z4HdH*umDm=cvUj
> ztYT}QrHICs86Ys_+KkA!JGEs_%iNZE at SX<?a{9DGl8v5Oj#HzQi)4(w%5g1b4lVc4
> zL66|%$b5H^tK5|BVP<0AyYGZ%lsv+k!P5sG!DjxkZo2CcJXFxhPtYTe;Ca)TXA!|&
> z;VD;62SfKB{feou)T=~XT6jNLsl~zUot+x-&tQ1P8QL4AO5`5E(;gpPQiJp6SD19?
> z4ep}td5ni;x7}xo>@M*Btmku;Bgm>2bf$ucHY-}tV(7{BT;(nuMkv9lABb5-y)`&C
> zezWT`5Yu3U$?^`|bv?P2Cau83xR0o11s(y9Wh-#XtxE08y-@>_Um{s-yCyT?hPE8;
> z2_ac*%QoW=F@?n|vFB&{{acAnac8^FR}>%^o9Rz0a4P?6DCHl;*<1)6`6!;oS?B|g
> z;`OmJcn8w+7E)yza<!*C6~*nH=&?}!O8jTYv2rEk at 1%~Ec!=dhwM%1KdZN=Mn3n!P
> z$SDApSoYChSGbFMV_CCsG|}?uqza8AACe7_QjZMe>;6=DmuTNg95?fLgHK{cH0=Ke
> z!v0TG`y|IcW}kr~Nn6M0PCdIVVTplgD-D{moT#am_E~%+scL+v(b_)UhnU at vTuASF
> z3<j)_Zg>pa1|2I^B at dJS*d-QXP6*$>hk75w at pF1S|7s3v%xFYXI51*5!20ZNC#^~U
> z-F>Wpt2Cg^DkPF4)Lv*$B|m#cN`mJ#S11lb*mDfRZ at M%}_%KkKw`t`nJe at m99jkDr
> z;)23K53j<>fuMI49w9KBmZZmVjcz27WHtW9$8j0I at hvJpj*A70{0Pl`0&g6@!x_p<
> zlXhzc1{6T at H{vd8(@0~QkpY0IO(PfXEHvDO5Dc$g at p$2V0?$iJR5SYa`eu0Rn~--6
> z^RDAvcVYbnO}8Dg6+*@(f5EpxOWXc}QzrGe=QC}Sqae^bJ%rT01wlyZS$9x=wT8C|
> zDB_PYuedg%C#h2-KS#q?!$_Z`lUD=AevaP08ia?Fv|%;Q7NBc%&uTm|TdgvxTjQQ@
> zdgE$Ok%QFyFM}8Nq%wGSJ&EtgKH1HmF?NM^>(6jqI+vc^-!7j)kD{QmI{!bI&xQ*c
> zS at rSp)041BdMJJhK(dwQJcXyn2YS(_?e7JI4ohFbCmNo at qu>)CK7~^v3L_=N88##S
> z?fptc@>94l;5Q_<7LS at 1sD)_yYk|;V347kocO>!h`#&2ygXQPM(c}$gU*-~Qx1k7T
> zA6Du>8a8osdo6x=;{RSrb<)6aif@}SF_Z<NVa>TvEgRS(g72<n^HNP}Pz>4N7}veV
> zG~`6*1 at Yoqau&$)c+-#{i26KH&7Pi-b|i%X3vC2A9s_&}J9o57)SH&JpLdOOjDrUB
> zr)CCH9}q(!b)0J$q#l;;4x}c+8dxBPo0g7|s$6kmuxaUD(G??NcwTZDl=qKap`s3+
> z1um@^0#$5vVKL0KR60z{?YIU8*lEXi#y)E|Ge=q|jcCzWqC<;Fc+Xloc?}3nmJ4EC
> zooE(oNxNYhNi>WmL*bbO&t#NK(vXp)dh2?sQ4I=ryf?RoEcWl;n{RuYB-)-OLs2nG
> zLt{~DPo(GomSH#{(DK5yMrjax!T?5r1U?i&y-YS|r=08jj`x(jF@&(=pS7;@`=dyP
> zS3sjlB4iwTX>HGN=F9z3&|CvqT(lXdy9Bbvo(>fbt3*M}q%hg>-rh(MwUTxx!+$bs
> zgxAiRQHK0S#T~#Ubr7=ue4y4Oq+E;8``Fwhw74(y=S(yYrFMpaL{eVmCAIf-Y3)Ji
> zRp>`F3b$vvg3+_kkhh`L&<N;(Uiq*#h{Y#Ce6lM at xz0YL&MuxREjMdnWYWwvEkYHr
> z;4pjr>vr70x*ex3s(dt at Zy9H(Lt4YDNEf*eg#)9$Kgwq|O}^U0jP{6w6uakpUZ<^f
> zfT-9uh=qPvhnEkgWzVCj%{2`vyJ}p<$~a-Ldp=3?B+ at DoUxf8$TZ^*>y*A|M)UFY7
> zo at dK0J@X9Iz!m6Tn?N_M#Uu5vO_1;=^?m<Z{5Tg*P3!Q2h!*!~uOJ#r`uJrPSDv|#
> zzO at b~PgH~~TMWvFZ^k;-Z!njoqd_^T(rsp>JJq5qC~ZAbR>Td5g2TjOa=$y>_Zds2
> z{L^?2cZ!xjjYlW^AIjbZzNsR60G at j@H?O`@+R~N+P5LgBwg^bUlHR7FZJ?I$w1kHR
> z@$D)r>Z<G73B5qUf{55*T^5UCWqn}PF0hK47L=ka;v+7)Mhm*7+$g5y6-wHCXKqr!
> z-T&|Vec!LYW?pCBXU?2+XXc#H5Jc?1N?E{nw3<iH!?NG84yPpSLoX21kEloGZ*Z$-
> ze*{dW-kV2{t;1RT!902q%HXPLRs$ZFy%5He>0L8IfzjTDP+%zZnp*>*qb{uydXqlh
> zfD1DJt3#dw&q8^f#DiRvvuBc|+A}%uk-U!{YXAzFN96{5Tise8PfqSad at a$Jd~(_E
> zTjv~Ejrf at 62wwxjNb8fBt_{iPTVuz_xW@{=qSLyk)R0Q1!M_>)OPpzvQ7UgWoU6aE
> z9ynmFJ&vp;GwdaVz3$!w%>(3jBxwu?;=40 at BA~`>NrX23zUI=fdT4Sb;uiF(ek`p%
> zhj#lt^xO3~RkPfu>(-p9Xxe~Hb!tZvH`@LJG5bxBvw2^tx5mc<K3iCeJqybYqE#%;
> zKa7?9E at q3Xf1<=2qEV?ksfBBbb|t_nG5ee(8&<+JSdixW;J#EJuRx|Mv>R9j;QvaQ
> z>MBR`3eDwVunA`Y3zSbZTFKPMjMn~<ZrT78`)~BX2Al&6d8>`~Y`_!wOFz at mPvP{N
> zp_nsMl*50J*@9Z8>ge24w&3}}a}n}`i(EmSTuMX>Gfwvm%5n3~;$F4G5Y$5TUG+gE
> zqFgtBUhODUVjiTMp28!N&VPL_sxR_<gd-<7%stXk6lD5Im&#q#^%U$dd#U^sPMNY>
> z5{X6vne at uLjOSp6<$#{bm(@~+Ar at u0M|rKpXo=IVVrD2?{^=;>u%ie^dzVpjBhH59
> zb4MdiPk~KtS7p1lS98kPBS;vw^g?$WEHm~dVpk)+xqzWzJmMG{DtH|V0U9#gc4?Fl
> zEO9lzUovmF?5D<!3YHab#FM#h`p`x^u3|cyAW|NhdN%WcBd2GciC_rRqHB^qsg?h<
> zN5?cqyCY6l_AIogLws!0p at Z|}FZaX}&DC|<vk{Mv8wuUXX^HIC_oy1VJ&_9C$lHVq
> zlx?$%)^5Vtb$)&&FdOyG(rU!{i3V>bxV0)&O#Q2#f@&4Nn=c{Bd at 4!ef%=xZ8aXrx
> zt>b~RHeE7+uU!u^*$Rs}GDD1&CNp~6RGGgT=;nEJ`x)FIIyrZw9I#-NG2Mk$l)6??
> zt1;U!_gGxR<qwfihl+aFHsQ`Flz`US1+=zZ)ophRE$VK*C%@a;lXv+IK(mY;mhQAO
> zfHMM+cP@=d0-vN3y_5yWIohZ8U%LD}>_LT&91csO8#{7Tf at Cp33@mK~;+t_#WXnSi
> z1E=z@*)!2!-*Ni#YQnWt!J?tTr}4;aAOn~0XFMf474=E-$=-D^#~Q*la#8_oFRR at A
> z#)8XBD0pYpmAfXPTS<WrA5ZoUk)DFzke-6yke-6joP!LFFK+=dmJb_)7Tf}FNy0&-
> zVfIK`CIao at _e_LASm*5?j4=pk9iZ_mA&yf at gLRkTS?J8NJWEzl!!tP1<adY)4m*jy
> zSKX&2cU at S2evK{YuRSkZ(7DQiYpr|+n+to?%{TUGw{WM#9z*w-9xY(&Vs@{$(FAy(
> z=V(}=_G_duP<);b)^Fb^`tCD$BR6_q<rXY(+-}%ZaCMz)9*!sK#XgwNY>+eW at 6!%O
> zdilXdC^Qwspu8<GOx>y;UgG3Z%WcxCtt#l at 7%3}sWz!$W4k-LapNfnbqG=4V{fUh7
> z)(0ha%$2d{MkzA{f9Z-}?-120zvi^QM+1GQDO+*zO>8N2+A|TLyMpTaYZN at t34fI!
> z3 at QSOrzRv0p1n_z0Xw}Fbn{l6%)Lrq-HIRPHc;bpcm)5!1zP+ZE?BZc5e>tV&DkPF
> zH0)%b7KVxo7dDSsNNwZ-J9i!g>GNL2Ami93%rpdpm_8V%5A5_os%t85K>F^9JvVxp
> zWYGB>P>-Le?>Ri0cUMtE6VBFIEt%R3MntLDgcI+6VbA2oJfgRokjWNI)8lw3xC`4!
> zp7P*xG$7@^&Xne;&SZ>8MCWk$)py1<SGUK4I3=}58_yxl(n~?t8SGa}9PoA6&r5<0
> zWz*_aTshIV+K1LMbv5BBrJDywiYO^@4nixMkeer(f(}@!gKVk(`SW_>j<nXsHCUpP
> zGQ2#~W%zudufe)98&(BSrNy at 3R~P71isy1i=q3uB`wwy*#z<uwymhQJMm)df(y5p;
> zW0ao%OmUIf%QuJ?4rh>T(P&se^i7)qQU{#Jh*Mo>^lS|L4p at gXnr_{c)}7X)^XWhs
> zX7 at w3+kzKgrpveC8+q3}`usM0JJ;6qXPld9mNzOuOUVOdJ9!1LYf|8ofN|$czL4m7
> z3y8l!-uG4i8Q;unp2l;S-81^)U+~mAVD#B5%@P0lX)sD2%Z#^x$T;Hb^P$+UtFDiA
> zSA}A~y6ajjX=V)k=kbhv|2&ql_Mb;9ueb9$BYm9rYd{z+xJN}5QU{zY2Qv at DZvFK-
> z#qlCtv>iusf2DVA$NyUL09r|Iv8-x{Xv%jbT(v73ebo|e#8q3h8tD{F>5pz+>gH8w
> z at jS#KS4t>V`jJ@)2>ZJsmm%b*+y9EkM$Izoem!qB at KuUt_pkm6TVW*~{436!zZe<N
> zm+e?GnTG}EGplljIP at -T$fdAm-^+h+nkXS}(W$N;bv{2$bg9gIa5ng+xiB-*5wwH9
> zB<x>U%#GgZQWfj!cF{+7;8gBgx@`v at m;R{J=<1hUE`OUEOGE`tV}$CLusrz^S>^4f
> zJpia;7ygo70EzTfYJCC!nfsA`{{sF~-3N+#0ij>(R^{`-IsR4t$AHa_YMBh|w+=Y?
> z=<v$l0GymtzRc2Gyu23DCm`J`lR}Dj`(RQ2LmU=Ew3iEs259MY2f~asC=b!p{#h*+
> z(#2@)o~e?tRqH8h1+K8)>M5h&HsdI0Qcp83sr#|X%Ek(KxGBIRLB9<#WNOPqmqz}t
> zRziGU%R{YCG3B?+Qi?N)wTrbj)b8us3^Ad!-?VoBk(NKO_O?4<TZ(9T1hy*&yC+{{
> ze*DWKx at RZ0rTg8M{secVV<mT^<58Zy9Nlbw{ImV;$yW*3c{<`nY_uGE)NQ;L$AlJl
> zPk*8L at vm~+ at sLY|B6quEz-Ko<{>3)8K2*~26K)|C_gNBs;zhiW%b{Pth#fP2#U2ZE
> zOy64BTF*2=k9<r*fzFVw6hNV<mN4H at zZ8fu3D}sR(mI2ka*bTWhAD7_s9UE)=xO at +
> zOZbo6QhM<voI34?z!Bbv^q~&}JFV>d(eWfEiyu#9lKJuB?Ca9;1okQDcs%@89gkyQ
> zd5#ZbUwr7CU4S`$`s6O0tV;?%>uRITyYQ^JA4*6*zXnOX+=1t!Y~dgpD+R5aOFnZ}
> z%9no>dq#??93;PR!O2XXUf^K7V?B$J5q&9=h7mx(M`DDM#jO(W!lyLi%HkAnE493g
> zr^I~dwSnj#1^h}jyTC;^yo^Uw;kP at 7OKP`%k&BC%hd=y`DfY#?J0qd`58b+Xn8YYC
> zFLbJ6KO>P|o4nUvK%#*8kA~P?-uzC1nF at l<vqN4<eJ|q#ZZlQ4;0j?Yamg+^rv;BQ
> z!CKa7%(*@zsV6Uaih+|<gUGp7Dn%0^E0KSo%`JFR-CCx|%t3=f{AQF4l*7n0$9dPX
> z?i|-50cmVOCoEZztS>UfP$&~(P?lNI3e8EzVW~vbT-MUiZ9Sv%)&`u-RyLDOkF*ab
> zJTsx{SuEAU at Qi91-t+*w_0>Y<E8bJ=uKkYErpm=WJ^AiTR7h5!OJBi8y*wB~jMXmM
> z at CqKg1n{H#=e?<YT+h$*Vn?DaV<a@&MK~ZhBhUP3e>Ujv;~Xoo;QbP~KkYn|5p at XS
> zXsny>B0->T|1TeB9^}1WQp0Y1bK)+i35(p+>Ivvm!Z8bl@>Aw1z9Rb2Zk)Ny&Mb35
> z at FC@}eoTXgsSc&>^3PtC?B6*N2KZ4(l{}fhO+jU7IHWZ~+BTMEuSd;qlj|YEIh$$!
> zZeS`@5Zn#HPFBVL0Dc82UAzU|{omE_WiS_^^d6S>KRJDn5}<4U25h^^V%ZvD&h5qK
> zDZNRSIol%syEkt)hKlMn{&zKyD+l5yLUm(2nLwKFcNA)(e``UqS7a6>A?*&ilEv5!
> z9H15&?3H|L<fn*^RXdLszKTtmp%U-f<Ya~+X*+q<u{%O$rG at HJN_&Dn at +wZ(gh6TZ
> ztH1}rAoXsBwB7Xht9TUm9X<Oh&g7gl{xv))?*G#AyZAMHx3JX}C;x|j@*2+P5u*Or
> za2~(0lV-h+jdkDDx^sbDiV`<R>Lj$$1X!g5d3m8b5^W~Y%C at FEGh0r_^H3gp^TKcm
> zut<Adss(Uqa~5CyEE3$s=I6g9-q}pkV`6`25;HCe0uY9E%iCu$&GG~HxyCSLw+JAw
> zrV{$m>v&9JI1DRqGqc}(RUT8nfhXM3IZvfVTXb&iJe9_^MeT*~O0*@ik?ktO^7(zY
> zvrpQvoFcll)qSWQ3XQO+@*=u(<nw0|MU_?86tne^IG$L=^kUuM;ijiWjvSIZ=;k+Y
> zimpRc-30*hCffD}o}N(cNYZI7Dtm<YUAGF#kIh$2DyGqUKs;}t#d~mS-E4(B&mtPu
> z#la(ig8{45MO=nDl32}ir$OA#sJ3uFf;-$HvJa4)XQ%3w+U{M|ecXv&r+L+khb^&U
> zgfopNNZ+olp2+=^q!D%vZ(`t(`SHvC%WGToO{=Rjkak`M(N?E%?>9}}qxV{!6_#Dv
> zRrK3E*eFgjyM)WP at 6yVDdYxGbDhHNYxV!|y$6wbnTeeME5T3tF>)itBJZkHX=}9S$
> ze7efJ#(~s{{>N$Yo50&lpm)59O~B$byooF7N=bz!1Fs@!Ezg38!taUjk7C98`&yzv
> zdXDlBpNEhh!ZL)9LpYjM;{UNF%DV+Z8sN$V|921?yC+J9C4fG!4>sKhabG}OF^iK+
> z>w|>7qrN*-&pacF*`nSPvxgaaFxA<DhpXg211i4X837XbKDH5FjD(^LXdj4L`{h3q
> zH3*vf*g at 9C7hr>6joSr%9Q(R<RtNglJBMB7JioxRu<Q`ZAX)Z&WUyBwt#?jC1)yJI
> z!#Z2=r$KhKBC33-otM&~)CoRL64^VH9{O1;j*NgZq}sQj=F>9mZpCTCU%ruj3zAD+
> zk!`m+a<CBo*f;tuY~w_F*IT$$IABihv(i0p;pv%kt_f<e8lpjlUfZGr!Ar-q$6v+j
> zq_=SacY#*EjmIWLdkR9jA&HBe+FRF|V7~W{-_eG*ac-Tm!S6y%OexkX0s;fda2eot
> zIJ-^BMyKBtx+zU6+Ul4=lYvh5%&!}ht}`+0m7P at U33Id&#GHGdPuT^t0?js*`kLfo
> zJhxdj<Dt+a;r2Kf=i!bd-q3vTm6{(Sv5^+OgR>WH4x3+cG9!GpVEmsuFGFi9|1b63
> zq?EQZ_1(lZbePk70*0n2bdSUF==@YsWz;oslBql195>@(`u01xI1AiXsjEjzvcj9*
> zFc5OzBAUjNB#T}iilgyucpBi|LEwTHv;p~w`-Vzw_@;EfwHaASwk0kH803}>{k4OM
> zdtk3?Y-d~-eajY%dzGGQ!@1dhSg{c0FRj9^h#@Yo_dIK0(_8*BV1#m%(r@@Xto3_o
> z?ceeAL?u<sL~(%6cL66p;&P}32mTIBR5tDTJDz=8r~z4)xZO$v$_tB-(gf&$(uB*l
> z;IN-hojLQXJI3+of at t${*Sw+O=`*nM^V3`)CWH8FBqxELvB8|I9J)2yJcSJ|-M$x(
> zuAA|II||b7ck9i(Ymr;iA0O&NUj}>38bIa|H~oZ=^EPB~uCNXM@&zN#0I4V%%U>Rr
> zP+UC%lTes^5_*slj*T%d56)(WvjDOL{0k){Wl5z>%iqAuin<y)Wgjl$hS3N2;d^ym
> zhm(r%^SoS7yZ7O-xAydMMTQZ2W^k)JjlE*K9{>87N{%lSO`9S7YbRXT!W|FDZ!|~D
> z_^!y1q_v?1yUl;8?h;Y55enDCDCw2{5xR0e9y@(r at bF=6zdqdQ1ME6BGieXm(#<K=
> zJw at nwy<+)B>`pVM&p7tqP2fi>`l`G3<K()ZLz-*?s5|X{z!qHBQUbIF&Hs?NTvsbT
> zH!_sBTLW|P&z_sheY)D3OB;IRCGxl#s2FMUEEY?{BZ$4dL%n7d2Xn^d!vA#mUuIVE
> zOU$Y|{xR at 8=S~Kon~;x)+sYb88jNJ4L)Q>sr?CL~cliGt{(k{T9sFm)KfCBU0o=F3
> z?mxrs870rvlJ=~3=v)Jy9b1q&WyV)~w0m@(9qhz6KW>I6Up3>q!Gsu)*HdPE=lzCV
> z6LK1 at 2)BA}rIGLAY_5k+d>5zjstj85E?&>gp{L%(6B6gF*VuveMe~3g2G)5;Zda{&
> zCcxyqhbIBd^7rugo90*%C$R at pH3sJi`R`Iyi+0asZ6WOa(W=V9?VdT;*(vH!o*8!l
> z0+vFnj?!cA;c?T$Ga$rWn*nx`4J|#cw3Iz3IN6h*pFZOYr|}cDR0`Alg$>R72hm(!
> z(Ft1!VA63a9>6(Mjd5-vd_VJ7c4r5m9t*evCeqFxEDVnB?vQ@$i2(SoidH6}&(uDS
> zWcjzk-h7n4cmU@{g`1+fU%{CZ2k at w}uZlL0M2dA^G<SfA<_JK!+R^-}@-wQxG`aDd
> z+j!K_v898y!Vo`t3|I5$9=E#b!RmN~t+j}lpPJD{i{8hh<JY|EDX<zj$x`2t5xPvz
> zouK!;k4L4<AsYX1U}oakl4#JdS3j^&9;vw`-A`Y9ALj~3Spq%&KCUWiO_q<Mc%p%w
> zj<*Hh&^Df=e#fKu7pVOU7Z6jThj#8_s5IjXqV_vnYGtJzr}I9*nL?F0`P^~(<Og_i
> z@=>N6ls(-Kyy=cTrialz+7V^GjZMl2c>37$-DytKnP`|6CmWNYH_XaJIX!9anKm@%
> z6zO8aLCqiHLLLxl<%f7#T-Xd1G5QmvG?y-4RqdlceTdWab5257pMM*K4KAEJ>wWWt
> zYM(85<*cIg6~NeakHA!gJk?65Wg9WJd;_(724s6^5w3*xyTacVNuX5fVwZWmpI&l8
> z?F}wGnjg4GcSGS*HUnU57_i;PHJ*HRyyMZxpFtebknGlWD0X+J?Bn7ErW_y8Qx`I$
> zCI5x$+wqvXff>p at qMgcX#hpM$VQw8-PRE)!@OR~&44TvI)p=j+*D7xWA*^3*8`OVU
> z9BFUtjIa&7R>z+GgZoEz9Bo6xmfKL$A0(IgvC^YO>Cf}!2Hmn6!`g|MLy_hw{;xn>
> zXtRpwNMpO4<Dl=f;}LZ;*($&W6am~%GBYB;9 at u=N3*R+ordFeX!j6Ms=^C1zbIfw(
> zI8R#3?*U%dJjtb%O`EvI2=SrYAw(Irl25Ds?;)vFgu0J__(z7h`9b#Jd~$L0mmlm$
> zYm6Yat0#tdnub<S0ee4BT!7k3Te$FP&_en5?3%00?hxYUNu74anEdhuB^@|9#vHoO
> z5BtbHw%~<sy1N69N?a1Y<Ue?RgUclGp&31o=yx61R2MmvgQ-us(6;mPrk~uuK#>C{
> z^4O8KV>8B;!Qfw*#T>=b{NTzQmZKkh=jXFo`R9}J2keUz_#R{X(e+jv*{G<dUvJwL
> zxT)WJtT-J-kS at fbWVJ)98Y@@O)dz8Q#SEv>72Q%|3qJU$OW#u0&wHwvf<L0`<7 at +6
> ze+e78<CxJkhF!n45UJEvuh<Os9R!3dEu)4*c*N+^djrjc8Bhf1eyrR)(_bBgCurp%
> zd^h(Jeftp3EP)a*2+-%76<U~cEV`U%)8s#f%EpQ2+?#Q at A31UjMkvXZVqb%D5JoY!
> zfuEnH!#~2tF`s-#vKq?RlL(ls=eJ!trRo{Z>O1H3l=2xchtrXYsWE%#XIlFaPPFwA
> z{r1wX>@)gsF?WQ_MFqcc=eNAI{flj7T_?|+Ygy?qjEh<9Bl$gQN0MrE%Y%DM+#?)@
> zX;BVCWvn~FkuxHm9{31$+8j>Z@?cZ7xD%%|sG7KjgYHf=kF>R=o at jwK7owz3qlWZB
> zD7|_d`nx|w`>S6<5k9V(4{nibE^w at WRrZobxkhpUr~3I3K{;3bTxyqV%*p=!%DOS)
> zb?ln#wU`kQ)!?~VuCW?YYFLCh*T3Idh&Ona(EC5e$+t`k*L&dVIFC7YRnLTy^8R(>
> zJcj6O1N*;pXfakyLa|p~cd=)ggMOzt`ygS~uqN9Eyl>F&KL)|-+or?#f!K6rh7Ba=
> zQL_%Bk%uGY8cGi1w7PRQ at G(R^50$t&Q{6p>Q{3H3v$sPlpRgK*30FHZ6f at Ctvp<9R
> zp%2 at wg~E-VB~W5E45I;!VsF>hl*TusQAEC)Ya8UU{H7chQ>KhZwjpt4eUL?ki<|CQ
> z!rm>g-VF2;4Q$R_ at yI7f(#lSpnZ4<-s-6ENY6wv;U~62I4fy(d$XbuZJ(AtnJ?E4^
> zrCU337BkLxpc7Az9SJ})TlVu4$YKEc7M9hpBY4u-w_Em#9EXP?G7h+j-^+V#gJu<0
> z5q&q`lP0fZ!n~Z0=dv-Q4<5mprEg<Il3YT|gr=By at U=|zzODF1c;Ds`$!i+k#JPBh
> zgP0WW+aN#QQXgD^kk*1CBOq=h)O+FxF5wDk(kD1Kp$a7+uD=pmbgetZbipS$J at reV
> zZe6a?uou1K%8+Si6tkIPR}pPvp<=go+b4MJG%NI~lGr?!jV8x7?EW|r7Rv9LVt+>X
> z9(WxJh-SX~zjf(J)>WFJVKn2rfu>JG<CF6#&S1tXt3SnwdCzoddh%O-zg^#;>*_j_
> z+fwMz22<NdwcOy)W~8({)bdW#16!;3`Dm4BXrNDjiqm4}w~TM(#dw0m%_OeD<^G&@
> ze2O#cp1#f$JYpX%7-fdJNpnXlHi`LZmF$fqFulBF1QLtHSR82!>SGlVVc4`vfT*wy
> z{+K6mis-PAx$G64@{XNd{k#_bJpADW{P}!H`L&T*yB#P!GwiqTlN`-_MEG0Oj-z-X
> zXQ2M0c(U#*i={cjoO|I>TJ%pmtuAD4XuKj#o^otcZf at N@Bv)Q%6snYc><@*Db)yf4
> zs<|5e_*xi3M;x0~6<5oc at S8Gpp)f!lVtML at 03hOUxR41-A)mmWbHmj_CjO=neJBi2
> zABFP_g*&f>A at u2IYPVqxIvjmE^UM^Yl}xRYEy&-I23 at fY4i>lzKBKFS;bGh at bnP*m
> zuKP;F+Yk)R3HtUiJSjPesg-1y+P2<GR6Sc?5>3WGm~|Hmn?3_Ew1(z=hEwVeh$iv}
> zV_e-JB#@yD;NKlmFA}JL%|0O38g+8rKhUYHGpY?)Zoq<n5UWuqhS*SHB2WpSmh2r;
> ztIAUbI5LBzddi4SN|R=`9waY7qkjbizq(;vbirb{ndyX}AAg2N*!izz$52^=4*_9m
> zuomiOd6w))otmq8zJeAV4&2<$J4L6dZ!P(;`W%;gJ<7oR at 8(th<skSL9>>Wh7;jwa
> z9OwNN5;F*KG-C^!13cR~&bN+~dKc1rj^peJYn)=W3d!u7t^HY|m49Y0=Gm9oi|6 at S
> z#OTSS&LNXm+Z2;mm$dZIaePZ`1yQ%!p=;UT+Q1z{^FGHW0dihSqH{inF<wER1gGvR
> zzJ$a>Sqc2DWVmlNq_?uNJYyQvY|Efd{4zJy8=k#O0e~I>&?x{tT7h9-lbzS<_ZtCX
> zBtVP`S at m*{KefKN`pXZ`Og?mD^%gW~Xe5C}TwY@!J#}JwCI%kyA*-nSUe1BRT1K4G
> zOyKU-QmteHUp=Ed+zZzx!4fZJKt&J1G at SG-kz78tD_&B)@$R0R+y)0xF<y$3^uX<X
> zI5a(e(PLR-avu!*Ghmq-)2L{dls^GZ2z%-jgNj~e at -yJLiyICVCn$<oC)-fsZHn*4
> z{PbC<yb#(uUP>bC<#&lL&~fZ1)~vqKAqarIIg|@vxvQ{i0anc<LR)amJeMlW*|X4`
> zp%Bgb5+_dsPQm|^)es+R&b_Q9cQX6j9$RBV;G_IMm(9z6Z5Hs at 6_2^p{T#{mR5hVa
> z>=8ZF10NAh at yIVb=o4RJlWM;FG;RJ8XVs-$U`EoIB{p#)0bym{GbE_k5ggIFPD0+L
> zmo#hi8_v*vaaHq0fH05>mc~TD^5EW7DU11rf5<MVdrzPOG9uiY-5W$nXE7ltv1v0Q
> zQkML#qzI0~|MnZ$It92vv?BC~h1pj{0G!>lS$<b(LIZ0;TS at DB=CXSY-UWM8*#Vk&
> zfzK(%?dF<hwB4#$ZD$QSVO}+haU~xyiC#jzPDP0|Q<4E(lx^_w9^!JuY$>-s5F~C3
> z`<1%rp|5c2xU~qOX|4!c at bW&!O2eM4CN_4?<~;=*ipHgKXa{33#JVEn|4 at S)&t=-q
> zohD_uo(gH@`7DOLcm;l_g4yeYn0m?N<67%&gZ;Y#9m)}z+MbTI@>5K0W`8SVeZr5C
> zI|4w4yc;A}r`jGvVj%Tq;xb3fGMJOEV5^Z|?3w*>l1nAGwi_jrKY_*8LG%g+0vypK
> z)@B7f7r+bo+dWGHtC>D4D9ChOG52|H4y=Z%khfF*02p-*2&NJ8hwN#sTX`Sh#}MM!
> z!-rtLe7>~|8WSN|pcFkjT5v_#1}_hU>nelF`h8H at K2{l%520xGR_w0~Wm%=6CA)4r
> zdmqx at Wfl4Fl(%8L&)HhWOfwHA(_LTVH2(6}wDW5ad!A%Zdy6B#>;OugF1cE*ds8n;
> z%#88HH30l%TM1D!Mxw1m0+)2jdwtmZtla9ut!unXVQ85a(v7Z=rP+~^+I!f$5&C!;
> zS{~(!_i=zk^-Pn9 at z0&Vdh^jN66w-474>p`xUKGjU<=mG1+fm6-%E<=-cpyq3W5#z
> zEhw1xJ_|+p*@9INmtT|X9|OpHTg~|T4}dGqB5FecQOWNz2%-+bSXZJ){5g{8I=C>D
> z4NVtaxzd;+NM*^?!7_N>U_lwEiPQ%Hp|2Kt4N%H%;4Nq*#~_B*8Bvq9VK at X!hHrIx
> zm- at J+zPdn<R?1}0rQ{&+Kbh{tpMVeQiIFmgVxUA-sBx=78m?mnNH>KOGk%*Wzsrh5
> z6+Jq3%73-cboU5|g>a97#Sg_^m$#VZm6(#t@^EU}f2YEjx96u#D|oLu4gHasTqUj}
> z6Z<uuD!C4JfFyDlFd2EO_NIahGv6diVq2<wgvNh^bGakb{0;E6N9dE^z#eskzWNQ$
> z(+>D(tNWs7DgFK%JgN>84Stho?6*aTKr~=`fM1Dd{3_oX_VC`c&YWCUQ*MOK!X()D
> zrizB$Mxqx at InC!(=P|>K%=djfdjc4=10_G?Qnw2oIDjs12R?JDXGgcDC$ZcIb8+b@
> z-_Qrp$VfwcQn40Ef at cSP;#-^?6{grRrOL;&7r({RE7q__cI2dFbQ%q*MCBT$e1s*Q
> zFlg*&K-^y^cQfMd-Dg*!gg^&FMW=-vROmBLbZo9^{=ad~aN`9K_?byimE$hG#;77p
> zv)?>=- at kDx7eO2UjZHE0Bz>U6Y$}`QR+(cV?ZCfr@|{WS%NGpwUZ%$;^*KU-eOSQ6
> z-N8Sd!>2eyki;B}9Fpf*vxZrfJ!h9E`x5?4Wc0SRoM^nyPE|$1>c3L&!!Vrlybl!_
> zh(QkeaA?iY;_t9A8rHzN&>DfIdxGBc9Zpl%e;@%4&@JELN!c%)OFS6Ggv=pvm{k~k
> z8yg2tmM<~%C|I!5v)|$AQ-sjd25w4ko`mK3zP#33Y=c*pDn+a(e;ZPUtrXFq6p`zT
> zG26;&=zSiXK5L&m*0&|Jq4+k2HWa7W8|jOXO64QIO&8+NCpaF}Psv{`<~bTbg5b@(
> zn3u1b#WNEEv-sXTCf4-E4B-v^-h*?K`+SM5+sGZ~BQHeT1}}_r5KiS+nV|@3{2pZC
> z-_gzA;{;AkYre;mx#*!#%lEjDpDPaq&wh_{qw;za`y$9)zC2rS?ja>5R_#k9xvcp9
> z)fYfw$*|HHKj4h13IFuP^d*|7l+}nPWGpf at 7<_r`5b(+?y$0xwXdC!pmamcZtS{$W
> z?D;&~;JL*xWEy!s-Tec;g{y1o!n313AkF88^~LS|;gZv<rc1l9v+jgBxnHqRqOcZ+
> zT7gCM*Ag{gp0;(ZcPV~>aIij89ox8~;vJv;rx&<e{}c8Cl1S8SxywPs{6O at iw4voL
> zzYFXX>R;_Y2#fwuC>PQBmnpdv(h|<Kp6DW_^lRDZJty%brA6eoErJ~>?SI-dT4~e$
> zO6h8UN~lfJP1m(3V~DhcTSWY~u@*^uakSDC*g4OQ3$;qh9BNZE3tY=c^G at MK2|=Ri
> zpTyEb3BV6Abl!dnkFR4%6R#!JpOO?>2s;ep#$JMrSOmfy1^>|wt?H(b9ujt>IHc#V
> zm-9X(AvvgU`YcTm>R3Fx2E<a}e=qD!q%#EpvvM#AYK!VfIJLYd&OD)R7BT~ODYu?V
> z>rs}WoBiHM%7*w&`CZtuxxJ~qPT+gCz?MAFKmM9ToA#J;+BtacM&)c)+*xm5g^Vrc
> zP7MDBHwd`)I3#*MZq}i6#Pk~u^Q3z}Xu_Sn?p)@&CS~<&Q9aSHcb={^_Hi1O5xreN
> zNz(HE98zf;_<0FrGt_VR$9nG<&87B-QHH#<=_i~r=`YM0yVKa~%wIljjq?71CqH`1
> zm<_Jh)waP)e=1)5^;s*LJO4PgqB%297?{O(YX1qBO`FZ$!b#$=0y3OsE`E9R!Q$se
> zA1Z!$^hd>+qd)F*!tdd})$rTdR}a5O`Xu=Mq;C!UeoBx3giFRB at io8<?CjG@%if9r
> z=`=WkH^z{>bwn~*&`Ly>`PTPo?X$=@a)6~KpQGY`aJ>Ga at 0`{<WqY!GjxPNV9<O3e
> z+VUSfTlY7Rag%I=eGk%~{{#Hay6x1^jVIJq!kQIrgBRz*_^xJL7i?J!F;)jEOFk{x
> z%B-;fJvXom7({(>UHKsYM9rm!Cp`r=q{~u_z3))0Ec}7_WAA24JLLHimQ3>ei|c%v
> zZoY at vf!poVG;+RmZa?fDaj<c-og=Ol*yVU&6V$Lt)JUkc0-CWkUk9}D>u#LBaNmBm
> zdn}Yc04CblFA$r&zMSwgTdjb0v8~YM)Ly%!ukqEFH{(M@>s?@fIYI;>N$*_%EL1K?
> z2qhpVFt|S`W>U)`91Ee9bk1p<ednAtCSb~9(X9Y<Ct2Itus4-$!QL9i75d(Qh7Joi
> zbXe;e#`pUKwwZ+<^vdfco`{kWTtq~Y8wxYmHrNYdJ0ol)S0Qg*r*TU5de(pUCE)ue
> zNhmai>v{H&C(s!XCD`;5A2$E_N)m-Nk}I6H1^;@1+Iw*3O)K~W#958%jPSvU%QmnL
> zF{1|vBX)aRAR5VN8#vQUTo5CohY{B)Fcm(DOK58kP6T4#*@MR>PGRQe+A3_p(Ic2T
> zAH~{9aC92gpTX(rvxzaxuqKDBT_nB4_)N*<Wk#e~7_j;bHi|KqLxP}p%5~=~EL^UH
> zbz$9%1d4Woue#*ZSz2gV4B75`2A1^QwDk;A3+b(@s&z#UiMf~013hi^SYQ*q^L_5?
> z=ntGsdv8^(DD(q_TLr(yz8u@&K#zinHu#?b|1$w6?CcS^FQ;{`ZSZ^_ewxHpuSU^V
> z%Vl)BwJ*+Nk-FFhZ9^&dlP-sL7^eoLKq<F7vnAtxX#J&fx>&~JE7ZMfd=0%3W?g?|
> z{0l^VX`RR7i}P*ljS7qKc9G!b-kg6hrK<vPfXvm%>wOt}Q+=5}r!Ur5 at 5_O0>nj<j
> zC!_;kpxMMNUWwQxw14$RnHgS3dT~-+OdlDeED{s@?ahhbh16^tw?BlE_7sybtZ)NH
> z at xB~e at U7Xs22y!0(-#Nr>~tCdD`&LE!vdIT3y$h!r9+IZ4f>Pxqf2FYlh|OiZJm+V
> zH5%dO=JFZ?5qFpOMoOh5P7R#J(;=S2DTa6sy4Q<SC-p%sgJ=1noV__rbDAwU=<ba(
> zN0e-3Z$Oyk4T*EBT)f2h!laxnp!%P2YJrOF?R^>NqR;2B-S8I!QA2XDOl0*`)gmlm
> zX0ZW%z+y|^p*25a(_}URutL~A!!-Q_UWOhIp8Jn4sxOW)5saDe<&Yf4OxS`K5`8(0
> z{k=Gnw*HK7<?5*67o5tjVDGyDJe=-!WhG|G>#5@`UdVkw+s@)_&PBgFi(f8yv<O8a
> zQtZ}spY9Q0h9Nu>!hQO45w<~ZAK=q07|2;f&#p8H0&V>j$5;MqnXkdIjTa=&uVUuI
> zY{7UQ_VrkhT8%{44tPdp*n;^9P9uc%wn6^{(&gsK86{n>q}y!4lrLzc506V;3g{8t
> z8|4F9vbV&ywpS~0y{moeypPd2KAaK%pLg8Yo4b8V;1i+=e9|f8=K^!Q!G||a(7Ua$
> zF-La at jvP+xSGjS&iln)LV~62i=)TdR#gn?NJva1Y$p{j_ikeHSzoIjG@$Fn9ZSBPg
> zDO1_^WgD7Y&9p4TRy|!FikVKkdI2GOa9GXbz&}4>wET>bLCP-yV_+m-5SJ}@`rK8B
> ze<%<!OsAJQWmX<>Nh<Hi7X2$nT+xn4xhSi_h}c^-kZ}hG2~ejTQsLHzh^7+vNJs;M
> z;$O)w%SZwY>>@AS(T9`k7K6CHqQ+3)$WB*Cg?Y-AyR0IYD(A=*jqU7+B%HqdYMP0*
> z$~lg^@JWer#Cej at 95-tm`10Yu0Q`mEGNYl*0n1yfr>d~A&xxKz8mY_2v=t6C-|LEe
> zrNYOZ(9Me{T%^Rc^UU7tInFzo&Nv5h+vJwt14R)X1`absWeF`0N~-^g0S1Y^&SJe(
> z!V}oHdDu%;OpO at 396#`F%fk}SV8Y=q*s)c&r6+^kGH^w}!ZJ#?nImT9S-8km+dE#d
> zxMR#W&B~i0sVw8ss#j{<+Ut_rUn%`uA3%iPQv(8Fu5#G0G^{+pNV-~LNIOi`o6v|%
> z`S&gX+$7mV8_(mE<Oa9UE%XSm77HaK;L=FR*s{+SoVtU$&g1*)*fFRp)mvdLL^t;v
> z?U*EyN>ql%*am()XP<z?mSlT8$=IW7Np`7QM%Xi$dL={Fb!zKfGGm)cMWd+mIjO73
> zus2oWoTb1aPu%g3?sD`15vu#p??RZmwz(*KJty`urP`5b46 at QUE?`65d}kKv_NPjb
> zZ6&acc003xggQP}OHnK=b-B$_^mQp~KL$7{0#ZWhE at zf>lAVV`Y$SxQ!b%<P8$Z_l
> z2DaTTUk at dnT$AShrLKB8x;+F?{SsONMcpEu{8$%?A%~sW5NmW-g|a|~>HTW9<&?jU
> zkXg_D#I8eaEOl2 at zld&<M2TxFA<M~XW--SpI_~1Mk_)N?9^=9+x8S&oA1k^1iB8cS
> z3GnF*S{g3`a3uh*<Pu3YND&%{1f01r88QGpvIWQe-6<XhX at c3DhWKRq^F^G!<N=}&
> zv~NKHPBa=}@SDUY18j^Qg>mMl#z;ok8#rd&nIWLR?^?X~72s%{OfCCmJ&Wy#4sfKF
> zbP%r9Nz&Q*zkiUfyo5*A6^#z%0?NQ at sBD6M_#;Abq at 8^Sm&(|^p1k{jwwFn at Oo?aS
> z9a7p=f31`b3s1RIkms->U+|RrOcYy2<PIg>&bVuUhPD9ihjhja`o}3sXOM0Fpx+wy
> z4*F+>G|{w(-kV!WTX=81mmTM at uGv^~STo*FXT{lq2c8QRrT9M%mC#%!iQZiRW2Ciy
> zAU(Sn$dEGGW?10BWQ%4!pI2npq8~Kd?9H}zOw=Be+t66)$T40F-}=+ at NVx#V#LYq5
> zz{xMdH&jaZrrJ3a+3O at 7%A!hYR<)JbH=`s{?w#eC)A*Uy5DW}H(#Q2bArYb*W*ay)
> z;<|ODTzt8VA6ViykDce2mbnwm5%c^lXitt}8v;a6&kn|@*9Sd2I`l2u%<1zk1LS40
> z%!Vc+_gR3x>^_6gp*fuk7W+t1&)n|vp4kCpUS!|ee<-y4Hk_beU&e0k1bw|9mquV_
> z-lpgX<K?KoA7^In2Nv*V_JYS-&!$MevNsjT&G5EVrXtN=q9~7yq2??2_go`wy at Hby
> z&wF;{tLB||YdeIN8gtyd3rhF`?Ye?ZTp{HHc=Fx<46IgoS at sQ>eRI-D>F^s-9LvSC
> zkJD`43R>8yXzM{mEAL~lkCsAhQA+4R2r)^WeM(0+{7!0zeOnK+TxxiLU9`GktdFro
> zI`CD|9RZv?Qz=w3Lb2$EwP8M&X?W60rW%Aau=VSqIK5Kb7T|k*<XY7?u&SXzs2oCL
> z>0khx5(|}4D3 at 1CCYKh*0w_L&&Gg0roPNt$sjIcD<%Uc3z*cM`*{xWr1Qt~#PxU_A
> z8P_sip~ZT6p<C@!wOW9Ac*Dp0*0f at f6)Kqlpuj<8XbuL-B$p4c(P?s8<nwX|Z5_ag
> z3Av3Y-4=F1jx2vmkQ+%?=Ou4G{cZqHp4>sQKo*SladIOAVC(HIEH`!@^I?}x;^a;2
> zf~I7ZmU-99jmkX#gYg at 5#vsm&h#yu$)SXkh(|RV;#|N=Vl`9{kI|gw{>=osDRgqiG
> zG#fGfM)YS$pFhgS6~#Rd+oHD+l2ba9NfyZbF^Zb?V&-GDU0$dBHn8 at vIDp*D?zIBZ
> zWi;tvAOjc$Bl~FVDtyZ+pQg1zoOm<dd1EU-6}UA|hU9XmvCCoJ%{DZ?2&QHP5HD4G
> z61(a(K0Z8^u}n;Xa8BoCmg;YCYrXp#-EM)km>vq^JGt4<<q7F?-vk^0G+`X=z~2<I
> zfC}FZ7cx^~FAVhTq=exDq_jhI=bXl(gbZM3T02<J0=E(!`^3}o9^eC0rB9!07Dko+
> z=wmch58(uN3Sk0pDT5xkm!YAL^FFKe9(?}SBvaVe!qhZFEq6dIZO;t~;|lJqR-xNJ
> z6<E`mQN4VVCA&HeE#6xKr3_cT`_GYE?Y`ip#h1waJ+r8T6DD)5bPFe>)!BkqKJC at C
> zYaL14D0wCO)N_j2KneN89 at e$QB9OWzwu%zjj9z)CS0f>R9-G(e^j7U+AA=aN=&Ofm
> z(f6cwj_!3r10s|Lr1Wxcsep^Cl^bCgm-ljjaC)MaX#p=p#%Y1$SHU11zYbTbd12H|
> z>_|k##(_;w%hXfGGpZ|N-29cXue|s1F!qgKK0%0USo4&<7%(Nb<=yf^piSd9VEJ9z
> z!VBq{$}G1mYk8^V6ww$h2=>3Jze0P?Gu`s}=`Yzp<bIu=<%N_<475@?gc$~sLa*YB
> zgT||s&kgK=#?^VYS1=ZkVX(gu(hMR>6g8`al)4ko at 4t3Z2u--XW;{Ct?9X8*AMB)X
> z+x}~ZgZ;VJ!^rPm9l?VEv7BDIWZ(L9UHPM0ZSfBG^qN(K6hG-Mmv>r?+>hpnTki6d
> zF+bXAj#!Wp_Se>#Bj&GQfqpyq0QEg(=4F<x=G*2+g1Z_18^NzN-?pe2{)^!M2KXO;
> zWrq2sMTL-pp{fd~rgEs7g)^_K=A)r%pzK3eYq2VIJO{a>%yr8w&p==!1awgFH29wa
> z|C8W<B2+N};$hsyB at BD|-jrPC=dJPOD~*<#Rnl%4mlp>o7VX-Gie4hxMlMusgT_<V
> zKYs8bb3}J!Q8U&yni{x%yS%fp-BaectKzg$1~&ik*NKpS$&CLgVDYsAej53|1;m^V
> zxLjicqPK!{*|!oSS^;z$nMd$HQKKMa*HwYs?_ygr!X%;zGaF>Kfqy>+GX;z?%#_O|
> zC<ld~g;?i~w15cWH6oEtKBR`umC~#tIrirN-mr-cc;gz_vh`5j-s?GERu1ESJH~YL
> z^kYGYD}izLltK4u%_;LG`R at RDT7JT7mN&W$gbxi9q_g=-snJ>D8&(mG5;rGQ98FRS
> znQ=p4g=mSz+L&QZ`E??-tA*rLcFp at o>t?ibaH2)EYn3_Wmb-|pfom=G%rTE$kU<;N
> z!q{m_6Z&J#V}Bay{hO5DSV}tNk4UQggymtpYHE5sf~KvIH#$qimD`)AW^BbITfRr$
> z?!C!8c76u+sf8P&q1f~Wo>YX3Ez}5wN%L2bbn!NAvwRxL$ncus*Qn%pR3l8Rn~#aB
> z=ow-FPXE?kr#acOwa7paIn}O#+A>4~TX;npv(B=asrGc~%_$2qSTBj1=`gVcCvPAX
> zOfLb at D<G`JqhK~*vx41ksySj&QBiY}0SL;1&TRI;jBVu`fFaF64Y^G-0Ig9`ogqof
> z#MH?X*zc4;>vZ4%M1Ngt8FL}#YbB=C{|HgHmVwAW=s)O=VgezlP-r`fnBRHC{e?Hz
> zzKXm at G{4laFTqTS=iZV&XHU8$$a|gX%E7J?8dQu*NKDb at ky_yNZHy`6i{7QLYlRVG
> z1UnS{+BJ&U*v at WN07n$?>?k+zGueGk60LkT_GyLL<3_cX0ybE-Ph=QikK at W=7=TkQ
> zy&`cCsvs4NZ!SI0-faVR+^-W-fp^=a6H+)#U)2fYbc_HNFlK{x>4e1jC%oSek*T4J
> z5KWuO+Ws6M+u;LU at Av(=*X}()s`@Hn3ta?p2GV<16X4*<PvoG_DIcL#dLfyU=pA~Y
> zWbU)QTp!;C4AIo-t!o&S^{Ko|8U6LaW^gWLD7EAvW`^V(&tj+Mx25)~SjZMMkMs%3
> zA+ef$=I?`;sWYixFWgj?#De4w$;q-0HnZPu*e*iETUyrk0>dG5FrOFmn0{~xWF${j
> zr$z!MJG3YKau<ChLP(E&fQX&5j_KM`$rvX0d_RM}8X;_Fm*XoVg;dpB@)mker0~aE
> zj`-?(c^}uOl9s{7mdNx5sb_TxfL at 6WF4_tsQIAlyidzd3_K(C#T#h0xlBCP~6&c_m
> z_A$XTg(-jRE&#Ou2srH9Yc6e?w{L2cP|wvB*byiCi)7|n{Sy_p(qE{!RsKB1wfl1v
> zcb-2(aclfW#a-+lskpWNB*k6fk5}Bg{07Cn&mXC{EB#u<eaMd$_fh5I9`ij>=U$<B
> zh`UyCCHG>*ZE)8pZlimi;%;`^6?dz<N^!TrhQi$KZmZ%pyG6y_<t|p--R at AAUU!GO
> z)anj(sm&eg(tdZSOLYg_p+33Xp*|gQhx*j%4)y7%JJhG+?ogk;a)<hK!X4_<ckWQ1
> zx|*Ke`mB6NG&Dro20wHJniYx7y7M4Nw<=-<L1I)l55J?m7xt$1Br!>wUDucxy00Oh
> zBCcMJUG=;Fc95^N!6<ouScuzBazfwOD-k~z2x~te$o&Rk;llSM0q{B1yU|zQd6;1-
> zAmFHwwzY|WWm}&`K+K5oINxgg0#VuP$Y>v5Zh)=PAnk6 at HE=D!YtBDJf=L+0-${0o
> z#pKSmRBtIY#tI|jf1Svl+xk|+R`p^zf?NpiruJB28dpj;#R8L8N<WSj3c$G-a<Yag
> z&VpgW6mT{VQ$RY02{XZoj}ywksR=pTLrzzml9m at Q%m-(6ys!wI at 8gBBDGPk{K2_jQ
> zz@)q()L%1 at Alqn0f-q&)Gl8AmBYW5 at 2Q<ReDZo}4mOI%cu&XH*|D6I7^hvJ{8&*F|
> zI+*#TJw@!^(_??2uO|pbw(^c82;-N1evWHGB1hEjLfE6#ieSVJA7_eKtCOsrbazJQ
> z2-zmC&@$5vGwj1q9uRGamrR}7{&+TP7%O(LV#A>flI7M8iRIWzYljQzV`uzUs1CF*
> z_90`>FsZb-_^q|=I`-m1G!a~!|JGW%XE;#Qwe;9<ps3$bdAMNWzNL|g!sMtQoLuqt
> zue*D(V&%)8C?xTVR?>SCh3v#B^0_8-T3uy#Ijj4)DX{SGsJYZ|fbLEd?EHEI?N1c)
> z`1MwrlO#OBuRlavl7!{_1|!uc3sd<GD`<JL at a^bDE4MFT8ZWyoqCqRxci?6c1!Uxy
> zcS at fipQGjx!i0qM3xb?+T7AL}39p5!d1^adJ3=UkSf^YPdO}jk>!@plkg8kPc-VcX
> z66_fv6!DEBO-m6zO6_v1iWh%<`Xde5WuCccrETy)N$8$(fD{*h{XOgQNDMxY;u}*g
> z at -yugeN7cF>WU-3KIuv<uKK#?sNNk{F5*LWON0n1v5?Y3?;9yt)Ehh5-4oh2QrK9h
> zfxT*QU{j~gAHxoF%yEmV-75IKnHjP2hEnS~BiVS$$LfP&m?{N^y|Zx+ZICV at U$v;3
> zeMnez^R;bLiLFv%XR at 18&Qi%}NI=MG^e&K$PE_gD5FJ?tl{84MP8E6pBuO2}ilK_1
> zl)50U4$uPVKNCW#o)IIx8vnx1SO#fX6&Yc<O&j6Xdo@%$S}2|QJ!_xEgd^M$7E>hr
> z%IV(k<qV4{K0;}E`l1=o^7KWv0adsPTc~gKLHSs?Z!?s>+342Mf at vW;e_ at 5<rmd_<
> z?R7;OhKj6IimbR=q`Gq$yA&fYtg3YhW)-CCy`j at I7Agm5)uIX-ohl61F0w)>Vv$Jm
> zQiW067CIwUD44V&{3uC}S6B^^t37ExPTuRE*g1CbIa1$~gJzK!bIPK{MTRYWyQ*#H
> zzY@$N4sND<QiaUfAvW*O)bvPWprf(Wk)u1S920lITJIv9Je71XvvQq at pAGkZ4~5u^
> z3>)}%ecQ56wet0OclK+c&`R&WX@*hwtD-^YkWt8v{qCSCAd-`$!)cU1C?5IscQjxW
> z?yM7$0U6shise>jJ at w}RQQYr`uvU4Ns9MyfAVM3{0 at AFKfR9Ha40W4r@Jd{#*5{N=
> zN+{TUCo^@&?jFh=@}}a*r<W=ki7dcuJwT%N{@^!ByFheb)R~#jPkUnT4|Pq}rfAqr
> zqMMLp5)ny}H+l1=U0eBi2KFe2M9o9UI~XIkZmnv%16<(Dd`{)41Efpk9r%rMx at 7b|
> zBrTIOpfU4g$*-0-fNvH%<b;&v(lVxP=SqcgZ*dSL8WP~?X5Z?)C4`e^SxJ_B1d7b+
> z<JwXg^A}Y4>f1_uJg`qH03XS|qJ at B)?7*TOJYUb?KNh4~$6XvV;CnA at Spa>WK~JHr
> zX~4Q2p`WAyol{deO~|ZkWP;LF=JX|I7R`xByEFZ_3hU+19E2Ymx^drpL-;)bQR%}m
> z6O<SN6}H<k(aKK&za68z$^i!6)My*{-0r<7sSKE?LWe=NfiDvSt~I4~(n)gIeHyA2
> z$jP2aAZvHlT#^n9-C?V(74t?QXh`HxLnN1Y8&X3>u5i^iu~;WNYjLeHh2y4%n(P)>
> zoV6JRuRa@?;z at 5pWDGFs>=x#Q0FBKM;<@28D?^xnQySSdHLW278Oi89yO4pT?z!7;
> zBGGc1-GKCR7K$aq3<eYpZXCEVkfv4A400CTn;|^LrP0DnAz2fKr}j)CK{Et!U#3vP
> z71P%<g;C?~Azjrxde%F}W1asI3OYrgMDMUW3NXW2-d|e?(eynfzvEla;_1aqA)EVv
> zj?NN{@f3IJ+te0R8R1ej-{4jkbEDs-bFyHIA4_*+38Ug#eCyfw<X&B$R$4)J*#=M7
> z&|_IbO4K_{H2Ga=;A8gUmtM>g?&O;3(rgeU-yu2YBFOqa_L1`yrVmZ2{~4(NX{G+A
> zY^eV%{UBSIJjvIlv!LP#m%4uKel7U4`x}^E9x2 at xY)a|WvQ%iAhFv~(3s$5#?&jqK
> zbWDygY1~*h?_J|9@#$czAI9DdqBxSrUJgz>th8ATZH^ALx%)BN2wBE1*mDCbefK0^
> zr2OYjY(ZaX-9kCy4UPO at OuPzd<$b_vRo58S7SW$`g!E7+ at 5>JyQ93y?SIFldm`<y5
> zg at v4tw&V&G+<WwFE^O})QvDcV0{0O$j}h($XZIK(H{m09Y{Mrgu5O at QXhwrE;2ZRQ
> zM7zfb_a?TIG3=pI3)h|06DbK{9;1uiHCC9!<<K2tg+JDPTgAC_6569>N9YJ?ME9if
> zLf9wAKP5s+<WTI@^ip?bd7<#S_cKV1RpJUYr9)5+s;h9o;an}%a2*6QP6RRQEDhWq
> zgJ(xEy9S8HYeeRrQlZ(J(lgp^uXXWfwB<&qrW|-_*zRBejnF7lgxGL<m#SPe+G{Kt
> zk$#mYWa`c`b{h8cvy>kvjGb#Y>xKKQ2Gyr9NL!URdD$?rhT`b2&nk6cQfc5cB6^6}
> zSlIA;O=*7GzPlwOQ)G$a$qXenR%2leZP1{V>nxOv6B2c-&>xgbsLkVqG=7~(4~+xl
> z4mBN_ppS)+p&X5e4E}M#m>V@>lkHSlPqfHuYhSi}qiN<PBh!MyY_>L*Hf?sZ<1C_#
> zN8vj0YNu-Qg^@hCkK_yK-0SrDd=RpCdFFeJ;fo9-<WLByu7rH9$e|dlXFi%#04(b#
> z+v(H-C}AXBS|H4-^8qzM-Xn~RF<#kwL^4Vii3|Hpk|^=l`Bln8B@@7xO89ELMG~&&
> zEd|+R$X_ODLJyl1c<psCx*>lZWY%AoAp-nMu}QU5%7DyiSN&S>E1e;(&bUx4F+wxL
> z5Xwd7A!t1?(rG|^Zh*CE2*oiyYtZ;12zG66r6<jb9*bHA<UGnXO5$w;$ItBBUnnGS
> z+(-M4jTb1V(aDc*Iw=R}eG`O-lOKSkTG-1qLY=_R6&e4zGr2rB7?k^I{{&c(@6mY^
> zh3VitKT-Ho8C1jH=j4dXYS1Ua=%j5K)vY!^t}ha|)@sFFMs1H7gbL&8`=mVBCGM)Z
> zw01GuB|I@|am9)>MnSu%W0H_k*R{(f2_*fT)01|NyTgcrBwZ3jlM%bwJB%)#fcz_f
> zxR+)vK*7PaB!{KuU?zO5{vB*Ek(O0xmAv%j1FS*J@{}jd>$8t1!NHHk%nUsELI at Jd
> z$nvBsC$30V8gDg37$l(%hD-q{H at eW^x=>_jiWCr~Zy^Y1oT|oz_;75x7e-Is>@odc
> zur&bt{{`-jy8j=A-f>-_*Z0AbR$fpN48h3#gKLL6!46KZ!qqC1q-{dKiG7sz-6)KT
> zz1LNhuUd>+E%pMUvkkUAPK}d=gor=URuJiGld-pwij#$ul9#<U_7zV=qSpHn_ at d<F
> zfY_6~m867J>`i5>0djB5PhZU56#%>8eNQy3$2A6`k~^S~?NEsDCSYz7Juq3AqEoEe
> znn!%Pm<~=BhV$SKFA{#?eEaYe;U-Qs(fbXxOoi?2nSJ+66)vl|2D-uwEBi~@U=~tU
> z{oeQJt7Z_JchR$EVHG!#E-w)#j4O7l?m)<JNaa=bu#Z&UElLco-h!}vT=DaVRq~%;
> zv-@)2p%ReLp at j3Ikgd|m at 6*wxLME_V)>2_vvg}iNOxD_d&c14OVVh=CyKnW!dNxJ$
> zgHmA at w}eJpgr~vTVG-_)b at xhbt2edx)t_Hoy&S#h)zJ}Uz(nY%qfD5{OS|aiGU0P>
> zDP3+A#(}fhD$EAw6og{gbQD|T{D|m0X~ZS(qQ>dMIw*MebRnoqs~*M~tJApAw6$D#
> zIHqCn6>&UemUp;n75afrtbnolk*=%|a^sdL=Vq4jo7N3 at GKmq=U!<>B2oq*5VTV}K
> z^z!ipi4~i%CliwDP#H3KPm30#)}^vo9%3r7hB4oxTJQO*G4Y`o_6o23Mik>+Lh~v?
> zN?Af at R6+-q(Cw8%=BQA;>>`St)!P~K@<b)W_#lD|-&ex6YoPHqVKQW>vI)s?rvpxh
> zL9LQjD`16c2KJ~8Xp&3~GlV*DHqQ`JCMg1t-flH;37$0fEQYt-NH5Q5Av3(ES<Aj$
> zI8z{O3Z+SEFHgH>0Fi5;7iS2QN9p2gc at lzg>#jk=ByNVuo-tE6UGNq$S`k_WWRDr(
> z4B2LVDr~~KEo3#iJWBp|NJq<tHd<Q+{eP1_StXRzz43WYd at TQlo0$!@<JtV1pBo|k
> zX8Cf2f@?|Fu{e1bMjQ`h-6*BD58vA^FZI3;4b|?}|84!>J|)l*w?16gK99+b^M at V9
> z?I+o_0V$QOj&QB6a-;6<8dLOW at 2!oTL#rDsM-WEKBX%)>c(l3|BJQa{n&NQytx!0E
> z4~O at LGDKO!;ddDG5c+c^1kg_BwT8MPC1f?CReQPJ8|0;Q$IU`w!aL1u97uOs&&U7@
> zy<pJ)L_fJ%FwJGi+X(Xkl!Y}}v6sp$vHb*$aybm_2}>qgWuAJ}+C0aZ{@k%`sj{bC
> zgE=%&p+Zl2(i+a-I1<qwp}^kGs5v!P3*XG0Q+1n5kkDRTz}4`Ho7ttEv*B=qhMBPO
> z%-MS+;0lO4+nuEwPM-Q{pp+aU=^~ed&S;3$135_)<cS~^8xDKs5Um)$9kE>Wo>@XY
> z_Y*xkOL!KX)po%a^S*Ps)3kje(<VoL1dwm-!l;PC!RYYF|3vxOLM~8<yxAa!HPEWr
> zf=$<6z8Mm?LgJ3u!nlM!`<o=*%ZyF_fsM_83Oe>a?P3|)o8|!4|3r)C2xX8BxIt{^
> z4^U~2ki|!6>FaZZC6KD0D?Gs;m1x6UVN|wUtww5wchV^LSmyo)hhS4jPcb~AN9O|R
> zl4)SBkY_lmwU|go(Q+;SeS}$mR7;EI2}~Ju?L1*y4kV5 at Kw=|bRV!*)azm{lmS`C_
> z=ExDwg}yWBS5o7AAz|zRr_pMde}~dk#J^W%cim%t{HRr2MO;`#q9v36UM0=IchFkM
> z0JS_aUsw{ca_EBv6!iUkA;orG1Z*{Td(t*$*l$BcRnOJ!V at GCI!yg*H30zlnjPhb?
> zIdF$+KqJ1lKD;j4sbzssJ12r!@3z}B>Vn-Ch<)#jN>T?ph|6i*8m+uA)E~8$x-haw
> zBdu>Jud9z^wo#5+8`7FL%zFt1i%cWJmu3Nf&o2<NE6&@3SLk{p8KYdEI5U*k&?TXG
> z6^U?<hP6=ST^4UZN$w;^LGZg~T at f0|J7R+W60JGh)xwtFBBYxRy6`F88FquIL+J%u
> zNGFJE2*|sPw%j88j%%m!H6YR*pik5Yh5S(~-BTmnSoe;}SqgI>WgDo~Gb?k~M(_V&
> z?S0^)s?z`QbMO3N=JId&kAg7#M at 2wICB$*S5g8<$kQ9*=|72!jBxbJbHWwI`TvSBl
> zxP4s1(#iVxA!<#nH5<%~S~ItGs_iSg<hm}-Sb<U!P4Ii3doO=P+wJxHe5}L!-1GN2
> z&w0*sp6A{>_o!#X0%N45`xdt5U&g+TD5N#Ae>9M1sv+;RUKULns~TscRb3s4(g^zK
> z-NtRE5~4k{VgE<|lUN(t>zMEFQ`urY3n^zY#ee)mmG2yyB4n1qWk%&0ONsyF%A3bm
> z3D=V=zi#Z3V&BkRixffL?^%=`0qEmFVlw+4J-$d0ue at LY9X6X@U8IP4;7)67mPQpN
> z*YK^)Ajs(+e~7rocF1d(bgw@|V2;xv2s#m_KCIPyaLV;XAlz@!vLeO%0e}3xyhc at B
> zQLR0`@;Gx=Q5aD{oTq8dVlXCzO`NV-tXRtE=|_uUsp%<O3~Q>1mJ};8nCtY#V%Tn7
> z^inZwC&fMPJbu)+v8JUbsc5yl*J9Ic_Bvo;EG4N?|3#|$Es;{LwrI7-_d at O#s(nN;
> ziZRf%M-&f-*KZwfm+M~j-m(?H*Vpb`A<vZgqy~f&UfEpX_>nd}qR0@;h+B^+q8?4P
> zyBBE~h4>{vi}tv=n=$rTPPX>o`)wb}A->VB9xTD*Tf&xaTYJGoi{!uRuKccweUkV8
> zP;uh##=fn7c8|f5FIu#>*=`wcHTG>=NjEQ1nCOKiiU`FMg?D&DZ!J;Ov7a+^+fv0`
> zci8c&egZ!Nc077zsUji?6Mno^al5j+3KQYVbv(Q+LYgL~laW&UJ6VjKOej&jz{Gvi
> z8kD7n5}Bl!*E-!S%i5v`zHo@?mI%yoy3t$96iIGwd`Vlh^KUeMIn0L}Em^LZ7_y|3
> z+2Pi}=E;e?ro}G5#@=w>)nbx^e_^J_mMccZO~hl;@HQo`8e^Y%v2d0nQt|_DYl}E9
> zD_YIC!60rfS3CelRqP7ICzIb3UX;o(_T{h0s%1;wCV1DlE%I&R*kg%?6_bJa{Bl^}
> z+j*rW39yXDuT+GO1zWl5DxS&MDL8^~b&HQRMO6~KejB6_e4#S5yJ^`<MZhR5 at DK52
> zp|&XDl`Y|=$RD%m!Ig?>3o-kj!n=?eZBcgYGS;~qZvxNvw1*3=e-F8lmJF${u7N9y
> z9%IJ7hdzh8EUbV8Fwzj?@zn>K at F>{aLf;nfU5|%bv_1Yp1OGfe6F<O-v>cy_UH#x^
> zR|`4+z;gIozCL{L%t9mE9#zE5LN+?^>COqIz*6VnG=F_;(qR0XW0MEt-{QFugI714
> zGwC;v!m at gW=B`pi1YlR!`N&Sjxx6i^)y+}ns&p==m8%qSZh>|mV}I`|+Pq4!Z?Q0T
> zV3&T7&s{@TA|o-)9wh!=t?FNV#y}o&6I1MJk)QYy`a^HSpujD+{{#bTd<^JGKH2w}
> zqC>_Od(e(26f1p;RR(Rp%g*jHWSO+7>4~4q>5{dI2|>x7HE)ql at BGdR=Bjr`V3%8q
> zPoiJ3ioUoO^e^D$wF)D1i-wgd!p*n*cjGT*yTWg2E$g}!y2ZsFuraK#=XI*^W>~ZL
> ziSVu}$NfvaX`haz*tkx0tIvH(t{o`ZrvO30n`_Y{OO-&e(!pX2?S9yx{C<tC9xU}r
> zr<*MpTsT#0z$cu6^t)iA_raI!i&gvwb{_*f6H`=T3JqNchW20S at pX#-VzyD!lVGMK
> z)3PVQyZ<Xa at uXrIe)FeHu>!8Pl!0IMSK3*om^<OD(daSXn0>6qn0>a^M93fIGU5Sg
> zXAAE<XUXy)8q7~m$dnm#y#GkoKBWi_g`D7Q<NirtNBlqVPE}yW_+_mn1WXtMZG1`*
> z!d#%Ip`aNOCL6QgjRm{uaih_*7W_vB(sJ~j=_HlFj;+#OGZF88aNWF(IS1|-v;Xi2
> zpjlpD!RXX)Un;z_Rhy+s-Unf;DV%pRX8-p$X&Sj!euQDtv?^^@aPn3N`wSWa1~7S5
> zP6(%SPf5{u^KNO{Y6SuF!-E#CS4<5XvkJ!ce455W<Z|AFc;iPmWF2}EE!V04q at m60
> z6*J5eD<<jGW$DK3)1S!w2o~}NW^g+0haO|js5WGPF=x!GRN3=vn$}-#%)SVfe>?}y
> zheB>aiu|JsVT2~aMi<nQ{=z#u6Eiicau{(z8X+W$$j<>~=r?OJSMcQ~&F+3^^K}z(
> z*MlphmmBBC6w<PCg at 3#$f-B5q<mJZfkDWTTF-13aVKt1!U8kPs0i>z)urV13BcsR4
> z6~QVK;gaPV;z2K$E0WFNqI+j)*}3?QJY&uuIx+)Dd8R*f2kAs1%+eHKl)G{6Sfx(A
> zV5Nb`I$#KLqp|-IkmmuEMi<_xUJY at tOh3LHnA@Kg<u3<@6X;jV0+Wq%Q(rLV{3gg~
> zT)57_K#f}B2K~AfG?It=fd{NH=kimjvi$^R7G`pmM^-2y#+*xkgh at y>X1@~&>HWs+
> zuP6|52nd=4#B#>$H<iYmKoB)~Ig#_EfG7Rnse0(tnJ#MEpolKeKo`1EPqrI#GUoz`
> z!TzuDj7hVj5J>fum#}M$Ib{#)iB^^GSD}ZR8dHRKziB42%C8#A5Ef?Bn6qGlK`ZMp
> z=1e^RLt9A=Pb;#`*~Z@&6yDi>37FbxG*-PJNFzvMqHKbHrXMLUyi=n}_jqlsp0um8
> zjdGbOiC3nQSQf_94ouO5grC%fyqOIQ28!4%Sz8GHO8{P|j5*(*%F-x~fjoJol1dgR
> z^46(yFT>cO&F?y3Ld^+!;szY{048Y at jmECG@foX5ef~h2wq6U3Xh0Cv5XS at I)X=Hc
> zn6q{tXoP-{h;%SU4TZ$J7^EgyUQ1-4UmKt^k3zy8HRddS2w0R1tdj!^{7pE!gy>lr
> z4}#sFU8t!%YFaUg{4w3*V{hZ!X-1&N-Twuifn@?BacizTzw(4`Y*{hjc;KB|s<skT
> z5$UJR8x`4F)|;OLyznySta#J}i^}MCMV-~D)`2=>aK5Sb8AY_-n3Lgx8CS^_#3R$E
> z8dpTRX&&zlM0uNFL&Cez#<`Pkz^pT{eiNWYJh?g<2!%xv=T5ggqev-+TG=3|*&v8=
> zlZMaMaqj_t^`JX=BF|*fGNVX2%sMzq?`aD)zx9B1sD~jd;M(5=^HO+c$8m5;Jqq>`
> zZ-`&elS-&<Q-kW#P}L?ys2O#Xfw;@lBC56Np|7o#o5%}k+8QXOkb|OI153yYT66~n
> zFEtT!9Z&>g`~IT7^E64-jAl&}cO)Bgf*N3wQej;B0y*EG at 5exy^-H1Ldx^5oPXiAh
> zP9;2nvW1yGq+Dy at Nt#xpB}x3_Zm`Bx`mWOi*P=1!p*Wp-g9mgt#+b7s)!^NahaUQv
> z at Y~d&!@#WjFqMR{`rGLsH4p#3 at J{7nm^4{dvUexs%Yju{1oR)&@gsZrIA1x>g0oVS
> z>Q=#=WTv_u(a at G1iYT-G0?a1-LwOyE+27^V7wxQk_Wl0Osj=R5WOU;f$9{ct^(U_f
> zzSZH>ZB$PGy}jt{3k&^5<*)lB at 9}kiIDU?23!W+(mp4(lCnEpbeTzK}XMShgQM12%
> zO82}MM+faIS at rjM{E at H8`=5NQ^0dwRrr|wvUCY7X|M_#t8-L&RQ0DT;XHIqf!!pC?
> z+oK<(J^bpUf7_9u3LKN+wld&}Q`4TUy0PHfn#%XT&JAfaPJaAWUhSU8`Nqn?!VQ0E
> z{@P&lnmOUU*3q?7=X`$o(9Nopzg36iZ+v$7{D1l%aNl!l`=^BtV^>AwTlsHqDjHv!
> ztb1Iu at Aas+7yjmEqW-D6df(-56=wb5zkE~UrO%cwI+gvs_Q56UBb5q24H@=td$C&@
> za;`IgsX58Ks930U%Y1a%iYM2_)6gcxsFTN!D!x#f6He?Qs1i>d+ykr^|0yI?LOAi#
> z9-;<}Kd^^zfEGYEz>i+pLs0oP{B95N1bp$#9^wsHcw`Up!t#gqkWtvki+c!?<pt$@
> z0DGXmKcM5)xb^@-%p~jgdq^N8Tn7vSTmppPzv@#WVbyQ#A)v&`)we_f)8F1h<k&GF
> z650)jglhjN61D(P1$f}JNVx7Dk?`twM1nV*5(z%>4iY*ZMs!M~{OUUrrDsG+FGE9q
> zfN5~;3z&QI&1S`P#{BF at B4J!eTsso9;H*f{!4{FAt1TiyCfgq34(NYg>^RjXcD%er
> z<WQtd?3c5N{a$@n9O#+%#DQ$0V*lMXkz;SaD=^BJ*dPH|N16bG0iQov at rL40s-T6Y
> zj5O^NkFQLNS*eBppLu-cCWvw;=l)UQsWhKm)gUw<Jf&f9qLJ(`r|%WWK72>y+Y)^P
> z$&+v%md|PsCQ|!!1A%Rk<UG<q!T>e at 6W1PrY<i%9L<6pY`U!xWjSb{iIPA;@fx7(I
> zeIyYl`aEbdP=CbZ{e1)tj85+c@)BU9Zv*)~;LTNW?QZ~<JQmkp1X$-^N78Y7_p1YA
> zgpk;PI<gS(Rlo(v?{oVIs9dsfK?6C21VXt|X<%g%RzPU~D6V}Ei6SKMU;9WsruOV1
> zM^WU*#I+v*T)V!3yal-W<gd;u=CQJZ%zXO6IYov!Ma{AalwtMz88#Wv<0FPm0W5>-
> zRKRr1gJ6J=4IvkT2|@vcLI}kWN+7I+uo}WztP5cige?#(5UL^6LVGoUtw$gZxF13z
> zWz6hhh#Z9wdW>O at 0Un2N3W5#7IS3aZT!L^J!WR&(Kxl_>4Z=+boe;Vq^kCy>7?was
> zatIy}G!XnD1Vhk5h=-7X1BH+d!LZ*9BZ7ztLIH$A2qh3!{+qBG!deI$AZ&ubL$E-o
> z#t}l;51|plVF=9-PC+;g!FIp)R{n?1{x8BgdgHtz$^2zZov;`%v`5tm3j)_%c5I!n
> zmQj$eLprWYTqJ9tJR+{^HBd$^)%^y_a8i0N#NDO1e{`LISSA+Yo>Dvk;$FBoaOIqb
> zhENgUYT6GOK2p3L;=WSHP0+DSYBV0={t}^6p>BYbJ{8IbN#(O49xQdX0ODh$cpb#U
> zq_`#8y^d(53Oi0lv?`n)Z1wt+UUo%g;DiJ3fb2my2jL2YZV163ODPbtA(TMiAsmKq
> z>Et_3MU|(SZv|OXC`c`$(v9p#RB at yc(cPUiBYJp~(}<cNat<*#j9fts4<{Xf3^2PB
> zQ3XoyLqPv<q5*`4Ndh9Yi|w!~Pol?bFK<$SsPQwC)fn*)B%2U}f`|nXI;cg24h{gy
> zfRW9JayhXf0>RjzOsOQTc<m+<D)aCnU*NU3H at Sug1iKJ}gT?$&qlgMLgKTsN(IAGJ
> z$B<x*goTL(pu=dmmV-DXBYJp{bVN at tQh*2zV>!7dgcRd-Xc$?I2=y$03K(%cB8<2Z
> zQRPKWAws=YM2#OPIY8i0C!o at da{4ETsJw{=5h&Io28WYmKsU(OBSO9j5%NnAA- at a|
> z#o~W6h2~!}hr-+qn?nJ;L{7jQiU?CEAWWfv!6HX-3I)#IXA1d0f#Uqna~Mo&|0K?x
> zkUuzgLsNJ3Pyc at Egekl4)R}+T+%^A6oV#;~{z2q2VsHq#h8P-7x^c>gI8rwWf63Iy
> z%@_W6%j<tTHRhk2n_srPer{R);;AwJ?6MNB|NkzlUpy7&fw}PbkD9Le|8y!u&aviS
> zwoLx*R0!9 at refqO5w3qm!I}T_G8scOAf)oJp(zQyAWlij1#wFBh$<DyMO3RvF(Sv2
> z)rcVF8xWzNYD7;@asbiGiyXVa#0qnG3KL)imk>vVlPecS%;Cwu_A7R4$47o$PnQ2n
> zFbqi^;PLOpc+Ks4QV*f>Z{oH7+j`pNr3^TERI9w{k^FGk%4HiK)n-08OS`ZjGgq5g
> zUT$2uX>rWTN3^roZCL*+A+~VC^0f~x6H=)rP8oXg*aT%e6VS at C>?H`7A$$Sh3WRGX
> z4<#w*#`)E!H3%DVO>~1`Ry-fwK>xf%`2bB_sJv|M2B!n9_`p!n`G^O^J$x;sqtQ|W
> zhz83VNJnGkFd(*e0uWnk1w;eoOF%SEZUPFnL|9xq8YO*jjm}9h*v9Cb><^D?N1Nm#
> zAlM_B<W(q$#)w=S*N)za9uN(XjatE<BgX&*cMcGZkkE*@b~Hd10HPaFck<&x<z&U^
> zyu1d%iy{w+ZVAa1-IC?=>F6cOgYK>K8$>^|sDVaMWyMLuQsrf}xju~*N at LXnQXKyr
> zmg3mNF)5CGIWEPKH>agI^5>is$1W~NapcowDUQ6lBE^wk*TlG4u;^||8OXS9DUQr@
> zNpWPLe7YD%CVEJ5WTd|oN8>J3iX%Uxr8x35L5d?^Qy`9mMc$@QH;Wg at V1tx_OwN_!
> z$mjy8GBUeRisQc$smy9XOe_OLZf%mv9FX#PDZfU_-w%kKJPfEXL!=oZ$imZr0{Z}Q
> zG*<wT`VK%Oup1DGlc!6gNf$eaPZvATr;8mFq>CM_2E=LFk}kGipDwnK<yBIBvs%jF
> zqzrcnv4f*h2gjujY*Gi80dab+0OHhK1H@^$Db?$g>Y)e4O6h`!JVPW5ofjlbK7(B%
> zP^6k6Qlyz75~7_U5|RKYc=~|pEBBD at nJoM5$HBn^Q;<?4V~5|N>8%p)Bm`Ub2!_6j
> zc0HkdjI;buPsZU4{6LqlRW>|u8j2+$!=>Wms>B-wh%yP~5=J4tPwpWxc!PmXELA3%
> z3s2UOd;a<FyC><FmTL at YxF;?7xLB7NmR31MNHde+V_skp at 9qpwTQa8Mp0wcVI+DDp
> z?yfZ0y~y(MqT1*=F?72M|J7fTvAA4H@?|Uo{~q16;nDI9sgOdKtWyTE4u)=Ar;J5B
> z2*^~@_tz=o*b_zc8 at N<_=GsSO^y^Ax6kDyLx+j&fo at -TNPkH6#`I}Jjhp?x|&|Q$F
> zIz2|rqM9;gXoI&>&ZN_}CzWxGk}Are)hmZ-Vi|OnxPdM}JiLKE3#blzTGVwL8lF;y
> z3Zky17qLK}mVS at 8E`o+V1=zHhW+7fLrt1Jzt)use_q;YMwQR?;^bBSKUPru`N4?g=
> zkW6&SdZ1x7eFT90><HZksVuvQHX#-+qMsqYxQO;4URgwA%b`{weXv{^Cp#TjN1xoG
> zjA73N(u3vLbs#;D`HA#v$Y<+cqJbMAx$HRAA%1k6u0p(UobEz&JWWqX_&3CBuT$mI
> zfVwwmB4YI$bOGYu-k{GS=AEHd#3ftkMZ{}c==X at ezoB6pm9ZY$RpNHA;>kw^=7+L7
> zUZU$DhuK2+Z3KeWrqDBR$<{^E>xd03^?C-fH_<82Kz4g9T>_V2LeXuAfhyXB_~OU(
> zGeE_fvEby>Jx{`ffA$@X-2_>UaWoInHHL0P{4$IlM68LR=MkaDZvZ3f+r?#A!iq9)
> zIV`&5lQKkXT~C+%N;!_XNuT?bax&9F-$7`lT>$L1^)z;~auRD<Pm2&$57S+MOcia}
> z45cdRcL40#d^+yekh?OUE<t>xl-40GDW&HTmzL6A#FA2)xJ5Zhv$9mwU>MM=r(bPR
> z27zFzsdlqc&aNt at 4N#0-T}nSfTvJN>5Z9K{NxuPHS4vkQE-R%Mf1?~jPyR+3z%Caq
> zCb26 at Df=v7St*^0_*5xfgSftw9z-lJrJn*a*Qmk_Be+f<0AS-w={hsyjxD7xBAzIv
> zpCKMEr5q19u9WH!6H2L9g))@x;$e|$q>Hn7;V)c_p?7#7CRn(b#D)quiY|sftX8_%
> zjTh0S^i?d8TuT3jm{Ll8D*?SqX%^y)Qo0#YS4x`@XO_~di270*SOu6_N^=kmrSw_E
> z*`@Ri#H><!9dS-69c=;3E~R;h#!^}d$k=Jic4Z*_lLbf(-lO!O-4<m$&Ba*pR;4$c
> zwiPJkrOSBc?{w={;8Ht%3*jrVvTU1j40Dx6Y=fkKib+pk(slYACjE=PvrQ1BE(8aS
> z*$!|MuL9|l+o9YybSETH?OvsZUfQmVrZ?-99u3vX_`q9hMZplBlA!v1a^d5v9;f}a
> z$^Z}#g&-cZ8tR$Focv{FkFT7y`q33n%wD%_`PxT^6fEkk?qRJlgRKqKd2reK#~xpI
> zcb)I<OTkbb<GKxxuHU#UWbN=u->(&S at Rh>D9Xhod7IqJPq#6Wk3M_?c;Qv%u3W(ES
> zDIli8Qg{yV0pU7=Rz0WmVbg at fAo@Sgf%cvb(vKx_K>88q3K&dtb|^=)xzfe6cwqw3
> z-vJkI;6;IOF^MgNb?{rjB3K8A#jp+#<**I_Y0o~G<14>a#<Lqrsj>!gHkQ&f#AjeF
> zAZ~)SfVc(L0^)CA4eW$D)b3P<!tBo2Da`IuJB8Ujg3w9-ig1g1?t-B|TS_x`K|Q{d
> zZbYmEkq2Zfw549 at PrG(0!`ZDM_PZf(8;Ct(HHbap4iJ098UaVqAK?$XOS(v^g^OAc
> zd_cMaFY1JgNo>88_$N$kfTaM5%zm-I344^`%<shbGKjO!!;;tol at 65B6Nrta)PZ=o
> zl!ny-9xbK$h|Q&R8{!+K^lildDW%^a9xJ7hdjXqD=>o*pO6d;7Q>F9_;#;Nk7UJ8b
> zG`1e_kEOH-kU5PsgwUh)%3$Ulj8A6H(C-l5rDOL2*ytnsl#em*(f9GHh5mqWmQH8@
> zI7gQuyifNboTncmd~ouo24xtdWEfdD!_qPPm91#`_REOyB;s4Ncr<n7Ycw)F#XH9r
> zzZZ?Nw>|2}Zt3a9PQhBL6V}Sjw7sMiFmw7|@*!GV>3c~szGm at C9nqmd^J*R0ijP+c
> z_6bifYTU(}!3U<swa-N}s(4ylJ3j6>P4*I8V^?)`BnO>`d3(tWY{(GTj*e>fjJ;$s
> z;(|KzBU*)9<JzCbyUS&9?Y{wB1v}rfXcf<>Bct&t$h+dUb=_7+LNNVY9a)AR;-Bis
> za`b*as>8=9X42hLN1nq)`F$N3i;MKTI#P*NZGWBc{DnPMM`ofk;@3dlM-Bwl5gYD{
> zW9kTx*RgeE2ik>kb%K`@``_Yot(@2QkQOw*b^8QYOPRh;aLblB#RpQ~e}fMOf&Y1P
> z#rxO3U=1|`76tDkuj7V0yMcU<t|CmyM`&Kb#{4HV$Km=M5)@ts?mpO*Vf%#J-0^_;
> z<m&32Iy_j99A4i*iqVHQ>?MyNhvw`hX!e at 2_mWFkepv(Y#`)Jg+d$4^hhcT(V|0~z
> z>&QiX#Q9Sl!6#RaIMG@@4IS at AryE%PA{wrSIua|XHdeUN-#|W%6>Z4${yl^G@(qv)
> z6-=KCjaVtI`b*K;FeiMnXV4m!Ng2W;giplBj_0n6k17VdTFh5T`RFw@?+`tIOm~;k
> z(OJn-?h~BXzTb+TKccsU8VP-H{xRY!CHP6`FJXX$ffAzMcYL$>;1#K#dQl|4_G8g(
> z-*8+cP985lYiX736^Kud5TCJ}h^!MlqIGF?Bo2)lPPLE3V}j?&H3yV+jQNtAoW+9$
> zF9V{N_5~mZcm*&FupKZQ at EV{NumeyAcoPsEiB3QTU^k!=um{i$&;=NZd{xO=J)j&g
> z1K)iCQ~`Pbs^w%A(Llr<#&8MH15Y>v^a2b890RBY^Z|?p^aqRw3;;|33<OLD3<696
> zEP!^t0DK6r9WWoT12FjHR|l29jWM5oUi3(-0at$&EwJ*Glx6|!>=x6GOKCjdCRL1(
> z)-0uM0VJVf+A%3 at 6JT|cn08c3+W at GUC8iw~)6Ap{BKsG_2y at pc6<iCbT_YAeAf>Ga
> zJo+0kZNHSZ5- at p>m{u>Pl>nYPEVfrGr4<9}Pl;(YQd%MQ at h?q`Ak~Lg%ETK6&!61<
> zzVcbl-19QtF<?pe%V=ZBNT-CkfccQF0Sp6lS at Dj7jPzK={F_!*xVid;73<4MtAH|M
> z6Y>?L*@_}1Cx at -9aPM@#g!NMW8nK+2Y>_H%5E_(`G9g1wR!S90gmjh^OBD;G4om{F
> zBv-<0Dc>Mn>!o_>(sinIog$S>7BF2#5~L2}C5)B|Xr+pw5(Z1@{t{}eCnx<``G%J{
> z<s?$d5`RDq;1?(GCXS3;J|R}zFJ0G5*JUU0R)>tNm97g;AZz6$<pkaefeucH?GWJ_
> zSpTNjVf&kSGe=IocvIxmY4Lh4IW8qMzbQ6&>`iebN2Q8~-xP=5DCO^$%GXQRwG!66
> zd9tZpIWARE_Nkohpl!i!v$9CSK5}V1=wu1Q00X5shFB?{2>6ABc~kb03sOFAI@<1&
> zt46tPX3RV%WAQbk4z)~BASHk at 5XTyoOt5gTxq;G#d at P6Q9a27)V;Hd<=3}{jsT>-)
> zSPl`(VLF!UA68DUl(8K$mM#r(8)Yu;m$UtNe**+`wHzwCpCbZtXGK)ME28Qh5#8Pr
> zQF&5C#R(DRZ-^*+O+ at yXh|DV at 5-Z77;4bu%h+Y+lW|nbp5fiv~MO2>_QT4WnZYM-k
> z9v4yZ2NC73i75MT5!qKnWbV_EQXGhYFc1M at Ah}AjI1(WNMj{}LL_ipcfG`pPVI%^=
> zNV=6`2LgImhzNuW2!sm=gbN6S3kZY at 2!sm=gm;^jBIQB?b8o{qXDl=%AT%T(G$bH2
> zBp@^-AhaVOv?Cz2BghD86w$LnM7KYPsC=E6g@~eAOpyP#h_a(1vPVQ@?rjK#j8VNV
> zqVhEn6|agYe_2G?VG-FEL<F->5MH;}MO3_I79;XkMU=fPB70bp@<Sp*MU-wvc0@$>
> zMG=`s5s4s7ECv)d<Q at i`E+iNOa>PsCKx&l=wnm{~k3t~i<oYnTv#Lz~pm at Wu`Wdh$
> zr8sWc+oU*J6mLjz^f at g9=`zq4F4*#1bYq-bn5Wl~27;luoMBgPKNRN%L3Q#_oci70
> z%K!QK?-eJt$JKu66Y}xkh^$U^K->JbB#Z6Ggsd{{yu$L`M|rnQS#&v{l at -R86>2QJ
> z?tyP_(vnVfV2W*_ZhX!}U7BryZf;Jpg+Og%;hmcA+mdvnN8~XBdGyszb*OpgfwrVp
> z&QVsNA#Qatov*E^AxJpR72D7i-l^IEZLqc?q2AE-qC~%(iHWRj;fJz%xm{MnIPM5%
> zfvb;<hMZ)`Sul`O?<VDpvdExjp+yOQA9fsWTiB*e4Dhu*tS5^0bgxf$30-6s-r0GL
> z7ImrTnql<K4DiA*z>DkMH+*{oED>-W(UuK#sK2S_<M68RPPMfyNjUE4W!?=^Mmfi{
> zCE4Vf60*zgHKNY3p&EKwuv+8IC+KAwb%Qs=#_MG&F*c5BZ>a;#JI})$5ZBADxZZhq
> zzGbsgIK)7p=l_7Z=l%nA^z~cnq#+{o*ZukS8~*qa-XhXJXGGO=!@ILj)2;cTr)^P1
> zZ024b-xy~b!dqqd8^qoO=e|PXebmut(8{;yMtyr3Y6Us?wj{AskxK5C&K#M#i-Ad-
> z+P26MzTHBaCZ#VsGWFtD(iD9G1Px8smfPx?Of@}yTOB+uC%r=Zp)#w6kezt2$TGfV
> zV8DF4?K at u0$BNZ{+fMs#tF`RzMyl;r?>6rm;!K4;k7ZI>6X9~_x1`Y54YkBD>%Hh`
> z-R2*9^i`espo(o+n&->JCbIpD at gRe2!f0U`Mnk<&l&tS6K(;`%zGDW23v6;WPeIB|
> ziA3Yf=f_pgaVEbmhaQVzEo8POC1 at 37I~3qB6Oxw{-q{XZx2uM(`TDjbEaf!NqVLop
> zvv27^gIO~hmKFuey};8;8DMPBSVOX+SvU6Eb3J}V8kwwT6u8zY7Ov0Gn=6)ZE;DKP
> zRxCl^{!SepBP8}FINB}a`U<N0q58X+X<y7MnhnPOzOVCS<af01J9TjOk<nLY-AGxb
> z;k^qryj%mUNcTB1wI(8c)RCzgIZ3p~7NyE#VE#s5)r$(l`IL3r4f$Ect_(X{lhL%T
> zZ4p1m`3ha~y*k)DFv~E(fsh`DCuM*H5Y}f<O4^YUgNErgBrAy^DL2}Zu+I-?v at OC9
> zQCQQ28q;*I{?Nm>^xn*>1$9-w`)I?&K~WEO*ldBkI#U)}4)S)+pjG+_EiFT#1CtuG
> zk9Se9OzD{DxTJyWnikU$Vklbe-+n)NYfEySb7c(W;2EYvd3kkYr^SZEfEFsGg?H4G
> zry&jAj(@gz_DneIUZj;PdXh9@=8HX3js31KdAFYGny((ZNDTJtCYGo=D+UxUJ$pwT
> z<%X409RH*@@2ICt_&wh6#;F9Z9Om6{8i6mz?JE4q4AYINaD7VT6V2;Uhvf?dx4878
> z%1aOZbl3A4c>yF61=M025Ku!IG3cKEp=TJ^Jb`QOBG;_Kx?~mjx!9lX&@(;iAoDcf
> ziT>s7R=q{WFNaD=g?F}U+LAiA5*fd37kgdaG1pYiZ_Da~-QrI5HOC|P!=g5Cxja&D
> zeKt{+^Q1+8ReNG-hulEOT;cE=V`qhhwZ{m#>+YK?w+BKlYg>F(tL$)3jLIpaML(z$
> zgLhwoF}_qs at CWubj@1&*k>ObH*h?FKP>*4H=$RitL-4fk2la0~54SyB5%JT+Hmz>7
> zJ(o80s`J^)tEr<`z0TwE>fBoWSp3p`)D*h%NA<iAD9pF;SB3B4xaqhrYM_9(-A(xN
> z&BY(pK>^*6pt7dmkJPMFudD5xj)PWve^f{3?nne_c#$kPU%<u?u7Zdp9Xj_xE==4$
> zvQ1ppxC7c$Jjch0pWNynWgn;GKFiH5(}z2|pxXeUvo$XDWab(@=u(HWGmP}KOC1x^
> zlUeCeF5f`pALQc)viP$V5mK9PP!|+<*v~@jDI>IWJFI}(AwBJ~S>-TQf#NjnOc|Ue
> zl_t=6#;$apsgpM)+ufYE8^Y}_=WY8BbmLFzI3GOP;J<jK<03RwP<Ute3EK3N`q2zD
> z8DLXt_8c at I+-@<jo#l&zx8k?fA3Yu}^r?XOLlEW at FS4yjr3i*;f0`EbsiWEIkLcz;
> z^&9MS98K(3KOFF#Nn!504vqn(c6m{wTxR*e*+uvFt7Are0ZKR at S}Cw- at o{(aK1md#
> z>1X}wFs<bjj2af>ZN`zo=VV4$%6+~0P(D%{0SY;Wso&?%#m8bH-eyhBW69IH(SPm8
> z<@u*Yy-qgrDv76M`<8Pv%?pY)u^zh3pPaJi7nLyuaHY^~{&SCg{s=aA^KtfZgLSvT
> z9ILG}iwL8`8P#pRxXGS2m<tjBJI8}U{$yNcy3H4Q>`5bAB>ucx_R!41rjw%Ed^!Hd
> zWP7M?^IuY7n at Y6@LF_2R^mbp}=1X5dtk&+S+x+Q%y9|g9hHH}@n*aC|UBz&76tF=%
> z{~vvW;ZniIqBj|?5LuqZa!)Bh`??$GX_lMBT29eUmJ3mvZZXob@|SUACoh6MDXlFD
> zKUORrm$7v%EPtjszj>!&X8-4sN`zg^^)bX}f{--QG8q at njG?tMF4_F8e3-e==rZtM
> z-KzMI8)=W&-7B=M-gl>d8$C>b&w+CZJ1 at HuFi<>glwHC$^4z})@@}z<8r^lHf9N?8
> z&S$`O5ktx=m_~mn{UD*!<y;KAvx6>|bF&{fZuKZ4GPy<8G(|4s{TpI!a_bbwCE;pR
> z!&JO-)-_GBMmA0Ld5_-)rV9QrRn>EoUX^o?F$S8W;MTJ{x6v~SF2=ki6<lCDYa!O-
> zSM at j8rj*4txqNY}LJgZ-yyJKkI>hRxY1XMlDy_nr(#keX<=wg~jr~9T(L##*h at xpy
> zH`~EBO*VN6a-V38Xpq~2SQ#H%fOl?C*Qh$YK@%2TXK%OzHENI at RZmg@(UVr0*}^nU
> z>Y3ERK{c;dx1Q7+3Mk?Q;$6{`+QRmvH%x{2udS0Em+TKNZk6W=&5y=`7Z5jM3$UIn
> zif8<!=Dnom-9_RLtE&2iZrG+b#1t4z#C4yl{(=68JK>XeG1pm0%BJ5axlsx^_C>wi
> zxR6ofn<m at G0x#l)PNS{UfRB;b70q<xma{d5)au5q3PwvG5Aw4RFe_NQ+n at +VtGH-(
> zrx(ppaS5ZhC!@mAYj`EkiJrwy0_K6o?p#`{;$}~m!&a?_ov!FZPhg`bxB`=OZ2v<R
> z+rWNjS6pT6_`B`fLpvX at wP_qSs!?-6ihPT{=Oj%~b0Ox#nx(wgjgg|5I!uUt{#7v2
> z2>&*>H+qB-eir-Ad^$ARnO{}GkNvI!EoD&^?6};PWQyW7rdd2#e%0IfvDI04zBw9-
> zoM<VcX-qGux$$G0yBP~de8KR`?K6nhQl>&xE}3 at ihGf|h$qvwRTyW^lj<zJQCda~n
> z#^zNK*xB*(njmr+jxt)napRWM6oQ)i$3IBNSJqU1>@KD$)uMOigN<^)e$^IW at b0f_
> ziX5=Z at T1H^FM?$z`+UGMv&*4eWm6=tHum3Hj`jJm_%(nZo}*VdF5ZmO<FMC6<PzIR
> zPOcu}6MoC1NXtxcX{{bGUk_V7;qL;g7yMml^@hJDkU16LB3wv-`G<D`FUok2KL2#J
> z`S1sx79v>wlFN9ty+iK!2b42EBz)$Fh-ZN{%6eDJwZsoUhiWxg*=lXNNAsUENlp0)
> zy_nBxh^8pmkmw>pnXSFiFK6}@ye#j{u4XcQtIIQeRpsdk&3`7z#J4)K=_1(S{u(W>
> zs!<)5ALASe!w0y$M>nd(<#E?2 at w3qWZ3kVlLsiWgrWMe|BqLEjMexgwTbncRN&)7j
> zs|wF!g0W^g4?{|ja6*&z(0f`LpWUO-z+Z?NjfC4xO&(l;xz<<4$C*~}(45JS&xR`H
> z!VzzzvC0$yo%mV{tovYz%Pe{$VPC$N&L2DPCiAZDU%n^h=G`e~BT;&dETl}nCuO6Q
> zg15Odp~Ja_cPdpNgEHwe*~8187Ru`R_Eycnxzj&xGHBR|y0J?x at sIJ_`Ip;b+m^U&
> z&N({IQLf~nGcWMGivV*_4JhnO-FFRjlq;Igf_4rJ8|;WPF(5|^N~H+2g3 at Jk5x%6=
> z`>y^+3;pA#AF+2H%%Y=6IcOX9L!Y7E49M9Z&jDwz4O1BI*6Qn~4wW?Y*tR6$OX2w4
> zVE!H!^!I;GQ at yx}Oc!0_#f3Z(4J09X^P#Q2q4;y(2s1W#*oG_SP?bg7%=8wJauPRS
> zmN`GQo_*PJeYsW95q>cY%qQ`XDS3Km^PhXc?BSCg-7MipfwAP~+)g{axPZCKfCEPa
> zvW^HJ!PUYD{q7bWVSrx@(|0%&8{cASf2~vUy>XyrG|!t`IO at AWBavyI<v_n7)2T8N
> zw|aWUn;SEKD4V at 2`}v-$j at f){Gs7Eu{sBWh=Q8wOI`kf&#fO7N8>%I5u5|n)eD*$5
> zgU7TIw^KAx!-dZqDx$cn;ZJ&A8Ep7f;RL2xz2~rDywftQVdY)5?DT-<E^6JHGaWw-
> z>-Ec?^?2etAIpbB!|VS|!>YR)Zl at kT+?bG|Z1sqS|49u#T*R;f++79w`#z++4;Mat
> zsDS%j9lQ%gJ{uS@#HS-^Ah;19YCj6^U5&Cpzx3f|d!sj~Xq4GxRyP;#ETM_MTwFN#
> ze>ROZqs8mxIe+&s1rVm7k?(i36$LZOwql2amickx%*rU<tr?FVlN$;1m-88ke)Cd3
> z)b(ZydRA6lZfWtYCG2b4d9@@OS3rzb%u5kIZ&b at H(~bHmT{>^I%%EjIz-<QhL0@!F
> z2hy<&<b61B8)>jSc=eNXV<9t{y&&y`34UD6FQI(A`N%NBA3i@;I5#t8i14O4xWn~N
> zFcMkzFhaBjtt{|oh{U|$0U}-RAuC!YxCrDB-UfLw17)#{`92L0C=@%;z(wz2<HTVS
> z*oMarY{SB5^~l|e^QQvcXwor!af%uSW*T;|->EVqJ<2WS6U*@gm_GA=*?dP-FVl@?
> zJnpHk$75e^+*Q``E9l5IQVTdLEw&$XGxze*{8)jDe(~jeRy6|~YkF1~yS`9kDb}SC
> zmq9N}%IY*D3wPzBUc*o8^dD$d;Hhk~YoOVLgPu{v^0s?BW}-)QjGuVw at 88YqZ6o&M
> zpK9&lDC7IRV8>3 at Xh{l$sd~+RtwpY(y8}4Qie2|G;nc_;gp(fF8-90lTVTORMaV;M
> zpXl+EawW$uAN$OpB_>A&?F-- at 9D6VST1QsyHRz_BOtd+e3tqW%>abl>_A`vQFrtO3
> zyKfj<7{^wK2ZGh96ijWog*dk27kObLP&&S$Hv>82lx=8wU<aV=?<Mm1eTj at 0h&1oK
> z^$UnR{qKpyv!NVYolOS96vJL5hoG>qotECw&b;OfydBm53Q(vOD3tME4WrRKKxE^H
> zE*dSlI`?_)&Slt%qopnBC-h%)z_}PAxY5P_48g}nv{s1(TXKhS_1#{7$JyqLG=aJ|
> z at w@du%fFg?WHnbeeO at c_FTf1ykbic#HT1L1Y#7-LG;&lwk>`0?uYO>Zyp~srN|rzS
> zOIr0OCHGQC*9CH;kg|$#!`k>cULE*PymB@<W=qp}92gaWx&)@N<vwG~9cs%gG<FCk
> zk=K*Z5=-{L5Ut6MpR5yM^JA=&a0|3f#*NpS;@Ha16zn4;e8V8&hg{6h5I%BVD$ukL
> z`vJnuILki?jUweQ<5|!55x at b;Q|~K(t4GKmlGgkS<Zlz|#(%?9STUP$r8sIW5x80$
> zr=1Tvs~q1zTq&{ozk${Nj^L3Rv=PWH)RW)=PMe3(T-h{?=AUEd%74qwB>VsykVio8
> z$dFjnKk(m7Ahij<+6U_Ot~SjAm74nqy(!hFl9LEKbGMM+hb+^5cZ!eDwfb4^jOy>n
> zGT+M{{V?_n=gx&+z at 60pz#S!uvIP%fm7&h&XPSjsY!(jewPD=#p-nSlpSl7KUm0px
> zxN$%Eo>H#+l-e}1RA1<bQf4UD=YCJI^m`lYE4Zgr at qJ3|x~Ej_eM(&(C}kcjX1ljo
> zzvn%Tb>62``p8oK{`Z#parHf=aFFJa#TxG^R&sY^MJ0^F(vscZpD<|Sg|X#@nySMV
> zy)KQpV$d^ZMXM1_9!V>gfB-W05x@@feRkatlgYV#K>P$(d6p!@BbsO{6dD<3n>Y*X
> zQ9nlOer<}+ERQbdjlyGGamxUWA#RPkUc@`(t)9(z1|SUy=e%a(A+iIfqP!=VfzVq;
> z<VW`sJkpf0>3%)0hpr0e;@REBv^Jaz7=Lf2Q}@{#Ltxk5PEA at a=spz=-?u_5RPcfd
> zaraiZXY+;PM`@0h8*`u5x7 at e&T4=pi%Z+B|@${IMi<g61-%h{Ka!WJ(N0{H7Y=dsJ
> zY{YF9XC at xa)LDVgn2h~B5k;zgeCW`go(rzm#t3e$N2Lqzsq=V_`&Rl*1UDrpt4Jd&
> z7}0dCeJxFk<YqA8bW<d!O?H0oE9YgzhgWGBp1T?ef89I0UOsqnT1`YlHhzb=laVwO
> zv~N$KA4PJLBGLJ>gCq-n`asi-Ky~{7)igAUi!zTvmE8&jhZSpvV#5qhduXGKUuty&
> zebNqc6VRo&CC8IT`flIlwTzQpFeEdjgEtQcPuUSpts}Z8UaH2ksSR3Y|A0EwxwA*K
> z^h^{N$sN%)pzaKIOrwq{F3szR*0h`VZ%CHXCPj03W((JrRK>SuC_dq3=s?IXS_pXJ
> zM!tl{<uV6$-Bm(~WD8 at 76ViG9WiiKcLCA?pWM{nB>JRm{TOxS9<w?lRcj9f92tLE|
> zB&3po6uT#o3$0j|Nv+H7 at E0f>!$nPp+?P`=5&Bu05Ugck2U{VQXcEm6=y}@^MSQH#
> zY6eizNK0b4pfP_DhXqznMv;b5?u;nfFTdkDYgOvT14HU#xXB8r%NNlLG2C=1>JiK7
> zkzIMQ+=_ at 0oA-Gy=SEXFuW;h0f9Jz)l4eQ*6X8d=(mF%vr?Fg=r%9(?t2Jnt-FRb*
> zvT<AjwvZghMU6k;oL=))O|rem32mJn)>hw7!`tfn2-<o!j+-V?@pc?Hm$^oj@!W)v
> zuC}BTe=m at eemr96whWlpC=MFR<;8OmvwXmSnK)dRuGJ3{t9*rxcsQRTgv8in4_zdx
> z=6qJpbIrTthk2R!h+tPOZI0)n6ShM63X;b%K9Ih^8Q7N8#qqWlrKyaJhCZt8a)<?6
> zRL7E?iyFpqvzbVmHI|!e))58qt?Jj{>!T5N)h!Q4WX}S;B3{H3FrY<kl0ikSC38?F
> z)#tZ3&f{k-Rndt)=lP~B at VBBVBau08Y0}}%e28srnrYGU^4{F;odfl{JuQtEm1aJ#
> zYKpWdo1!i9rWmRj$N81MR8yT6snT|FCLQsz)@Y)5e=DPr at d2hp66}aH$@oBruFC^(
> zv?I#_Wrzoo%!i3Y^5JO_)dX_24xR6O;?AqSs~O-z=Z^0 at di}dRPlRWA!5&29zO;56
> zr)8^Oq;HJlGCe9c3%coJJRqoHJQw6vVoTPI&e%l5#zQF(1^sw#Jo7AFJD!_>FG-mc
> zMCCYuZziWD)ob;H_?u!#a9V^vX*M)4&grW(q+d@;RL=K1tAX!nV8_IzMb*ojImec?
> zs2bupm=;|_nl+Atu)_Y%Yg3~briRf^)T$c(s*iXspgOWh6 at ABf!X|GpR%`99KKBO3
> z^`R?Yt|1{bIDzw-H%**qvayqE&Tro3XdMuQwj|=s>pORv>iKx+dOb1o1t2K6^cED}
> zK>^`yARxtZf1>o)5Kd$f-ITyh18HbZ;KF5*j#&C>0%!2wdREf>pB~r+6Oc?a&K5du
> z0`LHMiZUg5R|1DkghX~eH|)BW<P2RsWFyP%V}|8|6b at ZE^&@I#-&M0j$7Pf_rvl%!
> zuYbwAfva4o6s3t?nZU)2I?!C~oW3(VEe5z>;+)>4?qQJEjx}_2A~$)=0h2$kvartS
> z8ZSaD4E$v}-A!SHb-o1ST$9L6^Fs-F4wz*cCLhNWxk!|cFA_POPLhvLQ9fLsy7U!#
> zd9Co%iU)1%&Ug!B?C+gtn;@Q8nU(+;U!>X|PXfqOI(Lwsf+Q|K_=q- at VOeWUQ9L93
> zqTCkM6AAS$(=$oj%-ND!sp{{^u#h3O(z^w^J%q+|+rgHZ*X12ETp6hQQkOwf9(X(^
> zk&#Djkv*W0dh2LrGB+`9C+I7U{rkMS{=Yc~n+1!_a#zD?^!a4&*UbErffG3;!&V-k
> zVUxJhvDXIHDc<HX)Pl~kS=t3ZQqaTr&V{tq9G?W+Vz6)%Q^>L at fG1pD9r3}Fu!eNm
> zlEUH7 at 5xG1PR15(V*D(Typc>M@%(cZ+2Fn)gVZ@<sy*kE2Q3llVI8B1ABorbH9lLl
> z?Jak>)}}w(5d|UoEe}JB3=$&be#BFVMVhp*Fe7y#jhh^?L`yt$QH}WFQ%{|&@i%y|
> zwTbi}bL=!l5e+U at xH|3FN%v3Y#!MFWHj9kU5PGi|+NoSN7ao at 6l~tySY=ezr$uWaQ
> z<q$TCj>%lijM?~<Npg4e_`c#0uYe^yu%z<mSwgc at xbYJPMsDOE<Ew}FoVS;F!H!!2
> zbU~h&LmN}LQRa)taOWgTghoR;oZBqXu$DcxGU>ZIMyDmJi0;1{H>E{a;~RP&F!n8g
> z0uK&saOzBQfd_uXUx)(-K(|Lbr|wPwrKHuBBco4wq<eK}PkF-Mh*MthH_}4jZxn=R
> z5=9a<A06f6fvQ1zY4#Luq8eDE{tj4kg;q}Cri8o%op6p=>lTe4Xmrr!crLf|C1(dJ
> zm?>Oo((4yw7Mne;)4hwkrRKMQ<@8ru&j?=iba8{+T051S5cC<c)?u^Vvj0o2ATleF
> z1hRQ57n~<5INM_b`r|eSQWijhYSx(yq#pMC=~#!<5;CM?I(H1yKC}4X-x)v)Y$zm5
> zFb$l>MMhVHBY+~t%1BT(qZ at rj@5th{Y1-=O#K<#-CJX$XO^c^-qnIwb5h}2io9Xk@
> zxS07D1qZ?_t5y~1m?BCJ7or<GZzaEq-^N?p#x_nKpdMeTbH3Hg4!!DX!FPyMz%l$x
> zuKIYm<9xHsp`*U3+;sEXU;wb!{cm_>HL4;lC5{<V;}776YlR1M;|@M>UDn~@D6DoP
> z8YZ<xP6(4?=dhmL?O^(KwnOQ_Z$ndPJn(LgFHPX%ND}W)X7YhUOSdbuSy>dU4aD=j
> zX=^IyY1TP*)+9U6b%iv0I1bjNHgnE%j)Qi$u8>=yf-?nX4{ScF4`#v`)V2^<U5bHD
> za4kVchGCvT$-vs;)(#E=&vFmEo^m5_cwMMhjB&GAQL6L|R<e}X$27Bi7G#GN-r24P
> z<0)iB)v}>3rJ5B&caMn=IK_vWu=HTFo%vyAdT|%OBJZ|r6>sCCENn$oMW*Po?l811
> zO2YFRWsA|M8yN552hbL1U^=&3AHY{@vWaYQr`zu6e`ukR1;w3YDPX=ey@>QF#n*OZ
> zbFIIz>cCFe)(~`E-nljJ7L!L~)3`V$jphLajqX$y5G at Z|b_B#UD$-!g^J7A2O&S-)
> z{6w46xbQJYd-Z}I7UZT&!O!7W^UuMeHi6dPMsKEZV?2NBFC!5a2L5WDpVGkTT%7r>
> zfg0I_eNiqWalS7Myi7!zuvZNl7_W4y;O{XD>7-Cbo5!-xcPe1xNrBZrc90pcB3m^U
> zMb~gv*ALhGtQk*WlIK_Un4<U<ywc=H-=59|z>2vvoePOsQUI<}o{TL5h18>OB!2uj
> zVOJPv9sA9tnsjclPuT4ser&_<I at PzI6WLC;q;pAgzV-z{?o>8}+1yTnEp at 8G^7m}Q
> zd?|2`=y~D?Y8dZF5av>+s#Pw;&fIqA<C}vFT9R^mn`BblN(W2NNyBDvV*)M!Cw at C(
> zadcDD3@(WI9bG+x3x5da{JVg>d~&uEI2VkZd&fG~+M%CVAusN#C3&~Vn-=AXa1#sO
> zXGJgRth7Y)O5NB;OcuW8MPt9~Ce%3Wznk~4&V(_m9ADEfW^fZ0=j6%y*Ays7a-F<W
> zWVf!kn~%u5)xXr_2kbL8hYX0^h-n}rr=cWt*fjL_&!kIqTm-P4*Kt8Uks{ms!-~5J
> zwmzC3)p6krM_Y9q{x;nOWx>A6bxv<SlosJ3Sgg%2H2Y%Qaga`($wiDc-5%W?%)bJI
> z3DehZ;qvzOy=7s+(_Jw{72lZ0_BBx+iZk=+i!- at d3(o;d)M)-{SbiCV<zRlT5E%7P
> zXN9waSKd;XCX;%DzIqoJD;?SWeUG5{*+Rkm8zJl<=o%DwV}H*Tny%-xzRdrC7=X<u
> zDAN?6A&0Khb7NMVgQC^YDK3NPQ*w|JOLo7j7q+15Xw{iYNIdKfF^6v1*qV-XkB-r;
> za`-#SHcsc>xXF?w-%IcgLI9|iD{V=wzB>08u7Po><mVjz9)`axPeB6dH_%Z);a#^p
> zY_1H8*7+a}%iv<XBbr-G^LT}5uGe(a{0uI6oGjY8Y)JF#+)0O?1na at wG7LAzAieYC
> zu?+4-MVKtwQNc4qRq%nt>r5J}(&|EF(RA$`E{6p?HHRxi^v&i{5p%P-wf?f`%w?q9
> zqCJpe&@#Lv_7}3bi0RPK>pSt*1L22QY<i842Bzoo%E6rpr+^!{>Umf<9-59favw1I
> zlbuHH_bgLQcja>F*yDv<Va~tF<xYl!w05$t&%v(L%i?v at fsSNNxkay=OFDERpkK~C
> z$o=H=zGY3{0gFxVqf&QS(nD?M>8E+zI&3O)9`^wA|LB%^-1SgdboH{s#a&yw)HUIH
> zjXbbR)j%>ensS{x6nxgiy($L|?WGA1ad}vE%R}59pFIw<{rOuUn$WqskZsB5CMrHi
> zPq4MpxAQp at mh_m<1t;YETIZf~IJG2}6K+Uk7v8Znz_f(qY)K_nE>V{AYjD=eLIZUW
> zqo(=X7+6p1=7XmQ4b;x(LV~LKmaEG<WLvd%4y1RF&1H$eNu_7!bNaNLO|YIPy<UY+
> zFou}g$@K7+cHQ&+tG9Bg@&ha=-8Cna_<M)LnTKV^CZ~JYT4;I!x76pocIHL`aOP~g
> z_C~yre5`;g at erC-SqKodi3UH+rKWFt6@Ons$j<m0Mgv&$7450HVDE6*Z0f_A>7y#D
> z53}j&ifZAAHo?WPr5s^<*9wzS^Dy^BOiN>CdYJ8O<1G05UZVm2zTY?-{+ at 5lg1;X$
> zx}|#o??M-FA?9 at JtRf8~vuLgIEUh+3=QC?Y5rJzwSuRM&%+d|(Wr{1}P!->9S^=sV
> z7WFO$9GkGLK6WFlERA at 6r`#(TJbr=?C)U}0q}bDT4=MJt-A#(UgRh)+RxEM8+90=i
> z at NQkq(CbSBo>M2|I%JD<kwaB at GD*%RlzWR-$Mvrs;651rdP^>ttA at S<1L>$;0hblt
> zsr-xvF6737f2?1~g+CzJ_HD&P&s at 7O0r=_z15LnJefXtDqPSh5ZT$xy$D4W1Vl)!>
> zCwW`d_EYY<QJcEy{)HebJUy|Hi->#5+H!bXV{Y}VYl}O4T*MO5s~OVTn+9(Hopdea
> z+?lv@{8`861}$4Z at GgWS!k~FN+3~q<?51;uWOkqQvPa?~ZU)e~b`hv?9j#f!#Rj6e
> z3d|bq&?T~GK>A4-;B4Buh<j)n3`KOAs`_E@@!&Lp8v)ijeykX8{7i6AP{WB<26FKj
> z*fD7_D&lORrXtw8r_ohKT%4!ahSzbkBNB3+FM^)`Oy4fzrT`tCMO at H>ktSc^q-+iG
> z)%X%GKtDilv17>7NZtAhAB*tRup|JDY>PsZPXZwXK}s;-D4ub?L<<&kvmW`EV+*fO
> zBRolCh!!0$i@{RDw-|}KxHbNKlst;KpVfljnA(ur68`dEJ_)lhO at 83kxW9G|e-i?l
> z+`Ucf5B~ZocSli8C@}H3Az2nKF|m6wmk`E%x}68MCFeF0Q)5bl&Nc^RHLys<8qQ}r
> zBB-vIi!OBZK_4-aF1Nv?%#p+)$`N5 at 0mDTaKJ+><)A=i2X_?J0vsCbh#1qYTi~|Ez
> zfiHVl^go0Z?PpX%KXPdO?PBgh(4wkGxUuHyn$Uqsx6crN(SipVT0O6;Zh)!U<c{KH
> zvAwdbs$USZ>esfOayMvYTZZZhPCNc&VI|O5DA5=UJ69~&iffF7o$s>MFioBgYSA{$
> zvcLw*$MuL#t&KK6!g(@p&@+#KHQG4Tri&l)Ua0F4ZW8<4Rhqnn3wpThwf6-A+J*|B
> za)%lAYzZU<{P92IrzKQ2jl;>uIsW4Ov*sld<LDb=;!iSIH32RgD2jBKR$fN952iaP
> zJ+Op}nOS)MF*Qyf@}uy8d1HUyQoGOaR4Z}DIzDJv%0-1lfNFg%&zC%7HC!KmLjfZ;
> zfE89|RXVm(-BK>(K@?~W$Yz!)ocEPv6C4piHof^EM}(=Igu#+{fe(Wv5sFKqS?SP$
> zc;H)wq1FeS*M_mix|9oFAvWpd$g1jZ&XSfwIFBFO_j6vu1_WnaY#`G50Q`*_?i+%H
> z7<sdixFtFlT0LN<Jcj3rW25mUT*TyAHkacqTW`ylL?+X{hG`(zH9Cmh=o+bE_H++=
> z)tgJW^wqKy at Nt&$hfd7ARbi>H%pMX^TsFE<``S_exTg=z=z#v&*KSC5pE39rRz=%E
> zS0-=6-L07!(67Vz5w?sAHsd20JnfyY<i`r81njYu$-ty4l5kw58`Y3o6AD^-^gwT7
> z8dAW7+?{43q+oa|I8(3*I%ZpEg0amw-gWeWW55cO%r3lBwI7`c+bHi|&2X#!$^C=O
> zxUh_ibB_QMs7$hq`j&Bt$_cR7PY9rsmUHvWUHFi2*h{F&5ig-iuWHFl2zNfevAdz~
> zy at yaAeJF2Q$TKe98U*tPLS&tTq+cHgthL=32drH`q}qY0HehPGFgQ(|W`Ma!wRwPS
> z){k&HbzSf<TQh>s0tG{0TYS#NLzDbalTJJus6cACVxU2MAcqIy at iG@rh^e#xcJZC+
> zZg5-Pb!Aj&`LjIBf7QEWz|Nf8p3aaYInVBrUspn*X4tcz0plp%*(3gfDxY|eOp?pw
> zGWmqad0A7kvx^>E0b4;Ay}E)MJI3d3zSm{rPrwFwAG?y9<99wSu3Bq7*wko!q3Mt*
> z0-T~q%CF=Cgxk{lS8_9%TKdIGF5LV*ujTRQG^0QVL<)CWxDl<d>`8Bwkw!xPWw at ak
> zk+(_sjj6=Ao?<}=rQ3Ed&w<6`U9^cA+ZvV#)86W%dn(ggS3V&S^>b@>uLd6%4?dBv
> zyV;`_lLk|2L7^-fk!G{cLxZR%4ooy?9^^@oDOd#x5<ryF8gL2IKdK=WWnK3Cy}Nxw
> zDr{8$1?dZg351Tyg?)*z?ss>%H^Cm1=#%ML6wGkL7yjN7yL;YVGJ+p_%Z6 at AuHqgt
> z57F at HiFbzyCZvihPWG3<b@;CTqhzu;3QNY&I9x3*wzHzSvWpq8qN{qqV;j7(fNr_P
> z>U~zL^_mWqo>Uliu#O@<kq5ad&BBjOMcrq6`Ml#}E7LlX;%e(t!+sLg0w&xvHj0e4
> zwD49w&cdJgyWqn>NBnVdR}ij22~_$D*J^_{nc$tcA at zg%o^bo<Q7Bf?EsP=4q6KX>
> zOqa>aiTekB!-;7u2XYQuvlAmS1BQ`w7PTI}$9eZ{J`k>e>nd12Z_%E|xUu2BH4#O@
> zsvk#;Zt!IVs$0#CX1@%kMS!`x41AXEfrb);o(y|?;*@(<7_3B1MWo~N`{xg&;p7dJ
> zrMA`FcykHv)~|g4hS2Bt>UOA<Og<gZ7WjYzv at 7eF4KcUQ$^qS~d5!lN(yuo6k;*l@
> zzkdVp#>ctvtgK1xI;&{}MR*qe(-(KrHIIY$Fb-sQ=n1^Ko`B>IyZHz#(+HcHJ1iYd
> z-fdFJ#}1e2`r%3tmzS5trdyU72tniABM98Ut%&y45jv<o^{%(eY8ZQg#qDUCW(DtQ
> z(Q01eJ%nFDXMmE~*p{Th<Ab%rgKR0~=u8XYwL{kyo4<@#@v*O*5pG~fsgMT#fkky!
> zOYxAR7E;VY((V{Y9P7WAmk(*9w&JX0;oQ at S6;Eh1>=8ceCs|t*uf#Jq at nmX;dFTlY
> zZ?k4tl`W}Y{m8+)BIf4nK_m5Eec|vg7PxHk`6Su&675~X`Lh!OspbhTFlRylul^xO
> zzJhp|R+ulLzlf)m4_X_HO$%Bv5P$v)v*ZDD<EPi~K at Fr;jc3*yNSvlEqLTr^e~Feo
> z!A%U0<hQ0ps-lUO4{JI`G<<l|GISWg_7@%xP}>t+fFe?OD)8kKT=c(jSi<S#wOmTj
> zGf*+kvBpv5=rH;5(L(9z4jp}VEjP+MhvH9Jl%I^b+uo at k_EW3I?t!1P)bBTF+{*9{
> za6_N?a~gZNvESt~b(+5 at zQfPt+i!UPI|e!;h)Fp8?D!Wlar39XrCdzJ1$<W3Sz%!`
> z_?s<I^KZFBjBA|S#h^;)lhMLbZcIcZ{}2Arw212AyjgS)Z>9*mkvubh$ukpOBsa}0
> zaFJ$#izEXVX_n|BfyXu)JhAptZpP2DDrFs)pxy1C3jVUVb+03#q=+nF7BC(pYZtiU
> z7Vm?UU&jTEcjB3e&OZw?a$cv-+#;H~u*&fGw{XA;sPIgog?vP9>$t#Zw-UQrYGU+{
> zlMRH-w#$E<hCgQ)ZrKWtp=s|rE-ZWZg$F+9B>FxiKp7UFoa_%C31{r at z9WB>DDB=n
> zhcCi^cgD_%vA%HdmxNfql6NCV2$3FNmpsXh@%hzlb?**SJ|8J|QvD*`^(2?DQhIp%
> zzF?TW|NpV}CU8w0{p0`UAjirjpav=$K#;=&tOh)a$fYPKwNR;Ah1#m9tra{$y9<Ov
> zK#WF7 at G5dCf(RBbq$a@#*mBrbs#K{&6haWh14Tgje|Cb3KJD+-e*b-*SDEZ*KG%D8
> zc6Mej(JkC7eY43%>g1?+fA0=@y1TC;efp!QL6dMf{IZ4fLML?=>seMve|<)P)yc?j
> z@$obp$=q-8&!EWq7XN&vMCfH`hz;q{hZZs^EQ4iD|EmLi71Z6tbOxz<>)6w9nskO~
> z#~o_Wg|czRwvOtyMH06S_(-CmuuYMZ?`qXhoa5ta+;D~*GmW3XJiKh0B}|gCKwg66
> z7lpR2L)}eMw!)A?t$vokns^o!XV8hqZNdik;kEYf0armY=)W`4;%KBD23h0ti6_{D
> z_Y4NT%LUUS93~*Qgev%@j|N^G{xhOxjIKi(-aNmA>0rgKj0PzjEwBiJbkjTyF;^(F
> zUBer4s88ra?J?*eUqN}ihYo*p(?5i at fEn>N|JS#68&15wwcAjjy|vqLN at H=T1{P#u
> zY?S}EBz0SS)U+|wbqdr^84bm4De(8q;M1^nH8#x(R$Z_bgH%eWwOHM#^bem5+U5QP
> zs6C-+yup=Lt(a1yoKXRgxi&;eTZ*?K-wl3U1di2EmI|5h_eV|N3~t9A_^(k&qdEf2
> zCa4EHyM!2eN%qYRj>=Jk$17 at la^>#F2A$Vl4_7QxYPgcD3CBmX&lxgFU5$lA6powE
> zTGpqKTWU@#`01Xh- at yWq>fYwmvX7Jx9tii3dGB0lM6!COKuY^055OleRLB~<zxVqN
> zo at T*u6qUXq2TQgYJn at FZ@qDG(BU<rjSBD0vPyh2x)S7XEaf1{N0KM}=W(@7PV`PYN
> z(XU4Mg`+2U{lFIkJqp1 at ZKFqBB9tU-#P$6AwX8Tf=x*s)l7%kr*+43W)Wy9%&$l<*
> zbG&nCu&)1-g!4{!cM7f9Sp7Nl<>B(ha3tN`h)*0g3bMV|FtIak at cCO}vkA9b{s+3~
> z(BFT6TIi;Zp{Bje^1ql2jq!A3R=l1Jq20)sFffhpQ$qA4&FT3 at SOVk)N1m|p&62lZ
> z6P%Z*zOM)EVW?>{49BdgD<4As;OidL?0SFqsmmG*VPkGN%=r17S*NaOEZ$!7&}vZW
> zapnwK8Ne1=+d<u%iz6)bFWuY15hud*s3`)@9cTb(5C6@$-H1O1E}=m5#2L`z^yyoJ
> zFz!l;Xftl&ORf9+lnqDZ)A}sX6_}|SiQJi_jsjf4guk4t?~R=M*A04P%@Sr#pjiX6
> z#O@$T$7bBji1LW`vXS=froLW@*%o~CbffpX8)ib%-sx}^%rNW&>Osn$6j<Y#Q{AjE
> z8qNwTN!S+Lfz~TIvIS<4hCRdI at gsWYsgu>|A7CPqo`XG(dEH~qj;8)u_-5`ChB^q=
> zv0Fj6RD10i*H1UIbV*Oo!h|&H>az9<w)@aJ&u+-#VQ8H at wbv_W7LR^JBfX!}si$k`
> zFB>J(w&I@{EP(FiO`RnNE*~7)ikmx0<RdW#NnJcNB^6gq;kS#SF$sMDCVVb!AHVGb
> z+O~OFE75GlM^jHa$X&F9L_Ew7n;B{*b^4O<x8YN~U|cnfA;*v`!z|Qbe|I^8di`GB
> z2ZMmz<=xW`8LXKjIj{}4H`Kh!xh2dx`@Qz@*j>L$u5ZI9>J1!&I=fx%5<4Y^5x5oc
> zJ9 at anH=UX4D)$+<9O at 0zjd8^c>cU~Ml at L3wUu@;c*Evz3SImHeN%w8<g at K5A3O)Xv
> zOIILy_5sYcYGAfCC5rzSvn{)~JJLmCq4}QrKmz5cC#sG!(4kn=OANiElU0kin&ea0
> zUZ{Im4AOPTAH0FRppL*j7JU0=O8Z#*X1EaZ!Dz#%N6&pQZq-03La$t3X2RMq%5CW*
> zl26`^8q=!lO>!)Sq$X0c6wX~4u6939mPAD2c20*9?AxZ3oVtg9GK<~s-fexJV1HJX
> zyVC at E8)QP)9HO2OY;)D at f)XR|v`v>>kHll9>=N?3-TTsE%xAu({dv&a8Pt%cou#6P
> zzo9`taXbFO5UoH3DXf+hf?(L8w(0XTupudBdlfK!;-)B|mA6Y8x8qZ1`%}6!ebC(s
> zqi7b4p*GZ~e(+y%ybGgq*l(BRo%BbHzKlN1JD5K|Xay at s`v@}LJ<xu^JMa&tpj&^Q
> ze7f7<TY;W at EZv_$cY7;=twtC?u>sS<9r!%+U?VJMG#p1TJjPfJlw$`<2MO;x+`<}R
> zF}{IR)5%as)us+TI0J1y1=XyBn&NZIzQa9e#?+^m?HZ0G&+>O7=Pb76JZTG-6ce})
> zEm-o3fF?o~%xPe8Q!<9c9R>umkYF*1j~x)qMuOzG0zV|UMB-Lc<`j?a)|2y!N5h^n
> zfWH=XhSUKMJtVMrH2fV8gAo_xmhgLH at n|@1F>a`2coc5sto0QKzB&QK4*L+}HLr#)
> zGzf<o?`l_NOV!3wQwUxYUp-RtZ4~Y_l;3SpcQ=;rpNWmknF``jl41~Zw`lfgh?xF5
> zmE=Jb9_6Lq!yJ5^R1NMqFor<yc0ZbYw3?YtvX~^vj)JofY2ST#8mwNYO-#mKGTL at _
> zACVMB;~&uoNk=peI|55DYhI}ymd=3Da9hxGAy48P0}X at ri_Ub^|GtaCZHc%b|8H51
> z30x*dcS&fK(`&ijh8(LlO{Y$Sg^>E(_SvH)<<HTvey%h65uJKzxG!~@l`iJLfHVe4
> z4AhLp3`k=*WeQ<F6hcOkM`3+D*9T+!!Muq7&b-L at JyN?jCmQN<BsHmrkUP at Dnr+l(
> z+RS4OT}BA8wra_IAwGqG>{)lH?9(4ZbK9DHNy1tj&W;#c59K(&Gum4Ooqk_j5XpT+
> zM{>D*26e*ez2u3}Ii#JYn2ANZ$Q_POQ`(VpbDm9eH^Hb+iF7AH_K>$Q#Ctvjc4y8Z
> zkNRM&>vhB5=4_)qwy1_rKMm=NNSkRMCfM8ErENTkO)Nh8gS`2BF+CL1Mst~ZMA#pT
> zYowlR=;@XO$KnEfAOg{+kT}NT!$yRI!I0MmNZAh3PL@=~;&wiBsJSLN`@QVu^eJFz
> zprHCgXH=ABln2NbQJ<K2ubqqEu5%?b;_wfhCV-*EYeVubm|2s-|7)h*LS{$e at bN<@
> z!9>kNQ%!v!{&B493HJoa?Ks?&c1`ju4j)C2O_2<b$H$sepIZzjxh}&jG2tu{ouq at F
> zM_+50Sgv<0QnJj0HbSx?9-m6-=f~q8jOCDH>xNt%`fl)Q&fDPBX`kUJc at Pg%FOJZ%
> zuI-o;q`=BycSg<kpoNpHr%})?pDo5{`cG-pV|1F2sE*Dtb+xN at L}R5r^=}uq9VN$V
> ziXTN|7|ECGp_4$c_9Vcu0L at _Zz?iM}wB2j0)flL^gnE)(MaGR1rfXGRY^K5uQn3P+
> zQb|Sv?ufTNEf|?2coL&|F8MP7pKjp%gjQg>nA1N2b;KnS+nu<N4(4k5%Vf#so%mR)
> zTXSIes^L at 4I~nBI1UB7~cB1X5rWgk3p}vza-9dqTKy&F^P0W%0oYKVHNc;CR=Yi&-
> zcQl_2XpS4KNq{O0mNhpiRc#|d$FOU*Rik%adR}$X9??w<F*Az0yF#lGJL^%5VLF^q
> z*>Ifo_nBZZnDP7=+7oJ<oFfc at nNKx2=Lw7$q%D~M(`#F%39N5a-fnPwy0cuEhU7&T
> zBL?0{6G{#y;`+0*V6SIdk)7z@$bvm at 1;f^AYIXjYMzSHFVRQ>@nlR+WHjU~j-Hna~
> z8>VAA8dXj>^*i4~qjGb{g4;fjbSC1aBcjpH88k+7hfsY%!cW4jR#2OUu6DI113R2W
> z9cV9hQYPe1?E{|3WGLvkkSn28?6jTY#nIPp2Q-YReNJ@?N~i5;)L8fZSa^;A_Ipke
> z{vmN_4n}iX?1rAg+k at V;8~Q(anZN0yb~%onF^?GFX104e8Q#W%r8XbikJ*8Zfp;g>
> zTbakAXvoU(P5Sn*l7b!Z!Weme)AzYfu6FcV7s=ve{KKIg2^B)jkb&_ at J8Fl%=$9Nx
> z#%EfD02M`^(n+VrP=*727)DDSGM|a%QEJ`El2^&N_1FDbr{QpBleXRSm`swD?xCs7
> zp_VM3FwOk}rhU%vdu-72lrn0<;A(6|Qf~u!JHl>uigR(ZNC++n(5Qs7+-PKQf!Dw(
> zf;x at l!IDX(y}Yx#5!Nyv!1e)&XculyY$7>XVdUH=aE7KAlWVBpS*PLme$pOIWH4}!
> zv4Y-QlQ4mRe2`hNT-=5-p=Xdxjf%8)qiK5yj6z)Sk_bV+qU3{vy6K?%H2^@G!D`2d
> z&cO6-I-}?G_wxs}=22+x?bJ8|^3cArX?*Iv56Qw5eC+HG2G9GnYyE43UmQp0T;0d6
> zcGoIjf940~isO&FYp(bkV!E0&nk%GAvqo|$1$S74l=V!gSvr+4d7{CFse{owqf_*n
> z@%fLjYVBEZcVk;OwYo9E=40ov1X==ZJN(}b{e3;_^WTr at YP)vdREgVe+>y=-lHA^n
> zn at W;)<HM(8bu8+ekR+WPOMNh-H+ZKlwlDh0d@&|`-MrNOJgE5udT%84r1d}(BQH~y
> z5RVu+L#W4;s2eTRw;+VUbvoL|4X6)h^|Zfn=!rVrs<&>b86_DCI=AWs^!?EOZzif#
> zy3dbF)`{@xdJAIts5N at fbfs8?+j?HR4TC1XZrE#Am at ziO2g5W`Zk0ywo<6R1Q+4mG
> z8~5k1I%C?NO89&5;ml}`=5xukJ@`bAFwHq?@)~3aofRX4g%$;#Li%y%y6Zy5ac9jr
> zbiZ_<w*Vau`!JeXkM~G~GzbxSc68e|N&X&~uWpk(1AnXD^~Nvod^@A+yWB^k9&l2a
> zqL;nktQhME%R-|ZY_Ls^mx7zatYo8iS7*aPW<uSG at 54wMX-Rr$?P8WnlJ~-yccmm}
> zFFuy$EUDRx4=0koK$^72QRL;zT=bsMz(ER&U+pWC)ON(c%98rMS8MSoYQQ(dOG=@h
> zU_;#0R;4!jz*dL$_1-rhS=GS|u^BKyivsBoKJ^}`wo3Ai7<ZzXOVY*oSRYD}6+>Py
> za5t25FYF$0KrNFKkULAEFZwt%ZSWKG8d)LDh#={P>(QkRbVEvFxDOw`hUG$DUHXLP
> zhIwH+>Je?%mvxe3T8*g at Ql}znnj4b`or at lbF<k9_S=TTlfwjv*618j2Vkxsl$T(S2
> zFr9iF1tJX$7*ZS>TPN9eF^}H|a at ycJiD(}_$_RFgu{1cxPr-ikZl-)6K9ausyyVY)
> zxV`6YA$2b*XA>F;*TO*ZX~V?+ik!`Fw!dkZ=(d7nmK*d89o$FNQtf>*G{2g=A69=^
> zg^brvtD#@8hj!tTi2e8|Vs`*EqW*gh<by7*P^&kg)*fBQ7M&eU&1ef_sFyim{n^P~
> z1HCw4u;+$}m6d(J_ANXbL)o_diit2<wt{+cZg3vh3T%-#`*kuSQ~&SDuuw8P(fg@?
> zm&_;BEm~x)^X4Y47-RS|Nw=I?Fzch!(=o}pRGdefE4h}6kEV^0bf)4qZ&K1;V;D$j
> z(AR<ry(p*J)h@;L|M>RUZ<>RBzxB;d_aN{1W276^Dp)$CfRUb>Ez_(_#!TZIV$-Y)
> z`TmAva8bObg=A at n?bG-oOlZ;80LveWaXGs0M^WlimrJ6cPr~5gjowD0qyp#@B0iJs
> zhgrYjyDiyjGWbFXN{%{Isjs^*(T$IaH-|4IU-`VRqHm6+|Mw(^dQzvym*f^*9rSpw
> zFLFSw-X}?MI~pljD#a~UQD0vh2~F)ot||Urc=T<m at 9);uL7!}0e4J*6tY#MzWa3*8
> z)b93wWg}^n;v=AK#)`1E1~4DuzXF>B(?_bwP>Vr(aR%)O&f6V<?uEX~T}gR((;gIi
> zS6?OUtjfMwLX5h7EtI=%o7oLb!PI^Y69%l`8zvI+(VF`Tb2y0kSB>7I+vsYl$wH3_
> zyuRKka4}B9sBdYdGjiB2CM1V??b_rIY(2 at O?hYeePc1jeuhav%j*vE3Djy+K)zO8G
> zZz2)ePzfm1Y;xs$pI at SuaE(zOBn-k)mai|S&CkHBo1eCtyqE5A at F5~+zwg1-bY{03
> zc8D);bum1Q3ElEZ1$7O43v_11d at +Fy*Nh$PW`VA!vEEXcSFa*>4sx}uPXXQZ&3EKs
> z<!syhR4sQ61?P;BeECI~XE6)h;IB@>EEk43CjSLvVr<eLJt^{<zT&-<OI-=b*~Q8n
> ztJ8h2>gM}2b-C0XwFz{&-vlGMud9Pk- at v{;jlO^X-uT(tIr#SN|61)DuC*fGHPaXl
> zHmeCFZCtr-)I0jNZ@;VON^_gztxt~#!Z?jH^!<&6ERgsQNG5}1n2-&UAgzQQ43ZH-
> z4oHHv5>_clOod#KtQJa|4&vrEEHe;!^-yLvwMshsK;qm(nKcebPDpGH;nQc1fYXtw
> zZAY6OmAQX7d2vwojxfKP`!@gQQRr!DF3ElSw6x^NA$&Ex)KJ1Xj8A5jPM)EAiY;+J
> zj9XjyFrA|EV1TzFXA7|gE6wZev9L{RuxeW`NjQw#zcx947zS4A2^%>6f|3<=bW)Bn
> zNE<m at vy5p$I{}A-U4tb^#=eozD2Z!C>6}=8`n2 at O1iaWS!TzjUuYU2Y^ck;)S8}K;
> zU&&7wOF558R-fWgR2!GckAefJ!P1{e^lR=uqRo%#Z>wwX<HMxTH)w?cO)gn>1n1KY
> z<P!1-ZvElV9^T-cd7%@{8Q%M*8!4wgI*z`2Zdbla^7|3oj~EazKB~K3e8p`ApI)O!
> zJ>npw?Vi<OL0xmL8A0ayGosV$9wisvd?-}ZJ*v at vH(2SQm)yKZxM55_$@eyp_iG$q
> z4L6~l92pC%4<|a!+n|q<jWVIpY3X_^F^qp)&k(&lf_bkt<jZj%Oz()K at O#|c_>gvL
> z6URr-r&Is1Lz$%Udwlvw#nh>Y<acwSO({Z;wqo>FEA_;Ik7ik$j`wQ5oZ4=%EM~#B
> z!&z1vH4yO|EZew}pmf|Tr03NU6FxbFQl`Y-Jife`23xUbX&|wo8XcP7FlH&qYOwI;
> z at P8`i2N{x#v;1QIN>ozqqqz<9RuXJ0<#gd_pd8<Dq>m2^J^PD|l2_^Yh*hXzE4eim
> zl(VQ9PdHmPSk#%m*#m5Ej7bZ^aN9b3K!!28z1i|H{uoWy)$C$pf+~I6S-$o%{u?Wf
> zw;@;=CXN$^)D1zOkl%h3zeu2STA_<i|I00KWEe#0!mlvM?piUeGum4p8`WlYmIkMR
> zh*CZfGT$^DhVI4K3+K6g=*AIZuZm}kJjJ?8Q|r1IN7K^`i?$|Mxw!A8C)3VGrDAoD
> zDU|3`s$CXyn8t5=feq>gU%uPpV3j{-aWIVuU8VvxS)b&O4BXBF{e+e^=r#~iE!d)Q
> z^f!!JO?r9<_jh*2XqqKsGVyb?D#`6kd<D%>;+BP5PeI2+ibAL(DQvKOM60Q+yIII`
> z;hWNYtw;`ayvEoIVV>MzRmgrTl^n>z?HqiVvj!^1bkbb-cCSs|NL|L{zBcH{!Yv4`
> zH$HXb*PVL3vmeo+D_n#9fttC`5$f5mn~}89HhG`5kd5Z91C8760)5-EGs=H7srQ&x
> z2<M*OL)x*Wt>Q85?MU;Ora4PRqjr=xkKkWxvnp1dr9GkvS+AXGTfURlU?G%4+v`!C
> zhl$ZisynphGz6Jo(PXls%?CrFC at bwlfO7Qhm9`0Q2d78Szct^!9h#_Zgw_c0C?p01
> zlo;mVcEeCyz%OmEfaUN2u4H}=&ht(*1K%bS7~`o&5qPdcmhxOpOK*DeIsR`ylUX^$
> z2V)=VBL~$6)jdMruylinjcpes`8oJR*u}SV at Yzs|Ifgsf9q#5dSi`B)5xb^2>_3#W
> zAfx at ANWPF6)8AmN$zozORs(;A{xws{)?=`ia+I7nhEHUFqD at uO2rfXTdmKL!yvqe9
> z3}4Wm%ozE at 1aJ29=l+-hah8_8(VN5J1YsEYO8+<v=s!4m8jdE;^3$hyj(*v{5*tk%
> zp90cJAQ5;PKIsp@=-6=qNG5}1i>HAu26oP{Es)^3xH;{X#5NZniPNO8SoMQ}B1ken
> z7vEsKMM!JgQeh^<00mV<@g%?I;sV2XDf&3fYiW>#cLJX_{9P$|)6=cL{|Q4f>I6Po
> z5`O|Wrtc;thh8hzna_{LOhG+rK%FOfa02(5vZKzVld%$`8&(c^MDxU+w7=4?WO>pJ
> zhq^&mk?X$hGn#8uuc3MjEdMu1R_Ebf#Gr?Q26rvZHA=0{trOOQh1 at pF`Se#_g<O|!
> zZRqZdn?vNI&}?*d&~qU)b*01Wt(dvgKYj3O(tD?gLHDccM$~HD!z+i(4|`=!#go|Q
> z;|WW59jES2&&6h7CYIv_Zgbr%nCada5MnfG9slhX7F1_CAm`PY4EzeJGZ?77S%<?f
> z-yqC at tkW5g@g({uVVdtKaXE=wFt%uxNtT|($J3Tc5>MiDiMQV&5>hkSfgo>XZ5Lj<
> zeouyi{DmIxe`U14l4)a5z1OGzxw~X>0X`2Ucf0^4_j>_uA0#YACqYx{&9OI^89s$J
> z-~RgLEs}hrF;}YrBh5MLgLgBw*S at NqLCQ&X8+6DS`n9hnFg(^K(_G=NB<K{ZSrZmg
> zvHN8{{m<kzACRo>pf~3lLv50Dp3vUaPG0KiNWb;wlTNHR=d6c9>a!3S^@z;#P$8|`
> z5dLGq?}bq6Q0L|6&D7uS5%9|yZGTh4fVwe4YED9cA*$Yto>-yI`Ik^aF$2$>4h*HJ
> zBcb15Oz&nPW2}-Xgh91?Id!bPN!$E&+ODSZd`~{(<e(4t8oyUpK)iYH=q=G*$~Ah$
> z;8W at swAdQdVrzt0+ZL^}*f8p~<bf3$YQgR^00L>08@$`=FD1Oant{GH{`%XTmNRr~
> zUsV!Tu6FL-E<<@(vIYF*v~58*{v8IK4S&zs at xjjO*bPDc4D4bb`T8A)cU)7RJO9V?
> zl6O77dBp!x<v((5>T2r#w5>jw=7LE%FqP1Gdx9D`QP{jaFQPBu2ek#f2caGm$zq^M
> zppipSBZpFr40+nVZcfRyB78V8xcO%O?6D5IkyuVYPg10dF}gnNHXfXb_~$X|6+Sc_
> zJT0Wxaj0$jFtl9`JIs(Tpbmn%A(WiKMe>`}cRy-hohK>Z-3rR1T>qV}f5_9=k-hBg
> zN0_z$>XM}JG;XJ3fqwpZ8XwPfe6zea`T?IvK!>R0K}SdTU|&r_f9IjUD`$LD`wHEe
> zz5RM}$e|{OufLOqsN}}fVcdUPuHR!ixcOuOgPz}nb7`}s+B${S%u-uY*DJkW(YM3U
> zP^$Typss`)v2 at KWZM5%-p^qr)Q(td{gC~l5dim9ky6#Tu`5)?c7WLp8`as)^&gdEI
> zYF|Byc^p;F1S`Y3nJ_v$gf$~<y_!<zLf!3s3^p&0p$A5(Zw>1<Ok9lV=qz4MV~`bv
> zI<BU&p(0N{R`vS2(ggaCe2ITCe!#@TvsmbQ&|`*cuSWpvNnh7UkEN1V#kd>YBUs{g
> z247+zGStDa8M at b?m%(|yUUK3LKH6(qH%FEXllw=^a7>r_EEy#BnF;*X&MxE$o_y}B
> zL30lz*VMq?OYn5W2mXmMiT+vKgBXJz9^<3sA{vmX<O(KJBV)l7>S!+zP~EY>c>>M7
> z+b9#GzR)!ees at AS0m`RPIzssX%1KbZfO0&PkD#QUF71NS3CeaTKlJ~QoE%R^c?jhJ
> zDOkV6k at S>YJBx23vL!E!7&Nowvc+5Zx6z67^~E0UJ6GKlnuC3cKAOe{j)pm%QH8UF
> zETLP26?JtQTF-@)FYUzmLV9OZ>rhX_A@<Ne2A%>>g0+)oS;G=aLe(@_zWpq8<p at GZ
> zb2H at Wo`=bdoHCsFw}ulNEQJ<sm{j)yrtx`Y&^G5hDRdLE3TORK5{!W)7XPiU#cz_3
> zc$~*gh~<B)x%_q163op4Gb$l}VrhKZ=DdkZcjd~LYM(r!<mAkOW{E~M>;AHaPwnUV
> zbSxH5&?8;pH}U$M!Q at a?Af{8|H)j&=VCkR}#53)$O7`G-I2^jDKIc6OjzGh>LZO at M
> zRQYyKH(k!#msH+(9)`vj0tOhZdQ8L{b%VF+gF<SAjj((R_gG5}9j+ at p*1$OH?#gxV
> ze%*%$wmaY3e){H%3*jE2)FmDF2X8-cNA#sr1aci}r0H>|MiY$sAj-x*x1*P_6{MTL
> zG3i!gGGVXVI3dlI?lz8k(_cs*_?7Gma_VDru!8LC)`vr%cWh_5E-d*N-E263R%=_O
> ze>TiA=R;XV#d4+OUqEYmE?!Mvu1kq>eB?}5BM?n at HTGEDCttjpVUxo}L)s+maF(?F
> z^}LX!Yh-3=55art#=zgcI*S|}<~kO2=BS)oXNt=3x?%A5h~#t$K7Mq*>jz6pT`Z#M
> z#qMp(lWB`NLwl)zC&qQ&l2X at c+<eKa65KV_fW;%a37Tc_XEY3>DY5>6{{?<B-cdlG
> z*R<XCle#Gz?2Ap^S-W^&*k3eVz&gP5wZCBM%iha#vp;LPlqKYO*r%Ghv3B!T*#Bti
> z!#c*BYhMcTM4q30hUt7(0&I&-zXH2Z`@<kV!CMdd;jHtZ|J;<pA`bAZ?SC=-oYlc|
> zu$P!lWMNP-)ATAhs<xkMx`H*F_ly00)8APZyf1CfnR(FT%ojmmca{_a7ejqC&j%dN
> zWhL`MAn+WJ`$3`$SxLMF_A=8|taRSz_TQU^veI~8+oys4S>6WF- at qz_IJ-@^5fEsH
> z{Z6PT=h5u*OvkbsdCTqZnA)*&c;oGzOhZ`uyr03Kmc`*Mvma}EkCioQ0VLqYI?VI3
> zKW)04Me=6bpD^`gr9hxdkjP=)JZK3&Xt4!Qu43i$7TX^*-3I=40C5oOE`a6&=y337
> zX-eE<<&6GMiT)iBK at l1LmqY+W^`8Lx&M`0fdyI;=sWwX2D`{!|Y7^;H<&w0I)HkGo
> zHM919uHGP>t0d;8%~OX<XDhwZW~p~b-Iepwyws6WH&kwyo>BUy%~r>PgH>s6>L6)|
> za&FpJ>Sdt6A#EGzZ&Pl8`Z>}~pvP4^N<Ea;X%p2EQY)nc*pHMdlnc_Xs9%BpFKHd>
> z at AfTMx~0ughe&;t?rBTZ8>JqEav?a5kbVY^-POUM=$GaPj=hv6X<w^9m3k^e(^i1N
> zD&=}GaFa%Yex%x4x?H&}ZHsz^bO?~m2D0(WkJBvFX5eRh+GX{Z(h6lQ=r>9qC<FIt
> zNk2oN3lZoV1nLi<gq!kHMCyh}!w~6mMEV&bU5H56Aku}1bO|C|hDcW-Qh!9c7?CbS
> zq-#^Pr0WrBC`GCaMxbjE=r;&-iFyYCq;nAIr-*btA`L~P!H6^zk$#Lw0}<(RM7kD{
> zE<~iEh;&7&Cy>s8MEum7q>GfZ(-x?|mij7vz-}85FHZA-1iT=D*-(D1Tnj)SE|YFh
> zhCqP%Qh(*xG%Lu=T6q^7-jLo?F5l^=UJUg?Ag4<|R!&dTsK41c at 0_h1H}WC`^joJ_
> zjl3b6;8k*;zB%<a<I at riJu>xY#?}%weXHa$V`E7ReRXObV at pW|ePimMj7236=sQxM
> zF}^El2l*|=wvs3Gh}3%6E~9 at 8cAuA2fxMTo1oUU8wt{{R-5KOVOGtWXs*EwZq at 4ai
> z>c=4ehW;{@c*b~9vYNgqbvEOEiIRRd^;?Gj`DWUdy*F4ZAn at kYs}T4;)c?lV0S>=Q
> zZD0gK;O!va28pgr{eux%(n0?u^${bqq=x=^Y9-^dl1k8TVR(VQSE>pE{Ym$OgndeG
> zf?UFwQqn^=PAy`rElHu96RFP`rX|7jz|`f8elX}w{fx1uWHbF*YL`wVB(O2Him{=j
> ziM}@V7e;tVFa6upI}qq0BvQp7pe43Ji$y~DN$N|+Hzhwopyv=MhrTZL2O#YR(%IlI
> z9Q-|J{uL1MpA-E((2&0XBL4pn&6-V(P;&*NzVbF%G{bUbq&?d>VweLfay#26VynZI
> zNJG6(Ht-x)L>jPzBJ>?XBI)c!5ln~mk!<#75tu`0qz;>)etZ+z$zB#gcaVUCO%XZ{
> zb0f!q0pGzF3|2(U0D~Fqub_T$B&?+(d>t$!S#0NsH4dvISF)#qy?&&S{dolG at Bs8L
> zN8~xI+hWFE7 at _A79;wUrj~L~!67=1`@9M~r;Fs+X271dQIN%o}*vBJm9Xumx?8pck
> zFtB9r0E2~*u3+Hm5D;m`UK=sVVMFA6Afp4>YPLtjmku0oG&3U3VRK|Oy8-kcN9M9;
> zZ_$#@L!=`R=~hHK43T;wP#pvsj6lr*lo$gB6zK>=x)qU*K%_p1^aDh?36Ty%q;nAI
> z2t>MVla_P`A{~cF!w~5NM7kZ3j-p7}ixH?X0^NZ?$2lw{fHVw|jzgp#h|~~~`XSN@
> zh|~>{jzgpyHqn4o4-(-xtco;Z2S(ryL?oBJ1nkxV at tg=2B!EEzbSQ1v+W^Qnaxyy{
> z{4b3h#-0+f5)un$cY;6SO5{<t-x`j?98j1G6^4-}Y`ch44%^r0yZccSsLI|fy^7!3
> z19I~ft77-dXXj=r*2G53LvxQRLWPO)uW}0%+hPyNSLUWDzKWH|y>qh_>tbc{^|@If
> z-z#68TcTJSD}wDLg&WxU=Ej2jw0th;e;S)kfWbqB4OC#cR~1`hpUL%ecPsE%9>~Wk
> z9)Kftu7$!oR$u-!cbDQx>{R)zyi;W>qmEn&gTSj|NeG+|^#|nZz~TDXeR59-{58l|
> zL!w(^#qu?|#}w|d=jB^-;}yQKQSv#tQJ`NS4*>muSmHPYk|>r!prG76Q1PdHOzsZ~
> zdTh5mBDX at J8+%F4$+c5>#txTvfPp5~P#&2(Q=y10Enfo(d=(oj56(TIh=`TSzsNnU
> z2#HOFKsk^|to$2jiPg|zYoK(GEtV6xF%ahx#CfRL5!(ZxMGBk%vdG+N;P6t#e?#=|
> zfQUgvmH!FRTOg|c1kfLcA6fr$$qm5)t6skB)1J{{kKWBP-JUQp*=u%YIPu6xY}2bF
> zGw)%F$MkY!Mm_ps`(8cS$R1oguGavS4!u3H4|+J_U%`Q6kAc{rcLM0!i at Bh0(<1<V
> zfs7CJqkE@;p0{{audXbtCs;hbcb#lI*w5=tk at 0#G#krs#*K<^C_uNo6qK7RO^s;2c
> zupSe!6&UD%<MF-2!Lgp$85GTW=-?Qawf9(xX}v>au07+xz*go0`XhQLgZ^ak&|X8?
> zgdP|1<X%r8;{e$gGFHzwVn6T`(UUCxus1;_1^siqnKJrwEvP;MHAkQy_39BoI2w`C
> z5UBwowML|dh*Teunj_MW5UDvL)kUO35ve009gRr!5UDvLozbNwbpg_0JvIo`8G(*L
> zpi_GZiqr&=jz*-Wh|~p<+8|PAL~4UbS%}mOk#Z2}7(}XrNNo`5<gOt=%7#SfV#{8h
> z%&-R&PwQpKMuFV~*tL2+x{v at 432?;YiC#<D3?Sn6y2=C)z_fR??AxAokl7m98E{DU
> z=E*o3x>yhD4L}~)J4&{$CtEyK!~AqMH9YOhu87?opK`nFamK^?pEGN_US`~_zn!V-
> z>d#Q!yq?+K)tT|AzAUq&>sm&8{ngBxuHKA$^{UL4t{#wAWfF~D_cEI5Yd}z!Q3;01
> zu3J#?AhQe%{;Yom21OYKAW!I$WOUXa&y4H(B_q1t8|2$Ez63|XT|`Dry?^HRuHP~u
> z>sMu7eg5cZM}s`42LeB={}Tc~hI(b at J@D63|5Iia1ilaQMo6^3zM9Cq+w~&jr~2m1
> z&aV0lW&NE at dDk5<=*+wg2Dj^<L7=M{*CEigu3C_jnfYDq8Hx2dnUA~DGKBSwnPk_N
> zjH>!MnJYp6i~9MQPr5=feCqFJ--QI)>u+VMyPjq|t}oBjbUnyut*?YQ-H^zw%w}kb
> z#(LssNT3%I&}2UEYJfnE5U41lt3C at z9|EaAIQ$YEHfH at pqJIZO{Bxqbe at 66=fvEly
> zK+qSdZJEA5g?v8qyx%;tYTu25n||hI5?@on2Ywq2cg@}=_|fkhvpC=N0-4_mvz at +Q
> z35xtyn#KEu2+sL^iONF1J!Yiu3V{#U=lOmq*yra3`m+RkLH|eJ&q4olvx`tK^!pg}
> z#tZuVR++W>4iTL7W1F=Q;NY6yeX|%}m0%JWnEU=DI6W)UEZKLR;H2NzW+}de;5--{
> z0mo<kc7WrRf_%`6@(l&YA!eI>eFO*mg3YphXM?_nStjTw`z;6k<$^@NNV7A(p9oI*
> zO$4wN0LC>t?5iXA9sH<#TLj1bn#>3W7>x6)G)tSMCEbrmHzU#<M7j}?9zdjDBGOBU
> zG!l{SN2Hq(X$~UYj7TMjGy;+4QKaC90!>Arn-S<Sk4OTMW+GBQM4FFC7a-CML`oo1
> zAtDV!q?w4+50U00Qa?m`7?Ey3q+&$60FfR6QU>T#pr<^70dyTC5-PahM}(Ut`K}cl
> z^;>Ng3x;QaIMsI*BoG1#tbo$T>=+R3^$RpR2?3)0Hk!5hvLP{=*#vO-fuGz=yfjph
> z3ibOyUgNjP?744^AY<uz&jr-*6y=;OPcXld))?G+qUtksV&nSOV^#CjS&d(}W>tHu
> zj}whwv=&$StMeM&TaQ;QQ71KqwjQktS7$V?2Kh2|cH`#OoT{a;J-c-m7)CYvfc!gk
> zJm?>+S_k at 8t!*H$Zq#W#Q#DO}xzVGwqUt)x+gdHak9A{vYf at F2dTQgWR@bU7b at JU6
> zn!L(|?J|gaqRLlI<UwXhRiCPlg2RleAoWfNoDLP)kZDQPa`myswXM6WHmc7w&TEaT
> z@>9n)`horz>NL<#tNIcGEot2Yf%Z3k4ss)PYa`KGTQymIu5n1KqAE;%rSX32&Z<Au
> zR-iw&>bCl9<C9k1s&6}vK?29Cd<gZ)#+9w-sshxf8oz7JuUZU&)<7aY>P%>fY-qA$
> zQ0}hUsy^Mg00M<UAgk8GDglu00MasW_zWC|J$y~{?|_K^jHq#d=-&Yme@{eppa43S
> zc=r}JJuiCoAMyMAPQ~Sgl*E_$b;Xs3Y>O|L{cu-K$es8izk6|oAr0}Rer<6jA-~06
> z at Vg&(DWop`A}W84pYL}!t~A5}?61aM40#rR0Q8T9bb|h!I3gMhqW$VYp*cPU6d#8i
> zi9hd`6n8!3di+hlSa5JUewv>u&Najz42Za4A=i?!{5s-(2&s)f?e`!qJ>(D2?*qrz
> z<1 at hVg^(K1Yl=GyelPi%#HEIG$IJXG;-sK|$WH<K9q}aSlOgK(EWaB>TyjWtd?%2V
> z0@?3={c(SU6oaFfIG2#0;%E4UfWiFu5q`Z%TGHo;G#8O75osPG?M9>*5$SD2nuSQ8
> zBhp+TjRt)RG#7z(A<%3;f+D?&Nb?ZsQ$(7JNU!YFk}44CUPM}hNJWTLj!4rHX)_`{
> ziAWWQbT1;UL8N>AZUAUM0xdwGj}WMcK%{+$bT1;U-YEmpA0UylA-Cf5{aWLSLoUak
> z^J at Xa8$kRt?mQ%L2@)uUGS%-25Ou~U`qe^!#`rwHopCoIu|NHM!QZy{(SDCo&xSmO
> z`ez`|k3ZqJKW=D<Jhjk!E;T&m6Qzzn9}{oeTiq6TRP}2>RQ0{UeAShJQ`OCZry8pR
> zGOJqyWvW{N>D5;QGga3D$m+X+Csf at 5xz$Y|uL~%sei?XDbpy7m0^`6gvAPW8T>;6U
> zFH*ID{_(&@ke64d1YS}V1yoj723Dz-gFHCU9{fxos#gY*DxZK!)jtJJQGFK>U#tE!
> z{eJz&#Sr+YssaMHL48BO32>OJ`Yj+D0_TCe01_=yT at T2wZVVKv`U5Ui%L5Zt<pC+x
> z<)Gghuov|Asvbh1Yk>zK(2?rjL7o<HxB6+IQY8y0ttJD1QoRTuYO22pj8=UdU<(H0
> zREq+Btlk>PR`o8-hXgWJWdS+W?SZALI{{hMU4h3`zd#@rBvKY|99p6PS}Y$*q3TJ%
> zg=!@PdI5os2VPYD2&B(|)Cc_S0Dmt&`5PeOKPUPdprwBeMEswLs16iBUp+50YsHuR
> zm)HloZPwrDUFSyX{%Ac}?*jL{?k^K3u<E&^bZe}w^=i2zbuU}n>s{d*>6TlM(Nl0u
> zbd^*|aE*1HtgZAeb2Z?Aqo?FL>)r<g71s$2M(Mo-gO}Dks2{8Q2=sPwm+Mwo&(+K0
> z4%0nm?Fo*;b-k?ldb7BDK>w278tzc+mi0uvDz3h6we@(tJKPUI|0D1_Ot%62mU9h2
> z&r<Iy_*Gcf=@G5msk(A&mR<`OG+AR{Fj2Q34Enity0@%{>pkJ>>h1=z%RrWE?W&i}
> z-2{%@^=5O2=z3VEgZ^&a)z;H6EvW#J{*Fj>5b1S9Iu#N%hLQp`N1(S5sDMDEzavr|
> zMEW}-os3BTK%^W*dL5BYL8QMUQYKwXiXqZ=L~4LYA0kp3BE5r1$Ldj_zamf!fwm)1
> z!T^!BBT`pH`U at g;M5GT9=|_mP9g*tN<v>~miCpEH>HcPItM at aPu3Kqs19roKc#2*H
> zB%pu<E<@RB%>*DP-7af=@Nc1e-FlARF-YvF^)B#tUN at Mqb~L}rodOEZQ1P{HoppfT
> zH(Z)|?d&;de43bn<<Q$ctKM3%Mm4K^ZuORmRjN<RzpUO=@nz$(^3~N56&qD^%GXve
> zu2`+|D4$oop&~@Jw)~6gZ$a)|{#Eri6)RPqu)Vy(5A0 at De+=@K<+DM5iE1P06Vodk
> zphB<Oyke8evYb)9q=K!gf{G^<DsXhax~pQI>W}gl)t^<oQni=+)<!DV-k*D!fWT{1
> z0T6gA)Xy&u0f%3x+{%3*a4^Wff<z-!v&&aihgU36tt;PD{Yk|vRbaVSbs*?Rlz#^L
> zpQ*N&&m*cmDn5olfz at 76ftTA=uc|OmjVs?$ZCpW9ttr>3ep%t8Dl2aSgBF#td~<bM
> zMU`r`d=(_HTJ>@H*VW%uY*G1^udiNNu}<X<fx;k>kIPp;OMC?_whGDxs^Idl>O~M|
> z4aAvV at vUkCfPMv_f0PrOt2@Bq8pVG`^zVR(*F-h{7100?)qeu$k2gi%?+*I8^ni8C
> z37LQMez8|epA2vA7RR-S&KR~!#RR`)x9o%F6tQJXw9KSgC?3}mFEeW<#r7?+s2tz&
> zt<1bRT6`TG2%2NX+?FiRPZt}2KEJsX^h;$nP;c5&2zpiGkd`>v#%7J!p`}?C0rq|^
> zOxdVrOneIT$z})f#I^&nq0PI*jxEVD<K`oT*cuEN;Mk$%5IBw(JAvZJ<^*s|%G#Qb
> zi`gwvGMDBYFvyU(HXjiWZMg*cm&7Al4#;eqPm3qD)BssDkf~)@^F8rA at Uy*{C7#kk
> zmmLB9q82+DvrQ_dKsg9hf<UJuP+~tKWh2s9L~4ad4<J$wB9$Q0>4;Q<NO44Z5RnQH
> z>3&2y1d&P*>9kfYsVgGQN1#p!v;cw5q(BMCkRmljq+&$sib(SjsS_g2N2C}c6(Lf6
> zL|TAI8Hh9=kxpuj0 at 7WONP>7w%U;>==0x#~mYp&l*x3T{kmfi at fP@61p*$`lrU8*b
> zOR>xm0*r3iFWcPQ44E~`egKDYEfzBUX9?mVP|pSVCoTJAYnmsDXFf~uoka~#99dl|
> z_u!%0P<3IS*Dpo4Lt6?Td6gGE4!vLa*t4eSRj8)$uGh_?m!UruzViC5s3BBU_}r_v
> z=xJyp$bT<-68efL?DV=0g4)7cV0a@`0Ts`RegT7OuX|vSSNJ2y4~Fh4Z1Or?v_JIc
> z!aZI~LB67J3pff7{i?9RYi`l{(5r>3y>=A+v9|4pm$UvTZiT>oUP=h8hWbB?o`b)q
> zUe}85K;UN}e*%d<@VZg-D3oX_toQ0GY6`tvc*E;T(Qlzwz(7+}3kJ1b4<OKQg%uF!
> za%dgM4;0BlpBJWil at _T&V+ti+Jw at WsuM6*ZEiBpu`Ww6giW);B3m1EJpL+xeyz){M
> z^@es7s=RI&y$F3)*yHsp#JLNJD2lqEC7wWwJtE*oy;o<^z0e8>)B}O?3Y)zy0cjVI
> z&IO0xfy17&|D5RG0TKU@=)ylH`e#5?{|TUPdP(e%Y^<MLV}6o%)8(dVi%B&v#U<J_
> z(L|qjcaqddV{)AL(nW0AXL5qq>2k>QnMoF}%Vn?WW0MTtb5v&Y=q~$BJ582?{Uy`q
> zCQ-cKLH}2ic+fv?S_AquE(K7(hgSxAmrPoDPhI*<r6!rYeJ+o|p18u>?2>94W-=BG
> zIHsSO95Ye7q?z`coaeoAIcWO8<Rlm*f#XbG2RQCBxd3|mOnbobW0w`Cf0*p%J#i^C
> zy$<@<T+V`i8m|iUt4zM<sa?`d<t8P(QUL1&umdg$rl}^E!Ov6EjV3?xzI7RH`hYN*
> z%3I=+Y@#J45$SzI`U4_uL8QA8>2pMyhe*|kltiTW5$O+z^gbeuMx?EX^b#U%F`+<X
> z5a at jbdU`koO7xqYMWlZs(hG?6HX=QTNFN~5J&06=NY5hDKN0B#MEWNpO+ch~5osJE
> zy^Tnd5b2)?v}E`b0PTlFdQ9?pjV?zB({7VuUayM?4AX%)#`Gy9 at E8*4gz^uU(?Ar@
> zD|a~$0VKQ at msh6yAhEqJ)4`!W?-Q3eZjVU})JK8*7O&amuIc9{=eT`-^QqxUu;WCs
> z;M1nMMfSDLk;XOUi>zzgBAGSnMPqB#5xO<^7TMMk-H~QBEsHp{_acYZR4lTpZI7H<
> z)3M01wmZ_KrghPbT216|*w(96fMN9_2FNGZ{0#axB5goFwDuUtqZTcweG&O>&F)3q
> z+N8)MAU|6BHTVf#bgZ at _GNESEq9L_mk+K?jpj}l9!Tb3M1a6LGL0o$R6h_vxgTszU
> zqnaxa_yJV3LZ;6mht;$#vZ%cr>00w*5v{g5l3jCk5gYVvYwAG1E^-0{8d}=`f$A5H
> z0C`YN_M$1ZF_GWZ^e&oJyDQSAX6K?)wO1lVHS0ltZDeXq&!P*pZjsX}+aQ5^k&GJE
> zB4S)^Z{(<&rbUx$8zT)N5FZj@)I5ZiXoV(ggYt6Zq?%WYbRdum1PZO~i`)*R&On*~
> z4oktI%hf?d{|<=wZ-~m at 68$?M;%|tk4irGo-nRK}_QIJLtL=<Ws+St=Rr(nBs#!+;
> z%0y$y-I1o>E5{ips7Dy>R8BCCRr8Eulzd}SJ=`c>X=5CXN(<vH>Y+xl%9~(6%_v%_
> zW1I>4$CM1vA7^w?$tR32s_j8xnDIGK{8{<6ag=(iQM+=iu}Zxe9LzFisEv%+%1kgw
> zHX5h28hu!8Zj`8;VVtBMZIq_81APN<Jl6OiI3|@Jfu5n!Zb&3v-C}e~Im9?lJ=y3e
> z=x3`Zfxfx%1<=2s{J{9IdW_K-CE;p(706<N?4erMs7W~+9DQp<Q%*J3QSSwVAB`ud
> zIit0tOhhU|q|S(RFCra+NTU(yL_~TRkunjf2$4D?P!R%UA<#n<D50E&NcSRAHX;=v
> zQh~XabP^)XL!=)e(p*IPAtFsfq{9&DK14bRk>(-Nj}U1dBGpBp5(G*|pt%4_(3A#<
> zG!K!wn#TcYA|$d~X=}V+ZDzDf>1dpyHUYyiK+HCZf&}6rfmkR{sRcm9F#bV30|FQu
> z?^Q<_sUR_!pMk$bV;eP{zFWzLdL582Hx{c`8rdp8r0?|iqK2o2(1&vfxlhi}QrARF
> z5j%-q>XbN9WSBIr^uxq)dw5Cw(iw>}MEXfqr6UvhBAp~gsdJ*8Xnc}=sQ~0y()d!_
> z#0ergY?~(PfE~AV1jzYG2B2>&ngseg5?6rSt8_`?N1`v2=9QW!E)XSx{7hml_&Hhn
> zLn6Tt9ZD)H9i4bql$XT3^wCbMeYz>m5ZF>=1c6->86r-S9XPZXv65&I*cRmDA<;=9
> zTGGVQDT!>6ebPsz!xFh7<0QROW6+<GG!*oQil#vzokUXzWM0Yuxo=WPsYT*!(VC>0
> zrGbe)qH#%nr5A}rnn;+G2L`7^(MhhQCliID3A-jj0({YkB<oU_#F-*IX>2J!ag2xw
> zfhI#DBa$4TCB{RGO at xvyvPqg&IurtpgFrhHT|}#a)Cx!sfxqM6Z(Q=<0}=l@(O&_@
> z{4Egie<Pwg5DZU40}9VOnYUKYa_U!4c9bhEoO0FQIG$AAb-HqQ<Me8!r_&#5!ts{U
> z+v$e-TgP9NbDVxvf9F`IobPlEl|D{{wR)T54P_xXSm=07`L)v{Fz8aQ1p`mVRxoH)
> zyF>jBr~9CnrqprzO>O8XQ!a4&K|Kl_*g1Wyj&KZA{tWu}9KTb}`>0mE$?>K#z^Pun
> z#qnq5EYM#Ceit}h1;4*413_=AV*~iDQ}1?ssa!!gT~{x4d;$i~)r-MklT#ZQv?;@#
> zYSq4uEy_=w4g%Q?Ap24MrDKtDA~@nXexm%?X_2}I^y{3qtAjt%lCDFfWr%b+B9$Z3
> z6^Qg20-cROYZ2%=043If0Y$nTk(MFSZxCq>B3+0`<%o1WA}vFt%Vugx7bDUah%^w9
> z_9D_Hi1cSfx`QHhDo3D;5$Fp98tB+Y0O<=v`XwU0f=JgO(q2Tm3X#4*q at T{b4x~3B
> zkp`ukQ-wOr at s2Xc>9%@1*!cqSddJ@&fjUUw29z(=%K&JtlS&-`{v(~_Y9q%VAh9#*
> z8{qG*(?<0gKGC3D4+>vHg|m}Ft?wA2T*ALK4^5wrwR}=@w8~6UUMR at Y>~t2E%LKWa
> zBhDwve-xZ(OLfjEKP at QHkj~lVdj&a~B<I-j3xZRcOy~Ua^B_-g&MVIm9M>enwnPvE
> zcDu{dKwjXy6ZH3MN<sgL;64Erm&@w}7d0B^>T<E*s)h*_(*+a3kwf`Mf>@1_vvc_#
> zfuqLSIa>L{l<bb^NktGiOLGVU7ealU^C at tcuSsx@hrk6O&x1sZHM^a2%P$I|G+E9U
> z%MS{6YYsanl^+KE)6NpmmuQM1PLhE59s(UK-vt$A&MoDq1PaYP=L_Yx1htwB=by``
> z2;w!k^LQ|@)95;%FSioVHR(>dkU)+m%{jCDtl)x1=zO%iK#-wHgg_;bNSgCWXo);%
> zv0NylG{>Dw%fA<V5B?4U at g+?&fSv?UBk*TKfWr*O|B~q60TGC3=6^^;0nJ0Rr-E1V
> zO~>nYjw>(7p4N0LOQ*IbdtFmh*6LclY^?R*DNb!(_GqF>lr^e0H`}P``z({%W7#8`
> z_GB5>9?c$x%AD-RrqnE>+U4Nj$E;zs(b<zh-?3H*`gvL7K!04*NvPkO%?G`uwVLeV
> zP5oIBwdvWLn;wCEdG@}h{aK>gF`z#r>tbzIF5Yw?%e?kt_Q)n_mVRwPHZi;@0UW1i
> z>w at DEwI!e^$>M=y!=~UYm)hj)p-n$z3BX`d(-|;0kUatPC)6Iw#+x#;ENd at hF9R|o
> zAlurMl(n%|4t}0zrPf}`-rF<`^rvNCXxg2NNSk61C>wzmB2b;$qXdv9Bhq1r^f)5L
> z5ort}Wh2r;M9M~_QHXR1BK;AO>L5}Qk+KnKQJ$9c3?iKYq{Ev^5U48xEk>aFwFE`F
> z7m+d$=@~>i1Cf>>(iw;}36WxmG!~J%BGLpzIs=hj$Qufz=8y=l_Ea{#>2Q`=?YV5z
> zCNbD$0x_9291<{u1dO0`X)4NM6F at ko=^_N!m#x$EGHWwr_HC03IMmB7YKkr9)sj#j
> z4f31W%qCTqthTs#)F(mI at Kjy5rt>$oRc?N?!2$B3eo6i=0|}Y0zb}8c!M><0eQ7>v
> zAS6%gAIwiTkdhblFXks1>>>B)@6AsHd8z*X{Cx(gBykA@*#<v?VNre_R2<Sj2L^d$
> z3K%F1Zh`z|ev3gYc~k#M{!xSHqyXexgQ4JPSiXV5MUt=2&CfK at Cr9X)7DVYD6c!HI
> z4S^4k1rRtI>WlUFfWN(DiT(u$ECTs{NHmfBQD2h3(?CX$srs?`xduh#Dg86~r@(;J
> z&jo{AG7bV=FgOZ<vh!si at 6@l)KWxxX{;nUN-)iuP6zO;6vkfkgF8aoxKZ11CkINrw
> zFoWF7kw5}cGEe_-zR)0^JgfhG{vm at y<avmb0Ey)3i=id<LyJkEBxK|P{pkFY5J&`p
> z6b2-D9Z0_iQa(5|0f!>)zasi~K*T>GV*MMUe*i at Fp8)#h16?f*#Ie##c|VDcr^xn5
> zGERtIrQF}slMyP~E9^gTAfr~aE9L2)<cw+&nbNx_F5|K&Hl=G%bjB4?JSxjXVJVOI
> zkQvj#zJ5=9Mzbgf^fNLVLBDp-CD6Z=auw>IiB5xFO-71Hm~wEBIzuVCm$D!1Gej&R
> z<<TB`h8q~H-(!~{KO{|gwP$z69Z^b3-=0GmKY_smaI6#^0mrc!e}dkVJ&E8rI)%CC
> zM21=vlX7EE7U-v^`~v!~M5Ul#n$azirc~@H%xDl*0T>Bjnv{oonlrM%k9ZF=;|~#*
> zvH|p$i3o?3wnJLd7DT!qkzPln5=5#-r16Nf3Xw_?X$vCVk4Ud0(*20^J|ay+r1gkY
> zLXoE2L!kQ+Xx$Ml=r05!EkLAyBGP<BdJT~tLZr_S=^jM-3nDE*q<<pP0z~={k?uvL
> zDny!(NFN~50w8rrX*d!Cpt~WF#EhRsqLdeV5;BP2L`f;n!LR~|@9hyn0 at 08F3FV2D
> zIv{EkolUs|0XjvJl(aqfAhEkCOTl5N$SOq at m6&l4>YG7cDoRa>-7`MpT2%5U3#sAh
> z?5|&sKYoAA#v8Gm*}bLQRW}kjb9?i+J~t9LK0TRSuN(24&w9 at gT<;slI9|P%xGQfY
> zb9{SKxeIRWf{KgWIXA?ddA%24JA)GphU;$RgZv<O4d`#~-3j{T92Us=HySxXy?3}1
> zZsc(6d!0b8&#3}Gl{Yw?mAzxR*KcHTe(N>lhSbFk@$NsTyAT4;?#+d`u~1L^!1V=(
> z3wnR#ehGp7pkfYWx~R8=JNHHk=ZoGw+ at Ko;oOQj&xvOs+2ZMO-M$q5b8wG(bakfLC
> ztvAkt{5h9-;{eC9_ZRNs8y%c+y%MhN4UF?;?@VqD=>OC^mAmA|aE_{XzrkEcz^gZ(
> z>vkiCvzX{D;=12B$eGnEgFw3>k$moaXo)${WOJeXqW3U&`Hd40NCJV%IiL6b2BcCT
> z9SaVP!J$O|U7~*nMEnOtw0DU99T4$XL{tX~p#M2~_&mAoa-*{g!kOY}Vbf(3!xxH!
> z!#<Tg2zO13*d~z84Yv?)2;<A<gpU({7iKT>4!0A38#Y1a7Vdz`+2MbRw}g$8T>|^1
> zVGgnt;W+5)%f15rxnV}2ZzLvsK_NVR6exZn8xn3S9u?*(n-xAsYzPj<hMy2`3 at eab
> z0Rv4~tjvp;ERGDbk}VFm6mJW2lq~@LP;fjed=faelPv+g&0#j+c!D at 8j3xUze4=<^
> z7zgxq#Q~rn8Ey#rhO!;ulf~{~BV|G1!32<v12S*%ny|St3ve_%?6_=sc)s{47~Bev
> z7k@)&Nxwj(QxWOMh;%w4{Th)vAW|PhIvJ6Efk>w!(vN}EH*6{b4Mw0-5a`lyf+C%c
> zNJ9|mR7C2(LrWTfNa=`l2_nT1X&@qXM5N(}^dm$XfJo_xbO|D*BhoeD!2s%tK)*zw
> z7y=C?5Gfsz2JM&#q*joKjck7S4Dt4`F|tp?$BM(i&>e_F!fYXd36Q`zC|P2EAo?oY
> zOuQHZYzm()9vL<V5}Pls2Y(O3cZ<LL!bTPX^(#O=HGG;F3yYEke!-uGUTaA|6RgNT
> zY)42HcXjgGZ!wb;?K(N_Rm^O~L!ImgN at lL2QRhtiugnt)xlV3-Ju^|!rjy?Oh?%L-
> zfc!QyOYv0aSo@!_eMKi3>`2AWAn#+wf&PK^4$wcUqXBu9B3`Gs{XDZwq0lLB{}kk*
> zI(+amMzLNevE7Yex+pH|%xvGn+;v&SI?;NKb_oLKwbwx4yP$BLnGOy!+y7uDK;WYw
> z&w at lRwl^?y6s<Zb?a!FSimN(gdo5F_s0IB-rWEw0?adIVUPlCh_9^awT*Oo>Uh34e
> zpJkp^?9`FBcQTcVRXPdnL=e*w3~bt$G0!PB=;*aSrsqHcx$QqQ^A-1W&bI%~EKv06
> zoNT`dfz*)5&&&*Hi7aTb94J%Tdze2csv%G(1Ujly)Lsmv{Xpsl{x*WYPR9Qei1^Qm
> z{s&0+{{=++ABbk5_gWVH at bc=CgT<nmP0~2C)U*qN80j^$s<i6 at H)*Ni?|X{{&C*P>
> zhO`X9J!yg2uW82x8fl){?X-Ns18FWQ+oVg)ZV_n(0wZwHnU*W4l_r2evfwHhG^dHc
> zKxEbk^>?I)%x<MM3XVxnn4L~57qm-%GAjiKNm5(0n`z?&p`h=b#ul{hJ8O0$?Wo|H
> zG~KK&?X;i?^sj*5c4;B_%@aHay+6{jz;C|U_%xwFAw6kEyh=+1gA}uFFt{Pz3kG`y
> zzevxTb)+2;JeA%BvH~Denw6(j3U+~`k~Dk46X^uAAkg0;)iEpErzNdHq!$tCOGJ7B
> zktz^rE&vn=?jz8%2($))UL+9dOGJ7RkyatnbBMGPkzPQg)rj;WBJE4nl6E6f5|KVf
> zq|u1<1tL9-Nbew0nHdGzjX+5R`W%50BqA+Gq@{?o5|KtD(kqCRM5IqsPXg&tNF+;e
> zS9;0pT3U{vN1AQ+C)jlWadp}WNFW~)D1cIE)(1dWrBbtJ;J;pa!K^UtCrGTyY!mo%
> zlj at mO?#vQY6QEEF75k;<&GOS2f)_h8W-X at 1r%X4S)u)K{PGuuJ=p7T>Ez5Ww1|3t~
> zb<4~=bRRmoV`alUMs|#KXOvCxz&ggcTa}IS;C3+G at v_k%w{zDkqj~6eIKZ}}hc(#Q
> zmAQhP>pl_mKkWDb^aDIRKu&yB7Up5z;pe`#Y_iAtj!dXH<gpVR?J7IqVbyWQeNUOd
> zBef&ieT>}1jiIrgJpuyLJElY65m0a8&IN~f$3%Av2+RSw9wchiVe4*CHqv8k2gBXG
> zY=(zj$29lxWz#@^n7b3`J9QXCoN*pgJD7y~M`iX<@s<0mGLFZp4iERyW!pVMJ9ON?
> zF5By2(Q(o}2 at H03<hhS36MAHIussbR0j$H-U8iiQ$LJ0#cXk=qgV`}20+~Z1uI at vi
> zCG?=h44 at p_Vc>37<^q9qAWnb>uVWT~;sAOE{6&F3LdWYrCi-_kL<f8Be at mo8^`8Lx
> z&K<Y+#k%jWR*k=KOBr<jp4#uiE+zf^PIbx!RSoZlR<-SgS4!jaM8Dep!V~4l^IhsO
> z7oI7N&OcIHUU-U1>kBmHu=7vUx50ty`KM~yg*q_!Ma>3%+w;|+U#*+~^+PWxK<`I&
> z=!O4}wfhchGF{h(Z<ipQv4hA+z&<LDIx0FKBB)@bs at Om&;?Qh>1Rezfii#Z*5eq69
> z3nUsK!8%GwKoo+FW~GjF#16hEm*4w+dw+Ycy_RdwU(d>YpI7-k!@)Wn=YS8{Txmkx
> zDA}>>O{kwQ+nPN{8d#Tt{4VK=I+OIb*+ZpY>t at J0vxiHY>n0#SfI;I?vPLw1U-uh=
> zKS at 8KaclM)X=$CNtR;Jr^eGBTvZtY7sO(|(0O`Xz1KHc`k<xp0GiA3SYllpbts*^I
> zHxGTbNQ3IkWSg_&k(bGqWviusm-di$Lu&|XO3*5TGMXfPN78X5eM{0FB&{K-DM at Qc
> z+KZ%rk#r78t4P|Lq%|a+lKEXajii+%{f(e62s)jh&D~HYTbrb>Nji<Bl_dR*q?II9
> zA?YiU_9N*Fk`5qgB}r#ywm|w7i+rjZFME?cLi(j{s_bL77V1Vq+*|qq3$$W^c05b7
> zrvTJn#^hwrz<|NBs_by-F>H1)`#KuN$vD~lE_|x%Ez8O7iE~$3b+)^7b=~v}-z at 0I
> zs`PnRAs%q|Xr0GdS-H(|=@*a7vL`nCq>nvPWsj|S(o&BzvK*Vk(lU>ovQitq^s~oB
> zS&@xMTH<jD=ZVrs9_g~DHm9T|j7OC0D+*gYVsUX(`W^*;*`%T1rR+G)Z+PU&vTZ&|
> zuX^l|W!MbH`DhsjjT}8D%0Aollv;a4$d=ellXiNY&MLD#c=G`Um)q>e;Ip_tDlJ04
> z5}O3+M+`2;`6Db^U~@wH#N&dj%O+FGWP9wAwb;Z--+9EL;Ec2m1$8zl7{r&o#GopV
> zlQ=Jy@;z?IZrOa0=6c9wA{(((;$bZNXfsr5kG!*ufi%x!k}S;T+N~#8pwuQ-TH$eC
> zmTPlN`rPBDtkOmx&Grytkyxn`Z{iW&*b_XvY_2oXdmei+NQ^-*Wq;aqKza+(o at n?h
> z8j5fKsOZN)%s&;0eo*w!Ko<04RgQcvFi*H2F@*VgF;%1VMcU+!{M2QoytI`atkkI`
> zr_RmpNJ|}8dL(UZ$CXs$(uA~;9cNQVl^#tq>NuZjNYA9yN2Q0-j5}OWFH1A*h)(T+
> ze4maT$fu<ZL4HW75clz^KOyJc(Ukgg>6bLSj&rFNr5&ihn|iwRU>b9-V<ZYR)Ao0q
> zPMTACGHp!9?bOkwC(>qiTtvZMG(ML)1C2*@+(Pbf+ITcJDqWwZ*0C#<U7DHJ3;BMf
> zV&qSz4nuxe2S0UAX-e9lj+?1IfEfd}xO9Ko?;Y9b)1H>pk(HWUs*U`d)P1FUn56I0
> z7?PTjR6^3pB;7?)Ly}%5=^T>Akkpi<5|Wydlt<FJB$bhLGD)M-x}l~7O+Wn|Dh8A}
> zk)}e at TO?H_sfeUANg7Ym=_D1CRE4CsNUB28{Un`A(w!t#CFx$0s*v>NX*Qr^u*mq1
> zOR3XJ1!)sIuBA?3N{^v11>&f*pRs at u7BI$Btu!5?9jRKSw=v*A>g3W-X%<+_vUD~Y
> zvQl}aJ8zHgh{Am|&MQ(Ul~$+i=@8u>yJ&g$x2JPD1HF<auAGxIKR~^n8#p0nVL*@i
> zje)&$tOI)2tqau5SrDLGzco-Thw%!~tPc+ypR+iiU%hi+-yB<9ga-D?aR}&HAA-;B
> z0b@~Uobw0HT?0qvcm>R^w?V#Nz+#;H<cti^sW%8*pW_*@w!RhT4+5gmCn854FuuMv
> z at MO;V06~3G;J7 at i&1#K7TZUk;di at 3ro{#&@f&CaX>{}leI1z*U<DwTf)vw<k*dxa-
> zV08V`K%E at F0ONY^z at KxxQLrFz4)SyA%`qrEU>XKZ$qB~!^gz3u6#?G$+JRa*69YW!
> zT>{;6?gUJ%{}vd9{Eqrhf!aAw0xs1%1@*uJn)QDKs^-iK(5ep%WK?oo0|wMH7_<b7
> z{1Mm(Z=x4oSr0r%*RKj3nB#*%E*R7=U~s)Iq{|?!MZ*#_blLV_L_Y>%{<or#|G((R
> zK+Jy;b$<al_6nHvYV<a>3xPw{MtPYH<So<g5jELt3GY|!dr_;VJH<I^dqi27t>(?s
> z_KI3!wv=b1y&-C$*&3d$wttj0J-wrDnl0lk(LRX!%{*)E#ZeoO_tjpAyaz83`9QOE
> zyd{kG%BU~|dukg+Ei#+TGtu^o8fP{a4OF5OX0E(K?Y~fv!>iHu+2vy9$opM;Ym~W}
> zGtWVLE%H`q>=(5ZjTdTfL2fy3J{sGarSd$qEut2ih4D5b?{5~0ykpd6<Tq>EN4c2!
> z@)+%)sNR4vOCV#L&F78L)<C1*cm>)4Q4h_^QSdIR%FKM%cd0E&SCBNEq{~QZK~igy
> zdXm(Iq_!koLDF!Nt{~_Vf;tm)b2pShqi(4kNmr1RiTy4OC8--pw~%xlNw<^Kfut)*
> zx|*b+By}U{7LvM=bUsN}5p)qj*AdhTP^KIO-O`}g#gP7vMdoX}MXfP&;4RP&iLx|X
> zg+gD5?Rbl at fGrkSf~SWW1JS~$5VNfqup(-inJI4^7Mo!99{uh`HJB|rI$zrk_lt2p
> zC~CRcFTB^<+mFt3wCw)&bf6?8XLsAA6RlB<URvc%{r#<b^pYws>Yr)dt#_s(N&iY~
> zw4S(9qMzEDtaqjIwtigeKD~35$MjQL_u at QD|8(miy|a~4d_JqU3w2SgS8#q at KLYua
> zmAjD7(`&-Hy!DlysPegfZflC(-O5Qg*VHpYpOLLBy|_wa{n at R|dA(Vc+WNcOV+>MD
> zGlpbga9ZUB430wJs{T1NOsTw~zZZkg<NP!hy<K at -KdE)UUToz7eNk(gUR0$}e at Ckj
> z`DpzU$e*a(fkC(Rj$qJ%RvFIU>o>F}=;c=y>0fPa*2}Jp*T2)+Q*UqO9DQR31wU8L
> z(7)C?SdUeCWOx!5xKepV|3Yho-qlKx{>9egdcw+E7!-#^uIMM at O`OIXOTsg@@`Qe7
> z>m>||$DlmD^hzb90!WR~PY3<thy61U^S6usGicyH0Wm)+>iz<9>^1dbr@@3h604P;
> z`J9mb0)MCD{C**i1-+b>^L;iyJml{5jlVS{Td>8clOG&XAP9GA=ZA&l2(~+Q at ELlx
> z at nb{o3WA-O0ccP!V4R-tSEFEsQxOWj39L|H74ivzT>e4?r#ao?b3-l(w4C1Y^+L|0
> z!6ANE$e)7GP65cT5fnSM99bLkKoI2A%-<GrU$EZkGx8Pa`;PC4zF|&H$lVicLf`En
> zQw8=;&-kGswStul3YLYuLcs&RB?>H^<ovZE9|YD;jr^&Q1w*D2@<K4e=?EH~6?}F2
> zi~lji9C<%}Nl5vT at 6x9v^(AQ)N&QLsjHC=nzY=sUL7x)T7f{9u1>I6#l0GJ>8%gU)
> z>QB-~B=sd}b^LefE0Q{sw27pSBz;NJ^(4(D>4t78^4(Bpf;JJ<IphNa=?jwjkhGYj
> zjwG!hsWV9%<3k}0!XlfTzVN+66oLS!H~h^Zd8qpU at go5j3v9;%!Fbw-R0CARw+m at T
> z|2usD5TQU1iwz6;1O1ls%R`EHZ*qEsd*%r)_VWEg(gly5Uhdv9kN)mXbUf(ltt)fh
> z78mL~>wKsCvG}ge<IXp_Pm1s8Jo)-ox2*V~PHtzXZfS9|PFd%B-A~2YIwhUYb&HB~
> zaNe%_w76X7QD-YY|E2Q{b?wDfI4{xdK)$~7Pvqlt1USE4e1Xx)>pZ3_E^g9E?+n3(
> zm5u`%xfK7d^QqHccTsVJ&f?Bxx?Lp?v`asI8&rtF&pKaWa3Su$=$4>iQD=wl7YtV7
> z{3#Zdced$1F3#2I>@3yIE3VOL?|iBIq4*{84|U%n|F%<sIq!AeU`}l@(}IiJx(UTf
> zotvEk-JIfNook&hbTf;sb-r{4=`KZqQ)i%VcJXSR at XpGCkFh{mXO- at Y;sTwV&QH3P
> z#U(n=J3nAh9u}$6EykO8iZ}Kc&(6-rx_63SW6%o>iqpB<nE+ at Jp#JFRiheJCDrEk4
> z(GP)!Gk>#a9{ttbrGA+&&QI=&zUQnwP&29|Eq|Iaw<e_IZhnXIV#B&;N%;=S^cwFH
> zN&ZqsDXsA;xs|_0d9!9iNml-H<!ySdRxYgZE0N}>puzl-+xgp-CsA-bpNqUhNi_1&
> zHBPwqQN|+oK3_+9qo#jJQT{SzMGXt}bCh#xd`o8LS0LYBqMg6;`RN+>lFa;h%8Z(|
> zCFk;;kq<y$W|=Y>jc?{#An0Fm6^*lM_$7z(w<xdIEGjvH0)CAx3fz at ZD2U2muRLAj
> zTCywOT=@<%DP+o;%_YzCXP}Q}$?SY9<&2s}<nJnVYl5DCmxgvrl~)LAP0%!gZYjxP
> zAiYge4oOdwG?b)QNNP>eD<lme=^2vFCutf<gGqXYq&5}brM4uEC#eOb%alh5x|pEn
> z2<lV9bW4RKwIyjhNi9ekPtwgKy-3n9k{%&x07>IXYF=?2(o8IJHQz;fp~j;`l)prI
> zt!5+YTp<oFxq$_;uz(cLLp3%4ag}j3^B4^HLz!07x1<7_mDSuq!w%)}ny`CU^MeuC
> zj`NYq)S96s1M?T(lPp-;{q2dpZIb90i;#LtL#HzDA&#FdCpta#)^vPiIo|2fhW?Jv
> zEJrzIduuzETlRK(<~_{ui{)siV(%%AO3N`gH*kDxIo;`rw?01ib7DGC*lMYQi at A;;
> zQ1I4!0t(!n5^#Rg($Xo%JJj)-WiO{p at 1r=s=(H4#oGdRpeesTTw6W~rWalk${A%^H
> zbNL^-OCMrznYTIy8{&SjV=?+Ey at xt}!r&sDKgOc at -Xk2JT8?%4=KZT<j- at K&)atF~
> z*kP%Lf>Dn3D5&>lW6&_CR~S at nsfTk1M}g%Wr`z6J9rG*~I*Gka9n&q(Ieqd at aCAW4
> z#XHe4*Yc_p*L$-4Q!MbzTg9=`(!?pxd!XYB%ehV!-or6y92QY=EWw+2j5qca&u`wp
> zIo`EoG%&~%gWR3&cn3i`8`4NL%tS*|hkrx#V<6^#7Onho(f<hQ{`zt3b?@FI2gQd(
> z)k}xPj9y%gXjD?WcwyWPkzLXxv2j%L^@&OG;@{$~h-M at m5l@Xv5=}`uE}k5BSu`!_
> zgxHjx3F6$iOQNYs?qa>T9U{}D+hQH$2PMgnj~A&TuNrp%_i5sO$Zb!0DxMT~SF|!I
> zQOt?EkNPj-t8o`Z8A(GK6igE(CJAnik4q8FN{SZGj5{wHopcxl>1doN9*f44lVXs&
> zD4K)D)8bZ%MkI;F)8pbqTFCztw+s0cu?q4kNoU04<4%hDBt?mX0h<cg>bMM%eNrd-
> z<cmZ}kzz^QXyp5gPsLrmIWdXpmfj+%AxZa<bQDR&BsC at JQId`)=`E5Pl5`(Q4M}=~
> zq!UQGgQTNKdb3-Kd^dFO?eEZC1RchZG=`)@NV=P(qe+ at ZQZ`9<k#rbIV at NuTq!}bN
> zCaIL9Lr9uV(qSZxx;-8LNM~V at IZ21aMscS_vy)=QbK_D)jB(OQh;ND}VS#B_U at D#?
> z;`Tx$6ZeXX#sHysRNNgA2a7q!^+m%;;$v~r({qw;;{G<ytHnRZRfq&hyHC$pK>yu1
> zPkDOL{!jHfRlFQS`Hk$JRk1na<(IO5soItEi{fndsH&Kpx$^YvkyR-<qZs+E>>gEn
> zbH>W!v&U5J!^QRNiB*SlCdg&@oRrfKg{oDTah{N^h5{}5Zsc=w*5cf%>SfLx`HO7p
> zs^px-^2s>Y$hn9<sZ}aDJ>(|YSF6tDq|3Fk``1M0j=Z1w=Tr<flnXJKhx=>UW6_Tp
> zBfpv53xmhuVj?!3EYHdwUlo_rM}9DSPE~4-s{BH>M%4ur#ANHBKu5k4gKp&v!=MpW
> zQk;LtcCR{~V<|7ro?X?Hvrv94+peldPA~b~><h?Wmj9M*Ry8OmMt=0}cq}kVemUE?
> zDl%ubT%2uGmB8ef$ZuoN{+uzm7>zeE5wC1Ko_*wr*}qj?#Gqpsl$$e4UIHl}QWG at P
> zMZ;tF{yWi+ftdf5=>C5r`Y{mmpG6DkKOFz`zG7#4<<VyclVuMiCDK-Yu8c3)Ej_{S
> zD|>hA at U^e}v$D4mzVt8t8Ci|wnDiw-P4-42kXG at 9vRCv>mHi|+DXrnVpgvvtiXSVx
> zgM2oBFY;%l&yas6Igk6}GUgG27x=GbuO%O(ar_Ii2+1cjcpzIVNtCYVk4Hgo=@S0s
> z^e)LEX+8g%tWI)3`k9}M{0=m}Ap3~MZ}?Y{J0)#E<0^@_^gcgIRxP<My^DOV<R<cm
> zWM#;g at sG&5B$uR5_+r^bz-supjBKwYQo4gLN2702cYcP<Q=*T8DKcA0O!{}}9+I|`
> zR7%oTl17pA6-iH%w2P#BNZL+PDM{NQeS|mI4gE&Ybb_|>nQrMWlD3mnmib+JlcaKz
> zUL|QhNpFz!Gf9t=^aDw6l2lI8t0a|^G?Jw6 at Q-k>WFJBE3A%%za)zYh%xXyMu}A|y
> zMfP5DRNBP9Eo+n{pzspJyQHtNKou6K!SlXE2GL$wk>nZ%oRGCjI;0U;EJ`v73-p!E
> zm+ZUHz~6=YSezHhS|s(-Mf at 8V{#xMD{q0F@&y+9yWT8pE6)p$OnQCXTZ;8tZ^ET&G
> zzQr!5e*f%z*!Q{1e)9(B1HN4 at hs|r9MZS++j+;Mp7Wh8G`D^EszWFYR<}dO2i%SOT
> zvV1#me%JX1@~6#<kU!;8g!A{lGM6~>Xy=c<-(0?$d*j^2Wf=O5 at LlR6G7op|<=g4f
> zmoc|-&h&rbcwl~$Llg!dG;hJ+3IzUgK8}V0^D5`77 at UCflUQ`8`5WgGzE52w=5psa
> z-w!TX=B>`Rd|Q!!?wo{tlKC?Xs&%=DL8-p4aGvU{^u6cu&U}~iUf)cY&*l%DyL^|s
> zTs8M}9)dihXTH{XpYIZv>E`!2C$PX_^A6{D-!hlI=5@|TeDAs(Gq1s*Cs?GznU6Pd
> z(!3fAJjMdq&bxivG3WsXopRY at 9t-K8kcOk*LiBsE^j`omf4k^EfL8x=5c5N#?k^z6
> zUh>~#r{CRl&+oKWb1=`NX at M}Hc_MFa(^%oPW{dso>V?9A&8v75n^p=3H*<J~P0qrh
> z%}%^un(T!J%`WsD(wxK_-NX^TY7S<2y_;Nwvzxb}V3Tkr3I;a$p}>!)i@^A1cLYZW
> z9h)6_=1nt%Bbul3mY_j!^Ap~<CZ+H=^65>Vgu~ug^NgC-2>Uj#<{39F7HT0s4Sh#6
> z+o7+Mun%%$npU8%J at 0wbcHxv}2cCM<7UY=#-T)LBHUEKvKZHLwTl4gr)(ZPK>p{kW
> zY$os5rfI@(G_q-WB<#^##JhxiRPz_!<Tu}?W+a_YQVo(WAn6p6x{!1b-c;`<Yl4~)
> zbUr~f7?RE>>0FZ9khC{R7m#!gN#~PP^VN6h0Fs82v=2$SBvmEpVv>$0sX0jpG<QS8
> z3EGFC;RI!VC8-5TXOWak(rF|OCu#pz4v?<FA}fU2&A;<TH7ygenq7GlP^S;^oF+#s
> zV2=ejcy8xu0yMMPlh+pm#x^hD&1;&9#isD0(eGMwJ8xFk3gH~w&u*H^2tAvvcx#$E
> zg{oaE7tr6`MVr*T-a9<)dTl`Dt^%8g3$;unuV8gVbZuB<biQ*$Z0)AV_=4XfcGucR
> z#uhA!5Y~o7Mi#7#*ijpdbGwL`TF=O+g2njk5}Ag&v$e}{?iX<$d07D$dDBP*&YNoo
> zMjk6*#zwrVb%?Ak$i~H&$lhqwzqT_{SfGp;Ub{3>ub?_2wR-c8-488d5;1sJ!AcAc
> zz`a#OBpU80u#UKd!4Wu*!J_<vB at w*Z(8wzV>m!cUx<;NYSQU{{y9)VD5!aEwUa$po
> z7DZmeoXlF=NFh_uE25y*KeDmFDB@`C at W?j>?h&=M9g&v`@*{eppl`wbh$FRcA}1EC
> zjpAW}*n;H|`)jvF9xbqp*jMWp8CS3ngSKOl<q<paCSvf$cz9kZ at Qyf8y9R^YF~~IX
> zP=PU^zJMyxuLk|xdEFr9Zx{XRpjd#Izf-h;{_4(TMrXx at J`&y%Z~kE)eZgfb6 at HG-
> z0>PhF1$^P!Rfo=4`SLS-oCTRy{`~7c%yPj^D>wcv9~Xhl%8P%4o@@CwJ{-YyD*+mW
> z3T{|g@)J=Yu(CjbuYiX<&u1g<9r?SF>#!QnzwPszpv20P|H5ZF>U;3bd>jP7S-nQS
> zP at rSwe&nprN`b^GjGykaT99Jpjl3QDdh*XRXnf0xi{Mg$7>#8<$%2Dc3;9x?t%6f1
> zNbuQ=f|dLj6vSAq;GgyJ5bUvH_#Ys<4q35}t)SAXAOF11WWijkVE!zh66C+~wR~)j
> ze3#BAX{t{*bQ?i06LcX#nHwbaBk5U^&L?RqNw<+Sm81(unnco2l3pgM6-iS`8WjIs
> zx|yU$Ny;VZF at kO)XbM3cyP*vKB1t!s^e9QWBt1$}TapS%I*+8sNNPvYqa<bGrI1Rn
> zh}dca|B{cZ;F?t+U*zM2IuD4g1h=t(3=3Sx^Po=<Ko<OcK4IN&(w=|WXO`dvHY at e%
> zLc;?75TALw#a31bSmJyH|B8=^V35_O-I><(r at M#3W4-btp1Y=YwRuP6wOgmQws}Mp
> zwR@(vw|PcBYxhb0+O{p?LHmZ(iZ-8!oOYYk4{hrr8r#>VzQ_5UcCXaBw)GKr at wv2Z
> zNkkFTJ}>ntE?&0JN5S%lHWb`!8-s?LsR?aC5$D=_rdGD~jaZ2Dt!;16s5W(Tn at z;Z
> z_AjX~+P+3?Y`44I*}5V6{`)Wt_Kr|ua2M|7?d#BQZA5PSA`EuNxfd1<j`*|PBekQ=
> zHsY`Lpw!20^CFm%_64aWDEQj$iUQY&&lr@`=72#isrPWcw|!jdt2XtBi|t!ekGA!W
> zXlU=B8rrrf!m|Ap^3 at R*?ORfP+a5$Tb$DO_pNOaJ{;40^wnpT)`=-8Z^NYyFpm$j0
> zX}cTVgcshJ2cEVOHSGbZ#cd7 at 8oEHdDdGa8Zy;TXhTdq{@b2Fe{TPV(A4FgNEzv&)
> zS<@fx2Fy8IqA~EV*mZunC#;4ud1rkza`Uas^B(vV<|Z$8y`So{F;`~A$&>nQ$dy>F
> z$-C;~l`FPdnwR0 at mV1q!p1D?5&Uq4_Q)m#Dcg at El_Ym^&K9<OD%!@@n*2)+6_PNo>
> zefAlfE3%rKSK+fZx5#QT>igwRv2x0r=2L|{Q;?_cvp)Z_)r!39KB2i;R?G4(`1ql~
> z8jaWHUPNQD&vpb|@@}DVhSll3lRk at cGp#n~9YFqw)mG$J<nBU#m(R-F%U0|1qI^Pf
> zKUxjP0vfr`trq1eeR`nJ^t?$v;ki?-9wYxb*T8B?K0z6)c_ckU(g2d4CFx?4UL&bD
> zNiUOh9!bxTG=QXMNNP^fD<lmg=~<HgPSP`0-Oxb!cj#7v9tV^WS#2jNpQKwzdV!?&
> zBt1{ktt358((NQYPSQmrO(yAllJZGvP155e4UuO;dL4`0^6}3-XSFKthEGuLZ7T=V
> ztz#hmJx_!MGO&OI&y!Yx5LxC%ScPJMWA0fiv%DfK_QdKV8W!dbwwnL+me23Fx4`+3
> z+$1Z*yrDi at o=O+d??dp`_bvCEYZSp+s3K->W*ubBSGmDn&$`W8pmN*j57sr7wMrU$
> zJ4?j!R=LIwWHAR=^Hj3f%ULp(1unL*Zn0LX++=UVXJ3_g6dq at -!?`2t1PXSrtyl+G
> zER`0VKVki%lFHU%J!5T9sbF{E{7;pc=rf0vr*eQ@$NHJIQH9NZ!8$g;W`M{rSnV7J
> zi`kwSyb$+XRu=ln*qa#EAq>8bi(A<A40|i<2FqOK2zxavmF1>#obAOr$?`&hH7f!I
> z5o|jQ3RH>3pg2|#&S$XNSWYUB*dth%S%xZQ>}9OytcNOx*e$FX$j at fKXI){HstjhY
> z(7b^KuCdp#GFXdMF0;c~5|*P%CYuSspx?2{I+he~;uc=n4Lpyq?O8&W2L>&}AePD{
> zwjQJ|kk+AL1sX2X_y?jN12O-;sONt#`Y{mmA4H4j*GUbMN&0Cebgl`nFSc<#QM4^+
> zcd>zMZqe|dg~gkfR+NVZH5C8h`n1S5sHxb^^;wZu(97cWu1|{A1=SRL((_gEVb|g!
> zx1b at Y|6Jr5lvBI_`FTP2kZ&kjgZvuTzi|J!*uk}!Df%VoO0kElw1^c{Tin+*0}XZ-
> z*Sac;-UO{f!Qvu$(3{E-*UBQlps&ULt}lwhg6fffh{m<W3>vQw>O`)nXd at c0b2TYi
> z6jV^`?)t81KJw<SZOB&^uR?xRP<e5PYgN(GpswNxfVlxSz?HdQ)ITT&jYLJ&L7$3W
> zx!R*3tT^9QUin>`P0}qS{Xo)fBrPDRCrO)08bZ=+l5QdC2a;|fX)Zy73Hq6!+q$8Q
> zYaU6rko5hF at 6tAsE+J_rNo`5mPSP-vJ|<}ZN!v)egruD$T|(0PB;8EXy9Bi*=tF`o
> z0hGyi?Rw!3sUH^E7*tmr=vr2^A*iL;$Mq2kt02xR^1uS?uz(w$i(KDBbg$UO^(zLH
> z6mN6QD(Z{Hdb=`cxUl%H>)ksWgYs~ngY#3xL9WR~_k-H+_}bF9r%y3Q1fR}V-r*Ou
> zwoB?;N*Ml&)-Fj`ODDgwwKM&FODkX5+9-M1(#CIVZI!%jQSwV$KT7VkeBnRCc~i?*
> zes1eGNdrEAXnlmbXZ%k%f6($A`MZ(|<PW!A#rY9_dTWCuw&gg#z4fGIJ<eTQgVBe}
> zU)8FVY-(A{Z*BFG%x_^HA1`TZ6TR-J!QghuR}3yfpr+*`8h(+~wG?6SC!Bx9qHiS4
> zEnWQb)+dtemInTp)@PE=mI{6+^2(Mw$lsAX!l1XUatyl9Z^U_0i-`ZQHC__c(!{^s
> z%9q at 2Il*^oEt2 at OY)3v^@(0t>%%9ilB)Rjx3k$SLKDE5#KWS}}RJFY4KWOcc{Dnbf
> zSmaa7XS|88cx7F9K9R^<-txa;&|M5V+*&V*hO`jUP3UKZes at 3oYar%t7yVz*$A1aL
> z{OclH`u3zhr`JJ!y+!h^eqPTx!#!VdHN19l%suyV3%#mVxcWA5H+p^Ha6CVAH+a40
> ztnqB&dU>^TmU_P9x_PzI)6=UD$Jz5e_Y~^GJegLmg;x;@9&s&Eu+dYF0y)PQ0ei1(
> z1f|@uUTvJYo+r6$y$*3Eqd`Bf0FIOA7H$>t1)giT>o+!WR(O8mhI)PEEc5(}>xaCx
> zXDjk`=-bZSj+~3<SM+_yIqg}&UF_At+3cxA{t0I*gMt-a`6$TeuJmf+tn<v}hInN`
> z_8zhmoJF1oxINHly5}ZtxYst$W8^=3t>P@%_+2`Wq;E(XK+;zvT};wel6sT0iJ<cc
> z`i7tZfHJ<GZ%ArR(q at u|k at OWwe<$f1k_K-0F5ODfXC&QD(lU~6A?aTvwI^vUNw;=O
> zk?)3XC+IVRF7nD^Agv<le3F)t)S9HvNE))C1JX}e<SW<TtA?}6vx^(#)yZ){-8zVW
> z_iV!g at 36poJS#YX09kt7;e=v<qt`2rndc!ac7*d0{R+LDIP<rC<^GO)3!D$}VqS6#
> zJzcq5wtaS_Ux+Y_xl+-aQ^gA%EzfY#R>X&z$gjKfQ%FPEa;dY1LJ~Swe!*pkA~RG~
> zE^*OS91As+-*lO!xD`4Q=Ytfo&^hufm!I%iQ+^P2iJ?7lK24E;e2j|`@*CwJa9$j0
> zD;K(KQoLY72gu7^PT=CK+zgF=3q3DC<`S!5hqB~9yWCV92pLz9=`ig6Sq#o_>4U+e
> zaX&(F6Af><Xeo|j at C}^HuxPT&V8!*&QS!qsvlYV7-tt73z6wETU*yLsc*yfy#$%4I
> zd>`iQ4jqW|6$+*!bh^C6g{!y}I!|8dGE-3+dPRQJ<&a`73TC++QCtkYF4uCI@$fnp
> zkht_zh(jmJFS+O`u7ysMi(GUt=w~d_Q*j$_LWVbX9nZrqlN70;{V`}J25ppIb_rL!
> z2>lh%SoFJvels8ZKOp9B7yXN%Kfi;RzfI&wzYn2Y8T;;T=e;Y}BATzqe`t!zdfnU@
> zf2FBD%dmOpiOlNVSuxEg<8L&b%HlO2j=$D)l*!uD93OwP>0s8r<|FisZFY;#YC4>?
> z84V6L9mz^<PDg<_>jDa5nyw&!C4MLFZ#ADmt}-jP`B;2O)0eEh%^%_`QU6!-z<61c
> zc9shACQUQ5cD>mXpV4$8>sWJQyrgM=Rs{0r(06b1KJ;bcv*HoF-XuWdgYk=-WLc-1
> z55%8p%0$7ncmWDBn$u8_mL+Q56TiRdY}V1{7myu>>{EP7Q%6<<8kIK<&N|er8~+>f
> zgPLc=pMCRPnnu#-ZfVvDf<_VaG(nHVXEA6LMbbSaO(SVENl%b8nxt1q8cWiHB#k2J
> zWs*jdH1XAUseq(6Ng7Ym+mOa*@d>)0ptlGb5zll>1th&m(s+{IBxwpscal^{(%U3G
> zN79=lJ^JbZq$jY5AS<#tGG5%2kd at HPkH3w&{SaSnI)()fVu8bW%Hk6Ny3l++{uug8
> zo1>Wc;-(MStTp~8G&F3U6ff)&WL-ue73c4odGUo!bF%ndr_AX`X7;YiIINldE#LiG
> z$tSy5WvTm(l6Q8A$`9_hN<J((s{G<EE~&MPRDN_nSn|bgm-3l=R!N)PX=SVXb)4^0
> zzIQ)g(qXqBpO2J0N1f80IgX1f%10=W+ucS%ONkU0C*7Zv)Y#Q454ayFIbzoz=QBz+
> zq0u(?IVI2Rw3R;Yhe~|yjFm6eii$oi-1)QtgFo4w!r*JT=PBFJuhnjkvJ8XUasD2Q
> z*4yn>zH^tBRM at 2`Yux!IO1qQFCye_^6o{4iD9E?V#GqXzcQGi}Jr3u8Dzn@#mz=Px
> zRaUt_D>-C$Mj7uut)$G3r3^rRi=C#j+I?in8oRTP-eG|+cE^=n?&&2}b}`DY?pI2_
> z+3m(485TLNY{8p&k2m%X&kDOs%2)0uFz1Yt$%XihT{WbskZPkL8x7Aq{<lRx24en^
> zsO;Yr{R5CW{lv^`){m at idnX!{4-vDvd_~igOt5%O*L0Dq^19gc-GuA2l=|ZFUB;pb
> zN&~TB*BFtBQd?})Wg;4-94t1br<S;+Yoy3fS&s$-M8?Xg;{M3 at R!%`)Uu1y1LDz8H
> z8;Nz1^H;7Ev%73WHp)Tb`CSW8A0STY8YMcbJcRsB(Jn@*bMv>Z at uG=Jb at 4A<6Gdjq
> zAt;!G#)HIj(b!0-hM=Kn92$@6dLkO2oGJdftFNdp@;$qHBR^iOkG#HetoXOCfg)|C
> zrq~xULuIgdQJ0x$fpQ!An2XLURm5ky&LY289NYEV&F|1(MNGGJDoOj1bQ(!#lGK=_
> zBS`uiNq;5jRFd{1=~R+VC+Q554j}0?l1?M()NZM=|LyP4-UQVos2W33b&~cXsToO)
> zNIHq6y-BJ`QZ<rllGKc(rX)2bsX9sLkW`bTnzw(3bRrfRryMGt+%--#M%hz5wu_Cr
> zfdDhpL~JZD3JVzGIiRaQL{r3ryVNn at XYsVIMWXpwY+hF!8eSJibeWzWr<{iSsW|r&
> zPw#RO?N#<VJ;8~7XhGCa3$qi(1J+mDnYbu|jDxDpO;#w at 8ZWP&XR=)GZR}LN*u+K=
> zZtPtBhl!J7tMRt#1&ql`#VX at 9)mFF&FkV)@%*0i(37<EZ1fY;x?S*rW at pcq=DlAZ-
> zZZZhxld8v=SSx-qo>T2>GE?yx=Q$=7=<}@lp2;>vgK>7XzsWsCxp82vt&wvfca#MN
> zyC~c-*beu>#w*cpjbfYemTJbzWEC!!VbcYQK;sqF^G!A>Rv24Xdzf$)>x_e|*P&ps
> z at p=@jS1iP!ttNk9kazWFoX<A?sd}l&6vZ&(h1G16*@~6MGpY+rwkX~iKS#by(Pq4;
> zy3(Xov3leREa0T at GUilUn=DjpH at 2_lm@HLnF}7x^EwPE0@#^XYCd=^3R^Yiw;cUF5
> z+6{wNVvxFttzrnI4v;pW;WIQ`Y50#tKL%p{P0_ at EDEcuF^M6H7^ivBauiNb~X5}5#
> z<)#gKT&u=W9EXO5T)jp+&VdHwZT)H{a;7!>##L{e!I|1HmD{Uv3TI}+WUgA{G|ub>
> zQ+m#7$mI at boXWY2`jL&M9D at cO<OgwvB0sHB6?s+eB;0E@^h0hthY4z!#C306$uVo-
> zaQ{F9*M_THmBtK?3<dFxiJaeFj_3AooW(J2n91$iIGSUM{6I7|YZ!~hlQ|~HsW#3*
> z<7wQ^#t|IthUwgijatb6#2t-%{{|K0RX9Bx#&hR1_Td;c1Oqk|u+`i_jrI&@6&m?8
> zia4VhB-~vnNNG65)p_|{I)bEzB%MIgQ6$wSsVPZ+CFyvQjv%QaNhgrhkfeH$1~p6|
> z=tzQ&BB*{N(=9b5>G;>*rK3qYjHD(c9YWGEBpppsO_H)nI+~=zNNPgTVI&<yQe%=1
> zX|xA)2tfxDbQnR6nAg)GorO*2aHcdEaeFk*=8SEa%hf>P9EkNBCt-nUSYRriBe>%s
> z8rsl{Ym5P`hEd$LjT|iI%sr2W2O5rXhjh;2=;Pi1=kptW=5iYaoH3m<%;|>~{E;;z
> zZ0+8qM(T}WgAE^Xr>nmXV}=>t;|^7S88&oe0e7H!a~R98k~>KKVc0;!C){c3RbhID
> zU0eh8YMhsFhp2xE8*W&P&-r1KP&ZpW8|UrZnaCR(zCu1V%o*na>bt^J3^Tdm>JP%U
> z8!pGWXV?k!;j6C=n`XF#8>N0fEYdKTJ6W at d2_M9M5z-5T2OIv0!Ho!%bM?^B!0<75
> zDhBK0d<Zt}Z>Z!BQ?Ch|V)%)xqMjQz+wcx|hWZ`ko4H2F8yVJP(37z77&KbF2<NA`
> zj_Pe;n+#=KRrTmFuHiRsu)25HR6`f;N#u_kF69nTXTrn8hMn7oVS#~$*<3C4w_&P=
> zrCc5L_AqV3rx;X=MY6dg at Fs@fl?}slieU#=Q~fRmeZ!#CFm=Q0khVa&1Pw#c?_21<
> z3}XIv5rMY+t03lI6q(acEtov>LamwFt6R%`3NLUC?jPf*7Ityx-~Y@}6du~PChs`M
> zzi=Pd@%~<pZ{ZHE>-}iXx<Ve;>3#&qqcDb^?uDDU_V;&i5>Ov<KZaw)6egn}iSs)O
> z{O{jF!7c6v1e^=6BKUwau`r4|>wX<)ePI>%S2XBV*pIvPelN~T<R9K2!&&<$pS$}0
> zehyO@$6a~<1jh&Y#b~^~@Fe>3IN``S+>b at y2=2N27dh62k=&sB=a4_m4Md(<U3dcp
> zH#o}*`CPC2B2HN0eaLn|_7``_{TfamG%~&4hqJw~2e%jnU4`Sgi~jsBT|m;KB;7*N
> zV<fdEX$(pKASs_?1?U2T9wq1&f*xf^I-jHhl7^7<7)dQjdX%JF?|qjBk~Ed1;Uv9G
> z(g2d4AgMD+50W&Hq^X>4XgEPr3A%)!%psDRlk_r47n3xVq+$0WA>EHfVmTWN4{(>?
> z-^JNnxQFX<{}9IuV$1tcSReum?7;IPckBJ55N2>04B!+V<NkKP3X8qwenme;;V7<o
> zMJ&e>_f|O9D~#u|nfnts0Tp}a(Ju>@dr!;FwO~#O=Q>>G^|RkAoaAtZr){4koZ^ra
> zHPk*;Xy$O0r)hshsPB-<>tnx9IL#r2H{Sl7a5~O=+MgAUaX8KEjn6|I_Mk3CI0)y4
> z_B)YJ<e4JRb!fzSfpCSxHJ*okj!@5m`IEN?7ZL{(G#Vwm>adTOXg^mt!eIvQqJ8Y8
> z*_<mo)m>y5e3_?<!E<rXvQI(7bG-ic`!P5f=V!6#4PFoXGs3A3yLsd6uL*y0h~eqj
> zM+$Y2H?u#5{3+fn%<1EB408?(d*R&HzF9buaZvC!+KYvb4tcx at _V<KY4*PjLdo~IT
> zd6D)a;bjL^-Y<@4us|wrko_g$Zw_MK0DGa((BUGlF9!XJMF!cQ$D25dH+BZk-8>U}
> ziBJoJCSVZPA%nL8(w`mv1WY6pqTd9k{}06c?V^7LwBr8-F at KL}9{sLhZ`-XCJ-ucJ
> z_0ZRHV|#0_W`$`@XHU^KW!=(p{blqp2i6cROZF)3`K)1DHtg}*OISZ?F^kzhYcFEy
> zXxY(opw at LZTib@!fCd`ccC5)-{wUbUnvQ}Y+CeA?VvoSRp;jnz{aMSkY}t#o4OzNc
> z6WA80->UVHZLD3uI)=Pd`z33z-ct4$Z7Y_F)&ll8Z6}sK^0UxaSIY%`7qeIlf=1f&
> z(0CEMM0*`;uGT_!4{cu*Y+(08!5FQrDA>ySMQbTrOFM+6s?`@V8^}hnXK4Sz+Kfh)
> z+J!82Ed at In`Q2Kt*|YV&ODB<ZB}sd0bwgJZbS^>d2+9m6=~9wTBI!z!_9p2{l1?Eh
> zhol-LT}@I`lCC6auMyv+{YdIXQWi-)NZOyEP6Rb1=(27ogMx0U7fD$p^&;sElDd*~
> z8c97!I*X)UBvl=;5K=2FGLNOFwVXXs+nm)$%Yr=;by^UcYTIIgMOeTF&voox08Q6o
> z*ed96qP3cBr_D^jX5-j<(D0VlU+if;=dnx?n5;d4wNYyg+g`hh)xYO_$Hm>>o=hXs
> zj*Y!k^T7UberI??L8X0JeoOe5f_D37`Rz=5!8iM-`ESCj3%=Ta$p04JR8V1Gk^eqC
> zx1htm66bFV+U)P;w}#i_b6b8H>Ymtt&40s$7Zens;C^^13gYu`;NrNwDF1c%{(>X+
> z at AD6YyWxCw{x&q)WWOxGB0Q+T&;DKhhVb7D$~jLIU$@sjsKemS at J|^0824`q-lJbf
> zcw at nH4E})gHZ0m0{#QYZ{qy{1;eQsqw(rV+68^D3Y5y^wsR(~s at Bjr5!izDeDL)s3
> z?%LO(QA)ur`}}-<_|Aft_P6rm!}AIb*>m!rhx-?7K|UaSL%}P1t9;k+oWd3?@Gbmn
> z!DsuD{FmXc3O?Ew<bMfo#-JBi<ZHn at yoolvu@*d^g%=i7+keKKJj{t_@@vB*A(cZK
> zgog9bFz^2VM)YGK=D!u)`(KFuJ5cx6k7KW*rH>9Mf)f?ep5hmYTSPC#ZsOfc;zZFt
> zagw<D*wpKd;y&WfiE~9?#Qnq{5+{jT#VX>q#5tl4v4*&Xo-A?S#NR|8#4Tu`BWe*(
> z5Emo=SUe8-J|YG3io{;HHxuU|Clk*Xw<mH$r^K4#!-=a=zd;<BI8(G$ya)MnqSfL7
> zH<{+dUqv6qKZ!pjP8You_e6mS8f%K{(YQ at K5WyLuPBiXFd?>0Ej}pI2)Dx8;|1 at zJ
> z^1q4;kS`FMiklPFM0w&t;_HxofGjc5NOVx_k3P#po5kAVpu{ZXkBV0&j=cFDI=&mq
> zh+mV`fTS-;I*Oz%B<)YqW|EF4>1&c2kn}Z4Cz7;@q&g&hNzz|P`kJI8ZhwakBWNi>
> z2Lj4yipxnloTP6_YDUr;k`5zjDM<&Cw3MVqB&{atSdx~L)P$s^Bpr179i$(zNT;}m
> zxHfT$=$m+m_-o>9)Tsgdi>RH!tM0%8AMmV990Acd at t=u5VZbc$OZ?y4VJvnu at faE=
> zi5(Nip6(R?g8K<L4-&shv=glm4?q3I!MXd}(}Iv&^~)E25E)M_k5nC8cGlRiJWjPo
> z**@b@<@*Mxl<hPgU!JHsqAbE#t$e5Iz_KJ`lk#1vj9J+pV`E%smF+d2QNCYQ2cKEx
> z=TLaTxIfM(m8GKKs_M at u@GZZK^D5&-<tJ3Pl>KF_Uf!g79OviDRaDK&)Qr!TC#mi&
> z(=yg9AFO)4?7Y#0XAv5DFXAycQneQbPsII at vR&x6M|DuyY0TZt;9 at T}J*=u-7H7;Z
> zPgb2-cEY%C`32S9WtWY6qhNfQ2n8b5u^2S4T#7+AjCFCovh0rW<nkKT?PVv8=a<*1
> z&Ms>(zEpl%^+=g2@*1j#%1#;IEN83Esffb at J5~FaMH!DSKdCybEZTTdIZyQ`%rPow
> z_TVBGuVOD=Ssb3ps?*96jC*3xYz*=(7pMk9Y6|IIG?b#@?8^U9^kX3A-w`SQC()0A
> z7!q}V0Xg;>|2jf#N^yac<<;7GZh19aTV?G)x5OH4TkYDAjWLaZwwbk_ZhLFIY}0Eu
> zx<%Ib+Fq~qbK6(5!S-hDAN0(s6}ZLLY_y$+`ZG0u*q*GlMc&4ik9=m06Y@@OV%*2o
> zE=P`S`@YtnaeGtK+xAASrduN#l+`x6?XIb}oq>YEHFs^LZ#TO|*Q~cqsr7J+stK~a
> zTI=t21dVUhZbf51+hpYS)VQJX1~+bvx$S{kZ at 09XCCD#w6Cxj7>w>(C?T*^bZntY(
> zZO_-50JagZo^Ho#)NLzjnXPVbYnpA7YTvrCP+(kp$L;Xj at 6uBw4JYYkl5$CUfTVwr
> zR6^3tBt1paaFSjoX*fv}NxF%kX9&tA=!tG9gMx19mHO{eAxY<xG?}CeNP2;!K_rbM
> z>2{I|NjjgT$t0am(qkkIA*q0*3kZ6Ipz{fOzTVrG$*f(EP26m+)rPw5tXXG!sdlZ~
> zeiYt at _(Y9A7TACVHsWdSb_F7S?JBnv4A at o6b$eB#iN#oMMrf#AD|ZvTce6c#`;$1&
> zt_^eRtjV>#@ZM{IQ}?&0N0o23Ja4=>Aw4#Fgy34toOE8auHYOKqm>>Lt;N3_qnExb
> zx`!Yu#vuJdw4Oj5GdDdldZ0iMGblX*=aLxh^b^rKf((4V68)RtT+FZOXK{Wc#uWKq
> z1kuPVqSxR&B)vJhr=Tb%C|wx6Suh9ZJ)@7J&%yNm(Q^f(WA>$AijEZ+#LURt%`- at 3
> zq!9x!c!VGsgJTi65i<}C2MMmmm|^fwIM>Fe8iMo~-SnN&vjit&dZwR={#B3?GdVp4
> z`CTy+ke?uk!ys`q8-onfGjaYgW>xyp=upA)nBM8HqPGh8F at fot(Pn~4F~^WUESMJ4
> zD}89Rlo1@?sfz{l1ZQK0rtgjJEw~jkJpD-Y5P=ATc3_dSF at y0YwDHPx@th?%6w@#L
> zJO=SGND<vfPyy*NNJpcgUbIxe-|-_L=5H4Xj_>~g5c98yy1#%NdrhA6`%kkpShmak
> z*sk2+M(a5mY;~@=5sOpEcH8Fq%LdLyb~u+~#BesSH*?n*ZRL2ew{e#m1#;ZjTj=S@
> z-pO?~+RQnH`Y at v{91FG+m*E&K<yfL%qmeBNY`MM&*t5+MG~<kA2XW^b4d<+759Urr
> zgMRD|u9HzKrwaK3qcYC=F&nunjJTXob{Kb=kw3=|d22LY%l5 at 0+c?{ib1 at 1*-$3qZ
> zqvf2%>;Ud&BNyZyxLc85!Cu0kU<qd>dn0$9(L7EFdoE;~AsfnFWHgY|1C6E|ec*(%
> z+qsWX at R|LLyJXCF={%Bpk~Dy%>q)wpq+3YpP121dokvhlf(8)O6Hvw+udrL{L((vk
> zt|#g5B=sa|;JEM7tt4GV((NQ&L((lI^(U!4N!>}hm87e>rO0<fR}pj(LEShS45af(
> zx`w3IBwa<)kZ}Q!a<NDV$Dh59yUHk(6T}YYI-qbJ#J?K_VSzv_uo=(g+(3vd+4H%f
> z7~sfW&owg|jK#FMAJMOnUBsO~HH7m!?k#XWgzdpKG<wcqwoGLfICg)3l5QJddUb(?
> zPpP5b@{S??A*B=j96L1qT}sFMxxDM|?^-&_Z$XE)|FY8Fey$zE{DVtJ``LF)@n2dx
> z2ImI;&ZX1+oI3RJxu0J+>Nb_C;C!zC7UaD<CLr(bHw5Q%N-h1YIzs&?mG<(R+HsV@
> z#YI0Q8a*k!>=)b->7QTP!>_PI;?I=-?7OU0*Jm*XFYi#tU_;yw_P0mFr5!{4w_~sa
> z&YiKSO~(j-$I`KW+>T%Utx8q>Hg%}^Z!1+pew4ot@;)7G%o*nAjyayCdN_CRA67cY
> zZ*~W>)!(voq2H7aQ~znD=lr&JB={Gh;891S|NPRce&0GKZ*ar{t{p1=t4mG%EIS7J
> zuPmMGx29t_293iaD*hb231_ at 9M?AS5zxkV&YG9Bl2D$sq>j;8$Hl&g0mx+F+-v0^2
> z{OzKD3iA4oAm(onb$|Uh_VSI;uk*U*DDJBaP8pdJ!dJT*+&Z!|q(dz*IB{(4rlV?4
> zgCj;ZghZ-64&FcVO~`Jw^5EE!jZDZswaVaKBOCE73l1CkSIB;~QE2dI$S$?6U?B>w
> zsC`7i(-1KV#3PGw-xPckxj)t7gZGS#45?MC2!1<qAL_G$StIL1)YX<D9~5G&_H4_s
> zku at PZ)bfINj;snftfoZ%9r{)TA4K0+wOr(ww;?<<-ZxS&<h)u- at ZOORLoT5pZKMJP
> zHNn?Va82!H at Uf9ELT;<&1mA;fKV;P-KZMk)-9V!~Ap_Lz25XMofV@?((a82K-=*J3
> zdYq*9yQO#|-Ov_-?jq=;;1mYZV<i1X(&Hq(PtxNg?IdYDN&h4%pQK+&dYq(%+rCQ`
> zBt1jYT#}w8sT|U`Sg;$~M9`B2RRlBL(laE at CFvQGejsTgNk5VFEJ@#y^bARJw(W&<
> z2NvO}l?0y}`6?tvtsppRWHahsK>Rgi4;I*m1 at _~4eq<p)AA at Bh^U%L8m_Kr7$Xhiz
> z6Wln`5)A``$B+E9fv5Hrfi7H}3l at w_4Eb42z9G_jQTMked*S7sE-}^5OuH0s4f5m#
> zrmcz^gCcpgX}h9&#4~xl=~qRE!2|hUrWJ~MgB*Fj=?BG2gGTuq)Au;PBd;>8Q`8#V
> z#phDRebn7CeTws!awZoAWd?01xT&~^i at l}^igyO*<PoNoifDs{INz#Ri$?2BH!JcD
> zR?34-Unm%Zjq<|Do%w$azhBse!EX(e7~F+>x%?&iy)np@%Q5&B&a1HK7lS|LHKrYk
> z2L^x1-<dvE+%YJTXPcHF|CNzHL%}nH&lr at WD8iseruT5MSAN0tl_JjIqWrz-QN<2}
> z26>ces6uXFDR)QS)4)Rh!PHk_YtZzd1`E_1Je4<?epI|S$d@;nzEm_CWMj}fEb>(T
> z8gHTsZ>$E-2L?6rcGF_aX~3MDidF;W0;F#sU5SR?XxQ-Ze<}Jg5c6L}cm8*x{{rg%
> z`f==ap7HTMy>!&%!e2B^>Q-nB$zGxvSl2^?*_ypqQ~&j_z5}zzYWAwr*65u*T2r%b
> zga#|ySW~r5OG7<-q^1fzO*A{}25V?$KSzVv8Y<bnHOC-7A-gZ~V>KotKe=u^?sYZI
> zkTcKTs5zi6T*E8dP;+Bl0O}WL?ymbuV_)`p<YP6Gv)R1|*9~VhdSuVk>{&NdLpS>u
> z6tK|PP*WR?RkLRyI7p)}8mrg6(qLz+YpT^v(HMvPFLhIqAFgSNylJ++=HR-YHRfi|
> z(3}UECS)FUsu~-z&CzF@#-8lCn)~aHAb(x+T%AVm at 6cWZ9ahJ5ODB_b2uamRszTB+
> zBppoBUL+kx(#a$pM$#T69YoUEBppK1o+KSc(n&ob1#~Jw4GB7npraU){z_6^lIoIl
> z1WBio)R3gJNNPw at Rg&tHv=2!~k(5PJLz2$usRn5eEYdf7qNYKeo<{%dX_|fNbWry*
> zz&$kvU;#!Q3uxkhu<Is4)K~Mjx|tX-P;*EfS7Rd<^R1Ji;a<(lb$v$k&F+c&-Z)>b
> zIkaxAMpE{#BYH2g>HhZgS}eO;mDrLHSyOQ#?M3CT$oh)&Y4XbC$hQ^Asdp+bMpjj1
> zq&=w=MrK!BOslNi9obxQHm#%bG!xl`i)WQ7ku4SH(#k4NNB&u{ABB;T4{`pnl7|98
> z+FvL*Ur~?qhmnyLnQ1pF|BTG3$Vs!uxo^cNG%|_YSg||JvT{~rUd8OR&6ROGt6vB&
> zJ$iN%gD<4zV{i at biz?5e-|4jHm3uHZ3Fk}-HkGE8R-TV+tk{><R+$-DSP_|4P#F_h
> zfP$*Z1QaBsy~d!*io+OmEV3NuM=IY&eyS);yIPqZxv%10+PliU$aNKa(pFX)BF|1+
> zQ7MVsTA`8lzWh8ExR~~^GA;6DMS7aD@=D~#iqy0U%xS<P51Gm{coivlW#{qSm)2D&
> zid10GI}AEsaWzc@=@&>X(J%lF-<AC{(T{<c9~M3SC!!w%F=_9*zknQjefslW<G03G
> z$-#rkNs_9RM1E`XJISq-7XFlE{;hMD5Acs9$4JsrqWSU3v69m%d-?q2{gTv_UHp^D
> z`{*f14weX0V)<)PACa<;e>3?q@)!8mkw20mL0%#`g!?PWQslDvkCWphcT$+w{8PzI
> zk_Tw;DOpW&F-3(x90gNTM)4Ca9+I3-;qjxAqa-OQ@%)1*$VB5)$w$z5Kc9!(g_Ip=
> zyi2ks<uw0V@@~oAlvLy|N at 9^epPYew2LEjGA<2o9EPixyE?}{My_85&8u;JPN6w^Z
> z at OLJwO2(p~Z?d68bn(0N21!qmbU#TGNqUW>`$&3>q=!g)gQTZOx}T({NP3H;har8<
> zk059wL2ncEl!WP)#$EU>jV0+hlJZEJOwv6hjVI|9k|vNemZaxM$|LDHl1fO*CutT*
> zlO=LMGYNW*pwSn01IlBt$qxR3<l~a0lnDN=<eiesC_Dl2?UXnyunP;s;(1yU2hsK9
> z8<HptxRjhIxtr32#p)#e(Qr!g7)e&<4*qT2-^6)s@(IcF6chfQ%xF9Mmrt6rCopPi
> z>y7<3S`W0axB1m?z4Z`_`8LD-7*Ffr^K5Mf`)#luVBu=>lb?<CU<;1TR6lp?5f;HV
> z`hM$h?qoB}FU)$Vg$q6}ww{8*Ier#6-)b`hc_Rxi<VRaO;(U{zhPA52WE-xZwRNz?
> z3!J~SK8ZfZ{c5bIS}1Iy{T5p9wCJ)i{lk0FPgctp_h2x1pv3|V-iW{|n-OTJZ{c7w
> z4TBAEJ`9`owQ#f<;<wg%k_BU<>i4_#91AO(nSNHtZ?G{&-q^w)gE-a`F=(uxGtP(F
> zIQwm}4zQSOqvF at YI@}_}X1iaL^)!oOn-j?MEuPx2{61P=vj|<n48a0}Ei7zw{Curd
> zEY{d)`E9k<wOEQlZdk;^Mh|ad7+%>BJSSOfwo&)9#Gnui8f~p<VFu|oNEK+<iH0F|
> zJ$?-Iw~New48;6%5&g?2dEoBi0`oh&P8&9y<T*B;5t=v1c^ZxPg%J(s_Wx9KS!mR7
> zooCRPB{Xix;Au6Agrgg- at kTUCgcBRY^c>S*$s5|3AuK}ult!^oz2N}zM;PG%6c{z`
> zLcuQH&j{!@L?QT5=+SVM7tr`z_)CM57mfxt4U>4o8m9^`As^LfARPBHl{c_aCY;(J
> z<qdAUC^SUAKN|niZ~=|434cXyNaGFkmGGJyPY8QAr1NGs9zs5zHxv1R4Y9~Gu|nO3
> zRNnZ;XyLSm&yZz6R>AAjSR`D6M!}6!gp(Vl at s6V)y+NPX<K=g$8cENRbS_EHkhC{R
> z#UwQ$X(~z88jk>amY{P9dX}IX3`x^SI)$WXNUBNFvm~AK`nz-{N%<uGm88c>I*X(i
> zNvcoM6q3#)DW9ajHg-e#1noo6a|C5nNqU^5{YlCv>9p7Bkjk*g4g4uQnWxiuOE{z9
> zCQlEA;~~~;yov=RSRez>6TCSP4QSZGn~DL$8_w`HH7c>#BVH!@MKlcLsdnBFYT{lU
> z=PnJWd47$<g|j-d7+X&F_ovUBl#@O$NZ63T&RmhHm$5xzY^F=*fDFfk(V31Jy)%|2
> zm}FXJ4$N>(=%2YPb3{gH!uZUknbR`t6DHt%c!pDgX{K}LP<-x{8HT#R1T~z`$_PS!
> zW9As-Ju`>n+$`bu%=wv2hG{~-%;}j2an7V>7NgPQgbSIWnK2oPgg%)MGDR6&fw9E(
> z+Td$TFnC2K3xnCX*UeaphW45I86g<V!MPI_U6?s6!zE#2CX+ciV}620W?-gD#?}NC
> z<V`X*Aip8g5Q9c!x?zq-!VsLhWDHH1nK?HzFk=CeV3#>Lb9%<F38yndGEZfcpx|ky
> zAj2vlBlBzKuOb&Luq;z8<NvgBuTfpwXB at y0hZmZvv+X=x$4rmMZI<<j^H!5%r>-Z#
> z%Q`g(;{B3HVq32xsdM%>5yXK6Qbmf0NL0kCSO at a2N)Qf3L<O{fG=SF at FMv?cAU9zT
> z53lBnZXWk4e}2E``99Alhgbg>|HTO-T)gY&nM)H`*CN+&7&ICdp)v({6Z7DW1;CTI
> zCTC7d at Pt7VVbChq6xT+Oz6a89$V-R3iKm_ik^j5sr$O1zfym2>dj5a>-1B}MaV0N*
> zb?mVN+%~<O&oXnkay^>AX7=UIgvQP~Wgg~I^!@x1^9XlLH~16gQ7%nS;*Xl-BzGJ?
> zq;i4!7yL1E4g{q0$IYEw6g2$PjDUv2d at MA?>IdO|9~TdGHRcc8Nxg~BGt;;dy&L*3
> za_{O1{3!DssQ2LA%`a!9>$~|w=4tM*zK3_22cUjC<fd__Avev;fVy}-nLzMSeGR|W
> z4B=9Bi;sqeNc|i%?B?R2A<q1qOV>~E38ss?53*w*%hkj9BC{BR+W67tSDd&07Sxa9
> z-1Mz8dZke)%|>Z9O0&!!Xb3`&BQyn}BpszuD9uJ`HcGQm8jaF_p)?((St!*}nvK%)
> zzP-|OC=Ekt21>(GdKRTFgziJ=S%jYJff8uwk!GMY45eWxJ%iFnl!l{pJ4(Y)>hetm
> z=^<Do*-Yln>AU!Y<{9pQo(O#>K&<m8VS%Htz%h7k)z1Scf=kp-L;hYaOMlFlz+#0u
> znE-)(xdD1)K(eVr!A`ii&RKdR-_JZ7aAX?(;CQw9>iea8J_xcL+0VG5{MBlg1C1(W
> zfz>K6h$&V4t*7z~BVU<kRmlEEu at Y=`%1e!V$|CC-oL^QJTHnj_jY9bQTX`e&5vv-`
> z>y%Aa1(7AA4H`1#H{fEd6(i3yPAZeF>+&RHDx7~N--4hj>r*+{2v7>FGC9XsrffLh
> z^3lB5f{&-dU_Zl#!4BN#DNA92MMjaL!Qdruz7Q7uz__FYT3zyb<Bl at Zx+xRmJ7u%=
> z9n?Qnf-F)Y2N_K;s90VLgFdn@!bP|;%&L{g7|F_XYrp(Q<G#XL>txONi*f at 7*v53l
> z*IFev8#QYKVF7=mS`n<r@^m9tnPb(-bBz)h)D4SND~sVxEQB`}2+#G#BW0FV33Kkl
> zoJ{#c<DfE`SPwuN0D&tZ at cx>Y7rhvWJSSTI(xU$aO~W4?|0J}}iWOh^vL0pPyL7TN
> zl*$k{(;X6_G$Iar=gykp)HQJcT`LWwN<|O4M(Ru55Z&lHsXtXEy5qB2d`j0#9 at Iz(
> zD3IK#R&fN>|CZ{4`fCyk^(<Wh_YcI0P&bo`5&O_#(kE1<xSWoJ{w#4D-6(}qOQ3$e
> zbey^=d(pQgPm1J<uh4g;H>omcXolcQ at hu2;qjI3|ku(^B`_sRaMpG?fKe|wQo5~eO
> z(j`!TTbu;-lc;;57i~-9sXTEy$UH!{mTr<(QfDD2O4>?&BZkpyp?->(MmusZv<;y{
> zdZ2{5gwmlXZ9%C!O20*^7fRbuIs~PcP&x#q9Vq=3N()dr6s7Gb9fH!!t9zv-2=zv2
> z4nju(l(<pFD18&94^a9#N=s1cjnW*HdZV-nrNdC#jnYvlZAPg#O7m9t1F0u0GMFkC
> z-=ObHuTn+gAo?Nn*#K^r`oIGH=~@EPN^vxO8AM&;SUML5G>Aj#aA`R#7DP{jKut`c
> zyMqT)?Qq`;=cf1?ogk%B#lZvp at yn-Q4}5K($H)cwWQp1$1ZmgF9JNDOr?nD6ZJqn6
> z_Jk}_9|&u-r{wSI6G74{NPzlG__NkU{8jQmSf;fRU$tFW0SBAZYtVRuXwWc4tAd6C
> zVJ<XysV+D-2&+C6ex at anEoy>L3+LtP76{rzO4SOXQ<Df$R|uE2t6LTaKMnYJ!}l<_
> zMc4p?m%zQOJ%hY1VU<=6gFE58jm#nHJz=@lLFTEY!VK*p307|i8#SA3goZ_0J~ZSD
> z3t*6>7QvuGvJ%dJubn1S)m?(8R!7FGiNY)`o>Zyj!VemO`pv>!t(Fw2vxN`WcfbNq
> z1Wjuq^VK?Gwf2}yQGXOfnBxbFXj(UcSJ4KqtOK5<0;e^Q^)P4_4DwRzg#jS_6G%HD
> z at FE1xTK7MQUJ&$RBJ$rwF9h- at _~p~rF-sc{X8j`bY7TS2In5^72bdP8k!`kDGJCrn
> zpU>@lCd}z#L+t`)httIBb|Dkxbh8n52@{Rai_G7gR(6Ly2Kr0cXuF<CgZeM+TBy%w
> zGoe1y$%Fe&<}B1*utS-hj=|oxiwRTjBtbwbGsx*+J?$CLAhB=TmnOtGPuOs~oZ0TQ
> zu)FOXXt)Q##mpWEj<U<3u8j?W;0R|BYub02NaqH79O_e at DyV<LWI%m}-OR)|MeNsh
> z1 at jHSb^z?IQ^PjcX^<1oQZ~8D3~)9>gC8@(xig_x`Us_oD7}f&B$VDoX*5bNpfm=h
> zk5HP3(witvL}?>R4V0E5Gzp;%2u<vP68qM;UTGCdQ&3ul(nBb%MCopncA_*MrBx_R
> zL1`IEQ&3ui(!D6HL+K%u-a}{#LMz5a0yG>JSsY^LGG924*?-tJv(0%1jYS}CV0Xd-
> z5wO4xc$&^F5Y;l-PB{!{XOf&<Y&|Si>-a<9O2*r%^A52a;JzNtGnxHPG&|C+^bU2k
> zTzF-|{C;k3fwNm{;(Ufvs|UXKhY4fG`%Ll~6L)Ypb;^DAmAIxs{eI)VEHLgfn)=-!
> QydL8-*2gVq+xxHo8>Dl%w*UYD
>
> delta 278544
> zc-oYFdwdgB_V}I2Bu&z^4SmozP5N#rw50_LgfwkK%0MaMDOMik<!hBiKtw at vL#I%%
> zA~IT8WHD-uMg4Z`ZnqRgoq|FH1aytEex0?lY`08YHwBbhBmJE_X-oa?@B90Fet%>#
> z_ug~QIrrRi&*R>ixzbwD-c_(KMp<GWuRi{4LUMdb6@^rs;f=B?$}wmTRSPzQ!M at a}
> z4Loblqp9MzpZr0cm}$F3Z(n+ISGkzaBE|}(ZA)+NoG9k|R`Gi^RXVAUQ%aeBibYi~
> z at jaU2>fd&FSwH1bN-Yecn?(a@((Lk<4x|qQR)=xQfjlYGI~l9`D3;E+;w|847OB>G
> z^H}=PtpGzm{+KtDrGMMN->1z?t*a9Az2UYE>QoMk^Ua#dJgc5rV$KaU;Cpbhm<6n~
> zX=5CjEDAXXs3%I9zEw;)m1RZY43~jz*C{a_+Frrkf)f7k<x;%HQ4pCy2%nbGJ9Rij
> zG<pbw`BJ7ycj3H8!6G__Q(E<Cu9PVc$}Ji=6nHs6v4aCIks8Xtb%_S8d^=7wNG*JI
> zXtHAsR`s(mF6s%rG at E05m6jBYesppcF-=DEwP=t at hHywUnv&{nVnMvk7VX;T`jhL1
> znC_b7+Qbgt`fD|VqOnTup#eCVS<({=!r0q*y#62t*Txb+q6nf0cET!X_OMjVA(+S?
> zgM5nytO_^-NM`6YGA^l)Pu0yy8!B5B2;G_ at Oo?8LEmAFGq at Kr_Kqggc5ts7&bQucr
> z->J(|+RgEmoB1m`YZCMBX%#_(Ei6LI0zv@(RSydJ6X_W$-WrxMW(FtJ8?74#2Z150
> z)8aeHKOUBNcT~-N%=g~EauoDH(4#~!k{&|%M5>GxLOJ6=yjW(|u#8yFQD&-ab^uRY
> zRW|E<I7 at LWVRG)pDr^IaYV)eH*)qhe01jBN0JGr_i-{-9tB>r)s_1=~K5|w}#R50(
> zd?={SxbQndia3g;?kVP%g(rs?u?p@}c^sbZsC&qxBu#bq3kt#-ORYPMyC*7)Z7lU>
> zuhVdPGE3d{g=bRrepCnuzjcBHaVASWQ|!^y?8{dBw9;{odfEt*zrj&*OV;42np%qC
> zy1YKX_AK;DA5flFpAR9!tKBY^!;A>>{Q>OA!ZvOdj95WP-}TCXl1rDHKF3*@g?bvK
> zW#o|GIZ!}WmpL?5Z;oG^XElVRiq)XRg;Hi4thia9cp{)QDOh56;BHR{l#9rEtWhgM
> z2d0qT9P&+q+B;?;YBKy!mogn(HV$E_dOs9RQs$4;DgD5Vp=C_HkUCIG?r{j|=GzC|
> z5<ph;8arIk+8&MqW3h4R&AM}Qx=ob4f`9?}9|!{*9|{^Sl?eO3<ygg~vQ*<NXqy at w
> zhzrzajw1^yrjZITFFWCWI=LS}Ah;~TLesY#GAmN^K<EZ2Jv;ROG(ei<5mAISD9w;E
> ztp at dUbExqWkq?m#)S3yQyO#zfrY;q$*}=h(9%c14^oY%`8N2kR1Go6DOB2NiE!u*b
> z(I1h3h;d4JNbX(=Y|(4(V(ATpHH*w9wZjPaWkX}YESh~vhAjtXvWO<t&ta+kb6`Pt
> z%Jmge=0rMjqhNyT!@^XXUY*A1 at hXl2jhQ4lDu?F<MEUsAo7 at sHpZiwG87fT^^F4-%
> z8zVPZHYBOM<79-kAiP&8mnxyu4XQQ<?q?0-0xdEUEm~y-4eG|Hy)-Bxfo7%5(_>j`
> z=?gV#N<(zbA%iUy%e^`oU?v&i(!J2k!2C@(WsqxUk5)X*7;%B19#xJU684-R6qjMn
> zf%*bXjJQIsuaYvsmRd^B8rwM~mkRQr%D$5+(5oG9f}ldVv{B;B1)y{(b3{;J^Ef3o
> z5XRQ#3W+TBd|oGNq&hKKRx<loEFWGst6ay>s1me5FBtK&cL2-U$STmC>tvFioy-YX
> zWlnI&RVQi?mCxDC3C~0W6Zf&yng<BbntyjXM?~qtnM9c87hU%S>q?>z(@_6)<F{gY
> z%~sXT+up0TAH0|Tw)Yyc1|Jj43hWo+OtL1Pp8zEX6uHcxV&R{Ii-LUvB#;GS0=@Sb
> zO*;E_HxgiaxNMl+oZwoS^9q#5li6nJRgG{(Yf?Ehyd1%k)4zqaK~@gf21W=cgxAH@
> zAcYoW4flI?afnM}sfqVI2P at x5^gQ_+xJ!e%5<ujK!9))Z{vs$uOCtqlmhx#i!S`?8
> z6O|St-wkMfbc)6{XVB&~{IEYd#-a87+ltT((KwMR&-Caxqj^kurYZa{-<!wJ>jXu3
> zh#d at k6~KU;GHYxlV!1TiS7}3<xTT0GX)EI_en2OtvFNT3;CDfGN8qCC`pt=VZx&&E
> zvLl<#6gsUw?Z7xjzvGBG$F>Z-ErG0b42<IpVyaK;dv#!(XdD4d0l+r^aPu(WK*|VQ
> z3URdXA3F4}9qva4V$*|(&~uT{w{f^HsUPkg9P9`kM<@__6 at XnMghC1E2!M8|y=|mj
> z`>Xb-p>|=UJ!*u}s8NJshTtxZz{L<ahYT1q3^<?;@?R$a=#3Fj^$1G!2&85Rve%qb
> zsULyVj6gy-0y=<#f#Pnrm>;}rcpQusDBz|A0QK(y$GBkBvf~fLxXD#1BQ^9;P3X|S
> zcIZE9=%27X6i>=!^-%o~X%2z at xUj`X6Xq0ATt3i99l1wDJCX<>fW6F>fe{P>MslS=
> zK>n?<@r%*mcd+tMf3Io%i2?#WFbxbN1Ix(3QPL8QAubU#+8`|%Fp+v#1LvU at oXdFy
> zOFddVV3wg_0o^;9V}KU8Up^srx`WgqZ3G0ue`Be|ubFfwCb5*;0&r(wL3;;E06(mg
> zMePusF6QVVPe~7ZN=+5i|H7j9ujIO7Qg`=va5tHwNx#<{SZeD(IuXRGl;Z@{Pm$}<
> zT(DI$R<Xztk;hWMxLN8SHWH6+xgevtgLM7t9{Ik6Eb(zm<ol_l>zQv^dQq!fo;JkF
> z^r3$fX+Qjnd{6u;_)(c0o%aXX#(-zqb46ByN0#1nZh<?;EqcS!n;41tWaMB?!L~ng
> zn5D<p$w-JFr9KW}(W?_>KPvP7&;Uz){T=*EEV}Uti>`ht!<I=TA=wHfK+oiwasoYb
> z28(Pp#QnoOK|mxeA-+|{G<fU018yp1PG^!T8=^oh$4w=Z!Y*e~<p)8OPiaR~_qma~
> zT9WrXpkV2{ekYT&k+gsef({AV)5aEnptgKYh+_+`1x2{RedNuOC7nTF_s*kw=-w3W
> zLvJ#R{;u#Qz(_UVK?ZLfl@<3l5GoH2n0}SvG+OnFvA2ChCskGZq$l7CpwhGI4|!L7
> z${eCogSU3edNxV6&{)2gHKt+((Gyumk@^+6ezJW3oqRt9>^L at spO_>bCJgf0g!x$$
> z0Q(%ke(voZoMB)oR=s^rtgsz0cyI_Qixu_d<~?V-`5g&4bGDijYd1>|N?WA|eN(0x
> z8V%;3YXMH$it|U;`c`q4;VcX1;?-h$d!`i)25yCSK#JfEg)CwT|6 at YI*gB7xUrnPv
> zS78$aK_S(laTQ8m at TSD7f`2r*3T;_~_|{lKPa>#}mEZ~!NEp+;vV(O!Y*QnLRCFu6
> zrI3lj8lRc(OiZS};J-+`GZwIm22bKK>K#;~(9*ZUg&4CIMqo`E?`Usg!S%ldlJ0DN
> z817zg2cK(Ix*qO|gu3H$>+j)CXx;>O2L_UZe!lWU*TZ6YyGjVN>S;fed!-3dt+<Tb
> zks2}8RVcSz`;WG3V(QanH7+GH3p7$M{lulSbiC3gFO7zB{#H_^-tpfUB5O<fA=KCf
> zD_P`=lZ}*?Uy?k|RO`no5N~c!yweP at EDie%<~M5(Va<QmlOzOJ1~s_O!?z_Hay?IR
> zMxfskdaXuJsp^sWjfjBP#MPR$dR>WLM=$f^qTT}Y8x_s`Kype7eVryP4GNd at gxZ`y
> zU>a%2jZ=g5e95?cDw at A<+(bGez#kYl!J#w9&oY%5qiC`GX?0D5{-b(JNmMS~r88 at 0
> z6*sZ{DpG>`lKlk`Iz1$_(g!e#T$%_>@%R5JFvZ_xfwhGC{Zu2>1UU}GCm_7Rak9^7
> zC5d|AlV-HckBnCpyftMq^%wr}lx%v<b9{5k{IrWO{6}F?tHpejj>$S(WDae=B0cBJ
> z6Es-EBEE=^GfZ8WiXdqe)b0{IWLda9V!m`06mc9@)f-r}y|ivO&LMfwr^!tg_Xj?R
> z{RY(nz03KuvE~4CW8Mj*#UT*AS)l(Gptyx^Hk97~XOOeDCXQCJDAMj_K30IYcoAzj
> zBTJ7R3<!-~FSJ3*dj)bmh^B(x$fjoyaaQ1atfgn(<7{ssz29k9q6n_rb_gN=4)ar~
> z&FHt7A#qh(Jxe{3Eq%#X8I$afywr(c2EMZzlqbXm)e6+oiMU*I4%8GVKb(co?_3pq
> zb(k2PFZvWh6d<sWT<I0aot0m~yet}){j5c#hVL|H(@H;o*_dYhjvyR7NDwwA4WYay
> zu7Ii7hqWxKevr>h%_w{r%3GmK{iyGwtB?>gOycEVta??>|0JQx;kTz6GnB(@t0s#J
> zJmI&QR^1`4 at Tv&DA4>TXspA!pN%Q{HB>Lu``0z9%mBAOJ#onJ&#R#Ds#npoCwc$E&
> zgL)yu8|kOrC-<+ZDN!j|>Slvid6t2^cX04cxKeXF8o%}a&7}LoDj at v1bP00hi9lLQ
> zYB-~G3CMqLEeI(PR|HOg+18kn{;<lI#<!(KJ2qjDx{cZkYjbYn`F at TH?0}$iN1%et
> zmB=<m_;TwFFkhSSLGzob%`Bo$c=Yo41R(O2JS|6tMkoM at uf1t);ITI?!v<(M)JAri
> z;;`UJB(-zz20x}CHfI*3DKeILK%-8V(d at j9Mx80H;FqN*YCx#!$;4&wI6a at T@oniT
> z4ndx}eIrvx;AhEGx08fAb3>{WgHG>%ODhD%r4VT8+&@!$nG$6>@+6Za<i?-+D40q;
> zV1D#}PN4cxF%|Hvu2KkLoFZr*XEl at U3y>mFhQ(L~vw!_2+}Z;t12pF$;@|kDCuDC|
> z8}&jPOLc$Bug at SBZeK>sd~?${A<Tvh`3y-zvO5fQJ3BSL`p(@jai93iWNm;2AAtzA
> zm!qW`8RBCCp(YSf!w~$B8L5uwzXULc%v2dmc7)`mCcA|iH9dyxl+gna+{P@`KV4!o
> zz`rrf#npn?)4i%8IHdTV>?4^T?5H=t at l|xyI#ld>yZxS)-*v3!EFHF%w at rB+yY`lu
> zCU)#Pl__M}H=sB>kJL?5aSlt(aXjtOxQaLft`sXcq*tJ=-WaewR8^E+fui9*!ldii
> zX<Fa0v!(E;twVs)u13lf-m!}$pk(t5caI`%auv2`)}t0phvBFyx(-nUey<FFY62mP
> zHS<prymS8k!cRB}e8`+{>`_>a)lDo0mp12qPdJnfO)Q-Tz}un5gS&-D!qS|-{O_!I
> zLuH6tNP%YRH=)OU(_ttx34;WRNEHi>YJg}74r@*`ky+`PuN=|l$FF~9dh+<s at C$H)
> zY5nnEtS+Sic-8IB0;Ge3S4_I&0n_2*fdfyr=#HE{YJl=Djg);2YBq%*|D|f3!)Jc{
> zO0DV1V{!0{CpeBJSX~i#6pj-n-LZJn;bZZ)aU4q^IKt6(Q~0q28Hx6*Xg)Q&M1B1`
> zufm)Fh1J<biC+#eoaCiti9^(Hdhl4BIpInz-<BQYNZ4yMjXRcbDwMcZ-&4LJ_}PIG
> zcmwY4V$2W7SReQ*+OEJLh}qx4KY{CY6&~s9INdU}quVv9k!qO~a1oIa`aO!Pk)~xG
> z^`Az#?r)#jGQXpYGjwFM+;2*PIR&a6yReeC<`^BD$Zo?*l_!i&!67{pu4)NHPuf+L
> zpP2JEgH~v$PDwKJTQ3u(hiS2xbFcSbrmyPkh0ONLwO7 at qWygQsTlHDu#gg{dyuX-p
> zuRIuRjbMVU$Ks$>cQJ>w65h<YUqvtdjJaqe75F2k5e6ILQVGhT;cezni at AC~QoE+h
> zb!6xdK;88J7`6~V<_CU?1M46MljhJ>NxUgHE2eS*I0*;_^#K}FZDlOQ9tM}TH8*W?
> zr8)PfxCV=U3{snt-nUs0c8Q1OVbMZ?IdN6eW$J2*U0*kN*>E+HK$xff6vto8O&(Lp
> zS#Cw>jaY38f4?%Y!>8qM<&HJ6SHV^zIe2*5tSPG!Ax|Ll9juWzlAvr#I$`QcBnpiw
> zdEcC*p6~MZ at v#n)_eMj!Y$6_-Y*RqA+-*)&cOS#YoSfm<j$@49`Ej(|OCcIDKF*zs
> zwAHFpMZ5HSh(FGnbJ%6qDTwDY!LyBEw?+KxtQ~0&bk>m#3>jyry1Ns1Iyuz2<2Z9p
> z7sN41M&c((-c=AJK?I%5&}o2{+(8!(5aB=>LBz-9r8u^dttn{==}rIWYvpPU6&U?M
> zi8<g at -c)xBicZQCC4EgSxNV<0)vRILZ}(7WeXZ}J;}n5^51C(7cULV&37;ec;Q`i<
> zbHs9jkt8qTe7R4muhl$V-3@)R&MWwiyx7ugs{y@$!5axFM1bb;KsSLHGh)g()S+rA
> zg!*a3l%1GnLy^UHq`bFfl4;qAlCM-Sf4T{o+3IdAIE~kwp0L}bs3Yc_*^ndoyo6XM
> zW8MaXu9=V=6&$o#hUp at M_Idd|6Vi&Z!4}(G*Tiz4mkc&INa}L}L52uUZ*cI5_t2Nq
> z-&4AZE|tjV9NiO=sUrT?gtSnZCanRQOZmKs=@Vs^%C0$`X&o<($Z!LZ;p|Q#mmww-
> zeXaNbVBpD#$-&tes?P`6DtzAd4}f*#2_H4A3Lx=0k>PRbJzC8A01=g_+JGjUR#a`W
> zWDiS!Hb}pHrC5F;!sb_}GP|6V+<Ub-XO5oqmT_l8j|dxv!ETd&KM9)GL$l#_bNfHN
> zpPe#bl{vo3Vl_}3VUj{dN{@-vd{usKs=E7^0%z)VB77HMk_Ahb$ilx at 7Je?jVnY0A
> zvD0%$#BMN=PQY$9XADYz2&6U$Lb}To^;QGDW`sT|Jpl9#1 at RF<`0c>Ci4f#x6->?=
> zHG}jk(6RyFOXkpW{kYm5Quoix5ti7)CSNk&TrjmLICDpRtzuR+j}-MrGP6YeMT2ES
> zI(iR*TB|yh2TQ6Mr1_wJqC$O%*B9nm)L#?H`|HSVsru5p)Ja7r?FqfTs1-|nt;gy2
> z6k;YpXnSFBP&C+|du9-K?>3kYpP0cvUYMA_;r!Sk-GF{Lo2(kpfnfiKgKOn&1%6%3
> zggD*dTg87^n3j>vr45N{n+(@73NG7KbZ~2R49eqmlTsY9M|O8)wiI><eF~QrY^~NC
> z?&>(917980#CRCjWHHqXVYZ-fJtC(5s32T<RmW5Z%c`T1qI0KH)qV;>v}fDhUl==8
> zAOJ`=Mvd<~5bRsGIV7VL4cGvX&gyi;42((lG6QyY at RwqCFkmIeG3rZ!69FXG<r4b}
> zQOF_w+$2N6x+-URgS#f13U84*>RTW_T5t>!ryM*RKu&`36~Lw1j=a(F(UBw2_9mZH
> zly}d%ss at 8=&k0okwNoy3$npZtZR2F?ZRttH-}Ywo&`v{d>VT(SH`rKSYuIGIdtK5H
> zv9Ol=3Az3-tif4?)V8rfQZ4rfi9t;o-&!;wKS`#f9HukC1Q%J=BC%Yi8ZxlV at 5Ehg
> z3eF%_NVUASIC(1Z30r=A+E2ArK%ZR!sv~70J!X5KvqnuRK^k!1p3+A_sJ+$`0Q+tL
> z`y+6a^f6ysoH*a#lu|-rq(^wh`#LVwUCL5lZGzCM)a`(L6B!18Q&$gtmF7 at SMz5Ni
> zDeW+aKC;h(7(C<(E#}a5ZQxR^;8K6{$UgpD@$#^5huXl0N!$4;lZAxl+7hIqIfGu0
> z4B}z%BKC3vlWv|49rRPOvI-zLHCPQ19zf<Hh_)0!D!Xav&AQEEKG$vDU3Sj=<~k3*
> zVv5Q3MnBGhY^}i at +Pp!mfXP#VX%C1MruFtm&7m9bGlffMWGng{iC&$C0ffJmV9XvJ
> zrzY|gYe1s4eD{>f_y>ux2u8V1Lr}4t7Od$n<1Kd>9jm$S%feNiDUYi)Cyc>ZBc__d
> zxizL%ZY{*bI__R*4Tsis(E8j^>wTBIq5Xc#22*0s<z5xZwxx&3xh<LTK!wv1q~fn5
> zdFAKLwj`u)EUrR$F|!yYexzacV?{m9Fj#d_>8Pi?3a8SUVSZpti at gZBu$$|4<^COA
> zjcBjO8CZM0{s&G>|AFaKT<&fe-|`?KdR^Jr{@>r%Y at k%9wKW^)sQxHvJ<if^P^4h3
> zH@&8THu}bU#vvtI%~IQ!c;fpNHJD~#)!*+MUrnQX?2n*q_hZfG25N=FkFtBiIn|I3
> zZiVXiL0a12h`jS({)tQ(l?UdjU#vhCcnnhDC{%>?Xd#Xyu7ug-oYs*7_FjfD=Tx<e
> zSs24~zNzka6+r?t{^iYn#icBZQjZoyQh7HxNQf3t)9}3j+g&AQ++bXN7QlB>ZHY0U
> z1?g0tbWu#(je=kVX at hz}G@#F^`i`p=Gb|PZYW%kG^O~*d&p_ZOCoYJbbun~eWF*UH
> zPffMXMPfO(TD1Ght$OW#d2h3hbBUQ89kdevvIrrt6lN~fV;U57CW)=3THNh>g4QGT
> z&_4a%spDhiIgD12uo12)Fz%U45u*9?Q_~y at vQphhCar=idr`?T!Sw(b4hQBqjsAvf
> z-1VoW_GaX7l-BpD5u(2E at A9jeS{z0r6x$%2ABr#tr;3~AoViwf58jF0VldnItcS+6
> zSHpuwlE5%ZG8%3N=PDpJoGvtn#(Z6Z!YKa^A>7XhI%&Ps>(Q7)wdq#9^6PSn+vKnF
> zh5^(S-Zd?eTF4)tcEmvtRS-nP9ZKuneQxE!lYXi}(M0*3P*%1UGSOJ)e)@!ZSsyYU
> zn$(zil^(E*3*Ch{yOC~CUDJpQXCdlgrWl9T6wpJST4r!545ErKDCYW^Y6UgJPx+sc
> z*2B>M)jBEopYBmg7g?(BrdNR?u)ehz{ABoT6sQkSaJ<^In(jNxKWO^11}dq!P<fos
> zol#Hi<J)FzidyIo^*g<jAk~e)7BIJ}pFZKIn6qGnE6h(#kcCD61bwbt*Kiz}e7{Dt
> zIt|sYq9}1WQ;Vkfb%KVNk6()Uv86`kpgA$-Yu;3vn=4Jj0xXfs9P&4K=~I7$Jj~?Z
> zgH=*H?lx=YS*6o$;gZFKUT^02mBx&h=Z>x=;=CRz4?K(O_S!Fm4+lze`)|!T)q4J7
> zX(?sl^_D~>F|0a%qGjCJnC=p!q#_k~4EG%&;(v-<`PG(GlP{alu6_k6^&5~Dyk9<O
> ztJbgW)B1|=>~d74jz(C0Jq)XG4*0}B3=N6;=0|BgFIcj2Iy+KbTdt}1(CuYS)UDVK
> zO1er%p;*_SSn79$UTx4$nl;r)yuNH~!QJ0OcBBw3(wzZMpwb)<L$$Tdma<Ix*PA0#
> z at K|$vb(QafwkopWJ~7g?m0waeo-*+};Q9gIT4to4=P#BOLJeI$o`S)Z$5MagZRJMl
> z41ZsFN}5R;@0~L-DsNd=1(9_La#DgBHKTSEj_$a&lSLDc at Nbl-jW-F#nwF3>JiASI
> z=yA#9w0V-f at iiriaYRKp98?nJtMdL+fB8D<VSYtLn&VA~EXr;##!KN~y1<!n7MYg8
> zsWB%+&f=^k2CRm~S;iQU?)B4HaNCd(eNDDpx2D$ZJf?GZAUzhz!P*N|$8;P;O70FQ
> z&Fl;XM;k9~q!CUO!VWuo%6nCCpClD}7_V}_H6u|oppXV})&PxHvea{aA!J0pi+GDQ
> z!(km&b06ddC*5?t(b9}{a7W=R3uuG|Wi#$Sveeb1fiCh$5ptmr=@@6(OU`wo$iWX`
> zrs;1S#Rc#FD%u!?rU;C?fTg5&xH8`Y_msUxAI1-`)aIk3C~kK^Bxoa^Suu`~=DxM?
> zL!@&p3apcAWWo+`U*JTgSuk3ilnTaMBifLj`m&2b8>lZ%#{>~dD>wrQJbVlGrur~b
> zgmggSIb?Kxi3*)xKp5k47vL-wE!!!(=tG=Nq73}nnUkqM^9N^64Y>#)g0zwUYGzWL
> zlv;1>xpH-s6+wR_E0+(qO(1I at d0_Ee;jOmRn)WNwE51BoK8aayhG(u<i?iK-<W^ZN
> z)rJ9 at rS|Xl9)q|i1haS*tOz4mmJpbaY%;X{1 at dr;<>6eaiKEo;|1YfaVHVw2#tXLO
> zd=6AV+o^-LP~U=@I2s_(mmf2r?2maBaD5yh^u?`kkCM=zJ%iU(rqfsJ`AL=A=DNYR
> zwqkAnGq~2Qjht2D(y4v#f{YMFj={<gL^SULE8JaT2-7sbZ`PFc?k(R_*7PhXH)L5Y
> z%CCuyZY(IL_H7au@&lELQ7zF7o>I57Q|F7*Z=kNa3nUMpJ!_mp>iM;zKCd0EsLw0j
> z4VvVk6F%7o-XKPqobI6_bjMlUZJ(q4!JIQM9X!sf(566lNE`Q3dgS~U*|NQ-&O09D
> z7dE6}8SG&HQ_ at DR5`oc~5)f(*(8&<o4ECp^DDVP$80S7 at g|SW7rte|p5y8r9dbYek
> zzlp3rOY|Xx6^#?cg(O50SMoYG{_b2^mzu3nVRv4m+8uZo=;+Eob9+i#1xqdaHx|I7
> z<pvda-dccKDnsoQ%iSil5+`0%gY{2rt7uPQspUCXI2Caln#XKbV(t+31$Z{Te+aw4
> zrLstW=1(Ws-Bf52Cs<unocYDwdHj+&(~Wjt6-k#tD$QbM!1bCyVjt8ZRzL(4XAT9Z
> zKhDXIO_FwCD(LHbqI<Pml{vA&B<<k)=VZ*2+sLjM*&4woJ5u_b&Qxjp`Am at I&|qYi
> zX30a@?bYFKPuQq>c9bBxeBbd8R;86~hrUG at LPtT(4nje1;a9!q3=4?#KD1q0YDdT}
> z&EPLq#XH`Gc>hj_VRZ0+7x32=C<}6jPfFWy_xS|khezS6333?3)t<to!m7H5MG*^6
> zYZ(OwGvH+erLRa1_InAwv-1K*e4@|Uk#c4<ugilxP4R{iGQVPX#i+r)>??9V3aB~=
> za`zUv`_!a+CYe7lcX|Hp9xJaYuG4rY!R0jk3RkV%BD2e<R~O8B|1BI6I6>y<?07O0
> z`0{^nwrWU<|A}n%?XmNRs>hFFpzMF`Q$DKCkJWc12X*NL=u#Uf-)?+F%*2|2;Ix>3
> zvn`3AJueYl<vsJ#BDRB?r=Sfe{X!CiBiH!@^O7BZBP%fdXC&_df1XIZ`g>i&`}Cfn
> zw3*<ip9lN`z8CKzNi&RCAlQFSKc$7f=|Tt&u}7f<&L)`z^)p8M8q`wF4_+sH5Ny~W
> zXr=cBH3M-3*tSp0kv>#BEFPZnpAFG+!++Mt4cDus_xT6x1rEnWoQZ98F{X%Hb$rZK
> z;MJT_zCXzsxpIhb$^Cm|hi2&hD3{7raI56|w?WTBa2aSC<#<y*v!q=WSg3Qp6Y4&D
> zEKfSqQHr9_BYjR(fqsJ)q6awRG9#i`YN^v-=PGW>pCTy9-Y<BaxBQC0jzGDy!e7_7
> z178O16a2Jjg&1)4g^{Jm8y3VQ%l90DBql0s30RMd*XZjCm@>CKnUBw(pdpKAJy|?_
> z>--{$<1f$8iMfq$@BbIR1q<d<&+ at JX<EeM~a|?>7clR$GPj&No3p0`v{ggcghxs=7
> z3R&vTF3=3^h)MJF>lY^J?|cO+BZn*P41aK8mSg)V1zCXq!^GJB7ZX!C+Qgt{tgLCF
> zCZI)_Jog;}vzlpH9IfjLAFR|b#F=DM0nY|$HuOix6brnOmfGk@{TiHk{*>Hmi-hLK
> z1VPHhxpjjwP&U74QQ`Dg0<(IeorY`9>T764^+L4DSus31{Gom&4ufAf{32ki at wi(E
> z85veBFD#0Qm<@F!<F{|-uPibrEcp^D^})(h%-*gSHh5|5hUNy|v^ZnF3+CC at RxV}X
> zlP3L<&meA9N!zQ}pd}YZOJ>oq1iWFl7ct;?3)<F^Hd!_&OnHAW^M71i;COfOW#Oul
> z98JAz#{x^eGvE&3otJAZ1*U{Psy)U1e$yq+1yU#-?Xv7bd+C4`h>*!S0qgBVpu)cc
> ze at iR}WEgfo4bq6Q=i{;VQXI=tOXiNAZ at V97UZbJ+l+#fvYpn_o9^cyqV?8ai5yo#`
> zlAjz49ikyo2R}z at -}%B{2Yzwv(UoS+e1;d6#LQh8I2kDOJ7F<iCi#z_BC7!AoJJfD
> z5ptVnyj93BI22N{_03O2>QR)RB9Eyo-sUQ<QI~1{Y3)@t7vfwzi>00{=2P#SkOoFa
> z9Zym;yw<D1t3Hk(W=NevTqdpy8YX_ at ovC#0>wMFl6CA|4Rd7|Dp-m}PkYMnq&pBhv
> zNu-G6kv6&xG5S|gx_%SNAZ_0ZR)pq6Dv*w)j{Vd~S at kLmsZuN~zU;ONGQ^n%Vi^tR
> zf|l_Dd5(@cw%@ghqXFg-_gT*1qlPU*M=6(jU!M~UO&Loq`UgzFhh(b?I)svLpEZ%|
> zSuH`h at D+&-Ix;BHSzEDc=owZd=95hWA~hijCivT+ZTbE|a{A1oWQ%;*n(kZ1zp*rV
> z{&qQaw7aZLPj;!LKX<8ukA~pS#C$MK6NQL2C1>EO#0no38G*GN1 at TK#n-aKd^AyXN
> z(QlT?5%bGjxA}JqTll!UCWQSYXhxJGn_qBO7L~+5epgy-D%rliO(Dop(ow$suB<z5
> z>w49Y6&QmaM%wC4sGf}FSN34;?Vy2=tjSMVLgezPe7#^M*Naa1`l4K~=WA=m=I&ZQ
> zL~!t5TfJj at 8N&3fE5TVg|0j;j(%`>-!&03sysM_r!7|a9>M#UZd|)F<*jak~Tf<`B
> z0b=H08nW%)=)+SX*9q}cC<T*ee~Z1LzgnKv!R0B(FEguYh1$2p&R~O|qZzEPLA at jE
> zXMP?XjrHD8KjT(~dxntoG0;%UuedutHp#aQ_m)3`HdSw=zX8UJ1SL7l<@es5R at Bp{
> zFo$kSYAk6m*wb;jly*ofk(Axm8V=XW)(Gh{(Ry9!2^~(a=I`UL+?|#9mp+=KT6KL2
> zHz at EYe&W!MHUXV%se{j4mgeZdl>6ZpD{V)_Jx{q93L&`9R~3BPfvh8~PfQKMy9-~g
> zlH0%gRr`0t?XJ+*Ez)N)#I;{RT$3SYm1m$$&6{0OZ_Stf{IOD8-n=<d&wG}=2)eU&
> z`D7}YKe+s`s^c9pOy0a=cJ%pxy#g898GAJLNH%)`y5)P1KeXa5>R$fG74KWl?Lpuk
> zNNiDq<c-8T{R%-#@}POokYS#G#!pL6f^~!YbDPQalcVzWQ at Pc~-&kp&cdh5g))r;x
> zoCaZ7|EwUpHoJcB8uFG2pk0qch*Ci?y}mY~=4>a)=AgKNrT+Y1qwE2Lvt>YZZ(|<~
> z5Onq_9P(>j%6I at cE)q)pjC5{*kqqDjN0!n2<NW2?d at 7BPTs3*}oq>;F(e4hEzg$Nv
> zklwxtLE4snTaV7sQAqFAxXriwFF^eERmrjn^$-=h5OI4r3kvwQRk1NmB=)+!H~}&f
> zl;G=C$@AYMPp8-m1x9|R{e(P1bkA30oIj`dww13#n>ggV0<oH*HN3T0j-624W8P at 8
> z3vd-CT=&uF3D<qZ&t9Dd)4G23%!s|_oCPMV6|-=6Q<=o_Csr?{8u_tnvZ!9(yk^}@
> zE#q=dbK97GD6em)<aP_R9Vfp|(-<dF0=^UHT;F}8;fGz)<sU+R*x|1~TKc0i`WdW<
> zxqumR=q?fb0ls%lmT at -ja%seQz<rsRCe7vy;yfqZyC#WgO%`0~yTBK$jfwidK=Di0
> zj&r<xvJTS<tmiB~LqiDS at p$_hT+)%^EO*joc43P>3KukM{*HP}+8u|AFV|izZthz|
> zVTCZ_s~1)^KP;Bp@?gR!6dmX~d8651vH(&49rZiw%lChzcZa*#rU=Q0ZIGW9aJ4s_
> zVg|O{plUP<mDizeRM)5vNaD&WgN5;i)R#3EK20?U-j6s-^(#ohl`Ud0?a{%N5;PFt
> zsc|Y!>R8F5yrTA%m<HQp>~o$C#{#~5X0$0?bB%(Sb||4iMx=geOwSI8ewK52=1|BH
> zuemKBGn_G@)$(5)j9=3fE>w^R#S>J9mm!93T2~a|9zDSkZvN7`!pcv)N&+c-0P**G
> z<b6h53EB5*@`B)*Ti{mb241c%LTe$_=_X0ouh_BxTlWrGc>6ucpc3ov$<}_H>>Z0g
> zl--Q$o;1fldv5fG5PM+NqZa9v+hNhd&46Mpu7vJ{$u5>U^9ixP^4X8Uylq?3z=x+b
> z5FDoqD%Un2=dNa{*<&Cyd)vMVx17HYj at LzYvs{YXD`+8Z-az(%V8xm1=|%gH?oZ|S
> zCR3AH&In%kJ+6$rsKwQ?bcP}z>^1hJ^(qKC!obj>lhyBZ8h<Hd2Yagd=kD8-yfW}1
> zhiVQeW=J355b23&Q4Er1kmE9znv3}K`yY0Mxfl8B+>7-P6S|j3|8n2yo6}b2`y$}1
> ziBpW7X4Io;X?g>BG9=~So(OP1%GS+rRkc1MebTxG?wHm`15Q~4&H#l^a<$i;hd=IF
> z-5U;g=eQRG?j<trJEeaSEC%bZF+1c+os621Q7c;?kqK-80{<K8C4l-i+ry}r{U_6g
> z{2|O+{s-&BnEB@)$aE|XyaFBLrWtk6QD=}|XQ?@Nd&Wr11SNQ`;?~JtMQiaNejx9>
> z%{ksW1*Z8Gx$`R!In~K5Dcy^Jm_2|2k5<N$sxur~3w1LBc<419gkL$lyQjQ2#Ql)_
> zE%*1(Rwl!TIdI*y)W%?!b%&Y{^#GZvBi+jJ3DV79*PG_vY=0H$mhA(F`DjfX6An3_
> zrY6py?bqO(qboT#OFe4B-CmmOcK_M^BSd`ay1~~U^(&69B#*;AI`LL%-~^En{yR?V
> zr=*Xh2kQnwQv9EPGnNYF&;2G|S<Mb!d4-pLli(P4c9-*1;efr3A?K|elCG02CEpjE
> zr9Fi_O^$cGZS7A8oFXmmlD$livR5(Y0uFPREYhQ&YxGon4GM`3_8~pEGI#&$(|*65
> zrM3h-iSDV5T at BqYv_asYge>B3u#D9#ii+@(J(E+wW2nYY;T$?0Q{qB?|AQ0q8IRdd
> zH*W#aoF;>yrogJtm;T;0!KHZp2Er%=xe$%^Aw}~PmU=V5fB)dv+>}Onym4f_WVA3=
> z`2lVBc6%CD+lz3hy at H%YrYz<sK9n4 at U5EvQF|L#D&3+0b_zkSsxqR(IvD6*>)`tvZ
> zE%pC7zdM%ltq+YYpZ(kaY?{4()YQKkRFgxXCex-2!vZ&{`wWL3gt|0>CO0MdKhdOU
> zhtbr;(IEjuG%e+iylwrW;uKflRgl-KXRTmKPB_b)hBM(KnQ;}^r-kwsUvTG3us at 3!
> z-*^1^^@)^)m)2L#`G0t;p%Q{p(MZVxrQ+dIM+%fCkNB_czcof#zynb7;Zun3AseDB
> z(saJ<w^`J3{?c!=VwTqpM(dG|oT&#4xQnD-;&MKE!vttA->@)k=}^mM+$CBsFz(GP
> zC0R+`88YZ97F8thog0ifZhbBOhDFwW-VmTg;X61KDZi6I?5Wd8 at M7UYJdBinxHR?#
> z4zU`dCHbkA5Oe(E8&L9z)%?<jlhfSpqpeT7kDiDSmy;vCMwLAZse^}lUPwt=mjQnV
> z9xkWX`}waQo<mjg*&B`VQ>;ia2+7zc`B1wIf9p&o1SL1WdgJ7jjpZmQG#cSVlg at Lm
> zCq~YjUh+G^FG27Xeh1&NvEaV;2Fr#d0~nU6&66Oxq2Bx_r+^e?p*O;<vZo=n`zA}-
> zP73PbFnZA?oE3bq7bIeF7qI9>4H>P?pnS_`6PH(wu_zHj3&q25wTp*s1yFwmc(2|R
> z8$aB-NN$}!s`bfHt&8Q>1*2M9HziXM{JBk!QkQw_=9$#H{GQE=9jP37JsX9MBLj;*
> z(EdRm^{G;R?U&AcPR>5kAdMP1LtFHnb<9pTc(hl=<!x3Pp=3x7FA4FG;g2DwoRH;5
> zLY5x|wIY<qfOU>U^Kev+TB!gW7QC887bbeO(nea36KnJiih<R^kaSqu2y^f_jc_tF
> zB`wl(s7tXFVp~A<$?HG*ojw1!I+BMh3XpvtcL#Yzv>%AQP~_j?-oRP7RYdSF<oWAv
> zC|-XQhxAdL<vI=N^ie_ at AQWIeZvsT3JcA+ZWa<eYXK`=9t2u?-5HZvMF}U=Opz|x+
> zW|pJv8h^d}sC$aF0AZGT;u}74%aq8y`^jtAJ*RqOY<^AB(wjT)<7>90%-lzOaWF*R
> zrG~7UlOvTbLD7?XoBzdXvOk4wAjmGTaw^O72*`O<i~{FD-k!m~za_O`aWvUK_r`kS
> zq$bEl#{MI{7m|2lcPCCVO}_!I%ev<F>E_~SUjJx3W#n at o9cSu&f^5tCo%ma_8{!EY
> z0Wt))cENnGjWH173=aNP(1TshVh6u at 4JKMCt>?K%C&ZI!ehpW0s|km`lkPIE%fd4{
> z-%0+=qe<$|dWqxwG>8BG(fFCO1QmI^7?PST{Trp!Y6V&+ZPX+DwR{y_lWVq8(NKFr
> zv|06!6xb2H%$&1WuojH{KwRN2Xx<3g=isZhCOQPtW;Klcmsl;@U}X!wH=*=z^8WLv
> za-Uc&=hNh!wM+7AWt$-zvO_kM$|+!${2a{DTiF~kCmt^@L2s%#RAQ(@HQAJ+Kemyo
> zQ8NSP(Bq2;KC2-%T&(Wb)gWlo at I6~IW{l$8y`lM!bP;--r9RkQvyV=2-{A&lwS1?~
> zOkS{wtpai84L`uYIFHouvmTr5fRV-iMqB|A-?Bvr2|}b-cR>#liU^J&IL6p*Fp3cO
> zqvR}WyT&!SY6BW0Z3OFwoIeuk&YQ$4Os?aQDg5JT_(hTRnXZPEGJ!LKO$m43bWdWb
> zigj`cEQ}kRWJMKLImnCuJ)cUcp2(nqY5KP}cyx}mJLP|>sVDe(fS&hZa at 16!yWpn^
> za<KZ2?ScyWkxdTjH6Bc764%}GC{`Ug)56N|Zn7|1G+wyAILTc=Or85h2-hBE2XBQ1
> zPt_awZI6$25b1tBtYp+l%wPeMpAh$ZZt8A9)|G1>3)bM&YtEm%PUH#0CQdCY=zYNx
> z27EtBlPR;?tY=U-c_ym_=W4+k=vpViHQXMJnARzn at -^FwP`K|sca=U0MY<`y0!4{7
> z$C#6d8Y3XHk9%v9kHaRG+GG}OF(;8SMnDK_e`37KA*A%nk6Voh-D*7%#u+U%M|;M-
> zP+h%%qC^{44l(+d-UMqTw6E_9ZOZdRy->|ne58k|DhCz$(i>`n5T#Mi*{bZ8UT`rM
> zoC?7j|ID_jjJ%6}W?QcM;6tr<K;rTjKCrE_$OlGl89DBxqi}en9wi1 at BonpqrOr@~
> z64IqG>G_r^kQ#<dHs4c{h2OG0i at J|LyggpALE6Z_vptDkqT?@ZPYF%kOZU*dv1BAX
> z{X}8>T5?i3 at QL5ag#d}CIMlg^V^|bBp09c$KE;iY^9rbX7=!Q_n0E#4X6!iXBJ+!a
> z9Sr<~=bp%j-3sEj1}DyIVR%Rp4W at CPdwJmrW5~VuwD|~7?tNkgwUy6&GDAtG`7Pf5
> zWNbvz?FZ6e5;4E!$x_E at tes|1lXFw8J_aT&3Wv6qNuTNK5KK3OG54{Q<zGmF!h}%B
> z at K&NU6eb(rBybYcOf`hUVdTYAZxl=_*+&Xv2mkvC^7#<bA}x_VgD__{DuQ~-@^SOj
> zhHmds*<n?1hR77G=8GK((+;hyrqM4pWSGk!v<$4M-Zia89U8_NI2xDXRoKZ=2lsfH
> zdW1b*MLo?4&;8LHUxB1=_y))L&?(X>$P#_#oF(V at _Z<mwyPpDd_qV5T#x|~G3{o>n
> z#~@4XKFs?asWqp22pxnd?9q at 0bNuq8MxE6FE5DjhRfmxmXUfA#n?%0Ipd<&nPj`_r
> zXSha at XSCYOYYcP<sc)F((Rm}G&gOfce-O{0l>8gmsLX*#OvzuwF>~_0>NchX#UVlE
> zr at 2%qAKRpxja^<Jd5;1Dm~LSldHv{Wc+jc5a2XrirB!+q-Rf{p16#4m8}3*52&G$m
> zfwO4L%c7Mrpio>}lTC++%cWj^voke2Q0^?V=|Oz8_+BUC&^4!jM@=oQnz$zIkfk<G
> zh1G54<aHrlaHb^#3O6FEe7?!UG=BR+zqgN^4*6+!i0_mAJJQyHG!=8rId|&tJ$N_g
> z5>1xq0~WLP_=DteN`Kw?lz*o8rhq$528&)>64Hz;eiNFFOo-9O=}o$4rh8Rzo#s`*
> zb*jJ4tHElV+g8U?FSUCWz}BRRw8_sm>?ow3<KNj)mS!gNr~Do$dLU|U7IUS)`ci!F
> z`?5b}s#asgCkmgLA6GZlVY>FQa$;24q3TEqA_LL-`mUZ6)z_#P0RNc5_$52qvAqhT
> z^6DMP(%xIO!J@#uyRdT^Xtn<Dmfq=>=duxb)Je2TvtWg3M()*=!5cPII##2me+b_9
> z&++^lJpXWgh?<sx_}04QoIgkxydQHz&&uA}?^Vw`i8RCIrAfpgUr<ZmNcsGYy0kfj
> zgas+lFo9{odoq7 at gB~J}>!7ktW=(}!$|sL$fbD(8&Y(QdPGmJG=LKJX!z!PGU(Kb(
> zK7Lho*>IJKW>83=D>|B7C0 at e(A<mekF4>nr*Bqc0jOxEfT;O3zZwPV>kns)P`h~y3
> zrH#N&7zNt`u;~OA@{S<vC4OT49Z`|6Xv_W10iBb&w!>L*qfRpLTk9uNv-sBf9O_Q~
> zQhiPa%wtHBIcKR=et+8}o%b*`_fbm7R=;(Ikaf2dQ5*Qoohk7zw5LV8 at V)H{{XXh|
> zbl%@^O+5gyzqE&6u`_RNVO`)<V5a<*LBq(44+Qx)fPC}tV~Jo@^gZjY>PEFo(2ns=
> z^57d&gfe?p2V2R*CvrO&iKPO0_(VF-f4?)%L2YO-aNuijNNWUfs0YuH>x(t=RX$>P
> zaW}ahI?gCi788Xse`<ug9GK5&DIG{;Nf}iImf-VsFE}YeL>+6+xr>pR$bpgV<_rVM
> zYZ_?}>DQ40*GxahA%DGJ?XTPgR&orgKu6F*^oI2Bn>%jSML&a8gcvsu&}XxB!HvL2
> z0c%g{F9pbgbiIn6dKgpi6#yWnxeJJ;^XGO=b$oV{gUPyz$p?4n_`kGOLS%?oD)&NP
> z2(G+G-=OD|eY<>L<B*?poobx*Q+VLRfTgFLNEu)LzvBLa;Kuiofw&-ysUPn&)S$Rx
> z4h>{WU*TGqncx%i1hyv<fS<#4_*F5}n;N|j(b8vpQ^Ud;a<g`Vyt<pk%z<dhP=`G+
> z=KCv9i6WCW$1l4=?5}p3SWU`YZllhev+RnsKs#Mr!DsF+4*KY2yAxxdm0r7~;1u2v
> zX{Yq`MTPuS9qqI5dv_P`!tNM{3ui7%!xY)dbM5RYzpALoW<tnI$}IJKi8s6^TM=e6
> zfR!|&d+QCvfI^hzb{f2Ny;1tBlrQi0&8*&!lqA`TJm;F$6WW^{G<17rNh`@Gkuoh7
> zokjlX5K)Ys@#F~+LgB at lY5i(!gDLO_1VXew3{XXo?+DZlx{l*}zyKEpTL9*OR|*LG
> z5qW|FR{lDE-=6rHMJ&ZfV!_J*yT1<zWY}bPr{~1gu-lVDr-Pi&kquNbE#}`<ARJN>
> zeGt;8oe56j5x?6r-jT15M&UJTg$CB~Cso*@Bs2%-5U&&v2()YWk&ipFT8?#GE=fN~
> zOZlz^jmDM*IGcDU@?6L3r*T)$<se-S2Puamc at FP|S<E5cw*(!geec^1^!BgvITv16
> zZ;a*<%~;S&eA81Uj-4XJuj%Cd%N=g{G?8j34hT#Ea(O=k5;G|Qg at 8FqVyU_#SP+<H
> zw-7ygpkYVNIW^DW?ZJWCd6b7Wpez at yhOl?UYWp9sj(h{ashyS{o$hza-vCJ08{|i%
> zj)QCE=Qir8FZmUX$x)>cRm4RrP&N~V^T^4@^|k!o#@M?qLtPFz9pu0{4y=cg7J|=A
> z6E*JfmOG?xO3+3cWEfPS!NCfzGN?+8=dmidByqRXcvW5mU|?iD51UG4#NTR+O*8np
> z5qgvS^}&1TavhdR8I0nHkK;?8w$a=#Jbt>!G0?*VpE at K@mCC4|fbn0H4QZ}4aHtGI
> zXMKYTQuR2{Ql0dTFNJ)=jG&Re>!Gg>GnXl!EL)rg+|{KLl;U#6j$%I at WkbVfn{)0~
> z54rX%^c+S5jMK(X+8Yn1xoYpsl;C9V1E>doNdpr$u$O8g=gN9dF`0J0ZST~Tonke_
> zdXa)g`fG`P91RxKMjqA!_4&s4PcEx!t)SpCaiy$GkXhF`$-|>)A7om}f0p+u{+WJt
> zl<m+p04)JOfOnC{lFYk-#;j*%Q0Mub&rFXgW%eP+*(~=E2P-ctom9$y at l1}R6pT!4
> zHIL%!4c>%Px1<3u%26X?-r0F%Sp0oW!2J<PR)fwKaN+tM<yHM{`e9?h;AG?bkrnI7
> z)7h|WlS`OfS`I;CtM&_H$!29^h%g4{4$xv1MD7Nx;h)^6opiuOzNrwgAADn1z~WnF
> ze-^8KE%@)`Y--tN^VDTqu|`byt!gTRS^??~@bBzP(8J=<@1Rk^4(_C$L%!GeEBh*<
> zmP1fl7jOZWYR-TV>XlyPr#(Ay?DAsy&_sbB7~s4)r*b)+d3=M3fAZOh`mlqra;9 at b
> zpW|9y#UFn*E-v(&w$t``I1wMQr{H*dK29JB;hLNLch4GV-xs`oe{?jIdjg&sq*NcS
> z>`A=}aSITevfmh60XZ&%PkR*uf9HhDJy#=%k;~2C*Y6)ouX%&txj$tNdG at g!Z0zZJ
> zgH+m}0j_5Vxi0hDJKH`2vQgMgwwcHllXM2i)Pei6!+NanJ!a82W4qp2<|}oXr=>+3
> zq%*vKe_SpAZIZt!@u|y9y5w94oEE|ZWDm3g3*=c=6b<W7?OVnd at C6Q89F=$(zGr{~
> zF3#X25=OUKvC94uhWz-Bvp_!w=;yYb1%AfkBV-6`V40KC7f34WaA*ydL#!IR0*Ck4
> zfT4}_%_T3A_>M}YlDkGv)gV1pR~?D|2&3cl&)^(=1Rf7eWJ-?ffIzqSBQ$7XAe<zF
> zpCk`aBUV5Swj-)c+KO|e2c^TlX=o9}p?sW!N^$PdQj+T9LoBtrM=C{jYDd)yOH5k@
> zR_RybJl_{kM<DIc1EA47oEPi?@aM at VL70yMXKET8bfkRvdAf~}EOmp#N%-daw)>94
> z_^dGc!+|r^b?8nq=A5zp8L%eOgO7xkN2xb)E8c44R<^3g2$*W!6OA#Y$5<=9Cw(gI
> z<HBK#V_oL{1Q=C{?<kQd;M+pvMwk<qL#UeNa+p2Z5rreFu#!xIU5^qZTbotNLV7e#
> zpMs--H9bm!yO`VLTQn|nGkQxm#41Y&WPcbqLrjDxG>Db#rV-3yInL_8-<Ky^AtjxM
> zg_<}jTq+ep`I_hdL>2MjO|er~^w0Dty)pge!q48RqD?yHiQtT!k~|Rpy1)Mpzmq({
> z3b;1l%IgpmNGtj$cnjIVU+&{qG{ydgBTufPG at K`vdqMlCae%>HHwbhRIr$TM%L&As
> zAOvUd>O~u~0qHLMEUf?>S(YfQ@~W`G3v0(q;~Y%MPsw+KF*V9>erY+)u$1`jrmXmV
> z{o09RmOrNlBLe@=dv*3SoFJu1S-jx|dxEUh6_8zP at x4T^XCW%G4wGYAe$NX<p|5a;
> zMs;g>r%w7a?|I<?-Q<U{wrwU$so(G&;mrr8IMP1>tuF+vpVamV)`H#_y<N>xwXboM
> z?~3mOnAu78C=}NgDY at FBeIH1!y1{<6JmcfMRenWJc(2Mg3ra<GgWk}Q={*2EEd!oH
> z#d6=3M!&DLExe)U=>qAQ-I;BX)6yCdM6aO)<1}S at Ba&Qv|A8t;?MobWXtQrF(I)uC
> zlI@?iQ}X6d3QlrUIL-GrVoxV$w9Uj?-xqD+9Vwvrg`o74K<SIoN?b%<_yX?p-IG9n
> zA$vvR5b8fm_Dup+915HbR5=ZTo~}jOp3kqwjPOfNm-&;wi_9l_ITQ5q9M=tNv%F0$
> zR^Y6GWo=<McYz_2b~)XMe1vuQ9Gqtk<{64NLihs;8S*Abaw<r2TH6JX<Mg-fq;};=
> z-hMDvGu^L%m8X_0{Dy-@$JH?xa1ycFLJgp<tHThxE1OFEobT#^N~Cwr=qkSkydgi>
> zka0+9K}nc1w9ePxLLsu5IBb6gTR0;`FkqdK8L4hCM^kVa{sYj%zN^GU_?b%yZL`2c
> ztU&4?AcZczs}G`6-xtt25zM!2EubS-9ZlhkHx$ruEl2t5m}soP8uu*F)U%D>)@)^t
> z`W2oCf(THQ!1}B7h76Sou?lDVz6hKPP at JL989apMSG<_)=p+wpk?rq(k9{p92oN8^
> zYJ3inm~}t;*>|KyJ%;JO|EEm%Mp!k4kV9Jgob2FNDyN~35)xgC*X2GJBglGUim?Kw
> z=tJ^|7oCog`x2x*TCtpAFxf<kfS~3VuX<?Zk@>53fYu$cyBxQcy at n{SqTb at nbr%Ye
> z90kNfV1R0fH+sEkb-Rw~^vGG)sRJ}Ry`I`3eb&QNU!#`R?RtmQg*VVpTYO9>ebzvc
> z7 at sNuw!+_<My|4X-AC?f&|oMTl1eR=%21ByVKM0Cs_+pN^8;sgSQ6pZ0yIb%96EJX
> z)c{Z6Qsxrky{Tj)tY=K`xZAdJ1w&pL=uZM^_7FDuJM7VjU<wl#%B+V1Nsi&M3PPG_
> zZvv-O4|n8m9g1}vCl=VFBJs>XYkiqFB8ZqN!a9H<CkFE|%M at ZAgremz6&5mbh`t8{
> z*K1sqqQA<D9$Uqt#Ceczbde7jC5FS@@!{{nFpB=^AlG)9!CIWlfv3!N^iPr}b{d&j
> z2btNwM&fRm*&JVyejoaUBtG!p>zYnJt1Giw(!AAc7 at GAkQs?@4XwDZjcMi|EYa2MN
> zX!k76!VdoQGRW-lQM0}ftg%g84(YHCT<{L`DhmHA*&}e&{c}<8Qdzi*eUCLzXdg8L
> z_>Cts2P4(W$hP$t4p>0A1`y>8>9b=x3uN|WrPU3R!*p)}pe*T{0M}yDuL|KI+aZ0%
> zq+uO-2cW@%j8riU#g2+l`0zs}D9Qnb8HD-MY@%+`XLW-O6mV72Nw|C-gv3DUdFe9<
> z$)gEs$na))N3>=I8QCH{dtfa{K*u!)pBR)iOVO_z(XFomY945Wjsx#EYw%WEppv{d
> z4R%W*^3+RlF&F?Ad&}(`V0IC*kn>Mr20!to2^ABa2F at sGhNhvBJn4;DZ-Qt8%Q^;G
> zs2%!wIJ$Wf*w{$0uTdR?EVUd^3t=NHHu8sFx^n{L)#70Z@@%-KOBv$f9=dld7zPXO
> zYC_U<mbT0j7><@^dP97dc!Mh~G~YKH<f!qLNPfQB6}QOt1WP4Ok<Z=*j%qECA4%1c
> zuM at IV();pMQE+#R?Crw;pWz>@R?^!nRaNIMfFS_f%!>qO<|lwDouzDZ`FC82j{7D?
> zMsBJ%eyp(UBhPal-zt#nBji*F()YiCF;tN&LrU)mB&9!3aMigzOnZp*WJic}o_u5v
> zYJTrgwug{+XFEd7Z?-pZ!c0M7CA+cYaR%})ZwV%oJF-LPi6wXZf|tkA%^Ua!Ud~FH
> z1!UBHRC|a;@6z3>?8qVjE~O_t*oAL<d1~Uvz}OF at +^;5W{RHi?eg#3!Gp}S%BOf&u
> z)VDurOgP3G@*WH);O=^((?()H-?+#>VDeq8DDrqMF;?$C#^3WwwnOfodAmFKLlt at P
> zKJsB_rgz*>{YEjrJ*!J)-XHle{5E)%=GAbwI&uSNgq5Ld&#E`Te`H6<?G~8 at 5K=^%
> z-{~h003q}JYoqZ!<Riv5y(VR;9`EBUR)<CNt(0xb<6b09#v8$=rw+QFwOTY+r0gNk
> z{h&DaKus_C1hteMd=K3eZhuaGjQKnk*ui&M53_6yB3n72FFq?d@)-UmQR!J@^8k{g
> zsl?z%tk-;PHE8R_1?l8t%Oe###cEPAC2<GMIZ#ue-7T(=4)JZT=Fbg&xj_KPegXr~
> zmEr<Vfk|h7?y_*O;Hm-(Uiu}cX*+k&m;CFGXmGXcU~A%K;VJ`>zuP-jdY8{@PDn6b
> zI`|ln=?5}v#TDe~htjhyi__ at S^0m#0cL71mn&WEG(4gvc21nevFZd5N&jJ(2fthA7
> zUa?j~Xnyd!(ZM<>7l_r;a#Fsv9cVOL3qmJ}E4-7S<qrPy<_Tdze9s=!LyeUWe=Vsb
> z*j211-x?aYgl(LGd@&gUp5PrOUmY?Y4^BvZGiNbRT_ad6p$dNWYxxfOlje8)m-J<$
> zu?h(h!&@1_&oyhR<QIwMPxsvZ5;sgni2Mob$E8dNfwiMlSivEfM#?t{TDOsJGT)wX
> zsM#L;5;w^5&vO4Kq|Avdsy`$bo|H0)vJGUAk8%^l|A)1A4{xf<8piiNIZ2aV(+f~&
> zOOv+r0;RN2pg>I1Hk1ZyiGYe7#3Fb{t&~AjhV0OTRz*Y((}PZB0%E|C!H#dmdKpat
> zC0s^v#yE@;Ma0^kcuBcv#Yn%kPSR4H_xqmb_dLHplCv-C?7jAFUG~{~Edbjms4wNB
> z%}&Lp1KOl9yGJRu_ZPVxqjPth=aQKolp#aCJ|}+2CbdBfx-%TP0xx7M#!n-bZ_zFv
> z#vsI_;cUpCFl6Iav2Kf2>*Xzeqhdat7YflnYg`OcG26gv?+N^+GQ=z7@^5#kK)11=
> z5o$f&(Z>UTRQ}beo{{0>IYH;(Ayn+=%K75X-Pw*uS?2!F1I;$h^o(yLo-GoL`^)7=
> z1I<2deX0s168TYK?Edn=Us)!=Jnajg#&n{kXV1uxVaGw{fks;*)?3s4lR!b5U~giE
> z*4i#z_}qT<PC!#Rod{})D at 2rCF}peD&mZ}#cvGzKj99ZLbH-Mf9yu at _Hd`%;d2+sD
> zSA=I@^p29}{`PzltB{#%=Fq7l*Pc-ma$wr6wHgwu!ZX-47`OWChF1rR@)_~Wo@}~Y
> z)Vx?yo+d2Cb1RTPdB1}-GZ%DANT?NZe5s20&T3_IA5v#)hTuLQOso7_T>WD9wRN4O
> z<+MQcAb+HYOdY9vIn at 39FkCPW%i at xDK<Ff}mX>d;cGX&o6Wy5aU-Ax`#9P#I*l!4A
> zNUml&%F%?g7jGfqVXClITgGfOHC`aX(g-S<5tN^ZR8nI#Bqa^26ywSMI_zSQ^exKM
> zxUT}Hwx#@N((+ESqbs~7-X`wGuIcXkL3EtD{lV_6o)VG$WdyxRZ2gNd`D{;$OSh4N
> zy1e=f?Txq5Q6BN=UyP1IoN^%ly=|i-+K`o5yCLsQ+ra<au9$F37yh(IXQQ@#7^>H)
> zvIMdZl+cJp__O{>B-MarDPZ|rgzyZ;w<|RC0 at _!EcyW>o$c_paxGroi43^`EDIrD(
> z at F)CmOW?<0HR9Tr at TA$Um$GS==zZyf5%Z5|T+=L|&;Tj0 at Ktyj`<7U7 at 7@ghzIb$R
> zzV^w|vQe-g4~v)fmN<&b8W<V0On-|7t>UoT{FSx0Dtqt)mp>16;U+os-HL8i-Ffo1
> zJXgNYrDI(}wR!X{YyH{G;LVih`scYO<7AasClPX9X4vBQd4O2uQ^EfVC>wO at _cVeU
> z%IpD=^Vv at FqLXQ+`7BC-B>=Qlut9OBy|W_4<*_;bZ2aJ{Oy3<XboIs!q3IG&|22(z
> z#n4~#9H-FW723zRd at mHc084|ig02#wMnP^Qmc}ed1SH0CQPvsp&!Lh+VOuaZvOm#R
> z8h&?K3cOpTyqor$cR^kn(Gh-kuyKxX>z1V|#n3so`Vu3><P4#py;6)>Wo*Yg^+L|V
> zMv?%cr7|;aIfVz^y5-?bWO;%`xHED%#D!YNFPAHq>0^Ffy?NA?>cjZms-Tf2mc5)g
> zB3ZHg1JVr0`}#AUp15shd55^-<pNqLw!WNAi^Vryz7GEN?Ki^zUF|QFEc8zbHn+Xb
> zG<~Yp&FAR_PCgyl8L|e2zV-WWKHq$l7v5n9U|PC_&o|5yPRrkmmcLbU?IBV4+wU`n
> z5v^9@)hh<ui_D{!ThV|oFz3`)uF+vyxj8yxxp?m at qenE@Rm5OVCKh)Tq)+Qx9~9(G
> zV%sZejy-%ao!pVhtzulAipvgCD5qAK?a%hcbbnoUo_h|2{5m^voG`^dl at S<+eXhVP
> zRA5FaFi(K6TUVc2tnDa=RjS7G2)?L}a$L6~FC)u==cQrqE*7fc-GmNDb)y3}>&?35
> z%dL7%*k=NMSIZj)+#*y0aM)ITMUb{vw?FC64r<QABH`wBlq*AC5sdd|hr_{Uh$SHX
> z4sHl^1yz0Oj+_12!^+zzSfRYCNO?E>y1=~Q1uFeIo}F%=0|jOc<>&{i!o#b<#G#l4
> zVo8HBF}A~Si_qzxG_2;W0<1G{`G2)UTX&xN|GOou!fC*kMB4Rexawd_$3S}=a;KIk
> zsAf|~rlZuSW;#4b6=j7XY#&x*n=(k2|Ef^~HA??oqx?m<?;^1ehBsDbR~p+&BmE4`
> zl{{kMs~L`&!)o0n%=Ks2akPFYrCn)xY<DlzI}aw59Vb*P=qyi+9QI!4FeuY-sK*C}
> zL3yxrukP1v8eaWzqy~8BvQ8v*VX!M>+*_<Px`5e~5yp|?_D`VW#G?IZbJ)H=Z^pPV
> zU0Hrop(>|?^n+QyDTM?2{Dv|p at nPbLs###1*uH<H<EL-D3Cab-vF&s4#QCKtPr{{?
> zu*A0ftWPr(zJR1CFb?;-^`8aCnMdEs3$uZ;uE$2)8mr9GvhMCAo?&$l!4kX1t{*tj
> zT5}}v%7PD4T=2Z!ITb=ifKB5Bm2V8F>2ZBDl`zG!cD>dR!eYew*Nl!izg}2M`!asp
> zzTQ%$m!NIobs%KP1$x|Q%kyWYs7R8)V|hMfq^H6YTNC8uO*Z=365oj5Ou)gM`+Qo5
> z(z+DEh9Ecqzn+<RIw}|k|Ch`UWeE1>=k{!{*hL^)WsugSw7Y~w^~L$KymxnGdQ5y3
> z(;b=tR5u^AsrYKUHcOU+6u(K`YB(Ra+u$FEh=%hyJwRWj`z_E5zXIYB=)Yh(gfNV_
> zuQOvrL`=k<;geYm$StD-4~nNdr(g4U-A)pv42K0hUYH+BT4iOV+Fj<E79J$DX&w&2
> z{ER~f91C}`0lvaHIq2+*V^M6bKgVmp>m-2>#O1HwFwPz(jasWh8e7;Ne=amT%}VG(
> zR2FgTF_0ymemx^|0n^B(@S6;>odzZ1h)tnmp?RRR?Ge-8D48Uq`vquGA-fH49k$2&
> z$3;dyzTMis0k|e~I$*p7FrF$mh-=@-P7ad@%}`s%KwDpV<En{+Et~$^mhI0Bs{O{`
> z`i{&#b*qO}oo|-sis^4Im?~N}lVtlcVyzh%xOrGl!Nd)H5UK!eD`Fut+-BW$bHUAe
> zao3wOY#6g)5B!qt&*w^+dU2mKu{Sns^D+WGZ!n*fGHv&*z47dk at ORHh{&kAwqTIK}
> z(eYyKTiL*v8{ZnOp2%wa3&c%tRnKpI*z at D=*Uiha>fJNVs;nF9 at 1Qa0rbamJulx}N
> zsP+mr#~1g0LfCc9pxc_Dv%LZsTs69~@n<Vu<19Oxg;@MDBIf?RWJDXDG1$?3iN|||
> zP9u4qL_yAqzh6t+#JB&R7WJXvG3#z!A)fyGB>JJKf4fnujO)n2YO&?*f{ATm(-SV0
> zy at 43;`$X%e*3CyXru3(*=9yQe_%cj|o8z6;0x^%Vn8eTCp3A+oO&tHuAL$LE=benq
> z8)_Rsyo^Gda$$!`&J~IixiQfFaq_>#&^zO9ydR{DF5fw{OQGm at Aoa4-S9C?x316B!
> zq%i_D&U(zl`|CI2rFhSvBOk#Mm~+l4&~^|>gjil=Drn_Ho>?~o9F*LJiW!Kc<S$1R
> zA-i%%bG5-R8)$r9&>1-Hsz^yB)0!W7Jqc4GJe|0R>h)xdb*4bPtXdE0gv}s83vhcE
> z at Xxam-7R8DR{@<Un!7UTRpOGaQI7hylF$Jg9p7jhc%{%ro*S#!UVjo6#`R3Ya^>s$
> zs|3%Z&LQ`7ByiAe+1O<n%f|}jvV-K1C{ju|;VHCV{@4GY(>fbz`<WSVM=db<lI~KD
> zjSOUYwf&h_`p9>_TB|qmdQu@?=t||<J`v*&OrS4|GY at 26SL&~{4g3u>mlqy}f?k4I
> zo`SC^R at ATe#Y5T-JQJe$^okmm(=T|?f62gk;fzlsoDn=QOkXg(s9y|S`^td at 6Ue~Z
> zHsYG-QJm0ONi6dlZ3DZ$MS}-8kf6X=b{qssK>)t!-~`p)z<F`;!3;;EkOOSy0nnwb
> zQ0ra at -%YZaRi91rK|(APh};OzVwi3D&_oQEDq&6umnmVD5;iH}cqMF6!cj`ts)S>e
> za1Dkp#VO(1OYtN-h2+bPm&$y2qPPZ#uGL1J*Nd at -CS@+&m|jLX4j4>~FKG}xfndl+
> zr(4DPLwVW%WI7;oIwW%;kBrNs5*CMx7&t=o_RWsd(AZsv#&fGKi6;)tbF at KU(9nU9
> zC9v9Qv9Dql_k(!vA<Tr)ROPLU+z<LIVKN&C&n&<sG&sdWCB9KM&iI at sDV$1U1mb=W
> z#>V4~bw6mMaewovy&8dr({Mu%;3l;49yN=`BQ!ss!R1uMIm%ZpB;*$}SH8->-BTK}
> z at G!4o2<`l>M6cY94sUsQ-uor6+CCdZbe^TUccTGMGMkLI7Lyy$o))hr`V<~o{jNQQ
> z<;yGNcNvxcAipdBVJ38^{1l4<dQ-}x!o3pS4hdO=(@rttJ$=Tjxbxz_i8PRZ*Ei58
> zJO^99h7SsWpJ|gg_dP?7=_wFk)TY=T(eq7FcH!cqpf2xRSO$y1q9&XVRsK$K(|aSc
> zOiy`v1?&X8yV<J>Oz<8<^PA{q=BaV!2|E{x- at RwhLL}Eb0p9uUz3j}nXzd7?j9t)l
> zl%J#i?2r at kPq_d`Q{hvm#Nxxiyp)uRmaZ3Z^M{3701Da25JODF6^F-bcP<njHK#$L
> z+YhJb?5x4<A2jJ8(EZ8|sySvyVYOaoT%_M{7PtQHj1 at mSoMXa{_umZNQ7IYsXCA6~
> zcTUl=tg`p5)<#PDoRurnsp2QC%&uY?$e)<bS#`1b+<MzU`<<fMTkcp;c5AwpX_K~-
> zSm<J{JQ-L-8LlyNb5 at zcVGo2al+VoEYWhAj^FG&GMM>qW>XOLvqU5YLcs4MLDe>uf
> z=7)FGEDkzJuR5^Uq<eavFHP~}S+;FP`@8e?Y`~v`P%X5z!ZiBndDtO9 at nana)bNNq
> z%I&chsj{B)&M+-~dY(YAfHKuKZ4u0@)_6~{{8_zL9d8>rKhYBh>TEW<g*{^a-HsZ8
> z{^a%X%GZMP3M}u at Ku^^uC-eM8(SRsV;*{REZkzG!{gC<v#stG2#nx{Yu&K32Qj4<M
> zAp9J#ol|<kVwI9cdSak~Gd4`JkX_Twy4%`XYy6eIvC8h{fg{-t%%Qs;u#6IJfZScJ
> zC;gSsf*BjBWpmC*C~bydv8Y<&0i!q=t$g$7JFNiMQKo;ED>FWh7FhU=74`X1-z#_w
> z)eWk+DobIDMcG+x2TV>Q^9ZMFSFtGzpJxem&*N7Ygm*w;Z{encFKVHRsk}VI5BV$M
> z->Xd~6u%q}4AeGSbm8L7Iv=`0jIZC55H~zUDNJen#xH#DM{*(vlpif`WS%#P)7YV6
> zXFT!m#VH*#9hZAYRJQ9`sO+pLA5EWJzUqJ`@cHFAW|$d1b?XE8+_PS}-)H=#I9vyt
> zW7gfCuGrT`w at GEkYD-_Z(*U9%^34~PE5cH9wU&hK*zdrb-QGB>K83(*rGxi=ZZ8!(
> zkL5W;VqjWx_D(xIb at 03vp3y|lVjw)<oV;^^kmrepH6MlM1UZfTyiWx*=RRm2EMdGz
> zfcKJC{$d;WWruHqsjz2Dih<~H;qTEEsdn079JKJf7M>WN56 at _LE`VpuB at kf5CC3X!
> z-4OB&E{V3czP}Jy8g$|k5Vs#6&%xv9aYIsht$A*F?Fn7c{PIO7wD7-N3>|l<<_5aN
> zb^o|-+|Oq$J-TWYA=So#ffkJn@!o&9bo({Fqxk*m5`WGKb at l(Ff;NaV-=CM*e8v!g
> zPgLNW#b at 82aP1ADuIgAq6q;CJ-^^lzPFUnr5wkLO9PFd41{Qyge}VmZmMZA=YQn=j
> z{T)2jOp_$C*sxfQX&Z5%ekYFnppYwHBU(Rr+ at XCoyuG1q#hX!2W%%O5-W|1@!r!p8
> zkDJy(s;aJuJknZhBUS7BN1JcC3S^D;DrT`!%^M({JQ!5r+40+egZa3?tYCAW3f8bX
> zaH?Nry7#FJV9<9g)Kk)>ZYA>Cpwq|oIfGO%3N}H!=0q%AE7qULbfn^mK{m%m6Ow)9
> z^=mk^AVaF}_09NSUd^#)6N09`f(LyC^=oM2`?=wh=7SRR-LY0Z{Rc|S{#;*b{Th|l
> zqO#~(@3+xE-0RZ=_ej9F{6}^g8b$xG=&)v_V*jxMB0;pe^x}sgc%;DS#D6#eWYL))
> zTC$pZ{F8iorc>N7H7)w_sTB~{4vPoHwhuR4mth-t at juYy>Ot?pig=bHgvGOQAf8Pf
> z6wh7|!{XW2SJ6J&74htcQ=VMKDD;qkCa(Tx&d9A>{x?BOZ2#w6&5s8!#ma^){~AI6
> zB#!)7+1MYS*;Ufw at g2aA*F{OM<(x6}jtUus>`l~s*K7IWihmW%#<a96X_XCp)9#>+
> zCeJz(g*FpHuHAhQn|UUx_tNfHlyuGYQTUBw&~!JXO&34;*SeAW|F+54ZPW(|$jJLD
> zin2 at B7A5Wfn|SX>M(Pqbe>6g8#Z7wi+^bT=eIJ$UK2%~h&>8l9G$oHiF33E7Wj||u
> z(<NTWVK;-yozj5^Xk*AE7Jqq8phmR&#?iUrYF{=zEI#YYNwRE}7qykjSAqVJb0Df{
> zzGb6$!ncTX-zJX#c(Nt&=RH&KC}mRSo>IIrjgsffo|n6dxcz^9`P?SjP4(wVjKJ-i
> z0^ModR|@HSU;beel_%_*T9jP6R&4ut+T_o6Fi?Z{74IwQzS>IS$=;G4bz5m4-MYoU
> z06!DBRIrNkKpJAQ!D;cBLFM89{lti3fo!XE**3;*%x~$c*QNXns}E$lf8#Ey_uo^K
> z!y1Lh)yz?l_!3EJz#!^Rrl)4@*<dg~oVAM;2r7SVE0bs8fz at 9m(Ry;)^}4MayXrSn
> zeuL3>5=56%o>*AVE|1O}leJgwGZ(Db1G3it_?Mujf at vU0WG&LStUyU(#b&F8914Fm
> z5=eEUdT;e+{t!?Cmw4i2y2Ir6 at OE|dq7xb at _%lyb?Lv=6q3AB3R^b<}h%2yetWxol
> zGJ3@!kmL<y4OSI#r at I$ZA?+c5-TMh)6m0_oe;<b8A-wJjD2BgLd=_y5V>8PC%Po85
> z?)>EN1{Y{^2G^8JmccybQ(Y<OX$_VVrfFT%k$DcyPBe)f|EU@^(ie+M(nf0^@I?*o
> zRjoKJ#($DEX4Gzyz{YxUVr2%L%>(!a6hTMr6z6`DZ#R8 at PK^NjZw at +tSYN5y7E_tL
> zHHIx_cd*CVi#BR{-IvI6?FlUN+y*GWh}?{y2cfp{=hSR1Yk{;BSU88!;|_ic7Y}@b
> zw{5=pBx|gCrE7}pN8_<FO0#M_tl+`ZFu#MIVq)Q^*#$tgRs?~GePJ%RCxzV}wmyx*
> z$OZ$Nowx8T8R(Tqep_7g>A2|#`7=P~M<DZEQ}CdiQb(LpN3`q)hWT%ZtBaCM4=aXf
> z{~&(!X};F9PKm4)`BT+(CdV0PuX<OpVlrzINZEvxdQxN?JUcvk!B9<LB9WMBLFaxv
> z;yRlx6`X8`jmw?ji^c=_)dt8n#!O>NZQQtcaoeeUy~3G_aWsMRQ+|th;?&IAr|QwE
> zo!>fm)Bou|_!5vU`G#&e-qUDJE?v%S?2bzeWQd;x7 at 5vD@%~{q4^n6Jpu2;6HjCH$
> zr)2D5`OJ1+b%FO+234Vh=9jXL%bnFhz~;v%`$f0^%?WR?zf>+HO+nSd2iSmq3ro4U
> zp;kr4q2<9KXQO#6$YIz<3$7D4ewIex5chnRA3OeEusRQhD$IY%Ixe32Y at t5C8SNhf
> zMZf+MZ=TSxRkVCQmdjruHhi8N{rY!8wuciY2Hp at ie|`-p@}GTf%=4l<1~=*EdxtKQ
> z-*cMfy4x`wR!FHi4RBpA=AO=VWF4;)Nn#i*@CLiBatdpLZdhv8-AmXUQo{0l*F$=)
> zd=Lh6d|fhG+)ghkT0>B%)^ljcHaZ~pIWHOXnM~^$?XG|Uk8;gE!Ydc&l3<))JEE;7
> zTuaaiQ*D3XkS_{iH9 at Dm<#KE=tr?BuZ5cqTa_tpN2cwz2$Vm6wxU5RC`*i-ad(#1%
> zTL6<%Ww-YY`7uGISCJyLwu!F#{5OXVDIcB=b at M$VV1bvKCqTbhzc6#~5WZMiHRfVe
> z5d9GVHIANiPE)s@%&c$G at Lt|Gww|dnn5I&#Z4$Bq_w7D}wn<RCd-)JhTY&G};ZYTB
> zF+DHlpUF!o14M52MTM_5-&-awIdgSXE!&MqiS1|dxg5Lr$(gjYH_WrLj#o}0O|JBf
> zbWb{N`W-Ro6Iq^IF6zG=$#woD=6`9v3oq`MF2EC$3ickq)!s<9It}L0_wGV_7*UT6
> z+QYba7sMX-*MZvQeSZwUl|{pdMHgk6UhR)I7eH=t)YHDW`fW50(hkTsU0%qdng=2|
> zfAlXAPkd>(KI=FPVzzvcQMav&2Z_MA&%#p@%MS2*k{EachaCoPOpz-4IY4%tN6ROY
> zXk5E)y^X|A1<LF7rrK3xE4nAYw-bt91VvY$Es5F;=)LK$6W5(h<*^#^*|Uqxrk$Yk
> zN9}9!MZ=))@F8X2amHXFZ;jbE<&xDL)3LRZZ)pmft%1fXT>t|(K4bw7bX+X{D#s$E
> zn`hj+)@sqdBrEphfum$E(m%3~RY%g><@~{yBc_!oqkgNqn%(S<3hWiPe)SdoNPMV!
> z2K;w)H>`j<snBFMJAUY}xM&}3v7D)5(H7%dV{A013Om(A$1d{fOiRaJx4|gP^=a6t
> z4F(^_PB9zczt^J+Oz=d({Lui!4Mi(WdswuPbIxg_uU<MwJ<(e#7GEYKS~o+^ZjpVR
> z>G;U1SD6)?5C;~YSN+nf!jc!CXO>=0kXsYaXnIxKUuoUU3ZR^&zhv9!xOcHcDDPb_
> zZ>ku3qmR2J2u4Vo2UO1m`F{=_2pu3KWa#FZr&k4&--Q+-%(FVSUb3?0$|`M>yLv~?
> z?l~a8s>QKAqepKnd!UV2&cCHxy456&DXt>`sS4aI+I!4g_DAC8o;2zf_x9w`MdC+2
> zxz|HUd}TIk%34ZzdkN9j-A)qhr1 at +4CNyBT>&8}ENf_PKwRiMixB3#^kALCDK-Ebe
> zw at 7^|_|E}4ezOlT+o32~26RR8a=B>l9W~(;5DdC8OHi}wz$rl^7<?*$XL%S4-$*Js
> zj&h$V9pJb0mT`|8#N)jMs%PaV#Qxr?6X^i3pItLO$sn;+3AZERm<*g5x~5VIe}Y$S
> zSjDbO5dKK4m+#2EFLqF^yDt{iGk?|xpzx7Kj9<wSdt}S?zXAP|KMOSBcnEF(H87??
> zUbB+-=l{z4vp=hkvl5l{a;!ORSEINtaQmzU7kFXEdG+qTO=qQ_0{oJoiuUsJS2Yvq
> zr^CrX6~eXXS}2>dQPsA(rT5~a7alpk!6LF`{{qqQ&D9jd<!_87c+!C4XZh?l-x&M-
> zOsjY|v9KtARbXjg52za!bHUP+MN_idAT1{lEx!HDnCO=-fMENkDPI0XJoC*=?xm18
> z_S;bfz|>h6Fm;2eQ2qs^m_Cbglx^#^c$n=GQvg(m$9`{0moJM;zFpyX>4H2d;vmLS
> ze(a?SJDLTfVsJ3%IKB8s5Tz3<wRPvooq^-KDi#NwWe{HGqMa<_3F-73<o{BI{&m_y
> z6 at N-<m^DqlM03nbA;GZI={mU42nusdYfVd4ifH>TnS1Gixa7OVsc$Akj8dR-Vll_;
> zZD6+u2H7S4^Sj9l_cq8b*W<2ZkbDP(V$BowHoC5vNqIxq5m5QDy$wL^(vE-%Q$r}(
> z at q~Rd$(OVERgClgC@=9|jQI3%`zLwg-Hqm$T at B)*@6)+vx48QIan$rbZQswL)Fhq^
> z-lQwU%Iy|szG&{taLi?2ToEA6cg-r4=ccGg<U3dRFcieEj>Kn0;<b^uDH6XX62B at e
> zXhKSz5;yy^Av_QI=yg1y#TtrerOpEi^<D;4w$PNweOw`)>dTyn<9g6<uumcRyPtVs
> zti^89wLD^45ipt(Kd!JEw8ZtF$K8N<i;c9L5%bTD<v>WRIais!x25$z_IOg;lI>qm
> zyTPJGc!8Xu=JR`*=suU7IPBvX?vKhhh at YIxaqLw#8hvH%KJ%2l?9ZdS*Y~RG%lL^0
> z3fxn?DwFQx3KRXfV%vemeJ!-7$2 at B<+o-kcS#68TzreK;^I9lExl8aOd%c#A56_t`
> z38wgf5mL3h8a08vAgTM*^<}Ed&<D4m8o|1p2EX`+^U)K_K~OY%%6Juv_D+>sy;IDO
> zRW_FKImBC3^!#3D{T at 02h|75NYt?vE>^MI;zOkKoyfKOyPTKgCc;S3$Dm0`j>@7<;
> zZFQ05KNrCovdV7Jav>|)@O6 at bMVpL<ZgIs0lcS@>U*)d`Zj`@B&$M>Jg^(jPE&?6r
> zXE}c`XVVzjF_b<KNzViRwK?$8U^-PRoNY}wr at 3J$U9Y4s3a3AMbSOOq%5h*p1yFS%
> zRIMG#8g-?L^$h{zQ2Ll*RrjN*nxUMGNKWn|{Zk!wU at Aj7#w+hUVS#tn4CUm>`39-q
> z4Z`}5Z`U{S=xo|*BjXm?h<dj2q0QsJNqq0(SgrV at yEu?4d&O at qUhS~z8 at a8WXgK2`
> z2>r1$7XE+ij1^9&G!l1bEd0NR3?7XHu{@AZ(WKB at K(}Bn at FI!z8&Y`oioY7YNto6h
> zNpepENg>8OA*Z42elFU*+C9C at sKEo`8$%vwh7ma;BEs9ro3#sAtGNG%V#lMVvN=yv
> z%ek=iiN&OrM3ZO9+oUd=G|CS1==&~M4gB0e%S88GkR1 at O_1E!DAS9u29g^-u&&BI=
> z&<K^e0N{)Hd7w=0s7oUApp<J+smQo7wBzUqNU0twbE#6M<4U2+(A*J#z8~6AUq&a_
> z=X1q!k9Q)P2h#i;+R>i`dDDg=@dqei?6A1QH}crXqa(Ufn5KCEVE-~K at 5$dZ;3<Dy
> zXvY at fQi*4OGy<E~^gns^Hjqc0vcEg4Cr*Cd!`BloD&!1O8yUMY{M0`ea{9LerHt;H
> z7@|R^E5?fk7qU?9y-#@?H9f}U8u7FKQCGhde#`h`$T_(Cb>AARUQ?#Hd;%R3OGDo*
> zSH4aw`M*<aaYyVkxQoqWEMC#_lg&}SsmmAhzLro`x<}1GKXR|@*U9A at yYvmJjF1OX
> zZ0>b7^1Vwg*Kby(qua9bV>z|VgBv;RDqNiA(T%_yxmuj>N^cMRaxU!mvvYl?vy)+8
> z=el8NqutYk&JSuJ6!SqD$auT-DhHY2uXe9KM>#^0ZM3jWs9?9aSL>U|4|p&)^*Y7=
> zKj<C<&*Cs9EB{$OToV_bfXVAcXoO6E+Pxa%7|w{nG at -&qzT4?87L0iQuf9>aSb8H=
> z>jsTx2BNuZb&dGwrHs3FHOgDhQT=8 at Aom5#MVulS&0)8 at SF<?^HXMpiiqEY%3O34r
> z)_Mh-vR`3izJg79C#JDEfXzHH{^vBuhXRo|yB`Q#)2`|hY*h7tM>nYK-uG7IV#`6L
> zn`?mi8 at MK-Z&%^Bqx!}iXaikDRCvY2X{qDrb at FjHf!ZIyi$mOMyPBBfi&lfG&R+-N
> zMM~JdKND7#nrJ-Qz!ai)kd7{1v0~l<AZrv55G3G*4Wzh3D_=xP2Wd<Ebr{2$t-3iJ
> z4j3Wa5Dte8ajBLL#z+WaxA^PicaRbZM&b0nigz}=BfQi6&iZ$ph%%6_Cp)x)!w4iO
> zu>&1L_|aCe{7x_QtBr0x8t4@~`di5~eFHr!zXPqxfRxkv2J-nkjEo=}HV3!JzTG(#
> zrrfA2;W6u!unsqsQy=Cx0Lg(k$d2=v4IKebSj6tY6fLVk at KH(PzEFwdDZIP*{OcW=
> zN<X~fuM1Ko^gqz9D5aIyu8wd_- at yIQ0qUY^KlV{LP3fQ4Fbrsa4O6Tka))^_R0~?|
> zgeZ3V6(mP?vAHmbP?<(&@&n?MU$Px$1&2E#ID9gM!>9hbSLhH9r@}GB;S~z;&%!vo
> z5{CU;c3>EBfUYC-HT>7b<Fqhtd4<$#IW>0a&V2+Xf(%m-aEg*Q<0MSNS;!@N;;zg>
> zQGa=~<EFt83ep~xV0 at 25QxQ*{!8yHfHd>%XQ$I-h1>+US-Z0dD1!}5798co3(foUe
> zScc>O30tYV?__xDXih=CZg>i>`3&^jy_aW?-ln*LLbptc{g2q6<Ru`9mC9LS^gtRt
> zCgu)|PwzM at uP4B!yHqwp&LPRk-seSsS42BoTrn^@?PI-)mA(IK(&|zQEfie?6C5j<
> zhUlFqq4;FQZ;c^EPs#|qa~mNVd{?R32_hi~g&?}FUi4#2jeioz!+*jpPQHOe<DF>v
> z)guY-X<e&Y*LA5$GAV1VJrYA2$TWdiNUA2p-qXmvt$c_HG{o>O4f?G_-QtfmbTW^G
> z=#T4Y#_Z!vtJu)QO`Smt5lvP-H$8AY(C`+t4<ToHhUb)-3mQ9y@&xn49cTY|nvQg2
> zKPOZG{nGV6kN>bTKH!sCyoER|_9j-mXNE5c`zY&#Cmz~r at x~CI at E$FSf!WW&RMojx
> z_dgOo)T1DDJc3f#=`K{P>QGQZ0}<mvBU?Cd-276<S<8rY0-|TWTOI33k(WphQJPJU
> zN!uyS%nTP0w()=kIG}*r*<<W2f3ErNj<eD!0E*fx3oKWDP2xD3?GP%Lv!;&B6i^XC
> zGEZ=?116DfBLl at O9mBAex7kHfoYG8U1$5M&|5(kw(v)3_YZ;Px2cD;J5|ClDoK<L%
> zKxu+v7)X8CNfjId3J%zJCg{7XJI+>GNfY6S#hyeg(k_nX8A}zvI^j9rpcD~%r4f8?
> z;CksBj*jIvS*2JNojNJp%CMJX08p1H-Gr7s@|BUhk~0HGPHI$9<2b>b2J`qeLRg_E
> zoyq7S)<&=G^^C0BNs?gvfQpUUD(zR%iQ{fUr(<==WHqY4<|lSFRys*j;9-(OXrFUq
> zg&v-=LDKSc8V7x9;pxnL)93a1RLv8jL!WnhN?C<0p#A^m0m11SwP&i2W9wx>-Y at Os
> z=~a&3PQ8b*0T*a^>VX&&KP+#p;yEmm%O{gb3Q|`CQWn<4uOwZI&+j2Ug9eQ74F@#(
> z8|ZSkzaTK*J-t4a8-dm#M;_v)kTF($ERmL|>9`xhNL+bsXLz!q-5HQoW9qkYDLCoO
> zF%g$<vC4V)gNncq7nX^Ety4vtCd}jJ{Z>z@?3O-J(`s&4qm-qgv#3E at qM>P-zZp{X
> z<ALit{)`e;KTvUdleA4kCpnb%MvX&1jf29J;+Jx$FQRf47bjs)PI&=Y5#CP!TBPfr
> zdu0kLPO|a6;_x!S39`GaTNpepsN|KH3+}H$b5CRZ`Fs_d1e)LQ?8%UwA~i(Ol6ea1
> zQFY4k%Uy~C=Qb;$Cwv+!;ZFGQEYFF3#ap!dN}emV^K6WKnDL5{!5lVr-!Ayi+~>4s
> zvv at fhRD@{RBAt$+BVsV3mn~?~Lb at D9JF(|FwRC3j20J_LnJ9PIGugCr+Vi>#(HCR(
> zf8OUrN0XQT8IT2ZO-NXj+!1WSe<@2xv!*@r0`kR&H^PECtei+W9GdMkxMKyzy3TF5
> z at aTn>3y*nXuXL%FhxRe)AsrnT6HbVN1ef#|9X-L-t(VqD(@feUwMEkz4!j?lpxhKi
> zYi`j)H${2<eT?_1BcHau{yMvN<ly}&*NiK7sh9`14+KN~9g0If);j%i!v0K_36shm
> zwjwde at qjxd%30nF#ZTbbBRo#Io*x}VB-84*sm5?BGSfQ}h0IHHyh#8=xF5XnS7xM7
> z3+P3K<3jenis7@^tAc{nVGkFtwxgLU+rUpV at azQ$a^dQcIVA?>ADO-5VqFutS}=A1
> ziankFIK<|BmsXKZ<D}CuG{e#2%T}yrUGin3nzVA8)e!ymATwUM4ds{UcfzWdkcE(m
> zKMz;E0KPc-fPV?rAg}i6(BUEI4--0CER-1bRbYDmdBK3sSL-4z%Gy^E+5x&@7dtJj
> zjin<T%DjwefN?vC^D?x<6MI`SB}Ybpl#C4zRjOK=E?IrL_hYYg#ibgS>#ss}XG}2^
> zSBZvzo!oin{y(Ex-eGHKcX$m&UxYPur$Qdax34FlvJn`Uz+M(5>EmdMrsFI~n}Rex
> zjy6p?T7Tbw at yZ;FxfW3CXSXRUKF^nYg$~42<6 at GI$I&VC6j1&}sAcU1^+k<8Pl&T5
> zlj)aZ`-IvC%Wlv_U)W%gzfXCYsRB_!u1-ZZ0tV4!In!B|QQ)jBhAd>%vW&xUtW+Bh
> zGxr;5MLZox_exvhsVld3_r)krR8Y-w*=%G<KXnATK7J!TLxbz<&JWy+jBkuiT9iPI
> zQx%#RbrQW`hK+yWHVSVblW>z0I%_GC;mQ)yw7Y5d=u;~9$zz7VN7B9on&)`gz0&<R
> zi&4#Qs&tpN{l4{SSg at D>@BA$Wh at nE=b3w0y>3F#$NUeGbn#birkOYlkN$|JgO3aR7
> zJOf3xG)3M@^;dIpk957BPF2BVkv8dRVR6S<K)65_0 at Lj-md_}Nr##4k7B|;b;!$m|
> z_|kD|jyVe93g1Y%Rg(3zz|o3sqm_)k-dqqF3IfxC-V}Ki$3p#Ic*pwEyx|wyn9G}i
> zvae^D at S^)%A(ZHfW4upUG-DjzXrD at P<)OGO`sypFS`+r>^wsAZD&%rp?p?@56YGhz
> zC6Ugu{ZGhqT)7k%`Znab(r3|gmBMdVlyVQST9Gu_x3YY+ at bA^aKiYj(-s^8rs-7v0
> zOaf^~8P%Bogjp(JR-km<)k at dZ^iMo88^vQ-xofP3n82XWymC!gXpZ>?#p*t_0#g7m
> z#WCOcm;8!H^2&x%T_1H9qrbTeJP@}OrvV8W`FHbx)R_eH<6$4Sp`7VJ52bh>GBUba
> zYE;k|8wNfyI)cg~t08vE5GsqpsKibMr3ih^4}@M&h{Uxa=b(nMGNq%OSIpPo$qFZN
> zR>*&J8a$P at fya8fRXuz(@&(^j_*q at LBbjDTU8;Yc(R~l?dzhb0QjZNCrC-?z>(LGk
> zJ;|Q;=Yy0Kk6$Hhbi=i#^p}@P9(dI;rB8s-DhoEhpP;xQ7o9ZxBKI$aRfpMlLHLWh
> z)8f?$S>fAv$f{X%=#YFoaF8%UR0l~kOwDw(oVOtgn7R#3w%h0pGlK#Mz_+s;7JdHF
> z3y(mGR<f{hp#P;`+`!wY&?nuNLMvkf^tJK}PPWHJzPm>1NTCxF#$jU>9_Ufp`dtd0
> z74=8FC?UTs6_0>{=sm0o6#2NohQKj2#g+0oEYhsuyE{r3{Au{^j<PdD{Z;O10UcU|
> za8D1eZwDg!gBiHBcKB99XeUm;)_<Fuaw_0wfnOE;AU#weoHqX{JLo`?Ql!eM^s3>%
> z$~)RORq&W!%637_a>mmWTc#evc{GAWFtS^0oOS_nSl>B3NCL&dd-#?oP4GCYAyffx
> z=*#$LIZw2(R4}}Dv-~~q+-CN?jnmnbH@{QftbkvYa`1QQ8XgU}g$c}QWeTRtxavp4
> zO2iYwchD4NyPzDutk&ykd`bgJWO#dipnZnB4A<@X19;*Yq>UXR%g{v5RwlARUMcM#
> zNhj&r-Nh)hw8u!_jih57*S+jCpwr_G)FP1BU^A%fTC_FJ=D{4B)t_yng%e=#M_qS_
> z4a_GbL1r5)wYymKuF1 at V`wz{IR^m-{j%QIIwZn9oP>9eiI*{tMEKeyZ7xV0s*r?_K
> zD2?|e1YU-LYmh(abMBHJ9Yy1kzB%Rl7c4+L7;R~tA^%bSQgV-?#)PFDOh&SqHK3;5
> zY?VG9MW=ue8=XosM{SGjA03d7bI%h{{%coyc)3 at yq=LX(@P*WpO7k`AKUP-9{!}`H
> zrc1$8T3A^4B)Ydp=R3-|l4m#rTY2Ed-wLiFm)m)uTB;dMtLF3uo(>#S1ns at Dt(m=1
> z{QBf)KddVyI#Nu&KBks?L2u at KaYwnX1Vs<7YpppFt=E&U<zBS#5qWo$bYe6er7HyW
> zIj!y%E?)|crXyx$kSa2>dvkBxuO_(+>paA6Q;Z{4ks1G$A21g*t&l8ZXvT=%R%@+`
> z&4t0@<#j$z{y1<9I$`A)kl^>q&je#r2rH4Ff&VE!{cU=}wT{#SjvgMZ>JFsHy&Eim
> zJs&s*RIq|yNTTd1B)!(|Y}vG{t*}-P`UJ<yTG4TR^Nu at xKLF1MoxYBvJ9wVNB5Q!0
> zKapfs7UW4bnQ0 at cXPANKS(=M?w3<CJOxL#|yoK=SPXDAn_2q<C3kVP20^bR+ at j^{|
> ztiK8r at hFl)H0>J$d$CwNsRLD5<Y$1xbwFqqR65cVeJ<7-|6oH4#~WD5<6NDZPQvXA
> zrGYkB6D1%IOnE%3ZUoI%tf)%QrO}a&!ZH^lVTu<Nyt?6I3 at XF-LEaq|d;}H%2|il4
> zl6(#Q_*H-gH=x|UU>RewP5GKIRkk_v;5kjUvD;HDWV*1UwG1TvydZz^iSv(NcnqMk
> z&+)Amw-i*{s59<j%mtk#sVz3%V%W@`k3JCViFwQ*+ayam&HSB>FDBED{c1?*JusxF
> z!j7k9TZ)TJt=mGj%C;|U=xjRJ(yPMzXo2G!jKRkM$G-<vmQ^fPR&p<!J=uM#Aduhr
> zKIx5gnymsfrPJv&joPFT#A9rHGIW%l6hr#>44P3;=>w^m%;?If*C)i`7KlQ=EZr$R
> zR|y95tZbJr7U|{B)1}4?n)bWF%pA;WZ8>A<nX}PoF$xy`TF1a={k~M&fbeFwwl_s7
> zstV~JK*uRX1r_*$;qc1FxeI6DPd7;288mZ}nol9IOsi~54TQe08MxeNem<wl_jy}|
> zIT?s#T6WN<QNk7oyQI>wbV}Uppc9x>^f at 5-fv2TaW9c<f+Y~Pp4 at zFhcZ6MMeWlc<
> zsLTBaLtP6Ej6X1HAt7(oYg<xq(=f2CHP;(O77(<Kt!f at PIkH~|eKkc{*Ss&LwXQ1;
> zI(h_&QM}kpmV0rLVR at nVfM6SV3yEQ#dJFd}Min(HDI(V>Um;M!dSbP-F_TVCedf3a
> zU8wK&Y2_te4DC{mt-T<9oJkFq_!j_`87HFTl}y9y*?YEuFDHN~I>9#Z*&hWO>S9q)
> zDa>Wlj<GptA1Sy&enj{}esY6>9WFoC(IQPV(78FLxt=sw&V}dHpG4IYF6qyQ7B?~K
> zi|^C?NA>4}K22a!V6L>wK*yzRN#e;ESc22Nyg>Evgrzv0TTaHvTcooFn#<7>Qmm1V
> z;e_j at d?U at _G~Y;dMw*tmxA~DbVv)2HBROTGI-~TEk<J)3E#Lux<Nb(UUI6Oh7%vZH
> z9W~M{ho-GFmf7^1Rbzo$M6o;314q=gVJ8!<_Rs<7&0_4$gF_~>u{4$6T(HWHCbPpj
> zXqPsul`4)U2EP3!<XTt^<5|{{u&`K9T1R_gLxfRwz((hVEGiPG>_VcmH0kavn!wHb
> zR$7}y=g>XUp)8s+hCAnp8Wa^)wfHMdu}4O3q^9^IBPA}I=4v}yj>OvrzH5+*vuUj<
> zCKnF`(k;F*?i=e<X^iW+qgp<ZDMy;nF#Hitm?Idfi*@;nN}k9)kB18*2Mf6;q|R)b
> z={SmR8V|k+P1#HXbt0MYi>iN)7sgxfat5H<M4wSFvT?3ypd=gxNH>a_545366WxVD
> zZ8j4B0cBu2;Vh=~%`43X542f}bwBx+fI65=riJP5#%KMLhUuyv>G~X+2uK*9=qAB{
> z?mX7Mh>jfw?(t+R7EPdP!KhTdOsR at tRnaqsst(6z{ibRL%Ci{_c3>0!9|$O(?>PTW
> zQcn)eqbnu-I8d5FTYumVDD;l-R`~;WC{^4Iy1GbWF>dGAgP<M#`$5qgQj~86(X0J+
> zSL_0T#&g9IP+GqR(7FTATIY*_-cDKn0=|Ps*p$>q(Wy)rt;PE){MAS;xE~_h8cE8w
> zM!e#+b(A+cvaO-HvaJDgFULloj!{$=JxKVIV4hlWk6YgAUhghmm`EI3=D at t!)|yL4
> z7Z at WAd=DBB6KSFm;zuH%5d)}^mLJQpN|m`Z8 at lDTT$;JyCV;EOu84VRsQ1J1r~P#y
> z=GuV%v4mXwF80ag5c6*j&BhbDHoE$Dr@<RNDBiDXM_CC(?|0=6>0~aQT99qmlV~{)
> z7&khOh=*q~JQJ9XZ-$|Jo)Nht_!!dx__RElmGr<iVCka*?iBb(rDMfI(p`BpKe9Bw
> znSe_pTl#w*)hFHr+C!!XcnYW|(EOgarO)z!11VG?7F9h#ip{4+M=M%oM!!SO%CP65
> zhzoZBi=zm3o`zk-A2!J+ at Efj$Fwb*Uc1EfMk2~KJkB5`CnJptyDVaR*3lNA?7oGl`
> z7SBbxvAuSoBUm)0aPhI|D^LJ&7W3tMp%e9m;g5Q8XgDYCS3utg4G5+<mez#2%=H$p
> zbTXgbZw%x1D1e06UAVQwt4Z3m?~;6;5fz>(knSp=h9tn0+vN#5p;u>aI&PyXCbbpN
> zRF2#y?JuBZ-0$_T1q<j1>cGJzcnZR5i2oZ7C*D3#Sk at 2zn}kW2V=h=7v=+zz9nY47
> z8u~-m2;AHC!<(y5Mc(w{iV?;~picqxF@(l*NoX2;c)!MfVlMc74QOwVvfcjNLZV{#
> zqmlp$ma<KtfSkgvCsWw{ih?yBU~aKdZne}tfsVK}-xo7TD1UD!DU2gIOr=<T85r0Y
> z_@<TjC~l7jB)sE+_P>8sd%043c)K{4 at Ji*Uq4Fyb70UD&UkE~exwNE^K4rX#BXn*Z
> zM_zILP&<XivE5-7i_i&OP~Ivjej=S6<*^zPKJwQ|^%H5vI1e6kP5657nCoiH>_I0=
> z@=ee~9&2$zz`sOln at 9_k_kM==j>CIbDevjyhrg#!82+9<$-e~2gZbf(79bJH3W-3M
> z4Ff%2;R;BRW){)AR;brlC~0u3y*$Gm0Tu9*Q3^j9r3{O*?-V&E@#>KnH>=hg>K5rY
> ztO?RG{S&Z~zx*`h49$ivJ}z%>r}9&Odl$l|<TcI;mM5>+#rC$ixqZ>$eOyUDiKb0e
> zj4!|}jBT&zi1ufB`J}CMkuPkFqNF1lZ9^z&H~NMc-S69^hDo4*w1L3%t|#4f at ZcD<
> zcFjEQB?l6b_J8$~kdN1#FMc4z+Q^Z0t|`DPG!S|;#CAdYSG%S5Ni;7p)~kyUM|GGu
> zN<EWkM%A|-o}(n%$L$)El)yMt%6n;OJ&3EZc#rjn`e-Z+?IQnnn7C~Rc#e=5|91JP
> zfBU6W=%Xy0<WfyB(20wBvVLnP at _<e}<AcYS^i5<H{C at AR!$VG(V>M`j6NaI}d_nu;
> zU>wP%wjX1GR4CyGcX5~zb;g3u at Me7~XT!Z>EJGLTpU)b+7IeDAn)Suph0a*1r<jg)
> z%-XJ;8ER6_45{$U5Wa!?$vVRjVGhTQ!}$?|6`-t$6~ShIb)O1qDu9}bbp^<K1W>M@
> zuwn1fZjToCs=DvQ6Zv{Q?N-=ILWHd(NBD|haaX#FTOWW4cU;<5LJPU|InsM2^r~@f
> zNIR?s%~Q-{C+jVM%{N1MeS<xq0fr&vPljpUh7RBQoZ$_2G>PxOX at gO}nVxk`l~;Nv
> z$XVV3zL6!?H`0>uX8TSn$ZFB}@sT_yt)C2n^>e;>;foXi>c~WYa62=?g4kDXlufbD
> zH8slliFt!KMB;X3$BqV!=7Kdf)?(EH{}Q~%<tdQepwlJRgE&eI&Yq(h&;X}-IC-#D
> z{~T)72`uq8rCBGGW__fPKkTv|MT#64$dlU!?<wOZi0sC1x#-Xe$jEJq-?Z-LM_!Kw
> zbk;%mEKZU&`2ph)s`(1447%&tDYTAT^}Qrdp&65)jo8*5YhX-b at nf+f^^$@2eKDXR
> z-jBj4^gwh3>Q-r5DX{TvQhh0%J{snZ{ROTK55}UGb8Z~b)oWE>%5O at 4DW!MPo1~Pf
> zG&?E-Z9U%l2gy8 at -Vmb@#Kgbgww>gf3hd*_lhPYgX~7IAOMQ^xJd7uA19_eXB~2RI
> z6B-Y52|ah^Do1xldo$$n!Fw-K`ZRiN2`EUuN*Nt|eNP&k-*L%oj7L?ujL?CN@}7-H
> z(QahE)^D&cQ+>@p4+`c@()MXIBaGYfH>Cs9=u9qWp>%l~{nLmr8NLz7a8Pj(k!Om%
> z=|ySZbZU+7zh}5i-C9PkH+O86*Sl)#Q&nnavJIRZ at 2>`8 at Sb8@TiJ8|_yVq!f4v%Z
> zWG82NR2vMwB2dX at +DM3(wwBS~(Irx_3^b9G15)e^THwe+nqwOXjPMx-D_fl(n2#5f
> zTPn^ueV-$XQ$D+-4LdY3 at a0#^nYbNZHRi+n(@~lG at e`+|sHt%A;i!5SRST!<_i!pE
> zBP{@4uqP}oB;M_x|9Y$!=4Z3PtKtF^r2R8!xnmv3F?o2>5LHqCk%gc|9SMSpxwf9v
> zd at C;r?=%6U{nZYW?{j`Li3Pdp&3Y~ON%(v!QW%o$JbUy*6rZ85-j{ExB>bILi({aL
> zonc(5^M;m5miZ=~W&R^M@)j<|xxg}CS~ZgvfXKLgCS6LiT4&LbNqfHyI_)nI)1ZFr
> zpDyLkf~oeFv}G1Z-O<t;v*?VBl{{f at Y@{jhuYAAj_oWZ at qgB$I=qU9P^uQ?<n&`Mu
> zkq^8cl}qgzYRT#q(j6vh(6sFFPYNuQHkm*#Prag-pIR=xZ=#vBSo+RHtI`%KTSA&X
> zXJkt#=%3U_aZ5-pmujz~X~6dHxQfnmJP3&GR}k9|1Z8`uO2}p&fdmCmc8_>Vly#~_
> za;wf5TDRf&*k7pwNmtYXSpD6~N56re)cqd=0n%EF)%pD;;k5pr`;SM`O8WDz=aNAs
> zR^jKaCBdi<>&}rQ?&)}I>v6%8HmtI_zp4Cce_f=wkNRJT6n9MxAupnyFK0;`%``7t
> z8E7E-jr8lfCbF at 8HoM(jynmn_H`aICNNFeZ_s3>h;aCaH at AOxv6q8rs-#}hFtbEV-
> zXF_0tS7S;XyUaw#-r`dU95Z}r?9rV$-4g{^8Uag{SL2JZktGwo{k~{r?}6U;N;lV|
> zNM}D)Ucp$C_v;pD@~?E?a_GOrVd~WANYiHE?I3KLrUcl4QAwLL$lg%7Qu4|`2t9~=
> z++FRCYF{7N>n`!ka8312mzMw{rOLs`5?DW%%4xwe<iCYhLo6BMS%rvAEFJ96A7MHp
> z=TP`(p|v=chvIjJECQa*tiVr7$4&t%;n2T at tVr5Fh3rV^AJQWhYN$N+U3~-Pg)ZMo
> z!DDp+UHDVS*{};dH(>>p`urxO7L4NkAv_ssCp0yDD*6!@n`54_c9qm)p;>b~&Q_A}
> zEhEHsZ3Du=n;%A`c&mF(-v)ODVMMdrQ<p?X2p030iW3_Q%!AIe%k<kxP~HEZ*UAG6
> zq=gkU-+FhNMcqjHqiyu=k#;rV`qdChv?G10vBZ<uJ~eKg->r48Zhs`G4(wIvnZTCf
> z?J7c9s=467!q+?%uz)66t;O^gP{U1SDPxIyKf6m{LA7n*fdfKAP>pHOBh3(hr)~?0
> z-`ynHTcSrv#wt2p+rJRIy8BtFp^D~2cbp9jo=n<QMW-0?OGKPpF86qK?lRlJY2s6(
> z(+R<_uQCF5rixyjh+ruSm>$7CKPs86bo8AH1f%YnuH5t74*G0*oti|xPMUQO7F+e)
> zo6rV39<2(O22jxoRKl;I-U6sY2<7AUS>#Bmum*-Okvvvv;(qu>x@@Jhu8X{;BIbgJ
> z%J5tHVBx%l#r-!DD$xHP+H(cYPFOw^TkXT0F+5Bd>5tj8eA(bD6U+q<r~ansr2nPp
> zLV(*ChQl*n0<kY6mVJ}2^dj=0ugXFPKp`jwg`i}^8mYLNPBtOua!2FgJOB1!yo|6h
> z;WUi1hVZ<tq%BRm>2co8;YaPjBhvP2ns&Q#UsB$~H&Tj|J?I2<-bJ(krO?n<Yvn{%
> zV7gliY%=wTN}dqDXw}X4q;`!0-JlE2hI{eK?Hl_VLwG?Xs)#eaiPqIa3_@>6hB-7%
> zRVuHS%yVc)3>&<^w3bP?&7sEYO1GI6p9X6I*R`y`zhK+t#TO{Gm$0?0rdMS(P@=eu
> zQ27@?dth2u{+=|!s at CoKS-xMfWusirK?A`~Lr;$1YM!vaR5~?>j at 4gdV;+yjM&~_;
> zCLZSPlcH;A!LKkd*U($98<t?z({+Ayk)UXyyn#dqCg3?M{&|w-G1ToOnR2T)9kkTZ
> z-qEd_yDNK=5LTXrPJrYa(Ljg%EWdyi%1=oBH8d+eXRW+mXkgTCVT%GUNclE8%Q05y
> zy3I(q%deS=j*Mlw{dj<@!yE&kJM|4 at u5#t3%T#z|EI`pk0Euw8FL!JQbddrXxLGjR
> z38~pv8MZ*}O*Y+oWR`g}D}&rNt08UxNTwdcm}WJ^b4Y?N#Um3hf_Cmgt0nMib@{QJ
> zM)Tb{Yn>L>E#HGZ+xM8girIm}*e|re&>olcbLptrpK=Lo#071)x at Vl*2%T?hKNk4(
> zf|l9bMteCc5)6S)!=(qKE@*dG$X0~kZR94gQTsEwayAkwJt3`_OEar3SPfC{4r<d5
> zjCs+pIK&DdRvh(@$`m2TzXY(k7021$MB3dmHqw1FF2(zyU?`|ZdVel8(y>x-E^Qul
> z4|}9?Hb5HeD~a7bgV`=TYNOmE(&JYHW#|3^l1X+aw}^10bA1>^`5su2`&kR4oPibE
> z^~~-*^1|HxH}AT-&j||W#Nhf)PPPV{e-xmuko3*fv at 5M>j}Bhz4o^LMGjtFSGtp+F
> z^lQmmOUHA6Fi00_Y2N5ke`UCQSc!AJXy$XgZQ$}K`5vkC8d at +S{dH&Pz0e%!_BG~*
> zbJhl(&N+~^@)|lT83cfor&u)JMhZRwD*Ziy>5}IfIx*o>!N6=-AN2Itz^78^8k!e#
> z51SKMg}w2I8mXubDEvLr+&Vf&%RqyP{|jg-E9$73lMT||I(pO8MIGZovYZ=kKfJS6
> ziO;TXBgDRyJuBbioKyKcX|j(XYr at u@m3=GoJXo*yR5p_)rJ at zmZS&}aoA0S?B26q8
> zXNZl^=Y2eSKk=Oi9YzDp%3Lxyt6}t9tciVrZeaY at uXE7+%WLC7Vp>%l)Qw;CBP%PD
> zUZ9o>;d`Rzh!%e56tmY-a2_pDg`k}|c4}1JBR?k9*y#)h1Yj=bZ#={_Rzr-aOdt)W
> zK&(}nKpLDl<^o75j`<U?x}?Z(Bkr5+`c2E(oQ}Jcef+VD2+ at K%F&6!X4vqyZfy3cR
> zw}F7rZr`7Y7EMu81d?2%C!5(-`es4{WxSmf%0WqgEzL~$v?Eh6xG9?hV-pWJo3Ewm
> zNpD`guf$hAymo2DwbZoe&76HDon#TQkWS`H`3-h=z*>odm7?)ic9KeB()x_RigV<9
> zexx|-n9jb8)u4%zH)(AnNgejKt93rjoH$mX%2Ydqhkcb{FhYxR<$L7UI*fQn9+wY5
> zci;q-YUk65i8!HG0nfqB{cDuIe|$bIh`R?F5hyr$k6S<$^~|TaGogo|MD|6b#Dl*o
> z(Hoia2Vu(Bc%z0U*-51)!vbo&wug-mH*1B~mk4v*D!=L^U5SIB>j)dq=ip(OP7;_^
> ztv5`?!SP+qqR_R=rQ_(F4Hke#&$DagJ$)1~-LimQLo=k)3uqcn4QvCMr}!5g_~oB?
> zP*FknbblhyY8XV^(CE-zL2g}&U*W8m8lBLfN|E6iU;^d0KbeER93352LxNYCWP`Dz
> z{yG+oTKuI=&;^fyX19!Nc9m?T(nAYryd!4~FuNRk&=FYtBRkx~n{-=N_ at e8{<zE6z
> zFpRCYYdaY*$~@EPE%yO*{uu-0H1?{yr}nD4NAyH1koRF4LN7#U&NRL|riVAHaz6EG
> z1rDE>w<w%95#op7S!8yoa!x^D93-59XD&Rygy$r9o`q*IJi9?L7!8H5f_N#!zlL}k
> z#D5R*GKhZ#&lwQMhRlTc1>6zp&cQQ>z43$IHlgeCLEu_qE?8HiX!iw*@^Dzo4A|o^
> z;BD8zkQDe-WD2QqZ>cY%nxptd7Y3z1pYjm;Lebp}xb6g42}P=$<9_Sz!~YNL|37!@
> z;{V_J6}nZ>3LbcV^0rfH>Rf5p_0-^S76N-^cvF$ttrlLE^O4<#wSvbrL+Rhi`GOIe
> z_z%4P6#DFSQca at B<#^DP2WMjA>jcl0csPOL%*UFcdyLEz?if at 0k@Ag3)7T^BMaenu
> zb<K7^TAOXDDsm*}yxXNQ-M{5d)6y+>`_vG+144IURWeXd;J+%tfXW{fU{MON2w6qh
> zIfoCZ&Tu|{<00v9XEZ&jQ0Tk(jnb3|rKsTlu4)4;zp+PV<K<$Q?B4>tv?=@4w$P6H
> zR5Z7UAFc2GDL1quMDP<+|NkgrNgB#JKmyjlw6XTBcXIn3@>)=@_l5U4_y!Ww%<7gA
> zxAM+23duDf`>Wi=n(VX59qy&|dKxp-F9Hl{8T8B{g)$W{qG<`AUR1GMcL7@*;e_>z
> z=nP<dTNlx#GmfL13EZmJ92gQVjzjES+^V<gV>&^+I1U=<QBV;NwE_(`^5`|`QlV6I
> zBTb){v&MU+>TO7ffJZQ2?2hL5lZMjwhKbm6?I4Mg*o}0QI!xl*Zlne3Fhf2HB|37B
> z*Is8yENUKCSl>e9lw<knm*QEzQj&+|vAO=rqNZ_$A4K8lh;fDH=W~wx(!+J(=L~>4
> zjbszQc86CT-3e_-6_(<jn(&3sf|sU#Y(l>Pq?AQ<FTdiX72p at Z3$bo^As at Z8a?6N;
> z;~9NljT9_Y=}WG^L#4s+&!>HH^>^@!_pZ=!UsU}aoK{dNbZ)Cae7RQ`%@QVc)>Gpg
> zE8?WofmLiroRq`2<7);6(1bt1mF<ll>@~+Kg{;5sONYK3>SITXWcVEriZ(8p=r1i&
> zK<tCvs@(EUC&|QOPR==m&%p7nWW4RqX7s9HnXhnLyC?LhAoo+ZW;>=YhnOnIANB|V
> zv+hRMLA#Mz+{xX1Z;W8H5>kfMvWAEO6lP9)tCW;Dn5E3pOm<&eR@|($5Z3T=#qRkp
> zSMEyk@>UYl3G2#e2%h13)UYb at OgckQAVAU5k54eiytNRdkG(MUUkDq78j8EoUBz1q
> zO^JpeNF#f##bggkBV~qWQg5IMXsM6?IRfv%7hdt#DHbeP*wn6YS|CXYFo9ostJE3g
> z%)9O&8&Eundhp*3uhUyxQ at uCKOT0JXR|0YsZeiQ#tM8$$A@?-*YhhsoNI;ZFRj<7q
> z at 0#X`k-zNH5j{b#F1U|gk2N$uBAxslO`ZJj-d5~Ge^Mrk5<ETpW@>M6Y%!<_J+0|g
> z8!i&=^anj->qL@<R at a;c&p4^=COW~fd~Ec_FP^N4+|1sB&hG}Ty`td|#q8BOfnZlF
> zt<R^i!+K_$wU{o(kCIA{^eHw$XT4Qw(KqN?S())sttC-tuoN3~TlD*)_Z^A!7=uz0
> zKq++i>lP0yj6q?Ftu4rEMr8-|K at G^8OPt2A#JMRY>?K>HH`{M(GsT|UVQJu1zPT8x
> zC#t!^X?8f^1%f#n?@T48OX)Y$(GJX-Vp?&r^R{J#^A+HiuSE3 at Cx{s&k-91@%hbFt
> zJ5ogEP!Z_WmgxIj&g~1jb9&XN?bYY&qCjxGT)WVt61p~i;rpg&*~dR^>KgPfg?FpA
> zkgz+Pc+lM5YV=oySSiRcF&`fSt}<zno*h8rX3biwg{A>lIc-{Z&Sh@;_$Sl4i*K6m
> zet(;dj5-P|eXZ1UGtJUIxe#}znzd3=1D#NHb$`BD{HPXw*O;D>^Wc|{D-~#Ywv6t;
> z;=*m9>iYjf+PlX$Rb&s~GdDMB(r4NRXra*bMO!EZENH<H(liu;wMM9JH&*P54^~~a
> z3M#H>ChaW*h*BQgi^yUsSgXrw+-0#Ss{v8VV-fihV0VocR%^L&F>NVyYbC#PZrXzW
> zzQ6B3zxI=R=RI at JoH=vO%$Yfai}A<ecScY1!&k&iMjdS{iSvl8hK?N_Y1iO9RE|AR
> zYw?g7g^B~UqPK?rBK0^3vMZW1n}6*-A25sk{$qn551IfFV at 3V1=orTgJjB>}e?(_7
> zLe-q*z)QSj%y%wBnuaAApFL2E3S9?koj|q83^U_F*pR+?Aq|abOW!yb%+A5L{H&Ti
> ziq~^lB-)Vn{RCI0VZ!$lz!w9)bmx58pAP<5 at atWfRp7<Map296BQp#I-)DNBaFrMe
> zzt23V^7IDBU)y0y<ZprS at fS+EqF~S)A>DYR;=toP&q6Iv3MMP<eAmYf`dG)@V+U#r
> z6-V4+{QXov;fVXIaWJi(hwr}Fd97>Ij#);Cv(-Cy0s7a9<@bYBgA*CMpN>`yW!!N;
> zP04$uoGfPQa}zwbzDTP>j%ybcLi*s4DIU-J7fjphE^;rH04M&%{WQa2LF?I0vzHh2
> z!X3TNKq*l5G5ksv=j!+ at epo3S!K&CIAJK~J>gNgMtzuLluXvT{PW&|8%K(1wkmhvW
> zj at fJ?OiYWh)Rt%5oQo!b>-GI1>ONGdB?<9fAvoRjsWsg4U*cd1V&hUeo-P*OT1vAV
> zawf>qk+hPH89WTr_hSchEYtWI#&JiPSsS~;bDKRyH6C}mtt9?Wwi<=6Wri==5PSIm
> z>dFYwf;=}mebDbu_0X0+m}fNIFw#<{3|$Z~?x1c^-+T-RVU(4=ZS`qU5t_yY7opi<
> zhkKe(CK=k50ypSk6t8F+^bArVJLD9i<$}Ke$-!K>G^ZF9t&Q*&lqLl^D|%0;1-y&1
> z%t{WHVK}Pf+dRa8ni4of_y(esj<lN%X?<<Lqwp{<>X;9Py01$<GZ8<ZCuG*Oa%NH&
> zCZ8E(s`472(tpW)(EmL|&T<m`R?qXORd~b#6J7#<RY4MlLiD2gL7GD+iiHmXFqLBY
> zgY;Gn^i1?2WB%<HvGGA#lmXN4y=^w_#zroisTL4&kjx`=N2W{Bp|9vAtECUcuOFnp
> zpa#+K5M2we!w=EP at CrRde}O!S^Rig}FksIS=BrSUO?V5SJnZq5HXhJPu!eVdon*-M
> zu9fDD>Eu`k-pPOcj#0#xsDBvq>tfl%fr-I6L;05rH$WoxV}Qi9@>)}3u)Vy-gq=FX
> zJ=D#xX~pjzrm3kz<6f<VqHK{JLOJVBal$fM8GDqmhe3}06#)A^@%d#mH)kelC6?=b
> z8soUrkKz6QNdhB-KBo!hNuCiPMUS3-Ogy at b-U6t|{hHpq<n+AIW&@RG!X!8K#EAYS
> z*2<58TDJ}#6ev_c$`^@(pW2RBfSw%2!8#A%;7XFkPwkBlm<@^2OatA#txw~kXiQRU
> z`ZdkT-6Xvh+8||<WPYlYqfO?ggc|u|N};eR7xZ063l(Sjjkg|U;)P$+;t4PSwt^6^
> zwryQ^%C9rNe0q^U8hC$#pfXN|G{uk5NfXcX<M9$Z<I`Qs2z9Tt6aG#t!8DzDY|~x!
> zy>7WY*CVu+J9SkYc!bWRyg2PqnpRl(H`Y<X(U~?aF?4T{_Bu_xf`mdFjhcEQed--6
> znGED$owpj`akG>w{_asaZWNCF+W{DD>=EN_r_0!z0Yh+!_~xT@;-b at KQkhMO#~%Se
> z3$;oT5AWOHoe-HOIAtiNFX3Dw(|DKQnDfOlO>nnu6wyk#M8|mTD57hj{#b7{l%kc&
> zB$Jr=7|nB>>XQvv5_(mjd@{KfC`V&4=a>1E7SG(z)-u1M;f{JHG^6Oje#IJCTHjVH
> zsf-P66tacr2EE)h=ia?9xEPq>g*^#uHCxvQl00<vL?i_8&PxIj0pB39Xr#QdMxGRA
> zo$6yzJ-?Td_lCCOAxxW%q?8fO<SL at rCw}o5&7EFDl34+(W~&8-m5l2NZSB_eBnS_%
> z9qd3T*-8#?Vo}|(J<;qD;EIDFP~9%h_ziu^VZFjDD0NdEJQswo#mdTbCvBV7of1so
> zzjM%pWL)s!tyFld<Mi#aDbGei?c1nk$TBC7lk&*H%<iT+(C%DpJ511JPLqYu!R|FZ
> zYkOVDc>$+)jDLVBaEdc1V!xjt7A&WE`UADv2?VeCOoKV}aWv at Mt=wOS^XIi#<2^9_
> ztXxjB64ppBoQy^bswXw5AuP5mrx~fwfb{X~0k`%=qBX=f{_e9ZV|2;aR+4%^>{w1G
> z=<BsTYJ;Jt`Le1n3JoLl|K0APci_k582k&RP2z;#(j3J{!DC|CZ|SW3XF&>^;R0!~
> z at mVf8e9aKsxY~VC_OIq6{^w-hb7JdnX$IAcM}JF8=PwAD@$5a6Ij3bhJdLtMWDs~r
> z`HY~zcH#Da<FhS$u_VlYD5kobWb|yg$PL)MI$JU;4=ffdYw4=!7qZ!W<j-_r at k}k9
> zIsO?TOYj*cH2%)8yzyE1twsxl at O};^mVIL0<1{1ckNt^OqIyfTJx+7(3c`qXnTU#q
> z_qyQB`f#Y8D9B47g=~|8!2c`A%i!J)?gnuG0o*&ly$0MnLu=vrO2`Gz^AO$v;p^BW
> z7=&BJqmR?slg|7%)X;LXkkQ14)|eJG^AHpI-#=X}e1dKOYWCg}be(dsv_)d#f)z4-
> zV=HKSKG0L47?(6jmSQ$r7BFk;6=*a174&=UQv23Tw&eQf0VM4!=!K*gvIUbsb+51}
> zT^KJANsbi{tfb=~HV8f#He(8tbLIfN81wzVAwCT66AG9Z4a4+Ns1&mCqCwdf>O3J6
> z1}%{%l=$leUw8}}c-T<T(=3{vq{ZCCz2fhlq|;L^-O3C4i+%pT2Xjdl)0gWVJs~yA
> zm0;3(lHM~{8Hxh&gE%%<_mY5M>f-t{_s#983ps%Sqf+;7!sb^JG8n3d8iasZPDQ$4
> zBIlzqmuP<qSdn&?%NK>iXsS58-bz~BzOiLQKM&-d|1=f)bR(b95BvZ(CkFRzm_dlK
> zl9KoQN+E_Bti&we1Xf at GZsOxYMZs;Tb7YLk_X00oP^ERRL|%N&cNP=(XZfPxd1zW?
> z%?=>8D#^qf$VaxOr|GSZ%7D3L8g!^h?%a}=8J&q2W1;%Y2#gxG0*u;Q_6E!YB(nIE
> zV`-ToKa1d5+H%utz3?_0p4l40F;_5~>{4_acjc79G~)vQ9HLM_ih_keh_Vdv$F%5g
> z;(cRnTlgJJ<M5Wr^f?(Q^#a)yKReq6-%((})9kzlvMzvkGrX<Uy>-8|CG+iFO8CwT
> zY`$M(AzYO~vo(Z%i=L|rEQaDk)qSJ{8a3}CFOz|?LiqWj0rR?T$%@NcH$m!YfyH?3
> ze~x1wWaw#68;FNuI)iKB`7MaztKi)Q?-0B%0)Z=lw*<c+{Jw+Vf8ck?pUWw@*_aRB
> zw_;9s8!#ul=U`5F8!;!m=VESno3I3UmtZNJBAYW~Q4mlnuPtb{es6qs;$GVpy0XD!
> z*%;mdZMTSDtfJ{KvIbYtta09e`Gpc7VtIH_)qlo#YficQxX=OVO2ygF&~(RQR^vWz
> zo6fRrOG&oB3%G`l at zO~^5d(~+6htSV&PrZO at +HbBrv;Q-elSMJi!h-L$APPj!QDKQ
> z#Y%REeWN3YNzdBVF^TdL;5^hn!%%H4{RaIJ?KJ<G0iC25&pksQcFe(b00B2!`NGnI
> zIfBJd*!X<U8snq+(*#9fR!%7lS%;wSS!>H$odUFv6)w)1*Ru{>&cdvMg?;tls)Mky
> zo)>Ic3SD7QPD!^@;JWMjgl<>&`tA+g?(P?RHg-35Zz|IRzGv{o5xn0JFEsB<cU)-z
> zu}<YnwJ8WQrmop-(JMP~733%W3LGvL?U-6)K7>qz5LD}1H%NUTWzt!AL6AJeZiC;g
> z!$YzGFM56iKEVQwDlIGp^n#}2uFWy6FAYnC@*Srwdj5mRvWpxL at mClMj%o2iS~)Zy
> zLZ?CK5`SL*75_xRXIxrv8<4sZfdk?FCXfn-x at 1iXRQYHR$Oe$&R`?mPM7i;L{?yNE
> zITff7hz{@m5omwn^+JS7@#M2~V)21m0R8g<haCV?yqjI<b+*UCoZ1g$R}WZntMTO=
> zG*DyqryC57%uvwiG^91wiG{0aj)OrzI<as3=L&ZLLbcL#++YHB*eP at FPhjhW%%OJA
> zfObFDL)jyS@}B0sAL8`fqXtYh`xN*kSlJMdUT&|AQubGZ>yDvsX at f3WcEh*Hen+4J
> zGR>CmHStW(>A5oKwPhpVY=i!jd#SLfU^ZTBYTD}7Lo=$m?7A|v6_PW*Fu7oMdrW73
> zm%@$e3;DQ~Y=p4EgD=t!eV5Xmfj)mMQZm10xX;(DhSDB~aUtIM932;5P|oH?s1_8r
> zNc`P%bgZMGJYr=S7>If_3xUSyaAU%w5lW%;gMlo7POWS(^(JHLS|Z$r76se$JHNS@
> z8?g%M0Wq|oJdo)$Rq#Y<+)}W}uZdU|^b|2GUUXWp2pW_Pp9i(VC at F`}yd6eYMd9KC
> z#~tt9XVk2XMax-eKyU2=&rL$PY{E3D^XrS+Av2~$Sj<^vq!>tFRhWEMIg)23<grGq
> zr$U}o*_LY&Uf|iO=!yk=sUOM503+(r5K3e=HEJAd8}S5NQz0J4GQ at 983+$`}qJTcA
> zkPqzirJ~tqyEZ%;)d30>GN+BVqVu~C`MH6mmP8QlvdA?-KpUTTd at 1WAm7?;T^tse1
> z=)JtKAW#ZIL)^}i&b*2qvb8J(<NfN3Gm6JF&>;O()H!IzOyC{;QT<c>N(p#LyhEqI
> zpuZ4E{AKbAOIYL~%Yzj{huM=yrD|97zx7=@uO;}I_=tl}oevCWeOP)uxB^v{&b*14
> zFvB;c7rBPg2EDYsex0;I_{RKvS~l6p5^y0!+7_&E(etEh0#kb}c=7R>lVXR1PNC<;
> zct*414Zry;CNh}<&{{<k!-KR{S2wa?uT&`3F#25L$@WA{(dUdzxNF<QON{>d);3&|
> zu;)=V4CxtC9iwhF>YOvRY=%q!<1{N7eGtHL%}Pdn at 0-}!*`)`7OsTrc+QiLHdgo*{
> zt|rQN9LFZ5Ody8X at 6*wy()SbOr(S+$$j?kMzK&+Z{MD}I)Sh_<l~Rj1yN;%DX9mQo
> zI+{5FyQ(nx%s>lg(z3Xw@*}E9_qA|?zF at Vut&Zwb&I}0DMABkSge4gjX9oCP<Qhma
> zw~8n0Xv)OX at +6N}i~`fSz?Ma<{0s&h at P`%t=;1N8wq1;`r~2&EWzG!UG?Hl36Dy-=
> z?hDdo<JD|J2495V`{6`!Q9aGc$2)|GuE&?|nGbWs at qL-nUt90ot8cx_!?lh^xyH6s
> z;TtwlorS9mcd5npdOBBL=86_*mh6}&(8ZbsvRaTLYlr9-XzI8l?YfG3l5F_Zgw+kG
> z;Gy;>T<Gk=Ypz#|K7podEFg<L1dZ+xy9Aoeo$3?g8|XO2y;7H0&_MOvX^U9VKySwP
> zng%-A(a4lSS)Wrf^iiLNDUGQcV`U1WK&i at ozNz?v`r<`D$BvAEqaQV31acy#ehpI<
> zE<J7WtH71!SFj`gALo8_>Z)<qsVhLffHOZm50S;V^mM6l%c*{w$MuY5=YLBr3E}g5
> z!{$b|f*lp7tpQnlvG~v$nvvWdst?ZLYglZ99<`XQbWD}FeGM&CXYIgEb7_Hiat%$p
> z>C6wPi-qQoD(Xly!lqqSXr2 at 8=Y={LSq&l1`~;yP>cb2Clrm^0tfdn;mrgXUrBgLi
> zZQAwI43AwtAU?I0PM<Z$@_2T?MgNh_+?bM$gUGyGoh at xPtzcJ8OUc=W1^(ni2}Gy(
> z*c$#%jYTVbb^*vSl=__5v6kl0Vo~LycV(qDxsP5b%-pvJhQ?Rze8pyxj|W|kD8w_L
> z4xpVi-Rt7>E_!S3%V?}+&}S&vnAX&CD8o?D*JjUCOu)-fnNK?58{-8sqkBs1aM5w|
> z{xR4*B;EE6Hlq<SIdR5t;&ufT)huUN-2MZ<m|W|o|G3J0C?BJ)#aAjr?8Y?Fw2tPc
> zTA0<Sae-v9 at g+3IeVID5gL90}9%Uk1NAE=>bh*U~>uAZ$#n9bH at tSXM9SH4V-4+%%
> z_&FXvDqMP&`vfL{v$*2pD_ne5!BpjyY-X at g`lnd6o{k>}v`wdA>H(cr!4hzS*X at F~
> z0M at u##m4nC!>W+UF6aMr&=;@+&$At^+Br*bdC>SM(3KRbvS|4kXktbnSgyMr*JsG1
> z0vXUt|AdJNZ{<<??-vKw12zMCr){9K at m;lnPDsMz>metIg$bcLwg9R<C$8B*Z%O<`
> z<Q_L?2^5pfE<kfnY at m7EI<?rpfsP;b3p_f<OaKq0ZNM4^>w>4nNp3pTk>M$_s}%`_
> zinGKQ1Kp!yQJBa|Vn!nmf0lsks0QMp@%+Ua4)27SRTWfzni!$2qzK|liAJ*Q3mY}-
> z@&Nd+Fl+OQfH`83KI9D1{-Ey~Fhv%D;kx1FwHM=tR}I%yS+vEmCGuJy?h;N6)?G7T
> z<=b4IEp|PJ?8(;=l%OiN+SJGszrxnY)P=jw42s$pXzG~#CPiB8T|N>nRGj(I6i;{{
> zfj>$oMAHjY_sE%R7>ZZ4TuT5l8oribQjny=(z8UG44q3ubrvn14eeOP<{J!sZ2 at y|
> z4y5~Wh%>s+?xGomS!c=7 at c<nPp(%xn&tOg0`csVcXDK^$;b>PZ)**iI0v)T0#ED<N
> z03t1frMyTp97CTO+dE<pd*a|>(~?@{wdDZzBqLM at gIw#4veLvqGhcgjcNB}VYpH at w
> z>{t2K7$3RH{#u6M<9Vm5le;M2r*-XcgZ|%>x)MH7lyC8=v0 at X+j*}16;Xw|?3mN`y
> zW4+ at n9Xt&GWrbO%%MDH`w{Yp1L0mEG*#O+ku2Yu{J1!q6TyeUzaPjGRbB_15p=r;)
> z_0o}0U7_N1S*RYK^FsnW7laz%Y3+##t?5~d7fFr!jFBr&-A1N{Puv5LG_Zwz(Lgyn
> zj4vN$@@AJlm^=r`d$5ijk=D7}LGXL at s7qY95!kl%YREF at K+NBOb8?^ee>M0C2+`2@
> zf<iF0YCx{hyH?t!xoh?*T2oucYKi-ITD_aW&k4WP at Out^&%@6Fzg6%Ptl_RlaHr7l
> zSl|9n#uO%>x-85uEIQK>n8<v-gzKvh>x%(R9k1i^1N8d)Y|YSOMF}oz^z1Uk_j-q>
> zSyd<B6&-N{J5QOuhg!pbodwh`{9_D!=O6Jqn^pn6%nJ^G=+WyR%2c*3B-R at K??luT
> z+9+7`Ny~=yh8`R8R>*ysEuf{$Yw*>;`v5e~;MU$ymM0>t_znJw$PN%R)&o8LFdm4)
> z>J at 0KF|BE|PXR)}PJxS%Q-rB_sgY)6`0(DBAHNm2L8o0$c_9iCsZsa5o&jM1;v`Pn
> zM0IJW`p61J-;HWLh``Co#{4RaShI=d<m_&r*d3))P at +pFVZ4k}zBDEgUGjZ$F}QCd
> zzPX9!j{AaH at u2t*LS%LoD5?@upqJ~b#qT!J!Uey31nq2EiJQs{$xs*FwF<iE&!~sR
> z@^N47#Oprwj|x=E_ at TC%5$caC<P48B;EW!HSJQOmiT7`&d5+ViS_MB9w+z(D at -c&F
> z5TyJxT-hwIH6?(2rXU0G`yoj|`~50;r$Qw}4IUO0 at Kd9~qW_Il1CgExQ$-nkG$->n
> z^0~g?c(Y#pYm3$qc4c13WD1w~c0G*}wOgphvCN{^tsK at i*%<LbU-QY7Gv<ST8u*uZ
> zrsLW6!WCx*u|nIHaJW*(!kwAGWG|ODlx}DO5T<KrVA(|SVy`8*+kwzsV=DJ?YxwHR
> zsO`AX0(I;j)_t at Mc`FRDJ-h5`b+jS2*9&j?Ufsb>ej^r?9os~9mH=&BeC9`_k4+?e
> z2UZilBV2YaO-{MGuoS3T7ErUUEi}z=CJbS}@h3rVeUCFndmPNs>R~>6y$h96<a~Dl
> zEPVi19}LGKc#5X2bd)0xn$<Jh%8e0Ug*>3ze4|Ig27Z!a08hLNdVpIVz-<6z%_v#_
> zEE6~3F3QJ&1vWgPjGAD~U%v+klsuo9d6qr**ija8y3%YOqJAhcPD9jIL)5M>BI8ub
> z+?S4XIbTmedggNoHO|`TMZ=ZwO<%M8;^{j%l%oq5pSm0{Hx=uiBosT!O79KvN<uqh
> zp~IR%2q>(&Di~w|!|;2c{Y(1QNQ-}L>z8Trj~~LM;*?$g1Y}%otH%pW;2YB{`cY5H
> zUwqwHfw%0!7pGaKje63bs;j5mPtvdcN&3~8eh9ZP$Lhcm|H6vB=@`9UjTsShA>n!$
> zq&H?<|FewiA>#yW;<al3<e?L0^(0~MT;Sy=HPL*><Ni2Qq#PiAjhyTWze;|00Z$e6
> zMo+ndDOtyYaCj<OUjr0T2pO+9QIo++<ChClVLDad4x7MP!%yRS&Lx2tN};?z$jk;8
> zLDy)Nz{yJ+sQF=;d+baH at I`VzJBGVCZnZIggYJg2;jy8HU?t2~z#8xZQ`(e{a3 at DB
> zEDm?kF2-G_EgSSeTbkKI;r<1LK5<#-Su35m%!k(4O_!p3qS}byvpr7KIPClhKwe*g
> zR5iGR#4eau at KaW}yU1dp;I!I(@WRoHeSRJ|Oqc(v5MBPDDM`q at ECfm}^OA*OMaAN3
> z5ty%)@21-*QHO+HKBNda`;-t>Exskv$;gy$aEV`vG~KZXiW@*%AOJu#=(-S)Wx&o9
> z$cg+aq-xgyV=41x%5s^-BxQ`eDRkI`gxzgKrdKjsC#}N?<#L}JWDPqB7l1I`=Z-E`
> zC^##P_2DEFtOQ)pASI-VNDo^~iY{@{OLS~8jYg{3w<x0J_2V_aZg^~OKpSK817 at TX
> z5rOks0+67vtSK8Kp4dijEj{dclr2EsyHBC3V+xs|M>1dLlbx!_t^hQyPHtL`uAa$_
> zamtNxMlM7se~ISK`WEU382q@!KYF;nl%e{rFOa*jA72|T^uODXqZ9YMMANFzToXFN
> zWhcjiY!}@%rW}MwY~_Df%TEVPua_gG^zw2!GoYLnR_6H!l%xqNVGbw(4#p*P$UIEB
> zOfh(n{UXdu_I5fs at p~(Ib&mWkpY4U`ziY*s?R3nXFEFU50Ozw8vyrG>?ehPG+Z~-H
> zvw?UC=S25;+g4$Q|1W3)5-8?Xaqo7J6z>zI?bI68+ at mNgI(1o`{W2|ZyuF*GvsfcA
> zG~K*m!sP=XYxZ at k4KD)!GNEsOw+5c?;qW>0LrCevtv;PG8KhPobyrVYfHnMYC)X8)
> z22aoYS6)`F>{sAUtu-79`_+{SruQXCC*Uj9@*=YdOY+OMv!gzN`SH%HESIJAsCv__
> z;VapOc$k-fK^9Oqi5p5jD4hV5q(D at 3UU^g3p#9XHl+H3MlbO0{fvF~CtTE>FqJybI
> zi81R;zj*TwU?Z|5lRpj^+<x}Z><kw#nQ(jK^xZ9~@ce~r^5xOfi$u1Aj&qcm6^$_v
> zTn^Lz@)wW$rZ9EC!k2>gL4_V<`q_FHKRZjUZvpoI^uiWRq*bSH1BSI6J_}H}YmGlk
> z9Q-sfl<!OMR>%tgF`@k6Zp_u4-%<_$Ti8PVUq_fdo0h~&Wf(`a1bB4E>4k)lWGvF~
> zhBUL{RWh!+kNf4t#2c{D23WL*EwoJIssiT7?uaxKKKilliG~bmW?- at 48{&(7T^TY?
> zsexO(h$kl8U4UCaMp%>~?ec-1nBM5iz%}-+M&6~qkExi$fSg>f>N4~|Uzhu!|4U$P
> zwi{!R9B}K0c*7mQ8)o0YD at Obk=(A{VY6k+p!!iv*mJBInfc%S;{D- at tynf&zkHEj#
> zsb}XSYmJ6IFySo)9y&`P4(W(Ad0#qkZgb&Fm$8NH*FR?A8VRb1wZ|E%dz#BDeX%${
> zex(l8!^k}!QlRDf!9ySi9vYnQ)EhM$b<(HaXjC@<)JR~X1-&;`C<~N+oB8u8e00qX
> zQ}`U<vU8BQX^<qdqvi*M706)Q9wf3xP4^mE3ysFyEq<_*<}1C>Lbv$cPMX5K7%Qq?
> zp}A8w at ry|a7(g4HI;2sQ3uN(1dlsKeqJ^(3lIaw{l+p^0W=ff&{S~S=b;tXnZCSk9
> zbLU>pMOzbPGfgU)jby|qbRdgK8@*OsIAu{+*ICIco8-Zth4i4~u=w69bo^489(?~C
> zu9j_h601NhkPCX?7OJn$M=ub-oc$o5mGVWD%6H7&9_a#LUv{$<fRb1DrNgs7<b*O7
> z$&%UPQ2h%a{=4^xvpsaej8j+JwV0wk4u_d{VPuV5c9+ZUI8<b*;KDBqFC at FWM7M|L
> zN68a_bgy{8L+>a#;Y%oQAo0U1VJ~Q*$LFIJO13^=_K)jP2~&9mjgq!@D_s=6MdOMB
> z*{5(M{S2|ZnWm0Mrg{P($G85p8;ReT at 8rvZ>ze5#4%orBn(27Q`=~zN_x=zj%`~LJ
> z^skM&sjQZ~$$YjI8{d{ubyNge!8+7(L4$^@3~H-kxt at O^UuLN8dmn_zgMJCwiYw<q
> z+`D1Ee?b8FdRZCDdbkhr!?%N;NUWg%suOCCDh-BSZ}oIW<>VerZYb}2Uwr6Qnt at aF
> z#tzZ_DjiQl;+wD1adffx2}C&X0*d!Rkc#59Eb#~kIqiQLzCjyLH=1>UoxbdY86eB+
> z?J1mIHYaKV>0Nm=^;n9a2<!wXjRGF&e!~VdybGVn19jWrSD^1ju9IGj3RVv?R96dD
> zgQ%t$WP}WsvJR0sGYXUJhINp9eaP8cUwG5C=I(}Gp{Gtd at oi2o->tl;wh%HWvO&<O
> z_G>z`E^2NF$%fvv*E6H0<alx8M6S1i2mYyBARb~Wth at G-=-WjLxw?Kaw2L}NWlK5d
> z_(H{u)&6K)+CTXNjskJbZkm&Lq}wT-=%xoJ11Mt2bSjDmcGJuWjcO==RJ#r}Nlr$|
> znRv`}PKm{cgS+We`g^h9HJTDFC$$uEP-(?$G>5JfSH4Cw#+l3|x)u6N!d2vugq9^O
> z+grXWyT;X4U45ZW^u9(X-)X@)*-E!;K!G0>V>z2K=B!#)K-GH`wpwCBa0e{R)Q(?%
> z%g~pbpt`sgm00)n;ft|1gf9~dT4?IH_F@?6Ft24c|NexUpH5=z(>P^|XeDO~#hMnH
> zrbm0OLPn%WIb*9lV7D-h^tf|kP!e~v(DYG at Q2#7o!8=I=eTh%678KGE at nj1fH^tRD
> z0~v$=2(2>_S^vXYZx#S|{<FHl)Ow3<7g57cqr=-t>9*gBDX-Hxi|^$L`D@!2JR222
> z_q%OdN8InX{oWAU_gUMk at I2hM3!Wdh?S|(kZLh)ebXyBN{cW$q^ITgiJdd@#4bQV;
> z>+5tKtrTx+rSs?#aaAiVqECo>T4^p7#M7;Gl1et?yg=mNpfm5y;I}em#TGK2srr at G
> zArk1)$XC?d64AzJ;(+(pyj85NXK2orI`^1J?U+5Y1PUSiTXW=v_AVF~XRM^@3l=TS
> zfZvGqHgW44G%)j7X)c>+Bh)jn0Q#_XaIr^0YDg|=B&OiA*p~Jid+S`}ax$^yO*-oy
> zFVh5aWQ*A^d6#$v at MYn)9(RlPZg6MH?qYBGh<m!%JmQ|_y>rAp)w=-Q1645L<^@W<
> z6QobY*?*+pQ<FGp4}Co68=HcylAdFx*@ThVl<2+Y;D-?AmOS3Or7Cc3mF9 at PJ+yw@
> zS+Cl*f_bH#v$MA9{n`OMMVCF0^wxA~lDOngG=G#9_mv`-cMW6GCL-?m6U`k{Yysv<
> z{^FP$B2&bF{)tY>*9J;uTZ_aPbFMg0>MyR`%EBxkCz$P at TlA#OrXblYH?UZo_7=S>
> z`MVo|JqXh5rUT-(w`kT~_u^s}Gg-+$e=}Go>*9Z1xb&?01n^ToxMcA{ZCHM6^zb at U
> z-$%$^9su_2fB}9M_?4s0!vmFNTFs;??F-B}Yg3n~eVdM&XG5kUJPB_s+`bTX?T30&
> z9*q?oxdYGJeQWMoXd!$D>aG3cJ5579`^ejL{M1yPg2f8FHGFY~q2SnPOAXC4KbVs3
> z;vigWh(9*kxZ$iixPeV_si88pxbJORbWg<6qYtqBBTG6V>-DaQ6{CoJ-<V-}-$(K~
> zUkz$X<Mz8T+MH5sOCY9ZxBAOl?KPDurt+3Bt5j=z#GK+fD%<^w_dE`Lk|(_ at TD<hO
> z^aqTon at +a8<BxOy%3eI)cO5M^HDZkTmX|Jetg at vuWpILh8!e4ka%`9pn2LgOTLF-Y
> zTWwRBQW}iJ2ww!Iq7_BEnp5Ly79Jf=YW1g~RVZVsxwcr#$cq`BS-`Lj$G+r`Doozv
> zJjmnPSMwi%YmZoq><mm5D4vNC**jF{SbIPCp>y923grK)Q^>$Iwxoys>2jSfq0vI9
> zlY-Qs6*3?mW2>;-VqPFHHF2ol18%iIZm5}HivB;!#;ySe-gn4`t@{6nPeBh6LwZaF
> z)o39Rxi+Z@#1M7x85R|}wsd=2{~lkG%na5b*RbibMayy5SI$Q)ZXQJQw|GXuO8(4C
> zlOq at 5K~tWry6Q9srdq=fUbKdj-U;FCAn*JS=>mwm|4e5(#sS5CA~@Vd%V_2eT?B~o
> z?wkmyq+6NlI=F`2_^CfC`ZI9<sDF}iX+gEWAQCeI?(x!~T*9rx;KBUYL6wIdl&?R3
> za~M|d`B64K`mcyRi}&raLRYoO{zB6Vx5rw6_xL$j6i?p>mcfG&un;1)|AkJUuJ(`H
> zJ*`vOHL5J6nFe)ghYz?UB_$ErCVV(t=2tb8$ZnGTZ*kIIn&vp(v32G)5M=7SEr0(A
> zCM~04?>cA-m$bqk?c!{NYukOBG5-(cmTBXz29^X}(o{j;T82QLd#s2B9nH?pLtW#6
> z{om6 at f=3RfxYfqg-Dx0){1N4nHiAC48vJ_#6>Y?#jXDV_@*%~vByV8JpaaKd8S^<a
> zSUTR6(s>9t<-5viIqJTEkm)Z#T<y;{K3lZPzHQ#k($kf at NSN0W?ZG%%FF2Y#)So3i
> zjUm8tWeR#fUWG8EGlJJ!LJAl`kV-2(t!*Th!Gmn#K$4Zb^low1c23KHEwp7ohKH==
> z9~-2n#U+2GSz`=%{!*(T^YBP`C&zqU(~N&CS|x7#D=l-p++93#EH^+vm at 46>vv?q>
> zgR))Zl1>g+1)U~~mTV2$%}Ra+UqcpE)|2qJu at _~<bLh=Gjhd!y7HuqN%x^j%_h#<(
> z^rE-(IBBG1UDG4o*ic^l at HP_cLfr!0-LVr3D=Nf$_R$o|#FhJ~g at ZP|w~xN$xV=(A
> zI3F&%Ul5x<NidE(tBuSV0d-)pG3HCPaoo9L3<)fTzN3P^+iB98G}7A5YHd1G1^<Nh
> z$vi>SWRli;sTOcQSPvl|3_5`%q{Boqu4q-UwvN*#Fa at V)W<r>&#|f at dU_rxUfg99=
> z>^hZkp?acct64g at vB<6Bckcq4Vdm`|$bdY=x_H9I1~rf(O8Z+Dy|+YKV<RzhF96Ih
> zazMA%0z3RCNE07CjQhZz`(eW3<X+IC9UUwMQq2oO^MilFG+2t2Y<mjQnG9*R=H_+2
> zy8$gL4XclL6en-z4vK5rXl_N(GGA0N+0F%vI6`bEXP_HFZ{EUZ2aDz&>sV%*kWG?o
> z1jd8YW#b7iYf_BCQ1C at VXq_AqA9Mweh=Xl3eK9yZ at ow50k5{vz1`V`oo}jlS0OO<x
> zuEIHS+rpsTm+4sn)HlU*n=jf#JQ{Kzi)te0cthIpfM2~i5B#d81^<Wx{}<x&{d96d
> zX|X<@V+VOk;^b2Xt@~;IE${0SSkyih>ORTm7M*AWrW0Y-*i~vHj5X2f5G7r6B*;F2
> zld}0uBu>f^)$h^VUrlEk!D*$fF2Tvl^mAE)%tg at Gn^~?96)4B+$(Xg5mJz+JitvrV
> zji$5Q!mL-<p&ESCqq1m^l^z--L*sr7eAp;!c-kGlq at Z1zDmK1HiyZc$>qvw^seEbe
> zy;7+(bvGI>8Eze3BYXtUHqJd(uu9Ma0>%f|W52a5u&3ZYEalLiCcqHJmRJMt1cak_
> z53o9UAt&$^CBRjLn*UO9KlzWRsKI0=H8K0r-6xG3zOp?4H9&%Yn_wt at WnZRF`021q
> z9t*?n>&URf4)GcGro+56hfM at tYJoB4D;O_O&4S>~v$JFMc=Lm_6GE$`jkaV`<Aza1
> zY`|-^yiccE8$CCbX$Q%*_|2m$6r at 4O@Xy+t4z7(Og|!VAW{l||l4rQM4)xE9n{a?m
> zcHDctxb{jxA9NMhsyIH2X*%b1Edrjydrjvq(ShHv<9G*T+-h!gtpL6#n%A)>utFDQ
> z69bF+p%A<g#wF|Y1V5BKH-y^cP+M at WwDE?}8i$KwYp`8%A!^%F(uSuQm^%2j^x1-N
> zxX`Yii$^=3ZKH15<^<PMb~5)*5ud*m5Q9qLZs+U-Tu1!FA7r&iz4V`;y2&JmydwQF
> z61G{}?QAk3_=C5#t8nWZ1fvAv|7+0Up%Gg2hh<{r-)KhGt&zLAUivFj!Q@&3u0w-P
> z#1)UVGqcNJoQzcYZ?w at +w5*t at xR4t#zedFY at R*7#R22NiH;Ly7*Pd%gJC^oCUK?j7
> zyI1Tb(v{6XOTybQw2c!V_<&B0YQ+iphquJ-AJAM`S?TZxG%E`D4=bI_i<ds2W9TnM
> z)ra)qQF{gbz(OZXS26~vfZHjP&WLp%(#aq>y!9c7RR0psd`NSmcH3q!ZSZd*=c5a`
> zj%8wnj~3hvw2*R~O;5_DEGd_0iA}3xIzZYx{W_L!(U-W!>X{n9Y$#nBrW3tBI at M7e
> zJcWvOo)w|S;CJ?v=&4P-pl|28V_8)9?=Nqa_J+3LnU>4C?olsU%7~_ at if{*TBRf<l
> z0BMfgju+B|*1QV at s3)#B8SQ}b$!rYBG6u8uv|0!50sUKMe??CW(EP??t&1GY7_LQJ
> za*#$v4OJpOc96~*HC*GUckjDiqxjxInm>!k;7JI at dF|dND|u>OC{{X}q+k;OyT(Y*
> z17?j0erMal3{AXG8Hx*7c5{9OrV-N)(Xm`nqgZ^1=IJ_?neooUL~a?tWEsLFSR}4I
> zL?628+<!vRSJ$~|X#Illk5>mj58C$<JUl3~iQykNv}=GYbqDVNhGPaW9LEAn#MqB$
> zmLq&cMpE3)+y4Au^Y!^KSTC(b?A!jbjHsp_=Sav72+<?YgL{zdVAq&7@~OH#2DsJB
> z0w?{mjro<nxS;Yw=8t}lz-X-wu56lSOC)VpvaWg1GdOSVv9sFF%m#hP>0syCA^H5p
> zD@<L{!)MF#)Bmu1F9>y;1+N;Z-DYNpJ^p2=&c2F98TK6i%J}kEYQK_yn{nW3Gq{g;
> ze5U<y6U#NmoYh*%#;^A$wwYY?0^MKI=5tNmf6%WJNZY at J3=|t7{`CHP46#=#FonU9
> zcI6I3Jb0!WCV(sUs(C*NP6;)5l~TiO1<{A7U0ogv;nn-cM#9~PBQg79AoO-QY at SrL
> zV}>-xHiNWzmUK6G8>B2C9cn4pbKi(BR?6L*74ZeXmU3YZZS$0LH<*W_b&&X;k;EzB
> zvyb at Fz;`eDz^zC8_oQK^DC|mAAaq|kOjA=EP$su!k%C}ag%0gwIY?-YS0y!w`j6>&
> z$8hwFpGRXjP=%XAk=hibSTceCmdIz}9i7q~fc_WWc^*F0AXNpAgWquVvUgrn3i=_1
> zMViC&OoimtUP~35)lDP<K&cbL%AwbI^<Ir%0r0vc9{!l-Mk$)!HI(;rV$a8PN){yR
> z=5RU))dSKtm+6(Qwv2>rJZiybo=TLqOB+P<Cp4?*fV}vkj4Zq0&=0{pGoT8T1nq(u
> zxZdgzx7SlfAUjFeb}~^u$<_1;O`rK)z}&4EYLJ3dhU&47pq-xqjfR@`PJ$-Rf%=@~
> ziO><-`MZEo*dR)u(EO|ifLILGvG+}=!#PrZIdBv?GDmUqr!-4}t*ri(PD#)IS&r(T
> zwW#$|n&W^Lg}9%8PPbwhZ2Kv|s&p8)@Cs*X&VDU~ExIAB8aw7{-TsBc_-fllYGx~k
> za5fI&cI<y35(hC4KvzTD{<|Rjg}g{HHYMQ^g9;U2owki4YG at F<sE~1Es3GDL?R4%q
> za3HYddhyue9C+&F+OLSm+i9u-Q+Blj8}QSVdO2mbG^abtmP7LXH`MD<+h&pi6Rpuy
> zWd8(fYmU%4v`XB0gpP4E2tKLv${KH(T&hVf6_Cz552wS=mV}hvGBdHngx1LM3m`s6
> zM!Pr`<(=142WiSf${sF~#?M_DsT~kIFpSuc(<VUKJrP)rB9(wGqX6=qT6k5<o*Jps
> zkOp{bIZCHHe)_GC$*rn|e!30dQa{p9O0p8d>=3s3hOkvIWOQWS&=4O*RwG5AI;03g
> zAxz4J6bnZDg6y9^;&(aZfQ2IgZrN}3Hgre)jk5ptk@&5$zhcC{P4?e5;@<&&o|KO?
> z(E}Zvb}Zcxdu)P>j)d-(=CsAgJ_mYR!F$(8<R0*8M|@uJ*++bP0Scsh*w+R)LG3B!
> zn*C$DBZzna5plo#IXf&!<m7nu{s%DLt;Sf8+44||Ly69uJlnOxM8=aLLGEKi+STrM
> zMU&dkqfF5R#DIL!r5awM4eYcegf|Cv4yxuJEhXZl<1~l<Q?wnYsf+(^U&dbv at tb3t
> z(mP|jCW5Rvz3S=)mvo;gWFUcrSp1tkdv;RNggm3>Rf9j?sPXJ=V=%2v_iK%sSJK*;
> zG|3-h)cm2kOsmf|#5elH1IKBKqo~$U0P@$t=1o^!orm_4iXP1Y>Ab1Yq_OdiaDxe2
> z__pqCrh#y8q*k{!*c+*J3B6y%RO?mc$=g(Ks{X7>i7HPX{@)gr7PUO)K-4nz^|12f
> zC&2gAjUkTY^8X+Ib?VLP9qLo?zeW?QnW(v0Q>M9F^MB{bj$RV|P;|uIs&TYw4rxwn
> zzSdmPJRd`%lcJYLzXg%|qCb$66vtG at G{yY9h$rGaa at f|mx8e at O9gRB|*BN&?PL4^6
> zq!>udOZvYW!NteMYvXnCDUSHGczt|!d|v!QZAT(TElK)rDC-kRZM-zqH`Y$#Qc>SV
> z)@3;FSK8GHyp{fbUK{Xu#oDpa7XA1;<W-#5Km|yCG}aYTcP3W!sQ(e^uon)Xx>F$G
> zc}loUMJBQEOL$LW<bT5R;CxZ`w(#5eGQySHSX_sV{I1IQGH~jbPS6>n3tZBxI?A#v
> zgeR?O()+FB1!u5YEdC5+pf7}cHXqmc8qKIA!A$Jo;H=N$*;+x*ECOY}y4(<)by?|l
> zihBD3<yF5*HX%~NYJ#)m^z*Ic)HpfhVS$4%J$smy2nyLHp95}uKz4E9x=(h2Y};rD
> z8u*HBrXws~_>3mg`Qnw&=uO!Lu0W}DY at G?_ccpM1q at 5a+WIc)q at bJ*y$#=x^lQh+#
> zVNt?dR>mGe`8qe-7z2DWNg=+}6Nzm^$a<shjd~ER97ws3tAs3cV_S|Bzq*Y|yWTkT
> z#z)u=_nU0uu)MvYBv1)Gl7T%U_f&UbqB#YZ!H$fUo(5r|#-{~VH$Ld--X(s0k|sK~
> zqV|V;voX;ouqyA}0tvoC(!uo>xE at CdY{!?<)0JCDxOv{k%CeMjSgQX=`bcBPdhfy0
> z!0WdOdI%G+;uEoWUH*UxN_`FA*yv*(zf#}^vZ1-ROHX at BK?oU*&2fb4AX{tj=KY%4
> zQ{DRaqTi1>5c at YYY(P%hW#ggbWDNAtL<t%eS|{L2Qg+bMf($zk?i}qaY+^`*HvBeM
> z3lw927J4Vb;mVjmrEvp at M*LU~x`ITbveaWi2Y-7bq2Hn!<wHUTh-YSRR-kmCn&o;6
> zuf7~8^)AH?lb1B`jqrZVEQ`;(UD?K4&v%$;E9n)q4z^jgcT?tF3euM06!hyXOddSb
> z3;kfqXeI82?AMrG+zjtrC}J-9KGfs734-QeRGF4uvuQVO2fs4-g&eL5eo at R%<Pb#v
> z9}ohdf98X}&P0$4dO^{>P7LAqi)T*J1V=l5cJEg(Cylj+`^Lf`$hC(1C&}nB39}$p
> z3RyZWkqr^`9+hLJj>PD-TC!TUkStq)?S1chPTBwGKxI=clv-k?PhFDTM0R&Y%BdPj
> zxHC{G_DiMJy^LLTNmGGoS`j8q&+f6vv3Y??tWH}?q63wk-&ORe<l*whN8s!4QVgg=
> zF7$V+TP=~4;(`AG7P2&WM7;1nwB)X51C?)ojxoU_(9l at hbVq;Fxz775dX<;#c`?w-
> z$_w_q=qQ2OSK$VRU)fabSL~eCL^|)+64uxizjIb6-<1k9>ZYoz^{XROnfTOcTIBc#
> zR;Q~aW8pUrm%Qq2A%RU46g|AOK2TYf at Z(=>gwwmCEQzV63wo)vE4D0su+XNhUsa}8
> zB)D>I88O-mB^M3BBNbZ+zwf-Cd*eu-x=hP0v1!-pFXUW|3LZf|S4UV}pfWhsre8nx
> z!n}*B2wU$+*!EAAG&Q&ox&WffwESV4e#6`g^SYv>sW$Bf({Q-rq)qP%Uzk_XqhuJf
> zjznUha6E(}7d`~z9Dvp-=q!Ud*&PFeRtHe-f_x7QeQNwjN<(0A<vVX7y&5nDN*~(I
> z5~PJ&%=~ocLN<{_3l=o?UCFZq2)V5o_2z~`BL&!97POsP=2zgVI()s#yFiw|2K;oK
> zqbiaJL5pCmd-+DNc76-(Ng9eDH`Ko9p;py`{{r~Aq4){l|2K%j1GsQGmeV~>##cPS
> z_X<Qu$+#T`c#ehgAN@)BUmGC91uVd#CG(&Vt*m<kqd=MuZ$Lwn!UtSY)9+ZBH5~f&
> z2uN0=OFVgoj&i&|RKFgBu;!%4N&e;#JSRnxC)JY4k+$-$z419NXjn=6pP;wYgj|TK
> z=;gP|Uv7u75fY-H8a$~%Tz|)d1;9wgADdttS5%9O->qn6Qv*Nw+R(nMIFNBf_Xa9)
> z;i>QIq4$wMWuc<rG4c7c0O7GFn|f&NeLMG0g<uAmsYI)1_v7+aPiLSKRqcD4BU!&c
> z7pSb<!on4sNpj(x=9KbEUxGlr%W>D&^%6;7ZS8v81-6og(f)Brcf^$;0a7cGdTq0J
> z^FoOnx>+y at ne2Y1aX@h2fKt#mwMpwMwuJu`DHansR^z=vKm^0mdgCT at iVVQUu^fxi
> zu4FD~)Hc*Lk){$It6^m=Fs1*!FHi}Cl&k1bTp8+#r4i67E)Dq~fIdt1X*#nY>}v>n
> zcq)v5F%VHT(s{1yuvh#KcKD^GSJe%A-79Q##S at C7Oy#}XN}j(xG}@=YFk3pC5E?B{
> zgcH0kgX{6o=<adG$;Q*Rw^>0k2!JwUa_t<QqS at Y?1!VURAk at zI2VG3x5?%kGxsJPq
> z41t&KHfqE?YxsB3P++=uy|>UxnGeT&u*ykrc*0vRlt49&p)BctWJFa5%0&WTPY>0>
> zGcUL}RPSBx-Nhd6<KIok9g9`+1hVS4kkePe6SPzuC1HJ0a(xDC_?c4<=-Y|j7rdX#
> zNtZydjpg>l^(I2(VP9-8T6#v>9LV at dc$@oR`2*q3p(5V7u~@*6WX3fa4r<Eu{9!>4
> zqz$m+^nCzdkmkV!m^_eoZ8ffG8RBibLJl<`@pxH>^f!S at L#%DrK%SWwR_yD*gy=`#
> z8wY>lJM<IZM?di${)z8nAY#*+p0Uyw+XIy!u7e*8?GHD=&kes9U|1RcMMs<dphL|H
> zogO5PZ0S>P4C)k~*!pc|QUXh<=;5A|XZ*xKslZtFK(#mP^7_jSF#oSI&v0iOpY2#C
> zZvGdY>R8;zvpnxjY+hjTWu^B{##_nOX%!02>Ro6h4=)3k#e0vHIAg#y7xBnB23)h{
> zJtCce{K&$PU{g3(xu{JKtU{Le^WfihM?oX9x6KmDY=pYJw at C(ODytzUdii#>ZE3=6
> zosz&n5tM$7X!?RCYQ8{^P!jw?w0}XfC=B#3Xenjlp)cr at Q763%fmu5vngVpR)=ED3
> zm-ilTlkhZh#B7TAK!9c_R~Ysj?-17qXrbeLm-H&|Eb0i)vRmbkHpZOqki&-fnB7sr
> zLGQnzfeV1yE!+1MB2nWh;ELWF0A8_OgwSSgDoaEK{YdN^24N#>0ajKoEJXhwt;i-L
> z8~46(=q4rzZTT;_9cAcjEk~u}z3YtkC#`7XT^ge2{(9)AJISNhO|osRYh#)+t!7%4
> zwtlv8)~-Q|DQ&Kl$243zOEl(#e_EOecbJ3U3cfei2=feuM^ex#G&JdEd;`e1$lFTZ
> zOu)VPvFP0Nhd^aRhOsVb#oG;R;*WR+h_ucVPkss1{TKLY_*sw-j}5dy)F*&&tC8sy
> zPZVoY)SvPKX<Hkp6evFbJ>M8pAQXpE)W(<0Tkn3F(E;FGi&t(_2TF={+X#%PZKhGY
> ztk)i>tayTKj_^alBTjvU9}<7~({bot;8%C(^SsM}4Scm&x1D3EOf8^W_&>9-dO>+m
> ziS|}@Bm^qq87sQKq8Vs}xQ?^C-cDpHmd_TNN;@=G`YPvJgl#}=6LD|A?7z+KT9+iA
> zW0P=G8=&E|k`vqD3uV9T^ZRFw<T%IjAkXxs+KBYC>t_FC<dZJO<1HeraY1;XSoW&~
> za`#X`MudghXef at V<B*BMz2^y+!(sesfse(Xz}Z(Rct{Ny;i(w>YBL$UZSJw6WrCvY
> z8n?RY>e{;lQ;jh&@}BRYV~T)n6?}*bf*Gcb`$1A$W3ds(zOSt0qc<Be1T(uI{cH`(
> ze|IiUFCV=kws+7;cNaC<6s)7I9!A~CwuXk%D}u4UXwwiLJ&!m2;pNJ^%Pl6g<K6kX
> zU5rY3Z7PVLUZr(@9lT>Cwob}3I?ZGDtDuKn;)3(^7Dp2rbAS6IA!7gpuD>>Wl`#A6
> z9<u#%A?N@!bOPe2P_Tpf?n;RF3RT1r4hgcTS;N*?N!tL<g3#Pw59ParL$%&5j}*Yf
> zwU5cV{)EkdQe>HN?NS*3IGiUtEJO*8Lw$k|CQ_oqjL!%etPG<aeb=Yg;i9G2p$MSX
> z^-oIMj-Z(y;<zkO2*t2RrRsKNWOjF4L{3C{x=n?eW28E=8H+x&T1KjYOro+$krSrA
> zW#C{!hf`zP#gbXH^!t4p=1cOBXj%Uu8zIzMv{w@`_4-$>=)FL*qP_<Kfi&ie|GYpm
> zXo@&^f#!~a=;y3>NP9Qut?;fBo(6x3Sp07~#qkd6aJbJ8EMdPA`>kZ(8}?QF#dp>s
> zJn)_gS=dXPt>6i29l5L#!QV>OtR51T5lGL=t}I02L#w1+C?eMb+ at E=W at YrC<++zi`
> zs6%p4>l+g+2v~@M!1MJ(k+;2NK2j0qWk2VOB1=iZ at I9;SAjs3TAjFoqGg?dRjjCvm
> z8C+&ybCsS_aFxo!u{MPS?MI4%8OD8L;5fd!#PsdA$TE!aYqTEz8=s<$o=ZX;-v{i$
> z6(`8+vy4j%e)9ptiO!cAR2r7scKJsk^bLmN9p)nS3L9lZTjbw;;8$bJ^^J2>??Jl|
> zMYV=<Tl0RNb?}=Btw>U&qKK;)?fIxV)7H#PcyR5ZnPw6e8xN~&rH)`{Jwz+Xoy=sn
> zaawzo5(FpilHG>8>RdlmX#r8~J8<`i>ThUz%;N*Rqz^eOIIcsy=^J{xL$oi;#2t8*
> zy(SCuY($mSu7AnPkmJs(%{tc#T#hu69I}^q76zvTiG5i<=BTLdC6l^h?8_#iFW<f_
> zPkuugzp*bXK=&^p#gvL3`b&GwWGwqv@=8TIa#TZW73t8~-u1wvMWe?=>iGRUaLh?q
> z$p*|41x2{K((TKBiv|7&zS^#M`?8zR_r1O5F-&ta?jl>m!ACHc3q!K)%hqFx|A0H!
> zzHAeQ=^^jtuBrB#jq~g^jTkZ(KGhNKdI&ZDjFaJ8v)Kyct?;eCdX0D%?NvFs;FM53
> zv?qyI5N&XZQxEPmaE}d6xuS3#5#KQ>IMO-`)fc-;p}NcVWp81%f3`2%hwty~HGA;g
> ziTl?AZ7H{sS55~>8BkO=7bJ*mj$)Ec+M|N5V(moE6SKSAAMITr(*tjtvRmz<Z4FH&
> z!M_BFnd)QOM;9g+H6Do>T18R8+?noC_*2`6KhC=V at -z+S@h222iZ-?LZPdg0@$xSi
> zMvk>@Dmivd>n!Aw<t`Y7Z1Q?sFM at XdK2l(ih>hO at BMcr?&+sUN#KQ-PMT;xb048AL
> zjFSOO&Kv?D0g098Nlb7G^YJ>y?NtY-Y at Y@_!SWOAu1PW)*cqY*IfljaglK|fASFoJ
> zARB;{V5qd9ldtHdmKXU8YIvLW^A`OwWWro4Y)X>HYuOW~X&y2=Q6SPBC~{i$Ws(D!
> zRZvk+VjwXg)zZ7c&um)OW+hM0#v*N_NFEHX8K!A^GCRXXq+H0SlPgUQl6Tgld<^8P
> zR9YzR?4qeth~cqgW7`O}&v&Q18J{?jD<g`Ndz)=U9qy^WphS+ji$~^P{JM)y%Kqx4
> zm2Q5>NkR%~JNDo8)R6Xul)1?zg+*U|4vFXbIVZt|y(8nq$1c*;J7eViv7se==?d<U
> zg`?iU+p*RGRf>bp40J`AEPS-h?AY9-4}wG)B>NTDYm&BOT^ALM^DE@~y1HoAOso(1
> zjZNQU at fAH}(MSciBRu7kt;BJUe?AJh{!*p}uB1tvB+>D|Fcl}MI5a*5V+bVO9rdAg
> zt+V_|fZB<s88w=BfJfQU=!+K8L+c`2fJV(Wwda|Dd6);;wt!9S(FDvPjX#EIup6x5
> zZ=V)-O0*>AU7eoYfwP13xF|_<!c8e$c`X^^nQje_83<7fM^*XJb^a*nOS_tn#q;cg
> zAK(ok0jpaV*crG_oE at Y$p=q1tK{_|?{T}L50#5)EcCb%;FGx%0*Z8BMv<5rjG$TzC
> zfGJAHn-*c%q&3yrwXrdFZDO1~C1w<`6br0$jWF1Z+x~0T553)@<vUvIU>-YBjPK;T
> z;_QTuwyU{JAn>n-oGg9cToC>_f2xJ3@=hjLh<f6=WHjv?KH!frOt8J`kHx9`xg5V*
> z4sDOzZhtIg&}q at C^2!N|wP at 87;jPAlPlGVz?@<lH^l>Z&?=D7VR~YOLua9R`$nq=T
> z2_3ri6<H6qq`97~AZUWbw0nAIN<}ZZ561gD?RfuOlusd_+lz$?Z#F85yl8-;$P0N_
> zj<{B%cvtiermk)zR2uN5lxfvjFwEM$G>{Secc-!o7=e~D)VFB^>ad4t`Zbs&_)Q2B
> z_?36dW{ksLyp)dle3_n7!KBr*Y?}$>u?2gYF`szpKXf|%g{Z$oM{}1}ip7^`T8g5}
> zY;$Edsf!osNPYN!l<o|B%KZLdwfGpsE(2biq>y%CMvSTEt;J-U8s6LRJ#@T34!B-i
> zTc++g_(oM}_X_L;@@m;My}4?7eV2I#TOpLV?q_(fFm-PmNHpI1O?f2rM}_Nt2zy5i
> zU80#)iY^jQ_zS+SGR)5m!CM;iXb#j|$+BU7ezka|j+B|8RI{S1yw+D(7*m8|dkiy}
> zlhrF2?@|K6DF`g~XR!kfCU(KRSiQnHsgxHV`JR?>-;|4g{+>>c`et_S)@<n;QTm?d
> z-l7K<5Nd=W`KVmyq~I+ABhy#`)OW9O+ at +OfPMvMM=hDhz#)vbg-08Cw-df}n7li1P
> zqQ(B=Yb*8LgqmjZL_eKP at Az$3lxq?+V)~9mRQiG<?={~<vg_Al;l}mQl-3ZnasRFs
> zVRRKmni8BV&giDOnwJAR%cd#!1doajbkm2X75S<Nnc!DTYx+3pg>z~^6`yow2#I_M
> z{`zoe4U!mO?6Ks5Zd%S^(|V{L-;earH0)+q54FbeKo3#9tlFsAT_t|mLrpg;x{8%N
> z>E>HpEml*vlE08}aZ<~YmOq#h!L7fTE$DmHz3cE^6F_`luLchTL$Q^;^qypa9Rxh<
> zXpfcJA|raYTRhZDe@(q&!DTx6j-%xnKD9}&)--KAs;Jbm^YYOPOGq$kS_XqRhxm6?
> z%^%IqjMdwgGE>XD(y68wn;Jv)q at E~uKYl14=uVql>Sa9r43)NArjN$WGkJ(I_##PW
> zZYd~E=%X{Z*J8!WKAJnV81HQ*(Y7r}QKrNQq^y=djLo&J*kA(U-3&ys2ygFQd>6PT
> ziEsANaSpt+F4~y-TCHFXWHA#~dQ^$kzP8ezF2CKz)Yn0N<KJdV|HR=>eXTVTDh=m9
> zjQQJjBk}E#c&K*kNLWWC%&)L`7T?99t at PzUwcKLjI4OM=QgkW-1s?#(Z${PChMFPO
> z@#RY%c!Wp`Z7Ud76=h6qA#zo5!^O7nB$-5$EVR`G)!i!%r^^;SSLox`_LiHQc;7gG
> z%t(g3ZUr9qa8rLGR3C?z$lJ9EF$iQf-x|L5+%SR(q~+<R@`I`nFL!|bD$SubkzJ+Z
> z9SpvOhf?hBgHY)rdmbKZ9xU*q_H%2Cv4SHDr1yO3C`JUzrPr-wb4fe@`g78@&truQ
> zAf=J8TiT-_toj at e5>z9g`EUz&w>;-RC8(rrcpbHHzMT^;^lJj;{c+%D-IQs>w0 at dA
> zYnz~|4-W@{)G}SFcGD(uAxdhzc!8+~4-J}|>p|c;E*=i9|MYtC?c%b2nqz&>mwCN?
> zoBjpud-A94+w?iK at 5zz&#oW-oCj;i-B=>oLF1AuU(@!Tme%6|`?L)0m$*qZk)?|d7
> zc!?-GNNUODBfPy<k?Nl&wFd4E=wV*Pli%dUC;ZVvAw>1xh|71`N*<iip5iYYx-qv8
> zuOKbc<5i~Y3ZFrYc$-Q*OoU?vC7uqql8sZu7ynCB9XCVlEPgsGwvq?7f1<`39 at O};
> z=0U$S*gUA04~O9Ork at WehFoVOVM&BZLI?9<oxp&t@}&>Cp7M>_tH;`PiR7sx$|2X&
> z`#LZeOjoNg<i!jKTjkK!kX6V)_`ek9Vz4%mo)R*QiRRSdTU7@=cvtK2RlxF{?;iYY
> zb`XKWMae*k at kRMB4}(R~fBk;eWYzz}+xx&pRi*#q=bjm07zP*w6%b{H|DYl$Dk=@b
> zfFq-XY+15oiRPNQmZWZ4Th1N47ApBK<CvME8ByyJ6 at l8n!K|ot&33!3TTWTIgm<h4
> zHJxad`99~|I|y$3`F>u%@9Xt@@nX(7 at 8>zsdCvdm+<VVC%BigXct1U$Xt!2CJ&Em<
> zVyD1br>fm422pZMHF{8S*9O?BBJ2X=b!@f04i@?J%V&=62=N=B6*c;b_)f|NrTu;9
> z(m*M_zlcfT(Yo)#dhSq9LSZyKZx`~bYtVy_^RP73-(J2GP55AZh1&0zc&XtKKhKDK
> zRfY<6RR(W(cZ_p%y`Ik!td|{9!DX&%#N2mLNI*>yx1VJRRG_tAsi?wj^rLel9|C6D
> z`d_$_bJjYe+nxWn-1s^N1iE24TMXUS{E9>RmjiMpJ=$h$H}p}v?c6V%*$xGYq6>s`
> zknhv{2mdeiPOII9u5J;(l*`R=zB6+0F}e&z+`oX*ZS%jqo>izFai2KjnAgDljowVd
> zSPhKzGa(ZjktBwEq)}@BGa=dLuX%=^<in8d=t|XY)o|vohAu+g8g!N3drVG&ebGT}
> zlMgVT3I4ZzPB60LsMY33=D&7W=v6*s%)hyKW%HJ|e9#UeC at T7_<>JBXJE`afHLkRA
> za at R~LsjFDJtE;GL9mh1&H*%-xn^7gZr)~Zn*Q8Z^u)Ndi55s(&-r?8xJ$d5>?{tEc
> zCeMO|?gwM>BnUhb*etcdKWM8|NMKJ{02R)Xi~r`v;3xD%*U!b;`HM}H<>dMAo2Dqf
> zE8?t1E%ig&Fg4{V=uZQjSDW&xH2x_{N4((Fu|p;pj}R2#5mN=D+>OysLbBq!>f_lX
> zu0u3#CF0_AuHwCG1_3&-#zJlA`!@1sKbIPQYpaS+6U>)k`Fpp9{LoLovoqa2>7;<n
> zC?VL_?!z!>r}R4H*yv(KG%|y<^R8P1!yhObJD{j$u%co};JjuCsRC*vu*n5fwTw&k
> zzCe=>NcQslV}e;&X{T=kZ0LeTpc~214nI`I1aN=xX6je+;WqSAC^U)3`CxCIcayhD
> z9Oo72v&8{1cM4{{R#*uW2bGejNI5GQ=n{X&8G5#x4K2PECXvhXbG6n^p5Fkgy%${q
> z=e<LCN`<5C=ps`w%R6_7iWxK{tOP|tMvo->=@U^1eXFF at D6q4)cI*W$$AgyH-U%=n
> zzh+uwiSzN^^ufBaJ)%@wBj`&dcG7d`LFU+6`qZ-Lm?CnmqWo%E`9(j_(BhHoH~c9l
> z&a}^Kdf-qyy|T9P0fhKCdKa<e4on<Ap7mQJ^kV~;;p1Q(FjFYf8y%lCb%FIhQ$LaW
> z%n4&VYeF3NH+gv0L%(m*@SQgQs at VeHG_~nLoQ&epBs5hx(7vC(6Q#G#(BpKiC`max
> zJ`KcZ=*BwVic_J`61ktBe4l<9L|3z$Is9P8q!X|Tf?gvlgub`dKuN6T&y*)2e%^N8
> z$va_?E^ysRGBD2MbmSI{Cvf4U7UN`Y25G|B80uC=u}E?n<Iw}b2yzwUMEgGafPfym
> zB+Yiu>Vt6(>^FVg7{TmHmUqc3Wq+o`!0FjzUl at 7<lbKq}9v5?)>Yx^q!QBBhbe8Vl
> zRhv;L?>tegu0`s3YK)xnz?TDgKGhKG%r~p^L!bZdHm4mW(gRD-x_N2?awIv5$j44?
> zU_NyQ(XV~LCM%nJ9EHsrgSgHJ`OSt6No}IW9HZ0hoYKjzoA*b-kP{J@=o-p9=}9Fz
> zh at 0(m@@l%Z>ars{*Am*kkauP$k6ZBWgzQO&`6_!pH?AP}v!Zu1jzb&#eu`i=8&NPU
> zV?(>u7lsX- at gL!&m+ArfQ7GLxC1B=PiQ&h!low1?sKq{H^Y>lzIe_~IKDe!rp8My2
> z6w!Ii;p5s9mBIb{UI%F)t?!2js<y%f5arAEL{aPE+F<$LAIAsxLbU$e_OIF!eGU*F
> z+@;JJ$g`D`#==q_79!3ZA3CrhP&IUnaTj)5rEM3|sb#E8X;a8WH6B$s4UFL7wEciJ
> zm0uF|SmQTIJ>kmymk*17h~U~sxAF)`{3q01*#^O3bYO>BFtlpi?W8ma&)}XULJ)og
> zZ&VW;jCbLUd&%x#?BEJWd<fp7dF+V1$FSqg5Ul6$<EP0f4W4=PTIj2bE9UYXtQ{Ye
> zPPhYM4B>|ZVetP^IsvH4y%t6C7$x$Y8JRV15BQ)}_D6!Na?c{wp*S}=xec{r`Y?l@
> zR48!rgAHf!R<2uhA&C0jkCV1gyjxp#qJ$n!9{;;F<aRBz^Asu7VdTFp)0@>*hKLZU
> zpU-rE%5${q;=3wP2n-*?cXdZ!zykM_gS67G at 97Z)LcMAF?DK-k6km3jpJkb(U+rCQ
> zLuFq$wSbpEn~0x%mY-$L-EH=+Vh<Fyo0B0|p?tcq2=WxdAG9IcyslVsMT;lh1WNGl
> zDk=m^{fYwgBOvrRRp2IBfn6M-gQ=Q+qiC8wvqaE9GHS9U3>)YEn%*&GPnsd~--L+j
> zjo*HZH-2N9G3hkbZDs-0?M*YiO`Kkp)-%S3dG5-F%e9vr?S+EVUD@$z7#_<7X<xTV
> z4-s`ZE{(0P$e&t|%)M_SSEMFl#F(^kd8p6nb`w4lkLKK at HXNsNe<AuvTp9a>`hVt~
> z5;2JP$p6eM4dUIp;(zAd7a8EqBi=|nGH7z;wQaE^MvoT)yhe}bj at s)keC2pS!o6;K
> znnJI`+-TMa&WioKT3SoK)I*+MBibmOplePDT-M&4Kqf}v^x^Bl#yDuz7~B;|RbsA=
> zM{U8<dUAgheuMj>BWoDG#Nln#WK0bH4L6$9#NfG!t^BvsjXFd>$uniXaD at 6RUgkB^
> zQ*|`#Bwxnh`-137{B%dfa2(Cqn_ZTYY7SKhj+FK;^&x(CUmRVVRlqz7dUWx#>pQJ$
> zohdF$)x8zHGEE)L*8;7_Wf=&Un?heyTkmnEU&l}sU>VoLTrq at 828Bx?yu>~Tm<d4r
> zps*FfZG*zIAbfsMxYQK-Qp}*R4Z;P3!m}Z~Vo-Pvg!c{#mqB>W33_uMEZ>ZMadbuc
> z(nXiWy4H+jrpEPv_*@pKuGJfyGRCL1fg*p3t?z^~S*E$>YwQl`(LmvzCx=I3<NU);
> zEq%*$SDiE16#AMcAC2ZjRRQ|v)x$Y-NhYvkGi?3dvDVb%+pKx2o(f~oyA`>$+id+;
> zp8|WO00H%<gSP%_R~oo|7PG!q4TG(lq{Ko?sU{V%c*>ZzgzTcW(b>6eW3r>#60^BB
> zgBT8Lyy3!9NYYCV0Z;s0sfr>TQ{;q at B^?x1;5$OD#NzRB4JPfjanic!$uTL?IzCNW
> zA+3Y|jZ$~V^f)|?<9;D);_*Y#+3g%1%eqxP6Mg1B7=rG(*f0uz#qH=gHwxd)aT`d<
> zXq-Os8DL53iSAbSMEQ_4hdb>)@{C5>PijX)_sAj5z%x8Y4DQrc#d1;5qOU-U&JjbT
> z9C98=ap3LL0V!5Gp%C-MP at xdWDP!>D!W?mgca)SP>Z|meu9M#LnQBe+6iOSwatC%X
> z#H&-HnZ-!jS45px1^gjaz1=TuAiKvv+2xQEW55*2BRymAt;RC2gy-?!n(qBmqwCgI
> zPI}LAjy=kJkDma=@Se1SEJ(z;TszsCh&KgIflh582?qSzurs_9qBio0u3HIjz^TzW
> z?wX1m?)(dyy2b4q3}zm|;Bdr%pN>2#s+J-Sy{D4ai&*-MR2%Va+!@kt#EU|<Q?p*G
> zC1a9sO0c7ZKBFR~Nw_ at Nv77n#CgI;h6=;(2Poe8YwHom~(q|pPDR at 4|ohNst;!WH$
> zq$d>@-`uQ5_yd=L-muydBR^YrFM at WY&splaqe8!NJHNOu$dy7ZD2lu8u;`a)0vOD_
> zWvD1D4$R83%G at onWL+8_pBYOZw{!<zkk7{})1xi1AlB at l#&j8~4vPiTudH%4u%Al9
> zaa=6vNyCY=;<|%-g4v8uW5m&0KYd&iqMK%&abTd0sM16Pf$2U|)Jrpd-rN;lqQ at _o
> zLR(q`qh3oZMM!x%PSPzC)CYMT&zm;Ae26 at fjvtyo!l{>y54^$|rugc+f~_kLe_U~Q
> z<Vl!?RvbQAakuW|XIiiyJLwg-V0O)QB^TVkX9O)B$O2f1B}k9xv{wS_8TTUB9i%J+
> z=c=fO&%o1?!2|1x#n4Mr*vklu$6*S6d7UFk`k)ol at 3j8$HaVMti=v<?)wkdW1Zo2=
> zcBQ%(k?c(Thtd2i!Hy*UUH;H?L%n)>QhiEOY0EMgfm2LzFV_=iCLW&%NeF5_?Go4e
> zt}Df((ns>c99ix~8u~5-s)y*ZaBAlF at 8>!URn_V-Rm+q at i=}&p!5q``=enYinpZhP
> z3v?%cCRJIu*iO~%6iWF_p_-nt>q?<n1A{oT&n#5CQrIyt;ew&12ATkJ-Jy?08r}?x
> zAD{_ezwA*^`GZ+AMavH&GdqX-8A08WBhzIX<$_otgHh7}toc>u&|gKh0hCmY#gh_G
> zY|LtU;G6WGSOC?oJDOfK7xIYa#3Pr>;jwsX)Mfn!#5Lu96WXH#HV)t`WAVLQ2Dxh-
> z-d4;InueU|dafl`lw&;bO=i!zCP>fS;ku)bbAQ?NYU}Z<k3m8yVCiW<*4Irn(kCD<
> zXFQH$<(Vc}g=#@VH4s9m2K-|8&C*+~#d<rRAOtfUly99Wml%XJ|0}N0|2x+h2x|X3
> z8|fa8i=$q!q1>l!DCZmB3A!NoeIA*fjpvUHiFuh<!Rjc{eY3#1JKT#}vF9;})0~Z`
> zvbG0xd<kDxxl;5`B2 at Myuk+xB5l#*34E?}#tC_w%Zp9!2(-A|u42p65V$a4_%hlT9
> zex9DZ%^Da?g$n~kWHn&W43;!$GGas1*E`2kTun8un}CyVeGA0l|4AU#jf!-oeB9!D
> z*T=aRK~*A;gZ7xF-_Z8Zw3Ahs8kR8?(4}^h{t37!^wH at ldQ@NF{s$?|!9|lV^9k<F
> z&~}@oPXs<cNRO^K+>2;$r9~+OwF;0zsz>b%yTa8ws!Fw<Cyefo$=f;jCYT+3IXH26
> zDU=P at k_Sx(p&%6F%q&;|T`eaUCt+~s<>K+<*%+&L&@s05-1RZmS`9<v-C?opNzM{^
> zS%lT3B^T#T`}W4sF6vuXl6lE9!aNlpX;!J|+K at dML`67AI1C9?L-e~LdhA3z$*va4
> z0)XZ2y44Qj-aLBBjC>UrR>wStxO!tlX?F%Fuj^6k0i&m&$`5a9)e2uwcSeu8-U!qn
> zo}O=Q?$*#P;EtpVFdz?Gd!vfO*1D1)UAl~`1XF~Znus&)Ptr>vpmLn9JJ5E7c!N+1
> zwGP7$>tTO}>cY}xScMh|)mLjNZbSJm$W4rX2-atzRSd0jk#Noptz1B at MQmKK^E&v4
> zJ}Csb7fFu~r2rZ%qxJwy69g+KWGFK*;_IRVLIX6ZS#5 at KTV4JnGP=$5uq^&w{eGE;
> z50(3|>khX$5RVU)d0Z)dD1b6pOmv%nMRUmIuP1yxIz91)mc at X&$amaV0(F2KNv%PG
> zK`3(+x9 at iqmoG+*?)<hFB~Rm|e-7->5Pn!pU#xEqDyfOCGuI?sBVMJMH8)SD2QF9D
> z1tsaBF$h04<+c at m!}a957eQm>+0eKc2H#M*gHHX*85-!IwCBM*78o?olP~jdmYv4F
> zpoPgMYTryS?{G^V7#X=@alzq}UOpJ+2o0a^HPDAdf>|`${QthaaWy|1CMlcrg2w^w
> zVh8FP*{h}>I`sch?t?JBmP*_CWzb<#*;{OX|6kbK?ozK#97c;p+Re}Amjiut3c&Qs
> zL%;7MX+f`=?tJL4Q&fDlqjfT##Bqzr`6)P)YbFs>aW)RBBc`c%1$7Tk#d9M|Tc*Hp
> zp>LT=yRy_wwE1{KqE>o{U7Tzb&Xui35pJzo?}(?b{-KEija262G4|yZd^K<0T~e=W
> z`A~2+Z?4j;_(i%?;JkleL*G*NZDRzqmv%l)DgR~k^FO7#Z2_epz7)hSrMHWA6kcOb
> zVcj``@oFu73rzRT$OzptWAk6Tz_b_zoyC|9W4Xz`XSrrUBjWnL$;R!k(Cf>k)7_yx
> zxlDyTl)|e}9*?Ed%H#2#y2b9TieG9t!?P#U?uW0aZT_F<vPXi|oTRuHWEu}MjIfAt
> zn64+j^=smNBIV=vbu=N+bb$?Nf(btjkK`ti-P5q~w%HZC>MGrxVE4=_L8=q3Wb54<
> zur#~=G+=2AJ4v_UP!6F;=8z3C)k%8Dlq>mqV$kqU_{t0aGU*(Nn2uA~IVDr3<3xK7
> zJtt7Gwhm|R%+_dEabJmGXdUS)mi6lYQZ{D!#e907JVzTKRKzb5!k}&YfBLj5*!}HR
> zRX5nM^f`t{pxYZf+be?Xz1?^tit+PNa`}VKrLBLfm`g8bxHik9X;1Wo+M#(Q$>f-A
> zJierZY7GA=0vh;L_qY3sp(_NlvgRF<7^ytObbqK4j3Rx9Jp4nS@`_FZ<Bq<Wjt2KG
> zsSkb^LMR5@>b79d9_0nh4-jV<N=Cy0zq?fgbOI!-Pvq~^PvBSBkopc;6_m)|McG>a
> z4%jMrIOlpyS<5R3KLd{%4>fvOb0zdAdT+#BC<2 at Ogx1kRwW&1XWmOt3T8So+t{Hf&
> zy}8XG<y0W<NE_lycgA`)x54lX?iM*kXu}^D>^<2xJ$aY9Ld~nCN2e!mNA7><5ApaI
> zZfo-B&xFaZq3~U5gdU~C6O2va%8RZ?VT`JPF{&b_gDexV(DHJH4dqQf!aGOV{8zrK
> z(%iyD25kE7&<mP?Rlk+%)?82t=m;-Ya$o3CL<gseM1FR~1b$ASyFnfoAP7Uj%yus_
> z>o<YfNKO>slyQy=O4(ijy6qc!lG#0dC8qdg3#8gM&S7jj*BIJXeR&(GV<9m&;neV!
> zOOaj50)y)z)|;Ra?)Gf!jRfnz%w-WVe{N8N)3OE!wx-gPn7v7d1vxCtk!M4BzLPQ8
> z5D#co&z1W9+XvnmU+_dZV;~o$fnvY<H-XEOBSHpBQ6X=;5(4lgQB~FG(X<Y?p-izg
> z8h)49(4-HYu>+dNn(#O~cM*iGXndvdk`1ZkH-UwGHJZz>0G^AD4>Z0C_%S68<*i0?
> zODi3~qLIGw6+r3+y*p$mGIBj2jdH&RJuIjj_o&&YuM1j7+E94G<zQr=3ptTX#)=lg
> z<f(-*Mh8|#n$qP;ZT?@D4lW&GHZ%HEo*-xJJ75>opJ$eQ`t_3K(}$KSgjpPDNXr7F
> z9i&zWg*CT;_T|1U*NYcAEuFuD16t}N`kE*8{t7kXq^~{dGXBx$<g-HETC%<nCtxVa
> zy at k+0ZoO7ZFE9E<;DdXE_*oT&d^QXf6Cl+$`H-enO|6h(Hj<Gq`7|iTY(OSl38913
> zPi}h0kh|4Q&&E-Cf_p<Q1(oC=&lSy2u(a}B2K(!MUztY`oG?f6^d at Z2MzD^`lv4Wk
> zN*%G9 at zha-UJHJ;R+&MPFR3qwTnXZvK`jH>ZN at cIxQpeh(B6${^zasM=EhX7d?j!V
> z!=K!k%<$10le`fdv%GNu8Zi~&*aXJ2o<3wQMQHsmM)-Xw&<e<^BAjerR*JZB*9%it
> z!?R0BgyNjns`WI$8Y9d@==(2NL`L$rwayblXnzef%C2CEKBcH}8QAM7Yb6S*Q{JH3
> zhsvdWgPz(cF9zgVO}M1J95%S?(3@!kkw}gOTkOA{1lTt8hFR#eG$DSm($u&CSrSDm
> z8tr}oEqESrObH%_7J=&#9D(${HD53WGNPZ$-+V=IFM>?YWUGI<`Pv_bSz;J#tEqu#
> z^7jK&<Q28}#ee4VTXXqk|MUUDAke)?DcPO0eFJiHKw)ZKyHYkHO8+(lM(+zfmZ~~V
> z<w#>=jv<M?A(UEA(&en+fX0*qnohkUFae8Ta_S*Fi*d#+azZp0a#G+cgZ1 at JX0Gn%
> zOIm*;8>CNg;xW2J;4X-}Jwfe>15H at n8+<9`dK2#R6I}^@lDm^Mmf(lLiJysQaBq;?
> zXW~C{zjXX<CZ58 at u(KpXc&EeC6KVB?POH53n2yBHf~C~&YlvwUj^nhXau!aA`F%~r
> zF8-`p)r|5{EN%~FwpiUPd^llpTLCxub#qR*0B(DMadL-fg#Mgl%KCjJsVD^z`DA%1
> zuCQBg>QX~fUJUCVZ1Y=3IQzsqJY3grrD~~J%2e0j<-J at 9(&f97D)mTpN%p4?r3NLq
> zlB|jTLTN+4)uQjxP~;NlO0Qamr^uYrm0r&MrYmWw9yu%Zy!jFhr2#E-K#coM>-~{_
> zS5n2 at k$$rw7F+cm)IZ<-CKW`5ki|AUDSAVHgaxh9^g7ycTaq<$n_rqlnr*mf>Qytx
> z4Tn}cyp1cFfc*U<+(+BFHqM$8<m^xDPh|dydL#j#V|Y8)7+R9^E|R_=hS at kZl7Y>k
> zjoOl&pD8#G!0 at X(HO<<_Fsnz!1N0a`VMieWjT-)?tE7E49?yM2&d<hU8Lk6d2YCD(
> zoC|o_96W*HdcgI7KL)^rFDellPj at r`IIMp}B|X+t34vxRmIE4!wpL?3q<Vf1o*Eg5
> zlmLVT>1sz-8BPw4rYMfV{022wn{KVlaY$cu+;s~M;kX*I^j5I*YseniIdv<Z08am{
> zVD$gekueX4a$!fCqZ;Fuq7dXhN(yenM!Ql?ZG}*I)vTf-p`wD at 7P4@f^dIy at Po=&N
> z{WrSVV1OD7;rr*)aNELP;m{{wi{7h|CD{Ly!J>ae^Q+>QP}&-qw&d4nHUE_cZCL%Q
> zw2{l0&`?HPcAZF8-Hs<;FC2FqRotN2nbEco{DWl36q=>en!z;p{ghU+68R}T7FX&I
> zAx6&{OlJk|hXU8!NGn0y6_Pd|N7;u!a$;0l at ZZ2LC-mQFG@)OmdF8B`V>S+Fbnj4l
> ztjwS!I*3S4&Bt*efxr**@yLOIt`f)HF*pt1Al-a7r0*M~+YK~~uEzs^)<Es>l{h^l
> z5NLtaZW~moRADMns#8=>^L1Kt at ErHw=~XOcQGA%Y#uR^Fs~7=(E%Rwi@%QJK7!eZH
> z)CUtZGF9F0BniL8Yr|(Wr(6*lb=KWE$UTEJ{uVmdj*d@%i;FlImTtEi(7FEk%|(q4
> zYodp~Ldm!TkDt-(ejTP+1HRXTFK-kkDECZml6L+iP~{>~rM?ykbETcGOli**&Z_bI
> zr7hOjoE<Q(ZNCFggC*ogci_?B^xT0H!O<+hwmDjLb?tIk6dG#pb<<aDNhOIe<XJ2A
> zrxApUTxnKKPJ*1y6 at gMC8Fjmo5>Op&25SbS^$Xd%0FUA}kRuDQ5uDE#;7y~4iZ=`u
> zPxw2rakNs*!USpOW#Kx*Yb*uw_MJF)Y at J*d{zyqK9VaWDBI^VwonQKI at 4u(H=m2L0
> z)u626 at 4~smC-tY9b0SOH7yrabd*qUUQmDQQ|7P?Cs&Z9bP;gtdH63b4TU8ev0e(3P
> zr|!b{&iGHI?Z{8tD^*)C5ALmkG0<C;EUj9IZw+EqMLt at Hi<0H0_d1>1xE1n9bV>GS
> zD$VkBl3k7CZXRI#kI8L-QKr$v%=%{ajkFRJ25sA#z)E3PH8%dQ)1LEdY4g99wlxZ7
> z(pmpw$_0yXa^wrvjGS%iC=_pvETr at 5{fn?M@$mImoo%R{Yn=tlyVHPu4J+IfX&-4>
> zgy)Z6-;SZp?uYp)&VtJ5As2Drk6nsTqD0 at w$NElo=K6{usz+K!CN9RwTr;_SF}?|$
> zU5oL*xHIJ8yYW-pRia;lJK|nzGc48fA&{S-c7r&*Di%-kC7I${H67=c;CRlu<&623
> z`bJSpA5fGTP>`u=<zZ0;zbC8mxuB9<L@)HH_HaUmDQo3Lfw%enZ~Gj+SqC<t?I`LL
> zKHxBAwvHp_r8sV+Vb}yd9)cy)jWOtz6ZC at v2+bokOYz81S^jA04YGYHo*7j=-JnzR
> zhv-YHL+Ee at z}-vnoXAP$AcV~oBTKB2K3Z<(d!Q>#B8%_AbM0V|@u4mwT`Wk`L at Z5r
> z8=x422ZiUhq2}B{;gt}ccs*Q!&^SOQ4MB1M$s2;?0Wz6B6%{!8?K!=7w`a=n$s}hP
> z9#!=JtOTiFhDYB9YkH}uKBMhm`vH1rlO%`79r(?VaL$2ShJ^DD+&Uzje_-C=FzE-;
> zDr&cmxfjQ!{;$#?3+}~<EYA9S at ibb-IFgV3|ErX*BhncNPq7bX;R*nnIs`Gd(JM$b
> zL$DHtg$}_=8KxbAl`$-A2v)%`-2i5%;5-I~4`HliSi}%)0mCAPVATxM55bl&ENTe0
> zjA6ruU@$1y0gN63)-cAHA=ny*4IhH7W7vox*dq)ZIRxVw7CQtJ7#0VZ{W at 63!1y7I
> z^$Z&|1l!KAgdx~2hK(MA?Pl1RA=qAqB at XHw6IZ~JKhSWGw|5R{xI2b~a}Mkr63#pD
> z<dAUwfn7tw1qYrQ9Inti4jpK?0ck!!+B at w-pu_4#NOJ>QD`25FU~PbDZ@`WK7Ip*n
> zCSbZ7FehN)1DIU~PXHKk17jCpkvCu`0n^`rodzuG2JBP7hTVXj0WA6k?5rKYm>a-z
> zfDOL^I}g~18?YY0M&5v31T6Lj%mY~54cHaH;sLvDFz5wv)D4V2z!C;yY9ks=jlcFH
> zAw_WZI at pVwfA!Y#2im`~`F&H^TE6LiJU99^K1mF%isizr`k?9xJ-^uf8qutTQS%FF
> zJ;_*!H_lASHd<moQqvRXVIB<oN|PP^)#=9IkMK^-0uS$MKo?XcdUSTDu|n_PN%sJo
> zqAZ61Lx8cJz$VV}Jn^i=`MBl^$*RHSIBywwxCSTSuusVD8k}d(n^!&&-9$ftmQwhG
> zQtF5C1@}K2bVg^=K5&Ll^NurVS82e_fUrkQfsg at 0MsO>@9Sv^27*}xr-ZLylDPYmy
> zf@$H61h-lYgWv5C(tzs(R}F46yR_s5`c;Y5&g}LsU0IYfL{PQpL14XWAGl$8m9Bk*
> z&}H<i(g0pi_SYEM;_ot4mEy3M^}rcKRd(&8D$*}eTl7_>Dy at vK(lES&Nu+!p7S0Dr
> zL!y^b_<`*=Mt@)(!<_ at st68|21h2wV>^0x14QN&W?K^Xz^j}x&(W;$!4GY2F&iwhz
> z-@*I^;5!1oJ9cI_tTYX)=~g3j-_8URt~pP)>gLTe#jjo>hB(6lp;fIyq!?@(l~)P%
> z55Gd=X>D6k{eiZ{jho1_{(a4x>&Y9daCqea1HA$2nQVyc)V{B#0ssf00=)otn~&!W
> z?8_w-_F9$3AKa;Gig4|tn<)8eiW^YatK~sxVpCmH!XACWxV_VfVKuHU4|^TBLpniQ
> zUZd~_<g_VrB4wO at K813(w3kmpRlXwAq`aHqzbsp2o93|aMNW10!|!Y-r&eQ2e%{TZ
> z?uDH^wk(O|$gAF4EO*x+3yMVz7MA(4^5G~*RBuEZ>ZD#%bY5lQyLrDgZOE%4rE72&
> z4(lLm*5JjljJCk^WZs>o)p>W3I{K|uLBh5q^1~Wv<j~l4f520 at L!{&nI1PurMOJ_t
> zpSSK6M?F`upVz$dE+n;%o`Xd1U-ErL4*vm<y7^E((&?S*yFB)1dqSWr*KMU5t at 9nH
> zxBAfwgbQ>PFI8#Sg}!&QZ{KGLyci=LD at dq#$r)XxR|N^x-VkpX at coIzJcu*wc`MEt
> zdQ>1~g&~FK42itPqOU{QWApAiR|I%;-hGB-hU*mkeg(fjJI-<_JJa$!#qaX?pS%!~
> z{Y&1;a}yYKW%j7NmF&|sW7u1JiXcuXXzjcZ3|cRz*Tm*6r)Fbe^k4ES97g&<8q#n1
> zq`lDeaE+IodJxJ4is<TtxFRL&ZL>cnq(@b0L<XxF_$*=XT-k80jv at MuUz;w~{EIAK
> zi*xO30pQGrFtwmM!V4%rd5;zv at V`u(AIK2XJ*sn>o^XlsV8(+f{Rj_KjTp;t6~om7
> zc&w-cR4uJ#I5&Xj(-x*i*xjW*!qY`>fo|{gDh-KWhvPL{Ub&3>by6=WSclWor(ecU
> zEwh9Wy_#2fI0Hf<Pz>)~0HN-qBK5y<0hA(}*WuBl*H$7G%2(~tmZ*~_#i;3r at WYbC
> zcwl-NSWc|NH_!B#;vYcyXpdG}>kr8<-lK&=OyZ9hjQeX$ucO=2qlUKff$yNZnm-4=
> z5U&P)@9yRJ5O+2B;@cD33Z(_)_J{CIwqx|lAt?BfFcc?%A<z4)g-{vn#`B^JIswc3
> zKU;UhI!NGW(+#)kJF_R&{6KSGkg#_;st)@kTU+xZIr|Wf8~rtO<Bw=Tn0F!lzM}4=
> zwuKi$4Jtk)JHF<7GVEb!?32jshw<pB=~YN|k15o$H at _kav(wtwJ&ZG>HuOjIk8D?~
> zC!!*@6rV(1Wsy3hhw%t5zUI5^-&&4j+bkW~(=6 at K?p_DM-H`ry68{KJo#r$ZS>7?_
> zTHZDpEpNeS77y7PW7=UcRzOXGKZ)u_?;9(>%-xZlBxeJLi8sl*NAQ=yTaH22JY>P6
> zI2LbtgFN^sE{WK3^nLYFRHf&FvWL}NBwdf<IovNKW<5^je(9LL9xuSqy2x%G{~>%*
> zzsdjji(4DRvlj!@;=m(Gt^?QnCq9!qLasRQl3_I`Va3Vy&yUe_b+3*Eg-(*?wRn_$
> zFa6So-c3bM&!oeXQ%%nv`Z0$!GNcX-G`@0-){DcXV@}->6_jWY9bmoah#I<oFf_^<
> zoB!I+^bOaws}Q=kDF at 2nP*X0QcWwTk%d(^M)+r_M$~OkVSbiDZE*;~Y_M<9iE{qeg
> z0^$pS at lydEMf^gW|Cb<`;g$&o<}Z}Dj9%SD6TNx>5=E*>0>@&!A#g`I%GGxfV$^_@
> zL1Ux|NH79#jlhYcKz;(_eVz}NrT2XXv8d1P at B4%%#HX=nVQj~c|LSe*DBk<%F;aQ!
> z1VhU at Xs`!;$fT_~Ezy0TWtI9Zhvf$bbk~_zB`0 at n9BbI-!VfKbQ4JdIu+Y;V(bA?m
> zXeG@}o8b4wHuJHK$bh22KU!L6w{8bvyS6xaCm%}RrR$K?I6YN|XoHm+2NnLze6$xq
> zzVm6Z3EcZ5Ki1JxK(1ac&^;T(ryrvwQ^<#iNh||BP<>|v<1wg^t9jx`YG_>jQpw!s
> zEJhlOVNX*SX at H%ddo7mL;&66W=l77~D<z43K3|`pVb_RqKBo@}W>a$BI(m-Bhgt!7
> zF?+N54^iEvg4X*pEd!;lTLW9lSm;QXswKzAE7OB^<JVQOV^mr?HwcEUs&5RUYHRX0
> z+(1(?guO!2HsUeCLJmEVo6O#bSJ-Ra<tlVsq~8;i>Gfep=&{ckwcaHSwt_Kxr?d9)
> z5LM^ugWf840-X``T-clLHpTZAJxE^hzpco4$2)U?esmE1m_mQUJJ}7U$piWBHj^Dc
> zFl}dsY1jkPy<-_T13>&h0gVRkO+Ybu$1q9}qgWJ5F;GgpQH(MZETmx%SiM>nie-Fp
> zOlmyzop}r$#n1#L_GqAu5v}e7I|Pi3l%$Z7fs`UnW06vs;52a}3uQ3AOeQ!>%wX79
> zhK*C=jt5G%IEqm;j1tPYwW6$O7{hc5cQ{Z|BSdvW8CYy5X)W(Wh at Q!x3vIl|>IuE6
> z^4eo&R#lacLselnm_bU-gMkU-3H|+RjEoxeVQ(tbx4e%kGx9tAk&5qaF;3w+su*O)
> zq^o8Wtfq8>e#;yEU}$9zdmuj>YQ%dd_@=wTn1#?y;5SL`Z2K^%oXHR<fI_VXw+M(9
> zZz=dn`Xk}DSnPpcE1)yQWbnm;FV33}zIgEq at Q()H7!WiJDuc>N5DVbf2$UpmD)>^E
> zlw|Qe_)P;e)r_h&VitrlAe1 at J8x7tp?+6Ht2VXW5HI|7QCys<)4NyYaZnDW6{1Dcb
> z`u&Z7g at ZqWafdN(9nCk*8w}bbHsJz$%?}q;f=&$TjuW&!SO|eK$pX{E1JhG)c3+L>
> zTqGDpa at Yg&<i|d~V8Pz$r&R?Javji_iEh^O8F^Tk@!vW_trai~-Lho`eeNjihjE at g
> z88mCW<Gbi5_f<6uL^b~yxZ_M&HTJ_oiWtIz1rS^zWC+#taRGfWNx$p+{wsRt5D0$P
> zsZ|8$_313X;a7uby&_r*ioN9wwwgoMR#-yT!qD=#scK~<NLm(<B&3_NR;~eg9X^N8
> z>@c)BZT^dC{5evw8877CBdwcpVX;8J6uiXo_kg_h^s|!hd#tfJe^MJ9^PL)ND4p5+
> zN5mk<d{Ju+MyP)z^`jsZC7b|@q|4 at aw~>ik at Z{fB|J&>+RxjeFccoL~o!WkUh$*wR
> zO`Tio1}pH0E6u&Ap~&6LI{`hrds;yOSRXO;<AJ(h_afqOH}5u?V|H_<%vbaU1<=k@
> zpyAP*<KOjcq*u`aUPexCftAv$n%&b_%#6BVYlS9>I3$V2+-)*tzFLwEi-qjsyfRm6
> zT`+Ng`C$YzBnixsG1UBMPuy*ySH7uNJEqI2y;|=|7pF87fkp8ha2^59j_goNdwU}M
> zzV2~Yc})_;>;{{1x~CSjurIrwJfZte6Cs)tqP+tV-e%F>@;Kl(-cx&HVy_%=rPEmD
> z2a$T%?-266n_X3N at ic927wL8iI`w%RFh?1Vs5&EIz6ybQG|=g#_eVBwM|rpeIx&e_
> z2!we!M*4=Hg~fa>lJEo`&+Q<ypTPHW&7|!Kyw<Lj-V{_WV^uYtNnfd#pzs>{Qm7%)
> zSwO?|vR$0uN}}HsTBD(kXVI?=0Z9%}bthyheXUAqx)Z-j3%!v>rCJlHc{p3z;O-=^
> zZpD*Eu8%>r8Eo^23hdPt(+zr<ty|X--&SnGlP;2iZ8!z5EG3J#;Zo`z-i8+j<(cB`
> zi0HTDQALk6o#-odKi0Id1fd)^SUjezy88UzAoPi<o)dkpeNCNBW}z53jte&UeYej7
> zzd~P(%=<?lS+O0j4v#g(Kaya|vLn;<wPobucDyO5z_e%cS at Q4>JR8?FlJ|GutjfAZ
> zlU7ihvNoSJO at B=2+x(M?et-mhWtzZs6bc4NyRjq(ZR2_Vg$;ghczvh%We2mj0+d^3
> z!fN*gh;gUyIL~KKY==JIZYHHWaXKUz58gF9aW-ySLk{i4CEB(%8x8!|rmFT7a%m@?
> zKYU5!xb{SZ`52F*ZD!+z16iifwj6TTlQ_P#9oFR8!`fe_SEyGZPBYKI|69PvRTiYC
> zTjDs0o)tXH<7h1sG^Vk6yek>T0Sua4DOmAW13S<zksWB~d=jTD$a{pI#@l|lArDMg
> z>U(9LN{tkM%RChh`2WoA5|#ajVVztHZmS9OpgWq(J9xC<%4V)-{8P`IJANT+quKPw
> zJb{$#!WkIc`*-1S)ZMGNAMJw1I-7WR;nCc!WW-Z=j{T49{8MgbrtFsdNM}mgT%fFc
> z?FK>X+E;Gjc%Q*qgXdJN-dxFdHZD<HP*|DDd7%5F@=M$rm`hES*M#lfMptAEnvRwu
> z0X3s;bOzJEB(8f2a4k}}-prr+1SjuCZNLq%Bt#liZ!ATewR;(`l`Cv#e~u!3PvOMh
> zWHWe*3~$tVe|AOAE-%03mfNfD>b at 5!nF=MN9HEP@$mRFnziQQk53kpv`V0^n*}WWi
> zMk+jI!1Fm--hgw%yb4t3eS<VL;0YtYsLzM- at 2^`syFUc`;8TTshFomGu_Lx~+qvZ&
> z)dan*P<&noi6?Z^KZBcO__1-`dldyM?^;3?L{BS}Qb>G(EAqid9;vOZ+qz4O_AZ44
> z?NmYZxWcmncxJmIwGk1+hQ*Fa$;#RLJMq4~_lUo*7=|?BGWZP at e+R!>aWVXci3=-+
> zEk`<W0R+Ou-*zwWS*!?Z13_sZNUt9;A|WXwI}bP_#8UW;6lcP(UbMh(lvoJA!^8sk
> zjTWcDZ;Utveus;bKvsb)>v2tB|1cS|8{f?>B(=M7Qbe9mr?T}Qxt~7uF$v_=-8fyf
> zR{ASByBo&^@lEU8XGq^}JUV&pCC<Hx?Mz=scd1Le-Q~2ywB!gWeJZ+yZfhgcpT_r$
> zrSq)bJf;M34~r4>AhR+(3T4~C_2y_m9}!jX`$y9#XvZg?#*g7m1!UeHT!J?VWX~R)
> zhBvj5<9qO&L at KD!Ji6Pm&1jn5-gY6lyQEKZK~rT=hxciu4l?c;JT`P~)o#qBlj>*i
> z?RaxDIr0pQ;A=?IUc8icmCbu`72fhG>E4TTXgKy+JUK33@{}PyLd;;dM(DSg=|O?+
> z3GUfs>9cZ=+x{$`I%<!!rHq4;o^H(nwp?K2c%5>Z+c(eR+iqS<I~l#b)wPe^;mXTT
> zMawvP5=M)D0g|7|(FhP#Rc~ymVB2mvdeN?sRDyyI2t`6Q-4yR$ON4#UtH+R6_rWmx
> zy>vn_^UD>=#QnH~TT7(<cq%X?HR4-?phmYXBM&#?!jVV2w9;Q;6f+zThSj!#zAKl$
> zhblbXhz+{@y--bIFbs@^T=^PtnmPaR7EQJ){|PaqD+JspS?K8&JvGb(L$^x$zGsx_
> z-q+RUyAj`*E6wm~Dpn&+<3#YO8mCD!$l?PyNe6Vq^KFRL<Mso11WQRnQ<?+Fs|WB}
> z?(Zb)AWjFxZ#jr(a37Ja2k`^|-#&;(LFn^?FnX;eUSJ8@)7B_$At}${X<>5RgtFRL
> z_8g18{W)v|=hf$MGN&P*J%?}Q{z|eA0qyVP7H|@wbp2mKX~u~c;WtXWkgb}YYC(F?
> zhWg0vLwIZy06GRtdz1c7=E$dqu#Gi#!}CzEACb!EVV)hRQy&j;QySDvMhZFjJkI6v
> z$fwWa$tti6h^`6GG=hh2*ZAhb-f2B5{+xJ)o*M$I)lOf873CP*N6D%tTohT{Ti3g(
> zcXRI+&u-7tZY??91iCLGQWKuRWc9y*Gehq0q}L9-NwS;qNV4(;oDHpb9}u`!()9wK
> z6kr^$QkZ_vJbRn*1m-!_j8lRiKgTxhdYkc722OlYiMZ at V`~o+L=wHIqqF$p`j8ne<
> zoo>d}lB$>ROm07Ed<jp2Y2{NInoZ*WghvlQ(KJbVt0_kx$<v#~xYk-5S3ZrD{RwJf
> zHmUg&9?n&h$NmILR+Cl;Wmc<=c(#XYdcc*`bxoq7LI|yfkcWlL5LyMH3#3A=iUS#%
> z!z{7#!+7%D&vsq(Jq{BvWh`q?>~(;eYNn=xVyazjiM<>Z3==ZqJL&d~4Le-MmK^r{
> z12LZMgR;i8Cth}d!p~fnLb?y*vAMIsxPHjP_2Nq^SF%Ff<X)t<;E4=XUk-Ambp7Pp
> z<l|5x9}9E6<<B at Z3eu~!3{H=%`!k*p65{mw-UXhPKSP6_O-}w9isKx)`e$5ZKhhOP
> zww?+Tqdb_NeNs`#kFcTKdgoQ&28vWnVBy=lf+1Oz4UIkM+W>!ZPIeBiBvvNHLlByY
> zr$PMz#Kx6vxt at 2A!!?Jrx3GrxWeY9_C+TH;pM5?*%Rk1I+U4>!%Ez35sDZ89wD3I+
> zwUPV2mxGZii6+ZkreC$7Y9(}K5asG1|Br+Go<aWJLH<j<+yWt(8or=Ay2J at 7V4)<l
> zys3NX_WmS#l8l^N?h*?PsH8f at bF}suM?g)l5XpC%k^0MCmIPVeif^*h$iCiMKIQU;
> zD-I>)e|s=xc|U}Oe(|UjQMEoZf388zca~#xH?{m+^LYbrbtPx3Om*&8rCcz<t6cM8
> zZmi?2>>NQ#*#u~=f^PymNx?T$+^!Hd10h)<Y#9_`3*eawzGD!+1Mn;b-#G~13HVqA
> ze{vB1Bt6nz7{~BkQm%Wa=}FTri^^#alk?)5PcNr{vZoA(SYE26*%0v%P`H6yK0iq0
> z^DHlNjHW?&6U&N>zc2`Yfn`O;{~W;WK=?Dui%e)46rqLXMaEwqguhG`Rr1oR<fV0<
> zipS10nvuRNnpZ|WIHXbz^47i#h0>_Vvr|GNjnJ3L2nQ5_2P~=+VS at z9YP>x};M+`~
> zOnGyVf^SlOMc!MAythC>wKJZTbozjT+w4OGZez8S#z<S0h+8eHuCPH7<>dY}B;KD`
> ziOBI at QsTV?32Kyh83PG!9};gnZ>I at PU?ieMBo@`lut5>!1P>31c$g(9$9qkQ_ZlRq
> zcTQySQU(&N9}=$~@KlBJ#NhV-1Q5n6gr^1-<x{LgvKii>B-CJ0oemq6kgQ<ykc669
> zLNevWLGoT?>B#sifZGFvS6GhZgkDt=dKGeHaOznbfX>PKK(y%@Ser$H?G#B*!!<o)
> zQGFUVz{4p#9Yc5^#GB<3?K2LP%+pk1`+&wzvqorOq}_ at FyDh3SVS^&ddcQs-r?0cd
> zCdX at 2;<Z77yrNXnfZ}_GD7D9;IveJ+2bcnyw+~^0kOL`#QU(O=9m2EMqB<8gz!Q*j
> zWC#z0Y6Ego2jo0EPn9!>=~;{FeAoa}K+w at 4f{v21cARdfENKHJxo=2;>|+I)&M5np
> z0 at -g_eKG8VQBokDT#(1+twxbFW`7}zd5jgM9P<q+*Z+ZOwdoBQ_np2X(;rQB<(RvL
> z?(463&dzfcPx4qEHifxh)g^nlzLS1In!S5{lg2gQJ)=b<%oU83Vvf#0O&V#odxmR1
> zLz5U9vwHwFZ82?Olw_ITFqA)qqIA<&U2u~bvRMbCR*M-3sR{uP5M(?}!Bscl=?bpC
> z0nbqIprLr5QNbf_z?1C?L4N}wplQ?%cp%}J8}Lj8A8`YorQjon;N?Pq-yVDeArK+t
> z27Ii7Yi_{DDR}4&_;>}^2JjX$RB<+6q~KvPZXbv+K_Tdd3hFZ`c=!!?l7dIxfCs8_
> z*bR7~Dx<ICPYiE~G}m=OgUb-gUCB*3?iu8fqj*B(Y;{qshJNDEu-}y;y+e*2g_Te>
> zIeQdVP}RhH6qYU3B<C15MlWP%J{UB~Y9m?#b|Q8yBukFrual{96)Iann4PE>Frhq-
> zUd~-?;|lH}%ih3=HpWO_^7T3b?6OV9{NW8b1J)P5w1HtdFtU;_2e>18IS*!5*y%U$
> z9iZ2^H*q800xOd at VZm12k@Obc$W2|vELH!D56U(w_#UDU?_U(y at 3!mqpDKgzY$&3p
> zBX5w-lP}-KBWD!L#;t(cgQaTsqlec}a&xY1j`JL!Wb^w!Xa3_%L}r7nAs`^<9US)?
> zIT9L(ROE3;=lQS8^yV-y?o_TKSCuLB^@}dc-dta&`>tNjk;Kl<b#|rm26ww!4Ga2W
> zbqvp0Bfs;v6-krGo_BB|H;#P%4xW6c8P?>8F2LyBPDxtz2>L)%WN&Hd6}qY4iR>D~
> z)E&IjnIJ|BPU-xM$J#%5@#x_KF-B0)PZ4PP?WLx;_FZkWT$cJy83k+!S>eRVaZ8<1
> zvZ4Sz;<7M1&TK=sE+@@SSbfYR?>lj>{f)lt4St*da=r7SpcckUY2bg`*$w_|=0E8?
> z2fwd7U4TrG()i%MYzS+eqM+_GNNMzh$-Z*0#`#wW8zD at O$|$$_FImg6{{&!313aOC
> zya7n^Ag)UCU?(1J-_-RB at 3bM^r at Wy`!;SnlttYrIhADnXj1$h4{Q=QK4&LmGavAHt
> z7JsHE3yK%$FT`o=8V>y0z8EF<C*<SJeNG<Y75+Fl9vjS&eEMb=y|yt|_S>s8YBl6)
> zOyD?ftar_^BF-!rD^TbGxzVcb>@x_^XvN at xv#5V$$9bl(=3#Jad8fK&!w1d~x<*oU
> zxeS#Esa)wwa>48bfhYK2c7i~o4+$KN%cypRT-)k0ilGCig9f?Gu9 at t7QF@Xn=dERH
> zx$7r}V;jmEE{+^fItapbV&s5&eM-`hHUHP5ib?|sM*f_9#CH2a=#PdjoekMD-|H&)
> zKy6hcB*xMcU^91!c>@Uz&*m)2&Jg8DPL#DsOaqR?UCAG~1&-xv1E`&FU5%<`+=%Ph
> zQ1!9X=EIqkP<rM8teyMlsmlB!c8tgYpM4-#SS=tiW+3V>17&gbdS3cB4df+ImqE11
> zxyM}wT2?e6*FF>b9Vjn^6@|8{1cUSpecnyucZc@`nc}qV=iOh^f_7_3><N4mrzN+a
> zfR*_g!k at syxhF`&32e}8IFvsUSUw<cpTOy%3tjtmBKAb&hZ8t0rz7_AhF4C}D-w4Z
> z_|86h_~$TJae?l>k1F=_v7U|eoF&2DXVj~CTu^r3Ur5P&_>Zb;cM3WF9^M%Gjx&S4
> zW^><0D&EJ1!vPoQO({w4beSN80O`>C_$EdQp(GT9urpJMb at hE*#7G*2q#7WVeSnKt
> zLfb#UTeuXG(1oYZesNV-Q2BF6O?!l`|Ha=sRaK4tU#fWgb5*tKT2(a;l8!mUL>;|g
> zr))>z57MzNchx%Xn%GlS!+pnx&~Nb0|K0hubc{51;W7B}R^sf!anqhrP8L<ezls(=
> zj6j%n%Z>sVfkL3zgIxO%+RAmSdkj`jXi??0$Gz-1)UXfn9Ilw$^&uWP{^q7>?vA!#
> z&tr|bp2r&}dg>Y{c{Z`5C^FpN!fz&0p<&==(PJt|<A?aBs1d&R<#Xh0{+Dxne3$wE
> zi=>>7 at YKmWWl3GJzM`g3{$Gw1N3jDpmAe0oBKdLdIX3?*U$t_422Zb|ejF|2Gi?6$
> z^JMQwxOnPwqTbqzP)DNlW6XXYU)!+3UpCbl1Pr_B-3Z5?a(=~zrsGu2mi_Yd*3v>o
> z`~??}>S!qC6ZM6BjLrY&2b5<s8yLg0WDPJ(>j3fuO8(2~!Q`_K%5u&Min~#Ezo<~$
> zZ;9tGICUh=w1H*XsAM{cWjgC5PPBjM+emrO6)W at O@y?(&n9j~F6QRSo?rRU0ahw0k
> zdj@>90pC|E<cBXXMWdDw`h7M15Qk3E=Z4FZw9Ws?lmPc9GnKBF#5;L>NnH+u3i;?H
> z*5NHD$(fV5$e!X|2||KQVTCE)8tAzy at B7qWiqHdHYSY+4gZF*9eGo81K2oE0wYQyd
> zy=EF!XlPGu$KDpk7vr6y$cgcmF^+ at OFW$_kI&XnO)p>7X)F-K5G}#$hBL*UC#8Zqc
> zfOw7g38SjTKxDP}4x|17sA};zqaty<LPg%SjJg!4NPMj;$TZgEg^W1pZDFP`=C5TO
> zx6x30kf15G`~3%~7}FK{2AWfOOM!I7duvxPV4nP3wZ_LYyZ~^IcNXwYGX1Dv6Jhc4
> zqjx>Seo(Lsz<%(qVc7QyHU_Zoy~`PPQNdyWyXdWk{1=!$KBj=$0^P^QytgyP^9-Zk
> z(#`|c^WHf$KZOaUet(CYALgG1!*~hgm--7J-o%c at 5KqHR&&C~#y}2wKXY+G|wG5pA
> znK+w|g0VM+ at h<WeQaA;e7kNjqWWQjHqaevIyu%psIYWj4^0_yZA^&7ZC?NmrnD;R~
> z<ntMF<TPFsMPS{w_hYR`(;Idv(&qO?lB`egw!+OqxM1LCOPi}|RH0%JjA}ElhKa=<
> zowIns6~3cqn3VF9MoK*sTD3buBPIiWi(}TcO^$S_zn8vI at _vFxhs!K5bVe+a`bpB?
> zaH_rEavNIhNZn`_Z at n50%f(Gq>(mLdtkV-JRQ4+k^n0Y2$}c1Lg3G8~>hB4*n$_=B
> zSc24Iy49 at uq{4zvh)FO=?SMGXp8;yn;R=g3M;r<K9X)y}kZ5&8g4C~mnb%mJL#ss{
> zrCzwI1ret!ETIVWIsG?0-u^`c@;u3B2;8MGX|te$acdU1n9sNr2`&Ox18xYoqrp{!
> z8wG9<xWlB)eUu&nVGX$9;D&;$mo|GMsx*<Ip6K2%-g=oHsc_1(wR{7Lg|gIF)nL`t
> zCt&t6&=@8N&JlF<>7uk*oY|`_7*p|T!M=*u#4sTklmV1g1h at q)6|Z at WCDp1PzW~eX
> z2#S$of5*0w$9j|Xh>y|p{BQw_Mvt!R4Pbti#D9v%2C-ryvp>a?3s?JUp$&wv=i~kl
> z?)TNQL9(_R_k{XT0}MSMEOmy+%L3(bHb02=G<o||JR$m6S8PQjA4yLU|KOm*&=n;u
> zXb^Gk)Y7gXw2}`uFWDXZ@)0q<Y8j4$2_dXY>n`omfG at l&$Xza&zcGt=<JbDjJQ6h@
> zs@<jZ453^V%%Wtkh;I%#QSmabling85s!-dx~)*)T5E-B8#3;Jb%TMP>gXH|b85<G
> zcv57u^9od)xh+xpJN;gTEd31sj(d)r{0wK>KO6KY-~Zl~!J+q04i0?~HzbrbIP}HU
> z!J*bw^0-|1QOANKs6=n?-^zVs=urvW5&j6!n-3j9ySO9FaI!-``;<-Z^s7=d))06t
> z;8ZR^9Xpa4&`xSVbAboz$LO^J1AgFhC1tA$$AL+?%!VeOll{|g_GUUGtkq!iRJ$s`
> zaF|!3=Mqd=VFrE!|C|d<&#@0?+f{|xHZ<v8h%&+EKkx&6+U`}!UynYUO~0;uwvc{l
> z*`yfH5NXbT2%URfDC5%F{QH0L)Y|-wD!SNgjP`8kRe3P|*0R#5`-~#83|EC+5pgdS
> zaT#Ax35_mTtGAW_Q at WB6KakK0#>Mf6TxqQ#z%lJVR9Sgl6;qsL9GyD%Khhe~TB0N#
> zdp#D56G|hkrIASA8En9HdXn%@oP5)70REB6WbzKV(o6K{5D&J$kR^0`xc9*bbz_)z
> z)9LY~qI{vV90DJC<ey;4)omwxK~yq`!bLZV0vp*#qn^Sn!uo&W1YCEe;d7iEPWc}S
> z at ROX+!EVOH`Z=Bvu4EEFZ_4agL$-d7Cv$triO;dkzMb|on}2tkv;gLn2yc)xTuAB*
> zauwP9&pb_^IY7)tup5!DR)CHyzkTBVLEk=s{TK`OqowlN=90iNTCLTOFhv)R6GP#5
> zyci6>*`f-5Cs2cqE*WT(rDn1E7RMP^DyjbhkBqbq?gaab$g5vKLB1ge8&CN7&S>S8
> z+63M?@RE^d$Yh=w>0Q?b29#v}8>yNMJBxo8r55Quf??em<(JU2Chf5+r0y)P%-iy5
> z{@T6Be3^a?!xWA`mIn&QA6)|q#~*2<n}9m5d{<J}*;6TJuwFxAT)1dt$u}YN)GBug
> zf9|`Io^cAXnyhd^3+OmZwz_b<y<<r}O6B?s`V$&p3G9B{=cFdS5DIhgGP?L>Z!V{}
> zQU<*oq^s56vp0IEFRzO=3W4j(<7oo{dr%Gu#ctM at VDd8e=sLrcGMRe4L|7S+^e=Hl
> zI;G^_Kw;l9Sk0WlU1QEgjlB+OKUwf4j^nDygJ0s`f^+&ydI$=P4Y1&L{>&DQp{LYf
> ze*9Hb!SBiT5V~-7YLs_=2ch6qbZ45J2tqz%;fIzp-62rk0)LJ_-s_NyXls6c$g>>1
> zN81${ft>JXMRo9d67lj_)a-##$r(iD*ul2BhaMNf9XzErg<8(j)5k4m`7}tZ*BavG
> zDp2TYaVFz9a4HmN=NRo<#;bwfGc5cCjU}te!he?&qEA8~bW%)V5}HqiAHfWHm(gE5
> zGFQcdZ;A;=WY!Laz_C!P7)^Eda8#HW?BS$pK8?~{N#!a(s9dm~mDc)?Pf`=ywUC(3
> z;i<GfRG+C;d?XX{Q(HQ3b)W6(<ufXh`Iw4Hd at Q|4ds+k8dk&8cspQRFpSTy1Q|It~
> zlSB}^o2l>;jSHb2NX6$<b8MqonyoH!9ERCj%UfM3yaA}S(rj}7*Lc*(zicv8RdYc?
> zCp5g@!D2s+x7yH at m89`&JUnu?{61ZsTf0XLffy&g#zt;G=>})yV_kg%Z<{%Du31B0
> z?n7G{^9_5BIsF?v8U~iiZ}3#Ei);rl+Tn~~i{&Dh`B?{_24lu~@-`6cT`r6KafaRi
> zSxkZ~-s23rk=144gK5)u;t#bjjj-!eI|gDxocaGX4#zv&3okjkH0;?;9DTIY6)Jy!
> zfaBW|r_hI>&dc)W1WJEd`yVgrAH0q at W9jL^Wb3zh6s<DufyRk}Zy4yn)diLo*%9be
> zv@=4{o&FXlPpjGR*wNu0)g`WuJMvU(u at G`?gH&@gOhL8)63P(0f^2Us<{1wecOJ^A
> zrttxp(3}gbm=YRSDab at XG%RwY5_uaSD#o)`;h74En(=59o;pB+8KPB?&GZmshJ-4}
> zCO{%6Vm}(KKu-b`#+afMWQU+LC-R74!xU_1YjIyVLt+$U7a%%@=oF;Bwb*?ZL&6p0
> ziPqv0go+pzp<r7fJ?%9+&C6;fFOxtN)2eZeg5&`b$&f!N$YenD40%vNrT`+Bzz9Wj
> z10ZsKM=A&bL at tw91=$S<RKqxc;yfxxIzUfXsCZ**@g>eXRid?;rm!{vp6Ufo;`tXI
> zKBq<<jgn+ij0z<IalChgMA0b&=oCP6y<rT^8bGrE1^pWkJsNF;9|Tr(<K%_3xvd}E
> zHleAlxgO#TFh55*)v!{H6BDIscQE_D0fr)&AA+eNC+Zl=KFi<@)K7h47;tdzVDh(a
> zd|Q$HtS*Y)OG9ty-fae-S_lH)4EZslRfCYr=yPo4x`*{l^l|i-6&S;dE3Z8^k3A$>
> z_8p#cUo*Qxh&}94p4~^fk`5~$+R*t;6~&$_%E#v;dTSM;+oSldD6HorOAL|zdHQYs
> zvM8jZebD_VeUafxqFq|H6XY*lY}|y^ZY?qN;Ka!9hb8hs at E=@(f)=|kk at 6l`TAe?w
> zmVR5d9R<~Ql2^p<=u;g<p9oh{i9XVQIHwHJW0U3ik81a!+Qy|l3(L(|j{07>{xK5Q
> zJf!rwjKOw0m)<ud)K5d2flsnxF5n5=Y*KOok1et(j0b$^kfkXYn5FCA`S6VgR82)q
> zwN39fq4xa;G7l`bahbIWoj#`FGE+(G1suC{Y&g4&QBi#FZ*APzIPn^N#6!QVfzXIR
> zEGNA?!@wE%MZBScL!IvX%qRl=%H$8yvwj|&jj?GYTf*t-`xh7xx4_JEu>4G}U*t+<
> z%Q9VeYL8BsDbW)o%PLXC8uEyQlknCxq*22030wE(>!BGTw?n?es5`0r5*Ok#n_hZD
> zN6rA}m?JS at 3=d=0>%G)|{f=$|a?8zWlZV8*@kG3N94T|-$@YSLeXOP~xTU1UDozoM
> z^s;T5tefHD64_q|jb02M at Eckz;{5+YDG_I14-KLiLH<qGDSAE9h?A|zJ|M*V>jHsM
> zD;i;aV>XRSI+U;9jXJ{w!$%<j4x~pB(A#Eo4It715%b(f6XmUdTldzbiCIdP46$gp
> zwJL*~4b!3y{v(=*{URQZlMa!Vi#R#DlTXioDqhQj{V3ba(m%-gi+DM9t4PK7_#Vze
> zj(m at e$uoSNzLLTZH9Gzr-GB$9tKI#jp59~cv^GMj&xad`?|YbE=tWy)F?!Xrin~v7
> z_bYCr;vP`kgNpl{;vQ1m=M}d}dFmfRzYTM27qSi=aV3|mLQcWSrqoPoX6YmOM7dk5
> zZOAg6?D+vt3#Xm)3qDPd-#woD0skMmzC9qSDu4Xkd+xvtAPf%$1Z8*&zVMBP!vG^X
> zhB&5~O{Tb7+QTBXvd6|5xG0$wTgI{0)v=VQ%+(^bvKrKMEMJwgxvf*^x`cPy8u3N!
> z$oxL%+yQa-`}<?&-h1BXb3W(uI-he+{J8gI!3u3Ar3BRQncHNB$aYf1bjVlQK0&_P
> zOByQ<I9NfJKwubT)+%%9u;0W%OMkmo&3v3aLs-;{Q$gRgeu6+iTvHcHav(z%P&s7!
> z35ri)mt^a=kQ58jTxF>@KCgUT*IKrOXvk5Jke=fHiQmdvPbz==j>!_d)WI;ncl{=2
> z-%}xt5@&nT<y4blV?;spmd)KS7vyZ&?2eM{rZjCtLD81Y at Qh($UvbYhNS)@A{DcTM
> z=?{0NGu+|`7+C)S9qkjxuxatKdZ)`HKJh-GnV$BEYc(H|H1Bd+aY?iq$ok-|#1W(O
> zjmRvbY<F_40iHt&h82t6+4R&UacJW5I*DZW(y|u6NxfVEa3QWkd>I?OYiMH!2yfrh
> zA3H?5aDi4_7E^@hD7h at A>p~o3<WzR5B7OI=xK;R=mR$kK at HzU(6>;j_W4cS5R*DkQ
> zmKp-SV!dB$5=60ks#{YUilP*VEylluH?4GrImRjfXc~v&2=0!WheXsgjyqAsIaZWL
> z`B=)xrqNOy(IJT#xkWJYsyI=o**op3m at Y(Dlp3OZjuou%(vgt-KlIsa;*@?Pd~0@<
> zD)WGS4pAo46W7E-VIhsYE{+n$P}6nsHldC_dmREx=>F?s5j?uDgK{&UCUlDbfFxHs
> z#T<AH{#{H-f8U+FC#(ETG|=&+dR|qhuGD~$DLSOMJ4!vSjaK|F7DgW~)k9N0FrjL(
> zG{wh)cl|C-j&1RN$^>w0EHniggc6j=4PD~!*xjnLiXGM18Au!tv6Ha6#Q4|;Svjl}
> z@}T35U`Y>li8G)<`&h<>z1pz}C~smd^5)V`i0EhY&f-_%0Gh15i;n(}xcC94EiPBJ
> zMXotM(&zorKJSmIKB8?Qe4WP(dista`a}*GoR`JZtZ?i3b0tU*?77OV<<H06lG4=R
> z7Y%vq{Qr~biD0HDgPB$bGd;yJQLA6<pU9 at U$&<zopuZ_Bb0^&A{Nn8R8$sUWB-;Gg
> zjYuwH3*a9|&~}LIr`~DZMY1izs2OzH4RJDa0j_yrm)Sa!#CXzOr%N5$G;<}gNZZBl
> zl~W{Z&rjFwKtAp#Ye=If*L6raMfco*(LP06Z;1Vq?kBCTt;Dbk<Q(6I%NjEE{%B&5
> zLoU^N&r*H2I8Hc0OS`#a^ZIUaX!I_a`ng<}GO~)iyQr&MEUfZCKqATFrG#J7$lQIO
> zl(JG7CF#|*o{^m}Vh6eS5_yyJU$XB>0fLrBoR@@V_BJ%IHuyHSd%{f#z?@f~QinlB
> z7m!0XnWCi-&+VQxKcQ;^pnh$kZwACnVG(r&#5<!w(h_!oVz*Q-VrTd&(_b6G+_Ybt
> zhBHH#0yir5E_!Vho{|zw*MT7=PX|QXc?q+lJlHAwubsgYq4O~UE`bW>3OEHGPY8JA
> zY?iQ*U3yF`o^<%na_{Le;&3y@;J#)I79u?R-yvekEvAm?v{S%2P+OXaAA at Q(h&Z*X
> zf}8_tIYTyh*RdNQfN(oqQJf6F#vJyQjV+QB%K}>;-kHy~+4JJwWH(}RdOCAYO0Q?Q
> zs{GCB>wGS!cJUR^ePe@;3FOwWu$$^2HDX*?74&`Qy1I{DEy~;SDhS3*5;q})v at RX1
> zxrRET<@Cl^J?U;85QMO8`o`J3{`o59?<;xo at H_uU`<#1=cRvH+TWJl`{s)S-TSMqz
> z3Ew_}JC*x{U8TFKd;7oECwMOapLDx^2WnYLvL+eoGSEnpyt5hp2km at b*+?A{E)wpd
> z=Ovso^#3e_gm||>?(D`@AWbAUvWt(#EA at 1|22Z|cxa&Kgz>ai>N_M)A``7wK(jpr!
> z)$A(q*)4+M9T(`Ssvm*Bdj4fpB&S{!na>@>t#e*eR|MGXNNK;>BW7k$w$KwAeCOmI
> zhl5b#gI}4APk*(_jbTc)mF8*FrBUQ_c8EK3O>{<<)-w~XG9E^8iCK?cH|FeHPb)%j
> z3Nv`}pv^pJeF%Q7>K<+)_zoo1RG(eF2DlTNC>Jq{bzllRX-fH2W&YI-?3Rh(8%xh7
> zrohgpGA%|S2iR?`NcbBcy>DgaXqFZ%o8c-CRi0y3$r0&k+YV^BLy;-c&5h%o5r-p3
> z;I!>@XDFUp^0o=Tfj+@?I+mKV4ukQ*mn)k~OZAd8PhY1uYLB;C0vB&LKJ8fL*sX at j
> z2+~v-wJm0dG17c3&J4dzb!aL4>g5W$Op8YfgXl&ro=`Zr)BsshBMhGkWQ`^8{6?2M
> zxV-FiVzyvt3Dh?BMbe%b8^p3m9Zng;r?tGuCn#_4TI0ze6;5qevg+!yZyyNPQ`Cv?
> z?Eoy2nH5TzPb+k|e^r4~*Od&S2v10|I|NTLP|2L214;^W>XR3FGN9m%yVkfPkH#Jz
> zsMgOMQvj?G1Nv#?E;$%_zbC`3>r-_aE78BrkJSc1^JHkI9h%^DhIb{Kg9*>d29^-I
> zS<|<rtT@(I;8Ec%H+yte&U9ZSY-JxvHi&-tVK`^12$CcyvC(^((rrPR>?Q$&J6;y#
> zOk!f at S%{m-OwpEr9M89^YK2hvPO}8O at 3=MamJYd0v<V6WqW5hWP9OAW-<>a)>@X50
> zR|q3p at K#P^!to4Y7Oe=!32`4Ix7H!L!iY|7<HyM!8(klc2PNjaee4X5ABHd)!BKsH
> z-=e5Z_b#9Z!tuhP)*gDtX;m(ea2W8v|BItQ8neRhNs;cTi2xn$c3KvJlLpx!`s?*A
> z?nr>PhN<a0o-K<myeb#%nF_Q~j=*Vg-d~B~GPa?CS`yMBTwz;n57PY+co4qb`#wDj
> zFH=}4HBd at 4D@C~gW#|j9$>N?+rs{Jiz=>|`Q6-x<{l#_ at yZa8xZMA6!s^S7D at zm50
> zXBU}W?V#0*ds3i{@5?AAioi7T-X1d&#C8K&*f}-`#OnWVG4J-nW5&GCy2vuKjLgrE
> zo#gVu{+pRet6i`c+cSV}MYrX(M?yw at BsN5Ne}$fQGEgaNsWB2b;|01P66aL0o*<Ip
> zN!wa9=Z>1d_q;-PiQGztbO=P}{nd^-FpQ=M4Kmrtzz!(K*PH_7$N0oHeS2g_HIRxT
> z%v|$wJsDezIz(2^j~-xh>|O`SyO-74oZ_ovL*$*NA4xJmqsoliLL~jmG%N}y3HxbQ
> z6wZtE{(2Qqh-3nTp630PE{npcLMUAqg(pGn)CHeK7kst8um;Ju-aU%jXTo6eXsm^#
> zQ08~#u at Jj~?Tk at FVP+6JDyui$saz-{XeNLoSC7ZA&g*eW$*T&nZ5(}`xjSB|<rrCM
> zO#B3y4I%ej4!@#NvCf_6{i|})<`^x3Q1r at wr==J4c=(JK*BPJol6D)CUM8CL!VWDY
> zebw($2b>&G>YEpK0gW)5{)k|Ppy6j+2Ids&1x0b>xgfKu<`+++k?nLrG>-2#|IEL;
> z1Q4tiLh>cFIvS@>Y;;9+p-X~1<+3Q-uVPD}`-Urog)ocw at DdpR61!QplYi~mBERXY
> zv8Q&(mun&B2K_M_r$+CRVfquxWh~d2t*ENAk?Lb`X6)~K0zOP~*!DBBR(=!GyXdqS
> zoWWpT8G~=@f1%7&cnM)-WKytCTV^s10XRBi at a;kcjflmwqm^<Iy#=yv6O<onL8GE+
> zWh at AA7wEcJj%n}4;*v28h)tu<aRACa0Q~rv*$_7Pa;Q72cQ_^TfQ+uLWy47gad>D-
> zPqLZh!7Ea5OosCDO!I}X?N at PlxbO?z7>7r&Hh&d|#|^g`b)Uq^2IkD_p2fM^4V9}g
> zdm~|+!PpyLI0o7{tUm~EJQ35DSrl7m0MRFs9SGr>1%;V`3%76+kSd*Ls|B#LsY!*a
> z-!19B>|KM+<^tDz#(aTBIQ&Jb$E51qD7V_P-Q#<_3iUlsmNu=F!`|rG{y2TsB4Tji
> zPC)8XJ<!8{F)`8|LP8mZer5rndaC<^-0If6bgtH5TD2+YPzqvaD5IyY_w5D}0@}>?
> zRzyB6e+9uCwGM#J_9WA*&Z7J_s#F<JioC}Ss3i;#y$+ySNyj^KfP_Lir%Loxk5%3+
> z!DsL7R>%mUXu31i9oiFuHSX&m!w>8&OY04bgTlV#eF^$fx}X9o#p6*`^W;N}y1Uw3
> zI`zh30P4dq)9Tzw%uUy}EUbgA#~-bbQRls~)HzDlbdHpT&M`nwM+3vu-;!&C$Hs5~
> z`W0>oR1tSFl>EYfmAuLQD}-K9L#uj&o813|;zedvc6rs69agcc3uy4 at n-U*0?;H(>
> z2E;?$0$0SXMfWf+IcOpYT!i0RUd}}I{45v*et8Q%>@m30Y;;TlPOBOxpL1)NKSUr;
> z{wItZzYK&O`+NgK7;`dks(L41TXOnS`F0ZE3zop=OP!%zgM)2o_7v}e_8pD}QKu*D
> zkf+$KCr<gCPcX%9jOZ>k={NRk$ZMDeU_yaf+cLvd6ZfU%zWS`GpU-FR_e?atRL#z=
> zfKiU!#j3i)9ctD`B4*OwReY(2rT0PjX9|r=#1k`{dn7W|u*&-X#g{$Kdtdy--Vmad
> ziFm;DI&06;dq~XS-0?_V)`L`DcS7&`zuhr?!XtX$FS7N^;QP<?R3c6tb=alp-6PKj
> z;6Mnk^u+%s{4h-$h|`4+Y3V><I{9=N`&vrZ4+J^qCAw!I9w(fqzYGLIlS>CC;nWEi
> z|GOY3FX*84e=3;XHllq%sZUor at A|p|x*`cThzAi3OU6kL{ZHaUIzMX5AT8}$DC!B9
> z_SSv=YMK_cqDTKbZ!o;^zr#xn;_b={v_2VU3f**1GM)-#yE_?Y!y{`D&WL!TZvJI5
> zroEqWV97Q*cMzUdwdSm6WYc&#w6t4%X5MxFHR0#X_K{4LRC}_1eLmfWOjnriLEI2y
> zNS?a%@C49IElb6}9`CW;yW at ZW#PG0H?rZ83QeN&&`Gnic{jiU4!(#L(`;&bwi=b?e
> z7>sudVYGEH9>X_8f1#Q+<#bXCY$78Cr&?@4>Su6r_60-%^$TnT8l3^O(!dpQ-}-a5
> z)nT0wzMd;LpFwsO)9U)CN?7#QAntKsC at -bpl)G3GcB5ZNaHC0!$~U;}_BI~k1YtTV
> z80(aynC`==p}9j=E3m_iA;2Oo*Iroz42=Q9MkNDgC*>C#a85K!^{G!?sMoo3pz3E0
> z_&)ApeZhe5jlI){FG=hcMNg*dpFt<=IjK0Cr+6+Ej~m)I#bq@`Pl#-Xu#4{R{D=HS
> z3=s6kRGd(?w~X0>WRtXA{D at RH=IsfPA><FndyI!XxrDg9FABCgjZZD9F|YBl#t#~=
> zKsi6%8p6u9n_Q>gzHD19%&=mVsni;ij83Jk)Td38)>eOH9JtrCr;to1xnwC>Yqag1
> z)|lrRLg?dZI8oeNM(fjXGBn0Bgq_&LvP!b}5z8Q_%MbAkc`O4w$3i2&kTW3W5wg}@
> zdU87Nz#^!?%sWv7xu%lrU=_I#p3hS3DP*xQXm&DHUIMWNES6+x5g8tgr$f_mKh~H@
> z={Q*njmc%z(FN%^i9`6=bbOaZ9eb`FGj|E*Bq6r2HA;>Fz2R~y`{pZ^qGut{%hHb8
> zf?<#B>sX7n5UVlglM6IC11C;}a+$OR1D@}m0)^P2jf;*(8*}%Xp(hJjFG!JRh at 852
> zA*3sk?<e-%Q{B-jI6>YoA~h at xeKrGUCiWTq;6#fEV#y~NczHIfO9ZJr%~jyG0FNQ8
> zu9LCGFkV**$tF{IS>>5HG2Fz8-jl)uR%GHFC|taRK^ptt!kaU3det{d{Rwre$yPoW
> zbC|2y>geVac2eVNuA!|Se>mCOA)B~wmJqtlTQ0YlFp8ip-VRb441L{O?hP|7MiC~w
> zQDUVvs5fIC07|HBA8Q<1Sf3w_v@(K!bQFYZn^x<0>#KkXMKSY-1w{;D-hlAT;FgJg
> zGImF*`fWs#>O&Y2&kxl^5rbv1AbICecJNB6-Y}vda_3P?;PG5{A5RFjR_xLc(IRLM
> zx<i=rHM98W2B_}mE(yZ7`iU(RBH;CHdNvCuPF!whdtq*41VUcqJ!2ZRE#e67{@#sE
> zqatGTg&;QFPC}I9eHJqiNwWw8?Q}#ozBA`XQnE`ROLi5LTC|YlSpsYG{IX|ro75f(
> z0*1j7Sn&gAr3>kfY at 9xI6saSvok=7FB!6}}Vw5GYs;2x+6aiD2IbA_~X9U!@5yGDW
> z>4CY$+99UcI|`WdYr&XD=zt+WN~VBFXc~e?3d3mS5d7z=+Vw5Ajks0GXfBjZN~R^S
> zuYiPt9AJXC3GAQ|#${Ii(8I<zclEwq at 1@vN?S>BdYOSl7oZF=(IbGApLA%*g(wGm5
> zUvlF_?~lzPzB<P!-}8>qzIBc<z8CmDiafTZAd-v<?kO0}_Y^eb;KHH9{70acBdnI)
> z->S8J at Lcd&*LMZ#gLMtLpx!N_V{`G$$;+9&Ie7Gqp-oi&-43HJIL!v+wCbyilxpvC
> zA}F`P1issEZ%b>BVO9s>l*!~|Haur8&Yqm=>}S>scPbOqOQDqs?8}oDG;#~d^h<VW
> zlzkszCY*GhcKOY;G-D`C6ww(D!S-8<u=i|-M30h$JwIIwy=I3IN#X at KZb|9rTbVSf
> zI-8$RlJ1OzxX*7%`MH|Xt>umbcLxo}|DM~swb2IX$13>lmTcbzE9g1O<Q_GZSk^a{
> zSavfNX|V`+IZYmhivZ9IhT*}(B6rDUo)T}+JTHfmsh0(2lyd5A2|@&O*z5z8rePq6
> zB+wJX at KmOA*+1gsBMjzY4I>&)yb*)Z0)91aY8wch#HsxIqU6n8f6krHWrf3xYr8t<
> zVgzH?z;|&e$6La9+&>^aW6}m!y9x*42lnkc=f1?h{?21tU4K{itWFZ1xPf6P1XD#q
> zL_x%?@qx7kkIWjc`T{?hLqh#qxkrH5&J0pFQOBfI(-Xt-$P(Tj)|z1Hp{jddux9m3
> zQCk-L`X}>c1|6}&icqHKcI8cK8i5mI$D0->M?foLSp7r?U^qq}9)Xht9jzMyQ+~P9
> z!4dU1^HX3xEAUetEdr09>pKIU2)X4;072gn^m~9oq8%e}&Ny|PN-qh`RWM2>mw{te
> z9m5!AkY<<8e>K3Ju7<L2R}=_Y){!_V)@B>R22|=ZBj|G@@z7`y=uhYg9|`FiBb&V<
> zh-{yX#Hq2Y>&MlugS_D5_aOW_5|0w5Q$rpeGn5H!!+}Zbfcq at 91pHTB*H472>pILz
> zNTx#dPS?NPVNl?6d3aENR!`VT(14+y60fMLqI6dtUJh-W$J(Zu(x+{Cqwpx*&Cdr%
> z;n`JV+ZMNvhVe83REhyAZyksXl)e65-66SRr?0NIvGwcJ#&ch%G at d^g>P{}s+ptpJ
> zntw-xHi+I8a)>9x84Zkq)%AYgS)zHrXO<|N`Z%iu9{-qamShWO<N!&pA{TtZ!NI(f
> zCrDcJLQlFY>jXX$%Q^{RElil;p-CVsb5Qh##DI9A=5+G!u*02dIZQBNA at 1KiHnnLX
> zQs1V9NS?G!qd=(>y;X~RcIe4&S-31*s_v-qWVpiAzR6sPVpG={)mzNSTZ$RUi>dY-
> zKubA)QR3T52lhfnA}yW_&=9Y=BIQK|$tT-Pqc$=|coG<4-ujpV<H<HRruk!V=9s>P
> zzHyVrb=Z}PJt=@Rhk*Scau6nGW^)Q~E>UTs^<!{iRf#3=pK3m(4#|99Ik2+|HAC+)
> zJ=1-RDj#HfvwP at r$oIGO<NLm3m8br)H}%cF|8`5B-&o(ROcf4hIl>LOq287JjG%N<
> z;f(0<*Jl|*QPAN%ON3MaG^|XAzCpfAc9sVk40DXG9*f!T`Zvbn;e9am)L1+_aZ6o>
> zEL{;m0D~TcZtH{B1><mHrtM}^L-+S>YUqAGO#H+m`t&$Fa@=f^cD<UEkR_^w;mIOS
> z#zI27Zpqf=0UiM}vL6#BV9NhE4$m&U!p_ePl9Ov}dvf7X^BK}=d|-;zjL<6O`GQBR
> z_QP?~7^L?eI~Xp-qNtWIhy6epvqpTIODo6Y)G22RBCYm)(N5jR`j*g7Vh(5^DvCJW
> z+;9c}o5kvnie><l7c(C#u1O(dj`>(~nj_lriY4&Pb^5pQc&{*<zBB;{<81ow1nd<o
> zv>_iqE*NRVMEp?rf>J{T$~Q=1$^u$F5%|n`+B6YQ6LsIxj)^!!)HT1IFbNAGj#Wn8
> z6e}Hk8%_{kuB7?5;f#b$^P1KgbEzxNfV9Tkh6;G<jJdB(qpNPiFJzkHtSG~1qgHrk
> z8i$;_V6?qf2}uUPcb0KT>oWK@(2N4ST{ug>D!^l_-ug$=8snrtX^lhvS<!SP&V-^N
> zd7N=leLV|_%R}0NvJnLk*55ekWrs1R_z;BYAYBYA7Q$8=r at x7U;b9OS1>x~V%P<~R
> zP|%bNVR{HlC^bpayke;*Z3KkJ##I?mVvHV*h2J>%jc at wWIMDH|QD;83$6!n}u4*bO
> zNPg>wrebx)je&#lL^ez?nN|QZoXZbv>&3A68GTVDeg?-djujWO*ln{H*cl5YcCnzK
> z82Rj_71Tc&-vuiB93viHRUwVS6W9q9Y;y*%+xm<MQ9{VHfk-hM5OQP2-(ik0Z-c-i
> z$$eSaBg2Bvo9o6s(wq)h at +qr+O{sUe_ro4J&R<mU?8%?ol=f7g-T3+kE;*w3)e&T+
> z>@+^#oMC!Pt34TZbK^S+$&VW%x+V5(5<3KDDO?_)BMNa!)v%)jnIPcO%jowkRns_L
> z!ML~QcHrHqT-|rN!ywHF=WqN9mVIt-XSBOb2D!u%xcaDaw-eJ7N2C+X_PdqsNdhGo
> zl%)TZvvQrGJg1~y-Xf#UE2<WAe1uvDJywVZ4m<g?@u?3@^04AcX(jW=$d7$P<c<8=
> zwhVW%5+L^qc6NWEgT|Qf<oGk}m}{s$sa!<%eaNQ8BVo|b()&$#)JQ(f`u%)!niV8l
> zxubz_j9pYK=}C+yjm>If;uNcQ0zGWPw^i{>k#Rxe_x~pozeHf#J|v$rE#Al_na>ID
> zW at JIc$)BN-Gn~3Ejk<{XX)^GJpZQAWR)5+hI}`G}>i{*Pl<CaN5J==#Bt+D&c~CZa
> z(#Mikr_LRtyln|wsZ{2>eq*a`9GV)Y0YTAo8C0*N%*TW~Q!t`In~U&bp<r)9F~)*$
> z_uk|Z&~V^cX2u$L(mST$wea|13Wy?i(}+@>Bc#*ur8pfPwo?3h(%nF_OM#XRs0oy&
> zRwQg{v8D=QOd%=t-c2K?0>!?Y=1s*zA^H5NQ1sn&{Z#xIe05LdWu#5Rj|wa3E7R~(
> z!&g8t2~bQ)D%#WnMNG{%Rfl<3NS9H9`dvEe4``DuKc0osd<)KooD~*agYSm#HVdyM
> zW;&iSl$Yd9uL<l$rO}H}oC67Q^$0f=zjMgT<JM~$1Yk*1z3H at iIw*InfF09u;=Ol^
> zDP*dY4mIjnJhTQ)M}WrD@`VuA78X+!18GX5D?+SRqRpQrvhdjuZjTuW;Q#~%g8a1V
> zVEC2L&XD|K-sZI1@%3?LsA5W2xu=*xu5Iweu&&@WC!bbAOeu@;u9)vb1sB76V;r=+
> z3|j_`XC^>4#XM=MU=Ck=X~p;yQ0e9}To^l2-F$cB_MUBc|4E=BGw?^6)fRO52zAcD
> zDIim}&cI12Y|F($cYiLvzRK6k(_MgrCol;C5vzg at EXOZrH%WS7v*}f>*7#0w`;i2;
> zLKDo8MoLYZ40b}`bZ-egRgRP5S;U`iMnK!r0mh4{I1 at 7;rXlL1d?vmP2;RDxcyj6@
> zUyW2OzAWPoOdbFU>nAgMYLTV;z-P`-AeP++UZ?FdaZzX~$kxpu1LRrp at M!Lb15$6A
> zC%qg88la_*SaJHycRoRcAJYJVf8-uo^@650by^@$=@@N69YZ1fF)jse1C2Qk#iCIt
> z9gXIN+{c$~&OrDWPbz%h3w5<x at nm5O9Xtys3J=r#S$GDtea$TV_?QYV$ZfwQTo!x1
> zbgEUSA^TrEsXg?!t(a-b%)iT9Nk`m)pAjnQyLaG;Q0Rp_ at IB$Z{wCfqI(;@Cb1!S#
> zd)^K*m7lxFzm&I02ovsA=M=WA#EhdLdWfL!Z2>_t7mXwl<N-93^aJq+vp8?LQ$0xW
> zT|kv=p!W0GH~nEY&So2QIwKE6HK#R)c1QMXvjGG<)STU1%I?=eb7UYE%3L3i*lRbO
> zaebF*_Q!dOne{4A=hXIu at 6YfQyT>SJJ40O2mhQ!C*&WLkL36t+?3SD+NM$&QD^7$1
> zh2m(!?9CkI`m54AgoJPp4?se;lEV#$^+d<DbF40=t#7#`$f3$yH#RRqfTsSIwv2W?
> zsM?E&!Hnw11Dspuz;G?1U2}lEz~J2pk}&r+!>w`}b6MJx;z{%2^R4ZYEHxJ at bGa`6
> zHxkOE;+vr5DZ-Rb*h&p^+57W9<xrNIJ1~goQDWHh6Z~gfvtJ9lR&7C7pT3C(@by6-
> z#*Fk=zv#=Sm;Pbz;X7dh2n(oq7e1H{BjOHI$DuSC>Dgwd^&^4i^AP2GzPGCVE_~mF
> z?dOH^%jjH#1u%LI(S;Gv>yPXbJ3m!ELlOy9E{m&(<Xs(o5M^4>uU01p9cY+xoXYb6
> zkF)84d3aHO#ho-K1EaS`*@mLf`5h?ZBKD4<`FBH#bo#{I_&&iz&)$vGCn)T;O;IA6
> z7>tq{QoLWgBmU1VSqHcUa*93OE|DcL)5qKJn0uJ_&LWcDoPshDB1>UfU!0V_K~gWX
> z*?^Rn%d62~1o8}wbMoQj-3MetmlbfETSml1%_$_OH|H^)GfR1x<@8RXhirKApxN%=
> z_O|QWT~~a<B~6ET8DEihL&%j>I`|%7JM*dO9-NtI&36!F+ZfVs_Zp~zEo78fG0`iV
> z>2vqs;W_j3^VTCkPiuY!0qIJvAP4t+q1tn=Xh<WVx~!h~N>AT|pA;6-viW!_JT}b7
> zInjg7DS<P}4Qp)R3<>dSl^gWLd_1V+Lz1R?aB?e|!8+=BQ(e0Ee?r%t`#(dSER>G8
> z7r)o<&#q5MD3Ga03sQFPZMzqj2(ci%xxQ8IZkqH7vPw`yh;kb(ScqR2F6{l=Lj1BI
> z9NT;UB3vbaqSW>WoHB(?qQ#Jht#xrn&LAS1+N?oiQK~)7F4#?L`TkmA83`i=-1O5y
> zoDHMS>)QJPDV)9-=ftz<2S|&0rdXddd)F<-Gl8Z2uow@@{Lq at hEJwiEFq1IhE7XG8
> zMl$DG^n`M^G56>NK$7Gocwp6M231Nn>OM1=^$0Xr<@-%K_dM1009e`^M<cq<qe7q)
> zA>IDsF=(ZCQQZSlG1fQE+xEJQw*9c4DbdTY at 8*^$b?Xy*12OjLFPE6>QMp<|@u+PX
> z!7`TeGU!K3u%7!e9O68!*Gqv(-q0Q|Yu7C;^fI;C5?HvM8+QfoA{nubPar0U+)Zi7
> zF1zAqH-E6+^AnHk{t|WvTEnlPL~47^3j1st5ZU)R*;z23HPu!r#2tyVtrl(EYs)}_
> zhmLZVlnO#7 at ubQccYis=9Se+oJM(vviqy1nnq0(udeyYtK*$#K##_+8-lC5CaGq%)
> zkXu=VwDH8yRjjg=ns{hTT34wj-JTWmC<%jKIB9c-L9RIWvEGJOy3H_H`up(&AgI&s
> z$CIbX!~&G5C%)O3_}LYZA%JFb2WXSs05a?eSN4e6g-vC1NI&vpmqyOuX-_kc8c(tD
> z)xswF)%_rGF$33?`|<6<1!`J~Q~EQ_CyVhtb_4)}vvU?yzG^8RcU#>N3}Vc%!_0XA
> z6oXE7%^3R6)BJxGSIZ1?D{-p((qy4wHK1n%gM%}lURa7Vqdrl0R;h;-%=t4-ScYGK
> zE^S+e$BpFR08u4qoS(xtkNKytO*YJb`@l0WcHGwsM(sK<YV8A{t+{B$1AJY$?g2bB
> zi4}3$v>i$EFk+Flo^<x!T-cn#w)8%L<Dsgy2k<QBWsH9`-3P>)oywaQSPNut4tan%
> zPT1B4*1{WnGZoQBSR9lEyw*0mHy!(0c~#(X8WsZI5B25)y~4Hx;?f`=bi_6R-r4zc
> z7I+^OSX*l<o1;MisJh4!xaYeUivnwHO;RV5lgyxDzL;88S(VQ8DlY{sY2f}md8Q at c
> zPwJik(vZ&oCG%PAu*;g}g_l_~@~HR_P?`C(`XM|kb^axdNrNJaoRa91`a6NHSEHDh
> z&iSN|47Mi&F#xqI58-hDhTMno61JbL{$X4zG|>Ue at iH-T6(!4Y_Qb(*raFNvfzMLi
> z++yZ$Q5S*Q^4c|QaONijcNmtm#Stf}BKa4wXCZA}j+4d0Wwd)a9y_|wl#dbx#{B$z
> zhc~vUCk8mbaz~Q1Jqs0vXcjhSnio2q#_&QDUGfOX3VUhYBcK(&43k#}Vt5!khr`l+
> z&#yj#<ah_svyb3J3-`>5I47sdp$w@%k6=gqH5Zckmcafoyr~D-+PQQDWVUoNZBLa2
> zov(FWkyBYU`T9h5BtSJYq*3Fe_$1KG$V!|NYV*!wvJD+ui67 at 4-XM*TTz2?4h(c0h
> zo_EB~yg8U)>xSBj*Zxzdo3nCDt9N-_C=l2F%<G(=N7-75ho^9BTlERmlg?YATHBP3
> zJ1hOw+`={NG5mH?7M~0~ZZQnXPW3pJxrF}u7`|7toG_+hU4ic%wH-vXP!O&{V9r%^
> zXjO;TJNI_z7$@!2c7(BzPN^eYb$z|_B>iy(PD*^ZXEx1s^p$+>a?_ZVF!L(tW_V<7
> zsY{oox+TpEx#6yNKLkJjOfZErB);<mEnkHbXFS|z!(?D?L*GK at zIF4<oVTx^x3Uhi
> ztrU!{_QZS@&QC>C2Q7m(uL4Fnf|?)4LqmIZ7d`Pf9xUy*dcUO`AIHby3Qw782$Bu@
> zIE2gwRAo#mbkWsM;6a1_><UFuWPqGXrda~tR<Jc{7^--=!V>t#O+R=7`{N4Fm=<qC
> zb!ThE#ynD57q&A`d5a!+5@(b_u`4rBoua(OWc<#M^#^2uZR8_UErFH?ZOcMBxKsEv
> zJCc#|jZzQIHD9t%GU%mU=1GS7jBR8`U8A@&48rHo(W^le*+8FOjnhUKo~aWIK7`JV
> zY){nJ1Ix$;>a$X=`2Bk}6O?bf<#GnQe)F4|fQo18oXUK9Vl_ at 3^m<2i!LUc)=%_J1
> zQ+TSO-gtYVYtO>ER at qeeb>SHr at f7|`Xo at TRWCVzjyPksH>y#-__rv7;?rP=8q;#!e
> zgz$N#^4V at PZ;|p8zCCA+@}e8F`@CS at 42Bj&u at -oBP`~!I-2ghEQ>SWKE9io!@kqf;
> zUwRs+iSYTs)7Z$K9Z%zN;S2qT{AI)m#jc{GpTT1iWex=^g90hqX4+u|IK=Q;pL+)9
> z%xHA_xn5kxZl)+hfopuXblJ at tL<0Zzv0aBi(l=~ShWcvCSD-4nm34DhL_Q|SC)*7^
> z$s`d$IY+NNgNMg!naznU#LB5K!h at jc$(F#$2AcmY9zLtQH!=ev2L~fpp%nf;r~}u5
> zR9a_f&;sV1sT)$4rAPMS0}&>30;<~tDqBipYn at p4hn=k~TzOR?bkDOmZEWEgva~KF
> z-w~nRShD^PdWXH(HnF%12y#;4seH6iTi3F4^v<z>B*)ss_5m#kFkq)>#2;~0^mo3R
> z{J4$CCw5?Vy3x1&=%zp7?GU_%ZMgDjIzm|RHy_YDp2I`?XWLC6kv$Gg&EmbwwggT*
> zKwo(d`0-El$LDZnzY(1<P*ZC=G5nvU`YIeBpS$ZszO)IE0x~^+)Ej7bn7q{zxP3b{
> zR^eH~3|e1>7p8ybv*!;^M$IW5!ma}#E(A_Q5Q8fTs?f2cmMnqe at 6Z^6|0p!mdV*&Q
> z at 2QU(ns3LWsvtM;GL5H9IY)+&kX<r)(EGgX^geFSQs$p`w#Ug8%_;f)6Htd>ok=3e
> zTb97FYFCK2yj6D*o9dCCA5-cD_A|&5_|s-*Vqcta#{M@>IK$Xdo_8grZE<147TRvd
> zD*<G+aw{}84OBo=t-*VeK3t7clfLc{mG9T5nhYeVqnZOP6%v6!aclu?s>XN6&aj(g
> zgB;-jwDoo{rSaIOG_D3`r?Qr3$>;9CB(&C`oMWCJ#9}QZ{bWMkwFF+Mpz~`$0sDr&
> zQG?TGveZM=y)Sl+a at yM=7kScy-&i at ltEA7jq?`tv?#DvZ7)!uX)Dy<cpOyj|A>*n<
> zzz(^B0nR7xsR9hKTNkq9cwcIv+hjaOc$=P)Vd(2=MlBu}{Rfc#r`dVeWv9;$wBo^9
> zJY0B%Zmh+33c2*xTAXGm-1V2gm%oKV>Xzki-Kcek)!h$LiH=OITSn}bz>D|Myfrw!
> zsvhL<KNnXT-z%Q~+9iNau~+hxu%}6rVDgk0!;6>6#j>FebU$`87QimcTOn7l!=R3S
> z;ZzlrXtrPE_i$*`??5(o<X0wW84;Nw+A0J|ZgHO`p`e16LJyJmM;P$*nre{8V~8l1
> zL at M9;s`*}Hn4Mq!gPvZ4Q!%^kw{s2tyO2h|U5gi1{Rq=|Fx$Hf3FBq7XW``<@0%d=
> zsoN5l%hIk=@0+gQWf9^N;q8iy;cXzi{U$ReJP6(tS<9+{w|~hxMrPoxm2Y!Sg13JF
> zqNF&bPQZx(pd1j1cuS!BZ3vBbVY;ghM+sZ0vkpHh%%OSDt5mS^dHhWO5|+gI^CeLZ
> z at su@~<PuP!ziU_r>TM-WTZe}VmuUGq7 at BkR*>(6{;XC at nI-FGXuxSZOQs%!{RM$#7
> zLCEWXae)b5e1+-joZ}zxgDRuc1F%fwf_D at lm+a(AOJHpgF$ER7H`(qV2wCF#eZl3x
> znRa$b>zfNMlcI}SW#b$J32j)=J*Rs*h!$@G=&Kp%d%#Fny#RE*jc$7ZWMkk4#O14n
> zeq@|?mUjq~8CLo1mqg_>RbIfUnX6qVeVCCbe*a3AB~bF1>u{ftObB_9=B>xuho0^b
> z<VApU!z_U!KZvDE0OzN%F!=6(@A;)Bm=(pSOF7-}B8c6mX~K(mRD3XzCj*iU3nsY^
> z)mNx#R=<cxR-K0N*jH+WxI63!WMnhcoGugPv?mjqJ{U$Uoy96H77v|F?@eQ8X;_?W
> z;(4n<9)R%wJEv?9<~8-C;nG8ThFqbX?u_iopt#gzFq0utUi2c&>mty?U&2YkBzpf#
> zI9GhJg1+(+uIg`8QqB5ES)pVp+2+Yr{_g!*`Gsb^j3-CWVo|#HAc`+WD1WD`UdB05
> z8WP(4v-?*NGfad);EtE^peid%i@!1EwCKrFcCwo6{EuWWMVRP;9K~)lDqHQ@#r1}j
> zD1%J1#*t|ULL3%L_kr8=+sHJP=&}OaM7!bQ&9z-9Q=bU+v%?^=<ks3E66!I(J(W1i
> z<~YZC?gh0Y-l>rdO~v!{dKBj=H6|XK=S?*m^rJj?I0tx2kzTma5(D33y{RnDQ|>91
> z4RH<>4ccAz-UhZWFL8!DQdz*3-jp<(R at 8Y)m3HQg#!?*IP961l(9rR`ckw|;<h1?k
> zq9|Wbe#*BF6pcy6`|>LXhUHt|2s6HZsE)SR<H9Nqx_&1C9M+y~3~miHH>*v&7~JZ>
> zQ~V85%p><pB`6DkmQ6yWSfm3~I!0PYhy|CO at ilAqWqI+(Sxw{H(h7vZPq*uhIVJl1
> z=n&DCAci}hwCdNMIxm>e{()}H;;pZuVNDaNptF at kXEyY^0e}c4I`$1;-JWvm%9_9{
> z3jMv-U?#X->H4RkJ<)_Skh0ZdwwsiXK`e-LJgIzP)%)X3ddCDy_o*w&7yN|t?jw{5
> z8tyhJ9c4l9QJ5%aDA(C0#5R#QVcdF_nENxtsk at 0d%E+!m-p}czSMZEMd{o0?6sn%C
> z=M%h`w1S!$X6asikZyYg|7FlLfd4%bBH=I|cfm74X?NYRYmHB6Ecfo93tq(;qVs7g
> zzX}@kGjzwRK+Qg-Ctk&aK=k<KRXhP7QmSdz28caG%i$5uVI3X?ux_Gc10EojAi8k_
> z9ye5tDC%jb at u?D|JPEMUdml9$!b?4O5OQ5E$3m|1B<<XQQ?hx6<R^PFlp at 0nNspG=
> z^!$X?tNa_G#nkv3j at K+65nH^Q+Frv+ at k>heh8eOLhhUb4c=4W;8znx;n?l#WhEr8!
> z8R&rK?Nax$)S9^eDL~|j=SeF9&DdimIxhy54dHh8H1FqEtIMp;_vBXYp<AKwNj&i5
> z-V$<U<f}dz$z6oswhKJ=6Nq&(7h&?YC)X!Ru|x+=)s?2vVGTeQw$f=0ct+KItPA>j
> zVI#R%Ycg$cMEIn9lq)K~xT4EyO}RZCWZf~Lj2P(9;<6evm}uR47A6_UVi>$g6B-f$
> zN|YM^7K((vAT-^rGsQMRxD><EvN)SVkZOzECwj^qcnNox62Tn~*d4EWi}k{E1jU(E
> z$DJX{Ps&Js{OEN*aYeBcy$IWQdEBYJBv`tiIxb_9)gdUs6SzQ@`ma3ygRP9pNIgT!
> z-Ok(8{g?Cg%rw+D^)NMg_==w7aw}U*CR52G at 5B+fc(;=q0pYvCJCSx%V5SpgwwPNa
> zWA8*#%2%EPJIeW+2yYht1~T#vvuUwOE1Q%p<``j-d9+YbmsNK^sg@;ACNosU9fh`-
> zV5YPj?Z>t;E1V{UGXiodNMdqM_Ko at 8nDas$S-N-QM(hzD=mJ?ZVdDfo%MF(9<v-Ot
> zzb|6_IlV)m`yznoWXAy-?~6dOC|a)<HquV_&rFka#xT1LyLN#I)=Ve|oO}snQxumD
> z|J^SP;7~TPW1;P-<h&QtAK$<!(Gf;ni8jA}a2V$jt-vKB{|uPUTc$G_b8H)+&1-?=
> zvBSJ$+5G_|)Qjzge9d6MHAal#8%ES&Rz6*CEUqUj<6dR1$$ChwSmZRO?*?|L9D_Jn
> z%`if2E)aDt=ne%3C>N!Z$O98>^;l!8r#t?Pqh??4?63U2Guf-*NRi5r!p$$K|Bu0$
> z$cMiHP>3UoV`6i5lWvazgu2kCi8TS>jz=9~F9}UyB(x^r)i8esOW^lyG;$M;AId3P
> zRA`WuW&uHX!1#Iz%9pA|sRC{B4k at buRo2NsL#>-||8U;asAw3%v$S#(&P at 8r`?EXK
> zHblri(U0{;?MqY&Pq1qfP8+-uE3fl2!E_3wWs9TGc>UohpvXGKLVZx`eLpjM3 at 0Fq
> zh|?1IdL(Fni7*=IjWBj427lLAi=?#$&@S)`vvd9)$-qsV&QM;gffeg-*;PcQ@>5m6
> zcSfm*W!8uOrlj)ILLdAKP8ZJ7m;Qp|C#xO5zlTvXQe|iR<$;5)9JBR{8dB$4=PX{l
> zDhz(%hZA{Bpz}|p0%}X4=l_Do#a=NRqN?^(`RtzZ<|^xU{Il{Y&E1SsW4G=}@tBp5
> z*jZ6%Ho!jxq>}}k at ql41HURL<6S>VPop<=KGX%6EwxZMBQtlIsi3eGMfA-wrn(Qc4
> z?xl{+IKAqMPcY|2ZSgE{XK?1Kk$_Toag*_qhT-y8&#<cj*;~tC)-XAPSOB__k^zOm
> zm at ty0^W3Wn2Q1b8m)LeywpG=C at WdHj!UgzhW;DkVxbeAa><SE*g{IML|5d)<#L%IJ
> z<V$Nra;`5*FzDM&^ShCj&l at sW1W9*dsZUov at A^w+boCZoG<>)-wERsWS{<NHt5vEB
> z0I$Bl=1mP at 0PUu>I)Q68oqwinTX2c+In8z8nZhvov;(Jvw}Z+qqAf7~h;DO$2>6&p
> zPdRW&)h|va>;(MR{7&|~ahVB$2%#yiyGa;`%c*iUM+hgMqp18%RDQUO58-0xw0vo^
> z$kUccnMhLZRV>AJX{AX*LNQtu?#w4)pgMG~`pWM->}PH3cIU@!7G;wjCYWR;Tdat_
> zvK2J<dzB6Q>S_YA=;n>Nc9CtBcmMUoH|`sL=PSrx^1q^?c0~`yDSyw`XNh)`Q~?DV
> zs-G=eWMWX&0ZzBVR3d=8&+r^i8gu5Y3X;nq`I;=Twg|`#5~Lx3OdC%2nRVK&FzbHl
> z;g`(Y8I<Gh$_ezrH}Rm7tsS)<bB9K6K&NUoW_ at fOLj|`o0;g|sY8;bnT8wMMi0)FY
> z7hlrYO?8Gikn0>q2=C!%_tCH3#CHj&XxdwN+?acxM_yyGB&~$09VByJBhV%bP^G^D
> zz?pqCgK6j2pJ0|#7$k|VdkX{$&W<!GH at TPb`4Z$kPWQis(?Y6uc`qv?=!LgH(Yuf8
> zx8cR<$ID+q1DHV8c~^Th-`2&dc%~eq-7tN0Fkx?_4cl;Ps#@@DMtW4CL~do{()Fvl
> zCDwm0J+loDSBH&{>qG3=S~-(B034afLasgmbtUCX14X1qrOGeoh3N=Y at LIEYttn9J
> zouFD~S-MyJ#By}~AY*qjujXy;<}}a6cHr`kU#kjM+>fXHl9j9cGQCZdh4#_xoEJIE
> z9e*Saq{Xc;Epj+LZ>~*MGyUf>35k1^0K>h~Npw7QHWvn*?Qt;6X3o1VJLrk+KqE|T
> zX?7E7xm7xlLT<v>dz?WSI2F|Y^Hix4ZL#XbXUi%H1p>8GEvz;o|Lu1K)71jR_E|<E
> zvtSlpf&VkehmM#4DsOQ3`~&*`niZ2_AaM>e8>H!;JE~lqb1EZUT82eJ2upZlm*0sb
> z0z#nT2}+tzd+tRh^nG~=dc5tx#qd5F#XCJsWexOx4iv^p7MI_F7RiEMB(ZFe+;Px^
> z{;cFHv<C&cZg<Uup{QbG5y2rG%9x-#=SX-Egl5j_{C;QotAPsuz;t)g5gpLBN$~ww
> zp5r$a1Kiw1+tto12xAZf`U2%X)+%Edc@^x5Dx}to&42q{kwMB6^$NN_kP!$Z12tj4
> z#(?^M0G=-RaVj7H&zMH9ZO4NLTwUO|``BiqK$q8V_nY3HYMcm^Ew>R*)-jcK0+V-X
> zWh0&t-rw((Rv?Gl<#$qN6EI#?=6lANGvfknZNiCFe9G(B^lHJ6fK(sfk|t#kM*36W
> z8EzXQCV?K3&?S)~?<ypqY1ULU&8c at pyFk%GbBy857rYCh!3nOAF3CFqW-%huRDGIV
> zbHLF0$}28*MO5JW6hAw^ax?q+ggpkj`W+lyMS6BQ|NabHV1IipA#DfjMW`O3zC#?{
> z#fF%vi%eeu;*iNX4VqoTbeDszOm~TqJmt!hK*h#-A2sG2Y&GY_gnJe!Ps#>;J%XO1
> zQt#(hBtCmeqmLmm&D-5Dt`Lo^$PB7=RBtiyo^n1B+xhwonjPbJGAS2CJ|-5o-b#;S
> z=J$v`oW at n4r6<A}XLE%C&(YKS-^EiWa|uv?ia}o0rAY{A^lR-1&^Ur0&qGxCRsXjh
> zZCjP0-hkOom3Q%&ktz^$eJPV9p$N%};(xM`kgGLb?6add#H_y|pf8rahgVh|xXQ$G
> z4ZwDgEcg$C8Xo0GJ&h+7(D-U46>8k39xTt8r1u<~K7Yq-!H{V9<`fO<i1(a&Sq^-M
> zsp*tooFVMU27ZkWyF$lge5lxIe5VA}8jLR#?~_|a<tJ*|fpe?utyYX8h{ZVZ;Ayid
> z=3jdbzq4Bz(wtnX2VSpVWAi at R8`rK3;nF~5R at f9L+Aoc(3KYlsG9c#i#zd=uOsgxg
> zBD4x}&X}ivxs~Nwe at +=<TaACQE*9%-^`Kg%x_7fF$&Q?{ps;{k#I~r+n1_VAt~s8P
> z;JYKJjV%j4ACOT&<f- at BZg<kkt}^#7XBTT(QFyv?8_j(mw8gt=>HB#2 at EmnNuXNSF
> zmFc=IX?{~_y>zJ5q1gdBoz at L6n5^5w@)!!O_$zh1k0%y!OzF=ir(fmW1rb&!%(ksZ
> zL*T82y|pAVz<(ni?>%y#yv1`B8FLQg(}6qjB&Na7-HD4bCy-Xx1c>s&=&3%_ETPwv
> z<{rj;z}N<#_vh06J8`OT7yWT3&YJiBWcP0{20(NVZZaGC|K=%INihHN`PO*KeIeGr
> zlCjEaUmXck{^)z&r)6hi>5)(8{T^oeeiG`L?F*Td87D!kj>l-d-_!Yj#S4X3=>EUr
> zapQO|2gKjJBEanln!@@sQy4R~ketR)l!-(%4gq*}4Dep0S-bEPRm=nd2$htN8^vBY
> z1l4>M4g-o++y}A5A&ErG{3U^%Oi;CvYcp*XLYUm*_HcbvV*YmT{ob77KjAOpbGBdK
> zIUDy59|=BdIl|JU-FQfJ89y<r*geEC-iB~Gs1|c}<5 at F7_Jq$cpyTXLlIx7P0X>-#
> z6ls=%cr&I4r!0X>GAI<eGV<0dKiEOF>J*eOl|R-5CZ)$A<z+60UfGS)N2wSQ5j^$v
> zdGd}Yi=9Eq4(%X1j~NPyZxn!n_UBeQjgm&EeSlM<_>nRa$iGb8`F$jP;sZRU=p&n6
> zlpIrzGSkK|;G9dCTS4Fm?Nrp{7w5c6gmO?N8Ddn%cIwKIQ(wGN4nL`9gtsz`Dj(o9
> zqry(?7%Zp4G%qsh4lHBK^lWnIk)1Gn1#H>3KEiB>&-IkEZ#j2;1d!Q%=Dhf!o&|LJ
> zhj at I2K$Nj0L>bKt4#dg8f=mKA#4dK*=Xc!7wWC`53K;yD6Mk(3k2}u=QI17^hiq`j
> z<bF%{LwD2G4{<_O at otx9XI0}QOW at tF)XAv%jURskteBi*D)mVn;K8oLSb5GJIR~L`
> zcerh}5Xr+Nc5J5`L+B0Y-2@|qjhJ1$yKFZ4>4b)*00HF(hEwls43dV0ObYav8|}aq
> zBbASARS9Ca(kSJT at dradqW`fGS<sl>>(9|n+iL0GER%6@@oo at 3kp0OZ09PN@sBSpy
> zlq--Mx$5m-%dHIc983;jm943J0K~m-HwAHP5u};P?q*=6Aiezw6OtlK8u(XE9*&h!
> zX{B_?5_rUKUHO8k7L{SLoQ>xrSGp(9Cy2S;+-DB~2#1hdw(S1yLA4*Ad+FGZaF)2}
> zQ9A!4oKkhK-hm3$)@$5^@3z>tj at 3v)Bt2Q!ybwTPP*3(+8^?ADtZ(s{=`Lm~vK#|C
> z_&daOKXU|d9<S3C>sN)hXi7IDq}bee1AYZFAalyv!Wt~z4h>vuUAb<aTv3L<pt4W}
> z0aeiAJZNzs at Up+9Ao<k$%BLno;@Q?(;#9U?vU|*q4{Qb;dP&$hwGkTl&WC<`sTC&O
> z9rnsSnw<~te1GS!?+j-gnzROiH{XWDkOscLx%=<%n<JyH4CM#F at d&d%@n5~9vnrK+
> z0_{wf!<$9}!HNJyB*ObF{P%NAZW;^BT*DR)Wh9NVKSWG~-(L+xCY+fYU?Ln+uEYPA
> zvOz8aDbL~OqgQK)t4E7((uH4d5GN?2_o!2fnM8RR!;SAGmmrl~kXGjam^-UUw(_vD
> z8h)F-lW5FdoEfy0@(W8m*}&q41B?4Un593XFYKpM7&b8-Menri32l06&$)tR_zGJu
> zG=;fiZceU&OE}q4wY)61hP5&d1Q%vmDm+?(9Hqo*(_<!b?<lP|%&3~T!R}xe>G__A
> z3e!1!t!P=<9D<K?yFPF$-o&K0fmab#K5>VatpGJROZgWGg$Djh`J=Z`c^PK9hTSU0
> z&8B+tK&b($UW6WKdTejjo|a(fgDiA?YFspWkW2oP5mFOIqoqAI)Df>1?*?8sfst>}
> zP4vAKcMu0*P9G4i*oQMGUU&B+6@(DSO=DrwHyofjwn`yaKIc9a1Ze!N0Hvq);iOo|
> zeiMF4=eaScdmqTqs%>2CwT-Lh;3cwPLJ1Mw at zB&ITu6}Eb&hV4-&8b|Pk1D3<UU0X
> zm=-FL*w|zBZ7{cJmB00LRYsjrJu!3iNNj1lA1Ig_TLsZD<$ud at pXH<IL#ojoGYkWn
> z&*4w?*@J at VveHVx#+7zQ*<zBxc63?-|6c6GCnR at r^I`Y3o4ES#CrGQ~vF4DbqCEoN
> z-aBJYR?}l3q&)aiY8?EtL4-0we1ccd&;g&|^l=;2dnl$Mfr@&hx9W+ZPVnX{K40~v
> zS{ZeSn^v7KD!(k$ZF{Uktjpr>)%1~1aAGuvx+_$cRR72W`{~9{0O$XtY<GvUbF38R
> z8YB8NahPZkMml)v;2EaJWQg}2_-EGCsHVxX)MRvwZ7NW{g|J}|)(@WSy2Qw~DeyM5
> zT|7FH4b~tdAn93mT96#Hx*}wW<gls_ni?PX6vK04Gol5b;-pzD`Mt)RxyO2hbS^XG
> z^dSe?#N<f_jK0jKvkM5k&+Znzv)MFMe%XMn4wT>nJ}zpRoCm^u)2Db)4rj}nYt1Py
> zPJ7-2;+DZ~aE12(;NTK=s*`dT6#6;+^;0}-JY!gT35A%WT2YLIgu;tJGAd+Yhn6ge
> zh(dz$%g$r#g$;OzPDVTXHM0}2wNO?0etcB((azOMBTfDckD5 at c$AKgKu(>9Uhv<M&
> z>y*(l+V)so%d|lElm3JLA_ulsps}{7Q~i3xfP<^3{24YE6z at KxXUy?S#!?yc?CxQn
> zpo-Q5YEK|qK7lG+k*ev*tRMVF&}=GwjthnP)ciT9r4kba*&VvoYv`KK@!eJDUAWfd
> zE&`+)tDI+dGS(KkCk4L{ySYex!+A#Cp(|#+Fp6(4t8g2X^Ue!BvBJ;2IYN6%!a8LI
> z(v!Oy=9(N*l3O3le-|fy%hc&iYUqM5 at Z?dfO|2GWzwS&CW6AtEdXmsG(EAij<s_Ry
> zWPEV2EkO*C#W;x!bL*7`dh824an?KPh0DNG*qH`0tD(pFnbjrAo-_%g5umHRiiXCm
> zL_^tuujeni3u{HWL}AMlW7+aVhn>mBQ2k~)*NK-;Xp>^mP`T9<D~FI!w(e*_Z%iK%
> zJ1ya8iu4u~;t*qP4&2|?B*a5(wvr*OL?e_;+U3MUg}F4V1*hm(S8I$pUnbD<7Cd=T
> z*FRDFH4`=<Wvc}}^)$PtT{-8zS}^}x%_&?E`K?Ah>s1<qvb+<a%~`G(J5pG#I5ii@
> zKh?|wSFZ3*4CcPXZ8bTviLd+o(t?v7m`rkIQ4SU(r<T8kG~Tf<rFw~MveuxD&CB?T
> zP_`^IgFr%`Yu3t{AVoaSwk^p9wWqJwL+`WLeiiO9Zjdj6Fq|Z}a&U#Kt2rRTR35;C
> zs`?qjrww##3TADKgtz4H`@PRjP0}cHp$f$GgNDm;DDa at UAbX~@>zz at 4LDpQdD|5|y
> zG^aygOHd8x)y*;Lk`5?=x^0p0>nA%49{E;dd}iut<9kz2*$r&tO_!DLgNRVxlFRd7
> zOVDch=RoBx8g~$<CA^gE6J+N+q}78et|~ryrufkEgP at 6>rIiQqfVm$$?I$g`OmCWq
> zfKb{JgmL~NWh*()mZ;VzJ42;8B=n4AMvI!<naU%O=KGd3;1&Ny+X%a{bRdcYc`gh@
> zw8g~9-xrcF(D%<C#MxB_r^vK%e};E}G4Zg0v?yO%kx-`mk+e-pua`h+%V^xUlQe$3
> z(++I8knIl9OF`ej)g)zy)e`vrhJTxJ;C`R?Tlhci{T4L-jCNfkHtC7U7`FcmyT{bC
> zxhur88NS-#KX<>c5$8us$eTVEvYb(~G~#y9ZTA1tCb6jY5N~=<9LoxVQ-y3Ng3-4B
> z7rN&VP6;0d=!JQbblQ3dKNLHR!2^Ie)4G_j8%)E!PtgTm0vHP^`4Ue6jXF5bzO=$T
> z>+eZxWVQR)T^mRuxTikQ4ngM$%-K1bDNMxag>sb@(6TeM^Glp545Nb&<M=2`F`5(Z
> zlp0634Y)W+DWvAZcue9dPqFfPvA#9 at sKj;(HI4H-iKC$4uSQyb7!R}U-y}P04a|$c
> zl$lY{fJpX>sg}U$CqUu4zWxwD at vDPmLsk2ktbh7J{(h(nxb^8JT_XQF2JZ_%{E$HW
> z_<>1ZAYHdA$LN3~*pRjVjPc$5n;JhQIi_^2DPPh;JqZ=eJ?-=aZhdeTltEkOAHg#d
> z2gn(~nD6myZZyr)6LF_$M9gGyXOVXRJ#+-;#828era&09Y3Hbdh?kD<91ZWU?-&h{
> zk_#Ke{ikV`3x?nu!Y&4^hT=b=Ru_&>G}MKhk7~!Bg?@*1B{DS at 0F5*`e}}n8T)0T+
> zpa)z)ZjAI-7fuoe(XgX<X!wYod1i!`@zPC4ae9)G2^uI>tlV_~Wbmur0Z1=a9vxSZ
> z{PH0B+)<pCpT4OjTxJWg_b^XK<vBh4%YygN2 at SNS7{>0y5#num&d?JftR&XH?(Pxd
> zWPzSJibqa3>wi-{jL!e2zi4ZXh(Y$ajLhDfZEvwIMkbH~hIq_xJMD(H3+>mS2ga{p
> z at QrlIS9s~->ExV4=b6c*dA89*Hh5-|BITUj;Fxst+ir5)*7LO|g%mjoJn276q_w;Q
> z)y|oM0&Oz95%1gceds}WdxmJQ)XdqA0v>b0Fc_r~UjstfkYvAP8WX3B8B4mnBiu7>
> z`laJ+3Cqgq(_iDv$piEiVx=3#7Kaio$zTpK?mXKvail(4tR(EPI4y)7*z_2!gYoZj
> zr?KMntL)c+BM+o!zs8A)e{x5>a_)$<UT6^9e!XPxU`hBj6%og9;-Fh5P1tm{g9;!g
> z`f4oQ<8G(L$M6Vo+!(sz7#^<M$M)nEezm`oHXXw`Bl(v0j}i0$%OK#{OSpFX5Ht7M
> zAG8Gi^CD=f=h)u)Z6=sx0~(IwT+u7gVaIV&(gNUIshghn3dZzlY;ABIb4cHY3LXZy
> z{NXqrlQID4TZw10cK}GZvpky_z(CZW6(^uOSSW2i4%%w*V0!jA&K}h5>Tv(UtdrZ2
> z_W&q~q!9>;1I8VhAgSR5PBRvL>(l`Yi))Ai!5{-ff=oAC8tE?j#Hj-e$(n<-$Ti5U
> zj|{j|j@(fGB+Vwnl<j9ac^W4rC-88<jh!d(U=jL%;sj0*6$5QQfmhDH3pi3*8?cae
> zJyWKY*Vy@*pgaF=TOHTse^dEqOV{t^&Q5nYAnSP+>l_JT!;j$KOPsmlN)*PNOxc+p
> z?5wOe9(N@{n|GeXql8(s^(5{e#d5?z4n1(rer$%G!s&@Da0mouL1377fC(iNeLV^R
> z#$q~!`&SLN7Bcht8%Zu5yYC#0Bq2x*(XkagQUoy1fp!-u)9s*6duBRxx8gc5xAvR3
> zZZ`pT1FpAyNu6 at V#Y8n!Vl)u)G_=?%G<tTS0PyP~`*2c3PoKiEcMTxvaSj->dUS`r
> zQYhgb1!L4oZ{+>=^fEb6EK~wjHlVgcKKsQ1YPjPzmZlb&HlPq&g%riMe0+n87BT=}
> z<#ShB5YnCQe#-Qlg*FIEPl{;oB5xDOwJ#ZS=C3kNJgoO*Gzc*oB+6K?LD+wYd!7o+
> z`5d5 at VhOxH-y24M{03)-zC=KK{j#1$e2bIfjV1vBX2})jE8L>J6_ubN4Hl(|8o$Nk
> zCLX&iUeR2|o*{Li?kzVf`_k_jGA$6G>_kcBQ2=s at F>#IGlg_VvG=pNDK;Qiqxb%mz
> z at Cn<)Il!b(h%li#sqOGS0yJZBsZV#uyzBP)`Aat<(`B|gG-CSPB^%ykswDF(YCBvI
> zY5jkky?K07Rr)x5?!6~#w{)e2LeqsVETv_U0yRzBP#UZyEGksQDv0PfS}Y<iV@~J=
> z3KnF9>0ua0gLY!auY(=G9Rx*5fx(~*ZUoUWS{7 at 2gH8%XOAXEYoO{y>GxPiW-uL|@
> zx#ynkp6yxBbDndoyE>dt{3V|{BfsjQCxPVwA${G?0hRPjU_%8$A!$lrqXj_2J5A)|
> zwD0}PZud?SdHLl#3*wPC7i3juZe%`Jp2|*Od9~NQJ9Fbqd&*OR#{*7j-A5M0A+Ldn
> zOYr8g04w0ti7NT6gStKwrrq}2zy?6xU$>RDiEV%Hlij<z3-%*+t`9OD1c~(M^C*Z!
> zw>9*q_pO857BUZt#Shz#kqYq<cGp^HHj_L^srU#phz^+`%|i=L3FGbGiR?nJ(5vT<
> zC9&f}{fWa?w=KXtW|Di`U$TbY&GHz<^a`VKwjmaE2V01`y#zir({s^+jFy0CL3h6s
> zSl?DAvVD at 3ti+*{p07canQf>gkRJ#}3%k3*S=x at 6SD4V7L6RR^o{9?Sm#2VOl65qA
> zO335PG}|kr6*|QVskmA|<U4KkW%Qf*M*-YYf%SS_ER%{ohVP<m2_&*xH;|-=cE4+<
> zYrR7GJ)@6JC3-e&p)KACa)DN<Saf at 0SZu{0U%&XLEuZ=(!J1~<1D+-h=G`ObJ1AG2
> zNc2jsZGFB;-U#Q6miO>9G>UA2*maA4+O&p_JS~jmM-<YVP7Ak`pYk#uh+Xd`7uw|X
> zO>&qKh!{W`jm=dZIj*+`w3i%`k!g1 at LBc>TEO<R|`N@|!a*uUz&7bJe)50X~1=@ES
> zaMd4Z_UFP_&01(5b2+-;b79VmJ3aqocG5w!G?#SzJG{#%W%BSFq&TMxz0prU7xFYB
> zdIjVdBjwKs^D;vs1}>m at fHMH0h0y%Ac_giWOUtxo>`oOmVu=)@Yt9IdaUm+55pK4J
> z<aFjTJIntnJGw9Di~z1)Ng1i6uw$x_G6qt#;gqNwQj*+}qE1P%hFb3aC5=fF*3e at o
> zTIyYWuD`WRwT4`C{E}r-=uMjeB~#ZI!oo={Gbc3~T~+>DT%7+eHjWsi_iZsmEtwHV
> z5}*@$cqaOfN{6I({W;QQn){`Y%Huv- at ugskL*F;wBrAhH22ca$-jGgPzXWOw>1Vza
> z%DII!^`F9ys9W7pLrdw{8hY at bLQaIuUkao=Xv%x6lK${dVMO76=BQUpmsT^M&_r<&
> zHkf~xeC%s*O8A-ItSIQ=O9$vpUkT}jovtT*W#0G}1fqSg203w!)~#V!JYj(+!mAnj
> z?E6M`ew|fM8^02MZI`_APND29j;Ex}A<BBCT}c%a5Nax|;>_~>CT*N`Fngybg=F(U
> zotVaIS5tB18zrU`kH=!<e()^-I(m`Ch~rFo5Ldtje9K@#tq;yAPJJ}HcQfRCL8 at q*
> zE9Dd$F4*GI2uL`d7Cl5&$x(~wGd^JkH-ql?3BTda)0 at 5)rh}~T at YlkKSsD~=A9Sa|
> zf2f!FZx|Wi+**>_D=_GVVdnzt0Uc{dYTH~E<JKM1LAZ*AsrzeT^Xy`8lm+=Vo=IrA
> z3HZBQp#5P75bxKuto3S!-&$R(VG#3WyQCi+vME^OQNrwt2Dik~ZQls#De`>bd{f^0
> zU$NaMERa!7!L5;8)bovyk+rp0-X3`H7uVKonueUX^GUMj_UKMwMBYs}9nHXnq{tdt
> z{b!qiY}Ub|SAb8?O%Tv1Ag}QqS?(yvzL-{b3Msllkfml?Lw`2Vx=tY>!?n<heHQDW
> zt3dIuZXF!`oClgY`nU4l+2Hr9sjE|%G|I%9t4=ZH{W_PK2so#>kfN$sJ&y)Dg-q at O
> zO*ktQCybt4&7-H`v$<?9suH2K{_}LjSs^2%cI3Xa>h%cMG;+~QQD+^jRRtX6LD?N(
> zr4===qOE6zaY at rpC%{;^(_l14yDB<HwXJt)K(6gRD>UQ;P5O7uMTRjvJE{#lU9$AK
> z%|PC%LT(-Xyk?z79bS^ppA!lTbBDY at _)RTO0Pflg0zv}QvMM`7L(cSB$8?P{-1MCj
> zR!$Z_ at yy`o5w1VEC&J~aDT-7}A6o~TuLL_9OD{RR at B{|vU|WZ69^o58)<N+AZ8|UH
> zr|viw&e0w00PLS<9o+dV=EamPW_tR(FvDI_VbCpHY}mw$X44Fh+hUG*Rm#neE8Z*$
> zFjy+4D#l at dv2V;1ITQbG0rVFT&NHRT^KXB!qRNd7a<Ku8@;?F#<c7PVZe%vxvw~%|
> zT9ivVNw!nyA5XVk5aRO|JItORnW<C8M=%B|CKdm>$2;2j6sdFyzJ(;mVnk2F at Ghhu
> zTo6XtZ)4t%*qC}hQQTE1R>htOi@~tdU#iFvYzPfIeHl^)LMX)+uy>05xtJc6Y^*id
> zu~xpyG&;ykFOJ_(=D6%iPdSuqym3nOWo$~ahRzSL1?_sG#ni}M7}Xv2yW%>~@{CF6
> zsickH3h7)AeeGLeYy?AhPIj{4;gj^sZ-w!yb=FY3hU&Y7C&tSatD9KG*VpU3`eCH9
> z8z84Y2Z-lsy0=S6TDtk8e7?BTom8_fEAb?BSslE-`RX9^M|JfzgMjMfJC3HXJ!m#q
> zAi{I9f2_gHdtr40B>%*2q}6f}gwfu|fN86s#_xp0NsnD$q2 at 8U!Y79-WR$=`7)}Lg
> z$~rhQldkwqFeZ!~4FsAQM-BF*0EjJ-p?lYN!ji-i*<xy<cf2{?DO*p4?9%5{-7QRu
> zT at 5T+y7wAuV8zqO08moZEu?4O?oJLP;MXn2m{)uYJO&y4ro$+_ZYhZQlW!T_-YsP4
> zjURgCEz4hZ(SzN>sIgi3nUz`0GIVKRqq!T4MpJxcmfU#)pPl9rtb=qp4R#A at TrExQ
> z5oXV}!DMw>4Cpm^0>Zmau>2l##|&Z4;~3Ka7f6eS)fB#h<3Ew!{Oge3Lp~7!zNzCg
> znOOWhR*s%QR|P=0fO at 6XLw85Or>47O22{U%ihGTD<dIQEv?SclA5WkwCBdSf`gBb)
> zm&%S(({@Q18*e7rqFHt%Mi{*2XB0Qli;_ at UzKY~{4dieeCuaDcBP*HHcZb=nAL`Cq
> z7sxodScmksTV=zckTf3fM?5M%u2pd0o!PX`FWdqY>Y!i9O8#4>+dy23N?I8$;Z|95
> z-tQNt-}a(Ah8=29z3<?{iEp#Sc01W9I(@}$Kyt6D|0B;Kmgh33<guxc*=4CQaHBgg
> zAe~C at ZB)D{<f%&hHt)^!&5J^zN|5ygT^EI0(!OHOjM&xd!?*Q4D(hmItBR)qt=Ya8
> z61if!@_V5q29OuRdrhvCy(KcrYyVzW(w+WZu&F03El!1~2|oy#v0KB;dPkegA*_3m
> z*8U(Y9Isd?d at icmOXR!WJwu=N90?y(Jiw&Lk`E3B>DNC9Q at 9f}?q9+?+#-7NUqZUI
> zu&JYFmEi}NfJ}F+)QW34=4fejz#$T47*vDdVNh(GI%Iq^eD4a&p)NG#&1<1W0ii?_
> z65YiUpvBJwgtXEx<+{HQ?ty-rNe5H$YX(`FAuS3ktr_%XoMb7X|40eZuLHtp?k*Y(
> z2<0lpC6T2UXy#pXRj;tw{#Uo|dUr)l>Atd{yCd&~56_kNWWR92bxQ{(4UPABdE$VW
> z(XL&Gg(miP at 2ln-TL=@2H-<FqUfx`JE~7hI8;7`8%f7hkjnHz4tKx}vcS18d$MsxQ
> z_%o*5o*%l_Dw4pKzJ|UH1XJ;n5X;?6n=gTIMQw`+R}`PEU-Uc)d2#Os_SHtAnQP4S
> zejX62d2XYN4?GLc^#Q&Ak(LVVMEtf1&DK4oTdN4ys1G!WsJAh&KCmg^2#5|8z`fcg
> zu9E|~cDFw#u(^p3Z0uDBa3j~N?KFb0^c;E&p_+9Qh5po~ms3f8_o%M!?#QmL>Py_J
> znstKEA6v6d1)KzTH(hoaDAK~Emq|x=4E!I0ELHHF)sq4Lrs~Vw?3%hcHt#5SJKU2D
> z|3 at KiR?WIld_d=}K=&cuw%qQcZC##jopQWp(Q>q-dO4TJZjl1e-~(Gbk3+2%Ta07z
> z4EIQW-eEKrMI%%txYOauRr7Yv2o-8jB8be<i1)_V)cIKJ5(81TF^Ct-uRPbcO)Bn-
> zz7peMxm1u#Rb}AVo!f7EKlN*Bh&eK#>%~ocqp?{R5CiJXW&o at e0UkJ~lOnREITrsl
> zsZ-aJVB?wa&=w1#122mXmGGp$=@T~D at 0;Q<vQ-1<1<=d~ZrSzNBW>|OBVJ~P4P>0C
> zmQy-?We^*>Zy%&T3UeipVls#5eG3D6ltz-J10Y&ix1=`e+kPu$f)Jzck1!aZ$q)<A
> zm~gB?%7K{5h7dbw2qD^VMVJi2$i6E=o_z;9IqsD$Wv=|i9cIBq<ed#NqrR!i7LRh9
> ze`^h`-R8L*(6}|1fO+fHxIm`9)=Jdg$q8=|O<PitGedug3#e^V5!YyLj$Py+p at 5@5
> zolS%^sqJ=`qX at mM4{%LojeIl5a<L;hER`<%Q5eCUp=*B>=4O3}NOog6z)y#{Ar+m|
> zcE>A_#g9c?!{&DclkPDCz3`(jl`rm~BYy%i_C_byo#p!d3vrG5PGe7+E7=qALJiSf
> z25NDQUgq2wdbOF>{3MKFMV|agNRRz4*a3{JhUiExyN5NnmA?Lykj!>(*%5=^``6Nw
> zKMA>W-`xd}z!lAJ;CD8Bp#~0aS0nGjUioSP-H)PXZ{YzoBU$#r*TW%_uy<NGWPE)}
> zI5ggGrsjUYv$xXQ`-NNW&$Qm;oLPp}MYvT?c}JMNS7QWk{@=FV)UHvsFyJkpy at gX|
> zwccb)AZFPc7&qicjOeAQ at SDu=A=_zY>?#PjgGrUL|J at JX75(FE^<?*cglkbEtb;{W
> zwbXc3FcvR=yGjW4>_?UY?Q_73CfbZ>(VsW(%WnN^0_5C}OnIlY%!s%twTW2 at 7{qbD
> zWz7F8)cpm0`l^s-zv!C9$D=XCYDF=l*)dkJ%!;CU>8hAxMdR(jK?wt8)X~PAN|m>j
> zvemU=vxxjh!{JkmxxBhXIcBotrC>vFJiBpn-`%2dpsWp(^M*%A43xAmR{|RzVo!(}
> z0pYjA^!7A6a}&gLuuKEXvWTrBCz{zU2hwGh0WwEJ#k<(Kud8>k7<hZAt(rX_9mi&t
> zm`Sa5(EBC;rlrj)$4?Sbo3+u{#Q)`k8m%GNp4L{~wpn}}B(p&9e}dJ-&DSBle+n=F
> zX*B>!7eS12cdh6NA6zr(K4}MfonXrQ<P80IK*&v~$!V)%7L2RU2Dr94 at ccot(#W5M
> zQJjzF{wyqvnjbE6r_3ZY{w$>HMl0fa&*-<_{8<n<%_O{tOz_X82ZKUs;Xm3M+7_`I
> zm*gqd<4g1;hrKUOU|(w6B*MVdy%FHpUDPlrc{KkT at IN2y`vw`vW4(^0>4;+k-Y|!*
> zye5=z&D3>GSRG+u_P^5GOuI)j28AiNz6uNKMa62%g3v8-0*aKZZKXUyCDy^3k?v#|
> zdX;=_pQ5xLtTDoy3Q&t0&13tUDnZnWW^%7J6tSAVJSdcn(RMd%Jn*Ljt^=<gXf?#6
> zJK1d=ErAN7ao*x|w4L%H!7|Rz?R!adSwnAawZtOiI>b*wda;QatQiu69qv4NYp4L}
> zk7d%jkdOca=X%`rrt7j_B%9wVkxM?{n(lg(SebXI1N9)4YvsG_{eICJ>RQTr#TM~|
> zoS|z${S)Z1kT8jRl>Qik!C&UqN*{PN(%*h(#EEw14be!>I*dFb`nFPQ=n+@~o-0Jd
> zzd^7SE%-GP&3H@@yNua7xa5{|o!#0+D#7hm$)m<nWY1uGj`=6>%Sja53w6!8-V4W~
> z<t3pi$QAa{5wmEy;69n)e5N82#n{=!;gGRyFs9WMbTca)$inbe4s-rD+6zEd#+>5f
> z?MU6bzPG_TNM3a7{3eg40_helMyft`*3NGNA*tA%;F{%$gXsb0)rum=10{)b>xtEw
> zDE+fF(e+gL;_^fm?^yuM?F3(h1$f~lOiY>UrzQ?hO=9EOjmyv~tyh45X2PTOo9IRk
> zPvh3pgB&*6-!``AnNdU5J{`t{XV^;?V`jJUZROU%`(K3mP2r;<NWWe-`bGNRF>1(A
> zfe7eC=T$DVgq%A6Zw>6<<Q{|TiO#kIiR?7^XMGl91n;YUU)}XB$>~;!W4(gK5aWcj
> z(Rq+q5RuE2PF575XZ{(PG|%vq?$2}`kJED=l$N>G(t95GHc-_SO!{IY<TJu(8Rh=Z
> zWgVsO at p#gxWnEmiFc9PA2cn at VdjC6~9Fc=igtUxm1)OegV9Ojvb%F>I(<k#8$I323
> z;U|F%w1Tu)Lr?rmRs~IG|7Ra_&Fo4d>TVUp9B^yAdgyZ{G;M-cMUGc54>d9u6|DD6
> zVr=Kg+2=<#k8osIL!GOSrS3f9-vJb3d-d}uvZZZcDrqPyrL6*<G#$DiH-Cho9^Dyq
> zwvd6TN>*uS%{sNZrL-yi^-_p8!_zG5PtN+cOE1%Cj7Mn}cy#Y$>1|qo at vO1GBW~Bs
> zz<SrLKm!bgo at v^-BFVTf&7&XkA@!-2ZpU~f+ZXJ|IDH=5l^p{^G8LX_ at SMhme%_!s
> z7DS2>ahSDLX$-WuwyY4>_i-(|60!jN+mv_H?yKgO-$RU!JmAlut5o>jgjF{&?;!!L
> z|0O^wquMq>Xf^#>g-3H&Xi$Z3=FD`a8mFcF2vBCp=Ldgpz>WlX?ty1wG1qdMKB~rJ
> zfi2#p#tXU4^r9L&?VsHh*x=4%3j2qjx}-9VvL+N6T)Z=G3ul{czqk)WOk_LH;<j+D
> z>F|b~u|);&CbVWa<4m(4Kj+f7^AL(;AxK3oJ;`f}1>EprAT~i|9}L97f5;X?ZkN`P
> zaf<2U{FA6)You+~pU~9s!G^s79-zR`QWqYXMKBTtjrF4O^~EiLGOn at y_0j+atPD(*
> zG)Gz^?W7f2oF4N`>kMzIXsj>;)+__8xmJre*msBhO{V`hl|6M|ud<hSyoXix0SCNI
> z^<`25LfcAMuV!m#O}u=KPbm|I*F=HLRQlg)mFo%DYXA400KkfJwE at SX1QKdbYu<mE
> z^Unb0B>n$ZRk-XFR<?Pad|*3Ne+U{eC$K^GH<bdvktW?|uU~E;XKfCK-KCq?{k5 at o
> z)6C3-EdNb2Gb4=wRTtl*lji#7IcF%liUHBf_lnG`fP=XZzsKKd#>vS4u_^D<DteP1
> zPn`a}hxunpsac1yN8{Cbv|enoemd2wHqDJNdIk75GpW4IgI{&b94@?q?$+Zx`!3lh
> zT8c*_XI9Gvl_EB6#=r_mQVN(0Ux<W4b-uBUY^T`)ANz)R(rMeolz8<HzaHD5 at +_9u
> zttGr^#-~#u|I at y)ULEi?BMIMh54<<^X;=-^5#TqZR{;)NobVFiK>}GVcYIs`OTTl+
> zGDbyu&mBXUi=I)|Q2V_epeSUNCsJ-?gryFJprPh}Z|+cI;X|!-cLctvXt@!>0q^4Q
> z&aOP9feq*llJH%553nkx6qe&N<egK~sLN{V-hjdjPaBEnaGz6KBu*-pvlzTl(1e7x
> zO6FVfe|Ebgh6|fzZ_hJ)nO-Bv{&n1p>X%Vwjg!lQPoJSLN8-HEHeXIN2e8gIfH5q0
> z4<vPZ&%%GV_iNe}i8IrmV4j7P@*V0L1E*!Bp at S@=z%tTtQ8+IiYI=RLDD0gQd_M@(
> zow%iTx-trnkD6~W#F`l+#+WktVidlWYo`~Za4x^0pC(1)Tev!UZ#2%fubCG7dqO5+
> zej$x5=A{9W-mUhZv(&|Un?CXiVkddu$t^Mnp{}VtDmnhErjN`9v#xnwO){tCJm2(D
> zwF)U=sp+HVlba`X#dHhDV!TR;-lmU4jiQA5Yz<JnugDzP;V?tpiPtGU821>L1Vgxs
> zrpDljn*RxF&}}hzg0a4gjAMHkZ(g(xswa8o;Y7p{o!JoJpD(fw#vh|E#Na8nJ?**{
> zaCF_<gKG--c<)G}mfDAQkBqoR+XjRjMR-&IYrr_3 at F~}c0r~2Zk5t|i>=-(18g9+Y
> zGB2BDz~i~K)Mfw at DcWWu4rF~E-B0+Ir`tC4fpm6<yANW_YSzHT(cUHUv%>#s+iU|y
> zrkTd=$R?l!|L4w|99HGD68wYEgI^(>E#KY=;*hcVw;=RueG6 at 4?4D*TnL7Xi*PG*=
> zYb#>D3$>R5`;@egbFQTU10Kaqp^>q8wEf7;%<X7qroo6Xutu}sTRL`$l+W4}6FdsF
> z?G7Fd8kzgt%NP3-Dh$9z88#hjoMW2t*$Im|{v9dTwj8xskjhw9Ywu<GzD$62ZntHk
> z$VN>==s!vv9x9<XLy3#DH5SiHv@{SglXduu5{EGynn@$$aB;#ix8)HBBIOojw^h^u
> zny+s-Lzl+k?5bt%nHdH&Gh at 54^;bc6RiVABc*ZifznponVPzWC&84sw=XWPo7@(Y?
> z;mq&EUD54ka`tefv%Et^WJReL#Dd#<>B%^pse9UCJ_+1i#1%RqzwTrHiU(sa((HIV
> zhFA5|ig>)3*Po)!cs#|*oRR4PFtw7xZKzPPmnRb2>Shit2JT~rp~+mbs$!6Ta`8{=
> z<9w5jCEH#>#q*9Jm46ZBk6^rH{Sum*04&RMjG_LkvFU>72KvRHb9cuyT_75OVZlEJ
> zQbu{MG<7h_M*rIXv-e*>1dPQGy>Sm+pMVQvfM^P5eC5o+i5z)20cS?6_V%&}Cil`n
> z0#30X{qvSqt2hn>*yL;R;hCwhm=ivfa`&Ta at lC1WI2**BP~sr;59v%e{yi!80J0&n
> zC;^egKd)~EIYhnHq<^>58hR~q00#2XWRlIE|9lQoK-Re?k!*`mW$?@GD`E}Y#&>DE
> zbz-_1kw^flBTU8`y62XdZvMgcSL>kupe&3Gy?sdCiFnqO3mejbQ3a-QeGRh{4IOr?
> zq-A8BHT2_Gj5ThKcJmvIu=Ye#%BfU~k=y30ruj*D&e+vN$7~R>6RFuf?=moqW3t3P
> zJ(=sgqatQgNSZ=-C*iFerMV;Utf<F5KOs!m38iT1VOj at K)@=aw+Dlv+S{eZ&M=H$h
> z{npS^(}EpC;U|9%b~uG5t?$L+$T#l6Hk4vBpcU<^PcU(|Bkwh)s4Omqx#=5$H*@#U
> zXOi(t0^8^?reNz>r$Im^veg>uno2r)bVJzgR4&Q(m9agDhd!m-QgBYxb6z#O61^Iv
> z-9P*2;S|8f(ZJ88U<?0RGMzjUXQu3B*A$Tl75 at iNhs9#xdQEw!R?vq>0>|j5O(St0
> zH-YXOiErcnhenRVxsm@<O0 at mD%NTm~5jBs(Be)H8 at hD&!FVJU3VPmA`Ww%jT2Y~%w
> z8--`t?_=9SvL9f+xlycbFX;pJ<cV9ETSO4y<h`C?DLW60wj<tmm&%Q9ns*r8W_tz|
> z%M+GV&7=8zG>YDr)_zF3 at bTOM`J#1e=>D}1<k2Z_LtSm%iT5HkzYJ;l*~qY{EGD$H
> z&v7blc$jwbV^B1i%bSq4kMor=v5KvYl at Y9(_Pbd;teMx`n&A?iaxUFUgfJ7TsvDp@
> zd~kq=kLjs96{nY;kdG=(5j*etJ5UM at FcQhq`Hm!K`Ky&xi_G!8LWdd~kQNz8&+!Q9
> z115Ttyu^<{%zZ%wNvG9GGe+Y~ZX2x_jc1OG{LEp5E;qYSph0xoo+Am(bxh5&azEWY
> z8aVg>Ju at 1QpZGaUUJP#`{E!w!p1!4Q`pEt5hkSV(j6^5>u7S8Sr1xmS7(6QHe~J58
> z?7ISE$@prdS2j!JVoxf?UR~uYmUhrb$KdrhMW%Qo=of?|bC?OywMUeF{D`Z7{H7y2
> zLEc2-7}~L6bqIn?z{aub#d>K~8cs>v+H4kiGKVi=fcSW>`&)0PuZBLEhR3JhCyo`l
> zwoSGY0!VAc{eZBd`7{#sJa^961F$O`q{q_mEUujLMj(jgG~b9zxd&*S5s!`v_f_?x
> zDbJfqcN_7YBTkSmdEAp=+!Mm%9xHu7Bh&H15x)bDE)qr~4~RUl>Y;UwowD!LwdpXL
> zD`|T=o>my{g!+%HPS=_Cm#%QWZ2zm)&?omh%%Xb(Cp*dreKNh-jIxNvFVc}2_}4e@
> zVwR|)8)R8^Q^#8+B!}Ef){8FsS8M1`-_)#1xDvK*?vhm~97qma2d@}%-5N`eW&mGx
> z9F~sY7#BXr`F(y|@nCZ%PUg2%(UF;W(zGn*3_teWAafy<D;oEjMPqBJtdBtvW-H=%
> z0S;YeMTVtT6nQJ#R5o$tS at fAqJk~w{OC(k_iuZ^DyM7krWv&A0?f}W at V(S!<+gr%g
> zIY0 at S2Lkwr_S|rOjgnv66V5;QANfI6)qWu7PZ!m)+aU+Ud=kztvHX?S7l3j96SVkY
> zD~h*S5%&*h at g;cw8e0Djr2QFwhv4UB=Si3wb*OAJn=32Qzf2#@!p5X3j%n;>f6I0*
> zEk<OuqEVt$OPyJGjG<zhhz9I^95FJtAr)oxWEL<`S?oFzgK|UURglg&<vM9 at KnW|?
> zuUB1Dp0{GA-GpaEfNOjoWJonT%me}gKxloLh%Q6r%&9Y!FhGg9<Q}=So+%VrJgJ2@
> zA;40MEPTr~`tVphDsd`9%xoMauRDfOIDM5giM}`%kDj&;$U(BS#3KwuOS1<A=Ja0r
> zhe_wH^p#0VDn_{H8_<?)E6Q9hE$L5 at y<CHIMgwDUV(9|us=}^psq&w-qA{;9u5zIm
> zBp}PkeyfRlKw$XGyHp_z%8D5Ug4_TMif%KtWaIn^`l_&3LA8GeLQ#EQ6|mauE`SSN
> znr at Ak7eUnUcKbhtSzJb6%!XyTxr*-31{$LNI~~l%C27m#eeb8-LDn^0l^G?wUFHs<
> zg$uGn(;w2MIXES at Np1r(X#5I5K<yXk#vD8*x-nQ$2g{{iyxsJ`=`8wY4$hhKHA8D`
> z4GwV18dQI)tSQw=WeqCd5!Z`mO93*QmUz2qWG=qNzMtg4H=F~>6}2!f%e6siGqgQG
> z)E1-ggzONJ^(6prPx-2uQeH&;JTt`#eHC7x{p>b(rdNegN$2?*qio4zW7=FRika at 7
> z1v5AU#>o(MyNJ$l@`&Bx78d_Rc>fMNyxb|jU^!u_9M;O=WpdachZo3Uqa40V4x1}#
> z=OOd`yRfnXOuEzTjBOdy1||I~=nym5M6$Q&ANQq6-hiXM1oG5g;@FU~X_c-LQlXJs
> z9$8G6=Hc=7yV>GEhOO;3L+HeAEqgPdtylWD7pK}jbVvGk7*W&}n09TGW+=@Y*<5{G
> z&*lvHt;!lysq*hI7^1GoExi?xlwK}X?N$wykW=oFZ;Zi8jr~j6P?mgXw;HV|{T-Ik
> zXxMtClj|15(zi)dMyC-%Xg}G{^vK4c6<k!ep08QQj}+Mn*m-OY47FPqibg|h)UswI
> zf39}xo&AjAN2BVXS+!9BeEr#sZT+`8(nL4J*yRfH<8Bt@%5JEJ9iWgas!}RaT5b)^
> zFPC>}P`p#Q_W?R^=dytPot^<UCS_<s1iNMwxa5o1gI<l6pDbNvMi!xs#Lax#vD|jx
> zGUN6mW`3_s>H!2(*2ugo$TuNv5V`%tn+T!fp6~M?y%~Qb?MLpY;RVom01fB;?I8k8
> zJfI?ZxZmqY at nq!l`}V at 8(!vw5IQ+aV{Cuzft{#T at QszJ(#s(eA+`(MFC#Drgzws2r
> znu3lBje9;u{2sP~6p)FkVw+0?mA-O-vzrX;o at fE-WgDxjR+PLz>Gjqs`sH}M)qb4;
> zy4-QKJe>1^>qOyp%$HkS#T0gOXg&<A062vYr at zY_*o>mXy>0^<3*vfk4>@uq2712U
> ze-HG!)&DHBFh6~P-JBZMK<w$_?LCPMA3Alo&@o+UhHUuEX8YFg2dZJNXE4+UNHPBZ
> zn0sD0w~ggg1{s<hAMQ1XCxb_eANmx=(imG+ivSLdQN_`p+UF=Zbs*M?aEwAY2Vxl^
> z6oC-pBn4^dwkb#pdJ`EWPDfW+_k`gUYuLiS_(9jbJwivaHywa6X<&_#))Xj<jjRWD
> z(Re(9H4>#qEv(7q)X0c*=Q6zfhO<tAo|}kA-|dAV<-Lj0*EL$K^Y6emp`1C<Kl7tk
> zUsEgSL|jwLX+)uB75{@*Mt1X_fcdnPd}z%Dt_A%l{<z`Cjd3wV&2Cziu1aSCV+jtx
> zPCstKwfs|bSw2p+vzSBVki+zfbu4_tz(2LpKnw}+WGkQD$JGYnKt(2dyTth~wSj0i
> zdyu{La&16ND$?3i)=;IU4M<dFv~=|V*OY$1QT*bkbD=iGKh<pMn7wE at hmPedSZnj;
> z<9Yd+*0D=_(d6zV(axC!YnH{xQyKN2Fr|Ec##gO`nYrxeXDkK$F5faQ<I(kOyb?J6
> zDO0>PD_^jVZDOUzdK1|tj&dz;{+C+P!?pacZ&~mt^P at PhSV;j<lw=3ZrU%X#$;yiD
> zFgZIn_W{vbytsZnuVevX=MI>%we<N(fOx}opTWQqd;nBO=f6JYgs&R#Q at 9#-sRPl3
> zQ$CX^)X<yPS8ZF4Ce*B2{4aKH4_41928QlbHb4nz{Zq0V1z5D3FM|XdJKUqdiW|BV
> zuoQ4{&?RzR<`KVS1~N#PZ4b=Cc9=_9JwZC*t(JchNL^8llhahcjHZ2O>Cpz=i+4Jr
> z{W}sMCv7gk1vhb at EDdNr=`kqf!VP=Uf)upG8VQi|2PXRk98jB<VWh+s8Z5v?#oQ?c
> zEZB*ufMY3Qca8wH+r_l;vb!4HK=`_#(?OZ6?-?joaFni())nH!>3+7jh~}z;QT5Lc
> z0#&y`clHdSGTjOI_-Xik#ZJ)4zV&isbHRg!c$5wT<gCvq-9<YKu at UR~{A(zljI%S~
> zYcjKRIHe<5>6d?WnNj-yd|lo;fUj3g#+i9-anBL%hDNet9S&nYUmOJ4?Qul~wYiV(
> znv9>aH$n5hfaZ0`s=v{m35qabi3>juvx)zl<@(mQz%v at D5bxFzjm3aGFpEu=0-?vN
> zW$&7g!|&h2tagY<_I&=Y3N#hyRxC3VL$cr6e`^?hehQwP9B$-cwhP)O^fwGGL;BSe
> zoFi)()Kh^s9!+zn;>=qIQS^D#okBD?5$UXhNCR(iB4>z3yuy%N2GQ|zrqh_?`~uHL
> zI^c16Z=CFi@<DlS*yi2hfmD*`pH6o{&68T7-Ooe24+qm>J&XeU(<!%w`^gb!CxDyE
> zerE5s80NCC>~q>Z73UV{`pS%v^|nHkOL*7r8Y6dEH1GZW at gIW7V#KRS2aMZ8%v~8U
> zs4{C!&C~Gcyxi78F-zfp&lEdX`^sS0e+JpeXqx$MU}sa&{6=&}WzxSJpc|**$$Zae
> zZ at oPYYq(6gilPEF3}V-PihTm}dH}UlSq%JGQ{I`U>4lqcR at S?L4d#7muNGXx#M0;J
> z*U_V<2y4Migi#;&k(yYn*Lu`+!gM^^{)Y5X)5kTfv7K at Tl4WFegz_v6E2CNE+%i+%
> z7rA65 at U>1~4#VfF$gaaZ(KpUyKek at Gl;r6Hw)9?Qi2)gzvYWr&m_n}YS5R9KGkwhR
> z<=I|Ae9^+!c<FIv%C}T~Y-Tjq)_`Oe2VXSNi_<|`Vz_w6Hm*zP4wG<z;hoasHCjOh
> zQhauQ1Pk*RLTVNQ`AE&yU-8Y-<LnulE<NtSRy5*(SAhTDGmbU>fuOr9qdN+~GR#=N
> z at Iet5t!J|xS}hY$GwE=YF|$)_dJyJgdlAk_Ax$4w?+AS#bOTXLU9<;<Sd!QYBKyZh
> zxR5(Y`5AaN=cSc1 at aPmEGiISc`+TH)S?!ZvVZhDI+N7)WnHhMNicRSX`rZsYitD6b
> z&cJCSF8azUkOnnzUVZ<*A?D*tObs(}dVDI$kfk+;<E#SmP}njPPvlO~M`z+fT^NxW
> zPSDq9;v!ztNxNp^9D66j8Wtp|yg~&kurV&XdF}Ct{%lblCig4+)0rlDuZ1zbZauJu
> zkwbI)1uN~e)XAmm3T$Gwg2ePI%4%`FYbvl7 at _xk3ei7}RI<&CAw2>TfZgH{gLtmLe
> zvGg56vxY_Vg;~%#G?$*9h3{hKGG8{q0{+C5_vJxqF2;9oC+MzXJk>r6JB;WRApKq$
> zX7$ArY#+7+WM<YVHG8o0W+n(rB|Ji at UcrJ&+~?D~v&7Q2Bi6y0A=!|qQa;Q%IP)lq
> zAyFueM5B2m<~mE3!HbC%@u7ejt>-Hypcv;`>F2?1gCkmR3LbWk&Xdk}<RAk|09npr
> z8h6!PW^AgjD1hD<ZV~CKn{j!Rxhx~0K0Jsb-49XRhctLIPO~G^gHXVR>-#4<X78yo
> z>A&!t(ZHZ)$iveO;F1n;1$(M~iT!6X#3q^aXIgKF1%bOi!leKF)D5xgd}Y2RBwKo`
> zAp~g?Zb*9_(CTgzo- at 8v-d}S2UUbh6mLeNUu+<@u1f0SZ2WlW#Iw5)YrL~u^fu)fp
> zIDJ~@6)rrzqIr1&an&6kc`mg(S<IFZ*orbN*1LF*!Byyq9-8WZ_S1VyaMsK%qI5!Z
> zo9jhF)DqKb39cEQkxd=+uQjU@`me9y)%7*2xZ(0&rBZhZ&PdXWziT(YoQ%*kgdAB%
> zvK(iN3tQf%{UvxBS4s2D09&23){I9aZel$OmNCaPLtXxA4Q(>xQJLEr5wSIpjVJ+O
> z=PcPr^Ak!pi7wpH56pOE!4}bsw`=!-MApdt*&(g*XOP;msg3o$>p38Vz&P#^QF9$L
> zCnMxagVaeAN^uS}ptuxZ^)0%%6sN)4x>7tlWo;;bUkP!$Zbt}hbWy33bfTSX)zZ_Y
> zICq?0l*i*d>14`3-iGuob3ch;XPOuw!fN(-wbszJoqmz#mSJN)jQqXH1Ocn>JW{;_
> zO)4&JdHbBBdt9+$&xmswJ=swE9t9 at k-mERdW1%H4l;H`yUZfwC;q)+C36$X(w>}nh
> zbn)HE?3 at QGCbeu5B94}EV!dhHp>?pfi;6fkXHLgv*MjF&t{s3eA5}1)f{vf{06)28
> zaeYIA=>gw<y0#pTD|+_mANv}67+2tP0y}tSh&hzszL1&2;+j?K{-rqmhPZXgSLvB@
> zoW)~_4wmEe*n=|b<W^Q&#8LkyT42FhOAoCx$6 at oUa~)adX7>OJ@~T|7K(7VSxVO~5
> z$x%`E3aLl8A?~we1v&b2JlK at -)qbyFO1Zb+zll_oWs-VW5CN2qip-Wqv+LZenZ7dr
> zCTTNmv*46W!2SJSC?NYRe3qOot4H<XJlhUpM40gYyZxE;q6N^V2n^~G#>&6|jt#Po
> z6c4qwtX5kOWFh{KeR9Vi0 at n2uFh{XO!^b0oDGy=_xYNwMlBk<-ILAMkW`_;!jZCD^
> z at b4o5P<@1OS+2^C7#HV`8Uh{ZWtZSqGhZz7)?AU?rG2yU1NM`iNFZhWb#+=~cFGN1
> zoie1=1EQF{NFY{sMsu+Tm(}lz07`VuzbQP?N6U7gdZIS0Vdpmn?`B@;nF?`cE8~@B
> z{tdV*Oqk}58Gco=sqIjQ*YA7u#R{A<@r3+IXa4H)toOARgqqpy22k`~qGnh1%&ZJL
> zUB?C%vF1b;(+d at NqN-TL{?BOA9Gs`x!6WsX)G`O(#ud}ubMV-kcf=K_-|SFVpeQt$
> zW<{E9jAjcT%POveF!)ijH2f}*0Igpx?E%Uj)vbhSa1Krzd!i?LX#2?54*>8RQ{LCP
> z<bH7jurcGp(rhs`SK{fJ3$~?qWr*oLJX>f(1V>iL-^R`*3?xfNy1No^P%%AGiARsU
> z1Be>myPlCXcDrYQyTr5m@~*B6t`C+f+z(V8ZN)RVT3TtvX&N?ECxP%kY{es@<U#P2
> zhX><%E56&#dUKGRh5p2Sm(`Opw0prCE+A9hhcA!^M3LQN<Bb^Z`S;B0v2@(i4O0!1
> z{_4iAzu(wp0YjGwaBgy!Uwon~t9#7Q9Qg092moyV)cA4H2oce`xp*QY7)n(xjTPx$
> zW$u$rTzP at 4pACh6mX+&9xp;tj=HkML<DPL9Ht6jF=q<iQM%6QK!MS6a0 at 8XZYtK9o
> z_XQD{8RjVL3{wZFq~A(^qU07lNAp?PWLyt&&dFPF72gz~sa1G$dHc{Yjj!8*Rh;C@
> zATDqB5F_+8&`shJ&0c}LJYe}Qqx+^^)3$TXXkXfpZek!odW&{f;k4L at 8<fzYz$%(_
> zD;}FT4yLpGMnU8oOl`N~JMK3RBq*F<WWc}1wi+e7W}s4({OXhY(ww&uwR5NQDuBk8
> z<^uRX1f6>VI;Ug47kyQW49YctC9gBn&>I2#n}X{B90o4B8d$&0kg$|iLy+4{w^ZXw
> zHUg)raYpXegEd8*f$<rraO=A at 1)QFR`NEBFeux)yC<baO;BNuI88Z*xJ!!ton%6Sc
> zTp2Uo?aTQ$*>BIl)bNrF(AVeTJbOYuSDp(9K}*6w-1kQiPxl15om?}&EP%{Cz)qnO
> zX|{- at S;Wk)qk8FXu at u7hGNka*5|D*uA%9UVJABYkbJC#Xha45+J!~Xin!~Q~WhEe7
> z%1+C5 at z)Aqb%G?YiirZ>?1beRcb#A%dq}^M>>g25$LZdW=(^CYlVk2;cnqF1g6`oV
> z^_WsRQ)PXeJG^z(0sQ5}7Yn;I-I>a=elAtIo4#km<@Pg*f<K64$t8hZ_S>J7zuZ~`
> zY)F)>dMN at p%3!EWx%4yiwqi&uW(*4SIlw*BMD7?b%N^6hxtXt&SC!j$L$4?*`oL7>
> z*>hPwlg2zqCNM>QWkoG>tZ97Pwp_osN<ccM>N5Usm0-r~82IpEOXS8iNDzWVx+-Rf
> zfZ{K&WK!Y48im&fJmHy-OCy>+YNyE^VZ9c*N)r~~&0HOQaRI(>gvB|{Q;Oq}o*g3N
> zQiCU4(_L$UmW^D9OYA$A29U4EAR=#UO)fVGNk5tk3G*}1js-NKAw-sX{o6SkvOnL<
> z2T!ou7)A8 at NCQW-Y<y+IyRc&t;ElqZTj$hXPSFGZFo6xP3|0D}IqI|w?JfCt*k#eR
> zb|gPwu!b)E*@Is!l*Y5$i`j^=xWFOecI%<D22v`r-MUcVSXc-1 at 6|p%R4rqj<U6VV
> zGmmp9PyZj}9QOara%wosmj7PKS$y5zSo}aP!+KF`q)Wi%8Qc+yEpB8$y5yY0l$wK4
> ztV3ZR<iFH0fq}k=aM0O*2R*Y0kF_ry{%(m|cSEfS!!=yripFq$CsW;9L*FHlPN3 at P
> zZY&zj=mq%{<&D_vY#S@#%>aUy-JJ%oP_y`_hBFMsn*#@t-4~;dj7uJq1*2Etjb-%B
> z8x8-<y%F%ggR!EaR<8>F-({B)1RMb_=wMz!AZCm;<Ub*=arCsqid4^57@%^)M!o_W
> zZ7{>Abxu3-8LdeB9^{AwY8)Zo0<Y-ri)8&hy>=VUoi>$i;)zDlLe#Q8zkpp?V at 0R{
> zYK8EC3DVyRZ+snq-*?tfS1+x(9j9|^=+n33l(8Fq=?XC#Fv~-@!dHIXw^p=HmKADm
> z-;Sq`Y6v)d>GE#H7s_qBp*{t?fkThH16#R==<Rpl%)|wZ!9W1|Z1VvjeL{Y0c`n^{
> z2TtL}($+ihEPF$MgU>pKsL|Q4*tJeFYEhIXNnxeQbr|`a)?&cuKQOY}zoWut2N6ZM
> zGgMuHq7gZJW~@TYH>A5&=HI0XOLu}u4r@?4?v7)5&9@~a at GR@cxB|tZGr;v=qi`o(
> zyBGwMV*27 at oX^jBpPpQdM~u$B&LYXoI$E|oIii7>?kUfOPV-A}DTt|-B{*}Ty!-|#
> z%LHbp9A`lCr2t)BVaot-^~-3qtiO-Dk(x?bfJI at ZHJPFS+#S-S4Gqe<BD#MGkeE{-
> z4&gGSg(cuo9Uo&snvdCm@*%|#IV at c*64vuffn!1Z>Y#JzJ-pky(0%2kS{e*GAr(qm
> zP{jVA^Z1CMksKzSH*9htK0>}B{(yW#wsWa~xS-R{j+`rKwZbq7HFJY8K(%MeThNi$
> zZ$Y1{ViN)%BGO=(Id^wY9AcWc0dRF^v)i0DlpP0-lXt3>U6 at LCtrn3js>hEZ<H#Jc
> zl4(mP9Rp+$J)o`7DcezN{L^Vy4Njl)^e at P82p5U~YyZ;UhznWV_r_sM2d%uz9Qr<|
> z0s*9<$Q88uPCUYX6gVH9Z1NK7(Ri at jW4C<GGV`bICg*yR$od=BB3p at VuoA2OV<mPt
> z7%AK1maiEb7zFHY?&V-o at 3juLTprSuj(Y;+)e%ED&n{isGlwyBAM at h*Ur-py`OEuq
> z=3fJg)d6 at NK<(n2@{W1>018`Sgf1RX`l1~<tYv5C+mQV#o11R^KxKF*Z;iAbAx3`K
> zEJ8};aEbs)bmdY&1|QPKrFdT6Zt2;<4eS_{S53 at bOiBTDnHggv)-Ey-t2tIwGx#5T
> zy!kGs4wKojBVl%|c>YHu(&CJ76dfDTp4BK5rF}CMEkxRy#ay9tiYFgvq^@}<!@gG>
> z`(A=tR<*z6Fq)r7qpn|tSC}7J!7&zaGd`#9Ru0J2JIu1C`J5pd at H<d`!#1R)EqCG3
> zY%3=6#Qc+ptE#oXGdzYbleq>nN+4OXmy*S847Nh~4&W)}qw=Bc!{#NS!S}91X6CL8
> zW^Xq%wdV~Al5vE=ZR?r=ZCM?ue|25eB6hvAVFxuY!!Z$SKx&?G??X_ah}J9vptXg?
> z#!f{jl*?@gfqN0rex6A<)*AmfF^f4(P at w1h)6iP2!ia(BsAaJqfy{9)t2$4vdcSNh
> zpkZ3r{3*(g3-BlMgq$yAW*5PJ_ke6?mrnV+ at tnjH3cLK$7Du`=ECadH%XHb at IBCN9
> zex`&c5BSQMIzv$_fLM&&YNEM49zm6t*fs`wrUC>l=iPY9jLXV`2EJ9W4!+#Yti|#>
> z*~p1efW_RykQSvtn)JT1I- at gaWGx;&sY+oTMRQvzQ~`vtp8{~pLPFFU|C(N|bw0!X
> zVY0J^F0RFM6rAcShq-y#8oCBD<h9q~#|(&0Fw(*(rF?*G3;eb!^pyJ>kex6U1*&@I
> zV#E436AVbJP}t`t&`Y&AbH-+6S2t|AaH*np6oOT!2*L}SvYO|5v}V+%H81CW=T!kO
> z`Lk^~vgZrdnY8*IJkoMVWFCCWmaowcA?pk4hKxBLlg(8D8z)2l8E!og;`7C+Z=CNm
> zcH{g94>ih06tz*8>Ff94Wcz=qY1dFqYcrWC0^p$|Ju%lif&+0?@Cd*@&k%+F*SsT+
> zB;`-B&d8s8XgkAH`T9eRxZW{yUz)Vd|EwwR!v5l=Z=4^t>faNtF+$!Zw-4`=oA^W9
> z|9 at 5$b>ogZ)YJ$KTlW8^Hv9j*y5i_J&O>$6|35blb*X!JMKKSnqaA=Gg^j1Vwm{2n
> zU_B&0f1<{YI8_C#8m~~nTTy6}Jb at 3$L at -&#9AC4TH6OC at w=<Q!Ze~@&PX{;yDGx;W
> zb=J_G@`f$*6}k1G^pE4bC=8iCD3i+GOuBDv$guTY{~1QT`fq{7ZX{<{QIJurq252r
> zTjIv82i at AklZKTN0&&-@;<d~UL_EUm2gSo6bHom(M=B~Bx0(r|=2|q;3p7hM57_WE
> z|32HstrbN1e*-nI0Ic-skT;s^#Sr4AZYGG(Hn#k}l^1f?g`VhP1CN6u9yaBG9(yB(
> zwxzco^zSg#MZFtVW;M!6xjC0NU%yzXTe?b&0iCTDX|t;9(c4lh-p<X;FD%b(t`xb;
> zTYXi5MrPzM9S>|Nex0e$?;F~s>Wv6&xT2S>2X^+Z?~Q!xZhu>ELtvw{ji^m|-!@&2
> zLi31m=>o#}@*KwIQW%(mDCU&B9#X%OuhA-%Sx}okht(pi-k0{%dSDn~`M}$wZ21Hn
> zy9yT=9A;lmqmFhcjq~rQF`Ai46i?JYn_o#qeT}esFs!tGqBrGr83*p`(~?$SUZZBH
> zh!x?9fkp=Ljqfjbg?UM_BH{2b+|Lcey&2$My%OKTRnY}2 at ieZDHm<~l+$s9 at N_?|j
> zx#2|RNg~-IwhmfG$Q~rKMHPf&%aD;XZ^wFg2Lx=<*>;AWZ|n?T((~2xy)e&pLLG1y
> zDz<$uJOm6UgyNj)(@e)G<NuGtNN_E4(ez!e#jMVha(`j=?NKeVWU-V<5(WXKh-&yZ
> z_?N+dEVC1WIrg#aN at b>$?+g~Bdi;?2!*I+*#X2GCV`XO>;tJG-%s%0ll3o3fZ^rc{
> zAx33X&+=8%f&1}CF&`d_vScCDf3!cV|FHBSJ+lgDvJIhCc+`jw`<)dA<R+yS9-)R%
> z|L-dd1qkxwKY&MbZ_=s<@TeINF`EOX9vIilEG!vpZZX(o&C<9|2D9VNGCh+=B`t9a
> z1LM5>KoQf&jB`-u12_%7<bD88031PocmOBq4*?WyONS-%FpYi?CuyIE7NMfNPw0dP
> zaoVg8`_-0sHxkXPJy3_tiII-uGU|y#8&7#v;gA<-H(DpLt8V1=xPfkb5NG9&0~xY#
> z9<VhD`I8Tc+qiA_gt?6tX}p*&nwJ(5u0IPV$+md89?>%o;)3i$qKLNL1CS at D0>c@!
> zqSc$^$&~kW8y?P&gXZV|3U7*HMqw?CVU9DXKck0#g>SNNtL(sX6Lzq3@;`SEZ3Q<p
> zDANQf4ek-Y7=2(v!*)ikVHDDZ26L>cbGNn{BaNI>WEQ<L-Vv2<eJpD>qqAT^d}T4>
> ztwR$%9Fz8(ubNc{m2H>q8e9}k%!9-Nyu-JQHa~>NPGrdCl5B5wc}P?8otd4dAuHKl
> z|JU=_;T}b4x~-OWKZGY#Pgt6tUZ(9zH~-Yg1AElZB>)c&@KefMFMU;pFt?qv1yJ15
> zpNOM7Qqj^dzmb=o3HSdYucDq}J>E%ce~r^*4zqYyo%7ib^n0qR7P+-WD4Fq#@0QgQ
> z4j6;1npN%pQtm2}`#}`Gqp5;{S+~Vv=6+JZOi4ARbTb1bG(0FnF}wmd(L}n-lm{^d
> zyqZCcJ&2fI#2Wf$7ku=a8!FO5vFIBrVlf70^24Y^bfsHaXfOI+49nu#Y{O61txT5w
> z-L_A!*zb{Spe;I4U at o;lCZxZ47{}foRTZ|QJ9wR0Uua<05Zm(Iim+MVVRGciDEXWr
> z;8C<aYCdyJ9%umMXA4`IRt=Ht?{?7(593*rj(gZz1S%!dv#)D(T!M6UV9}5!dRYIh
> zRpfeF{Ro~oVmDrhCP>eIsp#+zvLRq(kv{(j&a!U}Fx_&<YmVP#Zt7^&*Q`=ql`%~}
> zGqns)uULhMK0NIrL(dAilv80*LyirQ0|UqTBeNOpUj#!Bv|9}G^xLw+%xWO8KG4AY
> z4h-0SHvi=Cl at mIx4v({&#T8;CnPV|yd+Vjv%dLH_S6Y8;*!a%ocN!Bg(ZJfMB|2rT
> zY^nJ(tP$Whnxt3uJ_<{<#1a!azPDb?e!bxJ`n}T(uOQZrK4|^p!NbAQ+v^bTFpBPN
> zXXS&xLUWyn{Li&@^k)H96Wmdz at m34{x(;WIv06y>fcZy<;SnN0%d(p~l$^B98me1B
> z$E*hYb7u_mv~Dq at 4^0u)MM{gFLt?3EhSV<QvN);Nlqa=Y3eZV_&AQcigsy*ogj=wp
> zCw9~AtFdwMI<8^k{wOPY{0g&7Sa(1ClI74!_>E$rC+ZJH)~w at V8#W#=?2l&Y at Qi^c
> zyA%|y%WzGF|14WPN^nkLA?Gys&!*Z(ahmn_I37j$O;9}x>78$~ERQ#^FuNTYPeD;E
> z=85^v$q=W5IM$R#*^LF)Zf4Hv4v#IK at J1J{dlcs_Iq7s2=i5Gl!F-T;&v;xuwFz(g
> z*zv#6>#_(1OyT2SP;v}2k$T+)W_si<mXD1wg}#k+Fh8;$fRF+C)W3ApS0=qcFFlI0
> zlCw9RREd!=#X683R&h9C1<@5p!pHOL at wkjPx_ssA4TgE?VnahdLlS<s#Vo92NJ7r{
> zWIZ0kAKFEC*W-*h`PvlYfP7Ag*%wRQ^kh9wi_P_wc^8 at T{LJ3!bKf%f_+UNG;<GuL
> zwFa9r*4?rnIW-BGooU6(QKWJY$^qnzY2sRA{CepLx^WF&n900&2)-KseEIk+^mT0>
> z(;O-HWO%jko=$^n at MzU3Q;Pp09rGA2wAYw)7m=^*g+j(oGR1w)r|f>|fjC8Iz9 at T7
> z4J#EZWz6)ktW+$Ap8S%_;$=6vjq>P+V`|xzFil+Wh*P*OAMsv61ZfZ^tGjRy<fbPd
> z!y3*>Pd|poa{FoUF+3g~xodIyt at 5{+1E3}(IY}-f={XNv*Rq5C5hRywrsi11bQUki
> zepML??S$cB-W87o%fb}pW7 at nHXYdz;^zF4ckF(MXYjFuTm1aGTHz%&;ok-7H$WqhD
> ztL8-+DEaVoe+E7LIQ|uvLG#z)ylDkNck{Nxm^YyG4im`s?Opjj>Ka3|*7V?+R<GLh
> z;1>lT*+2M&hjhXsN at NZBeg$n>hg0n9kb!*SD;r2uTK#<+aDingla!+=#DdDnY{eLb
> zS+dCg6WIS39`=8xHRyI8VYU${7Ct$tThHzwSZN^I8iTqzKd!j3V=f;{mNq}!Z0(pG
> zM9dgRnnMnk-7D6+9&29KT-i}Vvz`D(Y7Q-X0^97~or=t0(w{C?wpjAx_Wgx70u%~0
> z$=oPld6q6h$n8$@En#EfKjn&Q&TdBTXoQFk2noC0NNdu6*2d~MwKJ?sEhTPeq@&c4
> zLC*X0+=9Q!8;Mm2`;S4`=~c_&Pk?xFuhF<C at ocV>E`Ac{<S}OtFSnSRtE%JCr>@!X
> zj6)|~YFCXpfTO)Lfw at hV9YVZJTc5<^g*7lIr=P_2x;)|z$1ivaSM!_u=*v&xav?)n
> zL%W~C&rW;O6Ul6d_Nj-b0+#y^b-uE8wR^G)8DOEdtED-wmKv5J#Agw`>~x~_X}nMs
> z$uc(o2B)ajz$bRnF~7mLLUSMb4NlKA`<5_mk+V45M?Hj;9;zV3`u7 at b`wdRycF<$L
> z!Q)4F_VVY9-80b+qBdh<s8*pVu7dN%hETUw+CihA0g0iLTAsmq0(6GfJ%gv`DHX@{
> zs$uwFyJ{|TlKTHTkgw5?pOMEg$&T;HlRwlG*{eUt_2|5McHy{m7CnYk)eWJ)Fz*MK
> z)M3XO&2|7XGd*Yr5O{-j+41a at a9`TBLw$kJC+?5n6BdFe7IwPTayJBv6NLggltvQv
> zmS0lC)3A58!HJMGC)SNP!*;~Kaa8`s%LJFIl+SfT4JF|Z5cSXpAoPhF`(G<^j^U+4
> z=Z)POX@@w8yvD4;yn^jE6vJSl%8Ar$7U?1fekA4pSPA{g0n2*_9dO`#>}-Z=Nj<>l
> z7U$I7^`?<u6kHN7Zy*<d@=t>|kMcaz%AWo_2XaRNpKgS8JsDUdc5rB&s5d>>G1WWO
> zITgM%l$sMxeMpQnJ?MVgI~Gzuao-b8O$C^^TZ}e6IQdYEH(As`1t+`-A~rpExY%o8
> z?}xEBQq)1b=+%l5P{mhXEJndIfkrmqdYDJjfbU9t)L~{Gt^hY^0XOK-auVIYie75K
> znfCHa4Guvxi+0jsC?N at kNhA@TN$?zj3P>h0l8nIm{&EzLqMd(RU?3~XoH*-nN}Fn5
> z8puhB{h6W at _>qaE(`_Kx0Uk{v38)0($1#`ca{lc&%PWv`jvVOK*czk)Qt351|8_VI
> z$|u?7YDNScXbQ?e<tQ^C^zscMaSv1~kk0r0;YyRB(h<N&?p%<7Rt!d-ABPsAjP589
> zUS3!lAoulX$+z4Ql*yXu80Xa>J4xU^B8jXKunzR{r?n~;p9JwEyeioWJlkRCHW<Ir
> zKys!T)d@?tBMxR at 2nweTL*Y~fIEv7teCt$0J<`S=K{^9F{HtU32d0@<&3rA=6DKM6
> zE%C1*ymKcqBdyDDj&y699AZpa2C66PVG))h<=CHSM#;oQ=*bQES0nyby#w9ss&7i)
> zTkkd2Bnu;aOGu`FI<;-YmjS9Qn{aMY%iHHOdd5qI{@?D^GuJ##T(Pd at G+n<5PtdoV
> zcH?cz`~FS%32p+N+=%avdBHa+Ac)3_LB4MBPg`rLvk|8$UXE-Ds0hB9=-j-;T%CoI
> z at -q(o(TsGRt-9i>HfMDiHx3Gp70by3zO3NiSt|Xp5zpraY2{`-=@w;xBK8mC4+woy
> z&7<86_Oki at i9m&OfeLF-G{Rkc^(7=Wgrr00C6ay~bqoECUSa;<fd$q3^XTEtIGaDb
> zhDuN|_YfVq1y9Ub1XIBLpc&yS(f&p773Iz8)xg^)Zms<G8hv;Ro>cm8z4T4;Es-{h
> zJV;!*d#8!Q-s!==12RC}I(AW)IH_Svxf|CvgsyAC*IV#%dqaRHXIl_oOY{zlY3^0C
> z0|z!$BQE5O2s9#$v;mQMyAX|m4N#GBuf>o?Zib%;ekG0!(I{558TvLiG+fyT47Ao3
> zPd1Xdwi3dQOK<OE_^pKCnq-XusPx9JvE32yy&TaD&0f9ur-m1%`X*H(uJZiS>dWX4
> z{U6(&BR4yY02-!%<E=E76=xBA8TY9eybY`msJk>hGim>`IQ`d*z>cuJL`?lDB<HO(
> z|H1$-XSx?~J<x6c8Wz_tf6uwo8{^`dqunt|)c{pDqj|*C5K=xOm#bi|q-vZiG*{z*
> zIA_B=<}+8smw at XHZlTU5Jds;NPd4FPY#xKPbf5`O<@-};!B(7kE1>6|8S?HrNQWUU
> z^DT7wS!?LZ_{$N}nmgSg9dHrmvP at i$ev5LwyrZ}mn4ORosK}*;5P(dcm+w>86v#1a
> zsB<eGnS4dK9CazOFQO(l6z5H?DGD)9qsydA^wX_CY|hi*Ry=BkS2RN#v#g<?kF!1l
> z@?>aLx~dkl46!K7JKCQ?jAilKdUhG3>mM}*9Ih$C(f+%sZ5z%37+bduXEL+SZ8(LS
> zPWNrYx8B0mU;^UU8kASM@&;>=t#-FYegl-C=J$)HEmwg=G&GhULG^6Sd(s117=!k%
> z=<Za=oky#m!_&EM=*H*p#5qs0ktP*GGw+)eJpSD+JrQihxOC0p2er~Odv$EYy%FD4
> zb}zAILVRrV(Ibnb(|coyW*D3Yp2LOl)1gDTuE;KZx6s7xjbzw|nzrLfGNHUgAKi{~
> z>}I}>=mQOo(rUy{CmOt+;I=BIng*wDQnkQ$@o6N5k0Hr?2}vz=V-6*vP5dM>rulIL
> zgxor*w`>f~V%N|vKxjoX%3lwNw-4RdgB$O4AaA5JScXy7Y&Tj_>aM4jf*ixblktrV
> ze2~hHih4ITV^0iJy3wXW8~-1|-UTkoDt!Px?>pz6E0^IWASyH5MFmV$R2qh1M8^!L
> zB%{d^FPW8<WwmYFE@$9X(a6YL4z*Tz39Y|t)SuAYwg$AKY)h+Y-L`4bjPRW<1DcLB
> z&V0{#XFzNJ-}n9a4d?cp>wC^~IhW_ at R`joPE8CSaX1J$+75rZVpc3JLqs?-p$Ru$Y
> z;6dS>NVIN^BLzo^d3rs{XJIjiT at xJ6Jcl9AaUf7k0e2zfoJ=;Fk*I0n`W0rbG|ih~
> zsc2k}ZbWl4fwX8oRi2(JmJeXD!p(~okYcT*-LklO{dPs;T>tk2{ITf%`~eJzx6*&!
> z(Fl`&7vaQwsC2SV>Gxmy3$1+`Cns+f5y+l~15xb{IrN;uFCHlN*IyE8^V2vp7jVy|
> zb&Q{d#sIpIjt_1E21iA>CcryD2iLp#CkrnvqhCIa7uC&hO-IW}p${KV^^V}X!e8OL
> z!e8OL!th)Jc at baQ4v4D&=$9JYLa#aL2vRZYCGEw4 at c0A8?BjX=6O7dhXcMfJm%}`*
> zm;s&1^4#Lgu{=Z8(|y};veE1?%L}D}Xa|);YO?0%&F44RLVo*s;b)C&KJdkT+pwt^
> zI7?;Qj3M<l?zDLz4#r6X<Fu4r{B1JA@|xTbf)P{tRU_kN3k~UL)id}>F6!V{&tQS$
> zcF at z?aaG+rJ8&XVF7?60$p!iNz9DrmN*W9{L9yvTGbV52*w-82MNXP$St-KDfnMf|
> zIpM3J7r$Yr9e#sPLGrI)PEVmfnW22(8W7uNJ1|4cj=&%DYaM2#!ms*HJD`I8(^vnD
> zOBb^h*K5y4u&U%0rM*Hr0=<Fxy-{I_$^-JNm+|*YWf`{D`v}OXi#nK@!&SsA8afoi
> zR!;?6 at 7|ZGxdlI*Q4f^J3EeQaKhiz~%uICn;lmJT3%*lYjbcOb^!YtFeQd{kqUva1
> zDp50c%Mx)!g8MO#>M2fQGW3sDnon_hl0UH1#|3t}W`lsJ?Jpjf;bp?e?G$j<WV(^!
> z3H;~VX*&e3&9G#vvl!;~Z8qaZ<mB3{gPY8WjmTaLj9j_2^T5oe$wX^6BBL#oVZ(_C
> z_$zEDli98z)wV)WrM)!26{p4Rs#?!g5^aZl1V_*%t$0 at Xw%|BmS|SL*%@b8&4<Lac
> zLjup9Xdvz=Yi&ZKB_<_H8e~cfpDXe;TG!>mQUGkX)E4^udwRSTF9sPr>sb&F`Xque
> zQrLpEdNJR8e#6Dnv1jw;-qk;gOERRvMze(jqL*tn=$8;}OS3Jw>_=dH4xjEjt7ZM9
> zUp<S{xJRh}Sv-S(X9q2M4&T9b(U#}%#OyNZDW3*J_}j_-WCz&`Gg=w=Fksku9bZJW
> zyanWOAQA`9JcqC6RZrs^nZ+|&@;sis2E+sQ40G&1C$kG?VO`;-v0s#iW8K at Yj{SUl
> zIQFxSE3u at FNdqSmnJjQ3j>!opV&v!A6MLh4ocBHA>Q#e#f`0it(3=-&@Ok{t+y~J*
> za<gT9qpqdEl{9L)HD=V<t1j%Lffw-j)YIZO%nU#{O6-SZeI)ss7xAQMyGirY8LOUO
> zDC=>*`$c(6V*86Y`=;BF9(~r0MWZP`_&l=^r%ynKfk>6Z68l at hgQcQ~yw=lw1Ihxv
> zRCFm!eDGQDIbE1p;Rv>Zzaiq^S;|eQa4AYPb at ORV8&2m=(}FfUCG&Bo!8I(s?ecdj
> zu}BoqG=^J#h=`oK$$Ia9=$`;k!DifnHav-YnSR-ZpT(cHSi9+8590B3`%ZjY>|t4p
> zfH16fD+>7Fb1l1Y>RfqkNyEU<N4t2bv3({844S>uudJ{)H^s*i^`#=B0+ct`fiPne
> zD#NI6cu~8B^g->n?}FC8O#ieCmvNucx1r#fzo|?gOD4BJ)bRw<NXsmnIG3|3p|TjL
> zG81VcxT2oM?8alqy{T{i9jmt60X&$l{SlxE4yzuOm>&C-Q0s1N%QU+!!%6Na$2x9?
> z<58Zy;%qiO_6c&&99{HhXvc1Bu>8a2He88gf{c4$xXAR_XY1UFkjo53`rNVLvzs0}
> z(dX8NOFC|F3*oqrYiax*d<%C!UAqT67W{bLV}U+sJLZQm&A3A%3iO6AXu-#iZjbO0
> z4b_14NWjL#myQMO;A`Ab`CiutMA<PHLLXE8OZX35HEntcr(fF__<(Kdgr)wSR<@IL
> zJcUWq$CH_CeS8etXF8t5wt<c(nzZii#}n9g&hdD*wL=G9!jm%1Y)_1w^6T27P%}~Y
> zj-tP}OCwLLy6B8{ylDF0MI at cufJ9z8ffu7(;Ru=}hOEtHpE&1B!{3+(#+em)NZR?c
> z(_?Kf|Cxg?5a+p#9&QJ*{Z)Fh9nXsWyLY}BlW5>Qa at qAMYS@d%t`MH>9V05;+FM<m
> zt{T7d2~(*nJk=Wo_59tfsm3H$j at j6&i2H;@dFM-e?S&*7IQbZeeZpJSD=-T_K%q`Z
> zOMx!4!{wOB3%6Ra+!pNmC*83Z&lCPkT+-WgU at xAcfd#2inI`)5bizKI3~c6%eRz7^
> zS*GvHK|?}fGfD-y-H at n9sot{~q15AQBp{V7<fJa(x`P+k#b=ZaF(~Kuu<{_$5T8yI
> zZ58c}{noPz at 6v#?&C0%E%Ol-m2+xd at dTtYIfohCzAJcL_yOGsSrGWR}>^Sp<@|O8a
> zeOmI>*=Q-uCZ6Ai4O%Z3o)Yzk=!BQ?q}yO-^nc%#KEw at tUmZ6NZOa$Y4KBg~k{EaP
> z8~ZaM{}AU`hXwB^{rrHs+Gs#M0tf_}n_MIW80r6gcc%71-unq{e;Hq&yw7RGW^Q)X
> zG<1w`%y6Kz)ileON42lu?B!-=E(?OI<b(J8MitYoNxLP<izWZgVi?agkou4(``0Nz
> zc*j86<B-<K((DbW?R9cBL?mZ3ZGHt8-i9IA3c*9HivI#U3Mt2V3%cvK)$kQ4Cz5`W
> zrTtgVK1lhVj{6^Az_G=$T?bL;O|u5omK$4jzwOQIP2r*j^}nsgG;uHm;<KQ-d`~u@
> z)B7Ans+eCJb{s5Xh8-bowPa&4c0C7E3k3&7-v((b(O>|v()a!c8?(bD)@*e$dyTZ4
> zyyDoWlUQlty5!Q<(y0A7QxyTFGxp=$To|N50%@(DoJLg(*Nf+eLeBt}I1=Fc6T8Yt
> z&pD?l?GNLqxF2V8_4JkfczVMBrAT*ZKfX)&vnxURhSvTS7trRv;>mnd5q<lw*id(J
> zpL-&(&(Y at QD2<4oG{Q{NfH-`Mn<0uAnLKIE-XLY+YBZU>b7AufW|sP at R13_n<{ZB2
> z86>z%P0#(S*DEp=i7B&tQ<ynW5NR;1WZu4rX?DMSuPdJ|0E+<fXgZ;{9l-g?kua>r
> zW at hMkRN8vs0G>AIXthF#wrSkzYK6+RP3eX3I<zgSi373`U%+?$mF;B164UjoL8xhf
> zLUk6!WL<xrbdE;7iqo=BY)>>JwKbS*HmHy43rT`oX;D0?1B at FhoiHobXj)>WX1efI
> zJU8ijM~X&mQP_3fgKh<sA6K9#ew?<yil@|VW<d)+s&lDDY+1QV=VJ$VTDL+}_?#W(
> zUXgLX{#@WPq3^*D;44|hKH}2Xk>o0#I}37lR+WYO7ThroGn2Ns|Lj!kt?l1aHN<^6
> z=rpajy<v$n>zo-pLE3J0RWbJo$sp{4U2)*3>9Mhw%$FM5wJr5kSx8--MbuRp+&e8Z
> z4`@MNSlfYfET#1>;nJOZ)Y6~!GZR0RE!d^Jv}})>S!&p?W>#lgasXn<9<}#rfZ#z;
> zjvYuVje2UlcY^~dll_07pLPJ}QcMFK*a!^FgxB!AJLZvjmMpxUWVAm6@&bQA=br!t
> z3;uKM(I7EL`;)5?(z=v>Z+kSW2x4MbHU4kfqrFc<NCoVb;QtCj1qY%f8?Zhn8bU2I
> zAnsF$o5SLyd9?R6oPMW8dKM<)-+Of+T_0pb at q!LA=+QxtZw^V%5+z7 at 2bprQ3oih{
> zV2#)VeJR+lUetrW^xnqqUY at _nb4$fhltpsv1xRnNLTc}Ajq_mgB{y!eh0c608-1>N
> z9UFB3F4n#Vm3()SKK44!7_;Y#vJcsLiz}*gnIjJik*&SgU&l7CfCgU2<-&eb>QFJY
> z{4buHecKg52&R1uh^HIdH6Yk%n9BCi>AU}baUpk}e)Ye2Qj*eB7}m4Mt}b`g^(L9_
> zfu%dH6Hkn6uP^At<F7M>FC&wAopsE@$L06fyS#o(`p(9(w{l{wC&Fv$h-u=ziKKz-
> z_T&WGY$*Lb(PdU3rAcAy3_r!CuXo~E6(2{89yyt{J6kC6pS_o$5%d2qeb%I$b~Am}
> z#5Ho#GS~|}&Z7ly;4!@I4O;mIF3kbAL+l$+lbi_QiUC>hHKJ-dMRMq+kvO{V4ScO&
> zmW}}bC%pmaCNY_&bm2MCW@{U=l3Ytd9%D>vyKoXWKp*MC%%Eu-gyPPyDqCLjR{&R%
> zC+B~!3r_+5 at q8Dan=GfAvrz&d-ZkM<Eg8ms5E$D#=;H_R4J*S{<X95+K^5&=DvL@`
> zF!_L%HIXr9^pY)<kbnB@*`M68jz^com{z>AW2D1Fh?QTE at y-s91;kPVIRz}o0vOYd
> zkxP$lv)FLaqC<E>o$Xb3G^8DHYfbz+yWOhc#4t}al*rzQ29Rm&oXH3|mm$5g))xFx
> zMwbA&iyglftcdXbt^tAZ{*3dFyvGX1#+p_HpJfK90I~u6J4Gbsh~-SL-Q|~Ltu6E)
> zhj0lOLzQphdo+gkQ%dl2ytIKn_9mXREN_r2(T~+K!&Utm?BUqe^Jj?Zr}&iVij2&k
> zZo);3!_9|TYB1>*j4RQnsBLJ8&-9lngBhh7pl~gWl2-2DI*JeDNp(9y at 4v4e)<!zL
> zpWSF?7Th7*J*Kp(yb|=BRyOQn?$0n~E{OSU6Zi>NHGzm`|9Ftguax&ySP at JB^=JH7
> z&Lu2o-DuWws8V%x=5tZu%>62pVnOu4^_4zNZOz5a)zUJlU;!#c>d6+1rSTEO-o>F=
> z at Vg0q55Vt9_`PgWa4*5H8-5;lD!|M^CB)oX(KJqPAWu3pjRAI2YN}J9%K(xJzv=M1
> z0e<(wZ*!&IFb&*GVV6&exKrg!qeUIq?9jL_dtTUvOlb=e52z1lJTI{0*n)%w;|mlE
> z#sy<R+)Z0B&ig65734Hn5$=c>`uUgOLJF&%?*ALe;zhLgZ#aYJ*V6C*hBtGI=_7C9
> zX~~N>tL(tPqH17iixGZdVqdN4I)HJ#g{K3|g}3n3Ig71`6QObT8oe_`Iw&q|S09+E
> zE&^g5qnIDu;aPl at m7X5iN>2~W&vIyB6kYLmJY{a=YX}Kfz9Tz?hF0t4R<jHHrv?fN
> zG8e=<4Ie7Sa+n42Hgpry8nmic2|}@Mfu4T;cbu1K<lRE#zT{8rx{eK1cT at e_fDaN&
> z)}^3Nls=B+__v$ZL)|mp#uK9>bt~?ZRi3VW8;?&&ENLExWJ9^AdM+`WbX9qD$J;n1
> z#dhdp48wM}TiNnpRU*RHT0~4wEHKcI-o_IWMW3h8YT!gmLt|F>b~=|rgHT}FVxsbo
> z0p=o+Er>=HdjJE=<Pkvoopi=KfViVr0$ueEURd&KNIHfRi3(^BZwu}JvFQ}`J08V9
> zz^9CN0kR}o8(RE5n{Nx^iPG<IDdlyhrvvZcY at yVYdd@}TU3g|{6w`&t-o6K3b;o_I
> zg~5yJi8ifdWA4IpCl&W+IE`mxVAP##1V-Kw%iqE2$#7o>)#Q^tx$~d8a1pZ`kGt{m
> zgouqLV(=%487 at tMqN<2K+Kn@`izh- at Td)$sd%E$&xF=21s)}r(Uw)J|nKH1iyYZO3
> z#mO$+=<=$C_I5;WgpfeF*vIbPcyGVxgxbdS;0b*28(P`}BSZkOjo#gZ$0z%GB_Ee4
> zuuCuD3oo*D!X5O59-LnnoGIV$*(pE8+X?7VVLRkda~gI_<nkNxO%`<HfLH6?J*<`=
> z#X(s6ge|D+E{(D`_3CVw_uJSbd2r{l<6RqyUu#1t+eDY?_vIgzWIo4N>NU%2^kN(4
> zP?Tww|0wY4omMmYps8ERbI^H5 at Yvhx*zCo6qyt7Hl_|VuPft!>9C^9Q%!C5soC5tn
> zJ~Hm-j<Xm~M*9N*uW6g^QcD?Ixuw7fg)d|fd3?%_Rh7`UkKoihwjM$o3?LpW!~8?z
> zK2ITgh)!HEKW}g6B1b5<NVl_ls8R;&O55~aJL86aIDvN~UDa-su=B$ER-_<f09}-`
> z+wViyhVQ-ub-3FW`uPkkJqqLfQshE>@cer&qsT|ToR6+Mij8%;ksRzj|Ie at QytMU<
> z`v<7y@<~5a%<E{zOxXAfQy(LnUJtHY$8rpV at BGv3qx|D{(qXnU1-=IvmATrcAsZCM
> z+^db90zdkI$BHwNj`Sf8rBeO7Sm4U&n0G-?D{~rLG3{lx(1Z87wC#1nyk{ZPX-70e
> zobB?ddn0DuIA$q~S#SKc{Y1I0hTqoJkI#nLo;IQcF+*nyT4oYM??o83RF}%3R%qp0
> z at hvRf0Ex@M!!cc!#5IiN+hf|15j($@e)TTCi)*Kq at 8Rq+s1Adqd%ju5cX=PjR1$TD
> z^oMXmaI$IQ_0~v3@}&DPLMg5^`v#PUFp9NZ{^57 at mG?mA8Zj0pBKX*?trt%#2F9 at Z
> z&N)5hd=|`sxk$mZdp)ctnT=Mqrvz~iBSmB1mVSC^gIW5CXm^zN<(}0>%3TmPu at w53
> zdvg2Wj^|n}eW%WzYhUNkPl;XXBLxFWM~Y%x`-5F&?i7dq+B%&>KR?!;(7xWHZ`F0j
> zZYXz0v&8oGEsF-7Zk3~iQ?@_YQf1yLrZJ;;jXmxUQ8nr8Oh35~I#q;Hjzy1XZjihE
> z5Ddt^Fad!1sq=AFd}zCL-_INyfQ9z5t<rs>3pn``9|)pRudhQV#BS+6Q>uTTyb2B2
> z$?nPiDyH63CEaJ$r`52qX`+9hwFrx{LGErw4aq6e<5al#4`f9UVl7hzAvdLK^xNcr
> zJgOu at PB}RGZ6>vQ@`=WF`ORGpHO8``CHCNI4SU-d9Cn&-I70GZrp&Zm{{9*ING}LO
> zpV8J{e1BXPvuFlF at c2bX(75-br2A;f2RNhd{8&DgD63JKt2f;}@P3-RU+zj1H2ra_
> zL6|byxsjLxPnAE5`JrP?)*_+Eb32rn3uCKC<Jr5h4dsb#XgrZdbG1UQ(qEOsVy=}3
> zDOaDot|7#tBE^+?Zf7qHSa&W5hziIyS32%bDYWkcoSobJzM`A|FnV-)pSLDN+sHg}
> zH`(a1xW}<;yyu+K2Xyj>IEO!mX!VD9Zd?=qUDtkypGKAf(3esfedR+uebVpSyUZMi
> z;}Mwxe8vOPUR%&~2`h-UpC8DOmNL0q%EF7;m{IL9oL&BVj7W-0XrI;+n+U%4V(;%|
> z-&pVOc|<0+jA`LqyvRXJn)ml04Bp%jT7r<;f}(T~HxBAucMO+t2HJ59PfRLBNr)Ss
> z4=oz)&d-zSkH>Ik`X_)>`&<)%jJ at H?l3IGBnFSHMf~cE{WTWauAA!6e(xo5a@#(t(
> zGKS%U`%bvDBxe-=s2Kk7oS>~Ag-62m5zeZBC0WXruDm24A|p%EAU)Hk8ko}lKvPEJ
> zL|A-z?L`iCXhQon4s}*q`$N#-`?oLTZ$j(MdO|1u182mE?Ngh0b0R_JW|Gk8a(_yf
> z{sU*%HD6_S9kI;^MhKYV26v2X0GKarVh<C6C+0;1pl at W3!%?=7_C{H#h%apd2%wAK
> z+#_<bu(6Z5>>Zo at GMwG}yb?YU**pP%K~X{cwSs6a0bGv~4#<IW*}sozEA8i*{n^Xq
> zXXAhUe#p_r>mr*>hL7<r++6zD$9SgZxW&?@Gfn(?4L$rZzP2uGe`l&JX`XVl$|uct
> zjmVr=Sx_oxyZYg9sb<0*;c7<1Yp#SLbdRH1F>kbtX}>B%6AlB^YL=&N1OOuLiWD+U
> zE at UmxxobuXDgIR<+He at 4?u_Ia3EzDs4552JQM&aT(EBmpWuKkJOwDwNwh;f94Csn2
> z7`($>_(?*6*k}JUQj_<A;2PxQCaOM;Gd0J}xD~-T_0r<wczUXuX>eroxO20WC<eCg
> zHX9AUGifduX#H`RuJh at E<2bGEZ)PL;ogtwv2r27Ea)7 at zq9<e?a2uuOT7yO+Z=%yV
> zXBAs=+%Q+(BvylFYM8+Vgq`Yt)KkSC6m=*(6)=+)kaSN4(TEx1bsa~@i?)y=3zo$w
> z6}->^7~p!Qae>Z1fydS<bkc1jWd#BK`yaIyY0RG6520SwXr80cqW1&Wv&rK$4s9gg
> zRGs4{UOj<eHtgdS{uON4ak+B}GrR}!S-uVEev;^DQ`|a|;+0rDA&xd|fjFH3-{73$
> z+eFH})%5!lICt7%kc<>aV!OEZXNX#o*i&`3S9{?Mzlaz-+0;2=C8|}n5_Q2(D?i0I
> z$30Gz9d`I6OTo2)yNn+A6dMJ|c~MP2{}jf(y5%zvc8~LABoT^A;+K&zzIsS*V?}xL
> z8<mXAP$zzgo9&H!(Tm>$^jLsS1Lz4d4BK9IUa8)%XSY58Vtm*pmV4^y&81bJJ#}{G
> z(HT|S(DaeP4YRFJtu~u8voY|ktE^_tCsH1a-*Vy<uLDs+Db|Wc at HH?L#(jR}yI2y%
> zEU0J|e3?%@w^QjeoHpsHk&ojq@>n()-A4ld2v}yvHUY~+x}}eS6ASZAJzgs<`Wz?S
> z`n;?Jbw)vEmASG=v!Z5deGAzv^$<;<=i at W1#-XGzgbgKcl6^A)wtN(JBfu(|;Ajiw
> zKkQOOBnB2*Puo7n#%qCx at PBUACk#VV{p3z&CEH_bN(#JN at N7j*!T(fQZD`&hmvWdR
> zxt at hBs2AGjnHzYQs7l9uwv7g%2t~H^G|h11oVv_0%u*OLO=d18Ana5>O+vC6zOfyf
> zMC5(oqH2S7%UL>XUf*^BAoOG&OJf4#JX2S?n8SQyF0s4m-hZJ&GB(_chMX;CQDZS8
> zD6yrP5HUyU5oIxR%s0P+t&@Qp%~pgSu`qk32!L~2nx!7O35~1?on;-&nCt`W0)V%s
> zE1eyYd24)5bHYBZWkKgM*<3nnP_k)#l@*A=yNult(V$b-56!ex0Dol*{vnUJ9I at Lf
> zt at nqB+rs{feYElmoId3&Lg-qT&KA0~pRw#fn3crFPSU*p1~x_IQaIGXSPZc)o%9Xe
> z_61(d6p1^H@}fK)R(|tIEPI6tT+uwXBq63jH2S!X23v6W%RrBO45qYaBDJ)Ysi7S1
> zXZ%m(ac at rmkd1eX=;~G4V at WKe))N<qqjpp3 at Oi6&U*@^-y%d*1YV9_NMt>5Et%K-0
> z83?dN(^;Ek at QDCk#INz(9;j#Pr=XxER~2)=rz%hnRUz+D=`aWcDiCaSlKkA&t&+uD
> z456^<q5|n$M+G!SCt9GCGImtpiU!{`k-92aWqnZDVOALvL!oH)itKqdRavF53Rl$V
> zH;!cwLWYl9&HR7lS7W at -*-^pl76+?n&PklX59{cHlOSI0WY29&qdwaP_&8H^by&O7
> zFNn-8 at P!Qk{J))LM9G+p&N2~P(kJcpVegAls}FZ<@IC-T%d~p#f~Ck_fQ%EB-XSkD
> zu6>E=_jD!tIG98YOeu%qaPLpvDzu11xil>$gWM4AtovE8h3XdHNnEh(cFU%4%UuF1
> z2#D@$P%!U(5sG4p;%3Sdm)|hapAVCFB`jAHFvmGWsV^i7sfR%jWf;b~4n5+}6OC8F
> zMWAeGZk=nQm_Gt3FPS=62G8j&C=0cah7e5X(L%2Pin)!v1&!kv#K<}$O0qEmhhWL@
> z9Zv59KJIp3U0^^hX0yjp(q-U<vfasNfF~M=6|+ZTphQKuan8pHsbd9*b0UdZzfP2T
> zSdnPnfQFsnj~1Hg9t*J$9?-M+k=QGF$y+S1$aG9rMp83=o65wKf{fCHP*n!{1G801
> zTptt<t2_%OLLd7Qr-2~R at +F=Kj_XU{V?S&8H_(^Q=;VLn$?9M>?Qmc4ETgsm#^Wny
> z5fy%wsO&3sW<U>s+u^@RRDOkT1AF#vbeU2smR1 at 7(;IPfSGrlh&p@<hV_w at i#d*x;
> zK=#+v^>3V%3Uk=A%<}?5{i=cFN*@gL#VzaDJ}CYE-{E~UhJIu7<$bh_ukhS?Z?d;^
> z<dkS|8uaNz;fj|xUx_CI8h6Mv at zM@*7sJ%v({=?)3iPmf<+P9^GP31~hJ84C;47Rr
> z#yG`=!|&i6YqTnZf-qHkHT3(ha5~8UQ66lJtr4|>9+R=6#;q{LL0YK?r{1}cZG*wM
> z?InG-Q2HB$0Ciu&q}<>i&*9UYK15=VM2&0$ux7<ikqO8iPwqwhiJ2kKj!L5PzBpSE
> z1xxvtdLM=ntMRTc(G$IN*@wdmfWGCyh8UR8o5B+w*5SXX<iQ!rdXoqrl*WIJr{{il
> zF8N3_6Y58#URGhuLN*Sb9A9$y^)GIw_kE4$&YBf|Uck*7oGfB#iEnbp&9>k#+vFlP
> zlb1)7M9W1yAQv&w7i+RrET!LnjWZYhQ<~)47N!oqC&SdiX&#L7>BMsBGvC&q6VE3(
> z9 at Wk&s4siS(FmdeZ{o`yDo|8en40}6%iv at tzYNBXObvSbfAGZApM1$3tz`B2sGnnO
> z!Jlg#gj4txCMbfo{RhO`r>MRUCvhrz@;`VcS2PmJ>BB{Qb<{}kzCM^QRfEYxI<m$$
> z*%n&dFQ>$*e92 at YD}K2CXAniQR?!dpaMtWGN?+_yvT0VuQnL{mN{o$q-(+ at 1_e=Yr
> z9(rT8UGAIcYhpbc$~zZ#ezGliZYvC#N?JnmPT`w5Ldhw7L-b+Nc0PV6q3b^von96F
> z`V at B7^#To$EqTa{!qJX-zy;M3_KHQ_vC;bgevxp%LZv%exsuWsK6zshI8y)P_Ck_O
> zlx*=zml5-CWNPq67O&I;Ob{Bb_aA{Jd^DVkX#C6NTr#4F<l0O$QDWwmY*adpr^_u`
> z_v;qff|r*3SDPltZMsh`UFlB?w at I9HRg1Dl5LKi_#J`fYNaRan<emT>JXafTm6$!!
> zrWh8ul9BHJ2H%==nW%=Rv-AkkZkOltxHEWa9ZM>{Drto%V>X}{jJMhiWYr94I2wL2
> z4z*&AY~yq$J1`tkjyK48*NaHHEVJh<O%}^oJiE5TQsB22C=KaNL%@0*NrBp;dy-DC
> z7)UTptE)1bfJc;CPiG9s>(I^q&ma{eT%*(j1eoheA9Mm2!?qhQ|B`e?R?T=$KFbWA
> zyIVd`HScV&uSbS<Q!j>}-VGwEJpq}$&|H*>%s2tXdosO$Yr(yP?upEGP0txtqXyun
> z0K>U5*w!_wAX>YCQp6R*d1Sur@((PVzG2Ioo4p^kmD?XiSyC+}-{Q3CJDBNmr(w`p
> zu%h$>`TYS;zVTEr6I31bw&2CrN|%1|wiPYD={UBc8?QU5XZF$Q at o#a(wHtspnkSm$
> z3&|Lkx%8z8ca;8l!s^n8C)`<@Jz>p|6aL>dR1g2}9%_L9_Y8^ff9=o)_<t|8_v5mu
> zpZOZ$6YLyPi_2frfq)qrn_-A0lQ$93XhG``S?=3Bq_!_2Q-B<?)CB74$BEjDS?AQ=
> zk{zj%kAB^crz%*J;=jW;XgnaMrr3f*d+FNmfPL9Gjy8XXr`0WlRco~cF96dVsAo(R
> z&?PoA>I3u3j+s7Zc1r-G>)C|}qP(!FGRQw(b8*uWPoWKI?w0MM_sM1m9%25tT})+$
> zv_!<BQCf0glTX#p4=`J2-}_WeoNtrc57Z+8=rE%l2_3-wCIZ!00-0DUqK<jcjNSqb
> zV8<l`IP(_i5ThTrNr!<aHVg~ICT*!C{B<2xn0Ij<&}BoMUDN`>tZc(aiP~FZe at SNs
> z*+%QF0gh-QF#Kh}_5)lxmCb)vLO2dW&Ggd&oO|bk8;rnX#i3;YbSK%^(b$#F=&W}!
> zWAc2bprP at RhQ@bnU~IfkVB{?PB3IfX^6ZW>xQLj^#Bi9ow&0)><_e%TGEqiwwP$f!
> z?iSX6_eE&)5)nnl at JsftCeRx&i$M00x0{~*MNM~|#S?`OZK3B+(Bo%u_MB=y32|0~
> zGAnWb<FZ|DmCgSkj3%+m8El)uc3Em5E{HLshY{B+uycas$7zv-les23U&51;Z(-Kf
> zI_KF!6J|4wIkE+i&;$$JBH_%;2Z$lUf2M}bL8KgEY@=xOK83>Jwe+}z4QBl{VR;Vb
> z`IXZd7A}>;nurQR0!8lxUsc($s`=2cShB<SG_2{@XptAE)xnHhSnG-!kxnn20fgG-
> zu>cvp^Y7djF>gDWLfwV6W?>j0+zR+_7|H`ydYn8HZSY$Fzw2O5*gFzoIp%dN211vE
> zpCSoW^(bbvT!yIIh7vp$v5%2x8%k>@eGYXzr-Vs?(w=wbiiShb`ipbvS6)1Io@#J|
> zuW?WZIRl9=66M8B9*Zx*_vB!7M96M76WlhK_a;+eDu8^-T$QxNm(`W-%l0{aalQs$
> z9?-4o?{Q|*&A=I`wsK3?A$D)<pM%jRHm{q$$0>FCNhDuhBu4gsFfVZrQZhnre+Z=<
> zC?)x<a6LwezC2s#HPfJ;%s-dyOMrIvIt?%@7jz`T0=Ui=8b82FhZtKY^d~jVrO>}h
> zY%tok-l(e at jc{9AWsRPg_f-x?iRC0g3B1KqVXnhz4s#uJ#t%4s`cF_x at W<kjoP&8x
> zGnp+EbPpz&bf(YQ>j-9&Lgd^E7ccUI at KJtTLAOBGLJy<vLs{oy&gU_5_=ANgAvsjB
> zg4MII7GV)Hg9hkr7F+J7Cx5`knQR1Lg)l<H^y~!w1w9U)PxVC)B``LEu at k;LlE>Hy
> zTj=L8zC5Pt;zAlN`VlV!mZAAaoX&1KAAB7=oaT9XCFV$5=$Aj?Te!ot*oSku^K_{X
> zzf`!U1VtfI>elpsHz1fa!w?<^;UVogoh|r%7R;wbFp!IgmfblLifGXwPMm*oj<3<t
> z$_parS1?0cwosxG2zwj|p$4MqhIvL7*g^#}odyVNZ9)H?q|eQhvvRstPPf at YX+yMW
> z5Kl?n2Gb*EFq+wj?<(_c98`<kV7+gXw}XB<h_e#=Tin>2zhhS5L!t_N*eeuF1ol`v
> zgrA(Iaa(~h$Mgt}JkC6<aN}VG$#4VD4#WSXdxk at er}tY2t{KLn0eJpZH5Z-L^ur;1
> z2RBTM&f%oAIc)3LhGsS~9mhbc=Sm|n4Yc+gOvvwsBWe*Zf4q(1^0Q+Yq|^?afq{HV
> zT(;16XGbBNGK9d0u_>);?Vo#yt2Gw2A+DWw8eK7teO$CvZ$P3MaPDeYwfkU9^T-0X
> zHjFssxEGiorsC?xvk=Oq?Q>kwjP!`%<foW=s|e_3S?N9u{jKlPz&V_{>^6|kSJmk2
> zqu7}WnP-~yOO4gcrAv8ISyMMV7zw94PmiV<X@`{OSc6ZAMpHu7TKS;+Uhv%q?)~7d
> z1NQ-N9|U(jU3(sn9lJBx6}5Msk2|TUP9&Vjb at R~ndFMFqEZTM+kFT56{s5pEvqR5e
> zHhWn@`-7t5H!%;1h`nKA-Il}C*j_vkSOx1JyHbDor}l?Mp20-I-?0O#fT7<)dIn~a
> zQ}EeirG1_y9)knntP!6wy-udkZNMTWxU{e&GfldxwPvI?@2KBvaVN<kgW6nTAB)^E
> zqiN2)<!)6tlw#h|u(#r$>Q|4;>Kub^g=ZPlE*fa-=g%gGEnkjsfTGzPhm<CEO2Cfo
> z|F<Ci+FQd12BFYjW&M2y($^kKx?yq at Ll3j1+g$><DN;snQv0Lr2R{&C;Xe<kJg(j3
> zNa5mvB~W-bxrKgVfTa|P2AI<0L__;QTWIzl>EWO8+B$YF>q_ at NVl6_~4;$>5q>%Zj
> z0_EE-pLxbU4Vl|h?TIAofTlgwrEDK-&teLl^l8B66~m9+HgHM6y&)7RHyg|vpOd;;
> z^j+y9=PU<aJ?(`z`zz7?M5r1<_lB3uhJ7Wun>q7fDe}Zdp?tdg0*<d+;>;oa{&X>_
> zvka(tzcU9gx#K;h7|p_BpW7tHT$Qr%J%AH+kP=RJIdjBQ?0_F)qaZvAEB3f&yr=mU
> zY`0sw8cIC1A;bN{nyMA(jxa#gZgd+Ib+dTtJxw@<yzk6~Sc7|EI16N$JFH}suW~;^
> zCN1|lyQ1}ExqDvKE;L6pi(F?Jvz7}(-0U<v)^KXk1yus8^K%*9aS^9Y$${u~Tr%kg
> zxkUv at Fdu);bqfpu+Co#Fahl%;`Gr|+hIkD<a}npxT|%^h?rkW*nGFUQ<Q8*_9uW9H
> zWLBM<9V;4u7;(TrAvU at F|GE<I-3u(VlWAf1zenwU;8PCMHGVv<Ze}111ek{vIKKrN
> zc=4BT9O-5|;bH|-96EUc(2feRmMPtwY!x#`{U$Nf#}WCe!{ibx@`X+-&qlL}OjgV3
> z1&n(KXsCK}UPQx8(4Q!)s6n>6pnp=t8}!cz>#b=wd#`IRZ|A)YUX5t%U_B{f&0)=W
> z>j*0j-09(>WdG`L32hak+4~ZNUEy-fMP|+DI5oGV*g`YwSuXj)iILf`5zT5~?9C=E
> zKaOs>gbg*EPrhfzB-x<t^63X6H)hJa((N3I8g!B#d7Y%RDLTvS%_xObdKY;XH+^E&
> zhXTPzhPdI!MZylhPrrH9%3$|!_+fm1bctzFb&0r~;fv}L`ln$$e%dUEnnjk|(6nLq
> zj}Se}eHNjkH})=B>LVosi~B1FZU`XLt&2V%J{n#(oBQa;!`RJzN%#DM%XOrw+p(tP
> z1I7(f-!C}ZxDS}f>)3-GZv*=XQlKl{+t-=Sw5i$4h|1eXX9w^D+*Z0jfK!u;Jueg}
> zs*By~9-+O)lu$ig4o|0F1+bBuN`nDB^NtS!^)e^SHiX%pl}5~j|GLsRE{g3`v#(OP
> zksX(Iz_;=C0SzvPnxZ3qCgig{b#%==VmDBHW>2`BUG0XLi9W_mX~4IDzHk|**2x8m
> z1}G9;BStvn4ECg5G}a)b0;WL=#cAc at nt@~XkzZ8{#X-g1KDk((T#e3#rhX4HJ~W<5
> z3EnMiP`p#S(gBw)kd}%@ml_5Ks0D;AbaoJD*8L#%byT!pbFsk|^ok_61B>&4=T%5^
> zyf5}9v`>{$tya3lt at J56EWnLC?c;qLIxq+y^KGHa&jpTzRrv%eM3)cdn$zgCNav&z
> z%oe3s&TiU?wID>sNKM4-0tTe%l-t5$$%@wmi0i|>7rj-qFNkMyCum9trzbbFd!M3J
> zT<+a0HOb%mO~$#<su0fBMa7p9Wp7D;#=s2vrw}$O@}z&zT_Idn2MgQV=T<TmM at -RC
> zQ at 4CnB)96dqkx!=7sP$D*tWSDw?>0xGtS4ABs>R1);rbP*PBXmP$7wxm7bfJk2T_w
> zDF5HU+RNggzpd;REuhn{<);%_z)%?2CbO$(&1+8SThc!}b9>foLo=G4*=)GTy{~gT
> z%H?{6oijT4*}x!rvP73VgQ!TZ_bK>Nv*DYL1 at xupPGNV_rjCisfjA}^K{&tn5=- at O
> za;v?ko7`@Jb?(m}33qaKTFeQVH at pFp2j&-JqA$NHV+vH%87X9e$le at i*;xylM3BOS
> zu5(U9Nm3SYPaQpM8WE<}K;8Z~m`F^UeJg#16ULXH at iC;Tg@|N#8o3KTVL2O^%MY^Y
> z3)x<jhXZ{6mqla5w}&ZOhDz>&O5UJqUYJsNN0kDtJSMQF18u1-Fj{h}GLWOI42l^e
> zpB&hwR=Y2Bap^^J- at x^B6)()>TImj6$f))94XV1;%#fV4lx;4ZW_D1*KJx(USaJ!7
> z`663-$?U at qszl_U%s&5Bdam}c%_oLgh8o}_X$R7KCk#5-TJgR}GZaE at LNrJbOew;@
> zuFM;{R3VI?!&a1n^^}c&`)p>#{+E0=|I4Jke|s;U9Ro;T65@()o7IJ3a!hPLTv-Iz
> zYU<`FsfTtdgv at ODGqx{p-`#$is0<baByRRe=<#``{k<S_*Jcpo_tJnuNSn?;=ga3b
> z at gRL1l6?s<JW6>BgPq~HdVd at g422|~+14U$wvgolU5JIWx_>=)=*nRtG~te#sr5sI
> z4Ck at K5q6l^dg#je;qb((VWghXVLB2pSJI0Y?c1NKt9(?gE`7nBRI{Ft(m%P!NV}~D
> z?i-VC$v#g7^P`<6-A$_^{@Oag;ConL*bcr`qRUfZT5f4It*l-M?soV!gMYqhrQ>n<
> zJqo`E;rGBV3rxEm>mbDnRV70;DI?X?JaMI(CBjHGP$eF%MU?A!7II&2s#|XPGX$Q7
> zfDH=%Bm903zlY)X5LB at q;^*2zX4x#$&?BPD^jyW#%5?@y&H9D`7?)ka;*veBsAM-$
> zH*w)=8&#f);i<ugOuBCumb77Yld+K-woAL4x;+(+HS at lc%UEdo!;cR^{@WJ(R{=|}
> z6!6W`|1Kc*yMW6zDPZ<KLi+66i2<zwjE+oW`Oj&AQpl|<^;kp~BgP059pESxQQ0nk
> zmC3kg&kIZym`jk)5<dx_!}MeX%pkHO66NH>it1cxZ3>cSZ~HB&CN^MnYk*j5p}g9w
> z*;rN%V`Y2t`+54gQb;I+arRU|_i9aP)kmd+0Qjx+M{k+*lv_{u at GwC-`(9}`+boHV
> z>xoK^TO2Nq=BR}1gb}bJbeqN6lx0f$@gaJ<N=Qv-7sbD^Hlv-vVvAzWdQ;kxeZ<zt
> zb(DJ+n<m|~ingePN!Q9v7>+Yd`ev#3Au+S592k*zNxJk$%fop6?94<2P1_?q<t#I=
> z+tD^VYda>n(pu>S?`&W%R?(nJxF!aQ&1~e!yhyPowNR8&y at zC)SE}2jZ=sAVZyEeI
> z$T>Euh2quKR^lpon&^RPUpDA8rCM4`^aPR9-72VUm08ag-b|lKW7*F1g1WS(w3}A3
> zUJ at l!O9E-@$vmcD5Kt1J&Qc|OjWE5NZ2~e-(w3qJgi=Ed8evRbwVAz%V6xH7aqR!B
> zZ#(7!D`585byP4HV&0Ks%GthWM+JM9>VLxxTn0Nwm$5a{Rrh}2{?waqUr+u<R6o?P
> z&19zVv#V^#Iglv|(q3n#eAH`z`X5JSB(|h^oEo at v8xd5tP|0q3SR;(h$IVdm^S>pW
> zz!sHyUZ~Xb*Ri{xBu3tO4r+uOrYJkg;p1C&6tfR*Pv9z{*T4*ypAk6-%_H*|Yh3PO
> zPqJY$JgybefqC1Z71B6?9?}X^Gz{MrGWLT0s1=gy{^dP6f|W+DMzl1Ojl+3FIda77
> zJvlt_%1sDJRgU7Z at Rbl}Aak&u0FzG6kRv{)^qH at ry@(NsLEgs=DP#^LnQ0MF-SY_s
> z1}phM5j&v>D8x1@>V(3 at FAj1;d?#>8vkN*lFudzicpqRG*$3od==4Zx*=?O=L)<x@
> z#m-LdOdnLRkS$~qe1d$ktYoJNLl85&m at 1=$IThnskgOJ+EPJqx{r~o)h{EVxT;BO2
> zn^mTP0>11ars!J)!N{|)S0w_&9i|dLtfXR;kQsM3G50R|SkswK@|m#nbp<^XCG21~
> z@|Q#l>5Av1C+MTm!XIveu17k(oOPP%15(cD6<DVmU9<xRtD#E4Z3LP68{#A`M+p~2
> zGNnVFa*zsEkzCtl&$moNWPc$ngLi=kzoX{jlh%U^VuS{+uE>r!v%f at QuGL>GyYu};
> zvb)efS$6IIJlU=GXUT4j-ypk7{o`b})}JD~tNe+wyT-4V-L?KG*<I&X%kD#dEW3}&
> z_xqUd at jCY^*+bm5vMaim%5I~(Ms}Or)w0{{w#)8z_d?lib<daG9d4`awz<u+yT at HB
> zyZhYXF70=RyVT(hcd64I?$RN5xJz|!xx;;Oxx;-r>JIm**B$QDNA7T+j=RHs`rIAv
> z(@A%@PhYvied=p at YWp+NQM0}=$`*X5I%0Oky7LGKv<kxXQjPED;r|5hU|0G;3KOH*
> z4UgjR6%XkYaSd|pM&Nz-fJm(lMN5a|9ceA!MDoJ>`129Z5bZEbk3Yo;x7_lUD8Ot^
> z_wMpF^uEvLC``ZcfD&Lj7H?vt&>|paL3oO<9=}Kw_Bt}b$5-lsRO%ZB8a0hvJ200w
> z9VMX at rfAejc9Ny!&dzl2Tv`+_j7$7cesSxo2hz2x5<xDc7@)QB!nNF7`a(Q#b#v(#
> z at j@Xu$^_Y&5q4H52(!RxOOQcMCJ5Jola(k`fU_p-><>G>L^-WANw^7|ZArqd;QW{*
> zOiH`i*WgnGjs}eKGeqqbg96e5T0BOWwP;&lXaBeX_WlBm&FK|@blRGdJTHWAkBz1*
> z{A~(|%%{9stgnBV^e}r!2TIsgso(#BzBNWLuyyzK7-8!2H_ve`$jlL?y9j8uQkIq2
> z3FmcYtk#HDPo_JocdWF)yh_bX9W1cNqsf5PAzn20s)rNVS5usq%}>RJLpYJ-xYd!@
> ze_C8j*Ch*?lYaiSd>!as>O+Qsc(J^+^tGC9jTxkMvytG^g4b&3+sS}(Yv|X>fO7ZK
> z;bg(cy+X&O2s5K!b#kRUzUUgnvc{O&6d{FobkN6Agxus3$=8CuQ!cc-oK-{IELixf
> zYc6iuPY<OCcD at l&ZK^PtZ!D%IslwxYV<+uO6;|+@^>pl5VK%?Hnl2eDd^y3<v13U|
> zt&;DznDuINLl15v(SSxi_Ld9 at l8;uU3Dc6Yeio$c at 02I)knlg at YPK}dmNcPIw^_bd
> z^th;yHq+y2Lb_&i)BEl_<)A-JDB+(dqSuTQ-c9dtD at vDsaqwLg*<-rS(P0a|H8Xt8
> zIY3HFzc|3UJPw2Jud*+{(#&6Hw`gk?@@7qG)EBS0l1mqUap)thJE78ykJ>FdGo-{p
> z$|3src)_A<Iwap{IXYf=vQ7=eEO_~mUX4GN9T=Gs99!KA`2QrcGvy7Z-q{<)##8!7
> zLns2%B*Q$xHeW_4s7okNIJUCw2FH_E=&BssB*#9%E>}6rMT0&GA*aDxBO07&zE at 2&
> zWI0r_PIUDu(ET7fYCt#)SG-#6gSa}F7J&VkP_po8bCg%@zoj>hL0Z;F=`1VNI=9xV
> zrYY${`E at 5*`z%JRbL%X|DEKdBc~45&7Gt7LZh59-3$#4bvH7whQpMD8-x@;FKO%kG
> zBKK`G-IFdDZ((OVtWeytofWCRs!07vk&SYZn?{NZ{MZ}MuHHzuEUa}2CIzHxz2Or(
> z7TO5V3dbfo!61xLJ46WS9E6q{gz?-H)L{?`r&mXwOKEYnRUcLF$?$Q~UVm}#q^0Lb
> z!$2N0S8Ymj>?qN1<GU4|JO7zv8ryS{zHJb)ZwRw}@667OG6Z^>${l%{ALWhi9$4#r
> zgp=lw9%iJlH~Et>-jh&BbBTTn->vOjeoQT0op<N38VYUpeol*x!t=5+oX?FyZruJO
> z#(-IVO=6G^myY{lKaI)|?yNH)Ju-BwWDBh93gPzwBD-IY%v$-Oqr!1so(Siea*#HK
> z2z)&<!%&~M1&4=w)jlUXU4T%izmQp&W7id>6H;?&)Ki7kh(j(5aAWtA=&t|xjp7~<
> z)^F|2F5pXDUH_?Tv9`njHHm3KqS1^<n$+yA68CK9tM%-~4~ecu$Qz86TDLE3Sq<(v
> zX2ecDN&#t8emFiu$`TFU_2P0V+ZOz#RNClQN>74sCOb%llv;5))3ozTp?uXb=*ni-
> z8ELbxzN?II;vy at _0glYcOuu!eGwv{?@HKRn`FLQS6aYSkZC8bXTkOEY9Xa2?;NKI(
> zTE`lW8Qr}HNESe!XVBBAD^p12KBHe|0-i&3I8(^3dz=YQqulFmW|Yi{NVhZd?6hCq
> z5&y(N_{rgm`EA!ko*fW{HWD*Ujv-KCw;dC;v=ta~z5JX97<%I)w#z31 at tE+ULXU|e
> zeB5Na{8>-HRkxvBJVoAj_ag*V3*^*56ri>{Yc4i)jJy)Atu;>`i=Z)4BaIPV=9Ne(
> z8 at CTvKZnIS+3}5QgE0~}JKSuyz~Y#q-O(2YvpktCh~xt|zuJ}>GI-d1{k96ECzDzh
> zcB|yA;>#bsL$ApeZkm%x_RP*`%t8h-;lLgMNk4Fx-AH1jOuHUwrCbz8;`MqI18xGi
> zv5=;g)AUj<?a3B?&t=lm93eGx1U?}GpAdo1ybAu&9HET6mLAFx#!rbNeN{Yq#yi<#
> zz3E*Pa+(2Gb+VfhFb8tHQad54p(mtH-)0t1`CK8FtEKt5f+4Y`t5 at 5pw4nJqm!j<&
> zx3ZL*u$11O3rs)(eI-{IpYV!rGuwL})C{S`Rb-DX_??Y at nJc74ce2|FYflB<W3P-U
> zpC{Zo%OW at 9t3l1`m8h;|{@~`8b%RgXYf&jQChwe%Y#xdR=6o;HW+pf3X=u_ at a+7xD
> zL6e&4hk3%x at uxa97F4QpDH}E(QiD%@sFCUT5i at O}KmUVHm?$K3f1@)d3e%?)xOwje
> zui2*ob|9WTdxU|S%pN{odrWS%5?UP-Zgv0Nv=y>&TKe%s!Kir$c&@4%{f0-Wf1;2X
> z?#n$N2R at Mdl9w+O@b~r8ntb6F&P!j<7v^z?=x{#J`E_*6Bw-roqYEYpcY)J6Ntl at A
> zbH_D)h!W~9R|;(?7z at 6j*GGpY3HKzok$m>jsh#Uj8Hf^v2(xjVJ~SEHl0sjZEc~JF
> zvxS^XBccOpc3zK=lDMZ=76HMW`h*!$qDEpz)1B_@$|7OE_d`gHljDk%&Jn0a#VB08
> zJ8ra8{Z$am*bu~QtZ(EF=sho#vRj8}s**7Gv;y6rbe>hW{!br&R$Xa;YAS)L2D;}K
> zDh<#mqt4uTN1vk7Y_Qi at l!W$85wbOJGrk%K``a|8K$ui_gGnnawdxfwoAL!we%6<Z
> zG0~UCeDSti7bf%doRXl2h>eBy4=9}l8C|c521g!;Q6gC&$Hpn^SwkCDXdN_FMO{F5
> z?mrt_>0?g^@g^r1spapZ583nhM4~q<=%E5(48M`k;{`Cm!~H@=7=R)utrAV$SWj`G
> zkk3QwiwcG0Ie!U|rt+3%_Yflw^4Jt at BqJRZ4K0nQD+Urtd6Ut6Bd+Cd3<XbK4BxDP
> z0_qEeOl}8lF9d--e5xD1S21?vj92kX*yoBGJ^$4*AI&NP?)HN-6h37pmq_m}5*F1B
> z0n$O<cNxB8Y_<1Y(I8qxF5)+eW|6<juaKWU83Ddr#G~;RQ5elz4r0uRzd}@npGwK_
> z>Z at QhBmO$bti39O4*a#)sJLCsg3KACel_^z&Jb5`LO7NfpqUW}k^|L_Kx={LW_F9O
> zfhDRB$1xpk(D)Guc8zeIC&P+<AH5tf|3TMykq7sggGZ+dNgU at p_~kVM<y2bf_gha%
> zLHcO1 at Gy5T{jnI(z%Nue9hT at JT032s3r_oV;g5AtD!<mr5tmi3O at YD4*fzdjX?jeX
> zXWm|`Ht#X02TUMt80y!GlYw at uskykp&S-}xR%u?fDuZFpA)X*43LxWUm<<Ls$rA;0
> z*5)Ml1eUhP1u2>5oSuwx+-d^~kxWQ68n8PyoRjXFAtcv<Xi|SKke(>ZdbD1ued#UM
> zC}w%eli~H+r;<?cJ#%&z4!$VKkWgffCsRIxMUvbBt6ryP(Bbq-g9`;WMdC6?AyTeD
> zKvNVoM#P6>>pYpvB89ZgWBk8>YYa>kg&gz$3HR$l|Nmh};G~Ja>O*B=Sttx7{Sw?b
> z(hGL9D%H}ynedfs>4lj>_SBWG>kAaOnma7^LZYz+J0AqDNj^9+BlvVkiS_prEd7ag
> zfS^~KioNsb!V)2E`SafSOn;Oanblq&Q#8kv8o?}{?wv=<$h at v}Hua%6u^{tSGdpmB
> zv_oe7W?Z8u3h9J*o*6aZu5?l+s>nR}Xeh8NfLhG#oqX^BJDj2Kl?bzpve{bG*bn!V
> z7zp3FqSe`?-gm;G-ZwlFPYtt#AGp4QF|&m^oFdEnDP1^+k+p*l%@HmsxCVM(nUI<J
> zMPhlK;;n{6u1;~NA#rLQ>Uz90J<#1*TUqFfZJ96q;ypw=%Rm_4NBw2OdTu&hYZj&z
> z&T%VNBcwm7 at XA#0U4{2)IR-NeWvs(;h<{%p{mIQsUmX0%43a;T5hxdOf$@5a=2(Pm
> zPDK}5gypH<`V=0cwRV`ZudgraRBi3{)xW2eZJ4}g5f*Vb(=ipoQ{c2$2=~POb5QK8
> z-`YLYaK6531={7+(hMuG9$LD>Dire#J7}v_I02vV?zzGga9ZaIH-IBSD2`2oQfq=A
> z5sfE<xTJkFuTt0q1$R^mAx&mgJZG%R;L_=#dBVf74Z*$Usg#-J;i?p<kCx7dVf>Un
> zI$xNWaI<^>XQ`aC>9QxA7$AK&?VK-6yXR(h945}KoJx>+UNiP&LlQy2o_W79TMTNK
> z!eV)dY1WEozDJoaVKgo=9LHYyRn9=M-kZZ$3hYy#LZ0m2rBKTFqd at 7*h(UO7rgj_j
> z>}I;lCS;EfH)x)<2-#VKdShQImdlwMLI8Qj2IM`Kj$I(koDwe80#LQR6Dsv7$j6xt
> z&z-h~e(4W59eSlgte0~ZDOt`xEdXTqEgf^6P<Q9I%&4=h$Aw)`?+GBQk4H-{lD+{=
> zSTfU^t$HrWli^;(RwOr08f2K4y#Q8iWLqlEGzc5RX`)gZgr%r*-B7vaxwo*LC-#-m
> zKYfwq-9!V|0oSEXtmR2Ki(7LgGfawYFnR0?h3~EhVa1BjdQXOYStxAx^$A8WvA$jm
> z8=$U?mi`^qPP6&E9mV|A#qHDV(=zserLY*5nuzM_sCd0lR`<sfd5LlSAKlDysU6?I
> z*PSpxxUO;qLZOYM at 8bk%A4VJxq{bkocaQ1nmTJ9+p*!k*+Lt%Ke2hSM-P%YKHhGM0
> zTo8Y3VfQI^0ZL3~>oVM!EvV9<xvRz)o#MTviF2qm!Ab;SRHuC*(jEd4cLPbE5eYlP
> zVND<s-WbjhWr~CwSf9dwuA~6k>AccVSCojX2DBdfzC|8;^*+tZPeeuyMH<`C#>Oj_
> z^k)o=gGl+|hc=5IuM&)l*{W%R?+EM&>x68?m07CG0=~WyzQ9RKHd=3*eXObNMrY=q
> zKW<HzJl!hHp<)>?LrslmaRSkG>txtF7y+WzMZ&+vFJ8FPC5Wg?6L2+t=w`-o7jJpL
> zQN=9ycox&yc42%ffRJcN)RB2x-uEm9)SI{i$;s>NLIamY&)bD(z-hceu*E*<oa;31
> zC}tY($TtAecY`oqH!T<w8T2fwzEPNHWCNpYI^!{H({|=mBSk0}+okkrD^p at aU45M!
> zr3QNAje<?{bY(N-+77w)+$c;*`pNz(N%S(qp}%9Jb6Ejhdy at 9w2(swYRJmA~35_r<
> z7AhbgFk>*Eo9LFsLJqH;PhVdw+y<%oYT<GI*hh40wJ<*S+bShe%Ij&odlGYhHL-yE
> zKu at sAML(?uwD~RNZxSZ!kJ&9ol2x)o&3~;kX^+{d=_WwuS#<SHLTeo)PSrzV6Th(5
> ztY*oLwfZ=sX3V4`PdFD at p|w_h)FSrn0WWQUFUh{Xy}rq5u<CDGEw>!;Pb{>%?lwJk
> ztjWBdxUho6h(`ZCa+;psw$<1&zdz%wLR1D^O~#R#V5WauA}pO+JF-W^>e1cd$-oL^
> z=xpm$m!K^Ecr?V_#nP at oQSHsbIR01@&AVA1$oV%5wKr;+`D(j8t1i at UfvNd~Tv-os
> zISt!m<kyzkV@>5QjO;N;?Q4ik;N~HYnRhwX)R at t>rFu6Cl^DnJ5ktXQbogc=H at 6sY
> z9Nlan`LaTwvm=R(eIiO!5S at DhtdbJ%GCIEo+LA at r)Bq>^3~j0r#sl$OM)%hU_d*lL
> z-Xh$|HPQN8gd*1P&Rc{Tb+4aumcs{)wq34$lG)a~G6<TvuyDA at BHhfYOkBrrVXhq4
> z#y??2ziWiFCbJ?7wKcTOWt at Iv2AgAmd7f(92=c07=R>U at CSJogGm(L%C&tx3-QEK+
> z+gMEE4L8(3xpTUlxDJBl^;^Z-#A)?!b*`4f)9U};HW=}}-F6fTOgR$OHubsZp3|RJ
> z$Q5z?Goo at J31lkPz#{$`de|Z4DUUS)`g)QMIE3uX3%xm&dUYn&lim)PuBB10pF6`3
> z;3lp#=Jj(d#rrKSx)pe*r)lM_FlW2yBex3gCLMYnH>n$)jfT!uom`JlV{{_#o7BEk
> zNE2kffUa9AEaMFH_)=Iw2CBXdmdao0>f3~J?hM^`n=obC_du<<lFYv#_E?>?HFf)E
> zJJv*96kVprVi)>#gvnYgw$QN#53|^qCaS(&7 at xLQM50m7SbNz300{u#7yC at FL>E)@
> z?ZQpz;)Y3XY<eYj?FOc<u+O_3TNH66N$H3vJDgI0cHS<O%dCq3b|G_mkz41`b3#}V
> zqG;%>JI~pI;;X%Wc0ca}4F3Dvno$VCZc&ThQTs9>IaTM58co<G8qV?O6{Ou3+_;pI
> zWrCeYh#p at i7=^oQE^ZCb3(JIU{1+$amRjLD9nigo%OJ`C-J^ZAf-#mw{4(S`SAV`i
> zj?^y~l4Pimk7p4Fi<S#7a<M=3CRdu_Ygy1zV(_Zz*DF9gQPT at 6ghG{?)OxbKC+Xys
> zFyv~wYNaqW?ExRRMb*MrVT7By-S`ZDR=2g=jzb}d(2kWtYHl7g_{KI(8O^W->tt0S
> zj4U@?A}){dJ%wWpr-JtQRtmF#70X{Gd@`*^zR*=}3*NZAvYD?vjMyHwC*v at Zo)NQP
> zS(LMMvI15md$d*v?)`M~9YXrez?(OmX67b+vaAWAA(CUytVb+-7`|#H;@5>4{RUsS
> z7<RBCt7Cdlj{PQlcgd3}Uqq8{ZT>Qk?z%&mDHr~&%mbBsGTp2NIo?{fL%mq%PM0%Z
> zfYc1JJW}=GNJum at pDlQU8}jl{)nwrGn48D$Y0#q8LRy(zw+Pa5XS!(cC&~qU+gSz~
> z&8#h*Wvr at 832sfel?;wOXAGVfk(-A?wyYMiE7+(??C7aWDUYz%Cr<$I{jmR<QU8zo
> zr;Yl5VkRX<Lub8aI<y)V((}}Qr(jHCRrUWrti20dRMpx)zV at Cy!^{R at xG1Oy!$mGe
> zK;A;cal{E3H5`qK2o=-JdPhaEGLJPI*%~ULBC at PwhJ}-rhp1y}WjUBfvFvhsosOp?
> z9qM=tXFP^VNl489dG_91%}$^H`-9J#@7nA7tY<yzS<hPgvV`bX##7i7)9B+a=v?P1
> zq#GVl$NLO+1zNlv57PsWsCPUlwH?@H>S6np-Yc1r80HF<-`FetUYODyhup*vmrmv<
> zK4L%nFf at t-9{&Ojt6c*0j5)+Us%}xS56+~QZ0bcp4`!PU-cA==Va~D|(lV02Izt~?
> z3P$@Fx^<~KgnclZI+lW#1w6Y{ZL$9lvIXA at z7l!WAlh8|R$T=v9Yiv}KHy;Fl~Q-#
> z_+ at Qs<AV>*1U<jdmD8%l4Y}V;^^R*Irefn;b&Y|)lG4_uw#!Mo)F3pt!x#H2$(D8(
> z*mb`v7z^Znt*|9Msa|XKafZPfGrMu{=e(JCJ7Mw;6d5Cg2q#^EW_B`$Xr&M)n;Mpb
> zHU1BJc)9wIQDrU_tQQmZ%|^=)PcX;|OD*FJg5cC;1^n!FkD;rI)OSJZ_lndDfTiIp
> z)C=KCSOIIef6%rS>KS)juvq+_v}Eruw`3pNW+mi(n6CXG>_Xo4ji<Bxh#uoJk}_46
> z=>aKu*UK(b+e&p<c(#SsL5eUi75)LMXe}5n!C<hMvuvQrYF4U;Gp+OpB(z(ykH&$S
> z^e9A*DIkOaoNloUI$&zeAZY}qXRYBpED{4O(|5&NNr2Zf{f}>2vj04nt14lPy7$`h
> zuCI^I(x&bJx852l_*k;vxSX!%4BTFZ0lUO6-Jmr<tJj0uVe}odI!jMp*9Qnb>4q|V
> z!(MIX2;pg7v3h)T_!rQ=7t-}2R44eDNGxa6eKHpO0cO3b1=`Ki{l)4 at _j7_DcSp%+
> z%k-hME!jst=Yqk+))f^R`JYXe>ET}>Bhpkau<3>n4wfWpqwdB5PGlHM_GelMi-m<R
> zV<l{C?pET>yZ&5qrXCM2+Tx|ARmhL&0VAzZe4b at S>^Up(#nqAtav6Z;fGnck5BynV
> z<pd^^;fgKUpZ)-C^fe~l-$){b0H6dGCF~3n%uZ&)sEj&G8ssGz1(|%h!OuVl at yk?+
> z#n5iMQ8#O*mGG&Yp7;UZpln#r5iR|El{yiK_%ny!C(Im7iZermVyJW+ at X6O=@n)I{
> z at Iqh00YQFHU@TD+f@^u``z4kc2_>1q0#@Knj|l<(-B$}8Kuq{uMaz9%FpcqM26AmB
> zJ_I{!`r6Fg8sa6KfUnp26O^qPX_G?JR6B`f`v1NNJ<nu?69OHRX4Fk3mh2CrA<PQ|
> zjRpdFOZGb&2-jPt53b1-h}V++?ep~X<LcN#Aa{=*ssOUWLf#Y at tA0}+khLgN#T7$U
> zgSbNWG2_r8&O{7a%k<@k<^-2O?|uF~kf66l1$eEKVXByZ?-nx&E`#(W+p_CR7DT`@
> zeO#wy`jkIW^AqZ9dxqbe#=Pt0dgJf|Wx(-Plv0#X6KU3&4XPGvil9j&aV*e}JK4=(
> zJ(__TCXo0;*%mG)@A?Kj3;?KO*IK6k_ at At`ge0qyU?7kri=}ipFjkwTSMSdwObbv1
> zqagp!&@wIbbdrhq*g5D{k{L{j at vgCDdgRV@LzMwC>GO#Ht_;5)4};X|APmpL(;0Oq
> zoJQT<A)rIN7R!|+%k=-b4x*L{O1T=O9B)e*flaBvHt4xoYoXa85bh6zqtKeH3t{vJ
> z6W@@R1cu`Tj++y=?w~QTNZ{tIyUj9Vd_$UH9iQQMy4e!^k3T>Ud5wJ6RzMRy@}xRD
> z0l4`n8z4*rp7>|RkYda9hfZ=^i3&)0-wFc`)_;C^`jQqJyILKa#;OE<F at BOQunfg7
> z1IBKVb(RnS#06MkCNuKKR)K=40nx!{m{riXsX!!0%T}w$!sv<H2q~68&TPw!F$+Lo
> zvq2C!t6s>?1960A5iXNShu(%|(y;;<kI?&5=0TIyxHoTwJ^^LS<Xzu%Aa^?nFp+hT
> z%c-MbPpQN0X5!1GN0k{kD|sp1P)>}xRlvk`k7b0vX|zn=xEM<D1*Xo29&I<Z9)TYH
> zsxwVLjJ4hY%vF&zpdV^m(SUj`mlM2mf*H8}NtH$f0%`Ix14*&LED(#O^IEz=Zy+f+
> zRPH at wx^e_Yh4tZ$mg%89jzy?wggL+~fU>AdBkNeuu6k%vpf#B2!3sZxDk_acu%>Gn
> zgi{kg=rvVVYCtP6jWZ5oPFtq?oCelpnTVPr+l6>g1paA0CD7~=?$BF*)4dx=8#bw9
> z?Bo;ZP51+`yb063aV>rS{4~P6w{c?n_chn^RGY+~ezAS{Q^5;6?i>3r`{2)_ZS9Aj
> zy1r|+w}FrT>m!5zXM6BtZ;i<bd0_T(&U5On5BEkHQhvT{{@34|#Iiq(fBx;GU!}R{
> zKl8rtTTgy|;pr1w*Lt$-gAZJ<T~$)Uo7<O*2ckC5)xR-n^gQqRq|K)nEV+M6*58uK
> zuCAMY;*Fgf{_OkLeLsAgeyJw;i*KF^+SFe6;Q7VFzWn&){A2EGlk7{g{x^Br8(N1(
> zJ=>PJJMPoJJ$x`|*{SVwcL)LdNphs=$d;LZoJxuL(P59yJ at c2dSL%xo{y5$6;62F?
> zmfW-IdU8~2Xz^p;zuWM_*PCBz{(1Wl_g3eQqcbl5mGt>r|H}4XkaMkrnXQMIm(}-c
> zran|$Y+bp0;lstnnGY{mxO`c<;jWb{m#;Kro9E1*c~_2MlHtLTi{>U7tWzGCIcti!
> zPZ&?+90|1fPwJtER_{}v)!0WL+(uA^p4hz&x?28IE2zQnSGExyVCt at Iga<4K^Z`8k
> z+BSj;d-wC($RI$+hucU1;Nrd8h(F-?J=@4oK>f?xK!^w#0_g$)*%!Bw5Wwcw;+qE(
> zVkdJTU<d at X0fqwFfDrtvI4l!Z@$NPPik at 6}S0>Q(-Zla{i at X4cgth}Bp|S7FgyjR`
> zd3rTRWWqB)Pze7(CV0(Znc(+6KtgXLWYb}p@(Ulxlm>k$Q+f^x3I;U7br7KS&{Os5
> ziHv>S$1-7^!{VEfp!{PpK`%GR1YKy53CeYDBffxPC*+DVoN~pB8)Oc}Ipuo&opQYw
> zj>-)^_L1BWfy(u_J7tc2cvNCk2ssV`z&i3aU>J6Ra~q9(Lp|cqqPNxiwTBYkSNmz~
> zZ$Dfum9}$Cbx*${m0zWAm#F;uy3D3;jMXGZ!C8P2cU4RM7P6|Egd^1j)g%I2`$l|o
> z6t*g at 8YXFAFXT@GT$f!<o&u~gRZGOY9lL`hW4}7@*^Zi#<bJe+qyrZCSCd!JWC*M#
> zF9MET9N+vl;6A{7Bq*ekWMKaXSCTBiWrHip{eV{i??d(++ku7wS#obR*@J9^bW4?n
> z6)9K(?(nJj=4~Vf`1kJ}qzWameH+;aSUn=Xc`p*OqME#m{dVZyW9nHf-FIAVvd8LJ
> zHkUH&lAR2j2blUX!xjMUgzG}UMHmOp2CfL)DsZd8tpz856Ty{%D+jj~TovX8R|BpV
> z+<tKN;0{B12LLba1wWt at Tq9-d>}l|P0nW6aVb1`b1J?|$1rvj71J at 3&6C8m;IB;5U
> ze&9mDg at FqPX8?EULxxQNOaeC+TpG9xa3*ls;H=<sv7z7=fwS$jLyN$(8r)iN0=P18
> z<-g&!f~x|z3tSDjec<+ktH&0CbAoFGcN*MTaLwS(->SSv{!3;5FI)>aYH+H<==l at s
> z5PNi7r8FSWCB#-rg93-yRtU%8i^7}?;W!j=pu9b at QbHWcZ$lcLl6O3$;g#@A at cSzM
> z0`U7OX_kS1km6qjet#SwIC}i!E2XiIBdQr90u_G(R2HOE{1f<9N})yI4^aqx28bA}
> zgg*m$LzVPf!5^knwj2B-6#v)Yk5K%lV|^=$LCNstA*NC7 at ngSOap>|H^|~RqJ3jzf
> z1lIzNfGmZ9%K(=L&IV2dR|~EYT-%`+J?hdy_S!~Bt5%Z(h#DVq1X0VA<A}b#<P4%;
> z0BJ_lhmsb=FreoYU}Plm17v{NA&A;w5{noTNyY*~!NiIP<zhLkb`V*F*Zu)yHKIP)
> zPRh{}GKB0x3=Jjw5TSwth){tOPz8)UgUE5 at JR%T`1*$X}atW_}WI|Pb{-hJH0|JN^
> zG=T~THXw$D$?-#nk|ewyHk^z_47ZOU8R&_KkP|?K*>KH)IOHPw`H at 1zLH=YlA{312
> zIQ?)U;B|NeDMy5S`vBF@;=_p0;^T-~e{v2H@?ApI2NUiSK;TdapvDfYi$#w%fQ&^1
> zip_{&kt7$;2jUkYLi{R3h!+tdz6ub<;{Vcx_TSToQs4FILkaz5PCy^Z2wf;4bfJV{
> zGDoosCC>gz7uJ3P3iQACVHi2^iQIQmd{5u?cHQYue!J_WF8kH4v;V%nJM)R$cP&!i
> zg_3r}u;D~|8ZbPPgaK-Z+)^I}e^1vW*iZl8hS&eKYwWk`o8LFQZZ)iach}f&Ijp4X
> z|G&fPcXx%oyD$9ytER*F|94#>bB?wDzG3p4T_Iif>574)M7q9(g0uhkVKRb at 1tH}k
> zdb`AQTJDm(({h(ALey$W5u#2<1Vo-E<%l5VI}xFt{fL7G5htR*Kl$P`6DRfIIShan
> zv>^_SB;?ZpeR$|yuX>B&wiZtniMvoG*^EJehudU-?$s(%04}RZzSdr at qJQ<*45s>%
> z8tzcJLDS+#>%%pnhmPK^`IZ at cm}OZfxZ~g&!JP(o=FmGSni=uIArq>l$(4_(mQ01P
> zm}>g%Ynlmk=KY#8_OFJ=H=}jlK3rZy at Zs^zI4{qGYcxcj0YoEYCWNB_A_8J*)qq&q
> zK0q`&-UCE~<1`@J0UcoDqM`8(T;m#}9T3+TOCsZ&(azWn2sTD0SsM}Gj0VOT2*5>#
> z-Voo6Mn#rET9%QufVe6<2#AKoB|tPP;-cc4ae462p>OjvW7NZ at -(4*&hT3Pz%MI-e
> zdAX50hbGU{?Dl<cPPJq~9eJRd&c3QCIg~eFb4F(u(^*U{Wi40y_*13$v4~xYANf+N
> z_>njJ6+iOlfZ~^`Q2fZJ<BA`7bz1Qwzs|^hyJV%EQzDRY=M_IP?~>w22DT}FWMZe{
> zM at DiJWj`8heu^LY8KU at +r{Rhp`5Fs;Y%KCNX`)@eKn9OhB9O@$iXRzmRx%^AvlT!7
> zS(P+-fEZW^h}>GDq$yY8i<J1aN_-h0a<U3gZN~*1c#wtr0VVbUVrxzVBK2nhk-+nS
> zNL-sz0hgf=nITt at nju$U&X6m}1H^8!Wys}=8FKlUUaRD{>y!vyiSShrE7+-2P^(l>
> zuT*dx5WD9zAa>0eK<t)tO1@?#AFhsAB^>j$Dum&}1PN=)VCP8`wJQ{nNire&Niref
> zfG86QfEkOnk at J&T_J>cy!n(U))n*mjcax^GRNfF6CT^3AcS6-R%_IER*Q>}Vxccro
> zeZr=xp70?gOTl%#l02zYUhgBS6yy|)!5&+_jf at 1mkKVOZlVV?au#yb?D+t<gQ`qlK
> zryW*(Q`q!B%XyhTVIPmHlm|oKHp3EmnI<^*_;9(5zEQTaN+PbV>=y=;5NS at 7HAUCK
> z-i;>wJM+1U#SyY^wu)uok6NG77}U`$lt4?K(!}^lUP!R?(Ul8O8;3I=)4wm%#QSm&
> z$_t|fE2q(|D>PxW*<Yh(O*iPM<(fEEo2Hunqf|3eeO3b%(?C%Z;~yO^({NAG!<I#>
> zY0cxBFrX|toPG>BnCbM&a!ouFLWdS<;`QfWiEqZViymKEbnnsy3$f}jHlmn5R-}nz
> zcNWu1#GqC5J;bjg=y!+(k(6JdiPN2q+#%IeOc$)sM6%}}p!pEYMm$K at A;u1+uLEi_
> z?ASIMu|^ZkX4q*5g!!Ggd%Kji=*g7}>7K_mp;Eh;GHO`~)a|A#0N8K`ePJaOly*No
> zhFEbwbt9g=p9U2pU3oMekg1^yiXk}{N;hFJ6!tb^awz>8qeoL_6+~a&Lr1NG;Dc||
> zIf(i{(=~trL4V#Mv3~0EhgVyQmrD#&k?2+QV at w5j6*04(4trb^H>j#!ZgbY6MfWeJ
> zTi0m9aJYR_PalI=Ht8)|iCBGvz6Yq^y+%%*{nSG%A6=BYMCNboA1MC>lr`rM3jZEn
> zmAks9Ed9eYA7a__d+0hq=56}g6Poxzr$_IQ1YzllrSl)B+g8Xd<JeXM?ZD(!42^yg
> zlGjnolbU#b-bi__0&&6yVOkAqQ_&Y7jqf^*Jb at K21YxVz1Y<1EI!{yglTw9&tASr%
> zw$b#}KqZOWAx%jSFIu=zlFi}lnsB-aq5|?p$f8!X<SEOt#mg~rD9an@*AU5G8co@!
> zfCshBvMR`0zH;Hib5<2gJcu@#<*Ykdc{HA_mF0ZR6d4b%pwpkyjAF*p$Dh)SVN&U9
> z2zuHCz<#!Z2CdPIW>2r6S%}tLx(1Lbrhi%ksaDc&0oVhx>5xA_?EcwwI^rH1eFpJm
> z3B&1Uf6xqJU$M~(7+7ng!`1 at sv(X&DL9g3n#f-{#5p7tj388z|YJ%DQHhK`#)!C>U
> zvED`_o(6o|M&}^zwbA#U){LO9JgphbI;4xy?5j3<8S#LPMn41ij*Z at jc+f^SAs({P
> z4*{7ZdgU3QKbelS1N}A|&9_7BQX8#6?6A>ei0wA|6XG%(9VGx3+2}mPTnR_eHwCCV
> zPr3-F-wDvj0_9>z30xG~XmSZ8UnJoOYA=E0OKh|n16SGT$B3(Kv<q>LjgDRiSYo4#
> z5!c!13y7sQ`Wd2VqiiYQ1{)oZSZ1S-A#SwM-H4lP^h?CeHmVT;%WX6r at i`k^2FQ${
> zdqik)EM2i)GmQQqYKAf+=_JLkrU~mcAxs<wjA7z2%@`&DVF-PHy=DZHh`B>)>w3_a
> zqv)Uw5PdtHvO!|u;|M8o;-ecNaVl-XpwTq&S%9(hE`;%THH2<?780akX+!8o=$}Bp
> zh3MhwHf6fSn>XO at UjD?R%O08X#KSPGrmO&)x#%ek$4sO{H$s0s1){SN+O`HnViOFx
> z7dC2!v44;*qUhf?Y697{AT*fbX(@0t`wR#TqTNO}AXb2!V9qZ$LC!7G#b|b`5}3Xj
> z0;@oBHbdY}kQ~HaAUTM;ZS*Q)jg7{Y17?HlAWjF_K|BnygZLiE4&wVDJI?_g0m(pg
> z+Gr(WgN>d51ZMsGoW!i#D<ozuKuDuI5Yp)>0QMM&NCjj$4kEGz at C1kmVk3wM;wcaj
> z#E(Hlw&Gv~5kdS6L}ROFC at qB__6zA^H2b9z=)u4<AROD^A`*Vsuat{>@Zzj=F`E6_
> zMqfreXQN*MQtf(;9}TJ0B+v}>WrL4xw$YW9kmkINIuKiI^lQXRHtN3}u+2s at 5r4AL
> zClIgL=<9%V|FarBy|i5u%U-q7pehK-E`yNVDhTPc(KQgl{$itbh+Q`N9irDphwK2h
> z5&HBF&2YMChb9ardGL>6So#)%ivAmcqeH7Tk1$$VQmq+7%gcdSXSF7Q at u3$XfYH$r
> z6o99*5q#--1iwS?QcVQfd$eh%rqPZ9>6NVuyoc}uxF__L<UhDv at K^SGughi^8B|HO
> zDEB3v18f;yDQVr73EN2{-u6k~PEO%UX5w~|irV+JN at 7Iw?2SsY9&gXg*&*F`_|jM2
> z!tEFr-)x_OYqIh2&3L2YJ#Qsh1~_VRC7F)vkDTpf5*pr9<D07_gLyj{gBJOHmE;Bz
> zEXFrKj?0On_~xep>k=!;GiZ()E6Fgd=tEik6K5qE4siLSO0odW*pDm8Lujs^s<caY
> zKw7U?l8v}D__2~C;vJN>O0o`cbXTQx=j0f)U^31lfz{+Mc*`}ck~p!2BPxl2*YTBP
> z6Iy<NxDpuqhI|7m at 2zd50Wf{i4rwv9IDLn- at Os80-%3jO!7ksztDYh6Ixh>`LF#c4
> zIb;WU3-B|T*nYxkJg|~{j7txg;6A~L7`o^<aw4)47U|Gs;X9<w=?#E*&uLV4C7w7)
> zs#a7Je3oI!)a_(0E<&@m6EtjRPTNktz!ikOuv(gxxTmYh39JYT{1hqtxsrT_tnaKO
> zc+Y8ioNN!XK*)BqNrBZbV?pLh5~tX+=*(a#SVzjU at hb1O9-FleWP*e4GtW`==)mf)
> zw-HJHMt{Do$M{t#5u6f^#)9+T@(qUWbt}eem3UkiHExvG_89J~giCi?xgFB-G-R{9
> zwnq$5P%on$7xz*?kb=PqhA22#!66D_cO6(G-yucfGd`1vul`iF($^i3iJO at q-yvya
> zw at bu}QSzOUuINf>&2uollEfpKtF=2w0t%1sp|}?{m5g2Q!?AdvVhA9v!@>Z0z;M6_
> zKm%YTU at V{kFab~nm;{LHhEzZ`;8;KnU>cwgU<P0~pb5|fXa<}Dm<^}}oC&Do$YNpz
> zk1w=AujN=jh{%I$f4~C35rBn&fq;tuLjacm4hFOV4go9z3<X>Tm<#2EK{>Ml4S;h1
> z696*~z4(%5^GG}Qg1qMZ;(3-`@@=dv2TIs!2y1PV!#bar!x{lsYe!09?Mm2jKoTy8
> zwJBjvz_JuMtW^m+0;r!Vhh37x?Bp<bcHTEq>bn*t;Q>IyV{*dtN?1MMzNh7|W+iMt
> zVCptG?3 at y|5AblUT;5qFtQOF8SPna*gw<dj-|I(8Qhk1*N($Wd{GstDG|%vM)2p~A
> zz><tt(PmJQGzF_1EIS9n^8h0N%?{i%P!W?ujvwn_r7cl|1M_o4FQJNPrFb=I--{x}
> zkxP47X~(l!!E<}%{AVOo+sX00a>gTju|O3$EJbi+zmj2}6wZ=bCF3qRBiSh-OR5yy
> zs>GKo*JVmRQMneB>$OU{)e>f?$SS46A_Z+qf+b4EMG6)w;ROoj?LBn)ubQ|0?Q0Jr
> zr7S4`)B_q0;x>(ngddbMHoqfZpL<8XKKu at DW~j&k<$BjU$Xbr9eFrx?pn`Yga<Zjs
> zVEsFCg$eKAb`3`i at 5r3u<m(xv^MD-Cen2j;?SR~p)&p|JO9$kpw<z(=O8Rrk^;rea
> z960pYx0+FD>ivJ^*aZ6gP at kz;g`;+mRB+w+47ev0Ke`PHR)9-Wux`u_lB9%#;FH2@
> zhoXo1tYPepIu(o05~Tv70@<epX#{aR<D-%+)+9g%;xQeDrz(i)7)DNq at tDr5q{H=2
> zs)Cpf!_O%3-RVpk72Bd>>F{u$q4r%}9P7pH3=q(I6=d{1P9)@y$*4OjqxJ(CecqK(
> zb4W(@K^eKXWmLT>BfDQl<~13KgH&-i3%w$ve+i<UWqcdt0RE_qx+5}b-;>ejpp2RW
> zGOGV9Blo6^syAe0Uz3sfm5S7ILnMTTNC*w7QrqR0NCD6i385ttLQ5osmPiOKkq}yv
> zp^+<)FrY+6AY4KqTtXmRLLgj1AY4KqTtXl`!>*AjmjalZ3&uWUp&$vNAPJ!$385ef
> zp&$vN90{Qu385TGMo5i}gGyxd`Lm3gw}@TxsO#kb?hP4L`($MI%E;VY5DFQieM?5o
> zn=-0jmyvr_Mpdnh>`O9&)h7wB&s#F8-?Ymf?sXYeugb{QDpI~jM#$JG6}VSM_GKBF
> z8X1WsOe{JSHsl^U>@Fl29dcw1TTQ-DtJ%|>nr#6`$f4v&pJQ74niu8$!Lla_S*!Tb
> z6cQA_w4JZ`aSi!Qceo1l#SNDI;s#EI>b0cLb3R(dkJgH|wpwz9#SFWon31-5)xG<X
> z&n{2!0jE8*JVE!T&D8p%<_I^IU08p}a6lKFar<06b|b4*H at NBErWDb6BPpxMFe|UP
> zqDAn at RK*qxSy>TmQJ!9W!Z_iFbF{EkH)QP5myEYrRv6Qd?l#V_6o~|KTk@`Ney=IT
> zIBY;1(;Y`&Z`Fm{%gdWm8hLj?uAcZ*s*FKLU#<?7&bh at hjCt4B<v|(j(U+xsz1Mq^
> zgDoqP*`qI=QdMy-RXOASDNAp-GecMV9>f$u%<k@(Djy~0T~P%&YeWtFzUbc9l-FcP
> z9vpP^MH5jsXZU|PPpTp_?|S)Zntw$%V=lD5o&jE%yLoY;?P6fZU@;1=qnfgT4&7x@
> zh?lPJZc33}#eG%qf$O23(54h8r!OQGu0aEG?2^+{%~jo4dwCsjm~_6{8Q(DrkL;}1
> zNC!Mfwf&##-gv9Jn^H`wFr7X?pdVb--PTKl=|YImd@&fm7MxGKSpza3=&jCmr}43$
> zO-&D!#AR+5iU}vM)sc-V{P<``l4pA!@o#azY&LLfjYEIHkBEo5OPW&TRQX!YCxfZ|
> zs)B(I`Ksvw_eOC9sT-ZKp!TcJzE#-o1af-2V#77v<l(E+^c-<%1cQqcWAOM}0S{E3
> zGWiqBTH1U~H#ivDEHpcR6m&wIoO4qn)wbyjY=uZiwduClxArop#FWD_6Id(ZXWr8=
> zj=p8yO3YI~ij6g{`PpPDZN(c?Z1wz{ASOPU?Ro_dbjT)56bztP$TtE7=f at Hd9gv(K
> znQqwu3!TkTlOk&}(R=0!qspdv?s$uX8Vi7wO-(6wgPJ at G33!Zz;CXr1H>3h1waWF}
> zyz3R~no=;8CmPa?&D^eywW`Sm>sTSR?2%msyIw3`Z1Mhb-2_U`ky$-IKaBH-#o*X(
> zhPNl0Q`Pmx#2*f{2j}Zms`jC<`W`FtUFMFNkirg0JoBx3p%Ifn(sy9txJrn}@1{C<
> z=oiA_G0w}0K^P|&*pcMEDvs*PE%id`qnOL}prEcdTfANW$x(sv9x3><DS}_w6y#TK
> zst}N$rV7cpqxQY;rd}MoST6+R=><*?aT$TNU)jr}GKSWE1-+Q;ipx*qMuHH$_nk at B
> zD4ykx4Hvm%>WV2YwtPz6hNcIEX`WRAYmFiaj;}5(yf{cHPF0uLD?B2p8v-fgJ$K3t
> zU;}%E at 2b>DJ=11R)euPl?cX=0ARVWSO%LFQHyr6wmNet*KbwSxj!RivLB&;7v{c{G
> zGlYh^KXir)x=dAgG05=&vq2NwBg<g4gTe~P4^#QL at 4(kG^bk_sVBJg1`Ab6nd9xrV
> zm!ED*={(*!r8f$Xf$f&^rj(pY@|@^IazJ<0(8BAwF(Z(Q0QbKd2DRUQ%s1b_soPWZ
> z5%$m8$6LIe-_ZK&x-hn)g?@Zp7vqCT$GZPT+pg=z-M$B(XTz=sHdF~d*z3TE11>Ed
> z=*zTWC|n<wTJt@<uU!|BA(7Y6X_D1qM);TWUYL?Im_(zLi_UH-Hy07J at r9pFeYiBp
> z{UNPy*A0H)C;U!)$bY00Ibww78kGZE7v at d_CYWA*)?pG=!b1>}l6PJ7Yf5QdPgKH&
> z3iblmGQ(OdY{=?@IpuoUIrn^gC8;TZ<DyNDXOdNxH)+Jrx^UJ~M>7EVqpy5tXz@*s
> zvDDLte%2+2RUqN7R1$pk%E_|^!n>!rSGlX`zMpj?7!y75vu-j|L^U0{&4cze-B%Lz
> z%N<Py<FGSTba#ht4*S3L^lFE0ncx4`&)jNC#LxUkpQE-Lx>?g8vCtrVCw;fa$H at Qf
> z3?v9}`6%D&(W(rtpB#7=O1NYE1s_+4k^d?KQfQ^HAPCdBcq0$hu${WtnPnpM at XO@B
> z6S?e2!j}-4#y!VR&V=p(J6_fZ<r-k9R^Wwr>62n!?@-q$Bk!u3S!9azTmm`<OWy}t
> z*{K^7nFN6vki!iyaxdqsBR+zU@>Q>=li7^t=<!b7$l<2Ub$-R%D#D$dgCG79j+I0y
> zHHA~|7v0EvgGAyQJ3!BW0n#pXYx+*7gM%&#mAmJ;1o?Y7oK_#^dEe#ZdB2jYOLgg>
> zEB&e?T{jS2*Xc9A=;8ylK*}Eljr&t5Di^Z0(1X9|9*#tl0;aY4K|KbB&s7GdqB%;p
> zrFVhSw!A|Nx^%JZv*YQyF5TPgvro|RUfsQe+pKDP7oIIcsf)|6;Z)*D&m~&p)r}nb
> zH_+8DKsmXh0q=s>?@&a|K)><oA`GSV&^8!c*BJLSVR~kiSR51}gbUGzDA3y at ne98m
> z`Gh!3Bsd*uIV at Ra9QOCrnS!uNR{!L2K`V1^^Vd5b<0sqi&0o#>8P|MHT(k3wn0w$#
> zZCvwLlWWcZW}X+~U88#PwnG2v9Fy}2GYNasxaL!*YeIJ{_C8E7Go|>^5Dz7uHo1}q
> zmPkTiD(mhan3={J*ZgnMjZ{~-am|+k%w=h=Q1G>a&*Ta+uKB_MzOAl7Kwh&;WnA-F
> zAzWKsQ23{W7BT!ZHB985GxP|<r-7YCe`5GNWVn^(SExaq@*+LK@}t?(dfLJA!*#Q-
> zGD=rPsQAP&c`$KRHl^T)nC0U_#Fa3(nff{P&zUEC|E4H7urNAN5GF%vk*-nkkxT at A
> zLB*%qFSqp=6?;0(!napTPVob+7ME{{q0zs8=no-1B6=JQXPBDVM*xS&r?s*R*cyTV
> zJ~!toTTtU`9QL#6V5BewRR2g)T*B0ZKx!+AB3cK%o8zO{@;S7K<L{by(BYR)RGg@)
> z8^@`Hkm at +6+A$8*yL3IYdc2c!jPq=(8|R3w8z1<QumOx3e4$m_{vUdo;~!z7>3wQ`
> zCA+zmeyrw4GB(<(=0`9GslSFF9{Pbu3c858Zgd;l!q$zk`b)B$LQNVzEc at uo7ubuw
> zP at WEYU)!FVOH2ezDyD99`<NEq5moKq=+i#oq8d{8gM5~@PiSD<CsmIJ|I>~!(pP?R
> z9&F at h(cMs5oK%{>QkpN!k_qmEwc1jzR4QBdwj4sw0a^E2Sd|b5vzejP+n{k2!!*m(
> z6_<LUv1+;Cx-rNMOwpj0;<>tFh`rr0#*<t(#+CSBqdEZy<eagNJAoO|$tXtCefWpi
> z%_dss!!Hg)qa9B)6bTprtjniI5|XrhEW3F%oulQGhOJ+Xy1}FuGy<<I5{|>H?YCtF
> z-Kpj8va>LMnqWeD`P3lb+aR#&M;qC$=S64twB%BM$GGtQ?Q6Xglwfe`VIudJCvwNS
> zT!sWVeX1*SMiRAWu4rn1N1C at TqVb9+fwDCq@ihfMG9;tKo~@rR_+L~c&)y??2|XgK
> z|2}u1S^h&tM{GZ{{1}p#`FMD&XKrbUkoaQ>+RpNj-)L+~vBn5`>r?>@!LkiPVp$d*
> z?cQrQqPg?@oj)=UIvM&;9Uq%`u#FLU5(I|d%r3KR?qsU*%~r{>`@)>6+N;d#Njx7G
> zUOuNO1x(CDXlP<iDe)C___0un_vfkZ0$RxPqvmZkfl~U{zevlsjx-^$f~iXrO`f at 6
> zVeE2!=NxPf at Rrs^cN<ptiD{`8$+S}aO|A*}z(Klob<u*(;=R5I^TS;95Y)1nw(xv{
> z9sAM!xALf&#5r&n=XLW6zh;zgU~ca;IQ*bnUvvzD-`x&>_<hL{0KYq7cxwUo0O|l=
> zsC^DNQ6%_vg=FaL*(V2yL}=(;B!1W2!nwbc1cYw$<qh^%GD&&yL6h{MZ&EY01K(0K
> zIi7oUdRNG+ejV9mhD^4sIFr>DXC&3XLQ;jGGPdpn*ux=u1JRZz)Xv<W=}ziP`$B_p
> z=#9=k^b4J;J*D+itP6?BG1@|OX}BfpeztxJUfI=wkfao=h6ZGM_F9NqD`hh5`N*IW
> zvfI^q_ywQELikzWw?xChY*z=tFZkji)C&H1>p~!Vv^7}Bh7uma?- at avrC=+Y96^p;
> z$Bz62MkSgogx%ebT)Rwfb3c0f60_r`kh3?1{5&v3Gwi02c}fWGbZ0_sGxDwrV5Hfd
> zD&?!*eG|VdB{m7ojr#7xxNj^m>)AVuiSzNy)@OxRo8p at 0cRD>!7>9NmdQa>~vkK%J
> z-OiGlZO1f%4}L;SG`NP8gEs!6tzWx`c7_O9P^!JWr{x3A_keH%7$`NMEHro&p-|Wu
> z(2tm55;6E4NhC!8!{#+?1}Gu+R8W7JxN!h at e5Pmo<EM=UnFqrJHw?6!dEoUn(Z&A!
> z9rnvjDLrR}OgE>JeWD<l20&ZIV?Z0yc~9Q;XXo|$%W|ZC>^VWCbL5^<(NNEH<dR|%
> z-)&)ePCJghDqeWVp>B!%ECOsK`8+KyBfS2V4zO*6RQENOEEa}>N#x_%P|xWn3mVMq
> zZoplLj<LeDp9_ICdnMZUN?-Oh+ at k4?{hIC+8pP%|Ta{HgFrj2DeI|gvf9RDS>yN3Q
> z>V6jN#!QdSLVOm{%K`j|dwQeUe$kJ%f9JkSh^uD=OZ&f|;m1489bfGENXQZ*L9O-X
> z;_BDAz0#Nb@!ee(KYB*z>G{Z6y-C#l3f|TJT2H~ROXo^W?KqAF<0ed>f;Ihe?V+dj
> z{iyY+&vbkH)VjBQCHP?c3XxFo%HJqh+ppl)X+|JFVt8+~Za~3xbX6c9)h7YpFM+q~
> zV_F}`M^5Zb;M=c)GDz}OcZ<QFfuw;vN1ZZ!9NDo1C4=%o{9OUK#8cO(oGOP;r{F1|
> z^Md&JNLbQ2^^PeG{;y8^r=N8&VRCB(ue&KfjL|gBb+^!(VE#7yHNmGI&qL!Zg!%Nu
> zl;q%?Ri}&{*%^NIuVkvqip7SYt%QB^SwW{r1`I#r!kksoXOFfrcNmBMlBAqcTW>b7
> zCvmC)Lox`LoZaD=2I5Y2FUxz<>&a+;V<JSRvZs~VuppQp`TGceybs~CP9%y3Baq%p
> zc-=Id<-E6Bi0aNhgy_u%)sR~diE&}wM0S3JtZ2BslYnY!6`T+^vO6uNvEN)kXDcL%
> z>n`B4fWGZCCPHkgDzSSimOmxee`Nk*HVz|adq<|MfuNgVqI+JO8SPgr+7CX2N8WVp
> za at qq2WG;lvodYtP at RXa2{ZhKuK)Or)hre4Coi}D?ZWm&OM2UaF3B^KI8Dk|RBP)Vk
> znWq<%jOpZ(*`!L5c~>#hj_M7+#N&ObQH{2l>O3eo>0oSBxq|cNYMGG!3Kx%P^i~Qc
> zCqJMmf-4e5d#AtNAf&>yJ{H_~lYXZ`<n%;15ANSV^z*^IcK%l9KsM~_UypQh1$!~5
> zKd&Vw^w)s`)VRllACoKGe`fzzW&^Rh*U|JL{N3?4^Y3u~tQ}_K#93Qu{SZFvq0JqA
> zrVrIE7;&Uu{?h(i$Rgu at 7W_lNveZcSI42VKv-rVam<=@U|InmR-ZG{PZ4 at jXH2lp3
> z*8U2COC$pA<p+NUf%|`pKs at ov{jBFtX2KM}T*QG>i)^ddG0by!{S at h&Qf~lt28lYA
> z at NGZ(>@tB{`&CdQ&NTYYGI-{9PiMd2Ds?)@Sue3Qo$M`$-PNzGbx5o at vkx~v=m>HD
> zRUz!qX#Dd2E%~-~fP~HjzG)@CrEkgXYZu(Ighl;JFiy;Ap*chO(8<u6EgODU5!RcD
> z$oWF<ye*gelyED4l>atAJb!ZErEudQFe3_e1awowuTYZFucSRjyKj!uM8XTj?Cy?o
> zq`JM1J76|r9HVhgbBw{6)G^lmtT0(Jf6%N<>mhniCvyv;`*XeoEd{w2r4zkaqFti;
> zwa$`T2$xKC!p*Xkvu}WGAz7<_hionBSC)MMGhrmG#u4DI6r*qyxZn58 at RYj$1AdLd
> z;y(e4e~Z}uI<W>w-Dx6WeK_1rZpq4C<GkjUY|Q;lHb#jokVZg{sE|<9C-6TR$gIb2
> z@`0kfnLyH~M7u1}Thjv9 at d{Pz`iu0hkYxH5t$!NVQ at 7;GP;bjkToI5f_FrMk);_&>
> zE3PE`CRa2lxFQ}Rt3ur?OqM$CZRr$YC;B_jIsK(F?Y;BNY0rPU3&kYAWGP8{Q(PL5
> zV)MWhU4H#jbcNrPBB_50d)LD^C7C&(ke6;sAq+_I at 0(K8_fO%CxG6=ml)~Pd<nDn<
> zyj=f6Zfv_L#emk_ICWDBYj2ADLPjk%WP81tJ!V&goh{DOmvW-Xn9iIwo0wzW)(9F@
> zl142Afnt6|pw8YjAr7Cl)w7{nnxy6JR7D^M<ZsHCN@(n9zh|~9=0>dX53`nJ7RMF~
> z7U_noR1A)KdE$C*G44?}4ywmv2rU>7OTu#?sv7Bh+V1mLK9Wo{sI(;d<C}@@Z)P}+
> ze_&^&(auOd!Cqm2qC9=fty{Hw-%WGLaF}QNxBIv9SN%$Ut;c?I0j66NFknVC4$o;Z
> z>C1!;)9)t1b~6cF&KI5yG&zbN#^yNb^e8 at o0}a1{J`u&wpBy~EuI5#XjKfs at HdH)Q
> z at wRkp3Enxfc-tSy*Lv~pL374TSWpd#=52l at PTU?Bq|@YSMKnJybXvY%b?<<J1=mvg
> zbu>STG0?CW-Y^=^yaA^ofr3`g2>f@^@ax;+|LX3~#+OG`XXEFETNy=hK at G0k=#m(I
> zv;kLDt^jwEwEpfcd at E4>h4K`_kr+P49*P>g5t8*uR0D~6tVvgRjY^pB at BwA>JqX|6
> zE9$Epo{Q4e)^8~?N_E7X$}H{K73?_-NZxZZ{?E&ec-Xet!0hbSkw)LzLRuKhNAtCX
> z)oJn#Ls}lor~B6yTDJ%x)u~F at nOHuDUH37K9myLCg}A1aQlT+bWJJ7GhDY+g3hAch
> zT`w({Vq%inN!rE`kqBVl3MO$m#Ln at wVLOE>;&KQj-65_)KogWAE)dW<&H`(yoYs!y
> zV;+FWSJT8O(^UO%%p|fsg%B~8#0mr|-XK?t1PO6cp;Lee5pSGzW(rP`)TLf2t<#pS
> ztJAMHcs^GeV~FEJSZMh8IDU*8YaB+G#qkprZ(SU3!r0b0eqq#Y&VUpCp4HY!LG6hE
> z^>`1=BonPEU=nn~mBDixT@}yA44Q4!+014=vjw-RXl*>7ge80lQMc{(q?dnNp6Y7%
> zKv~E7l-2c1-?F+shO!I^{GAFF1qu8N5Wjs1{O!ZRI6U~zT#k70u%l}#U|)^Gs$sM>
> zfsdM^2ZQB~z6#gYW3Ia9sGY>mvz!nz(y5yL8PV3yVL5 at Xui$D0m3$}Qxm7ebk&jI(
> z{iZ3UgygVHAcWuN0j6Hz1!sfCT119H4P`D4d|{$?f2t>!)+X|IF)`Gg$j=Bi5j6=a
> z_3Bk5#1ZAvUiEXw(CktChzTfSx)U|-llUo0ZESMjiQ2lg at VmEeN-}d|U!4)R-of`;
> z-DJ at qa2+$-o|8qB?jFS_GPSf3N|_a7RS84frYnAc!`xYJ6Y(d0Se+07zCnPI=}~0_
> zVhwIn&^^Rg(EeE7-GtUnKl*iqTp4sQGRq&P8KNqpV{hXP?1r!DeYf$MGX?qan@{n8
> zq0Ue7IAMHih!X`rC;OZhKakzIz?o_sW^xKzF{@YO3x>vcmLsZs9f<>JTp<mm^SAN0
> zF?Om?;%~nj+HO at 7t$Q~<W1OB+WiSyEVjW4s(xXC1y}6q4q%YPJFP@;`X>Bb72B(9m
> z5}zJZ#ntofr_*D~iMu8}ww%=K-8FPm5<h}DK=&o_BZsER-9(;f<?H9vSGYg!>Bb95
> zd_)*_qu_*YEZ{<jCPYtonHMztcK*(o7@;&hS}UJ~wM#k)Yk at U{_+Qz4)mJ*(D#jg8
> zpSYbjhm>|Gs`<-Z748^oD$#pBpr75&-);x4qDV-)loF4vghaP)>~p=9Oz*v#?IaJm
> zM)ZjVA?m&I7zX6b?w7OB$eZ?g#sfDDZ+$KJz<M=Lqlk!*47}J~U*Ji9E<1fB at U+mA
> zenr>LAP3zx`e8CZX2fo52y`3kN!R-mA~NvHwE9{j2<xeZcKWCAcLt-3Yy|FG`$$M$
> z3LlLUvNnY`#wrr>r6eI=f`pj3t<tLxcY}l^;9(>kR{Bi}ABJPTJ%yhWR$G|Hu&kpz
> zKY_tF7!1ys_Gn1uq7S9=lT#E8Q0i@;B9dMW(D5`>vIpn>rriybFK{iBI;R+KgCf63
> z<p(p{>4jAOj`%I0OZ2Xvaw@&wczVhKlWTpyk|t8)9sD1ddk?*L2d`n+l6HD*G`}=4
> zwp;Dv7Ls`@=o6>dEUo6G=S1)s1w}*VjRDOSDs2u*QBE~9na`;tdORwtSI^AbsZ3=1
> z#_*AL)Xgd}T9`)0kOX0)Yx?JRi%}U7- at 8dLNiYV#^kM0ScYWcyHRGA at uYqfO*RMeZ
> z*H^e;GDz}WwHjc=#2AOabl4qF48+eE^U at J~DaxpN=>t6W+Dg3p-CL|NM318gu8zQ!
> ziWofOE0So|Sbp#rX_gUH!W4;!lHN%JrUX0}$v>+|8{Gs7d)_6pUh9?=cEwnJ<isqz
> zm!m8=O!zclFJGYf0yKZ!Et}sumcK2yyZIL35ur at 3mnM(nhbnxDa^>dlWLszdg=mFv
> zygv&18!bn*XN(x7*OL~{MKKmetKWJiqvCsada{-n|M=43^w=^3s8>JWz!5-+6T4P<
> zCR;g)6Tu`z^2>aP^^D(=1UkcDEJki0_RH}9zID{$K>$|{`@`>5k-+aYaBU=pB!9e5
> zNB~~-(%U+Yze5L%(ftUF38$mR^W%osLM6OA-mz96O#B at TX!!tv_tbjM!w6b4o?m)<
> z{b`lxbj7v$Ug59mgtcI%{KMJapHuVGuJ8)4hTI7%1ZNtP`$Okd*Y}*7^m$l`JWfJe
> zH=Sg~@2vjBP=*3|A57_zN^?Hatr)KHf`tqwq2<f0W>N(+aR!z`wi42-JX$yPQ7co0
> zu;<M%yjSHBvPv}2V|Vff<A$%BQc(0*6$ve4jKe-Cb7u*LbVFHea`Xq~bt3#eSGUm|
> z=`E|vg5Qd|X+lA{_KHq2aW7Lt8Yl^&j+)c>k at uXF)&>4qTeZ>d at v?C7!;OivYK6tZ
> z2EoykSTm-#ktGJt!Fsm$SyK at o!O;R+ at q5F%1Cj2N^(wcC9!cXT+7H2O&0Yw(=$}=C
> z=c~DmO5qcFPFEYXd%^{_#m~L0teL1v(ws0Um5g-_!+fsLit`t~YZ>BRM)b^t2H+@@
> z4!&{6G=wnYGYQAIH2O$kh)a#vQ2CH6;q{vQFvAc$0z5yA4YK0_PN)2 at 4EIcSZz)gp
> z9KABU-p^fAo>tF$j=F1HK39fc4VM`Loo5%cCnw?AP|jg62-V&Fk3$Y*pvU4D3%ds(
> z|71 at y;-RJ?7sg&3+&8DuuA47*XH&AQ!z^N<E4-c+a6*oN2{{)moqkn9bvp;-E0?Nz
> zM83Bu-%o at gf2woN<Wrd$1y_WHIoDK+1g8)qvL!JknerNxK9kPt?s)($ukKdXPQaPG
> znrVI3F#(@f$tJ1?T79;}{>uOb<QBA&`G8hOMn37%$j`&5ERLrgMwsO{REJ*RTG!`X
> zW$vb5r}Od51j<h2<3qz*HMuY&!<=mZpI%F<Ejhu=Flw5}$4t86y1UiKx?PxU6$r<v
> zNR;(Wp&&iBiom32$bosL!z5{HNtCXrg=xYPVIwF5E6fWOv}PhdV$jAA$R;u&s3}j=
> zkD<z?2fK4*6Sf9QjSqUM`|%y}CnQIYCdR&2E&RSAl2(c*m_ThiTh;kmW(;VJM43aI
> z%s7 at C14Q+ezT7|3`-~L(3 at yyyM~(#ENspF<dftNWTG*<_&(>e$TGcr!c5W^#X#gLf
> zuV?VXnHls%2LE8-h-;xjV)gT_x@#MiK{t95pEAu81d`gSsg7{^9A?Uy!zJQBvkCKe
> ziHXD{kYG^NxXD16&s(*PoaFo9ny-*hA8Iy`vDY>z7R0_u{B1MZa at 5{$S_7T_xoSOW
> z96Ug8wE;Ue_YW%!hp>_>LBNp2ifCa<{omgTz4D61`}4~*!pKL)Kr??FoHK_sv;sfF
> zke^2!iH;W29VJ}Bm8~S_Dmg&GtQkCXt0<Je4EE(!Nb*X^7QxRknFI at 3w})03`P(13
> zCr9OdELTlZE4kJeB(6^?XcMAxu6pNNgN22HrG9v~NDk-?GO#xa%{{&0^_u9A$$V5I
> z_J+2nHzq>`*!f;>jNB96$bvS4l?|tblle%-mkN{lG0YWu05XHwHPe$`zb8G)Pcl#I
> zU#bs6KNzZ)vFxqahP8zWuR+^JnzpXxbGCQAC$g|eUD!*cP?N)Uy-Cwdd=zsp%{TE=
> z?>}l~1)aM_Bzjg at 0PZ2M$`&4sgwWZoC7$zw=BnB{hE$nNWffrLv}Sv|=AlqJ!@(*X
> zFa$vS^*9VH-u4T$&BPmQ<Ub%TU<yiFcWmDEjakZ#e5w6{#x+<Zu3$0J6$s4Ld5%H}
> zWk3s#nb^Y|2$`7e?d*hk?gH9?)<Tj16VAvzSDkEmONQU~?nVxNFFF&AzAqi7!W4e+
> zlvuDmHNv#opMVVubJS#ThM%<(kBPBXicF{T*G&n<QkfzeJTvIoDg4NQi24TWEI}>X
> z_?ypCzf3-L6l?R$@0~x4z9iK|!c3w;H21afAUy5R;!OT!bp&g3uM?QwEO?*cEhe4S
> z8jQnP8;#56r?Y at 7v-v#4)7g9)qQ=78LReeo0#Ym*c8xU~7(p338!UX(L at 4O3=Wt7b
> z2)+CV^%M&|GE>m>%x~B~eD_uRy~f+1=<h82Nyc#K_38YJER#gD at 8&bG#tnB%0<rII
> z{!k={Xe-<KH!xOBss!Uipd(dZESiinNUCu-Nu$r?@V^97 at v*L5qSF+p)m;%Y!ks&5
> z`7C}J7S%b6pTL}<<E{J!yo{I)COTl+Z2ol)_)$eK%;s}2Wc(cddf;}q;CkUINGVk1
> zD at 7ac;qOpCpONHzfv&oTw`M{8q^wwUSG{A33co+ZK#t41s>$0e?;CwB=hF(~cxe+N
> z8!VQ5=$7G at BWc9JC#x*)mouiK at F7O<Q9c)za+hgBF04YK^69z!@X#co;k$=gRO<~c
> z9z=Vavr~-1PNi#ed6U6%7{>nSw at UFAMK4oZnRY>JHonkRPtWD at Lt%yRQ!YP0a7Qz9
> zF$vgE)oi$!km2XtP8Z+H7y3zMz;YHSI84917kYQSgZkaaM-ES_WixaoNz$=t(&EE8
> zb}!pulNg+JAOAo0?KPPh5zeZbsqnj_#tgr-<}Uc%S(637&)4{5_&Z<dlYO`&GhffB
> zK-LU~P-Ea!lVhrU?ckJ<DftAh at x--IBQrI#H!mU1ah*|nN`+?YLQv%}xGNZ%d_T|I
> zH{>bLKKqA7qrne+UkXE2_N{XHDL#kGNAVqTv3QKP=e26i=_mMHVS1l4>Rx5FGM#&z
> z(Vb*ZDIP0gIgHXR8jO5beK(I`4Pg>zg8dt6?%LHIfeIIJLEiO}O#0dVd?J%d+wbQi
> zeWbNQ(_9*n$A=F8p~TSmFCkvA3%qEt5a0QNv-H`+zQ&<Xg;8rBNI(f)md8hpT<&P7
> z-B2^LZ0h+3TlAeojOx($YK7IxKF*<odAu(Z-y$4ypEVoUs_uso+|g$J<Eiem#>CYv
> z=2Uiv^0Y<E1N<Z=hQ{TC-Zs&!d_Han+P1)%VQy10`$0L_ at DYH|QRgx~lJ3dpN8b&^
> z%Zsm4FSIuSmS3<G0gE5M2RsPU-|nsk<(uqaAQsPz9g#j#OFSPCl at I~3qdgUMx|)gI
> zCN4ER$j9F<7wLb%?v8<k25E~ZhK#;~@5lw$>97D;<=}Hd5uQ)zst5UT561{6(_ at s~
> zi6heP#0o6J9b*lW&fV6NAbk+=2Mh)bkST^Zy+Uu0^ht<8dX@}EdtOxQ=a3=bLLnp!
> zaHzm|YN>w#KXv%O-A at aqbRv*+h8S?oCz{1Vp}|6QcT-yd9~HH)DUaJue47j*oS- at E
> z>z-R44tzdqPE|!Je6B0tlUUz4daeLWmT1~uz{lo!7+CF&RJ3(1bkSsvkU$Xl7<aUT
> z1&oCFwCb6s{0~m{)C(H%E at 6RKBJ7cmOWzm)bFmtqzz|J8N96Bhv^8U^jZV%TO;^q3
> z?`HPXV{`e$!2RXn-6G(cgfETI&bfT#r2TKMKkREZsMhvIOH&-a08j;_EK^7cgLx?q
> z?8L_`gq_{#ENAKlxvOd3JP?<6=<0c3kRI<Xp;PExy3m93_|f)FW1CW7ap}9>q^}{W
> z!@gqkYbQ{$S699H7peZH-rR?Mp<f0y3?aF~fxqHsAGA)r`=Su<{>t--{uMIP!}PN1
> z7Zr>Xe4cK%Go#bM6%qdAM0d4wg3!<q|7vOe5 at wuesGC|!ADPdGOuj`Mdu0&9<MEA*
> zuKBLOzM&4{33E5n_vZ64&}ZMw=Z8M}EEpOO!|F%h!NPA~%^2$|WLR$ws~)5*%Ni*J
> zDN+Ut6-mkhgiv?1wU|V}sCY?;z}HbwsOvRu6X-5{)-T*K!ShWY{uLJTkt5_H{oPrm
> z-uf&>s3QgZtbMTO8 at daU%ubUwv at L?&LVO}Ua~yuqM}B>mka8=;=(;IjFPxC|nY4Lv
> z0<~!)Cx^JRot^G?ogEF~)NcWA&{l>ii}3La_zXMy1gv%z2zw4rzFH!dh<EjhAoi|t
> zXf=o0#@E!_m)+W?nlq>RPU(5*sibMQwA~K#Q$5qIJNr@#D{~F0AwEJgJ_{|G0 at -<X
> z>0Sw*4lk?|5|zN~LK|?Wlq4O{0s%$k;h>a<brT?mAyLfm{$W-^a{GqDYD*^)_g#+3
> zt?Ten5f1}P238{OuDt8(Y`6vwbNYAa``Td3l{E|9^bjBK8x2-Xkz(u|d5BNeB+WCb
> zlIGIZhxl3ew5T)_cRvxT8Sq4?atDtqB>ailHEq>hA6dB=;(Lm#yI){B1xG0KC&-Rt
> z8WMhClyT^e^A{6=*H83nc4Oj>^T6dNrKaiQ_1)Y?n(f_0v%!Qn>MDC4=n$iXEYK$e
> zCcsUd0u(6r7U;f$MJdIu?=BASo8ggmf~r#>#M<h;R&c$n4HhXMc1|fV2*(6g__kwS
> zx8XRWIfEgba64PUUC=<HH?z9fC&AiT;<+ZjI5vm)kxVk3na<21kWf{Z>bXR1i}-QO
> zCHnFrK5 at 9dKhG;|%8gXyd&?qz+HEJ(<I4<=-E}pNm+JOdqhLK0lb!;zM3mrHw-0^?
> z)x8Fx{?bNu{=@uaW*dFsVcdNb3<9U at tEEc2G5mn4%GxK^s6Y(K_vVWM1LAf`?}17@
> zY%h>xQQ7- at by_l$8IZr4No<TrhW>91G_J at DFcv4xL(SZn-JzFX%(cq}ZP&N!x`ULW
> z55V&7fdOIXU9->zYL5qt42lQAl7tHe1FRE>Mji?{JU|YHRu`bit9IW!>sJ at RZ1j>8
> z?(;n^waH5AT+D}#v${f)12YHZhcSF#dt$rj^3B;!1~h)VayOXzKf=$R(p%wI2aom<
> zM+lWineyTRj=iHH50f!6$>Nl5qG`<|e8_$4j=)Nc={ASg!GO8SngW;TO!^kBiIkW(
> zvF^Dh!i9FOlitdd6}I!$6YkRvrg0#F`yDG368)C&!|l_ci=UA7yR__pAuU{xu61TZ
> zD#0zcUS%TaFrAXBQF_lZQ#63K>Z7Z;V&Z!;sBfh;#ZYadBRe at Nb8yeAPRCHES-iu%
> zyZi6vfrJdcpoQUZm>yfgCyod#kIE0z-Wbpb<ta|eKgthV^7p)*Wu+V5+l=LxPbp)J
> zh~Zfg>=SwV=Qash#tGG;*+lw0331pLVxP>@3ya-ne?7iC47;g2EiHePzs)Y<#Qf$-
> zFk;UBiZU0?spQLUeE@@21G<xS-vvIO)^**QQ~#!Pc9x<&oxTHAXSUb-I5Z~EGv}D9
> zPS<%%UjvHn82p<GTIu-5pw|*$4D{Xz*Hy)WgbwNEEwE5u&Qy~NzAzs2IoDu88P`{G
> zt9n%&ju?N at X<U#w1f1TpRT8r9ZH4B>0UD;NK;ipWkMR-q3eeVil at Nd@SIW1GF=XFl
> zkqCy~Ytb2^60}0xYafcL-cShB!K|$94S|vpAVk+2vSlQMC5CJlxLzgFG&d_%8zV+>
> zca+%wN3Uo13R%CXnqmYEo^%P*gvl-R-f9t?jwudJ!<}Hb at URRb_WBE<1GQDv+TM==
> zbUL|vNGcdC&YAa;5!Q#iUx1mPI<tm^CdVYr%THkZaWWU;^#<a1*w+u=rZL7O%@uS%
> z53aWHgMHDKV4Ma}ZS$xB0s?sVQ)UvcZ;EPVU>2#RW*dLUgcxCc&t1d)%3VX*E)VXp
> z%YzlWJh<B~m+lbM+4$JsTz&W~<;U7rLpkwon|r<cf;Cu(l~PYcD at sU!)RO at d0Zr1a
> z8Rwqko+l{2L8AFQy#IQss^=NWnzrtDNUDyQ^**a`@3*>3exbz`Ve$ULSzGOA3$6>3
> zh31R?;kV{5Sl(YR<;O+2 at a9!(iOA^jJt)xC at A`s|uNiZNL7mX0qp8baRTo2ZmhnSp
> z|5v^!tE&)YbtSJ>eDqUcwK5e}D=Jv6OqEwFu<9D-`G6i?#!m{p1)Hefa#)B|WYF~G
> zeE2B;^EXn#pv`oRBa9HxsJd~di at lNVzKF*RdOnf5;iOTQxfb#X%lS|{K0PqgH3UXr
> z(0T$kY(Q28yE;$Qtaa(Y_e7rPUwC5-q`Aw*-MACbB5lS>cV*BV5SnvXvZzK?&_y)Z
> zzH7RcXxS>LXq#}dm6*EFF3?0Iq^5?zs)M(9f7Eaf6OAiC;PFB8=pR3I at v^ro3f4Z7
> z&#Mu9$X at 9oMZ9yJR>Y48tiPt~*kqj}M9Z~r_?j**;*%ayZqNQjvbp{u-K70X=QN=i
> z=f8#l7G71)^J1MRYbIVP>9baFf-eD-n;ECAj(PQL_uK$0qo0cS+nIP8yMliJ;F%Tt
> z+{xAAU3xw7?eGU>6jFZ-mM-3|KX#tPTZ}a-;oIJV&HD768AC7IQQHCv8Bbka>X}1_
> zt>nY)=UP1<IQAQ3&b2u##^7^53bE;iGVaBB>Cs>T)k1iO6n;ZYFa~CZRICP7gA1Ah
> z7zR_Yo<4JsDS1Wakk1naG`AI);NM5Z@{)=j3^engV(sq!$#-ab?wG8|<iVKuTKpD#
> z{*uP!!3CiqX!JdIwr77tO%51U=gzvLL7x4A)W4hc#0dCrWAV8Q_%U9H{T^3WfGr&?
> z{9c6BRjItXvMb9g<(}_3clSNtbC>0NzUO{$NALO!7FXLzgtbWU1L2HFkCnF_NCd>U
> zc`D%d$G)?%ys}D<DKp^U15!G0UFC|X8FQ_qf2wPC#+?O4$;sL<85V{WNZI8oIy at Cw
> zdV>jkH=rF$06Rqvet&UyW#}&3!3iRRLI5 at eK81N*B+?tG-Fxwd#u0sW6lx{lwDgW@
> zko5GMqM|e-P({({tN2Ktqk2y81I1IciXSm~erJO-%Kc75WR1D{nTBvltiy4mNO1O5
> zeLJ%IO^`u?rehqCvy*-XCEE3(re9ANbsJRD*eR)5;UML4eT`=rg6}mByTTlZG~RaZ
> zti^l%S)4|agU_7>u^)8UHzV+}JxEV<l1~61FFjFv50s^n9(mv-t_+f%J&U5t9_M}U
> zo-MbO7yH~7jTbc1)?6Gco(gemuG8Fm=iQOzU{JXTFcbakQ^8yaZkY>GJj9s~Bk08A
> ze9GWRu<62 at Qd&3kozE%%1fOVkOB)Ja?+emWHXAKk?&DvvezMJ}+$Y`EkJN?QWW^ls
> zJPx&QcE6JoM9P3J7;$2AuMCw6 at A`ojFs$1PI1TWyzKDDw4TV8^y`AXY7xl$tB<^&G
> zhQ9k8k})0r=11;m+&KYj-k`nf&A+&#dv`SC6iBjmW*@5`uB0U##P#fbK)>S2+feOR
> zGDtEbWS*!}fJbAWlo=r??|g4GfCT!3b|>0r#FEyMgWg|M;xyqAp|*GJ-+8=gw{t>g
> zl(hen=B{>*7aE{Rd;<r++EW8G>W-c_K3vhF0c3;!49v#%`&~msr&uDy9sFnXPbGp6
> zRI<2lC6aIi$!{9{!c?#3BPRq76j2f)FnxsdB)5_b$HyK!cEZ|j1d3+;y8n-}H;-%T
> z>b{3>!W1rO5J5pvhD1QLfIt<efFZ%CpcH5e))K90AGOv8h;6Z2lRy|m6h$<ks3?j!
> zFjNt73bC!A6`ToSs#?J+pn{+xqP*)~aHxI0zdzo7KK118v-e)>taI+U=Z at fD@>DfH
> zh8*|xtLlc{3WB<4DMNRy>E++^>xz}%m7i- at +-LU;`$y{HclRcVrP(8iO>$-~@g(j|
> z$ClVqfAIaDai`w>a2&~EaE^bo|HCM%mKf50xT2a*jgSjI#kL&`xqlavdIaayU6sQs
> zGDH at Hk?2nyUf;}-IHWNecTw+GE3qI>BQ&-H*S1DOTN|uwhRtU&t>xz~TI093*-$w~
> z4Azj|t;%;JW<aQG)kg1K>B**FKK4}*iW&WT?)pEmM%8%tPd<q_LAs}RU!OW4s#rf^
> z1p_W-adNKQ&}<(q?7yyEs3LwMM^RU?<qKP8sbYU3UCde;x%J9 at CA<5dZB5yxI`b3h
> zHfUf+HrT=&yWT?8{S(Qt?0-OGPPYCwo<@YJlWLSu<-VG<lob>VD%Qi8b$>U$2mVBT
> z;y<ov!SZZ8R%Ms5D*ISr_h9h97G-1KEy`N<P+v5lvh*ZZvj&EfA at vf%OQ)1O^J6UX
> zsp~J)ttnGIInSgvY~V`H_0^=GQ-c0t!Zc{H>}vIs{uj8F#4LhgK|QcMi!eSvP$sLU
> zts!lVzrZ1FFK_InFqLEtId;OXB$w7Ha#r=@KlO|GfBp5~d6G-XorCKvFouB0Y}rLU
> z>PI~+fs&BlYMr7|uOZ{YQ<ZkzGtg!BJ^JsObZO<==jJgN_AgjlD7+igu|VHbE^l<C
> zx_Cjm+)iO9zw=-a<)f4jc-;Z36jj#G<Vee1tyAXiB}_K{nsyFrEaQ#ms4vl|Dt{&?
> z&-{e)WekRI7PSvz#&x7Vv_oFX^)HIeH5xcSKSSMW>(J}n+e`Q_w3{2Y*dU|-VPUd+
> zK)Ham<j9Zdn|T5|rtkYV_XKuCc90&^_nie>w=vxk1EE=K$vLAIm=m#OIFw at VjQwq(
> ztQaUSsq|%}{TRAgdMiNncllCKb*!czs8PyWCek&_QKLICTSodZhEm_E9^1GpWk%2h
> zxoEyKtFv{1DjTay#sXD~oE&LFN9a#MM6b$BL5>?R%%Bba3esu7Fq1aKyfXyShC>RH
> z!{DnfD at f~+^NMXT9Go!g7#G_r9q at Zau`PB;!g#TY8B1~|^#>;K##UN@^;p7_u)4S8
> zf$96)^%GGWK-I=mD+{Z;cK1iA7Q~VhhT6AKcOLJ=+u<C}CU-Jju?rPOKhPC_sdTZV
> z!f#NI{`)&a<-3uCsR3hzzb9o+m43F|P+u-LQrP1Z&80hQ3QlvUxTO%U^jg<-?^NxI
> zBd0Ugsv6?Rxn|kF-uvdhWwsvXw^dllJFBKCp#a?h22<&k$O<LtEQ`+wiZr~PWUNmx
> zy^|hjm{*Mb%~+h)=5~WddnNVt>*IS)l|S!)1+P7}gGs%d+nX_kV at d?glMjU at 4mD#5
> zwtOfiW+j$Li{uLV9-Kzco<$hV!cxiZA4?_k4_Y~P;OIh~XHat<0DsPozUO#<WIu1E
> zo%e7hLH+e<6)&FrSO)fnw<z}6Paw6kg+z{1b{rrHBV(H5-1b=iO&Hzj at fmXC4km5a
> zXr at v}m6zuP1d}Bn+ft%W#CmI7_DuQRSw1`W*%ZD7L4CHPI~nZ3Te--8E};2(Ve&n*
> z2*az at mhU)o`*$Kr_UxmeUo3Z=;%D*pO{;$CR8|S3?Z~{jX~ZBJ(Xr(>>M7qKBH=dm
> zyh2Z}Dma0h$QsDMMztw{96me}?j~>CY1gr!oT^eMkYi^GsimiU<_FA#z2|V2aE=-Y
> z?Fxm1!Vk7k`Rxnr4>Z=jIoDOWCz76SA0f>CO_=;I1aYV at GJF^`uob9EPb5DY=Y at 5f
> zUrQzRo%Sd3yhAgtDt+a#)H9TEao&~=g#4 at i>l>J7uB+M-$<a(@u*x)vbQ*qvdKgS@
> zOgSlM$m8BR%}ydelPQC#_qBWZRH6$e|71`#UhY(Fa?$KV>l<Fwv0ZOM?z~xq!M7M#
> z|B6;RRJR?N0K$g3M(v8ZevFlJ!!88|Z|{79F}RE2pUsjvwD73?fo07bTNO&roi5bh
> z3U1vacWNo=h$RTQoo0}~oPI2CHSK8+PbK|mnREXk`=xci$3VRU>i1!}m7vV-_jvIm
> z1^1o at 2OhWkJyhB2NEcH~7DEecawm4iwLDYZTt`l2PwQk9SkGtmxzfXSp=xw8Im>{{
> zv%VIlTAoZgQ9A((v)W|=1=6l3cS<s1x-$;7?rAB(ygekqgD`y$a27n}?>q^2=5xxE
> z at RhrK;5i4Lntyn94tS1#-xFuLEX<*odnwm`tuUCz-gCZBzqImFubt7sv at jz^Q0?!o
> z==X at 9(Gh2sEw_^!VXy4#wIbq(p>yLHoz%8mq+Eo>&lS0-6Z4DQSx$XE!CBt|r$|@*
> zeX%$54Px}o<fpyO^~iRHQbzris^ML+=xuJ;^Mp3^caFn_cIvEzy2Q`HtWiXr<3C}@
> zjX=zjX-`a1E_$)5<!Tqxmq{!%%O(t3uI5Uq-$(pfuKMzcg{|YvVhMd;eZo*gFw*Ax
> z(jO)JFa5GxBHe-S&Gd%GCe(OQ4ND<8i?MBN#v6OZdtgu)Qv2<TjZ}<$UH`+PRE+Tu
> z_$-ir1Ifnr51bddZ}JX!n7<nsjbmH)D4h6P32E*`42rB2($i-Th<VTVr61qhOcNXS
> zAu;1oZ^!Z2T=(|44n3rq$<LNcTa8qMH;}`}QBLk}*}CA=44v`9icXZx8rU6-Cs15f
> zK^sWVA)QGTO2SN!u#=CaSLXVv^bMqs{bK5Cc!=E6&ZH(^Jr|}W!PsUpSD!dcxpi+=
> zb!{NW2w(3zik;s`?%X{`UteyR?bq^0E_D_wz*2T17KD at V+X*M6!>A<%Z>Yls>a8Dt
> zcl7v#_!wXNq=f~cEmu_$8_D6atNqu6HsV~cb)3?!Wk<FDe3AYF?5;!S<`7}>L-J&~
> z3wnGR at CoKhIcs0Ee0C?6LCj;6P42w!D1N8QUFZc50SLn2?ORef5h48TV6!)f at g1U%
> z5hB-bxhi+ at W%Q30<&02_%VqLpjNGrOiucL*8ql|M&<^<uoD7&V^@zdkv7){{yZ0pB
> z14*-~`33f+y}wSequ%{ciBd@?;fVK_jQv*+u4>-CI!7O{O`q__UTu5xxgIPsKg#2`
> zoDVW1Ok0+>oR{BeS*|Kc#R`aa9%Ml;+S^h|8^ewFTRU4^Rf9K?HiHc^g0>Q-{R6aj
> zipqNv>CQCBP%Ya;x=kHbZAg8FQO=Y*QJ<-J`PDjSB0aWq?iND%Ml0$r9%??t at LNqi
> zi#?!MhU(@f@?(ZlMQ$c-r?$V16Hw#e#qxL2)M`<_6hr9G>WR#)knHUulp^%}fJ(BN
> zoH{5d-i~fV54}P;vYB*_xJF>+6I5HiNkt4LhR-617KQJHA^)88uh~#_ at 16Q>%Qb9|
> zqvls4o-mrLN36 at 9bWeZo6Cxgqi=V=tE6iHNDvvbM%}?4wFI>aSFzg8VLZy9yK*`LT
> zRDDyamp7 at UjJ`QK(BahGZS+JebynV!p`;!LSzTh=TBO>ShP7#t>JjqE{+Z3LK=5u+
> zh2tHAdT!~QHT`xLj)w6bjcywAT;lzhT;Vz6T>T41^lPazv3$}}cj0>pIYaIs_v?>~
> zqwZtSuW$ET<q~;(e+ at HkiE7st94Wl%=KvX)$*f9lJu`Zy7|6z at voW41<iGu9EN8yk
> zC6$co{udpo?YRTzj at 0jO`Xf3N1Nc;yAnF-4TAP{uUsIzP4r~=s$Siu(x^=iJAf2>k
> z3|D=VPEJ6Pkxn|H(4>=ApRHd`b97J!&>v`Ky#LUA%h at 7^xlGP9`!9WcW8l_Q?_P~d
> zuW!7a{BDp!&hpQOYWodh<QEroGJFXkVQ_zV>s6KOR&pd`lWO)>(vE2mqguX|96^;y
> zTglPpka%du!rZ`fMsHt#EZs`lFgG4mX}6LtvW;u0+f2FN)AQ3Z%uiUR^i|~k at OFDy
> zqnqzyxqkWJo+0m#zxzo8x4-E3q;aMdob88GCuI;J_dRfKzk=9A=(p}K(tGoa8U0Jp
> ze_F4hAL!`4uCy<a*%rlNx><z1J+~il<6P>4H6MT#y}fioou4WD)6&<o(@JcqrEF20
> z@`D`j175h;d%ZV!PaGB7S_x{5{pW&)5`rT7GdlzPh{eR`Z$ea7D(d#y{~s!bG?jJq
> zOQio7l at RKdEgfy}_NMI?LN7>P?wdOU%Qz-8o6uvZPN>LXj9IG7D$<s*O!Y`bI=-be
> zaP^>{(%bt0MM5g+zz4S;{Xf6+b)zM#_eSr`Y(M!es>>)%2!P_Zpe1Gs$AUY>&WxDC
> zF|!LYlP~-wv87pV*z)rfncXHrY2R9dvmUCAV*0iq)k+q18AO3e4-<wz{h|_Ob;sD*
> zWT!9h!-AjvPaPlVzq<fJQ={}Le>*lR-tLUoq1p4^ie6FBZaGUeER$rj`yav$pu?y$
> za<5EsEKUU at GD&;rB+n!*WE7zfyY7Ma+t>E<7}jzdbi&MHnLPO&Sz1|_{}s_gEeyDd
> z2UDEV^@H??@n$)MGxTuUM6}i*n at P}OLWHGXze;wSgfP?3qrVZK^-g^H?BSoSy+EaS
> zs{+;Hr at a?ivQ!JUlcT7&i!`HK?w+&3j%;^v$Omnb at T^<X<!`^?TK%#2&`g5*2vxRT
> zu93HeoJD_<vL3UdK6O`^_5{dAl78uP5bOp@#`{*yFy)<Urt<b1oPkF{9>mZ<Gv(j>
> z<GV%FS=nucpB$5=!r{%uueo~(?!B%DLqDLJfedo_%zwu7tbMwDi7Y!!i?`WMLg{-%
> zevZ1%{S$`hIUHIoTVyWpCz%%@7&>SH);|A{uX~$F+<Oi~@9j6)aT4r&uj~G=yroF3
> zXJe;1i#3mafiM0wD45}`H;T|)C-ey;xeNW6$D4Lv_<-&aimo?DHj1b={h;c?KU-3L
> zn7UKu$}HRJYF?Jk8#im(Ku;#nUy}b|=6rDb-Tm1A5!3QP%u+h2g?JZq`BS+g&)AoG
> z_ucv3H|Tf_Uy=V{9O?<9Kc@{28mcseC1}9n1&gK92$ryZi{V$W3|F#XS=ete(5Tw7
> zNM}a_JJbk!C|_NFjeZs^lX at uM+XI%Pswq3ksndt0IM26se$?thu?>>SPrqwriyanG
> zv)@pD-v8*bvE2CGqsyw|o#Ybc=`hvkU8I-c={3_#3u;wiyT~#2v-Kw^4r6|Hl+RQW
> zjhvP at +fLYKG;&(MQ|;PCy1WUwybJT9yocVI=BJ#iX38~$p4?Gm)Ur_Do^c4Her%%y
> zEKYAN49dd$>GY;}yX-01tCPrL-z1k3-<N}nXJk)%J?sLDx>l9aH9v#(1c$bB9g0>`
> z-%f%3q|qTrU)I-hr-Ly!uCKNFVXqxlb^&3F2QzwAD|h4QJGfW1Z8te)f?1E%`(1v@
> zf<Ds!<Ev+K&704EGsl*Hqk6QP43xe39{9BCo5kmS7uzu}4{9Y_Rw)^&GaBuwOQM&D
> z$qxqU#b#G`q!j5ME6-JTTpsjKs55Ur2IN27m(aJ9+xfFKeJ!4^hgnb$g*ai!KY_{c
> zXZKRJ(H0CQBYV&{1YwsqNJ*&9WRrs!D%Bs^<fx%r`xha~F8cX!>aQRiQuSn`(>GAZ
> z54l~pF?6I_<=47_eoK{lZeUK!!d657C3YHWyV0T85ZkULhOLH_Z=*visfyl13dg*B
> zz01N*ZbCUzW`8R?O)&#o at g)pc94VpU+OUTlrHAILdiPKd+<1Rt#N2x6suA@#lHp5A
> z#%iZGB3>}QY>!SdQ^W~y9BZ_%wtg$Fkw2l&2qQ at 6YI49v=ym%WX}CcI!<0ATv~$v(
> z>{TUp{g=+)MzQ?O5M`D;Ub(2+g#J?cw!P%(K>Em2<c$;fRT%JWg(-fm1pTYUjP_Xn
> z!NllR`x1sygR!*)&Cq|V4ng1X7_Xe;>*>o<60eJ=*%athyK=~pQ^7iRo7}L`em+az
> z{DZzsdVkR1oLDq}AwwU%et{YlEw5G2a>%jv^v_0ne|9%pDF>IoTRelz6ieg+|Al?+
> z?QtzlD&KwN3C1N=_daql!&9|jKRL#h9?%=lDGgLbjSd}*%NMG3MTXvX){Fp-oYgX0
> zmA#*|WXx8T?8lLHw(2&vENAP_h;vb5&DzNI<{o_GNam9ELhPWZvZHp+>Oz`ZL!*5M
> z)1PH`70S|r^?IV-=#3z9$A0m8os~xPIuce at WG*>;^6vh<z4gfx#=Cw038Uozm7G$T
> zQoGf at _)ZC<gP}BhlMus2lS_`8H{XJYm8YC*6%n at bK~Jc;#t-MJ{hzzT<j^|z-L%kw
> zQP#5H-K0Qm(~NH;@c>iR_ygov8J!=EI^AfGbH=xgI6=K}sqr@@h(;mxO_KgQTuHA1
> zX5p$gK6E~dVZ}4~B8+E!rdMFcn)mLDju%X35k}j3<?q#gUfn@|ZqXMMZnu^QHW58N
> z?LAinV!55_<^hs}j_W=^&P3sxM~)l2yPMTG28S<q;%dw8pdoU5d2G-Gxt&r!uCH-S
> zOP)T#Fl at v`e&vBGJrAcLo~rUZ(#`18{)VV}kped7gXAvR`fePszhZPwvpGii8$Ev>
> zM6hKgjO>;EEEX$_AmpzH=Xp&tJ;oH6*~&`nvOgBszUupiu$AR~468mY69s0SeW3)C
> z$eRd at AuK-%*ro*HCSjW;7-}}8#I7Y%VEXvc>%kU!1PcTCOjrC<CC-`ud^$$I%fOqN
> z%WPL((D!CKGBy6b`WY;oa0iCj6E|_17!YQbnyy-Qh>RNgg_6<wMa2jufrgvG!Au^i
> zdUS}KI4ofS{UMb%)^veyUtcFvr9MpBs=^PGmS!I~Sg6(>CcT*(&!|cdlT+yM>QQrJ
> z32XQ$1~5ZatRtjQZ*8 at uD(DC~(s~dzkLVLjIrSNHYIdMT8qT{TRk84sy<LO9aib>?
> zxKeJ_KJEG!42q0fZRavy3yO at rBORH1J)MbW6ulT+g7e$)7!@vWwqkkI=lfqz_+UDC
> zd#AU0_?1?^^n%IU=+~oYJTsLjpG;Vgl0v;#G at F=4SU8NI=sVljUO(HPK$8jLX0_eG
> zRzMiRPOr8eu!mM#4E##3W)J+bs3!aU2A`=m7>Ec}xfEb7 at Kl8skoJ0Cv@BG`6p$Y=
> z7OHX!$k{UD=DXWvSWFIpytB2Iyh;6mjRyI*jUD<wV*i(|AA=g$v-+M3RX-Gxb7*qE
> z7t-XO6yg*&w*L at jjitC%|2Me$uW-Z`)Aof}|FymK2=4co)%WrQ_4&7HYpz_rGEJ_L
> z8?|EeVTZcxs>eT^!r<ZG{ueIMcXf>eUmT5(rruudU+O0ur8xDK&64#!`|a{bxnXzM
> z+oOwFKYK=~(uFrxb6eoftbhBVBg3~xsmDs{>kS0;_{#I;N=COC{x`($Pf;3Bhui0W
> zQ~!2b;nx&;JMyv~>bL_JN;GuskB;=SBsi4Er_qe!2A&QbI5N>AjGF3ve<3YLE~Iv`
> zw>(F^;mNbsTvbK>LJqU)|1Gf7D|q|P4$WA#3$-%-AzB*DuB~7EUy^i}fEiHA2mf<;
> ztB?HSio%<ZPufp2y>j`218*$9*L#Q+kz$X3S*>5tH_OKlWU?H{Bzu#p@?ENGqsI9-
> zV>{g|fAey{zY=%-EAf{fBz}{(?f;#33Z2-RXU*?!y`IAGCNfx91{l0MNDUlB9N!&8
> zsNlx=t)Hk|kCDSd-?bgX>>#b>K}yT_+WLWNW$quU=5vXE1Y;pn!z`6kO;jyBMh+LB
> zP%^7or3Ce-Lg<y+C3K3J-9&0cSDR3FJ!9J5NPSb|%H>iym8x4qCD081$8gmM+>IjM
> zeImI3 at BFB=$H=h;cJxpEV)7%Sfp0vjrWBKI|3Qymu)@e3L_d+_P5=7|{qOQ=E3RCo
> z?`Af<S--KU_1l}zebFt at m{U7sUjt6ht^d*Xn70o=%Bj~aRac8iizRXC{V!LV8=8)A
> zpq|70x_Str*_y%lJs<mqf_fJCb!>HaI|C=W)bBj%u`&ALu4(PD)0SVk+!6OgQLc}u
> zA=N&!`kp<*85y=-Pp$T*Zizmjp5V$?1so?w4k;Gc5tVPQx41ITEK$WAC%0ShmBmWl
> z4*nY6OMW^!B!#z{pQUmvA$^(rY}Jwy@(Wp-nE^peGrf9{dWrffdf8iVAIn>h%c5Qx
> z>$O)Jv<R_~z7v;FW=eeyr<+xlg6$4{DPc-|Y75-LE%3X4386V6urq%B-U5TRw^X6K
> zjtJaI;%#^Bp`NuA5X=QC{t0rDY#IH`l^uPeMo+C&3ktlbIj-Pi{ClWiA~g^TCb=^B
> zz2-Rt!%R;;9>2R#x}xkx>5j4;r3cDaC_h5^6eabD<_nY)P<Ej74DytFCCU|kN=@iS
> zqEF>67pS^Vkl)J=t6rGvF-D~PIzPs)fj$JjxoTqkk4skPTC#f2^)gy!V?UVLt|*$J
> zG*tRFa;QtSkT^!JS<p_{DVgnx2SWsACOAbdqaUEgIrWl8x0Z#C3n&X!)9CQ-)5RBt
> ztJ+FQ_J79xpYG!t9hCOIM26`}qGk4LcI(Vixzbl at STy5b(0T*V!T)EjVAY?cq?POf
> z<@Ndh>Gk;=#8ZT?Jz;)I{)b`9?ADoYF_}DLjlBQa9Lg^D84x0tuG#cIYwW0=oy#QR
> zanO|6 at UZb_me*%dRn$`DeJj)Wed~KirDp?YTt at HLV}E!_jX3|&%r#+V at kvTw-egU-
> zz}KYf-76h$Gh52u%qRWsv7v9>U%qpH53)sh8|PF~{$Xme;4S7K!UW3a8S{JJjM{<i
> zt`D}m-+od+%0Eb5GvT)@sV|`n?f+;%Hq`=+0X4Vuh*acha>NLql}ZMW>9Z0Rm6AE|
> zD~*@tvr@%Fy^NpN-`c*JSozJRz7b31z$~4|`wA)v<}YEIQkL9V8hxHQEK_+y`FXvX
> z`AhU1bB#AL?it?q at PCa)KTi&Qvs5!QH6P*Nf&~Xr&BedWYWrLgrDOFdx|~~WO_x7Z
> zTh7w!dzr1OJ57FMo5dSBzt`J7mRZbi4NqarXAOBtJ(kCtGryNN#TZk~8ImVkxq89!
> z_Qec>VEj(>4gB|M$Vcv>OkT2cxZ{~cgt#%#Q`!_TRD3;<C+!TFF1{K#J^E$91o5rF
> zkE9O+Jj8v06QuV7%*8hYy``4}ri!a!zZ)=3d at 0aJdI#G*ffk6f5_iG=Tfk`eGo{zy
> zzbi0WD(egg6_*B%mnH_x7rzdSkS;~VXMv?ibVeK$XfBlnWQ%(P4 at gA;mf{}+<D}2$
> zx-a;1md6h-XaeIwz!Py3rGEzu5!Zmg6`H_!n!pvBfcL)$yas_=@NWy$mr1JvSmLI@
> zq0$=xgHaJJEesehJ{1@$?Fa}H7lS}tKnVz(l75YV;J`D|b`V+>XeRX!P>9RtOp`tW
> zf%72Hf;e5Em-I=%B(XNo6^cxT-CNomzyqOaC at nx>EC`Um84R3pz>$RkXn}YxnEe!>
> zLd6bgM1X791xWrVz*XD;X|Du$A>mLYoPzqv=n7Z5D_+xGF-3YQV3_#Vz!B2(0dC?a
> zfj00b#E;<L7+?tEq_i5u{|YpPJra_;O4kQ`Ce{Sbm&ON}iI2(xi=jZNI1~Yk1JvSk
> zfqNmfdB4;G9weS1?E-;%1U?9uDE=+*V at N$7Qcs0_3i^B+2=P!31A%cMzygpdfW`u7
> zK7b<7g>K?Gfm>nE6#qAHJT<yvm}i^qmhHc>ROVTITsWp(BN)+8EtIxz7yQ^TOlaFa
> zR&cZ-Z64!gx`5eGBqZBo1w_MHp+S3+U~ogJ(4;*@z-l-}m+XdlLeut*f at cj|g--43
> z1mhZZ!2gKgBlu5fFM at xZa1!dLHl)H&Bk*fDDg3(qp1`=FR`_juicIj|hN(h!yQyFU
> z0yeih2?jM-35(j5qTv80+BXXr4M&AT+m!;7hP^^od$M2%fXVhv0Hz3Sfd6bXAXi}8
> zkSQDof47F+ at Gla0!r!yKL@>NzozSO!3xGR-(<J!1VUKWWdkgY33fH&G(gmpvJ_s-q
> z>}%LB%xj+ at Fut}QzzV_0hGRlzd#1n$j7Oqn#tnG at UN5i!@F0|f8_I-w?fV2{8V(4@
> zwjYB3PN5t8JsTA8KPvdR;gE20yINok;2G^(1^;QN5e{p=FIb8^-?fthtA^>qR2c%c
> zK=Ki^<k at p90nBVDK;k$7r{TEJxP6a+Y&b2n2Oz7V5Wp#5eg-XBCva*|32oZ*1Y_a<
> zQF{UW6_9+7U_wKpkkei&nBK4nz#4%qy7oWqy9D1h)FV%uU|qu&;fD6X at V6Jra@+R`
> z4mA)$>%I*DJ_;gAfnh_w(5O8 at FuI`x1hPP&6!v5&PzD7yqEtcZ9q8lrNT>$TApo=p
> zMm5|L?rqP8lB0#Tx0N8aUT6h-RKsE6>UIw5M+gtK=X|Oc`uRuh6PdgTg0K_r=SY at N
> z7Rr2;aml9RRID)TO2H3B&k8 at w(iE&Nx>FdF^=m=QFAoY=W>pm|De5cyG3#N$%A&5q
> z&$G%4elBV#T$@z^dq?4_tlEN~iaN1<zu*(ZeVKI+_G^V-z<*}ZZ}3kkm<0QftV0D$
> zi?$ZpX0;WJELsh_px{-JtfBBl7Qf*0qVEcuvmO=vRW!daDC_Hj@}lPa?{`-o`tf)x
> zO<*Yq{D44d(bK}vtn(nyNE28}6KJFf{QNHhZ6Htu|JMaGif$DKW<4wTtms_f9M~rn
> zoh at 9Nl~*uCR&=*;R8}qsY%c5sfxe<25#U?!qUbLW`nKTHqR_(Mvu at _CD(VG+8W8A4
> z;2#B1MYjv1vwko57K*Ha{pX_Rg{whm70ORQU^xiP1JE1*tpLy{;8<rZ0I?;7*J1y&
> zD4_7$9d!k=ACUOltjmzLu`mh=KSM$p9M+&KzNNdOjqVCrQEg#J*3|-WQBC2ptlI_Q
> z at E2zF!v9L4ABfK at ssQo!f?2SC49UMO$}Ak3b-lp0NLBc0R(3%L6nK^85C5pbmsvLo
> z{)W<@XMHWBq&~1360a<}2Lcxn__9!%b*&&0QZI$nYhjn6&sTxaYLp=$umS`E0W=Fh
> z%K>ByppodpWm(|`S7C3+`nh1~jG5GICp|ZRob2w<=#iU!B)lfx7v>#49y~Q~qPd4p
> z1aA;e)@feyvG2!4JU{bvpE<l--VF0h9|7+OZ=QLU&um^EZ<hHkx}0nNtxq8D5buQf
> zFFxP!@_Eb5%iy2HTMqw7UOM~_`22wSpUe-#uZhPr-|55U{mK)Wzw&WGysNpb&s?4}
> zuM+-Od3wA6^JzXEylk1rX8 at kTJI?bp-{up{%jV5CPw<(=E8qnIcn+@^z!af_2v~s@
> z#PR~o&-yHb{|fWd at K5JO!#|pr#{0}X-)AlF1c0jnq~USR<9(cYmyzd%&mX)Z-evQV
> z at b}_1n=5=C at GN;ETLo}s`+4)tRX%>avpjz=o{yG^%u at hd$omw)0VwC0 at 9^RC<UEOa
> zoX-;8M);rfSpolO^ZoGO##?E=(I<wtofigRg7*v0(Y({=b6zFS8F|L at TzTQ<);^cv
> ze;ty40m(bfl at mgF`=NNU4`0SR!28O4vyX at u&zobu+h-vFXPK`Da2}Xvpe6adZ_JPR
> ze924UEkVF?UNZdmL-KfDq<N0dSG+9V8uMZRH}N9Sw~oA1JQwpm<hj7RV1B}<lIH?{
> z1E0Tn3A|Qwu20y6g8<$JBH6r|=IeZ9{=B_Bv3VK at l!8DODhi;$4k&O4<uOQIhCVJt
> z!tDUs2!PAH1?De(?(&q7a*9ucYc_}#`h>&oZl3Bhg=d6%o=+<;(T&d!q?U8S#yP`g
> zKV{D2CcCa-9dld2jdzV=?Q at IfCb~w;jE}gj<tDj)#X9BoGdIt5E$bJzFS&89Ke962
> zR&rxuFLsl1vs@!tCD_h){Q`lXb8}!%cl!kXfvg1hUv!-g`$+C%*Tt->ZkF7Gu0vQn
> z*cq<Rk*AYu<oYGc+3hj+u<L!6t=oLAoogj4`y-jtIv3f`g9>N at i$P!w0#~t$+#<Mg
> z5XhhjET#!$&;)+`7lDHykOcqJu5(!1-DYx+xh`NS-Dbc(oz?BOnETLmBrDf#IQK3H
> z+;n>Z0#8{U at HcSnWE}t at SDCArHN@>QceAsUbrJ;9K;SF_Q(afH_PfP!6|Re*$Pcjp
> z$U5p41wvAkUx2_jARq+L3;;<0G#o%fxz-@|k(&<on=E6uMV#G`{G{6=?s_Pj;kFw2
> z79ijEsQ&?7v4|_9`r;tn7vHn8+`_qAT|Z@|xh>@GcMU<nJnl&ZB)iQ5b0I4h%#XYJ
> z!R`ae7qJ at Lthp*zOV)KaF}K<EB@}qh)q}s6TL*WW>qAKWWxv!;QBZg-D+dHp5T|xq
> z#Z7np2}&=PLF$#L_#S;O1*0gG;UFLZftdjE1JE}BvINi&^x;CTjcXn3TCTV2VrqEB
> zFn_*Vw<-G4mW!6h%5J%rt8d%fC|l>ArQTp;R at Ut9rWV<xAAdPDP2Fu%Qr7OSRQK4N
> zF6(pOsP3{+mvy+ylGRUa&frI~`l-#VvS;o|YEzpnWsUBs>T5PT5pYOdgMdr!B?yQw
> zt3v%bn|1IjSD&;gE8FdUTit1Mt86pkx7tiEd+JWAe}w<H?)K{EHlxdCyT=}V2;d%f
> zmHMSkaoGd+SapZZzOpCoDe6|>w#(eN0hnU69svPpLALst&F->m2&lHnL_mr9A_6YD
> z7pWiGq?Vm`-wNR80QyV4+vY&o7WXzJsxOOjPg8$yGa3HF)Dbp0Wx?)~)SW|e0Gz14
> zV{^Q$+kLnC6$sx!!#ZsW(69~aN5GXm$B!<XlVva5_o{E%>?yn9egpwK%Bm4?(IycA
> z#p)|IN6LP4FIC?K at M-rg>YX;%%G%r?skb1J%H34`m(A3&@8Q1`lHaB!&;8{wfV*w-
> zkT+gkYjdou)BS+D-R5jrJ at B5`94vbd#aeAn$<UHib)(JZvU~0Y>Kh2CanD0QA|yYc
> zzGR~)t94haD{Qs_xLn<gzTN4bq26rMh(s-Fsm<21AKh8-cPd-pzE2%wV_0_AXFY(6
> zK_ph)Yje2lmAhQsWK#qJ+d)7LdkPdd2?df+$~Hslo#^8YNLUJ>BLHYq|7}xS7UrG{
> zDXq$y?P5V}L)l-jueZrBQ at D>oy-it=`~JcgpUtFZxZD1(etsz_<|>9{49|DYoTM0?
> zF(Th5(^_GZVSQv$rln$NhH<`q<}ih4hGo7>=0t^6hD|;*(^g?ELxo$WmBJ`vWd27m
> zOw4dc;53Cd?Ci`b2yo0Fg at E9U&tQ*Ktju8L&&gb?@W}Wne?RQoGqR8<Ly?s+G5=Vm
> zQsJHvm#@s6pg5gzAb;u(i&*olVR;|Z1Xv(29C7CP<1#;1j06Ea;K{5}K at rfS3E2FL
> zfCmT+MSxv~T|OgoyuvwSQoe1b3+$ieFV18se#nT-pPso!5d#AAGSfg{SN=ix at 5;!?
> zp9Vt5GraPXGxsaVT~_%HAYcpvj)=3!Fw5s<4wWfJWRQ?#6e?`;$7YUDSZ7$FbO(V!
> zAm9oh7XYyVv<5&iidYaU$vg&oS$<k3nV=8J9WqIU8Kl+AG()~g$Tu4GqtF#3-4z~m
> zSB%a#%JfhS&fw)6XPPK at 8Q$=haTN{-7?SA#=C1kHVD6gXjEYc5PUg?dj8>Rttj(X5
> z>7`hku?Y%fDKg++n7LgsC?f$<Pwba^^9V?6nePn(!x1+o(_F#M7y_wTklGgZ(dct4
> z5E_Bf0|eM0Fg{;Tmgx+jK>%6{pr6o(CW^$2UqIljA}53O8NG%xSmc;C+V8)YzMJ6J
> zC=&4hl6>N~UNoAYDoOMETa?eAEg3fJg`XL}N8;u8L}bYCmQ410B{JndlT7pL6tVd2
> z5*}SXmt6Ae5|RADk|BP#M1%M at B({FCCn9HlH3BY*ybxgIcLff=Nlf4<;GdRE_uDD@
> zir*pm(r*hAs3c{6&qYc6 at 8Q2xl*4~2$?_A4h`Eme+%2-?zmQDyYZVdvPKl#myJ#@~
> z0f3)~EC5UqGKT+UG{Ax1B^l*+1O7FVkun5$@h>6ZlE{PqSTe}3LNpw}-vekNf2U-O
> z-)7MYBntPFip=;wN>0N+oxeb0?-wLG&hJ=i4`2iSUCAWB9?>X%9|+$?%Q__E0nFyN
> z0r)A(XOgLYFGY6zMhVC7n#dLY)_yhcza)_vAYdZDO5*BwPBevo2f!yqL- at NTA%2fU
> z%lVs;Xsc)=|F-0$-;W6R7Lxx(OU?~^2;d%x3lbag>m?KXIz(gmPb5BmwE%3Fi~}$W
> z#J$mwLHt{ip?*!G@%(G>uNJw$-vEk_;a`+V^!(~Y)A;8l762CT|3=^L7LDL<k%*CK
> z2|r3Q-0yo)G6MGdMTi{v!4jq4otee}o(LiY|FvYSU!RD{zbEkk0V@!g2K!(rFck`r
> zD2GC7TXZoS`KAEJ75P{2n<ZcP%@=X`vIUauet(A%V8-^ljf!;=H@`U10XXdP3l=$r
> zycEo%X1EjFNqg0U*S^$BgD>>V4!N&g6MVks%aC&I+Tik+pN9OQjSANG_=Q~5eiHmg
> zk0|7U_NU<AdKQLgw5wqc45`q59sGOGJZy&sKStbL?R?n33u%@i;6;xN0q();P*JEI
> z7F^RaHe`=BD0qKQ1?=6yen>P^`#ShR&$W;*w86m(dhUfh($)sY^n`zMsXFqri+!Kd
> z1ZqIw0^+KAW`(q9SAoDHnm`RrU=dB=w+{%&ni24#Ckg at l;J%*4A)VUU!S{Q94tWau
> zx*kSIjn*Q#utyw{qa6VPAB6;hz>J<t at b3+t*%JXmHNmYt_d|ZtE(xvZ at dbfzK|p}G
> zAA+y+EC{L8#spVGkzZl|t!GZic at U~V`4|MQ_k1S{=>X7E09^%84uB45Z-d#*kmay1
> z>}e0FzV;0y_YJAmMnl>~Ay<&_J`$co{jcbXYPu_e=&m@|^L5BW?egF|J>Q1h)Gi4A
> z8~!h~zVMfZyaMr#p4A{85d0kW^-#RJM>ZxTU%MiBPtUlJR;^9&JSgC&?Lk0Qh*10A
> z;BZL&pkL}Q&O_oqdgg<`_XwOBQl<Sa_%fuffz%q<&!NvNK<GTmhahkj1Udoq96;B5
> z#-K}Api8fTSaa|S*uT=A3$Bq-!z+fl;cnSd<;7?2&By8-HRbizZ8z#7HCgp5+sx{0
> zG;a03w54BVUP`NHw3XBuYn1hRZKvxDH5=;(wW;e^n&f(uwlj2T+BU0>tx2kX+P0;R
> zt4XbQZrcg}L-nrk_t2EUKfcZj_1<mk;8$Mn+a at ck`$luSo@~2Sw*(26w at t4z)sXcY
> z5s;>_uOHkty6%`Jw#EX$dKy(dv#q$!OcPtrYTH+5qDiSY2e7eb8-OW7>){`O24vT>
> z+jiGE!+(5RCj3k4-Qn-9DXO<<ORbxx*$Uw2!1=5G8(G_dx at DR+B&x4V(xla=v`t39
> zu=)dSIdz9Mlj_MkIRH+qw`x0H$I$Gq*KaGUvqH<rwgLces2>jC!6*l{ovb4?d+QzB
> z_SCs(j=+CM-FW!Bw<W^AxPD^Wk-90G()tkq=4-apOWLm0S!y2D%a$S03XN&~$hN6<
> zDG1mE$*pP0b8ij<FrzIGiR0_-+K$zcngjL5ZD;Eo0BF*75WvYGehMu~t>?CFuCvt?
> z)VsjnRg(w*L`Z(1-lI)XXQxru^V+rnxV+v5T`SRK)GujkM4lE|eRA8 at x{VqZ0-Wmh
> zYxdP2Y%{DIab-P#i$Nr|-k|MpoxVn1KdP+=1h#{K8uk<@a1sh6q1+6qccPCsAYmzh
> zjsT#oeso)H-5yOYl(ed|xf%;%8|p^F9^IB-7o!=2dYig~8rl9o2>;pC40o&fOykWz
> zo+{NxYfq%D*QwNJYfq(R=}xN4YEN!S*Bw_E)gDZX)s?6>)gDh<r`x7JU3(^NkFHF8
> z3icFTsd``S>9md5-dei}aarmeupiNFhkrtv8vY%%&tSi*uBpvSyRZ9Gy}7n7%}|Dl
> z$+gpv$Xo4GyDiO3$5n5s<)k_3Hmj{_jnXpeiqHPiSfbiS6UYOB69_z-mZaONE(L*X
> znm`^+Ae$y|=3fLhgFq4d<7(w;dvz)5^|h+BGrDBhpQXt(x;%At?bWnhx(0PU2(;-u
> zK!BG<B4B#0ciL_c8djU0Hdbe#K6tA%O#uRjKp-A*Cu)n*cIu9)Pu3oSB4=Sgla{PI
> z1wy4LH-SJt2y6sUa+*e02%HAs=+yQgW~mzryR9s3g6`1C1CU&yJET4aX|r`jNT@<W
> zH5|^OD-O|Jv6=1)b=p2%nmWIBSK1-nVfD`14EQV63iuz@#e(?8v{N9yp*9KjE=YbT
> ztx0!XU0C~PT8l1S-B{}m1*WN|!rxRkMO{!UbA;5}`lY^l3KAbr+W`W_2u#o&RUfJS
> z1ybih>N42X=<`w#I)yR~1PVbQ1wcsv$_LP&0IEY59#(T}hrm8cP1NR5qbr7a^2O1=
> zj%r_?zIL!CzpFu;rn^}4vMWK`C)1HNs;-Z<Q*;{}*Yzc7lXXXGV!L)}lXQD(Hgu(H
> z6LkA(;<`3z<+ at zDOw@(cD7(_MYjx{t3cI#yb99ODFVgOZ|H-Z+ at ZViihWcZ=E%0m5
> zUefKadDzvXRp`#w+(rD~I;Wb%E;FqG{H?pDYGv^{{TlDCjJn+bPU_mAU8gIk+0m7u
> zjnk=X<XzjenE;OMN&zrMXtOq6_ZeDnN~_ex*W|$efG!UHN3^Hmf4b|CcDHV8&55p5
> z06zp!xAvj#Y|WjnXUKD|Mz1SLYoz1A-&8wZce2K=>m!*~QGF7?JGEPMg*C}t@!C`{
> z-h!4Xbj1KxX|n(vk1|1*Q?tISRGY6mU9+dF1pbPe1Moks+X?>y?O9z(%`aVhwVMHa
> zv1^_7vF=jMuC6Za9pq{58m8T(v#&9N|41mFMk{`%c4wDtCnP_L#JjbJbq8w{U1zni
> zx&t)_0VvlU1Mns=&qhnOY72GiYtp-lwR_;dzw0RccS7>B+LO8+HHW+QX^-nt0NkKe
> zp>H2|#cJ>BDv+mL%h09P7<8G#e|n8;ms;zfv#Htqax-uXYSLtodZX at _n$)iC+HJZ+
> zARq^UePFl^3gke6G?eQhbt3v$g at k(nR04o!+O4|ZYFxU`KuTtfswo4+R5hDmf1x{3
> z)7j;NdczuruCj{tGez`excbkt<~<vIo}1$FjCI^o%Z>AR$&&5$?B*&wx{VKcc5yd)
> z+-IHfe9kTK=whAltl`FcykhP4e9cwDe$?{?ce_Uqs|eeNJ+86#dNy+R!=C0 at 5C005
> z9R624PQbpI`@rJ?OY6CtTj;Ta<qf-$$Ir;Kip%h*VYzyK&CU1tie>G2mFwu?FJt9S
> zc<Pio@%f-Un!p1Pc!t1ER*C0LZUPAGq6s{p3GAW?y!sb`LJ-&p|Fa(FSXrJ`+~Xcv
> zR;=eG*iW!tdp_W{dTeH8d+y{mgTQr9DG10|UhvoRkga0v0V8LRYSwU10axYqf>j0r
> z=^$_#f$KavSUH|gxQQOEP^1_3SFB>smmu^4<uwp!1A!|5x&)v{0NM$lOs*}6jq?nK
> zJ%YvdY~^G^@-oj>?gl8k%d-Rdw8+=TEtGlmqAyzMz9^)-qK~!R^9FZ|$1PU6XA3vS
> zqZR?@xn&4Q@%#<UudtM0e$3+{?8hN_E33|P3wN`}Zq`lDYVKW+C at AnV*8u(=o~yZ=
> zJpKczYbdE%xl><4;V#yG5J*N`sb?owmgdn8sUJY<*Qn at 2pT7X1mnd(5z#|Z-0?<VO
> zwE<{1fOen{Teu at Uf?!|3<#{}yhF1)8#e-?zNq+y{%kX5l1E(@<6uUNjC1+b$Bzr`-
> z6=zJ?arUkdL+6Yz1NNElL7a_YM(kh0nH;4o%$QvqZpx8|vDqbb$zuD3n{Z;oI at p=v
> zcAWUI at oW_Wvcp^uFp+Zx{;A>asGr7;gI{HsfPFmtD^5$;V0Lx*a>OrTPYP#oh_Gb%
> zZ{v&$BiR<=Cpbx=W&k$g><lwxtHUigNnxh!f^arRmJl`!z=Jqh0Hzoz5a5p%911gG
> zZw()h0B80V1e^);LVy?NRG1k%KHQtL8^EssbU*AXc7FH@&OPM07M{Y%2uosn!rvw=
> zhkY=-kTX4OF!LaQH-y=+%fbyfTf+ztwn4)Nv-gD$l5rBlh60#GY0N$ruFuH}b6_71
> zcje?FU~{-L0=(E85TFk8VCRPOI7h=q1K6LF8McsJA3lWB6t)71mT?TjY}pgSli;5Y
> z$w$$WANkxIzy|ES$eS9*WuFWm%*hWM#6A)32s}1BCtOBCvSI8Zv?M;vj=dv%Bxhfk
> zD*{|Ndl9e!lIMp_WUmkBa*D&Iu(JSM8D at pPUC2obTh6XQqT68`*}KD&IZXI}6uyU3
> z5SGt24Ie#T0bn(VB!w~9d%_7$a+o#y6bNhrfnwMbpujO1q>sgq9gtduK2Ai!qX5bU
> zz`d{$>>J_xIY%I+dAOBl5{M;++rs_>`#|^_jvMNSh39h$XXyvbpk}yVL-HQ|_T!xs
> zIr>$~)ajM`a!jh$rMgrm=NMNdZ*-_k$T6(ip6XQ at pW|4Skm^&pKW9*tEH!m_WlD}I
> zDyCGf&oQq`O7+Gzrz!`5g*hL=KBDp<0*<G$5HPdqJnVOK7FF#?ji`K><5cw^wFvgq
> zDmL<%<gBaOpPE}aJZDUmS?cD>y*UL{Ua78^6SIvj#wXj+1a^Rc5^;)DUS)31U|Cga
> z>M)wX4w}F)nn3Em2snX&Ap$<GI+kitS(Y=sYF{c at c@p;XsXtWi$XQ%<H`TfFan5%j
> zFu#%k0)tY|z<+&}N$OY-%C0()y1Q~>j_sxOsgpp!1_V42Cu3B_rH-qV=di0XA<0Hm
> zq^3@*Tn9qyQRaZaE)X~ippyW~0?=aswdSZmET_^A_VKBSm6`j7K=MhInK=fKc35Q`
> z^6f*u4XEFUuE?aj!inyR4XNgpdvZor<)_+IX2^2JRUJmaiJVCY(69Uj%+IEpg89^{
> z)38 at S^32rW$~!sMRS#1aR36Crwn`5QuyZ!R|5T-Mj#ZT<q~6~z_3!H-aYE`xAizYN
> zd!-_0L{%)L-jOr7Dh2ip==1d;v<~GS5RheoKpB8e185h39s=kA`Y<CWt;zv**PN27
> z9n|oOVH#-vyFven<IV39$X`XBCa)y-$aK*`lTDH_WVdL9$)}P%#67<QCe4yK@}cM#
> zlfNY!$-hLWO&&<rlWn3hlgE;Eba`L0hHMp`H5nqwB{ee9DU(V`9s+io{DA<iC=LNd
> z<W)E{NY22q(`26{nT!=xn>>=VkSR!zBw>;FMLs6W;Qxcj!lXqqj{ID7!l)g<e~b2-
> z+><ECF3|~-Hpyo4vFN19GXOsn<p7u>q=x at 0G+?VqtK<+Vt3<#B$q at v^ncPIcO;Nl_
> zyW|w96J-PVR{+(R#7ff0jiOp4dPFW49WYrUF at -<J#80w~oF`(MJX*R9z(-AbC33P^
> zbjaj32=}64k0d()Tx!w@;1-k*Bq?N*NM-V?B%Qo0%7lM`jJ$w=o06jlP?%hoWRic1
> zHkiByaIPrVL at sF}J4E#+8<8kkG})w2GMHQf|CNyZ6)pJ|{U-o!mh430B9q at G3FISD
> zn#n^+5?Kzw$C4}nmw|XH8gj}+BiTp36zwp%4F5kwJK--o3dz$<w31 at -chP#2I!O+I
> zJ59RLw{lUwNs8n?65TRcA;~6}iKZjKoSY%rY!WE(Bwx=|16TnfCrs{0c9FM5$4y>H
> z;z6Jg1lGfT5(=b1fwL(0k(Hu6ba5&2Z2(Rt^4FU5$Rur~P_zY7enfVModB~^vJVy8
> zBpGCu$jqciGL{S!Z5q)OIG38?%xiLXnD at 5)DwUUah)-5rlctvUiVG_Gq#MfnB62G_
> zrLpCY#YGkE(!J%K;?osZrR&Oj#9Jy}NRwb!SG<;PD}N<EgY5(5TEx{!Wd~8QtD*q`
> z8gU8&ek(6R#Wrbk`6F>%MTRt|JWK2ayGi*^NVHZusQjwfq2ep)p7O87mK8Npm+~3n
> zL+77F#{Jqpe;-ZY5eRf3u1kEX;)XOC1kz{%k7xpEG=ZKs1Z2`T1ad$i76HGMmy0)5
> z{2 at JAeoefwq7wEZ@so;2(!a~MiH}rlmp%Z2KPy&(K#bTM{_OI#;(QR|mR}c-tnicW
> z(7YBO1Az<>IDxqM@@L}0il@@`<!w;pCG0)o(u!UXdW}-11%Xx&xB#F^06hTEb^z^?
> z4h1o%icet=7wc8Dt=tO9k5#lu6_7Tq;u#WNL&9#<zeHEG(Or>4cSW~&Tg6T3?sA<t
> zqvD~ou>4Q>|0+EOe|g34Abvrd1mb1om&IwaildOcO{}d*m+maj5bG+gOCOj200n-M
> z8Y6&Lu|}Fzz7SGh?U(vWFC^|19|VB}#1&U`Nq3b$ht!WC^$Xa$(dVy0s2Al;5O at Fr
> ze}KSc;IslK12|de!iUmf<)4dXX%$~cJ<1<Z!z+gA^XRX$KIacNeXdS?5`8J5D&o(?
> zebJi}vLi+%UWj%`_&OqUgLc*KgzAXXiH*_g5^5q!60b+cCDcY7OKgZvOt=;C3tj3W
> z1c~+0 at d@@3yAs=@V-tEKHo^ZuLJ$1!MW2R$QsQmYw?!yraJ-a|9&t4BX!OH`KO?Ru
> zo<V}r2=_!?v{Ax*1o%gfPpFF+n)sjS)MO2SYofO&Xd_N0{vMs0&=7Gj at m91Vp&Y=C
> z(K`T45lVpn3^X7=p*|ulu^0Z`5$W(hozMjTrs%T?nuyrM`_UP|mGuDVal+AvLy79>
> zJ4mEWToAoGAuPfR0V5Nn5e12|=qU+*h7<reIiWJ5G_g85E#WE%SE6NqM&tlkp70xh
> z>rmE46er${E=+h5aU}6|^d9(cOYDY!Q$#ZSPbT~ou_y6S^znqt5j~09qIV?}$s!sO
> z&qd!&P$SW)Xhy=7h>3||2oON>Dq8Zx>wX1rb;N!oPD<#CP$&KweJG(ZqA2kh0B=R?
> z18^dUpFl%m6WSxP5-&yPB)o=yPxOBHCqwc>3HKsW61$?0CA38B0Pv-R3+URS=&cE|
> zGZ9yj=<kGxh>XPf(FO=`NsNj<nDBFiN#f<7699Y?L{by3MdT)4joy%OG2$!;s6gNt
> z><TDQ3<cs*W<lyr=wmtZ9S6`J0NhFVBjRS__tA%;q-ElTuTnuwo_GcJ+=%SNBhk(>
> zI1EYrIXX{uGe}6!aAk^%?A;eON$)r1h_5xrN&jvt5SKUSOPibWBQ7`Zk+w9Q73-S!
> zO8;ouBfilbE4|Z{Cw|#{Sb7_FZSxW7>!w2SO>AFjQX(!%dJgty%^TsLCT at cN;ikV}
> z|6RJF>5TYjv+NJ)rKZc`1*llu<cvh)rC&G2if1>wOD{G}693#BFXcB4761Boc4X`A
> zz4I$+0%t%V2XVRL>&*)3Um(y!6F5T?=%ESZ{fodQ5NLsaZBx3qyE#L8ttn1?Pu9E(
> z6 at Q7hH=mKFHvKOCz4?Mv0Rkn>jv(M74nn|xn#POIgHS+|Tr6!KBJKR^h`1gE+CktJ
> z;vP2b6IV1Jklt-lLy?29=ZUX27l6<alu8gd2?E=JvkN$<fpY;kmD1H9CY#r6gbEY!
> zx6SI6uONASvs(H9()Kj(L&7*DJcRm#=n6I66_ at C)I3#}EoFIMPlq_y<E|XR?rNDoa
> zv>yKVo40}ZcJXZxuW8DH{Wc_5i`C8L(x**-h>M!#(!?e%6mXU<YKoJIKWlcCb~SlG
> z>ezm%9~MC3J>qj9 at Cbno&AHNNP5UAB8AyE?_Cx6NBOp|OG64imgFps=vH)}vKz{(}
> zGP<x#y0*yxc4O)MrZd#&ieWxo<oE6U8KlR~369)Sfz!xz*(Z+CrK6pGNKbPdU7GK7
> zEPdE`;+UC}Ub>f~NvWX|BYm=?eyOPwJAIlXS;}%UPUq3(;Pgw5gGx!K=jlTn9ZLr}
> zxun~|-`QzA{M}2v;BVwO5%p8jP2eYR;-^n{l$3tu#7h6taT(%Qq?b7kE=_Vuks)AH
> zX^xX=dY0oarNp>l0A`e0IuYp;9nDJ#Co<j9(YSQ5lNo?bN-Y3P5i*AVWwgM-X;Ato
> zM;G|JrjLZbmy-wlJxV>ChNTa3<dqHw at b>^(=p;!W<G7 at B1@eSDCYPEyZA?E6|8ytW
> z{&aiCgQdrvSef<!HgFn|KFLw9bd-}J7>_{9Sn1;d%yzN_uqjG*`cy||shtxyo#W_S
> z>I#2rM_2fJq#MA0qLWv;tD|@66elYH`<4!I`X)WZad_!+rzOa<ymX_Jb^1xijqp!{
> z;v-A*WsscfYyn`sbQdHxa&kzY;K(W+<7ATV<7fv!<MeR=W`VgkS~AGVF at 31xsM7IH
> z&hQ^!>H>cQNIu5NJzdYyp>&$lv~&vq3!Fx$f8zK}=?JG~>0;zr;*^v=+%csz8UFhn
> z50pAO9Zpv|TAh#?19&2s5KczvV;v1knNGIp9w1-^0 at Gk03<ah_0TSg<NNtNgW+UMg
> z0J#ESg_BMC7mhilT&Ml%+Z{*e5g^8Pw1z!0-Ocf*(gUd9<#@Q%X(DqDy at az4vNW|_
> zz2MUrqsVVUd9o<~7*^!Bp<|<##E_9oKDCdM#27 at zgieb3Pt2G|N$9kwnK6SSzYDd9
> zS`ovBeR9;&m?4qNLZ at QeE^-Fq0%KfZw~m?v|Ib5B;4g at Df}IibRphGBFQeEo+(?tq
> zW3Z=0K17}eG0BlLL-$8Ljd6^85-LlJ@{P%l)P{Z}{d%?j%Kv=Ap$V)4fo~AFICOfH
> zAZ8E<SkeSm(F81M0^j|M02c%d;6E|)lhEN&U&inv{X>nTzJT2+^!un)F$*IZq2r<k
> z#jF5<@Tj{W at K_dFhJd8V2ca%tloKfo&5F7iWAnq(P%jX$1p#*iG9wp-I!ApKV;Z>{
> ziY$lyyHKB~Z$W4&${8TA1_Z<a`T{^}0W=6e#xdz2mL2sg?3Y88QLAO<klZV3b&MgD
> zwTxPXd at _F|{4X4qhw at NCbp@C1ivNZViSmoFikuf}8}(C+bL1=pd>Z4078yl_fVnu7
> z4dULB;joW^<f}tJiPDQ15y=h}M+sw=MBae{4`VjM|728a%*e>+p=sy>TIp5aLSad$
> zD+n-T2=t6v9Ah215K^y#)GJW&U-bD>5c(FS9|)`kfiD3R4xlvvVgtwoefU$%=12|f
> zl`+R7SIwc9aI3b?tdpq+#|=5}u+^)GbI5AH!*5<KoC>RN916X{IZUg+oPY6Y;vBWo
> zIGpl&!jTnORXH5@>gK4eE;yX_>gAML{Xv&yRz41Ayk2wst(qNFUN1O1tXdJ!z}X3Z
> zg_j2YoeqhpUvJe1zambj)kTMDuWg)@RtFvG5r4~SjzgK(8qRe1+k1V^Icv4Vf$-{b
> zI{@G!uREMytbTRK@#>OsPFr1fDD~>$>;dp8uiF5o2)#nU6tqCgIb-#}VFv<sTRldA
> zh7$+>IInWf0jn1dsa|&htN>6tr`qb8L#@|#<jHrK>ea;Yv6=_}g&Yg3Y6mN?8Jv at r
> z)d23`9Jcz+;i%UG&Iu4c>?L~v#ySAM<m?0RS(Iw4D-OrJZgRF-)i`8&)gj=a!)^q`
> zS#==bS5CZDox?h>%bbG%?(k~n)L0#G$o0zL)FMx#*H4^0t3U at I_;VonAzJdQ<M#vj
> zsMVjy+sWBtb>88m*EP;5t4j`>WdJO-x&`1~Ft0>QUT{=ae>)uU(s42ou+!^L1av_1
> zYaE5ubB8Tn7dRWNZUeZ8Q;5E;@p{Cmw>s>w*(-}P+3K#tbg#AW|HNUK*LBVat4N1~
> zQ(po2R}ksqlvp)7obY<aDX=OBfi at 7h;2=8$=})4?r_h%t0ldSj6 at B~?2`>Yv4glLZ
> z`BsGv=3ZAJ<qC&FZWoBXbjXAKoK?NUC9e?FFLM~-b;ILWNEkK4t at N_nwaj>Fh2>&l
> z*W~$vo0iLkFD3^HdMsB6d%T5$XO at eEEt5k8Pc3H%pUEbN392oZ3Hv5T3VJQSMa7qb
> zmzLiPyC;jWEfC&7;4RD9u>UNmMZo#V|AoJu at Hp&SEDeRNlP3#yTKWnzC)dD!UnoPK
> z)s~Nh)sxQ&{$t4(E}Z;KaNY8vP%wFx|MOuBXFQ!YlP1s#0$qrcbxaNyXf2n5Kom`&
> zl_n5H6X^RF0bdYU1pi>+Z<D2hE0*(xHz$85xCs04$wLIKmiodiljjL`Taq9!T at VEV
> zKTocQf17ai<hdYJA*`9)E%3LD at q0Nr2n1HkgdLMZ5%`U;b8>*7-ExWW0Tg*{xf+DN
> z5WE1Pmnd(5z#|Z-0?<VOwE<{1fOc56gV^taAlMg7zAboQ{sSZr5<IZ{O85*7>O{Vq
> z$oC5MuhA6`=&takyW-X4?*-Q^Wov|ulUEDwTLuX05l~?ngn-3 at b6{RI`CBkwAiM<o
> z2}u56^2dVBmTQGOCr=gBSego at P(Wtc0{=$ADodI0Ye-$)FLl5RNc?Q_Y!LVwai0r1
> zEPob0fzqu|x)=6W=<=5!^g at Oo*Fc~R1g-$+5`Z27XeWR&(TDdfp9+IvkFdNZY^8=*
> z40FS at 6Mt-Byx!8h{Cd2``o^g?)9W`hem82`u3RtEwBImqo1@!vDe%VLwx!n(X}-9T
> z-6pxdU-QY0g0 at B14{JWXk=M4EE(_bXT|c6ceSYJ!wt(x2nxGr&+xQ6h{>BCbY}PDA
> z!2Ihf&F43Ew0#Cg>l=6fKeEm|Eav_F|Fl~orHv^f`%)*{ETP8MGLwc>C}qs3nD?NC
> zlzKOoB$T6$tl2UVStcr?8B3C3YRV8A%a9=>4ROj+-={f${I2Ww`RjG&em(E|`FK6=
> zuCA-g5nW_`m276i8C{QhIR at 0~H1!u`s)h;B|0U~cDAwJqw~~dwEQ9eenNP!U-Rk-h
> zS$M-)U2^?t*}{fPFfNk$!uStR5cE0q+ejJNa8Bn{zY`7Fy18hGX~;oCj%-asnJ%#Y
> zsLT(>qhU0?p-PunUn84 at K_>O%Wb6hv-8<-O8ccMX>MdmN8_vAm1mn<#3f-#u6Ed%c
> zLI79bVP|yfV7#E=GK`CHp4Y9cKPgLT*rrRZCwIu=&@j6`8x1+SP&BM=_(vC4e?S)1
> za23X{Wvqs3UBCKL*<TGc81zuq&`_>>Tki(_Bt(AA5c$TYD=<Ex+knAK8n);J^=D*>
> z4MjR`y$FV<b?afg2;h7?B(Pz-E};IpY+b_+-3GFLw`>C%LJ at gl!{54P^;=}i8;<CF
> zVeHr-#cr!*^BUwjBMh3-Fh=KBKSA~c`i^=tS#m>f-P8K3wLvgm4Uq5#u`a&8P!`cp
> zsapepIRIFW`a&eI5($Lh3_#LMtat(DMZt%RgTbVR8#=RkBiTkoSzRx!3kTVP`f}8j
> zy4d>XvLCp=UEf=lbnE281%JN7#az1Wu^~NkwZ%JesO!tZM2ipNMXvV>gDpOagGa~;
> zmsq?N&vkuVxY**3c!{gJaHGX%@j};cg at G2Ws5cgdShR_QT%Y0dO;SvvG0vhE7afHO
> zXozubLBlDrBkD6PwutAsUN8L1qDnl)bph&xxB-KnSgaOrbe&x&x2P6BaE&WWwP1<g
> zyFNIzv`_Pi#V)rD0P_G4ioS5yroto(9RS)50P_q0?FN8_7Ua$U51<MFZ_)5XyvFr=
> z;R=hF;zZZ?g?!W<U2_ZPS%}0lUGEo8vd9KNd7&BrO4nu3$B3V}$^pa_C%dK;wpjc=
> z7UHS`Ko<a%=zAlMaIGl}v-l*QgG3gfzR>kW;UW at 5A@~mx089WZhY=q}UND*jqiGfi
> z0P`;Vg?gJSzi>|fuZUb#ILAVZXxj at TFfb7VIk;bdRm?H0qROxej%!<Cibbb*ooiR&
> zY>OK42IyB?sGxsWNC14fYil8yWbsrSg^R(6e2(kI!s!-2#ecb07A9Nl5WhqM4Hj$A
> z5L&3R_#v)A)Eobc`obbayu`H at 0I$$jUl?xDAzp^4=OOAq)H&FB2!IyhOaXuw09L>!
> z3O-Eu`~{yWuCqyytrd6S;)_L)c;25cuSBDvC!3iwa?cI+`I=@)q>DVfbJCU)O`-_z
> zz_e+^8qq=TN10<*){Dk^e@`1m+!2lT{+Tv`P>4o)ccl#{?u&+c|1zATynCg&68A(e
> zyc^Q`6SX2^Z#DESB2(xciSN)?rIAA*u<@>eFkQ6TyE~0d922>CA5EKu0rR|5(nb+}
> zqEl$NN-P(R at Lra-pSZPqCX7cDPefz9+tV1tEzxlAw`oI(2O=7bhY^oq{0B%5eP2A_
> zmB`imWtuVc=H5 at C|1KH~{a~U^G}F75OtU9cFfN192@%^{o90cN!=OWHCy9Ddq4!2K
> z1dDcgze!6YHi%qUZ(v+4n&ka0Z7lIp<ObkLc$tfLD~unCJYhTn=Sc6)v~h$+Wa<4n
> zttX*_{&|`?^n<;tp>G#CdF#>!5FMhwyvee(7@|Qm-}~>h8N_*!HwMiiSR!}t<g`LG
> zR3LH>L*(zWro(uw_j?Sk67})^n&v`iMZ>&*r}cv2Q11^gz7Oypcu1|Nzqc}NGSMpP
> z3B4)t9{OrTt`#|Y-%RU6bct-eAHz3YG>yb==M#;hS>8u5s7Q3&Ta|W- at IgaVS{CtE
> zwAp)Z+Fx8bjN1WnOEl5 at W11Tw6HWDQ1Hdx?bfNwL33MWXdpMPdT8$k)#Jmm|=`jDC
> zXo~lNv`pe1k_=6omU0VV57XRHCl`BvN?S<qAqY#`Of>Hq=WX~qTd$l(U(`)m{z2r&
> zepVdE`XQRbep1Y1Jrd1hKRPF1HHv)LcZ!o(&qdMf#^QCXpQ2f8W$|KGy at -i=JWC}C
> zV?QolkIw}AH~RFV6{rWX{)PTy at m%P8u at 9ksgA}>3tBS2yC88L1S#cLGZn8NTv`AFV
> z{#pE<<ttjv4k&)f`XzeBUR4|!@N~1U at AK0_13(o3o}uq$@mf}g$O{0W27oF9K&Syg
> z`9A<L0Pul6nf<AF35$F!ievvMp3TzY;!rV_RVA9hzEQlAbxAZF00UVO09aW31r1f~
> zMa5A7YGrp8D_PMZj=!pSBLEfvAO(H%+3I3G>xIahU5!NQP*)bmvYr4)h4VK6WB_;r
> zA1!=t!RJ!(N|JR&^b};DSgE*(Ev{izr$-?2jjU>sKcWp~sWI>e1~%Zn4y&j(tRlv+
> ziiYAaR<~#o`)lz6)?E>w{SEpLqK(k|u|5O*O)(ST3G8On4<PdDVhT$t3SpNNTeCVv
> zBiP}^<PsJ~bQ=xrtPoK!+aFQ?{4eU+PY`iq at d^O2(3r}4DGFjYA?hkbU5|PLcCG@@
> z6P(=uxCMaMFlvU83`Qj|D#HrzikjG)P+u$RU{`q?{>s*iWfmvv*L(jc?MD*2oMb_R
> zR7hOQaS>EXi;2fMdj-kTF;VySy9wmdKE&-DnxIB%Mm)%wB&e1e6Ss1v32sVz8qT}Y
> zcA_e0ieRR6BGH=TA<#&NLT at j43w=jUALyw>7w*4ECqtJk$dnop=W at aYGAWlhfqt=+
> zOe5~*lnG{|AvEW(;Ewbpu`y?6<O>+r<ct;EllCH><;)b^k~$JMbN&)E!uWR1I2iu{
> znhL!h4{#DxNrw>{=-)|Qq3<L30sW60OTi1N2k|{;G>rY=6CpS!9Yh?<;b6{6f|=tc
> zm`h5xqT#H7kUA5~b20 at oi8GApf_kY1A<r2mP=L4|FOx}aVC*hX!}t!)YN-ivKWB(Q
> zC#4Xtat1&@l6VLG4=Ek`UV>lJ0YqDlsh|$V895UL=cNMTWzIsuG0Z8*xg=0Z(}}sz
> zlS>eJgCX+4E1F;|m)c at 5RnQ{sN62yp32sY!5bt4lQ#ugF(?D*Hmv{(TrQ-=zj*Z|I
> z^lx))p{FDAL4ppcC()8)ENGXGgK at IpF;;s%XN2H{G!k<{1YXk7#O$0a&>tk$<T#Ro
> z719c#?(kF?_X5aFL9Nt|P~=P(Jds)gU=#q1QU41Gm>_{EIL9OEq1drI2AaZX01P;S
> zM^YZKI%hDFJViX-G816#gc9{~sTCo~*^m3<#EKk;l>6RG48LQfq1Pu5ofmmIVyj?#
> z+zp~IVy7T8u87zXu|u#U_5`slB3*DG?lO at cAr@?llM>>H-GW_lc|>-^F4V6P84-I0
> zJLAgn`J~_&`p!iZqkfPmg1$5^1Nv&gUDRJiycX<_dqK2D6bf46+)?i@=!-cP5xoTB
> zxRE3=FyfTJCT;+6JYu3?THN_HTf??Tr>{R|0N4+J?P%N_S4o_T$O6DV1HgU*z&-=O
> zuKxij1VB3UR|FU1a*68^Hw1-onZz~J at 5X&6_D8%Cyox(b=psG=fP6+60ia);CmQ+)
> zEaJ`pXsDndZU`|Y;^?Z3xH14720#fKMS`@rv&5E&Y{5Y!vK#eXao34V0A=7j27n^~
> zsD#lq7#)R?4o2 at I>;X2M7>>GIoH=nY^lv0yMjVXTCfG*eMQIpVh=ExU?8Yh%8dgzg
> zSVdOcUgAW=A;I~$!^EM8vx3vmUydk)ek&mXcxBu!fL930QNM%8560CKnur5}*0?63
> zAmXE-2NLKTVF^8*=pC_NV27l||0T`OM8f2 at xMBcoM&m_dbHqV`2vP4x)Y+(KVdohD
> z%EWmB07n6E9Y*CaIs&6s7`4QW1emqJ1@#FLQw96~e0e1rop#xDwZM7GE7>~7 at 69F-
> zH8leqk2NoID5$A-e9-*KVR=okO?_*igOaR?cYNAB*P)?iqvPXdmV>%xlVfAEkHhnt
> zRKwX+v(xcqv!BC=8jfRoGuxq~CIb3shc4(f&GFFBb9{^Y_ci{|nK<mJNpUP~9_H|@
> z#>uf9{nu-{9h;i(IV^*o+5E=gMNO0Aie|5Yci`L5yvTv9uUYRXYxZ(ztXb*!yg9((
> z7L1=Z2f_FckS`jt at B*&G%bIY<4mA9#Sqgo;!z<`tHOD&KsbM?nnnPeb1x7<1N^AIz
> z*P16{j-z8}bD%?5%}?kbIc%s|?wH*C&EeUd<uIP(aIa>Aqp~@iba({fdwAKi8Uc*w
> zJ5<B?1x|HMvSVFyq{H``6^=ieg=kpp_^UY_#&e)w at 9?fh=-ASn<ZvIxdz(29muqYs
> ztD46<T*I8oW`%>irqeMDdM`v?V~Ct*e;3BenpK!P&!Memo#V4+lJD at ehIIS_!{;@t
> zVeA9)M7)IU&|b69v9?*@@B<B9&8yHb2a)p~G&Qpv+nP5ywAKW{*u>!hc6+&bi9>nK
> z5X>3vu%sr$aar?y=$joAnpZk(thwWOzr`2E>jC2BpsI;+eALWzcvutb_>6201;8d;
> z1R#NAB;bd0A)=1Jj^|@w5{!f}nCPIW8SJ>OnTIH!IX?L21+e*!a at 0@MtZ_Wuti}Bc
> z$BoTVz3P~T-=Z`;$eB8x8?u~foV-9tPl{#sO^y&wND5>2OAcEzA}NsBGnpkMCnYUp
> zx+Dh*sY!9n-pPxFR!K{keQ+^7DV%AWyi7O~pIws^(72H~7Imj268aUw{?L0R+n_#$
> zxiXn8T%5#U4o#jZEJHmb`6=e8nOVtk!sAIdnZuIr3il<&GtVSzgkusp-aW{Lt4A3C
> z*rae$(gHMw2x&=cnY{oozyQED01PkyEdC#Wp#bO!y+<-%Xp<Dfq$kG;EtA%uZX;Zm
> z#Afo6rwHAWXv|dr2v2$ffak&r=yxTng%bf(n7mH7Kj{_IA%zSVx&vS^04Af+EP0V|
> zd{QveB6&U%2}OOekdYJtpm3ZC0Pq38Y8b77kspj`Fq+QX1F(Xm at 2LL}rX|gvV~5Dy
> zljbvxknDh at MVJ?hc}sC0idD=vtYYY&RglR`g|<l>n3UvX;ozhI=J at 0kG%RPjqro^S
> z3goMWeL(J+OrSmhk<S+{N}9%WPG$&~Caq%%l2u6HDKiuL8%ZyjLy~VJ>bU=+j*URX
> zfx at u>Fh$?Aq!6Z4auAYcBk3imFJ+Rw at iIDI*gJUx0Q>+D10w=PJ}_dyXeM?T!2Bn<
> z9rX_8rDQhK at N1OhbHW<##Mx$^w51(RkEEU~N}%0Or&AS0r8IH+4r-qwk4fdbCsQkm
> ztY{_a!>Ct_oM_k6M^np+9B7jC at zhI2gZ`W(wY2Cn?MnJY>inW9wEXlj)V)OvH1wtB
> zq9G&Q3Jt?)S-9U^<OW?N^+%B-ttovj^<vRRT0I6mE;>XjO+QDS4E^Zz?bORf<+NVu
> zu9MHh_-guJ)bb*0T2Z<yRZ?U`yOchbdK$(h>F)6T14K?hLknJDM!ix*qwPh*zM`3E
> zu%c$7Av4{MdcJ53Ej at h_j5#oxO>HXbNvliu!=MzJNBU&y)S{!%U!*z}nbHQN|4qGE
> zXbNK&>WLy7T17gIS_$A2c-X}v3mA{17Q^^5&a$E*v}<I#3H5N1Ic-mRZ!}D&?L$Lm
> zkqa8Esk at 4L)6&wNsmEa4kv at g`qG$u{Lb?yN4uc-07g3KF9idHyek>wCX^6bXv~w`7
> zDC$SMmOh+%u*jBnF})|Xq-Zd0KMXGw^@s6zfK%|0G1UB`X*BXwx&?I)8gkS7p}_ at _
> z_oQYNjiMb)cc5-9a))swRgB%fNS{HiFG|KB7S+9I5^Zw&dFVy7A?Zd`o1$a1V>>3m
> z*cu?NRB4eVtulQiwXnzz0G<GFKz%F{7=i>Q;+%%08CdZ+5(AxK)EfqV)Pf?CHaNWp
> zqO7Ee_qhUW9PK#j_lo+^Zl!O*{WY3Ry78E6{)_*7hpWz?%(;0Y#X?-eVPv)i4i?|#
> zOwH5=P7&YXOxgK4kS3OMMr3vd(#0P+w9GGogTyk9d*-viN#dKR{~I`2{E|aX%lw8y
> zD~EzcEAcB_JPEWzL+{KgG-Ps;P!AKI<G5z#1TGM_aDp>aP-k*3V$fyrY|fy})q$tQ
> z?>QGT!vdYeD>yqd-z=b>y1$5?{mB5}3IGQBW at LU1bQIqPz;gqDs{!CS$@v4|{yzXM
> z0Fa}hgVQ(jX<!d=8)tB4b)XsQNtqRauHy5Yu*~MbK=CmE<ONm&K$5u*`njCTnQs9^
> za2zrh1nv;mhfL1=0RSZcy3qH4<C*y`aHjYcXCxB&OH3+3qz{}5qRBWZ0B`|-5sb`W
> zG#o~OFbWbc0hloGDC#+xet{#8HzD#Lfg{ED5bg6oPYfK4fgZU33#%AuSVfCr6&{%{
> z1D(Z>Io6rVz)|9NoPp3=h<`v|6WEUgxl!g#kbmcx;35%`kIXz8xJ>+rvmo>DKnJmy
> za~%m>6nmjzLtv>`#VJD6gZ_&;bSfgIWxfJHE&6^3&JaK0Oh?qNh<Xz09 at zP008Pc|
> z41nPP=m8%S__)A_TmYkB>~NGgf^!5He~Xhju7AF~5{>$|Op^6_oOB at ST5vYAHsqr4
> zS at 2WlKOt(NWAGK`$PfqNk+8GAheA#ZrNPITyF-eElHd!>?I8uivf$&)Eg>g_R}AMV
> zp;xe&DGCV_9t_^iOb-zWbD=*OvK{(EBvXopUBO2n_*<9;VQt6<VQFwJ^Fzo<;p5<&
> z7*Hjg9DIst95M<G4Cd&NLZN-|Am+}cH(*@E%nvy$yb*krxijRrusHYxb6ZFSjE^yo
> z!uSu+X6WbO0cS$Q!hOLa=(h>?KranB06lqtc{SvQFg^Gm=3y9j!RTX1t?+#CZDunD
> z)d#yU4~2{nx}#x8NIzjwun}`c$jKE&FwP3OB)lGcnz=8e7{HhCvXjC>7;g=!gmEFx
> z0^!BrGt9Fg*}~JoTbQSy-y6IQ`UAo&=x>A^6`mr4bC{PxN?`nvc`)Rmurc^LQyX#{
> zgQ}UPArhfS at CY=}5cx$z<QGDvFg`6jj={S^b_lNppJbj7IVQXuyc32egvVgK1>hxk
> zNP5U_;r`%KW?{${=(jVEL!T9V2>L_9jNl#2vXDF>c@)OAAy=^5hs?i2ZVDe^(3_Cq
> z!o$I%m_5-jF}N?YIHZTLe{czVGmLKlWM{}Z;fdg4=8lld!m9wt0YDk*+mOITBp|}M
> zA5rIG$6GP)5{yn^esf5furAnwc>zfd2)?plXUG;30tqgj3k!mk%<&M|2KQi|n|mf`
> z_Mh)?TTDi;JUC+cOwB at eU&Siccug3)ry_-Aq*=x`s!d?^({R|<iWMwN%{q2JMKo)I
> zW(nI|;l(o1EJdAQ8EfXSdnnf6b3A(-`bKGzP-nATpr5XYfS$BsvvILnGnH+l=*8k|
> z*0Pr?w76(wZ^xi5niuQ|3O(znCYHTlahEk#)5*TB*cj0Nb)c`Me1ieN1^|80*Gmz@
> zny6U}0B-|;jRC;h0AT(<0BZrjVNE18TsA{7i#1KNialNt&iV@%Y=sNUMl+ecT0yd+
> zG;{!1vUUJqo8lu3n%G+usQ~(y?WVZLs?_-S8!I9K;12*E`hwYg6q{HUno#xtBw~iT
> zxneb|CxDD`jst)l0H(m_FZhrHVH5?U6&e}H+F7S at QJ|<}4QQT=$Rk+;Gz$=|H>(c@
> zj>kY#+?!z)0}QKJYgmP;Vh(GJhQ%JC at Ml?RHnE38KT{J4{X!NE;8PS!0WM%qLVdo*
> z3Sg$J7)=11ujoUv+%%r-ok(E2<{273u|%5r>?4SJ!hccE?um%|DUtxN2#ry!UK%#L
> zH=?#d)F!B#V&}#H>WOm<00shJ8jL2v$PPw)7%j&Ntu$5aBGkp2*KC_VUtNhtMfySH
> z@{+oR)LX~NiP}f01LQZ!L~T~;Cb<zgP&+;KsyscRw=ONUm%M=Nsoj^_M}CIvr#+l%
> zDnCc|(C$w)mY+AACi11Ex%Ob{Z at GvZuRW4FRGtledFn{$>DmJ5^GHwJyUPzj_bAmz
> zUQ7zLUs8?a4 at oi-19);b(nRZ!nvRBp+DWNq^1ft+c26t?#(lKgQhUqAq=R-(Y7coS
> zX{^mp9R%Z^+O07D19SlTWq5!j)m*-t916Xwd?)k;sZ{8x+7qc1`4Mumb~}ul;nS8X
> zlwTpa+Aho?YsfThTIyE$I5e1~UXWiRPijY`8r{7F<9|}E<b`A}?e5gRAhyEGjO5p0
> zd^B|kjLmSG%FmJ(+KZ_Z<t5}WZ6)+ONLT2o at _(Qgr_PX9k{;TkRBIUfX+^05`EAlk
> z`zw`;IV-i!sWzm147n8z`w{s7L*$p&Im5V@{2B)5rH+;#CylgMQhUlTkYizJEU$p^
> zevqHWOOB+Dmv15MwbxUJK|fM^4f=l&`IS_<Jck^uJ(oIFz7 at ugQU_wS0&Qk$q`Ve$
> zI#M^wx0C7GL8;_u`4qBPTbg=YK9ID2e*nf}fb2=NlwT$LYWJqv%1;0w0|4hx&qo4h
> zk-$NmTM%_Nc6<~Ai(pg<gRWFNxtu(sy^JJ#lLP<V1F)l{4eCj9DY;fV4fp-X<Jz({
> z7PAb0l1frebH&z2$91Q4n?K;(HPfZEncw6n&2FW9F~1e~)J&1`+q|ArYxXcjZLZ+l
> zG5eJA-MpHkGrN=WFX}hVZl`=OmvL_6bEEl3^l4KbqyF0LHT1tZU!lKlz8m$kDF at 9P
> zIH$}`r8Joz=lG)@Z$1xm$XO||=ASs>W)Ueb%tJY=%vw?wnQ!8#Olnhq89xkqZUATi
> zzymbaaH`B&Q@#P<lL4T?0Px8GQ2jpuO#t`}y~6w_=d;<rDR<3v9KD$y_1&D^W(_I(
> z&ChZgNVCF}eE>La<_my1oOx(iYd(up51^&ypE*3U)Reb9Z*v|1Kns9-X#8O==hT_q
> zOKCS(B9XhOS97Y(ZUX2w&W`|i41jMi(!=Nxj0!moW+zhw01GvXMxDpmWTs4NLE_{C
> zGi6E_qWxqh$3PthRzYwVt56zN(PUUf73YK5hm=?5%^a;+T}qw#8|b at J9zfr1)(P-$
> zoPPl>GyjTuHX>JY&X}D^(U_m&6q<cb*<<dH1m>lzhu+)FJLQdeIFkPKCux$S>UR?n
> zD>#n<(1}L5Sxw4o^ZSUp0a4#Uy$U<O4WOGiKLFqn0RDy1R~S8p(J2 at m#|rCGV$4^e
> zzA}Yv-Z0DXC#mafVt13Sj7N^M>~DEawfk)~+&<S+V7JHWm3 at cjOS?r at B+u#HG_GB<
> z)m-~ep7C~CD}Q^9XR6%?s{nhQXOi7#E0*DWZ*|rFqi3Ss0IL=DGEdU(ffWJ$61)4*
> zKlYppeS&=*?whPOLO0c}z-qqzW=|`-Rx3CAUFgrSdT9UN^M~Ck=+}EH?OLo_?L$0c
> z2epwf)_O+Sy|bEa-|iV}r?U#O|LnQR?mLV>d9H-<AE0D3T*nIn?LJzqv3~&lJ*yb#
> z=h{7j{*kAbU7HnY-{{GQu{n&a?KWG5*k^fCFlU^-z>{kiZB+yPJG)s{3+?B7R@=2Y
> zErjm|JMx#+9Q$U^HFmE+{0lE at wOR(_6uYl5Zo&D%%Gds_=K{N1RvdeUXPDhDtJU`R
> zpnqhw0s7f?^;Ti_FFbwhx?n8!Tw#}H<zlb*bhgXFoJ`MOcHLHT`)KIn5&3UJ<iU<#
> zVBBmKin$4--5sl0_N|^FcAu=+_IF|U*=jM2lR)l=mymWctL64TJ(t-j&~V=~6#5N_
> zJjCv?)jIn-o&k2xtX9H!s$B<mo8}p9x65h*<_xkETJh~yd3Hem#NOL8$c}CG-M(v5
> zGK^;fB-ZY=)l&Ocp5$7)PAe|}tO7s)E;b<nUnG!-b2*|Wu;UaA^np<r3 at CO#tj5^S
> z at eD?k at 9jIr#{w+Hz8m#@R^j%CJyp2Z*|R+tnZKRKG5p_fM9;CQi+$p3={zr*F+b9F
> z3Xe at 2$Pcic#tWcQNIuh+%3DV3&G)u-;4x`E`O9r5@%(9H_&&BCsGIQT+m7e4XlD5A
> z#EU}XYFiuBUHJs`>u6J<-^lBU`Y787UIZ<YKgQOPH-VOg`X!zmb82nNc*|+~`3<&%
> zd5>rp_$zJq at Y-lrQM2r5k=~x9vjHFi0A6UEL+iok+PVW^v;iQ(05IAB;Qv1WjsT!S
> z--ow>HkO}kYs`zJP3EVd-jn9TkFX8rjiTA{$Js6f0FPe<fEwCn=&$f<Y4!lh=dB=V
> z$N67uUAXgUy#O!_0G4Q+$(u*B<<GYLix-YW{80C&8S&WwnvXLI080R{5k at I63Wd=)
> z7`fS=0oW1#Th!mvuJXgJ-4J;%ez+|I$&TjF!@Nk$^ToX%RuPU>kZhWxVHdu%@qE7R
> z2wn_r7(dL`mbV5CakjnCK<6ibd?U>R<fc3lbz?*xP80A)*pA|jp>g>uY!~sWk$~K`
> z1p2M~hqfbmN<_W<zo-c|5 at ynD0N{zfe*8JMuDrQOI>OeS<oV#j7dxL1A~sGw073zf
> z3?mXoOJFnxMia2ZFxzvycc{16X7D2Ze0e1r?eF;Lxc9*cueQ@!!76ojOy|9<9;)rx
> zCY^n<1ggo|H#@Vp#=h8*y{@x3YoqFDc3kJNto5pYvQs)wWhJWq&L)#P3l0CVsdGUV
> zsmjUT)|rtNq{__>?Mz3*rR-&BV5*AIke at Xh_dcC_p;KqOcNS#XseWcBb>7KxKtH8(
> zWY#9tfb1^lH7a^`YNu(|ZPkG-JQ&BRc4fzQUdW169mr1Xlx8KX^0K+`-Kg44!uSu-
> z9yEmD1r^z3=hm!HG=z0-MniG77aF`&XR~>oxmhe#7L0W;>ddz5yq+~k^)Cj=vN}{d
> zvVV0BgWfXxNoRT1bJh6lr1o+cAI^^MJfF2rwKY2)z|nYEQs)&I at 5_#YZ>oyihnJnm
> zTC2L69o%^>Yl*514QW|nXz=PhjD`!@b34nj{8T5iSHajrm61KL^L`dz^(}i4205$j
> zvsZTx&H4rXD?}b+i2O#{N*J%}EWzCT?7+^`SxKtv*&92>SqosC+$n+a-vB?JwTT2#
> zP-kY=8r7BTC1_ZtDnY|xM1DP+*?BN4P<1LhpmR5j)!72<cA#oYwnOJ#4AN)+=*-IM
> zQrST7nWa)mv!8Z4WvzO)2gVlwav(dQ^I}%K>QFY(c at _X70GvWS4+)$=0y#J{v&c|Y
> zI(EDd15d)J3<m#Z3p;ORDOEQRrE!*^>Hxs at WvxctsIxT7LNx>T=2=fwmHBJu8U98?
> zKxnUy*>PUS-TDjm8c!u8ZaoA?ja`VtZbpK`Mq`LQZkB>w#xsc=w+Vth#*>K>H#5Nj
> zV+wK5&0MgHH2#Y?;^rvGH=cyTXu%aUUUeIZh5>{W4JVC_(ZCWkp#IHmm0-8=BI2jp
> zctN*u1?pP`ju_<RwpmbOTuk(In<y|dK1f`4J0%!qJYvn?<NHSEn2j?4>;}MI^yL{(
> zAuhU^0>H at tK<+jGI2iyA{13o*09c}7hTxR(5aNv6RDr~}CvgGw2ICZBw_CK}oAGd>
> z(`_XHID|a_1{;?_pC)iJ9tNPZf=kA^#89_^tBx3Z0>B;sRP^;0{9`<n*ym<K3bGN&
> zeq0<do<<x6(Gi?i0FVKIvoN{<qf8ie!sxf#VSt?`rlL+a-bG}O9)!p}iEOuih}Mbt
> z$IS$QlZivP-;Y&f8&)yiu!=**jzpQ8m7v1dp2%_=D!2jtaW~Qv4gHBike at X+2f4eT
> z7#B)Jo^8CC_}9%^@Y6Vixa1ZoutfrnZt2ipB8Irx2#gVR$$wGvk0Rnd#v=jH3w;bC
> z&uxGp7g6s<)CW;Ngq<G&&{3Ra0LTQu8Tb^FFv at _@PZ)J$hgoh11e0+=b-N+hJ<sqr
> z8osTtwC(np%{nqEdP(`*7=G@;=)UEY7>nFJ(UIjBVjkuW<ffKb$E4&=jZP>xi6L_t
> z(Mjd~V%Fu(h>kDs9kU_V({QfMt%;5+w}{!1YZDz>-ajTN*9m%ZY|H{Q1e8xjgK4x6
> z1haE{K{z+YGk0e6pz_F=^|=wz12MoV_eS*E^30eo(6^Q!kBQCAkFG5@;zz at nEVqwI
> z&7B-AC^w3U&vlL7P~JC22;+ouI~e}~>I3})JYZ-{T<(zQAm{^g9is&#j9F-4mAl78
> z=k|~GDz}C41{iT;2IY>5wksE4(9-Dka_gA3+^aCy7xO%Kc=VI<vY7P;hQruAhL<}f
> zI;DI_Od^1Jc-i{gi7>W|Sq<Y at oa=IF(VNPL#VpBni4HCw5B=ciK<HVy=Fudtd~%Fm
> z?)d1r<<yv!FrHCv6XTG}iH<23#@Jzyb@{HCsN9O^HZ<rEIo}ZZ$d#*LoRT{lgH2<?
> zawkQvFCP_?kUKqk84Ne%j)8G+fYb4i{xPAs1EN=yPmBqMenI(Y=*^M%sF;A<o at 8`b
> z`HUE5t{sf$#zbPb4&@Fp19QVMXjRPjT-)d`<r!!wjDA|~8l%chk6u~U2gZ{DVidD6
> zcU*L0d5 at Uox$XcM1b`W+_eBCUBw&Ga0HSuniY+mZ3ZL<qFNophE{;~0k3^E>{^-cl
> zMj*3{j>1L1+zHVp<)<Jx9IYxJk+^AIh~cNy)`)<FCOdoQt8`b7G=_<DDSeDb9%HQY
> zW%}4jM;RlXE9i8O9gGpqhv*|cHZx3}FVfvSiWuXaFQLAjG0yn{eYD3me9osEqp!d7
> z9 at GmNy_^q`bX$)rX!t?r<6 at R`6P at AlhQW3|NcZ)yMBRga0fWvuPo|rC3}%!$@26k%
> z7|$?rwxQ>G<j_VrU7Imt+7SZ)0|2h*bMe^1Fmo;ez*z$T!vJvB0O0mN0OUacRG=Y)
> zZsT!=F~m8IZsJkKaKs?Khn&H1enFq*@egCZa~%M*jN<?(_UH-yRQg$uTmU)I%{_)O
> z_Bo&M9Osb<fa3tjLf>`zaF2bAq0SOI4T(%d-OWS97z3bjIE?`?0{~7Wj2vO)38VQi
> z@^>B!GG|5_>bpGX44UIPM4ri at IhP~avy9;wXo7(ga6b{Npcz(i(6EXL9v2uroyBxZ
> zkK+ug^FDeX=<S^|p})!)0B|RdO8`%&4 at Nx-iPJnjGe~de0y^8{HN)KbG5sVGxZv!L
> z26M(4=Tr16h}!hOs3(m<#3McS06>by-3%A!Li#X7%|O)SQJ;XFj|0#coIL^H34kFm
> z8VsWuFk-{U7b~PXyU{nJp5@$!&X^ZM{`n4P9Q$l}FRvWx>S5A}0U?zGxJ+qcfMw+-
> zu1GpCptABR*Yry7ImVT}xTB;!18gh%aK}pf1q`V)<+ at 3G1Prb;=1wr2Cfr7;d4OZ(
> zZ?2Jae1LQ1P;Ou78I>cUrw5FJexTG7_wHN==t3%exD%zMFkoG!5jQ{@i2*$BIjKp&
> zp~`eL91OTvX~xZ#Rs`5cC@}65U{=|iJ3{IZU{l$HJ4I?7;8ZyX#ytbfVf+VZ5cFz1
> z;IB$^Za?Wz=v}!M(2uI5LQf5Fsibh7rIQ0pV7wAOag{>uR8q<fNWmaKX<C4B<yP)#
> zG;FWD!1a)x3=mfut?_`dU8NP*RoW|{Uu9nqTj6C!+?g<@R1Sf$8BSB~XsJcOq{@k0
> zcj>Tz>CpF<x<XIo+Ce{}at3$0)FWU_r8SKG0*opJTra6p09nc9k~5_%1CCVMaEqi{
> z(Xbzp4=_YN?UFN$dvR$PJg{;!cbL>DU}|Mg?s(}~7#ee_Fdhu>ad?Sy<#=unseQoA
> z%3;ut44^@8hsdW^(z#aB(E)CiQ at Q3a4yhc7)d~W7RYr1In3G(&ndF*C(*q8mp;THN
> zFs1T1H&1HqJqX4l0Af>V$)!vC1`MdQ<+=c%4*=XycR~WAk$@x49*DXxc1*#*F)*4A
> zgOo};u8;Igz%(SeLppGo4ZtW;8`P7yp3=1emvO&adOTqA1=3=k;g3 at H>>GXRVA1kl
> z`kU-pbqDLSUctVl{>-|mf55)kq-8zS-)1Y-dX_@}hW$|egVn0P$G)SkXI1NKQ152R
> z^iSBg)xYui9s51{-s<0@{*tAEzDxZO`pxVt)KBXR*mdedEU{k0KA}!vwUT;2_G}FD
> z(zDpD>J_Xo{VVoTbr9==el?p^e++o=<(99avDpAn2Y^~M-dF!*ebUPT&|m<lGXOLg
> z0Pg$`fCd1!p>Jb%sFkdCeFyuqx|a0?^(=J>i>%X&*{9W?SOxmi065C>1HfGMMl=Ml
> zz0^7Y@!2}{5>|@-nZHc^1prS0 at SRnszr((#Ze_{!_u2JGqzd&r>Q2 at z0LgH^2Y?Cy
> z-(mCxMo-{V0H0&}1pr&gT8(;?nn|+izdu6cUs&~e8KP}q-NV4o7<d<gDy*X3unLV~
> z6?fH7SS|V&?04#?tOk86`xW%R^k1OA$@&5C at 9G+Wcd^@0--XEQ)p at KUeG^-(KETrH
> z&$E4yz-+w_^dyU^SF at L?$sp{;5cTX^i1?xUJpiiF_>Fa6|B_vUsOu1QHR^Y<a~Xhc
> z;cNlG69BZss0~Ic7>QwY0xN9Lhp=N%=j-Fxb at L2=lDdVmvHy;t?!g~f6fXtMiPVgz
> z*eO;xS!+I%lq5x+(-X~VJ6;vx6s7T{tWhL8 at int4k&1Ort2N#fp(4SF(9ANNt2CvQ
> z7{vys9F2g&RIGIh&~Tw&<m3Z=kir-GB+3HZFVn1tj^;E{<3;JA7~&+*45jo#e{an#
> z$|}V-r}xmeD_%H7Ysl9Wl_F(8ER6YzXeXY=pR!(&;w028r4WiZr+65zQN+Ob4^TWB
> zO7MaRrx;BnB>;Lq%}VHfor0kcR?K&b)vTo~QLKWo1&o}WdT2r^eHAvC<4S2&5Kb+c
> zyU>4dx~U1HJXG9s5|E$6V4Ucbs_~;lDI%S?AWp^01R4&EW1ZH)I2z|_&0NY#MYxlf
> zW*LR0SO`6j;s<@OCJ}mnr$Eg at N|<7v(<T_ZDg;hOnu(M+#Q>+im}8;%>Xf3nLurBj
> zyXG^6G$g**dM$j(C`||kCppd4uqXmWsM8t^lQJ8IgeDlq2_T<?m#lSSYJ`-H3XT&C
> zdLKmy^ofW()G0`lN|~$hb_&(Rz?kNggxwk`qMZ6^hGCAalTNdW@?P;T^o^9;ilt7q
> znoi25oAFq+KR{AQrxltY3RgioC2QsbfDZs~T*M)Pxkz9GP9dV^V#l!<I1fe(VPNBw
> zs2NGARxC!8T1wK36oAE2QcxeLSwL}CJj4APO08l^-<3XwA5yRHSzmOuV&+$MwT(>Q
> zW&KKh&*q{2gEgs8-?ve;y|%ukuCjTd|JVAay4mKI{+IP at wZcZOe`I}6U5k3Bb*)-y
> z^FaR-pI_N%(fCo_iuzOQPtfc2a_G0(h)^$7pRjqUKVp4G{nn;fABQ^2#vgO$tNm<V
> z>-p9T)$eSA^b4%tsR^64`cI_Q?H70KZ??ZN0K5c%42 at O#-_{!SLjb4 at 051&yDg%K0
> ze*oSBpbGl$Hvj6MSpQUa*}T%%SpP;{q`zYQQhm&(Q2){Ttol3v4p`3tfUll}-p6LX
> zo@@cp3Y$0jFzZ-#lWncO9RM!@(1ylaHr4v~)_2qoY}82PKI(FPxAj8+)#B6w;28iq
> zVe}hDjW9Y3qYLUFfJIvKP><HnwpKr at N966+YV}<ttFo at fyjPf4gZuj=cA+-x;;r?c
> zRn+K}*3Ifhn-BVz)=ld7HlNY(Ro#w;YU^(x at 6^|Vyu+p&^(}~8t^eEll=_*?8U0b~
> zH|o<i^N at hQIsp2O)@=228xEp={a at 6B9wOme`c?qkMBi8ID)mzv at -Cu&iKy at 4q6Ry!
> z1<*sB%>ZZwz)u);!{`}|&cLV`J8V*OY*wPaN}XWy(#P;a>a)@Re0XWxbWxJnCeE|e
> zAE<C>Ys(AKw^uxGJDm4c|5ruCkIjb{>qQkQZ9DSj>$g;_ZA;Iaqu)(dB(!DZdFyvp
> zY%rX=DmJ%e=grb5RD`w_<jvNft_ViMa{YNUNb*wjyDI|PF5|wuf(f0aURDv`_AYOn
> zKC at zA+k5ouD!#Yv%DbuW2fcM(i$1GD)ix>5_jfLgx8#NCH&>8td-8ns85L{VcIM5~
> zlY3#jBQG4re~7%$upKX0t<SCqYCDaFa}^8FkfOhchKqU0`rL}yZP)Xb!PpZ<WAyJT
> z1Z^#Oqx5?#tlBK{7VG;~e1TrAAB7(o$L0OfXO>38n5Exek=iE83({`|@P0fjvw{!b
> zxuiZ1##woD at v_*qw7eL-xMEdXQC<`p0^81^;bH{~4Wz!bBC73LUY!0QjBn+I>fcrj
> zYWpW|guVrXTJx&)hbr3I`a*Ao$PXAIC%X2*SX8kBa|86pDiYf=^91 at G73<qhz;9;-
> z7rvx7$k*W|v-JfPOWKa+@%2S$IG?uy4J<@1&`T=(+K%NV=qoG2VQi^CjNQJ?Td03u
> zVTVC3`rZ}G+WO_)hF;e;B5#d;OvS^tgZsT;OajDLzpWy&ZEK#t{zyeK05||hKz$w(
> zh;7?JVwagPKAjhg9nZzUI2c92V3a<;!n(~Rk3f_SZHKq}0&H&EA=JNAtZeJZYsLMO
> zwlR6aS84u+e}v|^{c^H!%IJ|YFB4ncM$;*>`6doJq3K{5+hp*km8SMGrb!>&TGN3t
> zu8F-a*>tkZ*Th*zE;MzL`QReebdW6A#8I~ipQB7X&^SXDgZeU4DjHmMEHoIK1fd=)
> z8)4F0H^_98Y=udpt{ru`Nxp8O=|R~;lgT=bX}WB=iAbk1og`~9Ii*`=Zg+cDkAWX}
> z27ulGutlGhF3EJ7%+JJ`)GaUo^fmx2FaS9J55NilFwwBiWSB0{bfRpd$rN3H>1fo0
> zbRMR?Wur`Dbpq2=*%$ygo9+R?VO<CGwI&C31c2U}Ow~O%EtD-a8l;N at Kqvq<pl^-|
> zX{}phIzZ-cVu478;KEs#XzBo<K{!1C&>sNfVKf>>mM}_%QIf0yU|Q2lsNc}tHnpf;
> zgvjGeEo9z^c7dri=1svo3hsws6&8k7tT3#Cq6;>4mqnO(>OxI>$<~l2bTo{V#i7B=
> zbSTKj>wG{?nv6v~7?E4(>`d3n!c8{m989Om+)VZ&fqYpF^j)U=Wnm^;5%uK%qPBEE
> z#P+%v0L(>Sys4FJnTZXe?v1FOP^Vz$g8<}!(;WboGIEW{L>P^QQGXb1f>9!N*h}`<
> zqy%-T?2Acnf5SgQbCq>vi&XgQnUYfXpgl(UwQ*D3!S+eY{6=Zr_x3d9(niL!_ubQ#
> z9~&L(-n5TXerOz6r)zgnY8waCY1&69UpLwq&UcOP>YCd}DTg$A)+ySDlFD0+9%wLC
> z-a$iSyCWLL*1dqBzHuakG0LJwtGZq7^Odg}*Vb*ufb_<_b?@3wDS6N*wr45dHeRY*
> z+&)3w1>+CxROS1|!F4~{Cnz<Ied=Df4_9`;_)R+v#(#iZp?`x1^j9`Fy4T%mC#lN2
> zjZ at L!sC<ToXYE6jU5!KQ9=FqB910`0a#y28U0VAr42rMgwog~CY}^O^RVBNzZ=HAh
> ze&s7wUl@;8erX(3_p#kw*$Ut<?Lz_F6UM`ozhV3qr?%0quBF{l`Jl01ovhs$`pI>7
> zNi;lb9F2y-%BDu+y1I6IWgCo7w|gqH8dK}K+r5=(7__zhq*C9QTelMWBt-tz5P7c`
> zzhL~a(Hw)vD(^Q^>Rz>5DBm<%*WH8R>qavej{vwW9x_y^Xq-{^t-YsG2K}9ObLdCc
> zk&S3*Y at AqkzkPu6Q6mk;G0N}QZC3j<<>tm%44R{iY^2xm+6&Q;Q8&N6k8)PynYy;0
> zt}q at 9kO|7qjV5)i?QY6{8;1a33IGP6J{$?yA%RgiXCP`1taupa*~7;e^JgjB8`qO{
> z{_VXGWm(<#w-Z1%tWJ-M{f$O-d)qT1D5;y(-donfHhhOG+VkXnktF|;yjrqZ+f{Nx
> zeovCE{ZO(?eqXZd-RqJxd6nd__TQ2%@@7ez_E*VCxk9o-`=}&SUW<BX$!@t)lBNBL
> z&#xq>(04}ODj^SRpO#!eLy1<7hOLs at xM-H2kQ~t-DfuXWEBUOAL!Bk*g+Z2bKgmfg
> zzhr>?oy1PNprk-fNIbNkE{X2lDcz!ZV*oe;fX(RJuKitdO#To6Dg(d~1Axi^u;c#$
> zkdprZ-U6Ts4c{eKv`<Q|%DW^dv^6DC)NgCAlpK*ClQe5TmVA((2f%?6a{%<wlF<7|
> zEVV5FS|K^E4J&b%H(lPXZ3n<h0JNd+mSmgueM!3ff#fI>$v}OFw!0)7K)Z3Cl9R2H
> z{Q#(dkrYM;Ve|n;pX5ORi!2$5`dIDklA{mm5qW#bQTbg&t18)sfhRC<C+;(_ilc^A
> zyfv(1r&d`~C~uUU)xIprm%o=3Lw`x$4t;e=8Ne&FwE*vs+(7*%iO7#?|3>=HBp<a$
> zOODG=OH7eKFL?kOHkS04KbP1b>XZLPU6GB5)3mJsxQV{6CEMjsC0h~o5k#Gd`cCY8
> zH-NHn76RZP0ItI527LCz=OcVRV}<#0j>Hvpa<n`_a)fR84%a=+>TS2};v0EU31=nN
> z at wxft3BM&i at tyg168@I_jQ7m<BD1f~jo+2eP1q_4jL*tnldw~=Bt9*FRl+vOviS7;
> zXu~PWKa#Ln5*DABKQG~oWNG}Vd|&8O<4-~_m2jcwBwWS)mHhC8%_NK-=C4lpD486;
> zJ-<&vGX}iQ|BxV(yofhO!w|{0_$~SO6J|()6A!>ROEN1yJ3lhvh$J|ETmIUFbV+FZ
> zQ5bKPFk$=$C<6NZctCvo=6wHzQ_vsJXG718zXAOX2`~OY{?dd?5^wkpPas8-sqr84
> z;}WzIDhBmWFqO=W at 0tGz4Y%UQ=5I(CDR~pWJ!b=q7smgSzdT`=#6Nxqfd9eEw&y3o
> zcyate7;nLumQN(?maLCIo1c(SC`p8Ve!_9+Z{#n8J~F-{KQW<9B8bm}ajj%t{D*u~
> zGGV`j9<RlqH<HHqefgggdZNJzk>?sBk4-)V<6ZfiFqjixoFA32T at n|+H9scd0u0mh
> zQ((Ld;6fy}H2zHfoP at oSr1(PUPf9jHzYvkf#Y^)SB@|0m#h2tWVQd}$H&**W!isOs
> zCwpPgjCk{W?*wB>6B at oIjFzm8cg?R)$h#2%<4Ax6$7ke|2|FY~@q6-l00;oUD%3-f
> z0D%O;aLz&0zS!|%%oD&U5eC%woP5iK at se01`5 at u%6TtvmoUjk|?);4j-z56 at 95Vl2
> zf~#a5e|M1KAE6O!irAg7(C(4tIJ(xwno(`(N^fy7Wqhz4N&hg^lF at 8AhTiEinDNfC
> z7roiVigDL+7+vQ=Wqh_Aj=C-5z2$WJM;Cj1?n{@U?}4Qe>Qfl^p?~Z$3i at ce81*#E
> z0D6bZI!2ZyX+h6)If{#8bO8oMTZ-v-U3M_yEql}BTq+qiEk*PYm!7n@{YKAt=i1)@
> z&;bCgr3GE%GJsKK=>h<n0ieSGKr;a7{s+JU0ArvZM6YvUFq$l_>D4YH7|%#th+P&l
> zIxJcAG#7KmE=wi=5*S<n2wif}P(Y7%F#}LG{f^5;#v)61&-X440GI>-3i>9}U%8kt
> z-dGN$|3D(2P}jNGFj at fg9;XZdzX9+9KF{FO4WC``$*?R3*e(V+3m5ZUPBVV=o`J|6
> z7(Xn>B3c^b6$VygU at PuFVHH0NtFSPvqSa+O<Cf)Qy251=<ENzw{T}p>EFGX9$EXMR
> z3zy*lA4qRRy#SH_a7kfowwy}Oa*1Qyv7AkhL;?cK6VU%dGFDkmqpwHQcmIoeQVSw(
> zb}<6L1T+p|Xe_7DUnA-cMEx1{R_y#efLd_g0zfwanqbrjqu(&ff>9<`_|x(R-5Yhb
> z<pFv}kl`Pp8GH0<|4A3yf|<2VUQyT7r2mB`(k|+i+S*^xloYj4{lx$MW1gT at 9p!(&
> zX-!mzn(trT6dCnJz1sg)lQ8PLn(&ty&Q<<Xnqs2b)j9s3o0w5w)dBvmp?|FQfj%he
> zKJ=YU3vj>8{~L7I)Fb_GH}!}*tQPp6Z0d*p-u~WAtD at Gc-}_gSP3=+P>S%v%lPao9
> z84F{6)JHYX|6bGjs4lh8zp;skYE#F<cuiCbjQ;@r3%xsD(4>y>f728Iy`O(G^!L at l
> z&<967P{;azZCVob0meIFl&|jL|GcSh)E>+!Y-){aRk!%hfqs?xra$?z>0y+=S}^w|
> zjDM<A{cD<{qTZ;vAWp^01pf6f)~naSI2z|_|Ei{yQ7_b9{^}-HR2}r%CO_zd{eMD#
> zPaWuA*Ay0YN4*Kgu2G-WM*hW3aZ!8KeKE%(YOOlOe_m4y^xu&<`6qGG|5^Q77)SX(
> z!r)HzT>si8LDX~g8vmP3vtda1t6=;c<ahCsuWF|Mr>2cj^=cOMK2eXL|B1+-tAqT1
> zH_eT at r4IFPf$=qU5_W48^;X at _|2XFCQ|tUcG`)|Chkj|(?Wjg|t$$L}rs#jwWE7$%
> z5%miHCr#X_U+QH42LN~nfLo}yA%Q9+(2nyHqJE7X>oM>SjOt*pN1f<@s;N5a8KUGh
> zC2i;en7%0m^@0A%Cg-TdxQ}eAje7cErMKbN`<lG#In&~<&r1F!-Xh-&eges_<c0bk
> z<uB!5=PmWg<A?A|c>ca3eh@#07vh`AkLQ>3mieCGhx4zZp3PsvFXS!u-Hp%tc(Le9
> z<?l!R0zVOYp6?Clzwid4?!kY=^Yi`4_vG*8QGHEOr}JK5&NIFzFW%RNf0w_9chlFE
> zPsZ^F^O}7RMFp>vL<X_`F#z}hU=bPveRuLV at GAgt(g5IR061v?SoS{vdjU`aeHxGJ
> zdz>%iXYdkyrTl2r2m0RT`|%(1JbaJvXYd;V at R?r+fF|EwBpPP$p7|aIku7h%?^wQ;
> zU&LMFyBPpy0FaKx%e)1?`Fsxl8qWubM4-ORcLzTdKud7O0$@G>1Tcz*5gSG`U_|E+
> z1DG9OkNR(4555n#0FiIz`|vL!*^~SQn3v#7X7a-zh`=s<46E2{SVfp`A%89ZJa3cl
> z8NM$+pO=J&mHf?UxWtbHxxn`-z_WO(P`5+mKE7JMJO3Qd)As{^J^ux-9tphQQ=#wA
> zZ{!#A?jY*;|B at y`k#LCbegKs5d`RDI{6PK%-a<s}hp5AG5r&;F0Z=H;wE$oPKnSB%
> zFq#h|PZ&|LLtp+V-dEJS`NljyZ^Q5Rt-5ybO3lFrU2#kIkBp;TRRx*d=Q66gP8axg
> z%QDt?5d{ywz1Sk}QWt#gR%NKWUKWs=?q?ZKx|9Xl?nfC7T~7*{4QE|}Rd+*%vTIDi
> z{qBy8$6f6OchK;)>q~*AyEWr8^iAFGasRfU4!WaVhYQ|yU(2}K^|&Ct`!f137Vx_3
> zG8T3%fIc82v8%pdUiX at e=U?u at _+^Ho>qWt*?gtsqyB?7Rzq_AgsJav|R%O(}_zzG$
> z8f@``&aQ at nyWQ<*Xe*GR;d7S`dR at kcu6qTKyI*BIfbn at 4Rdih|=;|)bxPm#GyMr?1
> zU4aFW(9iEmF8I;CAw$^p_{<L&zv#MCpzBs=-0f-v at Etsid|dD^j30H$VO)<>S at 5d6
> zDdT6?kAjZw?-}3FaI3ow4Z4CCX!z9CQt++&UB>IKyD-krxZhP?kkMU}QPx$8Ig*S;
> zUDXBL?m*~Sh`h=WdAI&PjMW8t%x&uWRnXG?IHRjeRq(dEE8`J~$lGAt0P;6@$>Xk$
> zf_vS!Gyd)Rj)pH8dNjO1<Xv5 at 1&!Um at Uw=dpcckQyJXmHdB)AI%LQ98sH7{n;6e9-
> z3=Z_E-5WE0cO?`=bl=@x593b&dEWK3;7fO7#?!8w1s?!#8vt6=NfmbX3JEB2-b2)P
> zu;WJ<_!>svU~r}DRzX^KN=7%L^zN4Je-5xm-PNd{FKF*B$k>GYIo$~vzdkoDGW=qZ
> z^oL<%^S{`}X%Eu8<R__-+J9(l`DJQ=Hjfr?|2mba-A`L4FQR&D%V|vcagw at Rn?v)L
> z at 1Xi<_u`^}I$yhs#*&Ni`35ZtjjOdKsBfhbXjmuT2mMo8Pt-?gyJ-<}8Fh^IDs6&%
> zBI*NZa?GjK+S8WHsniB-1?`c%KXs+noz^D5NT2ogz;tg#r2!xU0AA>uBPWkhx!OGd
> z$S?pz7yvR10RI02a1{Xip+8I8AkU;GYfsW5<+;=p)O*U`QzNv$X`|$&)N$Ic0JuY~
> z0zi#?81%NZT6r0OX3$p1ds4q>MKkBi&j4UEZ4N0fM&nW1Joy#sZ0+B)aQShnA1?gm
> zC#Y-y&Bqx9fF%If2%{7jg~DhYjNG)n05+Za7WMaXM{4-1Y(##B8m>KrXfvquFfS7G
> zd~xrGRfHQ>an-O2U->R7U%QP)#>h8Q!?aguYtRs<J%fgW)C7=kl<x)kDH at 5oF(MC_
> zKcJ4#Zl{fr-=eP2exp?*0lC%&dROX0Z8}YfsF(j2wL2RTGvy@!IE=pY)H&L%w7K$Q
> zc<3IQ59+>H`FsGewK*h>4}eerB*Tb=(GnPqfzbr)FihK*_73$H?PyxWBEv5hN%5?o
> z#5X>)%2rUe$=$JZ7Nu|5Soc|_6DhT2bKToYKT`Z}gfiHrODQpB3*DENE~fCx!rVEf
> zA(Z813)~l#awsbdXE0 at 7*&_FlQt|?YRhH@=SQ<-Vq9LI)9u3j%F=$v)CWL at X35L+I
> zbPy%7%+q~lX&|LXnFj_;rD)26-BqQJpugwdRT at OOS@yv_{8|8v7rXnEhEi6S`MHOe
> zE}$fraoiV{`oMUhyDyCY00lvxg9ngg=^~0(Su7gXQ|6)}rgRk=R=KY!4WI;;t#tQ;
> z at n{%LFZHA(mbtr6!XT5fdUtl|W6C?|Yf67pHkIk!-<Jjs*aYLyQYK|p*;03}(q#Z<
> z;$eZ5bueB~%7$?e&JfDVvL)^*rJE?JWozBZI5f;ITaSiSlu$IRE)`JX$|BvPO1)t0
> z;La+YLFrdE-~F#rcMO{B-cagId0X}v`um7{mLc+uS6MJ#O4)$HOG=X{g0evO#L|Tn
> zZdoD>Ih6G<UIcJH9uioZN(m^N<G!wRE%foE`vx?GBJ#x2Xv(s(B=_Z|Jc=)j9ZTn8
> zw=>-5m3mN&Flb6?9mTKgk^2+qJIcD<lS{u+o|bvd41)1$fP|MuP~yv$xkr at FqpShI
> z8~`jweIXK9i3CD$1|VrBR=fc7qTmx(M$SN_vngg}KixMX%IdPYL&HI~pv)Wf(UjP-
> zVeUV0f4l6fds5*NZ^JJZNzYBm&pa`?T6^1}UH-%Ik at kT@r~H%S53R!C$Ngr<@7kLV
> zE%L99-?XnCzRNotRoeRw-SRreUs^fpza4*SRSq5UZhU_0&_JT`<^Pp+reR5 at ZyQG~
> zjB28qEKP!nsKyonTcl|rXfMiaW1LDTY$XC7TFl~U-#4+O(rn+gblM|q!^!^7H0fkE
> zX--f~7~)n<fl<9@%%}I5Pq$q6d0pr4J}-}s89%7Yjf;wiXJ{y(9-(1%_+`}7Tqnb;
> zsQnQKUH0(()H2jZg_9VR;u;_Rgi=P#b-fH%P*WrRaLo at NM!kvr=)BGP=XX~Cpb7x*
> z(N|CTB1&Bk08ktNs0siS2LQeTfPDP_0PFy`gNC=^_o&Aak6aDmCDg-+2dH1B@*=8S
> z$HUX8+K5B0vj8|4p##7wDh2v+;VD!NfaZojrQ{JKTz|4ZQFQ<)2f%yu{Tlv`@<i0R
> z3d7$ZkuRu!r9MUYTof7p312)0Kn(yM!sr2vJTN*0qYPIZz*G@&s86TF5pV3Jh`cW1
> zjq5I=Esl7Hfh8FD8TVhXiZ_8(*aNHhOg)Jxc0CWTpvogEU7qlA=<mDgpuZP!2jCAW
> z3gDzaoWjLbME-`_8<FbzEBqjp5%JWO9Znzt(lrJRt0IzJFT#@$^^<?2ZskM7A1F5f
> z3efj4qTW>z{uWVJA!<MBpRw~#0P^8127m_ukKjYWrv^R;;j<qrtR!7i!sBr<)1?cq
> z8XEY;BJ;dE?W*7JU#Fd}y1=V&?`9NM`FNY$pBc at n_VW6;V;Q>~+j?(tZ)W6Ft>zta
> zZ)F^=+Qr-JUe7pDwT74KUduQYI5#ljt2Xk|+$$NIt8#dI+(#H2q0e)lg5JW*fj+Cs
> z$|KX<c?=VT748R&<5ji1PwsULTa^O?{$_No+Q4h&4n;#GZ-9FfqjA*$-u~AIVZ4>M
> z-Mx)*p=v*Gzk3biR at GXb*_{F7)w~@r{sy!g`e}H8#l4ZSzUm0{Cm3s?&v9Re{yOiR
> z`ygXa)n$^m6UH7G`P{XPn^muPA2H~5RS<8ByD_6P8oqP)W?ZZ4%<Ji1*XSCIGu^3-
> z^HrO9>)ks5oQjvNV_b%Dx;qQTn{cjY9Ie{IyY9ZgxKVYCcNO~8RVSdo&d7xRg8LTZ
> zYSl&FF?Sk#Ns71GUCsDkRVMEr_bUu?@!GjfjE+@}(GY>icLyT3{(T6>n;91|ILm#8
> zak^?9 at 1}b-<7Cx27_Mdf0^?MGAHhTRxN{g=tI~Ow-N&Fm#k&Z7CL+J-wlEG<o#CBu
> zUuEp5qLBDrMj=^M&0FVoFn-0LdUpt8XH_Wgdo&EJ>dCw1?#Sp+l at _%d#uosx- at ToY
> zTeX9i;oieI2Y at vIIDxtu2^>WNX*jnc>W$cOI_4dN(N)a<=r%L%R(0oDkz`2K-oE<*
> zmR at B-{S$+{QdQ3z3_)mBM_&G?Ez-bWyMOWO at U-FwZ(8JEDi~ziVe61 at Dd3w9*kbap
> z7sRBQY(w&|6mU)JZ3FYu3x=3>*;x73f_|n`w!Zl{QQvA4<{vE(m^R~cT0wjCwaq_>
> z`dM2`=$o6aLI1H}CF%+J#biNeQ;ltMzPTXIM8n09f-4yGOTMUpWom0XpTD=@jH#0?
> zGM`<r!<6;wVC&U81I at bw0G$Ca2z{}poi<K>J^)Sz06GT%P6hz_{RhAdfGf~%C}?Ur
> zZlmXuI|@3OZrEtJSZVsz);a%iL4s+YZEAi60Nl1~0Jvmoj)or#elhI_P|E_gDcZIx
> z|H3_?X%hgl0k95zc?APZ88%V=t%8n7q(AEYOxtaI010un2S7IfG=dKeK0NqLg-<-0
> z-wkBn+xFvPuc^PS<Mktme3PwX{$)ga(l!7CJ78cR-1o;SItEr at 4y>Y&>8LF{|6D;E
> zQ?{*BenvrS=v(A(g8q`N3BVhfZUTH;K``n at MBdT#(k9P8Q!v@&v9a^Z3vM6*@=E?7
> zG&Hs4=ASOeM%1i-qyCMLh=-UC0^k=kuC~SIpDp+iQFlhveNpd&oeKfP#~BU)9suYt
> z3WiZP7)^#z99GyVzjHwb>gIfUL1$^;kKLbrH<@$%S%(pKj|t*PS1Ernbx%NdZRZD5
> zG{FMb5dM8?{f`FETK+QXq=0no;V+ at i3AC;(ehPJ7V00beucER8=L+g4L9%Nfe;u_>
> z5brv~pGob2{svzT{V>-_==TcnU;F&=)PCqn`TeL1f|jm2{z~eRfQ|n4R4)O!!quMd
> zMT65N;4i0I2nt-LfwN$|#I=cUppFaXxJ-N_bxE+wmC0AZm~?G~@i(9h=%)+fT)F&Y
> zYL{Rp^a<1!=uh%TKtIBDm_Lg;BpBn`0ArV6h3hT9C3RK6a``cb5`1y3<u_12kZ7Ru
> zi>Zr(3RgG&%3m+S*v!{ZCj`q}yZCw#Yw)s_R6dLk@|7 at Njx&WiBUtMCg&#-d38uSl
> zLcdLr0R0Hc4E=Gwn7Sz#=Q_<-!?=%Y9lteoM=;y<h0nsAa2Jcei0UC|fc`Z_(gceG
> zkzX02fblZw8V2v>Po<6tR=Te8 at xLd6$uL|+U5D`jke|g%4)NouHG=uBeExLk<*sYc
> zn-Td{{xB+4Fx7RQKZ at E2<5K<tthTjlGoMX8#GD4cpV}bsy27FFFL>;_#D76jZ3XJe
> z3>Y5=h>1^77J=Tio4=4c41lcwIFEWJ5;%hd_TgNEsCQt;2Qlz8jBdif&!0y<5Il8V
> zL6S`b3qG0vc2KYg^+uFc(8ARh_ss<_T$ej7ojmT_KX7xu2E8$sj>@Hzr&a5sQj?C+
> zPpNiBZA{uhKcU*uV`tJD`dQV%sC`Lm>04E6qSBI%(vPS%M_H1#(GR1Zp0u5wui6#0
> z2cLJTj-&51eGTeYlFmc_OVn}bt5kPUchVoKGNaxmx#`<fHBl_oxvD0Z)11yz9gS+5
> z)RLrcQMHR2lyrg~tcr<RJ9l;CbBeXm+XDcZ09c2{jZvngBlM#HxDf!z3;^5+0Brsb
> zz%~G!g?_*4Qq;AiYxGprv8a<t`KaHGDoe_wKT<iP)+bfc?*QOK5=jR@)2Nnc=%#8O
> zwIQh`y}9aeR7{e9esR|Js0;w)0^krDb5!f2HYIJMA5&!^ku9iij at q5H6F}Q>9tXgF
> z0Nj94K8!M8R0$&w{YQW?le(eaBdSMIR*)5mXC!6O&mh?wWYT&JJcfZ=A=rXdWCd2S
> zEwGBMQTa(H=~q=}qjHlD(Ko5Gkw7jz1NzfRR{(w^>M+2~s+*|aM&wyhUy@$aFRR>9
> zbxDWm_f?IMKofc==-Vc>pkGq8M$$+BO?uHzB)leyTmyjfXv|F7NWY at mfT%MO^|q)r
> z06Kz~rQ(H0R3`zD0f1{Tx(TEGFml7F20J`NAFSe`{sX<eD)Za7*Ye=Ju+7U(54_X+
> z+3 at OEKi?Bt#H-f$7kCyFy{-=SKl5BDn&o1BRCzc>VzRoOU+?KqB&!bhFZX<3G^)C-
> zf2Aj^XiVU2U39CumEY*8DoUyz;7|7SD_RKsbPpf;o_;a(M0FJIyB3kq at jWw(MprNQ
> zxAn9s`k{I$`t?Orb!)%hvm5&D{->UnMU~Y#euKSfk+`~pU+G~Lk&@~beuJlNQG9in
> ze}$(xjNADYF#ZO#3Jo{#f~lTXMf0osp+Q)*7<#d%H}t*zBRoxulB+xWXTvxMMr}OH
> zizZeZ{OvKPS9Q8y<uMgKg5K`AUNoipvj2{!O~n)#>pb)#X*I_`-_xE1F&!^!QzVCR
> ziiZK?mN>sJno!O5PxizXO{?zXPe8+>Y9ShW7wMpvc)AxQRCn=@_cVg>bbpd(MNzlv
> zX8v%G0dute22bOnht($NcOvr8K;&_+n!uP-G!t_P&)}lr)ouI}J!HG0vDE`%7*>=B
> z<CP#EhnFOK1{BS$4)V)AebB)7&qRX`kx%sWELv7Q*gwkCu}A at 9z9$&FUE$YwmKOEE
> z9F}KK(d_Eo{x8rMS6lq?o~uQ5)s5b*g0Tc322W(sjOzCOrJj(Y5dct=o_5%ID57tJ
> z7q`PM+rYS=e<609f`Q{<lmLVF9$Ha!^(}uKqO7S7_80(`Qr#GJb<xk&bNr8S at 2<Y;
> zpY)kMY3jFs;WEZeTe5*<_iTt1a!NbL3~6X1Y+c$nrd2~*VXLQuVmdTL2!l#{#E|R;
> zk+4H)$C$wlt%Yq$o5Zwh_#PL$n3fIS3BNDxhR*|qv1shmAVj@!j1c<XrR|`X3umIf
> zyum1>l at 5(r+7K($mtH`9w{Q>U>~2UG4lcbOv%O(}a9iol7*Ru>@It9T!19InV?Q1e
> z0HBrjAY(XaY+u?bW>7;b05Adov;Y7j0MO<?0I>jwfIdpty|h_Omxj*5A*Eq4ol&1z
> zIzNWiuu{0Zw114DK at Wi8F$VyUUV04rJ;L3k{Qz`JIIwheOilx>Ps>uWI{-oe&=ZYp
> zVR&hun8=2f!eAs4hI*S)ZcJ+cwZs_<fW`pm3Zu?23WbpYM%sqW0J|AuLH%m!zL?<8
> zEf9J4nBa!?NR|;3j(I~cuPyGwu!`WoDq;hxXiJuU7c-!tk+5HBNK8mWA0ZzNJsY~C
> zAu=Wk<Xua at 2YDA^N7Sby^59Zg%!&rOaA~PDW?+LsxDN^JX)r;5BF5AZD%^>v2mc%O
> zkF61Lhf*N`I-oB)rhP+WVFZ$<A?bFgx5diImLO`4F9rZ06aZad)DcFFVYC!Rdh9Ty
> zVTbTK>X#eN2x;HGy_N at m7vJXi_sSWclY(_s;$_+r^(>uL+)I01eMDC*&eE<_^HLs-
> z<!XOZhw5zNzS`f_O?8xbi1xOcsVflwsQp#_UEsV!s=d0qVv#mh-C6fWJXrg;x+fYU
> zwXe|dRUC?jJ~|)n|53+6w at kZ3-9mRxJW+dJt<jypfFtVdx;tWvRtkNhc(?YR`hw0V
> zj#>E(#=ncZY9FZ^>ng-C+5&Z$?pN_3?F$&&#ND)a0zd<_<URFgyr7l#uDZAGZ!|d6
> z-O&)L{fvgs;vnra^<Z7SxC at L&z-W^8oVu;<lz0XPEzk`YbG1X&o1s6YU7&8Qn<L(+
> zy{~Ky<9^yF>PEWX#J#l-0Q>|GyRYWJc%Zfn#`kdERyWZ-6n{@@tJE!ZE^!AmMClx8
> z_^j at ShQ``Y>JGY(Vuto9jCYAUYtN_^x<AE<+EW;GOl;Mbs<-NfLO%nMmjohjN0!6*
> zH+2LC_t93XgLU`CZM8Oab6qVAe^rOW_(y;@!$SsZ->5t4{t%NKtqTpW#1UxdhsfJ%
> zzpDAVYB5v$PTdX0%e2MV?HTb8+7oIu2K}rZsqUhaimyYTuA3(g)2h^0bx$V at fN^7h
> z#AplE?R5{t0&S5x2mn0*z(joz5@>=1L^wMl>7H2eKwT|~7rw(w&mhvr>Ulb~xE-QA
> zqbrV!0oXuYDeAY>EZt at C9^B{XRN^+uha;y1ehjyJ at 1pI8pZ9UyuM4HV)OT|g)-|Qx
> z)H7WFt7H7nQQz2AP!~actf#yFu4_#B>$|#suWL?~)H7X=Q1{h0aTV7!qsUJv*y}o?
> zv8SsB7tiXW(9n;f(6GL41nLUc(YkQzV7<oWtXn`4sE at 1LjzODUW9qt6N%ebNuj|sN
> z`1($+MRixH>UWKtw)gbkUj+cd0T7D5VCr){&-D-hPXYkp0e~lU%}DA~ee?eSH~~<A
> zh7Wao>S_Hz*O$6()Pwo~sE?p7*N3|f*D0u~dbR630QT3f1;9><gnm at rX37nq*>zp0
> z>GhXg&p$Mw-UHwT0P4_pw~j_t)`z%$t80%$zC)dCPJOL!3Zf=BI|85s00zTo0E{>=
> zQp0GTYcjwT^~X at ZKn<&JZ~p_4zproa`W4YWsi$FJHw<in`|q%d_JLJ61FL9371wum
> z{aM$WdQl(gs;uh{eIM6*=<nAHU9ZWy!PFy=d+TCxF$|Hnr&8- at xytG^)S>z=uG4j^
> zk-&D>cr+x}Z*`T|r6cOD|3>X=iijIiH2}DSzIXM(u4i>Yh&mimGf{7Woi_ncQ=FXv
> zzyZKO_{74e1AH_tvJ5*-0@=j6Be=+MEvXCt_U*Mi_%fsY*IS}VCo6s;bG<!{yGlgl
> zYwuFy%aR6itGB?|t;D!w&%5PDbIEk_kXK{eTQZT{?Nu2wN+y$8UWM^s$<)AkpyU|2
> z-#g1VyCj+X#hYZzFIfh?*mw>4<KF2c8WxjBAvj+$8^WH((vm4;owunmv!pNi1p^vN
> zo{|T=c4Igi8hI(>zLNJO&pS`Q7RGzMtBiX}W|AAd^Nd*~<H>{GImY!cKIB~q<8MGp
> z=uhGSV~qPtmXP_--zXuVpKd$}{YfvGU|d_0M4t7MFzx`OCdRrF8R_ at ZF-SnNy~~a5
> zOCF=aZxob_CI@*djG50y!+4Q#XGtPy_AW7+0K5|~%PbiN<GIE)Fy4nVqhu19?j2>!
> zEg4JR^p1dDN8W(`WXU4vXBrQej3Bc~Z at h6kj7z-9#<wLulIy&UjD8IAdS4rNloXTg
> z(LhJ!y8 at Aq)2)WFxkQ4&i;Y)Gej+oyGUK6=Y2+ms9xRc<SOM at jJS55ZOGyg3#XHP+
> z6Z&gj3G|B)xy*RHWFdLQJK1=;WF-mXp2n@%?OU(j_@$&j2GNYH5|Rw}zC^=AGR8aJ
> zIHbfwZvUu+ at l1fsGp3acB~9K1#%(1D0MG(pGU{`Xz$7Fv3ug+VUWOgd#k_bJjlg`m
> zadSxw+21=3NxmhwR?Y+1T$0>@3unnlvc~%ef)C^n?}WwaBPW0R7p|;lVQNu_HHDUx
> zoKI#+cDcon^T9kN`yb2FoPW}1Wcw`1Ie(kSW;a-V%JG at S*<}`ePMvvP_B#uK`ta=c
> zmPI)q%_H%7dd_q76<Oj at Ps%QZ{(t6W(8uPGH*k?@Vdpr_ow7|9c}}|d5iaU-v>0Tt
> ze8?#?Kg*tHNyu4juF0;j6z7aJPdx9vw){+kDKP-x1i&ZseK8NserC}DV159=8333c
> z0I2&9fE)nH(2pT=elsu3zHO1 at l$)1i|B8znW=6Kt!pg}sPs`qIX$=5gwh;h&^F1`Y
> z&oP*%0_a7~pJsdZXp7?9d-Es&%m%<X^ci#f=E>P#E!v#dNTeS1I<qwU1AyM+d=3By
> z0Pe!)SNOcLkgS~DFxq3O1ljZKL|jZVd$V8P)FARv*{>}t5bgYIKL(a#;9K0+V->Fh
> ztB?m)@z%U3`!9<s=MVGjY?oznP6_mdmQm2BWd9EEyJiC5!*Xn>Uqj at t&Aqa-EOT;9
> zW^VSMq at _*HN+h7QyhTGn_EO8-oCS!w?BA%5e?Y`Ob36c6p>aa?7fVvkXGHBp)bCJ#
> zi=Dp*&<C7<0pJw?Zo|k1BL|F3FiOV?U6$&c8K_URJjii=`|esEtm(5NS4B3Cc|%um
> zzH(c!Z!;Tl&Tz-FbC~xz1zazC9#a}t-hDXxPo|Pn#GS-0W2!kXxIeK=nDaTs+!^dY
> zm<t2v6J{2tl$*%z$sES{%$2k2nPZ?|#r_C=6;}y;Jf|A>4(3egTCw*t=W%Xv`?DW2
> zn{e_-47kj6bDnT3*wfH3mivMIl=*<OfIFr2Ll~EF#q4tCY|aDj6m~I_;QYb;nN7jC
> zh&vR<-+-n=pMeJ~W0x{Vaq6M}hdCa4CHoEZZ at 6>W51De#-&_fdJHn?g`xaBnxybzy
> zbDDF=iQM7rDa;x)++iD;29BO<XFm=$z&MV5hdGP$CwCOP0>pRlvd7G17$>lQhw)RK
> zB}@(H8FvZ$D|0F59XAE~ah!jkf5VJ}em1+7nZkL+UCh1*;|%UFwv|ce{KgfrFJjJB
> zZaMod(?fEmpkXv3za5BN*Xj|B|74OF9MASKRh-9MExU-hfb$84e=v<Oo&oYjc!`|-
> znK^><D>s?_4*HK=68bnqu4Pv-r*eGU`D_<+D2!XN3$R)%cLF<)*%WgIu_rMloN3$_
> z(35qXm0W_YWfpVp^_&jl*#Mcse$HIUso+jy+n93!AOpaB)PF_-8YGa2a|EIugB>Se
> z;9?l1z~D#reP#>Ja;^?ZKH?O_OaWK|=Pv5!m at 7C(xNmV!akN}L^Vz7efj at R%Ox|kM
> z?(2t9#Ky9e#9QS*6I;rbCY~-|LToErGV^eGGO at laDe+4A3gUQKa-y|7f!I~1P25{f
> z5Ia%7R&F46mn}=YfzL<ErlT*8xPbb;@~O~|N!$v3LD>M*S;VU{RpRsV*2IajwuwU2
> zzbmW5oc9FTtSlk1OL--6s;oBg`|=q?&oU}8``L2shQC%M91Q at d0FZ)4W8%&7pNQ=M
> z*b at Ly1pxL00JQ%BI01n5&|fVZmzZ8ICT^AeoVdAs1nL74-<PWhM;R;eY<WwPs0F~E
> z<zE2sHgPZ-7-jDh&jF}&nLM#W`2*tMb3@`~0Av9m4~^@}RwkY)Cy5<pbC8G*b!}pP
> z`BDHGa83t+5&#kyjeyZ?7`22^8zKx~oyuRJ{y4F5`5Z$U62Dwd&LK7-+CAkfG4N*$
> z)I*@dD&_=MaU!q^ed6x&nZ*9G_{6O8xx|^W$<U7?E<?Yud_2G<i8}#)y=)ljv50(5
> zVo^Dp$S7-__*c1{cvI#_0(Arv`q=Uh#DOw5l1}(HY4Y(>M4X&>0RXGf_)EEw*jKg+
> zQL7L&fw~?$HvniU&Y1w14FEBWhQUY)qt-BLixti#T9#FyUQF~UQ+ at mPS{~ff*+~4u
> z|6~!vE-9JHI|{z6MER34Loq|vPT5!4U9nG=wvg<xV6URPEKk`{xlR!!yQz#;Zc%iR
> zT~~He?of1=Spp|dHeT6Pxl8d}wnzD$a<d{xb^!VuMJV)<$~@@TDm&o5m24+;cNFtw
> z*OU{KE(KTir*bIzhsy>idCKn;r=YheyDGZLB9sS|8`Ohjd89H*xm(dgc2Ox(ZcucR
> z9aDBzZd3dS<BrNy7=HuWj)t*#!6`*o**;|u^o?a%(B~;4ppQ^qRSc4CR)#4}Fs_5q
> z---#c!%C^L3Ui(-k0|#lPRIsB-%7Dlc3inu$yad2$KktLA&`;3D7!27DSClefR}M)
> zXJEWlF&M_(aCVX9D}PX)P%vdDl_AP=XvkDHhCV{J8v2V0j_jQBd*v-f42%~l_b6nt
> zQsqG98-)~eMk<>rgtCFk6VP8r<orP7M-~r(ad+7T%w4Nskg`ikuJW*=qwI#V84Nqi
> z&ck>I$gOzEX2o~1bY(x~8AS*hLX{U33>Zg3A1T|YWGJsI+R0L3d`Hn2yOk*qDTd0*
> zFsE8^OlDG^QZk|MsNAkRrdTZtQpRYu!}uaVHYj?^vX#A*n-pXp*;N1>1i*D%Y(oP1
> zNMIMvbVPjsJKl<cw_tP*233mwvcHs at l}8XIN7+}m0bpB|LezhjomEa$cE)|Aa<%fP
> z?uW6X1HT(?aoatkq=^rsV~H;zLHfU<`xEa%+Uo0~`x14*Y`ve19zfVbn&`hqw<r7|
> zA^I250^*;L9{LZ_eAMas`sm)o+mJ^1%psnk at kw+m)Vt~*L;onG5A-R-E!6i%&mbHj
> zv-IZZNFps{JL(sSC77d&zD&FbIiOz at 9YHJz$<hBAZ6d~pwAOy^`Qx&$be5j<1Hb`*
> zFKGM}60Cn7Ed)SR0KgFdhzbDw^B;gn01SYhK|BcQt}loVBK`{Lr at x2#t&lN#M|2{w
> zKctO*Z}da}%+aR+U|Gm&=&usGkT3vc5)~oGNd35I?vnbDW&r32045p-5x$Ui`iAHj
> z;uR8kkNQ6$H2pgO)#H2y04D(M!{{E2Uc+cFj8db|0ql at I0rjaN7X7R4y%2db{i|pZ
> zl8w^)Fz+wS`-uDZSjDTrD#*ydE<T3z)|W?jBc6tI)W3{wM--#sVRSPz#Of)K-w)w~
> zJe0VDx)qVX3eo5 at qIrZlM4_*Uo<<}ifhEy-&~MZe(Ornei2B99QLlK1g#96{05BMR
> z&Gnz6yAoa`?Lg8WNL+lx&g((+4re(4UIU;2Mt5N3gpnCWY1rY*=<|de^~up&3CFi@
> zujRp_&TXrQv`D-(QBNE-gz68<TNCdMGxT-xVq%}6M&DOHC3zz`Nxwn9jM!lquHPhI
> zL98`Q&~K5G#CF42{VqAVD)7Z-`DS99VYFT+k0%Zr#_O}?)6uX{e-;f_49n0kjL60P
> zP5CJ3LiIMek$7q7q~9rL6CU(e%KgM<1Ep^YeOrTFzg7N%=x>l3cf)v-VXA(kd<n6~
> zAk}Y|ClR|0GJU#y73NRVZzcmoW6-bzFHq{Y$!8MTXgDpGqhXo;5*jWUbo$-$@x(R5
> zWEl5 at 5m*0GK8L6=^unO_M03L=eG|DC`louXd=?RH_ at Li8WfqJ_=riR8VuN9(el>tI
> z at vxop#V{VHPlNAPoa7eya$>z<w*IJGL7X=%LPG*^8V#4^Bhau!|BHMPk#9)WXTkVa
> zL%iNDZ%L#YqV+Wx<TgCiACfl^O`vas$PWf0pS#Kg;|=opm^(~=T&^c}8s_MC$X604
> zVYo{^55{8wo`Q#rC-sNraYTk;vHm<7&Kl;UVFV(dqrV~-6UPmt{)T)Sj6?PNuv@#~
> zC%s3`!k`}d7V^nNQ^N!3UlW}SN%~&$`$SgC7#J at Bh*ZBuzJOS57^>ed*8$*X0FbE5
> zkic>zFdAnZk|w8P$Kx<C8Agj>&`W<n9!~HKa}nh;VxLM1uyMp8)IZ48gx}!AeFf3W
> zpqjmYeBj4$<csO2SJsBrvp0+G3iD!LvNwqy2~WoU#@-<ME#`deZT42tbK$kvd+f8K
> z+ro>nuh?ru4}=-9|6{L4{R$cTkewy^U3dwF3!=Z#_=bH17wNIJXm}@Fj|NJ#4)qi4
> zYEgyokJxkUbD|5vfvAUwMq`kS-B|QW7!^B_eMU4@*df-*?kv&^j}ExgVcVd4{j&oA
> z6#%%4zWc&oV(sj;05}i;s1TA at 0B|4x at ZdiH=K!!34cA5g2=~SM*m<It!i}+CQC}x)
> zh^=7PicScR$DUz308kn`5&&a`eCR_(GT{jT^%OaT-^Xg%X+s_gEdbaJfLrL>Au14_
> ziv5+nPV|CAB!#$mAk2+ at 1fqvH{|3OH0Qdx>uP`cu(HR)!up<E$9Xkj01;S>rFCq>i
> za!c$B_7+5YAhrMlUt%7G`$DYZMPL=@0;`~eS+Op*SyUz59s3vil&Bi|dbUMGz7%eb
> z{Rr|;!qp(ZD*B9zHHiF$@UPfY?7gCM!lGCQ+a(%~1V*!iV9+mi0(*~W5~6<fZ`Axp
> zi1 at bf2mp4X?`G_McDl%hs4Ecl|4^r}^M?R>gwq9pG64AC^O;SNc<Eo*>0azK3S?}N
> z3K#R(14I?$13!j)F6yRw!O#r4G+)vql_hOsWk^<~j*uo>|0ijc`j7Ocb^Ivifl<=t
> zR<)#2>P%@1t5VV|b+VLZRY at AB#!2bcIe|0CnkETOjhA|@qa{D2PLcAgBcazyNiG_O
> zq^i-7C=o%>*E$J8mQ-d<k}OOeAPu!PmLy?-(&~}~r4~uoL4PRqlQhI?ljNt$Cq%%w
> zMXF57v}z<BQsvUdR-=TTI#tSnaii36F#ZNK5&CpIV1+c;I$XkozLQl7y_%E`Lc^fc
> z1=0xX6p0{p0*rgXC|0`Ax=J!PwI2orNj9X8lCH77Lc?#;v({wE$<%6TXl^o$XGp`W
> zizUrdhf5g%4#Uertp*rRleUL(2u_-Hw&c6i<<cJ36iK(#rO*$Rbb@}6bq4gLM*5?5
> zsic4EENMF!Pe>gtoo{U>2~X`Kor^)UQ%j|7tq#c=G#o_aZ32<692W`W=2krhCrW!+
> z=SxCUS4kUL=SresNVgI&jsv&?51AtU!8%sbI at KWU20b@b5B&@zzDhd8`m>}LnW~b;
> zSjWMbC2fV>&QFy{ldPc_#FuWePLQli{R0i3C8tx3(&N_Wl6F}WVXOg&T-wB{lQ2>f
> zq%Exr03Zf{3iYW-U^Wtn$2k^JkCbw)(=cxqe3oK<Kk4_ at 5J`6GN+fw#Lbh5X2iY`9
> zTU?OVWs)VSUm^Haay*rc|4tSc_zmVWKU_8}yyXdFq`eUFO<%+4X at 7{inTo?2r4`3U
> zn<~PZrQH#UOn-&-NUIPDO<%%jX(gierl(;+sP{J&g>ljzi~8bo?=&y^-iLKWy`AYT
> z^fjcYF&f6CW#Qslm^$sYXp-qlSXA0CA}i`^(<Wn3T-f at wFQRj%abexl#)>jczOZ9y
> zi$&bs&)YUN|242z0N^$NUZAf`6l3}v76O3C0Kn}4Kx6=*<UasWX=IJ485&~KDn$_{
> zXBa>2t0>g;5*Jyb6w~c6P1-dP&vYqF0f1?y1OQAG<w3tOEl$)0KsjlCk;$|uto7a^
> z(EtFn0>EJOHBb9f)YViT7Myk$i9A8QL?kf%0iYtBUH}vT;B{COnf4M!_hEDiM!8`J
> zKz81g0)S<rt){!JS%`dq>26pPL>p=P69d0uU at 7jOU=?=*tB4A$qEy5&HH5WI`ygs%
> zx);_ptqyum*Z}AmCO5!ei-G{&FU^j6CKA6ZN;KUFBip215luAt!{(&Pk-+4z)o8eC
> ziVq7*8;_{J{2TRwKM-++s3QQFXdGlJ3u~A53{l at k)K5__#m<WW^asuc0Ne+F6GnCz
> z6~O39SR1VL9Ka5xC8NG1%#wEd+jkeaJb23})t4=+dYy8F2j$ro(RNlY4|3W1(_U3t
> zg0|V#)4Em;X}0%~h?ZX2At=ihP1{r1GAPx?qaCOW3p!-$M9Zvf7dSI2Uk2^7acQ$E
> zV}mZ*y3lS__Jcl%b{+Z?whqwu4myVW3zeOrTSR+W*(RvoMvkQ&tTY6D#eh$h=|LH`
> zBeV!KG`4M}?XSEX)W!Bg^K~%ZV;e}@TgeI9Wcz`3sFE3!Y3oMY0OKs%AQ*oG>Il6H
> z4`@c)SJ@}%7W9@%A at m(+r=UM&i=?fq>=Ja&HW<d!;WL_6U)en9Gie)%LE0dWO+<^V
> zG at -#t<5xBb8feR;9sIiqjC;~{RkDN9ZGC8IAl`+S9jt5&<F2&TFy4>zKxOM7vyDN^
> zt85x%wS_{@53)dis<J2a9NLk}(4ZXK_p}`_eqxKIy{lXiwAMD9_8D_XpY0TFd*$w+
> zNHl~Z@|}Umzhka}ae8G42KT02tqc!3XlqW(s%#r{8HSma!7%Ow at K$(97uv<j0YRH>
> zjcHcsuiHYP?}^Bp(@s=I1zoj;(auy3g7G5SHmvrYEr#~Baw+BvrFEzrOa?{Rj-g?D
> zkkH1Y4X(@y+Cg=MF$W+&&`g!Ipfp<#+SbZQ00;mOhI%(7&>9JFaSlM#{jlS%82CMm
> zLSZnHwxv=Z)X(-ElDrtSt>g!Qbq(5%`rnoGpjz8b++PhEY-`cVEFlAbqoFLSB=QOS
> zpv1B&PiG#MJJF)gTWOw at OIoyfWcts!goVsoY?kF}Es1%Ac|>lU#gMnctjSHbEJ0nG
> zYqTuPTV)=K&k1=`(U)MEjQZ@{>ClVKI_L-I at lkJU3D47*yXA&kX6CWX4^aO=<~3l@
> z7fW4UocTrWOUv}Uzs;4o(=1Q(?wF_jqQ7RmtTp`<0MGzHhem^WWbP!(G5{<N0B8aL
> zivs{F{sS-*03`I|@<x~!<&Loo%bRE>a>t?0H#2iJ7P5U_Tl2)+_LepP;O4#ufY)4r
> zhPQcN%y9sEmKSe+oqNwR=c>^>9so%I7=y;;c}valxl1fd^VCQr1@#r?;khdTWW+fY
> z01E*y3P$5#G~d!buRVO&mKuPS<vv0EnfXhun!Gs=k&n++TUH|4#kor{a3TgShad&3
> zPzP2qGq8%~=7qVFEwl3E=A_(3miWAx&`T`ip<k6d4B(^8O8_p(8;`mWk*m!;a@$xG
> zdEsVWZoH*+-UlSmV0jPyy<ERVnP*4RWZb_|Ut5WY3G-wCq at ZzhuE8=pZyBQ2AnIh)
> zmt*Hf0IkG1836MEFa}2BVYCoN;V@!hg^Mgzc~4O<w>-+zNCJPNVb$PFnZD_hHeniH
> zFh9~eh}FV3nLpGU$9m|CCHZf?ds(C3b^URIm&aP@>&5 at c+l@8H*O@=b`vYsXuP1++
> zH=3mkoZVS_d_DM6yv3~XJ{mvX+ngnaewnu^^lkYIp_ltw;-1Bt3|*vG#hT at l@CSK&
> zvx0r&&_9Z0_jTt#^`3?P3g7RIV%_tRW`5#(K8(BZ$9TK4=KK2a6TLlI$-Zd*L~lPB
> z_u`L*@i(BUXh_8iR(X4{B);a*H(?EfexbJw^lkWyynI%?FPuLL#!)aD;+3#g_{Q at E
> zm_zqv^Cx&uvz*XV-gPXaZx`R~?cK^q!Z^V at kTuW8<4e39K|ByI>&+ry9OsRJaTLxU
> zSSnu^KIsi+t at O3v>!2UuYXW^6Rs!_%y{%a~ADf@#9Sq|+{PA8ftGQ3WkMWMjoH6`j
> z?-15&-)ZPCA at V_i#8W;B;mc!@OE6gOZN$>}dh=I!d$ANgIt-&(1{hBR`CPmt-b-VR
> z^Zm#tye(Kud`<aFpie;LE4*!4(|wKjv%T$EV__WWjm2)o{NdhlEE?wY_nv2s@}1>B
> zfxf}FhM(-+!7BF+9x at fi^8u3R?L at Mc`a1Gwctxy502m2?*|?a91XM_13eIteT8tgX
> zVPF!BbTANj2e2CXHt<srWq~iYV<N!fd_z#5%F_C#^S!vg<J-Ys{-(>+z>ndWgSV!)
> zX?^dJW`3<-5?AwFGpDv*GP35ahE&zQl}@PnqFGq`Qu0&HXU*8!FOvA03XP)nqhv+R
> zdyNwHX*KUOWNn>f3O<joEl1;1jTrT1HO0_Blq5kPRcl2(L({zWl_aKSuVzebs-yz-
> zm$l0<htN1{D<o9SV$G=9c at lq3ndV;YIEmErm0Yx->hnlh0N at n>{Alz^Ce{3<nGJxH
> z0KlsNKuQ4M<9`6g0AL~X@>)ugTytL&_w9F5)Z9VcDv7LlrD;){AsJp{*3baZza|*~
> zOC-h6zpf=D!)nOInuoP7ByVfRYxHm4NfH2{1Heo)s%t+<M$~vUvuYhk<OAv-B@=7v
> z0rU=MIRIV*pa4d9VC0068AfTE27vuuBS(F*#9iZ<zY>ur)HpQrkZelLC(L_}dH>-4
> zgCvf`#kXCI!7fy_|47K1XPTw8Pb9h;yJke~V>CR{B%on_%>$4ZNR%L-T6+)mTZr5t
> z8B()fW2oIL5!AfU&}&nWz%q>;`lmHI&63(hh`Qq6s9)D3;V%*~02ZTfMvYIithPZy
> zPQpuP*S^QaKiK&@d~?*}d<Fm~0Pe%+9*kbYXfKRXu|vD&Yi$DRQ#Iwauciim47Y)~
> z!Jozb?L>8={bFI1W4m*R{qI7p!{PMXw-nxUba5_so9`JNdz=aO%))t&bmugCTH!3m
> zK4&~>KUg@&k>!jFoco<8><0=}4uzAn=M~O&Se-gFjBr at caH=o?4fE|saG&E$f-cJO
> z#5u|SuCTe|kTb^q8T~$Iv3-BxYeyvXp at k0}8P2!%u7#TFH84&uOmUc<a{GotjpLwm
> zls&6Z;n?IP<6y7?#@~qMqTw)JFwSwnN!YDuxb9qnh6Kk6G at K}$?pWiTZ9h|(4C6=`
> zwQ#(1j<tU+q+w8hdxt`!Bf|Lv`UZ#4Il(@-u-tLz%>)=PbnI~cWZzRrI8p(;0}ngo
> zl)zW%SWCh<17GZOPO<MT9Pha3l-X|;iqWvlejN=boD0z)cN}wy?H39sJ9feNX(8#T
> zcMh_zE(~^j#h_1xcE?WVQ+ovTjS>0wK;&a;*1>p>a~S5%cU*QR+7A_ub!0jx+ONVd
> z%Q+mra~$L*=Ty98wj<BE%D%Nw;<$wdOW`myEJWmE9jBa&?3WAU9p{`YU>xPxg5A~^
> z8XTXU0t})%IL>5yWT6v!%FZtw<rwI6+jrfc3u8GzG>+ZQk at nO=wPUk$IsldeARcuE
> z5}1MnR1$o#3Q_B at V<iSohLIQsG{-h)UwfazF^KZLeaoL3fGO=eQFl3q+N%p6;J(g2
> zuyAzU-mAy0&HBk3-PbhIneAcC7clw@`U(2-WBbOMC$(*!7u=FE7q_5y4X&GQ?%l3=
> S_ZER`0bkgk_KPen<NpAeq$rU9
>
> --
> 2.18.0
>


From jwboyer at kernel.org  Tue Sep  3 04:20:18 2024
From: jwboyer at kernel.org (Josh Boyer)
Date: Tue, 3 Sep 2024 07:20:18 -0400
Subject: [PATCH v1] linux-firmware: update firmware for mediatek bluetooth
 chip (MT7921)
In-Reply-To: <20240830090111.25677-1-chris.lu@mediatek.com>
References: <20240830090111.25677-1-chris.lu@mediatek.com>
Message-ID: <CA+5PVA6_ns+e+B-kMCpoZvFnoW6VxV7YDTDN2i=q_w7SVuV3sA@mail.gmail.com>

Applied and pushed out.

https://gitlab.com/kernel-firmware/linux-firmware/-/merge_requests/286

josh

On Fri, Aug 30, 2024 at 5:02?AM Chris Lu <chris.lu at mediatek.com> wrote:
>
> Update binary firmware for MT7921 BT devices.
>
> File: mediatek/BT_RAM_CODE_MT7961_1_2_hdr.bin
> Version: 20240826151221
>
> Signed-off-by: Chris Lu <chris.lu at mediatek.com>
> ---
>  WHENCE                                  |   2 +-
>  mediatek/BT_RAM_CODE_MT7961_1_2_hdr.bin | Bin 532270 -> 532526 bytes
>  2 files changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/WHENCE b/WHENCE
> index 4d9cd340..33d38f80 100644
> --- a/WHENCE
> +++ b/WHENCE
> @@ -5773,7 +5773,7 @@ Licence: Redistributable. See LICENCE.mediatek for details.
>  Driver: mt7921 - MediaTek MT7921 bluetooth chipset
>
>  File: mediatek/BT_RAM_CODE_MT7961_1_2_hdr.bin
> -Version: 20240716150858
> +Version: 20240826151221
>
>  Licence: Redistributable. See LICENCE.mediatek for details.
>
> diff --git a/mediatek/BT_RAM_CODE_MT7961_1_2_hdr.bin b/mediatek/BT_RAM_CODE_MT7961_1_2_hdr.bin
> index 797f03d6daf7ee241ea088d81e55be4af60f8d9a..05556ffce225ca218c344b40879f1aa25d3113ce 100644
> GIT binary patch
> literal 532526
> zcmdS>dwf$>_6H2_b4i-sQ)r<e*rYc=p%g@|7|Ll0;Y1Nrs8}ONxU{0;SOt~QI-ax#
> z2v|!&C>6N`#9B~0WhT~wI+G$`K~!Xj;-y+p8E_m-3)rTH=K1cEv=q>JfB(Fn&+`;k
> z&c3X at _S$Q&eOvo7HgoK_%&f7ujJbKt*s)^>$(d at Iv5KrB0sN7x{`jl>{}(Sy7-D09
> zxq|*wD&HR3EG2;8cYb}Ix_<YMB^<Fi7$R&?6H>k=_#H@;q!LmvNWb>%ecbORrttu0
> zl7{?o4u6y~7*5kC=`<wvf1~|jY#<P(#0|J!B4?WHM9wQC;=>YoVrMC-*;Ps&04#q(
> zBDV~Y$Ty#tl6JLBmgCF+wUiA0OBqRh-A;<@?L<98A_u>=6Zh+-f0)<*n<IqhE6G=d
> zm89Z at N>XR5B)dkhAqz9t5FMbVsFJwuswBlxsNdC<#ENe#!Ur#_BuAg9B!9ZMk}R55
> zN!kGt(*1w&Pb9y*57;jfZ!Q4tw#fjKNV>NJ&WI$C3b-9G9q^FIkUK?2ogy-92H*~n
> ziMSv#G4F~@Y at Enwe-)Ydw?$^aaFH3bRb+;o6PfFGij3YYGHDk at COrnwPh^Iz6`A2b
> z0#1v}h|wZ*!_y*@RUk6L9+8>!AmG0uGvgVNu|<i at e7DFH9u=9QCXspYXOVe=2iQes
> z at kEh%QWBY`HjB*D<3;A#YLO|~Co<2i0yG0Y1RN2G{H4hJB}`<Vj~AI$R*|ts1EvFB
> z0vs2aQiRJd04|DT^Lrw*`W=y}j1-x*;Nj(;039N;@rcO0azJD at F9bLM$aC|{BC`eY
> zTaoY9PLXjU4=3_>gSU@=1NcSeGnDPKOp!T01aQB|d=6QBF#+%i;F!pKy+vfs-2edI
> zxe5Tv_}fxI8DKZyZvYnnGW`vF{Ra8`23h-cfIJ1*QMZchEsV$-rU4!n*_<OHo7)d?
> z9bhP6Bp?Iu0^lXUD}XJ4HvxM9?*iTj{1fn_$WEFqvXfH*=>Vh1-tmdZ-kAoN3D^n%
> ze!&AGd*2g)X8|t)_KNK6uS9lUjmQ>#EV9qv1n4iac7!SLjmVa!0Cob9SLtUWTNVk3
> z7FqdU08a?M#J2 at -5^xIeJ>WNyT{cQ&R~!=A<>T at FT4Yy-0oDP)+sbZ{eW5)F<r77=
> z9DJ5PDzX(Q&uY-ByczJJ$ZmT`WVdGmCWvg!gCbiyLuBjhBKy}nMYbNi?T!OLZvPV?
> zv%il4fYv)2k!@TivU?T+UIx4Z*bIP-_Fe}V3P=LX0$dW=clU{`8{zJcM0VdUk=>sR
> zaER>3s{oMq{@+CQ;2M!_UIair9ESWp0*#N5$4Bo1AhVAGB6|e&d1R`{9!~(=0;m;P
> z56b9yOJqN<!uK4$?*Pt->=ztB1k4fHujT?!?z4A^Yzyl4tQ7zm|0Ia)g&Y9n;X}E6
> zWq{WJe+584d`CpKO9osJIWAJ<!g+uSK;3tW+`uCum-;#27r-TvOFIkjiClUZpb+q(
> z$PK$y<c5C%XcM^+YLUC~5s at 1y;rkQ53}BeZjoJdJ5xLPL0RrF-K!?a>W&@DV*e^xy
> zCeXQQkI0RGQ{-+QBXYM_i`*^KMebG`U=d)c$Ys4Oa at jwKT#iQMau)**ik$JN$eB)v
> z+_Z2&smSGl*Xe11r$uhYcmQb3SSWJ&?_Y*{QN{xBb^nb3 at I7l3U_HPoa<d1EoUK0q
> z?zwk~+(P&l-Y#+vofNr8){5Ms1tRz8RFQiOWqK23dF&mLD at NXLl!@Hq8%1sj=scSQ
> z_zU29z>gwVk|T1ZPXa0c8vr{1bs{G}C334k+xeTwZJQ%<ukXiq7Xb3uJ`?bY$h|58
> zkngK4BDW(KPz?A+<X)Qu*bRU at Y7ka)UgT>3CUUzVi(RKh?j0RqA^_oyk${^3RU!vn
> z<PP)$3<7}91He0gavT7U2SEP-=pL8?m<G5TU;*4Kavwro9~}_6!$<Ii+&}t2<c_f-
> z_pj#wDCfVRC&!-=xz9oG^SvV1Izr at 5qCQW4Byy*UMDD+k*MGs+e^Ec@;s65x2_ZN5
> zQNr+TyIv%Zris3%ZxOq07%BQ*@``~=tVkx7i=;F{^gZDaeI46H-=7^~An+dGpcwE|
> zoLtej2>2zpU|iTFcBwxUeW&J$zUgB{-#z~oyKWjKc8y3B$%+(_RK6kl&R2`R<@bxe
> z$Hs}imrsFCspz|eJdFQ^`x($PA&=3B{}S{|L|^AUVprHk(f9gc(f8B at g#AtI;zZF`
> ze3wXGm?(CQSuOf59s$2UAU*PZ>^{-A;gskrtOp;zAg^6;uN8f^Cq=Tn5qOV at zGpUo
> z=Qz>l_lRA?{YW=W^eui!^xX%ZzOE8|(+b6|q}^gy#4AYOU-a!6DEgM2L_P(`uM9MF
> zqHnE5^i?E at zF&()-^1W-g<9+ybwKR;>yu*FWYBww6 at BaUpgjOQTgAX{e$jXGg6Mlv
> zBa&Pd;xoiRcRS+aMPJt<kvRS)`dkl)zDNEe68i|mbs~=?qHoC>k>qSf-UA?ii%8Z+
> ziN5t#kyL>HomnEmxZ=BKAY}X!@b5!jH;7%MUCP&Y(TK9EMc+p;$TtOYu_JtlNL~d0
> zkF9}RUq>3mzgh$yW}yrQ$OH3|)n7w4p8yy6O;{)T7Pf*1tLXdc4ETb4icsE%QI~%o
> z1l+YE$?gVjmDn}73-LSPju(k^Nc63I8T{8EY&moz8|7~jyNn-;zJf;}57b#ZXsm%;
> z)<lV2*Z&IL`3(G2ioQqBiM}_ZM6&7~<arEoc7rD5S=4~A at uIID_3Zl|H2xv_mi`I6
> zI-ys!koRinD|mnGxJV`qht6&neLMaMy1#;lJH#&43giVnUj7MqX%~Inp8 at Y9&;jqG
> zvXBSz-f=(thfyZfOXpvqi_N0%w~tWHe8}({(O3Czl<7F?B1`nuE`v_a7Rj<hNHYzz
> zpMsw35Ph#zB0YhBx!Cp2Ce+!h;8!b>M-YDjdb1XF)&V+?ML_qjhwhyLKWD*T7s{)K
> zo`N6sjR>y?-!Y=E+5kQg_e3em_z2q4MbJh$7dIfDM_s%JJzR<KRie)s5WCoEB6<Es
> z$l at L7$$8Z4ZtyS)=^?wPGQsaA at H-225-yT8(7EMziGi-uDC20+_a~ICz7g^DqVJ(n
> zd=c+}?mfvse|WKLm>u$HLp?y($AHGFo6%-Bg4UBLV=2mgRP?n$j*r~}nrK^>mP2><
> z<GTcMLs_;%*Pa;+ywOTJ-*nW?rG=ue<^|Nd4E=isWkdUX0`)$BhUlBah+TsYgAeHa
> zpAF#uoalS!S=0mC@|q7s-|A0LZs_BZd!Pqst8e}+`X2Zkc~=2`2K)nna$G6`k2Aqn
> zyy(04efUvd6<*NUjkI at z7G!#_7IH+J{0(hl4f+~dH<j~ISBpg7UHR}shxlr=U6iW}
> zWjvV(o*<Vh0dY3yGwO8>(zIfp|H2gD{2+FvZ-snOrq_odf5>9-IFt?bRHR4SiV?ep
> zmO at 9+A9Nz^OPe6)V(20CVLsLjmG_FiGU(}p>F`@XPlSAyh{S;MK5ao>R97^>KOvGb
> z;4In)_#ACP0N<#`)h2xZBl^5=K^OLb*M;aiL3^1Fb at Hy*l{o@^!N=%(py$QMK&K9U
> z6Z#gz7KEd2vm+sU7U?E~547j?k<byV=)2=9q(y%^(FmSV?&(?3IkeUFA0dDALkoAH
> zJ|_V8MdSyb9*qVq)XxJy&hiqStUnVjXr(Aq7~$i!Bt|AJTO_7si=SkuatoTnO(Z<N
> zfRI|FHmtzh(dErhZ5>&`o at UPsHifyT^Mr{vSvV3fnP3_?q0LY^-BwL~G~#9uqB`vk
> zGepn$s6{8M&7Ea?{gR*5th5flXB3S`+NY{w+&a at h>MkR>#1LuKFoSq)S!C7Jrg%f_
> zv)gH$mMl9hC!0I}8Yb(&O;`a5D>v%6Gtyjh=Vu8rk#us7x%2R5zhv%w=agRp4iB8=
> zhFHt{aB~GDBEk at x*AjGxKMeP=pgVd9+}{P=F^O=u2HmkI;64I3=#a6X(?8^10(ZZV
> z+XZ)A(9J}_{a$wTT_a7}aHc at JN~)a{bd^u5of2{tK)R73_dK{`A>+9wSX8=5o_hsp
> z7-G~#dQD-1)M#%k+q-J-3$m~m<<yY9FPc7^M@&s~Ia7ZfDc76E%pI6FlSEn4?IgiM
> zh-r5vsckX|#z1XuZJ8-WOHA7=#9}AR6lR{b;O$ak$&I~`KnQP|uP5>KL}i&-O5!D=
> zuALI^BpN_?yg(vyb1fRsi!^!fCh?gh3Oq)~TSyF2#v+v#DdG^;5BU87 at ko;(Ezdhx
> zoNDQiQuC_pnkn{q1ItT+Ga$iD27*Q++=GBSINnRHOQ<A65+pJd>8>~B*kZxezu``T
> zI|=Rp+&WXv<D}dUm)?@Yu=pk;mYJfTk1~)2rpM>SPB}R*2~<<^CdLLX*iCC}1A&#A
> zw|I4j#f-94k~Gsv8%Zc8>889TBq5UwL;P at 4&U!K>Zobws-OgHac`k1Xqsg1UI$+VO
> zNZv0|fdnlX5pN?mpu9H%e`Ld)cpVv)Adn1D9GzeznF+0AOoEP#1?Ek_90$ysfq9E-
> zj%D%c?|^+Pu(N=DTYNDYk9=<jwgK1^fSnEOiNF?Ib4<lHl6RKqkRk_|xqwLt0!!j6
> zSth~8vI&_im(a at c30hVaZ)4T*7B(ziU^Omq#D)ViB2Tna>_}io0XsTD$HpK$7T8)~
> z#{s*aYfhdxHGmZT6D(|ed?uR^uVn`SYv7ceVshUdERjq|n^>NUutD(>J2=73UI)A(
> zz#AIxWUsfpjvDu}NePv#E<s}Tpp}g96w@}F7T?sMo~<DkJ;T13gOD^}q$BmPb_TBD
> z;BZ7jF?$1Yxe*+WM0rMm!whgZ8XRUS<rz~x*OIQ?l&2wXq#29+ZvusJ at kiO469{`t
> zd_8+Bc*}|}W+7E}JirgQ<UfhtDh^iBlw2|-vU#+hm>wjYx%2TbbLUf+Tx!~?ieQ3l
> zP&=b?iBVG<W$t{s(cHN-9Z+HJd?GU=Ve2SK-NfTN@=#2fv`15*m6$yaXD+^)+FWOj
> z^3Cx}En7nU6JN!<Rp_VqT*61vwkx&T^<C<&RC8z8Gw8Q?k&wUCGv>}x9k?OW){>Dt
> zM{@HCNwgA85#0Hf`HYxLW@&22nmgIY4R2Y*7jsq$;P)MZ-VY@~FUc0JikQX+I?7&X
> z%+Dn at P2=&#T$CjdJ&~qypC{*2HKmkG@*_QA)}>5X&{q)IJgz6aSp(@1NC#L2k?!H<
> zK)~rv1LZ8kqZZNhI_Y2D<ZxSFQxjJN$^@CQH?C46&n{0t(=bBHO5e>b8Y3kZjFGhO
> z?o+r32N$3=3tuTr8i5o8y(p=@wF?}p+x#c-j~FJ*SS#zL9E>0-GHdSS(hWmrtd^M;
> zz2ZxfRp!n&hAZwt)a4<5A~l&ie|^TJ(WdiS5`T~{(n_p{gX~$f at pw937^3g_cWw;P
> z%Zy=Y$y4UeS?zL;9E*`4Gn{}!ViLj=3v$B((snZ$UFDZBJ|$U+QXAj-^@iwYx4Xk-
> zjZsS$fYTb(Q>uTP>1m<Ae9*GELhB04B}*fl!z-FL)K8m74#+4Kd)RZaFUB-g;AANN
> zZ6$uM=T}<8w65(plr3+Zo=Ys at jmHc_ElDW5p8E6Qr(a0ySVr2`QP$yHSP-)SA=CvO
> zMV&8zPl>ZrY#V$bZBxniaweXXsi-c?QRN0#jxd%)b#E<a8gi_f{#~*L<r$}p!Me~G
> zJoDoS(?Fp=bo6h~7Ml8Ro~b5S;*avm=xhp&%0IeuFwWR4ncPBG3M9 at qq_|RYwfi;n
> z3x8(Nf27B+d~>zU`1X$e7>PL|<Plb(JSa5o50G_|UCs&C&1!*;`p>^Dt7RR&4T`T>
> z`F%fB$_S;55i+4;y}7etG}S8UZT~j3FGeQXSSiesB!w9XvCuJo({;_!1Ys3S6~Wx4
> z`;1y<vQ_7n1D5&iej+mx&FKg<{uD-LQb1y>46!rb_e)J0tCoqdCbE%6t%i7 at 4?OXx
> zj9NAEu(Hm9`HpNmHTO)kV2Ki58$LBz;CGB@*>cKwmM@=Mb;5I=&WbQ2N;p?`XkflB
> z);p_>CudX{$h$e5>fE_y?kIV9cJ!H44=>+<uMs?)@Jlj*4jXsxx9g-Pd#<eO5~Q&6
> zcC&BrF)3UcR$nI1o%Sk0yV&UQgkM0}H{?j+Z4A=xwCk+Z(oiq&j=Y`QPj2UoI^<GH
> z>lLLf^{S__<fVE#_0rr<5KnsJS<g^wb*27yQu4hipZeXD8k1HRMR7cZ)@tXF-=Uxl
> zQgGk%yXkeFR%>;=o{g0>?kLogwl1^gwz at I(lQ)eUua(JoEw4jdxce5w^{X3;-~M$s
> z1u6B!dxl%9i-%?0bFTD23d2b;On(V&eR+<+%F*bn1_<GNR2AtiBR7$ls><%q1wmlD
> z|E+}&A+Z86vfW#{2WmMITdubzs!t2N)F0AJb>F(2nK<eUFY8L5uv>)Tgxxn>wh5LU
> zB+DGbtlRjF#xX;-9gfOMkx5;>XK?vkYnJAM$A at pGCjRw)LT*&_hSdGO*NcV8QBfOo
> zIsGd8WzCRDAVUx<`M+j*elFMNXn0L|lQmI$47I-BKdF0#Y^z#*-oB5M8UF|C_o3&U
> zhyE_m?USQry}6U0gMR7)LNO}6vdFG$wn$<1x%GB=uDSE&kKNY^TxGbBvMD@!!gh_U
> zuNo*2DJm<@LGbOD#W*yE*)#6=?w0K6ZJoDsQ=tJ<bsn at I_t1;1OMN2ZBIg`)BJ3jX
> z9D9PlsB+$P^h?@SwhuByFI-m67-APLlhP&h{jZFcb=e8q2YF)uAU-L3{q{lby>^`(
> zjXwQ1Dct{oQZ}h-^@ToVlXIZqDJb2lVCgt7N_U=?PBKHUU$zU)_w|%dT50ZFf5bgd
> z;LA1HqqemQ{ZUdf#P49M?v-<dI6kUI!f(GiA>*FAQm5v-CwRu9WY_;e$yyZ76Hzi*
> zDVZ#pgJs+BfKs+ZkM<8S?#g~`d!qY2yWoj{JjL(AAkU*c@>EJ(Dn+2gM7BYXmeCOj
> z^%Dq4ifbNR&%&ka>SykJZasQcVOx`7)C>oDqG2t``CMQk+UcM3=a-U$SP3nB)o5eM
> zovnn+=VU_HMhj~S=JTNt>@m`i9R>5T1*PCr218yin6C|mID#Rs70lNtAyoz?&6a}s
> zgbAjRSS92ogs`CyjPanm86kWqM5BbPMTjO8qIE|CXAMHMGz9KVp%|T;L#QsFa|iR@
> zUNBz>apMezyj(C}r-ab*@3iN0lG`1IU&+m5^|zo!M<pT+li8MJMNX-Hr$6Vk3Vq^9
> zY2R6`Ojm57HD>e|CLP>*a#VUq+F|ZEzlM&o&pn+TZCxr<raJj}iSM^WQo9)Ep{X31
> zke@=r_Ng7GisqBBiZkWSG&Qd$xeca}Yf|m*qQz3!7MEkn&W|iJh{m!wu%vcnLzCl2
> zdCnKyuAQFljfs`)bo8sT)4B3!SXNFIo0T&lqGFrJXP7;6<7b>R!ox~Q8xuEbKjUiQ
> zE^DQu)N}LvP0i0*6PckHRaxg0QznswF{|d~YLA3>&#9f_oMIeD2tsl(aw;L^LtMIC
> z$obGEneoiQSd>IlTCnPIrCyo3A=Q<7W$K1hEcA3e>Cw+7ay_Ym`+rKE+M61E6t4^A
> zJ^cTedU$W@?K0UHZW`te<KsvaW@=14zH~k;6O0ZLW{@g=8%Z$5dIJ^`8xT~OBWS~k
> z>1o1u$Cj<&|1L$vGbF)CbfmH3A5nqj2O|v=EdP`lIXzhSOngg<|D?IY*U9&nw3fw^
> zkgs(T%Tc0gv)flJ(;?<Rr=rjFcTKs-<m+|hnA#FAG5M8Jpxth*X4_pO%bRG5HoNDi
> z(+AIT6$d=r^!Y?}dfyq&SV_)d?xs?#9j}rEtZSpKmFMW({fn!(7>-#i9cv}N|K-wj
> z$6&6fiRTc4`CFNNuV9P{1iA<05<%1GmN|3Br8f){7OpmGBXD>?R<)$GGr9T_4Z<qg
> z?KG5zVWzIL%(r3wX9O*cPD!^qlup-^4z0l5n@&g5DR|Fbi^pQ_y|4n*b?r)?rsv(U
> z&T&|m225H_ad&oiZ0$JbxFW&@Fn=ho9cPGs at JmXiD%(92sWN+V3{lA}(({DocXduO
> zW=s(}lqcL{P~3_2_LdYcvv#Q0ZY6vo#ji&xBWr^tH!)r!=ye)F7oI?AQwap)Jkic^
> zfrDuG?!bpTFZA-}1aFG;B1sQVvZ_c=5|NHT9$HF;YKLDB{T=PnnNnhpR++o+Z9v<g
> zE4I*=4}G-_(DR;^B2TSLaqu%P9cH;qgAVJy8*{bqY4*Iaho;u<arR(it}z07!eFL;
> zT`nmJZ+xZkMtn7mZ#3#4Lv5qexx^IP9ZNO5JI0tmh$7=BOgIk%*H}5$+~KcrK4F4(
> z1aWG|QmN-_vE+$@?l91uIFyXtyJl}1mFV8rP#ZD9m`2(g+8Wn2#$)A|1b2Mnx)3)B
> z3ODN;2Ps^<41TqIF_EznG+Kz3&^0l5pCI$dzX;sNfr7SiP2&(H-KNIt;J2YP^qYk5
> z^`Ij)Zoy2T!#_<atETalu0;5zG{z};tWn|w8n+N}y>fs&iXjgrb_ at -rK69XR9Lj*T
> zxs;qwu&mbvU74hrGY2mHVh;Se!jyVvz3D+WXVS#OdY~C)N~|Zwn at MEZ^1W*t*S))8
> z&nu0a_H1u_b<fVmU3=;qcklV<-hEgv at QwT5{m>as*G#qHbRBm8My%xDmkC at LdEFVP
> z&DbLCR#Kp~lRc~V#+s7C0v7G+K=;gC?Khe|tM|m9jx+aE(63$EQ{fx~8APFseC-%o
> zH&xjft3Q-gRL8JhES3bcxR5Vm0reSXKlqJ_q^DU(L{E!bcw&%g*d?1q&sI{MH>H`r
> z3Z{=(VA03k9}H97qqLThur^)ii7}0s*ayE)+<>5V8wt;2)x*&h&-(3{MX51U=BoJS
> zp7t1OuL?K1^tAJgDM^BsQEOHN>AwCe-lQEuJe)~87`o`SQ>se-neEKAZQ4XyN%snh
> zqx4ToKLelAgUKq|zLk8m>1kfZqFqJSUjHR;)XE=tIHR^~kU+}z2Xml(TRYRI*I3fi
> zf{XOmE7DTvFS(3CW?jZ0v1r{fK`tn-WES!b)(J=cMZ-<0^I8#ZguN+0M5Dr_Q^Lfa
> zFq193+cKXxD85n486{H>CVWdS`%EK=1GL6j^wF(77^c**kE55Vx9EBOWga8>%RDl@
> zrHJGyMi<&xmn$f%%XkI)-^FuYjaPIHo>Iz at Zyo^`jTU{>ksi+A*HAm~Wv)2GWv*fa
> zklb9FmdckyzuZ&DT<=Iyq*t)!^<wp at Wp2?Q(puDqmgOp}5G`6)oCSIhixb-4bffMA
> zi_()GvuGL7HJ66xj at cAx&1CqBoWq^K5sI{B-aYO;)Y7Kgvu|&%De2SRcG{}hvv1FI
> z%ps@^h}m<@m5i^ZA$iYq^w`=x$AUW1d>!ag`(Iks05=_3pskljj9k4C8gD6gk<=O$
> zg*n4_=$ANWG<F#@wb-8^DmtTiFEnB}$mJ0Pcv|O2Qcms|SEMm1De#fn`9b#s1zI;O
> z20>RVsh#BP4?I;a$%<?ab4H>kiJ?7-N8RgI*G3{2t&<Dl4X1b!MOdg7pqB<-$gL)|
> z5xtuJZm29Ft at AR*(HLKr7wC(x(!C&FgfrMeL()iYWAaHR_N3|l%;k~iEG(8wG#-xj
> z&|W*N2olD@$TsFOMlgnI2U at W+*ox&y$ZYcO^FuL}v0P~fJ-qa22p!FOFerz;`l#u_
> zDAHplq9?sroaQnXKk|>T_>q^fxX}E-^q4!gow3Y^lp1pNQ+wxGT%Xp$r}j|ni$isT
> zPYv=Whw}6?rjZ!0(OSBf2TLF;c|yK?P;(^>G}l;fhc;^V?58CUVze{s)~?O%n})_g
> znwTL`uG<(|$7?4D+6$U|9g*7XrdtV}i*Sc6ydGnv9`!c$bne;y*5T|}r))}c#|FnP
> zlTOvzeQ&MNX+*mTpf$|#=mgz`@E#27a6ZN<chAJ!`AWR4o~U3rQ+!4G#9CuW2WBWO
> zqTCdVyy!e;fRfk1+9+pKXs$TNGm(!2ciMWgcI4?~aF at s?U&&pVa0T at zJ=!bdnanHV
> z<9l<DzczQ!>YMwMwREP$mDw8wv at N004PQL3lZKf{6zLuqPo!bg9tmw$+Oy%V8I!O|
> zvUH6!jV45Xs3p}H8#tP++PcEO4Ys>N*oAG1U3j&*^UYf at W0=8fId!={9=|~!_9Le?
> zsU)?WV(xSvMOdHx&C9k`wDq8EbzmRcD(VszRUIs<$*`n`Hzd>Vk<hmp-;fQu<F^GE
> z(Wjv#id9#(yXFeXBudab`h_gJKE;j<t2wko=~HvHM>Ttn?U|mdJs$dEHghcFW>}T8
> zU{yx1o2xy65bC1#`&{i0 at F{Vnid9+DYgG<Y?5$z29e4aTz%cY#zDZ+XkN?oj8`!Qz
> zZni}aTZRx^jWb#1&a7g{z$Uv*POQmaQ!TMnl6971c1TvjV76g|Yf1=nX?YWHt=5IQ
> zi=mKe_^12bew&iM)l`r4Z_7H1lejFEY*tpn7PjFAmpO!eqWmQ0gEpkevM#;#JfA{d
> zu=Hm~hGP8)ABnIRd;EwShp=RSD|n5QY|w}i!8lfD(ZXubnH3M7E0O2AvK^+U-Po4f
> z$c8XP$1qop!Y^xGIOrnf597$&m|ca1FpABcw_XUj*TH?RuMD_FmP#heQp{MclmUB!
> z(!BMAbzw|M1}yl#^(bUOg0wgR{$|*VUI*L_SR4v3K=^xpsmgdrh4rS|_#)QQf-DGH
> zAw0L(7D;!TveS((ZfL{`H_Sa5TA`wvE-Y@<$PZep8J#@RsPhtNett_TcvZu$pGxid
> zt>M&;ANaK4d)FjWk~h?!AZ(IJ%h<4HO7UDDY%8?Y^rjv1e at jbwpuEh4<%y<OcuDF?
> zHR)nWFRjGOv;^BLe8UHS#EIYCHQa<!gi`9bA+F>i%;RZ05^OK?4g08H3Q#}#zyS@(
> zem5b0onW(t=k||^Y<ggAcvaHr at H1AE7d!qPu#|>LMDQBO9mGJkSgkP;5%^E!ld$)<
> z_Q+69HR_0$N=|;TmuFos&y#Zd^N~Va7~LPaQi71K8 at nMN(s_?k8(lgo0~4tAQqpmW
> z=mX~Sk^iF{49elezfd`}kxh5z&ex#MwUN?kH)=CPUFp$+QtsumPd)u_+4fQy9^}zW
> z`tS%j&s;1qy*w6g<{M63BWtH2x}*SmG$-)A58p5GrIIF)G&vQEkgv|(2!B~YM}_-T
> z?3pyIbGbtrm(Gy%?ALVV=^~zi(C|T<a$Wi at rLJ57@)NYHl+`T7L3mCD>(U8~pb>~V
> zf$l_r>Nj*B$Z%I)i_G>|ht!&ko1b^Iq=JL|h9vyX at Y=KQl3a#I^IFQ}cawuQB=zw3
> zux=@tE~mrlm~M#9I|eJ{&}Z~=cnkIf^S*7-(fuMCVtDkyZ-ApWjGFn0A$s~7>(&Ty
> z<kl+lmcvzFZXPVO#dVyDJ<A)$zqQ4~SLh9c-`Zk`p84 at 9w_)sCTh2yElVlz2Mj3{r
> znaz?KmI=vlmt~}+HVmD42o#%JQvFi4%4?&$N7&^Y&f8c4JSPQK9DL}ia!r+rT2iaV
> zxg!h{t|+gqB_*FD>^0$wlyLr<@De3lb4~a<C0u(=_?t?&?wasMC0w{BytyT1!#@sQ
> z&E+?=?0%-rZWx;PMMF|hqSG^7No`C^a*wQKzC~~D at J3}n`iqU?!9KB)Vj_%fT!r*G
> zrbI&Qf+bV7xVVN07e{N=_5C!SU<Ut-*K4Qs8LDBgCjw!o`-X*Sr3WuCE$ODEgqY at G
> z4q(HMdxB-LY^i==-5oB*vPNREROu0}Fqhph8&XaOWlayouuPA-*KKS`lOD2G>wfe%
> zQJ#2Wr#2ak`}TO82ndA)X96??y8>!jZ;~#^U04BD9ao0PbgtRAX2T%)t3pmFQlxsR
> z%Z`?`kW3)34|2&xDT%iX`=GZ&n`CIvz1f?+vQ@)J!?qe<pmh)nFTo}<+67x^v`1^z
> zg!RN|Lou%-Cd|W8TWQA4PWPtrO)=K2`grWs#utonB;L-rv4 at 1ySn!iEjv;kNC}pB`
> z48^H{Adc=ToYY>Nw7R?yAHzWdbOc=}^~gHo=4Fz)eiB;4D|BaT^s#nM)>V&fE9=Uv
> z6VOgx*<^=3IxLhPb&x#)w*ENT>C!8^f^o1_D|-T(tlJrZY?`ca8RX5N)spZ~P7~mc
> zuoRO>DU9ZpU$5l$ikFk!zm_?A=nIrTNr&H5N|op}#yUCVnq0SX^Fbwb^3Dg8)Fo})
> zuVvM at g?JOMD%(_)?EuBciiwu2 at Ct0pH96(?=5$YQPNPchQ_ at bkB5lDnX=nAOo!uv`
> zRY^Odox|CPd#lI)S_VnpZx~flkRL~4F;~AQ#JQ~xy<q(=sM{Z^>B720Ay?7n57(`!
> zJ4{QoHjh%y at OxoJQuJ%#uVs{mBdkx|F6t at 2Vbp_B3jPmQl%klX=!3r`h!5<@`bi4@
> zk#;KI at u57H(w%IJjqYe0b at h|bi=re7UL$Hz=TNtmg)rsc!OR1{kfNiBo<$J)r!sA2
> zIEjdU>X{+g(Oy~3MT^vUc#JkX<?ya#?74sE-{)7gIp`?hU5Qm1Muw7mtr`{G4Vdi>
> z$6n at SL$u9Oj*-Y_F+ at Kz6k`bbBZ_729J|-M(lGR%6B%juE|8<TWy_f7&s0ox%yr~s
> zB-}d-r&c~+H`SsIw7$%gXF3>HO2b6weQkDEa$Bi0udU3L+9o^awk>n%+Lk*R?~2R)
> znx^u6xZy6F<)Vg;TNrJTBl^?ceoym_VS?>$!(AAUXO~!85Z*H~YW$vCuiz+8;V8$k
> z?MjZSn<z)lhZ-h=8#}lub)~eGfjb%8ECV;oX`Ywqh7UoGmJ1r!YkhMIx6!@}{nfJI
> zI4Wx(zbpE;aHYp9nfAe8lw+1M+NGmLdi&dOrzZ-v^GWvXwyd6hH{6*uww!HAHFx~%
> zGsKoy3=>N7Hhy53SaLUJ13!Sy9F+V4`3;A(wlpwO>BD==AHKgO?J5rZv_Bm`ah>58
> z|M<rm-}|N0Qu%z~-^n<+m1CcGR#l-s%}#44KhizM$0lc}#P^$TfF*qd^3iR|F(j4f
> zvLE%zuoN1y`V-7MUa2q&WC1-9BIHy)T~(c(_DV(eP_HE6oXe>2%c+neo2D=xC2zt`
> zdX%{8KeikUc(ecOm31nKz|LHZ+S8qS6S+TPC25hHMxeAhg1D@(c#ZUt=YF^uOCf+f
> zfAn<3nP^EZxpi7>-!M&KHG<@ZZXG>+!`WYTlL)a24-I~xojiOd+A7S?vI-0OTg9~7
> zgEX_I#A`g`tiqGwR$*zJRa`vUl~TUIgYm^HQ{G*ZEW0J%+&OZmCz85clX_yX<J~#(
> zH|Y^i0xcPK+~Tr^5e?m8FVSgq5_9;XN8{o)Jw)Y1xh`K|`8#27hoX{7(jA_!A_3$e
> z8<IP*_Nkut at 8mNhLg$3A;}>j|=(lvzl$I3F5VUn2PHWYoHU7)Np3<G|ucVEB=D69X
> z`77lBF~=R4Q9g4VE7w{F_;|LKo*XLC(f!yzZTwk-I+lOdVl<wc{r*os*mW{CTkN?F
> zNnX2ABKHe#@35UZeC9Uc$wcOX^Y$fYZ<f+cnLJLBEr$h(S<>|$Rs*w<(=4q$5P+ug
> z4HG>o9`&$M(~vYiRwCmWN%z-T+rz!~-OQ$;<8!rSyr9*UKcdwKx~JL#KS2AwHes$%
> zK-2_w(E#mpJRkZ`O1otBgy_7M%2Pe_gNP_;x%6O5X7<pZelY2fLa%0EcW_SDg3rnw
> zw%;~E(`J96hkRzm#XTQb_ftcXRa+m%WAxtmxC6b(c$_sGkFhb1A^i57HhX>3rhCSZ
> zDJSDI%XQ`3v^gZa{7z4+d}Cjpx))K7uzQAa7jxmT7JYW~Pe#b`b=jT$+)rp<&%W+}
> zwey1vtIatIH8RVYYaL$S&nY|RIvK|#%trD<IA!2$jw8outd8@<A#SdaBH5g49LWk+
> zP6&&ROLH6yX7kagr#a=vJ)fF1gjh1w3tW?Eoa}ZayCyZHWJjM_2R>?y#cq<lS>dDx
> zoRsdne(HQ_D0+ce&KwuPe1&)9c*2Bn$m>f-j$@JoCr$#epFRt0(0jnimLH*-QSyN2
> zyHHLGm7E?3=7aS(qx2E!!8t|5ILtp&F8AuAKlR$rGnf0mh<x<ISM+KTn0I473;TCo
> zi(R<fFGrMLJ)4Wze@)1>ILBL3vNv0oN<UfN#uRRWr20f#?zOCwbW@)UbX}QqB=$u7
> zr>1QuF+Apa4X{Z{F}1fjZ>}BhQac}C#nj$T!(HiEin6*)LUaOQbObi<-3>_;*K2p)
> z>@B5wxG}<8)`xR%OQx&FIp!$rnSJ~H$f%YSSGscyUxppi8t3j~u4R&NRAPi*$EnZM
> zIiC>JI#QwUHaW)$T3&E%bKcmH<Q(a>(;Qrd+eTcLV&u4O54U7m4id(53c7b?E?Ad9
> z`!-K;WIu;h-0ZxTtZ^IJtVtW$KIwOqH?^c$7pApSdy1mFYC76Hc+98`T-q|IiaDh_
> z6JyBzbh|J%hQD%M73pe8?d^4<E&VZuM_c+Szi}<-A)r6k0UD^~E29u&dFwKaEBBl@
> zFerCM>S9_JnU#uM%X&uH$m81{YRN3eEaTq74fUto<tNXwvinr)+0)=n2MV*~R;2&@
> zz#w6IwRCOzDAJpL_EqU&2SECKq{r-`ne`CRISwke-=Q+Rm&!d?Q2G8U=~hB#oc;y&
> z<nv`0<crJNO1*aM!M<Y-__o&L^w%SY%^hda1C-?9E1(5_uSgfx$KYDyT<tPjaL!de
> zEBn!Nf6I<Ow=@2qbi5n!d>eW!e4nMg?}$=|TRQ!lCGk~>?dp#+e<mrcokjRx+SFY`
> z9m8lEty3a(;hSH;m&NJm2#jbrNj&0yDICA^l=MRq%Ov)<Vku0Ek)+;)l>%m=BlfhZ
> zmkHIkN$$il!q%H$jAq(-^p<nu|Eh4XvkmU*F;Xi{9g0^;VWHTK=hZ<=Thu}tg83+M
> ze1AKKl at 7uDpF}OHGfZ2{+z`Tn^>4%wuRT=eVkx|x+5En_bGW}bK6?~hmk_7(<NQhz
> zaHVV;<os$?>Zz1z?TogZ!MyRjh`m~A1m$VCmzHXHheNHbwd75vYu8#>BL(N;LogRt
> zc+p(5*6PJc?Zru}qqk158r5K}C18HtQxeU{x~R=BVy$KBS!<0L(x$E+BV&&F|ChCv
> z4QnkWx8Pc9_>W$-+}g3+p$^T`g+8l}-&<=fS5k-8TEh>vsXLZej|rvyy|oryN1|-D
> zVN@%I*U_?t>Z#<4^?*rPIplRL2UfNsfg2LFI5#`=T<t0b=Z4=t%R#$c-sSYf(l7Tb
> z{e at Zztumt=*%Qvy_VyXrlcqD3bG6VhjGdSrENPC$Izr=BqqXc*{Hox3V%<CDj at D1T
> zXjKpA`+w*fzbU)!In0JI`q33s`QubChW!xIv&Z2+<8W_o>q at N4q^*UXk{tGL<U$<7
> zy6*EXuXAh)$9=+6ejOdh%A|kXNBR7x^>V)*RZcBNSN3*MjhI#Zjuk2DsAA2z#)=g6
> zvl4!d6)9SygkNJtipGu^tWnokk)m-rVnf~4R-tG*Vxd=~_85M?-Et+b(Mv-XuYp(g
> zS<!Do&L}I-+4JOd{w8}t&*~uhNK2|>3%km065WX%Xh=y(mC4Xl#mtQ02p^M(5&kME
> z#TcoSK#6x>MJcBE3QGA3rF%k at Du0L4dm&1iYbc$$g3?Td(!D`Su~-9L%~R~S5GC!^
> zlwx54{G-yvI<BP at EFEg&D!InOqSuE`!DUT~ZH1kZ))SqZ*?6s`m>20t>{>1rg+}27
> z?AOMZV}&(!e&7P|Sc{E~$6iqC|H1>!$#$Ib%t(0NA-l`<+4vf^mfUN2tmFZ6;QW%%
> zxQtta&pWV-7iAib{NvO%7t_$>4BxrZ8L at K}T53JUr&$=aOv-%{+^|quT`Yd at wGvfS
> zhzgHZ$p%~E+IECBxug2%8|B|X`(oO%mE3qxoC+Fw%_?)pkNcD{F!1Y8Yh at TO67qp!
> zt<8kB7Mf_7`0Q&TX;C^$QFqbLzJ_yFeXXE026GuDCgz%$`cTY(YhsRsVy*|jmuE(l
> znzx0{Zf{X2reB?oo|05zGOkX?jHKx<{iwv=;+}RTRYq({S-|dKA#2Gpmm%Jj^bVZ!
> z=3EjL=^h73Opt6B!m;8mGu&MwyK2_fZ&;}6j}yUjN|sGXDp~Fvr{aiek|rt=5?e7L
> zw#4ClGFR(}#42#5^X;nDhS4Rf=zQ91Z!2q;-}z at ktkg4;Lz$R`E$JQ=R$FB1+~+ at 3
> zILy9={~r|oPiLswjnIn0_!=6L at H+t~jiO5`73!sz>x1R7J}8G>;6<#dD_YWlN%w>?
> z&nsE3>=3L_(mA}P2wCYZ!*7s7`7#Y=A!w9=h720ZU_pkh-hvxOt`w9j$$3BaoV2y~
> zFJO(VcLkN6cjW?h0qb490A=$!LK>B3c)sL*Zy4la^@ij3J~~E}6nHiGoeBF<Y76dg
> z;C?Kr$7=VP>)SL^SW7Z?BaYD7XkM%G`>iKRp^&don4wUZj<hK>_L*emHwnLgl>WO=
> z9-8_A^o-nN`59?bUy=2K))CbmQ^j4aMQl0MqQ1K$IN4jwGdRN(TQUfz?jDEbo4V<3
> z-zWG?gikEFj at L5`>UjvSwKI^<P~7CDYp&~+RyWn$@xyiS<tc0PIdDCIHoP0(S(saX
> zk{#VPD~s?f9ak}D($KNh!DNp*w*!`6*d(aiD`my;EFEvNpF8K21ydzf$m=8m34CIi
> z%ag4B5_>A=OdR}2S0y{bXL)7D!D3X`@`Tc*DJ7HVEJ_A>1j`rdB^0Ur>Ck1VRNbk_
> zg`Q|0<V>g%iwFsHPpQ2JshX9vbg$?D?E5$iT(&wxwP_1<D*|6<vpyR>tR}t!9{b7l
> z1zMsp4F2T$jD#`=Y_D3w&^b7#&8k3Yf+wPY=ro3iPp$|4VGoDjQ=p5JI6Q6<RiA4C
> zRgSv;OI<8={Y+gd>guGfK(ryc=ym~A)@qv7841;$0^!xTx1`+FM$h;#y=ixvpLU+i
> z#CiKiWga^$k3+xkTN7Ecs%o^rFuWn+ at J>4GSzjRIHqiQ!H8 at YHjckV9uqXZ5-)IV?
> z1`US}>Dj|OEBGpgrp!Q!awQ$g^mq-EOA;g9gRV{+%)Na0AEm{a%Gg5Oox$xWhTffO
> z>#ksC5u%hsf at aT{D2L&;7A(Fk$=FYuy>Rq_C<FUe&Czf_YS)r1tE(Q8b1<{O-Asf~
> z$rF-EWt*WYs{qEg&01OqhoWT`7M%b_J=`M4ZMa`$7Io<GM98?2cvVa~Z7r)mr+Zk~
> zX|Yp_V4)$SaD6q-j6`P?zFC5AI7(VXr3`*;grV!6!a0%})__UNbV#FWE0s>2FKgIp
> zpZt1d{8kC~x(aE#nW5Z-k1~wPD|aPHBU+N(YA=n;ky-x-)`h%si>>;cr=N8p8+8Bd
> ziLx%_g6{u%)YgS6dNu%>prlJf4_M}9+E{7IdCs*}+6B8T!5tOud>K8%-ezwv4V|V(
> zkIU|$>ppr8UFPYnqiy%Kvv9%wy)7T>E0yB9yPZcEPQ7fqqg{nC>Y9v at 8!%r9L$7 at h
> z{s{=DepP`!%nSd`@as)F4g4CM71=h*Uxrq~;bzfTxhcD_>_wbC?^mE*aRa^aw>lCb
> zXgy^WIBSCTKy at Eya%gX;saMhd0d`W1^dU>p63mhl3JBY1)T&OHJHC1wdXk2dKEs(i
> z{F9}VhN1bR?C4A17=pRL(EO0gg?{S6)XRR8HVLQt;2)z{x>TFiDX$rX==R$Tx-09M
> zjurAS*)4BtEAu+QaYTVumJQG4$G5G#xU7D%WRi-c<-gj0U5@(X(dyT=3<JfHic62W
> zKd|N4>3L`HzCg)N^n|svmfAPVf+y;5xI8!e=639wm#jz3I+PE(D6!C4hHBS>Xq at xe
> zNVN&)fx=~2Gp2t83D_iPHstb|o2ME%Z#~tr1tX0%o=WRq?jbbo{9hDz5JUDd6-~ey
> zykR#|bo}_pCqG}7o_a7!Il%KhbTmh5rSTWP%}96?C&1QsG>yofu&WweIV7BC&@8s6
> z5F*Lg+tlI|O_qRu-$kTTRgBc+?vL}xVKj}o^T;;(l}6-hhb*S}0>=Qait(KDH%%?h
> zU4}Mu;UJ4$(`us4ers1XY+2)w;#;dG8oegIq(A0Y?0tYca5wsrmBjr at DbgH3{R#Iu
> zibY?hIP)V;6sQV1>?g9qO4**X96u96b}(4J0rms>v4kW8#sZcDL_h&xAz(WP4uS8&
> z!<Rj93m^1TTpG3!-(7&cfTI9EAPVV*07e3)0c?OL05ZT3UHIp|dZfuTcYIk$LkUWN
> z9Zk5XjlA&B=sDYPQ<e6dZH9h_+h{2dspV1G3G2UwrC>MoXg2g0F{hYm=L3()(dd!C
> zr5d#Ug4~3aBl;TDmzs>0!j#a9Tk=k)of#ICO6kv817)0Wd5^Tjs-x1!XVPB1)uW<)
> z-1=4-XTWt~3OySB9jHx|IVDDe+pH?;>f$};l(FDj>u`)N(7$Ze<d5YXXyF|6y(vhO
> zmXUzEz5^kST%EL-Fhmx3suzaX=W`UE=<6Aw7Nw~(cbsTND%fN3^nxM{nMFyb^!jsT
> z4*rQa&mM+RW=UN{P&x`{C*?@WFU749tlInOEc~0A9IN&cb$wC8q9%^_$?Xf|wi7Xj
> zd#MYu3e>f|{u~)EvM_i;^s3y#km^z|mO$U#As2i7IdTO2|LvQK%97TiBCV5%eUWlc
> zG3p{|{h_Tumc0~&F7QE)^!jtUzz4QAui~SN^0DVyN|$q at 6l$2N^yd67yi-M9?WJh!
> zqCCIS>z~|3d48$aZ|cI^Fyw_^+Odi*21oI>n((Sy+&6aNMJMu1PYUdvYr60*40*gy
> zNO)HaLKgN3iRg+&$ecbQO8F~NtIUSMkdIP>IFtF38 at Dl)dQ5yQz6Q22f1Dz_?=S|Y
> zp_WhLPPaA?Xi1*NUOL~!d2Ti&qkSZ-Kj}y|%$|N0Eu|HhOR^`d`!HkjI!8+yZBNZg
> zDXJJZUQFrLZrocr|0Le~IZ8{|92smww51t_7G}2K#ji^r$Wb1Z604DW(;@sFT5}cp
> zAm>fz5mHB6Bu(3*cVixsm)66jzX`luXo^0VK=}maKWE&$Ug@>Workvio2(?7w`$^`
> z(}kJA^!_HlPI3pwel=?v=$?*oWf7j!EsiU}4CkET;p0C@>1bC^wIs_C^nQHpOZe*X
> zUHvJKaNI{lYMeiXrBPQCT{D&H7)l*wh`3mXTmFP6(qTjL#k#dxfnj-^g*{B^b`3W4
> zyI9wfd@!0)HR at smpcu1dH>F**25t at 3<iyagYY{BwoFSrX5k3Fu4!OD(VZHep9hrkX
> zZQGXpX!U-=k()^h-oY7K=rDJ*`!TOaPPk(|4ml9Aiq6vfLiXleB1RauWk;Yq3cFNQ
> zncaVB8iTPd(cRxlxWvmXH>wb`2+T}4*sr7&veVr0`4$gW^AAfN?4dqv_o#uZ!V5kI
> z59{Vybe;%-8;)L_yeaGO_QQO<9q|*-2Li%ksUPlJFXVAzf!f|_Z`uBsVczi{Fgw2g
> zbXtaL*Q2n_J{jyU9YeAPE at OiIWds?(@N6c#o#{K;(Nei+iJopr&K^}g)i65GA*ad_
> z=FXZA=xn)Kpgmr-6`J9w>0dJ)Giua{A>zo$nmA<^eUkxiSDxn24wq9M=tYq3bs7?!
> zJs-iGp<1A`=W0QrfHZXW3`wV!i@;s;`?wyBqA&f9j09&(>74q=NaTrCTT#E}MA}*m
> zh@%wIt52xz$e3IWD-Gt+Nk#n>esLaT#yO<@Gt$yDYTDaY-;Z`&)raykhz;UBOQqM6
> zOt}T+lxlnHzOyN-nl at sFeFVB{7*&M3&Nbt~M+!pp*`unm45N!;fs0tgjG`k at bx*F(
> zQW`DE$j!X5SdKtz3#P}aK1hG#a!2wiw_z}-J$yv3$oYQ1lcq9EDC&2r$&h?Re|GSy
> zCdVYiD>=O8S7O;CdhGOp1Mq~rK{wXi`P#W)?w&X)U5>zBWan!?QchQ?6`9dAZki8r
> zm at xe(S%tE8WTZi2DYSp8z8_$v>(-)v3O=RIdZvUVQxcNQlhs+Dro%1JvTuBxmJ0do
> z?kSNXv54#^LG4Ls%QGm+Ge`8ElqzOp{VKJ>Gj5g|Zh-7m)meV093iDsN}#ct at _NdB
> zR_QH!xuLZUPAImF{?2<zk&oVy{>pO5O^@=x%6hqd#T1!4JVX4>wZxy3QMhXv<vwHm
> zu7!r7MT6x?MGI0+vu80%7o}sQO$?|p#^B8qReywB5!2lhqlW(EB4;;BJ^OSjPAxob
> zcy7kIV9R=8X-~_dXKghkgV;z7QFQNT<axau)iMmbHR$8E{+Z?gUA1G}A6k?i)Hwww
> z8vP*Eo7t%K>v5*?t|IJlQ#*c9lF5SJVEPL<qfoQK-=t_ScIiO}<#Fg}FUjgy78Z_s
> z(SPfu at WVLc>C(xuG*@%yj@$fAia(}@i&ty>O<gqq!95{cM_~uDuo``T^)ECW8qto@
> zu0Yt&n926eaAM=k9mgM|{e6_$Ps|;^vRK2?89hsFRpsa%+Ktd2<(-<_wk(*pgEe=2
> zy<U=FNh^oV^F{PFtR=IQI0s=>P=V8pu_cwRNxAy`NUM&~;2gUo<F>FR at -T~$N~gno
> zu-(9GC24I|c0&7vjGNnyuw7LswlG7FEez|uQe`)n3HGY&30SaRRIFe|H+{D(G&_s?
> zIn?Vefu*Y=V{*G8<DT{j=8k{0ny58b#}eh#FHR&YC#;n(PF$;D`C at TOxzw+h-4eZl
> zw?NkXYBzU$Phba$M5&%e8B<V_rLcbe*}sjhPiAk$di|~D(H~C4JqO&9Zk%qh*+s0<
> zb&bc2<O7Q<Jy(l6VOmC8!8CWFEyOBRsGVu4OHE%wg6q$wFy;OOy(cEndt$~xxM_{M
> zocnP{%+v4FxFBtWhtnI_jr){$k_3FG!-j*L49~pv7F|8fev#gHIJE`0Ky;TdTmR~a
> z04s`clT9Oxu_shCWk>%UpG5}I@(jsH!_6G5*e%*9LC`sD4fAM-g+$>vhQ`*=3TuVE
> zYj`={pTP)xYj#4L-S33G<~oGq<~!2GMIuJBHP~o~MIXrvdSYuhMSWMKlQ0h3q*lXQ
> zC2vl96;`$Ak~%y3GgBj07_lXF at hZFYX%w%rQ=8>m%9)$D5LSkM^e35>ZZLOl{+FWp
> zT4;W}JW!~V`U`H-Ur?v>z_TkdeG_G!32JX(w>95n!@F=_2qeDHUTXPVN;SPB^p|#7
> z-j;d$$CmB5KabNo!hDv`?Y}?+jUe$_rc}v+u&gx9-02MF2cJ=TjyPIfxJk!HHV;G|
> zsmNm&wEm4%%=hHX1y>|$ns10S5=Jn0e4FB;x8vaV{M$q_NnnLS-Nux<VuX80f8eqW
> zF;nvc|MalZAyX|*?rso>vHm$SZ6CQ!8kWlyYfM;a<{eOL8ioXLvLC#>*x<*$1bUQh
> zZmcg;8~i4`=wvtJq%ZG+MJveHmw3gmmoFRm3RCzB3-Z<Sg)2<qD-3)=(*i3zqfIK@
> z-o7<n#gxj}yWTz|7*2Db^y3SeQksL^+$WEk|Cz^Yee$3(rKN@?5G9VFqfE)0uz<C~
> zcGK#&8D1=!mZ5sNAI^q7oKg7lJ=5lsBJ^J!C-)&_j%5ka*wdGlV%kT(*PWS;R}?r>
> zD6s^mlQz^(wUH^8IK0mCm0fV>)a=ce{Ia$ti%lRrogctz!owoLS<*;k_Jo(Gwxrpe
> z?hICi-LHPx>tD{NJ at w1?@G63~!gjK0gqKE at PpZtt3pLX{L!E!7BW0Ghn$%=vq`j<d
> zNvXN5yh)f(25ykF;6Qr-8auRT8hYfJPK<-g$Gxa8_j=yM$%>AX_j|w<dyMAL){WEk
> zAGYZ53RuT~H__3ytsCVg=FWq!VLmJHMDjo~IAJY$=nNDuY~Y5N67I%Mi-yLdzLa>G
> z{<;+lQsLH-pU{&^FG2s-qphrUBpY=BZ#QNY8228nO2Qa3H2*2A%I~MPBH&RR+T$R_
> zjK%1`*5cg09(^W_S$BfVE^IGQ)+!eIo}@l#r$U%@A!Eke-qJjU+B<0)cP?^RB&oB9
> zu3tn))x!HLc+g#Iv^|HJ=!usx(+F8r!Qa|b>>0cXaH0Y)t*HX^j!;j(TxRb0Y_jJ+
> zR7UG9MnZYthj$KwC4!dBo-yB%B1t$ape`6=|Dh!fd<6nBeml;=eu`Z?^jAFI(#*FJ
> z{@{IbICh~&VcvZScdBOa97l}B3|^4ak$AY3*g>+U3oDIfb1d_t2<>liH#Mf><fqC^
> z6C?fO^z9m05>Se7j2^s6N$KM$JK(wTPH51Vk#IMkOEM$7W3p9uQ)@AuV?Ii4wlt6L
> zex at AshU#0Au?7N_GExK;hAmd%<h$d3Ctd)JhqV&+$YldFK*=4QU3fQ-lX-n#`YbYc
> zzOGYNF36{AsFDkz6zSWbSQTlqRW;bld)PtWtm%~pA!;|Q?=${Et&Qf+N<&|1RSiJ9
> zdNjo0V+uvwC-|<i58sbb3CiFdQe+g}#20hij_;N#WqgL>QVHXZ*$mkCdnNqc!k~oZ
> zI-`xrwJa_t^qskpRLV`C^ho&$3G<(zl)qlnSIQ$J-Dowde+=>Vr(WK2`|$QB%GYI?
> zYJxJQyxrh;qO9puT8bpFP|MZ2A`jgR`K*+i=!!~mhiE_CTVL^gXg{pb9){6u4D=&K
> z;4(G&L`#aam85$L?n2>3Rh~3(R0iLkN4v;U-rUnLxRtkhnqQLKAwOnpt4pcu(0<c;
> zYA2NQBR!@1_KQ9_KceIe4YTNwGj4j}UUsrG5AzVFHjhgF+jmiif?Z#8hvb${<rBOP
> zCRF{!j(PsB4EG3nHV(ZPi`lFuA_W%v!LXty88cbpNyIvl-?85lj}U&x2e=`zkcru`
> zuZG3G3q~p;<c^UTya<<xl{YIrT-UjFVV#ejHbdM3L&T03al-dQ+T&pKxDfP at o)15R
> zncrsjVA^A}Z>H;V%ytrFiE2yZ`i89-rEs$dw&4jSwV21M3#QwDz^HYTA2X;660EWe
> z&SP~p{mBsf at D3NjK2q$%ucE)2;)Pw<Fd^UOW$=R4s5}|Fbffa;z=vALm|<7u4$+nm
> zT6B0PF8JCZdOyql79Ff)m7h*Gyg%~|!&@`|o>AC#q#SP>o^BTAzc)A=KHOfySUvM^
> z1j7;0O7R=&1z2&jhqmp{BGnpdla}ZmDSUB$7I$+5l1gLWqp_|VDLo!zPE``-KQ!E>
> zgx^3%kKV91X&6 at ZiHI-HA{$}%RqXun=wa<Obe<LKZ?!IEdv at +s+3VZ><AHU(?I-s*
> zY6ZR#Wmz~DcUTfL5}a<CSQG2%>CVzRjlUINdz}W9Bx6!wcb(96BlNJd)CY<h)qqe=
> zYDhi0q!eps;K{l=LGjz`1b?eSzYrr2T0sb#;!2dS-9sQl$P^q73`$dKZH~)GXmilB
> z3-qSI!m$<UxCf2*Q9L`**U!a`nn;BTsmG2D8=;JJKVjW6G|zzBv`)GL8T}L5qD4-Y
> z-P$CHEYr*BQY&1Hb}L5D$0QEGqYhP8!jA9=A)at1qU}F;Q;^z@=-yQ)dXyVc&Sj{>
> z{~+#?J4_ivFJK(K<Ua~)D~om2a4D%gm5xPu>FD#0hNL)1#><7yqp(wJv)4P1052!I
> z(D{L^qx;Wjt83^y2=}Dd_>V&NdjC<nGt+hf`|{Bxe=&D_F_L~W68<v>by`Tros-`|
> z^XK6$fhV_)l$y4T#|g7iQ#B!{S$>DTTKK!5Ig at TG#-8nBiC}+0rZR88&#3c1CL}nB
> z6xLRXw*XUde$Zs at Y{N;)tuJj_g5G$W<1o+LtK%2gtHI+^DXhv2+tMjeSQb204I at Hl
> z`^`o|=}4pvvosTSe6>U(^(-io5EetJOD4Rd*x9zW{J^K#%7~5A&hCD2JzhoIR`iS~
> z(AuJBENs!aFBxI}G=&L5yp}-Q&_gZtmf?m9Q~p6qa?yO8eL#r7X~L^;mJ6lQN~9%u
> z)42cNwEU;6#SCv<%HzeQ=dnJ7)!b+pI(-yuZ?HuwzUb*AF)LV;p?Y(ijD5v*3|b>S
> z2cvZ*cbg7%Q)^;Ro>jZeo$uBC5vKnX{$bAb^;=juM#_v)8--KlJkGa%d8dri=o-4B
> zjDpWdb at Y;k_Fa<O+?o28*Uob!%Bqnx7<1KlE&D<|-cR(Rmw{G>`AHR|Zbx5-U1-9@
> zg#33ZdpCIXwr3wV_(EpStzdaU-&@I$-$dB%V0$okYS++Sv={H8Kg4?qHz%Xdz+xLd
> z5U1xXI3XZm4#jUjw5!SEZ`p!#15)<&tX39IF=x14cF!fcvlePSu+BJ}VDr7LiO#m^
> z4$N&`H_#VTr5`=8EE1N6V02{4q`el?z^d!ISMNQVk>+gL7iYn$1^ZvSUCu89u)z)l
> zj=j->77{?Z-Hk_azq9A9GHS!D#Jnt_V2peQ_j04S&+uIKH1rEkLZ?SHr+e*Psdyo`
> z<LifMpQogx=gw(5=jC*MWw&`IUV2q#NIc~aEuN=q*O{Z0^n%|WDp at RaoW2DNx$uLj
> zCiX2qdhHnWTd at _X)A2&WT2^+-bB?Np=mLTAZ5}@zyP}|V7T8)XF|v;CjXryaDf*|c
> z!Syc<jG`Ceuu;%43^PXP561b%eW9E&nm_+luncm@*1)|ND#ZzUBFgd#X7|u7>%Gbw
> z?9imxr;yu_pjO4Mg&QrDT6VEV6Pt&)hY!H6KN?|}U8#29rPj3}cQN9d;l_$Bx(?~a
> zh1{p%PJ<h?!wtZRhg$<K2g98Z#ECM&eLLKcV>HF5bl{Fcy;u$f-Ldo?_tS8LP9#o0
> zTN*;{e7N6+oAPrI?lEwKhj0gI8iP1$(6 at XMa$|LE`6T527C45WTZ3`jLhVMNuc<(|
> z5OhZ-!+m$qjr&uv(=*{lUNH-R|2o{1=VrL6OdzLd3*6&_Zn6>h9|qkq at sQOyxGDcA
> zOa9c5dlTGuq8$jPCF2rI>x at 6ZuJx96DORmBEbErtDX0>i+xYznt{pDbRL-q(j+n|z
> z(5RlZh`Rc+W!~Iz_+QkzuKKs%ogKpy^qsTqq(@thMk?<bgw`<X*Ma?g at H|Ea`W9$A
> zPS*wg0e5)F-AY?M=1Q9sf9IKreeibm!8?MT{se25NmGostKf>qS>_`Go)k1`$pwqH
> zR1o6$TdPFe5$8>b+BDeAa<CT6X~8+1LfpqId;x1a?0{f)a&Kst<j`SA6)*E()=Jxz
> zbO`bx%1#32lNU#358ZiO7P54u5!jv4k{yRQ3<jIP{g>d_W|!R4>^X<%iR(~VqgM9H
> zXpyu^+J%x&^tV!*1<y-|EUvOt<io_nE&Xg+SEf7Nc81%~=o!%E_Qbnzvp*`bxj$W5
> zd0w at oJ|7V5r2n+Cz{Sw4_(5r8OR`Z41U&zdB3vUhIJGRK5yoMvs%#i>xRbs at y=hF~
> z?~V^Qw5=3A{TF62MfOrzu<LN2jk6bGPKnpJq#LAgydBnY;UC%0?L02ItFzEuY;uS9
> zDZ?>v9r<#$%xGD%iLm5~lMzv$n>!Bqv0G`&`uoNRS#o at cCB%*kW%Zo3I->uySBb7`
> zSZyv&^he at 6eVAz&N*+fJ(K$L^f;{BW_Q~g`URf!xc^=y3KP?M}NAu(3-GuY5YIk^<
> z`YF;psZ`n?zZ&z-bj*E|=-k(co~=RWKaCf>v7dvnGU6lhNuLr#r-8>^s735JynF_B
> zG^`6HoskfGk4?F7C48mIx;&&8j at DV{9n9IjRBi&56~Hs%+yqY9^=J?*@UV`De7cQe
> zXzrdkXxB=FLc><6>Av+xj3N2>4}w-RaFt-V;iJ%=**d(nTKEFBZx@#125Bp$(~Q>8
> zz1zRdFrjcIwQU!^&@hqiq!g~gnjoxTx-<m(HiW)XL+kDQDXNnWMjj4LT-Sy3g!$3R
> zXe~)|@xrAhLjC`c_vZ0Y6<Pmq^_ot|(t)suKspc>1wsNU8I7USv<=PLK-fA9319%n
> zfjGFJpxh1 at 2oSaa0TrQfiP2Gvn#mAE?Vt_;6>zlGQBgpLff*g6=#aFr`~9A}xBK2e
> zbmn>V_j^C@=l!Gm)~Tv<YCCnR>QvRKqtv_p+2#@S0?zd~S#%c~t4$_1i%ulXN!|%M
> zSLO9pIq7r_W)nrQI at b^Xe6AYtE%xi+TkP$MJw$VvzGgalMiF?kWy;_9JXY4&$nxJr
> z<7eKGov-1Xt&!&3c>~~v6>H?>wd_a6*Jj<<@^{haaawh|;;ZykrM at nhGrygwe@JV6
> z(PUDenK0k(ywvn&reTQol!auB`8;WbzSt^hg?J9?`2SO+A%ZS*sLLWivp{pSDL$R4
> zE+71%fd!MShAtQbH4WRcI=6h+upMgycf$_+&u*x~|Ez|cs5eU*Z2Ut<+xsZp^ZAHq
> z=*{e;y_DVRD$-f2CLHaw>C6$__6 at y-@e#AzcaPN#@PALM&3E5u^KR;UuJ8G-7+I6)
> ztPY<YUZA{S7xH7DtmAz5d9p%Sp{JF1!lQiUJ&0-1D}?Q^$i<ALM-Prc?+`F at njzWE
> z6}O94 at E*#B+TM*^7JG{Fn{m7XXV1<@pG!R-<>?pvTjjDhb)TnRh*5e}=i5+oX?Xvj
> z$i%F_x0q^ibJ3*n*vcC#&x6wEjvh!uU$3#wvzTnK5MzDfsn<pApBzcsnC7W(>-m|r
> zsRrBtw0-NjSoYm2;S4aC;G+ at W(;t${eBdxr!<c8>PP@^$y?)evtGTHCPB&>A?39N>
> z&yq%O+K)K*MYbC?yY91^y{0-1&5uHB>l<;S+6wzB3(bSD8*n#l{-S(Cuc|X5JQ>t`
> z;YEhwt5Zr?GUgT<Rx=!ZFDn~2sqiZZK$A3cdUjmkx~zohA7;n>8zbBF_p{@^7x8@$
> z^NXu6zlg~;>^TcR#98pC?6~i~z_%W!6%(e`W$m5%qN`uDsZL8}LTdVYZJichll-;F
> zUu(VAOL}LarV9 at j>a}`{$K`-XBCAp!7w+zaLdn8F<SryQF~`9jQGq$aFAY2;96 at +d
> z_WigIq}%27iegb+U%}|b{`!#_f{`o%9q9{w!^HsBCm7Ssn;&(yEME_8!f5ah-yIsV
> zd4A>NT4=%rSCNLf7*1g06m><X#_Oo(eTy~0 at q2|LehPbU_!RcO5p)I{dr3Hhz3+S5
> z(h7b88}(f7{i7|#)CnhY*Lm-%nvBzCIN$7gwSI52=i61^h?i8S0d+oMUE~CI(aIxq
> zR$9GF)Y&FUY<(s)7Ueh(y&9U)HO@<aejBYG%g+XdI(&N}6#S5^WM{?A4?%l%>11cf
> zJ?!4YMY0QgjT-w_9_1ohLjPZ}qG+!rgzjgG54xW$8c)!_O%*8(<)mryze3t9ev&fh
> z3Oawhf{rwoj^_5RqB;H^^!zSUeDS6RoJth54V4Wz>xb|9x-60*^;wt=KMH%!X2f9)
> zxUmDdvb}*@IBuwj#EF}R)7p^|t>YRt=tiO88WYJM>4n>ALt#(<@^VV~gEo{j+LAWZ
> zKk?VhVRr9-7Ks9wJa)d`s+*5qP*?0-?~N|W at PvYUeWp#C${3soPMxnW()o4sQ;T?<
> z`C68SxX~4!igfqbPG{#EzR;FnT7<6-Vbq&^_)=V0 at 0;;Z_C)tGk?peYoA5@|yGHNR
> zUYv6gd^J;Dj6sXy{T?GqqTAF9uS(InK<o>>hY3HNcf@~;Kh16GeWQ?5Jyz73 at oE5m
> z(MLNuG9f!Pg23wrU+jJEesT-+bxG*gT0Ij4<N~!O2(;HYc at a2k1GM(LX}vUgC+0K>
> z0`0Cq8v<7+{9?uawXi)dYempYd;HM06}yMsTrRpt?_rO6o_^}DLD+Q}1HW%^p7FV=
> z6D3mxUGVGrC3Q=- at 2J|3_fRas4**TxKB?;Nk`!hQZmyqPhZ7(c=tecrje1BoIt(<T
> zK*ItWWT(nZyQ$!0d=WB`b;Foo-L9+Z13wcV5v-SC=w%Fi`8<{S&EN2QKWpNB{@vK8
> zaJ`z9aGzi9r7nKXS6YESbE-e$eGG|<kqj#^DK*=6V<j%BpNF+2!H*Hh7RkrxDotfN
> z&7+evY&6m$dvjOmA*1PBO4Bufw6G`_YlFqYh6<Nin_HJdezugNPS{cU0b^(^E*j_B
> z%+01G^U8bbtf*0h&gY>RPhxHC_UHo@^o8Bvih$PHGRZ3EdpnnmQFtlqb?2ow?#H_r
> z2%Xr><8(zT-9<}{T}-L5JItYru!A at XIazNvYZCE75AM3#&535%{+_zk{Epu1`PSnP
> z(Easq^PMecXJ+aiis5sLA0Ved2|69zF+f--Wa4#GMmx}e?!XVa5Wyl?MY7|MeFN6b
> zk%&ECi#-X-Q8P1RMrIc0nnz)kU4nmDdBML{EE25v>hRM;+qyJs*uvph?+?Pt#z?21
> zu}3=}C!NcMM$9_&+5K0QW9<3|^i2E=_o_`af?kES(5g+<rA-Nq at g(tA;SLFOq^uVE
> z6|QssY4|_ycco4Dz9%xPE6Ml{P7iS%YBz*P8cN)LAboFBY;`(bV~cLDCtP+1X&|d{
> z0#3#oQk{-*WwyK;>r|bN8EHe?7IA1+GR|vLzhvS7{6oWxf9j1o{PbdfA=wY at U5|sL
> zVI=J$^{Yr<+S0~&%iSc^aBwEoaPS?ehJ!x1w<$FooO)#q^Z0j>JdLakLq9$acQ~i-
> zV5M>og;P2czMyd=Sb*Oo{B9+GSe(XrK^`C4+ZmghdZZcLNj{v#Tkr|sw_r&kA+5iA
> zCU}<LBJjZ~6Wt-e{sY~v^3z-a+-k);K+y+$a&76QyJXIm>1A0lE#JZSJ)bGfXwg=s
> z`JkuX?rG|krEU4n*NewzwKyBiTgT+b85+5LTA(#u;k at +LM*2c~TIjs==ATiT1bP()
> zTH7xHccKzF5*X7Lu^YMXk20kk+%FgSOHPUClc_eA)X8 at PW(D=W5n0A#znP?G>Fx!g
> zw5)=nzd4dIiJG(E5K56%u4%Zby#G5!lLZIw`eH}p2kb7so_6bxrsGMM>jh8Xe2t<P
> zJdsI!_#^rV*C^AzViD}QVTVwl`@GOK(H!@)(OF9tlSTqMDAFYrK{ow64Zj=lt3}zt
> z=dkqM(tQhVP(l01CRCcM7&L1>^aboHEch!VUpgcs&ZjN-t7D{(ty<MUV+L&fiqNrp
> z8?z1G!){A$XF8+2cZh?TpyOcK&=ZYv4|+bzp-a6AdZnP>06iFYIV9T>Wvb90BcVUa
> zp&nIeTO_ni4n=!lE)E^fiWMjs>67S<K(h$lg5bgIFKSlCsvE$mE#oIc-dgZ=iD~i~
> ziCxank)tU4Iw#XQ at tfcbz4<cWEVym>-Qo-dFhXK3ed(PAO`YXESuN~MVvc!o4|d0B
> zOx0j-7H57CXMFox7v*JQyIU9K_d(J~?=QyLv1<h#8reRlbE4moP6ImxPoWG3%-;p*
> zh?*sL{G%w(GPw0<wQ8Jh8!5RHPQrf at WHRn>z@|076;kd*ihbc{giR9cyO!rjG-C4+
> zw}N<dR{?%sM)KiCuVzSpD(N=342*g9nXH&+{{TFcEjAwccvI%;f$&3nYR|*(Rnp$0
> zZq4O|&X&7=kV16tA*4Za>$}0tXMME0jolr3^$T-2*lT^kZwk;#3a67+LoVF)3Fsfj
> zPF`0zokTmkmu~$`?aaz<!gpF{wrU8$xUt5b;XJ+<HwxvN9Dwvl<JW at p-jZsw-K&<}
> zMC{^>%R at OOTaRQ%F_)}Wiu0lM?GD?(o&%jraPH?oB_Q-yvV9MW_ub&?N2i%kD~WOr
> z$x^Kzqgf*QfxcmDLudZ2#EfyVNc{{YDjUaj7>nr)Kf#`AtbBRBX<k7N=i at AjRj(5o
> z#YUV}!53j@*Z55Ik-2bV?WQ-Otw={n?foU(^PnrUgx|uWJt^mSgrdxPXdzt|c~q_m
> zbViDJzp?`B^TrqG?23lfM}>9u0mNg?LJ3L_YoX52cjN3#XTe at 5^c+9#;d at dfBQ72J
> z96jj)>{ES*vEn9t+prIaQ^VNH@$#Le at 9F#$Zg|`bN%Q>$J(qisvDk5<{W^K4>1aB3
> zk}ZMpLJ?NHZpcY9pCdwt%}OycX+%B#(PzRV6^*BG<G$Rg&G;Je-6+oiqeSeBDPtB+
> zIzoHtHkBG6|KF$mtPe%`E*Y2DN9&N6FXcR9W%|vR7f7ovjk>C}_*H**Uh*v at 363?=
> ziVsOAbDHj}t$2XDD~R$t{SmG~p6{y7q277x!KUi~-R(*i3><!;X$au^02?{{bW<we
> z<$$9&{Ag1zXyWu$wn<5>2U{W-F%BE7^Q<Q8JcB;8mhKc-=jrrl)6jdT>EC}3|NpSf
> zL-R-E=`fWI?wnC?yH+?`w#LxTr=GDyR;qdMNR)RZw1d#n>PCpC#VFQ=T?c&;@Luuw
> z24mtM-8krpKjRi-Y at J2lk0n-{s+|>j=wn%D4LgLBL7z!DWWx!&NQqiAJ9Kv7d0ppH
> zb_nmLBx;#(=;0%sONB$Qy!sCIioD at ijY*hkm^CLU7SwjI at jvxVNJ0?syvxs(kE5GV
> z{wN*?l<|F6j{BDi4PyP}gg(u9Lmu(Wntx+9+7rvL>!6|0fXn83JiFb^9#21K>#{20
> zv=4i$$$HGo%CdTI+(!CEtQA^sJ&he;qvaawQXe$dde}1eW38g=>TDfUX1}QqD=*sq
> zN#%UOT3>>FcZ;+2_J2?hwV1Pk;~(KRnTE3 at p$pRsovmIkG%Z+~=!GO!CnQ>*fGgVB
> zde2LtBRIu2hVqSd3C__Y-#ef|)lYhX^%7!gN7t4)Tf3a4cRIe&eXFgv*5n)j_Aq^t
> zmudaIfO}1QT*sD}Ij-%(YeKY)`+9raq%D}WuW6vvm}g5vBK|j1Sx0?||IjO=aZ>(l
> z*3gYq54cOcQGm9*_ew_{ojf$pfsK0)JKOiXzA~p$<8M10g%gl7gGpHl8`t2*>adM#
> zfGIl6o&E{TRW5Ud1^bx#N=;=B?JfDh6+-u55^5+B7;6I#K30Zap6MG@$HX-3)Ti#x
> z5mWZt#G(5~i&^{a*q6VB^0M1;qXl-ohHhNrf(1u%;~Nin6}c<0XS;DNy&Wgh8-cx4
> z2kl-_&vUZ-2Fl;7<?mJUx4Zo9iat4X%SXoyj)A@@v+zO&_|1%Uez!J;b1-pRKE`~7
> z-Dmb{=mjhpiuQW=?TqPkw}JXmR`0F1<XVLEthlX?!--kCzS~NQ${5Zr;oZ<OHfx at i
> zWhHOD#or at q3I4n0npwJdqA@Y63&qp2T*PU_yh1C*OxWr`eJ<JRKzbiF;VmNMiy>cF
> zbYP_D<81v`gRiHP-TR8ewUWQA9M3)kmv6nrfrsvLVX55 at 9rIQPAc3G@LU1H-aPp=t
> z2Ri|yvqtoNAgf@@M*?2gdfVWb3F=eVvwcHpPgp}QNu=S-#}h>+C!6{&>#aTY)@fc-
> zE^RtIx$~OP$Z#BcdKC5t5a$!(<bVC89umpf`Zdn0h*sQUor~RdcJCcLt%+McdduJ#
> zgLG`LupCKcUw>e~jGHi!wOXTHixox+?y{P6ChoR4aYu^ZfHvB(>n(*DOx#Uj+uMXD
> z+!FBm>|J~eD<eo=Gj at 6qQsTf_E4<+dA;#fC2OJbj$nhtj2F>IatrU*f*l&|Up>f6a
> zK;jDQd$)dEfV=R$w|sPz_Fbo7CCWM%2{$9uBAgZ)5k3*;AKLMa`3|<iT+Hr=d<n<7
> zse?EVAkIovoNGFWBOne=4!7xW-smw=fUShGZ&%4Re;u#&lv;z6P3uXwe7^;ME_($x
> zf7vt#B<L#eODu}^`zi*`)PSpF8{<}$HH>{}Y%pQF!>Yl1-dJ&4vE}9OgtuJBHjLf=
> zX;5cnv7bT{z at qF}?~kpemi;G69*eolbu<G#PzMRYrgfz=NfDZ3UK-OO%`pvQuAn)F
> z(`>ww=2Yxdpy at J?cENnQ_(2_;%6hzE#BstN6)8LWmfPvAMg6}Uqp`DhgJ178Sk1j+
> zs$x#<p;yTNw|J<TzL>wC7RMu3EoZKN^1zd=C$!=jn#HH?#Jd1Oa3p34dh5JiS%5rn
> zV?^!sel4wkmw at A2QXfNIKiZ}f$74sWu@<+{oh_#?)#|>{95;v#XKP}CKS~^j?`+80
> z1cBQXNWBg5Qh>Xf+6ix+3vP=s#%+m$PQ(yjL7JI*e{2Ot6Tc4sDS+Sc>z%F7Ol%YE
> ztnD8($~=FbB#!U;Hp`Q~BN>9vg8c($>y)=FI-JjKopKys1HLEEoxc!Mjeb962gW at U
> zGyuA6WAYam`&%bAJ6q>2O6z7xFq_#;Vq=;yx#_I$JZv?=za*_&@~0Jz6tc6{f3eL=
> z(hd1Iiu8x@^lPXOh^MPP)z<9A$z~y{=1(<uKlQz{b=FDm?*oW?um!Wk^Ed~`T;>fU
> z05=2IfPJ9W=huU$S+!Nn*>vsMoC|s<yJrGsL9Mla;!?D;-SXo!VPEHD;p)G1hdcM9
> zs|4R}do^hqIyplxHB~Qd#EcGepH9u2QPZoPt##!hdV1E-m17R;a9UCapU;{-IGa+*
> zPtJu7T`LG_Gj4p#o*u;QT)SBd`F7QS;MX{sn&4!v2f)*<hdu&Nv!?ho$Bpm46&Hy$
> z$etbo$GdK)93Hv>r7qgH#$$1Y4zc5gti20j=j)=LaMcMW;WRS{vD>3uUTT3(nhK50
> zfJ1R9R=k5wuN|WX9>F}KyHB^8`OSKr5SQPa&dvwmzs;xDt`buHm}wqd*YtzGSwC8c
> z6K-?qv>)la3R>1rd#1b`H{e1CtMESN4S{r~)1Ijx;A~xZPOleqIEQ1c8P0J29CrR=
> zvEpSFTGZ1Eowo^n&5sG#hjXA6xL-}0 at y6r6p4ss?zU^#{|2^dbt%T8O<LL@>xe0F{
> z6^kfmyeZpw<J;K3W2E;&y4Fa246t60@~m;P$)5``*mu(iKFrLGH=aa|4w7S`#!!oI
> zA<jEU at 2#dG&eoS;`2e}T02!aC)oF^|EXsuM!X}!Nvb!e*y5oJ*&`XtmTCd*hY~A%d
> zQZ_bXw)|2B+B5VL?8kxcLZNgq+HPjK&QL=d+H0<-FMD2l0roqQ%a=y7+_DRG>!^Kk
> z2gPy~Ucy7`;m~F`@Yv)HwOUtF*+<US4^FucXrt{o4>G}vH~wlh3_F~)dUo7``be-E
> zV0TW(HX=M4;T!NZP4HS#udqf_Yc<ts#lc8xJm!h_*J@!QIP}sO at id@&NV2(d_49;;
> z)mrSVY5$CP4X=W?nCpJQgj)QkNd3Nb&$D6_|2{=|B>tk>qFm$UJ~nw|_L>{tqS5rF
> zX^4-$zGnyG(|4<Q+MmtoO;5Y~#*;^q(2ggat#O+otwYpwa@}{~G-CV%5$gnEEtgYY
> zET?{(+z$vxOE{GJq?SnPNurK=>z)~66#q^Y8*vW#j9(|56OJe;3b$ED_d)$m`uIp6
> zsv~<T>aErqPcJ^B%u6Ob=8K0We{gLXyRPiCe-Lyv<Ueo1V*>Q}0krzTNBpr;ZCkPH
> zPPIJh0 at bqr>Oc3EYab^oc<sl*A6#${8V0d%Z5dX5p at X77M)qBWZ(oexp at RY>>)AFN
> z#%S1 at ceWmM2);l%)f{`nW0h(eb)OpM<w^G+?}z#JOuVFI?n1MH7X+WrC`93mgaa*G
> zf?V{RP--<bYpA^sPKMtcp0iSG9{7^{M#FEqv$f%w2}Nw096wg#*@Gh~4$s$h{v;VM
> zQN+o^S}pq81UXh;RhfE%(%Py<C8yNmCS8lwA4Y>8_xrnhu9eg1${sJf;I7f4hRmqf
> zhCfNv8h&in2-i}Y4FS}}VU&el*bN02!fk9jtl!3r6LyUHEYgnst=9>>Ur)T`f0x#N
> zzV0ktdq$j)-TOz2EwOy5c-mzVOybJt{_@<L&mDd4m^ocA?SIGF`q~onQeB at muaD1^
> zu`~<gz*dB4by2Jh`yUE`e at iyg*z)>*F6E1HF0?+m$&-_{ant*v&+gL=Is4}MUY<d=
> zZRty~E at Hkecu6j)>{HR<x|1vqfAVNk46TW<HaP>Sr?KM2(53*LTK0c|5}x5NCqRrg
> z-~}XsUO?*H at Opz?94A95c!z1?nrm at x&rJ4z#9}&&wtOPrrPGMkz_38C+Qx6eE7#ka
> zNy919Xn-ARS|@ecuCL6pVh01eBRd+l9q59$Doh8q(L0;3y-UzCK+aZ&fc+HGXX2PB
> zzSmaW<2IZ6oV(^c?yzZ-U~|2%HwU>njl5a?7Pr{~KWmSOpU>Yd;<otB-W<d`jn|pN
> zI9|Uo;x4MeStgut$Jx|1$&O`a(<uwii5AsGA;;I2U_YAXYV}cd1MLa0QxtDy{q^-x
> z-Wy6VHq_ieU%X~`1ElHG-VDSv*JOAzun%LBzNP$&6A7m)4cSIqRn`eUVBif>!N+eZ
> z5p`{S6mCCVdJTIJ%O{+&MErI2Q5fZDmjh>`R~F$5-2rLMYexE`y*JPsVw3}VYfSns
> z!xwYaXuVl0pd{C#)cPd235HuMxnnn at WG1@Rmt>CJtjA9rGt0aM`!5JFne}?J2Kz3E
> zufdHp4M7sF<VLM8<Ni7UFPSpIhId#|n%>^upj?`o-w<c)zV1}2UPte<;g$rxR3onF
> znv68m0CYh{H}=4=Dv6>vC6Gq2`OIT$cx<YR!*6 at DkxOXPP`laGDv?@2?W3OVK7|p6
> zb#j;&LJOFRxwq$fq|~V{N*pM+nE|y5yAXj=XW;kGBW at AuDH?H#aIPW+BcoRwC^)ei
> zcmm=3!Z6&gy4e%5&IxNHGs6zTpVF|lkuc^W#(KF`Vu>@o4%Cjd#^H6?%x$I`2lRgO
> z=?vnAdaU-B-$&>BWt?u#R{M|e8y~=16B0h~q6r^0%juBbA9T=0{1gXqh@~Fq+m{y+
> zoqz$>a~!ynANajPw2Di_e#qHJfJW6BQBQig^y$EeTfP(AWR!g}xKEkNXE^tHP~|g%
> z`>ay=T*rMLQu$oZeeP2E+`xTs7B!OANci+#zKil3 at w4J2$|!yY1$I%O?fk?$irT(r
> z)MZ>@<lKUH1HxRxYl(WWrX~k6sW)B%if(uWzIg2hz9GCgi&YhF`DW40UVC)?=(^D*
> zDP~qb8f~G+ITKAu3iSQ>%5E*W>#X)<^yeASYCtD7X&24PQDe(-;)T(Q^-8zmOD?2u
> zoZ>TD4#qj~Vqy5z(=Sa88_DN$*++ufR))jzo*2UIJ?LI-!^X%N2QE#G7Do at p0+YEs
> z?Y+DZ`r8zwWCbS}r at UrNZ@`F-mqQZ{tb;27DUc=tuOsK1xDV3_QkdNY>hQP2zpfX!
> zM^oSHfZny#m`?5kBK1&81t$rS-l^0B&`QJKQ`gJ2&1j`wT;B_=S4gL?!uUUpb6NcG
> z$&Sm?XwZlxMKleb at HrDo0rXYz1%47*D*plEW8}52mqZ^Yd46F%h-ZSM>U%ZlgDV?&
> z4bZ(;VS!6$Ocziar&14Ug0CL*)a46N#4Yu(oVUD?>H~Sq555W*B@&`3E?Euzwe#1Y
> zbwr2XEhc$>pzMH_kBnt?S&n5mTZOvA*&My=F|;Dpqtc2oxI37tu3z4YJpPq+%-j76
> z3`id7G|m+*A`Fz<gK`snpzN2nL;G at KtVcP;Gjd6LNi9Sz6K<tn&_YU%!+kaVAYQIP
> z51QGq4z5Ta<!=>}j~P9Phe`dD-+NzoQ0wT1{LE}9YtWK}Z$OI#CWqTY8YiXJa51A*
> z>QU&m7Lwo46!#&%JFthi$E9P-gfYSbu`l>18NPdE-xXqC@;^luVHx#yeHYCRM*^gZ
> z+{16j2&>s4`G)(w;sfa-$IFexlVkvo15B!4*)32GslNjjr1Xul%+c#KWzc=c<uXkO
> zr)yx7F$oa%ARy09%Wv6PS(zSVXdL2tWGcAJq7kT<5=E4}FTI=u{Q~YhkTk7No}@D}
> z%%n$)11IV9moQqnoPi~=*~W}fu#iW4FB1XdHq?)g0;ZAqs57v*4e&bAE)E2|3@~n8
> z{a7yE!r|qBzXa?RZ5*HAF97caK1M^05%4E~_W*x at 48I5X5jngQ!rubCTcWQa_;tV!
> z%i$WphX6k$hZ9@}_(3^*3E*b{?~=m_ejM=5tlw2OiK*Yx?$f96duV@#%I7oqY~4Rx
> z?EkGM5C``LU{rx(|3DHT5zr2?pO6FGV}Mrx-Ylj>;5z|tLV0Pl4<Y<^z#G9g;rR0b
> zSA0V$AA^QAus9#^22f9t<L3fiPqRo7FT!Bn&Z4bCj%$<voy{#7*wZ2{t_8kh{qgu8
> z9SQ3vhjoUp6Ely|+1VMRfYTjxT?D7y064H1<0WYKzk)XIHAQHTYfsz$y^8jDF;%o?
> z-~8jFPG-LV+7k&*yB=`hcX)#sv{NsqZTDk$E&-?1DBlw<qkTjUqkK;k`-^ta#)$#@
> zOQ3yJ7{F<-1MSCug7%ZDd|yucK~=sdiv4)L%Rw7 at 4z>(+Vn at EqK^u4Ak?($2<ojL~
> z?a7zr`?o6ERKK?%-(Jwh8ksF87__~hJ(kn%dj;+BKSTTGcC=GP8))wZ?F>#EFlg at u
> zZM+`D>ziq42X6y$32HHiH2?Oi86bD2riW-D-qRQmUn|$a9>ki0IM4 at a@S-cP<2}y6
> z?ca+1)ig%8Mrd&UB^tM%76<S)dPJfz`tO_u{E(+d5PnkZ+m6Nu5gJlHVi4yQIUl=0
> zW2%#legiZ*$@$og at cm-Hb~OITX{7T~?v?tIhUh#*ZHT&gSf;a&(~;WsVbsW4nTnli
> zWOU_aIboo1ubh*IKw%o<2%rGj#B1asgfEKJh(x0_LPM$%qA^p>#e*`9LQX@<#e)bR
> z6R8o2#-s=hsYZy#^>RLTfkrO!kp&u9G4OosLU{j3jYu?xL})1a=pyH1r%a<Kry=EI
> zCuqR3F1W>VIVX-b%02KJ;LU2!<+c_%>}rI~&bpbTrf97wb~4*Pu_^;!u}_5(XW+Mf
> z3L}WZtN#k0x3GI!L}!M98IfSNlQKPMa-wJW6GTWoMTXfLRjJL4q&63+)yb)S##7rP
> zr}i074Qs03;#Rb(Z0G^h^1$0A_oQT`Q^?DP`jf-f%VCKKn*+&1QmqO&4+P=}0zX%Q
> zGHgRd%AwG`UB)GemM at n>p<JM%Tp&~40m at SXNiyXfpnOx-?^YJUmPsj%m8x3EW-HNi
> zaXS_qJeSIid~HUIJWxm%2XJ_k3=aZ5>H&~wJlsMf6W|IN?m at i;Ff_V6+$;<f9Dvu$
> zuqix}p|qQwf!n at 88y-WPF@QG#CJ7$`ACkn`2>48RBm-Ol_^&+v0Koxx1K at WkKBWP8
> zJ>a9%F5tKkbZ#Nq5w823w|EUna%(pD7Ips>aHB;h%XvkHPXb;IxL$@&0ER{|XFtAV
> znU-*l1Fi;K?jI)h#aBt;VYv;iRZ-uE*qc?<F^1)YDG~L at 0I$UNaTWD at 06!taZzFsO
> z at dKp<-cFB{XTDM%O`#n7EyQ{S7&Bz}O~9`Lo+QJ^0Q&$t at NJa+jsngGd>G|HOG=!Y
> zbG?fCFctNW5qqGD`X_*sRn$)b#`quosfs#{5TD6#6T+j~9z~nEq}jnDYJZIAb#u^u
> z7||C|`>RH?MQ1o18G#o4wQdxoi~)N+#fbeExG|n^Y>X$1j>)pxz(Zf-p^=ed(MudR
> zM#il}D8>Mei!or)GhsQ;ai8F!vSdf-BOI5>xK#*+)aJO5+KV>HxX^e4TFXNt at _5n8
> zcDTzB3Q5axA!!$tw!>Y-LnAVDQE^!6amsE*>ebC5skdlKSWfZqaf+NmIONo#9Fi?O
> zEy$KdH<CQy5ahw45$*fpqQT)=CE5agaS at +UDt&R$)lyE`F@&QpF6vS at N}6Q?MqgZn
> z8(8SODV#p~;vya3qcV&c)xsYDt7bt9FJe#Eg585+oG0wDvqGjmn<VbSzfoSSBlJXL
> zHsDiS&*nx?pX)cBGn_ZUpP(^SpCI%&?eU98ZP=F;U$=G9YaaGgyl%yg-A+L`OWNDR
> z at uz4Uio!{|?z5Qg5Z+PcE|%$!Q->IO(TP-wqrp|po?7U8=OZNt at h?ib4QXM-WMgEw
> z67UwlV`X?N;Bvq;AEx+Q01K4<k#_0p4}{a#T-QE*V~=q9+U?L$8NKVs8XDf8(A2D3
> z<vAEvlA;L(*B;#XQk-KLR$eL4^Xws;qX#yk2CU*hk41C at Vv*{iO<LFdP$<8YY4YbW
> z&5_}g=CWccnZAhqjjxrUBeaevibmXF))Cg|aH*<3gwFu$2n+e}a&aH*5lN-0YDRcB
> z#~?HIJ3%dx#c9(uCoyttMhZo83ZF|U2xFua76g?P&|*ko!S_lEvd@=N3V at Kpg1=ps
> z!f}5gw6k<aySu)W>1Fy3>xk1R!Ghz~5k9#Df`ik4!#ct%mq7M8B-3|PwE*Lf?dh|4
> zf0~?kZTs3;;8pSt`!<yKol4$iAB>Jl?JQV(8SU6yjYnQL<7^0Qu_relh_j||(neO#
> z at xf%Yps$VYCebMDk#vZ0wGGCszM<3-^Qus8iY^3Q!<sBxsDFde0po3sVIk(iD}yeC
> z<l1y0YtB|%a7J)J!<s|Jtf`>^j$Vi}4{^+!L)K~C%0ls>VTaZnibB}H62#A)x+(;p
> zwSWg5iXzB5Wrr=)jr at 45YeMlH4{+UX#JX0&swa4G-EK8j{cav>NEoYr_aO~p4OOrX
> zd64_Gmo+ at M8OZJa;NF9tmvDDCG%Q$XoflIUyr;p__BZU&4aAOkV1W at D1N5W-)&UDx
> za~XGI4PO#~l|}N8g8RE>k=$qj$h(rSnpevZ^x!4uNN3W##_^%qWO$8P^bSG$-8%i}
> ztjM5aId~1lq at N*ZzF+HTGV8ha+#0w;zeb3~rA at 5tOCA%g0_H;j6WotLXED{`#R~>F
> z9k+aL;3{tYhtf at F%}AS4+kiMz9D75I??6n?Wx7ySOz2vD7v1fmmD(_vfV1VdLz6NC
> zXU%_~3!f6i;l97m>KRG}t<#+Qh}wLjhFj}M5g5~fal7k at Se#!&JM}l%u(zSb4N3R{
> zbFi9byHKKwxh1Hk<DRXQ&yhTzE2u0H%1bwgh;lI7%8a5+b%>g3B!nnpmCPynWQsVG
> zyL?K7+V9$x?01MiRHn4FUC2^|pawamT8YxFcqim?O6|%+)Y8<{tWQXFVch|#K&|0T
> z+NLAQgTgg=>#JANjFg7x4Z|ML47AcxYO&C9>(VkYX(?#Lgsu at 8ZX^x72yVD_x5ObA
> zwQyGjjKpOZb#QM9L~*wsZp?DoM;rpj-nxp)#3AtPtt-BZP6GdR1s^662ZH;$f(yTo
> zN&*iif$NgMb+j7=?HOs(irW5mg*-UG<w1|j<iS<{l|1PAGxFeSRUajJ(5pjv&^z3-
> zWqHs?!Q%2DxkGti31i9fAVtCA@}O^r@}OTw@?d at tuP>wCNgm8^k!1twcK)}rY=AtN
> z|D`M&&}-+PQ_F_=pQ&ZT{15-fvf(a8Hq76FGdz?NN at X+ntG#UK56fT(Rb<2b`-umy
> zkPUsnb&FN9VX at 5Fced*%cY;TIsAa=^ykK;hY*^f(Y*-A;WHrrpeTnE^)m}EtzlP^i
> zEgKfQE|(2Nl_UpAF`m;%Zz764+slUev|pykh9&JvwgmB0WJ-6n3%Ls+SGSi9^FF?k
> zQoHgHwZ3X<9m)ox+$$^_<~@HU%}8m89-X8o*>G1o*>D$RLvKko)U9*|=53N?1LVZK
> za#=P&PRuKlWdr2IycGcxmj#d$^X^v5iFr%Za$?@XUqMdzxSWW+Oisl8S8^i$XXHeJ
> zs_&AVFn1^?62m=SmJ^*7EG{RybSNj1!dSAL=&E3GInk{{Inli%IWZS6G>7HH+%FV4
> zG51qNPR#vKkrQ+OqLveL-&D(qxv&3^<%DVuG1ntv1|i9bxy!+8?d1en5NszW<}M<B
> zyh2WN1_zd^<V2~=<#)I1Gk1euW7TqEu8pX*n?sa#C?`sR*+osWUB4o_aqZ>A+^#&I
> zYB^DQg`6O&NouN*o<$Vn+sldKFNtDg4sl1jlHGy$U1du5v<tZhAqnl}MDdX;DYYvP
> zQR}9r)}fpr%I2_~D5m+}Wx0!#hUj&d<-|Sh<itIY6N!qPD85gT6UBEba-w*#A}5L$
> zDsrNDu3AnM=c(mHaqj;@PH4$eIqki{l#-4;`;BH&7g~|SZcU)rMSTN1P#8~($5G$F
> z&YWHREudu569kMj3o5>f?<9HX^f;i--{3qD*8z9{(fWV5^HOb_90wurWvZR7Re&LT
> zg`E8(#A3u=;|vrv%Q}lSv_Dq;F?{|m`>c)lK%c}@Sx;Jyq7UTo^^x%7vd at Ny&l|`+
> z)(|vXD|(e`8kSRZ{tTJU8cyd$C1t_EQ+`@WS at zl2F6D=ml;!ZPO3JcNIqb9FN^c!5
> zU+&2v8=#s2b=c|D^b-fx%?UvI7d_nUse^o?6;9C(s&)8dMpLwzY8`I0K+!sqNN{6D
> zQ?!cYQQaKW*HeI2;H_K==??eZ&Cn+Dkmms{X)c%OLIw;6Jes%-G4Fu;W~zg_IpSQn
> zM}pg+aSLFTQIsL3qHVj=C{{F>biDyRclQtINk=8#4*z6InPcAus7G42J|8<uVS{Vw
> zTI{E=r-d;#yhjw!Xp7l3;y~+&9?^AkXq{Z7%N at Z+1+<WGHfLZ?n{`BHG$81Q0DX_!
> z>`05+Vb0feqp;sRm~?A_?x#|Do_hd4s(Bq&U%I+E7qP~l^NHLN&vP6<?ccKJC4JnS
> z<7BhwIiJ0jO|Sb*$}MEVVqoFKeV>no0XFjxoRiGlwptU=Sg+d^Ee at m{&Urz~UG8<l
> zC_sOp+(9dH-2qDPaa9iYkfkWfVW2ym!3p#rsf{@GnT8%FvT!i{2+9IK>LYX3%Bu$O
> z-W-qI<1qu6vs~`+;DI at J$vqzJK8MDC)Gx5n@^cm<4RWL9=TQHDo<o>t&dH+{!OwBl
> zoW%-f%~_~$)||NtXU)L_jl715{tPu|&6%ul)*Pprv*y^^bJm=0GH2Zd8fJyF=ENwR
> zHAk;-R$)-#til$VvmjXtzm-Z3J_BbJ{`0@(tit!zoK<*2%~^#_O1l*v?wGR*KT>m6
> z;d5%vDy&g+R^dM4to_ at r<gCK&KgU^xtJR!U_<)+T3hz<n at Q#i-t8iUMoK@&nIIA#M
> z;jF?*3TG9LRXD5Arsk}|n-tC}gymL+vkKGx6K56XD4bPzlfqer*DIV=I85QJ!fVu=
> zRoGYItioPu&MNHMp0f%r$egv*87TN%;jDsF5@%80FZe*=tb%tG&MJ6Q<}C110d{y5
> znN{$L!daWQBjhJ#R>4zh&MJ6R%~=HxEA3XWqhro0cvj6>1(5B0+~P8;V7Z#J3hpG%
> zdbZ?B&MH{&bDUK$OU+pYQ`DSQFiw?2-0AE{W)<Xj#90MH70xOcsBl(6io#h1S1X)V
> z&{fS at 1@Q`J6_92=BC`rK|B15-k`&G=h*vnPz@%_ifmY$H{5Cab<$temR{qy&&dNXE
> zp0n}~$((hkGmu}ea8`aTxT!c0MWa&w(+X$hKdx|A{vJhU<&*v&(pr*P`CApv+CU*c
> z$yxa;)SQ)nmzuNk7c1?Szp!J@$`{m}l|Nn0S^1OHoRvR at IP00;T*+DaH~t)F<quYK
> zR(`6Qv+{eZatMn+9dTCvu#Pw at pDCP`7f?7W?>mLF^8Tf8R^E9vXXTwyI4kdCHD~3$
> z_n$Z`@9zp{<(*MDEAL~4v-123XXTwxb5>rH!dZET)tr_0QhUzI+bnZdsWXtbPT{P)
> zRkF-l2><&P&dR$-;jFwn6q%LxTQz6p&6hc=8|GQqUH at s$%A2g_th}*m&dSSC+AZ&<
> zjyWrDnwqonpf^=yRvs**Q>{z$th}DYS$~MVlC$#SevY%;K{aQ&FR3}p-K^x$ja!!;
> zaaNwTBhGTat8kY4ZH2SkM-<L-H!7Uveo3ldX`bb-Q#i|w9ezb-xu5(`oaH{KaF)AH
> z;Vk!lg|pl>3TL?=Rdbg6VTH5YJJg)z-qfD6+;e5l`n at yY&R00gJwxU!%y8W<g|pn_
> z6wY$n70z;FhhLFd?vV;-t)kt_pOjhdzG}{LU#;dWH+GW4GkAA=$DHLJpysUEKd3ot
> z_IGN|n*9}V)>EHd$yu{c{~Tw{en-t&vyZ7cYxZkO4rjmIF=x&8cf?t<s};_g?NvBy
> z_CpG1&4x8tJ~PJ*em3p at MP~4`*D9Pf+oR^J+4q677-0qG!5 at 3<v+v;L<`DN^0KWy)
> z2e9uht*p1xiiq!TVfT6V{elmW9oX9e-ECz(#GP0*5;ai8>}d8_PVvUVizaqK at 0wT2
> zcD{(aXt*sv_C?Klk44WsRvRla!MdjPL_F~VZoA-K9j)T92igsHb509={iAYq!VlOp
> zPq-omtS?9HMvOGP8*ybQ at bzCHG}*mO*I_6-k5IGdgDrk at N3>(V6#8Zs88p}f)w^&3
> zt<Ij?WmKpnWfb;5>r?CI+lK*yPjC;x9_tYuQi4r}%BJ#Y##pNVYImuYEd48f$6-xm
> znMQ%{^+)3+i)9Af7m~0v{q+4cR!4HP>NK;Mir1%bk_ at ehdY!df-<8EFHz<+}EbauX
> z0+~PHw4)qm*9Wk}!Tdc at D+Y&o%Lje~@&*5s at Lw<Z<B_8%N1_?f2EiYN)J+o324<ZP
> z`$BXhg_UWOipsQlCPc&TeX5Pk>V&;y+=$W`>of%UTUV7Gh=vO{IM8NU&Pz47NZf`T
> zE~yfa=?U@&Bx<~!qp6*-x6C+C7Yi1|yg|fGs+vK#1#lnTCBgR&`TIL)JN4xDj^sCT
> zM$(O(nl9dv{6@}5 at DT%TW0PKA<XP|6;eWezUY4oy1afmfofQG~!RL+$Mdx*!=J{jt
> zFR~K2=K2l!7c~#URb2Jqx%n5gB2K?@48))LHRa~XGqmUJvKTF1Sb)Hdo+;rs at aW7u
> z;(i3`xYdOCA4t8BbQv?>k$NFC9#}EVJSNg9c at yo~!KW5Jjou90eKHci*JR+1T at IB4
> zx6*PXHxtOsInAQiE3fS#2Y6|Z=U^G!rh2?PBv at oz3r_FHVwcWJ78P;6U7#;uSXSg;
> z{ecRySp4KN4q0Sh^MQ)+y(Q41T|S(P7m9FhgXfvo!5r^!8_P1)45#m`=$hf&H<v^3
> z4dAVlCnrKW;Ko34uEVTh0Xyj<P(udD1=hSy((cj8dhI7T|9nGQ{~ueZUL7NvnagUN
> zP?u`W*r0U`NeJ<?BQt_?>QfP?)se1irm*!|$FMf(TnP`WqtF0ufh1QwNxcow4~Uln
> zOPeXlu(Y`s_aEw0+g8^e4GiOYs8VNZkKC|!YbIV@;JOCL$e9*-oP>^JW>0yXgbre6
> zk~B`Dg+~L5i;R@$b2G7bk9jspxBH!e8KLI2xX-2Y#!(xWuyov3u&^53IDqxbc}0Ne
> z_M|CRk00FFLp8-xJ5<+^k2nB+mT)+ at gDh>B!!X?7gb1#c+~M+ce;w(UifQ6lu2*aA
> zekh`4!%3AHTc8~+4j5?tFk?M&Bk<B$5ujDlhz+O_&<ZM{9C`@wo$#j>1NIR)?(O_s
> zK~E7cw0bkde#nsqFYK1oWXPq at Ctj$Y6o?gys7^p(8v5;Yx{HO|-Y%&G8qvYxN?{dj
> z7w%lF##u6k?;6yQMJg at MK)?;2MNKj3RvzvH(z|1&(e*|tjBq0HP%GqCZi*ny8Fk60
> zQY61+xHqZUA-V4i-z34Ul2YzQ+yaV=Z=w9nmvJjAdsGeElat>pjJlu=m>sYjh<gYv
> zpi~Jfg;$2O(k=|{x{W=c<M)kL(HFOb__q{aN=ueudGxL8RW)!=&be&Jngp48fT-uf
> z-gTu(9m4l%%aQsIfmo{7=}&^zOqtenN|);R*Q~?;w(ckoX<gBSQ(72sHd#}QXB~Z_
> zq#K0sboxWH3E`~{OVnvOyssm<C7ItTl*3V$e4;~T at 379>c*qrXPUS|O{D?Zwtb-le
> z718|eAFr1KQM?V-(id&Ozi5NCm$$(IJ#PcFaHI`_lv<<>)FGjOIol9~O~arjK>v7w
> zHmD=ng`3_M(MtBPlHei;5?KhlA)Cx9H*PLd9253F1-Q|pB{yz6N8A>b8 at LgF(2TgP
> z<d&ojNt&9ti*%Z-G%(EB+Vv10N%^Ue+^zEL5W3#n4f5;|y58K?^6U`0-rSW^&&Rq0
> zaxiz9)aRvDNbVifyJ>z$`rh2z+E%w2xg at 8vMA)Zk_Ds at 6o%_Ei$=B4r85qXzDM6BV
> zT_WwGAZIxwy}3W6bncBLzoosR-0Mhw!%byNBk2t{m1PjEa^S{k#N58L%Hi0M>bX}p
> zm*f7CEY)+9n%5~(o$iePXNmsUn;lB@;gXC)8$x<Z at -X7&5<Oh5B+?{=CHi&F)}(i(
> zazY|QqECC0N`sSM{ovk5?FhVdRs!fDlD-7Py`5T{hd{bdqZ>Yu?i_}6p9a}WlAXi5
> z0N*c`@RsfeOM-!EcT2MV8x6^N<Wy6Wfxa`Htl^QAe=P4mOLRpd|5C|>lxI-N=$Y#K
> zfN=k3=}vegVPyP{CCslQ)eB{b{6CcLvK;#XwY0Pfb7(7#d`ppMF3BX>FUkF>f1oyy
> zWaY0nUP`t4pKJ10lJ&EGiL4LTk)78Oa=wY=JdHBp`jUA>HR><xaMV|~6>uuA7>nDF
> z1Cdc$ZmkgI#NLImDh-{ERJWHvIuZ2DDepyQ{tE!T&3h*1{cs;q+ELBXzpPC`a|SOJ
> zo&M}eFJ{Vhp(_7>*UF&uvm<iQL^amYEGQUF^%HKTvEf#tUi*t%Bp5 at fMn>k#S|r$s
> zw at 6p1MWkLs?SlPT$oDDnVg68R{+HGE|F&+^x&}=@KU+c_{`_p|XM0c(V at pSEBk^sJ
> z)*?&oxD_7eTg3i9)`x=eKigsnJTKjqyoB3``VUspSUtOjNBR)<`CWsRKIG~jZb^An
> z()V(H|7Gn9>by7oZ`&F8Ki`LFzT9yi(y05;gkQH0X at 9mwbkrhvJ8cVb$K`!!^6laF
> z3D-Pg|7xo?sh<Bk`Gh{i{zD(an}a{Q;`sSKr0=+G<UT|ef2fwc|5y4Dr0LH{J+ebY
> zd8rNOCEP|zADSee|HcdveQ44;r4LP_H7TD@{C~6$!G7XT^r6IXA41*u!gV9@*sm}W
> zb^h5l=_0qu$&Px_#G~OB3fKMri at nJFA9_*ZFX}}}9k-6$i at M6SbXwIq|K~=cZtYr3
> zwW<$xmsjvh9k5ql<qXcm`h4mC+bepk0-~{^r}K(@MIWcyNt{q4ujsL!o$x5F45YRB
> zgx&J$9xM6 at Rr2Z{y37f*gNBtKVqx7sfwb~i_W{C*tqEm(%|{SUlucOPwg$GO7QiN7
> z*RS6Bu55SA7P3~Go at V&!<oBy!T{~q9z4wxV&=cjbY|2CNn$1_oBVi*D_I4!fI_wcl
> zAw2=dyZ#ich~k_fKh>#uSX!k{xK&=AQ%>hdt8?TDJ5Lj4$?J0}=TvEZPV4pw6Pn8j
> zm*#a79JGIjH7sLT(@q%Gyk3T&jh&F$yg}CCLrV!bR=&S^h|a)Gz}q=%l274wIQA}L
> zNk2+!=J5g24Pd`=u0KXvW5chRe4q~ijq(4G>KL;09YCK;t8F at IH~y5Qb3q7p*~h;R
> zt}?;m7rh83G*s}fwV^^vlcX(DHQ<g`KfezDn5$>qyuA1uU9(oSp6Vy|-&yYN9>Oc`
> z%je^ksS%-Z%Wp;Pou+m}S#jTV{85`l-^pe+bt=60!&<AkyfekVpqqi63BuTON7Xq0
> zDLK9y at t=p)8oVk%cfvV7UYTEB4E@=5(b}y2Mu${S+xIrJ>{l}8XYbFj*T!ZR^}@{v
> zs-tjzVRsVw#Xs^(l*4<3<LA(h-osO<-MBy2JL9K|{iL08evY=?9^v at kLW4xwmF=P(
> zG3V1BVU;EquTD4WacfLp1>Fnn6=oV9A)OX at VSE}-!Gb-~o0qS~UcUzUr8IGuTTXKk
> zVqM*CU-HGszT^uC%b+y*zT}I5uJw3%4&*(_aY3tbmz)PH-mDDgBh!!`jk*^r&fpGi
> zsZl>R6uK+ive4i0mc<t>D{I`)_r`rF_e1dQINbl1@<%5p$Gs`{TyXKYH{>3QUO4Vm
> zxfi1kj%xtMAu9jH7(g!olC*D~$W{Y$ivw{l9U7W(PXL-N_7!t*ix)es;~r`IJ9f~7
> z%pw at ic5Pv{sk=0p#b#!kmZZs?vc**4agUvT5&JMjt1TX%XP>8xUf=XA5-z|RXUhw}
> z6Y##fv*j7TaN4HpkqV#r at aY7fw=&oEV4fmau5Ee24L`i0`pjYM+vzM6YYKc||N5DR
> zibjtGr%XR~BwY)eFGIQrK3GkSf-4>|kis+7f{(&LlMT^(EVvns(7_=Yf2S1dxwq@%
> zU}csKz6h97+Q8|xJl9ws3oFA#$a9JZ_FS`H4i at ozCvto?_+#N(#J(G}9gY#O?re3o
> zJbTpH^8CkDEYq;dWEvr8&K6zJtuOLxAA0SJTQBI$xJbv(#eNF9R&J$nAnaR8HbYbD
> z2V!)-13LOB>_m_i!@jWG*n2r%)Zp5r#q^DY_2Xf`ll;U1G6qg9!-^x$3p)eO6M at nI
> zPL<Q%qw^?w)9r#WyLZrsel5F0T~+SePW3&WLZ`N~<AOfCZZO?tVNbg<gnON#keT*_
> zfqMu$DEDR$4IY4B5Aq`zb{L+6_3QocyB&L=iY>?fu;n;(`EOOJa<`nS<o=0N at hV0r
> z=vPwJ^pjEzo|014^i!ppA;}9$TfQeeLwfBKH8_Ch;WkwsxLeMH<o<~~2zWmxxJ}6e
> zOO^BRuw3#~B at e-`+m(DEPj!(hRqm!#$uD#p>SYn`Gv`L~If!E{RAF$poKMO9bNL+A
> zK|aTHkk5zP<?|Yz>H<}&+}$pp3x0wxj-z(;s#K55wG%6+dR$dIu%X4z3t;zetQcvn
> zYcU$dz_!0hJdM|Vp at BS5?vK%z3MP!-mdfT6`noff&Hf)F@#)R(*hr0CTaOV3y(8Bj
> z6Y(1?`%QD~f>qj-x at fsq45=r1T6)Uj>w&WNnfP9I+Qjd&Zr=7p+AX2xv>C}~ouMBZ
> zBe91fcJJl$<X-2Jzmw(fB>v?i6y*o?c`cPeDgo)N50t}7urICKkaLjPdc4g$;QTd?
> z=IHoYmo~Izb{Cno`4BsmVC<Wnot^|cv)C<OMHYk8{k>GsaDP`7be%t51ugVPsUR0@
> z)Y2;p7D}zo;z;l8EitbJMe)6Q3tl`-7NoNqn}U1mtzNtp_8V_WN>pf8igs>|2XK*(
> z1rY|f=$PD`09%fuU{^s`BkC<I#$`*u2@|#wJ_$*H$<N_pKAbucW~G<}?w1a~VL_c_
> zb-|utWx>6Qzed_o-(yS3H^~$l9q9|1Of?FAjiA~nQPeXT?qp4YjoOrT*8}dPPiLL%
> z!`RB;9=wf0X?6leC&vg2v!%=;ssxXx-FIuh=&pdr6CA7#J}0|p^01V36gCrKvmNQ3
> zER}`Ulnt-LXEuD?_EC&Vih5!F;O8bkO0OT~$PL>HZj at 0v0q}~WlzD@%%CUqJ*ckxU
> zQosV at 2{y}lQ}7js*;E?b%>68EwM=;&;MJhKnkeJFJc7(@HP$<pU<qFX at K8s07vnj$
> z at Ent$U#2h>IDUeO!VIF|2Zb$Gyl`yoV(5xh#1?|dra_XGySKtJVNl)~+={TRaKlb9
> z+X^aM?a8o|F=LjwmT at 05t3oKO9^<iC{4g#x%kG^)yu9-m#oCFGo$`p)FAUqvC!@LB
> z!gf0P;1mUHD+FgaEMA<0kmJNUu1c+RnZ-)L*nMPic-hlTZ_^x2g-;xEBU^d3aXZWK
> zF|)(KSqGeTh;bP3Ywd7egU>FqFp1DzZC+ at h_gwyKqY=o1wVw%ZN}OrN%j*&Ax{2K4
> zu0T695x>sx8 at hZYZf`MF%r4ybfy;c8xbOX!`F7=0R}j at UZmj~nDr^gK6LD*e2%q#A
> z7g;O;*AxI=?SRqu;HH|@UhoO`?OQ`_K85-vT6hY%ZRXP^In+ab-ZhT&C>Q6FzR_K4
> z)_B+OUc6?X13e`anlWqY%j_w~J_p{24dL~6_frnNOD9;Tf={M)?V1EP!J$c^IT1I<
> z2}5B#31%l0Om;%=Vkaa_*)3yAkb+6Du3W*?l at lzdDY?UGa!A3Xm~5(o$)*x4rzyFC
> z`4LNkFNMgMcS*3WOu^KZA<Z&5P01}|N+Aj+!R#Fclf6T*oTlUsr^z7&lVa-Db4(lR
> z)~Z{N=Zx2f;)8!rN{1Ui$Cz3ce1BF3axDAcwcZe3?7mBanOlZmOiG8eN!P7XVBIRn
> zzxNcFy@&7(3as1UJz~v3yAF@*T61LI7)QF%MY(=z%)T+i2hTEc$+;c()EMN|qm)wT
> zAy}>-$<1-l?i>o^NiaL9V6u~_pObR^NNyQZ3Q;f#)~!=8b?XS0)0EudG&!VTQcRYo
> zV6r at d<uoNXFpm)*a7e}+D#1EY!PJRJQ<T$`+%l#VqF at rt{0b%{EMPfJ$sJCULkcFv
> z)Kzdyi4X7$ovuRWg9@}-1xf93klMNmJ$|xGAIjl$*dek+HwTXgKL8IDqs at zzHYQlN
> zS_;#xCbtqsFneFdd!O7&7z3=^h%m?z-A1Ij(J`tqJkGr+`LS893`pxekSeqERyHd<
> z&V{;R1mQkp at 3+LZf`wt+KtDaprnM+AOP1ZUgXbL9L5w&b<0^i^J&tsZmCG?2XJ?nB
> ztbpAn7mZvp3|c8#L4jE^<YJNx7t$zVkVcV0$ooQ!JS#Cq4Tj7w#5>V+4#uLhx0kUf
> zm!12jM_Xl?Ial_(MUu6EZb6J&<j at ouc1RLe=Rg>&(?=w38N$hLi(2NwZwvX!I9t&6
> zTNK%g{=$7^?r_WSE`_gjyMVDv=19p6zIqwFEQP2rDb%aN^b#y%O71Wwhg6sZ*QhXS
> z2$nG=cNmjHDolbaRhX3o%b1cIm?VL99Fj31fjRt;3iBagJ|tsG?l2~YRG0)ms=|Df
> zU>Q?#hcP*%!X)@<jw$uLr_uACmV4gQ=mSr;lfc|Z?j<CF3Ermk8r?R)53AsZ0Y9dK
> z9|Qac75oRlTf;IK^tK{5Tf=e~HNs&@7Kb4@@8e|nK~<?A1one+sU<f`{Vdfqhg6sZ
> z?^9v!BUr|i++j=(sW1tCN`?6p!7`@g4r6jig$eloFA`a|Ly^e39cbensx~M15m_QX
> zLT*(U!B5CxPmo&`M)0$;M1B_X<Jrq3GWof}5?SX0AG_2NS at KaNvIHv<ISi9T=I$wq
> zMAl6~+EWyX4A`QZqDbU09G1voI4qGld`gkXx>I_y?vx^tb*JQYD9PlpicH2S>XUo~
> z8q59DlTXTWHxDwD{G5_h=5d at HPLD~K<8(nB@*8Jgg4ZYbj9530V4EVJA3z-Pt99I0
> zE3KR`Cx%}w%3F)ol}m054&M^>^6B8eXJtUrB9vmtt>fmfOLu_xi)lM(mV5yH;sE-^
> z%!vDLSw`~^xnGcUKLAQTE(1nv><UUgf*to^HOxnJ367-8LsjV#+ at z8qO$5uBk~^GZ
> z4yiB+enEx#0>Lt-<OU|6cXCL^B&qiT%63py)`JAgWtH40E0^#blFLdG{vgsgtSaka
> zg5 at +NcQ{QBsnR6)m at 2o&2nHt2PmZAlk2ywSrd&TO#Z9v$?jz5V?vmjbWte6!F9PEw
> z75oz5*HrLpfZtTXZvuW^(FN$9M~R<zSonOITA0Hjl$uLh4yhy`!3`>z*+8&dUy?hF
> z$srXc!HpbK8l9l%*EM2|-W`2Za^En^HWc$K2`aHc4`E~DWcaAn2F*s!R$5sc1?Ev1
> zQ*wtfIi$h_3^^Ua#QYergekj$iMc3zDMZE`D#4gJM=&uTwqoWi<yLabm{N#>Nib&4
> z5lqa70n2Gh?r at qMQZOkdX3h~z%#ZoZnb(ly4yVZ>1rsq{x<5Ls(amUy1!%)R5-ivK
> zi!%JO9QHE8URH$>{DvI%2Dw#X1iy_i=uvcUBR6k5=3wS5wakmM-&EJs&7n{lpsD&&
> z-Bib9Xo#RO3!O^>L_Q@;+nC~Bb$Zs)GK&HW$+CM|=mAIRAQoDQ{7yr<(?V$um&VG|
> zo`$ri(d>Jc4YOvrC792^1qFtThC+$MF5PD~>nA3nVPKrbXTbRkd0&Y*gAs?|L#o<7
> zM6le#k~>`698%TxA>{5$#{|5zLFFv5P5sV<Jb#I at e(9Lg65{poFO-V=R9>_$>oZ at 5
> zz6xdAY`6<y)qRE3z6zB9kGm?jS;uysFZ;jFbCm&JPuIN;+3<R>khExUo8i8DmKke3
> zxCoMUP(umEZ6QmR_EIA3uXLZabj^yr9$&0=#4c;5?jgRbM>c<N9wQk2-%(7`&2H*j
> zHTK*9;KZIcVU+JWE5%ThS!~q8&TJ8&d4^?=-{J0I)Z-mgy}L&=UIKSmED71T73h!4
> z)b-K0St!~%qL-ES%sBNPLe$>ICcIYK2JI2{ucO5N*ekn5w8M5Z_MDQs<5l!1tXHmW
> z)WKqP0(NO(ztlsTUr)p14FhB?u*V;#3TaY>G-1Uvfbg-3N_9kT<l+2)m+RP4 at tW!&
> zP{x@<So$_=Vz63DwL&jgImm|B<NSEz40x6zMt;^rLsz8pIP|~Ck|k703s{rmrFWzB
> z^4COPoB2EbCC#7&e-bTyPs`z7;M>r9mf6c19-*%fUx!(b_lwGg)Y#zCxy)<F*4)B1
> zVp`<m5r>sQOD&87%@~yH5$@-5K^Gokv&?Hq&-e(+`G_MKx2{N+2;G^BG`*Nvu}55%
> zIicYDwu~=KSY?vW9*i)fpiMCV-Xp=Fld%dTyaZ!}p%p0)3%(!xT6XV6FDsI9W8k+J
> zxO+=72p4&f;oxyw#z{(vhepyR$g9HjN^k_1!x3Bwf);!}mBNd%?Zdb<3M<{tfcHu8
> zO010IFz!ika1%*CxYOA_#~_`gM}Oa8t&>*Q<o~Gs7CaCsmEDLOK1zO4{>v%<9G1(@
> z-41Ih^iaGm2!70Q%d9Yd65?ZB!?4bwGHfM$4g;U+OL9xN<bGUEm+&5!V8Yu*cpMHM
> zC*7jtwwXVS#=X=hQMSiX)+bQ*1eDzf_z4+q23(}T38)JL)ddd^&aj!ANYBe5MZ?T}
> z%&eMt3GQm}5!}d!`5odRf=vh`eYXkjB%Aq5qLPF(8>QFG?3S&PcA*jBjj~Kxg*c6;
> z_B2s{<M(XfFTjs(*$e^C61^dyK{f%UTSYS*DWTK6AI8%=iMv=$4&uh+<uyt#{?s1q
> z74_|a8pR;Zd3>D(Y0yhm=KA)jNGWQ^GR+Hkzc%fc(BQcSJ*0$tKPZ7j+YH)&!s~*+
> zG=J;dOb;u~nrxoOblj)QK&{~m?ufT#pq%)^Jp}$5xQ84~bBr}J{cx6P%V>*E!WW^(
> z<<R5$bPe&QHVNOlBDm7g!_D<YL=8|ZQJd6{{h7Z at X(fq7^*+m7&akt33X-s&BNNmU
> zg-m)cFbQ9j_c+Q<t#=%+G(y_YUI(a$>)yiaJ|6ybg2sfq+C8*G{(CCGNtY<V6-%vp
> z>|Ux1C5N++L*#CgyN518Rd$oQ?06r(hrVk^p(sDqTcl?EneHBjt2>IRu0vq)I+W`(
> z*54cB+Ti~w7O3cdt|g9LvnLuae0P${i}Ldpq4N6sli$%!d}L|YPW~RpcyE#7D!m5S
> zW`9C^N=hhNhi<mTW9QYVX9C{LWZEQrsgD^35*FH-S~T2a|EoSG at q*MR;MV&Gx=qHB
> zzXmmwCeqvFybn>y2=vBs<{#-cMg8V~n;KG}Jv-i?Deo#b)l|FGsDF^(sXemx6m^BW
> z^yoKN))&bK(37N{s=vUxz1*kJV^w`h>PPjKaOo(GHeGYsH><uCFRn)EOx_&fb?g;(
> zLhnScuwey{S1aj at 83nz=>axbLx>Q)#NT6DSRRg?YL#3-v1vY<Y6%g_xy{t+hVK?&0
> zUs(l}SmbH5yo-p}TG?jltyV_%X!>3BI0KnB%*-P9<}+`SPA${<yv*xGCf|}z2b4zl
> zq{}VGjr??;LoD%kbuZLL5rmrpx5IY9LR}Qjj7ewrqTCDhrU2eLM%X-HCx{D?4!3^+
> z$OL}Xd*i^ZxXFiI#<|T}VZbSpxgDI?qf=&Uzlh`oXZuE;PcwuL<9tgDouErICZEBM
> z=2?Dj4|!Y*OOMM}H|xI9e``3^uWeNu%U(R#PG^<=c5{+$C2ke147LeE5%Qp=KJ!|F
> z-XfT*cAT at -k3Ju*cM0()sV|wU4D~v}fPGZ_+8EBRX|j!zQ$<U5{N$v}etMQ^(VHq#
> z+&#=cI9ttaO?Y|R)W1#O;jDeQ|6;Zw^y;ZS$Tj{MYqNX}dev-`@m!Bd-)gIHBEmfD
> z(nfP;lt*K2&SK+O7VeXdW6Rhvc9#8vwXmL=Btw#+LRY2Rqa#<6p+^2D84kc at G*o9e
> z*~od5wA!V}ry=xabq4;Aj%C{4@{m~wDd8c<ct{go(#80s&95GQPK!LuLhK`eb480d
> zPDpmPcxT%a+WyfwL150-#KoAyYxzuG2bUf{1AG_Zi+7|GXX6`%Zw9_5w8j_sMhm0F
> zcySyk_O8C8dN|&XZ%r)1`|+)bGo37IEBuppBgav*{d)fWJ!<bu_$Ki@{<%7%YIK!$
> zl7Z<(ya{hl2;t>Y*hxK$7&>Q*afaZ-{{rDO{->uIygoOpg&h;YY-jh}V_(Vht=WBN
> zU}~+V^GcMU<z%5SDv&G2J6rGgMo7lHKNb!7F19C>m!pgtR~MFQx3Fg- at g2e_!23DI
> zhboNe_Jju?lrfIC!x*Z<cvXdwWlwneX$eE~2{3GtG?F-mou^T)!susDc<Ch>W49XP
> z#1ATrjVg>7d%|09Nf_GFz_ at S<Cq751Cvf_AE3r>pv?rW8CC4sT#eORidyXphC-#JY
> z{Y#GRRmJ{eB=%TU>^H<@s&R^6oen<GR})tls)ys>SUm#&QB0><hOY_Vd-09N_da}M
> z at Li5?Cwy1n8;kG#_{QP;0KW0~3iu}A>%rHIZyCOc_^!gYGrl6eUGQCvZxX(1 at a>B4
> zT70|VTaIsceAnUI1K;)dUWM-le0$<sf$!D$uEe(&ad2QFW+;cygIW{5hwF_jW9T%#
> z2YDYlEQL}3VF##(1Fj?9!mBgM_9boqaJKBJr&EUTneIXl>b!(_ at k9^aiZiKQN}rbM
> zj=AAK5U1g~UKUrYio0DEH<3=xwU2xJOI6$ll(@%#z<XEExss*yZ)Ac6 at P5EXa-+AS
> zoXE+oQocotv*kG6!&&*9BWaA6=a_Z-%Gt8}Gold22K>Pl6znK#(PephRF$XeRC#(n
> zt2f?eqk1t5_bPRBe7zViVIW7n{IO3ye;jA%)(>*FcG}=KkhJNv&u at TC&<3<s>?=l=
> zQL3#NL1U{mK7DpKOHaQw+i2;TjW?P7H at kb7vZ`~kyY>9A+J^tXR*%O2N7Z)xe_VYF
> z{y(X9;Qv(h82o?Aur9*)v+A6zo|k$7qwBv0Rp`W&?1}%%%r5xXpxtj(eJJFdoqHkX
> zNg;D?bo7&+%(>;Jikzw~{(o2WuNqsS#aQsQlNrnHtgQ<57`o>J{ti9!8Y>g45-^Hb
> zJvn^TDZ=}vqX%BVn<f`?w?&1vS6Wld)~P8g+sd^&JtE6C4lNRylU;Z3-|f~rg)ZlB
> z!U&N#>(Z+9%qMG at _4_QGnbXH4^*MX)e4>Bo*>e{L=U?>P=#PPGK>o$D-}?=4rQ}~+
> z^@sC)L=EUn&x+fSQK897*g&tSzl+yuOii6cyicyx+bzX5YsTXkz2YA5M_G#>*JmwR
> z5IaBi^y)O^f@}g|Mx at nGVUZl~{GB?#qV-(r&Znw0*#m|aoxefO=ZDJKKAuk>@;T_N
> zk8-D>eEKMNTFR&ILa+Rbx<8!1Dy#SUw<=PylGncljnuo=bgSuT4CT;-94=T9M7_qP
> z`HjJ^vqtgUJ;8G)RFb73t==k3Zqn0>F at D{Sft5S6MhrYF)#B^PdwNxA&I%W<1{b|e
> zHL(6|UIQ6EQ&TKXYll-<9{jtL#r{aIcL)D2r||}zppxgIzs*Ws*`jAG8m~QF;$zeo
> zG%Ikj5zl9J>b6kSv<aBs3_rC;`fsy)QiQW<eTMucZE=rX7d^J3UCcHQ4*;<dJ7BBq
> zuUG*mI$6x?Rld_D)}pMdr)CHl<t16Yx1Fu}Fe`4`d4E at gzKB`P7gauRx4z=FoiAJ#
> z^K%~af|bQuANO<~CYb6->PDySA38X at Wa!{b*qO at G4Se~m<$`XLrYZ+i|C-4Rnq0ik
> zYh_w}eH6W0j(iN-2}=vLqn)9<cS9 at JdsjwQmw_)=v9p>Bx;@cV40!^cM?)_XS<Piy
> z!Vf0YN8$CiKDlNVrG+FfVJs?`fYeRs$uXd`9KQ|O)k6m(G+LW1nCRu-`slXT(E}{P
> z89^iT6%Hegr>V10l(o0=&FuK`gEG5RuuOBTsiN4OssACnWPCd6**HFfURdwlf}AE%
> zeGk8c7B~86hL!{CQ-a?>E?8ZHz!!4b1U|pQt%(h{x=qo}tf3p`owJ|M297?>IQg{1
> zpKF$74lHNZZ+JiIHt0t0x~WW)Nhd*r-D{#njsI%$(cTg9(fT`+kM606kIo-WKKio}
> z9|j9DX7sRIDeVf4+oU(r++}|3Sy=j#LU8s@@4dc+X`^bc7xn1nD{!87&?&MNm6+CT
> z=nB+hLe(6+!@iYlXgOPB3Mk(w-(g2I&i*m|I+XEnn~)tpbeU+WvDJ*Ov751G!7rsV
> zG&y!NTa0h#K&t4(HxY1F&FY%9aCecowaa!;{SHzTXUapL@;-7W-fD~=`Z(f-oGowu
> zjVx&iKIH3~><1=!ClpzeXqFFNdDI!YYn$JYsoTZi+Cpv9r&Tm$C9Ju|AA@#DY0_h+
> z-tyHBqKXju51=<p2ZpK5n-#bAe&}p^V<z30o5=KyxLfcwZVL=IG?}Z1Lta1XkFDBs
> zI0m-FTE4!`$ue4-^wlHa{}}Zx>WOW*V-!6dqfQj;W3*iTRa0DASFaCz809wC8f?tm
> z$&de}PJYZ(QNlBAp0;9-MV=i-;bpKGdujAKe<!$1aNX`V;{P?wE=!}UsWhxn^kwg7
> zHQBGQ@?8&9MT<F<)}%^?oL*hu6h|r1O$I;iVO+hx$soa!ZExd+wli%S!6&C?JZ?f>
> zi~TXjqwp<4N-TOFQex3_Bl+Lh6ipQVjG1w#ciTMpKh|N6_eF9n@*IE6bNmX=v5)82
> ziyRAA<hbCn98YhbV*}5zq at AZcA#c-pz2-ET<x=qcRo&n-fmcTR4Ho2fk|Fd1V!9)x
> zxVEXcsudEd`uOx1aY7+Gm946qFCJ|X3f=6Fsfw3FM)DB7|03wz5}{-K2|6>|(Q&Eh
> zj8oBZgz5A=`xA7gx1%$u%@fJb*f1T`KJIrpTi8fiU9e0l7dT7rDq`k6zd2{XEH4i`
> zAABTUe<(9b!0B~qt!7NM7T(9QyJ<TS*K4EUiow?;(tkXlIRDK*6)I}|gRy2LT=1X@
> z*Fd<U&fkl|@Pjo%_(*i|{yD-7exluR7_1Ij;t>lrSGDnGSZ%>K4&N$#WAWXIZzp_r
> z;TwbRgZM_{`w+e+d>?M}R<bro|K+>LvQ?XqHmT=lX_zHtXHR^*YCQ6iHnA=<M=)h3
> zYNAQn8Gpd*ik9q2JwII2Z&W<PnwuqM4%f3?6+*L6or2d1t3I}s{y*%!30PCt_BXu4
> zBp{O$qNp4|0$3m+pd=v)Axxqus93F9Q3FKkgn~*`G$<%4DuT7v5fx{oIG`Yep_AIG
> zwXL*LtwSARZ>>YEl~@DsZ=VFk-rL^)@VxK$^m}e}vDTi~UVH7ehjaEmA7>~MG`MA7
> z<e6_R6s)u<2p{KT^?QK_cHw>suo}kMs2JXzIAB~^B6EfdHgfo;21|ugE^0Z9LuY%j
> zdYkA5^W08NwshT(uRNMV4i<N9aDNo;N~AZ0;S>Xa+A#wkv3U*F)E?L*t;OoOjNjzQ
> zrnC9cBETUbv&mA{FJZb6tNk*5DSxebnb5<W5O&>((va%eaErDVRPw_&VQx@@*`PCN
> z+?%scj#0%qm)n{slfhyHko^4c{K*Aoxr|V5K|Zk%hFe%SnG3^n*&PC_XV^ucDI2W$
> z1aV};Nr`MC(O?IGd}JZ?$fa>TjJpYzi2DNb30fkZ$yV4vx4Gy;n}?fm#?ih+$8FGw
> z9$53_G8 at b=?sf&;?fGDq?p6VNb(RwVdv?YykI1%R_Imh%4{XHkynNYW at -e<}!BDO%
> zR^^iXaI_&2h7)UJ8y0ZKxwt%Sx+7FsI6dM#$^B*7<E8lxki(K+%=4{UyFbB0Y`*hj
> zvwU-*Rh|vq{jj<pNvw&SSUa!b2+beajMF&vlUrC at Kgx-1dzLKh!8jeU-4M6&Y(jTp
> zA$QV*<XS1 at nv9%7xpv_nTUZPG at 9dKEvEmYL31ON(4M_FxclVRwPsrW1ALm-USD~2X
> z!bvDz(uSPE6c(EPm`QY%W0a>ghTlMwUpML(c7b$<f496cO&^8D at r)y%<&j6rWEX}V
> zzh#A<dnDHi62Lc`Nru8AxW8;W5yI9_kURO1e4EEPkCx^!vIoO1dBkhFj>|WXk~s`3
> z6*B#uDs1Ka{=~hDrmJwTSC{<tzvMkx at oR3Z-ul_E*j>uEP{@7yFP|z`#BJQLVdID=
> zo$_;pF<v$vJWV$yT+_8jm<Ef1$9ccd6xV*Su%vD?1>@8Iv89|7=PU~t8kx@#a=dWH
> z5;Elb%tN`yg at e2>%Pij06e{Xg>Lm0kb;@5aEcfd2OCDSDsSYI%mMaFcB|qYzWVx|q
> zVMM7 at 4_=3occNtKep&Kh=X}m%Ga=dYvfRh!LK#YRE8erleOw`X%5qU`+i$rhiOY==
> z|7{W6RNB<tZ4GC{1!7ll7bh|ko;yi8bC;l>^lkf9BNs9nR-bGQFYckowza~#(0&|X
> z<?=pebSW=1t2nK>2^^xK`!G~@TFoXtBFsIjNVm3|3SvRmca9s)(Gw<N1h*m$IgN%9
> zXS(LvW0Wp=4jV{zKJSUYyD+~92Hp)E4qTe2$+3ebl#FYzv=m<B)4ijMxYRPWgcLLu
> zHVQ3{bP at Il>>~6!(&fEJ1&wl*3sz}uHD&x;o$lEtSP+f}?h_LB<k%!?NL$ly<1Qvx
> z<k%w*4T;|-dXM=b|6V6*9}04Wox0dGwIqB>IOEP(eg5Kx(H8wUfY#RV!CK2)<~`I6
> zz1(4#MQqDyF`da{f7Ghcfwp;*eXiYE3s{W_P3HJ3RCtmMO5rS)LtrG%WLePjSm10a
> zozK3I$F at DK$H=7bbTEg>#c3+Hn?G=WbcTED)*}k@{J9(D8*Ojc-0Qr_aibZ0 at zn{p
> zn_HI4Qr)h-Xn3!%=^kChA&+es*YsBV8oUr^$v86F7I@)p$9vez>oos%=O3v%zQO#t
> z1!ho=px<e-pqA4La}%qA2JC@!O2(WOx7&4^1k7)uKI6w(kH+3#r=SMw=bR==jl6At
> zucgT{*A8 at S6Xh~?WH(}WgSqDf+O5GJf93gBET^JB(7^@f$eDpJ57-^$CNwz6`uY0@
> zIQa7tn6{^wB~8W3&mW-yO?C+BhY)6K0sJSxzaRYFklGnsbqV0Q-IQ_NuF<{Wg7A?}
> zZPyjutTQ&!TAIJmK)Rzbs^J|5=+41byJ#oeYV4GMBcDMpxNLN-C}3UR8ePkUtm_-2
> zEB7|*YBIW(6|$~NM%Pja>-yU0(%fTRU%}O5tkb#;tm{joYptAhT{OB1?z65hjIPz2
> zSl0!kYgHucI&XC4KVn_yjII at 1S=Z-A*Yd&nSmzdhhPB9>c&7tB(_3qr(S;&LPu!BY
> z33b%r9%p>Rm<SQ~F5Eu?-!uA|Z2*18NOOWg-!}PA0)5NmPeA`*qzME1ritc*zG0&M
> znncDD^ZL9h(YzKh{!pTo3;awaT2z5Hm1ubzw5ddkT+pTx%}YU>N;E$X+EgOmaCBn2
> z!hIdL<Bdh_E`k2oM1KtWs*y9Z7SPS~Eg49s*63%o2!42L6E{m*B?#&HDI=zH4y%18
> z30lQI`~8gqC+uWD``y!67WT0m+wRM(dN%{#2EGFP9q{+S7lE%EbHpl!gWgP#(h5EC
> z+3%e?&M;+t4J})PpC`n&d}5u at jdK;H%K{^X?m4*Sp*N#pXISvx%K9h2?jL}A1u$pJ
> z0+s`-fy00o0Ly?E0!x7x0ZV|h190a6 at M7Ryz)OI40&9RvfOCL%051jJ4!jI_8*nc0
> zR^U9~Ex^lxHv_K#ejhj=coXnS;P-%60dE9e4g4-}0q{EDHNb0u*8;BrUI$zNTnM}x
> zcs=kc;3D9az{SA%z_4rov$?EnSnJ>frCB;;CvD~9Y_5y2D~Hp&8y5XtayVVPk<OUK
> zLe8Lij<dFV!mhrbJrAO-^gOs at D{ae^*&ABu(}KPG%Qbrsl;`X{SiW at cp@P!#Wd#<^
> zznNMtATZLFui*#-+vmonmJ0|>e%&8?%~|wTi1v|@T5gPx$?#XhUk<zgI1G3punc$+
> zuoO5OSOUD5-XH<I1b7#)26!iM4sZ$ZQs5oH%Ye57=K^m7&I8^Gyc~E7 at Cx9~!1R{e
> z_kmXeZvtKg{2uUX;Eliq!0!UD0bU2Z7I-c2I^Z?Hg}?>C>w#AT7XhyVE(Tr+ya6~L
> z_+7e&0p3VgDZuXm(>;I8dd=uF0L&E3=re)M!1Nix7GP^rE22Hwmh9W=V(W=k^x)W-
> zd7>5Fb13d9WOCRwiLoUym$rOB&#(85)m!Yu?%UM{%h<M-WwFHUYHZt!Ow4Yv|7{zJ
> z&^57b`irq`&%-fhT$4HbC*@+U6Wem-O03>e!ltwdu<Csedr`LZWcOY|b87vG?nmch
> zhYat;A$J<@jCpPYzTZBH{2Kc#D-m4FF^hhd6~D>~>xo~nLVmXAvokHZjTnEfP9Per
> zm at BV;N>|R$_EfXwu(!_Vx|d_ at H{6TWoBs^%-p5{~X)hVi!k&QlU9e1Hv3kxMn5+F5
> zt2e{=Yc_~YZ;n&kC#ePNcNK9W=z7Bc0AN3!g8l<{c(|>|#=fpa3GV6Vko`Sm&e&(e
> z%@hS at xR*kK*-Jw%$yt_ at EOU1ID7J0-Y^<n0Z?M1#@v}|NCQE1?OMD|5?C>|T$p(L=
> z*e4*qvfSJ=mQCilOCgbE<M!jr02}diHr4Hi04pjT&{qEafqy`ph8(V at Q=+q`Es;yw
> z5(jE9&wrGTG*&XC!R!TlxVRZ2T+^82VO-y9ZpF5AeSF3#mm_y_vD>~<PWs!mnzfE;
> zjizh()@Zp?sY7`dQZ>@~&SNj^X$de}b;kZD_H|i5*Vp}?TfpAKD#KFWV*lQN-R}hc
> z&gR<S?-^>j-9D##bxdE>fZ(l;PRQX`iL2wbTnp^SIFUyzjrS%QM at eVL9V~Wr+)1?o
> zZp=*04ZvG-xrnzNR7tJ{{_cu&;t=?h=32wG2h at Jx1Mp1%y*D>b@`mF+PzT|Ah|YsC
> zU#W!T8zp^J&Co6meQCJRW}_p at a{_nX;0|wTm_vu?{+G$u2krc0faMN9dKUzCBr%_B
> zvSd at 6<(h#*nv&#_TsdlaTEbg#MaE at BxMSIh5o1;aUnUei;p|q-xZOU3ZTdVPlH7`C
> zDNG-{VcECc<#z5lgPEJN+j+#hfPBvV?_`x1EjeVARbGEqPFoyz{a0j_+d!q2ds8xN
> z#XlrVR-DbXl{l{W?0J7k;d8jpfV)p}#o+T(#5f=6<VFzk4X_-!HzV|7-W1shw=Z+C
> z_u}@IY at XZKi1%&YGTEnYm!OYL at cAaMlWe)$Ge`$}mToP^k={*@QM(UzI6sy3qlf<(
> zYup}Q5ZlslUN(<0m+fUNWE&Yv$u!6BbKSt<b>!86avEhPm at afp!*qL&zQJ^teaiHZ
> zr7}IK)-f)idIMY$yAZG*Py{FjYyiBAe9==F at WXVb+RE6WG<&3Q0Q3X60T_Tgzysh3
> z=nwD$Z~;639}ox-0D=I)$YTKD4OR>M(Enf!G;Ysf1q%~QJ>N2taAL74BAh5ZJB*BN
> z>EeB6AbOyAQK#6phXo`|!@-jTvhm@@?+8z0mdMdC^1 at 9v8$Z}MYa`h>WMfeSeWKrx
> zI7!32SJCSBsd?lqxMmaPy_U9hr_Cdmv^BJS3#&GOKJVlB({~Fve4WQVbJ&I3FFt%>
> zp36L!SD1k#+?VsweDEP`-~V&^;Y=@T3$XLp1OCG*6m(D1>Dx07 at U?EhJ~r*cx#rj{
> zqPz0cB7O8?nQXWVk>kRzohfa at o5i{Auo-rezRS&8qZ at ->U~KlO%JI<LlFei!4c)La
> z&e<rZPm-2%gvFg~V3W-(7~&{5x0tkXbXoZR#utqhc;?3G-X4?2qOt!N^FZSx8ZY<-
> z-ma8Q1P3EE@|`olf#5X`-Y{{X$nn(NW_fUE&za^*%N6eKWK-67fMYC~eEY}nu7!j{
> zOQZ2{y#9AuBCKIcYg24X+iHv>vtDRE>?X(ipmMp!e8YPANb8dudMV8EGw|fhEZ?lv
> zel2H%MG<Uet{YN@)B2H8$OXILv<~E}7qCmK{2({YapYTbpy4SEmCS&jl4uCNz954e
> z*na0 at i(>47xi^?SXPmkbM>hS@(|Atwy*Hb07V#vG<9wXHqPJYdw$!g~I+yG)DKFqn
> zpYk}fhR%|=k*AqPLx?d?yqRkD{dQXVCtc<I4I1LEv5RBmohdIgjuS^?ciA%8VRDLQ
> zSJOjkNwK4l>QgSyEVO>FB2WHlH<t5bPS!%Q)lBGA2ED4OI)m at Ptn$l=UO9=RXzZFE
> z1UREM at QIt$U>m^oDc=<1#Axhf8-2=~Y~>|B8sbIljDAk<5<5IIu*ttcMuC&W1`CuO
> zg?>Z|B2saeNNmemhCa`bS#e6ijXW3cSq9AWsnRsO*Ybs5jx6 at slgj~?55_iF%I0xO
> zWpf{l4FJA-?_N)t1LvNwupi!VnjInQ$2lV;+p!1ADLozy*M1?h)V2VlJg4*|_eDc4
> zR%a?Z$r4rPWQS5qdIO73)me`KXHMx_cf9NGBLj7>n=Al1j<7Pj?0_esNyz_<kg>7_
> z-Y+CpxMTdu8M<a+b8<80gm;)w0(M)ib3G((D8bR_-_TQHubDHhQyZSqVN5KEZ8^0T
> zu%`jfb7*>+sy!~<(?DOq`)>-TOQyHxuL379ot#QWBK5HSBaeFkk3Qi632|~6Cp at 1p
> z-DY%wt^w}a5C6qnfSvemW1lUJY=3L&d&kc>!>xu}ogu at m-XU_9w&3)JYdbNPN8ifd
> zkGY*$XPgPZ+fU~Bwvd^viM9o8PoK5ot=+ at p(5Vql5*TZI at rB;2LBI5(aB2ZY__jaf
> zXJgF6>>l#4Hqk$@`8k=>x2&!L&izT63y5dp$LtJE)70Y+G23&jMyQEfGdvqMv%?#&
> zl-q=Hcu0s64uIbBhqUcEZ$bR_eBPy{7;6g5*3`@qX$^l!+g?^S;<wjuzOh^?C9^T6
> zv~PiqfwfI+x55te+cHyFJM4BB<C~cS-Y^?yY_Da%zG|=DIE1j>f|zZ$xKGN>DgBL^
> z41TH9R$4>$g#Efs`&V{2Cp_rel(Y>|q5#iEtxNEfj{U+5b}~6{(eh(k>~Ea0qGcCh
> z9%qL88#xo(`Lh4ILkRi~<c at g}^0EuyLb41?TOozglv9l{{zmLIvQJX%G4rRl99iQl
> zOa!|NobJGo-2HKQq7HoT72ouvh*4)AS>wH+rGLup$}{v?I=+(O(ix at Ddc5Ly;cH=d
> zw+`*Va?Cjfj;)Oxa}IalcnWTJT+d3L<rzG!`qPr*I!J at ciIpE6FYUu#D;H~?m*vh!
> zxt&er&hAhy_n#$Y8Be7_Z)Y;Tn`%Z(G~QV?qf#63Pn at wek8QDQ>%f_9M~T?|@)~DU
> zBBp!JI0Ig_A*cT<&g`0vDT>V5R)i%ovuiqPdOP2#V|%sO7~AVryHPjg-Gr(BjiR<-
> z|0s%EC?3taM^g;<Xtea*f2x&9FYPvTsMTwFX}98^YGu+)Qva%*3GO9q*G#*auh*(Q
> zgtngDq<?M;PG`zhN3F%%yVhpiJJ!Ery*suPl^E(Z^`Gk1-da8#>P1`Yr5 at S2zE&@)
> zN4DreqfsZDaXuW}R{63%R)1cf&Mkkaj~(*(-_-~G*u3kjx*Oa0k8R7&cC9Ohf at _Dh
> zmUnILMHwwvepSb3zb=z9Gl$z|4v^3{k=!kaMwv=FktY9+F1p5U>i at cr8EJBT-N&3@
> z$Dl(VV+o#v*u3t8Q$Q%;MGoG3av}$#3C@)fGe5jT=YE2T?qWqi4Zz#uUHGJ6z<xz!
> zS2AgT1m?L+fye&HXeUpmz;}OCbXQJELE!%A=&qh61)}{i(Or3y3Ow*0ymfR}K2t#N
> zv9gKoP8j4B0@^mZyA!49%~YMEyCW|FD7)zHUL|Z?`{?d`8qUDiA-cPKQh_ at t$LQ_}
> zOo2Bjr|9nKG&}-ym+0=fC2V-t=<X#<0T+JVqPy>6SikPkE`%wN!mmfP3pk<qI7hpr
> zPh#`w8SPA*kWVIjU80>CO8bHC746KYG|oPf-qFr-O4B;HMmytMd%mFhL_1G%DiDF{
> z8||F#RNw=uU$k?BQ^5dGZqd%?3z6m&XePRwxl at 4`D0j>}@D|ZRHSS)uUzo-Io&P-p
> zouMZxKB70I(ObaS?+wwrw*sRvVQIgStI!@f1hT#f7EY#fPk~q^1V+1=zRZL(T=(c{
> zD8w>f67A#IM(qerZ!STqZl>?9sSw@`%lvNmUK4xr52sS;O=i?@S?k{Ds0PBGB3p)>
> zmqp7h8*n4QKAaMx?ryjh!3OiqB{)eYfL}M9_8uD<9!>9>qjzmp;2h~#3x+dzEOfRz
> zFv7=o2pbRgVq=*3Vk2#ac<nTicc7ULv_%Kn%t(_->@5k8*b`xsP`^o$ez at 7ocs2uW
> z4uiVm+!u#I*chW6a5J3~CkE#j%;6scx&iU&S%(J132nU)>2#8`eu48pq0}ACpHC2%
> z=2-`s!H;8OI!}5QX>i(;W7GO(E940}fn$Sv0K at 1>N}OoMsXW%tA$26qpN`a=h1&sf
> z9NONbC#X%dF&_2r)*)Uu>NdqQ(#Cj{cIgn$g}P1gjI=QxrTcY=*N?he%V`^O`k`(5
> zf#)Rf+z<R)r8?E4e#=YYh6Zvv8{K)qaCe5=se{`I?j9Z7Jxp(*Mn`isR8C7EC+q#u
> zCDEx)>o7LwlKs(;q6_^}pXt1*3)~XKY(dPakf?;ZHw=?^v8Xh;T(EnHGp+3T8a6gP
> zzhVlrrE?$9wh7^6((&YIw+7?6z=?FePtUQ?Ha^jx=BaS1HKt;SDALWGy?^gGJ(D9s
> zDDq+Nv$F*q1#aj$G<u#V3hoJ}Gr~f+CqUm_UY&!CcE`C+defdu$@0ivZOD_Jf1&kN
> zIGv+-d9>RL)2)0se*+(OJz`-&NM4ckMnZf3^RCz{?UhTPM!L}bK>wbRgz$l#>B`N&
> z2cSE4<nC^yE?c}Yd21Ek;qmVV>IatU3hE|HbpdsQrJO)r-;5HF#&Ij&LiTq^VBb0R
> zw=cl@*x!zQC$RH#E<&)M<8Pg7k9SL#q2!CeOCyOr0nUkZyhyPIE33}VODJE!i?Pp0
> zeX}ERas+r0R)C$I7XlUl)PO9&e84=wTtMavO*o at 5kH*j*?(1Z>p>acOIOm2<IL;q!
> z*s;Me-i-K<Cv73E`{KJ2*?1>V-U<#$8_Q at oaz@kpw){uz6s*fh7~8gVWnO$I5;CEM
> zwB7Sca3`7xkBMgGI{663=Dq2g-`%jjC{}Jg!Me4loD9Yu!iUzIiWHAYr`7A^?h?DE
> zFOj#irfbu$aUSxnjZWiT+AQMC<o3~>T1eBqhF|gC>?6eeKu!?1A=>c;X}Uhrg>djy
> zK<3_^kqH_moYUP-?rvcZjxAu>%o0WrO_G_0G}XKt{)v}da06o~HZvKGnOsp~{gJ~s
> zep~m1z-1b_S%S5^E8nJdj2vg0Ta&)uuINfSZElt;EbQKOZ+iH#MI_SU417W-(#pe|
> z^3aST5)i;kpPZ?j%2UpoF=N(DUWPg&iS<Y_dL+$I&J9o!;^UJ!Ib&K<raC=^kx3c8
> zFT>?B9sDHBu<)@-5%Hsv62nIgO&UIWn6EGPE6AwC at Q9&N!_llbFrSqfBp5Y6GE<ou
> zz@*HXWBUg`>h|{^6Fus!QA|e4bS7e?nBivy3i*Thd{M9;laV<&b8bdQZ$V%LGkw;q
> zbQ&}#)8F5gyi84#dhvx>e$1Pbr?)$7|EKw<%uJ at a<Bgk`cJ|uy{6hh+;tY!zZQ}J`
> z at DUL|e0c2e=#k;fsKk-s34fZ|t9VmTb>*Bti})(utkhH{dDe`{X)_s`Wa{LZDtC8x
> zqikQr`h$D}gM|M|zJUYze~|BMIs6GT{{FAU>eyiauAG;0jvm7#r%aivVn)R$ylP!S
> zUh_A_=D=2Ph#7$XrT?gp8S867aOjHtXO6$<QV6pIwgm3pgAjb-m?Q%d0g-_IfM7t$
> z4}|OoQ~<1h#l{=J3D6zj0_X!^0Q~_z06zd95Nu(EgOgSmVys9U#|qkjWi`MIU=FYV
> zSOW0V;Qx9;@(VS at XL$}_DPS2O7mx>74p;%m2do5W$lz5u0IbnhEd%5N@&L;LD*!kh
> zy=o<ZW}E|93Rnin1>^yi16Ba?0V at Hk0ILB7fHi=%fOP<*&q4Yeq|ZV69Hh at d`W&Rs
> zLHZn|&q4Yeq|ZV69Hh at d`W&RsLHZod+<AmEKZ|hG3kYZ7BErdDOgK12#X*joWx0ft
> zx14ZR<P*-yRfMy;fN<8VC7gBG)LmahIK>+X=iQBj^WG-Hd4Dr at fVN_PYCGZVC?TAk
> zy9j4 at DdFtdOE@?=!Z~n|a1NDWf2*8uKB&Nf7bnsa-~#9a=nFurLH<sVKMq&{EC7}O
> zD?lfJHNXa73+N261K0x`0FHnzfUbaUfbM`E08HFTFF<dAE1)014M59s&jl9>7xL_y
> zE73mdM?zDw(vxUsOq!FDGBb0In(^^U_GQo`-QAIZgicSFdcjC#7*Sd#>q?o&qBQD>
> zIKzj<nv9<mMlFj$x-pT7KAE$a;UZtyJR?1LRz at aVgba>|8_FnY$4_ApXXY$MIei)e
> z!V?s{@WBe!EM%t5NSQS^lSU^A;gLyEvBMLoBQ`Q_7=wWzEprxYpWEZJUMZ{>nXFW%
> zWMnWS!-r8TZj2WiHxiaY#VBXZM9S$bpFW8!VtEQppqBbC!j0*vaM(nY7gL(o{iO64
> zF*hS~){L|TDalNvB8C|qJ~EMsL+*+cRoYB82Alpb<3`O)HpLA6SMef84@>y3=J_)2
> zt2`x9V<Vyx5 at X|s%NSIJNYI9q@?$W9 at J%?7;<RKb!qbwcr_gwCXUu^I at SNE!o=%<A
> zovvivDf1??IAcCd>Bpqw^$8lDE-=NTV>Bh<N0l#=r9)Gwx7aJ=rK-(9+Zk1FyjSwu
> z{`3#RI?!qVl7?X0b at pE<D;4`Iofk9j%$<?Wq|TW&1FR at h(lgU$&9o(<CT0JhbMPl+
> zC}(9PP0q+jnPb#z+tBfIQfS{xo2g<FC(lu(WHKY6A+u(_O_a0dq$E at 3rp!%EO_>9!
> zGpTc at Pxqny%h%L5Z9@}hWlo+Boi at d#orcv;KgJj`ENU1pVkE<6lmT^Q1Bq?u%M=))
> zP~XtWDit$x?hHoCcqRKW%DHpqz!p#!dOo6{8EmOs|LRA>UkQ<6Ta)q1paKsK9Zv^b
> zOq<?*#Vb1_VgdqaI#$2`TYqS_By_~+sL at djrYZ3+-3)%CV#h@>OhQ!nP=<*ZJ#r+=
> zgO}3yZv=xn(pc?(QGe=W7Ww-#qeezBOysCUh8Y$c2`W4>oM94Uhea9le;KbmE%jh&
> z*6e{a#`|wog^f(b3qIzc^)oV4=CEQTBLhZ3f^?pkWz096Nlr_F<xERwz~1C3GiS}2
> zf%eCAmyHtYlcAiNlAM$_Gj&!H43*JkwAe<P6}ptN8R~=n`!Xh_|14fg+RV(C5m|?E
> zo at -LHKW2=2NWw>riW-^78Wulh4mAtJeWW5OdURYINc8*38FNhi-YWz3rbay}GAc1D
> zA~6XQa!kk=D7sL at 59UV(VJhEVL8N^xE^KytkkLP3WPD;$?8p&Gd?s^Fno4CH5dIJr
> z_!nV<zX%KZi?HCo2pjlX7#)?uBO;<kjbfrkj*K74fL&%(`^te<n~&eX;11Oejm4NZ
> zGJY775Xp>+OK4AS6c{w)Ww<fJaO3b7o}4^~4ukQjsTnDm>{J+PWQ+?Q{xUCwo0vo2
> zYHtoBU&2?- at iMRfLb-I<rd9uwVo7Lwgg+^FU`Khp9`~>73#;>&<(k6(tk at 3KC84jy
> z{mWtzcX0Sf*rtC|?N{ybCkzC$40Nyo9rFEijet(P9`C=<LP$d=Q;EijmuYol?1>n1
> zUUoF}L5W1dBu-74lfq<7oi%rQGBYKG5wMosIMSr1O;5=PKoksGvu38yvCAtf0Eb{?
> z(7#A_)fDkc>)SOG<zudtL__$DKZ8jlog5Ai<TI>oY!3^36-FnNuZ0N^HWhQp_Q~bT
> znPrE(gAnIWCYmqH4 at R60lg^j^H2+r<P}aD-3>!rAHBDYSOh!Y)$Hp=WtaD9sR>(Co
> zMVZOCGuX+X<F&E+boOMTW=y6dfXOi#o!CSsPtKfdBIiw>o|bH)=gc<|C?IJn9psH}
> zY8TpN76RV>#iTft at -;7Q*7V7A-owDoW6Cu*J at eo5h(t*pSR0u#IoXHr%NsK%Ei=U@
> z(6^l<wkDWBn%p#%aqLJ^&gq~~p<|*Mc29><D$`P5&DlqfQY0x7ljxL)ii9 at xtNoxU
> zs?-jfL8e_GLTv5-O{IL4v*yms6tjyQTYK6FDKlQRgRT9`hOo7Ny_UB2|GJvC_Qn=_
> zSx;lae^JrNQ>P at +Jf~v{on#uH7%4_D)JrOrd1d(c`Z1B{F{mkZpw(h9CCtDaF?}lL
> zcueZ#wCUI>p|h(0FI0+lL|O-`X at 6k<75}h1G(!8Bmy%2;NL0YaInAqjM!gx1@!OP7
> z3Y|I8q{HHevm+u_hgfmUA%kP1NygO4G)ubVOQJKC_ON6uHPV%@c at b=CB_+ at eLrhuH
> zGVw7<mc~Gsl1X<A)2E~R(G5iC(@c{-O_ at G7C3DuS%&9yqIMe55nl>D#PM*%2JU4Sz
> zk}72;Z%QUKB`_pua)>BIkd!_vg9pV-m^D9TP7;KXkurO3%1mWSQp$|9BrGPdA=&-S
> z^`va{dXm)vZh+=sHNTYjlV#*0$py{>-c1$}E%6~ZFh}Z10$ISZBnvr&Ea4;&1;+<z
> ztdOQJ(lj7VU!-Y3nmI_*+mt34Y0QyEjx at nY(;I0zBTXMuIekp!%tjg+(m0`<MgO84
> zOQdl{8V$;EMH&stp=l(ha_0Y2ntZPUuR^a4UYoqOdX;#UdhPcr^Q!PV?p5Vg>($`(
> zvDX=|b6yv{E_q${y6Sbq>$cZDulrt)yngj+ at p|D!xE5S%t{vBj+nwve?Zaib{kc9|
> zKQ5me%oTDaTsb$AJD3~CP2eVS$8sldCvlUxQ at PW*>D)|i7IzU>!_DR9a|^hI+zs4K
> z+^yUaZYg&^w~SlCJ<hG-)^Z!TA9K%e&v7quFL5t(|2~}lT_k#y`}g7W at 1dhtxi`3f
> zA5ObVdP_VcK9T at QutY3TNCr!WOA;mHBvT|)B{L<Nk_8f+%#*B at Y>;f0?2_!4luM3F
> zPDwtLoRM6RT#|ez`9X3|@<8&d<hjI5YAtn;c9-^+dPsew0n%WpSgMc?mJXLDO2<j3
> zNT*6?N;9Pkq)Vmw(zVhJ(#_Ic(*4qM>2c{P>4(xY(hJf{((j}{NbgA>NPm?+mzv3}
> zWe&3LvfeTenU5?$_V?kmw}g2qQTa=WPI at U(%}a at vyp(9eONriiDN*uLqRdN)%3n%!
> z(o2bIUP`p&r9>NEO7zA{iISHRWmt&@%l<x`G7_%DkJVARBw7;3>gXg%s$@E=qZ-L_
> zNdc>)C6c|8GFC?$B%eyou{wG~a#wPn)lnj~lG?F4%1F6VKUPQO(r9TMtD}>osnY4J
> zj%uXKr3I{xmPq$X%UB(4kbWvX$Li<}>0Rl4R!8wzT4u-UC?n&_{A9s0vFz`|sk5Mu
> zz(c?l_z47pK>~?DA&3^l2}TOu6ig6I5u^&H3+4#s2^I;K3YH5B1Vw_4f~|sGg1v$=
> z!BN2pL9O6J!KZ?Ag0BSM2(Ai#5Zo2q7yKglP4Gfs7GxD<7t}S#IjB#NM-Vs2FGvtH
> zC`b~d2#OAh3mO^pX3&J7DM6`0(}U&&%?nx-v@~dWP(e^p(8i#xLA!$X29*UJ4LT82
> z8}wn&r$Og}z6$y#=<ma69|6Nkl+Q|3&Pp_amFOf^qUo$eHLOGnS&5dg60Kk*+Q3Tm
> zA}i4wtVAEN5+$reomh!7tVH>&MCGhR6Ih8(VkMf+N>sy2w2+l(2`kYGR-z58L at z?3
> zSA+gOoKlGn5KxJV1yrI#1XQBq1XQB$2&hCC2&hC?38+Lj3#dd73aCU+38+Lr6HtkM
> zC!iAjhk#1-xqwR4Hi$~JcMz56fFLSSaS)a0kRU42aY0m~?*vhaE(oF$T@^$nx;cnS
> z^k5K`=&2wo(a(aYM86BV5%l-r^mzEG at DIb!gkKE*Cj46X?eP2Izl1*zCkktYgTh(S
> zN6}v~Kp{{F6>>$iVz?qvF+nj!@s1*0k)>FySgt5gY*1`g>{9GkR47g;>J%R<&MCf9
> ze5bgfxTkoa_)YObVG&^)(KW&)f{EZp1VjW!NFo#wLn0C)#zstxNR5~tkr}ZdVrfKv
> zL}A3ni0u)j5oHlaBThv$M4XAZ5b;gK)ri{>|A_b{q9uYv{(U$-72W`eUVuceLZbhG
> zL|Y(HD at e3EB<cZ)@*z<fBpL^aj)O#}LZb5^(OgKh2of!UM9U%3T1fOWNc1u!dKVJ?
> z6%sXrM4cefevqgiBr1kP2ScK7LZZo#=p0B?1BtGMM7Khs2O-faNc2-k^b#cc10?zg
> z5^asJiv0U<+7SLJBzg%F{Q(kv1c|nWTPf at y(cX}#4<tGW5{-mJM?#{LAkmqS=psmT
> z6(qU|65R`l9*0CfghVewqSqkN`;h2!NYok<b%sRyL!tsmR1S#_heRhpqVGVWS&-;*
> zNOS`vx(gDmfJEyc(Q}aKcaZ2kNc1;I)FRR@^6$gxZvig?2+xXV%X8v&=k at 0G<MrqH
> z at B(-Oo{%TuDR|MmI9>wpP2M=(BwjM_9o|e{CNGP(n75Rd&nw^+ at iy|d@=ADnc?WqF
> zyyLu6ygJ^;yfeHDysvndc~^Nq at b2>N^B(bj<2~mQz6HL-<-qUGcj5Qrd+>euetZF5
> zwUY4V{Am6VegZ#{KaM|<pUj`ipUI!Y&*CrQFXb=i7w`-D8~L00e;-c&E)p%_|9v<m
> zJPYWk19a2{I_d!(^@ENMf{x0eqeGyhiO|uB(9x;T(K*o3MbOdZ(9uHZ=w|3>DRi_P
> zI$8xC{SZ2O4m$b`bo2&v^dHdCU!kL|JPW=xbhImUv=4NY3mxS{N5#<5Na*Nr=;&DJ
> z=oIMabm-_j=%@xdx(YhF0Xn)Jx1jxfIE{2(*D10Wpbvln^auC?0sz4PF+c&}uIn86
> z27nJ31dsv();UH70YrdsKrFz0om-?AU;uyz7`V=Df$O at k1#SQjfH%NzUDzVmb<-BP
> z0XzWS0Kaw9;yu<C$8!O100IFa>x!d2*0n`*0dD~CUD at c6b#0M5>Xd+4fF*!pzz4$r
> z_K%QV{}2BCN521erTicH{ztxlXZv9L?QU66&@tKhbLV8Ksdr^~TomRz!7;2n#yxD^
> zhXccAONWHneya?_E3)uk2mhU6Hy0d-|7Y;O1%Dz(eEGM#8Trix!E(fx9~`sx>x0P$
> zzXJXeX3=Eja7EkE1>|5A!1qw6j{cFJu<zagKR_Tr2#^Az0K))d08;=W*nBx)Fkl2=
> zJRlM_KMpV&FbOan0Gl5f3Qz!s01`0<yaBt<2Mhv80Z|wOVDlFR0zv>XKs3gHL9qK$
> zKonpYU<}3pA?$t_AO?^C7{`tQNv1Ji8SoCk>Hqc+ApCzc2K-09|5ry^hPV?CTzSzS
> zS4eP)H}NF{$Q#6uU{QmUJlNVH1IZvFBq9<@q$G^UiGoCuXq=xOLgGj~89_#oH*pqy
> zJef!)5hY0_X=FN?g{QIeh?-=xPfqhm0VyOK$opg)>av#{A{C^P)ZnS at r{r_;CAmzl
> zk=x`a@(a-uJg6oA>4X2(-uRzB`2PnRN6-T~IMHB6LU86GA7>t3u;*Q at Ky`wzH9~EG
> zZE at P6GX^a?fIWJv1A3<;IfAzrggEyw73Urv;oO4;=N^XO+yjGi4`w)DF$w1 at 2+ltc
> zyd6RC76Z=0;9p<#_kPIH4XGHsYvGPkJP_sy=#Q9Qz+7<QjaWXQ>EW;efH#o8AN$6}
> zCD;fHSP7h?0R*Bq3jjgncM?pl!fFuMjYp`FKe!tN`(a7MphH1RKuf`?jJyMjk_?+N
> zgM`CE;0}EfL0Vv6J|a=bCz^agV#q<*nq+)=As4l3AVVRaIN)KZ`EZgB3uK2kM6zIq
> z%*jZ&M<M at 2*rCxV`%UmL20%};zlHE|klJ{-Cjj0COavqWCIKd++$m%eQl_J{Hj+ZN
> z!<IP`6-t{54$_eCJBT+8FdfpK0X}8|X2G3~n6m+M02zQxq at N3Z=RvCTA+Id(qDI^W
> zC}SZ~FCta2jDBP>(&hk`quwh3IHyB!PKT at ly&8aXIt1r*$XevF4l*l*Hmpb8i;(}j
> z(20%YE_n~Ii9CgE{gG@&%Wp^g9gs)~@J{5h3$42c^Z~T*LA3V~(8mFlfD?d|fEqw8
> z-l=IotAC6Z`~;ftDbk)sOPxX3S=9D3=*;J+={azD9x}NA*?fVpi-0fDu3v$luR&h|
> zG(pbaK!?5seHnZ=gZ>VZzJfSc;rBh at 8uGsmxPd%x!u<oJa0_qP+=e9XpylsE19WKp
> zd*J0q$nhW0%%7l<_rc at O(8>qU+lOces_~DZ>AyhZpFrDxMIE1_xBP~l@(lU5Kx%rl
> z|8vm4171K|4X8sappEt<4o;SFRuMA}gRhfV5-Uy^>BR9MwxB!Xb^|;3JK|j;T$e|>
> z0J;LY0lEWv0Gv5HNKejo;=+k1y*R`0rL-Z$l{1L+;k1#y at bAZQByOBI!f=Gd9sVAi
> zF2ob%_2--+UZA<0eB#ZSN_;r;i7#LP;0;bH at dNk+0uavQ*bqL-3gi?L0dNo?7%&hp
> zh|`ONa0U<|M@~clG5kUS5`YvS1OH(FIp}ae1jmU)0!P6w8aRe?f(!=40)_yF0^$I}
> z0K)<CfCRt at z(~L-PG^z`enxYw$(z7qIJRUg;4S1ej`Ns|=a`WRoP*?TPFFIKGnga+
> zCUF|cWbifxphO<YfD}L~Kn0izNCUhBm<E^*m;smxn8gv3bj~s|8~M)xWCG>^vH)tp
> zB2EIy=2(!$pfzZ>|LJcqIi?0I7)(wq1FRlQYBmlgXO;k#4d#69G1zR=mxIlost23>
> z<_u^UZ1$`_VC7(Q`>udkz}3O#4$}vlI}RRf?jh>$SO_gPC;csM;I*zB#0TJKAtwQV
> zaGQD(32?F?t&Bz6LcYb5C509ZZ6y|MZ50-6ZgLwpl3>&DyAw<+Lmn-GeSIW{l}teY
> zsQ`_Sj?jLmDKtkK^R^{#pwgK^g``kWNVvj6vKI7l0G{Cy55SqgLNXj+`f0kiQyhG^
> zqn$P*8b1>azBHKLvp?KQuE{mg=!zOT7FbfZ#w at 1~WX{sLW;ssqvZDSg;SYqKg<fZ+
> z32vvIjI=r2I9-|J0)o=kR%SUgE~Pal+5$A`V$6q<FnbznmLP-yP0ZM7B78U+8W(I}
> zjCw_*Lu>dZe{}4Zv^8$0rTo+Q))ud5Crb`nU+V8<Yot*Gjm73q>Fyn9!m-xSI<j%h
> zI?(1FXbU4vbAg#-d7$JZ$eh-f{@Uf-iFH{nB62#e6Viqs^-98f{df(O{>(^&kt6!@
> zKAi&)Cpiwg0^b1O*D;;Z=l|K?3Mx1JDvTVG3S%4NlZYmNR!0!d>Ibl~zL2gl9M;<S
> zGu2hV)(<yan&d<eisC0{+im}_LP&!i57NNTi5xN&PGIM$`-7KmIqSyx*7hG|kJG`;
> zhug`qJ(LdPue&vWa6h7M6K^0(sIx=)6|DPJ`It7Ky!QNik0~T(IO>d_xd~XBW5zMZ
> zKQs0p#YPwX+wL;b|MZubBd34!?~ifN&Hge44LANX>wsUCVocqhM>~EM{wfvA|3C5k
> z&%PM&&H8L8B%c)*5)0r-m4!rjq>%U=E+qZV7ZUloLgM#zA(;X?^-v*++*U~J0GqZJ
> zlDk_9N$ci9G7<3R`-SBGrb2S=^FopfXw?;x<b$Bk7Lp&}-y5_Y=*yswep*PzevCMc
> zg`~8;kPOill1HZsNq#lbBfJ4{3ShMzbJBr6t`6)ULgMZhlB+)zl1tCw|Fn?YcnH1#
> z69MA at ZvsXFh6Co|8nigTH-KNv))S5GdQxJ!9{tq#FBT&yRn_~q>F+!GyGVZ#7&Y4e
> zMPN4k$A2`<1AGzQMX;XmMe9kCcs-dY#j*7N<xfu2n>sEfsSWz?{I30cdDlCKC3TS{
> zCkuO=|M3f}?EUlJ*t;?BR(0m8f{zC`ERX&?PGEDhWb?G(q`fZpAB<ekf8C))!*|Yo
> zd-dIK`gr?~8&|lQr&1q1t5k2-+(;|AJM#U?tkGs8 at 8o*8=$%$xo%L<m#oB4V&m0|j
> zc*fQB9=10ZueW&Of3_hoNw{e7#DIAdHm}M^JdvArZCw3 at C0$SV^grU?eX-N#iTk47
> z9Y{w1mYGzQ^UK4r at lU!7^Uhcdxi&$1TpjyK>Nj>5*9|zW_YDt;d%XC}<d0?q{G4>u
> z=I0BJ_lv$Y|G4*>8T%a{PmKPcr|QPhIcvJ#cuzLO{cO<cydl097Jc3J at wv;EL2>>0
> z=}Ru8Dg#A<c=0Q6pd+jlGb~|r3uK6?lIEqIqCz#<s6#9*$6tI9nWfpGq}?`kv_l#i
> z$z($kI?#nQt;xTH`kV4$jgXOMZqPW?9+}&8;Dfb~NRBY0?Ub{$DSby9nN9;tWoTZ}
> zC6qL!Ws7UKfv?#+MEYC(KC*e%=l1Bs{VeO(-n+m*zvoMZ at 9^X4k3L at W#Z!wrdq3#I
> zY1w)}^WhVP?WUhkUH|Pt#m|op%c?diHGSq^x|rI>HRb((csqUY)s00xXMMl={*<*#
> zY?+uootu}&-kcshK77rHoxglHYSJ=M-FKObKdXu!xvS*7=z-M+i at E21dR+I}rZ0Pj
> z$v*t?gY{wAr)GcHP+Qsgk<z2j_BE@!33`nDDmLS-$9I;*^x#HsUTfbu``fp&K6VfM
> z*)L~h(u8j{Q$8GAaCrOaZ_N at 7hfWXOlD|+9l(KBmyYGy#XgNJ7-+{B;W^QFw+cyU%
> z**{)U`TU3YvX3Tr6-|ggxTj}XS<$_sW39_C4czWtI?+s}3_J5+r~4Q0ye+tVrS^I2
> zPHnnZy>{Myu~seo{^(N+m1mgnfy7;SBRqzCa#)PB_U&6g_CIkm^!vlv{l72Ewop$F
> zad3(5E7Tp28KiwXrssA0fg)Xv!DZNsfuc={h>&U3&tHf=z0Rmw)`!)^>3ca=SBHAl
> zSB72L)i3zU(tbh9j=cT0>!mZ*sc!n_-P_cQl-pXWR5dM&Qm+*+R_!XCZU0-gP<7aU
> z{|!YL|Jm_u;a%xNiFajomg;cWlwo~yzH%ul&DuFSEwE3O at AaG7^BdE at tbN0NkU=Eg
> z>MPl#@UPM-LTX%w>iPEDqCzxBio0An%9g1ebxibqOr at L8Wv&19%UV&`t?IC<8^glB
> zbvx?IyQdJ<>gz?9Z`Hfk>S_nhP*wViRdwM38QPp)g2<Jko$savo-AA9GorTHCjNM{
> zZT!jR&haOj?c$F#+s9WlJH#Jrc8ou2a8cDrU3B{5p~}AHZyc-Fhh9H4Ls+R*hwj_)
> zSddXy{PFej4Dqx+D?+Z<WeAcLW#8=FlNQ*s)~98%wy`Xxpz(0by2kRDwT&OdtZXca
> z$#2{lv$}Ct%&NxSx9ZgVB=@2Zl9=pJ-O0wia0exMfIiZ=3G~3EKA?{^ZU!Ba)DQGw
> zQSJ5W#;tuW&!|e3`VO9~Js(EPI#8u<mzC5-QFQTu!}9a06U8o&QLz06$m>Mk;E!B<
> zT_(>sFYYO6_Kh!S9uU8-`HlFs&3^GKoBiYSn*-ukH}m3G8HD?`%@!OxtPZU_jCyX*
> z5NG@*^1W3N?yswSD$-WI^%*VimbRtJzIcW(ReIiAtdAOaa%-sz+LyNFR9&p^J1GXy
> z)F-wN`YJ0+({^uj8LGPU{Ip$iX_jkZ-q_0-mMuHI(!{D?oBfic%>hYa&Hkys`o^ga
> z_!g)RH&!dNeakwnX%Ozy-W+gjTei^akYS+Re!ehfextZvyHJ=E)*z}sY!FVA%#iA8
> z8bu>cxsSi4H4OSdt6qO>o4U$t<uW0SAHSqA?8?!f!;|XWg?F@#rzY0A`=m%4s-IM;
> zWl6PPg!Qd0^0!~*K3*sF6h5pD6zU?Q22T4bTd1oD3Dpg66wW>*61II1BGx4sBqL50
> zA5+$s_Da&a33b(tRVeE_l$GVRMe4F#WZ>^UywImS>d8I($;CJO))o1WIvy%qb|OZ$
> z<z2o|ezZ}X!}8rI0{>Y_k}txN>M8HbBzF5zzCkMFYs>tPZCfbx+FyLzK6#mp at -Lsj
> z#uw7~eNPqn*I!#G+^sDW+U)?Z{rp{Y+iJWZ+Ztu1)aTA&e!~nuHf^BY{_|n=*VHa{
> zgT4qW*Iw_MRO>F(ZELI^acY^sZogC*s4dgY-cs$~_eha{xz at F)T-)q4>J;J}247n6
> za~O3z+*sAOqR1chd~@~>Ap>;ZK>p1~yp>142pe?*;YS;*kWS@&C|jyK%5R7p*HTp;
> z_0`XZvekotf84ibs6>1pa at ppRB7UY1hTktq+M*b4Ipxt1M(Y=WJQu7s at F`Eh+M?dz
> zS)!!vu(CLrdzg&}e$kH83_&zbkTDKlSy|S5w!X at T%36swEZ1JnQPvmv at 7C^zY`}l5
> zK_n=9ILO<W2V{&psdxq{&10Z353#cTi?AydUv<@1&X$#Hdv{Z6%fzEjg!!D_9~F`X
> z-P>KQ7WO(u+rL_XdfrQ_4HbS+*;u{jS|ESKsYdAL<N*ijR=nr>cHY9?Yl^mbuPfTp
> zQ{uZ%bwnTNTx*ykZZnKkx#~kF*R}P!{{B<p_421erF6wim0pza?1<>|TlMQh_ci?(
> zJS}X+I_=ZhUug5v`MOqpVEXFH(E6?FmWLncMTg4N(q}uCpH|jBeM_5{ao2TmUN6-W
> zeREF<U)ZBXv~XXgXu<R9<zd}x4N|dA>T-R1X_jiUesRxQ!`SlLEDOK`Wi{e{8Y3GT
> zOa1k3<=W+^UHjxM=qb at Rr?!<&*}W~iU-w#3w!Rv97|w=@e=Rzt%JvM`ofsqgBBxqX
> ze=SWYSnf9dnYN5*Kfz)9w)J-Q!YHr#<Es1CYxUyU+M=`N+KCn3)$ZdTYRf{=hT?MV
> zz&+l_4Wj0n0X^&&#K?{p7(xZd4PxrveRO#hu#K_`vMxv1#<JjJTKy+>ac<)u)|bh&
> zr`6ILAGKIe|H8#CY~a{^)gcFU2lTRX*u|c8rHkys_+poSe9_%Y#fhrT+13b~)3dhJ
> zRZzDwRIJZ??y5B`&{k%KDqmE{&K}YS at 7wlxfS|^cxm!6VKy_rr$>uHkV8Ibj=2o?#
> zm!R5{`QenoW#_iH0-6u$h2^#C&#By8rFmJZxA~&$-|Abu-&60`y*)-YxU4!<>+ju1
> zdw!ZbY;l0La)G~Yty-fiSLfO#iEJiUtKZPM7-ahjS|z);1r8GHR-6_;Gl=XS=>t`p
> z`J$cUV7m`JlX2?ShbpysEq1;0TAFJvP8EB`$cEo9-Rrtdf0<WRbTzGRN2p^ZU!?41
> z2t#;_a&ehhwP1|H at a*CWCB~qgJ4Bt|sn*wt4SJbt-#nqcw<rJ35re3__Qf^vqoOZn
> zA3YLg_m(IBR+Rzud2t)G at J_Ws>?$<~Q7<74yHR5h(!2$Ah8A8mU$pE^gZ}LA7hBG*
> zzNoQ#V364lL^<0{Wk~ZxV`@uhm)G_Qft(k)O7etfYreLj{YI&ckqs*-3sq(xk(AfE
> zxhNNnaTr!P27V$N at 5-VY`yUOm-P>e+dkra_qpHcPa{XT4a`yADZKh1{9DKW4XT_=Y
> z|3IbSi<U;Vj6Li6b+G-9qRzvs*)*>E3T{cn&q7w|cF^{xb#Z&3{ba#FW7$gruT*?p
> ztK9lj?3Ryuy=@S=zFq%ud2QdkeP>cUnm_+KSXoJVGlaUnee(Q)faT`|33)=LmM_Y2
> zp!~t!*HF1E^J$k0o3D0(L|eHegpKFH#^c|tj2bvhWau at m9()c!9kluuUfGy{Vd0)W
> z53Bg1HGRv(edqASU7uEmmDev11Oy1`mp!BPMV?D}HF at BD?hIvJUX`+rZReKeD_<{d
> z{^;vm--<CZ)#f7tWi4Oat)*I~tkw6k+ozWaj!A{Or+T+N<?5lzTD6PH;OTO+>e=j?
> zTD55RVRibR3)w at JOJ}^Hs?6JT_R!Z$50tBSx*A$s%C##ky-UGcr<gZ~acCZ)V^tT%
> zhw45E3DX@@hw9dNozbl=<lA?v4()rSOl<!w4Ssyl)6X%+eZd#^^1!(FHR{c#kBW*}
> zi8;?xeLwrR)IQ+B=O+5ggHzOP$a=O-pGA4G`^Ue_zsU8NRz1l3g{S;(MX{xQQE`s<
> z^7BHicCkJBkfXAy%v$?NT8O=-xTn2Eweu*gC;uPS2EJgEC;#@l2AN>1Ay9jMk+<@s
> z=irk&i#PI)dk%h3<0)6w7{r2dYUd51+VdG9%4*NS^N*k|dyfR~Ji79<%fh-)`)?uB
> zBd{}jpbK(?P_+T=wV}AwHM_V}?3w4HdV5Sj9LIC;onv)Ub;XV_$Kz$8+QSRNjvdy2
> zq0EMjKtG)P!Z5J8=Br%gV)Tn0QkPxme~YWfERN&A*4E^0a at 7{^N~<rORbJbA?=0eJ
> zwF at Q6dbG8c>I%~LI}&*I5d8OKN at +fV>MHb?GW3 at oBHCZ#{EH4NYl?gC-X?LKo%}N2
> zD%aYxBJr;VnfNEE%kKBbI1GJWI_GRn(-Pz#>ejGQ1Y1|_svRR6`rMQMGuxk=mI$hM
> zh?UvvY2M3d-a{+L%#6z(vlwY-Qroe6N6}&NO_uK}*Q>NIHZ7U5)pPKz8s9 at ML%hmV
> zwK~h1zUok<KaeUNvo<bU<j{)#$nvoH;mv)m-%7*=&#`x^L$>Jl`}?UBA<uPptNdtx
> zS#{Y{ehd0c`FU_WYG7Oy?K3$FWp<8Oxd>zWuOZ`f&pi|FYzx_}+a2XKDXVDVEv?%3
> zN at 44Z_!nPf*|lQcRR;fsUoL1qmdcbz>AtjUHMoeM7_K}!oOM`Pi!rQ)FIv4*G;HC%
> znBj5R20=6A0huiFK4cKuZ(CW7 at f>4sX}Wi1zUaz!UN7plt11hnc<14_m at 7xW{si_k
> z)R$D;KKs*GEoXmkS|a|5+8e2x>Pl%cYf~o}?Zj$1t&6`<H{=g?;tJZ}`)rA}DV?<w
> zs}oIihMh3hnJ+4MtAosoi&E_FW8N#J`W7`hX5-1A-C9xSvxk}{sh;a6D#MEEs2=I+
> z)C<Hf3{K^>H*WdVSM%AvsmHiin{g1fW0ULE=--C^+~R^beRSv54v5#5YAAN}u78nr
> z;DY*{vo%&#2kO;HXG2pTA at 9t9ZDVE*y=~Bklx}(CxJoY*zgSsaUi*(s at 9LEzdr`Gy
> z+M);fg5e0;K*J1ukl(&kLrXvOH;mg&nNz+u=q=~2_fXZ8sxjXXWfoNj^{g$f^{(`l
> zs%ncap8csQ^UyuLl+9-Z@~NWvwDg-|7}Ia)<1w;L(x>W$FR*U-DF*H`kGHg}JsPjN
> zVDNr|b&cvc%{O19s^N?7dm6;Bk<LaLM1{oU8T5kckj*aR3 at y90>hy`)qNlnw`bFbw
> zMRxB{eY_`i+4uXyo7dY^VpE$TFW9S%CxRhcJ1W~AwfZDhwhN$p7uBJvwo<j-r4|?E
> zLQkJN$N9or-&RX at f3MCG)azTWR5W+>u2Bnh`A0&pcr<ra9WSn(VmKmGoyy0!+WpH^
> zL;axg+Bc8!PN0nZ;?9T8tHaLLq_&A)P+rw>s?})wgW<y8wblMtn6Lcz`QFL0Z~Ovd
> z)K@&^ws4={EBWF+i#+*vPeF$t!47RJ@<5pXb*)OQJ+<7!{z^5E*7HiqSAKTs#dDr%
> z^^0h at a%s4a{v`D4QFWNI*5G2dkB-|-a}T(wF)y1fgx=`S9=ennP?0CJ+-6WW54|*1
> zxix0c(5RSxLmn4Bc9kv*ft_Q=@3S?RGQBHl`b(M3$C?_H+ln63 at f>!F+L4Jv9(yL-
> zIz`+5Ql at fInIvtI*LYpMN!H89I1G6_X7P|;Otu64z1VAvY{+BukLYS~-@|!T+RB9j
> z%)My-bIWV($0%#54a9g?yRzDT9mdQWjYxTQjYw=L3mK*L7v9w#k=f6y4vJap$^YrN
> zUZyM0 at -MIFE~fk_tM&cL>lOESmBmlIYiJ+%ZL#<t at UNx37TZEjZ}zG%xY*~z#$Ii4
> zNnO$snyPPkpO&NCrVkYVjC}{_*N9ywL){jZ1&*qD7^2lK5GYTT&e*-px4-h5{s`7J
> zhqQgsk9#Z(QXS`u&hA}V?Odx57T;+ZE2wWtRGny!6F)tYdgaDfZ;GnN$Wk{R8Kmuz
> z6_y;@7(A`E at wlMsd0kS)Q&AG%&|B~U<?)FC^FqPw>T1;Mh-B0*LtjDNd2i+We9;e!
> z484#p2<eU?jIXNEXGF*HMemq3+X+tTWvbsUpGO_%$K?O8WX_kOA at h$foTl4s5L#CC
> z{ZMt~{>Xg~eqP6MD`ZA(kqSMvD+ck(JqzzvqWmMzM6;^EOAY0Pr7LMUX|<0xjT at wX
> z<8DQ>T|o60gGN-8Nk&vO+mASAXi*)XHbIB>%jzq#e^&YMM)Q at HZu|Vcm+V`4MsnwO
> zz0f41`LmNn3(i)<ZcWG=m%2 at zuhU)^P3e0i^j4Z)tgF_C>dxvVix!NLwaoY5qEd)p
> z6CMgj?9vC>uY>G28ba+G^exzbs8PMG4-&t4UUguxdVneK<Ya|mf@)A{7R~2bwO$JO
> z3q!l)eK+cdm_b8kFAUIK3!nO+cE9BM;q*Yk{-RLt@*;)!Me$7DQND2N(dyvcYc>k+
> z{G=YQ)9a=Ez7*L{!<zAKw}lS64Qkolqd(uCoxG~1JgV(>Pf78No?-c7==rqnb&zSr
> z&pWdZi>h?xwUS#C)uCu-!>A+vK6kZMVY)+E{@OjWCD4oQvkx7S-Z`Wmf8Yc4&9hhD
> z>Z@(a8pJ!YP^R0wBj`?zdb~s34w;~SN9cj!>R)cv&^E`sNu4dz9bdRuckSw;g<A(s
> z)p0_;)76|G6t2bGsx!iBA1>k^%?{Ajd-~iu1zZPQm*b3b+_Z<6gt~1&{8Q(h!=HLG
> zEp<7)k7-5119j at 12a?obqmEq{YAeTvx*bG5^`89abvXlA|KjWE+C6WDx}9M2WAt at 7
> zGW5exw>nSe4qZo|_VoFw8vW~V-5`bKt$wp>v9>r)$D^Dd_vJsuSZ;VOXoActst48#
> zZOJ+ipXHNOuJ+MAuafGt>bVE%v-qg5TSonsfsQ2$C+arTd+r<hROWa*ba?#x%kJ&F
> z at brtLi}j}kWg_WMm7&6~- at m_R-}jRr9$l<H-8Z{Trd- at wMb{X~p`uT}s9A4U6PuOg
> zShqRUp-AUmGfchDp-yV8>nn=;X^804-)q)e+SOJ2*qts_+y8VVm@{U*G;M<4?<z%E
> zV7e{cqiH=VIJM)F!_d}aSYu|T+ZSuS-}m}dS5?>x?$C7mR;^&CL7yA~|2=%+>7_^f
> zjd at l3?u!^9b3EpCPWPfPs3t-!Q|(+YR at OXt?`XFAG}5-{YO=a}ABOyo()NO#KH-UV
> zr)Prdl;P^03oAvmj-!@BH#y-`Z)pdn?xXEj`!F-0zP|IQr6POh>K*s4WoPrzXIxiQ
> zuIE7~M7l$2zV3=Tcwg%x$!vY-*jpz=<8O&Vh1XArLUnJ6#@(qFEqqvAHgI3_?7(B!
> z=AGX6)8oK>S0~jTd-&VweXTPjroQ5rtT6VIJ!jM+%FB#XX%bbHu|IepFV^x->I2KQ
> zy9UyJB*0pK`-jyRAV;Ti?d}HNCbgZaUXA!$#yad$`>E=-h#dB!e{HV9`d2T`c;<UX
> zcVtUX$1?SFRjt&ghc?YlRkeJ6dTr?p<teGl$pa$$cdF^Uh~|;^ol+fm+U0&8##((d
> zYtv5}!su9h@}^;2x7yMy^qrZb3~J%s3jYJov>}Id`>V}nzfpsIgN2T&4Vbh3eEGa`
> zYw4uyyq_g=tMy%a)bfSSL&}_Zn9twYQtV=Pwyf9epc=`YI(0wq5`zo+?NqxbzCKeU
> zo=SQhGxQQaXpUFCjrrZt=J+19Puwz&{3KCsLmpEvUdXA_i;(xU_?1y(;=V4<jQJhq
> zZB-AwTX7;tRg>dR=Z`~dsGT<4YX1CEf$O3?;gySDy;&Z0OB$bF`c8S&-gs?gwlpUH
> znJ7M=#(R_(efF}WsU2qBS*sS%xijW*y?RPY)iGjyi>^!^sNJ)GZ@)w at ig+VmB;H<T
> zX at 6Snk~*VipzeIjeV>#323bj|Qu%(G&)u1&%BSbmc`=`rDs>p6ybh>c?#`(372jRx
> zqvI at e(UB*;pB`4{!Y$Nsj<{o9)DV_k<{$B7nvae&ud`p0FH)ZRzFfS$cy!FFY#-J0
> zqH*?LX8Y(4(t4KN!Jdv#m0h%6tIhJlo`gNOw0N{m+w#o2`kCk%aB}D;zNWfN!@h-`
> zt}W}C*wE;!+y>r!v3 at r052$tDtL;^W`flPU>R8>%?ESiD#rM7Iu+G}1e{SE|5USc-
> z+S at y_c&+l3-c7ut`kehm_1M%oC(mdHEdTb_Vf{SJoyKAu=%+eWI+f1vM(rw1-&d!W
> z&DQ4W>3qd?Yp!(<Nol6t(5i))@7a5|<#au!%@*>OLFQ3AyQnogBo15kVdb^A^}Lee
> zU0QASAgxvuoO4+1qdlzWpFC{Uz}a3Hs;#sM!5Yw|y!KgM?>fFHZCJI8&Lz|4g$VC#
> zDOKLms;4F^9tL>V6g#Oluf{y?)*#(AwVnOFmDS33^)jk^k9(GdJ~^)*ggM9ibRJ>X
> z9euwV`w0`q)V0jTzQggN%1)K*2OWc*P$iayoc-xr?~~P5r$Z{AzMnq2rCv~@|8k0?
> zEOd%Qe`(71Eg8GtP7|Wu>eRj%+Xozx9tco}sWLS#s*2)TUQBj?stnIReuljI`wL%8
> zz_{>#=z8<8CeFQYytd-f5~xch2#6LnAOazZWU^6hDO&4xYzww7tx-m#sHoJ8Au3u>
> zR1}HU1t=<DR04u*3CSdS+EYtCXxmedL_}*TPFt%;70C$E-{%hWdEWQB-rpa&=AP}I
> zd;Kn-?~-wLVWVZ`JW-h=nyp<mS+Kh*q|L&|cs>r2-aZo+%)K2He6u`A`W5u<CKKeX
> zIglMH#Z>Z-z0C4f(Dw~|RE72Tj}lvn{&Q7?cSAl_K#zJD6eDbC8Z7H_2~X*G)tOt&
> zHne3b!E4 at Gpi_}{aNR-C!dhb>X`5(P?`Fvtt^nBscN>H0N8$_gl&hjXS&GO-!1%k|
> zZ42SbHQnJ=x>el$sI^=T at EP;89?s-?rfxO9u)GI*z83T~J5Dw0WHe|t?l+8E@`O#<
> zM>iO!qU{%^&`)cZ8ZX9Rt!%Y7CrCYSW1J1HMQ7GBQIbmi$M)v+;C1U16>Q1mGZ9RK
> zy0up$spF%dv#3gM#fl|1-YMDSOjF<Na;%HZ|K7{)a+F<W#Ao(rr6<-ohpQJGLlO`3
> zEtAPO6^#4Hz&fR(1Nv7I3sX#7gUcbwcTQ>3Fc at d>H*ZD^`CGLj^5RCp#fx2Sr<sud
> zbI;&@BwdfW^w))P#w2Otdi`xdl3B at _7|(#5yv at aIND_UJUq|2IZ57t8y=SiOY at us1
> z9m}6bpA~*Z#+eDen_>!YE8}Chay}B+0_xY?OD(P<V?lj-k&O4aB|pPHm$)WlUtlen
> z&&T`D*t25o&6}m?W at ODyd<>fVAd~V at bci=uADAt3nYX;m_g*!$Iu)RgjO<Zz0yijV
> z{(l-`<%VrUUt#77egKX%4s at Xi@-i^DzIBcDGMSNcyRh!Obbg%CCFHD{6NWHeCD;wD
> zr5y86?(pVvFeaIsqrm?ofzL$Ji+g<`qdFue{s-`KM`D2^0`n5oShjNB#2rjBmmMGe
> z&ivy8uzp{N+ntxnveTnrJNk+(pApHjOB8JB!jaHDz7=85LB@?rY&FN&ukb3v7(R5~
> zZetqO<upR;rfzU}<GO at g?+#<c;3X@`eqNntR^j?2a$T}#+-!P3l}}d~KXb3;IatsC
> z7$;9;sUx6y)ZG;G*tp%$<7$GWzn;PQnvRJP=gD^;Jr{gGZuScIIFtAFg`kP|R?Hyx
> zy1t39j4NzojsBnm&4NQahIl^jO(5S+7V6)3(@ytuzh@;Df<Bb<Ds>TXM7dI0|2yd1
> z6Mg|5jkz4cNBS+nSk3HBNc_V19qa<a<_*_J(n~BO+0wNm=&fX~^46r5nf+UA^Nky<
> zu~V*u+#UjYtrDFsQhJpbC&lfJ34Wj)7rf?Zhe)vTK6J6`p4fviviq=!oxEt0G`K{|
> z6c?daVSi-<6KH+=$*cpw1fK9t!Ecb?ZZkHb_s~l&DFlJ?#n82dIA4|6T9T+PNP%3Z
> zw>vESkqWEs&6e|yKs7MUwkwV~?Aff>==zf6MBqs^`;JMyj+7*}mor(Zk1AtiZQxHY
> zb*u at mF}_Y8gx#hhKD=f><cL|0oc0Q4@`jKuUqf$FWEaZ){6%2MW<m|mms({mt(>bc
> zE0V0qI082?2cG6^C5dfHW_{c)(5TaaR?f!1iZ&*Dvfyct?xz}9o%h6Ahk!l=K5t2}
> zaKLXKg)>T7n|ti0F0<l2=)|+K&8lTAXqY*6=eyHV@;Q4+BKB5Sw~cvCeewq{f(b+S
> zWfGt9&9Wy>A$WZ~#sv5S#<Q1i7X0RT2YftPU6>rku~_?+j(0E)67*@3f#p5AY|vLu
> z{_t{Og?TL2)@vSx2PVgDj}c;id><TTg1OpkD)pD?A#JQaVcwp;Z?BjEJT*5qD()EC
> zSQWp94uH+U|2WpzW~cfju!3XYf4AT6GAdy^1s|fTN;V|ApmU-<eQP6H*1j8k%Y?p9
> z<~Y+uony5F&ID?Q16LsJui!AJZ4O?JcUKWU3mUL4;#5hZ=RMfFfW6o3NmkJ3aNKPK
> zMls2=%gj&0QGjCz^xMw3eOiCon5Ue#5Az^k)-OECkB~iZ9{CrZJ7Zx2*q5{X=r2I;
> zA7GyK`9iN#UqL5i!rB*?jE*>sb(EiHrCa4g+paJni6YolszBo;CNai-djxn?%>nX#
> z)ZNOgS{Di)Fz+LrN5|ZqrkhM#f<(fa|E*8dV4OzUf5xUslFY;ymTT%Knjk+828|Np
> zIa}X%fomOY`;rf7w_;6}bx at +5*a`1O21N*S<Gp5O7k%h;h_sgpXkQi|J}Wy&2p*m&
> zvAZ;Dd-G+`(QLp{s at d~dDs}pH73j(tSv%p4=8I%b-i^d>8o at 2F*V4Dg;J%qNYPu)Z
> zG9l=f66NjC1DA=aKu;DG$-HV^RJT>rjb|}8%tH3XtQf9YdjmRRu%uoW!ad at rRK$8*
> zU$`CfGRrujZ{1cY)akt{$pbNUN9}Y*#9 at 5Ona?&nroz={i=w=C@*^N8B{!B$8scHi
> z75JNtgRt)sxR)MOtn;)FX*cts5jp?!%qWk-+$pj)@bE`PF<usCN&B*1G25yM_ at 8;p
> z$)~(ext#v2 at pXJxE;;Msmz#}~)w=CU;N|>slX05A9sGF1cG%^V at T-8Xmfjl!`pz$}
> z0X}EuRj7~X!WS&FpKCCNhw;5&j_l7eSHytI=<m1>;ZLCiPYHB6ms{i4%-S9GDfhV+
> zb4_hITpLt5^xOlY- at o>&nV%{csvI(u?bj9d?7VJxPAMb>dD2uJWaV&|iuRW$aaT|t
> z%*YZ&ly7}4<@>7{m_h}W&A|?vD1nZ#hss%LCVB}q^ldYx+XQUFA;0b|`HfMwFN6O5
> zW8WUYTKPw#WkCv#O9gwdj&6x%alJv(dqf}p*`?|}&qpr--j%q6tSy%uGHlWkw2eEh
> zb;yeNgoy5tX!<-qhWnEDq*Z)=1$+E0k;~OvtYrQxYjch9q<B+luWmM%&HHmjnv<MM
> zvmI-{-tas`Y&f at GVQ})H!t?sQvfo at Wz?xn%>}^&Up1%WH=x$%Q$V at P{>o3q2<HqH7
> z at OFooI#y0>Kj3A-+r<*Sm at 4`<S|$v2V{u0R8e at Qa4ON@{8_O02c<$+>Qd#pvb$t at r
> z`M-NabehP_-52QAs^EI`F+k7w(b>F(9wU~jPMKAZB at Ax;?R6KAatXc3`1zSJpFg1M
> zjbf~eNw_9b>(HJPnK%4yJCAT-jC8uSR~li{*`PzJXdAPJHvghaJ#<wBdc6U-PNb~2
> z<TKEna8Vs}&>5c_Q-SHJi<4Be33$ws=y&cWVV_F$$4bxev*{YA8TfF5>=D*c_bv-?
> zkI*v}8Y|&Xf(h9TJ~sVvA4Rqt^4KKEW=b4EufPL<S3knJj~zO<37EwLqoQp%Pp}&e
> zu!*pNETw2MB&)d7`rh_dCTrc42if3*e?dPP=2?M#r*l4&z%I1*ALg&x9`JjMZOq1)
> z*~$d&es53TGv=rh_77%~d&%`DVgw7p<4w5V(c4pD?fg?zRkBgA#~j)BEcU+{_gepc
> z7rF{LzuntI*JPX?V9)*gIi>shJzW2rXXfTp*hjZPi-!(mv44Kk_i{O!F6{Xc9yfEr
> zBXqw<`~^JbaZr))Bxvv9V~m%9?D6}QLC8czoXM7rvXcI1n^DK`QP%qu<ojn4dqHy#
> zL-*`*^@vUzN4A;xm=opeO!o4J{+^GC98o0qssl~3{*@wX0KX5a8n0%0c}a=BSDnuc
> zxf?F0)K{39cSW$zmG{XDqiiL~11b-Q)f(eZpbI^q3(uEt6-!&Zv7hA8Eu7pHLm$iw
> zMSls88JcE2COtEcxz;~M1Q)AwU$?ujw}6g7E)h!~-hrG6pBLEwN5MX&s>wMf^*)OJ
> z!fu5AYP at Roz0lh}+hC;%xwGciM_IFF|HFsQ_T3xMkUPmeN9E{CX4O=J1ufrdj117B
> zofgbR4*F*AbqW~pkwt&^{h71vG#>)IpCR&`#JG#{vHuUfopL6Ik)XXk1~cOwPUaJ9
> zgUD#9CxQ7c*&I#RiK&lY*M-qWGWSFe04 at 0%c+si2X*EZuOK-DSe-->Nbwge#a7l?F
> z=VOJT<Ce9W|Ljt~OyrrmBJU2cZ{G?wHd=I|Z~WBDsM(+cW8J*_4AH5X(3Rk`qH2_F
> z{bgYGT^1%(y~L=Xm%vA52K3e>*!&B`(wqM<PY^JWi>l4z8ZFnol7Yd3ws=8L6_ovM
> zj$C*$YNnymHYI8CgA0<{qA6Z(JK=RNN9c9I!jn5a23X^+%sRw`)4-`q at 9U`2tL;?E
> zv7~U?1U-a3-Ll|hlgMwG>p6Jo!{u8*8=^B45^u)7|E?r2lU|ay7W-KUJwYHks6V>A
> zH{}TT)bTR->{QRUs$|PyyCWEYU;;l}_TYz?<8~8$Q!Ewk_`zEsgPc?Vn-81i>G_sf
> zBJf8a@}a*s>=3G5(BW at Tuf)|-XJ})ycc5k5P#PGRA^Y0jm{>6M`a9e+##iRbZ1!`(
> zeskf+ddPUN$3pie_C?rvm#;R*2>d~7?uP}ZFRqlMO%v#Pf){k%7Qt3k5nH}e)Sy2a
> zK;+`b&<ovqLih2AcR;VMFtZ_-j#Murc!2T0>Lt2#+St#(YKZ+;x0&mPEu<mS>DTJi
> z5cwN62_m0`anNBBfe$6N!rti%U7-+q#0b8bGx6S{J at FMapS$UaimumZMA#mW1|5}v
> zZm$qkU_Wlv&IHfDweGDtRlS*47{ZuPNo|ONuBT3O6|QDttKuxoDA*VxabJeD?|x>T
> zz$k|e at B?+eT>7S!JZt={v1QT=?r)f=GOSIf<T#-Lk7_J)G^f2xJDmP{)Q4|!t(p at d
> z1kbTyo(P`v3fAV~lF`eLRw)8>+ee{&c<-UNsG3o62fDy}ie%juW~8?TeaQqaTWAa!
> zYb1Sm{7=yVeu_F at Or`v%DzGts(hFp78Yb%^*9pSlw`f*y-}2sL4UCfB?P?K0Z-;Ip
> zk=@rH2d0$VR>sH-M_u9+E5QcyW$Gol%0ArJ<-lHE!yV9RxNho|9y7K166_XfQT_8#
> zOAVciYY!n0U_P3`yG)#t at Gkha*mO%d at Gjs?UYxnD2fm-#SW6pLD9swWmf$q8hX{XC
> z7s?ATZ(`VuoJ22Q^A_xcg}fN^vVLJb)@^}H<)b3F2J}%G=CT^{9_yBmss?CsRdls$
> zw5&bbEU~3rr>%^VJAieQQ>T at 6>b)XdMkdM1kAl1 at QJ=gjQ7>{iB at MlUF|Ne_rZr##
> zX`lR~%hrx>ON~60Vog$Urs#LLNmP1V?Y+u=`Z2Xnjz|P%585-;7GasizwB)y7=!-L
> zh?)?EaA=Xl%Y>t&Na9_aEmy~P$$V5sFZFvy&o&byBl{BXEcU9M at NatDfk?GI+oJx+
> zI40Ok&U1k)!4~_t5j^kls0cIm?qc}$6u54?-)+c>F*GpL2J<}yXn{1maKgV6!+ at pF
> zWs<zlz^CNT10fRPPZjTSk4;1sX_tFX#|WfmrTPP7jQV|}(lU3muUECp;RE{#j!wFI
> zmt4?Vbaz30^moFqGR6XL8Ap60aEw-`6D;H*{BblfYD>0-{>;@Pc|ZC?;dOr6C>t=w
> zdeEa={3FOMi?An at e#<gP)4GxkqT at _(dmL=MC9toYbv1W4fqsK7$Q~ud(^W|`@1`nY
> z=gn?#W2ZGHIsB4+q4ytyZSk0&HFm-$v$M^>rY6b?T#8ZFyw{1p6Y+1bkArMu#c at K(
> z+J3AQm<%vkllvJB`F4aUHhx=GfW&YFn8 at 6~VA>XkBi8xRkkfaot_p!QYKdQAh5ds~
> zkm<vqlZE%SEoCP6)Fo;;|6{D$PJDnsSKtpu=nBCTLrk%8?s}d2HE!Bvef*IGGCJn!
> zcUoswVDAPJzaioe_J6fQNNn;YpY`efE*YJVw)WxI8|qs%Qw6{A&F#;Ce>RkST3i?!
> zP at MChJkN|0jo=OQw7A_aU%`98c)K8*+ICT}JyU-Ez()NY-s&%nm;Ii*n&~Z0Cb1~n
> zEPL|Px1_$fJ^H0|VKz0fij23*7k(R$y00)Vt4+Ho!2qLBb{}#c#?aZEZ5d?)Z*O<Z
> z^NE3;)Zp+QW!L&~<<LuaJG>Xv<5yGiDX~G+9 at W0Wl{b6CRwZ}O$JWe6`0g=!5$wJS
> zxBd({)S2)%R!MBR&RthU3%3LRY6phNUK?^|45Mm!eazGy_0$rqXKj76X6gX at 0b+Ng
> zK0A>C{~`BYrbpW{2GKV_SANHL_00mA%K`kQi<+0M??qpp5E>o<KcqG@>=g|z1!Oy>
> zf-N1sa66%YziSqrbi4zcbTnO~vv79UCFT^#+OIH^ylh#$>)ztG#_ew!>}jHgT(aK(
> zHO=woMZ>?_uMSxD!^>W<e=}c$Ph4|&!gkv{cNU?M at IR<0cwYBliQVxsaEY*a`|hX4
> z?FZhl*YV1ND#yzUDj{>&FsF;7-w_V$xQM-w?^keD1UvzLGrP>5JM%uJb<mBU at Xe#F
> zc7<m?u%SYeEVvfBNx2q&iov6S+YTFdvI%xW-IO+#4~c6Cl0K*+YwI_cpFj2~;g!~V
> z at A>%yy9Q=Bk5>xoj$(}dWM1Lgn{1Lgavj&c{N76HgbcWpR>4jJdxV-L->)M6jwa7&
> z_nLtIq)!wiRb5?Z2@?M~(-pJ8qW?I_O7;}7tH7=_karSXbKHLO&_>I!a#0zv0ca+(
> zY!YycVa5ncY?SV37u9mU4R~FgYJUj7MQz47vFj7#u2hN_TDoQMu?&UH$LQw|JLvf)
> z)c{NG6!@+xiM>E#!rY-x>Vk}YXyc+pR-ZxZAlLrd+`CXo_0SbTnxAWfG=EsQ0hT#~
> zzVSMbe%^D5=4F>8k at Z-25b{VlwWSOEMzRBRvKIK7D{oANb;Up3{w(z+AJfO6=XCW7
> zK}YdkuP^a&Xm23n*l_{=IykQi0qz+*@Wz3tln;Q(cKrEu+M at e15AeJe30bF$0$`(A
> zW7ykjHSGPK$UX3(4;}{l;ud0)Cm1v6mBa5Q-;#LKxjB)7k468uB^LJC%@&+=NoQvU
> zJ#4Gb#u{32u-_K*@q&|(OC|yD3U<5_k&AHvmbt;+q)LK4+q<Yq6!&lJ$6~BsYtvx5
> zmhs~{@{|kne;5jzODJ^o)ngkTi3uNA{}wf~=bg{xY??+1zoL5**kCrU&Uhtm?^TJU
> z6aDR^!n<qpf at w=wFg*|7Snr;Pf!HInut)rXo2wT7LcW9do;Hnv4Lpb~PaEg{My+G$
> z`nUSNV`y4=b+j$$;a&JzZVWKOH|>uC_&7waUGh!UiW%^Gs20n<E8v@#oyYNbXAIt7
> zsV?YjUiX$`D8YGPCsSho3<XUYx}dHJe#D=yC-1`-qe|cp9btr7iF3D4hrr(@#6JH5
> zV?C0LdEC1t>*4<ZU*Oo%j}w8*MY^0=i@?6GpPp#eCjsY<ZnP`{_N|%LVhc})O<U;Q
> zAij8ckXaE>9y_IycL`f=g{QAg4^z<pG<)E^^Wi(;t7~8Qp=ggy!G$}gL5~fD>|ULE
> zRxJN|KjlBTwnJktNR<||Ok#y~;YYB&NhOfAW<>^_z6<P$__0C8KQAeB$;lD#)``mF
> zrp=O+=%Dwlv6nyhEM`+-9|SHvwPXvPsUK&;eKGttv%y#3FG=W|>lm=J==d$OB1<%=
> z<2?Kd74U(d)Yx*p4m$L%kT@|Fw#|ICm|Z04I?qSY`Hj>tv0kgT0%MB=?sr}p%w at pu
> z$zObt+lH~35-8>Dz$~X2Wg_xDN=$u_ at 5a^6s|!h==Xdx`&V*c*6wIyVofX#E5;aTw
> z&d&Z6VbQl`u#BeV{Ij-tn`VN{>5>A+{jtr)q>5^xo02*H)Fq~m=|5MqDRS;Hu<w7z
> zeX#r}Wd3}8a_MPic72L-Y<(F28 at Gp-b38BOSpM_&CO+Pv+o&*j`$Cqhe9&0--_YVh
> zwU5Ess}KwYf3flJ$y^U^a~58n^u~nQv=!@i52K*%RWIZDEKy#3_{@q*F~(p38H0H1
> zu3Et}+i1Z9{ub=<vy01_fo(QEwIVj_^ZG0NZ)*1Xi?}z2w1>8ep)a9r&G6x6Lq57&
> zdi|CDaY*)iH$yI2P}lzVv)xVnABY+Hk@!kgSifB?Du=&$S&&!=nJmB+H*MyblFjNu
> z{hL at 5Npx?CU!P2pAqLHqs;wCc_YqkB2d}~(sv|b`-A(aJXMQE7!hfbdx>WmMk6|C9
> z2z=Oar{&>~f5}|&6*IpII^KQ`_aB<4sdY-}rRwBp`V>DV-nPG9 at Qhc%PxgZFfz1PQ
> z&xJ$0<1K=dCl<y?X*NI78-DrikT>4WxGyuD;k{{w_!wtQY}psSfBn!BO&XIiwtXKT
> zNc;f;D=1I8f`_j<BTuZX3Tw3d_ie1RNwkIF73QdxAAfu_cR>Go-2e1aaZXkqEicg!
> zx<2zOmr!jJ%dQT{`~y1HBKR9Lt69D9%vEMtTR5*!yZ8~n&VhNoI6f|eA0~UC^+W7K
> z!i4JkXAR}4YbVq<4^-R!^iQKQCa12DZ$4aGqIvtGKF)Ca2WtJ$d%eu%5b1Ak0Vh54
> z=g2gwqY=K at kb%@gSIm%a*5lb?Ry~wH?D(8+ahW{j#*wVYX4QaAxl at uh8YQfUPBkDU
> zSDCaPesUTkd~TUn=qLB at c(fc4r)+_)V*}1%>H-eoa;9zVXf*JAXxBb|O#e4tA$|lH
> z!!dqK^5(!!^kE|O6}rsH$a<NX+-|2ZX|YQRx~Gb_Y4>r*N>YOx;P(UhTGmc<2Iw><
> zos~YVg|Cs;lY2kk;&mo)b at L3RRK%W$%&>lQDZ=v0_;m&HmoFbRj?*ob51oCK`siM-
> zF|7E$Sz5jK$tAUI=XK)C-1B8#5^OXI?tS=9-D>M8-Fwa7a4Sti;w&(h(2<8Uf+vrm
> z0ltp;m;OL|Hgji8GkLG$P8-img#LZQ4|a1wE@`_n0d~=F_-SFS>R8Ns^Stk#+LlIL
> zs9G8wBIm+FLfg%ZA27RD+G`nYdv!=McS0=t*A3j8fO{s~Yrwsl{(DDp at 7Eom16nV&
> zHA&vS8^1##letXHIcwh2b_V)lxkH?G=!dzGrC(y%&msliCMoF*$WGZwavbG%;}Hi@
> zin-aX>*4GZvS}+ng02!@2v2ar2DV&j*z=QOUUtSe#f2-!q^{s=AY)3w3yv)tbMeSB
> z|0Ma{S at _Kj>ES*B=5N!=@srh`;SZ|2LiTW}u-iQ6H^lAdM}nS*LLaYr<b~KhF{9vi
> z;Jx`g{769q&XF~G`E5_^XYept&%5AZ_Lcuen}@;1bR982-k~RW|28jXJQ=?cijq|Z
> z6HjfRU^`26joDz`In}_Xeh%9HA!vI#-R)Y0y|o2x5zq}{_z`GBxg~gZG2$|x9FU1l
> zK_A0$;#r($98iEK4fHZLje-3+d_YmI0$70e#2Q^FmpkEG^|D-YztanTpQ!Iebw2z&
> zfDw^$0BldPUlI3KPx|57Tw#CzJa{3s;3QeAyMX29m8cy_L%3ZG)ox6p?!JfPIUM7O
> z&qsz3GzxrE{~DbRJ-aaP2zj1vb;-M}yr2z!fAdbkR#2Ku(WU+Gk at rbG@x*sTe93ne
> zconhJ9lJUh{vxPDzgck4rg-yTLBYS~U at T8E@^%~S*k`q~xz$0^yA8YyGIASq77g)N
> zfE<tbw2kG(X9x9o6oO~ux+pK`uIO8|U?g;k71Yo~N<Ug{1KlZH3Ez92mMezbn$E{8
> z+)n&OE`K0dkU6%0&*~cYH2v1t)AYLx_*BBWc-6ub at Csl%<3^ds!@lHDyY>{r_b#}x
> ztm$5O18C}V(A0g6(UK~DZ~$bS>AxEZADIe1@(Nwl7%g~4cw^IVeiMjoA9XG at k7=|t
> zZgCVhzL$EIf*yB!3tO5MKFX^9UXU5Ditp)y-2nHiC%sh>>$yyXm{h?x&}HxQjO<JJ
> z#`e*#&jfF~OxTz3lZ~A)`)u5__-j<~>{`92qq=d4%!%`s5*^CRWX{;A*<~&b*43x>
> z@@EMf%>0LH1(6pTm!TaW0b`m9pJQ^LwwFIWMc?L4vYt3qd^6f|3z$D*j?^yLtA806
> zyuy$FkXE|iT}pUS9K)N{=?%&_mCNZX`N5(#llX?k0^(EJOXOD)3xqft_}(ju3zzr_
> z?l-?o_FlJ56THx3Rt4<WGu`k9UO=8J<ehOg-odhI!nmtJ!FMf=p}yOH7%C|Z2|n^}
> zk)PLFLDIHZ_;1-0@*?J9&z~{N*?;M-$L%#M;l~NxPWJ<3<s-O8<bPjJ#1cVIUQaL9
> zzud2z{Kfujs|2>ksBlY$iY}~@)0RBgD#aHsu5k(@=7h+Fvw{0B;9eYH%Kd?D+W0-&
> zwCa{;ATOd1mTVQgP@?nfVf^l%(SHQ~?6KgaMJWj62h)#%pVab$1v!|bZF#pBTJ+2U
> z3v}pB*cUnn{FgMt;QuT~+nk7h`-)!d9L=(+(MkHE(Oz{y(k|$kk7~o@^cz9ar_eXQ
> zp6~AC3!?WSyH_R6zMB^!znjAk3wR3I0QB*$9{ti~GNW at WA?=9S#9mlf%IYZ4n0S=m
> zgHPT2{pYiA{tnLP^q<eg`D~oO+kZY!)*-$yc at Ai26==(M6TVFe<0)^OQhGlOcKq+^
> zl<xa0`DTo%uzepBSX`*P;X4jA=(~`iN0Xq(|NDMLeZl76N(&fDC&Km19cN1Cq*C<x
> z30G6X4#<ny4X4qrxv~yzK6g1|Y+ at ntzdQeY!O1XxdPY+mc#j0<>(H+FQkExunCbpz
> z5OiD8HXmRk<TxVRoa)gu81au%JRb?)KvGZHf|Kr}!AH?F7&7MOkyi1Au(-~cdR8+M
> zb-e-KKj2%iVd=~<?7u!yRM-czT~{;<u`V>2ht1HJov<IS6nshOPSDJs3yZ$@Mtsq)
> zwZ>JL`!KfYli`vl!1*9AKI|&lBytkDeBFEY at +aHr9zH>hy&%ad(N@^omq~Vq$bYRa
> z(LuKu(+1lH-LrG5`X=_xjd8)B4#i&WNy2 at jzwEE7DMTl3t5Hh3%~w^PIe0&|I!X4I
> zIUN4$;i3w1UOxx&Q}hY@=p$_p7-Fx2zAKj&*Irf0o{6c4&g9v5uY+!~z`?5G!(Yob
> zMYiA9eAr at pVO)&4+t*RH$J0-VeKQMd40`@$#K7HvJyI3~87zpA0{?oA_&;)c8P5S#
> zyUpJB`|=4Sx9V#JdrPA4ol^_1X2-1A(d1$CvE~ht?8rtu+9IiBXEx>ew$a-MKBP2j
> ze5I{`3GuNa?us?4{w^C>hq1zbD#uR|CZu)Ql=`40M&0X5keE=`yEOD|u}r!v(=6B#
> zB#u9gYX!zgclkWZMMk-gb;pnjyCKt0LB5#^4DHmv`*=*es${k~Snw<I30UP)LtT|b
> zkpI-YtoDM$!1f4I&-adwfX+>1#}lntmy)d^AN}@bmTk0+_?NV0844(I+MkHAbh+zM
> zOt5t`sgq+vze&v>?Ohi?retE<d4nxgNOazo^S`&yy)n`bmLHZHh8SCW=~_Qsto)l)
> z at Z1>(hO|`v-Xh9HOlFID82Mhm at 2bqV8u7A=9tk~LV*S2Jy*JdO_rR3KGFh?iPfFTW
> zNbv61=uJzFN;Palo0jrS%kkfDv!xpG2{u*Q{~bR+Wyz@%?D|V~Tq~_+d{2~bklM at n
> zh#jDJe_uaQo<^=oPZYxbSMb at _t$WiHtvPA_Wo*{hJK)bH3%Vx-hLZ4iObD?#?{5W8
> zhFCK7v$#R~rz<ra&-;}clV-osWmUfM_=KFcmYhoJ?KsUI%4#C<9F1ke62eW0X`GSu
> zJ;6ay7b#y6!8WTd-0`XGDT#X=wn&6$JVz2-2QeVep{Fh8pW?ZHlkdZ?eJSYcC1Ijd
> z82InFFZW-Lo4fzJxTX6W30|qcklGm$Ok3l^_kT;y87Y^AcK(Z31zWJLYv4CqXp9l;
> zHwSTr%n(TlzZL#y%11}}sllh=2N at J1g8d${Yg?WhpY4vDw*OMeW_<6$*f8TH+7(?U
> z{D9P}3x-W)eSJCqf}?ua49If0Ccb2Tj&*wm-}{>Xhv6BmPy>f7E*$b9_>)HPPwd+Q
> z?Arj>B05GtT-Jkl<E at b2UBIMBo`A-9j3;~%ns^z#)#;1={v)v!{p>~`Z^u>qZyy;U
> zx4Xkw1^Vd7A2x?zz_6pe<gg4wTqE(JB=&VP;YmVCE%?+D^LVZteKqhxVB at Msr}?SC
> zkHWFWPSu~}fp3d1==KpmP1pLr`%)2W8;7_QA at V@{Na}AZhYhhiB$&?pdpt^*iW%b{
> z0Z*8W?@lLuBz>i?Q`(E*(QJSw>hJ!p?&i0uZ at Nr^!zEjQv)>Sz;=}h(*cm1JqvRAE
> z#Qpt9|10!MMa3?s<Evp`-?rV6iYlqH9+vT^trjul2w|X4o?P}sEWP-92;w$^7IgnZ
> zpVCq>=hY35OFjmc7wV^T*Y%oTYupF>r at L-0FYINe=a at y)_X6W>MeKC7d9vU)$gS0n
> zs13YUndrFZ4?h?Qe6uv+RW8|d&y4BaV-U|}0iNbE%e%uF4Y7OH-(u2(Kgn#C1(7-G
> zm?$#E%Kvj1w(}sR^cdE2OJ&<6_~a>DY;%Tfz*;Z1A0}%Wva3s)SfB^30(LV4b11|7
> z-l-ealH2xL%eJ;xb>3~4H-y~()o{iUna1B+JQ3KxE*HN;6B_Tja;FxTYcvL<&Kvcv
> zPJIkL(-s at _pN<KQiT(F*J=w6=HE(Te>`VW7K;A?9j=|PsLHiz5DG{T(G~(?{C&p-X
> z%c(hQF-8$B$I;e%@niN+aLFf{V9T7b6SjHC%740~Ep>RVZcZ}R-0?K4{w+Ko7;GbL
> z0zWAHd<dQmjwo?yu|B>AZjs*S!*y$HXq}6iRq7JW9RJgu?p|K=$jV3i1%L*I1-&Z#
> z2XGda=kcyeWNA-do8LqwTd%@b9Cn6u at ukskn`7$BnOFah>q0u6zX4y6|BB3=&PP|6
> zso<&o*LL0_xX}J#(`P=fN4=2i2rY=%9wX&u?DP`Z?)6H_^(AGk at H@T9NZ9L)q`38W
> zU|-6F!^kU8+{zQ$wGHcQo599wX7rvLE%+^Vf^J6}v!N4X;&IPk at OJ(pgYjQMhG(6c
> z*|*!1QoD+LAoB|m-#^(=Hf$Sc*EYiymquN9ZN at tTW21FDNdMk`vcHR9bHmCf?&O`z
> z&SMU0u- at t~1bbKysDOzn1uaz<BnKW*ZC^4|mKyUJFWVyqy1i!UxlZBQq6yz7=H^aV
> zD!m|0Z9_XkU5dWB`MinD&1e<ss=IgwSe9g280PAwdlY<)>(%VVv)Fe=f{puGxt;;d
> z2VSP_;J3%eU0snh-8-438b4x7qVJSOPb_6EvgzeiaH6>*6`0H=U++va=DEO6;a<}U
> z(P>=U))xaS``r~u_A+caM+pYg|I9Rzd!1yO)7VU5<K<z;$HK>6_QX69GHbfyKf}H*
> zy~WSQehY{0bz$5d^Q5+0Ow_pZq|QgG_0+vyvM)R=7!P1Su+d)<j>gy(@B|N)AeLLq
> zvLCBhb~WsEYrO)G6MYPJfqKN<)oMa3-kLXDbY6V%2fcaf|MF?X$!&A_3-Zu*Iw;{T
> z;%$B|(L+Y!#c9Tl=oK^muR5j*wgDT-Mm(3o<xe+2Kbx`h5qoXJG>pRu*nSu_;U_->
> zGiu;L*RnnawvWB5_dy>=3%=JT&@Y9Bat$VNwT+QQ9C}a at atN|`K$9 at _UZt|yrj<q%
> z86(@9nB$N!+EcCh&0Z&rP1UzF(h$U4`UU7;1;6=vVPVH-6W at Yg-Z8O^+H?=L at O-CN
> zt?^qDpQ|?GXTr~pABhWh!A{Kbo{0sBo7itwK_>rb;jt2WK||Blb)zZY=ls>J$Xy{&
> zv-y;vAl84uQ?gHaXX@}Kl7FW+^#)>Rk6s-^+xVMfm?oRyDy at KCC{LuW!p^4*ma$P%
> zQ3a9L7>dhce7Rj6TG>O30y5 at Hk~=yfm!*^nS>xd1a)Y#tHIHqny#I#ikGuuonPX)S
> zP4K^GJkl~L>KAj#DZJxRT%INM?V+ePoEMj$Bk!nW4|P(m7J6%W1vwYH&+EdZzs?}f
> z*vYkUQg3l#7V^a~F9{wqL)s6OV2NpBP-mrY*-pftqK>J?uZqiUeb49Ke}l6!W9dR2
> z#hqq^?&lBnJ)c%uLjV1IU+n1HPwJMqgrgMw{rw_#Lfo$CNq5gPLV8z88tLl<qg+^4
> zCm(XI?tYn}AT8aHLq(>p-)SgiL#7z4j8#%E7xv)(^Sb-xxNl88xiiAR`iilRHpg3y
> z+WzrLU&O*LvXlwsc6Iv=D7vWdHn{5zK37K#G1QQ{b?N_Sy?u3vrE9l#M31sk(iOhO
> zaO4Au9`HC<rv6JFjBiTuO$Gd!3w&ji at 6Osi<_fk`?|zm6ZczdMUtsE70po$S{3Cp%
> z3i`)g&^PXKA!5aX^J}mUc)73z<+VpCp`j+smn+ at 5wv-K<Vqp1#zIMcVX!b<E%&GJz
> z8++(qU at Iebb8%Y%9};hMjgAX3s^VU6gdB}^Qj7hz4n73mD}%*k4SnGr$0?<S)2A59
> zJtD!g(n||tQSS6N6jG7Z1<Y9AKjhNtI$#pMlyqlpwt2C&A+512_<OFG9~*D|N{;py
> zpl=?1eKQW~UmIhWv3bMVSzf~x_Pi?Cq%TA~<{0*nMg{wNr69mK9LFj{`BAZFxzVqG
> zeT-hlBBu-DFcKGNDcS{H;iUdAZg0=4z;x3`De|VAU_blTy}k;_`YNF%4LV<L>dtV~
> zKhXDlw%NxWBiy%M=!U>m-K;Wr9D6)ckgrRiUCQ7{(&sW`RNuVws{XY-)P29#C~m2|
> z>m at 44n1a}ci4xd2++$Q78 at 1tUb2#`~2kfMiFh2?0bL6I|R0dO|KIA*taIr&_)KG-H
> zLYRNnE?H~2%}hrO=PztWe{2=6@<W~}VQo>6cSGF7I!50q3vyw9AjUdq=Vsp?c`)4&
> z8cd(8lBu`1M-Di3K<OwB&J}DdITdie<dpC8om)!F`55Hn5{b<1h^<(p!u?8epX`<Y
> zpZoLwzVG(?F^5Qxj5ex(`91Wqg-E$yIw0$qgIV^I5SEP&8Blrvc0ku?tl4mhty{4P
> z{$#SC9bx!|;};<d3JLy}?MSuEc}{uNgh;QVZ<aY*DKC>thJN5#qDumst5gbO*r*V$
> zI8eHYRSGAvJHupu7?Cqa8<BCp2ez%_(&*~I;7#m<)MC~mjjnaaHNU2IQOGw3Je?)q
> z?Uoby5;TzqjyTMr9}&F3?xN;?`aSsO2*?$DLL-i%I`Ba1Dsnuuu?wsy%dg7RkmLNG
> zBSIhV##<XVgCG2dcA3Wu4(_3JG12}UbiCpmUTWx#l^FJ>t?{udhuo;yS+Z7{_xmUt
> z<;&gcWQdMd|2*lL1Z{hf<r~VvC`EDDF=@-T=TvG=$H$JZ77aAON9(rjS)`%Dm0++f
> zikw|jvJx~YYJ-_d=so>?mG;+I(I-~&e$;70Wrz6ov!{`eT at up5exl|nx;|{#{+uGV
> zj^~cdry2K?q-5VrJJYwOXk*~2yI8w&_VkpD`^mUxl}@uLgCp2Jx!c`GRxBMdp+63u
> z1;4B at D}WD7m7H@)18Xx)ftI33x)8oT2aUkY_dgp@!VA6aJBFp=o?Gtd%{B)v27WIA
> zO?a0|*pHY7Jogp7q-cuc at +V8YEpgN8?jU~wYxJm}oAs^b9p3D1q2!xtuzv3wN7T>F
> zmU_OO at 8gAQ@#I>U(YH8{k*<BJFZHnJsth)BB-W@#QWoRm!**^JtjU*=X9tsKGmKMC
> zxS!42k7vaOTQ+(2h1<|yB^G^&S|2r&v$=dyf1y6Q!$2oGs2{UJaZ$Xq{$5DxU(}I^
> z+Ky<0P;0G-b-v$N_Q}%JvmNsc!gPh9`4a{GbQfi~rMU^8+)t3lN$P1v|L%7Lu74xT
> zzAiRvCur?rc7o<r*~6!%B|9$+1pX$kHZn1W@>;Q>yvJWC5novTJ?cjtjh0WA2I at O}
> z=%>_2caOqHswTq+_TZ?vgQ#<NhsXf^BI!Nku$iEJk<_<z=f#1kf1u3{dGO^r)WPb~
> zSym?(d?l8qNA%TMeUz7zdJW+l{6RaJ)I5Hx!Qu3W{wBj(9sfV|pY5;zEwty*gN^}a
> z>Z2YeSC(Y!kfxr`vb*Cc3(<}}d~=2U<X^N-EK at An>Ag+?`w_cR1$;u`yZeC|M^*nZ
> z6m5pwL;QsB-eSZU+U|Ryjn;K4eU at O{2}PrYKPIv3?Vxpf at JjDg<Z*z07yC)IenZ-u
> zx+8QoeA5)XvzR?5g{-bBW(#nn5PQiF53J0XU_c(i2w=kw%O{K3e{GhK`}ARa>vQ8|
> zwrO*)KvabsPM<76+_DONha+3xvzU`LxV|{zeLjZHhuo|-r!|IRE{R+xfnO{3oA2)F
> z@;7RL4bI3qY8ca+&}Cvs{*X()W06Y_`wTKs0(Uwv`3b9(j$_Y67qgIkTA8UWmCvEK
> z#72JtdWM`Dp(|>PqT9Ax$i>H)aExpj`<(I=ll%I&NqznuRQ{W-$*7aGG4mJljQjdP
> z@*U$HKV1M~%wnVuW{d+CB%j6=!~}P+<AUk40h2{GaxXw3vV#V(@yfXLD)7gwA1Y>?
> z(;y$`L_526earb_X?<ngL6kT4mD6vayrHkWZUxHgQ5GS8=UtRjQ5M?SEmu%phw>sj
> zyH17j*8XxZ%3J!&qfyrNmxrUA-d`SqvKD33v#AE<&Hd#pl$rkWQ<O<N$urMT9^7C4
> z3*|xm<tHe6^q2oYd0>C}0m?7+mw!R|#r`sB|A7AT_b9*6Unc$aM%mxarf)<!xv#tx
> zINPw*z`h1zerBSagt7<9%TZp1vbUYx_-~Xq;rTc1Y?>J5&-|3}YjRFnC%63ERs~++
> zA9bFYM4v-k(tbXqEQg9=OSMW#LtJ9c(WXMlJi at DZB`|@Nx~Xv!bB?;C)2f)!^f^lm
> zSHy?0hc+vSFZDv9u?f#<+;tX at fWOh{Xw)}pd at b`bZHyXfXkcXYX`|fHHo_mzekTix
> zSLK`pMrIi?(Oo`H)<CR>E(A7vCG^b at _r1ly7ZMVC|LpX<ES0NgQ?oY}^1a|8UWvDz
> zerq?Cd|d3(-7wrrI=7%MIh{sKqF?WysdReYTptA`Q@=v3-c;b+OfPl%pZT4M5&oB&
> zq~6oz3w at Nt%O`tmyeffy+9|1}7H_rY%{JJWj at nzg8|yrO+D2mD%dC{b<4gFg7L}}n
> zPk{g!9?|DXK0uzfgT5`@(=b9s?ESmsK6dei%sEaCeD$b`Sik?I#6MDbUjBJosoCX^
> zdItjgV(7&`pQn5CPL5RM1tr4w5B at eMJx_J2QfjE+p0mhLbK3Fe#2UofZwv9G3!!`4
> z$yk(}8UUY9?uVj4#0 at MM@D$}1(4?Edzw6_s)w0mzo|bHFv;==G=^(yS;Ab5e+c0Ac
> z<gzIk-_wEJE-A1pGWR}`$K2KdU&eh<%O04tw&(V$iM8Fnv+j2;onG1nY{MvOEE{oJ
> z5KMB$229&|gww$e8YVh_XZG}3$YUlvQ)`S;*C>N8*_FbBM at rU9ES+1Xmz(8D*6Xn6
> zjX14lr~7fNMdi?k#@q(}DzT6}s9Ua*_LZ^xls*h?#A)pF^YH0)%Rv}ZVPne(YsiV9
> z;8TzXHr4Qp;PZP*?Sy~b`R<qjc2~MrebEi?23I7p#UI?GKZIOHTWI803p at rLl0|Me
> z%Lu#ZAjYn;Eg$~7QyTXK|4V%=lu2YUMh&i=5;HKO*_oz}LWUa5A5gA+mLxnf!zk~*
> zKj>0YLC3oAS<s73pr21-<v;RnOemj>ePcfQR2Vm?mi>9k8#g+{QKl|mwsgx^1nc!f
> z-8oYD_T1MakJ2Jv!Rp?d at L6j?+>sEzP62BRJ02om60lx#Oe$rOYo~UsO0ydOi8^g-
> zzdY&_){q-TaOE61u_YfsEDFIFN7w at Plzid`i(n1~d6j&}y35S6O~4MWOl51oi-y09
> zEOtXC<ae>`Efeq!mj0((HfkrfOqT at n{4(fxfUMB0tY8<tqppLTSPiVUHa2?yeuAOI
> zyxLvcG<tvuez!BOj>fuLOY4BA6py>Q{OI(Utt|Cz3&B$k2MoW&g6EhVkKvD_ko_u_
> ze&Y{p&n3RFS8E)IIs7Z247q#Y?@FG*?@x6V`G)vXEM$pi*RVFtC7)EVuPlT=u=JZR
> zTv4QL0cHG{mfX<4WJSi;<B>11rE=KISR<jpYh<r<5?k*g#5=r_1dRW++BDRc2OrHM
> z<SCidhrhQRfA$y>Yd7Kyg>+$%u*0N9-hgTq at M-@fE1^R~wubFyC~P-p0)x5opx{zt
> zko2$fLDB`4xV{_Lv7Rd$AmcL=q=>Wa8|T8f_qQ^xX2-X8R&rl5B*)f>mg9l12iC{U
> zIdL?0LdGfJrMbxGcZGSi;+=okaU4$UV9gsw7)R&mN3z$#5C^Cc!q+>+8~NLcNgSPI
> z!e!2RK*(N;CHF?-o`-i`(EPv1Jw?#`i#Xo>6Tb&R^9|(McR}+@$?-~1f`i<9it_hC
> z^XtjAC8+Dq1HtUIC=zdYk-avR9242r7*hAk6?WkmK|;{{TJr2&Jo_N}GWSoEe+rtv
> zlU!5a+RX!`eQNItlz%-iki8a8>gdF^kFgFOvaJ!MuBjC^&300kg}nDi(EJ8+yo2A2
> zp!pw=@+)}X`@l53_Yq>4uClG8Nj={>szZ_6*FOvICWIXhny)0!DuWW<C&$I`@36NW
> z6ePq()m<t9CYv=Lw!=G+7o?3I`qp5x3;92dQ{rr4kQK1bQpxjcFR5#Q-`d~&U63HY
> z+BBCuCzf^os&9oavRsgW{oN?Ouw5#a-Q1*aZK?EMfI1J$3iYiOR#T=RA$m6Vnpk$^
> zCw(j8KJwANH_*NhJY#^5)IuL^K<x36c;vY`BS&tSO)alF#<h%fyxwxb5!CWM_HK>7
> zvbgZ&qm6s`fR=}ju`*XjBOMJoguI^z{b8S<`gb|r3$YoRzn?ekqatY;{KFGEUZ}7O
> z1f-oc7tzkWV(Qi5uzR$LDX-l)a$;Hgi#XmBQ}GRGvwhws^izJ9McKwQ3lhi}{QNVn
> zN#6|Aw>Da`J{MKR#BiqAw3=toOYgfz78hnq)jyT^SFrKRL?=P}$C*O}2QQkI!j@}#
> zQ5k%U%@=x?L-w0Y_ST3Jg44R`&N%%rLUVwBe_0XxYP$qEW^=|}G`AcNIZ5(2i_GE+
> z`<5BS#K&axheic*hg`_q134|pJk4{YSzZxaSqr)JMUfdcW%j)e!JpzwZywBaV*ed+
> zR1Xo;(wHG_)x-x_8T^|rW2$NfxjrKI at 9V2ll)(=J?&#|~_^-QN%%Gk^CS=8o;}@{+
> zr?mPI`ikdwkb0EDHrJhnTr2+~<Yz^<iywq{(v|O!`=mal at J{Rh>po~5%bUVXaielx
> z+c95ajvMtw?T!R>0JDhO!OO<g=oWGHQ6CyCINuqSK$Bc0*Ft<b{^YlAosZ?66HRf0
> z at NOmE9fWsHw9R#d%V7qM?|W9t at ue4cRQI@2AG^%RNi!Zl at xsC+4g8vf+|H+_MbZDP
> z?apBa;^#517wtiA7()}moi#6%Hg(Ph#^_C3yBT#MFe})m%p2N<tZnGS{3DP{#xDRi
> zy`8*6)@%MJFhgm3oq42M2~4aK_*=&9-*qJ&6nvp4!~Q>hq2Hrs?YU0*+9UbYy0>zb
> z-TRn<m}|)+8xz(2j2S3N=yZT)4OCliuL6A=*j+&|L46K6;yb9X(?RM%t`PTgUg=4=
> zhPGIFCk-A1dt)lF&@_+q++gVLpLytVrxO1}H^z;;d$7w5BKbZ26lk{sbE6-TTU@?1
> zVe4V^VTV~s=1dhwXtQnz{Ul%Rb^4K<_yO;D)1_+5;Wtiba507gW~%S%lp%B{Vk)NZ
> zoJiy at tS2IaCU|C7P1F4fU#-G`Z&qksuwS^Qw(Vs$`Tmj;!u>_o3-Vz-hF<xk%XjH#
> z7dEC9TzKrKygnBGIf_}o65NHNF4c7T%@W;PHS5&%PiBon9_Jv!3z${y_G0h}?SP5M
> zy#jl(lDn^!DI1!g1HlLPENL at ogFBxSudYFiM}<?k(8A=m>(RGTSM$KaToHFg`zn0r
> zk=J(Jn{NMh3%^xjgzr^ll^EAP=)2}(Bn at KOgB$J~dMdgbGKY?DhR at 5VSXW~WdvAi~
> zD200DY&1A&#4zzOL>67B<B!14eeC$p;b)FIk=tJSz^ofhcUMJeex-)q`=c{Jx2fX}
> z<~%s<TGA_=G1CMLcmKMQE-J;`sa)5aAK+crHZ0W|^uk?JzR9aT)8t`35aXxJKk996
> ziyCapoklA_%i!;<zporJ$A`pV0?$|SazCZM0y3I*RE%>py)?%<T*@46{{pcry@*Y*
> zx*}gg{Kh>E{6GR3F<svctlzG9duY|yAtv}KnR|x$ZDABE4^|;}1$<<x(O;2M!`5aI
> ze(|2 at xK_(m_kXu%H)U`pqt7nnCfx%WVB;_{*6#X)d1t+8&?N)b>9|$V`NBD^UJ=NX
> z4d3TT&c=Hr!>@<l)})&Ed8=2KjTftJINt$ZJ$#=t_l%$qc9HT3_#jKjdiB+rqgPD5
> zxS_3rmn`W-?uObnvARJ2HE{4ri0R+>=AL9ZeS-K|A)k&<ha#dOTRzIXM+tf-6ikg*
> zU7Z*tZLehT4T2 at XKQBoaO4mCw#(bUG<F}<r1Kd6Wz9C~p)eTXYuMnIE3%E{ssx^t?
> z%I}H0txO2k(}Khp<S3W#wvLd&?!1Hv^HJfO=Xt++3#0InHa&jR^30U7q|=EwZ;4?I
> zAIeSAPVtFxzLj`_|N5`>yc9nw at lNy~cWW3G2Y--XZ5eNHzwmx)HY!DA?5ivOaki at M
> z7?aBF)()k`AvFD^So-I8y$Re&-f!T|1Mn?}|6Kuor5Mli{A-d@@ZQBtO#8vAP}t5V
> zaSd44wc2SM?xmWmB5^K*Elb7yp&eCrpLz_RDm=?X)43R at gYI#P0VYzj;AD!5tAY>K
> z-2QvV84=BAM<WlIWRw}UY50kFUfwwsGO>K&_BL_*S*FeHAN6~_&`=)x`Y44<DXGKz
> zYv9vcX;w~WJEkF?AGmP`<B^*S`x at f^c0jI}rX5U|Qe$ZAQLT3!<3r~nSA;dtm$N6K
> zoGgOh<Y77&xk*m)LteA;OOdDO(&*V8%-Y2%OS#HD6!J7sYZ3di?yZzDTpjfrU6EZc
> zIT;oP>~r*hB8+R+0l6RpIiREQy)1WIf~PCUH;YEEeRkc9xrv(YIv at u&FV86FWwTsb
> zAG*{M0ooWTd#=T}Qj<BBGSL-OIBg~M>ms<voy}`?ouJbxG2CNgR6YDyJ>L(R##tvj
> zxfvMyy;!de+M(_-KaV&a`+*qvZip?jd6k#hIQ7gLW=dcG@$47wXGa8 at T?)jT4mvku
> z=SBGDlYE5Z*WP$2O<j at f#nmR;xDzfJ=2KN=Vr1}Nn=;CT99(4GY?BTG?Z#NH^5V8(
> zJs0<{Z$pj@@(g at B1iHR`8K&gksG5d4qTql0=P0{w42emZ<CXaXU4t0IJ()isrc^UZ
> z;rwu9Opb;4H}CjQ&z6Pxpn+c?4 at 9@FjC;ap=(GA8)xYzXs(10149^pZj77e&%CKvr
> zLUxC_*S^0*<MCd^RoV(V|Ix8!kT2gmvz7 at 3y_IrjtKf^G9TtwgcXuIl(kfo!#=x?j
> zLW#xsn#7E}LUyMw@(~K@?rpCoDx?3ve^i|1&hZlDblF1xkRuyTY|SFbHHaCbJ9o=Q
> z5PNS1GY0$T)w}iBGZ;fUA9B}>%tMlc(f7C`Xn$RmFJdQOO6{AAAkL;8iFS-g-28~D
> z)-jh7tD+mY>X6&O!NwrQ6?WCk`ua12E>$a$^KowHPu(i*h~&k`mU$12nj^AxIbiQ!
> zPuIcE9kj^rl6e~Hn?m?Kun8GtvM`6mGs#iyxz2AHKZQO_>f2r-GP(S^%b7vRX84jf
> zI};KM!0(<1e6X?wWBWvBLCkOHo3<j~9dABeN_1m)-JMQNL at OVIJfozJ8HqacC+#WB
> z_`5pBBfb}PKV*8^>oQ(1tEQr{)}pY#gWAvY!SMb2Z(9R16|%!B$vOF|!`27$4M8c?
> zpvMQUk at rxy^u8q|jI)LvLEg!xGg}!Io}Yr}lSnLzN96(eqcuz_DW_DDI24TG-bdr%
> zQ#@47CdF_&aK0ZhgH1caop%pMu7UC3o at ss+EDQ6ZXY})gZsT~mE{|#~%gUHoNBn%4
> z32Zs?$dogqlMBF`i<(s2KFtu$g*-zn6C(Ise*<eNRb7)e(6H+<cuAK7ISDTL&pj67
> zZGKEWQZeiO5;7MhwgSUhb~O$@<V>PcXW~u=)UEK-6>ty3%D5T%KYDF*kC~=o#*SwA
> zzD6MiD~5g|z7+5dd@;&K6eJhKh3EL%heJmk1X?%&^wAGvJ_2L>5BU2=7MJtz*A;9;
> z9KcEV|9^&j24UpAqyohA?;!6YKB0=A>h_<WvEvHHZHmMkFl}Xm%egL=63j4Dg*$7h
> zWKnIsoR-6<!=;fnULH|^y#IxW>z?xnx)SP76K*fjjI*_S`YnddY%#;MA95XKNu0u;
> zT2;!IpdX1khT9AIc^ParN4t-fp6i at FuZP5&B1a>9cVPDsBBy#R at D{{|>Nj)y`0;UB
> z at HL%J@<*GM7+0ZSuu*=(_1U-m`&4Uqz5wG2-gm<MdR#`8DlW?$9cXjBDQN(IpN|}j
> z)lV<QU4-v at jea2VGe@rOO-6k#5-TIUcM0=;81%}f9qx`#>O!nS9(-jNz^0FQ%-4Xe
> zsVz-|iwl{r1zCKvC?BzTI|!fWBfD?$LgfCzn#aCvKrCbHwmI;{y#{_ijT{$l?;`%M
> z*RZCB6M3NhFk;^BA at 6Xq3;$b^<^ey4j}l?Wk at coKkppE7_bsF0inXtbNDf#N_?y}&
> zZ?9%JpBR)EWLu#xex4}nrMPBhAYx&ov{#uNE{i(d#@?o?SMgN3oEg-f_h6Tr1&uhL
> zNAmni4Og5B4*3R>wotQInjh?1{iRFZwvbupqe2dhl7>M(=3TP2mZL(%om1U1MmXl`
> z#WjepdjNVq)W at 1+=L)wi=xej_)lpWZkelvOjg;zNO4MO($agEdbd0K7$3&jl$1K1*
> zAHx2t!CVTFk8cWnhhG-B0JM7?a6k+GYo;E&#gbIlo|p1pu1kw at DC(2 at byy#)GOXo8
> zUq9D0igtEV^ufI>_!RE%Rj#c}#*y^DGpeha`N at amv#nxcxEj*7j9?$@wsHOK3$Hfu
> z at _NCbZ(g{4AecH&p22)KFp<bvEX5HR>o)na-!T5GNZmnVKj?|e(ss$|`p(zJ*rMga
> z-!faem5dPmkw}C|CVa!m)f at BtmS!%Y(~&FU?|D-FzvqejN;|xNu2 at 6TBC#QX5|6E9
> zwA>+TuGUOxH)4+jO85lB^XUr7=h at 2TH}x}pWRwDS`O1ZsY#a9OKp)jE#6~dV+k%*N
> zDZsJ04O$-`3jD$t^st>Hb-5x9J%1<y|La;t>XEsU_R at vMjcV9%`qn7?-Ya9ZH%I6{
> zb<6F%a)|ykr6Vz~ehEK4>u$naZDD*!Kk>bn$bUs86+!2yAo^BiFxRFX at _OYivBA|t
> z=tVl&W9sYrCw<@HBiky-yuyEW#?DaWYAOMpQ4#+r$f&CBm$W_-Q_?Ps+f2;$Da<i!
> zK$9 at X*@{v&l1g>$GPkeiWfOBAXnagqcP6a6vwN%BpE2Wy14|X=x%qB7=4+8VZ*2|f
> zTZVt&p^IyV*N}bFG^`!pdCk^Ijk0u(rky35$@$tU<Spx4BU8y5A^qy-i^0RKyA-NQ
> zM&aK3X8fN^{nJa31-ts!0p9z29q=mpfcR3N80#P_v(?X$-H=$|Y)E|8$J18yfKD9J
> z^xTaL*>&X22|2VCazS169_}pD(q4<bRD=69piee!401OhFN79(Cvd%<T&J43Q%1#d
> z9db<Az!x9xl^HI7s4!gFrKrw^+~H)9H~5|+a4_{Ua`tK<2gnGoeD#B4>*yuG%*F&c
> z+b#H3ZFCQ3p_G?wMc~W54)9eK=5o_m3uxbtZfbzlC`<e>;2X6ZHrFE|(~it2l6e>6
> z`?<Ovx(>Geb8fmd2>QuOPqrYwAtR}bb|sh5C!m{TL2hjVR^yADv*G+8;4%fso4QnO
> zck3-u@;qpsrYoEu57|euupvcGSKcQ2$V<TIHjz3{L$B(WOHp61N%Gh>4%fktw40Nx
> zMHKYvrQo$_Yu|UsH`=!FQ_if>0Nd0Kq334|^Re%<cm0!(lJ&wD*nn7{)mI0 at cQ2y8
> zf-%(tGx*?Xwza~(<q7CkOnV;kOw8DKBvFYzB5v<4q4$Y-vrBdS9MnnXVu+jW=3wlV
> zpo!CUd$>oRE9oB0bCEe5 at rXb6^N`P0%%B8Z1z$~cO!R3G at cV)!f`$8HTvqRrb8ED(
> z4Jb<Q;r_}MA%FLH<h;KQzW+LW4s=U*cl)j^fPZV@!vc at Jxs#F$9t|x$tMhlqzU`xs
> z*G2#K@^qtkrQRr8S?HDrg^3%ft(R)Urg1Z<%@@r~a{Iol7$Sf6w}&z8e~jE?Dx!N*
> z26oQWBrCP*uzjx;`ps#4zm9vL9b)+CnzZa5AL(Ozyl8+u<r1)<X30UDoQx at FL;Kh)
> zl at EME=*|rF^1`ID_MD8BY6poivMuWCALf4t>7(%zwQCpb*ZX(VuBs at En-4HF@Hnl{
> z>YE|>PrCeRUUQ5i`|A|bMcJ~~q>x!J?@{{Ls#L^>yWX62N$}PG&a01E`s6>AR3dbq
> zS=^2jkwjN8Bs598uV{z=g*7|yTJAl>+@(oUFn5Qmuuil?L}ien{{b1gAzP*{;5R~M
> z)wDlgPI1q)L;A;s(1!UW1{1M<n;tD?KEv2VEn83KOgkLEA)rNRWdYQP)z%d3v&@_7
> zB~b;2qjlodz5G_Puh2*M2lontVV8O|hDjsu`7I**2Rtg45A?A=CbF`C?18`c;jm+T
> zv*i8Eo4}aD at JsV3jEHgDTMBg=;s?j=*2vlqF_RD*`Eq*=$zk}q7<7r3*!do{%XOr?
> zNc#$Yo-3%Y|N8K=<kj5#q}A<*lSa3HfnOeeIbU~vn2O^;`xLH78#TegjBc;)Vp4iK
> zPUF2%?Hx?p>-Tl<aC*1gbkO%=`Xnw7_}uP}b=F$#RCTXOM)%_V1C<!Jq)F|$#_^?l
> zS${)8=UQMm-tY&0;cgujqBh{(fohqWJezBjgxOsT>K_?yhx~O;`x^Z&`cPLnVeAQI
> zaNDx1jfRf){ZyHL4dh7$z7vCX+-<ir%@UJ#HMd*~o%{s;+agKUzTYU{QT>#SJNDGN
> zY~95t at Q>|YXx4w)-O7w at -;W$61V8FvHn$%D4+?-!;c1t~kw2n9T^KUt?xCxG^M3t7
> zJ at 3vBD}hyB>n_JU7HUV~Hv&H&{D$E7vMi`|%R;s*5c;e<^>HWFRzB#`iAsH2J-g|;
> zZ>5{Id<pDK?o|&P9rEVisfkxzI?*Ohg?|<CvFe*Il5gtSW8nPP9L1iMx6AKH2dqO*
> zKGy+dV}4?{$NxvzyN5M#ZDHfJ_1Y59swDvt6%|mC5JYk%1x`feDD}`DwBD*|87ZPt
> zYfFHr)Pi>_L|YL8A|P5r<emgF32l$H980aIrJ4d_ix{m{v`Ar;(cilVdilQRd!FAP
> zd1f+~J$v at -z4qE`z3W|t2I>0MUSGbIw`)#mGkEV{_Z(J%{|$&80JrP9=5X;_95#U1
> zA9J+6wLZ%`8-RT^v-h!1VhPTG|0=QZV!PZTk9^WD=I!Z*%?fcPjcLeD$Z=(0AM3`l
> zOfy#pV41vbBX>@6&i@=bmsdNiDH7jW;y>z>1T+BipKJJx_}s`lM25BZk9d+TicHU2
> z;acxVP21S=xP$H)!fzqJ-0CI?Vm6Z_vn=x?|JxjvWW59obc<W$NXN5?1342tGJN at 6
> za7rL%B-iulCEu6i1n- at 760ua^>udJqHTLu4Y$eHEXP9|O#}nsJmF>@Kr7inNOfme$
> zl9%L{a1AiDl_XA-*^YZ}0>^^fJvWZD8Y4E%tZz=4VeS){5IZ1>g8dWR4ll{k7T+Tm
> zo25N1k~Yi-t|ZL+fkftP$jrt1SBdicU^^B&Pr{!KP7jZ}{T?WH1N8s#;J{K*+9u>u
> zvW=l9YD3SsYOn?_T!3}yRd1}}okfuO#E;{OwGc2p{I8*(F9kP-`P+*zdoPa=*&HrQ
> zHOL3LlU)1l*JLh$%|RTKk+7et!#rfVJPh+0;T5f;C#C`~0&d0C1|{MWW-eGd*axQk
> z`nB>*nC5*`E~8AIQ at Dd%-xJ12`dpddzA#4Qh8QR*!w5ZB!M<a|{8Q0=CfQgqA7xCR
> zTeoty)0WF0jM3FhkNW76QuHZ~(JRxO*3O5c+OvhDa<lp84{2mcj@;$0m870zEkdq+
> zU|uF|AF~-;pQH4Lx$>~Sob4=fEM9iJeNptK7PJX)j^z^GQcGQ$T7md2_`r49S)&jO
> zk^($II(!BW at Ri7xE;Y!b_I^7Mg*H*s-+mpFVStR+%yiz<_!6uHo;OnoU6^eDbzB+3
> zi+_+z##N7X<ONa=#sSI!uVqi-X(w=Olm*W at JQeuot1tZVtf)hoj at WwEqF!71p=ea5
> z2m034!EXzn#Q<3!!KQJQ<%4Tj<ZE-h;OPy{!hG0{PwaAuI;4w_Wjp-BffsO8g8%8X
> zkKaRMfS6j~BmT9@$M2Vljypvrhgfh@;`g(q!ymC>;22-|73r(z?`g#6feTl{wi|u0
> z{e|d{NG?Ig3&1N0;ZvC5wO1GK>CH$yz5mFi<5I5HR&xHP96y%f-Vc3vC}$V^Q7+}=
> zm?w#WUenK~tj&+4zdIu78SnU2+cajxKb^rg1zS_KErk!?UN*4f{Y`mq#muOPo4j~Q
> zgQ%;35k+pzd)>|4Qm1AUJ*m3(_lA9BadXmX-v;i at 4#WLI++QQI6%KbZgL9y~a<Rw)
> zKf;A<;Muj}!0!!+?Phk8bKP|1a_-!!Y<aa!A`bjTCTp#$e4E?<l{>$IyXQBqocB;C
> zao~N!Fs|I%%5~hm`?3|KHvizjyIi>&-OMuC?z+nD<Xn6+IX5mia3?wUcpN#mzpnBH
> za_+5(+454`u;9Q?LRUNUWU|7#O0QDe#NfbOne3yw%1Na*L2zJ!OlGR9^sK&?CZ1Zz
> z26<{(C4OP}h2l3KzhL}C_{s4TdTJG7=LebnUd5Tfp~26i-8GFnmWg9$GW&tY?}yE9
> zIc4qFAa;B!J!1Q8n8rX6!I;TBMAs$+59tCg+4pQ06Mb#aCZ$t#wIesxYWw>O!hCk#
> zI7{+ju1uupl`_g+g!sIcXCkv&o+Yvj_GOHH#Ixf&h%yl)U)N-zeuVs}Eu2DlVcZ&q
> zxS}lv#b7*Ma$CoobTTf5sE?8|LH66y$|!r<Y^u(zj0CT1^nP$X+L++Ti^m0Sb>4Ey
> z)-CCUEk8-0h-+G0!Ldfpiy$w-(Yn`y^<-*%SpTYczFCeq0&uhSL!a+oL;M$i%Hbv^
> zq|?I4*6VH0`yTX~A1`a)K71hCE9sL6 at or#w+iU{<rqFL}(HGn8oBJA+=<h*x#HICN
> z3p;ucWKdAAt0s)tfZ<aM0x$S{jKBF&4VPWPwJ)4&e<;{E(C3J<7;aIkk56zT{*eY?
> zI4!?T=$p-mNn2s;|48KcvJduKyw4zJ<ox!zu_y8V=j{GGcj!!2?S}#?b&u2}XF&lw
> z7=Is;#iz7}ukfz9o&%iy)q|TiDwwNN4_s}4ET02=nE?8;g0q?Bw}YDtI#@o@;ekWS
> zW7CcFrWssYp2gbtG}_SAGY;(;+zWd#?w9kD49NeqBbb+}iv-tQ3i5ZL9m#iv-6=hD
> zg}c08KzudS4xK8#9c|}%^|61sEj04EYPVj!M&y0eF_O0<3F|-j3u{U|2`5whW43=v
> z88|3Q+DG=9F@~SZdxy8<u#%Khc1$xH&j=2%^)g#{#2 at rqs<c46gt8erc8%|Uf^|+%
> zAJ&&$u>JH}nE7u;I7X5+G1|c430%(8W?^I16>x(Oa=|2XTrdjop{?#;5pO5+9MKOd
> zgNFL{n6f=LkV7-mL48c at z8~C=M@*fX4wy|XhP|y4_NhALI0WaYGv7 at 5u>dv$(QrC@
> z67=jJs!wY-L>)2*!*@C_F+Xv(vodWCW$zXAo?)bP^A-hkL_g#^n(Z{T+mnvAY>(9s
> zm^UB2FI}cjG&}1tpKe8)A0_jyBRZ<`@(bWGN{JC;UbSC#0Y91<Yu{U(4RagT_x1sE
> zq800Jdm8dylliY#l8}%3RpPl7WNt)x^ZX|{!K=Uzmsp&3QZDT7HpFC;`k%l&8^A<I
> z9=tE^4bzCBAIw9am&Y8cl*a63k at xZPyqF3@DCVmff19sn49!<FfVsfh&M-1|UI#zC
> z1M>&wjxH1Ck6OeZEb!s~iu at bD6q9`8H;zM3F%T?is=r}o_#_|U?b?o2MRcxMP}Q+g
> zRO=(WW$IX6MDHd4SMi)V*F-fPxi1$;1ZA~3R|Ost$qnS_=^x!36wdlgd6?Rf9&VHL
> z|BP=Ao9uoyeF@)Q6Ov%XxW_iImdxdqis%C^qazQsJnwGRTG4L5QgtQie#l97*a^Sx
> z`4mM{gX=m`z0b>cs(p6eti<sy3t}!AK5RL^soRB at e%=c^egoFSN3ph_7ohl6fmjCm
> zjeo`iOGWy-vy$jkTY`yA+P5Bh)Cr3mV`Lr|TbP0zkJZ4nvzqzH=Su9eE~H<TJtjU)
> z!a=sz5<k%YI<<-ohAy at PHk}ut3(k$zo9A`~Xu{wRNR~d;J&JF~7^!PNBrQ1ZO~#*F
> zZO`Q`|G2+Qw7efV`1&=J31vOqV_9~R^kbqM!Y=*4L0yvQLFkinX0m+($e`&_P3+aE
> z3eu0h?M1s4M(wSX#T+t>S*kI(YiiIRiaC8``do16I!|)<%!HqLrq^vpv`ZZL2`Z|C
> z0&Cm%lXi`EYt{r94YOmd7XQfVUKwvjw<Nl{eXq8>TNZtwQW5!4%NWx3_%@Ou9d^al
> zt!~3%*GZ+csN;!#GdQd at u)U9?IGeN2EBEri6 at 1zu?>fl*>U&a?;;eDL4$Pqt=ZQ~<
> zM_mC1>X#}hZ-H)WC(A%DW2SZ8)y&_bm!$p-`yS`7{)OaSBK at 4p=`)#b-|m6DlYF{;
> z3vy5HnCUb#yudQ at Ow2h~$ryp`D+1R|Sx!UQfezwtAJnn#NyemGO5TBeWiotRLfCp<
> zq+3#hqcRM$Ng2NDQQyU|37rIAc(LO-uf5eWaG(1MZu|T3*FBIJBX+KZT$+hGPEWFi
> z%ALS>Qzx- at 3S(qmdu8U%ZwxZ*%W=*0t|v^$2-9I<lIcMe>>ty6 at n2MZj}PBRk`um<
> zA^*X~vc1>g6C2bo at m|Dd{tH#(_y=q%;vU8^+_xHe<+dH?yCJugbinbU=D#x#58iGx
> zT4&n*Pw2+2RW!fSbw(2wKD}cK&x>FNI!;ouoNH_4&B!;N^=0uv<m;Ir6yI}$p0E?X
> ztH+QZN}pG57UEuI^Oi0P?!AkcElWoNxt8bbcw4Q|m9GtJ7LsyN#(D1kK=@c{;WutY
> zIm9R1iTtGv*eB(6Azz|_e4Dh%=!4C^_jIsPHH85q=?#qPHq0&C>6Y!YN#EdIFpq&B
> zhvy4iMSPNF{E+;9hsbYHuForXt5HsEngY7a`=XE0r?y%qU_Tu>aF_pj+UJ#@4B##~
> zZSerl{1wOsG4Lf{x}L&yqbyT+sfJm|MJnWSyqrVbdcaTBvMpo~vo<@?7c$d%4SvG`
> zT_omK*n!p|-*(C^-(s|L5n>JTEy#ECHFazcSLCcIEB{TtMc<(Why9O3^T-SE^C(Hq
> zQ}9cs;x}fH2WXE4Yf!$ks6i2X68wu1yO%)U6{`_LFKEX4HGdB<S7UW_xoXZ91^jj<
> z_>b+n=Mc*t91DE!L~F?o&Ms&o=XCEAZc*S-2qs02pAtX#a at b(}5Ff>YyMUcXFxCC<
> z5KIi_c<33hSpz#tI42E4w7DFZQ0R8)3N?6_JmOIYD|itJpF};u;bY#c1!ffUuyOGZ
> zYEOC28+7SciX!6*@n)=zDVF6sc8171etjxUu00E#!e>g~0-e#N%V$cQSv4bd4D!gH
> zxUnC3kN*k(&l0H*zISa?5cj?5l=<E^Rw(sR3j02Bgq70Uf&&{K5$^9(>W0B}x2Jx=
> z at 7c*D4m+zoFpE69Y08wkMoEXhQ##|w0|qi~)!dw2{-VQ;V(wV}(6M9qegg)NDV0OV
> zONWk^;CP#1?iy=2Uu$ph+nf$r=ct&Eeq#~U?UEy}gV?#(fcOl}Mv)EsO~4cHar7qw
> z7ffe1f#<@Ym|;;(Om)S39lmj3vmJ8Z0nCW4ho9Wb;5%@2RFHEb8 at cWQ!GEL!_puQ%
> zi>r{QLa}+EPoo7sAR&LyMl#e^f0fAsBf=m)^)})TQMQ}?frqx1#CBy00#7IwcKPc@
> zBG0lg&ZG)S9Ru7SlOd#A5-y0U at ZXjEPxiwzH#n<KyhrlPA}08iJ{6IPr0u^_78zGh
> z0pCTN2)X1tOA&vuLdm~yTIHKM#z*+?dZp}((y3zSW$53ub_(JLUL`(g%;A`489w+v
> zcu`uPXX0vA+fv75gthL(dsboJ^{1<S1|}W9jrgtVC`=Q*8KD}H>e?&m$!Glf^6~u*
> z%o4029NZdj5-Ukqg*o;}Xf)qfH?p;A^1RmnO%C2w?WyntH!ii-EHf^?qJZCM6QzY+
> z@^s;ku12!1;QEgO`UGiTyzhg4;Mi6Tt}Vbt><zq`H^Jrid!o<WfWLMY%5Z^w=KpbT
> z_-V#O)~wK5fypO&Yy4A;LmqQA5c%OImykH^tN at e~*k{&=xiMkJHzj at g@QwYOALAP_
> z337_&a9ND!Q_Si4%#YqLbN6|~VU0X=555!bslYv2=q8M04n<?@=-x6y54!?$Sf0df
> zZQyIkNE><=!jVCEbv(Q`aOKT`toR;!?jQBQyK`k8;L5yx<r&x<`oU#H-d#Yg&G>+8
> zw}SuUz4vo%Hs(P;bh?dYXBgm}HLH?)^Z3vYHo97Rxa}0=j)0%$%fHnlb=k>&!9;n+
> zX|BuztiXFt<wWv+u_xgxF!{Svbvs{kX|IG$8f!dz<|E!NO%!E9AFUxWAY81qCyA+Y
> z#EFi*vA at HtmQFS%DV*hhv_JB_=9Ad;tmSwI^4_mQS9pkLYN)mQEU3%xc&?C7>`f0?
> z0semz_=vn$voCl&M5Y{Ytw&@DT-xDtF_Z6!9OwIVBc0P25oFEmHC9&BL3c`fXvVL@
> zYpn>_AFKuOolhedh^bK`I-|-=bq!Z&?T~+gNeZew{MctE;FGYP;pDQFyH1R_TfdIx
> z$0G8M$W!ZqTzD7wuw{#^Sf_E{9{2x;`&Q3^zy5;9<Vsi4M()->+i2pSZDccyb+oz-
> z at OG(=rn-_g8fvfla0NTqR$-*h-k+0p0$%?#bZ57yrP(RrV#a<6eut8DcPlF(zA8R)
> z9iR at 6kRu7Q5`D0(KNW3+K0nlEw+ZLPhi`(fSLXbUwA)_EU+uQLk83wz;BPi?Z6_1$
> zWLcLkRc)&4XA-UrOPgkOoS~#W$R*f8cSx7jL4T at efrt3;pTLNT)>sX*NKR(h?l1OO
> z$Te&Ke$DILH6%|}IkDkh;@XeYoo-K;sS8Oty9-5ja0!w1xt-KcDTZ7U-~0)9nD_DC
> zqq#932;MaA_>D@&qoaJQC~?4N?EaT`A)aN6033fiiw;6w9e6ZP1U?&zMVpQe=ToL$
> zIbGBAg%>@@L9=cI{OFf~MJ}B>CLZN`EJN%w*Or;}o==J1d}$QvbJB;q#DBHXhZl()
> zK|9G at t0l9;EzEW=*qH?vn at 3HwvMad#iI^jIkoMzbi4^$G`iWr#ueeV}xF`6VP(Exc
> zME~`o(I4y>Gd8BxI~O^g%Yccqq3qL58m_GPUE;W>O%3SNQ^s2*(z2RM!S411trP1U
> zcN^@OcJ?vXR!>om74^(v(DomGN3E_L;l#eWpfJsKpXAKX`+$?oVPtW(CQaN9)FFMp
> zjMk at 2pHbs8wyOZ~6z}hqyksx&5EY?)>82oe at N#_!t~X=!hkF96bdl~>i~-wzDc0V?
> z)}6C^|N5^AsZA~6ley)rBkLA?Ee@>X*B9$u1kMi_DZ#p93@=|G??-&EHn6mvSrP;M
> zVf+Atc&ba%N&4nk>Y-#zWJUK+Wo at 0}GTSob`<AVCekGKS{jhmQ)IT0bN7x^DmhEH3
> zxLz6a51$i#mI1zKIofvhRY@$(tN><hS?RfL(d||(U+VM!I at WwFR_<V;YC2yXF{yJ(
> zQq?7o7(>aa*mj3xb3q=;X2i=1FW<(!ny7bK&4{aqm2z{lI5r=1xt&c(K2vh4RIi;h
> zvjJRF|79e}Hw<5tSv7N$q4OZ7dnPzzW_s1Bg1<Yd5Z|1LtsXv)<G@^6cKPA^kQgh1
> zrJrA1mGvX|O46_$z!vr|a3nq6<=0yGo}SZt^0km at cl?qOhupO%QwA=mlsLO?yGw%Z
> z9%Rp@^ye$bVh$0<<qekKRj9j~th0cBBxP9KQ+B&?@y`W;pQ8U%M1}R2=FD<5#7}i;
> z$3E#(CTve(TZ3&8wzb%v$ZUWff%s|Nv%EwFI4OVyTl}*X_B{n}HK`kk8v+sV at 8Bvr
> ze`TR>J at Nv?Tv-JBX_Lr)Wy~THGo)v(Cd0?(TYWcJeGKh$7Vm%b|KugAwlQ+wde&<z
> ze6Za4Blm7jsb>}MxJp(!6IHR_eF7{w$05V4z_a~)fd%L?0u!Pz_)&#lh$-9dvegRo
> z+4l^JHMC at O;<?Ywz^_Za?0CMRLmMv184)hKCMzrNk%vn)qn))9zl|2?)is3;FF%zC
> zHd(U6=&tRG44Mh`t==Vd7b<)`ItlL!Frc6AwW{?^65f-{GZbQ+`Og at d{<1-jTRvoi
> z=D2zk2F at OUyi;a*Vs1&Q$fnyVeFVO$^YCYYU-F~>=$;TClcRXt2QK4EQprAL&Cqb$
> z^o$86o90=Zi%|EKq+&nadoO7})ynUFQSfiFSq5rV#<a46<RF)?@}y;Yl~3}V1W#(W
> z|7>daoh^&z`Gb!&YUW25*mtB)vHv(DfQvx}hY;Tl96q1=%bdI6cl<!N1sqibONMK?
> z=WK!O_{dX{b7Srqd`G_ufAv7r<d6JVsx_xm(0a1d6F(39CV}6_fPQJj8Ufdtl}&fX
> z8Hs%d$I8)9#Kwpdr+w`X1$iIrS79GGac<x03wyb<2JZv;rkHC914q&c^xqAH%Z#ic
> zaJ>yUMPg4$mp&poMb`IN>ma^w+zJ2F%+<;NWhQ&w1-H?Rk{u3k>tLPF$C#Nov>i+G
> z%xRCKpR~srKe`yV=A-|{6 at cpuam**S$G2PNKXWvD-mo3nBE++r5#u|(qj|NsVJY*u
> zt8Hhx=jwZ(nZlS5wFPUqUfpxPhnoA<g~ayOdl|V4&A>wWIZZ!&we7VZn!tG_1&`5^
> zYO`ik@&k!qr{+pDxb7v3_TCXL+M`QKyBLWz6ZoZc_~s_ywSmubRJ&d8(65yO8xevW
> zkO;d5pTKWBg=&nkk1m2&s;YA?JtH*?a$+-O+9}<TU*O>eeCp(bT>by!3yuKrQSrU*
> zmh1qRvBX_|X%ug`B at BHJIUpQz!taMQJaXC=PI0Y5+?oYBZEF#)_Ac;3z*~TSPzt*?
> z!H9}uKgij~<s6b{hW<NjuLbiV@>o61M}LvD(Rz8C)oaq55fNe~9U-ynbs4 at 5r0kOS
> z7BB|xc~SLPE7Y?5j)EOn!xamMm1oNmfoDmy!+$CwF^=oMhK<%_I;at;^&RFJ4LAJ-
> zp1p!a3d84#)({C_HCs&m#;s3Q#Is<-J|DOAqYjLXCejCr7RKul`$zC=hp>(%IRh?|
> zSc)qtvG8X(4_wi3+pa6Au?;^wj$O(1lhQ>Q&1<@H at eQV69QZVck?*tU(bsFJqulvr
> zeP#w6j_9-hA>Xt)Oud at mp1xi~c-+v>j^KRozglrE-4l=fd0pm|Rk3-%I9K5N(aijR
> zJqF$Yd9vUBEkg+Xqv-8>8FFk*Z~qdhaO%I_?rtSmrQMddZ<7DbVQ<cBoS%47w<Wfr
> zF$_LdPhM|x*qSP=wT_cxj5m&rZ*P7JaUeLB6S?rQo|W)^gMP7rRbVW=j`++A%39d!
> z^pKkt<P6Xmf at fr3yEWw#tf_#BQPzRW?|kO58HI6k`&09n at Bm`VIV|67&Fu%?=qi0Q
> zIZSO245X|E1${J%vs04$g#R+gkh1}{%yBCMVe>|v(}|1#H`Pv(w_$MX<-Et6lQi22
> zzI$-Q;aG~F^bz>ty8h~e<XW$vFb;L&5Z}!DVs7*|Sv5lSV`1aDDvqZUI at WzZ^!*^x
> z_m}Ah^{J$u%bG#`t7lUTH~<OHUsChsw4q}k$1w1<SNmO6>o4(R26nv|^K_RW<_Tg%
> z!C64&p*X~Rg1=xL!TsXcx<6!Z>-|}2MfDnmmtM(tE at 79WeK$yR!H2*2mDh^O({8A(
> z{(kGUY#RQ at Kpsh8Pmp3>B%A at QgJrIe!k;u}W+}KD%FT#<ULgjz53v=gM8vl9fkB?E
> ztNf2w6?E$=Rq&lpR3Yoo=hY{<|Do$>VjIk~5S!Lng9LVGRt%rXjD$luF5tl9^TWZ@
> zV)WiX{Jx{CXG4hn4A;#IXFDX)pZ&#0-Xr`XuwndxA7J5QJaSm(mD!Sl_kNvP9k=F!
> zo!I5!i`stB5^ug|I;+<NW&Em<7Sp+sP+PC3$lg2F1pT`AB!gI!tgBtq7zN$V<y=`z
> z)iW>R*gp6`U#(umDAn4$zBrrsY2;^!p?&75q^$Zi$e^camvx&HtpRtbh^XH$WPmf}
> z7owv|jNi4BXNMPjTeD$+vZwY@=8$8~dhaAB>NLt)6y%bf&_>yaZy~{oTx%hw>XGNm
> z5O4E#LBV#ahVe!|Pp$N6Z at cNck&Rni3?d5iTbboD_*OJIwa1Wm_R+%?Q%eFARD{In
> zY%hH9b{p`2$KlWE?YocrzQsLF)MIkbPlNXqXoO^5efkU64>o(QwTOz!- at 5=iAvk+d
> zMW*uKm7-b(xPIiduQJH+-xvIJp{*yM!cWL;!-lrXp{;Oe8#J^P4Q+#mw)2LzA+3j>
> zO6~b+;?|s};6{HmfHLR%LbeX|(G~HECJC1>B)1=H6XZIwMlHCI(Or=`PZhV$8vb}A
> z_-kBt+}l%D at L+keIs9>Yjb!DH_7?vh7mWlqdkL^klGM<9dlCx>uMIg5o{?)mEss6`
> z``Sj9-xH>h at b(BBkDWxWic;hlApP at S!bbl$41Pm%+oa<1)bWG<(Cu$fmziqHUHHvQ
> zrCc9{Oo^NO^q0`t&SB6I?E!q}!RoMTS~CZIW4}6IHE|vIeb&+7kg?^Zxb5xq1E-PL
> z6}f<)-hrJ5IJ>8JRPO6&gLmt-Z7+^!IP95_esAwPODmMg!`XSfEUX!W4gSN{-}}rJ
> zoIW475xX$6My<%PrHy3gsrB7wcv+QN^s`N{70J<Nn_!oYA^-9GXmw=;zPau>?7tSv
> z8bTpkwxUefhMQ9`2W(IuxsrfBvtdzpZ<<=p@)wq0Noab!Zj-wGhgpj at DYx|5ku$EM
> zH@$rz0epm5=jFc_5hF+4ZxCMZb?Y4aaV>cV2kQEp;n`R{ODziNb+~x{@L*ABucxDD
> z#qg<RsuAnx?h}b^s!{9c at aKQEUb(-m<;sJy!sO+V8?XF^{hp|eeN0+V<d{49-m&PL
> z9fR`g_lTH*zn(?jDP!mz)s at U-(Y9v3D2eDNz$&cL?4jt6AbN&&Yv4o8G0JwWio_NP
> zd_wb_wNV8Z>?BXsQ?ckn@{KALWNecE$bTzTLq8|7z?or~>|aafixpBYP9`BWXiI7+
> zXG1F9<xh at 7evN9a+lI0KVVuYayZX6ZXonTj|3khJyX6Oe$Tj3m%kvSMOkK|!Ria~*
> zcCcTIfZypV>lhy1s9VVM>WF~vB1ljLA4P4)7cQ+tm+r_aqu-Sae(Bg<R(>CIWASxS
> z{H{kdFAdmAmJdu$7%$5*BUbM(r!4TF)uY{Ou2iUt5l`H6C1_Cy_%ThW$Mq}0>Y^+2
> z77DxOQxB0B>nZrp^{`t*=OOk)tWTB3=qx_sj8A}f at TxTb-k#Q~p0QKwfnA at 7Jf!%x
> zmnOzdzBHjh>8M_o-Fl*D9P+Uc9mm67KCra4qGud9*6XF<SidxZtX+f`)EkB3gq_eq
> z?NKxP%lBG<dlko*u$m|nY)~}`eClQRkM!{Gmop;4>D}NV=y69Lq~D3H#<=($zd?I|
> z at WP9T#~eFc*m!0pD|Iw1D+X`DrNVE8;)mzSJTz>frxJRwHTyNAT{sQn^esER)!14!
> za)(h>e+qdL<(!^u)m=BzcV^?4XQXcz8?EkFjMj<Bqwvx;BV7=K-&P}?z0ydRO*PUb
> z9~rF+dyT609~{-g!RIn^JK~>1QwD^RAI}ISr#yv{_Au<P6iP~w6ZywBY&-B9jb8))
> zi-eMv0- at w`uu$?{x=?bB5jLiz5d9qEUthvEszUq7TuIuI<ch)kG0I49&OzPf;Dae>
> zt at 3tL59IvHOB7z(`eo%T-s<kT$W1#Rd=}zih1oK-4Ss^sG?^N9;|o<-OKu03k7cU(
> zcBU%ygAUTKW)(xfmk!CSH{;SH#KjiIvyG-Fh0|Art at m&IsvgFQI}D82q|drlTAnm1
> z(b_v4+<Ei(RX)P*g{t>c6JRGH_7b(Q at l)Vj`FDkq;Vwey)H<Ow&;|dygyM}?h2k5R
> zg^e&LUYN8A{;K=<Mi0pM2F8%%x<J3FCfpO8?>Wm+6~4!DGFP0W7dDpl!{%Kx)ldBv
> zY)O at ne{_#z*#|^t*3Pk)KLm%5HUMoQPO|Q)cMoGmA=i6jSuffzzl0Cjh1?FDj`b__
> zEMOTkV2jL9!<H!C*o(UHg_7i6g}76%3SF$zfv at O$_o+6a`1VfJGZW_-;(IAs$2$U>
> z*0bb2qvl`IlxU5Mx6*+oq1dG6z6rQ>d!7%hGziEzGe+d(1}=rnuvUKMRh4O$>f;nC
> z*<1{uf2+N`%@;AW4_2wRnV!YC${WPaTyIf5AH1Su(jRf_ at S)A}H8`I4tx))z1K>}v
> zu`=jDe$(&f at j2c-g3UY4nwNf*b9r!FJ-9(VMjXIn95<p}^{f(jaRK7>C-M5hbCRvo
> zLJl3~UBdcI$UgOYtq-^ipXGeQDJPW49)AOFplo4d$#;gYiM`{X9>0_L72|gTzaq%Y
> ze1gN__?pv5e6I5x at XII3+&|tII-tfSD9zvb9B^oM3vxw`pTXh5Pw0Mt4(Ese)4Bge
> zh9Gc|$$cAeZ!vf8OyF&ly#`Gd?Ao(^YyDCG60MrP{5<s50FIaW?o_|GWPkB86TRGf
> zQf4mfSDT9UFHGhwI4FUCK9}Hb5Tga|mhl4Qu%AhEO5_yW>U%bB?m>MoIN`_hTfgnB
> zM$Us2f;D%7I}Xp717Czc)j+tBa$e(f*-2jW%lb3n`yM|jUe7pY7Bs;RgZk<%bKx7F
> zHPgt|n~!l7M)WF-$$xS<edIrJVHu^Pc>DyHZ^=CWc`)*cz}^er=iUoq$N2G+&R&Jx
> z!-j8rRFmj5glzOZPRfQq>zp|d_2zSJq(?kc19Y!E^uI^I;9C=-5&sy5vcZE$%4T{<
> zJy#(Y^$?av=J*c0OlgMOo~!=kc}f9?QwYc5)R5pomAAYUo%1Ju)7SsMTu<<I{l)df
> z{GAtSK38V_5HD0i`%5C*5ZBaF;#>Ul`QrK2xaM5F64(2mJs=5-{OkD_2RWm_5deLg
> z^o>EDfIsd<y$hLH1lJAjDSnyRpd6|T`X-)XhF_FmG1 at phZU?tMJrAz7i)i!T`^{aG
> znK0-saimXn9t6LpK1~2lT#2(DzSMr7o!5=%4=1KBasuOnJ~0FFQa=*zUQ&-l62njg
> zU+V}h at +6O+nP|mz7BUWC>t4HicW*wE)wF;73<}9frFRtkqemrU7F+J!LyUl&<XAkI
> zjF=;1ZLrI$SXUKJ_1nA-ac*rShYdK%^9er|@LKSNM}0J-xohGBQOrm1DV;eig1$V5
> z8&hXk0qpE)q8iv1>qtz2W{x@^c>$i1drLgIXN<#|6t)^EayR(uxV80a-vY!>o&%Og
> z&w3!9Y!=3WFBju at 5^Vyz0rfb|&-om?f;SrReb4ElATu`D%OBf-1pv1 at DdSKmI3EVz
> z>6q?|K|bY7K`h4n%R$$Aw}_A%qQ0=h^-$q=u9ca&bW57MH}H#G8yrzQ at 2od?`GcF8
> zuV?tkpDRXPgk5!{+z+pTL)<`o2Ut6JdRH=QMdd!P+$isOpDtgBc$BP?;zJto&{%%)
> z&4}F>faA&?d_N29+tA0N5hnzBILJ+bylVB(8+JhsvpVE=S+<4O51r+<ZZUL%IqFpQ
> zd+5S@==Q8&$mBVtwzr}k#mlxBRbq)~5wVdi8-d?&thWctxr1`LxN?^Nt(<B9S2@#$
> z%2{qyNxFv0NkTar$-3Q0Yfj=liT$n{zr98}eS(or>vDM&Yt%iE#h4S2_eSh|2j5W-
> z`$7V at Z9Mny!R?87ZY%!zS7Q4}YsGvFJRakSFYHf?mk_*7$$RT<+U3rEZ4zbhe>?t6
> z$m>))`b{--@~*ajp1mWH(*fI+5nqLDD*M&vMCWg9OX;pRgzi at Od>*0welTe18*eD_
> zpUA2}(Jr4i9>ShvR0Zu2W%|5vi`x%#5q;$I#?4b2 at cwDwx6u6<x$DNN(2BMtePLWo
> zf?prj%|{REzHoUH`5=qnkITcHKGqOOccl_s)<)#3l(oGSBK19IMVukdU9XgrZRd9K
> zUfS2-b6{iB5NGa#{!8zI&OAN|^V1uo-EZC{->>t8SIXb!r5O_OQw8L57v}TAp?T>x
> z(HW3GC~y2m^zkIDp*3#$y%wSeV!UtlJq<a1o2)a&Z-lHj{weFL$vDtOP*{t`pUEM0
> z=_fiP*}^YVkNiuFbif`EhdBfCdA{#KQVu8QHxk+Ito~E}zTxt%K at iX3m2@4Q%^Gc|
> zpT^(h-#_PU6EoKdJR@@2%{_QKVI@^f@{o+*NY!i4BK{$T0vGPVuAJ9mUo~_P`R$pm
> z5hJgq1HNAmYI}($@{7U=XO^bq#Iqg9jasNY6O)o(v}B8?eKFJMQas4%^}zbR_$a+Z
> z_MOd5qOj_6fTa*hf9{rTN!MMY!TZ#DFG44*^;!6^-e=(xv(Lg?wv6#)4Do*qmELUR
> zWW)T$X&p--BSPsJ+euD=VBlayE<0PaF4GJ`muW59za2~WTvbTss}Ni>4|RL9%mtX@
> z5yYO6vWfS)cA>Lh*MVF!bIvwvMq+N9KXV`Eu6>$Bs;Yyh{0K34B|ayv*R_wJYojLc
> z+%eD9mQc|<!8trbJ1H^)_{01^-l1hU)}XskCwU~W)i^(gJ8x+FN5sw{IkT6E9mG;`
> z{dg?C-PPFF4gH?02EW5lJznJMQGj|FxOyxJD~8NHjy9<JTUmQD{OD5cEayEYH2kX*
> zAw>34)qgv`4}R<aapiY&<=@q4N%^7K;99IUPewfn55^?4RS at uY!pLzF|Miv-zVE5_
> zqoN9*DK|dFyVhu4aMrdTEi(+r&*~9lG7iV;aLhDxtr^cyGRMHDc=zw`AhMC?f)n--
> z)^^qA&r#3Mhw9lJ35?G};#2?DNAiSh#YDy;-d1lRW9`Bu&vxKNQVGs%4e1MK?`qZ#
> zj{DuGBR*>zF(hZ7;VmGTJB-6sZU0c)+P{q0N#4I?6Nx=Kx?eIT!a~lIvfdV<+{SBx
> zmB at 1=Y%FRqgwVBb%p}k9{G<{x1<&knAITeN8A<AP1Nkxz->y)QXDb;?8qSMv-l!Z!
> zwq4I=I_TQ>egIx#VqhGRKXRUEB{(na%>3{@2~w&m6F3t*>nG&$uxFK${h}Kg;52mI
> zIM)ohF&!}#Gl?uo8BOW2???924gsfi8aeS~-iXyPsuVPL?hCH`mvAl|7%upQh<?h7
> zJAcJ@%uksUQptVCu*l0Hv&+oTVeHIt!hwmk7UJnK-+u_5IfKj#<I}l$;XEgw&Z^UP
> zwf!}}be<iY7sjU>RsXm>I4_KU26F;(DG|L+^_o@`wcubz$V#dV`d+zp*4f*Z*^pb$
> zbi%%rKsX38|CB4~(CdDKF7 at w&8O={buR~rjnG6k%aL<7_*Msm|9sICgFruCL(d`5&
> z8~-yoIrj|Y+!-S0ct<WjPaRJ<>n#8N8!jK8ti=ub;&7ZB)N9iTE-?Xd$}c=u_N0Sg
> zS{c|iJqRD>L?vWruH7?of1%t}ugl?uTBM%d&A``p_`FO>qT?;h4tM)L;@{pm!G>5A
> z#J^K{;P{F7 at R+Cf;65cqpAZl{54bX|Io^Y90BrQfacd4{+Q)-i)TCZb+V#v#=y!h3
> zGmjnAa*Ua?+T*~>jpH4WEWc!BB{93nyK%Dj8LECrZZeSBmEbd7!}iBNHYllg`;!rG
> zD~o^3TqCk{N-p{;o#GMsfsgRX$(*UcDR%mnweJ{_mn~f^ZQs5*UEzngOymaC__^79
> z{P^{~g2giUA<B`jo#bgPXZg{OTM+Y@$)KJm(QdEIuYmqp+YpAj2A$PQ202w*PzUG{
> z(4WCQg}e)^bp*5YEpWhIi6*RD$hxQ&^>=XfU&XshFp+6u>N%pnd5gQ~MC|KUyL?SB
> z_?pDGRzY7h4av70-4{f at d4e-+$Uiz}lcn&Lmo12C-r~&VxI^D1eHmPj1ye7*Q6BES
> z$tr0gT#puRUT~9SW1Bz|pK5@=^Pjgp6Y{#Z3 at ZfZ=(z54v_4(todrFyu6r{$vIqyq
> zJm+0ahzR)aE;Dk-+cGBL*nAudE$beT7t<RQh at Um7%|5`9Le_lADrt6y%)12pUupcP
> zY9GI!Z5gw0PZ0Do5zmP@`j;xzqRtsjR2J%dY4Dos<lf8hSJmLzCdr0(EP1P4ukA`n
> zZ1Hb8wmA0_S2i4+!rhw_@(aD)s)ycfnXa&G$$4=(trFkSMZ2~?^%o}&7`%5py%rSS
> z*PB*WeoLM_$7h;Te_a~hcFm*gT)MpVRD at 3SX|GmvrZ-u1t~WtceqEZ at -H|J*yD at t+
> z+mR3+m~(YAV^E~sdXN(C{{XqKa$k3Q)-bd6NrY}TXFGNU2LQLGe7<SF>qf-NkXV8F
> zo{F}2)wZ?};)BB2K at 67yx)3Kn&FBLHcf{QQ>p2?o>VjYmbn=gZgEpyVUkb1Fq#hxE
> z67qxLd-<)Caq9q)8ZqL7eS{mo|5qQGI at Cv44f2jHLcYUX6Jix$Kg;!G<NjS2h4ItE
> z$)$z7e)fBZ&-j-ikM^Cpsu58&L+g0NPPBy at ki!ac>?(c^V9W;B#;d{O`Z?Cd9B(JL
> zHYRJKtK2$hHRMRipZZcQ)||-IPR7CDS{Bc5Tk!kAyTop4eu>kQjErz*KKlAquCK4g
> zdRU1y(<*Ka>i|aEWRaT?!!wxUm;n!AP72Cfi0x~HBe3nIsIbGgiJbc!Holxi+&cM#
> z3t?C%zY^aTvf8;jC(HK`<Yo=l$sZA!NAw4?2cEH-d&X7F at vu4mG1j1`h<q*n at b{Kz
> z`&>1^plgwH8}fs!?VEF6YyC1p=eX#)k=piuJ(I}X7RcOGqL&hzZ)YBCB^z4n{+SMY
> zP6~8MJJ*&n=5?%_X4=cybV`Xe$K4X-kQ`5YDxk-8sLu90P^pq~RkEHw#hx1xl7m!3
> z=sv{8oL6rvTm^i}!+%Ndz2SVq%p)8Iz#Dsjm(ts%L6Uk390mlh?p2=o<C(y$FV#B?
> z^5J=hKU1f$LB_=?lj4y&!Re`*-P0#=iK<b(Rr_kr^T>@g8M-F)GG^XZ;9a^Ui1j<2
> zFbZw^Oy4vnEb7C(^^qC6l|&znY?O%OHQ)!UCwe^-7TMTjF at 3<uq{k}fs1dKU?P!88
> zWhVC~lu-?X*HB0Pyk?dt7I^u}b`|ntoDV1~oaAb0_HHkS{?>^7bA6LU<*3_(LNC|K
> zzDX3 at o&40Gk#0MBMbm0bdY7{Ic{JrMJ2|XBo3~j%IJP%#3-{iPoIgZvJvg^5tc+H;
> z^W6<|;rC1uRkO%*!KQ#~c;-{RMj{Fi5mP1W_~0TZ{KIqpJXSS$3}v69yn0f0e9|qR
> zZ&@dWuk{Pyp8kjT01isy<)lkIu?`fFIF_V*68p9*)N}0}G2wCaJ;G?Zts1NqmYobY
> zbUY}t_RCxAlHLuk!}^l&!vQCVH6`#3J%aFxjvC%Cs^Ff!j?nO6-DX_36>TZRy(O*x
> z>zRagXsNUx_HS}u9q9uzzUrh8!|ug#euR)5d9Z`?ldOX|@RIc4c?NGOcRkl<Ec}Kg
> zTCuBzz3g9anAWf)O{{($`88f+`$;V5$p2XoH?#ZqK-kSL%_K2ZmCY!-IM8lF4hY!o
> zl)yZn#j}vxlRJ)hC)5LdhTw&W|C8XH$-EV}>5{K?HhmYljP9ld(|1$nHQiZuO5J7<
> z72nldKn|)6&RgIsx~s`iw-<V;*~8#FVN*A=Kl_c4XNPtVXe4K!T9ngm;MzRO<ck)n
> zLXrx4;TP#4?d-v|b0O?ARx(}{p?n4WB*1TX)7<)e0vSh_#^X1Rj6q`ici0eX?g72a
> z(_Oiz!Nb1aIzh~|y(rhIFsJb0XUK>DLpJq($7o-B$LR28V7g1wMj(&-Qo4B?&v)NH
> zLQKyhzk4I{yMLxitjPGAO|`jXG<n{li}-z|npnfK<8Yr!3V;2g&sdVPEUfkLtWkr<
> zRI-W;;WuMOl5 at EB0}_XUT<?v*+L;ND|CJ?yrmF|s?R#VsE&CLd^ngT~2b+*JGY_^_
> z_|ymo6Y&q52#1FNIcsIm!K;YR$rzF6PqD}WwS%2U<+U571-e7(N*0{Rm at AeTz`w$f
> z_Z$tIy)^kdvrp6MyOuLXO{}^S-+dA6De=ILUjZ)H#x5geb6kn}s%>?h%@Xy4_V=W@
> zhNLZ?;4#XzOVx#z0q7%}D1AjL=EG08GB%@(;r2;tyOQ5&O^|e*Vd00>O8Ts60qDab
> zr=AHKlp(OKn}@DB+dhBjn!s(fL&r+l)fk)dq2qJZZ6pSfoSQ1>Iz!^H89}U-t%>Ym
> zkD(4zMJCt-UPRxhi}-}IpT9-;P!Tsla26z{UoZSdFdFUsz-P+M8V-XW#$7kbAPt1Q
> z8+`2~XT(>O)-<j4hlqWMbHrNbSS;2$|5aOt>U4x%5o;Z)!;$v)s4%7g_jH1TUe at Nu
> zJ$oNlCWU7!G6i_H=+9^W7wzBc*p7U{-~y=Bh987|&_MdFD&){OOHk|QV~-HsvbDm`
> zD%F#`oF(bV8zv{$by<MlJ%j7UBe(mBu}2*h9fv#gJH%z>+LUk;e71JrJ5{#UCUeID
> zqxHp~QGVcH`M76n)Qs?n5<iOV*gDrtWX#y3B8%|SJ=XHMdb?qyI^8fFeLvXcwk4%Y
> zuknPRLjt{0{8kbCAJznZ*NOH8 at OenK^<ux6JLcDQ68KoFL>yI<AbCr#3i+U~qknoq
> zhZw$iK~qD_8_<ns#MTeBQxUsL9g4Lvc+~`t(FUjk*37|^pX2T$n2TA!lim?kd(EfB
> zWFEgOhi`hcKsxmNVnZivCb_^I_Pg|3kZV}j$P;Ipr`98{<nOr0Gv~giLLt8WGHf+%
> z at PicP*w-r_ at PTQ#MMdO%yZ$8eFg}~`r06aVzn`5%xS0O<CLUugTcRF=*EQb){0HP2
> zohEFxMSKjo65KZ4 at T}1~{td)}|A6i5Shu{WZXg)+yfx6jCQzmfEplvxk#~uFj>POU
> zL5P`|j~G^zb>*MFwS(t)J4!q;HZvD|fm}u*Asd{}<|)9PouNHiC<RyH&Jh!#FApE^
> ziZ}OHQK|k4tYyB%Ix?I3zFt(e|J^_M4o4%8dWDolF0I)r)7B8!eu0HVU;h|-NU+gb
> zHkw)u8y(^dVT-2mJ!hic;Y0I57`T`vag<>(>?%RTH`iHB>;k|#(RVlE+s-d5?;Qa5
> zlqA_7ZC))|n0gvmDSNwXKvunP)J1&9>I8p`Rq!)Q`1s}mszJi{ts(!hUw`KrjM4dt
> z7F<)?Em40@%16vdjUh~Zb!gv=*ud&56<q}yTt{$=?S~eHwjWBi-r15o?Mk)tiH4u(
> zkO=xTSE_+mTa7+AANsEhvH)eFo|fjYNUk1J1x}i^A=VUl{ttce9VV%*#Lkg%PIMAj
> z_FBX`H<14%9+GVpon{WlKVYtTn|c&z(`3 at dYKKATzi?nO{%=vQX4g`wSnJ<Me8#HG
> z<xOYf?}ID8XZ?WWG)3ps^1fhO36HGHYa#j6_pF at y_>Xxa^R%xKV;Q{H at rue>=-ZNm
> zr_i at +m|*XdmGdBbaV at EXKkS>jiy)D8h!$WjC0uLO<Xy0KZ9-iwf7F%vUX)3`AI6A~
> z_26WlA#D;Fi+%KCFV5}*yV+J?4>xO|U!6v~STRQP+Lw~C30 at X&a!(oU2!fm)8;clu
> zPEO{stJM<dv?$jz1pFJw2}A5{M(fzu5j%br`X_AE!&>nB9{Lb)Si at db>w)pAcEuL>
> zQySPqMP`c8`dghZ at E{lL-7k at Rhn~+0FNpVL_ETEsYEb~Ng#J$sH-XRJcVW0(YcJu0
> zcU7K<9HGQ!Mlj%X3vm3}!gkkKLz|~{!10pYXY7sooHtBMvNovodF}*vMST4tGxAiR
> zj-3Brj<#xG<!-gCQUvVpje1t(W+$<*hW{cKO{i|j9*jAQ(61%&ao}=)N1dB75Ao0v
> z(ODu}SPyS=<>%b-0 at NA&Sn!k1#XI~vxz?f}^In-%8%As}ls0Z@;VUE;)-Z6q#EY8F
> z4r at VPy5)%JqL$8ynp^k^{E<HlkhlqO8Z!fQZ>rFx%fFw0m*tmfo5E0k9^z>IT;M-}
> zZDAqLi7hP=U$p3s!EXVXd&5B9uk08zo0kQDgt<`Sh<06%v8s>N!e(L0 at QT%ICQ<e)
> zRk7OM$D*Sg-hOgXokm<{W`M28`lNN*4FkbsbQY8Lk$6!?-E+WxD27?1zBzmYI=iB|
> zA9a}LM9j{j=4QT=U?b-}x`6T?t!EJzTL at i|tc~ZRZdQ#8MZ<SmmD7+MFS!k_*_8Kd
> zn2-tbfKQz^iFrp2>?tg`jJsj4t`Ii5D*F2;SbZvPmgi(ASZ5q_T2+a+*5 at oyT2!64
> z)*GHbyO|jy`oLd)EE4(Lvk;?SqtSP*!h4+oUg=YV$JAO)-py+Kuf+dy!!$027WREz
> zM#($g*9k6Q*neB&RWDDi!x{#0)`c;MvxY8J7z0fI>8Le at F+QhnG=Q(I9M~rk(@Cd*
> zX997!q>P=+GAVMFc>bG}gI83h2JUUJoiQG(a8E7x)*3k9R*=XBdsR(BgVTg|5NFWR
> zN2~;Va8qEzoaB96C~>>cpW^$e=9u#iE8 at zk`>QO-(^tJOm+Tl9)|5&;-X-E4L>XUl
> zvA0sh9*=~K|Mz;<NBlEs;~zAu2HW^vSy|h4`4(3u?9B+>;ds`v39=ddpII{R-!yvX
> zSvHJ&PR(D>@!g#x+h!s8qY(F1L%vnFytMqMV8maE0zavcy`5{Af^Qt=v at i;S!-=<O
> zfUkKtR`5t8=SN8V-n3j^I=3F{;Je_FAod|WxF*pjq(37by&BhYeYAwCrr*1OSol!*
> zap%O at naM8Rk1j|b{rPUdQT+LCqo~%Bcc}MmvcAcT7<2J=SkLq~T^#m3??}{3hcAaq
> z`b}|j3zta*o$bAX<R8C1<2XC)drvPGx>)2P{64~Or`KV2S?j6D3@=voT>B{1`1X<P
> zB>exdH7hc+_2bAa?C-{P{rEBXJtE&fCnV~<oXb%&b3#~g_d!O|QJ8{!QxDP>h4={X
> z{39+b$Di0V;`?A1Sst$dPO_kX6}6nixuXx7(BEozZ3LGHzcly3B;GeZ_iq4K7jx*c
> zi~1zm<)lFY+#Shh?5jrH?3ORl-o^NxXc-fI at cZb+my-57?HpGE*7(@g;a7qCif~On
> zWM at 0)Gh0b%`nAA5edv4adrRUwEI;F#CRD9xNsE5^eSZ%RP;D=bY>NxC%4<ybx)H~J
> zDsVG6Qs1hPO16IUvN*xyNc|acejVj~(#-*vEQxJQz37!pU|}z(#W3)lR^n&EuMWQo
> z*bR&D%g1`>8q-fOG+lJ+&E6_T=<;?R<MN7s8C8kcQEP5L^orMETiFO*OXO0+f-9Dl
> zW2;1Lpv2{zt_rypXF|V~@fw+{apsa_wcfF7M!jQBOxES3nA?{;ME_7FwmA{AIi8h)
> z+xYd;CrQzeLGQbpN$lQ$*tDMU1DEH84nd0;=b_^wRv%lm17ZuC6w-&BzwUzK1?^I&
> z%@)$RhLKapVIz+yR`rB23jE|$tl?{_a_0#uFMM(|)&)k@!hdt+TSNCF7OGX<kORIA
> z%*`H|%e`t<!M8kM0}030Q at NqjGWG4mgV=XhQPZcXX5aEwrQPykv?jYI6!^Q)Qaux`
> z-oi**tLl$oUi7o)Z(rD&Q=iv*=)LS#+k1zLc$l+BKV9furE;Gxz+72BRdDw;>`zj?
> zaBH$kc5719?>U!y2g}N5q7kR+KHVGFRTBLJ`+QvUQq;|y5Q*d_ at K@74qug(g^B;3;
> z2`l%$9p!%OHuhg*m9572PPIOHucY;Q{W0&}DEGbxIKG-y;CMEUAI9-K?~Ew--<RRI
> zf)(Pp9>?=>Jm33Zl>37q?s^f9=izuRj^}#kM!DZl=8gyBco~kD;`njz(kS;QmE7?#
> z9M|D^4vy=+E2G at mAT|ic3QY$_9>ehh94G6RW0P(xuYx<R<EQo^Kj<kE<7oN3RoFAJ
> z<Lpo3j)phHr2&^GrKI0$^!*nTRBF2%-SO!<@#b3eLp|b0>kSuy(?d=hw>>B?2zIOl
> z=%ky-_iF3h6 at q;=jvd2xeKGy+9D)Z*I;;@?>d-A-3!VK&JGK(w&FMs7&t7HLDzUyl
> ztO|W28UC||T?<?9-?bOtO%@ZJlOty(@Kn1)u%=2THi#>~5UdpY3a+sg-%S%ca+V)~
> zPI#Wov+7=)e-!7MJxsN2t5~t2%Zrt&^<Q8f{jdf1Zy}hiEBoS%IhRx~wB6aYaV^Hb
> zV5%-!t-bfvh*z^`!=JQX&7PN19kR5ZZ!iYn&+|wkTNb|kMbi?~4d1I<lqu*psXx7@
> z*w9InHF=c#qh+{m80v>LI<5=jWSF1u!mI$;L}_p!(a77aAh9t;`M&mcDfTskylqTB
> z;dsOG<J4+L^m at HHxYLV~_XIGCDHg&pQ{<pNF?>T}QazStG6eso46{h1Y?<bF>;a>x
> zD)#-d{DgUB2X4=6eWHpK%<Vp#9G^9pe^Rxz^-EP+YvUbnfv0MGYop4uwQ+a1dH}gN
> zD|P>Yp7S-X{WST_ZmHmo>N%X-0onaEjyDQ|qb3)sAlFs9LzBr|tU^wAqe`{aE)i4J
> z-M$1<bAg7ARvV|heVzrD=#ShR<o&X~*F1qQ;1lFMMO=CVWSpmhtcgi^-2LDpK<u*C
> z0((fzI^PV(3-JS$;APcpT>puW_=Y9ztn)Za{KcE7ha9)Tcy%qYm5=u*K6pKy3N1;2
> zUj8L`?!&-q#-|>Z>=0GQDet&M&AgPHvnO&u<=NBPjJ%UQa at _w6<}FccMg3UdkNqGM
> z#;Q%wyYB#Fs>QqkyhHqe=Jd at uI#=jpm83r08p_PL at P;E#g<TVcIeU|%xPVV`Xr4Kz
> ziGeP#1l(<Nv7Xwfj_cLZ`s885y1L82O(n*70_Ks##*>&Ma8osJk%*2A>0VCV0JtVT
> zMVU$J{G7?syUKokM6cA8_THDRCvGarniomIkr|5hs626nBpUN_7&wM at 7_Gr&fmz at _
> zF#x9;m=^6k&IIwkvml34jS}mRm((VLy#ViXyT#+rcBx|~P{{T6|7aKFAV#}9(mg}&
> z>*GUy|E3C=eiZhYa>%lySclxHlsg&<_!!$)J at Xg*o>$8BOM4iH%kKRa-glKE`usaV
> zYe at V9>Phgoi~p%}C0K~dH!QR0X6>KnD8!12>Ki4nWe5Vzh?OqHxbDr&B{(VPK>yj<
> zM);Qsb?(mm{xf)&S+K*1Jr&Jj-<P{XhgrS;b3Tpq8Lfo+-V#);*T{wqc>U);4VNT;
> z#7tluG>)Bybw4eXrc52&E;wUR80}XPFRJ4u(}TwnMqmpJQ&WTVE|qQpm&k5DStod(
> z-76_GYLSEG{x?`dNS2*s7!6_~3&Z2WN;X)6xa%5((znBbyR_eq#rTuHdz9p2!C1B5
> zuNk}t`KJ+6GRW1D<s at qnqrKaojB^qTf4#g==+=PP=`!?zQ-<NlA?-!eZ at SX8$!;V*
> z%X^ApI8Wpwybav5(SGv>UbGgm$vF#Qn-+VE3}eW->wCF#mxs>rdXW2BbcE>5vnLr<
> zhsOFApdGR;{J-UZpGIU)ZLVRi(f+FwIPm2+D}0t;2Pfu}2A|~*krV!b$?3*%60ZzU
> zQV~Mwjtt;d?RRf*{snMq<dqgG-1?axIsf0Wsh8fY)YbA1l!RVvh<@fMtt&A`s9!C%
> zXfW2*uWXs7 at S9CbmhY&(cR+39Y{b%(c?RUzK<xZUC45YV7P>THmXTg?oTgX!&?b#i
> z+NlxW3`U!rVU%9L-Hu&om`_12kNsyOa*raP6zn@|=n?_AlB6lHH-no*eAnzFzHLU1
> zUBrT`aeT+o!SB0ua;AA$P4)y&_>3ni_gH{q at v<*|)Xx*@#t@(0UDH<47rCn^eL?S)
> z8ELP))}1#;fy-O!Zrv}7qJ+}KqnY*Yz~SzijeOr9AWw~buVkXl at w3tXTc@WIn87={
> zH_WeBdi$D^B+kI7xq`bTr;0wch&m7U17BxR7FVZ;1;vV4Pa6!1QY#%)Y}kE4P?aRP
> z$;ARkg%x1i)bI>!;+bNXdQ#`Oupg#ZdNnmHJP}w3tU1lh-f96JvHFf&Sq5HFhjR3d
> zh^b>X(~Kq7+N=>2-w8I+BP7YzLYb?oyWEsNLNe^h;ft}BJHEVNw1pMx+M}>*p0vy;
> zYDsu8YJUzdX1~L=lpZ0B*)MF&IG~!5|2wd^)g^+c{W5W0&1Ki9{oZ0HOSV(Ro%Cf_
> z$Y$5tJdS5YL$UQ?MRtuiv2u5)s6iRRkMI}YTDp5aiI4WwD_`l;Yh^c;tV6J?a!RKy
> zr2*SHb=!B$TWj4tYOS2$^^dP#YsbEl+us;lw0qRDqNt?>HTaH$_ebAU-usW=r*UBg
> zH5TsP*dpCa%Zkv?qmK_?YuCNBR>|$VuC-!cK6LLu6L9r>BWw+KAVXEs>&g>-pD30)
> zBm9p!&-)vwX8(mwwpoO{6n+WmtYiyM_|5PdQ)BEW&B?JpD#W|<y1T$<WE1@>F03}s
> z5>`~20DD%>!k8MNxcOhoDd3n1hW;pwsYAWMId;>8V~Am;DrDlaTEqraaQ7*A(T-5w
> zz~xYk`;)DQooTHnoaw|4W2e(5bR66vJ)6&fA4cFsVqm1#S@)QJ$9CY3Lt`E*{C-+}
> zSsV4(+i%_K%iGl-B>6de5#Lj;+0oivmtRbK^OV4Ad-$nFd=$LP8~QuemYPK5zLdIn
> zg9nd}QbcV+o$^tq4&6(T1FxekZX<^TA9m$+-1&{H7`Z`j8Kd)7!$*86YcDJHwv)Cj
> zdlB4wDe=G<2cA=kFBnu46CLO?mR{tTs_;2;Tr(|UfIIG<=rGJCcG)6&g at 5be-j(p*
> z%i#}K&aDmgcGmYHr!9`>^sXf5TEFdGwRuNjk82HhdTuHByN^m-C?jKot#Yjsd{ec@
> z(2i$`ooTk0%V<YXDJ>9+Doyj6 at E<vuhz$GVcu>qAWgM5h5DsoFPc3p!exmhv9`Ba(
> zqIQS&ST)`lL$C9W>_yz2U>t|VzJ=$qXtT$VrO1b3j4sKC{w0;(XaYZsz}(dEiUjWh
> z9V)An$i#1~h^g9ym?f?1Z9joRoUx|}+y&$6)b?H8XzRD71;p;Gg`Ffod at Di~s$qz&
> z4Vdt3^m{wur@*l%u+v>}xI&)@joHtJ#_VypqTl$DF^4?FS7Y`o#Q4rU^~ofe^AUc)
> z{tK?^)<r#<>K9L6-Vyak<`-30F}J8TLDpHW2`MeN1fz}LcAR}iNdBv}GC$uM^o@#s
> zzR64DBH9K1@^a<QzE8Thm3di&>-Fg8MgA+DtUpUNE3YFzr?Qk at 5$yYxt{QWrz(uHA
> z at J!y}Z(>_nVe%Ui-W`j=?<V4FcjuM76Pr!Of!2#EX3d at ZnfWd<!;ifAy^Pv=Z;vz|
> z-?6s&MfBatv3-m^_DYVevx$+Eev=(MC6;hFLYCEXG9nH9K*E?OMDCasq(9 at mwtJuA
> z#)oilTtU8+=TzgH4)w>}OVAY%&xYS7$l=8^JJ1Iv2SV<Cb0qUe-#Vf<X7Z6o at Pg;@
> zOtX=m@(anSin(3f at DrD#{8_ZIa_uNi=8GFbxMRaJ=w#X2VK at fvh<JT}8gh3CIh;H_
> zbDX=}TSnQntEkhJ(_tr`LuDbx7%?v;1DY4Qjw0X3iN=|*N&mF1jkOr*=^NJ;;oCaX
> zWX`u#!L2VKej4M3<KCmECm~-Mcx`>hdZy!=e(1u7o!fb;3VG=Po={|yjnUQUl3_ba
> z={l|)?@l|m)4hPL!p35v-xCXbcFz}lY7muKA0U3vAuOZQ14K5jkcj1w#mKX&d0cX;
> z6a3|nBRi0%RD5%_w;%NZZ0KyayPyi^AC;WiRnY-XBj=8pHl0Rf^A_I(UkTxSA?J{H
> z3Owhk5t;|tLE!I at t6Aiqdd=IPYBvNA%gqj*VPnAssQWg<z@*^2 at p%t-Z*D#5d^gZy
> z2tc`B$Ytk^{-;3S12>@-_J%>eC(V6~g9<#OhkL%Zb*J;)nHJd?-&%vL^nfME<%oGI
> z?@nPV#+Tg9W(amOK`t3^{jb=b!?xQHgt;xWwaWQEw$Qzu8(Kebz6)LpiIWcTbJi-Q
> zWQ&|y3beHnoEYGda&DPXl at r`))jXR~u2JHhw<Lecjs0gyn?<4Riw=Nm>0yXJRXue7
> zC#($jZ6&c#ntM52q8iwiPU3&Q%2#tQP3(MYsI6`{%q_}HfUVfMwbQ^1Cpu+D`2$%Q
> zy;>;vh2#+>&tZmh&$)_k!fFB*Jkm&SF4cHYHQfVFd&<|zqHg(CaQ)t4G|%5$xH~X;
> z9rh*IkM6!vrr$OYi5TOV_Fg$~UecTY=oX_M$?)ZeYWfDt1BbjfeH8X?Ho at bj>go=Z
> zd8zuKMu}}>vgNL#jNX=x7>1zacO?8fmUh_N&C)~*IN<FmpC!|HpNGH$R5{<_bcv}A
> zA<lf{TSIw}Z#kX{@V3Bz&)<@1-c`}2^;9_Q0i?~u%^ub8r}$Q8ii_H{O8YhBRBUKB
> z at -kI%nqM-_sN-g-55Dzj at K)*}cdEJXO?z5(sZ&ov_Ehh+%!J*azXbUJjzgC%#r7!V
> zI<Va6vvv{qps=mSdO#Gb2e+rKIt*oQ5}CY0!mmP}+NO$c^r8*!fY+a3oS-A~@+?01
> z4x5QCi?M{fzRq_7ESO_M3^E+6EIOJH7Hf~2Te}-_q`CXuGFoe0W;aa3b(?TLmG?XP
> z*aL51HB=#*d);!ur?~e4j@|d>Uys1C+uaK8*nR9j=48cA+^da2&aN25A!#0cmI1y#
> zv2PyaIw|8f$OBhw?|yaw*CnhSjs5P=4jJk9Kg0iRvHHfnQP$7)VgEhsAB`Gl{5a}q
> z<0nzJ&-UQhyKBc0ne~1vS<|<E>)bl^Ku++R%EsZ<w!uCosFKY7qBg*9Gy2%tVUTGy
> z<bpx`C;u~{xc&f_-w~LLogb at LtD-c&!*+QNJcx)@GSbu9)U^tKCwRU0HF9&SU5dCL
> z&vYgX^SRjN2spfr8o#%o|8;>+PopRiAP-EyoAS@%kt+xs at T?c))@V-!zC}uA3iLw>
> zwOT84e%vkhJq7*Au62R^K-l?2Gv2!r>*{NoBe4zLa at g3v?A*(Qs%x8V#pPPyIK9><
> zzX2ODt6fQ*wtFMrL<=tzec)Km+mK!3T|Oo2_cRHx<TAIiKl%rwM8B|!V8g)HBF)EK
> zjhvCY{s%tIy_&QxYe|Z_GP55ts9kNz?C;cT0%q*hjOjXBvW?D!JfbxfkVoLC)r`3r
> zcV`NnnHIKnhyNHV+Yo^BVOzIj|E?hvV>+z!K)<;905f`y`R;(}K>zO|%U#xV;PI_x
> zZ5scZuLSr}FGJTc6)IdC`s9S8XII5F_?$4mu)5TEeaW^?FHJ?+SCXJDssI at UyZOy1
> znQSw7=x;9g<&9F??chFJ%K7SJnhT}I-r!OjvB#(U2gknbD at c<#_cCs%kJ5Q4EohF-
> zvPxvP$O767z<Z}$469<pa9z9ic*~oxVSoc^!a`i{QugFKU}D*8XveQ{-4~(z;UkIG
> z)#2K&&rH@#Kzmhz<5B?Iz1v)4&N<{M7b35QXw5w2+6gtt6RprIYS3qEK0CA4^x3DP
> za}GCL6NGDouxl&v?a_9<l9+uCHyksqt^MpYaJu69c?J?YB(4uYK94x~lge{G?!-7C
> zK6k9Yxj7GhfjiJS!3&Olrp0wj**0D<+G438+ml7ErTf~`&UxC^{~u>>9 at o^hwhgOw
> zYD>gg+Xk6b)DRH}VaiB^Q$%a6wX_wrN^O)#kqTAXY%nS!;zU(aTNNTA(0~L4LP!E^
> z23rrc6|EhPQi`Z3Y3qPP5jGNiueCu>pL3q~`+nc|2frQmu=d_-uXV3`xbEw=6^UQx
> zRo!j`mk+Ru>XX<`+mL=kQdoA2^jC9lS&FFFCq<041zZT~#u=!k()C)g5FE!|UEvt3
> zBDDD$Vih^KM+9PgdJ?Bmx1(-{1AKJNo)eG*SC3j2Whp_x5lYDz8R|nT>bU(REFbLK
> zvM{<8I<NpiFz&7vieuX;PJ#ZYR at P!n!Jk6f!#R6=-!j;+#(B>$rlYRr!|`OzgWMDm
> zK3?Fvt*_LjTQM$No$Xl}oNQ`Y%%VOn=HN)WeT@&@{^_hj-Ccj>r^evI(n5b9#8kO4
> z;Bqr*pl?9G`vW!F8q)eZt&BHsyLYy2w#UBC0_4mc##}!`NmtidLsm(e-p6;jEVT4D
> zME{BJ_#rq*bMX5Ley=omKvsNBo7R&&K9 at 3j`bRkb1Dt=AJ--X*#MlM-1`2a=q9yTl
> zYNKjrfx7on-_H)OT4lm&%x^9*2rp?+$9?lgyp!mPFZhq?#AFrv!P$<So+9*lKp&Uw
> z??w3bo#^*}RD3|jnC*!A7u2K``&4VPk-PRK_XNh4>HI==92v2%3i}M$7tkcczDl8y
> z#J0~nM(n~qVUr-*+aNSsz-0jb4~#dz=vhs|XkWy9EvS=d?fos`RmdEpHAJaHovSkS
> zC1EX|MFJk$9P4DrtDqUcg^;yDSfh1ApHq=Evze2w-4CCuT6ICtJgdeI%ukAgv&J<r
> zT+P1ET=sp$gYOeV-sds3Y;_$ajd`;{PIQu3>h?~XTVFf<61d>a(EoNan~;+(bkAc@
> zuS7d+a3Aplx(3cxYmk#*mA)o5gpjq2%st+5)M+(ZASX~y$!HL8vcXX|fS4+ccF413
> z+tr<)F|Y%TTiEA{B7WYi7iN?X%Hu8z#z<efg<w at N&h`-*Jo{q0g}2RP^5yjOD9L5a
> zqw=hNJ$N(P8f_o6jSK%w^(Et{>SrR$!kW8z75M!nvsv{oy9NJuCdhJo#?>1pt29|U
> z=qA(2SisuA-KAjOlGwf1s=~S(pRN^(tPp))Cy_BC=jDU-h_NmuOxa7;rKS<aGD<=8
> zX{XAjt!4C-Z85qEPx#fFop%aE^>35)2sUHb-WA}x2BvKLK5+D0Y&&U7K#Uo at xSKqI
> z6BISfd^#TI=yx(+gx3wY0tVxaVEy6$!rF~`FE`DC#&1HwCzoUge;F`tMvtgJ;e&cm
> zjr|MQ{qWBhOezbHIYxZk<9|gSGh%ud*AJVU_fo6`_4GDH%TS}v+GH_%s=4N|)T||S
> z-pj7j4W68p+AEP&_CDC&qD7EvUEfwn^V?HI`E-TIA-74Km~ZuqtkUY(V>2qG4VNfE
> zbY1s2UR8^q!;W*9AL?Dc^;2L=;oK5y&|rJo)$IB2vgZSvUN_j5@#*oA?D6N=<C1*3
> ze(<>U>G9$0 at weFH;(WRR#|5Gvn=3+;S?69PxCvqAKSc>~^?u}j$SX<Cr)zMI{kLek
> zdj`*}y~bIE9F{-jA`g1Xe3dC{686iU?C*L<E}B91*RlJ9p6(Bmi>8zP4Ox>Gy=xZy
> zz2Ai9W@~33wP{Fx&Q5&2KwU<^{w%MiNnBjN{ex&aSjzn~{UU5qi8Ay2ru?jJJCs|`
> zYwqi)&G1hou)6gX=-%Ww at mut>z6)R*Y^%w)ZZ!^@O=2r7x0fB`x(L2=Uy2ve-<NEI
> zt!O*l_X}Mr4x|g^gp)lJ^^})Fj{GXL!VWrUzc{Hrb=0JK=41D*+rZJ2Rzl`e*u`{-
> zO0&C0^=OB6Vu+yGZJAwwJP`3jtPL*!FHY({PpnT(fQ<L%K?j0v>e*#&#TwQsb^nVT
> zPyGZn1SIbF*xwtS6=+ig`=-b;)wzy}ig|OlRh4}XahEM?NxOs_-Azd1FllwHKbKBv
> zQPv~JzTr`nvkcdA|KoXvk@)D~^Gtv~HuyZq7at8-S7h~N?W$6>ECT+ at 2&^&gOUOCc
> zt{B|9!N>VB-o-5^y$1Tay)}Q>?8v$v at gnFaY=3vc&MddZNPwk9KdU4j&`GZnenDWs
> z=``fSWPHjI@<oS!%nflo2)uLllymDwX-)bC;cPC$mEy<=Enh;;o=HPY0eO#n1JT3g
> zxmFf9fgiAh*jt>dc18#eR_X#d2V5Yq7Zx5&le+DIeklib85kklXDWN2A97`mCkF5H
> zk?!C3=`7aFLc5EhPdNckC`&89s8MR*j}ekK$g{#P6Sl4KzuIX1uQuLwwLEF#S2@~{
> zy8rOBjS#eP`)M0RL(lQj-`db?rsBQII9KsLKcoTIhj+vHn!~mCDQi*_AeSt777_>C
> z^<V8Q_`kGsK27knor`G4lIk+l4tT+~RsUx@@#+6=2Nic9JJhA@^R%Q%p0<O!tt^-J
> zkL2BeQ8lN|QG(y$Mw- at arpGKEUc29$)E5Uo)p(x at Z{#k4Yp2rc?`kFA$q?dN51vD^
> ze*O!6Rh=3I?ltmW0q$M at KdvuN1wR3MeUSV1|Cj6Q{+Ih#rg8_bPZPO+_5b~PSF+|T
> zV)3$3`MRAVz4u*7e(4fXi8piDVFdE*CsWQbi~H2JOMT~wo=@vi5LX4SO%?Jse?cAH
> z+9}|&h7TP0H`RLh$ZEAmiSJ#t-eY_x>PeM_FNo^2^ocp!;^i at Qsng)I+k4-_JcG4P
> zWS(ZHggT9rYP~z^Lm{@`5Rc!a4GqqPe-+n}So2R?!4tn7Ygt%-Gp^skUJt*N`5U{M
> z{zZd&etkK>e#%kbMIt2a)WSzws}aS}xTZ3r;l8d<<WTL&*j6?ra+WpSjs6Qh?F}u{
> zu>Qg?t`WIg+(n&qJhlSSoh-_0^#Rm{Xs7zX&pWxR6gkqnU}x31FSC_kojPI&0LH`(
> z>zJ32?Awif&@<}7<Cg*VQeuPsKj~Qd#kBJCG~##28S{?%on{7eQg1a(q<^Lypr?O}
> z`TCl#F)c)rlNty+YeeF4#F;FR5wi at laIMCb;FQ}dc#=E)%{V@?u=E}O#7eQKlYyRP
> z!g;>Lr=nE>w;Q<dB4S6hcM)mRwF1|*q2^q9n+9tQ>N2=4NL(dO;h9LT8T=2w#Nzu2
> zM8<FM%shPiRh|#8rMFDuOg}d*`ZM&)IOrYWuhmEIh40r&`mbr1<c?>bZDnI3zQ4qw
> zwDInWzqFYvHnfa{Pkjt$?75K<zk{!ZJ|FLH((u6%bP_(UvG)y3--<e^r*l=Kbyb)~
> zY!jlbQp9hB=@$4W(cg??A^ofXz63{!2W;mP+C=z^JlZxPu2V`)ga0B5@%qbc)#3dT
> z59pjC$l&Vmhgj>DA`bqL^Eh~>&D+j>SpmM#28@{o4M&v}et>EZuWj3mSZ(sHYe}u$
> zNmJ}pO4s5(uJJMTPjC+oTPHtVqpJUH(&CMR<`o-TApd)0oF4dfTJhILxcm{PUw`@`
> zXCnVo=t3fo`6-{O>iO?=M&BRE&(!>?|19bDgnGqT#AKdb6MFl!z9>ne>dE*Q(Z{CV
> zWDd4XwJq;F$Ose9WKTlvcLlzKPGgw<?e#PJ6r%?A&(xU7 at BKlwucyo#S3CXt)o1n#
> zQWhB$wQoF}H?H3HGccRW;iFqhpBpQUZ7o=RKa=vOzZ@$k`+&m?`@(X48rGtvZC`{x
> zN}MI8u8J40I1<=>c}TB#UH{nz)W-aX<a_?wcG<RE at gUu)vxD)TlF<?pI?!QpSl*GW
> z&)F;seIyoNww at zC&7}*!2$!~{#7R_zEkyTzkJCd*RH;_fsDQlbIG=+4euVmilL;p+
> z>bgVkM{T+|fhcp6HQ3?vlsMbFDW0l#kDkS~OBX&0_d;8qwnD?dhMsAD+h^gA+V0qv
> z5?vV2zMRxVAX}niLhoK)(jp$+HrW>SR!w+z+h*~`h`R6|s_mu=^zjEu^^FSd&Qy7_
> zJHD6Es(^2Kg6b|4xhl*cS5=@6-e1gHN*Rt-WcS7B_6HOzDAe|0CQB|uKdOR19vETb
> z|9}o1mau2Y|8X+>`Cp$WwMAj05})No=v{+jlJ#+8Opajp`#|3s+|T;Cv43PIeRl&#
> z8!uXSHzG)f+6oK%$bDFUbg{2h>ZB#U*&L2vTb8XDV>l1*=mfpL*oIn@@UM8yGJ!vX
> zhVRrOUB;e!iQ{L?WI|@`RgCSWZ(J at hFhO~lViC5&Jk&qLHY6_-^4MS%M4ZsxOEO7C
> zxhB{k?}59MKDuqVbsuWn#0DbPBnlZOUY22!F3UA(@9FE+-ojFa?CS4)(beC at q5-SH
> zFQQxF{|ddmp7nv(Z}cYdNqmQ5XBWgf>5Lek8m$Fbi!q5=SseI-MbjI!;ErT{!pEWW
> zz{jn%(4{HfKDDqZA@^1Ab1QX-m6$MhyjnNoeNRAEkv5NlgL&-qw+!E%-o0d+O-DJ5
> zdX&{L&U)8*%)q`EIC8XgkMgtuH)JcYFKOF4`g^P^a$2X6!*?tr^@fmhAs1ThA$Sfc
> zcmTlxHu{Vb9IL=2%jr at LxUL}o;2S?Ux8N(zUlh0NZOXH2F?{z<hRY;Y-CLQ<ceHwl
> zt{V&rnidQ4O4TCdlqr-JaAlX<s)ZIoWA3{oc01&o_VEy0HUB%#fptbsVjak#CfD(6
> z7sQI$_9_j*u>07yz;j8qAwqC-D#81y%rTsT4o;qz_|Z$*Eye)wtwPwYB2}upsJlMv
> zbux~K&W<(43%0l443aCmljud2KeKh#31=_y7nJo8U!tFCIchD0Z9jjy_8D+1s69C!
> z1s3Vc?J`>#<A9ji*RZMOkve<>6oW$?RN6o%C*c0ahT7_Lu7i$E2kXFjPIT<X12;%6
> zR`^R)Gt=jKpkNZ`K-zeR$J$=B4V=#X-Qe~Jj33M9d1XRBii#NsFQiuDo&#qV>HFRh
> zw<Xwaetamr_E%@SJt^S!A5Z4zn`xMzX2u=!^Ub08IbPMvM3edXW@<Lp)BQnZ;UWDc
> z9L&+;|Cpmy#8(pk0QcX^=9N8n``MxOE28bQS3h$|9h$2v3HEcbPtH!P&6e<R>Jx*^
> zp;|M~mMWbuttNfO?ms{!8f576gQ_iAi+~w2#^|JSGyI9Re&B2Rr12%yc`m>^jiTu_
> zPI`-zA98<_ct^$F`l at bl)g*@~tyo{qVSF?IZ~6e&-KF5a5HwFYSRovGu1FjFh`>Hy
> z5}K<2iMBM#CB%P-oXUDCrSNw@|KM%x|0yh|2!l3yaPKr~k7}3qLE9XUeO)IsGURY3
> zVtfWVbi*#PgG0lb1%7gECTu>$j0V(@sV2_E0w=`3d>p!Qyb9;-IKKe%Y}~@#27j!T
> z&o4X+AMMWb4nnJTzpE}Q8TVfUzgV!tiyFkKG_zEw7ir6^kg~XqI^?7?jACeR38ABi
> zfCus_EWPV*%V9>7ywBKyT*{|r|9G2$NkX2sv*QuqkM3y3+O}xcbXRKB-4AcfO~@&L
> zKNYobfdNmuUO-|9;9E(XAj#E^SK=9l`e-qDEl3{$cZV8>a>!cmg0E&&w=9`c)oP5W
> zX#F_x14~H59>xN at Ct#I`mNg(ohWHwC=)_LVrtV^=KX1vQXK)j>86=KnK;9f at 2J|(X
> z4sG$#Ryp){y44hMKO#hT8nKQ#)Fps#3BI0yRb0H=Ey`<-1nXHJa&D^RDK=W}Vxz at Q
> z*B^@|e>8xz>XDeTSruHHTrB>h1OGo1Ps0D|E*i%b_`ioe4h)T0^oKh+);?}9CPZqU
> zk!MJ^MD&+S(<=JyumQNOCC|Jb!RAhp=V+Pq4=?g8t%`rtYVRcuU|v1$=CLtFJp2Fs
> z{K0Qxt79<VH<5aN0-9bgk2R3`8FG>B(FFlwvq=~OqY8B^{f%}icwT^%`>^^#<#36Z
> z+g$Z8L8AA5dF|`e3*#En-Y=x%{pa~z at b9f-)`lkLu5hgB5Dc%`58H at JnP<8rK&(_w
> zrzd$h%S{q at Bl7?2!P(M-+<%it!ZnM>up37B(0VkA+SeI3N8o2ruO{JYrN`J)<qR|Q
> zo$K{`Zpb9aKgF{l)<Npw4*C&as>A!sTDbJF?E=Cv95K-2v~Zx{tGJwVT(bTX8EEsN
> zlHjX2Y&%PhK3y{6J)4|zOg+m;W|+Yvu(L>!5DpFsa1Wp^qZjJJ at g3gKa8>r;TAKyB
> zew{%|^#1!gMy*^9?Eg9Y#Si3tQJ4ekZ9CxS-_uv8-}5c}blq1FNAZL{T&@ZzP~-Rp
> znobD>H-{hQmS2x272;mb`au1J#gw;dCzHt8-lz5@<1z~K_Cc&1{{Cjn15euklNf2%
> z4jXJkBabw9kofKv%mJefxJ5~>RqhV|w2#FQgnYG$JPT}yD)`r5Lpyg#+x^X)d#FG6
> zdA&dC=gN`ukGL-%c>?fPo=?Asd0uNX^;=eac7A>|=C$*3{KlM*-VL14@*^&es8wcr
> z;Nf|#mOl%11B+B;16JfyHITUs?j?rs3PLV;K_~ZLSaCjZp)u=wvyS;|QNwxu!V~Ac
> z(C<rB(L-E>n!Y8!)yYLMkHUgIz*pr&QF0aC$BV5&E(yT{zK3zvPEnzm-LK3`@0gpE
> zeIeA>(!<Ql=;I2DJ5JAwuya4i5j!c3-G=G4p)Sym5{<K{W>RPB^89SSaUb;bhi1Tc
> zR?E1hY`1R$x9}tUAH=I++`t#$rv%4vTuR3Xhm#h0XiKb at s<MaST(Ja(I&{n>yr#y|
> z2hB+gYFwJYyMLmmA2zw?jIWp#-3CT#)G=dvk1&V}T=7pjjN?VPzNBMU=ozu+N66t&
> zhuzThlraG~XR2xw?0B7Jedw8v9S+OAo%+I1d)6rBuCJDQZm!0)$URUU>zE(vm^BL5
> zc!r+F|GD5!Dr1~OzsK)G9SiZB<bnyzpHaX=GQ6aN-JhauH|%#0y+%3Ps!;QQC-#iD
> zcI1<KW2+>MmF6Q<VCYTAp7M_4gd2!pKUW0d`x$V4Y1XI}em#FC?zYN9Gr`HTvxf;C
> z1v}Cx7Jtpw9%e>D*Osl*^g6}o#(LYV=kCGQ2cNLw{ocBM`n}>-zf}0cBi3KMZ`{-0
> z?6mY^WrW{JgYvhCak|spyvd0B+T;yVhaCnfY+bcJXNe%<4rJ=_TS<vO5g9rtQ=MJA
> z!DVX8$GA{CjMYS`P$x0*bUD at tZ!cRzxgYYL`;gCmFAnki_)m#{{{DUT_a}Yavapt^
> zr)x(Y^gXJWYnvAyXwKo!Uu{SHw5EXTZo%4c%HSu_iN`+tu3)Xw)ZdKx_qs~jeI-Fy
> z0NXv;PiP5Wyrm*szoptWKzR^;2o3Npb$qUk(=rLT9KS`mEt4Ed&rOneM9k3HTg?vL
> zElbUIYR|$Yt;GwuhzFQjs6|X`#X^_X%7yN&>la=kausdRuw7<BH&2Jp&Q~gGuC~sE
> z4s`=M)JR|WxFJA*eR^gj{HY{%UWWB{A{&R=jO%6~{#mFNU>}WR1=!YMdmP*0M7BYn
> zFF`x6Psy+blN>?VyCR2f+^dM#&hI==a5}ov1}T2O<hBECwQuxWC2t&&FcY|vn(gK#
> zV{i{X?CV-wv%Lki4ZMimF&DKBM4jSu61QHoL-T`)z6SqCGv|_B?Dl}QnMx45r!KCK
> z+}7!hF?5<41(|bQiF_bQuE*?KN0481zemh@!(-p|VphKkas9ktQZ#&;(K79L*F#U&
> z<%RFn6 at 09Gw@K9N#C!rju!VEL?&9zme8w$n!0-0VXkH=VQQf*>XkC8^dGzCSX*IHF
> zJ=)@(nmQ!+U(@gX<TpvL;U(m at d;)pM;aLaQB@#z)*~eTYHgwTpJj?sQA0JWd>qY**
> znTr^=88V@|rIOVl5L-{PVU8f4CY;wYfj*@{ZCG6YEOXIZzr7`q&Xx4yU6EI_j6Su7
> z at Lj1mAHye;k67_+_(Sx-!hdO1*iiS!w+wyIU*S3Q+%G~Oi3ev3#vbnRYj+djIuve&
> ze<zdrbo~e7VriA2 at yA~wr@*z4gL<3b=J5LWwN1Y0n-k=F=Iq4vz;j9dU=|6Bw8}Y;
> zPRtrQ?`7OWN%WkE`hvAKI|ZHG^-ZNo{A?01biyj_V&58k?~}wI3i%q%>e+tLhz&=F
> zG$D at MR3|KE-$T at icue7E*QtD6$~^M^u8aX(r2^6KkD3HHuN?g%$9Ec!Jk8lxEYP#|
> zXC(uJK*nR~6g&K6?jBLsO8=j54|on<K@!Gs^55+Qa9q#iJm|MZKf!ZMBY2LczoPHB
> zi!O(OqvlK#>XBxA1kA6fm||m7 at Ja83KLEb2ci3@R>MR?YbKd8ZfiIfe3k;vCki|$&
> z#@r3jrNTx&YBNA?2Ga*NDts-N3&duD9 at MIRMji17{+A;+VafSfkVBJ{c4my`(@=Fc
> z-9z;bkZWR3wi=(At!lTcXPZ`1s=7;l*#F{eb1bF$vxk~pjcrJe3w=QI9e7(%U*pl8
> zqsRfMHznRN?xCc!H&IcxEa($ml-ee#4A$>S^t)7w9GmncQAhhNQOB)6L>>0)BK at fz
> zX{e@$a+-Z%05<!?xVns%-c0Hh{9fnuX6#s8Kh_qK(T;r$^nrJ7g8ync>bd`ldNuW$
> zwV~=xy2puq-on_EO8VOx{Ub`P)Lr=<^%q4Q-5LQ|7dz+l028S>LpX%Ees=E4>WCQK
> zDTdzcAXW3u+C>+&&&=+EjoGmm7~nebu(<k_&)QJ?sq;0wUt#Pot7*kS<T>arCvE-d
> zgMZmYn>luFXnc=T$Brb?<2{skC at 1(1xa7{pA^z9<dTR6suv1a{psuTw65w3|^fxt9
> z{Qxc1ue<K2-yAP3j5E3Dmto(HTh97F<E3-$;`i6pi~mfilHT?@B>rgq5wTl$eZ~QO
> z_iDewZj+1C<qLKC$A38Mv*l85k(i6~oJtOf`JG3^<8IVvtp2brR&67BN)>q5K+S-X
> zX4Vwy-kHC7!QBs)x=ZhO3}{4gIon@)Jiq{-plM>CbHQJAb at U=qj}vq5$_~^r`8_Tt
> z)FF;$-+yvv1ZstuVp~GL?QocPy5o&`-*zmV_dVpG`GTXvGqBT4_)Tm)vo;I)nxw{e
> z5bQDdhpAxvAB_J4u|-{4DgfI+91B<#X4jH?724xn at SXlzcTO!<9U%7=54$ng?~^;{
> zv-iCK+rB{mnMSRoJ5vjFvGY4_GWb5Ru{LmHcZQQXESm3}qta1Z47f!F!+j~FU?n(2
> zfMv(Lj|4X`U9ghi+2NlMbffN0YsrZ5WnufHu%>WRTOhYI9&>LZR{^nE!Gpb8Gi@>n
> zPS=hYPk3r`4j53|CBi2MxG!%at3K~xYs(P-Ol$3k7sz?2pE}Z!JvRMYTk1YPtR14O
> zsOyE}<H<Rk82FB=tuj`g9U$_3zYlUrkoy<^OWQuLJ0#X7$wkfN_6_juukpwJR(5{_
> z*)M494N5-<e38H7wyf`g at gEP2e-1}5$W?jc#L5|8f4N|UzSm0x-)@QU80P;}!!-OZ
> z5*FaMk0AuVj|t1jeko)f!CW#~!fO04MXg<$F&5JEP!|>dJ9i^L30t{T^tf7EP2z77
> zk6cg3qV%Y|Q{WENXtGry5kaN{p`yn$FjRGaQ6Jf%cU1H(GE)!V6q;NEzE-!mgWtcg
> z=R^fKD^g{=R}J9C!+diAelEQr3G4Bw#H;AfFB(TB9l-WWjf=`#<Din_|C2XVZRI`7
> z^*I}4iGLA&&Z>aVN^RRBPR at XTFYn$?5%dObC#|kMogH~F(c1Dk=TkBFmR0O at XKqGr
> z=MKh_PrJqw{JC)RP)zq}%og9jea?fN{fgP}S)*oDQ(azCtSBP2sn&c6c;j)5+PsXq
> zW{#uIL|eOO_ at W**XnFaOwTPi(E$F`0hq!TcurFfmO(!ZsqQ!WpwWxn>Z;~bMu8?6I
> zIPhv)LJ(U=Okm?ZwBf_6Ch_c+5YA<?Zxbh<E+p}CSt2m_k+oTKNxRoaG|3zs%Kc$~
> zIrx|m1K&xWjeIBTE1Z>QUc~i5N#F?ArL}~>HzrwB+XA25tygi6bUfS0MYVE~m_|JO
> zG}gN^;5Ht1Z<tXDUf8uQkx$q7uI?+u_R6OVNUWWVO9wokjCVkL?X53>BdFC5C(rW3
> z2Jpz1G`-IG5%~>e%%;LpyZ?+bJNQ*cI7IGiw04$IBUi|?l#%}e{$UUsw+j3m6%xB#
> zBq7gG-_7H}AAhn5JoA<3M+tW}Nr5d84#xTuj^@+(xc`6)>T`2(?$dbx?I^iOMo%%Y
> z@&5XM$NRh2$VCdWpTzs?VY>|B18yIdi$chL#QX32FmfDw8MuZJhal3=QM<_cID9j5
> zp)Gdkg7ZEj at 3KPNIx;$>T*5Qq`Sx3(Yk3Vr{6D~XIo8hx``CpK?JDFS)9|G}K<qyO
> zYxQQVha!@P<PBZrLJZ;Eg#IBzZP6ckmQOi~Sa+G-9UQNtV4I3;>12*qfDet}4h3h(
> zn17*~tkFHo$?pj%Bv#~KOZ+3szH~9LEEd&oyR9X_9&;7~6I`Vb=?OO2qP<a4D)vMC
> zUhKA)#LKrl?<|9Er=vzH<x>9l)!k-rDs2Q--5Gg!4h~ZI6rqQzeuIy=P&3^Ij#&Cs
> zvQ)Vo*x6EQW5h1j&xQ8344YgFT~N1W41Bx59c&qcXLV8aZ+YF>mDL^5zBkuaFZKMs
> z8tVxo7iAoQt+X?%-q{tpe0&9bEp`$+;0}Mx^gHG<QK-=_hOg=w_(Cb at +%x%KAz!0Q
> zTY$KNyexcTqp;dzuHNb~yVrv2{Smi3g%~E{iog6T{UF-XDeFDB*K6ISwg%{w)-0v7
> zEBXdlP1WW;@ZSlVU!2OIHV(51_QPYuAKbvREGpTM+wWLI;tHAf5cBz6SY~?;`H%|4
> zftp`j8m^DKXb^HHilgjS*1m~g?VBjlj-YvBIB-hf=u>UnZFPSW{oGFZ<-xy%t=yqM
> zFiKyGxmVUALj7NX;|#v&kGRz9D%i_Pd+M*M8u+W})Mu15<F0zR3mBoCjm|EJ at w9+H
> zR&#C)YQPRe)}-2PXPMD-%SHv;*SV<`q_2T%3W?mB3Jzq2XD^*PMG0(C<W;tfNoYgz
> zvSN4bE3(v_yqb^R1OM#{?%?`-xxub>pR`kqbp|?L=4VQ>o}p$Y?khlj4R9%ePgHg;
> z!aaa}kC4Il5QlWuGhUH2 at -R*N^Ud_9x80kvEO at _J7-La31AA`J&^rrNH7#Sx!uFgU
> z-0qz`^sa9!txw)j_a~l at A~ug|c^`#${4laAH4eD4 at wQgH=Pwv%z&pSO*%+}E<IE%u
> zA^X9t1|B?&|2<}fFuZk)QZsl=g`Cy0uw8lNKDh4%{67h`*c_A=+^?7Phwd2k>L>j%
> z?P-7LNe=y952CldaAc@&3hYmDC(oP&w{!#Z5OqaszyaRuw7dmt?4Aa2^5Q<JZm-ns
> zkdS(?6MOB7Cs>tdE~eLzT;A{6t^V-I2U4dBz#Z2$CgQF@^v!t|hehnuH=t99Bst;J
> z)mxdqhzB^<=`AICM^~wL-0!qUEd0h36jki}A+cmpm(?|3<;9_R*ZEyyl@#$`g8S~W
> zkAX}<&E(w%P8aO5v#nwh1Aq=9y10JSH_`M(x{MYf_m2qy4se#_dZP&O3U7ijKwYBY
> z<0{x#rhn~%<g9UsWp+mI^GmCh(}=Tug&e4_l-9wTTBI)c5mz>j9$Xf_xL}<I at 3yW3
> zd{dhRz&O8G`-bLM$8y6<giGe>{}zKU**~tHzbq%eS3bOA|4V~<Mo+*~J>$TlgcCh}
> z<nLv6J%6qd{lfGuaZbbd+$F=l#tSD6e9k!Z^AX6p at WlzL<$}iVUK{F*;oVJaUmzBK
> zas7ym(LY^G=By|lKgzPt-(ga*ivz!SvV%O&o#0<zdf(v8nOr=T^J=kzGc#{GyYE$l
> zH);E&xlJO6%yV4ii85_J+Nw!i*q7Age)H5q6V_yzK_2~6EAk?GmXp3^F%`6x at YL^N
> z;~UQsnS6gYaF~Jdqu5x>7GmqWE+kkGVB%}DoXWy>^egEsCG7Bv)ti!s{X0It^t0%_
> zgRyz6F^%6uAby{%J-R3lHXP)Cc2(0Ba!<s$LM1vp%PO+gE(yXo>L3^)c6?zBok}J5
> zf=zh30QcH{-WgaSU|*aE`}{A<ll;w=!nlAd`S9(2YzTnQ_;<Dj`&vT?e&1zluqO^;
> z5y(14);#Wq$bYDK><SP$>EndxAJE4$i`~$VE_jAlU6CUd{eyNfkKi+31m@`|Yab(@
> zx#^uqS8buf&?E|lj?6V;|JP|UvftKDZQ{R8bk^<rgv1B_QPYn~g29)kt8owY650+t
> zP}<tE at OMpYpMV!Nq|1tU(@_=lpOw(n#D%ojpGWNGLxSe;il(>Cy3vlqAAtYsq}@qh
> zdN;tR8(_R|c#Br+ke~KrcMRf2uSM6L;i4bICAy}?oF9?f9JW24aLr&oYuI;bfKP+g
> zEU=}b55wOMR_RVIo?((Y&#(6OQq_YmiZKMtvB}+RH1LzDB_XhZ2#&+E8};K=53SP3
> zN44GbG%93yLq`#<+b;E~uIPn~>1EgQjBa1tZ<ug5iD}`T*MX~%rtS^m#tbiVP&X=|
> z3VJfh(WoJOeg-~mDi=VPX5-kLZEXI}h*TY$$5V|w9$ymM#u!Xz$KWu7AAUbzf3GKa
> z(~OgtKcc)D;37pX1oHEp$Q(hgxixZQ*4UDE<W<7gRnl(dME at lBvC$WkgSJB7E5UdA
> zmd!`!NB at iHDcap7?cxB396{rmv53E#O!#g)SCxgob%`AJ`uvIR3mq$WXkPxztdR6#
> z-Rsc~zhBRg`U>8{V);zO%A<IO#&`3xDbbwXk{Q4<Zu0qx+z)a6<J#}Arg+1D;f3e%
> zG?V8kC(l(RgzhNE_gO%4-^rMC5`e=FIq2-zH&=kaETfLqOH1L`3D_k at 9SSS>5jPQj
> zEvHu0ulf&+N^3rRZZtC)xPSOHhz$q5{Ev#soUWFG7}r4<BY$A*?hdZkwkgU7ePD^;
> zM7wMve#Q}Nm33*3l51qX5xdUlh4;INZyaUYRj at WG{`OwhKXrlh0p9I9aO>qjXADdI
> z8F|6DkJS&cBBC#^bw$l((hlYt at b$nl#t0fuZ-H!GdxrZ&M?AA(NJrcV9kH=zxhG;6
> zA6Q^Bm4!#FKP6}sd`#v=*^U307YoR|h>(+<7g+|u)g9cG>yNqwzJpjebrX0hPZ~=%
> zi?D4;L_LZwGwh~T);^Kp{qGAKQXiczd1iEBd!qjgYnoGU5j6_f|50 at 5n!qW at XAss%
> zMYYvdsVm7Jw<4ah#T)XP_+>?_um-#E8|?07wEP%ZvnTiy-D+nJY*jgT33+$h5~U`5
> zaok0`>pu&)HZIzAg`W_5{;^VnCp|qS*!?E>3wPW;5nGQq8LOM^{)4pj%3ZAzb5}vT
> zuE99mwgB_D5<Cqp!y8Dy?R(K&H2T8u+<oqmkU72O=zrE%$6kZ^zHK$mKY?{z4nMBU
> z{n+gj?6;;p@@xdBP^(o!Ur!bmdWdbuaqZW{&u8FA>g3YJwHZOa^&STwR6p5|anVkV
> zSQR$Z#&R=k>_}kO)B?ICMGoC)uD;%G$G)F@^;iRFVEa?G>kBhknKAYTqg8g=nN8sA
> z-jwhpm*?xO5E2_-l5zV4|10v$z!3}4fAa@*=~ZDwkM0ge{?<kw>e61TC3w<pAwpot
> zZ0mp at vl5xQ4V(<NB|OZ1KjdeTzQ+8p3%|;8f_&J<%7@{sKf;fbjWuQn#}GYyXzu<K
> zdHdiJBQe|$4%+eEJ}ZLkVAofr6?pOhLF4!D3L5=<te$1zCr<Fn|0a)X!UN+j+FdwV
> zf at byOlaX|$aWdkJ_u%VYWUkx(^6&=8=T at wdquDhw4ZhV-;(I2XWB4ws%fh}K3t2S}
> z-{c>V(V|G#rg!nJfu%^d3K{Kg1(6l(HzE5gTJRkgv9dMw-~Hl?+y|Whs&GH)lct}9
> z2h!y9^;jO{M+DX$a@`f^zVc|gMMT$80oXr>;AEqJ!WxG6bG~bs`fqui9wju9dk!A=
> z9d7s&eaQpHH!yxZ`wkDtI`7<P$JpBY4OypQgJCV{8pEqXP1#TH_d(7~>7bPoaBqlI
> zMXbzFM$~Cvfz0>`J|YDde&Vyf9)jDzV3&m_Oz^EWNJ-3(=x9n(f19kqOG$1_3i at HI
> z0=f9G=~j}plD!v+X|7Zc-iy<v5!v*iqDL$Sm2i9#`|5E!co^@+YcSquYVzQ-5G*5b
> zj2p8wcut?bPqoVUjkvZTbgtd3Ro-u*NbPI!;N0l;@jVm~lye0<$oqPhcjmySUTM2*
> z8=%&(d4ow2FYir9>?YYe+4hgSHS4W6WQlhoUe37{F*@h&Z<ETxemjG9ZsMBTM0UUM
> zGsYfW;!m576W{;GG;Ji?cZI0QdDe(O*u`hfsFCys`~f=GHzp#sA-SB at Ul#tRz>Q1Z
> zXF$X0Vs(%gA*)|t*KMo|oG$o;ADU;7?@V+OR+dlBn}U1)$?6|PWNvJoE8I at xM9aZ^
> znh`1XvU1^-)3qP`#@mk=#eKsIWKHH=g-!lgdqQy{{GGUqW^zwrZ;P(kajjng7kW2$
> z;p42c%44ZzoUXyOGsHTmi?e;^>apf}4dLo2hAjj62>t|&)t`ZN23AL_j2N)<u=Y8)
> ze<x^u{yD9Z#2zB*(#A`2BWAP=$2c+fh_SW{$v4J$LyZE0p~5&=(TjMnSoD}+uiLds
> z;6Ej>qvR2Fn)$YJYKLtngSBwG419xRO*|bVzy2z6ZxVRdAe-xfpQ-{MkQsJHwcK*;
> z6 at y>CT=Oe<qb*(Apo_>6r>MFf+Ib0_IXx9G<M%%#J=UpZ;fr$g->(#H4(E$isU8)V
> zO8KXqeW#y`N#7R$-fN=Yi(PEfzwOG{KTBADSTxQcmR*3a@;5Ku*)GFA$%g~L_*E6W
> zulfROG2x(r{(kPCSL)es_-dXX>K+T(c9!x*Ir)a)@c&3*IB-EUY>owX at SyEki8<Ez
> z{YR)bc(iMzxpceZ at O}GJpx3_8 at Y>z?Ig_-D2rtPWz4nil-S#?VZusj;HfGo;!FV6x
> zYApahpZZIfEof|91DR=R at I%^vvn#JcE<6Ak at sU=wqJik8X=Hxg7Ur|tNTDA6ea{M=
> zZI|N;I!!9cX_S(2g|_}2(%Jq)-%3kX0w*wmowMw-2SCnz4LhUp`)^_ErSd(wdvo0!
> zw*hPa`IK`Xm1=W2KNkcSb~uOh<TXnE{hZeE?DO>+Tn5K^9-b at Xl+dDWQhbFN&8ybQ
> ze|z3JLeyn+ngbmmY<JuL{+xEy>dHiYdN%(6=Vk6h?5FYjFaAe=Y6koB&b}x8navE}
> zSn|iHpzOQ_v$Kg^!RqeluSCO(W#KEv0tcs<vOf*udP~cbeta?)2 at c(5k6}95x~3SW
> zkgdDe;O+L%3SDWpnLQ7f=qGdaZ+%MU8m+8^-=#C%l0=hy2hx|s9?Xm<w!oQ>|GO{a
> zuMG8Nt at G0V>Py_)&FO#i<+`VRdHe5unRc1&%ir0)9QD8VC3)XW at DUB=a)kSTi)RvD
> zIx1-X6}&lvI6vkhViKPsPO&C7H`fVrJEY+_BQY*un)9Y3x7Nx$;7k{vQ(5EBsMZ5R
> zatrZ>N`kFly{ps8V(VowBwvgU{T4XHKz5%tesEv->VxEd9V_hMeWpHzZ%%l<jGBU+
> zI2k7u*cqA%A-Ue22DONAq_Dg>Wc_%VVAWvL9wJ+-XT;g858*T49dWvGPsF#4nGxSN
> zeg^%_k at GEL6RkL}0nbB+?!>o}O70ADcEr$#Z`)y?dSQ(Frg+&35aYckeiod#c!%!G
> z`pgY7)JSl6s)tL&&;7yjju5}(4lDHESJ)WYkHp6Tf5!s&Im)Jg7gM)iUVNJ>!gp_{
> zZ4_AxfYa27N^UXl;&+|zf$(=IALxDifkA at 3lXx8V+<C;?8~SUadv2fLY-_rM{A|`n
> z;!2vg65VMEs|TglIB+#;+tHzT at m1*K_H^seoFaNslrLfnAE+^}AP>g>VrYVmP62-?
> zwxy;{CTlo!IX^Ns=k#h- at EJ@Megz*0O>HWqHU7TyT7_+uZUNv{7 at 6SkZ~bFcn0VQB
> z;wJ<KVx<UeAHv*eBJu;<lWDMv)2+UcEn_LN9_{_<iLSvb#T at w@$E=uR39N1SU{KB=
> zkGA5m9R414jJ*|n{r8HI>p0g2d=p2fh~kC;w-LU2tNGF=-=OxuYuxz^cbo<CzM(?0
> z=8*Wk%?($#!>4gI at h`+ at W5U0rR+79*^yy0YCXd5!`rf$^tXWqVeulLz2E3f$Bd|Te
> zi>rVaKWgh7#ESzTx02{1iebGpFvI5lTH>G3R>4PMYT6<!>#tpwu9#q>Gjf-Y`g%la
> z4y9N=#$)Ce^}RBTNeS{KjVl6x;fAh-bu9{UpM$n~-1FxGF7hE^S1k#;K8~6^$wE2X
> zc45pW5Z(2y^?28 at wo0-O?`-bAuHSQ~PTzN}E^*b6zA6(ZpCNTPe5sHUA4-;HQn%;R
> zhY=GXYe<FEAqUuvuzfP(dx0HD;#Qb{u=~~%J at Ly(R*%|<8agHqPkpUa#4{JHgMU@*
> zzSkqF)9ewY2hUe;Enj+&9^79>zu{IE7WO&au0dQ)ECUYHi?afKNifdH#q6!|SOR}L
> zv6;c=1{|@~BdQsk_?*$C at 9faIa4!pA#MKn6E2H1PMB_Z<y^wbP=egjD%Q=O*sI^|t
> zs5Vx}BDMl&ZR##Up3baAR|TTS-?XTZZ at 46)0saCLe1wM?1=(LZ7W)qycyv26gKkfp
> zMt4xi<05uG<r7VxQ%Q6!Dw^INfM=f>P4Bi!bmw at HTkWEk>PW1ReJAh*LnnOC5Q6`|
> zQPS|!ZWlB*-+|3do~dcj*G=+pRmj6EX#h^|9^SW9ER3cLP%m+Z7<O9Y&yNf#=oe3Y
> zWz%Zfv^J#GIIl{1z#wC{hXjp%n+(sh&s8cOJeFfP8+`-oGq~@vSHPEmHR|W(L=L^b
> z7GnTB8m-T)gC6knHM=M}&fq=h8;+IHrAvUr!95 at 1S$5!iAs4n2_9Dq8ETaQFon0bc
> z&feepVd8Ou*U8wtup4;*2avO3pac<rw3dQH4tUHZA#?+Ucyx-Qfo9bCCn)&q-9;+9
> ze3p$?j0HCgPhF|-{5_2Cxn_Ar5ag_-t+FdHkJbcpzRd8!Z}<%EUtn#kx8P5(gY#`C
> znJ2B_!B0f{;*k6S;LIDua?A_ltRqKiI`EEm@!T;cf{m4Xg5!GrM at 5=ql?8QEwt=I9
> z#&!qOhn%Zf4na+*+bN!aeu%O`NB*fAxk~loxC>P`7~>`Iz}I;nR#hT*2{^M7H?gb&
> z{7JaxU>UvSA at 4*ZF9kK2Rl07`im8FwdaEzXB^2#pKs at EOOXR$~%JkqBIob(&D<jF%
> zC4Z|oY?hFG0;fvFwBN(D#ZJaXZr%~(lNmNioGSlmiIxFFwx!EUX|MEG4n(+RPc-;-
> z+`J3SMWRTGbPwbOG@(ztT1!T)A-)ahqph6qf}}Z&wga4v3=eUL^=0l$RnviGE)+*S
> zw$>_)-OS{f;P7j$9kriEZB-vD$s-2V?GmLf3!m at Pxr5^Cy)}Ney1wGJBjMrtvxfxw
> zOG^anAB&f5Dne|@*sV&v^odA+X`}4Afw`U6GUr?U*~b$6z6nmmd}C>UGxuY$(@&<w
> zKK;_}V(y3KveP93hZ$zA<M4)k(uT8F;A8Esmgo%7IZwnv_RGmW;Fsrbro$uDrQwU!
> z at C8L!6g=lj^vOeo=-L9YsHp*YQKpQ|c@>{DV=QdSt0#GPD<pdFc3Ioht{`GNtA6vq
> z*wcnZ^m;sJt416}m+*tx at bUAi`WwUCA3)DZx2vJIzvC=t$IPlc-6zd7jk#z_6qs{9
> zIp}l)-%oA`!S9RgZ_Oa5kh;9J5SX=K&a8}&+KzPvfrm#()67g at 2dsoAu^Twm-YSD1
> z>|6nO0*O2#at3^Vm<#n8$nogn6F)E3JSUs^N#0)gD{7)sf(x?MIBH^qv^5!+TyXm^
> zmW5J+2U_fw?NU3{nYMtJC&DM&1^U?M*{}_}_<H)3M}8jF?Bp-^;?m&LZXn!9UHme7
> z_WVKqsqlBy2CXCBO9&q9*nA!LHAyeNbG<>1?@aQ^#ce-!LBGO$H?;OlGo*_oH<>=1
> zHyhk3%it%FIm{O{zrD49_-Qn3o8VyMAon5S4x3le&iY=)!S`a+I{H?V^X1%Yv$fCg
> zEG=9-%VePuT(k94lEI<#sk*QrmiX$nf79J0K|T}bhx38XuFx&$iyua|w^FkDi*Z3#
> zJJp&!Dk~DXMe1tEfeI4yXL&myj~Ql8GV?L9YX#-Gm&X+gMBgW)KM)fI7effaJvW?X
> z#F+2MFDJR=+79HEOyTT8EkVe2-%@ihYF~sTTFG(5BY|=FDigmOx`VjM1_iE{a+cb;
> zy`}2y at Vz-2eW+kP|Ga>+6h7pNtU6^j6IHkewx6Nz#EkkW5c<@PE+6o|o1_M3lgFEv
> zi_#toA<MePSp$_;%G-vVhu2=V`f-+$<FPxs#v#9npN{tIZVuw7ZI#Waml~Ft<Ws<b
> zK1<mkE%Gph>(!N*11Icm9KtmT9^Oeeaxb?U-&*BZ-*ZQ3=^aRz3J$fjP)|E*Gk26K
> zg*FT2;7TxU%Q3$Es3l!K;j7i<%u;2o^m*G^zBtCa!=CUb`l|BS^ZHC098EQ^gw|MP
> z4YZZaIT7B4-!;x6g&gv;4XDjtdETCF^o<Gmnbni^276HAU5l5#G|(^c9<bAu-k#UO
> zEdDlwddm!x-L3G5W_~Jc!rlRO9?_v7i-HMmKT_BJ$Vf9%mJjtIyDrSSZ=eEFOOu<8
> zb->(KVs4)#@=hu;n^^3cD6a==#a_zanA6`34F2i)f%`)`Pf!#mo#fdP%tDF`<1?Q4
> zuyBvft=dr&|6y!#BJD=};f)$j?w+f{GJ+QtlXZc)7*W&0z3xqgJb8|<voWTQ!{=7n
> zI;Qgo!w2TjPh~YBS4F{dBG1yP7~3TmKfAgkqZhRj<b``m1wu3W#+&#Tq|f?Si9N5l
> zXY{55Gi+>yjGGEMRSCUnNdeclCJW~<U&fI<kqKnpZ3>Xw5kFr-@=ol)#DCk}TNXa&
> zL&zw|=<q^yrMAP^dJ5}<dVA8R7I26W?A_g)9qm^{4jI~a!4nycvG-<oan=a;!{8Mw
> zq7*y}^ksWbfY8crXGP}NH%K1ae-!2+hs(zzyWT?G6qe>*21iCPIDNUmx;e3&zB;s>
> z15V#F8^sP8g606f3hBqM-fmKvBW7e at 0Z(sOslhiZ>)P-``vSndfN$q5Qq|{*(?XZJ
> zVIKPmbMPF{tMsLd1jf=+qE!AV(eTycqJLN;W}LaQUmBNWkb|>Ck9g$h4qc}t&eTg`
> zE9}rcl*A2$a#x$lm`?A5uh^L`jh%!TK7+b6V(9$}RW$fYNKMkP?F;B%61`Zv1 at -)(
> zdxfySjp>J2-KAwTi~DnmO+Q4|xwgsB1CDkDwl#L4e%Poi<kAJItF!zUp1`)^yqB?*
> znLNV){br&y2)-K;as>=H-^&$t)%EwV{}y<N4uuE4pQLs3H6#C}a&S#1`UU(!kM6gS
> zysFh#h&~Pd#gJ&#o+LJ&jZbuXlJ9m>kpKDiW~aE5<%FBJt-LGPNeX!m?9Tll=!g}q
> z4u$k;f8QF|7?&eLF8JY3K=e}F&qDl8+M`1FaMcFrl=YBz2I$GG4|&uC;N at hh0YS6>
> zG;o~l>k7^<z<q8Iy{JO?1f#7!PHe<fe<GLhUVN+>QX>C-E%0N7E59CG1DHMz^t`UB
> z0wu=T))`h-zHP;`IwF7I6YMJ~r0>oL=bL924?c4PHMWZ{6|XyMR|CgTG_Svj at 0x>S
> z{!M)4VP>gHaenh4K1N;-A6 at gLPvM(g)gxBg!H>QQK03sJ*1G{OeIN_mJ at D1W!tSDF
> zYn<iQ1k6Y1SL>$1mUfKMrOdY#mQQq`@N8ce5ML?suGFra0|jeh>;=k^hoO7*?g!r!
> zvl(@M6{^2F*VHaRp0AZJ>WuD89-h4q^=Ma$*ITE5du7l5K;*2>eVVgct5{z7JAc{L
> z-v?9);o|4RtZY6US^wTbK6i2p>=$RvpnO2w at t{g0XuP+!k4tLL)y{kPno7P;mT0Vy
> z#EOaC3l7i9?j+p%wQ)u^ciCx8sMxE!A>+uR!}llk_%M?f{xiL=a}T&LP3#&QgLoJ_
> zJ_r|(>tm9`#He{?1)oIJfCsn~_IVxCUlz8Y8aSrLN2tjSo<{hhy^4VmA~~}YI%#Ga
> za{fiCyubaAyjk+UGmZKcWG%C{IwCg|wgd7w-zfJSeto~J?bzru&hp-s!*AHdsG}%>
> zEM{{*o#oo`k_T3~jZXQ2rq%FwKh6JC+A`IbPXE6BN`NVX!(CMnPuAy*FAF|~ZZsMC
> z^rwkpR(DyKXe9X#T{FqNL!SC8k_WJ_XZLY|DGcEpKz!_2fm2={B{D<r(-&zZ(Cq{A
> za at 7`KS*AARXhcqb0$XK58JL{y5oDh^CuwkB75IttSziEG!Q<>g-VE_2gugnX^9aQ!
> zHm1$`kUTT^n$+8P2I_Rz=>6<()ZXFZxPUzlz9iKCMqOmsvCjSVD}dYVrTfxW5YF-8
> z_!f0LtgZRbt^CgM@~be9O3num9fIrK!Xum}F6rr3=+{#)hddJfvc8|5h8(Fvk{=b1
> zEq?EpI_azMdq4S&{SD-IRu#T^!2L{S8hrGD$f24pxv$~cj5wB`)erf>gG|~-Fo at Z&
> zSSO+FX~@5z%$dl)n9`cK at G{ooqsYH_g#3$X$iLtr|Dvnlt9;{jn^QhyK|z-P{W{8y
> zu`rqBOp~}Nu*Z(bA%4cEhS)2WA;_ITz90ELWHS|L!!YKAkO9*;&8?qcI~}|O;?4o)
> zrAU{;Kx|*0^H-rCwy(_TEtGeHb8gOq<1!`cD`&q19|Peu$6WaSIPRZcpuA2~sB022
> z+F6c!=sbpXtv5U-`YYt20Po&cxTnb<+;QahorXPD(S2-vYO<<qIqDK`3quL5;3lZG
> zQ;_R91T*)I$Py^Ik9BIJ#Sb}~utn at nPR0r;?3R6aRuAA-p@#w^zKc at FY^1m`3VNc=
> z-e>Uo9RF`Np(b%(JM at rAMgw&LIVL<dmo2w4h~%)DGnv^7rxbh=`6wRWpmin2Q?SH?
> zd_(?NRm=IWB==iVfC&tUxCWV7j(OAp+uE<s$=GsA<nS}oX9HJl(qivDJlZnhy==xE
> zve8*`Cu=u!zL3O8$itNjM1|$hgR`?9aXPg(dB=kdwi2;xG~!6pE9`3Jmqa!SL|@Gz
> zx-#VD2GkJyd}!b6{O4^<i?iO^E>Aj!F*&A1igw^vY4YQAX4dxF)yE<q(VH>G4XE2N
> zw(~5-kC{evHp?i|7INf?>^Ashq3^tWQEw6Ld$IeN88y%k`4t4a)6DG{y7x%d#tMnp
> zMTywlx#LYDiLOGy`2qEnIX&VYn%S`;hj7=02d*t6akYD1$Y}-EQ2ix|yA)nDJjVfV
> z$K at lGxQh?{P6wU0PMwE(;6=QHkUKQxN7Ko`2E>ZVvpJ+_W5`+&`j9-^g-vbc_q>R0
> zzP8K|<W&yciEj at fbxlYcJWJEs6?u>!Ik4>{+IJH9wF2sy+~jd5_|DvU*cw~G2dweu
> zo$#33S>-Xey9PYC)?Oj-fx!7ehoKX1cC at S(!M2j%{-T&+9<whS&=<7Y;9ISA<e3o@
> z{Soh7>LIve0asN+TE}u7YPuXQnDk10g;3H3-5bx#iM7g*yUlfYJh(1$4p?L)$46LA
> ze5bufQSS(HZHHKLD_(A^%sRU`gkTDOA2%f97ps0oT_MzjCBBE8(^@yPoca8npS~8o
> zz3+R}z+w7~E(}kStB^F)8KVpN*MSZ8a`C-xSvTy_{&?ictku_B{SuE?@QrS#L>qcN
> z4qmrzog{47>NM2;+p1p+K88QGf%8K*>gV>ADy*?ZF?>UiEwj&{e8^Y}2ky?db*oED
> zZi$PPsHYagw{ywbN#tgJ=1;`m@{UW+eX>4^Y&o&wu2Gs4n*p}hkJN`<qwE5ww=~JN
> z9|~f@$LUVSj?*`d0{9JJM}3VtNp>e-*%JznWco|GYWXutvmPn4wJ}N^U)1G&Ve`;4
> zzDu6*gU=1mV-3MG{Y__(uz5NH3GzL<#?(lAb<jI1!G%|AcUE;UHD$E;&9d;>z3|~&
> zWqmlR!Mx|w54~LUJC+Fad)n*PwZh+c6VLkt(;%@AOmG<}Q1-g2t0i6WMYfs;&koDo
> z$BucIIE*7J!Ma0_D3i{Arn)*fx&yeH3gYig_Y|6-htr89FX9OP7CUPoqYZWoZ~%_5
> zS038-sB2&^QC%Bp3U-gdD=l55uFkC)SLv=+S@}y3&d=>1SLNaPwaG)>QtRQ_Vf9G(
> zZ9m5J=5pkCtJ at RrTU@~1c at A>WX;2<j`9mIw-OVSbK^_LII2zBll^X(yj9Ml8`mlpv
> zfAf3!@z2_fjXc;a!IJyzyn6`0D2q!0j!*_p&rekEv2yYwV;K{iZ?BrHf2;{gI7EMf
> zabAPG`}MGs#GSd+i=7SB<YFr|9lk2?9XB0T(oK4E2laVkvDIV6u^y)tQwMpqqmQ9p
> zJz}KrtxZ=S)@BL|S~dwIrQ#daRs}fG!Qb5F?oet7Dy+lYJ1TYRhAlr`_vC!|L#)s}
> z4>yWPKK;^Tr`(3dz}&=FNqz4$h0x4Mgr>ipZ!-J<I|uv++A!5}3gfeHQsK>Te`N|o
> zA at 6!V)`+9>Qp6UfFLrDGJbM%BN|xAkeN1sKWyab)fU$2xt&$4p1R*#^W2{_b$I43W
> z0+PGcIS#g)1?M+V;7DSE^y(#o4e1p!hZ5-BH5%}nRJ`a=Qt<+CsuPq<>QA)kqaf66
> z at a&>;T^-AjXH=>laDOfBp8FC*067OSzZUj5-~OnOzB1o^0dV++RNs92b`jUu?e3me
> zpvE&bLFUL~DDYky?2m{{Cdb+HS2yw{cc`&36uv`&##?3VZ%#bCJxJe>BD3`|WA(d}
> zWZaq||HseWSM-lp$iVa9jdw7lGE8$JXXSj%V|mO>U{7vQQzSQUN3*_?U&I_++4ff?
> zsDo$QES=?8T at d4A6wmSk*8;FaF~%KKaJ~*UdQMUhWNExZirvk<+1uMzDHqKw6r(04
> ze7i+M_Nl?+;MZn%a1nZlFqRKuEDL@!u{P^2)@F5tE+50<EIO5TZ;ma at d!s50ydQ at I
> zqE;cn)S&MnBUedJ`72GSA^IJZ7yLMa_w=mZ8@(#5;A66GTr-I`dR5&HR#M1;ueaYH
> z?AQM08NY#R#Mc<3d}#1HoxS7*`oJau;fr9Od6yx<rc)PrS9&|F3abgget%Z3WJ|@$
> zv-UfXAt!_bVi~Wh+n09&_Q03+jreAZ5UWR?Me0n9Ti7sz@(KOwQcQ1u<Wqz1J$-1s
> zoL&$^*6vkd<h>xvh)pxIzZto53guz)o_NQjLo(-I;H2!e4+yI~-n?Tfh{2q*$HCW&
> zIE4s#$$X4YJM1LSE_JT+xLWPoojPg~=i7owz#Cj7>%p1x;Pt%2v;waLZu}Il!b>ms
> z7k5x}G>yDPx%SYY4q at jG+E@6lKjQnm2LHh#?`+l3cRObU&qZBuwhjDt at NX$3IjED^
> zMsoO<lbBt3YCQvgWhD7sL!SyI+c~r;jBLa7N5p=KGi#mMZ&9I{r81zNtFF)B at P$;`
> zR*kh{Ix~dH&v=%G-xJroi#&c#XEDP!UP^B6yv4+?Q^!ZCem5*3`%ss3Yz$w at SDlUJ
> z#>^CZl at OkfLUka=MH<(JI*(nN;*jXwc(>=%M8Y1abZ>Qq#HY3i`CUyGWwl`p&Rf=2
> z?F)Z-Y*d#995uVOhgf}Pj at S#FA?s#T_O=gSvOfU)6tDPH5qaRjy;e)Uk6nO1m$A?A
> zkbMT+FY8CV%TaS_Uy=NTT|G}|2u3{ZHwkd3ToHL!=r|6nj<XZ;{#D3(qEmXt$Sso)
> z58|@6%Ps9Y at W;4xW-@~7Iwphg-FurV6@|B6@}FsqQ>#W81nXDcl#L46kJ=G&T-6Be
> zJJ9C|Zv=di8nw-k>w+8&M_Y%wW*qQ9->7pZDLYWp^S3?=xX{~U9*f7`IML_SyI0-r
> zY1M?-3<fFZvw}}LQB#j at Pf4bKN$`t(Z~A+xy6MCZnT{NbHy at b0LTkGjaV_fHDL3Xh
> z2^$)?tNa at I5k@>a2l4qj2Ka{U`51Siu8r22;BR^XnB8ZF<=Q2Vh at W+4Q+%=>IrYc#
> zyP}{QX_x?g(IG$8L*^}DD$e12H`QOj2iQ at gZ<FChekRqNcMJMd_Z^4W9MlRg-7e_1
> zQ(~v6(C6Z4!#StPL-n9`hJsrjc*Z>i;90lKa;7_KlnU?_G}x`78?RWg_FYisdW;=g
> ze|@PfXLK{3 at h1FqV%P~$u;Y`ETag at -)A5hc4DpVuR!WXM<@LN8%^KUY3bCTSM;M#|
> zE at p$=%T}+6v-R<%UB$)E+H#qo>0h*JNzQ#zPav0fxcxxML90vXwvH|4;_csX{zRPX
> z*!7XPSE{d`@`8T3sjwaTP?`Fu`I5S*qLdLMM^ONO8K3A&4vR77XWIRpmoo<=xrX1t
> z#f*8HmD$<COy^m<U-hXm$gs{ze5x4a(1%Z7o7LmgcI at 6Ogy(l{Ci{DAj1GQ{N3i8w
> zD`JT+37q2scT3t_i5+^Cc}Q+t?QeEHRiGY>p%%n;K1yz8W%$+Z>k_*nYADBl+4aBW
> z_;3GhFvtJ#cVulKIsV+G$j5 at tqX^kb_ee`xC`F#hMHE*LANyAYNoISBEb<WaqIPZO
> zqC+h%oH<#Ziw+HP>O$t(BzEv*o^%Uno9gDDR<TSDTw5PvJX(?`k^M6Ag^3*;jCL}U
> zWw1TXusw|nC&R8SJAVvwVf?}wz?K=$uVV9%f$3zi(_7j2`16<peG=poqP;8<H^SdO
> z;tzn%GBWCLvq)br_e-pVoZ=yVDfp)%YSPep_dUVp7Q`5R!dYMEhA;o->-26H8J(cx
> zltRZTJs)IrWx#K(E&-2tFxG=q at 9J_P<Zl_z3K>#`8bz1FArs2|h_Ar0wo#m48Pn`!
> zY_bkZ&-!9qk^3wac&>gkf!kw4?xb<`9!GzzZQ&A5Jz+%)7yhxa_{|k!-_UQ*Mfk20
> zRzk+(o~jy)M41C@!W^s>I?OX4EeB&P{B-Tx%Xn6~A2)1!J#rUCD@?@i79Rz_zqF&8
> z`2Ft9WbK_3gXb)fBX6x1ZICr)B(Npn8+uT~&6&j%Hgr?aH(n^C!^aXVqth_hZP)AN
> zlFq at n1Mv;3mJ{DF>XB?`n3%^_IbE1I627q!5 at L7Oie*^)gJFL?N8-L^sjXvr+bKcB
> zR<cgS9kdO`LW01*&1diL)5OQSl|tWv?7;EZ{s#C*P at B2WjIA2mqKK{J-jpA(5#VQO
> z9kWP>H8EGq5I+-qFJyg)kaQ}zU2@#tB$lmfxPclw$z=axT(ibj-8#nU#TIVTZSN;O
> z<4wa?6F+;zC-4o+%$SQpi|zHqtEdl^7Am>Ykb60<4qMo2 at gMZU{=9E9cEg|ki1k_j
> zcOAOYHR4q8zKn7auUV!SKNn|pe|8x?=&zS_il6<2$#|g8x&I#Yg%bA)YG%yL@(}mq
> z7Fl7Aw?JrBcwV<=m|@2sEWBw)JxuDu7_T}U!#Jv!I<-|1{X*^uUCHxPWA}ztVfbd#
> zhz}R`L&MGM4#(g>vXfl4f=|GS#Z{5 at ZkYEH#76G%pih&UdEK$0QIEmvdD(n%1J)G3
> zgg<Y*llb8=iEA>+Gm?+>EEGSBx`WrImBBBcliUoyyeF;$&kACbgFgS?I#7?RFz2pV
> z2)y%9JWI}TN#WY!3=-G-5pQ5DxUpRA3yD8#@uud_cUTdh5YoEj at pNXQ3mLcE@dlpC
> z)#i%$st4V(DG0|1wie%Xx7gMItWXEy`8q=&-IIv;dCy|l at h|wASgbR0{}zmdT(r7^
> zN1n~GT>u^CKEv2t)y1qHk;jNvnBk|lXb)Z2QMX}Ne*(M%_~Y$Pm?LvB7GQ^>ZrgU~
> z7TFlr9?)w7Jp at -sO<^&733>L9>C!~c;pw;k_gaIx_r-(HYLDVf1WqOq*ZnehPqO~=
> zin0FtQU_yZrOZ{u)r7FNzwf{j<e at HG1}uo`b7qs|kO8%FAnRWw{N at 75`tu%9-6wJ{
> zCrsTRGUz)<kRdN{@S80Oo%^T`*Vhj$Q7$I+U+bm5wc1w9D;bH46gyHcz(4;k?;zT7
> zWcqw_25leSQM-`vnu9lPGUlD|^zkIDREz#XJ}0;BNc at U_+#xy7Eh18*5Hd{G>U at NY
> zT7?rh_ps*Z;429Kr&n~kRkngAJ`nF^s`}uiwi|-R{<%%Q(IX+(za?u46D{c_oDhvu
> z;m1mj-UdHC at o!WSzs~-U6({7uePJ0v(Y~Y}H{|-471OcChemJHhQUW>@PQA0!nCI0
> zoMz|_e8i10HYUt!8V;UvwjIt6`0Y=C%c6x6#%{`GTIY|N0Bi;DY{?1HJj6rm|5*b6
> zXyeUus2RAJ;C9lXLu``^QAZv3Qm}k{h+SYk5E5S0wsO9cM5pky&EtEnw!`K)-Yqtl
> zj@~jnb6+sF`-Z3Q3p6hnT~zxTGl%58*&_G(xo$N0xh5DCt{V(;U>3o9PCbWvHr2Y_
> z4KdLv^AdrnMvNkm#7_tZM)pnO`-Uuib^37=t=Tbj+);AB6*)2q9>8rk-f}}MWf%HT
> zt__0^B+EwkJp#voC?*Adu42~DHH+A-(CtYqQAB*1rynkPVYp&Hmo7~9#C(w}T|CBj
> zAIW{qv4G{^@=wZyep-YaiNcgXyti8QxMRs|o%p+}*6HUyHS8A(k^g$zO!(RChrwm2
> zgC8v$I%^K_eteYzK1 at FIP}wHs-#9By>9OMf>AvtuLXV!_#K&51C3<in-SgCTQIWjE
> zo8arKMx3Y}xE2$9lXCFDk-8PteOCQxlV8He-g{Ps^&R|x at tA$Beju5%s{*y>naPEv
> zEB$Abqh2~>7pc9eI*;%CF7S?TU|+pd^sqWu+EtHu^{s7E!UKwVYaP=6PeRrY=M|yu
> z!$FVP*Ncz5HxAsH1VikS5BrMLry#x<1*un#dAS1T88kPLiweHFf;IPRnJ`J0=69PV
> z_)nW9?lV=bAp~58<5dq(*V9$J5p_0vy=rg_HPd=)8KKZJeUl3QJCy*~w=Gr|@RB)W
> zKI6CjS0TB-h15$xPB!>P;Fs~$GgiNZ<H5<ciFhX9#>eZLTwq(|AV-?4LDfomUyiUG
> zePJ at p9NJeG<1}O|!arG9T<Q-W>uyOGWV?`_0UzKd((kHYq at s0a|A&pp`dJ6#VS~0L
> zzR`-oG4p>Yd-J%auI+tT?{%yMwAPx4h?XiuMM6->2*sA7s8z3RfjUr)5K*~^isk at O
> zDFw7 at 6=*96hzJ;mfD8r*a1yWsVyo2l+KPy%2vJcHmBK-y at 3T+PddJ`Q{Ue{f&yaKW
> z+2h)4J?mNc?pyeVyZz5aOi)smQA)g*_>SgN)bdJ3 at NO5`2LeACS2GyC4-%^*p&uwu
> zL%&y^tMDx^;<4 at 6=Kv-t=uKhc1-CF#L9GL&cU_yLh0ZMbFNpV%>^Mg&S-b1}EX- at 0
> z$TxA~fvfY|YoN!df$2Sy>WF$&ehpu|pAZuTb<KH%=l7I*5u676QgAJ0E9y_wwvEVe
> z)gq-1zFd0kEIXan%?=n9?904Dcn))J>0QB_ru`MT0pbgIi})lHeCsO2-wXo2%*7i#
> zR at jqb4YTMH<`S$I=6CBJF8U7S7NU=<c4FgRmRqjbE-Rab*b;nThqR8m?_F8n;HT8^
> z5SQHX%F|^1Ld;;9!^nHbSR46N;9>Zt()JN7wxG1PVnyG#Zk(^3dADYpKY>r;bF%()
> zpuXWp{}#bzqOSQNnU}k*O8HXm-?AhvS1I^fQ3j0n_>yZrqR6d8r`4}3Zdxg#5%U4p
> z`t`#E7X=;7=?CGFg&i(l#<=I;MVe9Iv(c?ApZX}GYw}s;&q=dd(y;GMM(mzTi4xw8
> zu8~%pc3F3oY7y~a2e#H-xg2Fbub$=@hq9Hi`VV!^-h{Ixj)ZU*Sp$hpJ>j%4h3rYm
> zJW%OnnFq{NcV^Eib}qqMzwVcY%>&~*lqi2Da7wVzZ;&->W5le^lBUv1o=4T5G&6bZ
> z`0J4m<1Wlq)m4tlhi>c$$^t)j^c?|o<%T$h$OprW+HLfCFf~^W9_fhng~%z`a}poB
> zde{J5|J+L_{{q?XRNd~uBj1J}?fMjUetffEueV&%9d}Kb%^$(_%lgDRPaSG1#Wy&$
> z at 7!?r<SbTqlNlkj=%SN<QG7`DSKt)J`^RpMYlKVyKa`4Hb}=bw1B0>Wck^{;<-ltc
> z_a%0v`%ml&`QK}5hj&^|rli3}D(Hg0&-#3}JWh(gk^TMS4p#TKHYG^`yE5zd8_epd
> zu5-r!Z0R3q#P at FVO2lksF%KPq=-1c#Wf4Ae8M=TKXfLUKVTuC2YN9s8W9>G?!gp(w
> zmT<)E<KzBY>|SXUyI1;(wY>^jGMR_a-Kt>Ud)TtKw<jl=I>v)t=?CX9?rL?IXmyNS
> z)Vv%ig`Wz)Xt`)U4{4NK8kvtYQZAl>_?xRY|M|R4MuJ6zoiI{8Y_(cG)?}A>)R?jL
> z;N#5Rp2u|W(;V7iBho(n%=kUS4|X@$V|9=}Bkzm<r97#mJdb((<=G||oy)`fUY3WH
> zrT^VD;>yCVyc)J|*qPz$ieuOo`;R5QCHA5le}nCB-$i%D5u|%A&LV4M0Ufn~_;yMX
> za)S|9W7|T+g#o4+e08}5hc-4l|2@}}Rh0AKO#COA*v!o$Ysd;ceqtw$4!AUZ;&u()
> zD}z0As<1GfYl9f2x>&t{#hIQWxHjykPLcKgm)Ftn;jal<cD)6UOx9@@mrTCj*x(MX
> zH>ZV&@kZ?6=wn}_Zv)R8AuRCQIqDT29w*{&NMG7G3+E at l!owq3vp`TkLPcx?=C4>A
> zH~Y+Jk>!~L54m^;;rRIpKHjbKh%X#>w-9)a*105~*DC~fj3s~CLr8Q#T$Ghd%D9;L
> zjdKal`)bc0rq<1yHu#fM-%kxZb;d*IXTBTpsfe#EfFDA^!2>qUB~g)M+K)vBKUlOO
> zbK25dZ%kVo5<e}f_56cf8~*WtS85n?cFM6w<wMW!mkwT^w5cpB;cS>W?GtN5`Ys!W
> zKQ48_W7W{+{oKLR_fHYVrp*C2bkERjNj7B*6V49(Wxp)kE-l?=FaKQXf;4|zD<A5a
> zG-`v-;{e?SkO1y6H*9z>Eyy|(*heGc2jq9;SI$>Iu*oZT4>$9983(eqTA%8zT=7!}
> zxMQCIqg7KU)ZzHM4){0_%vMbebPDi`h)+cyg3k{#hqX_iN1q}%nLU)plrqfcFaHm`
> z%un#8)>7UPv;~`me&7upzXyqhO>iiV`SH*TP!r+*u&S;ykRPFEu{1Uc?9GQYuyzsn
> zLk_+bMC;)ndEjsmP3D(!J!~E21W%52YkrVPKZ29qusJWk)on&TVtZ;kwgBsby~#Jx
> zK_=i(mVPS=GMUH0t~HfY8>hk?TngLE_=UZgYbw~e2JsqS%riBs3g`tVgG^W_w1k`c
> z{%pwKrQqy&7w^1D-brv5sxMLu$YZ|_F4wFcl<Aw-UgD&i0^P9B$6Aq8L{i0bL9KOe
> zZb-rG<f6tiZO-)MP%k1UaMX}1x*ZO;9s`!T%wbV&dCCaMW35Ee(h!BciqnIS_)hD;
> zWIQ9|ac>~})(Q3<u~*o-aRSGJHIBh4ugGGy+2`S&RVfRA_3&b`9>7Jg_*0ChVH)i$
> zWrf2hB;LX>c7IPeS at s+$n4JRteNxWk>Cn@&SVL>n`=~``F|hLTJcC#$xr;vkI at t$f
> z|1y`k9P}LA+IEygx!obP?bIJ at D!G&xdmY5biFRY3F;wqqy2jXq#!QCJ7iG&N?>dly
> z_lzRzmCYXx$7&Bd90AWI(XE$)OLhjihPoOFJ+y4#_Wg)WgMIHovlM(WwUbXkuK0>z
> zc9Y(bwBQ>*`XQTc3Vq8`?v!(NmA_Mtrz~>H at 9KUzr7Y`-wXSArEd2L^T*&zRo#<Uy
> z9q5R^I4tTWoY}LJ_7u>5wvZw9z?umxW!T?<WA7Yb_!XJp?bfmP-6r2BY{Ivo9Y at cG
> zey0F?uS&Gt74Qb$1vZZCbFbzG`?9u3JvfWj-GyKE2G;g5qi_QDdkZ8P1nXK2T%gJ|
> z=y?M$GK}2!WH;=-4Kp-|tqQ(YQ7nnM+MCt8uzmk%_P;|5?WnV`Gi0%L!fauVdE3D4
> zL~h-WI4eX~k+Og at NH4U)ycqI&Ie15?S?e-bj01F7xc)l)97y`MR*E_kLeB*3X$q<L
> ze0=|C^nq$ywMROar%gh6&k4t1uN6UJeh+>^=6<rLPoGQtm;dgGec*2jV~Uda*gbjI
> z-}4|{<jVPj%*oNeFDxN*=OAD*v8SpW{1ef2DQM`S!4=<iG`<{qGvXgO1!G%4)(*-i
> zm#ZjGQDT0Va}XB@{`aE0$FkgQO0!&TDzm(7O5lT8tcBm|#+gE0mXozEYpS)rdkVOh
> zEnM7e4A~UK74n~PuBm(~Sq~uNTmwG;tR&Mc<{Oglf>+o;-T_=!oCOQ#9AH{dCbv2Q
> z%qI9dAjb_L-vfM9StU)4lsJ$WFhd3)51cj|4`vSX0(K4b*`~qwe++rF9eO)auM%q@
> zvGbqbg8gwq9rmuG-i;1(O{XUR2p=oy#60atx}Nf|Ism<G8sljXy&UdKv9)8<&u#6T
> zm!d3EJM1m(PHKsKc1 at B={IrU&&U_8M737)OU(Zlr4j{2g2(Qw&<?+0dCdxy(9J-$-
> z)wD?^@Vz*SJ at M>h_^t_RtzfGoc&4ch at o9M17q;WcyOOVvdB$qK<=S5t#;0+<^6}VF
> zMEseM!f)#PR5G8X7_i4zpd7zQGO^E}+btOg44I7~*^$MIkuq4?7V!#keFd;um8|VO
> z;CZPLcq*+&-AS~2UeruZ`sLGk*H*gmAy*Q+mc~GNM!?4!bN!GdG%I_MbwkUp8+<%#
> zS&^LV?d at MDb3HlM%UOFizkLe96GPA32pxcX`f at XOuK9Or?lZFf>%rF+IMUHz27Vd;
> zSx)K+eRY{xWbgjsT at E4*(T^<CkALwzj6H%GeFN*Xi1oe5*e>xsOneOBkE4s?<JxHU
> z8u7o#*ha4P`(z}#EIf>|>p}&<aINt*0T*`!cJZQ%tJr)d(p&9Tn*8H}g}2VzM(z?j
> zdFUoNZKdmNS-));d&J-Y&&Ww&xm+6D^JrIB;OSm_A<JOQG&t&wz?dZ5wi*VWfRkcd
> z#9ZaIA`VY0o#+xYt!9Si8nCz5)R-gGBCe#i0PO+3L}toZ&%ILYQy0Q_8#V;O^`Cr~
> zv?u#sKFcGjC4KgXu|$`X at Q92D_?f-RXHyGIEfmz4-v`zRB$;|Q&X>S^(Q)7si9Zg%
> zxeU8Pt;Y)53_E1a8gK-7D!>iF-Ch$ZgfHJHC$ogCgII^Fi0qU;7iMyHzKDYldQA)7
> zUH!+>nqa~aQL7hJoBu|xhhguo@)>w6=}nArlK&8#MeZ~mvkW{s0>>uegAKjK4E)@(
> zyo6uDw}KouBQ^!F9-#FQwRJiOZj-bfzZ&ctNFF?7Pe^(Uzk2dMq>rI<%1Cmdb*spG
> z)C04VJO}1_oNK#`Yj_XT3!*l&gQ$n3t#R(SXCtj6c2?Cu_;%RY6gddKC)f5mh`uA~
> z)41ulHh|Uzk$VQ<o(ac4P>rT_MdbJ|_;Ik$hkc;^&ITdkJ>fs5F<2+yE7f+hK?c86
> zU<QKSu!p<U(!iii$(|Ksl^(%Id|R2aqQm2#b<55tu?KgW1|N at ip`)IHI=uaZR=xuB
> ziX@}xOb+n$n*1h$(TB{t#zR;N%u1=f6c{Mcb@<cOR5}Fw3=X%pLX3sK!9HVSc1Ju;
> ztcinv$69x#OrLN8ToFH-Y^ukTeLTwbb-x}ZX+VnE1AEh6-1kS&b#OR<A1tT^YZo0o
> za7Brk at CyYmQP+eJ?hMm4Jb$s?mA(q!E)pw=tR0JpKj5A!91DP_tB(Nh)~zy(wX4(_
> z_{>!Y<w3_Vw;!Veypyn^CWQ5|Go$V1Rl9)`i)TlC-eiL67B9pZA$3_-?M}`IwSYsy
> zXtXC|2W8%9SA}ao`+orY at jD%-aR2Yn+vZ~ps7i at b7;9QEMwTgo!GJH!MxoyFj1?_4
> z!6xwHETPMRrNzDI&ph-e(_Qp8^zku`MYHhjYv9xKEqr}y*z(R{%ljj~Ya)3r<koeL
> zab#@m-YiTMRNonFdA6cZYu8^#sGp*CVY=B}m~D0wYU1R=yttXdlepJDjxRhF=OoOJ
> zn+85C5l0Fe?c^Hpej}c3Wwl6A0iAok8Fm5^?@sH6F$j*7qI2+zzA5}0 at z<lI#AbxC
> zm#S3%u)ctP<5Wl{?3VjjyX9;2r7h at _)XsrnNkY15`(W6f$?^Q-*QmY1VuwYKNPS8i
> z7Ck3vy+Z&QL#8qK&6LA#0-ayS8Sp=Y at 46}lc<+?Bz|fj-b{tpM$R(L^k{}#oK9~uv
> z>7QVC at FX1AC?om>?EIfY|2PlNBJmdXQi%Q0|I7y+-AnJ}s)Ft~2<}#Z3kLc=ti>_x
> zaS3^D%@)Vgxm*4jCqZnM6qlWA4Hs7}c}DzY692yVkoiR!2rpsnxbN}4E`i9 at tBt`J
> z9A+vb?<Cw7-1S1uOaGCr%kJcE47yADbD*c4vF2V-Iph&q>+&!E*%Gnw`}MG?PI+1O
> z`)9zPQnTLCpT$>`HgU52=jF3QE&q|@yP-dIg4~>mc~wltiT?-bOUx3CyPtyEfKSA_
> zY~O?OhY*g-En(=#mmEtR7MpbJ*t`Ut{?CY870~TlGZDI*3*<j+`;5q%X0so9C$v at D
> zLC8y5a82Am?CNsx3MJs&ZU at m#)a`ZBmT%%X1#wKtz5BCflDYE%$rm~Z?vv|*$mevs
> z4>WlE*mfBCJa(>}JTM3I<1q(;ncVYUmILH5(KGTt at Uu-wB>l6R?B96kOEm+t%`(gp
> z^(0U0mXZGTE145*D)6i<aL~-hGZ5pphCD0SLEu8tPw)$>7LsRJ=7l1DPz&J{F^eZv
> zRAZeXeIow2 at XKn%c1(5*4AEkph#H4^#LIG at ah5RNArP@(0+jEu^>d!p6Kb_}YziGi
> zdY~SAEK9#_XdHYM+)1tzE8+zGbKh^ma<j}bu4?`c92qde7TK7UmmN_)CrkOrJcH|{
> z?EFxr{cC|w<n!h2YVc;VwuhN3Du8#$Aa%mdgA&tu?P&5Jmwl{l%`GQiCn|w|RAd=A
> zx(ObukP at 4AVtp&CnSploT+wn-xT1_aBRA5 at ufxOTWKGEX&#R^_$vnm<+--^~qhJN*
> z0n)#1btu=9mvs`YsH*l79w6^6vhe7Xl6Asa1ihb7Lo at D>x7~x<frtH%@2mDA^^dWq
> zgnledQK6l#DAP{GGf6znnZm+9=O1AO^6({hG5#qJ!qx%#^7E&*b{5`<jKPBH_CD5U
> zAHFh>5r|BTz4!RjHCsZBSx)F9f#AIuWAy7vwaT$@A1|PP7tIAX&|Eep`Csu16m6m#
> zMGNRVBBFy1x<~l#NF2`3iV%CMcFc8*nN8rW->3g;;1lCOqBFO;qvtHibeMSWOV~S$
> z?YYW)2k!L}2dA1M2dAIQ_*@oST<+lXBQWV#GJyZd?>R9g+kb}N{PIZz|L(U?P(K<_
> zbIjQ?@=ismMeY`s5$rT at P48ho_KO2g-shVFyNsh>;D}#f&Is-n^MI2{NAcSJ>MUA{
> z`k!3UuZs-z7Mth}$DB-H9I7bNCT@{mvaym7*9E>Az$3wy_E7=7 at fTY;>XOVCV}Q3a
> zHgK$VUgQ+`Z2YPPzDxMuO!NWKQ;u3{f^1CWVqkz)2 at P0hSJbS<m>Y*W?zGf#x9mk7
> zAE+8CPQxz;GIm;(SX@$NMr?$kVqe;Fo?KhU=9TPymb~R!T$P<TuF6pybcf89>TyB0
> zNg6!`b5$eC<3c#4;m at JXxso8_?QX~SKpuQY?*_hJZP4w6Qs1ifhq`O(D_u?0#GoRy
> zCHtIEf#o at YvI3vAkIA?K at 6}|st#7k!4SuJ%lfq0vHL)SLmDPm#LawXDeEH^0v_nbF
> zED82rjwLB0a)5`j>w--v4%hC*x%ID;QmZ4ick3z_U+l*(L_xPR5My{qf!`OQL`JRu
> zkmZmZDBNXPb4MviJJ*C^Et6x<T5ESlYmYL#6BMqs4Jw3;l5ZATo=xu8PGZkhnq7tP
> zkDbu0<wHh}XZwv&dx at QYD$O&4!l6^1L1Nv;4~MU_PLdg)%F5W__Vn$U<P=O_RAWzU
> z87pYlJ_^seP_v%aMUpvm at xa0);Ox~C!ShLu1Myo;>(-GxMbj%u3eLt&M at jwJovyiu
> z<E=O at u+-<ipde!|7i%%NFxWL(PJFW_e59RP;Fr*feULEdF620 at f8Zk713eMy%q+5e
> zqd)2g_5L;R8K3LN7x?Yo_fK_p)PDtJtVJEgg6jJ>Nqv~boFV3bWucI*Dj_pm!`k{t
> zFHmG5cG+mH%ntQAp5rqs0$fi0`-D`~mrQcKL6%3abR*mY_Y+`m&1Bs2GVI)f?o at j9
> ze_s#2snge0%6nQ`V&BrlxcP1*HjR$%$gLGz;1m(Vi*b$Qw2#?vw<FwLZ~6fKg@{)N
> zJ4(MFCFZcLQ%cptl-f{U$N*rQw4nhZZqO|e+~}z+xee?MtbG0!=G8F{qAu{#v9i$5
> zIJU$3Jd3#u-O%W|#=$><FYK|x5XW8qNKhNJ0eX!`m=hr{vwOEwxR-}DhwO_>USQIT
> zTov%^TlrNSX{!ZvQ`C8dksRaMKU-w_TeJIR`a*|*KOhf2aI`%0cs;e+E+6-qAj{9`
> zm*p2imR|r_eo3{M$muR0!rpSG=$b`-PeOb?{Qt6Hm|cl>$cn at 4-k^R!%KoA3`CEq3
> zcE#G)Fh>EeL+oGeJ0lApgh!k>K9Tr}=Fr$f&}uR_xzbH*1o+l4^d0Okv at T^d*&if%
> zvd`IR_7WCny=i?M9Be)tU at t;^txM71;@dE|z-P at fMN$8}sW&6GeB55hrbIuRsvvXJ
> zT++Ay4!y<~*n`&G6CQy4>a*#_iaTW8Lu`jbz%}Vq+ycKu9oG7{Nt|IjKE7$cWsHt~
> zw?=|78qThXr;T1KNX%yRE&Fe=7lM5gV;<N;w81jq+$slOh2Dk>yk|9dX++?qVdK*H
> zGUm&`eyJ8R;Iv?{e>Y!@SuOuoVDYc4E^NI(P4xZJ!H at 8$uyH-ye<<R7iP#7`;fJ%6
> z^=t5IC<&QZ;I|`P2-~f%SG1GKJ~wi)`69(}C$c$_-B=zKm8pzcXW9kco-g|C=RY8>
> z{WHY+0 at wN=aIFJ75df?g{8buahz$_9Al7#Es=w}P`I%X*_o*3V&)C9a+}2%<R+;k7
> z=$fy_h{1g?>9^OZBUb0GF5v>ZJA#@eF(aN0k+Iyeeg!YVJ1rzHjP*ji0 at 4qo>GNwz
> zs$D(vdzt;AxB!Xyd!hZ2xOb4c*&mI259v(%6Y^oEy}7ETd9hP-_ENY<z0IVLotd*Y
> z(232L$9f_^oy}MFf8SH!7xxBEB$#l?J=|Z6x!|dMSS>gf8xME+gEweaXjP3)Xd>T?
> zxLieuhx%1((Q?<)(32A=VdKL#3V4^9>tx^x=+h2 at t&&ncC4E&;{}<q(*ZsnHt(JZ7
> z9_ZX at STer7cd6SMS55N`m22^p8$NF&#!vQko at +9|9<T30EMtRYT~&LOa9*!|8C#Cd
> zfMr5bu8teR<K$V;v6KR{?5>@LcTXknw!F9hTdIKpH*4htOBq)bNV9#RxO!IDH(BFs
> zDmvt43x<AP>DOaxbGrZjUS^4;o5&`JSr8v8gO8nC-t$R_1*fvd8Z;C8WrEq8>T-lH
> zUKP(DzA9GhQC8K*E!zVw{W6^U8t0O<a-186b5 at HF)vGwS at a?53b0SYnazb3bd<h%N
> zf%xd{@BzQVguMKC!Qyo2A<gCt&Hb<$8-C0DM!BLxYE$WWj{8B9OkoZE>&WZHwa+L~
> z81KQTh-;bStt+}_b{iPJ_ug))Fu!$a#FH$0n at X{&+Z-CL)M{OI^pKw{*Sn<Q^52HF
> z&S0b(eS>R(-;WP#3n=K!Hq0<)Y}vE!fH(gJc%FZB7u0`L-63|Y1ScK6U&fh+cUC!1
> zSI*8=&P#~zsmq~Khh`>CLz;$^kMtl?52WcxXCci%>IT^o>zIZA`c*z`DtvOC@=?-c
> zTe_QyaMpuUBUGf!_mMUPGl8%PyEO#+x}VT{2RzXFPB{pUUHeJE0R3v=j#vFk^oihQ
> zE>2QGCVJE8_iW+|UgqwT!Q<*v5Od?{thL4#J5gid-Rr^wKC?DQXzh`|FN9zC=5Q at I
> zJnwc3bC6%FbwK{HFc0}qtuyj>gzz)pyouPS?>-O~A-|Py0^e;X_UX-G;Eyf5+tp0R
> z01It5(?&%&%=}j{tNnjCcfjacm-8X~=hDX76vmzcXQ3yKxkHna<o3>Dsi_j!n92^K
> zOIJar3sb6lc-Dpvp{*KztyPp$WA)v>x=Q!)z=ld2zIC4to!&ji^4NKf2H*FO(OJ*H
> zGybEgGs!J9`oT^`k9cXv+Ad}T2V5kC8*!ueyzTjd>TjPvs0puNwnZ3FZ}|ixp4e8K
> z3eFdOrzpaRJ?qt;zz}n{WL2iG=kqI!+vB&uUl}B*x4j_NDk}|cR3g?no%soUUgbr_
> zW=RxV_Dd975n~fF+L9T1yazm`nN$HdM&@j=0oMtMho*<!+n87eKg<GLbK9`CJzSF^
> z7UX5{1e)=SWts~~0uA at 0tC|bf`ZU~Nndb7RvQaWTQ;+wCL*IB6_CKGc=N$EQ*c&GL
> zj3x2hAk!B3#gByFYAyGkURr6OfbH^^b5~}0+JNt$;4H&-rF3HKpdFGwrSt3L91ntJ
> z at 0LQhFL`keGM1+h{@HC6?0Ko>eikDJ9J^T at k|C%cKc^=Eb^TDO_UCZ7RLJYjCUh#A
> zv at V=D^A%cGH@(2<@{Wta96<O=x2}fF_<rmImvYRba&x0lk5p~G+EC(T)olJqlvA80
> z;vMu48=fW>_39IAIp at vg^nH~q$4muSwK_QYm-tUOIJ{D#c<MW)G_P}9bAGER;!1*t
> zP>16rZ>MP5tRlx6dX22^sq)4^`v>DS&+P=(hDlKx8g_*wVCwRzLT+)raPdrxiDyOO
> zh-nIrh?F5%{~Q}0eqK$}b<mv++5>)|nDD61ZJLe<mG=SfarfyCdtPtz=-B)=5ofEj
> zsD}pM4mgWA2d*uC!Nb#O^jdv;cH;K3jz1tb+?NQCh{ruQH&2Z?n7G}$z}`tkr#vd5
> zLtxAD@&JF&>)zAB)kA~ph~6a0PTEonZk<|QuUHgr^d4uXy{3(&#oYBqaC_^CFSzPt
> zqrtb0aNIQ}__lGt*PD|$;TY!VkKwQA1*}p)NRwF<(uX$rriWWsp76-A+<!SY5_SJg
> z$`E|l)B at x5FI@EI0OdCAxW>XeH?Yq>V_#h4jJ2#>sn$-!^@D6%0fTI5D}kiwN|7tM
> zu87eJkoG9HYh`Rop+BvLJPbdLHneT(2SxIR%Lz9XDvT)_9Lq}I<=mCN?xnlDoxY{z
> z9z*Fww9BV59*ci?aJ_Elf$<93VOSgCnrrg6^Hn=={man4!`SxSQd-m*gFW1vrD@*0
> z=X6IF??kS$@$iuIp@)EB*P9j$%+N|!1&PZW_5Kr>)mfiJ at WsdDbl_0p>!EW at EO#+L
> zmuSGVXNiw}tH0p3=z!0d)H$YU1C7bwwB$#r(B4wmah%|fz38Ta#K(<NS&eoW*-|cd
> zYAe^u>93=v<>afpu=WaIKMcUS;);9#@_)sDYk`^HDb(WLGT0S$*yA=44kqNAkWYXe
> zWH#iezv4JSJi=G!^VbGN3jA2*+#Swxm1%Y^{62}lMUN^Z<MZJKM(1mU_qY3?UY>KG
> z`gHtEElJlOp{bRy{aVAPUrsx#9BkEM+Z3HwKy86|gpH0by+QMrR?!I>-jPHX-fJlr
> zG_+Wzxf&*WOh4WKxanyU?#F#zb7~9t(v>uSo{SbFMtGtlZ+4;$_bto)+}FcI!K1<g
> zf=9;p3`k2_pKT7Dra8nBlo_{+G+!nO;8Q8fZVGg=tQAi-G*4|3Y36<}B7CPUS>lkg
> zYa7AI#mKmCC5CgSiban4gaeO_RNv!f%51CVFTF>L`AR*?csJpc2KFhuPhyG;`^2<4
> zzUROE_X+;nW%)14>W6Q8ODxjp#et9Y_-`2gyB>3KAJgOC$2g*`>5xod31~s>M>>K5
> zU?Qx_zz45~Kcd}kF?i*~R>2+O?EE!rFt(iDVX6<3I3)#saa$Wo_-B>r-lA{mlv-s|
> z@;l9$%SAaf6=pRid9;<TlTlP9-;bD{{It=qBFsor!x~Fhgjt0W{KUGoE at j}BSNlw>
> zzTNJmp`XgYG2dewgLPG(wAz;T+B&uvx(Yo%>h|p971{T<oYiD_3rhC<P;05j?$a;g
> zPqd`F{;kCj9Tzb at ae~HtU&5`BJ6 at ih;Lbf^A9Z<lV)NrKqhY62OIrsc&Stt;waJ*^
> zm2>3%T5d^#OYHOa5u-C~MC)M0XEj8}{*PzGvd<Wru!UQhFxK*aJa3#m5AW!}J3b?^
> zly?+iO%7-m{j03zScEkIc9Yfu*eNpk;`RCb;p>kRS?$rpvOSO9CbHUk8s~uB$2kGc
> z&HNv-8nyVyPCeGm+6g1{e{C#$<^wqpetR*Tx<-$qB&LiaGg+8DCRFygJUVqu)%l?f
> z4*atuRt9&N_w;DmOZ3Nmv8abh^uYBrWjb_VemfSU9c9rk+cEf`+tEnc5&!=Z80Q#p
> zB*ny2N_8EjJObT#BXike2knr#=n3Ydt_eQbTxGAN468kA_WxOi<m=7HTSeLQnl&0a
> zBnG&j<o@@M`hUMa`RS4);0OeEgDWo*G#0D~Ycy<GU?uW#tG?|ct-d`;bc-hW<W{01
> z_#>mpjWZ8?IBFkTwvSasV_cIy7XN4coz(y3mHM+n{b^p--(=LE{%Hm&JJE4)Pk1?@
> z-kelShZuZ4vS2R8j6qOuAK~j>wt$(?Ob3fNvzY*^@4dNCY0R6qllNPFlPn02F-xu1
> zbim%32zzNf1B?^%=h%yXu3Y|7x9Lha8;?)$pK$ywL9PD{U~tos#<62^JI3T;jLD)P
> z4m&2LR>7~9r{;?nWAW*KYeR!&EWWJ6Z(r8o{8#JnceW1YqFZm6Z3||Hz7PI`3$UyA
> zG#*+J7MU*=x9VYQR^uC>E32zi-f%2|T&nb*^PK+eVZrQR>+lL+&vW0PPHt%5u1i;5
> zhrHU-e14^9PGlwa=)ty@>ssJsf+t(@{+>**9-NZ=L0GTc%Px`_a(Kpp_|&?S${Teh
> zAHF_C??2 at nI6zr>HZ#eq?&OEV!>WMM*w=}9DbT5*^25;*2cI$Pzw{Vqx(^<#42Dbo
> zC&^-Z8X5-)=%yhtY+1q2+84lFh7Mtcqu&3Ub9?d3(I4{cbLGQ^FVlisMR^_kIkkOZ
> z<epWXA!aT7BUg1IUQMmtLtq0&e>fJnfN#!arf#z-H48WySdZMu{`9~V62nHhmB`^~
> z-8MzirQ2!W73U71- at JubLf_ncj(DjemLG^_Wr?i?MyJz`z*@I&D6-3 at vHzhrY8#91
> zUbN&lSt0+kB_DYV`KJDRh9Q5o|NLs?8~gA74twu8$h#P6)nS|`&q1CVfIN8)^3mk^
> z<T>OX at _h0fay|fg@*HwrB<vJON<Y&>PZ?S6k_Nw)laoYu?)Z3Y{?L+dpNsrQmi+De
> z$Ol;RcNZWZ*nd77`4#==2Wo9C&yIN;@98gB)aS_emuve(<onB|-hq67xniy&-(N0u
> z720_!j;~<<5`guJ32E+$4iPg=kexrpnzL=*&dEP1?J(}TE?HY=5}yF<D^DcUqW?9N
> z<^K^7{*|}rX4R$FaD18UpSsE!vOhEZJ(H4go7REH2>p1K&*aU^wQrDq=N(_})Oh&r
> z&&~8xNo4+|*SzDsMZv~PBk-RqIDb`GjC(&M=h~g-?Q0%D?wbex-OVd-KA?F=bLK;F
> zS1Kd&9_-ESpx4=%XuG$qEA3`lr$cVRT00>Xa#yhb3`VJ+HCcy#AL}h at p~0&GAC1t|
> z$?$oLFaM|W`TghhWN*I16ME;n1%CT?!*>d?bfPI+wSNJl^!GeI8Mb&8IY)(aZWMYo
> z8kVJ!J?$C0_ at 2D{$!>JMN`P}m*>eu$oU7ZEN}p+G-hyrS=rWC_34Y#HIG!k;(|uZ;
> zuGDt%lw}Y0;aVPWuh!H)*xw$({x+i<`#-U5`)S|7+_~6?!CnPj-^^xhr>NvYr-)bV
> zEe_Wi<T=H_yl^R&SHnKle;X6bpU-{&LA3+$l#J5%O?>z87TP>PX_oR77ksCf0==F7
> zuGLPdOAomUynx$eaKULAt+XL$=Dp_p9=<T&JYjMLqslvEp4X5=4G>no%&%_Ff5=xh
> zfTQr&gsqJ?+dj_D1Xq<N;j$)GEp9v!<m&*xyp}Y)gYtG-t4*9K%uhUxcgXSVJ at B)c
> zkY`|@Ii0)*zW?JJQf2}-|0#cKVT(Y&fEu98O7hG}PI!_>M*ts$zP8KXjvHO+)@V$)
> z(oA1>1(&A#!6t8~=eqbFa%`)9RlmUM6hsfSnUicP9M7f(CZTQ;uEOUHK3NRm at Kh--
> zF+J32_<5gX8c2+nhQkRzHRpGULbAleT8!AI8z?9I_|q$5J^OtD?g)V=;H_q3;MI<F
> zqNXchyEkb&N$fSuH}T`%!Tx at XEM;j|G2><BlFU`cpp1jfTt!#zc6PplKJ=M6-OHv7
> zX)L&HDuJ<HCWR0AgKA|3-w}M4wc|>6iOY@<f40xJTE?1XoYhqd-*!BR{8K^ot%WI%
> z=Iv|ZfYSiJsZqbaTc7BGV{7D_I9o4`co)9>5y0%+QZ&uu6?cf|eF^M!C3NS7^%LH$
> zPsz6$Rxh at -2PQL}KUP^%_q6O0<5qT)yfe|Y6~0FtKI}2>Mb34V9*3dNbsP9$5 at IUu
> z6qh9vEM>w{p>CJB^$7fDp5i{|6s=WL5g&4Ayy*zzIyiH`G_)#3OY#`MH`wuy`hbmc
> zrej6ZYq4|`IDk~;^Y%p}KAo3S&jPViu+dr62F}ODl@#g#bNGSe6`K4WnF(#MVU>8E
> zQY at aM(kEvwUQVt<cce%p at oXW>s;`3Ists|7mxW{!IjtuexQYgh*X8}Ph9~eyL|3{R
> z@<y)zGiF;uiSj1CVKggyWF!kU!#INM;82-{{zz6D{WxH8cJx+dDaxjcb=7Q364;l1
> zU(x!AnTdLFH9l8~H0E{S{SZg}s24~5t_S}_)%TUkD`Gnn;>3d6|Kl-L%qSw?+YMu7
> zzhgDW#CzuH#e4nrVP6Knjk(ABf66Z+i~JI21^MMF<d>_q4Uq5DaWVdeo%%Pua<{*f
> z|A4t5GRyoxUw1}X7fsrNr>+zGKS!I)qI{LvJ=_i62H~4kULIqyf9I8W@$cp*BCa}Q
> zoD8z>5T}pUc|Gjbi$(SN-qS&dA%yRC#CN-Ch9`l`SS<QcUz3aPo{6 at 0<@AZ=t at z&l
> z^U(D%i<OzgM<({CF^G!@%-VI_CnfSG?n$lJi!*=JhaEC$UVQWNmogjn*sscL>^EC&
> zBQXV;2;~*5<C-FmewlM#zq~Z9`i_tE_Akja_BHGK_c$J8kAwVrti9mHSh3#f0%?Pd
> zH(j(T7s~ebik2Ault&jE&PyRzt&gZmzP8wq{0;p3X1!^s*7^3O>|NN0dS>b!Ni1vF
> zHV7vTV(PH6{)_&z2>mDT&;FC>_M-owpTAAye-gj`I?u^`|9t)1s53Xs4AOU)Ao~(h
> zr$nEyTo&YoIxZr*U|>MA!7qclPtm31ubz#2PWRvANsU!zqir)2VN;FWw&b(ju=QdM
> z6QJ*BdvX7`-?16I(iwy=Iid=>JbhSx>%<pz{9ol_v87+_5TIZ6p<ngcGB5hopMA;^
> z{(W^PJ<{sZJ at N`>|9S`b3bv0eu(6CA|7Vz=-0GtIQJzul%w_Z=PqOzQbzu4alnapi
> zx#W0C*=})m at h+C{J3C{u6Ys<>J*k(7&J;?MzgM8ie=5VVfYcM&>%OZ;EIEB|@d_TP
> zBPPh0uM(Mx@!bA8B7Knby>In3hfK-L+lq`t;5pFOhmn|^WZ(SX>&KM!f2*JVK8QY@
> zc*doe?3dB!eq{Sx82Tgn-4;K#KcX*^J&<WZ|9<EW at _UiLlYEc(>fV35h|ihFAGVri
> z`&_>)UoU0*<DCw%)zW&Y)o9pH3U^9Z2pTBPu#1!}MKBlw$z>a#$(x+PWgc&;82FUT
> z+evR=A3oOT*FCZMV5dkk--p#_G^Z?otGm+6e*YOh at Aho%l<b4n at 0Vq4{Y{vQbJcv_
> z-A}dCaqd0vG(Hg)<J=E?-n}8<Z#-x{yDVc<GJF&4_n+hQuAhV7k>1B+lQYq^!)IBa
> zTwg-JUmjTjE<?zAWUVCJr~?g2z%{S07h-?*XrVOVdDVk+A(`f$RXsRfm+om at +=_TO
> zQqjV*9g?9HNw7(;e;h`1;OYm31m}kJ5$mD<2R%W=cS|n-1_2m>_4kD3{vVu6!!shf
> z7)7d7+H#>=99GdGA-1&;bIQt)4E~xH{dqgPpTL)qdfqOi8GIQ?6=vwIzK7mQS8r!m
> zZnh5*r^KMVHx-A#<@ZZU3^}JT$Iaz1ao`6stDpy*$6<&ZLC!;$8=MlO(D&!xLY`(+
> zii5;vhX0;m|Lc$c3dw&JmvCJ at Ynk$TnWx=JGko^q7C_g$sI4My2Dy&1#b^w3MJ3Cr
> z+U9a^k>X&Nq$G at jJpAbI3bXf|U#jB7p$i_=XuiDR8iDs}zN~T8>}id$L(DgYx#K#A
> z at fjQ$X|@mlIZmoDQ^S?t;eF(}wQ({IW0n=ndvaEh=@Yr~8-`L`jdPKtvE`d&4}Ltw
> z!ML{&SGA_01pHuzt}7dS5bx}KaLl?G?*&1+2Rnfa$^_qutn83lwj}7hBzx}$7fwpO
> zWC`BQSxQoB_{wjAZT`L<e0+?G!*~sQaKbDj?>FsvUTQgxdvW{+>O at Yip+4*Sud(%u
> zdvEq1vvr2!YyHP;9hvq#o6&#lVtMwnw=Bmm+JqYZ>0^91+kQBwOhMe_6l&oYz}C%s
> zGROA|dr=#G(I(GO<Hm7=T;Bw}nU3hKdQ!<)LR=>yIK{**6PTGTo+`2LcRhW1`DucM
> z-!*vW5lr`Y)u=mrrx3cDS<%;10ljGXiWs%DtxE1>lBW!`H<-6`V#9Du&h^&9PwgEJ
> zmmH(s53~-Fq$QtHn5Cjb9XN+iH`v(ygfZ`P(Z=^2^y4(UzB;w4!CU=B!@}&MD8g;;
> zo?Wm2vN`VgQSNaa{{G-T6fNAH{I=p?GRHmvbuNz`z~RPPbFQZp*_EfnOt?e(?T$^P
> zKfUaa9OU&oDAczGbw6W5Y at 9dSkFV{p!MWQUX2)=(=tFUy6H?57L+Ul*0Q&I-{LdUG
> zP&T8TndG<2zKp(Y<(^Vxg>@&}yl$t}`II7XJqIXg?-@$EYh2^?_J<K&-u5QC(++rA
> zZ{D~pC#&U2vgSikLZPufdR<l5GGI-9&CXqZg6&WF<`XRj at TV3~Gm*|BJhJu$sGCBy
> zt*KBh0Jd{R9xWF<#x-2;#eKa<pRNmTcjBC%Bq~Vjt;Mx?V2 at A-VNzv0bd>Qa!O%?(
> zh}AP5Skv8*7vg%Vkq#6gp9;O&g>}E-K07u}W@?LJNG<1jm^5`ZIcG1brSTj)<UeDt
> z4_&hKyl38py>6PY!LG1#dD6kEYQ=KIzz$YTQ7(cnPbK`^cxF*qM)dIrwR5QQ1Me9o
> zoin9;zkMWqKgyFfua(j9t7Ogj5wJxAzx21hH1h4fyU{OqH(1AF55I6X>{s);xbUNy
> zMaC8>>%u}--WDk_mREku;`dc8G?U8uOW1`SQ<gzj7LWFaUn#!Zk|(+zlK+gof2i+H
> zvpxEtY~jwZ%C at THQ+YJc74_w6#SPmDUfWa?{6CcDlo;|(g+6w;Wvs@@?UT^<^DXD?
> zDr4<%{z3n^^RmxDc`&ZXf9!OzF1XhAVvO47WBi at 8T*ExN)Luso4=;OpY(>T_xL4RQ
> z`sX~`Tgzb at Y&d-vZJ?jKuzq5L4O=H)sHLXuUasHH1lRLS^oi}IGL7N9r|ojA1IyvJ
> zs8>_UQfZX2)L}zg9=jGe!)~rB>+6dVmcy3b#iv$v){kFoR*RMYZa)uPm1)tZFZwJ@
> zql7FnMu`|Jz!(fK?@?LgCCH-1j5s?JvZzGN>tVchK(;7ZZcpSDW|UP~O)7Muusa?|
> z2N$PTUU>xexBRo5&CG;X^omZV+di`*BU3`4U+=M6V-^$rI>+9}t#hD{wDU)#17N>=
> zsoURuN{R0)@cXJaB=h{xF;$4e{)#SN#Sr<1*}mGNI+^HfQHK2%ee8iiwha2t|4SJp
> zqzu6Nh#E`7KW{XIFF+dqs*ZTf9jpnop#HTpJzTaf49V9cs)+s)KD_yDF+^5X_Cn6G
> zvFNUYI2PUNaQLMuE2Oe;=mp9aq;x9NU)UL-pU$Vk8VlPWa$2BcRVUw97&?wyZIg?L
> z{*tYWI<_ue(Y5Y|9|T($gZk at 2^k3 at YNPk@%MqQA)Yx)0C7a~#@z-L*?aIU`$4Lzzx
> z!J|*0<J^oj(_?c;oz#x8?48Ko4>J5l$kn6$pA#GOt{;`lAsf1q`-n{LjIjlNjnbVj
> zWLNiWEo9f?UHUTpklKNIV5%>Pm)hvW`J;8dZDroRe}I1T=Wab>)a{*A|LO4LDV#mI
> z9v!qv)Krx(CUMUHWnTpOHPL3ZTg?&3&O#zPYYLXjpqoETWMjy<0_?M7!TLlG-WQg=
> z7dSX54WE^jU9r!EypI at FdW`+d+N1DSuvQ-M_9V81=Ja3@>_Yo7Hp7T6{O^5c5n^DB
> zXX~iAzm9%Lo^Su~g}jVChk@)-E&C4M7rmuH_Gajx80f#n(@;*2AiEcPLX<)O6y;2`
> z39`uNn@~<|upZY>GeH_YBhxh8kSS<0FVGe^&X1Ybn=4zf-}9dEl!l&u4A%48#7^~)
> zQozsLlxFEaM1E%bPc4z3fpMC`mJQ?PKa_3kzm#pve<<51cJJ`t$~G==G|D#df0WJm
> zXW4GQ=-b~BTZcB1ZA*-$SN6Cs+VYEkY0I7ep)L2|+|2*hmWo5Qh$pvm&Hrdi>5H}`
> zI==p~|BjKKOYojfWDdxtBR<8N`9^boAZ$Kto=bEu1+&#(xfH*!E3k7$yr$niL;T+d
> zsQ!H~jM(KW=zSZM+Xa#%e<ObLs$q@<2hkb_{5H}%auv8#PMY$-7h52nHd at DD1N*M1
> ziWb}M(<N->6(@xABne}AZ+U&%tq+S*t_>Tf42B)Fp@$oC72~awjJKXBe}kE8$K-DB
> zAD0oplqxOb@*DdQ`9F=z+ZdO3|I at g%jIr2!&C<QVjl$OT<0ygVgj&Ws13N0#YF=;H
> zG}A1`6>YSc^y?t>YpkQjSK7!6{9+!w&#+F-B>ji%#nIm at qDg-rihGN3?<};t5PjaO
> z4fk at Rn9Y#S#yq}2bwHQ21ar-IO6a_Qe`ybz`-)BPArF0ix)Ocf{#Qz_q|w)lLy<zy
> zbqxKDPM*)hv5AKNWPOnnWTbnhV~hxEKXff}M-${mw7rO9Lis`o9)N=00=D|X{(WO$
> zyr?1PL!aoG(3{+YzWOTD69QYae;@159%-3}Q{D+_vaCtKGE<iI0D4ZncsSOjhiD^f
> zlPj?!GM-jtVV)*;b}f+q+ggwxENXn%{*cTud1huF)<uKq6g6H!!{+9fbx1*Ml71;Q
> zrgBPzzBsHKsp&Waf8r0P;~Qm48gu;Ys68&HAbaWIe-TQ)A94_Me>q3+y(L7anz9P~
> z0{3i}z4BdC$=(#0(DH;<_?ODLpTfVnFrfu at sL82w{MFn*U{7<+kneS#Y|J`fiiHMT
> z^V3V-)|G&d{ChV?y|W1XwnsNT7K^-2=N^S#(_>m?zh3k=V7(3xsm{q{L_D|3R^i9s
> zx^C9q1m5e-V*{WEn2-4 at w##;F*5h%Tx}}Ic20P+j3N~eC<ja_ at Pp1tFiBAu(K|G7L
> zzWp<Fd!No7+>|7%To66m`qZ>xtKYC(yJfTAUANbKWpLB}Sp!ce%@mf&MQwe+tI*N2
> zF}6gvY=H4P-N~(7U?#C*oyO;wn9BJ*1AtQu(9x>DHh%VKX{6Eoi7<<QHZ2NqWj{}H
> zRa~7WYOV7by8c?bL~%{)T()3PDX@*?KcDF6sIU6}gV at aGr8-*O)PEcZ{Dc$o%Zb0N
> zufi*UN4L+7*f?#tvNJtEQ}w+=-Bb6^Bj}s5jR&3AUY7fBJ2nKdb-ZuNG<~;w)m{l>
> zBVJ3)!abj5w}#4M^x(&`Pt1Cp#Rze3M_s!6z8HN=1>z6(A|Jc)U`s{G^Y_c~pJv`#
> z{|U!N;F at 96LEe!t3G at OJjxG21JT|;jLiERBnOYgjc_lovVN}FJdlB|d+ZX<W_@{rE
> z4Vx6VF3vq3`j|SaQEZ#ok~Rsa)5X??n_{7!uWAW;tf$6Lu4{`=a?<7Z3>chdR at oR@
> z(v&hYSN9xscm#FmWgaKo%|F*)hqw>z_2+#&-Sg=A{rB0TuFoBGBQbpOoZ at LtXv^{a
> z&l{(Ej{3Dck1H&h=A;OEdCgY$9CdBE#>>8sx<2w~IXEu1WZzeP7rCcnt1h3}JUC6P
> zT6)y~<6{GF9 at _Yt^E}k^$H#`WG{)G9KiRfDAu+-)vA*tC)Ny{I2<HOS_KEd}b+DJm
> zgS+lq)bp>XXIt^wZQE})BOi;p`EuiI=XnA0n}@h(9_&-E5DyErPgtlq)g^nJM=^D~
> z-7nXjbl($x^~SovRr{st7~mlC)mPM|ExpS74g84fY<+ty1ji()Z{W5n6uJ~1 at X0C?
> z<C^Fqc~7x!huJ%|&F+Ypq9eL{=w1CXei$p$O5T+165GmvjatmEIrk=4npF+ygZ at G0
> zv%2&_mnK)R$CtpvgE$`8^MtazaKKy-`i;!jrQ4zfK_ at XM7-|ZZWFys2615uY-v%~Y
> z0zZgZoRk_J at PRW9E-8|7hG8$Ki*~lk_r)>BvL5><@R1)}l5#jgnCJps<Y6mk>;-A2
> z3>eN??_DPU0}f0N{&a9>-#V7;)Nm5-%>&*S_o95iaVB?^@lK#zlar6JF<gYXN8<{w
> z(6%&imWx}9Fn=CJAH<wH=pSUx9rpxtE{*tN`dFc at ++pG^J&EUoclE at JW&kI}4TvuX
> zuLg8o3C-;JRFq*c=Kd384os%;-T!FOQuhc>i;YbbitCHW+Cc136*H|wzMcmcsfU|F
> z*|i`<aua+k<enw=A|?ED@!giWbaKZQ&Sb1 at Rn%dY?_hR97h6x{T_^t^?>hc}c$e{?
> z-nIGP-vx}~cd&<U%#wmrdDeRY at qzwTxe=@nyE?9k#3e&J^uT|i=hkd>xv5OO(^Lf8
> zsU777eE%`iVPMg6_yMNx3BHY*vZPW9UU29NOHxWgmzl*Id~$hC^J3p1ynu)&kR~+t
> zr9w~Jh2ItQ4c7M#I{m-c1wb!YQT^G9SbL{%L-pr)wv*`yo?F8{*YV|ZPrmwG3;%9T
> zeuRw0y~zpA;7pvvY&YxORLC7HKB~cn*z6a60X}|XF7Jgt3g2 at Z-*eei7Slt%=lv)=
> ztBIOiQkfufsc at EpvjzPPvh5elY5T9`!)|*6yD%%(mhcQK-D4f0yBP*dWU;*_?n9(S
> z_9r1<)!~{T7I7f9e1~(T_C*BS&*a+ca1EG#r6g8rcM&`R at W<_dkM9n)ywrSxi-;?1
> zQnOeInRtZeG*d+Q1jbh7LZ1}hK=9e%d-4wLL!1t@(Ysv4GEy_*H)R;pb%dV{=@jhI
> zWyA+!&~JpZ;b0*4s?BT+lcNn!2emcq9%OQ;0C&z=@WcM-GrD03%NueTYq5u_)_2H3
> z>f)qzS!VIv){95F!Fi4I=oc8{W~`ac&;^12qH$!~2aOkee~b7D{9fHmP{C|_jmrr^
> z?FWCcv;*O#w>RXfHtYdzR7)XV+#BAoxmhU-k_W*z0UXanpA7zz<@&X at WG&7|EE@~v
> zv8QhLptiR&`Kng$hUJ>fU9RAR_+V3K`*=<MqpF3M8<sU5^8JnQB1JeQhA(V5KVFlW
> zM($al0e?&6*J7vj`ug#})S4VmqHpF?Wx!54p+6!9ciVy)u%ViS&^c#n<>VU1ESFrf
> z^l`-Xg+2LpVAwDg%RE!>2|4L3Wb9e*s?1!>GnX-Mh)MlV)@McAoYcCq*tHC%A~qx1
> z>oL+7Z86Tp(iY>EWBzbMJmbP9+O~@6S^U{<@I9(L9O2{Cddw30h#RaG5}Xmn0VOQ&
> zKUZAuh`5m6OOBBLUdeRPf#b8dZ8m4HIl{gqzC5n*S`#>EJr9QI-Rn*c>I1KbAIdck
> zbJQPWEp2~WXxya-K3mW7vi$NW5HehO#De6?#%JL>`tiJFntfYklI}A2=t76^1UiSE
> zgtz0-N^iQz6Zao>#QtJ%D$W^JT*P|)k4?sDqPF;SE{S_7ad19sGMH6^AHhcF4;kx2
> z at vx55KI^I%cSeUFB08eWlhj|^M_r%YA?F>uIH~L&GjfTjb8ATz<r|wt`SMQG%fpk;
> zt2Y%ppS>)%7hjf(y_EWTIhp%N{r^Rw=kvj{1bfy&*t3ob5#O;5v3_uzisRgZ*|!48
> zJkIiul)b=(5$=`@#?j9#C2a$H;V-K_tA%0aj(uorU*6s7VtmKN<z+2`O%=`}yqAAj
> zj(xHR)__dtpknY|d;KW*lU;F4 at 33;zHxFp2^vEqSP!i+^BA<u64Eetxe{_R`QRbcC
> z>v{Yw#IUO_nh70C7uGXZ1 at KnK?SM_2B&dxlL4UW4k5ZUZqPmk|r+<r?sW7h_tE^l%
> zURh;C9B)RVT&9<TV|uu$AX-ZN=UNTaea^LLscGFhnX-zKwjNZEFlABe+E(zRTQe>U
> zMIZ7~RyBM9oPitUB}Zjx!|sUH0 at 1A|?0+f|(|S!b{)cp3asYik!m-<+x-6`qq;1QS
> zxuicYET at JlOS6{P7;a??jkk_$w0f|!p>g2%z<*Us5cC}5bp_#31a7z&W2qW#A|5Lf
> z)W5zDcH-{bC~!dHnB;xk(`a(crr?B0c?14lI}{9GWHRS&w<`vxD1-lrF%Fg^l_Q0{
> zyRHcP#@o5u2?pd`U|g7_*X&qOHS{U4+ at 5uN$a)NJIlsN%I_73QM!Zc%Xzc1GWz-Zz
> zx(+;$<Q`ttT&_3-{+>#4!1f|B|GBXoSmc#c=OBhl|9 at K@50U at 2&J`M4{Wd-6*r3Vm
> zavj*6G%?)Vd>e5IJvCK`safnGx|MH6Ohxrf-p$|F;QdqTio8YJf$={VNYeQ7hB*J3
> zb?MX8&3%k$Fys5?xxgg1C9+9TrmA|qBGa3%)OqtwI+hPFz4<C7s at pwn+u&{c-I2y1
> zet~?+)k(wAuLE)KRLi|6W1qPvB%Sf}@3ZJXxf^$hqvm(SOaaFx#&CtOuw#Z}X_+h{
> zK2|2IFb$8OQEyHTi at tsD!4CS;vL at 8cN4Re&^oC at t)W0spcN``4O7MXGGju)aT<g=M
> zZh^1CK2`S=$7Qg?`0bewf9H2GuWeTL<=WcH^(xy;$GX%J%oSzKet~}e5VIl+aTH(|
> z79PfV+oZ9|syG$eX-Hj>@0N3c0?|ze#~-<ql5C0I&(8eHd6%-8(R(_;*%hZEb=L6s
> z!>a{!jM3JPl>cAut$}|`+Ww2ScDYAks}DA1QZ|S?v(nb=Z{4$%I%e8+&=#1c$JU>9
> zMi0qK8pM%<m*6w}CpAf}Tn220LyxL}j(h^{&v$NC3hIX(Dw<)d1_x&aVo{wSdQq*X
> ze$J3x)@Wx%#y^#3D6mVgi4z at SLM7p4;x<iFWA85D%#w3=?-yHb!#*gIjZf%rU7JnH
> z5jfepoRnif;rZy{JfQ;GmTNyF_{0{Pa>hCm!18 at HnaNtRNaCP|-VW=`%`P5}mAJl$
> zy?%-9BR$}EYJ at Muw3Y(ObxJ-ZQl7wCPzZfHe7j6ckr(hyF7KA<fx)>1d6cv-IGk3%
> zm!&fKl%u{$y)NUD`k&4pS5GsYF6RSl!-0Re`@5&v|GJv+9Lz<Ye?AMi8|<IKo99MS
> z_;=K@{#(eiYlNj-Q>~_wIW*y%t=v2gob)d5n!9-O%uN*DOTGIX`R8Ok at clsoUpQcQ
> zkm9-Tg1?W=zf#_!<Wnw0eqI<~{_ZpU?^#m}o)Kd!&yv}cW1MxdK0zWf-^XS$66cJR
> z@`e=u4d6r{3ZE-G8(o$g#=aP1U$Uu6E6Cmpo!A~`eYk-VrG|KmTXgu5`Qk}``Um=d
> zm!RJIeKH5wbCt%D863Iqn{{2N*Uw&k*8lkLr}%GEkBXCw7|Z+A`Dl|pN;70)Yx`+R
> zV>xV45rT#i{|(B6cu!RP<uZyH(0ZJ4z<ICenbB)Z*E){NfxlUoAs*g-cinX5QLWQd
> z#65^;FLX7fF_hie&P|Yma1B1$x5b?ByP at Niph{~$?LDJ~b{=l35Id~{ztD_!YMJu6
> zQKrdQxlovo*o(WUFw at Rxm8n5KYymAE(5{btP4he)eyq$2=&@9Y$LBS}5aEe<=rL0a
> z6*i$)yQs)2hmmLIR79E>Cd!mbS!puX$Z}|&ZB9Ow!Wn6<u#%cph|dAPTFMHsSfbEh
> zD9!Ug0cW^)_+4P5egtQW<c^#hCkD<1F*|!OCh(mkju&Kv$GgyXJi at HvFXLR>z(4RE
> zpCw77wOUE^sr%vxGLLq7i=uVDo>}jZcJX$4O8d at 0TZxc**8QP<ivM|b?_!23pJ|)$
> zi-S+m>nk(Gy!%I<E*+`qIIdh at cduB-)E>>a!F`fD<mS<@BVDg$xr&N)l-JSIVt1tC
> z at USOo8#r%GJhM1Uau_;OgN}*;|H2oVtFxr`x>zUs!yPxaIf|FI%OC72K16wFzMSiN
> z?Q2(2b9^LpNup8RI?*V6>xk~t9j3 at g?*Z-f15NX#mAEDz*bd#=HhjCirsGC&2IHZ*
> zT4(t$t{?p>RB-gGPqF6QaYf9J=EzGOrlVi2lr>+96lp&Hv?^lt^&^@uBg<FM?zq95
> zC=Sd%ArhDh#Ea0*pFF3hPc&7Crsb5F8I8{kiOqfe-z$A6o^`o+sivr#5uScaR9hjI
> zA}@x&pj4qYJ9^t)`{Zb5gv5Kih~Jjeoc>Ol=dg~}i363p#A}0d#JpQM35STzxcSKq
> z5yp>IxZXL!RO}tGmA=~-uJ?{`p*v+IU5rQblRKi#yiQs36Iz6OqLl1C?HS~rP2`?F
> zioGY2 at m?8@<M48=7jKkUtSPJ0U#n69lek8tq_yhVpPPF%#<{M|@sy~<i2vv)(I()0
> zP?xWfx+L`*IqQKV?}+z+ZrWU_p*L4WRNd&+>|x5O{T<RgBPHJOO?R>8`O1O~6U_QN
> z#1T}uOQXB1q=<*Xm=!tFPfQm&ZYV3e#Jq`#Ra at _O#>|fItk86X75K{@1U6@^7e{3L
> zUN|rQQjP7{_$c65L{^!IIS`ZbT8LRaUs<64dn;_9F6a-+UCF_`Phy8IfjkpS<hav_
> zNdOFST^G at H9=d9~y-upgyhL>Y581ktT55X0L at ho-WGb_0NiRQI3EofMa3U|^f4Nyp
> zy1!(Gk~sjf#Y)H)tB7pToWD}gaB|@HNJR}N{Ue%bq?P`gOm`To)*fmp_HgTSGVSQq
> zvy(loz%38HT;`QA)N5PiHS89h_~1=h at u-qLl&4Z&JSlr`sOV${<DR`&Oj2R?UWTNe
> z*?R+#>LDwWJ;UdxZL#+o*A%aZKj$=42DP64T19jf3)%Bi;`If7yOuy+3s5fW85i;_
> zmkMbDFPawonFsk&li8f=D`o7IGVyEer#r4+D~}YF?4!Ii at rY%%vO>OY{BKShE_G4s
> zydH2X7gAfT7dbe!>CHUhN1<y>`<U0u4Adeb4^B*N_Vyl}JlK0EB{kKP_zTT(rd^B(
> zdp6moC(z#?cMu!{e+<1><<b46YAVbVvrGmRA39uDQ#nKUIKhn(Ds4MO?91^1*k|%X
> z%#<wT6w^>bQ@@urFe>m8TPrdetRxQ at dr6mmtV!Q96&wYg3S+1&M62}#j)bp(UM=Jl
> z%CJulnU|Wta at z0XPgh>z%ak|F8zs*hIKDq#T(EFAwb!&8eyxQmBTUD8_>#xsy^2cn
> z$Zn2`k2oz;34h2f_z<uAB{{-Tk8)^>Je3FG+gt?9?<41 at N~1?Fbma3)2enuWAhY at H
> z+ at W0FE{&kGgx047^=~|apQ_*POWB&ZGn$<}u-D2(iHG=3YhE|&t)$F9OuKsc^xo)E
> znu0FZh^|h=Rb}2TF)&`5eDDQz7LxeP6Q-P2%ar-xQoY;2X+94OwUKEsJ)<!1$H+`~
> zdZt3BSD2GIW|(H*6Pbn6AQa`nI<d>&^Rzr$R#!P>7~(AvUrmvu53#TEshDgUexHQj
> zv_vX8S(Y14<Op&NT%=P&b$=e)eGR at +@Ihm5PJxqYB&m}Z_m<I=$`Na at iTJ%=M(kv-
> z<aGFPifjXt)5m(Aeg3AwjJTY+QDcpQ`eENOJ&Nu+*_*~(?0=q%2d>%wmS#_+&|mM&
> zH&t{>HF at fp@6Zo6XcmS^Y|6YxtfLcun_elN+H$I!nQMNqb6uaq$YY<FFR$wBTZ;b<
> z^k>BF>&l2uMtpe*J^iV&QY<$W`5Ss7#m-}koO?{OI|^52Bt9MVbrQEk&(yx*xx0dV
> z-xwoe3<$oEPAQ;VOte_#Z=~JB3&FMPnK(m34=22nUc8oWruzgX+Q50j6E5#+pucy2
> z=#Md`=uY|RxG~}Q*s8i1($|5%Yy!@&epooZ-^?_GWEFZ!fFXddD|8x&*8(}r@%@yM
> z1yuu+9sN>9I?gGTEZ$6X9-ZayG^HQ3(RE6_<(=c^nwz=ns($AZ`Ntxoe*8wm<B#9N
> z*u6yR+9F54Jl9Ch)twBvM`Z5bvwgRmjeu+w9A6IkdC4m>JP$HFqsZ9rz%ObgayO6M
> ze>MsC*WiA&)}10UIx7>ueD>bT52!8HADYJ at Zp0w`|B#KD5!;!e^N5 at KHp=t_WlDb`
> z at 4tMOBfAe6{o?$~GPx1?I}Uq*m(QmOpK$1Qtz_Ny2Rr}m{vZGC{*TDMz?LS at c=`UN
> z*sDwgXFu?Qxm!x|zZXRwFqI5^zTc}X6Wl0I_mlmzyzb=O)9^KLGF?ai1?M`}LL19}
> zpogp^yz|{olDl}eS&bNSR8(7}gX-Hd=e6K4TZ4FvD#T;_^s1S;3>p1u$g`et${5Jq
> zX%36-m-ZT$Yoqz5QC++)E%nt3t=5HZ+TaF08CUvJ%yjt8PSwv%Fk6?9*iMLlH<FEi
> z_cfaz&E~%$&)mSt<?7NHQG~O2_yx!pYW!B~<xZM>vgaN%fW$2)-&~je at yHkZ&9f2z
> zul?r7<1PEmkL?CG?ElaEP3+&!Cizb|d(b;nNt3>iu3pl&U%G*Blo=5#RjBp$Gl3i7
> zY+Cv?Yc10BbhC|~a0X~)Qwe8)zMkse>rOT4z at b!ShCf@#!@=sLS)@Jvu?F#e(96bF
> z0mHMO<vOUtn!{}<nftaPQ_eL#A~xcWpS+TP??v8{`nsP at V()of(&PJaPd>5VF%{5*
> zgn~=xHDi9?J;_sF&$EQD#_zyX#d6;de*X>gyc*}eMjC_kAku9}(~)jRnrap_RDL|3
> z<<XBci*qumtvI$NI)}6-yz9r0N7<d;F-}pu!xs7(Jol^Nc((KZrOf!2H(r*X at bpI#
> zee2vM>^n+^1|TNOb~0Yc-u$(-=zC;tkRx9E9JzQuICC7|V>~BV6<w&ynYOW^Wav)F
> z3-E=&TrH1Zc6rkfE_}esjr68LSLs>60<ihbSBrJrkEz+BlXTC}s|Focq3#P at Wd;ZK
> zSL#NkvB$k-8+bzI1$tVac9xlDW2|r2OV;*15ew(4?<oy^B8}eyPwO&gPsG`*<qpTS
> zD*gk+fH|+J^cD{;OB(R^u0vaGPHC;0#VwL%LyKgvZoh4bo+9xC^Bj#&r~!|Xq-(3R
> zKL*j_Oz2$XCZqnXSMK#<@Adoo8t$pbJ*oAld=980wSob?h?hi*<=cy(XOnj^^d<En
> zq2Z91^*mtq55ezEK1p={#%xiUo*8<TK0f|k`K3Z{BV(FdX1-j9I>laa5aR#Nd93r6
> zKE=E{Vq;f>aBh716a)4dRq(I+biWYsihyxi>C7wQi)!gR?ySGjuZfZfBkaWVR<Ctc
> zW}26V_ at TrPsUuyiknfl4Fvo?<A8_a7-_YylQ(JAyyLsW69UIvB<MHpGVqWGJ80W9S
> z+SVgHB9MTt<~!iBB)|NjuV&BBLH-HTV+Y*Yh>yXw<oES&6Amz!CwwDTG5VB3Vu#qB
> z-cg4=nkV|#C*WZEIV7`2q)_K_L(DazRaLp%#YY77R`aliR-JbwYm3!{o`9e#=Xs_I
> z@%*RYYSa8Z(zRq8QyZcdNPg%AuIcE*|BtSBkBh2W<Ho~Mvt~psWe@?0bU+1$k;`0}
> zq;R~ZX$7RHNwOm{Av0%-sHlK=DVfm(5m5mLWI&PIY=%9fT at I0<b<Bha$q2?WB{O8U
> zGWvekhC1iGzu)`EeD<DwUHe&UJ?puDU$Y}m&S;vem|8X~=rSu0?6R37I at yIXqlH!k
> z)ywBTIGwnV#3o$*z7PJtxl5Ba-`>Su3Hu#2s+wG?b6nBRl2=Z&jI7_zA at +yl4`Dp~
> z8?pD*&RE3jhr_2Bh8(b$sxcm4Kn^QaC0E!__qorl0Bsif9_xWzq}yPa0KA`L*9Z5n
> zA(r~s at 4&d#ZSaP_kJO(cbHX%})MLXpDw<yX&o_Fk%-Ga?A>j|NSF#zzWG|z#2>)-k
> zz%REth~at1#rQPG7Rr(?st=^);#}Ct9<4n@*|v?LEX|v|4rD7*I5TqOwvCgXf}O0i
> zKDfG#Yr^%CAml!I*O)?d3rIc|Xd6_e;<u}P7ndywSWZRyE-rn0o5QWqDe{7?*L`!w
> zeUA>OW8y8x#J2S#cl|ToP9F9eT|8^yR`hpM*sQ<@6?x-atL4*^YGyqNJ)OuOgLrbJ
> zM)*9vmC#talEgG?GxLNF9b|0<wZ#EH#L)OP9 at e;)&r+vW<Vjrz?|C(GdH$W`sGO^v
> z=IeeV>vKrX-zCA1{P%YZ|6qR$<Tm9i+p{6R>$BW6IJY(1GQrj&Mh;g1il=MfGf-kb
> z2>loc-$9*QBl at rmxhLh&RZ8iN6#OxwCo(J^-+tM6oX53Uzkq6wl<#01x*r=0CQ;T%
> zc@`5X%gXC`d%m;t9oVH+L)Q(=eH1A#Vz}TRS at onBZ(Y#|yntWE`m1vzovjuj9o9*A
> z`@x150)F=)_(Ke^+9WP3a)9|vaGWy>l9r?X)sp|3zo&fXw3Ne+r7ae99$ka+yCJx<
> zB25Ngz>v&~{)D_JT#mWDEaSU2!^oIU)D at h{^t)qA>c7Xtr)fXQ6KYT9bqp--G{5Nw
> z-kFlTFi$kPj^w6ge$&ZZmj#_6{b9(I)<jRO?avdrnmLX4sabos))KxGb`3Oj2QKS1
> zj3ass)+~>E#0HD)*V%H^UE}*eC?kD<ak9kepq6nFNt>JLWZ_2)^3pzs?e)CJq>LD>
> z<zKg59)Ws=ysU5`;Q{7!f&VUh!GLYGR|;(Jq;A8`U6*occ>t3Lx|za8I&&gQ3Kq^c
> zno at wjrIcU2$cZ){O$^A546P8orX7(d<O=JKa^gA at CvW>~gsg5ar|7kD@>%0wNu?TN
> zr&H`Kn%Ixm)!x;iUP$;!_E(Ydbeia7?RsDr+!=ihvD%%*oCJQ7G2IP!;4ix~y0bzp
> zDgR|ePkdbL({^)glD#qOxu%b3RntRS=}ze_?uT&9mN`*$RsIfeCErP4VwHBb at 0z<U
> zbF1QaB9n+#6Wh-R%<XduXWv8i3#z-hYlOJ@?ue<PtC<srYM-rc-ZOWpa6RG+;xdR%
> z8t0}$UoR>aiIFcUx{6;R*1iR(<#Po4PSAU%Qv_L|Y2pQaekGfFi;S;l*JR5{?MnA&
> z;j^-$zG0CK*r`~@3r&({%j*-xs59qb(60Eh5Oqg$Q6m!Pn)jk^lO=i-!Nz%Zi#}i6
> zpwB0~4RLAE^)Q}_IR|vhnW(kiQq(va?<cWvnTJq+j30}HH*r%5Z*soB^hEI{w0%!=
> zd-NzD*e##YI~@YADkbU*%@lZD5-;5jI{|b7aTIDPs+ at 0-xqbWu@^w*<!`QJ(HAJs<
> z?(>S at _lU@ld6^kt;_Od{Zb9C8jKuVgelo*M)_aU+V3s)CaUQjdhU5d_-a<Z*-Bc6#
> z05XbjmhM4C?j+ZjVTU8wZ#TJ>qC(y$<M1f(^=r2H`n3|d!V@*zcB8iVEd47}U*hox
> z at 3<7^d=1${);&`#7Oe-(H!|M|zX1mP2Ym#0^bXYk8SW7<M^A9!@F5|mP;$w2l>>dE
> zPb0Nqo;9LoIGZ{pzF_B*ok!DTop_J2AZ6N=hTa)sYhPP()J<Bd?Q>^K)_?WFN1aaz
> zN9t9xcIhy7t}U3gAX8)9YgP%@54F3ySO>jTB6Pd<vhk6-WY#>x-XU785?C at vVtv$j
> zY=yo9o(z8S4#9O?$~s5PbwZB6b(JnUk@?r$N0=WKeX!Haa*t>G+#eOta<(MwGjb1b
> z9T79<fPG^Rc%^A7#=<3OA<+dLqIwJP#Mmjh_HTgGRfpU}j73k>r~8?K{bLHS%jOXb
> z+cY(0f=z!Da5`+DStsX!KC}^bL>v3XW{+meg;&KVPy=jGuYL~oaeQhmG~!1_`gO9`
> zQF}3*^e=MmMm(7`&|7LDvIL{`%H7A;CW^@2CpmX;bCrMMio$PP4<gR^BcDt7jzy`g
> z{K7J}IQ-j#a|4^wUl9qXbI-(MZg{^_b=hP2p#RwGQxp7oIHont<hQSwG{8Z53fL6z
> z6Q!T8oR?FDns!eUd6d|kn#*7JM*LL}kzt4akHP=&wxZWx!W^2^S#e!995o^E|F6OQ
> z{WC~i4%hEM$A3XKy2H_mqZw_meR(1m_6_iO#B`?LkfxA2U%+2YWc-9ZtqRu3sZmcU
> z8MupseiMT;Rzdvw at V~)6KxmHon*ZZh2;==7z%YZqV at x+Ne5q3%Qn9sPKEIyW8F=gv
> z;uo30UuS|0PwFLCcLej-)C~DaEdRNu-8x${=z}2JC}k_b5UL~lq~-zU_e!n}&wHY)
> zjSKcCeu#w`t-^bSUv+tMVfN8<kn0(zyRoG^r06KEc7MEDlf2%l0%moPlyNFxI|}Mz
> zI0<#APoe0eJ?y6#$&35?<n#A+j7n;}G76ZJySfRVt?GCR|DS^VBkHzv?4Dxnr{}w_
> zJwnw&7AQch%w4Vxwv#`2o4_$&zt8Fs^TYVcplkX;*OdHdx^G=+0?y%^9h=}A*(8|n
> z)Cej+^M6ZoZqd5N^Oq)quZhGNx%k$Ip>M?&-wL}Zz7_lb<!{+Xo^>u57`$~;54Hi5
> zb3JgIhkQWc7G>hVm9sCR-s1eaju5mtgw1$+vZAN$5u33!OdwavZ(an}<1|(?#M9qY
> zIN`TBgX_-_oR-W-=-YpMzPWk44;VUA;c3`VU&OW?*ED0yK!?$W;rvOD#$61tizx0Q
> z at 0`_Hh<uBh&F-K_Ep$WP?!?#mmZ1L&=(p{=qh8bQw5fzWsN1bCUNenJ6WPz0lwAdM
> z*zu0cCQA#j*@4eqZ~gFd3G<6dq%^5E1!Y>3wxX|J!dg>moq<@MIrciqrN_Psn2-9;
> z|F(6|3e?3XwNsTzv`OW%biX2L122!mr|A%R7sBUXzy*8V#Q6KP&%LdEE+d=-yO2p6
> zarILJ at U`cfp_h9STN~9*Fu`$e8tjt=H1Z>0>k;TscR2Gf#@m{tBcbn#&qTj>_0!O`
> z;u>t#hJ_j?`sh`aDTo5Ll2 at JscHh)#m{Y-uZcfyG0<|I<w)x;4Oxx3QwRS5fAn&t(
> z#0lbS<-*^fL*U(`u>Nk|EHBoz70s<7_Ulg1>yjYz9WVHB*USZml2;wZamDoz%=wy>
> zzHPxCaqzDdLHEY>ogJKv at Uqb*SbKoC_j4(>ji}c$Z@=95kwaAk`JUHP@?dL6>=9y&
> za!HI4{QkM{<-g!H19E&0`ln-nPWVwC&{gHgP0$$L14eigTS!Za5UXBZz^N$McH*~2
> zMQL|hry<T}B<z`6rlOv1e<kX}n|x!sQ1`5NUs?oZz0)fFq)G!iL?Gq{^$bii`EB*k
> zHRd!gTr<(7(f_?Xc8Z#6)XWh at PI-rFl#AM}{!hO>t6a4yC9_A${PHJ?GW_tIIY%WP
> z=>Jh_g)MhSR0;Z^T$}~G4>RJmLLJ_SYZ>dE>ySa`R6|D9NGpIlb=G$q{H<FklU(o+
> zJ}%zxySMlHY{(fyHq}un3*?($BL1$9G~j5+C)by8sP_v at gFt^zBHKZ>3Ne<ZsR$jU
> zzzpk7;X<jy=}#xH4sX&gJnhw2B<nu88eBG-mI~CN4&!dE^{T|Dz-}{*VqveWjI4M~
> za2Gb=7nxu_-UPVfeBCLBX{r%C2=nT`wAlBL?h at FqZMQzykQXIRI>LoQ4xLNJ4De=w
> z52N$PzSeFT96M4*|8e_Sj4M*FHA)+HH5l^vymG5YT(lMAaE}LKf+lG8K-a2p6IVzs
> zxr`^VU&DVGZ$s`r;WcM?+=Cx5pNl*+QNxq&%SBgf<bGW>y(%^%EEI7QVeQ-cwz%K#
> zlCJCQ6|b}QdLs at 9c=dhB?q}~PQchsrA93ms=b~xf-?ue>3GBDl9ao#%=ZO4I1;kJ`
> zn;(n1C$Qy9SynD#*;M4`$07!lQ#V`Ycn}<+?+XpXyn(CqbLCAku6sQXXVxSO6QijH
> zLo3TpA+;d#gmI{k!J58f*~C>YCXS;}*A&kkhUX5)GnL*)qsAw3oL5`*oM(*}uO}!9
> z(`Vp)zOW_G1goLRnm(<$e9oBaqqL&!^4wC<dbvlhdY1eFi*a+!S4MUF%I({*|1<Q-
> zvs~-(3izHYxaA}c2zDAXU%x8L^bT2*MVH|dAUL9q>3$fyUd{P)#sZ7_Ez$abr|mZF
> z>sQyxpT3D_r?Ms?Fu%8;eH!D%fs<_)=6EA_I`I3$eNT$kYhV8UAo?r76f|^=6wmQ8
> z9$8f^O2WB36KtDvCME65yodWdhw?*~lXd_T`sMF)HL~7r<R!G-0qz_v5 at wk~;^TZL
> z8|!=b20#W60p2wkV?kCt>yV)pSWtQ3xgx4w?%q92?ry(MKS|Z~7M^6+1iMe}_^Y~G
> z2kcH-2i^ZkV at +>oN_AF;*cvp7I?-DOf5W6|;LBA1PAjTWFg-ajpjpfI9tCb<cJh(l
> zGFRq-C*{HYTD{;`8TP%YSgx#k!5y;iNx74KC)xL+wsMKp3m*K}HIBh+yvcFSjB6%Q
> z8h&5LKW7<vCMWvOb2vZ#_)7j7$$wq1;;-S`z$virMbTUt{8=jM2d;zia>fk*p;2j@
> z$0>ZQK9?wlCHs;oWWVB$A9z<N>Em^02 at m8P6sg}AnYjdh^Np`qFc(hUl4Bgbjo5x!
> zt^lz%_X<5+tIZnJ3R2^m$ECI%6I{ynt2{ZmsQ1(zj8n+`mO1X|KT)6s{j?8w^+wYS
> zwq!Ffa#Nl}PO(CIhWQM*U4Q={$77^_<Rkmd1-2AZRCp3seA2~=`mQJNzY-Yl_ke?S
> zn2{px*u1_G@!KyVFZ#u-t#|RC$O$CZ0zL{^cMg6B at Y@gF=}@$nBM0?r@}dJB2T|95
> z{|;IEv4;;US>1QAv3?_1OK=V)vYr^!+^TI>0oUedoD<<!NaC`NvWBNC=N<kOa)6BB
> zOp3Q7|Kqe47^A4Q{vg2bZT9Avw(^8l?StM$*xCoTu_6CC7dsQ}EdZW3&c{j+>-z-w
> z$+-<jwSi4F=bzYcQXA1!kN8nm_pr?pJ6`ZIV!=ypMQk_~HS<P1*}o~q at oAM&TO*~1
> zfiGFBdGe=)XoE;T>P?$Q?0wcy=3bp8M*MUE+6P%UHn^*ieq#N--eknCpW|b*({X(|
> z?ybM2-e5+(k2b_&ry~cQ_;Z#+emZMdvr-xr`eqSu5=y*LchyIBojrey$2o%z)MlAJ
> z8*wp^{U4h_IcJI1)c46zPyGwX9e(zVC^7v2u|GSb!s+|^ce;?v)qd9gfx;KD+qG%(
> z9vZgFuKh~HZWf>hjGui{I>8D&>}|!qSAd at g^h-KYD0HpA--P2wsw*;O8xHolyX+$O
> zbaZr?bOT9+y~&{6g!+A(WLmK|>P8?2*52YlVrO4D%J(^RJ*-o8lBV@%z?;TOnm*{2
> zG;R2t$k^JjqiUzf^A at p9qfUg)ITG<nTk%UKa%5Ze(w)3bTaCCp7T>TI<E}NsOk&~+
> zoSd$+;DMCnQ2+V at p~K at N@Xa!Ob2vSN$CHyG{{FF{81cu*cxmD>V$l|2UtECg3)m*$
> zNBmY>Nj?yH=di``1<nr?_tCyaU@|=L_Iq;);*vl9c8iv4O9RhUw4dl1waC#dSNt_t
> zoBh^WXBfuov$l#qpRJtlk&pYsD(CA1<EteX1)14$1xI3Df!ogUYuPx`{`{Q3+wX)u
> z;N8#p{;EG`ZvQ?i3UQC;2o}UTU_odt0kRwHP030x?TY*ZM92Dk5^!tA at Hkoom(dNs
> zXPb^-&CCOC=gTXn5V|670T{NzWx(tu*o^r0{3ZA;#c#189{SLh_OpM!Ss7UsOXd!E
> z$!`3vVSd3@^~o;mHzLkIqV_XJ!^a`F at c9mNFy_Vw5qov>(45~k*uSI8fMZ%t;=18i
> zx$G3pSLhGCQt&N3{{dpW>ykwFTI5o!MY}q&2Hy7-l``97q_*vIuvSXgM%q1r)qZky
> ztw}Yh0^0!aH`t(ucX9tV27W7l;*%Ud)HK~feaDHtEpI9z>rA9h?3 at 8SfKjMPE|xCM
> z_<{7B;3>r1A+F1VB{Y709DWl$Z$a*7og&43V!PmV`Hg(PVs4ErM$J%QIznDq!pFy%
> z;GesS_&MN+$Nvl*=70G=ned8J)MtWhe0QzLu1 at mnL5`OP3;Tsi8#s`L?F4*Z3BerB
> zyaqjjj9nJ=jHQ-GA9ZYue$VkCY(~eUE1QmKCc94c_e)F)MSWP<N0!5vROn=kAE$)4
> zr#2{)j`SuIzjE(O;M?#s#Uu8iw at Thj+4ifFj%0~b`f!}-quGNgEpHxiiq7t%<x~e(
> zwx*Gz6TZGFKMUK#sRNvv==xGqACp{AXdQi0p5|K>_OzYJ>XcgLqc)!Iqf-I`$J!eM
> zlBvkTqR|%rWP9Tbg+0=wb_swkf;Pmf{>p2th*hn*WV-E=vzu|9aJ0d-L at xKPsZy2f
> z&5%gVh(Tyjj`FD4%_I$&q)CsEhhSEYdZxytEZMtH@~o=2)a93)Qsgx%kl&~*ub5rk
> zH4HiPwK+xg?8e*P$I{)6vbC}ieK}I9zL*xOTY$yLDT5k-iE<(INN)2VUeZ(P;q^CY
> zd9^p>*jIp8F<?m1+T?1=8m<tv-EX1?vcll|rrwGqHqpF0qnCs(7j<7;2_JYH>@o(#
> z2TsO#poNc|?p=YjV)o0ZFBY|4_R0z5`ZfSJVs`61Hx=}vs at D0knig>-`&_`H>})x<
> z{)={z+MW&(uu_JRx-w12&V<ziUqD)?@7-$Zg?^|XyL6y)PSTO;h`BADyN2K2|21Nm
> z6YZs;?}}c!I_IC-s&T-k$l|!>>9JD+tNkG-!d~~zb^jE^E(m-&=Pd0!t4TU?b<Qkd
> ze#+>%CaL{*E<lEOtDXhbE#&ynbKt8hrjdW$JACv0u(g|`rs!6yMcsXzyu_L^|864}
> zFzD0sl-hMf4=#p36!WjUcq_4EidKT>I2|I;ZxiZYp6i|B9NBDHeIIjX*rM}^<y5vd
> z%uzv$>@OsG^t?eMU(%V at e^mEff2Hnw{I24<$5B^b+4CxX(N1}vmHrKSL~14L8?`7K
> zJm8^3#(wdw&?7DFNqcE$h#<1pdv2A#e9aMk)vT&S`I_8cHpH_jBC0Wf2L3|wApQc2
> zniu$A<(qty$72}!zt1=M>VN*b+tYl<i245(Tpv136knzAEKQUrtib$(4Ws!%?3DJO
> zdV0WT+ghtfteP~YS2CQ*nP%L#7V%#j6~?2^5O?2d3FT0Vd at s`O=pPR|)8{T-47<ht
> zo*vKrN>SHECt{B1!2Z4Tj6{t6e(VQAw!B-Tosiq at bQjK=<^QWKE4;IDqZH#wMEb(`
> zaBXngjuDGHk02-Vh}>^$m0^?nZ_d_E(@p8ii$KFYz!$vIDF8pX_sTNjlZLM(GP51I
> zGPJl3w#^D!h*({}?p<b8J)0_2ILNxNV*~Wl9$_p8TQl#Y6*afVJ}+2&$5F&4i-ebM
> z??Rr1-FR_rFzCNPc&V_%cx_D{j`fUgh|+GWii!qatJE$7-!qI at jP|XH-;R2K4YT~a
> z>u32Bc>p+7a%0DvA&ICRn0sYb3|EhBH`((13FG|EwdAP$N3Ou5P1>BkAGiRYHeZOH
> z!u!II?|@@V$uam0Ma0H{dC)t2`Th{dO94DRzfpSJym*OTS^9k=FlnXsm>uKYtD?s1
> z;+?Va+wbT)Olcy}Ignht&eq*X{?`}K68?AvJq>i34!g^f_A>C(Q-r7DSB&3r^tY4D
> zLx%`-R1I(79IjP6#v`|+r^K2z-(EonCIRo*UT*TnSYX<^MyyH>#dj3QJ?_@@mUi0i
> zDvTeeg%}rbiiCkach^Oz&3Kys_9t)E^KtE)czwxjM=0rol2Uqpe*hN%TZ6-+<8RtH
> z>2=F)pCkP~d{fRCqZh`Q>9WE&<INCbnN!iWe#GLb#h7nn95Kx|W2cng-~u}>OBKd|
> zxM`GSR%Hw7FS>tB-jy{Bx<9a$GbyQ=_o-c{Ho<liN9<)Bd=$VC at Pr@XxZbv|pj0)d
> zh4|;4!LVIT&CUK6^3RnptW$o-+xAO{Ms9L7?sFQnkUIpn3g-{;KRV6AL&aM>)Ws*o
> zhg)=0ax-XqK&lJsJj<!&#VJcIP8#$IweO=tjHUq<wqeF2aUsTvezG5KthlF|Y|X02
> zS|M6 at x-X=oAO*Jf;>{kL at w`JVqN%yGu6t)Ka>}`o6sGv3Wf3iMJq8=-8R%?Pa`zqv
> z`_<6d&O(1<Fy4-Qs4`Y0h8P##fxcr8b}uiKS2u7?3SSPG3p|E`JMp<9M|pC4-KxkU
> zHt8qfCCGP=t7W&w8|J}gu(L8MB at Dk|@kQE*E90Gx@@uevTKYKDq&$Z42*6nFi0 at zH
> zbXy<xP3|w?5HrPmjv9LpqX!IsQa|66RL=YIzVM^s510PDOTK6T*eTd2`o*G01W!F`
> z`i+ at M!093T&_7bK{<{wC>##2{JRP5w6k{*Jc6lQF8RT5zoSp#fid;2xRp?=eLyH0Z
> z-?mjau0f9YfqKAM6b}rq!Jom$Mk(&Xj=G{a%|p#R*Ssg;5%LHAKpzN(AKkB7_b_kb
> zXo6FG#ynFPWe)CU>B-^-f7y{D*u8fF>!T6t4SX`q({W#W!k>t<x{LW=vkrb;&};S}
> zKS=)IKm4H2 at jv{a75t!R-kA8G!3)fTdVzE{@)7F)!wbGUNO%BZ3ODx4LGM5L_gqN0
> zOU66KI&!cGty5MLTEl*Gu6H+COE<p^dn4AH=m-iJxIK(SmU at Y-pFi&-HdG>O=E^aS
> z*+K>4aUQsq63plvU|CNZp(u!YZPgq3z~G1q-M*t(l(r9Xo8_28mJy9ore6)LP$lp-
> z{r~6MsDG~YKt0%iw(=2>O_6(cX3}s)LBCw_8)UwY+4pj%1mxNqNi7KYQ4FXFx1~;9
> z#4>)c&Dh(I`JW(|hT at uYG8}snwNcFRalowv=1;wt<N$N6K`%#5`S at dBzuzosnfMm$
> zEOd0Bi#dFn{c&s=Y)9hQ<Cy0Gz_c9$ot47&*`{?qmVT~?&HQ4xWk386_;ybdFh|K&
> z9V2=Xasd3XmGi#e!!~3F#UCkNwYK3F at FhnyZD0&#@OvPZ+B6yC;<^h5U7EY28~#8Z
> z+kVpbV^Ov3g0Zw)zW$CuyCKgo4lxjyhv&;<mYocMUz(ZTY*Cy;jF+_i*sq<y_=PQI
> z`mwbbGwT~cU+Z0m)aG;mmwFsz+)34}t_gY{-E84P;Cl>lNz4hZw7m&lUIiMNZ-7P{
> zD%qcshg)){W4k$Jv*F!%vs(1cQO>GxMn}wF(g&N|m8(3jWK2&HpVXFZ`04Sk6VTfZ
> zfiE3X`b{VJ569YQ<hA)N8o+%E`TM at aGoSn4XY%~eE;YkWK7i+(Qp<c<V3V-SjTOMj
> zSgCflNge2ij&rDWcHS)AZup2QD4r;`7(R-(A=b9A3V8#}9O(jrHR)p#Yf;ZG(x+5B
> zANXUDJ~iS+xDI|ea$RNP)??ym!)P&s=Xsib0v~Rt;uy(FR_!MiW^G-e4sLRvEm5?+
> z&Og&3-4qpCkW?&!j5!mukx7RQVv8UKs+3BD+|z?RjPs~%7}#V1Jw1(SvG4^es)DQz
> z<guws?P{w==ra&g-a<!EuS2J40j^x!K(bG*p?I}3G{(+wf1+;&2xjB4U|{0d&TVx$
> zB7YRk$SXf%<R;X0U69Ji=PzP1vqXv}M)<2!T~zS$#P*M7-&<ybJ=|<S+&2IJPx$JH
> ze;YWzXj`1&8q1~uYgexFJ7Mxc+kgwGLw`m*PW-ON`m#o+u*`)@_FNcZ(>eBRrhlv&
> zaYScu?vUwgT$dxZp5H27=v09Ij at 8?v4r;RvpHNOly*jRL=3 at h<;1X+Da1f*Ptgq3p
> ztzJOOU9(W{ij5d6-gACy5PXrvA&ds^^$udr%Y;9ff`u|Bq>?><8}FL5k~I{du1o;r
> zmLH`>YFTci;iZHE!zbdpx<EpU_W2srFok|pasHmPz7D>09D9Xp75aqEF<Sn0FMf+j
> zN!ks+#kl5tE-z)SJhclp<z=rnH4J^Ln%-L|mx8Ba9IJ_)9lrCgSK0!A{b>${y(K)z
> z!fB{On8QYsrv1#Va?Hu|!uG0*@I5;`ju3r5>NVYB$Oog)PuBVfKF2xDDVOFUuKG}2
> zQ1i_Z_XH`&)%<ar3G2IFhnVJjNo2mS=Y4eJ$T`USh&x1nGy^}~f#|^8<b2xo2s5>L
> z&xk%3YxI`f^?FNu!G1Mjs>hNXVbNJ<F7l)z?6>K0#$I3~0)wT$Q7yWBFw+e_Oqs_d
> z$O)62N@*OU@?iBkvc at An&683WZbaQRvu*F)A6=Opl9Ijj{H50#q#kU4ipxVz?h4zm
> z-AHok2+mQ4&hDf=6AB9Jsm<IE$8X`j-l6+?>G|4cEz-o0LW?V6%PAwlnj-Uz7ErnR
> z3cfuRXwP5rQ8a^Cf;5630eLs~(ny!Hno`8enbyYUs5}oUOS>+%h!q2f`_F}MsUqb$
> zw&HyeTaq?m=?RG}<zL{l2Ms4!)SVN)f%xb3zLT#rSX0-hZ?Jzvdn)?VHNu-!L6woM
> zPm0T&t%NVxt at Lx1?7$rHe8XDs&m^kjTUW(RGA9<sDEdv8yUIAl)IEkPi8a7FX5gbm
> z+YvY69%L|FVQW+D7#ktt1dLPLyZeLQX`3hfO7ALErFz(biQAJQ_wU+Wyy}$`hP5Pj
> z6!#^IbuA;&cS+rqv=sa~6BuOg;ax6oMH)U^`W)upa?mCYJYf(+17pUfMjOYaaA){F
> z_t<QB0>0XDJg+>2TINfPDq_3REg^QG9dFsa=&>X|)gDND+Aq>RuuV+O9hI1Ghiymj
> z4H<*c7)y*Qksnj!9`au<5ZBVF_5-M`!(=@Y+y<uLP4vgd#qYOo>-q9|<S|eOxUKM$
> za~?m^yX?hS2Pd`OM;!zuY$r1lG{tYfat3v9aybWLlP|eE$_WuZuAXLRk168|O~Cny
> zm4%s|9 at 1)H<ucAm(t4*?*%n$t)k$QvUL+O;dU!X#)hPOqdv*`=D8D#4=s2gD&<L89
> za9)IF-UhTOr}sR`Cn>)u7lPM$vh3DTLo}R#{0krS*%-`WFXT)3VT_H#HU#+!QpN4`
> zaL{>t%1io0jCqB}azeY%cd0VONz at l7rLgp7s@U)Y>HD`L at t(bd at 4<YR!=9q_SdLn^
> zSZm>H at F6~4_%1yY8w<k_Gw~j3-3o2<24sI@&RpocK0503#`p6+d;Ik^!A^~bCt`Tn
> zyIIKFmS7(|?QVKdx}jhElF3E*K4M}1+<}-D;5 at QAA^g+IAlRheKgc{S)$_-mZnika
> ziTCQ)%k`2b-FwUg;7yTh$3tE-58XEw`=!`F at 8PL84IOhAJe85lKfg$$u=9S-j9gqd
> z2W?P$cw(*T;Qzmkd&qN6<M$QL1>+~h{!JX;>fw1)CO&}q7-tU92CHK*rehzy16jP-
> zut?i)V8CP7COA0}Ra2atER<K+PnuN18?bTEs5xI#yvj}0_M-4BT8Zn?&&A2e#T9yN
> z9^@DN94~>4cLH;X-TXYuZg{TSN=wD%f6pWRiSDEDC7wiG at HD-v0&Drj>Z)MmImpG9
> zfceymSkqhRrv8icBoFWl$jq?;wV1mViHLn(i20sjrqY-#Nwtyi$0OdhpiK~jb-F9=
> zTS5E@<Y^zq at 1Ro*+k;;`i`;RO-N&Um at oD7TP8{shN5B8wr at tPOPwOk1KkbYBrO!1R
> zoMG^JNJzeow9If=I?E}QYIg)mqjt=Y&fgIxox4LNUGz^oCh^!G#BUZ#WJ%Qe`=;k|
> z!jCQ2Ru^dR<&F(qVK-ooAH^K^uU566>$xl~3yq^H!P`svY0RZi;PtpFZne!%U@;dg
> zkUy;#rO+W;n;(q0_s)@9?!#+PPl at n!)YZ70<pgdfuwgc}bV}a?Z;#6mVGds=*Vea;
> zxU}@4Y+_d}mmi-tdus03Df207=qf6&ae9x98&@5LHMd%)pmIZG#wx1{$DWf~@xM3(
> zc14pv^{|h7BK3dX70bWNyJeGfl{1$z!~SumO_g3j4+}I0$n04L;h-+oNl&e8+gwzj
> zd(2pHXPx#@{>0IBozAs|eX&N9^Q~E$-jotkntZOKlhi^;g%0CMr4_mz55OAYKeUDf
> zaPxr)dx_L^COlhe1D|z9eW6>Dqc+aFuC&bK<kg3{rnc(o?{@Cnj6AF~(X5)pk(32k
> zsQJ#;5;&lRuYi9aHkh>8*{pVV+dTMe)&1K!&6tQ?jpAI3AI7bYDrj>B&+yQG1>b+;
> ztq+WzzXsnO$0?;J^-Pe}uvTipd%rR;{8|ymiL|@XCuiDR(=u+UHZa*1X+!FCd;P7H
> zq$9g5R9xB&iZQFAp&LjohE}0Jso$9SqR?NzEa;S;f&3J}k9X5P<@!d%9G^lRnmRfO
> zxvL{7W{3yx(?=+rsPkAuQ&cUETk>;_x1xMYdJ)%loA$=~r0)Nj3!bVsTvi+*<5|-5
> zQ6V!!xY$?HOY*`FRz<{D8B7?f-qIQauuEb+1$&5(4t!@0p$F)5P;U`j+ocrOWvh#v
> z=p$$1>6E{2GDhc3mGso at U}+hl;i<`}k**e4vXxWob`4%v at vCccBYf76wyLDo+j2oV
> zKj!@~_eKx4IpYE4c}6MR#pk@&l;7g2Jvzv`uGxh(ec#&H!f;p1j^u<erK9(vNs$l+
> zzLJY$<{il;!j$>&2 at YLH9|jL^OUU)zFEXPIQye<`HO`y8lBuQ|^vA$QR8+2ZLhY||
> zIpmh<RBopn{%Fzg`py*B<N02$M#w&9Ca4Sdipy~AL0^dovA%*S;7f!18tlJIA+Lfu
> zSf&K_W!e)D_6L=F$!G9uOznmU!tcSKLb?#kEUs at u!BOxsr#u$8nGw*jRKV{;O)#t>
> z2l4#FhV25#3e-WJiYlg)DA1TH&eROa74Hwm3i5G{t(YG~c6#IW&B(zX&S~QB6>mk3
> zvI0C)Z3oXxAhAVb^(}2nM;r)ZP<yWAjD)Jknm$%?X<_?-NV*L&<?9a7lJ?M*$eC8!
> z4}qWN=$Djt&?<qdN=3%O&0M{!_L5<dP<8Z~1kW4|=FiwpYllQ2G0dK5!8*G=^r5&i
> zHNak%s<hXkZo+Q7JGU^@wHEb0^TD at HR85fDm}jXEzg{X$=8s)kc>CJ0Sv%9iW~I|{
> z_5;^mv~TBB-WA2V$MW}2u|MP_v$hi&+;0Niq%S-M8q{?D3)pLZ{S~}yl_u~r+(T_U
> zoyST}s{I<@VmAGRIC*#2$*xYV$2cfq;MeDA4*XTb+OQf?Q at J)G;UxStMVzC|M!!+X
> zMmJM&_~v39uWUnH8kvJp;o8iWk(k2~OHZWxx>u9`L{{4{DVq0d at 6?G)XxRU>feB at 8
> zh(W^~XMYWDKil>MFKZaH<*A%TCW`cz-IxXJh-y<P><o|EERGrRCrr>k9Mj1 at _}t^r
> zHv-9hOHV|N*Jj>nUF*zrA~(8yy?^Gz4V+a)bnZkh%1yhC%rlHR*gpkR$ht%Rn-I^+
> zKbL<V$=T6n;+HP>>#vCtYq!A%M!q*4wjdk9c>tcmYR(~Upr1q^KiPc-n8G$L<{w!;
> zpXkyV4Wxdqmv^&L at fYGa4glu}vZ9-{cr*A;lKmm=DcDW=g~)v1GY2v?FCyram-R9X
> z_Y}^k;ktzlns}DT*I0jwA=_)1U}B3xoZAH=bGnZueoU;j*EmO)npSA7*{pDJ>K=Pt
> zVfZWCxgYLIIaMEY+W+F+V at d+j=0o<S6P!`ex>pgmTZ8Za1o6x)Xz_{jN9ZY at iFt)%
> zTyqdBy36NMVxOT<_#JA}_5~;3amsnwexsynN+tX2R;dwVb2pLUfBsNh#>>BmN9#_O
> z!soi#!OVo+{;C`pT`6rQA~!>}_ixhfuJU8QNDC)2w;OXS#l8hH+-+Xo3?aOH(eAW&
> zDQlyjaB+X|f7X{4aWvP=BG(`cbzwZE6?#T+*H9)5-^EUlGlT0b(V-5vX!$s at f8+_C
> zuLt4X<HRL<RI at MbQo~oJQCnK)M=+^L_PVk_$Qv^kxqdqz`5V7U&m!iNuYs~781q#^
> z?n^0WNL+rCC!4J*SIZ^cKXaP$8w{DxlLS|pi1H3OXh&pz-#I<?zH@%5<!Qp-GwG(D
> z0gsz+&&9i{!MBT3H&T#^_&)A498_G#oLhlDSZ4a(V at 1X$H&ruoE?~b!|4?y6H$klT
> zYyA95f~-3k`Q+d!hBagyL0?KCeFeQM6na-6^seWL-u3n{^ap!ymb6SC7<8KO9=Ts-
> zWY=tQ75d~~1k0`K1+j(iD`jQm at 2C0x-VaRc(@`bbJ;YYC<K6NAc}V+DZLYFf*tDiP
> z5%=I2A^b=`3Vjj^`yO;0%!SfyrGg{ZZ$sUuotHhflK;qOK`b=thyF070sdAK+8 at fn
> zKE>U~x|`x-rpqy3N_$L1*RiRf2adzJ6+=41<3`7;s3~C*lU!{3A#x2jj=Imc>1T33
> zKjzih^8P at 2oPtCAzHo4kU_Jh4j*vQK=ob}u*H??~^FAbCvTRR-?5WW<Fly>BWCYtc
> zm*C&fVQry_4gtOC2gNOiXkE1acjHCwlJ;Zh!`<9i_<@qe*51cF(&Wm|U~hvitUF$i
> zC`&kU-yBnUE}(n{9dY~!Ei0cPmv(n>zjU))_d4K!+NYb6V86t1oG;|htI2ukZ)(4K
> zHndcHQX(rmP1ZfwWd1OGDRedbh`7rU-38nec*f)QN^aviTd&-HlzXajUS=WiYKIk-
> z<2eEU`u2DM-DJ$WqtM>Bc)-s5r%<1-<ZIO&zmq!Bmg5u8niVfrW8M8T9sd2yDy+xY
> zcgo1K$UEMOlw1;hb|<2~gRV>#n8Lu<QTG<IUBw at hQclc@p;&!)(&o%YA~W;j^bc+Y
> z6*3g}e=VD7UkrI!<v5J|)aB!3UxyV1=pJjU9&w;Nj&4MZqpJKVd4s)yo{Tl&1#CUR
> z>y_RO^dft4=*waY$u)p&_50KydmZXU1Ml}m=;Tz|d8L~M^<x{LyPkj!ct&z*;?GrK
> z)R|)1ErQc12C^F`FxkinSk at V2^)Kkj*d_07pl7;8bS7i2tTL9yxhlHvo0o3SM!Ynm
> zD!(irCavQlsC4w7mJ1V1xo>7SWQI!1<?2u8Wux9wTu at 45pLF=y{a;D*@<T?~XR9Iq
> zO(|b5_Z5mIvJ0b_z@^)v2jAw*#%r+>w?_Gh`^?Qh=CH- at fyaw3Z|l8oeE1H=D)iA6
> z;Oh<aGx+uhd^_ewMtj1BuO+Bc@^W+eh<-szzKGbsb<sQCDq-);AC$p?H-!K#s*r0>
> z;P%=uhgx8_YZAShZ7J)ds|CBW8-7UcxlCxg<op1N5R5o*Dvh268?dVU8Tlgc5<=hC
> zuqE^*F^Ma?i|Cm}1*vn_|0VZZx97aVJ`;Sk+hJa5&2Gf_mMCszGt|Ls#C2xu4yp#7
> z2C`Y?GShC#T at h|(iR_E4DrNme$79{qpsS1yq*%<qZuxZ5KMCwExf=soGNA*;kC6*d
> z#f<@-KZQ>J1o*}6pej?S(fZ>hH?!RDvs1nDr272u(ThyayERlzhTZH~0?R!wm=bC>
> zR*|)TV+7xBcH>MpYly>M%Y|UAPwKaD at Q);ZZ~p{3l_m5O#GuMNV((Wk`5y5CD$qGL
> z<Bfz4j%%OXgE;TZcN3h0vKXnq=CM-0L|hW85?kvL`-}PfNFNOzKw=R=pZ8T|fx3<G
> zBQ^&i#&ptj5;NlPK^}#d|3RV`BfsIdXs-lkm10UI>?Xz4%6JYk&O^wg|K_jNf$kcr
> z9`atXbF<*z`o9G3&Q{+3zt*ue0kssVR~=R8gEj5RZLVa^v&%W3@?RYbsTyt!@-qJN
> z3Po+jT=02}{hqQk<OE{9ScG?#5Lr2Vde1{&SvNUnkjPrrge!UuMHzKVFdu4*-^MtR
> zz{b&PC-#-vH1xIZHN=^c?dyW_aAnW;c%BWqjqO{Pwfjk&?zfTbm0y)!pP^pW4Ah(d
> ztnhBxBHePA53v6-!GGSi#3dE`H&D;cx-EuUhOxPT0UzHEOjERL0cuO2mV70f;1JjM
> zJ{e at I*Tgp(N_`kZWhMK1T)LH00KZm^JdjZD6TWk at Uhth$KbxmhP}wDVmUJ%ezW|wL
> zE#|s4J*<5d=n>2L*e%>-*h!S$W~`4TLwukUHO&u$kKatSQgse9)rUCd9Q at Cwy{KHn
> z$;3ZUXR?M)v*-5Lx at dA#n;H{0QfG;6%U_1v8DLt|KT^g&LW=f5Pm*s~RFC{o>MnOS
> zeiCG(Tg+4To1C}(0_TYuL!NdA?JXQr{MOJ~^Pz&|fi2cAiRXy?sgI72i_+?rAZK_1
> z at 1y#QVCjv0|B~2lCN`#Q2K+!XzL6H%55w;97a0TEmvh%*+*u{E#D&)I<~<HS!PVmT
> zV0ZO_&b2w-EFU!wwY)xHOrd3+S%=7Z*h2hx{_#6G$H(()JXVr1;4Ayxnhx0->uL^s
> z6cc!Qj<j27*PwFJx9LKm>XKM^!#Q!#HV3<FAES)7Vw{qE*Gl*({L at 2#Wq>UwsbqsQ
> zU9903+*7nKCzRuP8~Asi&X at 1Dt~xpb`C5{m2E%a7kI`keth>S+CSR6)e+KnxTO at QH
> z=t;ok;NSP{$fethlW|S at QpD6KZkse1hmhkQcZj3Yz3xK)@;*A)e)RQJ*vJ1O^>l?d
> zP(Sk6Efdkt{?pzn$=~w<G343EAwoNw at C~HRXk#ek6$WG3iku6EL(E0-s?(8K73`HQ
> zN^ivQ_deJb#$ItJylw$<3SwOm_ufy|k`CX+^<*27{x7y;)G+o6N3NOeJx{H&v#{+;
> zfGt(3H$ewG2)|u0V&P-#5d?bz+fUPf6fVN{Uxw2-KgWBOek-=ya9xD(B^(zUZo<a!
> zF^+w5+=lhHgVuY0=)0{4w$l7)-gg_q4o?HmH{n~jQqXBNYU_L|MZDqRixL?%9Ws*`
> zbK9D}3pftH5xg<&Nyt<qP`m7Go4{M7wNhIK<ZVjC!Qq))1EXwHIs);$N#y_iNFvMK
> z{Wb``OWhLaVTb#XKgW4 at 9pzB>uPsUYQmVV%OCo#E!P_y*aBmQQ-wFm}$x!P3<&fS|
> zY=VE}_m_e!=&Qr&s2%AT!C&`2GX*l0>|QD34w*v;88Va|{<dldd|kqAPP#JkUPn>K
> zTp99<w%uhsBPfS at xt)!Q*6vA99{R4$@YiLQ-+rlwf}K}-%8)5HM`H|!D<-}zX?p)*
> zxN_pV<emMnaiD(t;rmVeyBpMjcEkt&dfVi~w<9cSiZ+`G+K>@Gec}@w?9Djmh#s9#
> z9{$us!H^unMQzaTDb at +6OJrXarc2lg#MvXimR#F>A-HMc<c#I<aSn6a1;?{wy-b+2
> zr$I1>LB1{YoF(`z0I#=jTTm~zsghl>xUJpc`~R==-Bh7(hT}Owr`b)PVjX$H-a`8f
> zt|ckYK}Mm4QD*{(tU~l-Z9mq<YTrNZBHq<g7qtO=dr)rb;#ST+T&xpZ<-CCjNI~Cv
> zO}7MVn`x&q-l>m<ZSiWt18V?ua<WGG56*p42)|wyIDe4V!TuGeF11HOel|N>ivs8-
> zY7^G4cN{TT`_E#o-N1I9j{&mpVH$F6zNqYFdWrU;VG;C7#!ZzLK-mn7P~XT0J`hjp
> zzkDEW5zSjE%N_;V)r$O3#981O#ZH~z-=?W<)?IQ%U)3didp*{@AY%U at Jdo&S32Ee+
> zco*!=LKU&kabfTgD1Z4bwBwf_xS4_}*^K>5&Zm7?Pjfu#J?Ez2+FbCOI&Nn4eg1v>
> zA!n%&1Mrt1MSo;)4aHg$x$il|#Sl5Kf#A4|x9x^qer4rpHg!g|h1Qi>H_fB!nzxPz
> zF8Z?y#3h=;Wxwpf8jolA9Om`vX9k}Y5Mg&Rh#%U%8S?%#*rr4Rm9tHZxTc}^FQ(%7
> z^;_nq!g~8#R22GTe$T7G0St$qCl>J at YeC~&CIbCEImk+`jk=<H-6>mgH=7xhb9KYY
> zymh1beNWv}pv|}x2J7(t at E>~iV{OZYoN$0%XU~<%5*XSQew;LW<<OY8r;ji`QbKN|
> zHPC}(JypE}WgqJfz}~L(`hW`q9!sB>j{X>NreVn2NkjW(_EWSERh_=TO$9n0#~6lg
> zJ@(jrb8|TtQfAYYOs&GR^5rT!<}vkam6TfV7?S`S7{A^85$YE@?m|Y}DK>`xV1EZ|
> z-C?xpaDFU&B{%Twv52wgw+k`8)v)t^LgX7?GvtB>@X)<wE9g?MbAxmr{~`1`miN=F
> zGggMKG at 4KkVjS@mq at dOv@dp^*E3?uCWc=dZJfZ`@C!@f7iXj{4)|)e%P at hWS+6RAF
> z1J=}Az+7vf6_D>CpJz7?ekbr%!Z^&Cs)#||Vf|F;X&N?4U)imf at SPY-x8`Iksq{Up
> z;&!2OygBDeywe0Zl6zvjtT=hRx$67`Yv@#?mD3I0ualr2+4OiuqWIw#lM?%(R5i(`
> z*!xnMRW}_n6l&oPD5VyQnk`5rGL at R#XMc+Jaf|Rh^9zy5GLUCUwtEJ at -EOo@20dpa
> zuvO&Ru>yC~GkE40JoBAZD#VG*9c<^X<esx(_wC1=o9(~RsOdYRU&HWYZ!@lcM)2=!
> zCFVjHRY&+qODJ2SQwevP6oQsZq0oshCv5!seXM_fl&#3R44vRT;(K20EL4oXt!I!w
> z>eJ;#tGXj-;8O7RG*vufiU5BbNA*FT^(XppVmNj3A314{-S|f`FDHq3Imws0=QI;J
> z$;*WqOKefl#eL$<`XpZG+ur(=!fCit?>XXMM4q*XX!&zi=cZtrbMqjt&__dOIfXeE
> z@{hbt<}=1!!UNcj5l51{9&NQ`BR_$cS&x-<>W1T<7hsQ2k$H>#c?nL2$mo*^Pr#Tt
> z1AnOx>P|PeT^R8f(e=ll#kz>tVG at 7D%aeqrW&Q%hh0Cb?J at S+_64_@FwqPP#5&7Qh
> zPkHKJ$eV*d=10CC at 5AT*8$DgPa!7Bxr at yXnLZA30e46`L5?P*${CoRJ$R1yF5eW_4
> zJ?ix|BgHrz at dM%Q?l0iF?Y=MkG8cN}>)gH7*1yl;`X#gq{8H34idI0cve+5u8SDqD
> zRVtH|s at tUm|NM;K-hSR;w_!XS&>tb!*hi6Z<@f{rdUf!gjab7BUqDv-N>qdAMmuS5
> zn==*XzX4w%x}DPdd1Awvy+EMi<>^y`-NiKKtLva#O7d1i*NR%<|GT7jwadV#Rq%P#
> zsdvFQ=r^C}Zk}lYc77e;&%v%dc%0hraG;%j<;ya+beGaI;rp0rTzJLRD10p_<*#1(
> z at B*}HXWBkHlX}Zu$2~*+LGYbFT8WrM&;GNVFMP`vQ2#2JjGaVDVFO~;<^1tMzmO7b
> zdG5V$)K8)v`;xx$$5`Z&DWx+P`P`PEe9W_4_)t#5CYJl7U`QtafY{=RO>FSnQ>3t$
> z%YJJBPc6nAxyj6gJr47Y&<lPz;xk`s3jSZcEL}lu1RYlmjt}ZP>@OtiKlpkIkpZy&
> z!ls3Fi{MXw4m@%xb%=X^P$qaI0qc+r`umT6uQhJJW38#>X4*?RpLp(m)1dAb+~o0L
> zc)mwC7eVGBFu-<Fapc)UdIRP&Fp}ZN-Xo{JlgK{*2y#pX(XoiVoz~flVLupfs*QWU
> zBskE}4~liCBQqY9UCStGYaej~`-jV}Wxa}da25amBJ%;ZghJST?*rqhO>9k!v3~;J
> zW#grh<6(!Mu!d0)JG0>584TiWzJ&i`S;7G1sZ586J&{RxnrD1|F?_$|7-X|bvUX=T
> zOhC>hS-X46d7nkh5)0S5`Z;Y+?pSqe_t&8-sO>fZ=sgZ|a}>s&qz5q;iD$sS8+cxy
> z@^czJSz1HJTH8~^=CE>4 at v67f*2&$sX=yk748uM5Pt#PUZzk`e(uZV{h+RrITXC}S
> zBJFEjPy0%(+_eNB!YlrYMJ(IQ(G2&;l3LS!=#h8HGh8g;7woAt{M8uqM<J8`<?o;S
> zGHjLA_sy}!^S(tDy2sX~-Q<kd(t6p08zsoGR?l{U4euJ=OYUFacsIhO0nhN{p0!&c
> z2Yp5K8g8sx1Y|bkEf4y{VcW2#dQkOxwOd50lByp#o5<XaNMV%^?TrJvqBz}Ssm<BS
> zb%zKI2V#g_X0_+n&kxyT=9hm)zgfD44k7%xK8cg#J3_JMZ3I7ygPnuW?`!*I at VG0w
> zFIU*;F!+%`f4oye+Q7$Bta6j at Qn}euC)i0FG`J?0x3f;i{m?xPDP0}(b6qU$yDp8K
> zBi}o#7j_g)(pHlymXR;(d?$6Py*^v9{x8JLkiM2XNsPuSH`y*Vp?454;U~a;Q)bKj
> zL~6c&W=So0+a&*6R3qvL90L}6C9tVFvYCW$d~aaQYZ6KQQD4h&;fXup7eo=+a_T^F
> zQi3x8Hhe~sE~1t1a3<B==Qz1^u^gBRL$Xb;eAGh33sLnM?SvK>hcfuqulg9H)@XMa
> zR%uEw*Gs^oz%Pt at 8HsW4{l+05T$1}6#qZm%(Uap at x$KbzaRT^Z9-0wDes#)O<Xq$)
> z4 at -QuFds2La>V>7?TxgL`<dc(h%Z(Q+S8zin=)j?S8ea0eb|y at -dFaNJEsd`^h>CG
> zeKd)qA~7SR-vo1J!;e=*Vzll(e;l#vuiv`9w2(VYsY6%UPd5hJJGpVmqYwws%Xvzy
> z8M#zpAA{O<8fsFDJFtjRPaifX&kR}X`p5R8KH6h8R`=)1P}CCJ?IZi$?Ys at gfc3Gl
> zW~FlQ*v*Rb?BI3us+ID=W54B{w+vl3X{Bc9I-m2*;IR+iU5Q#28%mtOI&hZ|pDnPY
> z0uu)GvxLoOCdMCuzia?LI97w4rt)dS9sAY9E*;unnigi(OvEvX^bGt~2Y{=?HeEvP
> zx1s$n5<JwNnkI**=CfQ<&(T2(A2$r2ia6vp?8Ap93p<_fIoho8>t{=Yr4{7)rRw95
> z!NM%2VARKvO?5}#V7n|8I1ml7aUSrAQfu2%wVH29%=zoDI1!`I*WS?265KD-2%aia
> z3*ReK;@X1BNY^POo>%a>{^Rgk5(o3oIcH_$(+|iw;p6(P;SD%nZ at 3v=i?+rXmWbga
> zODL^^zhcy?p=&-4Kl9K1k{t~(Y9Va?@CODE8{Z*PlZ7>89ybB^Y+I>@Z$IoL{p>Ns
> zjtb`x8hoK6?;_u47#`N3L3~sxVs#T`5saki;3)EK%TQ<Y|Md*PtK=E~Lfk#-qr-1v
> zfP4<yK>+>K at S6Sj-q2Eem1(5lDQrtgJ3~v2JMqq3-x$$R-^F)ovgO{D=~F<DKM`a0
> zB--y}uOvv~2eRd)t-uZoWUss{h5ttuvw!ed{DA3OT-O0Vdx%>jX*a=B#oAITY0614
> zb+cF2MUd;`mYRM?+ttXwj`@>8KRcXiL7!T5EoaD%-+;I=C+ba{Ya31aTi6^rhtlVJ
> zkG2r{V86;FBy=lp;R1Qz#n<#iX^!t=2TvnsYW$C;sqB at c2-42@ho+f$R~p&`-QE<=
> zUU^4C9d at FQk?X<LM@)e at 7l$8<^OE>SLv4NBbb;-7=PHgDtS<14=_74y9ctqzXd}UW
> zsL61&?{6F3eyq*4tAY!dT9zSuOZDm0_U&yh-TS!fD^5f`-ntlLI!oi{#%8 at Y6|$lz
> zo%GooX|N5SLOx?)?i#a%<RE_voLlIdKk at S)H9-XT^kcgUxq$F0OX$?<7WvXg&@W2i
> zt18V3b!jw3tX>Wob|qxk<xY3#Mn7R*1R589;oCOf5l~d{f+u9;<oF-=$$8tqYN-FS
> zf&bA$hr$m%EWWTf$xUUG9%oUT33e=T-45uoDPK$LhvMfTPkL<Lf&Av=7x8_gh0SRD
> zli(?v!H4D$JBaU?p8d#iF32WWasee31v95Y4vx3!!5{UL#0{7aR`{;}bVf)`PPOzb
> z?ni!ONyWaIQ_lc1wuDm%@?aZeU>me*{F+MjlReafzGBcP&ZCjMBb(Wfj(Lx{Qizy)
> z-JE{8izR0Y;;dY4^ZK6nJI?CD!8b#$=b*NA9^;Ssr9^$Ejqw)LDMCAfqMT}sp8!D#
> zFk%|sV37}iJOT17U)e8bd?i1lmNM=O`@ioKo1K_vgZH6-nncUUT*b8|u=@^|$Q)UW
> zir9EAHJ~2LZus(d0bigLdDEq#vG&vEU~z4W`%;#En*yexy|fH6sf&>4{!P`$uRz at j
> z#9M>jYiuM|V&PT(*>Yik)6xEK&>B8W*nI-fCbe+7ej~=pfQK6X^CQ`ea2xE9UpSGM
> zC6Rl;&N6ZR-*gH8%6=KX at ZCO_-s#p)H7<;jRj^U0BX5)4MBVV4sCyLOsGs!DcQ)vu
> zAMU&l9Fir7;gMHgqrVXRN$QKhM)@dxvUIy|%std2`L%|pm82)zDHr6Ko+Q5Bi4^lG
> z?p;pqq2hcOcYzm895!?vawh~OJWXffU5G!`Z<I2~#fZ#$4t=7C2hS#bErq{*Vg{aB
> z!k-IaTQ>Xq)uAoW#RPwX-uE){@ZB$aO!5q!E%VfTu0u=%;^%?eqo{1m04~MOMCej2
> z(A^_k^9H{=@s6RE;L_g7*ebn#nzWaULGnD*3nKk?eW;CAo(|wcJZ%F>4RFx_KR!A(
> zu>VbGNz?8ha3Atf2FD&~{Oi!WT>hKJH~*hBZoc3MoILbR?#nasc>4J<9$sOjmQzm)
> z<gP$6XAqM#Nld;Uv=aPDVzu$!e9Rr&-{aR5g4&Np^x<UwTnXZb(4W9}i}|IhK0<i4
> z>K<s^!_!L#US$TooXFX?-M213`}r1a^X<jSwOp&9kHpfv at N~+m;<pq|-xnOH7w5hO
> zcpcjq$gPY={E;*na@<y-zEo&J0c1bp5FHVxPWr|DQ`9_*%+ez_UuQpa+Z}#_X?DaA
> zUfUP-wDDW{rt{Df;D4SN&t_W$1*mnit2q at pu1&jiY0Ie6Y{q97;V)P(9%1fRn_$~?
> zOcx)G-a;kFH)Yk<PJI at 2iJ^=6$A6WG+VarH>L5>Sqdll>4!ZcR8R9cL5TBy^4!rvY
> zYNKCHBKe at NgD-hIRpdB{55a$#hc{>-LthT&JEs3LR!*S*GEl?fi@~vS#Q@&%F+W~s
> z{4+N!sBuGh7~@n4N=z+(k68~D#-RxLksXHhT`gQ_myio@|EA5QJ#h9F$S46*iH|Q%
> z?xZSVbIgIw_W}1xW#rrfaTWG+_<ZrR_ at BeqV?B`b at 8qc7FA1MUe|QPU$T!ag?T|Cv
> z>cJA8;*@z;Fu~}DfVWiVlad<G-z2i8faI(Xo+ojEJH<7G at 7!lr-tLpHB(a-n{S6{}
> zP{?c2?vZ<B)fg58SRtR}`ud?3mtPO&UE*EBgY;&p&9LWq1^D*`?-=_+Gh~j;0jb$%
> znY{w@;eGFAH<pk*|14MGPk1NjI5c*=;yVV{6 at GqM43%VDOuUF1`jI<N68_4v>ohF8
> zW+Ger&RA(hHsgJq%<=76_>II5{#i2bO_Ss6Od)Qn^iVRMJy45b(mwniRDBg+l`e_5
> zlIQLC8P|KplNt at 1@oj|ukOu`H at H7~&{e+IO4}_xr)omJUl&7)xuB!cnS4jKMUNd)C
> z)WD={8z;Cgkv&3vn)oA<bD6+b1?|>o4;c1 at pER_GAM;(+k609AA`{kCK~Hemx1Zph
> zxxvOo>^-fXM<ue-?+iA!HZuhI*F_%c9q{ds`E+pWlL>isiuQo7kG%moW)CGzZ`F`E
> zC;s_gY3ed$p2$hEO at J&s`M7fMej*=}^J*EzmWhX(_eZe5(=&ym%X~c4Xpd1N>t at S*
> zu at 1_N;mmXYSDU8uZOTQPPGp!p;S2u=brQ+ehPoBlUUD;$@0)#(T8lQbTcs?!1^I`Y
> zXS~7c3pEuc|2J4eiKa>-Yy8?2!tcWtTYIw#_54T;KJaGfGms^5 at 8)0^^Zp>0+MEEv
> z=Y|rg6*BU~<7BLl^FfZPAPI3VyCJhjy1qbkpdA*uCmEX_Y?{bk#)&ZAB8(2&-Janq
> z>Z!NDo|!rm_(&d=?6^wM4%<L4$fXg+)(jbHgw3D|s+D*KYd=Ci#un(LQ>?IM)^T!A
> z_)PYm!?$632KCi&O~L=XL-+rAhbP{#9Phw3=xhERF&XZE=Ma+EoOR3c9*t%~mx(K2
> zld(WwXK7*3OMLF@*9bf&u`Y4}ANND at DGiyz6=f4iKM5w5O%?c;NzqRw;l+mYnqmX&
> zgqhn(U$v`!WunuA at iAR27YJM8OyRa2o_O|%N;W*1$TcE!25jMuz^R~35ymiLM36^I
> zbk8<d*iGMru3-u<%2$uZybM2(VHQp+8wTIr+s3<Xqu}Rp0bcS9#Hl_;SwI`IhO#Ee
> zC!8$)k)$ah8MWuwsNpP|=_*`k*e#4rlTqb}5!*L-FR7c6aEMU~?w$664GXzi^WW1h
> zD1KkN7qNpoov=eXCssy2Nd2$trVU-U`oFG2-FuF%jC5oWx)wRm-^k^MEa_5 at x?hSu
> z$bNBElZO7Q at V`}D5&bgdQujR8iWvJ@$)(rBu5Ym{bhf)1)pL4SQxNbfkZ*xGv=i&h
> z8R+N0(YbP$TcPOZyrs43IiRJNlu^$?tP$eT+guRC-(=jI2c7(Zs=DG{lks6&u>1Q%
> z_x&j!^`RVkJ at TfG!*}Ms9x~a12LI*<eC&}5F-UhuGk2DcwC<nQd^6!*_*vA#*i<F~
> zjs5KPL9%d`=;;`*FZI?1%qQ`++6mNJ)V(Q7^0((;-r`#+8^H=k?a#BQ5wtNXRC}ju
> zcW1zQ)SycE6W{&e+O4zZJgkW_YWt#IH2Ncdi{%^w2dP_@@aJ0KQ)%zak~wX#7o2Is
> zm>{)H!J~H?hSvvja-kk$<kdS7uwf*V`pjgD{6In{jMMIyU<3WMs3lbfd7w3A!O%C~
> z8q9s-bHxZA(+Z9&ub|f<FLOo_Fw?RBo at HUP+|^>(gZ=dawP~7QBEI(%_?au9FWprW
> z-?N|nAuxq&4PW8d2;sEQ7~@0am`uj;Q-<^974j#9j~_$*SjV%d@!bm9mB^`W35QL?
> zgpZe=BmUd?m8PdFBRf8hk45faoJ97g8yTOWsNv`{pQ_cbFTX*nY!^8{p}2}{MN*sf
> z7jmDpggi?<$L=&u7u*Y7+q!P(zuGkOIEy~q!+<ZS3&^!aEjroiBNExe&wv at iuChY!
> zas|&HS1yFzd@|ZxG01nr>&(*f0w!26fEae%XS?_S^~}Rh*>h2kx|UH_vhT(tPAvd9
> zB7Wl2hT&oh){t!ZGGi_BLjFz5;7e2^219_nNu3Dx%%OSkK5AkiR(1fkII=!7!O;H;
> zH5RfqY=({`*F*kN^Y)H%vQA_m&zZZS4RgkH9igYA&cKK91BoKaj$e;+BGx7NxgFo)
> zIuYdW_o(HtTQYigDfFBJ at VN_m__&I3$itEJ)EJfo*$hP_=0%%rdQRA_o`F7-iGkrZ
> zU`Bq=S<}p-E?Tw at c{uR}`D#2{FuK9?HT2~e5}Sm$NLgj%@O0rp_;=agCkT!r$D$g3
> z_d0FF!WRbXLBPHsvoFk=ApY2JI{Y|zP=lep{1*L|a8a35nh$<gXgD8!oQ##@VrkV5
> z(D3>&ah864ICxpH%sI(hp8>rD at vV8p7te`>i%44`Pg at iP!fjaF=VUP6`TTz;_*`K)
> z+Bw=xVjIdd(tPl}d_!?~p2?l8Wy!TnsNf##Fcw8e`_FBz at p+P_yiIzu5Ewn+sn2+y
> zCvri?RLr5VsMUj-csj(rLH at W+p08GueDBuv+>Mo1 at SMu?^2$gr>l-%G_Ojq2=we~J
> z)uMX#yi9$<6oA at 6&xnEdXn#;O0XF2VL7$vgdVYd=xMyg7-TPFA+%QqOjS;VG+yQ$P
> z;pfsA=_xh#L*>Sb^KwrEt}psjIW$f_u<zvrBqvsCCUtcn&uEd~ZHtw;S2L(dII>)f
> zc%8fegPRz(fV^OXn`e%G6B!4@&VjW6HK8Pz=D>G)@F~NB%E+hMP(SH=Ve^h>A#-1b
> zZs>}i5V0Y1jI~jrYoA7a)3bL!lA^x++L8SJc5?rVu?8>5jE{lOe at JRgtsG9qQ*0R3
> zPQDAdlAa`{)UbejkFX6qoVT%HzI}GaA9+7d82A44V^Kw#oWuZKIof-@{SV*?ISo$>
> z_L>AfRfhH2nQGbfI3M at xao^T0Iz!s|hi4IyBR_LG0&P1Sq<!{k#HzH=GX?%=YYyh$
> zA;iq+eP!MG#cN1zAMC`Tu-!xyRrte(gLxU5 at iQ6!6E9S$yicY-?~xYZcZ1EWM=hpc
> zv;}w$oEp3d-%aY6XC+FlKFfMo?`8J0KCrVAUW<O{lF05N_ntf-*GH7xk_QVH9f!>u
> zxo~y*^}^=k5#&1LOROXH$@uzj9Z?yu`(_rwP89Jm@^WYUPQIsC28e4yr-?s7-SRPQ
> zbn|qFUnRS47h*t~MDH=GqBfdfBrHQr>NCLgeFZd^-3cV|Cfdq`9f$+Vjyj~>t at i8U
> z^A_gE7_)x?_7I7~gp8F2yGmRJd at r36YB>jANv0!cH||$;ZWD at k$x(w>_Pd<am45#+
> zmDc&#|KaT2!=kGC{^6+bkTYPO7(hhg!2uB&HUhKfgi=OnR_0w`9xy3JG6OPoHb{yl
> zf~Wy=Yak#h=!gs>2*_+^_Ke(RNTt@@Ni;Mgn977qiP_5N at 3S`4b3f1Tdaw6--#_M>
> z!``#@+Iy|_UEjm!`}t-RfA`Rp>7Ao$J9*{m3X(ru{0lIFVc{n1o7>@AD!|@e2Rznx
> z>@P#bW9Oj`mna)`c7XSK at HT#P?G!71g at 0++wTFO}LtPp8)xaHzF&8DfI+WtI1s4Bs
> z at PBjkV*>AEeW1L%uu|;_-rb%LjQ-Fgr*X|oCsUP>3GnX&b0iac0CQAdT#4@#bwqy@
> z at 6pJKPBb9cj(nfkWMCe(ui=_XV{q*SCdS0Qb{a8Pis-<}M at V1ETq3fbV5XO?MxPD{
> zdMm>_U$v>>hdiT>Wify1nBWz*Sb6WFowK!5VJ~uRmLyIoZ#gY|Hj4vxzBj|xW}(by
> zXzzPwMUr|%jve~gl4NPKV%$do$Kwt^9`KzQJNd`TDsY0t)_tr>vK&S}Hs+fO{$jK%
> z>_-A$bnXJIM<4M{*sl35xtB)Y2cC4uwOoI~L2mc}{B%P_Q5=^&*$up^z>z&h9SD?P
> zFAJ2l7aD!UEAecO0?XBmJ-3UA!hW0RXfaC39)-Hu)rc!UL7j?P=s1D#AvH5jq8>r3
> zi|K6Se=>0^zCoVr|G=`7evy8DLU>vH;R}|ki7)ZJ8D+&EVU8oVg!RMmvBPtookSg%
> z$-meEee}SHK3V~NbYG at KytSCeKCl(~D~WGc2)?#2*ii9SV}$5qK|ZR)Pu0k9{5i<+
> zES!6be1;9?h37#-rVe?jK2{UGA{KUTlKhPFFlsbIt_kC^lG9gX43OJ<#=HXhX)m{P
> zw$ye8W79_C9K}kEjn^scF-`w-Y=(V9xfyuAwZ1Cs$F;+2QLH{rRn<UVqwY^TcL*HK
> z%o>W+)A}P&)(!vJ2tJt>?1wI52jsDT+YU{<lK2?5{fNDS3pqz@(#1#MQ!OWZ>woU2
> zBXy*c3Fi^9n*=?1Ch^mykQzF14+V|L^$p9p>UXdQOoW~$-xw|I&l6!+8Dk-{Ce?l{
> z7e94agX6$g<ld%gK30fA4u_by7ZyS%j|QGWB=%GW-?#uS-`c?GKbp7u0Q>kTo-2cS
> z_Huk4u4_WBO9gochmeU?A at 5#<HSiqfkh^KYm5&7e-&6g_N6vcIo9^EL4jXsmFCO(U
> zlle2?Epj7$M?LBS=Y*QQ%rdIRl_>IcjrS)!cvb9q2hWRuoe&9m+C<O(4LG%2qZnA!
> zSlA`*$R!nNHLg<N?%O at TZ}^fL(yzkWpVLw|>LO|_$3i}6ayTX!9JFHO<BnI{B-gE8
> z1s%+d_=&>*iTwoaJ8q(eCeMe8kh=lfVpyl|C%z`&`+o)piwU`6z?rYxAnaGagX^Ka
> zWGnIM at a~9xt|R^&?a#!|O#C^#JMrh>yBxXg^kh{7!JkBH?E<zfSm0vsBV6o83cR8b
> zTwON!MKjc?A0qZz6Cd5&A-lL~4=Wo!&m~DFwR~0RlS3`JmZKhXwi0`xYKIPT54<CU
> z=VgaeyE*<?$%>J4^5==NIHY#LFXQ%hQAfs}d8({tyV7LOngu@%I1+P1eJfl})S-Y*
> zJ})a9zB-}pT?0IPYcKXMK)?MUFDi=EomHbQiQgr4Wx-Q~>ml}<;EOsaB`ch|luEwy
> z+9h6Yvg<kwc{&wpOT$MuPn_}kyzCdir{VUt(6>u&nS~EAyId{_JuuifjcH%<uAY<P
> z`JFkCu(EnSi7U+<L%4yPcGJroIemG+3oIA4 at BDo34tnehpXo0f9xPEAM0^P5^lG&K
> z5ID0lhj4E-p1Hq{-dHr)Vq=0vp9a5QGF{*>UPz*jg()3Rv-g&KtyJD9y`jjk#l%V;
> zI`8jpEy{VMrI1S9j+_B|e<Zs|C-(sE8ny|wxCvvoLf}$LOkNR|c!P8546|LDfU1PO
> z&JFy7&h??Y-CrpJ*SBDMdziQ}pCTT|2=&Px6v at C}CAn6cEhiX+WQNpGFn-x+W at xEN
> zCg1fo^oZu|Q^_&=RYpNIfh%q(en#`ydBJaUi06^mubstyGbWO>*{KiREwpDGZV&&V
> z{nT{k#RfcIBZHjNdE>QL=*^pm&vFHPg&2nf+ePgpRdt3a)-lgb4{omm at E5+1S_G4a
> z^UHqO9zVSkuLnn88}-qi^HTAn at WZb&s)gG0*7vorEuw)zp6qW4SZ3gis6XSHV&Xn$
> zj$WNFlPHQ?v7Skd0$O4xc}T^rChN{4zWzc^(t%EWO0Z){7v?bPW;?995XWv^bXsYD
> zdYbJP{QV>^dIw}g2lyC at TM^HjAJ2v<*K$G~;_sy_{C2ESnRAs<W#q6b+-oppgML&8
> zyN4CNg9`@VEATy=eAhvT at rMr8_wDr437TgkfZKuZuZJ^g>{qjeW7j#MzrbtBXm2lL
> z?3%)ZJ|6H-BY%oV+<vnt7Qg30pSTYhhS(?aX*JqX7xJ)pKjaL%!B-L7Ya at Q5ogX#Y
> zHpn|a3f<jEY86%G1d;JEm|T*1cgVQux$ttxhWF8jsy<UdYl7x^C%sTxam|eakJ-O;
> z4QEW;S09BxV~jR&ek$lc$k%5QDKl__L-Rsc3u90IGf$bq!S*~FuX&!wTsc0{rV;C;
> z(WOb=2b{|@LhMBT at pCThRrvlQ^b$+L?B{uWepM#V1137>j!Wa;$Rl?mCsLd3qWzoo
> z&ltK^tCCxDlqnV9_u*dcH{54b_Prm-lg-Gnd9Ymd*L))RkgHPE3msf;@9GNLm}SZN
> z5ct<*!pDR6v<`5<;C-$CcyLzSBr%}(UW6^9f^5~n&!b8(S7*Qun239H?`- at +C4C<{
> zoVDLWnwQ}5yffkL=daJ-uxM*epnZ3zoM4aw%8Ms+&0C}xBl+3eozKGu4elslMuwnU
> zam$|RDEK0~<Hi at SU-|tj_mOq~`0H^2W2GFC$*wC{vz_ER;HqPAKJr6donGeZ&Hk2z
> zmD=lpiM{6Smw*vTC;Uo3m|{*y;^#*#G_e=1)PFNm`aJr^f=}B8dygf&M?3RL|2qo!
> z$2&g5HS50#J?zRoXLyjMxMB;KYTunNm$W9lozPXin%EZCz#WoB)0w~1gi}9Wlh75v
> zQoC<{(4xE0Bka|vVS at RzFJG<T<D(NU%@105QZE8`!x%gt_;dKj4YRteCTp&bq2nhN
> z_RjaJ=g<dQnq`WgQxaxtuaou%y}@I2{xVHpoQu~REcQIMdUfN2jqS;1KFM(R7wF^(
> zCUAxwM_$0QqFATUkCa<3sc1a%T9&Kjz47s*v_)#vl%^%!js3=;)AZEjhMjwZTIYGc
> zX1Ayel^JPiNu<WhhK`ZvJGE-hSH&bgES5K9RMoL^!|`mzY~KDzj!hRV-Qln7jc;&o
> zwCVmO-HA1Gf>nVp-5H(_S?gjc%mr|?>!w_>1*Tx1DD~Wj-_@)dzt6<)J~&q*1xHnU
> z9o7nw&vxM$xZ-uQa7-o~Ys9hopwF})fOi4-GsL=K|M7mnDTDK at 6MMK$4LJdx2FQb*
> z;GE)Ub+?_3@;j7osp1%u7ri}#obT6Iybrjna&ZCX>X&NyFPx0NBy9jj0y)7k)$676
> zVB;V^L23k7bVb6n_VU|4*q?ouxB?~J6*-}uwd9&ia#dXhauV2Z$OLIe*;4Oym4VZH
> z>&{ECUq^{Eg=?mJ(RbSk7F%1geY*cj|Ii!R_2G>s#yO)VY}pN9O4`d4-bSsX*z8G&
> zJDbnT;bT>5EZb)xce*p#mh%C4olq;_)dS%t6Eqip#vXtgPSOT7_#}k(pTa$1O!0jv
> zXXUh_?JA6~%Kv*J7h0ll&xu~hwQwv#4w{+t0iSb>-e_|g>KYJP<~@84`rV3SVfj|^
> zpb@$-vm5PBN1S-JXuPcb<E!i(KN8DE4mR$C#E<biu%H&mlPkE^Nq^-Ht|5lVLTQ7(
> zpR~Kq3OlPcXQm%pywA^`vliEkz&N_3sMAJ%gUrdmZ_xquxNaA at 7u}2GSqaCQ5vzSm
> zka6%6ZJ#dOgCFjpDaWg$Z1JN(HNy2m#BY-4cN-X2-5jyM at H~zKdqoY8an2;v%eWMN
> z6mw|>3!exdE^V3bYiPmTtj)JfrY$o6?~O|TM*Ta(_v4DhnA*8-mWGbZr5Sh*dF0x?
> zUHR76<6Lt{yW&CMvsC^{hqECH_oJ5fq5ooX?aVQ_b`-FJFN;2e%}DB0RiJ+dh5ivf
> zxIp3h4Y<BRxPG*MxsmXUrVID?O}-VM-y7*m3^k;d_hSwkO3_X!{AJLgwa3_)D+g)V
> z{rnSNngVN(NgeFy+&Ra<WrV*T_aAMY720}qxUKDS>KNu7hk5{q$ego-uWad55}(EO
> zN`lPD?bK|aPMM2$00(FBYb4{0F|+<P-o}|Y?_uFNRFLN&%&{4yZSp*Xyop=FI`kK0
> zB-RG{Hx;&94Bq{aH*QHs9NO=BmqFT;ubjy0cT<SX`n}W8K^-5_D+}NocjYUuocg7+
> z)AH5#Uf?a*v?4*X$h|?x$y)R>k(CK=YfJD9N^8Qg=hT}P+~4~@xTGxc(bZ9TDsjFs
> z7P+dlxQp-}pvETpfPPNJyMH*5FLuauE9PtsS=+@!X_%+I at Yy+T5KcVd`GbRCCc);A
> zcah1ef7)a%a)C=_u4%#TMbc*E9g$i|T|%v-dn2;((W*UbLcp<e&zH#df5JbulEe{U
> zd)2)^CZ%%ZJ`d32-edU&g{$(8ry0J4qIt(%Eyzo3#C=^SzS6+N>p3nO^)lrTP%o2e
> zJsp{BJtH at 8ugww3$#{_c$T)#Jn-!bH>8IE^=rhj%BV8$z7i>8rms$eA-E+najtKD1
> zxa6=+hyMfHxnSJz at wC5>-}>+4wZvZ`#4zg-<CefCmf(32*-LQY>F_uFByAOJ!=K>m
> zkR-i$_LZbBT+YqxZ&NqOgFbakE%ZtJQl04NY+EULmR`7NL9TT~*PnW2FWqann%bW}
> zpYZ7k`uSAt<+J}#puY3p->;m-_^U%4sF``KG{HlA_$>4ff+LsFe!s>?r-aQ9TJNJ5
> z!QayF>xXB6x}I30h-DD&VEBuyJKsZGTLe9FDQcO~Q)SLX_)agr9>F`I&!L8OR=n1p
> z73_E<VBAKoe`RAB-yUM)ZSZv=PDYn6ApA1KcFKhgE!Yjr`hYtzwGMDqEB?$%bOfn`
> zZ>YgRTmU|~*ZR}lOB3F1Zr5)c>Hj01#{<UA=Lmlsc--4rb!TX3oamupZp!9%tkEu7
> zzNHr2!1{o3{}?&1<Tb+AIO-?Ll<;=RYYFc)w~y!!xdGz>hjkc&n?gJR^&Z;6i&qyg
> zj^bLBS|#S`5JR31v2`9XJXnmq9`@LB;MQE2-&-qVJ&|8{Js&>!EyV8TJ537??`K4n
> z>8O(u1B}tbsCQ9*?Z7R$;kjWf&5h<{*_R(?JOSIU1egZ-PtUS5#oxh~=!Y1>u9ovA
> zF7vv<#%REU^&CET3A|N)#0Dhx5Q!<>0EP#4@%9?<fau`2Vb#EggurHdKIJ4hq%F=z
> z-B%QWzZiaRiz^X)-Toq9_%`x+i*}l<eRMD@^)FYCk;IXlOk+S5mmlL@&>%ys<Q(|(
> z&mmqCLp2e-Hb)k|5N*0_5ft_w=(+6 at 1$zb<zQ}+Ums(t|mVABSZad~&oWL{HidZN3
> zMuFL2(T7mNRhF?cM(sF`_~-P)A==gsCV5EK{)jiYG7fbzh%tDIX8 at N`2Yl!D9i?LM
> zuptKa0DQ2&i}#f&JWRKIMq7)5iNBio{6v3Z?(I6Hnqm!{-VXZ^@gwjD3jX8{->Hbx
> z9UWk<6n9Ra(Ttc|Cpe<*1E^=2ML4cuLn3#%mE at PX?se+<pSSD;mz=AAZYO;FoH$q0
> z0<3MLnrUC3dtfnm+vluZPFFZsx^CGq!b^%Z{}0HFA6O}H%`@PyBKeGub%yc-CT_zE
> zxR+7VQ}sl*($(0Rg}C=%_(EnTXTz>-#NPU4Jq3<OA>TOu1HrBtK+X$rJDrb(n}NGI
> za!}!M7<0VMpau^Gc$S&jXm>q6KPKKpd|>^`<gP;szpkC0-kExWm63eC4>hD>s&$=L
> zLZ7-ap)-i!AAc&we7w*4w1Bsa#Eq`i-BxgQ>s8#*UjhuZujzm-j1m_EOO}5)7&;|v
> zps5Anr|}=x)^XC-1XBvIPVjT;lDE*B2d->6e6wR=%Tw1r%Tfrn(QcleNib#9DgJ>!
> zVpid(%l3`gbr*YZHQKr<eHweUY<~Q(|61S{6?{?J>pVYMMRNa%ZAkPKmwaSDdqbEX
> ztpv;C(wX88oJ?P6^Tl%+C9Oj4!b#+8*9jb#;C4-)?Z4(?1bNn&?~uC}BdC^~JByo$
> z|C+?H1bIo;6mR0ze?olecXncaY~GQXQjy1Mw-6sJ|9FB8c?wrttpC@*_t|#bZM?vY
> zPDTA%x5UC}{@<}v6~7l>%m6P+Zv|@aR_X1j7UTfffL*X}5BAas&*usBZ{m33Lwr!p
> zAf7yt<Ub_a3uwe_Hsjj6sM`L=YRt?m_}&*MSI{L|3;zzWtA2mJvdc?T6dMk#OL95?
> zj){Bw-~Qj`TezU5s2{g95_2npYEXwECUhL!1IU}tNeYKA+5ek-i<b>`l*|Hd`3cl-
> z%uI0!_he46 at e?Ln`IQqjSet|Y_dP*=q)HD~Z-9SOw&Az_mY_rbzwRj=wSUPyh2j3%
> zi9L!~zc=nH1NTtxmdHzRUz%{U-lV;Q`}`O1T?6Dk at -4M~;EXZTDz59T2;h1Sh6{W%
> z?|<v1K|UC_RGnObwQtyQH=}qk#KJM)U?c0S`WQ0=-y6}PuM?TKJy;Q#HO6t&GSmJ0
> zLS^<(Mpa9>>vHyQK^<>g?9cEp1f6^1Vo`X!W^glQx_+2_F8i{ltv{7Ahj>q|y5*B`
> zhn!awYgu$}fd|`ZS<8QE8K at I#DIj(Z{`7MGu9#-0_3Q=DL^z{LyKGdfyS#Rs<7n1e
> zVE7l--lX3E#@{Su2gx2{7Wn$$8_<r%{-g%ZKYv6P7SUrj2ppm=K4TB+A$$!z-;CUt
> zJ2 at VxS)9*(lYT)|z<P{uUjKo3{_QktDR|%e$0&x17o#Q-@>=-}|0BSWh>YKvtS`R{
> zo(%f4owqd7V}!H4xF6j4^yuuO(2PCBw6wlU#~lSm<iPN?euB=0=ie^*QuzPBp<6hC
> z^$<6fGiQ+tD8t(E_O2&++{6Au-!8;jx#G7FkLRgd*n4`6*(uk|(yFlBcK9ng;agh|
> zensS|Vl6hFpOA6GO!?=s;0$68xi`_ruN<S7EjvbhYk_n7UO|530i!x7MSUFm3J?DC
> zKir-w3PK&R$Np}kCg;DT#%#5t1$<uz`c+aEpPRav^>_L+-2X`*hpZiG&v+%^F;X96
> z$0dTTL5+uY$@B(r^^@A#>1TWiN9l?kI at s#Zx0m2rwM!*w%lpoltS{-)TKk;ZCcRZ^
> zgKqc1X%$m|eU)&u<soK>SXB2ua6*`&1C}B`vTF<C at Hn>#$MYdaD)hIw<~8BeiND7$
> z82_2xje3}f#r<_Wc6cmTog;j_zVPedIm;0TwT9O-pMh)OTyHD5%#Mc04}@37Hn#HZ
> zBt{4yePW8s>D_alncmaIPj{%1(<bIUA&-N#`Lc`ZA6X at 0T+?eb%p6j~&V5;-a`PjY
> zhnao(ZcJe$;b)MnXTd3e_f2FBcU*$3y98{APP-YkY{1(be`NlW3oc{CmA)5s8Vk6;
> zj<}>(PQR!VFu&hJH*SM&khOH0h;h<s4f at aU+(fWV#->?|zvx)D)F+99kNXO%0Y)J7
> zf(zGq8~*t}ozP83naR2p(+x7}knsL5!ZGfc2j5t2tYYvcIIPAF#KfLD|7H5x({sS%
> z>|Ir{U{X)Mb8*jotTPwRT}E=zs^1lD2?I8*p_3BYV|%CtLM@)_NnAt!L#@EYz5qYz
> z&VY+=r_PIw=k#L<_PD=s{u5Vn=F7$VTsq2Bot#`&d|%wH|BW(dE5YX^cknSv$6CbS
> z^I{Z^H2rwLp)>R~aKJ#9zOA)jT;3-*8}Q(7)Q@*ZZOY^o#yM$~rL^Zf<c;pCZxesO
> zUId<<N}t!Jl%6~t(s6 at 7UVDR%#(PWc&oqVi)8N3;;Jvx_S0+ZQ=OeYZAmhIO1Ugc#
> z3w2F3Ng7<cqfOZp#!RQ!tXjuW*Coi3CFJ^27BVD^St0br9C&0u!A5rjo3jsX1mb@^
> z<e7%dDtS7O1y8<eYB_XD+fXT`7oN4cg?;~oTWcZa_mYRgpOMk$hZ;T=zcN$?ZmJ;5
> zv-h6$U_;*Wp^UN3zubEkHdXx5ex6=tqkq+!IJM&e;wY#CJTfMewO`YjUqR;<`eISb
> zd(P9xKe8B=mJrt!M=`I`*7J{B${B_B8(I6NlPpEPYwsbx`DGh?$J;Z&>3dL1#qZTd
> z#$VOS;_qw2V#*xs{14+R@$3-8 at +Nca2H!;6Z4_*px!9M7?YAF@{RY2W1gULH_Uh25
> zO>w`hLTu0uyN6=#Rr+|C2bI_ZNK6hoZbR%aUje at x{Pw_2 at lJ688;KZtDDv1CV6Pr%
> zS46!fZ8d at i{Eyb~XN at tKpHb5rih-NcsYI)cO60^%2jAIr at j0VHyl=$59;+WD>y=>W
> zX15}rv|yMQB<2LsC!q_KAU4~K*fqGD`bq2>ID2tL at y3?AKR;f}?u;fFI^+P&PN at a9
> zPJujv)}p{+9e=?3S02G&Y4X(m<_tN(2#A1r6-yD*Z6dKo{SoZ*s$|rdAn_aWA~{;{
> zLjw1ZC2*yD`%i*f3ry4wg3m@(6v}mFOmcg-NXB(#iBKOCek9!^R6$@OaJY$v1K<S7
> zCp@~uFUCx=JfA^(HU+-wC at G$R?~ij|Gk(5)1Ph9oaizfZAtf<)gMru`{4_t8agL(f
> zh1xB;tK at s~1LV<@-v==EjXO%VTbBA^jFhN*qG{I+*XR4YpC8V5k1qj7^ADYV+)diU
> z@&Zq4J+48_zrxcJxTd!>a7|B%F_XKQ>cQPyD&l%F+^MSK2{E}rpC(&zKff_juAlMd
> zdib$awSZThg8ZpT<X&PA5YFO>?@}dr_DaOU6%8TDc02f9;A6Mj!zdFu9=L`&j($18
> zO%iM*zDUR|nS94I#PFK4A_D9#U?1FiDPW6`Q)P$zm5UWDa?rB~|9ZP*2Emzv&#*Aw
> zL+f9iN_6UP4<L at G#vCYOgE2?d3e*ArwgmREfAu>8ZmLMo-4Br58tFdr-@%vDk0KYi
> zGJa#TAN|;kimR*Uy?z4ucv%|6CB~->8D-ehBgkj>%0hK^3~E at h=1;IEk3U+zj&{FK
> zdoMf2zdE>w84nvp;<Lvbkz7vn;M`w{zW8T at F%ogm$yi4RNPJi_miXe=U at cdtR#iMR
> zO?#QiaugDuH^zqeK0 at Gwp4vd+UV?kT5BO~<zjzr3S#$o3rsgEG40`i&$9bM%wu0-G
> z9sJG>c|WU{Uy6G5RM-pJxV8{(V2g~qnf(wa<ghbowGVjZ%o9;Mhpl1ObmS2OPc~$V
> z^FA#qHwNH5GVZ>x%eDhsU_%bUuhg-=!hqAUYaDU(tGDfT_&B`hR&_CEQMoN9i3MKF
> zf^oFASyysr*d#T<hZ`e;*SPp3u8qa-X2hCgVui~)wFR+V at Txd7tC^(P!ZR-gw!%i4
> z;qw6Y#c$on*zD&Q6T8zlJ7$4o6l at Ri4w}@20dG0-<2xq;BM~Jk1cyQk_K8O6ImezN
> zmDqnBKJyyrLKA`En?mAGB(6XFKXCT96i-Ipce50HnIq>sK70<wdkEt^_Wv4ZT^efH
> zj*PR8jPtt6{(6kF6637<U*oJ(1Xj-RtQ)SacjMMPy4OlLE`gc1=6?e$1?{y+sMV*#
> zTo^Ml7hEK!LgvFC<MsPfDun*I8}=+$DSkuzvErFY8Lwj=3?WW1k)=e1;P%k7h_#V8
> zHSj<+i0g2h!AVDaPPxybopwnK=EQBt>Q{>=GtNq14|7Ox$#X>CMvQHK<ap#M`}=>K
> zpn3fl(jIb~1l#KFTf<zau-9KiJfyPdiSTOJj7wlA)#>*`hg=E_9-iF?-$|b)xKmua
> z)U}K{EMVs4e^9RFRBZzGyawQ9T;6#0HqzI}- at qOtd{2u)oOujzp^31y5`j~WLhdXh
> z9!vgHooaZHY3;b-{D$0bvY8(DCQCR&iT(wQ<X5~AxDMupbEtQX|M?#qnIDDF&FjgU
> zCh@&WAH>S%6D%#}h9Bhkv}EF&EO9BtqlzaBzKwkJ6|uZO-p4$Eej<F{GSZeFZ9PEV
> zu8ql5z#lYRFC97uY(Ur!sFN|u?ABDI66z(W$?qf=)%QnHA>yi>Zz)B%EO9RSiCDF7
> zwKls`1-_oh&Z>K|c<6tn at Gqpq5g(Pa9pe}+Jexrld#LkU$TrlgA?>~OB+;8lziz+U
> z`GU}w@{#W at nY{Z0mONXWmsSOz$wVAy;EOFK@(TCshnxcJZ`gCnQA1_}Stl;uJ+n|%
> zdzF2HY9jhJxvz#cqGwaj5=?3?WF>h<s1sCy_-Y=B*~;2yxRLxLtedHbbqjbG-kD at S
> zqclA^QG_+)(Fk9(bO5=ZcQH>sgibdDI$dtS#n&g#3tw%e&!M(Q%wcYYyxr<6- at z@V
> z+pX*H?kfkL{{ty_V at +JZyU^XtN#KblTqNMDf{u`@PO{?j1<c<-?8{H%^S at DFr3DyN
> z$n#a-w9(Sm>W!kE!#?bXDn6Dc*`wANerTi7)|*^iNS0+0pXzxUz9Z7+?Z9Be&cNWo
> zdVKyfFj!j|7`$m;VDN|J*nQ(;z^3+){1Q{#{YTIbSx*zjr<(A_0 at G7%9GhfgpHSQ`
> zemER at L#O4Sgfc<@DU*FNKAZJTvQ=-Sn%k8DRYYD7Y?B(Gv*P*nhUh)P9}}5u({HEX
> z_p5iYsw7+Svy`n3wF<VUo8ku6QfwRYqPAV|Rl~<;g->gjD-k>s1Y0xeKYe%+9=LCU
> zgR=s2<O0^J3_ku-1ZUOXF7AmvG-%I$P74g)&elNrhp1)Le~NH+`J6#MA}u2LXk|{Q
> z_Hy+*cs41}Ny583`56C!zCEZf5^H%r>se3X-tQ9rII`EEM#ONgDs``C9 at dYWVgRxF
> z0 at O~lg+zomw0Ob~;yH5eLj=1Dyz6At?Ws*WaPwVq{)STE(95!yYfoW4yY=mn!hb02
> zuRDj^6 at 5rB$=D+nHK at fs{nGFjBe-=RtVe&^NPj#m#`9Nfw3gIAL5_(^^cJ{d))9Z8
> zKmG$7Y8Sx>6h8xbuoV9EpTVIr&6x?Ee?yxRoS_PjX2F-JHZ5rSBi!EBnq+SXUuq+E
> zLGcB5#EzUB!J9DZmSQw`Kpc- at tPitF@m`}MiSW(U7LQG`o>6)`gN|#hhzXA}dtbRq
> zzaCH(^jY`HLQTunhi9aVfN3{}F6&O}%THboI~;O$-E(a;xU<x#LB9oi3idGKGl+fG
> z!9k~?Q8VQ;e%tiJ at OvBD=$<ZSy5;%oE2v$$th}l(U;9s^y7_AMWwZ-F3)<Q!#C*0L
> zzDO{mu1nfX+!xITK{wbIZa^E=us!})8_DH=wE-QTv at wayResyi3&@M&=0_T?qd%k0
> z(6B>A9ryTcNjCbx&Su8!$k$s_D%xnn)x|0?P1m;3wCW9(*4<-i#fMF#hKn#KHW>0Q
> z3BGV~7;tL=HNZW!fq%1&O#*M#=wmEu$-vhOTPw+SMq!FOxSGs8Q(Pfxc4F`G$!EP#
> z*K*iT9F<ryfc^WA9jN!i7p7G3oikY6(`lnB=``%Orv=~Mbj(!)YycH^cBzKKez;lz
> z-kEn%)1Gi-&25jYoy{P>fZt90&f at P}OpT3sh4?KWI^@d4=NC!-p!^-!irpCBqj<mG
> z772Wu2a(Ci_aG~N{g{$l+Nh&kNQCsDaSZzQMEFyItKfIrf@`PaI`W at j6I@?}IXo7A
> z39LE)+6Fap0Aj+Mjo&9B&jfrgQPTOwUhZthH7ccT4)7QRTOO(Sy;F6Rdo2>5QG4C_
> zg!D*Tq?kr72<$`HhN|Q{#&F?YEoggGLz_4ZwM2;R_!RmGESz}X;qR#DU7N8#W&>N1
> zPVk(9EINwgz{`n?>9GmT#TK#RrYeKm`M~?lv(N*Daq`M|z4%e^b31*x;(5@;H$hkT
> zCc65Mm6ZntUA+prI&a+UHn}j<ZA#&6t|xUgWeQxQJsI?=Rs~)Crgs!~b8IBn6Eco!
> z1 at 68OSpNNit2Uv&b;>bTbEW=v&syvg>sAG>xe48W6Y%PD9wWFv_ at 0}82 at r3^{+mDl
> z<>x5<fumjg!uVZ*v64n`fR|$}O+5s8w_{iGkuN>TyztW#873M_WSgL~_YC`O+7ZK?
> z_VqANM(1t*=a!rBOP@@m3?~^~8jG5?^{BDv!rsQkzoMN__C(ja;tL`0!|1mr-zT*v
> z;rls(J~c0$C6 at XFD`Zw<Y+yI=bNuSC$K~sv!yYNd*a%o(=;JhUq>(!=Ykznyi$3c6
> zy;S)$!TG at k4J7*<?0aAZGyJ)_v3}x?PMSIt7~Ecg{K%@n;QqtdOAOenl8FreX$bW=
> zJr8%~w$BCz&5>UX3 at RTXuDBK3a&_a!-UTCZ!}sB at Lk+zdt+;L;!Tl4Pl-P*S?bk8S
> zK<Aj-TYg5)9Zj79f0LK^Q8r*n1#spk^e;Q=oW|KF^<S(|g9CG$YvW>9bu#R_TFCBq
> z$vgngrBtY?<p(=xBKV>adqCdiD$I3Cs58ew=V75A?1rr at 1va{cVB7ybcP#AmBP6d&
> z+rUO5pN;5y at M#e{Z1z_2f5Daow}dI~^DdIBQS%b!h9O4b$Qky_i?=o?#508F4}QSh
> zo at 5v8?SS4#@IW^%>#OiQb%f)@|E_)&V!l2E$4vCsU!wF?;to8I0{9?az%gK1{qGw!
> zLL35pAZ=pYL^vl#z`t(C{=8L2iwck at hjmtCXLPW?hk2NDhimwy81(KW7e?FzySx-*
> z6zb9$${FN#qQ)AxK_Z at k>$!GD5xo0v8- at P({oNlI`5*G>!DHZm at c*qJM3*1Fe?_1p
> z)9qkk7_hLjP@^Q6t6LfjENrysY2-JZE*^vUz3eC#5pk5GF&^*@5TD0YjQisx{xNJX
> z^p(yF>E>=`Oi?B5P1*WUgxjA*l-r%6C&1+v%vBKHG3GATtweh=P_n5mP+}mu%%esM
> ze!j4b+x_XV0e7tg#zM<GB};+JNU0&YYeTvi8{x;#rwNCuBLw(|n*JGhZY_zYfipi(
> zqXxlOA15ydHl4J0wk;wl8t<43DaRVr-1!X1<FSz=vS!QjI at rodINnL}D{}49<82Yh
> z-w5T-ZqaaDb_`@f)ba-2K5~A#peqpk*q`tZ-eA^Y?-?KS+eZ<&9~tgT(_#f~*j^M0
> z-YVEHyR|Eu3TUaB<RA}bQuYC6vMO+Tk13yCYc)o56~Gpk<Js=xVN>uEaQ>EXU=!Bb
> z^4a7r)C%3t_>veX;em at Xu``I=^s<s`(wpC8i~q8x-Vs^o%nta-l9yH|JL+`z;Uf)o
> zuPF4sQvb(fBIn*J#P6K$zSPnd!Exynhp|JAY~n|`58dS91Uu@!yY%mYGe{}kw|!bd
> ztn8BsZSdzW82CfcyM5XVcd=eM=Y3$5<tbV7qu#0^80J4_VUL!lEEC#<+~i~6Z__2%
> z_3uH}fBiq&LY*i<ce=wTEkoT4=zv!Qxwp<Ge*y7D*g&s{_kKAJ>zA3k0X#>DZ=}D}
> zs4^{ROoNQQ81|qzF5^MWEQe9xWgUg}!z6EmPm9Pwg2B6w&nJ!183imA(u91J?RX6l
> zJKPyeLALw+(IT5-Wu|I5{Sk0Drc$l?Bg5apVK)}`)%3sfOkxQ(BPxJkC>uht#z!IM
> z>w$F{jJ8HW1~H=DWS-PEYO at L7O)kM1=)Ci))36Rvrwy1;JWKJ;JWFF2Gg`d1Lzz63
> zlZAET2TU8|Npeg|MsiFJ7^PTSGZ0gnMO6qn4bw4ZYSA9Z(Q0D|aFs$X56Rsk at k8j-
> zPt0y0`6cjs4H?yBeS?crhwE<gzXk5$6*Bqtt*D_LmyQ|`J6h2XoyaXLQM+w8*9CoD
> ztF3^qu;}kR4j&<pgUgyh?Z;X<j(A;_aT at YAP}jDM_Am>%lfl#><iDT}yO0;zXq-)a
> zgFR*;&foY~AE;&`I~!yp-+`yxpazE<bSK+9$o)$uZu2?vzn#s2i90QUi7moDLDomc
> z4|ry+zE;Q$CZAnl(^t3DA)bFj$fvNN{$w=a4^L9Jfy+cEH&kRRf`r_Pk7(~m3vw$U
> zYZjS(lQd^ED`{|qZ;zjrveg`mxN(T1!f70=aMnV0>5{WyL$&6iKe^8*$z445 at AJUL
> zVlT*sPA8N9I2D*6E3sp8S0>4giU4z)W+nFTsV7G`59;`sRC8F#s<@zM9M&9_TdPas
> ziM{{NUBF<|^MX@|-BS<?y*>o5owJiSBOjC*O1$!Lr$@4tKK=qHJELg56=7L~IA1IF
> zq;+f*d`CK}1wJLU4gB53ziLnGx0~WpF9S0+n)n8Z{wp~L|0dR0??nB6vVTi!%*u at X
> z1|{Ja5q|$lze>Qbx!ADjHG-W4?qXxi(Yl(58Mb~AYA}IUgV=Ps*Tg;8Bb$t0j>xg~
> zz(D-N;9L!T7%>@PzitPvC`_VV6yxKVLGr;N6K4hnx6}rm)BXmXsxEaCS4R`Ry2q%~
> zus>U1e}Y$GC(i5rC-F(ZR&3s^A+{pqdNQ!N<lO&4-9Pd^9ktq!OR<K0o{9AoE;Z}N
> zgFAUMb-E3h#$PmIV3b#Dg!}zuvWitJdKr1|Xm$*6laE8Tj>Grh-bm;ve4vEzemc?x
> zKSFz{4WIu}og9BxKc1^gf7tZoj at 7u9m8)1od`dp(%ieg{lz)={tiiK*vfxc=vmg(*
> zg|nR>Xf4JyV&GxAiNA>x&m?=&@U`lrMc`@Eb}7epUtmH~@GN>Q=#vL at 1QD)X>C)lc
> zdR&iOqi}`Y5#rVYTWlJ92RZN^Ed6hulmPBo`aA2hu<Ik_<o!0cPM&1LKF|c;RJD0H
> zrd*90oyCFUZz30T)okR!J(+(3dyz6;;qq~mGbA<ypFkEcb9i>J-AO*q+uIuEB-sPy
> zKY{~@0`?8|e#fxA-=?IR1$#@GWYc at 0t$#=t58H*J*8+ooXd?D|r=7Gb-fV=Nt(qrY
> z&<5W4Et>_ta^&(-+x0DwS>rw5CN|K{r{TjV{ryj$!sOw$w;f2bxqL(sokq0fTVu*y
> z_`japbnxo8OTJ;A!LwT^K at MRr6{C=JkysrY*?p7Qeb}0Cd~FNKOLO^X?;3jucUwo9
> zb9PXrew8Wi&_*dRk^k+>Kzt%p)~?=+_Ypm7w44Qp$FY8r+vOLde-3pkmEuri6kgGy
> zk7FghTx}$geLs+Rs)fj<4?gi#Z?$2+8OiTzQ<M1$dk{QuI{6A)2y__mRsqAmQgepn
> zunM-~O0&M&P{Bh6k=#4TAf-i-qz;p7PqEWiYT7hOG{$o~_M)w<MsXYSbvE&#pihsm
> z;l$V9GYCEqF7qX-u1zJiRByyyZ6rD`u{(W%NmwawgG|inC*LLNk=(4u$^M!;+RX^P
> zY1q$ghTM*YzVkcBWo^K`cpq33tShFJYhF*@_Yc<}VDhLvkhx^u{{)%;eGzQArQ|r)
> zCRxXf7O!L2x5?*|ScBxfmgB~f_Y<VQHOui|8L$`}6M2*qN8*~cq!u!twin_Y=+HRl
> z9U at 1AufblO3%{29bQ0{;3-~Q=S0-Ze<k<D_<};Bb#z1(;lA_xh at cf}y61l*nbXfRq
> zw7VMi6YRsbM*Q}ci3=Ky-`0@!tqakIKZW+5z_Is|T4eIqV%jKid*`Mcj0Mpnxufqq
> zBrZda+3COZ&amKR+>Hs>kpF at luE$q20hi6X*24~c2eH0Vb;U>WpsMV#j>bXnjDhag
> zZX20ss<sW!Cp`k~e=@cQJ~_yLA6pw`;)XVoYo at 4-vBI@)3BPSlYT3?++fyYek<}ZM
> zOTL7^WV;XM6Y{Beo;$jQV5`8l9vFNR@%T-r36BqOetYIe!KO@!ZzXwK>F764&hsaB
> z<b(+9Ww&BxI?e{ZD2&;4#M8bn3U%996p47+WUfm$349rgnLP0JmgV?zU8!QOD at 5sE
> zWqglt7dUw2UbX}#ZgLfyN$woi#Vh^mj1P(K;@DOkv;EDL?=ixa{}`Sp1HY?BGGg_<
> zar#x*D^<uRQ=@*X!V`I_(0Kx=Lg-Qj;I)P?Vtfp#?YtA52fM|XLmeHK&=c|Ph<&^Q
> zJ7mFcv#3`|{0py9 at Rv+85*(Zdd`Zxk_P&fgiz4gR8~c>du1&wn*AKa!emfN4wvu~k
> z2#*1Lbo=cA;Du3DalAYhIed!a*jw|E(^rAmH&1wx{u>t<I*0WV&8(J~7Fe^qtQ}d&
> zzyQRoN8K-i5!((MP0-gMJA^!8 at MOaOF>|7Q*8fuuF<Eyr1BD#oc0b5?-&lQ1YGaVx
> z0X*sO9?4(QT1oD5y2{OpdQufO6?Z;s67_x&);H|9L8Y>#iG?39w+p(q0`VO9OB*yv
> z1gG5!e=n=|!o9x(8U7AcQ3P%s<+7G0{O^t(Ih5d4D<+ at O-#f+-&jy$L=+zM9BRJCo
> zEPwx(U~SVekAbb+A>{i*hsq5n`Pq-N$|O7de<Tlx;DCQ?1D7N0Lijwi2O22HO at 4x-
> zj(=POf6XFy!ucWOsx3|F!ZR<jtIytNW<H_<uimn-N^P87c6K&1vmqq6-4X&GQM+?m
> z$7hO$;8y)O|4j85M;zAVMp~T7(y?C6E?tN%Rx*fO1+BlUggct6I(!p&!xOWfG1PU)
> z4BX~AgDXSjKYJMes`W>XZYyH&=A3C*<8Ptn6zZBmW~2a*13eOTt09NM_45++9v^V2
> zoU*Tqhdfb~!)Nw8*`u?7v4JdIyG=sfih0%XIocw+QUvzpZ?RWd55<Ke7FVSQo)*su
> zxV at R37WI@4yxiC#__BC^=vQx>tW_D|z(8v&ih;ocug`vB_o}C$Zb~@n`pB_1T1?gh
> z=cF$gN7ukl7m$N~7O`%_=c<qQbMT)U)Vf}92!T6eu3tEg7xpWu6V7SzZQ#U3S}<hd
> zTLdrLqre*AvgX at Ecyn?k?8a*}_Su#%#Gy8I`(A#sC<&O|ZMkw_CF at CC_si0|?IcI>
> z9P)$E-vfvxOu<~9Bt3+CHIaDlrMu$2h-Vj}W)S%GCtFcFa5p~&a`g^4Q99utoEZM1
> zjMjjA824~G{8jRwhDg%Zl~dq}65>gOD~k0)EEc#a^f8a{^z#$1{Hv32 at lJ-{^#J5K
> z9s72GQHz?j(8GbJD1HLi$&#siToSw+YG&ug;eC;B7xZ^Acvy&^W;*;dHi2`K_-A&&
> zKcl?zP^V}qhk1Pqeu#+;v$QLW0ZG6t^gSIY*FFXAcwiScv8XfO*cKsOMEpbz|DqOu
> zBIC}dUu?OMYqnhAX~@22(*991xH)V}bxczw?Rf-qc^-K1j*&UkFz2j|36&m)oY+ at N
> zdm5Lmb(|caW9y--ZIj6zbMQO#B-ol0XOQ}3Maz_qlWIxHTnCeJr;JITUpT6xmiM3C
> zpbU#?s*l9y8?&32g*r^75|0L8uj+KMXH87#=!zo6^!>=U%x>_<y{M4?pXV^lk6JH*
> zkFZw14l<NRJ at bmQ2br1cDp2pIq>S+}cc%`Rn3+_|ATxm9DGTscCkJU at J!Xo3)=!~W
> zRuOD*Nl8w at l~Xq>;?JQ5b2)q&Vf1WZ{AM;<`B-pj2X)*~PeF`vBCs*_RTVGzkvur+
> zBsq@>Hd)J#fOms-7a1c~wjk%6*iI}s!L7%033m&|d~Roz^Ac=H=rWLJ-$TxUOCuh&
> zKzfVUCOS?E^JcPkIby5ea7Im{8QljN_}zgGI*EF}CfEh at AloaPiH>Q^_?k}{*}w(l
> zHv70Tu~u%OUz6aUm>}xQIdcWRV}+{&y3Xe26vT*QL)Zv^TN&jEyuSMlTJ5mvKdafo
> zG>LA9sI~Tx;5ARudEIs*r}Aj5nb*LJjT)lN7}R-^LEcV8EgeeuJ^(#tFLdltkUz5_
> zE23l<^WP)&FxVg*pCC1WU;nf|k<_MyY+2w%{@d42Z?N`dt!p9ofO+yE<izDc%ypqg
> z->alu=(*!in<GWLAMwII;F^OlR|@-SLqGp$RRxotS{NU_$W19vyU at 1;x=@tg&9V}l
> zKX;&y38n7D|GCI5FkEt+k3>I0hTG_;J8py?BLDYq#(ykKl=$Vc5|3`<W4PXA<Zz~^
> z)+?Re7w)#7?PF%*cr>nKj=gR47ai=64mXhNt0j(s!O5MCU%gN2lA#{39J+Ee=J?E7
> zJO6O{x5hcZ!^Gev^ScQyoSV!i<Q#DRq&duMG53v6oPC~|iFm<;ngvYks6PrxE#Svv
> zPXSxdTt<1Y7zd*fxy^VkC#|Z~si|whRf1!f$EPvxPu`|)Bd-qrds6e6v?Gjfy0KUz
> z%E{3vTv=-!rmQT-NnlB%AhXKuwrjs8xs^LQ1sU^iLB3 at BE@#0#5<eqlMe)l54uu7e
> zolC$Bko`-NoZbHQ(tosnu{5FmE5r{ZNlS`blZfAz<kTK+zbfPpy(Vyo?VfQO``Nd*
> zB=E^Bfj#_E8j1COhq;WHZb}g33+lqHw702d*ve>6#LQM&%}UgbS0q8dNTS=6;1aY*
> z&1cjGjt@^#3vK=+wAmrF`5f9 at D71NDq)oyt at Y?^kHsh7>mk))Fam;OvgpNx!?qM!+
> zdvuyq8_^@!U~pq+g|`Bu*`Rk9-x#F9V~PACM}*)*CF{~P<cqmm1uO>YStm@>jwvEJ
> zpC2Gs!b3Z*?A0aT7isLfdEMggU71vig?yIaGefZfW3_b`mufd7pMlh=dJ%np32npQ
> zkg^1GzQ?FUyTB>%QQ^d2vxH#VT}tQ|-^70ep6+s|M9^Vg3{gp*?3crbNouKon_Pi5
> z>d5}JxlVK#bA#2dl%7J4Xe&6;xXtd=334p^jBu=8zcL&=y1)p?MPHoPz&|WoOltmC
> z at UdF>#=9kg|1J)D%bq0`<j<;&6!uo&=J-7XhoBvEULzj5sG*LL|3=}zE(Pfy*`Ka|
> zOlr#lTR>`*HId^Xe;-eN0Q)kSk3cLH_-Jz94J2mut+dJb820+H!vC6elc^@#wC<~X
> z^dp<YlC*I{-c++qg6}aS-+fHhlBc8<HmPGTFEZ@@Ue(>lM-xsU$9<m3cpcak_`s_w
> zo|`Pl-3I41Y8759ZK~A=fk#dnnySq-I^fT8l0KpaFZ3{s!%Nl2aQ*Lq??wI=zAq8(
> z={x9OiH%&AytBaBA>CRJ+yah0XA}qJBj4dZ=Ft7a7oo2)m at f>I-v5K!)j~D60y<FR
> zJc5x|W_e)G{293kgNa6&@ZF5>m`j7rmCJySkw~7a%=BD4I3Z)8(kHd0NR^?+_w~ZK
> zDuIQ$C0y?X%(rXEr-$x?TmwbQ_X01^0ix?mt~+(WuY4VG-=@a%U@}smqkvzoiX(bT
> z!rLh?$<-e=%R_fI!{%KwbcyTHsTl0ZhSnO{>J?22xAMVK!vR+2Hnlf{<W5+C at kGpa
> zj-kI(X6XOe8ff1RUO at i!)bdJiL;qQo;RQ}*Sis`N<8=%6m)-}@dctt7a{S7a#WpqO
> zE at eawV-nYtSfC5BF6T7xP4vQN@?$r_0z!`&Bh+KHB6lZi+DXLh?nkYYp4Feim=Jq2
> zK~&iJ0{m2 at -t8sust}BeH+-w#h3|r|eJF7Jk4?4+)G}aNW{vvjp>l9duYgYcYS>9_
> z9Iru+ZwSG%bl1T at Y{^$1<pN~LEdh3j<P~IoK-Cc}OXdQ^*<!tHN_k^5YMcX?HFA8K
> zmn}fv&EdC7p)HEE^;3f2$CCeO0QV~S-Z%WcM-01be=*U+hU4&K@|AYX7cb558X|Lw
> z#AdaY9N3S%#(z9HzEtjyI-GXo2jX52*Idkfw#Gj<ft-tbB)A+kVk$Puf;b53+29;A
> z^cwQck!RQaMvfJ0`Q8+pS(>bNDWD63L!qqEaMz`hwC=G?hpw(2f{ts~n*z*B$2o?I
> zFC#~8v;^^6F>)9&UXN$IUaj*29*baby~7~0rUs6Y6v2kuZvie_=tIP;7R+zHa)zg6
> z+hoeZ)Hry|EpW4Au4g{IX1G2F$xlIjj`k^61$*%vRXu<7)&}S+CG%spp7ztkUjkmt
> zPIwvf-VABAX_ApcowA6(N+E{^GUHtG3cJ|L7KYqNcC0CG^GvB8a^WOw at VQEPH(6^Z
> zjecZ~Ajcz}j7vYp#oqu9r*haGFOX-LLDobpcwywdYqFKv#u$zFrtDDdY1F34BF9s4
> zyxJT3?@Ji-GU(lx1#D3W_#ka|1>%J5-mpVb7QtU`u}>%QZ|XQ?Kuw!Q+T4QtaVBEv
> z8g`DN0vJ)?AKQU{{5MOU*I7BiiIIEoRkN at 8cEPW`B&4P!F3700V&0iUo<WYbvgJHD
> zF-aZtpRp&lI};UscF5U_{>htN6%=YF#J8XK53>yVByYaxuk|&CGIZqz&lWmZyY- at f
> z#;+B=9?kQ2#<v at vaARF%9<1?k{O>?U_ES;#pZ!=fEj!k{+&at`Agselh%u!PBE}Sw
> zcs`b0G>Y|X1Yh6~eY}mGZ`j&!J{EgE?1 at g~`x2Zmu>PA}<<uJ_=K*%g{!`$!yX4pX
> zJx`I^!vVJHX~~=MY at Q?e97OKH4{j&1<Gwt^5RBRn;g9%%jmCWWRBCb2gwul@!@DY7
> z47=+t?s-3vlgCDx;vT*TEYHMn_yx2>jxaY{p(^zc$U2+4#1WT`I($Tzh8<ajxw9Yp
> zFZegyii+kmnr_KwwBouh|AlEBa!t!2^9IrGhZi58aUxr;HL|k=4AgA+G5!S~iNN25
> z^D9XH9`I&_FSxlcPrE`Gt51Vj<dIjfGofcsl$wFP+|l2SwE<hXxNbz2P0V<Gq^2bH
> zDLj{#33tfCXIa8s5*$zg+m*}8K<<dVXP;9?+6g~t3n9lsnq~ChX4%EPzh4C2)(BtA
> z_*C%C_^d{Lc=8eacF_1y%02$7whVT98UMN=FIAR0q~GT at M2~%yCilH_5c`)o+!jmn
> zS(mjpLuaeReA`ZE-akIf=TC5k(iWbcVU9{9vcTaj#0|VjOkLV!)*#*sely?}PGLQO
> zf7iFmbty$np0U%vGx?q@<ub-I?tsKI2lo{lwNm at OT?~CY7;-iQI at p}}4?;p6&4?Y_
> z8ls^4tGjP7s)#aPL-2(Dds7R5tqml7N8V2m(S5jmTLQSrTTpK=e#RTkIX+c>O#7e*
> z6O3Gl*kJq6dux~HOi!Qxr}vxX#v$yvm&ly+<t|zOy5`z)<l$DNhC1pB!6QoAkX_te
> zAlQGwzUqcp=z0 at p>{%z*HdY at Kbgf%O|JA*RiTbY-jKtw8d(}{WHgMgwbrMJ8x-pLW
> z`as7XCd>UG^w at dx;9I=K+^%4vv4 at YQ%$3QW7Ikn*+`3=~+PYE<`+9gSQ~;A9m;RIB
> zaI=FQ^_BndJeiI5V*DK^dLt|^jQYf*xn7BOqR4Y~G#Vp;zixB;q%ii%w!hnOLFbQ3
> zZyFh|JVC!UOShq}L6VaJFWdNDmf#|@YaJ}=;f~-lk#lo#Pc<2jVSFZPzMYpggv`QP
> z&_JeR{!FB(2F$1BMp7S&@oylxwR9G8!F1eN9XQylH^Y`=M&|7p)IkD%H9HIUr}Nzm
> zouLAA<s{!p_7D;9&Hl51H60r1WAT5S3%<qV3MY7Qa=*|v0Xso*bf%H{5g+|VGkjv;
> zf$Q$zRROlBWm<5B`+p(mjxx+|qriVv$86RP5t&%LcBC&J!}#ePOSLQ52>3ael<%EB
> zrnr)*@LKpWvh^Qz+;e`Hs;Xr1{;jxjkhMHuXv2f2pif}Fe^8uC>=VQT5A~YKbK`Hd
> zOygy!Ep%RL<dK8w{2aMVsLMS*4zfl89)gQ||G+wD`|_#NOqTYqd;CEEk%7Mf8yD>e
> zyg+1M%o?XXTx_9`ACJDx(QY09##*NqxsXR*jdrHETB+l_S^PA{<t4oj`1@(HA7alO
> zn`*62Gc0;aWw?6-{lqi&W5#KRj9-IeOM-m5cF7yi3CabWJ?FT<FtEk42tEd5mpSrW
> zJW1_b+*=8_pUSTp85wwdXEb~3ZxNh6 at -<pJKe{KYy$UY-MYvbX`TJBn#(*n64?iL~
> zKELxL=jVSPXUTEoiTNQ1tPA>KtjpOs5&u8OOa^B!a=MDohnJwv>H+xtt|Mpg;H9|Q
> zU-%$`!+pZc%+wAAPQPAV`ICn+U>y8ph9_F_+XE(3J49z*M=re}d)|ld!gjubT6+E(
> zm5OVD8xk=932Icl9Itj=dZ{da{~KJ?3I{l;!394DTn)1L4qmf%-vIK}$B#*$&)<6K
> zpT=|3!F!VOBzP}~+-<-*Ym5nZSnirv)Zg-1DRW6~*D=w^sZCt%f=?=z|3jM)pNqLy
> zr!7Jbn4PSN<5Nk$gHKx{9MC7UiGvhuAJyt1qe7dAdoTrz>&87yZ-Nd`Pv(IBj}6VV
> z?#}<dk5!*PPOS+nge^A~_##0bb#4a_mz9 at 1>-vs`tdMlx4&A-BeBPLD?t0VU?osXB
> z(Kr4j at TQ-ETzU4ms>Pmr2It8MKc^I!8(_dEc>Z-yO(A0(`RB9JDlhsbSA6*z$u|;Y
> zSRQ29slR2Iw;;m~2THD6!p1u020ql=8b7Mpd!Bb1hq_F__e0*q%svJgcfZUB^Zny%
> zb!Q0|c?@y_Vw1NS)o#5-;3gf_j^`GGzIj3C8rHWGtB-->qMXbp;5=55I!(x}LY*dk
> zHa_nbJBeP}`yG56n at G({yatea`ezmQu2Fmub*mH9&;0rg@*(~h<TF0+YveBHf|IBB
> z-)XJDY5y~RM#)&&#jPPB3ni(>bH09%F<r9u<vaOHuvwFOIEIp5MSaIthU70 at BKex}
> z`%4~=TIcxF`cUmf-qZ1bpUSy%$2m;=G>qXi;3y{b9OS8<lc;l6S)`n?7q$Tz+X{MY
> zH|n2D%{OZd<=L~tt943kY1whZHJbLYVU4qNXm?IugZsNha~%DA0PLOs|3mcHcUU_8
> zPsqlUGUU&qnA-aCGMOi2GU`REP)qvZ<ZGDAEU$m*TjO3wAO3frpDOwRn3o%<C6|8}
> z^$3USLqH!Oxuy}A>vHHlGqmec<yt3RpX2^hze7CWB4U$`6+$f>_%sfB1Me}l?aQ^c
> zwl7e3>LELqJ~t^eR*pIj@}C3S>V|(?|4vfK at Nd6xZMDO{WgC;ihkxr|*j9tz-0TFO
> z9ya{j4Od&s$Zr>tB8Pwb?W?xtk^g?56fyGO$J-i5&Pz#(8UF33s5Uc+b0sGsZ+^h#
> zK#V6toT*;`OwPL_?;HH;gzp=ZIX)3{^xbRcofO_TT<gMnVduu=ig{xlO#_HGFZ~qt
> zdnVvD5qpFkFPpEQMdNNSR3#TFgVU_wR}Vy8`Jqn45}iINSF_EICSa*rI+dw*#KC~8
> z60iV$9ZJQW&IO2%%i{MAD%|XaO60d}c64CxT;F#lxHU`VFkhs+Y}K2o5`1Q}LLFDL
> zd>se68Sh_!#rp at ay*SoW!vF(3;4S_~z%ve;{x<BTSnYx8H%V<>?TW0a4)|e at n)XGm
> zpH&>VxCQN4Z_<mK at H>|krsXWL8CKx7S=Xeab+_on`*WscJZ1DE?Ls%X3_U0*gGJp`
> z8?y-SYTu-gWex}Q_^Zr|Pwpn|bcq+YbUm}=PL^8BnPW3%!EemE<{ag+>BXnBvT=>K
> zw8-%iI4nNA+fKN)h#vx2s>|+tk<_>1$Hw;-(F- at 6IKX)rZt2pt(8~rFl%4ampAKDr
> z=N7%rMkfxQ0RMEuZQryZ+Iw(U8T>s(8WHmG1f3n+9wfI<JhuV93;dQ{{Ed5d(MO^;
> zuaC{(kh|S1<Zf$v`uOEfnrl=-&c#dTW2N&(_6fEAY&gq1Q(VTZ<ZS1ADP_gqJX%rY
> z4lLS#r8V`-MOJ5`bZ-~ouNvzx^RpF07|Y|%lAaExTYTfUw)Cg6XE~1I`QVuFyn!Fm
> z-c<&VJ6#- at F~n$qmzVXPKA#R7G1Re}nQ5>(RY&W1`q8`eqAP~7X@;(|PZ*~0q3NRH
> zX7NX;QMiRs4O{`|Nz0B)hKdalo!jpPCztn!i|5S?N#l0LT(jQ79!Uq^Xo{cmMjgQ^
> z_J_kS7 at dJ!N9iH(U>u$AzA`p`hFf#xs~$B`60Ip=wwuEo0}e=)p^guy%s8i+4u(9D
> z|K+<AFpynj&vrp3-V0XTogX#QhQi}M^lJF?+#D9*$j(?gYAaWXj_IGqXD&I3 at SmMI
> zE}Dnj%K9 at kqItJs)3aU3ORZdOu&w(b{hO$_q=<F6U2?8WYt?^dFkeT#Zurw%r02Dz
> zMX?4mABwee`pxf+$dRsGjhMG8wX&bY2_<RR+tzOB%R^1}sUB}YM;>zOw05WWBvtXp
> z+7+m|L#~A!!oT}j5mll+BHU}>qvb^!1J at NUp`G68;`x(T$}Rs_KQrK~b#u at v?Fr>l
> z$A!K;_jki%wcxbyy_U}|-sbet+VkioKRUA}#_qN_9_C4|;G5D1VQQ at nbuo`XxA{6>
> zf%|rP*@{0-v-Hb*{>3W{3?FJxFP0k?zM=6r=5n&=yXOg7`O&yzGgrGx(ml&)<wXwp
> zaivAx83Zd))i9?8b+8S7d?@wYz+LJ@>6huFiee~s;Bxv?#-2tqua>r)muml6pqPYM
> zyX0SpfgIU!8Fs_vv<%4obvsmEnmp at d`7YZ;#l at XdYz3-G<~^DT$Rk64tHEs*+%Iri
> zFYv0`<G*sEjrcfrSf%yg44Q6^K)sUPhwX{MYfljjZuK!O!NPvSI~}L^XSB<mttmF=
> z)Ras4HsC|Uz}2hb_GL$aGv+q(g?~@8_RFb;KuLc~Am}g<*L}J88~EH2yWFnwiY44n
> zcJRlgJaC7-?A%ZoLiiVIp3ic}f94LJwo{@v%Xra?h3b*tS0`tye?~qd@;UW?c*)_{
> zQ-x?s;_ at wSb?e%-$kmoS`ShQwOXK&uHG|9Tl{^LJ^ZhBUF*AE-<tdRDJj%Y{R`s<L
> zL$vto>KIS>lWy3G at Y<lfVT)G`zmw18<)>KEQmLqUUiX~C%)D7+*F94cu6qTaR{_^E
> z$FU;oGWW8MBHvM?oF;3ULhasef+sIw-V{j-nnlO*Pvd*^;ktCQz3%s^8As+xv|M%=
> z at Wb*xb%4CDv|oFT%a*6v^IL>=hma59od--{{~XlIiV?>TD5gZ_w at j%I{Gzv|AjZJC
> zBE<SKoxwUk(2L5CF_iFf_sW=0dyk;*<PT*!Pup!$e at x*;b;};@qSece6 at LLdS}-_#
> zen+1DXvLpSC+=g;60UzX-og9A9Kt(zH+2d}EAFRR7lHTA?h{P5a6h)}Scfyq-w{-N
> zWU{O{u;&C*<rR4|L))0wG9?QBpXc&qQrm#f6!Zmk2V;R10QNXFA{qC?1#MA-r%O4W
> zVq$xi8($~$A+5529z7KEsrQrMpvZ>LKJ&c1v5q0Ruy=7y1>SQB4$`|3@$yIE3wlgH
> z2{zEUgxfc1FRG(i+t at J(Y~$kaN+!0q9`dpY?~U2v4l}7~YE*W&GOC^fjK4^Fvu32f
> zNnVi!Q9Y;l88ce at Yutyh?=}$s7 at l{lE*iB>&G4730be1hx4sFoJJ#zI;;lB9#tZ%K
> zZLEg>&CorikyT|hpugS!JtowzOmuHce>C*B<vn`FTvN#;!Y`VVlykG at udzoByiC!X
> zw;;=kX|0Rh^d$1ux_`&~s4b|+{xAkSOm8naSRjKRJS=51d^txOWRU;ZA9mG?RlH<U
> zbC$O at 1vOn~k$qxUJ-Mez;0Wva9Oq(g8R~9%uC45EN~`R*PN6Jnv3|hED>AQzTSw~d
> zG6Ml8^JCUxEU3o7xjprmFUNT~WFGk8oJsChTE5JX-!h at zszi(;(#snBXK(%hYUqVj
> zI3iHD_-ejJYRp#yN4!b9gC5h(f at dK|?=4OO*OA_(h94C6*q$i&IYrc@#@#W%Lr2}F
> z_~_dY^N>sYi`prC!<2ejvgt&FJGUWA?bVnUMg1B04D$G&8Dz2UEp+gvUC{rTz~8%{
> z&yRNRDpXHtEc5lOG|tSvzo&6R%&vwhQN!aurTHf9Ua>1;Ld%{=&n4K8U+#WwV)X7)
> zljh{ri;Eb!V{e`eb#En;ns!qYPZyr^YK$6F@~-jg^-Xg5;IA>hlG%aIp8Ef|b}KC(
> zJW)BT=7n6FS7Sj8^80?SvFDm8 at DTgFCFEU}ICeQpYNoya2f?|c#x|>Mf$gT@(-Cuh
> z95VJ3Kj3f-YQ%@Z)2!IUDp9Xhmczmp$8RlW)IfaM#h;9OUr+c_#CKdy)C~ODaXg~k
> z$2;n3V&3q$z_&Wa_Zo7J5)qS4&9i8?II~hZqu$aQ;!Vw|`gM&?rrq%1byd}#4`F-U
> z+zk$oDX at pV4fz8q!-E7N*Q?WVFAQ}en%9rjud7v$>RQd&12e>qRKxe#3fKTMJ8JKR
> z8LZherRJS!o%p=kdO at mf%2R5;;~TX;z<?cMzd#;waHAR5a=or1dcB~7>1okgb{Kb0
> z_7UIjozUr>Op3pA#XD2=l9X)18AI11ZhpgIRyqq#8-rG>1Api}mgVQz=hCbl+G$;X
> zXCO0UR)2=~FW{A7^@-XFMlGz{R=hWoHOotmX77u1m~~N*Ju(A(3-aw&q=D3anahf_
> zEjjzbcLNgz{L55VmQ-sy=p&Br&lotuD?RE%rb^;Up^pmjJbE;Ag5-*|IH&L4DIMRA
> zHLo1qS`?Z7D7ltvsvqhPY3K0oiw058C0n^{3zst~bxYr8)MCAdv<TO*hv2^*Y|A!Y
> zZL&W2MOw)uXvv(nhb_{^-E!jG0`V)Q8qa!WwASvLYOrm1-tRVPJ11W2Q~XYND>;`2
> z?+Ie}vj*>`dl<j$xU$q2`k_x+Hexsr$o^L5^eo1F`V;=zedpyFwW!UvBxG3%@<DqW
> zIu}6Zt`Mt=kMsaTAv)GiQ#RlzjF5w^KeZZcEBe4eq|m;rCvlEw_)Tdt&(cM7p2K8R
> z3;OCiE~nwb3OTv|(V0aV{zc?|*=*=X`P6*quV$CC at f_by?Ig9-x5r7J0`Kp9mwW)v
> z3ViXvW^QjL&yAcT*7wuo_q3)#=z}X}r>pwuW7#X at qhBkMqAxEbmy&zm{w{pJ4ah~U
> z#C1Z2>ns|1-nWG3O at 2q6=)QdScMCs<d{i6uuINt}Va^zFyokqMQtahl$D41P8I>6M
> zKA7Y1BOAlGb<iW;SU+n3cv?rEF1qpR#&*NrcL@*a at ci5le&&1M5qx*2 at A4f>Mc+Ej
> zosC0Nk6N-9g44%Ld at b)hr7S5ptv{Ro6#RJyhUbyr;mXU}?7}GK{Zglgt#@0xh|DWs
> zV4$0j`z8Own%~m1jaQ0_of7gq(mgQlB{{QjFOe;mazCLK4xgjFQtXvdft-N~;4<#=
> zE6Mqk5gh9#mppmj_VwCtkyqo7y6uDPcP*DNRvx7fJf5RBlbY4w&PA+sftS5tja>Ab
> z;G^#J?c(_qS2ZL0Ka{<BTodQoJ}zyo+9ocoO8^lpm4FC@;F6UnJ%~%|Qrn_+!5U>s
> zsS8@$42y~s6}L)KTNQ8xBO0QJkPJyc+tWj7k0Pf>g}P8hoMT-mRZ0dK`CZQhd-}fL
> z&-=&kk9;PX%<{}L&vQTba^2TG(zK$*LN~({KSo(GHtZQ8Y$4V+3;mjCF=8BB+kIB0
> zwE3IYEmW*pyZ7;c5 at qPO$H_Rzl2A6`zNKVLN*(Q;7&G4=5pM!7GSTrMyNx5o-?@|-
> z8L;=M3WAO2-N1S){Qlq;>DAocRc}2zFL2h)DclXcL#d`dB3zZv&e!%m{U1^@Nx(MF
> zgWXC~PWSth&Nt=6z1i>*$>s6;%q?-9My|T+%1gcrZuEnVZHH|?+)LT`L)<@i1=rr2
> z=Lg)o?@D(;YX38>Y|5=kQ|`GYA$Hi-AV1Ser7W2=rP(zp_ at 1k+apk;+XZ?>TQRn+c
> zU*VY!ggL305D{A)R*V?86P#iq%u#%A+VaAI-0(?nF7KdRnMoMSeNTkF_#@G)@O&v4
> zqq8UOAmg<3Vn;Zw@?DVRV5=u=W2>?om+)k6?lTO?Lo5aSO41|3+ze!yCqyTbi3&5u
> zQ0^WbgW)n-`f&$EQf`gtsM{byZFp<Uk+uk%e*x>X=xosc#4{|vEaBa6Puj6>ZvTDs
> z3AVax?vnDREoP=g(TCp^H0ezugL%p1?G4jNU4{{fsLy<Q-z&hZXl6PsYO{SIv42pH
> zJ_+Z#=b{dqig0$ymtd?Hq)lOiIQQzmfnN*H2>t8lRk6Ic3Nd{DGr~Mn!)D&2ddhqI
> zb)>z_j!sKsM}dRcA2Mnx<jH9G21ey6ODj3z|D4xSLLZ?PK1eC^<7#j{nUwL=UT>-5
> z4n}|n5ca`u&~f(5_r_b at Yk4<(M;E}Qwnl0mr=|+eOH%Hg3Tr7b%ySj37!5zxL1|f9
> zC^ZVUqg|<J-r5=opHnaepA at d)NKUsj#ycTr?IFV`M at S#UVU+qq%q#4_I1OqbgpzxL
> z>$QJ)S(=&(>RJFym}*HA>QUI+xaU9KrNLNMFKNnhv$r^%xS>m;JDKK7jdF}fZJKD&
> zjW(q at EG66=2F#M9>;1%nEH`kSK3GRkp9Z;s1;7Z~iM^8<NM+#qqgc96`YyFW_b_MV
> z9`L9(z<+i%EsYw*88Jp)gCF3CxZ(b6eSX#|&;GEFs5j7ur%Vgst4{4X)`Vj<?KilS
> za(hRoJTdtMHJW~T*@C~!@9i!{%Tw+oiFx`i$Qln>r9iEq5x_(Bg>OlNc;I011 at JJH
> z;<FDpfHv3$g(DSr5 at a=VZ+pJCd at cLOpj`Y9KVtcJ*zV?)Q_HVJHXaFmlWd8<3Rt7L
> zN6xP|=rjJ|oJVS+H`cjlXf9SZUgefqoyD`TT`EqM)kNXCuY|=d+T)iMDXu$r>gqp~
> zy)i$Z!~6`mdYUD<33Ca5hu>Y;`HsT%u=8bNH}R#%ZE}_pU#PpG at zubyVmBAn7#MgB
> zTRA?FVmGjE<)#dbe;gm8A>Z{2d1c4<TyTe-3u*k(U9+T##Fvt`P%eC&NgB$6*ytO`
> zkDZCnoA|uNYk^zy at hbs-aX&ei4({knhji3(!Aov+NoG6h`_0U$e+g~)=ObWN at zG%}
> zdv}bW$Kf*`pRs7`&cwHItvUG2irb$!8+H3?NbGF#ANfM9_;W0Y!6xX at x0xdqEy{Dp
> z at cb`SyV55o$gywJNX7kg=PI!8`D)kN;|Vg)z6a)WXFSIlfbsX7d-Kq_(>=#MP8jRi
> zck9HtQ=Wb6RS7E3xepJWtMcqyb3Z}h+1H$Mj`8eUotU8X?7N?R&e5~aCqd`gcTXz#
> zBNgJE#GeXTeXBllW<~v2JVRFpI3)3joSkuz!TWuJPbWTHM*;WF?DUJLJFau__)M80
> zOPWhP!KV|SKk(_mrwyOq at M*{AF~$_)FdN5!gWwjvd%?DQ1Ac^`@%=@7`ozvL-z5A@
> zz at Z@@6*#mg;M%I at Mb}i$Q`WcyT$`$f_)X^`X78iwf-h`~X$3GTFSppa0Dm91foz+<
> z=hUw1zUriT#<zg|)FB_n+d6GzWMV;@A5|1$(I+T}uXKWYK0z7Me6O{5MK^ftt45t~
> zPI%O<U${%9pJ!}YGv-mZIiFqu{YP!CO40Z(#5%N4xNj=8$UR)u1)O;-;dxBXr(Bjn
> zEm}IDSxl>4y1wcU8#$RxlJT?uEu|mu2p{4;NssO&BX6>`cxAP4ukUfMNBRQXYwsg&
> zc50f2av5i=fvwbhg8aX!dUh(t(siyev59+<xVMl7=KU<<VA1XUIK}Mw*$t4V0nL86
> z-$~q$<COkiDuaJ?jrv}n0A7kc8-rHzt;O={*3!%ioZ9gg|8x6ZPGPn$Q|NizlWSAW
> zcBG*_$cL|j9l2NuTXFM**@*vwZ;eZQ%3Vt=04B7)Rk?DZ^hbTdqu)JkZSLoa=&Md<
> zvfaJ~grCuL_{cG(59&5Sr#m<UxtziBqa;7BG~h412caU=61`KxcgewJdh;t_62YN>
> zIMXZCK3R>du5^f;#PGKO>jM2-c7+*<HT!juig5Pr3KRJHPRf)meQ=F^gtr5>P)?o?
> z;n3`Vgz$Fc2I|u+QKW`u?`p#Jw at X9L>0iQkik~<AFyT1r3LNsB1OHC&%4(v6S;p#V
> zOD%9v;3`cUNVvhg4CohH&^07f0>^=u^UO$Fe0ce?Hf~0E;ioJ2B?q%3viFeh?dRz{
> z$S(!-?w}B0=(9FLA9o-Z-ifgbo{-D)a+n|nHBqNsKn$2*nc{vWTvPf3$VYY-egGUF
> zP4Xoh;M*fQk?OX<FW^n3lRo8r$T1;IVPf-j`conA!}Ygz<aVGYcHsx$&e-eg61aze
> z_xmq5sV7Gt{xYmV<5ABS{i`8yb5H^D1bcw(Henlc>&>3uIV6vt#K{^RxA)^%W!W`a
> zH?k7;NKqYYbuIthSCcitR}=OjRq52?x{A(&*>*p~$b6liHd<Xv!Hw`|yBJ>=zlSoI
> zwjObP5WIeHhBtfSz`6ldq&9BIM~OLy>Tt~}=n?pheiqua(o2e5K=$(v8TkJ+*r(KI
> zzy@}-b3>gEw*VK};kvZ^8~D)~a!=e#N%{&kPlo>WzO at e4K%UkAI{Lqfx3j}J#l+k0
> zxrrL?=j5goCFPu?$}4YYT<uBU>N7%)!=7s!P_*e~vpdPIzus2eWN%kAwXRi2+>=(^
> zD{r6Y%1$~<9p(m8f3$Pfn7G-i#FmS`37&W&p3&Z0n=5U-Pb+J;4NC1jA~!JTgz}~4
> zGY=Q6yylFY*z%B?(n8PM6QlfSz0x9^*n;)^t;>tqYcJMFez?3iSz~F$^Vs1xwF@<2
> z7jT_abzIQ-K^!ntn|_TbkF%a15;x=g;J8KShi1F|PGhcJ&p3vdT*KS{1}98~tZpjs
> z`QSATxLy3uloJwQr6E%#1D0zjC*s{Xz{xlWXL+O)Hq&X?Ee*cNzoRm;(&L>Zr`%}7
> z-1$QcS;a0iUT&$P?eSd?hz%xduA*N6*F~i$DaS!_nWn^KJO0PH)&KKc at tfcXBV3#t
> zU^7(F5zo$z at 8ZGvd%3|kn$(GOdy7N);Z%Z5@%Hz5k)kB!eD<SV>h)W*-8Nuad^3>e
> z{Z`zIOZIY(BED^UN_j>qdm?bvO$Vuovb;_lit*M3-G3qS_}9CARgd>)3^>WtX3Olc
> zWd&SV7<i&7n>|u=Id1%ty=t}oLb8NaS`dFKO!uqK<_HGoWHYH{rw(0tAx%OlZ$9i(
> zl?yz6vVu|)UMpVbn+}|kJGn2VY%`2Ro-O6<;JTf(67T&Sxeoji9Krdke&M}=Hyf{d
> z=$;#oTF|1)o6d*_w2f$XaW5<>fDV2*WKW_iWD4~bd=u61Te#Zk_C2&}PNk`yDyY+m
> zWTwefMI8Lb;6!>`8Qtv)3BJRGDA*Bvs;Zl`1u at M9hza^3KdK>a=#sr!MR&=~x0`vy
> zas~t%ZZhrjQkDsG>4Lu{gJzAK%EcR^#+(T>G?ycvE4~c=MS~n19d3DrDVge0`%=Kh
> z>(e=v{xPsICrrtrRSzYsi(8EGft(_5nVC=4;P(dcK-15tB at ivy3VY3g7}j<0fdk8g
> zenmST8o*5+MK!7WHebl-hZ=N!(H6|(cGLt}{$t~}UBmrb(T9-p4~6}<v7*b|`l3A<
> z)2RbJ?J9B0!>hU^@^<5##C__L<_ixM>|J+XTR-<e_873Lt&Ge at a~sU9Pc`fb8u8%B
> zp_1SEXtZgbx%)q`zcYqYZDrEt6SNZR;OJ(C3-_wXMH~tkan0%IGS|8nq$RvcZd>k0
> zIW3XMla!NVkdGSu$j&Jr6?316A9DUh$LQ%xfmx=U{40pfhl?Mo-(oKmE at 7W?i;=JM
> zxfz_P;(oN6>aCTWtVGSTowGEsO;f)mb}aHgkQ;zne5Px7=i%TTK+J+0Cd7#<gj_HZ
> zXEikb)HVEwpFxzEr#@D9LD{#a9QYeAu7PE^#o|6j#7*6O@$7>omAHqAJR>mYZxCKP
> zJmU#q4$2Y7a0E*3lbq8lTy#-Y{dA1GVJ;VPG<UD*i{}_2TE!`G?@w$y=nX;Tz-jzZ
> zk9Fl+>!K9PxVS>L)2j)w+wyc^VR1cs$7=X+qjBE4qW#=-s+!2=z=8LRG9)Z=rJIXG
> z6nDU}J5 at utG}ep#OOd1f1^z#STxIaMBDZ#+yxKnSFZUg`GzR~j&QRbwiiZ_OZ)?nq
> z$>5aM>jf^s`6~45eCh%pE&2_(xi7;Mzditel+%d$j@;~zfir)N=n%koB33`U+O&0g
> zQJ?{w%d49AXO3xh(!&sY4)$VpMdBI8+42noCt2E+Q!SQg)@c|B{tV at v-JbEyVthY)
> zo`-gR9dH at sorba(lrKGHXhq^~%t!H!7;~$ejPu2JTzJQ=ouo!yG{)FibGHLytLZsu
> zrRkHnZurbl<8kU{jQ?whHC=Zr6W6=*8ei=ij(kmpD-3amQ5m7=hgXV at ano%D?tzrE
> zDJePsN)lpM;jW at JT74eyYbQ{5J4gLi+TOw?=7wbo;EX;O<<V((zEmP-Uir~dMkzuq
> z408W*p0Q1M+XVcXhAPVlWixwZM1F<^zth-EE^7JM`@_u<Nsy}>(-8w1W3w6*Z`j(E
> z(`~S`wVhQ7nWp*#FJ<(T|3{{nl8YqV^raKdy)e5RAMiD_J2=>g*@{L}*YJtF)^I0>
> z>nv)zJAKl+ru3GlbbRv-Iy~cc>nhi!bls}cfvfH?9D{g|{m6BLsOZ4W=`7xdnQsd$
> zDrr|1mE2Wk+`f`wjrl1B>$hRj(;Lo7+FKRk0gz$WaPRH(bgcL4mhGI~@us_YKqd0l
> zzjRB?;dCI$hZH|FzG~h+PsZ}x=j8ne^TXvHMCQLZ0kt|Dm>aZb{!QAXp3gef^S^c8
> zs+!V^_zZrU;F}R2z3f$jsd-XJIOLbD7QP=7zJJ^b9SHkAHbwx0GcFGNfj3Y7x!wSG
> z-Zs6N$9rpEADNsV81M)_O5nZ5FDvlqQIdC=5a4iLLcPFryx(DvJ96@#lMWmh4xYS$
> zM1BZ*Ow6Wx(h6XvP at A(A97bfns1v&EQ)0_-ZmjE1z=0-Ns;wzs6qRk4T7aW00EV-S
> z2hI$#q6GR<{5U0i70{CoeoOMoTrO#(S8;Bn_$|{`@jQax at U%<FIqRPMM?p5$)kfr=
> zF<BE3gK2_4@!wd3M}yBg6x*TDX``?W6<;m=zBX^kb;Mpm<@>Sb4 at BI5P&@JaNMHl+
> z?!N%|kGD*<z-rx=&lYf<U+G<_V~;#V<Qs&+R<9t})#n>2KbJ8CoD~D_*i5x_H+Y+o
> zi*XD7%ml)F`D*Fwz?=?Da53Nj04FbF(Ja(jqLWB{qhqlX=qQY96Y_PA6P^l#W|7ts
> zk_7Ho<SG&@1GpS5s^mY9^|S*Rj{;Zuicr-r(0 at +L>b at GU4F1*?qDcIF6zr#6YMU#2
> zr8P$V8}1*<N&<s_V-ENaFrqEKv at h$!Gu~=^ABtF*Jt>VHYSFAA`Kd$6K4st5>dGJ1
> zI<fZdG5s4pr3tv#b=Z+n$ld&me8=`fY;VZFfPVn{$ZxsHRExF-AeXQbHGL(1eJ|07
> z5k${Etn^;9HAzZ=D>uG7!<WqpNxOqw;^a20Lqd*(0ksry-@&GT<C;x9_aIwxkBjY9
> zz&b(y!tXxN4Lf~ZrUj_6_!+S76GdxGSEQ(Ug8bTV^u%Tb2g<^K$Bvp at ZmNBRTu9Q_
> z#BO^3b&D3V*V`JKn2u{USY3~6$os<gFJ0xST0QgZ*^!ekeE0M*(c$h?#D{myg)Iw?
> zn7_PpGKM0dAI at 6CnEr+wwot^=N#5sfeYJ5d8TVAWX at RsnER?OZYdfyf2L!#g6k{H`
> zLt;L82Bo+Lam16y3YSEj;iJvluWOF*bc4VPpMtf6<dyU`*})4kjMdV;MS04P;sp5!
> zow6+~jXJGNWtG^+Jd|J!?)L^`yxG#9j)#v6>k4 at nhG2aad^@v9u7{C~(@(H(g5CwL
> z-!_X}lrO9KX{W$n3~mtFS?(oV*K{Db|Ic_wSoiLnF)o?pY#ou}VqVi%TSn6-k*{C$
> z=RU-$IIN-IThNkqH#I_Eh3g`&0{`U<`DyaqGB$|=MxI<pgIJ|+>#?x6m*d)|TGk3Z
> zY!|!Hi_3ilcmM<N09*cA3#gfy at 6%Cb7>NFjPdQy00PfUa<lL(7eA$liW*8(torLeC
> z9~gP_etHf1e;A(2mpwtAt#wfl=3qoQuR-3Mq6Pj&^1o|{R3~mjzn&_T$jdvfc_r-9
> zirawsvXNSd#)ps*&&HF2)I_(&o=w-oJ{83w_JemT4$E#>>&l*&Na`D*j=j%7=)9hF
> zQWH{cTxQ;~w&(p>K5GuA!`W!Mfvj!jzH>EZZm*2GOk%aDKYSu^$}gJ&_q0^9&moUM
> z?fPzww=m9t{bbunoIz;sC!)#teNt94Z(R;E)XB-P#$GF9xEk<psC(Y;Yx+v#T6uBc
> z#GA)G at 0fi`)>6|(5mUH?BKi}<&8hA-U`$!mdidC3gA at Czk=VgL<;;X0xgCb>P_G at i
> z!HB;%U at X*lzXBV~V<&|j*|F(z?UTzPu$Alt*8{oQVBRuMrb4Z%lgIh!V29SgE-W;_
> z7UKjx at u5dgB)BnR2P{>c4PR&s48Cc>m^y9OB<&-d%E0+!Ov<fEzSMxY5lin{#tP%>
> zbcc`Ee%K$7Mc5CnW$5ad8;`2EaCv1%x>xrujo)hM$<X1K<P)0!@5V}WM6{(C_MN0~
> zwYV*C7vt!8&y45&3N}iUXH9?)d|SMe9z%h%tNsz>&H~&=W<-u+XGOfz_)g=uowjRL
> zjD*M>>^p&NB(@gJpP|URM(rTvS)KqUWhTwQMys?P=H&V(rp?GHo&<UF^O7!7!$VfL
> zxf^};b}7l*e^=gZR7)%1Lq7w1ECU?74!q|nfdSGPAt%`LA=}tmE|U66R`>ZK&Hx#b
> zQwA;+X>scqsYBhbwW9s~#%-My*BC}2w5y7KQ)n0TcG9jgCoPMpG=7A4c&4bNC at N@e
> zn363h<%^stQQ#S?+tjC35%Ij`6|56e*x%u|8gsv9?X)~y|LThI<Q-E#qwkJ_v;Neh
> zE`hI-&bop+>Ds00bJheS+Q}GS5n1>KJlj>N19~9pg)WUO^bP<|PuKh8f7lhss}cQX
> zJcMg(7OwFeV$}si#sRNUOJo`DZ8eg4rU%X%HNb&K-HLa-5g(q6bKVzvgqW<Q)@cpL
> z#Ce at eLbh6ADnGZub9{Xi*|xj50Aa42!h4&GbARvIKEQT9c;Ww#_2ZBWvA2b$H8$6$
> ze_yIOS2lO7sSNc7ys1je`)Xqd>dQonqKqFc)&67K+<yPqG52LbhEBx)e~8~^A~BbQ
> zwPn^OtTp?L-!$*UGkE5Q#KY?go%o4cLUay{ucXE!owNMzf)gz}E@<g>J_EjmUg*yh
> z at h)(;M+ki}AMg3=VU9YT_#1wnUaJd!xN&4~@(16J7Jps1F20jbqYf9Q&e^C8jw`=6
> zaAr+ipM;aOtF6<nzmGV}5XeL6+C6ywuB1?^<J{1s;sYwZbC*iI5c}?O(1SOnx<*N(
> z<Evzf>07|Z*jAes7tKYg4j}%K2ESEWHa+|Bv-w~c-&oc;i!J8ByYd!~?{ldy`3!M3
> zWR;2af~^6Lgmj&)YSX{Hs*xA}Zit!%W^w6H{5tV-zz8i2oC4cq;w>}wpTqu3WIx{^
> z<d;X$A5+fOPogc((X~HzzFT&IbAxNaK)4p<HoUWh*6~v0KQM#128^Lb^mQ8Ap$tOJ
> z<fRwEdz=9-IS1C>&jV%Bt- at T%6Xwd-7}x4nCz&f@#Tff8jD2wTN>3vOd}bSCo#uNI
> z<7FuMAGU6KiqfIdFTnjorlsMP#vfrDdgjV$@Zl7k8Y?=^4YE%2_DgXor?6&=hUA5?
> zqFD9O=Q^StZ>@b}KqbDXcgXR5X8&rQ at EkNofa7H8xK@9>Z>qSCUWT!k1I(?C^rgQ8
> z{c_h5VXLC2Se=X95x-f^4{-(t-|7WjETQ$&pch-ygI+L3pr7Yir%8LQ%CKxD@`b#|
> z0XqwqK~Me6I&H}3t7Gof^{(8d3O>~%<BoC(st(k5r-l0NUGjX`HoH81o?Kp-TI=YX
> z2V3(Sy}f7d+DZLRV~C!CehD55<VoQFxsT-)=fUB(d6&Erb9g at Ha0RdGnZKMcf77!$
> z=$v)PX#j7Ipl_w4k4MLM%WD387yUSZ0e23aCY}wv1voZtS%KFo2X{(Qj*=YX^M_ at O
> z{y?Cj2$+h(vgM)d3Cmb;=cMAEyu6b92A3G*hUhn*<XylvObf%i`ik^{%ax`U!Oj%j
> z$x?_c&|_Q%!d<skcqaqE<LA-;f@(_WYru6(aFx6mCddTB at iG_r2ao|c2fUhT(Rv5o
> zWtByxhpf-dAbkM2vx(RplmA$HljFpV%o^le?Q+aW9i1|*^%ng2>LZ6Y*}YeTH+RSc
> zG0S9C08ekYlS}Yko41=S8If!O^zPj=B-l1Vr;lFf3iaN**Anj9o#y%e9qMlEhP_ij
> zUwrm|-V;mov;X%qZ9e9by94n5G1x)@qR)_<Fy`Js?~hs&Q1jv#<lu4WkEDiV&7f+x
> z1iUPt5g(HHp?iIiH#Z$v#v$x6x?qwsFyOcD))CT;x(yxGon`Z218g6A^J()QI$~Z~
> zh%)i>Th`V6?sXA9z$C<2ZBAkj#JY!Rz_WCQ;8Wov*ry&tU7-6??{iAv-;TSoGqlw^
> zIOG|0%roz3&lkU?9=>uf`Xb_H47fR8!Mqu=(isxMhP5kK?&H&lUyk_XdgNYqO934Z
> z9ipJjLaR~Z0bExpYX6P{kpoaOxuxKMdVrmI9q&fse;gc at gb(sWCh9KFSO;#5UIQuv
> zWxrKrzU*=>8sZNwy at T#R*(u`VIfqYFncCl4nCkzf<#pQy`jm(*)7h+arT$4_s)%g|
> zrw6}I)t$X3tlYSS><4z|`K2+1sgSw-7VQKEe}kzPsS^o~iMKJ<2re%Hy5$_{4a}eI
> zXJ5kcFQ9g9Z=r at +J>v5hnH8RMEhEX;x>W%`LNxX(GbIb%=lUU!#S3;r1R1w2R{9-W
> z>s^2Aw=XAbZ}VaI(=p;~99xfbHnb7`m3Mso at cjz*U4EoYshXf;cXw7TjrsPap5rG9
> z$6vuQnZogJ_q5f4>pG<tp^X{1uIISuKaX>u291oJEBGVlCg!_S1)H}D at _iv<4Rik*
> zYk;4NAvMW7u?EO5*wE`W$*2zoopCYp83o^-xf}d+o^{Q~obzws+m;gFq8d7@>}GPs
> z{i~-MWayXUHfB?eSJgkPh~=v>Z at -jRC7oagVg4-)lra at b?dCJ4mv9{N|C96BOXt2O
> zHVkt9bYlO^B|cTg3bao_;)U=bc_(%g`BJKe{@4KD?sf41!LOU!oDaEB;Ax|+)h*IZ
> z6MPg3&vVdetQVckwwN}WyH{wcyJ^$^+3pW3?&+QA!&hR*O)mfc-*&M-ILQV=zs at J^
> zrWHi~Nbh&r7wzKblJP$E6W$wj^PXR1QhPtD=;-UUJJ$f4hOVC0Wf%K+>N>QSzw6^-
> z1DAvyrGweIfx*p1kPo|fdg|D;V0Kgc2>Ge9 at oWif?2?Qq=y5~zPp_0BhWUJQF5+sN
> zaLnaXTJZSEQ?A;_AdhOur28X-siG^W<wvfQwW{Yjexx0~T0htjM8=_=xBky|_Ve18
> z`=O_u-2<Ps^LkWD%#NB at 6=5W&7B+8lDSV*2nv%qQuOtcW$s_IQ`R|11KT!$VVe4ss
> zQBV83dfG1>?>Vlzgp*CZFFdc0yhM2ZH9hSfDlZp)r}X?D=y?ueZ{#pNvZV?47i7z-
> zwP7cyDs}Lh3e;~P@?m9<e90H&%P7bfU;m;W`Eoon6!IlmkT2k}_$@C`arUdsNUS+S
> zT(0P3S9v&*1%wZ9hu(EcrFR&MiCloqp$M;r4mifxCmH($xsZu9Q8*@Zz5E{HY%!bv
> z?%8koOyE*{9C)l{7Ut$<d;O|O6&kEVm#}t#tF=`L{QEfAsh;<S{({VSK6!s~D7(pW
> zADm4u_@?tZ+-r$G{|ZfHi8K#-!mK=r{0RK5XNWDIj#~3*o0S%1f_!h_!ImOkNo0>`
> z4CKni&YI=UR%Oal<RzBFzcXtuJ%Gs^1f7b=yxxf6fa|9zQY^U=sjm{Q^EP?TXXi-9
> zc+LS9x7@!B{^tqM=f{wH<Jw9l81mr~$*(5;HtCFU%G5LH7hH!t<I)&#`((m4FJ#8R
> zz9z at 2@0bg{$upvcUa at aFo@@UVT7L at Hy$N|GLA;2p;XG`EZ!sSJ1$);?4;5_uFIy=u
> zQ|_CdaoOg6HZJcbC-jXhI{7d%8J|PEh8z!{1oCyUwpTA#vL at s*wDD?Tzr(U#?-cea
> z<lW%SL|pyOK}G|8z+2vl-%MIR_A(<MQ%Ng<9Ul=<m8FswW`R at fv=07rc}gB+k;@Y7
> z2kvaNNh7Vw(#p?dY2=mUTt at 9ziCRmJ)<klzlryD4zylKBr^aueC6uf!ep at ZjNm4bg
> zqI4N_r1c$6x`6n8Ttyl3BPI084hvlX-uVCcYO_>ioj-COe&h4YhBpRw4flDVod1Rk
> z{EQ8F|L at l-llG1ZrcgsV?%%+>GH!(^fwO~)$1d2r`=Jx^Ay4j95Z^dAR@|FUS9Kzu
> ze`>jd&3aH$oli?U_8TUM at 0)(Nt)S1YEe~-dx|T;Hwj;4s85AqdTuRk<LuU`>2CB$*
> zG&fl9E=;vqxwGbs>k8<ug;XxCN&fQ-35O2^>pi}Y2pNO#&th`Guo|`Sue<>N?EE|B
> z;L^C=^pZI9%1e5!WrX;7qeWN7F@*2+Vb{pu<;mPS_(9gehZCUJS;F-;?iH~Y_lo|E
> z>2vt(Ws_{C8&ip05YK2yZAb4}mKMy(wQ{OQ|E=ccnBB=(lL(HB<cM-^;v+`P;r*f=
> z-1Jpz$IU~0oWw at Yfn!X4r>HQ4LW~CX&|0i>J-!igedLl4!urwMv|Cb1{OGWOt6Fc0
> z*O0vEY~@hsywYPB%f^o3;IYvFYtUO>l`)q+z6HE%jnAvv`QZ`O9I#okn(1vq%?_qV
> zR*_uN9I`GDeYwTTJ&#=3P{hs(Acu6W@@RRAJaAx3WxIFE<FxtI24IHsTT at zYa4)d=
> z+-J}iWvlxu=Qm$R-rfV$6Wg7pTbX`;EAsaS%TFQ}Wli&@3LmUl-5<V`$~JDb2z|cB
> zqFtGHzsz<c?LP#YjJ$K%MSIBn`}&7Dz;FzM&(8<<-wnA)WZj42`<X%dJmBom_F)-r
> z3I6-?(4{0*5yK6)PSbqge-P_EY61^)W(H9O<hunj6|tT2REhY0me}md7|>zma+k(v
> zgYRUctsk{_;#zfwGmUS;PZI%*=LkU_Hgl4oqR#4s<AsY8Mq5IY7}z!?rX;^D1e0jI
> zZ$?bK!|D!Bw&2_&!nw%fdlH0NsA|fHW1$b;DMhStAhzYOzshi&ZMm8{4*AgpE^@)v
> zHuT22Spdvqyw}#;Xw;p+Ga6o&TLJ^lmb6Yl?NK$E<I*!8`6n8GB~rApeY9u{#(+fd
> zb1F{RP}8vdK>7eXWcR;XXM|TCNbg^W at 0!*bLB}8$=aO^L_pon%b2LRlK7bn#`e}Jn
> zq-cw9J;+MPxCQhc))^MYI_<jTYVc6#h)&8k0n at KS{WPMNo?2PiuGBwizoF`WcozF*
> zJ^OD9`@7qJ?%5xVF*Fadm5dqWuWis_?HK08?HVWe`pfW6He_N<8G=)cNoqFCG88hm
> z0JanK(HUBBBR-TfrZvrB-1y~Z9%#&ANs&uq at VtXthe206hA|dV`||U>RKFO(F*<Vt
> z^7;_(XiY6HrZve-YpVE4srqB^e{@_hydtmu!+XwQ*v2s%W}!VzxX*F;__ft8!A4M;
> zU0gn{d0fQedBfUt$xc2kc~N2Ns#tIr7BJ6aeVjm55?k}D?{R)U&d)Qu+yvvTgWqht
> zAb&;_rsBDfQ;+A$EKE*vj{5%g$y|+|&w39wB7J0sVX)}O&FO3Nm5Su!c;4`PvXp&F
> zMXNWyhY0<8g7lwXcl!@L{b!J#nx|&x1uFJ19qN>7^8VWVlNVfxTor5VgBtL!q3=dY
> zkMrKpQD0EC at RHewWpzi!LDy(II|MPWF)R0xHLTrx&aJIV)n1Y(nU>6MI;wHZ;0*n%
> zu!b4n-+J<=ZgPRxJT4M{E}ubcRsE6k845YZFXCNF(H-rSR#%s|yco}Cf*n)_Tv-Wx
> z0XA?T&LQ<Zp_edO;EB>sVfiizI|A1lvM2)UGko9R^*IS00=_a<lB4u5C3?r_kAbl)
> zK%XhtGH}x+lYJZCA#=|Ad-8pQmoRq97X|)#jT5-{NsQ at D(8a7+(=++GE1m61)L;25
> z#R&|;7g%F{#I-&m=VyK>ev{0F1DX`@`C(kWD7Wim1A;;ncaw7*<l4iOm@`>Dde<RA
> z?+So?3Gz*Y-gOvu-O22y7`wiI>Rm^ncjb|N(Xju*y?xWrhRZ~6AZ at Z>PUcjLHd<aK
> zIs at 9=d!^HI7V}goFM*!nv}nn9tgSlOX}#rkvJW<0W}9l5%D9BsdQ(Y^O+xxHP<FNw
> z at dhohi}V!(Id9ll{3mCizi)B5zEkStRXHws732$IHf+?EDvZe-U}b_wRkdn{DO%qP
> zB7TG at d{^_zVdFS|JpX9waqScM#<s(6rhw02EOhknq`mNCS7pH$tqo?sfDO+<U%kdP
> zBwi!-jPglbd1+LSO%iS1_O1{cfc$;ThS7JhHXw#i-pMY_k&+OFyxRD!HRi`ZNKI(G
> z%W1f0cmzYfZ#zxC(_IH%g}=EJdQociH1{vhawqRO-%=E~$`oy`&5C=@Vud%hKe>dM
> z4&o#pe~RE!a*%6n-+~y&5vr2Z0NL_hL>HbDejM?e2Q>XR!9F^fG=<FqKg#xVL%m9N
> zVL!&+uVEUhib>X2;s4NcWG(qrv>b8H4svd(1a0&9#G(Hnra8{5c-J_ at C{$90j9H7e
> zY%ixA#qfyT(FMYobQ!e393ig_u^Dj6!v8~JW?R8krt`O;Rz>fRg9KmBQPMYDA8X8<
> zQSiSb2AV#aoHwWs_5)LKvx1jler;$+eCH;E`KU0iMP2w@(pPAsjOYx=A0hp>8tXo=
> zD<1onU{~1Qg-b~O+(`#wZg?-|?%5i|HX0Gzkq~SOxV1^#y`6Gq1XGAv12-{(#H^u5
> zpnh|T!rxd*FciRVWO?I$qir_~0UhV*7n`eId`z~&^G$4e88{>5)Sa-+3*z2evKR6G
> zJc2LEkl>o&-{*nF;KGY;aMSe+iIoAnhImaY;xhh6OGiU4jrPkY at 8jH`*B7q)@n5dX
> z3;yN?b50}t|C!#N*dc0wX8`YFJR1%@VBj6p_4 at _+#Uy at 0tw%lM>+tgc%aanO^fs3(
> z>Bmg#DsV|`keuFJ*E3eNOJh8G&`1aIBX2H6%*c)Si5szc&Ki at GE<JpJA8 at dP^P+Rd
> zdB!9EPSejf73LYS3ZX7_Y0?<K{oo7TWr_AXVA1#$KwsViyAgUmFqLD48h$R|8nd8d
> zRblHzY}IGKA=5Sr_{^gY7ac9&6J8;B1LQfEAT|X(k;D#DuC}fUvcnEQT+devf1;7h
> zJ>XGv+*O}ew}jL>6SWfziEM1`w%hrt4r4d*cVPZ4V{g#n;v4h_BsSG}_4a;z4&akd
> zux!8qXtK%;ex#Q2)zdfDHiq7=XiU3(^s4;EXN at o4-iNW+3wY2xzmsv%sR42OQ~lx=
> zr4ElBH}O$OD0LvkmvVj}VV&cqNG8Qcrv{NYP~3a&FpIkJr^Eo%QCWBO)QwM7-Keed
> zM5k!39I3c<w=k9LKjg~L0sG!p)s1WY9y?*;b;5IUW1c=gZhUGR{0<A?(^&vMri|F4
> zH$OWceW(P-mvl`ecm}`L`l&XC>m|;PRi7G}tf77e|NE!FJ2KE+uJA;Um_yd=j-9Y;
> znFmBJ%pv>CB`K<)nfH`77wt!4>wY^hAJ;sKr5mSOV}I%r_>r>CkFcR$v^D167sQL;
> zOU_3Q7wY9?9In$Pg3|@xYed!cUUA!(A7iV?b1gr1r=@56yD3Th**)3J%{ffm_F7v1
> zv^`kWO}0JH-&mLmJY-tW^BYv%&=2!Hd<UpMpwin(j01Si$BjAAJM&>ndB<(n1vdjH
> z!{#R`mVDpXkMsrBU+)fASJE8R`4rtkAN~f}{*#H=TsnW?+u=_b2^-rRzSYn0`EY3r
> zbVz>kAE`NRNrH>SWAMIwN>!peXO#)A_7|+v9s=iqdkgWYa|-=l$oDOftI6<LTfnhX
> zcKZ`i6z>+z2$4`Jb)9<0#o`$e7f)bp<Wr8UzM?gVC;d})_ATU3P<h60Fs`5%;CjE~
> z^WYnW-a+>R7IhWI=NMIo=@a;LMlW)b_zan6s9TSI##mX47%4 at zM^L9n55M{q6`3pA
> z(X8vdLf^&DwZ=?s#GLY*T at W9h8e~`L^Xuu_6Sw!0^(>4*tg+&h7Qc_Av<dqQXLjSb
> zfci8XmyZ2KGu^SHCO)cPM{v%VYyI7;z%kvMm-ODBJ03PnU`hyNhyy%6*}%M10uM5(
> z-CI7B98378;zy)<$M;Y5RrXsU;I(8L^LAE4r5jhNI{xgVXwoMm?RZ8P9jPiHeF)!k
> zO6j;-%)JoXfBR~N%+pr^z*!*HzQ@;QL~W at XYf)Rs8NXguQ`gRfWB!FezK3EvIt8)G
> z?lO$Owo<w1WGUj~oAy!#rJ8sKHKO}upZ2{BnE^j<3d3j`pHDm{uZr8`E<(-J^7V32
> zfRJ<Edyd0o$9TY&a5N?~;kx6%N%kJ*$Sl!GWj|^81VzhTI*mQQxqHL~Wxr3E!quXa
> zfwEu9F~0tV`ouAtzCsOKj5YYmDzUwAN-cUl`zIkz_IB-9#Oi{rF^d8*e}d!N_;s at p
> z(}Ruknr#F<M*2`zSFr=@!q?D`r-ex=9y;Dd$c(K*{8m?#pAwba9ahZ7SVB?1OWCoX
> zewSQh&SBb2ohnQvZJo1`H|Ve7I>#TnSvfb>HO>$SKk>UMA!XtIMrI7T_7IJ%?sQ3O
> zI-cp>Ax^tobo_iD)UmI#O?>DE?grOFAD)_^x-$oM)-U+JMTon}q`#u(&OGiF at MqMW
> zS&rCsDQO>Kah6t1MA?61ZcAer9c+YG at C+^F9*`~Xrf~L1=vD6oIgAm>)uzdFHd-_+
> za?|76Le%Va5+5ubMgGUJi-Jn&Vbm!{1hIXA9}$=3({5J*6KrNUHR5TJI3 at x3tMTEd
> zz_WJ|JeCVBktxb?#e3d7FD3l}8w>R^X9YCAI_vc%k-#37Or5TO!huJ=a6Q?tFHrBf
> za)Dn*+1jI3ofD?r at rkc;e;WVP{aKgch4$Pavtza*#btU)T8uopNA{4GhqMg7Mkcy6
> zEtx$7|CH{a4*TS=F&!r!7*2iEWx2kjfUB1uGZK7JDD?Griv105v#)UDi$@reM>G;F
> zfZ=1(?i6O+o}(m2eer+A9WgiA0{cjekFkUsHTYoWC+Lp^U}e9>zVSi8mfo3$KHntZ
> z1p=gR;`owNmqf>5XO-Z6FGoy&KG)#C9oMb{W~s_})F1JbJ5`wjVHZf)-yfVb4<8k2
> z-a?1Y{s!^Y(RuPY-|SM2ISQX<yH;W?*)diH9LsWp5J%+E)+reG(?rq6Rm2x!t?aBZ
> zZ~sZ7>VSW>H}3Is$P=~%Sh!3&kG%-nuB3DT?ANG>Gr~Bi5*;tq_`hq~9FdD->q|9)
> zZJQ_b59<Dm&c^lMjeFBy!R{bq2!5vS+pj}UR9dG6Kg4st>kT{)dog~*g+hLCW7(|N
> z#m$XVNo<Flmy*Y5<F<3J_WXWFdYben=1B#PFM4)-?I+0&G8SS-eGq#-dQO*V7~a3n
> zk&;a{;FQ$H{S$b0TVucYNaJ^DPfT^_V-e=P99uEAQSqb>OY`~YBPVG^yh2v<!->YJ
> zkj=oTbD=FeIJtSd+d0Q!Tm{=OG-c^|Cv+u)c!lgAKRg7Nv=(d8U0KbAohE{H?}ZvR
> zk&m#&{g**+jKrGcExN_4MJTK2^MKJ2xeDK$tQ}kNOd{w1^*fadjBzz-Kc4LZqxP>l
> zq!PUjT^Hqw*qBYw50ZkDt2%3RXK<afB!4n{pAZkNgCFa>krpK=`z>W~ZXNQR+c$Tk
> z?TCFU`_YhBzVA(#=KarSa|N6dmow$46{q(9$}$|-lpvQMxULUk-ftrFzO%;V!u^j~
> zz(I=~(QW*?r7?J~HpsT0X^JXq{p7 at hnnTpWObr#EsnRdR^+-($601K+V(0j+0Y(bA
> z)6^ihcM8M(oH*jI@>f<@{Ic6Femf+O+7aTUs`z#Abu932;098*;3rfL^dTFE^*8t=
> zm4SC`SF2kqO8d!8Vc?7})rn>RM<1zHI4T$&3;!*(8*;3}G93NxiT at v_{n_fW*YO{0
> zhLn+1CMPHIuRKg`Z>`|munA;CoFwKxVRBgpT~i!QYv4y#=~1hJGSc9010G>JY5M_i
> zvCyjiHi4(A5%WCSA3WGn#&S+tj^oOn^_6n4zs0m!dfaje?S>zfh7Xxs3$-#Dk!v3H
> zaLdRuT$HVti_|~qtbyFSNfAu08M4+s;R$=jau>P;xM&5L_^9J5ryv-uGT0Ts*4>xC
> zm;GtOn%g2$;|TSx)$v`81L7lzExM3HzcpYD=-1=dyM^yBm6gz=NX;MUxxc2EfI(RO
> zryhD#&_e?g1LB>vpHNSb_e(g6P?v%21q>x>&|fHun|$F=*C&Vx2iFmK2|qFX$=J_J
> ziq6j_GF6w1T+~{}?IXa1yoCFyalfb_BFjqbYVl3`z)Tn2cY!krI-&6_{9S#?JWl}@
> z>ewR4vMO@@%@fFTKrWA5l8bzUl7)h-UgRX};;fPI3B6o&e&KYgvOOC0zm>p8U``<C
> z`P2CQ?$7v!6SdqZb5;HSme&D)%Im^E<@IYGc};&xVx01M7^4q(U-YS3zt{B19R8d_
> zZ2Yf$SmY$~!8jkfN+EeJZ1?J)K-TVn{>>GpCXjsTo%}jHe=3m`!`pRJzyqWhHkR{`
> z+gj^_o%-D(a4TC;N0G9o^`&geeu>I+3Q>E8fwi{Y)H}{QA#da2zBJvlzVUW1*fCFi
> z*JR7746aXHrANQ{`!Z%d?oGyRI<_GZJo at Y;Vh$UDtJnm;WVWE|h at tDeOdYOGr=G;U
> zm^vJ`bO-Y)-pL+m3EuT^%$d@^%0;x>+8#}0rw3ETuOsp)0Xm-Qm*v6i8KNr_`2?Hc
> zv$&vCj>w_HRDA{7HvzHE0{Fa(VMl!4vC69x*q>U|oqIa6ZrROA{wtiy+N-Epf7hi|
> zY<8VgjB}k(M7jb49@})m=o?ypT~_nY2&^AB1A~7jak>Wt8 at l<B=yl@{c*Z30B~yX;
> zW0|6PxMj7gXl2@=^PD1XE9b9&iu0_buXwpQ&GLe)=;N1(9!P8*;<J`qH6F6MGO9!~
> z17-J-gALo|W2_+`!ap>DV0S$_HjlVFH&T45H7Md3d<_-QjjNyiXPT9Aq*SiQ_#YAD
> z$?t<dH=w)RG)pWo-Ic??cc%gNV)=U1Sjw6iaVmaMs;^D%x5M}cIBsDVUGJrLBF7{y
> zd(T>zu^Yab;R7772PHi4g0MA_YbQ#D at 9%_ZlQ`f|q*w)g5jdMv36Ajwt`Z#Lsouu*
> z)|h{ElIId76MOf at +z1EW#Wksd6}YX5%?n>)DWf6Rx?P?*G2#$(cW>wg=FDlZ1M%Lp
> zSf8rl<G8q$@Jjn-TcYs&OHzNz?+ac>+5*g{oy4Aym#0F#Gw^}k&X+oP=p3n$`Z8cr
> zic&R*b*aQ1z at Z;UyTWiR`1we?NKH^&&q-w%yCcqE9^}9`kwJLUZ||2g2Q&lh)sUU!
> zSxCD&yb<?)5&nR*>S_GMXK}mM&7n(kt_*w6_1#CnMco#`H at Q!~D{$iPWuEK#8A(4I
> z{5*Ic;0Q}IHPVB;R*pE5<cHF~llML1?*i67f;^A>G_N6B*LTTLgim0^;b-p;@64U)
> zOZw`TO;%Usja(}SiP__rL9iuotR&djo#cQHQ)McG%>-YB=RN)65U!CgXGqPOY&&%N
> zw>|F#97o8xq%uf+4Svd_IZDK^C5YDssyO6a@)>*BBIM}ggU4mse}04SGBBkL at 23cB
> zWj6AEiZf2IMdM1$C0v6wX5UokS0ls&>-+a$hJ6WV3;a%Q-|O%h?vL+3<3aqQ88>5*
> z&jUY3lRMp<eodn)(0#~G4f$vpuQWUwt(<Qz=cC1owUUyrxpzn|ny3r7jH9rr&YE7n
> zditk6jp~aZU;XB%-i<F`T-+FXaY>`^MLm9hin{g_-uj*QZY;Z~5k+M;5Ud62o)?K1
> zV}4uX*Uk73xj(MEo#4>HIouH+jeR3#+=V~a{s8d-tdUM-aBH>wEHLl^jgE`UJ^2C9
> z+csuN;Pd_ib3$T`y*iC-Md0-nrOVF7j({KI;7@&E7re+8a043iE`HGA;s(?@E-t~k
> zr53REu!-3RapPwIqZMN?Z4+5MW3YDH#id6Iq6V6GJSI72&}D$vT3ooAJOjZFi at F${
> z%e5}L_Qb^xL;*$$KEK!=J2SvzXYy|GPShMKLi=23pNruCulnFShwTavw!2E*c-0+F
> zVt#susRj2NLGG*SAn)8r!)G*x%-@@&*4tN%ZnE37SO?xbeF5;)E<A6{rZ4pw at Ncb-
> z9R<4?b+i)Od-J)$EiNuFg$6HfIj~jPr!`^;)|aCp!PKaBT0Tb at Z@I+Z6ymXq(Oxdv
> zS7W4AfyP+k^P2I1)bqHQgx at se(0IaMKjR)gzw*kf6=D1FK|TRE at JorDD19C8V+HzQ
> zCE+6nKdH76-{lqL_*iwB&#3S3xN?!-5gS$J1D$`pp!0XiPrydUak$TlWbgwb#-}CM
> zk=x?JXWS#_VXiRu$o&q8 at 5hFg`E+=Dm*HI8zt-_qLj?MPd?)h=xL~|DV-fLJ;9X$d
> zhrPaC at Kpp;@ZIU3Hma;Kvj+<A`;u0HeEtw&{so{WLC;!IcaGG`xwsT{4dFAmh`NlP
> z=hN at 6lVE>RP&My8vnxJ)W<2W0mXvAAO1P+Sdwlqe`>mgl{WDtYQ*m7K%%{9$CWqe-
> z>oYL+3^SjgkE&5$@_Oobq5y(Hq<+NuDsv%T13l?@qoaO9V_E&@#1^y0Bxc}0;JxcJ
> zMJGGZj{1$l+}RZuJu at EfrKMC?d+*{$<QSdZ0uJw}<<eN*jqA+1dg>=b<B|H$i5&tx
> z?*g!_z}41YOXFm9Cw7qYf%&u(dl=tekkxGe7TXt*?|&1z;Hgab%w@{CUt=tp at r*CF
> zLC)4^i2~w>&U_Jg8*}Sw*eQYVfsRb+fG^67eMQ2)k>H*P5O5c^xbZXlq0Wfo;$rDx
> znPO~o>FegIc`|c}GIDK^>9Odfu~!E;Uc{SCsMArO8DVc7OWG at EgzYtbS1m{BWOdf7
> zJO>=NTfl*0Y=fiq5W#H|S?v93cBP)wDf~;$G;Fk9deqHBevD7YVQvgK1|MS^hBbKv
> zw&A3<Pm2TcGxtGC%H#9V!!(WkkQXGgxeSV7I<2DRe2xP?K&)N=S%I8r1(gANDw~|c
> zBM*aKrMeA&(8nRb92aI_%oq|2Vs}qWi5pK3>O7qgzPyAj=H!pOIo&*~tS;#Y at T}{T
> zwCrYHnxI6 at _EV58j|D!H-r}9O?k4=ViGGvHKJfE^Oz80s_(tTOUBeor)+c24W*KfZ
> zWL2L-<+(>}uFoFMb|8)ceWXuBJ@}K-m)r1}`326)E)9nK7*719`n|HVhH22DbDsH5
> z`Qh>k?B6Y5#|J%=hx*;JvvEf)-r!>l!hKw**RDXW$2Ed`hApQRVtiS!8yJq at n)@sr
> zdoEzM<6QL2?dL`cKGZKPYWSvk_z|bGzvJ@&@v}nWFZAH*5w}%|gNWa_QREAb6}pk+
> zrqb#7WatZ^>y_ZWfq#J>5;v4?oTR*YM(N$mw|kp+C?iwaul$PI%a9xFE|SO8=wNr%
> zI at nyVl3Wd`nM4o9de^0#Yd(|1tV)NhdkOl-;KIdM53;|g+EGs<kX;}}d`5!0?esGE
> zuLl!(Nc at Ssq4(3=P(dCdHg~6jHc;8+x|Ro=uY#dJq}opox0P at Qle;XJYM-#E1;l<x
> z?yKh~qy6C0JUMa9a_56zk6W3sE6+FGI<ZqJV|Q at 9TszV<q17j~IPWrQ%VTYVKey4{
> zspq%45*xQwhgQ&b)_J3n4dYa{4DhP?agpHGuV#&O0&AjAvim~1*@BP*>~75I`_P%0
> zxI2P<q)!a!)dW4aF>DO%A0 at ajdD{<k-wqXgRJn0gGg at I6Rl+avgjT{n9LC<G6(lE9
> zyqLrqqEe6SC|5{~@D04pthXJfMd0}lL)@mW1b#jo-;eF2`-=OSfN8;6+pX;z>Qtt>
> zkvlCv83x;v-z%-=^YqR-=|IhvO4LypLA7yjzemn*d+1KdWaLFvZBd9Tk$ekv2ktLF
> z7N(|%U5xy4)?*is#d(9R(;_#^D^c?v$G~5v0&j)_-`~_9PSUX^a<5i}6uPr*H2oae
> z-|;g&lsW?(4(tS1 at 3c_T23sZF7d(_YHYcYNJR34kTR0PBo_19R#=EVW at UCi+tKx<~
> zVFg(SF?V%rEhD2&g+yQuLJk(LL|c{OZ(;KmqCQf&Asl^z+7P;Jz-Vj$zC*_vaqJG>
> zKwXyA9qJFBTGX?-P>OeoTA#}bPesCaK3rd|lL-3h5Q_*{E1k4z!U?vJSIbMFXW8)G
> zY6Hd{y66yYgnYj(O86h#>Cjb(-na|vb-*y>|4qrTj47)^d=mKuGwyRk#F?Z&@J`PZ
> zrefR&p)ZE&(}7b91TWXTY!#)g>oY`Cs-c{mkGu%u7r4M-I&cji=2PR>TSCASWCuUd
> z0#SXfN<_Gav}uZ)Ii~sX-8}sDJn|59n|*cJ-VJNm#dBSPpMPZS2^O_a3VkAS&nejJ
> z^jjfh47M<SzzPj-sp5Ra!H~1NzEup;V7#=aDcSwXzP~D4n-QxY*0GV(ti6=fhq4C-
> zNF2Nh?`56b&PAuRg?O_&Y7w8?bij9bwwlV=;)sCVebABZK%dL?+B)g0${aP7SKCE-
> zTSEWRZq0w&ZM*_bEyZm3+bJ!#2W|i1(C#E9 at NMRzk^&j(7n at y|44M=s+X24tC?cz`
> zUVN|tGWwwCS7K8!a<WGF6!1|*_KUrUj!ksv*dc3rBSt<-EddT#$!4d8ut!T}Wji?8
> zn3Ax*l(upVc!uE*Q7e)w3XcMFCyQWU_i7nkCO8S(Ep(v39S(iK_gWL3sHKmwt}a7(
> z74+|FnsA-ZV3}LpLR-LnwklS=fVyCZT{I_J%HV%{cB5!!*B<o4c&qEEA2?OiY^V?i
> zv*KK9(F#r}n#rcZ_o}m%ym;1Yzw+Mvqo~K_)1${fAi96+qVRS$-D^ML4ftd|bp1ZS
> zDGXlo2YA)CwWfF-=$hM~>F_a&IpA{WO6#;Yjk95!hzm&W-g&9&A+E78Ee&hn+SLah
> zNeKR*;_cCTyYfToIGH1yaushM3md`9m7R`!Yh`fq4+rL%OJX&v+Lh=3n6 at vz|EV)$
> zM?q$H{0e+hrA3zL!|#>b`91O~_W`{>o+%q~iqFBx&^-hCvY^ZM at zhEreWadFIn~qW
> zIB#`#{77r5Qd!N%BoDBgbJzaJ(ze$)+4bT!NkC!T<kVNY4B%M$hx8PkEQvA8Cw_Za
> zMpbfy^iQ at j;^($1rTZV#$?pX2>UbM9lCa*=2*MM&ttrBq(?O1dzYz5@=*RE_-=M#f
> z12=WY5jLNl*ulxGH at O@b17yuZEvrt%Z0FX7-u{w`c|*FgAbx*pzbrTSDdpg8k-=X4
> zis1Ui&oSDhblZ8vpc}F8OT<C{hu@?tlOge-kO<V0fWIV|-G3?yy4)w><))=UC*iX^
> zfcMybY#j2uUW6WV6x^*(#cljRQGf6m9LPQ``UbJ&Gl&gZ>2jPW#TGdqh&9OIe<^Jp
> zf!|Y7Tw7GgCk`aJ#-gm+6k8R&THj7&2Cj+gkvezuHDdp>bD{HXN9^|G)qmZv!iN&f
> zejXTbt0-FqtfD=>>Jr`Z1^qnRN;_sB22ZLZ!-p*j8O<trg{_-jVvQNh`RZ^E(eacR
> z at A-&PX2-tknLoyruuC873rxdQ56IZeVZ06yzfEo*$i%+H2NHgY#70L3FZu4Q{i-#*
> z5OL3hs|Ww}NN$E*TGsR5UE#l?p8p=pOMCY35cVJK+21}Bz92UHtirF=)QimP;atO3
> z at HKg>TAKT=VNgS+KvpyPh~+i%pCpR-b~e5|c_!}-yJm4l_5;mYhKGIBFs^4T`eJN5
> zTb|O-!{*)Vn~!H~4*8H}k at HeQClYS%=9139p&Ha3yTwZ?PIH>pCd6>~Nf0{9m%6LR
> zy<}$EedJY at YGUIgqlRAd)T39ztFwsz-T|36FHsx66Y)#*m3wdEtv7}x7XU-Kqf7F_
> zSGhrN^nZ9C`3DiA=b={?BfiF$2B!o9v;OeKniKbwQSjX&CXaDzr;}l`ub|2wdjoTM
> zP at Vu8wg8xl1*q);J0`J<-a;`UZdRpbC9Zu at 10J83+xF6`rt|X@=8}1eN#F`?bydCS
> zDw(ZymApGfzLOh7mGT*aUw?e7KlHjX=y%c3S+%NL(BF8A&&Yh!Eac3C`z}Rc-hN&q
> z{<sH^y1(@%uq!qdZ~6p%XG4vqFx2>qraCL5uWn%PUw!(w{g4|D)t;72b1lw|=0fE!
> z!LHBc-0|Iwy7+OmPpvVFcf(I?#QY$2qW5F#1D~yLv6bHQzsCKr|Bid$CCebs%fK(^
> z#Q1iYp2q(M{kwx-rRpYjukl54os?~i7Tb^UOe7Y$REl*d{vO6cJ?7yd<I!Ob;98F2
> zI(dw at xDDeq+_;T$*wuOy*7kjcKGed}F!3eCgi1_zq4UuZOxz5*-4bPk-xxA<)%B7#
> z1+Z at 4ORF!t#g{OzOHPG}MD|eeeAC_kYra`y{O+MWX;)9N4`=2OUV7jUon&1esknFE
> z_|AJwjLKZlvrccuyH*&l;MiZTTL1P{yaqn;>Pe};J7xbE{hu6yt?x5)XBy707q204
> zOPxt1w70-?*LM&z&h~(=wjt+M&!?y;=jQ6 at i9G56rU0|TjPrF7PANVE*otaZr+~pX
> zKu5L1H#iUcZQ~NVbiu7Hn5W?HZ_ at szM7^w$tc(7n<pS*wJo<Q&H*hC+Q<rG*{d49E
> zTpjvjjg-+IW52NYpl<j-<%bcIzlAzLhhfv)<L2SKS8!fWt{T>YUpKv=M=s7CMmMFU
> zrLB5(zIIB>Kb6y-Oq*1^!Wr96CtE%OKkwkCu-}xc;{tcxwm_c`=KR6kWS^Ns at O45S
> zMDJuL#^?si3ncfWIRp66eB~DSw}aUY$y<=OLU0wmp>w<;wWKApJZfN;!Do(yA;`xi
> zz_}2AFKVk{On`%)-GDVP3!J3DBaxg0_<vsze~h*UGh-pUPLg@;l?S;y8rZW-CR+S4
> zHx_kK7AIa0+|^Qq<6xU!jwy{4#zKKz4Il2<tTS3Ic~5J8D at -1y*`lN>3X?G>bmqN{
> zinYwWRBxsB*w1H_#ouh at kPBUytj{k at o=w*O2gJS<;xcORq?7oJO4Wif+E)J(WT`gp
> zi^9dQ^Zq;zI?e#pzl_rF#{TUg+C4GAJeDrs#xiJIW#h}Foile@)Q|e(9QgSr?^KHK
> zDSLc%dkPJ6d~b+)<lu13bs5Qx|KID_Z_8k>VXYZj4Ls9PW;EthNW^KfrePhkrcqQ0
> z`fvZiXz;H3pubj)KLadEmgy6HE}2(_KJw2oM|isyYgjt2ld3O(&4Tp{{>s6?4os1r
> zu1(RmlX;978*nmsH(7dytX)RnJ9!<>c}tvTnx*dw0|#(i(9C{}wlR;LN4QFaZK+2G
> zr?1CKCytJdpBM^^#n*_bZG@~*)&fhsVy5&7+G{CIW53}>L(ley&V at Q8KN%3$3GMNV
> zh_T-wwc|Jrws|*MV_}=%xmV5KqQbZsOxD?e|F^9R|7<H+b1SiiUmA&a{wWLK7ye&s
> z?=biZy8gR%>Rp!tFpqjA9^kG;bPM__YW5+wYwa_A)#6L%6aO%HmdqqZkpUkw^abb*
> z&=&@K^aV1ecYdv}z*xyMeGXe*t}it`l{?C{a~yT at xb1Z+&wsL-)e^+kzK0#KSMWU!
> zx5hraCVm_HE|Yy0f*pu(wWn$HWu~V>JD>x2d<HlMJ`dtASPu*#d}`mwAN-}g=l^VP
> z#-HuoK-#;0oS=*Rx6M5|4(bjt{5bM%A^QzM42io~Cg8gysB~m7TP}=|zzF2_>%a7j
> zC5#Ur$X*kfYj<4saU?GCKV-PkBg1>1xu+(wu=aY_ZcA*}7odiK4Q*DIsYA*wTC$cV
> z=UXnozwXv=G<k_XPV!~LG1o&p{uNn5eg8?DTZ5#?H=@cRbHK$zoy7QPZ+Z^vM;Keh
> zje%TWjV;L&UW08owx7UW8jCUGkKeE1_lLN~P-!K`_+8-f4rO7z>M{T;ZG{afa7wV*
> zybLj=6xS$&4*Pp`gwtN~Zo*v;JaCq2RyA at q#2 at o2T&ox9ORP(&_+E9jYP|1N>v$jP
> z3CYz*`!*tXE9-#<dP^E`c+aVxpshON>m+ANpHE~aevgLzZKX?a{xRIkMmdu5*fID-
> zK$p^xag=?DaMrNxg&$1%9LIC};hV;`7HfxNmli&?V=Yy at FOF*><6}@Ke8j{z)=vC5
> z++3_JeMR*#6Ql*0Lr%;mV2Y_~W$-P+mtUm}Ud|{LOPRC~%ACy*%z^i>z+fINJbJ`M
> zzXbp4Dp40pd+p67KHp{fa^iPJJOuHCR*Mj~k_moq<halH#TW}aP9-`^Vpc!Sf;~6x
> ztw*KNnAe{%E*jiR0v^m8aqa#yZf1@^Eo;ry-x@`zTR69+tXeDT>QDo}L-1MGBeugY
> zOKSNUu_oxjzi%TkEMt*1rsYEtt9jLKk+?3Ug at Bv1XaaKHg;)ni>QHU^4%h6j;&(Fg
> zN at I~HHr3J}oQjwqvYNr~Ab;*Gul5}deQmgrP7?6lS- at 4BR`<j!Ry}*ZU%;;-I%`2*
> z7mn4U9r2zx5Axi5{4!fnL;ChEl4C at C2jC`sQIu~iitnziil=2Yzcau}eStnN1jl4m
> zCb*Zl*UAd$;l=w6{=hGNj4e2BxG~sDp=V7h<LLlb`v=2;<yYJ;&OyG^7fYd&O=`Kt
> zjbVR>&&6Y_(Y4#yTwz^!p7;Ywb^fP$yT7%R)P)#hoi^E98k at bT_$hrp1@~uX)~e#4
> z)LKy|fz%GJ85E6r3e|X)!0b)L{~K{izzY;2*4|Fqm$I!?j`toXKa)9-#AOG*#eDDk
> zJjO{IV)atok0sb4_>@j_hu|ZcK=}#h at 4|STK&^!i)dJb at m2q4A3FvLtfh!n5+K6_%
> z$}6$nRLA>wg13C<Y~SY*2ShC#NfhuA!2EZUxbH~#Q`FF-ig0{rtq_y*i5GY>Y-p<|
> z4g~xK+l70QxlH=AgeJAsf-ryl32qWK)+SJDY)yz~NAT-xRrGVnMVpS?{Rxx``;E2l
> z6MTZIJ9Ci!nq?St*ANo#Wq~orHQ&TF<=76zI^>OW2MSms(k~1Xh&90<Ipq>DnS=Xq
> zy))!`xX)3KuWw at Jjo6-dl!m$o?~@!cPoFXbo8~Xt(sN!L>Pw at Kai3ICfUKtDeT<n7
> z%-16P{}k6P#FoR@%i`0~2H+Y(uol;@A$FvYN1BTm@!-}7frl$Jdy{X&<UiogU)!ur
> z{jT=v<;m!)Bmv8~M!+)u;VwEiI=)L*(;f*7rnl)Qf&p5_#IH;B?HR|rHa7uV3M^vo
> zP~ZdhW4#H+cs}5X!y2cNm{O__?&&*0)w03zy6bxCibK~w{T?>vY{+Z8GaEQN5JQG-
> zo9g3<*NT1x-r0x5Y*V$3_)ngR>z7aXq2(ZO0dC*|&KrZo+Y2XjxRxurU9&ZH%xuj$
> zSF8d)TG$d;GpZ10E<)U+H+X&Wd6j2w*8kA6-JnmmgyT8&DaSF#W|00MTx@|d3Fc~#
> zFE1B*i<jtiU=tT1-r<FLh*)v^74$D+ at H5|wi8i~if3~r-#X+kOpPDFs4`bVb|I0g~
> z;dda{LHx3Qqv!_TK;k at zj}B at 4vHoARhyyLT2A#Pge#XpH4mh;>PGS=}#56c{t8Xvi
> zOA$Z6xHt%WB|o!n1Niyqzs7hPvT*<Z8RJomOfL;U?U#{|v+0P9XH-w?v^<NAw=vpY
> z)@iY*T~VqN+Q@*{=!-51zRT|Hj3?I`A5k at 7EBh7vo8X0BR*3!kESGUkSOjDG3GcHW
> zahwfH3LsC9{^fWFKX-xF?JFn#5C`)R`j*>OuDrKM>wZ=4a7(CnP^a=eyo&|o9L&?*
> z$mOxyf)T^ojpzA0`r%)Q3tbZ($8(NsRTNhn{N!%}H+cYa{sH<DbNbHV*!g9?9o#BW
> z?3^;+3G?q9f5ur7_5PonC8vAj_ZK~!CF_K^;}d-bWWoj0+ptHckTLC5{Y_~9ETJvI
> zY=zwmb3ZtI8*-#}#39yq`*qS5eYY{fI_+<6Jnz36f135W_i57C at DmsE|EBWP!A}Id
> z(%Dd8g|H90tCxDNu+IU^C-$K)M at Wx<8%pKID5S_wx#m(1XSdOssYw=j&px%VFAw`h
> zHl<AMB3Ph{A0=4hhR*czU<Pq-H+&6pY&mSBz^zj=wEwx$M_~8IN6TuuClPF((GGk#
> z{IDO{^d#Qui)WoMA&+G$WK^n5@!AW_(Bc8~5b#$uQlH6cD$n6Lp2YymWXkuxW;9mk
> z_x`BM_8RV!wGwl0=8NBsu02wp#X9NNQmT`b>{0ko3tLsd!oP-n0m8n*q!6~q7A?vL
> z?)(l}t8vf&kF+<BYvOv_hihA{+63%k2_mAR0&awWkQD?=qbx;hEiP5mSRz`hh+0O7
> zXb}Z>No`fYjZj2GDzb(UkhT_itRf<nh=?shYAsTVNJbcZuQS26-{12*pU?aL-aqo0
> z$z(Ef=FB<wxtHs{?hECfY+Nw!Uva at N5wkRwz3+0=XD{!4?I`Tec0VJMR-wjVcEO{u
> zkpJG0ZG6P-X7m70%ys@>V}-pWR(Q9a<$T)3#tL5nUf>tt2hzcttDP&&-VZ*z49~Z@
> z%dI#>a7s0x*3x?l6=TYA+GW7Lzr#X;F`^qdV~HNXuS)n6c^iFszB=O|cjOEv17{+$
> z)mKQMg9nn>a8&xq5w>4gWzCAE>XX at _m#sM`JO0L*cwkJe#@w(&uF6BfSHPOU*Ey<<
> z#L at qSGeNzm(a!n_$RCGZ^2KR)f1;12WGM*8VpeLP;3E2L4)SA1Yq4IZ+#&bp+92<V
> zV1s}U9lefRFCMrLk8oq*25<}lTM+Qo2?xhVLKbT>89K;+Vog43h`E8-CcCcw3&$7L
> ziutu2eLg%o6Ee>R{z`)BrDv at EW<;D)nE|``1olVa_;VcZ#{TGmd9{mQQ^~`ew8pRA
> zW8+ufM~=m{Q0p1`EHHi0BfS5?`!OZRhx!QfPOB)#xa9L|nu2{KZ9iyllXYxh%_TAM
> zGUzYE35N^TU?Pv9PgIM-JLzrEHzW$^Oe3E{2lxrND#W&%qHvAhwO67&4Q`01{Cmyy
> z9awV*{cFt~{`Z<Y{l%J_O1QA>ur|MrHQWQfvQL#I-~>ia0jvM at GfUVt_XOn>?Pi$z
> zujkR at d3@auGcvqGd(ww1nT~hdk3v2XjBq!xmqo%zQHqg$hP;10gCFMZhj~8W2SS}Z
> zdQ^BUbjU_L)BBLG0g2zE4}M+=eT0(;8G5k8hP78scs9g!h>Z#?`!L+kmE)Wu=_;q3
> zVPD9RQ}-(S9 at WHtgT9l7?Qd at 9&HHDKUTefU^*nV6a`28A80gGa-av=U{YQji2EKAe
> z{}OEGt(?GFQ`Z~m2wlK_j!SCl66JC7U(^b5w=8r&UhSng2|QCL^yYLtUwf29DNMc8
> zQ%>6voMdr1jr<`ui82E|m<%hHSSf^`BTp^oevSP5e)yXn(g}*YbiTOP=eYS2^pA(t
> zYaO9~u<cGmOz=W=)PMR24j#7J-FWsZ1p5VlKpuSEO+=<3&N~_7=y&;7VZ%_P9P6;%
> z5V;P1aG9W&T`Tx)+bf0Sy;`x^WURuz&P1P<!&gyM0t^S`I;kA~jT{ymj^p16Ie}>Z
> z{thX at j_QJD^+Ugu03VLuw6X{z at PPyu&SErcZxSr#un?2&>D(w5x81p$5yQTdV9vfj
> z;3J%2)f>zU8{Zu8$<K$(NeAx9ifg0>{fXL*2dy&Y)0BU3jf`=maILWlIhEC-iV7cb
> z4*LlcXIB8 at cmcAmo$$c!=p^?hI`yBYla2waIF{II_Qk2E2|lr{fVC+v0Owd`cL={5
> zRT3vId#r?vF=OruiPK1Jf-!eJnRku<#z1yXWigNv95=z&!86O&IzXo$`xjdy>_9x8
> zQA)6sh`)YsG;WnRiL?&v^<;P_FXKF|^*->ULAD+2f_%EgVlR!`Bu;hO8SJ^YF~*($
> z(~rchCu<fko2YyIynM%sf9^evXJ&jH%u}(=FgR7 at QWppo4z`bL<EiJDrj;PKQG@^f
> zfVw#|)DIz3&bMUH<FMZPDpIu)$VeygNrJ0l#E6d+6aAB7Qo!MugnXq~;lzvMgl7Ej
> zfATXpj7EFPcd+=+x2E!|hKfo5GCcS^Bu*8~DD=@<WA3NO|6f7+aW(M`nPuvSN^r;h
> z1rE)T3-F&C)_3v?{L}=$W%Y6F8w5-td>#9^|FiF8z-Lmf&Jdi(n9V4$$8+<e(_sI9
> zljqFsOx>%1PoD7Vk-6b8`o;TBI`*Os<hl-{v2O6ld)Oy(7>zX|L&h^tBp3<xUEtyd
> zQL9n^x7>Ne?`KUhq~<4ThpgLBMq37O1+Qi9U+u=(0gm-jdW^Umb(2v$899+9FJhiq
> z%~UXVIkncjlOZ?+oWEq0l{-82zbFfG%=JB}84D~Ze9)Xlz_aQ9!#3UyoY~zd1L0`L
> z9DRjwMBfO3y&PLTrEZvUV%$V!ynIsVY5ET3!LO;&28M@<0_CAI$TQasGfk=UYP?y8
> zbsfjQV=;z(oK3`6ft*EElCXMj-7r$`q`J3mM3!-dC-)kuYo9s-aoE-76vAl>yQzJb
> zkh@*RJ9QFqp%n1!U)*KKeW(GRu5Oq at MQ{W0zSRcH`0RU>FTtFK?!zZ9b%p;kCs(EZ
> zb^_;!ev-H=aN_dVz>&+TnplDd3q6uLg7a(Y2-G74Rw{J_TaTt7HO9}N9wX0#ykTll
> z3mv#fA+U!O@&-2n&x$b_nGM_;v8C-1zjaoBD1TNW0T-h^;`n0tFiwMa_#1Am3VyQ}
> z$Ken0>Tns9f7mw)wQ9kMMSLPMd?e^Yf-8KPb0pDT+!f{8=1Kew?V`0fhG!e<k`p*m
> zp3E%dI3)7S=@dulOQ-1qEUVoMUpyOlp7h9nf6$zOSh#e~v(y#9fO%uz4?3tfa(xz>
> z^KmSL@{X$(4Mh#?Z?n at ke+*2RcXmdr2ev-h8JEcxW0!K<yvNDje5ND9{&&O|wW%X?
> zK|{oxBk)1Vn62D++_N;*-MwPR+lms>$H4r+mU^F(Pr8+aoZ{^7rq1g_+ at ZF<XlYih
> zG9o962Ttc$)H(9tRwXX#*>5T0Rx!)WjOBdRx0{2Db1i4*c$z9Qb7|yiQhaVazb1bs
> zu+A4TR!F~pSHibmpXg3M%qR8e;Zu5#;GjdlbNLqznqZfu>gw}#!+`m_?84%g<Ndfj
> zS}8boesnZiZOYI>;0MvCgv&hC8)F#zlL{tYF;^Y-9`r3EvB_ryf;@a5e3(B796~k*
> z#uJziZ`g!B#3n?$@`#Vflu7 at lRGB>GJ^ZQ=TBA^;<Gn3OMBNAAMgziTu(-t|>Hu at D
> zrO22SCEz|qo_H}CV|cg4EPnVKm#@Rof52^*pe-}tn}HsW{w#qG3Vj3lbg0cq=8m8c
> zzl+cp-xJ(cot$%I$A|FskQ~Q12)_Ay4RoM~m>22Vi8w9;X4Z#uB=s at QTQ2@HwTAFR
> zJjh{0$Ol1v800N|tM?lC9eG at u&oVP)4($BvAy`cH>&lEkmrx;c6!xG!N65S7SIwN4
> z`kOAG_FdfX$L_^sz5v5{B#~MryX4lBVJV8x22KnW2aXJtu=5J at 4!HC}@;r<f&)|hV
> zM7~7bFz#NxAGx=pj9;~9i&m;L&e`f7h_(eyN#Ptp-#jF3ApMdDoqCrSaCgur&<C)i
> zcsArX{DdWk?O-Qws|f1d$>pnuk$m!BIyd`fp)Yv7T8xt*TbE*R0sV$PIj;U5GG&;U
> z(Yj)O_;JqZf#2MHNKs1K_G13rP7sjw_!!BV3Yw1Je<d;n{fpeq-QLz*bVh=)h3`M;
> zSl=ceSdbH_ZT?Tq3LdA(G*$U=DmN^L8700iTiE&&c-6eC^0?lZ=jm&gD6 at z>M*Wm5
> zH&N?P9U{WHh?=OP<AM&+>7*#3e4N`bxpADmnOSG=q$lT1tZuC_<=a&B#IN%GK0m?>
> z_~0yX(w0EZ08fj#%>{q>>);LNlJAW->Wai|s14xCuSs1E-EVLBXQ7-Ni7v?Y4Xf?3
> ztC^c-^5P`ddI6U*wm3I#j#IgtEAAg{Kz%D4{j;jX!bOglU%9#<|2k}o$orM^@oq=f
> z76K=G2=CdUze at cQ`3<?cZWxbgrp&qxO2ZD(U1NsyuF-Mys(=8YvoS!JnZf$%Y#osM
> z=FlIwAk<U6z&y=T)apok<64EV(}w1RZIvjOLa*u_SEKOocVAhio=4s%@V-J9V}fX8
> z*#hz5imzqEN at mH9RisHC=?6&%>pNsb28WKoyb!40MH|kV)O8!6OW0tnq$myaD6|7@
> z$r%05Rwle_H1g2yL!`|uI<)=7a&RzWy$$kS3weE3QGq#z{9;|e$oIZA#vSBtgl={=
> zF3y}47;~{r6GiZN-yB6QU5X~wlwZdoITXNGdE(rxzrSl4=wflXxX)QGu@#0p&nCW*
> z)@ks47^xZg(@;BmdR(3^h-*?Vg--?R(+gS6+Xya)d|(j!0%u)(2pwsHkEFHQ`RM(<
> z&Zl}({&`mLKDafW>hBMGj;(G>5#p=I at twiD8CchFP1M*~rtNU=F<Nqwd*C|;+{L)(
> zb?BWn#W$eaz(%lN`mZ&v1Z~`ndrVU=bKj!op^tJ9NB3ydO<iXQ?G3WkcT3r04=@&{
> zLcZt!e_cn&{a<b)xiO08YMMjpK>m~%i}@C&Aig4h>%Emr^#V2rsaSm~!iUuz_6aoM
> zV?u`^$GniVTTPp;*6kA<=?3((ZXbA at 8m)b;_xRWU{BZnH&h^-KqvJN$)%#D3vdLov
> zXn!H*buw&ea89QFj&tS{{Z7%RrWFRX;WhM03%2|4-bOngx?jFSLh6-3S3DCAd3E^^
> zY?5NcPYQ at XQH|WL4MNz!p6gL_?hj-8HqN)t%0JeMgu4qx!e7tUj)(o>jo)W1(~3lG
> zq*js>{{L-<yE~ER=x4OUh-=R#{eZfB=#zimG3=SC<}c_eoJNuB8Y6h!zQujdb~<F|
> z{v{OO_p|2(xY_>}2s~&0?$0*&J+iky-@?bc8cb^0t<~4Qj{Bm{Cd=Pp-)2<T;d&nH
> z8FfQ;`c@&@C4hb<{FT_7g`LDV at 0o4fCXDHo2osAQjd9oed76z{$!TzjuabP{W`D7E
> z+`NADJz_7T;z-<yU-RW*@;-+@#kD5C7-!`8*)JF`^y{>NcY?Sj`ZM48=&$4*=QEz<
> z9pJYjK`;CPhQPHKx2Fadb})A~+{*DagfWda;AyF9pid(2Y_++7nSuVfjdym$y$JIM
> zel_`lj%Zy_7<@2f{-ZWIu4`U^Iii7WN%-wgGO^H6fSF=OId=1_>bn`AfqSNzjj at nx
> z!#CiXoiFAmkHe0`4Z48f*KwTWAlp<ws!Q<!cg2^UcpsjS;aU?b`@&c`NaSCo8+bG(
> zhI*=mN-bo at 7`b<7cYrWaA0T|?*gxA$$UtZ0Y>>G&>g#{znxheI7C9gK)!=;UDaM`I
> z5ADxG`-}gx{eq!^aTnW+W3fg at Wo8H+Gxy&=jd&B*Lprgse5#_cNVMwT_3NN7d0uQ|
> z=ge1-gI|+e7N^4+h1?HV3 at 6Rzc?|d+ARo~O_N;6}j0=7W_ at 3)hxJUTHj!Ssn3AMHg
> zV~PQBt`YF_xw1NJLCFa4px6tJg46oPsnB)EI{8T#uJt9!3BkR-gw8?gkBr6K{0g71
> z5#!+6`ToZ>B;*=ojGP}yWbBA13RWj0G8gydJM-K1(4{9O_2S(WMwJmeBTtHZd`0Yy
> zQ1H7n7EN8p>TRCbzgTye)x+xQb`tzQ=Xd1l9YL&^@FVmgwhHc*(7}ulH9vqoV|Y#n
> zlS(o(s0~=Fc5)Xj5h}m6>W<*aKx|e1QRtx5^}tKS79XHu+1dk{@Gp>hPTsc*=HxT6
> z#r+iWm+FttDQ2=21?%F>g}4uM`?RjC-3}k{8WR1qA&KOMA#Vyg48e5<x?j8|;~fo{
> z;bt!O<FRvgR=3#xym}#Gr7rBc*!<p8<>r*q>Z^4>3|f+GfGu^|cIOX5?zq$70^wIJ
> zm`(cX>Yt6JQ)lNGsG;bOA6!o0co05Y_ at Z@(q0f~4e#ad=`=S0MhQSwYT8$6lBFf{)
> zOE$oVUpk=s`r}$<e+~uzg_x6#^JnT=TPAcSo13y$7jQ4f9W_^GPJmBp8Lkh1*8;>)
> z%*!u{PhU)_vd?GvGqlL{b1>fA<t`{xf8ZX7^QAa{i}ot`9Hj6w{KyGOb#OmwZO?;~
> zz+ZpU5kFn89u#d%t!}*k at UBO3VEE^Y$nQPkLHfhUk<bbnM?Ad5{f(_*ArN=xT>+OE
> z8v_ajM-JOg;I`R)|C9WjFiLCH|GIZ_GOhYwk8y$Uh;f}riI2z_Bf@&TQx{<Rip}53
> zW_8FPFiv-1j=#@+D{ovx1zTftn)pxEP;=p<Inf(SJ-81V{KUTz+gN0~;hY9otkmD3
> z7nFk!E0J5P4gh|}p0z9e(I=19A3`2YwyV(C<C>fBUM{;7fma|H{taES#A at r;T^3}j
> zzjD`9inEMv9`0umr`u2QH~-YpGoe7e;=NMMI-*l#?|JM_<~3(MFz^zLn;{J1?R7uk
> zz2bfS?kzaY&gt#g_i`!Xi#C6hHwE`=cF$!d;=EgeJoM3G#GMSXcLc%s{oOqHwsr^W
> zg1*+Hu3^nEZ%Zupb&-zPceIpXUme-R|MB5fi%?hgs3=mU{>lY at IscJ<z;VnFx_k>C
> znzettav~^C*whbP^p&r!EvwuaaiCiiVH0kHckx+>5m>I$U9E}?(d;;IsGDBDDMY;J
> zvyieGpPEbL<soH^33}eH>E&tf2+Akcn9BlhhrUuIw$+LDRqI8|5=5eHH6qc{c(yi;
> zW*z!{P<F}_X?Fi=!nJjWaBZQ6k1LrQuurx(KAt)oy8PXNck~i>1gVt*8{XgSfn0Mh
> z!nI~o5a at UDnvXB$E|E*y1t%)TRyWpdcRS0Df$d~mRG$~49{10{ZPYcpl*^ZeE=K<?
> z7?=wS&=<h{hYrr;R~zV6umOG{Jlpu726tf1#cScdn!sZ|q$W3!OCf`t`HyxbVND*e
> zv0-mlr`=2>wl`}(|6kkP>Ihws%{J~GW`xeTGD1-v=o6c)j!+ySHaNiul6&{a1{n?$
> z9$IT|E at Gx3(}-W@<|g8oQGOh*3w{QC2w5ZB*jV~<<X!zaIK$_v`Ej5;q$JQTq?mA6
> z-Q<HqYI?AR<oeYo5WU_s<))?aP(RbSy}vI^TC<ST4_$-kmvObFoPOAT{nSzOUc`@b
> z_%+E}PWnY=9P-u$y>pGzulcOUk+OkJ`L at D9&lC3${|@{>vlw3EnYyZKLw&qUsoXn+
> z3Lg{9 at T+3yFfO>i2jux>Q)4}J4DwrQr!`+P{Ig&~__p9 at n$O5Q$xKcCgkT?l at wPaW
> z$-RRQ^Q)fS3!fegE{5QPL?4S6R-dmQx*qvU!3RXb`&eHZ0^D2y`0)mhmB;39;UBKR
> zxhcd?3|uwr%;3E^7hI!}##GF4_-jtlF5+~(-#~wiApHSshtO1a(?V>HVDO at 3ropy+
> z1Uo>i+1P^h)9O2F<-jKHWbp*z+e2X^`rw&~y<Rn`5dY7=*+=xJ4`BPVYuGFn8&jqK
> z2OA at V%`d#ugZ4b at aU66~FH_{9_E3*jVmpf={%ORc>-oga`?v4mUBlnL2k2!qr3?75
> zhnz!VNH`z$=b|QHY`U6 at Q{!MKj3s(ga5wPahHeqJGSDZaJQ3VOrnAJC6Z|YS&T&7z
> zjf^kY-d_{{1jY|)f8qRMtA8T+*+2e?+)o(fK-MP^{{+U;-_OhG-w^;EjmF&J68}Ws
> zCemN%x1(Cr&j{NOUBMY+=rPV)_P2imcD^oP<v!#MC0F;>Cvb-iyz`T?p}aESAZ74#
> zybiyG^?w`x at mtg<h*`e{<c^Ar72M|#87JhPnpoi4kt1-kPZ!XZ?})a at kq51t6;sZR
> zLqnh>FP+$rH$B+jE)ZWu{kH1!H!aAI^&{`zWVmU8?*h0%w2AmGaDTEce{qBOE|%T3
> z`Yt at za{6HlrVyXtdrw0GQ{%*4)WSAT(toTU!^7&wKwl9*#yjLV{1~N(DLjMi`)pjz
> zDv=cv at z59seDD!bTE*+)TBCZo(YOfqM=U3zw6a8Dtkjcs#=dH8PXysUmP4;T3SB&4
> z7qNMG#wONY`3mcr(A;N|Y|ia)2af2(B698>=-d|*hdMH}FVT at r`Sow3&!1t=3`c(q
> zBeq5)nG^d_FHzgctKM7xdUozpVT>onWQxf3HN<~EJ6pRL=h_haxjL<$n_U(wM7^Ek
> zM6c8JS#|UlhFXOGzJl{!#W^n%TjO_Qrx^Q#Pw(4Rm2KQ8EZ+C at l6|I#*HX|vI=hU@
> zT3Xx at 9j5zUfIObDx}Z5nB8t at k`2Wk%=c0s>u4)_Lusp!^;jy+%{ceN=vO|q_9(rNl
> zVE=F@{J`~g#J<7v48#6#tBr%U at 9z}h*z5nBjq`EwZl9KYv|E^l5zXtzJg^YITYW-A
> zv1ZG^b!V*evm;7~-9~*#bOPK%<*u*v0$+$9D;q4(by$B at y-HDN)n71w=CbnFsxNpU
> zS8xmQ6XRMNG2g4G&z$GB<y8t4874mkle##fm>I<d&%0o+^V|nT|L1Y7U4%is%;hlg
> zVOI)R|H~oB=f0ZQh+<YgPlSBlYRZo!eK-%-;<5f at SNPk{*Q?OpZ7zl$*bnvFQ11kJ
> zoEVP=mN$XO7U1 at F?#4L at n78n~?X2L|n&KuMCGt=^%2>D!b(x6lK%3&D7Mhc-ekY8<
> zn&dim-k`tKb{ud(1Rn<Pa;<6Wq;m3KBG36%TNO#Ao8c!8p at 2&?GUR>0m-b&*Agd_0
> zE^)jj8u(1E%b%J^*l8Vz|86jkp>1Azc9^`^6_5$b%?D@>>RDQKrhd_|_w}h!BrY1<
> zDiYS at BR}&i8E}u1T=Ox=qnu9gQnr2z-X!<trg?m9r+${f%)tDRI2K1qm9#ok{1ljS
> zW88OmUJt|j)FIn)*+TP3CLX at tSnd^ijL!JsRzV4gJz))tCtK(N at uVIz`a0i7W-g?H
> z&CD at B+w!gk{HKAt7y5P~a<h$T4YmX~sDcmfxrRb6@&Y+(nIq3hHm-tkKwTB#Plfs`
> zZeN2t(>V7|OAhUZ7}%D<6^BuK*wRDd7q}jc{12?7)CSUaQfCuBop^BN4!13tcvZRo
> z at C?C5Jm*<|;V%`=e!M*OGPl|KpAfsTa7V)jxKaPT;N^-+!AGPoU at x7zIh9<?S_hN#
> znYFHGa4W;xT&CuVokhH^0{M{O_711D^aYs{aG}a?wO9w$KQwE*#H#{!`!ttz39RQa
> z_FVt&cvEKm>gL=ov3)-3fhOa<Hd%O)eR$p`;MtP%P=gJ6haY0g$b*M`YH}~eeIIm_
> z at wY;WTq+!UZoWd>3|f4+j=W!|YxKNqn$#%{Uxs(Oq&NTZK5%eG;{9)S!8ip+;&|u?
> zoAG`5$}-W^-n`vDxYqK_CTkz at 2Emp)*y#(uXgvCCn&Jz8SGpL_e~#fb=YGPDf%PiL
> zK1=Equ7$0i=VLxgbHNECP<#!0uAlJ*mXHcd*3M8A5j#@-JS>^~KQ*bxmx?3T;Gm9D
> z;jq+Xe}Xq;7#GC#X8<3(6}cJ6VE{+YCVURj6n7<ZV79>aQjurIy3~r=&{o?*wJJcw
> zv5sBDzm_H~YKW;{9Vx38MV_=ABOLwWK47^@sD<XeTCsA&$>*?lDj++TXKPn at M|Xnv
> zzmnLjlD#d*0*{2`fRiox&zPtP)VM2|i2OaRB)huR*EKP`Jotf6sreG&E7;}aQutJ4
> zlAzy at v)?^2|5i-TfgEjRMA^m_UXa0)Nnb`78Rch9>Ww`mbbLgaKaVNajxb-Lww}K#
> znp!Q1{1eza@!I&bKW+17ELk{n+Fo-2?J4f#3xD`Rf30UI@(EO0)I$^rpXZ50#0JN6
> z<60E1#k|&>tAL!Vlr-nA-~$U`k31y-XA_xMl*|lF at gD}r>Q?o40 at S^0KSuUDHcdYR
> ze^Z~@EC8<x=HD}chMkW+g0sknSCRd4S9W|{U@`FHSsC at G)>n~$yu%RS2gCm9e{0So
> zYiDfD-utnX^9QR-ng+&g40x72#C;W;xK)&E<eH96lb!_zqJM?vy`;Y_5m`f3!CBW-
> z!HPaoKMd>mG4ORkr?VGget(60$v)B2gz|}~uj?%Q1Nq6p5AvkSA`&wMPQ4GufRhe>
> z0G~3cYnYze=~%`%C>XWbY at xx&2^oj}=e{P|`m27|3p+GEJLLwrhgV`wK%Sr$j&i9g
> z*<2QP6!i>&gQZ6hU1ZmB(bASe#@<{)bHweBlQ~_Tmg3x}KeSAz#XQgBV<KgT{a(#D
> zBwM#hl=1vN-HH2X-Aie3Dg1(*S-c~+$HSmceVUmeaUxuR+0P?zzqC%9L%_wB&|L0z
> zYMpW~>4($E>r$6zmqhd5f2jvCn@`t;B_?iA7NrgaZ^wB~7tysv((tm~-tr$IKX$0!
> zRW{YWs;H>(6F($&wPZx}s)ix3?HU}6dS7Ki_!!IPG~`k^^0SWyjtn`S at 22R3O>#QW
> zCFD%%7V- at CF@djzWU at BO#Kxc9V~Bsn0i4F-E}Ax9i`@fzrl0$ErwKfItLJ~&MXxvf
> zQMQ at dwX;z-H-Ph at NMb&RIszG}%NK#|IgBZfZqcMdZ22WJ$i&fW(|3D8rrO(7B)W2U
> zc0guhzNeEI<IM?HA5`GPkW-|O@}#J1<raqAV+W>zR;o0S;0}YWx9APF-eU%8c^pY_
> zH|EAC7>zM1&KVOI*!vMA2Qn-<5xB&4yTkUT4po*W!q>R$vIFWn{(8_^*uEe3K5Twq
> zn<lU|SBYQg2si at 4TOuDi&2@?K(VK(5J|r8YW=7lSArCTW(fYDZaaeMy3v$87%7O2?
> zdOp=fVcgLL8_BgLSH{aa7H$)HUb9hf)bzT`mnIIkQ9p*fH=?s3cEDem-YpU%UYM2M
> zbp5 at Q$_tQR6Y&0HagD>=D_EPJ$aRtDS^tJ$64o(N&wC!^uP$KHe>td3Hn`rf7uSQo
> zbc9QJJIU1r#-6mD at M-TF8p)tt%~+Q+{*aQI+hojiO{Zj0W&E11-L*D^r#gCt>AF*e
> zhUoI_*n?c;nstQlNIMSt%Q39WzSV{)*Im+3Uu&-(HJz=`!2b6Yj3?9w!kBW92WvJe
> zOH+pufA6Jse$|ink}SHQqpmK{O@`!vC-;F$*j6SHW*6m|fi>VMRPy(Nuc7AfR&}|x
> zA5atY80>`}+Slm_WU^xtukpss35}O-PHgOVkAdF79cbeiA~Vd_X|5~$WV{t at pUgE~
> ztv`iNfrF!Y82k{(2f}!nh>r*HlkPSp7K&7+{3&-K|HRO_XN%L5j$-UhoOBV~7AdE_
> z$b57uND`8{%%dP9+%)S+PCT*kv5)cg-qYZ5(5t9Re%ursi#sVmJcg{J{ih3~-fVHC
> z9AV>~H4DH|JPm$`sp>bD6{hi2eTT$R>7q}=jGZSVW^|q~sq4YlQO}Gomc^P)5>?N!
> z`)9Kct_uU_^BYSFWJArS-FM-Fa#QR9PV@}s$OqUSz%~@y?W}L$Hgv`-z%mlukr7zi
> zz>t_Q#}RQ!_`>iEKXP1{ql>+;hR4ab1aGC6Dv#1CWy!ZwJ8CG=+R>eU<{HW)x~ww+
> z+lkRrJDsqd68)qzB6`*1xq`VO`>sc#)m^WP+<wuER&Uh*pl>X9|2%tNuk>SClEsu6
> z35){W3C_*u=3M&m`U*0?HQyk9`eyMT^x64Gr}5eXoLnOVcCVjz)bv5Vack9%+-FsY
> zVZ1s2=rz^m{g0MMcXvmx?+cu`eQw~4?em$7>oeS3BT20hBkexFf#lA2#BOMxHY_qA
> z?bzB|B3|P+BGKpPEO*uePi$F(_mSZ at qNl>NZcqtu7rC|TY>WNI_I!<6q#2K<WgDmQ
> zBOJBwC{;VotM<!WEidi%YP`4Qes<G}4)8ubP?9=|h2g%INWGNUOjSxhVOxOu&A|q8
> zjl&+Rq~G)6Lm#cn&WK50>Zo-CXC-f3K at Yw8tY}HA{knz946JJg>wUWL8~3Tndxw#7
> z4a*OdFJFN8a at jyz(l3q5HZI`j=UQNIS>DBX8 at e8G{gC~EgO at A&s<MNg)C|5DIOVrB
> zhh_GZNTfKY1qYDIz464B`}R5DShx;f&nlVggACM2*dtolvPL3lxx&0 at pC@x$;RsHc
> z-%(rR9FePZY}N@?aJEq)Ri4E4zf{MdU8A{QrsxOso%PWn`$drXdWSN|*015CE^!u_
> z4<+d_$KHah7(3ViE|rPk;W?t`lkqG!NQAvbh{1UhU#MpDD%tn^OwFz;`$v~9EGq_<
> zr~J}IUBKcl$Y}Eamw{{WP!z(K at pY137qAXF5Q|2 at M%&Cy^qbrBwKG3_zsWYsI0$tH
> zW2K3PMN8#-pt~pScvZevBD{+FU~LCYHd)4{<oA*C;2o~w9#f6e1<gjpz9u;pXf}SF
> zu>-Q<JA0>c?4N|30Indr`&pH^$I-V+XuY<3Ire$vIt$2k_>HGtj%mEm;tktL>{LqL
> ziOHMWSBsoo%<)up4C>2H0%mDYgmYkc$k+U;AAW~k3Lc1oK1+DJjMUn_`IaFx_L>bi
> zv`mH-A0yUt)CF;=uFt`r(+9mn%wE at nbFJ0`J}T5Ds6PY_7ZGGNVh^>i6Hb|@qT1mK
> z<Be+c(^mK|(f=fW4mn)wNPiLew9AHIYG9MalK;z7fB}6r&UN)fda=@v)L^0}Sp7+Q
> zXI;?SKUbf>m1B+dl#HH!ffgagF)^g0OGMVW%-mOngEJVh&AD*jps9Jz$O)ayo}U$q
> zXT$wEv_4TMQ4b at J#FuZbsW#loVe8eyZy7W-sl?QHD~E6r1^q;Pn76=dhU@%kwJl7B
> zTbl_^isbJ)f(I_>56xBwDenD;vpX-}>hEIP@(0>NKN_8F{KXeCR7m`wkpHn}735=7
> zY6kcrC$=<E6F2xvmb4TV%AkizT`MZaJLSuUhHSvQWne?vBd6hN2d(tlA%@;%ecvr4
> zzwB~bcE8f9i>crbRzW7uX^x%Kr{0M6y~@h#*?K-=U&F|Eb{&`veloHi%zkkWI385;
> zWj{T|IGBz92NL~IzAUJdJS*WAg#CCirIhtWUVMQaBQ^rT8}V!Q9AX;5|8ocZx(S at n
> zz%s^-fG^=U?g0`zA=ksYdfrdi3O`XakJ#n6Hj(=U{Y9>iIL#0;Hb}o&-x+Gv>T}+w
> zlF|2 at ah)%@2h^Y8Ke5~cXxFdg+zxtROvWrR0&92v*5`wc9r7j56!a(TJD=}`;2q~p
> zEJPk3>Q$NWJFZiPaiwyZk9)Smua0%ierdRGq)tBt|6e`5q~qO5<zI{uRP>EOuJ!6g
> zr7c4 at iXQd7ng%&=A36?frl6^WYvr&9@>YZoi2u6r3m&e!gw!Zdl<-CAEq%Pv?Q}WT
> zWfC{oSiSdFj+i0i0&~8?4Qm9rg6_~4m2a!|ntky;rKG*&x~e5+U-&e^qn5sd^obtW
> z^;@f55PQU0UAQ5p96WmL_>2PgXHCOCjK3c-COT<Kd?I{X(A037pg%>!K1bd*D+iv4
> z;;zC!NyajKR74MwSbep(HgU0b1~I8h{I&_XP{am?f9Q)?#mC5Xvj?wAKk}k0Xw$r3
> z_vqj9+h-7?Zn`dLRC{EGx*58ZYn!X{*^U&{Kq#YJTl1^SNK7F+hmrQ=#(6tk5CuCI
> zs&m6F{F*0i;5gGJ%SP%6_NsZ9|22)$zvfxh<`2}l{@3 at 4xsI3I-Y%~dD7}6(%s-Qi
> zJf%(Vp}siZQVP2~Xp{wQ?u1Xh7cyWJICNI%jGx;hjxH1<znIK at oiXNBY@y%L6!BTD
> z`{>1aG5K~<>>D*J?8*oZkT3k>Ch&EMD^4kyV+*m~nQSkHPkKJ#7-gH+6=yH%azJfd
> zThs^?BafdC>?4_<LNUP$?h2o7`8bV&UPA$g_==K^p=v1L5nn-`@F-h-&wm_;?mf1+
> zDQ?aN&cv%N5r?G3O|KSj-~d1U0rWTG|BlyC#V6wCL{FVq&HjGk)#B)>YkA;8Lu^(9
> z+}ihU;5&0O=izgq(ya?|8+?4ofAQ=h at dN&k%YU^#+rN*kbou9)xDU0Ek_c9@|1s)I
> zfcLXkn4Pi61KgFKn{$DC%tIaF3(!q6 at LPHuu!__S at H2T?{gRZMxu_F59{M*RbvwBS
> zwg(5c2iUDK3OTh&4vsWUL$32sAAB2fOj0wAKbP3~%0wl`UuM7K$M}Z#Mah+C4`S^b
> z at u$O>@G(CxGKdxMo16E;rV>bakFM8#O6~)Fb7<?wRBUSm=Dz^g;{B;Nr<5lyM_r-g
> zVIF*8V=U<#Y?oX6NZbWKS2x+GX>p%sOBehsq+Ja$FW(0@)V2!a);Ak3cKu=9k2!(;
> zN7zrOFm5>);S2tZ?s38g5tXGlrm8T0J}N?rW4+^qza6YB!F5Cf{VaU2H$`t9Z>SS2
> zeQ_Lfu7zK<F!Dcs6VE%7tcQG!od3n%(zkv2RZ}+Q@$E={bjx1x+o)sScB95+{+XoG
> zYQu-)fFA(w=YvedaXHq0F06+?3s^b1?<ZLV``L?gu%AuVKe_iOSqyIubDNs;95v(+
> z193oX{*wjr_g0N#c<`N-fsYHk){#%eedxQ^%BQe76Bczrmy3bj171I at m9|~isVUq8
> z=&N$dEuyQh1Z&L{v^P!{P-y^1-xg9k2%OTe_ZRuVPxVS<?E(GiX&4`F7U5|}Y<ZOM
> z^g5NeVy$Jv>7}Zv6^r97 at GJ4Sp_&9zuSijfdyPWQcsXTab6!#3-n;~##rP~xKgV(8
> z<APHqwQ|clWhWN**ia2<%Vdo0DYkl<4{s1~)E9S^ywr^I=dJ^j-?}vOzQgXQtum#;
> zs9L=~5C1&~nWF<fe`%)|{`)$9n~ZlloBhqAwR@=+??!cadhyv^KSp=&j?Xq$3US_W
> z>oq=)U0;T49I#&F7gZ-ukmELuH>YC*=of`872|}zcXx^g&KFl0w{5VV-#HST4l48&
> z$&J0MID?uMyeLUqCR3#_^a)X;(z)kx>;!Cy&n>3Qm)fK>tP3`u!)JSx!MuK-VWgj0
> z#Tix0#dwRYFmBiwwin~=ImTdAtu2m?!+70@|MIQBt5##*V_-i3`vOzG^W8AmSB0;*
> zah0rpZ=Yl&a>MgEbXCt|iUL1I9Nw=N+819O7yA-wI&qBLbyDQ04dvRZubA?CdEhe{
> zfqw9-FeX?WTQv#FBZ<ogzMm35BV$_byULgdzvZ(T1IPO#Wat;v`T51UQr{>rb(8CG
> zEogfm-hpkP4^@vka`1U5%V<+%KdBq02S20>Y~$XsXv-a950C$u=DBC7tTmX=O&g6m
> zRDRj|PG|gn0ycUIxCN47CwSs}ijw$<*CkmTE5Ngmhgd3Ou~$aWy{K8n>zPIsqdrxU
> zGL7Uwy7A1F0ix`T=6#UKCH`JfJhL=Fl5NEC8Gj!y at P7iFIG^~tQLj`*YM;>-mm-xA
> zb?o at 9;8Hi&w at bN|7!x|eGmZI{N#+}E at z<yR>i<)TCyBLwlGz;WZ!2>9)fnjfO+IQN
> zo$sB*4OQ>qE&>jDWQQ$e>LLH3usIe%rjBG~lEuF)^;gtA_d)GH4%b%V`sjM|9^lOH
> z`5(YJ3&`3<>Zby0Z#X&C)<DLr<{M5F(Z_KA=PCNgKDsgT7~7vw;pLiW#BxbZvmq~8
> z4$puO)3qiK{BmdWJb@<{Owt2W^s`oGSFVXizdd7XS4JUs?B`CW*UAp_+1%`(QzY<F
> z`Z*-vnd_W{zmb}^b!t+__oIB{7TBQVJAV5awFVFVQqg^an!mnmhd>a({!i$Tur?UK
> zVg8k0>d2u*Q6H~xHJ3fUgqq`*@V=h?U$yzh|Iy|uwE4!r+I-{xWt(rH%?H>vFZge5
> zzJWF$_+Q#=lz+4}1-P~h$joX at f_2Qt&s1b2ej2uqm1*Cwe7`@tNz7Sl6)WE!sI%aw
> z%4g+U8|Fbj=J2q}0?gGo)W4b@!M7g!)mT|%J+^gagka#jy2`Vr{PA89KA6V|ka4Zx
> zcy)&lx|~`?)*Ns)q@&i?368bymzeVy{wIvdtq#?M%lY{WF6aCIE0^=dZ>`t_e$~`U
> z)ad}<F8IFrh^;$=(=2{~s~I(npod7oy`K^#Qr?MjQ#P{s#L{9dy^tH!{ArJt{unU?
> zk+Om4KqM#DdBiX2;9_nEuks&^G`bV}zm-T$YBrDm9ZOc=;82F(n&CGn4-jS_Yt~wG
> zkQp!JAg_JFgWPzkefy-W at NM8!T{zeTPSp(BdBa2J<!wbB2c{KLJY^E<%9g~fR_ at 3F
> zk0Cf!?`rGGf0f{qcc at 5hgls{clg4Dna*t>llugy8+<A}qbF{ZV%`Ve>Y(Da6=A3VD
> zKbiyXt0rwUbe7Y at q4#3lg#CJ%UnO3NdFO|D=NCSmVtl5U|4JHV<wkEF8Vw8=)z>^b
> zx{K5+mQSaitBXtq^9Fz9=}_&>!%g3tVMm#x2}eWRbyDjAd|&6POYfHJh1ib<C+6zA
> zW$?!w at OJ9{g7$4n-;Dd8a(7{4bd0Bi6XI>821$WN*;wR_dbSkdjPex!8t8fU1bC>C
> zPloHqlJ^8Z@^O|I``#70sk{@m^Mfx}Hc<v;A at xXECbO6WEN?~jHV<__X31N5_lf=5
> zO~7Ewk!Sx+wG6pw9$5}lFmgVSkKF9vbCwbT7d%B-i0_5Su>`hxE$SoKm9Y0|RFoz)
> znjcgA^ACr##vKG_gq8dG at ywrQe8!7HedlFKOTy!4iPmR;SMd$V=fXZ-<g at 0NT+UHz
> zm4(1q<+Q#`u1R<Xl&U<h at Dfe5qCk?ayq+TKX`qB+8e?r4+V~;bxCDK_EJ*~cWi-b1
> zq^)nzvCSDYe{F#?|MQt7UV`@nJPXM)26w?v?7Xb~dtPcHWXvX_*I4t?2^TnO0bL?E
> zO4x930mE~leY>)caQ1?`N9Q(F=?K}M2EF>5wL{H2us-<V<BHGZZhQE at PYFJPeiW^t
> zpg%1~|AUuMlhAnM-V^9iPcSDrrhN04SbP80nREf?4k}czjUB-qC6F(pVAH*yr&cYR
> zhOHj*0sIZ`Thv(*65<oN0eP|^9=he?2r=eA4c*dEc>%|uZ*KcAf^e<k*u%Waiv#D4
> ziSU+tm*rI=*LR8q|BqLksVwC7;F{2LF~(wD@(213xd1Z-1Vi)pc+s=trT>bd=}adt
> zk|8)~COYzjdYkeKHy>p_vkhykNc=qNyt#0eq{B#q>ty%u4%?C($oUw%vD0&}7?jIy
> z4|{Pw&JDJni{~{arC}{jL+%Tnxfr?1yD(0$UgnXtF169hLqpcHqz_ShQuK~+ZyEO>
> zZD}0QzTK`wZE!0`jC!7h=Q0y<L$3-CmS4#cdA>z%@ybV9pE1LMqX}U2z=(X&dKNVZ
> zJo5e4j&{p1PkcOA8mJu?ef2`6e_wM6XM1yLc5au{-&f at Nsb1v>o<kmQE;ZTw4drO=
> z?ogi3*mV!r$O$imPP#xtYLSd8wx>U<K&*r7&gQKHCjc&(EX4G_X%2`cJTV8GUooEm
> z#yr=8T;8 at S@On?m%3bG4^8A1?e$9V-l#4R4`CV`w`Y1D+hv3*&|1a>re#FfRv8Ays
> zz}A9ov218h8FDPoJd#C|eBWo}8S($#W{R`4d24ohg4DlXB)YFpIfq<lAOAkeL3uH?
> z!T-5P^ou^_JTL}R%>DFaZp3~qeCEiD+de_eY#))iKT7--IF`qp!1c at HK38UFV(s)K
> zk5WHnVC&g>hUVGn+c%0^Q_AdeP&3v|d(|$dhis?3gZx!-cbtndL+`<!^O&5&{&w}n
> zf1GCH+WP(QA7NXvf2z}b;%}<<g*?GnHpeQ?Kn^}9{f6he2>IA95%z$epLznBl0%1L
> zu51KX)uP6i?-jS|>8(V at VH=07!#jHLt+}T7is@>;;sn1+)=BVwsMl%48YsjyPtQQD
> zbm(IxQG3lot(3*73DKWfZfWKWavz+R3O=lCT0nBA*|itGF{KxdyFsr0_Z;zUin~mS
> zxEH at Y!a1E(9C)*F9`@U at P1`|gLEA&_ at pz@`r%wMR8(LMyG>i}<e$tOxG3C at Kr{C4}
> z_<gjK8NXGipNbjO1G1rplGr4vb%dI24T7U={~RmUQ5;Sn9r2Fe6+h+in%!M5(;{UL
> zzovJ+-%CAZk1a*<y~6pYB|>#!&4eXIlC57CUe2FCPO?>9P@}OkXyV7N>3G$pKq6UR
> z1dPT&Ehn@$4mR+m?B|R4Y|Ynwnsq$XSIurhY-#@@N%r$dyeph at 0MBz!{RId4QD`?8
> zZRVgJycLJiMErt_q=b8*74_}A^)w|Y81N0 at H|~4rBNDrvmjn!9=v`LcnlM(LvHW3+
> z6(zO9bwSH4z~K)q#(KrIB$8O*X14$T@)LIa4o=G3sH+QE#_rb<Sr)w>e9}QySq8lR
> znaW~r59xQviY7~3WQGO#q?X03f2t#J at S0t8pSUM*#+qHId(sUI|94Mb;T{O|S+iSS
> zUX6M~Yr63H3!iqCt63-4-RuSa;I#a}b^XcS#y7jR+7vm at Z9)7GIInTQH;KtsfyKS2
> ziT>PV2pPt;!L`7HAh>X{*QSE$b2LURRJO}~Z|+k!HeP%}v3wa?d_O?2o=>6)#<MOo
> zwa8&9WY*Fo`vD)`r;Xd6ydq|6Y6LDoTNnPSEfy%#tmi6#FI=;WF$oIEI{xGps}9CA
> zkhOel?m&M(4!614tJ%oyG||X~n8G*)j$HGX#sPBlm_r7he>Y<RW_t?SJ*4_-$Trsu
> z61TP;(|F;@%ZSG-bwMstvM+yz+DQ8PA~|sLE&6e;pYBI(3Bz1z<Dsstx}a5J^xq(i
> zAum#I6aNRt*^`%%gJ%n0+EbRh2st5Zc9C`mPF%B_U-jh;Yu~r()fxe6pSF^`hx4dy
> zfjA=>6Y_newkXC}Gry|sikrlo2j8nFBMUpo)-C!RasJiZPU!7w6Wwxxnht%<!NC#w
> z8fpf=-;~H#d{N5*ZY7fFu@;KCgYl!pSen{%om$AX;CiRAZW=L$+%QId$C{{tK0T;1
> zA8R6PV%4Y!kAY)hm4&SC>;>I<FwT9*xF}9m=5Tv1UBoqE$FhE$H*wu{jTg;rXg?L1
> z4z4y8_|?Az{^Yo2>%?Q#l=4 at 8&0{UvW(x2 at 9-t&MBM`wsw)Tvov3y#aGJx2Fz>Bt$
> z_4S6OaeUneY_2b{0dfh3CW%H41?^A)pSB+(LVicoNMFqg<gu~-N98*yqIW9x0^`05
> zad^Fe{Ej|Zp+M|GiMWVz67(TIGT&}2lpnzLekD0PiIg=@)s!Nysio#ICJy+w!$?2L
> zufwNVseY~t_{)pbk~KH6 at pvWib>SKz#Qy>xy|*RzTCBWJB{@2)=MQlg at wKvZcp>Tc
> zw57y<ymC1HL-Jgrk<Wc0GsAB*>cm)3R~V^>aRj6Ji*?*u^)Nj9Znq-%uKu8X-w<h5
> z05caqsk~Y&M!p{5O&=EOEPR at K<$}@xoiU$Z)iQ&`4#62xdeDe9auTq6q~6;k<m(vm
> zDYKIx552cU7OvOW+ex+Jcffl$JQx1SQzje43Y<~9VH|jLEa0pB6ui2KH6$ICm+3Dn
> zGO!M`YF5jC_#;JC*dD+6SQ>2;M)2+=1`U5)f%;_y@?&|+>4ok(f=P{^Y&6=tHXbr@
> zNiO<}ymVcFgRfyf%iFzBSq^{jQRMZsU17jqKbH6?eu0mGn}IyGW5{PaL4B?~N${KC
> ztT`&O2R<~O#fGMTX2pg&KU!p;`G{J_w0{ahd5;a}oYpAMh_<#|!I}@gmMI0I$;-+9
> zF|7SZ!Qtx*9qwi5n$+VxJ%7=oMo6Q=m0GNK=bB$b&hHfTeU?iu-b10v8~wa(I*Zf1
> zv0I>r-IuQa4t<e<<Elyi<a<&Ea*#e?bIgBs`8&rP?`s$FBO=}{th|~x4!I5UUpaAT
> zI$|2yNw95#+(?emt}665u&<UWT&X$+I1X>|V`c<5nfN}4F8AKk_nXj{3O(vkKn|QG
> zV+VES8uim7Q2XL}DZ|$Vg}wzGq0F(6UsIQs$REf%Uq$9lj2`$`StZ8)^TEq1DkUwz
> z>Mt!LW3f`gy_|^LH{7EF{78$~91uD9kSvI~IRQhq896i26+ut0yx<o5JZBL<aoR(n
> z(~i6$gAxu?PI|2qxckXC{R*)=F8V+L9J8>^6aA=1n>DCCrD8D-Z#kXRgDVq#u43o#
> zZox@#LcEOll|ehsSie;Y&ZKF;m`)*c<NcS(IM8eXuCoX_aV}?3j|eyk5)awpGVcZc
> z^oB(jkljysC)#uj_IJmDb7zdQ_h2b^rFD*oA7FgbFJfYkU=t1oH>COu!QbMV5`&SF
> z4#X5<F>m`6OBpfjjw{OJnA11<90q(3hu~W{vv4wepIOkqVfzr?1o(Kqp9AhpD>g9E
> zH7uF+=c48`D<hAxzC_5)mc|#p#P~@OGpus+*WH!*@Eu-aeTT2%UJQH=9_oz?1+WGB
> z at SO&30r|p?`)k3sTSMxt1mH7^a0ZwwA;*oVZ<D1CLax9e^vNwEcf at __00k4pi;PB|
> zA^*Y@<aVx~o(tVR8FJGTnBfxSt-PfbfCtl;yob;?wNm&_xq>1qE*JJ2$z_Iot^0By
> z&(8BA$*pf9xo%8DrfNu4<~sOnWwFB3Ts-5 at zO$ztvE{|5pPq)TTi;K}H4$T7iA9`5
> zV!p7h*PM_1y1pVG#Uc6h&=2L0L+1rf{QP6=FT(v7viUXlkjIL(h8YEYW^$J=MgDJx
> z_2M1EdE7OIl6C<D1m3_6#%stI{8-zA_I&{z0CM)`CPg9EDECCyi0R;(ac2AfBXT`X
> zD7j{3G1edopMiI>E#yW2-&fb#Sl`pOvtfIPeOJqYeYX$iLZ at c1zNt5cU18q?uw(SI
> z$aG7*a;b(IlpsG5G6eO*6QJ*u_t^vYzZ3CPlJ6UzQ$uZKb7hVn8jSaHvvJbY2Z{{&
> z^pHUekK|DxF9++2I)dcK&+juuH>TFrA;0BTgqF-jbp$vrq=Xyd>~xaHGkc#S at Cl)F
> z)kg4h3!fXcQsi$wAafblz5!m829_7)WBL0bo`f6a<|fW2g1tq(GQ<JR$%#FU+v{#(
> zO&OJ$A$!BTkG3ILCE{x({f6;8UKbSXrZijvA6mb=0&{iwC{jz7$Q$5x*z18K;-rjs
> z=4iN0$RPN<z>k7w!T1>5z`dg`b4gPV=AI;6E9!{M45_1;p*SRmg8LrHp)hf|cL-LA
> z0`JNxZ{n|24vFI-FaE9UUzphL3~H?DJnEy#tbK#=YxO^{?UiB;yt$LqibJlHu$ADZ
> zhLiOV--n>)v@}UibU64V at E)vV7j~JeIbR(yFN5^mxYtaLH+N!vLrnY{?{7?bC%<aN
> zu%uFlvROWOFWw=YSmV!KlM{^Iyt{iuVVf%5fqmz-xndnUiT9DJiBV)Em-e837i!~J
> z1ZkL8;cmiKCFQD2;nys=48E+{Y6lYMLd<40w;|OdIwenHtQQgdEHKD76LmpT-&7Q(
> zlmY|mXKacx7vCGw09=o+T?MeKrI1a1R at r2IPf{mk<9^@=@SdC?|CX}(J|_J?`97$P
> zzC8~5i^o_!`r<W`Ye?Qn(oyame$}cj2Ke~reg7UO7;~c?8RV*CtqB=~XA<d0bGNHU
> z!QSF<?~r#(#e$n)6>xw<r$m$YR(BKFO}tb1(19}}*C+2ynYDJIl6`k-)H^5p17jo2
> zIyRu!iInjvdd>s9?|jsj4%}4?{r3MSk4y^iqT|~fq at -rukP`PZB(A*Vk=3t(ckywC
> zgUx%0m%GB}X}Fc^Ad?|qHgKYR7r_mv^(=o%KDgPBkocW7ZjATx09XhS*2igN9Amw@
> zfpydw+j?W+3Mq at lXY(+~+`~JV%dffp{r@}%NuPh>hWxr?WDO;;=)~A4#K5DwVPlTP
> zJUT`<aDDQ8xp%ORHN_Tzdy&SN*y#>Dk9{JWizgbCk9?j~<n#25t6AQfIw?CekmVgb
> zU*RF{HHHg=jXA>GWn58c*$&aS6`jKK6*I(6&#`8fZFd_Kf&c1uNCk<=X(zgtJL5IR
> zz(_F8Bx5SVebbg9zX5oJ+sD`(8*lC%lVm-xl;;beF9h@@<C&XSoq91_&j|S(H+PbG
> z4IC7>f$`p7+fjyGFfRr2JXcOYUo2#0Pczo*TCBAxIpw={Va*?f>ol{x6+dI{1 at wAy
> z?}See8M4EN<RKE?2FS)WsF5+1^jD<6Is!5?5&y4!@%xKh<B&l+HYrM+=k~~PuO;lg
> zY6*5=Wn173a4)$uUg&4+q?o(L at G-bP)=!eN@|h2=|1sK0-r+s=c|HWMPe5NR&hNAH
> z!+&E at 2d-k4u*LenaO?lpUlp9geHJ4(r<|IrFzlFz|JPzHctQ4k*<@4+70iwmBp1!T
> z7g!R=ZSW^$5g9Hog`jK3dq1hB1%IONFS5TC<F`@rQaS;#Fh2T`Ruu1eEo$A#XEr%R
> zZZO+`%X2gDk3FANM)ERZzjZHUJV~F!uOd_?Yey;ycQ~=<pZ#CXFJNL!X*mBma01Dx
> zzYB8E{twm5T#6ve-XPD%#3BdhoT3a^5eLQtF~)U?g>g$!BUDDl9WZ9d+uJ$WDwn3T
> zDfB7j&|j%Zh1F8%uj$6ZjgTKZ*E`r_>@3xLa$TUq0e6U;QKBaykAs~<3)#FzvhGe{
> zZJ7#%0Wm6qf$C*UD>J^By^_=)>1*X+{dUJXZp8XM9(dt0tmWfa+Y-K6>)IRrcGw=P
> zK6F2n^})in+^~)H!9s6(++10}>PX43Eng>Vv3et}<%(;naBW{~6L8HLShF_}eZZxp
> zM5^dRE^;{&dwM@|AJgjNky92wp|l<KB;9#2PXe9u(gWl2G6L5khwqE*=UY(Eh~+YR
> zlhjtj8niIe7<-9Z1Ke3oq8Gb8%lNU|b7bACU#?gRT-F22$<r$6J8>JnIW5ChwBdnO
> zAL{zf^wxN<%xTnc;1s8>-}*u~bPHB?Bk$ug%BO1^<=f>;`Jw%MR=0uw27ME6{9(rp
> z;CvS%#uY1mmefEnzXN*T2<Uwi at R^9uX!IMf5}SNsOPh&ZLGX9bSK)sr{vnyr!qjpI
> zwpI}K54Kh?k6-orR|Jnu*7no~;I?vWJoIGdG}Q4*{41%1m6I19jUu(7*8iSALohph
> z`pu9MUpA+~)7iCcKJY78Lx_$E97iA8umL`RJrN?jJK!~1JSq(X$I2u829CK`>IaS?
> zK7ji&@{fR9YgpOW_gZl|<&WoFjraE{KI`BE|7?{6y0s3vbt^s-Gzq56DVH4E-6ZA*
> zq^87xK8G62=02ilTgS|!$`?A^=9gZKqeu0X7l=QC)vE{Ld`7(y`Vhtr!QEXd#=YV&
> zhP>u5KhszXPD39O{auImUW#aKI{5eQvAP9f=IW8+K41WKmRPf%9&G1}+_(<S>Q-=v
> zM<OT8e62m&P717iljSJ)aEcM<#P{e?H>X2wP%cf4IsY5w%iWU4m#1j`<SF!9 at C#Q8
> z^d_z%U5n$)Xm{`nqOQnt^CCJv(&*FJc9M~B?Gs}-JN4t|XEbj>y%3-Iy^>+)i%KVF
> zrO)t~*Bd at 2XqZ7784r0hvz$NQ*erw{BZCidNpRAO|3W7 at q(-fElM!tlHNUhOF$DO5
> z?x|NpKNDm>Pmp5m_XIxAFEhjK6HWx`MdZdxP-~t%*OHlrRMh!Okj{JtUnTsS#rMYz
> zQ<f1wD{@9hgA-^c at PMxzpV9Lj?E?ES6Zf8joU_%6=ir!2M15qLr6k*6VzHgTp$c2C
> zQ(-n0YMlaPuF5mah~kU1i}^&Xx6+q6rVDUB;&O~8HMLyCt(K#M3sYmVqXL~tzh&ze
> zklMg9Wf46B+zyrGoWW&>rK-Yd4d#H<)~r%$bk7I0i$W at DXerjtK-(iYu_e+NDezzw
> zP;Qn>8i3FLyDgdf<L20(7A3b7sJq<1OuLnRHE=xI{kcNVY&ECQL*4 at CaQR8MDXYeI
> ziU#K&_I#_tD77nh=07c+5^NtOk^~#It_mYHRr#0od|l93Pt+NGJG+Dy3Ci7MyxYJB
> z>%g-M-;naJ4w3m7J)B$@=S|AY-BqPr3b}L+xm`=Cy=@nK_L?>7)!8&PrD7labR!t#
> z?x3%`JATQ29tQuhR`5<)ng})8oCh6C)}x<WR^IKipdOoL<y}$}dh%b&9+Nxwa_VCF
> zImUja4ElZneM?XPpM6T=(3PsbMV#lBeC2#~x}r37ik%4Ca%}yIWI5X?Dfk(d*_D_i
> z(R%QMzfQ)DW|Yf$?F{)IhF83F$aiFn+X<6p%6!cR_YUoCoa0B%anDDt!%n?tO9|!I
> zx{R8ceeIL+oF~rw>>{n3{2(|DwqNtjN9|RYP_3<9MY42#8F1SNQpCXiPReBB=478!
> z0Wbd0W>%tGgR+botvpEjij156M(FHI-a<X-?A$0@?v`$Q_X3e?M242sQK|WGx87B-
> z)Xm9U);UU9s9Dao?Sf{5_;>J)v-KR2o7ro6-B`F8wNlj7JOg4-rNCVdQz18`X*$;)
> zF$G-j^F`D!WxvQZoDvONFY4G3{fTJk8og2WPPr)dHTX`<7HVwvb9=t4wj=hmaf>ip
> zMN93FD{#B8LzEpyN$vC<F4=LhQi0_f>O?jRx!00`b20Ief8rHARYbSwMg3;I)<(G$
> z>u)~kv%MnDPP$>`-8_Q#v0r%?Yh)k2@%=U6*DXZsx4`5MneJf(7c%B4=5oBOCx;#)
> z$cJrEsO|zEoec712+3{hgYOCZ8x&=ImY(w1>5-ne$F~FH=9y?)58_bDqNKY7BLiP{
> z0^T9v&8ZsYj at ppm6(!%v`leJ_?B~PI5BV86Qn%z|f}A18jt6??ePR)F?d8*h#$Fo}
> z*^liwy?3#GNEJB#1<LYkZ=lX#ocZ`4qX+99zf($>2G?@u3#~<L4*8$BHbpolbOHWe
> zL^jSZP}eFmYCPiJr3Kj>dJ5*R1ibLgsLR*jkPf_h9}OS8dN}MD7wAFLp_ll`Uk3Mh
> z0dTwJ=(mJq(X1&N2NH*BJ5Sy#YT1<6zCPbD&9%c=BFi$4<6|v5<}g|>0Qcag7St(0
> z4y-rg#G?o<9r`P3%Ay|*(I&`mo>`YK1qN)qLp(L5EgSdQe!<PGi=8ojpYzN<z4{{R
> z2+n*~g1P>+R%X1cL~S9J<9tIOkMrGy8Ql9dzQACD_gm%1VtOAFOmCk(p7V|3@>rjk
> zPBqqB=sWdPa9h559cnX<P?la(>SjINFDOOd*7xz)T37Ygd~rR*N at B-P*8>+*SRx?T
> zAlD}~z at S5NR)TxE?V^6X`FiYlZo4QXPW1Rv_D>I_y5OYb|E&2~<1!$>rz!7T%Z9z^
> z!Sc#g5g#;pPU0V;E#}-<Z$%*k9HISqd5W_SuOQKfvpCTX<3i}Qg#kv8tjn~C#Dvjj
> zA>2c118~Hv6=!N~2d=+`I|A?h9_mb`InQJY#v#`qV|aVb7|vp?hw<_XzWe~@J#tzi
> zjWuKDr%eMVhTczUKtG?wJtk-e883e#%g=o%oSs6ZwPicce4c}GttIQx$uTyCso&1h
> zr}1nGx_Gao9ri_iM(|l;F5B%Se)>tq%c~}nvBi~9xF_CE5x7HOyKwE1zj#8AbKJq9
> z1iQx@*fG6&Bx)ROMgGG_=bJ<_5*rAqs{mIK{7|TO3;%|2Ht=g$?}3foIW)WsvFKj#
> z=h$i1aJi{WW^U|DF=fdHGA_EoQ!h_R(NC%{aqavV{@9XgN*6GV<1mKig-iKW7hguq
> z{T8X&#}~dk&9ZP at A=7|dUO(%)4=nl;1~R(u$;z+u#4FR$=7~Ow%~N({abgjx&c&EG
> zf~^+YFV}soyny|0%iYW+v;;AmyjE<x%jvDyO0kW at aVd^pgdXt*YHg6ZE5nTwV?3+V
> z=8jbymU~}6t&X(w?Dn-2pr*xW)B!Ifb-=OK9z<OYTI*G;qlP$PoiRU$&l at tw+>dQR
> ziUBzT(ba~Z-CT%FZ&P0Z7V)lvp+(?U<%M~nzuzQW*Y~Ck+|M1ctg)u==T2DJNjqib
> z&I<<K23)gls1->tH*?2kU7Hs?!n6C{2m!dAjC%NK?}@DK07uYltq<Dq5+|Tq#PLEr
> zR7brEp9<tAH5gkDJ72`H9z2raUPA at R)e>-`d?|iL`o{TC<I#$@Ilbs3ow^IZ4_g%w
> z?mJtnpG?NEad_%{ds_a^%45H{tv`u2d%C$QE6KAb8w6V1mrM4seG_AKWE{AT9-JZ1
> zgE}QzJ73x(ydU<GF`RbzkmQ2EXMG{g!F)W=gXj|SloH>VPtz9JB7ahz+#bbkss$${
> zZ2Zr=z(Ww(6>Urt*_Hqk-I$s at U>70JgkST~Wj00v|CD--i@$oLQ!9K)Whr{6hYW9U
> z24rViipZ&}nc!)7%6R&Y(*eB?cm(Wi^PFcsC~c-@%OndE%Cu5{CT)yO#m{>9RbmxO
> z$yl at S&R?OXL1z(hs?;l;&OI4zKDO&ebIz_Rms4q!%{LRP&FP27uKoD&CBZyVa4*xx
> zJAaRM_5Z1PDA$ZRVtbsID5rh>ZJUGV^xZC5OKGby7c6Ys5UXO_)(d}2z^-C{g3Cvn
> ziClo6jUw?+<jxI-4D at WgfAb>`J$ys7R)S*&f}_HJ+5~!bTR`e2;n~2?5V#<uPW^Ty
> zgRw7Foi~>{&;E<#WL(m$A at Uz{8nym_m7M7e9INx#_M&TJq90xGGeds4BX^0&G1Nx0
> zC$b$fU{uRlN)p{!;tCnRM%>PFetAHj<|`0WhaMZpZKv}Dr%c098$oKDuRfqCSEq|l
> zT6nOrt-2MhUj5!d?Qn3;r|V`lxw;n&9Ji3;npnYp at Vnddf1FjW|B2OQ@~)NVS3s8m
> zCYIIBdey51b5#<h4()!1^<x^f4S7J`=Kff3&i&oZ1MS#0UxIbG0JT3Lm&Pm=NtE9}
> zM<IM_M#Lt;yRE#tS3gPL<A6LB<cDJ2XvBCv=KRtFeK#NL{7WtRZcjl)w{J`t|N0v$
> z@|-3PdCpeUD3GTli(;mx%ED6cKAwh;nSHE1dfiE4f7Ej2DZqb}JG(wGFr&qfQ$xa1
> zuK89NqhRxC2U8D_KegKpbuQ_+w~<#fdKTnweWwWi_PO&7sq#sBCt;7V#<vA{W^iaY
> zawY?7 at wAER##%nBANJ6fO<S=)0`p?bEMq6}(_?<9YsvSp<ZgSi&#A8E%*Qyg-jnDB
> zJ2%TyFploh4X}kjYO$gGxQ8tz#%rGvUwJN(>n)DZftErJ-Ud!+d)|1|FB~!9+_f?J
> z#!jI-)|B;FQv_PzoQ=D^T`u_fj1F)U-VfNlt@{A=!MwCSdx0KxZ7M9h{4(k?#wP#Y
> zW2eP{@uJuNd%Sr5YrJg4c*z&!F;eo*-z at +SpmiK=;<h&o2lk>tu-!Ty0^ieL{U67}
> zpBNAG5WhYJo%>ndxWD!29E`nEGWPU71J{h<wqp&wt%*gAYQF1d<axE8WPCWS%M-wU
> z`oLwA3Ye~<{wPut^R^1>RX4%9^O0lI0G-J+KcnNbNne?^!XA7BdE~up90c|5FfRqu
> z{lU|CyQC6p{q*U<MCSnq^bU;s&=+$+U-v?Pe>LN96S<%DKBzs5I2?Qk3$f;pB(ezc
> zqY|@>+F1Siq8Vciaq-GDx8r7TL$un{PA}CT<^V&o99Y`9aX<O<{;SM?;g4mBwd)gh
> z73cy^e4KS}-ssI`kC^Q1pVVxSbw1y)kF_tyihmPv-_wh>UW0xL+>uje2JEmLH{sFS
> zX}&fW{z%EzMcZaIb%rX-9?{(<da=V&;9i!3=Wr=x2y|8Mp}l&pFZ#K_`Rs#IOKh=z
> z*Z0s#k>A5m;17;!eM~I|pM8T<2eXjyd>Ow34?;(v&-Oe=NgJ=*M8>FHne(X!hVD_^
> z51CP at 2Y%{TL$?F=M`OO7`lXcY)6j3VsQ;_34NIn-<jI<~PJWuTm}e66({?fJ9Fj-2
> z0{4bKjC`|EDI)n5%?6ip(=|cG9+C11*1;Sy<`W5Sd#-}%6h-%8-qf at D@jx3byaAoc
> z9ksp|v27i{i$C9BoqNiHBwG2Ui7S4*LnVG(%Xy~^*FU#Mgmu$Z!PYxXbbt()tIX((
> z1qOUBD-V))f6D!^mP_i7hV8xP8+|^{$9$cN*(etU&&n{_u(d<?{4EDI4b1P6oXP)v
> zZqKS9V-Ip64RM>luL;f;HF8!TgR|yoEysFY^v_<@B*k_AAI{!Au8C`H8<w_KZ4=Sf
> zLjVyiVu*@_D3T*7Sc~AP)^-E+)EZ?(Y6Z16V~iFN1dl*!s{$f|1|=X7F$qaP+g%YA
> zse89Ysz at yj+13iRie!}Ncddc$y`S%W-hbXd@>`S1%w)})HTSv?*L~fpg7K`}Aai-l
> zJ;MaZL)nUa$y`-6YJeE<UW~ScLWf67&TkpYp6^C2SjTnGzWX-pRV}?SpM5{7bO%ya
> zA`a2_9!`Z$tHfA-Kzs!ik-iflOBk#L0_Ps^{Crd+M=ah)WJ&YIJA&Ajx;yDs;*gGH
> z_}L58-2;1(Ye;h8k_i at po#VWge|~?STH3OWvZj3uj2Owg2|<qQ&N;h*XOJ?4BR|A`
> zV6#6bgdWn7RKv$L|23fq+lgn!JM-1|QYKdg5uLgsM)WuCceFU+6WuECB;P~6fG6_w
> zgv7VY{^x{}6T~kE-x)7K=|8N~stKe9`Hy>CLG*E&qpEc$!@n~P*9c5VF$)(J+)job
> z<e7ZEl&leKtUvk?_|&z~HMEtXsv2_q1v4KQrWR|nH!!fw&2v)&m)L7G4NsfB{lR7E
> z($11qmP3!;PYbAO1#i;vE($qw;C(T}A>l^sSY5{b&K>S7aFubsMBaK(+YIis<{1lO
> z{F6IsT2FAdxs_N~VQ&Eoq>T!XE_5g3{ZjsK|GUg?R-zBCB*X_?+UpCJlRme)ZxEiB
> zgeR`$1K-b~Q_ at TD?m{2Sw0KB65SP2}AJ~&g2X?GA4}raR4>j~g!Y^^H=m0I|?0~GQ
> z?WIMfI39T8jtJco@|)uj{Fz5|?~~SHXLhWu0~fMK*kN8A_Tf9f1~TCsEvL at v&IDT%
> zGZWU9sCu~Sdr3<SI~%Tmb4FXTap2~hkd(b8H0OJ>jC;=*p0vf#1YKoy at XYiZ;M5dw
> zzSnwD_fdoNo at Iu;AaT0AKr6Br#0#A^7r3PQ at a+WWPHf49UdbeVb?nxsmtEeR<<&CO
> zPLOgG5_P);bG=2o)@jg6sry0VE at 17C6)<8^t(?cV)6xWyQML-a$j9vQVrQMJ=%WIo
> z>=^30IGbFZ<7ySNyT~zX-Rj_41rN9kX~HIpl=Ct4ysX|EC%(|iPn?y=PgE=9`fpds
> zd24nK^4g4Jz>m~fqw%H&xy6aU=Sgv`NBWp=h2(mAyIc9XyeUe5?OQpgqAN^)&9%i@
> zO6Fbe<dideCHh*IoL8e&IBOcC_%&qAyTUeDa=AP*o;74VyTZ6XXDEy9g2b{`dOX^X
> z(FPUUCl5m#j&?X}U)7X+EIOwUo6d#CIjv~VgvRNuL|0<AB5xmYE~zp2a5~*^Gk&7I
> z6><Ax*f$wGk{ffr0VgV+33FrONnIpjudA`H1y;-)@@=p&SBxC@^~)aW;@FzYR^0-w
> zJe^6}(wQlWck{`61rC)>$irN}bd#GuwN^JwdSCZGxC7SvD74_3#9Vv47B%imP7qna
> zy{8d4Ukn0&N{s^Va97H-s&K>x2;KvEq+OdPR$IUoJPFs04L^(gB0gfOXOEIt<D>~v
> zfA|dy8j178F60W(l8!Z`W*+d0h#hjWkO#<eO1P%N?;t?EhM;wIkojb;AYR0qZ$S>B
> z3pkcsj>xJT8XP4Q)5nZWDdb(b<>L8yz=!&cR!#vci2C7ypB&0fp|*7K+qevHLPtK}
> z?gZE7KXp0Wm*5-AvV<-|ox;cGl<JOSscTKoH`Pm_+haXSplaP-()%tox7i}U`CW^L
> z=qUVYyDBGh$AH%dxS5n=5sRI6UCw$==cS_7jC#}UO at Ei(-#K)v)F9**DC2mM-Ey*z
> zCqwP`uS$|AckTt%QlnJ0TsM&V;=xZ9k*`w0b=|jAt&-hy3UZI&o?eDuldUDv^8(>)
> znK6uC+Q(<)z0U>iKiA887d=_O?~%M;j=#Dxvg;1vKM`5AQz!#?`I39Ru-3Ks+ at edV
> zT`usAj*oLz150s4_bu=}eD0fvd7eeNU3v at RsP<e5-=On at UXtRl)9oIWIijN58CTHf
> zdi{-$q;<EUBUuGgC|gh|6=}H1-Hp60ODf?<-^q1=CkNcdpGAQO(4w2ieaUzg at BS<B
> zbL`??(xoOSfGgVx4wtO3C(e_N;Nx2 at D5`k-imCibeUV$u=S at qU1-oKM-+04rQ8F@;
> zcb?#@dzWvSbv$Z^0e&UMb81;h0&4Y|>&pKa(>Lb22de!067GC(#oh1cBdU^=HrdIT
> z=Wa@}uzW|Q?RCsZ>TF38xd!-hpvSts^?3f=&l$gp$iaERb&r;id*}qd3wZ)c9LM2Q
> z;Qnf2k0hiWSvS<Y9lVfaJIGE&y5me1#2R)oR%&c&SVd&mN~+Z&Dyqf(fXifMWa=c`
> z%V<%_BN4}kc at 4OF&dNw~Y@&%^>`uBYfqwZJwfao(Mm=RFlV`Uw68`AD#2-y~oiIkH
> z=x}FOVW{Wn+^NCkxzNd()zCMlK^A9J*)@`2t5U|BuX}A}WJayD9k%o;i^5}Lwk#FT
> z2!5s(l8fl{r8%$}L$F?MUSzv%{&Y*g73YO)d4x?8_sp(4L at h~*a}M%<=g~>sdyDe%
> z{vGS~qD&>;WIkgJd&C`~2n5&O<_i0kQc;QjJ2xwVJ1;;y`vV+*7{?co;|<e_?JxU6
> zMuh<TLF`ALq(Vj{E!4e7<$<@ktZ^Hz=>yvrHfqTxl@{yL1W8#tc*LGwHp`&HOotp^
> zU1d)ZBQAV}jE|2Vdi5^UL$Sb?jRn_Wx%yud4LC2cat6Del^I1iuIcElTruRqJ?_t#
> z=bwZvb`D~X?F4^g4><=ldmo~Gi0{uE%2q8v8w;P;`%&9-Q|$Jo at SW4&*sB+fBl<dd
> z-qJ$wnRu2YP=_Jgy6MGKR_c4mu^OwYVg1T3%=39%u~7~lhGx-z at DjXRC>)CWh*@Y>
> zdKhyQWQ~q_*WgQH`7y*E!1^BZ?qAn7j>mJtH6b&*mC8);$#_*UetsEQ7AkMI1Z%Jd
> zWNlvzsEfQOz(|Wpi+Rx{8T^}t{11HW at 5X)-Gf%R)zFM;Rj)lnot~(@_DmqN_Iz(aK
> z&Ms}Kv)c at P3_j&~_`FN(BiMaeh$lQ_{7 at GGeSn|(E%Lu^<wzU(UkkXNVB-RJ at Xxo6
> zgGDFmMuB7M;>t+N6vDGWutfWZ&kED#;B&xDb1$Lh{LEgZ2pnm|59+mv2^W>=a!G8A
> zJeQ(Nx?JEeoQv|bK9r$N81blEPI!O2ZS)RNBJ7PVkjFm~-#F$&0s7lR)|Hk8D`nq6
> zwll(_y?DR({4u6IpH4~nB|@OGcj?>mABZ<R>KUUif577glq4-RAV%1$?sgi~Mf&Fw
> zA$Xun`sZ8a_`aR{xu1cmm2Cc*kxYrIrUyH-x>B4&kq>YtXst7{- at ni+;jXb{jF!4}
> zJuJQj at k7a*T5rmLwPz6GD6?872V1b6Y`o0%gAcBhnd7vni-OJY#pFP5dOtKDV}|V>
> z3F>j(0H@;(R(G+tiTm*`VJ+5G3ySSK5M$0&l2|V87dhpt7EJsi_t&Y1b?2uZ#Isza
> z=U2pR(^KFy+n`}{SwfM&^=z&7_dW1a4e_*Mo-M*WddC3H3)15IJosVA_B`-;mwo?(
> zD2Dizu^!<6_|J5n!M!?@-M&!{e8E7-JiK?70Z}zH<UV9ceyShdp+B9!yDF66(2jYR
> z at b`aziC>Doyc7B{|FnPHH>Mz&^KE}|qt!pI4f607Fs^qV&I;S0iK>WM)TuAFpB)EG
> z)r{mJb<?Ho?y(#R6L)-%cFxL3T97aqcED%pF7`f4ai0~s^Uya0(uXbExQP~_y?iTb
> zJ#Bz*@cZxo%`3C8&wmb#N+bWv*s1lo;2GNgKoWdLXAiC{QQ<rh_=3C;w@`A|8^P(j
> zVFUb3z$PWy`KNWmu-1gJHo^vDxXKDyumQMeMUMpb!edokAEp<!y8yb+di$x283b>K
> zSo3J2%aDC*ZTID$nt=<pt4pEt at TeuQJ0df_8(5Pa&ixKGp&sUPfU^d_cskE}uWl`+
> zXbiX4WK7X6z5nZ{EsDT<3ds=F<*p+80Zmwx=k+X=`}!`aqbXd~YnZOGUw;+;8=<JS
> zP=k76>V>lFyB2UHK3(n>!Mdg2-R--ko99=gTf6A#L+J*|y)6r$w8TX1c|fq;aRYCa
> zZ1R=JJU=@m5O;iZN8<o?F6BWb>TPw;rV1YrzdiUUFn+g?pI~siOxIk$`dTE5+pR9Y
> z<5TH5 at Bs+mmyvNUrMDzJ*R5^OVw4H3?N2v+bZ^PP<{WUWFml|B0>=gVEJ at qK69A_z
> z2M(aTfnEn$%=64d4J6l%p-a;i9xwQG%(~5lR|@qD%h&F9)^rJcmSDV=f at A0c<C3;R
> zZi*52u$Cl%hr$lWKXS8-Uz2;}gfK2gK3$(Ot?Oiv&djHPb9C-b4F_ii;$~zU|Mi9<
> zkQW&`o3hUGxi%&5C(oKtF?DX%<ZD5BlA%@xTyoohx5;<_8>jDoYQU?#9r~x(py1v#
> zevNnVAZ)sWKKZ$4sV!Oo;_kDZS-?}kzv(kZGX%Qnkd^i`UlW-zHAc4&vfWQri&*Sj
> zA|qiZ7h1l at oK}vuxxL0>jsOpS2sz{z_xxaK60Jz5oqJKsX=&4-DJJOOc|@i*QYvL`
> zEwF~KI}2#ffYR6s*Qag<I`<5sbHhJfKUQo}jJ7on@~bgUWA*9<Zbn4L^|gRF_<F!I
> zL}a{HLmB$z(tgRSzge`Ko%i9_w893r!*04qbmG{l(FaiD5xOuiB{_*Co&vnOPcPzo
> zk5PAb1Z38)wcvOmT(&I!t%&oHTdlwKQ8?nAGsag!AFM%cakc-jUmpQac@{PAT?Svl
> zA&ez!M;Q?x#oDWLA;0p8ak-T6!KO`JW*EQNS=X6`cc}+h;PE)7Ngu0)E{**bH!qo!
> z`vLY(C+GS;HsX0I;+%V3YVdKl_-cFA+%e30tik8NZIMF#MC=x3I3>floB{VLe6;Yl
> zF&MuLXMv`rxSSr0c#?_R-Xh;%E1ZU!TEIZD{xYA0TP3u!<>^n<Qqy$jp{M_KENm)W
> zmpphs(T{h|fd6}!v$km(%l)~AaBc=PI_F6iJFPihH!E96?F$9poEnmnXB;nrZpAMX
> z*5}T*OqRCiezGz$Nc^kacp1D5Ubt3a at H+-2)_aBY0c;9z{o;At at VTv+jr)sB2zMPC
> z8SdI5eeB{LH#^2GJO=-}sFA<I{=kL!WH|ILaIQ*PqpH`MC^PhJYp-}^DD>KuE_1Al
> z<=QPD at SM5fSxrxM?lK3fmi9_M3^#1E`)<AvT;reJ9t-_%m*ui3&Oh5R4?LhT%BBzH
> z&`$yk-*HMxR&xW~KGM!}lSY{Zmw4j?nyB>b=}}Go;MpSal1T#y*Vl$ecyG+^mSb9a
> zvZ(Hv^<AsKiD#}2!}FSiHEDdmUtfrK^jhr(nzzDkP})ao`|fvEuf$nKdpc1gcPjA{
> zRG*uMW7G*XxQBa0?`QLGMx0dApS6e6a%(g_%(HI$IQW6VlT5F-=VnZR9~UuD<mL4B
> z*9(5OSIGauH!YRkM-5R28&{Y{b>}J;R*rj&SUx}1Mnmu4T_f$>Eyeo at ybiHRvuZ}x
> zxu;WK3hPf}-jnO84g;5<%#@C{p>(;qDHMGZnoho4zo=3dH>$Q*ve4${FW3(*HBn>z
> zx}`0Hh`e at oGG1J1QD{Zv5MWO=BEORHp3cY{gQV`3LD+W#ao9n)A0fF1*0;0)WAKa~
> zv8eL*G29{0xmbM*`k3KKy?)n1aJ~+PuAY9Ati6<tJpbHuYPoEQ>Y5Su_w^wnz3#09
> zcgqm_nG6N6XA+Txc at 1Ozjs06qIDAl}IOQ1cZ{bJBHuwqTJ!t#wxJmk~U*&J_0Y*;C
> z@?4rY19I0PS7MOr`Sq9u*RId&IYRRmT)sYkVIKG>4EUVJ=OjL*_z+xIHa<CSp069S
> zhJ$Tg`ayn4?peq%&#2%0)Ks0ny4~FK8sZ`|rc}~`jtOSO_Mz{$=tdV8(8!C<s37YK
> zwg-ck(8P^zN$FcV5mT`N0}0;pzFGzuHN=lbbRSZa6n18uGfS}=yhfjb*9crJH}av!
> zU~Z)SJn(4_dFNa7S3hb>aF=Y-hclB$$svDwWK*6WaxG3M)WxOzy@@}uMlj`I<h`f*
> z);pdlkM3_+bW9hw at L0)4?r!%p=vI$7bfL_%w)=_5O7J&CmKwjdMl-!b>$;yT+|<Zt
> zeYq*jSaKfOhJMyU<RoOI5NiSSPhi_2Gx=|$MGgmiXMqV5D&e<)Ui_Ic1U|f$zig7=
> z5(Bu4 at E_-mjm3?$MTESsipbB46ACQT7VIM1`)u6rAQSdL?^tgL_FaN~F;O3JziaV?
> zZn3TI8l&d4A#MV0|6wm16{_X%Z52TFEp_?9&L6VPN_;xVp?SpAp|-D$$b6sPOv1a!
> zK67d*^m1L-rm3~KhOvZ}l3bq@<JWjEN3F=$-G*Ov6gZDIkU3OUz{ms6SrjZ^x?Qa#
> zbw<gY64er46Znh^b|ZGUGuLN}#mC1EKCfMbV~Xg<sM}VCH5gn|oRF5&;K)^izjIVw
> zKIUwV|FCw#Nufi%Q5$fuI^Af(r_6he)X1>Nqr?xq7r3w{A%2N5b at 8oP;2<j at ygeje
> zAim+s_gCNpc%Q^nV1F%iay2cK7IWuZ$?78CjQY(Mm)XSI^mpXIFYYi(PBqn)(C|YC
> zC$yShZ^--pO3LXlx%05D7dqg0_>+S5)`e2;du*I;h_u at hHrmz_gLazg2%e?mI%*1h
> ze+7B&gj4TI)E>kcx-IaZvisoA{r(EshCZZ7jtC|^+zMcVqNUx;jhPGF=D=EIveOPb
> zYrd{G<xk!3#RZdJ)7w3Ss7YYc2Q3A6qBc-fBiZs9Vk_2KM&h#sdc~6TxEmY3zlwV_
> z_21(eXRD?qf#5 at XUC{l}-v3pe0RAA<mJ<IfLUPzy_l?-p;+k$hoS|ul4fU5lgYyVJ
> zsUY|yXp+x`?M6mSnMnVPW4N^L_h573PeYHP23axU=BFf6RH*f!DFBAleL*aBNDNWc
> zh$ozq%-t+u%)Is2hk(x+n8V2<Zte^ITL0`GWYtA+6h|`usqNv$^%3_CpDw<)RaD3P
> zM6S)RBIlZ?4P25FGO#yCsV~#26Z7wH{PfWE=)OLHx4^9HW#yuv^|DHVHO)fCOV^vc
> z9%F^E(epO<>MteO2#&G(%M8fX06E533NE7?te(Q+kV-Zr6d0%Bn80=$j>~t)BiEk;
> z3|<oKWB3LtgUNe1EEaRA_WB^vS*+_Zv$8n$mO<ow;<UkLnePYRF6^KAhVj7p|7(0%
> zOBC$J5PSJ%0lwc$_V3IToFn?cu5^x_jU5z_*a3V#uJ)6R2KESQGqLjk7(*S8^Uz^q
> zxwwHR^}1J*Yz-o^8u89LmlyHFf{%SG^}XASTJC#D+^FwfTs-Jn;3GFq|IfWJ%bX0k
> z7vz&{(H%lx{_i>%)31YpM_F*3=mYzrVW%nUp5Ya at Fv{e7!*HT&-OOTjEsfKHx|7wN
> zUesp8L~v^VYg`Gd&k;Q?@Yf1 at cE=~39m%uKg%Z7I#B=;+NULOhBRt|8A at asusoJ6t
> zSAPNh>j|?A_p(Ve47%u67NZu=)<sxqP)eWaQuz_Nf3r4%C*xVrQz{bQ&o-L-=hA4^
> zt=yO34^=08C79D;414M<YI#9l at V;b&KqBZlTcSzI7dDl=<l=4UZFxc3>1TF=_pQC0
> zori<<S<K|OcfwautF?kt at pWJelh^bzJiZBWhL2iapuW`jP^S at Z-)Z<=`V2lWD?|HP
> zx2r`pWUezQ6_IxfS3IY8JC+dL3OcS^y;b^55~HssauIVWyLGER^F7q2a>E}={#Ua3
> zJi+NzlljLmz<2Yd_kmM7-^iEt!iN#L_heNC9ad~VHx9hIBz~h^bd1bT3&CI{u{@|&
> z%*h+Nz3_)Eg{`Dv-`i^SD~Rg`^L1|CqGQV0yvUN(rfZM?&eM>0h*5IiYvKbB{0d@*
> zlQ`xq%cAWqL{<e8UPrW(otCFR1zTE%s15=D2L9|t$Dqsg%dS-99uYYO8NCKrF_-kA
> zn+HDB_1pu<{k{C8b}9T|RJC$2{MbW2Ii&S+KI)>{4Dj8)5#hDYem^Dg5adCD?x?i$
> z8$s$d2Kenh9|_^C|Jj0deo&_xev&QviWXtYql_ at v3VlAOUerp;`Y(Tomi32Bf<Hu@
> z!1_bbCL6C}P8IRzO5~ba at Ly|5tPj4NAIKb<RUMU8qFT|~B1<?T*$WK$u!QHp13q?{
> zi67r*DV>D8wSg%=TEgoA7uI*Rz$R8uJiFG%X^;RXLem`+h`&X$d1tk5PnCtP=hfi*
> zppuXE&o^&@9D7AoL;R!fL5}%<#WO1ge~&m%@!l9o@($Qe;7YIFFWGzn&l^61KkN#@
> zbGyRJ?Xc2EH`MVjb+%?_ob=2{N9|q67&F#L^>&PXh}}D5cX4 at goZjAwIuDTNOWF9P
> z_b54YW2ADIRr(<JN%2WqtZ&sy$DbrVhm at tk7WgI11`+XV2ft0^OvdY~0^~gT>Anqq
> zEB!E4lPMWlw~N^3bM&<|a?1pP9d3FsRg87?m<IDP3E0uR4;*;?diF9r at S%BiyP4^p
> z7Kzur-(VB=Vx28)F+MDy2{urKn68*Qh&2}SlY1o7f^|hLeJEI*;HFDECJ?+P at SJ<t
> zxdp!{xI<whtLm=53SZ|IQ9Fz0<a6JFjYRZ-)0m at 1^9;uk<|yR6Xl<cZM!9rx;4zRb
> z0G}*mq!;%c-6-f4zBu0pxlY1gKWESJa2}z3Q%+h$;F6U<|MYFIWwgM;yduhJc?CMI
> z629DF<bOrgY+t<4_g6%7%mL6<ydC?PqtH>ja1EXpE#s}TJ*iuM|Gd^~e6C`-8u7PX
> zg0cjoS at y7&*^19<=#t=vfUIq$OJPg7`utd^{qWeRxcSD|>1ig39lj at CJC|OM-&Rv!
> zmLw&({rB at s0hfNw&kmQiW4)}!^MH-2S`PV_<8FzVpZ4+b{0EZb2CYQ<Yx6u3NB^m<
> zncFYhhSX(U7VBMvJGhMtJOuD%x!Pb-(*k-8v8%_I63mo&65^MvPJwq7^|HUe0)GJy
> z_KXxdkEYl{i at B?T!)ax1kn at 6xui&t3^5kl)Avc*?jtp3o8rbM=y3Da0d5q{k##xSg
> zy|L(NS4BXC#_9|ZO6(zBl9%i`jrLbEu5v$Mh6B43iSyX|gj_jl8mgYYL69f)j3>T}
> z+<Wj{I0+_(^9lSJ6l6R(7BMDr?1sQRwdYz|<5-fr%IkyvcV!=QhUHPtf^2L>tbj|4
> zBW%5hi)!<!I>aSw=_Qoqms;p)8xpic-gagt_=eqdT4(J9)<dKh=gRn2lGp7;@I_|o
> zoUo}l$YpM~lDIs4Q9U^4K71;j4C0lHXYf%bl=_O<2K_S$`1Gyd^1VSlF>HP5L5}cv
> z=|^K!%O$+n-?~agpDTDBZi#Q#Z}-bmg50-6nVMi{!2OhgU*&v<W4(Yk2|0f0qcQr<
> zhW)DdyRt<G0~$WLmEDB(OAcFog6OPJ(v@*vqWWs*^ns at ADWW;LZ~5=Tex7sqKyW<x
> zK<=y6`hTt6zy8OrY~Q7ZaOx>@Lxef!JCEG6EdIGoHrZ)=NU-0~4TbeLyMT{1<9u+S
> z^J~d=|M=~ZaJO0{S_bk4c_<3Z7oKVhxD7tdb9t6R=YxGgd_a67o^d(78uLa8jE{^8
> zKwiBu8?kZ3Sl@$O1b+j;93~Xxo}rdNk8fc<PH=a-E9{O`ejZ}o2OC9pd!n};HOa}G
> z1_ox3=(HO=jSNTCo$C>Nj`*S6s3EsSUR<CSlQ;t3bbZiFE9ws*x9=B=`wzU+Po?c8
> ziSs22-Z}XEomtF>6mWAsT0d|w`v?9}<uATq6a*fOMs3C#fAJM7 at IqTjZC93C0)A`g
> z`wNW<Ix|4*w7}Mboo6b4`Km`@w$g5YKip)0`Kk0bV*f!#wK6WmssvPg?h6U|I}*A7
> z)M}hng*E(w>~Oqq5>-GFu}=!{PKQ_6dV|Y+fw!?WDOnDrJHTRrLxcB;WfF;@<h^T{
> z0SwKIg*67*P-{~i%eQj}yh!;?exmnq>=_(8fN)pi*hRWSup9i4_l??bi3-Z at 4gqHU
> zhR?0HA4fBUPXm}%8}O;Nt6SOrErIL^qLriMf}n#@g(LJs4xwhLIs*I)o9bd*bK6e!
> zO7!!-WphJA>P}0m?5CyA at d>Rf!zV`^TK5C|EY0ePdAToe|2bZ})(#xh??lfDBsGA=
> zQa9<Jo99tik^sIP5>GoteD=|97FR-h*9t~cb%H^Z?GlmK%fQ$5B1hsLOSQ^|0JkPc
> zm|z|Yxw(>WA!C9y0rpk<8;peYYvm#5IbbVl&qjqey*Dd%?GD(8?TnHm$^|~iRfhY=
> zeWLbB|9FV7hIa%5no`~C1sR+`)vVQ1wp<g(o`@Fu;Z!&3qtjobUfc{k(-6*1-QW1|
> zw^rDmFu-O at r0uAIT!VE}P)TY%cch+Vq^O}Hv<GbnU!8u$8~HN7v*(=F;Ckdd_v>Xr
> zz?R#yEFv at MKlp(OSL+?an7;qWk%9X}HcHOof>0kh;Ya?d3u3!%FOem`{B at rI>5}^l
> zC)dGxwDPZ7#B-<oZ};n-fpd?NX97F(0}}s=b_4fcMe2=`XM|cdn13rBWFC|x*aKE8
> z;g>W_t%N`8lHU~gLjr%P_Ak9}eLP at 5Auwk@vgb^4kTECcZ3``Rnu%}RpdfP+oZ1A_
> zv{H1a?>{_iaj&(R{r3quu*ed;-0m-VonUYqv}9bM<L^ufuJu3qvz1(jjE7s?#~bpG
> zlYP&HeI|GwhOy}1Yovb@;b;EuXUoQ0G`a-X!;{(hQQJ4Z{~ojBeRBhSzBZaRz=wu@
> z;u)g;Xb5Y&O-;kP<_?8SP%gBh*13(?(D3I~ws02}z;9npFO;@pz0XSubS9GXbH$@=
> z*QY!8(H}1I$+hZT-w~_<YF!8VrmQ6TVtPvw$$!o2mLTWm80x`#p)PeQY?<IF<a0Sn
> ziH`-gTsiy=nUGcO;I^#EHF3Wq^Dg}mN2GfnbJpN9hK(aIl#LvdYg#EgFChDuBX at y1
> zjJ_m+3p_7Xi5T2b?zBWnM*w1lHnrh+0f{@gd8T}IX+)XsTyz=qnKOmb<%Vo2;qK at N
> zCg0)L8S$5#KzsoGfq!QPwPd%Y!v6EsgaY!e3dLLB#aRFRAVeR8T;zP{><(sl#hgRm
> zEC3D|ddr%qJ+Mvo=;l?}BHwhP4jz1nL4Q5Bl~T69Wy=jD9;Qn`u3Blt(_nCDHgEOW
> z!sb_;Bz5Vqj>{=6d|p*9Z~XT@)Qal+Z_b at J!5hy*tUMWOqeZpUAfpthpVc?keq{U!
> zMi2f#G2sT{n;OM-dotwjCPkv9uNIAu!V(VOt7u&zVj?EsYpjUTpL^hqXF3gj^mu~r
> z<b;*b?-K5??XEbJ`Q?kib`I*hSGV_Qxz_5mK^MgRM(qJ6xhq$(DDV0Z#1Ddjb6hj7
> zLc*)J!EeC)enEeARg=f^Y~Ze)5s+VQ at LPl=+8*49o9>n`v_7d?ZopXH!}w3RAYh-v
> z%V-Hk&;vft08Kdj%yLz2Q~29ijmz}U<AwS?-^o7>#oGEi)~GLup1+LvR^hkXF?fW$
> zNspXKA{*kVLYFtiK<?jhsrhd9-3Z}`o*0)Atc&2HK!seG1Oc<{ctL->7P#buVB`o?
> z8iurw#e9b!&PRrKWaL(Xv(|NrUkQK0T#INCa=z}ed_&(~ChyMR!-#>9ycu at x{q;Y6
> zbJEv_*q+T05Vfaq5bU{ol=bsiJhSP*ej`tU89oyJLa+61(?VJQ{TzU8<$&G0*gw!Q
> zz%52@&$u2lI6un1zl=En>|P5^S(>O3a;DY!1~UTwo?%gYnv{#cpUPfqM5A96Crh-p
> z7d%S^cSA7e)@*o0YQ8kV2Md3Y8RKCg`6C&?WYeEO)(MG>0=@@Wc%g(+L65!-zM(Le
> z7s&;H4}L6s|5grS_v at x))r_hGzp&%#ve8Q9RYny~*L&R!sS+?@SP!Yb_3(lDuNvOZ
> z?a#%#>rUdsmpr%cme}hSh{>mKZSz0sII}}GlJG73Nz15A!byZY)}!vwh1S$N_5k%b
> z^l#P4I`ymGwY$L?u=Az<b{_T(?|-MrbEbT4sjE&-RrB#X?rY~T_BT7r`_d&UM-I)a
> zERWHB%q4RCe%Kzu{%cJ_UjHC_5OQpNX_ at n9*ryTb6L<~0%>8W|_APLWaNbjl6Yx9R
> zkHK#VK7Qdfu_dd9>{AsKN~P_8$q*K2asqNkoZ#<Y+CgOc)&6T8w at mv>24FoUYbm*I
> zEwIu{!Pk%pyG$zW#{W%ZhDYrw`LM5#J6x*JrrQ2 at dsyGQjcZP0WkLOzP7C--+};&)
> z^y#COc)l5Z|K+_LbH0q7i~nBh|2zKfG`NbUZs}X=owp4;{{7!SW4wwX|Ex{nqI3VF
> zA8)Cuo5B+w{r5a=tc5Rbt38MvS4xzI_1xb1E-(_){dSP&+n`u at 47oyB=TRGQ+lbn|
> z(!b$-^zt_(6D&`kEJ1%U2fY7qhvA*@#&ds>Ja_)C{`=_dZ|g0i$h*`sxmhhb^PlVC
> zd50&sq36|v)O*E22QG?*-qa_*qk9ED6w at fhn12GD>g1w6-71YdGmqnqQqMXTf4c+m
> zM{$d_nZ|u6$UOIXHFj&XyKx!(Ag9h-G#Y2MWJnB&=MZ`G732+bm&lu&zznbPIGm$w
> zC}R$RZ|YkjcUZmF&cyZWcYfgZ`OsHRYOxXA1$nOs#sZiC`)9yhB>JqBUJ#Hu;S5q6
> zQ1i^R%+Py-tYym#EGF1M-I5J~Je4F&Fv{UiIptwXEKLw(1Gk0ucuSvO1-=#3u1Ob1
> zJZshx{rh at VGdE%n!9lnN5gbIs{$|u|jtWoM4qH`$wNo2AzkYu$bgtZwgKNM~v)d9j
> zJ__pv^lRYA{5+w*Ie*R at OKPI`V;R5~96Ppte-*eY;z#o<D#7ys=jC0?40a5%b3)Lr
> z8kiTXg#Xq|_2Vdf^51?;tz{Szn+q~RXRB7PN3EBOpGR1<XzTaN4fKQ)eiGOf;y;Z3
> zybC6Q1a^gVsM())#o|Bgrz*tkmn6>acwINF!Zyg-a^?F57R$20t*Dqe_70!TYkEC_
> zdjNjNBHjC{r}W^2sk#3Emin0efO-nX)pKfjW1L50cBtyRrZ{OwT0G`KnY812?=r>t
> z8mcb$H|P>#?n at SF1fEZy4MU5ado?dR-5R0CO`7MZ&57%iYmZj8?dlfm=l1FOcWzR-
> z^O{k|#n|JO0t}T#1R1+KG0^cGc?^ZlKRw!VCa7*C4tAuaE$P{-QR72zOYDi)@3}kw
> zc;TmGdI~gy5XVN|h(=MJPftN!(Z|?FOa1-FwI3ihfaYbXzxfw at ezuouFQ8Af^F9)s
> zOCD at V>_ttpdpq;VHE_PrV at S?3XSrtc+A#(p)?dbBaCQdyzHUt7YDX`@03c5jaePM_
> z at D2I?<9<1c?ONR1_B`6tjO||Z+f9odz^hZn!qBNT*`cH^?a*^NV0W{X9!1&VzThqP
> zCH5TQFYaaiEH~Z^rw_uOMU73%P$y!AQ_O6v`cKhbU5dV9p#(nH^C{hJX?C~T+n%oW
> z#XU@(V3DYkCc)1iPOnBE;vA-)L*uRZ?`p{!>Q&@<+cnemb<DoxA8Mr2&9X_KUFu4P
> z{>eLD{y?Jry?K_Xw(Z5}&xs#xUNM``wgt~G7g$u(3i)IZ`u1G6Il--&<6K(1)mf`S
> zzOY(IFxJ!)_&atOMqwZ1fkv2!nx^fLj}Bv(81-wyu|E_wzeGFZ2=^fLezO4Uzvflv
> znkGK-Jj|2{{?t<fjWhL<ro#T{bEg^CJp4`Ah+55O6y`J)gP4c0HJoojofhQZ74N0h
> z4+Ci>bhF8-CEx{!d=KxrhRx4MOhK+Hgq=qC;z*r7cQ23R?UQ`sp1t6w$?v*A;v#2v
> zliG<)h|e}sOD4mBch?)f!_A|@QS06;;P>}$5VaIJE{gxrzjwHo6oJmS|I@#OsPw}u
> z{&^|J2-iTYFv(Ge`>*afr0;U?L*J$+|Ip(Veu%|jO;)u+pIM4)o?)!qT-={jH*eV)
> z;l+eq7nUX2F5LF<g)MU?bvfS*u9=^^CCfk5%|l+o=JtJ9BWJo%I}v(oDLaq15NtT-
> z3!1meW}Sw2vlZAUp|jxWmH>-e-GdewiH4im&(BY(amV*yyWK!fh2LKQp3~9bzCjLy
> zZnFxyNY4??fQeT3u!_hvr%7D2IEb!~+J*lYT at Wr0y5POs_kz#zF|^E4n<#UD!>gkP
> z+dIIUXd68V_b0_Oo&i4M%7F#oNG{5Gg9B_R``i)lgsnNbV&?M~_-DxZ-LTg*@SA8t
> z at w?D at L<5^fBNOFdyue}Ys5Vc=Z(AlJ_tH^C`#9?IyoZ{)y?QEe4mlR*scsp9FmE<i
> z*#EqWYkS*|Wgw>oef7KGgYnBltwpbg*bm+CAvJ@^t+00whD;aVxn?1H*u_I#@P!o6
> zNmLfWZ_=+i>h4t{cg?G~VA5cYwJ%md{7BsASi>qb1E{4~50Ho1F^}Lc+*0IdUP5e4
> z+$5$o;CaLOxk>%!ztaAU4#WC&(5J<vPH1siMuzXQAs655EJYrSMcp)7DNz73deCW*
> zC_bz15}#1ha$uO>94!{eJ3O;$i|oLw+c*8)lt|Au#j7(%OZ_uDEdHOjAEr5ubj`=k
> zm0eDK+NW{{L%-DjpCd{B5Pb2UcT{WT&Q9deS?DB at 729{&?T?)n%>ZC}zXmre at HEg(
> z at g2TDqOUzt)geb|SEAgJj^n#}U_-7&3tb~}C%9uYGn{udvK0jmFH$Gjagy#*7SM9X
> zGmAg2A#!GEJlYS@!-B2Ycl;L_ at 1!BT-9iuNS!DFOOQ|C(W)9WB-ynA!c8{T|4ZJjy
> zSApH3<~#1v?Zs~GPdGN1my_y`<3?k90{R{7u+TquTj(z5U5r&-qJf;Ntb-r5IyGBV
> zrQPEEqUR7fkNSi88!*=+aIT<7pz%{Fz(-X>YG(+=YYmLK;a>bG^!Mj=V%%5JZp8>Z
> z_v{L?t(oFnB^cwpAmDTi!S!6ii#hWehrtgPf>^td`x{~dCd78m<=*D{0yk6LC~QAT
> zPe`iPCBug@#aRSykQnzE^kJg3GgIkRl{<H#5&630yCYM!&~|kMbr`aGPH_mE%W+ma
> z##yZ4I9CE!FmtGEl;sC9{xZl;#Udld`Z#zW@*$6M$T8?oF>?91YPo%&7Mve$Z at +Ae
> zZ94S#6Tq1v_5_~+aC*@5JR7I8_=+krFWgFf=BIM at IvHJeUbmH~Pe<--^@+EH_}FI!
> zd^Afp8Zq06<b4NLKndKX5BCvtu?+H^)G7mJ;C>gw%_n}dN#5jq_!cd&&4Z>|uzqbf
> zyaBliTmq3Tnh>ntFAsbs at mhQWHL|vM$EU2qTD;v~{p*Rm4~ClWpB&Vdqfiy%yfpYC
> zkB}C&=5f5cSa-383W@#c*q$~9>#&;qzZ95|3cI$I;QcT^p8>A`PS4!oPW#iBF;B<y
> zP5xqs9x`q_Enek*ASL-Ez~8sqt5d>o3>nL54c3Kg`88=F$V(f_H at i`rEKLsXyXge)
> z8}W>BMZ1LcKkjX7pxn*e38t30#q-ny^n1Tu5Y?3DW8B3^ZvN3SROK7Ax!K+}IO>{Y
> z^Jhc{e9<C}&SdqvcxowZ2MLjti9U{W;JOb8>mMTr7qPQaXC!1#;e~_Ck6btenFc-s
> zvJNty7&8%BBgyk>w1Kz5_S##JksHaHM`R!M7_#ziChq- at 2z(D2Wn<Q3dyccSPo64`
> zSO*II`Me^x7<T>P<wvj<j5P$4bAf-BInG)xiE4lmEn;5xi#MJZRbl%O^O~Q^cuQ3M
> zmkflwt~CHxuL0(#PmV%<H4=IF>)-n1Vg6 at ChWQWZfL{%L=Rk(>fYIU*e*p0Xu=8q9
> zZuq}_0WB`bM%^d4w@}Ae`Ua83rfc*B^jqj0s)22z$#X8jx_MVH$9V{A;aS9ru at 1Z@
> zPCXg?c#i^{5hCJ;?3mLVU+fFs(WQoM$YH*X>nU-ciy^~r!fwDip}q~DV;y{-p|LeY
> zU&yimxA?|r<+UgZxJWXN;P?*qyV$smJA!#_L=E(XO5w%46~Gj&g}!i(U590ks-h5F
> zcPXyhDzYdJI^9^`eCaJL&&r(MIKq>@qLuWA{KotfeYu9d%pgAArg$a=TtmDbUs at P-
> zis%#u#lr?h*)x_w4nDhPa7e710#`pUl;EMkyt#^XmC>E&KKCEjagH5_vi@<%bJQ3}
> zzc-ptN17e4v6}EnBrZ!MPH}dR9sDWxg5UaI at 0p@%h%SOS?J36inpr4b_l|BJu$td2
> zdbCUF_>&2(nEBFPADY!?p7hxw=))uQ!FuDlqny40`8C^l7J1W4+;Q9k%r+_<WA#V}
> zTm{;<ux8mwpDSfiF$NiQjS$d- at Kn#CpLCLEq2c%_+SI@{g`s}sILsCAXm`m8$aG)4
> z!#vIljLUC;K(=Z(GuF?7b{8`i at A7pYU-q0!<eVOJ+Ti|kmXdS0z+Gaj8^B3Go^=EF
> zfi}>23i(6%EO*Zv+)E{1`2Bn2xX(a)G1w%KId&sg1J`%#BKblY_Ykv*OK7FV$f=^+
> zTbUr|C5G5S!|aV3507Oz3gnDW$2u2pZ%h=}zl~o7zJ0_bQiqvp=~6O(RNbi_ei>;k
> zqE0flcz*)i$$p3h2S35wF{cjkU0~qgTA{d>9M_s6%J84vQ{?|<eR`T$RD*t-8L{s?
> z_zXsn>!#hne;IJ?qy5*O7JP)gPN)bRTkQ3N+{suQN~r?lR6Kt<-esv0I7Z*)j3|NN
> zxwb>kn6EpB at wfs#7&*4;B;@3i>(=_t#c!l0@>!Pe<~HW^63ppa#Fxf1;kRh^ysQ1^
> z1xD>+ai8J^M2|ym{qj)cdfTph`ehozIFtH*!!?Y{P53R$AjjG-bDm9|jD4&gD*7__
> zG~&tR-4Q*UN{8UT&X79Rh_8};A<L&+5G at aWQZK4#@$5g2)Gb%yxJnW9yal^jJaL?9
> zdG&?Tl|)9ex@?e)DhJ0BJN~%;BfwzpgWPxq{jrmtAS%c21(vYBG1MsVyAr>L^#4Al
> z!v0JS|1}5ruUFSdy6&*D=>V;zP;a$QXM<l2{7H^<#?Mr%8Ty~OvhxSbA=Kkm3srS^
> z*XO~`v43QNT;xnW30b<&BEa)t^;o45`u6iDwM!mCS6rPMTD<q`w8ak*U%bX}+B at km
> z^hXL^)w}=wN3Ngl0Lg2|TwI(`;M$S^u8R>$@H{B!AWAEdM^#HoiN4oE^gWvC)Az!a
> zF5u9h^9g=;HVSTaaI<VC&8ENGeX;hB)V>bgYJj7GzLT;-^71{4W{WemUk>LXuP_xl
> z!bml82IwSKU+ZM`u8-O6yU>9Ov9=!}dINCE3HXkA1^)xlBgCxF%*QQ--@~&9dLXW`
> z26~<>amjOWl1=jFQ!CN`pd+n8j`RuWn+Xba`|{Lryqs(LikYvfaQy$!)8Ow3diRah
> zV#juT(hQ-$K>tgWL(e+Jd`kWEN&WHXk})`M(0}V^D|-JA{Y*B(BD{Fu+5fJe9VqyJ
> z)z2j2<~rzS=l-pq0gv3c0s5JAq*!=Ol)f82w8lYH9jkjmPa`_ot3yWBK}S2OkrADa
> z*ptvp$B}1|Y}0wMw&Ot at zmwpv{0~Am&u;&sUq?IGr=x+hs!vB7)HrR?cEk~mH@*%$
> z6L2 at gmXL6g;O}DR?ar<{i{2po5On*7+PoWSQM_=(Zp1#z{)gTc(5JT{hEPfmflZX?
> zsOyfOepdHMutg(rE;T3|Ho66NypZH1P{h|@q6LmRqd)rog43q)Skxv7q>Qu|rSBB#
> z>r$k_)~;maaCv#%t5o##GH(#SnwNJXekZx#knLrSA0P+V!<o;#0X)|9ly0kB553FZ
> zg4%32#_KoIGIFUuEpZ^W)M0Iu5}nSeXE8fs?sM2~C(Q5>LC;0bk*Pv60X4`??0b2l
> ze+<*Ho->4V1ZySnp*)8SizhY~iJ>4zYYTFv$3w^XVI!##PVTWoREzsvVUdf>WFG4-
> zL)W|M13YKv<MCq0UetaRVq1 at T9Xf22IvqveQvC|sGl-wYEk+&fzxkFE?)ZN!^W6(R
> zvnTk^<@kT(p;FqkEu>~FaCe!ps8vxB8T&cvO2h+~1#IE0S#w3Y!^az#IRyWb(29IW
> zK?7>w>3R_x>^ko2o(7#}F41{A)*#Ntu$&agDHqlsPJ=CgJTKVq{GJMC<bpI^FZ^V;
> zi2g$r=+-XCAhuS9i+i2r{23#CRsybrNiP7$x~XAzyf0_>gE+#U(eN~WB63+ at OIcN-
> zhM&+EHBrYpU5qC%W?d=WsF@{Wremyw{42t&&eP00 at M#l%px5E!fIMK5sUH;TjFC)s
> zh5d`sB5)kA+&($XJK%glev8|iYE!7ME?^GhcRtpnn^<!d#9qW$3x7Gw+EtQE?;2#l
> z-)!O1C2QOF(wlJo0abe**FzQ$nJ>BVB69fNQyoOE=|Kh0842Ij5t8rhiX-@&o8$gr
> z0)_>68;sq*pi6hM<JSfZB_?C%`Ek2*(~k$bNu9X<F~qeBG3O7JXrzUV$nQ_^+<&4Y
> zoWXJmV+m}g47_WBlo|6Cc*ly!fp4L|z!KVh$oTQgX at xTrJRE)Z|3R^vmreNz#jkSv
> z at 8N@zwT``X3GTsz^nbI2)E?5k#~n!e&(P?r4=}}EBsbF0NN2>NP6>-yizoSCg=2wx
> z_u{mXXWiLJ^!smy*UAuUcmuk#pnvS)=b<-u#A96;gZnUOkoVNpIl+jyVJkR0;&qYS
> z_ffN8InF)L+F at QKFW1pZXWXoK$B;bvehPQ+EdOilJY(}|Zy}cX>v)S<mYARW0eKGK
> z0SrKmk{bl)ToE(2$kFNgKv|6#LyaXA->ZX7z*WQUT|d!6+Ila3`a#n2cBLQ0yNmk9
> zq~<Z^bv`pEqMC3kxJhnk5I$2J2094u+!Ssg-koP at TS&~Zk2?;}1O6h+k(Qg;1RF2o
> zwO at lT>KHSH%We4>^~zx1fh!g*w-tDUe1d^Qt*`1VOJY9w4V1Zr_fS!6*8=aO5T~|+
> zlg$V`oRx6Ry?+t8tUSUs*D!sr#CcoO;`oIT5<A4XkMU&Vl7uhxU%BP_=bw-`!Bg0z
> zEq~=kaAJwiiy6WBs4~#Uj@;!V;Ah0zCvGG2;|OFjYhNDwpZOGSYGE((Bdw4*1 at 7rw
> z5B6CQzTZpW at qMGtuFYp_XhN?1OtEz}Hv!j<dQy-t566q057~NoWM3uA-%RAsO_tLc
> z`#v?ZT)__ at hX%1+!5i!B8^*C*!8rG~Jhry882OHwEZ4FqEu^SC#j~!w=Q0=dxp^<L
> z7!^L^Cjl&uq6jsK6$EeXrf%l`V;1<l1Hq%2sVYQG!QUW%IYgGe{kXu6zWs^+tYZ82
> z8Mvi4vwg$9uH$UqurK8pTL%#P?zUfm-zgdU=(m at P`_6TSU9e#v?qSoPY<+4R=PYOI
> zQ{y=85w<=x_O%b{y9dayURG{vfl~o*0ct%gS#a(AvIPz2moB(;e({1U=T|Jae0~-D
> za>C_zh at OeQx)HBI4uT5!bLS1+i;#I1U~YmIY27oT_bSBB+s#8%w&qt<rOmIZikdkq
> z3f!Wesk9<`H}G4D&7PlDCxSETN!_w8=<R29$;&#?R-(O&)`0e3XiL%FLtBFOH?&95
> zI?(2${RQnov`(~NpzT1LjrI=OJ!pSMn~C-o+8t=y(0-2gHrigaEofb6Z=ijI_9ogt
> zbjcMnFAawNpV(?=ke_{N2)5Uf?Pcxw{a0NwblX*^>k;1?w3J7EF|+KO0=I<wCw$Rb
> z)Wb!riHx60`@|f-uKr$pV*UO2r24M-RrSBbC)EEM|6zSc{EGS;@k{D|ieFZLD?YCN
> zcKipzi?Q?ZnFYMNB0Y}##jLQ+Q{9-)&|gow;xMiszFUBI>^FKY at J5mP#+Aq$6gC+~
> zS(MaS*ikVPR`{+raP(uZgD>#yzJ2zT%c6r(GkO<Bh at 0#|lUGI}hb^5E!M`8{7tq$=
> z{YTb&mPbAAofQ$@SZ4v2QYgN^9yrU&h_Q`z;N?6_ayl44_?|C9e!KW)|M(8e4jI=6
> z{1e+4p5q{}c}IZbojLFm*g~N!$LQyTW7MFev^aMou%cTG-?6!Vdw@~YD#Z5=z&C$t
> zUv*izMA33(#do5o*taV*&{>9dduX73d-qf1(n~6Aq7kEoBwqT%4}I<Tfw4BmPxR&O
> z%j0U=IB(8(%mF`)9Nb^Z?ys4t6)}H|=L74{?J`Uy<FZZy{{isbj#%VoR<X5~<9|VY
> zL&zoZ0JSl^`?hO|sMakVEo^}AOs7HoF$;3F>E at aAtiBi}-rY3J?|jBJO0FAz^USZO
> zBlfptaT_JzwP?%qI at PvYZ(lFR{-Y5?+FsS$ljRjL4^l?qJ!r2873lNu|A*Te5$76<
> zxYPwXa;&*N$QwG~R&ypB;OEy|H5p#Mi<~jw^?<Lh&>cY^4w>>_e(b?yH&I7~l8f(I
> zuK0|>7{r9W<}=1E^%;|fPx=~4n`vR^$Aq?5A~-tm<|NA_xI2R*hDyZ0TQG0<B^yWC
> zT)bj?ioC3xUW-<M at m?O0g+7l_%VBFaeHfi7p_V3nMd|T8PLynP0w(}&qahJjZqIWb
> zp at sU>y>i6TMQ>h~cz*&L1sue$tg*PI;|@0}p;v^rKVy;*x0+Dw&ZsXtO}|lANRKPq
> zkNiu9vG|+1rt(n-n+muu8RX6m9n_l5&MirVLFj8UgsY4Oxi4xG`j%&zR0Rz(?lbsK
> z*0t at 4*hj_|zO<NU1;9K_TBOaCBu}ox_~?$1xj9Im{+r6EJ0g0IjL8hS&pM3BI>LcY
> z#v^J}PU at 4I<slf8tGd}-XWMMAGi`IYz89+DlOw)x7krZc^Vn(s$FU~%*qCV<I5v^x
> za3k;G8~^{~u+NvwLCKs1%sKS8J=n^&DZsLaQ#Ihve2eAV!TeH)AJ&AH>XBCfAK18v
> zOyCK3xOuU*Bt3O1DT*p%=iXg{b*YFEeB$#ld_OUPQy>H0^xi8J7ry9nfqU>E`@F~g
> zryuY=$@=aOeewEy2(JAKx62jBuhEU<h9ggaU`58e%w*jDF$7o#E9z^^=v8x{r8X4X
> z<5y54LT5Vz0<J`L<h+3IW6B!Uf!6sgzMdx);(BA~?2bS1TV+l-ep8e+(y at M@3$BRY
> zb$boW1)gt7>QL-|5&OGv&P$$^I42wD=+W*Boqghu+~3h3j^Aha{v7-Fqx}{8dl at D5
> zMQVcIOZa{T|IfpJT+TsWQ2Z)f>nyI7;0a!)`VRc|C)zt`n{gipv3&#AIg0j2T<0h=
> zJQf(UV~LC(*C*A8^CNJ6CC-mz`*IoQUBI#5;@BFZyU)n-`x at WtvH$OAFNV(6zfJas
> z?ee>(6!+}aHJa at 7Ag`)0S%(F6?}EA?be(1-&&z3vBm({+EAy#nC+WLTT)oBc#z{}Q
> z(P?JBO{szoya;|AD_s?_yKNroxrRI4ZJxjgj>5jm;_`SEbxbHm**2MT18~pwpELb3
> zkW-!1#>MYOKRu3ruFG{|J!Q{*rpv|tGmFm2#A(${(^U4<F{tehUePvgL_-PHjd)$e
> zuD1EoU!K%sTh4hAzgbd)W041rdwI*RlD(%#@H6GWZV{JiQ;Ge8{Ca|iNt2^r(fF-0
> zVqXvZ?*W&bZ-T2SSSXGRLH|NAPa0S*WowL<8LoQLEt3-NKKoq4Nwl0(+ct;%uW8=P
> ztr1t+_F7|@7S89G3rzx^*TAlm#e2oc1KV)D=738H-AUo#2A)b)F%nPchaKGkm(~Vh
> zAFz|;`+c%q4xHl at U3*b^;$W|*mB}f)jKFjb9g2Lm%@O<1mn#P3A2z;^*uje`yL)Vf
> z{k_ at 2nTBR3=KX-e9N&lr at PZbS`xOiomC&eXb$h<^87+($+}1>$ZJVpl|5(oH6pGJ%
> z1wK=ZK}C*XqBrWvv^+yTeF-poR?Adyok}TFRxxBy7}gNt1Ja1j^=?Kz)9IqwX(G{l
> zw^TGYEl~6>Bl4L=-plYW5RVW`{gr`Tj`4x38g($J`?ggd{nz$DvK=)e`YyP(swTYz
> zJw4EQv?~^RUI1_)6Ol{G$M!^y!#^;#l3;9TQYT|LKCj{PIzA)dTZJvbFeCfco<e=?
> zAtBb9Z2PxcCPiMECF{*7ny4z6<=>luTATjJ;R7%F8vm%N*Ds+a!nd2lqxR at -2Ui+o
> z_HW;xw#aG}&fF~&tL9kboG{_V6$>zz!IJ}i{{*Zjh;{d`CnF%UOCe82Ym%tafXh+s
> zIic1CEgyNF2)O)NW%gw2g1ccuOY#2X8m43aOwSq|^KH&_ynpkF9pK%560#3DGcke;
> zpKUnq*CN#VF^EicCysd3x at AMn<d`D4%B(vfDo}`fDv>{Kd;JUKh`kYEzYh*Fhi2W`
> zHVKDo5Ea`KXDE?>u$K?qz_~VYQXS4g{K0gL34`qaas{cYc*c#jyIaf6z<bz0`rPP3
> zUsPe4=+~Vb0k%hn?Z)=r9HnW&mseD_yf9D3uo3%LgdH&?v-fbEy at v_dw=%2*eZErk
> zk{{y4R8}JNQnU=(vuIstO@>j$_8kezFI#46b|aQ}7~^%adFZFr&7LbG4Lnt=ySO+v
> zqZI!9&Cm};vv)T)A-6}^Q$dIHJflU?TM~Vo#>C0aN`nY_Dk07 at Oqk|M5AK^u;eJW<
> zWne0Sb5E-6)0rK$Oi=Vb)S}PIoe+)seB3|NpZK)G4_P5uvaY)OX at cEFC$y0<V778I
> zpl=*%j7!{>CW}7)W6|ali59BP9hXv)7vfnOq4>?#%xg1mlq5;+347{Z{<h8hNP_kv
> zX_IcT`|3rp<XXDVR0R^ThT#249AqQ0M}$q5b7)(mPQ+f9EP=lNlV0F<t#C7ABdQ=r
> z3UWdg^`gFZ?1LL7 at XaO9(t(SNQNNU*)1X2=k7khWMSgFin7=(&56r%I^z+1n&e|Ut
> z4bw|S>}Jm&jydWVk;Sw;uVvuBrH7_StU}Hy-AmEPS%vOBSY&PE_HPUQqS}T=rwMkm
> zv6QN|eX#R4LniIlo897Qg at Z<&lyK<g>X-6z?vnrK{z-D?pqDRAkB84i3M|@`sTM(8
> z2l!!4t?H}9F96?;gnM2y+gV8;bQUenblMk}I%^lZoHpVgkjNI;3nnCUa;Bv0Lmi5-
> zwEX3Qoay?~2Faj;9O28?bA%t~9OQY{9*i4W3#{3aS(?fNUFVbJonAK|PaOu|kF>ZT
> zaTLMj5<WTTdBEZ_n5*>5EN(hx>Hz5XzZ3nl@(kwkdiYn8QUBNhKj76o7jgog_3_tg
> zKW_{ANQ at eYz&op~rUH#vRnYd#I+x*jnj7P$z at L%QEf721p^}4hD)H{6GaiTC;-OZz
> zkDnPbeuP`DI*ey}G at Y^ku>K8PBi^(Z*KqfGM?Ccp<eh8e!T$vA2PQD7m+;bcm112~
> zm)SBd2c0q8sj8*HRlG4IY6s#%_7&3;3jE`Kv-rRBFYr846}WB}u)*LUvA3$j?X4T+
> zSU27?!PX$pAY}^Xzyj2>n+KaPty$O;#7Jg`0Z(pfo`!iI8g0Zpuf%(Huz7~b7yRnA
> z%vjXs1P^j^*rLOvZb;}&Qy?8~|6#)z{N`H``E`})20fi$t({DrGs8|H^|Oh+0$cPc
> z>a^p0=t$unbxios8XRLZ%SoMY#3b3@@t-2(C5d5wBCi_n at j0}0cn{!{!f(^j%Guu#
> zqeabCU`~jQi+2NgbikcL#`(tpZ%lAU6QHZXUjppn at CFI@X~`O_v%^^4_cIN&%AJO~
> zR2e_`gr?8E`Q4+V<0~PrC+U`{w1h{cj?_{<O6q>CndDabopSMjx1F-?Y$u~Sn;O_q
> zwjg?4O_yY%B~P*<KSw#<+{@Dozz<gE8ml at dyr}s!cIx#;^E4b6GqDz&?zMFazGXb_
> zL-%%73nMw%MlVp+xOslbmg(^A at +s7a{?`iV`{lrI?M1?59pfV0r+zhg-wid!?sIL5
> zt#y6ozF}I=@JuV1ILI_F>wKE$IlpTFa!=KKBc173;#N{$rsnglnxKxhh at IQ2Q-_1M
> z{eox(`0xsHrs*xKz<sEDCBbbBB>M;cE&FPNEIyz?6F-4k+^fcQd8T)nIMETvgL!VH
> zvs699 at 4V%oq-{HP2RRP(lD4uBL)xrAhmgE3^ub}BkNJIC65eF*5_4>>xZrAm!fBHn
> zbXFWr9=gDwm}xhDB#L2fS6LY7HI|9&@yFfMR0XN46AHldbJrq(yak_j1Yc8)*y)i5
> zVO#mikl5o9rBBW}Jh<}>Qt-dNh8i{75(<Ek?H2S<tqsYPiP;D)@V61m^3i`nPhQa~
> zDR5SFUeLENll7&{WaQCJ9hjZ19C#R?yliD!o!YLd0oE3Jh3Z at ce~vw3>}7Bs<(ePG
> zi{4Ma%G$?|h<%)XRdp6|r842gEla|rJU-cG`xZo5BBpLW8=-u1w!0;H7IdVL^s5cl
> z1+m~+Kn=|mT#_5sQoLa0%riZbIcG{vVBagy71Z!?Zsg|7n%tWS-C$oH4>Ds#Ma*Du
> zm#L?5*BFI=`J2}jbR|!G5F38|AC?rn9}?$ST71%v-omMcUjen~sJcgEU{@nIEu%j9
> zEy>~zJ9428cV=M>6e<fHxN3<Zkk~hWeNU(|2=P4|-$Riv5J;6VTPtRA&yv2b)6QDd
> zn`sab8-yB&+;pQ`L_NhZ_k<U97tzn%4_r5YTrm{66ZLoo>3FwX4S5S<`8D`0vm15K
> zaKHZKxNb?xv{}=7cUN8T$;UO82rqu|F8mRv!8v8p&7zhPKQwY%jNM+{sAn^Cf45}L
> zej>Ni52e-7TKHF892eF{<Y5uc#cKfu0mfs(Ky7Z_(1Q<ngSO;&ll(&NBVcJ4L+712
> z{8|5)PvWe}V>s_*E7sW#xl~qQ*x^IK{c&$r;QnmrQzkk7=P}^tVz1rAGu$NWrEPoP
> zx at qg`YqPQyVxM~O?bML(Z9?QAPJ$gBteM^>h<H>&MRe)PBRX{l5!WaoxoFYX4Z at q*
> zlhhGs+t$PPLUM^=&!=<x&d0S-mzCZAg7_zHKVj`d-hb at F*K9k(BCe6^{dxrF?I^oX
> zGXu at p>&Z2+U5{;YJwI&gu{{IZ3T#`^`jp)lPo!!bb1Li_i=PMnD<^cdvk7f>=;{*&
> z$1A}3RQqx9y$SoH^AtnRV0%aC>W*r(w?bFzBirUi?9;74%w&<@c<h^s<9<N<5?UGB
> zdK~kP<5kGTxqczg32);XhZL8*+w#7`ylsV!H4c5rMZZGPpMPL`IrhoQ?n{2tz&7ZR
> zr$*!Zc<i4|^fByzhPCtJ!MUkR at x3B!C$0yZ)cYs=p9rl2|2LTQdo#!HF20XHISI!d
> z5Bmz+0r<@u_R-h){mt{$ehm8c=J`{8?mfWtgcre%mB&7J&rm%VHtnw5BcaSV_A-u%
> z@%__J$0#+|gkr~`)ZzGlvE$cNU*xp%R1D&hd05BgvjRR}3t!?K!vMeI?EQ}MJIP*O
> z;a3i<TV)%`H&;}^Ci8>u-T^#_b786s*KWnyxgr+NocsPB3#s+OU6>Za6}SU9!ELX;
> zW<$Krm>Y8Q=%W)R;A*(t?i5v3!)8$>;yl35Q3r*R@)(1MZ(S~r?K>lE+Vh&hLuGFs
> zD%#8Tx!&sq!*I=h;D-zbU%U&X7MlqEp*ecHOMLTaU_^?o1a|q3qsVVjicYq1BCcVM
> zUcwx`LgrM>aW+TgI(*wTpS{^~=CipKF&_fI3BR8eYjeySFJZn)d`7Uo at A>2%uKe7{
> z*3XW<!tR>~nFYNA9Kyek5B#{z9ZxAswzBj765bEk20kxg9G?lVO;h5%H6rKK_L0nq
> zx)L7U%^uLVhg8fdKSy$XtAaMwQ)hGiC at mAh?ZUC=8eQ-i&ERI2&=qf9y8>PH1`H6P
> z^qH{f;sM45-u0i*x1WekqIv|K<ai at bRn-g}P;&_U)UZ3~_~>(qrC9GLY&_6BeReXo
> zYZBvt<70JW_;z{VJIv-+=-_ju)_`-5yhrhDUvn(eW-IRfF<buQ6ZG$8A`>vjzd}F7
> z|Ng(DjV}D(VEiBJ7cV}Oks7_vJs~;^x@)Fe8oe9&j+=!|_3OGM(Yv6J)Y8x`Sl!=D
> zc%fiRiXj7eqvRG%gu8HzryKQGe;?nJl&CA at eqR#SUgW<_m7n`cL~rhZi05rG?oQOL
> zStyjGbsL5^lx6Ig_*L8HH|3JW at P)#M_EH1<Y(f%af&Y(-9RH;v#Gbe#EkQHgz}e#-
> z`Q?yzHs2*aW7;-H*ziu<e1FF_{Ig?nRR!?l0jKSokN2n+yqw4th^RJ(M?6BlXai&x
> zYJqhag%=}dbcsFAxp_nJjz)^R)Tkxvjk$H~FInd8k7w~jcx^g(4N<ecCdJk~m^|YK
> z%%$l4-A at VETr2SS6?0AzjJL#I{n;C%<+DCL`%I~XABKUB`myf;C2zFdy-<26OG0Y8
> z-#q%FSekE8K!y&Y@=#k#ZW%}7NfEX-_)A^l6x5PE++>vbA{T?ipHvT`LcI%Ql6BYG
> zVql|)fjyLxIT{h_&+7ospQEx3z6N;->MjV|&pP0%$hbq{{xJqp-$KmSBP=f|)?t?y
> zwVbs}w<bKp{5sue_BX6O=(NGUEBG-lDc&vl^wS?(q6>e_??KI|BpG}V3P$duZL361
> zh9_d&>Xy9b`S{GUS8w%>Ft%0c^VM?e+$f8uzHLTCvP6<#5nMXBFrew9>>NSF#<uk>
> zyPIdVlr_I~^UJ9N!LR=kIA0U%_Wb!S`X+--Is)_4Pt^<k+!JefezUq_PT3_AKl5qr
> zjdS|a(#_$wpAL$JFQ>6BTC=}!1Z41H<a8v~#XKJT-?`h*?a^Xz_=uzJ&HbO@;v9Rs
> zm^&Q#?n}E;tn-)~Lu-5EMbDzb&+aj(v7d+iC#`eo8=kYVZ?9o!#C|93aVY1<7VD&u
> zqFmGsip83BO;~^XTgxr(WVBNZW8lB=fv<f|g>9Nubkym={RVLlecLM)w$PEtMGJy|
> zNK%&SU+O4t<6vL1=v=(aSr?BSUZLca54J66y?6e9jJ<nY6W97aT3fYRiD;`51Vo!E
> zL<K_RlF0=GYf-7%7A at ipYbqmBt88nV0fMCph<8XYBH)cnL_-9*gb)(y?p8z#wzd@!
> zk=-IpD=MXyk`bckS%L2T{hjkY=X3s;&zj4cnKf(H<z4UlywCeW+}d98wgk<!`Adne
> z32k%^_X^tFEtkBz){sFqCEmw&toSJ77Mt6%-CU9;Y|q;&DL=r3#rp)hv52jRae^s)
> zuroZ)_0e16i2iIz3C1DB-hRgnTbH6>SK_zau9os|CDLbTFK$(&Egi-B=co&~M1Vzx
> z-u7;TK6KKD&td)^pV7W=X6K0{Z~{!|_|-laq>1<T%=NL{8z<JcUrX5A?(kZTF=&+K
> zh`eQg)brx%-JUI`sONbJ!DH%6!h-74da7ogZ$FB$`gvdqUYKckG`si-BOYbR4Bp!I
> zQ23%HQ`V9*QQdMaYDE0C$no{*J=>A at 1;j4)@v)#U8c^nz^aAahs_W3*?ZBE4<JO*P
> z)Q5Fe2=qb6 at V(X5*Ojnw(KeCf)5E$eZU=SEF0H^-tlO=QGzq_=D>cb(ST;aMkPMyt
> z^C4;NpK0f+<RK~TsaoNHJS3IUePBGHa5UP~u=}hF*)zCmgfY{zd at L7OF8u3?*4XPy
> ze`QP3hkv-&qq=>BG8w*1;E at X1gL|G}9P62JJ;qH_`F9-Yp9|M~kZKmJy7%dB73R5_
> z;NVDbvm!2ATY^J-^-78O^Y-V=l^;A#{Kh8f$>XT at ql_pHb7TJ-z<w+mDgW>LHYj{f
> zp-gI>AOtw<pB>vr<9?C&EzB8lHU{O9fO~2lZyj{=CvC~VlB$*QI)&1T{$sTb0Ot`%
> z7h>Id8)<=UCf0YahU~%qsfJ`_d2A$IB)a}-XzE?~YomXpPR95Pj$-sL at G<o?a#YBl
> z?UdFlNp4t{)}+kMaT<RjYw0;J3S7*Z=iPQ?9oL(k20XGg?&eE7<nC2Ese3u*sYNK;
> zWMd%jm|*@xaClAm9d<eJW$8orcEh$NciV+E#xCf04uXgJPY!(OqU$LOu=c*R<2u%*
> zn4_}dm57N;muWhH|C!x-`e_GrQod4aV~|HBIIhY?lAPylBKjEc7>J*QIf|jzX`tJI
> z-0~9Qs*8naFFmf%y}adf5<2n1lnLM#cn$N>TS#Xvu0ZUk65~W=EA*T*WwN*?Zq=Py
> zqx?=S#SbB|ZhvZ at 0iN^u#xkN$Pl2ypjBfbe5^<>z at mjK0ki6hIma#vO{77#!`#Q`A
> z-Z(f^=8=cvpKxB*?u+~CMg$YQB$H9RjClv^me-YoxIPbdfFw?<4?jQJ{jisWbt{|d
> z1WXR=PkGi?K+on!d1@=Vr{lhI=-SBr6-a?oWhxtT-kJfu+=Z6%w_a0b!pB_Cl*XBe
> z4gt?~uqDKw#&aAv_|Y;|!|(8eT`a at -Y>&Mhgx{2XSmt7XU-0nzg8uV9^YHsD!|$sb
> zeqZh1??Znh`U;ubg<)=<TC#?TT)*f%S+~FjEFa<$BXZUvJ<3FIe~00(y03JKj|sYb
> z3-jE at L9AN`G1sgkd93a&I|g0zx2hc6PYaH8892W}OJg|Z^%mrvBCetoiMDq5y)aYY
> zyLM%~<+G{c9LNCXwOixXQaaj**lSU?TQSGTyK-(h7J`?vx>FUhD|Q^KX-^6X%DUBe
> zobeB-p4mVz)jV}vYroeqZmpHSeW8x5z3W}pp-t!s)`YtiSzQp{u>a;8;Gq3uL~X$b
> zN{fPT`<-&!VqCa$LkxJOVuH`~n<>dRb!cx_ao;yaf2Zn#B*fg94o**h-UGx0yAT$z
> zNUj54%*zV&&jxXYCbqnU32Z69S-mYs<KU7EAIT9J3MprkfjeDt<PT#Kd7n>l<oHG3
> zP-DX?Z8E}TW$Ptzfd76kd8hHk-4<1w-u%{YPC<x8b`-LB<-$3oqk5+{wBD?N96i6Y
> z0>=}Fj+M at kBlO;%ZaZPiZvFJeAIc~2H!VLXdwZjBES-und;|Y!Gx}p~uxEWC{>3-A
> zzlM|@&zO>;AmzpVhk*+`LB7!?8F{kpu|Bh0ZepG|2252R>cKrLop(YVM|UPB(i0W@
> zfv*zB(N2gfWJ%mlzgwWP>nY99MUge9dEo|!*CAhF&9MI}{MF5qLkXUUHwm%1{9qSZ
> zFd5j`$s>Gf8r}QNoKM6t at Lm-%vQ2x9a)V`nC$-`~7nS*=P4m4BZ4M6a;8>eciuHnG
> za<FF1Mq6x7%u;M`wmCqbDj+^NEe1wTrx at kZLFjK&kpHYma%Z#=vD*+U{Q|ID$AIBJ
> zWdxr(-gQbCNW<r_wGr=3C*`zBlsOnr&AXqI-pjh^L*!5ME2-e5g$!+U9g5#+<VPHn
> zNnWWkzQ*2#E%`T2qqP}*9sZ3tzb8n2q+fS<9~fREr}3%MgemW6UIyRey1J6VQu+yE
> zR}ZBA0GTZb;~0s%k+9%X%@(5n;n{#moczSH{-EX*@WYwwu513(np=E%Z^t^(r4&_P
> z(Y?7piwgu!S?DmLdkl%|xO4F9vG}HdIE*u$<<OZ`Bd at -D4D!t8 at o=sZ`n0mFo9mmf
> zUxB&cY&QcuRS>~W#SP*au=V0N7|)uGXV1m)j7|%43+qXLq%BGtba3T~!1f}Ap3tp=
> zTTKURzJi|0j@`g|LX!Jq>Yxj7ccgtNZLo2jMHy=9wmW=|w33l*D$qbrJrK~5$1TD0
> z{jo11Wk%}Xm&GY~g6_ at O_v?R^^F<l_aLto7TdhciNICGIcc6T8c7B2KpU3wU+pO;<
> zk~vYM^{5((U6S~1qJ)hNktJ6=DitqdKB3R-_Wwt2LxS=#7hV30xy*Yx^|41=>MP21
> z%qrmi-4R<`CWYS*QaR$`j9GUb-)HIewAXdTP+dFtp!`)Re>wbtba;0u_A8N=qYhDa
> zo}iDUe)clo;7Dvud$~LFP~PFPBPI1Z2l=M&?8EblHG5I^Aj4 at +#(UN1N9qhdm6A<o
> z5yL9BpK8}zeZ_B*@;5O5$laYl-}Xvi7wn#g@@q(&apSD~w?8BCJ2lB2Eu5Eq&OfEe
> z#Cv7}|E^{mI7e_Zy`xlQn3dTVXT`3imJFB*;!fqk*Dv?ue>tDadebS$<{X`0umSur
> zGAD|}hY&SItsIK?xGo=9S-bz(tF6Orpd<3>LkjzT(fJooMw}MaKfQzhZMIEzhaWN0
> zDOh71#CnI%J7$jstO9m;b!YjL+O?mfJSP&TtG*S?zke$I0G%hB9oLjz`}hPigLVZ!
> zTqQHRvjTB7Ee~VGb>K0~l}X~7wr*jyIY+g1mjvRHC$;OJ;JzeT6fopdJD=8{nu!=d
> zg>`-5kL#FM-={9-cOE8jmo!uJ^ENrHDX`<>Q4ZAUjG?$caSAoXY7mEaZQCE`YB@#6
> z1I9^y5co*toq3~zj>toMbJjUl;&@|@X?*q_zfmnmoI4LNw?j*DY`pXFs9TvL9JeB`
> zS7>?8+VSUsiLL^#U- at bO;rBY{A56Qde3e?WOMw`^F1qL9lKRG&f7;cH``FGwrc0T3
> zK}O%fxZ9rNsy%Q?9>3{P!3;xUEE}!xytgv#BW(|Nn9pH-<>JNAb&vRhGWg79B|5X~
> z6_R@^)8}f<Y9D9B;HHg;VQI=yXdf;Vh^q~9ZC&iEv|Cm<x!*Yx at _eqw{q4{88_Adg
> zTPYQB`iW)D5upn(|KqxNqRVE-i?2n`Mql29ICNXUxwFq!?F}wky?N4?v?B7udJTMq
> zH}#s)j$ShyXXYCYsrKm?2)>LyMb6_n7xA32m((~{8IglAv;zK%m6~nvWfX&pb)Lf-
> z%~AMfAl at E)$xii&czvna at R@xL+$Ptt<_4xk<KzHND~E8KKW~IBiuX_aqn;U_?<w|E
> zbdcs{jEhDW+faYTc!_vFeYZLuf*%`e)dhk1F2KfiEeOcjH9o(sVpQ}IL8pzmy+D+c
> zH2z#$)u`YjbFe-JUWp4hcYq4`@4wmG;E+PC9sW1|L;pto3w)Gr=bID0b1tJKkI$wh
> zIW)m<{iXCt1QUmL%n at 81d<f at xR~qD<;J*@=VSL%B^A#GADiN>I%&>9QJrrb=e~m8{
> zda_|yx4Z!!&iy^x8NXgB{+V|?I23@(y2U%T*GTVzkH$g9Yf7!bm%TF}^tN!p;)+CI
> zn}D&pGcem5xEwpj at -95PmTQ4-KoM8|P$sSrywzFV7r3KNC*J{%wtEkI5Z3^@mD|?U
> zF>d$==dQmf9X!51#->RqUY?MT_3)OuCH<=QnjgVsw$RRH)@?p0b+fc79-Gz#lm6 at 6
> zNcdnHJ<xB<G4D8&b9@=rPlHy8eSfO;sB*B;19NFT-!-9?Ra&k09x<#Ea?lA=k5u_A
> zAP#n`t<F+l&%GE4TLivH19kle6IZ1jxFpz~`@mUjp^~G`m~#xmgs#jClLt6?It!&Q
> zvDrH5rk0+$<w=axN#+&AhGx_u2Kr?uKcSee&bWa1kC&YSgn{7Q;=lJ<Munkn^gEks
> z24bfK?=@~(%S9nhNA~;j0i%;hzUtn}fFQO~u(`{UB7Lt7`pzAJbM9Tjd#awCaiYpz
> z#T?}ijOUcXhE7-Jb-*#2sKtp(AV1b|--Gl01^Asg6=v*oH6*3g7w+^57Z+juUY;?J
> z+{0%w{K!4*|9OwIQ-yjQo0UH3WDs)vP}%ReKEC^E&%Y7Z(3 at QbUzSISa|{WH+w3a4
> zwj*1{MP^giBWp7KFlE$>ft5GsCCHsj#vqa}&Nc0IaZN at r>L#wUxG$Uk^P{)iF37gf
> zwK>tWg_5l)nhSqV%1>FDQTl#$hDaO21dZ=3{qVvJrXF+l^uqYxT+4rE>I()KS0{<*
> zKRTk1>Bc|Hko|I+Q)qWFf{swm-%y5cTk0Ra*;Uq*-?X)!u2s$H+>=2ShAWm9l~58V
> zBhJ+&xv(1bH8!hEQS?O_^#S5ifB3=gU*Vg?oy(Zpg-cGkYL}D+jX$IFN7+g2=G%oO
> zr(8!J_VEGNv)HKyv2*oItNq*oT~o|#&x)g=13!wV+MGX at L#Lsso&>Jw+uD4!qf;$n
> zcE-Rzi)V9os{3FZ`+3|sc3qr_T^rZUz8BZZZulUP9k^ucf0P)|-;^lohd&nl;)AdS
> z|Ix%uh<5nEg}wg49Ja|<()qQQ1070 at eZx2`cb(|@Sv&9zvF935o(_j5sg=&Qsg${m
> z9_;$WfX*Q1R;M at 9!ZsxavB`<xo=AU5nQJ{tqpf3ql6F5Q*)-H<$HrtzoujkCpIK;B
> z6zG0)r7hs*IzQl|?KVo7JHjpW993dxm27iIlhEgAsBD9>Nj0u>59&|@pUEuQ8w1(0
> zS<Tr2iLB{y^R`uwr;3feNPDMlJ1Y3D%kqp*>NP(v;k&{my{OyHAjeaQ*Vy$k_ifqW
> z@;E1(*q{BxvYID!?ueFcK6eG*`#GtfEi!h)H&559E*@F!aQQ0u1OHi`!PILH+>sBD
> zcT?lvr;=xapVDm!@MsIwLA0Sq?oo}jqK$%2OAvhw7|v+fnU3tnAod|M8|$t)+8(Ri
> z;mWB*$a_EVdJsRR&}!8t+e99RvaS=}^o|<FcLBKjI*&2#*q0+d@@a=6s+!e5siwbx
> z?*sVwtF6qgu5#{{_VMPw%R=VGh9M4e=n)zj-;p($LE3U=jyg5l&(TD^*=&YAwvM|M
> zVFJ(f`R?!f8)3UNDXg8}qMUctAJWENQ9Oy)yE1VZeHZ-aF^_{guW{}>=BAI-UguO1
> zCfS^ERnP$dcfp>|iUaSClXksPbgq$l&Fue=8Qb?z3GIKkja<bTegx*{9P%7SMe94C
> zXAg3-?cee!%L(NOPD*(2ubok{@W^b;cPqPFw8z`F#n<*uE&O)fQti4BIpQ;a_uqLX
> z?OS?Yfy%Q+D2I&~bs;G2c7ZR_9<=Q*um;GLEuxzmr>&ZBS+i;)#_990C+Zm<_>ec2
> zn-N>@;77H*6E<1=`&<>;YZ`nxUNJ3K-yUB9KB&x at S32MW>d*x2dS;?GzI`0Kva|BV
> zr<`oOrSq@&_i^r6$8_g1`@iIOWE1&3-EXFm60-XsC!CONrn7U7Io9<#JC|WSk@;A<
> zEw5LOn9kp=pLkJ&_thzL(I$)q8^F0YY2BBJ$@JY`rbwsu1$XRsiLElkh0dwj{!s$j
> z%Mr2KUFNLKet1^BD at V5Tm&c!ot2!PO9x%G at ps83FL+`3lZIt^Cvto1Sw^HXFKT5|w
> zZlW%BR8ZGFqbPTQIp-7Y{mPM}q&@ND3p=6;OK at NRFVrYw_lsMzvN{WQF>e=c<-&_{
> z)V at WZFS}E;-{wo#Db936>t-aC$r7~L52k9*j}mWF<Wz6V(tUUC9w#JyyRf9qwWvfb
> z(W+C$Bi(vGr**wwja-%4AhsN{IxbagMjPMoIQ#KzZOK;0!aCd1ZEGLJ!k2V%U(<j8
> zVf_19KilI_+uK%Fc;N?(tMaH#6>%DUpgd`S{hTp%n!wpxqlWJX{2Gg_R^?I5i_lTK
> zoS}SJv!^G<2~lD;=`+-HWu<KXKsI%`!{q6rjD{Vd4!$aSa93b^Uv_y)QKe0Q{dudi
> zWXWOKvS|ylOM|uhH&NSKDDTI>8)IK$-zV|E*E9DJL#p$S<4p1&dPe<+g_-d95VPd5
> zo(Ttc_+-TCi5E}%&)io(^#N&HiE(TUH8!$x#@Nl~#6)%_H8%V|?Z4+|;x`Jv at pkC{
> zRAlWLlS_QzNPK3<9+>N0DfDry{mA+f<@AD{-xoL=c^tS%;|!2R&cnWd7(!jfzCiFC
> z&4WzhyTe5Mvmuvk1xCr7_$y={tIHjYJ9usJY^$onn;VI_YJ`^g!q+DoT<;1mZ?^Vf
> zF>GN1CwXEzT}Q?b?iGFLYp(P<GEPu_hAW(W`|HDFdM+1DI3oV%7!hF_>cd0*e&~4)
> zk2qh4EXwnnS`xoNF{bld89y$2s6Vd#BK>{DkQ<qQZ1ljW!LPqi=E6Rn*O-id6Ugc?
> z2IfLv1wUVH$?x*=lE2V5|Ez`o<y4{z8py?*Vvo-VEY#iW9=u~#@b(Zrh$aDefPapt
> z4!qjs51sI%8P_+A&6 at SM%=OT0qbAlJmX_C%xn;MW*x!h3<+klfwKAvCW7-i_c&7mz
> z19^=8%youvCQL8Tsa?f&15=d>VZhM^T=XW!R=>#z-+^rFTH1LacN3Rk-e3uIWWTLk
> zggTwKX&QLz5bFbTNtcgFHmf7sa|}OJ7wl9myiQlACsiFxt1mckDO_7%bBymJ*N(S4
> zK7_2H&wzZA_EDvplWhM<cpq|1kf2F=w<mjGU4d7&Yhj|o)rpeb-<JKXdi3i at 9Ovw1
> zT00B9-lIdM)1tFIC;oCNXUX`ZRJ?LdhCHT at vdFYlC~NlG$A$`bVJ>{LzbQisAL<dC
> z5(a_`T4I+HdCJG~3oEYcZS8zIBzN<Ty;nv_eRk2cf3y_!FP3QIQY7L}Y{pOS=*|e5
> zvnJ&qguIa6w;X-op3-ce|HiQ~TL##5nEwa1y0F&RxXyC;UYEx1?*vw{vvRA6{o(@|
> zd+>ub?18P}>~-DyLo$Gj$N=s`eH#6_l<Dp)14l$<$_mmi4G$T8!QoC<ly~~9YU$KZ
> zvIi7m%fOsXR%njy$R_q=%O;@w<2tK)Rb6^;(4fBOR#4- at uRdOhco|e-!%kOmB{`-R
> zN7VLCDs0%~TBvUb?`*<%9>n at 0q<8A5J4fVXK4!0BE_+Yr`w8aubv&WumrJq<`B(5g
> zpI>~sT7|NI at lD41<<Q^H!MOj#Hifho_in_tA>4}hbzA<&_q;sxJ?d8Wi{WwVKi`GC
> z=fP!E$c7XSZgPzslsUI&%lJ-B!p-a)(jU?$ZL^W at 8ITs3FD^AaOPc at x_nXMS*ajOS
> zI|p;h@{7;bB>u~`j)!s|z?i5(S<SFvTij&yEpTf6FJsa2|L0glFes9=&A{V<XJtqi
> z(nvujnHy_4A$1IgUgQjHpL!Cfk9h$)hSgZ-xK9q+TQjuACHzQ<6EKIpg#O^8H at lWC
> zKm7GeN<8y3>ico5mGO4?cY3?Kh4}ssk0+T=>cf^5`~#d(#4oA--v@;zHXeKl at 3p){
> z_X+p2v4kUKici=f_?`SElI%siFzE5`0LvxoG9uq%#H27!xq|n3J@#h&H|8DV_b*fZ
> z^f-u__jo+xN6LZ!bVF};r+A-qi<a-V`ydidgQ?hDu<@}uD{H|)=5LE4JOucLVIG(N
> z@>IP7|DR8*u$BR at KGx#kpK>px4SS`NEuVf$%00n4<lCq>^NYl1P>0TtSz;gutgs~)
> z+In4gBxjq(n;ynH{|0&c9jqOVXnXHqt-rwe02$-4Zrw4ysxgRn47M!`Vxm=NZ8R-a
> zBmSP9f8%*2e4E53V#`Q;-YwNeN$-K<)sT97Xg#~%`1WUZe>zuSk;vHT*{Ops?F!8#
> zLkVOn_<eTl;J{_NpK?EynvHv`L@&WR#NBdmBf1%mue3n-y0_(p<yF8m79#F=A^f{_
> z;P{P%kGzS*EJ~XPok29l+w94H1<WsM#0wB42Ewi?cPj^{idi)YTu0NVP|U2(^1Wv4
> z`%jT!zie+Eo3FA?2~M2FDzCrTna|vaI<nV@>q6~are|mFUK94`P4Q2B19ISBot5e|
> z_H*@@>=)`P_OSXUs}as({SCqSZR*?n5!4zsPN!g@{{%iwOxHG4V2yrxA9R$Fy^yoY
> z8ZO|!#N)ca!zhgDJcT*1BN1!FeL=Ccu|eSIcnv-o6l at OE4ij}|Ac~SHD{$VJAun(0
> zm+Y`mi=OPwQ1rI~4|ojx0nWH)Qb_n_$_p6J3FUX+kZ4=}?bUw{@li{dE83%I at 2#Bd
> zA2VVP(KY*mwc~eqX^%3}oqZ1q`g6E>+M{Y|zY8bUPTS$dW^p2%gHLkoG`gH}W$U`P
> z<Jj|5-p5z8E%DNwTN}ghETQ%`?%x@^o-U?*I_e%2X!X0u`@HDm-L6Qz+0&dHsn3+!
> zSPOljd%{PBvCE)iK15f<9;eH2?tJWBS|9687q-8Jd^19R#J;xu9qbE2Zessb`-(}H
> zo at i}JUoOtgoMOPa{PX}|R)gr%=~Yfu-Ou5?^OVXSN9auM?0ksw=Hc22CZO|-(ch4d
> z at xM<PL?16mFqpVkaQv;Ctsuc=b!wth(DfH5%lFmj&9e^B>oA6>Vatc^ufq#|ofXha
> z6hkj at 4sG}X=Y#kwUOtxH-N65^V$(8Y(7*aX{|bGKos(8CUIM(tT1IXkZxA~tzm0i;
> z_y~YQ_Hw}_U0_6o4IEO;T<G${cwY_atv>AIz-v>GOxK{z4q)7Mf;}ubbrI_dyNkNr
> z)5+hO9df=sE~cGw8-Pxk&GzEcHSitFzU~1$h#Wrk!CFP1uU5U)7xp4 at PT}OIve5=g
> z+Fy}TgJWN(Kq>(HChYq=1uzP_Jfi~pfleaqm+Un<&11Z<woqVg;YRDSMwRC=f!dPC
> za`X!?y0}}8I;~}|a6#;^z$)M3<~d1__e_QX&+v8vUpsvk`s_}mg~(ro{d?FiK*}Q3
> zBJJ{$(5I39+>IE=lxIg-kH|@eYx&53lK8J7JtZvWC#DCoXE+a&5OG1>GEU<8e0)>b
> z&YHcaoTSjJoELi0xwh?*+I{C<_BmKAeb(@r;S4vC{L4xD1G8Vz3C6UU1Y<54F at Hz`
> zZ?mS@^X%N%I at X8rpp9XcNKKe`WEOn8%?kx}g*aCk_B8S^&K<&j8PW`DKdav>Zyh~D
> z(0cl(0QiK9TZ?AQLi?TGa;{-C($|o_*fOU<RlJQk+G!%(J!+yWIPFw{erU`PZ$C|~
> zjxl-#uotK`;K>N0&r#t!jRbGGR}^8EwLOC^fIX9O0d}K6`o5Qf{j7jCuY`YjiE0wC
> zLQ|Z}GD at 9F_XcX+D3Me7U^Zf7$(^cz#WiO5Y56L-Q%M2s<d-2v+uMe=w~4e>GOkUo
> z#JII5=WgL~bvVi`>C0z2?ENkuoOrO)teX&fv-3i1RcB!=#;ePj{TS<_CWH4ZFLqX^
> zK_}~1VvTVcc9Z->zbVGAza-y|XLKQ*jr2y}3(T#^?yX<4heh?^iUdX=HlR~S#yN~*
> zGewd;@BD{z5m*6Ss|q~Jf2Cm~p6g{OC;bn7ublZd^5 at +u*n*F`EQK$Q+W7q2pD~`S
> z7dU8+?>7RM0^W0xq~;xPOXYDv5x?xC+{-Kz768X^FGnYazEu!^t&~sBL)Q}NvJ3Vu
> z0Wj<5Nc|GtP~&Xa=gy#R0(q|zd>pV={g9WRaPVgXS6OIkmw0LF6PH at pnZOeYj`}8L
> zIWPg}kI)r=P*-A`Fu9g9 at xCfZCY){#$men4zdGg(ahjLu0b+Xt{xui#C5Y8ra=}G6
> zXnYMEBH^8TEkuXaY_KHqcJ#t#>zY9kT{Y&)W;}m&UCFbg9Y)0LzQff?2OxJMPArKD
> zM&1K^CNm>1D;@b(!NzBesNs at Xj6upfnA_d~*8}oz+6(<EI6Bx*fZzBh$~8QOY;)$4
> z$ru7G1bnfL!497bC7brb7W59vpa=_y%(SV(gPSek66mq=zBl#d0cSVZoUr(5GvcDf
> z^4at7#n)piw&OUg at XrV(?aFSaz4AZpv^E)RB(ESQPZn7R{?|rpquw at UT^z!9zIIv+
> zTWHO6V%yhb>O+rwiZWlW*>ArtjHm%#=nQ<lZN!gn=6%|hB7n_K;#S7JC_diCb69VL
> z9e^>+0+t_Rr9t at _%H`D<4D6N{@H#IOypHK5E8nMtfejaZsP;*H|H~ZlO{jD$=UxOp
> z#BN(8+%2%_%3|Kcb1aNtK?Zyi^ZqycEV0eL+N?Jx|K*|6^!Qvr9O<K3<G0oJNPOT+
> zSCdy3)L^>0zz5&-+wb5*Z-?Ik at kI*OJg-y>)9FfrX?g8EkCGvq19bWwGpgCe?Y|CE
> zfy+V^$rXLvcAoC$j8yKH;du_Y(4P6Dax#P3&)lQjAN93}Uq7ZAZ^`j<thgdoy6up%
> zwK%TI at f%+eC#TJ+w?~y_{%c2Vob+gDBDP~H$A!9}kxw&4JMYB3gmc&~TojvfR*YX5
> z=Rook{1&wVGFEhI0>RuU)mNT4xZpb~jh^J6^8SSFA*N2jd>azCv9|bHyJg7tKpbHp
> zJ~U6jAFCz!&-hC@(;RC;<|Y8sfA}4gb0PYTdFUJMoF_|(-40y4HLzKHiZ-N$p8rjp
> zJ2BLr@$RA-C(#Co4Fozyb7g`j>~B7p6Gy?9$%DQCyK8CeD*Jt#b=M)AkHUX?mB at Yk
> z?ck@)<2X86B)OVoB)rm-ysI!yd{r&N{!6o}5vO{~f;GGHQh^b>d5~Zi8%zzZ9+i<n
> zk*AE{rEZu7SqtgSgM<tCt}?aSe*K93`pfXO{1q5r_z5&j9g3UQ01g}6Q<*r^MTa~m
> z;A4n5fsrQ&7kI-gY%^PM54im*^DpfA5Oz!-$e!?RZh&u$cbdyw^cyq!*{uR~OL at b3
> zsTKRT3)HQpKLL*>lKij$^)ifkiG1=O%nL>OPeW_Nt{FylEZ(t;U>ax>>{mm1gCd{w
> zA*S2Vc^5gJ`90oa<8Fl*t<EE=xhIaNpfmUlI)f-pCGS8%;LnCnX7`$R%fuIUE5xO{
> zrQ#}ZzExm++>P~5l at 1)^iE=l?PYxlU0`GG{(`-1zczRSYF7*B$-OOrEX3%qE5NnpC
> zBH}+pIDc3o`vCKxBp4xr3;QS1g7z076Qck9bSUJaP{!s%e*^wodLQKYlfpT4YF532
> zAI7bGtQU06X<`$60Z(EqhObh{ZrqoRJcRr4XnUIU+19n-3AehmeYJ>}scGcRP7m+_
> z&ZD9T{-}@97Je}Pqrvp8q~)826&|^R6X1vUY~w%MmzfLGL?QbH5`I<ee%7Q5HXv?+
> z-YogbBYcqAoGV<z+5*q<BLZ{SO87A^!gKD!M?D8|eb*kUK|OdY)jyB6`+=1;Y>s?2
> zqXy&02g=fh%}Sf7{&`<=zu+BqsqQwol~nLQs((J1_%{)rrQC($EjH>Uuhd)S!jFQm
> z&UB5_>VnLL9|zm_!I>r%*m<Q8^IgFI?Nb5&*ERwFKH>hqWTO at zYV%v10spVP(C1!g
> z9v^qmmYle+AOW^8Z`8BD`yTwSLevqshap2Do;p%3QeE3<T%Qe at 7hJ?RcM at qa>M>sk
> z&X6H27ksyXbHVW`-6(>kVr<BFs(IXkPn#WpG3MbN(--f at xeLvX_{W|OONZ|}i~Gu-
> z)Gr|a=7JrE4V()n!25*alWqP(ewiq50iI#zUd1ycF}h|)>=TTf2&pSlUxS4a<GF6^
> zan5xJCz=Y}7-ON;(60-JaZ&xuIM$o+|6=_1hRzHzHJA#WFL=B>y9|Qq{2H7W_Dd0a
> z7Z~u=YL9!VYv^?tvr??idh<jLe63{4y3|&Jq45Y|`0O2w3vE<2cpE&~Rvcfa_U@>_
> z{<nyap4CH}^PqpsOAJ;f3&5*wvqDGzggwgqj&WKAOoamby}WdMa~81RZ>!N}HM*UZ
> zS!erCbMp+qnUFrA9Eg39E-OgrzroGv6T_G8dCpsD7M%Rmi2ktKwu)y1rsXMTa;wyQ
> z<+9#Ju+(mZ&!A(9T_=%eZj2`~VkzW+kq+yDeM-g}J0)v3WR(P7JihlS#_7|VA91`0
> zYwEAZp8*D5X!CLK0XI^SQQ>|{p<<V4zJg6%0Q~p$=vla at vCr2*fb<Hma^M&1v_KXT
> zlJi+-?PDls6f22O-V at jwi=Nc8Pnku$m$AMt^5SnZ2Ttw!F=aW%yeU}M1R!<d!Ed3i
> z5cm}`h91V)b{^>=q<W+oSy`=?83G=!TjUV2&_BG~9lCw!1c<DEmID5;+Y`^3fjqMa
> z-UH7YjpNslzKC=tQWffRI`(HpKHWXr?Wt~@`BL(DaPiG at pN=y3X^I>c;#noojT{sP
> zBBuQiHc?``6-V%>XHj37C|eow{(@s|iu){6%FCEDMmtnMcKs*kH`Lw{ui6vaY+FF&
> zQ`;xXHpp@>r{<Y2Z5NZe=iPl$kM~QI&ve%emb9ygVZ%2!elm~ulb2_g`APjOgS({5
> ztoaRbfykIwg6;g@{fPC3?^+SwFGPBl#N|mp;KCQm_=`@!*P9(Vq7Iny7ly_!$WJNC
> z+ALrE&m=O>;Jf|p at _xAvetHBShHrqsI_kt9TY&kJI>^b=E#mQ0yl~H(9 at QDLot2tR
> z?&Wyj734RO<E(Om$L}n&@AKkGy_BNe;{UxLn)NkLU`sY5mRKawFC8SlpAB;GTJ3T;
> zl64bpb<qRZ&e at 0XEhFoWv)J!L3XB~43~2$<r%1K18=XU1WPk2!_Og&NXzb%G at WOa@
> zx-gK=C;ta=p~$l^t{d=Q$=FWDX^c&a at J+5hU*Nt*_&cvTGI4?hJW#8;zuW#g@@Kot
> zXj at i!u{kXp|H$9%Pw-Y2p?$B?d_~$n{-u9hQC3lOQTKOf>uop=h at PbjMq3f+&0*;t
> zWx59#rxV@&B<-3>WE)`{hHtzJANGhgg=}?Ajx;8ht3jOkTW&kxv#?gNsw<OP{cOvl
> z#Y#)T2l;u*c<rG-<pf*T-@=J@?tFAYdv{YV_Q7WqIGf#`x|&{x at vYqI%nL$aWia*(
> zX0_U}!Y>R$=G}@ICI#_Mwdw<OwYnDeuOybUf^&1X#Cdf}@f(K<RPOT<9q3AR5?x)O
> za#(mwh40!Pf0{blO2y{TMHurWCtMs&HVW%%zkUn%nnBNCZWPMs(*+3*pP`OB;qSP|
> zmSBM2uJjp>SzA(M9hoB#8$=K88t8dCoU?p^UsNNHpFK~TEeZQV?B~#hxTnRIh+{AC
> zT3}3OmMNd%exudj$0R(!)~dlF0nS`+M(&<U at o4?6aZ+2#I4y~@n^B+|`DNx*^p{E6
> zy=~NvI%+I^m2hTL2f}M*8FW+I2<=>M&bEr5Mxd-7bX~76`aGq?d!)}&g!GSziEJif
> z7F8ooZv|p&w&6G}MX}&@@J51T=kI^;ekfNiwcR at CaP2{c)}rnyyag^jOE-sh(Eyt-
> zN8$`Z-ghTD5q@#%ZH%b^T@`#3la~RRYw7`DWQo3)BmO*p$GQa<;b!_6Vpr-_QQ$mn
> z(H<C-BVK$gvB5me>iL;)9_Qz6a6%bk7c3=lEE|)}c~M>Fyx4o>9`n^Sg=x_)#?d73
> z{CBmNGh1EW4?BO0xg>cUe4fF5lWZZrRX>jaKiiUBPuwifu at 4q}f_0BC;r8=TSA#2+
> zTPn2*W%tSp)DbxaiFGBtlDBgdo;~oB{P!hWurf1F)^*43e<M>iwI}k%G$#^&x{sEj
> z4P*VLU*a*ztrWVUUuSsIyEGYugQLZCwFNQ-WWlS;r6g`{bLy&cHA5*^B95|!`>~wI
> zNWs&B*fWhI<4*L#m)7ejTM6G at V_y^Y&#;6`%h-2g`$FQY)A<=M&A2N<jXt at udCa0W
> z at eE_%6LFO-c=2H(pM=edDD8C6FL6wZ`vm+g#gRb~DSb~c4$F=%AiDC=^|T3j^pVpd
> zQVJ3vOOM>9#=FXPD;6KL$rm38o3(=1`H~w~kPsJ#_m<dvaXyHgU)f+wN<3VUkhmZF
> zjkYAn2t$5m>xlde4&xf)<0OR4VEaUD5Qu&)9X|eT_oP!<jHLDV*@?=#1+LKHgYWLz
> zqG&Vt+{_oN^$WNI9;LuPvkJb|+ZMIveu0Wy>%lcKe9TsCz#MtT2wu*_SIK!T&PU%D
> zU0(aM&W9ZL|9xDl3na(&e;*&w1*5HO%+HHCr)<{+VjXx7a^mMotcmDLxWDT^?_5RR
> zN&K~lAL|skZQ|Rf3#Jl(tSPmK8GQnC<_wwStICCe;WHrLBevwqM#ZY1Z6t0e>ajh;
> zNUycJz*hPK>N9HHecP&*$JgeUJ8<<Q+cGE6$NQqRJv&!*^rT%@gog#JyaXLuTbtN5
> zPj=>;+THTPX^bnq)@B{`QD(q`%Ndlm<Y&aBM!$Knj|2Zz<DM0W8M^$Uq|VInqk++j
> zxZ}Uo<1{%=l!(tEp9}s|4P==X<o&Q<qMI?@LBD9~UzK`}a;ojwj&ClBHfQk=b8trM
> zg`Wz*Gbw3kjTs<wqcxd)8{yg`--f#02w5cegv{}RaSr;$EY#UA4d<?Qv>u=SBYd^C
> z)*Tr53z&1sRLCsOr8>w8|GlnkLs^>a at yLWNc)p7Q&r=o at Ax|jqs9nS#e0ZN7+HZUd
> z;{w0shpU5xvmif@$!+=O>RZw$VF4?6Ha^<mE*g3SoZn8)t-ORaNMFG&q8otj0CKX;
> z<89OTV=>Rqf?Z0KZ{EIY`KP<3%Fn(Z?WT(*^35E~hjZ9mY{#)3#daFo32fQea<JuL
> zbBmn=?iBcBgCq64O at jBqZ}g`^_z;Lmed!mBjv{`M4XsyMVR at wYikLajbK%=)Qn%^t
> ztv7xuz*dO%v-Z}GtFOn{gp#A{PLO%*$#|3CXfxrrdRGUoyC?<zMcGh{s;kQl#c7wd
> zUYyXiBrI(O6ZY52OM&ORwlUqTxxK+)N~@2r?J*@R7d)pWYY!!S83r?x%&Du0EczvQ
> zG^RQh37+dG*JLLaJ5~k0#C{_fL->}vX0*SAv4-Vs6Fm19xh at wxS5Hz3*X9YH`-bd$
> z;(13i{mrRs$n!3k53WY43Il$oBidVY-<-OZoIhzk7){QH+s`XH$2-JaG?M3@$1}S0
> zc*dWZF6LAz$$K4TN^-0cJXb`XKU45rAxWnp-*1BFPLut21!GQ;`+9fJE<`Npc(1T&
> z5x>|Zxc9a>)swtOh-YkZEEPPbC;3%^F$R)9gM3fpTJqj>a$G4GlSa}n?C0O&ZL@!G
> z*Kqnv$f2;H6)~L-yon3vS>D#%4>^qE_u9vyPC9wpz`HjQF;R84DCp|8)|FU417|CA
> zg2=OWIPW^mef#(NpdQ?!WV~$`KWVL+ekl4Op7&Dwh>%MKbo4*aU(OG4T}5xjzW(pL
> zkwKdZ at T>;-0EYg%h__AVTwmLBrX}a<4 at z^7Y7~hv`XS|c%^W`tF<8gYU-VJpMLlGW
> zxC6QKX~^|3?-kLI87(La`HuA{%W3q5hnnPu?yGm0uX-d{V_X`qw|{dR+Q}um>^jN*
> zeeEF`HrGP4n#?ud^S0R}n`**FuUN(L-^-5Q&en!}LRT6UunS4Ho#@%VOVnR;_js>l
> zMDPY at x;9g^?a5u?qJs9bg}Dl9 at hr%iiX8R$RVc at v_W9CZ+CzDs?F+zBS29$GsEc=p
> z>*;09{dijri3hu0Te4Epa|nJ*2f2{AT3w^EvY*lBG9S8?_nagDyd|eGiu{j=_Ce@=
> z8l$w~T##cwbvLe3h!~%}!45GYLEjm$UrqKY?{@R|zOeaF<y(QBTq!tGzgJYh_gB=*
> zMAYws_hZGGf+NjeqR&`59p*33>Y(!iyV(kG4A)S?4(Ot$7U~4%O{$=lYgd6Gz&d|Z
> z;#~WFZ7{!{{HG0H>!4RofghbLU&qKXSDdB&3REEn|C$<G+e2xKIV#@LCnf!Kn;LQH
> z4x$XOy-p2-KU4|u+~(9fL?4YggUrqQFgN>0m=zxU)y=9!^1W1C9S2!^c%GC;PFwM=
> z2{8u4K3>7}{64BZGdM2y=Res8oO|%=#NT8%mU26pUowmsE4wg;+>W^$_T>r&ZNd;4
> z5K$JW=ptiJlt9FXp9=bgAI7DY8ODneUW#sdt7ZBR(3}6KZ4c?Y at ttcS2ee=vP=fj6
> zZm}PkCs_r2fC|XC4|`ZT`dbX-1#co3gat(CxmTpmu>Xr`Lc{*XkylKOqm+sq6aMkw
> zt`pg-#%n1>znR(0{^7qtdj|5vZrf3!yY$ydJU=n3rt{<4MRB=)p0}3N%3^VToAaXy
> z;27eIH<E9lyr66Gr1Qb!Qx*cf at WMDt<Vkt7S+hy}(n5hH@^=+m%{XH{^b!0BTo8+I
> zx-zeK-uf+B9Wl1ZSrPElTfy}5f%Aqv%EsT}Eut>m=%=*Rj5K<SZW58Bl(wE7#b+6J
> zucHhPx{2rbXW^S#u+S-d8MBo=+Vd+g{eHW)_C|!z59T0_o8OxIeT?(!fA)Y!je$*0
> z5__WGxIOo=>-OV)HSvG_zE(_M+~#AvxWS|DV$bwaF8Gd_lDFhH`tz2wzut1LQ5XUq
> zj0mi`S8T+ZDKs;f^ijw2m`8JTui>BE;0eFphIN)0x^iIRZ9$RXA9r4*^Z9?h1|8MV
> z_+<MSHjP!Zq98dMv6iAg)CGe(Re`!<;G+eO;ndq`C(AtyWUe(5T{mkoGna_G2`&Tw
> z at Z~*n-aK%xl>T(J%*==i%{vhjmYny&oG+8~R}tCm(=`n_SG!tI{?veYUJ71Hk3?+j
> zshC-(xe))jT2^jmE)$uJmr33MSq!{D;csSzdDkqQydg$&-uaw{N95e0`5xB|<a*B(
> zA0vF_#-L53UAyEF-&|V~c!^%1ZM)$w44L3=+O3(zjZ?uZaCb4{TrIA!i544fmYXj{
> z1%nHCYn at s3WVvpr@5CPzHI5d-zrieO%q=pCuqF_)b&wZ at qNW9w-JY0Ne;t<fO7!8k
> z|B3QO3?J)pe3i%@X0v^+D{8nF^Sd(XGnY{bnRCIVvcsdiQH3>xAHM%eT?t1$_F@>=
> z53lIW{UUq3_O~OKSw8{S!N;Gi*;b=@!__os9JK=D_zlb at hwVIs>m$rP0T{nmOM5gX
> ztXa0`m&|-KhRD^Kz_v{(Q-mGxg4}9!g<f5?(G5OcM;aL3tKcarYUIbB=!qY3JhLg(
> z>c8#iVxpr at va)BkvWOF)V2xSL#LrD>+iHNH#hCsbsw?8P4e-B&F7yZgRoYXHLH*-Z
> zUcABUK at J01%|r)nu&4s1R{Vpd=;L+h-%EGPoPzECaw_oIjS-g<9ro~baIl6ijosgc
> z*!6nz^Jl?>^flVmS-pA7D`+!UAajDt4|NfmmgMp-xFLq*>GP;l_-vz2E7ypJ^LY;E
> z8-uzhF<yU1>`;kIaKT3oyLtjV3^ut_u&92=bk0M+WcD&;WonI-#9z4(EcwNp9^mn=
> zJ>O`Lw{&;$kL#VC;X at 3LvC20o8EYESCECwVLEM)zjA#GyhwnV}Yh|R}*=4g3{gN5;
> z&b2Y550HJ*2GC~ltUx at g+|J)9aV|HC_2y6fA#YCAFIoJT8+4RJPl-5slTc;@Fp(Yk
> zdPbsDrzdOm>Y$c$SC?R(x{vl6t`D8;g>)%+*Iip$8=~kO;y1JYBTtJ>PWUs3j7WHm
> zEaR&E(60}BR4nvZqFLw>etu!#k}M)4p#L;r3^t1D|1lT)S45YezC}{lD()biXuo#(
> z=^9OA{v$@he~fe2ZG7#+he3hWkUPQO^7R>%)fV>d#_X`76*G6=**FM2O{9_d=|#pL
> z6G)zb^_>4U&H-!a{wZ`+#x&?9RbpVci9QQHAF;VK>eu8#u3?<R|2EuJIc&+Tx(8e+
> z^!Q=#uAsu+*qHs9>qesEEw--5I>0le5jFyFp2ZkqbJ*gnMg0~l;_Y#_^r172u=z{k
> zl5o8ey6JVXIY&dm&HPv>=Z9+EFf>^mioMf1!DmP6hKvidJkD!6;`bR5L#w%h*m($-
> z%8E-iiF>h5hWee4wswa66SS*__<Uo4iy8HB$p~&;dp-(WJ*SZe{FWG3YT<`GCT#tR
> zYnYRF`LALtHPG>hBtPZs_H>b>ZOC!&wa5<_jVTUxsU5ynm}(^Yh=w^azhmyawS8<I
> z!HvvSuFd)0QO5;K|1!>t$P;+>R|q`oYqEZKJ1&xJiLh~`Z;0Q)^VanQ_?-BAOy~{f
> zeS`b7WGp~`);CJPO$`2L!qdkni0^v;Bzu3G{Eu^-*zI`1RAmz3%hKJ|n>RZ;?}JU!
> zY+s|ER9Zw$Z%oJBcDX>UyfdUjh?PN>2|~TCgMC;59hq7nvCHxgQI2|n<TB)7_Q&0`
> z$#{x7IUkdU_Wq3gm-HBZ0`_lnR_rgd?~BvwkY^NMigntpbjR(r1sjQO#rhiMK<i0-
> z5v(I&FCUtB{(K4b&;Ca?zMN{EUiSC3ehcyA$MswA*Rmod;{<=G|L+;&q85lQpSG7z
> zRA01v&QRIXoluU&c)vF`N223)S+W~*=+(W5!@Nofoa2NB{KxuKEA+x+A(MRvKP-GN
> z^d%2O63ZFeEpQ9-(SF0bfGyB3iM&Fd5$w at 8t*|6T^mYzn1q+Sfy(9cA;4;|{{=N*G
> z2j&&U;tH&de{B{wm|o>CuDbar at a=0Ci at LWjo;NhNG at NVJ#pZ$sMyQt47MY~H%BW~P
> z`GCv~&iN&X+f`HW9`r{H#!gn+108&e=<;_~!l4B|2J>q_qMXk8c~K%-4KD36n+yD3
> z$FN6kQTUD+edvSJ;&KJQz5>_4^Tc-8uaCoZeB*<=@ckOAH^0yc?9ycPPmDqLjYwZ<
> zF*TPXoq)6g=|rT}VNER#+iJVPHRhe9H}B|ml1F+k4q$*C-A9qWgnJP`6#B`}$$N1A
> ztH$;E(1*9sud`u~Mg1*Yxgo~J-~JM{YM064T6~vL^I+4G-i!Qjv9G2P*q$+u%hGAW
> zztGa!d?Bz5ZLnyD=jLw2ZE)q*6Bz{M03Sg!FmU~-kF2fY6Lr8)YUbk^-iv*QbfUaP
> zS?1OYPdk*b!7dI=amUyXIkou$%2)+^trYuJE#=LXQY-#dHOKHal6hS-i5Ju3=wXB%
> z<Wj+V_$L)8kEEka)94^s7>II{`!481yVHR?nT=;%(6%wJk}+X%ApZS4ce~AZ at jP%m
> zP@;M&4yg$JD9@&#2Q at 6l@RbDLK=Ma?hp`%c>DG>z6~J&$qScorO2s2^@lx=U6-oY`
> zfPTPLCF32{uzMq(EVC1H`-kw?&j!9AXt6KBO9Crq5J_rpEew3q)d>CyU>{30^OdzI
> zdv|lidSJh`2e<k;|MGP;<bChOfyMslSAx2dzdl49i)`37fC)j_Mex_hbM*^W?*5<k
> z%G(HA7uq-f3ivhZY=5pX<G<~r!aXW;z<GC9u3dIXzWpHdSA;X*fnrR(f!g&ke12%t
> z5MMdCU92v(_Ifwi?bN6*d<*n7%~j~D_J2TR1 at y%v7daW9h+Zo!Z86pO*h#LL6r&J=
> zpAz=)S7JOdzKfJ=pInGOOU+T1L3ee2kiUNR?k!Vlh2URkdZphJwzt$ow8Jdh4)4Zk
> zWWDE5($7GD^7h*~-(6d_9R6KDq2HD=UR~$7=xxVhN$MB&j4LZFIVf8GEXxKtze#J}
> z<VO#r`=OrJ0BbXgU}n0&7cK1}aVX&*`Z at Z2=nt7VX2Pyq=Yu1;K4ix*7Oxu|$KiYC
> zKu4U6SY~_|vfhEc9slG1b91Q-n^l_!8$k>4ZEyDt*=bY3CNnB>aJO`F0PKb-qI%z!
> z)KV86_;$gCPOt-!wR<ahPg9Fsnyssp<_EpJJS%WHoQH$^ApevC{D1>te{Ia>dJWXa
> z_2)b}XV%2r at Hoi?b)6J7E&S(W at eZmxX=L4zxk|HP-rK+Ez$G~#9W|IKZ_gSK(}P%d
> z+j6Fj4-aut8wmD9_yJw(b(RhlKJCg7oP7L#-7C<mtG3&6jyq~YJT}$kv^eTJ{(#=3
> zdi;fsK&(4djz-}kzFId=osPAL4Sd4iGAa^BjULpsQDyzv?H78aqiQl0>Ps`P(6&sO
> zp^;H(EjC}5Na)%QsvKG#54zIMvdwW#J*8|9*Ai&zb2b-l{hBui at tW!iir^38-cmm3
> z>XvN_gH62}HsTwIvr2S8Cc;mIxW_HPD81XCrxHB2F;0CpCIZJRvDM<7NB=?9EQ49)
> z;2lNm?1Jf?p98B!L-uLcT;Vxt?!X>>1ASFa;!_(ATBnB;K_~f!a1}iYybLy**6@(~
> z_woZc-Wsc-*Z!2Xc-Bwj!Y9S?X{uSfC_lB at T&VU at x^aq at -QXC>d(U&%P2iCu1*$G^
> zKE at b&*3Uw$xOlU0OH4-oHS+$S^|qsQb=Z`R*$U5RB|qOloc9}Wk3oF89*LpH>JYSq
> zd~=e<{!9&?S%POqs>jmj1Y>?iy$(I=<aMb)^DEXtevmDqrpU7*3cb{>E#C~fYNxeH
> zV%pT}5VHgQ3hRML%xNzJ%j^I=d0o#(v#N!2>Be4naot{u;5K-VIQPOcT=+&ej_N4k
> zri?gv1hGt+_KnlPa|SL2cIDu4)Q at Z<UlUiz=Ug}D63$=52|D at vF4!*G*p+z4+OVM7
> zJO-TWNOS-0tD5KRelwqIM!pUE75WM6n!tGcMEWh|%ytj;Szyy;*rbRB<=bM4nnq`~
> zi0L0?5>4gzVsH`%IjC&aTJyU9rLWrf|LLnoNMHTF`;>Zgy|kxgsXjdIDB{h*_5j>i
> zXxlaP at ek`t2AZIsc$@Zv4UF{lJj^%f#~V61Je!;^NM>sosZTlNDEJq5R&iu(z<p1v
> z|Gv(9BwI>1*(9*@e+OA}`eH-#3(#*5V{>lK9>V6_oK40$td;+R%~^DwU~`7f11l&3
> zb_FtNS&;HH_)g9tR)asrUZv3!d?<6B<`L}3ZrF at V=%MSlwgIxGKWsk!sm}P<zd%<3
> zJ@%lh!%Z%^Fi#y$ui>V`r|8DaYT)>8^nB!f9_^t`?W!F3c{IjN3ENzdur0y<4?H02
> zX7jeDW~04lEAtd%x-!B(#`uw2_^>ZL-e0|i{<AnJ4zb=JFVyIz0*>GlRs)kEVKv~j
> zrx6=9)4B?r;G+>2!3}W*UUV$SShWxF1AzCbPen>%66{BO0WaN)$frWS7e}oF|NZMY
> zkN5>$|AH<xSa6bW`80^PG%R3ac8bu$1l?}l5yBI8+a1`jkN2hCHqT6xxi8XOA$`Bl
> z*c%R8<`iK3T7bofMEs4(@i|ZGJ&feO%r@`>5T5`ScK at xh?}y_4Z&Pm*J6WbDry_mA
> z?3Ly>EeGp`NW?MdC+iBN1CYVZ<onV7OLm6yzCpiTE7;Dj=32aKQqUg-qQ{GgJ~+^&
> zD--dx`=aKsS%~>$5llZ?1Ki(*tbH*y9pe9$X~6M{bzoFrA=dNpeTWzDXjRn*F|Zwi
> zi`4O`#IYK(hb3#D*b*gUv$DmoAvihKh%R}0P(ysZC0OTVtx*6=_cH9f-XCHu6jK2E
> zZ<G;b)D*E6>#GJkPIZXCBgPgrhmNwz at a~oU)yxaxrC2*1ggs#uNr8W at wt)wUYlAES
> zdj;1{Qq0HTsYRaE$fH5J7HKBZXrzacuFy<C-c};_O{(psc0wQd*urhcTF<Y~!bRd4
> z<LJ-fGf){PqkkZBAnyB8RKIy7cMJb!BL2a!4ER?UWWb^Scjo{2e>}v7n}xhQd)^~0
> z;D8JI%q1FafvhVoYWBIGOQhHv;Ey^KD06<J<yu%quWV;6WUUK56ykPOhb_*LIU4&s
> z$v(y{rZAfee?PS4TIV2BJ*p*B)^~uZE-dE4A#?ln<pI?4yWkA}p{C#724Ht}FM*%o
> z4a8MDRGKWVGy1w$GQuvR7p(4|ig+_4(Vun|X4~*gp%Cj!XEw4~Jkx;h+Gh%OXlzEj
> z1QKIw?u!@)-lUs=leudZ3yZjE1ZR6812TFx))|w^X7d)gd(yUr9vfm%4_;}34mU|V
> zm&uh)4D?k!(>!X>pQAacOEkvtXvA at j1_yhzy)R;3fFEI#y_{oc9pV<(fS2Ru%m((&
> zOi}!8!SpAU{e%Oedc1}3Fp at bfH7dqN`e)WJtb}nyEaw__8+2j1GK`74ZDhT>NGF(Y
> zuj8FzMH{m<aWOy2_R~#?ZfvQrjb52(qi<mBuJd}thQb$M9r)0{;iPm*%0jG%WULdg
> z_hJp?IhBa5wt8R<P3GQw`jn_Xs6i7)f1cF`T$CeSEA*sSHecvG%J>`9Dn91lw>nG=
> zg=- at g2bB4jL$B at u8Me%_HHfXnoOBVsswFD_p*4Y~19GB@$ni0Lm}inPAF1Ipe?$1F
> ztFXtte+>tJnD=Ms!>?|5Y+}Y3Ow4!v>lnGRmfO*Pjk$$!dK<>~H;3e0_;OU+RN at -=
> ziByx=BFqEjAaq)}8rJ=aP#06l%%$s~Kgh<swa>_RLkxEszS#OuuQ+i5`R at Hj$f+*?
> zGcaj#ZJZnZ6Y}keMXV8UN1TSvqdGR4HR|lXT(MqR5%%%PVhh(&&cL=YH?|+7YCDa?
> z_%$Lc at 1c_Zf~*YQLa7Tl!d<`*=CT(0bR+)#+Ts7<CmW!fghA}e_Jmn`W2 at OZn=4%j
> z|Ja~18Cjp?yQv(=KU>~plN!cY5o?%}5udEnCxJPy!vC>Qz{UcHM9za(^y}-WLvPYI
> zgz}h^SeIlY7FFnH at 55dp<4?BP*C_6FyPrV!mhF<otYY8gZp|Qb{o6S~O7#)qi;@Vg
> z_qTj3b>qavqNbJ8!4rS*G1aN(-r8a8mhbo- at v@cyvw5S(9si{n`9~7`Ck-1A<XK1P
> zYFdy^L5vr~a%V8s0L#;0kMr{i!64w;(#StxJGC7?r4KFs0dwV7z^Yn#nZRz{u-&rj
> zmP)Y3^Qx8)@tuL=pbz8Cy56a1)2~Cf>xS{D1^ZWH@*<~Mzh~muwbYgmjMSD;<D=)G
> zHze4dG3+6gfM9pX+MO>dd%?cuJA at b~z%G!OHHKv4qz(&%n0>nlpWO|Qqnb1aVewRl
> ze--m_{3F3JutdM*(&MAA71hPt6#O1DDTk=u at S;)P at 2wIb9yrQuuLrb8*k~+}Es87(
> z=tXCOL(stmbEnHs at KHz-N&dCk%4fjo2)o8J at TP35Tk_;hhkVW067xdIL-Q$#n>mVV
> ztZg3~(g?o|N&C2v>qx0~2h`Uj;`hr=1cvwijO*`D{=Z>(D|h>gO~CLPf#I#&t-!h=
> zz#dQO2+CT9y4PUsRGLB7`g8CsC!~aTYm9>%t{t*THr_$HA6u%zvwnXA1-rpZz%4pp
> z<6++sZKvKoF8siJMIQ-Uwx|SH*$eQ0rftbB<8FGk<Tsz>MRC-w>jeq4A at w`N?|qN1
> z=v?Ohg%137c<vs1yLi6G!cchcSn~Xd!3`AR06B_vHW|)=gBkhK<H2Q&^gyhZK76<)
> zvKHk5kDRMI^*h8{n}%{2T~@Xe4zU;hJEoGnSX12)h at K#h3acP?GP1t1zjGAybM;dj
> z%Y-33v?rlp0({Ax#dZD8r}CoUr_-!+S&4qRk_&cO*)8$-f{dF+H<v#9y)U>KQI-^f
> zrMWprsU~_##hI=Q__L(sSRKo`;6lr~@VF%O8`8cH1K%CG=LO*RuaI^BB3<h57 at Jqc
> z*f?rPRx>8hYh>_EMtqKyObK0wcGwcDKuiMrI-VB;{ke_k9!S3u4#bdgZw at m&?ls)Q
> zTs(&G=;8l+Zff9mVI3?-oc3Gvk7R8h8wCCuXXrQLc^lF9Z!zJ}vx-8lW1Ks at n_7Gr
> zaUw!JTV2*cUOcJ}hY$LVSx0TI`p{3efZG`Q6!Kl%-NGyD!Z)@FW%SC}y=<K at Jf;wK
> zk~DI!>^l!j?0(w91r=7W3&(nD=Ks*A+%lBR`eVeGN5uG_ at 0|lLzQH^z7j_{sKfx|U
> z^yQ5!g(jhAb=V2F at n?0OglovXv`i#E3$CF`p#<j at juy;=cDoMx>igggtkcPG47*g+
> z4A>o4VvMLRKF{PL=Bf%DZ2>WNG$!at at -gO?I?zN%ZLQ`lMfpte;W0VD^g1w$SaHw#
> z_`XuPwy_hjAs+p!ur(esG4)`V8NODlskyrlFP%Mwc`F!k6M(1dG;!}5f>e^7Wz?bp
> zDt0Mb1YVHf-+g0i;~=MT6O_-8&j8<~Cgy8x at y`-NiFKaR+WS3Xy8u at Q&V3Hob-2En
> znVxtNn7V3)VCwu0#h9yrsk66B3!{iBEt7YEb3klSF9q&z6L^{e=#TK<TA6U^Z;6S(
> ze#3W0xgC5F(37fx|Mi!7XrT*KK<~SPbC*66p6fDm)=ncQ?L%Cd&SK14rQrAn#~aG%
> z0bL?6og^Rl{jbSfI<hg|eT6kwsi at w8N^K$kL?8NlMN4_(BCG-Uz<};TUGu^9JUXJ0
> zlNFkK!{^sk%E5`8AQh1HxElPocH9+%e|r;La0n;JQ2KDg at 6c_<((Bqt3^yMKzIqjV
> z(re9c=I-7ZWj5*1yxcp5eqxJKLZ7!W4>1x>7sMxCZhH=M>@P9kgpzVMKZ~s8ragWY
> zeC<zxt0ZyW!i!fEdx}2%yXc{`I0~uTeD>}PZI4l;?fF$czwmA$|Mp!0`z`0I?YS?X
> zpMSu at dyz_bYP?&(-*;E5eYR1~-r>ZrNU1g2N@~p$BeR&UOiM at pdD^=%a-;zh{h286
> z974}Ug(n-aUzT<q_XKJW{UV>_*M5Kg+?2WVz0$AG_ol`s8TZwM#N91%uez&qUUK)m
> z_5kt(F=JT+6UA0gV?8RfO2F9~#a5={8O%I#9cjQM3VBM0%5dL^{jxMIdjLL@$3K=&
> zmIP1c#R#2$dnaFZ4(()${JIC~G$i8mUMe!U;i*2n>PHtoYzur+7iT^lu8V(=l=lv?
> zBVqpEBa)nb4tm9P7_*>@3cD=xoP)S8 at Mn3$Y)<fwFa^(L&FRVBB}9+Cx`NDwv-cCd
> zGVF#6R!)z|k$JjTUY{10_P^+&D~EN_H5!&+roclYshk4+seP`t@@M1|-?mRz6<e6o
> zVGRofr6XIyTZ_CugI}8vX)01rq-jV4knTnrh;$G7b1veOUB;XOIdEavo1YNduELXj
> zCUZ`&T<8S-EA+&54w$E)qweJq3|35O%f7I^Inwd4^VZk&s=(=eIBf62d8MPU_WP<a
> z8F{hR|6?b?a6$g}1b$Q)x<4_F_;h^rW6Mayk9Z83CK~$e0<38Qu%?-SG*Ap%3Z1ji
> zrSye`<4T`He4-Z@#+8o5J%9Y4_q1BPcawXN?lBZ|D(p{G0=r57R*;|%rC>AFgwgFb
> zBij6H!1>%Deu0=bs#_0vA8tMF{i!n77Oc(f-3DE&#6=A`P at T#Uop9 at SH~!#df)^Gx
> z9Q- at UoGPQdu%yy=Ik0(B?xLj7>^#pWoAAI2B=^WV>E}A{h at 9%Vr;LmQ@!>r2Kd)bM
> zCHjxb9e>*kzCF?yRA?R{g5CwX at SAS{^APyvC%VzFFJKHRcrV&4lcZN%te%0mmE^iU
> z^eJ at t<Q>pgyOjl-FU170dKKThMkk#<{0zdIG^2t!2hJtfZiQ2nmE1&d>RDTF-1vj=
> zxDr36MRLfRHCPV~Xjq&J!?|S<uHc=k!`Pl={|3=LeX3;W+OV%A;>E?R)4cq*?Pt+H
> zhhh}ZueiHi`|MZwvbwwT=J!(x9~-|@%rCwBk^P+UZs7dK_H#1U#`&@jImA)^RSw->
> z0FLM3SUh|jh+}^o`wbrpaSR_Z^zrja^1c$_LQaSz`<A0GHN)4ig0lh(P+e#Kh=0fI
> zFL^h~8g<7~Npv16 at Wj=Rr~&uNh>*C at TK}!HMtRBUYGAv at +T{^d$N|UzpSHgQ*<>{4
> z2XW$|3^RSKL7^N>sg0QmeZw at b12ooR5zfH9;5>Ma8TYF=KRY8BZSt^_fwbieU+in0
> zDzWdD2+TcFSEL0<-H{d{orYA4)ERuxS{?YdQ<jqZ-7n$XsFa1|e)nMPyQS1&Kil0G
> z`|c^l*w1mFL+(Sl>x>?e)tIkrDdUSRst=tiaGswbLZ0KD;Acg80_hB-N017TW+HtR
> zX;$1)-5mFRl0OAFHSgo at zhQrB%6lZQdk6L>rK}<Oz(F7f?zp~q7vpMw7vb4IhwnXY
> z|6Yy#dnekz_Y3>?zB2s1FaKYReSch2)&IX%qUI)9{umBKL>yC*F$K0Uz`+|q at kd4l
> zrsz9o+z3s{esD!pBos_dm?jE{KOjT~GJb8BG0?1#638-PDb6BXrTHTxc9rS(dG4rp
> zeZHU1_w)T at k8|#ioqNx@=XK8O=kqn#U;bc!d8EHuCoAMf=nkYL*CN{2fZqLaJZJED
> zKaK-&958r%0LQ=-qP+)?Kf>`098VuSCh-G4IG#CpoP}dw9M2j&&gSjH{UycJnlOT0
> zjD9&sRz`(NWMz{$AB+q#@A(O!Blzh$)-JMU*}K3Or&NXw^z^r<_#;NzX`BK4;x<Xk
> zn<lI;W3j#nvAzh1eS+BZu<lHd$g+#gJas&1G#RqQcVAsV|4OjV6v5AwtT+3B2Qox2
> zpi|uQLuEY;9<m>><^V4~?U*SowAr*dO7R$N^U(HlX#1J>gRtK00><X$$ZWK^;jcE4
> z6KU4L!8Wr{j-mEvyn+5X+C&`4-`adz at tA9;0P9!&l}EGkuH2qgiZ%zhHs2*}VoW at c
> zzr+<f-2*7yQSN7-C2OLUTND2k4nK2$j%Pgv8ehV0rM at G)DtP1Izz5bU*hB5$XUVll
> z_7#V{?=th>u9vYHa at Y$(g|V3_#4d}RXNx#n?X-y4h3~<Z7$4+4ypHHw$R5Id2N~MQ
> z!FwOUdlz!LXV`HuF1hH#D_kG`r?H-du@<xc9P9o6>sSx at U&s33e;Molw286CcbkIo
> z{&TF4%)<USHsF65>oNK!dac?<VlN$IJGl3J;TU7giKj8YhCwc9kh`q^1$#K`beydY
> z_D^CbjQS*Y7WS3NKYkoLE5?Q7$csb?8;Q}J%I!gq9Qy}shGyu0LV$DAB5cYufOi`P
> z9)zaiBVJngUKYd8L0-O#HUY<TAZ`@;p?KIp3lK8}96+uu$&yEDGhy#0yh)I{sR=UL
> zpP1m99_(>`MECReePn!N#vAD05PoJ`2=?<a{PYeyAF_4TpY{X0SsmO at FW#M$YW+4z
> zXub5+7mF8zH^{pe3Oj-uwI6nbhs2NmPdfs;irD;Ih at JTwFknw`w!1*;Fxfl5H}gN?
> zFtedYy1Q>;r6cD4Mj`wq4zOn8cg4?X-sqi^j@&EYtLipw;lHa(jmZyHg0~9r&A^;K
> z*A{Y2%k9a?i6`k`-}vwH-RTznxksP5@#h|$iQJ_r(-0FPNMLF_BH<HIUeEXt{Qn!J
> zjCk;Q0mlqn+kWQq%kyF$?(|)1B>WszARI?{`9p4QP3YHc5ASuaYHHmWNB#A3)D5Wr
> z44Kgvb)%!c#tZd^!TN`&>j&$-sFU%*{cDz^PGU<?fAwe7YX<AzYHA7piTpu9h?fje
> z8-dXVpQM%w_G)GLr*6<~6WpY@)-RV$<vl-O<9yg2+Fo9LJlF<X!;RI4;J>mPxzh+<
> z!a>N+N8oEpV#|&(Laf139>tC;shA%<twAhHD1jW>Nc3UQkCzg@<6pO>)v(P}bFu%y
> z{d`*AA55PF4m%eMK77-F!*Av-HUK_A%Yd0b74PA-`s%%F8zO8quEzYw&Y5foa^(p`
> zyUDZr<(Q*m;oCI}SP04<;07RvV9N8Cn29lZ=n0R2CjkBcY><8whd~f=(!C*Lj<kwR
> zA^M{$bJ!H$`b0hOX-X;PL5o{WD@|G02L7{&_8W`1SpK^t{sDe8laZs at yQQ-`xV(@F
> zOg82I0Ndkv{xX9YGUR0BpYl^5 at 03dQh#e~=zDK|+lG;VUr$@deV9AdHe`4yEA at 4;<
> zxCy=h at LPbqrocG6P-(Cu`)k(ooQVEm$7T3-OyT7q4-+uQ(WjZb{kdbUg%4+Ay`R}@
> zVlShd)nj5`U$WO2j52XawpOutKJ*{176bCpoQG~IQdro<9xJ3<ke5Ra3~$-6-*O<Y
> zcbAnNp%={y4HW=)?aRDIvCB`uT6C^6H>o>`&KfbnzBMbXh4h at EeK~O`{f9ozS%WeF
> z<-dFP&=PvGSL;t6`;_jdyUToj+a$Bril51wH+ZhD`;?CjF}Y>Xbr<HOL<ZTbOA3F6
> z4wIdz^1-=9IitgBy}sx-<vbl8=+%mH{ETMf*tz#_ub*=G+It&*X at sp5_-D!atDKwb
> z1SKVDuE0)E_<RhXBvV8!Rj8Y++5;Q`26};FU at 66GJ|p}8`o`Smbq$9Eqw6uIZbYY!
> zy#}Sw4LqwG?9^_VFC=uca%yw3H|8R+Uo5nWm)oU!jJz)g<nr&C>_%0VWwC0cW<B3K
> z+oakBKCmQr2lzk_{sh!ZF}Lf%OX!iO8hSa*@j<?Y=%{e52KN*qPOz3)t~Lz_ at IOUD
> z?Lf}z!1Py~9})XrTQt=fG$OVgy7cPK$<{{jH3PJFX>*D)x)|pwY1(>PuDHQ`I|bKf
> z&Od>3Cp$%`&+2bvB`AGS`o+S3K~TYV`IdqoX=a}#G#37LclEGG?8H(nFqCWab){vW
> zdBXR6#?&UGVm0j6<Xxmg>|L#f8)Fljfsba4 at G4*oLGaaZDQl;9Al_2JJ5A#HFs{gD
> z*lp3Cbz21)g at -;h4^*#q1y&Bhe<{pIJ`?CK1-a8JP2s)?g}R`OCfW`B5%Nq2$zt0r
> zA;1w*_!#aeePO#o%!&dsgPiIQ62!K5&QhK75m=jRf|D5?Y*>iXY=(}nk$tPAur+%A
> zsod%CE%a4YK#yNSo`tfQR&qEmkID0a)%SklPu5+jN{V2TC9={IQ)@I;Xo0+(>I;5N
> zfO7H#1~{tEWe2Z%7HuG=z8Cp4NKAdN9wp*`dh5Z5*5LoEP*$T{+3g2fx)H8NeYGV3
> zZHQIXxbHM#-w}5YSr>TaD9hR)BV!FiJaDhp6TB8M at lN-<8euEcBR524bk3<IAL1F!
> zt=iH?S^!-R<PxVJ;CC?w_$4j=Hk}0TsNiCon-Ra-3ws-RX9LTRZG2F(Dir-Uu)H`w
> z7V*NGRP6Cz&oy~{VO at mrK4WIw>vBTeb79NU1q!X_%?-!)fUXxh$@RPckPZ9#L5s5?
> zT>#s$zYmFr*BO at +y7lVrZcaof_RTXnY8-omo`Jbei-$hSNkTat<$EY+V7(AH_nS at X
> zZyfZm`V~GNi*jhy+WuujKgk&uzSgVtJyXum at H<}TQS!rXdwoHvaz=*z%$4J;x3E_5
> zbH<?bN9i`R*&u{&M4J3YgA3kicJg$i7twKGEL;he%eA$L`zyDM0G5%`+D3a2nUp`5
> z at b&lPJjMOc;f4DUXPlYm2EP$E;)|n0-l<yXD=ykns798(gS_>KH}+NySh9KXmQDI8
> z>@%f}Tb0nY^N}ZcH~$w+#e^UW$x}ZSIph(q4Eofg{aTK813|m9agEppNX`fsLd$&L
> zK^i`?t`s!<F6_0xul^?eb?1yALG&THa=q!^7NYN&p9bAeMJJ2;bkMK3^uxE6(VKCu
> z4D?$mfBF~Z+XuKd3)g(eHI$PvF1|!=joxxesmJ;WTK1S<3i>YX^hDir{xQ^#b$Z1z
> zpzQ{>3woHl?oVnTkaxfw at rKPf1Y-riVO51RBI7&oW!w14123;`1YH<0=Z*~0<rvf}
> zBr;1s)`upyAmA9{I_p<r`ZgN+RVhcC#yd(i%P7?YpuNYAYe{vT4XUR9mNt`13cro+
> zZ=`3F_kdlQ&?m4e$TLwE!zM&<m<W9uIr=nMcXdAndb&l`2Faq^Eh)fC^~L%iL^*l9
> z0r-#4WreJK7WW^+{YI2WQ8oadtD4|@;~24Zpji=x_&d<7h(g?5Z at q=a{{zAYaF4os
> z6Y!L+;g3*{7YnR)-AX*qOz_fFi5A4~r;2g!bl`tW`j4dgnM`RRiHE!pdx!oO0JkT)
> zXa`59#@3_ZXXSEhVUl-VqMe2u5B{rc0rp*zw>%`NQS<wnFwp6*oGd8pH_-gpX85y(
> zk}-z9Is5ZkN{{@NkFe)1^*a9({HvS~d7XdVl;Z-unjCSw$oqotHqIuPT*`P<n&ys&
> z4`LAJvMpwRzcBgtqKTt{^O1nK$QuhZWAS~)!{53U`f(eX_rSZbsq5j7XQA^blQ=jp
> ztVrbi$B#NSht+du$S^%}<L$OYA;v0N<(xarQvIW!rR+zNw=W}UMc;tv1ub8lHt@=7
> zrK)iY_7DCYo6S;vUCtke`L&An5`Ekr*9X5M4)e)PlN^2~$=mue9eSe%7#r1Tv#66;
> zN5&%`?)&mtJ-VIi;j^LPFggW&Z1SFb>FC$tUpohT?JDfCtGW?i_O8rX2Yu!^W_Gwi
> z^M<G%Hu5T6DDlS{?2p4|zTh8xPB-#+jm3Yw$$zML{Txv}e3B}GqqFbUSc=Sx=HiJ|
> z8f>kumK5aQJMa9Ph33jXEDiLnqT$XD%q%btu@>%t9>2e3SnfWjaJJvYxaf}-=l8D$
> z8<)I$$Qd}3R$b8u=iMl4iY7YmLs^Y-KgtS}dBMo1v2(?+Bl`sKnetEm#W0Ph$e%d+
> zDB<}upQ$>?x&+?hlw~A*&Lo`8H`o%T+HFsn<d3!NUt}%QNgX*AGhi#R`{U;a-VU~q
> z%or8P{gRD5U)3yMrAPe(%N&)&a=)|@`02~D>s8g3dj2oqBTkUL#*rHXJch_>LhKLp
> z5Gcudg`6?KYO7{9q4Y<YiZTG@=A>LMe_Wd4ajQSR|4W>WFBbE3AUAs!q4z_e_X5oS
> zBJe!}jy(%=eDtL89imBN5Ht2CU(mqu1xo0MrYQ>Wf0mgY+q5k|*08NWU(Ke)+FEtU
> z5m^skgdM97<qC*Bdrd%Y9O!%WutN9-@$sLm+#eDGY<VSVOQZ1&UZrVCPy*uiGn#C{
> zIOg{?zz&b|{SCA)uX{j_ax!@rlpg&GT7;j_+5r6xa*-qy=El*=L?QP5Mrs$<5%|6I
> zp29OeKv|L<09@|z<Xy at BjZ%d2JG4cUH2`G_${8p(p_HObMM>7N%_x0hj${2uL at fV@
> zSYxts$6`(S2LJyWYc22<fE5aSL2|FCqBRvblEB|B-W2;g#<_{U3cQ6N>-^R<at~F*
> zj#WRDw9Khy{E6<K2OLEz8 at yCKc&Wn at +1Eq0XL#L^jjGwFO3E)rBaV_sWQF;Goqp&u
> z!EjBr{=kk7HGsc3Lh#t^K}*pl=D`GNVB3eh?mjuM5bMx=tTQhU(!h5X7QUP3ov&R}
> z&{shNKbUEb&tC)@D0r`B*l+vZ1P!<v7xhIr- at +W%_qz<;p7VD2!$G=u(7iRW0DJtr
> zoK2YTV))EBp`4EL36wJu3yR!1nkmEoa&t!DoX^lbkgqD}S-9sJ(1z>i!-O{2p#Mq_
> z_})VB=w}Fz?n^L7PJ-V&N%nSp*D|sX at 2nl(yl)P2_W358bP@;6aP$IN0nZ+s`65Rz
> znH;?g<>+PSKj=mO7rhj6JX#?27^NO`Q>$4Ix|vAm1aW?|Ihs0xYgM4RK9qz<2WB8u
> zjj|tQ1<F5Ak{nI<P at YD47iA^N`+Yn&yEu^g4d1;6`!dVz%V#hrHt={=A<2y06 at KTi
> zLE9&S7un$0WAN>Ff`2{@`;RHyV}cUL_wns(T9uWipbN2(0ZSrDo2^@710}NJ7h#ir
> za=?}E8Ju?``#}xb4g at Vd!O_wd{P+ET(9)1f)1ub~X~_-u4jrVWA%vF5e+eytC%`)-
> zhFXh(fq9$`wQ~EjO+c>yx3sjAqou$>S`vT;dT=kHnE=q##6j8;q9pw42An6fm5h?m
> z)LSSCO>IO;_}h0tN4HQXI at 6&zew)x0j_08ME=tfHp*hf-gVx^r8?C(yTHE{=t at Zzd
> z*0%gbYY!wX0Y5ru4LFeSbpWjqT)Bh5Tr+CP_X&iK3%32BSxee!ck3y!cS1>L_550l
> z$uacx5lvA$j|ImV?LzEnGu2HU0aOm_2f9RD{$3UNKlc8Q;ZySjc<@WYF8KZpb<iDT
> z>UrvTTU^2eI+!wPZX*^?0NZtx9=2Ql;y+~-$R|X$H{kd<v#N*a&rS4sUrVb3Io!Ex
> zKf;f8X>D+nmCaTtSkJj9D6YLMU_FgkN%D!+bJ$9gF|RyIk;m<wJ(!QBSi6brfjk(%
> zJLY&=<Y>d5aTEM&D%lT2Nd>sB!+pmRBdIc6D}?ST4JFRs*sM7PI~mC at CVZ!k;CbWx
> zA>3aAAN)kr^IC%}g`54b?uaPh`?Yj#%f%Sfl}(~0 at H6d(PiHsw@@~^-!E>y?v2Jel
> zw_IXv8Jl9akUV3WgBYuBVSz=$w_E)9Q#l>R3h+{s`7h(U5FHWZD69T2eMtzXFFAhs
> z-h6%Ta_E|f-beP$yPW>QvCsbjAg6_Y$ebTsQ*vwEBl9M#Jt^P~1F-)KoOh&R5AT20
> zxaji^=d85Xt#xb~v1McJ8t%NWXI*k1)~JX~0qjvW{xHaArUfrkc8>qb3*W8ThU0qQ
> z$nKHAo}3)M8~U1fCKx<e*}RTp)76D!KgYfv+Z3S623DSLeu{IwL!ZF;YrAFmAa*Yl
> zKj;`T<DpZKQHT>mF8ge5&1tfXnh?^vFqX+k`7Mm~Q#{7HSBCFek(-Bg&`0qD>e}39
> z$Q{1?rTGHn{M7jxxiK?}DlpC_e1p1tx$}bWqp*%m9$%|MzAWN1uD!6jz?QPw-R8HN
> ztPgehe)#WF&}k5FCHy8Z*5BSk+#-1Y1RLbrrf>QDmlKi4FxwBf5iJ%|8f0Z|za at FM
> zJ)mzB^}k6Ad2Y64ih(RY-V=A1k+?iJd%sJ6<-?)<ZnSfFHvB{rNn0piCi4`Sq+}0<
> zZ2VerHt@$E`r!GH4IYy9LJWKA#aLDxl)zwbG-7Y;leBm%L34HfYehA%7Z5zJQ}A=~
> zNo=x86OEur<7<y{>+Y|lW&Cs4=VpMXjI;X-<1$wuZc9Wp{Y85*$mf-kaK$#s3LPr;
> z=^zg8^+s+Te117O1b*_sQvyHT+lpA%?ja-&N8Q)~Om2EJ@#Qvs8+^5=ob~~xn|DlO
> znt<xSoIHuS4}I at z1iSbs${H@`ATZBRuS%K#*`MS-bmSRy<T;!?m}Ag`%Q5K4**8UR
> zVCB6P>@8r*c at lfsJAJJROT~*MFX2?G0pGI;G<8wZ0>jFSQaAVv)xmFY8F=Sq;1QR3
> zK7T?-zegSAau04+-*0_T!{r_X- at A<Xg%Y~5!?p~%hQFYo72mj2^Tg`oHh0%6nr}!x
> zL(E?>KOTEcZTB$D>EM2!L7nPob_)5A-%;%){>$)xDPI?F)e+xCvVRj at WH<2VKxaFc
> zr-&@T^MEgH418%B%YtcHsJ}q`YAp*8Pd~w`O??JB)G7R%cuu|LX<|#THm3TC3bYe_
> zk&E2-IPNRKIc=(B+9|E)EXcUMwc0tRlGGWT50g>zCjR3ut*w&sZ!#g$TJ)dOe-b_!
> z-#r-g6r8!d{w;O`wb>>BJ#7H31mwL6du)x<cGceAg(x#%n+nJq3jdr++D}FNm1`|;
> z5t;vfjZ-Tp)7LoN)z>&}123$%o^ZNL#T%w29fmJ&gN^z)%r5^e-04fiSq9|2lP_?t
> z|9&KNApSiyPG4FI(||v4XM=Qc+O)jI68R^kY}cCD`c1txPCr79OA&1&x>#Er<lTV0
> z;q<gTC*6qtle8Ds-)H(OQ!bn8QfI~>Uc_2lHHXA at S&I>8-A4OzIY=syt4M1nx~eho
> z!EkZ^6ngOR$_-c-gQ;B at PsoD3%_u=1y_t-pvhmezQbVGT^+e)~8!x0{41f(=zHT9<
> zV?*o1oqi&*vFKk6#_ONo at ia37e43Z3WJj>712F_OnBylPvs780PObsItx+p+Lr!?e
> zmj)u6adFH8HnMhAkv!}wz2^7WM$G$W%(Fyb?(QM-8E}<zNZ&D!jhao#_Y6}BHYmZP
> zyb*)<Jpf&P1 at b~w&>r~yO3XbEE3hpq!#>?jY(2dn5gV!GbHB0V|99S<W`s_>iJb;}
> zUMDYyo0AoolYSf)R at jd1q)*`{mgSEF-WT38+>RKQx#an|#n#=a&(J?YW}6S6>O$z^
> z+x+81^|ZLRu1d*|0G?zS>a|*b_^{0{?`DvvCDm^hqd9~58%pNoEQ97v-zLImlKGY?
> zSIx29RrSkV-ehtwVQ=wq^gVqt{Dy%Iv at 8l(*b49lA at 0SX8Rh?UKgMbtXc94_Ef<K)
> z3f>+28FJW={|tT~MhTt23_5?z`R)<!dl^YM at FIJMVC*<M0LS}Iq~aa&G5A>Er=#6f
> zXt#oePgkp){}Ai2sTJ{~sW}rGFFrY;`QlR(nl285&fqYxv~1xf*bA6$8FU`dtzz6r
> z`wHN|BA+1losm;eRcA>qt=OzYKk=SuKMw6T<c=lS*1d>%7a7+rCv%L`K^hSQ>abS;
> zXT&jQNFIm(tBn`XMin<t1fp8P+p#m at n=y;5J1_QQ3|uo^-R`kw*qQ{fjhZdcH!D4w
> zukKdckz3r*O26|C?8c!Pepr`7fZbRiY({(r;w2_D4)S)!ZrRZ0eP{6w4ZtgI5MH&U
> zsMCm!68~?=@qwO&V2YKBPLpHH5N<t8WBj at CCi_hx(~h}r#=JLUT+G51xp|6#v at GjM
> z?8jNQ^QEpfCE1I^vgN04$SuUD&1QW>ONnlNL!(?P0?rGUpI5`aQ2IDtsjzeRd?ZSO
> z58xu^E^i&$wA%zkhXEgcPG_y&oV#=B+rV<DAo1MLslavsUCQzv9oC2Oh^0LZ9OUu1
> z_Y}Ut9A;)rgMB#o(dqcjh=DHZKRJ!t at GY>GRN$wDK8UpmKvUR{Ed&SBF-JayzV8S*
> zH$Y_8KletPsCW=3qA153c-czc at 0w%$3HB6z at _+L2VxG1LCJ~!l>?-Lh?CT`|a<*fg
> z5z?6>A>-kj;hq$>%T!ByIi8L0(!}vdgs)4np6VVTImv(%KCX24O{JorjIRdqt!*;&
> zXR5RgbkPN#=M?w-iEcYvIAGC{eXX=`!#~!XF|T4S6%VdCC%c28w-Si74xJFU_uVD<
> z39(|{DDdpii at N<*EF?N4_)pHd-$l;>EwI9?bR7Jfy3n_d?sshl#N7l~Lu@|$5VQsP
> zj>FdY6xe+x!xrR$2Jbqs4EKz4%p3T!-ENa5Hs6sCZOUm2JMaHy-ePXP{A4|u{tjZ6
> zW?3KF&MWL}NPh at Dr82BM3UfyQzuJ84BOwV3bv^1LjAz)+=9v8ciA2xmT+bb!$20t~
> z{{@q^;S0V*cJjsU5y&Ml&_9~?l%};cmo)Qdiw*~m7-<@uZ+mujDC~p&Rb3w5tNr00
> z;K+Asj%f(;*3=ukty~Uix!>UUj{q*{Yk%gD7Olj*G{sJ8IU3==;GjLv|1 at jU6a1YD
> zr><GGu%EgE7mfJF?*WYl_Z`~st+tcUd29YMuPa9{J*##r55Tn%h-(b#-NTB at _t1U>
> zuSZ|Oz7EVA#H_H;bunv&x4>hAcSx|O!Oq&v1O0S?AK40Cca|DB at U3Iuqm!kZI!yyT
> zK)KzISNTA<GWXp0q{jS-rG=kO;e9D@{b7N9Su*_Dt{j4W+6p`O71n`ozt%7V>u at yI
> zLtps)iBZmqX~=Gjd_Nn=pxI68!dCfsi6)ioGt?f$Cg2_px0+xjpGZ_D#NhWr=Fh^l
> z#P1dJcouZFS;P*Dx`YV=&p(daLpS4C#)QTc!iRF;;{3?wi%;V`@F#6FxBnTqy<Y&k
> zvS0$Chp(|#K0?g*<E9jKW15yaDV|}?#xv7_9gRMhUn6 at xP2%&%ix at FtwTjcq+-by3
> z0Y|ttcgC7IXC^Gu^vQ?i%j1 at p<}L<qh%@>h2Or;MR0taaACT3Eg;_~GDBeN^X at j}B
> zf6rbzm`CuL6MMeN#oUkyH)B89%xo57kG#<!j<X(vt^1%hSl^9j`OwcH&Q46Nz`n4X
> zygxG at Iim%y9f1FQ4RXShy|7*zjC}NS2tS7W(^hE%`~VE80!j^iq22Q&Y+XlhoW{NN
> z-6J*)++OP6bSX-hW_OKl%e3Ktq0xNAKc(4a(HMJDk~k)^9%KIB;Cy>L!IRh0A5ewJ
> zcR$x41%Kcb{v`Br706Wwzb@&?Hg~cIm+ro+R0YaMu461UrP|+=OU`%CBiAv9#?ERo
> z&s);kui!AtzQlU|QChjxfZT=^jB;iZ{O~T~T#k;c;iE)d_KB2n7vug3on+0ir9`&w
> zl213#sn)%6 at Aq~Eet`eNjvG2*f=TRR4cplS{6z`kR+Z1^1Ft-nCGjKAiE0QR?SE3F
> zEm|?U=5VTWotEH8O3QtaBQi at K67#T+UiwfwJJPw2UgE3`jojTQU$Wct-#02Smc1!{
> zxNk~iHqK?^c}BFu`17r$xBW;yIQM2?oI3JOkAZK<D8vl|lQh$;Kg7zHjKp(edOe^U
> z36#E=Y4(L3K-g{XN+ at 7$s|Unc)@-rOYPb8r-}e*IHTYj3PlUBh=N-8hI+Y64Ps4_J
> z$PRob#Op+$UWs4XzaIW19FVP^H1GiO|IFUo^o-JQ<b$m{rtDuyzb&m#ylK6sm4q^o
> z#qI&$WfJ{1bqsWR7yr#O1SQoWhaYnXalbU5!y*5GeNJ7=zFiqU`wP<Euw(mz)*ZuK
> zAu+*a<b4QEiH=~)%=8^^9+lL1aTMy)lSn?!)7ry?Holz3v<`c5U%E6VvrE`*Gf<5-
> zd4ff=kJyv3KX*CS66PF<oto&x+Ir5 at KEC@<p9Y#+1pP6gv)#z+fLtF-^DoX{(t+a~
> z<bu`W+OFKiWR2}<V#mWTKZrtZzn)!WUBKRoculqGA~4bE at k_pBlzNm38}_C)y8tQK
> zs{6}Wul`EgWfGUF9`KL at YcI&U&)$f&Wrp?soj;(T{lI$g;;6nyH0;Fm+x<uAcc3?e
> z%uCO}Z)Sfb&BJ-;nN65W>FG;QAIhH#?C9y+pDAV8${Js~1 at 9L0c7fdw*abXZWxn6)
> z?i`7_7VBen?u=4~mGfR=L#U6^w^?P#PhQJD!>bHV5roM%onbV)OS4~8{z?D9?j^F+
> zY{<gSD3$J4v<mm$^aN>B`ZD(}xeWPvh;AD{9paft-5y7UIM&wn5$u-84~n-SH-jsg
> z59sgHVbG~tHG{be4`>c3zSpkCcud21bYi^5VUK#Qxq?=pkK>R}WFgUif<6P)MY<rI
> zbH+CoqrXGmsY7m#O5kp%lJ(H;2W<V%EB}pebs%*VmGFS{fBN7%ORP-~{dy|d32Vae
> z?#7+SrM+`1>T_^jg7f3ogar$FR_)we(s<8xP1s<c_M%UF2m7>laG%^y=!gc56a3&z
> z$SRq at 4byxkI-K!LX*YWt<2!@eeLD-|9pYSvv9DxD at +x~qY#=d4X)OH4K`(!#CQ+4$
> zjop3K>CZ9dc at xZfaS)|3&*Nuj=8<>{k|VBN!~}&Shdu8+;j0nnZ`u)p827+oh5Lfd
> z#x;l=g58?XE^OZ5$zj)mtZYgRRdw_Wp~DK0*1_IaK|hy#uc`yQc^*Fp>)c0o5~f93
> z7C?XH>Kxrf`0YH<LZ0v{;hTX0Q0Tyr<T+WM0RKjOgnog3jRzm0H;8;fuvJP6 at 6CbB
> zy}YN{C)*mP^Q&n at 9DLoKO0~fV|1S7jG at -wYBjy=<kuSbi8ugI_Z|K at Be1CR1;uR6Q
> ztW6uep4c&9)3vfVpAB8tpZbD3gYSs^zJyocWDCd|geM0-Cs+IcjC)|}4Zfo#fyiiI
> zXpWT4qMsn|itjRxA411cz(Y&iEMNIpcRLGyIg_xz$*x`Sl;!F1J@(r-QCC>ln!=_^
> zPne%Dnc`*xTPL8ui>*MsR3+6=>>_38b(D8$2>2kGv92Rjs at FVr?3wppr25$x2 at U{N
> z3;qWfHt-XW at vWLSRG+doRi<V&f1D+3?vC$knT07b=W5HRsv-HWApeSRbnU&=b%zd3
> z9Bt5tz<&k4L!AE*{E0F*p$!9X8)PQNvI%-wsp=7QQ}ve3sLxT^P_MFVQ8jS>1);G-
> zu1Z17Z4cx%1~Ne*vyS90fc-ZKJgXEu$3EmenuG5)o1fnE+xnu!QC3%swVPJKUykt}
> z2RXSacY2!go*ZjTKEBgo=+;6}9sw=x<G;_{6J(uoXO`%I-31um$b&JrX#%h#5yLFA
> zY=CbGITw9Yl$LqhMjaLhS>0flps^>q*ir&(fSXYTU9_2Xr}}aKL-4LHxMw2#{!N(=
> zFz=A}1-hX-4*7d9?}E%a4mqKlh}_KCHD6KLp*LtOruf&e?lwdIsA&b>!H%n#m&5SB
> zA^ba7ukVrX4Ziz#dM8x_Sz(Ijwi_89z$H&a9e9y<@ZI;@WEA{*;olHtGC7F}R!a}b
> zEdpH%^()@5E1MbLNUn#Oq!nh+Qk*w8ALN)1t(XtMTtZG~_;7cGK(_b}JaI+&&-2bW
> z=0jh?#FK0 at e^c=m=@R$B=W4%2tTyb{M9%<QwWCjv%b{y4v~YdmIYBmShW`ZvJ>yP}
> z-oEj at 2f5@9bRjm<C&K>`8o~NG1^YIm*&}V%d}4hT->H%=wLYRt5kEPu`7zc^)Tx88
> z^#j+-GTIi0zCwmsjQluGE|EKd#|1n(u0Kt5CDz#rZhlwdTY3AhqbeM0_8T9v$yBG^
> z!1cp`el#bhTBqP!tUy12UD36%Z5x#)kyTH?I=DY_OH7h(7Ul}DpxS<p9ARECY+#?V
> z^@C-h>yL1lmcW=h$E-AA-2^5=%cg8*LL+c42C^7}ZFJ at Cqn;CpaThEHW=F?sA>$jt
> z=T_D~hk5&suK^f2Nr+*|u%`gS@)!6?`ca|Vjsgp9+T>%9t?ud&v($DQF-zkJmQ&0+
> zF7Hzu6}$~OL6|wX_EYH~22;#BtVzjQh1*-e&wGUDAx32wBVR%@^60tD?Gc0VzptOz
> zvusZ3qn{vmLr&QYn%oSWNnKmq3Hy$7v`2o!=rS`i%(72Bl-(DYeDltRX*K3ez>_~m
> z`+=^F<{+%gK|`4w;8MV^g2cZ)n)gS{uxk(C&pG!7iN*QZb8ZhQJ3XU*AZ5R&H<!ER
> zA$aLVIuG_lze>~E>*g=pZmIU5Pe}wfx9w;63ocaraMqyOWm$}p;XR3KuVa52^fiL7
> z$P6oTaawi2{tW>>>M+(F^pOw$o_8 at 0Kl3J>l}%8dl}`x8n7*#bTGgCwT-B7_h-<fa
> zG3=OF_{LS5;@YJjWXPr2o|Er{|Koj5{%`Li-Gu)v`^SG4|Cj&#I at pH>_)R&(-g5wX
> z2<h=k_QBFmIP9-s at WmIxH~Qn%g>vnBV_WI?#wG#Qa=u4{DWr7qYktF|u={s&-yOM?
> z+HUg$2`yj at Z$`u}_%PzV1$*I(z8*MW4TzJG0iS9w=F)D&6TL}dmfC(oEJ3JxfNggF
> z0`!!Jaabo`P9X-KT$3Jc4)HX|zkFDmuOGdSJOjG at 1~UJEV_-^gyYls=r?32WX%sgP
> zuaI`q*HUT!*L*syV&n@`{yCpE{c}FC0^%EwJP86>R8cBoTgBj0V59nY=g@=N5b*vI
> z)Z2i!3I83(9CBRSr&M at 4Y``QA`O5LH&EOG`?+f$bP2e%=cC@(E{E0(Ga!EmtH$ZS%
> zB{Ewf10OezK2qEoq0<XHzftH9yM}4n`$JE`=g%#3BDEQD;x{}x64vETBe|ZwHI0#F
> zo1T<Knwn*;CQ8mW{!hO;ncS2i6S`X@#NTstg$22$+V*o8%A=5bs2y{WPwX?2mV at P)
> zhrxfyz<-SQeI9Yw8JUMG!$zzi|5g32SzQ at 6{)W)KRgqLc at _)28 at aCpMw`m!nS`Zc}
> zDkOU1aM60m(jQ&VJWL($b0Jtnv5#@hMDEda^yVVA75qszaw4GJ<wAGd`$gtqqC at 0c
> zbFYXFTNXe^)Fg%NkUWp9uf9!K)7-f=HbpcK^5a}!fg(Q+{LpGtdo2rK6Odc&mPM*;
> z&1ztXVC+WxTj-9p&>c1v_Y5hiD?D$?goOvQPMGM;(3AZeb8|n+wJ7(h<FQx$0sLWp
> z>kRe7^ZLF|SRvwjk>AQ5(2sm&3!;%v=Hm~U%CJ`GA@{#7bi<r`8tcX_8~n7{@Ax_9
> zhc#N(ds-<w3AzapY+UW at Ju!bjPWS6>qFpPak7tP(NxRZnt3-WQT4p$Okhn*nm6H33
> zE+e+_!@9mH>}38U#A71&Rp+nJQ8Z;W0JF?ER=&qXu!Tx0hR&X)4U!f88JqNo#KdIF
> z$2WfvG?v*DjJBhMAsK<f5Q39Q;xC5I7FFW8U$HjC2tp at P{3<^RaiPEz{dYn$;x1SL
> z at kJF(2ERt^qJ#hOJw!vEzII^<cnzyDM?~)|nlZY$-ZN<v>{PXcA7kI5u1H$W?aj0y
> zclqbQEtv$|61gyql>)<TOJ&$AeZK$FUUI7 at zH87?nk*?4(a#=$kJ{s+XPj#+sYCN}
> zW at GJp<g16 at 6wmU-+`V{@Ip7~F at GgiCC%kpn#_6|)4X_64>b_A!5A7R?^?U+V#0Ht{
> zDZwUts#tn3c2aE7om(>x)P%%0u9I79*NLtAbFv=zDoIPYYxO>*=j8Wy(|-50v=n*P
> zCdQj??<Uth>YxM5jqqBaDW2%opp__!wAc@@|CqoN!wzz#>eu$x{8m at +9kY9Wh3{+u
> z+B;^PhI7-PBk-Kk)PHDtt$2jBuq}07Paj=UFwAf1BSTPPL6rpm2?$}*;A4ii3fFmC
> z>({+*t-^dU<)%k6#RA?_<{(8O@>((Wlwt6 at Oo(^;vL}cUO*@e(yRz-q_BA2r{8s7Z
> zE<JC^U+;OEHF-4m(ZoMS)coU^VWGYqR3q*e+GT4(&ep{Hovm9wn~SX+qk4ReDZRE?
> zsba4^ENvf9s_fuHvn^>VBj$Hzs{*_!e~fHzmEw0vOX)`F)Q#zZyr<YLh*S55zoT4n
> z1iDrO;n}uB#>j?DA<vx9T)bJ_obecX)Ewcr^Zuw!1kbD_dm#1^y+tuMN}hd#v5ZPR
> zFW>VTW8syKc%W2$AdgO9EY79v50$EV_PNsb2g+3 at b}M;~y17^=I_4?4`|zxcjK#`E
> zyX?LRIfmWX*ZO_fWolq(#-50s6<dVdC(WoA0oN9ITCs)Nv7pxxobUa<0bp|>J|kz{
> zPRh8~i1*dO$7m{Ya<sTkL?6n}$Rh6*yR2+n7YDm^9(6tOBy|<JU%7U3y^+6lBCvNw
> z_zBRjuUgCTO-oWn3Jb||Z`XP>z&6M|J0ld>F<pdjiA78_kqceFXhIGUE at vS2E3Tbs
> zXvfQZ1$&n<Gf#xvk;ol5_<y?q&zgpx7i5P}%;`L;+XCA~&IA>)S>=#9%6KQ2>BclS
> z0 at ohxsemURv))H;ZN4KD9p(Nb!+Z-wAD<94;eDDj0`a~R)8S`M`XLN<cd<4`q8&Tp
> z_V4DpH4OS!VqX&OX3emB%`R_aLa!YCwGB9MVrf0(FP(oB#bEC}8R4}tD$ScZU5s^%
> zIb$*<_+#z!HJRR2PLL2R`Ruw_V4=dNHAKkE1UA{_0mO3I_^?$X7FNRl6!{T81$M!w
> zb^-Rf3;4AmezN__Ctr6UXYOqLq}1lfdGayeJDE>hwk5r$8E(4FoFkYU!!B~??&`16
> zYx&zfUx<u^Y- at _}-x$s1{9J=Q;5Gb~k?})G;TPxD3%|^?B!P7wd{YnDH=L+Q%>y3M
> zSj78|!CFnQiJrsn+5STMl{LX<s#XS`(Ydi=<c%XZ2%s&{G>3~|F5YUcDcw)%Kc<m-
> z{)?pE>xNuePni{jHiafK*MTP*r8(_Vql3Se`j+&Nq-F8}#s$2=IngoXL_6v!>#aHi
> z``V^ZqI>B9Unn)E!Dq8ru*#I%p(w;0Hx?s)u5}_}9N=@J-c=daG?TmwazxHi*w7yQ
> zghdTl7YxM$T!Y>n{QV6N?>7SxCxMtF67v^}^+?za*$cXiY2lIMqiBD*wV`iAd85;r
> z)po67^#E%I=7LSnXC?YHHlW=6`K7sMz-QJR^Q7vbcd4^);Xk4Cfs7wI?>sQSBaQ`1
> zD=bf$kb6p%LHzLi1*Hv;_fE27`SY2em{hG5bGZxOBdEEK at xgo(&8m(V)m)#k!Nubc
> za+4D5lvWY;(zTTf)|8N3B=FgnUwP!==c&c~FRTi<a>PS=Vh_C*_irBEz}+vPnj{?$
> zg0Sv2wFzbse{=zfb0WSOkmaJE_+1^ZQ^qWB3teg?G4jOshtnU+cu%Ftz%vVk!5lxf
> z$@w(s=8!QEYw=Vs9qK2Het6e$n9DBK%HoM!-ay0&VBB3rr|_MQF*9NJSQ&c)F<;-N
> zgmUfG7lZZ*tpYodk+gVh0S;eq at yCgcz$`iG;Ir0d4&w3X-a$@HT1K5L{usQ!K;dZ#
> zz|Rl79>-URP8nvHHJ7iKYvsZE!X1~ShTdD{T4qk-J%4#=ZJSGs>&|f`R}FH8Iphu4
> z2C2>LcOs(!wmiA_dZRXoD%8p|D$^bjJRJ8>x1gTo?d~zgj;^K4v428mL2ZW5t|^x%
> zZFCFz!H7LLKRq_1X*2XBxl2UVZIjAPj6Z1XI&9n_iHV4xjn2$V%!v>!TtMh5a#|D(
> zo$(5P8D;2u#>H0TlCgO67VvxR1zNknx2kPYjO%HswTSgb|GbCU<<pmc+*T-E!1-U0
> zefT=%hBnfUidULo3-}0lg!}So=VN&G$LD0dTKc)9f+Vr^Bkjzj1B3S*#63B<M~{1I
> zxqF`F?m37(5qcuL)61C0LDo7lKmBE*hQ8}k1MC%LxSmEZfp)xEihOUN6&EsAn1e18
> zly1v^NUf5(m$3r${n~^^!fWhUEp)Ac4J}K~-wyk<Yo^?BZx!%ucKksVV!VW8FWZqI
> zRKg}=0H5(`Ciu8aMpSH=Ozh;UD(Fx2V)#_$ewLb at s|%m~Z3Bt<vFar4Z`5}H0}v`C
> z#E6jjA+!%*9c+Cu;djidhlf*~-?#8grnFIzKSpx7NHw|XRKB?x>*Ro<h>^ku=-pCD
> zhpsRB8MtV$ZyW`lLK@!TCivPq)M?b=PqDgy at y5DxX2~{oQY!Fb1*6f<;j|I(V at u}R
> zI`TV>wK7GTg89%*)+X*f!d8E4117uE8B^U35}$h-^>+Ovr!P2MDIdo?PBb~>g;A#W
> z<fBYCfk_n`@<auRH-ubvF80kQv~*D3f at 3^$O~Fk1OKz<gk7wS+m;sAjCqeyp)Ynn*
> z11_S1-lxnb3g+PWmDc=%>HSC8nK+)J=km;<oe0?7ve`-2BTi><j<0xpR`$1k{H{0>
> z8SsP-d&*12Tcz7^?I1T+zblG#gU{S~?{Cla<evFa?^D!4j0vy_x%SKcY9BZ}XJ!2%
> zEDyYeggT7zOlFf6N3_$yZ#)~RAjicMMbOFQ{fpSlwIS%^9O|IvD}Lr5%gA_^jo$H!
> zFdni2x84&Txafg%!CATWS9*=#$9B26;jE1CbHD(G9VKIw;zz9MO~nH2`BOdW9l0Jw
> zkU_z($gmHiBx at n@W5U{UqUveFLwe<6jXGu=s|rTEV^_|za~l!I)s-_zwG}v*T{#o6
> zPOc!>sW)#%JlCwt__vG8V7=;^;zZ#l+h50Z796MMxs=IeH_IbtH`fw-E5V8- at r^}F
> z=ab+mD)HPyhMAy&snfLB-=pc*sq1BPa6D~VgH8h9D+w^`ydAb$4rkV7ZW?QY{#nY|
> z6xF%_!Yg<iz!%g&uS!Z_8YqzCTnax7=!Fh(e8q9(Kt9g;f~R%`Up7?C*yn&}c$Xf4
> zzIr?6-S-|H)MuI^{-xr;9^HC at 3V2_F-yHaQ#9vLC37uEij)#!XCt#hP3Z0ux3fi3d
> zvF=lKvSkR?VZ~@**^yk!SL!{2!B at 1XfkPWxWf_9KCqP^)X<xey`4EU6Ff8*`=_$t^
> zDy at Vr$_T%jnv4g)PJ5ur)CGCeYVVGbKxel={k0VMib9@)pP5(N{YPY=Tk7{lZ*MDe
> z{R*`<EU1)Wi>@{^t~csf<sVI~axU+3&ZZtZ&Z at t?)M8mD+4KYI^^Us!7UD3w={XxN
> zsb0BX*CxZU-#R;FW;eOqdg}Jl<VKa^eqCS8J9YO=^9#QH1A5~WD&9u-_^|S@*>2_E
> z=d*%4CRXlVXW6EBY}p1MDZ%=!x3ewG_atXXb}93{3|N0N;I9iGdc+@)>uE{xR>TBh
> zzk6-r{Kk+g+rDm7+w)Ulhwjc;ymbp~w2~XA*m(2(%LCJ!5a($q`TR=m*B7Ma{!d#E
> z^vzBhxFd_XcITw2uH>v6tDSb``qyo^_jm5za_-(Xs#!Z7GF^vrHT?=zMn6qu_tERG
> z^u4sc>CVYyQ(K{_a8ppwqRuL^Hp4IH2?s9&zGA+P;E=Zhljj1;HeUnIEe2La6v`+@
> ziE|fxnT$YOZ$Z7qw;ps;qq&WFa6E~*ZLod<OqnM8fI6OF>i6#9?||<`Pn$qp(<w>9
> z{*1gXI^>rPo?nmL$vU(d)=Bcr`p>T+?Q{mJYZId=V5~GV$d_SidXjrarsfIU69E3q
> z2beq;%;zo- at Z*bSI_v$HQ?<>(soB`qROvqM$FziZy&x at w|J8BeA4EmYi%QmX!RN!L
> z{2DvcL)Xj0{`x8G*xh>A_8j#c9{l*WNAM4S0(Ppe at qggoV{Q8lx(8R_TDWG$Veibs
> z`dQ2W6l;-KqeA^CSNGuRd0gE^qf(~@!=Af+i0jX1Wy8{-?|Bdu{pF#vlJyOJ-uzFw
> za`Ip~)lq`4E!3!1)!hRw8}0hnxdS-YU>{r3lopM5tmSVHiavMfYzXRF#Ox1WWk7$u
> zkZ)r9S!GGnQgTl*>OpTs<GdSpUV(E3crMG|eme^~z;yT)3eb=J at utX0Q6n?1stb3%
> zzp9z=&6l&d_aDRcWgp}K+bR<<^z>&HB~7o9w)Z7%)(i)BUK{WZc8D4<22T>30&o?c
> z1a8m}CKPRC0&@=fy~~-P4;ggUEz^pbAaQg0e9SNM+$_i)Rq&A%oG7G+C?0$wL&<aT
> zI4dE!ZR1V$7f}ZvMd}%6T!x;7Zy~AU9Sy*e#{F(T?<`)$koq~<Dq#0+oWcDM<ynQ|
> zfx|DO)i^y1d;EC(Cg3*$KavyhY5YdvM|@Z!@$(?>*jj#hFJy^JiH-T-?MwHKZeRk{
> zCbBnR?KkTD)Qw!7VBC3{aa|Z}Nol=#c~3w!>7OCkA!Bek4%ZR=anuOTh5}wPGbLdl
> z;-!uAgS}z at T@QR1?|Jk67g9B3|HHmKUl(G%4SSJ+4hcNoW|1z&c>3iofjwyoxt;_c
> zYjO>7(^BAH`0=+x2FO9YH}JMF{vRe1%-E;#tTe2F4y>v;JTJoWyr3u!!?2?3{e+MF
> z<EcZyf;<U3Tx~A$#Ij at YEo&2DH%4qk2!A`i-P0WQ^@r5k+S#euz=wILx!`MrjY1FG
> zkFo4(LVnvLDZ#gnN1x%>WhzYZ_aeR|Rmdq*L;Bn2g7MUm(j6Fp&=VPiCOc%H9UpT1
> zVYhABm9Kui0KFBD_e+1Ox>-Ko8f_ESgs?4BjpB#alE at oTV)(Uep{JVFmyg!0WLsXi
> zC$q0I`5&>K23{W{_OX_+8>zEwePuLX?Q1~Ju0#H7t=SjelD@$D^S*%pZtm?f)JN=A
> zGH!_3m|1$VR|fx at P5m<3mC{2mtp#sdq8Sdm34D{l4{FfwVf_R*avPDw^p*5f{`TB6
> z+_hX>dy2c3E?t80jR*b511C}$QQ{b1TRyPdqo*?B0;)tCq<3Mbro3t2RN8*8oxJ;o
> zh_>GnI^|6dP5$xLOypxNXJ=FSx#eZ+X_1v-$7B4p7=I<D865v%-1u*k9_{7fJ!Vq(
> z*ykyQq<#N#osac4?OOhee7bZst)y}Zz4yy8C!nX*497f3Pa^Z+DfWKC6?~(&xo;##
> z?l}Q9uuJY<hGY1(Qo*|zRUPo|b*2zgU#kE3#%;|)CHKvEgJro;iGC`Hec(THHt~^9
> z8E_=v`vyG9I{!u1s@|tyt4qe*4aVGcDgT+B7W0bs0_eV&`vxVjQU2biBsh!x-n0v)
> z=f-;kH>P_qro*{0-H!2QF-KV7+_3NwVXmBU%#D(^wCKb~z}_q*&rMrS)!8<dcd^2<
> zEwm4ED at l34p{Mp>3_LIfz}g%fgYDcH3}=6n>U(*Z(}V9v<NZFrmhcecqIS$(lC#DA
> zG?}lM$K9C6ds1dkHFyr`)onvOCpR9<V7ZsXuHnA8gsXoa54)oD0^Oc)#K%a5HH2Wk
> zK7;vM09ogu^$_N;o6i+0?84h0r<|3Q3+d^Yhr#-j^hD|p_FvR&N&A6tjN4DNvixV7
> z|3bgE6L#Pw33g`0h6v<Ve$W?;*u!9Jk=!R0`ZdMlL=)zUw9J<lV@^E7(f@}W{XdQG
> zj;Kj|_o1X;nAeB6aURKy^KOi at 6F1Ho(uIGUyI22Q8*D~0&X~K=)B()hcH|2vx-kR3
> zubdA{&3d{eW|M7eX<WAqd*!&Y(eN?Tvy*tU5Z_UZv3D7qvqQN#`@Zy4FCXtm`uH+6
> z2YvL at 1<q~te^XSY?Z!OM8~jEY+&6M!f8)MKBKJN1Kjvxr6NB?}*kD=Wn5V%btl8j)
> z=LdP;Y`5H<nhQBG|MK3X0qkj`;G@^wSrz^Ex4+Hb*s1R?WF^rX5(UWRDxj*q?Z@$`
> z2}<}I at v`OWg7lyX*yF(mtRkg*lih{${~JkU%$*nA`|+O0<4E+^;Olu;_WgRHr0|_+
> z^=8XYGc#gGM~&)VX8z#vUiH<^pHy#OlW=$eYc2QZ>N%`{UsTDRw^bWD at 2EB=j<h02
> z=?$W%E2KwIb=Ly9dtXPr7T0tr^(d=Q>VR=y&;9=n{H*=^we%?TZ8!3PeCJ+de+>S(
> z2>KkdzS_vXH7pJIO~yXfy$m^lBL?TTV~w8UMR0#~;MHHwG$a+E^yF}%mj5-kO|gq#
> zFa;W|#78~8>2tICf{f&~O!zABv>?K6)6=wka&{kEGl_1o7%$3dy6H%d1{zqE`IB_7
> zuyXLJkCK}MmDXyk&yDPy^&hd=*8;z at 8lc~5%<NkKo;J8_B`qoKdR2hDVp+&>^}Rli
> z1_trH=P2F1jnq}PsWN&*wC^JAMJuopUoVi)q#FC=Z<^#MDJ^+7?fYDwrK_rx at 0&f}
> z6By;RTDP+(*@xhrZs{PoM^vfZ418E6$xlPae%ecJg<dAv#|Jt!=-Zo*`PCHAbG_<z
> z)~ii&*&U-pXG3zpOsmKDsJ6QhznYjrxnTY2jueGwgHpY{13ICOIDGSE>Q8nt;hXRL
> zICUR<^D3a{(b--}7{DCAPV_gBp$gI#QVeS=|C07fO?T{@>TX~RU|&}wCo^TRer?>1
> z*dbuQ#x~x0n|hdjWJ057r~uz<10Q?-vTQl*`^(f*_ApcTiu0@`1C8OE<)d#lH;jOv
> zr8L3awyZLG)FjvzU`y6cdf_0R<qaL*&#bGu8#$k=#51Wfc9|Y=h}2!SrZReDpK%W@
> z4{vFemzJj~@Vu9~=W%&sE{u_`!ZVHyR7p1uKG)H|Yf}&6Jkd+(Z4C)mCG8(QKiIz$
> zY2{QM_sl7HrVIDXTCoy+9!ve9x$x(+lHt$m{(iRH)UYFj<VSpAzt#fT(k#4cFMUqw
> zIikgY at gr+Z8tod^xMP|p at Zm6)`3V*qjqksAuzxNwOS!R}HaFcK_Y}JidG6VX)YaZ$
> z)E|=egWX;u5RU|0c+xjJ`iA*@{6EjcK6J(L%x>1|!v<UVY)ILM^igUnYbNwA-O0cw
> zjU5df1|`}ZA#H*zR+o+a3hn5Sqi6&xcBuw_+3~*1OLhl-Xzj4M-@$iNz2ENwKW}L%
> zl+VufMH1)Sq7dhTA|>KQS3vhqNq_Z}*{&h4PGOG3WLo>I$+X_dWLo!cDT{MO`{2K~
> zBPF?yJSQW{J<GhvrTQXY`oVTt4NbSWpR_M?FE#Ia^T1BuB_F1HN+a%UfF3LveAB4N
> z)}4XCeR4r!i~(y{V3GAGn~ZB?*M!;Qur^sDN8f$M<<!MdrG{nlQa4%*ndP$MIanKs
> z9q^HPF`hMAmHEdjT;AG~gL!ND$XgqaSUjIh^Xg`8=4wWpf$|TOzY{+&@aVTVU27HO
> zuwx8zq_uj%zs(1FaT0qwQ;N8cOCm-I9a*SU2Yrf(_LCC53QD3Q=Pe+*-OM=TKi`ya
> zq>a_{SPAx#8Q^0i<v+>&^-Z)N_0gaFFCB<IE;!JDJvxT0L6GIaXF;xZNwBoB2?PEs
> zD7|@p<okUtiawo^+dCGp&mzCr at R(XNjqfR5_tCF!zmum^f(O|lZ2}KH1bFW8L^ij}
> z5(+}&kaJKFHn&fyzxM8 at f}mTUs`c_{DjK}7k=@EOtWyH-Ga!nO`PI&dv0r5&&K$O4
> z=<Tn=PyIdUW(W25QBP`tlZX9}kGZ}C_G*R|10VLE&k6f~JqI%W%XropRuE8&cu500
> zhBr$Kd{XFUBglEY!)^xoEAWgln&Cv2a$wW5et56_pydzoJPCA=64=}W#|IdIc><f@
> z0kOBW7B+qo_kJ)kAogMwGa<B<hCctz$_20QK|Y$egl at ZxUzq!D5+nA0T_r!+(;QK^
> zaXx&j8zMi7dQ!Y7Z;3Y8{M_YC{duR(m`&mVsxkN{Yc^!+eUJfw{SJ&stmnssk-OQk
> ziausC?@9KVl8QyqSTjZ?4Pam03twmh at l#A+N^)TG5F3Se-pAkG_E`FF^L$Ewf6T^v
> zH{JNz+MtZ46gTLm+OwRPAWC1HMq~<gW4e;?WCXiVFadiTbn38YvwW;c;QQe-N_!6j
> z-Wag7LwWaqRjxkh=*K4?^j#Hfgr8djo6Iv at 90~o$C5&4ZRd`Y&X9&+SIKKaKjBl2b
> z`^NhTPx99{UJoCqKfm!1Z75|V<Iipdjb#!!6|}gO<O?A2Iq0u9*WU`@5on9joC`C-
> z!*qy{C*U>Y3COb?z9%bP7$GCM0=}<UI;F$ZCK?Yrrpxe5hTuh`Ev-;Fcy3uHgRuw}
> zDxt50uU$eBYlbXM=GR-)rSwpe+k*S<{p?b_%d0qc#e5$n%0pkq<t~AZZwfiqm$4E~
> zmP3vJ$cEnVXU at 0QT_p0Zn9vr=K=ng$5b%*U5sVjW9I-cGoTm}pvn{1E>`W%f5h>aR
> z{Y;y91yuvxMTS`WTFrpm+U|75xES%+*NN|lq<zdI=HHYa<;Tq0q@}mdnA}p~4`Uak
> z4%a;CTjz*lpr6xqfUob0DKvc6&u3*(Z^LHWoM at n$pzn?DoMSygKa;xg_DntSPdqDv
> zT<+9+xLBJz>-0zHiS9b=ZTXl_#K-EeHV}H}j`<SnUf$d=xu_7iT#h(>4*pGQt#oRc
> zKS1=yKU(LXApWJaFfW4W)SS-X+F45_^3&nH_`ivlTkZZU1e3|yf<Eko9SnXW&?NyY
> zGj(cZ*yj&KA4^(RrXzNyEmg+p{1HD(ZEw|MTzKj#;x{5`Nx8_ivs|zcJ_W at 8vy1qR
> zWXcggBN>PN?S{TVY1)%2C3*AkjeinizY(0uWRPp%RmfEFT^qlQstlXol290txp6+$
> z)g|!JY=F*dRi7OCv+wX8i-=Fss$Y at Md7U=M<ddQV4*N8$y;1x?-8q!I25kaAqMl_k
> zrHP at Zdr@COr|@6W3?Y7 at H=jkjZJKJ|Wv~OhEoq6n2i;-yXNd}HAG3UI?C97I`N%Ma
> z#Bn7YPe#5Cw6kEa&8*dSy9ho+a}p-ls;T#ayTDufZ(N#h!yd;_F9$_i+ATwXg|I|j
> znDKUOlLmI0&%N-zh{u9{#|`tQ6FxLLA`c+<cui|`%VIWkcr|>-dX{}jRUHB*7b|f#
> z4Em1!tW!dsOO)ccmqBj!du*urMC*&OA;2v?0y({oJKoP7f6VzWfcJr1iG9bl9&$c>
> z#7WM2e81q;uCSM4td}LB?IX~Yx4|Fn8p;lo>1W<ZDme3tS<|{OHHp}u3<)btpUDNs
> zKVw$i{`3uA$Y8G1X?MOSF;!~QS;NGp$nmj=;}(<={tSEMIg*<kerdI5WUCr?2J+uO
> z3tQ7!18@^&wHhzTM5nRdwvgvZTHLJ6Y@**N8J!l5z2!MP_eIccXQk<_j}h-qe0bXU
> z(}6<@f1q35 at PP`Jv^@V31HJi9<XCElUpf5E5z9$pm!AKGQDPoh9LIK<y8-?HQE`{y
> z6VV>N4fhlVNB#Ixy2bsa^ou2?*Or>UxnOYDwoO{!*b(9$n=XyKa1Svn>EE~;%nQ~x
> zUVPepVUX<MrJI4JrmgU`H%G5Wj*1`7T^!Y10bO0qg#zOLE;OaHqz?UE$}!XCdGN1&
> z4SCf*Z8pIMKDa)<;1U_|LNMYo3NO-29$!pd!d^^U^6=u;`xP{>UNHX->HLXbOpJ-x
> zzds~+Rkw-1T<js@(?ZKgd?~g01IGO2l9RZ0ap+6Xjh=;l;krl1`d3v;HZ{t>Ty823
> z>^Ci!T`~E<AMU;^+|(i?^K8t+Y=-F9F3!aKHnWq6t{u5CY9=TxBh1DnryvvWh0W}B
> zDxcsr;C^5qargT|9)4Pz>Nx*_Tzxg&|8M`<CjG$C*0 at H(SM81Y+qHD*fj_Sy7wt=b
> zYj3#L^RM>0|IuECwC2zM*q2p?rJw#=d+$SsD8{>%6T8I(tQA66vi6g23B2U!@77>U
> zq$pqb>zmd%zA4TvcQ=~n<6DkIJ&s&|r&=!i{?LP#NZ?m3`B2jSuihZR!%ODq(#8nC
> zQqy~`>l at 9xWAeNBkqdX$mK41cJ?{ha7fbdAO}yD|?f at 3E;AZ=Srg(qWPt9tgiTn_G
> z!M>T_ZvG&$1N?p6y@`Y8=d7$F=gEA*w|DWt{?c)6 at j`;*tKq>P+eYlswc?BoNyulx
> z?crE=-R>jb?uj-VV#Fu6mQO#PRu>skE3ya7-;*(C{%+|0Kg3#myK|KKXeST2s(kW&
> zkw1^b`M$@|0sLMd-x`SQgnYsV^NF_Wk+prUF3>IWvWf4NPn>nG=kqs^<DS~DBlgSl
> zBE&pO4LZbXuw$k*Nj`VF#PJdIEaLwSzdo<IHi4<`J>{lZT1o58=_kv7W<p!9Os|EF
> zCJX)!54e5I8SnjKTin!F63Zyl<zptV_hzdbJEvS}dj9eJk71`c*6SrLjeWD$r|%W~
> z-{;ERU%!K{xpt_*?aS{|*`TzL*jcrHcTPf94^4J^RbXwrStX5TgQ$Z<pEKCMMvU1b
> z$UiIC2gD!8jn!;XHzE)9fISUuokZT9VEF9>AzoU7e&xYucXL8v7DKIS4Z`}nnc9N;
> zn{)k;GY~%c_AR*IAHJKZ>i*b}S|1J at CYCyh@eIiv5Ek0Is5D>`)b?&tHCnRN-8fG{
> zk6h1$fDfOou)!CS_%Q34P#jB%?jHPt6gamduAI3v47o=xP=)X>st^kWZT`zjYgu>j
> zc37|5&cHsOM>Rl(U5K@#D4PM!@rP7=wtVtQ%^QfXa3Qf1(n>B?H$*XDPE$AL5{xu|
> z^eX_ at 0;R>kU#`&k at dyS7!Ei#3LhC15e`|ND89x8Cy1*QaSn at fzm-`Qg2ULaFdmZ8@
> zYBcK+UlGXnmdkE2h>yPtyw_m4_y?jls9a{VHZMb5F#OsWItzR$S%<PpE98Ff)ZLNQ
> z#Ir3T4Z+-le3qW`oN)o|1zX!S^Xi3-mhy9oS%)G6zm8DF^_Z^T6_+;wFNdAv)<<G#
> zJBRddA#uTo0hk0Ix6!O$-z+xR^5r=x^fBh7OwTE+mTN;v3_5h1W)hPQJ_s=?_Ac{r
> zwB2o0c$~btD74bT6E*en6gCSVC11hijn3FWY!}>pCaYBF)@L?-w&p9egLRp;wcc#|
> z-cJi#cC{Yz*z_{QBw^q1olA00*3OJv8M6j++!41SkCX%Z{xBUHX^;!<+`My2YU~b1
> z|3{P-x=7Wg?nO(oF7n(v!DrRNF5%Y8cljCe5^xM~&lN(yR2uZRw(dnOM`-wVq_0cO
> zA~v4Rk>ncgX@&iR at v60$yc*1=^+gxcBH2EdB`o}N${%{vRIs1H_s*5XM$Jt at 4wGQW
> z+?DibU`jydra74#{!1y?PeLoBosS$lkSOob(&dPa^`1}%e@`xc7d~@y5g&zpBW5nA
> zdjqW$;TvrUag5_bg~uby$fzYc_m;(U$nY2T4Gllf@#}Bm8;#^o=m(Y#zHNBUI8_!C
> zMBX3o;0Jjq&qc>>aqMgT at 2amt2l!Se@|IlWL(cYXX`(|_^AClNuC69I2_(E1cOvJg
> zLk>*D{yy=kPM(x$2ujT^P9u4S1?TW>y5Vd6DzTTfbrIWH%rdV26<1$M?0`78NTZ^b
> zN0xpQ5!w08u}JGBm&pE0C6PP7eKq&|`dW<&bT at OboHJN@>nG8ZNgZ_7RmxnH at waD8
> zr8K#HNw11!)B*T5FVhTnt7FIUHn8%fG914IdGSQsrBdTk+-sjheS~{g;2Lrn<N3o)
> zpKZQRWMaJM8S^)77l_Xv|I>(f7HsoREv+5Q8GS!^#G>cG2c<=pp1Btsb;}1bgAek(
> zg4W?%q2+J)UoME?*86~%*X*_^<z<q`I`Er_V1d;S_QUE$Q#pUUS4n+A0ayQwt54?Y
> z+&$4hsta at XD;{9{uHiQfb9XLT>tk2OsPxm#)eFy1`S9HvM*g?3k<_iN#gN5zJmThq
> z3i0d4w(p5;jY<=rwAOWfQQqpXj}5L%SNYqu?Xb1YnYS3WHa%oR*u1C)#~4YY#pTwD
> zt_%22puTd)8OWRMY2v@#vs5!&x)Ar2b+!GMcF&V`u{YU-W^rC#7|RY}BQh84vUlAN
> zV}tNK`LT7#Ns{#Y5RCDU<$PK at p$UBPZ16Tc at bMp}3SDB7pT7d$rpM3NrP?zfTY4P%
> zY{!Z1f<<kjz)XwB+!F8?rP&So6>QKCCwF{Wzt!pUQ|0s|Ysrr5`nnz0%TLRvsRllf
> z!!K=$syRymAF)|D-vb-cn&%X|nx2)dMf{rP!Vkw;<+FxeA<s4Fg7pk7uL-7GUf^ka
> z>WgT3>i&BRHrTay%R?Djy+Z4x+9U23%qR3x6!h=loS<u|tgJ`2<Fj%FFmHc$x}@53
> zOrmF;zJ-tY8rXak>J=9x(k1v$M4Cwu?%!-ZAy($Sg!R!5dttNP{6ZbZK5oaSXrl#f
> z1fmUK1#)eiMcf~;c at DO5AqKYS7r{SV6?U_>JELhiuupBkky=C at B6I|wbrXFP at i|6o
> zGiM{2qBl8R7gZ!y<h|A#-M<bP!NIgbe`v?&@LBJHy-7;tXokO0&}Ux%_U$tcTcyKh
> zH#f~Dz&H6S;VLIH&(s$>UGgf#H+-J>w`Zg%9(YFe>O7<1XA*To55K|qj1;Mn{MWu2
> z_<x%qU(5U3oi0IFftU)h52b_d0QN%o*mt4b^9co9yVKF`8LukVo$#gokVDlEt<HF_
> z5d428Xc9aK+DwE0TYRYOcCd%+mp!>JUae*X;mzXZzz)mc-|7%i+wJh<!*lY1R~vnO
> zD|9Ky$3f~n+mn$KSok=b!80#$&x~hW_1#WiQO4$p$itALc>JGsW1DkzBu7rKY3p(R
> zHBBP)L7RvUKmZw;<F%e-L-AhT+<R at sdu`2pAnab&Wi>7P31g1^lOEhZxjuG5C)~oT
> z;_&d|$ur9=^m4+tf#%Po?U8%m(TC37HA*b|<>{SslHwAt0E7J|V%Q#9n-F)-z!u2t
> z_zHT17ME+fr(Pd8vf0_ at pbPanRT1c-jiZaQc%CYYoy311{2*jKmniLI?l|3XEI6k1
> z=8mrq9)GTtaL0nd<M-i%R|7hKm9v#A1ur3QpNaUYwq2K2+b>bZZMj6Z784H|Z?IdW
> z2KE~KQ_NC=s~>N%C#xHLp@*4Bt$;4Ptjkp1MF&`KJDri$S)B*xZjkyo at O@LYUy^k|
> zeH?sf_qE^+hw6e>Z`Zmdgb>?+_$RDM4eI!T;j1_MucST}2j#tXjV}L*34re6y6SQN
> zrmgzCl+i|<Pq_Dg7<==$CeHP3yxO`Gm(~S{5fwEcq9KT6BM2TvrLFZ#dytCSHp+<9
> zDq3qsKuZyjx{_#%LbNIvl at M7aLl#<FrL-cYtre=6wiMGI7wSUE2+`m5Owi*w at B96{
> zzdz<PlgTX4JnOw&_jMC|?p1xws+mdgQUi77&gXdcb;Pwc^X>MucYXtx60T1UbhT9T
> z=$UPSv|MkyJF{XfJrEpZGn316YWj44%zy`&B6H9?ww{M8Wg#Wh{v5fm0DAQ)_?^$@
> z$b=_W_joS$S9rdLT;h)nv%2E4eng(6%cCvm-!+MrC;xF{*hKVR_zB*U%D0tCb%^Qz
> z9JwNY<~w^lsbxDXv6Zd?qa-^@ffWn6KamZWJ*XF{QgfJU<Q=Ns!}^UfeH~8m*%4#H
> z8y#a1Bcq|9 at 0ruZ9<M@&oRxK{$T~=b_<#!7D=y`}oD(Et&j$C#0e%3^ivurJ6{;~O
> zxFAotBGessCKUri0lQeW0N4pBeCegAw>L0f6Px{D at cp^l<KolyxJDyyyZ=e}EPf{T
> zf9e5p!dI{_68pbrNz0eir`f_qS;UTx-|x0W!am*?woQR!9PFn`T8g=(j`t;exwYVR
> z?_^)+t}Acwp*pie7uVpsEG%^Ttie%VJ at ED_mj*VPn)>KX&`I97dsqB6WIdPvlDr0|
> zmt!paz6M(44}04$PQ)B^`%ChWcN4Mt`4}6p#c3kDY+3U$Hjo3Fo{2rU_K=4MJSUE7
> zY-b6F7IFjF==ZSxUL^Kz)QOW{;6FdFfpx;3A|9<EGJF3>x6BTkn2ik<0{5MFfyisX
> zc5u(=KcC9ak-F`%oXmcZ?~3|o%mSz9)n9(>M=dqZbkt_eFJ>4eWn#yT3qj5Wb;Dut
> ze7vhQYF^CSxbC|jhb25j-51hHd2jgd%zFd2>k>|;{+&7tn at u{gzhRAq-IR<iY72WE
> z{TTC-=u*b}#E+CH&x^qPw+#CKBl;v|MNS5W*a5itH<j0Ycp&UdUt?YW3bB)4A~xdO
> zbGu;|c+)*ctXmKf9%*ssU#+uFkQ}hKN%~pemeyLnkgoWTtxaNWP|JOq;TK*3d$&t_
> z6f)lcl6w*QUS-#B>@1b_Aj#{xJ2^zkb669-z{NQ{$zr&~y}OqF#M-b`?&EA91iQj7
> z;N+8v&%mw~fpvT=)(3*G9d92TaZxHsuy(-qkTDI{$as^;`QGb9N9^EiEXOy4Yl$6@
> zvI}zK9~~0Jg`+&kKVs7SNN{q{SrJd!J;5DMDY_75^rxsAJm+HXbAH5{MBdkIM_IC7
> zfZn7)dks at D+M}F&aa$T+Z)QipCbtAJPOuX;d?mc^JG=d_>p5h8ANOX5M3tvidt{bv
> zCijthLd~^7<Q}2fAe(^veAIr1#<dres}23Q`?bEaf8Y1)_kB2BUlJFT+}S9M7<O}f
> z#LFhEmzu$<e9d!RA3+b&0N-~uLxws~@+Kvse<qFrw<vTt?T^*JA$Fn~`f2&yJotRT
> z)2LPBT$uhy6LMU3oK%5x*Jn>=H_j==(T4{Pd&S+>YnMfYN7QNu$;xj^ewdS0r^WU*
> zwguQmVEZ;Qt8OQ at fd9uvuIKCKu3GpZbT2Y~wy<$C&&GLso<FD_#(;A{&B~}e_+6rF
> z1Hiu(koOhFO at n_xUL)+t4Xz~-m>+z)w<C5cdp&G$z%UR!?9=&I_kG_oCLBKX%KFu@
> z6Ge3k4!c5PZzHy*ww at +-;*IV5PeM<EY-*pGP{95SJ+03S<o_IZ!{Ff|AUu7ncQtJE
> z#Ab{AYWN{J`z>@2QQaNHxVDrj^m{vB72Bi(Z+`1CtC;L-`VMwa at +zXE-(A+VhZfB!
> zhi$wJ^(;siLYGOXE$MoZ=rY59By$I1zR#A2`;@!&mZXD*Kw^ungCBE%CN}`@gwBuq
> zOEpbI7b1Dnh at UIzAZPmm|1TZP$+)e=J`o4~o;G1V{R246Hx_;v^>@sIkmZhI%mWRY
> z$m*f}=ZBYqr@<2PuD%-e*T|0IaATN<#5(x%{uy_XvgB<Zdc3oTGHVvis3AFOvxW+b
> z!A<oI=2z$d-aoR=l*e|H1Kd-j&W8uF;XZ22+xv+=m$izMv+Sa}b9UAVf8+mV6aSxH
> zo4DV9*u=rZbptWSZku at K&k6ZBZbTcv{_0qr`7<{zUV^Otht&TW-4z(d`qzDSFiQRk
> zPIfrYUom&?!jF66ioc%MT75n1y9vNC#jIq86WNhEriHu~H6^x*rF?2Q+co at N_4}#c
> zFfaB825W3Y=-aivp};MKsmijpt-tKf(;BfOYilU*lf>5S)65{RJn@$idvR7O{Mh#i
> zcfqsvV#nuhdvWwyVlU2`ZH&D93+jfm7h~-HDy-mib32aD3(W+7*>L{J|In2@!7<{4
> zzUYPf9 at jy)rIsZIfTuOU at h|On(98XJnf`Lh1su_Bf~DuakIS9zC4-LwdC=P#)L9m6
> z24%!%;E#Tm{Vp%(-)j_KFgNMamg7odyY?<8u{R`^CU#s*gqb_%qvPxo<lOX_m8S3r
> zmnp2Jc<L#Y?uwdVYj}6lBo4&z5G-kID`IAAMUqbBQ{sMiNA-_wa!FLb{hCsZ{PPQf
> zeZ`IlVgn3cg1mG~e;JY?>KzC7ctPwqRkgMf^7BkyP(~2Wzgt^!@1MLNmlN%}UZ6`{
> z;wWnLT-1YoAvQg>&#)cGb_|=2w0S-0dp(E=z&Z*{dNu5i=K8Iqee|%!s6M)~m6ZAF
> zhu~2lyavZzOZv57oipdo6j$VmukO1XaP`B>Q&r#rCAmZqPvxmHvo!A==(#<tld>Vs
> zc*SnU7&-H^mW=xKB-W+t8av^&!{7aCjP$?BPldnMqHUm-hYdk&{@?HDz)Ai15Fc~>
> zD-;c%3SU(B)iU5YP4GKhGx#AUVQKOyMueDvIG;*wgI76;N$)UDK8ycbv{&_r3tJia
> z<UHE12R4=85kF~%eKC6EY_5)3k}F&rh5DjuOCB0|pTY-u#l>*(YR!g0SI=FZe)apy
> zGceAU0zWYmwo-NPwI^W9;qnE>He-BU2WLrHZ_dEqke`eX?nmSlM*S^EE}}@Z!3r62
> zkj7pvOfyEtA5|fDxZ@%6*FK3|zUgxM?8#NYk3!3S|L++4df4YvUx42eYiIqECp;6e
> zu))MObNp+ec>Z$k`9Bw?;rKNo8{t{o2$q-9k(`fN0;2QpoQ<{hPxF`-dHtK*x81uu
> z<Jq#EYRt;qn2xy-dDY%(bus=m;H$gJea8y%$KdMt(S1xkz%|H?xUNhp|F()<tWt32
> zUxRL21nvv(|9D2#zn_8sqrhGLrmP!08|L~Il>OP~^w#@j_ at BOK5m&u$71kf<o5-8D
> z-APkh;p;j$HzbM)l-#s1N&(X-6BISd#f7n3>#}2Ct;@1b8*hv??sYcSEMAT|sUp92
> z*xBD+&@(R4047(-yCwDf^7LKAqWR{v7ZtwG%Z*hwrZZu at HFz#K&WyA79G(%C>8vk~
> z6L{>r3)=wV_{_Iui;4UR{qySQkJ?l=ww6i_^K^9=zFWVueu>PbJ)?ib%1%9|VV|jA
> z!o>ox$Qw?4e)$~70$+R<zpJ&0$;ZI0U&}%#uU{@MgB<cJ{A>Stei<(ZeTfCf&hNfU
> zkhhM-SWM+_BlB8)>ebTAQ^zRXb41rbraxi;N!&o3PbvDlb8bkq(Pdv}$*B?R at jl3J
> zu`Qyy^L=~&JL&!p&zLqw*)vvL`ShM<a?d*j!0F`I*Timxe()eiraFXJA3N+cGEv>{
> z(a<+YJUM)4b%^VYZ6)7_zIW9i$G0pSZG#<k8!!yIboj!sFX+WI9Ko}iG4?I2bMZ&e
> zGtS`N>sZgv>}0G}sUfga`{BFdV$7Ip&a at 1=T7Ee|OgQRFaZL%Xz1E<_xv5dR at W0Uz
> zjO*b;s*jJ_i{GbOhTuQ&?u+US7s>SmV-T7{?73uI!(RvA8^NR_p2kLSIo#Ut6=b4c
> z7F1plk$H^RDCZw&bauAVd~8B&Uf4Xbd3Uwa?_oa{`*qmf!uB?{cMu<4fbowU%H0Z8
> zCGrl|qW>aC at Tz>wy(E7j#>A>sI8WpdoL^a{t!%malK|UTt_;T;J`}hb=|wY<L$3&1
> zAvQf1ciaNLk3Cqw_M?nD7F1mcT2Or at ctP2fkd}(6|3I#D^@1KU_q#&e?`OyIf}&<E
> zkh-=lkcA=s=5h^*9bW8mE$!0LL8_iBTe}cThGTITV*gu;ub5hPUOCm0e}%|t5)~;o
> z%1SNPR;p|`zKK}fmvBsSGm at OAX*h<BeSR at n7k-*b>NMs%;#Wd0Z}9Q_ejogOy17wr
> zB}Bbiw><;x7}uA#B}!SB74_;~r|7~5o?&u{xM|2y9c+UI at 4o=~>qWa^l_V+tZ9j*_
> zcXr1-EwEzs1mE&fA~@F_pQJ<n!hWA29Op*YS~)Jd(KsHN%;0?P!@7F&h^@)R3~c%2
> zI<&dghhTrOcL^7p!z8~)x|$aucMWtO6Y<-E^CAt~R&1M4XKy0!^}jk9Rzm)lbpwN5
> zo3ZhD$;Ok%t?Koihv^V({)C$m+cfarAqO`dift;k0OEgs|7Bv28od$MkHm8nzz)d4
> z(<JZof)4A&>9f-yM+Rb>-Z>6AxWKu=-3L<8mGaNeE*HDJp$7+mvu+&TF%j1xzXbU9
> z5SxMPMc9H`zTG+87=00b8z#zVO?nfY$c31 at 5gV4}1DU)9o6cxmFvS>IyOzscix}&b
> zw~_NQjl{M47pj*1bkPU)hu5b4bkP|7 at dKlEVxuwg$LEdK at m8a?pV+u?+waDODJ-4`
> z3`q7OY>SNx)vw__Q at NNB^Hh`UZ`LWhs~w3L!%DJ_w3xqreL{6%iZN1MB6}pN+q|Q2
> zv(f6imba$NpVTF9wdPOWYUl*hnV at IpPUsL9N&bWLr#FU$dM3kP6Ndit6XGUCQS+Qd
> zg=yf<@#LxDvw^N}T=+pA$E(>6KOFe>k6TmLVoox@)0!f`Vc%o(_#bd2)E1^t`!9|2
> z_>9hPkB>TB8J1Ywz9LdCwE73MQ`*L>whzvB+SIYUJ&7kBJ6N%-hiwLDH}9xmBPF}<
> zuXAioJbA+pIWVhP${0Oy8tgWyF}5AjnBN-Ji+UR5_XV^p#)fMG8{}Pq>S}`3dg~MI
> zEBNl2DqH;);64Y+z-wZR3|fbFmDq-mvGMKeWNhR?Htrk50E@@fS+9)n=pEHHw&rT-
> ztzaTg^bN}Vfp0}!yhZAQ)C24l*D&57FTB+Uz9Hq at kPT&I9WAILV-)@_leMa98pmO7
> zQImKf#7xc&-B4x^2DdkK at odXg%`L(|a_6{p`+VrA;p9G#m(mdD7r4~XaI=Tr3(Th3
> zHPcht^$X&c<i}g-I^yqzkNbIHMFWu$HZO3wychI at 2|bgqY?)8i7mIc?o&&oVa0b?0
> z8IYmNfJF}H_!9(A&)@#9^R#Li>x@;fQtG3|y5S0u<VE=QV~#Zq0jIaeefTB3ZOH#u
> ziMR(~+wk0v{_B1Ta(7CQf8;iJ3QLdcR(dDD>@vw*a|0gwbi4<@cH_TB10zZ1F01BU
> z;h6@{K1cS2I!fp at ee(AOS&Oz2{<&2uU6+jT;6Bj-_*SycYdeG_UOKK!EJloLU0&Ha
> z^mogQg+yN04x2IC%`rosef9dvL+gX@<oFwL{c^_782#;ELd1>w088%pt7DuH`5$4M
> z-pYH2ll8$>(NkrNq}9NO`}yNPRRQ-Oe3HloeJk*!<6PnUBo at pwv20WucqNZEuoAB?
> zOGDAOB!8yOl|S^6OYWZ)oe!M`o*l%)^Hy_h)VH?|_{lHNO?f!3P<_?5GM~fkp|7mv
> z-wh)Diu9>#otaMef8f^*zf0tP$g%eiyZ=k~J!*yhWi{j%D}460m4_h10zVbG9^*Rh
> z$+eKz(f3Hdi(C)BvtZ-wQz{B;<F!uoPaVFu2f3L!+<k`s)w3%PVg6HNpHKSzwN6*4
> z`#FEz;dx+AuR>0FVq<)t_^a?9vd&^n>G)`ZUt)(gM}>U99WJapERL~WlH-KU+MJ`-
> z<N>wTjS9#RGjaSvt#$KC$Pr5S`3*Z%M?{yF9m4!!bp_*nSbra_;RTW3c-LBN^P#I$
> z6y(W#F|PcvPP*p(-FE?G!p~qY2-GfIp~#T%8ow}+vhy0}hJrWRIW{LO&v85du}YU4
> zy22ute|ah6UD-pzDJ_>bUUGR79_gf1!`CaUw?E=tBJ*Iux7fbHR*&s#%(-ulQN$ju
> z`^?omwm$#+VbycrSpKDaY4oL9`JCNMSW-OaH~X2xE0l{aL^Smb0KZEE@!!{*<0e((
> znQL8hLzaIYvE+6&s}%f6eC>@&aGi&eHG~&%nYVC3VlnizVh4Cz_$!zI;uGf`5?zSg
> zqv`Mv%pJA-^EO&#jgbCY-Q=;@jJ2?s;Eg7K-DcI)4z2O`TN!!Kv#f at TuO>R^P;h2X
> zUjC&kZ)T-QJ}0C?)XRH4mc&oUd|NAv;maZX4jyanBR5=!q at N{MdG)i;=i05^h|T77
> z+yBQifDbJS at yr9~0 at _}xauM4Y<nzx;WxS+}T at jn|<A<F=xxbWqZM at VOH@W)S$q7|-
> zoa1!J620llUsP=-vtX0qGR7~%FK{h^y)C@{X58dJn?IhDacg!-zI9m1+<v%!@Z(FJ
> z%%rMozgW+2Q3|WBwHG(g%K0T6*Y`my@<hxpVdea>^aAR1$b8TFhA;mAKQHb7*YoQ0
> z37`1q^S~!QbBek3uSpDISdNzeyH4km`og)>Ap?8s191ef7uLkSSNB<kyc%{yLE?44
> zev;f-S3mrGUeVsSqmvXh%E(nVMdVu{^Bv}&{KSwso_xcSsGs~OTjs&~olo9-I%tZm
> zwKTAbaGd-5Q3nn1>w?=u$4*B(HqHTePJMB~H}&YZ>nyR;`@Vb^oDv0Jud{TJzM$;;
> z3gH$h_?A0<*?ml6mHNKQ9e=}}UqrBt1>|^o-$l6RRiYPh|JQTZy6^j%JMMiRiO+iS
> z4DNW5`+DxU_j>La*Z&_m5lqPQP?dHLw#OQ-eoIlmx_s|pm5gFen(x5ht2(`43mGe3
> zNa~iuNB}#f*-q+YMy=+sz~64__b7KJX_q2HVsuiENfFuUySmMM#YDK>`HCyxWhR`E
> zw4dXsOATAD+##T6I0EU3Q%<<N$9=<$kF^vg3zosg(mG*j8!)%k$4E{dMjZ7Ba)q97
> zA~mJFN`J?QUnTr5cxGy59I)w=xVE*?CdX;>5Gvl~HSQKOhCJ&XMfeUpYqx3wcx||6
> zVXoH^-tsi?%KI0rI%*5QW at 9ARfLn=3Hw5u=fopeZ>d0 at bX{lXIw`bI)wcQRzdv4LC
> zwL2Xa!|x>T55@?1 at LMc_6)ooETc+R&11%#QFrL#hP09Xd$X{8zu at 1!%8<?y|limJ^
> z7K4A-JE2vYM;QrT$fY3pAI{}~bG%BrrGY5~ueh&Y$Mqv4hE at CeweR!wYx at wnM~FTC
> zYr`ySNgQ(Tv0lR%U%##@LyWaVI@(&ozAwJ2fj*~RuCn^S3w(KB_>^YoXRrZ?fkZAb
> zCMc>W2^?D{xvap at n893K7Io1Ce$hfN<PB(46(Ii;>~RU;+elcL7_f at XY{_7n!`koA
> zV&Kd|aV;=Lg<im_0N3sO9Ql}1`SAk9yu7qD>SS;EHQ-=o=`HQ2f#HCUDPeAA3wWEs
> zYfk(3tIQ48pQNS7b^R|4=*bnmpv(1NTOH<?H|L<|u(Fl~Q;?@#R^XB>+Qq#$4ewq?
> zct_oQKJI)E4r_`W-xrK$ii8Z|X~<efd<~wDNc)3-#pdhT#t0Nq64Z4(){Q>&Nylld
> zEny!mJsP%tNv$-E<nTjXpxyVmynUQZ0QgWRMr7L~!1)K8V#|>G at WJtxHVwHyj#hBb
> zPBYk}kPC)7Wsi*5o|59Imiqn1gs6pO;Id}WW*?)iE^&P^TD%VL_RMS{<>(;gP(NFa
> z at I3TAUE2ishDko9G^P*7L*DB0BC>fuU&go1#0HZ7S6z}aiMP=HkFJsw&xj2BT-k3e
> z(a?RwyeOAwQO;WU at 0x(`#dkLvej{b;FxuxueE3Y+&OTc<(pL?SGMJWDemujQl9NeO
> zX-+Q{bSX#iPKK8SpEdEB+!9 at q_P`IH+92V6ci{JSaQ~$ukDZYX8f9TeaCydxF=rkP
> z^BiFN4VWf&Ci03biOjk4nsLtNA?{~#_(@h!jyc8Bk_rw~zq$%=^%dlXS&I^f2ucj-
> zt5Q$&*Wuz%$k;deA#d(r$d3~}GLdtw8XU+rS88le`Uas5{YwJ<QtvBzV9HQpEuP5R
> zVwi=oI7wKeedvClD-}F*=nE~sqi+I7hI>3YoG+I%!lQ4C2e>~(!?we}(>kG1m8PxI
> zzv7OM=qMAanKt1X<Ov at R{dSVDnA3SA)yD2g$N?3K^>+*Dzu;4pQ}8#DTw|WCj2wN_
> zh5X_qNBgtoST8$_m>gTTFISGSD94hUlG&Ii`-JbqJy*l{7Dj9Z*C2Gguf at P`d5wI^
> zfx^JHw!H4Brgp}TyW=VX*}8u3=lZ~BAw`}GPts53oKMShoJ5`?J$Q?cnx=C(vQE)q
> z?%YV)k=4NAqs(FL1=@?k8k|2-rijV{pEBo9H~h*^17^LX>>Sbc5EJkQ=U?q{a?keY
> zOQ%xB$ODr`;~j<Xk$(N<K47uNkbE~i!(}d3O!};_Dskzm9c1nm)kWnQE at 8e!P8zm_
> z<6$mt-s0G;o;A<rzW>}#!tsu=vDa60o^b&m+%m*kwG>?OO+!fBg5XZ}G*v6|D}UOt
> zSKqT~*7}1HG{34d&YGEg4sw~qagUYicl8tLcirp3R)EcdEnZ)6FV%sz&=;&3t1tLK
> zq3=n$hU>#{PN9Fiu|WTLvjxX;?8$X9eeLG4UZq%PntMEf7m!xJNNmp6e<iV5dLtW>
> zd^f_c5xMWIRdMGK7ai&_(SD)3z?WZqa&&QtbQFFE6xT8%9L at 9u|2#U(aT<29BOQH&
> zDkOEv=#UF3&E)~+eZkZrZaylBMgA`190wo1q9BjgI;F*}w7-W)J5QXlOIrL#*5 at QP
> zQT*oNaYLUEUzFJ4AFTqG71;bGDq3!KSi(*^B72r3rq)jJIS9K>m~-0;)%!v#OmrQU
> zi at tXiZ5Q2?)vrb>UwVRVUejZ!f8kK9vgciC at lw5X&sBYX(9jiZFmQHKZv9E(I3X+?
> z&KveP-mMPkSyIVw43W#pn#ZyZraQEr9~VM=TY?zqJPqoRI5*sCO_|xwus`rR7!hwD
> za&U*iZrBCie04)|#4Y<D`d#3I?2rz6o3SV9cRf;AKg#kvT9W)$ZAs5-_T5gY-TIxh
> z?G!s|oz34*wIX|_Bd2>f at +e>2Xz}-3<+_yvpTG>nzAN<CSAm1Z;JtF@`AHt%wq4!$
> zwv^snnH|4$|4pxcirm1b&vdz;x#{X%MbfqGNrL^irJGDrN!w}ZlE*sOM3ZU7DjPU{
> zY#9M!;LH$@=8v`1FM+`^=Im8ue^%<ZlJTA4X?R$+?C2N6({A0CR$EgRY`hD+AAIT^
> zr*Do$Y*}*~!;WyA>K@*f!=|;gjd;$%I==_ck=Uooe~{<nwqyNPNcl_khM<Zw^o4bK
> zt>xg<8RRvh?bxQ&e5c+v*SFs`Y1~yk at SlfsWdb9~UwPL$$A0AAI$f?zwfQc4zlEI)
> zJopmfN$Btv_-HfL;jLDeq}7t<$rs!?3NE&P(ihqA<OlFU&e at vE7l7-{#fYGDNWoXC
> z#<{*6cNl!6)6B5BRgxIOOkkv17E^I-clFr*b<<BZ2=uxKXBN9!7BA{y)mVE2aNiVq
> zmvrg2HB!GT7Ww>bUmK=ThuJXdLHePDFliv>^B~|_F8p#fAi!bau2Z&I<?|n3N_>R^
> z-YoH&l%~GDv!tKTzVP*}*{Nw`z*D;WZgg at Xkso*0Eba>oc4XF1W0X6jV`>{HpR<TF
> zvyt*{`<Wk}DIEiw1Y*%H{MsjziF&tO6l0f4snd<pC_ at vt?|}QYvow4pa-SQ}C$H~d
> zfLU0N_}rAXiEO~|Q>BW<4=#VsUyi&_X(<v%!rqz@%Dt8mlCULhE3zz61!c+ at sdUZ#
> z!Mke2%ywC9c=~f=EcIJrrRjZQ8CH!t?K{R)7DSyz?B)Y@#Y>FnyoV_BD&}P?|GFl7
> zw1SqeDs{>dt~=B4zNs at zjcJ`Ztc1VZ<s1>d*E~YH*V=xaZS%N9-bDwjs^Z?arETi&
> z8sNATvElfxgY~k}mU;`mmvX-o=WgeO&8TEW-~~ZU-EM_(w&r>Ma)Dy5C+8C-JnzlI
> zGCJi(1^nh!nj{rd_}+2dvX%38adW4Hlli`D$*Hi=CfFsEynb^>Z74Pjtk^}*oP>Bs
> zqjhOt at vj~468VWbjQ<RVa9k at R*CNOHRPfMls<22U;0u<x;tku1EJ4BK_~Dxd8gi=N
> z6g&gm at YBS51Cgs97#uU60nS76yWPrw2XF4=4LSoK&r}QD*LsVO21;){`49g63QL@%
> z_rDS13b|B&w)egYLwJ!TESM|HXSe(ycZL at g%nhDQWH;+u_r^2u`Hn#Rr66in1 at PN^
> zt9G#PY|EC!{3BxtuX>_+vc!Qr7+egJPCFPf(+G!EJz7{o))MtBaQoMJzF8LJxTK!u
> zhwn976E<~SQjeB(AQ!^2mO;WZ&4aC-YQOQQTWUmkFz=l9Mc6Esz#rS6>Mq<0{*L`v
> zi`2+pglC7!Zk$H0psKQjc5q#&%$;6dY>M1*y%RaM(()aZ(6=neCCD^v15dOVxoR+<
> zAh+$I77yUpo7(eesfY0PsrDVn*{0Ks(U&ZfZoCV*XBTT4W=;V&!R=&TD{Io9A?I(7
> zODsqUb67f(`&p6#9VW=eI(A)AN%AY5C$V<p8M2O)wGJk5(CSF(pakh1uik#4Lfjm3
> zhBWxJgV$q0HR3_eVofU5zR+c&L-=V}n|2@<Z!ToP158*7IJLb_8D=FZT;n{{Su>C8
> z)F<^8dU}%bj#s}hsqCsgCCPEUL%Pm%N1BqKl;UWH41BeB{r^zAnylY3hfoL2S7vRh
> zx`G%w^>|)7axxZWI;~Z2kBg`*lSfoD(@A~R=LdQu6_EPUCO}q=z_k;oe3T1&98We{
> z(_R*v at cgfEe<7~>s=>$2yG5S0>K)Q%2`*-B?{~iE*g;o7Pg*K-VJ)6To@)vwI4a0v
> zORN28nGdj>QGXgjNnW<zb0ZTi$YEJaIEEh986&^B5K{wgf~t%yNw&f*_zneSg^%at
> zO;MK>Iljnm3x1#Gevgj<rv!B(k>u12cbsA;!B;bpyZ>0HFX0@=S}2P-gzF2q>%C!f
> zqDiiigaYK=%f{L`ni)p8%aB7X-eGi(A~prYa#gzXT57j|)83Ed at kGD<8rO_KowaQY
> zKS&RK19kF0hF0rj^)={PKal&wRj{X at Ao(1~x(l27QOHS|n)AGccn|8oU1#Wo>?QNq
> z`_Qy}ujaW;2e{mlJ|2B;4(~d~ik6?k{J0-F^)WWcLw9pH`l^ts)&#}&z!x5loHj3J
> z)(C504+Iwt=IeHDExFb^22N;4$$HSQv(muLof6=<j=o>p@~!nie0cj|`i1I(z75FX
> z^-^XPu1WXzDtPS(Ew1cowjK!Y{eQ#- at k0OId2<36QIUt=9Ew at I&*R*b_CHyL(nXJ@
> zN;}R at P6vmADJj5_Pb<KQB6s|K*V99tGM2L3^@Kf6>G6rb{6;y(OAh35h7IwnIsB%|
> zk}F at d*C1Q8r(xW2td(9Bj3~zJBWVL3Pj78hiV5FrCOg7tRo at pbNY@}vvK;ehf8f<t
> zqaQ6sT;2hzAWdP-OnU+KyiA!%^KTTPEIIxGH>!3p#^|ff4x<{}muit7dARic4;45L
> z9*z8r6oWBU?Ml=8J4sHbcM(U07$x<1Kk(36N2Mv;<$7paQBCG??F)`Q>X|D-pU&lK
> zYNp|zR>5k#d-dyhcZBjX9dM%%*xDAzU`CgxV-TB&IPX-4lwD)AZk^>|*v-~{X^1aP
> z^Ap>^Jy?o*y6s!qRs)Vr;AN at X1`+;)eHXs7JE3OJxrn1 at 5_eJe(5K<UgimY&)x#>=
> z-=kyOx6-e+E9nL8L+M4v*+nDp{@CK1j6e3T7T=VHV85XFPiYYLi+~XhgHI37<i2l$
> z`}<Zu^L>Ty0mrdwMJV)x$I$t2W1hKOsD_>{YcHYWJCVy2`&jJd*uScBk$g7L=`Nx_
> zeuHC^c4==P3 at 3e%&&}z;HoipqT-tnxQ8U0=g??s3KeKZEEExR^Iq&=>=x0){pH-os
> zasQKkmKNZscG3FXcV!hd;PJ}Vp1W_P#lotV!6YxiFk92d;@YO27;7V{ZR*gCceNhq
> z^GcsgEjZ%v-2Ld^hi=Oui%!SfA$R=PpsXm7N~To!aD7U3O&i7g6n>%B34W{l06PKO
> zeDC};fcy3z4Vx==v$9F2iT=M9WnsdJzSG9I-^+UrzBOQQpl|)qdmk;{6F87!YCOQV
> zt>DU9gM2epsN-Si+e1mYpl9ktmt_BfzIKNJ7Xa3{4$>ZM68dMz^lF^HP5Oa$4t#z|
> zR1fk~n&B&QiX^|i>{7^XqHP{=ef~A%eaj;}{KAhK)L82kQ?h8k8>OYsMQ!sP*uJwR
> zCGp4+ at 1eV3%iG<|u8%l7vVAx0QyoaZ2DwLy<8ht4={~^4ZG`{&W&9q2^Q2ve7Zv!6
> zI)Ue-er{B&5LZaa*ds>koA*eLoa)L(B6s*B)~-L%iDXA$mrF}o?Ks<77Iqf<($<Qw
> zniNk*S*zIVWZ^ouEgRoc9;+O6pd(aRP39%;+ukMLM%I49l|wej2P30wfyiCTgd?^f
> zuGYGxz-Wz6fNjkawzZLt2KvP(xqa3nzczIb`~X#HBv;(R at z80D0u8~(bsJ9>S(ByW
> zleVek{Bd3Kdh#1<)<XP_fp722-rq4|Q<&sNC;A2Qcyo1LYEvAy%1?^VqVHS^^Sd1=
> zm$X?7!Q+vCw1ZrC33ilu1|@tO>+!s3!C9PZLL2DdE68P=+pX|z;~kjeNlv%dx&Obz
> zH9r)tF-F^0psYdo&ySSlxOL-6aZQSxDktynEk`|fovQab;v0{CdL7Bdhxc>k{TjGG
> zvx_#)K0XNYO&qlhSodvA68y`}!rQjZJaFG2XT4Cx7H$)iYt>`_5H;R-&*gmQn(vYu
> zHNcbrH=R2Mx?YV-t-rM?=z95W3FOUiebJ^_h at +d*=kMEz!)%@2;@Zx!$(_t}y{j|G
> z?n;y(_D-oklQt{)p0D5UWl~;Jne at 4vXZ!>6A|nQDtP0GdB0K5iKwr;u%;B_Qi3I2G
> zyX1FrtVX=A3p at u-#P7xvzoHiHN&JHh at p(j9k7WVpE2?|x`?4>@<!#W{ZVJq=^t2DH
> zgx~tY+}P#kSi&{3Ms^r_gC&PS{tS7AHBBM}?>E*rqLXy+6>~$EpDR33Q9>)GS9PRf
> zo0V*3l*k`&0%OzNzbq``&ViG#zMtyRL}FQJ$-g>}q>&gIo+~$m<e0F3bXPK|Is*KR
> zjJRLxzVPHKH}^CA0Sxh(Ailf>@B4f4F)km|rN}QxZm9+#&ixDWD{vMhZ`L*Bj;6yY
> z#B~C*dtTW_@*o#(6qYuqkN<F>uV+AY5O1(4$heUHNpGVOQ{0<J0{#Nx8<pJ!X7}SG
> z@?jOR)2{^uN+=r>-e#dg%d9DqBI~kX#OZK;SN=8P^PD?5F&;j|5UmH+Rsp!-^MzHK
> ze3a*PF>KT$)n%WP`VnqVTk0r}H99wm8XfC%n4;?=g5jTh6I^>+jdLDHCb(QJ$DhwS
> z*YEY*Dao0I8}TjUJ<7_a$K*@>qH9a1Vs0u-ZZp9qmU3>!S>z?=<nd*%i%q~Q%y~R&
> z#y>h+#4BQz*Mfi*vB6&%l-bf!F)j~&!qFcJ()=Ce*`fFG4Km-kleaFEB8Nbrq}@7K
> zxOE|ecz)nLW`EoRpPiC-0b}e#mL_dYbVk|Vj6d>e>^f?hJ0JcCCbTA8x@~u-IMjrB
> zCyetA%lKiacWcV^WVSRcIUhO7d)r$8{|Wk6%@p{7`m`PeX5a|$NW`BJ=J%%+9O7p9
> z1jEY|?sHMI`cxI3m;ug=<>5@&zpsU#|4;NoF6XP}U49t%Kk!)OS&SUE%J;CB0sC}9
> zXu~>qn9O6My6xT^Kbc8o%QR6s$aM~G?Uhgt&X<BVM*r6!PrLQSgTQi(NwQ>z5FUEY
> z?|2LOUJhy#Tag!-__tMQPEURPudwfQ_Oyc2*Lpee9PA5+RIUj1I_vG5`rVsCyp}`^
> zURTvgTMwi)@~!P7lMa$tdDjx^5u#kI(m|UKMhqnX>-Vk-vK~lml=(XTgzZL6mAjS<
> zu;+$%-0olZxTAkv(lx^uRcNPmI`+`>yj<iMIxff9Gd;Fu)g_HJ;J(c8F^WctO3hFs
> zcdnAxO|Tg|p&!?8MJ&sOufHJv+ntI!<fu6XZqZoC>pn$>kl5P#4L+wbBvgL5Ct}mQ
> z{?$-_&uAT7SqJP7xsEb74DewxYbkU62J}~*z}hgN7t=I9cC$#b|C`KOeuvY$`WkYk
> zEo&Sg00t}8_GiyX#ho3z?)o!SO??vX+gWjt4V_R^5iYRSZ;YMZ5GAg5u`$Q$H{-uD
> z?%dS+F1&X&V#MD-T>I;)w0hrl=7 at l8)=qZ8W8c at hqI&2SKECH+y*%c(`ZnVnVD at zN
> z-7Nv+9IK3-g|h65Iy{Q0-xiBFZR4DO%DMmGqkzu2g}*LSI!f`eRNzXV4vZXktYXvs
> zaI8RXo*IGcV>4xu4p?X1A at woUD@ND4Qb)p83}2FkZ^m2_zSB%>488Ld at Tgh8#xnJ#
> z&}&V#B at YOHLq}}Y4q0#AywBa6m}%p?VqbNB5GJ`Frd at coyz3Tk3%9=sp5T)=Iyv9F
> z_-bj_ts>j9Xy}QE1 at C0V^KXBIb2s60_r$u1Si{3(dEEq;nQ(8dr9)kBPPh+FBoWrk
> zPso2o*1OT}v6AUo-<@#3{$|3xtDkk<QX$^wxr1Tz9WUjl4m*?fHD#p-CRF4Gt!;K*
> zFM7E>y8UC8M($@(Qjfo1LZ{&;_|x)W&&tC%x#Z;!`K5~FYQp%?g?Tz&D%?ge5JD61
> z=Fx~53?n%d=nEBA8hNy~g%TM7zegumaQQ7vT<$5YW(N8?#&xEY#Eht1nhcM{?3<89
> zYXl|QPx%U3f^o&-9lrEM<P$m#U%|BrjY*5ONA$0p=eU$QDpb>u9eG-vm9FH6#Yr5Z
> zOcRdJlIQZn2!{spne78-*kjlpFgKzMCz30e>0Q(5<H&his5&V3n`7bDggVa;U{fi9
> z-ZLKYYw&sT(}1l{%a{cly#%rXORa!TS>#yI=K$=VuRzXO_~2!pxAg0!h~4d|czfF8
> zqPM4YHJ}^<@G6Kh^Kg8YFF+Zr+EG+0?$vYmPVc>U2hUr(nD9Y8^9|M9Hw1FuaO&wd
> z=*a!ZKc!@5aP at G?T at Pzsar3S}^X_Wy-GSV at PyO%j?i%^u??%0x=3`xTz&DCx!_#*|
> zPUZ4)r4gOlxdml77uD$NcY*kbd^_Hso*z4OFB|*n-bY>WiLo8Ot&jRexLI+(yg%^;
> z`ytn3z&^!**j(hJVG+CWA%*t;g5*3TK1<An<lI_dZW__IoZv-pLihN;erw{}|HrqU
> z=Du}0_pJu*TMKd+D!veYG)>|7QurQwwB%b>LoS=z2EQ8QJj6B9(i^dmYb&wm`%2n@
> zeFlfO0vz66RD2EteP at ZoNbbcms%W|69<C)hmJ5Nqw5XeijE8*z?C=UzRpvnz0~w*m
> zNyk8zO#XrWc?#qqFG-oGSFc#BI#;-XpUSRy@>|x`)k0+9K1&cYyNIrJ_l3Wm_HTZd
> z>R)yD>D$&}lC{<*NwAfk at 5my4NQ|#@c<yZIAn-?X#|v2{#&?wJAkM$c`oQN_e4|41
> zG3F}d0wual_CDl#QaGloXL$_EVMbZN=K{R3*LYlOrkA>}b&aLWJ0Xi at pXR5+UR8`-
> z?mCwzd at Iv^K4qK5r+SYMB2KZOaE*^H1UYe!TpL>J`qA5F5Wx2^-*L+}R at OoC8)lCj
> zqj1R)XNR1#h&Qvj6vU>S69K(73w*w~A9LVlN|&afjOb^#7!h)P$yDH(Ch<{T`!d;0
> zFt}68I%cZ2B8RP&m8s~mu;iOA*OXe<BcdOA40C#7&4q7V^Kt(}xnTpA?F$2^h7-Do
> zlk^|t%xzAvIK8Q@&UjvK+7N0luq2k7uK^<?>k_jPtQ+#KzHB&bK7k1?b{r at 3MQ;D&
> z{7G5_w~^mE4%4oMoxekdvSx_EZOg?Q7m#zrZj}8FFF8=|V9JygoUhx}gE;VR;PnR(
> zJgvY0zZ`>k3$ikoI~93M9lqLguvwkJ*z$B#*}Id2!2xs495T#cujzMWpCUqm+$p7Y
> z3364=Br at +XlU;^mCE|}UFA|wUYsCDx)EK#6Fvry?Blvgc2RRJp_<Li*dpwUX`$03t
> z5^~bP&ylUG?2z#G0xw!iALsJUE`tsq(4b5%#(oCzgKZ~VT~$$g(`8Y6x<dQd5Hliw
> zSO<IUCEDy%yW1!`At4O;;-KGpdpafHOx}PvUCPXZ|DEIu)OJh}ega*W<e)u-y?5DI
> zYgm82{?uY=wT;b7CcfAp=)Yd4#v`r>xrSL??MYVQp$^<ZMZ!nQcP-gy>E+L`1Doq&
> z&A=MtIdt at mT-!jE)zu7q>x`8$%~r^+#9lW8- at YqB!0?H`b!8a(q?w(Lwh*@k(}81@
> zkU@$?m$vZfTkQuPnnv4vf4LDyD{j2ZG#3}o11^un+PnRP{#$mUc+JCFz4!kpD((a0
> z>9*%@(C_(Cp?4-JWG+n=?@Pp0+{nC&e&iIgTpq$^VYkbR*t5Og>&-<QxqV`Sj_7;8
> zzoBPXDep at bHVifo{l&j}9D4-cJk~Lk)fMxkAs*d`W&0cPUNeBTbtdklyj*c&#L7}$
> zN5crep~`NU3LA)z<1l-8;{()zXZE|mgm|c~gHMwD-vV8)wbyp=C+3lOGCth4O{`^}
> zZk^@#5qj_tBzMBjCcrq_i1o`0n<sSCL%<R|sqcrdmpoJ74sVPZU83I&Lxbm(8rN1}
> zza?Edb>Lzh*6k8?2)J6{*MiUCc*Y3X5u&#c`53t8n=S?HccXc?n+MBWoIPr4j9E(~
> z1_UxN`~>EfE%3=HREL|k5S at s(mkEo}0mEo*Br-Ai9p3wVU>P-Bjx3x5f6+6?1>C(a
> zQfa+5 at 59>F^Y#L}0$lrzk_M#^^OA=TE0jIV_(s;zSZ9n*zs0)_J+;iG=Iw4!!q*VU
> z>uFT-$GCkt at FSRGy3HXK1!_rPwS9J%Q5~qtZHg8$urpo1jOP-W26k2#Bj%lR#c{T!
> z7J at k@eG}gWZr$GR=0Ee at elcdoS8zsSC;emO_smrIJ3{=*!Gq*3+tkI!NIyxpab>Gw
> zw~?~-mWvyw!c(;5Mrj#rGWf1j#24S7Ooz<A*j%_q)+4%bX>iLR-Y-oYzs~<!7iAe!
> zJ>Dd?s`ud&0=HRJ?>kV}|LZ*l_dSW_ at XIp9XOjpyK4Y*k`t)~C+mhHuFy1`+{u_4?
> z-=9vw8o{;0svWh{=j<*+u53CW;pI}oq0^t>Ku8$|Zi8M-Vixpd&iVUy*g8<ZtS8z}
> zl2Fnh6`C{F at W2h4aIz7;EH+-{qWu!~fk$Ez#$7ea5qYkaJZI at 0azBv~Njq|VEdX^s
> zK5CDzsQaXQejsay$LH|Xk?XU_9IdVM7{V$Ax{S at p4<v)lV)eX6jd|XlUM$p+j$euY
> zgxFs&S2kllOscl3{ebtC at UnYs$NT;OJ=i&l;3^Vy%%(`#BdM07jShyL4tZjWwYmHo
> zhcSgWJ*FWj(bgda&oB6?+39UcdWP(_Q;qda?l at hzURZ;^mB5NNb``#rU?s;=MI(Go
> zMJ4rPH!^H8;sv*J*mjJ`w^`u0yXhhAr=`H|NC!nDo}+z7$FDv$(k<tKITQEOeyN(+
> zTmF2^*RIT#sO;wF9ebR!c!LZV`PSwwR9dr~;5>TgwIuS5?(tH%2ENQC!Xpjirszn!
> z%O&!&%*>*aqM*h3oIPrbV;5UODKJkVo~WqAD|kw!T#^lYA+MiiE2&=r`X$$Iq0>^S
> zbRJcSSp8~Zvt*m6o5&nd2)_%S)vY-w%t3u!mkQ1?ZGOp!;UhS*p$EaI>{uH>RVMMN
> zU3TQ$V3$Yiwde5ul_aP3+C3tMYS%?q+J{CA#J*aS6)_llaF0<x6F(JXr`o3H$@(5s
> zgL$SVV?1zfft;-P81dRYE<WVFgYV>Gjk}9uvt}Clj^sfb at jI@04RO?B6`30+Aoqij
> zovLDSJfd(5WYF<M22IeF4OD?59sYw|1V at E$1NSrXx!dSCvM!GB)?`4AT3?O4=HTGR
> zf8c#7XJ^SClUP5tOl7L4c`rJVTP;k|LUQ_{Jyi$Tt-zm`k#+5cfek|J*9I!yz8-Qw
> zWJH}k9r@(_99i~%MD*A6Lr%jNi0oKf!ul=Nk-2k&LRDr6fn2oBV=VJ!jJadVjJd at 3
> z3puHv&>OP%_*+NGTtRHoJ)W|TO9PD2d*9_<w?D_5VecF96_<-XAR^s92iUn#>I|6|
> zk at sMC<~_cpQ8-$`>0$3frk_dpW(7xfO7Wg^s1L80V+2PCTbax0MfGHiqL!gOkvnq3
> zr$iru9snD++xJCJgU`+nxRY><weaMIj7=n`DCv*$>YAVT at atW(y4_<9dZ80CvX?`^
> zhRxo{^&97O;?F*gwe<**4Z+bnmKhB@?^6BOD-~&(9n#|^z$5DR3E}G*PwnUYmE%=R
> z(-4(2DcaEtKU5X+4Ffw0|Hx8F6~<h3$1K>7AY<-)trz>ry63Wt at g8sDTY-s+3P-H?
> zfo)TOLF9X!f*efxg%`LtNT1-5wuL{k+qI&ihgL6IR26pI8aJBfrLmFzbRYU0`W)u5
> zW*M+^>N}?96l?qX$+8aQ258sb2bMsoI;@$7dYr`RHn4HQ7d4IGs)#?#5!R?Aa=&rT
> ziU){yRNpMaI$ELz?lNu+ at 3!VwvX=70SOr-l=hdPvF_x{JTW6`Nng*kO<UaZEj~qf<
> zU`~}4U_E9E*W%uRi2nfY0Q23BLT{AM#IHslDoGBDdW0O{>F&C=mZ-ydAHWA)(lkVT
> zMmx$Fed8`SM*e#8yfPp0E2K}6`9L!*27ZfLtV0ymP+WK3pCWw?^X*~vG~RXB62!k4
> z7N0YR at q8fnJ_5%<6+3{p8~Hqq>S_E?)O9H4>-g&%B4$0?))~Xm)_D=<OZ_9hDh-WN
> z`VQ{`cj=-%23{0+6S@$S6*`iX!7z&J2OWPYLXWi#e>#U0wnPgozT>;l2jDvzjD9hp
> z6Fxi6?_CI-D8{OKSK*q7^Vsi1T?$YqnRw<o_uM5Y(%6X(LG|E!8c{}I-Qb%THCh3l
> zuVBQPGGsiU4L@~{2iWP+M^HaUx%y`KU92;z*6EdKJ|a^s%SF6f)8Jk|lBdTh%~sxZ
> zP2}QZSVR0V-oRtW+s!sd4eQzhA8RnVj$9A_wFJ*q8zXbBaQ-MWsaNvNz?yB&ltev7
> z|13(Hg}AoEPwt5^Pmt8XkBV_=;@bBy#wL6!)Uu3mkZsAh+06T(tUsP7X{&V9^m*J8
> z4c~5gpGUdC$!7EwR}wjYpCVCngg>kXb+SjZN6=l!7Xy#r=nKAk8@(NT_j2H9O(>r<
> zIk8+Gk(!+Vzk<whkd;ic*=1gG*w416dw86|eD+y}WYHe<IrPWaN5G>P=Jwl=hxx$5
> zD#`V-!_dL=;g|gkeu0PR8)aNBxrcmk^$@uaV`u!08Z!1Xe1L)B<J{zkxwPkv<JbFm
> z`DQOie68eex&67>Umf+M_rq6+Sl1h$Wseq`us@!)bt>$~ZeGZLmx064`M~d=%F+Uj
> z)6-)t)`F#kALa1#u#dll__=G)UHqWCynpHp-4?N1RM%$^xAu3aY>nZ-5X47+$gN8=
> zB6dLzFTy$iUARj?5A)dH`a-9by+y9U{s;UoS#{bzsLR^jCt@#-4fY{8o*J>kzAO2d
> zb{(#{5wYWDIL-w}d~Dy-d(OcdL-QR~;HErGi<2j6uCG*l at ri@*`y8f&dH=$Hr5$>Y
> zrC)rCbKth7XZ7CKjNktF?brLe1;3}_*#zSni1X8Y4&Yv6_KX!HHF?R$P at XDH-X;e7
> zO0 at 53?9Cbm*N5Z!iMW0O)?5jdfd4+jeMi%SaL(83^cVZ_zbB4`yauV{4nz2~=_xp`
> z#d&WWdvW)@;jS0nV_K0=p)~`SHlyp5a}>DdrzPYv!H&ZzeN+X|qs#ED(b?;;-f0D8
> zz`&9CSt94GW0O_aT!=A>;^IpajII5E;g!ru$2tWY9CaGw#)W+m^zDx_#6+j&y@<Rh
> zl^HKW&-TGu6C}6?ziJxokx;<~&3oJ|Cu<Fd(Leljtzp5X01hG8^jjdC?jz&v$m<C@
> ztX-vLLGXc2L7dDW8F)#7Jz$VSXRceeLk`Z9Ezeu4sH91EP&XB*qf)8o9frs={`m<d
> z_tnYM!X%JqWJ9wE7mjv5&taeMRc?>w37RHGd~4tBW3cb?`qxAA^5M|CD)Ee}bWz0M
> z>~+g|_)YlB&uW(IOa4-<jKpy@&U at gz`#r#}C;3xvxYEFH0vUF|i$wnuoN0QV`#rmY
> z67MHEB<6~&j9<h|#&4*PhXj*CFfBwz>pRcsDTEBX_yxkhR4|u9epzE=BR#K<9+FVe
> z{5<d$-p6(EULJk~r?i)WeZeVS1fJnkf;)Ffur?zOjFrybtnKU34IIQi5>JHZE at VO-
> zx9J(hfAqhE{rKWPv%Y~{bD}Zwudh|hAYZR&UI?9NNbmCnyy4{en9ou(-%J>b at wkU|
> za^vxBB8NJcK;FLU2w){QQdnsPuse=#S=kJ8U;$MI-&Bb~#Mu}==}_RhEb)9!R(UD;
> zIL7nfKm}Ef{ZQ#us>JuZgCyo64foi3#!~yqy1)C!gfOCS-8z_HrNb!So)oMN*yBD+
> znV7um9Ts*Q5|`{`Wbbrit*h32%-NHcA%D~`=@duF-H`);XIWcj2pDiESFv{Sopa*y
> zz*ilS(tt76jt$_cyYP`eX9vLb_ruq3o7PQ5N=IL at 7OtW8cbrBUe!`qQg1RrNd+`v_
> z;b4EfO>Zv#lkp#4PJTO0y=66WyyfJ1O^HfJ7RoyjnDA;_kb8}yhk_#tam{-_!#X!o
> z_$k&E->3Ev<OnYqnGnVZiGJ386Sy=Z9iJf3CM*Ak_5<#G{Efx7?;W?*O=v57 at B0#-
> zzAp#5UKZjLuwGm^5<6=z+oPr*<w=Kr7644&T at mk9!+61N%^s{BNs#H9=Uuwy(W_H@
> zko=F{wp{_c_==3t;@86R9FZCRi}oM}0XpzYpJ2T#N1aasE_HIEj+&ZSLJ7(G>1qZC
> znwqS)1eXQu{AvohS}DJ{u at pG-Uz&!s!^oD9^~2{oqJvBho>D58n4yD^`cORvPSB4|
> z<+!`c|5Hb)BX|e&`{DJNHzsz>5*q1z%CB&ZssPXZM at XK&jNE4xaafEV@*K3yYh>L;
> zpS5T|TC}%UzrF2RQu~;ea&j1F_eZXgc=X>Lr2m%9e5M}Os9H%qK*m_+?$g4ZJ?eK9
> zQe|VAc3woL6j(QA1nCELhgrlJ?e-?e5ig)T)9ue&tpfrhvSBMQv3mF+fR!Y++T8_I
> zYluQvg>Til=-JsQ;}p_|J5r}G+R<Gm_QaYV-+gUs4VkcaHuFD)O?a7RnyLo#TSfSA
> zhgH)D_8<`te2th7X3ZIb^?ebGTn?IPWR4*A2dX<m3Ymo1ME-3T*!PTG1@$T{)kICV
> zY4l=n!&^%>g{clC2HZILZ`%$(4CC+fOz<GG&MEsy>~rGosKzeuK1XtuG5LYu{|*gs
> zd><-zeBS_F1(=hnMrHe9){inH{>X5xfBPL^{H;kfPw*%x8{rTbgFWF97)b0Oj-O%I
> zL7s5Lp2VY{Add^ZLS=9IMhLq`^(Fcp!a2X#Y!G8jdS!BcgOXZGux6{|l)gcD{}S at d
> zuox?34Jp$eowFV53e(ybYfRXjEDqzORNW09h_z^t>b%Ru`>AYJ)J4SMT+BSg^I~ft
> z?~n43Hwa}c;%j_dUW*zt4?!nN1 at GV?6=DTp<LJwWoZ-D&I}&mQ+Eo)T%!8bdH4HkT
> zbi9rAfh-m1aJkZeMO%V)9{}Cb%=-zkJZD_MYqbojJ_eiN(xyR>vD1pIA);;@y#@Nh
> z7I7`sERypMa%Mt7L-X`wfrtxXCc(Z1{q7UAA=aZh?P-sX at J&YeBgmQw-Hv(yKBL_&
> z3o3N1=j83cJL#Gh at HgMNF`jUnZ!Uaal?#la)nDT1ux|zKP&%gvcrQz<%%eZ61hz4V
> z;}!jxt>yicK8wFOW1vS1bB!x^H at o7f3!D&-(;lIoX2#?rCb_C{9C8FK07lAl(M8uw
> zsGoa~>o^RJfY|3-7;oMOu;o=?U8n-Dn-O`hIuWm9LjH|%RutO<J*Z0iql&a|Yq<K(
> z^$A-#qO>tHYFsZaYUG~lN7{ma#I at 0TcRk^J-zw_>Z#i^>LCd9{b(Pwq at DnP*OLfkJ
> z?^=&KR;w5(zK`H1VR!d=rf>hZ&G4z6Y$NPs8H0WP{I^X5>mDb2_sQEg26^4<`#jqB
> z5*>Ubby$_Z<c5L6ib2LVAg|a)rQp-_Vbn6iBx}(oCG191Wllq&wdnn6g1^K3fbsEk
> z`~cnlYwW+nzTQOxGj at JPHnC$JcwV&(b~>wC+=t1P!v~>!BIBdo;rD8(Q7!fze)|-7
> zq&m at FQP4|Kr?4wW!sd(ls$rbUf;P}K4PFdi1oRhgw;tdM;(?!w`jpf&sS`3MG2yT&
> zzvw8TbG>eAo&#QAq-sUqAb3;EG2oL=rj*(k(wE7cOzfixI^X%8Ok(tnlib*wrmEGd
> zvGxS=CV>ya?Amg4H~PXZSGg)o8-u*vh)q-nTC3J51ZIsL7(Ubk`sDsz`$zk2<lu6}
> zsle|99eAp$3_2|06CrCUiEc+YM!3Figa0WFV<?CCxZHM|+u_7+vk{ytiQq{D at 7N&D
> z_9B%%#`CXf4V$Vor_ug}T)#R?Y&!IQ=<gU4guj*@Ab99n;_kPptI==6RryT|qb}mx
> z8H@`h@)+lXr?97<?){!)Pp(BB#~_amnLml`8ysh(Jn-$+qCJ at 2vUoiy3(CcFrDDtn
> z!48C+Fs at Bpf3{E9^4o3nXPayIqDz at IoDN=r81FpyJD<G<xe9@)L3s|a%@{Z1!A%C9
> zfB3+Ao-IFYE at iHuMcFNotI61D>O;zfxx&en&Ek3q_4my8^c;HfJ-nYF!<9l7Ao=$8
> zH$@XngX%BDnlqZ`RF9v2|0kq9 at gLDC(GNs*!_KncXmW+~T<&(Klo)>|Tr(E)3GtDp
> z`3`rIxUoH0Pe|-Kcq>({zQcbv_s**?ardQ==Rz)AIB$;z>wWJUyR%nDugN^vu47+c
> zpt!kyL3oNMb?J(EQ|A>6&c!T{;G8_gk7~TK4fyFdQAaY~d91-L%t+XJfYGC4!z)vg
> z9F6D?-yS7cVBrkT&aAmFV6=!Qsh9eI3xM?Tr}e!KZBptQ)jP+iF~`(I?LvLJng&6y
> zuHoBq7=el8O&~dCvUaIjbEL74ddG+|Q|k8ZnuHin=aR3Qd_69r&lVDXOYU1~?mb5_
> zmyICr$?$f+r(3e<V#B!fk`~G0{7gnr4ZE5pgRg3Jw--156u<xye58 at io`Rg4jy}kP
> z*FeMm(lHwHZ&}3lBcfA_XlulPBkQqeaNU>5$>mD at E?SYiF?5Kdt|MW(DSHO|dvZrT
> z=HFCJJnmZ%k=e7PB9NA1jtPb at N=j at an;2;rWs~lr%=X#I_X*|?yl&vv2WJdq=0DEs
> z8CI_Mqm{_%8H92A+&cvZ1^910-qB?!c`kxuw)YVe`&#rL4&EfqQjF`#xK0s~ZBUTs
> zfAF^U0p at rm&QC!<R;nI7>BrlY-1?Uf8=1`&3jaIwd7_&fcurtN{+VjSgs5GC5_jAR
> ziKDX}CT(*A^To=@)=2W~<aEf7=8P8TJ>U1PlP!cVF9AH7z;7;rjF2s4{D+|aWJ&cI
> z=(~1bVU2x!GE=6ADAXPm+c<tzuFMf9nDB at qVk@*y<Ru&A$Rk1cB>tCjm&pY>j2)sQ
> z#b*!<za-*3=1>cGK)=Gi7W&#pEN~^-m;_hZOA(pGK4R}f>VWttx=jAXjxx0AbXtV`
> z^fO`i5)- at 6A0$2~+BO(m7D3{Y4C&%Zx7}*PyV!pvy0jswa1CVoCD3Jl1IIEe%+C~%
> z at ySC>5{Jd`gzvwEm5_NuP^MKwep2%$-4yYXNq@{p>Ydv at B4cnyO~x3~AB#%P2ch5V
> zh>saqNT+ajm|vY0{rEUIKuX=ZN^B2sD-SY4z}t$slxx3u$i$aWM`2tWR%VEa43ln+
> zLp(Tqlgo&2rFjT%c(1*e{rC8WoO)1r%ssCVJxJ9G-|>Tt(H?uXN6|mbWKH4y<i6hn
> z-_`41OLNE3V0|0w0-pxvthBw1$KEtQ2jVGs`)&^RSWIFs>S>3S-oVQyym_n*SXp3&
> z2tFD9%#sH9icFz`jzrHJC*_{OXU)(jN`e;aG6s)3{&danwFRqY at b+E*i<A#K?S?1o
> zG2~OfinFGfMb^Ne#ju5fA6zOn!EUxEV*_G|-B|92+SOR!+`dB>$8q8WFL+=*cuUrq
> zJ0u<!_ at t@{S3`<u&WGAHLWbD(S8_Qp#fvkYutU5w=Zivb_?Q}rp1t5LHoW2#i};u;
> zE5tF7V|4I$S)G0{gvYN#OLys<fr~9E5~{_eM!wNe#z;Nv&<tz^SFjckpV^g-n7g*a
> ze!OA!CNegB=ikjb(m1TbcQzNR_G;)t$J^j4*89%BPju%A={9RaLb93Ua06cBAvt#;
> z{U6rzaSGT)-m{*6lk89VTxyXKn<wU<+y57vr~IkS)8!HoA462FzhB<VNBBc4VN<oG
> zzYCm!tWRy|H;y4sY at P1;Zn_Em;WXy0F&KZaI~t=c8lMkaWLE1+xzF||*QQS}Mi!pM
> zcY+`G%KPLx$}9~~A<lVWB5(%I^s!MkUkPhV_v~%EAp|qv(d|;Nj1<+$E^=6i2y)-_
> z+6?5y#(n*WOmzjeQ&F8fHeC at _>nm}QZ@>EFokYJ342GR>mAn1jwoTv-GQ at XKzN+^V
> zpY#*)- at O=ths6K7B#oSp$tU()&c_zw_OZFY&#l9{OvcDhKZ(hgO9pU0xP$P)X~3Nj
> z7w*xm{gBvkhJ1nRp$iji4{#3(aUtrT#7vxhQa*QiIGay$%Mk8A#Jj+b&V5VUP$Ks;
> z0WrER#K#@+9tQbijtTv*GGmO#UT|u%n&)DBfD?$xWH7#<%ed`iH#j?4(Ju))?R{&N
> z+HEH at XAC5EGI1xkBAv8?*hHfmwaMtm!-yZtr^fyv>|LhiBkXe{`aH31*)zQU^|?0U
> zoIQ*4bG-pO?LNf3oMIKSBP6Dh*r$G6Zf!_G&dd(NS9=9 at yTmOkXb<$-k;b~`fjx}4
> znzKdp72GaFIHKWa)e1usa=Eg6CuAUtb|3N$>`c%>F9oN&$2 at NRI{{99%wM89t;}6!
> zj|mx}JXeFPeHVQL^9E#Enr=Ufn6=XnYnE%Z4=Q&3U5EU!{=97Ipbz43{*3m=<dsrM
> zY!&cBm6+#CZ@#84 at ecxyNQ^aL7M|l+uDLmh=gY+by01HXbJC{ExV{YfRTbpLGr*Un
> zVQ<7fRikOQ&@DXPO_4_oo?n6Ur at t5hy>#ZL5*+Jsu8Q_=uj~*a=EVYi(ii1XVm}G{
> zaO@}J{x)16x*`{PU&&2B-i$9^!g;<PJlxzf@=~OZH&E7tL_g%#fp<B%q-DaE8{0UU
> zeJX6-L4wkz!DM~aV||6)6ZjnUC=P#+`(!@X9(d|2-|wE!VQc&u^16%YdZf-LfSW?N
> z9sc}BWGoH71%7$>#-Tgz)r?TJK4ezpYLDu5q+Hs*D?UMan45k?Z}XTzOA^*<JRMf&
> zpB|N*?3C=5SGO6s^~IJkYtbIECOlJyPyeF~hxm_s%W%)>Dg2A at wm@&*?@A@@y<eQh
> zr%q=0M|Gf1t^TknYuB#~KQ{{P7N)nf1o4t@&R?;c at C%(Agt}C0D$$%K=kb5AN9E1=
> zsN?T&9D at JCv92oxF1JkkRz9&6VC}8Um<nGFY&)X!OTvH&GW}Os5B*13AM$mCU(4kz
> zzRo_oE_e#7G4~ZP;aCGk&nct*D1D(f$3L(b{>8sto`_T3PQ~}A9gG`?fcb9%a0m(x
> zhX6aha6#)pjM0!eIhreweI||xK at Ja-OMU-ER>s?nyj?oORjdUM`5$D`2|e0<@Nvsk
> z+tO!|d4O8x9uvY^ZE`#8ZPo+oFjX?<zst5OiH|!@!Cw{Xxb6(`ui!X;<B<nY1{*^h
> zCD*<v>o&Yg{7Q)RtrsqBcwBK^E%EPa>1(xaN{-6%mD~iT9C3kO;Ch at 0zV~UcOT`Ow
> zGp52Gqo7V}kD|Yg=Owc?V7_S;>#o~(auPp94g;clg<40gk&o?WgUJ1`fjfc22$=z0
> z1JCq~+Af!zsch;4OoM_dKwnMc?AnnYeot-NBi(ZbY!7L$b8&WUe0Oaod)z=1S!t9z
> z{+MYbaW-U*B{s{U?=D3ws%wM3<nGXQx{LtMcI1b$+E^nm8SP*uWql&cZvDEqANUhF
> zsK_b}a?3%@(UCd5a=~96Ul8mC(Qk!+xb^F&a$73wMmpF%g>iCf5^yV_|9&_0^`jWi
> z(sf5 at IW@Usz2Hyu;aV4DTlNfiUWna8g1JY|BUnS&j)?w%b{(&}*7Pm826>z%=2z$o
> z!^&~LuUijK2+u~Y2=;`Bn%%mwmf#VdDd#<@2Xtm)s}JI*a<Ud|0loEghSV31ml^tT
> z at xMBzftMTiGBw_*##(xu$SWSXO9PRw%Uy5r89X8zqx>@RKiatvTu+db at eQ^o<t26;
> zZXODV+9j79ujJ+*J+Qx>bu3%xyLr2udPsXvQ|@>I^E2rgdu!rTyK`!$G-6W at V}6-c
> z4?7$6K}AHwmOpE)%9ggk?e>mNNeJgx1fKse{E{~0g+9pn9+{}e;At|0uZi&;|G-Qz
> zS5M;GG9~b{k7>~ceq}G%EUPY2W4(h9T?bsr5q2BFl?YD)8xTdX0)<;hT?iTA$6!~1
> zpFfcJ`8m6ou5lb+;Pxpybn1{mH?{%(Zumbt(?ffCJ`l$bT-^aR8TV6ET9lD-eSmR#
> z&;7qWB_dqY9O1NsR|Om%53eI;D^)SuYM1J3)r!Ou;H`+y4M at B&xt at y84XrL1@FDR>
> zo#@P$4XyI`^Xf-p*7t#jxbTFar0_(<O#5H at g1;1<I{Kdxv+VbJk6(!p*&p;CzY!5^
> z-^{Ji_0S2f?EpqNgV<vZ3O~+~`h0}>PK(^C<`lEz`;?uIZ&UISFIw#QCS6VD+UJ3v
> zKtDt*Tit!s1#mZout}HsLPw89-0CdsUq#%i82bgq$n${xqT)Z<U~+H2AslW*DbQws
> zBgjSUp2!Ek1MNio-|zFd+$wc=e;%tGZTau_lbDO`auxjealx<ye2*Lh71)1^ocGn(
> zUkq8RH)H=z$h+W_!1|OQB{p+1#At!DkpEP6)1yyRI_~wcx0r`A at Y6ra4TgUa{_%`7
> z*<tuGju5|vAslvarN at wrG2~v at 3R-}np++h?nB%+W)eW%kQ+oZ`@c;4k?Qu=j|NmN9
> zl$)rD48}ks9jL&VTy|xG85)_X72+i;lp~QTmdQj^MDT)`Y?&xG5fG6v85h|YXLK{7
> z1V2`$6O|HinI9!D#EvliJ>O?opU?OAeSH7e<D8xA`@GM2zuvFQ^YwfQ3C2s at v_qEM
> zykpbCBe&McZl4j7n$EHw*!*4Uom8bdk2=PVt&2`S3-Py^zKpd1zw)7aiMu7uY%`{T
> zzpQLih5cWO3fH+(pNmp1rI&6z3;Y-K`*G9*%|Y1q$1C!fsioDpcX6(&6m>q=wB++p
> zSHuL2(#A#;V+2O2fV$ZeC3xhopt|7`YlLsG(y@`nE>*F|yu;$0${|O=3k`l{1$73;
> zR5&){{JHFLg*ewn&VjCZ6|%cqns?PCmuxvH_xtE%K%qUVMlR5TlcqXlT=}syulEXp
> zEitK%_4M2s^U;0fF>tmVi`tzYL7j)palr1c9g>ZIJZLS=xh$cA at k}Ryi8};tG##-$
> z(;({^5tUn(<YSPIf^4pVT$)a>vB0g*#~9h{t{Czm;TqKW9K>nB1?oYt>x)<Nm;VRG
> z!+ at GZ$70{Ejf{=hI>F>Ol#gS)L{E~$-j5E;Xi)O5(@_#Ra(OuiW`!mv`-*<kM2Dr%
> zf!)&T&&v}kU9Ka)h4YT@>({_nYBdW`_rZHuWA%vNQO9e0W6tnbDY+w0PrLij=TcvM
> z3z!jWsrN9!EzNku54 at o}_#nS3c)Z`Ib=-%U)$tDG#aSVbfhS!>V;)tNZRY!t+&TEo
> z_lY__M9%PamdnG5>w!)#AvlRZlm8;y82An at t9NoqURfc**AhHUjRM=s5NB9q^I&t$
> zy#CowuBkN#Ay$%{VFFGb-|<nFmrE;r1%4M`EJZ6!-xC}OyYD!1Fn~7#FE-kRHeLWu
> z_esnJ1B4qtPQc~EmLNFNP4E?Thb|HlJi8-0aO(vBRkkD1lhdd7OM5 at fYVFU-x?ua1
> z at pzQONL8p;|Nr&nZs#^zA?bTjhg*;#l*)(yjF0carsSPDpmgagcbH at j;NBd6_mvD7
> zx+c;V at KqEM{EPZgu_x@%*?iO>yiVJBonQUBz4O~wBH-^Zw(PlY?ELCC{-x$}_?Dw5
> z8^=V2v+o$S2aN8FEvS+aQintx+^LMvS~~e>)EMdD9y2Kx9=R!<e+2DAZC>&Yt#tws
> zsVzv_$wfU^qkFxtwa#Z}WA#(-G!|xVYRuVIK!u1TyZ8GZ?m2+-wEliJRmLig7VGyO
> zuV>yL`tI`B at 2+pC{#qLO?!G%lwh3;LbED+u!m^FH{wL^<RkBB!_woLN+d8Lx(^=Dd
> zA9+*W^tp`+Yp1}OZ>|96y^%bR39?9=V%7SLkEh$zy?fNsq~=JM?gq8mcI3A|`v;M0
> z*bvu2>Ii^WLWG=t!{6Vb^Bp_C!;myTs_}g4Mh5Rv>o2h#Oy*I|?|M?r;3z$k=t&(Z
> z`9kLFJjR;wf>)Bs!P^q1_PE*8=kcgeEv3ujzCwH96J{=sS7fA6MYzV7z|a931UzHP
> zK(*Q}z7KNnQP=RuQ%+1J-^=7jzJ2JBFT!Uhzg|+71|P03yM7d$Gsqib#|FtY_{+p2
> z^9Aos_<CCrPm6GVqbsb?XH0Bt;YIj^qv9{$QlJK48FKBQul{w28gS+mTt7<240sM&
> z8T&_f5X&jiav)Qp8gW1T_v1|jFF(F-<k0(2gu7_}tvcj$zL-4iV9F>1craRtzw==<
> zbZx|s(T)V29CcTX<XaS0Wr~R`$NpIC4_`PC;L%Fg5j%bfwGCtb53LJ(&Zf*-^bveg
> z4k_Z7^(4oVdVu)BMCcV?ioWdw_JV9<b7*4vfDy#LF`|y7M%E4|96%FUJR$IE1n-FY
> z^l!y)GDR#*3tD1R%9jkBM6MD8eOHnB9QddiH%0pJpt4wRxBbkbmIAfZnx8$|T9+-d
> zYO^PF>DNoTbn8W3`aVfl^?Fg#CEsEFgyY%OnF~riAoD%i^aE<Dq(w)#nUs>&<FMb3
> zGTyP4Pa8)|w5e_8?9srelibnKh(YWoJO+@@*+DggCt#w))`Ii)w~QsYwI0I%k=Fto
> zTKW{!pwQbti7m2k$iL&Nmnt98Y_7@$;mLMhUG;!uGIUDbPwlF7<Vw$PLXP9><a$0s
> z*Ml5F|MAlZW{<?=cA8}Nozlq$(ubtJVS5B;CyP~V<vpdF2tU<Gd{fheX857=;eV)N
> zIRU?l&qvM*s|z?%fel9-5c>|7c at F7k;1kat4SiI^_E%~41PcBb-c6SOAWUdNu5(mY
> zEijrq;R&m$t{_elfVR`s at xjSAjlsy3n6&OQB2V$|cYqg+ at FM)uZlsnqMEJ0reZZW*
> zrOvxvhgwH52VVk4MV at dBzKa^|6T}|r{MV0nCpLv=BlilqS;U4>ZvYQ&#O$x78+SBl
> z_n>}H!HSS?<lN=*_otqej_fe?{>IY`&8s~G6Hf3t1P|bl>1Py<B09QH0^({Ujs;Gh
> z9d8j_(V^$41CR&9zmS(#H%y-lZim at l`--j^Lh~ycaqkB01-c;`Jcxfx7oTuQ+*L`9
> z<lMa7Cb__(lW~{rs)>E%P{up7E{GHO!PhAen)>lA#0kiHkUkCA2f5 at xy)J~4ZBh^p
> z+tz%|sGuh2b}ivUYau=;<ThQybx)e6gCqZcaN-Xh<G;n`ZH$|k+3t<L<-*Tg5Z at sB
> z_JsnaA1?}AtR1O*>O?5&LTFwqzm?{--YY-fRTt_ZtR~}i at C0)7fZYX8gJp<!p(A6u
> zxIX{TsOr#XZM8{!oG+(zgad-;d2C*Rkc=^m>pYpSY3<|(Brao*1IKtl0>gB=DYQ?*
> z)>0w<pQw*%k0Q037t-v1+^_u=K`rVz7bQ-k>a(TP=VcrHjH=m)ZO6QOWA&?$rAgQ8
> zkSj0_x|Bi5dj_$Co`>qCYtM;JJ<0kUfnhqSln7|>pZyav^&|J at -o<ynl*9>R16%Wq
> zyy%Cvljc{~&vZR(9aQ^HYP<Pu?u4E~b$H{ePj{GK=>t_sK7Uj#<QRB8uf35ghAi9k
> zQDDA$6fl!AUq^_{H-q at pC8T~7^6R37sP(q8+~CKZvLj4r#(J5ymIgl}_e1<|z<=<2
> zvbb0!(F1%%ka^Grw28#$G$-f$9JX$D`T1Ao?A0cg9?7!L*#*x1W9PZ740oW-`8AUx
> znE)QOtnS4~Wt}ooQ74a7nIqWxyhg-yj9un{Xk(aoR<hiNdI7;B?_8*|W_>+;c`nI+
> z3qkHJ@^8u5w?0r$oYZz<Ms7s3B!BTJ3u5yvHRJy7k3)a=hv$Fw$5Hf0S*i>Aqb*@}
> z?lkZdu3-D47JAHqVlQAz{cN9MS&z9U7d}?DpGY5N_z{`?@)m+^NJD?-t6VK;i@^Ha
> zaMQkTUIs3Wvn5|O>J=*&|4&Ds$>)uF75I$(#7~RmXT=Iv#JO-yg)6~f2r~Tm0`$jr
> zqdb1UPA15)4wO2ik`WR6gwfLcrcot$ri%QyQRR47RcO=xVu5SrP}{26wtBk4PlW4v
> zxi+A!pA$|3*m;QM5L=Hbj79w)$6D~I%0{(htcp&yP9I^}H^oLXE_J}d32VTUvZr4P
> z+<^$&Mh>seRgCCzNL*VoWVS+P%y1?*1k17T{fMv}hyMyJpATrs at aw5&LVzvt3#i9?
> z1b^-|BVvx^z9f$1=t_wn3|K`qNfYlGZt^R72Ni37R{C`}9|N{MEhXYumsEI62`-kB
> z5Ej?Buh%=MhQ;)`C2LLKhQdBaiGrJ(0ojiEVFSs9XZ>a33d=G{GIFwl%!H3b_fLMX
> z!_FhQq119_KxlEu#HQX5$Y$xB9GxopX75_yLHxRpo_~j}+i4=49uHco1X2ZR(z?`H
> z7}?M{PqF9h(W%xZ-Toq;k<J-7`b*o4R|&3F)Uo1+(AgD`_jC3Dmx26YU?S{c7Q~j0
> zvDk_L8?Dv`8LiLO(NYO&L_}~s<Pt5gPQbiu_aQZIY`|&E0+tcHc5EFz=v?oGLdRzH
> z66hqCQLAa$gC^94^-8!<_Hm`RdV1p(=99*^nU5MHn2#GjWd0JDqZV!>>i_=c-$`})
> zn<=aRP0FSV#c>O8+^ab56&&|E?e-Cg)6A<dos(>6KIg*CHod5)MfZoBm_?&*T%KJ~
> zm=>HIAWd0w^R_>DJ3mSb&s*%;cQs^f!Ot#3xIRz#%~He}umxxIju(~>y`Oy3RN5^C
> zTs#agvA4kO%sds;q#Z?lE(ISOBNgW*p$@Z-&z)fke(L93=%?_DBG*xSQ8#gBj<4jN
> z$yapC)F+L}L7ch4_wboo->r{oGJ?eQzWc7%`yOs=^4)sQh`I9KIhX%F{;~@=sO5cu
> zY6(4JEig*!6=c1lZVsL=DS`rzKo6~cq0gj-9K)FSG%?6VUv@#R2<Dqam5naiG|J+;
> z at 75taN40w7%$!@vA2s(%d-55Hex~^p{BOu%5p}GTBCp$A<n3BN=uKkM?6xz$lI~fs
> zLk}_Q;xAuvp~i{64cZ30-LlL at ZTy6L)Y90!_6^|lrPV1FmL6Z^N|Tsha)sqh_FEM?
> z+Ig6-MzB7h9kA8vVn^9G+~X(r6}z~egdTbYvZ%BBUUEV>*JcDhsMDcttX9KMAGs=t
> zj@*<)mq!qt>}s?l4?g#UFSq!nbRV}4&^c+-q6Y)MqgwWbC#s5 at Mj84S5AWI+oP4K7
> zHObtpgg<Etb!f<kJc7*g$BX#O3=zP#0?V>FOl*c6hdghsF+^YvOLfizWKOsYpW!DG
> z#E6Joe_v>T-KYhQ+oC>&IzlR<=aO*_AF2`f1#tLu1xJQz*KnSOA34qB7u!tY_*u3f
> z1JQkm{c2Dlw&gb+I5EBg7*R#0IubarNZ__&o8d2i19?)1)!-hJE=sBom<_-0IAD{M
> z=+Ci%^>^$9JDzH|@?C}AF-6<}>`KEOdn9T|ry6!_nbS`El+oku)v5lrQq9}2FTS4l
> z5bH<O9=0899#tTlqdJJ(=&1?!^f5;sHMXZfj|yE%!H4HDvt0tbrMS_O6|oTfLR1rK
> z9uH`D2pfoe at s9z&#m{(N2D#)6@}E-LegIF#)P%e7Y59*_>!pe<tiD<{Hpm3s6x{mI
> zMe+R+KBG8^unG3vg^7~iwm at HeoAlEa*w<Kh7y?S at I6v|p{NazpdwBhNQ@;n<X2mwx
> zh|5~&O$q43KZkVCMY!jmrS!^rQiCHg33X)8IPBmBxm7CII4+?Ry7P%yvl5f!F=sk@
> zp3={F=LGUMo=e)4Bu}t{19}m1jA`93;0C!BUnuoj)1ZyvFH=c+2PaBypPv=3etBrU
> z9qZ9U>pio=S0 at dv|A6&Xkn7FF9*8pdyk!#mym3aTkMZjv_~C^|9P4C{L>=-F({z1I
> zxn=$lQOC*EP9CNBe&E$ey^~-^3g->9eJQgT_E;S1kmM1c2d-CxZ*K;cE8?LSUb>XN
> zUD%MmZT^w=X9%AWdwyE<+n2&26CBYI1G^pG)~c1mtmc)&1-1CU!|^eWJ62k)UM+jz
> z5aK$=1mrr?a84NddOFElQ_t>MYUe at s{Wj|(6Ss{YRg3kG`0Wm+0=X98+LZ+!VAR%(
> zsKuPJt;5*kwqU%(I7YWsMb(mHJaDf|;nCwS{l=(puc!3%f~lxW3ceWL9`;&#soZ9W
> zMLT;XIDQJ+QHwe*^~jeZea6<AqL!t9g7G0F$DiC&JZ)5oMdWEAeW%qV?*_)Tp71Tf
> zRwC^WR{7;cu{=<fq;4jzQAhMp=#+V|HS>h^7 at KLL4#hffQlXDo-3r(jZV~3Gjhbu2
> zi*lb{nD3u|tth~cG8#GYOQkWC0sK>80ad`J1IK3^i)SmVsC38z^U`I)a$Ji~-Wl#0
> zBs#U0Zwg1QoxkiMo;g4yX`hI;O_VAq6WTTrHc}(F{2~ZPRa9L?`^qWSAEN5OXMs8i
> zYBP6NCeu@$@;Y7qiGNSE`Y>{r;MdafG3UA^=NsglH!_jy5d+;(a~AqkT*BZPA*r1O
> zOs%?GsrE<g)<ihP<{!Zv(Nvb&S?e8=VNyF5=A)j`!&rSS_%1Lues_L*{sY$yW$*O-
> z0Pcp%#aCR-eb)F~>Fm at P*h)*$#@pb`YXs))GW=YZ@}(8 at Dc_0?hKD*`qlEQksobXw
> zAr+N(M1;d#+ at z(0UQsJ-otUTQ+&MdZajvQ-Up*y0zg_5Y13CFs>M0A4?089B6Z at K5
> zF6@=d+C>SM%ThU6eOJn>S9&cxqMFT%(k^Q3`0JaBfR!@jXiS&&Nvq*Q^*|kiv+Kz_
> z$bf&m5xCXU%-Gam$0F1P`__00xhe%p-ZzJk>$~*d!$}@584CvRSMljIQq$s3J^k`z
> z at M4AWkvnVKi?Q at +#&ev^MBX)Bn_5pViX%Mwwmj9;n>6Z~Y}*kAj4T&@yNFtLI^|`B
> zdZ(?f>|-*=QHEkUIJae}tu3c&pohL(wAl3})r(;Uf4`*i9j{G(Enuo`Y0Y=w8*osC
> zrfCZWzN`9A_^xWLR-(pKWeE4}N^uWukE0tlBOf*Mf{h+H8-yGbYiYs+eavUOf<9C$
> zs8-Vt+-w85cbOPrwQdSHDZUcMiX_L+8UppS%AclFPs1*B4_c->k7Hg9dN(%k@`tez
> zm)GR;T$3O}mpQ<R?g+;G$`>%(U1Cvpi||r$+%?`@F7)SK_#PV6Q*FOmpLJJg7rCn(
> z(h117)z2I;jPK3xVilrq4{grOC){#AdB93mqt9-EGvnGUw|DAyN#l#lfRQD-GTC1C
> zF8mcHeuL&?&NC!V?oh`LYWaN{)P1;@Swnb&WOrEE(aHm{I8CpU2kilWqXV|9C6d?O
> zK<e|Re@&lT=a1S7Y+W|tQSGOw1#uo2-&Wo#lJB|EN38$PHUQ6woL#g*1X;2Q^V7TH
> zri^~E(IEu}){~7>ra?zo4=%VQM_yw!V=Q^3mV`iG=fU2(ZfsY3 at at608blAqiRX|x
> z8!_EN<asOwU+fo*9lB7c at W_Q9-g8)9B>tgOx7CtU7PU-eyi985Nn$=F{-Ji2?Z&{x
> zNJnpdRk2B7_&2ybqIbm3aa{ODya at AM0b=NzvQ4r(7G949 at 0{N30e+JU!lOzF at 5qi(
> zLC3Yd!&~+#u#Fd_*SsaPXnzsvFg9t$^TJwi`O(Vng*AAez-;lo at XdL_cJs=Zie)gC
> zp}>u%c;?tW^--h3frnC|#^%pS&8Sg1pY&PkMSYBGh0vrKtB)#qggF8jnUVogKkn32
> zl1J?@VjfwD`Tj76AwIv2Q>dmWNrlN-(=PJM#Hl^;UF148P7dady-67VXS`((S6A7Z
> zHIqmVe9s#MUo2|<%Zhh%gM1&*>+#Kiqi#B4O&tXz at C-3eWVtsZ7b9jwEni^@Us%Y>
> z)9KySYT^3y8Wp(iJc!KA|CZ&qgH227rjfdSWULY1Jz!8aW(*_8P-0eY+2W6!<q9$h
> z&t6T*%h8&fsB>EdzmR%`@(cgIc4o(N-Rjx4hO!OF4Pg5rzBwJ767W%398w=0xE?D_
> zQ#c1it*Ufg7}b;*)3Y3XGL7)Ln1D~l`gqM)?kaMx9cSXfiOTv%e?}d#F4R~%!1fjR
> z5Q%(&P0|Ujl`+o#M7=%K??oQvhoWzzub_P~Bh*6FkgeZg8i6`Nq_*oKpF at yS#l63_
> z4a7~BIf(y3GinWLB(;|IO4c;v+dM|vo$imAU${?QdU$E!V!rKR>P5t5z){3(p)M*@
> zvfOl2 at a#_}Z_<J%8?m3l#a_;19EfQlf1*p7a(W(fNKelgiMoMaSbi+7*38w<v?8uO
> z#PLd=XAW?F;CRKm4=4Q-R889a^be3P;B8F(il)II+yFcg%judp=kffBcg7>{qreL~
> z8GO#NJFuNQ(00_eg>A5?uKJNE5Pgj~mHb}}4$ZHCA3F-Z#18lmYm!acAs#WpX9&z>
> zxxeIEU0Is!q2|f>q9G2Oi>M1KeT;SA7{-k?DcKr`F;75FI;!DcjvKEa-v{|#!WY{l
> z=r^O5huRKGF|dWQhh?j<uBZq|3ntf1xC}i#$AtGLYCXE&q(I$=6!BL7xm5KmdC^_z
> z?14hvsK(h at XUwlKV_XlDet2Su&?KF^ra^~!-dUFy%gM>~9n{W95u0Z-qp7!0?_icA
> zm6xcSQ1M-#NPO&nd7o?9YmEq6KdGJCyU!8-wtQ~tK_4%0KX3WSUs~A at c}jhTxL7^&
> zJekXaa{T4jYRl3pj-`oUD~n{e&vNliw%W?dQlq~Uwf-JnwgLCYJINTPr=z`r>+-<+
> z=h*h9T3_A?Unn?|*giduyz%Od;rf`;S)_L6?>w|4>b+&clO#VrS%z~)kaJ2MY7OQ~
> zBlse}5`rTe$2`UPKzqySYhvs(){}Wp`=b!NmV~Fb at EYo3Uh<Xvx~)BersJMMenCI3
> z-%*rEo^#k$?xoc+w!yO0KqKDelB_}TNzIeM?se8xo9sNbQNhMS?RZAKZ>L`lV~Bm%
> z;6ebe!!_9bXrH8oPDVZwx#pA6tj^DIs8C}w4m!{Ye1~>E at clDF@qHByT(s#2&Kls8
> z?=KoSA82xT^y7bgvF7ziM~iaACdBRwb;{NGh3??j8V@`LpYu!?;R+Xk^Uy20xlO$$
> zO}lK2Li-7>yN~51J%M>3nqd4Lo|uQevQ?+<hdzioC(*Cxrbu$365qWtQ;b>~SKXyM
> zTL at 1T<m-s}SG6w4(NCc^nInKNvvQvT*H;U35p%XBp-?0#2?O5G4E$yT at wr<fCN at E?
> zr#a-{Yg6GD0oz9e9uU8k3$#^epC?Vv_XPH23~;29`&GV at FOFx{(DW-FG(8u5*t6Yb
> zcY77wAe|3+zc-pR=dE=K6U4O+p}R^qi8Dtt8?yT+&K$z=kouDhaT=Qqn8Rx1aiwXG
> zL-xbgd+?x?{_6LC{G%J8uYz}j%-ghc4hC+aA2}oPo at mVteUvU=2Hv*oX3Ph>7;jEm
> zh8($Yb`tCH`5N<-lHeZ6_mZxMtOYlOdg`@2<c90jF<fs$D9bBhNm)qKA0l5R1v=1&
> z5rk7hpvz>)lH|Hk=9)|FK6<m2<yL(MdO|JXMm3xxIuUfCuZ8uxP<FYF)j#ixV=UMn
> z#{*}~L&%rI at XdjDe*TludwYfOyJq5gZzKM&Rd!c8627)!*K^b{Jug|jaBO*U)ouHP
> za*cLsqf%lgG1AlUDXn2P%LX*E74k2I<uq5c{Dra&+?ixv_FIW>1hy<<G1BdFJw4t<
> zJd2%^7C?tU?Whbfelq^1R6mRnzh6(n#wgT;AW!_f;JC()bHOzLo%9mH+G)DUT$gZJ
> z)ao^c)RndKgq93{{?az7>^{cWFTSEbO-WVPe<6B?Hb3Y!@RQ9jDB8?HBH`=KG5BX}
> znsTUbE|oOB=F)vzy$3e`+VFQor=+L}E4z!ibAw}?wPri7+?W;<N&8B!t=9e-03Xuz
> zCf!|NW)zV1kI+A_(+wX1Q<5^jlwOh%K1?b3`KV4zH_UjvZA$nkCG?-loh2>)$H;w>
> z4p(YQnsf4SKa;9Xdo>cg81?m6Hbokx?<XL>wLGR$URj(~V$*LFB;V^@TdB{g3P7$f
> zw@@c1vYF`8Jqxw=g~W#f-skI`y^0{CZW7-4*WyU*i*}3)I*jp6tKWm~WGd#5!{A#U
> zO_$FPsW|8e9`PVIEbW;|ZC~heRq)NJ1bcMIA=4=YIl!<LT1O at y!F5gG9qYlhUJ94<
> zZlM2OHmGEG4XC?LaMxKM1#V^agReLrh+3y-vvM^U<CsIfX)<?+Ex?~6r+~ALi4YWt
> zB;Q;h^9tf6-O_;WhFimlY_70e9-*JPeVy!~74>@8XE?_Pj?WZHF8wiNm+T^T$ptQ(
> z+qx9vVkskqoEF(~QqKby=_&X!33yoGgd%)-_l>K0wn02c{%SwlAjV>m_7i?+rYQbl
> zk~>wO5f8muL}UZWwc-{bPbi1%Cw06}RajBqOjv{%&oV6^vd1p0vjPL13f^VSNbr?U
> z6{F5;TUE9hw%>2Iy#v;X<_qxSNmKev=rcLm8mi=dd5~~8;Tzr0*ab(mRd^rgxk11R
> zEZu1W4$UPNvYmU+0$&#MKH}&i*+Zq at wL-!LFy|@08{#|50$?LDOhWPCk|3j0+FBp5
> z(`JD$_KbQC>Gx3<pCz`!fI-R<P-Kfj%#MEfHPp!gA0WY;WZ*kop{z<_M5x_{dH{=8
> zz(%ry|E8p_nGp&94UWJ<Ln!p+6rm|ViuztEtQ&=PtQVR#;uyama(xH+Z;+>7Q5)fF
> zRVK$Yal|#g`+Cg1S1Wg^-Nj9?i_P#&3XvOrh#AAZfcDc7 at H?8o$uMw{%1`94T;N!Q
> zw%MsB)L1~SpzX at QMSnAFGsyqL6Lg{;69c_Uaf7OdT;B%Sw-mB`DaQX&=;mx4Kh*wF
> zpa$pf+BiKe9Sxk#25uS~2X5uvX1_HBuHONfV6qja0wWsj?G_AQOn!C)VgysLJc;F0
> zEE^-kZlQj9_OZxt95bz}2J6QoL$DsG`8dFAHQ>K4I$WoWCj0%ZhLW7PN!V81hVAtJ
> z%_?rutnjS{f#SL`lSl9WP#OP#9EVu8pYP~DjgBqkSZdkjFlrOz+SHpO#Gp^i+>P}~
> z?0N~X0HWktk;LkSZ9>?Ol~_)W9`6>cUB=l9eOcQD-0T(+_rl|E;jK}~qXY&J&(#$@
> z$}QCKrmdPuvSw!+ at Qv2uesy%=`^tNTYBh3?yzf=3)$o;sB9>kQy;5?DaNZq2A*XG7
> zO at YYUoWG3m;TCBoK~62^UeRLC#h6~E)lp_(AGe7l#cn$AG6NHd_rSf9-Hb6s@^4cR
> z>vQ2wgf4^JY~*~}Q6nM_ at ABV6^NWbcy&$$W&&qc0ZUey|OMXEvw?5{CipaQ9^QN%y
> zM#!dfzM>Kn^h@^G#Va5~!b<2|R^BExR<hTjX%*p#lQjKQmfE9FS*)LNz5~9Tl#<+I
> zA&mv=B_7jbBLuYBzphX%n^cGI?#Phs at T}8zfZSOM95BhPI$ctNbE^Bmqa~7jm-xW)
> zwqwT@($=@rhT367o4Q1jvo6rd&|g3Q3jM7x^+ykJBCjVFIfMHMPmsf7KAxGi(_V&;
> z<*?>7xZve<`Nk=&`jm>wO0^jOLkJEJKDH2|Bd~fF`1|QoDG?->`~+ezvb$P4Ff>7&
> zG!nywUK9&%S~L2yAU%|w&k!#oHsAPW=mdK-cG!BbN3*uUM-5DYCIq}#C%I{;IWoy1
> za%<K;FDNH^19ZoRlowc8d0cav!!b at xW>D`_7dQ3#3*pmHL)_11 at b$Y1tb+~pQhMHE
> z=U5?h8RUSa{zS$MU#EocU}pn-7rfYJ$j0N^)DmDEP;<JH-B<BH_a!^`-2sozQoAQO
> z<?Wm;;6gy{CbXG{HeZR}yQ|L6qRA3BSx2(m%d=1ynS58}#HZaRlRavaxraI=$f@^?
> zWgMz_$KGacPI#5gsFHM}emFlla~;utUOsK-HF~FBEu|AAz>X`%O7 at ymh*!ExkTY})
> z?<_ak&9hL>>+aCbi2QKkvsBCZo5)w0L>)lfu3mKNkEeCh{Oa3bYa`yJJmU=?hY|6e
> z89j~8Z9 at 8tH|J$hhjt$F;2n_LIna?%>-zS&iGE45oZl04X$AEi^2i<d23m-%4*4@(
> zYu87)e>vnUILG=5UiZ)Mp%`)WX_4e%8gl{qKrl^jd;xkBiGR%%e@=4Z)R;dKu8{A;
> zyB<CbvqcG=b}DC+ZUXvEhU2LCLg?x<jW at vkVDIlpW#`oJ;KzC*Fklvqos&cS2bxLZ
> z2M&ck=JM?zBW&+CGNAveQ+t+1mwOgELa5K=;CnQNME-?(G4(_9XC7)Z(uk#f&WNdl
> zqK**o3knO=E<H<`G4TeuKh at FoQJsL1BHrh}@Iiow&1eo8^0x$o<CpmRK0^BsicdO1
> z%BL|g+-P75EF>Qr{-ynp-N3-$yE+?ROX8Bmo^3DUjw%sDuYkS<-y8Uy at SH37O0-pp
> z`CDmvlJE)G0 at NSEPsER3rd`6x-)Wg2B{~&$2Dt184kb6|fn`bkS0VAH?oM`I%|i}@
> z<5cj{8qBeI-JQuR$b1XD<{{+m%+PpZ9_e`XS#_1I2lt|7fylj(a)&c2>X7E1p8hfl
> zSl+vAjv?MBw at 7^qIT-2CA2%4PVfW}$&rhgq_d$NOTzG<sxEH8a3(`drdktcT1pnin
> z;isqPeUEWt7u4aW$8$Qa+zCQn2<#4APn*tNZ|6B}sMPbq*$z+6C%8_BQ!eXis-10T
> zR2D6$hTK_8`YiK#@~zw8Hxi;2(X|sKpI;;ye46O5tS=>40Q@$2-}ojl2fnkH==j|C
> zp_h^Pq*8keaot<8huU;u1N_X$o#NeO+j$grzPFy9^F5LGoCS^)f{k%g?X5u`oR;LL
> za*N>az61X8Tp~vj$#?oiys7;e?r=xM!fo2^@h$ASlB_R0B5LhDMA~Br#(Kv-sjsBR
> z*e=x1G%dvcZ-pXYR*KQ4BWgT@$+r>DBeSQW4hbt8#EpTeSHb%X`LO*qmY(9KvJFDi
> zN4j>%r1be0(R;T4N at VP{Lzt7me|-&nb&&gNd at pm*t_9$<JPV$<C*l7YQ at K~YxEq`t
> z$bXwItnshHxZ_jxyG^*p5!P>Wf45Xz>^q_7F1s%nex#1D;ik|bpII>H*T>@lI6Q~$
> zNpNqggG?FW_pqeQqz{>7*z_0lQJIUyxzO_uu+QOVM$RSs9L1<>t3bT)G~ukymWofn
> zK08rEI1NOTOxml|pf0$ao;Y3DpuI|-VMP at Ce6N?l7U!;V$~e-Wm8Z!ZSq1rRir^g3
> z-oktD2<->{X%)fzY!s01;J}u$4SM?BXktTsWV)$X{(`nQNauX-#J`}Aa@#7bf9x+o
> zjS6u7f3^+%3LjVx^6rpd5e2S#a_!d9qj0|&>$+Hf^Nq51k%Qv&ap;EnBc15i7;l5f
> z8*TWKA?J9!4*!%2dPE@^&-hjf2*2)PH{$c?eyCOxT^wx<!yF{JjyQ%shI5|acI>Yj
> z$UNTau~z4Yn$_VYH0JI)!<mJUBc%3LH?Via-?4ueuHTEiBIwB+gZ6lQleTJn1mZl~
> z(SG3L at cswIRV22-T);OK29Bu+*xbuei*Jud`rk4d{*E>^#=s}+b8dtGf#gWQr$s$T
> zR at +*bMUmSXuT4zh0oP9xrBnlIM>kyX?S-GYt2a%QRDinc4&isytla4~=*LOT<QS`O
> zS0TIaG<5f~-8u%o;S at 1)CZ`92_X2iIE6-Es3oO#+K%@35 at cym*@3l9%t91U2C%})^
> zcduzn<w2=y(}non)40zWM&z_{bHGD`=Plgs!hzkbk9oG6^uvLrM6VUK?)iYlvIWwo
> zHYkbQ5bH&fj#21~nzB^cVA&_YrEU|#F0?%ahi#KiCNQs-+Xi7nM`bO7uBdib*gf=7
> z^_lSL`*6bH*IQ=t;9%}wxgaCro`q3I?=_%L>(3D%?tHT~hSVp8 at 97@&b8pn}Y!z$(
> zxAV}t_YGhQ>95~Kd*N5m_~2T;3t{{Am-zyBnL0Ir*ygVRr(i%E;mhi2SY1UuLM)PA
> zE)_3<%>4{~B+^+CCxj0l`obnr>mq-X$me7l&vv+XHsqKm-;4OR>(2=5M6DAlm<#UB
> zi1XK2o9M#zq0z&7XCvR`pu01UU*+`QGw|PMdW=_)?-3ZwCe+VDK0kcS7sSVy3$TNO
> zZ71OKZZl2ioOa4hif}o#i6rGCb-;SUPw*$?u2=gadWSmP`JEWa`F6IyF at C(ZV!wcm
> zWr!&i^!thaE<Mzl3i$ReOgijH0f(a0rvf(PPW-Z=GnL>6KEWw1Cgh%}R|6X%gN^r;
> zQ<nzk2kO*|Pil3jZx%65nr&JUh4Z#KP#c={bBTco<43pP8s;<40H2SznIlC|!|vn3
> z2YG?>6Kv2Omf;Hvef_Q;2Tr31{%JBFxx$8k9aZs?#v6LWDxYH-_j!Aqu>?0aosf<D
> ztbxC_5<YvA_K}``MF$>hZ`m!xtZu3KwqDc@{r7`bj)pPL+oP=^^_#ye#<m`e{}%95
> z3kZf-^C$Pp8EU-DF`cxFa735Ws09k17Jby#FIoK-JXrkje~z78-zCEHkBF>?&X<9D
> zPe#PEw&ItuvqhjMx|Y_3J at 2H6#Vva$vDZW{duA>Fik+9>WpCmZF<$YH?7$7!(?*|w
> zuW&A#D;<ya-?N!uTb^guQgG-{xrvIE3z$$n9W@*EGTx<5uD)qAuO6^9C7Eq`@S!%q
> z-jWZd#6AQD;zwX0o?Lx^GKwUZXG340U+TjTam$(eg?S=LXIIirTSH==tr9<cOW3C;
> z_aeNqw%g!c#CK)u#!|0S_Ioo^@SCcqXKi7*%j$t=-Q<vnfm!36MBZ*KbWYP3jr_M^
> z$G)ApY5uls(>RrV)7S`6>$HW41zN!2q}J5R{(`^iWuiklpUbUfxBU5PMl&8Y`c^K$
> z{7OeD5T}(`4?b>xTiO^I+V6+9^lE;wS=1}h*Fl)W!noX2xh)?tNkdy2up6;0^cEeS
> z&4}L!;SoGvGJGj>lk#j0gDL$2^)%G?l3dLDpU;+<PaVT??;=MC_Mbi~{X>lZLH at yA
> zE#o7yo5x9*!Lf283p8&96+q4}ApRlwlFo*<u=z)J%H5mN!4DceJ*aYL*!*o4$dYv6
> zb+ZEb9=lZIE!m23M#eJMOzLcA&EtC at 2IrBvC_!OgoM5qgQHwqe;T!_C#hh>+vQ|;<
> ze at ay8qb9xyRge)F#bxjfEF=EKP`l0K+s~U7x)aMCyg5aRQF at g#=A4PxF?etA?)D28
> z-<nIo1_JIp88tQ6 at RyNzbH8=%tVusmGxz-}ejPQK4w**7FMT1<1e+|T#-khYwDRg*
> z(*sM0 at 7k!qn48dlJa)6&E-k;JD-Jcl-EUSn-i6Ld=E3Fs(wtTPB>v>K3-PL5 at Jlvh
> zuIx%ZW;4T1uGjb^q#33|Cv6Rw<IJxjGC3j5^mQXRn!7(#OS(5Bw>m<t>hV^KY@^gu
> zUY;lFSZFcHd&V*<ThqosA^H=X8e#n9J~5EXz)tN-66#_j42`gT>s4~Z*(J8j9Z#=_
> zGWdy41jwl-L%8 at vhAh4yI?!#RA*iGpJ`8g<m%lt+<x^v7_d)G0UZ1XQeiUr`eay$y
> zx$OeNMZnYPy7<d83C7$-cpR~uOl&)2Ld-ndh2W&!prf*U;INHW2qAwW(vSy)Tp?w2
> zn45L$e&8ubbNP672Y6I<z<DG8!gfOY9<>GBD<9ZXNMBHe8Pm`fm&tYT%`eUPAn8za
> z*qLYLk~JN`1lQmmyL58+H8`D<hfO59Amw<_a?cz2&VkH};IHIHKG)OkQx6`Mda2(B
> zrZ4IuuW2=rLMgZ at rGBeTU8O6c*zNT;y_)ckhE`N>QuOJWN%-%F|KUUbCu7|odePH(
> zwo$^9kG~tKvK#W7*mzV1^!i7Py-@()Rso4SgUhs;xe&P*&odA`*^Ts#NHy{%Ju7s{
> zWdCQW%pDJ3Jhn^9ImDy{X-Mt3no~iC$UfCm<51&!)y5qUJGY%GC9zI7;6rT9T_d?R
> z=tf&0*J~Vc&}IFg)4Yy2!V$zk!0C^;#um0;!M%cb#ug$cm=xjr<eIz8ot9xw#6Ijr
> zj%CVWJ^kAA!uNG|5g(iYneK_Yi$2|j>QKx>ld5QwhvG<ak?Ud9<2g6+%zM&E)kn1S
> zyH3;t`pvv0V!(XZkM7yzUt(D=f&Y1!M-}3cJIjvJ)u}4=-#MtH#>Y*(Yh0UFPoNt%
> zDb<F@`KfB2tysOvR$aWgv^uNRRX3DJv at B9`yBYZRll=#i-GGHgz4d$QUR(!UKfZ`@
> zR`*Mj9l#13Z$)t0$ac+Kf*W9STuLxz3L#tW4#^f$OSV*reEA)OgKskUv^ev(LC%!`
> zXMZ>~)mExbvSq-xbMosD$jbhpY_g5)Bio_N*C19 at a0Y(ip<|*lf2WoiJUL~smkMD|
> z|Az5%SvxEqbHbZSk>sTf(c!jg#M$Y~OlQr*nX*D%i1U7r&)@Eg*u+#|j0lG)57?(x
> z-a`}eOR at Y>3EYh#gk5h#Et)c5_)C!klAAtBj2efKdFCn$!7buD*hzE at vfsH~7y~?2
> zHT1$}<a3-d5Z~cz$n#hVo93$6gl{2ptK>iOK>i-1o`U~<jJ}icKgMWg`UQ;95&tnp
> zpGt6GjAl8<=&C3?kMJx|4seYgVt4}Lo6IqaZPf!-=;X5qjstDth%JySyD%;TF)qEC
> z7dyufn;4nhmBam`XKv(k>A}mxkRMdvMR<FIxqo!kM*gL_!WBGdT^@{iW(V|+?NYx4
> zQ_ at uGF#c~PW6dG#voMp{vDonUSj0Fq#Bmfj{&*P`la6C6uwI7st^R!5(Jp_Vs;>7N
> zZ>vMOeqBk8Mc at S%oKZzW?%0l$QIWlUe~|6qy&aCR{vyV|uk7lB)|d=jrxeE=#&uvL
> z*^c1;@a5SGvD9H%fF+sZi?P&WS%hUJmItvsracFl5s2$~V;R)j!VuePLS!!X9ahVz
> zV^|hrS%KxDKC5&t>X)#xL|0CHM+pUGA4j&?Q~pbaZ0&lL{D+;Hx$(6jSzuHT$%2PZ
> z|1AsB$oq%9*l-4Z7|14YR+D;ev8J6;qAviKa2kHJ6hR4e#^6k;yFw)SS0r$ebmUFg
> znUX7ecS#p+1Hb2Kf<Yu$8as06>Rj~n+|Tiz63{>K+zYTl_TyQhPhR?f8N<mhTZQeb
> zu>XDAUUeczL-a-PAnw`m0r#?6zM{&cq+loL>CvIwg_zsSz_}TKF)twB^JnwL7U(E{
> zFyQzkb8ptZc+}V6e6n=_{*EOHg{YfMzm}KaKs()tZx!(o)4(tNrh)UA?=`^PY4r4~
> zofxN>J2fK(cfq+Gfcfe`#s>HTUIQjZ($(DM5_#IXYi5i{@+0TA-LFa|`z0Xl1M1nn
> z at TyzVdV<-$X-OAF at 9~v<X-QYi%=VRZ5+0qe9EgXir_l`?{UT3yxkPiU-@~UfjvLqp
> zzbDa|Hc!L7uT03bJ`0(Q+IW9 at B_D}2Qnd9s%+FG+&!%Vwb-~c~PScb%Z%S9E(wd3!
> z#Tm(w^RBq8J*QcRc7r>H#EL#RC5EjC{N1|vOK9_ZI^@bRWAVPgGx}<b&`9*FtTAG6
> zMRWFMe5|L}px*gwFG9B_&-yX;jfL*j*?IU>sr85K86}3 at t&Q|2k38yTg)f;*Vm>p9
> z;7?MaUxU2i&w-g?2acfzdWmOg&YgL at -DN2gm+7toAKeMOW+(1Bys{;$$@%;#zE}nz
> z)*DFrF?wDXzK2)$5qyWhJvLA<o at _(kzHn&KC~%wGj`e|Kir9m%CX>0 at b__AWUmwS*
> z+5EgRDnCjhG)09A3%fYrI1A>!2yUt)!0&;#FdlhT-3PQq_<kAqVI)G@<nP2VAUE!1
> zfAGCH{Q)`nCe8)|hpp31PyX5%44E~S%V%?ACAK4(jG)$e9dVWRPs$wRVQWt0_bkwi
> zM82%#?$^Gv`^_Xbm_3K|`xe-BHN<}9V-7&<=woV`g9jUvv<ckrnFkv!$SDVRC0#B>
> z%{SuXY^U(v+#mZ`aqhvocE&iN0{NKmA(J?rO)2WwJHKqh!mGq5pYbH*z2q+D&V^UW
> zx1Zj{`3diOg^pk~B$GdKjy>L4T{oZ3;1R3?-s?8R_{rQMIeQpB*xLVomiT+PUO6}f
> zz|-vU8RmrlZ at j<u4LjZsYh9e<DzhGW|3Ye0T?o~jjj<K;faR*Sp*{4^zq&QI3#oj}
> zPwyc92>S`|@H>KiC-vm8evP!_N5su1!p`_{8Rq9ogAe2}S9ma!2`Yt7xxf at aw|_j1
> zowrWSngqQj1bU6+_l-NkI%`jrlIQQb1pkM(Ni`9*b1~-8 at 7wPWwT-C^%CZp~9`C4?
> zH(J-uFT~u0Tu}5w5qF_U9$y35(L}hE|EF!r+OuqqEysa=KyD4OhtcLHKjW+l5{t7f
> zf-Ob-+a%^%z|5!Qh`W;K`Gx`4BBMe{_Et}sPDW~k>ghM9LH;108v8G?&;IuKW at 8BD
> zXcw}_b?As6Ww*24<oE^Opr2AmO at JSW><F0j9knl4M3=u$e5ECH^#YC$FnxK3P(Ry6
> zENifA_x1bPk}iO+%3o$DzDztH>IM>>;JI28<TvDEg@&1*Phv?<f5bRr*#^`AFzaLZ
> z3!OMax{AeU%{<+Q`^>Wiq+YBH%(~8Urqi?EgdZkcPtP_&{*HlNV+Ceo8ZdXB+>Ij1
> zX>Z+R_zOtgpp^m||0kmkj5&2G1%K6OAu|T?=68twPr?4DVE<G9Mjvk{d6=SB?sSK2
> zev|HL%nMfuCmN3 at lKiwbT*mWab(Ce|J>)<9JOmFg1?#BK5I=Y(MO at F=#Rd{9$Fmlk
> z;c<R)`k|jcf!H_v+^4TWhfM>gG_X;SyGrnt0+)ck`5m>0Ss!KUhooP=HxPd~!SZBo
> z1P_p;X92?`g6B29#qJ4y86{`F_KCoTvX2`J)$heONWrVCn+`nDblDv#@6lz4r~(`>
> zjRorWxS#8ku`R&H_LXh1Sq6SWeU`$0EMpbgWvIC`lfNZXQd;=5+}oIG?8yOsCTFvl
> zPn#8-JBa%&z&AQ?2wwu33Tzy3IRC`m;D`Q+<aeQe-^9`n%lRb63C>}^Qp=W&h#~x>
> zLXO?Fd|%N`)MxC8H4vYZ<lZ7+W!^yCsw at pS9O4r<d`z%T`k31t!umKl;&lp}nQ+Xc
> z7l^^_M0_`+Ue-MUERTdT!k0Ct7yieM at RuNl=D at q$r5la-X&`*!0j(CqAx-KK&YS?m
> z`7rM_5g!nv_W4Q|h<l7AI1I6FC~jH3F?1+y83BAx2;H!rjaQDZ)STvSCow|2gH4%>
> zW~{fX3Ew{Pp{l>JFG_Ae?qI!iYB&11vD#kKn5UL;KgaXEL45vc0;(1{8uSiJz+d at i
> zU7Lz8x*B^TDRb{y at mBaMw~9K}Mj)rfjD8HoIAD3i at qA%A&d~FTeU6g;!d!WP_{u-+
> z79T>KSch0<HLlly>zSR`iyzcY`}>)W;hFFZE28ks<hVv0*D!P(`iQ4 at jxTq9J9$=R
> zkm)avXWrPSMErB*Q2g@(pH}knAR|216WjGlO+tb8Q)*d|AGm at 1dKSP(LgP9MY;DQq
> z&gV~h{QL)j!NK#de2ZLbfW%Vm at Lk!*OEIrt&gK|Qr)*6GyJlYmS!xu<gzx6f2F}O=
> zUoMF?=XPxzujoo0ud))ZU+_cx>4iMT at aRX8ack&as!QjP%t-5!uGw_QzLqPMZ#j<p
> z*GiYf*9R=IeGPtbBa`T^P%ANx=Tg19n&P(%<|S`e9^*wlXn1dM7Y!fEpHDf!YxpAS
> zGW=yX;yZ1${gG;|`dwYOknRn{|CUC1N=Q$odWyS|<!FhnpnFCEV>XlXUFflj0$jVN
> zY}L5toicE{xVuL%$>S|#o7Th;GFuV^8sCZl=+Z{W6V!rR-D^;#n;2=*7U?mY{`O9r
> zIrSoZIN{xu_)fl8NAxTu=cRhtPT2D}M{ldemedbyy4$1cb}<BZJGSD}j}-)iNs0C#
> zCgVsMYsug2x>G9s8useIaYiu0DD~^C$j_^2Ipv$yAe9X4uJLLc$Tm&YJ3I(p2YFh^
> zS;{t3_nbILN{H`H;E0nAKv#N!fo&N7=@7>Ad0Td>wTDqpkvSfs&P3lv at hARDTeJ3u
> z6H!@jQzfXcILKJz3+<lV6yjrsefV8j8g$Z`3-f&^RAir=D7&k1;ie7wmJgA5?GIo6
> zgY7fsfS&`nK8;;qAu;;&DNemYB<X*H$Wd(w<Trfo&>yQF&jXlS`ZX at HhlocXCdYjK
> zjd&2_UdiexOk;JHk<1sRh+petybcigE}Y{7+&}7*9fYs at cjytYlc|HmMrOPSmgYxd
> z+x&rj(C2?d%=&SBle`n$yVYYnbX54oiM)I62Qt^qw}_iGZ?V2iGFS149Dpp|l=(`+
> zAjv&IoYn<7DMsiA61CFLNHF)g0b<l}T)7+=PZKb5bBmUM|Kyy_@*oiN*-zXH+H`Oq
> z%59T$KO!H0>IC8!dJ)f6Xo`SsguINw#p0&kw<jatpx>xgymu+Xg=#`wcmuOmAC(({
> zYy8SxXpQ7fC-Dn^`ASM8xpl(MBV1yr4f?%pxb_!3PcURWSt6GH%1(S&$aD6AzlRa6
> z1rN%PUr49gOuflYY|`Amgv)5Bk9rB({QC7>z-=E$p8;KP40oYAf8|2RGPD1(yr at Y_
> zY|Z`(-b~!5WuI&!;oAew-9v|%RulC1sQo=;ZvEnQytl90NgkFF*bn3UCd at A}0>n~u
> zFHk2j#^1+&Yxok|S&}=Sz6pF!o4b!O;Elmtx7*(f*FQEK at e)@H^St;FY^kWvY4KmN
> z-mMzn(bsQie+hyg1Z{&IHgM5E6MJ*uyzK__fsLnDg1c&q;1&~HQSfF6bspE73|sAY
> zhFA5wbOf2pN2ch!acmNKU#dNjQwvESGGmeFDEVOz-X*zCE%T15sBucX at k}r{Z{ah2
> zGnfKL!%BP;o|Ex?46Tps#QZ%EG46TrL(W6&ex5^&p9JgE at SBQt1(u=wdC2{65Zi7}
> zCNKmF*c=SzaV5rnI^t1Z5+66XHcm!o`-bxxQ>WVUHD^5xkRiQNNq3cX9(^QhdQXuW
> zIE^hS9yf at +NowAv@@;vDNnA at ywKb$B*$x8B^DSzPZNPiR`ngHC{_?5FRZCR%EFifa
> zb53`IyB>b$o~i)#bktB8DS$rxdpj@>`5B*xcXSPl{KlF-bEZhr=4T3_8rhgMc*P9v
> z<XAoZ3155w`#j*6FG*cu%Tr3Oy_wY<`Ayfb=%=h->FKuup8?hw7-$9Tf7pt%iS8u%
> zMS<%dLcc$ubKVm+>+jj at Jz>XXfL}h7;Xh<9pq`iHyw+*+`XN7 at zgfEsa|B`lz}{cL
> zzRS3GC+uEe4T;_RdnLZT&se*61F?J0Oa8HY+jeSyKtIElj9o7 at 5qmIpCTzO@VcW)L
> z{kLr!JA*QV)1eAAk?A=~>aq#<B7Kl~DCh`mN#M|K_~>5nw7_nsXIl_c8-wLeT-z7+
> zD*VrTZ=hB-jwAN!1_#kW1$TgF*+jmdIq+>|4&c2H at Vo3OsCB$}MTEUMAtlX5K at a>P
> z5whS(ygzT)cO?FSe39>9{|jICZRDBKl?gO_`6T8`zg3)YnOQ;o#5_-ln9nH0aM~0^
> zhR;42k9<*Q9H&h^8gb$_of`aKtD7nFYUDq at KS<>zUZSq8{x{W-G)Nsx_p}*PFG7Cc
> z+en9f`$n1Y5YaJk-%t~~kClgwq&_sMSAh2Y3;r+C2Zb2BHgav)x_T at T|FNBT(8}6X
> zm86YxYS1^%YjuGOuJZAFL2QG5<8`5dJ?1sy1F}_;?*N>H9Nh at wZy<gL9P at p`<t`U)
> za at Vum9jK%F;^k3<^D}mE==uCHroHjI3|W61?On)T?-Sr91*O#+|K-6r<j;JL`qa>+
> zaeZ&XgThf at OfDzw&)A at +KR!b>I^WIcCf#Y^UM}*R$$SQE*koYC_Nw{UC-#0Y*^)6D
> z at ygN3)6Mc0)XhK*y>ir6<Gt9}`$y$YwX(drL?kw;p6#Z0P}rV=?Z+$g$o6uw-4i<B
> znjVLG^!#lO at IEqX?#s$mHWE*02B$oJgv*=g(A-OojSbb1VZhk*RI5iL<}EpA#<QU=
> zALkP?Zr_@~;@A*NZUa8frcazobz`nUO*iVcbq*J@|JO=wTw=>q=w`(-avjQ?tAM?x
> z2Tviea{Ifu`QUb~)vjDFX8jRde2WL;8&M<S5 at HfuhSZP>CBCsX#2BeV<esskAeW|q
> zCtd~nbPP3s`n0EqY{_D!%bF0zB6C3YErk!c8d%r5T~h9IHA?6iTws5!<Q&0mobv}W
> zokCqc)N?BiBK9xj08f%>#kWPSi*M`G7XDI#$8hfR{E6(_IJ9qj2e7Wdy=IC^26OVd
> zZvlJ$2weI(saEU0?L2vdqn`4SCvNCagDbBg(B??Jh<udk{f^Z0f>Lc2a9bW!2j<Ts
> zj8A{FS`0ZZ at 4w4<lH3Dfb$bf1>0tzmWvkwZ at w50_GUs2zx5C@N=826(tUySm$)DAp
> zY*Nl+V4FUr+roKnhh<WMrgUDLujJ=)V9J(j*KukafG10}!Y4MTrTWobYJkMyh<*jE
> z?P1{J^><?Cz{kG)2;rLevV!kU at TFxN=5Ny+?<-1)6SR;Tj7|(_0(cOw|BUndE5TWl
> zkPuGrpix;G=*i7O_=S63G6b=?Qgk443pP$8+*{Ww%hGUciu3-1e>~2$;Iw3FSigic
> zQ^TjNn{b^I#J58FDSjDa?{D82K6M|#Tl)H4t4K`gSwMU|BFW7nVCEK(`xa~xBE|xr
> z$p+3Qr%p%4H8?(>5QCSsCkD6{gUSy%>VB(Y2;O8?=sM(j!4DqcHo<A9 at w%Z$-6S}e
> z)UPI=gbj7mU)}?G_to22p2PAz_%84cWOrDsOgQ_UBaY76B>S~?<RbV%hZsrn|B;V`
> zvAYi6c7{8+xL*^at}6cDCpz1c3!MIgU!ouDjZXW9y9n{XYScY%WdC;v8ySK%<f1S9
> zNgjZ(206wo*W_o=yF}l92;5nGv8ZF)XaCXeCem(lucgW8KO at Vf>^0=~xI_FN%tco{
> z_(_Q$q_>!ZTpH+nSm&fC(&cXxf5>+DLxOzzQB&6vx{BJEF965-D)>UwjWqFv;Mf;5
> zBf~x?ev-;@KH2aG6WoXyzOTYMKVcIYC!f#M)35va>}R%+=XH6cc?)uZ<5LJ<Gscw5
> z*>qpXm at PPt>r<t9%ZU%u*u=)(RTyI>J_dq&TkPr6&?cAN$9EKMP`X>nHlc0xoDUrl
> z+~K?AfDFXR9vZ{r??g}XEYx0#zTf)^;$0$67Qx<<=U+^6-qf;tB=0NbK8tZ~cpo{s
> zBySVnA#%z{-X!sXl3X6{D(8E|+=y at H5LbMVeHRL06UpBqxSY>)@KxH$`z1R6t;OWH
> zLb3Ckn;r1?H^+_vE#j|1e(>dt^aKvY<5QhGd?sfhM??ghLbg5kFP(rY2FA<|f6X=>
> zYJQ~tlzi8B!ZqaTp<l+}UY|~mg>9V+Ja8M at _?9k|9D|&X5K<F}_!V4ob#mCJy^xQG
> z_>E;B3F`>PBi8%ub#nx4>){0FA+}^lo%j^B<XV+=ov`umSTh at smie;ym?dnU5_pH)
> zBmBdu#?za-BM{FXrB?Nzri5*?dJ6EVWkO481#16*e;~WenH$@-iTg^|OORR9BAc~4
> z!AGfpt#v_|iP)+&y%hd7(GBPtJ`;6r3l9-rvB3?#;H3Y=1-M&!gM at cjEI=MG00(#v
> zik6OIhz|0`F5xZY0H>>6Y&Uj-hgIrv)3D=Y at -(w+tclnvBp$I9`B9mj#4p}xX8pga
> zAs at 7g#6e6m|Hd`wmNc}b0t364>O&0i7wGXJ%xAbqX;9%V)E2=1Cg4zhVGPt5;D%(l
> zrUAZoT$kiO1T@@QpWMeRCU~|lw&|EyQ^q*dQrnI=UnejjlAc at 8Pt!DWRRqVm4Y9zJ
> zMiFw_7pFe!j4``k?};HXK%Z=k$4i*Ani;D;YG+7-5?D(TCndH_uYW$3OKg%XH at 4rJ
> znCZC3O?>mom0Q$l#1<G|q}++PBy at YM?+;Z{JJLly$OmEn at 4)|Eup>(`|249>j3CNk
> z7)RBU9A@}GOq%B|)tY#CPbJ_S7IITefduC&)H6Q+89RLmy4<?l$Fb91zB6`8<~8WJ
> zOM%^3O6Ji_E0Kef8&V|+T|IlOrP;&qJlj(D4#m{PgvW(&4P03}$<$@2`1c2jp2Czk
> z<b*5Z9Z5Xof~`7tXVUl7-rPyUpUMp%{#@?5;iGaz!^h^P(6^GGp>M4lA-?as>VCFv
> zvw0rl=Guf~KhGUc-&**Dc&qQKw%xiXuszjPkL`}!F<5_sJti}E9DVB*U-9Su-}5#*
> z)FbZZ`ik at 57plom8&$9TF3*sE!1W~lpR5WHmqEVe9R`2EvP{Tk0s6X4jGPYLWF6+$
> z at R!7}z3={^gB)4(6=Gl=uV$kUkk=RQNM~y&6PzG#8r~<(#6|Yi$x~m{sVZ(+MUmHT
> z&rcQZh>Z+LU4`eIz-y8|7hUf=EYHFSB211&eZ)^${+8UQ60$fa_nF~4&<DF=0|yt6
> zbFC>J4ZFLU)P=%(pGB8%BFj3T1HOLue}JsE6uXNDd?(x`^13ZuNS7}q`%UJ#jJNB_
> z;t}BIH4opm?`{0|z<R6?_}Sp+4#xlIU4QrW`{IVLU;CwWIb9u_fb-tO_KmKEIL471
> zhxI31PhdSWcQsx8$}{-SaW(n+o!hE=r*Ur9y?8}_qpMx_K3zSNgZ~5Uf30p^Y0lH3
> zBQEXpE1mmv$Oug?;#E(}t8|PI%jsB-rK{zx;@wJ at ys}V#N(1h(MywyhdL@>}v8>UJ
> zF4Zu$HG_`05nZ`FaRK5Fp1R3;TK=>6sPE`+%tOali6nh$<ayHxKIA?9n}_!l^OKpp
> zr|u&1p29JgizLkv|I2&Qz(2eP{Z7w+pUodV3O<fsiv!SSN>?*{*Sp~h?*m?f-jX8o
> z^_BeDTRZ{JF1dT3Y<p)tO)r01=BrG}Ysoi`I)U$~IX~R>ps(b74!E-S<RWKq0ro at 3
> z()vm+F{s~H{d8az&7@)Z0+vr>si>l}ZW#7t$;DY+BDx_<y#Ad3v%F><C$ga{xq`M!
> zJW_Py6EEn-HSWp!P5fDZocIv-f1vZi|88*s*4OGLCw_-|aG9&a#SQ)Q#K(PyJ#5s;
> z>C6Qx+n&^miI<Aw#4Upt>RtiwNF$C<)kWZb6UCOGXL-kp<6Ng at N*bF9mYeuT?Y#93
> z4E%ae``4M6R`iJ*c+STgDkD95TFkJySuTkXVBqc&pA7L=AO@#`UM=|*^)KMpPl;UL
> zd#yhw^_Ll;HyQJ5>X%$i{=netRE+_QEb_i|(PsMgE^xNQ(bb!S2;Q-^a?%gBuk45i
> z<oe<G^{(dVFvI#tiKE3JqMCYV3;J>Go<W}23R{eg_hpS{uiK}Ro#v(`QP28It|paC
> zqtCrHwa%zMMeIHBQCUg5WW}(%-&Q~Njd+WT;KS~jDEU<yx#}Suy1K%^-izmGA^3l`
> z7S4Tf%eL|4*^=9dKgD;#qel2?ntTs`gPcG;z2yrr<}Ki8CBN2Tdj+<ak>hj$$>g2q
> z=T3LVl>4W3-LgyIi&c1Ob+GTz_6Lv)|AvgOhadTpLxy?!R7 at h~#Qb(Ue2?>hy_qfp
> zRuF!z>D*84i^!7GY)_f_B=Tlzz>Rsxu!Xw?_16l)k6e at yj&YiRV~~5ALh5efdW0Wb
> zmjs{us`yJv9xpO=Q$m;egOy7~r<R^Uyg487AOqTvqZ?-X-Hupje{S+EM_g&)L1~Yj
> zVfi4Jc9XfKQX at QxJT>IEaKFX8HGsakk9wYKU;_<ZBm8S!Ale()b~En9_)AyQl5asD
> zEj%diL5&u|E4g$Bv4@@adqt#u;I2TdrsZ-LYI94G=Z$#+oU<8wyeP+SsY#WIJk-+_
> zQ;{qW?Lne<STnK<{(B$fE5XzV(#!cu;B^J&C-{TWFOMy^d$=nyen&ru5;vK~MP@*k
> zH=B59dx$tMP0pJsMg9twQ9Htd4(q0|wpvVG73}TS+D6!G;0=pe*yquC<lHauml<!j
> zW>IU+iy2;+lMBi%X)$<4<SO@{_Fs)QZz4D;+}q3S&38n<JbIEHJSczPJ8<aUf$Y6&
> z*?R}r9^bo3Cq`_~M;}wSI>?CYEy49zK3Q^2f4?3ja8}iIN|HAZ%-zwX%1{Y!7OQ_D
> zHfbO>@H}xg_!C=lT~Sx*_3Osyu(1b$r9(Th&kBF at 7@LU+LoSlPkUUqOznp6DM_ma~
> zM}STzq|c?`y=H9 at SGEVwCtRq_XNQX`;q$14?F|lAH$flK-JoYNVeol{L2tB!W7G~k
> z$BuK)!EQU4L@<J0y7S2U|G4w;wSV_jtH)Fnnu7ZZ)z9OdfS02We)_n{LEwySEhN{A
> z<Dq8NAUUt~h-MI+5T0p+ at O>6ye^I`yqKUlkI4_y6K}B-XS*}*_4{+2hpR17jKD(UE
> zQRCXh-RiddI3AAUk7$vy_^Q@}Wk<2iBWW<&yS2ddLLj+s5qn?07+j*Q#q7H0|8>5w
> zwnjv*DLl#Ei!UbEC?4XCEyjAm(0W1asMaF1y;w7t_6XYx^A|mC|FovM2*j9x3wLrs
> z;5m6{mr&TyPx^z$w(p2el}OrogzY2V|J5d(&&T<mL+A6^^NWYhFJ{l@|6k`j?a=7S
> zK7zBT{Ta#crp+R{Iz2RcQ=~_H132Jb@%8gDTbZr`hX{V5VROJ~;XKExo_D4THm;fr
> zeMUrb5()o-;Fz|Gjgj>3GC6aa!FkXK|0dq+Xb%>PF^S8E-A}kK@`?R#@FTg9z${M|
> z90OLl3GrN7{XTT*XGs2rSdVR}AA9|0_$dgM`2^OxfE_Q^E<ui72(|4D#m&K79iBOw
> zgP4SY at KqGT7gEJoInVsl7OE-P4?baBL;D%{E?!T~VwdxW+PIH at 0Qg+!)4goo*G6xW
> z3(g%w?hQNdT+fs2`U$N6Ozy8;(q`UU5broc3C+>oqdkCOHxTSarUtsy6n-PIpB$3;
> zSIPO><M886AvV;|F|{o3Ukl<=%87pO&ySK!r5Wl{Z37Se55F4WMJL=%iC^<onJFaB
> z0?x(vhB)KDiKinyD7sJjsF0D;4ex&4W*)N{_Mtq!9+(OE8f-oIfvecVPGm7`2;@H6
> z1!p<&wB~8Ns~G%V6%f46DTfN{k at 5Mk{Vz#9;thiy9>?#DNp1$dIofdn*h;>&E<JDF
> z9 at OVKgL;F3>UsK at P2a_r<J^Ymu+eU3N0!oaB*;T*z_DKMIiicaCne?E@)E0TtvKh0
> z=+|0H at jHTFA$|q;72{Wg-$DHH at XN<fgI^AQd+_ at dzrFbFQik)?xX-s(F30jqTvO#Q
> zw*f29yO4o+_m?MOml|<jZ_J->wp82iqkUE2kMbnjsV>69kMqEtv0Us>;y52}|Ch)5
> zJJiwm8Syi9T0Xgo?W3(zgG9i2#eo;4sk7F03UU^lRfNNs<lhp$2}eqQ;l?R-g;|nG
> z1}QJP9=RH*Nh<hM^E32 at me@hm24OkRz|B1pIY-5rrkU%M?o`yBRP(E90rc=FXHE$)
> zx4%q0L(PixSwl<P2<G<7Pfy$qP9i_)(DKCXl7ZGN!_C&Lxbx4x7Wd>cwUPAYu=Ne+
> zpPN~Cex&%pKkLzrI at Bv-#)^-sCDiBVpX;HSkU4vAio|>Hf9Lt<uy5F$y;$FUo+JJo
> z%R{;dY#SrCIFA<>kZtFmOYLxki4D$exJEF0PVsq8>UWNig%7mPiwPGmu8(s^&)J(Q
> zp&HL~qQB|ka{DengLb)m)O<NQ8C<n<P6I<yx+8o}4#{V}DTx;lPX2?3T<hD_T?MNp
> zU4^SfNnXD1+=#i87hl*H7H)cX3iP~F1pkZvVQjaU$u<Y(lFRwaDt6!CB`PL;Z+q0E
> zo|6WfW+ro?WG*<hUKtqH_274D#k^UPYI>GrCjFCS4egMOXdaLz(TURj=6`<q&93;L
> z4-Wc#=?MHPhn8fW{N^>EWtStGM at ZMxHznj;0i7Ya(=3(VYW at iOY(x9+u}dMHFAczN
> z8P4@>E|IF(U!rtowr&xAvgl9G59bU1A7lR>*JR!Qf#cEbu{O<09n6V}Fc5(;PCJ6&
> zO%u7(%nHe4&R9gIc(~ogL`58Gd4gGiIuHQ~9TViR4cN%KjYvVQ+higxQ&{DJObIS!
> z_I<vuQFr(K`Tf3+?;m?y*RJFHdLLiM=d<le?1xu8W}okV+PkHD*z6028BSo33FlFW
> zDZN5sPdyWM(vvkg=*Q=^`Kl)PysER7auHYV)Lrpl#b0?E*NjTY!T&v1hGGAigl*X0
> zcVz_oqbno91rUk&G=cC<T8#a0?>?L>f(~~T+d{(tW#|<Ne{b931crCQ4r;XX?%f*+
> z3QFv}bLDS1_HIHJ_J6uE9Q&&ivbFgO!7b#xcf|u`e;Q at rIzQ@@te=_6$&W+1Oj%Pk
> zS=iQQ1!=Oet<MTz-tC2V6=Y3C*}T0^GUX6 at 7c*PrLNxzV+1NdM;bYwkT%PVS%7FY6
> z!_T;O9DL~sswR5^u2BO#kCZ<G#~K$lIz$OO+M;8dt~`x>NkWb`pL_?N at g|q&!vWXG
> zL<VDFK${=;$Y;g(4e*C_0w1*3Fw5HgP7KEG9B{1Lgy(%$43Kjdr;2W68D6z^CzErp
> zH(N9Oh1Y#nbmAPr75!<wVHI at B09hmc|BgKP-wp5Ke=zxf at 6uG!53d_GSi7a<-h^iB
> zMvid6=bc+-=#EXtsJO>I at 0>pXTS0Daxb^P)Q>=I2^0aopI|kP-YqqYtCd`8^v%ccF
> z66=WYD80{$>j&|U?Ndc}*ak1(MoQeh9P_l*Fdf&w)@<E0OL)Tl&Y$k1pIE6E`IY#8
> zb*kvcPYgm_^9rtcN{Afzd*7m5*_T2IZerXz_|asg6nHQ-DVe$8i%DOB7}cio%C|Wr
> zKF1+nB`RKxv6A*!Bs}VSF2#CaO1aG*3LPydUCZbkB%T;?to<{~!NKmFN#UM>p?l~b
> zg*L>{!SDF9qzE?7++enTU=eWMJZ?5n0Zx~CJCpNb-7wd?d at 9>u6=$@9 at 5g#JUMBn`
> z%UfxK{i_ey^Ig?Eww~@_?&(r*hwo`+`SoN0$&-=%Nb+Qo!Ie9eeZrbIOya`3euLgz
> zubYjz`v=v>G~q0j;2sTR%8rHlD)<B_7I5-|;YaL1T!ma!8zckQyj)e+wt>WUVclK}
> zE}ro!*e=2C at q((F-hw#KZ>Cx_njQyue_S~&3+t&Mf at jZ(1uw@$!P!@>$hZ4Mw`pnt
> zp4DvecRtCO(buj{4y at 1HjQU~l`-o40tRuHh;TnrYO3p*i6 at U+q<TS at 1rVn~B!7WfH
> zW9{$Y)=`KT%iE5;KH$m_92w;B)w*$JfFto8Yb4=Xgx#p=zs^19wby6LFW}hg$+7?!
> zqFM$U{dbtBrQNS0|J9;9No171&uPK<Xx%@pXWu7&m#h9YzzxlYua?-5?+ at kc?s2`T
> zk|5p@!Qp>k;E=MQe at htb$nD5e#xn at +4eN3%1)c!1FH#Z=@Gf8+T+-Dl%|rVd>^ETl
> z+Eo9yUDzj>e7NSFbX_g49{V?ebLWlY(6i=L5}6P&>1SM?3ABroFyIPB9RdgI$(w8z
> zIfvZxgYi)rh#l+iqUM7uG~ZsMy#*a~Yv<8kZ*a$qQ)b>5uLs8BBE&A#r^Y9xZ&EBX
> zPgE at PFym)IK0NU5fG^<hbR<PL-?T*H`E!u-+tX=#eFAAG#CZa<SNlD&-L!Aijq5yp
> ziw33ubcSuE_L6P+33aI=)d~D`_ze)7qT-F*ctJ}z4|DNC-MIO?UGUfC9AqE7MEoSj
> z(EoJ6rM`pwdXCW=*oR}U^GMwkPxXKA6WwkesWY<wJN8N40Bh~NDD0cCe+9fmq1dm%
> zK5z_IbFqKgz5jj~_AA}{ZwF$Z)G?luR)>8f_P at n*E at R(-eRm!2=AFX+S9s2N-EM+8
> z#b9Xsq)X&|isRp*9bCHIkink=KG7Z3W^hHjF?fRcM-4&6&2O7;-lO-VnTp#b_p>7T
> z^K^_Ih8<!b!RUWg7<;D;6B(?*9`IT>KWYhi6?i-2o29~nW-e?S-vGBl8c^br%+F at p
> zA(`C~<iEmV4g>dmIq<^~?=phVx}2J%I$#K$YRjGod(SA=W%x^u(c{tY-1u*O at Hy_)
> zT*VwRtojHo2JXyuAA%WXA at SM-x5M?CDn_cl-A>JQ0+WMd0k-}U*K1|^jft3}1XkZ1
> z=}Nt0Es1aRgFUgk#4yQw-XYFd3vfU5S=S{`vi>~`IP5&LVJhZ}k;0Q%*M>Lb%1GR-
> zcSNbidj<Fp=4Ve6ny~*a_z{5Jg8OC*{|+DAX?h~&Y!2cgn4EEp<zGlXw$ZwA3C7~Z
> z*s~VN#-iR$N-N&m=n`8iGr-e$X$-E*=hhKF9 at bH3?__=z#-uN{wIp{Ny3jHA*kwO}
> zeiETw3;rE0=4cV|<0^9rP6?IppKsMAJNKb(AlI`-HULjXE$c7TTw%QhoZtqE+a2fa
> z>1;+_#U=UuK3&fnQvrYd^xpcQ%IttY$_?DL;`Ey8AmXo57GSL87^1wd;k(fvy5o8y
> z`EMA)B~K8)F}tXdKNs?#P1C~8f=?(8b at B`9gt<<49e&Fe=A4e4L)kZK*JA#%t1^L)
> zVO2z+tzKl`q<{sAcCxuTfFU+a@~at`SZW!;LScVEcpb8ygMa2;2(Sjdj~(t9TLznJ
> z;?geu-%B^4Pt>zRz_S at lFt14282lO78%s6FqxjNe5E#8E1F+ at 3A-V9?!*G8CbKL||
> zwpDS=K2uK8R<Lo2=GOrC{m7*)jBbTC0d at dl@p0X2)iM&J0h|`(%i9sVp}DfLndpx}
> zqWn15WY%TqXw`qVdli|hfB|w)rH8K9L1OueLhueVw+?ZjnSaEA>JBmbVX&axv>G|h
> z2eGBF{p2st!TJY`dTwlAmWkcrNbn9qJ at WEyp<VgxXW%O>COFwH32YkUz!lRn*IUp&
> z?-P>$A8?<1vuPd54jec537;aqPwxA;U!FY^GJqQT{y2}{4+OLBBQ6X$PV7SD_$T^a
> zK%PkitHnpa0lp={S;f5`h-2A@@kru528dn?EXBoG6Z{FbBDmNIuA+eb4E*B21!fmk
> zxiQf4^Ijq2R#;m~DW1608;j`Z8szhN?`Qfk;^i at Z#}WT%8y|iQZ`6-PC5LVHuvP?n
> zzo#lQH`-dc*~eO$;w7y2@&BqC{(!s#(Tx3{*u0M-)<>@6qI{p at d)H!&K9B9+ga+cX
> z%=s9YVjNcuIHC_50<0e?W!??IHn3irOy+a09P1?CTjaE)N_zN+zX48?GE^}fxId%%
> z+fxI;WeiMf%<qG)fr+y1TkSsE^2^#6OmbMdMZg9 at Uf2E53Bb_hkGDkIYqsUDY3LJk
> zH}}!j%bDNdJ7}&6`d!`bCgiuPRok<HH-jAXL08A0&$@mI&$=PvS3n>A<5 at A52<BOt
> z;NaMs6g_z=u at 7x4CC^J+;xp^!oA}<%$bD&2Oqk50lO2PZB5R*I8XRb&Z`SpS(mwE+
> z(m2<}v7g*l%H%yRC)fx{lLt1M1C*KK3e2-xhHuFAH$fjr2krvjmYUz42p#~Ip$-1G
> znEozJyO8AZt~LO33ELM-*C6gQ7<p9H+|63GGLybe>VYY at iIlrLVNLD*amv9yyLZ{W
> z&(hxYc?I%h4D9iq9^lVbEukNcHJC}Bb|)}Cqp)46(i7}q at Mp&5%mH_!82DmdkY&Y6
> z8vI1ak8?f-?gH{>G6wqsdNGInUPOyyV$lxQTm#4hw at hkK9G}dSCPMfBcrq_mrm+sZ
> z%CB*^2XfKc7cI5Kl$+lcO=!vrM7`P5Hv7DCGs(r_HAv^E-1jWiSWQ9Y!Iwn9^doEa
> zLse~G0CVp%h<CBj at Re^XCHBL~Qw`3vBR*4ZCc9$bV-%?f&%slOooyoh2>2Mlzi{qi
> zu)VJK>uDBiW12`+QF^@luKJZu<Le^iHXe<(#Y at k}q5S=Ai&Boj4&cDNupIJR;{}yf
> ztA@}1#8!NNjIzmRRJXbJ-gLz7u>-PY#Lm+<jrJ$F2(Zh9ThA^ILtH|JAA at yN4qGYS
> z|2y!bZ0HY}*_)G^bX$~7d3h$I8gsL57j*C$uonrKm=KFSOxSD}PL$yn<C2kl2IK6g
> z8Qf?sRH(n=k7FJsx&DEe%jz<v&VKO7#sn<xsdmZT_~YT9{eeIJX|(n*`X=;l_;I?_
> z;fQ4$72K%fvT|H6dR7~xz@!U=U1SF23D}Ym at 4tlD&EQjRkov>E6xg$k*v+U at Zu=Q^
> z6nN|hO~Ev=v6Mm9Js1K^<31x*qFM^v5d6pS66F$LmXGU|A}0Z|{D>Cj*iu^fKgY_H
> zO9{psb<~&`*bV+F<VhgD<2CAJPZoR{1iw2jXH at q+>S$EG*#CAd_+uv>h{m&yt^~jG
> zN<H{qeF^>`bKOZ*66(XZce9^aH-TKET#ElQ{``N6`R at z8*6%j-`&_xQF;&`=Wmrq_
> zwj_6T$-%YY!P+JjeOO<CxK8zOjEQLD>>Ka#O{m||F$tY*0f{Qv&f$%1(CbiU)Y~cW
> z*-Dt_@(+v0T3~zgb#>r)F*!e6pDS~h1F>URGmUZ17y0nNA3t+foZeI&Evyo>P<hp#
> z2}ypluh?I8qE`$|7UaK>afw{-5~jV>(4{AboB;Rw@&Iv9b(I`_b;f#|L5>)@8A{X6
> zaLC24LGFHEdCg^JY+#3(xGn)WI)|mfU(l0<*r!*?`Uk!jg29oi at pt;6Usqu}1=|{I
> zXJA{6tuMCq+1{+nIxblcAj2$DWrD-i(kn|jGLRACY8WZ`bzn)~KB^?71~KxvhrbzP
> z5_6R(dx))f7=J&o75;8$2OrK+W8AGh%=cP`zV}l>OU5(!Uc({InA7y7;YkOC<%RUv
> z^oLc_^fPAP)Ft=M2ou5C<4feU(s#<N<HJZh^o>D31Lxn`XSE%`-0FZl13!tsi@!cC
> z5pm^xL;tn>Wz7GpWIb2dG#u5behK^`(5)y>PqAIN{*G?Z{5 at FLFArE4Z1fKi>p4M_
> zmU0a`{HMjC$YG6f-a~vfe0#_r&0pByBf3fa<x>I{BTpLkmVnzS)f%G;dLY_3Vt6fN
> z&l>GTlWky`WFP>tRo=~VUZ%hVy`MdfvVlW>QAIQ*9LhO(rev>tvr-0J6}@h$<SzZZ
> zq)$3YQJ`Czeg_;JH!U~Gdx^iaKN`8r3kh}-J>GjZ;kR&k0v~lWzJtp at jXqr^7JYF7
> z^H~Y at YY&H&v*V|sj)cOBr0A+xa$G7?6`(JI?{M;LY=MzX&f^yf`!C|@C_g9irH41?
> z#*|gilaS}J#xv9)^KFz)T2p|zy~aSejUtJRjPDd+Zi*yzqX4dqr2DoQn8>mXgTPQ}
> zM!lURxTcSRYYP3ggOU3$@{VdRA~y0OuR?o~+YhV at Jupi{s4*$709i_><{v6w#7|k%
> zWGUBxgK#cjNs6n_v;R|S9_A&2%fKJ5KOpCua|X*R>9L%2jVuMWca$S?Vko}1ZeI<`
> zGo2Z8Cd_?DA=8x5TNlK^7T*LLbit)(xtp}f-EGv-6n%G?YIEMr6j%3X_PFb#Qo5vp
> zn+o!#ra#<kf$X7wp~>=$$v&XQSPkueg7<zb4qAL1oSLRO!GGFp?z0lo_9SQg7{+*=
> zyIh`Ua9xc-?$@02u&<qpMDFrcek1TB>fCL`D#iLk;t7@@W`2owttm(yj=2{(kKl&v
> z)ErR(<Be(0I?|qpg<~vY(S;KRX=`KfztBd0#2*ZMMk#5lzqW(&h<&uX4M?B;@4Dx1
> zv=9ye*sj&fyswivfKvBNxfkiv(PqYB+1iuVH at jW%tGl+Suw91#E5Y;Sm4&std=m09
> zu0ekNM8{Qafh>B`^3QVmhOFHDlZ>tF6`P(6s6*=0B+e at Q>hP;gl>mcCECdFpvyfo0
> zdq3-J>a9p$WeM- at r6NxLC=SI|AUA8?b=JB>;nnDa-c&?i5&F}9Dil9qe>26!Z_>g;
> z;8LlgW;hGX!kgD=&D2`AzDi<~ICj+GQWA5%BUboQwoo#}5ePmGu_}|`<GDn at Y)hNi
> zgtgCAx*55eBKW2HiTvM_Ef at 7=>i&-N=_Dt8@}yGa&!i2I+_{^Pm<PJ3ce)i#(G0H$
> z8R!4X1ZS}H-52Vk(wyzd at AUXaz303@y at RzV&DqwLZ at sIQdYhTpoE6`b>pQXEdGGy-
> zUMe{Y_+D(qy))%Obf79T?NcW|ZH{xgj+;UcEH)-aF6TEM4jpTOUiQlXFvjVvsZDof
> zBbSm`Q1vj<*5w6feGo%-dU6@!$hRS;6nPClA%@_#k?57xeCT;2Ou_2#kaF}FUySKM
> z8qXp5`Rd`wmpIzJk2=N5L+tG)e5ZcMHni83ytp5 at h>clav9FbC{44}h7I<M=!IxXT
> z4Phm1)HA}m>~Dba|8K~4SD`a}1)ZS-d~*Ih*#V2N*7#zLISTpyxiMwgPr;vSRGbgs
> zsOs|mX{!9~U!J%7J=fpAJqehz>%15L`Od{JA?F;j1au6NKL<Snel^}ld9PqC_a?S3
> zqT6tQdp2Yzs3JIoN$|t{iPeo9bJ*7w5{yHF)e1cAz-|UlJMB^waL at YQEEYm;%Hl)5
> zQtGqcGsbOyPH2Jdq_9Xa=g`1GB3R>LAqvD8BVO$MT#S|KigV6;n(x at xK9%E{%OIzH
> zi#i>~Z>%DE=arMqmI4MpdkN;uS=CYGTu2$grJ#-}$+|w>HHp~We*WAL!Myur;ve+=
> z>W1rp`#F at sp+a5(%A$g=9r#D<#&}~LCExn|tFRGd^&xjhJxsXMt>Y1WwkHcQM27_}
> znMc4uZ={YP=g!|*Lr0 at Mi-ncscy$|*Bd`uoLg<TEyY6OyC(e at o5Z7S+?S4X)LDw5i
> z-oZ5)B7otW*po##DmJ|6Wy?l9Y<4N)3~6UD$sMM6m_v`^dyJ}sMBbqw*CDUQ7dR<1
> z at +M-8tRsCaq>7n$R73OMD5V2AH|Rr%X+dlau;KoO9M<KfnkfyWFJVn4SoNE;pTgJ#
> z9ts(Iz(5<#^y?9bx0M4&60x*2bO_DQ=o2qMzPxI!e1D^dHaEsv_8y5rdlkQV*2=f|
> zkQ0MWR*L7KeSlSoe*WC<I+Xe2iDB3ukGWot?ZgioF#mf3$5PEJA!A-QN?1s#yO-C6
> zLEahRSBJShE=TKK;9B-VQ>hvlWBw)e=9n_89N1z+x4(xx_BX>A{w5odyWDX%Jj5Ds
> zCos<e_6wd<%{- at gs2*UurWcXtk-DBilY5BXx($46M22*MXBcA at xUY9}47Y%-_blFV
> z1M%w|64Ntz75Zrr&R;Y9279)STLccU<s>Jf9&x#N7m3BU|7p)%OzgP}8-d#^uM*T)
> z#UkYrOLR$_SOl)vIZio=Yt|)$d!}U+h(nEW=>g3~TI|jxC$Y_V*GG8Q#{$v4ISe*7
> z6SwS~in274{Df^MB=?b<ea{@K)I)!}hdhgO{hs}m)V%-bEXF-<oy8?%y|3GmWGhW4
> z_K6drup6Etb=bR%e4BB0dBp$DE9vJTyX6Z+H-?e2Xb&xP>GoSc%A8DWW+Z=&*vNn-
> zebVDdHjyg?{c$vM9w9qCK(22Ua3J<h74;9{Ko~zFeR0Qjp at od|tQ_cwRl#+bvtLC_
> z{=y0=&j^lB=x}bH92aM}o_BuLVsJI<X&L*OMp>{e>j+l{y9 at F$5KHxC`bWq`DI)#?
> z#LP<DM6iW2F_5Nq=tMSp6!KwbgF|u#w(~KEP}aKiP^Bd+wPf$yXO(iyY2Gf*10!-F
> zY;;h+ksd|#ZTB2ZkM1s{XLRqQ118FlOTSZxI88NjD~ZmUxwqR$2hGp9o37Xi`E!SR
> zy~0>qOk_F4HgKI2?}|sd4hS&T4-k$>(#Lqsq at 7*Y7`)fGPk`e}doNg==SyPQ2|rCB
> z#_0<(`273m7>2KF59}h>_KGFQRRR9QL(*O+N29&!NPFEWQC8>Oc8^8Dm+L$+e_&oA
> z>!5ce;=irL#`?Y-V=!8HTF3P+HV7BOw&GLU`~HG1vy8-xdwOAf$cYWd!f>MxVSr97
> z*-QNk<*`d#q%Y>Y%W$0_PML6;Ar at KGV{yqzEZ5D^^d8nvh-LdbgLkKP-lJErN{eHP
> zD^oe9%E!A-vMuV?lk_aVBW>f-Z&&$Az{7?%L0+-j=46~bp3OJLzpg0Cn<^QMKx_^2
> zT6>FP#(Zk{vGbzc%YALcqK-uOad6zq-d<iE1T2}EB>yX<65Jq5iXz4iBgauLMbshA
> zXp%RGd{4IFYhbnkLt)#$BtEbu5E}-#vNOiTYp&gP4Zsg1TsT-GP1}5LH}X!!;J}&$
> zent4T<eZj0a at dUXQc1nL^=E>&3G8$|$$_>Z&z9s7U_BkFk)}Az;ESO&h^axI!>Ksp
> zN0}T;o<W{9_1Rjhcr(8a{VY?v){O_OxfoIb`#a%nuvnzlwv6dRcIQaG&1cRJpZd({
> zF%Ek2UN)e<VUNBUB)TbQt`ji-e+Ux&&}8_Q!G@@*Cfp9wJ(eGs2HiP^^fAr>-Als`
> z<<8(G(9yhXl2h^FUhCPVMDG|!#vJ%25YMbO3TwdQ6^wNYzA0V_u{We9-m3m{{r-j9
> zRk{Ik!eqqoyu{vJx}hbAnvEQ at d~nB$Dq5<ACQHs2<w2Cc$vmRHoJaW!EraTkX*pL>
> zMt|q$y0LzztA)tv`{1!W>B+#xfufa74_}3D++OQd-Ns#NIY;C_V15jQH1q+tFJfN4
> z0<za-tkZF>r};KHf0Uvv8o09XqifEFe1LV85B{ZEY^THiotK&B938Qmp9|iPgH&gC
> zLR6;{dDO;4nR8 at qZe;7psggBK1;Fs7qmj?)>1{}D?4G4d6&mu at V=Ezd&VD6;<QgN+
> z)q4!&4V6yN^5SFnHS9a~G0-oi{qJkeGPawsu>YJue|kZ1cE$C)+x*kCSa}FB#{1wq
> zM9kd}wk+iKxDYRXB*NQ_bC{=Z<^x9~kjPxf!7!416V2I{O3jxQCn$L;;mDbt{8jgC
> z{sqoIa+z`XLOA4Ba_wpNwaDxEGVMt3y1(ru*B)?R(+=zkJ^s&f&yA|hr5lF&fG7F@
> zzvem>mb$6v(b#hEp`c#*CzH1Dn(6|PXBEM(bctb4Kzz-hNcEUrBzdfe<~5=GRsE1(
> zG9sAy^h8m{*b1`N>#X?3XvuGuaFnAHII^Kw&r0AQk}31?e(;PEn-hEjXY7sHBKWt7
> zZ~m3e(>+oi!C1ct9Kn(BdsVpi- at D8Bv?%0k(I%eysKftlk>vjU82ABK5^hL`Q7a&}
> z)!sQ2u;6+(2b&33VBb at mu)N*H)t`!jEdl<w%W~>HKeS9hUb7UK{Ly~-dAt2;lELR1
> z732g)<^Edax|xByUngB$RBMnIA8%=4&&;WZJQ&e}+{+5&pqE`AAIiE84wZW8;={ED
> zL2<)`7NIRh+8U>Oo+Bl3p1@(SxnhJCa28rzp=FhsVsNG%N1nnfR(<FU!rzDdyl}|9
> z-n?xDPbBXZc3~@p*fio70~XQHnnidY%~+d`U at R^pe#>kzgEg}RSYf}HZtz%~`%bZy
> z8X(vr7+c9J^~KWS0FlU9sJU2Ni5P&&`|nAfWIpS3#rm&qwuO4Gzm42H=J+Z{rBmX0
> z6Wp4XtQVj9J(tM17t1-6x_`2!6Z at SW=G-aF96|hl7RwB*7hlS^!RNFLZGjlI)GqSO
> zom>3CRaIWuCG!R!C@^GYgkPEAulfkrf2 at Un5BiJCv37a`*5p at H#oY_Dr;#=%e!uEH
> z$n^wo1=jFlq7N|ff+6TjB*wUlO6y)!G2O!iKh2_Cxkp`YG;hCw_%D`0&hdBBy-h(D
> z;HTCZNKUFhuL5?fkN?ZJhUYPJqp}9;IR7*=-h=t|(3e881OM=kk=)yE)Gh2-$?#`g
> zbn-Nvvm$C_>7#Gc!a6Y*Hbqm~6Ccivp4%?x-VEVdVbQX&Sf{8xMbct6>T=ZmRbvm{
> zO-MZw^r<TD at PaWWU@OfU{KxnvON?{hBjNCWACOKj9e~gD5%@-F^~R=H`P<FlyeyO^
> z-)u+DVE0u2HP!vJqw=Q2v&I5WJj|^|DsYu4^I4S(vRy56y`MYQuYZwa&jX2Pi3J#*
> zd3#`2={$+~(pm at 15a788&6q=K!Plr4h)OmXq=>z>6T3OFcS-Iu?GwpoY at u3py2~JE
> zf9UcIX?F3*T<<vsc*HhM7k<}pkD1#?ErJZ%k at CAK5Wa*f at Slz)x+|$Sb_e{rMQP=#
> z8r?tH9rQTweTXwmN4_|06)BE1xwB&RQYUhoxf?Z{9{UB#ZA)ijk%frcf3w at FUP5q=
> zA>T1RCp`NpH=h?`C6>c~Wh8S4c$)iw18D6{?=z~G5P9Y31|qxUI7#`4TvuF7g?m1(
> zLR^7G1P%{^9WGa5oGH!t*~l7A58(Rm;H&nxS~pLFFOpkk^9&0)B9)rzt3B6pO<p`;
> zv6k7!hlL!IO83`SW9~~A1sp at 1<iE7$iVn)J%;pgma#Xswv)<&3a(1}=O*nr~3tm`i
> z3}l`#u3Rqa{)qfnCy{;UGh{#GEOXq8Ii808y(mSVDRS0=H+}g4H^jDjva=R;-{Uch
> zoCyJoyIrtTn=_-GE<>pEWJb6<h9`ZM!@5<1Zz%QLEmnUq<8X8Ng?OKJS#nXuvBNUu
> z*4&tqt|(5q<E`Fxtb4mltjqjy-LC%H|JP^DW3Usd4}V*3eJf;)`EckMTkmM#=E9Cb
> zY`FuTDZkU5DRy8Q$)N|-`fP)qFMZHXMf3+}h+wDlw?3caCp0q0LUBwC*>jvRF}evl
> zBz!5_4%Uq7D~b=QFAEhuN4t+g*K4GJFE40O?=%Dv%m-pafc&h+ca18pq|QUWQ+pzg
> z^1{!Duc{iv;?8ny$5W2nE6&0UA?sWp1>56!?zImsN;$20v1tH$RnAB2=>c_#HHr^A
> zy^yJct{Y4pc&Kw{Kz at 2uZp#c!Z5kS1H+n at 5>to5y3R>-1(<>I*GG!{4eBiT6>4#Se
> z(Dz at F&$;2+Ic$Ud(E9SWw=RsS$eW5>{Pv@;kA9bIiD8xI{jJQJFsYoK8v0-~9r~aZ
> zV+`YpcLHN;@I#Ag8Ld&uK7hT6%v*Oi50y)REr-}B*FWq{N141 at 8|Pd at UtYwwxFoP&
> zEb0zcFDlV%63PnhPkK;DMOeSii9qZu>SgB<cN-Bq?wJ~)4SAyVXrIm6apTE*Xr^Be
> z!nYeJ`BekHU?x`jd90%}#?=hoPGY-<?^)NXfi2>nsP9}ZFam%t3Ec*^R)=~Hc+0c+
> zwa{^pf6n?o>w;%o={oMxq%AEa!1rG+KD4t={NcM6owc04Bx8>z+?U|e+)gi)xELPQ
> z(N<sesMb#Kd_SEdO5J>KmwoLH&dPDkuz?VJuEp2;sooo$yizr>d*U6z;BK`GPPK(H
> z^3Q4dc||R7!gpLEa#bkd(EO|t9GY=C735jM71|D~uV$S4`Jept`MyKX5B3)P*Yl&8
> z=hqKCzb;D;SwrqU9_?|tAKd7MYuu#)GdZ)0yv70_0P!MH?;pWSHjnx at TLfM2HJ6*W
> z&E`r}4C?mIA2dv``flFH=q<mBGd`&!d?|Udl!xFnnM^0%B5h};Bn!E^JtccfMc&=w
> zr*2zvCPK#{e34TbJJCs|o at TH`7Ju)X;F+*xO=s^|4GbapkcW6fKdXeCIv)2}Q6A{F
> z%(fQq2&NNn0w;;ZLTm}KBTm;{e}Mn0M(l_B9KG>N(z1b#@|}TJ@@<MfFa6-bse?q$
> zLax$I*eI3^Yyf82qO!>^C$g$Z`SWB<d0*7+Dc^IM!B7I8(#TbD?m8q~VPi`ey+_b<
> zoaFl$Ll)NdhTvOf-ZWDv$D<b1XC!;EOZ@=<5lbCf;^G`od6Qhwo%@+K%Oq{K#gC1=
> z#GXORND`Cet at nAZyHUgK>GI*+{-C$ks#mj=_odP`?Yg~6*Ch(if!#x{este3$?BUv
> znYp*n;>i|O^O=~YTv}aLh&H(s#8EY)3?FG`riUW_)8N`rX1kvVJT=LDe7Eul>J)t_
> zXFTacJCmRfsIw~PI?`*U0jByY2|G&~u#;@Rmj>)7+d*l-hxJv`W^fpl89c&*ZN#P!
> z#dBJwidu;5Wx~4Uz+CNe<L#qg-XLog@#79*?h9EPb&Dat37D9PdM0K<J!>Q4nSwHe
> zlKa3zoJDk7pIJW?Kpp}%*%*>fQsMH1o+cr7K*(sFtkG23Et4_2zdb`p^0ql?1b5+(
> z=h%9Z1K}gM%i!l9k3pU_xMMK>GqvCWP`|lgd#1m$)*b_Xy66d!yK9*|0yh@`bDkVu
> zu)Qi6cn*?a(<Ae;(p@#nPVA~Bxk0xY3=xF8cS7W6Q4>PJ-&vUfj1CuPLL|;ZCqRxk
> ziE#*EVjRevF}Q<DvA+SmYtW+1ly}_Hi`zeG%pFJgf>U_FFV<W9!1o~NDW-x~0n2Vx
> zLzRU8sU-$^V(ldlaLkk?fb1gxwm>*52mh<ZG0qcxo~)nm?OqiJpIB4SfHTf;5BS!Y
> z_q5N|UEiv98XpPQvc!vTrtM at Qek<%jH0}Ff3_ZPn@*_Dgg?-2xL*hQUmjgzr>Kw(+
> zHd;{L{);S at PpMVa;zWY;ZQ4tRm$&~ai=9sGQZ<Sj?pYki5KHb~E?zH-^}~IY;-)(m
> z+zVf7x%XP!OAnND$T{%HRfzR>EU;r&I8s$n;)<0P$Gfq?V#8Y&vEe-n{i5n2y&QdF
> zZVC@^rH#N&ybAm3DVoFYM~+=V>8AcM8Iq7wX at Nc9C1&LyW~d81&ZVmlJIhiZ-?FT3
> zbe3a2KVk3#caZOc$<*}zEgA9$(Uc$7SRb-J2n|?sD~Im;6!%r&J{#^kiTjMHAKq$?
> zy6yaw at U~<iHq<@;vqO-NzM1%Hv!6!XU6ksuJMKtTrM*~gr9#OM{vJ;E;@&&c%~MI-
> z81~8kpwZ6C26^)lih~@P>yUx3d;SdFY;oyvvY(!Mnw*pUaSr${{xiw_u0QS<2i!d6
> zzMlILY;Ujc7!_GAXxV%Y{r`jwK2LQ?jg^Y#pCWQM?CkZxBZ04_|8shRcf8w101hh$
> z+VlX=1WuMK1B+BkaR0Z&Mg;lj4&;Sy^fede>CZKyo at +h=#<%h>jIpKFM8^FFxZ- at z
> zFRH$%K_B8bQbEw`msOmiUd4a&(Em5^|4rz)6A5Oevxi`2!M6+SVWTx&-~`T93}Oj@
> z2^+=crtL(Vj>H--Q9aI%Sg<lpp{j%pnMOV$lRIj=k9 at k}?rRMms(N77XIjSo!6WDS
> zg?WFCk+uhqCRi0&Iu&9JP-fBhN1%&ZcfK at lKI|l~o8=+E-%uVgfb*Hy0WtQk8^$p@
> zxTQL<xY`nKB3wAxmI&zMVdxjg6ViTz`uRrHsQm_*1m7TL?c$J(_#TlFJ+omG{1=%|
> zXigL(<ChV<!EY4%X&z*X0W#l!!)1?(V7oMZ5vrIAEP|h5uS+7bHuV3Kzz4lw6;@n~
> zcSDwj{3HP%$Qa4bLwp4;GPfbtB<^N4%8XbP#N*x5I8Od#Sp}I8ISpv%HY(b`8rZ<r
> zUd(x<K1YNBSF2?VWmpfa63A^kX at YZ?Uyoxk(C=Q4cu%!G^<?+!E-{`VMVvA8b)t_2
> z_@|XIcFHi-Qs#LR`0y_fJEPaWi(dn`>-iKtu$GM(Lii=re|{VMfs^MB)j at sIWR#=O
> zw*h^~T_1~uC=>Gx19T%J@)HRjBfg8|c%}S~HaG*Ulh+40|68w<*A6|iI%y2gD(2m8
> zZj3>BnRb(E4Fbh}#P7I>{T%baGSaSDn=w~I9{kXPeE1;v$0m+#2>6QgE`u8|9XSEO
> z35W<N&$VZi=z-T4my;vRw`UMMANb1DZrqW)Z<MaS=Mtibjaa))_$h_C*(^t#T8meW
> zK}NP*1@!SHZrO!>(@tSMl+GW-IsqRiY%Ve$vCAGqOj9NJT=ldhh}bpE&=V~#9^_H3
> z^KOPP(oA@$kKJYLvQ}V*K2PjNL|<&40-kai|I@$fjmWn}ekJrq9v`+a=e>;ZNVH3O
> zAMOjreXbp&h+P-C$O+c7nNshg0~~8x`g)Jo5c}7r9&T;ZWO6fo=Cpj`GpF1P9A;Zq
> zxVz6=qMs@{5aNA0Z;!A7$BE2y7wz_dk%{Dt?F`s7$|J=704|!*$W1?+IudO#9KOr<
> z5DOFSeFyPC9}<o-H851jI!dn1+r!P=fw&B2t%Y3yF{p(*q{3r=#t!|1^dVf&Tubbk
> z9z_R$#b}5u*`6cvj2rT~Z126{wqcVp;9HNP-yGR(X+4+ni!$@@?_+CwN0Is_ZNmAy
> zj~31ao|KiyXhc41hAkELxR-G5N5f}KJvY$<1Ya}6SgHZmTYLG-u*27sZko`9b<}p3
> z_)@-%w7dK2&-2{)SgPeZt}#(Oh`I7I;aL9zgOQV>Ex<f|6&Oz5$eCjLGJBkELhQ(1
> zikVlIku^v@=d;S4!^+!ILsv<^tX}SdT_3gw=$(k;-x;pdi$#x5TpCNRpR^kNhsWsZ
> zh}nd%e>ut*PM$G at eG`{+2xDLBZ!v%~7V*d^55`dew=Zu)^&aF|4)N?Vn7P`8QeWT*
> zlJP~#ls;G`Q5HG2Gv!(XKXyK`8#CqeNBP3bgP>mpQ=x9%Fw5&dx*_ddZe1EO{{u27
> zY*+BgiH+I4zCkt$<Zh&65RXi$iUu^QC-f3!4AGCWO4ieK$NxWFtV9o8ITUeQn0oqa
> zfkzm(@0;PT?GlgC$<;Sp(mDMF;zZ?K#4a6%J*v4nir61I7Q%mCeCFu#60)9ud1^VI
> zti1-*>6w|!gU$q_>;a2}XHGEJzWQHvCO{q0&=+a$;B~}&`>e<}Ur%rD%@JAeCJEu!
> z3_E$3iUkIV)cbeCbBg_BTr+bDqn9AAI`LM0pFpX<l0o{imkqX`dl^Cj{JFPG1V1P{
> zi}AO`Wgl_R at 0nc4hZj%>%e>2}leZc%mP#=ukT)NUxba)&N46!$&-x0{?{C?#Z#)}>
> zIVgGP8BX|H*AVVDWwjz6F|-M)c8#W|%kGg*xU8%H7!##x#SYyBb{6u$x6_kUHq_5o
> zfBoj2^{AJ~<xzOAm5yFo^*Qp#v;45O0*^YoOqh>#@J+G?R7hcSx=8Gg;IKh%ze|q)
> zovpA3gNquz2I5D}e(I(9keM-7$@i1>kTrUTl!t!ob%fE2*QMxTU%Xu%ZL&Xp#nk#3
> zJ_N-ZJPUnYbqv^X-lbc+Ed$`QrO at 8Ge*+^!t~{nQAhux=3;3r_lg at xRnlKjDAe9TU
> z(>BCQH at f(Us~I6QWlt(=LmoeH63BmS!>}DmWNz4hRzObvm1}izFpsamcu7<OQ`I?u
> zp9?>ddkgy|;gE2a;I|LI{bYVsMDj>%?jr0DA`e=x<ATHV75LnPAftAq9L|=N1<{Gl
> zipL4gg2!__e at dH~@&V at VkKh9}BM)j$sZ(epK6=fhln-`W%Gy5)3u;W|IiIZNI{AhG
> zf?LNr4(!w?^dhp~T`({<{q4MoX-&7qSTB$De??JDf2=`&)FZBf*!WMQJR_>%=hWnq
> z9KG%dSDuEy_ZadL+h0arB3BPzjO#JST9!j%fUAVx6>-P at 8?mkLNf!ZIF5lTsg*u;5
> zg161|(zhQQr<B*OUggwN;Wejd>H3F|5o>xk1zY-()8970udj|a)luTpR;nd!(!E!N
> zubq~u3Tcf{@5)!@)0tt#V!`?w$R&6bBvIM!ip$&S$hGTyX5BLPd8YRn1mMh-!>6$p
> z_Rd+|mOd&ysIOq{WkXk7du??8Jt_=8q40!M&|h%xhDt8gtZA1 at mF>L+=}mIA6Sfu4
> z0<q_V+u)lynaXvykqg`c8>7j*N4S(#nE|5i%B+24p7Km3>sr8^?n=l%HhMFWfoce^
> zunlAC0I&>!hpnOm0=s{9MfL~N8EJz$=md~)3I#1sSHk|q$R0VpSl5pB)B&$5lFVT{
> zbA{CbY26hrk?FeTo!HCJnQd2|OB-GO1(8VzZ)j|U4~O%cR&DA+%;h~QGve{~&HaUx
> zy6nh;N#NAw#6G+)fiGxEYzt)XQpe}9|Ju2#uTmYh^@1yWjlMgZ{juZonec%+UD8Dt
> z+OM1!9z`2LR#H8daxS!s#Sd<vJ&_i|)UTC}Oh0XjCT$^G=#pSwkixz$<0IZap#r*o
> z<%mhZBg=J{4L)_04}G8FW;%XRAHT<GoKO90%o8og<9fiN?#kR49!=ZI2Ja`vdNw}Y
> zzYp(R>L782R4f?_PrAccDXXO_F~LY8aa;O$rk>wJ{2XnOvMLQyqSyBusm;LS<w)*k
> z2CBqNJgzje4tC}yS2FxhZ!}jvn4o$@c#z09;<?DV<MOg2k*6I=+7Ld43tYKk0?*Tt
> z?r6%8crsi?<o{jG*7vUasT|fAavb<Okip*%TT|Gzj#oosY+ao6CLLSiLvS_7^|1lB
> zn!QJ<^gg400Z;N7Q@|)rLeZOJ%s&3-EIw1NR*J>WuC5G{2Snq1CvqFCwcvq>$YZ&m
> zQF<Ky4o+-emB9XO_K|WMwJ5eh$40RB0LDRpU58^$)S_7#_0rhJ>gOCyD<!O0^m*&s
> zF{D4j?&4|xBKwHL_5*W#-I!i_YqrDYTkD7+oSxOzovX^NG<;381aqf&O@?Fs>cIk(
> z5ByL(8b6F(>r20R)VV~Rr(2FLmn)(@Zk{<zxW7D-6ccjGzOWYSGeet?WL)gbyJfRC
> z782|UQIJJ3`O+-|a4hG)WpA9ng27Iisx^03ebxZHV{r8rt;F{sFCIDFcTzdf(>SVL
> zY<ume=f`0GC+z=(?T^_0i0xf$?^6E2NJW2!jRm%$9<$?@{=HOM?1t=JWqVv<*nel%
> zrqnskJJ*3-Nxd7Jo(g<6 at w;i&7c(H=2+DgiL({IEkn+;e4>Auok8RF=5c><B_v4>_
> z9zh6jg`gvWBZ>H_GW}Qi?6RbvhR<RH<S69dz^Apyc_V0XcT=-ON&R`Bns1v5JZJo`
> zq?9$417<(+znS^Js;2U>fccNu&GO3ba88(5`naYS{VhIXSqx;#25d#uq)t{zd~`;%
> zH$`GvF;BLtG9f?b4cht8dDhc|9U%?b at 01^TE4=*3QpxaU<nhXpe|#qIHTXWw-PSE?
> zf}_S7aX_lfG<ZTbenz?3;tPN0?<)smM{2BM`R!`hgqtnlN~@T!u{zRK-~v-l5`1|i
> z7kJ4Q<bSaHu3FD-{npx*(SdrPhkPI(Va<!Gu~Fs_Q&6DORV82hLNjt?-MSt0Ni(+#
> zeu>NhuaxWHKOyl(i*AY69iclgZr?-f>$||_4n?fhByiKWa0t%rkFZNLLyj&(9KU{m
> zgILTj^XEzp&yqFo4zL;SlJ6#dP at g&7r*&T&<9_}d at iE|eY51k$_YVA-RXC=$XBP=d
> zTvV;fCKdO$w{g at Di}Yg~`?-+CrToOw<3TnTB?Oi<@f$+sjPV0D!P~%#=E~#8FXJ at E
> z1pi$T=@FnclkZXCTa?!LsAU|t{|8tZ(e{!e1LoY1+{a0|h#Z4?<0s(Um~~%+$K1 at G
> zFKF4Aq&34QY!0?aMZed>ht!N`xFEka(^nDOPU2U-RvwAxFXP-2D|w3dJr>>Zv_CGo
> z-ud}wMfS#`i*|0&CCssD*muA_9%{c`bj|%gyGqzVVm?Uj0LEW3Q{DltUhxtylpcu9
> zL7m-oJWc8)R*U^!2e{X%w-q}eZ-&{QUM}n!fw;WMvkCs+A;bjL^&<afC*nuIFKMLG
> zunojE1u;95aNla82lip#Xx-vZj(MK$72|&V-wIwTY7KJeMc<cz58<?r=x6-S;CHdo
> zM|95MBe;4>F6zm|91lAv4>&^bW5Gucd}|lk*9>6H3*6&A8S&;(Y^Nm~^W^oJ>B$XJ
> z-eru-%ZMkofoENRJ*cLa;!HE$d$Zz4N?x{y!3a(TM(`CJSL3)>#Q-_ZU<79XBiOM}
> zW|es^ZuouyY&@770 at 6Q3u2-EVrlpAzS6FiTg!R?(*xud^ei^_{tILqbo&uifW~N_=
> zC&&m-bpXfd+$AQw$w&f~@R~5 at tpTHYd|^8;qDlJ|@tcvyDldYcDp$g5?&qfWArCE<
> z?8p4U4Ot%qeol#xCBTaMGgXc_kA4`2bwX&hzAms@=S7>WBOXhBM*o1Xk&G{r8yH|K
> zUBi|8yz+emc<Y*cMa~kf*?M_n42cJ7v{JLkxu5?yH=3MV{>Qmt<lMQTb3K>Ixp{w_
> zTS?Ac9Xi)tO!_v)svdmo%dg*8x(;iGzslqo<a at lHdsemCXH-w4;~DtMF9;imzBt?O
> zWZQ@{!k3F=@bN_@>~}nCwdQ=2ZmD*}?sjG{-##nXj{nZsUGUw%b-f+76)FF1$5_;r
> zg`Y~tn2eOb+idBN{Q#V8WL^lj+((}d_ps!;u#G^R0F5%`w?3Y_!smomWPgx-M9FI#
> zJb6tV7Uvz2%&)s%c(O|@pXC*?NM-6PNQ>}UQA}{*<z#)u8YNGP=BA=9^+Ri|iL9rW
> zGZG$O+1lEuy+bga$obaC+B=r{)RwWQ6)9Mgy*8M{UYokE1gFUqTezv0e@^(B^aB^4
> z%n{6*YRFtf)>ZJkWWe_-vb;=Xj%~PQVK|OnrlW=Na*-4Gs2nws!3Q`KWJ&Y5sjh*M
> z8M)!<dv}Q?2Q6;9TynoX6}f=I1TAgP##()ZUNr0Wb)mHC`kGnwWx`ptv8k(?%c5t8
> zbO}8_{e$yRF at onQrc_;yLf;y#$g$^<L^;VWR24ajRMCPji*EOciCs-a<`=vh^9%i=
> zOz`Ck|0LYT*k-su)^bBM{E^syvA)lXwPI&@dJ~z;$#Y{pS2c at AtGZ}9w#1=QIq(fD
> zyAs*RUE|v6j at HJhD^y!Qu%r}N1Z%&GTJ3C<o1JI3zag~9&E3U=$rTr<Q?P}eve%%U
> z^m0!3-csbOkvb+A_B&Y%jw#+~whV49S-MqyEK`%Puu%*w1lV4$T${_DcsPHI7P<D_
> z7U?kafr(|O&P>937!vYHUQSIW-BO-NMUN>6`cV}JT}AKP?#$2io%MluOMg>TrnA&B
> zf8nwF<JS~O{U;U_h{sg-E>d;S;jz!|ZG1ik-(c7ydBKM9{lNqC+Csy{^5)CpwS$J=
> z*>B|KB at MXoE`C~%>plkVLS40x*Pz?==kdolehkMe5hqstKgW$YuE+7J|2f|98<mzG
> zb(k|#ASw(XaT7!DxZRqGx%D&B_qfThD<ngPO4d>frtPs<Pv^)8zBD)p5T}=-CKwVY
> zi^NjpuRc#9=Q(-dG>uACLGrkAh7nmW<q+xH`JAz*+m=mia?Fc;#=TY_xa||evGv*C
> zJ<|7!@YQ-LuUJdQ5X~*Rz*ky#H^$Zg`=*T!_cjaKs|N7 at 1L(OQVSoEBspsk4jaX}e
> zONpG!!)<)Xxu1vB?-nOL!8Ko0M=w0KOPmBuBrlQnP-j(3fy5_1DtS^oKbcp09RKqn
> z(?;?_$-G6j$fX4T5m(-2bMq-Upa&sl)yEQgQ%~(FHnf5Bla6rrYuHzo(&7}@zc}*|
> zYgZ0z=2GMrR6M>KY`#95<YL7bu5VX at V=Q(!9Uc337w4rN9dX9lW2-!O`7UxcVQtt<
> zVx!tPoyS_rmHG=Dl+8DJ+R&EB+V)s6!MVbDA~S20nczYIpK#|lEyq=dQC at p?#*3ms
> zPst<L+zjo&k|*)g;6k?Sk>fq at VV)s4cQ at 0v!iW5-_A%tWfmrlyo{wWRWR3FJgrxU*
> zp^m+==Z*!m-p;O**Tlb_?0HWWZHkXi<~YW#U76#8Ts7x0;VE3=c&5yn8HW2zvHS3h
> zFvS>NsA4itfV%W_jD;+%x0Y>@^A3^!@JX1nW5_Y~MCdVfrK-;QVH+_&0uO-_N`8nB
> zJ9Ix at dgy_-$Z5kq^4p!jwZ1hNA9(1&&L~{_PcoO{UHMZ?uy==oTTc)_KG`#Vcrqtz
> z1mw)LLyvL)kHz7g-?tn=JLbkf=1k_~AW!PB9N3(QP0h~3{k7QYu&pE4pgc!NnL2I5
> z-oraKkTQ)e$9<D5AzUkov$f11wg<^ww_L&#{_nfd*4ZRRPvOV2>jTEt^@$yOY0*|$
> z>gfD9!)JKM at l@b*BokaLmuo<^RB at bVN1OT-&|_<3-`i?E&crHnmSg^$Lu~EwWyzDE
> zHy6?!P77jpf3x^P*WkkU;03G?FX%&|t)0m{9GkpmE8$lG*KDCX&o3c|;A;ZIW%l1X
> zV|Qk~$<0JA&gdAC6S}(dT5+IKpEQ}9N+*+fZDdhy*sMmMwKp2C$5{I`(u9mY&$K#2
> z8`cN&oH9CpPUUxkIpF1GWcR|PXb-2wi)+2|9CVvci at Sh>bA9ckn!8jK{#Q8etrpd|
> zs3?amRn+>pXz3dBeOW>s?zwfvAM*a9gfg;*k+lbPaOA>B=npg9c7KfkeX+{T?O+He
> zbyd+oMWTI{KvtWXupf1M)y=uL^ciiz!eij__>Jx~#+8mIW0?1w4Sl(J7<ZDOB_tpA
> zRlQ~oY$MRSGcIx{M?&mghI_GvyQBd4H-B(EX!93z!KSOyjCK}Y+N><P{AB(hFnW5S
> zBkjWWdu%_{1UL_+`8$iTJ&f&99RCr=vq-!sHB#b(oLn<0=hPK^la|C}zR_&mWFvkP
> z?nTlUr2Y?}<05VwoDkWZjm^CwnaEeiSPna+!yIE9HUVRoqsnBS6H;Rni<HZ%W##S3
> zp=;OC(QAeH?xjA95brwYmbo4=52^A-8wEX;=&RZ#6QmzDzbFO=x at dRf&1v*Z$^G3@
> zaLsloGpoZV!bkqD19K1IL`i1&jyw1-?Uqe2w*jwvdq_xr&|YGnWAaeqtNqYlUI5N&
> z3oovE3Zv6JYYCiM->#b2xGQG7<pcS`aJmrlXCOD3 at T*jxhp+8xa6w#y+<487 at 5ej{
> zdqa$WOEL6`7&2!vev!?LF1!mogul5)&Oh(sEI4dW3_byj$vm?x6?%0`p2Z&=5CZh;
> zQGWFdhT|yULI$_&89Kkmo=Eh1ennn*2+>1s3ff!GKrh*62_y1O%RU3avt;ot45lQD
> zbr^F>53czP*X$p{liW}Am}(h&zV5ED7V<Lkf4oORpRwc(@)Jo}s-&IAKGPE&at-2>
> zjfwXS(3jkOUa#e}b{4Hf|F(vhT$0w4MJvmVnPWYxdqp9qwfSTmuwv;B(*IepNx>c+
> z_hZO2gbQ}EA-Cj{_|)_#QHYyI9Hty|r9OyLZgm|FvWVYlslB%e_A%+!q|-vuH$2Q@
> z@#69jk+WfEl(7EZE9sRLX!8uYwL2pw<kVCVbQ$y=pHa8!Yvt8eN}6Ue$V2KvV3+C(
> z_dE?be{aT at ur*boPc7<LUnEG;4~SD7r5ie*`>a8ki8!|hE^4Vfe&;e#e9gg+6opUe
> z<)WXg at nHuKDJFaL(4nwxcJOzQSVmx;S`>vIJqn{o7fr at yKJ+vdX-kh=F3vJB>>-_>
> z)h`pq`yBijzfbVL13!n)uI|Gm_O|G4{8lNqy9SoYS{m%AKm1=|uPJ(kcSDz$9Nuy|
> zIkKfTSrGMsbFbnJk2<sg(?<8j=~hAe3Se(=mzn~MiLW){zGcWAiB at 9nToz+Ek2ZRi
> z!8qM#h$ijM?C%Cned22`<67WKCO^X*+mBdq57O=oF6l&)bBlAMm~(p#Pq06l+23Or
> z;9?y{KE(jPN+SXXQVZwcP at cpr$069;L<d(wH~PayGU+ci606JXxb~CCaVJ&8`6~9E
> zO?7>ik at 5qurD+j&z1w2<(cW6;k at wXag13;^6BW|fXSbeR{~7WlXoBCgCbMm_Vh^~Q
> z^txr-&4^Rco2PJ_p(7m=w8h-c7D1nQsQN+oChvr9lJa9Zn*9r{VBLU^rIg^kWK89f
> zafW%0 at WBAP=o=Qx9LD}0z7RdJ9b`;pd`D?oeNrQyrz6i(=O;;ZFDUl)@<S}(4qR=J
> znvC?!q{aYlx2pBg8 at 8-*N^<<=)&};+_Gi<NfoHZF_FAiWqROg!fp^?pj`2;cPgpm!
> zdajKgSg at V&x!V)df2fk-`M^I5 at OM`17Ta|xQ<AoR1uo^(Va)p)T;Vu>9#owoHoirf
> z+onp|nzssA3>;^hrrrMpa5}Ao%e8b+<*E*6`T2-iEiN&;fR5%Ja;aH?WX at y0;Yaqz
> zjO{rZ`EPvV93!nd*4kt*Ntpt!DI0vwC at a2!t$QJ<FM!*#npS{Y46-oZc~G}8X(Qe#
> zjrU#j1CgD+RPlcyI1R92t8mR>#-{%b##|=+b{X))BQD|WD&e*~U7(4<H3L_Rn=3`~
> zI8VaP_Yw3rW=q-UQJzf1e|p5s`7tga at f~Z<Z~m38F!p)Gam;4oa81Bt_zt|^3G8ch
> zG%Lbz5itp0V+{{XFCp`Y>jm)dw6d?I26n&f^1}Yt+)ScZX9K$caR=~^vpj%1Fb}a^
> z`o?I)a7$s&J|`?hOiDtHSMU)^eG51?|G&z}E6I!E8S`EOM(mgDrHB_;iuYq}QReA>
> zF>MF$)D4tf<_af%a1z_VVExR=o=)l=<9-v-2N|D7CHyW%^#J at x?Oy{AN(s!KuLE`8
> z at GZE``ugA8*IAG=k>=lX1^N~8Ub_>B-FB{khj^LpmtkAr8N#e(FNd)Uvw^qs+I-Zn
> z7yB32BJ?FQmsY&w<xAF#0S<d3azn1V#<OnF<*EkKPqWoZ at Ob@1Ws3-ghw6s_mZ}2&
> zhCzIXPWMX^mA6W<PnW#j(knuoByd$>4?j=plGL?!5b|3j>g#LvS=j&oVb`cK?`}x%
> zyQE>=$DF*Myq~labX;1OK*sJ$J;v?}+FRwVKM73NX~7!g0Taxd3|)2fyGMME-kn46
> zXcUp$w_KbxOD}lO{}(MzY`Zcyq5bk)?q(9p0RP%N_$g}aAEr-(?bhb<YPM2dtS?Ze
> zrSRJ|05|b)-b)PU$x_|Zq>T`7(hnJZBKwzsk%(7ch4zq;_Au?G8dcj#KL)2 at +zxOw
> zyPkK?1KI|zD<+>4r+9<=*5LCd&Ocj}*0$?xy*&Xr|B^MP2jca^4ok+=`ks5sb>C}s
> z^8x9`C58*irN4PDSbQlVZFSU1&TEh}8Jr)*aqe5_|Et8Zt at 1tr`Bu$v#Y^0`s)GrR
> z%-uwKVEyjcKvi>9sJ%pcE3NLnn7PK!5Y3#QN9yCwo~?gt^9r`*T at u#a4K3MgYZ=~^
> zD=)EDixxB+r0e at HcmYp`vnJ!xXhwfSP6pyt3I{eqFFBU2?hdB8%1qsslO5DFCI-N$
> z+aGK|Y~fY0VNJ7G44;^c-xwRE1a`0Ev`awnY5EC<58L2C{@W~-*&?81;+bn|pidv~
> z^%wq~R;#*VH?6VWsu&(UQ|gR65at7pJXIk$@NiA}{!E|px=bI{W1m<07mC3%uYE-1
> za>V`{2R3T*A$MN~W>8f6Uc at 8RqAU%-u(>J at y4h@ozQbS#wIWs+m{92F^ZR*-Tk!%`
> z?N7j2ozpz`NxtL6pt$_yvkcB^iPcl2v|bUdZh9alze=ln`^W$P-d2c4TT{iCn}V2Y
> z-RDk;nEdaT(O<VAZq4BGWbMy;iuF|9zm<ox0>JlTu|JqLX=^$)dR0;Es5Q_Ffq(ot
> zYZ`N{H+<A_b{&5iuA_SgDY3)VCve^w(YvJ-SP{S#u$HB_!zViev5)~myNi<~Q~a~3
> z;KoDeo=49(_TG2bwIZ(^@zMdxgNC&KTNalWORJm3T97?nNdNWzCx!oeKTl_P_OIn#
> z5%|C51^!*pe?8;L|9Qq<!+(AAif8}NGe(o~?yS^&g}Bpak_LBKku#JD4zJT2ty=$y
> zvLRnWM4YI``c<R7X4+HNY(X4j;%@=1jedC{ByT&hf1#>T;n#Fl(Ejcei)>-zZSjIe
> zda}KSKbhB;H^E-x%OP>^?@mj4-#qav(~Oe}zeYX$U5Ldp>2tQd0B*tlx0&llxUc8G
> zpY(I~T9!`xDe+%GPsmStNZvnGmf>-tFn#vgYt|qU-Z6rdNAf$3cPSz*w_%qH(yB*U
> zizF$o+|ZIPYM}GGH)f1`AwFqsqd`#8r51I5H)q4Rr{j~h77pbc;oHKjL;I`aqQdlF
> zJ-KEr6QyjAlS=h;wDqz at ZZDbk6nMA%%;N;@sT-1_%@e_YeAyBN?EJ~b#D`~8wdDJu
> zM<za;#kaKaH$qM#-w*yod<S!Vi1pu8FmwlUJ@{|%tOd;Vh}+*Cy|HPx&0fPjraF}U
> z4oe5VlP(L%5l&~YEH{BG^q?ZLQI9&j$>2>sXzldN3n*pwAKFWNIo=QH!lV+^<8J0y
> zAFr=9h13m8N9v??8L3xc at lgHoNL{x6bEs~&U9(nl-UuYeve*8nKFNKgPD?YGGOQ=D
> zQ_QpbOY~~sIV&P}2B17AnPWe;p7YDwxTT)YT>GBFZ)X5$-vAD0IDHy9>_tg=C|mKp
> z-OTwl^p>P=6p`AIq;GJ4Ncx)I!qORhhsyKSHLI^E>4CefKUUt`jke&tkrpRvw9;E}
> z{q}3NGPF1DSJB?8$3x|N{~(ED7Ap&2|Gh=zYVG&TyQn1KdYYy)`)b{|iL%m_CHe(k
> zFE%0fwIA_aPTe@~5;^C>kq^X at e(2w3A_Eu6nd>$9Z>e^FQ^ue7db{s+NxZY%$CQ>w
> z;1OOh`NgKvb<o{qL{|2&F!k~a^PCN?NziTH!aAk4f8hris(Xv-QNT$Roh at QJVE;Zz
> zr}M13HzC7LHWj+2k$oQIGUtbMI@^JH)9R4gG1ioj%{;Y;(}>$yfwh-o{}#_$if270
> z&mr<29c(JZdhQ^;Szr;}?~@o4zfVcq7$33rt=W)uiL4<Pai1dgIYFCjy(Pw8LdIxm
> zhH=iZ4m?wA|CXOWQ5F!GzaC?=aKv at wSq~T!`>r8|I}rGpfjtcY at Zkpp9+J~rO#6l(
> zRm%2&%W%^f$VH1BcQ=YKUy7uSec;78aE8g5f=)+r at a;7zQ&^W;g{<&+>5pNEvpU(j
> zjuqFsmOZz%3Ni3AShHHUu;=1<4SZA1yzdbA`42Yx%qrHzc<$FBx*ry7-)*rTr2OqA
> zUQdsYX$?2&wZW#n+Q}vtJ?f1C;A2<}5%v<l=aQ-sU;Po{u(bhd)upd8fk`n2^OTNn
> zXbrcQOr67X<;~?I1}N#iVnTD5LC&+bZm{d7&LMI(asVmzFRc$*H?jrn0&ofFT?6(n
> zrcGksxiLSDS}jVc$NKjY>K3v**5{}3Ts{0q5#GTV-!I1du6+xB{;J*$gfp4t0U1}{
> zDoMX at j<lC>x102|8s#;bex+kd?yA9gywOisukf>Eqr7_qMx~qz*hK8Fw|{2JF%so?
> z1X-^U at qW=}j*sXT_+ZRpw41ARtG&kSRp5`PC690{z<q3}EYsL`{)oSWt~4Wl)7rNb
> zBg{eBYs*iiN2K??6`*SBU)yh>qxubxx~zFw?L-z;WoA9&y-&wWKRo1{n3*jSHoGEG
> z2k;5GI#ij8dFB_hyzJ-v3UAt|mH6gR5{u&84PB!uJ5+cY{#f9Lp#J`*bmc{`^Wi at u
> zvTj_?YswnkBzNo!WF~M0aHgYPegKbUjb9V_7U0PIBN&_^JFbxLA>-EX06Sl|%Fl=x
> zx*iKS=kcCh%zK2w)6nbA>NeW5{oX+vNx<JcncqmRtG<jeGYQ`!LvF(KVBpO-GYt~f
> z<`_<kG2Z8E<d*fc!nV|itr)Uqor`Nf>8D5e_6kcLnU{8bw#xHo`2UR9cYc;))oWs4
> zM~SfNGs1*6a5vVuyoRoi17;1lGnjjq{;@WZbx5 at x^X0eMYgH at B`hh+MeT<CRzs_mI
> z)~r=zzjMvz%VAxB{EvCUJW<=kZBo2}wiU5=qR!@2Trn9(Za3LR>`)ET%Se9#rppG*
> z9nZUE<-f|qh}!}#jdKrhr>zv5h5BKwBmE9>RxcyoY`=LbVyUmjoYaA at 9lsb|s;Qm&
> z_rz%Ii)rs98JRbjcFTaAyd3>44>5xw7>@x-0|YM>yq1V51&88H=*_SR=iN?{3C_Od
> zkFplTzn#9RJXF~jAC;a?VnBL-?W}+81Un!2A!Svv^xt8}*@Jd$gpH;y>rKDrtfj1#
> zsHaLxAUi3D<FqtNyl(*Gv=VauKbUxlh7jO{_ at dt^59b*tHdP1US+K)eLYaJF2V`1{
> zD;hC;ZP10DLq9V at FZ>32CE6z|oZ(N5yYMVm*1Ng7k`^OBZiHVU?Bd6C39Ep;N-#)R
> zfvA_i!{;PM&h8Y3hhBkLLOyGPRCE};p at BR8uih%m%TxH(;2SK^N0agttK!TtSyoEM
> z<`CP#qZah_jEV~I{TbC|$UmQsGM(`&ePmm9OzQ7l_gT5Mj^4<cP$y*3kT1?p^<Rm#
> zPkF6$3#)mzc>Zo?j0ACIJ_7LNLgyxB%yX8U&M_kwna|1G8NoiUwIFst?ML`B|8ABs
> zxlCr1$E8b9enLl&Z^|=HXhKfTKFt|mMTS5ZpNaQ{{`GxC|8~baZcFFN2&agk<<(DM
> zr>TQHz7%?ArJCcGQ;FV;+~*?be)C8UkEVmQj>HC{oYr?+xe<hmmGmv$3G|aGf8;tN
> z$9WxctieM<xKe5Rg6&LS0hW>G9QZ!`Z`SrUl at Df0e2ge}VctvZB=n2gdI6~`==E||
> zB&kahZ+iY^?xqk=XVcF2;Y<AWCa}@UPO-!MN=ds_NBfg<#9jV~yD7`a-b?B at CY%$O
> zH5suRi02fv%o|P4Hx1)%lFlfqH;*9C4>r{MvsU^{L3}8gkE*zvFn)?qhW^xNyO-ug
> z;aPKro+acU&)&1<OgYMZW>p-C6(ILqtY+>v>b_yxp%Hz`Mam0&yhhhJ#ppaEYbCft
> z<QRjea|S%Cpcik7+UzW6$}E|p&Qi1YVoV;3iFQ99_Z}nXNFEnts$0xE)^In)1URiZ
> zkv_XfJ6BEi&nM+1JfV3n0Y}Ns?uXtxh#bBGI<bGBrbE^2IH6k7C{1fF%|zT9;l=%m
> z_z+dVCkJNC7GOUAL)i|lg-tFI>kIJTdb`xCfK`Y28yHoiLxoSdIm(=)`-J^ZH0NRn
> zmN at XkSNu-;rz>3Y*v;=ckMv7$qOt<DzrxmXj=RZi`#{~EhrPlBxnC$RZ2b6-W9QPp
> zHIIdTTH<#!@6pC$%QVE*ag+~rf8&4JCQ@#{qE;TdLh*7CZ;ZA{c!F=8cV#o;LHTKB
> z-CA-j`&YaVJ^|0SF|T6`eNu0ZBISL6awBG8%D2FD!yIr%3Ar3{kPCA@<SFokVqW?G
> zz}GuK%Gi4D!=@U<u$2e7LZ{S*yzFceC(drR$-pz!q+H_W`$Zohwk^ciXFp?%Yl{);
> zus+fRlNoD#wi*5>*JNQ)Z$|ounCEJ$!%1J@^<qx4Wd!p{j*0cnAYp|iu;Npa!=gEd
> zIFCrhzPp>#`!J`yEEcK!FFi}fFS!S at L;|}Y`x(-QJ#T~{my?ObielQTk{uQdj0NC|
> zF?GP(PrkchF*lRsW4c~r_>WI*OjLGVxqq_~ZCklF%#X>v*a=)!<XR#3<3D*HS5C)1
> ztn!1d_j&MfE$60-;ul|_M4ZL-fn}#ghxt_!JCu+AzpH at re1vc(yg5SR0#`BYV6dnB
> zKa_oYT$5!Vw`87b6VDECP9qtFz?dLAf?$M7R%SKNW>cn;2Qqa7Q6~Z(GG)`m10aG<
> zWgr8_HsFS=6jy>hJx`Ak5_y1Wrii9+E7SLT-9xj(^S+<=kA1e?hwHxX>-al-f8XB^
> zUhwsjy=wERtu{+h?>AJig=Tuo`?eB0^l~x=G{qf7y#_0DmiRlycgu-K7&)=8GMvbX
> ztGuy~$yCWiwoevaOMvajB^QQ2lM74j>me5+N2~4vz7yF~^fR%pz@~%p-29SSRK>_s
> zZhr_|;v7ZSS>$d=D8(AiVgGU}(@UI+n5pivS8j!_%E+98XJwzXuSA*Ma;C2K15K2a
> zpQWG4dRPC0<#y7Q1Y7awX)oA9S<7O4HmBnqA!90l%k(;MR;uze1~Kxb<*9th92+$)
> z$~OMF>qj!z7Z6+S`Uyn7v+l7AA^Y_}+~9x at kT2jDPnTU*5vHHTR)8bcOt9``Jt1wJ
> z7E5$$aIu09U;l%05BT-Lqky?pXNSzOBnSNLB at e5g$t$H;R~(RM%JGd@;MNM8RA~lJ
> zu+=C>84-}-z$cqj=jBN_Fk;4c9?`w0u;@&U)oaSJ#|J7pbhV26`tyoV$lWJ(rxlO%
> z=W%>I+B1$d{gevw_Y4+tX%kLm*E{-gybho}3jEYw9a}3t=(K~UXZ;4W%bQ%MJ%n{$
> zznaL<{G*W5lzJ}vvK6^*b>oRl$k^9+>baPIXW75#C*ydrS19DSO!D3v&w7Po-e1%|
> zYW(@V6VQ{rA>+OdjMN*Jtlmdeje`0GBOxQ6g1tP8(V1&iauc{R8C`Br-VXEc5+~&K
> z-2|t?jcEAyD<d#>hfq}VDvC-XdUPD{DGQ0bm10X-Y^hENv=k-ev-BG2qPM*Tckkl+
> zP3%d?pNP8XgpW`!8gjQM;sgj6WV5js7o5F|-Zr{fsy`80iasgh-qH=j??L#zoBYNc
> zR$G4lWT2&lmUC|<_-96SXr3UyS3&@MY>1C_94 at U_BDO?$%ujl=#n1odaiZr#j&j;H
> zO6v02<WNn&_-{MJlRx$j>l5P)M*QzARfK*o at gt>>IQu>SpE}f4-GAp_(QldGq|?pM
> zB0h^Y*|aNLZ2UqpwsqIR*^It~9<>8{lr!}cqC;J7eolu<g$}g`Iuxn~e4ml at FX?B}
> z$NVhCTh?Lah?$3+-KB43<n=<xo~76)Ts(fg*qK<{r|K86&oOr8UC=EUzChj^sk>bF
> zIp?z1lY5-Wtm5d{Z-cxi at Q*@<=KA?&uJYq#&PFV3Y}YQ>BQh<8!1+Fet-(fHgUry|
> z9njY^<$e8Eg3}i5V;zRElc}#jE)wW6jNE+?`o#c at pUuSX!5)b|KF*9sMo!?pm}*6R
> zgqUkNd}fa){9!5KMBjlw5IV3=718f7X6wf8@$=u;$4{E+riC27uGmtP*xyo}c>Aer
> zzA#F at 80(+t$~MSTHE%rd6mPAZS(X10;Wap)9sTmRV|GX-&gjsD1k-qxm!Fs8NaMd^
> zerWevQI+>iP`NW4a`W%dF$9+ at w?h6&+b2AMYY(31&#(ScGPmk0QRAI9PQ%q#hQQwT
> zD)AW;88ZIzcB!g~a4y5Ho#T4ujHl1s^X!@LCnQ(`lvOlGa*fV`ZGaO!q+$4qn)c4{
> zNK3cePM(=Q4{>S1$cyqjW!?}>eBmCyAWz%D{00BJE*-a@)n(bUy6lHdxJvz-c<I`g
> zZxtxz=PTdJ|NfP?j<y|JP(@!V|BUvv1ZYB<o7yCX9~VgcphF9bAE{OAKOOC;I=BAl
> zF}d_%kw#qbpR`lLw?6g9vByV`I0Z+KlzelysCR8aL)!T_!tdKYVcl<dEBrR%|7OaM
> znv)S at -mz~%mGfe+h+Q{f|KUW2Icwc+?UGr}^*+0HhSQqhd1<9ebNRP~Mc#coOT;hD
> zE)&n(kagd->b=`rS6=g8*)f^U1}6Hf`JjfM5RkRFf3=@S=G^cB4oW6+eD#DAxpseL
> z{|>P_&sjIe at TN)Po+a)Vbn^V1;|DZjsjt$6Nw16h-gMSg8lJ3>P762s8JvsM(;KoH
> zJtm!><8Cq9$^Um}ieE~u7Q4k)pPyrR94%ORQ2f$8ZHFddVdXe#KWu;N=mQCF!ap#_
> zxmL+FN>sdnm5#%d^wV|7O?#gfmz>np9@?W3S?>3)EveDes at 5BK5S>~nkDR%did at n`
> zrA=+Vbwdy at +h^@R1z66eNX<<uQXOx;KeJEMuCIuXyI=Aa+Xs^K{J5MHk?O#9aU5`6
> zoOd8gmC!>zfd1B;t%0sY5AnE8c)BC~9aN<6Bj9o<^OAE)Djd0KM+t6%ytlb1L1fr*
> zE7)Lk&cSa%e3$ot2UBQHd{qnWF<QjwFgs_)AI$03zq+HJaKbMit^6_a!+X>Of8-j(
> zw^$QIwb!g*-JjXf*1Oilb9DbhDs}Pqc+O4L?m89b!2USTF7ct{gb%A%ee$8 at T{<Ke
> zziX0KeW?1>Z=|Y_-lHmO{yx%q|DeY&k!&S6$yKKNvK84&d^008eKRL$UgJ#AMmSCa
> zUj|%C<^*m0itM(P%_+$uaG$=WDotP1QP}&8V`o~eqp&x|dUqKm?Or%uD at X1NRaT^L
> zv+LbYBL||p194b}0~*mMCeqfCz-ip~II{CbEXLHRjwv|ry7ouJaj#iQVl}(`ZX>S4
> zdV9Bb at ikBHU9B8CWBOsg5vs!G&d480y_dYkiEO4FC(};H+wfd`J9eN>C)3U>jAH(u
> z!T(zPNBwYZRNf`zFRQTFXkSNmrzo=Sei!=5AMfiGSEcdKoN)ir3dme|cQ4gM{GZqk
> zzbMMfrfVITJIu9Fp))e)?N)<}Cpj*MZd61#XCSu*Jy at naqj-Wb(N!0NwV(|+HO`}L
> zkt`);Pi!uvMT&@auV$l05RVwrj>*k^BhPgNVa$wzuG8c}xM1>|Uy7{v6J>sc-v;PG
> z>(WDU-aB$@^HkuOx8wJ#xHgBm_E2;G$Zv72FRsnQwc+WZz_AH%4IkJ1i at 7FCuOryD
> zB}Z}1L0t0 at bYR5KIm)q*nsDzr9M8t_{>*a-r#LBNJf4+<a=0j`kSPc8m5vhodK|CB
> zah~!LEg4#+E%s8Uil=SbW>e)j-<y7AhnVMwb-NN=JC~xwuvv8~YILSZlP)+iAI~Ya
> zuTz#l-iS*75YGuyW<h_g#PP$lMq#!;Z2k=M<}>(&3fIZvkrx2D1~t^4C3OmVyI6Ti
> zyVOgXx?xzv*~i0W^h02Ac|&VDy#@nA>G2utj~#>)HGN3WwcsFI*3#d7pHb$vEQ8NQ
> z-o#6kO{Ne>i49qr5h@#UgdA^9fNv&1>AZYq!_9phcT3KC_e%S^=E8PSvk^Y0E at K_$
> zkBmzh!<1Z_tC2;%yo!o^S!phi#*aX~xQvhMJm$Ci&}ydL+*SMSLggjkIVYz+ at v@zd
> z87!k`U8=IlKB$S37_yp;9XeoWU&XVFo%2-mSzyM}o2GBFS1A!+==re|_7*z at o#1!K
> z+#F@{{SeD7+V{;68f#C2r=u!)5+_RRansbkA^yi at 98Q#XkJ{J{S;5J)v%q7`R*k?q
> z;#?~+JV^+RzrP?+RpmXP_VtdL@%y~{aNdHBVFd<t-FX%KastHodXn77p0A}+iYJ&`
> zYddHc*WA5V6*Xet4Njb^MD9D}&c6L)B<BhIIE4Fbc_ at 6B&Ik^Ed)z*4moy(-AW|d&
> zYc|LpjyxW<oSvx^!HT}!6%iPNJjV-u`d4D^(eqK3!Vc=~#}WRc-}Uodc>Z7Oat#5s
> zmcp(V-tLSD=$HWv+*kivpPO%AZYgXpd;4L8A8(_d at A6^Gd>!V9fSD#g-=+EZO>)9y
> z?ac&t-Ux7VDwOv-G=`>j^@PtN7cZmqn+#8u%O=#P4WDpcJR{zzfAGQm$i!uqNc9rx
> z=UBs&Uu6@{<u9CY-gSJ5WpxrKDst^IOUKNB59zswkb|$<obXPmQ4?Wy(qY&e$al!E
> z2Wj!j6Or%Ss)<ysu8E8pUDN*S(a#r&4Cj9wXK21Wj?+UtrDwUnT2-2sYObS0SDv`t
> z)_nJ-r1>j{WX1BdCeGJsbJuT4`^4Nt2jjeO<*&C-HeYFzH2-i_vT|u;jHX8P(gvHq
> zud2Llh2fhP31 at Ixdh=ILB=KGCm+&n#oUa>aIN3hV<4f_<i1M`6D?A=n&Mt1xHk=Q|
> z^X223uha-<nd`hbJ=(V!9xqm{5Q%35m5UcAm8VTLoOH&l*!QJ{+9NJf?&<KD-V`}}
> zK}~zoqpaSwfv at kLfxT{qYD1-aTvnYZt}9 at YV^cd~oX!WkTj_x at W%tEzmsP)J?oX?G
> zt=UC#Rt`|@rB|&e%TH95`HfZW(S|Hrb7z%uZs$Bh(fi`cNwj*!-dz!@GK>M8-wsZ)
> zu})j0=~J4m>9b;QrJUSP?!`JekPXfeMGb5ckLuQAU9qyKHS{wW+2A~(=NJk-f>$la
> zUP+044Q2SQ!n#l`_N^@wi~E%6)d_>dV)(*yk(afHp{gMm^H;)7SOUC4h77U>e2M-Z
> zj?;9w;>pH`uub(*-rtyJ`B^hUX>N{PQWfdH$lSEm0A9bzA at sbP*}ZF5- at i~Y{qcp;
> zpf{ll+#+!W+bdKv?7)zuEFKb0cd;LNPvTp>Cp!$rK;DV`4a2HZRw_*SiNk8_uMz)F
> z<POxY3G(`9_7HB<cB$d+ebLCzogCpYJL2?p`xizr_bl$dXDs(t_dRt)#<zzEXWM1X
> zRI;eq){Q5KNxcqV(qcz4+7a@!SNr)sLuE|7a$nV4d&rQ89hGsNNeb1IWP=L1_fQ|T
> zt89E1qF&X`b&BKpiL2N94Oamt*KAD|J*nzli}FSB2QLIsM>c%P>R}I=eubX*flb>A
> zKe+4p)z6;)yI0lD at M#~(XE>5~BF;Xo6Sjr5q+NhL{vLH0KO}rd)gTe-a4UJQ>HzAo
> zAN8og^GnI|@qH5CHhdT0+v-eG7)X8W`N)kdze+6-XGTTJ$X-ABg!ib+(P)QF_VGij
> zP at hU|5$Y4pw8tOy>F}!ADVX-r&ftMErcM>8lNNcE2`{gJV80kVPG_f=N<;j6VvL>b
> zVs^6~@%Je!B at gTRC~3Pu@&xU%8|{I1VA`WP`B{5_dmMdwwp{WgWdQb{DsB^9&HK&C
> zNk$%CM at b}fe;1a)YfWmxFd2PO0l#2eHpWJ?9eWe;uWUgMCA)-q2J&D1(=)hPXG>I<
> z>=K0(WoP3WJiqzrJHC+$;RJCdbI6#XA98PPvki{;tP<r)h<+$}vPFt-U({~~8D9!h
> zN?)wqr~g~)oT0EqiXfB9h)hbQCVz$f2mQHP6n|-f2<v~3wix(?ZSB&?ijJ925SKMJ
> z2J!EkTw at B@wI+p0&T%wts~8-fzd>QD>qDKkjVI%p8RzIn#Su~meCHZN$k at g4#bkUb
> za=VXbk-FhOFpHj6`v^rl^i7*?KkV!%7sr<27>&KTQZrn&3p}qG8oo*=_Ar>m9 at lK?
> z7VMqFa(8IXvF7^uEpj66{MYmAy<SKa<=ujR6uBH>hm>4gwYh3|c&%9CAhxq<BN{({
> z at 6h1td^ORnkh3NmzS&XH?=>h^WVeguk*4u3-w8NJpm(v)z>mXndJe75_YxlaUpip>
> zD~%id at 59%#U7538D#?ca_g9^B_cQ(P51ljXIi0igIi0hN$%DGhRhBUT_4Jr__>^>B
> z&DY{NRP^eEteCi}4A}NQitc4ziTd?()emEudDlVV&dkOuZNJYC|FUAP>?^B3(Ona~
> zMVAZzSN$Jv629xw&yh1`eN8A8{Oo-WlJ_wNKhrB29XEgd-=9VF?PZG{h2)v>i{om(
> zvflem;|o0gC`N~+Hu(O}_c&v`;IaW30})qNtgNEOVQpH_U5C$<t~v- at _VoMLhgK6F
> zVuBs>9`&2md%)vLZ4Gr~qLe45I~`Qgxwst2qbu4(Zf3f{{f={{p^6S+huKyVpPS6&
> zJ>VPQ*{@fEo9aZUuOSDvo{7dG#J^ThC-$bs%tc;f*vmCR{a{lTt5R&fF55hN9KRg?
> zfw?C5J_WUdg9sm2(nVnjWB0xY9Rv2VZ3&E@&1scEzU?H~$)I9Cf6klWPC)GT&{5WK
> z*s_n{{`zdO{s6AI>~<3TR8r&xKR^2XQj^Yy{aJq4*Hns#OEriPsV$0Nev|*te=dmF
> zm-JltXvR}xW+A`WC&GjR_|HyZETrm3z^?YT<`K9L_23TNrO!e=2xs_=Qfh;Mf0X$>
> z3%qoJ at Z}#($g>eHr(*mc-?*#oF7fkm_ZSx=&%p at T3}GA6g$nP2w`E at ne02oFYFtSL
> z%nD?1f3f-z!p#f^Vjt9_7wXXyez!nAcw2})5g5^z7%ra=z|s7kaR~E!hWDXw=HdSw
> z#_r>p0N!d=9l<&3Cku~yPxuXaGYQWOo)JI=%obRx)6RoaTZsR`u4e*Qxm#Z$wED$z
> z)`Mp+7TC{ZU^5Ai>;YoKCOQ*Y!-4gs#C=p0-N%xx&Mb=BRmP=ad^Yx at RRkCOXPjmJ
> zTFI|^f;;cQ-iPwUB))^hTp~AVX6gusGjS|(e|7qoJ at 1DkzC!SVJcO_IixjotZo5cz
> znBY8}GhnN{@eISu)ei<%@F2m^tDM09m%$cRML%Q at 1mD|Fcoq{&GSjz}4}V2*D)t=6
> zEIHWI(p?<U at bwZb{2#~DbjVLP<vZZm!U%^nIS;?VPZ$fx^@BZs+S4*q1-J(H={7;e
> z>HFtg#02kWMSjtD!39VBMQ;uzxD?Et|FS2N{2YS%Cl;4Khpn*5N&eKL*abrPP{#0W
> z at WUJ;xr!3`d|*zl9VR}-CDLoKle6yt3#)YbiH2#O)}y-}4-g+lu_vDQUEtwV`0CK6
> z$$$5U#(WMgoawh at 2^27}g&O!?V8={^PnDD(@w80jF7AW8Mml;ZKK<Nu7?(eSyV0C6
> z&TUr)-)+w>AGeHM-h}_KCDs^36)p~R+nEte6|NZ%-Ni4m1#P^?7=m1swDR$RweFS1
> zaOT(-M#&Hv+BCa6KQfc68S+q<9&|@^@DNwt<T=>GJD<r3Uw}v62JG!P{TWN3<{Hrx
> zhgQLd04%n96XxW4{Q-)a2hNF!>(FMSNv_pv`M`}Z_RWlGB#$#VZvKn4>8x)-L8xOS
> zFx5ln5nlMg+<N^Z at N<8Q`J8E~2IqH?W+U{PBu9cVIn;u3&GQ7NYUI#h at Yxwjzz}RC
> z*Qxev2dP5*;vEU#cbcSiS3T6vLU}{jcZ at G$ZV7om=?4=m2=ZFIsjM+31Z^Q}SB60~
> z7aV#2CA`os+`YR&v%O`$-vLK2_;~ukMmpN>Wry3tTFY%<`uBqS&`eXRA$Z36l+nTi
> zv<WdeY1||F5sJr78L(xau$%P+>pO&XUEBv4g at r<`x8R&X&t-jOb!T7J-wCv}NstdP
> zWDI;~WW7*`b*-3#J=yz=yfJ%RYnd?DThMHRkFNk6vjw_V6}Y}yrs|4?1>T}M(vBy9
> zrv at IM#09{Q3N9A3d%6k!L0mW8UbQev*NXXf3H)!Dl$EKMya?W0Q5rto8Q^h^3iEV4
> z*kS{ZujpO^;zr<$W;neHQx5=tl!$&DO!~3MDbr}uN64pxJjLjjpY)GNJOD+h!-+rA
> ztvUntYl5?Hf(<=|U{x0p+jgr(8_E6xb<eW}DQmD+J~0LG>Rff~@xDpQ`%VWNy|=*N
> zTJyr6z8mU`zJ1q&!DZNNr%EYWurfJ+t*@=^6JQ#I=(kzCozL3pU-<u#YwaTM4BaI{
> z*D5rj-HMrZyUcs?N4o*<i?S!aN_+!>ux~3Z+EA8~;6{L9uEe^!0XUJuV#q#JnyWtc
> z3etwKb8Vxj=>y=u8M(v;ToLJ$yf6u8SpHgmo>orc8QABHK?EPy$|d)7zo(tPc)U6d
> zIg6P7cv{vm^v418#{sS(^?+9<=>vNrm&o0iPk4qO;?3p!1MtNgw1E`$ZcmDebfe7E
> ziO*;z5AVgk9QK-HtbS%fNsb5hkMCNhYJ0Q4fZtxC=khYO1Az&U`Pg6=BKVL@;}CWx
> z#`ZV=90MV_OX{2>?syAhFoIdnMZ!!ymrru;nDCrmfG4?><3Y|Zj8X*dJX!3E@<V)V
> zZDFiBqXZbI$z=Rt%rNgQGy|K0b8HT5JZ7w2)%p?K16UV<jS+5V#>2~GzGLkCH_V*B
> z7X7yxevLEAIk+DDhdWQ25c(Q7>VrzV1m#}D*aNrM&K#y~m)Wb?UuXxgm1uXu&s9;5
> zaf2}`HU^I}qwEshB=$MXoy~}Ip;Cc^Q~QrH+QA`JYkAr?=&J$f>(z!$z#v>kKI{)r
> zw>|pR3!_rrVXr4+A%&c;5Y7eH8VC05y_hpoQzF54^$7JO<yw`_$i;0GFw4~8aAIq|
> z8pFi*W8X~XII=LW!c#rqi|GV!mW<s@@K9JodLdSatWTS?)j<WMpCiGq5Eaf2^A^=t
> zYsV?)!lxapzrs`D8~k6ycZB|ie-JSr<oJ2Opv-Uem<}5v;z)c|R;%0<lVFTsjn^SQ
> z#MOt43_|cqS^5fsD}dZF>a^8$F6fwkKdXeq1rZzx){4U<$KJqEkmbJQGJBZc%PrAZ
> ztFlt~tP<lG%wy5{<KBY$e3Iv?JV0q9vIW+{eoxm_JI%VhS<0(q<QDXWlY_aEg*Mv9
> z<aNj)?Ll`YjN4)x0~;OZeCmFs&7MTo7E87IEQ#ahwAz+GeaE7xY%jzO3BFIQ8%gBQ
> z(n4D9V|8I;gcZ6{*4O!K-KxlVXXZA+J8;+$m|Jh*`A25UUFS>zY at RNRS)+i#L7BUS
> z)fiVt(2mh5WS+0Ke4g|r>$0&2_pmNZxP|G9F!V(z)*Y{BYeN~vQ99PGeCAn!<XOU#
> z`U4pI7pTH_v8P3bKJ7C+qc^w#zr{6Nc0|L=;06uz1-CWE?>S3$5{Z|J at Zw?r=B4t6
> z$^0fErm0i)ll_ySRU{@PD-Hg6f5dN97e##r+Y4|7Y}jI97wpMm<d8bxuVM4n4~EYi
> z+#f`KA#pkHhdFLx9u+42cRb=7hzz9Mof3~YD~w_CPVa{zPs>nu8}{KFT5w^!$DybR
> zFY)x?p__^^H2t_tau?^$l67A@`|p1LFW%;viopv)OL at nU=dE4qiMd1M{yG<)?qMzP
> zP#+V&IoZF6?;PV5xm5-dE^S~j2`3m+Hk)81i=uKO8P1Y$A}6N6?*ZA6jO|I??W|Yy
> z-+2Nurw(<CHOY9zDPz54ShM~ncRn2hz&DqqbrD}K+VH9?zf{^1yvKO{Qqpd&eZ22+
> z<8_Qj8`fMKw*Yo^l52%<C9T?GBQa+#>_xOc at W0>_wpRo5TXm^Q%z^wU#P5pk-{CQj
> z+f;#hBnP at 52e=P)iwe0blObn}{tNaa>hpMv-7l3{S-$R-m$!5n)t&KG#;;(L7Q}=j
> z_V5+h^E*pJEj!fbnyX+dr--fGd%(>%2%f~qVVP_)jF~II^$+VjLQ5`DVwqw+`~WWd
> zw{Ik|=^34(=7Y4TIg1voho5J%7kss^#|+!p58Mc=k&{PdCpfk*6~WNeI1IL<QxS~u
> z6PoHp<Tv75A#;$?N$%@zc5@$2Qq{M(Njh6zkaS|Lp<?A^A3v8$#tPPF(pRq|UJSgl
> ziYMAN=wH!;EP}_fC-NTTCt<92lGw8Qj)s@<?2Cwt1&?H at 4473Zctq>(H$k^Ls9()i
> zlJ%?Y8OQC*z%Wr}F?df+66k8kNvXc5bPCRlCETtfQ$1D57$2XL`Ro_l%0=9xnZyi!
> zh5Z0H`zr)1P4gP`BfGG7{y=0H6|tk27-bB{_<dmMZ<Cx}Si|4KIyAU><(Mw~o(zBL
> z$H?20rWm>N$N^3NTzuyr at a$g*nK_zS?>S_TVK9bKY3ahl1Y>A?m2if)Oit-r6s5a~
> zT!Pl;))`<l4o)EJsIVGxQZ(K*>*+f4$2$dJT)OgxrHZ&W!72R~>^xiXJsETTci1a)
> znh9U#D25ZZE~lS+rMGWeF7)*-t%5odPxk-gZac%ibNtua_s44O+?dC%I5-zhQa=IM
> zNIO~gc`b-vdlQ(hBbeX73AA!C=jKAUn1c0PMH`UYs at Aoi5`B=F)AbBqf|1MjxA0Qi
> zMq*z+0=deKy-(YZh1^svb4y<dBx|^bb|5eRk3FR4gg^EW(jL$6BfR6qGL(V&PvYs?
> zhM~+@?6Z9E_3UKII;oWs3?bfYK06!h_*_B#18`XJa<Jdb1>a#Qc)k-+_v93HQS9QO
> z$ocR at wIA1{LvE<nthN_yKjQOyO!&}ISOa4FE)YUjV`t+$Fl^|f^W=Kq_Ua$xU=2sE
> zCxYqAMQ$GCP8kgh+^B!Xz%uP|itu(9MeYBZoe6tNGQrtC)dd&J{_naVv(9svoMj|e
> z8L>@_BWoJILx29#x17nt`QbTRN`My^b{JExpYV;GM#P>?M16dp$H=-cxyU1qxppJQ
> z^u2KE(|t^r2fMn+UJjYBnan2>=8tQSe<oXDPeyw$BeK=gy%1cIQssQ`k=GLpEo1~8
> z(Kq$2WX?g)RToVxu4Z2<4+~_*LHb at Ha&-ZF%fvdeeDJ-+ID+M43PC<bk;7^u^8a^4
> z1_3vMFYD{#zwEpF&;E~nSHSGMR>Z7w!B53SdvPIaaWU`S_U2r%c at KDW6u;kWJ36L-
> zU}u^Iz<#wxmYs4$mLb2SxLG)VE^GwQn_L*Kjflg9Ovc1?=r$3(KQF7dMDZuR)m8Q_
> zlzln_zo%o)O>MpdY%-7N{*i=JptM;?nJ0TNIG~OCR%JPCK$He}5bz8XkaJ at Hr{}mu
> z`Vp*U;7TZp9`|h!nbX8((#^++7#P at wfuAB6Ane2DS!CW;U at sow4&Jewx!@to at D}}6
> zt^I)5WNhE*XYr(Xo=FR?@j2w$*KsWu`8p<1=K18mm3Pf=iK7HKB>(#x+TedD7%uqX
> zPXQayCXd$6XDgkdybCEJ#LZN*o4avKd4I(%z4YnxxTUP2rVs|}KaAj(2!07R+90P*
> z;#91+0vpcQJnKgLF3m%nS5y9ap^b at y$Uzw&aPI>TwM;jKea9vz*g%Z4_ptvP*h=kN
> zz^jGxSQwXIGHXbbs#5!f5_#;&yKc7NT?_TC+~Zn*@;@~O|IPS+OgoM_zn93BDCZ7z
> z4rNLp-hBac+ at PP;SPu-|HyWQmVeozu)bE+|41>3!D7I&>AQNND)x*|3h+y$x?><5D
> zjN2diAO at Vt=LTHzV_=er9n}b53i`>@6$1fmRwsicD+JDNxC!_`=Umn+`bVhKcx5NS
> z3ljOxNMe2Qu0#)m3{;e60&WXBu=WMy%OLteW+d7N_Bk%*G{d8Tn9?_ErgWbBb4=+f
> z(W5GF(aV%>E=8^Mb+cs1+$u7Hc=<U#=zA;1fJc9fmovw;zRcQO?G*BiOq)(2vXxuB
> z7JILtw$})>^?w+9;<wzBWIaH6=J<7tj8<sviT)vakXPgF_f7zRHi^2X3AGd^mRPb9
> zKe6oSeb(aaeG#_XBB904ci%)m&c0QCeKV)}sWazp+`x?Y&zU$EnQ#l{K{?uG$bE1;
> z<cvieNrtj?*C3RCFvz9=hS4VFRvJCIRwD;GKQIHvS1I$-SGiTjQLwGqArA-=0xB7q
> z;)&7tZ?st`kuRQ<6TF=Zi^=|%OBQ at Kp9%LHWL*_(kylD!yDrm(;9bIDuO3}csDYhG
> zH(vD+F*Uf~vszz4+TN>*=+nTsIvE*f7Bj}Z$UIy-mTAW_*wUVl*C_?AlEDWaoPjz=
> zQ06tTpFnoKmICeq%xz$UpUK>XOUQh at i#7Eqd~RZ34`;BOnen!ZU|}KagxC-GWHc7v
> zzGk2h+hoJuA=e*8UvM0SmB3>nH%`7DoOCuJ;;+6^*tF}JxT~lwvxJDfwEf#I<AK9v
> z*eiA!%2t!OFj6l2j!8-tCXIvcG68ce>}jkKFOR$n`g|;7&pJsRNkmKmu3_d+v=sP7
> z0UsPoRu2-h1Q|nuYsKDT$EFlH-eU$C6AGL60!JyCi-?O%29CB7F<&Jl*UgquLKCSI
> zjxPi5^6h8G7rW|amyx-`K5YXpy}s2o&XNM~oe>ZI6u0A;S3@!w{k&&?=Xl{BQV&xq
> zu&^@Wi&$@+(ed8~Ay%vo&&Sxi*5Svw7N!MP$@azI3--l0<X}AZ&76y|IF;0Ad*Sor
> z5q2{0Ydhz$*Bf7<jwqS+!`eiAm#+R0mUxePP^zB*zWB2Q!~5qsjD8i9y at l5Jn8~{7
> z^Je#bIb=+>AMI{CE2%TM-^(;%q~82;W}Y#4O?J335My|(FeXKgx*#vza;yu)FRfqw
> zkIzFKqw+vBA8|>^tkSJERxxrNLdVCLwRu?xf5q0SNVDG9&9(g^dk5+mmMX}b+Iw^_
> zoo*BB$6c>rUwfrj7vhJrdixX@#s1xP+ws%0Vbk5*umHC17aT^K<XU_&#(`sL&+NJC
> z#xL9M9<SHDgZB6VGUkA5shu9s9l!OldHY`3YD6vrjmXgyAi8We5t+^13)}_pn-E{g
> zDR!ob^UtzU{#s(EcIn+(E^jaFN9UYsv^CaBw8dv+?SKu0%%fz;kZ*$j!d&?ktG#k$
> z!d=Al5PADe at Jjr+WKs)a<1-B;?`m2Ns}}K=N}Y86N63FrP4;{Zc==9U1g at 3Y_f-#d
> zp-PMK7V6mp{2KmD*|D%y-A)xE<|icRII)#XlJkz`t`eGweV|w#WYhLQ{@^pH8+aPP
> zljJnQrluZD><vHcd8!jXtPMNJ#CVAG<+fLWsU0inBy!+`8zd%6wMi<{mz^>wDfllg
> z>8}hIr}$4hoWGV8<WzHO^nFRWQxTiwY7e}_VX0^@Vz^)rCOYbL^mU2S1g_Dd)DpCP
> zz0Y2>35jjU1cyptQUlg4aL^;3rjCwH+MJ)9ln!45Y~-V=iL69qF{cNSw}8Dr>*Auo
> z+6g%hK9~1l+sq^~5GfyhTz@=AGux}2?qr#^*n;wy_6X-44qa?;7(<|+eHU0}B61ap
> zyAjNP1w1XVqq9CCx}xSkL^mYwGIFr7H`-_j(?+|WYonZJZ8YY&HtIvlQ#|=g8%b0A
> zhese!5aMZ-&J+oI2dVGBUnF)%$26DBO70t4<!UR~6PahfxCCQnJYs&l(ZAzu;~ZIu
> zoP-;&c^%Y9I`EskD;IeY`9;VTQegG<GV6D`9b9r2F^09ohm at J~)Q5y}LQ}@VkA(Sd
> z8$-stvS~@*YlYsUuALxqW`Li=+_uukwgh{Paa at 8|<v3P5#^u|(Wy(EdeSw^L061<r
> za?2+}hIe%5<$?T)HS|MEebN<z$Ctft1Fv1uMSeE=>2=#Df6OP_EBNi}XhtmOG31%|
> zZj19V;yV=oi}5|GZMjbc$zy2;UgYaaVKrp?<%pedix7c}Ms%G at A0LzrJ4ktS=!^@0
> zjn{LEkekPk?d25y!Bum_4SY1=>~nhLIDoI93^A#;6vSPm_;+6`@?w#;K%U|vHF9&W
> zmnky{P7w3|Ta$#l9ri2e?ra5ekCEIAv6aIDcjz2}yD*PjezSoI+p$IzCI_&+{@JF?
> z;F8V}4w|R at IY-7JPI0TxN&U~r3x~K8mwiTPaSlPfhNC?2Gs}Ii9 at A%&y&pWp4azL=
> z$f)T~<iHa1bBIin$oVLXj!^AhR-iKJlUSLU8`+R6svuVYo7fSU^sUf>95_b(9jrI7
> z;p&!ge<bUE$^gi0;o!<N!H*Wfeyn>HnC!W6PP%cJtkV;GH8XHr$UJK#Ee2<`gdIYU
> zR8?TFyg+2LM6&14B+s+h(rVobog8=PGJlncltl*<8#S3PtdEe}X9{9T%_c!YBi5oj
> z8oBB`_Bo>+ at w4Bq?Y2L|evR=2d$S@*w~%Wvjt)wV>D_tctOWMZOvH<V+fCQ6+tv*Z
> zCzo!HSU30=p{FtWxRH;w#)O=PNsNyKoMMPUh0V_>OlY+Fu~$O|#r3S~e~ewk2Zyjj
> z;Nu|o<fb-(Uysvz2{yz%=zCLYChUl(#&5=4h^;&YE=*3s;7Td?SZbzfj`!kLE9 at W^
> zBVxzaYx!?f*9l)2)JpCk9_gQT)u(pXZ-q;Ad61`XfKQm<U>~^Ib_ofG5y=Nv6m?`R
> za+ye6x?id~?x2%{{`l!1`@oy at K{DwBBk2QHZH^3b^%Pb$^ZkJXT<~s{z!Ch1<fErU
> zn0F-mhYI^g9QX-qzPtusRRnMhO2mi<3JVcuI~H-f(fAHUO!(yPeJ;;-K}i|M0uOK;
> z9Kqq_dVVyxet>&mu8V$l-H*bzu_xK_9 at P5buro6LB%kBN-v`?d*~jwzUT*ynxXv7K
> zedXF at TodfbMNT3oxI<=Olf5z1K<q>6caZNW47omDRa*2TeD<K;S$enmT%#Aa200WT
> z>m0=YMaDPrJqU~2=J^zm at lBpV`dHrA0lrk8h>4eW$2bSymusBEzDoKUJd}T)OF at -S
> z$G7oC)<ti at z3n=#r1OuqV`OCG-{c?gvqSzlMEdUN9AOq@=DfdM(=8)GW+E|4*gsx)
> z(>RV>iF%t;<iZJm8iS};r-saN<oa={k};>NOySJ9J^+4yEt&5h_Wvl0)a{Qs-#F;@
> zHNrV!6%*W8bT9A-3<HnA07I2CGy&K+M^(pwjw(%9M^$1Iby)kHP3!0sp$T<1qHZt%
> zle&ri16gICQJ^d}o_^Y9-D`sf%MEj7E^rF!@9q3Dv~?cl##F-V1b=TT_LC7Bk=Ncg
> z9 at GSYPvn!F>7F|>Hn?=W2fs9LLq4%LUA#dzb0R<5Q|C4z=X5`C%O*iyAn$WZ0xZu|
> z<aGE at Sl~CK^)!+F?8h!uhl+*+UtN%8^my)CvFqB-7oNt at V!ZhZ3tjRenGf>`N6gvL
> zzKc#8FHF0F+`6irRjLYLH=W4SIQ*sv?d*YeR(H4a0aX<^_tEcHk<{|pd_g(z8;t}u
> z6l0i-E!{HJe~|m>TC`!tMd(<SBpwRu7Ub2xtR;UNU;G`U at 0Jb2S`7}<Ki2A}x)<_m
> zc!M8o8uHu}2utwHLrx~%2zo;fAASPJli<5}J`St<xn(I4=&!%7<77`CLhQ2FNSx@~
> z-lOgjtc6R?6p&}J+6g8lWf7h=&*y}5WaHts-=S0G_>>S?o%HM9p9LE&p7js=ke(Tr
> zL;msI;Oijog=fBs=W((BJa02#bOj~DOTdglMlTZYPa!#g!v4p54SfE+9%ny$uQ2jX
> zuIFsD|M at wHA#1dTy7UZ1pw-I?|5yGw=-?7%3ByIPe%dCiwOMrIP}#G27x8r7VU3N$
> z*bq5M4ES~IDc)qfGWwAbd)%z)SKx=b4;xJd?5vMn`l_l6JRt{&ZYZc_KW6l!5MDm`
> zJ#Oh10uQ>5=&(UYQl!GY=xZI`eQ1iBf5^U0VJ7w?{RBR8XA|5E(a9G^x$fiE7-4Js
> zd%p-v>;eT19*b(i1w!=mzl?_@#9hxJ at AvfGY$M57ckb)r0HYQGSt0~;9Ph-`li>@=
> zJfvSu#`?&1qX26&o=f!Se|Ywv_s~wShv)k+>(`9!Hi9dDDy#fSeyAmTmy+yVlYtWo
> zQ=Ry8d%|b_$#n2THde#7Ri<&-z%Fc;65brdVo1P)0l840#OUdj(37E$r^e74%MN;y
> z<t`lrT-SP`h4ceC);Y5Kn3b7pChcgKoxm;x=2p!*ZyLp|HV(o&4#!;E#dX at oC?0|P
> z#-+m}R$LE!iOY8I)V?4r!rc3t?raQGSP&0=9`+sz{{Jeh?|*KaCte*`8%J;M8<&H;
> z+D`9Dw>IYd+Z`OZZ6|X6<-XZ_(q%HfelW7Ay5-4k(HU~8ZpA9J(LAbdL0_saa3Frq
> zz#1*OCWp-Vx=rqb9MWt*qZE2=upRO6{1eE<QC!UIF&|Hb?tMfZM(lV)#YQ21e?!*y
> zk7pXs6T3Itk8n%qXTP(_$cBt{eYgbj`6TqkR-(Uk%b|P7 at 8{R%CpzJgr^j at TgsavN
> zN2g|rf7vM!*5fy83h&G#>#?xx6j`62{U;m;WPN_N{;vJ&c!d6NO*eN*6)+@~m|r2}
> znMNtue_V44eu_NEb6bi3Rt=kT(gwn%sQd!DNTdGIb2`PV%x}U!asu*+H{_TiMoy9O
> zOQMG+tgS at bFmmt6KVcaU{|U=D3jUDIxwqETTG}3nIQQh>dN?$mksl$Wy5vXK{8C|0
> zW<SQhm(1u;E1_S0>sp%}OWblY)X=Hy30I**?L`jc3f-swP~X63^)+_ax465$WyC%}
> zYz25v#AL&k{v6&i)e3p^k2>CzdpM{(!885r3nJrUoqn>#hPmho4pk>)`ObwQXKeF=
> z(bmzfwuZd;ovO^GGZ0LZ at Fe_8Z{BVVI(YlbQP9b-Z}_&Bb?2XcU)z^poY<KuJl;4W
> zS7U7=*t-qdX$7~$zpz&me1?`!t`SZOo8q`aY>R3#$2TCZTgv-co5=nGGV?JaA13kn
> zHmw3O(+$kYnY>1{Ybb*Y8_c@?u$Exlcn_HCko(gXz`LzofNN9Omx6$kWNa11-I%sG
> z%VW(of<41?-X|QS1lL&!P8pU`=TKGhd{u`DXAQl9 at YL`Qy5jkVR>6)A3>J_0!zlG-
> z)MX&bFU35c$qLnuhm8A2+dk4aE{r-J4*M5)TQNW3uf;v-&~L8uA2aW$A$SE+9>Llr
> zl#n>;hqch%Ic)8zOjRYZ(H&hxIKaVg%jll$OMk}Bl~=poA+QYCx&8DO;O<6n^Ra&H
> zhA%e&c$7maquBfGNvekgH>1C!%pl{i8$SoE8_~0feGYuw1ml2bi~;ur{N`L>zQ9j=
> z&qk9NfME9HWSPp8`VcmehhB}HYDqg{@TGBgsG;iN%H#ugFdjZ&cp=N{)TIYC at -f68
> zX%&cC?{{+e)!=V`m-v`}oT{)1>SE8+(>{RDSwX`G8I?7g=w_<p_G0!IG2=bQ;C!>6
> zRJ9M^SGzd5>@~Hj_xyG&ruGkTPYaN#qDT&U8*4hn_{;jj$32X+xq*6L614k%!^&vy
> z39aCjzIsBR{m=F_a6T6^JicL1?JVHu_yjm)A>M_NA%vYSP88t}zk3MP<#MITRUY){
> zpNVgapGmmR6M<_Ze6`7Z%w0R;v;+zFtpX+DQ(NAK?FwVYOAg(+ME5D-U4&i%8PKI$
> z40UmTLASs>qi7mD_N1&+KE>cQw|dXGTA6Asipo3fCD+|i>IJoH?lbY~g6Ub{emDx-
> zOqP}KUwQZ(C$=cy2o5qlJsurJiJYfgJ at BV`5FHk4rw1?!M5YVEJsheqk;sE92p<V-
> z74M-9#;j`Bv$}utSGB{>GFs2_lG_4seW1_DR8dQz`aQxA3x23E?5)UI`7eUg#s9*z
> zeD+pSH(Q_=#q<l-JMf~EI%l%K(hqXU*>@A+7ebyjrY;=9RRXT8sWsFmA2gP<N?gBJ
> zUB_=Ru_u9das+D~eE7-Bd|S5Rb6}b8wPX0$AX{gtMfb8a7di at 8N5ZDr3i}as3a98k
> zMSCi#W#F8mY2<tZkFL6jeG&GaLP34&d-}PE8(oZJKf3tIpmP>#rXyFel-NbO?MQJx
> zF|Zqrh5aa&tf5lT&GJ+$ANgp|H{jVy3>;Gk+|}Wm3j<69e}$aa&XNe&&D5w52f06`
> z<h{JAw%UqfH{9Y|wu0Mw!{y4UYEge1en+KU^OD&@nfA0KgWCc&TW6&ld6v}oz<Gf7
> z^J30rk$y at RIkKMm#nlu3?|yOU!g;{9R44jKI+-!TVeUWd7who5`6|ECDNyYPwrrYF
> zt~Ap;#HHlJR>C8A?906Tq at szx{X{S**9x2-%&`$D?+{bo7)htrzq|j&yZR5;9m4s;
> zwg^0r5B-*mElx|d`aNaSE#PzEml^HSo0ft5N)^uR+k6+68}}Z>Cnq(NZ<cd14<dIl
> z@(5!Nc`!a^<g8?8(+}eg=4&MPmK<wc1b_O^550 at 1i2r~Wypzm1<R*NN8C%7EsK>2O
> z|2__}pMc{I{8gXxs|9slHCRgqMEietgN$VypP<Vrny|;aXu{DK at lh2`+N3I)z?;}m
> zy7`O7qW71PaqLBHbSKx6V|YKcs+q2EwLu4~vHJaGl1DM&o`Xrbz^FT2 at 47TLTKe4$
> z!r_s>zM*pS9+Hp9bD&K?IGP&E-v?Fz_YB0?pz<|E6SlvA@@K|zY1&>8cMn*KyB|3T
> zzkBDyX@|SSaTn_NrFKniueq?ji0BAOSEm)c$I0LsieT at gIq(U;%{!qH#TAp75kK$~
> z3F`O${J2608-k^f?okxmZ{dgVp{Ob_7qhTeH)+BhTkw53xyVt5ycsPIYg>~a{Y36v
> zq{6+O^gw0%;zy3k7I(=L_ybCoNHJGrs$=**j_(3|9|Kp)gb`mOwi(~NQ0O`2+h-W|
> z2uFdnzu~ykJ>hro02SOEF!{GOVA(XIR-18Oz9O(Q at c{CQ#NFwi(Jt;yWejvwYS?_p
> zJ(v$sxb78;RpZTm%MW%+-S^!*M2Uv28h_R3`&T8--^IW^Ms~bRi#j}E8<-;=t11#7
> zizy?|T5=ruVD2gp8(X}bd%px1h=`pId;2u8D5gwz!a_azZvy1OxURDgiG1t6wV4%J
> zFFqD$Bb at kSz5}KynB8VeX72*GSDB8-cOr*L7v^<YWzRfnvw!5I&`g7INk50Nxj$?l
> zuSITKB6bw%((rpMdpLd<8iUPMv at n4hbJmfS;X&*pAA}n*w)9hC(*>v5Gk)w at G{GQ`
> zO%a?H at Bgun1u@+UE8_hK$4rezp{lUU<JYx!BG!5b>|@do!c!#4FJ0)V+TV6eSt_VM
> znYdd(I8MRErvZNa^ss&KXJsL$PoX+bH8)_f$`+tjf%AubP|o=#ot`JToUe9NcjhG&
> zn52F+P8vM^68=%ASefNq&rY)iPS0|xCWqE>l=KDD^en8cXD^hr6m`y;?z|Acde4QA
> zr-S!kk_hd07rx$0oio_ko%@H$Hkw<SG@*F`G1khr)EY+}^m?vlyuq(7yuWo!eUz-r
> z1{~xG2i;|LSRXZ at o^>Aa&>>Q4UOc`+)ARTSjhi9c8SD|%cB0o>O~9fVX}`K#2}ksS
> zyZsL%p0q)ld~ct4)|2?Qe(=lpaxdlEGlyl!@cU(VbIw at z3j80qOQu8&1@>p;{{7mI
> zSADymkjS>=y|=W1yG@)_XUkW6&FM4=)u|0$P2jW2?(~S;KsUzGf;vu1r&aQptSOo;
> zt+T=&Ix05#vwEZi#|;HPusp36`(UQZEWhs92AljmZ_d?9U}ZKzPP>uKa^HR6qWgY+
> z9qKTmmp;Rjl*8K(eBuI<g9AK2<;b7gmA}RzS2rII*D&WL_rOzMsBR{Ch8g=#Kg1|Q
> zZ{lR9ye!<6J<Gi`o88}ZAi~|!eJ`$E7zMs*d~<giUv<^h>1l{<3Ma?<SMQH-hy8|>
> zr=)d=TZ8-<mHrL!4+^dNjfiRVb$ovNOLM12WT>|Z4E4Xt3_H#uSIU26NC8y~J;eju
> zUOf^Pru6}D(nYUk(moF>hRL)B<d;PKlQSJg>;se1AH{L)QpxX0msIAYH&ta at 5uZVG
> zT11+&SJj%gCA2*AE4kQfJ|#ZxC=zGwtql9sVV3(|1|9$$*?onTz!-4lzBlExy4UX+
> z(q7tK(q0uA(vL<MWyg7%7e3-5AKGK>#_so1TME_JV#BbX7i!)<9-$e8Yk+IiZ{*3k
> z`!-eHcTR6{(p=KF^YN^Fl;4onC3y_~w%E1_yziaDBil7244uwk!)FcP%x{ZS{oZz&
> zlY_X<sMMcukHk?=_~ID*va*y?%dmD%V{glmKu(>Dy{^uq!_WU(nN6muO6e=K(PH4W
> z)a<Qw;m{F at -Vu*HJE8={BOpHr;+G=8bCAE-Qvcu^P7-Oa&B<|udvhN0uJ5f&p!TN)
> zz!r~OP3k=0tHTk~9L~!`zyEH01+mCUyfo6*+6d_W*n73Ce`*KBWhb$FF>$HVmYKkX
> zoJ<~pcv&9Da&^-xzs=IsG|>gpUxE)g33$Ca&#cr=$V=Go$=a2_M(OnPZC&8J7#p^1
> zlH=R_B;_XTficcL<Xt^6-caY!dDLnv_OrKY3Ll>FETU^9kFY0~5qt;T*;xFzWtglj
> zh!6jK-XT-C&?2bcw%GKQm&_t>EIw1DI-p%_ucSr%O6|hD!@&EM7$v-4wI4SA((qDl
> zp<2YgcF5PSL=mXkZ4GHW)X<+Qyn*<rRS{QVdqi#qfzS%Mrwclj8N3Ny0#SQ|bAX}n
> z@^}N4{2KC`h}y5<<Df_KZWGz5 at 8{TWMk=eei+MM&_We`+%27WNQ@?Q3uMl|H)4M7Z
> z;VQ~To<A at b{3gI8hV!g)zJo&Um}*>qPEe=#D0)%M&IsRDO1~i7VhOev&;xxcN!{Q(
> zHyh=ozL3iV7 at L|RYQ>AnJ>Z at w1;_45<iMd;^uy;RaGcjEl9_tWW$IZ2jt^?39JrPl
> zamab<`5WC;G;z8jw{WI^<1e=c at w1^j+0uLS&6;Gy4~h-V3qm;G8r`qjXt_s<P3GvN
> z#lkOeO(m|e;hGxb2%L-HBvq4hQsE(|MR>F>*mbQ&Bs_*|t6bM&9~_TsCEe%1m5X!L
> zX^%(E(jcY|>#Hg4?OY1=xN>U{xDGHUbQ5#GN(;kSu7xdRC~HP1ht(_XapPCF2C+Bl
> zhZjwVZseCnkBQk1{T*?w9c9s>OTCfXu{>hNRmuo1t<K(Vc^Tn`pXbVi)e$q=D3Tv_
> z^YsS3B)cJH^I5KZqXF?Wy(!8b%HC!YlCpCt%~?)jbj+%~SX-~^ni>y1c6e+{Ur*}c
> z^O-<&_p08FjDfqq=r)piagxZjQmLWbhMc&P9B{KX!JqjxYew{#4?jvD&j*$)-z$2|
> zs=Z>-BAaw}L3wo8s=YOR2`(xBhH(g<XGJbIfA)6Me}p9{R}WorBEEM$U%sx1k33xY
> zL!Xvo3}K6+hpyU-XBJ3y0cRPQKSV6P3~W0vi721(`&?w5iBJrW@|%4fyrC_-bWL$t
> zx{VxZv|`m>eJ{37aJrEO2CD^eM&;h3=h{w$whQTQy9k4=MJBX@%LKMQ!VmAcEM{2#
> z at R;77lT)fjQrb{<inmBntalHxkh0;krqXH}f4DUW>(Vr|$H)A9sWhnE7Kl0P;1?m*
> ztf&4((th`Pkavj)8_w{Xk~&MJ{Blz$;)h&qzA1fu;Cn_7){M6P3E+T1S$g3Yc+VTw
> z;3Gw*aXyu#{m>@Efth!;^?Ft>D`^iM(;frGqRV2VXA!lGVu#^*qQ5?`yG;jnx2gC~
> zZAxNB0`mu;O~p^!v|PfPfp*P;9(yJt=6VV8#E^D9sx@;Yx{VlDTU=uS?K2qTEM at bT
> z+)%B8<RI{5lVfPJ=oBlj(YTIjGZWgZ3~iPaAsRk4?Fkvv!fo357;it3@#d3 at I^TAU
> zwR`Om{OcvUjqI_~*(v4e>qi4`mp_Q$t|ea>vcv*IRiez}VKjf$USlBMw?`?ZIfL(h
> zIKS0Ui1XA#S>vu-gK`hA31g2<U+z)DjFHUlcbSAS;(C`{E$?sd;?BIwH{4(??B(6>
> z;*NKTOsN9bjzdT@^CtxJCzzQ(C2K^k`D1iP9c0hH&+i|&`u_Ks5x&Et{_;NknfKXd
> z$nqoaQ`P-G0nm}Ilm7dCE#A4W*w<nfix!H>*e7M^k9*uiPQena7hL2^re+QWmXhmc
> zp=ozB#`STV2NSQC2aFgc9u0X-<8H%PHyZ;e$`AQ=>DPqCH395-f^U{=&R04p^@*TT
> zC)UTMvxOG9%t1jH1wZER$gxut*)c##X(OQ%Ava`n=!YNDbi#@4wzzDY9J!{$`9(%~
> zQS9IoK{2T``>g&Yen!$U$9~)!bQ3z$evW&EZiDc6gcR$0e}1+8rm!@EGd#`D<JVj1
> zpO2}~84Cj5IM04P^w`D8<XOMhqwju$>>ojR(ZKQdGUTZUUaHp3YaQ0bxipP-ZHdcn
> zTj663kUA=D{zBx>+;JOwOtO9|d#8;Dd6<Xyh+kdRrtY;aBZBqN7?4|pz3 at A$l)c;-
> zmYcP;r{&<Miw#8y5+B#|>zU`j#XNr#!AgL~bb3+j at HNEldvR5|Z|(_O2w$HpQf)m|
> zah0MM&zI?r&6kt^axXrmfAJngv&iw)2C?`W4I9TT-LV>Ki3rCntboy2S8z<IJ9dPU
> z2fL2(kb~28jNN4v%&)=kt*68|w|G8toani4Jn*nZ1o2I_VJMq5KLXFYb;`yHIAtaO
> zbF(y^;3~y^<oL~3Fm~3F`^ob<y34MilDq3573G;-&#R%t-N*DAq4|^q_ps(y;oPlL
> z%yINHr}4|{$)(w}Z-6y=%$i5=A7;k*<U~f!P*L|Eu4I==aeh6<_`;PRiT!Vu-9E`T
> zJIAqBx_F;{od#cgx$b^0xRH=6#MoSzjCZ{}KEb9h at 6J`PZXDI%Zm&$|1XV&8G12X+
> z_ly{0ki|46=!x`2;b;1Ne5-DGLV^A}VNIu+Jw&hN-$kC%!rouH?aSD}>>=?^S~*jn
> zQ8Zz~B7TK_AMC%6*;n<y1zBJ_EYp8TQR^TldLUlSFQTR%v9!@nT3AyfQ(6VzEDaOX
> zZ~auUJb&qNUPGm%%@E)rU~d$^9AidK>nQzj!wA|R<@O7zrV01A#zDzN9IWqTKSdse
> zkMpt;K2}{wbC)=c5lc#ucexkxV$L>hg54Fl71BpYyfJ6j5_^Jv!POl}L06qgK`V9o
> z-ld;C7Ol*=`A+VBoA8rM*gwjX{aS+|Z+$J6C~eEct-(gY)hczdmeRc8p~L at B#8=*s
> zbJ~_b#)i#<eJy!L%L%m8;@f*yx?}uj*<`>Rb#f%gJBRbEmgvwJ;2IUj+WPZPVx2A2
> zO@#a~KCj3o$~!0)v6pM*<TvXft-)L~Vm%fpO35{e<Iw)~TbnTlVuw#+ej_fYc85mP
> zr#VA1Sw8cugW5OTz2<`2g(t&4eZ>@<Tev#dLfsLq05 at ms!&GbTo+YxYMol5fO at 0sG
> z_JZ`jKGVrqj_|!%25v5 at T@3p&a$#eS;nQl#FUcZDDKJBj6V}ecH!r%^+UOQduWZEn
> zjE0;V7v}F6gZz}KOGFF9zZA?g- at LI>STj22qX6I8l(e6+{N|vs)om+<6%l=J%SZQH
> zu_V$@Nwulm^iC&o%MWtPankNJ&PP<%G9k5Rd8l8de&kiyU=U9Y-5&X4i<}RIM)+=y
> z;rUYzh=D(!!TZ8{)K%gKXw`C#7im5my at MXfZi)_DJH<GJ+LI8#K9I~&rG{}GnbAXW
> zkEH)2{eqZ^wjhd1PQ<(vCY0C$z>Ph?nZ`Uzm~i)Dt<P3{eazjq72q-Vy{dCP%iV_9
> zjSbM7*I}%zu}OiW at 5I`7nQzubvPb7ikQWzvWZE42P02m`cFAS?Bgr+K&o?}oDPZ@*
> zJ^cKSS>QEoyXX|ND#=(xJHx(-eL&8hja<jh{6&zHk>gWxn7>))#ovbdMz;j_s at e5Y
> zWATmi$h9>L+!1wielrcUH_}&e-Mz}6HDZ1>;uy}L{Dn3F>l=N3L=DC^(T@*fzN}I7
> z&tIrmpT7X-M~f3{&HB$s`H~wtaO@<^Q&#E1Iorrs#n^Asue!>n$3reTjCjdujfZYD
> z<9lx7t{Y!kj?vOyIq2i7q%HQ(M7uA*b at u{o7#9nzOB=sz=nwtC-RDlSuj-iflejF%
> z3RHUUt6bWXzdhP3vqVfeikw{qGEFG at bA4V@(&Qu6S>p^%m)rO?WQ`IpyKNJ{+^0;g
> z=0tVRp+ at n`zuNK_g8#KNvjjM|a{Y|Pk{jnoBi0J-&%_jX_%ZMO8hKw2&(w>J)xE=3
> zPZcM(+VVeER-vsM>1l??H)TXmXPtozR1BMCENgdAh2Zq}TU|LM@)r{uFQdP3S}8 at K
> zM^1qk>l<4*%kwy&Jt{XG+y;wVj(RVy%||TrgkpbQfz;RCtbOH3VXA<aC-n`2?$x?B
> z8K0Xk8469%anyH}RYq_48%O0<*o0RL)#8OwxTg%)RpC1Lx^QnWt`p<jU2-mnoLlPz
> z-e%^QhRSqL`*wV8rhA0sV=ny!4F2|XkE at T>VjkAJ;S^#-a325h9M{^0GWyLnclRUg
> zzK!2Eu$lGR<~`v7);zLSdrdce1+Laa$sNq$a;Ye#+_ciq96d%|nIe`PGzG_H8OO2r
> zVBMZlC!);Bb*?qL%Y%KOA>;_PXk1VQ_O0>&Q6qIz2uy>hv``a<{8ROAPj&^n=`$kW
> zQ$(Ij$!*vK=F~LMl9lW(4`IIdq!!enO|1y`$THEukX;3)d(!VX)?Pk(Ho;e}WJ5lV
> z at A4E@J3Bwh5}f(wYvgH#tbe7{Ta<3{7FiG%kRNXfulZS{Mwy;MYjo(^h54MI=m6+z
> z;OqupcPVr=_+?~8k at uz+#SZ!mbFeKe2jwmmXQrF=y;eqxW7pgC!&km8IQ_3YlT;-~
> zzJV@{D6c6^WN5f7GyFX5kA31NW^Q(>J~eKFJV9&$KU3y);oxrkX4xYn^!6K<C0V9Z
> zc-JQW39P>pd;T0$#JpcH(UFx_jFZY@@N2^-4emv+ou)eI$=@v7<NeOH?aXxo^v9X3
> zHSl?vot?0~!IzQB4~jL8WDge4c2qhuRWtP4@~8#A8-^r%I10d5iM- at 1qy3h~ZOuJj
> zG*Kc7GV3&MmAmAu#GLT{HPw>QmDopiLm#Wen8tp&{B1$~XP+_q<!fZW#2VOFwe99R
> zrJtpVJQBO-#`U(#jdvObVs2ytdj*^_>LeSJ>8QefY;*o3gpSIz^Bc~_<AEBfa!!C$
> zRfG1fG0GCOcn;oac~3mYN_V2Ye+e#%nU}vvaOSjJu|6(EoOsG6PVBPjf0EpAim}!#
> zH+=p*nTMUkH^&}qdxg>4ax?r%U*9%*i&Q1pA4}w%Yv8_gl(voKS9IJ^I>q8AB=0w+
> z^@hJ)QWSZIBKxLlo&F2{F-3S>O3th9HX>J=gv2&cLxEqnNQ3KjEZ~)hkI2}4-!v~d
> z?A;Wx$&miTy0zHq6;ztj<(>szr*B7}U+{k9{0)@&yGANMjJ73{{zJ?dWFD(ij^`!_
> zt)#q7tAbvK{2I=*E%Hi9+PvhzuAy9vhr9eTLEYQ4O^ERv5Of4Mzm*ZpKCcGO=S|f*
> zla#&Dw(e at 3CU{gAu3KUAD~dc+$c|0+U38*Nk<h{9+?3_%kO$+}CH|@c<G`ZWmqzn*
> zG*VTmE;%SqP`~?gn>X{EBN#_|TL8`<iLY{UJxq?t3DiDuf2+U0qvjWzu)5>nvgF%a
> z+*DmJ^snja-4RF!;#n#Oa$GHgZ%TEH4kos6*jZ>*6>`QR at 9xw3GTbUdrBX*#o5V{d
> zh8&PH$h|yfm?b&V?<&<6WT0q9He}?AChS>G&G_y<ULtW4e-U#Jm$_%)|MQ-uu6sHp
> z2^5jPkQ>T^yoXlpYk$Zp+SkzM;-NCd$h^GD at xU;I0y{Gf<GgOd>k%TzDWco3lTVlq
> z8yoQ1!>cw{;X}c0#IYZc9A-bjo>W at 74*OX1m at cxX-uLL0vkM$Mi+!*b!saaX?O9&T
> zilL>xN#(^6SDQ5BN`H<PtzHYvP%;^lIpdWxGR7^j<RBkoMuc)6;%v;yG2C^|pMZt&
> zK-*=boW2gr-}l*sPjs^Gwn=CCGWOz3<fNLHw>@mOqebt|FO8X(mx~X<tHutPh<&X7
> z^AP6utj3>bk3Zh5akn?hUmacK6!YMV;iWM;EO_1oqU--9`rn#ZX8oYnd at 3aIjKEX#
> zb`x8p%@^{%T3H2bF0p%5GS^N6{)ya^D6G-?lJz}r8_G1}*rcCld&yA`aDw6YJk+CZ
> z!mG^h$;|I?$SOHoZAxlu#qe;&_`Fnmq9S~oIQPdTSaZu34X;@ybv)iGL7tHf!>jT8
> z&Q>XYFSeJ;-4svkl|!lo- at MkroL|RWd!ISKhPn1Pl$Y)*4`sPC=R28e6PWXNnQND#
> zte(%x+Q*z<&s^KVoR4R&y at 9f{&&u*6=UXGmwd&L4eCtGVt-3b%TkOl(G;%Y`d**4^
> z)M78|qpey~>rtZc$xD~{52tReDJ^`^$^74(?qfL8RpIea at j+f{#PH#p{5-Blg^R8y
> zr!P1Bs7%alUsG$pDu2=PWKAtcn3kRUc&i8;wGz&@Wl5?e^q1MrvEP*Ux>`-&TloVI
> zu at YkSJsY0mbUnjRlPvSdQ}oVD5%*Xck<Ry!;@l?jsLM~%E%&nNd*I^m94<qjZiC%C
> z0I^aff_m-y$i1%f3saRi<9R=6->UtA4hw?KZbQ}WZFr~th&f*{9CIS_->|1nYM#{4
> zDDR06a;~Mn%0KedRvQt)w;U4?`J|?>Q$*wuA^hmARXpD~ipVNX|AtEW3%Kt^eBAKq
> zg->sM`rxDHrP*Zo?jg+9zZq1m at 5Mh1xuVSWs)N#mnJG<3LJh`Os_sMTh at F(v2Rc+p
> zZqZiJ)z8!uVCRwK=B}xQjVI2d1bWkHXS`AugK-6X<156spMKYImj+H7b^cD?gWX3w
> ztIH;ijk6)X{2lRZq&BP9Hr^I>&#icsYtIIM0<#X^BXORPhZz}hqzBp#{(K at MdPd{;
> zV%P5x-+RB~v_N0CB#Yvzcp~s3;+yC`e=mazJm|CgqP^d_{g3wv>eD{735q7!qjL+F
> z!j>-(-8!FY4XSpEgyx(u_iCq1Xv^WdzwVSn&U+2A>^ZWAlDUj{7GgKNj=c)&CuGz}
> zkgLd(&pM9jtv(i;9BsN5@|B-^p at tXto-vqj)gYfF{3Pa#2*>`;AC^4H(Fkk08cHkZ
> zT2iKAhhMP4Ia$EE&+NS$6Q<lOWAqIwqIYJLU%$ms5gsZk{ej_N;w<ICbOXCXaJoRt
> zygP@{F-szb;W~`-^yQ7a{O=;3W7(0yJpxG%bRfdf{^4`i9ubRPE^7+|&ylE=!Puld
> z at RI-U`@JZaTmif&oA~wfLu`JmY+INYMe-)dIgZr=QA=5hFZ^+Lz^@^?O*0q_*mXLM
> zkWuP4eb3y}2lw=X?_ at t^{`7^$;vWVQox;$xpsn%Ov6B#YTN}UbcxW#*_W9_T at l)M0
> z<jcGcaNTR#rWZ||cLihNOg+gRHSwJxkVCHVZKr})RGu=;r`kJbqE1sIp(|j&Z>aqD
> zH+Fm={|Uf75<Yc;6M2sQ{SEqPW?YkQ;xHMw&8oFBp59xKNp#Q$+JO|+dnMa$8_lkT
> zAFwQGlB(zJwoz8iq`0NhSY^4Ou0ODRaaq+Nyc7F^v7ZQd$QJ}osqnZg`eK|Dw#($O
> z{SMobxsC#X=;6FhbrH3&B~FgtbK78-`AAlJOjB#%ZjhBe!guFl8Lv{_ck1wbwSlJn
> zyY+#1#2>=fr+X3hj`72*=)sUL$ElLZ{%C`YE_dfwV=YVLf0sFRmyBxa9S&LPy6OPz
> z=3kJxx49k1FkkQ=^_`dyI+xh=^R_YZmN8y)Ak)mj|2^PJtg^}(Jz*i)yCH8c#PykE
> zY*-_h<1=w=wo%?tAi0Fk&#VZ6sO=Z#Jab=Ou2I at hAb*u-dG6RD=GYk2`8{SXP^- at I
> zk=yZh56q{X_*}v|krC~G`WV5WFfyGQb0-aY$1=A^(Zgp5fb+OTixKBAp=Ju**}T6U
> zaSqW;e&owLM^DL-!+t^~^|4ou-U#_^7e2f3$-rk1J~{a4@!5;dc3{QGwd0f}c#om@
> z48dn0J_F!8(c4}HCcq;o-#8w4ra;&+55W$3A))F(c>iks6JbS)uh1$7KJow1_3d#{
> zRbBsDd7;2d7o8DtP*OlehCyJ?T$qL;ATzvFpn^U&%7|ouhBCltM1YhQLKZ3`BH)M)
> z$bA@?!+1%NC&8?zbV3>xaWX|hB{<57-**pKJ at 5Pe{@9<r&p!L?v(G;Jvi4fvwHD3+
> zShsp6WA2dnh4gy(1{OLzV~_?l8Ke$L$gd^y3Vpyb1MqEGg>NynPr7{-e7C0ybF%zE
> zv!2rDZxwRIjdS2L_jyqt^rXLJ1fqMhgRMtduAqszqSRpAK4Xy0Y#{azen=&}3Z=SU
> z<eY<ZmJz&@uWa8UQEb;i_c_xJbQGVrvr>xpMd8dj9(m(kkHUxM_jkPFX?%l$eWZxg
> zfsTl;^L!oW;@$o5-IzIEu><_R`c!Anwa|Bu%z4#@5r)3X;xPuoy8w0*XQF^Ft`yRQ
> z*Ayo#5B_<sA_et+%G8 at 5XWHSc&;kC4h47kiE at 152so*3-#zl<XX!}Mg`9sL3K at -Er
> zSMDK>Xj8b-%_bvaq6z}X#P6vPmwv8VhWE6&9tKXLD5uupK<?|{<M2y%mGBdEJ${}i
> z at T?wjHR8-3Pfx7x%2bvqDSO8|z6vr&#voGcz#8&~L0qz{5SSv2kCtnY1%z!cD$1}D
> z-i`e|@F4Dje_&=zg)c?p+ at h9RJ;lN^b(OQh_qaZ%iQhc=dz)NT3XB}?!S+cF*2Vly
> zi>;m}?@~{dV3=3NOm at h%@hwhb-pz5X1b?wib-bjk!+Qa2G(0F%=^nJIjuXB$>>IWj
> zk_ at WyMXnEA)6l*}hNr<lbhCPT2-njF&-gx*WKL5*H@*+{f%l}&<}|otpU&`exVb42
> z at 5Fq|C4A1WmF?gU9GA|)vx(LP^)staBn#&pzsJ#^NEE_$?2CnLg3vS+54%<wo}4N?
> zyWp>9v&plzHQCkR(f(1-i}Qg~B>x5V9u)QGt}QBy2c4ig)^b2PXLb{0&I`!e47xlU
> zJUO!ddE&er5w^fIzFrFcQS<17*$YPI*?-L|1<i2mwXAEoeBckoVg5H!oAK<opl at 1$
> zQ@#k?k;ZmTYbLg1ZXLtD%h)qsXJ&}{P{y3&2wiWl_NMSt4yVA6T2UN_`Lb34zC7m1
> z8RY at nb+m#FoVqOl&jkd{DgM!2Xl3N%ql}dJj;5d5Vz?v0{(GkVyW7n(4KCrgs&zB|
> zuXYNKg!!AE#eAQJFa_axgbDaJuQhtRR;T%eq!&j+4~f&mWy3}NI%#8vis;EOucU+T
> zCeMi(={rsP at 3+s0Sge~)7*{SVg*Z{LgZTYK8!FIGO?$w90M9a at _z13VR>PhPcv61b
> zR#y5uECR3J6JbH|5&MJvlF^lWoPkaKrn+paa6zSqn{{!8fBazsp_L?rk6qMQd<1EK
> zi~&grttRgiid=FWAzxZJv6$sL$UWSCr7ISK<~_flvB#CjeT(XC&&crnf+B)dXgEM=
> z>9a1w&w@`aBfdyIgw{dBLb6uj*~A6)kYCrQxq)VpkTW*c>XlJ!*ymBDjChLwKqG9v
> zdIM|6QPvf!qMXoYu70Af3jB|7N at _JB-H_v`8Z4Mv8k*Rnh at j>vDm^%Y+trEH9lcfV
> z+RWEWPbBs^!6%=xj!l7FNd at _YP+PAOl{O_lDC(#bYOkynDc1O{yrp6WPSA-T&EREA
> zc#gOp|B<~??ZX0tcFNVD@>hOZDYoxOJsZ~Kj=Da2N)cHpnd+azQM|)=TW2xeGX_&n
> zqJDSC93(tBc-TA_x8E?9Z=Dl+G}eK~eGYs4p}=>7Qi1)hE8akVpCNfqqx0b%r;a{0
> zF<xZ6xdu}6&KNWP&@N!Ta2}lUj3!%(GGc{#U<ULdIfbnm%`qm(E?<2_<nW$Vt-v03
> zFr4<ox32<M80T6{#&M?~;kjaLN`WVy51xy6{9@^b2>PRq++~3YL0OoaYYup6Jpx^@
> zuLN6Joj6L9cAhtC0DK>2qGv7E!v=SW)%XXuTB>Ts8o6&w%^vu$nteeTkkvS$NqW@!
> zD&yUcZ{{Ukbk&wJ^Rx!lyyd`%bb6-3K5$l}y=LYjr8IRMPo525 at 0qqfUKfBqtsrw!
> z7S0Li6X}21dJeLA@(un^zQO*W3;!ncWw9^$w|{i|s=BCKl28xY>x~L2u>7CSG4)ee
> zH}l45_V_}!*{sxLi$UL=<Bh?)Z?gkMt%*XOA at zPyYqAjX_)gf1hYb;a>xNSoU2zsT
> zFjcaXT7DSUEyMHO_3IWf at PFRCd+Zg@deUxba1Wh2%J$!@|N8HI`woMDOiDi$=a9pJ
> zZ3El?<~_XVs{FFYZut#he`vLbsf{J?j9z|tr0(A_2Wnx*9`;^h3-HcNlFtm_+hq7Z
> zS5v(2?n+1`dn<U(Ed#>iiHxuPYrvb>{sHNKk9uoBPI$C2hci6paPDaRyPf?s=7JL$
> z*9ZK8L-USX2wlw}wCMmPv6i<g%ju*CrZ%&X&<_d*x<#s)i(F~&3GXxh<o&ij&PE>}
> z|ErI^UG=h;U7KdQ!T*p)rwQ_lzx#XMKl>ZFO>d{No_GbpJ<&-g6l!U(lGaV*RY*f1
> zL!MJe<4pGT0l~U}Y)SQ%P$BpZ1C#xu!<2QfVb}tUOa<Cu0?%lbj_(wy^Dlz`OW;+4
> zt<sVG^7}{4+MU44{n=?0u{n+}Hc at s;O0^AsPp*xuh3{&=_)wzsD^67EcZ#i8BS7cP
> zbzBoR1M9;ys~I}hY at qn8ae(W3*R}`F$37;!1)B at nx=P<_8h$_y7^GysPtfVah#|jW
> zfA%!7W<@^ufu+S83N;zcpq0+Wn5gg`6EHWaltX6ijXKUej}&FV9Y#BNN1`2CCy8G?
> z(&kB-7UH|Un1}ySKl at v2z#fS}@3Mq*XypD>U_txS2dYaM(SoL&+X7S0^T3qu6x86E
> zaD!J7)+O7y<yB at GXy+hc$&P at AI9&RL>Rm?``@o_G56HtLox298l3fPx`PJ1vqxa-^
> zPpAiPxAso7pb4?QN3U2 at 4gS&qCu)#<2e9MaGWh<%8SK?Qk+vgV1m5y9+N^#26z`1k
> z>UvdkLJDQK-f(Zc!=#aRPX0f>qY~foH3K=1Z4b{WmmiHP>QJ5A at bF;V#6#eFo}GE|
> z{YZI1C{48zzGqMMwi%~RtesnE!hfyJ`9jbrBiI6QVXaC?zM1GBPOByuIeeF^-?LT=
> zuvsjz|B(Cq7~{aSsH=On6}EDP+SV?S^B>j)unE7zMyr*9?x7Q at 5}NY%)Qg1^>)@A~
> z$RTR)xW`vjg0~DF?-~}m+XM6Q-H-vfCk=mh^ze7@<dW|`h;J^H8z^0pq38U_H+`ke
> z>XZDh|5uIgF8}+xMg8z8 at +#KjNM;E0niuat{uO+|MB-n8M>zYpbYME8g~xR&{~`^A
> znDV!;BmYI`Q>0ljlFyKQFIztTTfBh%*#qNl>0$8RQ+FEZhKzat9D`Wz@$a6DK{EdC
> zFpy279V7p1N^8&yM$l at FqWxnU_edMxQZ-LB=)CD4Gu)KzPsU#HX7ayqhC`c)kFoS^
> zj?>9rEvj_Qg0IDDQ3ck7D-KzpMfX?oa8~`L<@gUBV~l$wG2rhlUKO at _@v7WSQzgaG
> zHhI_rW;J;y;q_;^fo5L{to7&FzTn4;oho%Ahkjs)O7Ps$bOSlREnbyw80Jwh;fgQA
> zW(;iMpSw92=%cRi5H`~W_$CEj|14~;EeiD6+QhCH#_LPH!AtZlsw-C8&Tqk8r?6JG
> zCd*9=8y6?PVgGHmR9!0;cebV1bG$moJ4!(pNz)VCzw7jAag@$4ouPUP`f(GYG+1|6
> zVo%EhuRGn~Z+4W5F#pd$e+uVvsmMe#us@&Ef-~4utbI7+g!wmrVGt8J5f6U0l|A4;
> z8AjrIou7H$@bmU>V!dTpSJWX%{Y9lhK6DV%2Nas1Devt|%U4QN)Ga-9fK7ddE~6?e
> z{y?R7r%^RkwWDC=geJ&o>$`A1!uoIQ-xv3zJNH%=!<oAh{dNNHs{ux9OxT2hxMTCX
> zG>l8Ud!sjKWv`gQpczFqD#)QhCpYyOVx~jSVD`Nwf+gv~md~VK=EqV2=r!-S4k|IT
> zw$oWVl!9-|-6i_f#=lt(dGXX?K6(0zmd~K$a3JdbR7r1gwLSLIh`@K$6*zlL2i;a<
> z at EksO1o~|?fG&rOt(mTN0Y3E=Q`y6|_KIJ{@a5J(bS{eObbhe2=-YniS26M>qAtjP
> z%NSqmFXGf+RtQ_>Nd=0-C<pyd^p)&AmNk!gcTXbGo$xG%9>pJqiOV%TAI!;07FuV6
> z=C^yO!nk`0-{HS8{{S_yi9CzFwBY~;x)jj0Fu0=p);X|YYO+gqv+lp68dLC4HL(=!
> zZ0wF7SMZRFXBHGSqQ3p)xo&ElW{-_mM&2J2aqpzS#v8%ECK&nSVGFqFIgWE0SPpmy
> zV$jSNF*dj+TE!>VWNct8 at CCY^6#lVT(UddG{vdCawH9>j8#yh*-xgF})PV69A%iVb
> z!UxP9{eT_-&HUH(l;LaeH^84EdMCx<2rEI`tbjbMwtkW;u$G<nWUPWV#+)Jdi<)M_
> zzDkeK{!L(53OpQRzi9NvH=vEoMdV at piaKyU2W|FWWd{Y72G}zsc{z at Xgj@~z2An4b
> zKs)_X-2 at w8Um5H{vjh-2(Y3->j|KJqH5c%`Zi0gzi(<cMT1fKAd>MJ41^3{u>c8g>
> znJa?2k$0MM9C2OmaE-J(XZ^_f%5dKZOxU&(w5Jp7`pmDCIMS(2p!Y$$o-4)L02xy8
> zCbG7SGo^)-wFP|V=I8$fd@=Z_poLd!n?m>rm11FaEyieAdOf}+9C(xQkRut<58>p@
> zQQXlJhU>wRYyaYo;v-M)JwA_pwj<N`uj_CBc^x?K-1ETI)rEhJ^AgfI^hnzK-19g~
> zHIaP$lk2uMbDgcsBwP8t!)aT2lJ-6~$yOd|l<%^Y{}=N8)D`4R*6BmeRwg^7>&5~v
> z6e!NyM|fV?4?P0?!sn;g120`m)=Gjs>tqK;b?zQ`s<0vBJf|`9&jgP<!Kp(kDs>k_
> zjWIKW+N)=0%`D65(*C0AiAgEAKf%QIYIog+yx4YzPg9CPAAy%@^A)lla~WqY%uznt
> zhO;dA8M*xgdp3of&)Ta<KGt9O%`+E?mVhRj8bk15Ik2%s<5}WQ5AB at 17iVVF;YzR}
> z3WRrY4wcII{f+P?UVFzCW1dgufE9MJv~{*;zR5q1HgrJeXe;d7ZW~ODHA?$AQjcG)
> z0RzjF+nDd8z8+Xu6sd|h?#Mi&)EBGl|5GpSbWnMfPE<|pI?srl>yn+6#zt95+o|c=
> zw%)e5K&+c<k|UM%Chx91Ml!oWyvnkVTGbN+{*;M%H0EvU_$sXj^idD^H`g- at v<m`V
> z##MUgl%PjxI!YWRji!~y-8X^8-meVMvC1z!{<H!wQZ9e`SE8$-++$1sr2YH`!MCJq
> zcXi-go%=rMg9*jJWggC^>|AT96 at bbJZ%w0~yJg57#)&*l*@YR3Hxn%P6CE;zx|eb|
> zGq7C|ap2NK=!)47p#BEiH+q-LpHd273rjSZvvdx0Z>diQ5=*YErLabQif{bRy-6Cz
> zk at f_GSN@I04LU#s6E=F7j&#(7jWtcCLdMmCSNbEFBcC?oomaJ=vqtj&V23`4yAgZE
> zDatO^jQAvC2JsonJ$4 at zt~O9&$UlU)W<qWcemLy}9^N9C9M2k^ly}H*hUj1NiYpg_
> zN9W`!XZem&l;Ig9DD$yrQyQ+*Y%&I319bB1Q at yG?RDMJ+fu7srtJrKHb?r?s+^gp`
> z;=UnO7Jpdhjl8n>YJ)%e`JDtq4{TbnexO;zHr^%Phjz5?c*`Inwx(_A*9<<Og)g<2
> zkDcyXe}FTg{t1tOC40RPJPyd<VVh&8t$f=jj%0k_z8Rlp8+UD=JT;Q<JQBZ at UT=S{
> zpA!8B9>}?V5s5(q1t&Dv$_sB{et?GwJ_q>rM{P2dwp}XBiI01xc!HmC7&bv~5&8Y1
> z=dJiBZM$M at m>-{T!c+OVQUaV#w0$=_w!cgz2d`v}rvb9DyEz*mcfmE`%?+<{Jzobt
> zclHd^Bw}S7^60>@@C6xf6#^sfS9U-;p+P2mNEgmhHhu)`tqgW_O5F-+H=$pJ&TV)N
> zgzV}m)>Wxt5|thNZwfX*{;+7qY(oD)_WPlYRtm^?;3x%;B&yO2dXq0;-<HD$Y*Z*@
> zAb+R-*=ERr_LF`j{U8%IH>fw<Tq_fvf-UH7y40(X4nCo$Q-m^N<1kAnaY~0w`)h(3
> ze0dIeAKA}}`24m{wgOubkg=+Kk>l%#Z$frF8gV+-v;!i|@IR>j-mviRzQTKbSPu4F
> z|0n;j`Udc4fAuA~k2V808FZHtUc{c;N%L?%&D;@s7rM$L`4;4Bk?;Cn`MLL at TO>?{
> zOp^QPQZ&{jo~zy*t)(OR)pRoQAODa15adTA|MuVcmB4BCQo<ile<tc5hx#Ar5<kQ`
> zIeVM3LW(sy8g`8cewIuAFTQ&^=$4m&D<C|W8w=_o7rZ;uZ4<46?MLW`pU7SBD6Igk
> z^nctl at Zi4$eZ*3B<KXXZlYvrM4bYckN5%}!fJFgR(rNIu+rRsDTp^t$wBHGA^-hmf
> z)<}L^`d%_O9fN at pYUYg2FhSn=60T=!+syp9*Qw`}h9~v(TqpYi=(TaS at svfm`2k}d
> z<%Tu><Nq47^TFGf719bJ_fvk`N5_FzadgSPdBQfX#K2lZJ{hkzmHn|blwpOuazfup
> zCIMHOeXH#6dWc^pYbh%t_sE<{eUlZ^9!Y-m>_m43aQRyYAcOIg34eheP`P~KX at zN+
> z20je@!Qs7?kXigX4!GDv>`&wV9v4K%Up2p_Q8L-Hfy__zos_hn;DY#VH6Izg{w|9#
> zv~WZ&Lhj}KkMZR<JT7Yv{*Qd$k^E!-Bj0NzzwV#;pf!Pm#k++=aae=?>;FazmHz)@
> zuJJL?G(o<_KeG7>ANFlUN_4ojAK@{=5JFn?2J0UPj}ZPu_&7Sz+KbSKz#y>E<E_6V
> zJVY2k7?cS+)j?CHZ32J#+$DFy<0SeSq2;W<B2ogqe}Ca+dPo&o2mR>98#vZVyrcFf
> zW3Uu;S0L2<qz)cLz13~|--^9xz7IX9`x-{n&#DB$jX#O{cf-cmZk2aP(&fjH;f9AE
> z1ztwo=Ms91mEG5=ByYuh_YluW-`aA?&(X>DT~3Po`0r^5A0x2Q9P1$BA%s5>7+en^
> zevI%4p%2#&5%(kffzXTV-w{7RAoX-3+(qa?xQD(QVue#>S&iUNPb4z>qNA0Q%7gD-
> zoGJkhB|mqq-eWs3d8%*qt=r#hsa|_1{^CCD9bvvhFN<Mkgy1^TUMZKKb((5g5A0u-
> zI3{J2L|J%m=kWy at -xIvU<_(x at N2`2>*UG*`j6r|JAOkxISm%zWKQdQKJurX#p_l$>
> z1e<w3;S1^shLdy4D06lFnCNQAI9KV+*b$5-))uB2`gZ at pwGeoT-%VJ9kp7*du}+->
> ze&QOr###c~39t{cu?hBF;WxX#I0?GnUh)5iesv9G`%V=Sj|wNs8eTom!osHp8xNlv
> zJx9k__M8&A$W`$3p4bULr15<RR!n at 2tm$mM<!ZDL{^^CBZ{-{MYx at jwngbCN7p2!L
> zffX1tnC+(B-REWbB0*T)&B(O7x_#r<Hi(l`dYohOfwNvr#;eV*>{g{ZwHLUI`SC29
> zsEDYauWgEd?G+X_7aFLfnCg4e=QU8z#Z+cqj?TY45Z~9QiuZ7tbaXjr44ipyH3s?W
> z?bywtp%$^Z$bFYN*L^_opVXqTrs2AIGd1%k8d}8IGwz3xb?gjyey|;Etz!Imr8#r0
> zHy9u5_lz5-0di?N^P<BR&_s~+_t-<n`aUxc<>ot#%YnTE_zu;nl*$tsGU%=o++ddV
> zW5&Z_3prP$H=5JjA7anis#nLmD~*;z2?g*|t&-0j_94FoeiYn$<3A1Z*MCU*4sD*y
> zaufr_I}|Bc<2v0Rnjg4-iN3kE<z`QuR)c;k=oJ#(Qmszy8xQ|OH!CU5of`Sv9)fdg
> zQZ3|G$wfW2jF?Ve`U}Cp>nDZz>nHa_#T%fTlG-C|DRSQlY`WOt8s3)=9#C!aLUXnI
> zHHR_m7SSWTe?5H0{!yHSyoczwYYLVH-zl at 1Tq_E4_M^Y%JY5Q0HGHRX79dPZl at VSy
> z=4w>=tBXm04wb(e2K#C(!InP*8U9=PO<~*hThNZpsh;@Whef-85ONyAKG4TyHvh9<
> zTfTL_*YcTrcgth<J1BQ|xPS57`?*|O`B>8b_z#nE|FFrXrn9b&)5%^qr__cAr!9$v
> zv<=77JfoVdk)Tx<d1PaaJP*IVyo-x7n#XO<_Q#l#;cWI$VCbXh+W0oyZ}~s&_dU5!
> z|2S5xh`+b9_7~Mcb5ZbjirSu?*4>O>zlNEIc_2pY7Y)1IG3k}9=Jxj<gHGW>hX}m=
> z7T}b3Qp(5*N&DeHGX+|Hn?5ga{lA_vc*oh9;8$xW<y*#zcny{OsYab_mYx;au#7ud
> z*uq)?-K#${@qHZV2N}_i3yQLXe7P<1;OnNq<>$y*UITlmSy(3uPYJ<8;H;4%kFE47
> zX;PE3`|LF|{7SH=>TwR2c$SI9J#{!It`Ljwka(5t8Oa)H4*V8>{-2VjXgni&P~9{j
> z^sEt!ACNK|NSQ?88tJ`TZZ+anLv_H*uCqPIUnAu=+XtuT#T$Zv>%>?x%7oC55dNAP
> zAS|L8*Q- at Dr#!e#6^1o#$vtB8=faFIBV$E85jaQK#AV~djJex!)_KZdX|7IT$~k7Q
> z$?>w4?<Ri5+E!v-wk~OD0UqqavtcHF>oNxOHTc2@#7FFt=SlfxU8MYlWu*MFQ|S%z
> z9TvkD1v!gY>bV;&joMwmPnT1a-3OF~M*6B;OxbN>EGF%)2l-am&et06OO_h(4c~(|
> zD4prHfniivjZ%s7FurA<<!A`ZcPT3w>MD)A3X*rZUcZ at fRvM9pT_ogBN106JzL7F@
> zBW0dv#*dT{jFizTQ%B0wkTU0g3y}s0U7+JTa{sdO_DDZ=+v=Xet2uuNwsGoB^wxE@
> z_a8v{eHLLz?W5+p&CJ`_H|jwbExAh5*jGrMmbeg>^!LRsWd*-=>1)hF^rZ*E#Vpyy
> z2#`*I+`o0nf1raF+(s*_k)95EKDaGi33=7>HH=SraO*i`CHhheSx4}N2}(WEJ+PS(
> zeBoW#u4rB6$M_<BkjT51?SKwrQRcsR^~}qN-;X+sHDNIQGFihF4+%aFYZ+*<kJ}-8
> zT84YX&rJa<D1W6U+=lanZK&=$I?#AqlC~J{)hCABJ8gT%c+$QLkM&Jse~KsnezUtc
> zZ)p$t&)vwoX3J9`Z<{Ue`*M2op~M|{R&D#Pw at 4jJDBOR8+;2OIXWGa!OXfYPr%j8z
> z4qM(7f+xLGg?6?kxZ$i3d?(NTZP0k&J2)D#pJ>SW!-LS^f}k3ix|t at rZkN2UA1|y^
> zr|4FjWE(nJ=veJO*?{zFCFpl$r7azN!vX0g_%1d<{~Xw~)v}ZGur~)`Z{E6kLF>8^
> zOkrI~z8!z*_14#bof!vNP&3y>Hoi-psU>+ud&u=nZYF(k-SX>VH(m{o`>T2;*UFM>
> z9 at qLY(y15MMK&RQ8tJ|>jU=5%&*T=-XBs1#WK(%nHf-EIf**<SKP~2N$+RGr%s779
> z7-8Vqap;+L9yCd3-s3JKF}}$u^N*5Usr(4)wA6kZ^wv^O(-HN<W!-6#wv|OJdp{G{
> zJUmB7G~&6|ocpF-%(e*eY5!E<_f5O1ge1+4$-GSB!e4Rj*<wq}3cJ<6+UoxGv?-!t
> zxNcvXq-}L0mc74ixNcKKt!%@M-L|^b5k9B+!*!PnN!nI7;=<cm!*%<d_A2a73AfeV
> zdAc&9X1H!CP13fyN&E-*4P5I}6C?ai3wVE?u8Pp(UI2+ at i@zrCCFwd@@bxm=dt)Me
> zPkRr)H(yB7cyBX_3(uF5_mcF&!q${T+k3B{u8F7|ey at xsX<OZhWs9|_n=`AqCZa+X
> zek0OWcf`7Y)3p&5!{x`(kD4R+r+rZWMG_ZYF_Zd9+PAP{$8i03PS-_L50{@vlQimo
> zgT%7cR?>Eou7bY)Vq5*O5rWfxynUzj5mmNwBqradj~M>84G|uv-G;xdR!Gv^m<;7g
> z5^u?HUFC7w-S$ln(60HX-G|E^119HmX at oBG2>01DrIEVK4+{6S2)VzVEL~j+OzvXX
> zQs_RZTV0B{awKj#se?W-M?uThxK{GpY6&KM(LCTK;*;vOryN?I+A|gNV;r~Y;>*a3
> zU!F?N)~|z}J%_XM#b;n&A%FQPnX6-!jB|4_=-y6>>M~{eEiF8?0QM-FQ|Tz|St-Ib
> z^G+=&+`UDJ^PDU8Mk%gm6+SeO>t<XBt#QS5_m(T%>Y2hk`qbe_t;}y~Rqpd#ai%uX
> z^~|io=6yomu``Dwk4O{aXw0hs%&XaFiXx9>)^VqiSeDq$W;TtaH(#bHZgVX)?cUKx
> z&5?7?yj;X~2~+d&u6$Kq<jgZKbG<VQY_T}ACj!@nnJQ9$apWQC_|PZyPd!r-c?k8-
> zBC%|IcPr{2PCum|uAln>so(j`oTA;oJgNU+q|2E(s9$S~#hG76x}2V4zlM5l<I&Sc
> zA`bJQZ;HA5!fEZQ!_x5~bcQeI at L8lY{5d~=qm4W)O^g_>+wp^=XS9(T*@n9gsdFQp
> z&TwpPCNZfKapA2NA at BH^yvTgnI`All`(!NIGyM#g>z(1b3Nf%+;V54~^0fIY_}YTs
> zJ=O)B*%w(bQa<_2{>XyN4~jG<GEPXkiF54i{?!GtM2L>uf at -O`?;Sn4fAuk}n*kU%
> z4ku5L^uOqtZfoh2CnAqYU9VvsHI)?#SI<4^$*q>T-Nku+4bp{Ge*g=R>04OF1(x~L
> zi8aS$9!k1f3O at brHFHlrUsRZg@sUXWztftjr=BPO-bA0uiG-~L<;S*vUl2L<%nPac
> zD3h<+8ad_63+RKM2*icEKM>l+#*{NJ7JZ(Ez9(f8&qhu@^P;Wq5f|=GPPCPoeCDN*
> zI%JWP&b-9EGt(`GKDl>wHfdWTF#4zVuE_x(;WX&8ic?>c^cB!f{q(7?SLaCiR{}D9
> z*F1l6DzFXpD2qIqFOgT1Z^c^Zx8`~HL1OED9BB*el5IghS_}^Tl-maeep|y;!Y8yO
> z&Vk;bTxRQ=Sh*y3v$pJa at N8b*Na*ChpN;$PXa6M665gQ&`gAG8{tZ34agX<i4bG*m
> zTJS0fX70z-dEjk(!zO?aO)JH`$}T(5`XBLXZSiBC!5064=iiX;0v+jyFwOET=*w*R
> z=SaV3u}3-wAy>W=*OM(1klriDIS95KfLY7Q!1YdtsYu(a#8y4xi3k&rCUmJCVqlw#
> z$E)U9D}ojjkH&R%k3?IRLgX{)?T2B*WRZbylWjc>*~9$Y(E?)AVmJ-?7*i_PXK?_H
> zJYS%(*u_I;So{=ld%(TVD1}UsW{$}x;{OC>dZO$xLA51I9-7-WyOtGc>4b&wvjDl9
> zPW(VKfOAj!8Tdk%IgaRR$%!qnkNp09>mslU%`-2?_~guS*j4POp&tvk(N<v~{e$ow
> z`iyWkeO%;0mk51K$3=gK0^yHFFUnv%E?RHwq5jSvF7uA at 3^g0~yo`Ho_qt3<5rgNo
> zCY~q@@g9VPf7GWoofWy5EOzCKxbt{%M2?o32>lw!7j!O=rvukZ_-L7lyr*D`-vk<m
> zjyLe0L3uhpjW^yFXYlN8 at p0ZHTRgyf(P9VNNKzX1SW!pwOFyTsv;E_Ei=CjrVkf^?
> ztOQ1|E1s#4DDoj2EzQYVP(y4=KxQ_Ia_>ArY-!{KEr8s#*wq6%4Dg at 47X81C$hSog
> zaqc1de|^03mS^P`a)TY5EN^nFEQ=hhkRQCCx=j9sCB&gMH&5P@=_hZ?eGk04WZsS8
> zvRZmOWJ`aVZTLeE%X9J;@EYkJ3VA>CewPXz<)BIX_^t2v<DGXfj=8c)R^Sb9(UhCE
> z#$xBN4fC-$x9out*sh%xJM_&8-Y#1l&dVnI6nCC{*YG$gU*!23 at 8JJ#W6xKq&VTa*
> zEm;c9foc7VRXkn=sYi55{srWA at s{V1Zj<BeR{RFqaebt1gZ$P_a^OX~a@#t~fW0X@
> z<sHJJy>+^+|NFcD{8>>;Y+MTd<wV=!_XVHY+PYrwxh-BN$gyDl<*e40J(9??ET3^7
> zku at TBbNQlKTLt;H_FNYnLVw<@hrOfZdiyeB_b9m@`>*H$V)-t9Gc{4S&=$X|<I8tJ
> z#@yIVk at 2t854YLAVHg_@*+~cC&&!Q2!p=Pf(uoz&^(ZM2D>Qptv3@)a++cGNow!qQ
> z!bNy}FLXc;y9j%}cHwh!S%PbA7JO>MmXb0YG6o<MJ?T`dn>75K>Y8BDll!V&g2jKO
> zj|#&6O1~{w at mD$ydSe8uiuzRHf7Mq;_`T@=*U<I?mP6X^$iDtZl)J&3tQApq(B<8X
> zd-3F+4t5*|b~$L8Wt$rB8WR#teyba$us at cW0((^xtDTtU)pX`UExp#$;S6w%2L`rd
> zEqJKVq$QLGKbQ%d!!tTM)=ppDm>aj+2s^g5h?@{sA~qo|%Z<}FG4of`xpDn77-#4^
> z&a{^iyNS#!VmDC<9IrADaUsS;9eB-s16<fQ<R}m4e&_HQzDueYq5Sh`t<w10BxL|%
> z6L?;gx!|=wJfg2+qz-+sGg!lh3!vw5<I9`&N^ajn1u$7kV}Z{EQ`$=E^(sz##ls^d
> z^k{y2)x#sO+q6Wkflb3S3kP-#lWgh7eJgrQDk^?G^85Q#bh`SyqC+PMlccQ_m|6^*
> z9s%Ry!TN^0&TnhJkp4UL1f7D^l-p-D at CSR}Wl~rbY)74d?dRha3ku7|3boy8k*_Hg
> zI7yv9U6#m)-!-oVHGJU>Z(`@R;91E1nxB%BJ!n`*qiC;9uL5>Ea2BgYfL!>mdqt2P
> z12g{Qx_AS*7Ipu19c{b5``7gr+w~uRU2nEs_v3oLBc1cAYN%k^#2Oa*0 at 7OW#NaD!
> z_iA7U2#%x{>Aqq95=$*GLGJX*M<0{1j&pe^&gBBdZt!t8LEhH|yBK7D<jFQ<(;3?f
> z%aVo1yA4H-9gu;ar8q&g%s^oiCDdx-JeC!7)$mTV{tSKelf3HImFC>cIG#S4vC{4w
> z<@i*oRiYB=HOvMZ4TbXS0+O?E&rR6{z1C$mT9eR9oO?$pw;M+T*Kb?9VjtGBUzPMR
> zSz(z1a<WX=#?D{KYw{Ve>iNx6A?r8~nG#vEpZbmPl6>lwwK7gQ&4LC%-tWL7tnk at M
> z@{T^q`;*_MtMtjk^KH6XncLu#=Rbu^D#YhkQugO3WwRk08K7WutVimK^?sW|=JuZ_
> z_kcIs`Z$A)d!@+>I<3~ivN!6{zF4$xuDy&}br~|DKi&Av<GF+v_0?E{af56SvVGY3
> z`WG<!gJyL}nSmcVz;CwmhFm|C$e-qB5nFCG<FRiAe3e4JYkY?-y~>sbCLj5W3GTz3
> zHuIA$Uh?Qzx=?Dap7}|vsrX1tzKip3ZxEb0Y|&i1ePeFDEEe*!jhkqeA$-(z!jx&s
> zvXr^X!W5CRH04=kNycM^S~&T!N$8wx67nCLD0#B!eUxb~y?=svd4==)DA!yTKD)Va
> zPQ7rl)j;kw%8ryU5_126g_-?wgOHDWl-smYd6brNKYm27L3zkA#&TO&mDZ?QXvrTE
> zagWKVwR-eH2XqSlOTGi$?;+^CX2TX8 at M_!^b+EEbE at VyMi$0Sv^q`f2j%;p4{F|`p
> z$GR-(s>A;LI*~zxN2f7>H~Z<8_cTH8nnn+<h<a!ludQbmYRlG(v`5wc?b+w{EojPI
> z;96&~bFHyF7jm&@for|_TLo>-5*>uj%9*}j>DeDz+E1U`=NJi at MRw3u6MVT~Z5Pk4
> z?yj-)#6xBq<ZBw;n<zgq(!a2GMCeIHUFsRwo%RLKZiS+bQ7QdXzroyj6}-jILqBJ!
> zkX?jV3%TAqurE-}auqbnTxATrx4{cLH&fVEaOpXP at v@yw{%cI_w$)`MGHIq>p-H_r
> zQrEBlsEg=_e{Cz at l$!q6yMaf-yE9P!6`TRw{!w1Un`(PEM`2=z-#rEIJ_~wa??2vM
> zpL$}XE~#>mS)q`m65brCEAAh4`SYlex*A8mLpV~`^}p*v`>rE=Z)>9=b@@oWDusao
> zCNcHxk#G9#ANBHiT_g3 at l6qMK@8)p-+*<Q at y^5Mt^+;V_BW>J1QrEx#t_wW4bqK&V
> zq2Fb^JtOrFvNH601221|-%bChSD!lbuQuv!ZJae+Z}Qy#PrZJS8zkcyKm2#U;kJMW
> z*gsNt at 85N!ABZe}9?JiKn1?V50qa-BB7_`-y9n1vUzvXp!LL(>MZrpiH#IS0>(yaA
> zr}84X9=5*>o5F)cCy47qFc+B>jkM|of|26-$|kz%ugoeuoHZ_4mRpMR)qoa!M{awj
> zU#Qkrw%S(CPe$bT8)Hn}{?#axYSXK}G?(D1xPI6-8Z#>i9)Rcu2gSl>no0ID&S&67
> zpdO5UM<Zm0k``4FtqKJm{=)q2mEI2TqQBKStI+n_kR1`($St(3+S8Eci}YtmSB<1$
> zw>PsAY0 at VTK@Sx}Z$PXVL_M=q<CIO{`D^`v-S?oBr}0fbkXzN~{y=0U4v~;UHD<_)
> zI(~Sf1NE5u29cEj+s1-^K8-eXp#Q&_DZJ(bT^%w8rbuNGr`aonW;cH;szjSNKo7}p
> zTLfqwC(@rtM~+}-eTug$)Sy{?0>iew5x5*SZni7inI`a{N1Mv}KW(q*E+BHtDEJ$g
> zlEsSN%SYMKLFL6yBaDLV;3<NsR+SQ)a_`*;daKA3bg;;PxE^sM;s#cN{g!Y3RyrTN
> z<>u#R2EA46ig&F=TV5q}Gt#TmuqTU(+P{ac;rF*K=6Rw#gnbD6737>4h<7bQcthp~
> zo~Q736WSk+dS1h`ucMw0)DxKI2Kw at pq7vyK<Oks0Mg$t=wgnw5jz@?K@*M!(v28J8
> z&>q{~1g|P1(C=SQq0AP9%?MlZYzUFX;M<}RHXy_xY(!X(unvLT3rARmuo7!`4T2t_
> zPAW7L96=M(IS9LPzMvBs__c6$GNQi=!7~WW&2qxNP0|~`MY?GupUurO!^Q%_Yy=O`
> zCz}z^vFSmh-(GkT*tu at --sSwZv2Ou8JQ?9PvLAjq2p)Iyvx(`j{gGKo#(I+gM=@`L
> z5q#%QjBnp20p>xqbDb^i1s{;GNm8h>oykrq=nB{nv(eBty)T04_S}c{9p}7a=!8tD
> zVto|(A1T at ob;FnSz)^=R{<-d_!&Vp1%xTd6vVtEs0s6q7t8o6bVf&ZHuLDkVZE+&O
> ze-ZodHjMb!=~VeEJA=ZE#qrq3zj^KhLW7Aary7e>6csFI#vWjYZh|K8B)WY6- at 2Fl
> zqi%!Ewmj&AXV+l8(_l|MdAn;w&wN?@o5O9WhP`v>i;0y6*oz at PooE?{;G;4Ae73F4
> zbcjE0kO4Q>%n?CW5s>jE!G3Xf5-gCxs~R+&BA-0RaBy!4 at S^vtn-YZ!^ahXWwgI8@
> z2^;S9zM?@V^(1@?oOMUexqqE^m5r%^<%`^3B|7Hi!9!$x-z0p}Cpa!(RaX!!O(6|B
> z`ko4Qm);Qib{ue;kS_yn%4dUB20WKuChQ{VQ<&o<KAWCbNWUla+anX6C)bx`LKd->
> zPl+$r-dTvY1~@v&+>RnoX+>Rl{%2CITLxYL;_G<6%ndXwv+Q`cYDFRKjx_adJkEtL
> z)u-phg?g;IMVn-F>sa7GZF~hE{Ij#VyTnezf7xXq@=RhU>Sf4fny2i9kGSpWd622B
> zBK-(|$V-8HP`B6353<RGJ`#(M*WKIg+87wN^)cqyd+B-Y-{b!Gw{JN*^?=uOWan_a
> zbJ1{|dlYv6u%@N~^J}v=!XLq}HBY|*->ntw3_+RAt_AEIfo3dC&(r<_jBh;aME{s5
> zR_tSa%H_H5qQ8Z%WtfKnUw=?YZ^3-Y{sH>m%@cwN?nf-ltknUZ2L0fGY%9SEmC#(+
> zr^8tlcp<VkL01IlhV0uUjeQSgV at cWGLVBAprVKhM^!wzRv9-aI*hU2|c+`lEO*~Ur
> zwheqsyw8E`%jA7XPbF!@z#EP>?BRnhhJG{fO99y>!)FpAv(NnqGW#7wM*o)_UyZze
> zTi!0 at ZMMnwCnFEo0%AXKIFHN+_i$?oaN?S at 4e(vF9cR)}7=z at D=^vVw=7sYp^Z{`W
> z-A}Na((_&P?2F3CJ+NJ5lS#f=RF>#b9<u5?M=9`nX2|?Qf-l0(jqv)AEp1T{9G{tg
> z;ishppD0_R9<AQcC3Ro*+p-hWu-80O2wd9(`mw=@*r&J~E!<Q|%Bh82GIE{sChj#1
> zV;#v}Mec11?~>Z;P8HPJ;@zkxqCDj7e=Ce5b(8|f*F9Fqc`S45rjO1Ylb4M%QL at mt
> z0_!J at e^@qG=-VK3qv at j(V)w$oiae)s+eC14dSE at X&*dvM*eiZ5o at VP~;?D#0NBg03
> z1z3l;juO^Y1ROKuoi&A;xYxid{=lMnEQm3>@bA5n&KahQwtm=Nb?yMtuffLCJ*4vs
> zTaj+-n+6(sPhkhrzo=5$zdv^nbLN5tiwpMA*Gy%-cb96uW8RXnz}|qy#~Lhh84j+x
> zbm8j~{)Lm%8IG$S{%JL;MN5sByh8oHt1b^&0t{#I5n{v5kq(-|bzmBbcB`(HunCKl
> zW@)1JGqGELo0?L7jx%JI-2J+Vf5FRwcSy;%q$lG1xigAo$UnJOa#Xd*oaX#cX*6$E
> z?zsEMjvKH?q#tmcQ?C|Uv+&&B-b<b3jQ1SyfUN78?In4tMbI~KC=WT|;;4pA|8%i%
> zOWV!&^<}CJp$j){upW1Jvv#>hTg$$S*WXo*f6%RR#=UT)=fCw3`Q0d^MVTLwZbccL
> z>L~8Lk8&@^UUlDKZN0QK)*tuJZW?bb`pzqPMc>f}yHy<25vMM=R2ho1(sB*#8Py(G
> zF`=n*rpU!?*r9y at od{q<0x~X$eoL=k&Z^z4wPpr(lq5UK`@!$Dx^FTb5Cg|fzCU~!
> zdxeS8JotXh>VXx??Tje)>uiDY&zz{^zZj$n`l6R(Wbb`JEwjVE^TAMT1M`CNaZc3I
> z4`EBc1J4aUFppU=urlf(GpIaBQ5WfKnUW#TGCr}}bl%EG4~FbJ8E<WAmykRMUh4p`
> z@>e`dTe;QU&_C1|ytF-keiQG}yI-rh<Q4yX at BW1Jd!h0FJ__4t1QTC;#Pd*kqQX1?
> zKU at qGq&I)a(=qVZi#hQg?9QENU8<<Pvn+mDLFB|b^Rq!M?$ecIubRim9M!fn*nndP
> z{>%D|6!Q<6JGbvtCs}LNZ&-CMuiX3`=^B@~n>lG$OIo|8N3p#Hv5x8nW%a-+W$i#i
> zR6gqY<$(7Djf;$PSUulb3tMY-y}u}H)sFD9^S06#_fIn%+gQs>nC at f{Pgl0}ZpV1=
> zeNd)?-MI8CiUtG|`ig}v+4>A4%8pWs#fdR(L0 at 5<M#NrL+bK&L7AParBqbfpqNoB&
> zIz;C@!oTBsR!|;8G$Vsw6MN-Dyz68Se5FBmTMb<Rb>${UHt?NrhXHj|ewV$nfJs)a
> z&WT#y=#qV-UMxHSJMQ#LYH0~Q#%pO~>x{yxEI%S2!o1zNw2?acDyyEatdkx6bul%6
> zt%-6Bt<Cf+I-JxTKR?r#dyFT%8E_Hn+48&ued~;BItjLxF8WW^_g!5Y+1gZC0vk*P
> zNzGd0#&5J=EcMbBM2fVUEicC}lgXyiy~z&qDb8I}=4!1`Em;a(Es;xQwBw%zk;>J3
> zl1CT7hVoEgV7MLm{*-x2-7M#uAE_59Yw$llfu3~w!1E;@U5h$f7-#1%lEajR7p=ge
> zJu_Kyo}MgY%uyQj0|h<q{edrqJA4X1lo at lC>Ppv`FlzB*)+~?7za+<6wX0LZxYL>>
> ziBom at W9UhF(IrXWz&?KSv}HOk=)^x(G$J%0n9||PIsLIyb at 36bDc8(tnLA5%$1i&Q
> zmYS=qm5#4!KP=Vft2m)|p+CEOLWQJmle<+{DIoYNCE7AAiRi<z{$x$WcRo$t-G1%d
> z*G2UF)v{8V#5)W2&K_T+LThBATT*xMe=iBZ+v0-;y&F=B^+<zy=?N9GBBWXP6QY at g
> zg{H)MJst0{6lbYWy}1f&EEVc!izOqm+ej=5#hFY28v?{%9%(<f6#Nv2>xW*yC*@SN
> z7tP}xWm1Y*)u<Bs_99;K^}Dbe>&rWI#VfSfEO<-1iL&Z+(~2|`Dx~>oDN3n0F}4l5
> z!`-BO_aY_Jn;hGOwd2U6X8oXQROnT#LsG1RMUR?;K6F=E(=SSb^q1O03&^*VK1ipo
> zY;jo#9^w>5VZ{_+o|y8G?`Ex`{rs&BuvHWCUA*FuZW^$k7v93z at XT0-qc~hY3+rxE
> zs6J;$Xx&BTEn-hCWKF4OHLy=1m%hQXGOMAVS|hbRKUo1?K1C7HSAsmllnTBnXz&*+
> z{g)eAO=-PKtblC?*#6nt<RRuN_sLiGn6%#JYUiV|tctSMLMOy%juz#o*T-CS8FgbZ
> zXn;ZN(d&cW<vQfV#%wZ&%t_BOytkLVvLPR~lN*2sG-15W(@hz at CR+>}0nbl0vYa6M
> zR5$RrWd!#&+BBFrp;0$;s?i+6s~A+_J~zl7XZ;%HiYI(v1znh_v64Do at H@cSsIv|~
> zlYJWHoMybNYnz?}+kPqd29~WccRC*}*%dwAV(AmXc0b?N?v7}8CG;g?23;oIcnh>G
> z!I^R4XXHNr0y8DO9=5~Ya_k6PAO1WuP*gU5HFN;J^1l)EdQ&{L2!60&i;(5=u7;I!
> zqunK(fCABkCf46EGAM)VFtA;}o#A)ZGtRE5=Fyh2wW85q>=9#bTv_LP$_2dH^Gn%N
> zFC)xes%c#~d_TJd_vVb;bHzQ*Qq8H^%boB%y;kH`^LP91UP1eAsijIyYu at roxp2rt
> z^c!q+Q+`p|=B4E!$`AGR;IGpMy!7LlQ8B7P)r4`_lOv^W**=H9F`sdMsBL2gV290*
> z%v(;Y?%!mbV~mNW_y^7ow}YKv*cQI2!~R?YENI0=SB07I9#~iqV;U74%+2KV2F&q>
> zpvKMy*yVL|siIW<bAiXLGkb0Fzhkhlv4SAIJh2z_1jaAyX+Spi6LdBmGw<s2#x{>0
> z!h2rG7Gte2o1aE|Jg)P#i5)^>Lt8Ia!G6iP&$LH7 at J_R!YP+i0LMuet)$x3 at B6Fwb
> zezO<3cGapUSdFa}FBzF<Vjs!v)|li;7Wn1js&Ot2>%9V7H`u2$ryXfLC4_AnzO_y_
> z2euYQ5t^jrpnA~*qsm!u)WwgZAoa;bbXCT6?SLJnZ)Dt*kEG+RPWL#<(dZw6;h|u1
> z9}~a(fM9|hbpM_+NX9f|AHW`DCjAEbl>>T(*w5Zs(iFd_6WBk!QN;;LQDY6LaED!K
> zcdU{Ah~cv&N$jp?{E2@@9(;E4_UN1ydC&#ZxQv2tKK{*W_(n}n_V%p7y%GfY4CiTC
> zM?sU1o7I4HHleL5UxMwhgm63eB&)`3?zE`97Sxe%{UnU=s5!m1 at 7@o4y-RL3xQxG9
> z>@upWQs+x|q+E7yK)R8c0sEcKf=ZlI(o-a$KR}D)pXNX>9C$@?ZYFE6XBip$wzW=z
> zy<iA_csSWUMZ~{W1<}bPcAD`2AnSr%ka{aUdT5U~q3<?(UqAASZXlUvll&D;&?h#g
> z56CxRO{kRZ053f04h?=;&rG}Z^n-}dXxQkj=xL0~$2x{{;*&XeZ-9T{@!RZ*_K(kf
> z3A%P~`>b<ck#!&R?$_G-wZb5OvpTjQ&^3IbxoNvTa9j8Ur0sqYwckItd!6)~h3z-a
> z?OauXeEYz0;qRU1qn;}fHAqL82lX8)=a*~Dc52s7w=v-3gg>`uuAm9`o-<+`lYN5~
> zhXSLHbKgGjj5)kr=yNsZwi>!y>U81ghCTi*cbwsq+PTlaiRcdch?E8&_^x3&=$ioS
> zS<o$`+%hqDy7F at GdlsZqz>{8({|S3V{u<Fl;Dg(%dK$@EE&qYodc!|^Sn2cE-nusl
> zwg_$eD*FACDEyCMUV}yo`xilDA4}PqBW0|Vvqi|U*0&xwZek>ETAkqao5r)t6RA~2
> zrbZEG?nTzE^g^SyOD&pJd1dV^J$16j)XGjUP^(UubRv%EA{#Ba$BFr|_6p`igrbpu
> z;lg9^$bt1J{x>=QEOWqn^T>E0{&8U6jek=wlUeJbpV7^}Sft4k!Zrl|w-Y0Ix6`H<
> zYPJg7f1jJI_)qcl_UyUil#TGqRFH0HY0OA<g)UmlfsBtlD#7<Di+dgCk#hLIt0#Ot
> z&KT&dRcCwzTR!&WtU+YGw_xw66FO}~Mi(Axn`1&pVAzRlmC)ZfOTMZc#5v)&Vn_Sk
> zkm<l~v{lObm4{rV?8iSctf|gD<nYO<I<kkwr{GLerUr&SdB0Lh>^i}Y&v at WB5@bvI
> zYoOyv{0k&N2CaeKvy2BFCg3n+xz+e~E_{F1+x#IQE)TZGI!u5~PbtoUCDC5MbJV8}
> z`${0!oKAY6!QmQtHfJ~P4dUERd?pN%_LBMI1YVrzCYf6};~iGHDQ;Z$3ejKo4ynAX
> z52+3EFVDg_*zn|8DW5!xXN1Gggz-REPlE2=hvxk%@CFRU?T2Ao?;P|FXjQCou-MVY
> zA4m!GbDgF4f6 at nQyjj2D^WVeQai**{<!`-K9`fF|iYkoNkdD=gD*lC6eNC{nkSHxG
> z`=CNln?~BYMgf~WxUMOzjrP)Ol7&kPTBq5UU7QAezDek7cdI1K6YX)n)j<A*S;RYK
> z`!5vm<TC3Cg8xt8m(z;-ii#jy>m;y|+{{VUi__>89r7&LxiDU~Z)w1~SeqzNRFg6}
> z=WQ7ESd4X2_5h(ng8XhS4xH^e6W7tu^B5%h?HRuXu+s58Mvsjf0uIBTUdA2U7=?T-
> z@$No$V)gay@&uPrw`za!iaYEQ*JIGj1QqZL=YTy<t>d at c$++Xy5ai2=ez09M1bdW*
> zpb4B<Mr>}+xC4E|mt38LTst+auzI&jGT)#c&k6Y9c8sxaI$b;Zq)m1Ry9Tb#7;BOs
> zKWnSa=Ist!zpH@@(nvYi({mT;n^Z4`W|4I|ol~Sqx<dS$!*=!}eDin(Wbjt(iNS9o
> zu7oey5_W2Txr*=fHLk0n8&iR}PU>csVr-xN>EFR`{dA$fP30AO9x{pA+#G_L0-Yu!
> zvSjGf_|7r0V#p=D%~eU~@!!(h4?(y2aAPI<cBZ*u3#a8b)ypl9RI}QT41Ck_smj^>
> zThh6f{i at mKM@iqHjEnixq|@g8NzLYlq_eI~tO#dF%+D2ba1H(0AX%pYxSZNVe}(??
> zvraXap93#z$t#H}=wJCQvL*|up&EZq&o$@CcTdR>&*XN?g_E^X#=2f3q_j?t*SweU
> zapHRxOXIjTuthk@(qvVuB(x?`s*o}ff at 3UvVD9^H;+IrhEUikiR>+gP^<ukibRU$q
> zs7c#s71vr(Ewe0$5yVLL)l7IpH=j;WOD#8JM1m&yzxqrM)TR4X{B47B$38q4OY45L
> z9E=eFyO9`kRrRa2foXV;?oCO&$yC%0GQMLg_xM>>uM&;>0sf_e<gy8keFlNS#|;0$
> z4I7QR7Of;&IJRPsSb0U)aa?SWKv6A0A$4zne$C)G|2=M&&tpVmo3bUp?1tU<h6j;P
> zU!WY?wes-^depOwF(^9v_Tl?v<9f3t%IR#q;7iqct6^W*#Gr%*tI_>J-mBnoRqyfN
> zXx!A07l3c9lsDcs`82rJxErj-yoD1Dn?6N;Qp{Cdmt3{4abjirrKel>NMo*UdKUJk
> zR523E(6~Rdzm16?dz3qD#y`x456c+GchZQh%38;F`c?21Ck;&bp;z#F at sarX?20je
> zX8XQoylAK%WF#(4ERFwbh&5Ag+t{9K0<5cYscZxO+r|&%o?L5{{MlIAV$iaE0<N=s
> zS}ffsj+XiDu-3$nw;KBm!+E-suh1-CTgJRq`l-rSYl;^qG#Erq6%?oE;9YLK$30H;
> zRo%Br$if|egdNX(*5BNq@*s0PYDo21X;L*Ri5^w8)Q>YMTB5{S*l%Dcy_pds#`t4;
> zwFk}NF)4j&<z5L#Ne``z&Uf+TeD%v~T8G<w)!WoYMMv+-&HwS)q&$4(sc2p=y}pta
> zZjj89acY*$wU&vTl}*6W)4GetYbXh^f2xoQy|z{6)x&nYLGb!o6(>OVb9A2$cz?!6
> z!48Cv>)SK$l~jhKj_3`?H+lE$W<=KRjArc at ef2}1!;W1D`o328qx>V#IgJJx_R9^h
> zI|km9PGmnSr*=jKzN3j5r)>CWUadhTdc9fb)?b?ztk4YpyjJ4=XI_BI5a-v&%h&e}
> zWNt{A#pC>*2zh|pQl)X=*Sa1?w0?=Z1!XLpPZPE%jp*-O)eCt6E2}sGlq|Ng*ZGJv
> zdZD&bMa2v~h|tpUK4_yq!3%O9>72Q)RANs><{B-#&ntL0mFQaYlU+y~l^9e*&FZP_
> z=jwMc at Kg5_{4pdfj8VBQw;J8vga5bR<*C1)hrSX&wv4*x%2FF~R{kv3UYDb6bQ#}V
> zOmW85XkH0%$cA2_&Ykd)o^HLIHKD2Rkw6c;NsVSn$VA-Rt`o<oE+=pL at Zx>PchUot
> zYVfKCTZmuK4;>!oN4y at I4SGQZA5UHIiSQrz2!`H6rb=ps-F0gv_6Z%vLDl8w6jfxs
> zyZo%8_Q&9mESBS>zx-Cn`O6dK=PmX)drRfdb`OrTWb>m7fTgLmgl?(dM@=-a;EAWt
> zyLC_{x%Ih9to<;aUvk`MI^IWV$M^B|9t_8U&0C6Vk;BW`lC|{5uv0~z`S{fI-D#5q
> zIlq6oQIdCj;@8x*JGD%y!fD^9`hu}1Ck9iZJ9 at c;mG%%>8|Hx)peSWE_3U!G$2GP+
> zno?F!c6anWCu;Lm68wvWVG=p_4&7(u9&0gJj0yah>AIUS=_=aV)Ivq?#aZ>PPrbFl
> zrG8eu?cHh0#+DS!RizUh<k}@2N?g0QpK|>YGJh!pvLOCU81srS!So(iX=L+`np7_1
> z9QHVm{ZHS%2|rTPT|SdL_0aR&lnuZ;R`-0U-Mfj>mh~>|%Fk%tn4cNjr^{#-yn`_w
> z)z_!E$|i*|a<}!S^YgVjc42hBd~TOsKF>;@pAH?rg_aY^HokJtGB*55j>>KQFH)_N
> zmgeOJxKZm{h4W%GzaOJ_XH8MCE%Pm9TSTSDR9s7KoV%7@%-4hF(bDP#VP<*aCX>7H
> zYg(KH9_z{;`oN$vuXieBBwkv2hp~i?gzRD|WvTt$OVISns1Is at _1YVMJ*HLnhhtDW
> zXoZX8UXs8s<96)p*uRv6*k at 0u{dXj6;wtsJ)Aoy7$Gv1kA4aFiu!ca6pKb>oFCo^F
> z`R4CcZrB51vpC~7*MhJaoDYKLaAM|ht(op(Ye{huXw5sdM%6~_hex6Zd;LX2q)gx#
> zSC_7hu?MmL+sYOvVUP3Y#OmBgIqcicF$H9AP4XgXk_W!eXweX%LxNnbdvVVD1hfbj
> z^eXzys#C2?hP`Lt+SVx^V at -q~9c{jP8dt<p+{c-*+Oift=v>HN2>lxPj*X59zdSyn
> z_Oc!J;CIZ2cW at ftRE<vlVvitts5lAl<RI at Eau4>g at GjCm%#{q#jK-Yj+v^_rqMuIc
> z%aSLBNpN1fn?)hdujOaZQ9mX+VN8LJLi at I+QRuI^@FnSszM4nZZt^1Z@?Uf!X!&yu
> ztT!p+RHG9)0sq}xglEfx)>unzbk|fX=w<6{wYzmrGHkP9-bSHb*rIrq_JEBucVTuw
> zaV+TC#FmDn at 65Bvzex0K`FBzyd=CoYM>`nTFCm==pYE^lE*W?+5v*9-#I$M6T|xoD
> zdl!X;-t=c5Cx1e at 4IPK?W#DGkwG#URltk&|F1&d*HQKeZ>nYf=UZ6EILii~Ujy4v9
> zg-p(37z4*t at 3vPMZqg-z-tE~9ljyyP0-V>*6FH}&6m7M`*_51PS<q{1!+1A^1<4aC
> z!en^osu=K=uzrSu_GyeB48py at l9%`5p3vpct=s~!`LxPyVjr%lv<+yp?He4 at v0fby
> zTXT~#_-dQ3+wwqf1-Kf5PTYJ4^sOmKcJm$3gk`<{iu^tXzQ=>(9PrJ*s60VS83jjB
> zFUIV|LQ*day9Fv+9Zuc3i_nKgMM3XCj4^uN&DI{F;vj7Eej4O?lOk>E!@o?T at y&@X
> zKPS<)zWy<3V#~3l at 05|~uZl3woBnBAdB-s3 at jWqDDQd@O;31SGJCSRr2YoBFgV!hU
> z8gPF<?hjFRL!VLe6;AGM>&}Ar*u>0n`W^Qga1V9 at hmPYr{K<R!MZ at pKnJVBTCEgEx
> zZuqb}Y$&16MhP&k-lc1m-b&0*jveeet6g4cHUz!<$R|xg=BmQv5<Jkviic at Q)%=-F
> zfnlyL<ZR%=|DzVN_H*Ry#;8OG)AR5z;cL>+wE$-cr*7~;HMygPWssON at 8O&QdkwA%
> z7w7JJ_674X)m)UHOP6eR9y!;%hW5PyKF>wh#xy_jZl@}p)TxY&=QKC?Qnk%j;BaNP
> z_mZ>M$T=#{MR>8nh2Ms=_l!@{>x1Cq6HKm!I9FMNYLNbyS%CCSc`fQWj&}dx!e at Yi
> z;1X=hi)1Vi+*`&@LgPc9JhHvw&WGkS?-v!UpUj#o<8(HG7EWjOEBymRPa6V6Y5M|1
> zVmd(7sBxcX?PKfp`OmnStJe)~x2zOJ&AgFvp^Tx<_Aq{y)@b*VuI}k2UF#QZUwixO
> z7+Fk=a-U0F^AfBFS>4gtcV5|1++7-bAScRP<c)K<>U<%s7MtiTqwG6jL!k*6oIdp7
> zVkxI<F~8Mvp5T at 5d`M)_?bmuLuy*`}^IUM at ZalN=kE4Yw;-Sq)MR{b6fjkm?vMI(O
> z-||$vZ*fi(`K}n)<4x$rUVR+-dx0(a6?~eL;FVS*{o9jwqF*)vXM?p_a4698j63wh
> zV2kcrA2qKN=b~F(?qXYevfbx(p>0;+U&{96M8Q}5Jkr*iU1;lJ+d170=kx+)M_ at ui
> zFV5;@y>H~(yXw&ArC2u_$hiyedJOx3wMhbVl`0tjAs^?sFl#Gty+3%rNcIPsR=Z$K
> zl_(F8cjb<9_%`=l*G9%4wA=Y|I;K-mN7l+TFWXqf*szwu at 1xBwMjD^w!8V9|#w9Xd
> zu<pYTpz`IMFTs;3!Wy#;@B4|I`S2ccesx7Wm!`LQ(ewrZ&b^-H0jc?94VrchHonOE
> zOMifSD{yZUY~rTxv#n3?wKaqI8R%dK3TNI+Ds07nXuE$js(q$z-Qq#25d39R^46n)
> zpUk^s4X6}9 at Xu(rG%7@;1{HK|L%)K2<eRW>#CZqwI_R^89<*Iw7)b1F%4o**5!lv2
> zxy56ZUlP0d8!Jj1RFbIg2A+>eaan5J$ap(Ox^L*B-4nYOcgHJ?Y+~yd3~X{T;`pfE
> z<Q;FXvg5*!ma?f=9N$#(tqm(|R4p(pRt-$3cRhbAYmZdqg88e4T!&744*Nhj`lMJ7
> z8z)*1m3#Y~NS*S_e~gQGDnd~^1Y4M61cgrcF3$Ei^V9riuB5FSERv3GF51ipwIxf1
> zmYoLoBgF>F!d`c`d}(n1W-sGc!bUIQ&J at l(pr`B(=ta)k_K9XbXv_JzWXNl&cGrCm
> z(zaOp-i9%<-pJVRscDTh6!*7%d7?vQYH?G^pK(`m*9}f+#2K?uIu-U^#YLL2%^PJg
> zoT#(2_{~XaoFW$Qzk&B_I)s+Jzq at m(+i~M$+5Y1O_V^d&FtF(=<>UoWz%KN0`|<}~
> zp-V>pN1>67&kG>*k`Qu8YSIwBYM=G2d~&CbayX#R94uj%E-m@|(xTWIq|KREOLlEq
> zR5BF5RQsixI-9TZi=82M>e)x`<@{{>hJrZZ7>2a}POLWn!|7w!;QbH(`To9XeR~tn
> z(<Li<wI$c#OL72nL=`tY?>EQce?wmj{aW^56j=|<)!r}u&$WQeuS?&vQZhfWR>nF;
> z%KimD&NQWZlSrAeX|8g|re~E&o060XYLRj~Z2y^<$AoV+!sq%Ec>ZC(XNew=Ut-?h
> z8d<~dkTo2<vl`5i?YTq;3U&$t{bmDSV6K)V!iUpCMgHY_1$!wuL~=PPM0hzlgu1*V
> zM4Yqo3I4!w at Kb|!cRVNBa-b3X|DPvT-N at UP(#L2QsQJo=11kH@&Wx!>%Hs^(T`Dkj
> z|G(P4JglkX`&(=43R1Od5D_gZAc6rzZWf?IDWX+tsUmKOQ6o}|h}eXHhzjl-Xh8*$
> zMN<{RE`)GF+ajW+)+%a5tAH33AyV0*iFrSBgKho3 at AvmSzdznT&NFl8&U$9%%$YN1
> z&YUx9jMW&@v>VbyGHH(gD~*Vxk(Ml{MwR_54eSl4zmeNQ#|Cd~irg_LruLH`b|rSE
> zR at P_1_T$?P+!Qv|rNq1?G)E5ooadP=X0D&)Z=KZPH!fXg`7!Gakxk-!9QRC~=(0XG
> zKcs_<?tQr(-nQ(3y&w_cFVo);8-dNi$_xA`goy<`-s93WI<fL3f1^^t9xvzyT}?~a
> z3b`@YQC7qG%)x6?sC}j>>KP0k7q*tw=Y@()Q%BS%bZRCG`Y7bSiOZHY(2taap;k#T
> zCD02R(^MlKyK&RS$&jaKaZ{9Yl-K!D-~-%Ht{A#!PWD-1p6VHBC}gmt9)Jj<X9Rbv
> zBkoP5zhUrWgZ4m937mAIEZkvB*JXw`LKis{>%gQLS?(F>Xxjz82<f7*uE6f0-->iC
> z^ukk+z9;Wfi=FcEO|;m8F7k3!*6|}83oO~RT*q@%Sh7>`HeIibiIf|Gbs1 at JPYiZy
> zpXOk#di*wm*aiEfOjE*5^0QB`&4mv6TS?t%MWI2K%-?Et6tuUFFQ#iHR<NHGHSH|B
> zN+<qbmkE8Gw-RAWuP%-b<7^<##AwY+VF0;@&&Y&XIFB%G_TNFF5AxQYV*lFJg8eD<
> zYPN2MoYd#>owQEKM^hul`&QW5J at FuC`@5ovtTZh at jsovnWm;f2XSD}s)@#j;`@YcU
> zRe87%VbRd(eFOWw?i?e5{KgXBRL;`WB6q%u=1}?^at|N(jw at n&U at O_7So@k<pt)%}
> z|B=$nc;`(sGAHkC3L98`fjz!jvAP0w#N9B at zQkR@qsFBFYV&NB8T>B;Xne<BMjgZ-
> z2Dm27GrlEvC-JcU;jZ%*0U6U7bZn*Jj^R69Aa9peCFX5 at 80<Yh64 at 7dTea@-vYKS?
> zJ-W3s3+MbIOJ#akf5;cJmGNQgW at _&S&D7srZ;$(pTuU8mX2?l1lP~HupPf}cd!*H|
> z8M`}kc5v~Jf-G_w(Kj)pGdHVf at oLyF<3QI4JZ4xRU={LRg)z#5yHe0|H&39yn=jDa
> zEr9J__tqvNOJ&MHIkBcVhm0gV3ac;p)(dgFioiQz9~c+f$*%eYx?HLfukgaRIH%}6
> zlMvKF&Yze$RuEvb^l3_s8%blFpx#XME{tdB9J$GU_N)(T+(<s5?Fpm)3Adc}RIXDx
> zF2S08ih1*^Y%~?@A}p!q2_rK at QD$r??wdVTKrXZ!_j4Zkxv~0zCS2 at 26X`uC5j-Ni
> z%4X-ZQn4%g<6HCN?yP27w}PCNaF4rx)}3ghSesJA{#U)&z4aQ0da=RtaYAiSuk$z9
> zekBR41?hWuT+JSi?{>*(VR5y#_%Ds4MPD6}yKFIzle2tj-6$WO?h_xa&eTV*GxK??
> z`^ZP5WBK$*tb`?Z%8eeiybM2fr=mMs>@Z5+>1d3%k+5(2-m#qI8++1BsT;6Xx0 at ct
> z3%0@;PDN)rY}Ss%d7#2|7RzJ%XxzWOV0=RU6IUzV2R`^WV|~T1z6vp=IxoKp+mWGy
> zLcFu{*=DuX3CS!~ftc5HOl;OvBp%X~C$??EeX^$fr=e1H`@xO1$4{E%bo=wqbEuHL
> z>W%g?viBC*sLCZgxXy6<z;)OV&~};F`Db}(E%3Gz>u<c{jOfXMtWBiv$veQk_+2MB
> z;>sFL>y|iP#Q9WiZ(sa97RcDh9E<mUhp%?Oyzw8LUw%pa0iBSql&LoxC*VGGc(t2x
> z${zV>d1hpzn|NU3R`IkZ*eMlW+|6l<*G%^lUFFF<Ls!6t%Q!!-%>ZG6CRa8ywjFrn
> zb2S8~JGP=f2K%PqE?dzKz7O8F^eNWyd at kxH`Q%Algr%^nR@}nwhK^}>jfM^V6sM7;
> zHk2^$`Nr^tK|cyhf|3wtmax#1rA~>Tg8$ag at pp!66MSfo>qDGPf_GyX{}uZ{i8D6L
> z4KdzW_(0~dX(h4A|DvhgZKLapYrz3+mq<LxfP{Wl`)gQOlkfUC*RTZIJMF$HT9%JX
> z4Qp-3odVyePOXs{(phQlSxM2Kr!6U#OpNyzbq>at9)9jq)AF&;ulP>AI~(-f+2>%;
> zNnvUh at 1gy2R<Jm$4tmNKs0##H<js;&Gn^-IjE4KUKTpZC#9766%Jbo;1<77k6HmcT
> zupL8__*kn_xhcSv4my;uk+W)-W-((syL2<_pYt;C{@HR@^GtHSx{ZamTYePCbu4Zw
> z?iw#L&^DYm-c=T);tVEp48!Y_wQ@`*?x96ZlF`u%|2aqVnl$m0riZMHu=|gHTdnH;
> zC>;xW$Qi}Y6jz_$9A%HUU?-l!*=-5lgQU00%=o?E1w{WAcxg#kMBXwpBlarkFdqYL
> z@^fz)iapXvob}P09mv^9%TToa4Z_Z5hI?}uo6;_4k^`MWUluqj=DzVUDMr52I!)`+
> zOV2yXCtY20<H#lN*U$+nRPqh_p<d1tu}^)9eQHxSn|kbuv()q9yHTfeqainIae&?q
> zy%}#)>bOS3iQEQlwl?r9z|$ULr;DuVGMu*=?ZH_p&T@^HAuk!;T)H0rtyPv%VxN!p
> zJcI6vyqnh-`su5dO>-CGTtBFU$al!uc7l?uIk>wGyPS-U2xWBw>9R>W)c*u*U7d+=
> z6(sJO?kLv{H_dD1gd#og3;S}V7SMNaqO&7y@$HN;GcFAG&mGHQYw)D2HOm8M=0&>c
> zM#Bj%v7aD1L$n-nzPN5fS_$rRM)HvdKOE`se#6Y6C5Tr^WL9{O!ji<tTS!C6*(a%|
> zm&?QxSied)N8t{FORK9c!pBu75v1HK6Fkz1=k(M@`snY9=jdy<&Ut;4o-ess at d~;c
> z<cxV at 7w#&QYqwgJLx)rD#as2Zg*gYSyQtktY#gt8E$0Q5W$_UwBAoDF8D37SUNiWl
> z8sxyK)X%*Ya<!)yu+K(5({RTybOd;~a&091&Y`0-Sw;`Y+i>s?BYpI*v_B%PJJLcA
> z7xAN*_ at hXCJ4%%&Cv)T&u|0~r6Vp(}_^0Xd{sk#w-lX&D$jQZCwyQL`?#%s(4De at T
> zaPCteXV<l9BaxTH9WofldEhI*#5#_D_FtlmT=ijY3d)mXZRG=p*!S0+)j|doRywT+
> z_4_1~+`q$KKCG04!H>PPdN(%(<z|bgPnN}dPgbDZo?O at x&vFjUV9JX^c at Zd&i*fLd
> z$D3T2uYjF2^&x|Pvlx7o;&4!M>R6Mbgl~i`gP$kdSpO^`)%bR%%XMkgV65vdt)^aP
> zs~`_0`2qh?n13Tf2a<3y=fNW)jOdDi&T>Fc at DDs3Kl3bkOAPblwBTaAEy_7%u*d2*
> zt!0wV(MaYsX_DDVPF|@7V;blG4=f;4B>m3(cVhmVp5zRb$NL-a%(D4cJ}G!_oNx3X
> z;X_9S#(^f!9sbiqu2q*`8uoWyd4K0+DC=EbkFy}JLY<14I=#y)#jzB5_2jXcdgL+V
> z33WkVXus&9#Tw;E&?1}}&og?4d;683EhgTRZ-mD0Hd^$MBejd>*Im&{0?IO3=pQ-u
> zGJLGb{%CV5!R@*EVj<pq`=VlY_ip1coU2Rmp2e|OQ4<BaUnpUrx7CYDngGyPbBueZ
> zRhq1g+^0H!Zw~bFE^<sm^5XkiW!11I=j%jEXicdyf75B<{Y-P?Xr0rjGEFr1l$Yl!
> zO{QR#R#`TxOy?v`3Y~7W6Zia*YDz4RYaEp6h~KRVaLmdS2p;stNp3g9ks;q4ocR`#
> z at _(VYNeQn7SWAVkGtC?o8px<M(Z;_qI?S4I+RHX at a%*Vl^gO5P((t{?j0GJ=#__j2
> z%M!AuLFWo%vOoCLWYCE)*e!IOoYNW<bo?<VIJKQssTNa}2Q*a3J>3b|ft)vI`O?9v
> zirSaGaUCb8xKCr at UR_9PYo0iyeQ~8$Lp{<(I*6Yk?F$W6sY6;_J1wx_M7*-SJ)Y!M
> zncTlJTFRkbU8sePak37OzL8s~vc=zu2X&e=bm~l~yLWjWUr{E;7z6D-u3OB!HC4pC
> zHAS`T*DaRr*SPg<KjJ7z2G5gchcLOTv`oh%YX})j$k$XrLmqbAYe?WLi9~fgQ`A&0
> z9?QH9QbG8m2v^W>s-e^%Tg4c(Fmv^GX>rhv0Y5ho_a>@3v&9oY^P)*Tt%^aXpTj0X
> zX at ZibK}(Awa8HWdLt at vghs|m1A<C^33{5CD&=_(riocavClC%=eAOU}CG92j-g0~c
> z-YjX#7LS80b|GlG1!M|~%v_-pp!T+EaoE5To>UT>>=r1W1wP=6Y}W0!B)^8Vm`@?I
> zW;f=>jKJIH?5BkqcZ)<F&mtXqZ7Er>_aE~qz|ta(&?X(%B2DMyc$!@^=Ni`QqNwQ>
> z*-RQYi)^GR!M$EZ7P%KxGl$&Co>kij2qAO}?so#*!>IZZX9HJy-AjIMRWw=q{M?^a
> zVolA at 3@=U*E%r^FU>!o=7~`92!MMm1wg79N5_u`=JyB3f@&H_lEm7u&7m{^EkOF(P
> zCt=_9RFJhQ8U7^rQ{g9e at U@_&x%$a?518}y$$Qn{ZIEAQF?7AE%<QpVd&HT5_hdsC
> z at MT7Ym|Fo`%~H9Bk2kk?&>w!eK=FGu(OE^BjTjG07P))!8dDPHt$jq~mxK=ZrM4Jl
> z at n;?qpH!7Ufy~}+ma5za?}*v`$hc)~#RXAfp7MTpqVih!G3bHvLi53kjPTBBF(!S8
> zdZgg&dM=M@#G0z~UC=R_AAd`FZ4JwFCv19bh~i6216dyYgn2B-ghfK%JUgcEiZss3
> z49mqv!xH*9rnx`NZ?<{V(5!J5ChX%F|E6&hCS<V+N;Ixk>3@$iYhkYUWcnf5ha#*f
> z!bPZf_nkF8?Z>Gbgt<1>tC|hz1u4Y!TKcN4W31HvA<OtWXO3TrL?JAZybzY59?SEl
> zOaJ7srHXpK at C1p=;p^oZ3&%`5yjdb2Pv}G4sSU76a+BqmD_JHi<Csc|c1>eV(XmFB
> zCCp*UQ at krL_P&`;bC0}7W|+r4EUS~)>s>5&qbns&;0OES&3C_vd$Zi&@8ei*PF0C8
> z_VFe(w at o}%sMeH(bzrT?^ZIDwt_0KI2VMgv?!ufssiQ(yLuO5Mpun#}_PZ!3gE=Ro
> z#%)3Rjy!I7a;GWy;G>u?6l6E(55m9ZSut+_z2wX~RA{&OiDz4P_!+ee`fsnYG<*-{
> z(D3j`tW$lx%mN!Q_qSUvU|n#YWp&QkUz(E@!Sqj|*TRX3#cXr3rX^;%3QC9zTDlZ;
> zC^2=s$sVk=KTWtHh)O6Tc7yayLZiBv2`ej_{sC!|lgQ!`WHF^)BMWspcR_OI7y<5v
> zg4ZE=+TtB}w+l5_^nw!bUy66(Onm2w`-o0s=}_>!^HERVK-`ZDr_o0GT^qedPE5?R
> zH$EA)PWX~D#iY<~{c2D3_u*sxOb}m!cCi||EdyD(&NfyT&p0^7=#uP8bneJ=xX?ml
> zPH at myc4R2lHSdbq+FWBc=PG%p>6L2DDq3Z^>I{HB#9Kx0^CUD2GVLsP><L5yyn_Os
> z0d|m?^?Eqo{g~nCy at Lz8O$48Uz=j<LJ`d#(eO8n+l$>`=+(+oKv(4hZWKHf7)s=5p
> zF^a!)kkWEN2kdq8UctUQndjUTyiqHSzlHz47V*0=E*bwf7DxZ~FSI!Iw||kvY2vRi
> zL!VJiIWaxc at -;n1i#Ysf`XR^II{qk`W5Ll0edyZI-^?O)JsZ6+H|6ydS@$5@{S|Mw
> zSp-LCM&o}C=)_{>AK`^U1+hIWx{5t2zj3J8Lp4r3U1cwhQT-;mjrEk1wtMOZtgWKr
> z{n`z$5a$)*bR$kT;&dYp at bx3!d%$@{_%WP~;tcI?HxXe!^oIQqT+aO4&FrsmmfAAB
> zlf%#!6Znlgxr`rnbdetK#gcJ{v%cMAuL0Us(#s!1 at 1y18-gNI=>=9c=^oEV-G|(&1
> zD#)yC82$$Dv!Wh}z4h1&|L))lrY?KPxn9dqob at s;kuSyATai0T(Zu#kTn<@NF}Fmj
> zm%Zz164upLayJ<12H`yK2yA|M?D~P&oHyM`)*Yl>Whk4>t0(zr$1ywXyK^02<NxY3
> z1sTt}F|yCTPB3#te8U>qZCE48`iJ+yPQq4x61(QRtI!iY7R2#=<Zi{<ZbPl};MfQ&
> zyayl-M|jFzq>AEjoAkR}R9Tv_F?c6DtlJLu42kTIw4*n#WaO2~u8Hv_dmYq`oIlQE
> z^iMgycndD0=mv**qo=HfV;n>Leikjmz59b#yd_O;XL(MIUt#KaQ&D{)d^huLy{mXW
> z2XQ_Iub1-h9RA7cUX~8W{~zeiU{|cGEXU$*ai}BnKil;A&4|?=kR$0(C+M^Qr_apK
> zREu%9cD0!s_y)2UM;gdxan`Q6XMDZK6nv3GV~W^Cn!KE+cp&CjgI>VKkP>p=d$19E
> z<){nZUM}4%u_}km_s5I2+?TIQR^-AaU&W;&Mm})t@`TV6=pPnYHzY*&ypy~oXI6%H
> z-YYZ%isLnIev!b*tN2fvV8eje?SczE3&^+15>}b<^C0V7&>_u^VtE#3;oMDx`yRdD
> zxrFzLzh!KVw-<_nD9E)VmGR+)VHGX*((F(N>49*E$cw=?Ds>Ad<W#U&)dv5wU=HqV
> z5_|Uy5AMmw{IAn#q{$L~olKt*)}eMFyruL&J$K?c=riPXkB$Deb4+yBQfn2x6z_|-
> zj}ho$pL<{J%E~MacaAP=j38jw7n75F`OvafjY!&FTA3rJ9%YFf#P#iCDl5Rlwt^3R
> z+nyv<Hyxb)a4983UP+&|!&clH`#DA40XWZ2GVsL at X+od=vpxj}H2jIOR&mhr`e#9@
> z^){8*vsWe~&s1Fm^oEAc(Jkc&%WB7SE!Ar$d&W{>kxxGjabG$`MbET(TBuqblFF31
> zUPbF(hnRELM-REZIOOfW>k){0px>b%jy at VZn(u0 at mXrIV5oV!Z9^i0wkRR}IZxy_d
> zuYyM<6fyEv4mVl%N6<3M`K)4tjy3b|V%`mF>{TJhNHU`dKlk>f at k!`$=O+9az-Dyh
> zYqqCi><e+XV;kmb7vL8%C;a?chPec&&U9-wns^7a3 at e_3y4)i)Pk2%ToA)+ at RyE@+
> zHXZk`XT3cus32<@Nk`_foc9Hvj7=|I;59kkyC at w6`X6d!?7Uc2h_LHe(=O`g3FPsK
> z-~&e0z17bT=C_&Fb?N6DB|3|w*?0>Sw%eZ^15LS3XbSR9 at Nx>g4!DLgl09LggwPUA
> z74FfEt}EBiRQ;skTID0}yM*33&r%h`U&)m7nV=*-5pzUScSZj-%9`0*)=Z`>oQ*JL
> zoj_TYOj%BWcTr9y;1`VPNZgeh8*BOydfmp?H7a2M!!KHZUkm}i=!*9xxv)LY!+WCC
> z%>A8ap?^8EtV#*ZPQxAhEEnHW*fK1yaR&`?M?F2T208^+>D-8H24mbaIN8fG at CxMM
> zsf4cUSmeF;PSB+tQCCYxyYE&!ERQ1VZmw{7wY=BAV?5sUHnZ5nF at C&<2_w2(=93tH
> z2YV1ge`8NTezP?2A#iX>?u>H%gUfnxf0 at C_=Ymq;{*K-s`0(n*hgV&jez8&FIo<^w
> zX9~^~@FuflSlvPW=NNC04d at pG`~jZ>ya at eA{k`k{)GtB)ODE?6 at 9)a^nJME7K at n5N
> zQk3D{TZT8vSn?lb3`ZGX^p>#%c`pTg0q|zZDA&ua3cP{?m1xVoPL4|vTvsOl5<wyI
> zFV`<a+~siP3~q_sg+?4V`3#h`0^tF{W#`y%OPT-fkXa1J|2p);eG-q!OVL{v&6HJ(
> z at Y}s*ahU&QkbRJ{zCu|G;L=Q96e$byg^T%<%+OTmO2t7BasN+N*$AtFysjv6I^nTs
> zIv6^VacO|P0KCD2cP$^n?uUZR@%=xq1&;gZz1^Sd4m<SG9Cn~bM!L}t_qdtk?x1;D
> zd?N0=x%w_I55rs<9+Z?i*rZcyDm|y0o{?(fYU)(rm{BISHZ90ADack*(ucZF9d|;0
> zH%Q}zxeD2WCW&*-JLkC$_iR%P{KI4Dc{)PA)^TPB?$jH2IDt9z^~&|-Oxt*nv1)Pm
> zuoOD>Z}7grl+7Zc8Suho at KGTYWwDvC=q$c40`nva^8~yO`Z^tWPeY$(1U*pKUntY?
> zFJ$3Pc0qiind?dZ(EJ!{<Hwh~j2^&N6X6HDkmm#@&rHX2CzFQexcBL%Un>G&x7e7~
> z8;{Ty5^p>c at 61PI4_gu%w)B<j5Ebn at o#nA>oHY3r*OdEnSHP=;z5!wJ{uQ(sb_z?w
> z(4MnQdmz*N==k9YB;B%C2|2j?%gxA(t1`{lRk1wm@)qNm-m+jjhAHb)rYvbMzeRQK
> zjO7r13+KVEkl7_-PcQf5<7`5qv4XuH*eo}bVy)zgp|=QKl+&PVVa)pb3U+bjm%3IE
> zw}`k2KdlJ6w1wDgToHz|3Yx5~cncUhP^?FIn*y%cR_0Aiv2X?UL0!A$p_ at wkK@ZP_
> zyj#2KP0v_CR35MTeppG}DQ)B=xyEr+8Dx6fO2b0aAm7u-XGD9(xN!AErq;ISBgJ7}
> zBrnTakPjM|ukM<d+jvD<5=se=Hm0xkU}S-jAyHnwt289-9!^wM`!MK=M|1VD8sTf`
> zi$%tYgv+tV=;|>ofW0%TI3h2EtaLZzl&^I?_T_#7t*&-9DtXD&x`Wy%)F~pQynU<i
> z#48C?hn~OdFomf at mip|Ze6Jy^dWbBtowwnQ#$v-;rXEpDJ$g{@*Lir`UHt>OC#3u%
> zEE)CD3yN{pkGyg2V=p{eLlHk$uX7~lYj`hc8oqHLfjU8_wAJ+0n2-~h5oS>dVXOH+
> z5xu8zOAFLZ8QBspY%BH9^h`EQ=RtQU)KO4GbZx|VR|WEKFUH at 8Yl;1pwg)o6 at V&xF
> z18-9I+lCdMWt>?WIdDbpo0;sBb5nYGZw+LiW4cZI9zU`f`>2wN*>9TP$p>>1q9(&W
> z)0$8tjXNX5tHaxvNsO#D(s7?=oJy|wP8q-Hw8c3hGZgcMEt+v7%VM0 at rZDnEcf2iw
> z_f)f-Nj%}neXz9?5f9yZ7G#F*u;o+=-LpNy&6(z~mqKI#n6H1!0^ALAH(?Iez8;3>
> zE<}AVW1R6JpT2yzFYX#b9?0;T2N^yS{DH+_Leq2{i=l*1mQX at zC#RFvd<uHSN~;Xw
> z;QW;98<A=1TiT)uPj_CN^m*|O(6iqexsJ!)FCddmvdS&t;%+6`x0?6fqgrXWN0sYB
> z_85Q597__iiTt2ATf4!$DFL>_c7!4?*luLxW83kKGq<=_@=faBRD!zuFf<js>y8zM
> zcsoV#vkbg0<`{V075R)?jQxih%G*DU+<RJ1_8V%eX^=GsIxus)5VWC)p$*`JP}h$U
> zHwAmFWb<;uBLfd*H=u(So=kXgW1VJzpq$9VaWAVPW~?$jys(MZObjjyri5t>&M1pa
> z$g&LKlbLYXyd<(h$lj*+hO?M(=FEZQ!>;=Hb}yb&89a|cn>Y*bCc{YYJ#uD$r-01h
> z>l!P}@iEY`XTi>qaegz-CwuuXiw45ey?JWT-`>oE-mJ^>l*}k{4h33e44t_QLQ{qd
> zh`pWtUVt2cl7tO|9ZB=q%$|(T&>u14jQ|WrICKVa-XjJ?03sP4Y?5va&eY7v{vTly
> z$N+{x1_1u=%~>LM5qt_gFx**BYuH1D at lT!@dZD%bqj86AVMmmA?wOcv`l-T6pyhB>
> zu-(>=KFo{4xmgtEAJJdH8)RoE<=75VrML`LmF{W~;GSnoUKShs24|v+FV%%kH*L`H
> zu_v>Gj12NEj<s-yyV>o7Hl|MwzJk7fC>Qn^*M{H>Y4lth>vj1YN;QGl?+&ttUKhtS
> zuLb<Lm{J#pvfBzbveiW!*=>-csQv at gEh4T-vxqwlU;%Ik1OVm(q5&j+cW;`fa3QCq
> z8UXcx#{f0pC7=cH9B>(M9q>EgJ^=e7*nbjJF96Q~%>Yu5p8++1YQQ7F1He7N9eNf6
> zq}(Slno<GW>V!p0_FWzO<?cU>zq<NcpE(KlJ{i5^p4r at O@q=d`Z5Zjdt>NQE3HOGq
> zi2HM_aQp8ckJ^becLB9~eEQVxn}s_VVk+Y$^}$b-VbtLV!<Wa`_y=cn%wU~vWq)6F
> z%V^=llx54Vrwm)Lt#<M^yRUh&eo`)E?YKA6|5StVg1z at V&37RE^6f2D-?uH)O<fB$
> zU)w?j?`Wag at P>E2Ld1QNBcgU*9_l&r&M4j8vT-9!*Z(ok&OO)5{E6Gu*+F%Q64N0)
> zUw!s`+|BI=J8rR(tAAKC%dRnE$s4_GWcuSA&3&U2*XOpmE&Nn_%QC4bE@$6wD;AX%
> zek-o6nt4 at lU`tis?Dh%WE??jJIrHUgI{kBrcX7<q!xzVKio?gxtXVoF!?fFD at AD~n
> z>u;A#ah+y4X23@~9<Q9Ui$CK at W#Y5kG~dfpIgOhd2ORQrlqr_4p7dSqk}cLLGy8<k
> zTeyCm%aMI82maVzb(g)oa at nXiW;Jh3RvKGn_4zA5amTMKa>@_Qh}&%+6BxPrY=5tM
> zn}e&nvm!Iz-n406pb8%Q(s}Vx-dATQe&gcz>?eCwnS`&-_7 at 4y&Ig|(;r(0^VDhNY
> zx8L<`egg>pJLz at QO}KTmB~?hTrgoPt;2tVl!~LvcC-2>VEo at r7qJ<bAtEp4;Z&WH>
> zLk*y(aGsWldLe at Mq&(79HTA^o$F?bRpM84t^R`I|o^RN3i?l8=3p(9)FaC>jDB#g2
> z>6`A2I1_$zOjhI_^9z!n2bO>Li-|m_rho3rYkiA_iOZgI4=-(XJ^uBR>8BPpI_>+c
> zYw~{Y_6f1`daSqm=%?kZ{^Nrm1+^cgt$$#2c0=8e0?}{d3Ztt{=`EK&E)A_3J>b`f
> z^L?&IWe at skbLP;>une=`*IpcZH!yGHpX*A7D?=*WJ3Qj4S6;^)UVoW9LpSH7W%G)I
> z6V?8E?4EwLZA!i0uJ6kR-`}V(ekjiW at b=cCez$^8kGk@$blBxJGS<~q=PYi_-|5&e
> zYlm~w%)R^<UmW1I_$JxE{U+5$v;2qgFP9v#>IQx(oaHccSr44vVel%Z{(?*9(`mpt
> z0xzAzvO652uO0}Qb|)dwE-iDz$l4>b|KH*C`cKl!1VcK1aOG<EtQ($LzQ(xwD3AYo
> z-<FThmIzIro#43j#BLsUuhhS9OOiMH%C1dg?-wrZ*Luo}^8Ki?$8vM=3)f|0>dZ6$
> zjkzi8^%qly`R`GVTz(AoApQH_z`t)ZRokbT8Vwk<sFjK5ISSvOG*i#ub^>yYoBwP2
> zcloA#*i6|1`VMHO3Iv9H$iF6hUk2<0j1Dw}n|{<xNf9>>um|uikN at U|O=zZKESjl)
> za7O_0ESo9!!L5{?=X2`vsaEO`-AehEwNka^hWv{?o>M1#!;33gsleXwJY6dl at V1pY
> z4tH30D>V%+DRac2W-1ntFtC{tZfd0(2OH{i!K0PRo`rIJTB-J#t<+rjNqiE1_bZeK
> zsG8qORrnghn{c1%Dc(C&$=}B}%OkFe<pFw{=hJf?_V(tN8U7P`-tRf`J3XJ1MVnJu
> z_`Z7;^!~(rPF?SJ_X+a7fVx3Xrb_VN at NENqK*M)5-U%_J- at wpz!+(;W;k)XUA-{Lu
> z at AA*0DeBsL<r}^Y>Ag^17_+vh at aCqD_GO@k_N4Mzw*@nV=vR3VHRiLpDzc`iDx%PC
> zF?IVjJL2DcSc~sF{}Hy5#QzsK&0!CC)KGTv!=brf7H<!Fp8POw)7HV9TQfg;ymE=u
> ztFy{D;`zuaRiDU at yiOhZ`Gc5&KFv0Be0Db4mWwt%+x_HEo at -O+_Qd#wI}bJPqSfE7
> zKJq93^}4To#wMh7H~%&LLc!BA2^V*cK;t5Ke~mx=>%Fb#KOQ(B{PFw;J3<!k=(xi7
> z_ at LrleHu#N)h!BZZ1|KGq8syfT_d>NIZ=?QVcpFRhdhw{+sJLBK?~?eZbJoeCDao-
> z0wCcwf!=n(7NA-K{5y*&eP~c8S*ulaP$bgkHPIqoLq#<IG4$=8R)~3l4bASC0z1w*
> zd^wT&^;~%Oz!0k?tTPXO{VQdVL$qe`sfs_IzA^ooJIvWtmC}_IQ|mXLw at oYhg%bUe
> zav-ArEjsCYt>22-3FiO5 at fllf?i*V at 62S6pDBd#lZN`$18%iQw89 at 7*D##iU!6SS}
> zQw8uq;9ucS;0Hgkboaf!3yxNgU9|Jwq6K at Z$Igy<FlPDHhB1D}?&069(ZZd7jQy<S
> z&rcRs|M|a*U-J8y1u+R at s6suLb?Cw9W&7?8p^DqNth0ZPS-$UqvEQ+O(M4Hjo3~7R
> z^Qug1UkDvVrL40)QKp at G7jPb7sWR=9N`!eLUVoWBe5<T0oYgC9Cc2IHW!k%cVUNdF
> zm5XK|?ia94!N$2gAc(D?#T<lr$U1lHGqS{N*q^YG>O=TQ&xO4n+`sJM%e2E6Wn_mU
> zzCT+<OO)N^l55Df8oK&q+}W$j#YQsS#>d6<mMWRvpD*j)HC;uEX2c+G{5O(yzx`f1
> z*Nc+rH+_J1Jd$ar*-B~f-CA4Rr}Q6&Hk3jxLEZvzmvx90 at N?^OmB!U2${v|^!U%-(
> zEAW0_<3q6>@>0n3zf>a4&ob=_7Afl?<nHK4y9`=97<EEg{Uy~Y$yHgGWwxwit5|iA
> zw0nGClplioBSsn78aCP_LETKGWg?ubDTkuHxL+Fy|I-1`Ibx#@{4- at ybL#S+ehB=`
> zRmp%yy}xrOv3cAr`ASv(Mv3r?b-B0xz#3~Qom+`}Lp}DguCJvi|F=e&*hbc|q5x%V
> zmBOATa8 at nT+C`w=GL&bcD%ZdsMfmBAl(;JBNQ)4Dr7;_KS+?1}LcVKdopE~$?8H^D
> zlUjwg*~&V$-;i~+pO$rP{zcaDAV$`?M<eU7`>R@^Ii8WtVZSQZOviaqW!-807 at 4+u
> z)}vAll?R-nJs&Djuj1^kD&TPp>hA!T+?VA8UsW045719Mgh76zG^)!7E`aL{+ at nUA
> z3-H^D_el7Sa*Yk*4 at AFTQ^`a#fFIyccH+ at _?6bOeol(g(Mi>VUO#Sr!6Qui}@MRqr
> zl(O#jEaYQ{It3^*v|}^KU0%I}Ujg0cy2G~jRN0dIXnz&P>=LOSc1N|N{*ZOt!CiTg
> zb=_m7kxUyf54gK4>lil<xKYWv>O&#(vypYOcXpSH`=U-F^!5EmH15>U7 at y@LXO!ng
> z=73cHEgy9<L7a$A^ifWC?Y1<OkFlAC|05uua>w|aOv+X&0#_85OB!$|qp?~M7?5!e
> z?dxhgBJ0>$1|3*;$SN(QdJ!M;MCwd-=$xF+180CYZexkq2Ir*czbSc`J1oTIqkPmu
> zY>qL4xi|I)oRu2k-)QJxPzB~_tJZ!y-qmcxSmi&U<t*s*m}G#yLiWYUH~>2Uup1}q
> zj+3F?S7jZ8OJSqZ1~}f^T^=zNc;-m;5tx%x-b(ksfEy!`CSN9fI$hRbJQ3%AXdlLE
> z*Pji*>rmwJD{#$4zYas)rej>y$n;kNWF2F_!5B0-Lx(zHjMu2-7|&huO&FujnD^7s
> zUy+YWdpNQVt3k-yN!BrQu&nckPhjWvk*wpF#NzS at YqW7C=uHsj0FAMW`4>f<$r8_L
> z%7^T~Tr8I9*RMo9Vecmhas;JGce;k3k=-9}jYPR&{D^@2afmko;jXfdh%M-sb24qs
> zR;gadmu5xs(Z6#sxB7twT&Pz3zFO9Kcz9jzAM6bJrxKa=_ILQVERFW3GIGSAOX#nT
> zLqB577^_kw_g|HZ at m2@!rgi+{iMxsza{@xsIMV&ieDt at 60y^%X_i<+)M$M`Ik<ght
> z4(OwivW~w*7-Q4W4;02;7Id6UfHx=fe;E91_+4e4DPIG}*Q9vM0r+TuzPbbY&=_;=
> zF6gS!1Kg`Xo%_qW`qs!g?p{M%twDb&S(pA8aC9HvybPMmdx?*%J2O&QV9iIphoWym
> zL+}PU%2%Sj=)3EnMVP1l&>a+ymv!ZSF5Tb5SEYz9V2n(Wb*yu#zTiJe)}^_EGFiaE
> zO61MLS*T4h#)+(>1oQ6ZXxuR=#`y1tesn~=a4*}2lJ0*DJly&UZFZ1#)LO~3Biznp
> zk95NP{uSx%(5C}{|5+GA{ZY0(+T4P1zD}ln^Se^fzZ<w at 7h_&zpsjVMTVBev*Q}8L
> zRMp#vsfY)fqZx-dn1?&dQCAk)!IgFNUyi&d$ht-pVeGT(w!N at Q!+e6hb at Xd%O?Ny)
> zpSTzg#O4KP4c4O?(EP6XgMe2eBXE&vN6Ij6tkCxsz(ZEG;z=@ilqIr`w52ioHQutW
> zk5Z}?{X5UdG;^>{yq0y%Ed$NR-4o!y!|o{PxDwxepdUU~){*rP_?sx}7_wceZ^61%
> zGXyl=0%5}t-$&Nf^C99_OOqq{WZp>kE7`Jchx-_dJ?M*-u(^*hDzYmu1|6lNMQ5_w
> z=hVqItU&$UP{&EYhdt=6V=>wx>rxy-d-|f?9N_pC)*~0x!3b?~MEGd*y@{;j>*b*3
> zl&mw=_CXn3j8o7DszI at p-KGe0YRUcHiR_shfwOmeJGJclDwb?xRWo?^dXI4M?^~;$
> z6Fy!R$H5vzfv3kEA at DfGCC^lOn<-WCCQ6kb<yv355iVpBkWHwHHoCN4+~nLsboa_6
> zE>GkUZjVbM;NRlXoc~{-BEp5#MJ0!Q4Tabpc~Gqv!wEltx8TGxi2R1BYe}@bx{#^6
> zOLtbV?W^;FRy{w4F#j6zHqWR>+v*E9y4B00u*O6=zEDIP@<4hW0LrP%cO5O_N);kX
> zN9t<`yCbYIU73S>15bgE77xg$rgJEh8648)D#!w$%N+h;OH4SsE<Ai4N%OP};nlzi
> z{7n_nl-l?*@D*1 at cs-Vf{|w-4Dl0E;dTVhU>sDTzGx6WenKQjM&rk-*^9jZh*(2Sc
> z=Rh9C!yej(iln1pkI|5iaEF*OO)=%}I<RYCeYVfQSJ^h}c0CkRyRv<(O?5uj^@<?t
> zyYRm{N91od*1H~>E+%P7oyguqst{ARelp0 at ysorTH!d0WY&?{!Dvxw;%?+~s>-<Vf
> zP4aS!nj?M#Yxm6i;J%I<b-KfG3)Aij5vQA3<0PolGuQfxa8a>qR8QJN_r*08B5JWm
> z9M9I{hpKxXu~sAVk6gJoyQ}IA=yu%fxT>UBaSbbq>;dDZ4Ip*e_BXEI;he#>E$Vqe
> zB;pPt<BImFB=~qmo4TpW{L!xf{09);kE-g0`PL%tjY$A=z(~jqhXITLL-75Ph|4=D
> z;#xV1xTYVypmL&KP{M&PC~x?cfTHLZ)ZGCusHGpipceFfL1pxLK}`c($M<!_lMZ=7
> z=?A}{zK7pu&<lzKSAg%)0F^iNW6&q{s7HN=nhF8j>{e6sJ~buZtEQF$_Qk^X=T0?M
> zvrA3Q2V96lJb(@`7hnQtk5N;#02**^o0^IS*uZ}m?p#2>9crp*yZT+*sVW`v0QA$S
> zsfsshiU(-zR8uWQl4;M&MBKJQ5vRUl<9L0!h|^XW!D}d&aDJ(fjBU$~;y09Ra%#Nz
> zf8(CulRl=V!V-~J66yti`wwc$A7BQkMjKMP)RZsW%ZJsJ0%74t)l>oep$I4G37Bft
> zlpc93K=`e8#0T);4@*!}YmUHH#qodQ2EW8N;#MNfF#NAUdsO>T)*&?&2ngMyrqXu*
> z6aQTq|G(TP;GxJqtqOeW(^e5RiOhX`zcE!)<^V4<^vyK5Q`Jlu3I9*{eubJ!oS>#`
> zEC2bIkfNh*0RA2Kq!?pFqNdKgZlgv3V&Ak;_1oL1zCHhd3Ss>|1nvf?sk)9fsuB>q
> z0QmSyP0a-SPk10 at 1>aFqJ1(oKk?=>M?!|r8lusWuHTo|4^k5rR6Wc~b?QWwE9crW8
> z_q9>s32l at T;JmGk+7;JE9oW at I?TK%ra&G<87Lsqv_ZS}=-w*qD+xnuuUj5OxC@%+a
> zVZE9<7L2|e0ec{T>Z_Owc53SS5;f%q at UccX@U>8&rlze^Q=UlU1ZYA$SCrrH8rp*I
> zcV!Gie#ZE&MqBF0f7E$qhK`B_{%imj-nLO<z!BiGxU=nl#M8fV__WoZ_b2!{a(A_k
> z4&aitkjN`E^mmM3g?#``&tv at LJR+42cT*oT&>>%Xvzt1GnFH2`$`-!!v))vE?xwCZ
> z&|h!R*~F`6-yHmN`0`V?N6(A9`SG&te~y_I|7hfboxR_LP6uFq5?9q at 0Ac@L|1}ZC
> z_;q5+n-+T|kvNdgc$Y=GHxNJemG8CZKfW=x-}{fX>Ai383-5g+&-cDT=id9q*~@$1
> zz}0)-IAeM58|(Ia-#C+b?;Gbc?|p}R^!Fz1v5YeGVaPQxHKEs!x>B~ie$sZkUO!pu
> zro9U<mr(j$B5pT8l@|H=JKQ89jzJD(z%x(MMiKB^g*5{}@+Nr_T0qi}weOufX*uR6
> z;KH&tN(jgSWCPLwApvdFAh at Y3+Nf552L7J`z5uJWTBc8*7Tu;)B9iaWg$q`uFZ}9y
> z`a<rI^!a;-WH#;{Y|^-Q<&DO}zu#!$|Nh%N{_mLw`PV)<$X)x%p(ATYQeKPNsL-$4
> zsQCbYK&x*X<%F<7fY`6wDD{FiDg)43R!<#)TY>)}74=j&zHRaS2x;Eo;62v?vS{0X
> zc%%3J_2S at v3M;t2(E4`#^<#dQ`hU7^)~Fk?h3fTz7gr=(q&rzJNGh5b(U>{EqNekj
> z&jWQ at qE&k0kQaN`OCnMh)bPwsjr&v<x-;k4)wwaJZe_jr>D+g}H;v%VlN{Qhe^XKL
> zc-52PXSeN4AN*+h>TuuHqehw)WX|?44sRJIPP(~;Zg$kYE_Gk9viZBg!D~d#XNteo
> z-qx&Xw3)PSUsmpnZtvPwjxs6z-j+ at uX>!@bN#jNv|C0PxQBx%Gn0fa~&@<mH#gFTk
> zZl2|Tw8-e`frXvxOFH%oP7i1w&#s$$O%-6372NlGkHoZ7Q4_b$a<$*X>$xBP#JsD{
> zDf-}-rI&0j9#ZLSKYeg1B-15ep4V63ES%>R;4%N}nE{?Y0Uir|zWhAko0;ALKJ&hq
> zA28l^{ARoF)@<Ay{@oh84S_-5*=^YD!kOW)#?j7^?cicJ_Z#vRKpYpx058XYxifv{
> z1<dsI at eKHS{@j4CXU+|nJKw|SORoS=&v_0rkjQa5n{u4t;LPT*9R at F2vnebn<U6jw
> L*>UZ3w&VW+)U#XH
>
> literal 532270
> zcmdSCdwf$>)<3+ at C288GZ3-<E1e#tb7oijctr*H_3E{*+Orc<nAmP%Aw*dw3bvS7c
> z5U at f)DCHgyYeB^_##$I>CPl=8sHjBIF<Q`JKpjjA*fxgd{qB>r6wv4Q{Qh`9pZBG%
> zoPG9Ld+oK>Ui-H8#Zg(KMrYkN^45`KMvfjmhLGIJmT9ZVDiXv$a@{}vy7&LhD at zz+
> zV+e6C#}BDco}IK=N&wM6v at ZQaQY_(!-oX&5QjO$mLr+4Kq!LYz^kcJ^Deu2Wgy!lT
> zpdo*p!|$cK8b{M7Cu>OD)u{igP%s#w;P)CJk#h}pBIlP8 at ga#kzNeH_?=2<w1C~E7
> zkz4yo<eM)_NsC%0%kkvjEG2#aQby8WwUb4)cA}mpkt6 at I6Zfm7|5y3{e+5~)w1ONd
> zsvy=ED#&JA1$lDBS~5CoE%_PGb;T9Lc~=E7Xx9?$nhKJE=j-@(R<0oLK8`f^RFJ|c
> z735pMWZ?h*@t;VVKL>m*l9oaM!WZuY%oG{24{%9jm at L2~!2N(HM25XbWHcj0h93)<
> zAu=&UWOR)p6F)#?dU7Ju>yXGKjS-of-V~Vu9U`MYATnw9ip*d&AQ_M*GDCKW%+Sk#
> zUq$BT at gg&9g~*I87MZ*+MP}kMkugP!%=GmlGq<0}6n!Kz4|qjp!N(%=V7tgHi37YK
> zGEbOA=BZU8^Yp7C^Ndkso(Ijp92c3TNVoJez^8yOL?ZuFWTbeJv4g+zKZ{IRZvf;g
> z+XnbnWMsrI-v9`TWE*I#Jt8ve`ijhYpU7;v0QgO0ww at 4~ZAV3B$0LApz)k?tJMn$z
> zRzN^xc7f+zNPDPCWKMv`6FQOkd;$QxeE}VQu~1}A9Tb_brU1SJd at nNI*G0xB044%<
> z10esEEr4pkNq`4H<4ys-27Chm&mExKu|xrO#1kT$Jwar1mIAhjtdRwXfPBC-z+Aw5
> zKm*_?;8Va!z!|_VfM&o&z-5u0coX0yk)31(%mh3qvUh0!vjG)=uK>Wa0_VOxfWHC`
> z13<$TFS7H$5!nY-B5S`FaJ$IL>M($Yd^f-YI1jiYvdeA*00(+!S1 at 5f+7*$27(gr_
> z4loD+dMkewSx2$Ru8I)Z7j6N#0l$fC`OPA`Iynpv<5>#WB(fDJM0V{3kzHp3oD$iW
> z9}(HzqX6SYwg%z7g(6!!S!DP30s!x?;Qg=O{~6wTQe<7o^X<_hTYpJp4?Zrkf13eV
> z0ayum0q~;8z6%-NjRruDckcxJB(i_671;(^WDg<j;hrM<K5*ZM-aZDMkJpOqks^`(
> z0JM*ODYD0=iR_0<MfUhAK#RzJG#HQr0N)=$wvP^otVaUu6xlC8>kFsIewie)r=Z6#
> zA=jxCz*NAafWHEcitN8W1biy8KfWWf-=ZvkM7jM0`G49gvX}P(pie*Y_JgP2K=Zf$
> z0O<a=u>kN8m at 9Jp6CxM&XTU-L4ZkgNeP)SV#sYvHutwwtJqLIJunEvAa)a*$92L2t
> z4+6>nRU$X+ipXX55V_$cfR_LVL~cYDAY0_J{t5UT;1#)%s{o$@z7 at IAj{rUtxiNQ%
> zoFPZ#Zhc?m#tjv at +s=wy_9c<KodC2VH+Hzl36F_fUZu!Q2#TC>s>qp4A}3A~xw{tu
> z&WqeM at H`FqPW!jW71RLSfG<RD#?4ouaIwhUyFuh;ZWg&&Ho#VqyPpTd0al9KoKlgS
> zi}2icMef1nfLBHCVes}yhsZs8LgfBjFLIAXiQF5<@k|3iUvB_^v0CJw<V3FIMZnL1
> z|BBr6(*XNLuIwj~laYrU1LzA#7rABl{sL(2LLR$*6uCW9MDFD=fcb#aBDXsO0DZmE
> zAAoXr1^K<=7rE+Uz(*qY>Ky=-*{g`Fd0yo9LU*qt?dy+=T>a|+==8u+z(xRce=t?#
> zj>v#5fL#FS=g1zwQNS?(@Q)ymBardPmw;1%uK-OV*H|lZAI%iG<MZ%@jz6-B+~-vy
> z=Scwc0z4{mU&M>tmq$eI)B_ at S`adG~{Zjzw^9RWK3)23w8}J6;6TnFTWK+V(uk+cm
> zUnGx4i|tR{D*A^G6Wd?%iNPzZNX9=d61z`qf7~Iqx9$?#pK*x6;Jbh$VlY5)^2GK>
> zfM0Se`h`-_ul_)6KQmWspE^oxpZ;Ibf6H*uKO{*cXoE1Q6WcFViS5hp6WbS#7TY(S
> z0i9B@{Ytq=jGrU?Ea;h##|V7?3iM0F_O|JwKVq}k{^~KY{mF5N`>W{ZM6rF*T_Sm5
> zpy(gDMr^-)9Q^)(^vHMNy<+>uGh%yDE%^8adF at 4bo!D-BLL|$#18<?&{_IBZ951#9
> zJfeSa0O_WP?Ta52+wTQW|Ed(*rxc0)<o%*QY75f$6x$E<7TcGdMm~keuM9NwV*5Ia
> z*p4=`{ntfe`$OPug<A9ve_!;!`Gn}72zoEEV*C0O(C!7Etzz)EfY^TelGy%)MkKjE
> z;d`bS>}bLF1hL)!h)5jJi|c-|{o$XW?>KyGLmo at S_9bh9k328;g8nTcS=%DEZ?KBw
> z#a6L>Pqs)VMnTWLq2rf;e=qVHD*8vblxO>8BV<>L?H|S>-!$mOj`)5^i at 1erq1RWD
> z2H}^B!NW|*V1PdE5XqVb=;mYKBENCZitP)Uz=I&Re|-*oK|jTi_o3Is_P6=~_i2&j
> zK=*-4(cjmP at 4FFB5Q+4r*uHWT_^(FXa at a;X<ZlrD#*f7I!iS*`lvxXCtc70IYDNEm
> zUtv3+f}aYp{m~0z`|DbftlEY=KZBm#pb32z*C7tNuSGexe-9e}5Zj;rGkA5vu4<s~
> zHLzFkzVM_-CP3!LcZu!0{|UOkf`>arziI{Yf*mja7`#A_9iIYkKj?t>;n~OodGEdt
> z at 5dmwAGQY>o at o@@fBO(}j)e}t5!);N1DQ^uEV9M+nq{!bSt42XCelm+?I&R;yT$fb
> zDv<sx-j|F1ceaXT-AeGQ6UoES at g>;JI_RPmbQYrQt_*<fodZAT!5{McS`9lb0naxh
> zz7~8#jw%EAY=S(cknv&ErGJ4oU~wJ3^C*jVVTUUb4_kBwML#=5BunF=i)|uV{T0d;
> zb$cD`_;JYaWES`>1-~;zQuYh%$q0SiB?kRxA!DN0{%6QmTaWLxV*7&>4>sw5?LEQ3
> zet6M8$PRrpqa0pCT>y<$H=)jMM){&nx0k{e>csYD=yBn#pozM5WjSp3FrL(wA<Hh<
> z+OvIum#Cy`pNg`%vOsLFegWk!!~ULyY^a})qul3B6WeDqqQB2E at S#On7{LDpvHhLr
> zP!9FLdrxd%^D*QGuS=%G4j|*}Ka1`6e}TL!0Y3x&0e~D=ioqk&FH8{I at A*64QC_Qk
> zptB!o?*^^Qh}S`nsFS~`@s75JmQBSxl+`0*`&|WihYj(lr!PS+KV&?e1fHOmN&(+&
> zuxFI(TBK>(g|=xpaDEW|89Sg~$n@$U<PSQFM?<z%u;mny7%qwa{%AAbQNh-b_NA at R
> z^CH+G>|x$Sw3p+=_A=P%0~vU?fSw5bEI~TR`;-NF!B&=C0RAbICG_*iA;1@?3j+8?
> zIj%9``IFf0djqxrKAu^CwiC3M=}{(s6a863&=$Ofwr2y{)6YO>pGfiq(3cUP2ODmN
> z?pdUp2tJOY-HC>cfcBkVBQ4s~@k7Bg<er)hn|lY}KScg$hZgKcd5#0_V&n&&9*seH
> z-+^-Z_e>wr%PHp~1)ZcdMG!tgM`C5--7YcS?E#Xh$}4P)G?B=JLPC}pbrA*TR=+P(
> zwPV<7_AGm at uPMSkl_yMs$-<GK$pqKHDP5+@>9%TWWAJSnA*!?P2t&-Y550O>ZEh<&
> z7?1*_dZl&n^x^b7(mq)k>(-lk({LHdBZg?JhUvrW%AzYLHzXM1p4&yg>BzFPa;mxQ
> z%?Mc!ZXyavgw3eu&Pj93ZJ#E}MAFN-=C)(o0+PAyoihOmI6QD3H^f=~jxbk9B7Zf+
> z<$J^783=zC3dd*={w@@b<q>WQh2st*d>moWAp=0CXE<y_xJNkbL^wViZbSIpoS3_Y
> znRJm%p>CB_Ga(czpHed^94dr%qr>632**Lkb4<Mn>nHi{6{N18Q6KFyMF>*8y}s<=
> zs)H}c!ohN*UPBJPX!>+6F*VHLOg;6aJjFC}PVf8~L~F^glSB(4ru`M9roki_gEe_I
> zWu`P8G3~Svi=8l&n7O*bw at Zm7FYZzzA-ri`3Q4FXD$9&gk{}Uv&7=e;(EuV71QL~(
> zXVHLOw8?ijNys8v at EDU|A+bmqhg3SGh(}xx;P(V1AWfpQJpag|bW5w0o?mI#OtR1I
> zU0w>DUWsnf8#Iy-?gQMu2|jXDVg>1!D3Sh1H^7u at ivw5xK{y%VWQ2nV>rJ_jk#aji
> zDVAJ@#WNLOnMo=0AOo3idTegoq|<YgK{YLZd|dF7-L%%$8(8W2i`TST%#fvm3^bj#
> zk;FwL!<4^-BxaF8_&(T_yMauKpQp1-wX>Eyp39%aX!7T+30hKAB>xv}Fi}T_B-qGM
> z$a^#Jht<ta(39bb0?7o$5s5aEmDof^ChEy3VBP}E(ZC!7%v)WvEsNKD2khH`oek{U
> z6Bd!N$oCFl8-P6y*g3!+4{X6T+qB3=^3M}JQse?N4=^E7U`av+%Ou)ZHZhCk5}Q~)
> zQOBwhY^*xL!bT(rti}b7*hpYT<%@QT9Sv+PuwxSSY%JpAfUN^|Jg|GXX6K8OgGkXc
> z(ZVJqWU+|}I<^<EdQZw-MDD$lC6WnglgjfD*C#<@`zE^Cn}F93c>NQc>;TKFC~+T~
> zoLIr?6D2kUv{DhDX4+}f;h7$?v$e#M!muyqB4!{kGLU*u3xm*La5yA!5jzyQ+zbwf
> zL7w5 at FcTb(0EbzMJR{5JSTb~5^EJecG^3FJEub(u;RHJ-k+8QW)UvmMx9o&PEVRmw
> z1q1+B0;kbh#ltI_mPh(UH;xDp(*uMvw>=hNZhP{IOHFH4F<g{&YNs}j7&SFobK6t(
> z=C-FZ0ISVyk7s2j?ienq8+bg29gQuM4rmH>5_7=e%)?VtljqD;p1A?ZyFJ`K at s+$=
> zg?5V1BYZTiyHb-q#jp0Ko7*CuMZ3j|g#4wJF}IcK!3~+Rjtt{Dl2<@Tl9gzR5iYRI
> zW5hf%Q&Tg_+{Qj;c*7#Tn7dK{zwZ#VevkyMBwMs9Y6>50EqkH9AdlEI^(X7|AWITj
> zB2E1vPwppbN-2*NM0+BvPcsprx5DVg(Vg*)8fb?=JHRT8b`LfOgHHEAP|h|yY7tGZ
> zlAh%a4!7kMHE~5jCg_a4d6gP@`aL~Ng9s at r{aaq~NGYjsq@?@XA%%-bZ~<yF at suK@
> zAxP2N2TAQsesHXA4xGjxF^rqGPEL_>(SxMPthtTLF!Z0cMrOPz%3HFmGPk`pSPA!`
> zArA=<slnX#>$4_}E`!&Rgd=>hPGUVAbkCxWC(!=F5HtNhd9fr#W(@sHo;0`3Y>{*2
> zIP?TrkpvtPlMtCym=_(CcA3ctDIlSLO12WEG`<U at 7-F8=<&Km!Mje?CPODK)>4BZ5
> zr-YvJ5zFG$I#)y<c{;i=a&^PT+9`9%`!b|rk9jV4$C#oDo(_M1Tls#_^D8Z3TGsZV
> zWy|ZQ<`GL|{bz>$mSo7DLf;GUPM^@&XPE<c47U#EB0`vjh at m0aD9U_3-jr{4ifzMN
> z*xFRGy_`uPWh!dRvbNmd$`wWtZO4vsrY_g2>FJj>kY}{g2kXOq at Qjb5OudDku+hK5
> zT4?IOdM2CT=s&?Ly|XFYEC1V_i+;vt$>J8c(x7p^F3pver#q~nPrPS^-j8>_E6+S#
> zBc5HoKYC)02>FCnDEA5X`@LknWS4V8WwS=0z5dd-Wworwvrc(yRDS;+mNH6_F-j)1
> zuQ#{Vji6Q~y&c$z`o+jZ7bitnlBEbEAr{)lZ at sB8h9GV=Q%Nv(={TpBnH<%H<$z at Y
> zdw|G{L~}Y0i$8;&nG}+^N<-YVzXzlSjaA1)S(DgkqfSFSum_%aR7RbecvxBQz<5Wt
> zotbkkMzCmwR|Zc`75LplyxY$h&-3MTDo=SX(oqpcM2Q#5j`l9l$N6S9^W>Z=6L~jA
> zQk%Q5%&nCN=fs>#_we#iJdNPtR6vpmY}mN}uw5 at T*z;t)Uyvd$+Rg2KKa(P*LA7P_
> zoGC98)Qim?Pvj-YzA;ydY-W&lk6mxAlKT62ck~_HVR8p&)FYQtTCR|`)Tf at pl9y`f
> z&`Wa%!FSU2o%Qs$R#l|@PD;Kj<&(dgQe)ETwG_uwWUX at c`yC3p5C!-2-%YRgG+C=^
> zQ`k63<JO{_bo;WZZ{IhvcH-92V|6katK;?f7U{kf-+JsDh2Nh0ZV6H9{O%cSty(lF
> zbNYqS_tO|oie-9AsO!sf1y+thTh&X5<h7Ngqm0}_Vk;{;z7Pa~?f8!lZ-|K#h>`8s
> z-qBmfk+|{{Ym)k`z)L-$&2;x|%bD at R&+)Rp^l`gI7);nhgJqjw*-f&|vCR6--)J1u
> zWZN-qcA8A~)q47t&#`7}E_vGV%+e&h+C#|G#%xSK-2Un!VWL*MQJ>qRqDS^LnFKQh
> zv4Vdy%ky)2O0I_2ls8zDbf2Nr4+kc6tdMP$YcARkaWWHlZ^I$9oO99M1v}d17&*n<
> z#?MAObqTTPm9{)$*Ed?Eh}yhbyFAC-w&^4HO#)XDDWq+U%o(>!Bd1jM7Ko(Hj&~3|
> zdt@^XjbYZbJHNX%CuV2c9o%GCz+}A#^~c at +GV4;Gin`1>N1lqf%sWS&;xDV5x19Kj
> z)|Fj-3^5Cql{1F81<Rxi32pzD5wbofaaSKt+#h^T&e^c5kNcoqFUO!w|4oVvyr;+}
> zRj#?zO*T0f7M=#_R)wVFe30%Ul}<9lt~c3*#(O*ElUADBHXL{N7Wi^a&hVX0LQhCa
> z`UM<p<vnt)5YKC?CH(f-CuB~)D}8c-dz at z!BpdJtl6e)*lOUO_NG40>kZc?8S7b}_
> z=>8DnuAEnPCAr_V3!W(GQ~WLh`aIF8PetNVDGCx3*#<jWMtdZbPcVp{2BEnKJ%^Cq
> z-^1MY{06kD!p;W6 at M#XTM1#Dk1zd1E>gh8D^GeAP%!C%aY_zfDPfdg?;ABGQMhmJ7
> z=kehftTED<-G%d*a12&$Y0RsI^K{`DM=0i%!g(4crqZBbY%iQgm=IlwRbpO33>%I?
> z9}g<q5W|OKG)l}m#Aw1XI(Ia1)*?nnV-VgN{-Sqth}9Qx?oi&l3g-!7Zk(Z*O@;IH
> zN(_~MkG+7C-0lecN^TyrzxiH0)rd4mX1%G3p3(!(K<-%;+Qie+q4PSK&e+0p%$Uzj
> zdW2KRR_Q@$x4HG=TH4D#|5Q$l^=Y9Z-N`3Ne2*oP+Qm4JPUgtCf;19wNbNXNJdZ at I
> zK3CpIQ}ZcgOr0qly0vD1 at nR`ryUQ_Y&xe+2L}OVTTvD^LuEFtddG?pw-aVd<%}EvP
> zRJ5zI)4B3QM0Rc^o1NP$YV}S}yJ6Oh&7X44C=V+oZ%*2*`;@CexU7lxQqRu~G&DYE
> zO=9|^S7n`(Oj$${My{Hhr#l|mF}r4xbCPj1A&ALC&#A<e_jBp<py#7kWX3ZaeNi$^
> zX~C?=m40pNx^!3iwW;gUG11d^rbj!Q#C4_y?*A%vdRJ<+QM^8!_u&6!>cL&9cgf^X
> zq-l^lf{!O!jMSI}Jn48?Cg>d`j38C~PLgPf^93y=E-0ulM$knP(^G`+h$~ycza?oC
> z7?NltdQ!joAKKvZBhiL&mVe5OoDnYjCU08cw7IptjqfSxEQ=+fK<6Zu6GYW)x35^H
> z$CsbZ#GLEtnsk{dNYRte)RqK^DX5TwEp}@a+u|Bl-au0{+dV&?J#wB~{l15rI*+K%
> z9y-SvE64?m-BgOV<7JYFd2Nif;sPDJe|a4jmoSQ at eXYdzyedscEXI181P(D6zm?e!
> z3Px=(*wHJG2%37g%$ZxSyk;1;V2x21h0O!9%A3~0<fW8o5VyL;PGe~tM(TRYJR8P;
> zM$ppem2_*u>GYlHPz&5$>GU+6g7 at 5wcr3==3s!@=zD3E?wA3Bv9F2Kt(4^BW>d5Jc
> zs~PPaT}-$j#t-E+qYW_+d_}2L=D7PKRaR$?VJcb0DLkS1U7wST5mS^N@<e(JN;s+3
> z?oIPC>-zibR>CJy{8~sET@#Yr#Q2DiqSpxe$V5t;Y9RE at 6XP5mJc4@f4t}ubQWtMd
> z at TO=lnso9ctBO-d64DXqLr1Al>j<R4en+_UrnI;dmFA9n>QFc6j4k}+!%tlu?7VZP
> z$W!l9Jl+|X9-~~QPLFxt&3U?aH3wchKvU}uI6JX1)))diVK7p^DUXyy)^Dl58Bb09
> zYxR2QP*?ACE-}S*#8C_Hh&3h>qUiW>6Q_hm$#Le^K(+I66RabIQ!|Qcy+DU4j~2GW
> zz;@yx8GCT;!GTnx2VX&H#D>1q)7H>dzrH>JGrwen6YAH8xk*&G*-+m{;bIf`)$xmn
> zjG3U(LUe at AiNX6gnMeM`;65G{boFcN`zh(R*58D88>FGnWIP9ej#R%LBZ1by6h&4|
> z{T6=`-X_(@D|xI{z6tc(0(|Sz1N5;7`cS@(q_OnP9Bdm688A1OQVR&C^_oy9i!^fP
> z;FVv@!CzOH(*IOzdce(@Gzst?Xoj1TYKd_Si7s1ya9#cSzim9QrGD#yUG*;?*i*mv
> zKyCg01OGgD2=fKL{_x*Ea7NNOQ%xkDhuyasGx@*E1R?ai?o5<sT(NEkDb(4?fi(x?
> zOvw>Ji*8M at V@96t8_j_=2VzmiSqE0rr(HU*+Bp(B&_YJOW+W|}${h67AIK_dW0)^4
> zk_6Pa at LSY;`evB*z&9q6G0;MyI&0j5Q+-T>uGlOoYz4J>(?HYLq4ZJnEh%yLh2m7x
> zmD(~4-lm&8v8Ey8yWw~H)+=P)M#A%$^>B2?vtbuTQEH5oxk|pVvp$CFtHO;wW8g)`
> zlq|u at s5dK$bPV{KH|hEj4`<T#g;o0Ol&X?{Rts}uoi>ps(y at Z#DD9Kd&fraH!DJP!
> z-%38ZjDbGJqFY7Q4fu*T>g4x4oKaWSM<8W~Lpjj4t%d2<YAorj!Nn;96m2Q=mt4gl
> zGp}NhIMnXg5EqnJG86fR%7i1I(|A+*+$O{u;cqGk(^zfND{*3HoXHm1VVOr96yK=h
> zjFPDn6K_kdzL|y*2WXA9q{K9JVwloLJ%(1M){?@fT;(yEzse)iB}Ft(G5n}wepg6W
> zSMdr{eizSqJznt*c#4$6UOx^l>MbeS<DH!0T|@oASGnR0SGkG{LUVIyTB=_T?Q&-s
> zb6q`2af*U9w+pLVDRYnfA+1Nc(Xw2J6{bbYinGA(;c-I!n`+d*XHi<x&n!Adbj_jh
> zc_X(*TeBE`b?&h?;0VRKGT#CB0qSYfA2 at U{&y at U0S3Pag95{4fD#j4h2gDrs%$16#
> zrY`lsRJ7Q-1D}O#qVXosrT)KxmA%}wXMwd|?J at FFgm8aLxr?UWC at sbe-=SUNoH1Bs
> z(9~dkf~e?-=G}0Q;UHIg5a8*YA4<7-BVEzP<mBLoYUg_$_ZRBi at EC+bO{8XmvnTLW
> zc_cf!F~S**mL!(8Bp!8FSX~p1Ty#z at gg2PtMHOSBT8LH}c;T>`)I at bz`rpE`gsslU
> z7)PLgSzeg3=sMdA;YB$^H8iY^)MloDWRZ1Rx;}HY=Q$6L<r0mDqb;=04lja)elWV3
> zxr!0`LahU}*cqzDax`={@%Q<mm`Y!+)Pqi5IxU3uW}O(6!!CQ&bYc{zU?h at 4y0AFS
> zRV;qkA7Sysu3~ZF at quZfJFbPX%!8Kd@=_*ujkCCJwS`abq}UyY+6JE<;!O_c>0?a8
> z&|jmrbSw`^AS-!7zkJAYB at HasSZjwhY7QKxl7}!_nDy({<#kU(zd at TAAyKZI8Cu5c
> z#tFJhngTtMn(e0B2px-X$1Hpb`pOiP+vKx(=X+WQv!k4{DcKzt>bp#ORa3`3HAbfq
> z^(KhgFx#US^p_$#F|336Sf|`E17qiF at pgE$p?GG|HR+RTjA0v?rqqaXQylW5<CtDb
> zUcGCyPHlLsINLLxj|X?UTC#4~*;H_s#HL=$U4(EA^(Q>KYrivD*L+Xt%01!6+(D~*
> z?oZUvkrG#CuNP3agnBpL5_r8d$V9ZHqjv(422p<`tXZkghP$Rsz%0q)A7&asi2R^8
> z-53`<k)ztNBCr#_yCV37ZHixbnYr!tTQOpo#_KqBc}fC)LvL7*oYJ6@)N-1+&3OWG
> z-PSj+`c_fbL%!AC-F&MkOL$cE at TjK3lNwo<N}tEW&qh4MKIqop=A%b9LK4NRE8AUj
> zgjAvxQXD<Pp51oEj|{IltV3y2^K>UP2R=J6HBWak{KRPHv&=E at Drdv1j8->KcM35y
> zME&=9x*zbSd at EJF%9<{(a)jb<jezgC^|xN|TL__<H^ZCTvY&;#HrZ`*V*dS#O0ZOr
> z^_E3!zwE at mY~2voq%fwjyaBlLtqb&*!!huyXU`0{12!dnlc^Tz-!A*v;v_Ch1)H6n
> zxSg#V>N1D1cbA{W*w2PEdDf?IyU3 at J7c4#5Vd1Zhh`$waFLu7;+i1iM3p9b(c*%y+
> z9}@odvqc9FL0k3!@LYjB*Ox6aJ>|v{+-5d}!6rBcxpEbLwbliFE>r%{XS|J(R74oV
> zU~apuBOC@#x3zWG0hev5V6rWX7|XRfV0TlRx1F&rhz;w21>d)Q4IPjWEe`8Vw|xfR
> z(5ryE0gJ=&>4-lPkSdKwRhV0<jW1%}EXabO6C(2#*`n#nQci~P#f|lt%|^H<!U9y(
> zs)fZ(8u<Zh6{DAj8TCE_D=+Y-gI6_t`03Pl-xNuG_Q6l;zIRP9CHul{2jZ{}&DbzM
> zO7jc|)eBlfy3+Rh-=(EIP+n%h%S6*Fyd?Y6P5L;}MJwqlEy1>huY2#0I0?A at gH4bk
> zoKnyAbEOtz%uef!VB5sk9is12kiMh6>s6N;a1#>H3pQJ1UQcaw!~N?bE0fPgp0k>K
> zk!)e>nzrl+i3mOexsw>kcB?fuDhmG*`80g{O`STF(~WxKqneW+=;B%5#q)%`o_w?r
> zA3 at hbuGJv4>&D8*2Xu_1l!jkVbzlOuE=qbX3H5y*AN at bb!9Wft{=#zTq8t8{H&25y
> z*F{Tb-6+j4b*1$RX}OEfZsqhp>$Z!^;1G{K(v3&xdB$Ri>EdzGHoor64Z3z3VoD0J
> z9&-xMd-41VPpWBB*ea1Taftc){LOeTD{NiuJ`;CtAm+5(QH at J)NPg~Lbe8ENp5CzV
> zK3nr#Dceh3c>?q&=vFB+SBiu9+|{g0FED~eAnHWA>Hw<W&@~^!UHM*_?eqkxPG*i-
> z>hPw6gMzwb{7&=PbMBH{hDY<gW%A!rL;fPwrFSt$DVZu~z{8kfh{^v99>@OArpS?A
> ztpDYI>($e>AsS<N^nq`HlVTV?<6}e2)YsOp72?TlmFDfoD!<y+S7?rJJrj4HH;jE_
> zyN6$$V(9zEc0<gJkIuLaqu$tlK1!M(>)|8HG$hYxl+^G-NQS#C!z8t#|BR!c*yv3U
> zNI5E>jjj}7MRPE3V+HV>99(ha!E5DGCrQQL^vcohD8sn!@~Ve<(+W7k-VmRy#Pc`A
> zi%PuahIpG2ue%}sX(e8NL%giS3pd2C_oi+9$C2x~tf8_8m}a}7fBu(s$svtS&2l9-
> zGv3rrUCX>T#oX%amGkH?Hi`#d#7c^ZIBoqZq|Y at a5n>lCS+d2&)kV2DTB@$^r|<-$
> z^<VrxJ1x&p39H}rL?O<1P24xq1D6<YhUsZSOmorS+pxNxXjv><s_tKZr;D+ym6&W*
> zMwBbUWjD-%mNP(E(?v1hQFn$Tbl!o|gVrkjzXJ`FC!W};{{?-#Jprr#;h0dbPh;Ts
> zSJQHn^dasdFp9h`1~Z~-OEv<Uzb<CCqD5+#`kWX^2h9Y7hoF}{NJ)HUSo6FC)+ED%
> z?#bEaldT#)27c6pLfwkv7G8q?W5hq;_l)uAteS|<FW-c}?8lb~4 at do?nPZ&pt>s%|
> zt=Y8+SeH#G9J%6$I~X_Ci?H(w?_}hPbNh}{%0#!~JazztaDKiH$Jd3^ye~h@$0g7J
> z9YG&X-L}uTZJDI5oq*b~g|1?a_@;%E^;M&q%lujU1k{r)TkY^YM}*U(406W7uOBZv
> zT`9^6U_AWNivM53- at yoE>qLc1g*S&rrz4S}oE(t|M_Cq;Xeol`R#2<t_KJ^_-M^MO
> z!t@<l%AcgiZ#tz)QZ%}KayS&fZ{@ZlO6t at -_baKFH*>$1Rox!q&5>}eY>p(z_CCeO
> z?1)OX at EYuXH{_)6$|<EQr{N{{DrxhtNt=E{+QD6EhjdG8Rnp$l!eJl8Jym0WErTZS
> zGYl^&EQlv at 7?)2Eb3UvaJ*9jdS^Ex$O4>1U-_dYr)V2 at SuibZyO0+Itp{(}7V?^!C
> zG5XgsO2ZLxwQL>Po$?!oKcJ=fnHR2+!a!4W!xuvMz>cn+px}SeLiIZ~oQILFT3c*%
> z_1dVfoq$#pk|=nGP>Onoy16WjY55(@eB=);IvVJ{1EFU+(_DsKhiIps?UxhdljS_r
> zNR5X_Z?i{^^rvEd{e0k1K-KJ^y?}2eW at P9YO75|0RMhi7%NL1t%ZY{<o248*k<DU=
> zdA2|L5VS`W%iK2Vuy3WI|MXLt1MitHYdd7i$ff62Pj<|4<Yp$`GZQ;hzF0rmq6;={
> zV#>1|j4Q2fyz|~>yDPQ1)S2I0=1OmtopYL(x%AD;os4hA)pkuY^J1joE}P}DhW1<N
> zZIL6|)2?<;Q)3usyW4OV`r}z8Rxjc^dqz#8=eBD&%2znbb?m&BqpAkVk at La2@!-Y|
> zZc1Hg&1K+D1~<#V&2pM&H at fGLqvevu^-A~LB8Sno3+>giP(LbbpucN+u1KZDE1B|M
> zU&t|2>FqL5B3<om<Rcy}O6TL8S<Ts<?QY~F*`vx?Z at Rhlznmei#9|m%lE3*q!}yZB
> zF&g**bY?^H`{mah(z?>%Fr^Lel0UM-JMcOV8fkkvcKmw7FM+WO>)-vQ%~G*6_ at 7kl
> z(#o~ZJ+E4=KFdyNA^)c9i3{(}REd9Y915 at b5agrZnrlcd(dRtsli?LKWcMVR%rRS5
> z8wE0-?*0&RE1s&X${Dz2bxwbuBw<g>@SaywAw>>NVLU-zhfnkban*igITG~c{MRSz
> zRT6<uc at auaf97@M{;-t{jNUo~(&`DmWk)1vqz^s!A<S5c0A%Tjvr*?_B(>z$>#$VA
> zG(=Pjk{h;l;_T4#zv?FtVig|jdw&ag=v<6dn3ru8=J&LU1MdjY%$}5>@r<?#PefXU
> zr{k^S;t{U2^7$V0FFu*_?wVlPFJZ1X>@80;4Y?+Ce!=Q?+i;ciuqTm9hSjzB>_J3B
> zSJO-M8ok6EyX?`pxUCOTJyEX9=Ud()49-hbP))ic3sfYC9Arakn_zCMdgMQ;=Z1v$
> z1YvbAR4dVL>7_~DG*3U&bv<@w)u1+h?qJX8&-YZ)#yoq{+^#u5Ilz~b4vZ+DJ!$Cw
> zT#W;KJXb?^36<#S+UuWp|Exh7%RlST8_&u4`;R}^^)eP#?0I#`KD$vO_X%(Bww*b4
> z?snmcB<B8$_9f at XNExOq9y`XC!&}5G at xP1Nz%1l6Q)dqbVX1uGc#n!lIc(O{C6A4h
> z$XG_wzd3VPq|d&e+1h_>o{o$abo%m#bt%D)$+qARu)cqpFjgoeY62f<khVFV4+5v9
> zy|Q{-Ouo0`Oy~F@@|3h(dcd2N)BndGOnRh9Q8Vx{I4A1BXT@&YZ(Ct$v%XA$erCqU
> zFAc8$u`b!FtBv5%dvAWsf!1U!_LYrA-x$vjepha at y|!WN^syt$$=IxNefdsZE{QDv
> zlc!0(xjRoCk5G=VQigsPW8nyIN>0p=M(FWX*`4$JkEmbIz3PBx^Sw-~%{d$;GSiu7
> z9bDVPDLdvk8OH>SMhe0>W#DYKBiCuHiuc6h+Z-WHvN_i}QWdP+Fc$5XW;+;+=3`J!
> zv&&C<J~3$sv1F;|yC%?YvfGjBnoyU9-BIhoN40U0o8)X$IH?9FrH2Mgo+tH3D=^cU
> z>mnGh at Qz$hgfJR;edWk?OmJX#Nf5r$=YS1*_dD70<J2-r?)Q8b&S`;?)BT}*Fdt`>
> zHX<W5rofDl#VD++RUh${&wi1)+V(~1(F$MFszqVkjqxme-T7X-aJ5~ID!hI)7gcdX
> z%#AosZ(7ba>(kPYmbZz8pD(FC)|LA#>m~i<CxZTKbB-R2oX<?zMPhl3_3Ge%lwxac
> zcaEtU>ry)(TgBAeLE~K+n2NIcEJE}GVe|z4?frGh6xU~Wj`5XJJKP-QE9=JjyWT8U
> zwR7YN_%6G*`%$O7X|4?CNWKiKqt(v+pShMv!U>5HejTkox6k>wpw^SsDIF%~XhFvd
> zuAR=C>yn+re0G|Ht7zwtt6GdEJ0J39S&k6Ka|X6|O)k-xm%#eAO>*Qsk6GNTd~f#X
> z%{be;neCQ-QF()Rpmo8(7V1w?Y*$Ttn+HBK>Vj9c_o-yg=+DI(@;=!mjKZG%yShse
> zEqT+sTAdh6PxRq2mLAG)ycaD5?B^yx9rb)=7NIY1T84gQ`l<K(<V{OoOl6T-so1rw
> zvzLu_?tIXjRgO`{Jw+R9&$!D^pJ!$FnWpn+!J8fwX39-S|Hb=#gsD~1 at 1#H8m44QB
> z>EQ=J`U0fK=%JDI5YRaZDz at LDa;b~T^lPYmf1P%*W(NPle0%D}vP<&iWzD5NJJws@
> zF$dds)MBUC!zazH=ck~)<l}iKYT);ZcHwCZ%{4C6EVG5iT;+pv9=-6_oR|xH68=g1
> zyCEx^(PH7bjJCc*${lX$>~EH&mnGKU6Z`v2QbY at jct^9^-`_EarqMYivM+Mm3wW~F
> z2_1zV4ZDVi6iJczeMCv$FR4soe_JF)=+KkYnlMwqsB*}A&FW=B)$Niysf at 6-CODp%
> z79OqToP;+O4&G`;xN4--L{o>qtE7nV*WDM at Ay1ojG>yS{lsLY>gTqXRVEj+C+4~Gr
> z)-glFIPm at r$?)03G8?4G7G~Su5vOiU$Qe%OCB*6csGx!bU1>Y}IKN(%ekN^73!^J%
> zFmAjkVqI1mLU|hOSEOPbYGtk^Z#CUG*TNi08H;1CbvVRJ#0_(;E*xJMPV+u`!UVI?
> z2+XyF(40+?B%*DfcH4`XYneLdT0=6L)m0;9j4}UTnQPfF*HUr|&9w&q;#12_t;-$i
> z at F@NNG}l_Lqz=!u2A^nFw=S<58BY6qb1gcLglx7!)G7woQ`y4hBwjNgFex*K{MO~b
> z5)};$P10eHZ2t>2s~GGNe)~KJ>vs8;)7?qG+^4h`>du~7TaYvELQPkjf%RuPQn^qA
> z8$;iT(ZQ0&7|bIyJ~e8~9_3vXnoq26Ft;{+<wLD{=>EVD{;^wg_C1f$5PCm4gDM|K
> z?PAb{u$_%VxW(b#*6dH(mqlv}-4Qvc8MzS0ApgC-<@+34BXM@{Oh8Zju`=l&_fkIp
> zX}#KRYYVBz=-Sp!D`QmgJ6<I1R>hlhgBM9#uf*TrMbe&B;&1RGX?;rk4PK-eExbbe
> zuJ;PX&>jn|8uiEU^X!&ud5tlKJzl-9ZL?yYhMplS&)M_k4E`2-Vdv~1rplYH_`<I9
> zo5UQ(YBRK?q{?DwszuDSP!AvT1A6%Dv=pnOS^_2BeI2D(!!?u&6iU-WlwxQ84kbsJ
> zlI8|Vu4^dGP$=CKrgZW~N^vAiNq0S^ICud6NV>R!8!3gPLup*6*Eo3ey3r}TYDsag
> z!%s=eiH^-|yw0+S7imxIS}qk|?S<o-$`5-7PM#OM1U%MaV-v6zl>R^Af#yUzc64SY
> zE_KN6@{}Ar4LeHiF)S>(-yFQSB-}6Kgy2#KR_wH<!N@;eZF4bo4bI3tE1gk$R-vZW
> zqJNr+UdyDM9l>b|rPjsa_Z}-zX~R at _)Jir~6W0Y0*WlK6v$sU7En^1fbkmxx<i>;I
> zWYEZORGC}<eO&1SgTMB-Rz&b3A at 3>P+AMf$VTp$E&%F}X7Nui^J;glt3iecW_kz+d
> z7|SSMVsH3T68_TbhA&m&F9X2u)sYdU_O6$XZf{j6X55gjDV#3zhIDN--IaeU>27sT
> zxt1!E;7yy)?q;ED$ufr_zLoU6n{!Ma(MG#RLlcuE+oed%xJwOpmz24x*VS%Zpz4X;
> zzq3o^amgjioTF77QBBZjqoJ|o<KjwIIG at PVIifKObU5FxTw@qfvXYLcefH+E7Wtij
> zCdNsfBRR;#jP_=DRG4j%$#a%|pm3OTJ^xIt!vEP!Rf_<t=!<7|T{3=e$F8E7k~IqT
> z(yQgcoWT6x1^5NZF{ggfn*q$hNQZG=$uebyV7ZcRg|8Gb4qq95LmbN8Xkd>aB)+Sp
> z3^ZhTkm0Mh;53md4RR$r at 57ptuI9e^xM#+<f@;sVay~ns^(~(d*?f+$MGZ78ExFGZ
> z0lip#k@&rr_7Nq8KAb2mnF0S%x)<j)a2A%-Vz&G2fM$&p;Z4PA#Bn+r&2LhEzx8Mp
> z3Iz&<X$pm at NSj8#KAWoiCgb;y(tj7uLsQ#}?uT1=f9Al+TjUf$=g at Y<R&v){5nD*D
> zsQc;&cJVIa8SGbzE9rwBc8|gHO~dqL at 8f(H;>VZV#HTO}%DEq}vop|7f1KK-bFKkO
> zt($Ca{b3;9@|C&yY=rJd9o~=UOpGl*&WUNBnN4_>_Ny2(X=vZ-U~-0E*bUDwd=fP5
> zld|J^miD(f&tGuLf~f*C<n<DP20pgT;YoH+i9M5hE*|eER;4;3XZmEu!J=2!@z at jd
> zY(JV(GI`EJGUy{DU$~V}wDRZAuWF_8Pl{gX?&Utt#7eQ4kYLB8n(0W at sHCN9MeoDE
> zkA1&oYcf?^x5Kug at N_n&<lqgniLZgjemtO1M>K}M9}mb(EOWs3sx$PTjXl|{3Y5lq
> zq6&##V~F~A0Pv4_IQ*UgUF^Eyabl?If)`Xd8u~8{u{88E4XJ3TjfR3ThM3|z1W;M0
> zX;fz>R<#L)SL2M5axNP!<3sdR-C2IhMKS|>>mQYQtgt)=`@(N^boHvr5dy>ThNxqE
> z=%{Byp^TG18-`V5 at 1!oe5q`tY^yh!0DUcd89D1Z at kL_8_S28qZCQ_6u=^)c%)l42q
> zigx$8K5Z!X^1*+U7W*gTif~Q_C!rX6PO90znwd$6B8LRao;F^Nz{xCle7&hyPn)%1
> z#QRzU`$qMN$N);$k}9h!ACz-3vcNe^#8Ax>l0|i!sVZ9yjBgutv<!~M$SgcMLG*e!
> zF^-dOzsfAi(BX-aar*GOFB!D9tZAZaSXgPXQ;%SgDYIxp750b3WEQ<%f at dToEv8xq
> zzc#|qc~8-Uk{aHC3Cr|IqiQad&Ri_3+hL#hYDK~h31_&9=!*O_<<z^@Fg(B9l`IYM
> zrn=QW`t46L8+gyUfLBheRbBA(ur6Rj;h#NP>jEwm{;x-EU7(_S17HbCx)Epr%X~~T
> zD^0q{xpqi<;g=;ikHTFnqx;pH?JcF at o%3jM*+q2TNB5k|JUwBwb6yLJ5d7ae at 5lT~
> zrG)Nn;Sq-&E;|caREVRYyAd-K<CO at s+JD9SB*fEqRbfiRH+Ub9_Y{*}gLh3f-fs((
> zp_agFyI_>ukW*ClBKDd0z{=E6db)2-B4SW`%2qe>v_4SV$Nn4I8ft1)w0(e|6g_>|
> zQ?vx5<itX3hcW6 at Uz%IL{wM5YAa?Z(X6_73lujG^7Yw(fEq$#Y#sd8d!XX#hsRz=p
> zzMFK(*ujVQk&35FwROF6b3vGHk4n&esg`M7ArF$>^3LWmp936673yT!@O(i+^UBN1
> zY9~r2saRV6tNqvIC{G@>e!X`PC=OFXDJc8*w|{na?zt$mZZ&8LU!|qgvPl*^+GCOO
> zoSZQ&1^BWaUtWTIutkZ5%`()w=J&>)p3T&nu=giYhBssChtPmcf at MQ5pSpQ!k#l!Y
> zE1Q3-(Z*A4eeUi@)6Q#G!Xb>+K4x_TaMCyKM~c>eKk at O;SGA|^11a^M?_s04QWO1t
> z`CMk=>)7qJp|xR1&bYl*;L0IkKZ9nmJ&h1a#@eP1yJ)fnwEHe1ovCD`26s>FJ&vGh
> z%x%YCqfco_p03|wiZ5^s at G2S4g+RmPMS06mXD%IKv1(dHbUAPAt%5IWG*WzP)x at CH
> z#FO;I_=>$3a3{_|U$K(-UnxbJ1E`m{FHkIc3&pvAV at H9iu+@GzJED~B+{^JZA!Ij$
> z=^NlMpa)AxDqs{~IY0yy0u}&vao`a6E?jci3Agg0cZy5nHsiS$a1d|;5CCYAt{-3+
> zU<$wncpM-D3^7H|bhjhT2y^RK3u!EY1X$5Ti2BHjo<Ymmj8mz!<!m<eIMz(1JgSz5
> z=Ok|U7M_Cru%lV9Uwk>kOt~0bD94~h{+3$MhD&k-W{zlUP+mG5VUAE at FK^F3JMi3~
> zkXA}hW%rh`!{uG#jZ<qg#%9r0y~(4ZZQO<?8T-BU5ehvT{~f4}mpSE&1}9flH00+!
> z7nHu>TkBx-F0j8G)x?kFTv*|3w7qFaGcYp|Wql`N9C><aF=2=- at YF60aZ3e-Cwfyx
> zxJGH-Ft?ui5vkyh#Wf3xHe?o(PU?Ekl{vhR$KLe_^fF8KMTNAZaCTabru<UeYQd_z
> zkB-8>sm`_PuF%kz)htTlWVhVDKyJ7hg&gamF32iS*LA(;;wC=A;JVQ3a*IH!D_vNE
> zjC-%h<*xT!ISTLp?VgJ2l9r;Pt<(7WBITZ9?2D%5hq?k?c2N-g;Da3Rde8NP4=in7
> z$A_Qtao|QuS978is+r1+#sWX?q#`eOQ8fA~&s)0QC;BPRFLk|}{I~~(ywF8EPO-&M
> zFWy`oS$V7bW<PFkBF}cFz}mUSk2_$<W8GpR{jrEy&@Cp)ABULP-C`8^SEpB+4Sk^>
> zr3A76 at +CJ;UMl67v at oF>zOg{OqPy?V2M$CjpT_xZT`=fPox)zZ=;u6R45_Fei5pHk
> zQVp}Fo<~h-0_KvOaqB<GoVecM#ds36PLZOLapQKBF6+h_m5WPpx6cVGVPkZt4$+!s
> z=wFoO#qC~K-jlT+mGV_1ccnx8JGA6hr-V3fxQLj2v_{gj-V`^+A^8J4xePRbw at VE%
> zM-nNYp!`hcm<>v+Wo|pVC(vLeF}zh151TH^3Z)M;1oV<S)c31dQ*ZZF^ec}z7_un7
> z1S6aahKEl6AZ4IlJ?TxAqv%=qnr(Qd;JN7&9`QJPiqzO^3QwcHI;MIuwJ}JoHAG$B
> zhZFsTC(<!P>g9dwbOOWj*!Oyj()IT>^timwn|dUMQZ?%1f}ohReLtmLxfbCbn3EGj
> z5C22(m~)0G|3e1$<PYv}$o~-Lo3GHGImFY>*K!`MI!rh+hNO{Ekj?>Z!$U=L!g=b^
> z$bpbmbd(kla<=Ui(ZjecyMyIgtWs5Gb^N7aB>J`_cTX$flCIWVZ4pKh7 at 2VJUr8%u
> zr at 8fu8V_dk4@sU#{MtQg;Hu!?9PDA;oLBFO61c%=#mVck9``)V!#xp~cs>{u7E3*F
> zwt4}N9ShX=PFu^CXAE;s{(#Z(eP;(|s`fq#-|Q2i_R^ur?!Al&wU<$(7sInz>@KEz
> zZ%3taQHh at NrsfQ<nrs-6?~v2wD05r&M|8AYrL=feR#=9kx at YxNjHpp2hN$Dis^gVW
> z^eqPV_^`A5`N49!1FZ<s?WZxJ(erVP8L9+2dae=_3P?jo&(L&wxd_}XzmMzDDE89h
> z_%LwxG#yhPABH?JYb);2m_%!f0pBP^wCdxkS~DkB!Apa2baHVI+Co=hKghHTNc#-Z
> z(llz?+E(GdTT<DL^0W9F!h4Qt&znlQ1?99Vd()xwX{#DGV}yMiwrUt&jC0M^M(~k_
> zn3SC1mDz?7#c{yJSA4mR_CQ^^K1XSIQ<0l_^CCG4wJnq$UYHR5&C4CBtK5dZp!U%5
> z6h+VX1)MaMVO(*KGYy8+<0<F+u4-^h!1quNYUL|?JOwL#-~c=!Z_tf1x4qI9%H0z$
> zWyn!ji)?%47s}}>wW2ec#!d4<4&$c&D61fAYvw>`ERD8LRrdj`blzIrL&2xiS<j at f
> zW=g`Ed7>)&lMI9fD*NWgs8q=3Z=Dh;8jH$#0 at R*>wLA++o;{x8NvmWw*RE14JmVCp
> zVJLK`s>%*H<tQnGQUZ-ll-D!v^Ga*k#SJZOa6++Vw0F%BihfcY8C#Y^Zz+%mUe>Gi
> zE4J9&>d6Q=*O5SOX3^edl>5vLdlwk`7x$H;6)Q+P%brIsU7UfQHYun^AA|c*RM^2#
> ze9f1R&M#`%PabyZ9fQ=f&ZcA6!c&Ilr(FoutQY2Y)-1Z$Rzot0jZ_oG_I^g517xjt
> z5LRo@#_cGhIlxx!==b{<XM}7{!HGdTNbP18N__zKRNhsLHE!z1FHSaD&>Bo#<%4bQ
> z3^XX#i&c8ifjka9Z6#Sf%fiEP58Ce(De at Thc)Ij*9L?3-wtGULL3xku<l^PpK!cy=
> z-?uYn$8A`FEUH4=U-b)(hefnN+O>%L86(-Q5l&pZx%K2Tw7u7=1H|0=s}^%uI-+N(
> zuc{oitwn(KD0kA_UNe90Zr0rTuN{&EPudIcd6uKKVJ%su#MuY4f)}y7F|K5dYeHU1
> zL9|uRXt0l6l5sNF5`BzCPo>vmJlK-W>m+Gic1~i;?U`d*FuE*xQSpUkclyFG-z!yC
> zbD2=9%I<~-t6cGd32u5vS$K37|L<_Ci}lx%7c(ceWM at uqx!v6Q`Hv>*&DFC++4YMZ
> z$;u9E<%u2FYIwd_>{2cbq{wcGp0=AWYkswxTfdKjA0!%5Jp~zuLz1WA{dy*_lg>|O
> z?ZJHgjm8lljK`S<oQSTUYO&cx%+mGspBc$}7FR}|4(GpgjBYj4=to_MQ>f5c)YC3C
> zz4Zv8XG{^wSqFM1OrU4NjD2vb8s|0-<2;zB$0zY2+K7*&r>*M`DR&|Xcus{62RRv@
> zed7%}dz!V8o^3c&gA*V6D_NKieIdY$BHUur2qW!@s~d7+eon|HeF)^~mpKrpa4=)H
> z=(K{Mci8IY(ijWTVmpS$R at Ve?h21~69Cyv22fi&QvDqGQ!e4U};&I9y>EfgDMY7e|
> zXpAK#nit>|t~*2Du1P1MAGS$NhBr!HoANS)Sw+bkcC=@vddx85O5R9N*`-gkyvj~}
> zmai*&ZeB-R8QRewWmXz$ZrkQnEMEu9Pmp^H6;e;ZO?nFI3?6uPMW?SpRvW18#cFGT
> z$%Z at Nz7$A8k-gONg_Lf3N9ZZ-wY)9!_Kz&Pa8 at 3>b%c2=pVxD~1{OgQbWEv|17TTd
> zkh#qn$`5Zw>3QO4a^ch*AKlm+d1NAwJ+S({tC;V}xl68Slr&!#Z6u6fZvA$+i=KqT
> zyXQY9l0||m6zVpn)D<gCCq047*2PXP2>#Q<N=HpK*txq=AjaC~$&^Fnc4<%^w at 72c
> zOf&y|wWh9LuvNl23g^bU0M;eYqU=0|`DJ=tz=YeI>}Krr<z4V-h4}jFOgFx4;44Dm
> zD<Z^~_p~cQ;VS}s!P0^&JR?jhoYcN8LB*8HSi9bp5sIfdQ2Gf)OexL5Ztj)`U7P5X
> z{l+}r?3M at BDU}+YKu8=#dzq5g-~nrb at 1`kWGrU+lB~!Jj2lj?Nlv%WC`jmO380}Z<
> z>Eno*ZCOGz_Kanv81|9x_2;JI#srQONi4zcq>Z(cZDi6F4mYv<U>DrE)dw>tZqij}
> zvx$VK;{$k2cz7f@%RmyHGj7vl??AiLoyn at O`qd+6!=?h-Qg52hs|e}}$Fc(nFAXoB
> zP?3k*Xl8o)JD;IFWwx%0RA*-n+@$lSRo`CTAj~7ZH%dBipnD${+rM}UTI3l{^n=TD
> zUQ8+Xd0xlPiq_Lb9&p8eLvv{MV|V=rUOjI7YW;6D?QNU=keis>j=YKStiTh=1I=KE
> zwdA2AP~4_5ARO<;N{fbmM|mmVW%}z at JV-@5hJ8$TDy at V4tw&wK4kV*K=<C3!0{z~j
> zmC5L1`WHNjS^0g`R|GtYLt7lAn6?=0*IMk`PeGeWzr1vc%PDFpQ06KYdUs^X&`>Td
> z1=a<O8Do1(<0R_uq-orF$l(!5ozs8ABeYj7x^Fe^i!51dv^|fJ=&6 at 6(g=H1!Qa|5
> z>^YqOKUIZW)l at -xMyRu0E-|-$dbj5%s-q1SBcZ$>!kq>oiC`tOrp<GtNfP!7s0&Bh
> zPk0A{uV7HdZ|j9<a7TMU<=)H!8{v=KD at S4#`ZkQaui#A8G at j##aS?;t;`Af|VdX3K
> z!TK at NSoWZ0o|e$|7Uxi7SD*ew8EK-Ye~jK!15W~^_-2X+_fJy#xV8>>ZrlkPddp0_
> zo6jRz(H*fls=KMTn2s?Yr9NAl$9KO{4!UAfys4N2fl3)Eh6%$Lt8nt&w*e<^`%Hkh
> z68^|#DVd<;j>##yo5#+)?zegto7-L;s?1!FkH5c?3!xP0J)oEsX>wH6Sj&6JLGP#O
> z(gz`GH at xrD{z1Ks=C%q`cWqVnLcMx4%;7?XBF+<hx49eN3#kTW at D439if!VFF>dR3
> zrHYI)#ibg?8MA5d?{{hVyT?Nsmg|i+CeO0CoX|VvhEXjyeB7z!$0dw^LR$XUmhM^}
> z7VSo at S@TPnw?B9BHn|&bf2Mq0)u|?=Q_9=ufD^K2QEe%jz(g%i=ZZc$2KrekH_#cC
> z<POt*sH?mNbff){LVFN;vyrfmG=a;~6c8OL)>V*>NjM9I+f#W`$59=8dj<6(Te)9P
> z!{Aijn!<o2xx??+Rl25}>JIgHU}x!sbAGr}s&7ws%lTm?XIPj;kDPJR3umxXo%tAt
> zFg5v9^WVOYG8F77)pts6=}ZB^O<+RhU+fs?@6C1(p?l-dda)SIYNFEMvF{5nda^N#
> zC7vYA6ZzeTJqd{6cfW at d5(}8v-G{1Kth=D6B0}CsiNWn}S(tgV(nI^&)-BlAPIsH(
> z+k8XR?iaBa_EXvxp!c{GdLQv9-WiPiHo5!K7NcbootI;@lPF8nTIx5{?LaSulSS|i
> zk1Kf<<5+d!RQn0^TH^v3L0wt}uPlT8SZxhY8{!_??IKu5ihJl~v{#dS at CzHp71(?X
> zZmSxekCl6zXqb&RlsfthyE1l&vApNi<4(BH&4wGWrgYe=hnKA4lc|Qk&v?!7#*DWz
> zi<*y@;~vAajl#Tl`{v*cr<eBP)Wu&3x+9{K5;oQf at Z#q5Z$6w&sx;ImEzvVlcw+x7
> z&gKXtoqm0nes$eU>G9}uDw8q(q46#yekkody5e4^ahTPo;(K{E*$lt0;^$953oBLA
> zaaLTQ$@(<gxpJ?{+0cC61MhnCIrnJl1-^L)?wT5fGb~A&iB7jntVy+Wcc*=yCeVbZ
> zv`+&{OO46F{rd#}&9K9^G7c0qs$Suo)X;iNi5+ui;K}-Zg7Ply69P>N{e|dxPz%D?
> z6n81*YkxoJ5IO~iy+hiRni}IX6Pq1$?*ct3uwc~c44iq!T_~Qn(ALkviJEAI3aQ14
> z4I8EObmuT{>7Q@#VwOo~AR{iJE?VSN*{w^K$g&hULux{Z(d|I*xlrN&JjzgICF~H7
> z5atPcBAU<R{y^$GqH9-eXi;u9x0S9z8Nxr--0qH0`cNPG(e}Uzcw1S_s|HKS<>|C9
> z%FjTXcOtCCJ~D18be at 2px^K<~=W*cW<`g;Kll64{8Fh6n9S7k|^x6Py^X8iaC+Nyd
> zvk&X?F(uENTff8(gp%ho6MveGGF?dfozv%G`Ezk^z!N)$Ne$b_Vux9&sfv)ZEWg`c
> zCA=kQ&SjVuVa;~2M6kXfQ=PZWGwK5ig+vFDBAQEa?_WCh51Pzv%^y;K;npQ+jdwbZ
> z at w~k%VZOZzJU%T&RGQ&iIs*#JLc6NrL}+UnZzPnCM4B;5GhxM7M<i0qf+7iHF_gMw
> z!kvk2&0EXg|0GB0v9a6P-2<V=Drwz{nf5qpTg<ctUcLK at 5$;b at gdim72&@e))YHB)
> zoKRuP-}9yx&%@pa#0Z=wvJ!i_AeBxc-qfw5|If4nXRM1D-ug6;+m)71priPu*!4Vh
> zIDBvLMJjJGQ-@(xuq9LV`e+&Jit8EFM!FA1=SuA`9qpjr#Lhe`_nX_^t^Xs;z#05u
> z%=NE#FmsHS8KX{%UFAIXw|+HU#%^>Col$D>Hig>g6`r<TlH1&t{*KSib3|*^NE-CH
> z>OvCLlz_VueQ0H1l at S3_39Z}F)?pQzFtOqH>B`y-Zn*7S#|_<v*?B5hp5OgcGW0hd
> zzB~9H%x$_Yv=!~bd+-nOB%GX#IR}qzWN+-A(_x2zgfSGq>*(GFPr$n!`v#<(0jyRQ
> z&M at b=y>`zPy0R9oJ at C#r8{qT3y at 8Il=?cv4{-Kx!wn at Ku;8`RrjY03olt~9Irrwn|
> zb*wpfB6Fa#;ZVE<vlgs>?RPo93c?558#wlQ3u;IZ>Gs#3!1>P3d&#H|b0)@RiG?F&
> z7tZBsxleI5Hr-A81Z;YEBleN{({USa>%W%JHcv at O_np&pk6cX`P*$5~#D#lvp7Mtp
> z&(pc<jN6s;cLwZX$>Lz+^xj|Sh3`u(vAg_ewPVq4#jQ at CirWy@v9eR1eL~ew9}Jf7
> z^aN<%rG?d5;A^$S%6hss`rMtSm>>TIu79ax6uVHtM?w2Aj2K}*=;!MXg>y!4zVwHX
> z4071lz&XNF?4~=SEL$+ThizH!QSMuZCB at A}Zv8 at 5755i}QA4R`mjrN^`jhDE-iKd*
> z1mZBdQtigAtn0$zMfl!`FlKBqrARkA96pHfK!ia%axicb5Y`kD?kvKIAslUAgzrEY
> zdW`uD_>>O9+OY^94Ta-u2%kk5bfU8mt_z0+gx^M(@^b{?kqCo_$eEyN4B at CpA^yv7
> zI1k~E!{KAVF@(YzoEWoEzY*wbo<+P63P;Bxe0L}uIoS|5H49<n6+0jJuOdu&b|Fl4
> z0zJhT5FQ%}ljXqwAQX;8DZ={};vcdUOb&+~2>%K7Krk&CooHHb`~iNgH>^)%);i6y
> ze%YS{Rg!Zje>l;#+ohV!xmC^~lX(di)j1bYZ at lW6H@6=1Qt!IzKLK}6EKksO&a#tE
> zYdI0E+-ne?!>Fr){ol}jj7+pGuy*XO3;qLPRXE&4YdywFRmywYIn1TH at b-4YJC2q9
> zL~FK5vk3Q8A(Vi<%*O>>A868%OBP+JfIC2Ms}ylYoHr%u2Eu2Si at 9K~7yEFEa2~Jd
> z1<dWR0)o-WJ>gZ7qsO3C+`@xVE3H at 3QRs&#D+w4+UcNP_|DKbwkgYF`!s?8U>^{n&
> zGuR65zXHcLyX2l?&pk?aT!&@VuI$p$Bho5qFC;eynyAl$=cS_-S6MppVG<CQezvSH
> z)1PfV$8D_l^zyqs2`-%M*G4z?q%$ke8<zB?LBURXPALms4v&f-kcN3vjZ!e^`ALd$
> z4bfoNvM`V^4pU`C-H>B#^v3C}BZF at _KG@j2QuyR^jADxIrLthx<2)N at FT$AeW1n3b
> zDn;U+u+~eBInVDoDY>h%(OhhGM|P9pGjN at _DMw~>EZIs}a?Q>NEml^K(fh at 0*>7!*
> zk|oCnm_qEnR94GbtD<`1ZeqQEP)#0o^haYqeS~QcB#$RY=@=ciJ|6Yxy5;j at m#&nX
> zJCC{oXJx_gXhA}Pn{d8WEe;=3J4u==l}fu3)?nP3fw6Bg9s3&5veoGWXK`CM)^pHT
> zMtw*=?j}LZKy&L+7fKN;4x3uwN5i~O(i;h}clwlzR^qKxnU{y{!qGJIqJuf#oysks
> zvKDwo?3=)u%}xt~2Oi$>@SA?~NSeDR9 at e!Iv9PdJYPxRyA!A5A`GcU-^j;+xhJF}c
> zGh2^cX+<wk|8`M1PLMWHI*q6e9s2`24daSdQr~vb3w7h^N=nfx%n2e2r%D>wTR(au
> z4K25eKU14 at F!Eqn;(9;!6BfiMy|pCG!EKhBDD_cVyM7ATC0 at e59y9)b7PPO{XsjeM
> zo_bF1gYD8*yV6W|*I+bZ!wqw3{||Xz9v at Ya{ad}JJ8K8RA_D0^SX2lJxMZ9dI-zN3
> zKxiOrO;*4Fqhb^n6qVcI0s$gIfPjk7sKmHo)J!G;bULU*a6$ZOJ8md44g)hT0aQpE
> zy5INIz1{Z)A~V0AzV|-w^Zw|*b*k!|+D at ISI#qQF|9q|*@h$P|;9KJDhCM_}xxRK9
> zdPXsL^W5a``8-zE*vRtVMC0e|Yqz|PbGAmBbI(qP8y2gPm)El&A77Vs-?@K?K9AF;
> z+Ztc3uP*a-#hm%wO#P!;+bbrM`pkso7U$U(f2LuG_K1~ajO7Grg}#1F(hBh$yvF}u
> zAq^39nL}Mx0h$GxqfPedO!fKT4-G7sWHoig7^rF5i2AXn!EQfvv3(BGeV*eKS8rj5
> z?PcsHSFz4kJ>g)?x~~r4R&VHIjDwiPesHvYp#Mi&RetbUyLVl`<NZ!_!w8y8XL9%~
> z at Fb;)-NsWsS(o|20kSMu*^5@#35|S(J(y|1{lX?#*<wc0mj}n77YG<3Es)@r%9)}K
> zJjPEQPJS7=Eb$cQx8fKD&X}DrA5T3I<>?>%d)1P+b$?4e8Ljl3E^|>scD!j&Y+|-M
> ztfo5LP&8>gxfRV-C(u4^j-E(E-=MM0wVHBa3C6bTnKwl3pBzaWndX_(4g74{l*@6`
> zFZZ<PO!*JXg|C3Y1Rss;o&k_hmd5=^4P%>e0qr{H4L`3ttvRFpK{s(DY>$URFOcRg
> zuPe at Xkv&Gu*86N0uc=-`^PteGhGyKHw!x0d0?S}%{qKeyUvSOPVf99YCxd!#ys|KS
> zMM^14#vDS!YKNnbWo6^W6n+H(XpCk|%Z>|R<em0$cHB=G?WcW|9rvSv?}wO2T!wi>
> zbhcspG58_Q{6A&K{csfD2AoPvm{Om$W6CS8{$^9Xmdb?G^bOj2ExsoCYn8vY2CbL$
> z%R+5e9xgO!^;VC|0ntO2qC76#(Fui;g+a(&NN{2<gS(&tbA(?Hct$vY at Z#(TaPLRA
> z)$0|-;`)Aq(Tjcb1JL`C#h(M2&?}q?U>$<7+ww5pkyz at 5)?gI)hwlOn*)^}~DJ?YK
> zf~#1=Tns0zaay`Eruk~>VW$T>&mMYMDCVcFcZ5${?;JsAt+8jc!h7}3A9EL1@{`u6
> z=T+W6=BAipaPqdodsp=&oGQaPX4jt^cC>m<FFz%oRh|0NRSK&kC#{Q at 9iTJO>fN9&
> zzn3JlUJuR0Dx7;3p#fdtJo}fwInPb)$Ik$TI(<(e6#SShUuVV53qebD_V8fHH|)~G
> z)gRmqzDA9mmPfOQHqie)Rt_Dtfza_x_Cd#!MdJqgv8ghpse&|0{troO#ZOG;Ttw&X
> zi|9yNMKiZyW#;(x==ohI`{GSaIDIH+o2r^{rVrmW^;sk<8nQ6!eF8R`Er`RKa5D$;
> zV^b5iTHI6_i4!*!r?Mj at TFo_S(1AjeH71fj(*JhQdit0CLjIujB+a#?_4LpEEpwRN
> z=U>I5049%}r?=_mp%>Jbc-MH%r5T=3aEH&dPE!?)lfS9+^u;>AZeD6Jk26op(h%2N
> z>8VV2kBvDt&+xUj6w at DkbqJ&0<inTZ!Xn at FN3(BqFA>>R`_2h(MtxxPKI_GK7Qt6L
> z#l;x3CEgz~awNJ<z41~M&Hu%I&~KRV!?{NMNBh&<raspTIW=QNtpzUu;AcJ<<H&^U
> z)CdBv8+ at _Hx%KJw(90#EUu*SD5RePhnjp}g;-qEZthLb2Z>4q7q!%!ENf2lk1zHcd
> zV(^O<2h_oyxUBs^FTE_WeFJt0ySrR;U*5x>@I3p>CqdY683Vu5IJfv>^?RjL1YPj^
> zhTH0I+qAiQH{Lk02LB3Z(x!>kcbBFxTkzqAN%c7CVTBG<10AS`bfCjPBMLOEph5Pi
> zEVOG1PR17 at gIITr3ARnT>b~$Z at e#px0ft`2z?aWQso(q^zmKwRywAT4`w^}`XC>U{
> zmwRb%ex6raX)ZZ30P#M9#0`ZoTb5JH-DIr7W%LuUswDU^0_8^XF{)Zql}_{JBn=yd
> zw8)0sWqQbHI)Bn~1t2Y~#Kq>q3Sm>F%c9Mz&mq6ul;Rld9Q}+jG!_?%^Kvb%rX<U<
> zd+KedQH0Lpp%_nMbJ;EC#!C9a7I0-i>pVA+EDvIpt1sq~F$%9=ZFQb~b0glmpim?K
> zzY3}J5UsU#F{Re-u!PRQw&6(RWR2aTNyMu=xYKU8BwAq4d&&mO`+BeEw8tNyd+MiW
> zI?o-uHB<L!G at m>C3^@f#(B0rJ0m4Ed6R(?c+Gz%KJAQT%H}?gbNVfU0Kft;>60x^y
> zwI at LdYGD@4ye#4z%Sf!IOYskDF8J4q#exlA9e#RfRTpOsTQD5!db(SJdmRggV=s0d
> zPBd2t&6suQvj;4%z}WRq=#%(a?d9ue1icIz$>r;6%32bd<4NK#$6XQVLRlU5C0xh-
> zQ}KVo?@F8I{ZM2!SCa94oD$-?((VY6G?AE3l3uqZwk91fteHFN1DC8KO=AsCy2*G$
> zYSJ;TOp{k#F*WI!c{a7L7l&pg<6JiNOC}D)KQzhsr{1W;PcIG-lKs%q_2imF(jrp7
> ziu9%R?Tp&&#>r9*2WL<X2j7=!IOv0Wqf*1cDHqo;kAD}*)5sbybp9#0!#RB)YmSE~
> zoYI*Ppm8KvfZs&?ZX$nJk^WJR4=wHVbuB&94DKW!&fLxa9Pm4^7?F at Rz&!&z%Wn(#
> zV2_FJ3SggsZc+JZt^jVe;cXvtqff3ay>w^Hd2ZTPXpBB=Hl=m9YO5E~8&I1(2YdN?
> z%dLg8&%9Mkew>k!+vOazqD!4;-+7w8(2f>5&%S*WrMQA#c!5^-pMVEY&K(Ji>5JL*
> z+?P&n`!Fld!ToW8zsi(|zL=WJl45+<Vm5HtHzLdU*6$|jS-N|EC at rg?`0tKnOrDD7
> z??djhDl|>MuNd&Y(PYKJx_;QP_!+y0U!>i1UVkX*LcQO6vjn4}_j_*&@!xqppV_w|
> zUsgvk?6qMBP at wy|&?V8__RE5-+ZK_=fozFG%TNrN^iwu|<M8vL?BH)$?LODzS=^9<
> zc9Bh}vQ#r@&QK;Tb`9o#0*RLniHP%O^FMK1=VQy4H_=!DyS*ZG=-%dRgLl8%TGxfn
> zAnzFBU?%8DST^)PBi(~vigM^uk#a)NZ-AbQyBw132#+fCd?fU|94e?n+asava_BOY
> z?CilOpqE>Ul0jdjzZQBJiwNC;;K8gfYG%fA?5a4=jb8{kYsL2uVw!vgVyiQB;BP4V
> zBTlAu;y1w=di$?{C%~PH-)LtjaKFefhd%qhr=^R$=c<K0Nz5$|H)8jT#!?OTUU8-e
> zac=5(tD<6?*x^=1#U at A?=`F=LJ9ed at BO^QJbPn_f(pg{!;B}P2fO-2Z&;hkd?)Y^m
> z&l0%x&~sJc^xAcjJ7FLECqfqEjz)AVQtszGS1}hU_Jf}hHb<rao-NUc9gDb?#G_ja
> z at cSl`4>x)<L;6!lcfn;}^b5~tMZfSI at KCl`=(MInhtIis5d6 at d+7IFPXVT82ZY>qV
> z at d6uZ=MbXvA*4xi;|^HD)Yqh$mF8~j-p~tPn7hID>dSspfL2gAeI$P8Ja-q)+Jb9L
> zx^8khiFS4`-Rharg_Zvv->F^L@*xD{MjCq_@*li~8-sF94n%sS(Zh?3Q{Rzlv%?FO
> z-RXwPxVunJ$(AG8Nz5Z_l;S*Sb$h_hucxs~DbDpYRslkPB|G-8Uf&(A{&ZRiwUQ|3
> zkgU$?F^VOkALyGlG<D(MD$EoYiPX<fqVj9Gj$#p=(I?nbg_SL at 9nG`I;XIr*vFUX}
> zv)GKYDEJ}_?HZqoJ~9Vxtl4y*qpe5>N$veH+;gD|vxeWbqdh0*O$bGq^~KO2TIJFB
> z&OjHWh_@&!vHos;ht8&GSVL4;7au at 8)+&^u^sol%4E^A?Go2NCozP>P-_G}(NJgAJ
> za2`GB0qjGyVvP7bzUQ#dcMkf0vSkVRe(DsRkHQU(8z2Qwoz!!=*UER4Xg^NgNjf+V
> zJH^((c%c|8-8&(VEPQSV9W^V%h@=tq_(z`!k5Dv@!j1cI%OA$qi0?!4+%HPRzLzpq
> z;UpuplWtR)0doH%+OPU}yL?xSOYDP(ke7eTdBlqJ)IU#>)?6BGRcr9ejyli!%1MG_
> zZM5`b(zzU^`)Kz+z}=NZ`Tday*C5Y#)#Xs{yy?T1s{!5ZN)`+pey3#!;QIg at Is8UT
> zD&VDnqd2^;r8hKf`s&<?NvtQkO)z37&tRKtGuh at E^r2OBXTUaBr$?KHK5V6b|0 at 1}
> zqTNIDM&xNfl at 0Ekk?*?hcb?mjN;{i+#u8bX=8*$Y-s>R9&FDKL#G_&q>&mW%J_vZP
> zJ?6U#6Ml2^;9Y;gEydV+tG+)=tTEL%EA`N~vMw674<~=VlyJyK6LyIbwHCJT*q{@-
> zE at f;V-atvzGGX6i2fCCA`(Ro1ee4B!!?Bu^FvGBD4pS_s<zTOW%G;2HAmI6cpBo=X
> zH=X=ZJPs)1`+*$yzbZ9|^<VGl(~Q^7_JL<s{)Aa*FD$>VhGs?sE}P@=Y;(7IJpG+*
> zOX`H9KJ1+)>oFfI&+7BgM$#W*jnH;e06V-!>lL=eJ`?U)!Y;WVYZP5KXWQUy_TTqq
> z6~&uAubL;=8cMORZgsZZs;3 at mwPXXwKf-M?4QEM0SEd)b*t}k7Sg<6~3rVbANVM&O
> z%j|5s#~(U?Q)*)<-&l{}oILWq85&ak#FtrbA-Zl<UAeQZYdgKUaY}bu+hD8BX$1B#
> zeUg`H{k?&EMMqr6`sgCpCgF9#EaQIB5jSZ)X6q}PC^hC;-;{{|hpDVKBmP6L72qWN
> zv8<sFQ9a<U^g{x);eD2kuBVfQmLk}z_poFAPUx$0sx<!g{ZTmKI3t*pmGIC?+(;ev
> z&`My64ol3xfVtddskCCBQeUO1%Avg at AGkv35lli2B?4nrz`@7L(5tum2G=t&4Lk9v
> zyK}^p-MQk>-J`^;-FED|kEXnAb6jtQ-L9bzt#rXcBf0U72fUozmDrPgXcfH!C)2wT
> zd!?gkcZzzRliimhf4j-wuJSig{wAPL4qgB0TL#A<-(-w)#Q7Gi at 4L4%oO6j={~6{h
> z?7nEPhF-IhA)VL5Z(mHKy9?BhvifWooo5x&v*I>5_9tfP`fV&NE at wEKgf~FT+040k
> zO(%K7Xn)VF+wk8l&%)Bh_nH&4x>7tX%R`)I%qz4~%!CaN)aPv*97yle7Q8Ejd@<w;
> ziw%qveVuLJec<cmWcM~YT+8??$?@!CaQTMO4m?_y2dnFTyv?=20Z1Sym=L at UI15nT
> z9FNsADr-c)2eS&+e=6XmtalBL8K6F84cj at C_Ix$;DnuI2bnGfNIoXu&Y&Z4N+opO=
> zd9<nU^p-0^*M;NQ)1#pON1V at zlfV0>f$rb6eSbMDjoNTabq;pV*}XUOv~FDg={p9;
> z7^IU6ds&fGb`AjctGMX`S*tbLwOCoC;I67kXX0+F6L+Ba4QHbryV_Ei!NlDZwy9lc
> z!QFnZ&)(I?up)xwwO}U)A*BwSrNVoR5MmrIbihHegdBeYYS2P%(MI8jjr}w!6q;6C
> z|0AxzzINMZ_u#I3pY@*}#A}(zIbJF0QY_qnP^)lMXh!&aoNwsBH<sJk{gx8;0OU(J
> z&a_VAJcu~URB=Xi5=THBoD6Q);XKikq5xY6<)@d+HGeg)^^`h;lTGbKw|Gy3KbJJ(
> zW-puSfCOC*eu+iV?x<$qObxg?wmEKjdDGavV}l8s95xN!=Eh3fhAl0B4BllO+cb95
> z7eSqk#eM+|0E at C?oj<mYTJ~Qkc`W8GSJMo%u^tkFP3=Z!jv_S2>>bl7%`r`5E}}Vx
> z(`>$&<`nEipy at IXcEx<U<Pja4!g{`G#Bsr%l_^{LRoLm>MEy_AX6)Qu>(_e?HcRj5
> z>gXfe=|%DXDIRL3ALj2z#qr41xv#Eyy7B3 at _q5_yG>cDt2{!(P;B}ZK=xuX*X94oS
> zjS;o?M|HIBy$u|HE)}l?wLj6W6USr6tho-i%|R!zPIpRk$RIkLZHf2zqr`FeE{3d4
> z5V!_ERYbfL;O?My!n@^y+iHw<Tce;0F~nDrMyA0ZTZz%cufu-|;P?G{XWR4h+XXvo
> z|0j(yFKbES_^xTUKJ7b at A^5D=H*mI1K5o_F{B7Ih6ZjhN{pax$C!=f7?<c>AanFR6
> zzb at OD{58h at wu#ZswmHkOQcbW}*zd*WG-GnhG2aQ;VuHVr);;-)%4Q1LQs+O@?j`Al
> zd>lmjLn!^1Fkir3siQTX8e8_FWQ!10`={EwpZU?*HuIm}I|7Kimu874aL$dnENe#q
> zjs~s)`#fzgJq4a-H8wG4-Id33PU at ZP9-OIkw$<Te9Mb7xx1OIW?Cg>(T>f7@;LiK>
> zGQqdaUPBs&7|=OZv$z>EI?R1yS|3JDuW+{2KOv&0XANEE*ssHBNF99IT0J;>QpHck
> zh4$G6A#M8g at 7U9WxP5E4Xd&M&8yNf^M^6)+%=I96x^3SN;Az$ppXRv!gLmR0u?E}I
> zL*RJVEtJE3IL+H$ymO_;>J07cb;yvlV}9&BUDPgDy<ifKGJ_DiDaz%g7KpjLQj=@I
> zp|=zp-ZZC|i=Cl8f5JSXhflYH`7L^#5SQPY&Q1j2|AJ4iT`r{hG1J`hWXsR~R{ba;
> zPWXdMr~OplP0+Ib+OH}qaKkOMrw(sjUK>bfI_*~t1D$OPnO-mGaL&e7JDlNsIqdky
> zV#UiUwWz0ex@;8sS)LTI&*nfYaKHU&#_JFHdS%C7|E{ww9;Ye=vhR%1>7nN<Efprb
> zV^kudobmm#jn}`6{W(VZE~M*@)W<;EH7L(YC!6#)AsYK?8o`H|x$*kLsL{c4EYuik
> z at g2l@AL(K4>TKJ4eX9q#J_#A0sMTpo+$_q3?}8SZld`+V272JF($L=L{j^@a!P&O;
> zZKP~$#%y_S4carbcQc<|g+l3~*=}KZ&QQ}>wAUO at KlYOLB<yn{mwP9(yz-OvtEqi)
> z$HaOWUbRE(;ZSCG at Ytlaby`<a`KQjdzn*nBYRz`0?=``T_xkEI3_F;0dUnW)`be-D
> zU{_AZ9zwVo;cM|VP4L=Kudp^#XEW7l#jB9kO_(P>P^X0j;LzR@@hG5sNV2)|^mB!T
> z6<X}5Y5#(FO`m|bnCk)Bo84;=so%G4KOjc&@9UID;xDQ#$~9i$W0S7SUU~gHG at 9<c
> z74gy6w!et@^nFe|>d)r%rls9|{ow;iXvf3Owz%3z>ku`aT=!i$ja2_2#Ci|0Hp{73
> z$f?6B0`CWeqa_?led4)D>S>~mdh7NwF^Ye05u0(&_$$9oI4&GeQWXAR8`T%}JMpsv
> zeW{M at WvI70TRgqq49;0S;YnXSH27E5m9wkMkNO8gS3~{}On6d&{yu<K-}5JbtW?`J
> z?5a~Ok331W?7#dkedOB5$q8QjaqzbSqXxQ?es$$o^@a9q_eaaVkK@}9<9BG!qmZn}
> z+H)~R!<M|WZBMb_3#3!cu{S+7sisl)sbOB8_`sq5m~YR(t4NlvG#hwX at cE2F6wW|6
> z(6Xh-MXw2EHdCvH+I!DJ_!aS-mDy&4FUhX}e$$+7O at EnC%%;lmV<n#5GnwM>d`<Kx
> z$#{t(P8QZ_(buGPLugNys!Ugd($4B;C8yNmCSHlvA4Y at oyZt>pSITL0V^5Wzbk}N8
> zLl)F))BAFoJz6!wl|0QP)Wv?3g<i`I1sA|=Y~Qcn$cz&<kNh&yjst903%p<7c-H>`
> zt^IsGSi1HraYA;V^SyHuD;A4KT~@&)E_?C6UVQt-gD<{iNf%7J-*>jXzS^=_*SFp4
> z<1=L}&B8da1tHp86l?A7M+4yB(r0LFd836(`4XJ_Y)EeL<YYax?jzA>_vwZld;3Ih
> z&*0pR>5H*0V!p0;6)vg#3(?`alPn8=zON;k)<jsFd<ChevElX4mH?ef_J55Me#Ku#
> zfEaDUYeoXSX4IwWjV8M|PKHwOrqYcouf(}L3)%M(OX#fG(i{2ioJO<-h6Q at pHJ=8r
> zT!W2uXgCEL4X`s!>!hxm^i^3l>|9`1WOLKT#;$ma!qm8t-pqXcTY{DVa<(}h#Xbt@
> zGjR+Q-z%%{aa&A%k6&>Dchs~=u&Lh9n}ggOMc!<FtJ`9QpRH%a&*$$Raa;WsZw}%e
> z#Y;<J9IxLPaTnL(tP)PJTd}H5b}X@&j#zOHw5UD`Ili(K`_MF3Ylx~JWKVz{qIeq{
> zpl^usUR#Q>q4rw(;$^~XF`hr`%|J{`ZH6}k`!6QxTgJaQiEy;akZr_OWS!sx2Hq1D
> zeEcR7QP(y^;day6*Kb8FPB>zX`0E;?Fv`*H2F^Y&E5aAL1Jah)UgtM^uci0EC<pXz
> znDkwOFXpOdy+tdaBv+!;`XsmshFdGSV;@GzOmu56$rAgp9zSu+Ov`%gyCB45(d#W5
> z?6)Ak1~<+$1WCA(8 at 0ZK`|AX}O3H*>ys3)P^zr@<<<ivtjyPl6)kjkGI(lmjw;=GP
> z8gZFxGty84&;=RY*!#k&B#PpcLK?xQGmov|v8gWh|HGS&Ttb_M+Rdg`iPQ>eAN6$i
> z5sWY_#$j0iEnq6<-kxiaQcQi6I7n_Y18Nm^9|C30z#VTRZZYb~j5x(OPmzL=(JKxT
> zoLCL)LipY=4EHB)woBGI=|4mX|KdFRr?FVuNEmYv<0-jSVu>@o4%CjV*5P&JTG~yu
> z4(R>lQyIh!4Os0jy^qfC%Q)SgZKGjlX6g6<-ja~;foCRs)GVh%dVkPC8}ZW{#39xO
> zoL^sBOmqSUSjTbT&VAsHV$mkvCiX|pJ_R(Z-iUhA%cV~TM%>aZ;3lK&lfiw;RX)SH
> z&m$_I5!`3F%I9kC^Qg+_8t!wK%I8|{gR`cQw623spQT$VzY#whPN0nBXHQ`F1lrD@
> zyd$aYYe!zd6-Lf2co!hdHN2Ln2Wx6`Ad~vwr5|(C<M736Ht-GM^;oQ`aEmvKZtmL6
> z4WsHum8Mu&!zi?c9_LFmr76(&<14$h<gT~blhL22L#qLu)WoecD at Tnj#Yq=NE7ptM
> ziZ8j4zHze8Xx$U%!0UtI7fin~H9bT=f0KPAsC`*D9B+dm+}@M!%{Dz0IorUcsnP1_
> z$yi_#m#2M}7D9hZnid;4!8rMKV|o)tbi4wZ(6}0|1f)Qk2)uNhZ{j{oCrDv-6R5-A
> z4*&Yz;2upw??%0Au`!+8jUx3>N(Cnck=~KiMrfts at 2T(Y+Gw;<FK+0K)+?k_S7H2L
> z#<?JV_(aDAX*6j>k|LTWPxyQZr2zV>_<~s}e<SfR@><_pqK^|izp at _0uYw~RdN=8V
> z%bIu%(7je+zDs9J7f>5VQuk<rf8OJ%&ljSITN+>)Z)qXb2lAL7{4-#bNH9}evI_cJ
> z=dVfYFo)kDCVAdi-l*jxV|jg+V+qbwq3&=dNAG$Ptw{B#v|=>w2Bxa(m$xF1e{mi2
> zcE1P%l1Dm)b5V;3gCu_BxiL4E|JruwSWb-fD5v<9T+-fB3sK92Tj^J{5Y?ZQ<8WV1
> z--DNF(1T_)t%fVoNBO(M<YPe(;$c$%q!AJ^wT|w{&y1$>CM`+$CbURkQn)>&aZ+jx
> z7c<(V9)(_OCHW0aabM!Q#_hyCE*)DUj1lIG{lGuT at ZBN%-Y at ne|087al~Hfkchzim
> zBtWXjJ^U7ou$s-1Z at AwpK9DYQyu3&}Ne1vZz at ++>-2&y1`a57jO5Z5U9KB9c4&8TL
> z9 at B(yss=U}lK|=aGsv@}@>_K_R<6ew8i%+ZnF{WzXawq|L=h$LM=v8mzkoXpBuyKV
> zC+dt0GwD&{pou#DS&UXLXW+Jh*~W~Kuz*K<FE;}2i+SR9z%()+1l%3)3eheO0=xt;
> zPAHxi#nBvI3fKsEo0!Y-0WS&yehl~+4K+r<KLLIe_ycA5JHU^~;V}q54tT3XUqkR0
> zfVaru8o(a`u9m|IJ_LBP9DW<%zX0AOhZFo7;Eh?gR<($!r)l@;3;5OV&QSS$37_Y7
> z4;KfV)&%0<-UW;*P#h3Q0<;~_2C=`81KhU&R|8%vrbOU%fY+eBG}?y{z7p_i at J%@W
> zgMceeQOa*YLmOChH{eyEo+8Iz1b8LQB1OFTf_XbL+k_m~NC7&V(HYp&A}y{JzGMCI
> z_#YJs>o13Ofv*!Yk5Sp#86$zy19V*kr(Fv;u&5WOJ>VkRxVIFcJ+32d`;RKx<Hc0b
> zmVLwd?M`Mt3EDRjoOTW1z^&hK+Nl at Pw)?R=mw?l0l<x at _&^{oCQNC{!2Z(miUIE%P
> z(>o{(<g{0S_G`aD`)O6aFQom5D&IGX{dvAc(1xCaEkT{wk#7;S*K^waFUt45D%z7S
> z$oI`E+El-zk?(DwjWse`N-$_|1MNAScE5{gkG}-%8#>TV6>~xRG0 at K7v;l+mW1vlU
> z<BG&ooSdW`ytTw7sKp%8{M#>QfZUmyo}!g_Ph&v*-f|s0idd5o2l^llUT5WX{3yb4
> z3Q$dBR9l1w=U<|6OF$gR+vpLA#;AXA8t_A&9zpm&#eN-V{53*D%11Qfd at Sc<D`-q{
> zvQck>MvR<~tq5-s`*)!6M@}Q1mvV>Hmo!ADp4t#~vqh$}lhcvfbqi`_l}yD>H8QH|
> zf}Ai=*eK_u8Wg4?jsOafO}s{`5xzW9BNC0W2o0%5h{o-5E;h?F3ONla7n>1Y5~&f1
> z#>5B>sYZy#Bsm|OKqC+N$N~+l7<fK5A$(+{MkE?TA~ckI43+b-QKr$0(~$D95j6U6
> zZn0j-iKC2i54-|+Gdps5?m0Q^a)iywx`CvoXsax7vfO`RRR+FdUkIhnz|G%N7(o<X
> z^9g*8WB0U(&I$uFBEfPG%k-ehF;Dj=h>&`U49jg+r8Xmy+8m^YmgcE_$x~~TQ~Q#q
> zhBejAFLo#!dH}UN at V3f5DH-V$^0J}+<ghhz7*52Piy(POs#O8!!9W~A;O8n(#(r?5
> z917iAWL%PH`EofF$^|OQ1v2FgpgcK{Bval1%G0uLT~-8JC1o^Ls%jydEkn=6?N at N{
> z94a^R1&yqEHYlWv13A1#h6jTl^?=nfY^9M2aD@!_q}~E}l?+>iL4pJDN*OkVM>3Rl
> zE%HS7`QJjEF at V<q)&UNI4 at u&zb_V|Nb9f{JTmkqDk3Udw0A2<7UlgCx0K5|L->6-{
> zaU<y5g4q$S`<!=p4M}oq7Wfu*|LyyT0qLCcnhYNXjFBLxL5AN042 at vUZhXn|Ea4mi
> zTm!hmKTPb0uad%JavNN!qP`QcA68L+0&tiTQGXKfGJKy>QNIW9E*X9o;kOY#P)gwK
> z^hkN;Ddo`=%CX-;tk-}sU54KV{Aa)uW%w<?KEMuqn`OU)fU^PbM|sea5~t=|qoO`c
> zMg23x9;BlFIpAa!^&@~W{+qv0QKu2&OBrrKcvSlnXfu~IJNN^&KSuQWBD5by^gmGh
> zt46bhKXW)T0xdjKKN3>LfW4j)XJFwsaAQ2-*ceY1el5#t0}nmILn9-_LO;iimT?au
> z6k`C##Tc;gFJU>)asSLiWyy}vKXF_p<JKV*Qk&yKYA>vnaiQ at 9M5BTRC8iMy@_6AR
> z9dN4<3Q5axA!!$`>43YOhel-RLezyM^*H4_6{%NWL{e|z&0#sk!{;e-3gM7b3ulvT
> z;b}p(EX*T$z#+(kg_xmm+HWDB=!*+Shi8?5(H9rqfVx-p#f8^MIb{?deR1K?`jHWQ
> z^u>h(c>EMjAANBl_7&JcQGzj}TG$P+Y8JFG4tu&*>>iZhJYml*l`{2NByksnC@;1V
> zdg6y!fX{M0n;SiSj^A|LaKZ$Cg2q&Tj?fcWA6dnNx!9K#-^lH%*F5H_e8YwvyDfrn
> zjI_7=<GH1XD4ewGfirm(cqf&+urVK}4$+^W6R8wOGcS|%!l}n)bCHsR_!p&q7-_u>
> zc#I6M1N<!Du`>J+VB&6?4^#X~z>iY;2Rfv$7sKg8!`UHy!`I>TwZ+g;8NI8?+8N%L
> z(A2J8?%5MpnxY8>SM7OdZ=7QoR$eL4^K2)ZqKyxs25jOWk5zO8Vv*|dbz0ZFP$<8Q
> zY4YbX&4J+)=dcngnZB5P%-2c|(PkS_Y(`wCZG;UoGpSV7AHxSBR`TKH;y%}fOI6*9
> z at N~yui;+`HWO3SbO#?=bhmk_DoWe&^3c?sUg`P?ZXfaA5K}kXOF-j=_LJIRk7o<?{
> zFNAiM?qGM<m+8*R^c}VlM^S?LCu}2patQ<n(VzdNZG=}Yf$Z~<Oy5y`4&m>~^y&5o
> zN)YvfKaJBa*8SMAcINL<@(%koMEfNr at 3K#=x_0L8yny!UJdH<QH{)ywY^^7^Hpbb~
> z*J&fG=lEbUTF}>ilRUHbNIJy0x+Y^*zYuP#EDz<S=t9sntjx*{^=~pdV4Te{EW})R
> zMbL$iyj)$#ma`!@I6XMOY2`j+)|61Hqc`HrMI6h+A=}jM<)Qe{uzf4{MImfJDdOi%
> zSssGVD!>ExMG<71yg4`2o&0#LL7{k#2e^J4VhvWX8VJ6kew!MrVH=NiWf-er+dd6q
> zU8P{{^C0&_Ue)m2W+1n_gFE(k_Tp}CXlSs|HaEIFcu$k3{qNYL8-yM4z<gNhr=AqR
> zI$(aU)^hGP!kq*wisT;!cYLczZnOa8-TbK56*2 at p_<XK2X<g~~*kUrg&a8Tep#5RB
> z{%@?<pkq0B?Zl*?E@*yS<!G_!x%S)^xLv<eh{a`1tn5o)6>S3MLje=qe}c|pio=T+
> z3UE4Z>72l2+`12?o6cI1Hc~6yg*cNPJ3@@_K)~vTE|e7=8m#ZCyG6878wL|_w)_ at o
> zQl{gq`5k%iDMcLadq-BUP(RQ*%DIoIJxJ7WD;+5UV;V4SaqWu5`8BlD07EYJHng}I
> z3148+$;1fF4xvOBvwBcX$NgF<pObk$@29dvC at +3EM3jTsHf9uMs#mJ1MnZ at p=G>g3
> zPo_ASC`PE=+M#5(BK}n}rNtdW79#}nUQP)kDz8J`#gsafho}uvQ?u=o>cX~}>3M5-
> zlQ!yz^1yIS-t@`EG$W-UdPA`XG##z9m|84!$hNp#Oj-;Y(V;;i!%d_?XTS|NHAozC
> zMhkacz(`znMhEw^fhg|Q!~GOW at hOMEu{S+VW#SNc_NM9|%t_$CZs5Zt;y`d;H*n#P
> zQAyyzBye34xQ=$Cpgki^T5<c|FOmn1Tpo14Kpyn?kK{qmOUQ%ERDG1>L9b5b!R6te
> zEz5)63Ko|KeL9r~eZyF?JV;isxID0SDi2aRlLt5T#Oun`@2PgX$g+XzHddAmkOwyz
> zW!ZpUdlOU3hIwsj*)Z=k=~Mq(vf(a8Hq3hwXLu+lNM#;gmb*YU41ndY4zgk17UIE+
> zWJ7Oo-6EB2SR`}yogMngo#4^#YS}QajHq>x4U0OJ4U2%;M at _RsUn06aI?9H5qj)~m
> zvSE?yLfJr6`>Lr%dJ|FX*-<vkgZ at t?8*b}RvfB_pS*CPXhmgAva#=^&Fc)_JFQn9=
> zJVcEo8c9M<ty9 at RlzW9`!`!zorWq*>(MyqK!(AO@!(EUKmrJstewi~cw^o)7kP~yC
> zkYxkp#N2JNY=E4YTOBZQSpYdPcfDFp%w4UP6LZUd13BU2aw7TyIT7<8$%)uY$cZ>r
> z-z7N_->IBP2={ndPFNHyE+-N at l@ndUShAexs$g+Bk<_W2=+>E>n5$Rh#GIfaC+3_}
> z<iwoQikz79jap93`MX+9%=zNKEhkiSh&hjmm_bN#Vh*hST_7jOLSP3uF$Y$+JCPF>
> z$cZwQoG6pI{O%5Y=5Fw7v|3Kgft{2K<V0Dga-s~FiE5f1`W4ZQ=_n`W4CDD!%Zaj!
> z<OEUeqNW<@Swu0mqnwySrxKJo#O)nQc01yCl_}lRA><x}#C4PtC0|`ksY7{)T9TSt
> zr*eWQ$A{%a3C;g5$X%o~M6a7HC+_JWC+>lqNKoWN$tFckl&n+aL`j7rCrZi{IZ<-I
> zT27SQrIr&Vi~a|4LQ9s&Y3~iDl635aQ<{lgX+;jZG=Y*oP~X4~6voq%dDJ(sGiMiX
> z2J}1969kMj3o04Gcal7GdK}P at Q#cRAbpRefwEiFNJo{32ISxYL+e@|6wH)xZq_NmN
> zLM%b-m4NXsBiH1vr2Vm)&)}nxeO85iiqFYfjy0s^C_W{JuZe`8kbTxhe7;2Pv4)`8
> zTJa}T)3BJL^JmC(R&qM;Dk%#NO1T)XYV*7xW!YzMhm`A;l;!Z}l$2$kCt!d5CVI<o
> z=~7P)+4$59tjA8LroT9-z9<0cU;M{bPd(-_w8ANVk!l_On9&qJL$wY!TA=tzl1Ol4
> zMpOJa$)kGc0NFEus__;sh4g at XeJiwyJme)nt6M81x{v|G0T&RrA?EFH&!9S}FA{M|
> zsdzHD4H~xqRvE?ET|?XUpi!)NH0gQ+dhQ+>(36fzyaoQhqm()J9{>$c>)!V>M;UAe
> zEMBz$A<qh9a`E0!K%*^TSBQgbBYK+ai)fu(+$V1Y8yV0-!sP<$ZX1zl1_XT&pak4v
> zM_Rlc%=II&-+UG6)&f0_r1CuXM4Xh?)mVM$>Wj``jbHSW+!8MlPSN+Yf6HEy^l?Sp
> zCee$Z+UwY~`Y)y2LMALiywB2%eLoWh=30i}oMh(46`Fv?cJ)@XIEZps^p2FfysHK5
> zR2IESxr0{Z>PAZMH6 at 2djbsUmav11AXK(^NNopg`;Y>qM6InKxb^v98AN7%<o${&y
> zyjS#?+~Y9=DB3Ldc<?~c!*Y*DyBE>;kNO2RTE3_pX^<N&Uqt=?B at SVpS#%ez2rk80
> zMHLEX6_qQTRdm0?Sw(j%oK;k&=B%QH3TG9~RdZHRen-wKN|!n7F68P;g|muM70xQ^
> zt8i9PPldCJy2zXb$x?(9$qHu`8U9nwDr{AAR^drCXB8e(+O6>O&N-{_2Q_CE9#nHy
> z;eIt|749W#SG!-hn6nCZUy8E|cc?k5aI2cL3OA^7xVCf7Dtxjt&MLf9;jF?%3TG8A
> zP&lh_j>1`m`D)H8oThMA;UqO at 6^{LPoK-km;jF at G3TG8gQaG#7sc=@|C^cslW+|Li
> zc&(bV3Ws&%tU{g4S&N;4g7XSz6`Ykgi~4 at SDTT8N{-tnM!QW-hf|M$dr2r%tK_4re
> z^>8st{);lJ;B_@;73@=UR>2>Yb}M+XbIvL_pysTCZEDUc*sSKPf_21MF9;WNR)ObI
> zoK<j#nzIUSR&!RtJXH=0JLjx|yF25of-wqb733(KRq%U-vkI<JIICconzIT9E1Xq;
> zT`@&w6<q%BIIAE{;jDte3TGAcQ#h-jx58Nk-PN2`kf3l at fmzL21$gUMJsReJBy-lC
> z&OrWQg|qVC0ymWeqG(jge?#G{{MQuD%5PL;RzB(fA+06O%70GbthMtl#aa2)YR<}k
> zSj}1a6-vA1mv_!t`H!kOEB`h%XXP(Yb5?!{an|!wFXpWLyi0Lb{%AF4<!7roEB`uG
> z4l_FEtbAu at oR!~8;jH{5g|qVG70${xDV&wBRdd$tpB2uU{iB+*W`FnZI4d9a+Qaj#
> z**`0sHTy?}vu1y<aMtXTYR;N{OyR8ApQ|}*w!b51&3;DaESx8w{iMQKvmcjb)&lr%
> zQ8;V%28FX`uT^B$>=kOxn*E^6S=}+unt3VCn!QlXS+nP;IcxT8rQK#v>zuP at ->T-U
> z*|}=Yn*Dn<XU)EvIP1BA7jxF^L6_pJ**(>qH9JwwS+k>6In;N~S+je0##!!f70z=1
> zL*Xp<R|;pjKT|l%?N at V_`;fv}?iMv?xtsqTXSqLAILm!V;VgHH!ddS93TL_ZsX5F2
> zM}@Q8FRD4qUE7hf-1p0zb%!(HzFXlecbUvtnBltrpm3IZp2At~LWQ&3#6J<4<({l?
> z)^eI5{NiZn&Qf!h`x-T8xzm((a}VyEv)nc{XSutnIm;cd<}7y<an>_!7jxFEz@<2A
> z*1y!8HS23NXU#gI<Z#wsJLjxf-*?7YvwR9?&Dx`I)~tGkvu5p9IBOQ||3zl-vvw++
> zHR~}oXU*CK&SEs5574eMc8_PR<>h{WAnrdOejZwD;0%nkvfe~1BEG+cGgY&;2tGh|
> z#K+lzS?g`Ar?>^HMviX_V0JWX4yTw`c*ev|>Rofo*p^pt7Y(-s$gZeG at 3HEc$Ck^A
> zO|YtIdoP}N0k>UnuZ~u6v<Hg2InN9I{3G*p!p}HKlW<WCSXYi(fEa0b7vkbj;OpxU
> zn(SVp>ok<rBh(`L+)MP9&S=Lr3jH#R4I1o$>Rq^iR&USiIx<w6G7|fr4XO3>?85-T
> zC%BzpkL`dCDZwT~RZE4LF_!AT++C(6Oa6-AAy^YxqEX;`{bsyWvBZG;LK2pyzkYzm
> z=16W;on{tO at wyaFlA$$GuQMC;-B_G*gCfbm;@*Q*Aj at Al?I?%E^;g*8VE$gH6@$aF
> z{;z%m@&*6H at LwbN<B_8%N1_GLTEQQM)J+o3T4tLE`$BXhg_UcQip#ZnCYWK at J~fxk
> zjKN+q+2}UbYY6hUEiZ30!-X3hXtONm*;;4<h(D0S)z#u#dV>4`i5hQbGqp4JmKo>i
> z62Xd?E)h4WYIAW5;6A!bg759}_f}{-_2l+m$8Y3ZM>le6hkCE$H*&56A2HB2w&?Z6
> zo;7|Q{x{j?W|^wqLv9|Rb6cQ3`uG8%_=IlVTz_=_8CD9{9KRv|jOG!zN~%9TKJTPf
> zEEfB742o~2+&uj=?RmSbMynSVAaJ8+a`=rqIx~;BpVH|>5hto=oRWGW=`v>gOX`Kt
> zcwoga<7<(2d`+}x2cJ6leCEx--6tdQdu;~p*yT_;a4RiGax;P4oYSm&z4DqKa)6ig
> zcn+4pZEC=~LV{Jswc_-CEOzN^WJwX{+XeaphDAmG)i+j>rQ)ZnIAoQ5Esd4odrP22
> zyL>noFBG>+C;Lsj4(|01&t+Mr+Trw_X|5g4eHU>Ez5%>t^7MS^Y<@|e!=hmUJLw}(
> zLk7qN)(V@~;gj{+&vE|w+Oz at Zf1rAGjA&&pn{h&Ysx4!!)-fa@#LtdQ4;D3~BF>MF
> zbX_Zjt<gG$wM*wpcvwA!{)Af~$<<F&Zv%7|@ls%6GbI at oHh19uLqlr&in at b=VO$SY
> z=4|V^C_L+$VI$o;G)>TQ%(z}2C!yn*akV^7LdP*9O&TZB!lM8Uij0)#b2F^1D>2U|
> z>GlAi%UW0AK9|lLM{Qin(s5hC%4%`r09G&O76YQ&lcrcbesE(C)f7wZP;-cU#DVa$
> zhQq-fWNE_^hT#S$L~w274wt9L7f8QMOcTcfYq+zm$48NM1x~6=e-_%&l7NBM57VC_
> zZUkOBD+ctqG-3m4280v8Y?K_j5AZtp<2*9MJ|f43MIW3i=q2I>R&R#bA34(C1>MqG
> zI)jbUPrsXZp=LoKRw$-AfzPezx6|k at 7H)gHq!MUE2a79%Rj{qNbAkCJ at w#RuYRD>;
> z7H1&f2G63Vm~<--_W|i$u`+XmQ3 at lRNIcXExs{tDNOO99@)7Kdk>3*Bo5cMS?!Gg8
> zlLY={+>N*e6c^t@`I|4}R#o+^9=1Ivzf~A{QX8;1U^x)?5PkrqDp)DJIOIpPIo)*|
> z+o<EWcb3x^w}kk&3|~r1mSMB$Ti?5S(Dt0;*^o5}GWDN`dLHatSDDly{M0}NQa>Ar
> zrFxy#3|cc}TGJ?9s^j0X4*%1-qdcT_Lk~_l$AGiWmSQ~S=o=;7AdIKeADVRt|IuNM
> zIx2_vb0nWj=64F^aFivV=up`^t at Cp{<f1yKa-&Y#Q0JNTus?ghncw~6_0kx{+h7%a
> z(FXjBHh_K8j&0DW=WT!%j<i95Qj4^KI^^eo1?jcpcRm2ihUbI$g-CYcrngnJkv*&=
> zxCnwo7Q$}GCX33Ao68i(6bpa2(W50dZaYWZR+SsL5r5E(xNYQ?qzy@$+PE`jk^+HY
> z&bDqJ at sX6D3dws;o*hEho3~4z9YWWew?m#CLf4yzn+w$Qq0 at yN%)|Ll>hqGeH*YQV
> zZVo{f=85eq+KpV2uazWut7oDv>iGXbNxrh~?Z7a8PYIH|+iGbS1v#5d(wqB3O6TQ~
> z{Fe5L at +Ok}hMUSZmZUe_RF+&?<-m>8h<RDG%Hi0M>Ur0+R^a}TEY<VUT30Jlo$ieP
> zdx`$!-#eA)!zCGqHiYz+<YC0kC3?7ANu)^#OLSO)NcvVPCnPc?`qXAB4NiXbhkGxz
> zBk<B$DWH0iz68U)n_8QPK)O$TT54ksL%L7hA+<7xw*uZGmhzVF4 at -i9sp}<Ke at a8L
> z9y!(2W}xp(BWrjh<)6Ik-%E5wBL7;+gp{XK%IKNu`+)zEbSFHLFfxAU66Uv&>V>jI
> z{%=ZmS&p4WEiJCb9NI=B-(uvMOEO9JOLBk8o74u9to-f9OQ}}>{W$p>$@-bUM%IVx
> z$j<8sIbTO|o<^B)eaSqc8ugcSI_j(23OH34jl~_ufygK=x7N>;6MI+2sx@>vQr%v{
> z97tUB%*o$HX8!X5{e$;R%=_W~N at +(mNB_Du1<mQaRMIRBuZ_rcp(_7>*2<uC$q_lI
> zryA>Q78Ep4{e)X-Y`B%E*Z%4j34*R_WWJz9f at G0nvAvtrB2urRcESEE<oo2oVg68R
> z{@2y^|Fmw?x&`%@o-LscFFjkjWDg3OI&T|^Z-ZuDOSlyt=3B)6-`0nM(U)wo7 at n6N
> zN?yWkMEwUVX{?@I6C!;G`~0raN*{8K47a4bD(QD2zyG at S1$Ew={-^B>{7d$s^X;9t
> z6U{EweQ3gO+K0{uFV!OFL)0R88*M#t$Ax`p(#mlAglitLf3sDaRL}pJe8P&N{nC91
> zb@*%g5Upi8k#BMz(#W;s{Xf!&w3lkJpia(9T{th{Hd6Y~MEU$TW{BuR6Q5N2(8R~X
> zE&2au9|~d~-B~+j8-k>P;o}gv*%z)GiN}6}ktqI>ZIU3j$>Gj=(T#r#w@|q5|L^sp
> zVC<!P5o+<*^deZd?5uU<UX&=;(ot3G{O=oyx^!qU)v7+&RbIg_cEDbJwKF&a>+{9`
> zw^#I71(>m-r at N<oMIWcyNu01>UeRMcJ7FKK45YJI6B^{zJy!G+>g3fubeR+A{-3nE
> z$GU&QlhV2mI5 at F2VH;ob5e1wmo3OckC2UE}hfTh2- at gAt`L^iwWUV$m&G7BvAD6?r
> zcFKBs=OqK7?^S3jH9Qor*nE2^5;g*1??%F|#vTFP<yp${t~mlLqBv*BPjzY at lUAt{
> zmdUGg%IUq*>Ku8(&eMcD<n=j~^A>4+PV4pwrL7f&OY^!3#k7BiH7sLT(@vPxx<-be
> zkDM^2b*-$!hn5oXK>7aWJ~{(80p}lACc|PD*|>-${V1)OCnS+>0Q;45{L#`H8-CH`
> z1APF|&`Wg;S^B;+F#f!>+NQmY at n<ES3qr8VKE4%PWrD>odI?Nus^ni=Q>Bz9Nn509
> zz#XmrejWZXSI at d(X~`*Ft5&of=`Rl0QsM3q!Yl1d=i!#A5utHQZ$j-IrM5;{ao=?O
> z-*T<`m|Tk~rtr+qt8A8vE)@HuZaQ`*2xI&0)#Lm}<oIsHe;Zb7 at Tvga3Fr8)Q;L{v
> ztQT#q+EY5Ddepw7m1Vz{F)w>}hP^H}v$!`biBTPe^DE#cGwgmEDZfNHyhk|xUfR)n
> z>}F~=?vM4(c-$ZkpP7VzhdsjaE1*Fl?aC(6j+hV99$~d653fo$>v3yLUk%+0sF!3K
> z9w(g^cwzilo&w$mN3K`kOr-|-r8F}lX)Z*pYdY*pz7pA&d>LWmDNVjF`3fMr$IElD
> zj?w|#(`MW%=fQ?IDZ}~5G^CqR_hRK&xPx0})Q=5??h3ao^mn{v at kPtZ8aMR4ai`^e
> z2)-SM``=QX(8<Yhf0uhMxOm)`at}o>9QTRbi_r(ieE^JoRQ at y3fN*18*1pA%tp?^6
> z2jN~iG&JM>3}}{!*Y$9VcRk=gwf_S<XhLQ&jAy&nv)n0LHJK$AmOC{`lR0_4snX*f
> zJM9eiVTxB+JwDG)PdUA==~*b8gf-4{FRv2te!KJB^WO_cb9Fsa;qxGTV&HQ;b5&2~
> zDTd|Rb1&ZsKfICp{O8!W(^)Cj&G3Q!>*qhHZ1z}j%Jefw(v at B(8`4$q!D?z0T=9s3
> z6rT49J_-X(Hbn2S;$}2LuL{ZdFG;ap{6|9^tjw~j&H$#Ac5!;=Ui_>f7FLFfk>?Z-
> z?73#Y8qDYUzKY|st3DI1MC|pT?Qo2Mb!VIN+zWVp at TDKCS*BsD$uvUH94kJlTT|@U
> zKKlCCH=Wd3aFLFmi~Rz0ZQM%ZAlSE*Y=)*Z48rJqJ9P9>*oh!3hW%i<vCmSxsKK>K
> zi|88(>(9e(mHfnkG6qg9!-^x$3p)eOlYz28Z?q})5}kiTZ^C<z*?ofh(6428C{g7u
> zJ<{(`3Z2@{jtlO?>ju+YR`#qbL%7!&3R!4B7`TntLAf`3Xs{lBJ;{$?*kRZW>(?*9
> z?-uNVDz+R4z?S3Cr8lcm<!(7u$^8qd;#G`L(66Mb=`W=kJR+s4>90yPLy{MiwtP=`
> zy7bB?YH%RW!yi<6;BGk&lKU6(AmII&;6^16ELG0KV{*w;l{^H$?@;nVJk^D&RJof{
> zCBIN9>V at q1=0);3m}4wZVQ{ycPsx3$e2(lSpJO`7=VKl6c?C~(zA9Dj?vT&<zrYuV
> zP&;~6s)yv-iIr15q^g}_e*UJ1h~2-jc;%X;JMwWQMx$uh_BV+~@p>;bkc}1oXnmPr
> z!uV~iYJE>%|5a71|9m7qUO>^rMr!QJ28=l99eMufh~HJR-&Ds|Sfx#=H_N?ZNCU~!
> zvLjYsPn5OqjUQ&G-S|V+4I6i*jShX2Ha+>6GxT$FB=%6m?z42R-0NKOcar>_$iKV{
> zlpiVwl|d>2>8u+oU?td>)_urv$ZS2{<Q;h83P-Cse&*S=Etx$;W^3KYjwBfSWoM at +
> z!Okppi<gtd;B<d)6*S!6O$A-;k5 at qp{81{%1sk>W%7T?rtG7DRyLd}2t3Xlwu)&I#
> z4wD7x?8ds_js}|-Z-xENTbdFTnwg at VQ|kd->|;TM!7Vx_wI;xp<4D+5(AA21D~opJ
> zCg6k#TLzzmB*5h7a4{cFod`2iOak{yhu^TEPO`dS&#<xJ4#i(1?Wk|hP02UO6q+6B
> z3z$qb3VzL?+ALAjGZ~JtrNBmQ%Ia$X$LP~pjC~ke7Tk`vQ7FwAV8l2^SXpk$OrlEg
> zc-nop^*46|Jf7fSP4Gq8J%fj(tfsIT2%F_dkFi!2+EUiO0iRj$aoa~SDk<uP^@pFE
> z{3yNtlq0vkjJZ)p=>))Qjxy#A{#lMCl)}ycuoeRr5KqXpo-hSpb68Ae!H2n at m93B|
> zj|02{lvfaCyq8Cig{{DP#~Li<YXBbV=;2~K$5x(W^7G3SrU1uJFj1IJ6#SsD-iDWr
> zZCwrBu!>kuFxfOnvT^qYSSAe0JA)e#wgGO~DP|i$WrIB#mNKT#wA3-~V`0?@h1Fv`
> z5{n<krB>O!C5V at Io}^e?5VA!cvHFMMT+3lIcU##OM_-(xfNh1~bcfZ8a}aWzSjT0l
> zRW6HI1sJ=JEDkSvTIg+>gQ at U|LvCa%uesdLGJGs-KX6t9XEkE%2mE>moY&#Al`Kpm
> zbZfg8TIlT;{@Q5-@?h<UR}quHYQ at Xy5$n2%+~Tf4J2Vl$F7O+=bQx}M;U%z$Z&&X7
> z;03-(-1mVCe7kX~_Y>82Zmj~nDr^gK9dT=|2%q$57g;O;*AxI=;egTi;JVrsUhoO`
> z?N>`}KAHL at T6i+Kb1g?ra;S&=yel2)Q7+CU{mk8JS9(|SUc7Rr13e`anm%*NtLz!a
> zP6ytG4dHcm_cIQ?ODEW-fKR4$>y`vJ!J&zvqKKR0grP8=1he-PO!l7M#om)JWw(qe
> zK?)|px(WqTS3$6xrsNK%$sq-kVzMa;CYwUAoTlUk=BF$Pz7!&3-X+1has^XYjx@{V
> zG$pr;DTOGQ1he-QO!hv(a+;DmoF<19Op2*n!!dJFw>I4xJY&2j6d(LYQaarDImXnn
> z;72nvkYm{guk?oSQukdF%-k~kN>VzcO}cKm0_&DT{(Y#x>_ddFRbbs(?*Ur|+I4tb
> zx7q_c$2iiBF3R;YV|I=qK6rtVOU~`MXT~6}9;K8z55aQ%NN$dUcIQwSPlDND1(O{{
> z{T!C-M{>)UQiy^{ux_=2sas93oTlUsr^z7&lVY;j3MQLPu$-pk2IgDD2ON?yhf1(c
> zR4{cS(iG)1CAW+zg(#Q=Grxif2 at 6<GQ*wvX<dA|%F?E$3Q{n?WL#L~h`JfW5R!LHO
> z9Hh3cQjec3(}!|69d?MU=GNe$;9tQ5C1~>!rHu*Jt&qZWE6A;c5zIc4 at jfEA62<`Q
> z9zq!8i0&bz`H*8|b9kJ4Me<`aT^W$p+aXnE>TPUhc$^D$#|XlG$lh;h?)@wb;|BWC
> znYmi40<&b<Ju7(JVH?bd^D(aC7u at bh*Vwomqj7dtY0CYu+vK8=ONK!!MJp&UONLxb
> zlHo!cMGVp?QV4lph>>R*#;B_x^9%7lG at XO7>g*k5EXrl)zUgM0EHmfGexoH>3urWA
> zjFv-FWY{4|T%7}9uudP5xa9~Zzx8UF3%~W`C*!O~+pkw-FZv7jk-5Vy!&?=;(rpFC
> zR+%FuH~8vR at Uj%5!lY2I3e!ulj48Rpm>g1J5?rgotR+~+l-yxV4yiB+u2NxE5iDa$
> zZeWrG)^SM2gaqdBqbkftf%&M6DY?U#98zHt{Dcbg34&!z$sNYzkP4IFXE~<S^PWY|
> zdsgmw&!P`J+d%?zAGw#11SWW+(ra`Z0Y9dK9|QcP3Vsssb1L{bz#GCc81yzEHygro
> z7&XFSNfw78Iq&0S_z_j99|86wa;YUZO8o-WG>24}1n*Q~?j%^ol-yxV4yiB+eny4)
> z48by{<PKwUNQDXb{}+j at +pI`r-Db4$W>uRL{J1QUA1AjejNn~z*e-Ib!U%prmdGza
> ze!OsjL?%C1SR(6O;A59sB1=AsM3!JhB8Op;$lN_yk;uBqNPDs(kpWwElNE^^hQks$
> z42LB$hmR-{S$9Nl(H&7FvhIky4kej9R*}g#MSYl$Kx4Uodh%ge?#_k`B|oPmm3bT|
> zhts3e<v3jthy2FbZ^P>od`7GrM{uqppC3dV@~d;)S0}BUFeipz9m-pW)s;(b3l5Kt
> zdi7}Vr<oa$v<Rgba_hJ`?9w&zelc}3&5|3 at FB;J=W<=a~%QBjW$o+z(dm||MxC|Ka
> zP&ZKW5$w1Rt6 at H(OK>Dz9;!;0;1-nxX(3p~l-%JQb4Z0r at XIR9mkE|JB{wknypuyR
> zCP}@QQMNs*vhE>RF0155S-FJgkX%-h at OzNPepOlb6D+4Gxx;C4NR=kRZ>e(o7Qw)z
> z`N>;o!M7aOVW!+LGsR7_B<>^6lJ1h>S7exGFRuV&uL|A^_;nThI^efe at Y{f2Qgi{j
> zmr&xD99BMGrWWRK2&LxImP0DZM{tu$W;PKl*O%lDV{%A^NpLgAltw2g`gP4%qxV1`
> zmE70P%pHpPl?0XMLJyJ4#>wzOTP`#kIU8tYaS)gXWlYH(#^jI+6ENg-1QYXPz!IkH
> z1}5gB at TCwLbEpJk<{ZJqeAtGWvy at xOEn`X{3MRprIY%%t9|kO^DY?UGa!A3Xn3y?7
> zFfl*oGiP2yk~^FxhZIc2bm{)+u$f!Y67$i9e<WD0`&VT6RXOZcguSW?Blt}@>`ij3
> z!U%pBVbG)K-bHTSbrfOdEVaxlvfmWfl!rs1G(b~eeRGOq5;R26n1zlf0V1E$#qCUS
> zFF!hSak*82g=E=1HT0mPY%mKgLw=_s-Kn88hf8DQX-`GkQ)%`+GZ(XFxFwj+zy$?{
> zjD|vq!!F&Ixwg+uM8m*1jW2=oCGx%uajrrfg7>Lvdmq7a3rp^BZF5Lf+xw8aZyXcw
> z(gu~YG<V7mCgk}Wl=T}&(YX+>kMB?_?o)NfwxsVo8TvMqotulh5H{VnNbTEDDe$<f
> zYNKszmwB at P8$4GT;PrIf8;}ie1Pe)v2Db(7yJuRk)`N>6SqC+gVB8k6W@*nR!v0E+
> znTuDB-Qn at Y+D2@(W$GT~yLx2v_l6R|=>LIYl5Tcgzv{8a2LdPdgbAa3x0xx1A(<sc
> zE$qw|1Db2FKXtpirx7=A{d#v#GhPCBSgi@!xE1J+%hdJNxLL?-8`0ZFduE*aa3N|(
> za|>Q8ZHM*<``1w-+5H(U+F?5ydrnC`@G5!~)+<*w>tL}u0lT!R^kxXwGM=WVng+^R
> zV2?je71E*#X~BwTAmL*bmFkGx$iw*oFW0f9;x*O5pd1gqdy(6siN<Ov)dsy_)!<yb
> z9_Pm!XTY--GxD<~8oD8!r=b5$mMo!4TEN;IFTES3m%k?Z=30K>U(yUp at aJafdsGhp
> z8sDZqGc8`$^f-Ne_&O|lykAs4q&62Woy)RnZ0%^S5z`_ck2`D(T54e=Xhx%4k8?kl
> z3%c+SUhY{*ddA05&c_|exOGLkMCi_3r0K=XiaqYK7KMTz<z{?s!YY$|wqt}D32ll2
> z at OB9Xos8ue;UyR&46R6cSn#9Z_p*BjdReiI8x6l5z}-=rLAc0+3<nS8W*nxJcxWVD
> zg1jnRuLMVMIUK>2AZWqoQ7ODA+fIy2BeBx$0(hqcFT=_>4&$B#2iKAGgFBtUa;{F&
> zqkrVE)k~{u at _)iU8V^KDWj7*+PmrIK{|d at Khvl+!x5HKjJru7Cf}eDZo*BkZLVT=i
> z7}hydh7E+zVc=7JNp1<3+)v5r65dl1On4g!kHf)3q+68Sxt5R3xR?4g%Jvk>x(j7b
> zK-rCecgb)o;9><%KwTK9E_irwdak8~^t>EWG|b$`!fJ?@;I085!Hs-a-X|U+*n}|B
> zcbni&%C&q$RFaTpv-Fyo-MT^2E;J*&S(Yiw5vTdc_7>`I{GJW`1^Ce|n<3y?qBjII
> z;$ag|x>YpYkrFz}`(Zr2lem at D<{)l7US6a0;*V^{UQxeJs8I~koX6K&kp{g~WohV`
> zij<;uEYrM<_iNLB4Go at a&_hbN_k$8hv at M|hC%i8BYxB3-jTeDIE1Tyr9rx)nP;2;t
> zJK}RQP)>Z|9s++2+(QngImTL;emKj_&1g3#;fv5ia_Av_x`udDn}lzDF<j~B;g*JC
> zq6R3Is7>t8{=(m-w2?%jdY@^jVAxqb0!i54kqPRFLMFWzn1nCNdkAHx);ok(8X;|H
> zuLIP>b#LW$9}j;zL1V&Q?Vj2p|2Y-lq)QawiltV4>t3o0C5JPSL*#CqyQeNeRd$oQ
> z?06r(r at mWfp(sDqTcl?EneLv3%R7syu0vq)I+W`(*53!?+ExEuEKt#3swLjKV!IhH
> ze8))TMfrJ)P<j0W$nRhbA6YuIlfUO%ythbkm0kmEi$9?wB_$NCLpR&vvGZ!wGXZaA
> zGHnvR)W-~i2n+2 at EgJ5z|4|>4ctPqDaO?ep+$Q67zXdgvCeqvFybn>y2=vAZ=D*Hu
> ziu&FEG&Q6^dv?4(Q{Gi>s;LgCQU4&nBim)|De4M$>Cta4t}l`gpeIQ?ReynPc)3rZ
> z$Ey02)Q=jh;nGnW?Yh?TQ_D|_XI7weCU1`L2KEYL&^ys9a<PKPtCjS{jDp at _b=jg>
> zeJZSLBv7rvssSu&Q|TH~fz97p1%&+k at ++&L5{o=NEbk)XwO019^j0f-m`*33 at i+sS
> zWZffjZ$5LHbZVK-=VeY3nS4t=9ne_1CtY#<AtOJX=MYQ%-P{YbQ3T<pz%8&{us|1u
> zvs}{Iy(sqrJuLRnTUqqlXyz5-0;I$3UjXU{e${*9z^%B+hh4 at wty*E=5t6x`oY<pN
> zW~+jcyx?qKrZ&wGdJX4WU>9;}Nt!YFE9__<<LCB}$5pWOxO7FU?v(zt;Yk1X<?Sqc
> z(N%UjtMvC7NxEe?f4?l)E(r8?f|mNs>j`?RV5#1GJhx%g3A5fM#2==<WT`eZ=mZ1y
> zQSobMIJ>6FHcm<vt=aLDk}~`2S*BHQs!VbBwEXOBOYGi)m$yv=+65lYI)?ktWE(<z
> zk8DS- at y}Sh^?T5(Ve5>?drmy9t;UH6%gnQtpJzsSG`7|(HjZWCKIu5NguTU%v4662
> ztd}OqkYuRTRqM9v$dzQMmA^@bM!1ZInhYnqu3(~8yBPU2gbvhX;Q!6BOnWmAnSzi~
> z9`Y9+@&;bg#rUMnuNi(^i#*Ik?AHP3iB at r(knB9?U2IQi|7Vv3fuVF2n8R!NOkM|<
> z9zO$om*b0fq!Sn88-?$9d`)PLukketBgJ at e94PjwxxHpM-j8ofybtfkw<X^0WKkR7
> zpS%q at j+*7y^Y0y~y>H-~#PhhnCZl>(wRWO`=|#K=Z%+u}<x<#5#p~``o%5WrOz`2~
> zBOJy5ZD|It&&}#!$3(E$***8zm+^dSw%r++Qm5&%3?(>sc!@9)S7+m$ZFj^7$$0n2
> zsv+MBdqPD8%BXR5WvO;6dp;7sSQrU-H(}g<T7_|&J>ii at WQ;={Fvh4bK2c#zw<kRN
> ztc0QY92mKgG}1VRou}bbVccL(*t=K8*wz7~n+oG;6-KH(;hlFR3~gCpTsVdI&ZE>5
> zIQ{ji*m3rRBS+-e6{^_BBeCyQV!!v3J>k3W<k((S?DrzE=cr<TDJD~mQ~a8A at PWQ2
> z1OJAa;rKV!jKF^s(`lCAYr^+le9idYhi^2#OYx1t_kMh1 at qGZ_ID8+(Hy&RB-voR;
> z_*(ES$2SpQ;>0faiuiWLcLlyl_^!ma8@{XX?T#<;aSwb~<J%M8HTYhJ?^=9&;aiFC
> z<@hecw>NQc;6}_)_Mr#0SrXuSGs_tI0^dEn54|RZQU76$)WZSS6K~<wnPmHI?f-P1
> z+kTi%8Nz3p3q7dIZN!W34d<;mgW9F+4XN&!8~!;s4VQR9T;u{iQrz9DxL481xeMYN
> zRdKhf;&#J(SG!%wQu^03!3y{Vz(#VTx1*fM$udwwzD29^+ at W^Da3qcK@*K17-#X82
> zYa<F_Y`~{3qELvk=6B4~p?#`6O;qx9=<TdNu%b)#ViE3D>gLc>V!VWb99`>=efp(C
> zI77E)u(K^@m)}6rCT6eS0GXf-Xsg+`j4Y$n*f4^|)@XeC?C#cHep|ND+AAAxGW&0E
> z_cUeI<Yag6^>Ixu{y(W1h5t`$?D+qzW;FgkuW{i2NX;1hf5EUW!uQLXoUC4Fdjq4}
> zcY`Z+VoLUn-(_YOd^dR8JJlZxImhOljDA|koMSdW?a7=|VXDljUhn^@azORiN-f5M
> z at 14w8VQ1~tsK?Mfr}#Vc%xkPltWLlvV)NwiQKuO1n~oZE5^tKE%G($f+EisrvDl`h
> zENidOZt;jL+c>mXWKMSV;(yp}cM4rk{2n7j;>@$<?U_&4GTV<?I5Ve at PU?H?_=!aS
> z&|}9>UX_2wbG<(ru7UYy%J1+S;7Z9qv;4UeeMJrEOv;K|n^CFBN?1#;sDFUhYD_IL
> zqREZ{&~7cswPieo(JSsjf0V7{DSg&$^JC}59$k@!T#!v5%!su5$t;rNEw`%kE832y
> zZh59!lRa=~@ri4td at g@VIorqc=|esTAM;V}G?Y&t<xWfa^quUTe at 6G*iOaJ3ta+z0
> zB`bN&JJ3jdU`w}|4n|WBO~~Q=`-7<0xHP{p_<hz$p1WN<cS03e8q(@*!lV{Gy%^)y
> zZ5~v$C2Pc>V^S@?k-WWkwdR;`@^Wy|yHo>f-sLrr;WM?w;<R=+g{8rNI9cp at dc8aN
> z4>^rD=>(NL54|}ndD&S#V`jYe^b;SWj?%2a$woYv71MozsA(54zZrgHyY$~~_oN8N
> z()tehue3!yx1RCj7H?&_bMfdC8}Tq~m3 at L0aH5k%zftWwT52oKx_nB8kWo>Z)o0_e
> z>W{PHHlFZzL+C4*)qGv;19$5yU*Gcb1u_4|W1h6JSld&cF2e*<JxN`2+U}uOWtR at U
> zDie05vUG!9J!U<rTc at ec0o6}3nL(3>_jzqht8a*+cgvBF!CPQyp>C8jbaw-^a(%XD
> zWOW_%YBf8iIjP%ju4c#+ at H`rNk;rB#*Ajj(p&<&dzxB<tuqZ7gc`0L2!33mkLQjqc
> zrOo*5%B~rD6++G0WWhu)|2CN0-#`zr3SS8tp`WlHaUN^wA{1xssCqj)e*ECfu9Ym)
> z5^Jg~acAm(&MqCFj(RqZ&!899`<z2glc>IjpF)cpeKbSMf%PfDZy*<}E<xZ6Iqd?U
> zU*Xoo+MC=avomYx+PTN=C$fQ~Pcu$BD)Hw^d*+}DW;@0EQTM^udsk0knoK$g8thSP
> z7B&9M$wzy8#7FDzLO!}@B0f65nSAueB0dZjWGv`mH&NP^8n;Prq`Awy*kiEtC57PZ
> zo!)y*Dbq&PUL)$!%kRf|-oZ!6R#akI_o4Tr9uumI at DBS1vZ3W{i at t~Qjq>exm~r-x
> z=~ttS``d-=_ at PTgYi(}rs9L)PYZm-cx<Hd-x3ER{b_t}4PJ9yqXVtE#T?KbniCepF
> zf&_)MkGTOS)W6_;<W9WR7(etW#0@#my&WP;T7nPxx+43*iQWmtwj`S6gIAt#hVFX7
> zZ^+bbWpF)9ZPT|+G-M^Lyuu%icDcMokD2<pZ(k&;2%-M~dc!nenA*KrajPDH&ZZA$
> z(#?5^Oy7*V1>fVgKt`y=QZpR#`U!t*_4fVIuqAfxd%U=qai&FIGXnlkQs1JU*p53!
> z=4lvpqF^86T<@rsxU_CwANVlJZK*TlGE0mf|4A`^%v4drpW8j{B_69hJB-51VA1w6
> z^J;$#Tqd|~@f-2~I%bz;<{ByudsXyh?`BVBzsAI^4_2GS97=0q6+=!hKim>WDbY;^
> zKki{%-qK=_V9B<(@nri~?Ha)+r)E54LS9S!(TAe&Ek;VrJQpc3^PF)0FMqnlOceft
> znQ_dw?H>Gp-D!?@Msh6j9Dl}h{2I^kKAz)k$npIb<@lZpa(r9I92<C!CG9-r33;1F
> z^?Ld27K>a8p1<mAeJ1eAD8Ipq+)gxv at Y<r;9VvyqrH`r=5~}<9^cZnMAv=|=y1OqP
> zZ4nCH;E%43mqV`OA$mVv=`@dy(6Rmkof#eIxKwn;spvSubb7V_0-b3c=uB+)MDjB>
> zOb4}(`(4g+Y%;Ab*c2)kI7{y;W|r;0J8r-%Z#H&5_(;5_A~Q<B>2+zXW=ype-p8`L
> zYomzkwFbD1`0B-I{6_;a`)~NAP*Ll at 3TsBf1rMrl4TLM|{Jkj*Kg at dIBhiiJVFrKv
> zFNVSDpfw(`%xR!vfz=j#&G=U1Yr=O6zESvY#n*`MBlsHdeH348C}|#R_g1lXNdKi<
> z$+A_ukT$W`muZ+KWoO^`RP}h|CGE!g%pAd#nW!<7v@`yU*A=bV6MKEUvj51qP<!?w
> zX2~3`XIm?UR-q;ZuM<{(mRt75;#`*iEBn9eUt!7|zS>-w;~s4Mxw0R$aQ{j(-l(b0
> zotVVpF|I7j?hXhta^hB>A=e_t5KOZ at XPdd$rxT<6(X{TzD~~$S;MX5F!+sQOC6a|O
> z++x6w<k<gW?_1!atkVC_JM%IO_Ysir$_v7X#$^~#M;*qOVVoF4oDj{OEKn|Li^2+;
> zn&~_8f at Gwqgk@%<nM>Z*T63wa9nB0|Gq;*<D=k`U2yNk|A|vMiJ?{*P?$-YH_xt>R
> z|4;wVqR%|fxj*MQ=RD`~p39FK__jEeR3G>)Uys at IK8-6x3g>r`O$xSFx_k`7t))85
> z_V;OaY1Yg4>0;!BNb^pl1`RwQhjsT*$>%(dv4I1l!3gr|Zu at U}^ePdex;M{YfW}B7
> zVr at q4oI07v>3EjB!Rj(trAw~M5Tz9Y#dlampdpVaH3WVPIb at sRKC%)k2;_BE7b8-?
> zF`m@~ANcLTc!H)#N3sX~P`A}+LtArXjE%M>+HZr-i@}^n<Qin?cSAvkUCWZ_u!GQ7
> zCx;|KpS1*56T?#&z3%@i9y+3}y4J9YIPt;-N4Y+ at P9(J%C_|#lAWBae)~Rigk>9xf
> zrklsAx|l2C<*G|-YMqeY6PM++ir(-m_=v5ExFoBU>lD>~boE1l^L0wX6J^Asj85L=
> zXA at Mzc~+_HvRmBW73l_Ys^|S1vKvoY!wJi)gmI$6$O{$ry<%X-aaO5|-7&y^-1t6j
> z3E^BPl1dVXUw9+u3c0ZUxX5lfXe@|iteaQ65z{0iE5u?X5z3>Nr#Xh*7_VIzwVQOB
> zs9+yfy-yfwWDiw5|5i2Wsxq9OdgwC+TJH0r!tkoQ$9RZT7}>N~!*-GeT|bLg#gkgU
> zOZKic)tuq0sqe>36GCmZ^2vtask?Mstm>dYuZbnm1B6iB?zjQ98!uO1S$kE4JO*6F
> z>QXIh<l|#&=JUqv#)gK*yRP`w+I4rt`Nbp)VO)j~I&hMJ$-t%R%Lt+DzRdbiv&_iF
> z$6oT`nd}Hd(w(MSM#seAj3s2KiC>Cz59!9nVU)S~S=YqzVY^hixLvB+jk*JI11?w7
> zl$G!IOF4 at -W=Sb`F-V#Bq^!%_r5c#rFXdN|GBsaMIV+-;xg^t(XRoJwNv<;>)u_$S
> zJ{oPSmrhx(w79<&y%Og=690B3%v9Rc9QG)4*J%=1cL66dt=Clg0QG9LlVR>If!A?@
> zRG<8R>}f}fb at xKM&~}`ph<pMgy5b&T9n&jX86wbi7+QCFW%qRvu3ce at a-TC2md@`&
> z8s%sS1?a&Q<cR&~k9W0%ib3e5w_Sr)B~M+u4Zn1>od*0ga0alWTCfMACTz1geSCDE
> zYUtY08C+^v;vjWL>yPT#=LhHprVP-<JwISeSKU#5UL<B|?pO9{KJ#t&x3YwZ!F at uy
> z+Zew*fw*1Y+Rj*6dl2Ff$h4=%Z{g0 at w);~3P-oZq4)AkzTTc+i)}r`RPn$;<T^vnw
> z`{VD{`-t2Y<c&B`o~)(&%{)4i$NH$^XfQ2vSCANZl7-fo<&xt!%{YQoPzq<Uf>TU5
> zlf}~WSm1089nbdg7WX%QM9=iS?{PaP;xtv%x%29a5ilR#_PkMEyQGnC^l$TP4|qJJ
> zQ3hMQIuUj5$r?jR)TcepE%mN;I*UUbPoZD?UUAeJ2R~2P$P9nr$372f$6B86#?J#T
> zQu6|*{2Gf9R0wF%#Zt|wcoMMNi8T=4RT#74c01n{z#12|Sz=Spz}lbhRHyP9<DyjQ
> z=Rxh=E*~)vbfJrKS(qC}0^7KD73lHKApF{D6%wb at Z=rMQ<cOJrtpzw5>E7=QHVjWp
> zObSj+wsP)oFiKj3nO`DYlU#vt84ee2TOI6|!hSgHqYzpHt_CEjqs|%BQJ>Pa;kt}m
> zmHV&8Fl9v}&E>Ej0n(j;UJZK~P<Qs=9tIU|HCEN`tL4xNKJu8>&XP<YdQ3H}Wct8k
> z5)Voym&a5!TQa at xF|AQbruRH1;gDo{7p8%;R2vE;)1N)2^?{P<jK@^hEScW%m>wyT
> zOs74jbt=j9w#QU^L^7T7nAXmhOn>s2YQk$V&)xhM<{~q(rvoi><g4Bh-9-4f4Ywo~
> zA&+0+9%sB^Oj!860P{uQc8{H`0QBEHG($jt?zK+<{h2r1DbVLZN6aE2UxGg8rF%fP
> zdFgJ~cu$IA`;8RkweWFEiawvi&YL1Dg7&89a}cyQMb-+Mrbu6BE(c9hq_hB<rby|P
> z7z2dD{8!wLHw(FYAM|lAeH`>zk3SiuKc>56Ae|!~J4F`kuxk at HODe27dVb1->6k-t
> zv~Of@`R<3wbt<f6fA>SWCoQaFg}A>oC<cEF{5kMnfIk6l1wI4(S5J(X#V}~i1R*iQ
> z!Y}UayfMNw4EyowwzO+jOZOWw)-dKQQa7ZSbkTO)@-Ubaq!AYEw at LOzH`^!SUIC2R
> zmI3p?%Yi2WuK+dxKM0%-yb at Rs{7 at 3^8~|Pgyd8Ko at KeA7@HSvO at RPu6fVToy0Y3pO
> z0zVF14ZH=o2DlM;E%0N&wZIL)4+C!oUI)Ah_z~cZz;(cn06z-64tPEA!@wJWYk}*5
> z*8*<@t^wWzTn)S#SOjjs*z~_OmNiW6HCYQ~<&a%^ZvxKdhU-EZW^foL{R8YwXc!5=
> zC>C-Cb(>8Yctx6he|K#vEv0KY{Y&YoN<+|(SLxS+-AxCC-OnAc at 7{A@&F;N*yAD*<
> zu^)fyExDu=lfOn_bSZsfV{geNr4-$4kG1Ay^j3(zo{?&9^pHicUk-a77`irP67Yk-
> z2H=&z>A(*G>w#C%8zg{N18)ZwfS&@k18)Of1N<a#74TMI5%>w<YT(C#Yk;=^uLW)d
> zrnlTa2K+E^1MoWF&A^WUZvw6Z-U$3C at FT$Mf!6_V0Dc&_9=H~GBk)?_O~5t4n}Mr=
> z8-PXN$LJgexRK6MfVTkCZvq(g%IG%&j1*)F;H|(uz)u3>8;?|qC{L**hxLa0k3cEL
> zFn+QTD8*<y#kc7=yEG^9lqAN|K3~!E>%%PHv#((F?X1(s;_j}p5ZPIayQdPPIjk at H
> z&w%T1E$;8nSlrh#&}V#Vh)B#AG1jqk{{{Vy&rB&K=2L^)u@>b|Pj>GnG^XB8x*jcJ
> zg$#S*5IgnPA{U)_zrBE5wS2d15xC|tivDidf^`baC$3_K{N1ykw{(j~(f^#CO$5xC
> zU;OI{I&=Q++4rP$q+933=mY5ce{2V5=vmp{V=dCVmW*#<m%#f at Xr^CTzGo(5taj1z
> zy$n63%qoSK;}rKFs0JH;7Jlxf^NGag08N(e3oP#Nh+6v)y*1u}d- at sDG|&)%bvE2g
> zQ76N_6h at 3*oFcJT*^3MjQLkIvrD(zKH=Qg_h`-^A at M=P(g^Wsf2IAM?^26^qtP_w?
> zI#F!#ammFskVuuS2`>XQ;_GZl)cGU at l@4e{Vl41^_;K3Rf^S}g;LcMMcitEQ<NU62
> zgi#m}2BR0O;o at e94B@Cf#xuVcaGyk2K#NLbcvWQJ_J?^A8`vxBy}Q>;=kUE|UbQRu
> zz%qn7O2<2w;;^Qr#b`AG>z`QHmF$MxY<G=?zK2$Zrv6O&ZG+zT1%D?+Km4{(%^me8
> zx>m;xLk<Xbb@(ENtNI}!Pl+tnV^pL|qOot13(*IJJT2iNAv<VofcY5{k^cz1O;p3*
> zc2EwH#qUm&3O(zPkX at n@re{Gl0Y3*@E9l)~w*K~z--6l$+r4xgjPc5gkUZ|4p7$|o
> z7lTd0q~5PF1nH^39o|;quuDUZIz-pMyteTu=Zi@`Pbbj3Ah05d at tn&?3M~_5;E;wS
> zA`yAy@=bm6+P at go+<4rvtl%bKR0LaYB3i=9Z5VM!y#?L$r&>sI8@{D*L$SkhSf45C
> z)HMzxw}_~>;qNr!IrTr2Rkc~a*CVUySV>M#hV1;W$VzllX^H3bWotY1tJj_s{q-Sh
> z-?|nHDf|iM7I625I01Z~fRDFLswe`N4}f{Z{xMw7RL?aWj{38RwU?-O4NIfmgTD`}
> zs|+Wi-ba0O!RCW%UqemQcaRR&ETg(TJ$=;o=(WdUh4X}AI6eHwDRFyvou%9Pg<&Zt
> zH|*wELnG&-|8+>K7zGahinyFe=cwT at H-OG*xUg$z8(g^I1UJx7!rew|9Ty2|FklFL
> z*8?^JHUTyR8UT+WUbGYr{BQxZwsL_;EeIik0mA`N01glhhyjcM!~)^~YCtkT14sdA
> z0jYpA#4#FhyHpDj(Egwegs5xKg7x=%TfUEpFc!>;2s0Vq4o#Ns0U0f0&;sR~d at b&;
> z>&PU5!IuQm_;uqaBw3K<F#^ZeKknD~yT-Cc(m17YlaqeYcjgrc+?IpAQ77c4GMIit
> zxGml84R6X#tKClbhtO(t&&K!69dvI2Gv$kzb~*II=RL=I<RW*CKPUr7(U$JlH-Zmc
> z-};}br)3b;1z33;2>YoAjdV>@b*Uv7wn`_~v1uC?<ybAEtMXJMz1~x0$cZF8F8tb2
> z?9Takf*1{*5vU(lBkMIEP3=M79N%n at 5k504;`Giitc){_JpGbX!{|2q`avhlSdN77
> zc;}*V#=eZEqdi9t;+q>2-shA0qP}nS`P|Vi>MyMayDJU%frDIu-?0!JXm8 at +b}t7;
> z`v~E4iHG36m}#suUEMRje*2C-$9PgEAKvO7T2C078uf?c^*_)Qp$)t7Rju2Nd1g;p
> zk8muE$9_<r7vv2a`CR268U`6<wH5esCaab82CZir*iF!tViZDV(EO2IkjsG<ADRd9
> zZV&X*x&+8gID~j#dENO9b=5C~T_F(&USBZ43>>uM61y2|V9`$5HBJ>qLZt97yov8b
> zts|v)myr=9#1^l5m)>$^>Hg!hu2V(91=UG2;}2xZoB{fK5vNQL2=T;;ovE_c?KJf_
> zLU~PtK%#}fY>p40yih+XMhN`Krzm(%v9QziHPxh8Q7DN&z*p8Qw;ZhIPlQRF|6Zlk
> zk!>=aY9H#=EAO`89hh|qcJsppq*w at aeU%h}+`uNg!0Df)jz94D9V$);G&IH^aQX9&
> zc!9)`K#!g3F%pPx27a||WI8y>bFxT#GTITT%PhfNB9`v;6X^F0gMx8 at 8(zdd%cQ08
> z&4P1F_d5x8gXOy`my>+Hn&tE{EM**qC11 at -0>04Rew!hf`CL~&96OwTbFX1Ib6iKZ
> zV-1vX95Ta%)v7iAb?D_8#~;)^P7$-Vd4c-X^8$*3clpp8SmK*c#w0~Bj`h*l>mP3b
> z)gER at LX3AQWFH0NOK3jgKd$2x{=mC*M1ecTubiiI7AdAEPfXaugcPvasuW}NQAi=g
> zWAD68A0+(7=Ih2cI`oMSOZUqdX}tVLCswd&cp9qDFJ03>TfqJ|qw0O{uKBaTR?b)D
> z$VKR>O}U3+fM*<zfrJ>5Q{nrB_co)`bPjMKDCe?Vi<S5=d=ppo?V4&0d5g(W<S1H5
> zj^cj8OEk+2hG{$Tq(^t<H(_ii!xtk4yPxEETS%tx(*B_R=(kqv+TCwMqlP=Na!S1T
> zLhsd}FTEI5-N0~v>X!I?JaNd{5eMs~&r9*C<aC$SS-`2E2y+_#y!^;oXc*VPTYUD#
> z_!3;b+{*B6Sf<2|SIVu`hL40u;W^Mx-V(Mi<|pC5FP_I}DxRFmf;>5uVRsAj<1JzP
> z(s~H~`*QezCtWHf+1=i-zXE*+v~6CW77iYtBbUvU^l;P#^lvhM>@c%=%B#wGqr3*=
> z5W;qr$hNazk^^!|e;_l!u7v7JC1g*e*LC_{*<lXH(A|`@43VN1-$s=Ve5I3Kc)?00
> z^DCOZr90?ai-M-T3F9~!zH2e}_3;(-_kJ!4)Ff}Mk_9HIAz4n!l>#9Oy)n5w{u{B@
> zD1Axs!^ofBa-_s7Oa!Y7OgJzk_oWSA)PdV?@J&yOc<M}-68nPI{3N%}w9s$qcqJn;
> z0IATv^#;F>-Q<QZ*eC~#<dD+u!7=OMnAzWt<CVDGaib)8iD&p+_me4?^pggalO#Xd
> zUk3f^rgX7xdp+F;kgl&c-QV;}m;Xme`AnnIptm#8U90qFCNGUWt1>FJyZ(VQDd$Lk
> zP(RLSdEAgl;7y!SiLhRYjJ{EZOzaKL0<U;NY?4c*i2aE&rRxRn?tE4M^6K{Ul-G at N
> zqh`vx7t{JTo$7+7=@fTUJVP?ipcv*EDCrCTkSlM!3_Q>;S2xwmz#adPt3G}A#~bBL
> zUh0>t+M9FL=R!*_aK%5C1rtEI>R)TIdsit7 at 1Otv`R-p*RAR{2{C~)ox3mI{{qjXi
> z>v}y39CK5?XgyM(1<gR7d~ET|U42}GXYOb66M9R2=-p at kv;3eP%R_JE-BZT5maR0}
> zRUW((T>G#0x!~76*`vW~#s1%ZBMT}kbNnku>*-FUXqE_tCB&Dw68oFz9NQIpvyF_n
> zhTLo;Cs;A)7so7u?;w6R+u#%sQs}W`-;;{$F%z6CBeDeSp^HAunFlBcsL|LxK0rh2
> zMmHHvp`@TG6XRU2E~d$3R*m55Mm0?~hcb at 3lqRz|bcCaBeA6A~(By);80>>rnnN{Q
> z9lgiO&m2xT#5E4Izd2k*X?inNfH at p-X+Z^=!{Z#1-yn0ihPrdG4K|1K1$EJ&Ld at Y-
> zu5KhKl{vhex at UqOU=9}@l6$B*+`-kUVHai&-^odK;pRxf)uqF3pg9tp(0C%uk>v$a
> zJhz!6hzjvk!Zy+z!BIK^^dNJDhSE6uNCulDcuLbe3^7OGt-Vp8hMFS^RCVJ)4KqiS
> ztLoxG4L3(PRdu65MVTYsu1A=cL38FXxvDM>R5V5&*hTc<a@@Td^x!h-_W|70=Q&aF
> zI=vx{-U24QH$?B=N-<-=(sv_QeGp<uk!-E3%6sl91+#<{bCmaGCY<4Fr>CLdOTOA1
> zAL6EZ1gAGwBUG68-L-je55qJ+4DU5bC;xCNmEL4V?W%frn<qPobc(DBF;|&+A17`E
> z_$^L}QF9n>MexITb2UzqX<-+J)84a88D at Id9KCDnAkLA_VmT&j7V2y`Fx>Cy=XMXw
> zt2}P<RUTRfe|<FJ`_WuKn(ar+JTxhgZb|5pPJ|U8e+8xl-0bB!n*lS!A at 4Z%#c*)D
> z+am|uOs8V*z<CQf?C${WgnxS0!3jSTdrzBGe;~c@;QY at -YBp;gAn;4$d<`;#9pmRc
> zPkItzaN3jc>z&yPd4jewez*s45<N+Y6U{i4C)ov;<l_8ku5c3OVE74k&!i`)y|l+4
> zwGZp(FN~VK{yenDAEhJv`HQ4xuRjm%@ki<5{rnB5=H3Ie44L65o8jO&A3P5S|B4dT
> zACbSBT`=QJ4-?=qSEs=o0JEx}Sq1aJe&&JRU8rWWTA*@T4LK>B%noyjY6JRaku;eh
> z#Yp;6pZC0JB+PpF?1s<zkf@%T8>aFD*cZK~NUR>>OsjOhM)FP1uXx at 3>DULfzcqst
> z94azLIX&kB at 1x^=dX9yb@!?n+r%`pp6N)3_O;K{`{=Gx=OwM??A|B~JJAcrV!3{l!
> zM$hw1hIzL4jIa*o*{JW4H_kztqj9d2-n19#s4)$4BTjn$h340&Iz at 4fIjYBdD<96^
> zz($&nuq+|fo0N@&w)|_MSSuYQ(yx(`bUiTfHWMKl;0QW%OB at IY$BNvAMr!iMj>*r~
> zVGmDY7^w3S6$<K{L=6DdCQ&L-f8B}{5GG_Bb|EJQTcth6i9vOkA14M%djbQlso{e4
> zoJ6G<guSIzNcjx#8WRa3z;;u}8HxqWtO6odQ@(&#VV#lM;+0qp#Vaub42XCTumZ3g
> zunh13U at 2e;pt48E-~_oDU3<nTm8{`tgC&D$^UJ{bqlTv&LZ-<`;yuJYuJ^aoLW$uX
> z6{wL$hAf!H2 at KB(gFojlVx?e%-8##?=HcpTzGU3&ZsKl_vqlqP_9Y at byn(-q^V?Fo
> z^|6MHn=HI?wzBs&o at 8MS;h6IAO~y;a_mK^Jv_8=FXT%*Lgu1R~$MB&?Rrf@?*=!jf
> zWcKYQu6E~D?3?X^-{0{Bex2r!9^(3IZX{vwDj?VXw_K~hWia7^d^8&bj#+3nne{Fr
> z<jVx&dgZZ<H{y708~RWzW^#gzH#(HB2ir96aBE7Hz{{*kK2+n^dpD0W&As`p+l`^b
> zck9Qzkqvw-+V%Bu)`W0418?;uy~)@qkD9TGBqb%6&#5e&pIlhBaADb^<cj4L`I1Gx
> z$0C1W;gY06LgM2q=T!VUzjAqbF=t5UG^04Rn(Jq$=cZ=N%FmoOJwGpF`knbXGp3Fj
> zh4l(DJuf5k&dE6_RvegLR+*}u{(z~nuri4&UcA`<7CUNAOuXAX{a4euisDi(Gj{@~
> zS(c*HjMZqyrzLO|m2)bWRP?vjret!ZWo6~mX>ny at qCdGFng)&2=$0jLGv}1{8T|jd
> z at fR;DqOlWVyrYl3zBq45;D(>6nKQh+{u4ejr{&~Wa?H6I-1NNM4C_xucEjIXWW8|l
> zPkFrIudJkmD=J$!XTc(l2AMx+(Y)yBXpd}f__{^DDXF at DCf}4Xnp@<1Qw%@BOk(0q
> zzWNu~ze?x2oXvN0Ma6TM%;Tm{v)(9OLT<A6`evXj7$O7EU;2;Q$Rt~q;Lw%yPmW(S
> zDY*Fn`v8Xz#C8Ed5g-p>0>lE+0FLv7Gyx6*lvlCv22cUQ0g-^A01glfhzBG9G=MZ#
> zfrFC at bTJB&%_vYCFs%m20CE5e at B!dY!2gYe)Yc0mzQzt%1E>OsfNDSuU at f2)@Gw9i
> zS?lZo%+c3X0YpGGpa!rOfYZ_I9tO~e?SM6aDu4*62Gju70%`#d1J(f^0n`B=1*`{b
> z03f^_;q3 at -M|eBJ+Y#Q5 at OFf^BfK5q?Fes2css(|5#EmQc7(SxOO_Jmfn|hQzJf3h
> zt|ZJus|bTrR19Kdszkz6*AQlHEnyyBN0>+I2=nNA!fe2z?#4}o+1x;w#~KN<<#ED1
> zu at x&o+ps>hoiI;32(x1+VV>DVm}hqr=C at 5)1l~iKz5B4fb$~FxJBR}>Dsmej5-=1n
> z41iLD{8f-Y4p;$LfDb?c at C7IVegJ<!03Z+$1PBI%00sa;0bzh}z(4>7?qm>PFklE^
> zI3Nl@(~1_sg)x$R_vsMw>UYD*#NuV;`Lr?SFD@=#RJnLL7avzNibIQxjz$17v9vrr
> z4oa%RgBDaursAa%T0kw~Cugd~tNhZT)Ru7wceg1ozOszV89xd-&qHUGRaC-6NLFU{
> zom?Sp_{ALjEGpv)OMeZA4689YBg-hMg~|mBi_4Z&Qt!l?ValIu$;qPziz$05hmK%D
> zWtpU(`}|8*#gY}7Q&?DBQNiVAOr=`f<8NYiE;PkFuCQzoLY7K=#^*^$;%TClYU-bH
> z_k^dykpfX(ykTy(OQ(OCODZbM7A{y(T*R4-cW^T at a`U)s#BMB}w_uUvLkj=1ekU&~
> z^7@?k&-|HYOtt=3<Gk+oMx6S|voa at J^DNVH3>>mT^e970C2;6LG+vxS at q(gsxGyLw
> zEvEipu2>8U;Kjd at a49uXb9td;E?zoE!W9qDkO^Elwog#^a;?`N?V~9PJ6icFC3<2p
> zwVn`HalNW7MA><&-aT<e_a at RGxb>qK{8Ji&?W?o at q_R@6->CBwxciqZEayrVmn{S<
> zg~jES3(6MxlZoES{@>@|C(<Y^tH_^IQBl0uQ?LCe-m|!vw!H<5=5cv*7SAiL<Z at 9%
> z$`;*A3d<H37g6TsE-5J~UJR*oB}+<6<7xXE<!zh(6Z6U{=aiyOd;QWzBh}6X&f_w5
> z^3>$aTuzFp0 at YD+B>oexhd>X7{7#%RZyvX3$wDrjiz`at3YRQi3|&A?X!-DhV(_PO
> z{kcEtenW_yRGM5|1r_+jiTBVB7sIA|Z}2LOh`6LA8cwR;|JDzUmQ1{B#^f23ISf;#
> zT{m<1n{Kg9<~Zx*j5|3lb4G5i#6w)6=igl%@<@I4{UZO=$gNCF<fi9la-3;;9>-0!
> zm_TLZWpG at cW$I*4{MY^Ug{2k}EvY?_9)JH<RwU0<yx?OoO24AAc(Eil9Eq3?3DR-m
> zGEcl2T+xDJXwC)Y9N3#PcTw5mg(!avcO@?q<0}g17Z>F(SX5G$4 at KoMc{H|%mV};8
> z*_;@U_IuqYrGLs_ at q$H_*F8!G&p6jx(Qb_x`Os%fpFTM^Pf{!i++wO0NOZ0--#jBb
> z8zkEOoQlQXb{|)Pd{d>KZ<?GpIWsRG19A+=I8=1qcuktdl!~EzUj`BOCcn_xeNG;G
> zYwonXd`s?K`5LZr at q&5tJRQO<ZYe+Gru`YW)Sq!n`x&<}H at VSXDI+s;^7QH4<lNk8
> zxg6N#ruWSpXtp)@8<W;A+Y>G5^Kz$6<*X)ddbYJMxJO{98Q0xC5oUP0zl@@y#k3oo
> zR#H+?TqzBOQH?x)!NbqS1$QrVXj^^7;o(bnqd2a|^<PMrcH1=TKanh%*yrIV(jC)Z
> z9yj~_`TRob{A{{j_n%6(Uv|mFoBaN4vhbUgkqh1QFS323Jbr?KG>L(JI-p;?KV2hG
> zCvNulUnn7jp at XSB&%nz&yYaL{bUD`>8rq;<ujlgS7cVa6D(06hDJ|mW7IRujvwM1)
> zk_Dy36-n at dPOEHDG3~qJmL=g3i~;q}B+Z&KZ`As}nu+u=R?4R?8ZME;ppgy^b5b;%
> zq#OI(Qf|1>0p(3 at TDZ-}Sh8<$d3|KrFYZ+M`H6w%_4L!=r{AFSx;>5m#sE}OF4x`0
> z(s;dt*M5W1i5asjoDuU}@0b;Gtt>9A<f1vOWYGTFlYKgR@=^=u&>p~Rn1e>_C5z@%
> z&he5<=aeoe^3sbR at DfNMe?INxJ!YyG`eZf^y#13w at kGkk(gkIubLhB-gPzBbYe{+K
> zzvdBv^82xtTRf*IUNb8B?!^l#i{n#9^>HNS1OrH~nTGQ89r=Ze`&FokcbhqBO@}Ki
> zTu^dj%sykfG2fV%PlrTQB($h+tOw1VSJH1W$h!(eh=0(($W(k`*^)(-6QoIwe-JH%
> z;)OTL!9VDFLHGyVoJ;?pf1XYMAWw;1&!;EgKgsBv`E&DWoTV5-=X?7nE*(7>@|B)$
> zh^vSnmB5+MVvtj6K&jn<Az=l^h~@J!#^XxnEGWfF2_04azo=5QA<{h1nsy8OH~5F%
> zp&t7Byy7A{K%xTnjA?G<bMnj#^xxiiis{IS2Aw)BN9qwVJH(7*G0C!+NyYp*G)g+<
> z%cmoiKDQ!FHOdQbvLaa2%D2)5Lkw9KRN^s7iAG0QTuE09%S+Mx=mH|@(;{zunp?W0
> zxU#IQa(*%<oaIX at y$g=>=aeSTSyEY+Kd*RE^4v<)l$3G#bH<Gyr_C=ft4K!0w3a<k
> zyf`1is3`u;lHx^$#reex7vy6yfd$F785_wmfT<ts1I=JIzlJ1|DsqO1z}3Ldkd@?B
> z5>H+OLw_VzvV!p;4>E+TW~{`>#3PIXVTK`$6JdrSj1yrNBg|lLm^6fuBMgr)X$UhI
> zVFD0ls5hOV-gJJ0Fb0HCA)S@~Bpn}w8G<kZ(iws<0 at 9&j^xkwH_=hmHadmO^aSd^g
> z$8C#q#O;b}irW`=Fz!%XbKH?QXWa3)mbg=KXX4(E`zY>gTwC1daqV$m#&yMAjq8r<
> zi6d%OtyBl9RqAkcq<W~DQ^%^~)d^~iI!&!p>(#v4q|Q=jtF7uh^(^&lb%DA_Jzrg_
> zE>~Bom#J5(1+}QIRoAKO)eY*$)!Wn#^)7XjdY}5B`jEO=eMIe4A6K`iPpQwS-&cR6
> z{^fA`OOfbV^)H9hUq&50t8P>OaySjw57x)%<Mm1UH2nm<QJ<yH(dX%H`nme~`bGLm
> z{R;gWeXV}IzCpiLzf<3&KcGLPe_4M_-=aUQe_#KJ{=B|j|CRo#{+eEvu1pV34^JPQ
> z9+MuQo|K-JJ|W$ho|T at Ho|kS*pPN2EeNlR4`ik^5>9y(W(;L#arteH|N<WZ(DE;O1
> zW9cpFr_<k0|0Ml<dVBg;=~vUQrOOOTL$D#-FxU`dh&Ln|emR^D)^pb-%3qgg!F7oW
> z*Cpz>E>Y)oiMCyrD7h|C?z%+z>k=)vE>YpSL><>9>bx$|w(All*ConH5=}GwayaGm
> zYJGxKM|r(jpDoqV0)2_TRH~zbzD8ds)lr9jw|<{gN1gf;`cqOJZPQ=Se<{^blCDS(
> zl<Fv#u1-&o>L{OXPS2L=XhC{OdZ|=Lh4h;AI;oC2(s!rtlj^85{Y3gHsgAa#Ur7H_
> zs-yTUZ3vX=C}&U`5)5gE35H(|rxDtr+8C``o1oQd$7=Ojqt>j=*5+zwYG-TbYD=`G
> z+Qr(X+LhWh+8S-0c9XVIyG^@OyIZ?Y`-1kc_K5bF_JsD7_Fe4<+Oyj8+6&q*wU at Qu
> zYJ0S at R7GlFYG`Ui>d at 4fRCQ`Xsy20Osy@}2YEI2g%}t$|Iy-f4YDsEo>f+R;sVh_0
> zq}HU?rEW at XOx>2cGj(_BzSI{|52qeUJ(hYR^;GJ+sUM{NayT8T<s^w}B#H8pM6HrU
> z3nYn_OA-|%iPlRJbx0CDC`r^QN%V{)(Kbn<U6MqJBvF+lQBIPmMv^EmNz^Jyv_O(*
> zxg=3Rl4!joQHLbagOWs at l0?ryqGwZoIh<07j at D9%PS8?`PSH|{+O$-n_iL#{S7 at n3
> z*J-Ilw`!?G_h_j^U)EBIzNMuS{X|P8+M%Tqy{4rS^-rY|9h^!fIy#j~bV4eX=#*3{
> zQCljN=>4fwqAOCVMAxNKiEd4$65W$ZCHitImFQckRHC1xwx#}ZI6ai{a>lWYmW(qQ
> zA7p%*@p;CV8J9DzWe}s%7;KC%4mHLaM;o<9osl=1jXB0V<80$x<Nd~R<1*taV~w%S
> z*kIgh+-Ynw9yA^{zGggbJY{^>_=&O2*lzsF_^q+W$Y%OyhGs@)a+&JPq|CHTeWo#U
> zN~Se)R_1+~C7Gp}m6<Ct*JRda)@L?mZqMA6xi9mD%$GBrnJt;8Ge5{YoB4TWN9N_s
> z?o49(<#76Ph7%G!4T+wGL^~kSZb(!CiH1X>F_5SR5;Z`g*^sCW5}gl;E`>xzNOTh<
> z>VQNKK%z$=(YGMck08+tkmyxNR0fHvAkpEFXaXcU0TRuEL}x;xMUd!XNK}AC*F&P)
> zAkjULXfq^w0up^65<L%zc0r=OnF`Y{hf`<92}tyPNc21;+69UBW+;q-kmz7YG#(Ni
> z3yGQ_(OgKh01{mUiLQi1*FmC>L!!GO(L<2vF-Y_bB>E{N`XwZK4H8vCq7jg2EF`Lh
> zM0rRw2NInPiQW&1E`vmCAkhX$bSETw5E6Y25<LZpegcWML!#e8qO2*<^vmJ&+oYZ(
> zlB`JfPgW&|Cl5{@o*bJTpPZDeP1Ysrla0yd<m_Z?^2}sgazS!Y^8Lw+k}H#!C9g_e
> zlU$ozm%J&tF?n0EBYAi7p5%kchmv1Tel7WUa!c~*<ad)lN<N!>KKVlOm&skp-zHy6
> zCK?tmaRqC_HIbU(nix&ICPAacRx7=R*O)a^G*(TX#-_PXQ>2-%S)^I4S*BU3S)-}Z
> z)M at H9jhd~RUk<0g6p1=CzZ_0UGK)GIj5->LIvRsInt(bw7Il<I9i4(Ynuj`iAL{6Q
> z)X~MLqbpHIYfwk)QAf9;j_yJoJ%Bpej5>M at b@UYK=m)5yZK$IisH0a=M|+c5jS_V<
> z6m at hc>ZlrZRD(J?0d>@bI+}wzItz7lF6wA0>gZC`Q2}*y9qMQU>gaadg7(Yd)D*G7
> z*E9$)6u<#u0iys(fHc4afDxeH5Ma6;paF~pqyv&RgqTtR;{h1}3m|$!lqn7{8juVa
> zvmt85kPVYoL;+#|BLN8;CaoN@;nypp05O1(fP at Xdo))uV^E5T!c0dYX+=k8Om<?{T
> z8gM%R at 5-9TZE%~OeytEt23QT)4EUYy-~J<H=l{aL|H$|Mu9W{H-~Y(>m#iQBKYYfJ
> zn)-Xg+ow($N=hym at VRKxsM#Tt4%`tvX~VHGlYWyvWs?7gg_E#F7WNxpzhlz56^CH|
> z7VJNRJ>lV>|L_@(Ker-{hkt(0-Rs}mQ?%z@;6FnxdbJ#`XnSD=+0zUdwb!@5y=esW
> z`$#|nAO)ZUqyr`crULE;%ms{x&gTJHfV%+q08G&N*?<{<0zfGMI^Q%AU<6D7<e?9^
> z9eQ5_7z;=TOhz97oxd^#Fb-e<n9&D}h2BpGOa at E^+>Jg!2faTDa0kE&ut|MDzPAsk
> z0)86s=D*zq=>C`bfd9z%|7uUmk!TWwD=%Vkg at l@nB%{b^ayv;NnAG4T50-Yw7&4aV
> z$apf5q?1X6Cq`l-W}Kg%LbAy;au=CSX5uXRJ>))8Knh6-SwKoj8NS9YCCkY}(wEa(
> zQb+1Z19^fxg}m%0d&xoaB6$U0ZBLLtkw24<$fx9U(n&6p?+HHClK-^9|7vUePaFLI
> zLB|oaKn5ooWMmx9Jk;XMLyvUcMFGkewo17A0sG^$LjXFhKtK>$YcN`82zeg67j!uH
> zFdye0x^V76z`2JhIQPKe+=C3~D++MFg5dlE!R`oxT?{x2gMY)&-iIT`D1_p$*CHCJ
> z#K3I?AQnF3fYsn)Bz(n#ria5u18ztB3DS;@_n{+LXbGI70i>WcYXPa`2a-n4LTeD{
> zjV|OU5!{W1{_r6aKu-j%2b~U14di}klp^Sqg(L$S0(a<>OwtYg@;aG}c+BJ-atGN1
> zT~maY7ewUBN$!MvvVo@}=Q*St8YmDuM3zAh$w at BE(-D6j^w12XJrg|K4WK94e+73N
> zq;?O?vjO)4?gQil3IKDE?p*RXLY5;nHz_9Dq02(ZJft=s94tV*_ru?>0i}@kLh!K&
> zPzG~3eEtTo7*GMIMEE7(cPXU$0OYj{yex;`6-eVjgkDLSp&1j%DulHIYLM@>0G!hy
> zIHyC_fqn#lb2<d)bjW(du>mrxM{U at Myl+DMkD*R9k_%)D;BoQ|bn8X36(zqN{-1_K
> z9Kbse$4->)v!I_t`R+k^KM(p4;6=b;z#jmw0FGc!jT5DQ93}V$YQhPGeG?_s0=JXM
> z?OUibe?m at Afy=iclhcsRJ8(M#_%q7&UGVcB==T9G$oT`*p$|cS1in88{Rt%f7x*~~
> zyH)^w?&hz6HpF=j=JSxkXV_u$IVABnl>7zMfG<$`?cn7i<k*3l*@+tYC3yThYUNj`
> zw_l?iXpO&wntmBI{t9aQRpjv-w3cttQocjH-H_V%DF17qe*pBLw*H7b^a9+pB{4Wz
> z#;hYUhQsS5K19JxBEC!v at dq7%+YJI?AA-F^xGs+j0E7a<0O5dvfC%PkavQUqL^9LJ
> zAZ99FN}EE4Fk{J3#!ZI7emE0CqL^&LF**_r`xs^b8G-a-nHCZUTFumwk<5G&&pbdz
> z0Y(FEXG%x{AQ6xR_hiP8XpmM4Q%|(Osem-V7{FL&5E;jeCOU>E;{g+3HxZx*qyr4#
> ze-eNPodL*XRKx^48FpsiJD9^H3t$0E0o)15222Iy0Hy(~fV%*>fay#C$pb$#7$unr
> zd^h7yW&wVMxNOWNat|XTvza~QUM7^>$7GRwKml`<%mHt60fmU82v7_t0n7u;2P^>G
> z5BN2p6tEDm2vEjMAmvOI`3>S<45$Pw1uO$B2dreQ<ROM7t3V4Vw}0m^i at dlC@N5=o
> z-Vb;&i at fU0B5&ayqqp{FF|O%ZvaR`9vhU&m$FgMIrGPV8vhT-a$%9`3T+Wh*)Mm+5
> zg8{u+^4QyAL+Vj;<s_DE!&a^~5)VjVd6ERk at cSb%0aPsM<yiNF8urTSde-T7ux|H3
> z)*Z$BMG>o?^9L2wDMz|iL#KA}(2Q2JnS-G5&<Jg7LcJVe<nGnCBclbW^<<^Co`mY^
> z$qLX8z*3ll0f$oR$pnD+PYCa$7$Q90N6Uzi;HANrfFZr~hnvU+(MzNG2~_|4P_rPj
> z4~3j1T9nyUuu at R_hhYzd)`XU(5YqZ+m4}wYj1!giND!1(Dr9!*m(qflW<iqyo_Ht;
> zRVOGVf)EZgkx4^C*f0Y13pUU%-JsEk1&!ApjrlsQ#ErC+f9hY!-k?=JjFew$uk!cM
> zNP_y3;-_?YKbkN~f#y;2BkM=Y`_Zh2rm;Y^Njy-p05YffrGI^L_LWRND+y2gazfnr
> zqgMIY%a5&}^iM{d9**dSecJC66^{e1z-<8h^$+K<`Ct1zNacpVgB}jaK~EXu8APwW
> zR7c=0)em4#ej#0tJ2bTC&zo1Rlt0{R>6H^b9Ev|)Dz}EI^^gWV5+uM*MfQ3VC(!NG
> z{JZOBUNYlMYu_JbkLhRDz^n at CbERGP&1T^ia~Cyxc?0R7#(wD^l*~8M$4~+3^~JBa
> zyPn8!ycvITFGw^aW90ZJlm1ccG11>XlZXC?Um{0L|Ki`Re$dQ*HUxF|{FC*=H&XG0
> z?u(-j-*CSXO5*<?c>YIQbn>$H&Gn=aa0Za at Vm)D>uP0ac)sv1>^&}9`{cb%;dK>-S
> z-g=^Xs-Aqbt)3JCUU;&eytTESj0VI!QBRs5uP2ZHsh(H?Z+%fuG<!gwtS1Lxf8jZV
> zYpEx at K(9JcPhyY5&(V5P{>OR}@oGIe@^U at NdkNv;UI(ZFyo<DqW8#MdOFuX}{$)LB
> z>V$5+2EF=CJ=ym)_yUXur~xs6;ef#aBd$J+1ndO7Cfi7|{Wp?QpN(jzo_`kfp0uid
> z`8oajg#MkOf0^ht`u=5N1bpj18s=rZ0{=OnN4JsOH(?_gosOgE|HD6?hW9pHN>Uy4
> z at BDrG_m6hozhD2F$?=E!fp1 at YNAXb8(%W}8R)6+V<+{4#S<V{spR%=n=NwyqotD2l
> z^2 at JsSHy1EyE13Tl6xPy@WIfLi8fpP*5rB1UpQH~e7n%Lz;Pk>i5Hj6kmdeOjEVeS
> z_3+uU5BHrp^6MWK%`oj>cy?oq|G8Bg*(- at BohkXcm8<ScS~`2{x{AER;(||Ye>}Z9
> z^v&B6pHB>5rP_MmZzn%ChRpc3GQZh=`RiHJu7vBVTi7X|&Q3qH-10`r2Z3icjDGX`
> zQ5oa1FRf~s^ZLT1zvsW;_xIBwUvBzPethtw3!6eN-Dm#YZS&e*So~;s+ZMx==##0B
> zR8JXodgXiW<EK9INzIPcl&?NrQkXJ61)IH6#)LpiaZ{}`x*<ahkA&-biVD at MqxMQP
> zk6%23EYVU|(x;pH>mh-9^6C(4Kf0cV_1ZhAy*D0733+I)jryVbNbc8<4 at o~FINUtC
> zlb2|3`2ISwoH}^Z5N^;8N_xXe$@S^LoAez#{i6O7zxYzMc);Jwo|$%*3u?P()95>X
> z^}E+j*MIU})A?xA`#aWfTfQE>zhSfR$yWslqn`SD_`>AmIhzyo;)KH6_kY4qDLRz<
> z)YWs}ynXSg!LdAeq3p$R4?hrjW|QUgi1iaztp0Rt<F%|ewrmLe?U6y{yyf<Sz-JmV
> z&L&5lnxX8yyfSS(pY=uP1DDT^U%fF>_0~JfA4u%AzWR30r*Ew=te*Z*)tHu&ySwMj
> zPdGci<fBjL_I?t0<Zw{Y$=hCfVPwWjF5f!`4SBV=?%Q{RC(BOWp4|~T{c6BM<(O{w
> zgNkooIup3#j$`*^HQ%#(`mk3n&RG8 at _xpLi&t)cFS^mnK`*w|<m4EilaWCoCZ2tDq
> zQsGnFC^rmum<Hb2re~^7;2nzLc*Eidou5qzsnZMFVPl^~0<3tYs>_gMJG=GIuLnFX
> zpP*ugP8h)Ix1Y@!>;9n#uTmO<ZD$S1x~^;-%@Dag8QIKgH)3F`j<;^dO*xa>eP>@1
> zqT5-g{Fv;NuXJ<kB;4E at 7+c)4;CZ`!r*O{15tGQ-1wmmq*$X?&LR71zV+sbMs=Rt%
> zH|{<2!%ZMUBkNSMyr44M_BgsPx|3UZbGyp#2OsMf3UcVcmeM!EI(E?a!mR9ScOKr*
> z$*FRGD=1s<qj$h|jFN7E4UDZm6wLq4p)65NB6(k6MbnpM&4O>2`D@&Ac3X&>7l+IE
> zHdZzZ7hh!05R`c`L9UBvAl=cf at 4Fb>JLP8`pimuV94SqH4sDaaBef~Ok=7LG7}FHw
> z7~2%=7}pdca)N^9sH0MJd>H15Asp)yM9#<5`Zvfs+`2G-S>2A_5S`rLzsl|U3is^!
> zbuo82Ye;j0Bc=H<hqk%Vk=ne)k=FdUV@&fCj<L;K9pjpxWaUKJysdLf^HZSwo44aP
> zp!sS11~xnJ8`Qi5zroErJ3niF29$~yb!_vlABw{TyI?J^A%}cvN_b(cPf|W^cjv{N
> z- at CsN0&bDhvsSL=%pqBq-7%mk#Sz-1b%ZsgI>MXM90QxiI3k+HI&NzkCla1h`sd-Y
> zj$GW9rW at feYq%5lbOq at KdfxQnF4Oc_Vi!76!|{74s at 0?qvPQRZC|z2TR&v#vyN2hj
> z;eXf?Cn{TUAa+iLu%OD#8*$?^-*d62VAAQ8N6bwsnJ~o>-YhsGn%6i6+DBWLkZ|jZ
> zMAd8;oz`ayG%sPa_;_d@$C6_aVo+z0g*ZNJmf?Ov(!Ay++!ZF0m+axJplD_e`_3w4
> zi5Q$k$g6oA5prTk)-^&yG at WYp)rT}J?;mcBa3kC`rZXt1h8s1jkO($GNpC_8&<E9(
> zu^5cw=2M at SNaIXi^>}DbC~=E;;}o?~)*9W6H6g+_3v8O;k9SfZk at C2z@#9t=Hn<nu
> zYi>P4T6yqv9z5~K)R2QHy^*W3bk`o~_)Eu!*W{f+hy0DC2sgE^jJ1&8`Zmk(nkVwt
> zjFk!*-)uh&8=A*!Y-bR7<V{$EaShDlWaQXDDFy}2<!?Wd{1fW`nlJS!!<w6mbPh%8
> z&meW~*f6ACbv^Zmq_BQS9g-tl=Oc%GEo65LjfHShEdHHACan3m{@SQ^4!jmfQ<=LP
> zB at m4e=sLg`K}Z$kplTMbp>&YaqQ-p4>DTaeZ%dSjH(d_}z&)f{fXyst1j`B`mhR`?
> zvkUk=n(ZXPz_0QeE!%1ZXWX27Tc-$tushsLI`26eMtKyG8w=T0XdzD}i%QDVd&m`1
> zW<``0N$a at hs7mq&eo at +QiviTn`yM|^yn`3hX!80%Nn6N{=S3Oy at n??@2Co|oz{`!E
> zI3QySdHNC2hx&Ne;{)#+9LC!jdq>%nN`-|Kj-+pM911Y2xPkhRr;}eICRCN)V4g&V
> zI{lH)lg*5gWGS2N#=<Nml at fKyk@r4{8 at n@q)O0$W+D=E8-TJf;DEM7s#3`*tu|U`@
> z$ZO;^(Yjc?Sc_L{MWJ`5VB+Vi0{JVftX<B}uMezS)B6WomhwBB&QD1)1-~t0PswpR
> znNt}mFxdl$k1EFP78&~1t^cPzulGa?$AoiuGml)>@tM4mHx6UnzE>F0r}bARPB)^J
> z7e)%^E=DY{FpM7XfruBIFE27E_H|KvVWb6PjGi4m#xA>X&Tf=Ksjo2n<l%UgwUs|8
> zZ?$x;5S+H<Bmg(F>z(YZLKShPm(bq{wq;D(7smFn9ku#l^<OyEv#`+6NG!7McP(V(
> z!_==5FR7svWfqeCm=iDL8WhtLJKn%=3SOx66J^wlJN*U8hTg0n2I_WKP#zI}L_7yd
> z3Y9XK!nT6=%zli>T(WAeb47Lm&*G-^a6w^_xmR_`TTPuSKt&*T^E%3ek*o%8Q at WVe
> z5iU7(#m)ajG}@FwaxvqiA}K;p@?32wVvS^!)YQAdpca&_KwBi<xrlbLxE<S9<jfr2
> zRESvJ1NmG+%(#2KhsRrLjIL5}I!9x0h_~B*7vz-N>hFuSm4^<3&W^zCumiCS+l-~n
> zBc12?lo}S)v!a4eS<9NZtl-vP^}1W9h)idx;728I{(^>Duecz`Ym}tN+4*db)1Y`R
> z8~6Gvo|}sM1UaFt#i#Rc>*esFv at qhE^iIL&j)<?jWWt+CW1l<Hv07A^ICBi2`Y0>Z
> zptKeAt;-I)&nyeXt1wKBf9urFZyG~dd^`V!cRYOXE*n!rKoc1&%IJOa^nDZR=BuDL
> z6h3!^zOT~4TA1Q6yfR~c?g&yj)Hz91bgV`?BfMz{J<LI-)dFARAZHU^KqX0vJ&CmK
> z&{*~)_Qg^%1+k3XgZq~EB=RXvW#^ub>6GI;;(EV>7EmDd0=#~^bWdXSIa|4$-EO$R
> z<ZZ!=E=<V?dqL9fJ<5*heCl(o6lMgUvXyO}lJf$Iq2*8WQqpT%CJ*wYt?<(a?Wq!@
> z>tx+ykgqnp|J!x~<yZ7Ke#y|mhNXL;Cn#^Cyr=E-H#wW#S6zQc&7iUTMT!CITU0LB
> zRDE*s*vjz&iXuev_og=`-16^92@*I;B`7#s at DlT$ZktN!V`1)p1Md*NW075b)ah%H
> z^{xawOl at d>5yRmY1zu5L0&~F$Zex_n*=Z=*bJ(zIPxEQyMi|lJkJ6J}IqOu2jG*p}
> z78I^v6E2(*MjFHL<|U>r0&n9KKI<*BaT%LQMY4<)Y=t-}JWRlw$>8L0P8fNDzM5?z
> zT}jSC)W)!APcx0fSRhoy$Vq69FFr)ciDq^eNxi7-_&r|m3v|gk?o`3f!h|l$k&(sV
> z99oSmqFmGP`iC5;7$0Q`>W(W!1s+riv=={LY8H7FxT3st&iGgHcgE!r670-?1_|m&
> z??~!+!8!2|zVrBwK^q!}msvHoWvURbOA=g^K`gX<99-i?g)3V0vz7ZqiT<{7>(Gwh
> zx4`75uq_i5cojE{>UvRbEB6l(SzCF1Ao3E{5 at -(Ta=TBwDeowSOz~<T-bqpH`CcT#
> zD3sUKj%_{8j%}V6mlUzL*;XzKe$!`r&;{RiKbPF5lKbYVgzrSWsm`Ju))dj#SN1lG
> zucKW=o4Cnne^0PU=Dp1~THtzF>)jS+?d2r+yScR?{D~GnDV4||ycn~$*~K13t8<~%
> zl_t{mvbV1DxHskzjUQi+*W2nuMe9rxXNpZ4yDzhKN|It<CgPWOue{L`VWad%TkrfF
> zFWkyRXFHAg3mWr2HfiSGBS~h2oJrf1DW>yy>pc?JLeCu968B|RN88F-g>|$0yV(r_
> zvps#b1FugorLWqBq{DlU at M8y|HA)<eZ2XwdJb<yDtw6 at +JVOTNg$wSSW5jk;YMTq!
> z*_N at W&6FEIw9UQHu4tRfMQ686Jc?dDD`ze-<CSnOXD1o1AGY?5PM*bDvOaO`@urN!
> zyw@~r?TIF%Avh}1(!K5dPG00%bHvY7D&{fTo9xQ~XIcD`ZD`+nkBI)ApCdiqiQ86N
> z at 9VN7P30w~HOq-#{fL=S)Z8g|$tk8aKp(QF2f9>#`n8j-x5#CrP~w%#IggH5ID+N`
> zwf4JPbVLdASHQBi`F at g)ScrFmr5r;?cybI52lSJ8Qm3ucit#ahFTG8_&@uXSfQj&_
> zNfG<<ggb;1aZTq=s>RVVjjb7CyoGtf{f^A3l-ebI*@p4o2)*IxnKSA1zHB=OKe1R1
> z9SeV*cD`erQ&!FARN%@b#p;!4!6ivGQFt9<U)D)3Y39Be;?XmM&bPFW6BMl(7&S1P
> z%baW%(^2DO>yB<Y=(+;8QPfS0MSQQ at dAk~IjmkNzx<EV%*TL6A<~jqUkV>nMz;s?j
> z>{*y~`AG4637<aHr(IpmC#m;kQEuuowq;<3G1CCEYtU;Lxk48e;#KFUaLj-3jte-t
> z#LyfDJSoaLzV=8!AL1A%9(A!fJKgP~lZJVTbh?N}Fdbp|v`1-OoNnTHbK}Q4<8YZ&
> zlh5 at aCTObB?*u}!X;iY88DX9z**8(|781Dt*>?Wg&WR`R76sn6VefacrUJsFU&R~t
> zj!{m!{5_^cu7BDwO7QEbsm416g6}2tsEhpU{E1)-ll){$0Mbb7NXafIcpoV0&DIRc
> zE2$LlqSM|89lpCd2kM{N8_qXu<2zO!rY#^s<aDZ`N{j4=akz^fefd5MG!WMr4YzO|
> z87{+1D1$rZJL#>#S^8mn!#Z6kcRY7X-Ni{d)o{Grvd`kgo8KZr(Y|({1+7OKX`$BO
> zUAX;OCxd#(c}~nQe7ipzuSW;(yJ}GH&+0tbBU}rChLd{kB*lKT3L1WY7WIMH4pRMr
> zev|g)CHu2%^I7R-@%>p;`s<I*#wgA!>xoHY_h%)U_uuK&8|cd_kI)#=I)1?WJm^0$
> z{_v;m2JvH*P`Md>u|V&^?P0p?9UAnOitib5&Q+$BcZD3ncYlVoC^}9#101P%N6}AE
> z;8X2Di|oEPC_f^LcdTU-N46;8LqY4uhWlIZhCM at h?a)9 at 3wwh^u44?^)Eql!KW3L>
> zEn){v2lIKq*1PNitzCzsPRqMbxcm+&8bfSE?l1b%nqwU*777oeR&2I8(2AR60fL`}
> zNg6HH#lY5C_5zp8UMd7QDqFK!?$h79cj2cP&Dck_1mndy->RDCz&fV6&gBCt2-Kru
> zj4PD#xGn)>JAbTuAYU!)p(ruVCC4w?mCrFT8omSI`w_S)1%+_uj;j{t(a#)dE?>#?
> z4f0sw81v*EkCpO^>-}WY3Faf`eTuFLC6C?DPjC3cg`F2852;P$IOZfRVc<kbIa$xt
> z`hXV&<wc?&rRjijy!r?v8stbj$sP_q9OPmT2RX(Z4i=q)UuY5TqGX<agCC<(HhyF%
> zv5(|8?qd10=UJIqAYK_wgQhno(OLbup1F38U at 37oQ|)Mxv+oNs!U}TKdiF_-j-uYm
> zdq!~c&<Ks>aFh_xp at Hmg7v&uf2~L=*gf^^JWK;<`uai)3+_S6PVv+DjD^KH5v4Rie
> zPtLyFbN&!s7TVt;iy(zMs~_`cR;TjA8#kRYXISUz){KrBEg=^2V1zT!r1_f2W?}<~
> zN$~l;lpj+^XZHtWW63CN3J7U9+xYR7DoeL`5;ZTcYt1DY>UrK3Ib<5t at WfUXFOaY|
> zSoSj_M>)T7C@@dOkfXlX9x%`rN!JO;?#74~AIb&hydNjw6*Sv?Cb%U~rXV9P1mL&u
> zqWprwCA%QU`{Qr13R>nEF&zixCo_}6XHDCpv#sPv&UvCZ6ug^2Cm)6zgZXL*i;X^b
> zgU1&bV+>Z_orH8oVoW9P9tHothmv+@*&?Il-7$HXUn15gBwNH{Q%1|XZ$msXn{t at E
> zJM at NcPTn0L#TPkT-i=o?Ffx$aBIzqLWQ9!?h_P&->doM1o42YP8O$pDXm8a0XDYQ;
> zUOeWS519oygJyqg=W{MIs%Cl}>m5gZpbe+u?RX{4b%X4DQ2Q_}V2nC3g#Wfq(e7tl
> z+7x^33|~?A-Hg`-w`&0J6R0$jwAja9<O?D{obftwUvs(?;_GV#IxncI;d|p1?P;^G
> zGJL!IGx^2j?Sn7|efpx at q#+KzGVnXTcc`L09VM;umUQ5Sj&`5*=cL&Ew)_DzN at 49f
> zm+yryFMhlB5t#Tb2Rmw=v9o)L&&6n%<y#J}t#%C+k5;XNeWZnO#+HGexSRu|)PrYV
> zB^eh35JDjgZHH#t^1B&Myl_xRoRC0*Qw52J(DI^hhS)IUw9OZM#m|iuT at 2;o&?MB&
> zW}THK+4o@`G6Ln9eNuKJ_0S}K%q8~1nek3mi8eE$K-o at 9iNQt}B^Hwc`Ai?S(PS)O
> z1NcH#G!k6^FDIY#b7d at _sbpP2e38;GuMlgQGi&|$IfKN!+zoC%Go1CdmGCOJr=1v=
> z5Qg%y&X=|rZ_fNWYFqqi>-ozNYK!qCSzhD(7IKV-ouVa<q)DyS=X}A%D9n-N=b4K`
> zXpK7>$+Cj1VT!ej1fEZBA3*X1%qcDtRhr=Ap0<T)oi5^>j5VAe^C(M4MQEu$J?F*a
> zc)|TH+Sdx_B%R);QD=*Dsb)uwn|X-GmzAKrjVh9}nGAGJXly*Dvn`X26GovG-nHW!
> zF}iiuRvmpKP8fBWv5-qYxZ+zdl9#Dl at 9SLVif&wgjFriW+Br<*Xo$`nyuZ*}$Myyz
> zWS-*zp$((E5XS?TnRO!@0ynXE`Hfuq__=RO<N`x|G^Odw_Aczmc3`ceHJVf~LGJ_z
> zita&lOtb$W)zjjShNb%t(w9H=3->OxbZ@!bG^RDz(%o7_=gW>U>zSr8)ZfGBc2w>d
> z=Pif3WvRrUN&-DjbeFv~!?9LyVp9`d$C4{MoC33}5#!DguJn#ogtMPH7DUSJ at 4w@3
> z>Hg5ab+#Cb(d&DyvqQ_ttBwa+XJanscPtzmjm{h!&^lYDB1dE#d39Y(C at 7e*#j9ly
> zIOzUhziZ&G9N50<_(O*iYf8Sm8e2znlsm?;D&daKxgBLJu4ShAbhTndhX~Hj=kUhS
> zFcL<_939kAjy-GdIN9}#3b?A~$N+C%reno|UbXa2E8jc-Z>Fi322XE|yk(FAGDhG}
> z+}@gljdE#hJ(<$+o|C>J$_d9hnnk%VvNgu}Jt$v^x{6c^?C+fJvTbpH4X$!9b}B$W
> zpcZ^v at 1i{_R*|z%;}wl~Yn6^ydZK^ST(-AncV0c3iSgbTr?Go<9$`s~LCSH&_Vf$v
> z#b~_F#XNPPWf;~q2peo8d|(MKf41Q at 3ae^$_k|G`<u+w`2xfnrg;{^@N6c0>ggd2?
> z!uqds2<p;o7MCwqxf>(U8;=x5qNXuhQ_*9jp+~Tb at q&WZy at -7-d3ZSq#+YLV9Y;WV
> zN`{5$934Yr#lf$0eVej9I1hS4xabN=nt5Od{a$fKS+`?LyM3)oAzZAsyX4h&;mhg*
> z`<<pXjNE)N26mutf2G9-Ex=be`8_8Db=0(6V<UtCED@}b*AsbU$T{>2+fHyvilGlU
> zBOD<%<$&;xaV-N_h2Yz1u at PN3R_cGSsV1sy*rjBP9E~@T_J4`7Ly(23+gzPdU4Yhh
> znwsis>;-i8b2tiN2duRt=TkAN^gT4GHB00&oPr{!kTiprKxuT=PJO}86kCW}=^9CS
> zb6%}Bx^5TaTJt0xQHqxCRSzDH@{FbWN>Snsmv%GnoD5{G#F~9K at x#gtJMDGiBc2co
> zT)JvAQc*&`rWq6mh9Fe|?!L2%2axc?g0CwO+;+eFX4RuF4QTeIHF#EWH0hiRIS&@+
> z<h)CQTtOZ8&MFRo2KIv{YxRZ88nK|7cLhjXDvX7CrAsb2U2oZ^igW7DZRtMWeo-c#
> z%U(*9Ia;^L9$+6Wo^uVbj}|`r6P45CS%o~Y6K6t4ik%A=h%a2#_5k(`0y(39dx0n+
> zDMeLXb9Tqd=C|2_Xwm)J4BY($f0X4L)P=U9j&`&LAL2vOu4y{Qn27Z*VU&<1%oA#m
> z+DAEydp{HWdd^iFb2hnGQ8`0eXO2cds<;qc at WZMC;%DA#9Nt1@!93!i@}5=fi_X^m
> zUiaZ{sdOLxBuD0cXjZYDK-*T>E%=>IN70SSdS;7#_7$@7BD*P`FR)`C*P79q6IwuC
> zvCU8O)yw&bbiP8CVNF!s`5;_lFkUW at v;yii>I+`uCSy?Ve$S2|X!+QQ^#orpC^|4V
> zk*gqW6=pLU$V4Zn8<yzXSAN2|>S&Bn&$)ci0_5U3d$i*=_#BcHG4z3>25jQRY-|6;
> zkH at 3_>Kx;wnj7S;xqjZ7n?P%>6KxKyRAVo2`p&8l6#O$nSkpMyRMePY+VcPWient?
> z{i(gGp3ry1?xi6fo$ge?K9t(K#)8sHRE|`azl2WjoF%st-T|G*FlU^R$N}Y?$irc#
> zl7^PR*u1l&d{#x3Bxf4F<5`sEdsS{Jg_st_tY`6pRxDb6TgOORvegCDrS4=$xuiQK
> zfAyc)Ip_x!v`!3G5O<^W^PuPM6cz~UP?jH~<l7*tZ=eZocU{I;0dCUi1Mx!Ju>@OW
> z#O=Z{T2`HT&`7a*`KX2lMjtS$VYdeQTHzdc!RO*2SEwV!tnw3Psp_&CqdHm|&|@9Y
> zpbbKk;>%f7v*7Z at uf18Ic|V}RiU7X19f-$@z at 37#BM;-ZxulxTdxW;v*p8jXBFwZs
> zv!Q~H7?Hk_bw|fKgF at J5Vc6xExvJ@$+p)xUn>$hPZ_Tq~MR$7YXXIjBM-2L;*BWz9
> z`g*CEC;eQ5g;An!M{iQZbS*{^R~;|P!bo^SLtQkVq4Em_?d at I0@M$EBH;xordGzC9
> zwEqbO#+m_Jg4gFeVpxGpag0H`8(1P at ULFsQ^EzLmeMf@@1C4P<m5wn&JbHOWcoo45
> z;o+N!Pe+U-xxi)y;V>gUpm8di2{ah1|Kr|u;m;6RM+{ol+bTIp6r-BP(zRgBJu~c?
> z7%$vu=g`xyheWXUK=rfG){*B}j9xtN|4{bs at ljOw-}sr!UXtA;n=26l*-c^yw~#=%
> z2uqkOOK`cw1tQ`WH9*8jYm4Ho*4DFR0wH2Vzy%}XqA|u65p};Q*nZmyAS{%EZJkzX
> z*KY_KlTFn`Py#O5=Y3`u>+}4c=a1hjuk4&TbLQO7=l=POY)#7~1p7J3{}ARO5o1b|
> z2%Uo-r=gxHL+MI3cGjeBYj1{sZlx8gV>91MEW|j#`R<tsI2x{LpB`(wKFV5$ETIs6
> zG!?I)d!cK1>AWud6~5(+*#_=gGxyJnDD<nqLDY<XN%%!?V*8?s=VxGKW#IMM`j*MC
> z$K`LSdW9bknF8y*4{~6uSW5-GwUpslobX$NqqMn6R`9*T<<rwdnuhBP74nJYW%0Xd
> zxTZqRa>_rIFQBRYLi<##!XdISkV_|E-ThdSv?@Kh+4I|IKAixJU5!;P?zZ-gdJp^{
> z$>cAD@`9PzLxue^t#Oo!8%e6S1=<vR(t&%n(}<aWF9`g!d?ITRb=MI0ZXe+P*ILa6
> z?r9Oa8&7UD;Xm~$1~r-WAG+A3>Nl7{Rui}m?mfV#*HBJ~wTrv`Vm?jfIqb+RAEz+x
> z|7o^oi>Dtf=~>fP#QIBa=J6HPgC*>Hlk(m8uDR4$(anQD+YC8M6ZVN-?)*;AAYf=E
> z!;8vQwkE%M8vpp#hjz|7zcb*u7pCLqFrrkgH>v1N8o5s~1D1T+!{b}FoQ31gp)RZq
> z`LXAZQ3JV`?*@NpQ4_^fQbkR!p(j3JEd(#Cqhq@^D9W7;dUd&r(|_z$g4ZxVAda!u
> zv*ZyyNqw`vpYal$t7+efYB^3_4f(@v-|n|hl<*==50-pihOLSTHDJ^B82a?A^#-G-
> zhP(Ou5~!tjl&pM5)RAacP)FcbR5OsHgOt3pL8m5v#{(Ci{SNv#CoC_(r*$?M0NXno
> z5+Ip_P8#(wY%#Rz+szW@@U8#7$5mgG&sWNXqQon*(!hZ#n!31}+=8B_NtGLnp2jcJ
> zb~BD)k|0uZ_}9*oFK<W{rVoE5IV4fF^&jympp$pXdb;1S6s{On?|U#iZjo&G(vnRO
> zB^^zd-X<8P_gU~E)208~Br={vD%~$i^S6U at E#G`_s(L%o@!jB(e-=9f*emOyv%DSG
> zb>ZpwUF+gs-sd4^Hk!L+y(NXFya!pAcNW`Q(8J^@OaHSYX-#mU8zpEV$){zsp1$fL
> z=O0ug`8a0j%lPi6jtcDlGFm|LxE7e|zlR<BtmI(dhccmOG(DOU{&k#tnyvNLF%^(7
> z4!=akg&Zt{Zf9`=54>LM;(j?5+6l&+JolYZEp~B_?*sPtX*t`!OHcue0r`@Zg5oUe
> z&HalSA!Sj<$ceF$+&CjjCZm_1&BX{TYy{Vee=q`zqDM<FYrNabkiti!d+BNQ_f at Z6
> z|2s`ojo24y$jg-#{N_ZuA?@*#?V7ZQK-#kz{G*-<WCf%>^L<5tItjowT at 1^_u^E$|
> zMX&GjL7pd%ff>0DvY4)_hqw=MP8rn70L)GBf at AX5gsQOf7Y^2g15K|==NPV98g3cb
> zG$7#DJ0JjVrhzWg;R<+#Qwj<v1NQ?w_-!5J71gRJzD1ebMuJ=-^CFQ%`^Yq;!bi0e
> z)4cm_;K0-1O~!?XaqblF2^HF)t(nSq;&K{r3S{v|-#P)E8ji)vC`pz4<PGfEw#1JN
> z;V*#Sb$Gt4;h2kSyr!5#i^J2Q#n$S>`DYU2nj7zePht0K8jjI~q3w8jqnu95UxEA^
> z7;{oLhja8fAY|!9g7b5G_$Vpi{tPHPp?h^7C=Ky!@HWU|T%OmXxyT)Vv7&DzJL9`J
> z=`}JUm@&W)a%}tqUeqyuklTgXkxv9mV|Pd&Q!>?wqK+DFP!RntMnm)neI~#p?&&9>
> zm*m73gE{i?hEDaS at KL!CJ=p2s<c)CJXn|JF5~CFcg-~@*Qm;{dU;Q^A0(2$v$%dmY
> zVn2xUw7Kdc+5G)%FdS35gVRRzMLd_u#Gcjic`g4UPTm$Kp%}3m)FiB3pzSY)UP`~b
> z<Ra-Uz<8lA!gwX<Bai-P#LCD)Zh-$D4~>XD1H?<y*2sdfObeQs9H`-_ns7})KlNCP
> z5{!*+P%yg$@H#&BEj?l;O~um+M$4(#S at D_~yfsyABA_RhPnJY7;}ly@><vbr`Enue
> z?GjSh>}>)4uhme)YQTto4p~u7dGhjtnPeux{!5RoG-Q&AQpruCwCr`c8b%Iril~gq
> zQkjL6YQsDxDmk&alDj3)!D_a4zB3p{P0}|3(<;e~&yJ at dv1j$mU8+dCV4o5N*ZL7;
> ze2{v~4l6m~quSfqpc|%a18e|vnF4rRy0}^~267i~kj%~Cl2l`lsZX!rxhdtogQbDo
> z;W<5A`L_oPNEU^R+Tj*C$3uG|QL$uE9XJ#6mrEVFfm}#@P6C$(8;$`sG(~E>s~H{D
> z|32;Nza8h<N(lJ(qVNL^6&ZfAz&{0e*4%$3$T!T3QLW(?Ivx_4DgGIZ*L0C+dHalT
> z6R0E`qdfbsD2d?*(EmaOJnuEDEP<DQR+{QJO3%^M{WFI2D@!S)UsBnD8`3ZfIQsKs
> z9=^FMfxecYx%uU9nl(C#X`Yx?5xU)mVZ{)B0FcIAZF%v+DFHniO%s`<;2Dbo9Tj-c
> zC9K3XMiINf5o#Plvl6 at lXtfczNT3ttZYBv(zm&T~C%qvzNnko((LokM3u1^Um=B3j
> z-f=jWNx;3t;2dC3YfLt=?H{y@=;#b(da-Z$EgCe@)5P#QLE)J^KvD3P&9ah?(|DBM
> z0F2+W`|3HpTco12ousQqq!L*Qs}C&|(UW3m7ZQ-mW9MsSpurQM`}?U}=pe0}_EuH#
> zy5%#qHgwWX>`X-+&Gv9pVATM(y-#;d`K}oCp-niuyl|FDas;eWo^n}}=^)im5ENM{
> z^bhZCy-P_(%M;n|>ftR&_3AN}ndpI4O+A^ajUi8&NKJAfTJZ(P78hzyCFwaaVfUeG
> zST-smd4$e5Ig-tUd{F_%j{T9yU_WF?kU0=uDv*s$9Fq!m^Kw_8E++AnFQAtzG{>xk
> z($pMLa#*3U*wGk2S4OGy4dji$$-;Vc0drA88Rn7|U at m5Erw6|~oro>RU>o{2_R^wy
> zsz|WntMK~mZ!+v8TOF-fHzPDg3ggI|Y|s!|DK!4g4+RpjYi+WApdJ{o47=wotYtE&
> zJ)%)ZTYKK`)6--*FSK$1GN6pFDEs`~MC_ZAbMx3r2PL(lnWM$PV~KKZN22^GH2#K$
> zxtLc4Q1!EGXIcLoYbSEP0Y at t3nmEj^uIeGOTXOo1-;dH9qat!KN<f~iCr7NhOsDkf
> zm~<ihw;*;yG|-dSr^B_jC$ZN!Ajsiu{6M`rUG7uMM0}8sol3k at +h@e at -d@;X4b;m$
> zYT-GN-S<J}0N%iL2pI2~6~LKR at cM#mlRwwqg&avT5N%}u3CJnys>|N(kfL8AOM5d`
> z4d6FbWj0h{S(}@nne|IM(+0 at lb#gy=)?QV&>XKmVOO`JTKy!ktLX!uDa81uA9f?(6
> zM}IYx4N1#Q%pL;Q6uFbF#8x(w1~&WjPx3{zw`xsveeA7{L_njp^iTL*jTwYoI+90~
> z&>{sNrQ@$byL%HfD<kAC%LYJiz=cqi<!97v*}$D~0$vSl(xj#dodWEZZQ%G{f$Z~@
> z2xlL?`P%_6xX>}k6$iO~8`Cv18=#dZLD at jAvho;okl?)`C51Ew(pa5V22d!pD5$gl
> z>^^gCqI5H)Az$GOv_d(q*yjcA?VP#83Mu0}C(xUVFMb1bawhnstXSXhWP!$uJSp?c
> z?gwzi%6L|2&%mjk)!CoY>YX3HU4vcRGfx8(fMR&&DpeE_XLl^K6=F7E|64y^i`5?E
> z`r|dnB-e}FHJmwIO}qGckbD|Kw>z!NZg!UZ`q%w)LQ=m at fmO6@3-{q<f&-TYHWQek
> z{TTOtJjqutMI3S$J?5?O=7ED=^yUDo&p$m}M<K881V0OF4I5<2f3j>OQ)JyB7w%B4
> zkOglVz#Qg2Hc&q(0ROJ^KQ^!lT#~^*W02?bi3MEg4F8OdMEoa&ZfDwuWd)GATlUX@
> zmP+ddtol}?-B;+RUMt`%<DNl<LiVZ2IKWXui<`Rucxx{B%9W5_k^?2MQPJC9)@JZt
> z?B{vzdpUCt4@(7<ea;Cz*#_+_-*a6UDu=y5Y&MGbPYX%@GTFL~YcC5Q#aPZV$Q6X`
> z5%k56^9C8Z3%LS1OIu(rgMZuW0=fQ&Fq%A?Al5V6$HB`zJin2o^$F4AyRTB<#=zWu
> zK`OCwyZ*JK_W7&QgL|*^bhl6GgXVkR&mn2r?k|JZw(E_{T1&tYOp at 1ppUV5EKqisd
> zK6RJNKLxUeQvcKrvwuoQ5_%wDw_K=tD0;wm6=&hqh^-?R(gaw`40`)->%WsK;EX}5
> z4{|5O{v!6IlRsy~%vyNZCN9l`#CF_?+yFF&qDdq))o<{S1T))P&wUZuk8{d!CAVX7
> zWIuZ<Ticy at s{nK4CR54Ez-Co at 3wil($gECKHS1_SFf%j}utY-pL4lo?{w8ftKz0yb
> z4TyDxwP^ZAHgxF2cQteDOfiiLG)nJK1uIu^Vu}K~w(dD4i%I{v3=gqDrct*&sJADz
> z<Zt8bDJ}VomZ{rLE7?hP5mT*y<0)f6-wd5>Z#uL+yCVCc0Zj?$F$xoCTZ}}usyeJ4
> zOWB43n!KN|7D3hCx&L^8O2=rrM=}^aQj&h(Evp8e8tzNMI9EUlR2Fix{kU`-=n;!l
> znZ_u&a_l;WHKcyn>x?mLwgZWwm2 at n)oLd{LfTMV?!N#l`cmtcq-KntC!F at 0l5>Ly;
> z`+Ad_`hlI6Js;WeDfFwrdG=@7KDFM=T9ry$Wrp3 at Y_pa@K~^$tJd-ZtG+w|-xaeK&
> zb$Dgyxa0H2Fc;<zk|FH;nVz7S$WGkoKg8wtI1!*rc0$(m9C|SU^8hL4u9@*!vtkE7
> zh#j1>e-L}xK=R45ej!lUUJ6}HTFXgLMa%xPbFT}YAP1|*T_zQpmt84CrT)^6M0Fv?
> zx=_lp82ce3h4tLmc=i`<4Q9n_&x5pFAGl{f>}z+{2MVG09tjO~w!gH=ptS(}kF&8M
> z=gN&1cK(yKu=5jGH6%24{c&r36scqvKk+HrbvOmrUo^5e?~-keUAwRPOPO>BnlW&Q
> ztVj4a1 at tZ<<1g%eSYK=nKLF0)pu%i7G%Jqq1DgKpAm(@?n`{4IXdz}-f}Pe&TVNx4
> zun`u3goCvE;I>XNycCjcSbJF^?dFp0!W|A^Kx?nTb#?q(3am)&raK(6)xP!)M`LHT
> zNS{*X;JwYKW--goaf&kiq)2vplfk`?Ma^4$BV0n>VX2_Y=#y63j0D)}ZWlNHr_i<$
> z6*ShtM$dK*5~rBu;=#>o7W>Nh!OeKLNwJhCAACAAAKc!Gm6oliox})z3MA26LzO7=
> z^a&lFZ-tF!8Sn{gBN>z*ITjML&Bc`m8$%N6*sR$o5;d)O-NB~a&AShsz2 at RhPgkxu
> zi8V1Tg^r+whq!N_3D1)`jG__Jz7!|E!wz|x-!(Lh6MC>|9ejP!T9e8vtUc=D-kzXw
> z8JlIRHs)!O=YY*X{t=gp`-ej&p#A^KPQ#Q at GGUf6e|rs9K<819WKY at hv0LCqhvsXg
> z!dM~pPSIhPVg!eZHJ`LVHqx=-j`$PQaQGDP-h<^oZLk6t6ox$x(BSS5yxH#U^aC=T
> z3dBiyLg?@L4fJP{k|av+)PS-(b-Xz1trX11WNChb2x-mjz at k41NxMG>ohLM3U$v2P
> z*vX(9DIc7I@&}a3?2S`K%*-upW)5+Kn3t1zVGr$rUVbB+7g3-t*U<IX+#Bf!GC4R4
> z&k9+8D2K1VKZU;C3+XL!ujR52PL0h at QCnniNKpTME_9=;Wdr>yJdDDOzQA1Gtyo}j
> zp5`$|L7`of%9G!+z^A|({snf*Qd$wpk5MQ?MnF&^b3>wb<?-h0NG$_zbgFpWTTfsF
> zi=?$y<L-B*sYD!F;yZ6&@|#oG1HQMO at a*B!@O-ucnhc{$#^^?2-Gy(T4bP)`SjrAv
> zx1XE?DrjiKB>$64V(zt85=y!gdie$`59(vTeHSlf&>8f&16IaEW9(D!_^;;!A!*0)
> zp=^FC9eWve0Ym9h8BM3KRwsftDVT{-J%QZ^t0_&&lLU?ZY1p{OcIlM*sIw&cYgU@=
> zrMI5IYzZ#DC?)b&#(~1_po?icK_}lQ?xdnD(Fs_6NH>0A_uJ{XP&J<q4~Uwh$-8z)
> z7ULa96ZhL?;rW6c@=%8Fyu-1<7?Sos8TLwR+PUWgJC5&r)J;;ZLS~xr{KOryZ!q4A
> z()y^w at i59d$;eVV-v4{pY0~~z)QO(Mg1+Z;pQ-tjn&>$!>U%!u(>0%iy&NpSWra+o
> zi*}vwUe{}EItI=MT519Ik?hHiqrO4ONz>D&;@dy5kxpgy1en9ZNLT;Q<NOPuS>B3J
> z1?)R#c&*JBWCCcYKP2!SWNgTF&LAStkPHh7#zBC?(TOt6<Y9BfmyzD?`o4^H%jQO%
> zL?Is~tmFO|4eDRa*==)7nOLCS)N;{LdZ0jBYpzf;oo<CxBg&{O41dL}nRD`)eJU at K
> zUhMj{Eyv;|CFV<kxdg}jvws3Z7t+M9xvP(dkE6BoSMO!-`Ob?@G6p!mJF?nq4Nqi!
> z_tt<9%7VQX_Nv%`b?<6_tbX&6#v at ygG`R(`-JOn>@*%&Q%ERA<Pj)XSIWFGz9-i&N
> zGaa58 at GK$ztN_mrTm$6br$hQK at H6mV<jx>7vF1eaiy4HMEZ~=l+8^abI@?2162j{&
> zI*QOmw9F#lDsW-YIN4a68R9X*uX>wubOQ57I(e39>PMwY)87=^%Z7$AqC($!x{d8T
> zK$%w#zk1kzc)vy9F5~}_`xyC`)&l`O;N2PYfPAa_U2+E67zbVCpF$@B%C7@=zAfWj
> zc=|m<L{g6TzM$iogfyDQ_UJo5?}yI_a3`Nr0nEndIML^E&^CQV=Fu5va%h40F3d<V
> zf0w<Xr4p>_cFDXzK9&o2al>Yb7=I6lzXlM$mM+w+DJ#*JX>2A&{T*~-7s_6M7w4j0
> zUKs`4glp#r+}nFa+}Zn51BK8-XZ7Uu!B2(G=u8ly+gddsclWX9r}|+3iTY;Ag|PR~
> zGdRr8x;7J<G!H!F64^Lp2XL+c49Rum0<vZeLay8Y3%S-(f-q7Xp9<|rAFgS*hMDch
> zkQFcr*fczmc4B8(`}eW(v_=*z9Gxb@{;z!$W*|F_quKHI*!!%WFtZ_XMTb>jFs899
> z>X-|=5!4ZOgl|77wmuGRdI{z-m&G}NK6?bek^BR=+CX{C#K+)ZB-R5^_0$E!Kj(<2
> zj&)lzn0}D!<F&D+U?)!{=cQ7w9Ja{<;7)8u&(n5vCxrzCvm1Hme)Zpx?D(0TUpzf<
> zrnoZj=aA&${&=KVA2<VCk?Z14yr7H%ZtRk!uU|w?N^w@;+$jTKssk`}>Y)_aFwBKd
> z;&&>;B4(CH^A4o|y8^}q&P4XaVE!LJPzsCnhaBZ&4%PWaNQ5eFm7eTq7PzQ?g=exS
> z+n_7J^W^1Ex`s9`Rp7s>;RAOJAH;iE6}~Q0oJw%8_R$Bj%99V(N|po0a2ZmoL-X;w
> zM*CeGnr}}!kSR;pRn;pkPp{i0(lxS|(GZ8$qP2S<Z-Q5m_WYiemd%gTHI!;kS8GpU
> zi}{16^!ul47$))`r(U`9n9g4>E5pyW*UKV<H8)RV($G<imSw&`7$N);M5nbNKkVK=
> zg`GT{8B0K~=&wx)OBPrKcd&9+s`v$Z0lFM3G_ at 8^?=Kym+g_?>!yaf5H0o8 at 2@S!D
> zi?<F3FX6;zz)$OO at hg9+qJuRj_&l)>bh96M8VAsy4$j0MSs1rt1H~0N?Ri{}Pt|it
> zr}RU5Y7Gih-w$5Gb+zEXz1HA>TZn!O8UMfc&4RAJ&$A(^*RvtDr~hS|3!Jkc{JYTn
> z{sknT%Lvy3JJ0FJJ*o at 8Lg!K!WGO~EH#~*q_J1DGhoufk6C$UX^wJOfz>R~AGwiD(
> z3OwMxgGXMThZs|ui*ZIx9+C#0Gs9Rd(CZ#D8oX!z7up!NDZQZM&6bVaWVgVT&~eum
> zfHJ_@<%%&9oR{k*M^kzDZQ>;S*g-_5f&UrOKLLDrAb$TK?jOSaBk}u3alaAw56ABx
> zV>WT8{t3uw#*@cZ4K!`1T(96HiQ7 at zW9M|*^P{v2b85vo8tb%*-NSoP!(;B!UwsIk
> z{=r>7w at vuKVIy2i3-TZJJ?9uOax`Vtm8R|A*Ys#;8UHGIbSN8k46MbsJ94WFU~l;p
> zFc0kKPBH%XXAVS+LaQ6J5{=+<S;<|Hld$U^*v1?V%!Lmm=#=24c<wLbrM3=u19L%b
> zIxcZ|`e~y9ahfKguE(K|hpdZ9S`>rl at odq>|MHWxjogp1FC@(~5>LP#-WASgP{*^u
> zVD0Jcg at 2J?RNYwnOwWew@#-SLYEX+KZVlb0%xAQE!UHQUn|9Djz&M-~b#`c;i+{0G
> zo#7UQ<j{QZ8-*hDI<#`wEU!lC`&L?-KVl^<c&-+NZVQ5A!JH>J5r3#d-#-QK4+UqV
> z_AFSjXDR9I{>(j~o>D6LwSI9qVVW!Oz7FCvcIfex8?g+dSdU#mAQLkeXMO!}X9Dl$
> z*4Txg-|~^zY%51jgyP&>#vTLDKM_7~bD)_F?E~~cP&&xMCNXIQDJ5k+=1bmQcP#b*
> z-4<>RPY$J+(?(j0$|_gXZg_I at 0M|c7EgyjGs1 at F!xVx^-V0V<LQ$-s|g%>`1qQ8-r
> zh<}%h|DS}2w;CrJUaI4c8srK{B6LU>%MxAV;y>9M at rJ=+9m+(WO-<0!DM;tRyOX<C
> zf)c3_FKfjJdD{Qn8pANf`gz~N+jk{m4{#15nSzPo!g}vv<B>#(Y?|gvX~=_K!p11a
> z%9?0&8|Pk|G92A}U0_nKmOn@~$+%-Fr0n2~P>*<2Xs+-*XHU1C>CWpl6&KEXv8728
> zj8-P0wx?{rNGmFd5uRke?eMeZKmJWbu?w~{z at gFJ5_{72i^?SUDby+BSbK2`R(?1c
> zKC_=TS^Mkk`L;7VO1mpia~5h|DiQJfnpK at lVl6NaTjsIKT8g*xScHZU>A at 6Ti9AO#
> zu~k|S)6GIh)B at h!$gi}RSssD4ig%?=aL+0=i?d411&c{EQVZLt(7qk8^r>5Q!!v~G
> zn(Lq(U|yZ_yz=t8A*V!~G~bbG+4%ac at 9SQ7eFWRu&_2w_c280C8;ogRaaP@`Q#$xG
> zMx(uPKM$7vR)LmQwqC0aEnt3+b$2N!)BgsO at t`#a==2NpD9T-C?L%*WFW_r5`mxtK
> zw4uDM?xFHW>o%6JtJ}b2m*H!^#r at soS#=MxJAzPo=;gyye@>5GodDZet7-_BD5Hp#
> zl&Ck+1%QXTi~?#tmnoC*K6ftk_ at G<&Jg-S=7nUd2JqjufIq&}h-Wn2oLHk*~q6ONO
> zg>DO-d80(A!WCVWj$NC9_8y_ at rFrm+hD6e7eQ*u1lN9#i)Y?{Bo_$YVO*e(dhbkeL
> zJPO@|1nE>N;Kjr7v2CC{J?gb#d_VTq;CB&5cz3z)KO;oXXZUul0CX%b{69y@>?oP+
> zPGK0ysu~&BqvXKus04OcR!GV98JX0KQt*5G!Dz?)e?}`}v{uB72>-uF`=h-#M$5*?
> z#>z%r2n_A<!&j4yH*clITT2(nt7WQ<xI5CV=&%QN4JU=}2<;1ZD+LiY{xt0QF|tzr
> ztGc0?!XBa|NjnjVt$=bzA;*xdL%;6lLyKIbaIqV{8=m_uUxlmf>1BnxT%nba>ZL^#
> zt*%Ltn)0944auK2SQ{$ZN|fBTQb>DiL`2I_GQ!oMS(BkFa`HNF?T!N2!z98&OFCti
> z`L?%*er|acK3z=jBPoJqCy|)`leKp4Uy-iRKDI`_F^bMElodgTzR!v1p7Go)EqAPz
> z%YTVnMz_kuYYW{?m1+?l%F*Z+tnaFG#r8=p6YX<a#<slEa%tDDUH_6Y{0TdpJ8C<j
> z1;CS^wTxXg$Vq)>r-hTGRB;AcbNgK2F$MdmGWV)MZ~PhZmrAAbV~sWT*=0-Fd+1*w
> z^fh|+B&dUjYF+R<z?SqfH{QG*bChKtjS;LUF09)n3!OS>HKW7O(c^a+;D!n1Ol3>a
> z(>*)5 at RKNCcurt_0yeN-FF~o);7vH=$vEQ{oN>*T>-Fq2CYd{!E$6=V!kgzU6;#Rq
> zj*j at _=lv_-Lqa?8u0hf7bv70TxNTeqyt`t#*CUF-Z6QTJ$hXo?+6|kKuN1LS$=FED
> zs3D#=+`}YAb?q}ZWG8C53Og;qxs`-Oho>vTj^nB&ymxU8EI3z_M9+GX=&ace{Nb$G
> zfVcwA8p<G70Q)N-2~>Km;_rFbL8Dvdv{dX`j5!JHC<tHgUM;2mev~w?Q97_@?^55b
> zJ(EH2TjAZG0caAyt_?^VWl6Rkc;d|?n4vjrd~?s%IhnMs?zzrcR5_f2HAujIOFUx1
> zs(}+yby$fZbz&0-PQ!F0wY#EEXsQ5TFC9s1v^M6g8t_i)8-1h!QAO at XKX%AsY;CT8
> z!`9}yjJiyRpJO#1-j13416!TL&q9K=gUPX(l$_z+eaCw4?VUpT7`|;JGiPig(ja1u
> zr0BD&#yH4PzRe<8yrK_2gsA21h!-pUY6M=d*b}0Xi99>QIFQraE+??l486{NCV`2U
> zNmkfSaYwv6NW at zFXx*-pu(Ss}9pfa#$<CYu7Lqt|uvc~s9k(iJ;#!h)B8Ao2q<>!C
> zaomZM(XGdfK=K29eKh(yX3vIb5rj*GFSpS{ZUQxt4xgi}=|iI#HzpFA2=6;1m+rb+
> zmZ7BJH(N3P2T#L3e~w%bE=Ir3GrKcSo#Cc1Xe4Ufk?KpSkN$6Un8R}*8Hw5O7f=JZ
> zv*_??PhDa%dh&v7r4=&6CwD<&WS|vDt%RH(bVj%sW6TS0;A`j~s?&*~6BIS!gGIZ2
> zXNwqD5U~1IoYGYbJPGEh3DCsv0gd7IagfUAsNYnt<;dBQj9&<k1;&Y>bXDh7zJ`oN
> zsX05K7w=a3jOqaM(UnE~>+sLxpK0X)L%=7Oc at eb(@9II5uMLb1-Gc}!3wFOQ*|MD-
> z3rGf?246o;ve^qd7O;~_72jI{f at nR*efI%=6m%3)fqr`Rcwn>i&=?VXq2QIl75SZ(
> z5J80HbVjcc4gs5OWSVbYXvt9#H0Eq|m1rfiog_-sxlYR`tYo%5Y1iY*9sNHB?#T`<
> z>4X(NnX_Z2#OcJ)KD;x>X^E2IN{JJ3 at 3j1#y`v8;!4o6+R?9!wy-~Y2RTCk~%A8<%
> zS*%{CHHw%qFiUZf622(3#50qvK4~1z8ip4tQd`yUoR*WZ@{@Kwjvi-ItH==qz}Cta
> z#meu<4&8I3Jfk%t+}yKEyJYL2H$L78_R;>bsx$;|w9;u>Z)P7&byydh93{7!cI}jG
> zW~WplCHT$_zw97xlf)5OO>|gu at I2eJ>v=qveYwNnu4|0&1#ukW)OqpwasGioM{*JP
> zWLk56Pu^j%ccfOY<yI4`k<~3ae^_s<4i{<c at TCCclloRQtJ+FZdR%}xw>d0mlb}rz
> z6khA_7Rgp){Mw7sFKcCw1D2#Sx!NHPD>nywISdVdYkb~gBQrXz at EEf^nSg!ZbXe_3
> zHx@`%DWTd%vWM?*kZKd81g)`t*yp at Ft!fIX5AP|i9P>};&2SDmqiCb4hd at 31cd2^+
> z%PfV~jA-r8XzhXcs!oWl>i?hCe#aeKQk=E4msHT~L)?1|vb17srLnQ8<?+3djhH{<
> zc|s*(-Bc7l9excOt3po^r-!b+G3-~z<GNL{bU|yR=EwI(-eDq^U|*zq|IKq$0<Vx8
> zK21tD6+xowgmx1&ams+Uzie!Oh3-)e;4rohXQ6)ka0+Y*HBaH#exZhSKv1kV=Mw-~
> zYA7OBXgfPgO^U5M)yHR{RC`{b!ju2yX^L&g1o`b46?zYC=O<&A|6IueJpTtcv^30E
> z4RIhgMZ6XT{@%Nu^yM}i5P^YbGNu!Wjrz8VHX;!n at oE0h5z3?<9uhV7jOsO%k6C&=
> z90cEm^8rumeZ!97N{59S5T7eI$jfv0CZLoKrP^63=F9!V5{kGNehyYWo;PZ>;H>;V
> zp4Z)YuGs*=dFQFuRXw<sV4vVdAX^{aRN!Zno$4V~sXf`f(4 at +F*t1!x&@65TghT6@
> z_|L-sh|oT_Wis)(Rt;?C`V!ov2xD6{py&E at h@iEPomj?8V&^3}tsfCYFdDOtY$r}@
> zCmGHR-JwGM$&Xm)-b9>;HvU2KI?Hyl+vOxj$p?^(!Mk~qEaAlJfm;b{w^?8mrba(>
> zg~yc_uQzw_GWW(`-T>xYkH{yqrWjWRvAtUAI}qogMegA6+rUaOp5sux7qrJA?vMlc
> zpr1;xnS<Y9%ciOV0v^v<LWxviPn1f{D+YLH$()4Yy^Xa0qd`Hkkrl8Z2ao1<SWYmh
> z-DiYuTD)Bno!c)G`<%_3uf(^q{8v`HBvNsvuq8oCmun=!ns6W?bQhpq5>9>1sLVIE
> z?!D8VyP0F}<LxA$apt`G1W+$EJGQ^cwR^X%vCrKM$wj$7yEbz4#!mf9Mto<cu5)wP
> zyZ<78F|Bi_A at x4_3wCRe#3*lVjKoF0+73A&^M)tDmkEjp`G8qXlL^xe4e5Ils1<fU
> z<5b9rzx`v+O}OK)jq~9dqdb^D=g<YnRT*V6DAm-#w*loY)2<#<`J>tQ_Ug-%m##t-
> z14MyxUy2T_x<b9ZdP&%xfSu=7C%7*SkpAo4llzc&h~?d?+MJUC_!op<>gHLl!g3`w
> zt8(%H%l&ICw~OW4Ra2!_w*R-tHA=z&%bhusNf7kmy>c;PEeP^t-#yY={c-R+<8E;E
> zpbl=6{6V8HMS6{wT|-aZQJj^%&NssMnDm-Xl<v(I=>kBawcMw$&b<?HoJbfH{IJ_M
> z_WA44ExU)Je+2Za_3Yt*sp{!_vyRvye-o-xi9xcQF-n$A1<_|+L-lu{e$-K{&t5lF
> z?3+v%;I07nQVBzop(9T67opA>zFY|$Mspux*zDnFvHFh8I&Amdfj-wdEE7$rgNRN@
> zD1~r?i at dl!Rwtxf0;^ZrnOJ~YDzw^by{KL0u~&1xuYW|m{;TLu+U|e!h|=1e<9&Ry
> z;3K}2=oUZ}NU~7Fbc~Y!cn($Yd&lsM-Ck&qNDg9Vef$`^!}aI!>t^&BbPp(a1 at B#e
> zR$JIL9etE{*M|><_kM(U2Xr4I12qBG{RX&_l}0oy`!6>qhZpV`7X36C`Zq6CoIsYK
> z*7e%%u94t at NyiT*4ULu%wJ-?TFx%CL*OaK8p7Chw7BvGBG)s6-5O%-W_riM_6x;A-
> zW?{w3Vog>czc$!Q5n%|ef1)fY_F*j<UH2^PTXEioXUr5{XMTCn=zi(d)|xa(;Ivv^
> z%0S9VKoixF%yr9C0bx#%4^o`?f&p^O_N2|=T<j at 0xdf3l((4n{T-3xO<55<l{iV%Z
> ze=~a?ZeaC&x9o?tNB*g`%JPq}cGU9`r54hZN|NvcX^ioEX$*T-D=L79h_0dYcLsqU
> zqkXRE-^b$(#O_Rd)SgneB$hUQg!JNgelpUFV(Fwtq!%J>MXb+nk#@z>W>)4_q*o*2
> z=Rc8N5Kn)KbY(ov%FmCdhmm&1(q_o7>gFMBLma|Zq#g0}-;st?OUq|<O7Zk3NP|Dq
> z^1G2PkEeT(o)b at pk+#RvUm`s_p8gu?S at AUM&n>aE00~#!%y|Aaq-P*qu#zPF1nK3m
> zbYcP0%OLx*V|_Lty%gy=NPCcWBRyj!NxF>mZ7BbXl_Uig1a(!AI;~hg>irD+T`i5k
> z71qC|kTjasX(Ur<>f#c~0IMLKYAC;Zy*2Qf`ZdE<R0sZ_l^(O+DwDsMNgho*YQS%%
> zr$`XDVXvU%Hz+6lpi~O#OFI^;wN%1~UudQ(+^7}OG5z{c+V4p1_a?RnATQVnjXed&
> zxl_xnL2iw=;`vkkPgV%>x6;P#R(c#bWV&~aH^1?8Xr)sUyQQ_3-5sVhCxvHXq~duO
> z?d*pZUgG5rY1ww0*8wY_f~sm_i2hhglc#U90c$cFpz7{Z9f{yjPpL+!b`RJ8m?V&Y
> zEL$sf?|%Eu!+;j}ZUidNhy7|E^ATp41AGwGVghzj_!`iQUvIix&$Ru_TF*69^G~mY
> z6eQ?1YE!sL-~Z$bhaI9^fO_qaepS#5FEr7L{ueKK`$u`v1K8la*gvXK-;^L(az-FZ
> zO{V|D&IC3K?tE$m_sz4p2<_{E{U`ZJ&shB4-?IR}>j0DBDIg}6Cod!5;}(P#6zi8p
> z)McO=48UiIa<qP%Y5-k^=!EOH4K0)jq*q3){bbd(Z$VFf`A?UT-n7QbHg~77*>=#~
> zxUMaG8>Aa5{3_OO3qQ}|%ho2>+`Ml-q~DoJ%ASpF;98?PlrgGF;F>K~-f7)<b7-Ne
> zM=cgbXyy)D*t;^BnNP at 3eR=UR!%WCuRsA+d{tZ`H{}vO<B1b}IxPBYXc at wlg*jw71
> zT8r1Mr)P6KmI}}V+Y{(&+C}%t^I>b3qEU*@zQmsHUW1&#v|}5mhufeTt7On`Xe at Y0
> zaGe-uy)q7Sm(=nK<PxUh=}WK6W0zHU3FgQk|4|hooA@?DjaI^SIeT at D^DNe<qN-qV
> zKNW4Z`EEUR8GNx0y;@`!ra3gJ&?{{2iwiL(YkB!H@`CC0`+UZ~>bBWD*@o|!tT%$X
> z*Mr|8?lAm&t+sG?!>6!cy9f^?E9{?cZnXM>z<z>kRSZ7)sIYgd&%J|Fuc6LOjrm=Z
> zPaFD at 7(`#ciD{C1;gzDz&8BP9L!JmlKHAr47jDq&A+WS2zcqV|@20?7hJU4uN%wL6
> zG2|O$%%Daat<-E?60y!x0LO0*Srr{(eB3Xau;Y{CJ75ZSFo&qW#z0<=4mP;ajy&wB
> zJE#JA%9xc`wz_8;_7G{n&g3cMYsXt*GgGefpTRB at Lmn5g?SXVpat+;oNVQ|OPG8GH
> z1fP+yGAQ?<Y-X*yqW(iJa?{;6-g;;aES-ogPflV_uVv9f`=n*3LwV}RLx`7XPpX at O
> zJpyf`i|@b0Mq-6^=tH+cRyS!`knLL7Yvy4j%`y2qVxpZvOr3M^IJ8o$$7<B^h#qiS
> z4+(WaGsoZ%n>FZe0@%G7v6u)BQ0<wBZ`6^5{29o{es)32_0;iIgg~RC&9k-qfj!6N
> zuJT9r+(q*7IVgdEi(WT!D6#yJ$^xWDAqSK<Y<7!WSH?Yv>v$%;n0t2p_Uk3#NuIiD
> z_|S1y*nQvLyTDWD#2tASck_F#o;o{wmWR7Jy(UjxCVS at f)D^ParTAa&sgqdVW1cz(
> zyKeN<l(T0Gkbb~Z=Vp0bczbED#Z$MK-Cgz6En(NYJvEiA<P;ZQ^H}&ZPu((>`y-TH
> z4nL!(kiOqjSHtp{U;OG`*1sS1rsMa{Uc0C64)){}?p9(S1U)q?SY2k9z|CNFtzu8_
> z at YLPKuB-4L_0+x1(j9o?o!(^pu0<<XJT+ at s?f_03;`^>`$GbJB$9wAj$#SWu<{fsu
> z0Erpjk{<rdp0xCd5U8<e4tCRd&=I8go$zPpL>civRg+(+2IRn#Gpu~paybDKTz=M)
> z at Mo?oMIlzs#b>^W7B+A~_%pQlFk1W>VqsOXn(w_IZ at z_i%%8cq&WFOE!Skct#sBJ$
> zTIyAlejKG&_CEpnhyhX=1ALHe#d at 0kfq-Z*OYCp at v+XbWZ$b>Sk%&Sk0OBCR=f?fT
> z)2YqA#6Kb=`37mzja)#XtvAvrfw;0a?xd+w0^I_i#?O2+UHrzUSwERI!rD<T?ur1d
> z4y+h^pT^bW;`uCGSGc&hzD1w;X at A16Kz^zH-WC3g&A|(EaYtI84S!awk46-8rGe<|
> zOP0?AU+R`8I;{glzCToeSzN8;0ut^~Qp4j8(<8t{cfH}X{F1;k+X4#mId-<z?_rW!
> z4esm-k7F<g*!DHo(0wOWM44T`=djm4+TFt9JS!q{&!|T9AbS0CRYU}lp&Bdbv=5c!
> z{x={c9Xk0KYMrHsIJsofU&4^7 at 4w3Q6SBWN`9YC3RF;Uz%pTZjNl}K(=c6oted~?<
> zXFqUSM)>#q#=VS2ED|Ztv69sK==mWgqo38z;48|PvwEO4m-hUa)X-UrYa|iDsmk$=
> z^PgAPb5 at _zs;~LKJqN5Kl%Cds%4xk;r;6pp4~o}nWItI=$|-*$L4^E#@ft~wd(=!>
> z#F9F<jW|CZ(0D#j{+&A3!nH=ci=JGgRKVLMr2JT{EF{AJx>}pO>3v9>y@)}RgMVYd
> z%0>f~?yP$Hho;{>1G^tP{^zt;pg)KZBW+-EXKtorLnC~8$qdRhSIAb#te|;Yb-1OZ
> z(EzAo)hxroe-J`uK?7f*T!YMz at Fr!VOd%6Xg8a?i_Lr8MGzn}5^#3`5wx+JVX^leT
> z&E4GYt9?4lR02u2nh1NIB+EQvS3hgK0GMT$xi&Z8o86L5AQKD+*cI)dzQzlz9z+b$
> z%Jp^Pi5-36s6v5*pl at _R7P_Rnv(EzFy$TXtSi*x7V=``di=n6GEWT$f1|8N0v+lHD
> zWyZ57ijJ+>`D+Z)iY0VWx6qf_BtX7mtsR#2$XU#^+>j`khyRg*JNQ>bhsQ9w3;PLl
> z0<Gzv9!zez6P8+dqyB^p4TfwMOUZ4+_hh7!+t_|#Jp^C5Xq)ZGpN=fvVLNgrLJwv`
> z>MtI=lgV8q&YG|-|6t1w_rXyI?>x8{v78bA0Mf-y8PTZ2!(MAZkG^JKwD#(Ta&Vfv
> z)ai(h^yRr?7jNu?Weap>JYtJ+W;F{rA$Um);rcHoxmPpEa=!S3L_mP$PV2*!mpBSb
> zY*@i(;+<QRFVxE at c^oAZv^v;_+ED(ZzJOkyYe9q}8PJjOsDTS)In93m7Fgn?5&^dK
> zBuRukZecKKU!Sx#V at Bh=7nkn7-?E%qcC_O+HRAX6ZR4c$jDIu<jr!eOx3kyOlIP<*
> zD>+?vO&>H!-9j&RRQIM{u_dER*OyFRiTBaXJX)B2C8MAyB=TV&R(syyCT||Scv=3Y
> zf$ZleKu=Nue-utm_!?N*d=mB^uMi_mYzEbTLfjt+M$YPBk0fpy7db}o8$=8%Iu4dC
> zOyAJrm0+36VE+TkXnr1iX}+HwX+HB2VDrxEO&WhAW%g0Ut$QjeVMm_$u<F(5K<o4%
> z{IOsajhUl!w!wmj&I#z-Z)u&LCQu`+<OEs{yB at TS_9xJBD1oaez@HI2bNEk~b4&f!
> z_ZEriH1T(fyMg<g at +2afC61<Lh;*@5PY$!GLIj=P_{5-LKo}Ii1~oW5KD-sa at -ISC
> zl!Ug+ncRpM>4&T)|B<UdN2Kv%h~>qR5wHWvR+5h;kyQL~#1g)<QSfmVq;?qbn~HsQ
> zzjqU2l5f5wU)}<pdKbxrhZ#OjLi63QR~={woN3i>p-o+liil`=(%)!0+0B~<HhG`)
> z=FmvyIZE))c~@2a6+1{z%0b-=LywbtXueDq->#&_>N?~a(2HXMj%V<t^cgpv!t>*?
> zh8mJf^DnOMO at yax3bo-s8#9_hC#l)MmKTVD9~VrA<R}fPB5)DO1kW%N3ApDmYCXAw
> zFJA1H&S0KVHvV*+Hct#Y_&RdogKma>!KL`K(P+^*kb=lxiGyOyYq9^yVKeAoAuzWE
> z(oOQQW(!r_4ajF7Ip{@nV-w#08%Cd`=-P-c*+&$}h<z2^li-&t!0)dd`{-$YF3pw-
> zDc3cx*F+}MNm7=~t+Nr{f^=FgEF|Belay?<Uh*|Z*D(pmF!5D1UdUKSlD_6x=|=ec
> z?7o^&NKDcPG=1P%HMbgPv^lRQ5A!;^R|wl7)p;82&DQ#2Y4fr+d-59R9rUuCHpJ(H
> z99{tR%pa8a$u#@u2*AOFkb}p(N*RPml%`8rlw<XaBZ#XJtJ(;doM9j?HOUQ&)&4$r
> zGT~TkJ<M<^b}W9inM;9x4&Te7IvH1eOZ9!CYOeYlF~!D at vJ<qj6NW at t)Mg|)d=>V{
> zECOLp<9%C+?|d5W(l(PEna6tSSLg`uAfjndXCajBn>iKbfN+ at 0)ahgnR(4E$e~-M(
> z$Is^c*vYKck?X-^)RDv+$cKZxSV&;!`RiXt`e*_?sixyg7Hh!odcA8dF)kRE%(Xw=
> zR2e7)ben+a4-3Ve__(P=M}$ADuBOrIX%t_;$OVO`K}WYVEeSF6$lrKaGj{i_xI#I=
> z^q!0NftLIUqFkkGaCk%zmM8qUQ#gCvm*79mG*OdxA)1e>_fAqpL=xh?(9S}ux$tU{
> zm*UMN%v>7t3<H1olgs=!OtZWPGz`mGe2KrzG%$8ji1Sm#;WV&0jM>meeyfhdOy7+D
> zn}RmB6MV6?0M*Y=L_a2YPd0JYSTV1;Y7<Fze at +mCoF>D^EgE^jox#4)f+&xd8vkvn
> z$0}Wb_flZ-BZ{!?0<`-JsR<VCfJPA+p2DmJ7A+3D8}wIZx&DzQ<;jmYBi$%9p4InV
> zo1&BRffdTPiLe^K*INS%i`WdW!`v<s>&ZeXy;bP3Vb<1B at WEQ$E4)&$26q#*I%Kb+
> z+{u4{Pj at P0&Y=p_y at VX&O+zCWCrc^VYe_iYqp)Kwu=D#;G!QfB1h<;zaBtvt*Gc;_
> zxC^e{FW7sin<VPpnS`tMV}#!zmbD(`O(?$<+Ikn_UJ4n1BQBP1N<yv+BP?yofn{_l
> zX4rra;|lx~#em-lTBJQ(i2<L?oyYwPyJI?y#&^X+HHVt|XBB5fuXdW4RSy~Mu^@Vk
> zh2(96w<O8Ku9(V|KwxXZ9!?D}4}S<u>yi`t=V&n)rEM4BjUD~&`b9&p_zahUS&DoX
> zS?#T%u(jxT>M}5ymx=(SwaxWyVk=ovy^}<{!+mqKIm7B)3xn!{*C6f}p&rmZkZJh0
> z!5VPA|HODAVAl|CG~i=CdjlmNhHWpTAyh;^7Q^DdMRbxXhV$8b%{Jhya`rAf5zN%A
> zSxQI0BbXtRDuQbKOjdReNz+~vrPpeV(sIRkR-l_<!2#7y at uTbgi1Ghgjwn5nfm4I}
> zmqh1=q!Ys4vd9HUvoDYezDVBhk$90T<@HVZfFB==6{Iv~VcJ;Gyx)=5xUs#G`I#ar
> zBP?~G<FO)s`Y$0{flp}I0SY6>KbwD*e8D0{D>}@pHT-8)sFYF$;wv&waufke1NY at 9
> zBmMTE-alJO84~=zPz|6IzW}wHTp#s62^KFQY-bSWnTj;jCo``YVtxWEKAz!ge!R>^
> zeJfIvvD^L){XP6Jzh-ooJ}}p5C6VxK*lrcVC$F4gdYWKaOW|$DdWmyupp|mX)kk0*
> z`vow5GP?%mZezBtU;L*9_#&);_uAiOaFgaauxVK91!Whi&?$&~ayvd?EFq9|5iFh|
> z-2{I7L>2J+KLeZa`|kl6T;lJ&TN*fWFT9j=Bx&zM_ at wY`X}btd`D&GNFK#B~{N&w-
> zWC9qG(hmzZN~Dcmk%*LUJ|=D4B<?=+Ouj6LUy at q~>Z`iRO~=Xy#6iAM-(`irIcM2I
> ztXCh3^$<0b#&hnE<)}r29GeAMf2kon+pA!2Y`&yRQ;6Q8Ab#LfazEZ#16{9#wX`D6
> zo{6ra_YM6UuzN3dqaHm at 1a8q=n)%5Y=m8+Mei`a><Quu&Zt1Ty{r$8+F`eHC%Iup4
> z;3+)+M%S2>hASICQfwAj1Y0vsW&-Q&kY#|odQ-fAS=Bl!xDP!w{P~(*%O@$U4AvXJ
> zh*Hc>IHZ|Zg~PXF{#91D#~1-mcsMu+8mw{BRq(sf+anh(lvpvIMD;bK613E>BNrq0
> z(oV#PxUo+4|Mztwzv9Qo*Q!DK&}x)ElZ+>m$UIUcJ-QcBVt3+<3_VM0B*#oqy=6ex
> zusVGIz!ph_^+IDnKd>2R*Ur4Ev3GLBedN|AP_N`HKN%~(gQR+bAaYQboFG;16o-B+
> z-^c0+NtOV$s*ACk$H(@l*BVT+&zpS!U+Z8e(&;RDI5UPVBcHu_!m<Htb&O1A<3xM2
> znZ}4w6 at BT9w>o7Zck?ChCk+}UX%mANPIkuR_2JKB?Z7KKovo`}0}Pe^{mQ}`Dnq1t
> z%OCj3s?Kr<^R at vw7y*ym<yhkZ5ntTle89x~Im&mI?3M;}*mpYYyAj`P<>!%{Zy+~~
> zPS)_Q6YI4a=UK!F!`OxjhKdfa_=b6X{yi{`)%dm0$PMZn^XPo+65KbM)9|b95i{E(
> zY+P}?X!(X46wfEIy091UOY!9|VB0^(_W|C!u at 9&oem~Kn-Pi}S0g-D#)!Mw9yz^o>
> zt-cbcxQIK(U1K|J)qhcZdYd;@y$h=PB5%Z5VjNQf;FG``5VL{tV2F5t{6v;7b&*k^
> z1eA=gs36vpCExJUqxqt=aZs!-1Kly7AX4xSap*m13ZnE%paXb at E3bTW@mAUeYU5Rp
> z!t2qN5i6&cbXK7Uc)8&M at Twj;x1B_5w7i*Px!%vgscr^EbhA78sVJy4tTI1IJVs#w
> z!KG<%3z&}1PCW)+2D at b^mC|-nU_m+?bn6DlW&DUTyOWkf%Hl_y$aS$dWWvg$lvWxP
> zOk%*00Zyci at gsN>AL7RKHt<$)x)gT}RCS%aiS-PeiG%eHJzIy9h at 4nEtPR$)s=slN
> zWAY{Ri=lA?{FN<fPtl}M1uTC@!W-cq9djW`7~xJQ)D8K-+Y1I{7jKvdxMcuUn}k{V
> zwU^>;=7GWB{m1=}ITZQ`>SSwCqCxf&%smBkiohqU>bj0rVx1={S<rlj<2VE#t&^s~
> zlM1oS|IZ#`Uj8vCV6`Xp<moWmeYsfG9K>Y*3V44c><i`}nbB<9WW&j at Zf)%@?MvHc
> zYbr%BlLE~LYpR5JF5w2mGcs-}R{2d<jUKdmPe}``#_D9OyrWPAmpwIVVDx9aKNV~z
> zNR9=J`{X22hWPN3djtQC4E|<2+Hb}iB~s4;vUmke7!aOW-NR=@A@}K0$DI_|oPrwt
> z3e>260QMhr at z9SNtd^a8$<SSLE%PTj39p|YuC#imEDb_e{q66m6a*#9Plmh<IF6tE
> z%xX8jR at a@}H=s_8*J-4A1N_$wI7N?sts4-6dO#- at wImvD_|Liyh!tnclBB!A^E^n(
> zKT2S{g7jH{ST^$GGck)7>-zo%@46-G2WV}45c`COwPL&l1A1+vi$RG>{Bp7n{(~j)
> zd10`jj!6T6NpH(QU at FW_(&2M#&G_;7F9ChGWU*hGpix#!BA?1#i(93FbH-;X=mK`G
> zFvf+ntHF8>I;f0S$rAQn<Wp^z8u=kQc7T6|(aO`<8Mtu{zb!??rryY>kSAs0e at VA>
> zg+bG;SVf81yy0W;JYPi8-~~B_PhgP?e`Ew)>Qs4p3>q at OC6Awq|FU}dzfb at 7pVF3*
> zFD%Q at +dO^({wL$V<iAh-_ZeKroiLF+KIy0)zvkh<HrVMSx0qi>K7QXVK17N&y6M31
> zle#oA8M3$;zFX0fS+3~hX$4A7JcW6)r16u~97pN#0?F2R2jqY=VC_GXGeHtH63-@{
> z=4DoPlA0J#eg766#28GcMxV at aTEy<?Vrkjl-+q!6z8&-=8<7G1_=M+4m#RbRe~`NH
> z5%V+T`6;SUn_S=EA6qXU{`29pz^dm0VtBcwhGg?om^=lTWEpYr6JfvVXR|0v<%R40
> zvejL}6?Npd-`W17_Eqh7fl~XzV!_N<`C|M}!2e|Ym*9U&XkTk(fNUEJepc|g8adJO
> zRJ1ZF{IQ!Pe>I$>!Im~?A%#9 at pb}s$r%!-(E2qWCERQtF9MgqaS)8dYXCU+WqI}FF
> z@=VJf((`9T;*)xH#f7=&y7K^4yK09w6<*75Y at moR8u9le;a(5Rc|>#Fx@#ucq}c&5
> zS!4fv1 at Rh1J?va{au9sd`xG_>(LN^6#q~2qY at OFi!qX5h8#&=$@~|Y*Vq_pq2pI|O
> z8S6s{CD&m2yyZ-Pe|hmEbu&4RQ;bYk)Xc at SMe0>1jbvkJt#4Jj=k+GGb|TiC!SC4n
> zmjlOUlBT$=R>VfT4sr0#bhW|@y!EkwzKMf}8aXhd^>_YR%nRng?`GB{B9;XFL-5tO
> zj@&^n?Pl^Xswjx17RU|%(rZ10ug38i)Z8>S4Zp2ZTDBZ`hj|Y}Hw@`&2g>lUz|j0L
> z0Y#&qfXau}@=L$5r_ZkLGz6rhx at H?B{srna%r|;8=tZgf(SkM`YBFp{^h1j!f#@Uq
> z8P$yXERYiuk_+AS{>bX<Zf_pmaD)DzfY?{~_5{<uoh<dViz&c>kmK|;f-mhFDkPwi
> z0P~sL?p=zwet7Fa(C3#B6GQjLrS`J+IjZ0<d*e916FP^Led9921&}$AcDv<WY62cg
> zY`+EAk3|!0_OuIZ_4eYVBYGPdv;R_T51d^3UxuoBa+ at 1g%D(4%7O?Ue^_0_UsHcg&
> z at OKJ1@#U at y>ui8w=_JYboG<-UGU~`VWy(t at LYFn>jZ1P6?Zu#uKpx4P2T!^)T{XSN
> zu7X}`-c%wq)pphNnOQ$$z4T9Mq#avYOB)g46E$e{fxkqp{)alowmx{^p#zu`*fd(C
> zX>W+<=E)Qs9*=W2F*+BX9}?>oB&HWI8^RlxRPn}4$mEU7?RFI~o{S;ONiMUCz^sh<
> zNMtaSjQOvz>{K<n*tyEU7iG248CX4tW?7ZC9Tq|{PIA&p*gEf at dZR7>)X0T^LH5es
> z!QZRzMe?w>x?*b!{X_*@X;6&!B1&&MNmK-seg)B7Y>@DezE<X+8eScc+AM9b4JbDw
> z?o+16lAaDLuJ1g=l;W`@CAIynGSN?lb0v#TY)ge7nCK#Tm)Ty;TaMX;4fscp?;a>=
> zoqAvj+pUP!0`I<9?cvptSEv>litVIg{UguGN>I}+A=Rmk4|_QFZ5^h2dgM8lr}?5?
> z^jawwI2u~y|Al9d$x<yK4!S^|!&Sod*=m8aLNfUV?8KGg!kovBCKVUH`R}8N;Jg!C
> z&vvir)g5S-rL=r%YOU&-q9C3%-y1CJ)#H65-ruGQJ@#H$s}oD`Ar*ex^a*x{2>SPH
> zcZb=XkpyeBy9>QywIGq;9S*^63NF*qOSR{2?Va1SdaBST5?rF*qSb2*-l at GiqgUq;
> z+ at _#gyQ^k*HKt%CyYp^fcXg)V9Co*99J~98DL7TTYwr~u!sDjk_^NwJp_aN?ds?8q
> zfnU^;uhpDiy_P2@^5lewA{+3p$A1d`lksoDe<J=x{2L>RlaRR)<=Pl6H5;jsT52Xz
> z87Luu?_T4rffTs{UgC>9hYjgUs*6u3ps==uSAo%DiqitcE2kOo^;Yb1O(vy5rX<>R
> z;<o+ui0zOS+Z`0UgT{8p%+}clX0hD?`7+KvlgYyxekQ!(O^3YnKAe7IPd50WlwN(M
> zRf`W at r0U`+<ILxD40;&R9|KJU>=*c#nSVMpbsAcyH*yE2YqgqMAH8VnHLVkYrSR=K
> zn%IOLPfZ7=Bet5>D&Qp|vodWCV*b>7YrU^^;z_p%${qB)cOBDVd=G~orckR;p}~4`
> zic(UW?A_d2d9kAR=BDwpNe%3FXA3pftxdn(eBja6EsYD0vRFR}_}(aI!4-1!1i+w#
> zw0DV~$$$Yl5&&tFasHD1`u6FFmS{Z1KVy5kqWOYfR6n3y7bo`O3?c3-QN^bxT6~nS
> zxdIOCW^kPO><?wYKjd*kRv;JSPdkws{tfv0l-7>Z<}g+rv6A!IFZ1Py0 at JDk80&sS
> z?q>4Wyzf`16syxNW<WY-1N{t36-Wzgt%%758qCIMcxYw{Whdf{+O)aM0_B*g&Ez;X
> zlWC9_<9#vw0lxOxt~Z6>5B~x&?j(G%<3BUp8CgBx_1c)W2HqOK^wwbR+V&qiYdM+H
> z`iIjq(ySzLsK{R)Rv6dHW*j|7EGBQItehMP&CyM*<!L&c;XiaQ3 at d=%s7Jb)q at xYf
> zX at PwujpaP;2<3~9AcpPdwFkW?(E9|&U-FRsfE#5Jr*c+1=HLRe!O7m>8d`q00x7WO
> z<?qtG{3)V8bs_o_&+r_h51>Pe$(~E4X)ob>nUJDQV36~>pcfu=GO13dS0HaQL#kxL
> z_Y4`PvURe3Y=g`o at gm}|Vz$1l&J^ALshuWZBl9*JR@@AX&Lf3id~H#uN!t?eG_iF{
> zQ_+FSfVF`(7H#D_tZDeN0<hs()KbKtrGKN}+&)ziWU0LYn1pXHg9Lzr_x(VVVFr0f
> zmKrFeT)3hK%)cC8(rUJ$e`d6s#2_i^+v+YL2KcW)yhnIeueg)IlV4!{9}PUaoo;L`
> z*-FytVHEhdV8)&o+qKqYc;>d7+mqB3;H%L;z*nQ=_-ZtZ`vy+4Jg~LR+O`Jx1Gs}v
> z1pY8qTY*2UCVX)tX$<=g`Ahpjr|e{Qqc81L$F%MD7?X`{wUwlc45zfMRgE5FN at Cl+
> zm1Kb3*M{%x?@<%l_P?Gl*(76s*YN8SCjjf at 9tkA0NuKQVlWop6K~i*BbI4 at hl}QKI
> zo`7n at xyLnVWVk%2J5U<ON}MQT-af=Pw4CQ)mHXHVe6<$w%#gYrR&bA-lRbwyGwu-Y
> zRpzJ_vYgY9vRo00Ajj8(A1(rf*jlYKQTQ#8n;!SVZi+z^VrDc|0%8OA&r%Gaqed$t
> z&WKs_BzzxI at MPGqOC&ii4Ju>%Di-++`;wiK3hx?vK{nx}EC7Zc4 at xa7VC~G}f$1TQ
> zcZD2b#an|jVruOO<zF1j&L3jp^zFX7^?vm;FTT3xt)Pjh%MqgvDZXwK$i<BOEJjOW
> zg>$f*GCCzlni=)-u-xTOV*BWgKcm#^{<0vV*sG;)99JjrV-RbMMvvs2Lfl-EtGzRZ
> zOeJHkRr@#g_d{cwbUGnuY<-u_>w$Ly6{pkH^Z=)%wkB^w>}el&Ai4GJ7K=|fP#V;=
> zPB~D at C<3ev$6y&~SbTZ$(V39zIH-cwM|){3@*s<5#$?X;5 at aDF1ZVn1NFzQ}a*0F|
> z_N`%-Sa`l1)YUY)9 at 36G{=|o`Yu{1_T?Q!yh^5_D$)SUMPb+l?<51Z?*S_LY=&3Q}
> zfm5)0YQUM)>BkTqofgDb7&Lz2UUo(RJ#rxF9 at +nEsk9BX#A&SMQt69;0%)-i5*;S}
> zfwhug^4ryPR)_LG=<gNe=8}9m#y|U7*=Yf(+~I1sCHk*Mz~QU+q2 at 8@V@?xSB@)<j
> z(_HXQ^;Ec4=Ahz6#2%`rB5R$WN0Yh}p><AdL|k8*lZJa0qk`_^c6?X;MvtncvKO at P
> zNU>gHT#WkuD^2h}37HDXxYci0l4120glz)8W)-UN|9;<Nt1J}XRC00mynA*uv-k<r
> z at fk$l_Ci~B*pKNI+gj-6{+`3$0KP9C9d?$GD1F0465a)!FbBG;O0=*EaryJ`?xp}F
> zig?!z|17a>DJvVkvuzoCnV&ygA270dQO9-d{hffCMo?$#P!H3|-i@!7>XBykt;81+
> zQ`y?^h1dn(D9aI<fE?0;V;l>O^%CF~eB0EJu4y2C)me&DHBBjoY1#+MggE?O$l$kH
> zz&sY&w}yBfYQ9Z{w&mJcWg^l}eDAi#l!?_&6?HUI$s>gOidiGTmSnhZ6w1A)WQX5Z
> z)3Aa at Rs)xYx2h0{s?MAgvrls`PyjQ at S{dGu;a at NeC6R1%HQ_!`#$cXv;8%#XVC$wN
> zwpF&#{yNF>w7A>aW<ccn592#=D)c-C_Kj0$Lml`p#YsiPpFuBpP%Ftfste>I?qYQK
> z5zQ*I0;vt)R&9f at ue$#?9*aF=Hw89Mgrtqvv>&Dbk*!~Ip#_>;5SmUoF<ixBih at IB
> zTq?W`5q)o;3|)?F!asbWfL-^=W at ag!dk#Dy`zjkC7i8A36Xg*XkwIQTg#9OIJDpAj
> zG`;>Y`oO`vjKz*HFq?beO(QsLU|rXhH*br0`&W3f-_}*8TS+5Yr4p=P=PVXyF5S%E
> zuzt0C7xuAIhjjMQFTIQJ#*TjJ9gCGd4E at g|@J(kmGYP?1(3HtTi0p!B3`Wa%zurO2
> zrl1~DCN>JzdyI^I|K-sj^SX|H7M!isntjrAgqvw?;g61M>;$B$JvI4SsygWi(eiBZ
> zyqmFp6>8o|b38vgo_`baSF2g^8Z7bLWaN5P(=`!ab0DM)zS4wLL(@jc!>}Em=2y1C
> z2G}$65Mo-Wx}&0f(o64PT$5gUw~@yVt%d)*&}8-9$|O_qk>i<G;+;lj|KWtyM>RYK
> zYY{D7*I3b9(E|H`W?M`~^8Fh(>XcC0iML{Jz|W{LFIF;Q3yyYf;CF>@K}1F4p+sQS
> zcfs*Hhm4*&OH at t4{X6X5Xu;bE$#%YqQB3gvt+Na<n8 at b-Z9`>xK{jGrd<qKNB5J8h
> ze6`)4`_jAGQvpv2`3as9JVlD>pn<vHVLJ!0Jun-X38Q_<OYaWp?Q<~B6r|tT(`88o
> zBb-XB at n1VLkB77$Pv6<bW!R|2V#E5U(nr8UTww4E`<83I0318IYGbq|d<(NENAzD)
> zZSopj1Tk at Gcc<XG@|&yB8?9iT(b3GF?!I)!S7`f3$41V+Nc_?}jS6hmYGb?wVi3Oq
> zYVs9kgYV79p7~##y$N^}RrUvZtGas2)|~|iduJg8#1QrfO{jzrXb9L~z>skXf{3^b
> z3L@^ep}>HVCB{Y>4UH3GoPij%Wx_b)bO0fs!{|6QgG<kZs3CMaP7uW=hV=WL>SocI
> z|9ju};7eE4ty{Nl-R0bK&+<E;LtmSOGR8wb^FN-=+dd?Qo&=`|`+MSBU4 at v3O}wqO
> zA8EHDZ$>%&ta`?xZ@${I#niLlJeg*h)uO#Mjkkv`Y0stquQyiuz?&4wDV*WB%ss2!
> zhLySKth7Zt9)ov4XnOQp2oVEVAFlL}s+E_5nte at gyV3$QUeFF&nWc?+*p2z{pT3=H
> z at q6v5jGxrvCr|vW7NyZzlpd2{IUc^$drdtcv2vwh7qVR|a}3a5ceGwlC3}ZLR}kYI
> z&0{a#7rea{GHLAb#GXTe8`x7khGsg^fIPMf3k0{qCv^YIZ|3O-h!>Mn^vrs>{So0c
> zP20Ov;2Sg~5SsOPX8~_N??PQp;=K_&G1&d#`a<i>pS~S^loq at lI+th-)JdqpZmkB%
> z2L+|zat-o4SuwEviFi!)frV4dK|xKi|B-673li!})hT*zy_$<GC3*!dACs)OvueFI
> zVo>9Bt;UdLs{;0ETC3yvN3<52LYNYle%(5eYS|@RX`}0}w2 at BD&R at RPhmnsKp*D)P
> zmyudWYbyiQIrJ2 at Q*;Ktk-v6r3&lG=0KJ31s0+wGq^k;>v^oGkg<1{0zl28dC5-uK
> zo0V#{xdoPaI(FkvYlN at +i`H(icNYv)s-jb;D(?js*`Iy+&1OMs!_=mvyp$ng3Ze(*
> zv3l`9ELlL%n=h at 2wqO#~3bOn2DH7$$x;D=p*R&pFxCgZMqq>(@=yggumDBsGDnepU
> z`*V@%7oj}DEhzB>D34bg@%@0Hrcoqa98b@)#>7+=lxN?2sT;m4ge9}(Ls%21mW|mE
> zr}hD*lF_E#JRsy(N#*9IAFt*DcYkjrrwip@`kG><P+Rt_2euAmum`5mnDaZj+2vkC
> zuJc4k&`!Fu33771#EZKbYQ2_r+{zN|ya8+EAu36uB_c3n)_)7D$Zy5-I>MO<e~j`W
> zTOkUgl`LY;==c|*Oq4u;S-1{m_h~B7%KEIEH5E2(z*DK;39=}g55#tf))_FWN54ak
> zDJqAxwkkvo1(XI30d)+5YE6a3o2X=TOg}qG-l3laOG&(?N!L`+bO@!je5-?oWY8gV
> zdA68A9u{4~IT2nKgV4UL$=n4`oTUcLuM0ocwORs*eTSK%`xahCn730G{Q2s&J$}J4
> zzm3+Gl4ao!(Q~K4X)G?XJ(R|#agprWF^enqxLok%mHHJ{@P`@_6-Kjp=NkvaA8p=y
> zxC7|S@$OILB?thd%kGC50(Y{99O8vPd1rbqR*LOnWrjRSVaRW6xLE#zRoZA%zrt6y
> z?Ge22Zi3C)-GxbUt0xPR&0qV!(!3t8%hTd9 at 4B~r&#u%hmILVxu(I at 4c!bJ~c9hK-
> zQa-}71)k$dLHnI&ji2eg%$tU_TvTLtiodqdCS|r5pbUSQ3+~10k22!Xy0OB;e|rcJ
> zVg_}`;&(6>>INKPC#P|+KrlxCkUtgK&Br5vNjuO<rr~%5N13FYD+&qa*s at pSd(tGv
> zN~*1H_#BH9dUU{jlAFXpaqyGCY0#b at Ui@uqw$?j9G^Fyy^gx$8hp<M38=4B0V&vG>
> z+7II=KHo4jHJFIs{=wVvOJgbq$ALJSaU6uB3CF=b8^BcwKs?G1oW|xSti5F&X1_kr
> zMRg-?6q<}Vz;RjAxXK6XD)HOK2OvK^r;3eZ8p%J%#@pP`vH22eVwGWNpT7A1te>I~
> zmFl<z&T&``bg<g};XD6%%&6#}e at kA<{%*f#d^RkJHN+TrszGe#gDrpv4<E$mv-0%c
> zGp_61{d<lv`@X6_$mHCrq<1)|oY*bm{fYH6>Xl%A{iauSvUQ78|1>mh at HT!%0$*+J
> z*zjthoVHo&G?bSa^~)Kz_!7Fsu4jveUb+q5Ux}~*?boF!wk9Dky=MoP at Qy#K=dQ}2
> zFQa%-D>%ZR4&)>c$m50<sVdW7sOkd8$(wG)8c2SCCAs3Ez+u#g<quhLAh^$8NatJ#
> zktIK#4~=r_*ks&WtIYNn;=Cv{9(RClJswzCf*h{lr$Yne43jzdNV_Q8>;v69tQmZ=
> zGnr4Wp4GV73FOtQPxInXA8IwKR~T!?uD(<{^p4X4vw*)vwq$sd_MTbD at jLi&_O*>T
> zo<fK`#}g6RK5NAe<#zk%T{ipBUFrBs!(RsQe72+CtFcQU<R19Dtf(dl57Ktfp1~3R
> z<VBz8(bE^<{5hN(qvy~1ATej=$knI6^1;U)h)T9 at Cn1+<Se)Tcwn0`xEm-8ANnAzv
> zYm6^=^R1{k*@w4Xe3)l-JLxI^OyHK)0AK4i%$iZr<8X at UuqzAST#@5m at gSaBol_5F
> zGuZ5Ya-*xlmvAP#Gp^%MXAHboIlO`8yj7X(mh-&(tnOk_53tOg8+g1TVHY<mFvT~{
> z>r>Jp at ibSRg)W4{8VYuAuXj~<zJ3lES0cXtfl at u2<}Q(~(vim1BCK#5$5)#gCj?4g
> zT00rMFYu&BSt09##WrMs`3Y<PmS at WnoshL54of<{Cou1#Nx>{z at gRIuEW7%Yzo0W<
> zZY<<67sYL9XVN=ip?Wcw>i?<qlh$gZ);cgP at TSiI?ikS at AQvX>R)NPDbabSiwZKbF
> zLL6I)+<P1{5m;ORZBT^Vm8?V=;v#&k#Ts(;Sl-ysMQCHBGi}9)5vH&&r76O)%njiw
> z>=c_Kl-aJnWlxc+z0YIBZo#D3 at -htA#eHh(uy*RIP;!+B4eB=XXdL(*`08!WTo$9)
> z>iHqV?!?~us<cL~c2@}{LO8U5 at f%6s3u{U_XVZ!`z(u+Zvtt!7xWlI&aoOPMCtwte
> z!%o%*$-r9dWv4aDUTCz~n8pI_Sk_qRHN1Y<+o6q<mmBTg<zgoK;APB&TCainr*Y=n
> z%XzkT|8A?E1F;dQ4^f}OO9HV<Sj^kYF`Cw5obAK?*teG>FWXXz^Egp2Ec0ez4;qjD
> zV?5#QVm=%#Jpb7nLxkh<;<Gn}Knr at eJ$v(HJ+r-C+$E5;Qm^aTU(mJJuwnDTgsP!|
> zSzg0I1NK-M+L;As!|99<$Juq0R}Df=oQ<Y4MF`Bpy8Jgqj}dVj)%sK-WB at i$P6;s<
> za at 5#Eqh9^+*huWEpwB&(f*F9_=ArbQzC(|-x72SZY0g=xQfTv$ZoE9(WKhIK{kVV_
> z4B7dbq>`TdM at ZEnS_7n+D{gI-NUqgeL{tJuR9<elJoke00y|QY84&M*35WS8STW=7
> zUr~B>#!}wyTacQwq6ob;l-5h9fKgHG2o;MODkr$CXR|T(%{2B8*dlz_*5wTa(X;y-
> z3ZrM04b!7%M;nTuZBHQVp#!#tg6@$Gh23cl)5*Uqbs4QhP1u(Ltza=({vvHL`h+xq
> zjQrP%;m6i(E4HyNr2?($^k>3P^oQXU#a0n0(oX9ppE4cSD~Z}*eH5`W!hSpaMWjrd
> z2#r!o3+a`tE%0=<Y4Q*3>7P)I_?@Oo?wr=1ZVT3Gi#;}OBw-t1HVxITEt^=RCM4A=
> zNt7XZRv5G<gSU<gP6TF?E!+cCmgMD5E*9C^gueo(CESaAarJV&;J at 9;R=*$hO(NM0
> zW=5S1E#ru at y6(JvGQRr`-j=i6CX!?x+Ni_dxm^04+e)y0EuYVj+9rIctIEI(%ywcO
> z$C^dH$8FGi>7#KaALK?p5@~N at Hr-qL9r$ry`(K)L1;^?hhsW$6HwkjWDA1ryXqVKR
> ztH?$*oPW}0M+ at IfT&nCIUqSEAtDj^}Ji<lYU%0-+!;H%pM&5qP9L%wP$#tY%uqqt*
> zJg{lIB*W+C*^D#Au;m+$IG(Tptoq7%|5KrzZ>TXGE1WDfU_;D)vtSt0`)5A8<Y at m=
> zJrB!nR?%_%*(KUjMrGF4Ry@~<XU_3rdgg`5GZ{c@#LAj_vo;QH?rHbM6k9F8E`wbU
> z)5RcyJ>*r8UBQocn?=>(cPQi*7U04_Q>Y!GJJgQG=+P8Cnxn^<=rJ~WjEf%Q?bmM-
> z%hE(<AH4}U=o^lp%mg23Yjlh*aq%XBc2%xS7j`FzawOyfL&IJ9@@D%lHwk%%p8;A;
> z at Wjq0Iis?|t<O9BE3>@xg^GQNDQ_?VQhNc`PQuGub~aUI5Q+`mSD2P#3?ytHDYldi
> zObASHgq}!3w2D;VpV0XH4=`#!RISmqZB~(0cU?py8uK{6mp{XQ<GApjSZ$1grU19)
> z=6T8N4>Svaot1mSP|8>e#>QJp8omx_KARY at VRY?s=lES#AQ-W;h}f692=X2J%0>8c
> zrVh6+jT_l+IGeGxW#=2upFeJNA5`K3Q?P5?swQ^)3qFHD at OfYfNrw4yLh^s<9VJe&
> zxpxGnw9bf at hS-Fuiy-HHn6B~u)k at rP^f^iq*?nGFwSczF(XN(zWvl^CWklnAj2UO+
> zf~x6?OR>FfZJeJ|oVrM<cs;4{<KkIXQ7VLHt7vk86_fxdnrXV41{X?SOeo%|i}NQU
> zuhvtj>pXR`*QVUwSXp&Cxcl|vja#ZR^5 at y?M+X3Fh`C>=S^}IPmNzz5Xl$)s(Rf@=
> zH&xVq)OZ5t?|VMl+VWBra9(Xy*%+H=K)-<4xuK?^;Oe{Ro0c=CeWMb`v(#3vP5qGg
> z6PJyjW=)*co6BF2=CnGPhwEP5qInn9B7Tx7zupGQg89hQ8>o*E>k4y|t|4DHDd5m;
> znDy|%%sOeJ^};50YcvVbELZ3(+WvP)H at JH(*EFJ5SXq9lCPT8G)Qzu)+19o6O^33k
> zU8ZY at 36@oEa>l$g*%5L)$9<93QenX(4yd=+KM}Y);HiHU+6!~91zHMI{f`lOcKy5L
> zTiAPZ{hws(W~_~$o>o8WK2+W$f(pZaEE9T}DZas8n^WQvG-yV&yBV=whQNDxo^~cQ
> z0<(tQ+8C=0YK(jR*_RTy0}-(b>1jx=!Si6BZo>}M=(unx8D7ON0A;YtpSH8fZrPH3
> z)Ce2r2E+iu*JU^4WM#j0$e5py{hEF7mJx`^LOc%oXY+P@{FV{?4!)ic)w5rtmBSHU
> z{~HI}N}RTsKV+yC_;d_0C;KY}o)}10%#cNs1_^dvkm$tp_UQ%cz?RYQgZqeN4~`$q
> zx`;%;5&qr*8`ow>sAQ{x7%kbqqSa?@g at YwOuAME#o*uEy&ivUS&Uy^<^j4s$th8I6
> z!iw3l1JT%j&^TiuaD#(YBYJ1`iw?H^IfwAe1cz|%K^*UOurpQoLy4X19PFRz4(9hc
> zgfSN!p;u1lCp-cA{nQNNBzFTRe`<k4DEPBOnB3$L@{=7xA!3qD-HPL8{Q2>BJ+A+N
> zs4yiCVdC!{!uYQp!VM2NLN7N{EinIWejC2z5UrKejuayX>&G<2!rYI#OJyvs+HP4s
> zNhzScr{jm}`&*N+*X)a!v<cWpu#WUj9b`k$>54i9l4F|%yUD|mCli1(bLSn at Q#btz
> zJs?JD7H?{q!iprGF at +t;tY?iRGyYil128}mIdj^=9~N3uGOL6tJ8=2p!oasQeQ&?<
> zWs;Oo&Hm{K%~^+|(;<8TE0p)@9AYb>vX(j6Gq=En=w3%?7DnZdA46m1#FtH@{)UyI
> zhHQaxL-;;pHSO~s^DTK@`9s^-7PLTq9;DvpGOKb5(xf=hKL%U9X~Z*2Dd2BN#?%LG
> zfz)&ByEgD?3Xog!r=Zj{zsAM-%QYVBZ{V|F%^0%bk5bq((@?j)4p=l6G0A4P?7u!R
> z2fsN-bq<ywqn>%VUqmC`U#`{aUHVS+#1a1t#}B4;tuYSf{HN9 at K-k?fwlz*g%s7(V
> z1wF0jF}sD<u5Jr3N8n+<dz9t{m}nRO_N5Pgv?(X-bDe)e?yTqvQDq<dw=cmhY4(rY
> zhmTD1C3?pC;)@b*-wtno>Pf^fJM3(?X()SSU(-k7uZ;}`BJ-;10(@$g5TZIuM!NzF
> z6c*!y;hk>_Ao9V=?7$4n?1sQ<>~gA<W8IxtF`CLN!h|4KRj3=Z8c0Cdj!?l8^*h>0
> zt{jBFf%qGMzyA131<g!@lpk^i-sYRG*#jXy*~)>m_OBd>RjnXcB_^_WOBok^h!(Z7
> zzjmj8ByugTQ?=_<)r=h2OCe=|mNEbqH^wA93Hf at m&*a1}jr4}G^o1G at vlB5G{>rc5
> zFcV)M+5>%r*}tgB_Fz`vl7{uVhb(X4r8Nj84 at Qd(A)b;G&TC&v)qK7N+3(x61rZLw
> z&7$-qP#GOdfi at zM15a?JE%>0eI`3JQAkQG}_ez@!t3*o%m4s3U`4GVwxJt=dy$4}l
> z8Hhu|C|N@#al|?aPUpZkT$vpy=^aFgj at sLdf0yMquC$fh3CRcE?8}CIMk3<X4yUrA
> z6H998M{oE^$<VikXG(8D*n*gPRBNr4D4V}e^}MEZUH<*Rb~>tl)N}d at UK6<AkK#4N
> zCWAGdTleMc8+`?>={wQ`UdhQm`fp?>XuGZ=JN+bYf>x#xzlkMdWJ6ufm7M2)R_f1l
> zUVT4u;%oZ at 5dc^KI7^Li-j{2HdJ`TMEW7azn|u|!3S$%RARqrFBsJ&lXrVLO{&XGu
> z6V{?t=D4`{Yi<DV@=IJ5NV!1Mw25gzz!ezqlY|*$BZu+Ozw7}9D<Ams^@qn4#l3}x
> z&Pre=(O8GJwOInUwQ at j}fPCN{Rt|v7w7vIFNhm32;>!N~>FDUomdEUucK#h+0un`6
> zT=^B7&XPZf{a>>Zd>zoRV6g>lxM%Dw--`{EF%4re8dAs(TbH8EsT3s*lJ at B;IA}4J
> z^u{cbQW!zf(%$hN>80TbH;4OtIojU(PG1HV%p_Rz*ffbr625St_I29K^ds_uXl3sz
> zO9EcljlX+!R>2woSngED4;G+2L}t{m=!|mpq<JytU#)ue&pWpv5`?ki%-L}r!LxCQ
> zGq^$=9ZHYpA5k=x8P#DYfy4}3HXHn5LA}7MfY$}j(-HY<B at KIrj8GiEO9kGI&RTzC
> zxpfRYQo=74jbkiY(#Q?r-Y_h=_C&tV2MIT*Ht_YS#0U~agtBGlgAU6?*|KM8l&zE~
> z+m;mNnDX^i%C;pXLfNusVMX{ZLfNvXf-fKp42?o&FG2}rS~(Thlr!LG<qU|HQ-N|m
> zjFz(y<&@IC9UvaR!grDc?;rSk!@>06O~kff09+rTQ({ekRE4n*(X&_`F8xhAhKm0g
> zInFq#9htrqU(3V}tj8GLq(^j3cPa32MFjbcI;n!qkQVYp=K at zs$sK$N#!Ui7`Qp86
> zN*2jd`F5jm??X6S0B+W~cWrrDfA}au>qB-*_rOA9aeuNEBwE!^omO6!Y{0uh#go+=
> z%F8U;`HbP}I3P?=6efYqfbR5fb@?wZ`!HeeL)HzNR|1?3KyAkbE=8ky4}wlE3#<C;
> zYQOR_9oc3%5vx)+<+T#gm-HTd4RP=GR?<u|={@cDmzYEEd5^-f;$@6r)(x(C<$SD7
> zrPT6*Q(K#McE5ME|90(!6$dQ;SC*pPQ=%)Aleh-N3(8vQ#3-MSU35Vw+Lt&%n*Tn;
> zSzGDU=CKph{`o7^K7r^#;7N|%s4FG-AnM{Hu91$=QmhA>TMMFa_Guz|jJEaVQaKtu
> zc53TH!W9Z!il at _Dn$1$6Q(A?7d7dRYYtS!iIJ|Or0wUP;UFn3!YXZd`S?T0P={fj7
> zMAim8?LDiWL2Zh9S{Q>><7v>cbbi=hQ1 at iVsCnmweJ;5kkw`j>^S%}8f#Q`>_QS at M
> zV0r|@Yk-iz*0MZZp6*fMpF-fbSUXJq+ugdIErAZm<>Tx(O?mAfrt($E#`0DD_2sK9
> zy3qA#{c!lMd7|)?MjaCNAFU at DoTdB)V=SJJg)MAMFn`|+?CSDiPl4ZkGp<Q5>N(v(
> zt5!Vn#i4$;$Zx>5xS6~Oghi1S2y`O8ObSp-^RYrEv`oU<I0>jHmih^&#=;Y!KfS4L
> zDl861U9R!IslXY2LCUPNBQ@<xsvSGgcaU4EgN-%rr)c*R_ddRNYLrHd=l77sSadXJ
> zq5s;vXH;L$=}1kY^%$wuBLnqF)avojCqtr7#9vd^gpd`Mp-Isk at kD`n!Zr6Np*FwN
> z%KwK}zLU+M@;@Af^*Es=3-u&Cj7+qZnT=znx_xruMybT+8(6nrjmMpSSMKbO-btw2
> zr?u=j2)`qF^?1j6?g8GSdhItrMu_i1i;mO2q#O0 at j@I-0I$(t)lQr3W<wActZloTD
> zgv#dAECGJ}HRaIJo#iwhN}TMj$k+F7z2 at uk0+*;IF&9toeO%Gi_3oWY-;c;t at IiWT
> zqC94=X1%7pjiRcCCarHpY#T?Ys0?3c>W>!1TZaQ(1;-x?>+%EgzI^S?h?4QJ^SGYg
> zeX7Ve9ru~AxD^qKLErw=a~js8- at tC-`qltaLeqz-9l*X2c|!dJ{91ZoZ-RG~AcBV&
> zewogT93kKsQi-4)FCz6<RFaUZ<#?XX#RIsr9Z~RfA+4r`4{7(Fq^GA3!M#U_;?N8a
> z0?|;KkA6%OQvMpJ^`oKg-jZZl4^BqpuMqB~#y=ZCohE=f<!Ssg)*A57>ogiwtsL$C
> z@){~t9p#^aqBo at _N~OkQWhj7l8q@?-XlwqHEAvX0@&VxbtnVd(?;{>$yaXweMj^&u
> zp)E4FyA$B3?q8V)elAKSfT5e)QvkkWJZRDcS6X`oZ|@vTW#f9hM(f7oE!(M-z=(#i
> zd^q$Y*8LZ>2z;CNO#%glJ}k=Jwvc_I75>T(PLZeA!)LOm1^iSx@%G=Y2mQ=Eno&2g
> zLpo~<{5J56PwaWc3p at Mzfv<i_-tl~9mw2A^+|B0^X-uFsCJSgk;Y+nWuSCxI(-;$b
> z$gT$zRS1rVv;nMIuLC0F_ at mc>$J+`-KD6tHL%`ob-n;%Z{|a-auk;G+=0*fY$Q9Xw
> zA~Z~<Z`0`S_$z!hT1SmT4}GEdT*a!9A9p$6cdK(1^A4h?$1*Ycn2=sK4Wn~tFcp at A
> zr+fqIX0~T_iu<3gE3Rw-(to%;3%nBaC4 at v#m9~EqD4|s~DmFSIK1T7rnXu7qK|NnY
> zyDigrQIp1tny>Jp%TR}_yePD*0kU1{1V1*cDh9h3&07NXuh8mW5xA399+B~Pi5FVV
> zM3#i}z at 5Q|$QGa7wEi@>M&L|o`<c<vS?OUcswW+ at S?XBvss!KWKiBTj at IsH%SdOd=
> z&*bI}-z>=I2;cEGtPNm;g|#?tWu#jLvh%s^8C$au4}?%5_qlhL+w{876tqCB`)0&h
> zA}o$L=#t`LO=%VNh#{{FjY3)i(k$|VjS>vu^zftIrs&IIPYR0im|`rK4Z2W&oIk{@
> zJfYl*5|i+Z8C+USU@`pZUu*q^dfP4M_!QLn!AKs>`t at FvYDUf&+4;N#4gS(@xoU;;
> z+*3cay?$2CLu4!W&0EtthIb}JzO5=Quv_l>1Dnn4EG}p4#L0zDR#l)5f1&VIbN%e9
> z>9Tc)<la#}fZ1LY>zBNmE+^?F`@ku$sr{;Es3}zrHK}U8YJE|BX+ixSHTLD?O1XZ1
> zeRZ&{vPjjxv=CP{mGJayyQA|@>JX~+2b%2aVP~`_#^y|X7!g9X-c0D>drK7E-gqlC
> zQN#ynvq;qFC&&B&pRDbSb3t*!y<cD?T*qV<V^7ZR`5=S#u3W%AJp)!R_1YdiM&s>G
> zG)A=f`?E0ulwxg+C<TZv_7G5G_c)=)gcNO0kDPP={BF#jWg1<&H!wr_I=^=18qlLR
> z;dum0;wUwOwB?3J)$g_4{1VWz3Rs#&cF0SB-P(;EvWC^E?U0EYEz$N1OF&0{MRY{l
> zA)B!CM67n22bcH8+P=6%+ZX2$1;XlNYDvR)EYZgL60Eq81705a;D%y+613tpD`<}l
> z?7`r4ly@(Vq;rj(@>)JPN1DCwK++eP5$d#e4cIL&b1lJsd2;ZmZye~R8B}v@<c-YK
> zlKy|ck!f!PLdpy)Pyo0=f~-EecfL3Hp#3qtaqYuS-ukn563tx(ntO~^3Qdpw3Mf7z
> z3r!&Tr;HZdpta?Ceg}GTNSU>A6<<#|NRGME)x*Kd-C=(&rNsWkmQ1 at YWp+`ME-b%|
> zz37|pk-4O_b}WOP$_H;hy|au>=W&E(0K4NfU{MYa{7Wt at 03{~7^=@lV`@HIKuX0G0
> zzQ{UzQF#wmz8AtNE*ac at y*)W)wmjZrw%@woY;YV(hG!=SU&iBV3^G)I at cHXwMI`g!
> z4c6V<;JKk|eVsk9jCj(zCuHV20-P`-arfL%_e7J+IgRW5!&+0|h1Oo3ZH3N?o~0)v
> zdH9Gcd6Lv`=q+_mAOgpw69YOj&r06mlda(2p1^t1)=brkx|MVcI~%t(lgn;LY9bS>
> zvl|O26^JV7kO%MTn9(_*(iWN9+dA`xS0c_2(XGBoaj1RK=<sjUzC|{+P)$$}+d`2`
> z7$1^q1L`;-4fnrtmU89H5;;TJwcN8seqp4WeI%ud(765x`=<cD1NKmC7-RknNa)hY
> zpJhuL`M^Og*G|!Z_#xj2USJYPr;@#^KC%9|EVv|lY)VOeEXj|t3x~ZRo`QUEOIm$=
> zeN|u)?#`~a)Nj?!=AbQMKal;B{g+!Zv6p<=550=^Tr7=&Te>867V)e#RF`;2FK&Z0
> z+!jGkqf&wGJS>`D8#6we_JpLIJ!w=2+|ng7<qSqmr{W{erqlQMVDa61vK7*^>|c>J
> zSL^q5)+(Naz8BKF2Vwi%7w<wmPc0pOPhu>M8L}H9EhyPLlME$iQTDF)lFOZlU*r^H
> z%bmJ7q|_=))R-bC3&Wb)iC)m*_cuyK$1p`c3)~Z>uu}e&wcXWeF%>YOq|j$PtOLGg
> zHm_5^N9$&2txN5kuAQZWDr&l7SW<E5J7C9cV%jc!6wRaTM*QugIY=4+&nDC?9eh_t
> z*ZOlCE{WeN=Qr{%zbDIktYgqN)IbZOJ36;M*C*EJ)~|wXcd9rQ(byj>UlljOH)(3T
> z^G}HL{s`i{ue0BD^W<wJt2O>ydSBy%_<O*9{Y|nm0?$3-ht|GvokEey3`m_8Nkeq|
> z$&L$O|Ca7iD*0nX?x=dg?r(gcHD-^uOFXChRywcePk%4?X$K<o{2KBEXx7LthP1>d
> z3Ckl5acXr~CAW~~$q{ak=Q83x`RJ<7?av4_(-Z!5tQB1<a9B8fC-j2Qir?QdFsDzA
> z3;Mx(lsNQz7q|I7gAMsg*yrk$yQysQd?p0j`L}rmrKE12KT}<}vmV}dnMZ+Q;X49;
> zWD&O=FT{GdUn}Dz$~bs5QxS`8l3*3Y6zI((XMHe+W0;MbBQyjOcIaodJbmjDqG$c8
> zp_|pxQk6R~H>K!RiULUlPopd7V^bovLXE2G<|!W3p}!gfnZSOGh}bFnH7WW(V3z`^
> z3E7ui?%kffXm9kWVAd?_4O%{rDz-xE4UG0ojQK9^J2}99&y*&3QDB8VeHXsw+bgvg
> zp)BzV(K?K%o5wfsdOQQq2)w&Vdv}vo<|lYJJT~xdc*{pdR?l5%|5=`5L;=O>*gB)0
> zqAMeE5TRJ#y${iCp1NBbr9e1V{5Fck=`X at 4lqerOG8k-;<L_?t#lr_=e|~&@L!Qk5
> zP$x;QkAdb^<j_UD_i>KC-s=$V`GKs|Bjw|n{rQ9I8)Pe&>*pNT6OFlhzbZL?Fy{KY
> zmBVVj(xTc?!`R?rpDfx~2DBXlI1#pf5cC}aP#y-?JxOQPvv58{OS6hYVJ8dE7mwL0
> zthWI<d3L?;a7H~@Dq at A6SO(sBuot>^t*-_t%akqHQ37ABw-{}JI$$l2z4)&799do@
> z!LIbMny at T^Z$ux*)JV`!=k`7weg6>kGssQ$fD`q>!&MKBN~rUp9)8paTd+BJrat&#
> z4=-W~m(b$iIBbK0Ps4N42Fr#Ic{q4><52#AYZT$71it at bZs$S;m`s=Z<j0q_9?=7_
> z7*-&lXG}DqC--SRxlf%8IqMqexWB>iN$gujDh9IbZij`2ZxoLS&1f|!2Ktt|cgc63
> zo6%DV at MT3=u#YrF?gf1Q49v|x?s*dNiz=~0{!_ai9P+_k*&QOd*5>vGy4pC*rFU)N
> z$DFV&3!cS3 at -=?<;TU;hycG2r%0=Y#O03*>Ft>eMO(kkHTH|W=F<6{A1pijvMrXmv
> zSiLu*KZl^+k7(ZnlrP{f3r!Q$2O(E6lZH-8z-~VV944zNMJp%B)~X}0krLcB+SRI;
> z``}8fn|NZ%;h~<j=*I+WBIYVEnPnULJdGP<o6k(wI5$@3QI0AJc}#9Wxtq#|7l|1$
> z&hLz#>)|7q&{#>oRT9}R)*WcvQg^_OQRUv<_zZR>wyI at vn)OKIGqAJKo<i+(pam!k
> zXOh=Yr_}?V)J)j~E)ApU(opn6rXrA>BeYW;3Y&Hls2+NRX?~H)7iu5g;40xAp_nbS
> zqjyjnE6Y^l$?rF2;d++RrrgDk;cPDaG)}{ou<y`T*jBy2u|VF=S#WD$qw)nI$_CGt
> z)bYC&iC=el<aBdiGUhU{u3fw}31eHp&e!KN^VrbPR`R??Uh>U!LdqHVUi~LLyMK)K
> zMgn~c_O5Fv*X6qMuhl%QC&RtZD(N(HtchYKzFxpggqJgRGmxFtzyh)Ih|FAlqIa^;
> zDhzq7;&6H<G9$%oFYH~kxtFQjsVI at w>ZwF)86vIa5bk~wU)%=jh!tzyS^RZ^AA&X3
> zx)oR{X67e6jAM~aV4A%qbj;6e at Ig;;*^a8`Pmb`v#`X9h(QGS5(1o&^Eg!&M<!`?4
> z^Q2v(-{xjMsS1%nNoGdeL-`8W^ZPo!I{S_KWsk7&G@=q@>x{ug&aSXiv9*r|4FFYu
> z1&<!FDNskv3c!WgWKg6|6TH!21FSPDF`Xj$#H!!ICk?X;SLAyZ{&Fd;>_knJ%ut+9
> z2g^r9%)?cBNZ;D6onhD91Dq^qOSM(cZSv`9-IE0g at xlm!CTH!svlRbo9k5=8#^m%}
> zcNVeeD&X67`)fP$afOxSo{i81xqxrXkCe~SnNWKl)n4{Bp?1OqNFJ;}_k%Y#tR@!Y
> zh;7*@Dd2(j0yOvK=ji+7VLUl71zHJxhme2aVX}hR>-FKun9wk<jb#EAc8k|nby$sB
> zb{EGoChIjz<k#)H;UNvn3~30p&(BI)h?2NgQXIXxag|n@&<Gr9ly_*O3<+vFs2lC8
> zpFs|RjpuM8<CfrW+ at HxG0drPHH^!fLl~yyI%wI4=o+1O&cmaAi-Vr*p%H=yRlvfJY
> z;A>ljTRcp#-(>k$@R3uJ{WHtI)UhRh<zv)oPU)#$AYD&^ufCb>6;I>4Qed^zPfb5+
> zV!sv=a2<zhE22J-=PIQ9YwZ5nK)(V{yzU$OXZE#6W3khKzxBFrKs{+>egoV7KKaYn
> zeN(<&X8^*M6&6tB+sOprO+?F>%J25i2Cp4dBzRWq6j;ASS_kvdf at e(F?Z7_L3hP8f
> z?Rbuvp=XFeJ8TSXgvX=+T)0$>uFTMI*lYaFCHwj at 4_l<fXk`Ia^>SIDr}u{L_0PPp
> zp{WpF9x;KjDC4m!wIFZS`!~wvOiyim4_g*#<DI+ZB`-=l-{SCI3_#xQTLjt+9MG^X
> zbR*l#`YHzPJ?5+L at l6hj)e<Zdb at 2Z(Q(w8ILMwnyfDF(&^0 at BVOf?m$1}1SmS>w1Q
> zoJr4S_s(QM`+|*{)Ufur5&Pizz>^^PkWCwv%zr!l(i4yunm#W2Z!cw*Fj6eoiKaA(
> zJS(^xnBz0Ad>gDOu6)}xzT7{XpE#zo{+eS)*AtA+m`<884_}@!ozWR{mo{TM5nTnm
> z*kmvM-p1d7?(3Di?E@$Ou3NTGLHMrgCLdHXas7K-y at RVi;QWus_b&eagg+nk|3gat
> zyoXj0B9p>Qxm?Ig7lbMSXv&r4rnrkhjoD5z4b6kK!o^{Qm*HB*zXESeNaHaWZ>H{2
> z4!h*S%*xEbn(|g1tm_)aHH=q=qFsindRX7lh#0DXOWgSwT6hTl29p>2{?+>*1QMD^
> zzWn%$!Cx%?;_=)d<VgeVtk5)POZgGk3|K%l`-bgzRsBV=Enmtk3g0(<U*UdVN)r=P
> zJWRLq4Zf_~>t5VG{Du0?L{H&*^K_wR^$l!mjHgh~m at W_So0Z!SxT+BITK#uVn__F2
> z-cSS$Y8?Jz at E41}c*qS0;V%vQou%AImNX*Mufk5-6#T5c1=M-4b2pEJ7pc(Z17~pu
> zq$`WTZN&tQ<j1Q>I2x at I_>08AGek$g;p%7~(WLh~6r1OrLq<<Z!<2 at F4W$Rt)r*j+
> zm%%D$zoLUx-yMb1Q&xk^p4X)(FTRb;`7dq-=3+PxY6jc~m+OL0vSz<N6*@AMsA=uO
> zpS~fjWx8YW(idDJt7^2=x|9uEk3WfjqkhNZF22CC^0H7$j3YGqR;_#i5w$<=`9d+E
> z#)KICYEMPC34SrJ7D4oZV|}qxlFAlT<>LG|_S+A?ZcnznVxMmD at EJ~#Szw1}DYWs`
> z%AdJtw;XQ5T4*gxGp at 3aKKzz_oaHsU&eBlagjMV9%{3tlQoYDwEK7^&#Q7V@@oVJR
> zlYjD|6;+Y4()en4td2hXCi2A*2ZHmrk>|Jh|Ab&w5J2A#AIKk_ at U?TyQ(cM_D$O5l
> zslj=tVnoeqQL~rqw;pZ^&B`BbtwMU6qDT5`NN+&;TOoV?=%i6d=ZXpGdy!s;bZ;m(
> ze{|muwEU3op;pr^dyxJ{C^LU_YMhpiJ-1~y(qBgUo1xVF(fv!bbOX|Vi}c?h{q0a(
> z{^$W8C}yO+in|`9*CYJ^`0?F8mKL|6CC-?YsGeaUc{}>L?aywxKCkZ!EYHxN6>e|H
> z+}*M><ogfF{2Es0^-E=yCX7TIJV}k}dCUbF{)PKc9;`sweC)tVslTS&(jAZA#Ypqu
> zSXRX1Q?z~g^+hapSzvWDxOQCyjtY1UmIMo|>zbO^V_$#0-J;>a8M;^5=hi%3<TNo_
> z^YTY$V2|31y{zIODMU^&t*Oci<k?h&j?W*R_BFV|9xWA`_?(G36W2E5?nc~2%wWa#
> zdsu~C`WnyABHOK;tQ_}4_uI#zwx!LW0KG2-)&N(ztNm<eGL3#k{(~49`IrOHXkYpZ
> z9Th6sT-Bm}t*j`PF>VSCokdQG(H=X0^pH`=_YUfZUAiN5y(SfXXon;G=jS06jo{72
> zf#YDX>fh}X>qMLv{1l_()XTihvwEYgC06oqDP=p?!{P%nnNy$hkt%TAQU13SV+<)z
> z`a}=*t<Q_4x!j`M2>v-v9<x2pKHdIE?{n_w+ at FQ}hKJhc*dIa4W7WfZ>+RRsAG2rJ
> zAM5>xqQ%Pygu&@_A#b(&6SvsA$UX)4W`f`8Li%^TTl2HleW#sS5F6024%R&OWcy<^
> zq72!zdnj4dkmbB+$}uK1E4Hn$RE|h}G%LNYYo|jSFcQ&Df%kU{s9Yop8kMI#4^#qp
> zG5dUwh)i7UvwOz53R(@|flD`zgq4aUKF5YD6nlOVcW5XF*8vY;QITzBdQt9+MSP22
> z24 at a_qtoDpP6e1KGu4C~W8As?A=w`U8|w<}87a%XM)Cr~^Lbdg;1hp14>AWUW@}!g
> zWZ0VeV4(}U2Uh{xF6;<Q1RqsN^}$hLdOkkzre^i?BtzuH{2^xsQRK{dNo*~+fi=M1
> z=?kvBR0&kgKrE at ejxzUdpj3e_!%C1)sv>8myj5mF&5m+kivx!k6RJ^usgf4V_RlZ&
> zg~L^%^QfiQK6tkzugVpJUtm8fRedS1#=2|(*3e9cF#GSVQ-Fbz2y4}9aWxwb<lMV_
> zh}-nR7VJNAlo+zW0RD4 at Fa1iZ#PU%b@!kGMt02lTT4iPct-wcE_kw!QyS8o62a8%^
> zi*#lXW_DXo+O(68r*I!^drk*${MHq?t2L&4U99;ac|o9_#J%nRcVHsfL!cj%%2!EO
> z?s52xs>Xu?<!r^yT}j6p;^^5!)>5p%_1p)^*wv>8a#)&c2fpQb$YEfY=w-f3ZVS*O
> zd(w}R97PiN-9B at vjp;fHmi1&94nS*nWt at e+-=@tcad&*==y?{g%S6w1vh<3eJUT?p
> z;#cT$<rt=`yoGE6dn;(45bE0{$jOq~A#Q#UdkA1~@RnNmMy?A{PM=xJhX|j~u7mZZ
> zxa|yPpIBW74_-pk5jUG6&miVBJWC>&9pQh`Uc at 0j-$=C~k8h*3!vv2*CJev`7^vD2
> zH+on(8$1y<t&_-0EA+Bz4{QhS5v2bPara$;ki at tgTm#uO3vE-!&^_aL?cN>Hdy`U-
> zLmfdazaY~Q`aac{f!{$s+ck0D2N3_XAd{laJpVYX!7GG#Aj1F~6A|Pq5J7%L-<aA-
> z8a8o9sgZ{r;!ZbxT}_#$U$9Z1cj!B3 at ODlAH>~W3r$+_021ffWqYPv70MYxBBb-`T
> zBr(vT)cl>hi>x0ox#ER{onA$!$%w_>qKa4>@Sz`C%tWUCyFAsJ<Y3cwmowYI@)%|e
> zq+=dzMVq8>V>f93_g|?AB*psv^g#iVoirchI|rFR4VXz{?T;kMD`zqKa+UypL- at Ce
> z3etD3kMw!X&>r4l?i|$vo$<Hp&$%G^ry93WjY+2$gMXRyk9EQ3cG)Y4<ed*pZ?Q}G
> zR_FQDAwE;rvtGON{D0lKxo15|v3s|FWGo);i%Ah!b$;L8?eNg;=ZleYU9hqPB20q7
> zdWRGxr5aRyp>V`pl-L{YwWJ6F#;Ly+<LMI7O8V_#L5b>|V;J*dD<tw`UT95+#W~~2
> zH4-$z at zv6)0f<JotT<N}E*n$HxXUYe3wnoC$2!^LK(Xr3oejC4ccwiqz?1vDSE?Qw
> z*oL+cu&>RATyv;zaPbNtrc4Y at YMAJmSjZkXHB5AbmZjMTKQ;#zxbglpE!9kS!6(Ud
> zEMpRDm<XTHi3_qcyp;kjA2t+=j8(<;T2w=EJWQ>b<$P}f`APTK at CKWt6V@xId-GdU
> zakc at +l=+7Zam_;Sv}PAs?Vq0AEaH5<c3$Ki)I06Kp!~IuAW~5D`PIVuojrenE$SnB
> zpZ2VGP+;7FK^W&3PLFC91LK<4Yv)<b0?u90XA7EOXMg)9$QnKd1%1MQYw-)#kwq0O
> z?DVj8&KkbTxr)i&7{sTrZf#M7olTAlZ5L05yd%91?_EW#BFpUuuF)&%e{u{9vV4Z(
> zR4e3J!8HxA!5?`MS0g>KXcbcfBzTVi`9_FA8a!Efd?Axfn01iM<2ijG<go<g1`Fo>
> zF8lShh4#U<(@72kZR)7JT!UBw2^rotj67ldw<@C>W_XHWeGIk}QLWk{SDV at pVPRT|
> zmCb^ekCn}|FZfGc5nDdt6s)!{VH~d5+C3cHJ9f$JCd9iGgS&w?#1JX*W7H`Pb-E)k
> z4mG+1ZSfIeN!TD)F4yjVq_CVmo)7Wm3&C&ya62UNA=27h_<R8P2H6Em<JP2NW=phR
> zU$qQlMuMi>czocz;cURx0xf-X)iO{F$YrCsmR`waLN4Q#TuV{HQu}>X%PJ3bynoh=
> z_4%eETSc}!o+tB7kX7ErfIGEd7)t7^QKMnOw>{=UR$)@(PGXn8U>K0~h=yHGH#b}^
> zW4JsH79+EJe26zWQc7gQ-BO^3W)vHa5qL*nM3)P18ll;b-h}tcXtQF_Qp81ZT==X8
> zts(l$n}8E at 8_?570KGr}2NnK|YB564Mvsp9uCzEX3|7F8qkA~odVxQKdJ=@~8QLM+
> zE$CTD;mWM*M`7HHgf)z`Lhzw0Y348scG;GO3EFJ3MrIRwcw!O5?*wINijK|1A8a;z
> z?+lcAW|mo9tYM~SW}(#+d%Q1Zn at +;cuF&d(22EIy-}e!Tt`#3r%or8%E*nPncr_n5
> z=GNk7>qz%p+2b>9v|*eNaxP`E^F6+*_!MGt8Vi{%)^{qf2Ww**NiNT1oxR{)u9)0@
> zc|x32WEBLoSeAdb7f4tYS<)~*MB&mzo`BiV9 at tZ*%@%(e`qAVaNjbc;`P1H&!B?a;
> zTqs=K8GGy-tX62hM<k6#OoxQm)G(dsPK%yKH@>SlG*Fu#rpUa)OtJ=_L7zs)<3G=!
> zw=r6241?PKaO*!PHzGH)5#xH=eX+zf_Sg_R5Vl at D+`$$j1{+aK2fL+0i%UKkB^sN5
> zuhD#VOO=*pU(QUr=06|}7!od<YdT_hM6Bi6?bmm?mg~4EE#rM!L0KU8n1UXLkypVO
> zHcre2TKV9ELm-p>q<V?sa<E&=ng^k87mGS}${uU?YO9QJjxhMxt&1U10Mg)XqhPUP
> zsVxF0e0}YVK=*N}aLgK$s>822;DGE%h9vg7F6JpNp9SiH5d_M~dTV<Vdi$v{vQP;x
> zLXSyidPFo{7Qgo^qR=RB1|r)5fg5zB*cXR&u?^H>8d_L(kM6bLezCuHS$sXPjcSWq
> zbO9L=q?kZR5<p*~dmZTvc<1)1wR1W(q;o|^9IDTkC-Mq4wj;CCa!7Y2MMkN%fTQ<j
> z`_S4st&-XY<qiXq!*Gm0J;oj|3h^6Ttl>V at mY`PffvTOWy?+M1p#@*;)4tee4vuW;
> zA6VE?i1{UT>eSfI7|^9e<i~!9C*e3>HRFuFU>=U(ylZc?Pph4S)l&et1tK2ODpO)b
> zY%M)jF=O<LW*)KxO_IPSFSjxyzImp*pEma=Q=56vR>fmrH|!`$<O$K|M=Cm$4Jjag
> z7X<yP8M39JxCV|v?E<{wRJ7!q4)rb0vqDx}J6lTRcH$|QTPt-k%QW at gOtC}hJ>0In
> z=T7vA%=+w^$wc8iOXp_y5uAPJ-sYBS at I+h@8!LR at +t2+u&J~<rz?m)XNF6+lTf`~}
> zc3z at z(alhUS<v8HY8{dCfFeH}5v24mp-2}(TIoNO<}xG74xwayq-4D9FDOmAQd-)7
> zmj+(qu|x4d8O^5hK;M4T!-3yIl<v<x9HVPS5BEHMg4%4OH at y`46kl8qE3Uwvb*YpK
> z%M5oQ&;HBWMbKUjtz8rufmm^9HA>L>dt;9fC_Fk8v?rm<1=Ou at xC?07!@<j@;)rN(
> zzy%U8W;dy at 2F1|@t}VuE1IDNBgaKtPRAVr@?gTy6A;S7Bw826xnok1p$bl^1K=i{R
> ztYI?d(kz at iPDr?_RCV~>49aitiaC83(5znt>;)z%2SjxM at -4*uLXB%GS#E<YI=*&+
> zTk7qHRE$?Xce%|NM%qnoy_Pl?=QA`~(TuaAh8V~I;f+*V+<XwYeax2yx=v-x13h>P
> z#~Yiy_;ohFjo<mr2jHVcrImPX2jB1r&2Qp-F3$IR3Jx}U3J<>S(KR<AZBFw(qFD)q
> zG+$u9uXgs)F+tOY^#|>xy2u#owaCetrc!Gq##r+oK+}wf2?M-`@Z+E^6KGFCR+JYT
> zl{WiRwX-3+1PY-9k0l2}?kc9DL<URB`<~F&R-ouWd(#3*EaU(|po6wxbyyGnPXw-B
> z?Nfe=deLWttNAuWX8{(xG7NMpmqtYWdp$CJEpL+$p%~FE2ZDbRrSXs+n560Kx=<W;
> z)l1nvufZ*$mwO|3yqf at JhPN*(cl#+WrL>gyIXWCsA^uHrL}6HPKB&ZX!G5%R7X{dp
> z>pBNq9v|F at 8f{b|!N8IG)38<p-(=Y at fvY(l5hMgyy~XwTP_wTHiCVI;K8MD$F=DoV
> zE}|poQ7%RUemAo*LZCXeJWn*#9CD7~qtrgQZ>TwpbEj&-oHj^fT&#2q&wXECbHq8u
> zbyAgT-gAyw|KWipEK&G(sg+*>g^TIXpEYci2&-pV{HuDhQ0b8ag)W<auH<2r@<XzD
> zXQ))iAvYJg3w4#iqZfXBuB=eEoz5<m4rAfM<f_<09m(T`9;EeJGepv+OhSE(SXIpL
> z>wL>p(Wg7HM1{S#aQ+jEVnDvHLXEy#@b$n#x^ETokC&(ahT at 2HpdG(Mz8^oF2p!3V
> zz&7Ol4t~L-&|aH?b(w}$Ytr%L;7-IQH(`Xv9Ndgv-J(iB&x1w-Ddy%K%`wf at YLaIX
> z@=%Hia&04Wq3x=KhDn}DNZZzIYTk|!#%@JKTJ5+EZw^2XYz^+0Fb_!Qj{P_7tOzUj
> zWAL272gf+`A>VoBORZ+-)z`p5%4n_aY_oJH>m#r6UDIM{xk1n6Rf~nmHPl{VYqH1?
> z;Y2{o0}(+8wIHU7 at B<>90(Djh;R_Yy`T at F%G`yo5T9^T(rxCtleb{(#a^b)H)(1Za
> zQA7;A1kE=QV<g&!F2r*Ss_~Jwb%c+c0S|n+btf>iE?FEaKs*nAL8T$bJFQ)68`icy
> zEeSnBWWH!r6LBRm3*A8b5_()16~lVu;ITj!Tk87S1<5hDmsceAEw4yODYR9_Dkn}@
> z3ay{V9*6!p{2BK5Cdowews#>17Dx9XN#cEcQ%Zl$E&&g_KfLmWW2QgIbn6A5VZ+nS
> zW$2Ytsvc)RUTFRYkVw;Tehbb&R|kSp{8(;^Az!{sJasefl;h5)TK-?)?6WI$fV<DJ
> zB0k<PTT#p44?ana#T?oT3xozq?_dyKfU7d>pnf(LfKK>&WT`^qFDfzCskOgG&2Pi8
> zx3!!`7|Rg;%~p%T at mL9Cr~LJB5{;vVhw;`*H34a6q$MJ4b8`&Rwx|iD*}iscsWFuD
> z(=iE+FAzxtY3r9eFM{GE_za2-(XNt(4%L9(-$divmrCnP3+5u8O;C-2EVOxnmyvub
> za0K#JnXhz&--o0GQDMdtt$5`<?R!>f-?Jg|Judp5Lbi0hz;v#EAB7$nZ#}Z}4fbo-
> zSLF>NFyHZ&<9RXs(qlq{IHHyW@*-&@14OUCC&6~nr`x|ttC>rySwBQ;jn<4OsHRBG
> zpiyNghw7H4$kI5DUEqngwR(L;GG6dR at z;zltifcdiqX<Q6!_IUd${k0@>FA9PX#cb
> zx3l=*2^rWK_9to=+uyQ#`ABZ&Gx<G^@Vo!?#o>G;T`3&b?K at o^e?F^IQ(*_Q2b{@Z
> zS`#oLZ1=6_EB!LX%5;aWjF9!P^_;Pb<^Y2}iRc`yN;8j+rB$hUa%nOUJ-|(4E&9EK
> zm9=0kvSN>j7(3v*zoFHLt}fiA!0w*v?y_m?(#*)ZWYpHBvX`#B?a807OT at QxAKrjn
> zbSyMGY5xYQT&toZJ2YTpSHwdCl^Bck(^@)Y^Zs;4Xz(*6-~M5R#`jlDJNd}H#SK`W
> z^sKnqg<q+eJD(S9&bL|0yMh+mz#8~0 at DHz9@sS<#0gQHGO{=b`LS#j(l?4Yi3+^F4
> zv)3HhtKHkxsw-Q{Oh}zbsliEF>Kj_BjMToqgh+XTTeLd??T%E$-iwr#aOJ*TyMI8t
> zFBY+5k^9n>`;)c%-)Q%RB6bw_9c;on*b9w5a2<5&ZEEhH*v`KnGt>LvRZ>vI4kM59
> zWivyKW1^{xir5iWwi^1qK}eS_rweC_SPP{KT6)5j^xh(Nh|<O2paa2^rfb_xjd|B4
> z&0xh*8oADW4tr)cVYJWKEFiX8c{9WB%{^_{+lfjp<P at VXH7U~?W~A7#e<c|Oan`>8
> z=S}xXYH>C77V7K#gh$qpUL|5Lf^ppka`S37)HBmn2)ld}TjTn7xmAX*QW2<S_kj(Y
> zo9_S}X-726_`SoFwoAIu)Jr-(J2VZpO5yGrnooQ0>=C)|+x2|<IT!hYTs)(g-~}R_
> z$I5U4IGqs;#n3EJmOegkK;TTRg5<#p=Fx>5bU!o?zhdY{?YyXGJ<8mutpEeC0#vyE
> zjX0872Y`!yaUqpU2<aEMYdGl}HEAvrzoQZB5I6a0W!Ss-XZ3j(`k-iizCU!iKJXd;
> zgI1${Kdlkcfl^5JDxohU$BVETr`T5))3uttmp|l at HD2hq4`|YDwD+ypWyaI5*7~<;
> zSNNs&?#6Sy&cJpjd-9hZhR$J-cxILTQ1!RKR`T8>nWrITB>sWQuIje<)8O}5qY at 8x
> z`RX~^5e06C^&fCpYwxB!Km);Ep<!6J?&1Wj860-Yj8F%92Ws!RuS4ogioEAp`_=bI
> zDN+hbxF0ko4W*$!_smdyki~4HGN7<!w31)C_+Mr4|0?6YZdl?)%J{V&W#~fpT`7a~
> zUjMjKMxSUsj$Bj50BHce(jB-RwYm3dNqhF9Bx7h6m4v#G2Jo$)m$NnQ|0w64Zqwx&
> z?YR@>=tG&&a)1nWY1 at C5Q+l-=R0otpcwVc|FS}tW7HyrcP!8t6rB%_AVnR<UKzN8N
> z)=Hz^>_ZXkORX&XcpQFHfVN}t0fCzONi}rqz-Q3vxe_JDhAK2mQ)nMUzxe<0e0)fb
> zKA#Yp^8fKX?eKp7eoM#}dA^&4BBSL0uK)jdzMEE at e`_UF6xq6%yuDH^vf5b5cK%B6
> z7(DG?W*M%4O9n4?mU#Sf8!W<rizAxhv$;ad;D$0QtoE^bNCH0z`IsTFOWVPpEYFq(
> zVeE#+E|BytAuu at wzo9{p*ZnR<&!=E*W6tN50 at Ws^@srEJ4?(Lh0*zWLLwjNzJ%N0o
> zv124Wft4)0A&lpnwC5p{azgcw9a=2-jXLN+^;CjN<&ad_ATbxiGnU?`Q*164G|g{e
> zpEo-K9nHt_JFfY-cM$GECN8m%emUgtDL5j!$`qEoJ{x>N1;ZKvuGz};Y!Y}GBdkjL
> zV(rRM<8YRRvt*UhCgKb`|HU7sECs!Nj)Bj(Wb0|eEZzvsosGAZR#+I1_+vYdjw-*K
> zjR%k3g`Rw%HK7|?mQXx)SCifSpkvZwwC+$- at a&9kvQe&R9qOOEA&mR>LhGnlw?)Pl
> zl=xlbtBz0)*zCqP+=(@tmAa|S?l?TRoT$hvGqBRoPVXTgxlZ>%LQ5JP>^;$c$o&-R
> z{2==N)A@&Wd64|?Ixwht9NOhAYVk4an#W at IFH!q7zv-Vl-^V^b=s^FALF>We2OR<L
> z!Q);#Nyq};19s0sAhxiEg&`9pI=(;;<XgEZI6Ej5T6 at d~UHAflZ9`es6dZdvdI#;z
> zCl#_)B+;MbuLXaW6mURRG|=7xosN|ag6!gUk{Uq@=%bzDD;q(9W9==VymvqY-V!K;
> z4j3B7bL)Y>CSu%)(gfaW-(P#XeS_U6_2I{AKCfQpo_kbAr0RgnR$9n<fu}dVk~gjA
> zy1nU5Esik00o1=r3e3XWmg4VD!t;lQ{)48&fg?_=Sq}DIjCdp0IhRT8TaFavO6~Hv
> zxW9j|E6#;JX3Vypo#*5}aU!49`wdA6-n)}~?7M51L9!d;exN-a@!yT8`QBZL at a}lv
> ztP$SpNxNd`yffjJb4W4Va(?{-ou-$*R*iIaR#*Eq>^1L%d~QkkgAeGoF7w}-l8cBo
> zBOlOH8f-8heL(*bNl2HVmPgz><O02tv-}aoeJaXTtdYmXBR*z7aGgEv_FHS0oto2=
> zCfxyP!DO$Yz5vk>+UkM8YLM!u%YsolK=RBb4cFOq_9ICmPxTU2TN;?fL~i#XP6e)(
> zG)zZ(AA$8#D&f+44GdgAHv)x-tvu+n1V at TDv7l(>!A~yyG`IRqv`(w-<LpQ5b8D9n
> zCycr;qqqokL|;~b>t0r}O3t^xTzmW5M*FYrKDo#v*#BI6=kuB1#y?QrtKJ+QAJV`4
> z3i_)rG?K)Rm+*TwgjGF{gJ#~rS3+_eKA6((bJ;p6x;x_g at Km%Myc8je2h}Ip2RP_Q
> zcaDk9h^Or1rg|y9=#?6^MaQHj-^Q4ntkn>>tI>2##*K8l#41Zj>r+{hpYW(1R$?>g
> zJ(?_fd#hBKrb(jH)|l<1Yqw)Wy?}2_1J}Qu<+4eTtt7v10)hsE+*Dt<RLi?`jTyEh
> zhWE!7=UQ3yDNUl9D^re`;#^KgLvb$XaiY)UNeY~(HWjjUChS0fB;a75d<gGd#JRB|
> zq7be=l9yJP3YV at k1y0C1p%3usB>h4s(=U|SKtxaQEGUlcV&P4i{9C8*6P0{#@7V)g
> zC+ofKxG}IERu<FTql1$`(b*v}AV;OPK$~TdZwJ;>6uRRE>?lF^p#cZohn~cQFMZxK
> z6TfcIDw3w}1P*iVq5r7g=1jB=!jt3Mrw5+~US>vH!Pyabi;dmLfGdX?-d_Rk+f(0S
> zUD21 at Bt7KD5=Fj%zlC0v6a(I%gCrah at TblzKv~7=qj|0()vBe!A|~KqHsLI at 3IWLN
> z>(o=Er?y%;5<4M56B7~V1DeBPtH4Sa2g)(<vg2!?RrQY0T0csMucju$uZBf)%vBu+
> z))_tNIp9A{&tV2z1+6 at bYQe5gD+@@MbTq)q9&0d=)zZ{Uqy^L at _m<k4s09B7NL5fW
> zD4sTog6n7;5eJDiCK)?#a|`*&jwin8{eZRyC)8e&79_h!j%em>n&kIvj^R<nh!CuS
> zzm{y5ft|~e`S>Cm`w=^8y%)H_wJ)lsYb3odM$7V%RfU7i`)$-}BD882Nq-^n1s;BP
> zwm&^EygNHMA at CQJ4GWzuZvopQe#_gMXV=@PNrkHbv-2~&v*7K!<r$-Bc7BZ6xnXJ@
> z&CZ=4U7nx6E5`hc;lnXMS48J$HlNM!qWSr|qIRsOoe7T63~xyj=4i^#=BSw at B`Kfc
> z&A-#${JWpd*5K6WT>T8ID!c?9%f;HPN4-v{5;PS%utL^+9!qVerSGqOUzO129zHdA
> z4_1ojcw3>~35gh+3EP?(g$qk!PhF3*spTwjq^z$n<IY at PmfS}+yMb1tvnbN>c<imM
> zl86;_G093{;Y>Em4?sSa%;q3}3AMi?d~`r-Oq8zN6UnzROEu4XF5F9R+L%dFJ2nI7
> z(+d~Qiv2K8yPmG$i~u&0&BC30MCzPW>VfR3K}hsW3py}j;~~?vBA((~ObP<EJm3YL
> z!F<~Y?EKoQz;b^Yv|)XN^Ksvdd=nZT!pxi4Fj0-g)wqV$xEkLu9&NC^+ZLRFcR0Z}
> zBt_(mkf|Vw<TbKJ#)}|p#9ZTMv at U~fP;#NQGM1(B{8IRUZY}62IBx9BW{G?*e6}+>
> zGhmA}7rCZNPLoB#<f>k^GtK{tEA3V0Cw;;r+|WIeMwfybL|X__XGSdv3p_}hIVi<8
> ze{D;wcgY^J=NV6&XSVxaErzl&oP&dj+pzJ7RF()Tqk|qzmeXt|_m1A1YxLkdZ0;OQ
> zEB73<pA%ZZzcCxidJbj9(~imWtY==n;n7u?4X_9hAZdc+CvL-De4CRc?|B;Q+YHpi
> zTr{1rqD&ZJq=|*Hm>>e_YPwv&q+%OXB0|C)xGt8{aV-l_D<-VR^(^f^WE}_|_6psr
> zn;6kH$%0OzIzZzy^ElQ1J=DaO-}li~9?g%6>fuc%jSq4d>kNSt?gEVVLif<fmk>qx
> zzw$@=gb5tDDn^R&XCh0St%(#<qlmHTjV8!z=AzH17TQu{OJ!zh++1iI6x+C^<7wGu
> zGrw+fZ|~IKa*mBSD|VL^vXt1ys>WDoAxi5%=vdxqtT%NSJEcfTubQAY)tBeR4ea3`
> zh at k{v0qB6=G7C5WxTB*x at Q^Q`B^lxMpVbMxam28hrMHylrpNP^Xg_a~$5g|5Kr0b?
> z4~mf+k==bO;QL)(Tlr8##sKQDr=TjWp}=2Tm3F{J`~b~h_8glF$;B&dHOt3LuV9=_
> zS`L{?OAIgt#(!ko83G;!a0uYhlZ>;(V3%a$GNRGa4gj)bZ6|>gr494-L8WaYcU52p
> z%wZGwczKLVk;l9Nsh#^1%x)`YcO~EKmvO%Yt3^D?SuwNBNzXGw2wuD-O;uCC at r)-M
> zNSEA7J^K}vX4OOXA4aQNSpj!=V*=zogfb+(H>RGnzsE5LwlG*Q`qO>-5Tw<uKdP`S
> zX@~U+!?RcwexN6)Y<MQjgBQYxW3luVPKsWq!*2?>mV0~JFv~YE(*}MJ^ST+cx~C22
> znDNb+?>%j2GCL8!jLiYnGB{HZOK>|+-spnO_R}<%fymTC7JaBC5d0frDQaLtLa at te
> z;~yLl8xk9m8j{iOz*mc+6MpGhG6nK7*YqitBQ{7Lj^GQJYv@)Z{7Q5v=`_B$f)&)~
> zx<@zW)vv0~YJ8+sU)9n$*=18x>d!THE4Gbka+;Fht~q4L%LKpVDBZ!rgi~(3&~85a
> zuc|}!lOahn at T`}nD8Lx5I*RKApOI%d;lFn|CHRXLef=tHGPhK<1b)#HU;jq^DndFf
> zwQdVn7a`)M30V9|Rfn)Ux3&!A%T0+~2d(Ecq(V#ZLTvSLob|!;ee2(>e<1SY?r`-C
> zJQ;^O1NdP)X=|BN|3H0Hu&p$0Xc+Nm6AEoLv6`m`;>O|Gq4lfl-wfvC8EgF-T&Dv|
> zDVb-~uf=a>{loYrzc7;%lmzb{T0P8tBg)P~`tbV2EQ6U52Voakde;AnA|Pyd`rsBP
> zBK6hJ2knWkuO?I=x_j^$l#+=2)?og at s;a+2Hma}Bwd(lzs+Rg@>?;#wAybP-%<UL0
> zQl)Qe+Lm-{A0{0*ft@=LhKtLr!iJ6Sq<GBB3lL%R<ev9S#{ggL%$_Zts&{IXCHWH{
> zUF9BnOb4!pAJu`o(}7}Y6xA~qG__yNT=)G%LnD-^$KxhSwhQAz4!$i_aKuh at uQ_g1
> zCCIGB<7O`O_~6 at qq6)hGEhk7?zvX at H{CyWjjCVke;qjMR2N$nm-`V4xY0lN_Wz1%y
> z-xktiwyjgmew&;-=wbgt#k3)elr?;l`;(p9{MgIu%&H!drsC|o5p60?8HTU(LEb4i
> zZLG<gP8K-_(!J?H>j8M2=MQ<*?%5Wc at 4dq*GjGF}o*fN)p|>!33l0={HaG0?Y-xDK
> zGpAuG(N&beux at V08kz_0Z$}|n>Lg)yeGHx|uN9K5 at TX)4^=KZw4LP4j&QY3H>JYAW
> zK^K}Tn2@#+SHHqh!EpzUHxO+De_xGqRvn$}170~<D#3GcKJNCRz4XYzWV7?=DwGx)
> z+3(^6lvSZOV+K#&xf3gyF}&^F-=nnWNZXEQru?_Y{o-s*T4K7a69~Xx>*Acq4h5WC
> z!L*Yj{{VS!GF!u^g64d#*swmQm#>S-U=p8K1 at A}bUs9qg@(6!=GbEhNE^vLBSJvf+
> z-x07X2b-C-j-F`dShaB%2*;}uf%o?4WM3-j1%51wmU2CO>L)%r`LNUs+{ETxe;5#@
> z`wz-vEnoU)tJlNJWge*81fLXHm$avc at iy91-)N&+LMxsD-2$)xoO_|~hQ**S*1JXH
> zAta27a*b1v)$hC`%hyQ;?RhV6bLzt1yIF^5#kbBo&z6?2OC)cv+coZW2qY_)z~^8D
> z+D7_}`1<13Wc<!-wMOfG9r%$_;J0Ax;T?CmFMbF8w>k~-o?Lcg&A;RwpPL<_aq~f^
> zV4?gNw6T!rBwu~DxgWlEC-vuJxp*G7UH*mqZnaO~<~`H at ez}En at Q$0Q_8y&oA=m`)
> z=*w0prpSt at ngb8Ck`(w!l8=JEwre#vH$zX{yrCI7<z_`q(Y}L8(9Xz%Un(fFi4V~C
> zciYuOYCp@&W)t#NqFwapC)l}{uQSlusNe+HBhYxPISPcTu~p?2I_v+N4Fu}(qJJ(%
> zUE#I+2B2Oi1!lu~;j(SV3uN2T{6X{F<;(~PocKU9VwCnSg8eU>_eX71LPmWS7^{$d
> zb!y|X1{lzhIk&B$P}@Zd662|wy<{rc<35^)Ju^l<=%%GSTW at UDxH{}%z{BO|U}l$M
> zZg83LFB=f;rzc&J`Ltap@?;ZGfvg4ej1|Z at kFMbriu|f6wSWt+nvs6pt1<Y!xvJpR
> zSR6N0WkL%1Eiha-(0IO{iLKOPQ|#BJW0>yM!>odh20!r&^w87qTjVh&^9@#b+vLTu
> zyowr@=iJWn<d at k0!`PR=H&tc--<Q0kY11WLfU-7eODS6|i&CVPM~IOkV!*OYtWvg$
> zKL at R%jx(UV&<7$^z*1XukOl?pEFzATNdYxw4GaP<PjSg#M5%2uBNbUfsm=d;Zc=2n
> z-~SJv=I!s^cb9X|@;&EBPgQAmc&jFK{k-!aWcXoKLf0izKAy~Hv%3C)y?e1&*>w(k
> z&pLC5eS%n63x9OUXOY8Z)yp3iNFqZfXR2?ysY79Jt&k=%NilCag`AA6V7h3aby2)l
> z1$?A<k$khlRf>6)vFLt$*~(3CStaihg^kbq-Q%#{BQ`o?Rf1GdrA;5f=!q-%zI4++
> zRxrC8U${N)@7IDWA5z$+UC0A+s>)Jub3CIvqyE8vM at g5Fam!%(G4#Mn$gMl19Wd!K
> z1HK?$nkH(c2?w>(N1J1%{b^e3r^mCU7Mz<|lO at ec)4nN5vw_mWRepue<`}eHZ%EVo
> z#agEy&+fW!ry^N5;H*s>?jf0RpJhrmB5q_!x5R6^?t5M^NsK&};_<Dk#e)iy9ai(O
> zC7aq;Pgl&Z&n}oiEfpS4J&Af=<@IcTUb&a$QjSi{x$9pwx{7}l?&{!oUE1-)j?p_G
> z-|^(mCwBa1=aZm=aXZHZVdKV^!4DlWR$SmuIHD}Ni8zA3m?hyD at zmkbhjZA*V at sZe
> z at yKxbCo0P-rDda^j<0 at 95ae8HO{pM0((c`@cpkF;W@(ftDeUDYtJ$=qV495nF-=3X
> zMS~dPJ$s?^Tqp94DZ-B{Wb=hezZ3C9fOyC3`2o>_ncqp+cFO%}&=K#yG`l$5>cpC2
> zF0TOH@;WPw at LPbT){uNFc_AD}6se_%$_ at IHt-`C4o^TqD5v>|XIbnEis~)&IFwed;
> zyYvDp%)4djz*Z5QdSP2K_+245o>RVAgbt=vMQ7sFESsJQd=A}`(JMyI5XEUVz|RD>
> z<CK&C*>;?A;6~eV;^Iy>ut&z$vB7p&hjJtM|41y$_>}Yk*+WL(DoviwKnXUg8ThSN
> zp?#M(sJ;0aJ$_$SQ|Y`Fw2#nm@*g43GI<ptkmR*imLEC0qZXb^I3rtGx-kF=lC0~<
> zi_ at dC%>I-K7EAFpxf0o8a|>8H1HMXle!_DS_>g$lgN}nM7O92>@!5wO2a&&H(na!$
> z35njTY9W1bcq>p>1<<<7O}Ev~LHiDBx~)1F+Z-`l-XM;aSK)Yh^_;?ls)dpzL98t%
> z4$e!OGl|_MS%Iw9+V5^Bj>9Z6p)xOL2)L=nKSLvDjuRzIuS;F8LsKo=*n$~^O;`6v
> zExy++x)=|zyD!b9FA=q}-J{rjCb;i;DjoBIMSfeB94+iC$EWO~N30#-L(c4_`QGG4
> zJuK{48w^uiQZXCY<%2dQNAT%A3cl$>WTTdF_bt)8^^JO1-f_3?2+sEO8oA9~51TvA
> z#f-GEugID%*5-KW&d2Gj=6#PCeDkQ0G%rUDu#k_Yx=}xQZwh?*&QM?g600*n*P&+y
> zm#NvUZ-maS2FN<y9 at MRHx8BD7554tqtbfpY$@bbQ%}EHqdaCiE>udhKh_C@!%*Om=
> ziRY^<Y9V at aqb2AAw^CikyaTBwjlT)V71Y9{7 at JcS#9v*S-#EO<CH7>6O>%I`4R0>J
> z at y#A>ZH5>6`hgE25`9v`ZR%*8>Dg_=kFBw>FHru<Y_ysgSFWQ0V!yGmFWKxGjt0=8
> zUQv{Q;X at lcP3H*>poJ_GJs+E8W1rJ`paIf0$~s)j1L{E^TuWbJ*-GnWOCzLB9ahp%
> z-X{8%CWU(XsK#qR{rVzCf_{1dZ~^hZ-~yC6&^oWgO8G&WnN7mleFsqxq7KKvyX3tK
> zxl#vy#D)B$i>nqM?hi|Nsxk<a_cqRn70?{_!R}3%#Nrkj^OvsCnq5U!r0}KP_+^tH
> zCw+->d#3=Ti%Xt+!3CsneBdH}W9=B|*y^B#G)agU_oHxiB>x at N=|Tx+R;b9<WLT@#
> zgZkTStSk$X&FJ8(;8ekv%5$MZP8a*bico}{_FBaMu%K=>_ZY7A!uzfk909kdn6Hip
> zJp(G?>UbPw%XeHw{w4kecz+2{!(<WrmlE9I?N5?~t^hgQX>PH~`&%<*c!?_lbXSBt
> zpHLhceDOqI_;O4MY=+$dTHuGiP>s$C#8rOEMAne!Vb^>LT4r$W`FC}?@viNPmaLxT
> zTBadPQ*a7D3mm7s-vv*O;_$`wGGfD1zNhdJ?Bx(zeaar>K8qo{!^J(Y37u3^w~U0g
> zCUWMp!uqO(YFyx;RMto2^3HND at 0_Fe6o-Fm1&YZ6Ubz`rUH^f0E{nE$8Pf$PO(~P~
> zn0u*>4E~LV*54z^`llhk4Eb4+LT6<{aI?@jg;9-u0!MM~7DVo`h!xOQdUub<8xJ<d
> zgbuMKa*?w_7sJ~+GxQv_HE>S)#_=I9EDq?BP;UjuqsBS>9cg%nhO%b1yF%OSF})Tz
> zm at qhmIG{gjQ0nXLq(#SQzPLl7^$mG75fh{Xk(Q%hv3q&wIsP4bK6?Js7c2|9 at SSNG
> zV`VIv-<ue at m&M63jpH#gVPm81WynnYTYs&<pFQ%8-yKB#CXfsypK(pVH%@Pi4c!B&
> zCzmb2cP_#>^Mch8WgFM78YDfPN8B~U$io{4V=v?$uXr&AaSc`iGkW1UDhK6$kK;^a
> zYa6ZTP~K!}kMF9$XLq+pzw7PMhd8*)sr(nw*m>LZR-z~wJoPAAL?a(S?$H&Ld#&qC
> zBh9$w?Hu71LX2H{0wv$7#9VL1i1(X*co}(TV0`|@Z-$p at k$Xxp%et4Nv`Aik0z3xL
> zA9O|by6?obyMSc`A0n7a?nz?KY0x4MI~~jC580ZTATEeswJ<8R{rV??_yLXypT)67
> zJ%ZuDEXX~NxdpNifFoh>M+|w`)|JIf`l$)rBV_F~|Li8%&1J~Boig$kjctqPmQG`7
> zyY`Q5uyl%N+hP~!Z7X4g+XC;XNFH=xYk*0Cf8%dAb31!dacI~xtG)QP4|jkQ(i?z(
> zUQqgzc(ye`9Zqp(t{>~vUUa at q>zKcEz&c$^eCu%V8G~nEK at LHVy74E)=jKj|{>$U*
> z`EK%Hl)dlmpzN&|F5+A$Z?2jgcnj^EN=L(n$Y<d9{&}=5_SIhHZQ-UbUMhJW-f9h;
> zIhA`>*JccEKb0M<J(V7GogPGpnhPJOS%Fth^$A=%6%(jC-JhRpgEWYDUpVJs!I8Vo
> z at F8sm!vA?*IwC}(^h_1Vm9R_Ic^-DdXQB#t#7 at RB7t9M({F+8?|7awdyyk6aR}$8E
> z_!$pqQn({Pcas%A*e4iPSa1rY@^8q7|BLnB@{(sHv^lWcV}%J>{IKrlkbNH#9jO1Z
> zSdWL^f%bmNk8uvo2Uc2hB1Tb5_ZXrPlsSyw)ql$pl2gM#)dLrk6=`pmr`xY{NIC*K
> z4uGEbqzZQob_y}Y8T*juXg|txv>zw?T3`;XQMBHLPt(e>Y9Jw-(7ra$Vzh7FsT{On
> zHfpf6L-1QXivy3sgE$<16L_fpIQvZGY@<8y%IRbeqfrv3`aazu(%q2c>?hiIZ~sBn
> zq5O|M0fn&nu%e-i!uObh7VnsfXaJA$7D0^p&&DG+OX#zS;C*I;PZO+6GQz76T94xJ
> zt2)oG9p>d at TJA(#u;q#c5uf5q%qyFZ%`9On%<wyZr1pN;lpga4 at 0ihw%lu}~BheaD
> zcCCkjFB{LlMFaf?6Q5v(Xu;5spJemiN16 at RtUnt|Qe`dPYE$F4I&C?CXzEzuM|#LZ
> zgz+#DyhFBowT%<^f98CN>Gx=MY;c;x+M`C_Nzj+0-Ln`iRG{8M_AY$$N4&L<MOs at O
> z8bDU5kID0gTeQKE>C|MW;i#eeOyE}T7j$d6nUR0b^YHH>?~PkA+TP`(?OmYK64spH
> z`zL7RbzMUXGy6J1PF-!F6^iBue9&Eu&B2jV%HVGaz1Ng7?`Y4%ww{b_wSHIxUXMJg
> z9_N1QCeK5}qXgc<3T6!U!AkrRMU^_P3x=`(H at bR!a5vWr?kY1nBOj#LH(2o|0Yije
> ze05JX&6WZiY?(K?>0xTWt&=|*0F0ykXkRJ~7XMy+9q9p0Mk;D!a!_p&s8%1wp-$wZ
> z!RtgLvTHro4tS<>sv75mp1x}p=SWS^+dTIZ^kSVZ2D~w4FYGFZUgKZTD at 6mKeS>ZT
> z-T?TeaSo2$;Y$z9!g#%QDiN)F3VUyz(gx0)PT+laTP-4`#UM*0q%Madbc}%<h#ARw
> zxKw=K8QfLI#`tGcpQ`&Sm)HJ>+5okFlKis4Ervti!&?|ndt+%{(R(_^VD{oYr~y#-
> zxZ_jMwoEGh9dkE#ICy82J8TAb_;l66li-zB>L4wp7A~)OsyL)J(yUND|1vAeX;!#@
> zhqaR3&XIeV8%AU-=oLZ930D!lvZKVLXV_k<MXm}V4!n37mrO*|;Fzij9nS0dyIUb1
> z8Joop3v}1FG5k4A$q9$y<)FfMvef9+c98Fb2+PWCC8De+4ej_rSbekM&pxP_+1Ar)
> zeF^Jwakw2Cfg)Y_41N2S`xI~CBUKAg((n9cwjJ+vLt{v_6_J5tlO`!NjcMhZ>+05N
> zyLqq+$N5{v2WDaB#yH){XtAGvgW0<V(HkzcXsF%VhB|sIKaY&AgBn3`Oo;m!(c1B6
> zK%ah|gZt}HBL<DG7|N)tqo;81ON<Z<`oJu3>Q=<I5?C)h`!s3%)Z|99O}k6qmFUx=
> zRAcvf-s87chNJH|a{{`*+~=@<Bfo=2htXUiX_Z4bcgoiX)Stl*pfE7mn$Iale!ML(
> zOO#|g^jY at 0ZV#Vl0$-EW{5|NIPxPfaLylOF+WyGLU}0tW7fhKKIcv3gnhif2RFEI`
> zQDBaW9>6goJa4(ri<$pv??_u?793Lh2H^#^W*?^x`?zKz_7`8!;8UJ`(Yd=6-u&aB
> z52kT8P(i<4SxX3gq8x;GxT1hAo+=J~@|4$v-(}u}8>lhpQq at 8wJCIi#t}opCkTd^S
> zI`kOFp!Hqk5W;zg-FSh`M=kd9TI|Ja{VkOWJvNN$tQ1rweD#UQnDDShx94H>G|KE$
> zR9oP!(?ltFkI;GFCA7=JNW1*fDn1>xNau2O7`2EesOEO)oU=_CG!C%t&~u-I=N0gF
> zhCYtJ at r}HsyVXAYo#43eo_Ro?pv>r#`_zxnlIDM<vYnF at jI7Hcq6ZXhlc*9!!N at qa
> z#tSObyMXmU#2W1N;1pw)TcGv{2cav931iF*ddg{tg%njBiZS{0u<FD1N8Fi0ac*e+
> z{T_D$T?4Mc2>*P at a_JnEOJ$MdwCYf#EQ}|{`V_F<cs5cKe)Zf9SJNYPA&jFe$jyih
> z8jI+S#{#p~G~?Oc1r>eb0<+S976a~(y!$XSYJ2(+IeF=9#6})owNSJ`x1O}+Gd6)a
> zxG$j(`E5souRKx$wBG6!HDa|`dsk83(kVqnODAp5EDmpP$9q1;Gb;7W<%Jk|>?0#q
> zI<f&wcCur%eON`d&YX+*Lzd2*_UqdICyAC*E>N8P;p%q!o|U&lQYQXmC at A${^bY4g
> zpuH!KVgU6saUPtKzjC at a%H|wuxChOQYfDsQo+H|BV=_BEl2e77^7MVb^CAM#wQ1^L
> zjGAMCIgt`hr;s#$g39D*O|67y*ZR#78WFsxWQ1M}%!;g=pNkP5Jo0v at LlZ;sJ5E7{
> z0d;JqwfIsixEu1|oaLUNWMJhR9eOg#vHv#0u}4=WcnV=vii`ApS6g at Ahmq6bdf%4?
> zW`Uw;AU)~ag1Cewuw864;%SD%I+sM-E`anmFM~hMB=4_4m$k5y$5Pf;P$#2J*8UMZ
> zpDdmQ&nF9G!G*}MR>W at pt%xXW{z<+(>@UTWSnqSzN>8S<O(6&Td!5gXH93CltS-Ic
> zDj=zWbM?YCC!~m5ThmnSx2!E$67!*<9QVTgmxbgu&GQq;Gsiz$9*P<r!I%cuo-=RL
> zD&D@=PRBX~7Lho<cd(@c)bDUysD?Vv5dIyq#@~VP4quu<a{Z7dWFqWeKh9wak7*g+
> zIx)i2R#gS+15XleKXI}$S(&aVN at n5X(5M<rtVx3reJgRB=+onBPH|}9UQkTK;n)t$
> zq>jx#otld)9|z_%Y3MFGd+jrI0N*ZF`=BkSdO-tz8r8%I+1sS0afK&7it=m!!fSQh
> zuAtp7c2U3ay2s<_3gnB>kb9#wAK8-AIyO at C=WSGTf0A|HJbg;PNDU(O^yc#VO;NL>
> zqY(A#>Qr at sYp45ywqNz8-%#J>YBH{NfCC6$`1(KBQ$ZH5i*HB$5^&!|#HK@?lK-ha
> zZ;#gMtM2w(W_!vurDR#+vVNnVT1IwQ&bRX#4n<4$L`%jT9!5y?t5>?)v3oAk*=r-!
> z{<Q7zsl90%TCMiDYWIRuy0DhthZgOgt2eYM&9#*Ze8Vn+E2?JQ<A5Zwi_<_qLWAG=
> z_qJTOA=;MudGr3QEvbe({;4fzUT at 2LZfwhr&v{#x at U|TLpWBkY<RT&_MSVO%lRibA
> z*jTjixJS_M5;#C;Ghmyz8}<svy37^}@f5Rr$(oXOISj3~UKHgMftRH#h*5S?K0$ZE
> z?vO-Z)@PF_a?Cw`G2&Ul8Q>EW__<MOk#nIwtEjw!j}=B`KqnWcNk#Uibd4B*_dO&A
> zJz1p1WP!mFmqeI;f!2>dp`0SLyqUIMlY2>U8g%7vyB}|AbU)Gbj{C_bM73)l6(|Q!
> zT2>tXv5S|o6??$SM6Ba3Bw}O|B-3S>k+oDRtfhBLBNT<cq4u<t4 at mq(dGvKI{8?#a
> zB9BEv`p6$$7y+ZWt?UufZ9vb_4*f=I=>?b2s+)Qb+kk#Q=L8T3YXR_^BAeonAI84o
> z%Oy)aYM0B=m{^r5qA0#n1An|pb#;MTJwC|DTw)48``#YnoDOp?D5OOE{i1f`IpD^j
> zEs4%4;*#e0U{hFm2=fXv?8-yxRebMlJc2 at DD4o`D&`OewKiWDOD?;7rK5Ad+J{aQ~
> zbl*jHTw&4!@ggWz-CMu#AC+NgzJ~OJz(TBAiFZdN<QqnNr^^T0avmBxtcK^ic at 6MV
> z;m}ZA6H(#^TrNBjp)>HIieII}$|1QVpsbVDzJOX(FyNg0_uI>$lrUrLxE=G8I-$pT
> zEPPoux9LFfH9pPyY-zzJ&F|lXF5~msVrZYgD139vm&D7VO}~Uh*9-d6BfFuk*z$S9
> zDExi_4`#$DVBI+K&w(TFkFy*{jujjc+o8uOFfm|><0>mjGx2yVA(A~FHMO#GUx9rH
> zV_mQB@$9)3-XSr2_Bd03h!>;1wYKRwV7tLj<1J;d_qdrBWiIlY;Ux*F%ABZqo2CD(
> zV_9qr#_R{gxemRPTltgd9KJaYQCUVjr%1QIqSSWleq54uC@|qbtLUd}Wa0vYaL&fQ
> zg)M-PR6cDGnIR)O7s!Bm at L-sISY1zGgol5C$0YcqW at Obdz{^f=W!^adEUec;Xr!}D
> zjB}Pri2P;JJG9GL<UH&cSP{nl7FXd(BZ=_)P7RzvOA_)K{+Xs2=UiynNm>>;x>$6U
> znGq#Fu!l;5ZkEc at A%%n2KdYGa{sJZ7JtDnF2c+~b_mZ6cIC2%}r;n4HeWH6jGb2j)
> z26*qJ?VeN2(ib<*fe+$bw+1>R;0gsuTy%c28|Mchrgxb<z*%PK=bXp-5T^tEY)=o{
> zJ;!fuoa1ESc+@?`!!Ee|=G_^M;}v#6pxX0qG9d0u&x~&%<(G+_3h0bHt~fM+GTTs{
> zo&w(p4LAAb%9+LN&VOKz-i_}yNpT+LN1i{#V~Bw-$`ExT+QlR#dG2!>dgzN1^Q(Y)
> z5cw9d*ZTia9mVT~R_Es|>SfPNtSN|wx9n@^5wJpyI6_pY_auw}MAmSRTMaH?grqRf
> zr)rOgM%V;wxfz;elxc_d-W+XB=<CV95NED+ZY|1Nmg}Bg+lx>;U3WB02d*I(`W?hv
> zcbB+d1m+yAXVyD44E9=0%xor0q at _@G<+PWE$(|3Sc}9Jr-GrDlruApK5<z8wfvt}R
> z`XVVXq^l?P6Clx?=Mv3%lH{Rv&8J!7Mr3>g-Y at BG6QKFfNIJ|4__5=66Y!3bRB^^2
> zS<FBz%S>AGTo3UDSqE(T*eF*0X4#7`z7|~TK|W7u2-=~HLDC;_0Uk_R>7M-9>gJO9
> zhzu{3yecQbqX}rUDX&T5OddbT;|9R~9dAlg#%APZ2KJUU)!%S+3t{O;e1Lbm?Ma<U
> zO_snA2{glQ*0xK at dJWC#t|WWEq;TMcuEZv at J*%Bb$uXL)r1xcy3rMot>QfZyZ$@Q8
> zQO>gMYHY!@)j(bt*jJ&d3Gf!UiZ)3p>bYzRwFdanZvq|uySCZ_t-$&>d!a9{NiClz
> zZz^FdT`Ef#_s5h>m(xGMj49GD+wMfp)uST5hcLwWMSR<z#hY2Ov_Xtzg6jo}#3?O7
> z%gr|%YOK=ymwLdWlvq2be0~y>=IcaFvizyNVtl)_WR(W{pCC%&?@LUT;qXbxGTM;W
> zv;V5v7s8(%74v!)k8X|&j3JEV>?NC^TdjQ_86?1QetIV;zmCqK26Sb4eNy2g_3{3@
> z+&X(kXA;`PZf9sImZO2Ul%eYmdpufd2+nHJP8$Ykqz&7|!g|D3^n$+3bz<xVo^emc
> zml<LIF~_z#l8vJfr at tU{CwPehvLA#O!^euoOsU<R6vje`@n|qOEJ^OJndm=R)noq*
> z-}gp*6zb#MuV8Ja+RVfVO at JR4^3=*HrR~f`krNF-tD0hwsa61mh+{;Lh|a(_19L&!
> z1<#Lq6KTG%;#pW6#w5q!7T#2km8h$}Q!Yxx%vt5OVx-a&a>FV at 1?A-|du4y0PSz|E
> zl402^SSNGO0vlFulGwh!wtg(!wa%6rW{9w at p=e2X8yovD*KlFgsW%1SmuHB>TI{fy
> z=RW42jDFT)M&Or5Fk0Efaj(hl4-O=EGQUIi;=ZR8L*snt2*lvU;_%xe{iWo?!`}&8
> z9&(0y-FI<si*sD>@)q<iiGeXbBi(N^Yk%(cwW#l<CfX%L)v+R~&fWFB{0`F7&HZid
> zRq|5^R5T=Xx`{e$o!(gHp75o1>pdTee1z|4gkHZs4qpQ-1AHqatlFT*a`V<BGBg*(
> z;m^dD(`{+RY?ue_0c--|Gw2EZOy1`BI{cD<d7u^ECcOh=kX;aT-Df(HB*%piGls6i
> z3JGMx_+Io>ZDRNc{1lhST0DWgcfxznyNxN?$daU*21B3~+T-}3qU6YB))A2Xl3jJp
> z+SxT;#&!uC5eeR4t?4v47sd4GID%LzOnBQ%ekVMd#~WL`v4K{)ZrUZhjrd#GLm4?i
> z<@&p7n{jrZ!PXm5(bE)-b;CgeMsgzNK(dk(n2Yzl2;OOC%ju%Tp{1?bDxa!D#E5#>
> zdx{E7eUP&mzi~{*Mt2ah?F`0O6`Lz;EWEEiUY at 7ut)tiyhv3?<<51l!v{mAlqon+U
> zh}v}ErX4X}aW?bPoWn1o&%BMA!1BQ+2<wmcD=`(a>LIrLlj%}2aLQAfQzg at ssNYA4
> zNgHl9;t5Z)LCLXZiA%~M5t=3lFA)cYo&)yX9n)yucDMx5oOpy(J6{*l(vn$xIi4;N
> zfV at q@++I%f&dMAHj$mW<Nmwf|YfCJZVIc8;{PXHoy_mu#AO<YyXF$0%z&+08`YV)i
> z2fcM$VxxuL>n<rlR;O}Mo~|VRHc381wa{!}`tEvU=U`0r1T{@`j~BD#WT<vxW$`%T
> z@!2!Fs4n;0^95NNv0`4=Ny714M|@&X<M5>$NV|ZeSjnV+wd-U#ki#VlK;!B$gGhV*
> zt>5g62{vh%{AQJaY=&>ryo&(^lSWM;-xCSQ`10D5#i85Af<}Qx7rs)T7-%h7un((;
> z at Lu(?X4s?&fwwkPP_~H$?+ze8En9 at Kx5$tdygM`qRHFxr@#?_;N>%Zy$hT>Y7G;Xx
> zssz-2c+19SQB%P_QB5tUfk93}j9)X}XyGw_BYTE|M|DE*?&9#rickCE)w-*4T+x7K
> zvtf%5f3nt>4?mH?$X*r?OAFeqyUntAo2eGm1e}#*%0+ajeXP7 at A8R>Hbhl{0zl}@t
> z%bF^~x(Nm5m*Wb|D>PNuTM<X2y3-3yahB6$%7oRsx!onhE?cjc&r(D#F0DL{Qn+n6
> zoXN9lBXSpLbwcM>&b?GD=lH*_k2|;0N{2RtzPUcW at ag&_ at G(2!W0z1L7c?}aU~6nh
> zMKq=K=44#i?oA|putUpgaDPe%);M+q=cmAPA-gc)SzjQ>hbVZ&U(l*d97Y;I;As`)
> zZ`JP@@zda7YOY6jMBE4Hm2xUwdkwb1;c(ZddsoZNUhwtxiCwEe(G%gN^$fVgc=u>4
> z>u2=EK*qSQNS|MYzvqcFMR__AI;X(Ph<1=rZvs~dD`&k4rN$8-zAOj0IZ>W~et|DA
> zsC^>Q2fpqk`r^8=+Vwq2MhqE=GUK~Uw9e29;L|~i8A|^qvI at Z4cm_#U{!)yQJ+zL1
> z!tFt+x4 at 5JDvcW}TfKyzeHj|_WR@?~SOuJsfM3|K^A1lkY!N15ohMltB+rvqGynlX
> zxELEE1AsCe1uyn_m7qwl#C{GP9qcYO^$~A5y59LQe%bA}BA(17ph3W4r6Eod8{;x-
> zmaz1r!-B_Aw;}#gk&$FB3=9nNPXoO#{dN$zugR^50VUs|YQbR^zw9V&U-4)goRh?}
> zFI!u3+K{6*U8oUD+w~(_6X45Qaov|yZ(lfLhGV{N#>zQ$A!*chk^9Nf3iv<p^R^Bl
> z&tET%Aa2!OMYT%(tIJFhUg^aZkI8bISexk6tW%;rpHzDn%6_aZk^3}T)^|#&22IzF
> z-GkO-rfihc8<uu@#SxGY4Sbco-;ao()W;$s1a(-+mr0hqss5>Mcv;4oAfF5J{^IaR
> zC-6(5UV6^MLl^D%4X{DvOFIN3qaW;e_`TtnqNw7S^vrxU6WwD-Mj;FM@(V{zEwfw2
> z!i?oVb;|30)iP5NkR?w8YRr8?JAqV3CR-h2npTWT=)0p=E at DjN3oUsw!s^F{qMO62
> zA5lte=CUF90`7tCzPnc8+{>)mMDly6r^veK#Xz3_PDrYqE;DSA`oJJq$1?mDdp~p{
> z=&#g61PVwKZ_gBDQ7iYEZ4p`5EMTfYOYN5MaysX*#7EA>!d}@Y_y$ID2Imb)mk=6f
> z7PD9~$(T%BL3P%_{JhVL?5)CHc=BK$`FPB at Zs6B}I0C)_xspLEc2urvN`~hkbM0-S
> zIOO}#7x1hCoy&Ds?ar{pVjlHuKqy4qizq4->Ezm&P8Ze$(n0j8tqQj9FA~jiI`}Xl
> z4O{FFvs$EB><^=ToY&BPunK)1pO!E813#C5GyVNj!KEZ(Z$R)EdMg7IW*eaiL76h~
> z?!NHDnBd5VAI4^Pal?H$(+_?a6XA#P68tb;h93qZ*Vq!nUv~{aOQ#17hy-v5W8pd?
> z92n#=@a`RVG=?OWzeT)@wX`3Vn$iQ$V9XKU)EE5kRBZc!#}&j0^6<v3UnO9hx3&1I
> zSZr_FI{7P|h&Xgx at BCOKRN%60&@oV)bIgUoKcoEq{!$HN$Z=9s2oK+6W=7<=6Y3Ef
> zftVEre7n~=!ehi)+V{;K;bm#q9*qJ2VG%YS)5#Nn5=#e43{)(<jSvl4E1MHI#c6Ji
> z<<a=k6${z;sC3k|5Adoc`1s%}ndE9_X4i^?!?0I#d at z3ZA4i^I*Ew(^naJXM9z0nF
> z_i4-gTO##{BVT^1VY7c~<3u3-65YSTcuMkbp+3ZwiiR!GEAjkF0={A%r0dl#OG(8(
> z7JNwdGB+Dt9Vlt^vgRRsa}dwV?$7ey6>J38r>}h-{<(57n{Wl3a8B at KU~b at JZ?CB}
> ztfw^413S|Gctui%5N*Ug=ZISdy*vt!=fTl)U&8yz)|e%U+jP|#7?XP%wZsETw|im(
> zb1zn!B;n=8i3jZ%*EPuGkk5I{mxya?E~IzCcb;f>&Cxvk)&|ew?X~<&b8`&%!x|sg
> zzlG;VOK#%xNDunJxCdP?4>Se7m_P-%6J-Abce1O=LecCB6V|4Z6umYTk_yrIH;GnT
> z9f;;m+)F0a2mGBG^$~=ZkRg17H#_=PrUkWxyEtk_?LjNW4twzIPWuh-Ogx?d&Z!1G
> zD6*W;8 at xJCNmD=24htl^X9E at Relu)&uf^Jy;>ZeL#5U0l8#mChJUYL#!VpugmBn>&
> zutx(?30?*X)Cwy4L9YX;ie~t`&ZlCM(Gt`KM)3LY%&vL_Uu|+4dg&0oO4ITE9<vN@
> zYky|D))#j}?}=EU;Bm`aaZg|n?Cs>qV<f%lx>}cnyp)4}6#UcDbSx=&aaSd+YA-<7
> z%IW(fl*vg(j#!SIsR-maWckm3d3X<dd-z|@C}!DPvK7=Y)2=ZioQAb#Gw{IEvwgFh
> zXMI1hbq0K8N+hi}wziiqx#YEdY~y67TO(e}R5jPgCQWP9ujL2)lcDFK76L(ay?9zQ
> zZE)47i7ek$qu7x^Xu|3xY`XB`6o>QzIVa$(nbu9BnYR2tlD1{>H49}`MblUiQrRO;
> z#1- at 0NAQ$KF?5|5t!%L$xtxL3!y4VSw8;Ri0i>us3~RduvCk%1vo0F_rTdecO~I2S
> zhbZO<HxRAk!&JwWgVj;QEhzRI_=RV=uZ{sNn=kA+pf#Dnb0jHvyOI@|4HA$=WBv-R
> z;R~+8`2u(%^hBP0dbV`486H5}l+_EOr7V`8^-C*<T$|u8HMxa#{?fD!EN1<P?-4bG
> z>V54r#t}Xx9o9`D)w<+6<H;n?JXoCL>1t;RV&RQ}Tu#0bJMi}iR%tU!R%9Rm#z0y*
> zz(xowK&>VS%?Bsox8`_JC#yHMtY}Lrmt at f~Z~5hx{cW*MQ?|h=4beMI1)_7(xM3L6
> z`;WrUTR2xcwK*HHJg<NTS|YUQ10zwKP~6^rpoQ^G{UMhms0l=$DqVYC4OUf#_YT07
> z#HI{fN%BwSv+e*mLXJp*9*ZGPATn5BYBe{{1Oh6_CVh}DS;fS<?1NJ=&R4(}|4v9r
> zf|$vMiW-(aRb>64sY3i?&#TbY)jQ at Pt9hEYZ&OB<rKvs=XWNs32pF)BLN at DPpA%?Q
> zdpFwEAFM*W(R=+Y{O1#`0_I+StHl6Ge!sc<erQ9$S=8q=vA{vU<=u>ZInmy!fE<6X
> zU+Rca<75p*RfxPF_Zw6~=a#vU<y}6*Fg{(GR^;1J4$Bj)=JX|4A2xkqf?Z)#UXFS2
> zSvxQa8$s=xr)IMC7|jPU_SfR-bD(2-Tw95;@)aK|Uj at p^e at lEDlA8|qYgn16gXiZV
> zvteU_PYm`1rx1fP at xGzKp1#508iy#hP!QB0F_4KiJ=ij^H37ax*b80mI2QU&ji-As
> z11|CFHOgTt+q5Kf9w_tVP%oPlX5qxzL7{$r33UpA=IC4p5$`ftIgGc}&~<+QXHCie
> zyD&Qsq91yTJ><m7aP6RQqNLG?>~=XH-aTSCCaV2-kT}pmB4R)Ez&F&C+vKoySNamn
> zW1XuGdJYHc?RV5Yz%?a{q?=i4_$FR at vo)>N7|1-DD5V{T91axG{UtZEB%2u$x+R`G
> ziD%GE4gId92hK8#8U`($=<N}ePLrMP?6`77Cv-B5WjDsMVVr?WtbgHa0wM;l`I5Kt
> zmx_cphf7d1!W9*>qNOA~q3uB<D_89^Du$4rY6dNiVQ(K!vmSt#_hec%v<As`Jhm=L
> zq3nZN<!_O8tqeDpF|$y8>^{Y=#!|04bCKl(-q^g(x2SjE>V{)UC8I0D2jX$w$mvRs
> zRZx~FKG2XlRgy%an%<O1ucFT$gry#<MJO5L7V=AkKA~N+rn2ziqk8nvCcai~3S`o%
> z4T&9J1xiN!Uk4v1L?>1T(O2RNDLMtw-iHvQa<Xy|TD(QQ45&L34pl+VOY03hlZl@^
> z1PRF`9BRpG(+3^_J;_9ziA*33&d_Qw^w$)lSN;aF3+0+lwa#B;L at v}79{4<Y<iO$x
> z_t0HejHzFvcP?Xf{(H%5nCraPauZA3Oh9a1M7)D;D+W<4G;BV3 at n@5 at PN6l?X&6HL
> z&p4kdpzZI_m$ZFS%0g_8y8Ra36UHEL)tFZ`!QobIp%Hc81Zj$6 at ViE#<>-n3nffXl
> z73^IyUmF%3@{HAo(#qr+>izsltTxtUd5OvFs*_T=?k8PH2rRbVQ)ooHcu(m)x8SRG
> zcQDm%)h;snG)MK3??fKA+i>6fLgP&67)@n at 7x8LF2Nu(uIeJY>MIC1~C#^fz@?C2@
> zbPhKijf at DhR!=>n7|_}xYG9}Jj!Fv#@fDjKCf9~9k`-y^dNrzX0aoj|U~h0WZ}AcQ
> z7HB+l<(!8!x#Z?dSb(q^gWs4IsDK708_~oK8ngU9#k at ae_*;zC at oVD;Vu~ccuNrE;
> zdQm)E*@`R^DYzq00sfuhMNqT_i6ysW!xv)=n<uPjgT*}SP)nvV4|zT3x at 4vi&bh2o
> zete3{Vj3x&J1L5KmaJ+6BOnbRub#6^V|6Zyja~Om=>l0OCC%fz at TFLk99RF_(&;!O
> z%7W5-+M;R>n=7lDlHG~ma(BV%ZIFRy2>%|Vjdb`aa=bhk*8Pd!XDS+$EQmSal(7bN
> z-C at EnTFfiQOFhoS%65uF`%@S0&ykDq#3aO3J)nMU%V%M`13c99s at dx-$QN!38xY`M
> z=sH(0vWlr!x?YKJSn;z9AXGWn@)7=7h!m36$#$$zR)D%_6xWXCO|Fs=@_8lGnSWlp
> zc^<PY2YxL438AN`rMRB9f>~Xb9ZPrID(%vV40=gOo-v?mjdtO5SykMrvEoATBB at L(
> z-otKpXoa*>`7BdT+&{$qC$h~{Pnu%(=4^Xo%0O?{j<GvD6s;jJ6PB$3n+s7^ldm at -
> zG!w^B1|BF?*yNZmY``psA0zZ*kR34EgBa;`im~&I>~7qyeux+<n49p?ui!rV%OXDd
> z@^v5mwKtJp{@R<!M}KWT-_M7QH(WCblG|qAG@^arp9~>gM+KsaPh{P+Voqha<0-!s
> zv6%WD;zVtjQ|&pme!pZdi+c9Y*WBRQKX-1#vp at Yev>K3S|J- at -x&oJD*DqvM+9?$*
> z#%_r0NqzlyIV6qPn2o#25JN7zF+1=x{Q9#ac6Ly?ui=*+Q at Ff47C@#BT2e2xN3X+f
> zz<;^ay9V#c*NTud*F(}=+wh8LmQx#E#!Sd<_&wys#D-F?X8?Yaqol`kYdGl}pd;bh
> zs2yY{!rwOZGFjUS-XHWHleD(j+9c4Xmy1IKmc1YI{_D{d?n%Po1~N-F7INL@#vwQ8
> zHaBczCEGyhOjw^x4WM+g0IIMN)Gi4tK+`ef(Kw9vTCWJ|fj9^F1vNMtOA<}1zDckp
> zWrVvDJ+AKyf^W3-C{F_=G>tQ0j2wktQS01vo4(Nu{v%(FZ!|-1k&k_|igVF@({A+Z
> zrE`2u+9<~~YZMDm03y~0GfLeUxEUkt={)`L`CgIq1mRU2*F-T5q_i^V`LzW`((<iM
> z;Zjpd<ev9r&`>?zLF-BrVW*7ykf&@EM-XaWJb?9Ta4{>)B1~G>yC`Ay5gnC?yWazs
> z1RWIVf+Ln^m({CtrW*>;6SoF3A!X_%5vzR?kYppt&U?pD_jnU(;s$oUUYFu#dT#qj
> z<U9$Lzmcy_FJcdr1J^&HRg23A>#>zEGd947Cn8hws4VXByUkb!GXv0vP9F#UiB^T>
> zflRwukWs!t5?5=gk!43q=O5wxiP1g2YiFam`ks=gc0bGBavB_B&!VZ&1d9&LMOC-u
> z@!C1a5LHy5(Q8^xR|(is+^nzHLEc>Rb;)$B#uK at Yn#*<nl!p!ktsH#7*{zaeUms~?
> zl~_JvAB*Vc1DVo at 7i?W8B+Hrw;1D*3;#rET?x;T03;8}QB?eVQyfLwBJ*0NGb((^F
> zm~6VM_7JXN9BJ_zOB_XH^lgAuqcV(^dWkf)kQg*C&I#sFkGNpv@=p!qV4l!Q_io8t
> z*g}pGuN;*@%hD0uGbV296s#z*b+f7$*M9b;rsD{C6LE{l2;?37>Od;=@D^<tdU&qc
> zucBOgkv&5}zDuxLRtqYy%~AW6F0dE^<EM~Wrxra46haP<*M5PtS9x~xVC15n1T>*p
> zo9oOsWYf3}zoBNx?kxjhPwnfR6qAT+grr5JoeKif02wq77Uv{2!8yr*^^(iQgM9|v
> z!N|jJ<WSH>R|jIrb5Gj8bGf6LxshFvxVV1Ei3SaU_l8;l-+&nMyyOaug$-mqMm^!n
> zhjG0HXP$*$5{;5d=nncRlbt4msimOqKj#`W_ZA{`RmuVffr{CS=N^cZ8SL#%10Ans
> zZr2N%3i;CmdM at i%ubc~C)A{>={6H2#yFXh+t{jZ#ofP4`ShMjw>X*`T`oEM{(Obat
> z+Ld#a0PKF at Bce|q at KgRqvVy>dHyFD32fPE3Sq>-wpCuyec>5#sAR?Q?o|%qW7nj#7
> z{)eKx+~cr+n<;POw!6r$xsk_!2L%(0c6{HDo<OX2L^Xwe>EipTo&v9kw?XGoGGEq$
> z7o1rf>U+-9%hLp^{seKIBuR5R(+70M>KO|S8R;{+X<kZ{=2cTZZcz0cUw^Fcm7cMI
> zXTT}c9EE1$(revE(C%YoT>8CdEFzWj_Yh6{ITi6MfaY0upryI!^0FLQI)Gi%PV&4=
> zHqZArLKhl}orgADOj^;-hwy}6MILpOMRD$7li(PhIEsx*(Q5o=yNO+Nm{v%TF?!Vs
> z4%2c^OMY7twhb)>Z3&L{<r_+`$j^{>8~dRxwgb_dJ3dfjI*zKkj>A}8%GgMhbk(_W
> zwSGF&JX#Ce9_$hEWGkV#7t4^xhtNB?V+B0ncSWz?!ZqlI*uG at lFl;0X2HH>#JOiD_
> zA0cHPMqB~>f<C8l`kY3s3vQk)hm77x^QdJ-tJ#^ZHDR{sl&#KOLsrXUt-bM;CfQh>
> z555!;A;GyP;EW_&cg%g=EM3rvrB^m2x5laPagB|mm~6_c(C%%A*6cNKUfY1}OO{s<
> zr!5~)%B{)qOQeY at BJr#<p$!24yvak_7Z>rrR#tUgR*}iK5Ly`UDnMvqT@|5+l)*9G
> z1)Q<b<&qwUBz3Z+u`=v(ue6aT at JcJ}>;_RUr&~?w#^wa%O9$nm+?(>R(QA}l;3u5Z
> zP)knL3L1=T2jZ0 at 7AWY2E6VdDBlYyL-X6%oFc4n6Y2PnsOQv@~pJK)xl%Ikmp%tX%
> z!mK=t`;x_v;cp5(4K!kU`FF6^oMO7EA2D6ZZi?&(4O^~!CnA5jB^&Z=^g14cYsi^q
> z!WC6lYKKi;BR|g&Nzj{(SY%n4&)8Sas#HFB7CM5yNP- at wSL6*-t*ilc0!I8wt_QIk
> zJlpW~L|dL$WY;#(w5PNNH6?nk(zQ*B$cE5HTGKu;LZA9JG)5+2{XuB4AxEIy<wa!W
> z!d_G+<eES923fu$k|VykJThWX&adzVv!ZVWzJO|S`CF7n-l3qdd-Sql+a!|vfRvo%
> zxeYoeO)$swBr;pLH9CK(Tjzt06TLXW=`*B3M+$o`q6=e-3?GNRvCj`vyN~|ty`*ZM
> zAKjP$s&*%RQJ?@(kgi<#4cZ;(-Mw4AynW$u_b|Lo(9(gac>nFqF@(wZ<qT-X0pj1_
> zbxN_oMKz(rpc*@XM}agJ<J#t|K>Gppq6Q<9>eADMEW=0_S0ei+*ARD-)!4?MPl#v^
> zE`oC*+TQ4*aRHu%v~Nu&&T&94rE8tvo=6Z!K^r5uYP^Phv7pV6FWCrJwLcqi60vp>
> z7S)++>_MwaObV>n$;?<iipP&MBJa?IJ;uNwS|w?<8t$RH3}|oo%cm0plVmxUdF#ob
> z!J!SGZ_$Wz8GNePO3e0mOXmN_RoO)PrieC}Fi=?SXoXIw?R6R}G$JAO1nuZ_nAqal
> zNu}-b;?@K)TTWJPf-Z1Tm!_+<DmS>ZT7=GYQDkKc^_0(`Ruy8Z7jXp*aeQvvZp#n1
> z6W6YeqPxg`9<EY{2YV9@*dG(20m=lDoH-rADqr=8drC_|?Hts8Ten at lAXz7H{Ul at V
> z600^mMUppPfByx)l&4?x0`y=np$smyA6$=mXgivTGdQ21-tMgENh?CO*BogJ$eKXL
> zaeacJTYip6LwUC>%RWGyYaXYJdC at t(&_B7OMeXMp6~59kuPt4i#*Fxa7pr&G&H5;T
> zYiZ1eIFhLpdoZZ9kzA$fsPy(vJH7=k0B at 56?{qW=7Pp*+l)sK6R74<C%-1n0lYhae
> z&~yJdj(AKx1B+n^HKYK~zt+U-V^YqmN#G7YqoXyS1r92RwaUGE!8zj0>A>PY9N}Xl
> z8(c6;n1yVuW{zzzU`*d1>8Y+-`3#O8pf(C6z#jz>ZV{sqv?heuFN-!%M3_YzaEFu2
> zNCUZygkM-(4dC>A(9%k<-TB1)O0VrEwxJ8wBg=*~b0yf3%4QoYID_p${2jvIVH^9?
> zHf)dBwAHZMSNd$iQN-!4Jo?M~YBc}yMmN1N at zv-X57?M<GM>2pMta)~PYeI)>9lRX
> zJUu-9zdX$<y<|PEg!IP0jgBGBMUOS^#B!!T4-4OjhD0R;+x!NyhXMPkeS-Wq{Zo(&
> zbbN!I5MSNvJrD?acGGRKQv}un=(8jo0TZFHHgE|US0s~U0RBwux<g`>BCM7vY69{g
> zAv@{xLQp-zlco^v0Q^k~t at M8yOlUdoY4u?QbxbQXM;}v-c?}t)L#h?*k>LZoFtUN$
> zHN+KPIp6PwC_5(dDReF}Cg41xmmzbD25VF%av(ohd?nx^>Z~9-Z}&SjEb>m`Tys5<
> z5)rlKGWns+-Jv4VismBifAz5n+(%^p1L$&~@!5_UzMY=P^`KSEu&Qb*E8kDayFC52
> zcT at JIyqB^!Y5EoAqgwxjWI0v3BBy@)X6w9T*6N1p4b`XX7S)-j&)5E8`gB*pbgQPK
> z?yb59>nzi>%iEiKtd-AHv}w<N*m|cUGu*yLIx`PPZy{BC=JLpq`RogA1Jpv?C9d|K
> zInX-BaUtA(<`EpZ&%D-}@3^o$awMOrY#m$|T2nTCiSmtOgz`<@)iV#Y at tTSj*;M;t
> z>5t;4t?A8)t0jkJ>5!JY+fphkn;xx2OtEKynDYFn8gTsET6i)Lg35Che3KiVac*io
> zk;xT2E?EV}6ro{8u%zZV(DLigqt_pWw{$YQ{sx at +tthZ0(hU)><~4OfAHdS#7qJkr
> z=aQkD21No21v2^hN4c(zfd at M6VP5z^{;=J{h`uzhRG0_$5$+FJ;c<FL1#;X|tftMz
> zqbBGMlVOA5Jnwmj$BFf*br176l}uQ$QUcF(NT9&$U}ec}xC68XxyE4Y1m32b&fp0)
> zdX2}4H6ocJbJzS1tLQpJ<XMU`zo0S+T~U8a;92ZLPDkX{Oc&~Oe*ASjbeY*0SqWQT
> zq^)8_jJJUS+!K5e2);DuCKK{Q7l#AK!Bb3zmu(MVrsJH8%sSE!BK~Qn+sdWFR)=Zr
> zC|O@!fP35FnSKU{c09 at 3=2b*cAcQ+2$}1FO11%T`LhB5 at 8Y4sp&<`AE3f}$vAT>db
> zan7S`3+IPN?uR^3k0&}J^$eQ1RvVbYHsWc1R0PyWXVpqT;$zIeN%Aiwmv;G#2YNiw
> z4M}pp(=DW|ca(1DT506Q(ZCLYmfGXhv-$Fvb<L&F@}ev=MR)n(EtCWK3~{k$IX9U5
> zJ6~oo{BFvj-IK22%4ldzMA+7lmj?3gAVo_n=>9%*RgrLAp%x5WeE%gN{ON2Cj=J*n
> zJ8$!*M0k{ZZ<I%gYdPL#@T8P8iFvANe(t=D?kCOX-;X;NLEOfw)9Ni|qxzr+T)^`i
> zB6VmZB>it~V7C?XlnoNkj at J4Wq__mN4Bvu&yd<KQsgSz#xbp!-37iEAL_FwR|9ugw
> zBcbL^htR8&@P*L593>kWqE2ImuqJRaLafK?1`<ZrxqGgIh1cCvLRM8oXJzG3cXi#-
> zvcF+w+fe at Oo}&Y|JOP_RM2qy2IzX|v>?iKD4Ov!5M-eCw{KXp=Y=X at 9W;5c7Fxas`
> zPZI(WP12k2XCRHzOOR2 at OmR31d_gyQv=#mxmpVJWQ(p^jQ~!YaUQin#W%>9Dh+mSm
> zaNJHl%DpgJJAY6#$hiYgy5t|hUvxqiolL8S<~&vmy0eq!2ClS|j!Ply2+-{&pgtkT
> zf>y8rnA-+gJGNZ$n-yJP4(L065rrPUs0lq<5?hVPgRVzB<wU$83Hoq at F<v#anA!|2
> zDQ)7q0k{&$@kdA{9vLIA=kT)T6j~4P)^ot&x8u#i32pFw%%W%M?LZX6>w~_gq>Qzn
> z&;@gV%^ZhpmtjQu!S?_KwV{-;T&e~1+XdJMnu%wVsldL0uYn;Qe4jcW1}}OT at +a&6
> z8NSpEi+)8CW>@$}NUf~@ap$8frSvCwQfZH*tGUj{fDsr540JYPq(L8t`~KAF=G%Rp
> zZmQ`CZ3m>vj-K3Zan5fhZ!90ynZNe{{|;LB_bdgPA^J{=nv|{UwBQSp<TK!$%Y at X!
> ziSStIOWMQW&-D9u*enUP^ufZ;ttjg+om;7_;CcSr6}k3ZxN~b at F!@UnrVU$oM`aEq
> zdKP#Va^k&c!#2N}dT^blMFWe1HkiXvVN{1m-}=4CeZA~!XqWWd%3hXkJdC%gNqIfd
> z at 9En3K+e`G>-==%2~ct3IVCOA*D@~2-_{6uJGySv at O7gG@A4Ba5xzceQZLc5SH~^a
> zHPr*?>oKmrhV-Af>?_5*Q`$LU=S1oeFYr_5T(1 at -Yw^ri(L4PL3$5)g3mzZD2m8I*
> z-S5NPL+q3Kp at i_~J{A_e#@(NM3E+2Q&?e*B5PmJIok^A$x)$}l=<3zbA9XjF3_xl*
> z+)ikYGoVF|Z*cN`Gq%5~9xa(p85(}om=)QZZQ8(gXL0ZBY9Kko at L1^y?Rm8u$mU70
> z5l)M~g^+uwrFa-zR`^u#9r)4pl(LX*)uI7K&@jXgt;L!7K-kU~aYkhDu&YIXAUdKv
> zpuO^<7BcE@;GqrM0U_vv?^A#Ba-*$GW7hH(X>r2GXg&a=*MbqiV;&)1O}Oh5L|4Kp
> zyVT<`_|1sHHo^w`Qpcp=1*`=P9SLeu6H{Pu^f(X)Ku at s<!UsHesTix5U*g{Jv^K~@
> zXP32m?u}53j?b`Keu<JpNnd#GqbLw&5$Mxz>3SOIrSNo1kJdcQaN7Sh;t?e}nQj5%
> z<QTkVL_ctLBmUO4#HfSeK|#m!ke329A(8f{I1xS{+nM-V2C0GeK~qy{+XH`(QF+)-
> zg|5lc+RJI^OGmf2^aFkAjrbc2afEUP&{@gJGH5%yBN4xoorY{W8jB|fw#GXRnRJxz
> zWLdPecckIBz-h>#qXOKMGxaB7sMFx1<6H5ED8;bz8md36TaR at GXITSQ3Gk!B9JdJH
> zQ(yx~3&Z{)E|AfqB&}kOvd7 at DDq`LvTh>2ml*!+~W;zZ}j%|duM;j(QqUxGJRs0rT
> z2ht#fyRX1{2%3rY(^#$r)``KAUX}y at u`wdFD+w55L0Dz}q9meMsHcLc*;$7ezKm!P
> zKe4|=-iUg=5!Ijk;rl!#33BOv+;<|<gOc8JKUOZL8QYYoQ2e0#8oi$TDLMw5kN3BF
> zW1Vw>B%nM=v>vok6zEH<aSZ)(@Dl75$mW5WHkWn4GcM#whlTqh<Tt|NKu at g3(AzOn
> zB=p_oCZJ8=4X(izS8+)5B%)c-U5`ggMyX!S;XyQWQ2OK!0oNAiJqZNCQ-&1We?RoK
> zCaeHLV2`5le2E#d05)?6*`QQ0@{XqaJ at +w0zG-CeSHO&+s2W|f at Sa&1Zy4hj9`Zqx
> z2K=#r>=I1A%IkZH*Y_uUS3i0$?wai_qM3DJntE$-DE`lpcPk0%z+Y<W`&i9U5}}zk
> zs(m_iYI;Y!3VlO-ZAY at 2(qY0HkcwDWoCbHi<Ux#Y at NN3YjPshh*8tUsGw|B<VNPEB
> zKk9i}bC@>Dmu;54 at 0S#_#hYD-aJF_Nw^ojHE}|L2cD0;pg%73vHrSha3r?NS-cggB
> zi+b=@cP>h&?PJa|nnSDsf6qnzDW>l&0Y!nPH1Mpf5A1pG6Awwx2D9Fy^P4*~9vq_=
> z;-Q1NNb3Q`yG9++YtS=|#d>lX?~*Ya^2s(Dedj&3C-;^3B~OXdkPw4tFVOR0CBB^>
> zC(?U8Q at yd^%{iX3TL(v$N at nJiR@>lgoESm9 at 6JLGMCyR?hVp)k at +P5G?oe%!QmIUC
> zdo58BWjk7fyZ4s(CwG4d{|c0fb)?t7JTo;?Q}A5fPdfOMCEkES7;3DEs_9?8Zd&9S
> z8@?NQ(^~Y7nJ6R8le{OF;kg?rWXMh<h at t=_6k{B>c at vT03?q?d4s`i{C*My~2Oo8p
> ziE8rx+1--bipXv>V}wEAmXa|WOOdl$hsZ(WaPAgRQM7Fg_2r*%+)ZJJgTjJ#(g+X|
> zkf)cfe~0}6>k?bEpkV#6pU!Dz|CRxuk3F1*K6KC3mcB%pd((4>1a@^Cjn5{M-YooT
> zKSczMxI+6*!$5i>NHnoE2EUoO@*~bb|4h`9osLjR_C5B`HpS69B6Pu*?75$nF}orh
> zj%mU=L%rEqt&VC!UdLe0dta*f3T-Cn2q*;IcQ`>U02R3gD)P&$G#HZAAGtON8ir+O
> zypWS3<F=@L*%?Gfiaiq3VTjVc0Qh3q1gQ at _GeH%B1CDUUoLhbw^?NZ=KTh2=Y#pZ$
> zf(jqpxV?L3LVisqT~%y+Qw)6twMq2O3Uw&$`9 at -7FlHpmT>>wt>NttP`X_o5n80qv
> z`WENu3F at bBy1yarpIV})=l-qML#d7C50j%UVz}NSv8Y$^^){KP2u(5S5MEj&R?fed
> zmgt$u*nciBQgh6`GU&dxDluvrVo9aoos>&6UQPIg{-`lg$^%_?H#Z0y2e`|h4|KXC
> zu_2Z=qGfK5 at L43m6Lso84|5>SGZnm~2_s=HVq4?^kM9X)M&cU(k?q9)M*d5CI~koZ
> zvl{j)_BJrmK6|Et!ssA#gs-iEuWb0jT+Eph;QdB=$Gum4cr5A8gTM0LjI1c>#!--e
> zlFH38tT?cHnsR^`8x!X+a||&uUkwB9{5A_PKPFdobHBWvZ~UXVH(}i0_yKzLv1%%4
> zwn$|v#^~(kzSO`mT?IY9(t*+c^PTTaIy|%+FWgO?2w#idrfA?6;k^>J552uVCZdT1
> zGFf1(Hp6BHvO!=p0=o6w$l*fhT#hMPT+EEEoif^z=*2dQDdWC5IHm#7cw*fm{FCrp
> zJZ1$$Xki>x4*-q$8YrH7RW0p#rblO+FVe;<`gOPQ!@@HD-^Ny8TO>>uR^b0K!ObG)
> z>9>mS_v80P_9NHk3G}~I at RShM7c)IGXsa23*+stLy`u5vYHSaLS=TMq_#W_sU0x$l
> zk~N+g;dO4I+Bbc^cs8YsrF-Jhm;5~@L*zZg4JLC=71o>qysu~QzD6&1)TkN7SGvI0
> z32~koBrBUS+J2mmen{{n_#t^A+SLs_>W?!!y88?g%X=T?>2uqnm<22JI%6 at zi;A!O
> zXeZj5+s30qj#WoTR@}>H{-x}h>LAqMcb<>bEGi3`rQ;&wf$mp(^K*J7R=o^rxPW4n
> zTz;RA8jbo7PJQ%Byyqj#sT#_1+c^^c%vF9f*+|i|h}!ACeYR- at Yq%ZMfqIozF4h-0
> z0j at qlYhXOl$p>2!S`j5kOpo$Bb8)UTO8+M~8DFn~mNvjb8+f)O*7FIj-;Lw7(Jy+?
> zqXCU(h#G3)D>TJO4qpwZDaBWQ{)o5ftnM~#Z$g{iAm#CvGYGlVYToSPEA4;&r#9=G
> zR}KzqkpXc>4JA|>=da54ege))4;~BN!JfOl2GY>|wNVv2(3jWVLJJ^T6XX?%S^({(
> zzfn_S$cHTihzhG^fzea4AHGoh`@Hz3qwXrJrJwN_e7<C(`y}zowI{2O9WVovh+JKA
> zZ1t|{;dQfWXMHGcc at jt;WU7PqKk6$93U+t15lD<=lg0He?oKw9xz<6i<VDM-wCGwv
> zzd3hakCGakECq4rc*%=#>;_$2gB+%dG(+>sm$f4zm{-wunD at X==lKXa4I5e){5Nr*
> z6lpKCgXRQypu}$Exi40M=iaKp9n_ysfd9Xwz<+SnU>q%uaP-&t_5^1cS)XFoN8X9N
> zv85d*+~))*e<{kzUjQfH4o?1uCV}();1AjrUrU60Z$)N4JnuY`-;t;mHTCCrT=_n)
> zZ9G3e^~lhUB$d`92Qy;SQL81O)q0&uk7&(MlZa(67BzwIS<K`}P1Ih9kOAqS6?p at 3
> zb_mvpq?Ww4G=7u?JSM!GHHe!QGZHf1UL`(CH4zsa^Jh1BA3ow0qEPKLwtIo6{^>ZR
> z!cWv8SRX=$6HO(w{v&=)7Rd&Jx%f)w3PPDsoXn0F@#f6Ph`z*VM0<E_F(no}0%TXz
> zA{>$-3Bj(3IS;fU^#;cYoPksg8WHFKB8~wE&oj`tZOR!)?NWmcaVu<)-LY3G at 8KTS
> zT{D|jli#6x6we(h@(dnp-+wMJ0zQd1!_y{`;V-5rF(bYB%9TxIrFE~+nAofSyLL+r
> z6C&|cXr}N;DH4lg_ps4y6dMz at s4Yc4`-#ZvB}HSRxI4>$?*jV9Z6oU+us{*J6=8uQ
> zd&pU}H$mfIJxO8|x5>t;xf+S3?|r^tu1-KydrkDsx7U8|zqe#NaJsu$0`dSo#W}lm
> zEkVQ{cuJ(vw;n^|DU!0;L}vxb$E>FExqV_NtE0>>?TZU#5L$7cG1RwX8Mg7EUbcLe
> zkG=Fz3ifc12w+Gk-j;7R at qJxLkNq^huaDNk4$NY{Ih~N-Ks?$Zv6|=Fai$R2>|o=B
> zMk8UJ;CWtk(l-Ma5f9w#;LXqNsX94r%4;mH at UD6ZTFdw<7vcd(YN41WPmt|2R*SEk
> z?V>lxF_o@;iSKP#y{d6*_5OY9_Qp!{Hc6i*z4rO5f9QI5e`m>~OiOZW6{y(}O_fk>
> zRWHL2m)B!;+1~Y3uiDR5<of2dF#<cVR!v3ODO7f(+~~JF4Xn3>TuQ)CE{Hd;<YOVJ
> zDPhgfmdw_eTAic)nSF at 7mem>?z5fpRA^&7>CUX#HzQ81k6F|$Xvyt^p7=$$_9{f4s
> z^iq5o4q;`1W5mirH3 at rW>>&>Y_HwZ|Ox0m8AA6&BXYH0Kk|Q$)9<1(#<Wwy1BH=9~
> znxd=Ayt>95igvL(hbXGDO>(65tb6FYo$|M}+E)Gj7Z3tnRNjW}^^KR-m?t7A=eD}R
> zwe!ErZi}gkH)-YM9r^3Ds%i85+TxZ$t$GPYI at 3fsS&f~}mS2oquhOoT-^|x+l(mxR
> zMi1<I*PIGpLUU}-*_I@^YDfVhlN5)Cl;g@{wSrfVxO1#c4Ai1bp(ITX`{(?5T&Fj0
> z0NZ at V+?tB*E7&Guy9L`MZ0oU2z}Ahe5i%|RI<g1d80&h=M~GN?cWeJnwr)c02Cqn{
> zF4<J5E&5cR3yY1h=+mOayTpRB*yN%CPnSZ+`g>T77DuAO*CUDtvRWjyN)di&?Xd2c
> z%ch?FGIR5gOT#{8`t17`Ko`C7v^oU8$JIgjRaN+XZ~RDw58TF+>Hz$HruN0}-_&&c
> zexkx_V&jJ@{Kz++Aj|Z|Pt|z*9-~N<8$Tw?^u|+&4x6y?g94_*_biBSJw!3e^2!H%
> zp4T;e$l=($0mCf{J9ATOLZ}Wg3H3NO<470UKzdT(VYsfeQvyFXL-x8XZQ9znPA`x#
> zz{3_kz42h4{_bp`LA6EC+)WwoK0$W8CH#oB97Zg_pV*XE<GRCjyOi6d`G(J`n(KCf
> zQ>WO6CkvKrLY&adg1W1#V~{~Yi&l##OnBGV=79|H0#~zI4QTdU*IbvhPP5Wnq)&f9
> zHm23ff_%34O2>mzjjTUn+;S^cIfHWCSs}!1DTI#rZ}2EShD at 5^&l+DsOqr7yyJl94
> zC?XYge<`;x%6lfxhNn~4`ZS!!HDldp)w3jvWUyMw4ARzIQCiY!khTx|PFnK%L1}wG
> zQCiqryzIg|MU?BqSI+eU<7#g8in|~ec0JQhdD{pFcBNwg*@45;yxLMN1D-2S7d{OQ
> zVl-yL^Rol6V$iq>&UBh~=>lsByS`2ftv+I^N6vx6(yQP(gcyFF;;hp+q}c}Cx+1tN
> z#aFHdU1cc62R-f0;Ufohc~687DP at S0JXSgDH0(+%*37u#)8Y(9!G_PlF<uLO>eGRC
> z%F4H at h^<%ot|)QZ=mKdNvn8EjU4!yw{E#iN{$f`+ at Sq|)9fD|+SQ)QTVqVVEyMU^<
> z7Y&$}zB;qOw3*dD5KdAJI37kvibTf}OBVC&13qtgwJuw-E-)Z=j#Xl?C?NBi&BRuR
> zlXl1LehxFj>YIhkrLaN;#*)su=&qkHI at vDh&7R(c-m<Mevf3_9H%L2%6lBJ++Cg1+
> z>=;^Zs%L>?B`gEBD2hrH81njq-H~>BYV4&+;jTLz)7OJ*sL`kyQf9ieBZWVi`tMKf
> zxE`Y?PGcX2*i9CCT4Jj;1(|)AJr#O(^I8q!c8lcejrb(mqOT~1UE#Q*uL5S$-8`@X
> z6ne2AUO7N0mAT3k=9+*$vAE3W?ZaMO-oo%fwEfV)SbSFs`eKAnRLbN7D&jZu-slJ=
> z`Fc=q$X+!a*DbuSfI5!!70$HzVtH>hBYrRS*8XU(9YhH#_!9VK2<Y487ks*+h2c+?
> zLzq((LHSc0A^r+_)|4ITS at cV9v5O-g>Q3j~{6n_FocZWo#>(;ry1h>Gt~m7XTfBd#
> zPK!qrb8S)HwCn;)I;(xXtCxRHVgKb9*JXj16=C;-_s7b!5)x<U<)EkM)z(Na at SaAD
> z8O#IOr-dF-i+8V<He`!`HU4!-;qc`bx1_dcsK>Pu`dbSNjtTzOi*#Dbf~%E+Zy>9e
> z&SnyH$b6QoO~qaeR$c?7*D}gDkNq<2kHfQJ at JPE<WIht&Zn%R`?>FA at 9*)OJquhoY
> zdkmvFj2`3OPcF%2`FTXKrevWP`qf0OS7&pu+1H*!w0Q?Bxt%a|ud-X<v#)b*5c+m{
> zrL4yd_A+y-G^!QoE<JP1zn6vUyE3|Zb^SFEl9(h)bJN5$wxS`eY{egNKkl<vm{T3v
> zRm`#EOT?af+<?2oU1P%ak^94M;_g4=?l(HU$oN at em+*F!;?U?Be|nNhM2RM>6*tYk
> z;wmku+s34e`xwPD6*Hy#9rKNdx+ROK#jJ3h1ltqds9^`w=CMPa-v4sdhpR{b>(%49
> z`a$F>>Uss=R)77=5Uv(iKLjnFAbWRBkTcNND_v%w2+-?)0j^Uq%f-PsNZ-hc>2Y5W
> z5IIf=epD;iP00?-Ez|3^rdJipi*Y4%dr_jJUCt?B*({hMmj$0LFk_ at LHY2zrI6SCd
> z-Ha!{sC^;$w?gfp8M7J7FEkFC5&WFc!lpc5oT!CeHFeO8YLmoPh=|DG?QCYOMQkmF
> zxBuPkNzhY>4r@|4xXA8EYL_ephLREQha>H{!rh%$Ld==;KcZH%7uhm%B&kLdj<IEo
> z4~G-Oy~?fQk!dq+lx8oYO=&fr|K$!3zoY4Yxuc2Su_rt=tPkH5DFJuCUT#4dpP>v`
> zfywfTHThgM`&UlQ3qDPN%|t^!4Q7Y1*5nwmHjOy7wdvUFN1WPPhCPuuwY3K9#s4py
> z+JxO1l*tZK_g}q;bo}hocr(27bT{XfPu&7kF8UBX*kBUVbQ<1+MOz&0q~!{~Q;@cq
> z*;%qfVi`6>4%KP4qUSY`I_97s#m(3IvEM)UqlWqs&yNB=ry2O1=3hq7&*k!&Zq1xe
> zB-F&NARk3{MCwqv#?wHfC{l;uNB>*{&mW`ZXZ*j*5B`lJXK>u3>@(2FDbyxC5nM^5
> zDl)>fjE^usX$TU31|BmcGK{e-KE?zM<~5D6&R^QEmlt^zuD9Q4v|s)8_S=N^6IX2G
> zGk|QTy=VqVrg~egfR+<iY)8$3nZ3NfdlvNjZ>^_|v|d-uzqelJkzZQR8%t3cr at oe#
> zGZomGUGre4r`EJxZ%x#w@;T40NR5JsQ2a}MJb(HBtHlj%_{{Y-eEh~X%;#-rW7<C`
> zS!hM)e{DrGS(XQU?uDPn#xDvg(%GBfruw9;jw#X)ABx(Ps{OFCoW|8JBUkrBLhl`p
> zTnE-I+#9?i-HW%J_9AMe1JP~q`)kS#hx0=^-FZF1*(MGj(kv2Z3tK$#v*y+q;4((6
> z5%4>5HRzJrL~jA!Yxvqx at aA^Fm&PKS={aDfy+!3uBj)CE8?P&(-t}%q{GD(|Ic)qp
> zhv(y+JBM3By>0nFe4`?E3TgsPZ0|qQJ-xTPBsHG4{E55x6F2cE%-`4{TNnana1iTA
> zI{o1+<))F35g&f$WNW;2{w7vbK70tqO+9?OhW`Et@}e>x|A%p2;_hP2G^01SI2`u}
> z-$3~I^hBJAvcjZ|ZIS&rV8AxEM)u=Nv41Xlz7zZZm$P>dh^oy0$DecN%#G`C5ztf)
> zceF(CIwipYM}#6JqcXC>GV`<hskP|3Tk;GZYcwK48qB<mWyH3wQOla{wsk;LG}qeQ
> zX1Cg<5EF+pZh=}1G%~-}b7s7>x6gimf6SccJm)#jd9Ls0eSd!y%FjmnL at 2)-lsBTP
> zn-dYud<F7ZJxCM83)bpEnrHR1dRQ4&KdXo3UxhTQhm}9-E-&LN-c!J(3|rQnj$E`X
> zN<@iJ%OVt{LoJJ*h;*oBk?$fMYFU&A=}^le9qzPX-2%%EwM*wfn$?1D>c2ud)Gk3r
> zI at B(GJJO+c2^E;<Slsu4F0ICS)oH)mKHo0WlNjNpICDyN&0cnnx{xZ}HD^F%b^yps
> z3<R+Lj>D&CwPOmSns$L>y0Mp~V)c~KXJ4)ti4drc)f4S5f6~TY_f>4&wOTtZxbs*^
> z9p7ZxHKWzaQoG<mcVi#&zXF9eY2(1ZczOc)CtLSg#r0fl1|=+IBC#2Ste7}pSP?Oh
> z2}~1b?MMdO9r)7cN at SObt$r&J2&f0xWi(_ggO!_~{vaPd6SaI;g7~Eo1GvtAEE_)c
> zb687(p681|6FVn=o?}?F2~R%IX#88%+YcM_br~*3(Pp^(O0i{Gc$I}SA#a<Ow~ghM
> zhIbnB<1)5Gu6sqscBvYc(j4x$N~<kq=~Wt255Fxf at 8H>1XuMvvZ3d{v#gMpcYykZy
> zrA3$vt_=)=4uh;pf+dGF#z87;9Aqro$~jDj^tNbV;ja+^S_lDOCa8)}D;^Gf-{Ly}
> zP0Goi7v!Mdc>;m$oK&15*Az at 9y;jTm8299y%;c}Ya|!Q)uea+NCOi3tPplSujN2k-
> zb{SDRO)EVMmLM0>OWB)r1-ua6A6T4!*Y^8MMEIhb5copM5V-ur%-RF6#1qo-4aI7C
> zE at mvkZ5gY_H}t5x1GY7p#X7A{3;T{%G6y_>nDH@<k(*6-4iYO(^%!i^14oM?jL~r8
> zSveVjuCDNWK7cj#k{RAIqn=u3wIrGR3cL3!mva|1jsh{qd^O%<ymPSjD-Xsd at D+H*
> zCh#6KA6N1!s%$gEt~&vd at lw=4!KA>T)lyIFsZy at MYZfdPi;l#6XoSvJ&;sBOZa~$s
> z&w_WuP7+Tcw<j?U7E=xI#-I8+==(EvbwzA6HF}%9X|xk<?2tvdv}d6P?*NGtC-xaV
> zuuw}(g8v%mttTHZhRt}3j~XkIndRE~@Ifw=S{&SK!F`rvxPGFN#d6AgoJT#fYsSvm
> z at LT|`9PaqehsL6DKL_c*;>paNu-n(3e6q7<EZWKKnh9Mk=oHe(J()WnQeX7`dJpG+
> zg+h<AVmgg#-(RtqhF9FhzCLE=qakf=h9u|NZukyfw24to{R1AvN*v-)8a)Wy<2DU)
> zd@?mKEzsdcwb^@DcMPzC-;rc$?h^-e4V>D{(%8SBY5O1JffX5{7<bNCNp$e@!_i$c
> z at Fmdq$%B%mj;|yfbdvWN at D?=Ar%m;)lAv#n(Y3UEDb-L}TD at KH?%31Io- at jFjK!@5
> zE-QQm{?XqMZ+L}WWO$l=K6EPjuqzP<N5eG?kfJkA=`!FOTiWN-l7gtopQ8`Vq6(gH
> zykXL>A2yYIY7r!Im2l(14b^)l@)!-Y&Ezvn`#mNY`_>^R0y*ZT#T=2OSorpkimwtR
> zIC6rQ3GUss^gbzr at Jwnp^1vAmI<9~@qrcX0zsAgQQpYYq`gOYyzo+gcz#c!t;{PrF
> zLW20q=q%tbUjh63%D)0sf--7r*A3Z+>UtJl#Q&gg!ElyesH{h<XP7;uoog?~oH$4=
> zooE+Z{D;DZxRU5W=2tnYBqq`_77a}^^qbKg(yQl8;6J11*}~fTy@(KmekY^f;ZlbO
> z-iq0X?A?Og2;`boNz(J^Zzvy}75YC^WEi6F+!@3>gtporQBKEtjWRB9gI>Ezh;Jnm
> zF7)}|QZ8Dby&tm3f3%F=huN9X9Ua0sYeM)^TvjD8(4S~`NNF at qbO;-*#90de7g?3w
> z$JiX0_jJdozKYznq(gTJAKjzV?kb&}w||e$`%CbyBZqYRo^utc9c at JzXWIo#|7;i5
> z&x8N4epX at qY`wI8#=<YGAFRlU4F7kQOT at VI#t*_)V+CO(rHyRu(EEH*Y)sjxr3-uO
> z*l03NFtk4>!iNmT{$Z2);@SWk;ZT{iWIBcAD;39{#@Lp06rSP0Aq$K=r+rC`slb<F
> zj60>qor04CFHeYnk>7e at jQ{Pr(x^k!f_Pj016WrF{I(10>e8A5Rt!vU(GFn6Tgw7(
> z`~|ud+8TRfZ*bqVV|SfzXfI~myYFtHh*}C50NR7KEZBe52fSZo_nl#9F08zSk`%1G
> z#6de77iT$ElI0xiN$LdLo7gxpT6d?wMse+ieLLA0(fclp(uFa)Y=m015lR_ at E(g~7
> zuUV8xMmPWa at gb@I-S~voAlCHQ=*1QI=nq!lLqAx7gO{y9MsZgLDQ?pv|36mX0q6{n
> zGQMzD{-ox{azd@!>iSC<-1b}rIy`sjaNSkbEC-Q>@-=>jH79+7#ZZ#<SS{nkxhEsF
> zrXnTkYxj7ho~lTR>~Y5<^(6c-9(6|}^|OkU at ZZ8eW7cCotw;%b1M;b?#~!OlF+K*1
> zBVex0jf~R{y;#BfZ6ztBO-A at C#AyTmsYK!X6q-rk`o#T-X#&O_E3QuBTF%%-Sy{IL
> z_iy(Z2BNnh;!QDWd&J528a)Q&zP^F+z?BvU({aQ32uw2P(d0hR=X!<327}x$uHCKA
> zd30JjQf>8}az?REsA=Ff7{S4YWX%rwi9MyFLJ&GKMjwQSjEs&9``z%6fve28VvmEf
> zW!jT5s+Y6uvT8$nKbO;FN&bmyV|lWKw``;E0whb|2i9mMW`*uPRc*2mN^eJ+P)W{0
> zsa(8~sJ+W-31caF6`m{QE9f1^45JA$Z1qMT0k3%#XJmK5uSmLFQrSxaR=t(TS at nG7
> z#{~HBv$x2Sb at gm+lxrAl8IfjgGCT2IY35$Dl()q;iimFD0wX8?+NN$f%W?mxPL at a>
> zeFEQO_5O5JV680s?%94>%)jC3D`}Cud^E8qU3)s-r^g=58l3=}ijjN)KEQPKeJwsj
> zPh36GR^MrTWUr~E9r_EeY22MOjACC0Uy^H1RA=ttJMe9_pIu4b)7Pye<ncYgdZ?t@
> zSc%}s;7L{RepDMN+;6 at xvKXnM&@*j(@vJp;uZ<b*-wxetV}$#@(7iUgxbF|%W7f1e
> zA$iYCKyS7AV>78D9<nO6%?0KE-LorQb60|rYMWcE+ly%DjDrlmnThqx?qbj!wzy&N
> z8^#H*(g<NK$GM)cA1Jo;n%bUlJyFcGxu4jFv0G`elYO20itKe*J#=5EpyN1j*{OPs
> zPbV)_^W$;P^412}h^VizdyM<kE%`m^-WFLZCe<eR6gIo&jy{M}$JaL3^%ywoL_1$C
> zyaLbEEGI(8yw^vS#LWV3j+{qr(MI?+SqfaXZH{-6oaLSCn};t at pH+R$H%DEjt{>H_
> zwvkFUx+B-KReNzgwzCy5QiSowDjiK2$sfh)!1&xVG8cIt<E=bgv4%zsBRTSqa5av=
> zuQyxmSV1QE2+vY&-bocR`H#KNs_VUz)&@$X*mm#3>UvmmR?EbiKuLXS{vA!-&Qfa@
> zn9v!}rF~-T^?r-D*CSZdpy|u+nP1P<uYmTBw`6>JleV5LauYO|BI4sn1g?>o4TCQZ
> zV-pE2sz{rOd0{OkHa1$3c;1C_UAXSA|Fp at X{?AfUmcBNCXTJky5 at P_4q*Y5TW2uz_
> z;xB+YLz;0eT}z2bkamH4_T7f%EJuri34N;CfQmP211xW4s1(wL+VjGW{tiQN&AD*t
> z<0s9Ka~Y~W<$Q84xagm9lj+}K#e>K`WT#9jQur5~O6868tTlm{DvRj%P1#joSyxGM
> zLY4Ij!D=x<5{=$}vu+3LyK4^C<s8=>ZAH$(>HOV>1X$2SvYo@)+7_wd+t^K5<=1KU
> z5t2aAYUXpt72k+n0ls7YVNr^H2h)sW#?pmasY2ImISVC(w%PG(InLXHl?P9{#O&P>
> z-wwaEE&^MPOS{#Vhc98Tj_Q3^VeT*NOoJ~2`LBfbozXWLcNcc4$(M+`H!kc^p9OcJ
> z9m-ah&xHN>=O6A+cw5o-DBGREeY!Sq`7T|*@xm@;GhSj&Utd9l^=Nh1M}nm5fD{4e
> zz(2~?leDv79Hiz_MbSE&CO<Dls(erS9!cQnKTFS-uLDNR`04KyGN~pc_Mg*UP$t9P
> z at 9k0$Uji-~O}P?aOJmPSDap2yy}&J={mm;3U!haHVS8QRC_?Ud`X#x98jJNNP{S32
> zYB$Ziz+DGd)<SO1k8J8zmxI5qct4jp#$Q)o$q!F>H(!_VD6YSQ{PH4i|4a*@F+nT#
> z+C{Au{N=p-?KXzr(1pNo-T(#;uJPWsAV2o>ty&ud$A8lXp0xoSLvRkYRy?A$;xZob
> znaWTr9tpKV_itM9cBmEYLEh@=`2UAi=z^_a{7bDB5C2muVnVH$5o!gfgG+La%f at 1J
> zs1=*g3O06s_<v{xVXc66R<I3^h1#&fF6BS>?A^fl%5i2!Z~SY!Zqyc}okEn-b-=5y
> z3}Uf^XK61=*0XX9C$Gfbf=`X`f2Nu$gxWwqG^Dvz(mjxJzj)46 at I{5c;Mk2qi3d_A
> z4MTgj+ncIR?};{%ZR8s66HdcSe at GXB3K*NawqfsP;Lc$Tcb4Li6Mc#L0(LCaA!lrE
> zkoJP#4TxGaT-gjd6ZpQgVv~TqFTS at 8D}N51YBexff;Dp at fn2B+d-G-{5n5j)6U3-U
> z*Tx8xk~U92^FHpo;R3#V8MStyRj>R*t6U6YXY|WutqS7j|E5)P%6qNQ at AUqMR>8tN
> z*ebLX__Nlop90$Ff=Yi`Ya8~>zi8VV|IoI!f6=yG8tw4!+Lrp>ZnSOde`p(jscq30
> z*7g(dq(j`nQNv#P7cG1HA6nM_FIv{|A6u689^%CfRs4sR=`OYmJigGVJ-(FWGW$sj
> zTlpo#v=pNV%>ofpCoL^9-b-14cXUTzkj`kM{X2;Z%4giLd_VQUKhwg{bdl`vkwv at 8
> z_yrF at +B+7AfV4N4EFERiULd+Q3DVw;BnduY<D|HAriu#4cggKUN?T<LEFOyv+&cD5
> zVEWkhlBJOB6w|-Nr_xVB0f0+mU(R+W+i&*bcAYGa+Ikj-_GKBU%DaO5@|!F>;^kbn
> zFF(e<{Numcm%%;edr|5KH-kxO9$jUU5(Qzb7VrjV_1HpS9u5k>R<xY$w!PR}IFX*Y
> zY>tfZC>A|dh}`vTmN3JN+i at v(19Bsg8^&@ultpZra_qoq at ipWx;8y$?E%j6IymK!~
> zrE)Km>8*zq1bBtmiM|Jjo)XMbv;|l2xyE5uiTCj_+!N@*_#W!E;N<*-jH3i+KX@&+
> zWc)|5QtEAJ-zQ8TfPilSS$*V1&IKu$JngA1>(P=M!LMEpZ6lnG?M0d;`wc-j?0LXm
> z9Xyku$y^kK#NcxZQXXJ2J{muV)Po-Yo|rc*-awuWo{Il;B3UMq{2Q9O8H_2GXbsNA
> zr%5bHmjQ{(hQHb(Gb!4z=Np3FupP~M#ki#CX*~J}E-9nfxyJ5T;9i2jv7VA2_7tVj
> zQ#@gsK^Obg!e~=ygz5vI!Ll^?9~t-y<WSJE$XO8Rh34sa8TkECLx|I9hW6H^+V2#8
> zzv+mvn7kXV2$cjrY_~NplE|m#o^9Z3Mqe!bW3BYCO{8S3p{vIY*X{If_vd~wCui~R
> zz-<~*udCOAe;VD$Z{RB=n%&G}7vwKHBlH!M2r{6nkiIWjV&SZP=^kO(8Lns`VTpx*
> zFnGuRbRc$#MfdaIo$l>{s3jJmuP=QdvVXlN!X0LlxFYDQNc>N+w<O)$(D7RDK-3E@
> z8Z4r?Zd<-=&~Am6qPV1(n+H#p_cYbXsqWN at Giwe(fAMNONrBgiheJ=&+~X?FJk`Kr
> z%Hm1tl49Mi&=b*ZlGBzH3nxSODTpdyLHb^JTv*hU=UlwRLd*Nob8cDut|YyCg|qtQ
> z8(#cL<=yX7<op(KbNnygAl>+4*X9j@$DHqsy@}l4l&l^j$i2z=%GjH1x5cNyi`p%V
> z_vU0Se&^*IHg7<5!7iltz4(*O8!DH)Px0P2V}C);9z2WN at XFX-*qxm at a~AjJBrNW5
> zEbr3|=r-uw!je3>&!KZY=v=3Huei1CK{=%&_ea&X3bnc*VcJU}d0?IMGsil_`fy>U
> z3NTY~Swr4k^=XZ%8`7GuE4DaDA2*<T8F9KQB%yDEecO&@L!8xPSz at tcrew*Z+q{F?
> z|6yF`TpU-FtHT^#Ece4v#`p(E8PB7aSk|)n4c7O=F~@AnnC;NBAC7;;rSUJR;QW{7
> zfQ^671B>5%x%I_&Dr*WU(!bq&;^kK9?w7g(?>mRbhLQ7|5(`GZRjS_n%GmHi6Gq>P
> z(O-kne*mN3DlK`b>*Z5O at 59*ac`;B~^FDpKHBj5~&gK(RZo?~q$E4VLAwKEy@!xb4
> z8?nuuz{0UcH-~TTq7|+f=N&5v=-22rc$$R#_a#VT>(~rHW0{S;#-AL^$0_vjN(&co
> zmUWsKKOel<;S=hh-OUf#q3LIbzLZBhhd${t$Wj6B7>q;i06Z$O`vG|60o4dP=o6+R
> z%e1hcQrW7yaX)X`n}E`~z0Qt_xC)S@>h?^8wl)vTh)8wjUPRr=Nq9=_hISO_I}<<7
> zYbn4zpn)I|3P0pesp at 9u^J9sqeUrCIi at x$a^g1J7y_dZQXdndN)cyBwu454DDG!6Z
> z{$@bli+AS>*&QNS2tGuehAq9oV))=&3;g6TxM+csESK at W0;jb6479-mD4EFMqIVto
> z?Ez)_33wD3bp{Rbe1M%7Og6PYLMt&K<dILb^Wn~(yFz8um4sr3&~MZO_`1otNZqW}
> zu!)T*zV~}=oY=P#{*Q0P{}<na735{#D*xwiL2vPKaMM5P$G%4YPx_a)b3J96MY}S3
> zl0_rKd?>JJP at wlt!NF-K5s;_4h!Gn9jZmz#kjWL*;KV at ZjZ6kL4}aj`A4aJ=8jj15
> zn)Rf7^c|yk-*^LY1a?5n&IR5rY;eZ<f}ZhvZUCSEn$eRON#nlX?8{$iap?BFi at Fhw
> z2K7Fv)th{=-h|8R4SM0VL8DRAUZhO-;J3f+kyb?R%m6N;=}fuiGWmYn+~7*QK>eaW
> zAEQ6LBuuZc{_Hq}x~j>fN<)Bj8!Hj*h^;r^yK`y1FWZ(I?T0>t1A6?>->1*|l5w^`
> zZ=Y`PO&I-OT-W;&kn=E7&-oDlK`Y(hi_l7M at i9$DR{9yAj+JIMt|kFHRBJDJnCVKO
> z#S1k33A;2?GSl_Ycb5ja9vi6f<4i*q-k%<CC_;P=%+b!*{2Wy%BI;liA7)ZNTwg{>
> zdvHH84-QZDf_}Xl))Y8L3re2)ykO2#e?4G?9|W91+aJllvfwm>6HomOHAioMqM+a@
> zrEPqDs?6<P+P2xk(Fo*YT`<lvq*;yN55XHo{x9)nO~Gj=xXAQ6CIwo#qZ_edfBu``
> zJTQOsK3$K*B0a&U0eX1<6OhBrqH*49(QEicW;|wS!~RWKf;flFCl%!FnjWN*Gv}$#
> z_lxkg?04NOiG$4V`XkNdP3e;5S-I_A*NXhKg467ralSZqYuk#BbV=-GWgeE`&7~<D
> zrG!1{sQIr-0 at kL5JP)q31?%y7R^~AC)xvV%6OE;?(wHBt=YwmUt#Bzf`YS{cQn35h
> zD+b_BgTT8ZcYeU)JwEj}KnjkHf0xid-;>}rYx-;{v~FbzZ;Z$F!d#qh3eLs(Uewco
> z7{-x1*Rh$}Q;6uXgo_SxQG)S~0-w6Wf~m10w?32?y(by|QXcO}X79fGTDJ-QTQEE7
> zVY$o)&n_z>Uq1;?w1%gSDp7zo3TEg*wCf>!?bu*&?vJ|Rr-DIpKlW_?Po7;4C_<fs
> z-Z%2+C+rRB_&y(uQhm$_PD`d-28up~dGUDmwpP*&Y4@~E3TTeL4CLvu25?@VZswQ3
> z`$C^6A=+inw#q>Q4tU>U$n8`-9guQO=KPzoPCMp1(%8uC7{57tWw9~f)Q at Ggjjy<o
> zW_PS}EUx58?aEYAJC?Xd at 0i}PpgFp7u#m3g3aMnI!XDTquojmEPP&yC)-uSrUV)5j
> z8?$@j5Z?#)F5JVSZR;Hjaw|Gmk%wKBv;tzE+^Y=BI at SW#GWgL7+aNjL!Ccpl-MViB
> zYw2&oHk+D_Omea^rjUZ7-+-D#@TEHO_DjkX*ff2iWIAUlLaVjFuxLxAj_^odjr3Ne
> z1*ES*dRxo3gF@>(q_#5&WH+o5ntqS-EGU_~&`MZb<J>KlCAHWx9kToFG(whQr&B|0
> zI^_-`b~okeaYYAD)3AHub<CoU2NA2T!2h3P1<DZ}pC!yBspKZ^M8$kQ<()#TAtU8n
> zZ$tMW9QYFcUB7aE2A^@agZeQbj<uV|d$|7Ddlw at 2BwKV`uiHrQ?@eRtxlNC*hxh;3
> zquctDo8P+m#kX483sycp0-dmPJ-0CkdjCr1Q4zYtU07x3Felugy=?gGWXO)M>nX;n
> z!aYj^zWCX_cE!x8(_jI1ScZ}@k$M)6MnfyZhWA!uW%lCwzqmpxKPLjT<jp+`nO?}W
> zue4Nh8MkIUgIYOxY*w)XhR>W*#`k}SD4U&bzP^jKQHqN&_fPdiIk;9Tr@@<#L8{&q
> zA;l!|ozPECihYw_eD|=D#@^lXpqt<FP;;5HR1)jW{nvSt98&AYh(&0SI7HHnhK-O#
> z)=3s2V(hNn75M(-oCqt~1ik-hU$HA9!4~91<YX>cU at fAg&sLB#?JG}shka==;r0L<
> zwZ>4B74ej{Rr{)SIUzZ7mX!4EABe)$*0<K9?^wPx59 at k4%EkuEqK!qeV$Y<8_M#w9
> zH1N?Nw{^&A>x8#Wj8L6B(wU%y9}}EbpWrrb%X1RszF4&?eWYb?)vAn>7 at OOWQwW_+
> zZKTdVgnnGX#+B&^BEr!EXm*&{*h1$96dhV54umnS%(K<7fBqTZS~)H1NkbgKe7|_-
> zQ0*StM>_{hNPQrudU(*^2KN=XYxP`7xlsx8gi$D1H0>*|@6NM<Egq3^0!O7wxyQn{
> zpp`$&^SfBff0zebne+j#-_^4Xn8q?9lDW`KT<Vu{<|H2>jbzq|H0U>dI8fl2e>~MQ
> zPpu=>q!909cx?1I^fX?vOJyWNf%nhH^@g(HFXOt$`4#w>gsq)1fwjqPxbxfEw+65a
> z<dn<X2Q4N@$0 at jp0f#om_byogD&C~l+Qk2zCe3<D2wDo_RGK4BWUUY<4d_`b2AH=G
> zMJ*%M*h9Z%nu-E=bvQk$HJ at MAnkU6o7jy5@a__?PRay#9Gzc8Itq(RTaY7t1cUlOc
> z at QuSWSxX$KZd<nzVy(oTVG6Wyb^!~$><xprMG<x`s889o;0O8fT1_!vcfqfL5Vg~+
> zy=xBDY`9bxG;q!{+ZyQJ;L7eaJ1(Rz`%0|0h55h=obgjR6}Up;P6=O>b{65kXlF70
> zi`gkq;1AV=E4$NbLi)0rA}-amb3Wdizte_)o1a2|9r|QBrJ8jR at EAW?DN_DOidt8Y
> zlLPb$^UOT|nEJ!9<2mejzL`TDqg-&u@@S<)2S at mSwQ_<9KL#brLf7lD>Pw;Tcbbik
> zR%61Y8ZWQwKfHSk?^Z*8or8GFxx$N>lMX6jeg0}?9OXM9jWR(GF{hMf;X8Z%y%h(j
> zm5--au$X9D*7FtQ9_I_6Lw}?`Maqk~H5O0Ymfs`hf%BHbW|EGmlaDyA2lj(!u+6?%
> zn(esNl1?QlCc<n at 5J+VnF-n$tco{l;3t2&n4+>IB(qnGeiolljW-^<X$O;xmOtMA@
> zz8O++0_<7oN*VGbMBXzV)|m_l(O~P;?VsDQyuPT3tIE#!cK;2;MvF-XnI)yf2sTok
> zX0woAsI79H_Z3+}Y!2AhqIL;o2rZI|MU(o5lotstsjGlL_uOm~SIE$KL2RUCd=33%
> z-im=4Y(Q)mcz}J&-;2C2`maYn3IStd0ApjD5t)b0ua#^u6&P at qV8pE8K@}umuAoDO
> zIlJDyAMY6~vuGim?>>p&Zy_6=`m`vegeBMAGd#ih0{uh#CpVjDpeSXN7&pH5^P=ns
> z^VO-P<Yp5w7MZ0eTsg<b&+TYwzdb4AbU(ik+|%1k#0I^~x25IfI-kjB at lA4m_R?nQ
> zo(S6V*3D at oTAG<_zB;><SgjG at Diuw!n2M&LuQM%X=a)_0EVpI5byX6cNmoaJ%k~ob
> z?wjEJ?B*02EiG>kzKiF<H^<|oX*46=$El`O&M%9mBnj445k$IrysUk7W(06~=VxPE
> zrR61wMJ5s_t-?ItokVU<LJ#6>QF5o`+r)b+lv|ehNXmd-x<`s=fKT?@iD;B`NOQ0p
> z)X9pR-0FJ$?jq5|x9%v4;U>4f`g;08?1tN}rn96ab(5tO-Q++k;~rbfHevgaSq=ft
> zh@!1!jb!5ihhQ!1CdetJ!JM5e=K#wo4(2pzIn6AmDEL;B&3c;y_YS?=IJQgTq_B4T
> z)f at -y#27+}d%<g0%Uu$mYlgxvspRpF2}aF=1d>3S!N!t}WRs&Mc`Vs#wGeqNp2$va
> zQ<s!S>9%Q3T`^C%mMa at JNX1FcmRDtaF+r(ki|1RoVhQl?19@`s-J}K)SPb>t*w!(*
> zvBF_{&FZL=mc%>T?Jdi#DdRY2%5KLl>#h<18~$Ru2tBqmL>%Z;bM2DwFpX1g;UNv}
> z#(JQ$yj5eTe1#prVqneB!$%e(CTP1DT+fqke;4Ct?<$IgW+XqG+(T}n#e0$&CMA=O
> zg%$HDe1DF0Ff0l0jqm at lWhO0TZ)3IJhSgrhFbby6T9EMg2s>kgs~lIXa#BfW at e9a3
> zp`El2a at Q}t71&3sOr4kQp)NmHlB*+Qe;%@bI0aC^K<S6$OL8rwJcS~*t;DWjCApMc
> z4dDLassKY~G~W4oza9V8e!C!IFQ<@7#0zB{3Pi0%{>%6u{(2dUCP9zeQ|<G6itN>(
> z+hSnzl~ti5lI(IlO*5!nnh^mVm#g&=q;dwJkQI^3{<dFVzvE3y%c}aK`nncz*%`8U
> z;P23l77)GNW2qoB=v36OieZ6=GFqQ#-RmuA{S8i`hgkH5*58s at 6h70Q6`ISyD~zu)
> zEru5v*y2T7W^%EJ%ohn9GzRpvnds?UT=lXJxM?htH2bSTUB=j<CTfqR$14f>reXz^
> z;H7MioZ_0*Q;E2drOI^n6t+SJnTIY(jN8EeWpLB%v1r2#1(+_$)bxR8RK(L&6#`wx
> zTI!nZdbI74wmIb2uzC9x{B-7#czaCGBI(z%LC!`r_!xNWjAedAbg(9_|B1Iu5%8s$
> zZUfDNjdKLFe-~Hor~INWq9-*Z%Z;-DSj6x*Kc~G-Iw$E58-SOOAqf_%!-HRxOc))N
> zX4 at e@W{?*;_HW8|?<@2)nPrcu%H^j>arI_rsUs7b8xt9SK|<6YK>vxD$;?i(AW)_&
> zd#h`<bv3l9K^u_y1aM!Eqrx5=!dP;p8PA0<77N;gb7EGG;U at Yi{4>^G<?q$3Hc3wr
> zqFz~u4UPc<70kyeJRp|Cvn)F)*)u}8*ap+3`_XJR3KyPYTrRs~_`HHMm}KJly}<qJ
> zye?RD68}lBYjEvbhlX at AqHy*U55i{Z??0l7d|kUR#3LHI^fcG+9+-gBFRWc)CzeAe
> zB?%F)la^BHOg!%iv(Bt1V_$!0kYa_{hR)qmOM87$Rrcaja__pLb@$-itJ`hTpX$T3
> zk?QRrH}9tgNlzkjo=)zT#tlYPDkR`^tV<c&e<Ir>RtgmHIL_3u{+;1r!2R4=U1uCg
> zMDwL~{y>x?61`qKmLQSU%=e^m?9PTx3!b*LKbPX}tv_D%_~LG~9F&dv-6B5l!XVdf
> zV=D+W+)41{hX1}F{g>FTI&A2HHbJ+*I2p7Pt8cdQy_!|VJ+4=V)hy-PkN7=@8K=WR
> zU$5?a#ba{lTB##-x6~@ubGt=`{{%7A=~opjn*OBM$HqN~D_@?IlaTxg!(($NqSR4V
> z3V6vqm*MQmz|uSAl!5Uf3|zx{FVx_U)G+WL<N=#rG~ks}f#J{9F#KySVE7llaRIl#
> zP>Y7~W4#Ak_wP!<Z;Gy=i&1JV?f+L<hX4D?5BsGg!6OYc1bY^-i1tlWw>=9Uml1xX
> zzUwbRG^r$$J|`i!-p%Z+ at 4(80cXq7Cxxsfp4;z?|`34KKHAkcZ7;2MZuDeP~535`P
> zk7X5zvM3?S;?j8%^8m8#1Z-qdX(ur9^r}^1;cK7yO$;AHcGaiE;(uR^JF%+T49KrT
> z<UxHrpl0ly=K>!LAhOfG7 at p8yY7y>!sik*o>D{c(mi8WTNjfFYMk#L!@QBU$trcu=
> z^}s0V|FyD6<ZLE$GN)%>peCmu{lBQm>FGgga(YJJih+MkO at ca`eidrXvffAuTTOin
> zI*JB#EzJj+4*<>`V|@s8=}OepKM;d!X5R-MVI{l-xP{-d62hLM5G5N+Oqz at Uyt(A=
> zKE)HsX0jb;%GfiCFvxUprfS{|hH$okcF&zCi#CxgW>VqlM=wi1c_AIV;^|ddnW;Ss
> z3LZ$d$dK64I$lR^gzumkOD*fq^pq4BrZfLE!>6O=-hxMSe~cZaATJx&PF%Ba-H&S~
> zu3flh$iOnEr)xg*56K*B1 at 6-rM`6t}eCyHaQ%21rsdDs48hV6!y*a2m_P=Q}YwgAM
> zGoSp27+)gy$J#egJG|O2WV at B|D7>Fw?J*cY;obF|je86}a+DEj7<sGvyPU~Oz#mz&
> z3p6<(I$$#OuP8iLI}z4hbSa6fo=3_d{nyf~=S3eC-#Wl@?1l4mM at 8uBE?)<XK{rJ>
> zL3w+Wu%GIr??l6Zxe|_Oang4w{BuRmaqe@%CsenNNW-%X17Vd0#Lo-_I`E9E_%kBC
> zd at C8OTwj>Sy1w+(Vo$7lmQ~)&TXmcHKGQ&2sHUx~COp-lwzGR-lLU^6p76?q%gP$H
> zvcu{Llo>`DS9Wavo7)e$O{W%m;4 at RwZ;AjHjn;R<J94XAcgi^M9kle*LcOE&2u|X{
> zdF12tophI at m8W0s4wHLxFs7jS@)6Z{b-c-{n}}IbkJcY|pYy-ksRKR1;c3r67@`tE
> zzbk3nSVRR8Nn;dX03i>I at lN=Ys3KADBrmTUOGjK#mcOKrlj(qdi9|UEZ4uwJY_i`u
> zL>7DW4Ji)MS*pR0MZ1>*N{D6rtUu!nQ{eTCpY?mikJZP|`h()r^1sFZM^qVwrkd)3
> zZ>3??J2I8_j$A28lLfU_+tHcMA&p1o(&CqYWf%7nS?Lk&(q6KT>k;?Bo7%ux#wY7Y
> zW at m`kWv|}LRn`!r^zcM at W|RIDVFp$auq$P}_%Sq at u2_FR$)K=$&*eMgt%)Ge5(K`}
> zU}dD5f$-g7(t{IYEsro6eeRE01P%Pd)~ssP;!og{DgaO3bJ5Ptdy+c}D+(!WV3@@a
> z*27PrZ675sht5<qB!*G2`g*bw>+yAj=AjW1Ph#s+c3UtugH at Y276sstIulWSHW`BH
> zerQi`3WpDt?T1!En#cT2u|44qXa3jFM_zpBQXdhAyBK=o-6N;LhgQn(q1R{-WG$p_
> zE4u{^c6<lkR|&8xv0@|PlniQUFOGkc@*~+SH8N$82Q>?;xRI&uL~y~z9Wz(1paGOO
> zb%U$pGrJ?U4>1cYjP3K?f_D8|)v86`uu>Qa_lPpc$>K;SU{<HU%U>-k=PT@~1;^Ix
> zy13r1IFUIp-ulQU%(obCO_*ru1y7M-W!79ESqvi!#*7QrzE*2>AHz@!-dnTF&Q5=x
> z?zcnA5L&+zP8dB2R{a)BZ<r_e&i^zV?>pS$^L%5~ZwlrDTO7DktLbFl;el^an{H1b
> z<Eak3J6MPR_XpPw at g2#Sv2pDm_>7PP=#WmtJSLzg4TBu!FdnuP37|>Fk;N3!mcTy$
> zTL1sPC6|aS`by*`x^f=3La<BoxUbTwZXQ=H%p=w5J1cfctxLdl7DDAbyNl;>Hi4Sw
> z5u5hZ>w;h1m<oMuK<-`EPNJ*_wphR`ivYY^gs)U%Wt#d=co4~%MQ0AY#;~NYZ!X)v
> ziB+qoCg21d=@G4I6S00l at mesF99Fu9+hRU}7ka+H-tPCGF34H43_MfPDKw;nc&C`9
> zg57I&6>M9xY~3oWKFI>uS=KVxD-Ix{1HS383Y$nbqA8%3-y&u)AS>*h5%<WKXzkc!
> zVsK}1KgKjgR%k!gQPD8YEdTW^h3kWZ9DM#UOUq$TU1-OA6D(QZ*<RGr&Psn93C`+>
> ze}}&sJvm$Oz#4xKBmzjEv6o;^ixureT=&enS4{$9#HN7CYR}Ff+!4WoadSuYN*+V8
> zIIBjAF(JxUF_&9I#l|$txY|JZivdqT!J1w4^&8V@@{KW&`L0>xzcG*UCZ2MwZQ1iF
> zC&p0%i~yWuhiQWZ4<XS-q)`M$EEbu<5U0Q~=W1wYTgM}ox2Y<dH##5<bIh??Y^L(t
> zYQK<s#hFAe-h}wE6Oa<b`9wGNx%Z8+smS94sevC!OB9o|1jHgR`1<}aKCmzp9khz^
> zcs2@<%}VtLs~(@+lXGY76*-G)Cj@>JNDX<~s>+#@`(yPKv<G_q9QqCHAEPqVBPz_k
> z at JINi;_MrQY!agqkTBj2vItxuaQ;!OEW-bpt*^5KY*%6>{~VZu4*m=$AB4RUPV7{-
> zDF^=ws8 at eZ!OH2WIR-I9(VpexF`LVrJOx%PXFu_}6r<P0U>hiRKvT?R0%A_X;_<SR
> zm+>&)gugLuEi%|NIi0~K`MQo|yb(D6tDKcNc?VJIoFpq61yk(~zf`OG9iV^Ud%Ju$
> z+uJ3{u+W7E4yk&)5E`#r$A*E$t at V=;gM#=sr}lt`VBg%tFqczr`=JN7W*5UiX)p6(
> zbm{{Z6<fm(6s?scf-?L-!wRH{mgDK3v!PMGh29rP)lL)G-c(s~5aGU%;T0|x>lmKI
> z{oWsUj%ZN^5na`D4!8&5pSL9kj^XP^l+*C9O6-TVn0tqTX)t+{Xi28g;Ap^#uxz;h
> zb35k5yMTFvIeR7Sf(SoZ7SHEe(*$D0cO=mi+hs(odR_hT7GG15d$c~KDk<#D>oZ$t
> zsK57$t+P3-o!1|39SQ(Cb_(jLP`j7*NT5$m>Mve at R4T4EwGOLqgvM&A`emRHJu(6c
> z6B)A)c(Q~=Z|op)!EOn7e8uh}^x)|3V(gEIdhlbcDKe=~NfHTHm9+SK_70*qQrKE8
> zw}X>$2L1Tc1gwVPKTT#-ANHgHk;BL`7r7twcsT44u^LBt$Oc%nkWKKAJ<R+l3VI5!
> zzT6=<^Jq)>yQu;ih*@esgOX`EhPPKK$?*FXq at X9jC(igK1_EB at 8c0(%LF%}O%`l{S
> zwO7>_IUAQTY(gl&og3p;0D8O3xB7S8F%2jBJ)Ugn7SCKd?8vr0wuMM%-z7cKbFy<2
> z#Qbbgb<!(k><(XFx7UB1YO?x~S~t!#So#U>aCY?#yN!r?GQ+J|g^vJc_OF9vXC}i)
> zgOZ);S&-x;GAuT9pN;$Ig2~gL#4bv=S~d~HdNShvXfO at Gkr=Q3dw(GHISwvY2EMu+
> zP#$`mzE9mpnFb%Cto}){sJHImt0bz252aGXR}4x>a^&Tj+ at AU=I00<T at y}>D2#|u3
> zjVMhXfrw?0Y-IDya{FJ)Gkzeq;QyoCqEPcummkiq`MN?qlQyt4^K*c&9!FeQu{&Q_
> zLCwe53=R5w)$97t2re2$enk>Jk#dT(dP{^Yjp)bTJ7R1(c1W;*6M$Lc!6ky$DK*il
> z^?Xk$Nh67hX=iRdw<~vN9{%$Xx22tDkTzoH4BXEE1|;%^oo{#P8j5zk9lsON$a^6#
> zR(clE<Df;mL6gi at CRJI|!ywHSstBk}3#d)gyqL95?~SP-+~0yS6z at 6NsE++6W^LWR
> z#~j?=;q!oOfz5swdM5-WE9}bdw7w#J*$C&dy7rk7X}6&>oB6>G3nM`}l40ittz{c_
> z!o%XO at SPF(kEpW7B*9<ip(?8($}1Oh5jBYE*mA%a+PAj>p3|L?C>hD3vIGu+I=Lv*
> ztrayHFJRhN8^JAo4A<vTW(aG>z+fDnLn1t6XB?28MX)soPldr`_-JPFah?N=*Emdo
> zLF^8)by7j*=HKtK9u!n~ukW7TbI0!mK}38X9sZ+Assn*#s}X-4G1x0~(f+>(Tblz<
> zyM?Vyfv4-cFxNhuHscP(Lsw at t2}g at +Dr>+aP?uH{9=n`*OV!mMa0~rk5AgNfkXpOo
> zqY-DeFBLL<k(x(t!8)z2PbpZLYgg|F2Pg)(bFF#+{}hxtXi2q}UXXYz;6#c9HWA?J
> zyv4!OaNrfJw>#=n$}5$~oLh2h%Wqc9xKec`_-(DZc6TC0tfY~2JLok&7JJIvvy_VY
> z$@MAJI5HmJuovvft%WK5EcQJzlg^S&((Fi35%_i<PGH;1a*tFnIk%p1s;#a~rf$6>
> z(?-Z0yAd&IBpmD5vMB<4zTR0nV)pk!k~SICH_BV9DPgc|0RB-=aj>2rhrNCtURm%j
> z&9pP#1E*0c>ENnEw}_o5OovDtA)-Du@&YjVD=|OS>x%5lrEx-p-DR&+Z$>2WKvgP%
> zb`rSGA{8k3I&xS3Q!eYFSm at CdfOA>W2 at krKxT@tOrm9+iuQOAwV4yljulvewSX=T2
> z=+wZ6fjeBgMup1gg-n!5?dK|PSwoiTVfC{bGmlx9#C%=F%;)`o6t*4>e1Vxi68NIN
> z?*qL at P>LG9a_hjgEy&-BIoPONgWC0_FnzOwCq<|DGVBCYryf|U5z%5-S)!}<Lb6&y
> zW29N*A<eol$~%B*T)Z2SY_BrOmez793A|zs at RyK{6&Vb>19laG(Gb`;xDg?YKT0EM
> zmT#t=*t6KYXk$-znH*Q{Hlt->UVFJB%`JF3_qnC75#F6w1<qty;FE{Fi@^OI!)jsr
> zBnAnP2dim;d$N`qKKY(|d{sBkzRoiZCvC+<0ylY*tr?6aaOB`hC5GVIaSPse@}se?
> zK$V_2$5sR|^5Ku`{Jl9(V;%mA#ikjmI|FL#6GV8!uHC6c1o`3&4|{zEYa-c+_2d_L
> z(&DenzqWp%B<7l-{a|*&c5ZPb^dh2=TQatAbC~09XR<@*%z~Z|a_dXSq8+?58T&p(
> zmMqh$F at IY9LirnTYIURE<gCmSk0n-CQ~n^lc?t09WeP(aAQSv=!KZ@=NJtSAC=a?P
> z_)k>}e2Ai?k85J<`Y)qdf%=wq%TK6L9jqeDn5Nwhbr3!=i2F3+MK0}+p`8?-Oi}MO
> zsP|gbsq>}b>o%HM5S4e8RI};Mo>X5vzIO%q1x2i+sPo0<B;;jRrV+m2f!xNxF)7VN
> zt=vR{+V80%bZHewu0{GTP?U)6RAPaY*+N$^Js*is%H)-5fqMx%lLHTc`_E#AE`Y|h
> z&XJjunKuP7r<VneRnF9E|5$>|&&q8f?%9wXl%Rb^sb<}_f=BbRU at x7JmsOt|IEK4y
> z%vYm3F;oT~3G*_gl<`~O&+yT_bgg81sANXSCS(O`2Vy at zns+hBVI+izXj_B~J$fn3
> z*>MC|_ at 4^lg9-E6twUW?)j?Qt?*PmdX_%D4zb~cWxXy(&|La9$qIqoV&ZCt}xj^6!
> zB7yqPg;$$X&Zx1Iitd&?n(TZ5l7;lj<?tYSBjF(#G_`zEIpiYFRzyjBt0l$xf=8&!
> zpsn-|l|zjL=`8vceW7y5!O|IYCrisLok_dsjg>=nmzA*x%e=z!DMgudTBoHYt)6~X
> zCuaI$J=CJ*_i1HJmz5W^GFlrbk8~zIKwp65N}%`Alk`=&y6?UZbclJtA7uZ+0rqd|
> zV*eJ01+XiU&9Nhz at dc@Zou7$W{t at ue#d{3c3yIB)?^FRh0aE)GbZM^dPxC}|8X*IN
> z2S+jwera<0;|GLM8*t`C2i7T0L_=N*W?DRKz|7^sa(IF}zA8y?4Bf$hzVbaZi!a<y
> zg*`tp&w at 7U0dP}du%m78o2!FQ*JRwsA(H#`u<p-NSWHLS%t1eUY^B9M2J0ByGdzLW
> zSAeGp4^{Y0!EYL<r>W4Kxe9#SbjS>{;m3c<D9NAn%)v6kod%cH<NXVZYKXg&@UvxV
> z7Xa-($DN4Z>kKM9?pO25hL3-T(||zRm{$q~#11V$L{WHGFJW==nz9QLl6zex&c|^5
> zGI$juE<F>&(cae(w;Rtzc+%dN56IzbO2eIbZ+_Di1qLw;`k{n7h}1Oipg?F+v!N+5
> zKRo&imTpQ$KB5Q-kGiuEO%l2v#zC~<H7W0Dz9iWft-df8HI^KY9JCKwPNEr4^P8`C
> zmVz(k(=?~^Sq`3rHS3%75;3ko>3nFV1C#lC5AdgGb=ltM^CO?048P_{D at ih0N(^N0
> zCeWPOioix;$r@<D0QY~wLM5wM7sf1!6VC(hun=p0^0oy6Ay?-|Z!7WMh!p&TZDTW)
> z4JBTVJAhSlC)3J({WVRab%&2>o4(?MEed(H(h|V<)u;5&_JpksAZO>L98Ht=q!7a$
> zs84m4VzhE9a&^SDc_s7OdMhIDq%qytJ!#sUgWAK)g_i}I5qUDOt1Phbj<P_L%x0}1
> z>Iv}OM=Kb28onWTxe&Uo3-K#uZx%#NeOIHwDD>{2O}gzPth;-Iz5QwarQSxJXXEhG
> zYtUzcK1XkBL=ThT4ILKGAsuilD<NtTVbK=GVI0EsJg$h$6gY}s7qbCk-~8DMcvLFa
> z_~l&B9j=m<mZ!gg-f>=AiOa at fGEg3Oxor!Wrg?}zbxw}LdcA6?<@u7b at 2a=s{iw3<
> z24c1Uxl9w9VV8(aDzR2PnaO7B$?Oa5m%$Mj=hx;dY#+`4asJPs*LaS7$${t(E<+{c
> zpiQQ|uOd1PIFDt4-{m2duAP!QQClm1uf4}o at TsCcy?2wg8?-36YJXdl7KxF4)r+5s
> z-++26=%ErsGKD@~_m5a<^!{!9`Y|HlR{b3_6u|622XBpH)bxy3YxWGQvF4_A>wrx>
> z9NP2O2IqGm9nnB>vOU#n6UhV6QFz9?YmeAgw5!BoA>pwifzH8GNAab**$G at FE*8G8
> zcJtq_##w2?sg`0V1-o-Ub_?HIaBT#90~fltimKAaHtxig9*c~~pzsEi>@y_kfa|2v
> z<n!@}05A<+$dlb)`}<fcyzfA_?rYW?HpbJZGCs{{1-KS|Ci`IAiwp7*t;fS(jPp~h
> z7KX3<NYjL4@^qF$#Blkpc#;0BBG-Oe7Gq<88!w6%35~UI&`0+Z(Es*=gew$We}Vob
> zfv<tF10BKE?mE=IoF30<O+J!yOY(={8cob`ijzu`JTF&R8va}kpRmAak3*W2D%+(Q
> zriihF`*rmx&Qc~pHjMyoL(&v{A`MY~K&Vd{OLmqbU(iZ?`*eyd-keJ~T1{W5<7kon
> z!6xoza35}%LiLQ+cgNJ*Tg3jS2d<D79Eey9-rCqHw@%7yjAc)6okBS1*97`s9xzlO
> zP}9vk3ApwBji5!)2HF1Hj at vDwQ1_7g&;3`OwR?VXs?L)naXxdmP at LyC!4oj#&q$fi
> z+UtwlVfDpKAEG$#9IWB+Z#rvtHum4<X at o5!53OEZxux(~;eBAtCiI>}{n<Ckmm;l;
> zC&x=YVKl6#NUiID9ER$;jnLJ4w0vjn!|OBMiN5HHo6*WwfXALjgo+}y%*C@(kZrG6
> z8`xGf7KPMZYXgic+Ix85oAMQbrSIGax%Kf2GlE$vQj6sjVI$#poCW6TGy3-=%b;zL
> z8r}ikKj at -}9W`H?JCe)D?X%iuf%ivl&uyE{Jc=?M9kqb at k`X5zj;a8b2Y%aMH^n$X
> zA9|;D6t%9dPdQ at Py}Gr%Z{ff>=qTSv#+6qFMs}~h=ufpbR0C%IpKAD7>*|iXKQuyq
> z!D=W&4PoR)I_^toR&hf|zGeBLdT`Q%TCMi}wXbs^YC|Wem at jN1UrM=Rov9|CqvL{7
> zy%k~bE(|)jr$}4jOM4bFPG+DFFh{bB7{6jrS3X0tT$p3Hq6>TGnzkn`8-bliC0ihz
> zI&VqiP60y;$P17<ZHeQ)#_t=Hn+MN}I&J_zRc4ymf5gt8Uq-67w9N{oS}<aYkW0q3
> zM$97$yn^qJsNm{Syz5&dEL>g2)*EDE5-A6qOjlJJjJa?Co-S}7QB at ituow)X``oJ1
> z+)MW<M5)5*#-4Yfe0gl(i*9~&oQ1QWz}$-PR$3xXf^WbcK-%MlQMHxd|I%sd6Fjj}
> zZaj3oqIfAyju_i^#6%Yqiw9~*3T7ycU at y7<4$j52?LDK at ibbJDhJF!Aut2k>0juAF
> z^kHC^@#cb at +DaKd`>ZihJo9}R6&CzzPmweqPYY^SSW}vyam;93wRr4Sxz`%g6!!Bo
> z7)AKV<L_ymh4DYOrytlF<^|~!I0K55aK>9egpe{~;b(Uu$O=EZX8}7IMsL8}_NZq8
> z+k$dhQG*)>agsx^5wob)w7`Gn_AjKGcr!-+VYR0Jq;${39mwk$FtYd)`9HZY9P3~m
> zU|&w{3be3NE`%RIqcw&Pv&Jx-0I{h!sX7UId*FqvuvSkF!?luKwQpgqJNjFEeTO^-
> zYN+q at y@q%IqihFg5;3Eew~FPVPny*M_QGHLjt`i<KZBI5XY~GJT|~_u7{H(vCr77^
> zMX*tpm&=6?>6#cp#26>A90$KeX7?316SRCpbjO&)VPtYiJW`1aqT)9mzlj)iiM7El
> zVhjy^MyhxsMyIjwF+WaF#Y?CM?}j9}v#<{A1$Wj~wm8rOQA&$9I~%RArIls~5e$yn
> zp%v^o18<CwrlZ%nVPP7bWYhlN7>#7(Up$V~SQ_a#a2mi*xiBhn5gQja=cqYbdKK#{
> z<_%tYAt^$NN0h!}wJSQuqjkTuSLfU!PAb2dCRhzqdH7k6r3R~WY8d1Ph|7)td7%8S
> zM9I6|dQGPG89jtA^#<{I<abjS&ew_FXB^@mgf~|+`Mhifo<6xYw+-0OF5oUWo5mp~
> znF?#<D7+`Bc3>T|fG4OJX{t``DPcH_lGPz~W%wbE;je}t6AnDbvJQh>gz<_bxdgTc
> z>jYe*q?Ggs$<n~m(URqP;gD|Zd7KoYBep)`8qoyaJMflH)Hk(5?93n%fAvv4AvD4X
> z9v^h<M9(DLMS^0BkWx4S=_pWa(V*T0thAJ9L9$pPq(KL$oo(i^gnq8lh=?EC=!K{W
> zDNN>SBYaYR`1qgNNbIL-4Y0fSY$U8rOT7!2g_uExxiVsy&1losA-qJ^cft$hi&%*x
> zSnCCO9x82`U!P<VDRiS0KWthKwil^K=v_^wvf(%1XHn8S?i%9SiV!OWX+~YN6>F)u
> z=!RI}x-1Rq;~-A|w?pX<kbX<ela<(Nl7#DV3*;H>nPoNCSg^A8Nl>Z`HZPK^G5!@x
> zEl<w?7SRVBWo=K1y4phQCm4>=vj{xK6WHNYnE+dXL!foKF$c5y(gp;_{9b73!wM*}
> zGh7|*G(!h8NikNy8XH{i+0dW^ji#-BC*E5LTp}U)L+t!|2hKc<*P0+CFqdC~1og at f
> zAi=#1$DElh-vub34^jp0?_qTS%bp8RU}iSk{h;lSG(bbT{)qOSN0UDc!2xa0WBhMr
> zW6jP`!z}i%tHJI7RLe0?_*mmWlWp0?PS2N*Gf2j8uUcS^BI)Nr*X{R=WAULq at GE_9
> zL64Y!|1+oh5OpJXw>cO3nF-iKc*89;=n*f3jY!N7%K9#rO)C)*<2j)g{CpM}{N8JO
> z#0E~&1gwUJN^_-)aCUfqfD|PMD{KEpdK*z#bgVD)Csk}_u@@EdK7zblru8BB0{KCV
> zA3TADFYWC<n?GsQj4Df{0VRMKkpnqcv5R8Kd$<x at e}laDuuB^kA?_`D_BpOUfA7|V
> zhK5cX37qdU4CuAKZ(&v&=+PEibzlrs at 12aZ`OEeyV<1sZ=~=qL*bHri+CY<_z5uBQ
> z)8t6Py7;W$21?rIkorob<@r}sy%UH!cvc#>g=;QX?M><GROmo>`!c2Kcdw{~Tw00C
> zG0gX&r(yY%8c!kCFL*XfHf_L~Y34A#x(y0=p9<)yso0k3%vKsSkrbM-i2hGJ<}yC<
> z2zre%>iifzyP=G{^f2Cx!*#W at Q@u&n+r+tPjQ^Tr*yUw<8 at u2M9{m^GGnho`rT at Y2
> zcD#|SeZ at j16<dz7h!2xoMX*}4v=!mK)7pEdQL^NRb!zbNOGHkJ+$Q1ad>c8SX~HNU
> z?}I-x%+7K50?b2o at XlSR?xkW+s$x+0$~<&xQ at aH`UF{x{(W0eWl~ERtcj-&YcP!G^
> z(ifF8D927xlq=&5n-x`^qp&wz?oR=SPtab)v=`brO8eNteY7+%_I(*&(5ls`xDVw=
> z{`Aj1A~4Kwj16(Wuj!?-6;@Ai7L(iQarH at fGu-&zT8w9kq==9O&tKoIvy0HvX(aTJ
> zQQfkxx_mYGpI%TjtHFEeT~~V0gj}h-nh5j==H>u=Ly?8s6+}+ox3E7&I at B&m&U8U)
> zh9}pDw;;|<n-F*(vAgY|nMlo_S$Ona9^7!fdJ|@b-FHJ$$K>0R*0x@?AKXSn)|G^h
> zlHKFcwx!sen9qfanA~;Y?PGJCL^)eV_7wxa?W~Fp#Joqb`Xce{TK75pzpLo>E>sX(
> z0OPN$E6o3;Yo_`uDk=JPy&r|2Dsr2PbssZ2Afv+Uy{U4DaGq<lUgRrt_Acy(By#?G
> z#fa~wbqjlmy3B1>9ZCeg7lv=8Bj+{Hj7$sXgnP1$z^~eqc2WJ668=#FtL0k6$>pF)
> zrdakKbBBEdS$Y}C_t9Q;OZjTa at cuD*zZ)YgcTyt-&xmeyo|EPa;3)s5|Gm0UU-jGa
> z`Z-u35Ufhrq|qsmouAvwS0d79ry1OqXlO>`ZLHx5Za|>sjo6bT>Z<PVFvE&Jg;DeQ
> z_isN9{Gc84q&sF{=O1huICnbqr>B0Dm~%_*5%1wo^;$mf#`*4 at pJS*!!d7|h5luoj
> zl|2K!0KG%JD?my&B`2Zwa9@!pMVXv4r}l8aE~f;wydjGNdgxA1kzfHFh?ZTjhcX}%
> z+*GFZfW3zU$R^Ip4ouhNA3K02?2vWtUPS<%JD;8Lz}qt@?O$Ay3q6{=25=fjO~rYn
> zrsJOdVTglO)(;I04>-eQ0<)N7k&65h6azBsV*m5tP4|^l;JqcG_m+?v*U!7c8rJu(
> z^+1Q5PQdvCE%KgJGK*$-4`}VNpgpBh-Zp`0gfgFGz;!eB6!u4#G at _<vt)}eaMxh2;
> z3q|Nz1|&-s(}XHZxCm?|htXNi*8y>|)lF6KG^cu?=X|Ux3GAlT+%ew`WG2bzxz1-)
> zZ)P^xI~FSO3__C|h>lDsBkO*le5V2<hemyM+uWX87<8I-7vgh!1;`;f=cr#an3?}j
> zR at x1XB*ebXQNKX!<1eu`Ov+!en)q=`y8q&ONPWa>RVkmw;_Y%)@Wki#EZvi=RtB}f
> zpsoKwM<M2}l8+-{fY0wC=GZOx*440wINz}yvvC|_(~A`o^oWKvb5M`3PIcN28`+!#
> z0(=b*fVpZu<h4^Zh?xaC<?Am5#=qMBH7hf^jJ!&wFdZ|js|>P{j0b;Wa&5as%k at 6g
> zj#}BeQiKL=WwCeiuigI5e&_<wELzr+Ce3_JsM_?kK%aK&pvf>L)XEuv2c7=qq at 9e%
> zNw{N2m*9f6vq;13bv-xki6rqfgDTKY9_}ypM5yhySVBJ2!P5(3`-tQZdN~ad*OS5p
> z8PVqC%tiZ&iH4VvC7o<+K!-2YuEw6yMLfA4J1MiLw0j~o4sjT at B$|m<R{C-<R#!Pk
> znB_=$4J_&fno&gzd7<{@U_Fh;tYrt^R$$Rer{e7h^ePN*N8{~j!MA1Jf1Hh5c_obx
> zK6MgU$c$G%VY3fU3F550U`gzFQ2w&ce;hg&piHnX$1 at o(WS1EYTz?dFCT at X-!|bKQ
> z>rEHp%v^Q%ra7;~MqRgN%}*bwtCyjB0$mug;XBx6LzkGro(+TD`RYf?i2G{wBWS}c
> z9)%QAOU;ISTGtJp^outsGu_j*yqP%$d!~}-t^Q(qSz!Bsl7kpi?5$}yFKFn!DM&XW
> z{k`Aib%yd%yzhiklS_aAvR3$AD7P9Zy_Txh{wwf~9VJ`vJBMdx{KAm_Bl1iAt|p>P
> z!H(?h9OtUHRby2zPx=c!JYIdob)8B9Wh?Cxg+#fh6xPTuk}KQ-azyz+Q0hBqcl}I#
> z1fw-xrED%4{t5nr1~If<j at YtXGIkTuPpl#l6L=j7QxY!hB=5`EOJUwC;0s*wT6>Dh
> z$du%6==)MmF;v#jF`S93NdWd9>3#)0By{<aOYjXl-cPBbl+>H%K^_l{ThTR(ox?(J
> z+bo&c#bn`^EhmHbV37&_W44X&kFo$(cv6FNy5VmZ<}_-m6dOBvMr>;4)CoB`aum*8
> z6W-2r$E&Zn{fJmSI-212jmEpbL+sOYqk{X)ML3(T#rt5`jRUx4HT?VCzg at L2@91AA
> zg1&1jUrBPX%hRySn~w<jPi<G-@#Xi at IOHTTuNKhS5YhJ=T{U)s)ocJ>rh5nUB_y1H
> z_0Od=r}UZODTzUK0qgb}8IdxfEpw>jl>1MZ at m_q<#lBe48W^_QJNhNyC;0MvwQb8@
> zBRYJ^dT=s>W)VsF;&|-$sW>U7NK4iWE$Pydy}~W9>kjR(J8ikSglWe?!zm8!Ek7J=
> zuO4q?l;1+f{hJmozu2O~zzM?81NO!QK$n}y`0`t7p`Yl7UZG33(n78|tgj^G8g+J1
> zs?%E38RxRuM65f}ajUDiFLfZi^@9zm^~<Fgd0A_nv#dBq;C3%)Wm+)vi3R7D(m(yO
> zQ^Qo;NNXwxpwdMM4j5gOe}4Pd9=$ZYNw;hm9HcB7D2Q4D%3TjzEkSHGTMDTGr$(mS
> z3lCYGdKyqTOKo<|8eHd^>v{;%UOh?}hu03tN=BC at xCdNwF+XXp#~>#MW-YlI&GBzi
> zo%;%J9sK%Kx()d5BP!L-nO-Vtr6XN)H(Q&9CSh=`+sNZoXfCTy8Cpwwaq<YA0$_ED
> z+n^4r&Fzfm_A|sPxTibOi`cZ>IBloIoYOUP5>FB#D+_0{Knkf4nyp;*OUx5=o*~mU
> zA>YvFk}C4AC|&}cxSL28zM!|<Ma`YlRc}uU+X-cX|A|uKwUdq6j%9Zvg0$Mq_6e}9
> zX^<ghc&}&DJ;0uC*?3 at lvb}G3?-|l5;e&dcggKHdEzYtgyCgLU?!*?eJD!c<pOT=d
> zt5?4q)OCgr1<P3)=eBT=b{882x2}crUV9M>m=kQXe?N5{*0EK9^Ps-Gf<Ei72JFo!
> zX$L;=>jo2IY8pmM?avk~rW!YIe-;oa19|$<(&BdH=r5EbuK>Ouw`Wwf1 at u(!b=W0x
> z56!Atg*&6y0SJUMq#$QWrNjZ}iK7{<98PVqFRZo9GqEqzGXZ#$UP%=2t`d*3*;S?h
> z^n|?*K(t^QwZOU&HW at VgV;y|gEjUp!kXZhz#7bviR~hgGr&L6Q06l0W%vIYN1}G>=
> z%ZUNBoC4h|_;R3~IDNA5Mi$d7WOZ=@9S;jkj4>S_FotlFvY?)!rW4tV{lTDUHSKj3
> z1H$550yLI at U$%MAGPu$We1#@;8!2?(YTL?&+pc%dXK+Arlek}J0_v1w4yR%z<$3R8
> zlmk|&puvHu7oaa-!4!KnS^x|H(8b~{1bkT_mF&j;Kd;C6oLK&v6355E$EJ>iGp#$;
> zSHuiAQJmjcuVObMi7Em;{Oc+1ZfbNrh*m@*ilWMDBTE2nW{?cjjat<&cR<&Z+37JK
> zd~G5)sVU%^ecc&`nFa5H%`Zk#0KUx2hyg1m6d3G at kl7&eCRWJZWhCcYoX$D|?IL@$
> z3p#3SSLH{$uIVUbP_rZ1cg0u~yVv at d4!#vyc>WqC2{2=PL4w`lf=xemEon5P)I1IE
> zm at vp~v6YYjvla9sc0`mr614dte8D0oyFrcEqgfh|>l#oW3GBU&<os!_YaG2Bq`(KT
> zh(6KW95~oyJ0$dj0&lS8Pj}^`jagVl;DdS{Y;Uo9H?&)|dbRqP1&`|*RvUO+=KN$=
> zKC2yHvVt?jvp5gXI{OqSn-RRVsj#1nL_}epR%^4wF#Ak);`r;B$Hb9s?Yf>a=yYT<
> zZabMesOzy|W^TgVW_YcD7*p7a+j%YoGpvjz(6B+HOc<Wc&II82b&8qsr10HuH0t`G
> zCe6HuVsZ)Z(haUtzu<pG!uzB56w<!<=cy12%JwoSd=YoY>GzZE9%%2H(eEpv)lAT;
> zE9I})w;Iy>vprYg<eh_P0hQ`@^-=huEiElgkR%PmZ`{*8sf;wPc2B_hF_&TTFW;@i
> zYxpm8(zYyfL+<+WZA!S7gV<coC*2Ht28Ms*MAzJI3*t~mGZ;GvTU at dq{nGGq8o{7)
> z+gzcN>OQdiBd*_WYhMS8gDCiZ$#7e|b>2nl3+l5&>j3wIXD%D>td3eum+T@=p+V?G
> ze0!>rbVk_m(2ySTD&yyd9W|c`{7oeM;{;$E;caiX)nI1+=tj(O9yBF1bq&~sCiWie
> zJc1gp=LdyyDw+7Zs1aIrY?r2c?^6ur)e^>z;r#Fn9#*wlXVS(*d*}N~Zylgj4avZ_
> zq5y%%^NT6)B8}EqsJ8apj at 5AjbI=dz<_UlCpuHWI7vSQ8wxYd^LV?D2zqYS#BH$bb
> zTcj>y>jzX*8JjCmUy-1`5<q=TWYpL59?S=M{uOt;H=#S0K@<rQ)HXMPMi0FFJd5GB
> zxn417GXt%w7vI$8dm8k%WAnGVW@~+4Qr;*<<lo_%^Q8&$t(RozKG?5O^SoDLP9nkO
> z6Bq}~9>Z2JD?b7cI_JOfcd>iuQ!lqy+ly#lmk}}-tcLHOMwC^ab}?!P*wsetlSVFv
> z(K-hOjL1|xTNxUWdD4PufN1VyW_gVrf--a}U8uF`Q}#Yfjlpx21+}o<bG{?ELvXTQ
> z+#$fUj$>W~z^tLRg at DT<?L#Z(vt8;kDtgUUoB#PR)5ByQPBE_IK|A&J+-Mgas`oQQ
> z2^x0IK&hp43V6Sziq2{EE0Qi9=Pf8=sYC?dH)Sn-KW^W+@)wAqB!!Uj7o;%0n*NQ4
> z3XB8sKZ(<Q6Cfk<@jO*~u4m8Px7uK)Uf!r&QAQR`XD1lWog364_1EfIK=%S(r1_|0
> z-v7thn}A1Eo(=!cteNbSm9S4j2zz8FVhAT8BBL=zM8$d0MzN at MDT=k|Yvl}?XhcL_
> zrNOp}(Yn>ww%DQ$*5w2%3~G_uo{DW_18PiWT04Ns5JKkr-Dd)|?bqwSz?C`MbDs08
> z_r8GtF2JJArpD<r{l`u|&Ir!0FQ%T&Z}ctpsiaokX74y>*Eoqx6RkYtu;S8;Le^~W
> z9UfAh_9t_sh6FnPlPzFY&VeD+CEsXCa(8W;yQx{VZ+*ec0iF}@7F_P#xTJloSZ&6-
> zHg+aMLN{CMv;phWdxxz5SK?psH)!Ty at Cm$Bul}<2#hm)hwkpAO4c#h)oujkiWo^Am
> zQzhVnwHyWWIudE>yU>@n8Ccv|@#?O(4^x>$ueNL6C*jO>BkYK;XBN`nU&lfxWc!bu
> zxGa*RXLr at cTew>r4;^;K at eC;YD&lB*%2svQW=~U@@s_8TuveCAMdj4eqO)VLnKqma
> zH)-?5YF)49s$b8EwYBJhNHW_j)?DL{#fhm at KCIogG2>8f-x0I?P*z_?9F4babi+Pv
> zWb|Rbn)<3yyaPH7IfSmQ^pT}Xs~PQlF!FOXg#Q;{8M~-}wF*!AG4MQ1O`-2@`p(`M
> z_&6AO(Ic8}WJ2%6_KMXzx~#tb6?Lj at O^TW(f^mm#)64XagY{qD!yY<nSr_!hTN<xY
> z_r<E>>lge6?9AA{cxS6<@}524P`5*`I~#tceHU0F<9j1V8DFtWyv9BTS%=Sl^A^AO
> z--PXI6L58TP-kRAjI5{Y!gx at hC_eE0&qs0?r`mWccWdK!A9lxGjI5uLT@$Rb=P<6V
> zs#sU-zvWti%ui4qw#A*+$o^WJ$;f8u6RnYDgn^ZZBUxs)=6LE at -1Sc*J1U+QDG}@%
> zRQjk`8_+XLaDI;4YPZVCj63L+N6!MsFY~&I<B{$CoRNHjk^Gr8lApBP_u}=8WRP+G
> zWZ<e`v))<#=wos4=CV^1mc&>aIK+-GX>b~jeG7$(2-U^z;tsTmj8CSs at gds<%s at N>
> z#5?gr3wjmdOHr|JqVUFe8C+ah5v-2bcM%stAO5x at R1a;l2<q}Kt86tbO4BpY$qf(H
> zQ}f=~1EFqtvhLmBIYHtj>V3g`nS;x#f73BnAgc=L!yA?bzoVz?6Y<T69B)&%>f?d)
> z%#^Lr3H=GaILx<76trn$fo&0%newdCuO at dl+HI4oAA9Wc)U2^im?bDGi;8thsT;91
> zmE%pZ;zoz<dg>z#w{Cy-%nj4TR`=OE0 at rSK9KQ?e>;ECn{9Qfo at OyR7UVe{C-sj`r
> z>e<ct#l)<09B<ZpWMm8=>xpa&kHs5z!K)w<8oSTPXrCUj?;}fK^nR at 4+x_Z{n^rk=
> zJ9%qe_=037#s*e5pA4*SI$@1dLE|mzcJm9~zYV$8yX<vGBB#2G@%RK9+O3yZcU<5{
> zIim;aDpt}2;P at r>yOCb$`Vu``pUU-YRiTfMZrgM|e)j3=Y$%fZd)D_lAGLWe&~q8L
> z at k4y1gPKR&n^iv at jwh7$-6p(9^+tU|=yC8wlQC0W0^NR_K3>g%emWbz5sW(o)z0tI
> zuuJ?~?3z%$tQcmxyL#PYpW``<WSp6eNEW-Ve)G~;T8o at 19t0kw9kEf<1Y{o<${MJ-
> zZQZ-9GN94}rF(KK=LWN4*K}Q?G&LMbq(0=*X8e>m7!Ntk?8d8za?Ep~wk;~VNuF6z
> z?9v7fSu?9L9SLY^@ajY~75{6E=UEs4&WjYw+$QEkb&+3&%2M(<pdOeBS+PANUatjc
> zDz+rD$YH=y_xRP4KlV5pj}E?Db6YT<`XZ^-W6utRotaWA&@L^yKw-zwXdiqBo_J({
> zG%0#t#~pAmPJK9XQ0sfoE)=SrGCT1TMlOpL402<?x+7sk6BUK5<OKE>tZkX=G0b`d
> z3aTi&j2Mxlw``G>{*U%XJg4>pcH}=pGD16FUz}<)ZES;Haq at -(zYA8hXwkS!WVtj)
> z0y}=s;^SCmH_NKIm6d&EFShSqxoQp&ONC=gVldFW8Vh_~uI@@4t9ODio7Mg3?22OT
> zoc)xubnM}qRZBetJI8g2PoiIN{O{;iepe^DVoNxNDd&!!;OvLd_mLL7%-PRGa>wzx
> z#5;kojotCRGE0M-#fSp)P5Pq0#W)4<Ht098IsD%La_1drCgk8)g>NSw&>Kh}lO1P3
> zQ at tWPtz%Z=shYd>H(G7{zA8IzOp)QJxtmBT$}G38vxSzsFF%3?lU=0r37c$Qex2iV
> zV*7Pm)N$Nis($QO_pY{NnXm9JJfL5VK5Vd-qW34hGsLeHnP^GAzd7P&t|lai4;h?q
> zmFqG_LsO}|a-$R~VGcATD<sc(wVU0yAXMv5K5(+WdAh>KC|oFa&#u2(sp at Zc%t<U6
> z>Q_BlyX_4ZE%-=>Uo?kBw||5+eQ;u<{iMkkFKu+3{H=U*6V#KJV at uNdcA8K#ewA~z
> zIoxW;52{CZ%rb^OSk+i?a;Mb9vrE`9`HeGAzA&_7>#NW2nA4>R6q+_A;R$#dRb&TJ
> zwsPH)<jF?|t`2nvbyhsq?CYKlK7M3<?5I&1BEl&9`rD7if%RmXte;Md0ySZE&8pzA
> z|2wZ|ajVtTQ?NuiPO!tP at pBxmEL`FlA=F5;e{Ye{Dl#h_=du$?xm<{MME_gx)SnNv
> z_j3K3$0u}Yv1<gv9bI8b8$Sn=<ehYcwAfw97e5a!-czJRD&fhrB4P(8npqaU^o0(Y
> znMiZH>o=<;)SoMqI@<%3{vg;4?%yB~mg6nEE1`WSDCpWlzQ&{KTODgsx{r9!S)|+9
> z%`TDn+Q;i((}cuZwnJ4P!Q<m7_}GE91$7LUR+(es4&k^X$LRZJT04x0Y<7Wx!kYyR
> zsne=au0-0L19WgWzSZ!l<61p4))o({@94v;-#7(DDNFBcnR at 2-bFA+@&6QK&tA#}^
> z9Lfqvet~tRjBI?pUP10t`%z@`72B35d*L#-()hxf(>1ixVppSb%u8Y7-4iT+dP)i(
> zOKAfuq7(Jd`}t5FzS#QEK?56yq3^HKyHj6|2f?71$}BXlvGtMvZxh;{Pq6yHM)<^d
> z!_9n`L>y99DBh5Iu`y00QK55f^BbSA&9%-uY%>{~$?Z<?@U+H5wrO0AhfbKJE>+`e
> zRnV#CA;CQxyQdT_eQxwGT3ww;ZPVa`lr5|M*Nro6&m(hp9DiHlAsl)8_-^$wwx&7w
> z?wl=@lNzRm>p6*A<3UDl6l<7LUsbi}mBqRTN?}`P7Ijr<PQ^afH%Bt`eZh%Aq*>On
> z^B7W^;5)3$SB(*khtvn)x(T#t!l5hCm+YtRNmyFEBbp?oBe9(#^i4pAE@%OU?r8j2
> zZ9aZiYUGaWg|AaW-85XP6*OF<<w5cO9C}W9h- at c1f#}89N<1a&mv<khRVC<U?0n}D
> zN_I54l1ZXb*?ZAE at N9V3g)O=>P1&LEq0i%?R6ogH(x$U#fK(RmkTJ$Yd!@iH8OMk2
> zd>MD>)kj*pmi0J}xO)E<(oE<`>&}uRuE_Djj)pOsLzfYjm4~OKtpK|Ldvy<<lM`*(
> zNDwOUsNc$r6|w at dLt3lDbnkNEMG4-pS>I&_hR0h1Z4S9}Ccc((oR{jm8nFxO_Wr`4
> zin#d3q}T)I6zW7~`{j-I1Q~%ZQ(w-Jcf1$uQlp_TE=51=UiZ!cr?vL#DL*B4SKLAS
> za`a4rCp)qw%6oLaX^-9dQZ_tsEco_|=L+U-{CF at 1PjCtEzul@~J9ANNJwBwvoj+Di
> zdy66;g(XLGhMXpnEcoRm(6d{FANJ<zBTv&wzf>dcU1HHmPg!)*Nd3H!E_BlISB*&`
> zgA(aP$Q4^?@q7y(N5>fbsHtP!p!6F3gzYUysO}HguB2c^>@MDXkUf?q)RRST3suaz
> z3od5GVNJ5`ZQ6=%9gVk)#19&;veod;TI3PdC~$sDP&0%^7tIr8)V=6ShYO^Jvcgl6
> z-H;7bz<yY)kSuyqYAR})js2w3D~{OO5BOF2eY?|zwh}7#cvFfiLyPf=%z`?H-FK-f
> zNNE$H%Ffm59%T2yQ7muFAH2=4?mDJ at u0}G>t95rUP2Z=-oJ6At8lhUoeSmT`<eL71
> zagFKwS{<jJQT}t~q~AX04rPb4YT=4Cn(e$NXlCe{haEuB6V`Fr<p%K6S|?IQ?U0of
> zj11MlJ2_ynm<wv{ND`iLurE}bfcN0+Gl3-*_xuBq;w)T)EK8`Y2W79ZW9JD}<_z!E
> zhKrL|qXoPLIby3wpOLL))^CR<_C7D%TZh1K!35T`B9)oCuTKji--vh{dXi_`xht|`
> zE&lvGZTr+=?f!Nf_~b~k%K0Me%v72B6#aamiI1%UzNOZdFL~6W&sjYw`W$`6*VkMt
> zYwkvC&Aqr$X!DWK_jiXnSfA at 76*hsC-_S?0?#4egdk8+BCvtU>ilzGQ$q at LGotElp
> z^kO4ZIb_Glc%h9Gt@*oV`ag4K3A_F_qxa|33em6Q{O>{m0NEq5w!mpfwZL4G$#Z}`
> zlfj-jH$@eU`zDxZ1N`JCr?5 at D(ZY|Jsz`_TYe}YX&XVN7+l at aSxR<@aPV^_^JBh|Y
> z-9wxMI~rblf==dI9s8+q^G~f$OWK~|4{C)!c)>|rPdEfwkpsILR}MTP_=oey8&?iq
> z|Mgb05}!fty9 at aEk>T(*EAfoANz8Wcn1)j%%(1%$g7B4pN9MIMSPMlpKj;gLP0F4b
> zAF2>KT<(diTyS}O{b4&CKG at q<Z0SLpUv%r;t&i1wwC>sZZu`v*tMrAtXEWX@&4g&W
> zu(hz{e`yx9_qz;LVy4Sl>zFB0hwxmH!R#rqU!*eZWL!Md(U*UqAW<*h(yNE4l9s~`
> zk<n;t)JSa~I%<dB6MRIV#r;=e)0Wxi)RCQ-yWk|>kve+Z&@{UhT5DGNIH*#8Q{K9x
> zNGo$%^w&p(M~ZbvoAF?$w$k}QU}BC3PixoXuOh`;sXmbRx7aqgd(x<*L!T<OM86}P
> zjXo*f0 at a51viL)by+hn#AE#%;9Pt);t98RBr{tWi+pTP^T79>z>XBRHj<(5CwzXL#
> zGp!vjjvA86tZBGQU3S5nME#=|64{D=WP|lC0HS>pNr#Nz7wRUU+_kp&PCIujT8eM3
> zmo``y70WI8mfc>7jvYxDWyV`0T_B~w4}NE}8UZ^qvdxfZ(%-5Nkffw-++{jncghv=
> zpNzPDiyxVl%ylSKA at ZAe>tUCScZ6*4hmqhk+LJ#sT`g^veCqKgQ at 0UKU^H3S3&={<
> z91jL>4D1K%C6f;{5oas<<;M+;N0Tjaa*=l-aao2G-|(zLTYZ1M=`18?qWL$C%n3ug
> z_d;#PbJz{(83P~7Sg;NiE9>*!BakI8h+cl6guPw at i~?S0GYk(A=t4vCw55Zeb)BnL
> zs*(`wbBP;k0sh#BI=1AW at 5)sds__SMHvOdM$JqYZEPb_24Ij*wh<ZAaw#4fYIz4Yd
> zfsMwiW;HxelAa-W{%;++7I8v at SFk&<rxME%nYY+cya}F-h^^M!Z;s+C(JdeDDAS+N
> z^@imt|E+W+6O*^@KwiC6AOC at 4phGX)7$nABn*R8XQnC;eHJ{cES;({hiA at 4`^wiKe
> zG=^4ci^j04DWMkbyZuQ#Dyx<&SAV#Tvw6!^?jOVVr0&^Y4d0zQQ(Cw+b>?gfhf-&@
> zW#N{ga?8T&hswPh4yMi=p)fYG50->{nrillhIT+z76%u^Rz+{$TNWxsm$pEp(2Mhw
> zdO!cr*?lgNUB91Z=Kt0uQt9_SW;QyliNwB9Z=^BSL+7vFL>7lM-`Q8Em5)!=7~LLS
> z(22#eRioGt<sTYPZKw`^n{IlgerkkH`>oqdm)bgsHY3MZ|6tXGCtppD{%*&jj`h!q
> zb^1*&p-xN1=!mU~E!m$IdwIVr`u=_gUwz7-ysc0ye|hrqevfe7r=Pv$Pu}t?c^2J1
> z^i~FMd3fv7=ndj!OjJ}Pe5*;KW|et)fA;D3DOKwFr&8ynN=fUZ3x1nswI5lESAB?;
> z>8;mD%gf%9dj9VvZh77+@#%jq at tu`Yq7(~#B0Qj5iQXO$B4607W*$oKqraSGnG2CF
> zY*t0mPP8s(^3Cyq=H$4*wZ-XiTcRK_n(^qw8f`i?y%o52tS3|(w at F*cD^?u1wkShv
> zvfnr>buUzF_EGLrwCY*hp=TkjB?<OH4|Cg_W*4<Wk@?jtgXZt~5?p1VxyZ>ppAF?#
> zSnoS?>X58o?A|n5{k at Jki<$4}?G3B-GY(DYbIbT}o at LIF+Bqw>^cy#;GIJ`evqmwr
> zD0HPcCU9-OTiO{~WM=ZMvuP9jKN_}c3q1OSP#rCLvK6~<o_&+QR-Su8bwh1^(L5Sx
> zF8Dk5pKA35n)9WN-yCY=6xvASWIcVrK*Ku+oHmze4n>`X1F9wXt1;CJJF4u{^$&NB
> ztv+jEj5U4cVsBgxUeXCYnXHx>8Fw~k590S&yzcj%WH0fn at yL*&C4O%~2x5oCnq!ll
> zWqQ&6tX<iiIXi4S>Y!4K&}S75W at CHmZaoN{dk8xBpzN}Bzh__MYw=e{)_fJrV-(S(
> z#|lGNeqpop1HqyBpM~e`YL$(S`b?yFXgqgkELKEuLe^zu_A at J<!_bZ?J3A=OfzEzx
> z?$g)OKUNMcei5kC38eahJG0<qrr`_iqi36T71en^$?VJ}vaLN<gq*1yZ_XPG2b|c_
> zklV})xy)SNA3mVhdB4c)%$8ERol*{X20PhEu-A>@C5g<`TGQjcNhTS-5f46C&Aw+x
> zt^FM8`U|)@ckgJl!c};y-*CzvYwE<3EcaCFt9kNOB00%dU2-Rq2mvLm+JlUHE1m;3
> ziO}`f7eo%qMv9E2i+1Gv>wAXFl4?q;@HL?AJ+fCROXP}^VI<Sj;d+n*O&BC@%Uo8$
> zY$E(%>x1{#l`6k8-SF%v-Jw*IUL^CjAF6e&B_HtRAXy{Q1-)jxN8KeD;<;~Fbt5ek
> zNfBd>o)g)S^u-lzk1gfvzqaB$mBxe71;|&|ip{y-HgFbg*>`GO!1p($Mkd%6E7RiD
> z>ReT=MnSp=gOsI8RLB-9Ki$tXt0%k2M{)xeJ2tX~oQy4%h#$}lb%_#lVW2sWxFtF1
> z)>wILv*m4by6A&X{?X{?_iA}Z?<Tqk(CXwHL*?+Y7+L|D)Qoj<Y^m5NGqWR at 6Z@&z
> zKw6nRSw)>i*0Zd at YFFNS@&?es>hXC4aE8g-1|GjU`|(z0?k(&c=rwT@?S9({{3A|Y
> zc&g{U<*9zJzcac?a at OJ&mEq3+zw~y+P#YcAIGp-Yu|x$=){;voZQQ31GF=0w$Jw8}
> z at f&;z&z02LV~m##ee17ZAL9rA;}};W{oXV5rNM&(k6YvSePi75`+#k-3OzP!#IQgr
> zH~wYBPFDQWh at m|nc<j`Ooh)G$$&5IO!<)6w9las4k1_tp8n3s2RW8O$!?)kwa`&%t
> zUt8R9>(*<xdXPL7iuC`?S?yiI;{?`@b at A4lWbjyEK-n7O@MKkZ!!2huXXDYi#27I&
> zj&54WN*r8AbhPB)b3hUT*l#VRwtVHJ#_83wv~Ov36+&|u17#r<Z;6cqde7dz2w&Lb
> zw_kIv)Qf;Pa|FJCFPhl<Ip#>=1&nc(i}eq*x at OP2V~#pf*3zNxdWkj<$Ce2_aVB*4
> zZ2d|247-utFP@@*1$IM|+hXv0`~sJr2s!1x*pP6o2A*IHTA53BJF~m<)C}T9VnL74
> zv#GT*vl7 at b(}Dqor}u`NSU3U|oFQkd$o%runzdHQQ^12}Jk?k0+0N~Hu0(CBerREg
> zR_1kz9<W<`OD{k!IaN;+PjY{9`j4?XPUBkq$~SQRj1{?cQg3u?qCGx at Q7WQOYxQDF
> zMNhhgX6=|8QVFk-E>NW<7`|wuEi4wCdh7#%71ne1RPxpTR6_SrW{x%v`}f=57ODm-
> z4PthAZS1>EO#*{rLDL?6!NN?pt!h^BPIhq;-evhpg|$ZVy;Uo7|1R+W2Ioar at J+^X
> zXzf&lnp1cswTn^^>f{<Lw*EGOuK`t at 7Eq(g0-l0NrZ*l;jFMG<;tl>5@`rX at R<T(U
> z$~3chnk`QUkiedp&fnt5kx*8`gOxS&*8fNDj1M8#PIl6J*`d&bvF+9vOzW5oon6~N
> zoUE<FYht0g!C5^P57lqrq3W(DH)zMC*pet#N<^egd?V$}b$Q3c=nMNtM!WZq4lMU#
> zt)g`qIZgs*^i1!QtY>E+1rv!-cmFuQy5QRA25cm<#0F(R?|1msxA1Y0<MQ7^t&Z-P
> z7#Ob7zzd7~$ri8RZupFe(Ju~U;%RHA)ay{fj~-xM$om#I!t;6ro%_cga`m|b7phEJ
> z174&(BNij3**_92sI-TS5&zPr0;^5qY10^5fVTX)k5b3w8?EE9zxB(gEZnEROPiHD
> zBcRgoQ*;%+reaSW at S1tADO!S;%zuT<EbAO;?b0hFSo#A=6p$Hy2TGE6UFkipzF|F{
> z-Xdwe>3|M?>VT~DNxQK%j=hd$%slW<^0sdak94(L8!sz!KskM?Q1`Lg+{l|tRaL-e
> z%h-j))1FBTbw>00*JvrnOV704`sP2q(fV(1pjEm4N#5Xisn2 at jsegLot$%xi(YgLU
> z-r#sC+yw3TbfEN<uc27)wDolF>2o%$G`z at c@b_m-=R}TMKC)j}Gc79<x)m!T{4U`+
> zy7!mKJjI^cKPJ|`KZALCbpP<^i37u<3s{q{$Xr!#45(y&%7VtJ^kSrqnb8IP<Egs_
> z8yjeRO1gyB3+8t+HubDvY#nUY8fKp(S-p%AZr?wKFR?54PvR?E_s>WB*Q7Oe%s at +5
> z<#eb*<x^F<o6!_{hW)$Pt1F>lgV2n$!cQyaeZ3X->8W=mx<;_VaKxJbPyu&H_L`ZO
> zbR6zFH}y26u{+BA$@SRBpDvd_R4(wfazw<}Yxx?K2z|iQR6PEnB&(W;4%W2<%C9?8
> zK6DM2uXh{X%G>ntd!xV<<V3_n_ST0NuZV{}?j2FT+NR85O;_u9Ww3{;z%toGUu at J@
> z!M#r)hwy5~vch!Muf`h5SG}O4YME0fOHemF`+6twc92?iqz}F~^xg&9jQ<JoX4-(U
> z8135NJ}9z at Z{}4lwycw!SSh`OC+yYTj=p?iW$fFZ%kQ539>&<KGA=<4A$&aR^?3WH
> zx4#lw+L}uJU83U at 67ha2`<A}y<eJcT#m+Wzv2}Wzo}Tx^UsP?*AX1feb^eB3RjY at m
> zS3lNqPW69l4}t at gZcv)&W at F#p0Iu&iuS$)u12wWcSQGFz-R!8U=z^w)bX&BNHPY9H
> zCmC{*Tt=EBeuOektkXyC<Zi!=1iQ4m{qRtq(cp`Zl=N9V38LM4C%w58|II>6x9nAy
> ztcY*7^}3 at kaQ{5ueSYjI&ZeM=_QEYS)`RLfTf`e4bkJT^BRXhp5uPZIay3jwN2`u*
> z|ByJd!HL8I?-rT^D)nG+f;m6B{kIA0>X13hpM3JCp-=EJ?DngoCuMy$DBZbyjqZsx
> zH(X4P+cmm3`fx;!KGVME&+;DdpWph`N;3<j)WY|Nu5~kWF)<<r=ZZw5{;AYmn`$lf
> ztKr`XHuL*EW_K<tXHvs<B<qjTW^W4a?$7MZXz&^7v2(Fkr}pJ**5mDooy~aSR(pt|
> ztBNj0ms!M>*T{$Faf3l-Yb!Mm-Xq^u3dyVsD~;J)X-VXrLnBQNPqFE2MOG)+*+_@`
> zf9il+AchMLNqY|J%VkMB@&(Ql*=G#0hWkRzPITJDBWMiO;x!)N at 4rH2BI95m#VO~5
> z`o35{D7uFj-ej>PR7ZnlcTs^?4|!my*N*k0rKvYZL@%!|WX6<1KDUuBe1LMz%=#+`
> z^@p!c$aly^&9nN_%rD at T(QsIHlW;C~?u<@A|Es=#er)_QrE<W&nKka`jw2ZYrz2ZX
> zDn3|g%mn6)0s^H)yBnI+is%>nGt3I0U0L+R{!y}04vaOk1n)fjU&j1cGm;YbqSjD(
> z;*0@!66{~gMOTl_`WIqV0H$^?dP-pAz*hsoM1^(zmf(^7w6o78>vMmaSpn3mh(5Bv
> z+$@!vw at xy$hid+``WsL{<^JSd at 5O?QDc|UylK5|-2?oZpgC-Kshq!q*?Bbx$mr4Eg
> zF5%P!|AieuoPsb<uF+q!OWXIS*TaYXc3!=&NrlxP$C^d>jZZPskS#BcRPuXHWJ=i4
> zFEJD54bAy^zf$;*`5NrT*s!f1S(QNZ^P0_J^_(}@kTu)-W!H}Vm1F3Q1~o&UEuOQc
> zi#dXtI&osBs<->dEMq{y-1Q at 3A}8;9I9h2S2e at lXw6cF{Y>un~k#PVE=1G*~=M%A{
> z at Y-vje4>Ae-rkQb(%|3V3g_}S8_SW^nujb&FA)JXcf(62G3YnEVx42p;Xn4od(jH0
> z#VTNYqeP<$hh;VSaxDASi}8W#5SdE!cIi#@3gEXTU16`?wKoqt*0ad&^+~<giH{F8
> zjBEc8dxu$Q;owKj*}Jo%=XPwWSMKiRrS9%$H$9sz?Ywt#y~sB13K at It{f4wp<p4#9
> zLkg5xtxaX`O?Eo<Gq6CZ=(=3I|Co+!q&9BL4t2E^+4|4IQ=D8IaVAD4MhzItytyj*
> z0MVM#X^TJ-m(-}?Nx)cKWIC3ww5e4qRqk?!B7=;@oqxlx3NIYcrGCo0>zcH5s4(Q=
> zV7|;)bM*EDZYdXP5-<Lt2yxBTuOSmo`6kZ9cb6D+d1urW8R-rA#uT9QPdl{A_8=5f
> z at lV7)Ao)8W^3_Vb$5$$aF6vzUI`QQz-Y7hKO?z;@K#uC4cg&^LmW|cSW^MMP*k6g2
> zCXm~JTIwFCjR&9h2qvLMBQlTo?|3>KefY4AD7_e at O6=*(sBS!6)qcj$s*u?&Xt<gT
> z7C!MYj_qPJiy{R;z6I>{IrJ_|Y+2Y3T5QVGRg`#voIBJ|@-Ful4$kSi6v<K*Pt at 4w
> z_<H96(IuJlSs`t^BYN;iO9K6AKxs3r$dK81bx-RdrYQDPGtCLmkQD)sZ<<*KL_qeB
> zMUn?h(yX$<BF!qp94nBQ*?t6QGs4VOWA!w0pXcakM91G_dK=b&^;O9|Xk;@iSajNk
> zTOhOOR?7mk=?QDk8oKeCqaF$5PS*h^vrQbrR~(C#Ek0PRKQ8u_;g+zfQ%#xHxgLFF
> zaB-(2++w<R+Bma^^&u!W`n8s at I~-zU#KP!IBzRbVGSaQo&cZw3ea#tmAF%A}Pp(H&
> zOuf<?Y!#%`E$qfqBLx2%JxDBdpjvXm|LajI`46L%b!wCt73`^o4KOPC)`-=nMy&kv
> z|1?Uads3qmec0M*i#sb~Ct2g at ov`CpdRl7D8&l09znZrgDsaLO73hN&o#^mI7sMi9
> zfljDO;PLTigdQEd(I|*6Fw<kJEa>P2#*@o6dOJ`YPUg<{<s9y72IFA^q8jnwYZlBF
> zPA1&CQ)VU?sAkQ}PL-OCkZ-5{3bd(B4Hg at Yoy<+xMj87~<|dvChDrbDxk*Wdl77bb
> zAq$5Tr}koW{cke_&;6G8ygv0IK0m4n??9z45IsIIG%Q`qfX(7InuP~A96Zfwr0duY
> z`PDbuz!d62!3Z|-k%^5E%=&d~I+RKJqf<D;f)vOCSv6Sy_>;Gf8G`EP3myR0Pk}~L
> z|MS0Ai3#vj?FWEaM?G*-Cl0uI4o*+LV-~(<=SiMl%?&aWIcT0|M_;V-X01U!jDLj7
> z)nA5X<O0UEmYsNG2eAx-x#XYo$&oli1%^{yq-L`Rz~O3v|5!(l6(Kmc9gk)E&4Z!#
> z^NDk_06)b?@#<&CZ7hwwDQzbs_1s`Z<1Dq(EDSZro(xS)6cQ;f*Z5M^>$A~%&5kV`
> z>d}Qj_4(!;WGiVY*@~L2w}c+YDnHq~G}33*MlWaYXEk}(9V6Q^oV?~<g;t9wwR5mH
> zoX~Zle79 at 4Q0^ijicA8ZP(M}xv$cA?Ao>?*v8thOEwwc11^UI{+XB48utMJuvG7%d
> zco4~Ti$t2EFF-GPu}E_Ci$%gLk{o at 3NOHJVKrP#mU_`7_a?rGi<(t>a(R-2P=q3Iz
> zvGM|5a@=}7u1%BC%NF9jd8_}}rjdpxRgQ>FlFc_rn=Y&ORaMtdFDnBV60;1rhc- at P
> z!3-FBXU(>Ce;z6`yK43$Dy2c|`Caef_UTp5M?AY7e!H!W77|4<Suo%uE5}{y{@i}J
> zYS9moYg%>B+t_JkGCW3&9a6hwbzS%8Q(0Z*4l=}VORki4e-3KFGW}rHH+3?t*j8zC
> zY|gIB1oKwSY5%b5>}QF&(epd2ZQVV4`l`0g3%!*LZG3Opk5zKVULsyFeiJ5Eu3D53
> zz0*b0C3^5hGtfF$Z{3b9!PT*KgI_#TrOkNuw&?G*y2(!M1syrO)ygV-2kJ(Gl^TDM
> ze82mh-uIduYIHZ6?~Na6zf^fIUt^A3=1?b$H+Nh|tgZ3~?d^`nwB&0$CLFT$?))U9
> zFJn^;9tHOH%q!wH)rTA$?3VEodA$d^1-A|~hq{+FXQ`m3Jrr{99#i?!*oeNTX5Z2s
> zhhn`%1Go6 at xqfv^E`sS=D~DNKuSY8+!$GlAq2AF#zm_};W*^#Kn?Yoen-rMO(_b#n
> zkWbmobhzQ#nlVdvRC({U-k_x20N>m^N$SLlbB9%5UaCIcvGwa(-NY=$H%}2^qH3bP
> zN~_;2(#q}uW&y9KZyXJF`D1r%yS=B9=wB0%6P`(~g8eDqvz(fmk{bT_S5rQH$JppE
> zkiS<9Wu&(aybM>7gMIR}gnRi)4Qo}-ffp}cRJXF)le{N(2fJBv7}y5CD?UoGJ2=Z7
> zc*62mdZMOsEN!---LVxb8|g%6*mBy+$${u-L*i{|Re=y9zlhyoX~Z1M92=FDk at yqC
> zN#F3Bg&uOYS6f$J>&gp{<Fu}c7Q<5?*M?lfQ*v!nTR-2ES?T^+8x}pt{Oro4<xcCF
> zTUqUOTkXZS at quZdmGxP1Mg}@XHX^M*xt)E94`~OhPA{!->pt<((uwoyI}<5|*X9rj
> z(cr)`N0zF&Yw3<<lFevLVzkVTMhv#6{W6!)wn!<E;Y`{vW^4OyyeNNCi}#c7=`+pY
> z{^a;Qk%V9UuQ&1~-hArnO4b0rr>YrGK5D5dXticu-l=i~6<lXYjr%8>&`3jd=CMn1
> zLgcW-0_K>dGg0G?hNNX`+~2{s?#kkyXq at -?)oQO_ty&XuCvtSwa3T|VhArWVUZ*vW
> zbcWIrj-ZbSKx!O5H_Ewu)>kUzl07uud1^I at r{q0<s$T=+`cbP-+wzDz at pEir|4U-k
> zaJ-aJ8qe{f#83Hc65UVQwa{n|Agcz)<k;?#m at plaY5jtloS!J;OrEOtxyGEzxj(6`
> zyyPd#tIvO~Ix%wjj1DC*b$4m(jDW{ImN`;oO&zx(dnURR)+Dvoom;;C*3hn>)RJ62
> z!?4~CeawzMDBls-NDY6I>$t0{KH;uhMLeHoo2y@<qAWq%qS6W)A58XFXFs2Be8q2`
> zaa3Bqe5mCT8ENnZX at BKheSGC@w3L#IwPakYv)ij3%gdI}h^u5;<t5u!48gZa+Kfj+
> zTHUY^@@_Eh_7yd&^z!P_&q32!z2Kf+F0HA_*?wj9=;!mIvyl at _w^ke9(EjJi5c_AV
> zcI%@~Fz4b$_i9fxdHnX=Td_!8&fcE1sgy`ZUoHq~$DZMDy%UV*=(=oKU2Zbu(y!6Z
> zk$qp;PE at hYShL+6yCZ0|Be*0qHuiAHryr~bT-4O)6YI$?t@)fe?OS$bYURXvd}&u&
> zRq5UKT~4jcb7|Wl$pVul@)*G@<>aA$PV~a8YCkcblvd=l at 2%f`)+&e1YgF;uA6c-B
> zUjqv$9ZV05H6pY5)eJOD9mIyWRaQF!E5H(u_fF)#ZV<PsgNW_6GOm2qRW4Too$c0D
> zCRc at AA={uN6ud2a#Zi4GF(9x^)5po^>ZRB)6BVr^7k=3VBp}uTzw at mYx}2g>869t_
> zR|;iBf4Y?K&xt*Z#nzKiJTue{^_ctkZ8dl<U5!0sY(v+1#(>3_H5+;Cb|1OmOE;8(
> zoyYCa0zRiNQBYGX-&Frq at AcrXU<{+w*wdxFJA7d4?C4w8H<!diElIIi<Etf!k5?6B
> z8GDB<D^Nyf;j)!k*pm24iFG(;ciInsg1*_cLqP*NK6LjN;!jN^mc+~Ka5S>xo{Z#I
> zx+h)?2C$ucz{sLE^R4>tq)*H#*R_dN$EWr?nO|q(N`VXevbo!Am5O7l<dQaUr`jy#
> zX+_{#ZM=LvRYr6IoNbPWqUV_|&UR352 at t0^_Ap=nrjgYzI&A#1=?9Woxz7l?fhVh|
> zEq at hIFp?{<(8!7&l6p5_m1<8*<V%bC?TL#hmCiiAWsu3uYGqo&FRk2tx|OzTWvr}c
> z9!B at K7K}qi)L&xtp at Tl8C(fv>m{`55(E489KfYwkiaueLq6eXj)Ep<Ku5zgENC{u<
> zHh`F{$c*Z78ZpN7{CLZe&@NBnN)zv?=y|FBgfjW+J%MZS^hvFyF^t1 at snynO%_6+0
> zUK%|Q%dH?apB>4jW|wi%sZx&Vd^?+`H^!#IF-j&YA0shNM#4r6H+`7({S3~Et?%a~
> zN==DDy2NTZz2|)KP+M}%+Il6cODm_Ia%zBrriNU4 at Q)gZHl(f|%+i!+SWEJ2b*;7P
> zvOMV-ePxbh-Kju{Hd at x)ZX%jlH5T)|j$JP7;#&GkOjqnJ>x}5zGQ0gYIZBVse9Bp?
> z&E`8jLt{=owfw1;So?6C1tZxTwA2UZmdmjepYoQiNVWRE2t8(`#~oidqtBV>Wc&9=
> z4x2?okYz4XaV?H#)#igp?z-c|GT7W*>3(iU1bHlXJ`q at 1c}c3~{rHqDYV#j!ed3>@
> zO}T4w7PTFAMrWI8__5le&Ei!>7EangFJ$z_MFfT*SL#r#yh7&27kjr&W=B^1CCEKe
> z<4*+si{{clInMUm`o8kpdcj#s*ZPmOT}ezapG9>y3w1v5=1>oyx%2X%x!*)K3MNE0
> z_Axw=25*^la(b|AsMG{))(@QG>D%)zbTbz1Rhvg-1lHPeXr08EL)Y!D4%x`4sY=MG
> zX{NoGdFm?GDkCnK)SMhxYflTS=&a=mdge>4r{TG7=-#Oe_i}GY?bL}I;ap{%4ZTyy
> z^WUeQx1D}2XG714(@Kj)ciD!#$w#Y4(IWD9ST^HJ;J*$SX%=UA0Q&ce at ZVm&DSTtd
> z_>uGb<qx(Jzx46GvNvw1Z&p`_SCLw6&E{jt&=4jpM{E9PZKd}E$uV~dkLcIDdPA4C
> zb^Gb-Rj)GtP#WaPttto0mb?o6A^y;Q+wpg6a)KN2bbBT`8)*x1nivE07tAD-xI`9)
> zPg8 at 7;eY2snO})E+;+kqY({Q+EVvfVo at l{cjrMg!(e|p>m(Thi)xK)kW<9yjp%d||
> zz7{0^<WD7vj9|F4pr9?TL7lhT-}sOsmUY*8_GX1-B1<Pi at mym59B5y1sJ!x$rFTSs
> zbLy?$qUE!mP!dgoIPZ5DuA26xcf{UGMXy|Xhfs8ydbpUl!IjHr{c@<>x&v0My8~tc
> zvG5L5E?#=a(1 at M2eAcg1Gz=?g-2qwuOYdMty~}5r>L0B>_3c!P;l>UsrE82zbx&F^
> zzK8DFNZ)q}*R3D)AN#`(x4qD_gzOr*Q2q0l9}B%(HK9#uhf_8*S)LJ|xsyFuLSTiN
> z=2wm{(H-1?B(VeS!MuH6a_5hlL%E5Qbvx%hLbIo=Gld%xZPJ6-l)x1)*ngJDN01J?
> zunQr(6Tdk`m?oOXq3+%y(P}`gHWLwiLhMN-8}Q}&kNwH+dyKJ(()#Jiq)->;@OqJ_
> z%#C<N=0$w{IGU1NWLeO)WC8t(I;;1jGrDe}z?1hF32gT=cV`gK(O2)Ah5s9CZmkuE
> zDh(}XsnEOP-5_!Z-DscR=u$;!J|8`hr>AYN75UdE?ZnX--Jv0KoE!ZCGJ`Cv&E^k0
> z9=)9RDu^0eJT?-YaLC?Q&{o!M>-CDXS|on4X5O0nA^E}sB|az;G)H7!v82g|2Og)l
> z!#36u1!Y*Lr>0VGCVsSiBN;F45&;_y62IoOdVJ49Z}Rlrhv(yOptY~9LB1c at o^&^1
> zg}Y2w$t`Dne4R$_&5Z}Or<7Cs{;MM;aw&Vhj~#lMF&2yGF-WUKgEFJ0UEk|hSvS+F
> z1xD^(fp!ZU?P?8u&!Sg3Ap@>92P}8P-VCBZA{~^sEWTzh{xG7$n-OtgZ!`8Yd*3M5
> z_?;iQnAK5exQeOwY|dvy-<BC}cZ8ZhwD&g;&Kukl^$AZuYa%(OHju|^)zUkwf8H at l
> z>>eFwP-C4@)<j%0(HK>EH`oK-3}>KZ^Kh-WL_=nj9j(NMZ1w>!G$lOHHxEWKrPar0
> z5&yEC7PI<;)uCOQo6^YDV^iSdGpcU0+pXMbP4DGfqn)eoNuaHYkhg87E3^w7{0Q8R
> z!#Kg&{nhJI(rfgHNT)>-r7zbzj|3$y01(b4bP7>+QrPY?Ykd$$h^&#CKl$;!Tff>f
> zjutI2#-KaPXSBUm6wIuEC%rgfzLYLw&3XsgzLaieB;GxJCj~Ew$T`sIR~ZSBq!-L#
> zeRK}g1$~Eu`Yy2`(kE?q;K8se6ii%)U7urM7x{q~ZX&~N&!>GAiEkO at UFXNXY!}Mb
> zM|R#Z(G8p2_;)$5TCn$f<H&XyA9AmDOg<(O#Ja9pG|7|2Ga_WilX`|;&$pj9i`!?i
> z>cIk;E3stm(A~)P;j4yy+4E_<r8h0&j<&;Doy(oSCa%XT>tP at H<$Rg+mVCRSSt6c>
> zvjI=z#5EBl$%$*@EqGQbpUbjWE+!&LT~M?7q;GfVlch&rw6HhN{r5frKQ1)Jk)gw<
> zJP%&j{=lx$|G)ZFM|NQ86Efk9<HC=M4GjJA(}xW`pXxsP<&I!oXx)MS7+fO#h_^I!
> z5KqRXfoY4<(aAg=Ny*AT|JNS1pRp;AEQdr|lYQ2;ZCfppH=&`I3(V{Hc5SmyS0%gh
> z4_(>k_~B)yv#B(6=!X}sIK2Lrc7NZ974h}A^bYH2*;H>9Jp6+z4m%I^I@&KZT}`DY
> z#<Z2S`=wlOnw08ucC>7)f3}7A*(IWf*Sm?ZUaIek-fdLavE_$fcD7w(+BaO2&lP?j
> zC9&^fH*p2l|92XxsFrtH@%)et=r4hv?i5+&5G<Uk&A=Dy+yNuh**={p^VdV?<Hf4`
> z6Ugzlz7V)J{j1n{#=N1Z*l(lBf2YmXO=S2}r5&l#J}GVf-EW)nG%+-6Q?|6ZjZqTS
> zJ at zMP$<fw31?|&g^Ns8$H9VX%qZ3nKa}fJfa!e*AQ}qjGAJm1Rd}_|JQgsr3$HVUN
> z4HEP3R0O<%W;CrTb{V?(PO|~*v)nv8cva`v`pw`5BXkhi+Ic}uBy8-)oE?+fFX_xk
> zoMjMENIiTgUE5qeQd{}zNRh1t)~3hsi6jTtu0L6ClY?UH+dap7N0Vu6`sq3f6Qhhg
> zrwebIA~iv>1aqGLWbGDzyZ_K6Z8Okzs6O-K-7kwp%|N&O5{WvQd^AD?b;-Y-p5U%P
> z7Y*ogn{Pb%E}$*jXa!^CY)ji}=;_R-1L|((d(Lfh!K{XI;tQ_q=%Snxi5TI63M|Ka
> zve}Iep0epYpUvoujpFT}H_RM%dIr6`Q{qf#xBugLT52|j$BE#Hq*o-k12EUoyCd1^
> zD3J)_wlup#l{BgEJ=l}BjM(uh&kwPx2$tGcv#y%;5~btswq2hGME2^l{l^Zld(q~U
> zG`6TL$#Qq7r_b at D*I9{sw!YBwYceyV?M?18h&aIUZHp%876~a|*7Q#7qlxX at F{b+Z
> zNt&5nebFTCLpQi^4Dr4)Cuz{eS3+e%pH=SmRm9#6+S;<BUovXw3w$%$Y_Yz|9$#5l
> zA>qE(aD%4`CIO9;zehTMo<Q(*cgnt{e;yO>dXD{8jN1WrOYvg6w~6>xJ2vJX$lcMm
> z^$+hM6SXLVsrK2y>+FlzXBs%LN4(U!8e(rRQ+5?OXj=6dUFI<>SI>uG75U(^G-TOF
> zQWVqu166784QGhWu_vc`M0ItwicY{Ywt#Fk6|wiCS4Mwlx||NYLY1n=NA(Yite{}u
> z_oEZ~Yj at hJh!4Y8-?3VIrr6X-9D1QDdL7uEWLcEO0B_IRdptVbIObffGPVwc9Y+3p
> zd2l`(8!pjuINsNAG5p^p`Uc`-xjEk3aH-1GEA>ph0T_4H8_-C}x5#_y4!7{_Tf+|f
> zW<1E8_J{EM>1K4Um+uo<>$`YFeA8-+EAYdc#U}a+peH(>!N+)SxjbnqTzBGd&`4`?
> zo+yQ;bhJKhR;J!)a-L)z^|87qJsA0t-ycPeL}RT#1~ZLb at x}U^`<zY7PCj6!EnT+$
> zW_YS~b!2#a)uFww7yR0Vl5 at 6L!Vb;JH2pfQZZ<TxRkOQZ*;kYA!EHKLYzcj=&d{BD
> zwmxY^sj}<W`jeY8jSRWg7X!I(2;0bZ<tN_n)B1fiFX<a<dh~m1cIz7(f2^EPAf=2Q
> z8mz(ZvBoaZ+di`I5x)6W_?Q&`cDe9x$mQB3_pR_YOYyhejE)_v7iG)Xwiw-zYm);U
> zAR0Mn+z8TJiCd>{w_*{Boxxlq6DozMlU+zK$L`U)8<rVqCi49Io{D^7=F0xtlNG~a
> z4*Qob(}CYx39-;hqN}h>oiIdkY>&PtyH%{`_NJj at nwyFlvVWM+lVJ98^iyzR#3Lsn
> z4YUgO^<7t3nI#7{I;|*wRrvn!wzM4ofwbO{tk|>gA9((h|A4oAM7hV~QDPwwYo^@8
> zVE1&<G+JlQ5LqZJN?vpu=!=j;me+gjmX3eMB(YcvH0ypMf&_aDh!QfjXK$}3&}^TL
> zH9c}98 at jeYGxoR5+63Z-%o^xONiNis6-Pa`-t at p#s$3)@YGU9zV%K(v6)0DwRveHq
> zqH))T3*Vtv^lN5Tl$alc?Cz24P#t<}xxXZKgls5oAAI!#C#|!$#P5qJ@~2uk8M>#u
> z>s%<*@<5X|cf}E1GC?+>?|-V-9cZ#~*FN5?3p9D>2AX`c1Is-N%rUX4`_Ec&BxIvE
> z===gpRcT<kKEoVt*{N3I|1?#4a$thcZr{4r91qQZ57q)3B6%VEZX&@TVYlxtG7IE+
> z;J?ixT6nf!-T4Z6NIl5LxO>&x=<huC^xgP?_|@$$6RRRTsWt%rutWtTfVq&BCzC&t
> zI~Wa3tC_2B>uM5;dd37Ww^-9nF}$o$S637F#={+N>pIt>+^1NS`!=z=H73ftn{M1%
> z(zCv|tfp~khc+|I_ssIAKl~kjdUiMZgo$mnWREX#q{}&xWnDkq(7xGpb`FA%C)Sk~
> z+72z!N?#qRUq$wqiLwq(PVY<)l?oM{d|#-=Jdc^l`kclt+9tZ;<PPhu at Xpe*3jG?q
> z4yTF4TdZ(^?wgT7KN^8AW0q``DA%uhRRL*k+Uai0S64zcU!_*-wc8dD&(*o<?>%_?
> zv>tps`?cI<-_?`hyucE-hZ&qJT5;aGxS>vW{HC};Q;tZ%9;j<9$$lM6Vpmo|DVcR_
> z@`?Ili{68c>l@~Xt<U29gLA%iRiS;iE0#n)p~pt-$qhTP5_2<$ws2^t+8GS%Vi9hp
> zzxP3?GpxeI!Lsgnq8mb`n}}TAN3 at l(d%9}F4_V{=C>8>DBO`5A*u3=bAL{)SY~Qh<
> z8!#GgNxll#@rwbQ<clF5pG3@@%o@)YeMUwG7$WD2xSHPUj6PAwxn&_b8N0n%qInX1
> ze(F8q`Det4fqiVVfu0IVK+066$}rcp%<+zYn`5nwEVn~*tjQd2C~I$Hj*+bs%J`q>
> zSR?0TR<AdebuV{ymCa@|h<k~Zye*D5A-~sJ7Tp at _fb1gHI(SR8DKhItzli>lxF6C!
> zO`AU6IkaM at wtvVPs6|6?s`WFZ^(h at p@o+{!xrkIp4awxq*6#*pwh<`Z7dvCy**)X>
> zTxjJF3#AQjpI9;s-{lF3+bi8IO)?r-BQozbT%{tT0yF#2gp~D;hzth~N8ymX(O*J4
> zUWw%$ZTsqoaYDz|6dR;Tp_S$+T2e~ew}h at Xi&@3xLPJ=0?z2k&3G8BB7w4m2o^Cor
> z&CGB!GnOsAiasarbTw&pj!@+#!9G^>)R0S?b-y$EnYHQ-WPdm5o5BCJ&whtY*u0k*
> zIkY~eL6v9AerET<NkCV8PvDopcc`TCAv?e2AxHF;*cp~oW44SMZLMJ>rIm8NXQ-}9
> z>Z<EH7y1HzkFU)UtdP0_w<F(PcV|yJIqu*M;RYxrZ(nsHb_N<%b=5A at bNWqm)K|Tx
> z8y!xf_+-|MS?}zC?z{5<@`4lccJKsW&#}hld;{#s2ouw4s5QD!Oj2{<Upu~Q)d>G(
> zT>}H1XPjzvaR<_p$vm$Gb3ST$5YSUge#bA?>trsHeG=+Cl(JkO at gFSLfs-;u<PZWs
> zs5!C|{K?Lri^oyQnjMJqE>RBcJ01SPYsu!)F=rVvXk!V!p69SiCNt(gOku`*B2~j$
> zZFm!^uH40{T#d0^rLN+4jIEI4RSN6+PmM{U!(4s`>vLV0DA0C+L3apkki_nX^IKTM
> zk1_HmIKPR^D;jpEK=OO84cm;guEy8}DcSXBqh3>CI~>~z>#d~$Z_}a`as9&HOk_q<
> z=lKDzHb3C?W^;aSz^j)9yqhNmysPC|ojH at 5(WF^5pG7;sCCoz+-h1qWV39c;DrbcC
> zHRy#J_h+Nb0`83W4<38dC<{Bf8comZj@{76ezozCF&tV|u<MrSJgA9GS#KutzDsX1
> zoMA`oJEkK{4g<lqCf8!$iSIKWMwZ;JnYa^TPc#4PlDj`VN82QRsZFd+u&=5>vR^2+
> zRqZFDmoI)8X605Ltz9!#Hmi}Dcyc9**VQ9vKQLNgb)rDOrt4h#dIdDeFz3~JZeq#S
> z7s)%4w&JM$=3cAkEmsV!d~!$VmS?KD_>tS$J6P63tIQ#jilZq#lC^IhRKVP!vQ=WO
> ziiIn&yq7-IHepMHlz*@syYmY93VS)c^+f~hWMQxQsd{5m#R?hx5Jz@!dHdK%hKXPA
> z-3_$oxU{FwZGKtp&@Shi8NkQr09MT(u-4|H=Z?cS%@fOj*sV}>!r#365BXu(K@?GY
> zpU0x}UH)V5{3>D(uMgWJ!(NxzqHo8(IE2P%>^sC!_*I*|TdZhaW~NIFM|6g152ti)
> zQ^K~Lj={56Y}Rd+#rn&grPV97!0s_CjygXk2j$BD9<%iYcnR0imCi$)9fbD=(r);B
> z*oIA!i?~MT0I#2xm7~A3_+~6U%YYYS at M3sr&nTqbBf>U&vnu&|ZTh6swXwUYYwyt8
> zw}_o+s9WDdzwS0hGny|&Mo`CaIF5g*gUnPzErN2FI-Zf0s=rjX1}`X8ov8)5dU>Y}
> z-g7p7axaA)+7rzlxY60syMw;4O<Ot98NFM3s3N2}*E=<BlvA^>#{YC^=FZpVJP!ZB
> zD!d<CwMX{D0f&jm84iZ+NS4bDa?Bv%?K88&j-A~3>?&D%SdRV8^7DHp9*mRof{{i#
> z+|ayk3Ap<Li+Xu7h at QNYxRxrD-H-__pNhapL?iW>WI+n7^%2#aj4D4T4$WRN-ESa{
> z$;sC<8y-^l6X at GT+8n)sC^rsulSnH+8y~9U{93W{{mTK)kl_RiIj#sxH2b+g^0}eK
> zK#EIW%lL~soPjlHx-rh2PO0L^@xXGVZRhaqB?5ySa02f5&{x=ViBS<3_Aj~c!=Hrl
> zE8$LokuX0Bto3|m{wbWr>f{YuX4m;0&N@|+$+^UkE5`Plp3zhIJvc&V$Zrm_`YJtm
> zIdUA!(TVcRI8Ga}e~V5y at OSelu{)iiv$3dHl9G7?i3)j++$mbA&DidVJr~`u#o4X~
> z_Y8jU>Zu)eM*D}c1(xq5aR;Em8==ulg+_Ok^*n9S=wqPK7nzHCp6#pc`QN@`yw_^X
> zf<Tj=Pst!OdQ)?DplNkxV0qI_GYw1osaWq%4lLh1g`NyE#8SM=vb^gGG-W{ZZ^lCX
> zcRv$bKP1kc%_Z<vWQ?o6 at qaf(pQvlr*L2JyYf&~Mk4=yM=!f>`-$P at cohPfJf0jV7
> z?^Fw9vnX}y5J`;>z2)(5r(`EJjrzMyO~|72i!-!*rL{T9bDItA3|(c>0r;0g_cTOr
> zMPgkN-5XjYS&*S+htVRBuQ2-XD(r(gUCfMF9%l7>!ESt)U$L3Atb3`+hCeiZ;{Ifh
> zTe#WiN7i};)<W+L6C4Lmk9DAD0vKa_^!5&$IT|+%ED-EtxI2owBfwK12?T%i*Lc^@
> zTil#X?#1d%&F;Do>MFhKing?-mAM0hqVW{{VimF}#;G%n+Gj(f1A(LW3qK(6j3|9`
> zkW`iKM4Rj-8hx}f`U_(?77rzP!=kInr?_Qre)P|;NQA(%LX9tJT`Ryg4?!t4$Zmyq
> zdDP0Z1 at 8uB;RGTB+oG4V(lf+v{q)`G+<o}p?+WKCUR=7z!2i&q^pwno;OkR%@7%`<
> z_{BfUZ{uNE<BfL3Op2U5x<I^5tnr_~sC0!ityDqri49QJx1$mvaiK&!Nt_eC9QaZu
> zmdj#2l(U()ZkN$U?r at Z6Sg$4)k*h-d27otG=fBUM-xhtr@;Q?hXcEiO(x#r3k~aKP
> zYszU&`{~x;DUvnuAFc7L%->n<8GpJxOXQ3A&a+Arlm4IDAv9O2|46axps|avel2A6
> zd08pg<Y+mTy>(`6COUghom!G!r!?jxCG{9s$-F-+I*$~mkhP==o5L;s!@<gzf at i*x
> z-g91WMvuRD1hL(`SjPy}vWs2o)AIwq&D_!C&Q3D}*<Mk5WBZcEeD#Z+*j4EDLEq~_
> zQ+h>m(yHxuU?r@@ZA9rhs<t2nENmacxIOSjrj at shTm;Xd=cDCP-`a3`_&$!Th2StW
> zR;!VWtX-Wsgb~j9l@|{A5YMj`Sc`_RD4dSRMnPb$8!3tt3!{weUuEg{43%GEQ3 at J1
> zW9K0gyhL3raBlyFucXr-5B+jC*{~G0_ZASv3jFous-5XaY=%qxjW^Yq_Kmeig7DY{
> zaT^-m9D3|tRm#{-)Zr#1N7|Q-5$q8*I`Hgo-fq*UsBy}&NA at S*&osse)Wpb?Z))}T
> zJ7c~fPRfd6SSfhzldcuy_u9>f6u^s?R%hQgO`zO;)3~o}yA5|ZJ)qJv0?geIb+;SJ
> zWd3$L(lIT%xbQLEfdsN*`+EQ2mqBFs$2Pp$wW7b`*>l*hD!3b~WPYi&(5khN9;)@Z
> zR-HgRJy&YkZjUYo3jFn->XInG!uR{p=6h);QMxU-_iji%JJZTIbW?Q3v$NRMwa-L|
> zdW246>)+pY`j18Yz}RDv*|Bx)b&Z88&yr;j^`S!xEkur$#o0ps>Nw9abFdK1*q06u
> zv4B5KIPhSW31mNc!9LGnn=028(ZrKSE;ZA{$3(8VdIiqv(bJwKY2sV*{uUtRfAlSp
> zb at G0T<y(?WifzG=Z%Gz&h{lewjMf}(S=Ou;rhFz6M3dIWW5-t8D_$kzhrCKAm}6O?
> zW6+Ehnm%h+m5BU6c9t>R%)`RL^4_sDYUm81rpb~lyBb+nttl2Ea;CBWFHJOH-4gdJ
> zcMTZ_lIe4Hj2&1{JG9uF%bN9tDeo56_C>mnmP|d}k}|6$%09-NLQB}`zA^B^;uTqh
> z7o^Mbl=PaT at pvIOyX6I$V-|}P&@RwKIX0eZg9#rA-QhXaI@*-2`*bL$JvRaOX_ at P=
> zyw{8*u-P4GZnE%%><`ah7_;@K{3>2?L?3DLqQk!g+ehEd7V=Q$q<mb$mM;a?hxT2T
> zH^nQq!A-mHrU2H&JI94vcDi?lh#5Y=rXqM|XBxWVJmm{+@%n-f3FZtL at J|wHffyR$
> z)=(#Yb6;W$3odZ3hvHMNC$Iyu2^W)G6>c?=0EOK<!QUqe;8Y~OfmhGn<XYBoPjba-
> zWlK1F(n4hW^e6KcVs#y=@&<+LnX?$GzKOrV;!r2vpTBNxu70CqPROQhepdMte>~on
> zz9NopPjWTBYh)uw(##Bg$y_P?jh-2O#h)Z$l0z*NiJ**5@;jC<j<Wqc`b)tmMq#I;
> zeKt9hh$SL>&-U%;<(AEwW)$ryw74XsT4rvYcYpf7lnhvyGu`YP+KJ~`5h~6WyLYrO
> z7QTKRTcTw?J>FQRek8dNfQeh-K#MI7lxPXw3*bJvYnx?e!h7Otu$jBfa%Zw|hwzCW
> zms`$w^S_`u<;iIHI61;icEH!=$vIh6g9TtD{4h7%WM&Gdy4fvPtv|K;J9y-7!(~CN
> zSB&Y{N=^c{&axoeCg_y<fKTFps(nH;;XCN&JWB27M4 at Za=lcf-R&W&x`0_-WRL0Yn
> zPkmYafl(Vga;X9I10KE-adx1mGn=I4PLVXJTdOGlX6jpeb7Dko)0^vN;ER$MWGrlM
> z-ufk&<`+_PNHjzD^1X77KY7KzEw3j7PV7nK2G!WgtAE5qiKv-2`M(5-rW^}Zp$a>|
> z1L^GQqRy0Nyog*<m4S&FVDx)l1L_UNw}Oit9ruLFRH+hu&_!Socu~d<zFj<U?!7LO
> z6}BTMn+6oG;7O5j*uvhtXL>Ad3of0KgYlb<zY5J3n*wf~6!4~{3-{h}kJKF91B^U&
> z;9JHq>hiejtyn+B(I1#K(ape$iM{wDi*Cf6Yqj|65`}50+E4sgYKv{`*g{?78Vi!Q
> z{L9FdK+PnR*QnKu-kRh}M)840d-5Bip))d_O=`ztTjl1B8RCl;D$~y~yF_Boe$L-j
> z7QNh`{P0pkycbVPGNA3+{mDPR&2fm*>b_rmO#kv1@#pHlH+nnyEFE}aWb>C3Tea9{
> zQ}1UA^h*OzIo$%8zCy2g{BAJLkWW__+YUGK35oh<Q?EFHL%IJBhjzN6k7#(m at 3Q>u
> zfI at fgvWIm`c2u%6<!y)518j7r;qGb#7e6Et6x#HfF-+i%{ak at Jj&GUXuyd%y7NL5D
> z?<C5lZ)a<meV_P1u9G^@M+rqG7}mS6ClAUgCEwP8+-a=C2)xGmtc+K&Fp)j+I8tLd
> z{!H{g9Jia(fx2>b88dk$awLyWuGpQjlhrr)+Xm*A^R4VcIX;B+MUD?jdoPeo&i7-1
> zp;Ts_x;2w;-W|@671jR}o>=sB<DisWS^#&tmX)HG=5V%#d&#4V(ZkC#SH!au8J68G
> zQOCmfh3{qjhYht6&Q||`dIQ3hGyX!WE%U1t-{4-8yuG5BJLg&Tjp1x at IK!{*{w1xr
> ztK))I%!N>r<j<^%Rsg3nPf?!BysxSUCky?FZf=rApE*P4!H1rUhVRio`d(4H#yDrF
> zoK2<eOMZA+VV(lFg&Cjpbm|}cd<7CYFu+N>e697n@*Dh#nPz?aJJ!7$!x{ax(YwGg
> zo5)B${@HVw<x<v at Pw&<{$*?LGRpZTJLpDsA614~GzUkH3 at RV0}q=~OqI_=h_T!nCw
> zUv2`MH9+&O9g3^J!iuY3(DP1jCR(&<_#sRsKE`$1<`BuZA~7z|>_wN>M4W$fvBWA+
> z_4r$61e!N%R!sc`=;0g*uUTd3&KB^@aXNbb+{JdNi)J;G at vMbbniE1lKQI`*9Bk<X
> z&bc<FL&MInEQX5AX;K1-5OmM64U+SD5FYbOV5SDowDiG_JD^))jMlM-T;^xY;ywI<
> z%LadJiuK#6H*W-MWyroA1XEe^NJsQ?ba`&}x*d8KdmA)z6OqwP-aVW+FwT0!ItTFE
> z>lzJqosA#gI5gh%5(NpUHDnEl5ciDO)-Ip_*qczs+ZT!EVgFmYfsGz^Snx&J;tdS!
> zuzZ7wn_1yc{^qIOh5yNKSoYm-zMrD)`nL;h65YHhC#Ba-VM%7!CjQFlnLRc#O!@XW
> z1FP**%`<!1-}Gv+NEZ#{fXPpxw(aP0kd8*&VX at 9mL)z<%R!S*awAl3Z5=*CUWfOh|
> z!LxVcH#zk5Y at VKN=6&sH{nwt>^HlPoh~`Y7!@E#XZ$-o>`+36=CYD;*vQL95ZVHdK
> z;_}dc?3pvLotuo*ags!^cy5QqvnhD>D}&99`IOzRvPCNY6XGBRdzL+;CwF_w9#Z+2
> zY)K|pY$2|wJy=nB+oF5lON-7(?2+iatekhWIe2uZ#XTWypF?6<A{*Hj>Ijr1or{~W
> zG8}gCO`3PRhv32A*EEka at leX@Ro{kOJPpmeD^bB7U$$Fvkxc<+{0SQzC`s~J1Bd;p
> ziL6YvXY_6(clYuR;7M00GPCmqOWU!l;r9<Gd}aeX;%4d+YH1_2T at M7ZeOMAfVpU%W
> zkHt8F_wsAFk~=-lUY_XVps+5X-1j5c;_1Fv=|5uD*H=>8Ff#p!_VEF~?c;A5e>WE*
> z*>mrf40ThDGgD>jH+vNF(-HNWjhI33f@}L9<oUFAhdC@*(Sa^Suk0$NSIgKp%6^aa
> z`@Q8`bUjo?>8mvG?7rS;`yQ8XmOd?Z5c}eVNu*%Wb)wImTi%jv$EWIykk|=ZBUZ^;
> zo??uqb>ed{<?&t78A!0FSoV9iBes?#oGCG*zIq4iqJv7QDUrX?!*cMV?PE{mGkGV1
> zkDI=&I+v(WmM%#mLmA^)N!Uu!Mrc*MOs8N2Ifd3wL(+;ZgWq=GW?HT3J}7alC}O2x
> z@{SYJLq3j=H9nNQgX4Dwnpug at 6L&=<HIE{xaqv6Gx_YexZ%m>K%z9n1a+g5&{W4Oh
> zcbmh*SSqBSfEPUuj}5QA*@<m#PB`6&i=-&hZ~pZSPhfTWv8FXieZ?Bx#!TNYHP*R^
> z#^K;My~ox&R(O5lAdZwZ6v-;Xrp71&PE72!_2!jbr1Ce~4rD`BEc8RGaeu0K(yA$)
> zlF at 7`rSt23>rQT~#e%DLYof1)6+CWlR$bBl^u5Gd)8E_cDJxI~-M+po?5(`EwA59v
> zea{qpERDzn`r<_9uw9KHv-wlV2#cf3fT1?IDjTQrH~7c^H2zR68uSbE3sk<Dv8gtn
> z`=;B at w>R0a at W_uYi_S8ghW$NvXe?`0a>qQ?@g3r<ms0a)tr*L`{AD&hjTqabD=(?9
> zREx+9=!&jmm5dkfH#1+#5vR;{s8DA6&=fO$X9j-e!aX^$yt4iFEQ!^^oPW1wOz_X}
> zmkzPu7`PHRNBoSADUEj98TrjB-&!}*^n>VCiRnyEqA|{K3b{KLLHV?_0M1}QEJ}jS
> z>c?tg<9C%OA1`hFnNS^jWiRcTiiBcvY+)i{`Iu?jg}2%gL_hpNw~?N39Lng$O8?+~
> z4Vhx}%f?-5Bep3n-QMJVU{Krcw9C#sY-7({Mx1OnGddmVu?KiN1x-wbb-e^SW)@WT
> zulV9aDc_D8c33$nNArBLF#@?uX0%!EG?I-2h(D!kS-b5)+tx)JGNcbuiYM2QxrH-o
> zxk~D_YCVcw(-bs>%dlpCn3B`lZQ4 at 3y56UjY?@Y+^ITZ+g>AhaS}41}=}-r<r?vSP
> zsRGkqv+ucZU|6z<+yP6Byi^_SHmOD4Pk4C8t+JzkCIa^r=1jgf4N73irtCVyxuzv4
> ztCZ(Cd`CafXikWYZ_kO0knjKVm+PTop_OxF)i&7m`CG3i290Ls^5^MqBKl2}8k91`
> z__<WMXj#5FqU@;3M`}H}@t8_GctM|JYM*o<*NKnZp^QE!^N?ra&n&C(E$61k$$mRo
> zp0SQIS?T#3Y*-z5kl#xtXsO4V->rGkzr+?K++CWT-rE-`B4k;su>y_Tb+RJKAucfH
> z+ZKE|d*Gl!yb)P>F=9$!f8r!+-6G3gK=9Y7kn#FoU+;Up_x0%OG3+I;2!9^CBP^2J
> zQXo*t>pd2=Z~*COad3O5*xrAu&4=~<w>Z15P4v9iv6iVRh$Jw$-6-CP2CUO@$kvO_
> zY^RMgytA>?P~lM6LFB*|!?n|;DSenkYo^WvR-J3CI at eI=Emobk4AmK?&IAA7>g>21
> z2BLP^banDgJQ6(_oE-~Hx4BdHVFu7aEsCUJmzfn^5WRR4{x_mw*_M79BWtbWSfM{s
> zcy;&GRaWRP^b)g6|0Nz0bM;>wx at yOjz3$~RbnT at pv3bhaCFefQYfUF--j}Y_JMm%=
> z3Ja_MV2rvYA8V8vm$NeL3L6DIJ0cRBs93az98$95E}{vP27ML{)7Ruo4qCZEW=W}#
> zk2<`9AzY8dMzc1Y*jXa$)6<B7rd;(VUhGIxlGd~A=(XfLA+v69Aa=_RHxgpcOOnrb
> zsI>EWOM-VhGyB30H(s+kS+5^bA`^K*tO(?8RO5}2@@@m~ia%tqPrl&RCCjYUYDXen
> zo;RI-4g^XjzYml%#44InF`)p0Q6t?vlh#*R?-94vOy4t&*qb?@bS}F_PZICgvu6U=
> zxkJ}wep~lf#)Lg&!qg at 16?BfarNg6b`N1dJj3=G#ABG;=<7WJF)FK at l53yGAdFy?1
> zuw*i`f}fdx;P20SoUP-qNd8l6xxU9d01as{&Olt at zv)X%ti*#cvFDP^JB+XNkh`H~
> zu`aEd8~mHGU at v+{?*7f3vx`^~`XX5~2aZ9#)ymr1_M7$tJu9()@g)zF2R(gTYtJI$
> zC#qa{SnsE%$GUcL{eL)n_qeF){D1s?&YZb$A1(r384v+Y5mJ+q at Gu}cMmic9v1XWN
> zZCP1XTkSs9_rSr>2rud2)@ozku#3@#gl%gF^MY2^?smF-S~jGjVWwKpijj!<K3`|h
> zYCqraAHSbIhI7vQywCgoe!XA!7gm<l@{61w)=zTJ>rSf=_eyS#FVE_;Y=BnGX}!L0
> zvFdMwPn=1*y at BXjPMB`+IgEZVcq5{SEOB{1EIMVx=oGp?4UJDRBdi5){DsCfmcsZ-
> z3-*++rn914kappOmd)>5YC7K)yHo3T%bBXBd-t;r8i}RQ^MnM~A}_}HF8-TxTpYk|
> z<mI}x^5Qon`TTK7?pN{S_|<|M^QB^>Cxz^l;Stz-3L3OL{JKtN&^0Ygz>FkCy(mM=
> z5Ihv)GSUYGR&!X7*Q&sNr|2TVup(%~KH_^~Si*9jf2!wq;9C(6+6m7pq$dLzAJ)%I
> z at ZJk6vW#J;!a%zfI=8I*@vBt$neGHG{8d>455lrPS%@Vq7Rd^Jv8mT!XXO at 6_gF`k
> z1cui%E4?*5fVXCPTV_Etb8w{~+oty!y|5dXK=)|yCy27b_1r#SEBMMd3Vv7V>l;GP
> zViRboN&czWBhV_NokCxW_&T(sXiZ^7frAprgsjdKc!}QISO9T4%b85r?4O`-cK?Fs
> zg7;BgnkCA=AdaoqVEusliRy=AHvL+o at 9B>N3VQcepP?;9;fjb6h98BlC*-+`6f}QV
> zjg?@)N<h>*pZg^6SXTH8JeIuS+Gb32e?r!p&@Lze<+qundKEdr$)M;a9kUJZ%CNV?
> zv8s!^$9YXZPSH$k3oFLjf?sx|+IMTA=pAIELLOxMext9{ueFi+vww-ldTxgVRV1&B
> zee=(nPle#d*SuT1Mu%x%E1f52^cu=A5^Am^XpB=q54fUn4*z6l6798UZ33+k(ENoo
> zVit^S0MW%r=Sw($DTSNi8HNF50|qQG4V{q?-wly#PSSg at qN_UyJH89Ewg*^vmrkE;
> z1`oslolfWz3=vHF8vJw9N!{O{HUcw{&}vdGXRW|0!j5WcWQPr!q6Al<1v!J at zAgm~
> z^<j{!HxE{VFXqE))af#;ETeM`?6eK|o5$OLftTS7d(>6gQFapRs3lWrQ}$_ysNi|D
> zIrEIEK22$B$>jUB_+3i(_1<vV%CBw7bl>#F_#O+m)sJeUx+P^#kEBh+ch9-iYoqYp
> z<AoO4QfQf=gnS0*`*1QMXU(&MdwllGX7jS%buMo-GqOT?bB2`v>>ZKKh^R at Yzh?sJ
> zKZC;PM0tC)kICwRtd8D>ZtLy|(sCZ|LTuubhK>xS4P)~SS#%KG1793I!F^9QG(o1Y
> znIvO_OH^3Cy1rFSia<J;^bS`EmZ6>6T=aPo!O71M)9Cl#QVs3k5<p*cgsv~T5U|cr
> z>|sF(ary|e230u at nC~Q<#-w96*&A6FU(4FeC{bRuww9sPRKUFXD0gDZ#I_`f at mMuM
> z*N1uvTn$)>>C&ZZkl#j<-G(OJSFoj_i7W`wgKys>j|Mh1POrtta#-Fai0MB*49l*7
> z6&!iaC!duxF87fCkQaMZ@<?DkX(L{m=z#SI6SEMl4y|pEI~7as&RQITb)=*Jj+yW?
> z1C1Hn&B9$8&a*Hj1$X1MA6+H9n`eM(&*0_q46CKS(6_(4P|p3ELM08ohqH{g8%hcp
> zlULYC!=9jPfovZ+0xhC*l!1#9&V at E(X(hn|wwGvbfjC at D4Qn$&{%clb=rO?0jBpsK
> zl}e|J(-^xl3;tatx$eMh{rI`fn~#3EN>}l#PtE{NYXyXj1x6O>xzZWWEGWg$9tBFk
> zC at o>qhZ)>NnuURB)>olrJDS=K%b&3TV}Qh_krj<5#N*R*q)|<j3$t&2Ppm1aI~Pc9
> z2y9AyGF3Z{GZ(W!)+M`@OLf+P&(~$Mq6IzhB1&aA`hN?22UGxj6}OWH!=$#H1cnHD
> zyQseIQtuckhef at WgeSS{Hqv+Acw2&vMJFKj^k~dzQP+6jIe|QI8fy#b4OaSW&Di}L
> zFZ}tf3no}8C4VZQRA?{kBb-v5h%XBzD~sx0?TwT0)q+fx^laGD^XrCsET;`9CyK at u
> z{KyDsVPEY2J^VxwqzjdC0u(@010t;J^EE at qwz)bRF%7z~lT?hB)C3Jl=_w{5Uhc4_
> zCaiAy at 5I`=q^SwN#TV2_X9D&Dotm_MzSAP{_igwRDuQ<iL~sqlr!2+hf(8d9(jCR1
> z><Wi#%|VnTXtGL0=$|~;hF;mQR^s5h6K9COND~8Fevy0XFY-dyTd}zywF!FpC4KQd
> zv_1-=tEAFO*`TP>gIqdkC|$wfCp>TuVUjdccl?oNid$JRFC>^q{=4)MxGJPc4O$iy
> zCb%AjuH~*YNAO%kdm^|Rs_&=l5|_W;)$PL7=S!`3EwwX2wqFZ;0_*)szmupH$Om at _
> zMjAJM+PQ}y1jZ+p!w%Ke3u`9C?Y?6rcDktVw5xTf^9uCafddY=;!597a<M*IJBCLK
> z=b|_bQI?<ARN at G$k-V)A+SY>6Uj$on+PmA8Ds2SkXdzBxv`pw0aOXp-a_fbTo8;bW
> zC3)^vv=c4#5XPl_4KG_5X^bAQ%3&?*8n%`d5>`W_g1NH~w`k^YG<y%cKkdzfwLHA|
> zj$6E!d~d<WCXM(XG2$!W$NpRN)zo}a8-VTnp#K86iuC>u1%Gt)UVbmpdr0j)umY<D
> ze&~X?uS59$AvOgbdtue(ztBDbaac16gF`RJ?|!VbjE^OYw-ZJd#|yy^AKCq{p4jqf
> z;F>*q!i+RKv-3jP4w*}6Ca(q#ZD`)7ebM}t_JM92R!F=C#HYB&vrg$eoKbMdHCTE(
> zL#%rEfscg028-uGZmP?wgU$LKqZ$JI^x=tG?<x2`aSf<3I^2!KK8s$E#7x!v^{Cpk
> zBTp(e+Le&fSJuejP`UUS?khNoo^0onr800LuqXbWPVIg#;zSq&KEc1N4+k$?swsrk
> z^OxvDeEBp9eK-{c900oBywG=Mt3{UM|GOU at XpL6U2+A%O`bIiDDky*+zQApV<U=mN
> z3LEL=!^%5HVms=rx$A-z$zuipF>b-=W99u_a*DwKot_=LKsAR>s!85UeF}5tu<6Z3
> zwP`Km6<Z^$PKROG48X9M%P=fehhbwXY$j7#F6=1t1T$K(H!rmod;)@OfHX0HW;Q^x
> zv`f$oP$>r10p|aLW+?R+(CkaBsOZIeX+1&jqnx5R!M+NAeRJ@)$v21a(r3Q~hP9Al
> zTH<#aI_77JS=2V)TD<8gUK4d^aV1+=-{!u*;fabng7C}pY)`G(YDE;xaqF5K{kQ)S
> zyuS~$-a!v)sdNPYn#B=~8?n_H3s+Yl5~8n$9lo6`HVY0R66lTWx)XV&5Ac~-S?LvW
> za2j}18JNQi$R{R?h$kk-AqrZW*U$!j8>hLo$+;3D&#T65TjW$Jv3;aq;OSkP<=bST
> z#{e5t3DcV2u%YX;H<B&pBe4rd2FA*{+a-BkEMOx}*AhfZ6Sk#xS>R;|SesQsRKshO
> z+pv};{=(tAwH9^*zANJC{tE2mC3ri%8WHehJvIbkxe)V#H>c})!Rp=0_#FK1NB`eH
> z1nEEv<Pm4!r4s!IhvQKXu%Vr;J#~gwZ;2kmDr#@58+TWi!_cL5dnhgX;nr=TG;vbv
> zQ=v4=vDU4jyQuWmEupv4^R1ghckHg#O`$uZt+hUsFJ?#UlcBq?xYoMRUF83?J`u`?
> zm{=P_Y33H<qhJkm0V|rTd<H6Ip6>+Bu;;qrYw3Vhf4*K}oV*}hm$$}6I`^e{mAFpv
> zT(8*ja#>g%q|dhVkez1WmkB8MIDYE~J;zMYg_e}bc5AHw at 9LmXU4<SyS6ykY6%r?n
> zMlsxDs23p>gPxVH8*oFDp~K;MfV8eW)AToxwi}AsgE%|SHU!=?ixM-ogp<cPZ36Bk
> zF`lgu$Ft0*3x~=)(|tYAoWwgZfk7j<F4fmlz6Mn0JHXb>JhNjl#p~mpVmbp?)*k<L
> z#I`N|(JkR92eIZ_!jR6y5u6<}BWB~}mbY9H$Z%iOrc$}UO}c;w-QkwniOcyAuExPG
> z=L%K<Jbnecb8jw{vv)>I_}(?m4$;VgnYy=ti!3RTM6I+$h;vX!8Hc5pZml}0I!OMu
> z2pa(8?CL7^rVQGidE!sK^4hIQpV#z^s+DVx!Lv$#SFcxmFMgY&R at i8eE3HZJKOMPo
> zd~KneYMt2yY{+Z!Uj=U+gtHU0$I0b4!bS$NCPgLd?Jm_j;Qw?-uA9Mr+oIcVo5UOV
> z%Du+-C4!pTx6NjCaQLL)_*TL^$y%|Zx=OHHPy#T*YjGV at 8%AZgD%ELwq5lC%tdS>n
> z6k<L{xIE&6>{H*3+b=d;loAm2*F^91F^5hOpKG^%9pNACE at UQX&|8FvW~h_^%gbeP
> zvfz^JRxW%#SAHmeR96PPUyPFX at c4#T{Pn&Xtqpjl6bB_*M8xZqZINLG1yzwssyoRS
> z%!{pMLos<mEzU{ViZ|I+kt92IC&|DF-LQF7#{z3j&cF7Et6*HW)O}k|LaB|%XD4<q
> zX^R1`Q355Eq#2RNB3l7dbRYTzxpn)`N;<a{z{RS_j=A|!!)1s)bAVeHXJ>RTIR^ax
> zNEJ#e^N;q`;9gO>R7h!#Y;p`;h=7%4)RE1&Gm(8bW at 1VA64{XOTEm^CWhx{f-OF98
> zYR$gyW#bOS^#+$ceA)Lr-D{SOJRW<f?#boa1!^fI;Zl8?dmf}>wpz?q-LZxy$e7c6
> zJ_ZCTbjjpR;DQSpGXLP6kc1AMKa2V}>JIf;>`5#2z^@YZdF<z at UX#rBCIuB&YC}{0
> zlq1Tq;r5<?^-_D!AF4IG!O2ByC7xto&ek?Gb)8;f=J0bdcw4WlWwtAgi+w`#t*)Z)
> zs=lvgZ*s_QgQaS5nUNb*iL}{*D|$t=WCOhOKquyWO|8kz$U~2OoX5*Ni^)HXG4+gA
> z)Me<0H%T_6w|o{?BcGe+&5#XQ4Ayh$-c&cBXfUxo(uugMvWLfOeTdVT)Y;SUS8t3a
> z)pa#o)H+b3Q4McS;S&+<nl!;4g_I;^unV+ASM57E3*H};daL`C^EDUNfA at IHn|+4!
> z(govprti(9nGk#$ez~j`-3oTv)Z&~~tG+W3-(yfwqeLs)*%k&&q`5>)wbsQ9$4Mke
> zb|+V1k-dhWb5*$vu5{P!z3ZVvng|cRQbm>o?VyymVdv3ai&@p8Dr}aB3Y%5JZuHVl
> z0$(2T%>k*m3OIW7$z<d{)dea#rM)MvR_Ih0To4QJ)g#u(lM((;>5Xk{k8$`-g`yU}
> z&w?_nJ$+|-YryYwIZf+=z17{;gdm3<cW`L-*&18Hp>7F&-u!(c*7)&0^MW{GOP>K6
> zP6g%tb)94x<$Jgz#tZZz(%{99{uhX$>!rUd#b#ho3oZx`GQ at 9OAPQ?1Y!&XseL1v$
> zB3Y-{RpAxF=~)^9xe#D0xNNEf84;Vn7W<z$|D=C(Z#|yjZ7htJTkGbzQ}S$_AvY|t
> zkisJ8xo^#55~~$^H|gbq3-nn-A9M%Zk*cXT#y40e_SN at p>WiY9&d1113G+?sl4T)(
> zbnm9#7<mF`T_o>HL5;U`$zH=oib;mjp0<2mDI4Dy?e77QvBLJI9X9y0;a5OKKO&o%
> z8~WM;e8R9DxJu}k$js;uJkjBLPD)~P^!^wmGn*r3vK^t`h)L|3-ui709^JR8uNHiv
> z|MXc at LtR=Q+JabwW at r>ZN7)Li>)uTjJ52ERAR78NQHk18S`)Qt=Y`I~1?Ptb;hh34
> zVW*lIbVtZi_896EaXm_&cZNt4=LmR2ulc4h#-=qb*e3LDYI>4KH at ydr$}R0_%q$@8
> z8?{!5#+Sy+t(DN)O#d_6w$SLKy?6B1pN|q___$x6L>O;;2|vVD%*vebWe5#9-8Z$l
> zHwIE!gJQar!x8-VS<Hy!jzoKx{X8eyO)OdncSj?2CE~5}1!=4jEne1|k5hGc?hzNy
> z?*Ei_f&UsVs|)oL<9e)*#PhW{Gjiag>Bi>q=Plrmk8rht$CKP{p|`$=F4W?rwq3A@
> zsr*w!g55%A$Awzz(*^hs6Yob}tS#AEJF_m$T?cO~O5dhqM&Go$wBGu at O%?C!T9EIa
> zjO&f5!(2dP`w=k;>jkGf;2(U)x$fu^WcJ3W-c8>}oiLF7Pp`1(tT4R}(IlMvSRJAr
> zujn<YvAss<8!zN}a*iZn$LITOz7OCBDVsc}(y9GjRM!S?_=V{2W1u%3m9U9NC%nl4
> zoA{ml1-_v#O15oIYQMIkT{QMa_eE*fRjh%H{~APnctkMC*3C1!CwY%ov`ZIyqq{15
> zjD68v<GpEG+|xzhJ at Ng<3mf`sL-XHfK`dO`g|P3#zl-pGi&NVB^v(b896i0g(WN=-
> zPHSIp3oB&Sn-+`@K2 at QLQNO6$EHi6TcLL&4ukVdM9|Miq<IwBl+CLX;{ps(J<rOjy
> zo9Xf_*z?mF(uYT6ZWp+3%izms9wf690cVE>j&W7yz|`Tvx#MrD0a0EptAI&S8p($J
> zJxbfW;7>15X+DRdHY0!q8-bL)rQL7N2+a$4t~tO8ZTw5fTtDcm=Eqz`u9cubN5Q+=
> z2fnhhIe>Kbu~Ko)x1dS3HHSvtXOpMbNwQtnoCnXYDi#qWp4`^#D=X#ezN}#<N4uML
> zEs~c at B4~rS?8K^AS&-sX<Iqh7xUUgjOW|RC27VWRf*%0ac(m#TJhqk at QI|YcB79%R
> z&9Z;4h0YS_+c1T>3SG~+Zr{EevUF91HyQaUNZ0?#jCOT(gf_N at S9~mt7ALSQ#Z*@~
> zq-=B4+1*>*j-fI at LCIIiZOo|eTSVd(qC=RGUHv*@I2F2mwSaH65i%me_>Jmx9v*n9
> zJr|l&(31IahM2+)U#0m5-Htfi^+Y+-gTYSVsk+op=md_S*yv5eTQ{EILF{=$r`a3P
> zaD?ho(gzTgh;QI;_)FT2ifUi6g9RqnA8WXveGNOe$*4ng;@c*db2c|Rg!N<9G<F}S
> zH7}Mu#Dlde^1kZxcbdFWY&I8_blDL3 at W28pJFt!)K&fWRE5j!Wq!C*vx7GviLE~|H
> zrPZpC?bzvr10FgRE8;qER<Z~RBVOM(&J`|LjS7*T2QVVH`?&uZVDxdo6b168!D2}Y
> zv$F~q!iPA`MSj}%4RS|=pDNHgYj}l5OEc<N?0bqTuT5vv|ISlhM_ at AbSDgcV=@l&i
> ztQI||-e}j5Uz>q@)r;^69Drvfj8$lq2dZe?D35QNTcGsXuzKK#>4^<4w@|32v(A5c
> zQ_z;*De2Vrfl}~-H$Z-l5m4jxdU}V)yHp=<N=J0*hF7{y_k2fOe|cK^M-8uF&BWsU
> zWRA1MpBu1po<J)k<Yf)~Wk?v_2QKk(ctYGtK;{`jblHj+aPOkvJ#~0}B9~l3(e~im
> z<lNwL|Gh3m2d=S!F|$@&LmHkP%eG&%dsavIjSUyU=gS=KVQhC7S9_v%UEQhn7 at mE-
> z;T2j}(3Fuv<3QhG&(9TSbAvzEWux(Ecop+LA&`K+L^y8`4rxDx^6*uZLreVCQ!Ko%
> z$16<98n}+%4f~tt5beE0{g3l@%+;%%r+WJ2Vv2N4SQqy5)bguh8FBMKO`jXABuNOo
> zO8wq<qZrFRMKtuyJRY-clw#RP&49n7{2jp90reZ+sm+w%N at or2o$q+9a(sFct%Cs@
> z57+D6pwEaYG$X}LL5$kv8fT<2dCt=qIUWK0*`}z_31|3fm9n1iZs<j8_3tX~G=0yz
> z6_ae>ACVu+OWzmg+<2qzd5|<9p^F3lt>C(C|C;@;c=~o<sqDteYDdKQn4nQ%hprqv
> zcOdr?w$rV6&U^0ffi;wELUx92eC?bs>^))b&wvH3iDWt^)TxEJZ*_l`w?<-l)<{-+
> zuJ((DKwz9aoyQ-@(fgEErtqM1I>^W^kc2DnH#Qx66!-g^K2P%|?(a)@kF&rcv|@7U
> z=5-ecuR{MEq~j4Pq1|hJiiv~gtku9cUS)>Cb2T#U&Cg|T2B7?PE}J?|-<zYER7E(E
> z#h)xC at Jkqx#OH|392gP5&Oh2E`;$9>wf)Z<?cuBTLBM8q0{`=UuYFu2yYAYb^Lb at Y
> zCPQsCl{J?AO|tZ7)+zUl+uuhpSh4NS-TeSXY`FLl^rd1xp9IYosS&$gHl`Cj1YiEt
> zQdcFodm{Ps)IP%+v0-&T!&Ok30rW8&_*Yj$KuPTYM=ubjj}Y|Tz<DZCQU~Tk2dhCW
> zVmq*Fo&${f4)CM_JcAuwf=<m~{($8_!#lS*$~+t`88E35dVq-SqJi&dhmSze2<^ae
> z_G{_cFcpV)#nav&;5qF&byTT=!z$9f<n##9DlD%^PKpD6Ylj*w#`7JZC!wn%&2)!>
> z7X=E_Euf6*x;E`xlK?ntbOH(j(wZGY^_}V at g0$VIdg7^0nI&I!IvRJ+)U1T&m{@Zg
> zB2^e`+rIdFj|3=YsJU%GWw&y(@Aewo$8q3}?Kl>V947yYT3D=D66MW+hNc>vsskz{
> z-f1{T!imxejDRLFRwVAMT&0?J6?V1(0#r4;a&iKEtlkd3+A6V#@8Hj4q(*@|@Qm;F
> z?Z3q+&I_fNE#^ab6Xm-dJZ$@L-WQM}#jW5Cnz8<v_G#Qxyn#)tI`{K#DbGF5P-+7>
> z9BlC1Ks08MDJst>wn3-*K92#Mu`J(%@X=(!55AgQ^RQb+mNOF|^qU34_lq4vKiKeo
> z0(jw%;F_)ohb)J}@bn;EiH`-1q@~4cOtPZBsT`#^>6I<&LD#`5<i6P<y!Rfi<-QY+
> z;0GT-2U;muweHUYVZODkwfVo7XQ7sB%2|}0AG7OU#49Hc9|L8e{Y}Ift&)f{>KZIK
> z`WuUW_pgFO72o;h at Q8w46`i<-;}_<egVPA_v3lsQME6Q3G&3LKR;!W6!dmvnn%js|
> zYi;5TKfx*?6+Cae`4+!#@cUXZLavoIV8!3@^ewYm53^Y7gWOtkYmKeN)R@~iz41!4
> zrZ)kat at xR-LsG4KSQLKI_(h_HEiOOG^5NH0u;1lHG`~lQQ#t$W at Be^td8hR={N3F8
> zZ}d7J<LuG7iMR{<v(8PNRnEXeByJ+o*dd*ph_vXdbZ#Qjz-uIKBJRSk(Yc9~&)d2o
> zlomF<wH9~yBHY&cc<3(bn%4E9yXaoB)1bE&U#ly07xP%FGJIFoT0MMM&{~B%Dmlcb
> zWWHSTE(%zEYhzerL?c<$sa6}a;1@<Sjrn~OzoYp5&1&PTTiOn8v{v%_ at LO~6N&GFr
> zZ!Uh<;Wr<@Qv9yRZytUQeD#JSc>6kdD!2vrt)T6Ou=DT0{cHHO<lik<kOURlYMZl3
> zTP*_GZ|jd%AFVp79Ie4RS=RdaQR1i436=&c*GhGU??&jVOam7%IdH%w(^Yzi8!E*6
> z4fS969|gpN<r1XT{WpGvQ+5JRc5YL;<n&qre(Ag9SZRrS%LY5J9K+J at rLK*ql+GSe
> z`NH3^ZOg_}aw=OwZ)Af-8iY<YW|!)<!`o?kM<KM)2S{QSx0f?*qR3gY)Wi%GRreb<
> zt>hNxKB+5kt2_aE3Qp9sC}BxlI%n=JwW3}ZEZsJ~t=Ldk`o^}FQ=-I~{}0;)z_LVo
> zAAG#!lwR98*KPc*U({xbYv!z_d$1GmG+FYXzBtrZ%!R;2**cjaW at Z<>S4 at CsOxe8!
> zx{DiDt>p$vrP^iV7^cXmv$$4lF^Nc71$i^*$PO9Q;808p^-x9+i})9iLiVqo?-pu1
> zmt9c0Ho_+%we{)Timmq>>Lkd&ZScv^i8xau<TOOp0_OY)xHavNO55RUp*^|d`pe!C
> z;&rcWR^>Q!gqex7?cvV>@~4T2G#LEo_Vy_nNz|tEOv1lEx<ws{Gkc8xaq{QaGom&P
> zn#yqw0k$y~A&b0wfEJn_^6$};Lf$>RW0aFx1ik4JiTdx6=$oEc<rq8 at fA@Yem3HYH
> zaCofr4Kz3+(Vkw(z(;^noJBU9-6zmPl8t-7*X`nMz>n%q!q$56$F*$-pXyjpn+d<7
> zdj>spAGe0?V1u>FHtsCs{wr?)Ms9-rynwX{e<HbG^n%bvtknMIbG^_Ccd&wU<c~^8
> zgC&R1Q304&2o55feLtRo6?MR^B;Kb|t<aE2qdaFNUz$|O7I3mGVb^y2BIoWw25N7;
> z3cbLeJ(rSwJnWVs32_AfewXg;%%DH9;=j|La<Jkz^=t5%vf<~yk;Okr&<adDpF>`u
> zY&kQZG~=91Zutz}h)xf>24V(XWlnBBVWbkqrXyl5<XqGfY9mtMMd24cV2X#I at EtB@
> z$<`eQrBs&KUE(zm&EQ<@n*MP=%B%q<foF`f-loJnm3Sgo*IQskA|Xvs5J3!b%eFqD
> zp$U3kZ&%!zFn}}d7o$fbXQq+7JaXBlUHR14KqX4JP2p at eX9sR}Rk~cftL`?7z=b^V
> z50*Mt#XReeit5}7ite;GIXF$8W93R^?c;gII+nLMk_G4FEs3<$Ew9M426zhShU at Cu
> z9KnL6;M{u$yJ)Pa76r at 0n_^kSgzT&CEa=+f9o?2FUnzw(tgKyrBJ4nU!>uouv*qi8
> z^5PweW;sxf6TLT-68zoE<#jIY9Qwn-J>{g=!q4$zTr3zj=|v9hs^C9hC+wcoSn%+q
> zg9WQ5y)dX^2Gqey3HS!@JPbSm at df)|=)}_u$ZQf0J4*LK7O&#Vza&UpfDCRrG-yoZ
> zgMD5~$d5F3wE-(m9Vl)R$okx04LtO$?*KEfPJb(KHQrRXji at lh%V7DC?Ns?cf!-W2
> zgO|GptAF*a`0H<d=SepZUtJ5T!N8I(eG6aU at MQY(DSRyhb5Dg&<aFMJ7)N8e!u+4e
> zE7(Uph8;5pRVV09_*k|1`U(naY`oeo*RFM2Bs)ul$2t>5OiAeXxiRL2!2Ua%1aL0K
> zcR0S9<Bd}a<=Cu9*yD~k1257%ye-UsuTGa4l(lg-27H~gG6uxKHrhS&)>521dwlI$
> z(Z-b>A9fnN(A$p#`9`@E^I)3<$zog%S8C;xu*l^?eOt1?umZJ<lmn}^jcAaLTlARs
> z(H&(j_#Z%wrF(;QzQeT{_&UGF1}r?q>2WdV8r}=;gb2<Bt1FDdU9;KO11)4T$ytEU
> zfO8B@`2WbJWaflEp_8#aioL_G*F^N04ZEn5-(HYiW7BuiU6Kq5&*2K$B-Jf<f2{AN
> z9|EybA-sBu6|xZVc36chSy(FboxyGr!XcAV;YFu{7uv^j=+G-|;3YT`Y~cA-__YQb
> zV-)*l9&C>)A)Akr at Z9R#@B09L^G(5-px6isR#K!J#3jC$+R-3GejLGXv*$=_rCh|P
> z%RyVPkLwWgA>l&7A8TxZ#TW(n=M2-+&qn(1g)C}<w3d^7F15?*3O{YAv1#)_LucBz
> zOKTfo$>_>)HoLOe2rkKsRg3dDZ<QB6F0n)gN%6ew;6hr-%5vGh1$3m8&P&gvNQq3q
> zxf>@*Jh3~%3+WUz$X#!n%9uGHzQaW=JYfPXvch0b8BTd%w`xi-av>psmtsUR?IRdQ
> zq$ZUM$|PtzU_|T>v9%pHvm&s{4g3w+UTN_?kGod1z>Iik(<VxaNw%jGB at 0<}v5n&N
> z`7Y?aWhO{2_*7kT6mi+lhg@(kX3ir_cV*Z&XRVcUY!+6`-{7500(Sha-^L_Y4*EVh
> zXr^9LAEBE*M85CPN60tet<h#NRoEg(=kyM4vKt!LVv^wV54N0H;o0a%hF{|X>Mn(z
> zLu;D_8XVU(-mKVOcOQ92i|~xxbqq2%=ujI?yOt<2 at EjAqDWTQCMS{x}SrN&S4JBqt
> z2~H+tDbTqfj~k}xfk^1M=Hfk#pjp at H%hJTQ%wN<wwHmq at Vl-NmNd7YXqlTjq8*$PF
> zQo1mrD>&j~`B&qV&njb4PSpaa6A4Z4tnhz;8~GgJ4`ln=BD9FU!!IUR$l&PDlg0-U
> zB!NwZq}tjo^@O4IQO;B$YkzE=a0uK-#5>D^j}81qTd=Ze9xwGK%&3%v*0(*Lt(C7F
> ziN?9IuoIgOJSH!8;fa?E470nqnj+_!Fz%7E{TSwS|23-FSL(3?yG#Wq;To*`<*sy`
> z9fIqaYfr(U8XK at wL&avaaEBC+nkU&u at U>2xD~k*J7uBU6S_Ih@;x&dFl?+->#cPD=
> z_J{tQ-f^>h`xscIvp4)%tVozh>zitqrz1uN)gKjF)#TZYV2LF0XlU-_4?~AkX&au4
> zSU!)~xM6#`ywwVb`eO;?9|_KQf$a^i6J87ljm at jqx90nLTHlaOWBwO3!A$JK{@>V|
> z-(tZp8ZghqK_9~21bg~`4C}n<{Fwc=&1?6+wZB*_V)scaSmM(+yXV1=wz(muVxAyz
> z7i2xWxDvfe+p(5mK4iIewB1 at K*sYs|r*A$q#}RyfKAmOziw-FJ`7`yt!+>7PQFks$
> zG`T^{<$P(MYm3(m*fh~)12=axSxf>JO_6i4H)Q?>&5yn_m}?^Ki4ZKpt~egrdHZMC
> z!HKl5NEe=2|MK66U+}zj5Hk0w=Sk0|Y6n>jRK2a=*Xj4~l2jUL at A{LVmlNgL2{;gU
> z`J^$Bt&${T-sYLY^m7LMN&V|Fbi(5_^{TPOR(2({ZHh6!Qvq?pX`buTy3 at Uql0`F(
> zK2y$rs`{IXWQ$ozqjdi~-+$<xekvbVu`8<i(I=18Lq9nd`g&ua)fufo^9(S;3OvbI
> zDu7D?{OFS(sSOouSy*?1H!KvHl{7lgKeUS84ccd)eQY|;(`CT5rGXeghp%8w{58(r
> zIB5-w$2A+cYy__Hur%q-&KUhAq%QH=c%1bwK?~r;I^y`)K=;1Xa}N8g*LNP;TmRC&
> z)-^p3DGahz at O5B;FalKilT at yf>R&d%{E_f#ktKxt&cp9fnhsec*bH%$d#HU3-ek2R
> zQVDQ$6Qohn>s&L{|6EEuT9qs%ktYj5I>NQsdiaHfEhA|*NF=4LyPP-F4wSmD!jcr<
> zaSQOC7)SqotHB#)PUgCre1!BEoNVwWN6>x}^~WQpHA(8u^iIWB``LJQKyeMN$NdW^
> z-DoXhFKE&>vSxdM(&QYA_}2NY0?ynCzOTVeib3j^pdcflKe>?ZadqO_tzD_xdoHAB
> zEt at bMDH(jOD#ZD<4IF;45HbK$ONyMjZKgGa1Dj~FOXFFAvq*rgaa}&nAKhv~K!in<
> zcF^}V{(d!F2VJQSZyb1A;OATLJR3OSF?ig<%&H5a+x<KLhrVy2?=8Uo7LpT+qUH#+
> zLgRY3*>^qx)@L-<L^1tst7cS;pl}0YC!kE|LqFL^^M(5tVG(Sk2&tjIw at ab>&=^yX
> z1Xyv7{t|23pxfVEnsZu1VZaOT+$Q<{kbt!WSvqL~zodx%)%wbA^DR>?W%111X0%pf
> z#0j5`9OR4<)(~2s@(defi1S8t+}v)#`I);{DwbI%_~@Mg#$;*I>Z__=|K?Q2*|q*G
> zS+{ekmRd{8ig=7{X9`lJ21HV%FJ=2yNqm*v2kw at s)!hp3wSqNdnZ- at 8xoyNcEkzpO
> z8(Le6SjE3Ok;eQ9 at 3XtDJu5LoIPruqfBAmFo#AHcDBufmyW+41k}s!0Mg{%>tPm<V
> zowkM~#eh=5Nd({W_gW0yYmxQE(3z)lT#!-jcW*xPp9GZcJI~^QeNC$G>i$BH3MxYn
> z;Oo5KAwKMdHyHW5m!z~bt3k-Z=-%g!X&+I>xK)i~24Nz_v=t_5k at T1PqnfMNzkXfo
> z%L;ql-TIDuRU7smMiRRVUM-AzPpA4yD;k%XFrHDci;!@JL3bbCoR0z~Tv|UYv~pgX
> zqFX0>AsfM5`kox at gg4UVA-#D>=U at did@4$3E&d95M&$5pX$zq%oye+LC!J*S;Z#X3
> z?zHf`Nh%A!FNqav%(E&yqIuUfup}^4JQAL&uPbPO>N65*XQ}@uJjXeLN8jpo^$Fa9
> z6ZM-ii3j12!{A at 7e=$li`&VlT at GF)Snp0LpCnuc=9XE5rlO%q3xm~~tf}c2W(?M$!
> z9fh+D?T=MshN1KbT(i4#yjI3oC-9NrP%GAEh#ndNz3p$aOJ0t`DugdBSc5F%owQDM
> zYAH!Ey=MxoQP5m%IzD(q2p^>0(ivU-_>sidr&d@^u~<bhZBl(E`B#RfKh~fYZynG7
> zQjk&Y)FSm26@#;4Jm?I}E7DEXPT=HWiYdXs6E!ofpB`!8J>bK@)oW4-_s87C54SV{
> zblkp<`Tw{1)oGF2LVFC{?pK=xmcZe4;;QSh<Ika<4Srb6Rc~w({A&vSSpCE-g9?3B
> z at O@3yn{b6Uh3d_ijco9K5J3obmx<6mInP{91FHhhJX|U9y#c+5M^Rc=O(DhcaP%*`
> z0%P at UJK6Ey16>1AjQ}q^40M+YpGU-*`Mx4qz2JO`t#Q7}9^_&C3P=BPBf at +c*ehl5
> zjiM&F6I7Eu*Ah{8TftS;8)r!>)7xcW59;j#eopNw6PTsl>?e$>&TjozL|Z#jZ0#rP
> zf+Yf;$NF#G<7VwgwMjS^*06=(P(8LixV68_+#|k+*sWM6cVL~2hVS~QjmLHWmB$At
> zcB>IMQV42D{>lDGr4xPoTr~mfL)6gf+K$vy at B}>iEA&GGJP?7auJ%8TGTzk7coR}-
> z8^L9a_Jahw=%fur2?xH0IN(;sXA%U*Po{OQj0e^*LtpXz&pztQsCKpH+1Z1Z*49w|
> z#t6EC`b^eWeiT|mr_QfWp9rM>U(bsY1}R&oZ@!bo45H*G-rV5Zji>{u&{aPQ_#8=m
> zG=HOiQ8j<_)i;~pJp5)0VdB2u;k|yMU at z%s$zgE!5j)H)O+$-A`@;qw3Gnj^47kK~
> zsmF^7##OHzD1(=@Jlri+=75Kghw*gyCc}^WR(&j1V4h#@HMN+1E at im_7I2tcZgr)-
> z9_O3XQPMP5DdH&|_U75L)nnP3)%aM;?AExZ`HueQuEQ#t0tlG0bprZdXpQIdTeIsE
> zx-kPiqOTWeWqL#ud&Q1rrX~a8`}V*?V`)>7ryAZi)3EzbVyB)QENn at +v>$|M%;?I{
> zj+lNN_e=RiWsWZouqu1k)xdb*Gr?$f8iHTztKLhi9{sv&c-41?bc>9mkPa>L>XnqP
> zbheYdc|9xRg1hvS*b{Nt4_E)TY%N!ze=U>m1&yrlyWG(#Y(<uChxZ0iIfv7`2<;Hs
> z;8g;-8H1fG_DZq<i(7T3zE}3>du0;V^?h!I_R5(AtbH&I?C|BQ#y~zCcHZUaujE)S
> z+4LS%SFu|;hSE{rE56^HHv4-)1BUiWOqrG0PDlEaXs0ZTb~AYm;<tuQ?pN{+g at 3Cz
> zE$xl`z1NKUH|xW3|2uFzp*!j6L_~N~wc^gi3cq#11MC(m9a^_$8q0u*ymV+u7?Cv&
> zA#+yy_1gF6g$k?jZy1v<_ky;+x{KS6P_4>x^ggvg)&4^8h33&a?b1%YYv1La8a2Gy
> zMw7SdpLeR3id8iwH0E`d4(Ksd!?)GUi;8i0?;4Al1$d1j(e5b**?{_jsVB4u(t{jo
> z)W8iL-HkmQL0F2uf7|r^+lDCdg4PcXj at awc@vCCm#Z7icaM}&%>0eZ-n6V;YXn>ON
> z78Vc9EDJEFWO&R$o}aGM5|p$GW{37fQ8X~GL at hG(X6S at wre}B;1KjYhR><-Kl%O~Q
> zb9IQu04KE}1Stq3!)|8+d9z!sV^e>DXTK1>H_m2dUqFK+roy^zgbowP-u6o!bNmY5
> zz;;<gj6T!?TT=2c^zf at R27o)W2pgMywz`}XMs^*`VU0^K7~<Uh?*9SD-cXzp<U{XS
> zk-A_8lLqRcQ7;RVi=o*y)C`_L7_$L;&YEe%^(&lcrq|ix)IX+c;0}nP`$rIeBMZ>j
> z#=Mu_|Di-PU3&j0c<rQLh4-65`6T;40OZ at UHEZZ2_Z_HpGoH4hg%n9L_(L?L^(?rM
> zctySn*IfHvzE(1_DQpDWw;vpxB)dC9on6vu6|0{(3Y`D959~N8O<+k!qn(25>Sx^B
> zo3|b(?7tq;RHs1rfBs2uiZgTwu?}>3raghLWjXvSa6zqnYek-9EYIPxCe<&ObL#f`
> z`t0eo>1fr~9gl%GFbVr+O0D3GWt;1S+D!Nq2LFwCZ^MxOZ=#Le2OMHwSu8Uk-UEDJ
> zSqy>shz1ai*|0%oY*fc!ZfpT~>XOJqWMUw$0#1S9D<jW~m~Tmjz_bdMIVE7OU~}hG
> zSZ*R-&L8lrKVt~Qci7==c8qf^tM!+kF+1Z~l~U4S_m|fp$`{=Ydd^t<<&-XtXS1q<
> z9d_)F+#}QQbgeIsB1XdJ#9dfxI)@0@<lX8DJ;#;Ek&g(r*XlV|<IO$llF+x>NLpLQ
> z2yhLmk*)-6ug_`Cg(V9hk|BxKE#Bx~1ma(xMsGk(J?6_p-qm<>Z7um at Sv}~%{asY!
> zM!{`ZU}jm>>#KvWUpbur5k3E1$dj+<ziYUydW~wV-jX>eH<YjXa=vQBqOq_qb-rVz
> zE7fJEd1yBPzIQ4f{^c)a3gA*n6qhU{Q_yL97D{17tQ=5D=i%wLQ=xM$jd(7k;Rc-5
> zfE{WvefZu7`BA%pVYhCDURSW&@TR*5z8<h|U(^iNr`U_wf1MSUWf8KmGR&8QeDDAe
> zw};)?`Z7+Esn9Dl`<@F_{ABPq4%<>zf at AdmztwNB8yNT>h;uHL+t~}l5b}SwTYK-H
> zih$O<Os)U_-ge(}@KJUc_;o6^o1l*hJmJU`rIJ?rq0>q#fXb{R*|gs4bGoy<GIW^>
> z%lkLH=zBI4;~~y6IjsW!&Wr}y^CdJ|lK~y3D20bMi1 at NDLyI~SJ^Us at e^WI4W-^tG
> zJa?ZqGAlG%SG6U8|2Sp;qH-%wK7 at FFlzU*_aPA3|dyub$P7*;lwDZ>gXFGF2`#VGJ
> z+*o$0o!8V`9=q$YyVx1BsRe~AMTTngH6L0OYAMw){4O!{&TmCK!iU?B$a}x;8Rfs+
> zV#{zTX_{5fb=`2gvo(wU>==H|3iX4ijnLVH6ZR|AuS1rG_OhqA!EW6~u!Z*VKZc=8
> zst#So0=kS3Bo9NEq(D5N%MCho!FiCB0oZayAPncg6u_4ohT#i&2Ry8>(;{%br)ZB-
> zWYW-+-(H6_9V+DGMATCQbG0RqrUi%Kw+MSXUt35|K?k^<-(Y9n-PY4E_ at 0El01y8-
> zBYR=7BY2}gMTh1M<Aq$a>c+!&(=6=+{H2o3{-^xqO6s9P)PIkff&KVRmrWZ7-fEZ*
> zf56i~+lFC~mR_+#gtb4OSL-dlr#c9 at BDjlSmuLZ;_@=YaD*;xDdJC_Gqy|0SALiS4
> z2vKbHaxTFl{hQ#H&^OSzeKHUYUh_t(jp{~g6xAAPjW;q>ivPhwVHg*bLw&3c(ingi
> zAE_qzN->Y|xF6M#N_|8ey{87-(68}_3iZh3O98F+0jHo7T*j>ak!BTCxxlh at ntr1D
> z*6wWYgQ0a<_w}W98U0~K&WFh#hW?FFB+3t(;|9fu9*X*tpp}B-K<OrJt|I7nOtYg@
> z$j^nbh?c;_RBbMvB{3IpKm2VoIOE~&3_wd!8#w?EYrjZgnsorav?;f07%*yK1CnMQ
> zelo*8!sK2?HMqmt$3gFp_?*%}CcKX0WEq&L0V6?tgk+-yvp?4=uzkeo!EOpKwz8Y7
> zu^0jFdml1kkxqG?^Sx$Fdcm$5+fPn;#a;$Y``a;!Uo{E!=}TdG<mlgZ1Dnky7xSOv
> z9Nb;5Q{LkN?_}p&LIly+JQ5!Mi#z5*ZXcCU%?h?{FHdDD*6~7&Z;|he^PeoR)#9vn
> zu>=z&I5ww2U>m|-v at 3Str`vf}2VEQZWMvNS;(0(;_cEmX87am3JC75xB|7bqy2qJ-
> z`%98H$UFV9;O^vu8 at oaPkD_nY{wsa?hptq(mf>siyFZTRF7o~gh-lp;@)B at CO2Dm2
> zhNW_%63!?2TKFVbPPBkOZ`mL2>pnzOfloD(7VOYBS_jc#+W!p0c9GvL&xyl{r1LOr
> zijAwp5e6Ou85>{Q&|bP6QgD)hUWCUn)Y37B_zc*c*W;8M=8RDJuqA(y5jSmr&^*k;
> zF}Ob=SrX1tp${0ZN<5LN_37YMNK&OPtF2^7eelBOxu#>DlHM+I=wLa5FJ24zE$JbI
> zU{xnp^(%BP5Vj0$yIE2W?FhaPa0vL#+;I0M;DKg%4seJo__fdt4&CLmRK5_{qGkK5
> z@(QUE7JE)@B;~Aa+x{0kP1fRoQ^t#_eB`$4w!ey;^yU?e`B}|ao3Z@~=L+$C=-`R4
> zJGaa<I#)#eyWthdz=`XZhWcN^E+A;>^eqaEQ!=1Whqm{=>$2h9izRnjMZ3h)9sNZ`
> zfw4I45f`{u2#n)4x<^C at 204z!VDl{+m?1-R5H#mOSO;2#Jhb(rx??D-zbM212)Hy!
> zkS=BD at NgNowIx?S-kQ`=-rAtW*Gr&mtd~lFJR6d4YrM-^7mIH#`nRy*s~V-oQmc^{
> zqa}bJi<U#n6Vw-c3E01*8pzHIzR7jof<Q4f_KA$$*F6(4JgmB3=xJJPMRKMUoI-F3
> zXpgHp#NQw0e?o^`aXRGMr}H)0P2upTW$7;V8UeBHb3c6A++Ex=68A3m!)+q~7r)d`
> zi!6BJw<MYNhXG>1Qy at +c3(A|Rmj@^Z7<Z0&5HTCpMs4Og at e*#Td{t&-B4URTR$5zY
> zt`n4!y6z5pLjdWP;q-s$>Gry=;dCq3&~mI&S~IX$yJ)7CqE%6#3pcZ9%*nL at g0fck
> zRI7n)*0Qm}_8}G6=uBh&PLHNZ at GriZM{f+<Cdr$vVesP!Zh9y;R!&lO%VX0!Zt<T1
> z|LaW|TqHNsJ>g4rlH2ZE-EMdS{y(g1g-M#YDV40(pauI|l<*bm*-G+(a;8%Vg3S0{
> zv|y{=yUltpit0We?uAXAh0_Nyn~2i<&rkS%FTUR+GnbwUu35AWfA)0P(JxrgqX+pN
> zW%a_+UPBzDMe at MCpxp|KbA-wMKMWObO_f<)5^8&DtHqruGYi$cO|SVWs(HX(cYe5L
> zS&gz8*cTOSom6jdi!^_=nRVw5g*62HcEo`ng|Qo{CMiTa=XaFDqfH9d)&sybN{>u|
> zd at G?g6FElJr8eJsLFh;)`$+KyHtREK=>;zL7;uK20C%h8GH&t%Q9Qsnut#PRrCM6N
> zMq(P)uZ1MIc(SmXR4oDhBic3^JVZpkFowe;;<u0r8G)Bb1D(JX)-buo#`d7B#>^y~
> zyx?_%qaKG-1e`Lq4?7YxG-&I0pi8+AW5!rCETT0^`*Ah>9eRlVUc3fl4M|Yu=*wj!
> zqHaJV9T$TpFXE9@)*@O2i)9Pl0yGV-#2HhGvOc8m1B-m;X)kn3Zg}^@mj#-!#NvI%
> z$)Z2(t){Yj73`UUVZ3XMj&}j$62=Xl#3)b%f;hUHIsP)<H5zzV2Bpmf^><V1;7PRM
> zZo(U=O^`g;dms1PwJYceZ$LA_BEk+&t5*H5k^bUrH4`1D=}$zj!7}f0e>v`E9U_Su
> zW*`YOkZFc|frCyzen_V8dN<(RCKcFwUrog$vRO0q)@TO67xLR!-?turUx7x9^_ame
> z_13uWZ6hv1J?_^lLT at e4q><x}rnely>2H8*Mp!j at OGwmD2Ezb2(Kyw0i6@=rywkOu
> zAd~!-$I>1#d}^8Gt0wD`0l?pn*k<-`%p4#bmE0p0Tb+!`kin7v%UPF9QraKy$GgOK
> z at --GbzZJVbvA(eTI`Eq}0yDCg_pi6)Wo{7UzI?=wOBANF$JiN&8-`e- at IL+yvFS{Y
> zPD%1Roui_2l}uFH_mGVE{>07X{iyGu_CoX(oE*qArJh;X4RO{rtN=bza$8CAgLJIF
> zrI0xo)N;ju_aT1p4gQZH*(A>EU)t$}2yw-M13}Ib)t%52g)c;%KQvP_mZfvyn4~~j
> z$M)e1%#r}!Ki2AU<erTEG0fM|GEr|VFx%D<<8^Khl^n-sJA#u&gU1A^r!k4X`{4+U
> z4c3 at du^?LOdHr0$oB_ at QSHs?{A&dcKy`<;E*`YsA(#P_8q`^zteiI{_*ASw4NpFR<
> zcHB(XbMwG4qS=z|S->&|&q3Z}BfS*J=1KA%(jEb~3YrtT-U6_TRN|@yrnZw#3^X_f
> zQmNfImy>BMCBwRRLSu>^pWi<XI!3}FM5z6BsgjL at djwqwXk+k1T@OSeiJ1caG?k7$
> z8QUI5^D~f2rL|rzUmwYnzbIGMdC;BmbgVyfAT=bJA#YI7b(wl35!gYN0I%t0Gs(hu
> zB0q*m$CcpyK##}0Sx%KLa$&sWp2u$Bt-+X~{^1pDB+tQw9i220=V<7UkRz#(si=@$
> zGTsJEqEJogKH(i(-`0KH8x>lmwM}_<?0^g}Uzg!oBCQDn<Ka~l-q;4xGzmLL93YAn
> z_<u+aim?VDWd+z_23+4D8urpNcFb&DJ9Fn!#!R}7!V9Exz*U_8orFJ<4AH&HJ+BS2
> zTN=AT4lX19LS84hs`%$WEq0Oit?Ex8JrYM`_EkGQ9rOLKVkHq?bPHR7XxS^+&4f)C
> ztlIe;etYoq=rSgFJ_1!ef#NLZ#~dgvaPQn$aB}C<`I`<bC}`Qa3+pov+Mv%4z$f(1
> zKNalX`Dc8&Ge7FU^}wdnEaSP5Y-2*{n&4ozX=ejThYIdZ*{m7xHyQC(N+ at TCo$gAQ
> zWQG=d*{_~*I_$`?05#uA{!b26Dyaq0JLiELaSoiGbMVuIXfrRIZZ?%z at wK()5t1(q
> zEN;BtDe*jCUcTX`r{g4k2fW0eNszb%oaQct at Qb^3S^qT9yCGTs-IOL<En?fStRJ$3
> z*#kM)qaQ-*p-a^L4><yj&k-k<7c^%$5n0R;eCcanCpgThu;D^nora%U%r26h!QS0(
> zXuR5!o3NP~s9y=2h4SI+LZV8xS{kqEb$N23_gGYC?Xc5zxc at 7E^(1%Lfj6dxd>|l7
> zfk>7Jyb#))4$mvVNB4rpO7-MY at 3CG|t*qvuUp*~qCVBTVjA1FD{k^^_&|>BQP6VvJ
> zk)XX(!Es%PpR+m$+)|!>c4rRa{xKRw%-5cF(O-H*Xk~Tzj{fa+df#=aRV!1{@zo4n
> zb_^L3eDCP9qNx5}r;WeUa!fHD+;VX1!Kbh)Jlr&p<Npv+CK^Ej<C)?2LdyjB0{Wus
> zOZ=57CXyxj6R<uLNRA24N!$^Eq&Cp~V$it4I8!e!^`<zMF$LWAoNC%D#c_-^Go?_e
> zL`nzt)PxpWcH+*4Hc?4!EX3VTI_J(vkU&P9Hqsk+sh+;0(T=A-HNq;Xu~@&GlRx&r
> z^^GMV{h92mQr?B{=~l%C3*czc#zwoh0g9Nwzs`f^iy2xWJL*!k^SZ7LAZ2#OP7ik1
> zb8_wmU1!T7$+^2E-sVT2E{~Ck#^j_CePk at G!$xBWD(#*2sBG-Lv*ACF)d6^4r?EN(
> zZ3{@?J%iAkqcK1XBBkk=Bbb%1CStY4f=Y<THO>u+Cpj8-rS0MV*mh8)!QI@}E;UJr
> zApObU#=*M*GoT-+ at 4}<{E<Bo&OtBM9;r`7&vN^xD+2pIj%;HME8#6vdX;GjU at 5LE*
> zr$1KCRV at pcScx-a&CscfYvo+%S<d&P1!fD@*L{d!91I>plv}JdT4}hhJ#FwmJ?Ph^
> zXa8x6gaps(2xi7$|5%$!m68 at n`at_6I`^;y^#(`(!f2c~lYlq(FZxNB2j7F%&MYIT
> zuGyXnd9b}~3kz!Ti1Q^_$FqB=jOG*uEAI|FwY7P+B9mNc!S at X++r%R)YK76*_4l~9
> zok<K#RTHRel94U`)?JJ~-E&@O3->2A&qj><{so^x7G<Eas3dqG7{JKhf_p@>g*48h
> z-UP1&y~C|Lgq}e6g53iSNGxPu(LYP#s)H&pf8ZJYi~mYF09)>X%qt9|vAWIVPpT7r
> zHO;d%iE3&p#Yj|=)UbUly+__vZIRF(i8_{qm1e=+jIvbJZd0u?uo2W0hCFuwi;F%T
> zWsQe?Jsdv!!rV&fmUVs2DKs7(cI8~QX<~B0p^0N^>Y#sU%~`9I5cdOI5~M3OyGKt6
> zuY)Dkf(L|Gv)98j#>td3HS*{4yyIk37IQOSj+y{Fx&>{q;tk9KZk6kkNZf_tuIdvr
> z?!rNPR+l=3ZBG_zUjk3)(MHfpz*^kHRxfx?c$mEmubz8^TQ9C54FRE&+U=G~J%zua
> z5&17^B=#n=wT+}vC7-G9jSUdQx&u_gk4TGdgLbLVkGomA7D2Mwhy2#l-}sY2U0Shj
> z4nfl2%{v3RDEk3uE*bng1CX)^hCmkR1shwqtwG+sG)#uq#FllCJ3iDE-n_0ye0wx-
> zB!W8D?;<<kHD==pT?TjprL4iaf589z at Tmz;rE>1`SnW75k5f;aZ!s(6!}HMFdqB}z
> z+l%lwqCHGs2kZSw?NZ=7%xWI;u5Oofn)gb5e4rn(=ozHm<LO()SkBHdv_|-3V2%PH
> zTK~dk^!uKIT@%L)#n2nf*vOhvKGAN?(r3|gKkb-_Bb!P|R~YjehFP>zd7$=<o?Lzf
> ztpKW3C0#YzKd^SetWPe8o;b$0ys5O#L^<-ut`9VunhSl|SQlx<Ryc}b+~~O<dIsS*
> znd<yQe=hM|#E4G^JP5~i2CflJ6vbt6vxy*XQ;j1y#pJmkqX*4(9xvwba5>kdG-E_1
> znZ>(5X;z3+=lh3a=!yt}EPy^`j^M=6h%Li7={STX;EMWhfiw_4s7ZH_W)5`}t7fdU
> z(ct!5a8`}>eMj*Bh0}a8w2#H%9<Egl0mH|l|7qZzV~THuq64r9tF_Kh9sHQMy=%#?
> za?nlZ7JC4*xyC==e@@P=CJr?$T>S|{r_gr7djX}P$KYS^z|ifN_7Hqc+!_FfL^cGj
> z(9)sFGOogd)if6HU>3mx=rl9bKSG1gT2S<eA6p&7e23Gjg(YaTyR_7K^hvBpiTeVO
> zo1;9^GQ0=h#*w5Q&kq4ZgHGzs23M+Eg2%}{z>Y4%Wk-K$t&97<g$KnPr@{?N33wwb
> z1GjTTH(c}<^e&*i#c?h#{4G~8$40xs649QkWtSOrotR#XaGjkkjZn=D{9c{~_%=pM
> z52Zp|AcbWz at yr;!1ASo`$@6(Q!A0k7b`ISc6}kkL^8!KAQfHaUf(xoyNY at 22FFuul
> z%7OMmF15W|L>Xca*$_ax3j5y_fL^C6X%|%s at _~~a8Y_8nAlCPWnxuV$c7yLqt)jBP
> zp;-wV^!kRTlVKRi1Xv)4M)DI*`nr(5!K?CHEKK`5aE#61m=dgf+q#M~(&$2O<3Oo>
> zp!o+E5cWb^;{JD=3OzHM>WFepe;%XuZ_HWlFc<J+++PXUfmp42jHmbA+0a*b_cC_6
> zOFtKPr6e~AO{Kg9*1*8#f>Th+U!kFa*!6&`e*|1Dh5UGUNB#n?uF-d-nc!+ at Y<hA~
> zp8 at qnv=M}}wi$fCY0IE}|5w5PuKx!>uN=j`bBr5M;riFG%M4WdP>dff!oHtOwWRC&
> z{)iCT_gHJw>}%53a at 2yT;qd!Gy8%|vZ)fjMIiqxzKFG()hQ|Mf;K`RE_{hr;d{hX6
> zvjrp_)xN;$bSjADA{vx*Uum=4%6!>BLxv*)K?eT{U at tqUPq^+>N~ryq7vQO_WI;U*
> zJU&1pf)YQ at E?FZpctYC1Gcg;06_a|82>%T$TG=I7p_rN#K;U(rEP at wV7eLv(HF$O~
> z9BXm5#~i|V#=oV`McuSwi*b!@moZ{-kWL`RpJ5g_n0ZJoZJz<`XBtmwD&{2x1v>#v
> zhOSp(N4WFPi2I0EW4A>95+b7A at gbNP(!Ekj2r{(->kGjp9q$BWBKT7<Zl_ET2xn{r
> z+P87g1`c at wFpR6~=XK8opMoSfMc`93{miF`X2q<MeaQZS{~xl7<oNIsD at I1gR<Br(
> z^JHm-b%f5LCeHNGPXE*X|DcD9e0Tfy`Tp);(r#^jMRH<M$r{c)Ga>H>W_E>{MoJ0y
> zy`|+>B#)RzZ6vInN(kQJe;Qw{r&1!abS%3JP{|2CQVePIhH!4kr=d;kyW2gkeFXRs
> z5x|wjOYij5a0M&>Vt>fm4}9O`WJ{<;8h8!D?VukmCPZc$xbJ^suFpk>FxNrPR_1?o
> zS0QxZ3G3ahK&ue6C#YBY+A;zbmpeZWBMj6GZJeFE=`FB#=p*j*kXAhP%72uo-vhU{
> zBg*uF%4Lj^H$BpAXW%GCsuGoCumm1$9|Qay(UOEw0ccv$m&G`hPJ(Z8&_mv*2XZxN
> zS|5CxVpa`Yp_r)-=!J5k!C|9^IK)fgA#A4y{4!u5hA<@>dMn8WX at J2W`*qN8Pr?^<
> zy3R5%{Y&Me#QQ;6zuF##U4VE&fmZUTzVkUvqS#0$0W+x{Di at ykv%CeN)lvJ-CHbD^
> zn#D`+z3bk4D;|l5_7s(H at o8;J#Umr2mqt$mnbbdFLP#qJlE27+q>hF3kFfiP+XrdB
> zFW#?f;8XiN8fKWT6_3P4(CK$E>C*gR&gKNhQ)$L<NB>Qa!SV|F;50H9_ky-S-r#os
> ztMw+}GzQ<!OXEWM%_hAJ52ET2jOWPtTk1db2X*^Zt`g?}9L&+Z0?un2<hr9fiXj)0
> zB at asmL{5c7tAEoj%Hb}>3?*YV=3zA^NKdik((SSpUb%yx--Q!8!?(Zjs*aGo&3N+R
> z0!|dH8Npi|pMBNA((F|S%kyF51HQ&>u41`upVVP1akB56i>qW=PH2!<$l!VTjuzYI
> zPvWb|GR;39t8_HZgtdt86!UyR!TN*F{B_Ug7qlEKD{voNQn3HvO?ZYcO}t$|+=YXT
> zbR9^K1gmtj?<n?ne0IsfMN~h^%~gOcz&G*yY!lKl4m!d2HEx3(0rDq7=O6^IR+0<w
> zHe at vb+++5D?Gh)!5%A2z-Ux9N+VS)#Y99N10df^E8=qN_aqvdyY0X6GO9*?_HSj?r
> zGbgpo5#0Bx?-f`^ao9t3qD8REo1Z1;JPB$uL}~htcFd=oq+#rzuR at o|Y|2hNc%y$a
> zFe{UP?J(V$9HKiF)t4Jr$&%4N22KYftAJ-=+2W^`fkTN>Kz+jdLmbHlhetMp>g||M
> zbB at u4y91qqqzG}7RP*jRzFR(qjfMj5u)??vYvo1gF^dE5<&Om&EyI%Z-7eW{6&WAx
> zJ`Vr67HDAQy)F6n;dB}8wDKKwh1$3JdIQ(LqxfuyPDXpdb94FUckJ at 7B_7zpQvL7s
> zc%~VSrY{aI#_tA2$d4%7i{Czi5=taNiuN(|7UOUO`7MVZQ)2<{wFt_eZz$Whv{ztW
> zaDwP7&;ZAD8sHeDv^L6z+7^=?4B(BC%F)7+x|qJhUXixyU-=g0$CvG^PaTTJx2Qkc
> zG`$m4h<;D-1=_=yH~(hhUtlh-B;G~V1bS0!<>2KhMII3;WAypHvzWoYpJo{=uo$is
> zLT5$R8rW<n9)w3|6QJqA(o6kQ#uK;W;Pscd9gW?;=5`#sKE&-fxPZ7F2N#0dVIyt_
> z?!fJMel~GC21P`rtTg=O-%L7;<37VV3f)FMrufzZQ)6>MbYm;d+DJz*B^U3Y72bH*
> zA6t)hG`8q_XEN@(F;Zpi=IkX07f_y$jT(G?&$~hmC at N05JM*KSM}*(TRyu2e!~Fn!
> z3Q(@G^UuYO{`pi=H>hMI(Z^J}BY5|nxW1Ncf)8wq5ETGl-60%(32SLoc4FgewScpY
> zulYA;XE(kE&c!JAe9$MPWi(R18-=@M{ca=%Fj?2n2uE#Ah)04}swockkK^rQWP=SJ
> zM&+=r$-cAxSpU^l_<Zpd_`XFAhue+rNNTSJFMGIlDuqpLyvor(H(zPPDpB=Sg0&5<
> z*VEWDrTXdp_F$DFVmyCgK at GerPeHUj?B+CU3QvI7fp>7FxM~@=VwC~sG66bH-sW&S
> znoYzRgtd?bcn0gODrVxE-fD0Nae8gJ3Kr5>Euf?F=o<yAhs}e30OtF<6Pn2#bFgN>
> z2hV@$z}p4UyBcB1_f*1mmcYXk_Hy&lct`&e-$Cp3nAOOxQBqnJ=#WMMwm68Z2tC1E
> zlsgOWW<k$5ue-|&^Aqk=&cPz>3%&JSfoqX6A9-hAl8UvMilGbZ2zEZv2!Be(8=d$y
> zUWr_Jhy^Gp>BK)((j9 at F?_##6UxIu}x)y=-EM3EV;^ovV<m=N?;T3QkN~nQ-7)4b2
> z0wa75G at MbF1r~r_khnr^sNT?;++u2l_m$R>I#2aV9WyxrjAt#lnroR8a<-AgKMb9o
> zknf7VKhbLSAT~P2r;@ByF@#n&NB3lI#k|2A!>+vr*}E$91XCD1)yZ|Ka*iD4o_FXU
> zh}jIdv1>16vw$|cu*Y}p>$Z9&inO$AAL&8Jm2z0GtDz0B?lqi{jUDCrV|RVjF%NM!
> zcI~QEfr|tY?|s)t;AA%vJS6_2B6k&e<8^ol8J-ZqWS;kqS#<L8pGnNg=Y5zy3>Cl0
> zF4>izy<}G@)vL&}(SAVExT_O33fum1eY_f3yJr9Yluna%h+2^&O7Dmt8bi>O&L;48
> zSGtZV@`W1L%JYxE69Et-9H?TOx#(26!Rg^)@WKB$n+obRn>DaZ=P71$9$;D6E!P8M
> zmJ0r at Q%3(zN&f0K;JGWypsTJ3(AYWQ{2j}&;!8dmr|SZ6B+Q`hO0am%C~XPCNy8?`
> zca&rg^X<hs?=Xs6iPbRInZ%|qconwX1SL$o6Zv!5T$bZ|{uj9sT_6SWC at roGG^es#
> z6_q`T(2~;c>Z{@wX!DlxyI!I1(;8HFz8Y>f)JA|3C94dB74>T)$_zYYBckicgC35=
> zcat6cCEGQ#l0tdFKNI0agW>)`Jtdp!g0&ZLXJ-SuhSIGV6&^;^XNSF_Rg9-LIL#~v
> zeksjtdT$k4VhOc{zW at jUP9l03ev<sK8q0`#$mAt-4r1 at 3G}XeR(EDo$4tCr`v*W7)
> ztvdp7lq^Cb#sqc&#T%f@(JDmJC?ao;BJ;Z`6_^I%-b{?dR}5YhN1P4=FFjomOKduZ
> zx>uVH49l#N_so&d|F#0pqL^UuXJd8Da4*l$#-EMQ-^0iHFkZVC=XG)~tO8$FwFHb9
> zEOuz#`4nG1dY?^PrVcyS{W$#z9wdXi;C1+mL6P&8+2>vD;9c=FEg7wc{$Otvd=RH7
> z_NHT6YzZTevN5&(HBF+Qd=YW53r_l0Hrat~*cEUbinl|rJ$3fkU1e`Fo$o&qJ8&u1
> zP+I%sRtCc9p|i9G%hU<bDM}X&e7tWvsH7>cvmaboFY`o!jhAzx6!)i)=})ynTWsr{
> z_=^ZkL6ZV+^}Iww6eoA7GnM5uL0%U;Ft~frz}3F$cF^3#{~D}DtHTxElJcF>Yv378
> z$N63@;TP?eer`8(I>MDy*r9_1&pG$t`%@)ZU{}VnXYJN6EQovjEPN_TZfUUE&ZG!}
> z*7^5rYXy|v;lGinDm9!=iJwxG2!j4ToSne5fko#}3FWfepf4=2Jowog-EJw%;g+|p
> z_{-l)(8wF3(a!23I(C8LwScF{I9JW9tenRoH~g!F=%VHO3tb$tc2*;wHUI+`nF%M*
> z!%TYSl-?G|EE)p#m3(a*;L*hIRSEBngXjGJsqvtOXb1cEohp6d)~#UObZ7r37ySRx
> zEqTq*-3WA#m;d<&*<>FW#^jwkZvTHsdlT at c%Cv9%Imt<y?&$)Qwdq1xgi at eDg%D2K
> zP#P#TN<r+P6j8(lMR6O)<)l4 at 0;M2AK?g7>me3ZgTA8YdDIgTb!SU6Mqcd^JVksw#
> zmPJ}>X};fmP73Jz&h`I)?|1cT&i<U|Jj?yu%kRGLCCBr2*jiJ_+c$Cs&P)TMVbrEs
> z;O{3^*;|v#iYZ>UP%i?(!?2Eye`$Xrco^iQpz-1>RGvWA%T2R4C$BM)pMWSd=_Q at u
> z5c|<A5xFe_bmQaMtwmWncwr01if39E2}U!&B~SP{rsMQu=OX_SaR^k~cqcGJAzp)X
> zx3tr%lU!ac_TIo-vtYTn6)_sJCxK&D<b-KzjzwytY<T8muV~=@c+B`T(-E(;<_c_#
> z+0a8hy<@85b<r?6zT9-Izvad4HDv;#F7<dK*_=S&`>@?F{=*=KkS6AmQ$BEs^Q5e^
> zR-7wx8-D_A83KB3^9&@){f`8!I=OTo_#b4}*fAZwxR_n at 0%67JX|J-$s|l1Xz!<>%
> zJ_+mfA?OH;)2p_-#lYmma#MQs_WCXlJpaNF$Hf2{v4-&f(5vYxn@;=;9{D8B!8-bD
> zy~)5~9<mU{G#l|73q4fIaq`H^KW>0FDi+$xWb|X+myz&Fv4WG?j#!q5<$SEq4Ty4(
> z+`Y#CJ6M;IVFvbwb$BijTlj_qk0Pqlu(!O5UC_YpJdk{l{nmQBL(67Lc|<i(CdwnZ
> zc*otO0obvC_%N)2Rp!TbZ|+_LPVH7;MiaUbM_m-_wRKj_IPf5Mu+sgB<TcGFvjj&h
> zlO*QIW<~bEvbVa)Rz>`tgcTdKV|(U}S%!5Nk+Pt<x}C;myR$W!^fqnNKotp(=r|tP
> zYb*XhG{?a{Y-A6Z2iJb)9e_I!6I-z(7b at 5O7`*mpZ$$8XhH`#e at cid)8!UiXAF!@F
> z<Sd%kzvS$E7x9~teDhz+*u-z-CCEQJ!@L9NTA)(7W8BV*5_xaVe=V!`4%gM-SWLm#
> zmNYqR3Z&kh-AVYydmIi{1m76!QM7K}SbFAy)3KZ_luWlri at f1ptieK-Rbaxn1Wo=p
> zfv-sRY7c8k%Bet(C;sxkembt{BF%j%N?ha=)Az%o35w+0>0CH at Ooa*f$_zxJxutF3
> zuJ^Wl4L^l=|50$3F;)A4YoGH{Ab*|^4t*``^BA!@HV5+hJkhW&3D0fy{y-XEj8Q}g
> zEdy8Tw6c1UcX-$;+rI+rba>m`hA>Ae(_}3-F#$|?HR6UE*s+;K#^J~;G0NnfhRl5t
> zguKPfTuah_)iCgNYr)^?nN8GbfIO4Gj?H24;#TIW00gj+d~3bQN0a1-;a!hNbO;AA
> zwt<(wyrDI~9A6I(BOfKM=N;fLMu>WG#$mmA>W;6>Ia7Cml9c*}Zu>xZ63>>3ao$?U
> z`lF!5$cCP=y#A;?(0 at Jjy|tJtlyQ1Dw#hVS3gXz#-^_$DH)aB?FHxZIQHVi@@sAoG
> zuAhB<4nP+6TdAC?i5?xch4 at agS1#~iZK|J#(NT<}LH_OS at b`ta<6)GRgfEC=uh1N9
> z(n{%|2g7{HVoP%$`C;gfjq;bEA5)uo%hNk--f#!>uxQ1+$;NVM39g;>Xx{e750l3E
> zcpv}UO>uIo{N;a|f%d?C at 1Z_9;7q;lOp0BPb&d<JfSdfw-{Gfd1XFPB{v2bVjMhPg
> zkBysJr^F`KWM%h3hJ(LMY$s&?H1~MKr{&xeHj#C+M9x%dY?8n1uJc4<M6YtdUsn<g
> zpy)lTzP%<fU>bpJ at kBxoXM!v|9kXhcZ-#>47ie|FEMG+UZl^WZXqXS22V%!%iL1GS
> zH(7tiSiWWj8wNCc6wqXh8x=U>_ier^tPnfUBC|Za4Y?1!$+ivLWp5%gv4zMYWWrPP
> z#6@^+B%TZUx#8|R17 at iOw3yFbu9;uHYIBlpx#n@<i9sD%FR$jzf7#)M9D9#uIUAL=
> zVKuk8tH`a50lnFTEGC6c(Va=CJH;zuY6bZ|P4&)zuAQ8hd8}4g_i!{dwjLf3guj at I
> zUVqLr2%{Xal05y<gRAi6T2=(h4(LS>r%;V&FpAS|8vijG%m?HOM(Jp23nH2V&qVKn
> zZq_V+iEr5KiNLtoLNuV2DDxJe*&db!`AabZ^_=f4E^=!Ua35CSF$bGNl~H19(n1d$
> zabKv7u)xzc&Gr>4p7-ItLd=#BA=Sk;@*A^zB- at 6mp~A~UCyDT{_7#HC749cq!9mif
> zV!hFNd1b5dk!MxDdmN~$&Na?AA5!7<`@j!P@@mC!X*kZ0b?9D#M^#%y{CkW?-9lXB
> zsh;lfUM<dO>HBw%M}z^`5)~>i)F(7l at 6HS!rGg3=h$j4Y&Fi-p(jC^N;Hngh`4!U~
> zjo(<Td2yPBq7h%3@~!^*>WBOQek)eJQR=Gay%n=Z046d~w4t1A3DJ*4taZ?Cjso&v
> zxhJ~bF6E)WW>S9<rSExL;%S}pTfuXL;F+heiasn^3mK1m&F*@S&XR@|5D^)aZG_6P
> z?^s|?>|F`FM~XLDJNo5&a+O-=u$QoEBkLzdriHX9j-bT?G<gEf3kppkJVQ2W8v#iM
> z- at T>vf(GMa6s^g}{(D{Tx?WdWpF^mo^HI<1R03M$->lO$&@5PQtg{lUqfwOQOcu{H
> zXDhrdG6BM0?44fT)|;{;iL}Xx)HHx>5j-@~;4OaD%E}X4d!K;hA0|b>rlJ2_*P!1I
> zJM?~ydd(i#{4i+pQ;- at +r+{C3=jJ!%A93zsI)aaYf$LY4r{Se2`LI&zGMra547lem
> z+Q$=zBt at s`b=*|nyL#X5oqoN(Q>niCNQG~?QRg5(gj(`aB(<0_LZG{pzw|2J)J+ld
> zjm)5ok%7(dJeNkOV+rFU8C3aodV*t3k at Uo`sQVa|x(B~Gn0HxOr;`*N0pX9rP-p2g
> z?Fj>7OJnr~?&u2EUyn3Ro-BWf5%~&weUqw<`R0gwV)bN58}MR+{TxwinO2O&_{hWA
> zG*2HK#p7ruw&Z&}3){Zf=Hu=N+zkx4H~_~E+ at 0=$_d6>Dnr~1SxVbU`2<$4zlfZZ5
> zjx5Q5-m)X#UkJ`;!4vXUZ#G4~2R_9 at BZ|dhM8U3vJHZ2D#Uf4jO0)L1By-$tCNY=%
> z|MA9Ym{pcd<SUai-?+Mx{A5^(e=vDs0jmb;hT|=e&Ewc+>}|li){A=lzKs8k;JY5C
> z9;X-|sy?jxR@`Mfo2*#=pTwF%F_x3yrKXiqaNj at Z?kgE8iWB-XXnn+DtT`F}<x`?P
> zCd?rY^A1R5Q6m_26m4HC7}xLuE9EsY;(%_a21u};J3+$-`gWkj$3Yuw^UqZ5T%;ks
> zOEQp_8hR(_rVU2L%4JZr<nWu{bC-VwWIm05g&Ow>^LaMewrUD)vTY?n=75&HGff!#
> zDsP_c8jsA8#hR$2I{(Z{LU5Dy=ZEI8sy3J#gQM at o7Ec&iy!;#Nfo;Rcu5;-puc>IM
> zCWhYsS9sAY)YC?}tpe9j<^-S6;q-<;!;Gi!OeA^p5FNYp6 at 2nmz&5rM<7;Q|joRyW
> zFtTmfdcQ72hdI6CCd-hl+JxXC5Y+fwLSE|ayU1?|cBx&^l35UK2U_O(mGwvLf%xx$
> zvl at pM?+;s>wsQm8dO)Fxr52=c!_fYP*un!ujK?++{MYXb1(r~hmyino0H%#^ho{sP
> z!bSXEvrvp at w?RLnekHP6?s!XC6%LZ_0C?bNN$iYkZi8okyuHJG($m>}upo#1T*c$*
> zi}jlN-1;ht{7rGsuPkfUNzldzc66&xM`9dBi`(%37ph;?#O5&c`b*x>&f$bO?D)>p
> z-hB{P@^Qy&c%N#y(c<V;jM-?>r9AIeew)EN%?D+;#otih7yMi?ILvpcj;O~zi9<`Q
> zsz+>olsc#TAZ&)nqZ6ov1_^!y31lPQ2Hnd_a90Vqzp7rb-(B-7u}0S4^kyxxixTQ(
> zn9`m`#Qjas4#Dghrp($WadsuHrehu12phhZO@@CPeBp6^70!>TzgN}bbs|QCcMN#i
> z7-bIMcseZjbP}E&uAp(KU3kwxtO&zUl1ZM7JLv79R36?lP%Uw{dG`y!KFUFy$$JS|
> zO?3ocOt`jTe)9LA=kke{V=v(-n?|(peT<oz;Mx*!CI{F1V{0R>TCzE`3|cw-&a9tB
> z5~sosje<S-t*U;i4x{^E_x;mOK=(fz5V~vWOWuACZKY~8PbgZ=6Nw3kF=Dj`V(%q%
> zwCpFGPzjHb`$ljakM21OTq<ykZOC-J{SB-(MvUh-RV%H(P#N8C(v<>@W~z5kQL%Pj
> zZgF%wxWlEO*66bnhyt?RrC5i1pSqQh){6aFXTdeE8RZ)aE@}qDN<1AHf_8thJjNGo
> zWJue_hV%5728UC`kARGU6+^398r==hEG9t%sMsCdKVCoE<ON=3&z)8MFvl)Ydni^c
> zLjcl9Q1AB^xRzV}uL0M1I%wemWr?L8A$!c(DSCn7e4Br at M$a^`YdtOdp_A9+x}j2!
> z8c;c)2k!m;#Zn8l at 57cl%JMW>g4_*di_l8p=})^4Lo*!ZK1ed;f_jE%yhlUIgl1UV
> z_Y^ik(>Y~;Q-ChXdb2&q+=J47Z4Y9fo^M80u97}L6WG)iDv$5Aqxa=)S at w=we{upR
> zs??D$GkM3AnXqr*#-lc^RZ-2_f_K?1Si67)DWP29!@NJ at 8E-SM+;t8%pN29M_|<_o
> z-LIF5KN6iOUecWCJ%0nY<tZ`<Uwt4tZ}IA#gnHyfKUxBaOW55Q8xH><-3cRR>Rx;g
> zQ19+mvK{&R;X4;pG4#Yx?*(8klhHHzXiLm#F44TWa93s1mUqk#7w#%p%=H6eQHfWS
> zmwY`6N_246j1$!;D2Em6(_zK3wnBacRAf1g=~m50apx>bT?lhTJgo8fMEG50So*qK
> zw+~Y6SlLQ#U`s^Z9woF9wKd_5r1N50wsDY(H$uz_I)^73vx}8;dcyW7ZIkBd_hFnk
> zY6|l}Q$B?Wsca(S_kHaR3!c*|=hAR)TeW?kl~6-_3L4`q>F!1qSBQ5XfK~$WvfUqJ
> z8;)o_feYIkW69cCUuq8|d`I{_zZ2MU=xpQeS1qY%)isd$_%96NF*`eQ#*>a79SuwK
> zNf91>cRTPMz4pQ=J6FGjEQa-)er+-QFgAS%EQTB`h8i$q1F_d%*&Bep1ZA&3Je3np
> z=>5>!`15I{#ycaAg)25hM7Y0hLmUD7COfjzGqm8nz$I at o_W#(NDDb@&MNoc1V;hW#
> zVx$pRWO>Jbv at 0GKA&uQ?RHD!vRC at Lxum$ray^vIF5MoB~LI&dDnP!fX52{#2Lj7VT
> zcv135Ckx&Plw$w)-9Nx5#e^J_!4-XLDv&8Nn-OpPneX6-_!=-Nx;A8krY|DSK|!QU
> zQ)klJVs$1_%sGSkIwl2it}sds#9_35<h=#B6lg`S{f_vWn=mQJHTBC5&ma|*^2 at 6#
> zDy4muf=WpMcMy#>Yexxdy;!f?Kd1MTHC(aQ0T=emU#UDorR0veflB#l1EGf$T*?;k
> zAiu_?JPK-#@R*?gH(~vZ4VYbjLW_^98iKudA=wcc*p~0G)`34TL1s?Del^aM#wic`
> zuHdYiV(&;@Li0zlbiJso2`?rlpe$sM2F)irTG$+Q0~08T at K3u7vu=~5#i(3o at 5uTS
> zFwW0<f1*_kvyN6=TCXK=FXJdC435=OB7alLM3nM4q(WH1vo at oQdEWM_%0n@*yr87(
> z>$M(7v|iteb*^{C9d~`jeWiEB^)JSKwB7=VM>ZQ)DC(d~>(zGWNQ;#fH-!zW+H@%X
> zrkXf0|1LC-l62^gWNO1Qp(?$3D5z5uwH3+A at L!eMVW&b%MBMab37-7A8T1LUBQ#=i
> z{iom{Z^t)X1a%E`b)yabT?TGM(SMB#>c8$oEraVcQ1FB(Fhci5aT5oEKEH$#i3b=5
> zY$jwka64((&UL)PGA5^1Fz`s({>AX<dv$>TG*}QVWXm|ue889NFnh8fFK7F&KwHnm
> z2ke2%CeIlEVsRKfi>F?67B>&8k06QcY5}<BBz&L4s1?inSMWQAwDS(F2+t$@njCS=
> zq at s<*GUzxWWT!kbD5bc?8PXzgtuGhY;OEgRh4phtLQ?8Yu_7buZ~wJ^;L7W&%#Ck<
> zDyWN#xLL|ZOU<+FbJs(f!YbTeZK;B`K<AwvoP*{@M*XTH6=|$Owk9<4Z_%Z3&<<vR
> z_Gmw1D!#M|F$=a2!suFsmeUfp)T?V`WH(T13nZtzl at Oah`dpK8L5vBj*%y&6A=!Z{
> zx8EDAEA-}MVT8Wo?V!HmN6?!j;G<OhqqTK5az2hz>B;(=@Q(xF)=<F?!aK8`o3AMd
> z{!P>f8ekzKLFe+}OQY>PPVXjux^H*)PGA}nNJ{I8P|=Va^i+^0%YlaswD-q##%nw4
> zm2)E6?Z+Zxg0|D`ol#`$OSA6u%~;94k1JS7nx`l6go%l<Dd49Q`d~!|pFIP#v7O$6
> z)%zDn71~b8o1&CQC4YkZV$}CQgGO at W3Ecm8rB*CN+xaMRg3`Mm!U+G3ZbN<;&#wWt
> z6WVUvao3G^L&6aXQrOGbnhp(v&Y+wyb2u^*D*rPbZxZ|C+27A+9KIOi^A$RSwN@{U
> zf!<6{nqb0TNg7yDDit(>nb1<*I}1%5I~1+9)c>SmK+75XAf6O`$>mk}k`?qNgh0`2
> zfl^P#Tj$^o#1l}Y4d_WwmPlWYc0feVi(Wi)m)a+K=&lLprD`{R&H(lhbLwZ%5NN?}
> zv_?>C64aJx<+r?jK_5*`NjK?A2Fm&V1_^q4iqeNMc6awq<<0o|;2!Eg<#z7`j`1y}
> z_MP23$w$>@Vp|DIAzxx9 at zxz)C64*<$UexIt>l%K3%78hC&<N5vt`7 at _^0~dYb>Vu
> z at +j66VIM_N(QCmnntd- at As=LO*sT)b6>xuYvKn_A_Rr}`-1bQ1pI2<Q{vXh4H}Ih(
> z7dHTp_CuwfBD-UTen_#H_bi93ETmV}j7H>|!D5qTNKJxxYDa~=W9V1r$7)K!F|VR;
> zt{H8qsxjcq3z7%FFDh6>kDoGMs5u>2`ox;ilqV%Uw<a~4C4|cl3P`B#AL7w72g^kK
> zTLWY!M}WywZKfH?upU828i)>zk>?OytQifoAMgdbkn|<azLiZ25FeY+sd%rx#^ArR
> zdIl`X{Jt3|Z-}qJJb2Zo=FzK;>=(#St|rw#1h};!$Ye-S+lDBaY(o9Tf7i=tt_aW@
> z!40h=5R?+W*8_}OJ*?o+3?PpZMZG3j`VC-|cF2#pW;AIL-7yI^e>%Gb$OoL|p*8D0
> z4^2pURbp#Yo4yixZlSj!yS5Jhl%0eyh!+2lt|VW9(a2Sz1bGuzfphr2QJ#2YKhKnk
> z{kytMEQw``rQ)0RfU|G&^{)dum4_Gojc>gZt%RrqVhBi26u9nU7UjQ_nOM}eCxr~;
> z)ZQW_McfCLG)gdS3&l2CFdd*R#xIN6IB5wY%~U<mb0?mT at ei?gJb%bP1R5w&%9fAe
> zEg|p%(sW`zP%A_80a<E~$1-Gm7Ce#%d=$Umic%h_tNbv*y|6LfXc7$)%w)(}^<vi|
> zV}`R*eo<P&1m`Q+u at NgAM(2iom9ABU7R0w1<YVwILp~O?`3p+Rzu06@%O}mx$5yhL
> zpe0{WG)phuq*+ps&eJ!cPe;R(>Y7JEJL^K^S%?#ypzG-hN^~{ItwL?8l(Gin82e43
> zh-&a$TU2YTq&*iUg?S at z+}LJl9VGGR^inwRAyJToqDdx1y~;^PMA at N4k1O0Y(;lde
> z^DQ8cQ?9j30B7Cozo;M_hsZB7qqDLo!5D_v9mvf=V+=hTt{{zH_l%^m3yil8-?Ivu
> z8Q780nj$z*@Eh=0IVV9 at tr_h#;Ckte_V5qs1YXAcU$}1sA)!+)W9-bq%t-PM#(6|!
> z;G!|A58}Q%eY5>PQ^W~vyu{(of6<#qo$*8jug`!N(>$BW1`IN0AjPgn-Yd~$POOnY
> z94F!JsnoOf!0v<oZ{(lwwjSepnk_VEx~zyq7GpFyD;r~gwp?i*T~nsaD$F_{N?{Mj
> z%%pi}K>J}Wt{IKYpCR;Ss>`yMz3|@5n9|&dqYlRkjIuyr9 at T(ar5XHm08vEMHlfuz
> z&_L&*Bh<Bx!AhJvzhhOFTq%zszFwanq0dH31ZH?KM#k$sVfZd;kzw*R(3H`zs~Xi&
> z>j9VFQ$rZ}n$b6Ai<j2pG-}InKVa{lYQJ#s`Rp-vi^Qu-T8t}P|M*eD?AKHPF_Hqz
> z$Bj%ECcnWIFP`*IawA5j?`~VM=5e&n+Jh96R_9AX#<~Qe#~PEE;NUcmS0N$_;<xh-
> z?uGSLTyB<;xwbjRx)>rn3GqptJl(h8g60X=+H;ypTWRTsYa3U`GQ`PMN~2c7%$$H&
> zmtzrid;%Stm({HE!I7TZZ0|rq5iOgTKCfo)U*WyI!jE+f?GiXkGz~S3fV`04Flrv}
> z)H;lKzg@|e#g_)|Gnj_r>o(atCho;{9rdqk9r|{+Tlqylr}Rf0M7qW^7K1VQ2B^MG
> z)OT`I*cpBbyDzmgFohif$iZe(^mLQDF|E6EsCM#lw!vAcafwkVu>vw$M!`ib6I;~Y
> zTy0RZgj0V47tB0N&$V+SHBV~VbZxp!-Se6jZ5aOq|4)8{LVs)apca+#^QgmmOL~os
> zz8Jl_7Z&kk)B|-nlX_!oLyeA@@WgJaGor@?zXa=T$Lv0!)$54ksHvcl`G_qKiE898
> zFu(d}a#(_S*4(>%4q7#>Lt(Sa^a+-znhf%`01hi0_r7-hIEG{<%|^Uuy}T5X!v3P=
> zqzBQg0|iEG^1=;FQ}BvrrM=^cH^mm{QzAf<gLFFZ1)@Mi0jp>=|6%SO;8wO4Xf=-)
> zxk4ruZ8c`z_*O)Wz-(J})SZoOTy!O9${Vz%;V8JOp-jf2K8UI62iMlkQj(~@nnvIG
> zL?itcj8VCoo|c<dI34OZNv(DBpMCeBB{sme9%_!8i#U5FPXGzZE9dS+&uySp<o|XJ
> zp*R2DMV|7?3WEChpXw6)7bUa~*QLIh^!$pSQkeW&;~Ir?sP`fVT1`Fq3sbG-W0t3D
> z>b=7&tQMTblPA?DJ)t)}7lQL&7OddDLfaYFXPiww7a at gF-(ptRL3%z0JLV_2=Rqn_
> zvdYIKJ&q^?-$HE1px1U5xxxP`nNH9TuhnBrB!@vB34_EN3Q5BN{)B~+6(zi!6IeLg
> zl<P-4&yQjR2Au}e^>Git-BGw6`2li4a||>04V;Os>eo!PoW_QRD at EDMsTD*$*3>kd
> z4~}NMA)ZYW<NQkn<2uC15MxnNpYjyJxR&|u&P at sg97)lg7*A0>^EO&HCiV1v&48Yo
> zLK*NXc=veRjqIEP#r;U)nCwS+q2+?yE+lCgeFfECN3y1&oV4=c0t>+xWV8FiH>Nf7
> zx#5g?wYf0u(--wbyZi6YQR&CEW0Hybarsa5`}oWBMZKep&dk<G5op1<V4q;k#8E_%
> zOGkYiA%#;P;MzLxbm#(j^PIU;{LkERhjePogMZa8xG0 at Ihj<*O`^DYxO>?kN#1 at 2n
> zjXvAc9FExojhbtGmEGQvS*)xHdw}RcxvUkvoB+A9uhN?WwIuCz<zZ|^2jBRHN);bR
> z?O1cL{k4I2l`)9>aQ5Sy>E+{dsFuH_eMI>hV?g@`6YUdK+80%0yFp`mX^u*3s20#D
> zjlMC<x)|Oh6}ff#qOCC)bF2h)k3ijloWw}HUU%<)bI#nmjwE0Wa}dq3WxV<-tW4kz
> z#6Ov}bMHdV$fBF`-GNIAp9?!Ms9z2KYb96~J4g8zxJrP^c*8e4xF+vK&$TL44fGS1
> zM`)aD_R7QT%<v?>cdL66 at G+&ZZViKkZB#hd(5B&##ge>3r54bny9gg at 4-DFaK5>)2
> z9q)3Jo);SX1kB4C{MXu$JG#B}S7m6a3>qIZml1V+aI>mg5B5z3G9U2ZpkM7ij9OGw
> zawK6i^LPjH+29uuVeoZx6mD%DexqyL3itJB4Pj67{BxVbq~Wmt2+%!P at l}Y{Qqv&8
> zKgW-EN~X?n-6G_uJgicXqmm&Ys~jVFr{F9~@y`XCLvV~|f|A2v2=pS918VKQihWU%
> z;K+fNgsXdFUzqf|6dIqyDCUu{?^QeZ$_w~kgLhzM-HC6ae1NnL6YkU8Z|<Wu6EJ2m
> zEG*Zg%-5a at O;2CB81hvj?z$J*V~@0#raxWN+1h%+nSQk9YTK<JGkM$JL#U13{Y?4Y
> zZVs9IXn~$(pdC6rDLDT*{#|x%^=$Al+$&>YX}}fqfgVSx_=gT#OaV%qEEplG1*3-e
> zE3W)a(S(>M at DQoF>Op&>m98op_POBg?r(+%#_na%M1lKx_ci=KiqZM64>Y;a?SY;s
> zCEmtnXk3RDJr+pt8sKfviTmf`{=axHk!K6^3q5vj?P34W<}|fN+7uwP2UXdQ>*UE*
> z4A<T_- at W0?-@?p~Z8$@BRBGTw2tNvMn0fn#PPq`sY7Mk{dCl#JOQu*}YC3~;1ztnh
> z?<5Nn2vvLNjQJhTOtK&muV7 at O-~u1diTMAXg>hJmLCalb3LYX!p%tAd;eCA3)AD=G
> z{Tnq(Ud}$Sm}M}-#>cC^I2<a^-x=bYLo2*6X-hwvYyMBb6F_>EKa?MnUsN(;5hvS;
> zQsyXgBeq at ZOTrO+7SN*M&~99TCL`_wr^@*?SG`02H*ZrUs!lt%u>k+S^A1vassa0V
> zdBX9V)r{yhHK*Z$G8naK^F}B~7zMU;?-g9nZ3d^@^Mt+Q{B$SsmY%=ODd4xr>A~-P
> zPN2HaKjtj9_e7YS=#!WK0qwzi9%$sMpUZ{8AfI_+pg&XFCmb0+_0GS0_(pRD*La|D
> zJbvGUl+X#TvKy!_eZVKNQz1b7?62uAJBhQ`@(Y>Hva;q{*-7&YH6MS$3oEw5kDCy`
> zkorG9r#UuIXh`RUEvb at _>z0J~ck`6hhWK>hR$*c!FHEQ0cE{l7sGhsTi7SDALe2@%
> z1OH~s6}-Oz>&Bzt>05&Rl_gh`H5|08b4Mto>IjPAb}lqHbB3$!=S?}9kiMj*;RHB6
> zv>SZBY8un~=3o at R{R*|92cCd6r?Gb?I5*CqUEn8B)6i_dj3O_sZ&i&7FaR!d2Wp_t
> z>1>InoZdvGY8#6T5mS(hv{%jsPnVun`zMmW6&d<}Eqluk**l)%<%fXrVFT}$wC3p7
> zGwF!9D3XNf-IY4T>Higqp%$6HEK#+D{}9BJ=~Z<(l(h|`^>>OreLnoOnopSuF0nc0
> zmuh+Qm|7(URxRS5S^Cyl$v3brhxmI-RqX+Am7kiYt~%m&?l1NWbQWihx=Z{5WI%zr
> z*u(-vxUqLETiqJsG at XmW-g|z*H_wPGkSs?@df?D!f;M`f54t9iY}u2puM<4*3a<5}
> zr`4J5f!7a9iRS291E_nqWl0 at k8__j?z3N|?KCe!bo?DmWn at 2O$HpX8>Jx<!AZp`+&
> z;r77bDd~OdMx)epmAApssB-u_)r}$ECf7JE;4rT5?umjIYv{&UtZy3Jo8kWpFxZeb
> z>&D^Ev9JL!f0Ht|2a_Jh)7u)usWlWG$D_3eXgt-~PzxXzee)m<tn$s|v6ia(qiva_
> zAyN<ptM+9mIt*Yy at l`#l4x`pXt3?B(aAiHarsyzweyhWnO7+R99NL-;`8VR64jK$?
> zTaQFqYG~r>C^zh{v=485eO>zi{!Fy0+6S^BQC*9c8V9KSlV2eH1I>Us8<69=3XY_w
> zT1}S`lD*D<#xHbbh`BVbAlba at fo}@Nje&=DqBfK~KK*AD-GqU36M27>Lj7k*GlB6F
> zjeb?W(l2yA0}c)L1a1QH3IlgjE1|W9dXb4E^Y>V(24dVC#C?meYbGG$<IasJ^GWJu
> zxhB}p$w2dPnE$9v>RM<l)aP!}SYSjb8jJLKwFl@)yk|6x4SFZyEex(zMi at p{aTil{
> z7Y4-jz{t~^weu2{Z#O7cK-ufyKU#YL{<9&}+ZKK80oY!7{~1MNfj3hf at 6RHQ#jsPV
> z#v*TkUqCyV75P>(?L_TmjQRpr%vDmmH6x;4zzAxBR#UVW`{*pR7a_1DWUFh~s!o5h
> z&`$9lqu4mCWM{bLnx$|Mknb*HCgPdX8$%jJ<d$<PwM1<iNh<;glOujA5QxSe at EFR>
> z-i!5&F{?|v(MYHW_SQk%+w(X$?eMOQUKvB3EdzI9d;#lGH<~02C(VFS$gda!AB>5Z
> zF~;?5Qzh=m5R5JGAYI+ZeJ}19M=~>J>)2j-hB&$zq3Xy2fNT+-g>QFV7VeoyvoMmC
> zYp{Q7?$|(pWF*Jf^_ at LK1QQ>+DOKRu_7B6V?C!V^!{FhQVDCtOsxeG{5zkLlrB<}N
> zRtiNFkWd<>jVn<Sv}JW8dZild4=)$+dkaZ5sO^88{r{6>^HEq&G;+7bxckG~4ZRJT
> zr>EBS72M1-gI+Fc)RC;l9wbfxZ?iV at jqp~|geY^%3LZz%P~mw4%})OrpwfuW-mcJ*
> z2>1}@6D`4+JXoE6g6=q?F-$VKLL|X|FZLkON+I5fMN75ezdi3wZ`8|6J+~;beOQq0
> z9&uau3ytcLq64r*B~t5U($k9O81g>RaMU&1gUo|8vZ<Cds;RDOEg_eDjyo{BIgFBP
> zo1neUX-cJ<!bjB*Vp1sw%4{O-lB#3E*y~s}85VA|lbr6y+^QRnh|Q0=vQ_;yQEYo)
> z`+ at F~jnD?ydWcJxhz5fWy!RDomQ~4H+~l(ZgE_%7TTX^l_6_X3h%+TlJUgR}dUG!3
> zaUnzIW at Noo`LP^f>>l3lAU%H_AacW_ at Wd@Pv}g8amI~?<SB{ys?J4Z_%_<&F^eAq%
> zNs7d*&~}9xdC?{>@y+r?Fs7lHXQ2x&F?XBRR?OUz4Lq_SFM%G1jh+$Al8kI;WNiXB
> zkC=g?2dy4epo1gE3MRCKv}xDCpAs3TCW6B at 0DHj@cNmBxM9hTE*JpK7_I7we!`n%B
> zR3oJzswTT7($juo1nrGD>+cT^vEY=ZP0yI~3t=%MF1?Axi&!UF9 at U(3aYA=vgZ6n`
> zn+}nQGuk4(f5nyfET-2Kg#;qxr6+#&Tm~27k(Z(UzVQ6w^&GwG_0!W>QwG<@QCadO
> zl`p9)RC9mU6-uU!oIJs|LomgMS}b+>Rl_R4n|EU3im~t(O_BpyF>5rXfu86rZcUha
> zADykRS%%c*XBpRMdZOTagc6X~(B!n at Yl~6S3CO+q1x9xX<^&LNph-V8gKw;xOP<4Z
> za}n_f>s{a&drF+xdbZ6^z1z85d{D3vr<cA2J-T>M)Ru;V#q1tDW%uYMiVK(o9>7lh
> zUB(IVgCYpUQ&)&SQ`#tS0Fv9day|5)w2H+`)3S_1;ImN+Z}TkUAY}xUd!SR9?*CDq
> zu4D&{hNld2gad&+64G0aq=&p{bx-g{O2~D|tn#Ps3G}@GQ)4O1p)&kqEJN;S at b9Z8
> zB(NYQ!g?PG1aLMuod^*UAJ+IJ{}|CKgSJb5MlX8ko9XMWkK5^ps+OsaTyQEa-HWE3
> zsLOYX^_(-=xszi1`>enN=vXnE2tS0sv>t<OvkFwMP>4xDge_2x=Sf1%eveNz at 2v&u
> zolRIhtMU~5<8(@%Ev at k6HvJct^p$mU3rg4v<kJ at z<}s}2EI1<$Q;w0-vTpA2cq$bU
> zJXk^m=q}{ry23^#EnHnJ&ob&nTO*fc8W83k&Yoh~`A-Y+h?v(b!B?-M=~Q!DME>GW
> zt`)w=0%Ew&YG)}n&(Fs9fp745ZNDy&%3>&sdSd`+QKL4?m|(ycCc#H3%wJEl3SVnQ
> z+#W>jKs$9K28|&smG-Ohk0(O2M6HQ9E0}$Uy!~n0^@X<&{Np{ee+==BFg_xKQXO$N
> zcCTJK1TVx3sLjP2?XP-3DiTDtFmb3tJJ190<Wk1%EYSlw(|R;tvCVu_mESbO`~upS
> zfm=m;J0Hk?pI?!^oL?bX5h;vDbgDXvd&)4oM>3sg74F}vB^zTA3x~gQ-P~sQg%IBd
> zx at N^WJ)Hxsp=^j4DP5eD0y=YsO&4Kr#3(`gQ+^vAk1Pc$jkD265wZtjPJo)UbQg;)
> zJkW$17qTD%>ng%q+a4&sD%{T-q$JcJ(|7xpdVfK=hqzk)6;TtYJe}qg+d at v8&gs at 1
> z7v4&^TRe{UY-kP<A=z)arto|lwjjcbZ?4UhJ&a-n3fXCR->Kv05Df+6V1hiA%@rq7
> zJNz9qO<pDF42C@)SHd<Em*Tc`<%!|`asG?`0(z&w*K<8lu0Mc!nC0iiVz*h+><{tH
> zCH_2nc-6N%E#TW)C^m?AC_N3b27D#%GYCV?qiY9#79&|9aSSvk)(%li>p5YbRy&xY
> z at YW78KRnM)x)h4_;42WD*mCY&NGnI>BjqQt!rk65Vog)IezUakNZ^1uZp3qbSwM_@
> zf$=8f@;ilXKeTaq1=nQ2c6E~u6fvbDsfX-&N#}^ug*F0`NMx;vIPltms=f(#A&v^#
> zi-(mi#tlE at ZeeE=q~l}_Rsi^CjR4M2Q)EI0km35ii1VIX#KLU;G}i=R>xYxKqkBRZ
> zaFDT;?uq_!VhCv;k>lH_8;AQcs5KQ^2&8#X64D?IN1Q-JY<0a~Xgt6+j%*!yPS=_)
> zrJmzK3rr$c&XsH26Z~oL3r}zX!8M}Q59?ItXJ}s|Z$ulXrcZRn`eu5Ey2g7(xH7>f
> z;JT`>fPKJFmQ=whJ)N}c%FfKja?q|p=zEN=PPe=StJ3Y3Drc<1qlCc&k5R7F{h+<}
> zz`~>59 at j*aH at 3GttZl<R+D(MY<=}UOBZ^NQ7)zRkk>ju;n>O>5lbgm%JSZBCnAkA)
> zM7pcW<GRwRL4?@gxC2eZ$fMXt-u~cP9>*-fY`No#XQ(#;9N#a!?^K?B<NDX8xUTqS
> ziXr}S)UL>MXX}PO<NK2ya3tUVfC#$tdB$<sObBmoflO$UJeC*h9zjmxWAZAs6~IxX
> zq7E}*ry34g;OfRojS=_)##_!jJFZR$)-a7Y4Yop@@CD{g;Gas1Otm~+w+a8{-L4&D
> zp<#fp55~$S{FjrA({mald%7j+jx(Tq8gNCA00ZEn5!DopC>NQ3hmNLhgC~@@A(VN9
> zj#QilN$=RlSi{<|6;FCT2$3^!?oex(8hfMeP_Dr^l6SG8;IlWt=Mxq*Sn^+%M|@y7
> zWqQpD+hCGV=w{`+8_Ub9E$MZL+)>x`X_!r5_hnBvroOsC7#IJHaXcGwAk>z@?&~>I
> zE(kHwB%nYOF+cp+j>q;qwo?_U-w!_VJdldSFE)9V_#bsm_{tu?6P8B}#tD2O{eO^L
> zAFsyheaKQ!cUZh%94by1b$^RDJi)k%o#i1=$AwmL<ukAyT=jDKFl^(h?Bx$seY<6;
> z_uoQN{5-)Czh8*a^MYeD|FIL&*lfb2e<XGTLy%}>Ch<69;xT3v|5mP{x$WBl3+YJ5
> z?c#=pp}+wJmKdFZo;&vsbv;xFXZ0mU;#=G!8-_Ma-<Yv+K0Ji&<yQ0H2mWo2eBeiE
> zO}PmegGtCv!o+?J_mdBOm9WK8IMx|BwX@<u!DJpNa2xtLPnCnuNc;x<VM62sjcabJ
> z4yX#Fdv04;Zh~<nGK`uw_7Pa2q0!|{7d at S?yp~}zCVt!#VO|{lccD1p8$^Kmr$~7h
> zp)*SShX<G at d&iL4T*d|Dk*D-jMq6m9^Fz}g+c(Y?Okuk|ba`WVXsVBfRyLvJ#hP95
> z#i9u-nqGZRJg&(zT~SLIGrFV9FRg0B$mN1{N%|mJV51C$XbFKipT~F`Qx4rq?HK54
> zzAFm|9qT$yMZ-S$O`ERgh`>qxypZMie&&?uzxTu=*1`&CalVCPoe5bLCJDv-H`!YL
> zDQRR+ge_*J3(;Zjgy(8MqN$>gox-mW*Z^KkM)||#nW$H)JfhthT)pnBx^S7~bZ0m6
> z=+usYjIS%=7*HXYV<R!*6He*D+iXqOn}&M~G at f0s)ej1XoelUd`9t4qU`7nK{((Tx
> zybsDh2!qZ{`@tGu6=2_0o}Y~Uvl4VewIjNn at T+-{N`g!_TfQ}Ssc~eHp+3VkDVseT
> zj+W=|)0^&hO#;uJ)oFH3%x0tL>^Ry>rM=OhM at HXFS4U^0Zzk+pLpno!Ge0tQf;N1V
> z)Tza9GAIFQB=eAIa3)GCQ_F7FV*jn{B^u0w|1irO`C23-CQWAu^@%G=7ToaD#TSo}
> zXJWJr0V-*7;|}v<wIlEa6QDyzJcwYM%|H$kWc;ihiTGSUpW|tLPPh*?ooyc2>tp{2
> z4`k>TdR8grhWej$hoW_nv!HGlqPcLO)UYwQ$5V8fXv8Fv*q#e`D>5Zg`;%`R{Id{=
> zr*;I<r@%zT%a}<5J at 3i{#xrlevGj^~uUMjZqYWZ`5;Uv>?Hvz)lHPakI at PArlzKc8
> zQp7zNS+^q&57s!F at db9uBx%m|OV{sR*E|r&-dN at S1P<SZ_ucNLOwY+}5$X}$rR1}R
> z)@tuM#3fpy{6_6vM%u}}h;W8G?5b3OJM5Tw9Qo#UAtD^EW at 7{mu5}dk3q(=<6uSzJ
> zQ5W0BRDo^P!<NE`dV>B7fa`ByU;B50LJkIn9K5AFdodsWxegpC|Apr0fX*meM(tnF
> zw}OqaUGP|#QPm`_#@YlAe5JqdA at 8vR-wQcIR4&XzG8W;E>e{P4`<n0+eBt(HVPq_%
> zC*Wrf%@nBZ1&;yO#?m!qUARE8O0YIukY~|3)DO~uWyvkG&=WtSw9CXPq9yX^+bQZG
> z<jCmu5 at jup?nR1`v>*aqWbb(BigX&0fli^F5#0^>PmP*kkhi{&$5KmCdGH@?&t)3Y
> za6yl?H;>-7cNUe7Ir7m>t%e>%rdubpzVv=ON~x2_%5(9ISsqJ>9=f-xDL6uB9U#nc
> z- at UV1Q-OfO7b#Dy`H%q_W;$eme2sip7F<U;628si`4R8TCyf_I?zgZVM0?`!eExA=
> z)$>i-U(&pqvNU*A-+nOUwG86lPN#t?+zoyQveVvm6oI8J6h10U!Im%i#e{MfllBp~
> zZSFaEul(W=R|flPX8Odv>j;IhcQz=1#(@<>62u3 at HR2xrJywd|rM8Czxpy7En3bXw
> zcuPFDk=lgf+$y!Cm3!ru6UU;I7K*NQASP&s`4^1FKcGMJMXN6*J$LUqyvZ(%-2e}5
> zWt7;3oKc{4R5JSRCQqfkc`|$!_nQ5XW6 at IvElCbQ<ozN at C*i at c3-U(}BoB>va{t0h
> z&dVh~mqLOD2es&R<o0NzXkFaqq78=3T*f13t0t;mBHMuwkEnS#>Wmat95Kk7>!;g0
> zVum92S<D69MV{=s)nlud`xaIs=JUp%<jvJ9E^1`g2Qinl?l5unC#4OE7vPf=SwfyY
> zi6M|?Iu at +~A9ox)&|&Z+$v_|$*;!O7_87%lBT8UrVHnxKBSIpBrZ=$Wc<+5-mF-UT
> zP9--Q?hJndbHI|YRTNr^vF4p at i%uVs at M?>-En-bhkF+L*))x5jYv8eO2*&VXJ}dAe
> z(AOuPJcWFQ6;@ylr-+K>RK0?X1j%iD<*&|z3r}zWQMKir1(y`mRPhVzx4Z+q^ksYr
> zQLiSS)sX^J)yoSmDA!YfYI-@=gcxbK>H|*g!x+Rti(wJ?k8F&IhkXYBs=Zcig`QQ@
> z)Ni9Ff?wQI_S}tgB%io|W->>w`Ws at VARcH56HKO1fFi>;8jU8z%x8$zza!U#Ye}dv
> z2NfvZ7(`pdFknSM4KVKfhv*&HHU+mHWy_3zz&54JCN_b}n~+^R7uvQ`8-mTZm)f|6
> zZ0qt1C6d10YJ5rTa|J8mgWI~_Oivqo<`B@$;O;UYT~%hAB38Hy={?{+Gc+fepg9F9
> zS_!RChTs3Wwrjpu<A2><VQ1#|)wh~Y(AH=574Xoi(LS}NuOJ@!7CM at C;tyXVLPqX<
> z7E*1FUK8Ap9)$g`a6WH7)3!I3s(S{Zu|&OBv!l_8y&1T=zfnXvT(C`<7LjYzR#iq(
> z at I2<+J@&vS2Yz);vp?~Ildd#OyI69m)E at Z!{boZuc|zZFQF94d(79#%6B`n{OVahD
> z`vWxq&BAuzZv7M0cK-ZZXt02dv*=6W3FleTNBQkbS1nN`@sequu+O?L8 at cM%qK2@^
> zmz=S at Sh`g*p|vE$=|ZII#1lR%j^;O>fb==zU;&+h43w#OuS|+x!Q$kxXe%v?X)Guc
> zvGT;BzB%?l<8s9AE1)bxh}Q$T-xLjf)fDF=9nRbh7$2LQEZ2qYTa4xYmDkMwn=>!B
> zg^!<qRtL=$XwU`32tmdp#9Ba<7I at lf89c!8`vd-4 at qZToZStr1h3_riKBlqY0(bUa
> z<9n<HN3j^&ac#UUIshvMennhCR!>N0qvPLXW83<H%ETcif}=bFcaKw#xEAGTJdR=!
> z*KE0RG~GMq>?8OhPg`F{pFmGlUJpczMtWoLsVJeG!x24&67`;PlQ$lBUZy*7PBWiH
> z<|%j3{WuCykH(jej*ny0Q8M|#o{<tIL3#@rB!@@=Nngg0<8q*J4mSu}(!I@!F9k)`
> zqqY0tf2y&R{nyW>7fYbwd&@lmqfEeCo^?;eUN)lU^mR|dUVpsnX*_FCuNyXCKQy at i
> zA@&h5v#7-lY3q)IjtQco=lfX;>N%_M9Wh{>!>ouqkb}2TCJdY7D3^uoPnkva at jR$`
> zhWx&K0V8M-;$sZQcZJZGcg^?B5Qldu*>G^Y)i(oQcMnEgcNgS}QoLKa?`WeK+`|kp
> zuXlY;<;c at fGb?fgwV0!KJOGQg;Di=HJn77l?*V6qxRLijPA;Ly2B%0i{&W`590{;H
> zQU>RKg{jaqg$R84KwPhey#5Yi2h>AqAnoQmh-T+OW>OC_lX|2G at HB!mNjxPUmhbVH
> zjF2gTI;<4a$luXnV$V<E1XFbbXtG$n8o$mdT7ltw`StS^)pm^Jb)@yCQkAT)9#1&W
> zkO$A8L4<X-bQ3Q>j~0$2{tVwgfaaU%sfO+Bk;>}Fo5IOLQ8J)<MfJNvjE<QHTH!B8
> zXXFcL*GrK6+*Ol6OWoD)Lk2lRdkR(ZRAViBWEnE2N82*EO!@t6V+6_o<!!AVkGtAv
> z{h}PKkkR$6 at ojpvKdcb`Z-XmOcDvJQ6;C@;l{US-UhA`?1t}+*<?Qq}Xch(I at Q6Yt
> z_Gu0Wemty+2b$<%*afuEL~6PZQ5L<x*YFm5xO`X(*Je;KR1ect39-!Z-H$F|(Udp$
> zQJHc9KU#>Ro at hG8wTEFn8@F{8ymKBd=Q_i at 0p&T?eJFMXu3<JE>og$hWaY^OBjdJo
> zB5QdkzT{B%|EA8%epBb?P at 82p)p^<f&pIzdoyRM6UiRPWybN_7{~zkiERP~v0jL=0
> z=99h|>S)(JE19|q-D4HHwjEpz+Qb37IW+V{<L;8TLvOWKp>e;%T*$#Z);CtDd!Y|C
> zt_$uJHdd;8A^RHF2loy&Zm>lC&d|69bNLX;nveLe8=;TZvIVs6z|-ADnTvwiPBi{$
> z&_`ihZhxbm;yhEXFeT1&$bXFU{AZ_%L$C+_yyVxpJ4iDfjN^=aN8m-Ah{~T~<irPz
> zG2#-%f0%c~h{f{N>O!2k5B3C3ydS*Q4)TG8E-?w7HTj6SJX_+c^09w=6K_dZd^FP&
> z6U<X<rV*AIngqq`xO$W7b1cEPZqIF03dMjX522=n^jySSEk1Q0;;ov*fm;fT=5yhQ
> zbY_4qB?}p6bsC3g{wpFJA`0~)@4x9;vJferDkni<fK>FIYj=`W+1Dl(*O$oWHyZZE
> z>?;&FPw2+s8=u`5yYH)gbKAMeF_gLP at 2TK^v3kPF@(i9hi<wt~@mhlTmS)7VxUD-`
> zjhtScQAN>qrdBVnDxj>#h%sxC*W-+>8WPiv{OWO*7kA`hZ at Pros@qnO4>lry^{X$L
> zqV+KBPe+OQM0?ERZyOprP1H|LiopB74fW`#?WOQ;ihW3#NkV-K&EdD1a6~bp!j&Uv
> ztH_HC<tsj9sO1|<)a=FYG)>l)L!RF5E-PlGqJbd_qz$=1oVPf0t23HYovX_htxKvn
> z4&-$g{ICbs>)??VnqAFSz{{f#W7WUMFDK%?@PY1wh%veFU({D1cS5^Pu^yfVO*jo-
> zD?@(aOTKO6=&BND?r*yv&z~3g8ua9J_u~4d$sB6&;&wNvw4u!8oKc<S>4z+R2H>mW
> zw at vPSO7y@hRjt7;aYeh%ct2x4VD7t5qmJiL$5yoc>28k3Ge-6hL{t>A;B!+ET4dO8
> zO=%}a_!aUjCVypRW<GL#W^QW~C1fAN%v54}EAhn<PhEoc2{IC5O_`A=47LkI^hK<m
> zI7f!)!U~WE?s{Ns1~X%oD8c_`{39|K^x<2*esD>jt9%pMA2ADkGtA3&|C!EWR%TNC
> zW?CP5IVXGIE4SnUb#)<XVx?ut4l{gC4D$4YnAdw4C<MG<_E_cZjVnn{vL^@ge)@c-
> zIn}sI-P5jYELZo!&o@#eR=Qf*xF)#gZd|L-2l)5i;lcB;=QXY)>3olkBzSn$Mg`mM
> zH$I0LFHU8=<h)Z#5h|SmWFoy}cc#d>;xq>k-cl}BT4XPQe%&xxYhWUxoAmq_WUCY<
> zq9ta-apOCs;^}>3d+*1+E7W`Oy{!99tjKS|;|1S*0)DCij1#PyN_=#b6i at mAbxrGj
> zL~Iec3uPB28JS?rdp9+<>*UfCTHvbAJ58Qzup_QM8mdH8aybxx%wZGfd84oX2^gAy
> z<OELSLrotxu&Uy-kcyp-w-6_F=|4KX{gGGXYPGdm^joS+C=O6{DKO?dKNPVLO at V&{
> zwmy&zWqDN#any=3UamKQH~pt?29V#$j$Pus`LKS-8)4f(JVC67h~2_;Y+&_sRTLX$
> zT=f)|0(802iTp6H2Y|I2l5LC+C;vWNomM^7m?&DRpZ6`qbEaww&Sh6m!*34kXa;QI
> z(SaB%(c*M$!)&0cg+`XRQCAg>b2I20 at qBKz)!$N`EhOpr>KuU!;oCRjN_4dqZ;n>3
> zaC*M|6_gOiau6Tw>&u%|jNa8jKH=(cl&ZN5eb3bt>}fT(i6)=W&XfP7CoZ at R*CdLj
> zc7D at L-~4u|Js!DdH+e6$$5+xe?gDhYzC60a6RO-(NcSk$F7-as`7_Gq=`GmmF2{HN
> z2wj3uug6@)Xx?F#67g%HcEk5YgF at zKGb7^n6HRo)i%(HpRYa#+Wd3A#rG^)?iOOM{
> zgKg3U9ud|ywd;L0^h}C9 at ZB83_aVb4tcI)%We&<m&UNr*I!Fd(@WRq4=e1&j<4tCw
> z_uzO8B47<b^k2M1S%0B16IbK>CeYIV?isGcwescS+C1Eo&vFn68~0(~fo)pnQv4=?
> z@|gl5^4ZR3Y#Am_YUx-7t4a<-tS*+^d8hn6uBUbu;hKhg_TkI at 9?KwGr5c4A8t|b?
> z`|Jc3JJWwfeBeUKJ0aq*{h!2tB68wPd&hvSum^BkJhwNMu!cd%X=B(w=s<XO_Hx64
> zwGG>{v!4vzzl~bu*f)rr9r~-t+4x at 6B*TA2$Tk_2EU{yKa{?jI>lMS^lws1UQMqx?
> zc+_?rMfgTsb}gHLI%i(D*cOwv(8N>iHOP1z%ZpaT2vBuIxF%ndM8%eS9+KvxnP(J=
> zdmqNi45bI|m2_ at oXCAr|++l_TE0#RHi+XIf(*C#QGQ*woS;Rx&h(OJh{YQzKDSJ<-
> z)C_3-#K!dsm*W7JQ|!!fnw;<<b>6G!sqQdOT{lHMLOSMkQ{Wk!2L%61>!whqkad$S
> zE7OsUXk7vRZ^OTXhqP#^nve@!=^)Gg5q#@m^V at 5(&xIE)<zW+q?@E6lhcvX6j!4nQ
> zV(~VMe!^J!9h7B-{xY)l at Hvfi1Yb}rB2EdeK#IW?!WzZkcsyY{*Vzfvnc03l14&Y_
> zwF;@GYR(PwGSszL7jptpS=D<b9iE&bo%A9mo3e*E<6U1!EwrW`GX_hTlRj}mE at jqq
> zH35YfH^5~cz3w(&3MlDL*!d#YO_n_Lg{Yk+{pkt0Uzq&k?187X$`#~3vUmLMGun5}
> zK;|UAuF?hEJkQTJuFXL13H=D(JbDc at 1OuAUQnyl;8e0ql2lCWudd67HCPAl$NE!64
> zR70w_dGI>eELOliKy9z#<!$h%frb|M^hNFqSRZLjxW+<PP4S}dwFkJlGzy at Db<@b8
> zQJ`irlJhljEZx<_BU?0hwv=uccs4w}XF-=in&!>~js;p<Sgnpor!amNqLg^7FU9h7
> z>_MuO;KS3n30LmKT1XOcTjN at F&rqOn*EnYw(zs4pA6H|2Y{b2Vkj9f6UzTTmum(qv
> zXG!;?sYbbTA)WeAf2%VIQC1EBQ8NN~lwr>7L#g#vaiP6K{|)L^JS7_be_ET#TwC~0
> zB{xkGGK&0D43Jz1tmvIo<2?t=uh%@Nphh1;U5$j4=x)Ml*3_+mX1hd*cX#{6QfMWU
> zR6V3v*3MnfTqOHS6FAl|Xn}4=n-oc~NQhQ at Kzs^4UPAM2&jQzYly?t#@N_|sNdBp=
> zcU(^pcFvWF=-gBB#(38X=r-rbpAz;J-&w5C%!MRrqJ-rnzd%nPm1t}bTvlX!?y3CR
> zS3nw9Wd`GJi~jk4Di~MNK$4G(9bULE*-W{x&F?vY+ at U|f2bNHp->TAs%7@|0KROXk
> zbr<zlBwrEmbG9aJJuIuJJz}c=*j~h9jPI0-dT at VH_5i<>?1{iug<L7ax;F%v7g}wH
> zz*naX|5E!(l#tt`tLJ at 5?M|=eg0r3bw-H*(!LA9g7YsyZhyH}0N7RD55Mh`2373oW
> zT$8{li}QWAyMDj<o!1OxQ90Fg?joVv$txY&x=`67QSE(VadR9YQgyLKtk_6?=pww&
> zdp*(Zfkj^}$WUT>7mHeOndCoO^v<W?M-oU=p??&8bPqhzQsKvz!fq3jg(Sg%I5k6s
> zBp^g>3OY2YpNbCMv2jt)kd4+g!X_a7>O!~lTXKh(C}i_b;fqrQ_IaofyNdQxvGNba
> z*OyXjf~!2T<y|96?r<W<3G#Gm`c+T!_w&S|_S-#1ie<n at Q7au+u$p^5@&dgAe0LYx
> z;w_w?-qcOU-EX1h4=RZ4hi)LU at dm^?fJPYF?zAP%{o(!f(3zBTeWB~$09j4HcLVts
> z0R}wSHJNN4vZ#1^M<IgjaMC>z|3;kmo&~7Q_psy;RqR7!2RZ1LdipjZGe$y)WUzOP
> zy$DR9u8a2m-KC&OF;{*^Gl%9)qu7X%zcS$iO`{gNmY5GY8jFou`I#>Gjj0%9c<B6~
> z_<y`avlEuMVX&~w2G)4y{0`~9-gsgg;!TG8Hf&&>=4MOlp*CwL?;QqQD)seVSoDB|
> zt0 at AGnQ@gwyKoks6MGIQ$cI}xlRcosG<%gf{E;^qu^>JIm#X*n2ZohLOqV`Dn*y~&
> zJ#(WZ at Uoi_Jp%ED&XHYYw&%QxM5U7Kf$u+~KH}m?2I$GgY({2-D<$$7b(Zwb5kjXD
> zwlp1W2S3rRs9gxk)WYSN4{CS>%v_JuB59y`XcvcJRxc|{3F;r*poFh|vIRQO1W+<a
> zKji%lJ<l)uX7pkOyNvD$$_h*p22sY(6`dmOZS2)4hR#%E4V(*ILMw66WkrYhA>KuD
> zMTI=;ll71WtT+Zrh5UlMGThmcX+JDH>^c1ZLCH-0JdG*jze$i+pqF=}P0rIe at mUcW
> zK>)@2oIIqD$HA*}?r|gL(gfVKjv`OMPo>5i29z;YW_YsHdU<HMCV0bDj4rK`@L@*l
> z*SLdTcHwjHK*`1A=_a+<JTC=oe}(Q=<XCP!zVZFl2XbB5z7_h{+zr at nT4RE5i3aNm
> zWF5$8k at 1IF6ppN4L`$PBeQSQO{H><VJb1%N?6=@8&`RU?6t$oPs|om-*!WUL&yPVX
> zr^h48F*MFRTAd=h=8-ovR`W0L%zna$Ssty;lMLvYja|mZS77bfuC)K7y*&c#`+Bq_
> zwPvtS!d<=XA70ekJK+c1lV}A~dZGdMq9?F|p)cG|;RsS5u)K$yNlu&C;<L6MvQ*dp
> z3Hinkf#1=VVI_n2j!{8v+X|jw at B;u|ZP>Y~XvuTtKhFJ*a51%ws(%MOZ?LY&57Elf
> zV0GEeV`^mhv-lfhXg10Zq4#)-2XWio<hL{Cxi0c(IWLzZQa4LrULM|?-vw8}v+#-f
> zml6-9#qxCR8sd&>^ZfOM#f2r7M#}_b7Mogw7!Y!j&14(F#)=aO!K7HF(Qat90eHtZ
> zqW*(^pbS4E0 at F{FVV1 at b>a3KeK0AGA`o!8sXuV(`#+N877wWpwlO|7<lPJQ9{E*Ew
> zeJB&)+Yavu`5Jjo09E!7;g{fGm-%fJ>1 at S6X-x2jzeOmL1W5l0mcGcICaNuix2pOF
> zrMA<t2GSc9&nTuLEY+WA{loE}>>YFRy0J<rdGyc=>d0062%_YN_M52X=IJd<sHS8W
> zZ$JcZn)~!c_|6Kf@!aHS^$XDt{Tg24f!W)?=o05X-q;TqcoVl7>rgVjFx at vxGF>Ra
> zY7v2z&*M$QtUBjln(u%t0w3_<G_l3=vz(&XzKWSczTY2GmD#K<S}G8l7M5J9?Hw1S
> z at b(fQVnd3GjsJ2ieyIgmAAP$9NY)Un9#*w>!ImB-F1ZX$0ea~TP``gEt4Yg^)dVYX
> z%T)o~OXx8krSB&%L+X=m7rr`BI)eJ}<}rftmP+)U^4rulDt(svKld534}DI(R&x$G
> zPV^|W=s=!P>C|gtLTs_9^qjoTtEK&5eUb5w`iXEwVpF?QjYa^f*cn(4-uC}7ZVWW$
> z9d}iCI|=9U((}!UWLr)?qUtnI(-y3wzhE7GSy at M4{{LD>iDIHx{(18niZ(urRdgV>
> zK&>V43M#*M?L1FsfilefpXVR7c**kK7AAXimrw~icvT*_{rfSVQ^gi}En;0igw?Q^
> ztAymyMB`amVFlX5dKLw5o?Fxvc5Soj%|kw^Hbej$#L}6Yea=R5k8p2r?VO-liSss1
> zr+^mVu12<=!n4s>ea-M>r`30(6mb=iPch20ojq9P{sm75U=l{3 at 0}YiZ8=)h{v{$)
> zBY$Yk8HJl}RWcm`VWW- at U_O3OdVPPV6P{n;zqwcMm9fS)6len;to6trQq!u$sd$iD
> z!+B1A2-NUTozcA>hQMGrD07B#^*i+{p7-}&@AWaRZS0&W>F_>^<nV)1uQu{`F-IcK
> zQX+moZFgeMGV+P+T%-D|#DAwCJm8)7-=AqOQJyKS*Gy)-`qX2=r#|uayI$+1lD-r9
> zI&0c61`xfn)=hUyLMMFTQA<LmEL3X#0_vOO3X!b-d$9+f8}Dp<6}}SR{1}~ag@`j?
> z2Qy%X9h1U3r&a#7_0YL^noUwJ4_|+l0oQ7dd^5N$%?1hD8Biw;Y)%urqa{P<Fy;O}
> z|Ka{nX_h4o_h-XWHNpRhH$GV7 at EbLT4-V|suq;+fq4>S?K7;0d<PC+dFL{=7MqCHx
> zil~vJM&cEo-`Zp#p1*q+=n%NHYYV!8{RC$eu5d;`AYyzHZv<Zs()JSv0PjUwYpWCq
> zW|gGJYAt|!$dyh4U9-GwA&#xvGO=d&!`fYjHG2R!842rme?^{zmO|x=BIfmSLlJ{|
> zSL4V>70oO7qR2Ik6$)Q80rKR2T7TtPD9ea4r=x5=wlh#BW#`LNFygu<Ub4dXSPQq{
> z40t%E)d}z=6Ap(^*2;N9HrdSs=OqHCJH$K(UVA{!M<eE=;#D}3@~vT}7TXxtNt{$|
> zTvvp$jYr&nI)>B?ELI^!@U5Hc+ at 0$Ik8?EgC;~|KpD#u6Di5^YWZCySgAKVffLM$x
> zKi12AI97;x at csCTMS}~{$Ct7Y)Zd`+GmzHNHnyVQceVk8wE(s)!8fD31^bT#dA;FS
> z!3W`gF#c1~Zoo-!OCdjhPjrlsc;Hc?btj#WjU at _{oy6YbJ#hnN>ut6N&ZiMBn^trn
> z2u2`^6?|{kJ^LB5d)+$#dSQww6}d5)@<o;3`B|j*=k&f4E;Q+bQKyXDkHA?d(t(2F
> zK*|NGMX0e+Quhq<b=<}o1-F5#hIR$FL3>>aZbLv_FH0?D*0O01E&Dyb)PWu>#Q$9A
> zzUP&$MBm2YXg>a5_053aOlOw^cisitc&`r*S^KQSUE{q2pfi3$;oNBN9%UraUS(tX
> zbsp{j?iXaN-PqdDrtKfB$GdXyrigvQ+fAUAuYwEWu4m_6+|D8INE}<N at D%p}w?E2f
> z1s*WY3GlEuwY?M;h&y~_l^y0RhQ4n3CVRUR{7tdbC68_|!#x1H0?~JeT#6X8#rboY
> zUjDq<;L7xdK-#?p+Tg2R-Zeo=^5VRd+6=r6{9)#^GosDO3Qlv$l2+c;HOoK6GoZm#
> zorgHf(G9uTWAnog$7Uzxhwjf!Pup96h<7%DB3(OXXkgV0(u)o?SzMRZ`z&~o(K2$c
> zyUI}4<c5%H;W*{-SS&lhmxT%0dLHX~IM8{}RXXnWpF~~=BVtR&$dsXM at ov5UB;B)n
> zM(-WSD8!L|5_<cchyZjeR)&M8BY_=CgjD!Py!&w$j~tlUh$d%2*5p}EQP8^-oG0as
> z)vRF8oYTlvQZeN1L}|DKzbu7|5=*6>_CV2#o>Y<YY$YP=itCiYUo3oW9!Tvb at S`YW
> zunxN1;fUsNmF_vkwehbR3R_sf at 5>Hhsm7mBqEl$$!@QBG`vd+HP5dS&&|sQPR@~7d
> zrb^fAV$0Ax-ZMz3=R?sWBTk(co;D9ay>F8c`IBmXxdhzeza4R<+snCAQElOuHAnb%
> zZIK}+<c<|RUklng<~2%8c_R3w^Zw>QCLKX1a$c=N7kCI*;kW_~2aS+;TNTGr#c^tj
> z%sXc at 1_ELWC{sUR=33Z$Tx7v}poI<)%{a8KL#~$K!Gqq&tNK>Ro(K)UH|zp;3OEAu
> zz}D0YPPFqs$`+M*kfY60wumxC- at aL#>FOsx<G<I{Pf98iK^sEF^WIQs>NC4C%5ax|
> zf^)6-qr40BtEXMUR*P-P7rKJOj4wFFmbB|!+A1EAz#D1Y_>w(+y^*d-lF8BXQWuT!
> z_Oc5)F$yhzhxaGk6GHbiN5SvmR$w%AEJSmfJu569G{A31tnYAdjB6Ys7ffx?7c!1{
> z+P#z7H5d4D4hZ1!;BXl?#3pDS7y9wQj&GQ_%i at 3yN@*dqmD2iUX#Mod$Pz6Wjg#ch
> zE0UT+1!JShOZied-qCrC-WJC&#+4_F2G~!iZjrt`WW3`=CCejbU9M|9YJi+5vanwd
> z%TowYm-RfnM0WL+cfpc?@;01-?2{uH>yHRy%cZKks=rfS=p(udT0v-m&V)^82|{+U
> z;ft6m0cmBJ;1T(DjlePtRh)2?@$Gz7qHvVsz0(_zJ+hj~4_<&p*=2zBHlpffp^4||
> zF7HH<;!a0Vn_cAmQ^c0CMa_ivNh(`}RnjWX-180evh-A_s~`0o#XZJ6#a!0ujPaty
> z8-=ylAb*bNb2 at yPg*@B_Lg$42Jc%pw0N>QtS&0&3gX3m~097-jg>dAXWT0C4t{Lb<
> z#kc#~MkOY<fsSc~6FttP21xg{55ZSzsU>aiYnZ{qus;6HsgZX9hx=+nnllI6t)3_c
> zkE}zQwlGoKfJ{c395!ro>M8!dF5qWdzR(txYr at exfj~3LwnEy^wg)D)5^Zb<mCuQ$
> z{h`~giebV#VjM=177^gjA`e<iH?)gBs|d|I*&jWL;DmrZ;-X!jVBmyOY+1CM=K{B@
> z%9lc#RIV at etA>}f?(rC1Mgwa?hR68^tY$mAcY4Br8_MUAkAyKN{7R9DPxS2og+iuT
> zqTb?3&~Foq`-}$yY(RGti{l31JyVazU@!9c*rI0#^72~b7JPQF4s(5^S6B4x5abZz
> zhc at WTO#a^;kCYee*W(FfZ{kA~MDH9z^p+*zJ4ZOQT=b at V87nS0o~3LB7bO=WUnBgQ
> z8W!4n)+2i=+IDG~Ny&7zv_X&ZU_amn9Or?EF*Joy8B{*y00S49S%x^vT(oBZN*Vy_
> z at Z>gWOQ-PocHVxa>kq%q1GzsjNS*tL4>Y`vo)3lhF>+-oEr#zT-azy)BNrtZB%lZv
> zo_A#yMF&E=qWx#P5Y@}hz8WrhAYGD1<0SP2+U!Yrlw1lFu|rC9PYRY_AXlT`7bBlk
> zTG6uuLg&NFA7gmx{xtttZ)nl82?ll6(fR#p4QYkU$vh#V9$(o9*`u#`Z!LOukgm|U
> zfgR6eZ*l|hL_EfI48DAEYuY)3f6FfZl<8dP8q=AyHa+>IDx<vS8foW;pjTpPY{?}I
> z??nHE!*4belE^N2G5!phCNM8j8G&mtl6ZL(av72T?Xvu0K}QyW+GR(1)l*JPlYkm~
> zTZh%&L&(@`8TA}2(7C{P(rUfif5K+uvNmxSN at -lcj*K<C-PxpZO at PF1IHse#7lonS
> zh<#M=v<K#HfUW&O%p`cSzH!`HeAFPdpk^WJx(_6Js{|Tdx}|Jnv!*NwSN>RVFMGAq
> z<v)RvjTjTdv5moYMEu(#y)E`w4AY5PP=(bRY-6=zHnzZxi8(kAu18!$s}}N8Y{e=%
> zu4rpmIBZM_(kM&Rh(YqA_R0!<J93+B-;Nkc2FeajcOmbF;Eiw~Yfxt{>_gemUV!GX
> z9Bf0u$uMtzy8i7*j}bKe9u+Ysa?oeIjqBsEvYC(p9a*{%)2Ao+PDl<T5-cx{7*q!C
> zBHK7z$$?Oz#~ZSgJO~Nd%ZIP%sH|x1SdXX9d7z=Kmesmo?|ZM2?gR>n)pP#Uu!Y6}
> z^P$#>EcmDs1Gl$Phqq;TC)EER(%u9-iYn_LzExelWbZ6M*eeSOYa|dtfC!a^KnpSr
> zM8ym`9YADs96=OuMqh4|3PvVk#Mpp?*eJGfMgwYO!12#i0HJZ8aa!@!Xc85ZYDdGG
> zHa6++cdCOr at A5t0^Z(#U-&$|o<=k`6eqa|Ae4%X~jZjrn at t6}6gYz&_sruWvpI;L(
> z+MYs?Ty;(GxBca_^J?Xt$#t24lx?t1x}Vy7wkD8_FB at Zqat9!`NsPfbdFU?2r=h2Y
> z#~dg_422)U-NuSxLV}3M at BSD-=&jy at R!igGJFC0kP3fK1xL9{J!EPHI{+n9`{J!O3
> zph(Cw^p;@r0Cxnx6G!j<5<@=%*_6IS3+od@%OFR>olqrg(q-V!oE{;x$Vav`GHkRv
> zLsPXR#1qKqim%#evieH)^HSGNAt3pb&YW&>zZ+5&MQtZ|bIS|wVS_+n2*FMIjiDhA
> zXS3``KTC^5w2_ at 9-NTokMJ?&|9XmpSZ<O^Tlv;V=N^bY9^G()o#EN?P3;Mdn_p)z2
> z?3H=_ at xWPQMNr$Ir!v}BVb~`=;uE56CfooSTM21C8RJ-mQe5#(f4<{G31{U26Mk#R
> zh6=TR7Lbgxp0Xt2ZD4uuL3ikr+zQ~|Ej`ApRci-PREq~_RYNMWnIXp?EF~`^R=Kq*
> zJvOc-$8-HDE3n`&iW39uKMZ+*G6=upjZ6tyx!`AQk5b{}w?dJ=ph<{QPi4B3KNJ}0
> zoq|jVQdi;?%Em2&(~dq-t~>Wm2~2@>Y at eh5nXmjY1J~!$bx>WCA#0#Jr?m?PJrm!u
> zrBVbv1FKkrKC953fqzM417c_Mu!l4-(sd`YG9fWo)&KRCr&_iUMn<L&?2g}mrkMC}
> z&?yw7fuccx+u+sb+^y2KEO at HGUle=CYCyAGRb-OtZP at FJB&j|Qe)E<_!Ex!rL)1 at i
> z0rit0(_3&>XnZtiYAV2dEXd2*FE={2W)ct5G|gK8%MVkP-DFX-+bV+_n+jSi%h1$=
> zmcZ3}Zp7DSI+5#ymz~FK{SXF(uc at OPjK<E?Dy=r2ggs^~<V9nGJ78t8U|$Kiq1=6C
> z_#L;e6u)EfR?a?FM-qCh551eto2J!g&~fyOsvP|$_5Sh#Zvh~oItmHWE6fUL-~&+b
> zI6;8~-*ny%TzDHB!>;xZL$1QH$A-{OQpf!8o2<jWLOHS})}N>)R3!ZnaWZS9zanKS
> zyX|03ZAL&s78}tmR|@PhVAJ+<*pV!N7fJg$yu|$sUakSW{2>q at g@&g;L;Sz!EH8{g
> z1FT1`j>5y!?`!A(M|ijv at bC?Gt&yO+=lO?TfjBMg3dO7?4b-^++*KL7txZAhYTJ7s
> zP=5mk^%Q#7A4_N2DdWzGZ8RgdVHRxlWDk$%AXxdxAKM~(u5X>-Ed at _F4nF0_3=Ifu
> zr?D<$PlX{ux~=tl?DvCDT_U;%9D*5e-}7UOf>&Dfh1~TOeJ}bQ)T~9NI at tFo5-u`!
> zTh6Y at J18fdw20+A$N4n0vL<mK&;5E$R{^X?mchP!&F*zY at +6_il_B(X*By=2J0f4N
> zEL}M^d%Ljx4Pc($9lY)&;sg+nnclWknYI^k3C4p)6(ycqE`t|CXwFTyby~U;9)C$m
> zwM{Q|)!oB|?X4-R_=<2lR!TeK8 at 3Y_=g!b4o^$Ip80VO(29wpTAbZ{qpi5^#V_$;Z
> zYq7YLtw03(_Rtd5MG?KKHo?ATNpaGx at vBV2v-KSWqdh{^PLriRQ}0$Yktcko*;1c{
> z<7}+Aofaz{Q?||k@&fDKP1C?VPiw0TZEmZ?I)mRpqX=GyJjrgvw?PwwBYUn#@ZJMx
> zGI=isL`0Z#V0TL+nD6 at qtt=J(3?5oNYv@{JppA${5aqjvAhTDs(blITwiZit?eUm!
> zD<5Zkc`kh!F#zXlL(U7R*{(tgg1R$+1J-c4PJspZ8Ur6p>#sCgjMg_5wpcuak->94
> zTkv?FvVNcJEj03kPX7 at PEF4(hlR$a>x3#@bB-o?T@=p7yPWZk|g%4{b)!I}Ltrz1{
> zi2S3d_vfqqhswZ+s4h&oTeU5E8eU6g_9w*JV0M)BzPHeLU%ApM>UZE(wSDgfV|^s*
> zKF`O{97WgRU|>-zTC;-W1&+wde&CW;>;=gzAMt)ZJtjd9pB0e$#$b&=t0lZsUv0;4
> z+ae|l?_f7X+u#lN4%s0XFfPyj?TZ(9yBB)ezRCd`wHWxk{_TZA*fKoGW#SU6#+rr)
> z>rvZ>$42A#{bM8W`_H$AvJBw^kLS%nL?u9WK3!i6j^hJ;xgEcdpiPITo=t*;*ZAhH
> zwmn3FLw+W^H&=~~v50p5T2*>-D$(Td`7x>UA>)Zd9d`HIt+p2Vx%t56(|7#l at 3coi
> zN;l`-W*PC*HBcGasRY$Z&mZDZoq6*pSSqv@$K8<lS9Yu{ucCR>arjq`){0FxB!ZTn
> z!jieITz)6r^DB7GAp%Tm5~8}%NIa&mRV`@IW5G!jE8mx>Khm7o)LS)Qu<qNVYxs&x
> zJQu8hwAq&CQR;lGFYEvG-NUTaiZ*Bzn`gAvbnhW*vrBEKh%fGW?pr&%x=K7n*x at x$
> zW7D)5ZOehBoUkC71`PFnYd(0s50Ei$5^BFtF&6n4X8~84YD)sJh{g=qgfO)xctOmD
> zR5MFoOQp#8>s!fo>~-XF`U=- at q*;Lz;+TYd0MM`454hiNTW&ufd{EyJ_*>ovM4!>x
> z7IvQOit$WtD+%7-YSORsTk2Z_y;zS<e}A|gaXXWPw at Vq^iF~8iX^B;`J-$koVyk4?
> z#soKFN=2>P4d@|ERHCFPw!DfF_qsEK9dDbEDM1Xn6-AN&>#L;eSh6H?XC<>SO`0on
> z7BJ0~F$ALf5x;3OoiUltc5Oj#=YsKPcey`2X)0f9qpR<$ir-W&gRBzWZ)sxiH0Zp7
> z+V+xhl2j6-NF}y%N!d6;ihR^Rr~f3LL8PP at tC-1OQ`xq~og(UbTj_n>M)fI7wO()^
> z+@!33UDEqKNy>V6In_ooAWzZ-K{2 at zGlrx%Et at nejkzbOQ3_6v(0E#DJUvPJa at aC5
> z=i-GfHWXzg%0cC9$yk&Yl;aE at 3z1p^akv{7z3NQDRST_NUIBSJv|MEm`E$c1d8_47
> zRW3mSMsLmYKr4Q#>j%s%=7hJmrs at 9y>9Z62n%&XA_G5p1 at GyMduQ|L(cNr9(g>saH
> zTkBhQ90<U_E6UlnErKWJHLty;jy`45bK4f{YttA<3_pxsGGJ{%njJZZ_YkhouM?Bm
> zk;=*3dd!S9{E=tdn-*vY$kGFzq at G2sHVqoorKlIbquTZuXCsZX5z!hz03PuS(aZ=9
> z@)2do1Lq`0eFLL0CftL836imr2i1wd`J^Ku{o;8IUW9Jws)B`(_7?j49PG*K{k at 19
> z!^72XIrLX>+z&_+hm~LqUuLhLA9V0m&*-89oT=>V75Z%WSKpx@*I$NwtUya>fpjQ2
> zu0jz;hpuy$CPmtmTH23p;wJKib}RaCGzoEqiUK3C3r#<js^5VKKTOz$8dox=AAkI%
> z9X%B;0RGCPaNFYk!d(vrY;8Bwm3oP;MYeDYAKzBVm0+*h4#{+<el;Ig*XfAdb+uot
> z|59}+ue=}!5%JGGlVx+mcFX=Zvdmi4s||`qHo833jmUrQnaW(2s!V-Y8o=Y&Jv<*%
> zJQU;=847&)PHhHux{h!)Yv9w}kUuPQF^ce%6*R-HXLQgE8f8TA6Geg!l?7*N$@*AO
> zB at U6XPtGJDhQ`Xsd9*m9+>$OXTL}uu;sifb*}x-#FZ4pxAcbl%GJhjmv)FJIYv at Bn
> z7)f8PzwC#Pdt at rc{bf3Hb3~1pO)=sY9c5`Ph{l(kT#-8Gyc1DCXq+S4LJxp?$&ZdU
> zYTP_9)?Q<*pTt;0vV^f7tY==C!{~_Xel?>}&@Uol+~R at AM2SknSVkirT!ita$VUyp
> z6_dcfR8k#?odYUX%|r%t<fh at dj>x*re(~W|)Q1>YcELlyisuS+WDV}N=K0(+zrLZ{
> z{KLF}iH<94c|>(NC1 at LFlTBSH39~YhyR_H}6Z(V5CN+^z3i@(YVCciK!F_x@%i;w!
> z5qcI`_h=3WY4%V?WQ#KGc}c0 at sWfx2OqQLKJ&;IKd?$?25N2UZFas&U!G3%2u*A3%
> z)J7aI at sUa<3Vut4DRN#PUxQ4ZMohlbn)%GBZqsVa5hP6=<cr9>hD8Bzys5NBc#dyx
> z1>bvrx8xHP*HEV4!8=l1?6s;jscEp+$iVs?U7x{Y+cF87v4g#>A1}AVQ?=B=%-hLQ
> ztT+Mo<}xCJzl7&=@w`mW6HeMR2Dm6 at pq8xqOrw@Nc at A*?;Fftf%L3;M9<*(dN^-JY
> z%3~7N>xg?>O at PFB;1L6lBeuwS8lUiRP}Q`@OW<U6^p5s1ta;&|rxK0bY_LBT&-Koo
> z5Ip=7U4UqGuNlvNh$w9D(L3;IdJE-SI6p~WLwP4~?j7DakfXC~OC{ykvW-tCYMti0
> zEfXzxS<mFTXwiJOk{5)2)8mFT%W6oLH9+M(dYxZF9EM<E3L*v|J8C!j at nTo2^-O#h
> zBD2D>Fo?M8RDOe6vAe$*yizwfmQ1P>7;}Dw^-e^W=}+Xjp;`2Wa{}%CTpOTQm(V(a
> zZFC)#fQu!{<OGSn11Wnj at A?<NQA%YS>5T|-JRg%jHINHB?2$#8Y>Cvs=C^_xgH-t&
> z{29DRw0Hh8p37sX4d4~O|9Q_e#C-xygqYF=e*fga at Dq86H`QPBnU;p#_-3*qTGLdV
> z^uz at G<s$dOYCu81dItI;WUYeE{w?s^gY`d?c8unwe2)HS&<LNm<VaaO*=O at P>Ltou
> zkRq_x1OFtx99ZFYl8yr&WVH7h+Eu*w)@*qVv&?N3lYyi2>*q at u%;EV}Q8F;oQ$-nd
> ztkJP88#+^2f1<7OwPd%#N`!Y<GN7qcu^}qdHl@@m;ruoI>eY=L9s$;JCCzJNlUaes
> z!CrwMKvLy(EHZ#6OO$C3OEhx&d)T4C0R>&3U6wL=GIpNVphF3HQ~eT--|?T*pN0f(
> z5JyC8VVB>`7 at r8LscYdrj2Vt878&>_f%quejeKmt)&>5<BknC{mtBypNknI&za<9L
> zk0-tGsa(D9)ELaB{@G|pue1jKK?#i~3@?@hI at +o|-h%a--vuAy7j-~VcK}f at sKog<
> zpib%d8$|LRj61!kA1gi&U)0L<>HZSEp^7B{m&IL8ar2<1Eb>|zFh8(KMkp7n=uNiR
> z?KzET*)IkuZa-=qgtl}qtkhDfT-mXeCdxfG-csc%LM^jk--;+iNsT9FdtTIcJXOx#
> zNrycZVnCjV*E7|epvqmP`O<pG8I#=};Ep%Lpr*0DVR4I|rW*OVk`bqMp8kPmtFl{>
> z+bI^Z!56!Jj5N~~r8NLe=d}rV>ng+xno=kDld$3v+Lq%zM5vSz=Txxj at A)BLj$Hsr
> z6Ks?08?+QX7yC_;!6m%ww;)m^bH9rj;oAh`NQ_$aV&#Ee;nzfC(?E-_!PX4a3|%u~
> z<(Og3!~}}%CG!q&9+5~_r?uN+Jh3PUz6EdsKY+`V^-9iLEQsux_C$N*r`uPR+vB;C
> zuiop~1+UE{@5 at ausY=t!ZOahzrvx$&)-)Bo9<rgGDeE??%E2v7ctXjtDc<C|_UHc|
> ztrJ-fM(C9-6<ftdb$j{2dEUFc`E>%m>FTU*ThynPPH)JDr1;aFW#Dg;5q%N)wd&XM
> z%sP_Z|HX(FR1M#RWL0yncYoR^DJvz5JGb;PwjNS|WU@*M-WTq0m+F;L0k^tcPaLC`
> zciz^8I4fL2U(9&U9`5KXk2J!D&kbt;`+<@=;N!^4XOZ{F-QL~a_v=zQKD+KDMVbOn
> zY=>oq)su|fM&|9%Ti=fn%>?eOh4#auXCf9wZP-f??eC*L2J5*dX0V87o9EFt^IAvq
> z%yO9(hAfDi0qq$b<6BRW{&pcO`HQp0J=)pXWnIX49AXAGbPC-TJY}~ic<L0moalF~
> z;J4<00<8 at o=C8lcu!W~t%D~rJrDSN|*RlfW+#%r%?-lbwo#xlDxB3Wgoa)sN0So3L
> zlUt^CmUaPf%9+|XfNCo;&u4ruKx;8AyccrT{@cs6-oWSK5 at 3^Qy#3&uw_-tw=MY|P
> z`IWjk_%tjHCxGFYesmDg+-fVRZs>2 at N+6+*AY}t&wk>l)R)3s9S)U`jMD$|+a+hI)
> zuMwV?%D~S?dGRUA)C5UF!UOQ+7I5L9vxAjH73U3Z&L$d{)=KdCZPE52MlZB{3t$8B
> zJn&Z4$tsc{QyfOvzwM&+rz%Qyx&?aA#1jcp8nBkkZQ#7IbU0~4=LW{Sn~iT6d$1pR
> zQtZGJ+=`Z1^U$FO>8vm9a588=amPzoP4B at HcqqlBnf;OkdK%XyRo?MZa0RZ%8&5m@
> zn9*_<o9tHLyVlXC)heJhuE9>c4fEvSw_ at ay5MOi)MkWD~Sg{{KGS-SQIl^SI12o5E
> z=#{qV)n2JlI1`6xd9a3}IG}o#yBg7ER&DO&?eE63?9D%W7JOA6H0+4t2n><{8TiWx
> zVG>8}iF`y6IG0~!J<3XE>B=Zh at S3pmn>BMN#*^b88UTf*4Tf)!UrW_9gOxRrN(iC+
> z=MbGC19kcQ{|Z=vgUoFU!B>cCD`uoUys~^P`sZ at jxc8o`ahJC(aLc9U-Py33yW`K>
> zT1MBhIt_YC3-$*@U{${I+R`536xGU7%WCRCN1R4X*||pR9{;+Ow|CjtU^cyV2rPDl
> z2WyZu)NA_QZ>?&QbWnlQwR3^5piAjNRM6h?BM-VkrR)rJ1=E4Mo=~&eD&I>vYj*ZT
> zb}#ScMcwh<y9mFL&SYs3#s6w_VC9(Aj=3634TulcylSa>Bw{|9g!xLr&V*VF&d-Kb
> zdg;b at nOw_YGutFZ`x~kisAU+CiKj?bV0$kP&nRvy`fxo_|D*$D6A{by7g7zAmS13F
> zyTl*TB?~aE%&w`rDl!7HT<AihUqX8`AUT^tXOK^eZHtjPbeZw}I6gmUI+%dkrNHRb
> z0t2UY4idq0B33Buc8D+S*?bPUiueRaWZt{c`i!@cgQQ3J at ok$kZBwKrL3f=s)d~j%
> zXji8YG_^$P+P!mt<x=6PouO|%4O`*0Z-8Qn38gQa&LVr~v?<;>u*DwTGzY!0Q4b6`
> z&bt_aGB&X#;qh$!PoTT5 at L9=-iaC8O<gDvJufva9am!qw*$=+KJ4;uo>!DK_-IN~~
> zrr+;Yy!jXdGi=bHX9C|h-~U6^MiF{jmKU^Rv^PSMj$_IOX-7GL1yYoPC#Ajls9iH6
> zU!vyVb?}pzqn0+^)wCW~@>xu7y0>Y=!JL%!EE#_(_)EjzApDVa*ChN+Br7+pf|qcd
> z7xrpHA#a<^rh9K#t#GkQk<8o1Lsyab7NQ;ryIP^)$NF2P=K&kTD>~w#eFevpDH at S}
> z-s`v$*A3Wy4J;;L2}fRBk<D1eoai6gb-`=8SV6fHZ(WPnMu^9<cONJjKt|u`&WbKt
> z at g2&#^j^2pwn(W#_7yj<&o!lK>Dlg;?o8d~x$ofURx8cp_G5}`=X8&waY4&y-32{7
> z)}VR<^wrzJx6hcmO!Y?t77&)8XCwRleakQK<K1HY(SvVM1g*CD+S@#b-lJpCXdQ$n
> zfg^3$3xIQgC4n=w9|&6_R}A<P_pVcrT!1!y%O8VXr30;s;>4i=#4o}(9`Ikpx_1W*
> zTaWK|xn(V`X*x-Ydu#NyxRX!#F)*aB1J`<sGxW9I>7Xs<En5#he+4urv3T+|zgg{s
> zbV~;2Yj@{@)6d^&A*l|};ST;F^7+;f&JUNIrAUm%obz^q4$q=fCe(ol)NSPF^R~Ya
> zt1_=PL#N0>dEDBzfS#(9xpXv6GefY|huy%6cw`1l1xzGu0#1|9p(p)+3b$%mVMaR^
> z%`DN#$ksNPW;z%Q)_Zp#$_4EcdB|)i07AzCLUFblXRwFO)ANi7;rj_XG|5|Am)SHI
> zI2xKwjH#wsuzMovFElFUq>swm at Zxu%`0pUC3V5(zvjZZiE5J@%+u{l at +`S|>cRq`-
> zUU7)l6R&I^E4GzD5<SH2YMlTZyze|I2y&IH9|a9K6cVK&ie;>*Bklz>b@`a(q#nV0
> z7s at y_3v;=w3E3iE{0_E>6j$#%Z$2~)^EF6Njcdf2eMiTjhs-;|*RSUSxR at C4y0-be
> zecw5izh|ldY6GwJoqp8w3;ly~dC7Q%ZA5-JtEx0)OE5XKt5&7F0jqww2~m3BO9RMq
> z&3X659`x~%fj(|!F0lg`0Th7SMXRK3G4-;7K_-L%X3En{e2qC*x#O#HBV`h}rYkay
> zpaU|b2FN9jVvb3kw3ag-OYQS#(+K#@XF9t_Bm3AWF^dgR(p1=Z?Uun6DTi3wGNsXL
> zqmfhYep2N;@*X0$Tt`}=B@>IMULR7*wxiX5W8RmP4I_lD3m*?RHf}$&y#h8AoyO=U
> z(z~s3ogG~<oh4mXWw4}d%V=D<J-caLv<-lGvwqaTi;Xl|*wG{!Fa79__b^r%8|7Kk
> zapj)Ts`1qc5n$Ej62 at 4>NI}1J#TtqBOMe`mu}cD4m!Vd(GH|>~V5z~u?>aSv)?sfK
> zV9C at p2X<-TDrepoJnWrA>nVuL7B7CcdSHeFLqX at fe`2tAlR?keP02X_V8@;v2i}dN
> zTF$>dASHMftMdcMeKgQOWsrcvPTPP3SQ?U~Xt!#_<%U&h|MhM2mp2fuhQ?ELXOJWo
> zoO1>LwaSsD`W4a~Mf>8G4J?94A3ybluV&@c7h1)L_W%D*gOv@?U~>XP-%Tfap!c`H
> zN!Dd$OiTlHwId at i7FT;`{2&pnRmLQ;ci)l0PeSszR(Stpx<Sto9cMSC;K~O(KHCv`
> z&!EH3E5V_Cb%uN-+H>F=wN7m%c`~T4d3-hca&6#6&|Sxg7k5{KzQHpAYg?KAvK9`m
> zTfP=iGRi8C at d(aiTKE7gU8Po2#_C$dJ>I!qh=+~i2=7cqo+vanD#`YkwzB#RM{kMS
> zEjN~UXSP+Y<_xjlXw_h*Co2U!b?;2fv`MPrBA);Y!}$-Fa9N9mrr}fXOg=%(;wjL$
> z&kX#ttqgK7>@Ok94@!WdD%!Zi5oy?7TgqMm1_5OSOsEJIZDq<`ijB_jg-QD=lxdSB
> zr3|*F1YdTgG#60MZH9ic6?WdE+ZMxG>He0{u%nYP1`U;|EUBEmm#)|i4bEKL0eos?
> zg|XC#jA{YxdW+ryzV;T(Lz%H|5ua8>40A0{m0LzvtcA<%V(0ot!jTiShPYMlJ~$eB
> zyD3<u=uMBiWsZTXh79aXsZ843>6g6u(22qpPO!9$1|>Iuy8zh+o&t_u0*kSzlw|Gy
> zos?wtdJZe at sGNkX@U4b~WQSr%M^e2uk0X-wqn@;cAy4YhWFnd&6G?$ggt-lw2+DW-
> z7x24FJF7^$P1sdI=NdMEYY2vlANEddTVCt(n%r5+tK6c)%N$mLuu?W`blMrBG3Zx&
> zZr3cb^T!O~zlty^izO?t6hTXOk<3MbU8w%2N(t!FO7fVt>y%PcIc9f?Y9$%zB+O{l
> z{)oAJ@>FPg at GI<?0jdd6@|R4BN>Cvq at K<r?$tv!81C-XzM)BsJ7+3d^MK4GG5Ay9o
> z2HA=|5|SR95L5MB<dt%Jj7wqrK-&YKw;Ph2%(HIZP7w^-76#uePh(7RN#cn#k~!F}
> z_e;bR1Y!+I_YZ_;A`=X5@#&!1|9$vrZapg)(GDY#^@@qXv&?B16gHWU!ah1$1U#lF
> zJg##Ej$-YTxr|*k16Sg^BxLx$0a&U8S2Dd1rOAve1Y<#GGd>1;EMz%))>$|96;Myk
> zm2QPK2)oEG5LTV}2Gs-EDB_2LM^?qAso3?)12-F1oul>7z#$PGkOCNuZ%xEX+X*}$
> zyERiX at wu>RnL>7-hHN}T|4g3>x?&8T&I-(iEcR;Sof#~Pjq#*uu?8i8<123lCK`0U
> z6*~evQJba)Y(`r$i2e>-Y8?q$B~zTrcY;RAKpk at b@lv@?sCn>^^YGmM-9gi#H=r|{
> z?tIK0-)c%T at e2GoF%zvssfAsvfiZ4mfZ*+rXD#rXi=TqML99{>>60uSVAtU4V%Ypw
> zx|OQGL}Hism@*)@$;5tX!hA^3t#*Rmny7a8&i7T8X4DC#$&&EIjm?NY;D}tkpn2K=
> zZp&X*@CsArQZ!-TG++!+G{L!k%5MR>hA71ogUD*CH3b?>gQmb*MULzjzl%~lstB5=
> ztQ>@+{vjwI7bM<z&rh;~+|tyyZP-Ir^DV)rVU1#?8Dx)%orvIx_G6qS^tHXE!s9s_
> z7Hil}hj3$?NBDwuT||#A=v{oA<Ym9ZdqzKjS9UsI5#k#gk(uU8l3fI!gY4pS9GQ%x
> z{{)VwXQ5 at HXB!{yRJz`0Wn#yG?G&w*seG#uS-Ai`bwOWn05P(JT4+Y4eO!cQ(!^GA
> z>5p50X&1OP!nZpPxV?+MV3y*)MMpm<Y8LWba*>@GC;qf_nVU-%(#%5^bq!H?kf~I1
> z=rQ?p|45#|$MbohKbL|wt<WU3ozDwYe6g_0Ryrs>TkTZj12=dY0#}#If})JE-O%`$
> zr$PNPFijkS9ymJ3cXi>}3|O4Rl-`q`tt>t87q!dN6d1Go>_gSvz1Y8KRgMV6I0Wmu
> zMuFm at cgA+71ug~6S{GV(spB61mxu-8MD5q5{pIo7JxzUx+m2aj4*=%+dZ^E()#*ZM
> zDigMn1vqF!N2GX`aYX*G>6(d-2XIZkGHn;~9}=|SO*2MOR-uQ5&Q<Fg1ey>01yO)n
> zJmwfWdBBYoRz4=a6F!LX-O!Fh%i4`uNAw0rtQ5B#+)CIIqYgN(f5XB47}RnWJ<Z0n
> z#8xqTCL&YF1k;+yI|sZwVsY^TvQ_ZMMUSf1m?exH^wF?)h;5p)&w`8u at b5EAsvj8T
> zn4a0 at d|oY=7ek}L3ivV(%ek<I92s(zeMn*z%ZYc|H(fv;Mr#$DXo1DhG0N&{M3%tn
> zL+`)woA*p3&wcQE;Pd|1r$G%jW8ZpJkzk|Y&e(g>IcQVgnTg6P?Z^cxd;`zRMaz0?
> z%PDiX((^ha-^<rcuba~GyB&XrjQ=kShfH^i!C&aNa#=F5#4}>+XtllDj1?=?{DVf;
> zA*huL*D`2*?T8vk&!CNe0aRi4ygvx}1~Qex&MT4b24Z2Mk^$~|Ip&%;qU8ZS_ywMS
> zYT$WYzXKR97rFL6gf|}(Zp_=zTpY~<&MK)D%jRxnuyk?~9kX~0vimZ`K>Fg0sNd0L
> zHYnol0h4{LfVf()=O|V?W^ZV|TEF9eY5!f(_SanaZ|%R~XYEh=S^HzU&EVjFYJJdX
> zy`mY~ru+3kMo?9AqEdLs;CHpcx}AZC)l4)3#{QH5AL)%&D~-<B?&3SQ&HygHna2bl
> zHT1-f{jC4Uj?O;D?zkNuHmN^7rFMXVeoT!!Xu<fz!m2(Ik^@sM57?-eTG*HwvzrHp
> zR&7kSf=X!gC!nUIt4)wJFte>{ZLDQmh&*W7A>4hGW>!l!-dej*1A}GEBPh`EKkIjP
> zbnd&%#@uxvrqRGGVx4`f4LZcCgbRdy{y}~0|D(}I%axk0<ShO(yvlywSITkC)<BwC
> zOp;+7-%a|m=HmakPn-WZ&?k%0r?|kffgZuaHr7l%>iWfh>5uLIcYp3M`ZM+aTYvi4
> zna+cj?m6CREwX+Gq^!R-W-|xS{LerE(GKp%0uwMRxuAR+TeJRsG@$Rz3BIRS1GA(M
> z)MygH40tx!LP8pH)@Z}~n5RqM-V%7LPd=D~H3W$s=;6oI1Yi~`^c?N_9m?G2rRR@>
> zhFsR-GrX*vv{It_$#8o;dCJZ-exKUT$TLNM8NALAFZ{m5LA1Am+XF5_%&t^^GxR9d
> z;G_ClYI%6?z)>T`hC-`axj at eZAFbJPI2lhg9)gbpH`Xp9hUbKcX56ViV#hBuih|Gx
> zu^n_%s_e`V8hnFci8UB>OVSzfP%>g*k*<3?oujWiuV4e<W3&ewc_QyP=XS7NgMgjC
> zKnY(Kc2ix9(g2_34AAt;_&CR<&t4(>LC`fzy!qf=@}WHyX1>mlF%Nx9Ge#S|sd><7
> z?PG_~#-OTKLz~m!s|a>BSA<&)AB at L9>nPaerRbO4nGUw|W61UK-JOA*8^Hm|(525u
> z8{JqXCeD#(3m6HboJ*q)E(aE-6!j)}qZSJr78V0co at Cx8flfCtwq}uJ7F(AI2!Tx9
> zIEypRD0fmdc)*O{*0z#Y$<Dgi?Q)to!2+VIINDD&v&X&nET}~E)SFLz4VqeVn)0DR
> z81%%0us2)+X+rtq-z)1z^g>1fd+a^;0l)g;yBxDksB8b*L#lMpQuBvHG=kS-%pb)#
> z(AfVKCBf3`kTdNREs#CK|LCA)Z$Zmyh4kFWB)Gk9pq~?n`X_#lq<NPopLZX8YG4Id
> z^GtUpFUJ>MZbehBKzPkVQ3&~4vI=>tyOGZ;l?ODruvd0(2Vas9$d{gBN$~WGgntiM
> zZ?Y!S9W4R!fq!8fEmgKev!T=fme#;GUqUZJJ~alsUHMM*D}9vZLx5F$e#;!p(+BY2
> zoQc_rhfO%VC-^u+_7+edIk;t at KVzfw7C3`gCjUoe at cT)(V>f|L_glaMW+b at Poq?6n
> z4te)jlGF#0H at EH?#801t6|?Nsii4vuOMPeJm6nE>%0`}q{dHq>f35dk$+evhi13Q<
> z;%}Ld&b}44i3N=QqB|AFJn^#0Xj$C=#F|2%stE at zp^qSEN(V-`3H!jcmrd}qiu7+7
> zC||_2vVrFbgWl99gnqf`F=56)T`P=x%!tr(E<k=SuR_mm2?X#xdj23_%r;QhLU`j}
> zUDW`;*gXSZ8$57l&Xup?Yw>C<-usO9y&sNi#4%?&E`56G;OO8Ns*HU&^U7K_<UM<^
> z{+W9ZYNfBO8>nZA23iR_0aj!1FyR)X&S%iN)rhX}a&+Dx$2$beV65%vTbILX-G7}i
> z)cI$lC7XV1$x8=GE>}G8rIBuzHu&Ga^>a-*?a`->M)z1ql>g6<U;aJXA_HbDfSI^|
> zYsFy|et7O*{~U72_W><gHIOIz_c;C~V3c`IV65Xq*I}$Dw2UU{A#_H+p_!3t7<j|W
> zk9qUAB7PW{#~8G6NuvX at 4@k1B4j54jE at Bq0$Bw=vy7zW3qCI+3df*zo*&aBDnTwC&
> zgy>vf{*9W1)@GvjGim;`!hvyf4U{{yNwhL%dzy;_Nwg05yz at fKQ-G$?ZWnZf*7=eC
> zHz{Io9w;aD9TZCQ)y^zl-XfxP2Cis{;_1JF;!1B3yTk#E0iKDTMgPsTGQuCiLbteO
> zH6$I|b0x8i8Q5cB#Kr at 6l#|>x+<^^o$(h_PYu;e~B;uxAj_QYj0~vP>P<XlUUR~Db
> zHsV3Twt`k7twUe~mI#Xodlq<C!elpt|869BI-FeFPJ7W|!Zb24O?7ELu%h7J1v?Vv
> z-hM`~H at F+SVVwmW)f$zYKzd^2tMQdJ&m{`G(9%53mrs at sZp0uItiCDD)2N5;S>Q%F
> z_C76dgFNM=nJ~QHiuf~yTGEL=V14hE9-+LcGlw#q4_GTOF6ZUQQ{F_*L-{H#^%SUO
> z-irMp(RgE0SIp1e;C#SRBAj7lvS}sV+ne#Av1|e&g*f_e{X(0IGIHDMK*_P;(9+3O
> zYzVA)b7GwWI0v!YTqRFLw!NzpNq+)rxLMD22oL;g_J$Y#Mg4g3TcZ|DGklkBD<iuN
> zZ3HZ(E1*q%EEvSNJpnxg?U>U~*;`y^)^;bTcN}!JE$^$w4)Ivq@}}d5`Qgo64E_zY
> z0K?lNJiDNUAT9-&GiEbIw4GTEJ+i6G1w8nRWxehfil)~y<!qGCu&f^Sr$60>TrKh2
> zGCZ)8+Wm-<EEOVKODQ}RGWWcBW<}Qs^%gs7>RW|h1%D+w|GBLi*<?19X2xgRWpNH_
> zhi8arUXsDm;5k%@Yb9-as?w#gw4aHy+xE2nC;m=X*`@E%rV{29l~0D&m2WFS7PIU7
> z_fZ{q-*%>@>jYX-x^*vnV$)5nXI||-Lg#gR?M|xEh%5#zy*L~2nSnSGBXMlP*XKZL
> zW5#g_zNSD74vTbdJCktA+MPf-XuIR|1!3N8Ju{-)(ub(TeZ;R(bm9_2j?(^I4fBG=
> zfL)MQ$e;^+%iwY&Zw4mo4kdN00GVpYGvD{uDn-bwDiX$^52?o_MXBEbny?1FF+sZ#
> zyKV0Y(8HolS;7wnAWIYD6_Fp at vF4cgfw?rL;U3R?P=<1;y-s*yaq|NKlW$h@)kIGg
> zG#Vajt(d($*qg!(p{@^YE7eQginyM&pR8ae5njQ94HBUOJ`eJYS%ExU11=D4+XRJ4
> zz^h_B`~l at I?BOE#npLr`uPCx0d=|~HEr=DTvX8JcrZUcBVO2K7S;mTADs!;<J_c<e
> z&wVZFJjD$LMDtJFvKGJ3qDkeGAt{3_ktu19gBNK>JiHE~2_}AnuNhwW&>2X85(5)4
> z%FL(K$`b6l$!pj?8F6T2&-cU~E-j>7iO>=pHEfd`(Ys8 at 220P@Aeyq-IeMUdh+{=9
> z{I~Y~Nnc%VXFvSZKKEzgr;S?LY5nV^&;>3X7>T{g67?XB#Ev!FGCs~WY^+jM7buf<
> z)S1L<^gQ(Mc765XBuBq{_ at UMH!l5%^FL<1!(5;#oblFX~(ni*NYN<4p;VE at 3?lU&X
> zfa7w4z~Fc$Zx)WmVP$>=njBid&E-cWRk5SQnmt=QX-nuWt6FWxF|2I{L$05U7^Znq
> z|98Dq1<tf*iAAtT1b$AfA-!jL1B-a4<NJ>svK?wTlzGT|DC^K(%p`nrMMUTl;FBoM
> zK*T2DjwbX^#91O at 4cB$b&S%(&u3 at lYi#6sQ`b_jD)zQCYl$J#A*Tahu(3vVG;LOId
> z#CSGUGzBK&3TPG4){3Xa@>Y0Piix- at c4l_R)`OqKJM=8xQ>z1mFe?ik><@*gJF{vu
> zY!?{X`t+eJjMg*Au9%UA>!9-9;(y?O!gF`gj%!(`NhtgOqfjaX53`gPD4<>Ob&+US
> zT?SN4);}MhT_GpJ$jJC^5pTzC08dMyhag@>q-UWAtAveRM;bADKR9RL{VAw93A>j!
> zyvnV(SGnEiYR;?h>Emn=*O(;q_H0(npqITYSur=*JgnpmB#V*Q#-3WIB)r_S<%;&v
> z`A at di`K556=RxfEQq>_TmlcRbVkP_7^SLrRUJ}b$@xV7Hk%tgu?S}+diLs^dlEZJn
> zg5yf#xROa?5oinexf&W_8=XV8M>N;ls)+q>x*b>W{E}@Q#v4m$|Lccl7&A~Qnrh|U
> z8I%(lT+&CUWxQRc4aaXRS~Nq-W at G&poTdNK6iG9_IxZrWmek!7n&jxeH=n%M#auO;
> z+X6B$z_ZAnFdDu1q+F3Y at x>vLiJ{?mZX}LJpxr}6iJeZ7*hj1qV<p-f>D|*Js1aMJ
> zDUc|YvvJ$@(tG?`{#)2pPjvKeh!{_C#GSIDhq8k`w3PF_>*YMO_jFw?)qKu;9`k;$
> zK*w~|na%EZ76>h<Z!T*1tYs`?u)3AGO}`$$vC#O%1<&YSScKSGY*HE<QE$`d2h4N?
> zEpM-yjhaTaRi3r>Ck8hj1f^x1FFR{GD7-q6!-Cgw>7x$AW+nzBGzx_L$FLjd-*EP<
> z^a71P_-Vo15|19I56t33dIs$og_(@bI3jzfnW0H|x(FQVa9}4`;3A8YVcF3Ca!b4+
> zy-y^#P_4?ec*%g^S)PwC2%tD4{a=N@)MCP{c;uFlo(G-mC|d8}D6QZ=vvg?b!n5d{
> z@{vL3yV%pJ!@CJ<Ad}t)&EqC4bBeO0%?S(xUX`)O0Jn%S*uQ6YmMIyp566``_0^u!
> z*n#I%DW>6_E4s~%kG8LXv at J8b%c at yaf@@62+NE7G-DD%WP at L13jbDYnZ&=_l=?k*w
> z!%8~=sXT)(%y`B&&jy?h)gW0FhXJe2!4;)WB##l1 at lUF3wj^Akv4oB6SV;T(V&HjJ
> zsF_t5D*U*kGG7_jn&&zq`Qv<NxzarCSgiN%@*bf`nf&^_-n%-puAk0@;%gCw$Xi)D
> znfWGr*DIwBL;)VrM9_Lf)m8I$a2%TnSN?=4?cZL(l)ydz1w%siF&$%u2=RhJO^*8%
> zyQpw`3UK5?+EED8 at ddz@m1iNjsQW9<W8l4g4US(mb`Rjw)A0k?4cU!<hTVqHyRdP_
> z8;C1obs`=$pAhQwhXRQ>&gSDopF)CeyMhA=+Xi4cE}B#p#iPJq7YQGlx;3mANB{4e
> zNfsx<y77O(iupfc#SY*#;6<IXa3_e*Fxnj#I at hxiXtNC(U+_b?+JUQ;xSEZtF}R97
> z;9_m)QU8LAX2gDoHT>8wA at ++G@kHAL^MF~;pgt at 5xDxpL3ve6c>3#;(!h at g|5)N32
> zR)Do at 5+ByH`7fI|EFNhLC0JL4e%~@rKhDRWw}MtkaP;5*2IN)m at 3Vl1q&=8MF$VSC
> zf_lFSNc2VQZC+MRJr*w2x+wm6t&5K79uJ}|m(Z3((kYB><qkv>lI>n*i^io1nA7g&
> zR{JwpnbG~Cfb`h>K|`v8NHc($b%2&~y-z2<<Tzs-9vc{kXGCj&+P%<;Xz<2(JtJD)
> z!K{Rjb7;&i)*?d6VgL94W1oM;tyg-?AG&A;lt6w(R7i{CO3xqoWB9nyf}=!*z{<Bz
> zcc2ZHy(i%d-45Kfmc`(xLv`u7d>*gCSY3sqT$G<<zhczpQzmaOsDr622G&EMI6#}s
> zpt%qW!rZ68ZYc@*Dboe4?q;l9;B(S;%E6P!+53N-rp<*sCnTYqZp2>c4ttGvdgvXy
> zxo`5oJGam~29;zI&LZLf&GlI$CeIM~2W1#X!{`Wef!LE$BFcV$tkWdIcbDoHr=!)8
> z$OmY(%k2W at p6)J at Tzn9_hZ7exwrZ_7<IES(s;m{_vBy<ct+gjtZIo|99DOrqp|Myc
> z4K$kS{LqZhtiF!GQaZ!cowx!$uYVq9#~jM<I~OQGT?wd5LS1QrS*U3QYAWi3{UzFs
> z+WLC%h3Ac<b{sWQEdzDO`Lm3A5(1e6^*5;V9hXkuhA#}p9SP7Wo`#KLUnh at s6Xu(P
> zo}PzH1izqx;awvvg~vVByQS|e?$Ig%rGxut0Mn}g(_a$x8v&&yTrl3dFz}w;JKeD8
> zWKBfF!E^pl9Xz>(rs<(+fu!J$=snzd=uj-~ZKZtF(2B-{QgO|oK?4(_PvJZ^?J*Yf
> z^QUkv=Fp>uVh?RcHm%g?mvD`8lv{uL(ofW5O$2uhI=0fp?TDgej6eFH1+D*7;EgiS
> zj!W5yfF1W`Eh##Nq8azCxF0icKik2!%!lN;0K47PhgHwV#(p=J&E?SYkY0~q%D`kr
> zJeQ#5Cs^tK7e?s6P;cpX04EllO2aHn)sitEQEU+pTDuhaix+`T{A(zoeDYua`uZa1
> z4%fr_dnrO-f!YI|nmMrk;mN1_i24F7u5`=payKGboZozf;)9^rrZf<(XD3?kIFHhL
> zH5D3c%s}t`Nad-{6G`DJFDShxX at WuN-TgmMdO7eKgjG*f)Bi^4f&M|hsqh%089?!U
> z5~cW%$>}GG&-d>XA80(&wvH{VUVtyH1 at y=gqVnJYJ^Tul7D|sy{L530{<{_s_4IQZ
> zO){}TuRfK`#5wqz9Y`=spw8TQYJfT`EmgAd-c{<)Xfw6;ztLu<^Aet#O11xY+Uzd-
> z|1E8%fH(ndhMah)c~sl7v#>O7SpeEhJXh<u^g+rwGf8N<XwY4t(TF~~E90yP`YcT}
> z(L2C&5>aR(=3<91Kpl<2^D~WEh|bnHV{C2Wm?(XQs8mt<?6sCSL%y8e0_h%n8bPJ;
> zcBP;mk~9NuXL>%SI8|5$pEQ~}+gJ5fTcCSk;V=G;W*Zr$*(4c!c0Q=_#iCeW{Xq=;
> zwk3Gs0;}V<1Kh5S{0+DQ4nLM9i=uxx+CGyB;*6FRik-)^3_fg!4PqD3Z}H5Bk5)$i
> z^{34C5<ZM%GX2llai2W9 at z&s$6{ukby#aY+yl4JVNEPbD<B~m at p6S1VN)B&f)J~L_
> z1yVoIb8MJlkHhp*tg7LykPhK)x{&Nl6-OXP_Z`N%96m6HMcB{FDZUJLDo}bl;-p2s
> zq!mg!5XkphLH+$6G{%|)$}CQO{0#9n1opXxyuZY`=odief!jvZ%LT{?`2?bWQbs#O
> zyR=r~m@;vUK)lrJal93~4U5LU>a!b>OK<6$jEH6P at Xbzq&7 at +l>?^07u&}9n?tqb*
> zH*YsGMpVP*3YH<{wWdE^dN*HB(ipc3{*H|Ykdp$|pLXG+Qm;xexb7x;SNI6>{&FMY
> z1SB_($OE(R%Y?VEla98h@<~mz^`m&|OWN^}f4;J57V%jTO~2EK=#$-6)`qD6OJ{=8
> zT$EQRj|ncQbCI`UUWGiWTy~E4oTmK9@)-Dw<gmGXI=t*UJ at f12ye;q*Nf!nkPhC{Q
> zQurFkQkUZS37|@V5BPk(rd+9R;!O_r%{>9o_{QCdd=04l=o2f-l?mtg)3|>Nu;CZj
> zbD_aUOioz6nGtUgJe6?ObpaFgPCweVRGQ3S#pf)l%zp%)deHr-duPE%?@o0L?u;pi
> zRXRp03)-J*x62s8C;z;SEK}SR_2 at eEZmBVTU9g4xXve!dLMID at Z<Ic+QU<tzF+^RN
> zfO%s?cx>nwh+qGleh{3u#4(nzx`b8>GGQ}%4O>P><o^4NRz{9brSa43*afF)2|x7?
> zy+`kYmj?RK)wWce%yy#>ut-z#pHx*&?blCH`*{i4O0CZzt3GipJ3_5B?9sk-!nf;8
> z4s6;pf-7h=c6>-PnElX66Ep(DKtEsc4uXt_l?q=1!uO&d$s&B3JRcs52PC=>k>gAK
> zKlD$LivYgl*;NJ)mO*~EqKh4Y7ggg9PoqO`DIPv93TK&sGvmuAq*l|mfiEM{-$>H4
> zLdw_S=)GmVxYWJkG&qfrRZGD6t^QcpOoO(6e6vPnr2h$cc at eZtr%X3MjUANJ7;v4z
> z*ZXV~IRU;f0=yCgV83KG2&*kke;jM4tgoDOjt9Uc(h4E at I$*?j8?y$TEoN;rPt%|C
> zRzh+H-VV`VQBte|#7Th{D4q4Vw`JhU<{(8jG?z08n$dE$+J&fV at vy2w=4Ht6I?-a8
> zqRHj``hvh#iXGywI6P=cLc^yU+C_ru>w?FX(jlZFI7Ynyv>AR6!63=I_(a2((GDD<
> zQS^D at CqKW7Amr;Q1kvdKE at QlLAJntq!&D0E3v~{n<4=bTT0GAIoZ;6InX#L25ppzt
> z6U8jHH;r7Gz%lX6$ndjh8IwAVtUq*g#K?+AM<F9#GvT6oBZl)YVCVi1BQo&9Wh^nr
> zhzv|eTa3uSxGQWl;sLXACLAy@)V98u3cGFkGW)i3`hK+eh)UX);rJVB*g&LH=3%mE
> zQ-4)_)t~Q2{BAoi at BuY5MP@hP=%r}O?+c^ls6U~~Xd4}EGunou_*GZh7JtUb_UA+<
> zqCXwl5`9B at _fYM?(SI5(#~acxqvdquy3%snB_pOWuEoSg`+(LSH*mPd!Pn~!<Plia
> zwEpnwrn?W{(sa+^l}#HCS2f*x_$J8bY=@Q;&55TKK$Qk8DPT5l(PsfexMAHes6|r~
> zn<tkeTYWR+NX=8!LCsUu5zPg)vKnhg-izi!*lGQ<dHQyn-NbCr+%Ey;7^BZWycA^u
> z%1V^UC at BZjAe7gm9E$P=lp|3tLz#h+vOA4IS%q>O%3q?KgmO8`e3Un#oQAR*<qVW7
> zP+pC4CCU<%t5D8Gc?(Jh%GD^Z)#p3<UrGh#zj!9}J2+0m at pW{3_-5R{QJ;_Bo180I
> z^~{EBnU9<KST;sLUj&)7rdr8HfW}YNYWR_V9QokLKaT{Ce0b!eBd3r2=aEm2e0rqq
> z$Y)1BKhl1r<4EU`FOGb9<f|iRj(qLtKky;`K=)x(UHZ7<q$gqPL|=d40(LHuEqhhQ
> zdb@$$P4V)SwIgA%j at Uhjd4hPExyaX**Y{qaKzXJKaRKK<uQA*Cz?j*I!@ntFV_9Wt
> zO$455MUaqXa}jS2^H2HunlAh7cZY|HEaOFutod2&`>>}>D9RZxQmy2>!E+&l?r+P4
> z^@zEuT97WA^d`ib(6}s)f%RP$Md-f25PVUB5mEGNiYOYeat-gEf=y^^pbI@}59h-c
> zQ7dQhV}WUg^gg`Mu9#<U7~U1Az_sZM?QAg0Ik-Bf{um+x2oB+z9X$^N>#-M>4wM at X
> z2x!rS=gyt9`U;*qzk59*!AKmwjVYV>U`Owke`y#IeMw+2jmws0kR`y|UDP49O7u}y
> z<!Uo>7y?JJug!i-%1ZYtv`*}K*uaiu;N)Mz*Lr7s5q>FZk%!eV8#95O<gDA64Ucb%
> z?<LAxA0zn=^bhg9qOdp#v$Vt4;+slW at zs%Mu at 0ovg~<wRc(h#KMd-V7pwapM6C1{?
> ziCYm_RtY{FfV^M4;7s21cUX7<d&7=Cl}0tZ*O{^D-81Fgy*$eyWX#vjhxbye9R1<F
> zsu<pj45 at p=OMYz8&i|!FyV at 3>72I+;-0U#2*P%?t$lmHJK%4gp68O&ETK`#rx2Npq
> z!!RGi+ZHlp1wa&|eBXxW?qONXrlizLu$_o~?p`JHA;_dzj4}l=P{fnDEmqJN7O9Lc
> zh5l+pxdLzE6gF&OCbDBrfiGh at cOQ@S3`TrE*kLvb?Min-yQ|xPt<UBJY<&W9b;Tpj
> zl^78F>^+aD@&S`hqyLX9qX?N=Z|!{;y_6P2&fVcTf$^b{bFj~E3jafm*P8;}G$spA
> z<4g?yBP>M618MAvYBnFL$C#|sf34r>Tic)HTd#W$J&c~xE~-H``R~te`)|)aVm#YB
> ze><LCOnav>^Lzg5bC~s~2nG!Z1hm!ehfgk*BVn_SBYlbXy%AXl at Kw&ztP2|yL|K45
> zEZsNFo&>p!d_YKfiVq>kHG2Pd4z0bTchUIp-ysL;UDO50+jx1hgKcDP4N(TYMmwJV
> zsU46*nWFteTb}toA9YXBm%t{%YQ(+eh|$c1-EL0fHtil*>|oTt{{uXQ%R*<%p;qS4
> z!!mN`^7GzbcFn|j_QJJ-9cN>@(r^}!vukmd&}G4y8Bg9By4rdE^Y7G*&Z}Tu*byqk
> z^;x+75uPgUO2FA9yfX~t%!O-9t_^;S_7sHP#Ca*MPeFMju9t8t9~ZhgbQtFw at b<HK
> z``)e$oZW=8dYs+d6^FB5;_MeFm!rH5{TPGeTTstPl((avk$l{NBnO*2nCI$Ep@(qw
> zK0H~6_kU-!<zAfKkE<K;EHI&iE$Rtv!ujuT{XUexU$|EJfv#VBHnhHi*(dA0PR8c+
> zCoVDx5_aT<`ct+PE>PC-&%&ViE&STROlrG>Esg|+!II)4GxN)yL}2A_!5vxHAAE(r
> zdyuo$!W7?h%y1sA)s@@jU-HoocGY_D^Y6kwn(Z1KnuWJN1Qb}<L!n`KzEuA+!+vVK
> zTc-aR*SEIBm9kYfaK9{+jU4XK*7>IS?#2^zG~KtM?N>Ds9819yxF>~%9Duhs`T~iE
> z(O0rAecm{Vgou}6zqkcgw)IJ9*E$^4`KE4z93GnN%ZSRf-NE*qL;LCgCxu4j<eC>X
> zK2DuiZ=zfUxH=E-+!_>p>*>4Bo=so*HuzqJFLXz6Helf{r`&(Y^Jw|xlKGu0P~UBc
> zWH3L)f=IxFc_J6OKr0IKm-lRKz_q04c`O~<!7)Foe_Ua=PwuZcHQzJc53cLpNp9I+
> z>YIwM76ssE*z#*|jI&gx<~Z1-ME|tFcMNd<b!OKX-`&8RnMUvKfrlEdKDU9DF`MsI
> zUoVgG-K}H{l7e#_%=v3XF2xwkzdbMtHh{gwL)=PWC at gF&+F(RA6?tsWAF&#fuo6ig
> zR2GP<Erso6eBfeVY~VaHTb}K+2fpL6;SjCMxg45)*0u)}-m+zO<jL`0IaWXY+3_Jd
> zo}Jk2q~E2*pxKe}!gD96J6IU7QSccB(Z at ywudlKnNH92X%8M}$f8+5t0e=%gy at Rjd
> zt%wy#lz>k$wIgfRlh0LcG^aefq1ZHh*6C5mK|Or<EacPNvl at m@$g{a;_Ta*MkO5(%
> z$>Pn|&-mf}U$t>!T#LnT+gIpdYJnyNw>tW3VarP~agg6&3icC7-UfEKCgAKr_{#I*
> zQa)(;IjqJ6{NC6#eEGSCgzi-QCUqljntW9t9 at l^0WySBtu6SJ8Ks>?ao8JfSgKtdl
> zqV3_MxO(Gh<n#%|I>pa at XH2T8+f2`#mQ=I8CxG3_o^U$BA>1|_76QY3tP#=1c9+$~
> z_=I3{03IE7NdIwnBJRfdSiOjMpo at TZKgrR1?dDn;*%M*Et;+Rt4XX2QYI6%H4EdMu
> zPeZ$wcO_Fx-!H`R<Swi8+;`_yp);wgJg^YgtKQEF%s2XwZuDUUt}TBbvEk$mr;9_-
> z7xMx;=u(vBC}U90MHw5&GkP$=`}^I6&?)9(ywaKrkrRG8q^Yv%QvX<fRipvjNh#>V
> z*!_jgz3?Ho*;A2Tq>RNjx8f`wX9<B=P;xOWi6`yeunqm at 4t)aA%X9 at jGDT@-nvLeE
> zsJ$RK5_U?UFJbZEf=n`1SygANKjvoc688!k174vcGQXDH;@Wn!&(xg0f7g at 4?QSlr
> zF3-@;n65!Z<^-Wxrr&xM6t}qPa*_FA0cAgx_0`6;NI<8$^hK(yu-!znkxt|kb|OIj
> zFF!}=n!V at 18f6ve{Z6G()oK-<<4Xh{k-K7AN{~ZauWNTAvfPf4ei2ctl`k^7&QguL
> zU(;u4r7cWTFfy~76=)zzp_ei3Z{1y9`zv3eQNuVuX|At;ccjCbotapnM?H$@-+FN~
> zyi-AaPYzgo(*}-hp*~+>^K9oU#+^jpL2&)0z)F8n%qnZ<yG!iPFbk-2<%^uIzYp{Y
> zzCWPM+u<!eSQa6FNINAtT>@pha0wSkN<ch}{s3eK3CznzWFBBFvw at j1H71a>KruD3
> zFGuWnsVmJh6?rF~VN!?O6|W3BAhgR}wvOL)+5RvQS4<tQZoquFqqyvb98aj;y(6P|
> z!3{Z(1c~LcJ&$Z{DRvy_9oW|rJ<Mhs_Rqc7#bGb`C($*Poj7_A(w289IxVDv>pC^y
> z*%Q%NwbG%YhIEEZhnWsG>_(?7GFA4SSbmnvUFH_oTaa#e=3_5Y77Cj#ouZbsp2<}i
> zd^55_W?=c}RY at iN%ZPAm)tb0rsAIZwGU`xjGkq0R_DEcd47m(qJaBt`2}PmvG(>BQ
> zoO?4V at NuPy;u0sscxQmiX2Uw%a+M2Fkk%w2rX#1!qDx@!i&!IwkBG=dv1Fz28z;C8
> zngh?HfP!<#Th~LqZnoJQxUhe#ge>OGae(xM=6FCl>`M5U=0vBL)7r~HZb!sCZcb{+
> zC7Sh`gU-j9rD{!VHa+Et{I$_}3yarmQYw#Y1*bx}x`|`KOjfi(Gl^)w!1HHBZs~>{
> z3y*J=j3=b%eS9<4E^!9fmpJ61$eb>5(Kv(FmB-^uGR~l_<=HrcEREJ6<_^~6gguwd
> zg$*&Skr7xMke<MX at dZN`xdc1ySR=xF5 at eD}pM;3)b>X{_$$94q#GZP1hrUMDl$FeK
> z!h*A%lo{;d9jY}n#4W>8H?1yaN2?kWvgZvhTvuoH2(415P at B<ZJz=hul}3)(+wL4S
> z&e6a7MLe;#H4eXbwVDvU-E_jNNz2d+y|!`{7XU-|QXJIKJ6b$;nb911pp!lay>AC~
> zHW{3m2zy6FISpAmySn4^4vu~cXK$+Q&iA<N{G7Xh(=rfOLhd?`_@@g%L&j5N0o4kP
> z^*+ra4iZ)r{cWc$G!7BkzYlzFJQ=4*BM|3MpX^rrcDmjf?7on<MIM=VLLR}-)GDY~
> zc7DfQfh^#I9 at WYQ35lTxv>=s5qj$nnfvqYUJT#`rvMYxCx6p>R<>vw2DTqp7L{N0Q
> z{5HZeikGE+F~9p<z`T$7Zw&PEGnMGMhiRjX=hM|V^xTONC2Rd;;9I*Y7meO+gB~^O
> zfUU?rGUh;fQNzfX-7|E=JVvC~@yJLs&n?3rY(7T7bznY^<qKhv`ybG2Who!9)LNJF
> zEKA+-JuqOZGKi<bUv6;cq;6|xF8*@5t*b<#R<%L{4!S~(D;oU*E6SOK*hY7M^>B5d
> zD}2G=j~&DxhcBoxY!JBC{y&~rBu1W~W20?@xKuRw$(SPR$QX)y4;raHd?C+Lcqig1
> zAW!D-Y2-0BdsN}_eM#Gd7n0ic;Mx?>3JT<%3-w9Gsl%t?%G6F77^BM3d*@2fPjPyu
> zADPdhvgbM(R+-3^P<W^2!0Hg#GmN3f<w0c3;IMS&;=|eCY8XRgX!LZYz+ihjZpTX)
> z1G6eI`(}835r1>#+?^P(;rs=hC#V+K-VEjy=<#o;t#w-Q?Zc-9l8Fb|bO}$u!W?3M
> zJHH-JAcybpLgR at -SlCA}2e8jaRI?nk%t~+9BhMN7OFb;C7d+c=R`}-k;SAK#;pkug
> z9^?@zh%FVXKfv1wf5Ss1p7LGs_<d9Ag%_p})(-DoC9=7sQ4h|={)qTikcao?{w9!&
> z at fgvm1t09rsgv7VyO0;1BsQ?9Jp&xvzvjTen5PCm>4e9jJhIzdC$wv-1vc=IBB1?g
> zG}d)S8|jT*un~^dp0hE~Njv6^$O3AVW1{76SUC&-4t at r(7DW_08|-3Iz)26;{g5x&
> z=V<$tZ;Af6Z>jEu at BAMPnc<p%t$5N>#TVnd2GSRbs41g{g6R7=dVQd-am4>VchsO0
> z_x;2nUKD=h51*x{7dlyMr at 8wYssqOn98-O{IDQJpi8wanxCUj`LTAY+Zr#1!!9*T<
> z9akpe&Rr-c;ZE}IDGnyB3mw4uUATS$Zzth+#zLoHLs`AhsYHBt`=%mG0~2l!?Z&mo
> z at Z1`dhf!`p`8z!GuiaCDJMRwFgQi-EI<m`qF0bg^56JxrSJLt1pKuktWmw1Yt+-~w
> zTmQgYOyHq)I3J4ZYf;{e>nCUyHoYIZ1?QgkXGY(=d at G)K1Xnnoc$M018Xc;{`R?~q
> z at cZQZ<MF!__Ykt0ZNmM_f2jzS;|rJnvLK{fgsiCIBj8HuK&hIjBH#V5+b;^-jA!q~
> zGrcRG3?VLzF-lpXarizHmxab~Gxmvc$EAOKkA2)-Jo47}Ax*sWL0l-^=x=r?jp{#m
> zBxHxxTY`@~%V873>Ozp at i*)o&2z<(lL-<P70nEAn=|wl?cG17-i_sg^k-<ja)QbY%
> ziVs?gM?SpA2`d|YzUojD50nNHp!I=W5Ozo5n(DxeJ~5bOw7nc{-yE0$>ZmY)7(8fm
> zr2lV$aWo=gI4}kf4(kgs780WM3UkBmZ1H^_p$(k*<(&j&fi$`U7`+EDx`ANy*o%f|
> zz#2fRHSy5wq{J3S at 8C}%^N4=E_r at f^s}O$PfaJSq72hxm at dQa0ewXpP&d}{4)l<yk
> zW%fs2SF8EvHuMtr$qI)c^DxG-4C8nmR&G3KP9fa{--=6L4sV_TN+BP2s-d}8DjOhB
> zj|pNGAaeE+JR8 at dL28sp+3p;dUwr{@wg+NQ*q}-19rXj`l2TtM+SW-liRu7NlHMYN
> z_J&nZGwfNK!FjOi<~UF%7Inm9W1Hjmzk_3|-39#!-T)1*5kAphKs2+lj@}Vt$ae^>
> zt){mAJ)*_!=iB}J-TRNCeaQoQoBd>?^W*nMMrGspo*@~BKHzXvHjdeuri#sl at Vq>U
> zwm$0-uE at uult+~JB+d}|d)-=@PdSs_rN9b*39RrZ>QCt#+LELZRjZLJd8)4 at IKx-!
> zGwHLDpXOf<VdZ}Y#^nu;gj>h^N}qEpE6rq0+xz=BFkUv&wlKst_nY)vfXyxF+n{|4
> z?CsG*%?@lQtb8lH7qtmk(ZZ@(IEH-o7I>9mEMc$RM{r^SUV_Jf&*r!I9PssA3yg)#
> zUqZa2|JmPq*ct4`-B_W|uJI^%BNJ~taRrlI-h=+l!|1ty)9u0Eq2H5fhVv{uqj^gG
> zF^VWR)5K&vu?DaK*iRhR<1W5-X<3C8a+p>pW0ielE94%g{<<w2xe?X~mg14WV{Ooa
> z0)x&$gv89STT3U+l27m<qPUxRK)?OI!f%2^m6I+?T{t`8@(9Xi>bnaZ3ak|SM1oLX
> zU6m{#nxB~9gA}3s6J%JhNin-2tB8Dz9)gyP_9mQV^hV*38FB-*>MPu3fUcAlemptN
> z%LKrfy#JYcXpjLP9nG2h_t}vls(uToFwUj0hA)j3rUOot**VR3;cs1)&6??p_x(Z1
> z5Txa2XS=(G`4WBaD1uvp6y}@dy;~-ACHqeKu9;ofd>=-9WATI=W+9UPOvHCxye$8b
> z<7k at +Jn2M0C!)%t#V=zI&uCU0m)?h-2fcIEy1?s*Pu4tltX&7*{iSc+?kQ&`bS;X)
> zR1J^9RD5<(MLqpnejC$YgjagI$FaPJw|ARrs{=)|ElcwQ({NqJ^+%Djr at iYUu1yY1
> z at J-oM0to#UXOjZikV@#-oq%~}+^&78BQVMg6;Y2jn$nG{!Zp at F%AOf|Ehx1l-xP<i
> z;1GPvVj&9>7MvviBVPfIKIorS-%%G^cT&IjTo0%tAK=KtCt&Q`;qxj#r};|u9QJHi
> zpI$VEjUf*d at HELqavH15XPZ3RaTOU7vHD9&7ss!!- at 9W?;M;9`Keq!%AUAkRxLjtu
> zZQky6d>)-4s{&#NyhkwN1y=)H!x|W1NT2lFSx4lK>aVdYcNh3xKDrDNdy3(8oq^$x
> z1g3e?{H7<T22y?JpPc3^IA+x>ou+PScA-2oVD7Wew#YN}H!3E}bTrGe?P!Y63k*CH
> zb_27H#_mX2G>^r0n!2o8U5&}@h{85IXHCiM4e|`n20Ss-Gat{+!rn0idFT-H3~gT3
> zzgsyg^g<@L0GuAM(PfSi(OSch^W>tx=GI=7ahWR)w)(+9Pv7Lgcj39<SK47aVb&}9
> zl&FRnl=3^iS-#hlM+M1OtTb+xd{--tHIlFBjJZov=YnHc>6=ljARm#vavx8sY<#3g
> zk?LZ=<6yrV^n_;i%}|fQOG#8U-weD{7KNkQxAkpGPq7h)z%qD*)5WS>rWyDubjNL_
> zeRBgvRclOB16TQAD?RAl-T$F7o6Lm+twk9e)^G3y>r+L?#oztxTZ7N~N1#1gU^u;F
> zY4OcIP*TL2Y=LiJT{@bZ0PUC3bYK%JY((d(Z^PnmZosToU_H!Lk5Qg9VEJ41=dha|
> z^34FZmVRKanrOe14}t#u+wdEJC5BZq378br8deG-DB0F>!RPP^N`qN)o{wB2S$KD5
> z at V=;QU!UD~G`P>femhjl*2h+DjFm#jdK5~;esdA~(hFLWaTWeKXV*Z(h6q<U`qtQu
> zjshN!LQ*ps_Dv3sDCUmdRsRAHy)m{I{G|-q)uCo6umsXShE-2W@#qIXfpjURZElN2
> zv%wA{(ZTL7LhPnoXupvi32+KMzkahJ%l!*e*dtCrh$kB|lr{d5lrK6o7CX!c$g|d<
> z9NCOG!TaO2aq4PFEE`Kr_3OE7mY_+q1V#2CTN_*B8%pc+X5^9{-4KHB+~~%EcOMTV
> zpe45j*V40yO>APnr8_9^Y>o-`|38eq4O~=J{y%>1ojb$ue0dZFWq=VMQp9I0!pndt
> zt!tA}8rg<v_PAxC)$X==1}=(9WQb^GiYtz`5n_@{4_kw^hOKMv)@+XyjAp}3-x{<O
> zX=48G&z;e2zu*0SfB)CK=AL`bJ@=e*&%@_@&gT(Q#8ubm945r?M*4btIIbJcR)J!!
> zV~2=Vj1$P?Y9XH2gQDNXcb8uHaPr`^GRB&_GkuV>VYP~E3J1k(qarKe4Jk<33>q1|
> zUx$!#JPF@%Bas9CvnQmflc4pTz-sFZbkaw;hg3^bI&vN26R4J89UuG%4%eaK5lvb<
> z$Q~)Pc4ukzRfX!SzEWRJsJ``~`Zk2>Q!m$t6-IOi-B4`EnvOuHk(^ZrW9S3|-lxr9
> zfn8xa;Y$ahMZ-vcV;X4wvybO=8$gvu3cQ7gwnAVCy_Cl`uHa;isrZyIV=x`^f)PB*
> zqU)%{4&8^mInGE$zf-Y8lZEAga^~yT{g~;@ChT);c3mIn0}}kDogv$YRF|vQodQdm
> z^u|$nI?J&a+pE33 at mVa|t_Rh~=Xu-Rr at d>e>$92gCY_=K{$9)poG$%EI9uuQHM0)>
> z7FIrwpA}%oM^|hb^-E>;lT!XKH+%-!n@>u%$e3nk5%}(-c<;B4XrI2P7=AKRV1+Z<
> zb3>WTVhdsp{@w`-FZYeW>>qH3UrBwuHrq49|2A|UPtsc|s5YhSkpqrms;@hdYF4H;
> z8(~8j7Ij7~Tnhiam+PfE9dqFo>8nyUq0Ltf|6v(`i^lwfB}ZyAF#=BjAAU>>NBob$
> zxY`1YKzpk0$-nl+<LZ3qkH&njJMyJ<D$he3wm`3!5$0MV!{;`>1 at DJZ+ws;5gL>RO
> zj=NW|^X#YA`rk$#lV+dmMgM)+8Q|Li6a<m&^}g%LkZ$Bl#UkEXY)YF5+f09iFCd+G
> zn0tEwZ$WQlpefCyzQ3l!dog$lxbJUH=<D5gie`@IozlQy3wRg9_lrnt>JIA|Co?`m
> zyFzQcYNmtawP*Is!#JmQL*I&--ivIRf%6JvirFY%Eiixmxhl`J8b#h~^Wi_xG6R&+
> zRMNA#b_J6-bb)&cL5a;r{t;+LGHH3S5#GObjKe;c<^azcHKyT&fmU7f9_qZB+DZHv
> zKvFi8*HiAj*iD!uyLS|9$P)HFHt2WLk<l^E!oH7mjAkpq6)xj1DvBfATMn-+8Pp%c
> z7ZnRxOGGPP?2h!<)a9OuI1AhfA8D;5;oei?_hSAP1Co)y3`@(k;BK102?n$f4!|x&
> zuID-2z3|$@o|6h|4)=T`PvOyuU<z-r;w~2Q$8p}b8*)MQ3U4TUbt+(dOdZ}8V?h7X
> zBS%6*F7m{C_9M-RTv6W6S1WNJj+`SJD5n8Ajdg`61N#HwVaOGaHxm&bDe71+dO8|m
> zpQ_+426vw!1jTPCoZrE#JYB$K!bpAsCj<7|uOZ<NiA4Gu6?UoMO at 0awJGQ_(5uuT>
> zs*z|3tBR3K{9%+Ije8?P_+zMwj-SH8F=+srTNNem=HYlF3eRN5Yz~BR2)jg?e}?uY
> zG>k_|Jnj-z$Dw1`dHOsrz&8{1Vd>6?M8-bM(>)Wuz1Df2UC)z-qPJyWmMr3Tm08%Z
> zr_29WM}_|?wU<?}5uWkzimfAE9)uFS*yO(UFuqUMAZvXc9_(vxBU%$lEr*Uz9O}N(
> za`YkE?%9Q2r*>1DA4JcG+AW&U-cZ}M7Gp$^FQs7tazY{vZ8uo4lcV)f)Ot;$Xav6U
> z!+Iev!4~cup!T;HZp#?51Y188iT1xpb7rX6W;!yLd~SM5q?J4g9Nbu*=6MI#(U4}J
> z2TIp$EBv*o+*hNTJIB=bDG#R^ddf;nknGNg^$#a|AA at vTMkgeXrQKZTQ?WBcE9{Mb
> z2DQRo8v_|wO(*QuuS0X-v-YA!0rydzV>)+qq?ZOp-a;B3>f}M-4+wLBeZNBITF-dR
> zi?0Hi;5)>aYW4LAXiuh?viqU($D-4QJGjXbUspM-CT6mcd=H)&VNDL!Li=@%H#kL-
> z{<W~W%EZNNl&e`0-$- at J)#|JB at m`l at IjcneqBoy83eP<j5xGP*s#@)QPK597(7K!Q
> z#z;utHB&oCPB&;3^{Ey~fK_A%?`wH)A?O>@4Q$G1xsZGOVqc`Ix?kG2&~>NVi1?R?
> znfFDxR`zEg=GqsnJzW%fdK$5$eKB|%4_W6(mdj&4iw at PBQJfn%r|wo(?0~dphuxW1
> z*HxEWez)N`l`0mpFI3ZCb$mG>?;S3)GW89q>ErD?k41<#Fc%nb?!ZE5LH{XGjI)xx
> ztdNV_P47fO4|a-}!A=)5oqISDfMmolyl2DGexA<Y(ks^dRHy!=q=@n;-t2vp-XETX
> zFVFCdKQi~6jbIA+o<c`@_4+p^TeG0CIbCQk9WFo8nbx at -Yx!e%6!?fV!Bl>nyl${x
> z8$#0W38a~bd6b5?9>ZHN<E at uF)1VjpF;X5!O2-?}Oe}x8BO6fkf747fKtD{=OoWsv
> z?npBc=Vt*B0$SU!L-M^E4Sa67$A&Rlyj0%whjRk2_Dlp^wE30bdd3qQ*|e6dG<vp-
> zmQ9~#fq(Ty%VyX7{xL0eE?0l5s4!Q{ldj_a<d%9 at RX_M>7#S0fSvXaR`PbMC40x|q
> zR))qVIyg4cr=XO(wBC(USmKC4 at s(b5K;vjUNqT!odp`2G at uURE@`W=B*Dsynp_q<h
> zb^0dwHemk#XsgVIa8~&dwsdDTE!efO7EP0qn_%aRINhG{12%pXx)- at DX+Ss`&X!lj
> z9oKPaU5SuWg1pr7s`%sJE^Bh2M at gcb_u-tcuZwBa!4vM?qP{M+QFKa;26zavqSQT%
> z`R}sbVQa=1Bp;dEQ~32N_?5COI;Y!-Q^}1>FIKJ03wsIn(SqlaDE7TLq-)V98q8s|
> zeuq~RU5D-ho3Za?Xm{&zW-7EX?S8+lSuKQ(6ccjn(Vb>r*c`eW*_SGVHDg1Qs9LVS
> z5qzVYhBrW_9H&N>3LB3R%EcK5UayqAk-9x&TZU7olyoxeED=_VFv(Z#AZ`1UqG`<R
> z6suM?C6;wD(YL<LzyiJv at LoRb+h~p8dfz6i6d3kxw#G708rRSD)mg=L_f~~f-7ru!
> zV5{om%XuH)Q*EoV`JS9tp>tnvV8(JQY`=)>D?n2`xhO&R8`Kk7y~U??kHQ`m4SCHR
> z%bK0$U6(9*k5wuU?Ysy)P~`oKs at OHqC!1oK5oNY^1p=1tvPx$v-iYx<(mR27d{Oic
> z`}cP;eBt!g at H@VU;9Gb;E9%jvkKq#`nVpB8$c<ux^<6I1?XjG1G+Vmb&C130Fn3hh
> z%`5;rK6jU!bdt}2-ax*(J%PuaVLqIo5lcjD+4j4KVl9ig;JS<J6x|!CH$mH7iBgTe
> z+G at SesQ8(of9dg?Z`#Rl9uZS4C$^Z&ma#xl2{Zd at Zn#czoo?*6_;h+;0m at O9Dg}77
> zH45M6TUhzj9?ON|%ESN{gamPpPe5#Kp{y{Ugfvl~#d4(cY)ZGjaD2D0`Jhv`@$VZC
> z;+rDG^UP(r_%Xhs+t8onj7HnZ<Fd;le{6P5yLklcGe_VH$a3^)Ep4jvf^GW^b?X9E
> z-#GWH8Bg1QPv&$@f)t=j86(a13GlS}86Zr%n&A_Zrn3q0TY+s<v%dHb*yr)5Sx-_C
> zD|zED@{MAQTnX$2dREYNH{c(ZRLRD79!kn$4<{wC$^}e(qHG2aC{y>q=97kbWj1}H
> zl)OfqSsU8(nfK8m2REw<&2V;Fj1j9 at ueg=<!K;aZy)ELrIy_Cyur+hcb=*%<W^q;(
> zoU>DHlZrAr&Cu{lap;TUwwSrjspIigS<1~0wrja{F>exz#7K)(s<e(+7qBc<D~0LM
> zIzNwo%)+dCBF$_WlWV at dh#5A0SNqkbOs7<fur{-HY`I&|tv6A>7MpZ#%f(vs?M{O`
> z4JoHB<7&;WLU*!df^4o{|L1mVhUBtX7p}$kPN4ot(6OG^j=lbu&I5lw^wv2 at kNsFS
> z12bgmzJKe1qrg3fF5>AW$-v1+upVJ}3;BjMz^5xl!m>p&cNmzJ#bfm*D2r{9_ctFG
> zVQ27q7Nd7kY!2mZ)##Y+{Xu&>jD@$@@b)-1P6}fZyc$2}O;tEcsOEe;(`@M9eiNGy
> z?bKdnQQYOW(7rejv>Oge0<=6&hq(<(3`=-6uQv*JYjPQQt0LLOfo1CW1~;w=HHKn`
> z_z>E;Lb{ntwZ<m$vg;Nf;VZ-}_SvQ|+>L8|dN^Nsm at 6FyOTssi07`)Tu#`L(+`OsE
> zX@?OKaB1bWkt4UyQ7m~sZ_T&ZpR=hPrtpNFS7R5C*S=-0cPiQu_T0PM{0(O;mF;HC
> z9(O~ZlGU=LNvO at VJY-(0^yW#Jx$b}MD}nEMeUI{fm{no|^+kDYlpWedb1=8Z;}no#
> zS<Nduvfp~?try>F1)PotZ!m$h1U<KuG5EyGjaEGws;=o1UXS_u7IZYOT6Ruy^@mIF
> ziLuNlLATTUXd>>#WPJN{=HB^aZxPq^>vo=O`UGj?o=q8!(#FyxnF&81jyftSacnle
> zB-3K$X4fCwVqL~?6wVWqHi@;SS}7i-yxQ9NBI>J!W{&~dQcLOSYgdUSd_`?xVVo3>
> z-f{0-1<NbURki)N4)diy;@Lk~G8A)T!?Q<Sx`x{~UGI#1_Cw25hq>`n<pzI5ZH22s
> z8P~{)t>QyP8IAW8O--y+E=l3a#rMxB<KAJe>y;%Z@?9I6O8ZluU2c)_-gVCjE~#Pe
> zrYYVY%TacZ<rJ?h%$C9nC(J%mI7<!ZV(}Kq<sA83l*OW$w`D5vk4MyU7q6Y-bT7Px
> zll`>MEOLvvP?nhD at JF0(#<?o4_TcHS+yhSCX@}caY{eX3nrPk>ugHnBEuy-%wr at N6
> z6qpR}7FWg)&_X+>frp~aF7Kn3zcaHsR#gBmD#aN6+iU`>2CUdBhDp%sfCl3zn?oIo
> zoe>mgf1)yiu^VJS3gb>Qtr{goHCi4^Gb_WA;f5 at 5VN9A;u>|P8;a|P}t(-!mnu`0#
> zKTolgG at C8iE#~84%B(b at cBPV>2<c(mGwq)IcAo}3#Ciw3E5Z7om!xCk6Q{F>69N0s
> zg30i$v%tCc%I+8V$x5?JypesTOl>!UM$W_{=2oV*UReP_dmKE>|21fU3gIPW9}XJf
> z at T&~$1H1i?)mY^?{m}^%?MwpI9$tO~sSXw$>mq=S#DiN9OaTw9E)rNtcq6<633^~A
> zryy^{#8bde9RB6OvjExUk+yQ2!NobsJKuzNo5d{7%aR#9ql2%N>a&S&agiVhd1kq7
> zI_wn!QYcZ at wV?D|y1dr-U1a&;=TM@<5M0H<l^-k*>pvXpUp5Qmb)Yy`e8^&|GY41X
> z>*I%)0XNGp9=GmoSK+HKsTmj<Q%4DQl~@)BD42ng(0hu!Q7V(4!s>idg=QtzC#__f
> zC*)ZXw!fHv#gTOM8|?8AHN<1lEa>TBIj=T|d2RmOn|T at UiU42if_OnJ6KQ`LYP^hf
> z4V|jyD!hwank-a`5wIU%VoldS%*Yl(N>Q9d7*eLntugC{`CV1-sDUcUCULWEC2y%}
> zsVer>Y|t&5%^o_jnlPQJy}l~o*g4oezUVes#z^KHasvTi6?*GMt{*O at SkcrsDwUDy
> z?4|`2`}%9Qm9P&VaFoEp#SYH4-);Q|umr<9l|^Tb=Bhi3w)C1U$BNB9)$)&8^LpNQ
> zsekr~nb<*7%5LF-qU=ud4HNW_xgPExtCXruKFKC3>pvf*{1&XLms!9%AN%1NxzZ<M
> z_ncGpZdF*(N_j2eRNcDgzI2MUr!g-z+&duE`dk}sp3jBNeTCQMGUcCx%=w;b+p^rb
> z<(+%IImNla8LqB-6srK-S8WfR&OS?coAuI~NX%mMG%NvDoaDnIWDiASVl^9&b&{L3
> zf&mJ#hn>rUcz}iQfN{Z9jTIfuK7iGa!=iEUe)M^S)ykTRreO_Zx9`#yWo|K7>7BZ&
> zgsOSFUfs3aGQnuJj7R&Yi;=YoVNcZGe+^frw?4Y**YI;8Sk^?Dokof)4|NE&lPqhn
> z`zN$lik0}zT%6$iwVAHv{SxiT>=F7JOZXP- at 2|C6nf@`$_~Nzro(Y}D{`?nO<F6fh
> z^;|JyO^G at -U(KPJGgt=8|2kkOH#-;q?0Y5#zehUF#)lx)mG45{IIQ86UB9surkU#t
> zEg5-ci^*3>UrH+?FsW9d at 2SF2bgs2p^pE}j{U&OCZ6>u3JIA at sci%v(Uu#FZrvfH{
> z5^!-C&{Vfl$M3|N{twXT!2g6sry)tgmQR6n9XOLgdPs)=yd<$+2MeMXKsiYQFEfGs
> z>oHh{@!x^7&iHfH1JGutb1vCE633%8)36>u>08-zVA`wG$kP7Gj}J^|^H?%jEg#g8
> zUT+AZOsWnvpYOR2wxCGQC=ixzt!5`cTmQUy8ed>N%swRBClCC(c{(&Eeu2BYy~)<C
> z><nbHAVZIQ-@}&#d$0ucB_(cU(KV*iCi%SZUzmN7iHD(vhjw6`aDcpXiRZlr<AGV4
> zej(W_$izPje-r*0s$ea`PQ2U-8w2<T&4Lw1=ZgKQ at 6n1?%TXHa;p6lTyHa<a=Me+q
> zIo+jBYWKyWpx$CBs~B`9;W|vS1Ms_FEwL!I=Ek>stNRU&rNd>wT)xBkQNrkbhc|~S
> zS_#VI?D~s-NKkvmgRiB7Co{cwDKHQC%_B`<@oF_263zzVXoy!2<*7nXIjpco_+7y>
> z?KvBrJi%QwL$-*Zr!2-nPqyC!pXI=>pp_!M$-_G4o)ZSsaQe^S4x&xKS9-5^7tv>+
> zF{=Xwc4qT62S`RTC7yv2DWD8N at Ie3FKvqQqk$Ceiz}r3NHue<i9iS}j5 at X3O=THnu
> zWebyF!zg7y#WiN22G{6;^|(e2Y+z#q$3T at hhJA5lF0P(8ClA>0Bu-huK5EDqsK$Nd
> zK&|)$aKV$JQF at b2klNUIsh&-fzGXSqF|77vSaF5q3cP_g{^`^+&_Kc4h~Pqd9nR^)
> zzaGb<+7|-XifZ44aoLUMsi0Z^N=(Bp_$v|T#Pf!F(ym}bX}AjDJP3^jWlP!_MW==%
> zMe<2ymG!Jq2W_{RKE1pO at _pkJmfM17hGHD>lq5)OjxSp=mnkcsNs?iuuSA9)y0Mt=
> ztGI64PWcEAJ0GSTj!06*GO=L+QnGoZGFB30JC9KIMkGOs+=#SjRlzkzF;gzw$t9*(
> zpR&>@Hk|5MhqB_7yYQqNcfe>QaobKM!9evT at vH_j!eo}tC4?ge1bID=Z5Y2bMSg_q
> zQGYmUib7hve3mC5M~eM!Tu0jP!F81VUR+b{_u-mmzyG|h=`KaCYe8)EKm at L1hGQUs
> zYT)U^^}fi4Jfvg{7 at KB;ZgK`x?reCqFz`(DYLX)wqw%@Az-r)GJr-QALj3z7rN`p`
> z+F#_Wrdf5qs+8T1(+6OP!wKjBTFVybX@(ON0c|1~a~PCwCTWo51I(NXc8yO58te$r
> zU_p~PCjw$NIl-xr`u;r^$^7H#a8au>wj*4HZ77yVlq-#*58Bm}_j8S+Pct3Tf$)yS
> z4gR<NtJxlKUmSMXS8Lm2kGDe$S{a)Lx-v7DnRuAO!r|`^@*NWN<--(S7p^!G!@*0U
> zG`(-5 at E44rD2My15D)ilQetpljr(ZdW?W- at b-2d*p2Sriu=(m)63!QTp1{WPIB!9j
> ziNz}NCJE~zi6=Hl=u?%g<py>WsPT95NM8-|Ci$MiHQBcX*AeKQr3h1yKNa`4;C>`R
> z7+&Y25Z+qGpw$t}mo<!41%<3H7=7#UYz*>`CVe!7Y1XF$$A)8Zm%gkK9^RULJCMVK
> zZ(7$7Ht>vZ186Jp)+C;xE@&The(Mhn-#^`BX-`AS1RBfp2|vVtA6K4xwV^yWQ^NjH
> zv&h8^@^<#Lyn!{)3 at ljRKCvLV{VM2fv;5ShG%Jk-$J%p{HU;-l2y>OgEMY*(e|_o5
> z{Pfmn<cvVhG(1hg)2k7tA-txbsXc$uKUgzPnUD;Vh+golFPyYaeG%K!l{;)wSqyq`
> zg(xutPgW|y%K<fTz}UeoU!{N_z><8Mv>COeOwZ=_+>R5yzE~C}L0TqfILcS+iynwo
> zniZojre+U(T1mc0WgnA#QOZ6+^2t57`!<4ll+Kr6?%hUnmEhVrBOuZo*I7%JR7qbL
> zKL(JA)*T=lLgQ;M$=`~xa=n-$175xL0 at 9=3JfL|G7$Zi&d%zbsWuO<39yK7n+D6}w
> zGQL0<kI)nUChKj#IkAmRD-8(e!0%0wW5hUubAVtwO4*8eS1g5rpMYnPiy8uL?d2#p
> z$r?lJ4{I-mec!%}M$6gk_d&PD;kf$9T(Hr$*otjg=WLKik-1RHZY$-z+{6tXx1SdV
> zquw3g0yzd<wle}W*VLv*j+-bQE9F7|QSiKAwV5YV|1#JEb&w7DE$EwA&kH2&2H7dt
> z4IY}$p`QjDWC8ydP9O9{eoje_xk5=U1Aoo>GfFZ%(xZj3|DrQ*9`a1&CB%P&{96Y0
> z%T}V#!p2-7?8sVhf}8m+(Xqa>>cp9i3&FXC_g11;W3T)U^yoX5${SZUO7OS69G108
> zuq(p9tL7IF^?<8ccnlV&kgo#m*wPWkOCV8`q%Oza_8sgvAb-_N&{!c|#a{avR}e6y
> zt~=N&lDJ1(!n_l$tZF9sLEoVbydb6>dbO=pZR=ZWK+7^6sE#)=qgvQzX)9`jKQr0H
> z;sKQs2r_Bh+9x0*;h=e?acdv>Ik#3j&s-Jc*Z!PStHQ$aWj^h){~|u^GT&uBZT~6a
> z)83Y&J&)@M)4qyvh4k{4P2$R68u)f>D2mT at np<X;2JA08V5g8h)rAu!+Vqq<7gzKL
> zYesJ{_;7)w&N3Oga5Bc4po>r)kPmXwHK-ek;d3D;qH!1r?*M04XB$8{-~zYIC}la1
> z{3kvw at n~;d;O_!|><-YgNpq;mQ=mGmZ*e2Ztt|VqL#F=ll!}afc1*wPp}d=Fgj479
> z^g%g%=eNgT1BY^}LepceY_}mV>3L!B#=1V|rPE5k&K2bjKP0Nn5h4>1k90-#hsR5t
> z`CWM82X9PV7ZCA3t+)rBhSNoEW5e?JX-LEWua}$#*Zuv2 at iQntNo9S}0}RULhx`?_
> z at sK82v+Vx=(ZU<G7J{Ftd3yQwB<Z^xMJsn-X=PYm;`5Nezk3kv9K@<%!Ee;8mH05T
> zG5;N5#U^$wX2>Y??f}v<!F|DOrFC~~G|gFBcft_Xr_3tZ2<(fnvm0E0j%c|;d(Y{-
> z2+aFhjKL_v>H>d*Raq17;x6bdPH>Pd=t;*Tah=#@#C2MiURfc1boGiICO;&<4j#g&
> zupC3X$pJb2c2HAs9R*AZ;lV?&J;>(F^K<R_WbOGxXhxoZye{P)vkHwXK&ZWA6i53Z
> z+peX;KV$nCk~(Q0h5yI`yaTIzPZr1ibTc at WBY;^#6S*C7kT<>Vf0|l=RkXZk9<Fz2
> z*A+eU@}pamVJDW&ScQHG$+ff>(X7V~4sGgoP12>k=$N!?D(d*}PmoeaZPU{IHk5of
> zbRjjmie0j0oYnKA?ljN@%9dW-{EesHGo>fi5D^of%!YK%*de_$8d~C!u-8WVcLg}#
> zL^@#^T$F|)T4&g)uVX#mTBkGF5zeystft1Jdako3 at LZ>)g+`LgAuOE{ZUeanSn|=a
> z6pYh4gd^>9f%9R!T94Qtx9T*DQK0AW*}&6Bqm;aBn1gvY0y2%ki6E}+O{YQ5Vxs|V
> zp<84xz?+b$;$#nPto_X%OX5mc1b6r=zFqB^?78UKJ{;2xS?<Nv&>;N<=EMDt`4}^Q
> z!4vIwJ2Gm<*C_nmnsxR^%2NVH`>b*nh?EaAgJusB(p-g!jtez~Pi2q>+oG+3Z=r2w
> zL|M0?oSPt>k_E|_-iuY}i6qsrqadia)oyLy?W;nL8`bD`D{Kt>NN<<l%LbgMNe4-d
> z^!})YqW4GVr>gK at Tl~G{DbWV()aJTTkZMhd4b$#n>kQVu at h3m*<))Zx%T2Kr<)&!D
> z03L&U^z at dfwi%Gloyi!FZJSk>tCsAXO|n)z8GRBxI0ttmrv*t8;72;lb{+5|^k571
> zSv>Gr*bhe9XoRq;!N*u(-y<lk1uZMUFvQbfIS=!87ieNU4K-dHsu3l(%|cpi+ibik
> zd%q36Hv;d)R0p&gVznBm)>Nd%IY+ld2X!dX-jQ0XN1+U6i))*W6q157BBYwbtvVKg
> za>rsenS-*Q at Zbu41@2%9YYa&~UB{-gtz<P0ka;V<WPP`8S2#Rq3a}v_f$<DOdSkt)
> zc?7{(-EoV51 at 8q+&4-mhcK0agMZxNX|1?R-fQ at Qm%h5v>3g0LpT!r|<N_!*OjDHB0
> zbEY)i4(a3Ya+4UQzFiJm*udOHew2-6-6&Ckq=X*#$2|r3<|&Zd{zk%V^)xmZA(fHN
> zBdw6e!1rK;<heYm#{&6_g!rd;g!~rAiYVU^D`71Zs1=?<$gC9c>LDW}C{C*+_dJ$t
> z4 at hkqy<uPZY9oz4)&k2f4eTw0eAC->@9o03T0AFlEdrcQ_k4r9)i^N^_Cw|Zx(Xw_
> z&{i8vg(vW|VufAwbb;=lYGv$V=W~>^F5LS(!nFkHpbZ1shNqFz=`GCUBKSWh{ki$l
> zbe0O~!XmcX(*@ikwaiq at 7G(<e3_{wheIlS(48p5C&@ot=49G at MF$byf2&W)~AJX<*
> zZ#AAm#s+=U38)sm3e<a?_z9CAp+Ls4LB`!k<Vhom4!m(S;%Nx4K{y&=K6*3-_hZ_N
> zhT?~coYUd!X%_epV+QFP7I=1fFW{+c1)s$Vxt8F}WHl=M@*sT#`fC!&ham6mh>sc^
> z*JT)-Nd4~(17^C8M+IlRT*<cKza82fMe6lx1+T`K>??mPJc4 at Mv$8sX`Wa+;&s%kY
> zbD;g0%2&rkdhRQe1y&vCide-2=J`8(@est at hX3}<D~WA|rr9Xe--r<YKY(2x_U}U}
> zKb(bT_OAT1A|$}y48ksq at T-uLrMX;8`wUtfjS|t*PT-p)14b!mcRG*8KL#GQ4L)6i
> z(X)?qr`Z~ZUW+Xog#Ay9uTjvRdN-5wyck8#ytA9AU!pN{QEGL-d%?3yEdeA9YbWYa
> zF7RimU4lib`Q9nsPR!QTk>HLqD>T7^=T!7L-h^BhvmhLaun6HOj7T!VRIS`Jq^`m4
> z3rR^0#$qH<_SII5B8?C9{HZL!^iYZhqp_w}<D1Og<MAHN=Cl11F6yAA at l}I+`z7Qz
> zuhPNa^yWoyYK}3A9x8>!$yChmuROFKR%0xq>r%bXccwOgh|Io1Jf`zGXBb+RTFMHt
> z9Z}8?0i%nCN at -rxtOoZNn(Y34;5Sqh>;4?(f=^st)i0^NLnonO&{td`Oj7Ph`Dpt?
> zAt}gG*wBP$bdsNwS8`)R_xAnDinJEo!~W2scy`i%2k!-pi-G-;YK-My04>0c+4HC-
> z6Z~ck<PQ at M!p2jnPmnseUQ)s3DrUttSj-$^paVX=XL^q^STD}tMyZ(V;fL+QX at YkP
> zn$nf#d{y4d!J%O_XS3V}RlvzP3O4c5(6iVZtva6GWAR!LTM7-uIjRLI5jYnmuyVDy
> zU8J3Y{R(g2PLv#}#Ty3svw6q^_=G$aYBBEPaKD$QAih#9LOiL*!U37tBdP`OOSb54
> zgSCSR60APJ;_X)0z{pc(!tX7$db%<LckmB<`YLxOtvY39i_j=4Q~9H0?ON$*6)cB%
> zWy>7pX`WCU-Z}?uP3K~5I98{iqMjbhU>v_kEP at RN1=_?{!5&_jtpf3D2K6nMVD%AJ
> zaW0QTb%1Z~QTDvzeSF&?MJIh^xf7P~bPZjY8w23%c991_;Pc~%>Jf<dy8u}Wah6(W
> zgJ0v)i^~r}78XzsevF}k(*wPG2|gWRr%m(eC?*KYL4WR3rq)O{1zuBh#io%{zzc=N
> zV!A^ctSvtBFxgR3ZZdsQZjwKzcgi0P=$HLqD0Caj<uH9&2GhUyKF)1 at h)u`Y3RY_L
> zHqwQX{-j<1JOqEBtgz>LtkQ6@%;#`)!O|&T+k;Wj#X!nDyQc`JHFhMsST;hhQC|t2
> z;z{v3VY#L;qf;yGMV^kfB06Dg<)m>=T93=d4MpRechgc?J>h{LbAm#Ld&rLn!b<H7
> zcCWvp%)tcJ4G+gU{!Ljs6JZ+#K4Uua>N3HL94u>QM(CzWbr*2Ig^~3usm`-~kTj_@
> zn*#G;?;$qeZp%G5fHEX_tB22P*ct<tQZS|?eCLePi)&u3BhNR9z`pY8j*|a^b;Cpr
> zUl-s8<cZD6?#S!0(9>E6>WUiDx8<r*+th+Fhg)|}8!GOx)cq6n%4#^$4V3=!YPERh
> zv>waOS-8JnMGk5Y^ul at xhlU-juo7q`VdY!Z>z%M69vdBsmkmuSnF2%rdQ0kx9y6Uj
> z=AL}{{!Rv~Y^;;RUh`Yfq1E-=Qfx}!sxE(HNsmI$jCkgRPT1j3uumpAU{zBbMd=FC
> zJC~FWzrNBrg5vV!c#<=g;-<^-nb3Z?T<RUpSd{cJW at 9UCYz=c*l74-~m8TU{Ct>=e
> zcRFBGC%~6;CTUQSoE+|=Tc5MA)v!a-`W&$T<<$D(3WGu(J<*T9^4WNwEerh6YtWy!
> zy|zTHC|LCJnzBPYaJs at ho@do9R~AQANQ(o*pI#`4d3g<}WECwDKbkCC%)*dl*~`ql
> zPj$GCyJK2@=K~FGM@$p+uLG~ubwT_8hvjGB&GQ_688dalM?lAI3vY6yQ(R=uWaP7B
> zoWii9u0-CGJrjnc;TgC)zBqxyf<w~+<k;59yt5(MJyQFEKAgE$rN2!xGaWi+t<Rxk
> znVz7BJ_A0IaaQM!btGV2;B0mHpE=2gKg!R##RKiCo0d*p|1o6C*-yY*hNGRp7yk8J
> ztw2qcpbrEBaRn%!PHu<cuLjpgAa(i$X>f<`zYN}YtR!r^;DN&q(jdlZw58yQ!z+8B
> zgLJr6HDL~dwxgvlptP6Q;0%I0ZHFh!I!#SKVmL4rcXU#L25xx8foq3Eb?$+Jp*Wdv
> zoCNHN at C%H87XD-LhfPzKiN6{DZ2V35H_HjIb^`rr8B#p3NoHcu^K9K2pT#1mSD;;c
> zKjbITXNNyK8AH9X7?dpfa_ZaRuk#;leGY%Jyts1i$-|G?6nt&(S=!5v_8ZEZbAdw&
> zUdZYlFu}u7U?X-mf(ez@#K5q!g~$CU7rc4cQE>9*HH)?j|6m`$SMGq-5C}90P1Vnz
> zE6-C12mJy%3x)3D^1KX+wIP=2PA$)qDYpLXL+;2$)7TT`xdPR-(>@L5f97$P=f%-;
> zTX~*|LKV;I%k#{1zYQgfbw`)yWm0TYd2SX$VI8DoKJVO0Z;qw(9p$;%lwPT&^PRKs
> z)J9JiP-+6oD0OF*=M_=ji-;AwBg^v&gKy?pDBO#DW#xJE=-ykNTY^wnI23QmU_#TD
> zg6xi4RfZ?7^1K`9NgT>pOsy)V{C_FWwNmN~`ksyos<(pT#`4_d6pq)@S9+Y<_kJ1*
> z|7o9&um5Q049`pXk+*n4sUK^ppLm?m*(VQkaq99Ql&*P4RXC`Ac&8_n_jAgHFKs}L
> z%_g14*?B!m>gcrM`igyy{jr|gJKx95hznY$>O6(}_{({73{^=eYc(|a0?)kfaauA=
> z+Ls>wT4ha&D-*cp2Z}t28K-jr{<+833C<syXg>4;UpZ!fxFGrP7g%|yRcrB=XbWU5
> zhpe8GoSP5#?wT01U)7(WeRCh?$xj;o`hu4Gw0(wZ2BJWF%~u|$%BsQ&3J&*i(|WTJ
> z9hP at JH#+p-{6K=FX~B*s>#OEu)v~iyBQv<*HrCGHA9rx1y}^=EEVMlbe3QH8^`n&F
> z7u$ae4d~y&s@%3<AEGb%L;ZBn;|zV-s-Jz?Z|KWZBl)IcHxI=$ZKW~Ch~K7-+OKLr
> z|LM3*xxfwX>y)!~Mk{=4)}q(*46`F}ucvz at 8M<xZ;OYovrywEe#tH%r at xkBX>kgoQ
> zhezMxoK$`w_bRLz-Od^N&v`%RrbQpHaExe}5+~s-^;3#7wftkjQ1Hm%k3m5&lz%KH
> zYWG5k$pp&K;ZI&|1m*ZuXv^t}<CugUsDXSe*>j)Dgnc4GN#sJ4u1=(NTI+y+l3cU_
> z+|{3kp!Xz0YMc4b1a0eSd-KcCdyVd3#p!{s+mwU00ijOh8ZAcKCv7>|hrd1wJ4XeJ
> z4m+B<U3a*{>N0kmV8D7lzC?N at L2qOJJ7|CL*$8?9hPZ4i3fc}kFef5%VmgeA^a8=2
> z-g09=PjIBe2)NX9OzLEwd}m6&?v{Q~#;?rnAnh36*@ND$z*#`X{&D*$cwPg{=a+W`
> zQ1-6IdixCc!dAiypaU8UpXV0b-+FX>&a95SDTa<YDtA?5_P(<t6Lt+pDSDY`1lKQI
> zsw4rQxLR!{`sF|33gs<KND2JY4qqO>l;>Xji>@B&wJqDn!zPf)`6YdWk_3tie7k at r
> z5S0hIZ~l$9xIdvUSmyjwe(EjmjSADV477G3c)D4jFQllZ+Q?Tw at _uepa>jHRu|GI!
> zP0Yl>aZ*i<TT6v9f4!jSnb`S}6V`M)@>Hei7mG%)aqo>~GeM!q3ygr)>B#&kt>@TH
> z at H2l3lKW9RPSxIL|8!ddJg`N*v81kW`0Lj{g5|S9aNSsaW<4wzZ8C4qs;g at H#m1G+
> zPdk@%OPxy{sNvmc9(D~=B*L^jm+X%hBzHvHvEn*#8bACQ&P at T>2lKI?-0|2)vz=)e
> z6St=k_FJK!1Zp^Z@~DP(SPvim$~oeHefAM)Vi6WuyA)iD3JxAYC%hzee&7s)wNpL%
> z3f^)88K6eGP-`W5_B;Hk!=SZ*v7dr7348lMljL~{RtRu+Gh;>zi-JeiP)xQknf$Y|
> zOIKlLewshJ)dvYKy(hnkIi;q$qoQYX)1oe28DqnQvw1*+J^U$fF<A0x^?7eS9+p3O
> z!)KuQC3|KPo*Ufn at jQZ_H|2CoK?-k>rUneWS1ks0<QlG!CNOY<6 at lKPi5;21WY5A1
> zfe0%E#<qxqo8hY>tc2m)nf}CqxFC+%lw114mrv0yT>8UrU}IBTts+)yW9fxG!$UIm
> z)l(sCZW~g5Kzr{C#hVcSFSPuTa;EKdt8yMm?^e5h%yPZ!P9$IIj+hPwXNV|#|98+T
> z5E8erLU0JbD`ih^)9CBp;Eng7{rT4)i)zC>H9xL!^}Ase(US`f()11n>!G<s4+eGe
> z*9$9 at F_1;uD<pXoa82gpY!yLNW5|ZYYE<R#u<k_c7vHH0&VTwuNVwr|^h|SVT9fEG
> z$^q-Dt=~~8bhh|i8Ck?}9t%AqEc82k at 8f<i^lO6n?RI?Q at 3e0;W>W7{8HCYMKC&DD
> z4t9W%hM&KxXQB5!v^YYQh-$hGJoeIyH at u)4>4^k=#S$#N;TVTk%U9s|FXvhGd0_Z+
> zoY-JD;Rds!V}{^pYw4%qMI{QOxptwBK_6}q)Et^CfJtjhFWy|Ru!7N?#Ql=V!8wGo
> zj-sp>%>p9T6j91za)AG3mR_794B>691d|6cjKl9j4)K%X1fVXC;Swc5GGKRn0Fdk?
> zYJ9LXaR0*yA409>f>rIe at ob#&ShnYVohp(237Rcr8R(Xdt|+XtR~+H_=`T&j$j0Tz
> zzLbOB0iEpdYCstY{V;_4hf0S>(Rt$`Q0{L-ctCqLJZg&PV)2cP1r{Og0o9~f8x5!Q
> zzylvdZHMtyO2Gp)rh;9E8;8!+6fzx51e12$gH7Yg*=R{_2 at rJ<Iu(Q0f^H;HOdz>y
> z(Do at +ZXxd0vhU~_;0{LGx<Z)oWXAiSLlzTsbzsN5;E5X3kLDVpL?qf)VJDF7t07kj
> zSs+`4yq6_<*MJiS-AD5Iw(LD{*;!o|Su>*)dGERatQ$XIg<T_0jkVG?1C;e1vT=vL
> zp>;aO5%2k=X|@C2sM>0YBB`BJ*T4p6qEm<dU4yx^g~lY5I|ieRR7aSG#je3=iU~WA
> z2mDgN5&_z$hYD65ewg-1jJ^>xR^*ua_K at tip%mKH9?rS>;Gt7tej)Vi6~7H{7Undi
> zcVpgszP;lZNopjjeOPC(p at bDm*4bn^yj(Vgc~1>xVPzgxyR=pD9m at N>DW*H~@*1TT
> ziuXp*`m`yI1Z{oFv_4f6)057){2r~y{K?yrdBjjwPiCm3vzRf&W2IB*4pmorVfR0<
> z&pg^QPuopzhSf_GVT$O5FQJQsQRj|wrs36Av;ojX!_4m)ibtP4g8q2MX2J|ErZE|=
> z2)v8yJ>-dXc%63tbYKJW%+;=U4bR>#^xQ&pj`U}UibI|{aHa!y8hZe0w&kPNFRtLJ
> zkNO?&MqPeZWg^}AP^%mWY3-YWYyYQv{lFVC(zW&(O{qf(!L|)gMLS at RB9Mar9HKe@
> zG<693+2K}5`97;cs_<eP#_$op1E)&l{V5YO5#I|8^@dV7VTVul$>61$<VpdY{L+h)
> zVGp}B at Ug!m+aeDdk7Q#eZE=_ga;x)!5zT__yBTUaV7$I993|e=hTZDcw6 at 5DC&Vna
> zvhB%+1#R^~IG>Z;wxvD;Ha)gT64zN+S)@asKYAO%>5O8T6~hliId+mlSkgSxL-LL*
> zONVDaMW;tdU9;N`p`97UCX<mnV2L_P%~ByW#U}3&Q0uQs15IJh7(5NfGgwz*ztWyh
> z$8&sR(~Z!!nhJf at 7Dx(B#!8!18rVuJ_bOQC*?@37!diqA5I){q**v3GXn+;0B^Io%
> zZ-A{OBNrq!&jUMatHry21SJxh8B`C_Cw8m?l=%hL^d9g>(SP~B-td`f+Wse{Vu#^f
> z^P&~7#r`Ns(dFFSR_nP4>SAtU)bQ<O^Ppf=+xk;cm<ef1<?09E0il_%B76Yt*qD>u
> z25J3z^oRFGXXY`o1O6z=NJgqgpY&Yx*5t>cCh$bt)(?&Y+y~CswjOQVv<f>B?qNTm
> zZ6jv6N!9a0&zT_9)F1-RssC4L_{NFY0RctZ)+^u!|HqO!d>N$udkui!_W*_kvDbUB
> z>adpPo=m?V64R5p<1ME0?XYC4Kr^+Jh4o_{6u)1BIvxifnkeDF#4NlSdu?+!C^~Jm
> zB%KI39qb~vM#6$vvja9GAZZx=uiktWlGefAe3fgS2-cq>3f-07R5k31dJ{VGD7O^q
> zl0WZP&lx}?%<sTjSgjD%6K^n#+ia!MVRXS_+<r+p|Aw?Z7dtWO>EBSCYl=|jKMe{s
> zHw3MHs|3ddt#>vP9HRchw}5uiwu!I-8UunzsG-<zqdTH86};KTJO1jkVWn{^<h;O{
> zZcCQ|+l^{p^`_1dN`e{%I#PU%>DBE+iy;FFn+JcoO5O%;SRPi at 1n<eltsU8P_VUX0
> zg`j2Jb0qtP^Dmr(M%CR|x6!aWn9T309Vb&5)okG#E%Nuq0~YT|;M^A!mKMcJhH2KV
> zfMkn85-I|$E%z)YZ;rr7$?8|&#U#WFo7WyO5m#k at UP$r{5NmziPYFRe7{TQ4!-#|b
> zjoJNw{{6;+F}J3HV!sktQ!K2%b%ReG%dZ8GPCU06oV<L^nq*utGtE&=$TOl{7<kfC
> z<bT?KudPC5+m84A%BBE1q<eSQm`XTo>y?l_34YwF#s(H{;~C6=y?Hb<2%}3cG{3Sb
> zqET%qJ}veqs_bOsk=vaydFfT6tI#dwO{t3Dg*X8#uI&B`c~hQ^AUx1ohI42G4_J>0
> zGs<@)esb(86_PI76_?#TN_(@<o$%~?pkVO+*k at yL0#MwNb#=f2jhL&oSeW%8rjXY%
> zUg-Sli>UfNd9h8RE6lBb_Ayu$QrtT0YNn6`sNVysSFSLlU=dp1VzJg$Hr2Alyzi8u
> z4&Is*2R%*jdjxJJ_V{rHF*T+kv$_tPZjSSq2fj*)cA}CEAovdMi#NeGiAhL>qVSY>
> zh24kvuklxrmM-TCW2~UB96v)iI=o#@B%ChrHt?Q1JOiFrJm+yp^kA*R$B3U>b8RX1
> zRL}>1v{rC%rcmQ<tCfFzU at GFLWQF&&{;}=3*6FP;#GAO<w)@~1KZh-?5o$Bn7Zkv*
> zhbcwgaUWAqq9PcWY>Q}G)dl}<P0YI3HsjOt)B;0-mOBTzW#sm-smPrN9g|S5PcBj}
> z{U855mo$|pm**P(EtlsMFv%$370U-~-Umphjj$+XZws?kNO!{H1=bZ%T at RqiLCp9=
> zz|h5}g<X1UB41rQ&M6KE#3}QX^Kq6WURl%31xe;PXLI}E5tMyhvlm}xWQ at 6M?C2j|
> z%|1`LWgj=!WGK1=7zSbV#`)kQe8t?TqptwF9fNKh!qJ!4swYp=Q<>n&KLTD7Ru}k;
> zpkm%l>y}n+aLp!y(}TYVuS($s22(bl)EvR at v9LA90}-(2Yw(^_xx&o<VXcCLczLZ(
> zrnUOQ+!DvSK+odlwWSw+a>8>P_yCa73hcWrh-0j;1Fhg5z7hN=TI;4@>ZWfw%BJ+5
> z5`2LOYa4n28ogp9C)j|MzB%#obM(MkUa2y0-rc}6Q`#chu7S1RkgUwXn4ql8&#c1)
> zpBN6tkgQBF9gxomITGNb-3B!ssqv5*z-}7&!a<f)WM4hWat!IbKL(%D6JV9t?O<m%
> z1CsfH;gy)Zpefgwybtga3w-_Xvpkb!Fwapvq~;!MT6jDj^PxgAt0g-M05=)Cx5rZZ
> zt~LhgC~FU9&K}J7J^ynJN{e~ve_w;(I65#7a$uV?Fq}<$n5_a3ssL8|$HFfETsQ1X
> znr1ItP4YLUJcMHr&VqgZEzY^PQ;=`2s~0wbE+Gc{|H5xTsH-a95zt*Scm`;755_qR
> zfGVbbvd85bgtXSvd;KoTG5A9;hefKb1g?<-S-L*J&j%r?F}W$bI^clyG+2=RiihLr
> zOkg3i_Drn~;C)D$VNS3|ZsiKCit;Uis7u*Q$35@^a2=g05S9P~X9R_?0_3PlPYqUX
> zU-^Q7p7$LO8^l^GHzt0Mw$50TB}^)1hI>s3Yzq7*!Gqd5 at Ul#?-Vbbw6TbAi`?-lI
> z6Q)=TPS;Hf;CCHQOw|mWJlI(LppTKHDy2GgCLNp78v%;`6n9wZPk-xBg7$7 at oN}gQ
> z>aq7t1n)E%^dX&XB)G9>9B3m+iP}bimkGJhpv?@Fp1{ulhac{KQP#6-oIc<UxuEWU
> zMIrWHSac1=z&+q!BX#PPREp&wwGZJWgf4{B5cYe<;d+`dzw-j&eogQ`$rs?H7ZtDL
> z4<greJ^|>a5wQmd6GRI1*0y8?@j#402n*b at 09asf{F44{{AL1g8ABtb<(=FNTWbsA
> zw44OdANRa6m at EqHLC|BSFVYSF*nA#1sIEZ(9v2HuSb_28?_oVns*~v+kgL#Q=9Q$)
> zA{H|4TItrsPi5Sa$SZ*#L;*(IoWI1#TRrb<a{ye>L1<~9e3?%_Ug8uT;e$pNClHlR
> zU!MuD1Nm4{^DSl-Wm at BKy2P4li#QsA at 0xuy%)6!y{szcO!A%<h3E+7Sk}E505hqi5
> zHp#W#^aQYUGia^*yW>3<;R!$?+!kNAB at pX<fabYHQY#s#M@`vuw!{p at Y{y!3VJ*6V
> zLqS^#J0f-lXzo>N?abwI*c-yc40a!^?+v((O?Q>2j5gMj-33mo1^5Q`HSi`KAsMFJ
> z;@lG_h&O#Kvf<Rpa8Q|Sz`%-&WyAE+9~PVeCc50F&}v3I6;{J$!-H}a`v7z-aNZ$n
> z{1Tmw55l%mfJWqa!7i-M<KkErZT*V7#lK({07jPmlLdso;7uK?;v&x<wBh8WV{J^&
> zpYm+RZee74TRKkKRK{+eRvP#Oy9b}(b+WOjQGf+`ciSedREJ=~UVXP at U;>`aY1`Z#
> zT?T46(M)b?OhhVnFCM~o%WWGiZ)2x&Aa^O?;`$&4?D+&=sL&ZeG_VJ){}fW1#z7+k
> z`YNMGmR>lt2BqX$4a_a~GD(F-ll%zl1!P|W9ByF{GnNfpuPV+kyrm~!9+3COc>{jZ
> z&I~?bZM4DjBo~2+n6cB%c9 at 0)&@rGdT^cB>agL<#KL at BB$O6r0(m5f1EWaE1=E#t+
> zDKjwi!f3sG7n2~lh&Sq8p_u^Qx}sJXF%q8bxr!=Eq46W^dX7>Y2kaX51Vuk=a{FP$
> z%ijlTxP-aVM<e1Xx7}koO!E(Tv)gXzx>n{)RL$Io)9u}`^@$TwaWmjrxJ7rMQq8nF
> zgcLcM=_E$|HteC6%v*w!4e(uHj5<rgfl4~xSY=xZER{y04~EA*jXAzmt3$Gl#_7on
> zowC4>bHIPl1$L|2Nor6WItm)?4*wKZ!Mwcp7=6z-E`#dm*MZ_*1PM#D=GZi6V(EqU
> zcGzjp-6X)4^WBY7gVgv-c&s{)96>75cgUYlI~4ziCb=^ku(}VpaSo_=f#Ln3*c#2#
> z&Q*wggJ)~ouLmzwx$unlNA%D^I=_1+6J1K})hJW2vfftLB?aw~Nm*dSfgV+xiCJC_
> zO6^$0u%iu~vYB$S)9+_DvOZ<;W=UDRPuiXrI_u=J=|XBy8iz29z?0qAXy?Z1 at G=5f
> z1d;)_Dvn7KB$HsPkl>*QR<hc?O{X%wt4^5^|Ayoe7 at e~1O(RN$(n(E9u?gLTmXrpp
> zXB?8eRY-+*?km(Z=$wg=-_;4J at 9KfEjfU;N88}_t&3k!QDa*RkX4(b&i{MgpL%Md!
> z(u*4wdNVy!u7jbk2=*!SvrJ)<V4rGV4Lyq*`*i!m2vz$G^wuQpt(QV?@&6{1YaEJp
> z8X%J^K_*um(&OwAqxmx;IssXv%E9R?+Gj&70kJ6v$yQdbcNebHRaUbc;Vk^~ie=NR
> zb^%;~X^=&nf&Wb0&&JI8LW36%vV(kb!6OHwAo(g2)V%bQT2gT2U{t}Fwnoo+F6?-i
> zB!c|lgbBCs at STqgj(3&?<(aj4akWv$NV;q))o`JzT|j-aopJw<9C at gJm*369VSz62
> z<FEW~J6Zm^=3h{mN+Z0Y+&EefdIl%H7oE|xI<EzNFYwcy-EsDIqTWCXLaNJfiuD;K
> zCRma~ir<Zu>c*buZeWh_1WO%b{R^~ruhD$-U}giV#;Ok5hl;ldGoXQz?{c_fc$h_J
> zuB_|Ax}n)VO{*yv(hxp6O&^T*!`lqJX)9a^;(HDYKWl+DG5lk=*)}d>9<G%2 at Cu+&
> zR(=Kvv97Fd+Xxaiu at EF|`wqK#uEurIU>~24v$O;pqZimOX=oT2U>;U>spkyV{++B6
> zbXueRVL-lVL-6wlNsYkbD1R?-&au!3j$@v#v9#Y^g6^sYaqwN#I&)=Bg;mGhGNgV8
> zO9tQL8hW>Aj6)|M=J3gB(VHvj1o1PPOs`eG{k^kS^+#YlZ&}D7h0ktpSq9oc at I+1Y
> z_Ktf_8jx$~?AZPhPMItO4Mukxog-i&$cWrSuu7_<Qyg|y&}0IifEyq>b%=w{M4ZqL
> zjS>SHx_!Yt5HfVjH5s~{=zU<|gPqjJHtrcf3k}9fTQ-BwMz)$g)wHT<!Es4hy%YW!
> zw)-usjKHjw4|gzT;9o0=I~XvqH0)_r at Ld22Inlr$uvQDKAxc at DrpjwsDpIO8hSv-6
> z!1efe)q;E^H&@99>1{yWNOfLqKT;tn2b*%mxFb0^CrjD+IHctCjHKkEt%=ybASI{G
> zOdWRE=x#}Zr2xput%W4tZLqHt!;fR+R<X*So5Ui>bn8H`SrGJ24H%WbQ0Ev0iXsOM
> zt)GwUDYI?`8s!kNn^DU|>~fHA%z$k?9om=<iX<d8DIe^VK5ogvc|zb5adL|;4S1jN
> z_YvMv8rb+Dc&YbmGAy}0^U>QT*jp~>xSwd7wUztD6B6taTY7fUxn8;$!d40~Uf+Ua
> zJkuCQcE3-23cTb7-rGWJZiIJ_RKZ4<t%zX_$B#v+VsNjni{SIs<)leeV}hT8^q$h4
> zziYv|4t#2ZEvKI1gRiv<JUekWET$JhR+4<JT{yW0<s#hwn_zgd65-hW<@-k}iycN~
> z at zc`&l>N^K?%JQq9s)gX at m6X7m><@A{-#()O8a*PX7AsvSW+dnoJV}WL0O>~l at +5U
> z<TM7}!ZlJ^kxsFg3$@4*t$<plR6awwqXHLkja8;UC!ODD|HuBP2NU;i8NRrGt1=ZS
> zRrY`G-!>SzzY!_hwUlZ$l|``SEL at rDFnZqsR=J!RhfxNLq~{1@&a221t!QnCmT(^x
> z*o|wfk`*hRt0|f6`OKOT^WCSqg_tJ;wj=52)6LMD7uu`ZkCk5d+pvEhxD)%RFW!GI
> z)ECPr^n8n}37Ehfco~}m>SQmVmQFA=|IQ+xfaev!vfq|7U2=z^BoR!~lH)S=!HXHY
> zXgB=ZTB1((ECw}k?q#}o^ELm0qHPROw8K1SF4M6W{}NPKZNIjej*UTT#-$2ikk2-+
> z$xmJKr{+prJ5hQZ!q*YX2;V>$gYZ>^u?Szoif+dKYs0=Gvd8n+y?C6swV<I}EEyHX
> z{3)ObgW7y-2KFjYx@&(=UuKJLez|$3OY8^d))ZE&z^?Wy%`-vcK7v!p#Euf=olqLs
> zyq$-sCY&K;NQB1in<d^zS{kdPoAW_`eGfRxU3lYJ?Ab9m35`b>>jXE3XXj at vc_V-N
> zlGouOs5Ae at C4YjJJbdW={2kcJf0f=r_!{Ui3hpOpGO}eo;Fl{`tBS|Q?@(=+^Pt|Y
> zPa&&t*asd*sjr~)BY at 9gN=EGxP;B8*L!-ME5 at k96*DoHY(Ie_B#*UqcbVwM%@B@&x
> z>nZMJ7FH42Z4QklVdcw?C3j?ZC6)jsygaI=!!)WVHeKdATvY}OL+mjls5i71{Z{kV
> zecV|<J&bi+u9X_z$&X1ydq4Qw(!hodyqD_0$n5M6D}OBAz!C)0 at i3?OZm10CIP at M1
> zXIo(_38(Yx-&2iz0yG#M`47H$oGh at CcGAJ$V_!gT!t>P`#D0ggM>?K|y*Lrjy-WKB
> zqb`ATn&??bzY#v$YTocnR6~+Z2Y;vW>e&A9{R<S!)6xs#{>c5;X?Obl(fb!_chdgY
> z{fo3a9aC^3wQ~41ep&(zF$VES#3MrSSj3|dj|#=(5QpX$)_A;LikESh2`hq4SWEY^
> zEi9ZnLg%hE*RX}`P?v4_HM$c-H&KX3c{U98Qr^hBai6g8rmoI1iR&S))uCY|ik+;P
> zUTdF*YXSC$h at I1YHGEvVUM(C{ZTms9*jv^CTmUm4k}OEaZc#Y+DAKq4!Z0Ua at kP*F
> z_J!m6yw8X$>;>=?gu4-rMA(cl72zI)qY(Z9wTyC(vd<Y at i`XlJkKuY`@b|brKUjt9
> zuE7ns?jEeewR!MqT=xt%;ra)(TXdvrEl>t$p#?W<weHnwZ3)%7FI1~NRO|jwtq1CS
> z&V<41P|n^#NS-Ze87#wf-{38{+6RAy>;AzNxE??)5+sQOi;gmL at M{6_lTll`_PsA?
> z-}^_c<`=b^TSGO!6sox`RP#Zq*;#-cTfj<>Ab*D_{{^h~XvCvJ at joISi+D^Z{vzVg
> z9AnU0*7CO^o`7F`DE<=SNr)$g;%$hJKs-4VKj_UvEQMmgL1-M>3z`l-0k4(W8n5wn
> zn)jYhusR|05QJTtorzxHhe~N+eU`?@NaqFT^hmiDyX|#=1p5JBS^!`6(o=${fDG^=
> z|LZ?D&ro{-ZT<>~bk_^tqqgS&XZC^SO7O-G8y<PqeM}k5E at 4s_WKRHd_(XMHD7L!C
> zg0c^y>{gWh;!ir1+Ky5inrEQQ6IaUIiLzb_mDz at H0yNkc<NJbTLc8N<WiIToXyyC?
> zCGSDWyHN7;DD!TuOh8hmK~j{sJ5*w`Rw7!3^M(c!uWiRnkJhkOf`}$QpWj8;DnUie
> z3OrGj5VRc6?+88l{eOg)o*@BzhcLefRyM)ih1anS+9*J_6{B!b?X}48#0Z*=2I0uw
> z2m80)CJHvV!J*zZXy5R^_4Qu#btANcf8N)C^#6BX-~ajlv#%%qx4!;YndockUG(?m
> zzRp_mhf;R`%m0tQo<KdV&Ldg(VBdy%)AYaXJUHhBcOK at MOx(tUzspGmmXM-Lg<M)Q
> zd8vcESTlGnhUOw|4=M`oAEes|+K_?h2!7z at SjpD{VixjV+P&bXax%P{-H+2a;T+Hf
> z#V&Ox_-f72go6D(tt{h#A}JA=CE+GIRrju_GFn%(`)I2uoL14#_mKf%h`f*I{TnZW
> zFr4ViTnM#K<@JRxOpPyMcM}isg>x^Q2W~L7HVoW|v3vr!5hWxUf0-M>?;_6O|KJ;r
> zqrLN)@ge>o&R0*WKjRN}`C%KFq^UfUk6rivRfD;qU2LA`M7O0QyM%V(nC@%oJAi4$
> zX?rqcjo^c(zvn-AoV&b3kE_1CL;DZFI{Fysc$jR`dn22HdoPT1BmtAu38Ng)8m1oA
> z#gyo^lEX1(zwIa)9&rS=R#3;E{09h=?_D^g!`R;lpFNVNZb-sCYzkBt;9eiRU;i5J
> z4Z-^j4%~-@?#po>5xVENC(a4kBZ$F0aiVd*iSopR?jP{f5%vj9Y#p>94XOcBc{)`x
> z$^1;|@SiQRPP24`=Qw+&<3xCGi+-WWfuk%uD|`j6-GJwOSA2+C6%M(J2(mxF{s&Ou
> zL06R-e+v4*jKj|lY at 5GMHMKDKX)v at fvUfq}L-1V4Hmw6Z*jmrc-Yz<K2fl?|#3*kL
> za>7D3ED<DnCwg;W`#KUZDN$tnTZG9H<JJSykLnTLaA1a0eBpbnhdp)<`m7IBnRR~C
> zo~{xT?0}sQ2(UN}`+shnQ(K;1l*QKWsR}+>cln92dA)isQG21`+VI{=W at 1ri7q}}B
> zMxV8~mm!QnxKzw##$C at Z8;IT6FAc`GJpJDFItHEA@#}sJr5W+|JmgM9D@<+$rEapA
> zwxCp=Y2QLEbI;lrzU-XL+|yb%EgL|Xb3!~iY5$__Oa3x$|Mj?<i(!j-_=M{&w|K&2
> zNs-L310cSa3V9xuzloc=Q|!6mJxDkWk0cz<tEXMBR`71v6xM6%hd*O~Gf|@fVG+Wo
> zN)-O#!13?3Rd9iK8D&syV4uTYXg}obwOgzQ`FOBMCD5j3!n<dO=Vs3~(5uM5ateGO
> z16P5+WbD}3Pa{zi_G_X at Ar{)Li8g~+4Dy(u?-uS at 0UDGEG0_%Y^Fqz0!8_bV#2f3V
> z<o8-~+bfyCV%uO}3A=eAlNC{rT1O(5fLOd18--Y6+ZbGv+R|}NmIZD^I09jKJ868#
> zG&`^hi+rL*&aG at Y-m=M6#50vRSo{rlZB!E9NQDe_!rQu|Vhwn{)E4-?>&?;co>VUq
> z49g$=JE=<tIfslzmF!LE4vOA5oU%pqE2R3azRP)O$OV{ph~BK(RI>;6OhnXYa>4%w
> zX4XD$9CD at EOx>_A23k3u@(2rSue2M=OiX-F-z0T|>jT{j5ty>Tud|riE8CLoBmR%4
> zBfN2-Wsk7SxTa8D2uCtWvq)m08emm!j(m#E291EMXMGr~k(=y*q2dVb4V{?clc4?E
> z=F at i`L<%&-MMznahB$1pU<?sP0{g;QiMbHQB0Sv^j_VgK5x9P7k3o(&dn~T7$I78a
> zjuRf^@F*fCcHm?vbCwD#U~%QZFkl}nzTUhHTsA9tF1YaZgagx1huGez2+RZu2C(sU
> zpQ;Sf8%k;5AK!Kx>1l8 at K&f8J39~YRVm7l~sNURJh40t%8E at 5b=)Qt(0Nh|dTXs%c
> z$-i&54I15s!71PZMbYYQt}4mJx*ovlg>^~SgVh17Y!jYFzen2LQAbzc8hx~)WkY at O
> zvVo}IyKhBY#(G|YFz#%T`$mNE2(L#7%@VBC>zZrS2ZHP0ZiR$|&s}K$d;RjW>)hA2
> z{C(NL7UrJQvUr&f;mmzEE<4Bl?y39Av~V)J0kERoJpo}f!m)o9yRtwLh-mug?F_Uj
> zvT6I#(R8v$Uzo|}$ee#-6(|3PRh)2T6+>tC at +t<^?eYq~pQw*lR<L|!1 at 8{6;F_PU
> z;Pu)HPSaNKXsl0I{$%0W+NISRiJ46_aiS+ at AdL1j;7V&a3v`=s$0Be#Pu4szXmuA@
> zOs!@`s%5n$MCE96;3~Iu;Tn$>8>dW*mRc#6h**LaJBnB`Vo4N3n1X&8L8rCWw_lR1
> zfS*{)Bim?|k7`TBHMK1b*R;0L?U0QPglV+t?!h;mN2v{%BQjQ|A-FR0o^=jtE3=bY
> zS0i9u7?2|?v at TmIcPWGB3G8oSWzM7L;JmO_ at cLMUw)zZBl3MJL)IzLGOYm8pv8~Fk
> z`;Tk06klH{3oMdK21kU}C+s6ood}^1ePw+bwDrl^?3R42qz{87+ZCjaKr5gT2J3Ko
> z*amDHFuZyYDQQRnPYM<qU{4yhkz%1IPj;4|BZf7b&Y?%9*-?W2m>6j<#5Ja+5P806
> zvEce;OA)TURueO}5H#o`%U<>m?a)Ps-8!sHSgSV5S+J1GBtvkO;(Ie-gXY3lH)-qC
> z(7vPPaYbMztkMtFLY!W)qyIe>Jx3n14RwO&WOV at R)T+`t&64$OX1fSkuqv%5U?&wT
> zH6pZ9zggysWsoT{FM}yBcLu0Q0zXQAN-%D%Hq*PK93wI7CxNy_RAEQQg!-(e(zBWU
> zupeQAexGpBGa2KP136{Td;JcLmns6YjRd#l4%Q4&Bls>oo9_O_^BYyo?o3mjD*|5G
> zG~SB6(*ClyATJjFToa!M7bEa`U0>Zhj_;f^;XC_|8e5+F4E7KBHF4y{J|n<~YA@`0
> zjdrB|sUjXSIhu8%W>0C$??F58vM?dWQ|*YAU~>+T;YE02oddg?QNv3h?eL-#bBgb)
> z>uSn%Mf5vM*)1<)mAXhyq6JopVwpP%RJ>M4WQ*Rj*bxcta&&hXzE|^cM_3MFJN}G+
> z!*jj at J(sW?ncm^OC!-vZpvEUadVlh^Nu1_|2(P3L^vWK)qCq9Ay-*7m+N*ZmaCWYH
> zL30<Z at c|YFK)tRHz+2Ybmg4#hj6}eF^*;TwbFq8evw(<2oy~PmLl^_zdJe)^gcA|U
> z2%&QfjANxMt3LxN(M?Ob(!Cp8nf+r3FZAl|4-;GhZjoY#?CLj=(bD*z+`igARaGw4
> z0-9YSXx1GO{MI3oy^F>_9N&!Z_upqH`vWuJnJSjgv`64N3m*5LwEtCsmp$)UU%frn
> zUhg4$Ib&$IVJ3_h#nKU at +zLX1ScM1)Vp$MIBP>ElFsrz3%8+7><v2ODgCZWdUxOk2
> zn5l){gU4ybo3Y}-CsH$k`4k4%1D?*h^x~29ORbQny^I;a*C#Lo347z1o($wDc0{)8
> zF70jCUuvQ9+vl}!EM at Z`KV0x8WPY-Uvs=B{dpp+aEO-Mx59uy^A^K>kZL_V};uv3v
> zIIKm at GT5MlzEWo++QH0tXq-{H90o5yx8s`f|1tJ1 at KID}|M=P6*;}rg8`nTKAq3<S
> zE(sVQhRKCMG~y~qF;z(bd1<wZg1*+DnzPA7B1TLRgRezgG%RVwu<8;6we18Dg0)nw
> zV`()uM8L4?CEUUim+b%hoLvz6_Wi%_XFof0X6DS9bA8Tpe*noyW at l!@ZR_EA&kU{w
> zJc>H){$<;oSjDq!3cnt31bQT5r=N-Qu)a80lxI^-Y5&GK4d)(|Q%EoXXBlVkXE|_q
> zvHKU}OmGZ?txxf$0e*af5~ic>GyK`O^5cCUU at ho<c(sIYHOi~n;C*2M=(f+%w`J&M
> z13LkEhyniB=20FV$0sSJWud?BQ)7u^?H_};a#2b&AojR2Hlsre_?Lm!gp{plNXuH-
> z1LhL7(7K`3iuRJX(PFlY&pc)XelZ5CELkzMp-jwzDZKE~UjMQNoqr7A&@I3S{E;=V
> z+T8(NqrTpiJN4VDum&n!g#w%J!x~7B3-#P``X^WefJO~Z^xlRU9knqXxo&PQjjW3W
> z&GRY6zwa%^(*&%5xi}}{JO}3_<Q^y1Ofphada>WJ6s(@fI1fRd>##O5Pmiay0lX*V
> zU;g9ufYBa at 6%i0CVkmai6kwdhnSxy~c1i5SgALvK)1*&}*l3-W2z;RRLa>4&b=)V`
> zOP*LSv&4Ft{iF5r+|~7B#|ogeMJpl->&7b9O$M%Fa1|}C#^8!p3lLhdTA)<H<8gf>
> z&g75fCY&jzP&v+tINyvjNtPEj<cd{w3r0Q;tEyP6s!JH(1^;GMEx5X>W&<})gxrJ8
> z9u6rr%E9QzVQ*(e=RKeTiv}F={1#6sc`GeG9bQSkZQ+%K-0_%?v&C9Eh^tv;A>Uiq
> ztff47$*PR3rLpupvX=5_Ez#RoSJUkOzMAOyzg<tWF$;(F#YfhY9qZsT<fU~Jhjo<^
> zSzlvtroC_h?$i1z!<n$^8*!#}bra5n<K9dw3+Y(2WEQT=X>H*;2I+-3W9`wp!<q}P
> zw_C1RZws;BO0KTA8-KLkO0TZB`M{_3;q?Z6G)Vff-bf#90(!@)1#l<+niV&W4gEJO
> zZuY-jaSLFL at jbnd{eK%)-7KuSuY>nMbM8QR?ScAv5>f9eo%5NIGm3j9eEY3&Kx*l`
> zz#{aDUK0K+jkr!z|3f0qF=Kt5%i)=%Ed0y>J=8X9$r at JDr|&AMc(mjnqP(4;UZ(D)
> z2w2g=SI{t98Xqnr@|cJZHUd{fe;{%LupIc5L7Ha&=uN<3;d>h}uz^xB$d?MLj`Sjc
> z<?2+NabMTr+oZ?X;%dw$3wfVLDiisKLB8|}(qlb_JiE~f*ptT1u-*9irPt91&yr^_
> z==+?+PJa?>^dxE<!*1bY2ci+zYu-SS=fGkS*9(1h68k%>kla?^uLU1tCGe@?K0n4q
> z0``;4fQ6QYPM1aaCXk^+CZD$ZNNbdT1vo9_)sE#JLOEA<`<t5q>3~y}?UV$ho98M5
> z1S$fC7zg-e at 4bQOyNwg>?EB-z-s>d?v+#K&#})8y%1gI5EdZnn1nr6pe%BE|E0(i{
> z%K{5?HBa*$!F6NjKr?prCsWno;yjFZtKdzsUu}QrSfXMlC<bWOdpORW%f|3cJ#ue!
> zn6uEe4SnJoNP+d68Gmpag7<(nVeq($_PgH{u*cxe>8stk&V&6VB?NlA2=Ff%qigeT
> z13XL-^hkn#J?;+meJxh~`c9MRIRsrpZ!?U9rAOC$@x?WOXT#1|^MD(WeztbLF5M}E
> z!|)nrtEI<^y>~U%D&X-G??7(=JwCl0T41#2&ZGOgX85oM+0Z^KJRyYgn8a{JcszMZ
> zgLWrN^KWxjbrqhm`VT){#bDJoAa4W?UNg()0#2U`>EI_+4$gj>sqmpm at CI+!4DW-E
> zP)!P+f;Oljh>?I?r#-O4bV}GEP1qr^u0FgD`<$hGu^I<nc?`7}S{{wIr`U70TI_?h
> zHO2mo$$y0sS{>%x7T}5}l~~NDm9Tt*7Qofjcdw$N-K(5gz#*6ePlSKcpZYgKXI4-n
> zPL4Ba{4FI3r0{r3YYjf6vDP4gtXN%gLK?zS;HS*y)k%nihtW>K><6#2hJ5Xg!Z{Aa
> zH)7-Y+i|4Gc;R?`4qQ=;Ia*i47!z^vhU46!5677s;V^QY9?|2FXC%prHZAbz^K6qT
> zmR>41V=N6=Rri&JF8tkjpXP$b46UmZSXU>ou1=t4w5~>pczGqtLeKulx-!A;9lDaV
> zvJ}Wwv9h5x7g~q$9qB8mOLLC<ewEKpun2QE(bosq7u5_2&Etr~3<L4!Y#jakHiule
> zEcEHyn&0P#j>VAVdsqzcYWOGND)A(n;e`q-ZH}5xG=cyBK^yg3XroH*hdO2;{T*qh
> zLIcO9o5B+G<G~Fb;kzAQigr)O5!#V at tD3H5bRrsdXPVH|F(IF&W2iRr2xwisRf_>1
> zJ}LY}ycw%mk3{)yS52A~Js|j?gaHthfYro<D{lP at U%)$@cC4laSSfMUpF<iMSG~`j
> zvvnQLzk_5ZuKHbIW1#Har15KY-$>lM<hbfHm|ro-(}^7I=&R at 0=;}`1-7&gh9JFE0
> z&SixmMVB&IeNF*iv%0g#-W&bmGzOlD6jyx?4m at B_-?TtGCylN?SEd_#FYm7P{iR5c
> z8i1aY)f)uWROu_iyZcb`?>eX2QW!zw at wO!NnuWMUz?Oy|i6MPaHe5u^7%Gl7#MVhr
> zuzvKg>QT}IzXZ%1{M#355?0mq=t<CodOglqA^JSkQl=Yj)r=^8G)n%CYLJLMCV3r?
> z;pSTht3M>$Qnc at 0^w*EaF%c!&*eLi4#Hc|JA2A-`ebN$&bx&`K1KwrQEdSc;!9vV2
> zaG at y@xI4;s)T6`9Cu`<U!0DSxbQ<Q at Bx*ZmvdLEj3l4aNu?a7Wx^JoVXt^!ia?B42
> zb5C#x%0hpDr2<+!ktBp@?Ob{v*6y%6z}urC1Njcv0L{r4FeeeUShQ&$wW*o$4&N@}
> z&5(;|@s}gBbDDnqwmYyFoQGC2>{sk-$}81qnsG-Y-vDN5GSXHp7Ed0;6T}wLTO&`*
> zBA3y3JA8d&o(ZZ{=YHDV>Aq1;e_HZ?gFPiB-1fjQtT9Uov#%ja6d1WFFdS<JK1u(5
> ze)Lrf-hkbu{lP15z{BCM#5<AkQ6=#H8F>Gg^UYHOIjW@@UJ&)aBRLb*MPR at gygN)M
> zW3Pb6Z<O1Ea%~(MO&*=E6fl-~V1udO*{5rn)2DCA?=!UAfUmrIWfuJSE67=QO>5Ip
> zy2V{4+l&(0iI$;!P~x3te>Qnz*4JaNHYKm1IVLz9puQt=3j at _KBC+`IWqgM+V#PeM
> zBMK|<JD$vJd<elEuNAf19?Tpl=f}Ybv{Nep$D~909bQESEH-)yH+4d4S~Fn9l?na`
> zn}d2-IKbkdPX{<p_#LDsut2<oI at G`hr6ySAmKBw_0eHjQn*x3dtYDEZk*?i&0wStv
> ztmtpraqMb8Ak1;h`{QWC@!)Zae;|2S3U=ce&OUj&Q=)xoN3Og{r?^R at OJ&6j{@-=d
> z7M;AAJRykaX4(Aba#1GqqD7uo^;2lT^{JiyzoAUoX(wKWQ)U7eR66{J+m0-J6>Aap
> z(BQ2=h5(+*3W+S6UWYwuqOB5q7I41twWrl&uUU9$7Jj6?;7LJt6p6))Cw9OR8~zF4
> z3zfhom?EhY{uiDhj{(=p at c+4v=+-McqpA+~+Baqpx2e|#-_DZ1%=c^G>(K2v`a=X+
> zK%h`)2jO1XKi7zYX5hW&hG7iii%tWbhw(z5!@Rq~3Qth at F73PmH&Ov-WHz+<U?fJ*
> zWO*7q2Hr?L>w|Tu7Zrx5Ra!&$U at i|8BTwAzH-m-lr)f`<?baVboBq!*i-t#_O^WDC
> zyP6Q at 3W<Hsfg{UK at wW*))iiKR*BIg=U9+ck1glsj^m at R5E4w(WiZB9a9IJJv_-dVY
> z74#i at z0>IWCA`qFj?y|A{bH`GLY~Rt83P at zMP9a1-=u?2kqbK>E?-i8PRx`KSxVq$
> z*!v7&rOrOGIR)kd3!%S~cL6&zN?*ecVsf78{7lK9J{{cP&5HDWw75Pe_<gX(rM{l*
> zg~nJyGc07JgYe5cQd7O_i}dTF)$t`$zh#k`Hg)hKeEWstb6$;FEaGz>_nM1r>!Ldn
> zn235TTO<8H6<#hY!g}JERj;c(w8Lj-*+=EazHy!6`Z$rRKw})tR^5FBYtsJ;e0-5!
> z_*AS<PF`iS?`VySH%5s!;_z%LpsYy`8<6s;%u2bSW9oqa7Fc}1!{at}F?1%wp3Y^d
> zk)^;xcqr73-C{nl+#w3QmQT5vrLY;DsU6wjJHEl%r}s|Tm))T2$&l^uj_^M&pD|uk
> zs+w34%g=;twgOsI`CRyj4}R2<g!!|U<_|R95^x^kHTNm5S$%b`*?mvZoFdy)+GC(q
> z49h;AAiOY>_utVr$@wk*-$4)aqp+T6=y^a1cu^6%%(JQi^FjE_fL41bRHvG~_O>in
> zVatOqeam#@f-gm9q1gMv+)_KDsFP>KQ0M``$zs?{7af)rowS*!029f at H}hewi8kL%
> zk*yKw46`F!l^i&B%>yKW)e$`7TEji?2kL<=xl;5%l5{=VUkUBjDqhP;x*hI?`CX;_
> zDUIU8hC=1aE0MW at dGg!elIKT6gx3c<)RLf#UDxcWWU0{nnxGkx8jaLMJ!1)w`R`Jv
> z(cY<MBg(P8W;}Gq;Zapb`(U(YL<I5}!o`5e{!=rPXBwow0LM_SXoS4$MO`BDMmJA=
> zxp2$RJ~q6u2Hfe)T{u$Y@?9QS52*^<g}$dVdbx^VF;>7ALaT)$3s~9PA_m3f4)`zD
> zjcWb_cyl(yR>M(C at s6YYRG#*<<lZ1p+aS50krSSgS{`nGlAdG6Ogdt4J=wC3q?e$;
> z;d`D<l%8is=tSC7=}!je<=lsRlR620=cxD4`a9<gRI^2Fl2dlAJE!}z5s*Abwl!YA
> z at NK*c2~g>jK5)xeXz(fYgavk=(mPr3y*&kXC at 5Wx0}f^_Z&VXbtvnq^p5!(1i5P`D
> zmhu_0$y?e`*jB1VyWVOjY<WvFyQVehTBgAs*oMAbD&8F7%Ei50e9wfpr1BYT#1<>X
> zFAL}~YT=#aI_O2@!0s0QHG{_;nOxW6#dp8mIvl)_c<prXcqb&;!Afu((z#k!=<u*y
> zhswn4n*3{(eB&Uh0ZZ<*xpKf$u_2v^H!~IZDnjoEkWRus`Gy1W?mAZYTHSuitzQI5
> z)gUvSwj7geU$Sy7+V)o*>8ciIf at 9@86}^5l-W?08VGAP6N${j=U^C$H*1%@+iHHqY
> zUN(3W#V}6pNj+`Ykczp2m50*tCvPF0<d-G6^L1AadLakt#0H8WnW()=Yh!Z0dZy>}
> z>Al*wz+fw#!1$dy=W>#k2wbmQVA!(yJ=qam{vB7PhgnJ|ywqI&HP&1oXg^wK(-4CI
> z($co9mIqrN!u2FXFHOL+>;3RwpfgGao(+w31D^t3<MpC;iO4lYVJ$N-#@Q{8Tv?TX
> zE^8Efxhik4C6h$T`7K6evQoHI$Enqm6$L9fi7jk83Lfp-Y(h&;VlkwJ23C$4b2EA#
> z6mPhvk&9|}{hthYk{|d_q-Xh|RT<jy{dl>AH!a at 8La3YJ`E<n!h?wge?6KBW_FAr7
> z$r9K3PlINj7-(m8EEoMe-ZxkxheC4EILY^0Id`&jW&Ohs?Gls~O)bV*3arxffu(`F
> zHAA2(aE}bk0bfTfE;hXr)@GDeDtT=fsyuU)m%3(ll_J(aCd~)5clr+S)me6A9~tj+
> zcl}hWK!1SpaDInUCZpvOm)aO4@#qnI%Q})PV133b8Jz~)yB=elfD-aHS!zSL&i5T~
> zpf?n&B9{%`Sc9<|k9ZfK)l&NrBS+L3UUO=!u*RBF8$#VpgNXh-n2I#8wHgcVXV->G
> z>{8EQNs+ETvo;iIQx0mA6KPY<m6b&6h+&NjhzL3b5 at +a!sN)94%a#07^luWMw#9?~
> zHi_QGm2dE+sawdtM&;1)#d^6(zlftJ__Q4bSNhn0ki4)vFq2$Q!urWYI|w9&?7Ej#
> zL$eg*e(3WP#Dg8QiR^HD?5B+drctn&fd&e#UAv&JA=?6-%=BjWLmS5c7mL$ic at 4-m
> z5tP|Q;wMF}?(P^sj`UNRz5Ry`fTk`$b{C*2aAwjI40{LkcerO0b%x#GW8i$bz?E(z
> z+Jt<Q$oBder!4Cv{o*%SsMESw2Rm|0Q<Gxc58WncWEjw1DQq!}y at +PWJU)?dQ%EQu
> z!Bt5HZ1-UKn;^}sw*wc1T$e#&!g7JLUEvkn7OA788VOerR1|43Rk>wgbh at r({tk?<
> zK2pc8oJ61fr>_P4j at eXKcw~WJdIl`N&bhHeUNtOciwC+n!lTrzrV3Uah4HvfDT3z}
> zNSo#qYNK7V;qfOLzG>oY_wW~BE7Sx}Md_NvZs#w2VFD(^?zFU-wJ6_v;o1Fc5x<e&
> zM|Sj}CXdrhfUW at Z-Ql~<{Yz+C<sr4p{n*YqFE-qLM#p;N-9h*7dzK at f$e7dC`r-|l
> z-5IBiM@`USLGOcFaM4Hvi%<sl7l2-p+(qC?MY)S{jCPmc7~`IYW30Q>Z5BK|vxjJ^
> z_h3hGH)u5p^nhKxomvg(wFuO26mX6f^2mpAi}vNe^nQJYEr)GKU%NED?-csG1-WAV
> z2`@S8b$}$V;m)fl$&9lbv%kd$o;~sy*egv#)bUC>lbkeyulK<ZB5c`M-dWx)?)Cr8
> z`%>N(m5*~6m<uwA)7TT6o$`lqn6a_oMX%)J5YLC at -3zGSj66G`$IcKBNFUrUXujLR
> zw09(u0BQ{>HO<VhWOMnI5%;a65eF?2Cp45!U|!yU`kFA>s#;EOqX){^AE7xVvsWtG
> zbp=a{AkRY at z7KCh%@;Zuw-a8R_X1`>0{J?Tu=8{9QMdzlH;9(u`JCTsHW$`Xx=qXn
> z1 at mDY<^y~dkp^NVYy>b<dw><cP`-F>AUq$Q%e|b!*Zbb<D%H-eihNi52A0l{U58s4
> zX_J`6SZ7yeF*M7egCT*-SRmG$zq33%gVlMF(JZDl0{Hm~L13R3qZfo-p&29j3ZT&|
> zupOL?mg;Rt^9e+Upe at HR+wDZf<fT<us?){nhA%hK9s_FvoP9ye?<9=X3+1<S8(Q&G
> zc+0cE`_#`BF4|#4J4C4%i!e2-n|svjB`vwzKf;%<D=77T+zCrt@}=bcvuls*p`Jq6
> zn#_c)$r$0E5&qfsIrqZ89X2V<exwiHaKPCpJmYlQ;W6oE=pL_SEObiY<Q?dY4tQ?T
> zUnXMS-rNaW9Ph`l#VJr^=+_<v)o$fAmtKVDp3#R>f0Sb~*<(;d7%uZl&M!TM*${)b
> zKae9njJzKJCVc=q&%eO;Trs|9Qdo~9|K~P|y!~AD^y7dna*SLY_Vg3%z?$rU&%_vS
> zC3eQ|w{7jIIi2isVg)ChDmfkBw4`Z4N1Uq&zR|zm)_}VvmjQ6ua7ya^!A`xHdTZx?
> z=yg7-BmLgRh%P|qpI59g()q>;n}|kI3JhAuTnuvgGM4f;*nfQJo{BboOg><}e~x&i
> z<?id<kHAx{(|-teKSHlZ^o^h|lEk8M4ZZ&MTG*#~`8Ys^*8myd;m-SKe{DPKbGGaH
> zYH;<DZ)dx{ueROLr{L;Ce>=a<1MRsomLAY%4(PPpieZ+)AJyl%|E)gSVZ3wVNAEoR
> zFYkO5X+sUPAFl`R{S8FT!z|$Y+p2}{tQ#;B#z0#a*52~wdXx8+GrGfe!15V~%m+>K
> zxm0V<bC5n%ig8C&4DZLn?w<N^N&W+GOv}IJjp<^RtO7TwFi?kCl7qQ44Yl}7cy>UG
> z9#8oC03rvdV^P8f@(MnJG_^51MjbL8G={%&nzUqY24~+K`3lpG{Wo7&OrE3uWj<|j
> zOY*u`emtLwemtMJowUN?^WXl at 3#W=<*O`D74GGmh|9EPGh$vw}`U0X6K!*piYV7af
> zXQw4x3Ec{^!Oc&5y&Jne;#Z;ee}ON<m{4di?uu71u at c}tjn+aLOUnR9NwgAPR&<_1
> z^0>r6nlF3z)KE}4+k+Xr12)n>U3yVzCd=xs_~~plyPrLV>3E1i9a#52|2|;dY=8w{
> zbz6vLI&E_!a*`K*d~tjWv2 at mAChqEjY^E%<=49|yp?@?HUPQksL9CGAt7V~wa_C)m
> znePtd*cE)$g9zs2qsLR at AJk9bCihhL#X0e+JrNw@*=hCQK|eGp_$tXCMXn+|W0c2t
> z3Ay#iWtt7|{>U|5lwNvG>C4n{?uWo7dP;-rkiJM5g4lIl6)+Z50O-fd at S}-%FVIDM
> zCTvR%zZ<gqVK<_<BUOl!vx2Vz7QPCJ%BurWl<wMw=-T#gJ!n%2cBZA6H7z(V#`!I!
> z8>yS%Rd$yrNhy8vxx{LUY02k;a*wki{?;4)IF9Uh!uJjP#zFD3yl-P%Z*_tW<2}B~
> zt^<n`xUFLZ&jRg`2KiS1`drN3kpb&$&|hW!|0q=@92aQf_);G3+L33D7Df4qli|_z
> zKb!apALc72Z*XOB3;_;>;Y<xYe$}2+&exG=o+8_$(MJ-<@-1SMQ%p8FeL9LfdrmrU
> z#1~A#+JX3BEqRzEyMsrg)g;_CaJ9t7iqQuZzKie^2ydM0KRX22ihV~0{COGJnoKxl
> z_?^y7L>V&fJpUCi4QA?1+cx`D(rNu)Mm8MAI=6CQW5B0Ym4!0D4yw>a8-&k~EcpD;
> z1y$04qqq~9Pjz0>zD7-;y$0?ibE9-{X2(NIt?1PF-Z*#hsj<D#j1L{^jDp_Oo9?qa
> zb8z)Eutyu}!pUD5MJibINlzi?yy|q$sm#;U0L`cH4EWEG5xYm$CukG0vpl1lKKax5
> z_f7kB$vS3DPGC{{m;_xVZJ2nr@%<5aGA;ZhdzEMOKDNb6&ktF^0n5%G^~U6`i~+M|
> z>B at jtX?Picr)sk1gU8Ly{V2gM*;q6r$+7#>aW!oJXdFj?LokwjEC1OF{Y|^Kc>CQA
> zh~)gZwXL|rurd9J1 at FZDUBWR2W!aNaLNZFA7Wv<GNnLgv4PEvi$XG at 0f##*Nd*wOl
> zDK)JF8fN)7Z0 at hE-Dho&lGCNX!7T3`UUx{}PzaiJsH%VYx}KUP7r74k-3qI%ZGUE8
> zL;JJuZWK0!*SU*!I^`8c$z8JZfV{R&a?8L%bKUdYCd}?Uj~-Vu`s*&%cfr?2;YM)N
> zO at Vm-ySx<k**0iA>WFjNX(Wv8`yP(SiOBT?=_4G~4;%(R at HfHLG$O#5owNh8Mi%AP
> z at 4O(t3HeaY)`#UiHIh45-cu{NXUc1xk{f>da3`8il-Jfu?TpW-?;z6C7&W!RGPJav
> zQD5xUDJ+?^c3k`}TO+Sh;DORJB72BuG%y at J(xc%Kb|n6(+9b4Ms?fflTnGPEw&(aH
> z`0q7ctVMmv5+D`+P($C7#AV1{<|^+>->XZm{GnvTDHY}VZKBjwD0P)5747Q9*G7N~
> zH7#hT?`~;0WQJ5wd>b=kIP|!HwRoV7Abd1DdKkVBe~5L5GDhG(ykM301C- at b<Ee}*
> z?~@f0o)7U12jyVK3~=#EH>4K5Q`{u2nnZIH)+5QC*DcjC>=B;PZt at 3kl<2f3rj8Qt
> zFwD1jv}}%QKz;NBSH7U5b_DsVbi9dj(E9#*dBBV{1WHr*Uz^5{gVu^JU!y{kZ}SCs
> zQA^OGaVMsH4VSR<rbO;0b^(s5feMxu3&=OLf(@1Wo+Yp7eb0JGhJrXN;LyXf*KQRy
> zOz-+0<0e>VT6~Ye)Bj_z*?$a{erd0t!~Z-i)-J%}xgYUet at vAbN5PX{w7ghQFnag9
> z4aa<QEACalCvOuytHr&8jumV%?*8000Gf)?suOaJJFx at Yg?|<GAI{70uN+tk(o;>e
> zv&qm-9j`1XvFTm7nuM$C0IBUrPsD$M&CZtB^1bzYH|%|SpalHwe6s()QhJFUw&93r
> z at kI;y1~90U?paM~y$g|_-gW6|ZHA!_AYwSK9`v<F{0$zpLWeulbYKPpD#hs<4jMjo
> zFXVRyGq8hb30R?KqGOjGQ9mxw(Pip_-58*hL@^CV>_G`{Q0a(EXz7}VtN(%qiWy%u
> zcG+?DN|1-K`-Zy}9m&7Q*3AR0xL_srKo;!o7%a%%t(NPUxnV)Mt~yXBYx=rE#6Yoo
> zRfmUL94e11U-`$ccRm3uGw#?(9u2Mwq7wSv?MwlMZ{GeeYJc%qyk>LfL+%*kE`X#w
> zx!f+BLG7jRNxpv7;60 at M6C>V at 9y2U8sVSJzBag)A=Pb1jEEwF{jYyk>&v-^+CtVCH
> zt(-8_<huOgrRIYP$ens5E`Q8YOUYEW82L+1n??Rq=%ZXrO$FRDc<o1^ivoWan0KU?
> z0nDTSvE at p4r{q25HMf~aGXr$ncG|TGYDx?kGe$*VV at 17*1ey0Ejt(Gl3_;}mR at 8Me
> zW_UVF>dFvt at UVlR-|gy99EYjN<fp>}EE3*1(Ay|4x(oCrtyRdap=o~@{Y_AGqYmCW
> zQo?xF#+ZmNnwS{GhXl at _LXjl7y=$904u5MH?}KNRp&dyWl~3T?*66T at zSfLekyc|i
> zmY3^ft2f=deQ+{GT_M?sXp!u+^A6slnmQoGlWp}T&A{!NZe@~m2((jHpk}2(I`z&t
> zuc at uO?G*M;a4dKSb_?d8iChLFXj<fY0I4iQ%XmPI_hywdH5O~^6G*pB8$Y2{7<6r%
> zgcaFO>k3a)aEy<`e~GbS{NTJ(=_}6}5pB1u|Cc)zduOaS%e(#4D3-x(XrHY|mJ{C{
> z>D{4Wr-`hDW86h6`0ojO86*J{q17_Er?58_-yXS-LH}<eymR2FB{z(Z<e7jxlaMD0
> zd8{JO1d(R~_CzLD0H6sxms at ClqW0#7V?suejOQvr+Rzdi(aVrCo%#wRHLB0Ka)t5G
> zk*Gj2x1;T+`g9`3RYh?7`;eiX(fQ^=ro0_~utnY@&@Brc6*=8PK67`_2`Eo-V160)
> zhpi6p7)BCucdQK*nghC2{=u!e{->Ka?y4cH9~M*A|IGF__|KcX3|G-&mzC=P2R*Bu
> z at FnXh`cm$l<<7-A$^jiRO+?kq#*UihS`Rp>c4eqhkOA84Nz7cI(MY-<Hf<C^P--2p
> zT0~RWts>pRyX(?b8?8*p?X$Kb;$i4*lrs)HCa8Q-)|h7t0V`$gJ<Nwn+J{9w9;sXH
> zguJmjKw7t;v9=)H?|7~HtnjJSh<SYH(u at 3)Fum|Ki_?A0Hh~z;Hl2(ii$lEeWcHGi
> zv3Tp^vD|{VleTS-2w0JgZyrP~43S!PB7M84W%}0qg3%|zhYu~!&N>-q8^e=vJp?>a
> z_=2IDK<bvuv)GvG0PfA`D#FhHLpwUV#^5U!>?xmj&DZAQ*#yy7on0B7k#7zjx#pX&
> zz(CJT+?vlP;ERyOi1L%KmXB|?Gg~ds6+H!yth+mTS=SgX@!FDAaAc}4iQYHS*ZBnB
> z=f1q>s;EB~z8zW~>;`2ZuuZ~&PwnqbZ`XnFy7SYKitebn9gHa!2kZz^lz|-bE<xBE
> z_WWUoqQkp`3JMhX3JdSxgh2x9<(P#dj!YMjYKnkVlY}kiJ-ril>R`!rPj8lcKlHZm
> z>CFI~TuGisW0vGkTpBg7bg(&+j^3%K9qQ_}$&G8hYcN at 6F+=jBmzo7c0sTokKKL0a
> zz$udOU3*6|j>9?<u)p`iJH%Zd#!ziK%$*i!U0LA2%@%=1<fS!zCtw4(&)~D7kH6 at Q
> zBdp*rMqmqZ;HuIYw)|a)$E`sF16-l)&;dAJl7@)BX?!T4Dp at zqIto9vz!?^9D+ITC
> zZg}3+miu1uJ<=5~#SF0v-H2N>;cJd`)wDeEwF5{^5fIt{d<1LrfVVTKeBjOl9M+$P
> z7dMI=jFuVz(FPTGarIc;c{oNLwU+fi{a5%}XGFCI at 6d*Z_fRbfyRiu?GHzf${D$p!
> z=fTgLRqN~rCR28CI43MW_+}WN*=}t<>e{ff*kroZ#-#uHl7BSEAWMAb9KD*Uvv4WF
> zz@?pU?*7focY~i1wdH4d%abiHFGD&yoOayGEx3vaUwIj>ts7+QiY^)UnOlC=q|4JM
> zTN>`&WT~%fP2Y7CkXYv3&O)h?>vn8h`MfEM+bxXi0v30BSCP9NbgjL9|CTrNq!%sl
> zdi<s=y@>dl at adWkT~j-)E<9Hg?_sbC!hUzx>*wAx<=^o7c~B9>pdwDLJZCC}gw~=P
> z%I_&yxLf_R0hXS|&j<6Tynap_Qa+uHZ-{OvY+~LOO^p?n&o2#>XrocedF1UBd54I+
> z=kZn|Xu6BN at oYIyX483YLt*`@hF{bhni}!;jtaZM at OfWrJ;7#Z<P?N)89=Xdo#e&4
> z4_+D0;e1|PoyFC8x>6;PLmG(3ok64rI}!K56XiROS@%+dw1qQhG6L&7sC1J@`mK9>
> zbD(>1x7V)3wOSeuAi`eM?x%r~7+Rwd3pj>KXoV+lkF_<9%4v;PthO~AzD1VmvG0Wr
> z&k^6q^A*rj^hye>`Og(Rxm)%1ol5SFDqq2^hm2cuv9ARJDS=e&0_NB`%?`P48giaT
> z&Q9bs^rj$Z@}Zb;PRNB$0#gFa+Z{l?hx_`xhoBu^04bFZ at 1Lid`(Q5!+y(fHfYcs9
> zrF!3EI5vvoW^sH`9Jh+23mCLo0%`8|dEYN?XFV$TJ at bp!PReYz)SDY at zQ@FQSmc}<
> zJ_E0{Url9RO^rtiu at Z|6(puE9-Z!^sZDwXW;tuX^M0|$1?M9?Fi<DGk7*Ba##9hM+
> z{YY&U_w`7*@ZApI+$|n(0QUkDv}4EFwGWX*cY6j-DE7g3+x3Ju at 7^Wq-y)99)C#J7
> zZ&bU!$dF29H-}5nF2K@%pK8V%`$(bye**h(XRo-kH*#k$VJhHQhdSO;4M+8X2Qk0s
> zyB^RT3glV9&{<yB{NFL0a|gG!V;AX~zmF;RAq_l=(gOk13^^%{l#x=uV*|iK+okZ`
> zb_1doHHr6drdEWtGO|sJJlNy2 at t=bKRQxHr9lX!79Q;XxrJBZ@>IknAZ-G+zdZVrf
> zxcwK+r_E}-!f0;*>^F5<6`e?vcQ;V3Uo;1~Tc)@hAH`GqI*ef&LqzMlow&!l-z1DE
> zf*BU(|6=p`5*y3)-wwYhw(aN3*YP;o|FAFjcbeEDNQ;cj^kJI!EA1T3EdK*eyE=lN
> zH$cCdp4lWG1v!q at H<v*Q4jW?}(c5ot1lGR$ZG1~`WrUBWN at rpI6XEX_tr6b)Y}?;;
> zPAtENXF|_E1yVSx{{_IENf^uejVKAWNG9K0DouEfew!cBqPOP$P&*(ORJ#+-EKm_$
> z_*OUC481ORQ;6M9nk4X45{RSrHl(9J!SQKG4?x$5c1*}pK?8-}p{LLSsQRHNHWn*-
> z`9aq29J9EVhYpw=2iUNJFLpNqV?4l8k=nfYOCH)&Uie-+D|fR**k4GF6qd|y;*ax<
> zW&IDG=`<qxRA%{Nmb>Rh?K{ZQ9&pO)lq~_oTAfe*hBuPsl&#=WbQRg^SSF7GS2_W>
> z=`hiY(91zDW~1F+(TiSc8J?#4=KA}^Gwfo!_lReEw6kbUH~P05t#IbQ9PVG|Yw(1=
> z_JHJQ=EF1tj;XKwRVk9!*7sB0w*<WJJAW=emCDNRVR;J=upvB}XZc at P_%STtB%Y1_
> zZ$$qi73qJk=zp&^YHKd)k<82aYQ7#VeY`UTa-z)gpU8>YKk?=iyt!Gt39hRcxjo{|
> zJ^WA3RT!fqVvKZ%youNz=X8N&TtlOk^K(v&nyiaCXsTGCk3FNiv_9w*W0o5^KOc0W
> zokB)*?MN;D73?pe`vy;pmhy*L?ACn9Aj>d!jhMUX<%{`f%-r*sxi5+_7)DQN1o$}H
> z3oM;SiT<7{`jotpw23}#L#>3I2ff-Mdi9!FyRjHvC++lIX$7}9Z^G;ygC3;W8zpA%
> zRP at 1%V)jC>P4q#V=z})?z7~bqJLyXO80z=OQ_fQK%NL?wFe7<kAQ5TIPVjCJ|4<iw
> zz*v!|kGW)x%wcEb+!mR||J%$RkNN5nGdB~dt^aN28ZmP-uFTvAH;b7oVdl=bX68<f
> z%v__Gxf$2YT&(@b%pEU!a=Pfr>FCLJ(Ua}eF3gxr at f3PWnAg+r^d0f^9qr6DbGPaW
> zY;e{RbimwQ%g1Bxu7$V#j8~GN^(r)27Jtk_-owuM^2ug~y>c>ioDu+mX!h=B!_oJy
> zNUyhxUT at ciZk>S|P#f=uOuzrZjL!I->&lm?vD!)G-WtjMj>!EEe_xEpCt^JQ5A!rI
> zJ2F3Sh at 4*z&r at L8xxj4ClSg%T=Yc7p6SH<hUkiKMTi_m5w$|@Dvg`fUqpi=`Knd>p
> zGmbI%$L{(IjyZi!XdAuRr-P2Z0Y|{8!T+Fhz at VfH>e5Tc!P9{oQBP->e=WW^8DF%=
> ztW`SPAO5Kzd*<%9HdYnjs8qFn=svR3B76jV<o?snD3SWu{Xy%e?mxHw&3)81jnQl)
> zKAjypmzJIJB8P^w70+UDj>0(>=NJaBaN_CTz{!oZC9oW{%>(MYCy=2WCePo%cnQ8D
> zO3~)8u|vbZPD4i^8U9=Yk+~g)(J}kU<4p{pus<@Zw+VkpE3VFMmi>q~xUiOi8xib2
> zJXr9BHz+sq1m`anZV3ex)p3yN4(B#>EPjoJ@=PskaV4uhWCn|u^<*viitB)<9%|Ar
> zlvq4wxsJ!wPlPwUe%PQJ!QavayX)WAj0?YH7WtlGc0}azAo|+h9b*yZ>LKKeslSO=
> z at u$lA*H}CIw9^c1oafTzWUgz_J<X^VR5$HiTC+-3o@~-r+!8X$g-Xoe&Zb84^J%_F
> zu{+#{nh}>(XK8u|Jodyp!Flc4*3<}|s~P-u{W0s}boS_e%iu-@$_W-zm}f&H+7XTM
> zh*#1{tHx``F|keV+IB!v=C*++)K&>vs!FLo=WOn1`uxCTXy)0Rm_yFx&O+4q9Pw{J
> zL#0dWxP%x<kFZf!c6Ft)(@OigQU&S0ahvbXX|NlD&r^@CshpPvz`dw2hcI4SJb;`h
> zK!F{{cV0Q~JdopX!CG2r?vQ83=nqT<mnh2ls<R4TdpGj6tUZVmRQ>{Ze2aOeQi<rr
> z at Yc$cd6h##EpFz|l=VNb;?Ai|*Zi1A2itzc%naNwz9-_Y?72?s!8cOt>b0Yh?}poV
> z>c9ltw~H^<h%eSgzBpQX9-0aC%@O!!y7;D5d~FiH$=847TTQF*rCC3;3}5={hn7`L
> zwHwiY1Zz~5xkDEkeQ=WK%hw{kS$?HAy<dyI9KADNsr<6!G$OY13|_VM27Xgn|NY`?
> z;hvO-C}<nzb=nW#L~ni>{$_IrYve}e;U>iLeUb0y$7#K5e^8;3#%DsuMMAk#QJW-g
> z0oMuglTeH|OWwm12IJv{GOgj;mT3#$VGlXSSuk$yS%?5rb}CAC at r2&!Q<mN-r%b)+
> zrzBwYE5Z9;ra8cAUjYis-fO8~DHAH#kb(-9yi_Z}y^Pb)-V4c13+OuoYXUP|4-dw-
> z%+O|j&lVqKp+JgK6&T at q>*?`>LtCZ?Mrwg at PShyJwGKIRwe)b#g*(|OUWQU8)rOQx
> zz^1QUZ;Q8bWTRatyI2BfmT$vv15(K-q1g2ZN|@=+dv3Xiz?u??!0JH+)^1P&jltt}
> z at EueqX}`nyD9#^{78r4(Kx5feqQ-_%JWRnEPXQ%Pmbb|o_zJldszkDSEe8A)_=wVo
> zuY&UxPB~$G;9?g!$9Ov&Z^ANg1t)zMOZn|`tiu4Q<HRfYFN+6OWBkyFJ^EXML4s3V
> z3A#Gnx!l{~EG%Eiqg)TVW;LXDE$EcQ-f at vn;GliHR#zd$GhxHT&E=cMc1lEzAkJRg
> z?!D0E>n7S<Vb1i@%2255?j4sKB*%*QVCbnAf=ZOUmiGgjF!A|*L$btmcxM+ at j#W*-
> zezl7*ZQ<+hE at -K5<K`=Tdz21;D<Vf};4Gxo5+_ at YAAcwG|MwkG=RSO^h1)-}!dB9V
> zNChuwXgzqd0lJSlepp592YjQ&H<wxx_R1c<gBA7;zGnds(gK-#{F!Gu;PnJj!0`?n
> zvoglW?tKEN_tj^deKnrK66k1 at U9{bVcrKL`)v4=l|3cKx_8cI*q|bkL^Lc1in+sZZ
> z?{hp{eO5CfwHK-HyoVhJxvu0xmP at -oMh#xikrVLz*cjI|KB;Sg3g20Le3318Enr4Y
> zLm};`z!Jc<#eVuT^sL#B=vin*Ge+sK*5!JTM{T%{M#-0}K~kU_3vN;W{kN(H9 at RCE
> zXbMFaki?G0FmHd0luQ;dyrb)GXu2h1M}+<}?D%Bpw3+=2H%oOB!tEG4v*84|!s9SX
> zWqw1;H1x2aMiV`3`9dO`CDOl_BK<p5jByL$Bv;4S4K95|HnV%LW)?MX;q$S^eou5N
> zYBV2y-=Y5+RMB3WXs->agj4f+?Lpu$ZE4_;-L>@MQ|t1^)ie1_J|jQ*CfoQC;~9BJ
> zMoIgE&TuNU`ATZ=M9_)8Fb19ASISP=nSt2##M|EmdHl};W=KAXPHUknlyC>GVb9HT
> z)Ujwwv!Cn}M$k2O07U8lEtex`UmK3F=@!x45r>%@QS*4ElvW-5Y?GYkBzlWD^1mkD
> zvlEbF-x7+js2&4<W{qPdj|1<bz_Ga|u1?3+RtN4p2V3mBFq;a>`p^GeT?!xT{pa6Q
> z7dL#pB~angLmLL%oqfJJ at R4pLF5oK<c3vcE$!qVpZ1Zro`v|1L5Fc;@akE=vuzQW)
> zdUOkf=sfD6ttj0Ry)>QaTc34|VHp8>nuYm98dl at 9c<`Mswm!S9%|AFtr@}uOt_Q<U
> zt3$0={nde&|Jgd4W*l*-!yIek4(9=~hj}-|6)s;HdYNDg+Atfl4O%1MCBa9eek59b
> zmkKMNy&5cM*65kw`NN)v&-FZqyGNB+(i-u9FG^VvIt$qt>3*&vt&yOP at VK*1U=dLV
> zq>8EfD2h3Urym8e+k}SE at p1(ys(UC3by;Yd>a^$oe)D<2({G`lX+|B6H|W4UJC0fi
> zeWZ2=;u3$T87dle61<O(M$Y?u&vbr|b8AE*fauenUEqf%&^pJumx=dH+G{ayM{=Kl
> z6yW``&>wpNtK;9jwd;-s=er+e&-C0cPul?v;Szh=OHF_8l9BuVNSSZe$rJ<1YjOV8
> zxq-i5(hba7;FZ|nYPi2>ZQfdU9_GfQh at M{VG5E0W{&6o#hlO!jXn#JQ+zSmFSgunU
> z*>Ro+?B}?-J05yt%aDrghEFbT={4dFl2F{<DS?{14VDzJiA0R?o4L7Qv}d&ka{pi^
> zXdR2VZV}h1LVH0cv_mnozK;Qw4?o)+vDfjov2Hu0rRe29K7_I}!4tm^x at gOAz8~kj
> zy|*=_ at BO$S+p}itr!?O?27brh)rHdDb+#}1{cZl=M&gA2y6Nv>iz<b+^UDV0UyadA
> zBK!<{<P#KS8#|qKFKgEg#`|WsJ1HNyDMQfapqhwrc!a)4(LPj2<5_Oe+lZ6}9sh7i
> zgWs01=<Tp|Cmo)!^cng<(Jw+fm6wIuohsTj*oV~9gt?Q{k}Q|nhe5+A6#6QBjR>-c
> zC0lmEu8>y1tA9lvd&wF at Z{VvyZ{TzhOZ{2F{d*n{BzUvxb#11AFMu7h9u_MBf57O1
> ze<NTPXDHXEc$t}?Y42KF4{nz6$(Ed at fEERDdt9Xb9%O+IN`rqVBX;qVkX&O2-0<O2
> z?Ce+I;~p1sJPxZ2drM(UQA=@4Nz1&J(w6zqih)!ca|+T&lJI&N$-n!pXv3#MT5Kn2
> z8)K0ELH2ppS at 6irMm#%xsuy$Y at i6p!#*_D-FY6Ekl6A$~SOy^IV(7zdV9o3gLMqT-
> z+UF$x+RR^J7Omu2#A`=Xh-V^qH-YMX3r`$Zp7g`_k;qR^-qwo4_s{BpaUsIU)hAwU
> z=G7;a at DOtEHP7~F<F7o!liq8dv}uUOL^VKpl|L%)9WCzalPW}e*mBKV?cgCMpasv9
> z+#)P}A=po22?*T3{Ve(f(DhZ=$wkIAE<C1qb}3*Ak1EprKN?Lj!npfwkv;WiuC=l*
> z-wM~_ne{rC*PFF{hU?5=Ls3S|+U+x4XIpY8<+=zT#GqnppW0W?txAb+9bxpY2Px%x
> z+w~BxEcF?Y`!Rbhl%n}Uvx8<#+o|82A^){LvKvrI9=&Muz=8(EaS(er_Je_ih*mq=
> ztCod+|919}MK8T%DKIU137r3_12L`B!26#LSiGn;M;X<ci%38-2$F=lu5#Ns_7AKB
> zg%j;WF at mAX_le8ekU2Pyq~@eWu-MKnLz4#BDIeQOezAmS1n_Ik*+ckPNQR}d!Jb5v
> zB0CF at 7_hdW*|-0)6Y_vK>E-7&OZJjQjljXo*{c>cKuY6*x6%D#CwmJuKkcnN at RjXX
> z*t`C#;>9 at VN3@Q}H(YnPbtEJesar>BBk1jh<#<0O|K`nz8^5UGlo9fpL)`FEE!x}A
> z)Cg+b+~gW&XSz-GT0b`cX9X`Z(n9Fg1&f__Sbpp$jhulJUn%0b7kUbnc_^z9QDThH
> z+%dq?nIy9==<Jp_?a<oo at qphwP{I!&zus>~%suGjE2YRE3+>Hf<wo%~`G$Fbr{K+6
> zSoqqNZmz;Ffpu$<Tj%x=?GXA0 at Tq9k1e_qcYaVnVNryQ~C7luAV*-nag16hL`A at u&
> z4_(qeZij}E%`qmlro2kF@^QfK0JFX4A)$wV6wqB~06j85V_h6o&b#|`hf{pF!M=iU
> z(-<vDSnHa)3SILQo!<-`H5Rpt!?Sp8I5bFhbXp^K(H6{#YAu#k>W at Q4S*WDDjIbjo
> zk2m5S;SVSlRuwU at pNR7<K`P$&f((^D*v40p1&5qqB+fySU1d;gK&xB;ULIhk1c^Md
> zO}1{bG_l3qJfvom-#t)h`MneGyvRmj^iCE0bH>5EA^Y at 4G7I8o=H*pN?7upX4mk{e
> zIXr7%0ol^F=GhK#SO&ue;5F!?z0IwO&vRqmBm1I2w;XTCs~FLKN;3nthwac|kB*rP
> z8x^IyAPr?#Zqpx1+41nPBzLZA*qYll&piX at 8C~-T&lF!^A|Klp6?8QmuXuD6Mf?F|
> z=4$p5ul8vIq}lODG3OWkiZF<>&`*kK=U((H=&NaB|A4MzQ0G!$nK_P`T}Ih%S<<vg
> zGc}W*#8lZ{iKxZR54X%{$qoD*n3fg$m22ya!Nq|8PTF at uU(&kcDmb|Fnjf~0L9{Ox
> zxSeW<RXUBHA<r2|K%D!n?z;VES6zKZ%RE;}LwZXIG<1g4q#)+qWvsqTvW?pLURmg<
> z0aSMqn at M^(;1UX|n^_bYI|^ukhv$@zx9Ow=_B?E3ZG9GKd<y$rU=o*LnL`-GCBc2e
> zS~-O=GMmEvSff8w?4Gv!Z09)pIcDnq?)0qYhXuyI1Y<PK_d4iZhOr&&oqVN-Q3oq#
> zmunDFII*+cjacBY#07?Sv~>pA41&@gYBw;m`+T?gbo`&l8^6WxyC(Mn<ZW-w)uaPr
> z<S0&W=t+!CC058Wl9+iv7sqaKJRy#~BtyfKuc23Ws^FCwc?I9)-dXU^oD&6q$yr+P
> z$DCCExAj)vV_0{|k#kJsYy;1I7^Sh!K9{8y=9 at c^%Cr4i!{@-8$K!4{?pXL_zXpC8
> z<d at zPpcqGcdu7vj<W*w$MC3h=XNU!i at 6WAx)c7Z&icy>M1^0XVNbAq{SpLm#<d+xA
> z)<_((g|Iqqg^itB at XEM`k~Ptds97W8rDClE1K#YLTfQO`5D-7k`-!6NcJAiTiHx6-
> z2N_-iB#803cM7>4v_T5ub54l#qawXjq(z>bRCwIl)iodew*vom%-u^gvk-YHa5Rxt
> z9`vs5`gVG6#z9K6bt3m6F&_eiXLvR20Wxs*MrPT57BV#<A&bBz^o-UIX<N+pbN})L
> zeI%ZQ<#6$iB=9&9tLDG1<Ksv&CZJj`@|?lj$=fgd%iHKht)F%h;4v#5uIdo)_^KrT
> z_ixNpx|2iPfOmAIA0iIor at VpYM7f7;?lS;8-U$5WZs_?p=9ycV+?NmhMrzpK?Vei4
> z+R_jctHtqNsLz}BVV-;V&SAh7M)cJ<j&p-CB^11MfA!$aLs%9Y7CPpzgpQRb%A?(d
> zXLZm`8{yWU(L>W}2=0FdIntfy*PnapLR|_h*nIs)94{Epna-O#jSh+F7IPNb^QQLM
> ztr<+W^}70pw#Zs%d5v1A9M=lmQynKm=V`^9GOXvlhFOO=lj=g3%h$u^a&h(7?y1Kt
> z4ypPZ=!xG6xsP5szQ>}S#XAAy8bq$qc-jjHDPMiskEcOA4dH1#%7DK>QN|@${*l}>
> zQpTQpfnnbV9O4AHMXKd(rh^Am72KkSc_w<W8+z-E{gvrhEz=9>(g+8uKBn4iFH|4f
> zx)%PTbvDlQj?B;?VEJc|IYmL^aqhF}4ae(`fYU7Gl|+dKD|f0+J4!s^tP*r{vcq2e
> z^?p0X at Eg)`ACSA|SFF*;RIGun$r at c0ajpks%|!1iCD33i0*$S+t*!nV{0i7rI8t~F
> z))**C;{KrAubt_l+(eWc*dNQs5oTxub*hwZyI#BjF0FVY9MJ$+a3pez;$K6S7R`Fc
> z3iu7{@ZE|TF;{^uAKuEMxw+*tP`8LhA?E4ACTJoAi~5}SX0P~Wx0>mwMDLppWgrFt
> zd{+KYu1D{Gny&PWmH1ZrZUs-Mi1+{@(8&Vd`U5wkT{cm#{b=ic{3`9;jM>q%3_B=`
> z?4Y8JpMx(P@<$7gc=ymZ5k+AI;cm44Uz#f0EK#M=zi5MM{5yj&4JToHu7l;d-gbZ)
> zV0kV<9w>!+!8-^IuIS8vuJEgp-g)75vA!j5C)ULUu`ZG`bKNs|mTz|J4B{mWUeJb#
> z>-_L_C>5Hn^!(1q_5af>;(ABqdKR?J;sCFX33)lbXftwfm#~j~qQxs;bJL~Y5;qO7
> zdM at _qufVZ51s#>+8hO|6cE8v3#et!~7{Q5gxBvm_Aia%ai>d?vv~0URGItG18oc}-
> zBL5ihhmZz1RJqf*CG!JA-CS*~vz9p8jt>EqYLxD}xpf`otN2KVq59a)LU8Njz@<3m
> zF4|c1V$^Z at H1MzL&+17>_e<HF8q;uG-pmsrIX<MFf at N!WaJhS4-7<JmLjI;k<v9EU
> z#7K?IARFpq7Jta5!UtJQQ+!{|snT;!cmrNWFsRN at x4(9M`3wBIK7*PL>N**;c66U!
> z9hq=2^fjUaeS>J+MOvKg#MP at 3&1_SyT!}SoB-$4o{4Uw>VvM{4R{a4)O6&>FtF!a&
> zGm6Km%spForXKoYvB|H%ma)uZQ9AmZz(q$ma=7iR at l7*#qXso?|LlW>%)0wQ^O*us
> z{yxx=&xAm`tg$2`1)Qw^;krI+SIJ+Zui1azIB)5aF&ggyqk0b`^67ygS4YIQUBQTe
> zgNzwJPVnvDfo*4aJkDPok1FQkMn at yJ@E(!@@G?gwkK+?a1`x8jzULDL(^}>bFCEt(
> zxgG<Ld^Y%-V__Y`0BLlD7y9a;iJ%9>TfpxV`Qp9f_yR}=U at Ze4Jh(Zb>8 at Wsn=u$K
> zr;InY%#w|uOHS7x(LM*ZCu4Q2ai+8F%;-p9mZRXgndgBUT?*)hsFUCvzlOB|ew at GB
> zW(cjp+K_M+gEMg%W5f72QqjWC$q=NLV8-?l&l`QB2GbpDs at Fir58Tr;;2)qj9t&gb
> z;F=kDw75eNtH@)DC<D2(`gDH5lNDI|cHjZP0l<&C>y3PV>TfYj58Pf-P29+{E^PoU
> z^q$wPUBI_03!d~IL%v_UG1EC8eLozlq1W+tbuVZi5mz(xIik3Rf^&!m7x at C#7C+2S
> zVIBi6mG!T<OO>cD)j@)o*gK0MoneT~AQ3M>z+ccmUrhxk01;8V0a#BCg4c6N-0_8B
> z#4{h{nRn>I at ki}!DSL>$#Clk&?rz;5{^j=)0|Yk&?tyH$2ik0fzF!0Dn+yLzI?!wl
> zwq>A~SU1HrZEvcVXE0_<hd0jg4LYq~d|S`ntXN|<1m<mp-^fdUgHJx4mKb@`jQxQ)
> zST6T;_k%KXvL?)+fh6S7`+iOLBl#LneFfgvvuJZXXM8S|bours2AT!+A==LW4e82(
> zZiPi<O-k6JvTX1lzjG|(W|XroQqFzYljwV^$uo5*AEikcubGPE`!(SIv2us}A5;ps
> zQ<SR;+Dd8krg{tfwk+HUtw^-sL=#iS`U?HCIvw;bz4xK%kf54XSf3n%wJ%Dr=x9e6
> z{KsS34WfkXiboBTuWjX}MA>GyHZ5pNbHBA|nEOlzc1?edlI5Re!<>W%M6(t>phr)b
> ze80YO2mM~{`x<SsYEgg<@%1i9f8edrSBQH?Iim$p9s$?jeK#;AcmVfITK`v5d;7v8
> z{_MMXX1AW~BBu_9LTm7^!T-1TpT&PtC=|LM|D*rQpYjLAEC&TfYv?eq`fId3BlKvu
> z+$(|pevj+<Sjb=c4<*4;C8_$CSWRmjN!1SlQm;`e-5B9OG2!}ypwL0>!X_xlzFm_)
> z`StF;8pzhI9*5_ZvQX<@CD!A>PND}54}S4CjlgJupSok5>AVND+N at 4kn_v2=mh0aJ
> zu4^pMa6qC#yjz?dkV6VSF6a-7eGxY+D?255dcz}{L7p1(h*GOagD2$Mcw5skP_$9?
> z_rRNgrIX@^#h{N}fi%!F%RtXaM9*AY1$Yq!yYJ{fnFH}*9^S?QErocpc1Sb3r}QS_
> zo1pvger%Y+p{QZR>)SX$+<}YpP(n08Q%DCuciBPXGY*LQA+#}n0gk{?Z(sQ;_{myS
> zy~bY+Sg__;EPOTS$`{K~=)H&dWP#%W_Gos%0Kfe_*B!s*^yr3z at JRJQr<rho(DmvN
> zx&nj+9dLOySHYd&4F0F6$1iT+<^bS-_-W`af*Zl*WudGzSaf5y{|~(JpGSD(wjc4v
> z;Z;BfyJNvgKN0M4W<@yP;KDL3*dta&D^}C(GHhM0(y!2M^sEldP)+b7AgEB}eBzCn
> zbyejL&pqi_5$ZhzZ6>b<?+m~md72Lx8*#DuvVd9eu<5FWF9T%Ur`Y-Sy!fZ|74abx
> z_KBF#{4J})QA*u2LZu&yFJYFgP~q7iTnhT91YDIrk^h2gxyI~?FxU8vRm3$8Jz5re
> z<9_sw;2MkC#0mQRE2J-}Ceq6U^&EK)JOvcFZ#?E=I^Mg>4*HgN+mhfVB#HgR_c>^D
> z8_h;8Bjuo(DM}O?-h=fKc?s;M*c|W;Vu){mSrkQ_gCBOOpeujTb%$ZK3NFEA=-7v~
> zAhWZ)f&JoMV6><WBTj)=>oB|J4r9TPMZZ$)tupcSeB}}&OCGAZ2b3gaEiCbEDh1a?
> z1qGhf3R9N7SnOa-ZrxZB#e(!!X(eJ<u88g#ute5Dv#$ZTbCfv7AR3ev_YoQDxrclW
> zM2&k&2JE&<HjH at KI1k5v1pcG&AB}$+{&pI3Pci!VAS?q4DI(=A=!c0~V3cLXRb_5#
> zDSbVkEa;2j+hDX(*|QQmovAlQi|dWbpS&wE|At)&3S^=bNfVMIyJF&nz7v29g<RzZ
> zCm_RlXIW at r6<St87B99cKKz|AzxjJv=+<pQFHYyX$iFPfVQlbdo!wdKEc$W`=*frq
> zLF_MX*yX+qIfN0?hr2WzY!a3=C94*?3Rry?2ceg}{<Eg0{n5Bn>FbtZ9abB<av$S|
> zovo_^R+M*x$Jl=#);n4!qr7;ZGu)3)t?^BO?D6M{Q&_E4Y18tncctV%unUq8d`nVe
> zz|E8+c^?HoM?}l>REeiUe)N=IeYzYmiNGuIte^;-o|R-Xmj#{;>NB78ZMj`oFfUQm
> zKu)hjwImzoAKTe`?ko!#&qDf%-P3cY9Pu^bxfA782_J0nNG%uTU;T;#Bk>=7VJy*8
> z_cmhRT)ck@^@3>IExU$XTepP|g?_&|KRkP$S*19Snt3T-C3<6pc0K%c{4AX2Wypi5
> zfem at GVUmUaEYf2uLEXL#{}&lQD#P+a8F*ezoUktF`J?w&@a5N*b4 at 7^5RP at a0=o|=
> zPDG8H<t*d}NamFv>oP26F*?;WAhqcShP4^A;n}73+1ZcS=NwEvoRr<Py0ERL?MuL<
> zxSsXB(Z9}@CB at P$^_qOQ%J$5m^{_~T40l*pxo>i|X?(tF^!1=z_&F=P9Jr-(AgE>!
> zv5)oNR1fX|toclv^=*WKf&$Hd0&#B*d_C_#?B~+1+aY1RvrG1Ek&C&0VG$!)(4E2}
> zKt|kblKo`~KMP~vX>GMW%6Ds1nv$vNIjC~aat&TX_)<XjAK$O?<)RcB_~0ECm5AHc
> zfwd^ZdySZ>`LVka`f9^4!uFP0082p9SGg+?i}_xNr-{l}_3*r*jllPS!FjN=jd?us
> zEIIrPxsv*7>oPU#)pxq-ojT|M at +?n{=Kvr;S)X1Rht+jAI5q3bLeef!9As4v2^vNF
> z_S{MB6Rm*miKps}0ld`xkX_gVWar7C5fRpG$Us^5;Es-~ZF3o8iFkJz_VYwYkS#{o
> zY%v?|+~qX^)+D&5;h3nApSpklggEw)BzY=b(~&dDm4jol7rtc6XH!X}b8yS!#M7nT
> zg47O at InqpruDXFNFX^r~0F3C9R%@$;;21&1-I;A_VkH}ce;WSj_}lT%07P7Zb0*F|
> z!G9_Kci>+E&YdefW1pI?SOIDExI%>7r}Tim<lzu&V!a9X2 at j$By}pKmRlC#i57%L|
> z*E=A$6}CKWV~FR)_;CD32<zi+NO0dm9a~VxU9A?>GO9JYHKsMTAa2p)i1aPD7K&O^
> z)IWSh$w$d?tz4Pky1oQfIJ;`dg1AjqR at m&!suZ at C+NLrK(or_p?-vYdeY{|1>$3$}
> ztqo#~sNN{0ZUlA+1JX+nSFr?XicLuOzeO5+_T7oJFYE>dftvjcZ_2*O<des6i_#4m
> zsTwgMAF<CGz&P4x``*KGPQfFq3(E#Km6sU)`CLm*sU6(GbVgj&33&;rtl>Bst*dy{
> z^1W|X1 at n-W%fyZ3gKuI0 at EGUGni==9VT(ro=(3TX)I_u*bilGrtBab3sNm;QKFYO<
> zG=Okc(%MWV%n(w#Tc#;8FhqjBHIVX<q^A`Bo6)M}=(Dql5 at +<htJDVUbl|2ETU28S
> z(=A9G!(#DIfd4le{>kuvM^V)%q8fQ1Od=`tCWRpAFTOzjNhn8x4uJu_nhc4}pkkW^
> zMVpM;q~Jd!@iqAChTjeG-Xs3Yh!nMP?{i89DB&ddt;@nUMj#(zOu*+JEHsecg1@!k
> zk+ZAI`rqCP**ya$ungXdU&bmTS>ZTf<j3*f0pA+frw?f&ax45OJ(Y==k1AQWJGLs_
> zyUz!}foRLzeZH*!EZ+YqtbE at 1E20}cRmL8VF1u)apzNY<G0ICtS^tUu&&v8k-{U(;
> zgy%!f!n<zbDnUnB8rBm{U0`}^^`WRPd{ciD9UISg-BQLXmiT%)6R0nJpZbsaJ}nFF
> zo~Qz<T!o#6ve2GKL1SGmpI;Im`T#N;j`?#hN`1QE$+TgR0GVNFbO>@A1N%wY#kd@#
> z^z05nL!w;$?SM(Ob%27p<rklVhmok{KSKAlm|yo!mOqWXraxZbUc_zB>wD%HROU$1
> z|HF4F-w?ks(V%<4H_g__W`J{92z(EzQdiWnu7!xud%)JHd%;r(uIaL}{yW^@-IRC@
> zXLR0WZE{PY*O2UDdanU_8pZKBlGoJz-nXhOr0Y-&o+9XfPVXuv{iw1uj4ZpOjaJ87
> zz|jg!)v!=GS+7DTPxM*@OW2UBRPmbp*cYN{-#l3#^amMwql<cjdIJ4hg}Dh at W<wM9
> z#aiTy5jkO35+02T%LmEAi at 8q6AQyn`WPbb$G45!1_Xa&asN_$1f&7qsTEZ^F=c8Xh
> zUjG|XCE}y4U~4uV+%_G$n<n7k%En`m`5H<p8GOZK7b$_%H_l5~!Y!?`lF?dNk{0@)
> zwP-i(Fgo8td>_0o=o_&9XkgJ#1E)9p$d7{S>ix0*a=(z|t{x}X at wsiGi%z_m2dn<H
> zmK=EX&P|4N;<5oHkUw;kjHglm@;=*MQ_8?G_!Qm>t4r*oGMdgPyi3kc8ue<^k`CD3
> z$B<8O+F_Xg4mHthN6fK!W at ERV$~tYW7-k|bbayHCje7EidxZ)JGMdZ29+l*QCpx1v
> z*t*)sb`D_1E6~~k#_qem^K#g443(X~V$`c!Hg0+IXcF>&soKi=->gt!KN^5exlZ4d
> zr5Y7z*-->_f$ak>DA<G81?Y*}j^de;E}nq~0j#`raU-klLgWgR^-1Ss3Em}3*KjuY
> z<PrG3D`Ro*<{L)6TEvp0%PxO36ZoA8ef+5yquG%@7}Innzj)MZ=mo>5*RJ56&(_pi
> zX<pGxnX at 3MhM&=$dcyoMo1Tq43yci+DBuHw<Q`uG77I<PISYQ6dC%4WW5?VJmj-Qp
> zstxe{NG?0t3miV&^8*R_(W71k1e9 at pjpqHF1q$tT_-4afzTJT877uCeghEG1YK8C6
> zPK#Z|G8feLZNA+KBHmhL_(mx~8apPXo$vd0monsFQJ@(DF-YexMMxB25~lF|XpfRn
> z*5AHYjD9q}hdt^U#KWa)eCtE}FMwK!JGr%M8;*_msyz4T$v$9(qX45CeQVpD0}Mw_
> zb@#2!kB2X4_50is7jyI+R_wj;?YbgE=GuY9UGvGaG+7p6HNl&7Lx<Ma&NlD!t)teS
> z{0{$b@&5*Ycn=CLN3=1weU#Gu{kk3>XrN#0eWGZ^uC<2@%~Mrl!*L-!>k(QD at nwTM
> zb#-&Oz4HP|@i7Zi9cvY~LC%le`*>bu6y)jjb;S0d7>Km54e>SYn(@YY+w-8*o at b*m
> z0zGOH$*O(h%LaG6 at BhrdEr0Uf$6o at q26xs`ExBzbdW-aq?(CD8fBk8*!&V#Wwl6Vr
> zX#bOa9{lBv${)4&3B~nSYloq^{(Vct`*kMSQFLu<ZYYO5hjRNr+khx>O$^am5MLEF
> zWHscK<^NCyLu40}a*;|2f?gtC88GxwNA$kq173G$&&u9J)cc8|^v!D<s`f|iXgp+L
> zRcvT^rEF~N<gmzU?bN=(`gOuOw-UTHbM_MZsP_#Hlr!+jPFqi1uPy%uygz-|+6LzV
> z%Z_8<-I-L&j;``G%(UAkJbrJdND;ej+z{N(9^^yI*Mu%;m;UeNN&lzvvdIs*=*^E~
> zI!w)-2PEi6rvB-NKD|Kwg?mHGr$+kYe`-<OH7zpjICfaN+L|-yiAWp%I1p~p|2B#k
> zfgv;k&9IKo9&++q>`dR)!>h!}Z^ZFyqHXX5GgutI6UT4DY0_yt8NTzaxbv;J6Hb34
> z(&3z6i*%#}vc0<UmPkkPi*zKvNF)D$i-TYk(W3_dPisVv#$tZjdop^hs?@AjOf?{S
> z3HTqG+C}P3p&Nny%YT4+p;PZ~9 at y;WJ;l8-G!jJ#wzUm~9ny{k6%NVN%7x6z*~;Mu
> z1a^MdD^kULG%yz%${N{-j*&{nrAO6a<ilm48+?_ at r7KK*Jj#(qk$BW7S26I15#$Z2
> zrT8}of8*57k!Kf-2>Il<qcobI2FBUY{khO(PQP at UI+e<*bC!Bg)}HnE!J~~R3(!5C
> zyg);qmEvfwNj+>Pyk!pbRowaT^g7uA&DJ>(LDC)UV<k4J#_n31e1J*5V9VNMNQ$-3
> zBHxC^f=hWn&Q;rVYe)3r1g0ndFQH9A-n4l?u&$67P_c at j1mfNt))xb)!luMoDZ6+Q
> zX$paxo?c=fo2v&;RW6!<xDT#%6*kL?Q`hxIRoL{CD{RsYh&VzV_J=`_+3bkC$J2YI
> z3Y*QM-CJRkvny=8TwCR at 0j;)5VUESnt0;ghX{fx3C&B&^k$Y5FDkQ?cR)+x|7%r}q
> zUcJZlU<W*lA_}9yc~MD6%qMW+oba{byojhwCBfq>rR_%jA{GTHOFZ%d8g`{aO9eK}
> zlq-^BtTd0OMCv~U-j_>Qk$xz&Hy~Sb27<@+;LnvevV<OMuUUq5R*AiOu)DC=@}<2u
> zVMA1j4OjNw7?f_hQo8u=Jbe2eNU=bt(%6M#Jus#>pncIO)1pcwSqS|^9E)ibf=<;?
> zVV9(plB*7VeVpba=F?E at C;a;rr5t0gU>;c`F*_zJ8G(6f5<H=faL;!C5<YcNQ}{TC
> z?9F$oB`5hc7XE^&edR&~7 at q8Y%sq=nj$)dW%W4d~SW6hQ>oHbq#cW)weT;AK2p*?;
> zSg0QFU0aV*7izG>eBad?%n}~RD}kK=Bmc5o9Vr=kiol$0`c&T~_v1F3-tI1NKhd?!
> zwU%n<3n~_1ZIIiwK(`mIe at Oes|Hs&u$46D2{hvE?XUlrC009D-EQCdffq;g^a5D^n
> zL4*jA@=kd*EFxW06!%&=liX;;lwynnBBg`IAyrCK&70z at Z+inO16rijX>pl0i5inT
> zE`S)~IAng`=gxrG_wDEN`(x(r_ndpqbDn*nzFD*U5BaaTtZ&Je_l;mR_y&6O33 at iG
> zYbNRaJoySFC^qt}N1F><wFUI}de`8G at 4^1w)xq at R6*&G2vh8&tA9)tHofY_G@@$94
> z at hW?+)81`-8oGO)f|?<<&&}Mq$u*pID*jGAQ$bfGohXgZ30=8lr%G!1 at V(BF$|6z_
> zuqxXDuakmT(CY7!P&Ky<dt<`04agXhiM6RX+bf5bs763R1KJ$pwq}_kL`lbJuLr5l
> zP_Amx)OdS}6FKHE8vE`AY{G*K&pZeFUjD_^=9`JUAJ+cau;|pTKL5xLZ993tP;7)X
> z<wp6&8*f~J8sd}CO0GIGZY`_Ms>@Xt!dfJR90b3Rbc`GpCaN(OtJQn;I%<zoh4#z)
> zu{cynP+vDz at 5es$<CA8#ADFVQZUA5Mj43LpNt9<065eTw)F1xMrTixzXw){^bHk4W
> zW;GVq?BKE9WBn6ho0!A9RXf2+>wTh+jd16PV=(HuT_g4SR at taepjSkS<0|yoWXOjl
> zAJtC{V*{dZE;viwjvjmu{z67B1tKKjK`;JO-L6`RJiIzaVos`ep{T&YBSNbPu8XEo
> z?FaZsS{f$75+27OR%w0REW*C7m`@E3lGM;@LfwZIz@#JhIasNXw$B)Ue!^9h-5qNK
> zwYv&L1>WDjvcz5)<P{;ZayVP5t+ul%h?uNQN!wXeUKzDEtpzkkz>6`qoD1^w2d(n-
> z$6mv)6+Z>P4RZctPKLRV^RtTN{B%*S%={Sln{ZB)9Z9XS1Bwyge{AVKgKS7E8cqeJ
> zxw*j(KLG(2Uuc^Bckph7$yq$ryR=-Igs1_x)gD1Ke>yWU>0}uj!AAb2bg3j?iQ}xL
> z2K5RCtMiG8I2r{EROFql{$sl^T;VmU?}KX`*KHn1hA#lE$(Hs?PpxZs?;lB%NY|Q#
> zrL`=Bs>cOi`&w9fL+m_xHUvNUw0Pjvs(ZJu0LS?RJPkgH)+(<#fPI`hSgfITd)FJ|
> zhl-%l;hsewB at Lw4m{^QY#rrp4{s#Bg^jc)&tH@;Zi^|}ck0zFw$Noir;?*&7=e#k!
> zwt-%r3>~eY(;&z$c&aXudznG!3HeH9CghZj%0&5i7ZdB!!7-<jRV(rZWSz~zRGfpA
> z#*ktVc^I{pt=d#n+o{9KTLQa$Qiscbz5k><9r++v$kQJd{VV0^kBIL1F*~FO=-3)I
> zm6v*ia`qcR%;wV?jn$IUJDkF1)=jFC*tr&=TB?(u{JqS?Q520Vug^senqWcwqp#+M
> zAKd*>%ZGC14%_gCS0^{;_j-^y?czJ-_&b|7Hi}JahjSy7TZCp4y+y9gu|pgB7J6+&
> zjvr$rD+nJm#G}FUL558d`@q|Ev`v<!deJ>9mQnxcf9D>WwEKGWh8gZ?Sqg8zJ7i`Z
> z)m((wvTjjCm5%JXN#abtu;Ru|Gnvz)A<t3LkhOYx%&~iSZ?9bV>X at LdCX)>}PH5eR
> zoI2Bo5A5FE+|{ef#(86V56f%kje+-PVZR}gRfFo4jSa2q`i?i+`whzR#;)uQd>p*N
> zYt<2uyaiZi%LU6ENYQfy(H`~fd<wbPZrghYw|HH!O%7Z7s4f7PRV!o-ffv9&F>Lve
> zqzbZ*zKLkjPFpr&2&3JewZ0$mkNJ`6eOqJ4vO6Zo_FwGmlzl&HtK>51Zx)_Y_fD7B
> z at A|tel?sl{yY3EV^FnUouAyf<obEsznhSURc10Ew^!v;rb8ODpBHhhl0o}e<uH^UZ
> ztnGbfz_PP;*tz?8<S8v}+~OTgT;#dB&OhlME?=CkKO>wrblfzQjEFPX^YBIm^|TO0
> z!v*Mthb_pQ=KIT=){b?uz(;iozKk~HzQfn8<CWabjYB^K$F%;82mT6+;mx!_{58)y
> zpM6a1bR8IqeuTPDs)4Z&2I~gv2bIAFXRX*9Q+)XWbB7|Y$o|9EbwTlhp}lUX{It;S
> zXjg`2w~JiHn9ezE3fOou{NP>umUE)(!e_Ii9|1QvMAwIpqBUb(s>k42?^%fUG6Sa0
> zg_$$))gLM9#g+`~`3K>9sV!95vg++Q#GU8rf+jAu*SUtxZ?qfE2<-~KP>8pQb7%Ed
> zt;h?4C^~92{HfmRbC`Qo&p_O*rmzJ<8Z744 at O(uKtpWyKvv0bNKd~yo_ucCIJ)+4u
> z^buz57;2Y~43^d)V*d!@9bK$oU2u)JhIlAmh-(=^3uXJHdvTPBJha!<2r@%74;yO>
> zE^-KqlWBi^dax3_s?>#dATxY+a0Z^TC!RviLpnAvHGb6|EW}kgaa0h at tr3Ka*NTE8
> zY6SbmqshTEhae{>?o10>9D);m{(2h{cu$KXe_rxo;;z`}vqwc(dk-M~(pQmI1Mh9v
> zUrW_wpJRJ5vhyOV`gZdg#-KqX%}&&=m4ebtW^kiXQI7_gI1QQo5ut=w_bo#9+h_wh
> zukV(&2qmEvT0QUfO;<Db&2TRkq at x&He&Eey&7)0$uA&y2k4#<#oikboJ(5Ai at a|;>
> z0kzQl*1(O1EMx;UH{}mI!2zsqLVYt4x?o6Y0=#&{jztnM3M$nApP;hsMBhx<pa%>S
> zm=J!t<#EF-RBN+`r^`~2(6SV~&vefF%?5D4EiSE=b2*dFHy3ZuH^3vv>*^IUM=%rk
> zV>|zWL$cmYNA!-+3d0RdteO7Hm^|I1>;%85!^IB~IS0zxF%eIj4x$$asXj}pHc!Go
> z>LpnP)SeNh8Wylgs%a0hWe;Zu)0#Z+lQ|JfaoU9)vcN_*)$h#j<+5Sk7;yOOy+WgD
> zr?96ua{;><oaV*^4{(iEooLC(Za$cXmJmfJ<e(+|Q%gC;ep|rkPf|zHc$E~_%xuc1
> z at zU1fE%)Qz(eRR_yGLVxoQsKf1x<8?&fvcLJ0`~SZqd7P-85$&S-m0govYX^_87im
> zeMn{_u!r|{C6f;o?NvX?3`6kY at O=?X$GMS-b5pkqumc!)F}KynP!rJ8LEfd-h@;6E
> za$v+n4n~uYz|1jlJajBzZ<KzV(}A24d at O7;qxHR9?2XZ%&ubb>ImdCgp<^QM&)4rS
> zfUXJJY;CG1U#nN=fHuCMUQM~nP(f at 1%koSk?FjrxcEl at MY7S(&rrMj}*nk?1d@{!D
> zgO<AP%7K22$(O-TPy_2@%tn}=KlKmj(Z at nEOC!1qU3xBfrSkBw_6^#>h#Ks{KZE}=
> zgv*eXc1C!1^CZ2h<izli=1CGN`o5fPU<?^-v2P0(Hcvv2Q4=I=X|E(Z3^bWt(K`5g
> zz(U9?v4TQ6Em at mb17nHW1Fq+a$jyyjt_SQJd|$aIO|anXyz2a)eI2y8uUKbI9DUwb
> z8MHNYyC+p8u5TI+p0EC|t;03<^4O>A2E at I)`yBlX3^iPQPi95ny0#ylha3tf*j$R4
> zh}as~T^jA-6NVx#G}^&6nZwhnjY2xs%S`a(B2RtW^65H7=r^{_2pZbTI*Og3mBVSO
> zwZpuTiSWgfS*JNju|ws2GJI{`RL>1Pk2uL~z at rtAPOAY&KLQs0t=lJx?s9P+#`)&=
> z%2}b1gT5f!kzhUJLG;=^EK5M{OTj9m3YXkcFJeFW3 at S5n+DlRv$}JvXELH;#O4z)F
> zoVP8C;BFJec)w6vJBjePHjkAFDTlUQ!sRl5G<ciamw~o3eu}p5e{U078V$eN4dM>i
> zvh1vbUk?cbpT$wD#4;13vfO=0gw0x%5R1#iRGg`HH;Tv#EW%e7wehUjgI*V-vvOH|
> zYzW??qSV2c14?1N#3~pKN at _N|!)`YmVfPs7*&T+L*uAa`9|qC>?Z}Lif$cp at SIMc^
> z-T}WU8 at BhtKiH&?_)7izM#sM|<FfAyt%3)~8hvCPiILqzwZ)<aNN*b;z0vk|lH#zv
> zN0G57V($*X<Gt87X&VwSXdxJk<8)Y=4ie0Xn^{)a;kE+KP~)ze>2Q_|IEx>B-Y4jA
> zW(Az-X9&)q!B0{u<<dq&jRkqU=4jDuoKda58B~`55c47+<|RP!WF4ZG0;24&9h7UY
> zgcjm0v<fG-7{Nu31nw}hA9a{(B$;)kZPZ~(L1jdpVys;))$M at S1a$HV{4_rfRl(&o
> zrQC326zKr;mMtXn03!5usTIs?K4h+N;<?IT8J-Z2%)}GocTZr9FMk4D{s*5!W?QKu
> z7XVi13Yrg&I$A>NG4imjCOFW3=0pS|uOtaru`3H*%seX5$^yN2G&4lqRCRub3|cRC
> z&1DkaQ0_a7Sn;cT3$_=)Vly2Yz0!SMJELz;HI%Z6)jQZG at I3<di!)2vY<R?73(NIg
> zIG&92G_R8!`PJ4;c=GXEVBbbmA%BGLcd^2=R3WF@)=7Lv1|sb$Nh%5zKs%=zs#$XD
> zqwgnUo7(!=`xb+prL-mukDx5Zq(#K{Km&hvlQ&&WBD|!3TMd0%+^Un%Gr|{*yiFuz
> z_eEU6+SSZ_pNma+n79M*Qq$OGHsxYvpPgSY#+M^MfK{YQad#etT<h3 at Y~}W(9S&v{
> zf+LP*(s|hG7t=9j|4tnL#A#>WCXRm+G&#u at jVpK;jd?2G!ssoya|_w39ZVF0$w#eD
> zW~KYKU`D<TniEfLi6rCPPjw3&ddIu53Q}?AC&2Mk(e0=D^;@xb8#tN4)(dFChHDbe
> z-05UVJA#08PBw2G>HWA%zwb=qKC+6V#l(G7i4RBmeRmU-E0wMb?}yO(T3Gi6?_RC0
> zbe(7SsMSZ8Q>`!5tIvb>WKkqttNiu`T=@|^_}98?1q-}M;4^(U at _<8MAj{XM*k-4<
> zFz}leIVU9zQFP<`u5G!#-`G at ux_w37#p*~|ZnBlj5<}#jS<V#GyvyB^F-4x$lp>d>
> zWLA&Z8Y`dQVy*G<7_x=#aN8${pDyfwmn30#t&#R$uNJ|f&sP>AeizzQK*WuRH-ueK
> zC0oZs?!1@<R<PK)EvN#Kz8msd^Mp008$ts%f|Pl;zx)ud#K^A*6#^0<WyGOGWU5*B
> zocCY_{XOcLm;UlYp}jQ{6OUQFPW(`(S~a77z+SAHgdUsAiRhJG;mx!Mdb_7 at A;rgN
> zmHnwyW1 at V1BRi5*j{J;jQg7{m#cPe{euibkL$(s=o_f&UiOxKt-<Z`*${j#{F{q}7
> z>O_gN7U%^m98sN$j9E%TObrWNtEP6y&f7kl6Z4+1X)kvnIw7XWMrID0;Jc at L{2=-U
> z7B*NgW$kKY5=|=^Ik%~XaieMx1(v>w8JL3=CDUD4b<jGKt#jVE?LDv^Hj*zBM${7a
> zsn)O${rM at Xhs3@*7NESNe^+OV>sfk<H!pxz*Pr${)^AG2Q|r!9PVC`F@;tKA<NRYR
> zf|`)yz2)SSfE+Bzfsq}>vUI?3EEBkCkN3td=*0|?Kr%AJ>->08OV9)#h2e+)8u$j*
> zH^eE=ZGxAG5q8R^D0+1Z*#}E**@O7Y^x^bud_!pOym3zr$`a44!Pm^odumWcJU=`=
> zE}YxQ?E$ln8LlDBpmQxWY8j}f(NQJL+g#0<=cJ`d*j3t;bP|*-E;*3LD#o1|`Y`Jz
> zZ!!6i#pgQ$%meuHbitz4x8 at Xl1^Va;&N`(uhR8NEY=IvAZk&r>4IpdA%N`Z}Ru}I@
> zwt at cu9O@Nc!~a2*K5!kLSae-A0)kdyYk=1ij(`CQNzQS_Hr%b}C*z7S%DEkPxpmsh
> zxLdcVV2&|cSE^PQ`^j_g;<&O&7*3@;^pKKO?Ru&LqyO7+MpjghUA}7<^gB(j%`tMj
> zdy at peIsS|ym&=W;<sJBNrw)HoKBLjvROy~1o{zFUQ=5t?R$i&)3(93Hlc(<}Dlet$
> z@{C-Ydy;fMw0G}cpu3TIx>DP{uHRy<-WtnUu{GATHu%j7%u}PCKl5>WzfEE98?p9y
> z4vWQ__66}=)N<O>c at yu7$f%raMw~coQD>d-Wvjw!94?(icH6T~J8IM{Gcj{J`1PTj
> zU~0ReeaTREgz at 5pkJ4-H$6ahovmIVPbRRc&%!eP_Bi!7+1n~M?gmujS-km>>J`!Ew
> zDX3lxYi)Pue7$w!j at Q2Opekck`%Z3YUy0{lswv{>Z&;37BCP$|_9r^F29uPoj=c8e
> zxb~=iZfE=3Xm=H~pSL1X;-`w*KDN<Zp0$fLbscoj$Tn0~`0+i9+KnAIwSV9mJ~Ow$
> z-hQOQOXtwL$ME#ki8~ObjoQS&)33o!0h!Yg{cBV>>-kEE$U`H6E%bfGIV53UL~WkB
> zi2PMO7i3_WGs2LmT|8q at oL`X^?}?}qH3OH_orQL#T}j}n4qSP!U2JcJT<d`qza7Va
> zZ?~Q?B*w<4Kl^U<Vd$9e$$L{lCVcHfV9Y>8+NVXKMNXE@$@;$iUF~&!`;K#muvoXi
> zC(TRU{w~?zAvGfM9Cr7wTmBp8-ht)a4l3G>H*C<V$Uigh_%^{SmzeY3M1~|QDCj}D
> z=3tFm;;RXDP^$9YELoLz9JuIRc$(h!=?3R!cCgpkpDCW^jFo!Q`fb~8_VhW<?Ac<t
> znpdI at G+?n>@+{VKa`~X$@?q5sUMK|Kfj$y4mr0N3Js856>#L#`Hf;T?YOZINa%ohO
> zT%BEe02(Uq<J>dv%9jHNzW|<J>9pHX!xI=GnN||7&`7V^3odK$TU29)br`PBHH?|v
> zRx`5e>XoZXylHx^3?4rUkHWeEK8OlrNk^<jSNL<j4t#B0L;_a}nt?ZWp@(Dl-htXg
> zqhNbjhn)E-+OOr)uf}Z;X=Ad-j2V-SWe<-D{QpA#N7Ws|S(J|>E?IgUT0P-e^l2~Z
> zQ;n3KU{51*YmZXokXi+ulEh+fLVF`YhWZuN^dnvi_)d+a=`q4~-i2yX^=gjZ6RJW%
> zJ!y&eB$RGV%gN5k$;p;BqaQx}|3d%Y9`&IQOq;5I#TfnBk%?zdQU-S2e)8Qn{8H~d
> z;!W at +k6-!*J3X(rK1zQ>cKi(<DW1dqvbKMzx4J|BfBfIK?OFP-ZDU+uWySv!`hUx%
> zwq<0hLL^KS`ZZ*6!zii|-<@tLpKMNhQ4_Ve<f=_r51Zz1->_ZtzP~f_RNfBHwrxFR
> zU49Y*fOkOb*7{M~h9d&xo0~BI-%#~LvQh%C(zzR8U4i`@qn$#&e*flMqyOt$oAs}J
> zLjP~kzcn9P(Vh_Oa^asHO@%Epu4yN3GgE|}4ip3NkxURY;`*@lLo*K#YUBeK!8L%}
> zIPHP#RLipHS-b-o2HA4lOVyf3>rW0Oo^1Wzla-#z4m(%9xAERC at K(bO0c%2fxIx((
> zS`zI-#BW^ZbVF##_8#J^`#wSJ?OFCnd?xF<FJ{Xjct}Fo>}@C+`Yr<(K9}s8zyn+H
> z-V5MF3ljV1<7bs3oIk at SDn|B%kQROicn?)YNlqGW!&&irXW_Lx{41O_v-R<Nl_G9F
> zE8uK%v<tegk)cYDU9r>N&=lSs%uehV!OD{#S}|l_it4(39}gIm&n_5)6JW>K%&tFL
> z6k0)*5{IXvYLyZ3dS=Cpm^Gs!l79O3dmvZOh4mB913N6|c2VS6fV1mWD>Rb^Wh%Z&
> z#?#ZHUGdfGO;L`Z8ZP4o<+XsxyGnT-nepBrE<F5>#}4`pTYLDOo{9aY?(PAq`>H~&
> zQ3-yCJ4bEm0)E7^L7OI)@fq-75SlmP-++o#3^d3n{fS$kKN{hI7CXM`FPtnGfgBb~
> zWU28g@*dHi=EYvh3-(G7d2&hfG at MW8^gXwBqQ=O?fEoX=ohz at wT5?1IzfIbpNCqgK
> z2)qTpTgR(rS|eH%`meoMRd#0eAMtKSHkq}DQ&DZLuD4)7^m~w7Ce_bS^)iL{=YEsl
> zfPGY*A-qWZi{=G>T<?l~ZfupC48(cny$R1ObKY_Iw%eWE&p&@!fM<aJw4u?4-s{>|
> z_H<ku4t;>P!|WZ2Z8J%~7bx at BFMKnG48F4M>3v2-o;+M1BS~n_J>W|9IU2sv11?Ix
> z`#BFo{^cc*@^4zx4tqXTbu96YhZWDrshaIXZ1)F>+<a at HoIOc^2HNK(+inwN>DH4u
> zh)zP)V*cFf5nK$PsA=ahSVjCwZHth|!~wtMhigd_fV=iX^E~xvslpVh_cyBkk?<n$
> z!KC{eg>P^6_|!tOvDS0Iq?wPztR#us*@)Bi`qAK?k?dW=q<VhF=sqQU3{moo+P!q-
> z{C@(&Aj0IrUiltACiwUIN96rih&9XLCmLUmOXRZOit at rtc#4o^5iuM;jD7?-QdMWd
> zo=_DZl?zx|;NNKs$9U{CVo!%;Xg#$C4t)qG86czjS-v0NT*O}D&n<12Q^Si8^L8zw
> z#+oTJBJ#_$Dr<v?x#g{=Oms$B7tAEB2`l9O78i}wa1AWPGnMtoO-a``KyIu}^t1+e
> z1kuPB^`z*bJud$|{gj-IT%e1gO+zn+Pk?^4;`bcn-H9xVT^#R4;A$=#Z?+$6#x6-h
> z1~U6ulqz^CGRZECplrFM*+AA8*vO!L7$2D&Do9Xi2Jh*(Rl7v1-Zul at DWtp0>@aIG
> zB1ync!{%W2Ibh!tmBKdg#QGUihn?QuN&Ge4VM)ASgl9=s;+*k&`}z8_Q!ceucv)*w
> zhgk()3jdntLE=6eTG1JE4W36%1jxK8imc7(FvD&!LhsS at ak~&~67?Nbhf{0v1$I2i
> zf1i{kj8LYwZBa#x{`v#>3gU>ca%440^FUKYmW>VYTka;<L=XRcPsT<v!=Dmn`^u$e
> z0)kWDPDe(ic;7NR^9W7`2lc*L`6B9DqF?$tRkLA%New{1gHg;T+dgSw8SgX`g>Vf|
> zxyCnLThpdz>iM^0kwQHnO<5{guwq~Lem5Kc_L+?MGr$0b0g>!K5 at dqN4A<aaS6_M>
> z^epbv at SPvSE3dExpb`44*UfrkWNT>v`HY~UKXZ(- at l*in#!w%=+zlC<A|Ldl9m_Gg
> z7+-D&v at nm<A*kla3Qd;mo)Mjbf$<HBjBL!)kdK0@$|j*7u~!b$dtOCGcvnn=_bbh#
> z4r^JM{T%9X?ua;kAlecBA-p^2{v5*5S}5F!udzp#qt=iCc7*DEcZQ$eSC;UtDu`Qs
> z&?C~)cLN`;tY(6Q)dq`0!^6%$Jr9}MGmX5PJa+ZE=b+n!72!M+IjE!NaNqpqS#T1w
> zj(yQ#+ivut5>EdBT@&lssL=JGDt2%hqhR^A0Jc8h)|Mrq)gDA3un%N$66{tEslBL0
> z<Sv=<S9Sk*tjR|=z!$uVl^I6K at CA~mA3#)yVV3v3A&cxN0A>mv(k>{!PV~PR_!?Sb
> z-<*AOS(ztIdp>wB%Jw<9y3a^{BMEG=lI%_Th)KEyuU0MSDDJY;ygS&3$!dy2`q0){
> zOjK2Iu<86s4$V$<EwqkOZE}~*!D^v<)Q*K0(fCF#!Y$-ucscmE4Ke>ow2FE6F%#hk
> zU<hCnUKM^yor&>UFHe{t?v}iW1SG$-fg;32yR%^t&n)EA{ixr;HzFSW_u8sVBcI`)
> z>3>OEb-?Do%Ku;3CWYVd{{dUXMDbh5<^|r#&^DLodxr(9#}dhbN8AXVS9I_mWD|!R
> z6Mm{;DrRyi_RV2bB6qQ at TK)gWXgNtC+_(qX__KJX;>14c>4FE%As*CY50om4^_uG)
> z<d=nSL$*=fi)}5f-mgc6yTCCmh8GjExZn*|#ew}aWL-hTAb(UbwO49gcuT62Rq!~D
> zePl7OQr1#Ud#vjWL<Jm<F5x}?#oz-TfcM+Ws7x=hx&8<JujqU8h<Aj%DRtTjcP67+
> zQ!o{L(ISlIx1iqR149^Nd=)5B0eJ76WK`2^n?V}!22i3u%tr>-*R&1(a;-VxftSv+
> z{PX-j)9c%35?(|Ng&EP~QK2*M3^aO-v8CYYQz&<Bq~NT8b|M&${Ej?b>VXfHC!beF
> zpk>7s)S-M58Ja`+kOQDEkK55$Hn=GXJ}efjHH&w1<T_~1Rf5NT5A2&8ek}ooRq?e3
> zsS*}GPd*^WwEu(-H|jCcY>%feBHj at BexFiHz-6zO?;a=aF24jh(EJHGd~)1Us)%i6
> z%EHVo>}FUXtjLiEk4D&9*8kIrHJ1d*LL^Ll)<Is3fS0Z~E{o)ZKgGAg$I4d+FS<$Q
> z@$hLZ1eDOMf>y!;MKIA$a|_#Mm2yi>C6n9Ez6Fi7y+msbKSPj|4ao{`0Uq0Dz*}US
> zY2O0(YTLNb3V8MZhxQh{A<Xnvj27yaLbidWJ%QEBzK_)>t_Y^M<&;!-he?6}8Tv}C
> z`eM#f=&$rB7ixo6vwN{64ZeyqFha(mV(?)T at qS=c{rzzXycF>h at L~YQn+5wo3UFl-
> zph&Wsd<#%dd|rIC;qz+I-h#bUYAXw7LQWstTduE<Wf$KUm>4`wP(>Ia3 at oeISA!Dq
> z%1+WfUU>T^f;M2>LLpn*pwuFYrloW1VUzX at INt@}Rjqu!hG#)pv!mP4i*3NzJ^PpV
> zAG>_EBa<-OKL35kGW_=+OZU}7HwL>KdNj+2><bcNyWY;BJ_M)fkg(!W at nqiaNta+@
> zv~Np9fbS!q0G6m3fQ-?ZumHyG;_y7hYW<Zjw8DQMw$Bkw$C#A622Xr(864p2V5hxs
> z;=DeW0%+V+vRCf9Kt5YI=fNyaiLZ!%nNJVau<A2-^0%A&3`%!D;^yLO5ch$P2`|z%
> zgtvC)fr_+X#UUr2HiLKjUfk}0#WtBnkM5^+gZqI~PX~1Cmigipc&;6X?=$eYJ0~*@
> z at p1bvUg<EehUkDy_RweO^XtIs)NLRUK!m<>mIMAO at IEHm_SW?|d|O~C-qyFEAHE at x
> zIYAq7`UB$jD^U^Mf-_~|&PWw#BfJ~fpHvaB|0=TQ8{wJD(LVt-n~nai;TvJ4Ft8%d
> zaAX*M7}~faLo>q}fa!4&)>a0XL+kAe;N6lj at 0uqk(39Lu_lF80g+sQ2pF- at M9k7w2
> z`^+6ijr5)bH0B5vTK$oUc)Aeh#`%YsT^PTA_VC`}jfm4_BPD<N{`*f!dnbdwB4$<?
> zH(a8cupJ+(`m+f!QhMge at A{y(@C>{Nx`4N?gwM!Rpay-EY30)#$Te3W4)0^&Jqgmw
> z(q)<K1AnP2*7vwh{r|2QJ1qv0Z#Zy`PMJpe;g<~+tdZ!w<YQNdr?k$?Wc*#a2iq{N
> zvpTwq)y?+Lz<-9n4F8$_S^f at h9%vfl|M1Uhw%}Z{|7w3{;@m&A7g!<c@~*;vlK0o)
> zzIxB0gO~xzk)5ocO{KGkeus0&l+Dr-&voNC1IJS0xCh4|A9dt4I|ApkhbG}aYk1V5
> z--P#i^Kiu)-rFo<3;R3rL9jY=xDNjo9F4)9qxBwsfTM9Z${n)de=MFpfHQXN=V?EZ
> znN6hZ+-y9~zku at v*w5FW>yM9%24fv~k9yF`QBt;N8nT0Cd#0+%tk5tU84{$%6uj$&
> z;U9oTybwvr7CFV?5~p*PyOgyGCt68ys-CRYYv2{kFv9Q>#=A#h-Be<m1BrWnB#ESI
> ztqXBmwg}ZGod{}UBfbvUai%AY+x9v38Hw8HUjK!cs7)97lkhI+dvyO1T5o+W56MfZ
> z0UJRcqHU&!3Ql|A$>2dW{m+ at s-HD}agm13fI)3GmmH1*B;Z)gf6N#g#e%2#xlf92S
> z88{llz+B3wqy0$x5C7)jbpIC3*EYs~kN>}hGW;FGKd7&N`L~d~Xk at LZANYsiAH3X-
> zV|}K>n`G(H_~<6#{O at r--VVIsGc$O<vJf&OxY&nYAPF#%iQHCneBt;f!O6NzD74Lu
> zoC=DO_c0!ai8mz=8T!Ickl9HE7u at +I<wyO*4gbSp9F5!efKHd^CPpbg{2K9wgC49*
> zHFy>^HfXfKU4uF!nv4tkk82fi-a77g^U1qvI;%zu(+yiuuae~~t%;q5eiOdS+tw-F
> z=tb|oJHcaL<gX{h{gr{wx}xhm`>-An{i?6W4|Tt!TCB{En3pr*4KCEc6Nufz4bZ2w
> z@)TIQq at Y#jPp<HaxbKg_uM<b(ar6h=osR8G@<&{9_di75d at 7zXHWb099+dxF*u#km
> zv_RTqCcd{}0cZoZcuoi;QCkg8v?Ow|VWDbhr~<7^3csUkl)7n89?zu4son67*@jHF
> z-4px8ZJ+Io1k-EoVKF)DH1jS&wwvLN$Ttm50Pf#r*?IVeBRnRTlrreRCVQLFhtGkN
> zC-Y^H#EMCZ)9Ns0%a_)u8AsFU*uxWjeKP(Q*YM4sNM<${{rxrcph-tzhs7Hz*;Swv
> zh?O2h)mUMwIt6rP at 1<Em#qm#U9<Jt*gl1R;FSjhV!Q<0h?|sQ6_(kOipB>d$wJ?CW
> z`ZUqre_m?uw~+ScBH{t`BEO&{ZIj#}?_JO%42)X=55Y#OhAe%NQmiy{WF=Nw_r5L9
> z%}nrf%e>zZ>|kztp?B+zlmtI_`dBQI(N>mdWeWI-bd32^@N(THJ;!%SPx9TwuK-d$
> zg!G_mk)et2R;xiRviOtsA`V^KxgGH%2Kq5{D at h@1lDkqJYz?Fk8V|@QW&BCzq#WUc
> zY2TMp?BqQGxIe!Ic;na5?PsxP`IF$wpaVTOwA3f3&~vX at iB2n(^d8L3XGC2Avx4^L
> zwiyWtw_2%P?O+1QO^{}wSB%z at d=Z&N at Eb_EY#df7wQ>0>+8u{!^{NKB!GmnADO!WS
> zTn416lL-#&g&g*#bI{=O$^MtI*X*C`W)F?<&w;jpW;{)W=cV4$XL&7hwk3MGe-8S%
> zn_$@M>=Lyyg5qCP!awR{@PE*=?&uV7gx%pR#e&tJRyB#S at LW#T9Au=VGp(JV?`Jt|
> z;^8d95u}0ORS^L^i8=Z_S!*sz^_OW@(mTv*TKI>@C{s&C5V_{vQi at 5LMB0+?^gB_G
> z75H<a<*1f8jbf;!|MJ~Q-Y@;;j^Y|gVau}E?Vz`}gNMwA4~w<aY$)XLW<X3+#&Z>h
> zm53W)nROTaThKeoMsOvz<egDUTr;}`x*ZqhD?fZIAO-Y*-J+~(J4;?_)mxaGa at fO5
> zEeZJb?!(0$X5L4>Yq>@~rXw$V3o2tcv08|Vq-amK&IV->Tj${4)H+x9nKCO&t4cwQ
> zra!Vv;o5D1G~XSF?YSfRjMmEQ!1GTFKLbg~iI|;dl>D|kqxunG{uu=^htPA(L4NAW
> z3#IV<Kx{d<<y+MW=ryPq<U-*nv~J+0MlhK?Fkll#^$EzA^&0Xf1~MVR%<xUG&V$~t
> zuWdR;XrY5GwdNX`gQQDn`?__!2~N|K-_d<6uLd40YA$qKknukMtF{3n at qpGGcHnC;
> zuZ*ZB<U7#R6m5p at jv70+AD#_wC_BF9_|AVEH3E{4hn6Z+;j;)d#8&vLuqU)u!hcL?
> zH9)d8!&lOV9#-*N_#@hFLut|DSo^oCAM5?b*(w<$<*@W&oKRH>QmVBR8VKJV at m7>8
> zFh0it4RL-HD;3WcXm25_N*XAG71`mk_!M1wMm0QGldbKQ8yUEu&lH;9TD*PzYDda=
> zyxpQqX}eQ at uS9bZEl{q#fOtcA15|}pAa6LNgU^xW#%@DSI#f%n&SH^ptFjnlEGwdn
> z?~C&ac=9{w{#U)>C0$t(bY+nlLp7JQT{0-2&VBby7`PI3;?MLg7`S5Z_C9C7722T;
> z-S-S!eh_ualFX4QLs!E(lIzY%G2?1xXkic$MXA}8a|1p at c6J*Ww7apr72CU%N<^Am
> z2>g+7)Mr^rH{o3&2^FD at utQwV|HJm>t5ZI6PfE%LJzk9Yis0)orqC at v0KG3TR!6ZS
> zU=HkUGdf|9fHayIdE{%+M;Z`lqA?+?q at s!np8}ruH^ZyKvl)C at m0HXi`L6=YAP<&{
> zppsyjurldLkxzefOeF28zV@<^2@$IZtN&?OWPyVdtLAxHHGt-Px`v1{F=7sX3W*%!
> z0GOPd(1G07VjwLDX|^CUWGX3;EfMnwZp%#4U8aZ`BObx16al~9s?G#POXzNr>hR4h
> z3E5lpRh7j$bO?$^k*(EQnyuj$%>N$!Y%*zO*a67!SQC^B7kuL)9kKwo*3CL(6(=A|
> z1Z34CQo0z~4w0Wf at jd??hjHs>jPY&Iau5b3{Wr3uK}%qUWzc~65EFd?%%LUp1+BL0
> zt)dc-zFMyPUaLlBQrnhjoi2r^MFnL-yv at t+LG43|?#ovu0hiyZ<{--%dIdXp<>hyw
> zM=6S}ZH^C|HLabt+0-xK3RUl$pj?6RyX<=!4`2Kq?Kbjq#FtS0zRBnfd?b|XuzJMs
> zY{hZu`%ln(>fTm596)CJh}Q;^6^q^*%sa2g`ZM94eZVJVCxsRzPlP;M28vRN_aO(S
> zQtO^%G$%&%gbptY=)I(U-B%WVo_8lG&Q%F69Tk`jcK*|Yp60~|>#(=wU_JH}?EU0m
> z1NI&^Nc_%&i{OvF4r64{pc}>*O*O0}pFei{De|%<FT;CIkw<Y}K-V>gpN)uGC9*vU
> zL&zyWFn(zy&jJ!sm1zk`kO2vGzUdfG8F_UW{AZ1)JrNUCVW28Cu at 0pc5ibi8YotCZ
> z#O=FXd00;o at 5ZjN;k(hB(Uc`q|JL}7<pP(TqIMz$@pkH1+Z`Rn8zDw^7Gt(iQwR}z
> zg-UIFzV!9yA!`%3+${E|F4XYUW%11{8+yMIP})cRv-_;D6F2z(yKgbJ9^Ch>_pLY0
> z@^mJ8Pb at 2A4|s1pW*Qy^8=sNgg%uPC--_q%@Rv8#*6d&ca7;4nQ3CPBJMNTC+$eW&
> zv;RKtGV&orhB)NtNA4NA`V;UiM)^r*M)fZn)@gY|eo%xr^vni(#H>}4U$lRAkaTQ=
> zJFe574zDL&0PYk0a}sBlXeWT<%{V_k0Re>Ju?}s;I>so5p2Dc4!;+3CNjmvVf-Ygk
> zP*QNTZ+Z<A^vD-r%fUCYX>J7Ii~3mW13FLtJUB>mqz96ZmY|b8gt<KV at QawnYe5-F
> zmr;iCGc?^50qpw6suq8aR}6^$(c05Nqn at i(?{ne`^o9O0+6i3Q3hwjY_B&vV*s*p<
> zO6rMFOaOxg3G@^BMDNGe0Eulrug4tT=8*$e_{(Wj{Ih8cbjymV8rfmM5j+9wZ+RdE
> zny)0%{G^k$X7F_%a$?wmQUw2T%~i{MZ10B*<3!X7s%>CzG4eHcsm0L=gr|vj*8MS_
> z<7TJC8R3mcidG5!N!Ffjwrcv?i>yqn#P at X$#}c`c;L#zyY6ILqM|Ngf#cHWjveO&J
> zBbP{OTv}<bgly-Eq$2w(u$sPlHmr7tW8xS9ZQCMA#KUZ4cFYdVM0|y7{)CL+{BC`N
> zQ{AWLQA_ctN2QiAyt^b^rc;!9qAC9ehFEy{8_-h$QDdHP8B`jG&(Nk)ga*k~?Ui`j
> z5)DdszL7r+-&^<#k-sx+ni8$nuJp(XvS>Q&?<OCHMDebz(;k`e&G<_+KcNpEGfJDf
> zKR|E9moNEF>*kPZlDkqItR^9Yd?N%+(43V;mcWxbZarS4RfE2fyx at aRm>;=PRAf~i
> zQG)y at jb<;?qmGj(1BAiadJUpKMbht&)2oFBkzoazh$~tj3>A3n>Uom+4<6!{nrx1E
> zn}d$v7ymyNv(P^<i}d8v#Lr-hH5GdmI^ZSy1GF~Wn at 7&=JKvw?zE6*R`)b*p>_g-|
> z9^<|*o22JGLl3(*=ehKnaPZj}N9TSv^q~7bJMFD<-&aW6$A`A~45al0{t5mcT2I3z
> zt)~o*4|WEhp<3E{rmqm0ix{#u*TB~R5d?U;^Wx~n@!c^KW^fen*7I0@*^ng$U&|S~
> z#%FM|amJz97w;V!?TUqdjPFF0(!q&zA2-Wc3iJ=Z{T;q`;ZTv!=w{=ML-xcIW#l(N
> zmMe-}3SFn?-nyTjJ7$Q0bHsB`(EmZa#})hVjUka*97A8a at nV}KVb&x=Q~00p`H!~>
> z>-sCfmAKoQdi}*agV!ef1QyY%&R<C9iA!snq1)L~<94?A_r;}Hg}Y*39Ox)^ux{NB
> z*9|*d81J-OphG at Jnw-xb!2OVoox0c0=LTR$gC2u%xgHt4*R?*a at zL!^{0#Ks`nQNL
> z5#O(7b=bEf-VTx(_>Wc-;LjGhGF%4f&KaKFUWu>yBI?2Vf-Do)lnJ^X>BA0>UAGm)
> zHD%^VDQU`ri-GAEGF?yRyHj%kj;|(L){w=22pTW`@&W(P{jXlsZuwt<ZtDgAR{tM$
> z3s*lNeHtXdY%YchAkn3ehU&MK$cSy`HZL;Y9ypHP)P9FabbVe?91ooL1e0`a#GFWV
> zs4x-<_A0%>0bOsk5Im5e9ay%Gy`)z%Xb1hfpwqv-$nOvQ<%->HiT64DGxE;wFc_w@
> ze*o&h)3QoKGGgFH)z`gT0<RuK2jVD0tB|KZ{xSA4wa>f=vTC=&d&mYnpV|z~U9}BI
> zNjOTwd;a<ImCd=@UOlcbeqVBPuI_D=0{O}celZh1W-7Lb02aE!^#+0UX#2sv9>V+6
> zaDLRG$&lbunkDRy!8t3-Fxb3#G7}Y?8H+P!Y;&<CefKy#{{ik#KQtBpQnRErAG!kP
> z3t>vP>F=0;JNnVPB3#cR3LL4qgux-f=@O{1(-ujMV{jQ59HRpt9n3sgtEOJW=bHbL
> zK5ue-7D&$re*JZlIB3k at K)wrgHf;I}Xq4}&fwT>MIb_GO at D!yMy6vgj(<H5-mlcPu
> zKz~H^5UVfTLXPF(Lj3<lkD at axt^|+Jq4&@jNoy-3NVu#IQ at +=SXQGZoAC?1iUPn4G
> z$jy@#r{0rvv5=35WcXHKWORvKTU=lF$~4TINfvxI?L_nDL!~&fyfQuBt8fdQ$C>1?
> zrFpYHg7bMQu313W%@H|HNw-xICDrL)X4?#C_+S;IylWRs|I*iq-|OpP`0FB17wE!z
> zemPyRtCZ0#UnM(8Noxv|_?S?Ep3mSj(2{EvJ8T$7cuxaBA?}L+{5J-^2(UrG7Xg}j
> z^;~Ny#qGAvL{DLtWn)e^q9TY%k+Xlt4cZK3XtW1=fgih~Z^HIksU7gx!8aTpN+V3b
> zyW^`uHE1qF5of5qW>Ve)2HbS?OVp=$95$<Tw%(I^B2CX93}2W>ib-?NAJ(RXs)99r
> zuq`nLAFIBOqc!UVc4CQdj+>>ppgm_P at KTpVo-eiXG2G(JhHeUcdn6OGBw!8ePK0*<
> z1b>(#hEj3HN4K#?`W^Dak at S`BZp$)$i!?Lzyeqb~RM*-=+Q2*QzS$18*w!{1o(*V$
> zWT3dsIsDqbi~8-Um&TvuBVD(x^GjXM4814Qbbp9$^*lxH5S9gZ85=lJfaq2w?gMD2
> zDgc1zC(&0U_i86F6C_JGFUk_hQUVe(XdOA2Y>RV3muU#EyQC at YQg4V$*q1oBu0+eb
> z?MD6-yjLFiu5C!{PXTU)#sajw%ey#IgChg at CL=VdS-5s3?CyEU-&9Gk3C<G|Jmxh=
> zS=;s%-E*l at 7FFro8<)hDXNL1&(b^k6!K)yX!z<ykelC}1LTV<RE^-&@d?9%1#CT=W
> zcwxUgI8WDd+Er-d?RW8Cd1TPTr-@?;Prl4|vL`YNePh&Px{i6?qtxPz5dQPU-jW_i
> zAG<6XHz&pocah%vgx$&ay!Pe=BVWX3@~3y&@$NB~_4E4g#xpAT1E)P}&TzRuxnfyO
> zwA_(qc+FgKW6i7OE1K9}b;}~+0}5eVG@{OQk!~CGkWE}PBL|e|&dD+Zb`b%R at TiB+
> zyl`bj3Eq^S2F^tQz0*C8dUyd}M7m#f1Z<=c@)t;GRzyeu(5pb#4NXZXU)PJ-A>qY6
> z1O(VJQ;)~}8({H<on`S*db}5?GK*_iZF(=25?mD(*a~9D<JbKQ{B_}O|3W`<wIC<R
> zqWy>gGl~0|Uyu!gxP2`0VD$87ZT}g*zNbIEI{%?VWRa>|+-n%HR!hT&C<cB2TEEcV
> zh!ooEf7Bn4^B)ySBjtb0e>|~&xBnOZw-Woe`nUU+>ooc<Z~|-3z<W4Sq<{0(r-h;U
> zz;`9&^=PO^^y^EAetj14r%$kZhh)OFAAQCr0t#VI|I>1e1$=MdCDI)j3(5R;#KERv
> zdk^AZld!#G=?$_O+k2PRAZrAk?cJ{Xj+i4Q5#$|GNblK0?fZb+p-Y>kN1H+G6_`M|
> z)c>`8jMx(wjC#wN|6i^BAZXTkh?2;{P~j!sZ46+-w)c47I$u5P;|^f8Wc{u(x(i=a
> zKwpFiZ7Bs$N3Nu^;H;2MtMjI>JYJ8pbbhRR-GF(xrX!F1yn>ctgI5 at K>PI!5c~m1h
> zv>H;$I#jO7W<EYbUs=5*55 at Iu>No91_^`ag)}J<t^++azoM<7Zyzn=o{NhYu=oWbv
> z&ypQi!3PYKNcRYWY~L(T;8{)yZ5Q-goar)agvT&Ec|CwoN43Z~bW^Q-)t(0;baW%M
> zQ%TUmW-AWTS at DtjJ*#zJC-_qEJAf%hV|ypAjZv!b#NGORcI>(78LZ`-uu5-~eJ0Vt
> zb|pKcmgJh}@?yt~u>TmL at to=yAr>{*L5;+!9fsA7lUrQQ9moN*<GHJc%>2i|I5On^
> z^n}dxgZh}Ww3YEDd{Z(c+=<AymO-+osG=uUR3xt%N|CPuW^TNA$60}DX2(!5Hlahp
> zJNS>!!BPX7(Mta7MW$%N?=j)+(;FR8vhjv!iTReNR4EbP^X^=>hPAsY(l&^Q!(nsT
> zhtM<(?3$PAeG?HXS5~BLJPo<!0aX3k?JO0TYf!t^y~$`&#0v8U#Gu_Wvs!xaB(A<%
> zU3%YL{9(oCVz*@=!ZY{x9;)<k%gji1xD at t-Vo>CXh}W{6d2;YEZ9()&J#X^{VB?z+
> z`&<MniVUXFCn*+>Ai*{G$R9CwlsUvs at D`87BTtEAVs$M$0Np_?Yrhns#x7miqhD$L
> zmk2ifomzbWwi0iJ3atj-J66y2^@0k{L4cp--w&#1$&*CCHi}w=+$>YS;(b(L-9vOX
> z67|_9Xl;OaTt{Yj$$sO~T9tg-<%*HFJXKxI at +!t}+_qh?&Oj-q(pWc}!Si!Uxo~Re
> ze~;zBbMbS`PGj#HJi`L1s4{23`^C_IIPH_BI7>5g6c4-|Q}tZ1 at v$<*M at vC0Tf8TG
> z9eo9mBsWKwBD)gvAW!#Gugv>dnFv0 at vwAvzciz@r1#^WDp<AvPe^cAsbbXHBDKX#V
> z=l=|3^E^Z<3=W7KJ-?|R8G#1->s7HMuNj_k=pX$3X$}cOcyYX+{f#B7Zu0+mEUq4?
> zmVUmv+8%XQmwwyIA9X>!@7`sYf-9(B&+6h&Zd`J4Kl)Yz?#}6Ow>W+zWE0%|eg~b4
> zRMWF_jce>72lkdw>xgQ53z*nO(3^nFVnCr-v2lZu at Mg?|?D?qkbCX{MF48J1N;bka
> z++Jy&&V(kRyi~NZN|v`PAR+q?WXeGW6$yA9<npfQqnE=W<~R<AkBSmcI=J9hPR!+$
> zYQ~DJb}r-;a8N3qCl&C#Q$wM>@p~#NerRtJ75lEoSboatrhKZ0>&~%9&|m0yc<&ic
> zMCOHf$Aj>rgLe=t6>_e`rYVbo2Oa*|{`=y7mCy=F1pA=Ex#WK&<c1akGRNxsW0Av#
> z<BbHz<f(YAidBK{?uV}T0R_<laTtBL5!{TZ+ZJ-;S6UFdx^+)tmAwJ2kRDecj3wwb
> z!1I!;ElaD>qBav)=K-`j7ROR-4>J7I9f;TGs)4adEsr5SG}rrhw>*%7yc)XpvEg&9
> zP*_dSj}NHYb38gq9T`oEui%CduBUfY)#TgRagyU<Z*?+MVu8IC&vZq%;fw6BA_&m%
> zHc`wbUqluR at D&fbhO?aUI8Hr|W^fxK)5)UY8r*iDE{D?!9<5^r<a;BZN7Qe*Rq0aA
> z9qOv}j62rnCX>e_xLr>aK4(;sduVoGbV>2qO}ut>J`*aiSCMvhaYf15)#X_!tUM#d
> zTAtO!%B2)NQ=CM(qF;>1mhwe<l*4dl1d$jj^%NLw6foLYXw{8_zdYZdEuicI8!>sf
> zx(ThmNOpaE<x2t7Y&g3KeuD<O^2QYMTr-fRcETI*L>tOPH486d7yWt1k(Dn?Hsvrq
> zUZq=2?y%QLb*u{<W$d;N%SL+2f+)$)6D{fQ10KTo!749s74w*J#uHk2M(9eRF^tH7
> zICJ=F-CHphdpS6ov>|}0Y}E`7r5IAyNIlPBL at 7qxip~ot3t%IM78cjWk%j{r1?Ug;
> z%n7i=>*F>4>}q7(ip5sxXVX*>vD2~GHegP>n(6cCvyHyHr7<>S at wOpeV%(FH37=x_
> z=OE7*WeNUC2j|^ynTPZ|fbiT7GoO$KKa#<JXdVXHW(0H>sagfe1oLiv;n*7%Xx~i~
> zp9P6qMfN`A^#0ugvZL0jJ&zhbzWPW1$EdyQSn*b}TsB$sz8AYPL04CkUwAd5D9Qe>
> z7+e=V{ylN%Lm$AdMs_S{&(=23nUAKxB5Tz;Up6|Vx01V%E8=$#xUI&NrO(PqXxplt
> zc3UeT**<YgFjHZt>oR{y&u)EQHAaj<gLe9&oT<&g-4b-26I7A%-`Y`^3E9W9M0h`-
> zDxfWx623NZr8s<Tz!E=y7v)zokPZr5svGZpNKHnz{eQ`>-*61s<gs3~X>XKw6k}{>
> zLC at T(SY5-fKj)NUG30mM0<VJ1rKm6weh_R<QS-juXZtgj=Bw~`N8WPE_hNEVJ_n;S
> zp2q<hB!V_%Ta%VfN9}_`JfFxMfjKMCJ>~OgjRDGhh%R5;wTSF8p0$cmYxOw!N0i|c
> zl9mNCiwvJH_9Me*&vzL<U+jjr0KAH&Y(2y06(PslrmD at bZEtz>zU;ezOIHeMh!^+`
> zc&QYpy<1Rf4GY)?Wc$4EaSw5$@M21KGDK`oxy)uNQQLYJ&>pfA!cS>Jm)*Bu at Afrk
> zQhwGy&iC5hz4~5`!OqgF&ukrBbH3@`{*2zjfpp+8<O($o^d|wAIa{9Stwf|8qyq9_
> zh>-T5Q6(zG*lkrsRISSnNZL+h0Wv2l*fGJT{gtu;;dmtRb;K<YAK<nE=YbbMy&347
> z4wfFgL#8U+IS21NSf*W%Ec@!gnKJW?IEV;-v?8O=#mC0`oi%peeLUCCkDL6S<3 at ko
> zVKdh74rYREY4X<}k94I4hpa{hZ<4=tHg+%F5c{^Tx1VC*5D^M&tJ2!{9p1ZV&6)WZ
> z`pv$E-gN^;*yat#rd}G4iI>Ks;CtgS7UMA**gb8{8PC`K*~oXeMjsE#u0N%(2;QX<
> zn~bduv}P*2P4#i2F(L^nYTtL5pisnk_FDQ0^ZR@=`ow|gKFGr1<Gq%F^S)U)KIgj=
> zQF~{ghna+TAa()o6#L2Naw=K+392Ge)Q9ny-37~V&=4v09dXJs>#ZNi^C`V`1G)I7
> zF}-UCaxhmT(Wgnskdd9}o22)(pdWf7ysxO=ioRZ<ey^w8j at 36?S&SU5h5<vQ+V_?(
> zxz{)V8J?Hcz#C3Y#olyW73pbS)+hCgz3UW)tcnI^=aVs- at Y&>3p!u<4I~B(wwpScC
> zL?l>ZQ!s<laU1 at PZoAP0n<I at 7L6Yp3mCBlGZjrCgPH8TbS2Tz_e}ojz!e8J=B+BoN
> z at C)h)CliHJDLOr$<}D7SCiY5H<eI`Y`IM+livYKSJ{*t7)<a*GBpZu#3K57~OumZ|
> zmOXaBu7UURBk(ja1VwKOaI<i*G-&az at -9|HSrW${T+N=vIKfZVHR$;oeqbW%+m^zk
> z#*lbsp8m}Apk?RZb`B{{`HtMNzdN)4OyY@;mu}Xdm=21=;7d1xtA8=VwlqTbtr&qf
> zzYs8y)lz1tHDT6T9qcanIuT|?W`D`%UM<zX1#d=VJ<==kfuC(W0G><dOTcl|dMbH$
> zeVwP?Q{=fhv=o-u<m&Z&S at lQ!+Uk0~wE7)>BAA1^x=A>@24^?o>;{~52UBt8$2fBr
> z&fJMJo7`<lWWBgo77wr;!hurlDmB-|Ty1?KuN|mq-7MQhn|FsSH?G>5(d+5IcK5cP
> zb^VK<PT86N+tLK}pr|N0SOE#_g11D?xj0j5mb*<rZXXV>*cN2!;qw9(?J9nSjQnm~
> z2u{d+0%i9K!zR`C(T~Wt9C}g2JKl9FI2zhXmMyxiNn#Uvgs-!@cTGxnAIeFMj0)QD
> zR-1cQwZ(mC2Cy_+cA)h8_qUcJueFih?mlFLk5Y<A`*K<-zAw|vfxUp?#$;kyqNlJ6
> zN~0KSEk&deD3N4g>{I7}5u-9uzgpH>+Tv<K#z8|dXRhHR9*-S#7f`{^f=ZY_E$+89
> z6q8L_Ki3T}`XR`n6ZsNkWG>~uaSaFFhR0oZv=*Gpo4lu_Gw(R^1fx5$anD$fUAOtU
> zP%BJ_RaNe=gI-;u>wxA!R!b|n3OOALy^H%w`;)<kt_LpKxcg1-2g{I|5dJ|M735}M
> z(9 at S!gClb`u at B9Zz1I{`eBc1~?K8M#ag^_fyHw2fRo0y5hJp0$b;yLAvVC3Ox&a#^
> z at GXbUuTvCOCWk-0u0w_$(G`2=!Dx5D42%O05K9`>>k@#^?WqAXMtnhh^%6~JWou5S
> zGuVg-udh&3$n!uY40ZvWl7+B7t#jCNIs6xp6NoCdXsg1wm#eDOE|48R_Rj!v)ISNW
> zcql($fo)5A7k*;M=0jP0D*f;S^TThe9g_Nm0Z`F#@J15l+9q4gW=QbUaAd-GPB~_4
> zRLOgMPs;w&u<&IfGaI5%8&yB*QSV6^UUYCXX(=m8 at +3nB8z0^T`QqEQ1=!DH`D~7^
> z#TrRp6s<&jG&oJy;QO<xHw)mSmTutC;SCRWFnC;|u4T;J!BjJcw+E_QzN%Vj)T*~2
> zL&j(L-Y#&NU5J6wvwRRnQq<m~{We+LrO$9^N<ai}s$(Ofqm)I<9?zn6^J- at 6!)Sa&
> z<Fp_0HTLDeh$?26XdX^LABlO`Bv`iR)42+qgH(v8taZ2(T1}k?twoywC(CWpvxxjH
> zlC5n~ROA&2I(^2eo{iw0Gw1z$``;W}CT-a>&vju`7##47rmjq*X9My|e}Xt;7W at L)
> zMS_Z5E`mSrUD56;X01fuempOIZzQq58T;QP_E*nK-}bk}{yo?aVhjb62j)IH^qHD8
> zq;=-G2CJ_n58{qIWl6|^kv*>_<Nus~rQ*9QB+1NeQsl6P9{2Edz=UfNNqZORJaDBE
> zuy-G}YxK9T9r_>DI`j%OW%DUN61^ER$HuwaaF<+R&b?YGt{9nHj=kBDbo|dzmg2r0
> z;2v*4H4)VCn!6)Hy?h+cJcbe64rr6vW<!t1jukMx?pk$LiGMEYkGcly_A6a7qAlbR
> z%y4W9udJw;yDpsb4ScC^AFM&R!;1`1+vuKQv^95IMakSX+=8~|x!9C1)sgz0)Ac(&
> zbXN)b>1EhM?YFtxC>s+bAL>mLC<geQq2*W~d368sU-xAX<Q}y`V~H=+UhrNm8JX?!
> zC#s~aF??C0_Bf)y>AN1&Ifis_4d6IbNEVQ=2H(F1Ij-;qowtIXUMobeX92P%BeJKW
> zqqzE6V<GZ}nYv~wJ at OWwg70~(<_Y+xXDf!TDLC3gd&edW8PpuSEsJIitv0(Z?3$>i
> zBUUpbv;bed1K)cudbdXwIdorh_drTQods4;xd-MxCU4Hothi_HW5{ZeI2-LUNWvy}
> zPI?CL+b+Z}L9<1D^Xvw#H-<Hmhh_kegf+m`T2Ce7qOavDd~7R4&N5)V^<dTB*qH|^
> zVF at jmmwrpi29dq4^Zg4-yf+~01?Ki-9LB1T2q~e}hI^2~p|-ED-`v!rOqDn983eBE
> zK_6El3ttlK|Fw|)*7gcAdvz>E!j3vgSE;tp0`0{>ik#hOrOfa_i`E!GTrb-QN_DPr
> zpzqUui=mihD#aan!!?M^AIUPY_h2x!<esxX1sv3BwVvA0g7CbiK8KWB)R9-UITq7u
> ztGE0zD(}dp`r^r<#qyKTqUNJE!9X+3K?UdtWWCS+!KdtLg4a0mcinUjkr>c|6;4FN
> zZ_ksnDVmp7!z#UUp9t+*_ at s+foJU?A*zM778CFwS1imkl-IxKpJ<Fd(+4<RoD#-HH
> z5}!YuMme)Ewza(bzvO)$*3QyGONq+y6hwXz*V>K!RPcV^e!8yzo2uNuq*O~yIm7pK
> zeN~gidXAwg2&$FY)$9(RyIRV0SKB2g<LqRL)_pR`z&vZ+Rtw1h-Hg=@1Q3T(F+L9v
> z^x62pJ51ycs9$MU1x(o6qDoX>J1?SYE_U6bz(^Nc_!%;#oCDptGSD6T68GE{_^@Q;
> z9BAa`{1q9F{suVjR*+>~v4O%CMw}OYev$LAK0Ha=&x~vZv=3I6#s1Sb9r@^LPuD5J
> zQAFLkh9CT0^jU6i_qc{1x+?lCWvd&S0PB^6F{?)A4EMZgkJwHNN&$QhRN|KDe8{cq
> zNvz at P!YWzH$q!U3%)AmawmjMhO-47399C^C=7uGLB^v|N5jP-<A~%-XMN}bh=L~)8
> z-jtkyJpX!)H+8J`GAc}b3BR>i4E`~a(Ks;({rq=*fJZ0dT+s)seim|X&=Pq&Xi_N0
> zZh at krM=H3405UrLP4Qtyd6k2)cfhg7AaMz%j>=*GaZ9|KQT^25xj2pU*b(c|0~zt>
> zy51^P&D-}?gM2iXG(-g}87nX{!zoiM)!$<WW{`%c!@_Fndi}DuX=#BfuDYHHT6FmK
> zgYv#;@DotHe6H(`LQ9X at 4Mxm4v*aVoNw+%I$zplKR|Q6Cy_7Ei=j?&3 at ExjA`&`Yy
> z+GGpOYC7yS%=u?E74x}|{JsEl`v5WfB3anluuX;MsC=Q+Q{al-iyD~*<bFF4ZW2)G
> zGE8G;=tZ7HaPeW}kUF&&_ at 86Dn<~*2+!2?FK}miBp8Bq^leB)uOm3OWWHDYH4>dlr
> z4FB-cd;S at ofv3w*D{pOQacDvI6UZfvs7zcLAP-|#ER%404Z#QLl3-J~R)zk|HTb{;
> z{r?I;Og at gzM?Gpf>7{^AlSPT;HP1Und4BT=vpvwS<6vNUs=!7y0%@%gR)c-!Xr!F(
> zc_^ymt$!+cZL=cfwDONn-WLh)N6p+Ppc$%!&rC+<X8xx`8QGheHMAVj0s1&7!Vq#?
> zfcG+DFT*u>mq*RiM<pwm#x2qoj1(*QseT95b7ln(ho@?Pqqc_6E6B2{Ye;{Lj2kmi
> ztqs<Cj1 at 905`Mu5ZbZhFzsAQC_4rT=7_pT5UBkXl(7(Y44yrP$B+gN<LH!}B6I(kp
> z5qPS=d#a?$K0YLa(&*J=u^sPaji~hiX$buu%7C3NeJE`x9d{S91%_T&W{|0fFXFd2
> z<+W|WOxN(SH@#h&T|wj<?kS4jqr~r8=ajEF%b#(v*(s<%ScL6_pcK9zz1mIRqi5rw
> z at 42MYH6l{QJ2D_qpC76PenBQkLj-&~<P8Jq`w;n)k$sVZl24#MXKAG8MdZs;#@H70
> z9d&XcJJi-l4_l96tTCf>ybf78BcLFAk%4g#RHV@>YRJlkx8dn{uEuI+Obaa}N}v=b
> zGTGdM8gXqGz1 at vznx-OGBYCpk-{2ao2k%U_O?sN(1r)CV<7Nuo2%kYy5OGPN1)=M)
> zFUmVaP^s`dPc1NJsfu}X#VY@(im-La!E37T=F&Xl{kMYx+k;nCe;qr&<~*O=KaR%X
> z{*$UG-`!{pg3kZ1SxQ>-HJ`-8koAX at 1+jO7Ir802*5HW$<IX?p?|MEEz!PNyuPYxp
> z?%q?hu?QXsi&|Rb$0guXJ{cC2d-xT&b2y+ at 1G+*B<q at J4(y}#F(>9B6C+i9=@ZIf-
> zNz+2epCw>U5Q)vMi6toCOrm`IW)bB}jOi%y+cc)T22W{tZ%kTD|G6n at GDXQ-4S<<z
> z=ozQXp2t%hD&~la)#!?i{fJgyT-(G|_;CVze>eK~y at 48=gvsW2nBB}i5B^6l(ih%W
> zssAt1)*)U9`^QX}%f8ra!Q}8fc<+5wBdKcaHTYwbHFP1q5%YZs3+Z!>j0m){Ao-(z
> z3>-Z4-1<8|(^viP6$@b?@Mj_*M~%Y6e}5z3tFW#Y^$rGBK`Sp6)_r*lH5E}KYCtIn
> z|JX0TVe0LI_1+#dZ7crxO60~W0fj0ItA5HpJ^{I<ihM$QWuvOyJm}Gu<GpQqrqfK&
> zfe3l|D+QoK5gh#%{2*u!j#hz__#DuOtN^Ia@&0M$%p+KJWSh9A^CtLeZUe>ZI&6lA
> zS&#N2Vp^b6aj~kk9y|Uw!s8F4CRj=9e$@Pi1$bRWj!hM|dYxuPt-Om#bzf>vpnnB!
> zHmMN)36uNrOx7qjo0t=Abh9#?pNS0H(@R6kv67mDlW1nso+q!RinP3(V7iiry3XUm
> zXTo;@M~A~_D4yRC4#8H#-0(Y;VCDLg)||jy{Z97E$?tTeMsTd4-$c1toC?Et;YGxa
> z03U=;xnjZl<M4;?orzeu!x1C>(@GwCNMF(LeI$q(@&el;M+D0<PC$fs7Tcmd8%QNe
> z3i$bnn~g%u3gE~(%1m at Lk`e9F=_%sfxcS(}2^j0q^R<RVM5$7~)xhV(6 at eT2R<(hL
> zr0v@}2l`fU at F>pP?a&my0SvPX`Z?sXpETE3=FP)+{}0}`5k4`8Ld)ec=-bMLQfRBc
> zIa-8!f8`yyQ$3m!e&MYoC(DyDDtADy^hc_|5EhU%J&&|dhkhMe9%g_;cD;<Rgggs-
> z%xf2nE_VCG;E)cVKL!_pnpBYJyFjUle_!jCER at I59!`ca^UKJn at L?Ju(ioE_99}#h
> z>by~{EB5UR3^i&!c31>5qCJ;J$vO&J8sR52G8nzD at WmGb&@QjCs-MS4Xp|<J5 at Yjm
> zmF4PEaV6`(EH6G8a$WeRNfkrOK|PNvQ!7$0<T^~^7C&<{<4Nrg$AQ-cOYk`SW<+57
> zqj=jUXqMntBK*k73SK$+KTcLQHkjnL&c1jq^W;moVm#SiWvJdk?KF)$`Fxdd&WH9q
> zr_!`jeq_g3Y1{Ago8%Q9(a8=Co-{5ih&`o4z%uXRWm&N&j>A$Bx-n=Z><n(pX!t_=
> z6YvQ75}%=fDL4*izYRud=9Q^|aXM{rLw}M53bG5(fmqy0DRPlw>s{2Jw)?-=oSB%>
> z4-J}%_;W-vOhGh5Db}1_pLyunk$-G8-u2BgW2}ZCCSV~tL44P;v$1QBU88ddI%L0_
> zqC>XrB4iWw2pWl=5RL=BEkqXa`9xV at Gx?nGbIWYP&a$!f8rSfJGjaT!`k$BM=ee*Y
> z>5|DM{0s=_!Mf-{&d{Eym6aO4gr8(V<iSk%#KKpo-fhn^W!qULzN0u>VmdFauSTn~
> zfOzW25AjbCX9aOS8~$shbe*b#zxun1k!QQqLXwrWLSP?NP4l5HodLO=!!yCxe2y$=
> zmXeWYkASa!kCoN+ykXu4U7n1z*ch{i(bug`dvOuyfe$b`iK~&Z+7lSPFSTZc at t!jt
> zc%qfI1G{U>k3yftSHR1|8d~6#jNs>8vC?kf&$Ya}22vvL@)R_z55PmzZmVf$M(AVj
> zWOwNNu5sgfX0LgT8*BVv$CF%ael_K{;1=>biQMA0jx#NNom){84mPL4H8fiANqnkC
> z;8yi|omWo9zpRQlBLytj=juZ2+f|2thTbpJae(%?yG<~82an7Qrn=h<X7BsUX0j`T
> z7D&cs=qGmrD@;T-oSV^qR&^dL5Sbb3dU-L?5~UV>+s!SY&xjXf>+5<?n3>2y0T$gK
> zv>HSX&T8Qc at VsVKqxE?;M0>FQd%&H;qls4d84oMvH)!izOg4ZoUatK~w*|*yD|ILl
> z@&1!|(!=Zqc!|QQ{1)^v#b^HvJ3%J4C$P=J_HF-TEstY+(!UM=fAKfs|F8Z>@&8Wv
> zy5nXa?Y-;U7Bu<j`n$eIt4i(Tuor~I`d#-Vi$yDp>i`5()b5@%%A_o!`*1aQ=_ts%
> zThn+K at Y>&+t@!_Y>(%%_rSHFIKyF5FIw;@IaPECbklEON0PFW#+RZv-S^e;xHCwft
> zFT%o=?^9+Ug759?Dy}*kP;P}s?n>+(1B at O=>u>%mq(fVhiZ=$pS+e|YP?RZ3Pv`ve
> zo at 0pJ?Cj<fwZd>7u*5oTgLdk)0;ufPTDTehkMmvZK3@>Io&lZnLEAQ*Rj{W1A75tz
> zA60es|1(=M*(V!BwoDc_!H at t##1L*mj6@@h5GkEn4WPW%*H$QMwe4H(z at StkD$sz6
> z8WkgTLE5HNTdOx{HBhQp-)pfoH3S>OOcjU<!#HIA-{($1+xPz|d@^@C_uR9eXZ=0m
> zgR8;IO$}{_n!!Um=%q($^riIW|0Y(?WTH3NZs<aj-k?UkO=M at WK~@!Fm2mQZSIZh#
> zm*mQXU$<7rdREg!+L9TZW!9^HYrO@{+senU>RBlo)VCLQ&$Z{;mNlGt;Rnc1wED@&
> z28z<v;Knj+pZ8`rd6j){CgZMfXb1jlV)td;xeiNU at vr*)tUN*ToAMm-;I+X^r4%n2
> zez#Q)7gvm`8TUdH(_Yii4l;&9gZFv(#c%Ke)_}voqCM2v;?%x`1}+SrX!0nBzrc~>
> z&9yx?KaZ&29+fV(c*xm^bYc(lJ&@O9ZFsjNi9h)~^e-}Mv7=%4l2rj(D1?MON%*#i
> z at TSo5tQBy5Cv4Q9BD`1R1LX2sB!|p_a2ohn_k~_1j>)#5d%zZ&6fF>n!CLi4ShHX_
> zl*$X8xvh0zDrNu2l2L=uEGehVnOJrm(t{KCBE9hLwy`P>56!KIN}#tNu%3<h_h;_J
> zv&Q2A{cxaI(C5SZK|~-P6lL~O=DxOR$M1RD5q`r=ZkuKyI7g6*%D5^Jx%O^52wC>y
> z8-fbI`r_Sn!Q`NJDu~v8vvSodr{sPhcA3yWkFN at NeNWo|3Pqu?9(R7R{#4))I?Lnh
> zY1w at GY;yGl?8si{>d+6`-^I$xzUy6lRtoj=(cPsqoJr3x^WIMBfZIkQukRTLf32hA
> zx!s<cxM$$~7(UZ*a`iRVD0haYLL)gDPv0TE=NvT$tsUDhwj at D2t#*{2q$e8UH{UoU
> zEg&i{(t>|VN%hpWRYbjdNJm>^$IA$hCS`dz-D*w}zc at 9G_*KxT4e`@%q#8+Yx>);;
> zg}clG+RZ*sscREE<KAWvAYO&1w)WJ6%g*kmj37sNZx}CY8HwhlLA=kOtnG4<@@Nza
> z82<He^&@9Sfvh&M7Tm|q^!Ce%L6b7He~u;Qqe7oHNl#_fJ^9X~dXG`W>T(z_h4k8N
> zeRccgcwgFB)w4S;Z7Nc(z3D>|my|^5gO^kOADL;Sen4Lhf^43S^_TFqaWLP-4n|rC
> z3eHGyv>olCUmQw>u7KV``i3Tslvks%aR>#6B=KTFuTuA`#dc8hgFRqXO*nBU$eCx}
> z31gdmY0wp#y6(=GQ+}5obUt*%+E>SlMvyxh?6G4XI at 0>S?6>gs<Jm#ZfN)7fg=f5K
> zvs%KpRPAwUW($D at 2m0mj8`O(;z$5Ip?8)iRP>BLpM)-^F1&cj!KDqW|Z{~K4hi7q!
> z1PK{UO%y5nn2(X6isbE?s3#nidJ6V75+oz0J-rV<Os*ui&@V&333wAcl>M0T1>Do`
> z$pubMR%P-zXq7S^zw>N9u}Lz{6;dOE*hUUK)uq%Uw+iiQNm5dx*l$Z;QwvtA^EO#j
> zY%jE)i!q^x-b1hZo>1>bGOJ__Wn3b8GdIRHsPaF_`X(GrP!k`FfwiYLz*{|Q+5MLw
> z?QVp^xj at zskLYP5L1)LD(4HVD{QTOjUzhw!WDEBnE!jp2=O=F+V061U8#H3_+c^de
> zY%yg56_1*XOw_~)a)z}or1~~9Gr*5Q%XWxku?h8PI7vI+a7Df=G|!p8%KGXU&wd03
> zwu8|&RGU?l>qc-bkFu&=jPz$Bp2f=&IX9&l8CK3Eddg=3^4M<4b{amjnZ+QzE=YV8
> zDbmS<=M!}!Au&q{`_Ik=?C>=6Vi5Xjx}4FhJdTO4>TCq|9#AK*GbcmipKpCla9`4`
> z9E-7}k*}?mnhe;?94PageS&G=-s=n<(utH+tCpmJd2&eVu#WH^q`na?7Asp~eUtWF
> zAlBw54{o3(l7{4DCl9_Ty=k??SQ!T^U+!MepbEYv{L>caCg+QfVUd)b=y#DWG{nC<
> z$@n)5rPa67u1LV__}$@M at k8+HEg9S?ysI0|q+V=Eo12g^b`D86vWMD(h*tK)%(WW)
> zM%^!Vk~%*43G$oc&=Bl@)>uJKhQ#9nN$H%6d;%^`WDV>;Smub7;g)Y(GyO!D?BVgj
> zKbaolU}x1U_U+8BQzDa)SYCpXBB at tCLH-654m5H&4eB^KwE4t3v^=>9c^RYmb#s`=
> zo%9~Y6ta$>STG>x*m!8L>fHLwlLR#_-#n#3J+o_DCBD>MqwIQf`$c-`!*w6M&_C4!
> z^-DZz_v0hoNSP}airn0c1hs39>k+JDc-mr<G;JdjGIjHFM&wavww}f4PQ_<3ZJ*cT
> zVdC+p&5_t5)$enK4q@*fkKGaabLc%Y+m{1E+Pu5hZp-Vj^(R06E%z$E^L^c&;BP<A
> zX7y-`dC!z5<UKbxNITrTK&XR;_)T?|E!!~v?U^oFHO$-wHSu2BA_GpZrh7hWyx$^o
> zLrac#Ml!ZKNiu5TpNU#bt~JL4fue@^pMD0%GCq7aQax68xMl}jGb#0&wrO3o(4YPw
> z65KsWZL1~TDO}m_Ssn4Bf@?S+oK52V^kQUu>bKvdyvP*76Ul322Yj#RJmgiw?YYR|
> zJ;|S8r;tt=@vgGF^ET_XBKIBpce9UNgxbH?JS<#%tO#16vmyTKO0=qJPOlo>x{`IQ
> zIQF<mwhvryWH!X#7|?r;+tBl8fVt>R&uII7>&iq5OOL-fA-yO14mb}d0 at AzKSSIH&
> z!>p0kW9I8UtYj%F2af6%BQ1PuV%^lmWAzqxf-R;{sPQjFKJ|D<vwxP#N{o|E8L5WV
> z-n8VG(7yP~2sM_fuZ6b%z*lbn>z>Du?Dgy&9n_$fZIKc1ix=`Y1A1u`e;^7T_$w=#
> zQdgnxvqR}rS at g~vFh52GH8U-=1<%W*&w>Mib#dOC6C~cWCFM%BgKgJlCy%5(b6Ba-
> znguny+@}gsrSxEU6}@@Uo0VeC=^Bn6vm~fld(khIL%~C7e+f^3X1Fqv7p?#?!qOxR
> z{M;O4QDT2anv*9I`_LcQx4hvA-B+To@~INFkVvFgu8W5&bbV(<XpPM4amCzQ!ko5)
> zncXH9#NmUX>-JoWWG+ogB`DF*vaD><j;CYR6+Y;c^jzA`ly>nio!y?oZ#B`QT=3Yl
> z`Kvy0S2Xwklgs;G%Vl}M8+bghHdKQ4t2ThuK;V*7Iq-IGTiT0nQvTm7=h|L8H|FVg
> z>CftuJ<heqboSMYukbvnzNx3>y{nS)UQ@|A>(p5K6FjHt<?FTG(6cEwV`cCVG$i!a
> ztUn8{Ir|y@#&C7FQ4;<zXSZ^D+EgBYj3b`hB3}|*S+$5&lrg2Q;h0N(p44;r%ME`h
> zv^qJ(BX3CDrl>va#$z`N%F+4KeMFQ^0k6Go&m7{wtPRwCv92Nh$9>|#hCSx%GB at Fo
> zzZA+TQKtd>XO7Q3`ZFi+CR}@r{Xxw-B0PPy<80Y?Uvly;?%qO47UHMtP~WD7hqHTS
> zhMtD66yJ{Y-IoldUP;Pp`5R at 7ZctUvQolCkUav_Ft=fTD`LFe&M)~0n#oocH(YKic
> zug6M{-*sZ$K=8Bm`s-iZDJwvDRaX&o+%eWdXYKMT_wGz^dmYD<BjAG0{%2R-iOfB7
> z-ed)dV5J)$5!-P*`GjM@`I$?<^NS?$d5_-_+X2<I0~@nIU>QAJs{i9;dUzrhEoXDx
> z^0FJ7Q;|j_ce$`k>_N8MBND|%Lpl9#$0LoqIldbI{A1_Q+#x-4CHmqlt4}u?A8)x;
> zhaZEsW<5J~O{_<B%o`7HjesREc=V9 at 36Y#88WZ5ZdiFW_J-M$)bZE7n<7xXwaUJb+
> zGSdn?!^`RiZV8oW%e+Jr|8Bje6+mTLv!tZ1JUd%-P6M}~qnZI7i-sn)%znR0f-_E`
> zHbz&PwBr7E5?)nSZyUy!KG2z+?<(bd4XO4zm5k4tTm4GqJU)Qk?rny{j;E<gc3|5S
> zkytdDvECJ{b!1LpvVPOZMqZf;x0_P$K)0?`<zV%?co$mjCWoHfm1X8c?ZF~s0v~h@
> zulFFeNE)~`)*DHVWEfvWhyWI!XP(#-hnv4ZZ`5x%GuG;jZ1dw-uVq=j(io2ZW(n!O
> zZ=fe1SSfbX11mx3TFQQlJ=2{XtUBvh;5>pmj}7{c)4SNqCxmuVcMbg1Y^=Mz%BFHc
> z-_-Yl!%`Q(bCWUSjf#w8B{9Q1YY#`8TE<srPUw)RLD2gdJh{bmQ0iN%9=_uup(S)}
> z-CcQ4;^n+q9|dmZh3&uD{zW7O^pq6MbC2_-d)mJldba%`&Evw7@@{AQ!|USK{T5cW
> zuh1%U_0e3zqpK`QnUkxJ;T(imy_&k+W~7}RH=4_7H=M%N>DAEkwb=f)A<Zfp2tbn)
> z%~$VfpGJM^tH%t01rWctep<S!%6R!%Uxi*d_{MAb*1o89O<@;{@B3 at lczIS|^%;@E
> z?|XCbjjA~>KWq6<?2)`AC-#}WtmYZPrO=d~ueU7vPFrlR)voqEP`|Og*8Z&-e~~<o
> zucLSTyXUszS!vtWpk}5Ue=+y7+jvv~gP~aABf_qVUS5rER7TO?3j5moM-##2h9##q
> zv{fc=QQGk;)t!~Zzfno=d;CjW+2_X5u!M~U9;nHWp7TAG_#T at i|6=ki at Vi~EN7K*x
> zrD9Z8%vU{q^<wefpUs*RSfXsxD^-dOyZ5w>kGJl`O4o%m?(41OBi;s5R(yapY=m7~
> zlESyk{qP;^u{D;Bz$j*om(^v#&^jP7X~)#zCqF3Idt>lAnZ9QZtK2B;>qpz?sxfMj
> zsz#oZ_FJfri(lxPA@}5&+=uGUKtoithqY`dO+5B4n&9Ga0eq4d9{Or#P;;m<$Zqh<
> z^$qIDXf;TpaItE~iK>jde$?$X(-Yr2`~I0x=p%BmED~fes9{FKT%$zx!T8N}Sle`^
> zTj#el;<IR#82jqTXcH|ADb_VQ#9mS6q|g at fJaOMRnXtZ&*%+5Ec8R=jkBkBMh4)P&
> z)eYQ!T7Av`<J>Gg^Vt7?mfr3Ew^@37q=#8L`)jkbDxfh-FHX$TjjIA)i%ZZz4gG4a
> zf}p?lFtqsp{OcTLW^QI?KB<qYdiIWs5~%pwZ*BigB<00>=%JK$!Ie!3EpETN{qk^M
> zsBK;R#TMq>Eau`xnkOLh5UqroEwe3H2*UmtYc{&i%|>Qo*V6D>(hu*x_PHw3j^O+}
> z&S(3;0&dTa3~OKLTSO%6pS3UIPGP8RPjWjek1FiGwtZpCpXEM?w- at o|DDIBzzII*w
> zIc$d+FS%+o`OM*5e9mQU at N&%NSj18G_hOE at 97{OnaV+JSANo7L!?+s9ak$&A3r|(h
> zKAGRqa2EL-i#d+qIKJiZ-;W~!u~rlF5s?=Kin<%yZwYAsvWm=Zza_C2#9n^nv!T_%
> zrG{36L=Rf4fg%0Rim~5X4~!US)e;wuXmK{77O+P6Uu0)mbQH8=i%1S-|87u~9YQ@^
> zly}_LF$Y}F+r{#b-4H#3Zrfkppr+qPFI_`>d at FQ)!^!V~Bp_7e#U1*@f2R(^6+$P1
> zepo^5^Je8(H_UM9a0d<QJL#cM*rAf3b<?pdw`k5!ZZ;{?tV&5CdvE;bLDAX${`6i}
> zRwz5r%+<_5Kns5;vQ+dT&b6Nkt;25r40Z=lV;BB`Im*r%o*sqk9rk^8tMj7^;Qw!9
> zeN{7$w3oN9YWu~Glce0d)p&bYy}jaoXOrI1lGW(bTEtE}-4SuORru97N5r{fhF?{Q
> zRAWsL{in)9s^Do~)n4BAi?#tIzL}xT=jg)Y<k<D*<hBY{WF32nd98(&x~|%$vOC*2
> zU#X+Bgr89}=NUO0`n9XJt8hWEINH!Y at O1gs8^ZOJJ4wpjpz=R7;SZ4(T^3wQUv!%I
> z$LZ&D7UCO3UKY9_J_&mnsbwSS<CJ9(idyR0D9>0Sj#Q0)`Pu5*241XBXD?A%Zw_Ww
> zWxWjUGX1(iACDI5_os)SW_;CaHbbOeLc7<MZ}>rcX1Df6kNH<<rX$dqNBHK*`S$qQ
> zMEz|eIp(9=9VYGAHUQSRy6|qX=!k~OhDF1Pmbox+r1_}OhxskwN(m2mA!YJ#jSleJ
> zg2^L#X-jkafj;hHWjG~rYWwtrB{kZCLM-;cDh%RF<vc&MlfA4H*^4rik?pgr7Vw8V
> z<5Sv at 4B&<iTHsb}uZhIg`jgI-p|`{zR;fZ(UF<(4A9GmfH+s at p*;;ryKC&vm*}u}0
> zBod9pmuUA(nK3`54dFTW%t2R#ge&NUuaq*0CjD`rLo6pc#`z00V!eq(wgXBzKl`jq
> zm3JS<`dfc<1U{I^j72Y}^oEl+G<PrPxK<>;(TiEVfj19&JFb;=Jn~5xnQ!IqOtH>T
> zoo^*(9+6l77E at 8LSU1qGzfDL{Xw5jBbk at Jt1*8R)7sUz}#D&50;l2LPT%Y-OYp#zb
> zmVq^^WXA6))I0a5>qM7qP*ZovI<BxGY*5dCIDj>@#Wi;)QuEb6vkrh0cbv2rzQX>c
> zE_^NEeIq6OAv<$k*LYUqTaD6KXV)0$$zw*oe`Q9VwPU>~WAWd{A>XL1L*mhHB)@^(
> z0rQ<!Kl9d5$vWq6ihp?aZhV*dMa;{t#0o?!JdI_ZBbdRuku3Ph|98cKgJu4Ju`!QU
> z&;k|*Oj)mg+g0_LWqtb(`cb6WGUkhjb8;tIR;kU^x<)yY_e1NR`Kf7-<VIDP_^8rK
> zJiWxK_hsUhscRjDR;t at rukZ~`l-f!yD<v2YlV#QT$<@d83;MD1&y}k?{hmqFBjt78
> zHR+An>Uyx&Ga8A7?)OY{M8+bS0*6&3mzJ%DA?5$%JOe6 at _0SgXO2{EhOZxDc2U`M%
> zTG?>2xi?```1&oDJ=Wl!|KdB>sr&7{^Eb!;&U!Eo9oj<13cOXt^|~cbITae>=e@$u
> zW1F(diWG3Ul%A+BN%ma51g_^PeIhcDCBp0L at cKHuzJ4Xr0dP8nn+QDwho5ZXZy*1@
> z$=Wo14>WMi9?eYA4KrP&*wh1^S9n!I2K)IGG}y?L#TwMWZws3qx1bLo>5o$DtB6r-
> z$r|m8rN$T7nL+G=7CqfV>SKE6M$jmO_CPU`4-h#+)%)C7(Rh_V=+?kxG1IULO6zXa
> zyammPJH8_24^1*%yX{!G5|>mt)`rn8KZPVKygR_YrE*ut_Qn+b;W&-%%wCR_NO^K<
> zOzm}suRwQqjJgdB*@!@4V&TS`^_A`nd2+Z3KP{{}zRS_W at jIfY1cla9=SZqW4-h_t
> zX5KN*?@o71&vseb&Ae{xU5=uAI?stMjmWmU8tbrFYB<@d8!27~+CZmD60DfWW2WHX
> zcxmkda~Am1N_QcXI?;+8(SiH~Js48qQwy*<TF^BN*>?WW+v#W*(IT>!VJF4jQ4{&0
> zIgD>i6K$WFJ*0c|I5LJbd`VVnce<r>JTdian!V0g^V3~{8qsiwwCvG40?n;%R{s<&
> z*GW4QcXfkrtg?qDQ9q(b+D1CZilo-92JhToPXuU3U+>YeL$%8`u#}_yHZZa$ChB$c
> zIdj at jy;371q at 84^lUkjOn&Xh0d#F_w`6S~p>DqpWp42+e%sW?;{6sz1#i^->RH>wL
> zCsIis at q)yBIliw$YUt{6-dEIf^r(yaT|K0^?6LZv`9An3;X$9?5GV at 0gp8tBY@Ssf
> z9#!%9 at kdXz79{H2a<<N;x>e`3VaaK2SVk-KiE$#x{=nWFPBYHHn`3n*JL7<1oSgs5
> z_!rm*i3Lb;_`~+v6M^=*C)TzJO0T}8qGcYwhgog4l}k6M)@v(~?>=p`+ctD=Ft+a2
> z9NUKT^(<|9Fr{g^`iYsUT>6#A1N{2bt@=WAu6x(FwO&+rKTN{C>uZj$hyUq1qJbmv
> zATbp#4+y6Ded-(b!;M#|d+-sGc!_uU?zE-b^Hk1pmxZpfMpN5oU>WwK at Ewi!Yv}A`
> z=6_~8VJA*g#qo7|!wHAn3+ds9^-BY7;gQ<?P=AsNOZB at WUCAq)x~*le+}*lcCD}!{
> zl;zB0WZcTtVR_G9s&eGbtu>~@-lVd(PH390$I%3wuT9NxivB>q_Y1TsLG24iZ+-uT
> znynO$bJTEsY_Ci6RE_9u)9f#ge8{b-Q8V|IB3bD?kZVaRI#r>Lx6#0B`g~|F<ofIO
> zGD6ydOS|i#cwW%q?neA(NIx-2&9EP~*QuOt?Ji<OwA7k^^trGU{{p&Xg+2;t8~a<(
> z8z`2&-m=nTpNF#ip|#h~c>6qT&!&c6O{~Uvq+x&btLMM6$m`q<vIf?8XKnE!ISJ|j
> z9Ql4((IqCEfwUYdaQN9ZofW$wJhgkSrE at 0D@gh at Wrt21^(fP0R!*!ah*2d?wwgcV=
> zn>qa|D4$f;>{8)!^-_^wT_{}1H+Tk3eqrb<tt5Q{wZd3`4oVY=wybcUJS^)zXho|m
> zNu=yLe`ExAvi5eyzAs*!qMKL0R!-$&mtU`3Z(9~y{rTp2Y(0C?ayl7L$39-pc>AZ&
> z_v}oe(DjUbFK1iL5PtNzZ;E8+L2BhSlHhIdrdYoWZ`Ku^cnMfnOQYp_GV$Tlbs}u`
> zOGKN$gg$AzBXpnW9ej?pe+4l+C*TzXFyeX+sNaPIvw|2fYd_@(2R>~#qYD4z6>w#`
> zd+SfB`5G-36yb)1J<;^H1I?84aj_i2M{OFOs^>>QUGAC?`b0fx<&xyPeog%9<;v!B
> z#s~Qhp2lxrlMdw_AIwD;Wu1NEkoKa_e$pY9_Bz%Y`krLrf|g&SCz~VmG|F;_=hw|&
> zu5J>K_edR>Q1#Ay9kdsAwn|?qx!>Q1mZRUHPcp{~jdkof^YXHB-YM7sHo+CKYf>_w
> zwC`di+~V3}s!4BBPbpX9RmP=JpPr%>O-|QuB){#-r>@eyjaO;2Wncd1Kh1HZT_nAA
> zs6yID-qz3GZEH}Ir_z&>PnN#qP{~_4LD!y?-8C{|Ca3Dje2wvN=26DR(D^^_Ww#zc
> zFFk-9aR6=mKrod*#d#ioxtu#WX2b at -;L}dPJEHSP3yOrJho~K5b88r<MLG>W#=UJb
> z{8 at 2Esu~v#4W_etEYy^9SlbW$h4D0di5geuNzw?Y4Yw$<YPmBOO~N<P5W4M)6xLl+
> z{)b%l(Z`%mC3=LtcOj}QkIQ~cIJ@$bPVnZD8vl)Gv1v#mrbnTNv%Zgw!no*sb5?t0
> z`yFjB?HFuOWm}DOblG0&ipH>OilimwSfOId+5=u=lzq8k&vNv~gY9>;SGK*>7Uk;&
> zJy-{0wG73g=Rr-C(AuhE9r=%^)juWzw0skuGpo}2CVW_Qq0FS%T)juyCc&}3Ezzc5
> zOUw`BOI8->kn-hx`8#l}SO!`-3>Qkx;#wD2b=&Y2*IHH?`hr$QD^cb%oWjkO{Y3pA
> z&a|xaUpdpVAL&W($isvmDtGJ62H%nvh&|nf51-UO^C@!#G)Dt<`YBqli5!1L-eU~L
> zJv7GW)K5wWx0%^xm5%zI?v=4qo=PoWqt{;}B92Cc;$`dB1%iP;I6u at qjI6&fm$8|c
> zLd#lui(Y97Bj&#^?u at ts3Mo8m5zn6uH0xLE-_s}Q_v+6{6pga=vT|2E73 at JaXlY({
> z*PL3%{d@&pS6&dChz>nD_jPQ?KhnRM_rJP3=XJd_QY<5bb%Svcfj7ON%@{8<1z%_}
> ztY at +_C3;OX#+2^6i4l-l%B;oBLPtl#=ydAnY*Y at Kcj1Zhq>SY)v`iwe6>#f$XL|)X
> zxVqpbMwO)bp~!AX&$xpF`I|Z0;*yaWkmh8dxxGB}R(nOLn%Jig at 0fwU#R*b<qJAq$
> z at ic$evBD3hyaQH#3++yQES7xzgLOei&!of%B>!>reLVauZQpx#<Yj!xS0{=D;MDo%
> z=SUfQ#p<iO5i0LtEX<}6-)?(rQ>P;eLPKyu>&Cqf^h{_DZI3inDDP{jt$!A;?OM+v
> zx9O~}aH_#;xvz15)BLe={{y*S3~l!fyQU`WnG=LM)oVg$>U>J{GI&Er1!blvK`V!r
> z1#1_2SiRV1>>xg{SE{M$)NP9B;AC7+8D-g=rNKXXRIVpizeXvQ!~9xA%#uS5D*3$7
> zvW<4hqt7n6=t=!hYVob;t+8tRBquZuB-X6Z)i2&>NfJaZ`Zz1p<Ji3(R=ag*0G((?
> zjF=k&UVXfLvFu{TUJi2IWO&PodOdXJ&%P%6_^EJ$ta*n?;bE3#!t=kh&joF9E34gM
> zc_+GvcYef*P8>aA3B1!Kyelg}{La{6MwaBu)yZe&%06^;=KFHxID2&(t5m_+bJy2=
> z-sbdSC0?trO~vL4JG2kn!500A+AHs0tw6RrFbrc=Xi-O+N3$P`jtOnXW~xYE&6q^C
> z;jyVy)^CSrfnF?j$A+gvV+RpmcLQMyv!~Q1`@DmZ65nrmk(`f&zfd=7D{e`9&9$=*
> z-trCe((rEv at 7!Ay-oEn|JQ at nbdnt5zIO_nGU-rXLRM_DEv_r2K{h82ISjCRUUM_dT
> z>Rm|2&)Ve2o)JsX?ge}1gtz3B*p^1^qMH^wNxwTVWVc>;*}-ITx#pn7#l}JW8F<|g
> z8}rj$!$phPpuSNLzm#V<;fC|NFOe at MzArui!KD&yBW#O3W62a=7dz56Bna`XA{CK#
> z3ijxRXQd<S0H_IA0C^lEq}AA^v6oAqfOQ)qh}cr!OK{aw7oVlTWL7hmt~bF at wV%Wa
> zCB5E*N4e*|lk!zO$-vq|!<018o#0yHNIvaYHVE(9iDiU+vCm;=tsC3N at dl2)$Q|ed
> zG+(5_gGjuD%7=K6387cf!ig8>H1XEQ4um};?Q at P(K+b;5Bqj&f?^q=r;{T`q8~+~$
> zmuRtvNad*(e{=Gc$1N)JLfQgZwEasX9a}k}GUK02A<D_Ipklt9T#o<8xl$)fspU&!
> zub}mG3-|c(A*n^9NG<f<{@fwC#g%>2 at p^&IV}0Bm@%anJ%h~UcW(<!sV3X!(^yzQ(
> zjs*|hha^MuDUoE5;?eN*cP5FH<KX1Th2nXEjYm2%EAM`ffh8SO&r{qP78$Q!DrG%(
> zlSsg(%!(AU=g8C6$OzV#OF6qXl7Ci?@Xs{U)#_u0{XUW=@`Q+6Fea&Ww99qe(Ot)P
> zTf$EVlR|ssDzvP7Zf90v#D+d=YiOO1hRPkT8lrVo$=HNVjQD5S4lr7m67dCjrFb_n
> z2J!t8|Hed5i>*|m4=EqzJ+jm+wfeznB#YgLSkQd(DiX$5rEjHeQ$Lk-AK{xVR~2K<
> zjW=ujhc2+*9%f9FHwUMiQy6{1L%YxAw#^*N%s!-F0_Sj(S;(jkw=TeD*pdkxTg10s
> z>I{MJ`%SENZ>LAYW`?9ebDb{Hdt`?{w%ByQjsArd=ZP5HAThA8$0!>&<6C=^;8ZRW
> zYYNj5wIwV`lyVGfyUa*Er`NM|$U{i7%Ppxb2tmi!p at mNUb-i;PI_O`iWINFx)N3jS
> zE7A)Mhy5`fs-D^MLBfZ1cU|Z-9;}5#;IxIF#y;2yZ`ET|q7U5>c^FxlI};isvfaF(
> zW4uUsyDmV2yXfn>{Ns++;RZ4i^!IJ(?O%vr`tfx~>xA~W;6=lSuWl8(%cc_`rfNm$
> z>4O_vAJ{u{w^OKR(IK2B5;B$)NV9!Omee+RNOEjZ?cd(|^)Kz7i>2x^eI8oB|Auz|
> zss0?_c%sXD+<}~wIKkMA{I_*C{^dR7nT~{<e8o#)zkACSt at HF{VtF>c-t64%j7~;#
> zav1A_Bm7r(A5^IkzT=RKR-c3RF0Ipz at A<Or9SObg at xb=gqP2@)3jm6MSGVbh8{#LX
> z1$4VZ7tN+{FAIH7>XU^ZiC<u~TQb}RQQ#Q!4fFS^ON3H8aarANG>IwJ`GQ85J}csm
> zh>wdrTgvrx(V4OLrCQqi;kwo}Sx*sPV`vIzc$y`Lw-KKbY{bwT#xP5gM>OHDYdd!!
> zP5jxqv)azqA11V&vZv9?Qscw2hw`5_ at Ly|r;_&uqLwaz$PNS*lZq?KC_Bz{ts$H4y
> zw0mt!@!fU>wH(g;zNw8 at 59rhSNB6zdpVjx9{>%D))$i_mp<na++;jZCwAp5Z-<LbX
> ztS8k4{mJ}J>M!&A&Yxw at _WR0anzOhww?CI(t$!lFv#d0g{gYXzMw*j+1M$~_HN6Y^
> zN19`i0cP}Gax|sx_?q<I7y8q<PWyAdc^<3V*!PFAkM3n%9!u1^Tr;adUH)s6y><SR
> zCL=KaYLmHL6h{tx^5<{U20GUGTEvQTEEaw72jq^vw0+)w$My%!WX;#+ZvW=i?`(f)
> z at aFdW?LO*R5Kq>owx#$h*EsaC?>mFdIU<QHnBs`!u at aZ}&*_^*8_b03ZRwlbpV2pg
> zv*6Hr{6GEzm#oJ3M9%kna&Kd$cJxg#>-`1!a`%=<p}%0PoCU~fTz^{MY>;%<_02iD
> zg6ksAZ;pVZM(d^UJE{LFzh``t-*f)bh{NwGyN36^%l+DZFTYy<QhsOk=kQx8DW}ch
> zY<j=b at 0mK=T;e+(|6?%Fdtd)0=0d+`)^x64v#!g`%j(K$-K9r8R_jjbN6W;Xk*ybU
> zOyfw&YiF7>xjK)lDWpv0JfHJCj>9=-m=o%z=pSyV2`=qj*6%fo;9Pc^*j>%FnIruZ
> zN|J`s(^EMI at W)n#lck^1o~NHq{(O}5lk<G(r}^I%{o=QF{(t&u3KHN7+FeapX!&`L
> z1UKW`efhMRt3L_p^h~T1=XF2oS4o=u4qw<;K;2b-gIt|=1^U8j;^%2=?7jNY9BOLo
> z&FU}ptMYPktB{nFcn*D4=2sWjk<znf7<LYqa2&z0nxnH(#ot+65qFpux8qY9Pu+Bb
> zuOe<Ur?<P?8#GA7!9SQ~8?QGfbN797;>M-sc+TE2OZokqS;X(3%rP5pC30J3UY6<J
> z_ycpezw*3P6CcY-$*RKMyK!mXQq#V^r|A^<AgQE(!%X6P=a~+E^ZS<eKM+$so7j&t
> zX0?EKlUqlQw<f#EsmH0s1t5}_EzYYfvfKB<X<L{N>Da98KPP3tz8#ucC8J|Q9;&r>
> zwSM3!w}1NdhE1JUf2Mxi at AM%@Hk0|aQ={ew)z)7O`DP9m%S3M;sn!H)^`3qYXIJzm
> zRc9{ls#GKFU2ZE5`(@;P?Ru|y9dv=ErHfCn@|{<2pS0V#NXOsO_1>X8{|!@en_TLQ
> zaC#s|;g=w#g|k0$uB7A45~S2imZ;=lrSCk2^d#N-mUo08og`8pFzsKK$s4UJMTX)p
> zC`d&%lkDGCLhTz=QXJ%%WZ{^T^SM8Q`{zkIGrv{(oY at BL8o;yvhDu+6FDU1iWhQ)m
> zf~JXI$r_(RD=iJ8pJ+Jq{2lCxV>=8a0zZKZN)y{Y<<QeY<pH$jL~ocC(006ncS}0*
> zwDDc at Lk5x3y!arLM6)7T80z?kf at _G*1Ut@>pknTR3u(D8xU|k2kJ;-2%Rt9C+;HaQ
> z0?`Vg&q-%(DmUk-tB5q5wDISOlsz{4CAx*&__9;>mV>5|^K`jivwQ3p>d0uj7u9*a
> zQ$f7`5xZDDb!h-)bU)nCP>u(mFo#k4VP%WGqk>BxzNFO$W$Nv5*e_8|!GrwW`@$C|
> zzW)4OA>()e-Hd(5E8Qi>ZFoJhYe3sqe{r3zZJXPY=kXE=H&u^W^!{O?LaM6=KKj>Z
> zthQnk(-V0lrekN at vv*dkrurveED2yO96d<8xHonhliRDI>XQsFb2!}`>vY5iwLIOy
> zF^)y~XcIdJD9)4n#=>{UuX-HL4ZN at CK4~ecDtwOEZ~8dl^_G-JOWC16s&zP5Q%9s+
> z8$W;RAZ5k_8T`s|1BdsHi)qzAIdv#d6Y!q<_OPLE53|0VWqmteo&9#QnM!}~?XHiz
> zT;$g$Ge<nqB~PEnu45<V+3yl>cdX_fZOLPeh*);T8nP?lhJRqr5LCqenSmnYny%{1
> zFRp`Ep`1KB%$S;}oO&j;&o&q#cJz$8+eb7AzWAhB$Q$%>{8BToBV~_ZnA&z;WajZk
> z7F;;ksRKPNLdo?=9^A=f-6RHU0=1HN1;O^PmEy2 at 3{QZ at s?m?Un*-vc<~34sylN7C
> z0-8n(Hih0XU0}U>y^`7s20-|LbygTYK#JmrYLI?<d0x_M*OH}2y`|lcCf=~nSFJa!
> zv%*lXbsY1b-Xyo8mYQmQjS>6gyCv4wN=z_7y~Wmf at qc>X$l51pawSHZ^{o<9 at +dYE
> zNU+767Y&^k;Z0J)*U0UmTJC#$o6na2kIDP-%&T*P;%6Z^P){!@3k~;1X%DYezCts3
> zqm;AIY9sG|DiiNpUmAM9#Cjhu80-CF>;01d^nQXPtsWEU*;y0xR+c!`Ubo*9$!P1W
> zEDDMT!zr$k5?9EFDtBoX<pLMmR<rZ_?QpUR&qh!Y#LEKAf at pqdv!x+fcs!8soB*c)
> z8*ZWfPkm(BQ;ZJnw0J6&JWeD5V4C2efW`5cXg-p!<iy)h)^o&*+05l0abIoUL1H16
> z$RIP?mccg^hpr21_ at d1bOb15b-LVPbD|ExM;y_Cq9i|@+8()=0Pj*{gSdMX_=i%dS
> z*nY8f{LWArcgD`w4WX{jrn0{9ynOpyYQD|+cjWu<N>Uqb&$UKU^|(_X!7mYwmQp+e
> zWt9_46>ci1_FOCPhc-#6g`*lubGJ29?L+&3cCk93^lLB9I^d=Kk*^7!xgaiiz9d4U
> zCVCdI68#CR_kb^`DvNa0Vk>|b at Vg7XEK9nfR;=)YDfA9f2epJhu?9s>qUzx&@K-Es
> z+c_P3;u at Z;=I<8ZG92pmAl$yXBRCE at z*4O!n7+PfaQKFatv0?K4fgP6Np&WpqJpS8
> z-`A5oM8Ie`>0BEu;4P4%PxbGdRtJNHtmj_Rmaf;T+fN??cWEpsf5<zxRo~_v!(SnP
> zUjB;sE9S3+zf%6j@;8pZDg2f5SHa&@{-*Iay)G;MI^X#b$6k&<CeO7#hg!#~bbZto
> z)Lz_3?R367j#m8c5>IdkDK_)<V!5w_{w_!*3cL%XfG*OF4_*G^{gi4Ae>#7GDo55|
> zxj&)06^tMSUY|-^3_4(pl??w3!5$W$S)oIM8W?0bP2RZLo344=Qm`~2mMGX{pFl<2
> zwYvr_nT1rw)gDGuaV)UoZRpbYhPhXtP-CIWf0*zE!DjZqmz-Mnzm?-RDD8yU%#NG-
> z-q1ho?8$re^{>3Lc=0Q*ymI5p+g^F)CwI529hsZlyQc2Q+%?U-^sDo>R90lLlg*L*
> zPTDoquJrU>(>A%y3a&5QHI?7WUDNoTxof&PiQ{-PiQkE)gJ05{MRIS~)a|Q at TAZG^
> zM;<BGJH at -EZ@)E|-f=0G5?KC9dVVMDnnsG$UDMm{*nVMX-i|qxt9*-X$C_3!W_PW^
> zB4o^9)~<5#LEfZ-ZOW?`_B_#_(os`cl&31adG40S{Yx at WZfFa7TQUzi3v!_P&WQak
> z?bE4zSW;{3CC$CpYcucnZVX&KplY|*>@sM<LA at u@dh7ElFMYtK4OFSiRF&GHo>3dv
> z>3eN!Z7qrrh+q5vW7}<9_1bpxC;#UU9TQi*ww?S>od4LiNg>!JbyP*wFq>ve<$tg3
> z(V^#eTStSh?C0;dT)l2PH1ywN+cCpz=Fi?Xb=O6)wvIR2XY9IY$ExkKB0t<-wd4DE
> z at L>&VekQ-W#CEi3*DQV9_KO+Et72`s4ZT--<oZ|}Ps(;(6h66Y7H8$VF6OslmsqJz
> z-8GxvX}hXJ<9E#=b*Ajp=Ep;C&f{4zG~Iu3EHRBovs;x}+flE;-sWo+%D3hHT~V&C
> zBuATCNRBquM2<Ff)vjtv%ZQMalzkRuC{Yty>{}l2c-O at FQflP9?NuC8BKg~^Ii^Lj
> zt#3cgw at M@D at jE^;%qmA}WR!J;dU(Ajn6&*z9rd9}v9{3Pts0Lr|4iD6Xwp~dHawV5
> zzW(Q-nrCotT}M*8+I11Xwq3LMwePw()+Y5JkL7r|dx;S;MXa-Im&Dqhy41fUIhonI
> zVu?z>-MrnuBwMalLa(ndSNWF|%GGz5;HYEX=wIR;x^nfK%l%8LxDq_j%(u*|;S00>
> zmc(@}dfHmEiR)o<opKYHMsJvneu95<wQ7mV8ev}I_c>gou>Gy(sd~R}(gny2CikcN
> zeZvd<zJenElH3`jr9 at e&<`m?bX$L3pn|{#iUvkkzzA=ZDWw%+pSMY{<S*MjbDp5+?
> z5_9;_*<{8ENZf`*ZMlK?0rSmN&c1`?`+U>I+4m^du$?KaNX<{ZjW#XNU4zfb+<?)~
> z8wq|z^NjL}Jx--QTGbz9rFk#-fjRo>&jRXbf#yJt;9is8T4`}0Vh?O_AevYAss|MB
> z1cu&ON92|3oT7cqSl@@lvwv9kHGyU@*)DP><A<TyertKHsEn175lb$-Txqps#Od+h
> zUgb2;kBkpGkcQ0zGrqZNZ1**KkM&No?YHE%L|g84i>FKXBJp(b661Esg;%KX>~4*x
> z4N$>p7WeR1G<_0l)Xv=+Xv&@r?>@8xYC4EwJJBZgU{!&oE4-)2aOv)jMzQ5$-=0Sd
> zoeRXSg<X7-o-R6^!O$B{`&`>H(C{^a8>gv!9US_249fkPhBLo at OiCM?|3)c!*$t1H
> z>&VGjZCiREEnG+YSg3m<=eH2Aa!BJe9P*qqw*hDMl~;8_F3jHF16mA}N7#@^h(W<<
> z`U+!Fo_v~kf)oivtFJwqaHiZ}Fgz8tb(H~@Lzfe|^{1 at U2~-y+I$Q8ua at OeXfpwt;
> z{@aI(2B!CId{S)HXl#*Rq+T&($5Ihorr(9t;?A#dYosiUUc2>0ycQ%6C^C2W#@#jG
> z`&%edmgj3Tnhh<~5_C~}Ie&=rWX_i^@vP6|T#)oQU)vUHi3$&UEj;XxxerzT0^as9
> z1$XgsuxM9Z(7WrBU<xU~-Mf23=!FEm7 at Am>^~kH;jh<%pgF3HjtIh;Tz}tOk)#z4y
> zTUsXujSaRfU>&^rLlB$>s%~!GSH0re_UaXVHvZrtlt(QC6M)~cq$SrFndH9`U)}vx
> zj>%=xPw42t+C5VslAMVLt*;qa=~24VA5 at Py-LnhAj;N1HFXQhLkuX+&@3zlDjDDT9
> z_|wotC?vSK_;Z|z#^fQ!-_Lm(!7m<((!wzJz8jUc8AaPH4!sZ+Z(%wA9_P|F;yJvF
> z^Hk13?hE=kmr~LS_a5LpD{<b^!MV&p?yrBDb7|wzXk4drp3C|7$VcNmoAX2)zYxvg
> z{8sWYLN5qTl!bfI6uKpv&;6U|hcQ+wgSQrXSMO}i>`LI~3^PWX`Stcuy2wCUQV*T%
> zZj59apM^dVc|>San{dC`Mh0^)%bY?BBO7R9k;3=u7#KM_-*A|vZ<HYE2!S=>cxz11
> zzO&luhozzGn>=?pJJYb<c?{fdEMC?WhHv!TtY2WJyy1vWLHbi3z7g$7p?(45PP}4w
> z#^&h;+RR?okgCN+AR~bB_PXGFIXxxzW1`~>-lVUs)zYCh6*wAkCz$w$gE!TBx$}S^
> zsmC4bz3ubFp0N|@qJ4~68u=W=bf?(3Mn3MI8~KDQN7RLU7FoJEEb<Sc7bKqkl&631
> zO+Gph9bu+&euyXFt?=HD&C@|a50RDIo0w@<dAr1q8vWohW?_H(?S_3*aVz!UyGcPC
> zIz;R>cFv$)ZNm9jZRc+tXJjxZw{c7njs{++ at M}44kQN9DDul9XJ6W(r)T*!Q8d|2N
> z(KgWaVdFJ0U=l3 at e>V|)UoZgd at fAhNPHV->#uPmG(b%JT=;$A8-MHTq%|81bzW*To
> z4}M8^O|X>Na<Q2eSxU_r5%xHm#jpw9Bz7EwA75sif+FOug*_LiRj!~_5_kI08pW+=
> z)8veLcE#qgf*qz0rTj7mCx at 0QFg)ogN3cib+N!!2bYjP7138kq&lEeU$ON<~?{(pi
> zA1UnZ=`TPAd$Qy<<8=1|M#X)!PY(PUJf8I>L5)HFI8-_}*t%S|It{@_JbBe+yr2A4
> ziPj}bXO&Y*hs;au%tRJcw6osgt`htxCE=Z;T~4vq09}PvX~T-cer%In_`4>xCLSCY
> zz7hT`J;4W(7pQu|35K56y>NTii!EQ at -?<Nuiw&reumKG{VeyBX!MR?>=m8xPkdG|v
> zsVw9zD;KYhU3#dbeO~1L(Dm)BA`fu4O?s1_EeyTH?<o0FkT^fyi9~scKmSO>$)|rO
> zwO!!1ev$AA`Wkw}O3 at g`{w$@4=CO8ZNDL<S)gB!dz5>lY=u4pzyz at _fYXkNt8R0cZ
> ziNU25YzE%Fh&O-Dj1<ccLpW3T<?GlLJV7uKiJ~sv;8xAVwl!3;FM(V(R`v(D?-W{W
> zZcy7)tS2?$krxpjcZ200Knsb!6l`>jogcIxT}M_sE(Wr`UZfl7hCQy4eotYsndbLQ
> zN$2jAqe+%NKxE*f*~|4%3FV76oSgqYbMbtR2h42IPGZ at g;rEWn4BB>%Gqe2 at MmQtM
> zSa+zM<77n#M at iWpTA`HFW4AqoB at X;ru%&u7)(7RD)t+py*NSwZm1=@W62H8(`q9%p
> z;Kr9$I=3rOJ at Cxhka7ZSfLAYqch5ZCvmv<!?E98Z{|(Mh$-Og{3Ww)Diy9dPC59HN
> z3HF at JYxz#{+NO*=IMTCu<r*1QUWUZmC}YnN3DM~fB)^u!{@a}&i~U=Wxm{g$x<_AH
> zS>sgxdA1~?msL33t*T|Fzu at XqL2vc2(;rC5^<F_WC>vMU)tMbMv<Fye>%qYH at WrXE
> zASM_NPn-QD2>!n?zd#?C>}j^2G)3-r&;%)o<IlUlfktl_-cUcKMq1F&`=lMLauW+c
> zWp7`#A!WnFU`@;6NWs=f%U}FAKvBvFDe5a0^d)_7e|D$%S|0(MGmE2N_X=jPrM+57
> ztUnw0cg0Y%wqPBRg^E26Ri6hp6MOuTnwD%gH7&p^>`;u_EDaj?atFRlPV at xa|1K%X
> zb``kM5PpU>#GmZsE31rT%{5A$utjodx5HMCgo55^a_vez at y_+z)m!=6=AH1V^k6)G
> zKu>AOw%(n`40q~ET3+OMr#~=16d8*1BWOs`IPN9&@3Ebw)IkNZ1z1`lw_;7}MV>r8
> zd at x7p%q%o-H&o?LR(7Sfz3- at UOo~(f%Q~6^MMwgcu`cv7bCUL4%f7{oeD}YpKmG~+
> za=WYbz1P?iLR+Fvk at Vy|rh5d_0Le_c|MucEyd7#gErg=KS6JV#1 at +0ncrc=MyKSL*
> zLH@=Dp0yc|djuP-NT4IjYTA|tZ<%^Lz~9=SQ^TjBVQ~KQv338B8*aVnP_6PNp8J>K
> z+qu at a+?F16y=mcw&)<9&H{3TO_GEQZbT&0pzGj=)T$b-kVn415P999R>}8R8sT@{3
> zO;*B$Obi`!a;*mmQ?6~cNY2#Ogal1(14sRN-)3E;ERTRF{(KiUJH(KC7-UsE*Q~S;
> z2M^0xt7E=XLCvp;llEcka(MG!?mZIh5o9*Ct>NUA-@`Hxi-^cb{ixb(t3t;ixZ7wa
> z?2FX4gK3&4J%z}xj~`7UuWjpzi at e@ze^PD3K1(bIiIu8{unOJQTG#0cfsC!T1$(&O
> zdhU9wb-j(RJ-i8?zTXv0A{uy=IZsfsx~~i^+m}KFtJ$^crnG}tciLt%Cz2WlA51n<
> zY2S|eRaGl}tM$O(?5kHoG*M>Bok+BHE8mC6(RuEx56W|p--qsCN5-Dn5Px)%f&QJ?
> zqQq(GN-{IJQ`QwR#Y1_U=Fx|@+Js*O|A~32YsMI>zcje%ab3fSn%?WP+0ys97^^v3
> z9Ht9vx}0F at AXZ936W%>NVHw3ZXVs*y-H14<TF at BSs;~w*Ci at q61V3XkZ$8Yp&fxe6
> z$4rh}Ii_>m#xX5AK73=SMD_#L{$}0K)COm(Gf)($?b2SG)4d>YUCuQ1a95^IT!P-v
> z(NwJ at NZGp_tyRWU@DWa%Cy8XUts(x%ucW>;+lK0!&z(KgH~Wb9XqJ97 at uohrwPBy5
> z^~ar~zj{+BweBmWC!`;8e#JPWC$@bD1cuBQBSthOzQx8{Ijhw+6EtV*dcJYQy6%--
> zw#{Mp>Ny+jXhh(yRMB9tEp^M4q2`?xjPe at -0SnW723DWX+7|_uGD7nYrHEEfEyBhc
> zT_0YcZ5_#iwvDvq5#Mq=osqcs-VLPNTXpcY==+S`6sXV4SijE^SOI=AlvMZwt<CA?
> zjJ;CbiMqXc{yLR9#H&rME3c~y2Jmd~hOY0vQa`_YUTtYxY3TY^Vy!JWX8cXQE0nrt
> z9p1>FU}>JDUl19D+f4;oziB5{+^WRLk}qqjlz8 at dsS{zNH%;4JHG(!mK3JCYjhNi8
> zb?T*zMeul|)f~Y#mgoGX at U)bC#vuDC?6vnN*XHS^_<4L|u*G!lO{y*3P|Dh#X-ZV0
> zOretbf}0g4Q`)8tM40X+n`|H%J2%&We`2TIh6x&}a2Jf0>n%#UKRP<rkDX*c*5UoJ
> z%S3|-(&#2NBcS=5ffe>!^ljKvsT^luDOd)#`K}9Sj8e{6mjqj(kQiew!xev>88I_{
> z!0rqneWx6m$6KT{r|zLVqpUfX%GqdWnlbvNd*VprZOC~`cTQuaU20#cwgtS~)AY{p
> z2LWw+Md<mb(V*7m-d`FnXl?jBK#R}#+-6LbuQU5nJahT(BrX5tk*s8?2i#xv*|cfh
> z()Z%^UC11FC(1SWW71`su1<UW0HZEbIoI|YNnk*@6MYpfU`1LdyBZ_paBQCMep@<g
> zuLky%vaPW1(9y1wYl#6)B_k>Is1sA#;b7Yi^`Pj7k!Wm}FMqusf<<i=i9V1q`>$;u
> z>oStX>cr!<t%xj_H2~i0k*%4pU*DnoHJfwmu-BK_HEbKS<ZC&u;Mxy*O7RNzZtZa>
> zj-^nr=YyE at 8kE`7#(b at An^SY$?+i_AwfW`-w63%qyUO6t&0mVgu1eTly=<K&D at t|S
> zifPK$`atXZM!J2W%4obwOX2ALtBc>1pn5l*G57>;7xVU1mBL at D<iKBP$9Q<k43(ow
> zJ5!y@^|@~_6J;KVty26t+OS8?&fH;sDV9Qs=zhpvY`P)HcGm8?=(vr&PwTG3?wHvh
> zCe9}-M|GXbF+x9P_iqRm=}D&_7ysKFLwv$qO{@dW%4d)Mfq0X|1Ce=t2UfU+wF^H_
> zo4-h{_WEqw<~PBc`q+yWsg;t-=7_kU7?vWHl=Le&U$J%Z{Do at i3Xr)%v8|`I`}JJi
> z$hluVl(SMj2$fzJSl)2*iinZKYT<-0yCQ(Mkbdb#+ZJa}51c4Fko2`y`tnF@%I-d0
> z07X9=`%=6cGO?jZw{&G)g(Ca$ZMLO%jbOZNV@|h<*O7Q-+GgV;u?@V6t>FrEGyAEh
> zcWCsM2baElnOHJMj$0Oxpv*hGa0Zp^YKzUZx|M3G>5hiL=Km+OT`y0Lv-9+T5$oY=
> zPzw7-%Z>mgKjCOWv=WVOYuhTHS9gc!`#kr>1{ZHE+S0hG6inpHB7Nt+x%_cF#}nL>
> za2UEoASsSc2;WF=jvvBnjmJR=m;Hs_-2nAVPwIz<aLC<Y;fm#@g|RLALQt at C?G_4l
> z&e4NT`t;*NaE*deD0aBfCUCYUm?A at q8V=T+PIhZS2v6&Z^43x$xTlya=?6bki{P%7
> zy(2iSE1=WDv?=npeZqGhYqT4WTllAkSu<yMWy!Oy0zsBg4+Uixe=u0ej8qv!%CWwE
> zT&SU|k0)tI6ZyPueyop|Is4_cXxp)jOPhves&(g!PbD|7;P^F>_Y03F{H(1Co1$?I
> z at rS%bkIz*P;dAFvSYgng51Jmi-}Qx12J8bhCj8>;&$raFlLlHFNW=bXpQ|2$*Q=1P
> z#!}4;batz4RWfoiCZ2Ibv5t*y#|p1gZ5BUZHTK-dnfQN44s+x(N>trNF04D(p6ktJ
> z&bf*)#4d!b4LQCdvdHeaZz2P7c-fPMKkSTFGB-gqk+}yZ+#zdRS7U$c0{ao_O0Q{%
> zJ050COcILP?- at S7ud+XR$U5!6nMptJdkVa=qBVN7RibZYWe4L|J%9XOes>+;$nQ?>
> zc{x5au$HqTFetU?7 at 75<sb-1TeIH1Zaog!;b&tnij+6#hNc40t!8~<ooyoPT4tz1;
> z?zeXNSC*t%k(V4p?RzOTOQI&vTKNz)lYG*xe6|g>1oCUWS at M(i`O|;V8kY*^dK#Zk
> z>DS-{?yL0gBAcCQen5)FeB*r?pJKUu`VeQuJpZ=&7JT8ev0~zP^@@MQ+gR%IEwRjB
> ze)dbj<s#F?#u&lnK6jJSRPeBoRJT%7NVZohT`ZmPs(>Fl_6zD0cfY?RSGOg65yje>
> zZ%yD^;~P}U35%z&=9Ah^S(3zp<@5vHjqoRnIziEdgIk28^|p;-S#sM~T+3hHOK>eg
> zXZY#R9{Hk3C>lp0JIt}#5G)GnKlt}||9xfI%IFG?#V+dCQkK{g9U8Ka3C?jMH(RWb
> zvmhq}1A22`QB)`kH^2zxiM4>WAp<;zsY at tO0@Lx*7p1k&yd?JR$nJhCtHnMytM)N$
> zq(43Ah~}cX75Rt_bcV}=-d^u at pRel!A;POWLoe-h?sG)iVgV#CN$|0hw)Jo955=N0
> zz>0RQAP`#C?Ek}xQR8>J!2*aZsw<y14G#k?_C(O at TWw3Hg|G$&oh4T<7Y;iyck~K-
> z36=@d^lY$FDt68aEt9W^FE)G2di*f+cV4`up=}lv=S7JfirKYXs5jm!QO|6#5qaCq
> z=-b&tJV&WzG(}oD_>qOp8vk^MP_=vd!iCa`;)`*BnJFW3Z~@T-z4*&AB7;lMj>yQn
> z(m$6s(m$ZTQ`5!4bm=+yZ5V92Pi7%^u?3S6FFRmlBbMMw<g3G7%)TTuD^wC0Wu|s`
> zYs+6J((|6?PN$6ULGdlpMS7EnXD;z=`1+K(aupMV;BJkai5_k797~1PBX*`CEgN)+
> z9hb91?+AaBHSx5CU8bo;`jT+LA*A3Qug|k~cjIp2 at eI>%=`8A)*t&S%m~JAcVXuWp
> zaYEYEFnH77johm5wiSg7x@#J-tKsRwzT~6%=0UleNZZ&vhd4HJALLDFv95gl-0~DY
> zU|mEQjvemH=zmG>Q?BUzC*mFQ1a5n`Ie?Xwtoc>lkHRDKEAg!#dA4fq#ZAaioJML#
> z&3=c-UGO=z5w)t6n1~7cw~9LC#bKYU2&`-xQsK*WcJ%IRG`yeR%pyvpplo_<zZF~Z
> zPWE1qHtoUj4e|HdL`xB^60MlzwPe~NrPUd3#+(tGm%#9~_jlzDNtw|@`Byqd4P9l*
> zl?zM_TkiUz=y8+wMvi|?lXB`-I?xcfzP3rZY-Sisq&%d<5{qF}U+>WoaLw$Q^wtHT
> z^+(3{=O815Ly#3};5Yu;ORY6t<{FkaST@^Q%}kl8vOglb9b?Vb)edA9Lpyg at thu`p
> z3SpcNKiJT8Jk0J_KjOEIc<*ZdLtUwO(0)m4czmukC$%=^F`etRy2s+Zl+mNsgl2YT
> zb)^P->VG*(FMFe~EAaGs+r2l!6`x#qan~2I9^*5i{A9LvCAWaO*Ld3+ at wmN#-kKAf
> zWjN{zk3~C at u-ub9^-R}HX4peSOu`#jWa7pYL1AdT%9u=?j*04s{qy-p6bLL0C+k-C
> zr1WQ&4O?R0VCw;QS5Jb6FN$P)*4fX5t~9d`YyBQ5&cTTt;%AHob^K9UO)qPRe>N|X
> zCUj-n3^+ at N=Uw|5YlZzKlAqy>r(F$aHe`gKHnMaZJ*}M6P^4gQ=W;~w!(mm7|06Ym
> z_EOeo=UBAitwL?#jgc#!C-yU5k9~0daOINK*gohzZXdknRQyE0H4i^;VU$VQtVCLP
> z`oWf>*2_LBm$XL{X>LPaYUPwz6ZOvS#-TA##26?9Hy~}}{=U8aBS1{0U5#O7_0gIG
> zxs)=)@C0p060ohg>yTcrH;Z;HS|d-0Hp{QIjt=ju?az~4KD2>4CQ+Jn%5enj*Azzj
> z!_e{0;8 at CY#99rI&J~^}7p*>_rPr#m9<xUU6P>Tzxe1+DUgCV?1WTWV%vJC7wb`~+
> z{%n-$ZrqT}DDg`)$I9H8TcoP)FYsAbt#$icg2vxc8Q&Owp+5Z`wa at AEq!+|D4$d&j
> zNa0}TOzIp9f_<i!7_9U2m9uvF4JnEUtl;FkYnR`if|h;cEAh|+ at r_V|8D9J^=i`lD
> zyZok<@N&@p(`uLhIK_0=C*O=kf4!qD9y&jMr`UK(uY;EBB+8&Om{LmwXhEdIW8ntB
> zcU}%!)+_MRONZheADu1OAqhDOc4-!+YiTNEuaZcO$Zhd;6M3tw1~u$VU>}0>RomUz
> z*Vpf>SHK}Lf|*-O*Lx2+>bKN at YHshxCv6GQaGJX3GP<-%&)xPnQwHDKgomDW|LRK5
> zqYN8b%^8{eac#d)xBc2vO7lEv$L`sF1e#M~f+ci+PQ%*G|0dd|BlLw>33N!FgY})n
> z_R>5%oDpJpvWhsZRfKzt-NC<p0Xlp+oQu{z at 3mz1;$t40{nO|OSv^JPx41&LVeu_~
> z<PQobVA%>H17lSIT^Kt29|uSErJ|wvN58Aj-JcYlYKrD!1 at w(a)wKrqJJFB2P4P?h
> zMDu9PNoVz4LIIr9z=`(KX$Y<UAibD|4sKI4_gqT+Z|$@#>6aq)?N at E~BTsMG?`-YZ
> z)M>i45~PXuwaoQ<lfJd-531aey7j)k75z<m&!ZK6j{4oS<*zqf-9K^5s*OcW#L?{i
> z&e2q`k<Q#XX2517t7+>}x#M{4ya4*rbwmi&wN184*IGMKDobjYI#&<%M*7CiO3y>w
> zHJmy&-zE`rNIgy0py^Vq^katX{5mQtX!S7$2%O>HAyGMkkCO*PWNgcWMJ7>KTq&G+
> zi9dK0KP~)gsF~$ib9ROsmJ~FmwL+_hW(146?7^|J)(`$lJdy4H;O`^Z$<gaILwoiF
> zYTwF5i*O9x=}h5TrQJf;qth)$mYo?|5V~HU7 at 5Y7b%31|DMesej!Wg`U9a$Oj&(8O
> zuiI0TkfK|oI#uN5c4ZSyQxZFcrEMbb%0vV%k-MY0%9XW)*vj+3 at Kdb~Ik~p$WJRw3
> zwzVsLDCHA+u6`8pY3ui4Q(!1!cnaP(zGU$JF8&-c%7o8|e~O;k<5w;aV{9e0j^?zk
> zqFRTK->vO$72|`f*E()W>nf~u+`w<sa<_V`kP_Vy)8}80jLdO+TGwchXVcyq&E1}a
> zrirsf63JEJe-%xWGy4SjwcTvp{f+!O&RF-Kw(gS}8H(;y09T^L36yj>^2VtY<Xt1{
> zo7LyO<#r7Twab~Lz(i8R9O()B9rx9hD#=bAwhvC%w9>7;cWK|R8u_!TIyJwr*BRW~
> zpIp~G->WSv_{-0JvGo^qYP^SZyFDrYF|XS!?1c2*u%-%zA9eMn9Cfr-U_m36D$Rl*
> zh)>0lz;)mk=}`J9{ukl!9eJx&hG(-wiLWz0bz{t2>s|`?Y|x-+I_nGI9-Wd)cx%_O
> zwwYa at m{I>W`)D|yBn2jXL;SHyGoO+%#$!Fu(omQ2 at _G-o_pH?hv7wysjow~8S+iA*
> zi1mEDtpAuQaioTS+){(o@$=Zyfk05#=YD1jKyAjK-%=OQtX8n~r&?{$yv=HZzCZNm
> zFdFx24rj_ncB;f`*QzSjTDvn(*9J3NZKlKN)FGwDduo4GUdq`2q;4f>5>=b8J94?U
> zvf$LwyfBeY8ctsFcv(`#M at DkEAY4_e%1fnXK at mvFyM;L>GP~i-Ev#kqBl_H6;4_;w
> z+M2i24VBBy(JRu)Ee)*=lnG1lijNq}%?7BGNG_V~n{CZ?Ui&JMr{<NY4F3<}8OUa6
> zm%$y0KGKljzIcx*t)IphJ7W{UcDCtt)|XyK29(>qfQU8CmYwwZ?4zB`tDNX8elw5<
> zmhGO46ar2l_H%l+2W&`obEK at xY%Adoercq at +u(&B_D4<)#=9?z^^_6Y5~TfJ?TKc$
> z_N#lHp$%HyPG{(uA!;5!N4z<Rz;(33zs*)&wu0E)ug29zB8FH0>CCA0&%IG9yM4fG
> zjE?-i_5Ju1WTH-}X}4{d_>=r4rz6Fpf6$1xr3AImterwvrRdA*wDBJO3HtQ`$;<4H
> z^)PZKCi4IE>-mo!%70ko-hatI%gR4(D1Ue4DQFE>WG6Y^VCDExtjCuZKhsy-p9c at -
> zK|*&`pB<03e}*=|;~gD}v*rk{ZmS7(?5r`%{M%etSbWO at t#+kb;+urMfd>5PpVU_q
> z?4a51Qg$MZJX2TRts+ab%5<mH)}r#xvm`{rtai$Q0`f$zp)`)jsL-rDm$C)n1gN!D
> zXXw<OyrU=&Jgs$1;TxOv)r?SE_yz1rM1uHWs4tIeJ&E%c|F)zn5-oG!>n&3=)H1V>
> zO&kt1f=||5`{eZ1;WR0K*lU&d=b>k`iszg|5`;PH;)yntlJ<`o>Zy at dOAa4u$vh_|
> z4!;0qR)IY;)ECsG2G~)jNGwzR3GoUY{EgMZhV)tT7>mQLG3JOZNQ8)0cH~sHX3+I#
> zwzgokIX&1|>)5b5)DhHn){qY^QKyY=G)w*4+~cfwON=67Q5Pm`Np!8Ygg&_vP96Ir
> za?7)F$xh?~cAA}B&@0lWw5ODa^4ttRpsnys`?xiwHrtoB&mO9(&2E<C)wS6-$Wg1!
> zzA0^=1B*&kn|-@==24(lIF~3dRs%5*@@>mltF;71KBMS;*{ei at JA{*OS at J`1xcTy&
> zXqsgUpgrBCV+Z3%?QU#x=x2nt_22F)g@$v(Rf#W2Ua+XuY1l;qD3laC_##K at Uy#Q+
> zQmu#z?+N<Ck)r;zA$cbFW)1NVo$Ta9dtv@#ry(WVGso#sDQ(G8x)b*tZ?Sv`68Qbr
> z^F*ol4MXH)-<L{k-SbY|^V0AWE#epCNH#Mh+AepphVFpV5%iw8hbxIYnq<`|+p3YQ
> z88v5W0 at qD}?^+)S8g)GmuXb`}QvXDW at Ed3Yd)RA?u~v~$YS=nAR8I0fyOD1s<1u!!
> zwwHUU5xMKeA~8K&#dW%ttcJG~g|FKBi*<3)fi)Q_ZocOPha36igoVqKG@*XB{z6;s
> zd~a|%wp(d=>-5oiztTr}o?Pbw4|t^PF-RJEVmJ88b$9!NYNhVhR{zx5{*co2bZxbu
> zbn}F>dz?JottV+~QxZ=-S}-;7l(RH>iWXISLY|_(d`h0Fay?IbD$R)mJFopp{ci1n
> z_0IN%?VGhNcRIB#_c-yXZqWaWG4cIC8#bj$iK|!+EpZv%cBS15Jil_-yK-3RmrEQG
> zS?P)Db6(z)s=)J_!<n~EjbJ?=ZjRyZXzq^Uu8X^4xQkxN){Je-i#E^Dd-<fuBZY$$
> z!$^@UxzB%B<%{mZfn8`~{SR##TKzMlv#`0#(#Iuij`WOJzXsJIe`tEV_P*Btea*F`
> z2#Yb!<r>r$k9Eg;_Riop;LZBZrv9U(cAkAEsjWNcj}q@|+0L9q`q%_yZvAJ<-x<*m
> ze;9NS+weEhcG at 0pQYr}!0=gU7Z5pT~XjzE<Ru+jQWCUPsd`zG26zjs+je%zIWq<gl
> zA${PL&<jf#YZ~kH8Yo9F7c8yH9n7(wE}?NlV1gG8{$$^m+|i6Al at Fc2Vt$Ugk!yYE
> z`g>esA?lsNsz0E<C5TyQb-w}suH2~#l&eEn5rFBM7228eDt$VKJ>IU at M>F<(h=naS
> z8)lsjT8_v--aLV%VRj;|c at e&r6XB3&o{jr9_><1xH0A1t_jRCcjz^x=u`Zy@#1AKh
> z8vM!62ZYn=bae@*Ut~%&&xBpVa&zJk2bEi&ZlwDZ at oTD$3|5acdL193ScvusK~;zF
> zn-5{F);~leHVKV5SdDD(4p~oh??Efa5Bh1-P}@{}EHs57>kV;Ne#gp_>#+ScrR@|t
> zh;J~9LP90O9SnneYuuMsKZ<WdOG7`|4QFUZ_cx$;CE9={Ya3Q3 at rUlB%vhmxx!}+~
> zZfr8Hh9=Ch`gx^FdOIDti`L4TC+)c=4P34G(KpP?ksv|04R$8(axci+{f$lf9M5KZ
> zf6zuA4s49!*M%RW1O>A8Mbh*hE59<Vx|2lCcxKwq2f%+gKi~x`nbi`Fgm$iO$w;kF
> z4Yfg9**MD4zBiei6YbG#QYI^pY*y6Vp%s;S>1dS#wan-rOREOF|K6^r|1^|mdfAMq
> zrj1Rve=XMwO?TT=DTT<*S;1&!q(pVB)i&K22;do?FE(!d$=JC4#X=Amg+Bm at 0gc((
> z<hI&6FG#=f_$%hvHb_kSVYFmg0)ZqP4r(nEcHJ$q;@FF3KC5|Br%SHRWSSsyb2m!O
> zv8|B3GPJa<hW*fiw;nckmITOYwRj=cOdjH|vV-myxdz^$toLJ~M at y8?k@}8HB1ix2
> z&k0EkSWrWD+1-tA6d<i~8u`|!%rvYv{GwFHw-UZ_tbr_yR!M({erW}T at 6=`)BO;Xy
> z&A=;p6}D}T$moFAztVkq-%+goR@!F!SK2R$8UB^t^ZhF|7dXm}2%|-$21e4y#Ycxn
> zvckVJ^SCcGkB@$vZ_z|9i>kt+oi8$qi6HYkywq>^%pnCj&`1+jFiDXs;XY<qlox0!
> zGBPA>_;)em4Epo`$J)2RMOmhO-*aFXV1Pjo at yKux@q~CtrzChdh*BO#Go#5BJY;U$
> z7O8Eu?`}K;k48pjWrN$AV%lKuw(ht~rfq8jnc|_ewr6uI3J(!J(*aOvoCfCmU-tuO
> z=DzRm`+i^jWS-;w+{f#_j{l4Awa_bob4}^i$%*}5Lu=_tJg+_heI|Trfx;+9732h2
> zPq2?ua{gP at VN)H@*5Tw2*Y1EPa+Bmad!#MQnF$>iACq8tb%Xo^P^B30Xv7&EhE@=F
> zf5a%?Df at UoV`dPtCb;)}V3c>|NYKY4qg4kY_cXfAWJBrsC_|mAQGdp0CSi`ArM&Gq
> z#h{hn(yr2nzZm>1u%lOM9))-*K9`k0E0bMsIl&p>o9F21f-*>kSwfi^7)<XxMG}S&
> zx`#f=OR at -T*r46h==mQ{VgA%|Ssh=6mH#Zhimd9_eDM{meceetX&W?pst?}S5t!wj
> zvuGmY`W$nPn9T8Utz&eJ6R+0EnR^sckn1g8ua7{zN0Q!{*UyalnS at P{uU=qbs%+>>
> zzFI?Z6iGt8H7xfJAsw^2zwwm}j5&BB=ZeXWd@)~KAytrk<oo010<q;k$zlZ-e6gCo
> zM48+%3c(+gvlluv7cvS216XErs<1}-0lr6R&_`*TqDlXdT>(luZ2y-1v~v%Br)K|4
> zwD-z{YZbSD)Bbo|jd|zU{m=7fD}T~wM)Xkw<i&<SZrv={J&Mai>WYdN1R1bL!f98W
> zZDWrEjYQ|mlhZ-ju&y~x>0R4wjV_|vhzN>2nyKBo>p4gN0d=<ccd7JUkE{qp;e9K8
> zL)Z&C16Iml%yg}2psaDakjnLcANuxi8S`GJ!*T4}@VN>u?JeU=tiHP_-<o8~{yn^B
> z9~ReW^EIWlH#=#!LRLg>SITJ?YHwC1D_MvE&k<8a9r`Ei+BWxWM88Ds-+=Ej(ePH}
> z-w`|RLlz2dAAVULiGA>E+5=AMK=IpXSLA+}S}BBffS*!*zjX)j?fO<V?T6mK!*-2%
> z+?_-{8 at SD3fqrpOlfky4VwG)e1#Ae}5BdwlRxuIyaod|`s{TO?<E?xHKj;uCQP~Wy
> zhE(sJxE8K##@`4p{)z&4r(5xaK}y6?wjAzH%`1aPJ}?vL9KR9xMV2i|C}6A at eDX1P
> z(^x>qi?LqT;w>GUfqw%2QQR%`mz4hj{yB)(!@o(OlZc7&7of+#!f`Hqy)8<LZKrk>
> z{4 at rFgKcr7`Sp35#5F9g;$fCrQP#6?K%8S5Xg47 at had*(^5<*ROx)U3$Fz1w-kNVB
> zjv34&Sw6G~FUc{4UgsTZ4q^FXDIL>O&ePtB)tcuum{l*CA7QjhG(f7L%pzyFj-Pya
> z|K4Q6IJ`#jdD=hixdqyvmk^WK^;!tx87$DU3l+#y6eRE8D*0DH(EcU7T0hJy1;Sh{
> zTf at RwJ~LK?i1$_$ev%-B#Vv*~Wm-5u1Vsan80DOIRA0T+d0K`=Ut_QtndVN$g4H`}
> zR>>ER>%|l?U$#iK;z)7E$HN5U=EaC2n7L4kw>82VF{<XI{V`n#EE%(8#1?4OqY&g(
> z)mP^_H}O)wdUehF2J;>0^*i9 at HYm?%PObU3DCXr?t;vIA at 7&?k6bKBul^*!A#Vtav
> zn0RxFIz|$h2$O;6o{Gf=1bwq_AJM6vk7-}Cm1)i3e{^C2 at jweL$OEjyni>y0L&PVD
> z1-4l2T~d at 8+32cs703kOd{SV=82~K?-#3GwU|-v!0WOK}X<q7UvdMObHcn#D{MlTq
> z&?CA%>DBdL{D>OxOrNeQyCrx#zFZ2+*&S at gM}<EYpteF at QhF-56^pB=N(-(#!S!4G
> z9qjVE9`9K^z^sYbvRX1#S+ at RN8SC;NhYb{Ol%}uQb4ebKF~XTxm}f~}BWN%>$ROO?
> zzf6pBMtcm at i=TZbX+als(68$~@U-6(2U*`-4lUVvvhbpAu%$y9#oW&gcw9}}ht^mS
> zksG*>AF#A8r`ooKV%@FJ%dJ}D+SPcAc{0st<Yt5I+(m04e`|#I^EjO-q12J&v30(j
> z_sECvoGb9?yk=QPa=jU6%Dv>@39Y%rJ#lp}8Nsz^cz!5ELp=lE3gpu)q*kHa88mji
> zwW}qbruzqEjmq$!cNJMRI&BZnGeqZ`^S69hH$q%?D3q=Pi3e0|P()SAuG{=k(AEu-
> zEKZGb6Ew)sB-8WO7 at c-yrf9Ke4noG|v~XKy at KWot3$TWd)7uknH47S6x+{-jfJWec
> z7NQ#LVZdRo@=jID;1S~%*Q}#PP^9yMj+MGXm75Uj3fzCq0Qv%zP<P~{&ShvCW7Q1R
> z7Ii<AgIUjph0=_K<|R4%3DiUPN4hg<v*yLWIUBZQyVf^`xk4!y=OWg#SYW^t){9!|
> zp{gUUM>piQppM|&Ymu+MmS%O%2d#REWkny{y<f~WwA%OYBs}ca*6fVm#J#ny(4r43
> zPSUkyO?Y`-w&Ckxh$Lah^x0`s at 0NjRIrZ*r!_;E3Ky`i|5VIl=IKW9Ezi#Uyv=JH;
> zW)bI`Eo?r17vOh6?S|bII9`b3h4{S_zjxx-hF=>)HgR~7+yOlc^h25uSCcuD-Qhaw
> zcjrxnA9*IT)g3dJvH5jCv1AKeCvat<u%O!XS{|M at 3JdgM)l2`WL*7U&c&{hhwEp8R
> zSku^@{njdD6HtaAC)EbXQt8l}#WfucXEf{<P2i<0<kQPa+2V!EwVK0P=}`ZBf=5 at p
> zoM~`wM#P&LffjVG<>!kRnk$U_9G;tkd8;Y7QP2&Ga$?T)_C_dvr6%f=;^u9N6Rpc7
> z2^O>x@*+u|>&|$v18x at 9wKRqLZ9-ClNk~f7p4AqrxvWlk%jif801!e|^EO=2Ngg=~
> zZ%&dLJj10H at yNPdYtB|CgqTd=hO{0Ns8- at u<|-1ACr#Q>)bn3o05e$+F9dh>S^HxK
> zuf0^)Le|J$JIJ50t3 at xwX519MFqR2NLu&RMhLu^B?;ul>g#x>gBiXSW=n~{>^wrCn
> z7n8&mtgeOTe6|4EjW8`dgON`@7`y{l?}Tnb3tk#1L5K&okTqQVQ{LupXy2P}eu3Gj
> z-DC>|=O3*gs`7<tWM{x#dV4<p*<jOb!Zjf~yHyYBTrKMI;GbJ>*<RH8YMWtW3ixrI
> zr>l9}G2r#V3xl+CTxZ>2Vyps~(U^_n5A13TJ$fZOs&!L9r1l_Vr${sXz%F{4q+8LD
> zJ)(6JsQI7O>r^k|Wk5R?0_P?~xkRWdRKw?61DLk(sM6=Lgb2)TEy at tU!)jr*Npg at 6
> zOQ!^+p98yI)=0J4i(1dTn3P at EdN!;4fD5bYe739gE0lT%j?aPOhvA79_1xctm=O4V
> zkiR<aw($CT0v4?86R>tor`~X3H(~Q#R{UMyx*30eQF}AEsExI^?0<F_`Dmx at A~e8J
> zT15NPDD=RGL>vHGc?W)hiOZH~V_7QRyOU%=_#VT{FLVH1>xp)1 at Fva;>9~IvV(3}u
> z2xLNtwzEk5OT)iuu#%07u^Vq4P{1 at E(0TN>A2>p=Wr_T+K!3HkBN^3oZ-KWtP=NJ*
> z(8{_v=lOSa{#96)tKdznLvD0S-N1zlnB~3jnq_nEWFdJIIacs|U<H4V>jJJP&z(Wn
> zIaY8Uu!6s?cO269w7z?KAM`w+4KdEC(1rmU*P=ntyB?Tj5ltbk1<u(GM}UupoFJ|N
> zKsIgQ^Fq_%p#0J{Wci@@GmO+<Jz76u3^QA%W(%bJWRb?N4p+kiB2hz75ADVj=PXF*
> z0Xpu>3)Zvo7|xovd1BB at W}CVE66Rq9dMO+|WJFIHY^?lUo}CUYr#S|XwLgELBW;O&
> zRcI)A0WD^11f7}s&K{$)$iB0BI!o(2%c8S!y=R(LbT+N;o}JEa?LE^Dqq&W>Y9R}H
> z-BC$6n}7Cu9$`@1+Sb-BHrO*Y2G=Cm%YTqVNoKUVXP1><k=tAKu=7RlndF*mXF&y)
> z`mbG6w&n4*cekCv`IoMn at b~k&E^sM2&uP~*^p(T&u^4KLWkz3!=cH>Ij)*Qi<vEHu
> zZGv~hd-#onuK-2>QH+Jf#fJugyPfMlFV)r`n!Qwrc=eUpOFhOq7d)~;>gr~fis98e
> zs;lh9g;>i(c`%Q#Vlxcgu;(JqP2F$9X-9lLZ%^T#nRJI@=IDM#VRzh;PFC0!oxKG6
> zVe$*%Lh`24J at M6!Y}|SMqdj-gJdhG;MEJfMqc5eBkk2I#J;s)_vl(rnFFRn{L!J&u
> z`95$lGjRMK?t)r(K%(!ClRPa)+Dy*O4o&lDRqGKvzwyjQL;}JJ*^r%${W?i3ty@$V
> z{&{5GU3C$khu4K!=T~Y!H|%<TS9s6BzMO^p$y{WDb~OTH**dXOEA6Na7n5CeVr5a!
> z<H-6<vqdEOf^UPqG$5mR&*c{>Coz7XlLR4d3p+bgFu!f7PWCqUn4E}5M9WYEYf`0F
> zm<aB^!8O8FA}&K4zTCA2T!k1|K^n8-VzKd}!;$JS*8B=9&rl$;$9{ZJ))$D{Ve6L8
> zUCnBs53PX|a-Jj?ZD#XK+S|M1u+rOlrtC}1ey~`-Ze~G?L73suK3s1Qz*#{5djG4d
> zl|P-Wy<nv;cy#ANE=<T9us;?1;h?55-opz$Vo>N}h6||+Pl-XuE0)DwY-HQ;x at iDr
> z)?lR%c0F33ST(*X6}eASTQnC;&QkGS(d629sq%6K+7NSDdr61&J#B+nlOneX+SfJ6
> z|8Yd|dMo?#%xYYCZtOy!Ei{GuLzTMz>mzVI5!cP|6*FCTJr>t3xE^`k_0VT?t53|`
> z8GNpYJ$`_EC$IwpJ6 at CF#;oY^(cBB1hi>6Kc9rvi+<n_GJ7|X`Y+2+XfUjPnKo}CU
> zlLehL&u$Isq^0%SwIyO4MR5hQh~IOJqEgOS+M?@Mwrh}I^i6fIe#~eO4eF}TJd;%2
> zB!7QW=SQ|jtcZp{^1eigwO6{LfPGUYnvmDF>&{Pbj at 8(mj^htIbUo4Sm87}Wk8H<W
> zCQ8 at sZ$b>F8`Q1)i6%pRVu!|EiQ{#FSF$1x?rq)%u5WKv;z2i#BIz$i{sdno_=Rsg
> z@*M at lUF+4H3NFY(@L%2L3Da8;&lXb;mQ9RQ=QX6&7EwbPzk{97f)4>sa{{E+xQeq!
> zL+bvEcDB<ob#EclccKeExvndcWyj4sep}S at sI}*&#ib0WeG)Xll${N=`HN)PXF-jI
> zAN))2?;fn$T?qXL&K2(OK at IaI5Aq=(BXHJ32lt3+sP`^^-o<t6lA32i?-uiB4(Tk!
> znaE_UzZ`<^=s{=nsNHAPjj$tsk1PWg?5*TE^@VF9{(kAYl(EQv!u5vhH=o7e=>1Ql
> zvVL)}zNX~g;aR^w_=am*&6mOVz*m(GqfCQmT$A#c9=o;wq-!$%evm!Ye<C~0|2}G0
> z at 0x~QeZ!s*8sZ;C=deqJ_(SQM at +ZhL#^#c&h~NJj^bvRnES#S`kfr<mgDV-+;m(6Z
> zK><abpB4N22YaG>uOL6IzvW0cv>!ma!*|9Xtk1gj;2S=m@?_od`;~bAk<%usF~;%0
> zY4Dr}-w4i-*x3-oIg)>>g7;70*Nflx=^50gp6Y}**Ww!wP at UR_;LctTC^h-odIpgG
> zL5-usTPLsoHhMFgw3gW;{JYM_w1I9}Gev|=nJ1P9Wgkk~vk~|le6$1_t?X_7T^Q3n
> zEe&m9)`eTxm+%xt8D~L1;SUxNvR*#87qWAT*uuDF$1 at zVMhff?$-w$ZhD;QevC=XU
> z*V3vQDZk3q+U=PR3rr|5TzdYi#&wHtS-_(Q9)2NX9`b%W4e!W|wC*@@Dbcl-<hF=9
> zgMF64P#0>SrPb{@Qk_(7lrLj{5dV at O*8au(7vo=8FYlg0l8h%g!1ko$%Cm)~$g;HD
> zG;1LeA>w?K^^Q1*AV}4rGqa4s)}>V;Rr)<Z{A;~)53to+7w<`+J&g7q%vj_Ag!~Yv
> z>i)He#|T!DXBCT+P1IL&Ls=Ahco%rJxIL3__dYdm-doMc5TA&g8Mlk)ih|AKX$|{t
> zKZ3b at _@2OyqF_@#bgUL_8T2C_qSC=buD;BY!N8do;NQSIRZrgu)b1;VN6n{N<kH+-
> zASJ(kcy}&~VGAH5-Gtv?;CHGvhK)j;&M^F@;deN$--+v4WC3P5&D#)t8$$I2l at AZF
> zUaGi+Y$t(V(_F|i$3f18?>2Hn_$|+Cor7LNv^v&u#P8?gua5rG%H!n>TBsA4bgoG+
> ztg(dEoD>Z;&!XKekWRwku^e&|eh=o5#X1H#mE_gHijMW2PhOOe!F*kNrG7i&uV=UG
> zC>OZoX)?9zih|E90qsFlb>KYDSlr_Iv0dL0QV;a*9|tv!T=)jq)d;R-^fisZd>Ko)
> z-u_ at y0+(s_d14Poyjjw2=m at 1e;q_06*ipJ;1LrBrO4B9S+bD0%dGL+rv(bLgK}gid
> zZ#@k1gafStuLs*m0hfgzK{mnLrJUUlgOa7yt~ojgvv@*-o+CC+ at R*Se!iX!G4H5iG
> zCU7C+Efah1Ppn-7$v(*w=Zzq(8(UJ;H6A@~ne0(fBqwte$tfNcMRJNa9aQ8VJOi9f
> z%cS0`lSqzf(v$Qe1IbB)+2(r-+_K(#!qY`{IjSQ`h2E%wk8)AhlWG0Zdvd^%v9fg$
> zms-OmZAN_SB4lZs1}=j&#c-+i*`n^1KZ-510&s-#F!MvH99ikP3A{@!&3I=%a)pEx
> zKw<*DL_`Hfdgn2{V8ckygPu&cML8Z$^P at FH(7Zil5o4h}(Q-u1DyR7r#$6X;FV=-N
> z4Jc-iXHc3wQy1}m2%geahsz;N#zk6DS8eJ6>K^X&fLp7=2$Yg0!(pM^F~AW0^8xrJ
> zz^iPol>3&L_09n)>*+OV*{-jL6|g9l6|rVyc3SIQkWX(%Y{AW}6#j*)G<ryBcV#<U
> z7X#Te7_5afb`Onb>z$J2fCQb$vI83rJexIi&1n2f$N5tHTVi)>)A&=+g|rq+Ig;mq
> z<6s3)h!){|A*8t#{>94LgHIjYaPaAa)d!!M`&X8k{a~ve<G{yB9f9 at tV*hLTAf~8m
> zTrA#OhIkSn$I#r8FVX08w9&~Nd2|Xto&x0hu5lrFwuHu!Uz-G<@V9B~`Pl at Dy2V*0
> zKg*O4;~2VL;D=0<c{WPKRUiX6Gz-w;1xNSBOLW)egD$hR$ivdFC;81adJ-my)}@=6
> zb-tMeAF<jt8LJ&F;)NfGQzp!d>}}n{UVPj8or;<9^7bYJd0vP6u!0*1!>P(spH at 2&
> z?q3#V6=Lno%+in$&_Yg1EV}%!RzHIzaY8Inmiq at OsS-4%${exWyBM~X!K6{u4GvUb
> zq(SQ_k0S7k6nJSzD2t)JwvhfnhqxlN<zInU-3F9*kjm54y4NdXYbQGsoAfw4CF^Xl
> zVw~GxOVNJnZrrQ$jh5(oySt+IsZhxTy)6?ah)fylAF9@)Q{z7DT^x8dpc6g&awsc%
> z?HXqZJjc}%LD}1Z)sdJ$B_dB-5&s at 9Npndp2^`6|`Vw~|N~wgDR;KMbIS5#tJSS`O
> zyQ0u!@@}=W3}DYF at RswBk_7KFME7_bPAOwak_s4lduqOz=$5iaBqktJ)C+!ISJcF<
> zjCIelrD#rx<$h>7gXlkLv@*xtgm13T8vf2h#6P|BkY^5QE_$=Urg7aqVK&Wx6(Ntl
> zToio!3Hes<pH75xY%^qTsp6SaC~t}~(rz>x{5oYd>f?bW;O)Y)=%8)Qvn=?*N#H#w
> ztC8Cdb{%~ESs*feCxt4jm1XcSSTDE1ir$HRJk~h^v?N*@i)=g{$};?Imy+?flMsQS
> zSpa$g{0}fgz3(DA;36#4mPP}7xpmNJUzAf|)x2~p`DhYc5wM%ysE+;--e`ZUSEQOK
> z?XVg_+vWW$`eK6erY#2^(u+}d2RtXB0U)YP9y8j@$X<<pN4 at 7^E+bL`Yr_otORUBN
> zds5f91o*DQn{`~8qIigNVdL&npM%$?1seAI=?wL~MEcvwMt>6O*$(|eE%0m-rbH+y
> z{v^B&o3B4vnIn~AM8rTr_7mNwsRj;<0<?4SK54vnvACTiYt1RYAeADD_d|>>P&~vE
> z+Z1FB3--WzD`hBex(|65*G^WJZPq&({3R!Y1{Nr*sV}Lo1BbxFMWMesl}GWnqc&gk
> zY at Y3$wL9NC2Q+ySeV=+qeG4_oU1!1C-P1ixSi8w+TP_-_pecnfLDwG-HW{8tvTq5$
> zj4|OWSh7^L>>IWFaZ&Sn*`C#V*1WzN(uqd&Fs8kT(T%G8n{zufvN|cbn6YH9h&r_(
> z(mNDqX<l$cG#*MejZy!o%uz=L;{i$lO$}gT#T=T)G>f~N(Bd&F9Uz3;!dft%55lW-
> zjP2Fvpv3B1o0rr+jHrKYRrm(Y<^yN77s3`_TrX55Z_r-QJ%0ufS1r#b?Q7lraP=wV
> zv%P?sl}kuJM5!>^{}%LH#A+jN>nx1Nu%>uIk_qoZk4>@0irS-L*(17#RU4}`{F$+`
> zf#1JK{qbV`mV@=lM|ECBHf|0p$UG7}TiO;<z?#@Tt*qO8+rDJ%g-fcAAeS)7aEQ%-
> z6z+m|0I*K|g7yV5Me-<xv+rfdQ3H-U7Mwwh)}pyj*j%L*G_Z}q1Hu|D0lyc2Rg_;s
> z at o~$rkcy9qAs*v4hY(j41(|xN(=1;R1+mmRuZq3=+}X-Ibu4%x;t*wZOhGO at JR?lf
> z4;761p<<zZmH9gXx#E$z7Q8vUd_Wwvwcx#5ff^Ley%xeymr!`+-zOlYMgwFXjvmwj
> zsTbacnCG1vM?yQ646mtAfVEmy{KE#(I%u6nXn&hytrkF)zMi?66B;l2|F-_4zAM-M
> ze#|<7q<V{HN$=Bi?^C86z}#)ee7zNZ%Q46RIN5u%_dV~oQkoC4iQADq_a4iZ6G)$z
> zY|X4vd&iHbv-#7bV686C&RDVxPc|5HnZ_zq8`=EwPyR3%coD!BuqPP13M_bff*2$J
> z at +aj@x<PrP<-2}fA1T>;v+}6-TmN{%fw@|vCtW`;!Ji>d{mC=V8$2^XPW{O<hi~vq
> zru>uEKe_J)&rGDXk5OueFX|+BZpS*{vCIG-%ZBG!z})WWwJm%;9cGxlmDy4EOqs4*
> zXesJ?=8qYM5?2#qMT@$sFOzosp0zj{<<Zw0p4aR%kfgmN*+0vhnH{xw82Q3ikIq<B
> z;@bP{`|;T$77v3B4E|X*OK|@s<ViDs!JofHeSXOT_g!=p*wp*=OYS22zIvuLO=llN
> z<3LyNja#Tb&3VYWI16VBpr_ju5WYt?O^47HR#3`3S-+ZK?%I>}P)&$zEGX5mtY1yM
> zt?Qkvhqk~wgvTMFZ67oBxFU6W^v9OHho`g8nImVq?sJQ1u&?rjpmkG#azCPEH(HKd
> zL1=kAt`CIgIkl`(#LB;CE#%6sYWTd>C!z-usr|^`hIa7h2ibqg;vq}W^S=^9QC1s0
> z|1|c9cJx^L`s}D>z*_LzyqU;`0uO)8$|8<7c~mSEM^i82={A1lSOyR*KN!r9k5g~@
> zibR(iXp-hz__Y)MS?(p&H`M#+&6QLOjt=X9Zt4>CoO|xIy}8#(*LV;1_9wkZecGJI
> zOMD--vGJo13M?AnJ7-6gZbE%(`L&Z7zbSD&|L(~|es(H*MCm3PUm9I;1LE21+!Ii@
> z<eI(w{)b|r`ysS;AJuNzzub?Cg{a-|-ue_wXN#}aZbi*rjD=<Izv!x1NN>@oH0RNq
> z;wZ7Ow|*ae3mzk&ky4=#wsTEn0{_;#kWe%q4CBX#6mYK1cNbXFlP_uz4|^MYzU<0q
> z-w0eux~OTs4U)KqxZYL`fBrq3vnI7ohx^|hrM at d^eOc-?NneSq!s%(fC4d5>1jb7^
> z!v8j*R;<~MJqy_yO0q=H)<SV6aIFgbOj!;tHeM|1Jxa5sNJHqDbGK8)A|Mre5Ic=r
> za3wAYJ6w+yz8k?F%JE~#eh_7~psd2aH^g{b3ikHpWUCcDwX>_WMO`&*)lFHEHJ{xA
> zzL)rp0v7lO>FbIve_HIpETlEsoQE^wN;KIIF4@}du*H^tfVG)Y-ip|34 at UVxNcFKA
> zJ^qE-VAr?B{$3OdZIgeuMRHum>WvD5M=G`2ObnEheQu~m)|?AhxMm&_8AZ`$M<phB
> z%iQ7Kr+|*W5x!UP?%Sp_4|C5_uDGjkKET`KE>y1IC<@jpyLUglLDwpE`xkpFvr@)y
> zQcmy7X?NI1GjsNc<x at K=+$NhP5O2#2q}c>9bMFiwQH05nSW~HVM@)zBwiS0C;CH5D
> z{ndG5+@|ai#btiMd#}gfXYSeA8O5b?NbgaZ>T|(z!2_T0F7_LhRK)XHBv1Ae_gIwq
> zTOO at G6vrG9*bRR~?}D=j{#`c8-2quS()R+6Ud<X_^BJuFk<QtaL)rT-I9`ie3p-O(
> z_K0QsP%8oTb=nY1Q()6D;3lNV5$OM0a3|B2=@>wFaCNZ=-w&39dZ_$A<6mJq<cld0
> zF>*rl%<QP;EBlU0HmOIwbs3_}@AG+s<W!S2ujaGt?2>B#EMb5#(m5+3M$~Ma1ti00
> zb4=w|_6fc&niHbOH_10y83}w*)z{=XKZ7hDg+9PMlUgu-zbSdu2aNraSM)k&N1MZV
> zEvG>82=j-@(Xh}0PXzUzPFGOU2+sKigAedh_<RHhh3o;rKcHVqkmC}qp|${5W-Xm9
> zUrA at Qa!Yn8Bb9p^V)3PWR3Bh=6aP-Q3_ehKRGEVo&BhpMk<l47rstZz#Tua6>cKP)
> zJ4!L|9$D*cDzsQ)vxbgGWVmK6v`q&5QYI^-l#(4^0-ad!4S7VR_*UtG#XWanq+)Sw
> zKd{7Z(Za(>3#3S01pGwJI-``_`}}W#VFRBB{_eefyA#n)F$Wa$e*Y}-OWHv&#~_{2
> zs=bz~(H^&~%Ws>mTYSwE0g2Wf#uhUQyXobVkJ)0Mc*~|Me_PBISE{ojVm_z`@<<Tp
> zd at XkjIZO}Ed?Mmm8M{g4lWE?;`>Gv2W|JBQ!$0oq>39YC+wreLnQvRezG<(-u_TUi
> zJBV`damxeOd><r@|Ar^wAgsa|_Y8{rLe5L@>&UPe2Pqm_VsD)rv8hi&!c<bTe&Ia&
> zMVMsBigq3+o4E66Rs>e+NZ7s;j_RFx(CSRYI2xdfG5VG^XniZZU!b4N;9V8yb at Yu|
> z-#v>EcMGn+gL_a^GyyfF5fT%SQ=e(qG{vASXl6ZO{O&SvxOzg;(}LUZr<2SJDN%ux
> ziShA8bZF3b!F_WB4rhV)EY at LmL&{19e6!U+uSg?25<IWdUV#lt0&RJjXQeL(tx5F$
> zDUbcmxPSYJn}06D$`iczG(@2VddQ}V_nyjNLnunsE3c9sp)!b>PVLOZEPfd=>BCT?
> zD-DAy*B?mCGy9AOw%d*3oEuBW?V8<FsK&u~#Jd|2836g4>gfFfnJGk!XJXLP6RE5Y
> zIMAO$!)RWzp2s(lc1wU%Jw|O+hX!#vleJfX961Q{Ar9XQyS61Hi=%XCUa#Z_9E5pO
> z6nvu)^9i_pkas;;7Z#OY#rZ`@&&l8jFH)qBw#EBblo*0~ve-bNin6rQ%;HfP34QU;
> zpp&<W9?DB%Lx_oZW?v4UDfHw;X{lh=hdCu7SFb%3i+ZPcMMc4^2s>${7GW)hc%P=e
> zr0AtLo(mkKEGs>WU|T!}JfOt90c#^LhcRwVhLco};OoZ&$9zs at 67_MR3AnLoWaXzj
> zuYE{=-<uFPmN($Bh=yz`|7grfv-b--I8C}2tO^`cB~9ga^JKIx8fBIBmK7dE?0rwv
> z{_XTNM2hv5>f-OyoTYIvVDts5FX0qPqigH08L{Zz5j!@wfDPew)*gA!2h<>}$izZ}
> zT0Y(d>IhoSI3mp5yyj~I#|mTM${2O%CSL2blOw5~l=s#v0#)e@^}LvixV}_z4b>d^
> z%$^s|H0r9g%`?EcQpVg*$)+d*uUtabT4`L~T4 at b(FC4>~6_IQ66-mHsodjA5#Hz9|
> z`5$TqGY0f-bH4WCX~Gr<Zuo{(yaW^S&te^-Pe-AZ>EcZ9Gl64Rrx(dnmE>;J@)C3x
> zH)EEdmx(*jUc$AD&IcQ&L0hS9816mx{4mcD_}W>dB4xT~U_Fy^_6X9bJ-Pnr at Il5~
> zd-CaxJq6S|)gcOSR$-@^tIpJ()4ZnUvWSLgsxS2#d>9g at 0O1W30AHlq^^nzFAgZVX
> zRe|R3f6L_Sp)Y3qrt{FkT2UixlERLJEqa8(J9L-!h#sD4homz!hY2wc`Fxp<bTF{6
> z)ThYfvC{kK3a3zVvNO*)6>C4L$wV{3zkukAF5W{?CoE;09OsDz9t5IVpzC01QMHpd
> z7dU5up0&d^`r_`%w0h|sP}0>(s(%u1&o34sHj;a0A#WE(%Dfh_hDXAHF~)m9ed^u2
> zfQf(zP3Zxi7kPkbja0hlsNPJ^Uy5kp(HK3kWMiRdkgJg(dp5X=j*h?@_a7Y^u;>NM
> z$<>&1ttVsi2B4pj?+asUo*W4uWEFWQyIFv5J~U#`tavH+3hh(NALIPt6P!QXR*(r!
> zrfWUyI<Q7nnPY!9mh^M%>0T}|fpdwOQYCST;mBVT(2E}05%rAifL=xA3Jv{SVU)X&
> zbA`y at iajWtALl7o6yP$Fjt8Z_ZOhkwdQ|VubvI&$u5jn>MLq}Pv!LS^<mIl#UOKA(
> z3$L_8UgdnJvHuGL+>jf=clPp{biDV_be+eda3nBAfluwHPW{or``+<HdOsm<6YT}B
> z>4w*4AZ at Qstdj?EJ~O<J&*aw<_63pY_UiL#{P}p&@P<B4d>%Mcdcz9NG at W1Ft!iuC
> z8<gdW0_<2LdBPKAq5cm38vLBgqmzJ?uPDf!9z`e%SY?+pz<X>=hA&Zc<@$cUB?@cE
> z4q8fRz=#yqgyKyje8ocK5FCYqmxEnTdpS_||G<kc@$TPW0#3ZtTL~^4Xv=CV(I;u>
> zk$9UBxUIcn?+iCA(V;WZPH@<6llNYQw1>H#q2SogaemGW9bOdialCyQ%1Ermc4e`$
> znrk7ez{!oIJ6DuI71q<e%JHn_<2ONO9tz&@G5AkCVY8HP6IT{>t%K}ISI|==Z&!+9
> z6Hqj{TsNj5^TY|D8&w5h>&q~#&}Bb(j|J;^9Pm|dM}!Q?)Jx#IvY2?Y70hq5>5TEV
> zSmRc2CXg^X?Z$!g at Y{j?31}Fo%PzSP^(w$v?DX&}!KL!8e()d_o$}2#T|~GoHlms&
> zb{vnv@#}Pq6`gBa9x>V$Er$4Q#@O=U#@qyC2y?>Ij$v12iO0Gm#Gc3lZ8}r2E!Gs*
> z_m(?XVq4l at s$vtXAKj?g^PxSu#V;YsT}0L?rGa?k6*|P>r~hBeQ`d~)ehXPMocetw
> z9S#qdro5j3&l#f$$*FfdNoq1Iy+)qmvljByVt(fZ8etk~8fA|KvVYx4MAg%HUpv;=
> zHTYQfSg#xF-RRSaG}gXLf!*qRG~RrE%<zU~t--iI=E1lx*@|)h0OQ_ at XxT1lta=6G
> zJ`*zOlh=&<NR0dYz`G^sp$@ZWq#_{>6gw5?!D}IFq at tv^NeiOv#3;w{8OgZ at AN)U2
> zANWh~F{ZUQABY?Vk|tD&ca<|g`lmk5+y_Z5<VjnsZYuVRfA#U{&;xMEE at Ubwoi^u#
> z?nCXB2Q|%i6OLJWO4j7@&P%#x0Xa#I1JT$8Sv}#E3$+hbrBrD?4KziloHXPOqrpHn
> z>fjD}5S~rim$+YdK>L>F?<{MM(~`a99{BJ)vz=ooVc&mtQKwEUr9B at S?_~9x at AQ2$
> zz5koPb{_u#@xG#^*)G<>s%3fQwb}_)+A7b#10VGA at bt}|d*Ra-Mm0n&!uS<fK!7xB
> z{~zjdcYj at u_1EPUXp5!o^MwVQ_HBMa68BZUHu$w6uMKr>TCWk$&z~roZJU_MTI$pa
> zs}i&yK%SN(D+KY~$iYnWMq%#20^RUfrkVZA;1&5|B#z!VoSPsSa}$mS24X$UUJ?9Z
> zM`g9+#l6*MUaPD at grFrP*QiGn`o<mWHB!sjiVOdQ-o)bCAO%}(7xcD=%iA}7C5g_u
> zS7(WbwtVb7ZO=@M7ACzNCM?}zsdj9>P_wt at Zu>0rCD8?s>GlOlEYZ2?yzPR{mQ>y{
> zGaW8|&=9Y;xQ?Bxyl|T!6bSVzgpMX{n?;z|G+^I~xoIrUULFkJdPT at I3H6miUc7E!
> zr5qy&!|>$!b3K>$t!N9EJLvq4^TMQ;bi&Qmx_v8z{48Tlk}xSQYh$kS-;ELWQP2c7
> zh&!DfupFF`=1H}(R(xgQES7jk_d)~m*v=9)cMf1ds*!D0dGJmx3ySZ`Z;-y{KiOKL
> zm&xUN8DsU*meLD;%<0naU=!W@<i12lvY%0|QSOtB7(7Uf<My7Am^Fn#auUb&+zFlV
> zIBP6pR`W1;?ZBRQNn$gR7wT at KsaO)Mu|_6jZVnS-q!l<eR_EH&V}1~kb8~A$&(>Uv
> z*(fcoPHLTaLAP<D-2Df8%_?hg9J at JI&*)dkZDLhVR_(1`YF<ztRFROXi|y8!Hhkxw
> z;^_Jktbtbut8JzSU;H4V*!I0>D#UT|;qYSds4Y!2i+>iwTx~9)dRNactT#!(D;G`G
> z`l=MOxjeu!%e&ctV7D(6S0j7iwNl>gyQ2!ey4Gwx11{<SF^XU9VUvPEW-br*ml4fN
> z2!8rciHR1g*{Zg^8$C0PAyP|7W9&r}*|n_&u(%}UP1>{ub1K371MaKOehWXNxzA|O
> zf?V6b5cwg7jkZ_m>g>BUuZpkLC)!d)v&-XJMfElh2nJjYR8wAa{G#SPIPa+pq8|9g
> zIcgh3{csli^gL|$6*j$SW+ at KlDyu$(af(HIQydx=Ti#uLz6v}T+MXiz;Jk;Q_24Xs
> zvmk#qIJ>m`+_wVo4`w)$#dGcosdQhW*l@|=>v88{PUO~?gBE-uF~KrynstiA+<8{B
> z$lMiGDb|?Y7G82?x*py*2y-R at 66;qzgcdW{HOaLGe$8LvcnGdG at T)^zQ(TYW>fdm6
> z7_QdwtHWJWU611Gi?})hS1WrWu|FDdmWZ<p{22 at PgA3m{6jzgQ^-D;^i1OzCaENa&
> zZ@~2wT>l$?Iu&=Qj40fx!<~`1^CG{KhC9*jLR_!J^-<DNQQN8URR!KdzLA`Z4l!AJ
> zpuXgi#<v-C+tBF{mrmC}f8}v&y-&GJ-cZ+IycOv#kfOnH1bd39G|2*K)`07YVy at fh
> zZnVN~XPpRJkvT+<+@@Ly`Bv at e=F9GaPQ)Ae76jG at W_DEUJq&-#MiKZOomxlArAm}G
> z5gN$b2rac|-1%cbDLb`wYFjFB-%hn9VkAa`L)E*b=^DYpQbj%Ths3#xuqp>i!j_&b
> zi&`vg;jM*j26utgT*a(0ux;ham$82I(BMT&h=tqcuuk60tdk|<N4n}As8=n|0Qv*g
> z_q0wO at 11GT1cggW!R22H90}<6m0xm*%cuwTYNu-ji)%B!YI6Mne<P)pV!>W`l=Xa7
> zpW~J!9Cd#vncyqB4o4 at zeM4hfZL--!^Pip)MXA)73^BJX7!;CBrmC6MtKuw3_hGek
> zZPd>m5NwD4&vJ1G=!g)d74nRc)w2 at vkb5-Ua%JPv>QsA9 at FJ*H2zsmmc`*{qMiKt^
> z)KlFxfpzXYtgT}k8&rIz4a3}8!MsJlJ%bv1AGXSBNq|*{(3_sBf>l!}wBR@?>@m02
> znv}rYhvA9#7q<a9J`g(}SVx|uyK at WUYmo(c{e8Rh3Wx6dt<Ah~-R}It*u&r3%$2Km
> z7ZeUz7_^z!-LiW|;Xw0O at Q^FtU068Sy~t*+s@^@bFvfSQ&HU7#;>^rgIPf4a5S|%~
> zW6Bp}`K}iJg{kmAdq|qKF;^(966z*eZ5x>KzK}OaU$-VWp>DNMS}iDF at 114M+YoLQ
> zHnO at kLf#Adx`&(ZsavgH-xzMn4+gFCHiU0ndaPNzSEa<pRSRQS=mJ5E#@;}`rpP2w
> zQ!~iADqL$Vd0uNRKdi0#D0lKOCaiuvLRhvXBKQws_4x=q85R7;f-*6(W>C#1)_L^g
> zHf_~EgI@)o2;TdLn}WA3C>6tSKfLCyni^|~Q)_+bB`u!BQ at NA2=ogs92<KhG<6E`C
> zJ;8UZ<?FT8xmD-!8!oJ_j}Qh_MfCh$Sa3QbIHzh?W#!wERW4!mY<#~U!dh}T{2#{p
> zl;A(A{wn0hlvJ$~N}D1C+t!HSBf<cwyejp;v-WhsDWz{rsxP%pSg)<hABNnKN3VQa
> zioLE>Y;2t7u+%e0?!q#bQ-uhqePL}O;^^A2YR&GjBLf!vO%%=^zd#va(vdgt_Np-0
> z2g7V}V!F??;rLUxOD&F-LhLxr;>)5?H3pcQVVDCGY;OcT^5vDWEN5W~N*&V}LhsYN
> zpp&DO&$~0-Sk+2leIe+IsC)z8q?ol~kmgqi=F+gu|HP_97 at -h`Uyb*D!E6Z=G%aCD
> zuJbQ~#uKLe5jk6}f~J=4Yn2ZW;f@?);54kV4u2mL4eq=vjnGr&NVBdSv at K_;lF_wh
> zqsAIrVcfM>0Pf$Or^J<}l=9&7v-WJL&)@TOQwL-L8^s)SR)}A@;alRjU91!jDTVej
> zPl)|tHUyc<1~t!w7w9avsX4Dh>mES19#<x)Rw=mkiEfj>v{NU{t7cawBNxv=w}~R1
> zD}($UTkkuNPI})dBM#qfl3U$+E5jbH at AWhA2TsARWP_zB7(4)t%xv;{;_=LxVvE~!
> zvEovtV}|x2F;Bl8{3q21@&nZezh?aEqyl$bbKdjs+9rs1BU5pRo+W6?gD4++>z+aO
> z1cT4}p4(JkBCg!4_k97YxB7j^xSW>x11AESF2lYr$=ciHKrK9=<MXIrFkYXd4pA2?
> zFG-izp$<0vU&J)jV-)H^-;bj2<97gl_4tj)ZwN9h4x#$Efn<H7+MpkD+)<qx)W_g+
> zqCN)RA6M&hGNA1;?)$PUtjodcM3D&xz at Ni|P%={Q2;`?T!;yl~f~}9vIyK62w-I9q
> zPx|^C^oX%J5B)J3H9$Y`{?O_B`vaKd7}LEQoAdnX*nK2_skq)ZU$VS35u6*mjQe}$
> zc%Z1mfgULIGxcjUhsn~?f$U0dE&m2GW8LT*e#_ns;!?NPy&h$!;2C_szvLeSM=4 at n
> zJVSFvY{blST&lQS+1sl$y40%}U4JRfFU+(|Q10%DJyI!+9yn5cH8 at hcRqw~{!>?2?
> zO<<t at R-+&GVSSa(6}oY00%Ep~`=NErQRftV+P-p|;EPd8v#NO}W<?HU#VDHBe4b+*
> z-3c_Z_#GyjXzt>=jpmnoSnqWU)eYzHW$ZS%Q{A&sg5J9wI(L+dYailT0rt31HbETE
> zz!S4Xae|N}7=<LAzUNt-WfW$zOWqb+Oof2B^t<*I2Hxpk0k2~PTrc~j_RC>6mi?lx
> zk^RDWw$i;)a;L62MIQK{B*69CvTj}QegR{DQ=i1_y8f%9Z}3&iH4^8~zxvnz^{dN!
> zzgqv(uU at W{YO_k5$M;trsCdiqcku*CuE*_Qkp5%+v*qtq=^WW)3X7`_h4r^5iMKqg
> zU#jF1E|+h43$K2Qr0qCF1JgGL*c{rwi*fUTEjde@@V|Y1T~Ph{3MK=YxVTEv9Eu>>
> zxW9F39Vq)I$=F=3r5e~1ZXq2~x2kp4UUDRZr~JstT8-kFw%es7C8#{@nMpRcf1B*-
> zDG~OvXaiZ)W|tukI`cAlZ133+`<B!M(hYO1G83~sW>q)8Ho_Bu>n%+{8Y&82dY*e6
> zwt$!8-f)mAaP?vlx3UQh2wo`nkRN4Jq%Ahs(VEhRSnkf|1_N~2&3Llwu_$FHp80p{
> z0C-=mhxgU$;vb&%d6Sh1&C#jMkN;~~Dm#t;>G=Bp_b_N)M?#+%W#5v5Y-17O+-mka
> z%sQ)*ihg)>TOsfefplmXue^$S5ZZ6)LS`^}hW6X+;$dyu2755!J5>=PK-PHYQL^&+
> z(`6fwKvHQZg6=0wo(C+KR6lHWWZRQx**B%c^Hz5$sq)Pn!6ygxxE1x74sCqA2WT^-
> zLxjKRB!1Tm+~y1NIDY&Uo;-*1GhEY?>;%8=T?_qbyRupyiV~1V6BZslzA at 0gDcNY#
> z1%H4II~?b#g`o>O at n}VoLu_k;?*e<TOJZvNcKB)%zHAz4vPn`R+6~`dCggyklP6*=
> zAyfHT_K5r3 at J@y|@lX9Oo98v(#l0!fgD6uX4|s~hg!OJ at AeDQno`J9G&n<X4;!Id;
> z#{xYHUVCC9`F+CcGkE1+{XV_5-1B!Al_&~`2?&D*Od~c at o;1yU_?Ad_EN0D1uv$b0
> zu-AYSNk;Dj?X52d7kJgH*Qa~$&x)Pg0UtRa_9ONkIl5pYI7|9vLPrRG(^qD|h-dJg
> z*Mkx>f0~~dZ*(GiXTn&ZzLCx7rtzeggB|-jFC=Ngxru*XwdufHmQbJJTNV!)Pd6N)
> zIrvMq7+s<VekZy_vMZW(I%vq1Iq;1ooGeRGu%ofB9=-jTMqfIbjK3F;Cc at KJ_5S@?
> zkJe5G63%xtI`D~wrz_V~zX!W2m5*^z`wK|h9!Y at gGammYwobs@ydQpm#<qyo at okB%
> z=@&+{j=M0FTT8p-L3VRYeCwpPFuOTA3KC0<s~A0!4y2CuV1tx at c3zu7Ht=g>W$i@=
> z`ZR at SKEpS74;IiBlpc1ml3!ney&JQvmp>Q_e0e=E at SgQD+Y9V-k`9S$P)-*G+lpb=
> zJ`UX`8wD(iTaaM|UhrAytHIEIb3JF<Qp%@7Ee3UJKRNiLNVXF`*1JcM<$0`sjdC2g
> z-JMv|yJ2OihgZ^m=qI<@CX>a5osegK6i%AcQN~3&aJP)8P at 5IL1pDb}aa7;4;#0Oe
> z*a<|@T=Y#9XOeFLvboNYr(>;!`&KDq$uk5s{S6R8iki6nyX`r#1vq-YrU)n1C%?_a
> z{-!-^+o_h_S2C3=jsbpvQCug!hA%Yw2g{?xr*QNSe}a<g&L=-C at iz1a{G+9D-aCXG
> zP~63Gj@>wRs4^0E{9BZJlsDm-phd30$i|yg>fx5ql5wDD(?MlMH;z$hn>^fZv_^6&
> zljs|SCt%0ur8R@>Y|Ie!YQoiZ2g at q_=ke57qS|=wJGVr*rfm$f=sa-Z&PxVFf2M$T
> zD8~%-!onn=ASbigG`dAB?zGtAfqfc2!@;02uoL=#JdEpD8rQEMXc|moCK`~P_j`=f
> zeadl)7l8HHKsL%&9poPFhrbJ$Sbp+kT}I=C-Y!>r+mnFYk*RWFQ at rmtYAwG$-K6*Z
> z4rT8p4}C$Ug!sPNKGYcRk4 at pe8hXzacx)JJJk9e?>YcZNZbV at 8R{5sl?dN;@tPNL6
> z)Lx^OLyiHr`*kJqtQxIRyazw=Ar|)Q-}Ze0e!=*{EhC6BAJy57QiLxG_wOg45_Rp#
> z2VrYB)4fAz71hgKLH+r4F*IL)M*ojS|Bu?J2gNq2Gb-q6p65yQg%AY<g~!-{KGxD(
> zy=_L$__;b{Zd6A{Eo~x7+kny8iP72VNAAkNNE#8+fbssvYSP6ZLOsNjPDqr#SUVe=
> zWoOn~?8Y&~1(f*0sSQ4pGrBd&yVm=mFGm at R>s5SrHo=FXQdw3R#JvwO`}EKkkr&BG
> zIb9iv8UM(Q{X&}OQO#R5-VfasoZd4zSsCdGL61<0c4Zlrml3}z>ZqBnHRzqu-nEFK
> zL%Zos%pTrq*+}1XMk}vE=VJs_yLNA#O1<WpOq2k#=(|(EV#FxUAr3`4gXdv8TNTwb
> zGCMmlVXwihMY%1Qg+K%A+TLrmM4XH-T{(wdCq%E%lia`J>xbm9BSw^s8Y!zWCvN6@
> z+^cvZ_DGBys8jz4?;9D6R65adb(JD}wil~5U71rE^siFjPXtbY?n`nDM(9=Ox5rSF
> zg#U3^r}<q at p9L#Gpy1QYJ~NQEP4DmXIn-O21uKkj?{XnC<bcmuPQFs0R{IgvLo_SL
> zCpE<r#k2yAVY)$i+RjGnd=XL$Y~EeUY2Ux_+le~CmV`02b3Tl&mm&7XIBjY at bc%>L
> zF^eG$A*xS_Z16r!kt8&BeBP6vfJKooe=maDNJ!Sxou+}xE8b|nhT&lX8iBm1=<PVz
> zXMKLYv)LwVeV|(wf1)>99!@n(kFy&`4<`D3a-hUBwSp?v_fc1OgLiSa&IcS<^fSgm
> zvS41<p?`MJejiAtzCax1#tug#^mW0t$Ty^S=hF<g=@845k88j1EbMC^R+;(#ZwtTv
> z<9}$OmACLFJ_f)JnGT9EHl?2`gkk>N0?IX*_hme_OCF%?#GL=$ZXSzSXN~L|E7W=X
> z)zPY*46RV~NuXe3-d=*W6I>H$&MWAVR|2Ct9JVq<J$c0YNb5>bBj^7N%X};%yw(>5
> zFKgX-;Njd at MTc>xmUAYT;gyY5rHqCB90(!A(NN^hxM*P2w&U!(4-o-DToJrL?%*CB
> zsnn)%k;v#WzD<vnwa^E|jPbBU-#p2e(ZA}jm*d`AqWr#PKlcIn{#QQJQJ{y2I$s=e
> z!Oiw1W6kjRBh|;QG6;Hb2U*aGLXs67^YnJirC7`ZZh1W)<YiAGzsaIt>ne_HQi)zc
> zv<y*3wY1)T9-lE4Z(21OnAcs{AtI6C&T%7OGIfT-))^f<MAm!s6KuD9_ga8fM0rkg
> zE{(_6eIF)&h<<lq4LkhsbPG^U7Q$27+2Np=v_4;qtXOyjBR{NrJ^X;Vwi{>RIIbYg
> zH;xUp`G}z#L3z?`7I=aP+E0<+(gUtw>vi5B!5`+L1wP4g-rQ!`;x at -<Jk=W658bq}
> zwi3~a+d<)H9E(J})g`M2I&(%kb9=h!NAfU{E#3(5ov at I@+aED{qINnH^zL_|4OjKx
> zW|s!qvlxk4lSF2<h{iv_-m}LAYw4BjjQiX`P-udD_AfVixB1-Fkl=Q3isx}xWBybH
> zQm)-$_==r{>~$(iVwt#R>&?wGw%*b_gW~%pg<uvL$6AR(gD%s^UjdH{4#S=2gP&9p
> ziy2E^S~$DCIUl3yq3AR7zroicj%uNW0deve at Wr$`AdYsKzXX4fq|8w$H_Jt5KN{{g
> zSaIM2fRNgxg#?#hVAixqLQ&6gAI5EGAemyt*<_+v$Wc~{;2$H!U%r(F?sJq_LjKc;
> z1<1J118zehE=DAMI?!b~8u={I;Jbsee}Q&i1P$8bn$?(#<4drseuxY|(=*am#huN)
> z0IaZ81J5R3FvI82$LYL<_7?7W7!1B6CzAi0JPZ;GID3C)QPA6je1qaOloZ|?U)@JE
> zRMvr0@}aF3WsXWouW8dpw25aJ3o!p8pif^cu&^ok1!~iIEA%$Wu35CQIeKha>qKDA
> znvKK2%jfzYvL_6nJ^#7ZNx=O7mEAl^=exHyUyYPgy(iW9IimPJYzW#8_<AK^eZ!Mi
> zQ`@(LqDG&J+mQw9M|B at 139*;*lFu{e)X$ypS)FNk^JR4h^-c870hMVvHsmPL?_Ivp
> zzQI at bkMrMLrLNQ;*X|*{ICw(CFIbKyzhP$v%3Oo}H4&&j2Y6Wnd^+k`wCg at 4g=S4r
> zS2WhLFByAH3y={JO`dq9Z)QcmPG{mMJaYh)OULGLT|-fyuHm86GNd=c3yOY?sDk$!
> zdY<ID=pCTp$O^^%AVV2LmX*QqjZ3&O2c*t)DT&HB2mfAG$8l9UjIR8jr9)2VEj+s!
> z_HC}QAkW_}wEoFD-^mD`tFw5l-ajx<3vG<)bd3CC>pAF0evA5;ul1ajmXhx*a*boH
> zMTa!C$?bhRwRbBt>?|W3J-3wB6Uk+?yZ6&}?8f-soy1Y~jTJB_b<$aI^5|PN#*{dF
> z<s7Xz$h}x|$Fh}WC!>$@S<vH_CsWCoN{EH at ZpH6Sa;kT0lL`4684K|c|4(<5!TXuL
> z;?e8)igPVj=f$;i0*Ix=SA-y at wH6pw*x~RS8>q#q>$F=!^!D^&Lvh^U+}0RRlDf+X
> z-?}ecVf()%1V)YI3g6$NO3SJ**Oh8oQ=HT2m12QRt#$uIj#bMJN7>2aaQq!sT)V3Y
> zd(9~R1;QPOav^(JCdM3P->RHLbZ{zWF1$hzYY<QOU;*j9hs;Z<-cNw15KI2%eP8dz
> zZA82R_V!%W6Nu<%3a#2Fu at k4Z0h`Q(ypoad28+=7){u^7$!cY}?;O5o@;z-gj-+QD
> zcy=V#_#<{>8l6}8me}UAX!ssIUp><Z`#bq^!5V)B{sf<V>hm4K+mXHpcxe^N@?P(y
> z5!ZV!J$&L?@1 at 7nn~<lNyp`Y?G?Kj6psU>^Ihuux!jifZ;eEPK_=OizhBV-9lW)^b
> zlyN^inNGoz>0S?zuMvlaT$0 at PZDc{F#e(|&+V@||IbS)^65m at mU(abtCC=WI3_eIk
> z at M$!l)vJ_q{y3kR&X;xJycFjHeMWvi4d=x;kH`D>@+<MZEqk1yW!L!Q!7uCKl74?Y
> z_+>o?1lazTjrq?l+c4((mM!Z-%RKOfyVo;>w`|Z=uRcqXw60koc|p1tGbH<}x0uSI
> z%LDlA$R_zg^+5x76dNSZF6xI{kaHuIX1Z$@VsqYY9f{S>aX6q6U0eLaI`dECQN!6V
> zjh%hNyesTTKiwMMrf&^x8{`|@Is)@T#QaFQfVq@}-s9RuofPhi;l0ecq1JbN*p-Wd
> zXDiWrzvNGJ`Ul{68Ok#bDB#?ixq+gR5Iv+x$+~0wCU~elV85G1+RVBQHjC~yTV{E?
> zO(<^xFCod{HuDobHp>$q^j*C&lecy<tw6tCz6on20;RoL4P=ehILwn*rKk&IaHW>e
> zBv&wGD>lf<{t(#$sSjQS at -VwGc9>ryC-8mB!i>&Mjhx#^h>^YMvq)Mw2@&Lxr~2?I
> zi?ABOjrXlKjvWUs7&&&WA<@uuhj}AN`T#v0jNHP|DS4yBnTWu_``tROO{*o|8J>$H
> zO0u|oy`0aISLjPosy`lh)}KW8L{UwsC%-~`958>4(eTH{S)L!b2dD|S$$oC!%=heL
> zkQ=wbE~mj)7Axu(c9F*{xFAzT8e+5%2`4Z_LXqZNRJLI(EX>@P!7)+?gL_3DPFfFc
> zy|0k_@&!9=GDXSVk1N1{>3GJi=Pf`K8I`NdX+nIE7CnWUpYuicMJD-1&=rjNb6nq5
> zV^7e*FPvIO^D|2a4 at V>SIjkjq4&28>cviA&SdKpgN2N3;+<MFiiXH1h9Hj at onG_2Y
> zO?r?HgAD&mPy$Qv6#R)h`>$uKb#v><GgEogb1S|H9Bdw?1{D5lXGj~D*w1g3qU3Zw
> zQ~p6SMFxhMM!051V(wu!T67zHz&Yv6h9=XDd1%3W%q(xg3~i_Sbb`8IRrbzD$ZTl6
> zv{E at P53wf<i6Ht>vKaDa?|8`3_Jo)y<x%Ve?brH!sw)}eD$%YW<~DFzR8rRa-cFh+
> z at k4w2E`;g~{P-{iG#kwD2)@qv&Z#^s$7ANi$$ozb>Vn*MgCPH)eu(Y6;r9^tD5Yg3
> zB8q8-HwsyH!;mi#Qa_(z;e>tBF1d`#W at r%vtb#0M67FmW7z^6V2cMnb^?2{UFa&$v
> zkh8gnH at 1|IKvss>UL9{#eG2ryH`m^czqha$k at 7WW)!OlQI_;2L$17z0-g$KH8g?K0
> zLjm`huAAmaA{nzm4_~6m@`S5a6&~v~EkN-XpeC5BSCo-Wh+n!9vPJVew0IKnB)*Zp
> zF{B-mKtE|U<N8FR9AtYzOFZ~i$3jRljehT(#x&<VL;w*V-T?_|mAQ<f>dS|~;}+2~
> zUW%9c!mHi?B{C>LU#pRrUexYyfh@@N=j8D#h08K}$r|v0tDv&GAf+w{go_?nB;rW3
> zFfqh8 at bqmmNk|uuhCtGsCUK22 at kBsbnj%{<2glNrH>LOSQ<cF}N&WV*VXy at tMuVPy
> z_7jTW5_2d*V*hrY&3&nIx?S?e0>^WncQdjrX_ZOz<bVIES8m1gh$un47qrE+@)pr(
> zN+zI*#0EA{eH+H$FGWI(B*b#<8PF_X*dzAl8u^TLF-LU7LlGAyB at rJ+)+H6g0{zU}
> za%CCx4&bnW7>4pOzFp8sEek|YUvxN{M)2M+_!4K^gu7)E?~kx1;<tKh*w-&4E3j`!
> zV?#B*vQq}Syk;Elq0!g$P;!3{4Zo&`3aLDI-gP~+-XGgufjmQqyuGH629x%YeM7T`
> z-s;q-Jw<v*`tmss`s(T4zIqyVN{i0oTnPPF64RP-Of99Xik?`QY2q8q0i$xDHObtL
> zSi~S%n#z;=EKMk<is#eDO7{#$FLz3%=1k;ROwbKNKXt&P$>^Nbphs at cPB{WOSRyFj
> zskYO5hm=l~1+*d!KHeg7(o=?Qdv8`BaJ8VG#kMt&vLF$D_P&R70WF>s{JrA2?dnSM
> z48gG(YiM at EK*a8Cb1rF!!EY7L;X%k_`9hJQ4>%1)!ME;{b>R2^3F+nSLIwmI7EKaN
> z3f5gjR^&UsRc*vqac?As%sw&7ZYlgK!p-L+fMR3l$F~VX?5f_6xD0=6 at 3Snhm#7}H
> z9LFNpPeQ0(8b>~aSm%!di+U<_T9D at z1^Le?vqM*7#?egg7e~iq&ZyS4(ax!$4rcv8
> zW%rHg0ry#2O~^HUs5_svb4;WGN-MI;>H1KS<Z$}3e*(%25jARw7%hskIwM(tK66;~
> zAcL01lT6%<&aw`e&EjZWF)8`pQLxsfVDvN?J at _pmFHff&j?s%z-UO{l$GW(Kw7Zbb
> z)1lcl0A=$j3Gd at g%7=2VLlDn(I2_49xhci<aQ>~Gq6TQ!TIDG*O$^28-cMYajyUtB
> z^gWwC7;H65mNp?SRy0vr at brSdnpTVV3)J8TvS2hBc|NB(EJR$5wG%^_PkRsb>Y|~`
> z#(aYAnQ)t+i5}c!<(h9TN$!X%#lG)NQRQ{g0;=-5s=bEv#<kpXBCjE}gkoHI>q&==
> z)~{^1ruA3n?scvI3dnpG%~GQO7<-~CHtm%UZzh`2c!e~$&OMDfl32wvcAJK at HQ_R(
> z($Kd&KOVU(Ujg3VB*ZJ-Sbpu(Hh0P&dnuygLqrdekL(A)^9|>-VHB<I&w+4(Tv)Xj
> z?b?9gNWy3f$QeW9ef=10qcPCa7;L67 at Rqmg!BMaFYWeSjv at 5h4a0OT?eWSwnj!&_7
> zd<JAg?Sao>Q3(aTx`*UD*$m%+=dhpo at LL5Q^-}K+H^TG1#N;^jZWE96_5dGDhKB at y
> z&e#9kw{j=;Bj{4mCz-G$4&(el9N7Y)528J6ux+wt6?{HNLVGaGqxYLII<XRQ2-CnV
> zz#2&V9O;bsQv;AGWEfU(YC}3Gp+&i6f32M2*CGSs^&=dK5ss(%P2ZpyUXaOvwCaPs
> z3%lYp%yVFSsq-AXpE}d8TT4xbzWFU@(W;7 at O1*lu?|55ce#ZF#*&Un at B5#o4ZytF2
> zG|z~iJ=4n_fm@;oCOrAoSvi8DTc8IBk-Ph9)>kh_F0Jw2QO7F3zGj1`uCq|xuCDp4
> zztnt2=p<@1f7Y$Q8^{3OK)RrjBAxJCW15ZWW(|u*!pyJiiN3C at eA<^wWE1KfgSx%q
> z;hg=KcVeeO&A^jhU$Z3dyPyay at MbvtT8D@7NsPeSXeTr%Sb(Qv&h7||$@!p|a7RwI
> z{;E5(Z6;*9M~Z)__{KV|nh6~$){rULYF}OU82&3`DrZNn*{=l+e+2m;%H()kspc`d
> z<K8q~H=DIX7d_h|CtdR_Wdy*p(p(-Xi?|!iHnVKL<_W@*!4vD!<nQ;DAUnsWT at v~W
> z+#@o*{5Mc_ezvxN)sIovkGMMGR4eGr(%?6W8B8<Fdx!W-WEh&4wf&t(AX^#0tAdv!
> zKJ_|E;`te+&g63{1C$!rr&lR89|_J6mJh{OP`bZHj>b2KOFX8Z&zb*$bC$z^o}Bu#
> zuhWh`jx at D8*l-EOEsp##R1VXKmJIa*(+uBQif^rK7^HIEkfnAuL}R^>cK8NT0kpRG
> z)(v){3~JlpaW`xmA`Yot_~tNtZ#33s)HS`vWrY5gzT)BX&=+x#inUVoe`puHF|W33
> za7ur>qNz>lcdh`P;M(sXx@=`bWPdAPX at JeI`Apwe(4xY9Ieg8X>vZ((tv}iCmY{`f
> z2+>+-6P0Z=Gq^;xi6pA}5?H2Y!4e2wMafs?R52H5B55QO76p}?_$ZrvgH_2CzM=($
> zfYOxU*U4ir))O$wyZnM at xEmg)y;39MnaQ_Cl~(&CS{eGcpG!}2G?fUAjSdnzkn(@l
> zZ-;+28`EgShNRwb#MIe199R^XjaO{45jDhjsU|o0_VxV3%-){-3K@>!9eTsw{B3`4
> zJ`5{Wv^eOe{fXYZtsa<?oQ{SuF1s#Y*{LHhUDyk?eLc<Pa|7ga$l=SnsK>=J^f)|4
> zE?8w~5SHBEKMHgWR)1*suZ}`E{BdtQ3WdPPQDyi4yHP-i|HCL83ET$SxV1Zz^Hzer
> zEd171FTCB#jDwI_?`C_Mf#%mk@)Ud7pc$>cwh((+{O!21(q5L3X)n8LG>%JYZ`D<R
> z<GkVtY0$%~WHW3niDFm=;^sYrki#QV)m%UAhs>RzfyW{&1Bc{r90zFUdHOr~2hxQr
> zn+bzLS at C9$d=ogVQ|(WJJHL#vm_m}9YCD9F1dgwz%}*Va6Z)=szW~2(Vl&w46Jh&_
> z+O91&SO1Rau^hIa=yU%$#YGZ*?x(-UuAh&P9`5$8*r<Uoi2>{DDf*@i$qxJ`UsIsM
> zz at YR@f%buEpoiAZB#JDJg(Lzw<Qj=$ST8T4_Y4AeLLQGmB;X#8(cI$^yD#T@(|+Rf
> znD`UFj07%Y*dSvp07~ZE0$@V?JBstp;84{ss`Qq4VI?2Co`<9c&n!^QPL(!on-7mn
> zfhd!62_&d7$aowI>h$ya#`o7ZrnkP4z4hgq0n!qnozN3NyMK-ENI(QP`gUPo9TycO
> zG4`pkUpgC0y#lJ1*WmzFO9t-hVeH$U%BS9O9H>TL`_;Y%Z+KY at 1J^<O9Q>R<_CccV
> zsQIEPsm6B%5*hXlvj$#tJYrk%Ws={MGSWZF_bhSMpa_^Jfkxl`keokN-Xz<<FOi;+
> zFC)6Ulr%*gU1JtvzIDD8zI<gYIOc&ggMpW<_mzQTdK+tUneRUI>-xSCg>4LeaK736
> zxkz|r4fHMa+3~DPS+)qilwL+ps~&H at 68Ob^PF`tP8xIn0DfxabHjD7$lJ(v%L<91t
> zBtj?9A<iT`8()$tL3C=!@~%K9LtoK+irS3E7al>ImU-9vqQDbh?cG8Jx|LG~ntK^s
> z;^FUjAm5zw<nvbMk`DuwN4|LQ_JKD*Wsq~MS^H~618L{JoT>WOso1K at GOB-{S6yXr
> zzD{k$(J=VcjS}7PNEzrK3_3mrXUKQc7NvUEp%w6<QQnls(M(jmcF50)<SeznX=Lad
> z)CZ~`?8hSUzHxeyVgxYSdK?8Bp%ZBgtaJz*;c|Uq6JjDKAP-X$=EQ>>Pcni$<XA`}
> zSt&!%N3$Fjj}F-H-;?F}zc0A;_}eP}axW~=w3|VPvyl20NWE1GV#K>o<Nm)8yOWCF
> zkJecV-3ZsYV0+_Pb}qeb`a-=J<cO_P>VewCLOhw685z{;0vo4o8eM&+#z)!VAo&jZ
> zPqOsfoh*_lSyObMo&{(gx4~yQ9Btuzgglxo^Oy;DJd-59cM^IDwLHw)R=#3KUdu`7
> z6S02#bRNK_B25RhGMF{s9$by!E>ztI at qwyz(Rq8Hbb+<T#0DUO61R1wArhGAA@)+e
> zAs`k7KWz($-cwRWQSiCBJeu8DZvizP3hj)gL65&l4RNH4f_Fg@$MgZ3i_X%A>jOCn
> zYlYL}BzP_mof$-L0&j^Vo4W|T1lo!R&<Dde&sL`N9w%-l{Ijjflz`}=jI;3#0|HPF
> zX&xY4Ss+ObztNM>8Nu4f#|1PGC at N9XQpKT+Q90?2cG!xLr;XReLM;J?$RoupYJFDp
> zc8z)**@k2CcLFBlJr-{hEc>1~vvwN(rNOysApRjjD$at40So)yY&Ja(jpi5VJxCSM
> z8#2UzvN(o_;s)f5gTDm3Te%n1*o>oJDEA_&)P|#_6lu-zZ_MmhKvLCVJVnq^(j+Zu
> z at I!O-95hH>L`U<ODFQu!3<-qR3QbvjqZyPl@%hEaOeD`E3$}1P6q+*u^|64n*YXk4
> zv^$ErLW(@$$l%fyGG}qShF#F(I2imq;P6E9{tVZf at jme68bd&1ggBg`|G<r+uPszR
> zJ!6($U+T-jZ~kX%Iqr_|kf-&C<{7*Opw at Ul5%gp;5PS at hk$d-k1B<bGv=!QtQRKHB
> z5|6(<&T7(!=;DD9K-UId`!!!|@A##u<A>*l<NkHt+~5WtkV-ehdlx#1t?C=kDE)6F
> zs-uo~lkhJ&0E-E<>`BnFBM&jS at g#107O>N#h>eb<=G^AF=1rQ at ko%Wc4lQDZ7lDlJ
> zp<V&<@&kNsMcV$ujHS_pXFH4C?9mln_WuU7<lC&+aSLfK<9hcuiTL+IQTLbc;NRJz
> z%UAvhRQmv)`VLRssXldO8a+$bAi;Cw4z%bu#b(FsEZw*}n+uU6=Q}Ew?)Kh^!kvYL
> z at xkwY%X1lhgH{61DJx<exPH9z4bAN4+ at kJI;8g^cI%>s+jQGUk at US?xP9R)(N8`T4
> zbsES0^@$7Dvf$YkP}6l{XmhSZ1d8<xpb~{D$Uul4_)*^=7`Y?KQ`rWTw4$yDKY6l3
> zh86*5R-B!BvQh?4Db^xAUCIpXCj2gjn|v5 at ZWLDrHJ%E1F;IR8JbeHWYO`bBWrnTO
> znvv)PxPm&Y6}>nRzj64D$L~PM=-n%Shd5sP-ROYE55L<xuuHJ`hN(iFG|gEA)S&q1
> z)A!7GVm7ga=Z*L~7%e<<7CA{0{|{yF0^dZH_K%-QCTY_25 at -wM+O%9nC at mmVh-I3F
> zNE9(()!IcZ7rUsd)W!R|yG-Z+6)TjADT|1~OR0!ZrLd(%m?A<bi0B$c*RG{vZ4-Ab
> z3MG_~{Jzg5AiDeh-_QS(&&-^h`}H}`d2YwkHMX2P%{s56+Q`6tupXX8jDZdf8{|9h
> z0HxC3<%?J?vIvt{lDMhjAFaX*93&y1G42tWaVulN(?YVCBve8J6J;6K;VzjLDb3p&
> z6#gB6r4U%(gFW>h1m at QJ*E`tqf4hJaI`iH=NH}iiB<Qd&6)K%PbVYl9_j{Zc^}f0C
> z4BuGT0n_`hlLg#=l81GzKRC_GE+^HTpXC<%7_(WQn#o2;3)D=(JIQ|-?_}TGcpJU?
> zxttj5V&Ep5I at 95k_->hZko~gHw|%Ppvj5)g)9jc3S-w3N?`_+sJD~Ahr-42owOqxP
> zh%t4Viso_|T57vNAydCw)~nk1H{5PA%2g>P*n4iC_Aeb~Jvgqdd63Mze0CGKr6$}5
> zWaM5J+X@^aUm%Do?C2(|Y1mY;r1f{L0#iF*#*NbI6S!dq_WxD#AjNu at 4c5E*)tjXI
> zca-C8-SJ#K(y%9XtX3sC7t{+o?!c%Oz`B=d=L+=SY(U8Q&SKv%=WA!37hg~nvv_M|
> zt~l>!E{~OBmvgfOVST-}OEa(MP3H<Hq$8`Cb%n?@%TJ at 8=P%!ab42c8^XyOAwAlyQ
> zjlwWVAF6UywYRX8<==%r?L at 1q-)(Q{N`t=XBFl{A;lhH{&t2K*#hW at 4?mN5e?M@!<
> ziJiKR<jxrU-`>Sb(6zw+jGGhpo(-t0v%Q4hQoC<(!OokIKZb|JpwrIhydMTnL$_E)
> z-P4^1#c!Qf)aSTUY|ST_!s at v1QKOhkN&XLe_0C$@5*EY6_i~Fm>q#~RbnkDAOuQB{
> zG}D0*7JNUc^Sbu7&QbTBM;(T at XLe>#K7mn?TKt;s?|>a3Lo{a*IhQddymdD0XBoNg
> z>7HU>-!uG8BB<sV^I^Rcz2m-L(3$Z44P9~VF`co|w1`_4hLvi3dnb4YM|`CWq2~=P
> z`E{wkjp+mphw_uG{w7J0stN^B?+Lht{U~%E!MCjr%$>oQuvFFwOJC%LtaowG$~$}k
> z8W`=V9M_j&+|~>|=mpe2Wy{Yx1Fzz4O0<Y~vp#_Q=Pyrjy6e=fcGVeCr+Qq3?HE=s
> znp7)TH~%4fs?}<Bj}V1n4NO?al7u%)wHRSggS0{~!)(g(YORd9t;RSJn%nkHb-TGs
> zjaI5xZ1M85Ut?2OfDYf9A83fSPjDEyueYzper{w>&0fyNAP%G*eMbY%D>b%eH8lzO
> zjWo9HC~E-nUlcynnh#rVJ+7w%k4UkW$!xeVL(&V`?x%1A{WGE+t<1oR3J2Sf2C{NE
> zD at J&&zbk+l1Nc1Xo6?~IWPN~I9NZ84KYE!Lx!x>bd*GFDf^Sm27Ux95)nO&NS5UbB
> zvq{g%1}g}yu)euA7(Ps?FYR at jaPIvUCzLVu_M%bY6j0-F&lC4DWXiSBdDaF-VBGEA
> zfwbEOrcuiSF`&ZGze)eCAE3959zgv`GVBaas(tz4(5D?0j@{U}e*I;2m6c8dp$Xt0
> z=R=C`{H679!8QSnD9vz5=~bz1`|9LUj99)j9dRC&rYp7mi}HTK%HqVxuC=P)<s@;H
> za=O-I&2yq`j$hRZ`P%+6c=OgF9<4Xl-tz~$r#I+4p#h()MjRQyZJx`5vNkZ!ng%Jr
> zM6W7vcc9RGuRGfY0O%|H(s&{<v!6JkInF%9eM6D45+}ge7+^bj;7RMe8gc>S(P7l{
> z?5y8>X*6s;BnXV}i<@a!zj=7>Mk#j??o>Jk`^`v+gPo58z`p-hKZCvJ;fqTBw5Z>k
> z!1^vf^}JF;Du1*M)=$9a(*`ur+Nu%%JNx;acU)8B*b~sWM2)roYb|g5O)WD~%ki)R
> zetzd9s^^j~m3qP+iJj>+sA;h?U2MBNM?7Q?jXA4Gx!t>dj696zMLv`(>(~qtCs9DX
> zxbRcnDe%?6mxnLsy&nIx(SIuMaQur2A3j21YTVtt);p+P9|>j5n}Sd-`j7J_;GZh`
> z4_0;YPmPq{Gw9w$O0qFX+ugr at 3?Km3g#UHhvT!2iGOT2(#`%LzlfN;1*t~507~f64
> zO#9`V9)XspGJ+iLcrwDC)C-$&FQma%%rh at 6Z8@iQ4DHkk3y1SwwXIl(Q+4jpkTEwi
> zza}>~l+`O<d^Hg7yRnGX#rvjsVkvJM>?VefPzhLB_xXe7A*;R#O$phk9?jWymhwB_
> zRGI at RMgB&rSEM!;wE$`EOl|&F*l`Vlqj at QsGC{_zTlqESA?wEoY&maPILly8TtDV;
> z7Re;#7kI~_JaJaBkmQ@}`N5lre6Pn at F@*1!YxDO9W!&MFUwb7VZ=A2(JPxD9XZFjl
> zh5Ti|{I>*73z>KH9`eVI3_KORx1>AlSeSTi at 2xa1xzc;)6Og~U7f=MZg<jKl41EWQ
> zKc(+t1b!3m)xgpTsIFv7Ug^DU=)Fn3(na>0-dhQ-H4Cqz63}}OqQ(XC0E^mVko#fH
> zej_JA2d&9xrv6KAq_)@+yA at lgRA-A?HhAKpO%&<#=^@+EE^j*Zri)Yh_HFO=XlFsQ
> z-jd`okmhlI0ZP~gN%}|%o4>J{`eU2YAKL|{mAn}!X}RxtdjGb(XrFG6_Nnx%KHaY5
> z at ecY_y3(f~tNcOqE1($7%ET+Pa!}xf at G5^J?&Ii=%mvJ at 9hhgip`70Gz!I8qm%GVN
> z at eu<hUaK<W;xOa%kr~$=opIhNf!|}kwbOiS9*jCWB6BU-Zc9r{^f&s}Sr#rbglvat
> zrtKuD+x#7Z3DyEQSPQt>oVI?9w;xj75Sc;AnFxOuc0zOlE8}UlP%gf8p}TN{AI%YW
> zv at NBWBasz0I56rz+5-6!)ZE-#5dh6R+LreeALuh){^mbglZY9htRL?b)P=jYJxQIB
> zu}?Z}Gj at l6)1F;Qd)^aF4r-4SZBGi$NFUMoB^^O)b_+&?vNB0&4f6O^YgiF8je{KJ
> zh>lpXxf8lpT(X?5=<W at Ld>9i30AI`N<T2NE-jpKdz+Js!UvK>36knS?Sn*=(JjS>x
> z5AKmiX~o`HD-Y<UkziLd=^j|b4^}LfSl}6)iSp>4u~n^Nv#bA4PUkRa%&D1HPV(aR
> z%Llc9^3A>yUzR*pRmnyn?b<4wnZ7l3#`tG?lWl6oLX%~+?^ADr&D1^3ksj{|?Kv3Z
> zcg?Dte!+JM?{i97*uU~W1MZJo90*=(CIX*|3FHKB#EmUj*<v&LwbePyb$9bMr7u2$
> z(q*OeQNV|(bO%Zo+MAWqQ*5xW7J9OoN>98}x{#z(HAl+tQOf^WDL+}FvlG)jjGgr$
> zooc6_2sv#1<v2N$XX2!W<#;<9oc^i?k^WnU$qY6{;UfR4ffzw6{yF?rg&<kLwU%6b
> z)Ma5-eZ;SX2~j_v;MFy#;5(^-qm&JbKb>$<vh{y2*#_#%|F4pDS8DTrmTWTrdEJbH
> zVWP1`V;-{32JYI3+ at Vhga*9PpH+HtD5pKgAzo+^eAt_E at T`fby)b9nXEG%U4KY${6
> z^<TpJ93zjmZout1zO|68pt}QcyQF(^rZ!aU(c&x;Cmt2Myra?k;qW03&WU21H{17!
> ztnnAP`uWa#RZhWo$oHOnJMK6&E(>%F at 4Q*rLq3<9r8B-m_RBYZFUR;E0R{MD-+bTS
> zJ+Yu2>Iu4QfF~C7MLI`J;ZkVW2Bc=M>M$>9?7`>H*n1wiDf6!UFHVjEH2p%TEY|sM
> z5+=HJxDPw*%M`YVNyxX!qZY|dcphU`76yE${S^9-cUn!l0`Z~nlvcqTvnBypWrHM(
> z9o|OJU2zXXXc2Bf*5<bmJ;7JVXQ}%0f~tS at c;Af$*{fJ}M%7~5C^`0}`Ph98d>^g?
> z_|{(poD`EeuEMM1Ij+2fvA=}I<3FrsD5ZS{92+wNxfQFx?FxIVcUHfL)n}4<NFB-H
> zRk*JX;eOl{=!UdxT?%wT`U1`x{h-sU60Auwv!)Bo_bD(fxcxK5JoLi90grWc2^2?d
> zK>zpr;dAAEMtQ#<6ir!-wJqpW?GR1faE*scpjMGib;<)Cz0DY>cd+MJIb?mdH3dc6
> zXd}<}VK1RY>STN~`-MuI|4lVhVj2+>C(vzmpuhCX-zW;L_X5-;%<jv8Csclq?`!6p
> zDg&GH+J`|3d=s#~FJ>pP4M?41WMyT0b^CQypH#0sJiz@;fpH(RWJ`vsF~`)dncf&%
> z7H$L0em;-`y)oDQ9huUHxR-uRM~2kgsggb at G9||rjqV?RLhBm|&A1$BS<@-E4$>(H
> zadY`-RSL?#(9WUM;=uJqsfygq?*b;2UU)c59O)}ICstnYjx8FkOF<4M<S>GbFponT
> zRhP|I=#FtgXPvhI2E at 7&<rLV_9zAfHQdX?%c38BZ<O{fOcijz}=SF^fq^wRJT%UtD
> zH-i$8e at s?GhF*s2OIhbH at ohS#!i=I*=_1V1W0{llzs$7de~s`>g2klsZG&rL>z#fR
> zX5s^&34B9y5&bOU4o2X(z7E`zOucKQ`$6+J$~XE)$Wu_?z$QIvJi#1~nwz>ZL2*03
> z_e0NhnI+;Eh<A)`a#d>bKlu0Cnxy at oH7WU}CYU9~zFYV at F@Z)JBl}=<gdd<<I8sD)
> zdj@*@KI)5a=fiam;vG9mSj?BrbIpHt-vI1(a`SB%t(0b1L9(%K7Ru$_Vun1~JZ#x`
> zVFgQ)4$X41c*L+-i&c+V)MpGr at rEyC6~QRsPCYM7Y}3=t&(SqhB20|ui3($Wei=>&
> zq9HP>hpC5-;f#si4y{+(-B)pM4Yrxp%f?rA3o|&r^-hUHUzdmv3i(xZ;suV0l@*U3
> z?0MYe0kv()eo*oWxAoE}DCZXw$FKqxd^*fuB5VC`o=o$-a!L!$0EcQ&k;60qr_jqs
> zlLGxL#!g*epars=fuR<o2WKy?g~wAhL5Ti?Jk}ua98+yEGAPp=_*+P$M?CJzzu=XB
> zEfnUVe=QPZZcIaRwV?%>lkwaYn*a9!SWCZ${Qcz6d_JG!0)Thj3>q;A$N!cqunl=+
> z at 6*wY!Z>2rH9z8>q`+&w=;=Oyc?7G2|Mv94lB=clHmqTTg)K68W}eWQhrFuk<yzA{
> zdZ)>2 at Qni8zEIB~d2>Djvsa}1M!MrHY_P!-gVkavU}jbo3%Ldct>Z*U+xK)>y7V2H
> zoiRAIYcU$1gC?-3aFM90u3M4r9Z*!NLLGFtHwe2&Givb<$n%vZ!LOg8a3M)pR at Y$+
> zK3|am4zs+%WDgBzxH*t^g9Pjbaln3XI?DgtqeW~1d1iQVa<2Tc)#M3)Z-v=U7QNxZ
> z9aFHq7%czT-t*9CWv9qcb_zG`6x9J?>0fzYX7xq;<;k_z>=MOcCM?>(3kyg8vQPY8
> zS(~zW)Y}-rqLtODRdR=XeYEt8sMU9JfAnnVe_rw=DecqK8Cil|0#SPu_P4>82A3i@
> z!E at fLM$MKNEmlW%QJs?NS#XbZ7!g=?Laa1Tk9VYRm#`3r0k`;_Z?~1D8aKSfr?Y;r
> zW{Eq^s{@X?&Pk^(*hBf%9-aS|4p0pJyYN;WQ60u<-8~xEv=+U9{jz)(FuXUFUg%4`
> z0LYdlPN`a4kR4{BBhj^Sr|V1eZSK*SHQ3>u7zwl_Yo42N*pGRsoopT}{d`IK7Q4P$
> zI$fYfFXM(_FYhv=9BNZ4%7Og>lyvIzq}-DHQ})m>Ri at 23Rj`cY1<N4b_gS>GyM&2v
> z(K?i|8#ViOkv<d7ZG$_LXsq?5)18R at G0|#L!!jmIa3#wzYd(<#flH-3!&zVups&gv
> zT=fm at PD&2Y-cWMj39I$Q5^bUor#~TyA-;byQW1}6eKg$%K at s$B?1Yh40d9Glhj|h@
> z4t1I!755Zw;A1(z- at t^Q&8#(XD9_XQfog+UtDzoU^*S(Y<ag;-&qaIB;tNXO;ts0(
> zFM=ZE*N`vfLyN4ppWj;Kft9J>KW~AgU-fcjpGWWdo)McpYTr$=l`m!bBYB8tll$0%
> zU;O9`@W$o+T}xcIfPZB=$Xmzb&WyW_Nn$@QZp?h_1v!JM#RUHh&rtl^Di2c1Nkz>b
> zl~e3Jf9z8M&5Tgo=Eq#DjqB3PMeG0S^s3h!TrF4Eb$qpAYL{w7uJJ{&AIjPbE<nH4
> z;3kN;r41ti&YIXP(#?$Fu=`4Vm4CGs+#Kz~Ew%zMhK at 0vhTKetoYRMAuKofO72Ht4
> zD~hpa2`nKx#&gKtcu-W*j8M{S|3A~rjigzlqMM4TAEnr4m81#u{RLME^u?HSKRGi;
> zT8AD?fE+_SIJO3i%K4f{Y>Y4(J+PFT1)#A(Lc5#0DB)Q_)cwqn`5UpT8O4NyR_tTn
> zAIziOtRfwH)#f5ypP_(-pgCKNXADOtxvduCCd1JfzL*&b76Qt(0LsZUCp!|P?>Y@@
> zVmok;V`q%?Ep%*j1BdiBLvu9-6tXZZt=z_EvDp9I at m(MLP0_wN;6J3$i`_w%Sz?_$
> zdm$_IO_39FORR(Oki=@w?|)R at mzDSD=7kvvvlp-_h&}jllEek3;+dwL$O&Sw#7C6(
> z6AJubiL=3V(FQ;n4_rsIM%f5_|5l_JtfU}F#1bD?AQBcCsEkH}?^fuU1at^H|0d=!
> z>M;dnpMUc!de at Mi+4(oWQ{ERa0vX*-iFGgUF3U`?=G0m0%6{f-i;aM}$Ntu>N>;Oc
> z<$ZIv8t&Vaw*xV6jKoB&H<WOz@}8-L&sN at Z5NqnySnHJV8OqzPgx{{b=OWg$tFiu~
> zgxi$&ElT(u%DVuu%vWPQOyOKmd0(b*E~LD}wx_T!4-;{xvvr!)oEXMlHob&P42Kdk
> zhgzr3Na|+mXBQaP%F6#6Lqmns70W|6XFh7pv5oJZ?nqAz-^>!_&|Sjfffn1W#Bk<)
> zR<pyBh+BKZHMab21`D>T at Ra0y@vwrin=<dR-o&fLW7SJape-Q?$vnytB4r3Fo(~Pp
> z%(dnUIWH^^rG-`^Y`T!DwS?9t4-=2URseb)HJyT;wGy1SM0?Kz^T44W??@CAr8@$@
> z4?JmFA|`r3v)jN`zelS8n&|g{l6wA)cIABrBRdVxR6vb+a_SXYEnz30=m;YLFP0H@
> z;#IJflITAPcWGOvBApq}jd*UtlZ$6M9w9JI=JCz(4)Z;uK(;jC6?%CvgSE}MjK#TB
> zNS))qt0=XO@|lh^RGbYx%V%>>gEFGB4NfGg$bF$ioSUAO?vTdkVqQVU at m1709BN^Z
> z)<j#TW<F`n at qHvL7z7TClgG_^KM4yt-rlq5t7;ZqTX%?&JsVaP6gYg0bUc9%D>&lC
> zH;@bX`IyHrd=7ta#C_?JqQwJaabAz*nUgDFU_;`o>@Eb$f0aisWJ0f|3luHZ|JQW(
> zp5i&O&VGIeXw*rd<>P*rB|*`nmY7%9k=Uumj>31ObzYP-!1MazgmR7`9<5BaL8<Xc
> z>{WoDz)^$J!$FbnW+}eq&9SlueR at 0at3I7ZHp<!M)hj*@_~<%g;Nx3k>B#e{R-7(~
> zfg}&|6tWz8LCDhilNBtu!F8dkg0RCNYyh~LMJMpaJAfUxv<kM|WnoA5+OREMWI}$0
> zN=P5HKuQm7_1$W}JZl#)1N5jehmE#O#Kg=eI*fVT+!iaOZ!N|jbgdbvbtJ!I5^Syl
> zo^zn(hr=ZEM&ogVTW-C>ksWp at bvZsSTjVH~lItL0*dO!-98<$)60{$JqLOk4PNx4K
> zr3G1J4~Km34I~+m|D4<h=cPpSC8Tz&Cgy>J)Zt#E)yO=sA;9#h3SJEQjI$D0PR~Lb
> z-{<7%NOM!BR at _{qi=S$ae|t2YN`&InFU)t}`6#q@!xhaZ<J&(3rVz+Y*w)agSzXgU
> zqEqF1*d7{f#%u~**QC7H01r7O^9}lPZNqa7tX$rYI&BN!v;mAE7p}-ZjSe<VwA(I9
> zxK(Le0DS|V2DE=U at SVazGtFD;WEmK=b&9M8q?vZ#&&#^I_ at d%vg#VlrM}n$7idM$u
> zUie`)6P4S3{`JRZEhLJ&bqaKya3e!-3owo?_&*vJ54mQg2KisooB*!!rTzSCEi@|4
> zF$#8n27Vo0O>V#ZGk7}u&w`Ftri3f$tb<|krJr?hAod!+A&TD+)cF<iwKGG84Emei
> zkJ(;~XDwFoSaVWFiX!^~9uqL7{h5=k<9s((XG5CB(E$!T=8FUK?+M>Gf+ZJNA;x1r
> zpj$!5Ve^s$uYj9)J8-h63on$d{{<)0PAGi*+2uIJF%{w$HlXgcc(&tt3(q at vw&Hmk
> z&rUqMV5x`V8l*)0qnH$nV!s1QeWpAF{QPv!KyP9<2Wg~!ph9jyE8<;TyS7X1`_LQH
> zYxHW+qs7=W0d;gOxX+Wm$AMQcoRTzdwXE^swk=6V^B;X75S1nFJ+xz$`JKu$pqWj@
> zZjp$&dJ*e}g;pLMio0>gw9bTn^L1iuYr(uymLjEl)nc1y!W`Kx#~j8<4YOl6(HTU!
> zS#@MQPCXpx9 at i^v;iV6}z<NWE0SD3rZty at 7Fm4sji>2@@1vbdyHdg6f3 at zZLgHoFp
> zIDqaQ&n2SjticV9p;GA}Xmy%Es^@E>+WB8sWPG7*vaMdGQ#Bwa)(7OSqF5EE4O?oZ
> zX5>3x6mxB%$1s-Pfwu8I<%scX_AeGnU*W?SXgo2N`7dHDfzLAWCEv#Is^ntvC19C?
> z*zC+O-{cy5R6TnldkE$9$Z3#q80uf+8|hnt*g8x0*Se}cu0&5?`~yYClYsA3SAP#+
> zvuKu at Eyl41SE9gptE`d^B8LmI+LC<=@<8QGc>J%R<7e8eL&M(?-NipWI=dE$t8BGK
> z)QH!xDhnHK at C;F?6}Z!-XPv^+)Ih!sVX$VR2fRv8eu7mUHlSv)5jq#FolaC}4p_n1
> zLE=EoGqM*g#y1Q{p=FY6Wb45deo;Bm$o8Il at 0IiLo-gALRJ3rK61%E^EoX9n*UZCw
> zvwBUsYbLDljtvY6$2hRZh7)~-$pXs6YV;92-U+D_A+w)#DAEe-#pVG8eO0WvU$x26
> z7k4y|bB(nLajejygQco)|8OGGzIZilEu~eU;YK-ydixk;45K|!(|U`q&}!6Sk7rd1
> z7OjTsMS_a>HxBeP;?7rr%W^uiU*Ya%P?0Oc9mBf%Mc3J{)|JFWlRsTbvj at dnls8Gm
> zKZ#lYIOL4~2+6bilrvVCtif>o5%v&Pz$I~H>rBL1<R1Z at HoaM$e$n?QlyXM#y+_LP
> z>aK}3M-t5AE5q;!=MK$ZjC%sCIay9lP{*0paO?Rh9((5{^COkv!+?)mf_LP9tEU$y
> zrNX~qz5lBA7 at La+4X}=#xFe_40f|wQ?hUE9^%k#YUNNMfK;7G#gIN^3I*Z;k-&T34
> zRRC0Vqc=BWrMo4;dr-pdo~Q$A2z!&D9pE2!Ui|+Wr*Ijr#LDkIT3-M({3<*zwr=*1
> z0EZ{8GnFhN7Z?-S(YOL5>prS=rOAZn at I-^QY9nvV0Un}bR31)6(Ub%JOG at x;tr{gw
> z4Bq{$BxexQ&IxSaph#NKn4g87g%-8Slj8_hp;Y0h2E1nt*^82hstGyE-~y+RxyK1Q
> z at YynF8SJ_mASY*1-fr~S#@Q-WJX-gipkXSwWBemF=XH#q{S)_vbXrJ~;tEXOf)=5m
> zxP0}AfuX<5?#q4Di(9=!gJcCysF1j_N=h|%%v$VW!UL%)seSeW?vMyUeXil+Yh8Sx
> z2LE?ooFvM#K7{<(1(|1Baf(OnzdvxfP7P@<!^Npmn}_c%^AD3cMFV>kK6!xv@*fR;
> z0Urp0{=B)!7>~Kk{f{MOo&i+M|AAiY5KzM)1%|fFDOwWdSD3u<fqp{eU=^S-W~Ceu
> zl7 at 5P6T*uUL4nL~O<fwq0X51wl4dhWsZ^-Icf{Q@;lt+scRmWa!D7*5POCfvnZTLy
> z0Gh`e6Y>5Yb5jFZ;AGHC46bggqlsOd8~PDcmWf!K?d^J@(mV*eN+}b(YNx5UJMg{}
> zG#j*12dER{;2F0zy+CAP^!S!`eJ5_Gns-hNcb9dkt(7b!8jNUj;K-gdMQV>{Nw^P)
> z at oxoY;9Q1YK`)4b>49Ju?sN|+eGH2)3%Gct6~#&`7AA(mE0s2Aue8ArTW9J~q82UD
> zf|`G3<4|e^AmxRl8c5>5*Q{E@;h($R)R_RjWLPwzHbxc-G@$H<CD~fau>c=vv6iYB
> zR{K9_)alH)rth9K;PJ0_JI`|UkWyb08(Hu2n8;`b?!ahjsNU969Sh_r<DPJJ+;#r@
> zWo<?C8ti`lVX#Y}jCa6}J9(~iW!K*ixgExjEnF&5nRDvXqItvqmQ at EE^{7F4hW-2t
> zC&?cYOEcvda=pCfrTVH5X>Uc%9(OX#v};PF{- at se-@k_Q4~x_i_*UsJ^)xb!jGJ26
> zu7wPlq53&cgnCh at kwSDd)a`{!-LTBkYowX4{zu_bnSsW4yQq!UPzwsgnT`Ff_OU^Z
> zwGEcl(4J&M3a<k1;g|kSy0*V@@-y at rU3Q6NmY8}6^}Gm6sDXIvW8nV|B|UuKnD*GR
> za2H?jz+?uRf!tGOTp}7^i{f#_h(|qCp!ak@&$SKGWw_}QvL>Yr*o%UVErI0U4Uluo
> z-zc>T{t-W`g=|s6Da_zH6^-$zFd?27R|6Wxo>fyX0}JdMY$qxUtT-$J6;Uv&GdO3u
> zJO};MBPU}YV;n3d2nJ6=0mB_1BV`SCbnNwBHNM#CrFIXfDpERdXk+Uf8}7mZt`x#K
> zq!_1+A?|6y4aK^b*Mwapc~{je<W+&HID~g~M{D#>=zF at OKL0h0hi2Z-EZoUM<6v=k
> zNHlyKcEwwQazV1FI;!@cg7uxTkO!^vLPHDGTfG%<NjWiu#D_4_5X1r$os8B at V2=ht
> zWzX;VAO*ZEp3io2mTcK at ETJX7W2|4-r2$=5S2YK%NN2IGwNiTvTH!P~^Qaw=`~Gh&
> znba0(iH1>2vX}GKS-zTRJ-7dtcEq6_W5kjxEwKkb{>oa+LTl~c&+Hr$!H?I}=WMNI
> z!g-=u>Jk!0j_jM-*QUa_>imE6YHc`>V}x}K_6S{dq(68$;hGjMfLxUjoi&^@!#Th6
> zc3WvN6G}I!j at -JrAGE)2Rz}fy%_zoNSf>HEPZJLzg0X=vj9s(+>Ii~=14 at W8g2rn{
> zum){jSHlbIU- at P9b_kOy`2QHc1hhNpmv*<_LahcoZWE7ST~kXiR=DS-4P%9wcku2Y
> z&U{8Ts}I9&F5oL@{W=;KZ at krHiu#M>uUGsrZdXQZPa5dv)6P1JV!}yRTYxzTc#m0l
> zWe(E(t7-;c8TE*c#@qGF&T-1Q<=UBNK+TQ6t$8<2c&<9SJuG;8a0~6#ID1aQy|D at T
> z<$wuoK5%NpVV+UI!rL?ZZ9Co0b at CN-Zfwsi+1BnW=ytY7PR=iiB~&KS>6ersb|;|2
> z#I6L;($&3jUX|}wP!&><t`jE}C4JBtp)ZKV(sh|5(@xk!YQH&tV_X3<F&X!cLTd3D
> zND;P}<JYOB`4L%rD>O84f-{ij192N)UJF=x{^hE}ar3%WfAs&UOS4gDQS(cKVz^>s
> z7S8L$#}>?wY>dmSu_l9aV20MgWTy!&`yP85FtgCpvNpHIs>1re1WpuD9aV))gz!9I
> z=c71<jR*9 at DF?0zic1K<_JKGT@%ZRh<2B~GA~_&U0UnE#M&Tt3Ssp?_`NT~GrrgXG
> zrrtM1CqPatv}9EkP8G+NxJG&mJjcdwKG?CKOAS7&W)sdxfP~zdE!B%1>D(mI^wIZ3
> zkwK2&;H+=RoSgR2-;-4)agb~MK?5*keMMd_-VA(X;L7R>XT=t125hKa?EM$0xs$E>
> zT$?o(JCC8dSiq#&m?~H_XrFIe>m3Ts<6-c7$4BVg!THGj7)GO|+gYAp at Gkb#)6{#w
> zJm}P}m-|P~9_GY#JW2+S%*0v-{r8cA)u^XANENPAV+8ru!U&}sd!4!jsX#Z2ReDKF
> zXG&`f(P4-R6L^v+Fu-cRZxvPuE7HHczEc3cHN!JN)Z-*PrQYPat9cTD$OfDR>R-si
> zd>n_i;r2zi!11tZ at h_&`1pNp-q=(WFe|9shl@`{kK%J_}YtMKguQM5S*RHp>WmKF-
> z8l*;kqbS{a4)?Pu^e?ItPJk=CG9;CG%mDsKKb$L{_KyH{!h|$x;H(!gW71(sNJsx^
> z#`NBam^yFYvs~_zR@?>bPxp_&EYMM0gxVr4Mpz8B5UZ8WRi3i2>#YAK1&cpzgDq1Y
> zls;H^!5ey0SN>0o{KuLxk^U1-4&ULySvUU-IA6Nv>*X7Oa~!0ZEypYL6NFpUn9Hzj
> zg0gjxR~b<-tbD>j(0Qo#B5HK;awH~B^!=5&e>MKaZt0LWUN%I0{Uaog?@h|*;u*kG
> z8Krih)V$_QIR~Y#Qc8uy7u5*4UtK{LKSF;Py(0^jmQOemPa(9<kV|tUE<#Pwl7C6F
> z3%-IkE?TzAKLY<n-#n%CH~mFX7}p%S5Sb-GH)Mggc=#X-ti)*nnC}6=G2$LY=69Q_
> zx0oOkQK!y#5q*U4tMGk-I!jj-XJG}flNR<VG9<;2G|3Wxa-bc>bYjUbb}hmGL(%_=
> z at 0GB@PXJaHhZ3&-fAZS@=A`tUkPkGZ at 5E^fZvTp?JL01zf25qJKwP{L=N%>fI}x`M
> zpWKFYdaLP;_=QS*yv>OlVWEoPCHWNAQ_N*nib-$4#_;9G%!voK1V!}DE93)OavU!>
> zbNDRhR9j5AJFE>IuBxmmEwM1J1Z%E+k$6a$zi;4SqrVk=-Y+VeJ6gI_(orG168ss3
> z0?<U1Q3a+V|L`e50i4*dx^<`<PQpABGuLp*c+=^QLaB!9aGzc at bbJMcj*o`YJ$uOK
> zd at oMi$U`Rilz-y!6TQl&Gim`~byaCt13Fq0%tDx&k|y{JAbha+T74?($6>MHBnvwq
> z5?e%{bBr_2+Qt^msu9hgW##!FZdUVk(1&`DjaNM(s*V^`BSh|CjAd!VaA9eAPjvtg
> zw_Wvss5wj_JVF-c3>OyaJ_mJ6B_3?=5?<Uluz(lC?OKyY>?gcv9 at G|BuwDc<Tg1}T
> zPSLnR?B}=>82W2s*!!V)UBO`nNfCSSnQ^40A&yntw+a(q=CR`67qZ{LsoZx5u#3t0
> zEt%RG<AiMJa?CFS4Uc<Un8 at +I2yEUjWY+-)At~-Ft(D|*&bPv8lTNpHbwW!Fx?(!g
> z8$%lnC~uz^cCeIx(7OG4hf}aTkjjBS{~p at dc|vVn0vns9RGX)NijL~O2o?%{WNzVh
> z;juRG2wwY!*2p;($~+ at Xlq4EI>@UkgU*P>GA-jALzJJEoitk^9KIOxO;*GqZ2Iqru
> zTZk at i@42TxD1bfpKz0K(y&>`?;vEDAc;fJHgdC)^K0*h`;Fa8y?NRsQf3Lz_2*iK}
> zqY3B>idiCQB;1qWN{~L5DX-yGe6<+RBAiF8G%xf4?umo_axGfZQiVMYuqhF^HYlWk
> z1WIo9^VJW at u(un*7phC;c&v;rbJ8-atbxpu<_d*D(ozi25Fon|q1;m&77U^JUHP>u
> zSDAM`3nnZ1^ejk at e$$|@3p!=%-JpZKzD7k~K!MUK&^wTxaq+-cv>^d<R611(QM at 4k
> zF%7eQx+~KIYRC*&0_BKv-}BI2%KJ7&+9&?N>&Wjxj|M!jIfX2iNx9HIdgj-D;JUzv
> zpjmVuA7h at F@fTX5HpemsO7-jECvB+1Nn^XFE5-&Tzf%K6?Zv-fZNZYxNu!O;VJG9g
> z#t0k)=jtmdO*DyuSZohIm4!2M&jVG2L4otzth83)nV>iRLH87093R>BS3h2BMUD!t
> zM(+Qp<0$G)s;7;aVxYGAwT+D&;Xs>C>TN8$+QBsJ6lo_<f_=3d at U+Je59D_!8NEfA
> z!3!9L>5#1mhl|0%`U&5!!8?8!-+h2=yIM_=k(m1}tZ7}-W9Xf7$%K7ZOI#Ql%ekM*
> z`rpPt%}2?x?l}S*jXj!YB}R#bZmyjJm=pESfxiHM`B(nF7U&nj*ZC`7felA&75ta~
> z#y<=GM)-qFawYdT$ZF0K*d&A$Bcu%>$?yTh98&q!Q4OH=oI>MjaQ(#e$lNP-0Ye!_
> zb~=6?gTeYEeEa(51;wMlx2{bc4dWpJ3QAf~5VG5FC*Epa$YVTo=7i|X!CBH87Azw`
> zjW$2BZaPWF`KLg>dUC-+)`ni+NUOBC9dbhG_3$d-ZsYKOt+3RstG*;m6!|OpxW1(M
> z2b^!ZGOH#D#*>gUcfN$ZVES+R9yergn3V%rXbNW9DoE<|FRE4dRpuATif_kFurqLz
> z+w58^<ZF^?F3cG1?F)VVKG)_%8pSMG0ylTYXj(xJ%!g&zN_Aq<2Ck0;`TTV=!0oBB
> zu^Wlw8GOPakrW$n=^2nim@(Re+wRs)NAC!~ts!aqvt-1%&Jz=jBT^iqr`vnxY?ouN
> ztp#S=bAUL+XQ9wn{$r-Cj)qkJN67Qhkh1>>sfdO=`Rfqisy8bkEcHB~)33(c$e?xq
> zE69PGy at 2^+!g+47^oCR}{XuFr7PDLM*zj2J<iZrzt$1$6laFV*5yw<KGx1pQ2*xaS
> z8y-8J8F=z+j0YPbgsAL)YWooNl=K;DlO(OwHUriGZf03*WnQfTvddY0Oe_v%=ypmw
> zafLjK$D`jlV`m=nP59euZ+*JwbP5x>6qBfePwY<ZP8CW>#ADcTWXA_qaJXty!0(YO
> z2G#bLVp95mp!oS)$B{<!)`{B0pj&Cz2<di=7Qx8rcm$(~<>70=laI%W|1<El;kg;l
> zO#HXwdkdah at yx=1*lS?3 at lZYvJah2O#d8Px&JvX?QMi~m1*LdK+t05rhP(+ENcR;w
> zDq|SV-ak7^V;;{;NZsK2V;lArxc+KE%ShUz_i1~u@$qieU|!_9VHYEr7YA3@&3ZBH
> zBl(B*xmbNE$KoR}bnT;<ZCWXhtS12ar34S+ybF2aby{#N50Xs8uVp!T6UW)o<msfr
> zVKYr*p}R>^0&xIS#4yg!Kj1&Ze@`Kx65Jkg19F8RRdI^`)9eu2?BUMiM_}_+93|ZX
> zz3?QacRd9$0o<(@bRXqg;umr3yOyLJ0rzhRbZ at +?vVB44#n#O^c|3f0-0SL^**>3q
> z0Jp`Q`M7D_QOUwj<~WSH3TL&ceNkr*b`$K%xIMxsWL4;MCd4u5HOC0q>l0jGf1uvf
> z>`J9vyxmkI<u=;cq8vCnm$77*APLgx=43&w`_ondmKb6LOGQHU at Z&MU#EQ7kk89F*
> z$gY`GtD at 1j{~P!RPSTt<H^EU)t*KMz4t3O%jF|Lb;N?1XB=5kcGs&HN9l^8~<^2~>
> z6Jbr5L2f0G?C-<w7vtFy(HM?_W-1F^@Zr2hTFAP0TLr{SLcC<(M}AXT7%qz4Hyi_v
> zc8+4O>0*ixC)jQ-SeBdXI1cDF+ac at vh+NHvstnw1eJH1I<W~0B3z=HSQP-4Qys7U{
> z=k1b7n$dbQ^buI at eU9TuxgC9TYW+Q~nSu%ZmQfDrR#A(4OcPwVrAQqonBw#~eRU-L
> zre<-W#2l4QC#s8bMt9Ju#_<kH*bdu5;PH{(Q07oa9VFJ(KAbv&>7Xv at RB<Tvl<%l?
> zYwOMA!cDWcwp!pij($6Zo(DxM6sG at DhW}Oc*U&S`kg>MH^&+0Fff%BqW3Aq24^4U=
> zK1b}K%-v`OVe}+B at TB8prp<8z_4qi at AMfMVtZghDlX;ipqfq$TenrgBGbcN|i2ZlO
> z`z+GGaDC!4De*t0-o-f7Q19X-vPDXR9YMg{dwU~N6g8k3D$*_Ciwgb+JhtbKK7f+l
> zxSM#?=<aa1?c**j=2Q$$Q^&oaWfkdkJqSPhU&24S5?-`;nOZttT{m|j*$>O^lyt5-
> zmId1hCNT-?K#gzW8t5lg<ao~KmJEV4XD}U_Mc^9LL3;TtC$=5s&1tI+cn8{hX0I{d
> zyXt^!sIEVZySL7ApBN=oAjYHX=DaZ<#!4zh!tn+P;L3#kYt;d?&jj5a at S<q{2TZNc
> zDb=dX52w?)-vm3UlK>|MH!#p4ObsIZ1dkpxFavytD87Q?%X^F#wGO`dXDsSC`gSOx
> ze1izditvTcEovkA9xG5g8Rd{n|GX53V+~^UKR?!67N!~?Mf;_aPS+s9%BnBucJaV)
> zAH`fEyDrW`rmCFAthn!TTH+y-{rv82b%1fZ_mL%_U2E$&@f&>IIEAY)KkRj!&xX;=
> z_5I*mFRA?N{lok*O8mWbDx^Awb$NbwEBWktnS6G=Lq59>(A~LL(kr3OO6cE}(C>oF
> zYYx^p*Z-5wDK%o~i<&Ya`?=vY65dkH3cSzMtQ4|WTWeO~{RYU5(3E?g-veq(a0#HW
> z6OeL)m^Y2H@@NIK4zH=)Av(Sh<3tYscrl**;PbJV8uf{b`Wz64M|})YpPgb>)F(FT
> z^D0iHk$m*z^X{iR#A)mhFUCZ}e-sO%{rCoacri1ee|JOFr%v%1iTJ~7*bW_RL47R#
> zAzI^oN-l#bmztS71nTeIHZdOW1!5fDe*r(_{O*lnEZ%z{QE-0urzD}X``==M{rn!-
> zF2H-FGD^2ns$IXQRJ+P3)vi}5)vhK=wd)H?wd-d}RS!D_c*D{e^jS9qG~!@<*E_*i
> z3+DxYBp5E)Noo$T44B!%j{!w~L>S$PlOe_0FMsrrBK-+Dk=Q=~w`8$}>$z(2)pOOo
> zR7U+!<vrG+UiNPn#=brWt{)UvE?lP+*UfOXD6Tso>$Bt4gGehY?fOP}{|n(4D17%t
> zxOx;<7%nBBJ-9`7*>~i(2a;&^^OdkXgLeogkn`*Gejo5XK(HWq>SzmK%-lzTmB+gE
> zwizY{-8)^a9{X|J99gq|ugd1&1)?79T at H7NNV{*G;x5(H!L7!P$0}&0heLP4Hwiw=
> zus6@%`(pjPsHEW<OM0np&%F9SU6J7oZMJ2p<j||+XB`Xa&&`GD#SH)ES&RXFNqVA8
> zwutC|NjjSjw|URJMm5~a;GWr7M($;-Fx|=;%bL`- at qt8=j|+WHk||B_37rUik1v0*
> zUz60tmq7NuFuR43JM?+zNBW{o?$8NKc0h-J8vkd|W-~XfXwpRDo?zrw;^J$=aUD7S
> z2tO^-l`64sZ(7-;jl at 32$gRZ2*LEjPLKJ&tQw(CCRAS%Rw5lm468jTIZY4Ipwt{Hv
> zRZTjZLzAV%p3zj^q>IG<f{|N^jjyesJCb*KlOC~)mDu++J=dg<#QutrTZv8I6QK+E
> z9~%&wR^y#dZ-j;EYkQ)Uaw50ER;o2BIo;9pe3K!P(|3&AN^E>>Pn?Xze!eNrR;m${
> z*z=kyn&Kj{Pcd>UvGKJ%As}}6)%_Js at wQ@3n-Y6bS-9ziruazwHptP?Kcu)oU)uw2
> z%Aec`wqk80|GS#jG$lmhcQSG-vGKLxP@}|N)07A;{%$4zyPMWFB?gAmTZu<sYTw$X
> zNZTAul}*M-ZpRt9L!XE5f1kc5!fE>|oBAlZ%tpP|HT8+a`#aSV|3aHXe`{RV*aukX
> z at H$|jd)Mtv2A0{4S?<`oes40qanY}O at A}A!vi)9;v-dbYBk16G2hw1Lb3V{)s5iUD
> zV|`2yCGLUlw(kCVGo7}lV?`an8F`Nxa&V1UC22wE-m1GvMpxieDvI6Ek5*U-OT(U}
> zfpNWtezvSwhK at +X-l)O<fi}BL|HJsdtYIVmJ7U{H359GKYuMO05L)z!zA>Sdp;sH}
> z-?MEj&>yZrR-u|<U4^l(HZ;E6I4HCxw3WU#Ayz=_i2If-CZwBmLWVx2ER4{>R$<eX
> zRPM%2jf0g`^j#VHq6uHyR7Ux4Y8+zCs=X3(TjMK at LlE;-`l9xwN^QtJ)e*@*{W;42
> zmByjgtgTm4)iiEy9IB+E at 5<25#?4Jb{ilVAFQhbWZb}1nH;lErqv_RsY1XVAES!MR
> zggdMa|Ni|~8`G>pQzY+U&!sfJ+Gw&l40VCNjqXO1QfK;7p7`2+SH}YV;7YeaASv1>
> zO{mY7#`MsdaQ}VyLJF)H at wbv+q(_t*Z)wbk#y{NnT4P4&F01J<%@cC3M9SCpX4r&8
> zK`^>?Lf;iBdtckzAG3f?Fm-#Y$-Rmd8dtKt)s6kFX)%DKg~n6(x3_;N!Dckzbl(8C
> zEpe at 42Z4^Z<kQgKmLjtC8i9$s at o$WEFo*fU(fE&O*w!$H#=ej>Y- at xC1#!AE_FEgb
> zHC|tmjyUOTcH`TP*P{=<Xu{W))t at P&@pj`_>%?BPp5kzq8 at D%(Rr(%ZKx~>3uflI!
> zG>@3ZcN)i0Z7bN`clM5>+Hx}L_D;ii%*17=Nqoaja!(gY$Gc(Y-tku5^l&JFT;P9;
> zh)b>nlAoZ|mDIAGxEV=khQ46Ua+@(0{aEAl-6|NL1D)n~kfCke{7WeM=GxGvUx(^{
> z9lAY&MdKDRXxV8XtHf4xXgleqAaXw_55#GKT#M;$-89&{FvS<Kq3S@~rflr$4FR3<
> z{UE?A-xG-W$C_;5ku`X>)=a>=wq_#UZ`A;6&EJOS?V20#-d-~q?{{i&4uXXT$jJH+
> z<6Y-_8}E0Sn#JP#9-dur6JA=6FZfvbyMgS-LppdL{zLCaFlvZ*^FG;d at CBg1MjWaA
> zJQLUXrh3WJMZ^tWnz+t8oJzJPdrdXjF7Rvf4?rRi((o6Pz^Q~>T+Mp~DMI}bx5}GP
> z^KQ*gzQ949q!L(MT!cI4RVSOAIQIlE;U;yWuYnd at L-xULg5=p!$Ur<>cwue5Kf^b^
> zHSt-toK>>T>@~KHy~i5aLH3!dg?)|pwZ9HFft$(Q$9<++&bjdZ_3u5dkvj<A&$%Cz
> zFkWTC?=zJ}wOCb(@6&kJUz28&YQO5RswUgsbKjo>C#Ww%piu?DdGHPbKErfgqN;_&
> zfD9j%;!_)FM0}=e5A0FC-v!=NzKww$%J=)gwwi48lLoTO=qubLR1}z}jPUWAY;Q(Q
> zcFiAK?}v0 at tIK+nmmt+^P4 at 3RswX=W;HJHgGizTO8$a%m#;9#1Dk`)=TG9J0#2d{&
> zj#Ce)bNL?yo~)Tr^O)~JpS$MqP-4we-#wtFe;RoBx4yv9@&m;YUxCGd>$K{$BG*`1
> zGqL7z&>oo!(vPd!1G6zsL13ga?dPAXN11nHZoX+74Z<kLfn+4;YqEVUSd9aGFG1sj
> z1twFgLR$h8l&?FGNxRg2e^y#gE$=Dl2n_#iZP0Ub0|Tz54A#6Wnc6dq-E34KUg at Wc
> zH50(oJFcvP9%U6=KuzXFYnO-GJpf76Lejf~RFAR2utR{~<KEf7EsI(u>B#b>y}1{1
> zLioP#oubtC74JmlyU9Dg2I~)U(8e+z_V9LvZYCH3?TMay{^m_r>hq;{2>Q9O8Mc~K
> zq90P_^abQq!49X0F%SQ9t2a*hwt00m+2BWO*DKs<F*Z_Xn)#$-2)@d9v<7N$6B|Fa
> zL(>V!pi1okwWTu+ at M9Vz62n%;)q#e~w4<RJiaXJDV~TX)Oo=3B!`>;1)GEa>(JVkO
> z1$uSf(UElQl(*+fIIH*KG*4-)j8%GlSKWW`p1JCt3CZ{?af+|zXN<ZoqV5^dRV$F@
> zMTFbztb>Mc5yFmBm=_c{XI<-k`(svXUy`amJe;^!ixL-wtgvD=rNAwQ_p(r&z*74|
> zPC)G(>9j>s_TFYcU%njHh(}H>P945i>zlckbAU&WuNvPtd{y`weKYY+-phP5jjxNT
> z(1IM`f0nE%iUY}-q6i6LF&*E*$n9~^oo71Jp?_!+(|ljksTuaSS<OVqTyigt7Q^_e
> z(93bYJoAtjHbeJHgWSi9da2l(2}pk3E0e at GDvnE#TNAmC_%2oNf`48*W+FRJ7WTBx
> zocO|K*w$HGV*;@-S9x2Mx2<Bn4p;TKPQm{c+`5~?cOyr>&e^-btEzLZz8TU(uwS_2
> zlD%i>S3wUbiLy}o2R%u1RDVqJ93AtcQVt&p6W`~FJD_ORBo>u&eW87w`tbl8urJ{b
> zraB3`IDt5?79o0s7(RwQbx6;ygq07R!aA;xe7|cCx?49#G)JtX6>X2vG|ubL2I4ed
> z4I2usGi24T{LlB&e|kr?PCirq;~o8fLivw(^#8}of4rNMA*KBKW(zdt^$J9L0ec{1
> z2F~40JVxvwFTlM&vTsV<Q5ASqmwQLkO2Dc8Y0yI!Nm-!sjsd6eF4)qb-Sah@<0%%l
> z*^DYS%OSrUECzq|X~E>yiLy-%g1bqdvO8l_MWAneJ9O9sfrR=6ptqL?VpYwIIZWd2
> zfChk#Tn+`pLj1C@>RtF4#X`_Ie^h)4lR^mg#1!+rm0z2-0M?xp+23Pq#(@lct|hoz
> zWM)7;OJ=e5 at Q>fwjN^e{6HNc^CZaUW5=EWOWT%*S!*3!a6wb`5Bfs0P_(22MUNXy#
> z^gZ?kHshcx>4$)xc5c>5ihI+QxJjUE&k$gz%%uUpe_Z81ZN`aL!l1Rj&KCZ#`tlJ9
> z`350kq|`G3|FgovEbx#9yo5TgB1+Yd=_Ff+-i1^ES?@`PZ8`T0i&56q&aj974Qp9x
> zKM}ubt^qWKp1FzCq8~>o?|kKLQ{Hzf??Q~BDL1!p-};K2Ipyq>CO4sQU%9Gvb47Yl
> zYWxL~Zx5Q#dtZH|vE2=h+}zbnY8HTdl&#QYh(=9caj- at uCTk{$so at VKIq$l`s=U-q
> zsyy9bmGI0aRSM$lUzdVd`(H^xy!|g7*s%Yv&6>RH7*AmbWAai(p2CwCh(kVz$<x6f
> z@$fI at kR~*}Y()d&gUgW{s+aNvj>YAquT+Kl=Wr`yQL|#`GW?4F({Tv&(Y;;3dwk2R
> zS=y&*y?KS)66-iXEJ)6U>iJU9n8OCDTxY{alHsP9unH&?EmlEZ_NOz%%f`M}412oa
> zpIcU#avv?+w_?82UXvwg#5lo-cBSx;5<c+mQFW-FY^ceW^)(ZB{L$4<*0_I`nETz<
> zVI((Iak6Mb{P*T%2i^^~k$zR~?81GL2 at pzsECGEzR|l at I($_*w-)L_mHI1ue2wW0n
> zNC29o`I12dCnONWO8Ot1=~T57C2mJHtu62bJC#`J5<{H%qBGDHjrHg?vABR&iN%TF
> zYlHh>3Va at oHTc?Cz+HDLxvB&2Uo9K*O(=VRbQK at ICcY}LEgDNDMaq6V8tb3e#L@(+
> zqp>tpL&+H+IvzoU&^58N0Vx_w8*RsmNGx^VUt*ztU*dt35?am&9*(BSlX$dzdEgI7
> zLH#rImlTpNP#BG+i<W**G*;#{vGjo%(OCLuEL${I?k}-^ReDTd?A6j^l+wpVQ_TJ)
> z1 at 2cJa5Yw}5^G>I)_uRk`c=NT`y>Qjft-kOPmI(BKKap98-A6Fqydr;>c<!QiDBsF
> zh5^mOOYv;O^BJB~)K|HW=Hmvb at b`2Nq}tS1&E|tz`gEbOY&88B6${QrH9JI_Ng;5;
> z=sl0I>jC?<p<}iwa_p9YwzTf)o0j|5;VdSDMQI6 at gc559Dshh~@mg#oD=@c0wH|sb
> ziE at denO%!njoe_h2{|357^Ge7{`A+n#S{y7S+Z_tT^=xtry!MouBD&H;G>qw{)Kpd
> zf+L_J8HL=S_1l{Ozg?7b)ZGmCQMjp3jsthv1YH!hlxIJ8^d}rC)!+{doXs<B0Vgg)
> zO+4USX?%X-tN6OXv(kdQRlJQwW$Hd4E*Eq`oIwHD_M^zL82$eYBv43Wh-Tp1)|jSc
> zQX66TxliUlhdMi;4V74V8ZI~WC){ljPNp~y_TOdT^5y0wl^4tp!%B`#ED={CbSfz9
> zUzy|AZzUe5vjX>{4wY0Z(h+xGt}A~(p7+6LI6#u!Y#rIyTX8>RCRLEr<?+?vt0fsq
> z37iM34z6VCp&y<`jW(jJuThr};n;A0+lw7K|7Ez&;Q1aoyYXzn^O{6w$^cwFcrMry
> zK_6uaYSjNb<Z}_RFCm{|1q(IeeNl?TyBGdplt}WO4DniWYx0ld`6xFbjj+vbe1VBn
> zo&`l~4RLP}=LDXQ at f<_ibHukn+djkN#q&9yFYuhg^Ccb%`wmYBp6>y-^>||O7*LuB
> z3`Y(3csyA+jWF&L+>SB2mqU*Z0XKK3Z)dM6>V6Gwb;K?H!M77B6gv+1rT|-+gzr!V
> z4 at 1A50}rofD(Lh<drzAU(#vn+anSDgFE>gF|7%N7ra9KS8QP7U&7_>qE=mlT4%x{h
> zO>yX!k=(dvIG_{GeEHBj>1>tarSyx?qFcW;H^Euqn`93evNKEaH_?u6(pB$rF<~OZ
> zSya*Pc#y2URDK<iLZ*Fy@{`8|$rAPj at X+k2Pw-#25x$lG9CTu>$lY}DHpmtgV*jtg
> z^Wy)S_u^~vc1HFXwCYp92Vkq_KUcO!_0S)3osHC?0QS(KlcpAV*ppFC#?e-9Bw4V~
> z4cO~qnu&|CN|A`!9`PkPAz5Fb7SIQjPBbCLVw`$g3e+4s8Y`z1EOoLYeHEHSixlJ4
> zc!+|5b1(HGTvyM&z=KzSPxuW<PT9{(Va%JaiDG(1(hCx;^J!<tZKKK9?;o;easBE4
> z6-=5it51sCM|7pzSS&D1_A(^EV1b6PP4*I2G=0|v-8MFeorLAo@$?_N&Om&H8bOhZ
> zMcx017{=S-CoV-^NPiQ>dyr(x at O^?p=TK-F{yj at FWk|isg%ji1K+s+NQ^7)x9gZm~
> zT?Xk<h2{WFFZ<<N-;c^La3noNvI+{Plk7^(1IH$Ob~Nrkc{}I^=5~Pk6+ZI_b2J<7
> z{IkL>O0=kF8LD?f8*Irs8+zs&*gRT- at FkUy9sS{Yl3V;?xbH!sco0u>_=k}s+wjBn
> zLO$cKj5GQRGVntn?F8;6>if;I$oK4RkuM~vlru-~bwRgMrtV6gT$%~}O56?RH7ctI
> zTzE+P+#Pfij#_nG8d0<u6r|x&ygleUf)Qgf at GIb?pyS1&E?s{k{I#nY?U`<2#X2t}
> z;PmAGcGL$J at Mt|j$_RUxg$X!ibSZl5*cTDEAH~J^C9n!3G-p@}{eMBJgO{wYV$HlC
> zwMmNfHe&)Pg^2N|NN&ZH+mqzR_m4rbgYVQ)EPEu at gOL-=uOtDEUzG`v;kreU4yeEC
> z+71`w6v#qh#E({#qnM>aKHby{?Ny%*=i402VmhyCYjb<`IL(fv+abhJ)H^V?!scBN
> z+d46~6wa~7YUEPv=hCkaijW9g1o?q;SyLtO2etW%dyGVqf{Wlg9<ykUZSlr^yh9~A
> z7RLYh`7l6hvkg*n$!xi^mn>k+F|yTh6pv at B<@DeGG{TmX56M(whHoQxa<NLJ+{a(S
> zJ%;qXfSgdq*hzqPkz63{NivmmVvA*;^u=nx8A`=IA(<V9Q8eDcK7mgW`ved%iG7(!
> z>6mdf$>qgDs&w3edeMYj?<8v!wBzH>5R#uBa^P=(W$Dm}fs`{~+tAQ)n at Rtt!gTeg
> zIi}^YB%7eW95kVK{sgS?Fyy&+Mci?7;jXup!hh-7&A_tv+KS;`sFor3xd-$9+~ihS
> zhuZxKbZ5sN(_77NEteq4gRweJXXMCF?h|BNoc41gz7<V!EN;Oyv88*sT7B*6x1P73
> z8>LW+$xa;bsLW8exZIk>PFaMwrQ#y1z$QbyYAMf&6LIF8l+#D6vY-3x4U{2LTY>_m
> za0+4uT7Alr!j|Ud-s2HD_buYVmriWBA2yF-ox?zLVr&x9JyhPsCy9n;P?Xpy(PkOJ
> zkTbghA@>Gl+#8T%Ve6N^Qs97WR_$}i4%QE at LI-;IEj!*>@JWSFG2F?Dj{`mf;j<V%
> zrSR#)D&Z=C at 8I(J4hJi(eXzU?;ZG-Lv7vA2H=U`dgv$h<nHw`|pR2{$s@?>fNxJs=
> zUFwYkS~t6$8wRc>`2d<V=UQ>{uNQbD)47{rtBK!`v<ADx=02;rb~PmCsr|*fg)Pla
> z(`sM)x6b+E2coKcOjoR!@4pxJFf<a|qYt)~w|I5p&Hj5=A1RL!uNQ6pd-oiLoOdzO
> z<*h#5e#W`LIZQkx4imW1tSd&eQd%({sSM)HtB?5a6%9i2CPwK<BLlK9ZJy-%^a2O;
> zBu%njn7b<Isw{s^FxBc^JIi0I%Bg<J_0%V at zZTKF_6!LM(jsSu*d{i+W8Jd?eMH;}
> zjMjYv+jf2HACz=e54nEqc%akZp5T7mF<hkm&P5hUl^s+L7Gqpag{`@dhPwZH18-qE
> z{*SCr(bMXQaO;a^s>k=9v6OBa?i9+mme=sh#RTU<QRiIlOh-No+YMbNXtkyB$xH{W
> zEJJyRsN;u;M)40K$qy~VYN5F{B5rsuZy7EwEw^DlBw&}<VTQFyF?duY6A!t&Q(*~l
> zbHtSvp<-$74$RX<<qz at MV(JI|#5SZZ7MD6R1WhXQw;<<qPrQ(l%0yT=5GT<+!Qnr<
> z7}})5!v$r}oun;xKz7b>rf- at gW{COXxBh!^LqM%YV_|>N!M0W{PcHo)ZT-k7zc2yo
> zwtJ6OsC+}<lSPBAGO=4oUa1m>)#^ft)--k4wJwwp>R-at;XQyaquZ-u>qi#gA9$A9
> z?%0Ymd)n$(+EQWXDFfE!xTK&kVYFVz7_Jgbv4dSd+G4s{dA at I*U^1veB?8Cud$gn{
> z>6sJE?|4A`wllvY19qA%=06`eMD5okiG6;Ts=kR|D(W#FH$tB~$2rDQxoIi?xR`om
> zf at +C4c+WSGY%}*b-(AtOT!dyQ`au%);wV5W`DfgB8SX2}p0o;|@Wf!j{Y*uA?K6N?
> zhj^3Nr^uwn86@}tR<ItjXF<@N!<T=Al`mcJ14)Y~29GNE0p{Zey$P+G0aH$adeLpk
> z(k<QcJ3d|1S+nje`G>}l&P=s)py!+QRQW#)u<qK&14s$k4b<iG5u^r8j?UC+RJQrv
> z0|%_^&XQBfHvY3o5F)h^q_U|v(E)05Z7gVEurm`*-jR%vH6dU2RQai)a0}RPm>3s{
> zsY}@de4{qjy&Bv-u6DKZ<)dF?^sA~}jgnD1-OESy4<%CzHf-1eZLK>?zDf$Dh*m&A
> zK&8s1fdLynL+uj+L$>H^2e at P38ko$nKHdzg>8bLs(tE9<Xc5YnLdQ7@#YAg)ez_X3
> zV-Rjn%40dT^8s~4z`>zqVfRt;*~7bIYrn0{pmj#I2y)X;6zM>7%#;Qn&4dJ1v;ExG
> zc at 1o~mc?{)a6c~%@n$HlmG*NPmqnA5);ti9bY*R<e`c*=PxD*P0Y^AD{O_Iw$V#2t
> znv1kCj9<ewh)Sx5VF5}d4JFMeoV`_n34|j^Z+W!!ob={w4O2sIxER)fX5Uj`Nf(Fb
> zEYPX`3EAFzD#`_hd&8l9!nx;Q7ZWSy7v*TWkvb2%^eKW2{yQs9x*u!K>2|IdEw!yp
> zhvk77NEgys)#c6XXzx<Pmcf{APBOXQ4H!W&k0B|#4%G^wOY0rb&AA^7#IMLhc)I&t
> zocHx&n+Nx7xgRThlTjW!X1^Z(!uw4mO;<1Cjkx$%Z_g#ry<y**NrF_7dmn0 at ZA7gr
> zRJb2Nr_{UH*hhrE3Fz6QH9uoVC8 at Ol?lQUEer_;sa{_nh$zU<fI8nA5?<|3y!TvAr
> z&;83i9$~2{^RRa)r3dC`y28oIUFNDTHD-QW?tbieHpd5mWEwG5HoI at kF{Y|ICcv_m
> zF4$J~e8V8na=Z5k4TJFv*<-4Yi-dQbMcB}2SQ^4idrS>O>fK1sQb85}rGAD7P`_7@
> zyQ$ud)V~dV5TR=v8c^$5yWX)|%&9oEBCo5FAg0y$RQZ>|Yg&*<>o#2K{fTB6=9ubi
> z+0_+3THPnQy5skxNsEX&A*I)qiDeQ_hL;Zqmt&1DcWXB;hwWeEp+q6iSPki3gImA4
> ztjd`q^ow=J(p#Co(1Ss5J`BCm8uZqPW#JAB%Gs~<*y-H;=+VjzI^n}NXyvy#Rx;RG
> zIq-py@&?Lu$KLq?3lptU_*SRO{b#7#Gs>-}|MEb7GUMvYf8s=Q`OP`m4XPYVjw&}H
> zjNSQ?ue=R5dEg3V<Y^liZ0P8i!8;T)GKX*y%P at W^R%j|L*C&SmN%`fd;QCUSQOY^A
> z*nw`wZsM*siTlt$YvtqK?G??gtoGQhderQ&%(usMy^bC|t*lJKm`;f at u&QpzRxafs
> zN$B91$=!_Is?X6ruwC5;Fj9*z?nP0nPe96!ZjlT?VlFV&n<|ZfZkeel2lxN!)CstQ
> zHAiLe5EmpB4{jz843vg>)w7HY_Ot at y2)FW#12%cvfkO at pN;%ChVEUtEX*+y*3BAL!
> zly<)co4||JF-2MG0mw1Vn^07&`SC;y+*-0<b}7{xhm%T<h6nxuY#gb_Lw_CE4V6GJ
> z7+MhoZ3))Vu73p3l%N^iWL2&}X6QL!#zUV3_DeLIS9DllO%wRtOKUc4-rC2RUnHot
> zk~*@Z)|^C1akiU*b6esVC~9*HvzN2gi)ue3>;Ep`1At>!@PDj9{S5oLLDx(3&C?I;
> z177>S`PBpa3GM^mJwUs-yUabKJOetO2i+_G8f(7&zz1+2+Ny%<!!q&xIP?7n<bCn@
> z*Nhx~Y|`P~-K59+tosn1O+L`Ovo~(sXlw_i=fL64zFsxL4u6PwO#6nUu7$)qv}LzQ
> zOf&_u(IYZiDnm<54ziAzPHpC0_joe<-E;Iy^jJ`wr4spBOx8*!^v$#A6+jiiSd5)f
> zHNw~8$p~@;ao<=$Ej^<m&3SX8YdJyPH|iwf+2Xz+Py9725B3g~eHHzF`975HRIn|R
> z6?Qsua|er3MV?X8giqv|n5O=9D*fYu-q<boe0aJ3Lt&v+bx;+q-t*zd$-B#hLSFS@
> z971A+fKFBaVHd0j&s2F;;Z=J+T;r at ZRV+RZs1P}0T~{upOW>H~?WOb2bx)yOP=09V
> z5oMAOSI637m<HM&4r#2_)QuZqV3V$I)UTj-xXqM^S$Rjk^kD07^SC>vi(1_Mlo51d
> zKfVa-<?R2}_AYQyRcrtF+Iu#0V}RkJ;FaN`qA3ERAdcgnVL-N^jfzTWfeKzuUN~uG
> zmy>&NgJ^_GIG~xLnR+ at pVv$){4WfnRvCC=B=~SGMV}(N{nidi=|L at v^W#|9?-{1TG
> zKcC-*HG8kM*Y(+JJ?mM|de-yAkMwrGufu9euX!p@|MY3_31Q{er1V1197b(7GzTTq
> zbrIb;rji95u!aO~nhX0dSS6BPNW{}!X6nOg@(GdhN*7?CAqjgx&`nK5DM+~SLVD+`
> zo9w3oJ-a<=r>baAb~Is4qvsf_fjxi{c^cOFDo4Z?Xa?2L^>rA1j?f!8VlQ2W?XfW2
> zJ^Ru2C{96Sd7LoZg`0bJc}~zLtOFzT8ss1 at 166_4)Gw#@ETU=U+|MFsYM0?GtuGxv
> zJ>b^0=F`%##)||L3!ECK*6HumIk!30CZ&*!SnfM%t+ZBWk%suv#E&Ag^WzvlDaSO5
> zVBP0BYK(M^_B?@841j`YZjGTi!;(di>-a_G9T=Rdl7ay5KjrDg9;_+tSW}J_ZVa9%
> zfxj-?IB<kQ?7&~&g-!?tmQ%wkpml}Tb-4uHLhx5o$l44nIT_s;-Kjr`bt|;-Ye4DP
> z<HJ#(2xvpZx2R{k!Cmn6lz0`HLwk!(Es()`r2rHBZVq~waR%U`qKFv2K9me?lZ-PN
> zF=t~ZNGk=>IGsPp67Qd&uhY0ADIH=8;u4I*Tu0&mv{w|(*rN+4AusaQ1T~X8XPfs6
> zKlnrCK8pRgeY4xnbp+OB9%{)?Wz>f?wUPN*YVM-S9UyDvzYfhZ>i7jD^zSND5DD9w
> z*=hmB!<kY at h^R0vC!sh+HO_U+6v-7zBsYO at A8=d(m;)bIGL^CU>J8oCk^ma0&oT5h
> zJMw6dN3MJd3!E7>Jx`)c^{lrk$k-#v7(L*FKvQ&^cu6uqKjnI~IYFZK5iutozlOUm
> ze*+UCjR&hh-7^OMKs*KD?r+tbM10i^$FCp%@%Rn>I-)u9Fm^4}p1%NI9BQqid(V)0
> z3WOG71x-OA1t`6R+6^*Bp4kQ1-e*#23(?+1 at zY7ZaY*UV_!N?7TELmmlkPW7=ZuK6
> z(3HZZnMQHbOe$_FxRt;RbbK0y!#@SRRK-~#>4GyflGd5jqj63Ezh=eZa|EZkX00Rd
> znwbdAbc6c-`$qdenTdN|l(yGAnis{dN)2X)uP<F*Hsu$-Y{{WbZSByPc<fL)aS<-x
> zfL<($ML6-#i%Z&aI!5zZ6@*wwKx(>HYf0QrD$VYjeB5?IqDa8|s?=vgw3YU@$}2y+
> z!}41=ztsCeShpfIFNEEiF>4f2Z#SpLgdkl7aeq&rAPK@(E+!ull~`IvDy;kN6Dww$
> z#lTCtj-b?kN3(5fI+T1*s_Kfe((dMRF2P1|=`)P`8gJK=O934UvDp1}PPvQQmoLtg
> zL|duI96H;!sY9PSA%wl8xWY|NfNpu!*5b>5<R=;jr^1JPu0mgFVdZ|bPt}%lg%kHn
> zqI)!fBH6aJ9X+~I!q{$X>;so8utWI_6IKenoo2T#byFalQ|i*#?1Vw>xUiQIZmC at C
> zZk0>a9k_D21eOyQhb2MVi at DN%=)Jb|D?e6VqH~mODKR{A1a>m#_IC6zm?xg;?Wi)t
> zYMkGJrkBpUe`($8*dZ-$PrnlQ0&~)yYZke)3aJd=*IrS?>$mfc&)nC6YsE|(zT2EF
> zz4N0;P-;>IIb`SgN^Rfs^n6jJqN;S(bfQrw5T?rR3v+iLCX$-hi;v7oA%Q%rR#dBS
> zvO0h_sAG0UIkwjtsusI{6e-SLA-370Bqc`oJUZ6x76J|k*@QDmY9<gCMvmz at 5x5Y)
> zjIBsi;Ew($p66rg3oDx{GsL(IgGkDkR7K^7d+#~?B;T-Iz4r<~M=GpXvU6q5JTY>A
> zTGfGyvQnKyw%He|yqbGLh(0|+R6r`9xPQ*k at Ep~UDv4&zcHJcr`swZNUn0yvvh7t_
> zZa27+0TOR7Y|H8hJ!}*WyDwD~qD}tl1k}>z_3}xTV#EaK+q(hStKHupnhH8c=~7|7
> zv_U at _cu&yObgr}NRsd?Q5T}W%TcLBnWZeHajvcCdN+d&Bd%4~A?nZC^d)|4a50+-x
> z-`Uo*aFll at gFS`WD at Dfs(d;=QTl&52Tg3U+o1)7W8NfT9+_TXevlTT^Rp=@r%%Wb$
> z>j+b6*;>RCbpYz9q|%3d)7=q$yLnz6(6^lD+cd`$c;2Nsp6Fc1^Yt2juv%9YWlIzd
> zeSybe^FgPpJUjbA!pzPGlv at rNw{+q3le$9B|J}v&bFfx^rQ(G9C0H;_Fbv`iZJNs)
> zoDEl~_3mIEe5A`I&J*yRacd!;qPe`n`7(UXZbju;XZqIjC*SYw=zUytfmda2V6b}3
> z at nn8owEy}Q&<g~1r1rq>!ZFw(#wm(4gg~~5==!mLkaL0*MDd+7Nm3szaVCRjtaU!(
> zeAt<C=;1 at jSbO^&dadSc+mb8ls%ZGshaRo*YlHS7Ik!+I27-GNh=M<_R$B(<#M0dP
> zS1Z-F?V`bBzO)j4*7MvIuAKY=eOfflFSmY4=!tWW-*WUB`=w_)#_*r%)Zz}QzU^gO
> z^v3Rvn>?%2rcQ(*P?o3wA&zInKt8FFI3g>S=@~JAPt<80wR58IhNyK7_S7gHsg(M{
> z at x<uVmHXXaR;H3NqG({M;;{Odog)%ezIaY<{V&kP+hE05Ex>+cB<m{Y%j2pT*Jwxu
> zh+<4Wul}XMI+;|nL!v}Rs=t>dL)scTA}+10+<#>SAA5FE>IgNCqlzl|%wG;47slWW
> zp^lC6dY_5vTM!bAp51{y{zc_qAv0lVu%_xu*%M)Wu!NqF8p3K*LkT$%i_|*mlh3?e
> zl?tbgC$`e1)_o$e)^GIAW=c!Up_PU$)%gis at e<z<ma5mXv%*PKs#+6FPpaEM^YDZl
> z*ie+pZ)L$or7AgA*p{eC`&n^B#dz$JXn3NOpv at FWJ&s9LZ_&6FlT)`qLlJD<{Ijye
> zeX+NPQk5sCUAM!kVlC!%%wM7z^K1yGtZNC261DE0&L0}5!CIHM at 6#R?aL8Qro<vF&
> zpy%Y8))E`$z_EA^aYbWB3k5|r5ML$D1}ns^78){#0i86=<*YJSD19NusV?W9ITbOO
> zyXCl)0zl3oZas}hQ&vXPxmBT|&os<xAd_(h617AAE2s~%>_O10fEfuUi=d?`2r_Yt
> zq)gyM*y`b<xahvk64RI2w}96-sPps{*jJ$xpmDWK$9(Nfs8%}@Q9n=`%ECq0$mBgq
> z9oi~Os|95m5cVW}2kJ{MneLL1DWD{n&ap=SP4TD+j?%Jm4R-XR*<B36#>X!Q9kqfP
> zfj$K~3ibP-hmoJifOf!VZoWE9L+NEu6h1l;)L9g)Y0)@68t7VpG&!B|$y`uD)aE9k
> zt;5>24lCB at Sm=-g<i9|^@AQfX31k~!@B2|N)o}rBBq}b>w2yuZCOrO8MKjOsA%rMO
> z;2($Qdf1KM(7nnvs`8Sg;1%Lee9;~P>v3v!IE^he at 0rZ&BL?zeA|d)sB~*U_&xyWN
> zvt7D9Y0z{%kT1epg`$MYBw-DPwHW$9IB^;ST;JtK82ydonxXNEf%IBW7u_p`MiH;K
> z5vwptfk6v_>$~_-igVwjUkQj;q0FU~;EVu&K59x)G*_8TcxQaRITi2DL0drlHwx26
> zV(Z9)|7?#9b(U-6!Fw`4e!1eTE09;z$zdqvacGyX<>El!vY?gX(64M2N-3(c3HHrP
> zY8%kzr6k;hoM353LHlgSP at 1m<y$D3kqsQi1FNZ`|xGEWasG`I{q!{$16jQk3EUgo?
> ztl<}J=27}N8P+QlDe>W4oY)3<1;mFdntNt-hogt1J(Y`jrfw2=2v~Vif6pw0nCm8W
> ztLO;8dkdc!K`nRJ+w_|@fcK~nhxg3HJ3xl&GmIFB(wb?xRcH|{7b^tstpb#f)8SZM
> zM7oaUZ-~?a8qR$6aDNfw)7uCcTUY)D17}(@tfGgbJxOBoOCq89s=sIDzN;{<bvco0
> z4lG)LQogG<*5g~k!kFv(^H at vt*uV!hcv5|<JdByEcsmDgf5?x}`bqbI-k(E5 at +15s
> z`qwqxsNX}t5<k0?JwdeWo**~0#>!86SyMa4D|Xvefh*_=38RayqekSDIE?hsQAj<x
> zSFDE}QP&UkI{aR(*Wma2dM$pxJETTF^ZQ#1DTzKR{qkqp7pP>Mw}I05IGtW>45-dA
> znP!ZY_*p6vpK0I}poLS#1LCGB>}75WTNFEm{gO;!7a44!Bnwn!)SvXGz+q>1Es0_6
> zd!Do2qZgUzIbu+1i9XnpR}*W=8 at g`Sm)nn5mWIp~WAn2N-vb{c*UScn+fX;CW=F-y
> z&ihTnXJ8#px-tn$Bihu?`+ZNUEWoe}tKBZ)=A_r?3c5On?z0;2cWegk_yOy=lFS68
> zN!+$QlgHiSzrA$?#WC2AB%xnIYgwRRq&auqPuoSg71cQy(E|}4hkfaJ;6*+KUg=gm
> zFSt`Cpz#qTae$lM!;ImvH8^bsjd`jpK9s{Mh{>}l<oc|&g|es{frQMAvDm#*0v_-y
> z@=({s@;Y6QnjaPmjWerrWEmuAGZm6u!GL)#@CIGGHK43aH%_A{wEez=SjVj;4Uhv~
> zGlR|vx!@iQL9aO`j-+LIQau|y)b=~wH|`Qh$niVakM<JUH%Km8UP${#5B=geMH)Ku
> z)+*|!D|L>DyE>18C-WR|%)KaGwmye)==wDh_c{3_P?JxB!4c8Hl3q7 at 9Psn~kS9Z4
> z`6L|g40so&0Vdrq<0p5oc*}_V3nf?Po?1(0381y^>FxGqc{Q85%9u<S{O<;BKQMXD
> z--x$G5eBussmj4DWVmn!H at OS@BfZZ3mii~L5`n)%_V2ReYl4+ at Gr3JP(6hQpqBz<P
> z8LrSpv%u-MueOh=Y|39r{vrDJw%KeTa(T9^Mu4?=eoT at G-Jy`m{h}hh?n-oGA8d7r
> ziVB58@#T+vlmREB$-oD?i0g{q16 at pV2X+rJo4DvNGXe8JAz-q{MhMSuC&9+&Vr#_F
> zclC=4e37IsCw$41+RS>i>qS+T>21L{%{1(+Rov*cekc+?B95d^bOoCSxtLVGE;x0x
> zD>x=j46^Y06 at 7cmgPzp#iBD?NBeut;4+>k?dC6kQTFECqJ%HA&;zUJhduc^+#acdk
> zk%o^7h`q#4*K>;dA~t7DiywCOiV|x~rFFarJ)>5`M(;DFAqM+~g=)ilJq9a}@(WPD
> z;UGzk+Y;O-ZO>{eMT(5OQ}B>psEi7UvTw+b*zlcX$Vfmc&`W0QL-KJEBziyDkUE+R
> z<|jU>?K^AX<5pTG99dWK0<Cl3WlLh%I*UcUk{``6(O6|wykHrjj-~H#HjlO;T0`2c
> zwEoo#<l48ReBti$E2Bf=n6CT?!+AcU4$|Frj1iLMgRnnNvLv6)M0=qpDD}6IbqD at F
> zTtLTH@(IaL?&;pX1-)&VdEnzji>@$e+YJj5&x9q3?}b^!7LFC0ajpr!lxpecbG?hx
> z0Y2Mm=je_l#{I&696q0Np88`od+3QOXgx3no!JA4$G{98cA_pwQBG0fkEA>8PK&e5
> zneLRF)1Bp=OYX=Y^qPOP!wiU_YDxPh(IvKb1U*;3y{WQ^f0k2=g5BJC|L(WD7=A!3
> zsoCLXYj$+rk6j%(O@%K_lbmM%U1 at llhWCpl*O<G~0Fz{7x~K$t9yp9DjES(z+!a5n
> z+iUY8aDW3g&ucXZBp9=gjB_}|T;S6z6+bc~^NfIBK0nTzNqLjlAIGT`1 at DgQNuoTu
> z-}CLTy1fAHLOke8lu5M_?wD&Dn2`aWS;{bt%&<z()|rt7u3v;S19)|)Clj+2>ke&X
> z4p$n7IjUQuP&#Ng7CNCFJD~YG%8mLswznE&4h at wLnhX44@Jw=z=oZ0$ie^hlZ0(01
> z4o9qKTMhN=Opjz_fDTZiTr=d?{Lcpyg^WYNgQfL=vtWLP%vnYzJwcI?DZ?ii?E#+>
> z(8xkrIE|IT%bIkv9GC~rJm*$fBhj{j89d%(U|zwj5x*?M49Rf=(r2^`?w;(5V4+Df
> zUv2a=Ez7WA=Ruv%NeZ0lP;cO1U&hB{qUBoTnq;7M(5K6UV6M7<vjw<||B(Twc0~NZ
> zj1}i0WxhGxI1D{X<|X3`j>atRD=|_oafsj at T=Ksz6Y at Bl(?vtSEDn!;_NwRtrf(73
> z>8XD7<d%MpX=)F_H>j}32seW2us(%cO`X5|n~<3W{%Eu!qLIxVpzzYYeVk1OuQW5r
> zOF;YL{AMn8efg4M)|2gxuqFiIp$T4s)5 at 99GhE6iOWesNjnVwl4eCq|=#xZ*&{O at 8
> z2!JF)W-9VFZz3nHN1~1_sgLob9f_f1a at vR5lK6oFtgFGewV?y@^BL>G89(Zw-)}`r
> zsA+h{`cnk{)KjPfF`g3T*-u5|VgAF(>7em+X0wvs+jltXzOiTu(jLUP4bs-plcVR=
> zrbz92a1&oJjn`JVv75mRLC8}Gc at ZJo51E~_4_TaZ&MVOW_ezFCpR~tx{8HC+cu4)n
> zsb)#m1?2vz2b>_f%F-UBv3f~s4#7D$=tpB*&~k$CU2waR?{4%01 at 3iHhI5N#ac-4(
> z=hKw>MF=Q)xeS^EV_M_wrJ80$rDScj99nlM32S1;k%f~AN3nW|ku88pU1cFS{nVfk
> zn_30zK-_lVoEf782WKKq-oOf*w-2M&zkm0le at 8=FLaB;?fd0__Jq>9Y-PLG~&D@|L
> zW7}jmG^*nVLI{6?BM09}jeP=bYZUf2yp3v5XN;r9Godg1q`JYc^?{R-U5Zv~7t=V6
> z9WQDd&f4x3wcV#N-x{P at o+&OvBaz~ryfoHn29C5yG0t>ps?#bNoEdDS=yx1Avbv=@
> z?)YZCo at lOdm0C|0P3xKER?vKVU+688rrG&xW!K6>BC*@D8NVveQS96)t*{61%XqZ(
> zSx=m+r`1eeAp>1Mc`WbVXjB6J;jS*|lN2P4c#m*9(B>Ki+!06=Y#fOJUwHznBcUwL
> zk+DJh1b$A%$=VfdFLZ=dE&d{$Clx7<tn;CCmCOL2u#}e<fO{(Lnyu}%x2WX+ueWRz
> zEIk1q^uryyIf?`~bfEwLfO?#M%%;*)S--*j6n5Tl$T&;>>N$XR(5aRNW$Oc7_Aai~
> z%55SETr&x0p}SP{zs3Oax`uNn6hfc+CUm!qY}jm at CI*TXLhtPyz!51ZOnWl%J(3y?
> zIK!sy;heBt=hR9Hr at u7Jsbhmg6*iZ&IE at E+P<@H0hR^@H$_9CoXS1q1^xH*0yiwte
> zCe5HWbOz%+?2d{7xCd7zb@`<c>?z7$uJ<zbyKbQun<e5g310sRR8rM{LWQzc+<CpS
> z9rmOVZ_gX3O=6<~v*%T31!`qJe!kIAW^it8G}wjXPdB<M&vqU}x;2oM7>w^ZET4Eo
> zsog|L<N4FUC!HnLan3)&AMJbym^i>W0VfM#yEN_DSVQGm_rE1*`}WMDvJsGc4rrc0
> z<&-;5#H#`dTZUj)VZJF`_n8!BjBK6&t-jl2>_O+ALv-$uHFAsKYdjzp%G$V*>bIRO
> z(7QI5U(X=A6M8Ef)?l_toCF+;6R{p27Q)WpRa4+Ma_HSTqa^5gP_FuI$ICdZ8PK6K
> z7%U0koocvoZ8LTVdtsZY)f^ulP<9 at cVVfr)h9CBhh-zoAz26^5TL!qy_bjKD&9HZb
> zJhUY~EE2EM{fOQ=61#FF02G`Fezd(DVMAJH)=RR6>L5#0gui3v``SfarGM;zRfy&T
> zl at uZe+#Et4>gcYY&S6y6`}QLlKyf0aDKKUrNvqn3UC(eGRvN19bWNpu8hgDYfWh7t
> z+j)X=SOCqMew~%xTVGQBTy*vourt;<3HTDbuAWxp6$&d(8#?cE1=pva4?=r#zhSR%
> zRf=yQXIOS=zDmU2bCn<E#L!)6Pb<Z*fOIxpJ=15`D5TTVbf|v{_<a!yKWR*#4*UxI
> z*5GV8Y)VH^JJro8kWBE;*ZYOSAAmkHlD>5-=#y0skphDKEnVjc3QJJ_RJw<_aQ4Rg
> zp)W0~L|P7caMehMv+s{x at k6`~l)D708vZms?ESn<cPVK-jX}*Rm}yi2W%7LE0=^fe
> zbjff;l9ov3qZvo7pcTzWEk`qtPCrt1<lQ5i!wgjF59t;nwW4g9O95$14o^#~<sB=d
> zf7vqm&GKL0Ecx}#av7ckHB_^M<5k)weCvUz5%Oul=|RUaP+N+!B0L8;{@iNlTnu~L
> z^!YFJ8{L(50Med8T1d<yez6??B^n<ZMs;$EqrMdJ;V2`5iNqTNQJe{PSevxQ(6XZQ
> zIITi?BA}#R!wyZLOKqH6RzzFz8Mr0xA3*_L!~BYO=da1V<ZvrJEr)frwu$!qF1v9^
> z*%Dfd7Rbmrj{N%eOn=R=>UA8KYosT-rqE7U)j_$%n4=Z$0LO5-ykeBM1m(d-?yuAs
> zt<fn!;-pU!8T8hvs;F;bJ4Vwop~GNf-p}F&&pyv1twCc4b4lP41ZgiDW6GAaT4-*7
> zelbShI7cH5rz0NU3Sp4N!cH=Nqv$(I!L{zCr^GQjK9l at CeJJOoPcy3=qV<KeGrqo!
> zefq`A!26?L{jL;^?aURfb1`%|1m6|<D)ji$P@`Lk8Wpvu at Vwgx>*j^D|H*lQ!_%La
> zudF+HEpmt4Rf9Wuz35gUuVPp-ruER>m75vTcrNkMbzmaw?P84LwEhNQmg}bBaThwB
> zo!=c~`0Yy0_(a*#Q%tKt?sG)ep0OBhevQHwJE8?X$l5>k?Blym!#>7Cv$&xW{}vH7
> zrbz$K#O1)SBV<SxxwBdqNsH?x$j$llQ5Cw*DX!o~LsO6(yVMj!W4Dg*xFpPZ;`G)S
> zlw8!hsLb4-VuTtguu2%wD4vb&&wYlt+#UR%xgt&|@(q!ANP?pLx5(YOQY&PVL7a}=
> zY$|KqR85Sb<!{yqjx8<zzi+)~XA5M?(05I8PZ`#{5ZVg;nnG%3SH<pPDx)h5(b!&z
> zP7p~&v2+01A0Ii|7M(=cqb<NFG_JPEkQoj-Yez+N&6d5NR1`*=MUu+<Y4+wK?QD at m
> z^GM5Alp(bx%yBG&<`o^a at pj!{o`elN3a#UG7Lf7hD5591dmAf9$XF^ut*TeFaEllM
> z{0GdPEEURDub at Q%R<DRIQ7VL08Ra)Q9a<?06c21s=n`FiJOgPa(4n+1AzuTPlvl(W
> zCzP*Y(@AVA&niePtisW8g?T{X2MkX9R6ZUk#dp{>2+~1!BB;3ptDf<O=n3Y at BhzI}
> ztp%1|08I!gITi4f0%xMIQi2Y$r(dA!(P8B-rHm1(d>F>JvXo~DgaZ=;C)1p0du5y)
> z;RhQite%Vn&-57Z_$aLXVY8AL$Q)Co?n0PB99d8Gu#ZA21E6qBxOp_0=I1xGdoXy*
> zYAyg0YA$?1ji~A#BPqH;V|E+dTAbq<3^$~ED8)>W6dfx0yN3xkU;3KH=5*b9IgJw5
> zdllV&IH9YARUfqDr8fHe7XeS_XiD7AN;ofJ7yusrWBvCh;*|zMXTEq<;3>?gL9H`w
> z2Bxqvn(m~~mDMu&jy$0O at Gml76Zfr>isk|LL_d@<i$Hg80vQRdt}%dk6rM-mnL<An
> zEj9y_29ytn1Q7G;$o<zq*&x5Iw=qw9du!;gHwBU|YV3ftSXsj6>9-S}6FFF~Qb78p
> z<)re@*C_pjG$+v?mYgU}Q*Z{)2Ky4qXQU$`{;=+vn>&<5ULcC+H&wE^B}8GvZe;Fu
> z`OegC%XJaRo#?Kb9 at Tx1Hwp*1*Sa4}wYo0)4N;FM%B`dp)*OuKhqwz}_RjD4M~4~?
> zPKG9rk2sE3MHpVRdp3Btd6tVmv<#5Homvbq4bNXhSAXuInP1PFXZzM~o){p;UuQh)
> zMWq<;Hstz=ey+%0`<ec?6f_3~&YAw2gD!KxJfybi%jWsgO9py3E)84uOf3KGLA01(
> z*I-~biGJ*-B7=IgwdnYzyqZ_mapEW%m**nz<Q{}lm97Yi9gQ(z%Xs|}!@&TyNM!gZ
> zUfmb&#U3DyEtjXfQ(kX-FE66kv_9Y)$998jB=kb~zo*RK!1{w46kz{-ZS!<s{I$(l
> zZbcC>oI~HA4sJ;<2@~gtVvT^gLT8-XJi}wCgfwCE42;>45^?+!yk(b<TE(xkYPh_g
> zMQ(k7^!K%})lrpEpn|`{cp>1i;CoP7wIx#Kgv{hiRzNSkqObPD>Ii(bM}hTKx@#Ci
> zY1K`bMS6`f<r^{fr{%Bo4$LWWh2<>fL);em`)G`-o6|0;d+3~&=7!aFdIv83hNk`|
> zq9fTiBW%9xsiOLVBJzeO8;yCtyZF2reD at My2Nh^(UV`lr%(n7Qi=1aD=5%FF$vf{!
> zexSaT{c~2D96z8rlXCN$Gl4xGMLi!Z$C<ZkpdKIIpl!r%T3X9M&q&TD&g4TnG`Vv&
> z^*QdX-XEWW_~~eu!EZ+XecphaV3+ at w8n;oZf8P(I53LXnh$G}ygmz5wwW8vvr;6{Q
> zcAvuXhvw7ELVuF*J1LFgEbyLx*9x4ZqO=hpGe8P-_w=yP)<ogCuzVvu-|BluX<d}_
> zYfB)18T`&^j6$;=mc7E3U9;a#H0_PM0FB*>u;r9SD<9r!fc=)io!=qk!S3<b(9`7S
> zRo$b1eO}!i^Xv1P?qT%#-55Gb*pO~lOOWWo=;P|hLB_MQ^C%r5m1jJu`76{v^)^Ya
> z+V0=pf(Ls8w%|rpo at t$q_cwtj3QcQu7r?KeJ0V?Ip>o_S<Z)mI9eI|#PS!EsQR%SE
> ziSy=RZsl!>W%I%iCk%1)h@(dwJ>mdf+i}{30K0sTJxq!%?%b~;?1%oaA1ZyA1Xu*P
> z2z#EotNm}T<GHJnl~Z1$yB at k9Wk{xBPi`XZ0f_G>Q!3CP^S>$uyE8IPt^Pli<|~!X
> zQ{4lhox|%rBkzXP(m54lizhSt=hYFIS4-$QVAS#k_T9$P*nLiV(zb81JbU1bl3e3p
> zAJ#&TNX^Bn`@9CUco(c%V$4d>!tJrpxPth;Ir2l_97*RtLd20oFOCpyZvM9{)yOn1
> z$&B<)vyp9HK3HT;(-4OdV={T-;#t<x7es=^SV{%f%m8%){mLh0xzzr=qL5d#aI<(3
> zZ3)^%_Xz=AaK at QNhVm1sURj^dW2DdVqk#EMpcTIZHD@@uqjN>ywj-Mm+9msU!Y9G^
> zz3(l2cH_+EG=%(+pB3VVc@;BpmD#baKlXwnmQ7x8k$AusvL`70<DQ5HGtSLc^lk#(
> zKv&{OL%E$4r(&jx!n#t!8AuQx6{}dZm at pp#UqG|aB~Tr0(DB;0K7r0;0h?S3 at MZ^m
> z7}`2>llXc7BuUxVpOLu(siy`xKvn3zreA=iU-Pf at L{cvUy+f=x4SI)^4Nbz$qSKx6
> z;AbhQ7BAc(4}o9Cb6>B$1w6^P3%s5)9Mn*0Vg~0j`uzcv_UZi2vs1SFLO4RKrt!K9
> zHEi`jUa!{h2|CSl{vp9+PBl{z6JjQF at thmN;A|zR86ORP&`z;|)Wk=zTtAfx>CNVa
> zd_o=D90s`qT~%z|$Cc4_!O>VFM at NC0jFzzBR59sjUNm~ZQQjRbwf8;M6xC0MGBr*6
> z23M3uhY*q)%xLy5s)&vTVHIsd%JhnQe$Jkg#|oo~j|#0|c`_7KsA)O&o$LE+R7Pv`
> zpY_R25V_{i8Z)g;)qhnRKAI7kqY+pyKG4+HOa6;m&@w?yOJ`^;>QIY{^t<a3fqLM(
> zGnCilP3p44$}T5UuQ85mvb8pFCUCwKv{0kcLe{HKDt*$=lBeoY{-a*4&nLh0Z~6H{
> ztR=z4sP83|o-3c^83}po0M9q4o{?qQZ!X=AQa*>I)l`htY`Dkhn22Ai`)<~95>eGu
> z`!cAW?=FTQRvX26;z(ddGsSw?GmXSa>6_&`iKVjuO-IMEOR?Wh`=(J*Uh9J0i)Ir>
> z`+c3xoI(OCz2y$fY5wI7iR(N8I>3ZksusHDqm0?*wVh*gpi2_GHeg;w9B_(*;uPd<
> zqAB1g=7~y!G&IE}q8Gf=@yKx(*(kCoNm0I);?A5BqQ!HaTuz<j*LecHv&r~G`Bs#*
> ztG}#Wa#`5Jkjol{vg+ir{1MB)ybf*`O@&p{{yQa#Uy1E9y*LW=;sVf%ey~@`k^)gd
> zFis97R>nB)%`v!C6lZ^i^YiYYMio}Q3j7*RVs<OvE!Swbq@<h~^zrAwqZ(5F97>3$
> zGqGfVBsK{FURoM|qO_~@+9pt`6gyRjZ4LJR=QrPjjqu(BU5sZ at mmEfAu6pVyJX){@
> zq4>A=05HhXauFpy?+U=Ly^`sN{T{gndn6TL|6sWt at OZu-9?u)+mW!QZKT_Ze04h|!
> z13MZ}+0zdd5fHJ%?SYd|x1;|1P)aHC-_)c7-0zgJS1x0(q?XIrgfjN^m$46Jl>SE<
> zuzyp&x4(>1<h=<FR<X+W(cXl-_qzg-O2SiFCG(LQ_j)=1dP#%)6?o%cj&WMPUk=^h
> zpXvoURXM^p_oq4_zlZ)1IaN7QZN}Rd<WQ{G<g#9rQ&k{*OMj|^^8165znrQ9skY$l
> zi*o3TG!@3nW_+P28K**~$!mpetY2JuJb{0S)tQcdS$tJUWqEhOy$tsOQWn|^p}|8%
> z$N0@&J9_!I7Vy`^E1GYuS2Q at es?0C!Qug4CUk`Y_9M%AhZSQ4cETvVA!0EKCvM5Le
> z>8#N<zrL#XwN{4c`vO~1a`p9uFO&wmCxd(Uis+BAI=wYUtp8V-sWw1Fu5{%H`a#7>
> zYByG`p%Fd({4MmpddSr&$`8qHJA|3U?t+CXP&kmhr>Vt5czalWdssZ at R?A^$+?@Cx
> z#)*8A88A#Qe*<6Zb$rt|s}?){nZw|uO)$<*2Lc0$?c9~1ZoOyGsf(S9^9Z4o?Ly>v
> zTF&#dJFLC_N(gq*$fixFpsm>RVt+h}TWGwu<alqj at 4qsH;;_ at RtP?QJ=)B&(k+6=#
> z_HBOS;;C6UMdHgH+6m=UZ_BCPM(MFv2GMkH&hpgaj4msu9NwSG*q;hoVB}Qq$f+Pf
> z*Z=h<_cAiZak-%N%;ChE-riux&V*8ogytSrxVbn0vn0D0@`YFl)&Z|Al;_`B(8<WX
> ze(`mBSJS(vx8KLUei1trgwCzNB9K+`F2NoI?!C>jjZL%oZ>)nBUb8zsY at PxMs1!;q
> zmo2l$O0E_~{Bo at e+`OVQoT$aA9Se==7)nE2fpvY|K{A)GsP;s=@`~cQa<^Uz0uBsv
> zTx<^5-N*Z>i8y-q?oD1_tO}R$LGUz at wu{;Qc*SU7?&+<T-X?I3Qb7xY`oJ1vp*<=W
> zddyr?D0c{)(uv?wE|*;A<(lLML-R_QaY9)!<uFz#Dl)}UThry-i+`;{h+KzY$KEqR
> zzs1~oS4_Dcl-Ieu1-9ZH$G}yOGOg9Za-sO1q{W^*^2R>PKyhRvq0f*8MW|;MqyWR=
> zFFq5BIxV5~+ZtUl3N3JXX5ed6`J|Dj10AhaJ<HNnWIjn%=fhS4xHnn}Tqi3b&>@B2
> zZuvL0buZReW;=L*y6a+-j}kDh3tI*bVaad~uv&^9Z~~k}AD2+gSnqHMJ94m&67zm8
> zyK#p<m=(_rho+_b9Sx#N<`6Esi$gdG6fGytH;woItUC<c*COf at M_y;T1MHA21&2 at t
> zJ!P=Z>JGT`M!3zzO1#|wo}o%aUUJUoTSq{%3FQS~y#C4yfIT at nc0KFq=#<}TK=sq}
> zk#=yWPdg|3_<<O+;~cNbbSCJ7?$;<z1GnfEN++{K99+qS;1{6=?58rIEZD~PTB90O
> z)n8Rd<`izcbrJR`y&aUgz<%yVtft#s0ZlCBIAJ7B>_6|6=R5CoK8UVpd=Lf4)z7n&
> z@((EYpeN6>9<vxd+5cA`R`tFCe;WLdyaH80DOP&I{f3NFLA&-W^ToT(<JsV&b*cW-
> z*PnSkNWO0aW{yF5H(IFVUmM18sw1)myyo(w^4LC#r(^QdF`2 at E#Hj9T%$}Ef6qH6r
> z?#xNZis>#>THIq6r%4LR4+nJE?%00l43(iXl-2~W8w6gK4{F2Z at Zr8)9Y9mpA8wGt
> z<vj|T5A1iW?0*w2zoFDVN`*$hU%J34qO=Cxe`}1SC-Xp|86+Z8VAx^w(O=yKl%})i
> z(0bARK*+ZS1r)YsP$~?Z;fauKdye9ioBxu3|AePnxJ%Uc6ZAv&{4AG(ld6ExS-f$=
> zy at v2ex{?b(PYEc6lVk`Tk#K^uc>?8PAZ!yj8Kc3;0R3mzQND|`5As?(VKNK4NR7Sy
> zz?FeD=i6Vn63W{+#jISS?%Q|9U)F{QEo_$wG<0B9wHxD)N(#Uh+1 at iDa}tSR)+D0p
> z`&`0#Or6fH#=0SZ%FN@`gs!iE#=6sEc)e)KjF~XO7NwZ56>{}z7BX)SRDkQy)n(If
> z3*rgcL-lU!^^m_}`gGNx#|cqu)M||eKX}lP|M$hsXV}a081^jO4Y*I?8sQGY)xgmd
> zbc2pw3>*#cgHyt(;M8#8a5}gExRG#U;ZoqH!f|kvb?grp2uC*wX+2`$#=ynHrNT{t
> zn+BKI|A$9xtB9o%?(y;Cm#liYc>UV7>sO3l_t?7i#jD2`6)$;sIrS8*TD!bp<(l=y
> z4=r1~w78&n^~(6ANRt4Ul$?-~I4N-=9*K3PIc>xSEqQeDgT)V*80K1qdkxcV_*wJt
> z>NLZMqOpb*E0?c8W{>)OMa8QYKUT1Q<?7<J5k*M<d3rTbW>u5<)@ss{QB96os&VWH
> za8NR=0?WFkPd at s@^#|9UOJJ7Y)Ax_RJo0|&`9JmCH@)lFrw5MjIrxz4wcF2*oHXs{
> z3&}5jeeI8*B at W=;i)oH<`0ZAOi0z%DUVd1!Y3$%3Yx3*oO!@mOqyIf#n)@;N-q3qu
> z;U7MDd-9B&ybnLR`qD4yGbfZ~++sJ{jQftveu3Xs{e0 at p(<eWV(tCgW<gdEW?+R+I
> z;b#v&HMQveLF)?b_kI~YW_v~E52wQZ^??5uZAocbK^eQ~%- at bK*|GETW8b!<tbWEl
> z>(8s^-|!Sa?o_|AVMP4ULyhltw62fLe(UM2C8k%GWhs6NTs(2X>*Y<u_Fn3)3tsup
> zs+#A9Z at zMIUffre`?mzV^NnSNdDpn0hTJy?5{Bi}dIK*GnS_qQDq{Ucrle}dOc^^h
> zo_<ymg2M=SLyRP!%q7FfS|*NN!3<>&v$qv at -VZ@f2_wVNKZcRV$ZKQ+X(VlAF7w-^
> zz~$#hcKrJxmE-cmf&0FHQd8%7V(2s8HAA*`uMF9At#E+!)AH0me=%d4^UIl&4!f<1
> z^`E52zWUz$n3r9%$GmwyZ`|pN1tpiBWgq>f#_y at C&+8uR*zLdS_O{^<_EZd7@}pf}
> ze4{)(>z{u~yZ2v5r)K`+#bonG2PWj6du`<0GYwJsAG{uS|An{5xBXF3{p};%&L1`g
> z?76Z*`&{qp$f{rd5V7U@(qQps(ZJ202~%GBYL at ZX-=|MJ_%WaK!r6JFPBzamoOplX
> z=u>}P6#ve4W?g%&a{bqPgZ}j0F7 at M`mBZHdJw15Et<uoNU1ed*em*ie`}5<boYq4r
> z8K3S?u>7rY#DaHUiMBPpanF4%Z;gH6L%<hW%_-CfiGWLlGr|pkqvL5h+$`#5=48(h
> zvZjwu7#N-yA2A?vP}sPnu at nC5a1uH;gBd&_<Q^+KBsq9Yx?<=={b&m}Y*J91*>8AC
> z;3!@hnHn&1n#wR)H^QWjO7oAMs)?SWjWLqOQ>R^L&tLrX^Gi4+nQO>eU=ZfaHmq2@
> zrf601L#W4pcm2z?gUo5#LG)*K5WcHMj{5HL9b}+$2T8(x65Jmecl>u*$nSQ)wS#;I
> zr+jAzIos~bhrWn at dk4vctAs1O<O?5;c!h9}z*WKhpRPCRk^ayQqTRoP42FC10P;Lt
> zgOe{cWW}f&;^b<`4Zj-lkjj_81L1G?hi_NbK)akT{HV2t1ZLHcPjTOHZw(oq;R_FY
> zeFu?F?I1O{U;kSTiG9;or#i(>vinvI84S0C>?A$7(~E|eUaKJzT**&0<j8ejI15Y-
> zMJGO_dsm~p@&$aVOK^=PL&y<|$Z^rz<pqS~44cGclOmE0f5OAS_oF5;#(uwk6!piE
> zI8uN=`b?b-a(h019jt at +(uc{o-S?j6=kpuT5ovyR{CD!tCT243cjf#1zVt?vr<LcH
> z-{JnE)#F#;e^tS%)g=YR8`c*rE_$T+q4g`*6+iSV;wOXgH%4}2NE(^<;<1Gve~x(z
> z!Z5dQd%b}u6CSzk6Q&Cm>b-L%!JqgaVVm!~?7x5dlQ1o{;M@!Ue&zgn+cf<rPZWA*
> z?0SvwJalST-dlr>e>F5HKDl1|_Sgr;ZaRGB){C!Sy|E+s=#AT7Tu?AsffJwq=1Xyp
> zP&}q{_0pu>@8r)Ju;`Jc8E3YApAfr#Xw^ppwtVt50~;|oON7y_Pz-qfpEss8|1Iw7
> z8 at kVqEbdwGj_H}cFT79uS|vZ#oyu{TlXW4wI}^1WtYGya95{iPr}cN<Xjlzqa26Vh
> z{ZI`3Q^<cTd{6=c%&WHIdsP6hT+siO&h79aglvIwb%h_R<W!jWfqoR_1v^xuzI<lK
> z->=<I?g`U<c=eM9mUtsxyfMH~qN%e+9m-p~uetB3^wFP)dtVG5(fxhH^OjRX&b>wU
> zJ$Cuk=ihv(Y~%Z7YhVA_Gvfa?JeRC5dT`15Rd9<R^wS1~4H_O3=Xd8q!&sKiDGG3%
> z=yU&dS2#tp=z~kw7H?Py!eh<S;_<%{8{-R>u6?K&@7AorQ}Kp^rK?v{;^Ti4zhL#!
> zmCKN5t|k3fjA_eBH<*_$1qHHx?L)tY5+Y>P77OMhU4nT*B_tXz30ZYJ1 at pYCaMcJq
> zESTrsM%ZG+ixn)oOd&g9D>MR78jMOpwqrf07R=7~i2|pa^$ecpJ_WrKYAa3yLz^%I
> z|KrwRoTkhAv6Z(B<e*z380lHT{NNg%*g0 at z5!ayR6k;%-bxE&auOr`U*fl_RCCLEQ
> zK!MkMX2S_Q!D2wMOrS8s`#8dr=`NdK at lQkjzZGU|d19Gd-uzIWfD$*)8H-)@(P%?y
> zykEVGa!Le&-G)1B45&|r1p$>{&bx<N_`@^D6_NqS<G5gX>o(H-BA7=RXgO)%)1%M<
> zs1Iue`G<YAZpe#v34&&(kiAGjCZIm%`zE6v3#{Nypk3*xTMExG*n`_=LR&c=GFUh>
> zl8l`iHOfbL{X}5~x7ir9Zwlb^u!Z5)LH4vA?F)eXu97H9FA;^9EC{3b;C&SjZ5_sd
> zm#$!bhFt`E2*-)RLiV^s)a55G6yJeBl_g*%m~$<tyTfY0DQZa8U?-i&+UqlvHwoc=
> z#;J2YKz<Jh0`oRdSFlyjs|BHtS|RYFjiEwz&}t!jYY=wpy at GJ~v>?pCEM#5(M;Poj
> z#4E+;a|r=#8cLwII3!gilKFrs+BgL(1utM2jk;@a*YHG%_7blZ9UWy)Fb366#J5r4
> zonI#4Z3VH9=b+SZiSR at PS+w$K#81F?zfMA#K)^`NCqB<1&H%yuj{`zBN#`v<unMBV
> zvp?W8NUp27VY%`C`UzIdQRtT!1mV-0*r{Pm!^;eUaN-Mmr*`AGIc-D_*qYaRYzjs%
> zm`6TB`>-{PKr01%6)^cqn6cFb-e53JolYj4n2fscLY8nq5LQk|B_f5RmnR0bkiDx3
> z{XBrT at M_cz--)Ckt_4~uhGfbs8fF)dkC`>Y`4-C9X;MZk!wE2Gd*1v7tzWz{V!71-
> zd&>dMDM&klPu$6Y=SaZ&QlYO7NB&V*ydTcW`so$Gi{&i?IL?m*<C|^4xWTTKNMWKz
> z|3G_+or3Vi^9WO6e>EBJ$6NI3byh5<a_jN^%nROtg at 7;6Z at DSNWkB^(tV%+#s%NYT
> z*n}2X2IE8r7<55BQyAJ!$LhO+xjS9RW;j0T6#bSu$b$g3e=ZV)M at FJb?f8~)g0TEC
> zz+ at 8A-k>{UsDn-r9<CHD?<}{%wk!Je4fNj>3sL(MuJjTYhW;v~@#vocLe at 14#ya at 9
> zFG=W2RvzX$h3uw-sVY0Q>ftX4 at 4N@yx8Djvp~a?9=mDoZ;GNm%uLDr_BrD;FC77%O
> z*N;v#X2BAghkCaG-w=JI2z;_pCuDU_;|ZrkKjIN*5W at Y?Z_p?F@&$8aCT|(e at xgu^
> zpSS~K at h>WT_lGgIFc$NkwUReQ!F+7KAauWsu%b+W9T)WL{W%ZcXrv%KlS>S2dnV*V
> z(fxPumcbmxIB?55&n|)_Ji!09rI1?}KcL<vn2&4lUB=<tUk1!!xt5@<ySAYZ)}Xp6
> zfSW)1Z!-GBLipA2V`Q+`h3twLgiplS`hkaS2f*WVNV#k94JSeq&p;vT8xgoRS(x!J
> z=M*$i$bNh&>TWWjj%c$UI2mEPwgFb{@GGnY-#hyQKh8h~;N2fhfwMV5Xz0c_2ffMu
> zXr*mbkO;s(j2M__(Jw-T?9w&y0}aCj!O5cxL?AS81M&dw`O9 at 1`in`q at dJEE6Y%eN
> zj)>bZ4yGUvE$V`E*EWK-YfMV)5NCaJMKJ$CY0<Cp#~8l>c$c8Offx%m!Ccw__yG at v
> z4uyT`aW>kY(I(@t>K5R{OM=imPB6a`$tT)5lCFTxXK1=r>y at aZ0q|r6;q&!Ewl_k^
> zo&@W<&)1`VgV5*I#;H3aGZ_FQNE`_Ls=?5>K1RrX at D}bjh3uz71>qmJfZyKLkC*Wl
> zD`cmfML&T>=3VGR6c-USS3=>%ka*?B^BmX=f_aq#eIOEf;tT*81z6R9hFPNjk<JI}
> z&k2Hk?XpC1qa{>ahk4`-a6YjT7LG}Ugn2CBITW~S6v7~<4t$;c)DS+3_QQJhe2h!L
> zE6AignvTA98rt?by#gA6g>et(HUO6rC2t9?SZ54{X+g-O*-$^!aWdM<0H&RSu;OjZ
> zLqRAf8Fkg--FU)@DT1&wjP^evd;Mu)M&&Fa`~6G6`(z46KgMK^pHijPD7F5&fIxrr
> zUIho3(O!)95p`%FYz=6<L7?@OUThI~Ro(zf_lJ5J%sc2+UYzzpkJUDPOmyJXXu**Q
> z;*ce{F+s?T5_ at V*kk;QnKt~xi3>&226iSsJGG~JRzb{r1MC(E*2?|Y*$OBnZZV;{j
> z5=i+ya$V)h%XJUZ2Zw})g-1k24j3rE^FxD_Xq!@_Q7Sq4()ufb0Q)a`fPhY%^fDqd
> zUdfQbKH`)H{UDYU=4Bxg19;?k8Mb2!Pdc9FX`8*^9e_EdGvZHeY|+_h0)|2OdcXwF
> zEUP5yhEp`E7cE5^Lm*%l1`z7BTCX8l2QcC}AtXr$L*Q~5G*1Qk3&kpNBnkX03)b9F
> zUk<UEJNbwvDEBuMvV{qK2}*rJLYUrWD=Z|WP at kah;}i5sr5;ZS`miv{ue0e3amkgS
> z^@HQl{Dh4ZMS;g8){w1s-x}{r`c~nm(gx^52ZRqAGCV4F)R?jH2}#K*X;b<1jOjx5
> zESe9)G7PXRQnRSjc0VPn<8316$}G$*9K$l?9W?iX_o{cAw>R>7P)FaipSO93;v+8p
> z8ES1)$xW|Iu1$Cwy-`Nqe_Rx-7Z8?pj$wbG{fZ=Dbw#l1D^wE3fJVUiF4`Po=ywNq
> zGHh%eTs_<o at EMQ7oq#(D|0#z3astDi-o~(>yt$JMZQe<8Pwgb@@f-p-^4w0sy|t5U
> zKfRM|eP<_$aP1^};0XK#@xor;Nxp+C!gJ|sJITwq=e at C$oP{GjgwSt7d)3$+2XVqJ
> zn&}`<O?HsdGzV#e+djoXv{M~q7Tg865|e`*g)_ljgwsuPkTkgYa8JQK#5>4oxa)Y%
> z#r-0j+TtLOz}>m5>Bs|4o#h};3J9O!APL#XOU;G{V6mssFpQGbL_{bUMxz0DOTjWR
> zEE}uQgPid5_vbK7|EufqdmN;3oP&&sL*8Q at WKulZ05^QR1L_DIWbZ5o`3(201eA;L
> zml5X?JimePJ6CjugQOyl&k&w>FYa)Ccs`lvAP138;i%u at HrU`t+)S&3L?i)5(;Xx_
> z*+Fa*9pnhysT2oUk@{QwJ7xUex+^d;=- at C=^kiem8T2xWbv%b0q~$Qa-Jc!g at tqD*
> zRpXGuX!w7+72i0BWgouZ6TiJ%j~$0NxVz)#zvm#v^XM-#YKbnpmOLfY5~ZaU6WVWX
> zD4t!XQSMuSe at -n)g)6!Wn8H2P_20vVmi6))2dUWTATHE>1?nFE4y?4h9AqHEwJEh^
> z?37w^FtwJfm{?2xHMy3QCf1U8xKCm8b&08#teRR&9!RPsC4c;_Epi(!03ILxN7!Ak
> zID`6%Z=>I!ypeFRpF7Bmf8yJo!1somzrjIjo^=q;gZja3twVnXytZC)kowOsc95n4
> zZVckRkMebR_Xqgz!0#gRdl!Bk+A<dJKSiAn4VTCg!0#g5ip*N_23&O(o&nqc>BZO#
> zipiKd38g>CNS4lpbV?YGgLU$}NJMa&Q{-og1ve0#QXS{RLyaUrsiq85kQ^(Rv3H&g
> zL)ocH^#&jQtp}bhd3edHl}jHier)BMM;5PISya4qsV}JCPZ8TGj8A$e89pbz+5h|~
> zL*!?kka|M?v=PA+9oI8{DnI)CA6z=*0aD<%3w`@{esuHS`QiDUA9?=H4?OofKUhV-
> z^8;4D^MeZbogee|@BD!D at BC=?@BFmp{8``kt9TR(t^Q{kDXagPwmY-`8B+zZ-U-KG
> z4ohQL9UK|z_at7)R|$UaO!E}RdGFWCuInqz at o+S6nkU5r^rBPMoxABW#syppTrb>N
> zxOd^sz;WNyl0ST1OK#v^4!0X&^>7IYbA3 at Je@{kzjF59Qw?|i>Z2e;OYma=fy7lB2
> z{{zn|(((iPbXP680M`x|f324EAS~=E%DWCf?tg%b=jzBF+ at HkzqkeVdB>dOmUxYOB
> zwS5N>cm75P`2zpvzuW)#ckK)24O at Piyy9GYjL1)WXm#Y&Ps2Zc;LuI~1s~cTyYb8I
> z`=9VE{a(Fq{6(eX((7&OM*k)M<2NI|+Uq~6rb?ClQ;T%rP+X4ft2bZ!Haxd|{K0Q+
> zb05F|%UyfcpUuk_f4DOI__po$R*VV at +W%tmp#xQ2J4b&yr&P6g+8<T~wyqsB^`4(|
> z-m~Rgv5uHjvS~|5)Zrb8XWa3ZpB{GL+1GAmG)(VFF4)&u$7SpvrAdfb{_V^uYtr7l
> zKJ1r|ODFyP)g^~k-=lOE?K?7VO3cEcm!6w{Fnv;Em-CrVQj+f-_R_JC^n};XPQEZ?
> z%fNS5|LM(bEt8*q;GvS{?=qG1r~kRA=J~bri&E<cKKFjXtPET3yjd9qmV4)z3(|!G
> z%RC{+T99j=ULefMytlwG)v$itn&Oi653ea6w|eo)HRD#VPnkR^u{dd5QbJ<NxS6 at s
> zS3qwmNd*~61vAaUtOD~~A-!PEy)z5um}eHuyw at V+WE7;Q&q|zxM0a)^6H+IpYUdX}
> Tv~K0vHEByHCM`=&Ncw*OgFK)

>
> --
> 2.18.0
>


From petr.pavlu at suse.com  Tue Sep  3 04:22:58 2024
From: petr.pavlu at suse.com (Petr Pavlu)
Date: Tue, 3 Sep 2024 13:22:58 +0200
Subject: [PATCH] module: abort module loading when sysfs setup suffer
 errors
In-Reply-To: <20240830054400.26622-1-chunhui.li@mediatek.com>
References: <20240830054400.26622-1-chunhui.li@mediatek.com>
Message-ID: <c50f5364-ca94-4d5b-be99-3a3ffcf79648@suse.com>

On 8/30/24 07:43, Chunhui Li wrote:
> When insmod a kernel module, if fails in add_notes_attrs or
> add_sysfs_attrs such as memory allocation fail, mod_sysfs_setup
> will still return success, but we can't access user interface
> on android device.
> 
> Patch for make mod_sysfs_setup can check the error of
> add_notes_attrs and add_sysfs_attrs

s/add_sysfs_attrs/add_sect_attrs/

I think it makes sense to propagate errors from these functions upward,
although I wonder if the authors of this code didn't intentionally make
the errors silent, possibly because the interface was mostly intended
for debugging only?

The original commits which added add_sect_attrs() and add_notes_attrs()
don't mention anything explicitly in this regard:
https://github.com/mpe/linux-fullhistory/commit/db939b519bea9b88ae1c95c3b479c0b07145f2a0
https://github.com/torvalds/linux/commit/6d76013381ed28979cd122eb4b249a88b5e384fa

> 
> Signed-off-by: Xion Wang <xion.wang at mediatek.com>
> Signed-off-by: Chunhui Li <chunhui.li at mediatek.com>
> ---
>  kernel/module/sysfs.c | 49 ++++++++++++++++++++++++++++++-------------
>  1 file changed, 35 insertions(+), 14 deletions(-)
> 
> diff --git a/kernel/module/sysfs.c b/kernel/module/sysfs.c
> index 26efe1305c12..a9ee650d995d 100644
> --- a/kernel/module/sysfs.c
> +++ b/kernel/module/sysfs.c
> @@ -69,12 +69,13 @@ static void free_sect_attrs(struct module_sect_attrs *sect_attrs)
>  	kfree(sect_attrs);
>  }
>  
> -static void add_sect_attrs(struct module *mod, const struct load_info *info)
> +static int add_sect_attrs(struct module *mod, const struct load_info *info)
>  {
>  	unsigned int nloaded = 0, i, size[2];
>  	struct module_sect_attrs *sect_attrs;
>  	struct module_sect_attr *sattr;
>  	struct bin_attribute **gattr;
> +	int ret = 0;

Nit: It isn't necessary to initialize this variable to 0 because the
code explicitly does "return 0;" on success. While on the error path,
the variable is always assigned.

>  
>  	/* Count loaded sections and allocate structures */
>  	for (i = 0; i < info->hdr->e_shnum; i++)
> @@ -85,7 +86,7 @@ static void add_sect_attrs(struct module *mod, const struct load_info *info)
>  	size[1] = (nloaded + 1) * sizeof(sect_attrs->grp.bin_attrs[0]);
>  	sect_attrs = kzalloc(size[0] + size[1], GFP_KERNEL);
>  	if (!sect_attrs)
> -		return;
> +		return -ENOMEM;
>  
>  	/* Setup section attributes. */
>  	sect_attrs->grp.name = "sections";
> @@ -103,8 +104,10 @@ static void add_sect_attrs(struct module *mod, const struct load_info *info)
>  		sattr->address = sec->sh_addr;
>  		sattr->battr.attr.name =
>  			kstrdup(info->secstrings + sec->sh_name, GFP_KERNEL);
> -		if (!sattr->battr.attr.name)
> +		if (!sattr->battr.attr.name) {
> +			ret = -ENOMEM;
>  			goto out;
> +		}
>  		sect_attrs->nsections++;
>  		sattr->battr.read = module_sect_read;
>  		sattr->battr.size = MODULE_SECT_READ_SIZE;
> @@ -113,13 +116,16 @@ static void add_sect_attrs(struct module *mod, const struct load_info *info)
>  	}
>  	*gattr = NULL;
>  
> -	if (sysfs_create_group(&mod->mkobj.kobj, &sect_attrs->grp))
> +	if (sysfs_create_group(&mod->mkobj.kobj, &sect_attrs->grp)) {
> +		ret = -EIO;
>  		goto out;
> +	}

Why does the logic return -EIO instead of propagating the error code
from sysfs_create_group()?

>  
>  	mod->sect_attrs = sect_attrs;
> -	return;
> +	return 0;
>  out:
>  	free_sect_attrs(sect_attrs);
> +	return ret;
>  }
>  
>  static void remove_sect_attrs(struct module *mod)
> @@ -158,15 +164,16 @@ static void free_notes_attrs(struct module_notes_attrs *notes_attrs,
>  	kfree(notes_attrs);
>  }
>  
> -static void add_notes_attrs(struct module *mod, const struct load_info *info)
> +static int add_notes_attrs(struct module *mod, const struct load_info *info)
>  {
>  	unsigned int notes, loaded, i;
>  	struct module_notes_attrs *notes_attrs;
>  	struct bin_attribute *nattr;
> +	int ret = 0;

Similarly here, the initialization is not necessary.

>  
>  	/* failed to create section attributes, so can't create notes */
>  	if (!mod->sect_attrs)
> -		return;
> +		return -EINVAL;

Since the patch modifies mod_sysfs_setup() to bail out when registering
section attributes fails, this condition can no longer be true and the
check can be removed.

>  
>  	/* Count notes sections and allocate structures.  */
>  	notes = 0;
> @@ -176,12 +183,12 @@ static void add_notes_attrs(struct module *mod, const struct load_info *info)
>  			++notes;
>  
>  	if (notes == 0)
> -		return;
> +		return 0;
>  
>  	notes_attrs = kzalloc(struct_size(notes_attrs, attrs, notes),
>  			      GFP_KERNEL);
>  	if (!notes_attrs)
> -		return;
> +		return -ENOMEM;
>  
>  	notes_attrs->notes = notes;
>  	nattr = &notes_attrs->attrs[0];
> @@ -201,19 +208,24 @@ static void add_notes_attrs(struct module *mod, const struct load_info *info)
>  	}
>  
>  	notes_attrs->dir = kobject_create_and_add("notes", &mod->mkobj.kobj);
> -	if (!notes_attrs->dir)
> +	if (!notes_attrs->dir) {
> +		ret = -ENOMEM;
>  		goto out;
> +	}
>  
>  	for (i = 0; i < notes; ++i)
>  		if (sysfs_create_bin_file(notes_attrs->dir,
> -					  &notes_attrs->attrs[i]))
> +					  &notes_attrs->attrs[i])) {
> +			ret = -EIO;
>  			goto out;
> +	}

Similarly here, the actual error from sysfs_create_bin_file() can be
returned.

>  
>  	mod->notes_attrs = notes_attrs;
> -	return;
> +	return 0;
>  
>  out:
>  	free_notes_attrs(notes_attrs, i);
> +	return ret;
>  }
>  
>  static void remove_notes_attrs(struct module *mod)
> @@ -385,11 +397,20 @@ int mod_sysfs_setup(struct module *mod,
>  	if (err)
>  		goto out_unreg_modinfo_attrs;
>  
> -	add_sect_attrs(mod, info);
> -	add_notes_attrs(mod, info);
> +	err = add_sect_attrs(mod, info);
> +	if (err)
> +		goto out_unreg_sect_attrs;
> +
> +	err = add_notes_attrs(mod, info);
> +	if (err)
> +		goto out_unreg_notes_attrs;
>  
>  	return 0;
>  
> +out_unreg_notes_attrs:
> +	remove_notes_attrs(mod);
> +out_unreg_sect_attrs:
> +	remove_sect_attrs(mod);

Upon a failure from add_sect_attrs(), the caller doesn't need to unwind
its operation. It is the responsibility of add_sect_attrs() to clean up
after itself on error. Instead, the code in mod_sysfs_setup() needs to
unwind all previous successful operations leading up to this point,
which means here additionally to invoke del_usage_links().

I think you want something as follows:

err = add_sect_attrs(mod, info);
if (err)
	goto out_unreg_usage_links;

err = add_notes_attrs(mod, info);
if (err)
	goto out_unreg_sect_attrs;

return 0;

out_unreg_sect_attrs:
	remove_sect_attrs(mod);
out_unreg_usage_links:
	del_usage_links(mod);
[...]

>  out_unreg_modinfo_attrs:
>  	module_remove_modinfo_attrs(mod, -1);
>  out_unreg_param:

-- 
Cheers,
Petr


From benjamin.larsson at genexis.eu  Tue Sep  3 04:58:30 2024
From: benjamin.larsson at genexis.eu (Benjamin Larsson)
Date: Tue, 3 Sep 2024 13:58:30 +0200
Subject: [PATCH v3 5/5] pwm: airoha: Add support for EN7581 SoC
In-Reply-To: <yfqmlca6cnhrghpo5s6tml36tngmekcfbyjakxs7or7wtap3ka@7qlrxjowo4ou>
References: <20240831-en7581-pinctrl-v3-0-98eebfb4da66@kernel.org>
 <20240831-en7581-pinctrl-v3-5-98eebfb4da66@kernel.org>
 <yfqmlca6cnhrghpo5s6tml36tngmekcfbyjakxs7or7wtap3ka@7qlrxjowo4ou>
Message-ID: <d9298199-fe10-4b28-8e28-dc252bd6832c@genexis.eu>

Hi.

On 2024-09-03 12:46, Uwe Kleine-K?nig wrote:
> Hello,
>
> On Sat, Aug 31, 2024 at 04:27:50PM +0200, Lorenzo Bianconi wrote:
>> From: Benjamin Larsson <benjamin.larsson at genexis.eu>
>>
>> Introduce driver for PWM module available on EN7581 SoC.
>>
>> Signed-off-by: Benjamin Larsson <benjamin.larsson at genexis.eu>
>> Co-developed-by: Lorenzo Bianconi <lorenzo at kernel.org>
>> Signed-off-by: Lorenzo Bianconi <lorenzo at kernel.org>
>> ---
>>   drivers/pwm/Kconfig      |  10 ++
>>   drivers/pwm/Makefile     |   1 +
>>   drivers/pwm/pwm-airoha.c | 435 +++++++++++++++++++++++++++++++++++++++++++++++
>>   3 files changed, 446 insertions(+)
>>
>> diff --git a/drivers/pwm/Kconfig b/drivers/pwm/Kconfig
>> index 3e53838990f5..0a78bda0707d 100644
>> --- a/drivers/pwm/Kconfig
>> +++ b/drivers/pwm/Kconfig
>> @@ -47,6 +47,16 @@ config PWM_AB8500
>>   	  To compile this driver as a module, choose M here: the module
>>   	  will be called pwm-ab8500.
>>   
>> +config PWM_AIROHA
>> +	tristate "Airoha PWM support"
>> +	depends on ARCH_AIROHA || COMPILE_TEST
>> +	depends on OF
>> +	help
>> +	  Generic PWM framework driver for Airoha SoC.
>> +
>> +	  To compile this driver as a module, choose M here: the module
>> +	  will be called pwm-airoha.
>> +
>>   config PWM_APPLE
>>   	tristate "Apple SoC PWM support"
>>   	depends on ARCH_APPLE || COMPILE_TEST
>> diff --git a/drivers/pwm/Makefile b/drivers/pwm/Makefile
>> index 0be4f3e6dd43..7ee61822d88d 100644
>> --- a/drivers/pwm/Makefile
>> +++ b/drivers/pwm/Makefile
>> @@ -1,6 +1,7 @@
>>   # SPDX-License-Identifier: GPL-2.0
>>   obj-$(CONFIG_PWM)		+= core.o
>>   obj-$(CONFIG_PWM_AB8500)	+= pwm-ab8500.o
>> +obj-$(CONFIG_PWM_AIROHA)	+= pwm-airoha.o
>>   obj-$(CONFIG_PWM_APPLE)		+= pwm-apple.o
>>   obj-$(CONFIG_PWM_ATMEL)		+= pwm-atmel.o
>>   obj-$(CONFIG_PWM_ATMEL_HLCDC_PWM)	+= pwm-atmel-hlcdc.o
>> diff --git a/drivers/pwm/pwm-airoha.c b/drivers/pwm/pwm-airoha.c
>> new file mode 100644
>> index 000000000000..54dc12d20da4
>> --- /dev/null
>> +++ b/drivers/pwm/pwm-airoha.c
>> @@ -0,0 +1,435 @@
>> +// SPDX-License-Identifier: GPL-2.0
>> +/*
>> + * Copyright 2022 Markus Gothe <markus.gothe at genexis.eu>
>> + */
> Would you please add a "Limitations" paragraph here covering the
> following questions:
>
>   - How does the hardware behave on changes of configuration (does it
>     complete the currently running period? Are there any glitches?)
>   - How does the hardware behave on disabling?
>
> Please stick to the format used in several other drivers such that
>
> 	sed -rn '/Limitations:/,/\*\/?$/p' drivers/pwm/*.c
>
> emits the informations.


The answer to your questions are currently unknown. Is this information 
needed for a merge of the driver ?


>
>> +
>> +#include <linux/bitfield.h>
>> +#include <linux/err.h>
>> +#include <linux/io.h>
>> +#include <linux/iopoll.h>
>> +#include <linux/mfd/airoha-en7581-mfd.h>
>> +#include <linux/module.h>
>> +#include <linux/of.h>
>> +#include <linux/platform_device.h>
>> +#include <linux/pwm.h>
>> +#include <linux/gpio.h>
>> +#include <linux/bitops.h>
>> +#include <asm/div64.h>
>> +
>> +#define REG_SGPIO_CFG			0x0024
>> +#define REG_FLASH_CFG			0x0038
>> +#define REG_CYCLE_CFG			0x0098
>> +
>> +#define REG_SGPIO_LED_DATE		0x0000
>> +#define SGPIO_LED_SHIFT_FLAG		BIT(31)
>> +#define SGPIO_LED_DATA			GENMASK(16, 0)
> Please make the bit fields's names start with the register name.
>
I noticed REG_SGPIO_LED_DATE

DATE should be DATA.


>> +#define REG_SGPIO_CLK_DIVR		0x0004
>> +#define REG_SGPIO_CLK_DLY		0x0008
>> +
>> +#define REG_SIPO_FLASH_MODE_CFG		0x000c
>> +#define SERIAL_GPIO_FLASH_MODE		BIT(1)
>> +#define SERIAL_GPIO_MODE		BIT(0)
>> +
>> +#define REG_GPIO_FLASH_PRD_SET(_n)	(0x0004 + ((_n) << 2))
>> +#define GPIO_FLASH_PRD_MASK(_n)		GENMASK(15 + ((_n) << 4), ((_n) << 4))
>> +
>> +#define REG_GPIO_FLASH_MAP(_n)		(0x0014 + ((_n) << 2))
>> +#define GPIO_FLASH_SETID_MASK(_n)	GENMASK(2 + ((_n) << 2), ((_n) << 2))
>> +#define GPIO_FLASH_EN(_n)		BIT(3 + ((_n) << 2))
>> +
>> +#define REG_SIPO_FLASH_MAP(_n)		(0x001c + ((_n) << 2))
>> +
>> +#define REG_CYCLE_CFG_VALUE(_n)		(0x0000 + ((_n) << 2))
>> +#define WAVE_GEN_CYCLE_MASK(_n)		GENMASK(7 + ((_n) << 3), ((_n) << 3))
>> +
>> +struct airoha_pwm {
>> +	void __iomem *sgpio_cfg;
>> +	void __iomem *flash_cfg;
>> +	void __iomem *cycle_cfg;
>> +
>> +	struct device_node *np;
>> +	u64 initialized;
>> +
>> +	struct {
>> +		/* Bitmask of PWM channels using this bucket */
>> +		u64 used;
>> +		u64 period_ns;
>> +		u64 duty_ns;
>> +		enum pwm_polarity polarity;
>> +	} bucket[8];
>> +};
>> +
>> +/*
>> + * The first 16 GPIO pins, GPIO0-GPIO15, are mapped into 16 PWM channels, 0-15.
>> + * The SIPO GPIO pins are 16 pins which are mapped into 17 PWM channels, 16-32.
> How can 16 pins be mapped to 17 PWM channels?


The text is incorrect. There can be 17 pins in 17 slots.


>
>> + * However, we've only got 8 concurrent waveform generators and can therefore
>> + * only use up to 8 different combinations of duty cycle and period at a time.
> That's an information to add to the Limitations paragraph.
>
>> + */
>> +#define PWM_NUM_GPIO	16
>> +#define PWM_NUM_SIPO	17
>> +
>> +/* The PWM hardware supports periods between 4 ms and 1 s */
>> +#define PERIOD_MIN_NS	4000000
>> +#define PERIOD_MAX_NS	1000000000
>> +/* It is represented internally as 1/250 s between 1 and 250 */
>> +#define PERIOD_MIN	1
>> +#define PERIOD_MAX	250
>> +/* Duty cycle is relative with 255 corresponding to 100% */
>> +#define DUTY_FULL	255
>> +
>> +static u32 airoha_pwm_rmw(struct airoha_pwm *pc, void __iomem *addr,
>> +			  u32 mask, u32 val)
>> +{
>> +	val |= (readl(addr) & ~mask);
>> +	writel(val, addr);
>> +
>> +	return val;
>> +}
> pc is unused here, please drop it.
>
>> +#define airoha_pwm_sgpio_rmw(pc, offset, mask, val)				\
>> +	airoha_pwm_rmw((pc), (pc)->sgpio_cfg + (offset), (mask), (val))
>> +#define airoha_pwm_flash_rmw(pc, offset, mask, val)				\
>> +	airoha_pwm_rmw((pc), (pc)->flash_cfg + (offset), (mask), (val))
>> +#define airoha_pwm_cycle_rmw(pc, offset, mask, val)				\
>> +	airoha_pwm_rmw((pc), (pc)->cycle_cfg + (offset), (mask), (val))
>> +
>> +#define airoha_pwm_sgpio_set(pc, offset, val)					\
>> +	airoha_pwm_sgpio_rmw((pc), (offset), 0, (val))
> That does the right thing, but I'd consider
>
> 	#define airoha_pwm_sgpio_set(pc, offset, val)					\
> 		airoha_pwm_sgpio_rmw((pc), (offset), (val), (val))
>
> to be more understandable (or ~0 instead of the last (val)?)
>
>> +#define airoha_pwm_sgpio_clear(pc, offset, mask)				\
>> +	airoha_pwm_sgpio_rmw((pc), (offset), (mask), 0)
>> +#define airoha_pwm_flash_set(pc, offset, val)					\
>> +	airoha_pwm_flash_rmw((pc), (offset), 0, (val))
>> +#define airoha_pwm_flash_clear(pc, offset, mask)				\
>> +	airoha_pwm_flash_rmw((pc), (offset), (mask), 0)
>> +
>> +static int airoha_pwm_get_waveform(struct airoha_pwm *pc, u64 duty_ns,
>> +				   u64 period_ns)
> Given that "waveform" will gain some specific semantic soon, but this
> usage is different, I'd like to see this function renamed.

I suggest pwm_generator. Is that acceptable ?


>
>> +{
>> +	int i;
>> +
>> +	for (i = 0; i < ARRAY_SIZE(pc->bucket); i++) {
>> +		if (!pc->bucket[i].used)
>> +			continue;
>> +
>> +		if (duty_ns == pc->bucket[i].duty_ns &&
>> +		    period_ns == pc->bucket[i].period_ns)
>> +			return i;
>> +
>> +		/*
>> +		 * Unlike duty cycle zero, which can be handled by
>> +		 * disabling PWM, a generator is needed for full duty
>> +		 * cycle but it can be reused regardless of period
>> +		 */
>> +		if (duty_ns == DUTY_FULL && pc->bucket[i].duty_ns == DUTY_FULL)
>> +			return i;
>> +	}
>> +
>> +	return -1;
>> +}
>> +
>> +static void airoha_pwm_free_waveform(struct airoha_pwm *pc, unsigned int hwpwm)
>> +{
>> +	int i;
>> +
>> +	for (i = 0; i < ARRAY_SIZE(pc->bucket); i++)
>> +		pc->bucket[i].used &= ~BIT_ULL(hwpwm);
>> +}
>> +
>> +static int airoha_pwm_consume_waveform(struct airoha_pwm *pc,
>> +				       u64 duty_ns, u64 period_ns,
>> +				       enum pwm_polarity polarity,
>> +				       unsigned int hwpwm)
>> +{
>> +	int id = airoha_pwm_get_waveform(pc, duty_ns, period_ns);
>> +
>> +	if (id < 0) {
>> +		int i;
>> +
>> +		/* find an unused waveform generator */
>> +		for (i = 0; i < ARRAY_SIZE(pc->bucket); i++) {
>> +			if (!(pc->bucket[i].used & ~BIT_ULL(hwpwm))) {
>> +				id = i;
>> +				break;
>> +			}
>> +		}
>> +	}
>> +
>> +	if (id >= 0) {
>> +		airoha_pwm_free_waveform(pc, hwpwm);
>> +		pc->bucket[id].used |= BIT_ULL(hwpwm);
>> +		pc->bucket[id].period_ns = period_ns;
>> +		pc->bucket[id].duty_ns = duty_ns;
>> +		pc->bucket[id].polarity = polarity;
>> +	}
> One downside of the (nearly) maximal flexibility implemented here is
> that if you have 9 (or more) requested pwm devices configuration is
> quite limited.  So it might happen that a consumer changes the
> configuration for pwm#2 from pwm_state A to pwm_state B but cannot
> change back to A later.


Correct.


>
> If you limit the number of requested pwm devices to 8, the code gets a
> tad simpler (because you can map a fixed bucket to each pwm device and
> don't need to search during .apply()) and each consumer has maximal
> freedom to configure its device.


The main use for this solution is for led-dimming which uses the same 
timing among groups of leds. Most (of our) products have more then 8 
leds in total, with a limit of only 8 pwm devices it would not be 
possible to use the mainline driver with our hardware. I suggest that 
the current logic is kept but properly documented in the limitations 
section.


>
>> +
>> +	return id;
>> +}
>> +
>> +static int airoha_pwm_sipo_init(struct airoha_pwm *pc)
>> +{
>> +	u32 clk_divr_val = 3, sipo_clock_delay = 1;
>> +	u32 val, sipo_clock_divisor = 32;
>> +
>> +	if (!(pc->initialized >> PWM_NUM_GPIO))
>> +		return 0;
>> +
>> +	/* Select the right shift register chip */
>> +	if (of_property_read_bool(pc->np, "hc74595"))
>> +		airoha_pwm_sgpio_set(pc, REG_SIPO_FLASH_MODE_CFG,
>> +				     SERIAL_GPIO_MODE);
>> +	else
>> +		airoha_pwm_sgpio_clear(pc, REG_SIPO_FLASH_MODE_CFG,
>> +				       SERIAL_GPIO_MODE);
>> +
>> +	if (!of_property_read_u32(pc->np, "sipo-clock-divisor",
>> +				  &sipo_clock_divisor)) {
>> +		switch (sipo_clock_divisor) {
>> +		case 4:
>> +			clk_divr_val = 0;
>> +			break;
>> +		case 8:
>> +			clk_divr_val = 1;
>> +			break;
>> +		case 16:
>> +			clk_divr_val = 2;
>> +			break;
>> +		case 32:
>> +			clk_divr_val = 3;
>> +			break;
>> +		default:
>> +			return -EINVAL;
>> +		}
>> +	}
>> +	/* Configure shift register timings */
>> +	writel(clk_divr_val, pc->sgpio_cfg + REG_SGPIO_CLK_DIVR);
>> +
>> +	of_property_read_u32(pc->np, "sipo-clock-delay", &sipo_clock_delay);
>> +	if (sipo_clock_delay < 1 || sipo_clock_delay > sipo_clock_divisor / 2)
>> +		return -EINVAL;
>> +
>> +	/*
>> +	 * The actual delay is sclkdly + 1 so subtract 1 from
>> +	 * sipo-clock-delay to calculate the register value
>> +	 */
>> +	sipo_clock_delay--;
>> +	writel(sipo_clock_delay, pc->sgpio_cfg + REG_SGPIO_CLK_DLY);
>> +
>> +	/*
>> +	 * It it necessary to after muxing explicitly shift out all
>> +	 * zeroes to initialize the shift register before enabling PWM
>> +	 * mode because in PWM mode SIPO will not start shifting until
>> +	 * it needs to output a non-zero value (bit 31 of led_data
>> +	 * indicates shifting in progress and it must return to zero
>> +	 * before led_data can be written or PWM mode can be set)
>> +	 */
>> +	if (readl_poll_timeout(pc->sgpio_cfg + REG_SGPIO_LED_DATE, val,
>> +			       !(val & SGPIO_LED_SHIFT_FLAG), 10,
>> +			       200 * USEC_PER_MSEC))
>> +		return -ETIMEDOUT;
>> +
>> +	airoha_pwm_sgpio_clear(pc, REG_SGPIO_LED_DATE, SGPIO_LED_DATA);
>> +	if (readl_poll_timeout(pc->sgpio_cfg + REG_SGPIO_LED_DATE, val,
>> +			       !(val & SGPIO_LED_SHIFT_FLAG), 10,
>> +			       200 * USEC_PER_MSEC))
>> +		return -ETIMEDOUT;
>> +
>> +	/* Set SIPO in PWM mode */
>> +	airoha_pwm_sgpio_set(pc, REG_SIPO_FLASH_MODE_CFG,
>> +			     SERIAL_GPIO_FLASH_MODE);
>> +
>> +	return 0;
>> +}
>> +
>> +static void airoha_pwm_config_waveform(struct airoha_pwm *pc, int index,
>> +				       u64 duty_ns, u64 period_ns,
>> +				       enum pwm_polarity polarity)
>> +{
>> +	u32 period, duty, mask, val;
>> +
>> +	duty = clamp_val(div64_u64(DUTY_FULL * duty_ns, period_ns), 0,
>> +			 DUTY_FULL);
> DUTY_FULL * duty_ns might overflow. Also the calculation is wrong.
> For example if the following is requested:
>
> 	.period = 23999999,
> 	.duty_cycle = 8000000,
>
> you're supposed to configure period = 16000000 ns and duty_cycle =
> 8000000 ns.
>
> (I.e.: Pick the biggest possible period not bigger than the requested
> period. For that pick the biggest possible duty_cycle not bigger than
> the requested duty_cycle.)
>
> If you implement .get_state() in a way to return the actually configured
> state, enabling PWM_DEBUG and intensive testing helps to get this right.
>
>> +	if (polarity == PWM_POLARITY_INVERSED)
>> +		duty = DUTY_FULL - duty;
> This alone doesn't switch the polarity of the signal. Please only claim
> to be able to implement the settings that the hardware actually can do.

I am not sure I agree, but I will investigate this further.


MvH

Benjamin Larsson



From liankun.yang at mediatek.com  Tue Sep  3 05:09:19 2024
From: liankun.yang at mediatek.com (Liankun Yang)
Date: Tue, 3 Sep 2024 20:09:19 +0800
Subject: [PATCH v3 1/1] drm/mediatek: Fix get efuse issue for MT8188 DPTX
Message-ID: <20240903121028.20689-1-liankun.yang@mediatek.com>

Update efuse data for MT8188 displayport.

The DP monitor can not display when DUT connected to USB-c to DP dongle.
Analysis view is invalid DP efuse data.

Fixes: 350c3fe907fb ("drm/mediatek: dp: Add support MT8188 dp/edp function")

Signed-off-by: Liankun Yang <liankun.yang at mediatek.com>
---
Changes in V3:
- Add Fixes tag.
- Update the commit title.
- Update the commit description.
- Update change log position in commit message.
Per suggestion from the previous thread:
https://patchwork.kernel.org/project/linux-mediatek/patch/
20240902133736.16461-1-liankun.yang at mediatek.com/

 drivers/gpu/drm/mediatek/mtk_dp.c | 85 ++++++++++++++++++++++++++++++-
 1 file changed, 84 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/mediatek/mtk_dp.c b/drivers/gpu/drm/mediatek/mtk_dp.c
index d8796a904eca..f2bee617f063 100644
--- a/drivers/gpu/drm/mediatek/mtk_dp.c
+++ b/drivers/gpu/drm/mediatek/mtk_dp.c
@@ -145,6 +145,89 @@ struct mtk_dp_data {
 	u16 audio_m_div2_bit;
 };
 
+static const struct mtk_dp_efuse_fmt mt8188_dp_efuse_fmt[MTK_DP_CAL_MAX] = {
+	[MTK_DP_CAL_GLB_BIAS_TRIM] = {
+		.idx = 0,
+		.shift = 10,
+		.mask = 0x1f,
+		.min_val = 1,
+		.max_val = 0x1e,
+		.default_val = 0xf,
+	},
+	[MTK_DP_CAL_CLKTX_IMPSE] = {
+		.idx = 0,
+		.shift = 15,
+		.mask = 0xf,
+		.min_val = 1,
+		.max_val = 0xe,
+		.default_val = 0x8,
+	},
+	[MTK_DP_CAL_LN_TX_IMPSEL_PMOS_0] = {
+		.idx = 1,
+		.shift = 0,
+		.mask = 0xf,
+		.min_val = 1,
+		.max_val = 0xe,
+		.default_val = 0x8,
+	},
+	[MTK_DP_CAL_LN_TX_IMPSEL_PMOS_1] = {
+		.idx = 1,
+		.shift = 8,
+		.mask = 0xf,
+		.min_val = 1,
+		.max_val = 0xe,
+		.default_val = 0x8,
+	},
+	[MTK_DP_CAL_LN_TX_IMPSEL_PMOS_2] = {
+		.idx = 1,
+		.shift = 16,
+		.mask = 0xf,
+		.min_val = 1,
+		.max_val = 0xe,
+		.default_val = 0x8,
+	},
+	[MTK_DP_CAL_LN_TX_IMPSEL_PMOS_3] = {
+		.idx = 1,
+		.shift = 24,
+		.mask = 0xf,
+		.min_val = 1,
+		.max_val = 0xe,
+		.default_val = 0x8,
+	},
+	[MTK_DP_CAL_LN_TX_IMPSEL_NMOS_0] = {
+		.idx = 1,
+		.shift = 4,
+		.mask = 0xf,
+		.min_val = 1,
+		.max_val = 0xe,
+		.default_val = 0x8,
+	},
+	[MTK_DP_CAL_LN_TX_IMPSEL_NMOS_1] = {
+		.idx = 1,
+		.shift = 12,
+		.mask = 0xf,
+		.min_val = 1,
+		.max_val = 0xe,
+		.default_val = 0x8,
+	},
+	[MTK_DP_CAL_LN_TX_IMPSEL_NMOS_2] = {
+		.idx = 1,
+		.shift = 20,
+		.mask = 0xf,
+		.min_val = 1,
+		.max_val = 0xe,
+		.default_val = 0x8,
+	},
+	[MTK_DP_CAL_LN_TX_IMPSEL_NMOS_3] = {
+		.idx = 1,
+		.shift = 28,
+		.mask = 0xf,
+		.min_val = 1,
+		.max_val = 0xe,
+		.default_val = 0x8,
+	},
+};
+
 static const struct mtk_dp_efuse_fmt mt8195_edp_efuse_fmt[MTK_DP_CAL_MAX] = {
 	[MTK_DP_CAL_GLB_BIAS_TRIM] = {
 		.idx = 3,
@@ -2771,7 +2854,7 @@ static SIMPLE_DEV_PM_OPS(mtk_dp_pm_ops, mtk_dp_suspend, mtk_dp_resume);
 static const struct mtk_dp_data mt8188_dp_data = {
 	.bridge_type = DRM_MODE_CONNECTOR_DisplayPort,
 	.smc_cmd = MTK_DP_SIP_ATF_VIDEO_UNMUTE,
-	.efuse_fmt = mt8195_dp_efuse_fmt,
+	.efuse_fmt = mt8188_dp_efuse_fmt,
 	.audio_supported = true,
 	.audio_pkt_in_hblank_area = true,
 	.audio_m_div2_bit = MT8188_AUDIO_M_CODE_MULT_DIV_SEL_DP_ENC0_P0_DIV_2,
-- 
2.45.2



From peter.wang at mediatek.com  Tue Sep  3 05:56:01 2024
From: peter.wang at mediatek.com (=?utf-8?B?UGV0ZXIgV2FuZyAo546L5L+h5Y+LKQ==?=)
Date: Tue, 3 Sep 2024 12:56:01 +0000
Subject: [PATCH v2 1/2] ufs: core: fix the issue of ICU failure
In-Reply-To: <20240902021805.1125-2-peter.wang@mediatek.com>
References: <20240902021805.1125-1-peter.wang@mediatek.com>
	 <20240902021805.1125-2-peter.wang@mediatek.com>
Message-ID: <a6095ac6117710276dff972bcb9ff2c3475ebc5e.camel@mediatek.com>

On Mon, 2024-09-02 at 10:18 +0800, peter.wang at mediatek.com wrote:
> From: Peter Wang <peter.wang at mediatek.com>
> 
> When setting the ICU bit without using read-modify-write,
> SQRTCy will restart SQ again and receive an RTC return
> error code 2 (Failure - SQ not stopped).
> 
> Additionally, the error log has been modified so that
> this type of error can be observed.
> 
> Fixes: ab248643d3d6 ("scsi: ufs: core: Add error handling for MCQ
> mode")
> Cc: stable at vger.kernel.org
> Signed-off-by: Peter Wang <peter.wang at mediatek.com>
> ---
>  drivers/ufs/core/ufs-mcq.c | 9 +++++----
>  1 file changed, 5 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/ufs/core/ufs-mcq.c b/drivers/ufs/core/ufs-mcq.c
> index 5891cdacd0b3..afd9541f4bd8 100644
> --- a/drivers/ufs/core/ufs-mcq.c
> +++ b/drivers/ufs/core/ufs-mcq.c
> @@ -570,15 +570,16 @@ int ufshcd_mcq_sq_cleanup(struct ufs_hba *hba,
> int task_tag)
>  	writel(nexus, opr_sqd_base + REG_SQCTI);
>  
>  	/* SQRTCy.ICU = 1 */
> -	writel(SQ_ICU, opr_sqd_base + REG_SQRTC);
> +	writel(readl(opr_sqd_base + REG_SQRTC) | SQ_ICU,
> +		opr_sqd_base + REG_SQRTC);
> 

Hi Bao,

Could you help review this patch series?
It is a trivial MCQ spec violate bug fixed.

Thanks.
Peter


>  
>  	/* Poll SQRTSy.CUS = 1. Return result from SQRTSy.RTC */
>  	reg = opr_sqd_base + REG_SQRTS;
>  	err = read_poll_timeout(readl, val, val & SQ_CUS, 20,
>  				MCQ_POLL_US, false, reg);
> -	if (err)
> -		dev_err(hba->dev, "%s: failed. hwq=%d, tag=%d
> err=%ld\n",
> -			__func__, id, task_tag,
> +	if (err || FIELD_GET(SQ_ICU_ERR_CODE_MASK, readl(reg)))
> +		dev_err(hba->dev, "%s: failed. hwq=%d, tag=%d err=%d
> RTC=%ld\n",
> +			__func__, id, task_tag, err,
>  			FIELD_GET(SQ_ICU_ERR_CODE_MASK, readl(reg)));
>  
>  	if (ufshcd_mcq_sq_start(hba, hwq))

From kw at linux.com  Tue Sep  3 06:45:51 2024
From: kw at linux.com (Krzysztof =?utf-8?Q?Wilczy=C5=84ski?=)
Date: Tue, 3 Sep 2024 22:45:51 +0900
Subject: [PATCH v4 0/4] Add Airoha EN7581 PCIe support
In-Reply-To: <cover.1720022580.git.lorenzo@kernel.org>
References: <cover.1720022580.git.lorenzo@kernel.org>
Message-ID: <20240903134551.GA1403301@rocinante>

Hello,

> Introduce support for EN7581 SoC to mediatek-gen3 PCIe driver

Applied to controller/mediatek-gen3, thank you!

[01/04] dt-bindings: PCI: mediatek-gen3: Add support for Airoha EN7581
        https://git.kernel.org/pci/pci/c/c6abd0eadec6

[02/04] PCI: mediatek-gen3: Add mtk_gen3_pcie_pdata data structure
        https://git.kernel.org/pci/pci/c/dc869a40d73e

[03/04] PCI: mediatek-gen3: Rely on reset_bulk APIs for PHY reset lines
        https://git.kernel.org/pci/pci/c/ee9eabbe3f0f

[04/04] PCI: mediatek-gen3: Add Airoha EN7581 support
        https://git.kernel.org/pci/pci/c/f6ab898356dd

	Krzysztof


From kw at linux.com  Tue Sep  3 06:47:23 2024
From: kw at linux.com (Krzysztof =?utf-8?Q?Wilczy=C5=84ski?=)
Date: Tue, 3 Sep 2024 22:47:23 +0900
Subject: [PATCH v4 0/4] Add Airoha EN7581 PCIe support
In-Reply-To: <20240820140133.GA207494@bhelgaas>
References: <ZsRX-Hrn2fCITK4P@lore-desk>
 <20240820140133.GA207494@bhelgaas>
Message-ID: <20240903134723.GB1403301@rocinante>

Hello,

> > any update about this series? Am I supposed to do something? Thanks in advance.
> 
> No need to do anything, I think Krzysztof will likely pick this up
> when he has a minute.

Everything looks good!  Bjorn, should be able to pull it for 6.12,
hopefully.  Apologies for the delay.

	Krzysztof


From robh at kernel.org  Tue Sep  3 08:05:34 2024
From: robh at kernel.org (Rob Herring (Arm))
Date: Tue, 3 Sep 2024 10:05:34 -0500
Subject: [PATCH v3 1/5] dt-bindings: arm: airoha: Add the chip-scu node
 for EN7581 SoC
In-Reply-To: <20240831-en7581-pinctrl-v3-1-98eebfb4da66@kernel.org>
References: <20240831-en7581-pinctrl-v3-0-98eebfb4da66@kernel.org>
 <20240831-en7581-pinctrl-v3-1-98eebfb4da66@kernel.org>
Message-ID: <172537593271.1018147.17791430767383351676.robh@kernel.org>


On Sat, 31 Aug 2024 16:27:46 +0200, Lorenzo Bianconi wrote:
> This patch adds the chip-scu document bindings for EN7581 SoC.
> The airoha chip-scu block provides a configuration interface for clock,
> io-muxing and other functionalities used by multiple controllers (e.g.
> clock, pinctrl, ecc.) on EN7581 SoC.
> 
> Signed-off-by: Lorenzo Bianconi <lorenzo at kernel.org>
> ---
>  .../bindings/arm/airoha,en7581-chip-scu.yaml       | 42 ++++++++++++++++++++++
>  1 file changed, 42 insertions(+)
> 

Reviewed-by: Rob Herring (Arm) <robh at kernel.org>



From robh at kernel.org  Tue Sep  3 08:09:53 2024
From: robh at kernel.org (Rob Herring)
Date: Tue, 3 Sep 2024 10:09:53 -0500
Subject: [PATCH v3 2/5] dt-bindings: mfd: Add support for Airoha EN7581
 GPIO System Controller
In-Reply-To: <20240831-en7581-pinctrl-v3-2-98eebfb4da66@kernel.org>
References: <20240831-en7581-pinctrl-v3-0-98eebfb4da66@kernel.org>
 <20240831-en7581-pinctrl-v3-2-98eebfb4da66@kernel.org>
Message-ID: <20240903150953.GA1018489-robh@kernel.org>

On Sat, Aug 31, 2024 at 04:27:47PM +0200, Lorenzo Bianconi wrote:
> From: Christian Marangi <ansuelsmth at gmail.com>
> 
> Add support for Airoha EN7581 GPIO System Controller which provide a
> register map for controlling the GPIO, pinctrl and PWM of the SoC.
> 
> Schema define cells for both gpio/interrupt controller and PWM.
> Moreover it provides a dedicated pinctrl node for pins and config
> definitions.
> 
> Signed-off-by: Christian Marangi <ansuelsmth at gmail.com>
> Co-developed-by: Lorenzo Bianconi <lorenzo at kernel.org>
> Signed-off-by: Lorenzo Bianconi <lorenzo at kernel.org>
> ---
>  .../bindings/mfd/airoha,en7581-gpio-sysctl.yaml    | 433 +++++++++++++++++++++
>  1 file changed, 433 insertions(+)
> 
> diff --git a/Documentation/devicetree/bindings/mfd/airoha,en7581-gpio-sysctl.yaml b/Documentation/devicetree/bindings/mfd/airoha,en7581-gpio-sysctl.yaml
> new file mode 100644
> index 000000000000..a9080c7f50f9
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/mfd/airoha,en7581-gpio-sysctl.yaml
> @@ -0,0 +1,433 @@
> +# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
> +%YAML 1.2
> +---
> +$id: http://devicetree.org/schemas/mfd/airoha,en7581-gpio-sysctl.yaml#
> +$schema: http://devicetree.org/meta-schemas/core.yaml#
> +
> +title: Airoha EN7581 GPIO System Controller
> +
> +maintainers:
> +  - Christian Marangi <ansuelsmth at gmail.com>
> +  - Lorenzo Bianconi <lorenzo at kernel.org>
> +
> +description:
> +  Airoha EN7581 SoC GPIO system controller which provided a register map
> +  for controlling the GPIO, pins and PWM of the SoC.
> +
> +properties:
> +  compatible:
> +    const: airoha,en7581-gpio-sysctl
> +
> +  reg:
> +    maxItems: 1
> +
> +  interrupts:
> +    maxItems: 1
> +
> +  gpio-controller: true
> +
> +  '#gpio-cells':
> +    const: 2
> +
> +  interrupt-controller: true
> +
> +  '#interrupt-cells':
> +    const: 2
> +
> +  "#pwm-cells":
> +    const: 3
> +
> +  pinctrl:
> +    type: object
> +
> +    $ref: /schemas/pinctrl/pinctrl.yaml
> +
> +    patternProperties:
> +      '-pins$':
> +        type: object
> +
> +        patternProperties:
> +          '^.*mux.*$':

Do you really need 'mux' anywhere in the node names? Isn't either a 
prefix or a suffix enough?

> +            type: object
> +
> +            description:
> +              pinmux configuration nodes.
> +
> +            $ref: /schemas/pinctrl/pinmux-node.yaml
> +
> +            properties:
> +              function:
> +                description:
> +                  A string containing the name of the function to mux to the group.
> +                enum: [pon, tod_1pps, sipo, mdio, uart, i2c, jtag, pcm, spi,
> +                       pcm_spi, i2s, emmc, pnand, pcie_reset, pwm, phy1_led0,
> +                       phy2_led0, phy3_led0, phy4_led0, phy1_led1, phy2_led1,
> +                       phy3_led1, phy4_led1]
> +
> +              groups:
> +                description:
> +                  An array of strings. Each string contains the name of a group.
> +
> +            required:
> +              - function
> +              - groups
> +
> +            allOf:
> +              - if:
> +                  properties:
> +                    function:
> +                      const: pon
> +                then:
> +                  properties:
> +                    groups:
> +                      enum: [pon]
> +              - if:
> +                  properties:
> +                    function:
> +                      const: tod_1pps
> +                then:
> +                  properties:
> +                    groups:
> +                      enum: [pon_tod_1pps, gsw_tod_1pps]
> +              - if:
> +                  properties:
> +                    function:
> +                      const: sipo
> +                then:
> +                  properties:
> +                    groups:
> +                      enum: [sipo, sipo_rclk]
> +              - if:
> +                  properties:
> +                    function:
> +                      const: mdio
> +                then:
> +                  properties:
> +                    groups:
> +                      enum: [mdio]
> +              - if:
> +                  properties:
> +                    function:
> +                      const: uart
> +                then:
> +                  properties:
> +                    groups:
> +                      items:
> +                        enum: [uart2, uart2_cts_rts, hsuart, hsuart_cts_rts, uart4,
> +                               uart5]
> +                      maxItems: 2
> +              - if:
> +                  properties:
> +                    function:
> +                      const: i2c
> +                then:
> +                  properties:
> +                    groups:
> +                      enum: [i2c1]
> +              - if:
> +                  properties:
> +                    function:
> +                      const: jtag
> +                then:
> +                  properties:
> +                    groups:
> +                      enum: [jtag_udi, jtag_dfd]
> +              - if:
> +                  properties:
> +                    function:
> +                      const: pcm
> +                then:
> +                  properties:
> +                    groups:
> +                      enum: [pcm1, pcm2]
> +              - if:
> +                  properties:
> +                    function:
> +                      const: spi
> +                then:
> +                  properties:
> +                    groups:
> +                      items:
> +                        enum: [spi_quad, spi_cs1]
> +                      maxItems: 2
> +              - if:
> +                  properties:
> +                    function:
> +                      const: pcm_spi
> +                then:
> +                  properties:
> +                    groups:
> +                      items:
> +                        enum: [pcm_spi, pcm_spi_int, pcm_spi_rst, pcm_spi_cs1,
> +                               pcm_spi_cs2_p156, pcm_spi_cs2_p128, pcm_spi_cs3,
> +                               pcm_spi_cs4]
> +                      maxItems: 7
> +              - if:
> +                  properties:
> +                    function:
> +                      const: i2c
> +                then:
> +                  properties:
> +                    groups:
> +                      enum: [i2s]
> +              - if:
> +                  properties:
> +                    function:
> +                      const: emmc
> +                then:
> +                  properties:
> +                    groups:
> +                      enum: [emmc]
> +              - if:
> +                  properties:
> +                    function:
> +                      const: pnand
> +                then:
> +                  properties:
> +                    groups:
> +                      enum: [pnand]
> +              - if:
> +                  properties:
> +                    function:
> +                      const: pcie_reset
> +                then:
> +                  properties:
> +                    groups:
> +                      enum: [pcie_reset0, pcie_reset1, pcie_reset2]
> +              - if:
> +                  properties:
> +                    function:
> +                      const: pwm
> +                then:
> +                  properties:
> +                    groups:
> +                      enum: [gpio0, gpio1, gpio2, gpio3, gpio4, gpio5, gpio6,
> +                             gpio7, gpio8, gpio9, gpio10, gpio11, gpio12, gpio13,
> +                             gpio14, gpio15, gpio16, gpio17, gpio18, gpio19,
> +                             gpio20, gpio21, gpio22, gpio23, gpio24, gpio25,
> +                             gpio26, gpio27, gpio28, gpio29, gpio30, gpio31,
> +                             gpio36, gpio37, gpio38, gpio39, gpio40, gpio41,
> +                             gpio42, gpio43, gpio44, gpio45, gpio46, gpio47]
> +              - if:
> +                  properties:
> +                    function:
> +                      const: phy1_led0
> +                then:
> +                  properties:
> +                    groups:
> +                      enum: [gpio33, gpio34, gpio35, gpio42]
> +              - if:
> +                  properties:
> +                    function:
> +                      const: phy2_led0
> +                then:
> +                  properties:
> +                    groups:
> +                      enum: [gpio33, gpio34, gpio35, gpio42]
> +              - if:
> +                  properties:
> +                    function:
> +                      const: phy3_led0
> +                then:
> +                  properties:
> +                    groups:
> +                      enum: [gpio33, gpio34, gpio35, gpio42]
> +              - if:
> +                  properties:
> +                    function:
> +                      const: phy4_led0
> +                then:
> +                  properties:
> +                    groups:
> +                      enum: [gpio33, gpio34, gpio35, gpio42]
> +              - if:
> +                  properties:
> +                    function:
> +                      const: phy1_led1
> +                then:
> +                  properties:
> +                    groups:
> +                      enum: [gpio43, gpio44, gpio45, gpio46]
> +              - if:
> +                  properties:
> +                    function:
> +                      const: phy2_led1
> +                then:
> +                  properties:
> +                    groups:
> +                      enum: [gpio43, gpio44, gpio45, gpio46]
> +              - if:
> +                  properties:
> +                    function:
> +                      const: phy3_led1
> +                then:
> +                  properties:
> +                    groups:
> +                      enum: [gpio43, gpio44, gpio45, gpio46]
> +              - if:
> +                  properties:
> +                    function:
> +                      const: phy4_led1
> +                then:
> +                  properties:
> +                    groups:
> +                      enum: [gpio43, gpio44, gpio45, gpio46]
> +
> +            additionalProperties: false
> +
> +          '^.*conf.*$':

Same here.

Otherwise, LGTM.

Rob


From lee at kernel.org  Tue Sep  3 08:33:53 2024
From: lee at kernel.org (Lee Jones)
Date: Tue, 3 Sep 2024 16:33:53 +0100
Subject: [PATCH v3 2/5] dt-bindings: mfd: Add support for Airoha EN7581
 GPIO System Controller
In-Reply-To: <20240831-en7581-pinctrl-v3-2-98eebfb4da66@kernel.org>
References: <20240831-en7581-pinctrl-v3-0-98eebfb4da66@kernel.org>
 <20240831-en7581-pinctrl-v3-2-98eebfb4da66@kernel.org>
Message-ID: <20240903153353.GZ6858@google.com>

On Sat, 31 Aug 2024, Lorenzo Bianconi wrote:

> From: Christian Marangi <ansuelsmth at gmail.com>
> 
> Add support for Airoha EN7581 GPIO System Controller which provide a
> register map for controlling the GPIO, pinctrl and PWM of the SoC.
> 
> Schema define cells for both gpio/interrupt controller and PWM.
> Moreover it provides a dedicated pinctrl node for pins and config
> definitions.
> 
> Signed-off-by: Christian Marangi <ansuelsmth at gmail.com>
> Co-developed-by: Lorenzo Bianconi <lorenzo at kernel.org>
> Signed-off-by: Lorenzo Bianconi <lorenzo at kernel.org>
> ---
>  .../bindings/mfd/airoha,en7581-gpio-sysctl.yaml    | 433 +++++++++++++++++++++
>  1 file changed, 433 insertions(+)
> 
> diff --git a/Documentation/devicetree/bindings/mfd/airoha,en7581-gpio-sysctl.yaml b/Documentation/devicetree/bindings/mfd/airoha,en7581-gpio-sysctl.yaml
> new file mode 100644
> index 000000000000..a9080c7f50f9
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/mfd/airoha,en7581-gpio-sysctl.yaml
> @@ -0,0 +1,433 @@
> +# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
> +%YAML 1.2
> +---
> +$id: http://devicetree.org/schemas/mfd/airoha,en7581-gpio-sysctl.yaml#
> +$schema: http://devicetree.org/meta-schemas/core.yaml#
> +
> +title: Airoha EN7581 GPIO System Controller
> +
> +maintainers:
> +  - Christian Marangi <ansuelsmth at gmail.com>
> +  - Lorenzo Bianconi <lorenzo at kernel.org>
> +
> +description:
> +  Airoha EN7581 SoC GPIO system controller which provided a register map
> +  for controlling the GPIO, pins and PWM of the SoC.

This whole thing is just about pins.

The MFD portion of this submission doesn't do anything.

Please rework this to omit the MFD driver.

After just a glance, it looks like simple-mfd _might_ work.

> +properties:
> +  compatible:
> +    const: airoha,en7581-gpio-sysctl
> +
> +  reg:
> +    maxItems: 1
> +
> +  interrupts:
> +    maxItems: 1
> +
> +  gpio-controller: true
> +
> +  '#gpio-cells':
> +    const: 2
> +
> +  interrupt-controller: true
> +
> +  '#interrupt-cells':
> +    const: 2
> +
> +  "#pwm-cells":
> +    const: 3
> +
> +  pinctrl:
> +    type: object
> +
> +    $ref: /schemas/pinctrl/pinctrl.yaml
> +
> +    patternProperties:
> +      '-pins$':
> +        type: object
> +
> +        patternProperties:
> +          '^.*mux.*$':
> +            type: object
> +
> +            description:
> +              pinmux configuration nodes.
> +
> +            $ref: /schemas/pinctrl/pinmux-node.yaml
> +
> +            properties:
> +              function:
> +                description:
> +                  A string containing the name of the function to mux to the group.
> +                enum: [pon, tod_1pps, sipo, mdio, uart, i2c, jtag, pcm, spi,
> +                       pcm_spi, i2s, emmc, pnand, pcie_reset, pwm, phy1_led0,
> +                       phy2_led0, phy3_led0, phy4_led0, phy1_led1, phy2_led1,
> +                       phy3_led1, phy4_led1]
> +
> +              groups:
> +                description:
> +                  An array of strings. Each string contains the name of a group.
> +
> +            required:
> +              - function
> +              - groups
> +
> +            allOf:
> +              - if:
> +                  properties:
> +                    function:
> +                      const: pon
> +                then:
> +                  properties:
> +                    groups:
> +                      enum: [pon]
> +              - if:
> +                  properties:
> +                    function:
> +                      const: tod_1pps
> +                then:
> +                  properties:
> +                    groups:
> +                      enum: [pon_tod_1pps, gsw_tod_1pps]
> +              - if:
> +                  properties:
> +                    function:
> +                      const: sipo
> +                then:
> +                  properties:
> +                    groups:
> +                      enum: [sipo, sipo_rclk]
> +              - if:
> +                  properties:
> +                    function:
> +                      const: mdio
> +                then:
> +                  properties:
> +                    groups:
> +                      enum: [mdio]
> +              - if:
> +                  properties:
> +                    function:
> +                      const: uart
> +                then:
> +                  properties:
> +                    groups:
> +                      items:
> +                        enum: [uart2, uart2_cts_rts, hsuart, hsuart_cts_rts, uart4,
> +                               uart5]
> +                      maxItems: 2
> +              - if:
> +                  properties:
> +                    function:
> +                      const: i2c
> +                then:
> +                  properties:
> +                    groups:
> +                      enum: [i2c1]
> +              - if:
> +                  properties:
> +                    function:
> +                      const: jtag
> +                then:
> +                  properties:
> +                    groups:
> +                      enum: [jtag_udi, jtag_dfd]
> +              - if:
> +                  properties:
> +                    function:
> +                      const: pcm
> +                then:
> +                  properties:
> +                    groups:
> +                      enum: [pcm1, pcm2]
> +              - if:
> +                  properties:
> +                    function:
> +                      const: spi
> +                then:
> +                  properties:
> +                    groups:
> +                      items:
> +                        enum: [spi_quad, spi_cs1]
> +                      maxItems: 2
> +              - if:
> +                  properties:
> +                    function:
> +                      const: pcm_spi
> +                then:
> +                  properties:
> +                    groups:
> +                      items:
> +                        enum: [pcm_spi, pcm_spi_int, pcm_spi_rst, pcm_spi_cs1,
> +                               pcm_spi_cs2_p156, pcm_spi_cs2_p128, pcm_spi_cs3,
> +                               pcm_spi_cs4]
> +                      maxItems: 7
> +              - if:
> +                  properties:
> +                    function:
> +                      const: i2c
> +                then:
> +                  properties:
> +                    groups:
> +                      enum: [i2s]
> +              - if:
> +                  properties:
> +                    function:
> +                      const: emmc
> +                then:
> +                  properties:
> +                    groups:
> +                      enum: [emmc]
> +              - if:
> +                  properties:
> +                    function:
> +                      const: pnand
> +                then:
> +                  properties:
> +                    groups:
> +                      enum: [pnand]
> +              - if:
> +                  properties:
> +                    function:
> +                      const: pcie_reset
> +                then:
> +                  properties:
> +                    groups:
> +                      enum: [pcie_reset0, pcie_reset1, pcie_reset2]
> +              - if:
> +                  properties:
> +                    function:
> +                      const: pwm
> +                then:
> +                  properties:
> +                    groups:
> +                      enum: [gpio0, gpio1, gpio2, gpio3, gpio4, gpio5, gpio6,
> +                             gpio7, gpio8, gpio9, gpio10, gpio11, gpio12, gpio13,
> +                             gpio14, gpio15, gpio16, gpio17, gpio18, gpio19,
> +                             gpio20, gpio21, gpio22, gpio23, gpio24, gpio25,
> +                             gpio26, gpio27, gpio28, gpio29, gpio30, gpio31,
> +                             gpio36, gpio37, gpio38, gpio39, gpio40, gpio41,
> +                             gpio42, gpio43, gpio44, gpio45, gpio46, gpio47]
> +              - if:
> +                  properties:
> +                    function:
> +                      const: phy1_led0
> +                then:
> +                  properties:
> +                    groups:
> +                      enum: [gpio33, gpio34, gpio35, gpio42]
> +              - if:
> +                  properties:
> +                    function:
> +                      const: phy2_led0
> +                then:
> +                  properties:
> +                    groups:
> +                      enum: [gpio33, gpio34, gpio35, gpio42]
> +              - if:
> +                  properties:
> +                    function:
> +                      const: phy3_led0
> +                then:
> +                  properties:
> +                    groups:
> +                      enum: [gpio33, gpio34, gpio35, gpio42]
> +              - if:
> +                  properties:
> +                    function:
> +                      const: phy4_led0
> +                then:
> +                  properties:
> +                    groups:
> +                      enum: [gpio33, gpio34, gpio35, gpio42]
> +              - if:
> +                  properties:
> +                    function:
> +                      const: phy1_led1
> +                then:
> +                  properties:
> +                    groups:
> +                      enum: [gpio43, gpio44, gpio45, gpio46]
> +              - if:
> +                  properties:
> +                    function:
> +                      const: phy2_led1
> +                then:
> +                  properties:
> +                    groups:
> +                      enum: [gpio43, gpio44, gpio45, gpio46]
> +              - if:
> +                  properties:
> +                    function:
> +                      const: phy3_led1
> +                then:
> +                  properties:
> +                    groups:
> +                      enum: [gpio43, gpio44, gpio45, gpio46]
> +              - if:
> +                  properties:
> +                    function:
> +                      const: phy4_led1
> +                then:
> +                  properties:
> +                    groups:
> +                      enum: [gpio43, gpio44, gpio45, gpio46]
> +
> +            additionalProperties: false
> +
> +          '^.*conf.*$':
> +            type: object
> +
> +            description:
> +              pinconf configuration nodes.
> +
> +            $ref: /schemas/pinctrl/pincfg-node.yaml
> +
> +            properties:
> +              pins:
> +                description:
> +                  An array of strings. Each string contains the name of a pin.
> +                items:
> +                  enum: [uart1_txd, uart1_rxd, i2c_scl, i2c_sda, spi_cs0, spi_clk,
> +                         spi_mosi, spi_miso, gpio0, gpio1, gpio2, gpio3, gpio4,
> +                         gpio5, gpio6, gpio7, gpio8, gpio9, gpio10, gpio11, gpio12,
> +                         gpio13, gpio14, gpio15, gpio16, gpio17, gpio18, gpio19,
> +                         gpio20, gpio21, gpio22, gpio23, gpio24, gpio25, gpio26,
> +                         gpio27, gpio28, gpio29, gpio30, gpio31, gpio32, gpio33,
> +                         gpio34, gpio35, gpio36, gpio37, gpio38, gpio39, gpio40,
> +                         gpio41, gpio42, gpio43, gpio44, gpio45, gpio46,
> +                         pcie_reset0, pcie_reset1, pcie_reset2]
> +                minItems: 1
> +                maxItems: 58
> +
> +              bias-disable: true
> +
> +              bias-pull-up: true
> +
> +              bias-pull-down: true
> +
> +              input-enable: true
> +
> +              output-enable: true
> +
> +              output-low: true
> +
> +              output-high: true
> +
> +              drive-open-drain: true
> +
> +              drive-strength:
> +                description:
> +                  Selects the drive strength for MIO pins, in mA.
> +                enum: [2, 4, 6, 8]
> +
> +            required:
> +              - pins
> +
> +            additionalProperties: false
> +
> +        additionalProperties: false
> +
> +    additionalProperties: false
> +
> +required:
> +  - compatible
> +  - reg
> +  - interrupts
> +  - gpio-controller
> +  - "#gpio-cells"
> +  - "#pwm-cells"
> +
> +additionalProperties: false
> +
> +examples:
> +  - |
> +    #include <dt-bindings/interrupt-controller/arm-gic.h>
> +
> +    mfd at 1fbf0200 {
> +        compatible = "airoha,en7581-gpio-sysctl";
> +        reg = <0x1fbf0200 0xc0>;
> +
> +        interrupt-parent = <&gic>;
> +        interrupts = <GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>;
> +
> +        gpio-controller;
> +        #gpio-cells = <2>;
> +
> +        interrupt-controller;
> +        #interrupt-cells = <2>;
> +
> +        #pwm-cells = <3>;
> +
> +        pinctrl {
> +            pcie1-rst-pins {
> +                conf {
> +                    pins = "pcie_reset1";
> +                    drive-open-drain = <1>;
> +                };
> +            };
> +
> +            pwm-pins {
> +                mux {
> +                    function = "pwm";
> +                    groups = "gpio18";
> +                };
> +            };
> +
> +            spi-pins {
> +                mux {
> +                    function = "spi";
> +                    groups = "spi_quad", "spi_cs1";
> +                };
> +            };
> +
> +            uart2-pins {
> +                mux {
> +                    function = "uart";
> +                    groups = "uart2", "uart2_cts_rts";
> +                };
> +            };
> +
> +            uar5-pins {
> +                mux {
> +                    function = "uart";
> +                    groups = "uart5";
> +                };
> +            };
> +
> +            mmc-pins {
> +                mux {
> +                    function = "emmc";
> +                    groups = "emmc";
> +                };
> +            };
> +
> +            mdio-pins {
> +                mux {
> +                    function = "mdio";
> +                    groups = "mdio";
> +                };
> +
> +                conf {
> +                    pins = "gpio2";
> +                    output-enable;
> +                };
> +            };
> +
> +            gswp1-led0-pins {
> +                mux {
> +                    function = "phy1_led0";
> +                    groups = "gpio33";
> +                };
> +            };
> +
> +            gswp2-led1-pins {
> +                mux {
> +                    function = "phy2_led1";
> +                    groups = "gpio44";
> +                };
> +            };
> +        };
> +    };
> +
> +...
> 
> -- 
> 2.46.0
> 

-- 
Lee Jones [???]


From ansuelsmth at gmail.com  Tue Sep  3 07:00:12 2024
From: ansuelsmth at gmail.com (Christian Marangi)
Date: Tue, 3 Sep 2024 16:00:12 +0200
Subject: [PATCH v3 2/5] dt-bindings: mfd: Add support for Airoha EN7581
 GPIO System Controller
In-Reply-To: <20240903153353.GZ6858@google.com>
References: <20240831-en7581-pinctrl-v3-0-98eebfb4da66@kernel.org>
 <20240831-en7581-pinctrl-v3-2-98eebfb4da66@kernel.org>
 <20240903153353.GZ6858@google.com>
Message-ID: <66d72ea9.df0a0220.21f5f.029f@mx.google.com>

On Tue, Sep 03, 2024 at 04:33:53PM +0100, Lee Jones wrote:
> On Sat, 31 Aug 2024, Lorenzo Bianconi wrote:
> 
> > From: Christian Marangi <ansuelsmth at gmail.com>
> > 
> > Add support for Airoha EN7581 GPIO System Controller which provide a
> > register map for controlling the GPIO, pinctrl and PWM of the SoC.
> > 
> > Schema define cells for both gpio/interrupt controller and PWM.
> > Moreover it provides a dedicated pinctrl node for pins and config
> > definitions.
> > 
> > Signed-off-by: Christian Marangi <ansuelsmth at gmail.com>
> > Co-developed-by: Lorenzo Bianconi <lorenzo at kernel.org>
> > Signed-off-by: Lorenzo Bianconi <lorenzo at kernel.org>
> > ---
> >  .../bindings/mfd/airoha,en7581-gpio-sysctl.yaml    | 433 +++++++++++++++++++++
> >  1 file changed, 433 insertions(+)
> > 
> > diff --git a/Documentation/devicetree/bindings/mfd/airoha,en7581-gpio-sysctl.yaml b/Documentation/devicetree/bindings/mfd/airoha,en7581-gpio-sysctl.yaml
> > new file mode 100644
> > index 000000000000..a9080c7f50f9
> > --- /dev/null
> > +++ b/Documentation/devicetree/bindings/mfd/airoha,en7581-gpio-sysctl.yaml
> > @@ -0,0 +1,433 @@
> > +# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
> > +%YAML 1.2
> > +---
> > +$id: http://devicetree.org/schemas/mfd/airoha,en7581-gpio-sysctl.yaml#
> > +$schema: http://devicetree.org/meta-schemas/core.yaml#
> > +
> > +title: Airoha EN7581 GPIO System Controller
> > +
> > +maintainers:
> > +  - Christian Marangi <ansuelsmth at gmail.com>
> > +  - Lorenzo Bianconi <lorenzo at kernel.org>
> > +
> > +description:
> > +  Airoha EN7581 SoC GPIO system controller which provided a register map
> > +  for controlling the GPIO, pins and PWM of the SoC.
> 
> This whole thing is just about pins.
> 
> The MFD portion of this submission doesn't do anything.
>

Hi Lee,

thanks for the review. I think you missed the other series as it was
requested to use MFD implementation due to shared register map.

> Please rework this to omit the MFD driver.

I'm a bit confused by this you mean in the schema? Putting PWM property
in a pinctrl schema looks wrong to me :(

> 
> After just a glance, it looks like simple-mfd _might_ work.

Simple-mfd works if register map are well defined and you can have
something like
- parent define the whole register
- child can user reg property to register offset and subsection of the
  parent register

Here it's all mixed and scrambled and also it was requested to have a
very simple node that include both pwm and pinctrl property (cause that
is how the HW register block is designed and schema must reflect HW)

Hope you can understand these reasons.

> 
> > +properties:
> > +  compatible:
> > +    const: airoha,en7581-gpio-sysctl
> > +
> > +  reg:
> > +    maxItems: 1
> > +
> > +  interrupts:
> > +    maxItems: 1
> > +
> > +  gpio-controller: true
> > +
> > +  '#gpio-cells':
> > +    const: 2
> > +
> > +  interrupt-controller: true
> > +
> > +  '#interrupt-cells':
> > +    const: 2
> > +
> > +  "#pwm-cells":
> > +    const: 3
> > +
> > +  pinctrl:
> > +    type: object
> > +
> > +    $ref: /schemas/pinctrl/pinctrl.yaml
> > +
> > +    patternProperties:
> > +      '-pins$':
> > +        type: object
> > +
> > +        patternProperties:
> > +          '^.*mux.*$':
> > +            type: object
> > +
> > +            description:
> > +              pinmux configuration nodes.
> > +
> > +            $ref: /schemas/pinctrl/pinmux-node.yaml
> > +
> > +            properties:
> > +              function:
> > +                description:
> > +                  A string containing the name of the function to mux to the group.
> > +                enum: [pon, tod_1pps, sipo, mdio, uart, i2c, jtag, pcm, spi,
> > +                       pcm_spi, i2s, emmc, pnand, pcie_reset, pwm, phy1_led0,
> > +                       phy2_led0, phy3_led0, phy4_led0, phy1_led1, phy2_led1,
> > +                       phy3_led1, phy4_led1]
> > +
> > +              groups:
> > +                description:
> > +                  An array of strings. Each string contains the name of a group.
> > +
> > +            required:
> > +              - function
> > +              - groups
> > +
> > +            allOf:
> > +              - if:
> > +                  properties:
> > +                    function:
> > +                      const: pon
> > +                then:
> > +                  properties:
> > +                    groups:
> > +                      enum: [pon]
> > +              - if:
> > +                  properties:
> > +                    function:
> > +                      const: tod_1pps
> > +                then:
> > +                  properties:
> > +                    groups:
> > +                      enum: [pon_tod_1pps, gsw_tod_1pps]
> > +              - if:
> > +                  properties:
> > +                    function:
> > +                      const: sipo
> > +                then:
> > +                  properties:
> > +                    groups:
> > +                      enum: [sipo, sipo_rclk]
> > +              - if:
> > +                  properties:
> > +                    function:
> > +                      const: mdio
> > +                then:
> > +                  properties:
> > +                    groups:
> > +                      enum: [mdio]
> > +              - if:
> > +                  properties:
> > +                    function:
> > +                      const: uart
> > +                then:
> > +                  properties:
> > +                    groups:
> > +                      items:
> > +                        enum: [uart2, uart2_cts_rts, hsuart, hsuart_cts_rts, uart4,
> > +                               uart5]
> > +                      maxItems: 2
> > +              - if:
> > +                  properties:
> > +                    function:
> > +                      const: i2c
> > +                then:
> > +                  properties:
> > +                    groups:
> > +                      enum: [i2c1]
> > +              - if:
> > +                  properties:
> > +                    function:
> > +                      const: jtag
> > +                then:
> > +                  properties:
> > +                    groups:
> > +                      enum: [jtag_udi, jtag_dfd]
> > +              - if:
> > +                  properties:
> > +                    function:
> > +                      const: pcm
> > +                then:
> > +                  properties:
> > +                    groups:
> > +                      enum: [pcm1, pcm2]
> > +              - if:
> > +                  properties:
> > +                    function:
> > +                      const: spi
> > +                then:
> > +                  properties:
> > +                    groups:
> > +                      items:
> > +                        enum: [spi_quad, spi_cs1]
> > +                      maxItems: 2
> > +              - if:
> > +                  properties:
> > +                    function:
> > +                      const: pcm_spi
> > +                then:
> > +                  properties:
> > +                    groups:
> > +                      items:
> > +                        enum: [pcm_spi, pcm_spi_int, pcm_spi_rst, pcm_spi_cs1,
> > +                               pcm_spi_cs2_p156, pcm_spi_cs2_p128, pcm_spi_cs3,
> > +                               pcm_spi_cs4]
> > +                      maxItems: 7
> > +              - if:
> > +                  properties:
> > +                    function:
> > +                      const: i2c
> > +                then:
> > +                  properties:
> > +                    groups:
> > +                      enum: [i2s]
> > +              - if:
> > +                  properties:
> > +                    function:
> > +                      const: emmc
> > +                then:
> > +                  properties:
> > +                    groups:
> > +                      enum: [emmc]
> > +              - if:
> > +                  properties:
> > +                    function:
> > +                      const: pnand
> > +                then:
> > +                  properties:
> > +                    groups:
> > +                      enum: [pnand]
> > +              - if:
> > +                  properties:
> > +                    function:
> > +                      const: pcie_reset
> > +                then:
> > +                  properties:
> > +                    groups:
> > +                      enum: [pcie_reset0, pcie_reset1, pcie_reset2]
> > +              - if:
> > +                  properties:
> > +                    function:
> > +                      const: pwm
> > +                then:
> > +                  properties:
> > +                    groups:
> > +                      enum: [gpio0, gpio1, gpio2, gpio3, gpio4, gpio5, gpio6,
> > +                             gpio7, gpio8, gpio9, gpio10, gpio11, gpio12, gpio13,
> > +                             gpio14, gpio15, gpio16, gpio17, gpio18, gpio19,
> > +                             gpio20, gpio21, gpio22, gpio23, gpio24, gpio25,
> > +                             gpio26, gpio27, gpio28, gpio29, gpio30, gpio31,
> > +                             gpio36, gpio37, gpio38, gpio39, gpio40, gpio41,
> > +                             gpio42, gpio43, gpio44, gpio45, gpio46, gpio47]
> > +              - if:
> > +                  properties:
> > +                    function:
> > +                      const: phy1_led0
> > +                then:
> > +                  properties:
> > +                    groups:
> > +                      enum: [gpio33, gpio34, gpio35, gpio42]
> > +              - if:
> > +                  properties:
> > +                    function:
> > +                      const: phy2_led0
> > +                then:
> > +                  properties:
> > +                    groups:
> > +                      enum: [gpio33, gpio34, gpio35, gpio42]
> > +              - if:
> > +                  properties:
> > +                    function:
> > +                      const: phy3_led0
> > +                then:
> > +                  properties:
> > +                    groups:
> > +                      enum: [gpio33, gpio34, gpio35, gpio42]
> > +              - if:
> > +                  properties:
> > +                    function:
> > +                      const: phy4_led0
> > +                then:
> > +                  properties:
> > +                    groups:
> > +                      enum: [gpio33, gpio34, gpio35, gpio42]
> > +              - if:
> > +                  properties:
> > +                    function:
> > +                      const: phy1_led1
> > +                then:
> > +                  properties:
> > +                    groups:
> > +                      enum: [gpio43, gpio44, gpio45, gpio46]
> > +              - if:
> > +                  properties:
> > +                    function:
> > +                      const: phy2_led1
> > +                then:
> > +                  properties:
> > +                    groups:
> > +                      enum: [gpio43, gpio44, gpio45, gpio46]
> > +              - if:
> > +                  properties:
> > +                    function:
> > +                      const: phy3_led1
> > +                then:
> > +                  properties:
> > +                    groups:
> > +                      enum: [gpio43, gpio44, gpio45, gpio46]
> > +              - if:
> > +                  properties:
> > +                    function:
> > +                      const: phy4_led1
> > +                then:
> > +                  properties:
> > +                    groups:
> > +                      enum: [gpio43, gpio44, gpio45, gpio46]
> > +
> > +            additionalProperties: false
> > +
> > +          '^.*conf.*$':
> > +            type: object
> > +
> > +            description:
> > +              pinconf configuration nodes.
> > +
> > +            $ref: /schemas/pinctrl/pincfg-node.yaml
> > +
> > +            properties:
> > +              pins:
> > +                description:
> > +                  An array of strings. Each string contains the name of a pin.
> > +                items:
> > +                  enum: [uart1_txd, uart1_rxd, i2c_scl, i2c_sda, spi_cs0, spi_clk,
> > +                         spi_mosi, spi_miso, gpio0, gpio1, gpio2, gpio3, gpio4,
> > +                         gpio5, gpio6, gpio7, gpio8, gpio9, gpio10, gpio11, gpio12,
> > +                         gpio13, gpio14, gpio15, gpio16, gpio17, gpio18, gpio19,
> > +                         gpio20, gpio21, gpio22, gpio23, gpio24, gpio25, gpio26,
> > +                         gpio27, gpio28, gpio29, gpio30, gpio31, gpio32, gpio33,
> > +                         gpio34, gpio35, gpio36, gpio37, gpio38, gpio39, gpio40,
> > +                         gpio41, gpio42, gpio43, gpio44, gpio45, gpio46,
> > +                         pcie_reset0, pcie_reset1, pcie_reset2]
> > +                minItems: 1
> > +                maxItems: 58
> > +
> > +              bias-disable: true
> > +
> > +              bias-pull-up: true
> > +
> > +              bias-pull-down: true
> > +
> > +              input-enable: true
> > +
> > +              output-enable: true
> > +
> > +              output-low: true
> > +
> > +              output-high: true
> > +
> > +              drive-open-drain: true
> > +
> > +              drive-strength:
> > +                description:
> > +                  Selects the drive strength for MIO pins, in mA.
> > +                enum: [2, 4, 6, 8]
> > +
> > +            required:
> > +              - pins
> > +
> > +            additionalProperties: false
> > +
> > +        additionalProperties: false
> > +
> > +    additionalProperties: false
> > +
> > +required:
> > +  - compatible
> > +  - reg
> > +  - interrupts
> > +  - gpio-controller
> > +  - "#gpio-cells"
> > +  - "#pwm-cells"
> > +
> > +additionalProperties: false
> > +
> > +examples:
> > +  - |
> > +    #include <dt-bindings/interrupt-controller/arm-gic.h>
> > +
> > +    mfd at 1fbf0200 {
> > +        compatible = "airoha,en7581-gpio-sysctl";
> > +        reg = <0x1fbf0200 0xc0>;
> > +
> > +        interrupt-parent = <&gic>;
> > +        interrupts = <GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>;
> > +
> > +        gpio-controller;
> > +        #gpio-cells = <2>;
> > +
> > +        interrupt-controller;
> > +        #interrupt-cells = <2>;
> > +
> > +        #pwm-cells = <3>;
> > +
> > +        pinctrl {
> > +            pcie1-rst-pins {
> > +                conf {
> > +                    pins = "pcie_reset1";
> > +                    drive-open-drain = <1>;
> > +                };
> > +            };
> > +
> > +            pwm-pins {
> > +                mux {
> > +                    function = "pwm";
> > +                    groups = "gpio18";
> > +                };
> > +            };
> > +
> > +            spi-pins {
> > +                mux {
> > +                    function = "spi";
> > +                    groups = "spi_quad", "spi_cs1";
> > +                };
> > +            };
> > +
> > +            uart2-pins {
> > +                mux {
> > +                    function = "uart";
> > +                    groups = "uart2", "uart2_cts_rts";
> > +                };
> > +            };
> > +
> > +            uar5-pins {
> > +                mux {
> > +                    function = "uart";
> > +                    groups = "uart5";
> > +                };
> > +            };
> > +
> > +            mmc-pins {
> > +                mux {
> > +                    function = "emmc";
> > +                    groups = "emmc";
> > +                };
> > +            };
> > +
> > +            mdio-pins {
> > +                mux {
> > +                    function = "mdio";
> > +                    groups = "mdio";
> > +                };
> > +
> > +                conf {
> > +                    pins = "gpio2";
> > +                    output-enable;
> > +                };
> > +            };
> > +
> > +            gswp1-led0-pins {
> > +                mux {
> > +                    function = "phy1_led0";
> > +                    groups = "gpio33";
> > +                };
> > +            };
> > +
> > +            gswp2-led1-pins {
> > +                mux {
> > +                    function = "phy2_led1";
> > +                    groups = "gpio44";
> > +                };
> > +            };
> > +        };
> > +    };
> > +
> > +...
> > 
> > -- 
> > 2.46.0
> > 
> 
> -- 
> Lee Jones [???]

-- 
	Ansuel


From u.kleine-koenig at baylibre.com  Tue Sep  3 08:47:16 2024
From: u.kleine-koenig at baylibre.com (Uwe =?utf-8?Q?Kleine-K=C3=B6nig?=)
Date: Tue, 3 Sep 2024 17:47:16 +0200
Subject: [PATCH v3 5/5] pwm: airoha: Add support for EN7581 SoC
In-Reply-To: <d9298199-fe10-4b28-8e28-dc252bd6832c@genexis.eu>
References: <20240831-en7581-pinctrl-v3-0-98eebfb4da66@kernel.org>
 <20240831-en7581-pinctrl-v3-5-98eebfb4da66@kernel.org>
 <yfqmlca6cnhrghpo5s6tml36tngmekcfbyjakxs7or7wtap3ka@7qlrxjowo4ou>
 <d9298199-fe10-4b28-8e28-dc252bd6832c@genexis.eu>
Message-ID: <t2f5kockuvfi66qqumda6jxf5a4c4zf35ld5ainsnksavkchyj@kdueaqlhjoar>

Hello Benjamin,

On Tue, Sep 03, 2024 at 01:58:30PM +0200, Benjamin Larsson wrote:
> On 2024-09-03 12:46, Uwe Kleine-K?nig wrote:
> > Would you please add a "Limitations" paragraph here covering the
> > following questions:
> > 
> >   - How does the hardware behave on changes of configuration (does it
> >     complete the currently running period? Are there any glitches?)
> >   - How does the hardware behave on disabling?
> > 
> > Please stick to the format used in several other drivers such that
> > 
> > 	sed -rn '/Limitations:/,/\*\/?$/p' drivers/pwm/*.c
> > 
> > emits the informations.
> 
> The answer to your questions are currently unknown. Is this information
> needed for a merge of the driver ?

It would be very welcome and typically isn't that hard to work out if
you have an LED connected to the output or a similar means to observe
the output. An oscilloscope makes it still easier.

For example to check if the current period is completed configure the
PWM with period = 1s and duty_cycle = 0 disabling the LED. (I leave it
as an exercise for the reader what to do if duty_cycle = 0 enables the
LED :-) Then do:

	pwm_apply_might_sleep(mypwm, &(struct pwm_state){
		.period = NSEC_PER_SEC,
		.duty_cycle = NSEC_PER_SEC,
		.enabled = true,
	});
	pwm_apply_might_sleep(mypwm, &(struct pwm_state){
		.period = NSEC_PER_SEC,
		.duty_cycle = 0,
		.enabled = true,
	});

Iff that enables the LED for a second, the period is completed. The
question about glitches is a bit harder to answer, but with a tool like
memtool should be possible to answer. Alternatively add delays and
printk output to .apply() in the critical places.

> > > +#define airoha_pwm_sgpio_clear(pc, offset, mask)				\
> > > +	airoha_pwm_sgpio_rmw((pc), (offset), (mask), 0)
> > > +#define airoha_pwm_flash_set(pc, offset, val)					\
> > > +	airoha_pwm_flash_rmw((pc), (offset), 0, (val))
> > > +#define airoha_pwm_flash_clear(pc, offset, mask)				\
> > > +	airoha_pwm_flash_rmw((pc), (offset), (mask), 0)
> > > +
> > > +static int airoha_pwm_get_waveform(struct airoha_pwm *pc, u64 duty_ns,
> > > +				   u64 period_ns)
> > Given that "waveform" will gain some specific semantic soon, but this
> > usage is different, I'd like to see this function renamed.
> 
> I suggest pwm_generator. Is that acceptable ?

This function determines the register values to write for a given
duty_ns + period_ns combination, right? airoha_pwm_calc_bucket_config()?
 
> > If you limit the number of requested pwm devices to 8, the code gets a
> > tad simpler (because you can map a fixed bucket to each pwm device and
> > don't need to search during .apply()) and each consumer has maximal
> > freedom to configure its device.
> 
> The main use for this solution is for led-dimming which uses the same timing
> among groups of leds. Most (of our) products have more then 8 leds in total,
> with a limit of only 8 pwm devices it would not be possible to use the
> mainline driver with our hardware. I suggest that the current logic is kept
> but properly documented in the limitations section.

Fine for me.

Best regards
Uwe
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-mediatek/attachments/20240903/8945edeb/attachment-0001.sig>

From lee at kernel.org  Tue Sep  3 09:42:18 2024
From: lee at kernel.org (Lee Jones)
Date: Tue, 3 Sep 2024 17:42:18 +0100
Subject: [PATCH v3 2/5] dt-bindings: mfd: Add support for Airoha EN7581
 GPIO System Controller
In-Reply-To: <66d72ea9.df0a0220.21f5f.029f@mx.google.com>
References: <20240831-en7581-pinctrl-v3-0-98eebfb4da66@kernel.org>
 <20240831-en7581-pinctrl-v3-2-98eebfb4da66@kernel.org>
 <20240903153353.GZ6858@google.com>
 <66d72ea9.df0a0220.21f5f.029f@mx.google.com>
Message-ID: <20240903164218.GC6858@google.com>

On Tue, 03 Sep 2024, Christian Marangi wrote:

> On Tue, Sep 03, 2024 at 04:33:53PM +0100, Lee Jones wrote:
> > On Sat, 31 Aug 2024, Lorenzo Bianconi wrote:
> > 
> > > From: Christian Marangi <ansuelsmth at gmail.com>
> > > 
> > > Add support for Airoha EN7581 GPIO System Controller which provide a
> > > register map for controlling the GPIO, pinctrl and PWM of the SoC.
> > > 
> > > Schema define cells for both gpio/interrupt controller and PWM.
> > > Moreover it provides a dedicated pinctrl node for pins and config
> > > definitions.
> > > 
> > > Signed-off-by: Christian Marangi <ansuelsmth at gmail.com>
> > > Co-developed-by: Lorenzo Bianconi <lorenzo at kernel.org>
> > > Signed-off-by: Lorenzo Bianconi <lorenzo at kernel.org>
> > > ---
> > >  .../bindings/mfd/airoha,en7581-gpio-sysctl.yaml    | 433 +++++++++++++++++++++
> > >  1 file changed, 433 insertions(+)
> > > 
> > > diff --git a/Documentation/devicetree/bindings/mfd/airoha,en7581-gpio-sysctl.yaml b/Documentation/devicetree/bindings/mfd/airoha,en7581-gpio-sysctl.yaml
> > > new file mode 100644
> > > index 000000000000..a9080c7f50f9
> > > --- /dev/null
> > > +++ b/Documentation/devicetree/bindings/mfd/airoha,en7581-gpio-sysctl.yaml
> > > @@ -0,0 +1,433 @@
> > > +# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
> > > +%YAML 1.2
> > > +---
> > > +$id: http://devicetree.org/schemas/mfd/airoha,en7581-gpio-sysctl.yaml#
> > > +$schema: http://devicetree.org/meta-schemas/core.yaml#
> > > +
> > > +title: Airoha EN7581 GPIO System Controller
> > > +
> > > +maintainers:
> > > +  - Christian Marangi <ansuelsmth at gmail.com>
> > > +  - Lorenzo Bianconi <lorenzo at kernel.org>
> > > +
> > > +description:
> > > +  Airoha EN7581 SoC GPIO system controller which provided a register map
> > > +  for controlling the GPIO, pins and PWM of the SoC.
> > 
> > This whole thing is just about pins.
> > 
> > The MFD portion of this submission doesn't do anything.
> >
> 
> Hi Lee,
> 
> thanks for the review. I think you missed the other series as it was
> requested to use MFD implementation due to shared register map.
> 
> > Please rework this to omit the MFD driver.
> 
> I'm a bit confused by this you mean in the schema? Putting PWM property
> in a pinctrl schema looks wrong to me :(
> 
> > 
> > After just a glance, it looks like simple-mfd _might_ work.
> 
> Simple-mfd works if register map are well defined and you can have
> something like
> - parent define the whole register
> - child can user reg property to register offset and subsection of the
>   parent register
> 
> Here it's all mixed and scrambled and also it was requested to have a
> very simple node that include both pwm and pinctrl property (cause that
> is how the HW register block is designed and schema must reflect HW)
> 
> Hope you can understand these reasons.

Thinking very quickly before I have to rush off.

Have you considered syscon?

-- 
Lee Jones [???]


From broonie at kernel.org  Tue Sep  3 10:14:38 2024
From: broonie at kernel.org (Mark Brown)
Date: Tue, 3 Sep 2024 18:14:38 +0100
Subject: [PATCH v7 12/16] ASoC: codecs: add MT6357 support
In-Reply-To: <20240226-audio-i350-v7-12-6518d953a141@baylibre.com>
References: <20240226-audio-i350-v7-0-6518d953a141@baylibre.com>
 <20240226-audio-i350-v7-12-6518d953a141@baylibre.com>
Message-ID: <c386c74c-9008-48ea-ad79-524eb85c370b@sirena.org.uk>

On Mon, Jul 22, 2024 at 08:53:41AM +0200, amergnat at baylibre.com wrote:
> From: Nicolas Belin <nbelin at baylibre.com>
> 
> Add the support of MT6357 PMIC audio codec.

This breaks the build:

/build/stage/linux/sound/soc/codecs/mt6357.c: In function ?mt6357_platform_driver_probe?:
/build/stage/linux/sound/soc/codecs/mt6357.c:1824:55: error: too many arguments for format [-Werror=format-extra-args]
 1824 |                 return dev_err_probe(&pdev->dev, ret, "Failed to parse dts\n", __func__);
      |                                                       ^~~~~~~~~~~~~~~~~~~~~~~
cc1: all warnings being treated as errors
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-mediatek/attachments/20240903/5028341b/attachment.sig>

From tjmercier at google.com  Tue Sep  3 10:49:46 2024
From: tjmercier at google.com (T.J. Mercier)
Date: Tue, 3 Sep 2024 10:49:46 -0700
Subject: [RFC PATCH 2/4] tee: new ioctl to a register tee_shm from a
 dmabuf file descriptor
In-Reply-To: <20240830070351.2855919-3-jens.wiklander@linaro.org>
References: <20240830070351.2855919-1-jens.wiklander@linaro.org> <20240830070351.2855919-3-jens.wiklander@linaro.org>
Message-ID: <CABdmKX02Zd98euuxvKHuV2C5Cng+4P3_8UL3xn2apMP9to+KOA@mail.gmail.com>

On Fri, Aug 30, 2024 at 12:04?AM Jens Wiklander
<jens.wiklander at linaro.org> wrote:
>
> From: Etienne Carriere <etienne.carriere at linaro.org>
>
> Enable userspace to create a tee_shm object that refers to a dmabuf
> reference.
>
> Userspace registers the dmabuf file descriptor as in a tee_shm object.
> The registration is completed with a tee_shm file descriptor returned to
> userspace.
>
> Userspace is free to close the dmabuf file descriptor now since all the
> resources are now held via the tee_shm object.
>
> Closing the tee_shm file descriptor will release all resources used by the
> tee_shm object.
>
> This change only support dmabuf references that relates to physically
> contiguous memory buffers.
>
> New tee_shm flag to identify tee_shm objects built from a registered
> dmabuf, TEE_SHM_DMA_BUF.
>
> Signed-off-by: Etienne Carriere <etienne.carriere at linaro.org>
> Signed-off-by: Olivier Masse <olivier.masse at nxp.com>
> Signed-off-by: Jens Wiklander <jens.wiklander at linaro.org>
> ---
>  drivers/tee/tee_core.c   |  38 ++++++++++++++
>  drivers/tee/tee_shm.c    | 104 +++++++++++++++++++++++++++++++++++++--
>  include/linux/tee_drv.h  |  11 +++++
>  include/uapi/linux/tee.h |  29 +++++++++++
>  4 files changed, 179 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/tee/tee_core.c b/drivers/tee/tee_core.c
> index e59c20d74b36..3dfd5428d58c 100644
> --- a/drivers/tee/tee_core.c
> +++ b/drivers/tee/tee_core.c
> @@ -356,6 +356,42 @@ tee_ioctl_shm_register(struct tee_context *ctx,
>         return ret;
>  }
>
> +static int tee_ioctl_shm_register_fd(struct tee_context *ctx,
> +                                    struct tee_ioctl_shm_register_fd_data __user *udata)
> +{
> +       struct tee_ioctl_shm_register_fd_data data;
> +       struct tee_shm *shm;
> +       long ret;
> +
> +       if (copy_from_user(&data, udata, sizeof(data)))
> +               return -EFAULT;
> +
> +       /* Currently no input flags are supported */
> +       if (data.flags)
> +               return -EINVAL;
> +
> +       shm = tee_shm_register_fd(ctx, data.fd);
> +       if (IS_ERR(shm))
> +               return -EINVAL;
> +
> +       data.id = shm->id;
> +       data.flags = shm->flags;
> +       data.size = shm->size;
> +
> +       if (copy_to_user(udata, &data, sizeof(data)))
> +               ret = -EFAULT;
> +       else
> +               ret = tee_shm_get_fd(shm);
> +
> +       /*
> +        * When user space closes the file descriptor the shared memory
> +        * should be freed or if tee_shm_get_fd() failed then it will
> +        * be freed immediately.
> +        */
> +       tee_shm_put(shm);
> +       return ret;
> +}
> +
>  static int params_from_user(struct tee_context *ctx, struct tee_param *params,
>                             size_t num_params,
>                             struct tee_ioctl_param __user *uparams)
> @@ -830,6 +866,8 @@ static long tee_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
>                 return tee_ioctl_shm_alloc(ctx, uarg);
>         case TEE_IOC_SHM_REGISTER:
>                 return tee_ioctl_shm_register(ctx, uarg);
> +       case TEE_IOC_SHM_REGISTER_FD:
> +               return tee_ioctl_shm_register_fd(ctx, uarg);
>         case TEE_IOC_OPEN_SESSION:
>                 return tee_ioctl_open_session(ctx, uarg);
>         case TEE_IOC_INVOKE:
> diff --git a/drivers/tee/tee_shm.c b/drivers/tee/tee_shm.c
> index 731d9028b67f..a1cb3c8b6423 100644
> --- a/drivers/tee/tee_shm.c
> +++ b/drivers/tee/tee_shm.c
> @@ -4,6 +4,7 @@
>   */
>  #include <linux/anon_inodes.h>
>  #include <linux/device.h>
> +#include <linux/dma-buf.h>
>  #include <linux/idr.h>
>  #include <linux/mm.h>
>  #include <linux/sched.h>
> @@ -14,6 +15,14 @@
>  #include <linux/highmem.h>
>  #include "tee_private.h"
>
> +/* extra references appended to shm object for registered shared memory */
> +struct tee_shm_dmabuf_ref {
> +       struct tee_shm shm;
> +       struct dma_buf *dmabuf;
> +       struct dma_buf_attachment *attach;
> +       struct sg_table *sgt;
> +};
> +
>  static void shm_put_kernel_pages(struct page **pages, size_t page_count)
>  {
>         size_t n;
> @@ -44,7 +53,16 @@ static void release_registered_pages(struct tee_shm *shm)
>
>  static void tee_shm_release(struct tee_device *teedev, struct tee_shm *shm)
>  {
> -       if (shm->flags & TEE_SHM_POOL) {
> +       if (shm->flags & TEE_SHM_DMA_BUF) {
> +               struct tee_shm_dmabuf_ref *ref;
> +
> +               ref = container_of(shm, struct tee_shm_dmabuf_ref, shm);
> +               dma_buf_unmap_attachment(ref->attach, ref->sgt,
> +               DMA_BIDIRECTIONAL);
> +
> +               dma_buf_detach(ref->dmabuf, ref->attach);
> +               dma_buf_put(ref->dmabuf);
> +       } else if (shm->flags & TEE_SHM_POOL) {
>                 teedev->pool->ops->free(teedev->pool, shm);
>         } else if (shm->flags & TEE_SHM_DYNAMIC) {
>                 int rc = teedev->desc->ops->shm_unregister(shm->ctx, shm);
> @@ -56,7 +74,8 @@ static void tee_shm_release(struct tee_device *teedev, struct tee_shm *shm)
>                 release_registered_pages(shm);
>         }
>
> -       teedev_ctx_put(shm->ctx);
> +       if (shm->ctx)
> +               teedev_ctx_put(shm->ctx);
>
>         kfree(shm);
>
> @@ -168,7 +187,7 @@ struct tee_shm *tee_shm_alloc_user_buf(struct tee_context *ctx, size_t size)
>   * tee_client_invoke_func(). The memory allocated is later freed with a
>   * call to tee_shm_free().
>   *
> - * @returns a pointer to 'struct tee_shm'
> + * @returns a pointer to 'struct tee_shm' on success, and ERR_PTR on failure
>   */
>  struct tee_shm *tee_shm_alloc_kernel_buf(struct tee_context *ctx, size_t size)
>  {
> @@ -178,6 +197,85 @@ struct tee_shm *tee_shm_alloc_kernel_buf(struct tee_context *ctx, size_t size)
>  }
>  EXPORT_SYMBOL_GPL(tee_shm_alloc_kernel_buf);
>
> +struct tee_shm *tee_shm_register_fd(struct tee_context *ctx, int fd)
> +{
> +       struct tee_shm_dmabuf_ref *ref;
> +       int rc;
> +
> +       if (!tee_device_get(ctx->teedev))
> +               return ERR_PTR(-EINVAL);
> +
> +       teedev_ctx_get(ctx);
> +
> +       ref = kzalloc(sizeof(*ref), GFP_KERNEL);
> +       if (!ref) {
> +               rc = -ENOMEM;
> +               goto err_put_tee;
> +       }
> +
> +       refcount_set(&ref->shm.refcount, 1);
> +       ref->shm.ctx = ctx;
> +       ref->shm.id = -1;
> +
> +       ref->dmabuf = dma_buf_get(fd);
> +       if (IS_ERR(ref->dmabuf)) {
> +               rc = PTR_ERR(ref->dmabuf);
> +               goto err_put_dmabuf;
> +       }

Hi,

Most of the gotos in the errors paths from here on look offset by one
to me. Attempting to put a dmabuf after failing to get, detaching
after failing to attach, unmapping after failing to map, removing an
IDR after failing to allocate one.


> +
> +       ref->attach = dma_buf_attach(ref->dmabuf, &ref->shm.ctx->teedev->dev);
> +       if (IS_ERR(ref->attach)) {
> +               rc = PTR_ERR(ref->attach);
> +               goto err_detach;
> +       }
> +
> +       ref->sgt = dma_buf_map_attachment(ref->attach, DMA_BIDIRECTIONAL);
> +       if (IS_ERR(ref->sgt)) {
> +               rc = PTR_ERR(ref->sgt);
> +               goto err_unmap_attachement;
> +       }
> +
> +       if (sg_nents(ref->sgt->sgl) != 1) {
> +               rc = PTR_ERR(ref->sgt->sgl);
> +               goto err_unmap_attachement;
> +       }
> +
> +       ref->shm.paddr = page_to_phys(sg_page(ref->sgt->sgl));
> +       ref->shm.size = ref->sgt->sgl->length;
> +       ref->shm.flags = TEE_SHM_DMA_BUF;
> +
> +       mutex_lock(&ref->shm.ctx->teedev->mutex);
> +       ref->shm.id = idr_alloc(&ref->shm.ctx->teedev->idr, &ref->shm,
> +                               1, 0, GFP_KERNEL);
> +       mutex_unlock(&ref->shm.ctx->teedev->mutex);
> +       if (ref->shm.id < 0) {
> +               rc = ref->shm.id;
> +               goto err_idr_remove;
> +       }
> +
> +       return &ref->shm;
> +
> +err_idr_remove:
> +       mutex_lock(&ctx->teedev->mutex);
> +       idr_remove(&ctx->teedev->idr, ref->shm.id);
> +       mutex_unlock(&ctx->teedev->mutex);
> +err_unmap_attachement:
> +       dma_buf_unmap_attachment(ref->attach, ref->sgt, DMA_BIDIRECTIONAL);
> +err_detach:
> +       dma_buf_detach(ref->dmabuf, ref->attach);
> +err_put_dmabuf:
> +       dma_buf_put(ref->dmabuf);
> +       kfree(ref);
> +err_put_tee:
> +       teedev_ctx_put(ctx);
> +       tee_device_put(ctx->teedev);
> +
> +       return ERR_PTR(rc);
> +}
> +EXPORT_SYMBOL_GPL(tee_shm_register_fd);
> +
> +
> +
>  /**
>   * tee_shm_alloc_priv_buf() - Allocate shared memory for a privately shared
>   *                           kernel buffer
> diff --git a/include/linux/tee_drv.h b/include/linux/tee_drv.h
> index 71632e3c5f18..6a1fee689007 100644
> --- a/include/linux/tee_drv.h
> +++ b/include/linux/tee_drv.h
> @@ -25,6 +25,7 @@
>  #define TEE_SHM_USER_MAPPED    BIT(1)  /* Memory mapped in user space */
>  #define TEE_SHM_POOL           BIT(2)  /* Memory allocated from pool */
>  #define TEE_SHM_PRIV           BIT(3)  /* Memory private to TEE driver */
> +#define TEE_SHM_DMA_BUF                BIT(4)  /* Memory with dma-buf handle */
>
>  struct device;
>  struct tee_device;
> @@ -275,6 +276,16 @@ void *tee_get_drvdata(struct tee_device *teedev);
>  struct tee_shm *tee_shm_alloc_priv_buf(struct tee_context *ctx, size_t size);
>  struct tee_shm *tee_shm_alloc_kernel_buf(struct tee_context *ctx, size_t size);
>
> +/**
> + * tee_shm_register_fd() - Register shared memory from file descriptor
> + *
> + * @ctx:       Context that allocates the shared memory
> + * @fd:                Shared memory file descriptor reference
> + *
> + * @returns a pointer to 'struct tee_shm' on success, and ERR_PTR on failure
> + */
> +struct tee_shm *tee_shm_register_fd(struct tee_context *ctx, int fd);
> +
>  struct tee_shm *tee_shm_register_kernel_buf(struct tee_context *ctx,
>                                             void *addr, size_t length);
>
> diff --git a/include/uapi/linux/tee.h b/include/uapi/linux/tee.h
> index 23e57164693c..77bc8ef24d3c 100644
> --- a/include/uapi/linux/tee.h
> +++ b/include/uapi/linux/tee.h
> @@ -117,6 +117,35 @@ struct tee_ioctl_shm_alloc_data {
>  #define TEE_IOC_SHM_ALLOC      _IOWR(TEE_IOC_MAGIC, TEE_IOC_BASE + 1, \
>                                      struct tee_ioctl_shm_alloc_data)
>
> +/**
> + * struct tee_ioctl_shm_register_fd_data - Shared memory registering argument
> + * @fd:                [in] File descriptor identifying the shared memory
> + * @size:      [out] Size of shared memory to allocate
> + * @flags:     [in] Flags to/from allocation.
> + * @id:                [out] Identifier of the shared memory
> + *
> + * The flags field should currently be zero as input. Updated by the call
> + * with actual flags as defined by TEE_IOCTL_SHM_* above.
> + * This structure is used as argument for TEE_IOC_SHM_REGISTER_FD below.
> + */
> +struct tee_ioctl_shm_register_fd_data {
> +       __s64 fd;
> +       __u64 size;
> +       __u32 flags;
> +       __s32 id;
> +} __aligned(8);
> +
> +/**
> + * TEE_IOC_SHM_REGISTER_FD - register a shared memory from a file descriptor
> + *
> + * Returns a file descriptor on success or < 0 on failure
> + *
> + * The returned file descriptor refers to the shared memory object in kernel
> + * land. The shared memory is freed when the descriptor is closed.
> + */
> +#define TEE_IOC_SHM_REGISTER_FD        _IOWR(TEE_IOC_MAGIC, TEE_IOC_BASE + 8, \
> +                                    struct tee_ioctl_shm_register_fd_data)
> +
>  /**
>   * struct tee_ioctl_buf_data - Variable sized buffer
>   * @buf_ptr:   [in] A __user pointer to a buffer
> --
> 2.34.1
>


From tjmercier at google.com  Tue Sep  3 10:50:03 2024
From: tjmercier at google.com (T.J. Mercier)
Date: Tue, 3 Sep 2024 10:50:03 -0700
Subject: [RFC PATCH 4/4] dma-buf: heaps: add Linaro restricted dmabuf heap support
In-Reply-To: <20240830070351.2855919-5-jens.wiklander@linaro.org>
References: <20240830070351.2855919-1-jens.wiklander@linaro.org> <20240830070351.2855919-5-jens.wiklander@linaro.org>
Message-ID: <CABdmKX2KzswmiDY4oWw69_rPWs8d_Cqp7OXouSeMQaYX1SDSmw@mail.gmail.com>

On Fri, Aug 30, 2024 at 12:04?AM Jens Wiklander
<jens.wiklander at linaro.org> wrote:
>
> Add a Linaro restricted heap using the linaro,restricted-heap bindings
> implemented based on the generic restricted heap.
>
> The bindings defines a range of physical restricted memory. The heap
> manages this address range using genalloc. The allocated dma-buf file
> descriptor can later be registered with the TEE subsystem for later use
> via Trusted Applications in the secure world.
>
> Co-developed-by: Olivier Masse <olivier.masse at nxp.com>
> Signed-off-by: Olivier Masse <olivier.masse at nxp.com>
> Signed-off-by: Jens Wiklander <jens.wiklander at linaro.org>
> ---
>  drivers/dma-buf/heaps/Kconfig                 |  10 ++
>  drivers/dma-buf/heaps/Makefile                |   1 +
>  .../dma-buf/heaps/restricted_heap_linaro.c    | 165 ++++++++++++++++++
>  3 files changed, 176 insertions(+)
>  create mode 100644 drivers/dma-buf/heaps/restricted_heap_linaro.c
>
> diff --git a/drivers/dma-buf/heaps/Kconfig b/drivers/dma-buf/heaps/Kconfig
> index 58903bc62ac8..82e2c5d09242 100644
> --- a/drivers/dma-buf/heaps/Kconfig
> +++ b/drivers/dma-buf/heaps/Kconfig
> @@ -28,3 +28,13 @@ config DMABUF_HEAPS_RESTRICTED_MTK
>         help
>           Enable restricted dma-buf heaps for MediaTek platform. This heap is backed by
>           TEE client interfaces. If in doubt, say N.
> +
> +config DMABUF_HEAPS_RESTRICTED_LINARO
> +       bool "Linaro DMA-BUF Restricted Heap"
> +       depends on DMABUF_HEAPS_RESTRICTED
> +       help
> +         Choose this option to enable the Linaro restricted dma-buf heap.
> +         The restricted heap pools are defined according to the DT. Heaps
> +         are allocated in the pools using gen allocater.
> +         If in doubt, say N.
> +
> diff --git a/drivers/dma-buf/heaps/Makefile b/drivers/dma-buf/heaps/Makefile
> index 0028aa9d875f..66b2f67c47b5 100644
> --- a/drivers/dma-buf/heaps/Makefile
> +++ b/drivers/dma-buf/heaps/Makefile
> @@ -2,4 +2,5 @@
>  obj-$(CONFIG_DMABUF_HEAPS_CMA)         += cma_heap.o
>  obj-$(CONFIG_DMABUF_HEAPS_RESTRICTED)  += restricted_heap.o
>  obj-$(CONFIG_DMABUF_HEAPS_RESTRICTED_MTK)      += restricted_heap_mtk.o
> +obj-$(CONFIG_DMABUF_HEAPS_RESTRICTED_LINARO)   += restricted_heap_linaro.o
>  obj-$(CONFIG_DMABUF_HEAPS_SYSTEM)      += system_heap.o
> diff --git a/drivers/dma-buf/heaps/restricted_heap_linaro.c b/drivers/dma-buf/heaps/restricted_heap_linaro.c
> new file mode 100644
> index 000000000000..4b08ed514023
> --- /dev/null
> +++ b/drivers/dma-buf/heaps/restricted_heap_linaro.c
> @@ -0,0 +1,165 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * DMABUF secure heap exporter
> + *
> + * Copyright 2021 NXP.
> + * Copyright 2024 Linaro Limited.
> + */
> +
> +#define pr_fmt(fmt)     "rheap_linaro: " fmt
> +
> +#include <linux/dma-buf.h>
> +#include <linux/err.h>
> +#include <linux/genalloc.h>
> +#include <linux/module.h>
> +#include <linux/of.h>
> +#include <linux/of_fdt.h>
> +#include <linux/of_reserved_mem.h>
> +#include <linux/scatterlist.h>
> +#include <linux/slab.h>
> +
> +#include "restricted_heap.h"
> +
> +#define MAX_HEAP_COUNT 2

Are multiple supported because of what Cyrille mentioned here about permissions?
https://lore.kernel.org/lkml/DBBPR04MB7514E006455AEA407041E4F788709 at DBBPR04MB7514.eurprd04.prod.outlook.com/

So this is just some arbitrary limit? I'd prefer to have some sort of
documentation about this.


> +#define HEAP_NAME_LEN  32
> +
> +struct resmem_restricted {
> +       phys_addr_t base;
> +       phys_addr_t size;
> +
> +       char name[HEAP_NAME_LEN];
> +
> +       bool no_map;
> +};
> +
> +static struct resmem_restricted restricted_data[MAX_HEAP_COUNT] = {0};
> +static unsigned int restricted_data_count;
> +
> +static int linaro_restricted_memory_allocate(struct restricted_heap *heap,
> +                                            struct restricted_buffer *buf)
> +{
> +       struct gen_pool *pool = heap->priv_data;
> +       unsigned long pa;
> +       int ret;
> +
> +       buf->size = ALIGN(buf->size, PAGE_SIZE);
> +       pa = gen_pool_alloc(pool, buf->size);
> +       if (!pa)
> +               return -ENOMEM;
> +
> +       ret = sg_alloc_table(&buf->sg_table, 1, GFP_KERNEL);
> +       if (ret) {
> +               gen_pool_free(pool, pa, buf->size);
> +               return ret;
> +       }
> +
> +       sg_set_page(buf->sg_table.sgl, phys_to_page(pa), buf->size, 0);
> +
> +       return 0;
> +}
> +
> +static void linaro_restricted_memory_free(struct restricted_heap *heap,
> +                                         struct restricted_buffer *buf)
> +{
> +       struct gen_pool *pool = heap->priv_data;
> +       struct scatterlist *sg;
> +       unsigned int i;
> +
> +       for_each_sg(buf->sg_table.sgl, sg, buf->sg_table.nents, i)
> +               gen_pool_free(pool, page_to_phys(sg_page(sg)), sg->length);
> +       sg_free_table(&buf->sg_table);
> +}
> +
> +static const struct restricted_heap_ops linaro_restricted_heap_ops = {
> +       .alloc = linaro_restricted_memory_allocate,
> +       .free = linaro_restricted_memory_free,
> +};
> +
> +static int add_heap(struct resmem_restricted *mem)
> +{
> +       struct restricted_heap *heap;
> +       struct gen_pool *pool;
> +       int ret;
> +
> +       if (mem->base == 0 || mem->size == 0) {
> +               pr_err("restricted_data base or size is not correct\n");
> +               return -EINVAL;
> +       }
> +
> +       heap = kzalloc(sizeof(*heap), GFP_KERNEL);
> +       if (!heap)
> +               return -ENOMEM;
> +
> +       pool = gen_pool_create(PAGE_SHIFT, -1);
> +       if (!pool) {
> +               ret = -ENOMEM;
> +               goto err_free_heap;
> +       }
> +
> +       ret = gen_pool_add(pool, mem->base, mem->size, -1);
> +       if (ret)
> +               goto err_free_pool;
> +
> +       heap->no_map = mem->no_map;
> +       heap->priv_data = pool;
> +       heap->name = mem->name;
> +       heap->ops = &linaro_restricted_heap_ops;
> +
> +       ret = restricted_heap_add(heap);
> +       if (ret)
> +               goto err_free_pool;
> +
> +       return 0;
> +
> +err_free_pool:
> +       gen_pool_destroy(pool);
> +err_free_heap:
> +       kfree(heap);
> +
> +       return ret;
> +}
> +
> +static int __init rmem_restricted_heap_setup(struct reserved_mem *rmem)
> +{
> +       size_t len = HEAP_NAME_LEN;
> +       const char *s;
> +       bool no_map;
> +
> +       if (WARN_ONCE(restricted_data_count >= MAX_HEAP_COUNT,
> +                     "Cannot handle more than %u restricted heaps\n",
> +                     MAX_HEAP_COUNT))
> +               return -EINVAL;
> +
> +       no_map = of_get_flat_dt_prop(rmem->fdt_node, "no-map", NULL);
> +       s = strchr(rmem->name, '@');
> +       if (s)
> +               len = umin(s - rmem->name + 1, len);
> +
> +       restricted_data[restricted_data_count].base = rmem->base;
> +       restricted_data[restricted_data_count].size = rmem->size;
> +       restricted_data[restricted_data_count].no_map = no_map;
> +       strscpy(restricted_data[restricted_data_count].name, rmem->name, len);
> +
> +       restricted_data_count++;
> +       return 0;
> +}
> +
> +RESERVEDMEM_OF_DECLARE(linaro_restricted_heap, "linaro,restricted-heap",
> +                      rmem_restricted_heap_setup);
> +
> +static int linaro_restricted_heap_init(void)
> +{
> +       unsigned int i;
> +       int ret;
> +
> +       for (i = 0; i < restricted_data_count; i++) {
> +               ret = add_heap(&restricted_data[i]);
> +               if (ret)
> +                       return ret;
> +       }
> +       return 0;
> +}
> +
> +module_init(linaro_restricted_heap_init);
> +MODULE_DESCRIPTION("Linaro Restricted Heap Driver");
> +MODULE_LICENSE("GPL");
> --
> 2.34.1
>


From patchwork-bot+netdevbpf at kernel.org  Tue Sep  3 13:10:30 2024
From: patchwork-bot+netdevbpf at kernel.org (patchwork-bot+netdevbpf at kernel.org)
Date: Tue, 03 Sep 2024 20:10:30 +0000
Subject: [PATCH net v5] bpf, net: Fix a potential race in do_sock_getsockopt()
In-Reply-To: <20240830082518.23243-1-Tze-nan.Wu@mediatek.com>
References: <20240830082518.23243-1-Tze-nan.Wu@mediatek.com>
Message-ID: <172539423002.426047.5750436407367309589.git-patchwork-notify@kernel.org>

Hello:

This patch was applied to netdev/net.git (main)
by Jakub Kicinski <kuba at kernel.org>:

On Fri, 30 Aug 2024 16:25:17 +0800 you wrote:
> There's a potential race when `cgroup_bpf_enabled(CGROUP_GETSOCKOPT)` is
> false during the execution of `BPF_CGROUP_GETSOCKOPT_MAX_OPTLEN`, but
> becomes true when `BPF_CGROUP_RUN_PROG_GETSOCKOPT` is called.
> This inconsistency can lead to `BPF_CGROUP_RUN_PROG_GETSOCKOPT` receiving
> an "-EFAULT" from `__cgroup_bpf_run_filter_getsockopt(max_optlen=0)`.
> Scenario shown as below:
> 
> [...]

Here is the summary with links:
  - [net,v5] bpf, net: Fix a potential race in do_sock_getsockopt()
    https://git.kernel.org/netdev/net/c/33f339a1ba54

You are awesome, thank you!
-- 
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html




From sashal at kernel.org  Tue Sep  3 12:21:48 2024
From: sashal at kernel.org (Sasha Levin)
Date: Tue,  3 Sep 2024 15:21:48 -0400
Subject: [PATCH AUTOSEL 6.10 01/22] ASoC: SOF: mediatek: Add missing board compatible
Message-ID: <20240903192243.1107016-1-sashal@kernel.org>

From: Albert Jakie?a <jakiela at google.com>

[ Upstream commit c0196faaa927321a63e680427e075734ee656e42 ]

Add Google Dojo compatible.

Signed-off-by: Albert Jakie?a <jakiela at google.com>
Reviewed-by: Chen-Yu Tsai <wenst at chromium.org>
Link: https://patch.msgid.link/20240809135627.544429-1-jakiela at google.com
Signed-off-by: Mark Brown <broonie at kernel.org>
Signed-off-by: Sasha Levin <sashal at kernel.org>
---
 sound/soc/sof/mediatek/mt8195/mt8195.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/sound/soc/sof/mediatek/mt8195/mt8195.c b/sound/soc/sof/mediatek/mt8195/mt8195.c
index 8d3fc167cd810..b9d4508bbb85d 100644
--- a/sound/soc/sof/mediatek/mt8195/mt8195.c
+++ b/sound/soc/sof/mediatek/mt8195/mt8195.c
@@ -574,6 +574,9 @@ static struct snd_sof_of_mach sof_mt8195_machs[] = {
 	{
 		.compatible = "google,tomato",
 		.sof_tplg_filename = "sof-mt8195-mt6359-rt1019-rt5682.tplg"
+	}, {
+		.compatible = "google,dojo",
+		.sof_tplg_filename = "sof-mt8195-mt6359-max98390-rt5682.tplg"
 	}, {
 		.compatible = "mediatek,mt8195",
 		.sof_tplg_filename = "sof-mt8195.tplg"
-- 
2.43.0



From sashal at kernel.org  Tue Sep  3 12:21:49 2024
From: sashal at kernel.org (Sasha Levin)
Date: Tue,  3 Sep 2024 15:21:49 -0400
Subject: [PATCH AUTOSEL 6.10 02/22] ASoC: mediatek: mt8188: Mark AFE_DAC_CON0 register as volatile
In-Reply-To: <20240903192243.1107016-1-sashal@kernel.org>
References: <20240903192243.1107016-1-sashal@kernel.org>
Message-ID: <20240903192243.1107016-2-sashal@kernel.org>

From: YR Yang <yr.yang at mediatek.com>

[ Upstream commit ff9f065318e17a1a97981d9e535fcfc6ce5d5614 ]

Add AFE Control Register 0 to the volatile_register.
AFE_DAC_CON0 can be modified by both the SOF and ALSA drivers.
If this register is read and written in cache mode, the cached value
might not reflect the actual value when the register is modified by
another driver. It can cause playback or capture failures. Therefore,
it is necessary to add AFE_DAC_CON0 to the list of volatile registers.

Signed-off-by: YR Yang <yr.yang at mediatek.com>
Reviewed-by: Fei Shao <fshao at chromium.org>
Reviewed-by: Trevor Wu <trevor.wu at mediatek.com>
Link: https://patch.msgid.link/20240801084326.1472-1-yr.yang at mediatek.com
Signed-off-by: Mark Brown <broonie at kernel.org>
Signed-off-by: Sasha Levin <sashal at kernel.org>
---
 sound/soc/mediatek/mt8188/mt8188-afe-pcm.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/sound/soc/mediatek/mt8188/mt8188-afe-pcm.c b/sound/soc/mediatek/mt8188/mt8188-afe-pcm.c
index ccb6c1f3adc7d..73e5c63aeec87 100644
--- a/sound/soc/mediatek/mt8188/mt8188-afe-pcm.c
+++ b/sound/soc/mediatek/mt8188/mt8188-afe-pcm.c
@@ -2748,6 +2748,7 @@ static bool mt8188_is_volatile_reg(struct device *dev, unsigned int reg)
 	case AFE_ASRC12_NEW_CON9:
 	case AFE_LRCK_CNT:
 	case AFE_DAC_MON0:
+	case AFE_DAC_CON0:
 	case AFE_DL2_CUR:
 	case AFE_DL3_CUR:
 	case AFE_DL6_CUR:
-- 
2.43.0



From helgaas at kernel.org  Tue Sep  3 13:42:44 2024
From: helgaas at kernel.org (Bjorn Helgaas)
Date: Tue,  3 Sep 2024 15:42:44 -0500
Subject: [PATCH] PCI: mediatek: Drop excess mtk_pcie.mem description
Message-ID: <20240903204244.276482-1-helgaas@kernel.org>

From: Bjorn Helgaas <bhelgaas at google.com>

Struct mtk_pcie.mem was removed by 8a26f861b815 ("PCI: mediatek: Use
pci_parse_request_of_pci_ranges()"), but the kerneldoc was left.  Remove
the extra kerneldoc.

Signed-off-by: Bjorn Helgaas <bhelgaas at google.com>
---
 drivers/pci/controller/pcie-mediatek.c | 1 -
 1 file changed, 1 deletion(-)

diff --git a/drivers/pci/controller/pcie-mediatek.c b/drivers/pci/controller/pcie-mediatek.c
index 7fc0d7709b7f..20c638ca532e 100644
--- a/drivers/pci/controller/pcie-mediatek.c
+++ b/drivers/pci/controller/pcie-mediatek.c
@@ -211,7 +211,6 @@ struct mtk_pcie_port {
  * @base: IO mapped register base
  * @cfg: IO mapped register map for PCIe config
  * @free_ck: free-run reference clock
- * @mem: non-prefetchable memory resource
  * @ports: pointer to PCIe port information
  * @soc: pointer to SoC-dependent operations
  */
-- 
2.34.1



From sashal at kernel.org  Tue Sep  3 12:23:33 2024
From: sashal at kernel.org (Sasha Levin)
Date: Tue,  3 Sep 2024 15:23:33 -0400
Subject: [PATCH AUTOSEL 6.6 01/20] ASoC: SOF: mediatek: Add missing board compatible
Message-ID: <20240903192425.1107562-1-sashal@kernel.org>

From: Albert Jakie?a <jakiela at google.com>

[ Upstream commit c0196faaa927321a63e680427e075734ee656e42 ]

Add Google Dojo compatible.

Signed-off-by: Albert Jakie?a <jakiela at google.com>
Reviewed-by: Chen-Yu Tsai <wenst at chromium.org>
Link: https://patch.msgid.link/20240809135627.544429-1-jakiela at google.com
Signed-off-by: Mark Brown <broonie at kernel.org>
Signed-off-by: Sasha Levin <sashal at kernel.org>
---
 sound/soc/sof/mediatek/mt8195/mt8195.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/sound/soc/sof/mediatek/mt8195/mt8195.c b/sound/soc/sof/mediatek/mt8195/mt8195.c
index b5b4ea854da4b..94db51d88dda0 100644
--- a/sound/soc/sof/mediatek/mt8195/mt8195.c
+++ b/sound/soc/sof/mediatek/mt8195/mt8195.c
@@ -625,6 +625,9 @@ static struct snd_sof_of_mach sof_mt8195_machs[] = {
 	{
 		.compatible = "google,tomato",
 		.sof_tplg_filename = "sof-mt8195-mt6359-rt1019-rt5682.tplg"
+	}, {
+		.compatible = "google,dojo",
+		.sof_tplg_filename = "sof-mt8195-mt6359-max98390-rt5682.tplg"
 	}, {
 		.compatible = "mediatek,mt8195",
 		.sof_tplg_filename = "sof-mt8195.tplg"
-- 
2.43.0



From sashal at kernel.org  Tue Sep  3 12:23:34 2024
From: sashal at kernel.org (Sasha Levin)
Date: Tue,  3 Sep 2024 15:23:34 -0400
Subject: [PATCH AUTOSEL 6.6 02/20] ASoC: mediatek: mt8188: Mark AFE_DAC_CON0 register as volatile
In-Reply-To: <20240903192425.1107562-1-sashal@kernel.org>
References: <20240903192425.1107562-1-sashal@kernel.org>
Message-ID: <20240903192425.1107562-2-sashal@kernel.org>

From: YR Yang <yr.yang at mediatek.com>

[ Upstream commit ff9f065318e17a1a97981d9e535fcfc6ce5d5614 ]

Add AFE Control Register 0 to the volatile_register.
AFE_DAC_CON0 can be modified by both the SOF and ALSA drivers.
If this register is read and written in cache mode, the cached value
might not reflect the actual value when the register is modified by
another driver. It can cause playback or capture failures. Therefore,
it is necessary to add AFE_DAC_CON0 to the list of volatile registers.

Signed-off-by: YR Yang <yr.yang at mediatek.com>
Reviewed-by: Fei Shao <fshao at chromium.org>
Reviewed-by: Trevor Wu <trevor.wu at mediatek.com>
Link: https://patch.msgid.link/20240801084326.1472-1-yr.yang at mediatek.com
Signed-off-by: Mark Brown <broonie at kernel.org>
Signed-off-by: Sasha Levin <sashal at kernel.org>
---
 sound/soc/mediatek/mt8188/mt8188-afe-pcm.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/sound/soc/mediatek/mt8188/mt8188-afe-pcm.c b/sound/soc/mediatek/mt8188/mt8188-afe-pcm.c
index 5e14655c5617e..11f30b183520f 100644
--- a/sound/soc/mediatek/mt8188/mt8188-afe-pcm.c
+++ b/sound/soc/mediatek/mt8188/mt8188-afe-pcm.c
@@ -2748,6 +2748,7 @@ static bool mt8188_is_volatile_reg(struct device *dev, unsigned int reg)
 	case AFE_ASRC12_NEW_CON9:
 	case AFE_LRCK_CNT:
 	case AFE_DAC_MON0:
+	case AFE_DAC_CON0:
 	case AFE_DL2_CUR:
 	case AFE_DL3_CUR:
 	case AFE_DL6_CUR:
-- 
2.43.0



From sashal at kernel.org  Tue Sep  3 12:25:15 2024
From: sashal at kernel.org (Sasha Levin)
Date: Tue,  3 Sep 2024 15:25:15 -0400
Subject: [PATCH AUTOSEL 6.1 01/17] ASoC: SOF: mediatek: Add missing board compatible
Message-ID: <20240903192600.1108046-1-sashal@kernel.org>

From: Albert Jakie?a <jakiela at google.com>

[ Upstream commit c0196faaa927321a63e680427e075734ee656e42 ]

Add Google Dojo compatible.

Signed-off-by: Albert Jakie?a <jakiela at google.com>
Reviewed-by: Chen-Yu Tsai <wenst at chromium.org>
Link: https://patch.msgid.link/20240809135627.544429-1-jakiela at google.com
Signed-off-by: Mark Brown <broonie at kernel.org>
Signed-off-by: Sasha Levin <sashal at kernel.org>
---
 sound/soc/sof/mediatek/mt8195/mt8195.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/sound/soc/sof/mediatek/mt8195/mt8195.c b/sound/soc/sof/mediatek/mt8195/mt8195.c
index 53cadbe8a05cc..ac96ea07e591b 100644
--- a/sound/soc/sof/mediatek/mt8195/mt8195.c
+++ b/sound/soc/sof/mediatek/mt8195/mt8195.c
@@ -663,6 +663,9 @@ static struct snd_sof_of_mach sof_mt8195_machs[] = {
 	{
 		.compatible = "google,tomato",
 		.sof_tplg_filename = "sof-mt8195-mt6359-rt1019-rt5682.tplg"
+	}, {
+		.compatible = "google,dojo",
+		.sof_tplg_filename = "sof-mt8195-mt6359-max98390-rt5682.tplg"
 	}, {
 		.compatible = "mediatek,mt8195",
 		.sof_tplg_filename = "sof-mt8195.tplg"
-- 
2.43.0



From sebastian.reichel at collabora.com  Tue Sep  3 14:42:59 2024
From: sebastian.reichel at collabora.com (Sebastian Reichel)
Date: Tue, 3 Sep 2024 21:42:59 +0000
Subject: [PATCH v2 6/7] dt-bindings: power: reset: mt6323: merge to MFD
 mediatek,mt6397 DT schema
In-Reply-To: <20240830110732.30080-6-macpaul.lin@mediatek.com>
References: <20240830110732.30080-1-macpaul.lin@mediatek.com>
 <20240830110732.30080-6-macpaul.lin@mediatek.com>
Message-ID: <01020191b9d74883-4c4deeb2-1be0-4c45-9fff-c228767de23d-000000@eu-west-1.amazonses.com>

Hi,

On Fri, Aug 30, 2024 at 07:07:31PM GMT, Macpaul Lin wrote:
> Convert mt6323-poweroff.txt to be compatible with DT schema.
> Since this is a power-controller device node, merge it into parent
> mediatek,mt6397.yaml. Subsequently, remove mt6323-poweroff.txt with a
> separate patch.
> 
> Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
> ---

Please merge this into PATCH 2/7 in the next version of the patchset
(i.e. the patch creating the new YAML binding).

-- Sebastian

>  .../bindings/power/reset/mt6323-poweroff.txt  | 20 -------------------
>  1 file changed, 20 deletions(-)
>  delete mode 100644 Documentation/devicetree/bindings/power/reset/mt6323-poweroff.txt
> 
> Changes for v1 and v2:
>  - This is the first version of converting mt6323-poweroff.txt.
>    This is because converting mt6323-poweroff.txt together
>    with mfd/mediatek,mt6397.yaml, so we've create a patch set
>    instead of submitting single patch for each subdevice.
>  - This patch has been made base on linux-next/master git repo.
> 
> diff --git a/Documentation/devicetree/bindings/power/reset/mt6323-poweroff.txt b/Documentation/devicetree/bindings/power/reset/mt6323-poweroff.txt
> deleted file mode 100644
> index 933f0c4..0000000
> --- a/Documentation/devicetree/bindings/power/reset/mt6323-poweroff.txt
> +++ /dev/null
> @@ -1,20 +0,0 @@
> -Device Tree Bindings for Power Controller on MediaTek PMIC
> -
> -The power controller which could be found on PMIC is responsible for externally
> -powering off or on the remote MediaTek SoC through the circuit BBPU.
> -
> -Required properties:
> -- compatible: Should be one of follows
> -       "mediatek,mt6323-pwrc": for MT6323 PMIC
> -
> -Example:
> -
> -       pmic {
> -               compatible = "mediatek,mt6323";
> -
> -               ...
> -
> -               power-controller {
> -                       compatible = "mediatek,mt6323-pwrc";
> -               };
> -       }
> -- 
> 2.45.2
> 
> 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-mediatek/attachments/20240903/e4be70d7/attachment.sig>

From nichen at iscas.ac.cn  Wed Sep  4 00:52:13 2024
From: nichen at iscas.ac.cn (Chen Ni)
Date: Wed,  4 Sep 2024 15:52:13 +0800
Subject: [PATCH] wifi: mt76: mt7925: convert comma to semicolon
Message-ID: <20240904075213.1352976-1-nichen@iscas.ac.cn>

Replace comma between expressions with semicolons.

Using a ',' in place of a ';' can have unintended side effects.
Although that is not the case here, it is seems best to use ';'
unless ',' is intended.

Found by inspection.
No functional change intended.
Compile tested only.

Signed-off-by: Chen Ni <nichen at iscas.ac.cn>
---
 drivers/net/wireless/mediatek/mt76/mt7925/mcu.c | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c
index 9dc22fbe25d3..82c5a8def344 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c
@@ -2171,12 +2171,12 @@ void mt7925_mcu_bss_rlm_tlv(struct sk_buff *skb, struct mt76_phy *phy,
 
 	tlv = mt76_connac_mcu_add_tlv(skb, UNI_BSS_INFO_RLM, sizeof(*req));
 	req = (struct bss_rlm_tlv *)tlv;
-	req->control_channel = chandef->chan->hw_value,
-	req->center_chan = ieee80211_frequency_to_channel(freq1),
-	req->center_chan2 = ieee80211_frequency_to_channel(freq2),
-	req->tx_streams = hweight8(phy->antenna_mask),
-	req->ht_op_info = 4, /* set HT 40M allowed */
-	req->rx_streams = hweight8(phy->antenna_mask),
+	req->control_channel = chandef->chan->hw_value;
+	req->center_chan = ieee80211_frequency_to_channel(freq1);
+	req->center_chan2 = ieee80211_frequency_to_channel(freq2);
+	req->tx_streams = hweight8(phy->antenna_mask);
+	req->ht_op_info = 4; /* set HT 40M allowed */
+	req->rx_streams = hweight8(phy->antenna_mask);
 	req->band = band;
 
 	switch (chandef->width) {
-- 
2.25.1



From mingyen.hsieh at mediatek.com  Wed Sep  4 01:21:09 2024
From: mingyen.hsieh at mediatek.com (Mingyen Hsieh)
Date: Wed, 4 Sep 2024 16:21:09 +0800
Subject: [PATCH v3] wifi: mac80211: introduce EHT rate support in AQL airtime
Message-ID: <20240904082109.4339-1-mingyen.hsieh@mediatek.com>

From: Ming Yen Hsieh <mingyen.hsieh at mediatek.com>

Add definitions related to EHT mode and airtime calculation
according to the 802.11BE_D4.0.

Co-developed-by: Bo Jiao <Bo.Jiao at mediatek.com>
Signed-off-by: Bo Jiao <Bo.Jiao at mediatek.com>
Signed-off-by: Deren Wu <deren.wu at mediatek.com>
Signed-off-by: Quan Zhou <quan.zhou at mediatek.com>
Signed-off-by: Ming Yen Hsieh <MingYen.Hsieh at mediatek.com>
---
v2:
 - add BW_320 support in ieee80211_get_rate_duration().
 - rewrite the existing WARN_ON for property stream condition.
v3:
 - add a macro EHT_GROUP_RANGE() to reduce the line which repetitive the EHT_GROUP().
 - to comply with the current use of EHT streams, the WARN_ON check has been modified
   to be consistent with HE.
---
 net/mac80211/airtime.c | 138 +++++++++++++++++++++++++++++++++++++++--
 1 file changed, 133 insertions(+), 5 deletions(-)

diff --git a/net/mac80211/airtime.c b/net/mac80211/airtime.c
index fdf8b658fede..7801b361db98 100644
--- a/net/mac80211/airtime.c
+++ b/net/mac80211/airtime.c
@@ -55,10 +55,21 @@
 #define HE_DURATION_S(shift, streams, gi, bps)		\
 	(HE_DURATION(streams, gi, bps) >> shift)
 
+/* gi in HE/EHT is identical. It matches enum nl80211_eht_gi as well */
+#define EHT_GI_08 HE_GI_08
+#define EHT_GI_16 HE_GI_16
+#define EHT_GI_32 HE_GI_32
+
+#define EHT_DURATION(streams, gi, bps)			\
+	HE_DURATION(streams, gi, bps)
+#define EHT_DURATION_S(shift, streams, gi, bps)		\
+	HE_DURATION_S(shift, streams, gi, bps)
+
 #define BW_20			0
 #define BW_40			1
 #define BW_80			2
 #define BW_160			3
+#define BW_320			4
 
 /*
  * Define group sort order: HT40 -> SGI -> #streams
@@ -68,17 +79,26 @@
 #define IEEE80211_VHT_STREAM_GROUPS	8 /* BW(=4) * SGI(=2) */
 
 #define IEEE80211_HE_MAX_STREAMS	8
+#define IEEE80211_HE_STREAM_GROUPS	12 /* BW(=4) * GI(=3) */
+
+#define IEEE80211_EHT_MAX_STREAMS	16
+#define IEEE80211_EHT_STREAM_GROUPS	15 /* BW(=5) * GI(=3) */
 
 #define IEEE80211_HT_GROUPS_NB	(IEEE80211_MAX_STREAMS *	\
 				 IEEE80211_HT_STREAM_GROUPS)
 #define IEEE80211_VHT_GROUPS_NB	(IEEE80211_MAX_STREAMS *	\
 					 IEEE80211_VHT_STREAM_GROUPS)
+#define IEEE80211_HE_GROUPS_NB	(IEEE80211_HE_MAX_STREAMS *	\
+				 IEEE80211_HE_STREAM_GROUPS)
+#define IEEE80211_EHT_GROUPS_NB	(IEEE80211_EHT_MAX_STREAMS *	\
+				 IEEE80211_EHT_STREAM_GROUPS)
 
 #define IEEE80211_HT_GROUP_0	0
 #define IEEE80211_VHT_GROUP_0	(IEEE80211_HT_GROUP_0 + IEEE80211_HT_GROUPS_NB)
 #define IEEE80211_HE_GROUP_0	(IEEE80211_VHT_GROUP_0 + IEEE80211_VHT_GROUPS_NB)
+#define IEEE80211_EHT_GROUP_0	(IEEE80211_HE_GROUP_0 + IEEE80211_HE_GROUPS_NB)
 
-#define MCS_GROUP_RATES		12
+#define MCS_GROUP_RATES		14
 
 #define HT_GROUP_IDX(_streams, _sgi, _ht40)	\
 	IEEE80211_HT_GROUP_0 +			\
@@ -203,6 +223,77 @@
 #define HE_GROUP(_streams, _gi, _bw)					\
 	__HE_GROUP(_streams, _gi, _bw,				\
 		   HE_GROUP_SHIFT(_streams, _gi, _bw))
+
+#define EHT_BW2VBPS(_bw, r5, r4, r3, r2, r1)					\
+	((_bw) == BW_320 ? r5 : BW2VBPS(_bw, r4, r3, r2, r1))
+
+#define EHT_GROUP_IDX(_streams, _gi, _bw)				\
+	(IEEE80211_EHT_GROUP_0 +					\
+	 IEEE80211_EHT_MAX_STREAMS * 3 * (_bw) +			\
+	 IEEE80211_EHT_MAX_STREAMS * (_gi) +				\
+	 (_streams) - 1)
+
+#define __EHT_GROUP(_streams, _gi, _bw, _s)						\
+	[EHT_GROUP_IDX(_streams, _gi, _bw)] = {						\
+	.shift = _s,									\
+	.duration = {									\
+		EHT_DURATION_S(_s, _streams, _gi,					\
+			       EHT_BW2VBPS(_bw,  1960,   980,  490,  234,  117)),	\
+		EHT_DURATION_S(_s, _streams, _gi,					\
+			       EHT_BW2VBPS(_bw,  3920,  1960,  980,  468,  234)),	\
+		EHT_DURATION_S(_s, _streams, _gi,					\
+			       EHT_BW2VBPS(_bw,  5880,  2937, 1470,  702,  351)),	\
+		EHT_DURATION_S(_s, _streams, _gi,					\
+			       EHT_BW2VBPS(_bw,  7840,  3920, 1960,  936,  468)),	\
+		EHT_DURATION_S(_s, _streams, _gi,					\
+			       EHT_BW2VBPS(_bw, 11760,  5880, 2940, 1404,  702)),	\
+		EHT_DURATION_S(_s, _streams, _gi,					\
+			       EHT_BW2VBPS(_bw, 15680,  7840, 3920, 1872,  936)),	\
+		EHT_DURATION_S(_s, _streams, _gi,					\
+			       EHT_BW2VBPS(_bw, 17640,  8820, 4410, 2106, 1053)),	\
+		EHT_DURATION_S(_s, _streams, _gi,					\
+			       EHT_BW2VBPS(_bw, 19600,  9800, 4900, 2340, 1170)),	\
+		EHT_DURATION_S(_s, _streams, _gi,					\
+			       EHT_BW2VBPS(_bw, 23520, 11760, 5880, 2808, 1404)),	\
+		EHT_DURATION_S(_s, _streams, _gi,					\
+			       EHT_BW2VBPS(_bw, 26133, 13066, 6533, 3120, 1560)),	\
+		EHT_DURATION_S(_s, _streams, _gi,					\
+			       EHT_BW2VBPS(_bw, 29400, 14700, 7350, 3510, 1755)),	\
+		EHT_DURATION_S(_s, _streams, _gi,					\
+			       EHT_BW2VBPS(_bw, 32666, 16333, 8166, 3900, 1950)),	\
+		EHT_DURATION_S(_s, _streams, _gi,					\
+			       EHT_BW2VBPS(_bw, 35280, 17640, 8820, 4212, 2106)),	\
+		EHT_DURATION_S(_s, _streams, _gi,					\
+			       EHT_BW2VBPS(_bw, 39200, 19600, 9800, 4680, 2340))	\
+		}									\
+}
+
+#define EHT_GROUP_SHIFT(_streams, _gi, _bw)						\
+	GROUP_SHIFT(EHT_DURATION(_streams, _gi,						\
+				 EHT_BW2VBPS(_bw, 1960, 980, 490, 234, 117)))
+
+#define EHT_GROUP(_streams, _gi, _bw)					\
+	__EHT_GROUP(_streams, _gi, _bw,				\
+		   EHT_GROUP_SHIFT(_streams, _gi, _bw))
+
+#define EHT_GROUP_RANGE(_gi, _bw)	\
+	EHT_GROUP(1, _gi, _bw),		\
+	EHT_GROUP(2, _gi, _bw),		\
+	EHT_GROUP(3, _gi, _bw),		\
+	EHT_GROUP(4, _gi, _bw),		\
+	EHT_GROUP(5, _gi, _bw),		\
+	EHT_GROUP(6, _gi, _bw),		\
+	EHT_GROUP(7, _gi, _bw),		\
+	EHT_GROUP(8, _gi, _bw),		\
+	EHT_GROUP(9, _gi, _bw),		\
+	EHT_GROUP(10, _gi, _bw),	\
+	EHT_GROUP(11, _gi, _bw),	\
+	EHT_GROUP(12, _gi, _bw),	\
+	EHT_GROUP(13, _gi, _bw),	\
+	EHT_GROUP(14, _gi, _bw),	\
+	EHT_GROUP(15, _gi, _bw),	\
+	EHT_GROUP(16, _gi, _bw)
+
 struct mcs_group {
 	u8 shift;
 	u16 duration[MCS_GROUP_RATES];
@@ -376,6 +467,26 @@ static const struct mcs_group airtime_mcs_groups[] = {
 	HE_GROUP(6, HE_GI_32, BW_160),
 	HE_GROUP(7, HE_GI_32, BW_160),
 	HE_GROUP(8, HE_GI_32, BW_160),
+
+	EHT_GROUP_RANGE(EHT_GI_08, BW_20),
+	EHT_GROUP_RANGE(EHT_GI_16, BW_20),
+	EHT_GROUP_RANGE(EHT_GI_32, BW_20),
+
+	EHT_GROUP_RANGE(EHT_GI_08, BW_40),
+	EHT_GROUP_RANGE(EHT_GI_16, BW_40),
+	EHT_GROUP_RANGE(EHT_GI_32, BW_40),
+
+	EHT_GROUP_RANGE(EHT_GI_08, BW_80),
+	EHT_GROUP_RANGE(EHT_GI_16, BW_80),
+	EHT_GROUP_RANGE(EHT_GI_32, BW_80),
+
+	EHT_GROUP_RANGE(EHT_GI_08, BW_160),
+	EHT_GROUP_RANGE(EHT_GI_16, BW_160),
+	EHT_GROUP_RANGE(EHT_GI_32, BW_160),
+
+	EHT_GROUP_RANGE(EHT_GI_08, BW_320),
+	EHT_GROUP_RANGE(EHT_GI_16, BW_320),
+	EHT_GROUP_RANGE(EHT_GI_32, BW_320),
 };
 
 static u32
@@ -422,6 +533,9 @@ static u32 ieee80211_get_rate_duration(struct ieee80211_hw *hw,
 	case RATE_INFO_BW_160:
 		bw = BW_160;
 		break;
+	case RATE_INFO_BW_320:
+		bw = BW_320;
+		break;
 	default:
 		WARN_ON_ONCE(1);
 		return 0;
@@ -443,13 +557,18 @@ static u32 ieee80211_get_rate_duration(struct ieee80211_hw *hw,
 		idx = status->rate_idx;
 		group = HE_GROUP_IDX(streams, status->he_gi, bw);
 		break;
+	case RX_ENC_EHT:
+		streams = status->nss;
+		idx = status->rate_idx;
+		group = EHT_GROUP_IDX(streams, status->eht.gi, bw);
+		break;
 	default:
 		WARN_ON_ONCE(1);
 		return 0;
 	}
 
-	if (WARN_ON_ONCE((status->encoding != RX_ENC_HE && streams > 4) ||
-			 (status->encoding == RX_ENC_HE && streams > 8)))
+	if (WARN_ON_ONCE((status->encoding > RX_ENC_HE && streams > 8) ||
+			 (status->encoding < RX_ENC_HE && streams > 4)))
 		return 0;
 
 	if (idx >= MCS_GROUP_RATES)
@@ -517,7 +636,9 @@ static bool ieee80211_fill_rate_info(struct ieee80211_hw *hw,
 	stat->nss = ri->nss;
 	stat->rate_idx = ri->mcs;
 
-	if (ri->flags & RATE_INFO_FLAGS_HE_MCS)
+	if (ri->flags & RATE_INFO_FLAGS_EHT_MCS)
+		stat->encoding = RX_ENC_EHT;
+	else if (ri->flags & RATE_INFO_FLAGS_HE_MCS)
 		stat->encoding = RX_ENC_HE;
 	else if (ri->flags & RATE_INFO_FLAGS_VHT_MCS)
 		stat->encoding = RX_ENC_VHT;
@@ -529,7 +650,14 @@ static bool ieee80211_fill_rate_info(struct ieee80211_hw *hw,
 	if (ri->flags & RATE_INFO_FLAGS_SHORT_GI)
 		stat->enc_flags |= RX_ENC_FLAG_SHORT_GI;
 
-	stat->he_gi = ri->he_gi;
+	switch (stat->encoding) {
+	case RX_ENC_EHT:
+		stat->eht.gi = ri->eht_gi;
+		break;
+	default:
+		stat->he_gi = ri->he_gi;
+		break;
+	}
 
 	if (stat->encoding != RX_ENC_LEGACY)
 		return true;
-- 
2.45.2



From johannes at sipsolutions.net  Wed Sep  4 01:28:08 2024
From: johannes at sipsolutions.net (Johannes Berg)
Date: Wed, 04 Sep 2024 10:28:08 +0200
Subject: [PATCH v3] wifi: mac80211: introduce EHT rate support in AQL
 airtime
In-Reply-To: <20240904082109.4339-1-mingyen.hsieh@mediatek.com>
References: <20240904082109.4339-1-mingyen.hsieh@mediatek.com>
Message-ID: <be8d3a5a20a2c77490d78ca05e6ece7651c57caa.camel@sipsolutions.net>

On Wed, 2024-09-04 at 16:21 +0800, Mingyen Hsieh wrote:
> 
> +#define IEEE80211_EHT_MAX_STREAMS	16

Still not sure why you think 16 streams are legal in EHT?

johannes



From alexander.sverdlin at siemens.com  Wed Sep  4 01:31:13 2024
From: alexander.sverdlin at siemens.com (Sverdlin, Alexander)
Date: Wed, 4 Sep 2024 08:31:13 +0000
Subject: [PATCH v2 net 2/5] net: dsa: be compatible with masters which
 unregister on shutdown
In-Reply-To: <20210917133436.553995-3-vladimir.oltean@nxp.com>
References: <20210917133436.553995-1-vladimir.oltean@nxp.com>
	 <20210917133436.553995-3-vladimir.oltean@nxp.com>
Message-ID: <2d2e3bba17203c14a5ffdabc174e3b6bbb9ad438.camel@siemens.com>

Hi Vladimir!

On Fri, 2021-09-17 at 16:34 +0300, Vladimir Oltean wrote:
> Lino reports that on his system with bcmgenet as DSA master and KSZ9897
> as a switch, rebooting or shutting down never works properly.
> 
> What does the bcmgenet driver have special to trigger this, that other
> DSA masters do not? It has an implementation of ->shutdown which simply
> calls its ->remove implementation. Otherwise said, it unregisters its
> network interface on shutdown.
> 
> This message can be seen in a loop, and it hangs the reboot process there:
> 
> unregister_netdevice: waiting for eth0 to become free. Usage count = 3
> 
> So why 3?
> 
> A usage count of 1 is normal for a registered network interface, and any
> virtual interface which links itself as an upper of that will increment
> it via dev_hold. In the case of DSA, this is the call path:
> 
> dsa_slave_create
> -> netdev_upper_dev_link
> ?? -> __netdev_upper_dev_link
> ????? -> __netdev_adjacent_dev_insert
> ???????? -> dev_hold
> 
> So a DSA switch with 3 interfaces will result in a usage count elevated
> by two, and netdev_wait_allrefs will wait until they have gone away.
> 
> Other stacked interfaces, like VLAN, watch NETDEV_UNREGISTER events and
> delete themselves, but DSA cannot just vanish and go poof, at most it
> can unbind itself from the switch devices, but that must happen strictly
> earlier compared to when the DSA master unregisters its net_device, so
> reacting on the NETDEV_UNREGISTER event is way too late.
> 
> It seems that it is a pretty established pattern to have a driver's
> ->shutdown hook redirect to its ->remove hook, so the same code is
> executed regardless of whether the driver is unbound from the device, or
> the system is just shutting down. As Florian puts it, it is quite a big
> hammer for bcmgenet to unregister its net_device during shutdown, but
> having a common code path with the driver unbind helps ensure it is well
> tested.
> 
> So DSA, for better or for worse, has to live with that and engage in an
> arms race of implementing the ->shutdown hook too, from all individual
> drivers, and do something sane when paired with masters that unregister
> their net_device there. The only sane thing to do, of course, is to
> unlink from the master.
> 
> However, complications arise really quickly.
> 
> The pattern of redirecting ->shutdown to ->remove is not unique to
> bcmgenet or even to net_device drivers. In fact, SPI controllers do it
> too (see dspi_shutdown -> dspi_remove), and presumably, I2C controllers
> and MDIO controllers do it too (this is something I have not researched
> too deeply, but even if this is not the case today, it is certainly
> plausible to happen in the future, and must be taken into consideration).
> 
> Since DSA switches might be SPI devices, I2C devices, MDIO devices, the
> insane implication is that for the exact same DSA switch device, we
> might have both ->shutdown and ->remove getting called.
> 
> So we need to do something with that insane environment. The pattern
> I've come up with is "if this, then not that", so if either ->shutdown
> or ->remove gets called, we set the device's drvdata to NULL, and in the
> other hook, we check whether the drvdata is NULL and just do nothing.
> This is probably not necessary for platform devices, just for devices on
> buses, but I would really insist for consistency among drivers, because
> when code is copy-pasted, it is not always copy-pasted from the best
> sources.
> 
> So depending on whether the DSA switch's ->remove or ->shutdown will get
> called first, we cannot really guarantee even for the same driver if
> rebooting will result in the same code path on all platforms. But
> nonetheless, we need to do something minimally reasonable on ->shutdown
> too to fix the bug. Of course, the ->remove will do more (a full
> teardown of the tree, with all data structures freed, and this is why
> the bug was not caught for so long). The new ->shutdown method is kept
> separate from dsa_unregister_switch not because we couldn't have
> unregistered the switch, but simply in the interest of doing something
> quick and to the point.
> 
> The big question is: does the DSA switch's ->shutdown get called earlier
> than the DSA master's ->shutdown? If not, there is still a risk that we
> might still trigger the WARN_ON in unregister_netdevice that says we are
> attempting to unregister a net_device which has uppers. That's no good.
> Although the reference to the master net_device won't physically go away
> even if DSA's ->shutdown comes afterwards, remember we have a dev_hold
> on it.
> 
> The answer to that question lies in this comment above device_link_add:
> 
> ?* A side effect of the link creation is re-ordering of dpm_list and the
> ?* devices_kset list by moving the consumer device and all devices depending
> ?* on it to the ends of these lists (that does not happen to devices that have
> ?* not been registered when this function is called).
> 
> so the fact that DSA uses device_link_add towards its master is not
> exactly for nothing. device_shutdown() walks devices_kset from the back,
> so this is our guarantee that DSA's shutdown happens before the master's
> shutdown.
> 
> Fixes: 2f1e8ea726e9 ("net: dsa: link interfaces with the DSA master to get rid of lockdep warnings")
> Link: https://lore.kernel.org/netdev/20210909095324.12978-1-LinoSanfilippo at gmx.de/
> Reported-by: Lino Sanfilippo <LinoSanfilippo at gmx.de>
> Signed-off-by: Vladimir Oltean <vladimir.oltean at nxp.com>
> Tested-by: Andrew Lunn <andrew at lunn.ch>
> ---
> ?drivers/net/dsa/b53/b53_mdio.c???????????? | 21 ++++++++-
> ?drivers/net/dsa/b53/b53_mmap.c???????????? | 13 ++++++
> ?drivers/net/dsa/b53/b53_priv.h???????????? |? 5 +++
> ?drivers/net/dsa/b53/b53_spi.c????????????? | 13 ++++++
> ?drivers/net/dsa/b53/b53_srab.c???????????? | 21 ++++++++-
> ?drivers/net/dsa/bcm_sf2.c????????????????? | 12 ++++++
> ?drivers/net/dsa/dsa_loop.c???????????????? | 22 +++++++++-
> ?drivers/net/dsa/lan9303-core.c???????????? |? 6 +++
> ?drivers/net/dsa/lan9303.h????????????????? |? 1 +
> ?drivers/net/dsa/lan9303_i2c.c????????????? | 24 +++++++++--
> ?drivers/net/dsa/lan9303_mdio.c???????????? | 15 +++++++
> ?drivers/net/dsa/lantiq_gswip.c???????????? | 18 ++++++++
> ?drivers/net/dsa/microchip/ksz8795_spi.c??? | 11 ++++-
> ?drivers/net/dsa/microchip/ksz9477_i2c.c??? | 14 +++++-
> ?drivers/net/dsa/microchip/ksz9477_spi.c??? |? 8 +++-
> ?drivers/net/dsa/mt7530.c?????????????????? | 18 ++++++++
> ?drivers/net/dsa/mv88e6060.c??????????????? | 18 ++++++++
> ?drivers/net/dsa/mv88e6xxx/chip.c?????????? | 22 +++++++++-
> ?drivers/net/dsa/ocelot/felix_vsc9959.c???? | 20 ++++++++-
> ?drivers/net/dsa/ocelot/seville_vsc9953.c?? | 20 ++++++++-
> ?drivers/net/dsa/qca/ar9331.c?????????????? | 18 ++++++++
> ?drivers/net/dsa/qca8k.c??????????????????? | 18 ++++++++
> ?drivers/net/dsa/realtek-smi-core.c???????? | 20 ++++++++-
> ?drivers/net/dsa/sja1105/sja1105_main.c???? | 21 ++++++++-
> ?drivers/net/dsa/vitesse-vsc73xx-core.c???? |? 6 +++
> ?drivers/net/dsa/vitesse-vsc73xx-platform.c | 22 +++++++++-
> ?drivers/net/dsa/vitesse-vsc73xx-spi.c????? | 22 +++++++++-
> ?drivers/net/dsa/vitesse-vsc73xx.h????????? |? 1 +
> ?include/net/dsa.h????????????????????????? |? 1 +
> ?net/dsa/dsa2.c???????????????????????????? | 50 ++++++++++++++++++++++
> ?30 files changed, 457 insertions(+), 24 deletions(-)

[]

> diff --git a/drivers/net/dsa/lan9303-core.c b/drivers/net/dsa/lan9303-core.c
> index d7ce281570b5..89f920289ae2 100644
> --- a/drivers/net/dsa/lan9303-core.c
> +++ b/drivers/net/dsa/lan9303-core.c
> @@ -1379,6 +1379,12 @@ int lan9303_remove(struct lan9303 *chip)
> ?}
> ?EXPORT_SYMBOL(lan9303_remove);
> ?
> +void lan9303_shutdown(struct lan9303 *chip)
> +{
> +	dsa_switch_shutdown(chip->ds);
> +}
> +EXPORT_SYMBOL(lan9303_shutdown);
> +
> ?MODULE_AUTHOR("Juergen Borleis <kernel at pengutronix.de>");
> ?MODULE_DESCRIPTION("Core driver for SMSC/Microchip LAN9303 three port ethernet switch");
> ?MODULE_LICENSE("GPL v2");
> diff --git a/drivers/net/dsa/lan9303.h b/drivers/net/dsa/lan9303.h
> index 11f590b64701..c7f73efa50f0 100644
> --- a/drivers/net/dsa/lan9303.h
> +++ b/drivers/net/dsa/lan9303.h
> @@ -10,3 +10,4 @@ extern const struct lan9303_phy_ops lan9303_indirect_phy_ops;
> ?
> ?int lan9303_probe(struct lan9303 *chip, struct device_node *np);
> ?int lan9303_remove(struct lan9303 *chip);
> +void lan9303_shutdown(struct lan9303 *chip);
> diff --git a/drivers/net/dsa/lan9303_i2c.c b/drivers/net/dsa/lan9303_i2c.c
> index 9bffaef65a04..8ca4713310fa 100644
> --- a/drivers/net/dsa/lan9303_i2c.c
> +++ b/drivers/net/dsa/lan9303_i2c.c
> @@ -67,13 +67,28 @@ static int lan9303_i2c_probe(struct i2c_client *client,
> ?
> ?static int lan9303_i2c_remove(struct i2c_client *client)
> ?{
> -	struct lan9303_i2c *sw_dev;
> +	struct lan9303_i2c *sw_dev = i2c_get_clientdata(client);
> ?
> -	sw_dev = i2c_get_clientdata(client);
> ?	if (!sw_dev)
> -		return -ENODEV;
> +		return 0;
> +
> +	lan9303_remove(&sw_dev->chip);
> +
> +	i2c_set_clientdata(client, NULL);
> +
> +	return 0;
> +}
> +
> +static void lan9303_i2c_shutdown(struct i2c_client *client)
> +{
> +	struct lan9303_i2c *sw_dev = i2c_get_clientdata(client);
> +
> +	if (!sw_dev)
> +		return;
> +
> +	lan9303_shutdown(&sw_dev->chip);
> ?
> -	return lan9303_remove(&sw_dev->chip);
> +	i2c_set_clientdata(client, NULL);
> ?}
> ?
> ?/*-------------------------------------------------------------------------*/
> @@ -97,6 +112,7 @@ static struct i2c_driver lan9303_i2c_driver = {
> ?	},
> ?	.probe = lan9303_i2c_probe,
> ?	.remove = lan9303_i2c_remove,
> +	.shutdown = lan9303_i2c_shutdown,
> ?	.id_table = lan9303_i2c_id,
> ?};
> ?module_i2c_driver(lan9303_i2c_driver);
> diff --git a/drivers/net/dsa/lan9303_mdio.c b/drivers/net/dsa/lan9303_mdio.c
> index 9cbe80460b53..bbb7032409ba 100644
> --- a/drivers/net/dsa/lan9303_mdio.c
> +++ b/drivers/net/dsa/lan9303_mdio.c
> @@ -138,6 +138,20 @@ static void lan9303_mdio_remove(struct mdio_device *mdiodev)
> ?		return;
> ?
> ?	lan9303_remove(&sw_dev->chip);
> +
> +	dev_set_drvdata(&mdiodev->dev, NULL);
> +}
> +
> +static void lan9303_mdio_shutdown(struct mdio_device *mdiodev)
> +{
> +	struct lan9303_mdio *sw_dev = dev_get_drvdata(&mdiodev->dev);
> +
> +	if (!sw_dev)
> +		return;
> +
> +	lan9303_shutdown(&sw_dev->chip);
> +
> +	dev_set_drvdata(&mdiodev->dev, NULL);
> ?}

This unfortunately didn't work well with LAN9303 and probably will not work
with others:

Unable to handle kernel NULL pointer dereference at virtual address 0000000000000000
CPU: 0 PID: 442 Comm: kworker/0:3 Tainted: G           O       6.1.99+gitb7793b7d9b35 #1
Workqueue: events_power_efficient phy_state_machine
pc : lan9303_mdio_phy_read+0x1c/0x34
lr : lan9303_phy_read+0x50/0x100
Call trace:
 lan9303_mdio_phy_read+0x1c/0x34
 lan9303_phy_read+0x50/0x100
 dsa_slave_phy_read+0x40/0x50
 __mdiobus_read+0x34/0x130
 mdiobus_read+0x44/0x70
 genphy_update_link+0x2c/0x104
 genphy_read_status+0x2c/0x120
 phy_check_link_status+0xb8/0xcc
 phy_state_machine+0x198/0x27c
 process_one_work+0x1dc/0x450
 worker_thread+0x154/0x450

as long as the ports are not down (and dsa_switch_shutdown() doesn't ensure it),
we cannot just zero drvdata, because PHY polling will eventually call

static int lan9303_mdio_phy_read(struct lan9303 *chip, int addr, int reg)
{
        struct lan9303_mdio *sw_dev = dev_get_drvdata(chip->dev);

        return mdiobus_read_nested(sw_dev->device->bus, addr, reg);

There are however multiple other unsafe patterns.
I suppose current

dsa_switch_shutdown();
dev_set_drvdata(...->dev, NULL);

pattern is broken in many cases...

-- 
Alexander Sverdlin
Siemens AG
www.siemens.com

From matthias.bgg at gmail.com  Wed Sep  4 01:36:46 2024
From: matthias.bgg at gmail.com (Matthias Brugger)
Date: Wed, 4 Sep 2024 10:36:46 +0200
Subject: [PATCH] wifi: mt76: mt7925: convert comma to semicolon
In-Reply-To: <20240904075213.1352976-1-nichen@iscas.ac.cn>
References: <20240904075213.1352976-1-nichen@iscas.ac.cn>
Message-ID: <f2380ad1-f1d1-41c1-b00e-782f2c1937fc@gmail.com>



On 04/09/2024 09:52, Chen Ni wrote:
> Replace comma between expressions with semicolons.
> 
> Using a ',' in place of a ';' can have unintended side effects.
> Although that is not the case here, it is seems best to use ';'
> unless ',' is intended.
> 
> Found by inspection.
> No functional change intended.
> Compile tested only.
> 
> Signed-off-by: Chen Ni <nichen at iscas.ac.cn>

Reviewed-by: Matthias Brugger <matthias.bgg at gmail.com>

> ---
>   drivers/net/wireless/mediatek/mt76/mt7925/mcu.c | 12 ++++++------
>   1 file changed, 6 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c
> index 9dc22fbe25d3..82c5a8def344 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c
> +++ b/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c
> @@ -2171,12 +2171,12 @@ void mt7925_mcu_bss_rlm_tlv(struct sk_buff *skb, struct mt76_phy *phy,
>   
>   	tlv = mt76_connac_mcu_add_tlv(skb, UNI_BSS_INFO_RLM, sizeof(*req));
>   	req = (struct bss_rlm_tlv *)tlv;
> -	req->control_channel = chandef->chan->hw_value,
> -	req->center_chan = ieee80211_frequency_to_channel(freq1),
> -	req->center_chan2 = ieee80211_frequency_to_channel(freq2),
> -	req->tx_streams = hweight8(phy->antenna_mask),
> -	req->ht_op_info = 4, /* set HT 40M allowed */
> -	req->rx_streams = hweight8(phy->antenna_mask),
> +	req->control_channel = chandef->chan->hw_value;
> +	req->center_chan = ieee80211_frequency_to_channel(freq1);
> +	req->center_chan2 = ieee80211_frequency_to_channel(freq2);
> +	req->tx_streams = hweight8(phy->antenna_mask);
> +	req->ht_op_info = 4; /* set HT 40M allowed */
> +	req->rx_streams = hweight8(phy->antenna_mask);
>   	req->band = band;
>   
>   	switch (chandef->width) {


From matthias.bgg at gmail.com  Wed Sep  4 01:42:41 2024
From: matthias.bgg at gmail.com (Matthias Brugger)
Date: Wed, 4 Sep 2024 10:42:41 +0200
Subject: [PATCH v4 2/3] media: platform: mtk-mdp3: Use cmdq_pkt_create()
 and cmdq_pkt_destroy()
In-Reply-To: <d5c512d06e013555397722137d5790dc8a627bfd.camel@mediatek.com>
References: <20240901143259.16849-1-chunkuang.hu@kernel.org>
 <20240901143259.16849-3-chunkuang.hu@kernel.org>
 <1d4e9e86-aaaf-4d19-b89f-6f7207ab72d8@gmail.com>
 <d5c512d06e013555397722137d5790dc8a627bfd.camel@mediatek.com>
Message-ID: <e58b27cc-69a8-4338-827c-c27f09856802@gmail.com>



On 03/09/2024 11:39, CK Hu (???) wrote:
> Hi, Matthias:
> 
> On Mon, 2024-09-02 at 17:31 +0200, Matthias Brugger wrote:
>>   	
>> External email : Please do not click links or open attachments until you have verified the sender or the content.
>>   
>>
>> On 01/09/2024 16:32, Chun-Kuang Hu wrote:
>>> Use cmdq_pkt_create() and cmdq_pkt_destroy() common function
>>> instead of implementing mdp3 version.
>>>
>>> Signed-off-by: Chun-Kuang Hu <chunkuang.hu at kernel.org>
>>> ---
>>>    .../platform/mediatek/mdp3/mtk-mdp3-cmdq.c    | 46 ++-----------------
>>>    .../platform/mediatek/mdp3/mtk-mdp3-cmdq.h    |  1 +
>>>    2 files changed, 6 insertions(+), 41 deletions(-)
>>>
>>> diff --git a/drivers/media/platform/mediatek/mdp3/mtk-mdp3-cmdq.c b/drivers/media/platform/mediatek/mdp3/mtk-mdp3-cmdq.c
>>> index ef5dade35fd3..740a484c8eb4 100644
>>> --- a/drivers/media/platform/mediatek/mdp3/mtk-mdp3-cmdq.c
>>> +++ b/drivers/media/platform/mediatek/mdp3/mtk-mdp3-cmdq.c
>>> @@ -471,43 +471,6 @@ static int mdp_path_config(struct mdp_dev *mdp, struct mdp_cmdq_cmd *cmd,
>>>    return 0;
>>>    }
>>>    
>>> -static int mdp_cmdq_pkt_create(struct cmdq_client *client, struct cmdq_pkt *pkt,
>>> -       size_t size)
>>> -{
>>> -struct device *dev;
>>> -dma_addr_t dma_addr;
>>> -
>>> -pkt->va_base = kzalloc(size, GFP_KERNEL);
>>> -if (!pkt->va_base)
>>> -return -ENOMEM;
>>> -
>>> -pkt->buf_size = size;
>>> -pkt->cl = (void *)client;
>>
>> cmdq_pkt_create does not set the callback. Why doesn't that break things?
>> Same holds for the crtc driver that is already in linux-next.
> 
> This series is to remove pkt->cl.
> For the helper function whick need pkt->cl, add parameter to pass the cmdq_client information.
> Up to now, only cmdq_pkt_finalize() use pkt->cl, but it is replaced by cmdq_pkt_eoc() and cmdq_pkt_jump_rel() in [PATCH v4 1/3].
> So this would not break any thing.
> 

Right, actually this is explained in the cover letter. Sorry for the noise.

Reviewed-by: Matthias Brugger <matthias.bgg at gmail.com>

> Regards,
> CK
> 
>>
>> Regards,
>> Matthias
>>
>>> -
>>> -dev = client->chan->mbox->dev;
>>> -dma_addr = dma_map_single(dev, pkt->va_base, pkt->buf_size,
>>> -  DMA_TO_DEVICE);
>>> -if (dma_mapping_error(dev, dma_addr)) {
>>> -dev_err(dev, "dma map failed, size=%u\n", (u32)(u64)size);
>>> -kfree(pkt->va_base);
>>> -return -ENOMEM;
>>> -}
>>> -
>>> -pkt->pa_base = dma_addr;
>>> -
>>> -return 0;
>>> -}
>>> -
>>> -static void mdp_cmdq_pkt_destroy(struct cmdq_pkt *pkt)
>>> -{
>>> -struct cmdq_client *client = (struct cmdq_client *)pkt->cl;
>>> -
>>> -dma_unmap_single(client->chan->mbox->dev, pkt->pa_base, pkt->buf_size,
>>> - DMA_TO_DEVICE);
>>> -kfree(pkt->va_base);
>>> -pkt->va_base = NULL;
>>> -}
>>> -
>>>    static void mdp_auto_release_work(struct work_struct *work)
>>>    {
>>>    struct mdp_cmdq_cmd *cmd;
>>> @@ -538,7 +501,7 @@ static void mdp_auto_release_work(struct work_struct *work)
>>>    wake_up(&mdp->callback_wq);
>>>    }
>>>    
>>> -mdp_cmdq_pkt_destroy(&cmd->pkt);
>>> +cmdq_pkt_destroy(mdp->cmdq_clt[cmd->pp_idx], &cmd->pkt);
>>>    kfree(cmd->comps);
>>>    cmd->comps = NULL;
>>>    kfree(cmd);
>>> @@ -578,7 +541,7 @@ static void mdp_handle_cmdq_callback(struct mbox_client *cl, void *mssg)
>>>    if (refcount_dec_and_test(&mdp->job_count))
>>>    wake_up(&mdp->callback_wq);
>>>    
>>> -mdp_cmdq_pkt_destroy(&cmd->pkt);
>>> +cmdq_pkt_destroy(mdp->cmdq_clt[cmd->pp_idx], &cmd->pkt);
>>>    kfree(cmd->comps);
>>>    cmd->comps = NULL;
>>>    kfree(cmd);
>>> @@ -620,7 +583,7 @@ static struct mdp_cmdq_cmd *mdp_cmdq_prepare(struct mdp_dev *mdp,
>>>    goto err_uninit;
>>>    }
>>>    
>>> -ret = mdp_cmdq_pkt_create(mdp->cmdq_clt[pp_idx], &cmd->pkt, SZ_16K);
>>> +ret = cmdq_pkt_create(mdp->cmdq_clt[pp_idx], &cmd->pkt, SZ_16K);
>>>    if (ret)
>>>    goto err_free_cmd;
>>>    
>>> @@ -700,6 +663,7 @@ static struct mdp_cmdq_cmd *mdp_cmdq_prepare(struct mdp_dev *mdp,
>>>    cmd->comps = comps;
>>>    cmd->num_comps = num_comp;
>>>    cmd->mdp_ctx = param->mdp_ctx;
>>> +cmd->pp_idx = pp_idx;
>>>    
>>>    kfree(path);
>>>    return cmd;
>>> @@ -711,7 +675,7 @@ static struct mdp_cmdq_cmd *mdp_cmdq_prepare(struct mdp_dev *mdp,
>>>    err_free_comps:
>>>    kfree(comps);
>>>    err_destroy_pkt:
>>> -mdp_cmdq_pkt_destroy(&cmd->pkt);
>>> +cmdq_pkt_destroy(mdp->cmdq_clt[pp_idx], &cmd->pkt);
>>>    err_free_cmd:
>>>    kfree(cmd);
>>>    err_uninit:
>>> diff --git a/drivers/media/platform/mediatek/mdp3/mtk-mdp3-cmdq.h b/drivers/media/platform/mediatek/mdp3/mtk-mdp3-cmdq.h
>>> index 53a30ad7e0b0..935ae9825728 100644
>>> --- a/drivers/media/platform/mediatek/mdp3/mtk-mdp3-cmdq.h
>>> +++ b/drivers/media/platform/mediatek/mdp3/mtk-mdp3-cmdq.h
>>> @@ -35,6 +35,7 @@ struct mdp_cmdq_cmd {
>>>    struct mdp_comp *comps;
>>>    void *mdp_ctx;
>>>    u8 num_comps;
>>> +u8 pp_idx;
>>>    };
>>>    
>>>    struct mdp_dev;


From matthias.bgg at gmail.com  Wed Sep  4 01:47:00 2024
From: matthias.bgg at gmail.com (Matthias Brugger)
Date: Wed, 4 Sep 2024 10:47:00 +0200
Subject: [PATCH] ASoC: mediatek: mt2701-cs42448: Optimize redundant code
 in mt2701_cs42448_machine_probe
In-Reply-To: <20240903093623.7120-1-liujing@cmss.chinamobile.com>
References: <20240903093623.7120-1-liujing@cmss.chinamobile.com>
Message-ID: <25f8a244-45c4-44bb-a0c1-37c057dd8d7b@gmail.com>



On 03/09/2024 11:36, Liu Jing wrote:
> Utilize the defined parameter 'dev' to make the code cleaner.
> 
> Signed-off-by: Liu Jing <liujing at cmss.chinamobile.com>

Reviewed-by: Matthias Brugger <matthias.bgg at gmail.com>

> ---
>   sound/soc/mediatek/mt2701/mt2701-cs42448.c | 16 ++++++++--------
>   1 file changed, 8 insertions(+), 8 deletions(-)
> 
> diff --git a/sound/soc/mediatek/mt2701/mt2701-cs42448.c b/sound/soc/mediatek/mt2701/mt2701-cs42448.c
> index 1262e8a1bc9a..4974b0536b7b 100644
> --- a/sound/soc/mediatek/mt2701/mt2701-cs42448.c
> +++ b/sound/soc/mediatek/mt2701/mt2701-cs42448.c
> @@ -329,10 +329,10 @@ static int mt2701_cs42448_machine_probe(struct platform_device *pdev)
>   	int ret;
>   	int i;
>   	struct device_node *platform_node, *codec_node, *codec_node_bt_mrg;
> +	struct device *dev = &pdev->dev;
>   	struct mt2701_cs42448_private *priv =
> -		devm_kzalloc(&pdev->dev, sizeof(struct mt2701_cs42448_private),
> +		devm_kzalloc(dev, sizeof(struct mt2701_cs42448_private),
>   			     GFP_KERNEL);
> -	struct device *dev = &pdev->dev;
>   	struct snd_soc_dai_link *dai_link;
>   
>   	if (!priv)
> @@ -341,7 +341,7 @@ static int mt2701_cs42448_machine_probe(struct platform_device *pdev)
>   	platform_node = of_parse_phandle(pdev->dev.of_node,
>   					 "mediatek,platform", 0);
>   	if (!platform_node) {
> -		dev_err(&pdev->dev, "Property 'platform' missing or invalid\n");
> +		dev_err(dev, "Property 'platform' missing or invalid\n");
>   		return -EINVAL;
>   	}
>   	for_each_card_prelinks(card, i, dai_link) {
> @@ -355,7 +355,7 @@ static int mt2701_cs42448_machine_probe(struct platform_device *pdev)
>   	codec_node = of_parse_phandle(pdev->dev.of_node,
>   				      "mediatek,audio-codec", 0);
>   	if (!codec_node) {
> -		dev_err(&pdev->dev,
> +		dev_err(dev,
>   			"Property 'audio-codec' missing or invalid\n");
>   		return -EINVAL;
>   	}
> @@ -368,7 +368,7 @@ static int mt2701_cs42448_machine_probe(struct platform_device *pdev)
>   	codec_node_bt_mrg = of_parse_phandle(pdev->dev.of_node,
>   					     "mediatek,audio-codec-bt-mrg", 0);
>   	if (!codec_node_bt_mrg) {
> -		dev_err(&pdev->dev,
> +		dev_err(dev,
>   			"Property 'audio-codec-bt-mrg' missing or invalid\n");
>   		return -EINVAL;
>   	}
> @@ -377,7 +377,7 @@ static int mt2701_cs42448_machine_probe(struct platform_device *pdev)
>   
>   	ret = snd_soc_of_parse_audio_routing(card, "audio-routing");
>   	if (ret) {
> -		dev_err(&pdev->dev, "failed to parse audio-routing: %d\n", ret);
> +		dev_err(dev, "failed to parse audio-routing: %d\n", ret);
>   		return ret;
>   	}
>   
> @@ -395,10 +395,10 @@ static int mt2701_cs42448_machine_probe(struct platform_device *pdev)
>   
>   	snd_soc_card_set_drvdata(card, priv);
>   
> -	ret = devm_snd_soc_register_card(&pdev->dev, card);
> +	ret = devm_snd_soc_register_card(dev, card);
>   
>   	if (ret)
> -		dev_err(&pdev->dev, "%s snd_soc_register_card fail %d\n",
> +		dev_err(dev, "%s snd_soc_register_card fail %d\n",
>   			__func__, ret);
>   	return ret;
>   }


From SkyLake.Huang at mediatek.com  Wed Sep  4 01:47:00 2024
From: SkyLake.Huang at mediatek.com (=?utf-8?B?U2t5TGFrZSBIdWFuZyAo6buD5ZWf5r6kKQ==?=)
Date: Wed, 4 Sep 2024 08:47:00 +0000
Subject: [PATCH net-next v10 00/13] net: phy: mediatek: Introduce
 mtk-phy-lib and add 2.5Gphy support
In-Reply-To: <ZsZ3wpPXrbwZJXEh@makrotopia.org>
References: <20240701105417.19941-1-SkyLake.Huang@mediatek.com>
	 <ZsZ3wpPXrbwZJXEh@makrotopia.org>
Message-ID: <92e7f44fc597b1df93aad8551e1533f088bd2369.camel@mediatek.com>

On Thu, 2024-08-22 at 00:26 +0100, Daniel Golle wrote:
>  	 
> External email : Please do not click links or open attachments until
> you have verified the sender or the content.
>  On Mon, Jul 01, 2024 at 06:54:04PM +0800, Sky Huang wrote:
> > From: "SkyLake.Huang" <skylake.huang at mediatek.com>
> > 
> > This patch series integrate MediaTek's built-in Ethernet PHY helper
> functions
> > into mtk-phy-lib and add more functions into it. Also, add support
> for 2.5Gphy
> > on MT7988 SoC.
> > 
> > Signed-off-by: SkyLake.Huang <skylake.huang at mediatek.com>
> 
> For the whole series:
> 
> Acked-by: Daniel Golle <daniel at makrotopia.org>
> Tested-by: Daniel Golle <daniel at makrotopia.org>

Gentle ping.

BRs,
Sky

From SkyLake.Huang at mediatek.com  Wed Sep  4 01:49:50 2024
From: SkyLake.Huang at mediatek.com (=?utf-8?B?U2t5TGFrZSBIdWFuZyAo6buD5ZWf5r6kKQ==?=)
Date: Wed, 4 Sep 2024 08:49:50 +0000
Subject: [PATCH net-next v10 11/13] net: phy: add driver for built-in 2.5G
 ethernet PHY on MT7988
In-Reply-To: <c21fe0db83dd665d4725ffedc51db9063dbe2f3d.camel@mediatek.com>
References: <20240701105417.19941-1-SkyLake.Huang@mediatek.com>
	 <20240701105417.19941-12-SkyLake.Huang@mediatek.com>
	 <ebeb75a3-a6b1-46b3-b1e8-7d8448eb23f6@lunn.ch>
	 <c21fe0db83dd665d4725ffedc51db9063dbe2f3d.camel@mediatek.com>
Message-ID: <38189661f30032715783e8860318fe9e50258e47.camel@mediatek.com>

On Wed, 2024-08-21 at 17:49 +0800, SkyLake.Huang wrote:
> On Fri, 2024-08-09 at 16:17 +0200, Andrew Lunn wrote:
> >  	 
> > External email : Please do not click links or open attachments
> > until
> > you have verified the sender or the content.
> >  > +static int mt798x_2p5ge_phy_config_aneg(struct phy_device
> > *phydev)
> > > +{
> > > +bool changed = false;
> > > +u32 adv;
> > > +int ret;
> > > +
> > > +/* In fact, if we disable autoneg, we can't link up correctly:
> > > + * 2.5G/1G: Need AN to exchange master/slave information.
> > > + * 100M/10M: Without AN, link starts at half duplex (According
> > > to
> > > + *           IEEE 802.3-2018), which this phy doesn't support.
> > > + */
> > > +if (phydev->autoneg == AUTONEG_DISABLE)
> > > +return -EOPNOTSUPP;
> > 
> > I assume you have seen Russells patches in this area. Please could
> > you
> > test and review them. Depending on which gets merged, you might
> > need
> > to come back and clean this up later.
> > 
> >    Andrew
> 
> Yes I've seen Russells' patch which forces AN on for speed >= 1G.
> Could I send another patch to clean this up? This patchset is sent a
> month ago. I need some time to rebuild my testing environment.
> 
> BRs,
> Sky

Gentle ping.

BRs,
Sky

From matthias.bgg at gmail.com  Wed Sep  4 01:50:54 2024
From: matthias.bgg at gmail.com (Matthias Brugger)
Date: Wed, 4 Sep 2024 10:50:54 +0200
Subject: [PATCH v3 1/1] drm/mediatek: Fix get efuse issue for MT8188 DPTX
In-Reply-To: <20240903121028.20689-1-liankun.yang@mediatek.com>
References: <20240903121028.20689-1-liankun.yang@mediatek.com>
Message-ID: <1487d7e3-184d-4832-bf6f-7fce8e14db5d@gmail.com>



On 03/09/2024 14:09, Liankun Yang wrote:
> Update efuse data for MT8188 displayport.
> 
> The DP monitor can not display when DUT connected to USB-c to DP dongle.
> Analysis view is invalid DP efuse data.
> 
> Fixes: 350c3fe907fb ("drm/mediatek: dp: Add support MT8188 dp/edp function")
> 

Nit: no new-line here :)

> Signed-off-by: Liankun Yang <liankun.yang at mediatek.com>

Reviewed-by: Matthias Brugger <matthias.bgg at gmail.com>

> ---
> Changes in V3:
> - Add Fixes tag.
> - Update the commit title.
> - Update the commit description.
> - Update change log position in commit message.

Thanks, you could have added my Reviewed-by tag, as the feedback I gave was 
minimal and you fixed that in the submission.

Regards,
Matthias

> Per suggestion from the previous thread:
> https://patchwork.kernel.org/project/linux-mediatek/patch/
> 20240902133736.16461-1-liankun.yang at mediatek.com/
> 
>   drivers/gpu/drm/mediatek/mtk_dp.c | 85 ++++++++++++++++++++++++++++++-
>   1 file changed, 84 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/mediatek/mtk_dp.c b/drivers/gpu/drm/mediatek/mtk_dp.c
> index d8796a904eca..f2bee617f063 100644
> --- a/drivers/gpu/drm/mediatek/mtk_dp.c
> +++ b/drivers/gpu/drm/mediatek/mtk_dp.c
> @@ -145,6 +145,89 @@ struct mtk_dp_data {
>   	u16 audio_m_div2_bit;
>   };
>   
> +static const struct mtk_dp_efuse_fmt mt8188_dp_efuse_fmt[MTK_DP_CAL_MAX] = {
> +	[MTK_DP_CAL_GLB_BIAS_TRIM] = {
> +		.idx = 0,
> +		.shift = 10,
> +		.mask = 0x1f,
> +		.min_val = 1,
> +		.max_val = 0x1e,
> +		.default_val = 0xf,
> +	},
> +	[MTK_DP_CAL_CLKTX_IMPSE] = {
> +		.idx = 0,
> +		.shift = 15,
> +		.mask = 0xf,
> +		.min_val = 1,
> +		.max_val = 0xe,
> +		.default_val = 0x8,
> +	},
> +	[MTK_DP_CAL_LN_TX_IMPSEL_PMOS_0] = {
> +		.idx = 1,
> +		.shift = 0,
> +		.mask = 0xf,
> +		.min_val = 1,
> +		.max_val = 0xe,
> +		.default_val = 0x8,
> +	},
> +	[MTK_DP_CAL_LN_TX_IMPSEL_PMOS_1] = {
> +		.idx = 1,
> +		.shift = 8,
> +		.mask = 0xf,
> +		.min_val = 1,
> +		.max_val = 0xe,
> +		.default_val = 0x8,
> +	},
> +	[MTK_DP_CAL_LN_TX_IMPSEL_PMOS_2] = {
> +		.idx = 1,
> +		.shift = 16,
> +		.mask = 0xf,
> +		.min_val = 1,
> +		.max_val = 0xe,
> +		.default_val = 0x8,
> +	},
> +	[MTK_DP_CAL_LN_TX_IMPSEL_PMOS_3] = {
> +		.idx = 1,
> +		.shift = 24,
> +		.mask = 0xf,
> +		.min_val = 1,
> +		.max_val = 0xe,
> +		.default_val = 0x8,
> +	},
> +	[MTK_DP_CAL_LN_TX_IMPSEL_NMOS_0] = {
> +		.idx = 1,
> +		.shift = 4,
> +		.mask = 0xf,
> +		.min_val = 1,
> +		.max_val = 0xe,
> +		.default_val = 0x8,
> +	},
> +	[MTK_DP_CAL_LN_TX_IMPSEL_NMOS_1] = {
> +		.idx = 1,
> +		.shift = 12,
> +		.mask = 0xf,
> +		.min_val = 1,
> +		.max_val = 0xe,
> +		.default_val = 0x8,
> +	},
> +	[MTK_DP_CAL_LN_TX_IMPSEL_NMOS_2] = {
> +		.idx = 1,
> +		.shift = 20,
> +		.mask = 0xf,
> +		.min_val = 1,
> +		.max_val = 0xe,
> +		.default_val = 0x8,
> +	},
> +	[MTK_DP_CAL_LN_TX_IMPSEL_NMOS_3] = {
> +		.idx = 1,
> +		.shift = 28,
> +		.mask = 0xf,
> +		.min_val = 1,
> +		.max_val = 0xe,
> +		.default_val = 0x8,
> +	},
> +};
> +
>   static const struct mtk_dp_efuse_fmt mt8195_edp_efuse_fmt[MTK_DP_CAL_MAX] = {
>   	[MTK_DP_CAL_GLB_BIAS_TRIM] = {
>   		.idx = 3,
> @@ -2771,7 +2854,7 @@ static SIMPLE_DEV_PM_OPS(mtk_dp_pm_ops, mtk_dp_suspend, mtk_dp_resume);
>   static const struct mtk_dp_data mt8188_dp_data = {
>   	.bridge_type = DRM_MODE_CONNECTOR_DisplayPort,
>   	.smc_cmd = MTK_DP_SIP_ATF_VIDEO_UNMUTE,
> -	.efuse_fmt = mt8195_dp_efuse_fmt,
> +	.efuse_fmt = mt8188_dp_efuse_fmt,
>   	.audio_supported = true,
>   	.audio_pkt_in_hblank_area = true,
>   	.audio_m_div2_bit = MT8188_AUDIO_M_CODE_MULT_DIV_SEL_DP_ENC0_P0_DIV_2,


From Mingyen.Hsieh at mediatek.com  Wed Sep  4 01:50:50 2024
From: Mingyen.Hsieh at mediatek.com (=?utf-8?B?TWluZ3llbiBIc2llaCAo6Kyd5piO6Ku6KQ==?=)
Date: Wed, 4 Sep 2024 08:50:50 +0000
Subject: [PATCH v3] wifi: mac80211: introduce EHT rate support in AQL
 airtime
In-Reply-To: <be8d3a5a20a2c77490d78ca05e6ece7651c57caa.camel@sipsolutions.net>
References: <20240904082109.4339-1-mingyen.hsieh@mediatek.com>
	 <be8d3a5a20a2c77490d78ca05e6ece7651c57caa.camel@sipsolutions.net>
Message-ID: <214205b9b317d4de29f77699cdfd690a69a61cf4.camel@mediatek.com>

On Wed, 2024-09-04 at 10:28 +0200, Johannes Berg wrote:
>  	 
> External email : Please do not click links or open attachments until
> you have verified the sender or the content.
>  On Wed, 2024-09-04 at 16:21 +0800, Mingyen Hsieh wrote:
> > 
> > +#define IEEE80211_EHT_MAX_STREAMS16
> 
> Still not sure why you think 16 streams are legal in EHT?
> 
> johannes
> 

Hi johannes,

Maybe I misunderstood the meaning of spec, I will modify it.

mingyen.

From matthias.bgg at gmail.com  Wed Sep  4 01:59:53 2024
From: matthias.bgg at gmail.com (Matthias Brugger)
Date: Wed, 4 Sep 2024 10:59:53 +0200
Subject: [PATCH RESEND] mt76: mt7915: check devm_kasprintf() returned
 value
In-Reply-To: <20240903014955.4145423-1-make24@iscas.ac.cn>
References: <20240903014955.4145423-1-make24@iscas.ac.cn>
Message-ID: <84bab711-7666-4766-8c25-b8b0e44f182e@gmail.com>



On 03/09/2024 03:49, Ma Ke wrote:
> devm_kasprintf() can return a NULL pointer on failure but this returned
> value is not checked. Fix this lack and check the returned value.
> 
> Found by code review.
> 
> Cc: stable at vger.kernel.org
> Fixes: 6ae39b7c7ed4 ("wifi: mt76: mt7921: Support temp sensor")
> Signed-off-by: Ma Ke <make24 at iscas.ac.cn>

Reviewed-by: Matthias Brugger <matthias.bgg at gmail.com>

> ---
>   drivers/net/wireless/mediatek/mt76/mt7915/init.c | 2 ++
>   1 file changed, 2 insertions(+)
> 
> diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/init.c b/drivers/net/wireless/mediatek/mt76/mt7915/init.c
> index a978f434dc5e..7bc3b4cd3592 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt7915/init.c
> +++ b/drivers/net/wireless/mediatek/mt76/mt7915/init.c
> @@ -194,6 +194,8 @@ static int mt7915_thermal_init(struct mt7915_phy *phy)
>   
>   	name = devm_kasprintf(&wiphy->dev, GFP_KERNEL, "mt7915_%s",
>   			      wiphy_name(wiphy));
> +	if (!name)
> +		return -ENOMEM;
>   
>   	cdev = thermal_cooling_device_register(name, phy, &mt7915_thermal_ops);
>   	if (!IS_ERR(cdev)) {


From wenst at chromium.org  Wed Sep  4 02:00:02 2024
From: wenst at chromium.org (Chen-Yu Tsai)
Date: Wed,  4 Sep 2024 17:00:02 +0800
Subject: [PATCH v6 00/12] platform/chrome: Introduce DT hardware prober
Message-ID: <20240904090016.2841572-1-wenst@chromium.org>

Hi everyone,

This is v6 of my "of: Introduce hardware prober driver" [1] series.
v6 mainly addresses comments from Andy.

v2 continued Doug's "of: device: Support 2nd sources of probeable but
undiscoverable devices" [2] series, but follows the scheme suggested by
Rob, marking all second source component device nodes as "fail-needs-probe",
and having a hardware prober driver enable the one of them.


Changes since v5:
- Link to v5:
  https://lore.kernel.org/all/20240822092006.3134096-1-wenst at chromium.org/
- Patch 1 "of: dynamic: Add of_changeset_update_prop_string"
  - Collected Rob's reviewed-by
- Patch 2 "of: base: Add for_each_child_of_node_with_prefix_scoped()"
  - New patch
- Patch 3 "regulator: Move OF-specific regulator lookup code to of_regulator.c"
  - Fix kerneldoc format of of_regulator_dev_lookup()
  - Fix stub compile error for !CONFIG_OF in drivers/regulator/internal.h
- Patch 4 "regulator: Split up _regulator_get()"
  - Fixed kerneldoc "Return" section format for _regulator_get_common()
  - Slightly reworded return value description
- Patch 5 "regulator: Do pure DT regulator lookup in of_regulator_bulk_get_all()"
  - Used "dev_of_node(dev)" instead of "dev->of_node"
  - Replaced "dev_printk" with "dev_printk()" in kerneldoc mentions
  - Fixed kerneldoc "Return" section format for of_regulator_get_optional()
  - Fix @np parameter name in of_regulator_dev_lookup() kerneldoc
- Patch 6 "gpiolib: Add gpio_property_name_length()"
  - Changed function name to "gpio_get_property_name_length()"
  - Changed argument name to "propname"
  - Clarified return value for "*-<GPIO suffix>" case
  - Reworked according to Andy's suggestion
  - Added stub function
- Patch 7 "i2c: core: Remove extra space in Makefile"
  - New patch
- Patch 8 "i2c: Introduce OF component probe function"
  - Fixed indent in Makefile
  - Split regulator and GPIO TODO items
  - Reversed final conditional in i2c_of_probe_enable_node()
- Patch 9 "i2c: of-prober: Add regulator support"
  - Split of_regulator_bulk_get_all() return value check and explain
    "ret == 0" case
  - Switched to of_get_next_child_with_prefix_scoped() where applicable
  - Used krealloc_array() instead of directly calculating size
  - copy whole regulator array in one memcpy() call
  - Drop "0" from struct zeroing initializer
  - Split out regulator helper from i2c_of_probe_enable_res() to keep
    code cleaner when combined with the next patch
  - Added options for customizing power sequencing delay
  - Rename i2c_of_probe_get_regulator() to i2c_of_probe_get_regulators()
  - Add i2c_of_probe_free_regulator() helper
- Patch 10 "i2c: of-prober: Add GPIO support"
  - Renamed "con" to "propname" in i2c_of_probe_get_gpiod()
  - Copy string first and check return value of strscpy() for overflow in
    i2c_of_probe_get_gpiod()
  - Add parenthesis around "enable" and "reset" GPIO names in comments
  - Split resource count debug message into two separate lines
  - Split out GPIO helper from i2c_of_probe_enable_res() to keep code
    cleaner following the previous patch
  - Adopted options for customizing power sequencing delay following
    previous patch
- Patch 11 "platform/chrome: Introduce device tree hardware prober"
  - Adapt to new i2c_of_probe_component() parameters
- Patch 12 "arm64: dts: mediatek: mt8173-elm-hana: Mark touchscreens and
	    trackpads as fail"
  - None

See v5 cover letter for previous change logs.

For the I2C component (touchscreens and trackpads) case from the
original series, the hardware prober driver finds the particular
class of device in the device tree, gets its parent I2C adapter,
and tries to initiate a simple I2C read for each device under that
I2C bus. When it finds one that responds, it considers that one
present, marks it as "okay", and returns, letting the driver core
actually probe the device.

This works fine in most cases since these components are connected
via a ribbon cable and always have the same resources. The prober
will also grab these resources and enable them.

The other case, selecting a display panel to use based on the SKU ID
from the firmware, hit a bit of an issue with fixing the OF graph.
It has been left out since v3.

Patch 1 adds of_changeset_update_prop_string(), as requested by Rob.

Patch 2 adds for_each_child_of_node_with_prefix_scoped(), as suggested
by Andy.

Patches 3 through 5 reorganize the OF-specific regulator core code and
reworks the existing of_regulator_bulk_get_all() function to look up
regulator supplies solely using device tree nodes.

Patch 6 adds a function to the GPIO library that checks whether a
given string (property name) matches the GPIO property pattern, and
if it does, returns the length of the GPIO name.

Patch 7 cleans up some extra spaces in the i2c core Makefile

Patch 8 implements probing the I2C bus for presence of components as
a helper function in the I2C core.

Patch 9 implements regulator supply support for the I2C component
prober.

Patch 10 implements GPIO support for the I2C component prober.

Patch 11 adds a ChromeOS specific DT hardware prober. This initial
version targets the Hana Chromebooks, probing its I2C trackpads and
touchscreens.

Patch 12 modifies the Hana device tree and marks the touchscreens
and trackpads as "fail-needs-probe", ready for the driver to probe.


The patch and build time dependencies for this series is now quite
complicated:

  of_regulator.c cleanups [1] -> regulator patches here ----
							   |
							   v
  gpio patch in -next [2] -> gpiolib patch here  -----> i2c of-prober --
								       |
                      platform/chrome device tree hardware prober <----- 
 
The regulator patches in this series depend on other cleanup patches [1]
I sent earlier. The gpiolib patch depends on a commit in -next [2]
changing the GPIO suffixes array. Patches 7 through 10 introducting i2c
of-prober depend on the first 5 patches. Patch 11, The chrome prober,
depends on patches 7 through 10.

I think it might be easier if the respective maintainers take the first
six patches for -rc1. Patches 7 through 11 can go through either the i2c
or chrome trees either very late in the merge window or right after it.
Patch 12 can go in only after everything else is in. This should be
better than having an immutable branch on top of some commit in -next
for three other trees to consume.

Wolfram, would you be able to handle the late PR? Assuming you get a
chance to look at the patches that is.


Thanks
ChenYu

[1] https://lore.kernel.org/all/20240822072047.3097740-1-wenst at chromium.org/
[2] commit 4b91188dced8 ("gpiolib: Replace gpio_suffix_count with NULL-terminated array")

Chen-Yu Tsai (12):
  of: dynamic: Add of_changeset_update_prop_string
  of: base: Add for_each_child_of_node_with_prefix_scoped()
  regulator: Move OF-specific regulator lookup code to of_regulator.c
  regulator: Split up _regulator_get()
  regulator: Do pure DT regulator lookup in of_regulator_bulk_get_all()
  gpiolib: Add gpio_get_property_name_length()
  i2c: core: Remove extra space in Makefile
  i2c: Introduce OF component probe function
  i2c: of-prober: Add regulator support
  i2c: of-prober: Add GPIO support
  platform/chrome: Introduce device tree hardware prober
  arm64: dts: mediatek: mt8173-elm-hana: Mark touchscreens and trackpads
    as fail

 .../boot/dts/mediatek/mt8173-elm-hana.dtsi    |  13 +
 arch/arm64/boot/dts/mediatek/mt8173-elm.dtsi  |   4 +-
 drivers/gpio/gpiolib.c                        |  25 +
 drivers/i2c/Makefile                          |   7 +-
 drivers/i2c/i2c-core-of-prober.c              | 437 ++++++++++++++++++
 drivers/of/base.c                             |  35 ++
 drivers/of/dynamic.c                          |  44 ++
 drivers/platform/chrome/Kconfig               |  11 +
 drivers/platform/chrome/Makefile              |   1 +
 .../platform/chrome/chromeos_of_hw_prober.c   | 104 +++++
 drivers/regulator/core.c                      | 143 ++----
 drivers/regulator/internal.h                  |  15 +-
 drivers/regulator/of_regulator.c              | 150 +++++-
 include/linux/gpio/consumer.h                 |   7 +
 include/linux/i2c.h                           |  14 +
 include/linux/of.h                            |  13 +
 16 files changed, 918 insertions(+), 105 deletions(-)
 create mode 100644 drivers/i2c/i2c-core-of-prober.c
 create mode 100644 drivers/platform/chrome/chromeos_of_hw_prober.c

-- 
2.46.0.469.g59c65b2a67-goog



From wenst at chromium.org  Wed Sep  4 02:00:03 2024
From: wenst at chromium.org (Chen-Yu Tsai)
Date: Wed,  4 Sep 2024 17:00:03 +0800
Subject: [PATCH v6 01/12] of: dynamic: Add of_changeset_update_prop_string
In-Reply-To: <20240904090016.2841572-1-wenst@chromium.org>
References: <20240904090016.2841572-1-wenst@chromium.org>
Message-ID: <20240904090016.2841572-2-wenst@chromium.org>

Add a helper function to add string property updates to an OF changeset.
This is similar to of_changeset_add_prop_string(), but instead of adding
the property (and failing if it exists), it will update the property.

This shall be used later in the DT hardware prober.

Signed-off-by: Chen-Yu Tsai <wenst at chromium.org>
Reviewed-by: Rob Herring (Arm) <robh at kernel.org>
---
Changes since v5:
- Collected Rob's tag

Changes since v4:
- Use modern designated initializer for |prop|

Changes since v3:
- Use new __of_prop_free() helper
- Add new line before header declaration

Changes since v2:
- New patch added in v3
---
 drivers/of/dynamic.c | 44 ++++++++++++++++++++++++++++++++++++++++++++
 include/linux/of.h   |  4 ++++
 2 files changed, 48 insertions(+)

diff --git a/drivers/of/dynamic.c b/drivers/of/dynamic.c
index 110104a936d9..daa69d160a78 100644
--- a/drivers/of/dynamic.c
+++ b/drivers/of/dynamic.c
@@ -1072,3 +1072,47 @@ int of_changeset_add_prop_bool(struct of_changeset *ocs, struct device_node *np,
 	return of_changeset_add_prop_helper(ocs, np, &prop);
 }
 EXPORT_SYMBOL_GPL(of_changeset_add_prop_bool);
+
+static int of_changeset_update_prop_helper(struct of_changeset *ocs,
+					   struct device_node *np,
+					   const struct property *pp)
+{
+	struct property *new_pp;
+	int ret;
+
+	new_pp = __of_prop_dup(pp, GFP_KERNEL);
+	if (!new_pp)
+		return -ENOMEM;
+
+	ret = of_changeset_update_property(ocs, np, new_pp);
+	if (ret)
+		__of_prop_free(new_pp);
+
+	return ret;
+}
+
+/**
+ * of_changeset_update_prop_string - Add a string property update to a changeset
+ *
+ * @ocs:	changeset pointer
+ * @np:		device node pointer
+ * @prop_name:	name of the property to be updated
+ * @str:	pointer to null terminated string
+ *
+ * Create a string property to be updated and add it to a changeset.
+ *
+ * Return: 0 on success, a negative error value in case of an error.
+ */
+int of_changeset_update_prop_string(struct of_changeset *ocs,
+				    struct device_node *np,
+				    const char *prop_name, const char *str)
+{
+	struct property prop = {
+		.name = (char *)prop_name,
+		.length = strlen(str) + 1,
+		.value = (void *)str,
+	};
+
+	return of_changeset_update_prop_helper(ocs, np, &prop);
+}
+EXPORT_SYMBOL_GPL(of_changeset_update_prop_string);
diff --git a/include/linux/of.h b/include/linux/of.h
index 85b60ac9eec5..046283be1cd3 100644
--- a/include/linux/of.h
+++ b/include/linux/of.h
@@ -1651,6 +1651,10 @@ static inline int of_changeset_add_prop_u32(struct of_changeset *ocs,
 	return of_changeset_add_prop_u32_array(ocs, np, prop_name, &val, 1);
 }
 
+int of_changeset_update_prop_string(struct of_changeset *ocs,
+				    struct device_node *np,
+				    const char *prop_name, const char *str);
+
 int of_changeset_add_prop_bool(struct of_changeset *ocs, struct device_node *np,
 			       const char *prop_name);
 
-- 
2.46.0.469.g59c65b2a67-goog



From matthias.bgg at gmail.com  Wed Sep  4 02:00:24 2024
From: matthias.bgg at gmail.com (Matthias Brugger)
Date: Wed, 4 Sep 2024 11:00:24 +0200
Subject: [PATCH RESEND] wifi: mt76: mt7921: Check devm_kasprintf()
 returned value
In-Reply-To: <20240903014455.4144536-1-make24@iscas.ac.cn>
References: <20240903014455.4144536-1-make24@iscas.ac.cn>
Message-ID: <f48db1ae-23e2-4587-a4ab-3844d0822194@gmail.com>



On 03/09/2024 03:44, Ma Ke wrote:
> devm_kasprintf() can return a NULL pointer on failure but this returned
> value is not checked. Fix this lack and check the returned value.
> 
> Found by code review.
> 
> Cc: stable at vger.kernel.org
> Fixes: 6ae39b7c7ed4 ("wifi: mt76: mt7921: Support temp sensor")
> Signed-off-by: Ma Ke <make24 at iscas.ac.cn>

Reviwed-by: Matthias Brugger <matthias.bgg at gmail.com>

> ---
>   drivers/net/wireless/mediatek/mt76/mt7921/init.c | 2 ++
>   1 file changed, 2 insertions(+)
> 
> diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/init.c b/drivers/net/wireless/mediatek/mt76/mt7921/init.c
> index ef0c721d26e3..5ab395d9d93e 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt7921/init.c
> +++ b/drivers/net/wireless/mediatek/mt76/mt7921/init.c
> @@ -52,6 +52,8 @@ static int mt7921_thermal_init(struct mt792x_phy *phy)
>   
>   	name = devm_kasprintf(&wiphy->dev, GFP_KERNEL, "mt7921_%s",
>   			      wiphy_name(wiphy));
> +	if (!name)
> +		return -ENOMEM;
>   
>   	hwmon = devm_hwmon_device_register_with_groups(&wiphy->dev, name, phy,
>   						       mt7921_hwmon_groups);


From wenst at chromium.org  Wed Sep  4 02:00:04 2024
From: wenst at chromium.org (Chen-Yu Tsai)
Date: Wed,  4 Sep 2024 17:00:04 +0800
Subject: [PATCH v6 02/12] of: base: Add for_each_child_of_node_with_prefix_scoped()
In-Reply-To: <20240904090016.2841572-1-wenst@chromium.org>
References: <20240904090016.2841572-1-wenst@chromium.org>
Message-ID: <20240904090016.2841572-3-wenst@chromium.org>

There are cases where drivers would go through child device nodes and
operate on only the ones whose node name starts with a given prefix.

Provide a helper for these users. This will mainly be used in a
subsequent patch that implements a hardware component prober for I2C
busses.

Signed-off-by: Chen-Yu Tsai <wenst at chromium.org>
---
Changes since v5:
- New patch
---
 drivers/of/base.c  | 35 +++++++++++++++++++++++++++++++++++
 include/linux/of.h |  9 +++++++++
 2 files changed, 44 insertions(+)

diff --git a/drivers/of/base.c b/drivers/of/base.c
index 20603d3c9931..d3c123b3261a 100644
--- a/drivers/of/base.c
+++ b/drivers/of/base.c
@@ -628,6 +628,41 @@ struct device_node *of_get_next_child(const struct device_node *node,
 }
 EXPORT_SYMBOL(of_get_next_child);
 
+/**
+ * of_get_next_child_with_prefix - Find the next child node with prefix
+ * @node:	parent node
+ * @prev:	previous child of the parent node, or NULL to get first
+ *
+ * This function is like of_get_next_child(), except that it automatically
+ * skips any nodes whose name doesn't have the given prefix.
+ *
+ * Return: A node pointer with refcount incremented, use
+ * of_node_put() on it when done.
+ */
+struct device_node *of_get_next_child_with_prefix(const struct device_node *node,
+						  struct device_node *prev,
+						  const char *prefix)
+{
+	struct device_node *next;
+	unsigned long flags;
+
+	if (!node)
+		return NULL;
+
+	raw_spin_lock_irqsave(&devtree_lock, flags);
+	next = prev ? prev->sibling : node->child;
+	for (; next; next = next->sibling) {
+		if (!of_node_name_prefix(next, prefix))
+			continue;
+		if (of_node_get(next))
+			break;
+	}
+	of_node_put(prev);
+	raw_spin_unlock_irqrestore(&devtree_lock, flags);
+	return next;
+}
+EXPORT_SYMBOL(of_get_next_child_with_prefix);
+
 static struct device_node *of_get_next_status_child(const struct device_node *node,
 						    struct device_node *prev,
 						    bool (*checker)(const struct device_node *))
diff --git a/include/linux/of.h b/include/linux/of.h
index 046283be1cd3..acc0d5b98417 100644
--- a/include/linux/of.h
+++ b/include/linux/of.h
@@ -289,6 +289,9 @@ extern struct device_node *of_get_parent(const struct device_node *node);
 extern struct device_node *of_get_next_parent(struct device_node *node);
 extern struct device_node *of_get_next_child(const struct device_node *node,
 					     struct device_node *prev);
+extern struct device_node *of_get_next_child_with_prefix(const struct device_node *node,
+							 struct device_node *prev,
+							 const char *prefix);
 extern struct device_node *of_get_next_available_child(
 	const struct device_node *node, struct device_node *prev);
 extern struct device_node *of_get_next_reserved_child(
@@ -1468,6 +1471,12 @@ static inline int of_property_read_s32(const struct device_node *np,
 	     child != NULL;						\
 	     child = of_get_next_child(parent, child))
 
+#define for_each_child_of_node_with_prefix_scoped(parent, child, prefix) \
+	for (struct device_node *child __free(device_node) =		\
+	     of_get_next_child_with_prefix(parent, NULL, prefix);	\
+	     child != NULL;						\
+	     child = of_get_next_child_with_prefix(parent, child, prefix))
+
 #define for_each_available_child_of_node(parent, child) \
 	for (child = of_get_next_available_child(parent, NULL); child != NULL; \
 	     child = of_get_next_available_child(parent, child))
-- 
2.46.0.469.g59c65b2a67-goog



From wenst at chromium.org  Wed Sep  4 02:00:05 2024
From: wenst at chromium.org (Chen-Yu Tsai)
Date: Wed,  4 Sep 2024 17:00:05 +0800
Subject: [PATCH v6 03/12] regulator: Move OF-specific regulator lookup code to of_regulator.c
In-Reply-To: <20240904090016.2841572-1-wenst@chromium.org>
References: <20240904090016.2841572-1-wenst@chromium.org>
Message-ID: <20240904090016.2841572-4-wenst@chromium.org>

There's still a bit of OF-specific code in the regulator device lookup
function.

Move those bits of code over to of_regulator.c, and create a new
function of_regulator_dev_lookup() to encapsulate the code moved out of
regulator_dev_lookup().

Also mark of_find_regulator_by_node() as static, since there are no
other users in other compile units.

There are no functional changes. A line alignment was also fixed.

Signed-off-by: Chen-Yu Tsai <wenst at chromium.org>
---
Changes since v5:
- Fix kerneldoc format of of_regulator_dev_lookup()
- Fix stub compile error for !CONFIG_OF in drivers/regulator/internal.h

Changes since v4:
- New patch
---
 drivers/regulator/core.c         |  87 ++----------------------
 drivers/regulator/internal.h     |   9 +--
 drivers/regulator/of_regulator.c | 110 ++++++++++++++++++++++++++++++-
 3 files changed, 119 insertions(+), 87 deletions(-)

diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c
index c1d11924d892..835a5531d045 100644
--- a/drivers/regulator/core.c
+++ b/drivers/regulator/core.c
@@ -421,74 +421,6 @@ static void regulator_lock_dependent(struct regulator_dev *rdev,
 	mutex_unlock(&regulator_list_mutex);
 }
 
-/**
- * of_get_child_regulator - get a child regulator device node
- * based on supply name
- * @parent: Parent device node
- * @prop_name: Combination regulator supply name and "-supply"
- *
- * Traverse all child nodes.
- * Extract the child regulator device node corresponding to the supply name.
- *
- * Return: Pointer to the &struct device_node corresponding to the regulator
- *	   if found, or %NULL if not found.
- */
-static struct device_node *of_get_child_regulator(struct device_node *parent,
-						  const char *prop_name)
-{
-	struct device_node *regnode = NULL;
-	struct device_node *child = NULL;
-
-	for_each_child_of_node(parent, child) {
-		regnode = of_parse_phandle(child, prop_name, 0);
-
-		if (!regnode) {
-			regnode = of_get_child_regulator(child, prop_name);
-			if (regnode)
-				goto err_node_put;
-		} else {
-			goto err_node_put;
-		}
-	}
-	return NULL;
-
-err_node_put:
-	of_node_put(child);
-	return regnode;
-}
-
-/**
- * of_get_regulator - get a regulator device node based on supply name
- * @dev: Device pointer for the consumer (of regulator) device
- * @supply: regulator supply name
- *
- * Extract the regulator device node corresponding to the supply name.
- *
- * Return: Pointer to the &struct device_node corresponding to the regulator
- *	   if found, or %NULL if not found.
- */
-static struct device_node *of_get_regulator(struct device *dev, const char *supply)
-{
-	struct device_node *regnode = NULL;
-	char prop_name[64]; /* 64 is max size of property name */
-
-	dev_dbg(dev, "Looking up %s-supply from device tree\n", supply);
-
-	snprintf(prop_name, 64, "%s-supply", supply);
-	regnode = of_parse_phandle(dev->of_node, prop_name, 0);
-
-	if (!regnode) {
-		regnode = of_get_child_regulator(dev->of_node, prop_name);
-		if (regnode)
-			return regnode;
-
-		dev_dbg(dev, "Looking up %s property in node %pOF failed\n",
-				prop_name, dev->of_node);
-		return NULL;
-	}
-	return regnode;
-}
-
 /* Platform voltage constraint check */
 int regulator_check_voltage(struct regulator_dev *rdev,
 			    int *min_uV, int *max_uV)
@@ -2021,7 +1953,6 @@ static struct regulator_dev *regulator_dev_lookup(struct device *dev,
 						  const char *supply)
 {
 	struct regulator_dev *r = NULL;
-	struct device_node *node;
 	struct regulator_map *map;
 	const char *devname = NULL;
 
@@ -2029,19 +1960,11 @@ static struct regulator_dev *regulator_dev_lookup(struct device *dev,
 
 	/* first do a dt based lookup */
 	if (dev && dev->of_node) {
-		node = of_get_regulator(dev, supply);
-		if (node) {
-			r = of_find_regulator_by_node(node);
-			of_node_put(node);
-			if (r)
-				return r;
-
-			/*
-			 * We have a node, but there is no device.
-			 * assume it has not registered yet.
-			 */
-			return ERR_PTR(-EPROBE_DEFER);
-		}
+		r = of_regulator_dev_lookup(dev, supply);
+		if (!IS_ERR(r))
+			return r;
+		if (PTR_ERR(r) == -EPROBE_DEFER)
+			return r;
 	}
 
 	/* if not found, try doing it non-dt way */
diff --git a/drivers/regulator/internal.h b/drivers/regulator/internal.h
index 77a502141089..8e5506c5ee94 100644
--- a/drivers/regulator/internal.h
+++ b/drivers/regulator/internal.h
@@ -66,7 +66,8 @@ static inline struct regulator_dev *dev_to_rdev(struct device *dev)
 }
 
 #ifdef CONFIG_OF
-struct regulator_dev *of_find_regulator_by_node(struct device_node *np);
+struct regulator_dev *of_regulator_dev_lookup(struct device *dev,
+					      const char *supply);
 struct regulator_init_data *regulator_of_get_init_data(struct device *dev,
 			         const struct regulator_desc *desc,
 				 struct regulator_config *config,
@@ -80,10 +81,10 @@ int of_get_n_coupled(struct regulator_dev *rdev);
 bool of_check_coupling_data(struct regulator_dev *rdev);
 
 #else
-static inline struct regulator_dev *
-of_find_regulator_by_node(struct device_node *np)
+static inline struct regulator_dev *of_regulator_dev_lookup(struct device *dev,
+							    const char *supply)
 {
-	return NULL;
+	return ERR_PTR(-ENODEV);
 }
 
 static inline struct regulator_init_data *
diff --git a/drivers/regulator/of_regulator.c b/drivers/regulator/of_regulator.c
index cec8c3647a00..d5dd7a9e577b 100644
--- a/drivers/regulator/of_regulator.c
+++ b/drivers/regulator/of_regulator.c
@@ -552,7 +552,75 @@ struct regulator_init_data *regulator_of_get_init_data(struct device *dev,
 	return NULL;
 }
 
-struct regulator_dev *of_find_regulator_by_node(struct device_node *np)
+/**
+ * of_get_child_regulator - get a child regulator device node
+ * based on supply name
+ * @parent: Parent device node
+ * @prop_name: Combination regulator supply name and "-supply"
+ *
+ * Traverse all child nodes.
+ * Extract the child regulator device node corresponding to the supply name.
+ *
+ * Return: Pointer to the &struct device_node corresponding to the regulator
+ *	   if found, or %NULL if not found.
+ */
+static struct device_node *of_get_child_regulator(struct device_node *parent,
+						  const char *prop_name)
+{
+	struct device_node *regnode = NULL;
+	struct device_node *child = NULL;
+
+	for_each_child_of_node(parent, child) {
+		regnode = of_parse_phandle(child, prop_name, 0);
+
+		if (!regnode) {
+			regnode = of_get_child_regulator(child, prop_name);
+			if (regnode)
+				goto err_node_put;
+		} else {
+			goto err_node_put;
+		}
+	}
+	return NULL;
+
+err_node_put:
+	of_node_put(child);
+	return regnode;
+}
+
+/**
+ * of_get_regulator - get a regulator device node based on supply name
+ * @dev: Device pointer for the consumer (of regulator) device
+ * @supply: regulator supply name
+ *
+ * Extract the regulator device node corresponding to the supply name.
+ *
+ * Return: Pointer to the &struct device_node corresponding to the regulator
+ *	   if found, or %NULL if not found.
+ */
+static struct device_node *of_get_regulator(struct device *dev, const char *supply)
+{
+	struct device_node *regnode = NULL;
+	char prop_name[64]; /* 64 is max size of property name */
+
+	dev_dbg(dev, "Looking up %s-supply from device tree\n", supply);
+
+	snprintf(prop_name, 64, "%s-supply", supply);
+	regnode = of_parse_phandle(dev->of_node, prop_name, 0);
+
+	if (!regnode) {
+		regnode = of_get_child_regulator(dev->of_node, prop_name);
+		if (regnode)
+			return regnode;
+
+		dev_dbg(dev, "Looking up %s property in node %pOF failed\n",
+			prop_name, dev->of_node);
+		return NULL;
+	}
+	return regnode;
+}
+
+static struct regulator_dev *of_find_regulator_by_node(struct device_node *np)
 {
 	struct device *dev;
 
@@ -561,6 +629,46 @@ struct regulator_dev *of_find_regulator_by_node(struct device_node *np)
 	return dev ? dev_to_rdev(dev) : NULL;
 }
 
+/**
+ * of_regulator_dev_lookup - lookup a regulator device with device tree only
+ * @dev: Device pointer for regulator supply lookup.
+ * @supply: Supply name or regulator ID.
+ *
+ * Return: Pointer to the &struct regulator_dev on success, or ERR_PTR()
+ *	   encoded value on error.
+ *
+ * If successful, returns a pointer to the &struct regulator_dev that
+ * corresponds to the name @supply and with the embedded &struct device
+ * refcount incremented by one. The refcount must be dropped by calling
+ * put_device().
+ *
+ * On failure one of the following ERR_PTR() encoded values is returned:
+ * * -%ENODEV if lookup fails permanently.
+ * * -%EPROBE_DEFER if lookup could succeed in the future.
+ */
+struct regulator_dev *of_regulator_dev_lookup(struct device *dev,
+					      const char *supply)
+{
+	struct regulator_dev *r;
+	struct device_node *node;
+
+	node = of_get_regulator(dev, supply);
+	if (node) {
+		r = of_find_regulator_by_node(node);
+		of_node_put(node);
+		if (r)
+			return r;
+
+		/*
+		 * We have a node, but there is no device.
+		 * assume it has not registered yet.
+		 */
+		return ERR_PTR(-EPROBE_DEFER);
+	}
+
+	return ERR_PTR(-ENODEV);
+}
+
 /*
  * Returns number of regulators coupled with rdev.
  */
-- 
2.46.0.469.g59c65b2a67-goog



From wenst at chromium.org  Wed Sep  4 02:00:06 2024
From: wenst at chromium.org (Chen-Yu Tsai)
Date: Wed,  4 Sep 2024 17:00:06 +0800
Subject: [PATCH v6 04/12] regulator: Split up _regulator_get()
In-Reply-To: <20240904090016.2841572-1-wenst@chromium.org>
References: <20240904090016.2841572-1-wenst@chromium.org>
Message-ID: <20240904090016.2841572-5-wenst@chromium.org>

_regulator_get() contains a lot of common code doing checks prior to the
regulator lookup and housekeeping work after the lookup. Almost all the
code could be shared with a OF-specific variant of _regulator_get().

Split out the common parts so that they can be reused. The OF-specific
version of _regulator_get() will be added in a subsequent patch.
No functional changes were made.

Signed-off-by: Chen-Yu Tsai <wenst at chromium.org>
---
Changes since v5:
- Fixed kerneldoc "Return" section format for _regulator_get_common()
- Slightly reworded return value description

Changes since v4:
- New patch
---
 drivers/regulator/core.c     | 54 ++++++++++++++++++++++++++++--------
 drivers/regulator/internal.h |  4 +++
 2 files changed, 47 insertions(+), 11 deletions(-)

diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c
index 835a5531d045..d60c86477ac2 100644
--- a/drivers/regulator/core.c
+++ b/drivers/regulator/core.c
@@ -2103,26 +2103,43 @@ static int regulator_resolve_supply(struct regulator_dev *rdev)
 	return ret;
 }
 
-/* Internal regulator request function */
-struct regulator *_regulator_get(struct device *dev, const char *id,
-				 enum regulator_get_type get_type)
+/* common pre-checks for regulator requests */
+int _regulator_get_common_check(struct device *dev, const char *id,
+				enum regulator_get_type get_type)
 {
-	struct regulator_dev *rdev;
-	struct regulator *regulator;
-	struct device_link *link;
-	int ret;
-
 	if (get_type >= MAX_GET_TYPE) {
 		dev_err(dev, "invalid type %d in %s\n", get_type, __func__);
-		return ERR_PTR(-EINVAL);
+		return -EINVAL;
 	}
 
 	if (id == NULL) {
 		dev_err(dev, "regulator request with no identifier\n");
-		return ERR_PTR(-EINVAL);
+		return -EINVAL;
 	}
 
-	rdev = regulator_dev_lookup(dev, id);
+	return 0;
+}
+
+/**
+ * _regulator_get_common - Common code for regulator requests
+ * @rdev: regulator device pointer as returned by *regulator_dev_lookup()
+ *       Its reference count is expected to have been incremented.
+ * @dev: device used for dev_printk messages
+ * @id: Supply name or regulator ID
+ * @get_type: enum regulator_get_type value corresponding to type of request
+ *
+ * Returns: pointer to struct regulator corresponding to @rdev, or ERR_PTR()
+ *	    encoded error.
+ *
+ * This function should be chained with *regulator_dev_lookup() functions.
+ */
+struct regulator *_regulator_get_common(struct regulator_dev *rdev, struct device *dev,
+					const char *id, enum regulator_get_type get_type)
+{
+	struct regulator *regulator;
+	struct device_link *link;
+	int ret;
+
 	if (IS_ERR(rdev)) {
 		ret = PTR_ERR(rdev);
 
@@ -2238,6 +2255,21 @@ struct regulator *_regulator_get(struct device *dev, const char *id,
 	return regulator;
 }
 
+/* Internal regulator request function */
+struct regulator *_regulator_get(struct device *dev, const char *id,
+				 enum regulator_get_type get_type)
+{
+	struct regulator_dev *rdev;
+	int ret;
+
+	ret = _regulator_get_common_check(dev, id, get_type);
+	if (ret)
+		return ERR_PTR(ret);
+
+	rdev = regulator_dev_lookup(dev, id);
+	return _regulator_get_common(rdev, dev, id, get_type);
+}
+
 /**
  * regulator_get - lookup and obtain a reference to a regulator.
  * @dev: device for regulator "consumer"
diff --git a/drivers/regulator/internal.h b/drivers/regulator/internal.h
index 8e5506c5ee94..5b43f802468d 100644
--- a/drivers/regulator/internal.h
+++ b/drivers/regulator/internal.h
@@ -121,6 +121,10 @@ enum regulator_get_type {
 	MAX_GET_TYPE
 };
 
+int _regulator_get_common_check(struct device *dev, const char *id,
+				enum regulator_get_type get_type);
+struct regulator *_regulator_get_common(struct regulator_dev *rdev, struct device *dev,
+					const char *id, enum regulator_get_type get_type);
 struct regulator *_regulator_get(struct device *dev, const char *id,
 				 enum regulator_get_type get_type);
 int _regulator_bulk_get(struct device *dev, int num_consumers,
-- 
2.46.0.469.g59c65b2a67-goog



From wenst at chromium.org  Wed Sep  4 02:00:07 2024
From: wenst at chromium.org (Chen-Yu Tsai)
Date: Wed,  4 Sep 2024 17:00:07 +0800
Subject: [PATCH v6 05/12] regulator: Do pure DT regulator lookup in of_regulator_bulk_get_all()
In-Reply-To: <20240904090016.2841572-1-wenst@chromium.org>
References: <20240904090016.2841572-1-wenst@chromium.org>
Message-ID: <20240904090016.2841572-6-wenst@chromium.org>

The to-be-introduced I2C component prober needs to enable regulator
supplies (and toggle GPIO pins) for the various components it intends
to probe. To support this, a new "pure DT lookup" method for getting
regulator supplies is needed, since the device normally requesting
the supply won't get created until after the component is probed to
be available.

Convert the existing of_regulator_bulk_get_all() for this purpose.
This function has no in-tree users, as the original patch [1] that
used it was never landed. This patch changes the function ABI, but
it is straightforward to convert users.

The underlying code that supports the existing regulator_get*()
functions has been reworked in previous patches to support this
specific case. An internal OF-specific version of regulator_get(),
of_regulator_get_optional(), is added for this.

Also convert an existing usage of "dev && dev->of_node" to
"dev_of_node(dev)".

[1] https://lore.kernel.org/all/20231220203537.83479-2-jernej.skrabec at gmail.com/

Signed-off-by: Chen-Yu Tsai <wenst at chromium.org>
---
Changes since v5:
- Used "dev_of_node(dev)" instead of "dev->of_node"
- Replaced "dev_printk" with "dev_printk()" in kerneldoc mentions
- Fixed kerneldoc "Return" section format for of_regulator_get_optional()
- Fix @np parameter name in of_regulator_dev_lookup() kerneldoc

Changes since v4:
- Restore platform-agnostic regulator consumer code to original state
- Move OF-specific regulator code to of_regulator.c (separate patch)
- Split _regulator_get() into three parts for reuse (separate patch)
- Add OF-specific _of_regulator_get() function
- Rename regulator_of_get_optional() to of_regulator_get_optional() for
  consistency
- Make of_regulator_get_optional static, as it is only used internally
- Convert of_regulator_bulk_get_all()

Changes since v3:
- New patch
---
 drivers/regulator/core.c         |  4 +--
 drivers/regulator/internal.h     |  2 ++
 drivers/regulator/of_regulator.c | 52 +++++++++++++++++++++++++++-----
 3 files changed, 49 insertions(+), 9 deletions(-)

diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c
index d60c86477ac2..f94a06ac2109 100644
--- a/drivers/regulator/core.c
+++ b/drivers/regulator/core.c
@@ -1959,8 +1959,8 @@ static struct regulator_dev *regulator_dev_lookup(struct device *dev,
 	regulator_supply_alias(&dev, &supply);
 
 	/* first do a dt based lookup */
-	if (dev && dev->of_node) {
-		r = of_regulator_dev_lookup(dev, supply);
+	if (dev_of_node(dev)) {
+		r = of_regulator_dev_lookup(dev, dev_of_node(dev), supply);
 		if (!IS_ERR(r))
 			return r;
 		if (PTR_ERR(r) == -EPROBE_DEFER)
diff --git a/drivers/regulator/internal.h b/drivers/regulator/internal.h
index 5b43f802468d..f62cacbbc729 100644
--- a/drivers/regulator/internal.h
+++ b/drivers/regulator/internal.h
@@ -67,6 +67,7 @@ static inline struct regulator_dev *dev_to_rdev(struct device *dev)
 
 #ifdef CONFIG_OF
 struct regulator_dev *of_regulator_dev_lookup(struct device *dev,
+					      struct device_node *np,
 					      const char *supply);
 struct regulator_init_data *regulator_of_get_init_data(struct device *dev,
 			         const struct regulator_desc *desc,
@@ -82,6 +83,7 @@ bool of_check_coupling_data(struct regulator_dev *rdev);
 
 #else
 static inline struct regulator_dev *of_regulator_dev_lookup(struct device *dev,
+							    struct device_node *np,
 							    const char *supply)
 {
 	return ERR_PTR(-ENODEV);
diff --git a/drivers/regulator/of_regulator.c b/drivers/regulator/of_regulator.c
index d5dd7a9e577b..b00172176d0c 100644
--- a/drivers/regulator/of_regulator.c
+++ b/drivers/regulator/of_regulator.c
@@ -590,7 +590,8 @@ static struct device_node *of_get_child_regulator(struct device_node *parent,
 
 /**
  * of_get_regulator - get a regulator device node based on supply name
- * @dev: Device pointer for the consumer (of regulator) device
+ * @dev: Device pointer for dev_printk() messages
+ * @node: Device node pointer for supply property lookup
  * @supply: regulator supply name
  *
  * Extract the regulator device node corresponding to the supply name.
@@ -598,15 +599,16 @@ static struct device_node *of_get_child_regulator(struct device_node *parent,
  * Return: Pointer to the &struct device_node corresponding to the regulator
  *	   if found, or %NULL if not found.
  */
-static struct device_node *of_get_regulator(struct device *dev, const char *supply)
+static struct device_node *of_get_regulator(struct device *dev, struct device_node *node,
+					    const char *supply)
 {
 	struct device_node *regnode = NULL;
 	char prop_name[64]; /* 64 is max size of property name */
 
-	dev_dbg(dev, "Looking up %s-supply from device tree\n", supply);
+	dev_dbg(dev, "Looking up %s-supply from device node %pOF\n", supply, node);
 
 	snprintf(prop_name, 64, "%s-supply", supply);
-	regnode = of_parse_phandle(dev->of_node, prop_name, 0);
+	regnode = of_parse_phandle(node, prop_name, 0);
 
 	if (!regnode) {
 		regnode = of_get_child_regulator(dev->of_node, prop_name);
@@ -632,6 +634,7 @@ static struct regulator_dev *of_find_regulator_by_node(struct device_node *np)
 /**
  * of_regulator_dev_lookup - lookup a regulator device with device tree only
  * @dev: Device pointer for regulator supply lookup.
+ * @np: Device node pointer for regulator supply lookup.
  * @supply: Supply name or regulator ID.
  *
  * Return: Pointer to the &struct regulator_dev on success, or ERR_PTR()
@@ -646,13 +649,13 @@ static struct regulator_dev *of_find_regulator_by_node(struct device_node *np)
  * * -%ENODEV if lookup fails permanently.
  * * -%EPROBE_DEFER if lookup could succeed in the future.
  */
-struct regulator_dev *of_regulator_dev_lookup(struct device *dev,
+struct regulator_dev *of_regulator_dev_lookup(struct device *dev, struct device_node *np,
 					      const char *supply)
 {
 	struct regulator_dev *r;
 	struct device_node *node;
 
-	node = of_get_regulator(dev, supply);
+	node = of_get_regulator(dev, np, supply);
 	if (node) {
 		r = of_find_regulator_by_node(node);
 		of_node_put(node);
@@ -669,6 +672,41 @@ struct regulator_dev *of_regulator_dev_lookup(struct device *dev,
 	return ERR_PTR(-ENODEV);
 }
 
+static struct regulator *_of_regulator_get(struct device *dev, struct device_node *node,
+					   const char *id, enum regulator_get_type get_type)
+{
+	struct regulator_dev *r;
+	int ret;
+
+	ret = _regulator_get_common_check(dev, id, get_type);
+	if (ret)
+		return ERR_PTR(ret);
+
+	r = of_regulator_dev_lookup(dev, node, id);
+	return _regulator_get_common(r, dev, id, get_type);
+}
+
+/**
+ * of_regulator_get_optional - get optional regulator via device tree lookup
+ * @dev: device used for dev_printk() messages
+ * @node: device node for regulator "consumer"
+ * @id: Supply name
+ *
+ * Return: pointer to struct regulator corresponding to the regulator producer,
+ *	   or PTR_ERR() encoded error number.
+ *
+ * This is intended for use by consumers that want to get a regulator
+ * supply directly from a device node, and can and want to deal with
+ * absence of such supplies. This will _not_ consider supply aliases.
+ * See regulator_dev_lookup().
+ */
+static struct regulator *of_regulator_get_optional(struct device *dev,
+						   struct device_node *node,
+						   const char *id)
+{
+	return _of_regulator_get(NULL, node, id, OPTIONAL_GET);
+}
+
 /*
  * Returns number of regulators coupled with rdev.
  */
@@ -886,7 +924,7 @@ int of_regulator_bulk_get_all(struct device *dev, struct device_node *np,
 		} else {
 			memcpy(name, prop->name, i);
 			name[i] = '\0';
-			tmp = regulator_get(dev, name);
+			tmp = of_regulator_get_optional(dev, np, name);
 			if (IS_ERR(tmp)) {
 				ret = PTR_ERR(tmp);
 				goto error;
-- 
2.46.0.469.g59c65b2a67-goog



From wenst at chromium.org  Wed Sep  4 02:00:08 2024
From: wenst at chromium.org (Chen-Yu Tsai)
Date: Wed,  4 Sep 2024 17:00:08 +0800
Subject: [PATCH v6 06/12] gpiolib: Add gpio_get_property_name_length()
In-Reply-To: <20240904090016.2841572-1-wenst@chromium.org>
References: <20240904090016.2841572-1-wenst@chromium.org>
Message-ID: <20240904090016.2841572-7-wenst@chromium.org>

The I2C device tree component prober needs to get and toggle GPIO lines
for the components it intends to probe. These components may not use the
same name for their GPIO lines, so the prober must go through the device
tree, check each property to see it is a GPIO property, and get the GPIO
line.

Instead of duplicating the GPIO suffixes, or exporting them to the
prober to do pattern matching, simply add and export a new function that
does the pattern matching and returns the length of the GPIO name. The
caller can then use that to copy out the name if it needs to.

Andy suggested a much shorter implementation.

Suggested-by: Andy Shevchenko <andriy.shevchenko at linux.intel.com>
Signed-off-by: Chen-Yu Tsai <wenst at chromium.org>

---
Changes since v5:
- Changed function name to "gpio_get_property_name_length()"
- Changed argument name to "propname"
- Clarified return value for "*-<GPIO suffix>" case
- Reworked according to Andy's suggestion
- Added stub function

Changes since v4:
- new patch
---
 drivers/gpio/gpiolib.c        | 25 +++++++++++++++++++++++++
 include/linux/gpio/consumer.h |  7 +++++++
 2 files changed, 32 insertions(+)

diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
index 3903d0a75304..86527cc7991b 100644
--- a/drivers/gpio/gpiolib.c
+++ b/drivers/gpio/gpiolib.c
@@ -4295,6 +4295,31 @@ struct gpio_desc *fwnode_gpiod_get_index(struct fwnode_handle *fwnode,
 }
 EXPORT_SYMBOL_GPL(fwnode_gpiod_get_index);
 
+/**
+ * gpio_get_property_name_length - Returns the GPIO name length from a property name
+ * @propname:	name of the property to check
+ *
+ * This function checks if the given property name matches the GPIO property
+ * patterns, and returns the length of the name of the GPIO. The pattern is
+ * "*-<GPIO suffix>" or just "<GPIO suffix>".
+ *
+ * Returns:
+ * The length of the string before '-<GPIO suffix>' if it matches
+ * "*-<GPIO suffix>", or 0 if no name part, just the suffix, or
+ * -EINVAL if the string doesn't match the pattern.
+ */
+int gpio_get_property_name_length(const char *propname)
+{
+	const char *dash = strrchr(propname, '-');
+
+	for (const char *const *p = gpio_suffixes; *p; p++)
+		if (!strcmp(dash ? dash + 1 : propname, *p))
+			return dash ? dash - propname : 0;
+
+	return -EINVAL;
+}
+EXPORT_SYMBOL_GPL(gpio_get_property_name_length);
+
 /**
  * gpiod_count - return the number of GPIOs associated with a device / function
  *		or -ENOENT if no GPIO has been assigned to the requested function
diff --git a/include/linux/gpio/consumer.h b/include/linux/gpio/consumer.h
index db2dfbae8edb..494dde33ca44 100644
--- a/include/linux/gpio/consumer.h
+++ b/include/linux/gpio/consumer.h
@@ -56,6 +56,8 @@ enum gpiod_flags {
 
 #ifdef CONFIG_GPIOLIB
 
+int gpio_get_property_name_length(const char *propname);
+
 /* Return the number of GPIOs associated with a device / function */
 int gpiod_count(struct device *dev, const char *con_id);
 
@@ -188,6 +190,11 @@ struct gpio_desc *devm_fwnode_gpiod_get_index(struct device *dev,
 
 #include <asm/bug.h>
 
+static inline int gpio_get_property_name_length(const char *propname)
+{
+	return ERR_PTR(-ENOSYS);
+}
+
 static inline int gpiod_count(struct device *dev, const char *con_id)
 {
 	return 0;
-- 
2.46.0.469.g59c65b2a67-goog



From wenst at chromium.org  Wed Sep  4 02:00:09 2024
From: wenst at chromium.org (Chen-Yu Tsai)
Date: Wed,  4 Sep 2024 17:00:09 +0800
Subject: [PATCH v6 07/12] i2c: core: Remove extra space in Makefile
In-Reply-To: <20240904090016.2841572-1-wenst@chromium.org>
References: <20240904090016.2841572-1-wenst@chromium.org>
Message-ID: <20240904090016.2841572-8-wenst@chromium.org>

Some lines in the Makefile have a space before tabs. Remove those.

Reported-by: Andy Shevchenko <andriy.shevchenko at linux.intel.com>
Closes: https://lore.kernel.org/all/ZsdE0PxKnGRjzChl at smile.fi.intel.com/
Signed-off-by: Chen-Yu Tsai <wenst at chromium.org>
---
Changes since v5:
- new patch
---
 drivers/i2c/Makefile | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/i2c/Makefile b/drivers/i2c/Makefile
index 3f71ce4711e3..f12d6b10a85e 100644
--- a/drivers/i2c/Makefile
+++ b/drivers/i2c/Makefile
@@ -5,10 +5,10 @@
 
 obj-$(CONFIG_I2C_BOARDINFO)	+= i2c-boardinfo.o
 obj-$(CONFIG_I2C)		+= i2c-core.o
-i2c-core-objs 			:= i2c-core-base.o i2c-core-smbus.o
+i2c-core-objs			:= i2c-core-base.o i2c-core-smbus.o
 i2c-core-$(CONFIG_ACPI)		+= i2c-core-acpi.o
-i2c-core-$(CONFIG_I2C_SLAVE) 	+= i2c-core-slave.o
-i2c-core-$(CONFIG_OF) 		+= i2c-core-of.o
+i2c-core-$(CONFIG_I2C_SLAVE)	+= i2c-core-slave.o
+i2c-core-$(CONFIG_OF)		+= i2c-core-of.o
 
 obj-$(CONFIG_I2C_SMBUS)		+= i2c-smbus.o
 obj-$(CONFIG_I2C_CHARDEV)	+= i2c-dev.o
-- 
2.46.0.469.g59c65b2a67-goog



From wenst at chromium.org  Wed Sep  4 02:00:10 2024
From: wenst at chromium.org (Chen-Yu Tsai)
Date: Wed,  4 Sep 2024 17:00:10 +0800
Subject: [PATCH v6 08/12] i2c: Introduce OF component probe function
In-Reply-To: <20240904090016.2841572-1-wenst@chromium.org>
References: <20240904090016.2841572-1-wenst@chromium.org>
Message-ID: <20240904090016.2841572-9-wenst@chromium.org>

Some devices are designed and manufactured with some components having
multiple drop-in replacement options. These components are often
connected to the mainboard via ribbon cables, having the same signals
and pin assignments across all options. These may include the display
panel and touchscreen on laptops and tablets, and the trackpad on
laptops. Sometimes which component option is used in a particular device
can be detected by some firmware provided identifier, other times that
information is not available, and the kernel has to try to probe each
device.

This change attempts to make the "probe each device" case cleaner. The
current approach is to have all options added and enabled in the device
tree. The kernel would then bind each device and run each driver's probe
function. This works, but has been broken before due to the introduction
of asynchronous probing, causing multiple instances requesting "shared"
resources, such as pinmuxes, GPIO pins, interrupt lines, at the same
time, with only one instance succeeding. Work arounds for these include
moving the pinmux to the parent I2C controller, using GPIO hogs or
pinmux settings to keep the GPIO pins in some fixed configuration, and
requesting the interrupt line very late. Such configurations can be seen
on the MT8183 Krane Chromebook tablets, and the Qualcomm sc8280xp-based
Lenovo Thinkpad 13S.

Instead of this delicate dance between drivers and device tree quirks,
this change introduces a simple I2C component probe. function For a
given class of devices on the same I2C bus, it will go through all of
them, doing a simple I2C read transfer and see which one of them responds.
It will then enable the device that responds.

This requires some minor modifications in the existing device tree. The
status for all the device nodes for the component options must be set
to "failed-needs-probe". This makes it clear that some mechanism is
needed to enable one of them, and also prevents the prober and device
drivers running at the same time.

Signed-off-by: Chen-Yu Tsai <wenst at chromium.org>
---
Changes since v5:
- Fixed indent in Makefile
- Split regulator and GPIO TODO items
- Reversed final conditional in i2c_of_probe_enable_node()

Changes since v4:
- Split code into helper functions
- Use scoped helpers and __free() to reduce error path

Changes since v3:
- Complete kernel-doc
- Return different error if I2C controller is disabled
- Expand comment to explain assumptions and constraints
- Split for-loop finding target node and operations on target node
- Add missing i2c_put_adapter()
- Move prober code to separate file

Rob also asked why there was a limitation of "exactly one touchscreen
will be enabled across the whole tree".

The use case this prober currently targets is a component on consumer
electronics (tablet or laptop) being swapped out due to cost or supply
reasons. Designs with multiple components of the same type are pretty
rare. The way the next patch is written also assumes this for efficiency
reasons.

Changes since v2:
- New patch split out from "of: Introduce hardware prober driver"
- Addressed Rob's comments
  - Move i2c prober to i2c subsystem
  - Use of_node_is_available() to check if node is enabled.
  - Use OF changeset API to update status property
- Addressed Andy's comments
  - Probe function now accepts "struct device *dev" instead to reduce
    line length and dereferences
  - Move "ret = 0" to just before for_each_child_of_node(i2c_node, node)
---
 drivers/i2c/Makefile             |   1 +
 drivers/i2c/i2c-core-of-prober.c | 158 +++++++++++++++++++++++++++++++
 include/linux/i2c.h              |   4 +
 3 files changed, 163 insertions(+)
 create mode 100644 drivers/i2c/i2c-core-of-prober.c

diff --git a/drivers/i2c/Makefile b/drivers/i2c/Makefile
index f12d6b10a85e..c539cdc1e305 100644
--- a/drivers/i2c/Makefile
+++ b/drivers/i2c/Makefile
@@ -9,6 +9,7 @@ i2c-core-objs			:= i2c-core-base.o i2c-core-smbus.o
 i2c-core-$(CONFIG_ACPI)		+= i2c-core-acpi.o
 i2c-core-$(CONFIG_I2C_SLAVE)	+= i2c-core-slave.o
 i2c-core-$(CONFIG_OF)		+= i2c-core-of.o
+i2c-core-$(CONFIG_OF_DYNAMIC)	+= i2c-core-of-prober.o
 
 obj-$(CONFIG_I2C_SMBUS)		+= i2c-smbus.o
 obj-$(CONFIG_I2C_CHARDEV)	+= i2c-dev.o
diff --git a/drivers/i2c/i2c-core-of-prober.c b/drivers/i2c/i2c-core-of-prober.c
new file mode 100644
index 000000000000..64d7631f4885
--- /dev/null
+++ b/drivers/i2c/i2c-core-of-prober.c
@@ -0,0 +1,158 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Linux I2C core OF component prober code
+ *
+ * Copyright (C) 2024 Google LLC
+ */
+
+#include <linux/cleanup.h>
+#include <linux/device.h>
+#include <linux/dev_printk.h>
+#include <linux/err.h>
+#include <linux/i2c.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/slab.h>
+
+/*
+ * Some devices, such as Google Hana Chromebooks, are produced by multiple
+ * vendors each using their preferred components. Such components are all
+ * in the device tree. Instead of having all of them enabled and having each
+ * driver separately try and probe its device while fighting over shared
+ * resources, they can be marked as "fail-needs-probe" and have a prober
+ * figure out which one is actually used beforehand.
+ *
+ * This prober assumes such drop-in parts are on the same I2C bus, have
+ * non-conflicting addresses, and can be directly probed by seeing which
+ * address responds.
+ *
+ * TODO:
+ * - Support handling common regulators.
+ * - Support handling common GPIOs.
+ * - Support I2C muxes
+ */
+
+static struct device_node *i2c_of_probe_get_i2c_node(struct device *dev, const char *type)
+{
+	struct device_node *node __free(device_node) = of_find_node_by_name(NULL, type);
+	if (!node)
+		return dev_err_ptr_probe(dev, -ENODEV, "Could not find %s device node\n", type);
+
+	struct device_node *i2c_node __free(device_node) = of_get_parent(node);
+	if (!of_node_name_eq(i2c_node, "i2c"))
+		return dev_err_ptr_probe(dev, -EINVAL, "%s device isn't on I2C bus\n", type);
+
+	if (!of_device_is_available(i2c_node))
+		return dev_err_ptr_probe(dev, -ENODEV, "I2C controller not available\n");
+
+	return no_free_ptr(i2c_node);
+}
+
+static int i2c_of_probe_enable_node(struct device *dev, struct device_node *node)
+{
+	int ret;
+
+	dev_info(dev, "Enabling %pOF\n", node);
+
+	struct of_changeset *ocs __free(kfree) = kzalloc(sizeof(*ocs), GFP_KERNEL);
+	if (!ocs)
+		return -ENOMEM;
+
+	of_changeset_init(ocs);
+	ret = of_changeset_update_prop_string(ocs, node, "status", "okay");
+	if (ret)
+		return ret;
+
+	ret = of_changeset_apply(ocs);
+	if (ret) {
+		/* ocs needs to be explicitly cleaned up before being freed. */
+		of_changeset_destroy(ocs);
+	} else {
+		/*
+		 * ocs is intentionally kept around as it needs to
+		 * exist as long as the change is applied.
+		 */
+		void *ptr __always_unused = no_free_ptr(ocs);
+	}
+
+	return ret;
+}
+
+/**
+ * i2c_of_probe_component() - probe for devices of "type" on the same i2c bus
+ * @dev: &struct device of the caller, only used for dev_* printk messages
+ * @type: a string to match the device node name prefix to probe for
+ *
+ * Probe for possible I2C components of the same "type" on the same I2C bus
+ * that have their status marked as "fail".
+ *
+ * Assumes that across the entire device tree the only instances of nodes
+ * prefixed with "type" are the ones that need handling for second source
+ * components. In other words, if type is "touchscreen", then all device
+ * nodes named "touchscreen*" are the ones that need probing. There cannot
+ * be another "touchscreen" node that is already enabled.
+ *
+ * Assumes that for each "type" of component, only one actually exists. In
+ * other words, only one matching and existing device will be enabled.
+ *
+ * Context: Process context only. Does non-atomic I2C transfers.
+ *          Should only be used from a driver probe function, as the function
+ *          can return -EPROBE_DEFER if the I2C adapter is unavailable.
+ * Return: 0 on success or no-op, error code otherwise.
+ *         A no-op can happen when it seems like the device tree already
+ *         has components of the type to be probed already enabled. This
+ *         can happen when the device tree had not been updated to mark
+ *         the status of the to-be-probed components as "fail". Or this
+ *         function was already run with the same parameters and succeeded
+ *         in enabling a component. The latter could happen if the user
+ *         had multiple types of components to probe, and one of them down
+ *         the list caused a deferred probe. This is expected behavior.
+ */
+int i2c_of_probe_component(struct device *dev, const char *type)
+{
+	struct i2c_adapter *i2c;
+	int ret;
+
+	struct device_node *i2c_node __free(device_node) = i2c_of_probe_get_i2c_node(dev, type);
+	if (IS_ERR(i2c_node))
+		return PTR_ERR(i2c_node);
+
+	for_each_child_of_node_scoped(i2c_node, node) {
+		if (!of_node_name_prefix(node, type))
+			continue;
+		if (!of_device_is_available(node))
+			continue;
+
+		/*
+		 * Device tree has component already enabled. Either the
+		 * device tree isn't supported or we already probed once.
+		 */
+		return 0;
+	}
+
+	i2c = of_get_i2c_adapter_by_node(i2c_node);
+	if (!i2c)
+		return dev_err_probe(dev, -EPROBE_DEFER, "Couldn't get I2C adapter\n");
+
+	ret = 0;
+	for_each_child_of_node_scoped(i2c_node, node) {
+		union i2c_smbus_data data;
+		u32 addr;
+
+		if (!of_node_name_prefix(node, type))
+			continue;
+		if (of_property_read_u32(node, "reg", &addr))
+			continue;
+		if (i2c_smbus_xfer(i2c, addr, 0, I2C_SMBUS_READ, 0, I2C_SMBUS_BYTE, &data) < 0)
+			continue;
+
+		/* Found a device that is responding */
+		ret = i2c_of_probe_enable_node(dev, node);
+		break;
+	}
+
+	i2c_put_adapter(i2c);
+
+	return ret;
+}
+EXPORT_SYMBOL_GPL(i2c_of_probe_component);
diff --git a/include/linux/i2c.h b/include/linux/i2c.h
index 388ce71a29a9..c6c16731243d 100644
--- a/include/linux/i2c.h
+++ b/include/linux/i2c.h
@@ -1033,6 +1033,10 @@ const struct of_device_id
 int of_i2c_get_board_info(struct device *dev, struct device_node *node,
 			  struct i2c_board_info *info);
 
+#if IS_ENABLED(CONFIG_OF_DYNAMIC)
+int i2c_of_probe_component(struct device *dev, const char *type);
+#endif
+
 #else
 
 static inline struct i2c_client *of_find_i2c_device_by_node(struct device_node *node)
-- 
2.46.0.469.g59c65b2a67-goog



From wenst at chromium.org  Wed Sep  4 02:00:11 2024
From: wenst at chromium.org (Chen-Yu Tsai)
Date: Wed,  4 Sep 2024 17:00:11 +0800
Subject: [PATCH v6 09/12] i2c: of-prober: Add regulator support
In-Reply-To: <20240904090016.2841572-1-wenst@chromium.org>
References: <20240904090016.2841572-1-wenst@chromium.org>
Message-ID: <20240904090016.2841572-10-wenst@chromium.org>

This adds regulator management to the I2C OF component prober.
Components that the prober intends to probe likely require their
regulator supplies be enabled, and GPIOs be toggled to enable them or
bring them out of reset before they will respond to probe attempts.
GPIOs will be handled in the next patch.

Without specific knowledge of each component's resource names or
power sequencing requirements, the prober can only enable the
regulator supplies all at once, and toggle the GPIOs all at once.
Luckily, reset pins tend to be active low, while enable pins tend to
be active high, so setting the raw status of all GPIO pins to high
should work. The wait time before and after resources are enabled
are collected from existing drivers and device trees.

The prober collects resources from all possible components and enables
them together, instead of enabling resources and probing each component
one by one. The latter approach does not provide any boot time benefits
over simply enabling each component and letting each driver probe
sequentially.

The prober will also deduplicate the resources, since on a component
swap out or co-layout design, the resources are always the same.
While duplicate regulator supplies won't cause much issue, shared
GPIOs don't work reliably, especially with other drivers. For the
same reason, the prober will release the GPIOs before the successfully
probed component is actually enabled.

Signed-off-by: Chen-Yu Tsai <wenst at chromium.org>
---
Changes since v5:
- Split of_regulator_bulk_get_all() return value check and explain
  "ret == 0" case
- Switched to of_get_next_child_with_prefix_scoped() where applicable
- Used krealloc_array() instead of directly calculating size
- copy whole regulator array in one memcpy() call
- Drop "0" from struct zeroing initializer
- Split out regulator helper from i2c_of_probe_enable_res() to keep
  code cleaner when combined with the next patch
- Added options for customizing power sequencing delay
- Rename i2c_of_probe_get_regulator() to i2c_of_probe_get_regulators()
- Add i2c_of_probe_free_regulator() helper

Changes since v4:
- Split out GPIO handling to separate patch
- Rewrote using of_regulator_bulk_get_all()
- Replaced "regulators" with "regulator supplies" in debug messages

Changes since v3:
- New patch

This change is kept as a separate patch for now since the changes are
quite numerous.
---
 drivers/i2c/i2c-core-of-prober.c | 154 +++++++++++++++++++++++++++++--
 include/linux/i2c.h              |  10 +-
 2 files changed, 155 insertions(+), 9 deletions(-)

diff --git a/drivers/i2c/i2c-core-of-prober.c b/drivers/i2c/i2c-core-of-prober.c
index 64d7631f4885..56b06ad7aa64 100644
--- a/drivers/i2c/i2c-core-of-prober.c
+++ b/drivers/i2c/i2c-core-of-prober.c
@@ -6,12 +6,14 @@
  */
 
 #include <linux/cleanup.h>
+#include <linux/delay.h>
 #include <linux/device.h>
 #include <linux/dev_printk.h>
 #include <linux/err.h>
 #include <linux/i2c.h>
 #include <linux/module.h>
 #include <linux/of.h>
+#include <linux/regulator/consumer.h>
 #include <linux/slab.h>
 
 /*
@@ -27,11 +29,119 @@
  * address responds.
  *
  * TODO:
- * - Support handling common regulators.
  * - Support handling common GPIOs.
  * - Support I2C muxes
  */
 
+struct i2c_of_probe_data {
+	const struct i2c_of_probe_opts *opts;
+	struct regulator_bulk_data *regulators;
+	unsigned int regulators_num;
+};
+
+/* Returns number of regulator supplies found for node, or error. */
+static int i2c_of_probe_get_regulators(struct device *dev, struct device_node *node,
+				       struct i2c_of_probe_data *data)
+{
+	struct regulator_bulk_data *tmp, *new_regulators;
+	int ret;
+
+	ret = of_regulator_bulk_get_all(dev, node, &tmp);
+	if (ret < 0) {
+		return ret;
+	} else if (ret == 0) {
+		/*
+		 * It's entirely possible for a device node to not have
+		 * regulator supplies. While it doesn't make sense from
+		 * a hardware perspective, the supplies could be always
+		 * on or otherwise not modeled in the device tree, but
+		 * the device would still work.
+		 */
+		return ret;
+	}
+
+	if (!data->regulators) {
+		data->regulators = tmp;
+		data->regulators_num = ret;
+		return ret;
+	};
+
+	new_regulators = krealloc_array(data->regulators, (data->regulators_num + ret),
+					sizeof(*tmp), GFP_KERNEL);
+	if (!new_regulators) {
+		regulator_bulk_free(ret, tmp);
+		return -ENOMEM;
+	}
+
+	data->regulators = new_regulators;
+	memcpy(&data->regulators[data->regulators_num], tmp, sizeof(*tmp) * ret);
+	data->regulators_num += ret;
+
+	return ret;
+}
+
+static void i2c_of_probe_free_regulators(struct i2c_of_probe_data *data)
+{
+	regulator_bulk_free(data->regulators_num, data->regulators);
+	data->regulators_num = 0;
+	data->regulators = NULL;
+}
+
+static void i2c_of_probe_free_res(struct i2c_of_probe_data *data)
+{
+	i2c_of_probe_free_regulators(data);
+}
+
+static int i2c_of_probe_get_res(struct device *dev, struct device_node *node,
+				struct i2c_of_probe_data *data)
+{
+	struct property *prop;
+	int ret;
+
+	ret = i2c_of_probe_get_regulators(dev, node, data);
+	if (ret < 0) {
+		dev_err_probe(dev, ret, "Failed to get regulator supplies from %pOF\n", node);
+		goto err_cleanup;
+	}
+
+	return 0;
+
+err_cleanup:
+	i2c_of_probe_free_res(data);
+	return ret;
+}
+
+static int i2c_of_probe_enable_regulators(struct device *dev, struct i2c_of_probe_data *data)
+{
+	int ret;
+
+	dev_dbg(dev, "Enabling regulator supplies\n");
+
+	ret = regulator_bulk_enable(data->regulators_num, data->regulators);
+	if (ret)
+		return ret;
+
+	msleep(data->opts->post_power_on_delay_ms);
+
+	return 0;
+}
+
+static void i2c_of_probe_disable_regulators(struct i2c_of_probe_data *data)
+{
+	regulator_bulk_disable(data->regulators_num, data->regulators);
+}
+
+static int i2c_of_probe_enable_res(struct device *dev, struct i2c_of_probe_data *data)
+{
+	int ret;
+
+	ret = i2c_of_probe_enable_regulators(dev, data);
+	if (ret)
+		return ret;
+
+	return 0;
+}
+
 static struct device_node *i2c_of_probe_get_i2c_node(struct device *dev, const char *type)
 {
 	struct device_node *node __free(device_node) = of_find_node_by_name(NULL, type);
@@ -78,10 +188,17 @@ static int i2c_of_probe_enable_node(struct device *dev, struct device_node *node
 	return ret;
 }
 
+static const struct i2c_of_probe_opts i2c_of_probe_opts_default = {
+	/* largest post-power-on pre-reset-deassert delay seen among drivers */
+	.post_power_on_delay_ms = 500,
+};
+
 /**
  * i2c_of_probe_component() - probe for devices of "type" on the same i2c bus
  * @dev: &struct device of the caller, only used for dev_* printk messages
  * @type: a string to match the device node name prefix to probe for
+ * @opts: &struct i2c_of_probe_data containing tweakable options for the prober.
+ *	  Defaults are used if this is %NULL.
  *
  * Probe for possible I2C components of the same "type" on the same I2C bus
  * that have their status marked as "fail".
@@ -108,8 +225,9 @@ static int i2c_of_probe_enable_node(struct device *dev, struct device_node *node
  *         had multiple types of components to probe, and one of them down
  *         the list caused a deferred probe. This is expected behavior.
  */
-int i2c_of_probe_component(struct device *dev, const char *type)
+int i2c_of_probe_component(struct device *dev, const char *type, const struct i2c_of_probe_opts *opts)
 {
+	struct i2c_of_probe_data probe_data = { .opts = opts ?: &i2c_of_probe_opts_default };
 	struct i2c_adapter *i2c;
 	int ret;
 
@@ -117,9 +235,7 @@ int i2c_of_probe_component(struct device *dev, const char *type)
 	if (IS_ERR(i2c_node))
 		return PTR_ERR(i2c_node);
 
-	for_each_child_of_node_scoped(i2c_node, node) {
-		if (!of_node_name_prefix(node, type))
-			continue;
+	for_each_child_of_node_with_prefix_scoped(i2c_node, node, type) {
 		if (!of_device_is_available(node))
 			continue;
 
@@ -134,13 +250,33 @@ int i2c_of_probe_component(struct device *dev, const char *type)
 	if (!i2c)
 		return dev_err_probe(dev, -EPROBE_DEFER, "Couldn't get I2C adapter\n");
 
+	/* Grab resources */
+	for_each_child_of_node_with_prefix_scoped(i2c_node, node, type) {
+		u32 addr;
+
+		if (of_property_read_u32(node, "reg", &addr))
+			continue;
+
+		dev_dbg(dev, "Requesting resources for %pOF\n", node);
+		ret = i2c_of_probe_get_res(dev, node, &probe_data);
+		if (ret)
+			return ret;
+	}
+
+	dev_dbg(dev, "Resources: # of regulator supplies = %d\n", probe_data.regulators_num);
+
+	/* Enable resources */
+	ret = i2c_of_probe_enable_res(dev, &probe_data);
+	if (ret) {
+		i2c_of_probe_free_res(&probe_data);
+		return dev_err_probe(dev, ret, "Failed to enable resources\n");
+	}
+
 	ret = 0;
-	for_each_child_of_node_scoped(i2c_node, node) {
+	for_each_child_of_node_with_prefix_scoped(i2c_node, node, type) {
 		union i2c_smbus_data data;
 		u32 addr;
 
-		if (!of_node_name_prefix(node, type))
-			continue;
 		if (of_property_read_u32(node, "reg", &addr))
 			continue;
 		if (i2c_smbus_xfer(i2c, addr, 0, I2C_SMBUS_READ, 0, I2C_SMBUS_BYTE, &data) < 0)
@@ -151,6 +287,8 @@ int i2c_of_probe_component(struct device *dev, const char *type)
 		break;
 	}
 
+	i2c_of_probe_disable_regulators(&probe_data);
+	i2c_of_probe_free_res(&probe_data);
 	i2c_put_adapter(i2c);
 
 	return ret;
diff --git a/include/linux/i2c.h b/include/linux/i2c.h
index c6c16731243d..dbcdb8edbf6f 100644
--- a/include/linux/i2c.h
+++ b/include/linux/i2c.h
@@ -1034,7 +1034,15 @@ int of_i2c_get_board_info(struct device *dev, struct device_node *node,
 			  struct i2c_board_info *info);
 
 #if IS_ENABLED(CONFIG_OF_DYNAMIC)
-int i2c_of_probe_component(struct device *dev, const char *type);
+/**
+ * i2c_of_probe_opts - I2C OF component prober customization options
+ * @post_power_on_delay_us: Delay in ms after regulators are powered on. Passed to msleep().
+ */
+struct i2c_of_probe_opts {
+	unsigned int post_power_on_delay_ms;
+};
+
+int i2c_of_probe_component(struct device *dev, const char *type, const struct i2c_of_probe_opts *opts);
 #endif
 
 #else
-- 
2.46.0.469.g59c65b2a67-goog



From wenst at chromium.org  Wed Sep  4 02:00:12 2024
From: wenst at chromium.org (Chen-Yu Tsai)
Date: Wed,  4 Sep 2024 17:00:12 +0800
Subject: [PATCH v6 10/12] i2c: of-prober: Add GPIO support
In-Reply-To: <20240904090016.2841572-1-wenst@chromium.org>
References: <20240904090016.2841572-1-wenst@chromium.org>
Message-ID: <20240904090016.2841572-11-wenst@chromium.org>

This adds GPIO management to the I2C OF component prober.
Components that the prober intends to probe likely require their
regulator supplies be enabled, and GPIOs be toggled to enable them or
bring them out of reset before they will respond to probe attempts.
regulator support was added in the previous patch.

Without specific knowledge of each component's resource names or
power sequencing requirements, the prober can only enable the
regulator supplies all at once, and toggle the GPIOs all at once.
Luckily, reset pins tend to be active low, while enable pins tend to
be active high, so setting the raw status of all GPIO pins to high
should work. The wait time before and after resources are enabled
are collected from existing drivers and device trees.

The prober collects resources from all possible components and enables
them together, instead of enabling resources and probing each component
one by one. The latter approach does not provide any boot time benefits
over simply enabling each component and letting each driver probe
sequentially.

The prober will also deduplicate the resources, since on a component
swap out or co-layout design, the resources are always the same.
While duplicate regulator supplies won't cause much issue, shared
GPIOs don't work reliably, especially with other drivers. For the
same reason, the prober will release the GPIOs before the successfully
probed component is actually enabled.

Signed-off-by: Chen-Yu Tsai <wenst at chromium.org>

---
Changes since v5:
- Renamed "con" to "propname" in i2c_of_probe_get_gpiod()
- Copy string first and check return value of strscpy() for overflow in
  i2c_of_probe_get_gpiod()
- Add parenthesis around "enable" and "reset" GPIO names in comments
- Split resource count debug message into two separate lines
- Split out GPIO helper from i2c_of_probe_enable_res() to keep code
  cleaner following the previous patch
- Adopted options for customizing power sequencing delay following
  previous patch

Changes since v4:
- Split out from previous patch
- Moved GPIO property name check to common function in gpiolib.c in new
  patch
- Moved i2c_of_probe_free_gpios() into for_each_child_of_node_scoped()
- Rewrote in gpiod_*_array-esque fashion
---
 drivers/i2c/i2c-core-of-prober.c | 143 ++++++++++++++++++++++++++++++-
 include/linux/i2c.h              |   2 +
 2 files changed, 144 insertions(+), 1 deletion(-)

diff --git a/drivers/i2c/i2c-core-of-prober.c b/drivers/i2c/i2c-core-of-prober.c
index 56b06ad7aa64..04242ff86e69 100644
--- a/drivers/i2c/i2c-core-of-prober.c
+++ b/drivers/i2c/i2c-core-of-prober.c
@@ -5,16 +5,19 @@
  * Copyright (C) 2024 Google LLC
  */
 
+#include <linux/bitmap.h>
 #include <linux/cleanup.h>
 #include <linux/delay.h>
 #include <linux/device.h>
 #include <linux/dev_printk.h>
 #include <linux/err.h>
+#include <linux/gpio/consumer.h>
 #include <linux/i2c.h>
 #include <linux/module.h>
 #include <linux/of.h>
 #include <linux/regulator/consumer.h>
 #include <linux/slab.h>
+#include <linux/types.h>
 
 /*
  * Some devices, such as Google Hana Chromebooks, are produced by multiple
@@ -29,12 +32,14 @@
  * address responds.
  *
  * TODO:
- * - Support handling common GPIOs.
+ * - Support inverted polarity GPIOs, such as electrical high to "disable".
+ *   Seen on some OmniVision camera sensors.
  * - Support I2C muxes
  */
 
 struct i2c_of_probe_data {
 	const struct i2c_of_probe_opts *opts;
+	struct gpio_descs *gpiods;
 	struct regulator_bulk_data *regulators;
 	unsigned int regulators_num;
 };
@@ -85,10 +90,90 @@ static void i2c_of_probe_free_regulators(struct i2c_of_probe_data *data)
 	regulator_bulk_free(data->regulators_num, data->regulators);
 	data->regulators_num = 0;
 	data->regulators = NULL;
+};
+
+/*
+ * Returns 1 if property is GPIO and GPIO successfully requested,
+ * 0 if not a GPIO property, or error if request for GPIO failed.
+ */
+static int i2c_of_probe_get_gpiod(struct device_node *node, struct property *prop,
+				  struct i2c_of_probe_data *data)
+{
+	struct fwnode_handle *fwnode = of_fwnode_handle(node);
+	struct gpio_descs *gpiods;
+	struct gpio_desc *gpiod;
+	char propname[32]; /* 32 is max size of property name */
+	char *con_id = NULL;
+	size_t new_size;
+	int len, ret;
+
+	len = gpio_get_property_name_length(prop->name);
+	if (len < 0)
+		return 0;
+
+	ret = strscpy(propname, prop->name);
+	if (ret < 0) {
+		pr_err("%pOF: length of GPIO name \"%s\" exceeds current limit\n",
+		       node, prop->name);
+		return -EINVAL;
+	}
+
+	if (len > 0) {
+		/* "len < ARRAY_SIZE(propname)" guaranteed by strscpy() above */
+		propname[len] = '\0';
+		con_id = propname;
+	}
+
+	/*
+	 * GPIO descriptors are not reference counted. GPIOD_FLAGS_BIT_NONEXCLUSIVE
+	 * can't differentiate between GPIOs shared between devices to be probed and
+	 * other devices (which is incorrect). If the initial request fails with
+	 * -EBUSY, retry with GPIOD_FLAGS_BIT_NONEXCLUSIVE and see if it matches
+	 * any existing ones.
+	 */
+	gpiod = fwnode_gpiod_get_index(fwnode, con_id, 0, GPIOD_ASIS, "i2c-of-prober");
+	if (IS_ERR(gpiod)) {
+		if (PTR_ERR(gpiod) != -EBUSY || !data->gpiods)
+			return PTR_ERR(gpiod);
+
+		gpiod = fwnode_gpiod_get_index(fwnode, con_id, 0,
+					       GPIOD_ASIS | GPIOD_FLAGS_BIT_NONEXCLUSIVE,
+					       "i2c-of-prober");
+		for (unsigned int i = 0; i < data->gpiods->ndescs; i++)
+			if (gpiod == data->gpiods->desc[i])
+				return 1;
+
+		return -EBUSY;
+	}
+
+	new_size = struct_size(gpiods, desc, data->gpiods ? data->gpiods->ndescs + 1 : 1);
+	gpiods = krealloc(data->gpiods, new_size, GFP_KERNEL);
+	if (!gpiods) {
+		gpiod_put(gpiod);
+		return -ENOMEM;
+	}
+
+	data->gpiods = gpiods;
+	data->gpiods->desc[data->gpiods->ndescs++] = gpiod;
+
+	return 1;
+}
+
+/*
+ * This is split into two functions because in the normal flow the GPIOs
+ * have to be released before the actual driver probes so that the latter
+ * can acquire them.
+ */
+static void i2c_of_probe_free_gpios(struct i2c_of_probe_data *data)
+{
+	if (data->gpiods)
+		gpiod_put_array(data->gpiods);
+	data->gpiods = NULL;
 }
 
 static void i2c_of_probe_free_res(struct i2c_of_probe_data *data)
 {
+	i2c_of_probe_free_gpios(data);
 	i2c_of_probe_free_regulators(data);
 }
 
@@ -104,6 +189,18 @@ static int i2c_of_probe_get_res(struct device *dev, struct device_node *node,
 		goto err_cleanup;
 	}
 
+	for_each_property_of_node(node, prop) {
+		dev_dbg(dev, "Trying property %pOF/%s\n", node, prop->name);
+
+		/* GPIOs */
+		ret = i2c_of_probe_get_gpiod(node, prop, data);
+		if (ret < 0) {
+			dev_err_probe(dev, ret, "Failed to get GPIO from %pOF/%s\n",
+				      node, prop->name);
+			goto err_cleanup;
+		}
+	}
+
 	return 0;
 
 err_cleanup:
@@ -131,6 +228,37 @@ static void i2c_of_probe_disable_regulators(struct i2c_of_probe_data *data)
 	regulator_bulk_disable(data->regulators_num, data->regulators);
 }
 
+static int i2c_of_probe_set_gpios(struct device *dev, struct i2c_of_probe_data *data)
+{
+	int ret;
+	int gpio_i;
+
+	if (!data->gpiods)
+		return 0;
+
+	for (gpio_i = 0; gpio_i < data->gpiods->ndescs; gpio_i++) {
+		/*
+		 * "reset" GPIOs normally have opposite polarity compared to
+		 * "enable" GPIOs. Instead of parsing the flags again, simply
+		 * set the raw value to high.
+		 */
+		dev_dbg(dev, "Setting GPIO %d\n", gpio_i);
+		ret = gpiod_direction_output_raw(data->gpiods->desc[gpio_i], 1);
+		if (ret)
+			goto disable_gpios;
+	}
+
+	msleep(data->opts->post_reset_deassert_delay_ms);
+
+	return 0;
+
+disable_gpios:
+	for (gpio_i--; gpio_i >= 0; gpio_i--)
+		gpiod_set_raw_value_cansleep(data->gpiods->desc[gpio_i], 0);
+
+	return ret;
+}
+
 static int i2c_of_probe_enable_res(struct device *dev, struct i2c_of_probe_data *data)
 {
 	int ret;
@@ -139,7 +267,15 @@ static int i2c_of_probe_enable_res(struct device *dev, struct i2c_of_probe_data
 	if (ret)
 		return ret;
 
+	ret = i2c_of_probe_set_gpios(dev, data);
+	if (ret)
+		goto err_disable_regulators;
+
 	return 0;
+
+err_disable_regulators:
+	i2c_of_probe_disable_regulators(data);
+	return ret;
 }
 
 static struct device_node *i2c_of_probe_get_i2c_node(struct device *dev, const char *type)
@@ -191,6 +327,8 @@ static int i2c_of_probe_enable_node(struct device *dev, struct device_node *node
 static const struct i2c_of_probe_opts i2c_of_probe_opts_default = {
 	/* largest post-power-on pre-reset-deassert delay seen among drivers */
 	.post_power_on_delay_ms = 500,
+	/* largest post-reset-deassert delay seen in tree for Elan I2C HID */
+	.post_reset_deassert_delay_ms = 300,
 };
 
 /**
@@ -264,6 +402,8 @@ int i2c_of_probe_component(struct device *dev, const char *type, const struct i2
 	}
 
 	dev_dbg(dev, "Resources: # of regulator supplies = %d\n", probe_data.regulators_num);
+	dev_dbg(dev, "Resources: # of GPIOs = %d\n",
+		probe_data.gpiods ? probe_data.gpiods->ndescs : 0);
 
 	/* Enable resources */
 	ret = i2c_of_probe_enable_res(dev, &probe_data);
@@ -283,6 +423,7 @@ int i2c_of_probe_component(struct device *dev, const char *type, const struct i2
 			continue;
 
 		/* Found a device that is responding */
+		i2c_of_probe_free_gpios(&probe_data);
 		ret = i2c_of_probe_enable_node(dev, node);
 		break;
 	}
diff --git a/include/linux/i2c.h b/include/linux/i2c.h
index dbcdb8edbf6f..0da1edddb5a2 100644
--- a/include/linux/i2c.h
+++ b/include/linux/i2c.h
@@ -1037,9 +1037,11 @@ int of_i2c_get_board_info(struct device *dev, struct device_node *node,
 /**
  * i2c_of_probe_opts - I2C OF component prober customization options
  * @post_power_on_delay_us: Delay in ms after regulators are powered on. Passed to msleep().
+ * @post_reset_deassert_delay_ms: Delay in ms after GPIOs are set. Passed to msleep().
  */
 struct i2c_of_probe_opts {
 	unsigned int post_power_on_delay_ms;
+	unsigned int post_reset_deassert_delay_ms;
 };
 
 int i2c_of_probe_component(struct device *dev, const char *type, const struct i2c_of_probe_opts *opts);
-- 
2.46.0.469.g59c65b2a67-goog



From wenst at chromium.org  Wed Sep  4 02:00:13 2024
From: wenst at chromium.org (Chen-Yu Tsai)
Date: Wed,  4 Sep 2024 17:00:13 +0800
Subject: [PATCH v6 11/12] platform/chrome: Introduce device tree hardware prober
In-Reply-To: <20240904090016.2841572-1-wenst@chromium.org>
References: <20240904090016.2841572-1-wenst@chromium.org>
Message-ID: <20240904090016.2841572-12-wenst@chromium.org>

Some devices are designed and manufactured with some components having
multiple drop-in replacement options. These components are often
connected to the mainboard via ribbon cables, having the same signals
and pin assignments across all options. These may include the display
panel and touchscreen on laptops and tablets, and the trackpad on
laptops. Sometimes which component option is used in a particular device
can be detected by some firmware provided identifier, other times that
information is not available, and the kernel has to try to probe each
device.

This change attempts to make the "probe each device" case cleaner. The
current approach is to have all options added and enabled in the device
tree. The kernel would then bind each device and run each driver's probe
function. This works, but has been broken before due to the introduction
of asynchronous probing, causing multiple instances requesting "shared"
resources, such as pinmuxes, GPIO pins, interrupt lines, at the same
time, with only one instance succeeding. Work arounds for these include
moving the pinmux to the parent I2C controller, using GPIO hogs or
pinmux settings to keep the GPIO pins in some fixed configuration, and
requesting the interrupt line very late. Such configurations can be seen
on the MT8183 Krane Chromebook tablets, and the Qualcomm sc8280xp-based
Lenovo Thinkpad 13S.

Instead of this delicate dance between drivers and device tree quirks,
this change introduces a simple I2C component prober. For any given
class of devices on the same I2C bus, it will go through all of them,
doing a simple I2C read transfer and see which one of them responds.
It will then enable the device that responds.

This requires some minor modifications in the existing device tree.
The status for all the device nodes for the component options must be
set to "failed-needs-probe". This makes it clear that some mechanism is
needed to enable one of them, and also prevents the prober and device
drivers running at the same time.

Signed-off-by: Chen-Yu Tsai <wenst at chromium.org>
---
Changes since v5:
- Adapt to new i2c_of_probe_component() parameters

Changes since v4:
- Fix Kconfig dependency
- Update copyright year
- Drop "linux/of.h" header
- Include "linux/errno.h"
- Move |int ret| declaration to top of block
- Return -ENODEV on no match instead of 0
- Unregister platform driver and device unconditionally after previous
  change

Changes since v3:
- Include linux/init.h
- Rewrite for loop in driver probe function as suggested by Andy
- Make prober driver buildable as module
- Ignore prober errors other than probe deferral

Changes since v2:
- Addressed Rob's comments
  - Move remaining driver code to drivers/platform/chrome/
  - Depend on rather than select CONFIG_I2C
  - Copy machine check to driver init function
- Addressed Andy's comments
  - Explicitly mention "device tree" or OF in driver name, description
    and Kconfig symbol
  - Drop filename from inside the file
  - Switch to passing "struct device *" to shorten lines
  - Move "ret = 0" to just before for_each_child_of_node(i2c_node, node)
  - Make loop variable size_t (instead of unsigned int as Andy asked)
  - Use PLATFORM_DEVID_NONE instead of raw -1
  - Use standard goto error path pattern in hw_prober_driver_init()

- Changes since v1:
  - New patch
---
 drivers/platform/chrome/Kconfig               |  11 ++
 drivers/platform/chrome/Makefile              |   1 +
 .../platform/chrome/chromeos_of_hw_prober.c   | 104 ++++++++++++++++++
 3 files changed, 116 insertions(+)
 create mode 100644 drivers/platform/chrome/chromeos_of_hw_prober.c

diff --git a/drivers/platform/chrome/Kconfig b/drivers/platform/chrome/Kconfig
index 7dbeb786352a..b7dbaf77b6db 100644
--- a/drivers/platform/chrome/Kconfig
+++ b/drivers/platform/chrome/Kconfig
@@ -61,6 +61,17 @@ config CHROMEOS_TBMC
 	  To compile this driver as a module, choose M here: the
 	  module will be called chromeos_tbmc.
 
+config CHROMEOS_OF_HW_PROBER
+	tristate "ChromeOS Device Tree Hardware Prober"
+	depends on OF
+	depends on I2C
+	select OF_DYNAMIC
+	default OF
+	help
+	  This option enables the device tree hardware prober for ChromeOS
+	  devices. The driver will probe the correct component variant in
+	  devices that have multiple drop-in options for one component.
+
 config CROS_EC
 	tristate "ChromeOS Embedded Controller"
 	select CROS_EC_PROTO
diff --git a/drivers/platform/chrome/Makefile b/drivers/platform/chrome/Makefile
index 2dcc6ccc2302..21a9d5047053 100644
--- a/drivers/platform/chrome/Makefile
+++ b/drivers/platform/chrome/Makefile
@@ -8,6 +8,7 @@ obj-$(CONFIG_CHROMEOS_ACPI)		+= chromeos_acpi.o
 obj-$(CONFIG_CHROMEOS_LAPTOP)		+= chromeos_laptop.o
 obj-$(CONFIG_CHROMEOS_PRIVACY_SCREEN)	+= chromeos_privacy_screen.o
 obj-$(CONFIG_CHROMEOS_PSTORE)		+= chromeos_pstore.o
+obj-$(CONFIG_CHROMEOS_OF_HW_PROBER)	+= chromeos_of_hw_prober.o
 obj-$(CONFIG_CHROMEOS_TBMC)		+= chromeos_tbmc.o
 obj-$(CONFIG_CROS_EC)			+= cros_ec.o
 obj-$(CONFIG_CROS_EC_I2C)		+= cros_ec_i2c.o
diff --git a/drivers/platform/chrome/chromeos_of_hw_prober.c b/drivers/platform/chrome/chromeos_of_hw_prober.c
new file mode 100644
index 000000000000..90fc1de16788
--- /dev/null
+++ b/drivers/platform/chrome/chromeos_of_hw_prober.c
@@ -0,0 +1,104 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * ChromeOS Device Tree Hardware Prober
+ *
+ * Copyright (c) 2024 Google LLC
+ */
+
+#include <linux/array_size.h>
+#include <linux/errno.h>
+#include <linux/i2c.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+
+#define DRV_NAME	"chromeos_of_hw_prober"
+
+/**
+ * struct hw_prober_entry - Holds an entry for the hardware prober
+ *
+ * @compatible:	compatible string to match against the machine
+ * @prober:	prober function to call when machine matches
+ * @data:	extra data for the prober function
+ */
+struct hw_prober_entry {
+	const char *compatible;
+	int (*prober)(struct device *dev, const void *data);
+	const void *data;
+};
+
+static int chromeos_i2c_component_prober(struct device *dev, const void *data)
+{
+	const char *type = data;
+
+	return i2c_of_probe_component(dev, type, NULL);
+}
+
+static const struct hw_prober_entry hw_prober_platforms[] = {
+	{ .compatible = "google,hana", .prober = chromeos_i2c_component_prober, .data = "touchscreen" },
+	{ .compatible = "google,hana", .prober = chromeos_i2c_component_prober, .data = "trackpad" },
+};
+
+static int chromeos_of_hw_prober_probe(struct platform_device *pdev)
+{
+	for (size_t i = 0; i < ARRAY_SIZE(hw_prober_platforms); i++) {
+		int ret;
+
+		if (!of_machine_is_compatible(hw_prober_platforms[i].compatible))
+			continue;
+
+		ret = hw_prober_platforms[i].prober(&pdev->dev, hw_prober_platforms[i].data);
+		/* Ignore unrecoverable errors and keep going through other probers */
+		if (ret == -EPROBE_DEFER)
+			return ret;
+	}
+
+	return 0;
+}
+
+static struct platform_driver chromeos_of_hw_prober_driver = {
+	.probe	= chromeos_of_hw_prober_probe,
+	.driver	= {
+		.name = DRV_NAME,
+	},
+};
+
+static struct platform_device *chromeos_of_hw_prober_pdev;
+
+static int chromeos_of_hw_prober_driver_init(void)
+{
+	size_t i;
+	int ret;
+
+	for (i = 0; i < ARRAY_SIZE(hw_prober_platforms); i++)
+		if (of_machine_is_compatible(hw_prober_platforms[i].compatible))
+			break;
+	if (i == ARRAY_SIZE(hw_prober_platforms))
+		return -ENODEV;
+
+	ret = platform_driver_register(&chromeos_of_hw_prober_driver);
+	if (ret)
+		return ret;
+
+	chromeos_of_hw_prober_pdev =
+			platform_device_register_simple(DRV_NAME, PLATFORM_DEVID_NONE, NULL, 0);
+	if (IS_ERR(chromeos_of_hw_prober_pdev))
+		goto err;
+
+	return 0;
+
+err:
+	platform_driver_unregister(&chromeos_of_hw_prober_driver);
+
+	return PTR_ERR(chromeos_of_hw_prober_pdev);
+}
+module_init(chromeos_of_hw_prober_driver_init);
+
+static void chromeos_of_hw_prober_driver_exit(void)
+{
+	platform_device_unregister(chromeos_of_hw_prober_pdev);
+	platform_driver_unregister(&chromeos_of_hw_prober_driver);
+}
+module_exit(chromeos_of_hw_prober_driver_exit);
+
+MODULE_LICENSE("GPL");
+MODULE_DESCRIPTION("ChromeOS device tree hardware prober");
-- 
2.46.0.469.g59c65b2a67-goog



From wenst at chromium.org  Wed Sep  4 02:00:14 2024
From: wenst at chromium.org (Chen-Yu Tsai)
Date: Wed,  4 Sep 2024 17:00:14 +0800
Subject: [PATCH v6 12/12] arm64: dts: mediatek: mt8173-elm-hana: Mark touchscreens and trackpads as fail
In-Reply-To: <20240904090016.2841572-1-wenst@chromium.org>
References: <20240904090016.2841572-1-wenst@chromium.org>
Message-ID: <20240904090016.2841572-13-wenst@chromium.org>

Instead of having them all available, mark them all as "fail-needs-probe"
and have the implementation try to probe which one is present.

Also remove the shared resource workaround by moving the pinctrl entry
for the trackpad interrupt line back into the individual trackpad nodes.

Signed-off-by: Chen-Yu Tsai <wenst at chromium.org>
---
Changes since v4:
- Rebased

Changes since v3:
- Also remove second source workaround, i.e. move the interrupt line
  pinctrl entry from the i2c node back to the components.

Changes since v2:
- Drop class from status
---
 arch/arm64/boot/dts/mediatek/mt8173-elm-hana.dtsi | 13 +++++++++++++
 arch/arm64/boot/dts/mediatek/mt8173-elm.dtsi      |  4 ++--
 2 files changed, 15 insertions(+), 2 deletions(-)

diff --git a/arch/arm64/boot/dts/mediatek/mt8173-elm-hana.dtsi b/arch/arm64/boot/dts/mediatek/mt8173-elm-hana.dtsi
index 8d1cbc92bce3..251e084bf7de 100644
--- a/arch/arm64/boot/dts/mediatek/mt8173-elm-hana.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8173-elm-hana.dtsi
@@ -14,6 +14,7 @@ touchscreen2: touchscreen at 34 {
 		compatible = "melfas,mip4_ts";
 		reg = <0x34>;
 		interrupts-extended = <&pio 88 IRQ_TYPE_LEVEL_LOW>;
+		status = "fail-needs-probe";
 	};
 
 	/*
@@ -26,6 +27,7 @@ touchscreen3: touchscreen at 20 {
 		reg = <0x20>;
 		hid-descr-addr = <0x0020>;
 		interrupts-extended = <&pio 88 IRQ_TYPE_LEVEL_LOW>;
+		status = "fail-needs-probe";
 	};
 
 	/* Lenovo Ideapad C330 uses G2Touch touchscreen as a 2nd source touchscreen */
@@ -47,9 +49,12 @@ &i2c4 {
 	trackpad2: trackpad at 2c {
 		compatible = "hid-over-i2c";
 		interrupts-extended = <&pio 117 IRQ_TYPE_LEVEL_LOW>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&trackpad_irq>;
 		reg = <0x2c>;
 		hid-descr-addr = <0x0020>;
 		wakeup-source;
+		status = "fail-needs-probe";
 	};
 };
 
@@ -74,3 +79,11 @@ pins_wp {
 		};
 	};
 };
+
+&touchscreen {
+	status = "fail-needs-probe";
+};
+
+&trackpad {
+	status = "fail-needs-probe";
+};
diff --git a/arch/arm64/boot/dts/mediatek/mt8173-elm.dtsi b/arch/arm64/boot/dts/mediatek/mt8173-elm.dtsi
index b4d85147b77b..eee64461421f 100644
--- a/arch/arm64/boot/dts/mediatek/mt8173-elm.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8173-elm.dtsi
@@ -358,12 +358,12 @@ touchscreen: touchscreen at 10 {
 &i2c4 {
 	clock-frequency = <400000>;
 	status = "okay";
-	pinctrl-names = "default";
-	pinctrl-0 = <&trackpad_irq>;
 
 	trackpad: trackpad at 15 {
 		compatible = "elan,ekth3000";
 		interrupts-extended = <&pio 117 IRQ_TYPE_LEVEL_LOW>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&trackpad_irq>;
 		reg = <0x15>;
 		vcc-supply = <&mt6397_vgp6_reg>;
 		wakeup-source;
-- 
2.46.0.469.g59c65b2a67-goog



From daniel at makrotopia.org  Wed Sep  4 02:02:11 2024
From: daniel at makrotopia.org (Daniel Golle)
Date: Wed, 4 Sep 2024 11:02:11 +0200
Subject: [PATCH net-next v10 11/13] net: phy: add driver for built-in
 2.5G ethernet PHY on MT7988
In-Reply-To: <38189661f30032715783e8860318fe9e50258e47.camel@mediatek.com>
References: <20240701105417.19941-1-SkyLake.Huang@mediatek.com>
 <20240701105417.19941-12-SkyLake.Huang@mediatek.com>
 <ebeb75a3-a6b1-46b3-b1e8-7d8448eb23f6@lunn.ch>
 <c21fe0db83dd665d4725ffedc51db9063dbe2f3d.camel@mediatek.com>
 <38189661f30032715783e8860318fe9e50258e47.camel@mediatek.com>
Message-ID: <ZtgiE64iusrjPKSp@pidgin.makrotopia.org>

Hi SkyLake,


On Wed, Sep 04, 2024 at 08:49:50AM +0000, SkyLake Huang (???) wrote:
> 
> Gentle ping.
>

Please see issue reported related to your patch
"net: phy: mediatek: Extend 1G TX/RX link pulse time"

https://github.com/openwrt/openwrt/issues/16281

Using the newly introduced .read_status function apparently breaks things.

Maybe we can apply the rest of this series first and then discuss the
problematic patch (which may need fixing) after that.



From mingyen.hsieh at mediatek.com  Wed Sep  4 02:17:49 2024
From: mingyen.hsieh at mediatek.com (Mingyen Hsieh)
Date: Wed, 4 Sep 2024 17:17:49 +0800
Subject: [PATCH v4] wifi: mac80211: introduce EHT rate support in AQL airtime
Message-ID: <20240904091749.7311-1-mingyen.hsieh@mediatek.com>

From: Ming Yen Hsieh <mingyen.hsieh at mediatek.com>

Add definitions related to EHT mode and airtime calculation
according to the 802.11BE_D4.0.

Co-developed-by: Bo Jiao <Bo.Jiao at mediatek.com>
Signed-off-by: Bo Jiao <Bo.Jiao at mediatek.com>
Signed-off-by: Deren Wu <deren.wu at mediatek.com>
Signed-off-by: Quan Zhou <quan.zhou at mediatek.com>
Signed-off-by: Ming Yen Hsieh <MingYen.Hsieh at mediatek.com>
---
v2:
 - add BW_320 support in ieee80211_get_rate_duration().
 - rewrite the existing WARN_ON for property stream condition.
v3:
 - add a macro EHT_GROUP_RANGE() to reduce the line which repetitive the EHT_GROUP().
 - to comply with the current use of EHT streams, the WARN_ON check has been modified
   to be consistent with HE. 
v4:
 - change IEEE80211_EHT_MAX_STREAMS 16 to 8.
---
 net/mac80211/airtime.c | 130 +++++++++++++++++++++++++++++++++++++++--
 1 file changed, 125 insertions(+), 5 deletions(-)

diff --git a/net/mac80211/airtime.c b/net/mac80211/airtime.c
index fdf8b658fede..c36b48d36b03 100644
--- a/net/mac80211/airtime.c
+++ b/net/mac80211/airtime.c
@@ -55,10 +55,21 @@
 #define HE_DURATION_S(shift, streams, gi, bps)		\
 	(HE_DURATION(streams, gi, bps) >> shift)
 
+/* gi in HE/EHT is identical. It matches enum nl80211_eht_gi as well */
+#define EHT_GI_08 HE_GI_08
+#define EHT_GI_16 HE_GI_16
+#define EHT_GI_32 HE_GI_32
+
+#define EHT_DURATION(streams, gi, bps)			\
+	HE_DURATION(streams, gi, bps)
+#define EHT_DURATION_S(shift, streams, gi, bps)		\
+	HE_DURATION_S(shift, streams, gi, bps)
+
 #define BW_20			0
 #define BW_40			1
 #define BW_80			2
 #define BW_160			3
+#define BW_320			4
 
 /*
  * Define group sort order: HT40 -> SGI -> #streams
@@ -68,17 +79,26 @@
 #define IEEE80211_VHT_STREAM_GROUPS	8 /* BW(=4) * SGI(=2) */
 
 #define IEEE80211_HE_MAX_STREAMS	8
+#define IEEE80211_HE_STREAM_GROUPS	12 /* BW(=4) * GI(=3) */
+
+#define IEEE80211_EHT_MAX_STREAMS	8
+#define IEEE80211_EHT_STREAM_GROUPS	15 /* BW(=5) * GI(=3) */
 
 #define IEEE80211_HT_GROUPS_NB	(IEEE80211_MAX_STREAMS *	\
 				 IEEE80211_HT_STREAM_GROUPS)
 #define IEEE80211_VHT_GROUPS_NB	(IEEE80211_MAX_STREAMS *	\
 					 IEEE80211_VHT_STREAM_GROUPS)
+#define IEEE80211_HE_GROUPS_NB	(IEEE80211_HE_MAX_STREAMS *	\
+				 IEEE80211_HE_STREAM_GROUPS)
+#define IEEE80211_EHT_GROUPS_NB	(IEEE80211_EHT_MAX_STREAMS *	\
+				 IEEE80211_EHT_STREAM_GROUPS)
 
 #define IEEE80211_HT_GROUP_0	0
 #define IEEE80211_VHT_GROUP_0	(IEEE80211_HT_GROUP_0 + IEEE80211_HT_GROUPS_NB)
 #define IEEE80211_HE_GROUP_0	(IEEE80211_VHT_GROUP_0 + IEEE80211_VHT_GROUPS_NB)
+#define IEEE80211_EHT_GROUP_0	(IEEE80211_HE_GROUP_0 + IEEE80211_HE_GROUPS_NB)
 
-#define MCS_GROUP_RATES		12
+#define MCS_GROUP_RATES		14
 
 #define HT_GROUP_IDX(_streams, _sgi, _ht40)	\
 	IEEE80211_HT_GROUP_0 +			\
@@ -203,6 +223,69 @@
 #define HE_GROUP(_streams, _gi, _bw)					\
 	__HE_GROUP(_streams, _gi, _bw,				\
 		   HE_GROUP_SHIFT(_streams, _gi, _bw))
+
+#define EHT_BW2VBPS(_bw, r5, r4, r3, r2, r1)					\
+	((_bw) == BW_320 ? r5 : BW2VBPS(_bw, r4, r3, r2, r1))
+
+#define EHT_GROUP_IDX(_streams, _gi, _bw)				\
+	(IEEE80211_EHT_GROUP_0 +					\
+	 IEEE80211_EHT_MAX_STREAMS * 3 * (_bw) +			\
+	 IEEE80211_EHT_MAX_STREAMS * (_gi) +				\
+	 (_streams) - 1)
+
+#define __EHT_GROUP(_streams, _gi, _bw, _s)						\
+	[EHT_GROUP_IDX(_streams, _gi, _bw)] = {						\
+	.shift = _s,									\
+	.duration = {									\
+		EHT_DURATION_S(_s, _streams, _gi,					\
+			       EHT_BW2VBPS(_bw,  1960,   980,  490,  234,  117)),	\
+		EHT_DURATION_S(_s, _streams, _gi,					\
+			       EHT_BW2VBPS(_bw,  3920,  1960,  980,  468,  234)),	\
+		EHT_DURATION_S(_s, _streams, _gi,					\
+			       EHT_BW2VBPS(_bw,  5880,  2937, 1470,  702,  351)),	\
+		EHT_DURATION_S(_s, _streams, _gi,					\
+			       EHT_BW2VBPS(_bw,  7840,  3920, 1960,  936,  468)),	\
+		EHT_DURATION_S(_s, _streams, _gi,					\
+			       EHT_BW2VBPS(_bw, 11760,  5880, 2940, 1404,  702)),	\
+		EHT_DURATION_S(_s, _streams, _gi,					\
+			       EHT_BW2VBPS(_bw, 15680,  7840, 3920, 1872,  936)),	\
+		EHT_DURATION_S(_s, _streams, _gi,					\
+			       EHT_BW2VBPS(_bw, 17640,  8820, 4410, 2106, 1053)),	\
+		EHT_DURATION_S(_s, _streams, _gi,					\
+			       EHT_BW2VBPS(_bw, 19600,  9800, 4900, 2340, 1170)),	\
+		EHT_DURATION_S(_s, _streams, _gi,					\
+			       EHT_BW2VBPS(_bw, 23520, 11760, 5880, 2808, 1404)),	\
+		EHT_DURATION_S(_s, _streams, _gi,					\
+			       EHT_BW2VBPS(_bw, 26133, 13066, 6533, 3120, 1560)),	\
+		EHT_DURATION_S(_s, _streams, _gi,					\
+			       EHT_BW2VBPS(_bw, 29400, 14700, 7350, 3510, 1755)),	\
+		EHT_DURATION_S(_s, _streams, _gi,					\
+			       EHT_BW2VBPS(_bw, 32666, 16333, 8166, 3900, 1950)),	\
+		EHT_DURATION_S(_s, _streams, _gi,					\
+			       EHT_BW2VBPS(_bw, 35280, 17640, 8820, 4212, 2106)),	\
+		EHT_DURATION_S(_s, _streams, _gi,					\
+			       EHT_BW2VBPS(_bw, 39200, 19600, 9800, 4680, 2340))	\
+		}									\
+}
+
+#define EHT_GROUP_SHIFT(_streams, _gi, _bw)						\
+	GROUP_SHIFT(EHT_DURATION(_streams, _gi,						\
+				 EHT_BW2VBPS(_bw, 1960, 980, 490, 234, 117)))
+
+#define EHT_GROUP(_streams, _gi, _bw)					\
+	__EHT_GROUP(_streams, _gi, _bw,				\
+		   EHT_GROUP_SHIFT(_streams, _gi, _bw))
+
+#define EHT_GROUP_RANGE(_gi, _bw)	\
+	EHT_GROUP(1, _gi, _bw),		\
+	EHT_GROUP(2, _gi, _bw),		\
+	EHT_GROUP(3, _gi, _bw),		\
+	EHT_GROUP(4, _gi, _bw),		\
+	EHT_GROUP(5, _gi, _bw),		\
+	EHT_GROUP(6, _gi, _bw),		\
+	EHT_GROUP(7, _gi, _bw),		\
+	EHT_GROUP(8, _gi, _bw)
+
 struct mcs_group {
 	u8 shift;
 	u16 duration[MCS_GROUP_RATES];
@@ -376,6 +459,26 @@ static const struct mcs_group airtime_mcs_groups[] = {
 	HE_GROUP(6, HE_GI_32, BW_160),
 	HE_GROUP(7, HE_GI_32, BW_160),
 	HE_GROUP(8, HE_GI_32, BW_160),
+
+	EHT_GROUP_RANGE(EHT_GI_08, BW_20),
+	EHT_GROUP_RANGE(EHT_GI_16, BW_20),
+	EHT_GROUP_RANGE(EHT_GI_32, BW_20),
+
+	EHT_GROUP_RANGE(EHT_GI_08, BW_40),
+	EHT_GROUP_RANGE(EHT_GI_16, BW_40),
+	EHT_GROUP_RANGE(EHT_GI_32, BW_40),
+
+	EHT_GROUP_RANGE(EHT_GI_08, BW_80),
+	EHT_GROUP_RANGE(EHT_GI_16, BW_80),
+	EHT_GROUP_RANGE(EHT_GI_32, BW_80),
+
+	EHT_GROUP_RANGE(EHT_GI_08, BW_160),
+	EHT_GROUP_RANGE(EHT_GI_16, BW_160),
+	EHT_GROUP_RANGE(EHT_GI_32, BW_160),
+
+	EHT_GROUP_RANGE(EHT_GI_08, BW_320),
+	EHT_GROUP_RANGE(EHT_GI_16, BW_320),
+	EHT_GROUP_RANGE(EHT_GI_32, BW_320),
 };
 
 static u32
@@ -422,6 +525,9 @@ static u32 ieee80211_get_rate_duration(struct ieee80211_hw *hw,
 	case RATE_INFO_BW_160:
 		bw = BW_160;
 		break;
+	case RATE_INFO_BW_320:
+		bw = BW_320;
+		break;
 	default:
 		WARN_ON_ONCE(1);
 		return 0;
@@ -443,13 +549,18 @@ static u32 ieee80211_get_rate_duration(struct ieee80211_hw *hw,
 		idx = status->rate_idx;
 		group = HE_GROUP_IDX(streams, status->he_gi, bw);
 		break;
+	case RX_ENC_EHT:
+		streams = status->nss;
+		idx = status->rate_idx;
+		group = EHT_GROUP_IDX(streams, status->eht.gi, bw);
+		break;
 	default:
 		WARN_ON_ONCE(1);
 		return 0;
 	}
 
-	if (WARN_ON_ONCE((status->encoding != RX_ENC_HE && streams > 4) ||
-			 (status->encoding == RX_ENC_HE && streams > 8)))
+	if (WARN_ON_ONCE((status->encoding > RX_ENC_HE && streams > 8) ||
+			 (status->encoding < RX_ENC_HE && streams > 4)))
 		return 0;
 
 	if (idx >= MCS_GROUP_RATES)
@@ -517,7 +628,9 @@ static bool ieee80211_fill_rate_info(struct ieee80211_hw *hw,
 	stat->nss = ri->nss;
 	stat->rate_idx = ri->mcs;
 
-	if (ri->flags & RATE_INFO_FLAGS_HE_MCS)
+	if (ri->flags & RATE_INFO_FLAGS_EHT_MCS)
+		stat->encoding = RX_ENC_EHT;
+	else if (ri->flags & RATE_INFO_FLAGS_HE_MCS)
 		stat->encoding = RX_ENC_HE;
 	else if (ri->flags & RATE_INFO_FLAGS_VHT_MCS)
 		stat->encoding = RX_ENC_VHT;
@@ -529,7 +642,14 @@ static bool ieee80211_fill_rate_info(struct ieee80211_hw *hw,
 	if (ri->flags & RATE_INFO_FLAGS_SHORT_GI)
 		stat->enc_flags |= RX_ENC_FLAG_SHORT_GI;
 
-	stat->he_gi = ri->he_gi;
+	switch (stat->encoding) {
+	case RX_ENC_EHT:
+		stat->eht.gi = ri->eht_gi;
+		break;
+	default:
+		stat->he_gi = ri->he_gi;
+		break;
+	}
 
 	if (stat->encoding != RX_ENC_LEGACY)
 		return true;
-- 
2.45.2



From johannes at sipsolutions.net  Wed Sep  4 02:29:55 2024
From: johannes at sipsolutions.net (Johannes Berg)
Date: Wed, 04 Sep 2024 11:29:55 +0200
Subject: [PATCH v4] wifi: mac80211: introduce EHT rate support in AQL
 airtime
In-Reply-To: <20240904091749.7311-1-mingyen.hsieh@mediatek.com>
References: <20240904091749.7311-1-mingyen.hsieh@mediatek.com>
Message-ID: <df96a65701b5c72d78805b7f7c518670ae794f2b.camel@sipsolutions.net>

On Wed, 2024-09-04 at 17:17 +0800, Mingyen Hsieh wrote:
> 
> @@ -443,13 +549,18 @@ static u32 ieee80211_get_rate_duration(struct ieee80211_hw *hw,
>  		idx = status->rate_idx;
>  		group = HE_GROUP_IDX(streams, status->he_gi, bw);
>  		break;
> +	case RX_ENC_EHT:
> +		streams = status->nss;
> +		idx = status->rate_idx;
> +		group = EHT_GROUP_IDX(streams, status->eht.gi, bw);
> +		break;
>  	default:
>  		WARN_ON_ONCE(1);
>  		return 0;
>  	}
>  
> -	if (WARN_ON_ONCE((status->encoding != RX_ENC_HE && streams > 4) ||
> -			 (status->encoding == RX_ENC_HE && streams > 8)))
> +	if (WARN_ON_ONCE((status->encoding > RX_ENC_HE && streams > 8) ||

That should've been >=, but I feel like it might be better to move the
warning as multiple warnings into the switch statement now? The > and <
here also makes it vulnerable to reordering, which is probably not going
to happen, but why put the trap here?

johannes


From jens.wiklander at linaro.org  Wed Sep  4 02:44:33 2024
From: jens.wiklander at linaro.org (Jens Wiklander)
Date: Wed, 4 Sep 2024 11:44:33 +0200
Subject: [RFC PATCH 4/4] dma-buf: heaps: add Linaro restricted dmabuf heap support
In-Reply-To: <CABdmKX2KzswmiDY4oWw69_rPWs8d_Cqp7OXouSeMQaYX1SDSmw@mail.gmail.com>
References: <20240830070351.2855919-1-jens.wiklander@linaro.org>
 <20240830070351.2855919-5-jens.wiklander@linaro.org> <CABdmKX2KzswmiDY4oWw69_rPWs8d_Cqp7OXouSeMQaYX1SDSmw@mail.gmail.com>
Message-ID: <CAHUa44FYYFVQWf0DGUXNHoOVQEC0-HRyYa0386dHNjo4y1qSiQ@mail.gmail.com>

On Tue, Sep 3, 2024 at 7:50?PM T.J. Mercier <tjmercier at google.com> wrote:
>
> On Fri, Aug 30, 2024 at 12:04?AM Jens Wiklander
> <jens.wiklander at linaro.org> wrote:
> >
> > Add a Linaro restricted heap using the linaro,restricted-heap bindings
> > implemented based on the generic restricted heap.
> >
> > The bindings defines a range of physical restricted memory. The heap
> > manages this address range using genalloc. The allocated dma-buf file
> > descriptor can later be registered with the TEE subsystem for later use
> > via Trusted Applications in the secure world.
> >
> > Co-developed-by: Olivier Masse <olivier.masse at nxp.com>
> > Signed-off-by: Olivier Masse <olivier.masse at nxp.com>
> > Signed-off-by: Jens Wiklander <jens.wiklander at linaro.org>
> > ---
> >  drivers/dma-buf/heaps/Kconfig                 |  10 ++
> >  drivers/dma-buf/heaps/Makefile                |   1 +
> >  .../dma-buf/heaps/restricted_heap_linaro.c    | 165 ++++++++++++++++++
> >  3 files changed, 176 insertions(+)
> >  create mode 100644 drivers/dma-buf/heaps/restricted_heap_linaro.c
> >
> > diff --git a/drivers/dma-buf/heaps/Kconfig b/drivers/dma-buf/heaps/Kconfig
> > index 58903bc62ac8..82e2c5d09242 100644
> > --- a/drivers/dma-buf/heaps/Kconfig
> > +++ b/drivers/dma-buf/heaps/Kconfig
> > @@ -28,3 +28,13 @@ config DMABUF_HEAPS_RESTRICTED_MTK
> >         help
> >           Enable restricted dma-buf heaps for MediaTek platform. This heap is backed by
> >           TEE client interfaces. If in doubt, say N.
> > +
> > +config DMABUF_HEAPS_RESTRICTED_LINARO
> > +       bool "Linaro DMA-BUF Restricted Heap"
> > +       depends on DMABUF_HEAPS_RESTRICTED
> > +       help
> > +         Choose this option to enable the Linaro restricted dma-buf heap.
> > +         The restricted heap pools are defined according to the DT. Heaps
> > +         are allocated in the pools using gen allocater.
> > +         If in doubt, say N.
> > +
> > diff --git a/drivers/dma-buf/heaps/Makefile b/drivers/dma-buf/heaps/Makefile
> > index 0028aa9d875f..66b2f67c47b5 100644
> > --- a/drivers/dma-buf/heaps/Makefile
> > +++ b/drivers/dma-buf/heaps/Makefile
> > @@ -2,4 +2,5 @@
> >  obj-$(CONFIG_DMABUF_HEAPS_CMA)         += cma_heap.o
> >  obj-$(CONFIG_DMABUF_HEAPS_RESTRICTED)  += restricted_heap.o
> >  obj-$(CONFIG_DMABUF_HEAPS_RESTRICTED_MTK)      += restricted_heap_mtk.o
> > +obj-$(CONFIG_DMABUF_HEAPS_RESTRICTED_LINARO)   += restricted_heap_linaro.o
> >  obj-$(CONFIG_DMABUF_HEAPS_SYSTEM)      += system_heap.o
> > diff --git a/drivers/dma-buf/heaps/restricted_heap_linaro.c b/drivers/dma-buf/heaps/restricted_heap_linaro.c
> > new file mode 100644
> > index 000000000000..4b08ed514023
> > --- /dev/null
> > +++ b/drivers/dma-buf/heaps/restricted_heap_linaro.c
> > @@ -0,0 +1,165 @@
> > +// SPDX-License-Identifier: GPL-2.0
> > +/*
> > + * DMABUF secure heap exporter
> > + *
> > + * Copyright 2021 NXP.
> > + * Copyright 2024 Linaro Limited.
> > + */
> > +
> > +#define pr_fmt(fmt)     "rheap_linaro: " fmt
> > +
> > +#include <linux/dma-buf.h>
> > +#include <linux/err.h>
> > +#include <linux/genalloc.h>
> > +#include <linux/module.h>
> > +#include <linux/of.h>
> > +#include <linux/of_fdt.h>
> > +#include <linux/of_reserved_mem.h>
> > +#include <linux/scatterlist.h>
> > +#include <linux/slab.h>
> > +
> > +#include "restricted_heap.h"
> > +
> > +#define MAX_HEAP_COUNT 2
>
> Are multiple supported because of what Cyrille mentioned here about permissions?
> https://lore.kernel.org/lkml/DBBPR04MB7514E006455AEA407041E4F788709 at DBBPR04MB7514.eurprd04.prod.outlook.com/

Yes, I kept that as is.

>
> So this is just some arbitrary limit? I'd prefer to have some sort of
> documentation about this.

How about removing the limit and using dynamic allocation instead?

Thanks,
Jens

>
>
> > +#define HEAP_NAME_LEN  32
> > +
> > +struct resmem_restricted {
> > +       phys_addr_t base;
> > +       phys_addr_t size;
> > +
> > +       char name[HEAP_NAME_LEN];
> > +
> > +       bool no_map;
> > +};
> > +
> > +static struct resmem_restricted restricted_data[MAX_HEAP_COUNT] = {0};
> > +static unsigned int restricted_data_count;
> > +
> > +static int linaro_restricted_memory_allocate(struct restricted_heap *heap,
> > +                                            struct restricted_buffer *buf)
> > +{
> > +       struct gen_pool *pool = heap->priv_data;
> > +       unsigned long pa;
> > +       int ret;
> > +
> > +       buf->size = ALIGN(buf->size, PAGE_SIZE);
> > +       pa = gen_pool_alloc(pool, buf->size);
> > +       if (!pa)
> > +               return -ENOMEM;
> > +
> > +       ret = sg_alloc_table(&buf->sg_table, 1, GFP_KERNEL);
> > +       if (ret) {
> > +               gen_pool_free(pool, pa, buf->size);
> > +               return ret;
> > +       }
> > +
> > +       sg_set_page(buf->sg_table.sgl, phys_to_page(pa), buf->size, 0);
> > +
> > +       return 0;
> > +}
> > +
> > +static void linaro_restricted_memory_free(struct restricted_heap *heap,
> > +                                         struct restricted_buffer *buf)
> > +{
> > +       struct gen_pool *pool = heap->priv_data;
> > +       struct scatterlist *sg;
> > +       unsigned int i;
> > +
> > +       for_each_sg(buf->sg_table.sgl, sg, buf->sg_table.nents, i)
> > +               gen_pool_free(pool, page_to_phys(sg_page(sg)), sg->length);
> > +       sg_free_table(&buf->sg_table);
> > +}
> > +
> > +static const struct restricted_heap_ops linaro_restricted_heap_ops = {
> > +       .alloc = linaro_restricted_memory_allocate,
> > +       .free = linaro_restricted_memory_free,
> > +};
> > +
> > +static int add_heap(struct resmem_restricted *mem)
> > +{
> > +       struct restricted_heap *heap;
> > +       struct gen_pool *pool;
> > +       int ret;
> > +
> > +       if (mem->base == 0 || mem->size == 0) {
> > +               pr_err("restricted_data base or size is not correct\n");
> > +               return -EINVAL;
> > +       }
> > +
> > +       heap = kzalloc(sizeof(*heap), GFP_KERNEL);
> > +       if (!heap)
> > +               return -ENOMEM;
> > +
> > +       pool = gen_pool_create(PAGE_SHIFT, -1);
> > +       if (!pool) {
> > +               ret = -ENOMEM;
> > +               goto err_free_heap;
> > +       }
> > +
> > +       ret = gen_pool_add(pool, mem->base, mem->size, -1);
> > +       if (ret)
> > +               goto err_free_pool;
> > +
> > +       heap->no_map = mem->no_map;
> > +       heap->priv_data = pool;
> > +       heap->name = mem->name;
> > +       heap->ops = &linaro_restricted_heap_ops;
> > +
> > +       ret = restricted_heap_add(heap);
> > +       if (ret)
> > +               goto err_free_pool;
> > +
> > +       return 0;
> > +
> > +err_free_pool:
> > +       gen_pool_destroy(pool);
> > +err_free_heap:
> > +       kfree(heap);
> > +
> > +       return ret;
> > +}
> > +
> > +static int __init rmem_restricted_heap_setup(struct reserved_mem *rmem)
> > +{
> > +       size_t len = HEAP_NAME_LEN;
> > +       const char *s;
> > +       bool no_map;
> > +
> > +       if (WARN_ONCE(restricted_data_count >= MAX_HEAP_COUNT,
> > +                     "Cannot handle more than %u restricted heaps\n",
> > +                     MAX_HEAP_COUNT))
> > +               return -EINVAL;
> > +
> > +       no_map = of_get_flat_dt_prop(rmem->fdt_node, "no-map", NULL);
> > +       s = strchr(rmem->name, '@');
> > +       if (s)
> > +               len = umin(s - rmem->name + 1, len);
> > +
> > +       restricted_data[restricted_data_count].base = rmem->base;
> > +       restricted_data[restricted_data_count].size = rmem->size;
> > +       restricted_data[restricted_data_count].no_map = no_map;
> > +       strscpy(restricted_data[restricted_data_count].name, rmem->name, len);
> > +
> > +       restricted_data_count++;
> > +       return 0;
> > +}
> > +
> > +RESERVEDMEM_OF_DECLARE(linaro_restricted_heap, "linaro,restricted-heap",
> > +                      rmem_restricted_heap_setup);
> > +
> > +static int linaro_restricted_heap_init(void)
> > +{
> > +       unsigned int i;
> > +       int ret;
> > +
> > +       for (i = 0; i < restricted_data_count; i++) {
> > +               ret = add_heap(&restricted_data[i]);
> > +               if (ret)
> > +                       return ret;
> > +       }
> > +       return 0;
> > +}
> > +
> > +module_init(linaro_restricted_heap_init);
> > +MODULE_DESCRIPTION("Linaro Restricted Heap Driver");
> > +MODULE_LICENSE("GPL");
> > --
> > 2.34.1
> >


From jens.wiklander at linaro.org  Wed Sep  4 02:49:06 2024
From: jens.wiklander at linaro.org (Jens Wiklander)
Date: Wed, 4 Sep 2024 11:49:06 +0200
Subject: [RFC PATCH 2/4] tee: new ioctl to a register tee_shm from a
 dmabuf file descriptor
In-Reply-To: <CABdmKX02Zd98euuxvKHuV2C5Cng+4P3_8UL3xn2apMP9to+KOA@mail.gmail.com>
References: <20240830070351.2855919-1-jens.wiklander@linaro.org>
 <20240830070351.2855919-3-jens.wiklander@linaro.org> <CABdmKX02Zd98euuxvKHuV2C5Cng+4P3_8UL3xn2apMP9to+KOA@mail.gmail.com>
Message-ID: <CAHUa44HfZ=xT8QFvseR_-e3xhYWQU9kg=Q-wgxN5noXBi_cLbg@mail.gmail.com>

On Tue, Sep 3, 2024 at 7:50?PM T.J. Mercier <tjmercier at google.com> wrote:
>
> On Fri, Aug 30, 2024 at 12:04?AM Jens Wiklander
> <jens.wiklander at linaro.org> wrote:
> >
> > From: Etienne Carriere <etienne.carriere at linaro.org>
> >
> > Enable userspace to create a tee_shm object that refers to a dmabuf
> > reference.
> >
> > Userspace registers the dmabuf file descriptor as in a tee_shm object.
> > The registration is completed with a tee_shm file descriptor returned to
> > userspace.
> >
> > Userspace is free to close the dmabuf file descriptor now since all the
> > resources are now held via the tee_shm object.
> >
> > Closing the tee_shm file descriptor will release all resources used by the
> > tee_shm object.
> >
> > This change only support dmabuf references that relates to physically
> > contiguous memory buffers.
> >
> > New tee_shm flag to identify tee_shm objects built from a registered
> > dmabuf, TEE_SHM_DMA_BUF.
> >
> > Signed-off-by: Etienne Carriere <etienne.carriere at linaro.org>
> > Signed-off-by: Olivier Masse <olivier.masse at nxp.com>
> > Signed-off-by: Jens Wiklander <jens.wiklander at linaro.org>
> > ---
> >  drivers/tee/tee_core.c   |  38 ++++++++++++++
> >  drivers/tee/tee_shm.c    | 104 +++++++++++++++++++++++++++++++++++++--
> >  include/linux/tee_drv.h  |  11 +++++
> >  include/uapi/linux/tee.h |  29 +++++++++++
> >  4 files changed, 179 insertions(+), 3 deletions(-)
> >
> > diff --git a/drivers/tee/tee_core.c b/drivers/tee/tee_core.c
> > index e59c20d74b36..3dfd5428d58c 100644
> > --- a/drivers/tee/tee_core.c
> > +++ b/drivers/tee/tee_core.c
> > @@ -356,6 +356,42 @@ tee_ioctl_shm_register(struct tee_context *ctx,
> >         return ret;
> >  }
> >
> > +static int tee_ioctl_shm_register_fd(struct tee_context *ctx,
> > +                                    struct tee_ioctl_shm_register_fd_data __user *udata)
> > +{
> > +       struct tee_ioctl_shm_register_fd_data data;
> > +       struct tee_shm *shm;
> > +       long ret;
> > +
> > +       if (copy_from_user(&data, udata, sizeof(data)))
> > +               return -EFAULT;
> > +
> > +       /* Currently no input flags are supported */
> > +       if (data.flags)
> > +               return -EINVAL;
> > +
> > +       shm = tee_shm_register_fd(ctx, data.fd);
> > +       if (IS_ERR(shm))
> > +               return -EINVAL;
> > +
> > +       data.id = shm->id;
> > +       data.flags = shm->flags;
> > +       data.size = shm->size;
> > +
> > +       if (copy_to_user(udata, &data, sizeof(data)))
> > +               ret = -EFAULT;
> > +       else
> > +               ret = tee_shm_get_fd(shm);
> > +
> > +       /*
> > +        * When user space closes the file descriptor the shared memory
> > +        * should be freed or if tee_shm_get_fd() failed then it will
> > +        * be freed immediately.
> > +        */
> > +       tee_shm_put(shm);
> > +       return ret;
> > +}
> > +
> >  static int params_from_user(struct tee_context *ctx, struct tee_param *params,
> >                             size_t num_params,
> >                             struct tee_ioctl_param __user *uparams)
> > @@ -830,6 +866,8 @@ static long tee_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
> >                 return tee_ioctl_shm_alloc(ctx, uarg);
> >         case TEE_IOC_SHM_REGISTER:
> >                 return tee_ioctl_shm_register(ctx, uarg);
> > +       case TEE_IOC_SHM_REGISTER_FD:
> > +               return tee_ioctl_shm_register_fd(ctx, uarg);
> >         case TEE_IOC_OPEN_SESSION:
> >                 return tee_ioctl_open_session(ctx, uarg);
> >         case TEE_IOC_INVOKE:
> > diff --git a/drivers/tee/tee_shm.c b/drivers/tee/tee_shm.c
> > index 731d9028b67f..a1cb3c8b6423 100644
> > --- a/drivers/tee/tee_shm.c
> > +++ b/drivers/tee/tee_shm.c
> > @@ -4,6 +4,7 @@
> >   */
> >  #include <linux/anon_inodes.h>
> >  #include <linux/device.h>
> > +#include <linux/dma-buf.h>
> >  #include <linux/idr.h>
> >  #include <linux/mm.h>
> >  #include <linux/sched.h>
> > @@ -14,6 +15,14 @@
> >  #include <linux/highmem.h>
> >  #include "tee_private.h"
> >
> > +/* extra references appended to shm object for registered shared memory */
> > +struct tee_shm_dmabuf_ref {
> > +       struct tee_shm shm;
> > +       struct dma_buf *dmabuf;
> > +       struct dma_buf_attachment *attach;
> > +       struct sg_table *sgt;
> > +};
> > +
> >  static void shm_put_kernel_pages(struct page **pages, size_t page_count)
> >  {
> >         size_t n;
> > @@ -44,7 +53,16 @@ static void release_registered_pages(struct tee_shm *shm)
> >
> >  static void tee_shm_release(struct tee_device *teedev, struct tee_shm *shm)
> >  {
> > -       if (shm->flags & TEE_SHM_POOL) {
> > +       if (shm->flags & TEE_SHM_DMA_BUF) {
> > +               struct tee_shm_dmabuf_ref *ref;
> > +
> > +               ref = container_of(shm, struct tee_shm_dmabuf_ref, shm);
> > +               dma_buf_unmap_attachment(ref->attach, ref->sgt,
> > +               DMA_BIDIRECTIONAL);
> > +
> > +               dma_buf_detach(ref->dmabuf, ref->attach);
> > +               dma_buf_put(ref->dmabuf);
> > +       } else if (shm->flags & TEE_SHM_POOL) {
> >                 teedev->pool->ops->free(teedev->pool, shm);
> >         } else if (shm->flags & TEE_SHM_DYNAMIC) {
> >                 int rc = teedev->desc->ops->shm_unregister(shm->ctx, shm);
> > @@ -56,7 +74,8 @@ static void tee_shm_release(struct tee_device *teedev, struct tee_shm *shm)
> >                 release_registered_pages(shm);
> >         }
> >
> > -       teedev_ctx_put(shm->ctx);
> > +       if (shm->ctx)
> > +               teedev_ctx_put(shm->ctx);
> >
> >         kfree(shm);
> >
> > @@ -168,7 +187,7 @@ struct tee_shm *tee_shm_alloc_user_buf(struct tee_context *ctx, size_t size)
> >   * tee_client_invoke_func(). The memory allocated is later freed with a
> >   * call to tee_shm_free().
> >   *
> > - * @returns a pointer to 'struct tee_shm'
> > + * @returns a pointer to 'struct tee_shm' on success, and ERR_PTR on failure
> >   */
> >  struct tee_shm *tee_shm_alloc_kernel_buf(struct tee_context *ctx, size_t size)
> >  {
> > @@ -178,6 +197,85 @@ struct tee_shm *tee_shm_alloc_kernel_buf(struct tee_context *ctx, size_t size)
> >  }
> >  EXPORT_SYMBOL_GPL(tee_shm_alloc_kernel_buf);
> >
> > +struct tee_shm *tee_shm_register_fd(struct tee_context *ctx, int fd)
> > +{
> > +       struct tee_shm_dmabuf_ref *ref;
> > +       int rc;
> > +
> > +       if (!tee_device_get(ctx->teedev))
> > +               return ERR_PTR(-EINVAL);
> > +
> > +       teedev_ctx_get(ctx);
> > +
> > +       ref = kzalloc(sizeof(*ref), GFP_KERNEL);
> > +       if (!ref) {
> > +               rc = -ENOMEM;
> > +               goto err_put_tee;
> > +       }
> > +
> > +       refcount_set(&ref->shm.refcount, 1);
> > +       ref->shm.ctx = ctx;
> > +       ref->shm.id = -1;
> > +
> > +       ref->dmabuf = dma_buf_get(fd);
> > +       if (IS_ERR(ref->dmabuf)) {
> > +               rc = PTR_ERR(ref->dmabuf);
> > +               goto err_put_dmabuf;
> > +       }
>
> Hi,
>
> Most of the gotos in the errors paths from here on look offset by one
> to me. Attempting to put a dmabuf after failing to get, detaching
> after failing to attach, unmapping after failing to map, removing an
> IDR after failing to allocate one.

You're right, I'll fix them.

Thanks,
Jens

>
>
> > +
> > +       ref->attach = dma_buf_attach(ref->dmabuf, &ref->shm.ctx->teedev->dev);
> > +       if (IS_ERR(ref->attach)) {
> > +               rc = PTR_ERR(ref->attach);
> > +               goto err_detach;
> > +       }
> > +
> > +       ref->sgt = dma_buf_map_attachment(ref->attach, DMA_BIDIRECTIONAL);
> > +       if (IS_ERR(ref->sgt)) {
> > +               rc = PTR_ERR(ref->sgt);
> > +               goto err_unmap_attachement;
> > +       }
> > +
> > +       if (sg_nents(ref->sgt->sgl) != 1) {
> > +               rc = PTR_ERR(ref->sgt->sgl);
> > +               goto err_unmap_attachement;
> > +       }
> > +
> > +       ref->shm.paddr = page_to_phys(sg_page(ref->sgt->sgl));
> > +       ref->shm.size = ref->sgt->sgl->length;
> > +       ref->shm.flags = TEE_SHM_DMA_BUF;
> > +
> > +       mutex_lock(&ref->shm.ctx->teedev->mutex);
> > +       ref->shm.id = idr_alloc(&ref->shm.ctx->teedev->idr, &ref->shm,
> > +                               1, 0, GFP_KERNEL);
> > +       mutex_unlock(&ref->shm.ctx->teedev->mutex);
> > +       if (ref->shm.id < 0) {
> > +               rc = ref->shm.id;
> > +               goto err_idr_remove;
> > +       }
> > +
> > +       return &ref->shm;
> > +
> > +err_idr_remove:
> > +       mutex_lock(&ctx->teedev->mutex);
> > +       idr_remove(&ctx->teedev->idr, ref->shm.id);
> > +       mutex_unlock(&ctx->teedev->mutex);
> > +err_unmap_attachement:
> > +       dma_buf_unmap_attachment(ref->attach, ref->sgt, DMA_BIDIRECTIONAL);
> > +err_detach:
> > +       dma_buf_detach(ref->dmabuf, ref->attach);
> > +err_put_dmabuf:
> > +       dma_buf_put(ref->dmabuf);
> > +       kfree(ref);
> > +err_put_tee:
> > +       teedev_ctx_put(ctx);
> > +       tee_device_put(ctx->teedev);
> > +
> > +       return ERR_PTR(rc);
> > +}
> > +EXPORT_SYMBOL_GPL(tee_shm_register_fd);
> > +
> > +
> > +
> >  /**
> >   * tee_shm_alloc_priv_buf() - Allocate shared memory for a privately shared
> >   *                           kernel buffer
> > diff --git a/include/linux/tee_drv.h b/include/linux/tee_drv.h
> > index 71632e3c5f18..6a1fee689007 100644
> > --- a/include/linux/tee_drv.h
> > +++ b/include/linux/tee_drv.h
> > @@ -25,6 +25,7 @@
> >  #define TEE_SHM_USER_MAPPED    BIT(1)  /* Memory mapped in user space */
> >  #define TEE_SHM_POOL           BIT(2)  /* Memory allocated from pool */
> >  #define TEE_SHM_PRIV           BIT(3)  /* Memory private to TEE driver */
> > +#define TEE_SHM_DMA_BUF                BIT(4)  /* Memory with dma-buf handle */
> >
> >  struct device;
> >  struct tee_device;
> > @@ -275,6 +276,16 @@ void *tee_get_drvdata(struct tee_device *teedev);
> >  struct tee_shm *tee_shm_alloc_priv_buf(struct tee_context *ctx, size_t size);
> >  struct tee_shm *tee_shm_alloc_kernel_buf(struct tee_context *ctx, size_t size);
> >
> > +/**
> > + * tee_shm_register_fd() - Register shared memory from file descriptor
> > + *
> > + * @ctx:       Context that allocates the shared memory
> > + * @fd:                Shared memory file descriptor reference
> > + *
> > + * @returns a pointer to 'struct tee_shm' on success, and ERR_PTR on failure
> > + */
> > +struct tee_shm *tee_shm_register_fd(struct tee_context *ctx, int fd);
> > +
> >  struct tee_shm *tee_shm_register_kernel_buf(struct tee_context *ctx,
> >                                             void *addr, size_t length);
> >
> > diff --git a/include/uapi/linux/tee.h b/include/uapi/linux/tee.h
> > index 23e57164693c..77bc8ef24d3c 100644
> > --- a/include/uapi/linux/tee.h
> > +++ b/include/uapi/linux/tee.h
> > @@ -117,6 +117,35 @@ struct tee_ioctl_shm_alloc_data {
> >  #define TEE_IOC_SHM_ALLOC      _IOWR(TEE_IOC_MAGIC, TEE_IOC_BASE + 1, \
> >                                      struct tee_ioctl_shm_alloc_data)
> >
> > +/**
> > + * struct tee_ioctl_shm_register_fd_data - Shared memory registering argument
> > + * @fd:                [in] File descriptor identifying the shared memory
> > + * @size:      [out] Size of shared memory to allocate
> > + * @flags:     [in] Flags to/from allocation.
> > + * @id:                [out] Identifier of the shared memory
> > + *
> > + * The flags field should currently be zero as input. Updated by the call
> > + * with actual flags as defined by TEE_IOCTL_SHM_* above.
> > + * This structure is used as argument for TEE_IOC_SHM_REGISTER_FD below.
> > + */
> > +struct tee_ioctl_shm_register_fd_data {
> > +       __s64 fd;
> > +       __u64 size;
> > +       __u32 flags;
> > +       __s32 id;
> > +} __aligned(8);
> > +
> > +/**
> > + * TEE_IOC_SHM_REGISTER_FD - register a shared memory from a file descriptor
> > + *
> > + * Returns a file descriptor on success or < 0 on failure
> > + *
> > + * The returned file descriptor refers to the shared memory object in kernel
> > + * land. The shared memory is freed when the descriptor is closed.
> > + */
> > +#define TEE_IOC_SHM_REGISTER_FD        _IOWR(TEE_IOC_MAGIC, TEE_IOC_BASE + 8, \
> > +                                    struct tee_ioctl_shm_register_fd_data)
> > +
> >  /**
> >   * struct tee_ioctl_buf_data - Variable sized buffer
> >   * @buf_ptr:   [in] A __user pointer to a buffer
> > --
> > 2.34.1
> >


From tzungbi at kernel.org  Wed Sep  4 03:08:22 2024
From: tzungbi at kernel.org (Tzung-Bi Shih)
Date: Wed, 4 Sep 2024 10:08:22 +0000
Subject: [PATCH v6 11/12] platform/chrome: Introduce device tree hardware
 prober
In-Reply-To: <20240904090016.2841572-12-wenst@chromium.org>
References: <20240904090016.2841572-1-wenst@chromium.org>
 <20240904090016.2841572-12-wenst@chromium.org>
Message-ID: <Ztgxlmhnkn7NVC81@google.com>

On Wed, Sep 04, 2024 at 05:00:13PM +0800, Chen-Yu Tsai wrote:
> diff --git a/drivers/platform/chrome/chromeos_of_hw_prober.c b/drivers/platform/chrome/chromeos_of_hw_prober.c
[...]
> +static int chromeos_of_hw_prober_probe(struct platform_device *pdev)
> +{
> +	for (size_t i = 0; i < ARRAY_SIZE(hw_prober_platforms); i++) {
> +		int ret;
> +
> +		if (!of_machine_is_compatible(hw_prober_platforms[i].compatible))
> +			continue;
> +
> +		ret = hw_prober_platforms[i].prober(&pdev->dev, hw_prober_platforms[i].data);
> +		/* Ignore unrecoverable errors and keep going through other probers */
> +		if (ret == -EPROBE_DEFER)
> +			return ret;

Is it harmless if some of the components get probed multiple times?  E.g.:
comp1 probed -> comp2 probed -> comp3 returned -EPROBE_DEFER -> some time
later, chromeos_of_hw_prober_probe() gets called again.


From ansuelsmth at gmail.com  Wed Sep  4 04:06:46 2024
From: ansuelsmth at gmail.com (Christian Marangi)
Date: Wed, 4 Sep 2024 13:06:46 +0200
Subject: [PATCH v3 2/5] dt-bindings: mfd: Add support for Airoha EN7581
 GPIO System Controller
In-Reply-To: <20240903164218.GC6858@google.com>
References: <20240831-en7581-pinctrl-v3-0-98eebfb4da66@kernel.org>
 <20240831-en7581-pinctrl-v3-2-98eebfb4da66@kernel.org>
 <20240903153353.GZ6858@google.com>
 <66d72ea9.df0a0220.21f5f.029f@mx.google.com>
 <20240903164218.GC6858@google.com>
Message-ID: <66d83f49.050a0220.3d273e.b096@mx.google.com>

On Tue, Sep 03, 2024 at 05:42:18PM +0100, Lee Jones wrote:
> On Tue, 03 Sep 2024, Christian Marangi wrote:
> 
> > On Tue, Sep 03, 2024 at 04:33:53PM +0100, Lee Jones wrote:
> > > On Sat, 31 Aug 2024, Lorenzo Bianconi wrote:
> > > 
> > > > From: Christian Marangi <ansuelsmth at gmail.com>
> > > > 
> > > > Add support for Airoha EN7581 GPIO System Controller which provide a
> > > > register map for controlling the GPIO, pinctrl and PWM of the SoC.
> > > > 
> > > > Schema define cells for both gpio/interrupt controller and PWM.
> > > > Moreover it provides a dedicated pinctrl node for pins and config
> > > > definitions.
> > > > 
> > > > Signed-off-by: Christian Marangi <ansuelsmth at gmail.com>
> > > > Co-developed-by: Lorenzo Bianconi <lorenzo at kernel.org>
> > > > Signed-off-by: Lorenzo Bianconi <lorenzo at kernel.org>
> > > > ---
> > > >  .../bindings/mfd/airoha,en7581-gpio-sysctl.yaml    | 433 +++++++++++++++++++++
> > > >  1 file changed, 433 insertions(+)
> > > > 
> > > > diff --git a/Documentation/devicetree/bindings/mfd/airoha,en7581-gpio-sysctl.yaml b/Documentation/devicetree/bindings/mfd/airoha,en7581-gpio-sysctl.yaml
> > > > new file mode 100644
> > > > index 000000000000..a9080c7f50f9
> > > > --- /dev/null
> > > > +++ b/Documentation/devicetree/bindings/mfd/airoha,en7581-gpio-sysctl.yaml
> > > > @@ -0,0 +1,433 @@
> > > > +# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
> > > > +%YAML 1.2
> > > > +---
> > > > +$id: http://devicetree.org/schemas/mfd/airoha,en7581-gpio-sysctl.yaml#
> > > > +$schema: http://devicetree.org/meta-schemas/core.yaml#
> > > > +
> > > > +title: Airoha EN7581 GPIO System Controller
> > > > +
> > > > +maintainers:
> > > > +  - Christian Marangi <ansuelsmth at gmail.com>
> > > > +  - Lorenzo Bianconi <lorenzo at kernel.org>
> > > > +
> > > > +description:
> > > > +  Airoha EN7581 SoC GPIO system controller which provided a register map
> > > > +  for controlling the GPIO, pins and PWM of the SoC.
> > > 
> > > This whole thing is just about pins.
> > > 
> > > The MFD portion of this submission doesn't do anything.
> > >
> > 
> > Hi Lee,
> > 
> > thanks for the review. I think you missed the other series as it was
> > requested to use MFD implementation due to shared register map.
> > 
> > > Please rework this to omit the MFD driver.
> > 
> > I'm a bit confused by this you mean in the schema? Putting PWM property
> > in a pinctrl schema looks wrong to me :(
> > 
> > > 
> > > After just a glance, it looks like simple-mfd _might_ work.
> > 
> > Simple-mfd works if register map are well defined and you can have
> > something like
> > - parent define the whole register
> > - child can user reg property to register offset and subsection of the
> >   parent register
> > 
> > Here it's all mixed and scrambled and also it was requested to have a
> > very simple node that include both pwm and pinctrl property (cause that
> > is how the HW register block is designed and schema must reflect HW)
> > 
> > Hope you can understand these reasons.
> 
> Thinking very quickly before I have to rush off.
> 
> Have you considered syscon?
>

Yes it was considered and proposed but it's not suitable for what it was
suggested from DT guy. A syscon implementation would require adding
child nodes with compatible (to probe driver that way) and that got
rejected.

The main reason is that it's wrong to create .yaml that describe how
the driver structure works (mfd + child nodes with compatible) instead
of describing how the actual HW works (single register map that expose
both GPIO/PINCTRL and PWM)

-- 
	Ansuel


From mingyen.hsieh at mediatek.com  Wed Sep  4 04:12:56 2024
From: mingyen.hsieh at mediatek.com (Mingyen Hsieh)
Date: Wed, 4 Sep 2024 19:12:56 +0800
Subject: [PATCH v5] wifi: mac80211: introduce EHT rate support in AQL airtime
Message-ID: <20240904111256.11734-1-mingyen.hsieh@mediatek.com>

From: Ming Yen Hsieh <mingyen.hsieh at mediatek.com>

Add definitions related to EHT mode and airtime calculation
according to the 802.11BE_D4.0.

Co-developed-by: Bo Jiao <Bo.Jiao at mediatek.com>
Signed-off-by: Bo Jiao <Bo.Jiao at mediatek.com>
Signed-off-by: Deren Wu <deren.wu at mediatek.com>
Signed-off-by: Quan Zhou <quan.zhou at mediatek.com>
Signed-off-by: Ming Yen Hsieh <mingyen.hsieh at mediatek.com>
---
v2:
 - add BW_320 support in ieee80211_get_rate_duration().
 - rewrite the existing WARN_ON for property stream condition.
v3:
 - add a macro EHT_GROUP_RANGE() to reduce the line which repetitive the EHT_GROUP().
 - to comply with the current use of EHT streams, the WARN_ON check has been modified
   to be consistent with HE. 
v4:
 - change IEEE80211_EHT_MAX_STREAMS 16 to 8.
v5:
 - use switch-case instead of if-else for stream check.
---
 net/mac80211/airtime.c | 140 +++++++++++++++++++++++++++++++++++++++--
 1 file changed, 134 insertions(+), 6 deletions(-)

diff --git a/net/mac80211/airtime.c b/net/mac80211/airtime.c
index fdf8b658fede..c61df637232a 100644
--- a/net/mac80211/airtime.c
+++ b/net/mac80211/airtime.c
@@ -55,10 +55,21 @@
 #define HE_DURATION_S(shift, streams, gi, bps)		\
 	(HE_DURATION(streams, gi, bps) >> shift)
 
+/* gi in HE/EHT is identical. It matches enum nl80211_eht_gi as well */
+#define EHT_GI_08 HE_GI_08
+#define EHT_GI_16 HE_GI_16
+#define EHT_GI_32 HE_GI_32
+
+#define EHT_DURATION(streams, gi, bps)			\
+	HE_DURATION(streams, gi, bps)
+#define EHT_DURATION_S(shift, streams, gi, bps)		\
+	HE_DURATION_S(shift, streams, gi, bps)
+
 #define BW_20			0
 #define BW_40			1
 #define BW_80			2
 #define BW_160			3
+#define BW_320			4
 
 /*
  * Define group sort order: HT40 -> SGI -> #streams
@@ -68,17 +79,26 @@
 #define IEEE80211_VHT_STREAM_GROUPS	8 /* BW(=4) * SGI(=2) */
 
 #define IEEE80211_HE_MAX_STREAMS	8
+#define IEEE80211_HE_STREAM_GROUPS	12 /* BW(=4) * GI(=3) */
+
+#define IEEE80211_EHT_MAX_STREAMS	8
+#define IEEE80211_EHT_STREAM_GROUPS	15 /* BW(=5) * GI(=3) */
 
 #define IEEE80211_HT_GROUPS_NB	(IEEE80211_MAX_STREAMS *	\
 				 IEEE80211_HT_STREAM_GROUPS)
 #define IEEE80211_VHT_GROUPS_NB	(IEEE80211_MAX_STREAMS *	\
 					 IEEE80211_VHT_STREAM_GROUPS)
+#define IEEE80211_HE_GROUPS_NB	(IEEE80211_HE_MAX_STREAMS *	\
+				 IEEE80211_HE_STREAM_GROUPS)
+#define IEEE80211_EHT_GROUPS_NB	(IEEE80211_EHT_MAX_STREAMS *	\
+				 IEEE80211_EHT_STREAM_GROUPS)
 
 #define IEEE80211_HT_GROUP_0	0
 #define IEEE80211_VHT_GROUP_0	(IEEE80211_HT_GROUP_0 + IEEE80211_HT_GROUPS_NB)
 #define IEEE80211_HE_GROUP_0	(IEEE80211_VHT_GROUP_0 + IEEE80211_VHT_GROUPS_NB)
+#define IEEE80211_EHT_GROUP_0	(IEEE80211_HE_GROUP_0 + IEEE80211_HE_GROUPS_NB)
 
-#define MCS_GROUP_RATES		12
+#define MCS_GROUP_RATES		14
 
 #define HT_GROUP_IDX(_streams, _sgi, _ht40)	\
 	IEEE80211_HT_GROUP_0 +			\
@@ -203,6 +223,69 @@
 #define HE_GROUP(_streams, _gi, _bw)					\
 	__HE_GROUP(_streams, _gi, _bw,				\
 		   HE_GROUP_SHIFT(_streams, _gi, _bw))
+
+#define EHT_BW2VBPS(_bw, r5, r4, r3, r2, r1)					\
+	((_bw) == BW_320 ? r5 : BW2VBPS(_bw, r4, r3, r2, r1))
+
+#define EHT_GROUP_IDX(_streams, _gi, _bw)				\
+	(IEEE80211_EHT_GROUP_0 +					\
+	 IEEE80211_EHT_MAX_STREAMS * 3 * (_bw) +			\
+	 IEEE80211_EHT_MAX_STREAMS * (_gi) +				\
+	 (_streams) - 1)
+
+#define __EHT_GROUP(_streams, _gi, _bw, _s)						\
+	[EHT_GROUP_IDX(_streams, _gi, _bw)] = {						\
+	.shift = _s,									\
+	.duration = {									\
+		EHT_DURATION_S(_s, _streams, _gi,					\
+			       EHT_BW2VBPS(_bw,  1960,   980,  490,  234,  117)),	\
+		EHT_DURATION_S(_s, _streams, _gi,					\
+			       EHT_BW2VBPS(_bw,  3920,  1960,  980,  468,  234)),	\
+		EHT_DURATION_S(_s, _streams, _gi,					\
+			       EHT_BW2VBPS(_bw,  5880,  2937, 1470,  702,  351)),	\
+		EHT_DURATION_S(_s, _streams, _gi,					\
+			       EHT_BW2VBPS(_bw,  7840,  3920, 1960,  936,  468)),	\
+		EHT_DURATION_S(_s, _streams, _gi,					\
+			       EHT_BW2VBPS(_bw, 11760,  5880, 2940, 1404,  702)),	\
+		EHT_DURATION_S(_s, _streams, _gi,					\
+			       EHT_BW2VBPS(_bw, 15680,  7840, 3920, 1872,  936)),	\
+		EHT_DURATION_S(_s, _streams, _gi,					\
+			       EHT_BW2VBPS(_bw, 17640,  8820, 4410, 2106, 1053)),	\
+		EHT_DURATION_S(_s, _streams, _gi,					\
+			       EHT_BW2VBPS(_bw, 19600,  9800, 4900, 2340, 1170)),	\
+		EHT_DURATION_S(_s, _streams, _gi,					\
+			       EHT_BW2VBPS(_bw, 23520, 11760, 5880, 2808, 1404)),	\
+		EHT_DURATION_S(_s, _streams, _gi,					\
+			       EHT_BW2VBPS(_bw, 26133, 13066, 6533, 3120, 1560)),	\
+		EHT_DURATION_S(_s, _streams, _gi,					\
+			       EHT_BW2VBPS(_bw, 29400, 14700, 7350, 3510, 1755)),	\
+		EHT_DURATION_S(_s, _streams, _gi,					\
+			       EHT_BW2VBPS(_bw, 32666, 16333, 8166, 3900, 1950)),	\
+		EHT_DURATION_S(_s, _streams, _gi,					\
+			       EHT_BW2VBPS(_bw, 35280, 17640, 8820, 4212, 2106)),	\
+		EHT_DURATION_S(_s, _streams, _gi,					\
+			       EHT_BW2VBPS(_bw, 39200, 19600, 9800, 4680, 2340))	\
+		}									\
+}
+
+#define EHT_GROUP_SHIFT(_streams, _gi, _bw)						\
+	GROUP_SHIFT(EHT_DURATION(_streams, _gi,						\
+				 EHT_BW2VBPS(_bw, 1960, 980, 490, 234, 117)))
+
+#define EHT_GROUP(_streams, _gi, _bw)					\
+	__EHT_GROUP(_streams, _gi, _bw,				\
+		   EHT_GROUP_SHIFT(_streams, _gi, _bw))
+
+#define EHT_GROUP_RANGE(_gi, _bw)	\
+	EHT_GROUP(1, _gi, _bw),		\
+	EHT_GROUP(2, _gi, _bw),		\
+	EHT_GROUP(3, _gi, _bw),		\
+	EHT_GROUP(4, _gi, _bw),		\
+	EHT_GROUP(5, _gi, _bw),		\
+	EHT_GROUP(6, _gi, _bw),		\
+	EHT_GROUP(7, _gi, _bw),		\
+	EHT_GROUP(8, _gi, _bw)
+
 struct mcs_group {
 	u8 shift;
 	u16 duration[MCS_GROUP_RATES];
@@ -376,6 +459,26 @@ static const struct mcs_group airtime_mcs_groups[] = {
 	HE_GROUP(6, HE_GI_32, BW_160),
 	HE_GROUP(7, HE_GI_32, BW_160),
 	HE_GROUP(8, HE_GI_32, BW_160),
+
+	EHT_GROUP_RANGE(EHT_GI_08, BW_20),
+	EHT_GROUP_RANGE(EHT_GI_16, BW_20),
+	EHT_GROUP_RANGE(EHT_GI_32, BW_20),
+
+	EHT_GROUP_RANGE(EHT_GI_08, BW_40),
+	EHT_GROUP_RANGE(EHT_GI_16, BW_40),
+	EHT_GROUP_RANGE(EHT_GI_32, BW_40),
+
+	EHT_GROUP_RANGE(EHT_GI_08, BW_80),
+	EHT_GROUP_RANGE(EHT_GI_16, BW_80),
+	EHT_GROUP_RANGE(EHT_GI_32, BW_80),
+
+	EHT_GROUP_RANGE(EHT_GI_08, BW_160),
+	EHT_GROUP_RANGE(EHT_GI_16, BW_160),
+	EHT_GROUP_RANGE(EHT_GI_32, BW_160),
+
+	EHT_GROUP_RANGE(EHT_GI_08, BW_320),
+	EHT_GROUP_RANGE(EHT_GI_16, BW_320),
+	EHT_GROUP_RANGE(EHT_GI_32, BW_320),
 };
 
 static u32
@@ -422,6 +525,9 @@ static u32 ieee80211_get_rate_duration(struct ieee80211_hw *hw,
 	case RATE_INFO_BW_160:
 		bw = BW_160;
 		break;
+	case RATE_INFO_BW_320:
+		bw = BW_320;
+		break;
 	default:
 		WARN_ON_ONCE(1);
 		return 0;
@@ -443,14 +549,27 @@ static u32 ieee80211_get_rate_duration(struct ieee80211_hw *hw,
 		idx = status->rate_idx;
 		group = HE_GROUP_IDX(streams, status->he_gi, bw);
 		break;
+	case RX_ENC_EHT:
+		streams = status->nss;
+		idx = status->rate_idx;
+		group = EHT_GROUP_IDX(streams, status->eht.gi, bw);
+		break;
 	default:
 		WARN_ON_ONCE(1);
 		return 0;
 	}
 
-	if (WARN_ON_ONCE((status->encoding != RX_ENC_HE && streams > 4) ||
-			 (status->encoding == RX_ENC_HE && streams > 8)))
-		return 0;
+	switch (status->encoding) {
+	case RX_ENC_EHT:
+	case RX_ENC_HE:
+		if (WARN_ON_ONCE(streams > 8))
+			return 0;
+		break;
+	default:
+		if (WARN_ON_ONCE(streams > 4))
+			return 0;
+		break;
+	}
 
 	if (idx >= MCS_GROUP_RATES)
 		return 0;
@@ -517,7 +636,9 @@ static bool ieee80211_fill_rate_info(struct ieee80211_hw *hw,
 	stat->nss = ri->nss;
 	stat->rate_idx = ri->mcs;
 
-	if (ri->flags & RATE_INFO_FLAGS_HE_MCS)
+	if (ri->flags & RATE_INFO_FLAGS_EHT_MCS)
+		stat->encoding = RX_ENC_EHT;
+	else if (ri->flags & RATE_INFO_FLAGS_HE_MCS)
 		stat->encoding = RX_ENC_HE;
 	else if (ri->flags & RATE_INFO_FLAGS_VHT_MCS)
 		stat->encoding = RX_ENC_VHT;
@@ -529,7 +650,14 @@ static bool ieee80211_fill_rate_info(struct ieee80211_hw *hw,
 	if (ri->flags & RATE_INFO_FLAGS_SHORT_GI)
 		stat->enc_flags |= RX_ENC_FLAG_SHORT_GI;
 
-	stat->he_gi = ri->he_gi;
+	switch (stat->encoding) {
+	case RX_ENC_EHT:
+		stat->eht.gi = ri->eht_gi;
+		break;
+	default:
+		stat->he_gi = ri->he_gi;
+		break;
+	}
 
 	if (stat->encoding != RX_ENC_LEGACY)
 		return true;
-- 
2.25.1



From broonie at kernel.org  Wed Sep  4 04:16:38 2024
From: broonie at kernel.org (Mark Brown)
Date: Wed, 04 Sep 2024 12:16:38 +0100
Subject: (subset) [PATCH v6 00/16] Add audio support for the MediaTek
 Genio 350-evk board
In-Reply-To: <20240226-audio-i350-v6-0-f754ec1a7634@baylibre.com>
References: <20240226-audio-i350-v6-0-f754ec1a7634@baylibre.com>
Message-ID: <172544859867.19172.9438630691561948517.b4-ty@kernel.org>

On Wed, 19 Jun 2024 16:46:36 +0200, Alexandre Mergnat wrote:
> This serie aim to add the following audio support for the Genio 350-evk:
> - Playback
>   - 2ch Headset Jack (Earphone)
>   - 1ch Line-out Jack (Speaker)
>   - 8ch HDMI Tx
> - Capture
>   - 1ch DMIC (On-board Digital Microphone)
>   - 1ch AMIC (On-board Analogic Microphone)
>   - 1ch Headset Jack (External Analogic Microphone)
> 
> [...]

Applied to

   https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git for-next

Thanks!

[01/16] ASoC: dt-bindings: mediatek,mt8365-afe: Add audio afe document
        commit: ceb3ca2876243e3ea02f78b3d488b1f2d734de49
[02/16] ASoC: dt-bindings: mediatek,mt8365-mt6357: Add audio sound card document
        commit: 76d80dcdd55f70b28930edb97b96ee375e1cce5a
[04/16] ASoC: mediatek: mt8365: Add common header
        commit: 38c7c9ddc74033406461d64e541bbc8268e77f73
[05/16] ASoC: mediatek: mt8365: Add audio clock control support
        commit: ef307b40b7f0042d54f020bccb3e728ced292282
[06/16] ASoC: mediatek: mt8365: Add I2S DAI support
        commit: 402bbb13a195caa83b3279ebecdabfb11ddee084
[07/16] ASoC: mediatek: mt8365: Add ADDA DAI support
        commit: 7c58c88e524180e8439acdfc44872325e7f6d33d
[08/16] ASoC: mediatek: mt8365: Add DMIC DAI support
        commit: 1c50ec75ce6c0c6b5736499393e522f73e19d0cf
[09/16] ASoC: mediatek: mt8365: Add PCM DAI support
        commit: 5097c0c8634d703e3c59cfb89831b7db9dc46339
[10/16] ASoc: mediatek: mt8365: Add a specific soundcard for EVK
        commit: 1bf6dbd75f7603dd026660bebf324f812200dc1b
[11/16] ASoC: mediatek: mt8365: Add the AFE driver support
        commit: e1991d102bc2abb32331c462f8f3e77059c69578
[12/16] ASoC: codecs: add MT6357 support
        (no commit info)
[13/16] ASoC: mediatek: Add MT8365 support
        (no commit info)

All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.

You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.

If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.

Please add any relevant lists and maintainers to the CCs when replying
to this mail.

Thanks,
Mark



From broonie at kernel.org  Wed Sep  4 04:16:48 2024
From: broonie at kernel.org (Mark Brown)
Date: Wed, 04 Sep 2024 12:16:48 +0100
Subject: (subset) [PATCH v7 00/16] Add audio support for the MediaTek
 Genio 350-evk board
In-Reply-To: <20240226-audio-i350-v7-0-6518d953a141@baylibre.com>
References: <20240226-audio-i350-v7-0-6518d953a141@baylibre.com>
Message-ID: <172544860860.19172.7052813450885034844.b4-ty@kernel.org>

On Mon, 22 Jul 2024 08:53:29 +0200, Alexandre Mergnat wrote:
> This serie aim to add the following audio support for the Genio 350-evk:
> - Playback
>   - 2ch Headset Jack (Earphone)
>   - 1ch Line-out Jack (Speaker)
>   - 8ch HDMI Tx
> - Capture
>   - 1ch DMIC (On-board Digital Microphone)
>   - 1ch AMIC (On-board Analogic Microphone)
>   - 1ch Headset Jack (External Analogic Microphone)
> 
> [...]

Applied to

   https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git for-next

Thanks!

[01/16] ASoC: dt-bindings: mediatek,mt8365-afe: Add audio afe document
        commit: ceb3ca2876243e3ea02f78b3d488b1f2d734de49
[02/16] ASoC: dt-bindings: mediatek,mt8365-mt6357: Add audio sound card document
        commit: 76d80dcdd55f70b28930edb97b96ee375e1cce5a
[03/16] dt-bindings: mfd: mediatek: Add codec property for MT6357 PMIC
        commit: 761cab667898d86c04867948f1b7aec1090be796
[04/16] ASoC: mediatek: mt8365: Add common header
        commit: 38c7c9ddc74033406461d64e541bbc8268e77f73
[05/16] ASoC: mediatek: mt8365: Add audio clock control support
        commit: ef307b40b7f0042d54f020bccb3e728ced292282
[06/16] ASoC: mediatek: mt8365: Add I2S DAI support
        commit: 402bbb13a195caa83b3279ebecdabfb11ddee084
[07/16] ASoC: mediatek: mt8365: Add ADDA DAI support
        commit: 7c58c88e524180e8439acdfc44872325e7f6d33d
[08/16] ASoC: mediatek: mt8365: Add DMIC DAI support
        commit: 1c50ec75ce6c0c6b5736499393e522f73e19d0cf
[09/16] ASoC: mediatek: mt8365: Add PCM DAI support
        commit: 5097c0c8634d703e3c59cfb89831b7db9dc46339
[10/16] ASoc: mediatek: mt8365: Add a specific soundcard for EVK
        commit: 1bf6dbd75f7603dd026660bebf324f812200dc1b
[11/16] ASoC: mediatek: mt8365: Add the AFE driver support
        commit: e1991d102bc2abb32331c462f8f3e77059c69578
[12/16] ASoC: codecs: add MT6357 support
        (no commit info)
[13/16] ASoC: mediatek: Add MT8365 support
        (no commit info)

All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.

You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.

If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.

Please add any relevant lists and maintainers to the CCs when replying
to this mail.

Thanks,
Mark



From chunhui.li at mediatek.com  Wed Sep  4 05:41:07 2024
From: chunhui.li at mediatek.com (Chunhui Li)
Date: Wed, 4 Sep 2024 20:41:07 +0800
Subject: [PATCH v2] module: abort module loading when sysfs setup suffer errors
Message-ID: <20240904124108.20444-1-chunhui.li@mediatek.com>

When insmod a kernel module, if fails in add_notes_attrs or
add_sysfs_attrs such as memory allocation fail, mod_sysfs_setup
will still return success, but we can't access user interface
on android device.

Patch for make mod_sysfs_setup can check the error of
add_notes_attrs and add_sysfs_attrs.

Reported-by: kernel test robot <lkp at intel.com>
Closes: https://lore.kernel.org/oe-kbuild-all/202409010016.3XIFSmRA-lkp at intel.com/
Signed-off-by: Xion Wang <xion.wang at mediatek.com>
Signed-off-by: Chunhui Li <chunhui.li at mediatek.com>
---
 kernel/module/sysfs.c | 53 +++++++++++++++++++++++++++++--------------
 1 file changed, 36 insertions(+), 17 deletions(-)

diff --git a/kernel/module/sysfs.c b/kernel/module/sysfs.c
index 26efe1305c12..61a3547e56f9 100644
--- a/kernel/module/sysfs.c
+++ b/kernel/module/sysfs.c
@@ -69,12 +69,13 @@ static void free_sect_attrs(struct module_sect_attrs *sect_attrs)
 	kfree(sect_attrs);
 }
 
-static void add_sect_attrs(struct module *mod, const struct load_info *info)
+static int add_sect_attrs(struct module *mod, const struct load_info *info)
 {
 	unsigned int nloaded = 0, i, size[2];
 	struct module_sect_attrs *sect_attrs;
 	struct module_sect_attr *sattr;
 	struct bin_attribute **gattr;
+	int ret;
 
 	/* Count loaded sections and allocate structures */
 	for (i = 0; i < info->hdr->e_shnum; i++)
@@ -85,7 +86,7 @@ static void add_sect_attrs(struct module *mod, const struct load_info *info)
 	size[1] = (nloaded + 1) * sizeof(sect_attrs->grp.bin_attrs[0]);
 	sect_attrs = kzalloc(size[0] + size[1], GFP_KERNEL);
 	if (!sect_attrs)
-		return;
+		return -ENOMEM;
 
 	/* Setup section attributes. */
 	sect_attrs->grp.name = "sections";
@@ -103,8 +104,10 @@ static void add_sect_attrs(struct module *mod, const struct load_info *info)
 		sattr->address = sec->sh_addr;
 		sattr->battr.attr.name =
 			kstrdup(info->secstrings + sec->sh_name, GFP_KERNEL);
-		if (!sattr->battr.attr.name)
+		if (!sattr->battr.attr.name) {
+			ret = -ENOMEM;
 			goto out;
+		}
 		sect_attrs->nsections++;
 		sattr->battr.read = module_sect_read;
 		sattr->battr.size = MODULE_SECT_READ_SIZE;
@@ -113,13 +116,15 @@ static void add_sect_attrs(struct module *mod, const struct load_info *info)
 	}
 	*gattr = NULL;
 
-	if (sysfs_create_group(&mod->mkobj.kobj, &sect_attrs->grp))
+	ret = sysfs_create_group(&mod->mkobj.kobj, &sect_attrs->grp);
+	if (ret)
 		goto out;
 
 	mod->sect_attrs = sect_attrs;
-	return;
+	return 0;
 out:
 	free_sect_attrs(sect_attrs);
+	return ret;
 }
 
 static void remove_sect_attrs(struct module *mod)
@@ -158,11 +163,12 @@ static void free_notes_attrs(struct module_notes_attrs *notes_attrs,
 	kfree(notes_attrs);
 }
 
-static void add_notes_attrs(struct module *mod, const struct load_info *info)
+static int add_notes_attrs(struct module *mod, const struct load_info *info)
 {
 	unsigned int notes, loaded, i;
 	struct module_notes_attrs *notes_attrs;
 	struct bin_attribute *nattr;
+	int ret;
 
 	/* failed to create section attributes, so can't create notes */
 	if (!mod->sect_attrs)
@@ -176,12 +182,12 @@ static void add_notes_attrs(struct module *mod, const struct load_info *info)
 			++notes;
 
 	if (notes == 0)
-		return;
+		return 0;
 
 	notes_attrs = kzalloc(struct_size(notes_attrs, attrs, notes),
 			      GFP_KERNEL);
 	if (!notes_attrs)
-		return;
+		return -ENOMEM;
 
 	notes_attrs->notes = notes;
 	nattr = &notes_attrs->attrs[0];
@@ -201,19 +207,23 @@ static void add_notes_attrs(struct module *mod, const struct load_info *info)
 	}
 
 	notes_attrs->dir = kobject_create_and_add("notes", &mod->mkobj.kobj);
-	if (!notes_attrs->dir)
+	if (!notes_attrs->dir) {
+		ret = -ENOMEM;
 		goto out;
+	}
 
-	for (i = 0; i < notes; ++i)
-		if (sysfs_create_bin_file(notes_attrs->dir,
-					  &notes_attrs->attrs[i]))
+	for (i = 0; i < notes; ++i) {
+		ret = sysfs_create_bin_file(notes_attrs->dir, &notes_attrs->attrs[i]);
+		if (ret)
 			goto out;
+	}
 
 	mod->notes_attrs = notes_attrs;
-	return;
+	return 0;
 
 out:
 	free_notes_attrs(notes_attrs, i);
+	return ret;
 }
 
 static void remove_notes_attrs(struct module *mod)
@@ -223,9 +233,9 @@ static void remove_notes_attrs(struct module *mod)
 }
 
 #else /* !CONFIG_KALLSYMS */
-static inline void add_sect_attrs(struct module *mod, const struct load_info *info) { }
+static inline int add_sect_attrs(struct module *mod, const struct load_info *info) { }
 static inline void remove_sect_attrs(struct module *mod) { }
-static inline void add_notes_attrs(struct module *mod, const struct load_info *info) { }
+static inline int add_notes_attrs(struct module *mod, const struct load_info *info) { }
 static inline void remove_notes_attrs(struct module *mod) { }
 #endif /* CONFIG_KALLSYMS */
 
@@ -385,11 +395,20 @@ int mod_sysfs_setup(struct module *mod,
 	if (err)
 		goto out_unreg_modinfo_attrs;
 
-	add_sect_attrs(mod, info);
-	add_notes_attrs(mod, info);
+	err = add_sect_attrs(mod, info);
+	if (err)
+		goto out_del_usage_links;
+
+	err = add_notes_attrs(mod, info);
+	if (err)
+		goto out_unreg_sect_attrs;
 
 	return 0;
 
+out_unreg_sect_attrs:
+	remove_sect_attrs(mod);
+out_del_usage_links:
+	del_usage_links(mod);
 out_unreg_modinfo_attrs:
 	module_remove_modinfo_attrs(mod, -1);
 out_unreg_param:
-- 
2.45.2



From andriy.shevchenko at linux.intel.com  Wed Sep  4 06:03:47 2024
From: andriy.shevchenko at linux.intel.com (Andy Shevchenko)
Date: Wed, 4 Sep 2024 16:03:47 +0300
Subject: [PATCH v6 02/12] of: base: Add
 for_each_child_of_node_with_prefix_scoped()
In-Reply-To: <20240904090016.2841572-3-wenst@chromium.org>
References: <20240904090016.2841572-1-wenst@chromium.org>
 <20240904090016.2841572-3-wenst@chromium.org>
Message-ID: <Zthasx8VNCw_yj5q@smile.fi.intel.com>

On Wed, Sep 04, 2024 at 05:00:04PM +0800, Chen-Yu Tsai wrote:
> There are cases where drivers would go through child device nodes and
> operate on only the ones whose node name starts with a given prefix.
> 
> Provide a helper for these users. This will mainly be used in a
> subsequent patch that implements a hardware component prober for I2C
> busses.

...

> +#define for_each_child_of_node_with_prefix_scoped(parent, child, prefix) \
> +	for (struct device_node *child __free(device_node) =		\
> +	     of_get_next_child_with_prefix(parent, NULL, prefix);	\
> +	     child != NULL;						\
> +	     child = of_get_next_child_with_prefix(parent, child, prefix))

I'm wondering if we may drop _scoped from day 1. Yeah, probably a bit confusing
as the rest of APIs without that suffix do require reference count handling on
the loop abrupt.

-- 
With Best Regards,
Andy Shevchenko




From andriy.shevchenko at linux.intel.com  Wed Sep  4 06:09:26 2024
From: andriy.shevchenko at linux.intel.com (Andy Shevchenko)
Date: Wed, 4 Sep 2024 16:09:26 +0300
Subject: [PATCH v6 03/12] regulator: Move OF-specific regulator lookup
 code to of_regulator.c
In-Reply-To: <20240904090016.2841572-4-wenst@chromium.org>
References: <20240904090016.2841572-1-wenst@chromium.org>
 <20240904090016.2841572-4-wenst@chromium.org>
Message-ID: <ZthcBpx8WFIvsrJj@smile.fi.intel.com>

On Wed, Sep 04, 2024 at 05:00:05PM +0800, Chen-Yu Tsai wrote:
> There's still a bit of OF-specific code in the regulator device lookup
> function.
> 
> Move those bits of code over to of_regulator.c, and create a new
> function of_regulator_dev_lookup() to encapsulate the code moved out of
> regulator_dev_lookup().
> 
> Also mark of_find_regulator_by_node() as static, since there are no
> other users in other compile units.
> 
> There are no functional changes. A line alignment was also fixed.

...

> +/**
> + * of_get_child_regulator - get a child regulator device node
> + * based on supply name
> + * @parent: Parent device node
> + * @prop_name: Combination regulator supply name and "-supply"
> + *
> + * Traverse all child nodes.
> + * Extract the child regulator device node corresponding to the supply name.
> + *
> + * Return: Pointer to the &struct device_node corresponding to the regulator
> + *	   if found, or %NULL if not found.
> + */
> +static struct device_node *of_get_child_regulator(struct device_node *parent,
> +						  const char *prop_name)
> +{
> +	struct device_node *regnode = NULL;
> +	struct device_node *child = NULL;
> +
> +	for_each_child_of_node(parent, child) {

> +		regnode = of_parse_phandle(child, prop_name, 0);
> +		if (!regnode) {
> +			regnode = of_get_child_regulator(child, prop_name);
> +			if (regnode)
> +				goto err_node_put;
> +		} else {
> +			goto err_node_put;
> +		}

I know this is just a move of the existing code, but consider negating the
conditional and have something like

		regnode = of_parse_phandle(child, prop_name, 0);
		if (regnode)
			goto err_node_put;

		regnode = of_get_child_regulator(child, prop_name);
		if (regnode)
			goto err_node_put;

> +	}
> +	return NULL;
> +
> +err_node_put:
> +	of_node_put(child);
> +	return regnode;
> +}

...

I assume the use of _scoped() macros is in mind for the future changes?

...

> +/**
> + * of_get_regulator - get a regulator device node based on supply name
> + * @dev: Device pointer for the consumer (of regulator) device
> + * @supply: regulator supply name
> + *
> + * Extract the regulator device node corresponding to the supply name.
> + *
> + * Return: Pointer to the &struct device_node corresponding to the regulator
> + *	   if found, or %NULL if not found.
> + */
> +static struct device_node *of_get_regulator(struct device *dev, const char *supply)
> +{
> +	struct device_node *regnode = NULL;
> +	char prop_name[64]; /* 64 is max size of property name */
> +
> +	dev_dbg(dev, "Looking up %s-supply from device tree\n", supply);
> +
> +	snprintf(prop_name, 64, "%s-supply", supply);
> +	regnode = of_parse_phandle(dev->of_node, prop_name, 0);

> +	if (!regnode) {

Similarly here

	snprintf(prop_name, 64, "%s-supply", supply);
	regnode = of_parse_phandle(dev->of_node, prop_name, 0);
	if (regnode)
		return regnode;


> +		regnode = of_get_child_regulator(dev->of_node, prop_name);
> +		if (regnode)
> +			return regnode;
> +
> +		dev_dbg(dev, "Looking up %s property in node %pOF failed\n",
> +			prop_name, dev->of_node);
> +		return NULL;
> +	}
> +	return regnode;

	regnode = of_get_child_regulator(dev->of_node, prop_name);
	if (regnode)
		return regnode;

	dev_dbg(dev, "Looking up %s property in node %pOF failed\n", prop_name, dev->of_node);
	return NULL;

> +}

-- 
With Best Regards,
Andy Shevchenko




From andriy.shevchenko at linux.intel.com  Wed Sep  4 06:13:22 2024
From: andriy.shevchenko at linux.intel.com (Andy Shevchenko)
Date: Wed, 4 Sep 2024 16:13:22 +0300
Subject: [PATCH v6 05/12] regulator: Do pure DT regulator lookup in
 of_regulator_bulk_get_all()
In-Reply-To: <20240904090016.2841572-6-wenst@chromium.org>
References: <20240904090016.2841572-1-wenst@chromium.org>
 <20240904090016.2841572-6-wenst@chromium.org>
Message-ID: <Zthc8r62z2eaR8k0@smile.fi.intel.com>

On Wed, Sep 04, 2024 at 05:00:07PM +0800, Chen-Yu Tsai wrote:
> The to-be-introduced I2C component prober needs to enable regulator
> supplies (and toggle GPIO pins) for the various components it intends
> to probe. To support this, a new "pure DT lookup" method for getting
> regulator supplies is needed, since the device normally requesting
> the supply won't get created until after the component is probed to
> be available.
> 
> Convert the existing of_regulator_bulk_get_all() for this purpose.
> This function has no in-tree users, as the original patch [1] that
> used it was never landed. This patch changes the function ABI, but
> it is straightforward to convert users.
> 
> The underlying code that supports the existing regulator_get*()
> functions has been reworked in previous patches to support this
> specific case. An internal OF-specific version of regulator_get(),
> of_regulator_get_optional(), is added for this.
> 
> Also convert an existing usage of "dev && dev->of_node" to
> "dev_of_node(dev)".

> [1] https://lore.kernel.org/all/20231220203537.83479-2-jernej.skrabec at gmail.com/
> 
> Signed-off-by: Chen-Yu Tsai <wenst at chromium.org>

Make it Link tag.

  Link: https://lore.kernel.org/all/20231220203537.83479-2-jernej.skrabec at gmail.com/ [1]
  Signed-off-by: Chen-Yu Tsai <wenst at chromium.org>

-- 
With Best Regards,
Andy Shevchenko




From andriy.shevchenko at linux.intel.com  Wed Sep  4 06:14:59 2024
From: andriy.shevchenko at linux.intel.com (Andy Shevchenko)
Date: Wed, 4 Sep 2024 16:14:59 +0300
Subject: [PATCH v6 03/12] regulator: Move OF-specific regulator lookup
 code to of_regulator.c
In-Reply-To: <ZthcBpx8WFIvsrJj@smile.fi.intel.com>
References: <20240904090016.2841572-1-wenst@chromium.org>
 <20240904090016.2841572-4-wenst@chromium.org>
 <ZthcBpx8WFIvsrJj@smile.fi.intel.com>
Message-ID: <ZthdU6UGlM75GJVj@smile.fi.intel.com>

On Wed, Sep 04, 2024 at 04:09:26PM +0300, Andy Shevchenko wrote:
> On Wed, Sep 04, 2024 at 05:00:05PM +0800, Chen-Yu Tsai wrote:

> > +static struct device_node *of_get_child_regulator(struct device_node *parent,
> > +						  const char *prop_name)
> > +{
> > +	struct device_node *regnode = NULL;

> > +	struct device_node *child = NULL;

Btw, redundant assignment here, as child will be assigned anyway AFAIR.

> > +	for_each_child_of_node(parent, child) {
> 
> > +		regnode = of_parse_phandle(child, prop_name, 0);
> > +		if (!regnode) {
> > +			regnode = of_get_child_regulator(child, prop_name);
> > +			if (regnode)
> > +				goto err_node_put;
> > +		} else {
> > +			goto err_node_put;
> > +		}
> 
> I know this is just a move of the existing code, but consider negating the
> conditional and have something like
> 
> 		regnode = of_parse_phandle(child, prop_name, 0);
> 		if (regnode)
> 			goto err_node_put;
> 
> 		regnode = of_get_child_regulator(child, prop_name);
> 		if (regnode)
> 			goto err_node_put;
> 
> > +	}
> > +	return NULL;
> > +
> > +err_node_put:
> > +	of_node_put(child);
> > +	return regnode;
> > +}

-- 
With Best Regards,
Andy Shevchenko




From andriy.shevchenko at linux.intel.com  Wed Sep  4 06:40:24 2024
From: andriy.shevchenko at linux.intel.com (Andy Shevchenko)
Date: Wed, 4 Sep 2024 16:40:24 +0300
Subject: [PATCH v6 06/12] gpiolib: Add gpio_get_property_name_length()
In-Reply-To: <20240904090016.2841572-7-wenst@chromium.org>
References: <20240904090016.2841572-1-wenst@chromium.org>
 <20240904090016.2841572-7-wenst@chromium.org>
Message-ID: <ZthjSK9N9z11YXi2@smile.fi.intel.com>

On Wed, Sep 04, 2024 at 05:00:08PM +0800, Chen-Yu Tsai wrote:
> The I2C device tree component prober needs to get and toggle GPIO lines
> for the components it intends to probe. These components may not use the
> same name for their GPIO lines, so the prober must go through the device
> tree, check each property to see it is a GPIO property, and get the GPIO
> line.
> 
> Instead of duplicating the GPIO suffixes, or exporting them to the
> prober to do pattern matching, simply add and export a new function that
> does the pattern matching and returns the length of the GPIO name. The
> caller can then use that to copy out the name if it needs to.

> Andy suggested a much shorter implementation.

No need to have this sentence in the commit message, changelog area is fine.
But if you wish... :-)

> Suggested-by: Andy Shevchenko <andriy.shevchenko at linux.intel.com>
> Signed-off-by: Chen-Yu Tsai <wenst at chromium.org>

...

> +/**
> + * gpio_get_property_name_length - Returns the GPIO name length from a property name
> + * @propname:	name of the property to check
> + *
> + * This function checks if the given property name matches the GPIO property
> + * patterns, and returns the length of the name of the GPIO. The pattern is
> + * "*-<GPIO suffix>" or just "<GPIO suffix>".
> + *
> + * Returns:
> + * The length of the string before '-<GPIO suffix>' if it matches
> + * "*-<GPIO suffix>", or 0 if no name part, just the suffix, or
> + * -EINVAL if the string doesn't match the pattern.

Should be %-EINVAL as we agreed with Bart when I updated GPIOLIB kernel-doc.

> + */

-- 
With Best Regards,
Andy Shevchenko




From andriy.shevchenko at linux.intel.com  Wed Sep  4 06:41:36 2024
From: andriy.shevchenko at linux.intel.com (Andy Shevchenko)
Date: Wed, 4 Sep 2024 16:41:36 +0300
Subject: [PATCH v6 07/12] i2c: core: Remove extra space in Makefile
In-Reply-To: <20240904090016.2841572-8-wenst@chromium.org>
References: <20240904090016.2841572-1-wenst@chromium.org>
 <20240904090016.2841572-8-wenst@chromium.org>
Message-ID: <ZthjkJwtpz9gU9hI@smile.fi.intel.com>

On Wed, Sep 04, 2024 at 05:00:09PM +0800, Chen-Yu Tsai wrote:
> Some lines in the Makefile have a space before tabs. Remove those.

Reviewed-by: Andy Shevchenko <andriy.shevchenko at linux.intel.com>

-- 
With Best Regards,
Andy Shevchenko




From robh at kernel.org  Wed Sep  4 06:43:25 2024
From: robh at kernel.org (Rob Herring)
Date: Wed, 4 Sep 2024 08:43:25 -0500
Subject: [PATCH v6 02/12] of: base: Add
 for_each_child_of_node_with_prefix_scoped()
In-Reply-To: <Zthasx8VNCw_yj5q@smile.fi.intel.com>
References: <20240904090016.2841572-1-wenst@chromium.org>
 <20240904090016.2841572-3-wenst@chromium.org>
 <Zthasx8VNCw_yj5q@smile.fi.intel.com>
Message-ID: <20240904134325.GA2416154-robh@kernel.org>

On Wed, Sep 04, 2024 at 04:03:47PM +0300, Andy Shevchenko wrote:
> On Wed, Sep 04, 2024 at 05:00:04PM +0800, Chen-Yu Tsai wrote:
> > There are cases where drivers would go through child device nodes and
> > operate on only the ones whose node name starts with a given prefix.
> > 
> > Provide a helper for these users. This will mainly be used in a
> > subsequent patch that implements a hardware component prober for I2C
> > busses.
> 
> ...
> 
> > +#define for_each_child_of_node_with_prefix_scoped(parent, child, prefix) \
> > +	for (struct device_node *child __free(device_node) =		\
> > +	     of_get_next_child_with_prefix(parent, NULL, prefix);	\
> > +	     child != NULL;						\
> > +	     child = of_get_next_child_with_prefix(parent, child, prefix))
> 
> I'm wondering if we may drop _scoped from day 1. Yeah, probably a bit confusing
> as the rest of APIs without that suffix do require reference count handling on
> the loop abrupt.

Yes, please drop. We have other new ones coming and they don't have 
"_scoped". I was on the fence, but if you use a scoped one like a 
non-scoped one (declaring child outside or using it outside the loop) 
you will get a compiler error.

Rob


From andriy.shevchenko at linux.intel.com  Wed Sep  4 06:47:07 2024
From: andriy.shevchenko at linux.intel.com (Andy Shevchenko)
Date: Wed, 4 Sep 2024 16:47:07 +0300
Subject: [PATCH v6 08/12] i2c: Introduce OF component probe function
In-Reply-To: <20240904090016.2841572-9-wenst@chromium.org>
References: <20240904090016.2841572-1-wenst@chromium.org>
 <20240904090016.2841572-9-wenst@chromium.org>
Message-ID: <Zthk25W0zXcHWRdt@smile.fi.intel.com>

On Wed, Sep 04, 2024 at 05:00:10PM +0800, Chen-Yu Tsai wrote:
> Some devices are designed and manufactured with some components having
> multiple drop-in replacement options. These components are often
> connected to the mainboard via ribbon cables, having the same signals
> and pin assignments across all options. These may include the display
> panel and touchscreen on laptops and tablets, and the trackpad on
> laptops. Sometimes which component option is used in a particular device
> can be detected by some firmware provided identifier, other times that
> information is not available, and the kernel has to try to probe each
> device.
> 
> This change attempts to make the "probe each device" case cleaner. The
> current approach is to have all options added and enabled in the device
> tree. The kernel would then bind each device and run each driver's probe
> function. This works, but has been broken before due to the introduction
> of asynchronous probing, causing multiple instances requesting "shared"
> resources, such as pinmuxes, GPIO pins, interrupt lines, at the same
> time, with only one instance succeeding. Work arounds for these include
> moving the pinmux to the parent I2C controller, using GPIO hogs or
> pinmux settings to keep the GPIO pins in some fixed configuration, and
> requesting the interrupt line very late. Such configurations can be seen
> on the MT8183 Krane Chromebook tablets, and the Qualcomm sc8280xp-based
> Lenovo Thinkpad 13S.
> 
> Instead of this delicate dance between drivers and device tree quirks,
> this change introduces a simple I2C component probe. function For a
> given class of devices on the same I2C bus, it will go through all of
> them, doing a simple I2C read transfer and see which one of them responds.
> It will then enable the device that responds.
> 
> This requires some minor modifications in the existing device tree. The
> status for all the device nodes for the component options must be set
> to "failed-needs-probe". This makes it clear that some mechanism is
> needed to enable one of them, and also prevents the prober and device
> drivers running at the same time.

...

> +int i2c_of_probe_component(struct device *dev, const char *type)
> +{
> +	struct i2c_adapter *i2c;
> +	int ret;
> +
> +	struct device_node *i2c_node __free(device_node) = i2c_of_probe_get_i2c_node(dev, type);
> +	if (IS_ERR(i2c_node))
> +		return PTR_ERR(i2c_node);

> +	for_each_child_of_node_scoped(i2c_node, node) {

Hmm, but can it be for_each_child_of_node_with_prefix_scoped() now?

> +		if (!of_node_name_prefix(node, type))
> +			continue;
> +		if (!of_device_is_available(node))
> +			continue;
> +
> +		/*
> +		 * Device tree has component already enabled. Either the
> +		 * device tree isn't supported or we already probed once.
> +		 */
> +		return 0;
> +	}
> +
> +	i2c = of_get_i2c_adapter_by_node(i2c_node);
> +	if (!i2c)
> +		return dev_err_probe(dev, -EPROBE_DEFER, "Couldn't get I2C adapter\n");
> +
> +	ret = 0;
> +	for_each_child_of_node_scoped(i2c_node, node) {

Ditto.

> +		union i2c_smbus_data data;
> +		u32 addr;
> +
> +		if (!of_node_name_prefix(node, type))
> +			continue;
> +		if (of_property_read_u32(node, "reg", &addr))
> +			continue;
> +		if (i2c_smbus_xfer(i2c, addr, 0, I2C_SMBUS_READ, 0, I2C_SMBUS_BYTE, &data) < 0)
> +			continue;
> +
> +		/* Found a device that is responding */
> +		ret = i2c_of_probe_enable_node(dev, node);
> +		break;
> +	}
> +
> +	i2c_put_adapter(i2c);
> +
> +	return ret;
> +}

...

> +EXPORT_SYMBOL_GPL(i2c_of_probe_component);

Wonder if we may already use namespaced export from day 1.

-- 
With Best Regards,
Andy Shevchenko




From andriy.shevchenko at linux.intel.com  Wed Sep  4 06:53:30 2024
From: andriy.shevchenko at linux.intel.com (Andy Shevchenko)
Date: Wed, 4 Sep 2024 16:53:30 +0300
Subject: [PATCH v6 09/12] i2c: of-prober: Add regulator support
In-Reply-To: <20240904090016.2841572-10-wenst@chromium.org>
References: <20240904090016.2841572-1-wenst@chromium.org>
 <20240904090016.2841572-10-wenst@chromium.org>
Message-ID: <ZthmWoJbjrEmzOzu@smile.fi.intel.com>

On Wed, Sep 04, 2024 at 05:00:11PM +0800, Chen-Yu Tsai wrote:
> This adds regulator management to the I2C OF component prober.
> Components that the prober intends to probe likely require their
> regulator supplies be enabled, and GPIOs be toggled to enable them or
> bring them out of reset before they will respond to probe attempts.
> GPIOs will be handled in the next patch.
> 
> Without specific knowledge of each component's resource names or
> power sequencing requirements, the prober can only enable the
> regulator supplies all at once, and toggle the GPIOs all at once.
> Luckily, reset pins tend to be active low, while enable pins tend to
> be active high, so setting the raw status of all GPIO pins to high
> should work. The wait time before and after resources are enabled
> are collected from existing drivers and device trees.
> 
> The prober collects resources from all possible components and enables
> them together, instead of enabling resources and probing each component
> one by one. The latter approach does not provide any boot time benefits
> over simply enabling each component and letting each driver probe
> sequentially.
> 
> The prober will also deduplicate the resources, since on a component
> swap out or co-layout design, the resources are always the same.
> While duplicate regulator supplies won't cause much issue, shared
> GPIOs don't work reliably, especially with other drivers. For the
> same reason, the prober will release the GPIOs before the successfully
> probed component is actually enabled.

...

> +static int i2c_of_probe_get_regulators(struct device *dev, struct device_node *node,
> +				       struct i2c_of_probe_data *data)
> +{
> +	struct regulator_bulk_data *tmp, *new_regulators;
> +	int ret;
> +
> +	ret = of_regulator_bulk_get_all(dev, node, &tmp);
> +	if (ret < 0) {
> +		return ret;
> +	} else if (ret == 0) {
> +		/*
> +		 * It's entirely possible for a device node to not have
> +		 * regulator supplies. While it doesn't make sense from
> +		 * a hardware perspective, the supplies could be always
> +		 * on or otherwise not modeled in the device tree, but
> +		 * the device would still work.
> +		 */
> +		return ret;
> +	}

	if (ret < 0)
		return ret;

	/*
	 * It's entirely possible for a device node to not have regulator
	 * supplies. While it doesn't make sense from a hardware perspective,
	 * the supplies could be always on or otherwise not modeled in
	 * the device tree, but the device would still work.
	 */
	if (ret == 0)
		return ret;

> +	if (!data->regulators) {
> +		data->regulators = tmp;
> +		data->regulators_num = ret;
> +		return ret;
> +	};
> +
> +	new_regulators = krealloc_array(data->regulators, (data->regulators_num + ret),

Redundant parentheses.

> +					sizeof(*tmp), GFP_KERNEL);
> +	if (!new_regulators) {
> +		regulator_bulk_free(ret, tmp);
> +		return -ENOMEM;
> +	}
> +
> +	data->regulators = new_regulators;
> +	memcpy(&data->regulators[data->regulators_num], tmp, sizeof(*tmp) * ret);

Shouldn't be the size calculated based on the size of the destination?

> +	data->regulators_num += ret;
> +
> +	return ret;
> +}

...

As I said earlier my main concern is that timeout heuristic which seems fragile.
But I have no ideas to propose, leave this to others to comment on / think about.

-- 
With Best Regards,
Andy Shevchenko




From andriy.shevchenko at linux.intel.com  Wed Sep  4 07:04:01 2024
From: andriy.shevchenko at linux.intel.com (Andy Shevchenko)
Date: Wed, 4 Sep 2024 17:04:01 +0300
Subject: [PATCH v6 10/12] i2c: of-prober: Add GPIO support
In-Reply-To: <20240904090016.2841572-11-wenst@chromium.org>
References: <20240904090016.2841572-1-wenst@chromium.org>
 <20240904090016.2841572-11-wenst@chromium.org>
Message-ID: <Ztho0WuqgFZxpD1Q@smile.fi.intel.com>

On Wed, Sep 04, 2024 at 05:00:12PM +0800, Chen-Yu Tsai wrote:
> This adds GPIO management to the I2C OF component prober.
> Components that the prober intends to probe likely require their
> regulator supplies be enabled, and GPIOs be toggled to enable them or
> bring them out of reset before they will respond to probe attempts.
> regulator support was added in the previous patch.
> 
> Without specific knowledge of each component's resource names or
> power sequencing requirements, the prober can only enable the
> regulator supplies all at once, and toggle the GPIOs all at once.
> Luckily, reset pins tend to be active low, while enable pins tend to
> be active high, so setting the raw status of all GPIO pins to high
> should work. The wait time before and after resources are enabled
> are collected from existing drivers and device trees.
> 
> The prober collects resources from all possible components and enables
> them together, instead of enabling resources and probing each component
> one by one. The latter approach does not provide any boot time benefits
> over simply enabling each component and letting each driver probe
> sequentially.
> 
> The prober will also deduplicate the resources, since on a component
> swap out or co-layout design, the resources are always the same.
> While duplicate regulator supplies won't cause much issue, shared
> GPIOs don't work reliably, especially with other drivers. For the
> same reason, the prober will release the GPIOs before the successfully
> probed component is actually enabled.

...

> +static int i2c_of_probe_get_gpiod(struct device_node *node, struct property *prop,
> +				  struct i2c_of_probe_data *data)
> +{
> +	struct fwnode_handle *fwnode = of_fwnode_handle(node);
> +	struct gpio_descs *gpiods;
> +	struct gpio_desc *gpiod;
> +	char propname[32]; /* 32 is max size of property name */
> +	char *con_id = NULL;
> +	size_t new_size;
> +	int len, ret;
> +
> +	len = gpio_get_property_name_length(prop->name);
> +	if (len < 0)
> +		return 0;
> +
> +	ret = strscpy(propname, prop->name);
> +	if (ret < 0) {
> +		pr_err("%pOF: length of GPIO name \"%s\" exceeds current limit\n",
> +		       node, prop->name);
> +		return -EINVAL;

Any good reason to shadow the error code from strscpy() here?

> +	}
> +
> +	if (len > 0) {
> +		/* "len < ARRAY_SIZE(propname)" guaranteed by strscpy() above */

is guaranteed

> +		propname[len] = '\0';

Please, check if it's guaranteed by strscpy() (IIRC it is, hence redundant line).

> +		con_id = propname;
> +	}
> +
> +	/*
> +	 * GPIO descriptors are not reference counted. GPIOD_FLAGS_BIT_NONEXCLUSIVE
> +	 * can't differentiate between GPIOs shared between devices to be probed and
> +	 * other devices (which is incorrect). If the initial request fails with
> +	 * -EBUSY, retry with GPIOD_FLAGS_BIT_NONEXCLUSIVE and see if it matches
> +	 * any existing ones.
> +	 */
> +	gpiod = fwnode_gpiod_get_index(fwnode, con_id, 0, GPIOD_ASIS, "i2c-of-prober");
> +	if (IS_ERR(gpiod)) {
> +		if (PTR_ERR(gpiod) != -EBUSY || !data->gpiods)
> +			return PTR_ERR(gpiod);
> +
> +		gpiod = fwnode_gpiod_get_index(fwnode, con_id, 0,
> +					       GPIOD_ASIS | GPIOD_FLAGS_BIT_NONEXCLUSIVE,
> +					       "i2c-of-prober");
> +		for (unsigned int i = 0; i < data->gpiods->ndescs; i++)
> +			if (gpiod == data->gpiods->desc[i])
> +				return 1;
> +
> +		return -EBUSY;
> +	}
> +
> +	new_size = struct_size(gpiods, desc, data->gpiods ? data->gpiods->ndescs + 1 : 1);
> +	gpiods = krealloc(data->gpiods, new_size, GFP_KERNEL);
> +	if (!gpiods) {
> +		gpiod_put(gpiod);
> +		return -ENOMEM;
> +	}
> +
> +	data->gpiods = gpiods;
> +	data->gpiods->desc[data->gpiods->ndescs++] = gpiod;
> +
> +	return 1;
> +}

...

> +static int i2c_of_probe_set_gpios(struct device *dev, struct i2c_of_probe_data *data)
> +{
> +	int ret;
> +	int gpio_i;

Why signed? And can it be simply named 'i'?

> +
> +	if (!data->gpiods)
> +		return 0;
> +
> +	for (gpio_i = 0; gpio_i < data->gpiods->ndescs; gpio_i++) {
> +		/*
> +		 * "reset" GPIOs normally have opposite polarity compared to
> +		 * "enable" GPIOs. Instead of parsing the flags again, simply
> +		 * set the raw value to high.
> +		 */
> +		dev_dbg(dev, "Setting GPIO %d\n", gpio_i);
> +		ret = gpiod_direction_output_raw(data->gpiods->desc[gpio_i], 1);
> +		if (ret)
> +			goto disable_gpios;
> +	}
> +
> +	msleep(data->opts->post_reset_deassert_delay_ms);
> +
> +	return 0;
> +
> +disable_gpios:

> +	for (gpio_i--; gpio_i >= 0; gpio_i--)

	while (i--)

> +		gpiod_set_raw_value_cansleep(data->gpiods->desc[gpio_i], 0);
> +
> +	return ret;
> +}


-- 
With Best Regards,
Andy Shevchenko




From gregkh at linuxfoundation.org  Wed Sep  4 07:19:36 2024
From: gregkh at linuxfoundation.org (Greg Kroah-Hartman)
Date: Wed, 4 Sep 2024 16:19:36 +0200
Subject: [PATCH 6.6 1/1] PM: sleep: Restore asynchronous device resume
 optimization
In-Reply-To: <20240902093249.17275-2-yenchia.chen@mediatek.com>
References: <20240902093249.17275-1-yenchia.chen@mediatek.com>
 <20240902093249.17275-2-yenchia.chen@mediatek.com>
Message-ID: <2024090420-protozoan-clench-cca7@gregkh>

On Mon, Sep 02, 2024 at 05:32:48PM +0800, Yenchia Chen wrote:
> From: "Rafael J. Wysocki" <rafael.j.wysocki at intel.com>
> 
> commit 3e999770ac1c7c31a70685dd5b88e89473509e9c upstream.
> 
> Before commit 7839d0078e0d ("PM: sleep: Fix possible deadlocks in core
> system-wide PM code"), the resume of devices that were allowed to resume
> asynchronously was scheduled before starting the resume of the other
> devices, so the former did not have to wait for the latter unless
> functional dependencies were present.
> 
> Commit 7839d0078e0d removed that optimization in order to address a
> correctness issue, but it can be restored with the help of a new device
> power management flag, so do that now.
> 
> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki at intel.com>
> Reviewed-by: Stanislaw Gruszka <stanislaw.gruszka at linux.intel.com>
> Signed-off-by: Yenchia Chen <yenchia.chen at mediatek.com>
> ---
>  drivers/base/power/main.c | 117 +++++++++++++++++++++-----------------
>  include/linux/pm.h        |   1 +
>  2 files changed, 65 insertions(+), 53 deletions(-)

Why does this need to be backported?  What bug is it fixing?

confused,

greg k-h


From robh at kernel.org  Wed Sep  4 08:37:46 2024
From: robh at kernel.org (Rob Herring)
Date: Wed, 4 Sep 2024 10:37:46 -0500
Subject: [PATCH v6 08/12] i2c: Introduce OF component probe function
In-Reply-To: <20240904090016.2841572-9-wenst@chromium.org>
References: <20240904090016.2841572-1-wenst@chromium.org>
 <20240904090016.2841572-9-wenst@chromium.org>
Message-ID: <20240904153746.GA2610341-robh@kernel.org>

On Wed, Sep 04, 2024 at 05:00:10PM +0800, Chen-Yu Tsai wrote:
> Some devices are designed and manufactured with some components having
> multiple drop-in replacement options. These components are often
> connected to the mainboard via ribbon cables, having the same signals
> and pin assignments across all options. These may include the display
> panel and touchscreen on laptops and tablets, and the trackpad on
> laptops. Sometimes which component option is used in a particular device
> can be detected by some firmware provided identifier, other times that
> information is not available, and the kernel has to try to probe each
> device.
> 
> This change attempts to make the "probe each device" case cleaner. The
> current approach is to have all options added and enabled in the device
> tree. The kernel would then bind each device and run each driver's probe
> function. This works, but has been broken before due to the introduction
> of asynchronous probing, causing multiple instances requesting "shared"
> resources, such as pinmuxes, GPIO pins, interrupt lines, at the same
> time, with only one instance succeeding. Work arounds for these include
> moving the pinmux to the parent I2C controller, using GPIO hogs or
> pinmux settings to keep the GPIO pins in some fixed configuration, and
> requesting the interrupt line very late. Such configurations can be seen
> on the MT8183 Krane Chromebook tablets, and the Qualcomm sc8280xp-based
> Lenovo Thinkpad 13S.
> 
> Instead of this delicate dance between drivers and device tree quirks,
> this change introduces a simple I2C component probe. function For a
> given class of devices on the same I2C bus, it will go through all of
> them, doing a simple I2C read transfer and see which one of them responds.
> It will then enable the device that responds.
> 
> This requires some minor modifications in the existing device tree. The
> status for all the device nodes for the component options must be set
> to "failed-needs-probe". This makes it clear that some mechanism is
> needed to enable one of them, and also prevents the prober and device
> drivers running at the same time.
> 
> Signed-off-by: Chen-Yu Tsai <wenst at chromium.org>
> ---
> Changes since v5:
> - Fixed indent in Makefile
> - Split regulator and GPIO TODO items
> - Reversed final conditional in i2c_of_probe_enable_node()
> 
> Changes since v4:
> - Split code into helper functions
> - Use scoped helpers and __free() to reduce error path
> 
> Changes since v3:
> - Complete kernel-doc
> - Return different error if I2C controller is disabled
> - Expand comment to explain assumptions and constraints
> - Split for-loop finding target node and operations on target node
> - Add missing i2c_put_adapter()
> - Move prober code to separate file
> 
> Rob also asked why there was a limitation of "exactly one touchscreen
> will be enabled across the whole tree".
> 
> The use case this prober currently targets is a component on consumer
> electronics (tablet or laptop) being swapped out due to cost or supply
> reasons. Designs with multiple components of the same type are pretty
> rare. The way the next patch is written also assumes this for efficiency
> reasons.
> 
> Changes since v2:
> - New patch split out from "of: Introduce hardware prober driver"
> - Addressed Rob's comments
>   - Move i2c prober to i2c subsystem
>   - Use of_node_is_available() to check if node is enabled.
>   - Use OF changeset API to update status property
> - Addressed Andy's comments
>   - Probe function now accepts "struct device *dev" instead to reduce
>     line length and dereferences
>   - Move "ret = 0" to just before for_each_child_of_node(i2c_node, node)
> ---
>  drivers/i2c/Makefile             |   1 +
>  drivers/i2c/i2c-core-of-prober.c | 158 +++++++++++++++++++++++++++++++
>  include/linux/i2c.h              |   4 +
>  3 files changed, 163 insertions(+)
>  create mode 100644 drivers/i2c/i2c-core-of-prober.c
> 
> diff --git a/drivers/i2c/Makefile b/drivers/i2c/Makefile
> index f12d6b10a85e..c539cdc1e305 100644
> --- a/drivers/i2c/Makefile
> +++ b/drivers/i2c/Makefile
> @@ -9,6 +9,7 @@ i2c-core-objs			:= i2c-core-base.o i2c-core-smbus.o
>  i2c-core-$(CONFIG_ACPI)		+= i2c-core-acpi.o
>  i2c-core-$(CONFIG_I2C_SLAVE)	+= i2c-core-slave.o
>  i2c-core-$(CONFIG_OF)		+= i2c-core-of.o
> +i2c-core-$(CONFIG_OF_DYNAMIC)	+= i2c-core-of-prober.o
>  
>  obj-$(CONFIG_I2C_SMBUS)		+= i2c-smbus.o
>  obj-$(CONFIG_I2C_CHARDEV)	+= i2c-dev.o
> diff --git a/drivers/i2c/i2c-core-of-prober.c b/drivers/i2c/i2c-core-of-prober.c
> new file mode 100644
> index 000000000000..64d7631f4885
> --- /dev/null
> +++ b/drivers/i2c/i2c-core-of-prober.c
> @@ -0,0 +1,158 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +/*
> + * Linux I2C core OF component prober code
> + *
> + * Copyright (C) 2024 Google LLC
> + */
> +
> +#include <linux/cleanup.h>
> +#include <linux/device.h>
> +#include <linux/dev_printk.h>
> +#include <linux/err.h>
> +#include <linux/i2c.h>
> +#include <linux/module.h>
> +#include <linux/of.h>
> +#include <linux/slab.h>
> +
> +/*
> + * Some devices, such as Google Hana Chromebooks, are produced by multiple
> + * vendors each using their preferred components. Such components are all
> + * in the device tree. Instead of having all of them enabled and having each
> + * driver separately try and probe its device while fighting over shared
> + * resources, they can be marked as "fail-needs-probe" and have a prober
> + * figure out which one is actually used beforehand.
> + *
> + * This prober assumes such drop-in parts are on the same I2C bus, have
> + * non-conflicting addresses, and can be directly probed by seeing which
> + * address responds.
> + *
> + * TODO:
> + * - Support handling common regulators.
> + * - Support handling common GPIOs.
> + * - Support I2C muxes
> + */
> +
> +static struct device_node *i2c_of_probe_get_i2c_node(struct device *dev, const char *type)
> +{
> +	struct device_node *node __free(device_node) = of_find_node_by_name(NULL, type);
> +	if (!node)
> +		return dev_err_ptr_probe(dev, -ENODEV, "Could not find %s device node\n", type);
> +
> +	struct device_node *i2c_node __free(device_node) = of_get_parent(node);
> +	if (!of_node_name_eq(i2c_node, "i2c"))
> +		return dev_err_ptr_probe(dev, -EINVAL, "%s device isn't on I2C bus\n", type);
> +
> +	if (!of_device_is_available(i2c_node))
> +		return dev_err_ptr_probe(dev, -ENODEV, "I2C controller not available\n");
> +
> +	return no_free_ptr(i2c_node);
> +}
> +
> +static int i2c_of_probe_enable_node(struct device *dev, struct device_node *node)
> +{
> +	int ret;
> +
> +	dev_info(dev, "Enabling %pOF\n", node);
> +
> +	struct of_changeset *ocs __free(kfree) = kzalloc(sizeof(*ocs), GFP_KERNEL);
> +	if (!ocs)
> +		return -ENOMEM;
> +
> +	of_changeset_init(ocs);
> +	ret = of_changeset_update_prop_string(ocs, node, "status", "okay");
> +	if (ret)
> +		return ret;
> +
> +	ret = of_changeset_apply(ocs);
> +	if (ret) {
> +		/* ocs needs to be explicitly cleaned up before being freed. */
> +		of_changeset_destroy(ocs);
> +	} else {
> +		/*
> +		 * ocs is intentionally kept around as it needs to
> +		 * exist as long as the change is applied.
> +		 */
> +		void *ptr __always_unused = no_free_ptr(ocs);
> +	}
> +
> +	return ret;
> +}
> +
> +/**
> + * i2c_of_probe_component() - probe for devices of "type" on the same i2c bus
> + * @dev: &struct device of the caller, only used for dev_* printk messages
> + * @type: a string to match the device node name prefix to probe for
> + *
> + * Probe for possible I2C components of the same "type" on the same I2C bus
> + * that have their status marked as "fail".
> + *
> + * Assumes that across the entire device tree the only instances of nodes
> + * prefixed with "type" are the ones that need handling for second source
> + * components. In other words, if type is "touchscreen", then all device
> + * nodes named "touchscreen*" are the ones that need probing. There cannot
> + * be another "touchscreen" node that is already enabled.
> + *
> + * Assumes that for each "type" of component, only one actually exists. In
> + * other words, only one matching and existing device will be enabled.
> + *
> + * Context: Process context only. Does non-atomic I2C transfers.
> + *          Should only be used from a driver probe function, as the function
> + *          can return -EPROBE_DEFER if the I2C adapter is unavailable.
> + * Return: 0 on success or no-op, error code otherwise.
> + *         A no-op can happen when it seems like the device tree already
> + *         has components of the type to be probed already enabled. This
> + *         can happen when the device tree had not been updated to mark
> + *         the status of the to-be-probed components as "fail". Or this
> + *         function was already run with the same parameters and succeeded
> + *         in enabling a component. The latter could happen if the user
> + *         had multiple types of components to probe, and one of them down
> + *         the list caused a deferred probe. This is expected behavior.
> + */
> +int i2c_of_probe_component(struct device *dev, const char *type)
> +{
> +	struct i2c_adapter *i2c;
> +	int ret;
> +
> +	struct device_node *i2c_node __free(device_node) = i2c_of_probe_get_i2c_node(dev, type);
> +	if (IS_ERR(i2c_node))
> +		return PTR_ERR(i2c_node);
> +
> +	for_each_child_of_node_scoped(i2c_node, node) {

for_each_available_child_of_node_scoped()


> +		if (!of_node_name_prefix(node, type))
> +			continue;
> +		if (!of_device_is_available(node))
> +			continue;
> +
> +		/*
> +		 * Device tree has component already enabled. Either the
> +		 * device tree isn't supported or we already probed once.
> +		 */
> +		return 0;
> +	}


From broonie at kernel.org  Wed Sep  4 08:55:50 2024
From: broonie at kernel.org (Mark Brown)
Date: Wed, 04 Sep 2024 16:55:50 +0100
Subject: [PATCH] ASoC: mediatek: mt2701-cs42448: Optimize redundant
 code in mt2701_cs42448_machine_probe
In-Reply-To: <20240903093623.7120-1-liujing@cmss.chinamobile.com>
References: <20240903093623.7120-1-liujing@cmss.chinamobile.com>
Message-ID: <172546535092.70927.12098749632274765487.b4-ty@kernel.org>

On Tue, 03 Sep 2024 17:36:23 +0800, Liu Jing wrote:
> Utilize the defined parameter 'dev' to make the code cleaner.
> 
> 

Applied to

   https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git for-next

Thanks!

[1/1] ASoC: mediatek: mt2701-cs42448: Optimize redundant code in mt2701_cs42448_machine_probe
      commit: 77e6a5e40aa393492cf3f1d2623d7d1dff7f33de

All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.

You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.

If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.

Please add any relevant lists and maintainers to the CCs when replying
to this mail.

Thanks,
Mark



From broonie at kernel.org  Wed Sep  4 10:19:41 2024
From: broonie at kernel.org (Mark Brown)
Date: Wed, 04 Sep 2024 18:19:41 +0100
Subject: (subset) [PATCH v6 00/12] platform/chrome: Introduce DT
 hardware prober
In-Reply-To: <20240904090016.2841572-1-wenst@chromium.org>
References: <20240904090016.2841572-1-wenst@chromium.org>
Message-ID: <172547038191.87336.8695106953397068225.b4-ty@kernel.org>

On Wed, 04 Sep 2024 17:00:02 +0800, Chen-Yu Tsai wrote:
> This is v6 of my "of: Introduce hardware prober driver" [1] series.
> v6 mainly addresses comments from Andy.
> 
> v2 continued Doug's "of: device: Support 2nd sources of probeable but
> undiscoverable devices" [2] series, but follows the scheme suggested by
> Rob, marking all second source component device nodes as "fail-needs-probe",
> and having a hardware prober driver enable the one of them.
> 
> [...]

Applied to

   https://git.kernel.org/pub/scm/linux/kernel/git/broonie/regulator.git for-next

Thanks!

[03/12] regulator: Move OF-specific regulator lookup code to of_regulator.c
        commit: b8c3255457147162cd713a319a8e2274335449b9

All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.

You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.

If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.

Please add any relevant lists and maintainers to the CCs when replying
to this mail.

Thanks,
Mark



From tjmercier at google.com  Wed Sep  4 14:42:28 2024
From: tjmercier at google.com (T.J. Mercier)
Date: Wed, 4 Sep 2024 14:42:28 -0700
Subject: [RFC PATCH 4/4] dma-buf: heaps: add Linaro restricted dmabuf heap support
In-Reply-To: <CAHUa44FYYFVQWf0DGUXNHoOVQEC0-HRyYa0386dHNjo4y1qSiQ@mail.gmail.com>
References: <20240830070351.2855919-1-jens.wiklander@linaro.org>
 <20240830070351.2855919-5-jens.wiklander@linaro.org> <CABdmKX2KzswmiDY4oWw69_rPWs8d_Cqp7OXouSeMQaYX1SDSmw@mail.gmail.com>
 <CAHUa44FYYFVQWf0DGUXNHoOVQEC0-HRyYa0386dHNjo4y1qSiQ@mail.gmail.com>
Message-ID: <CABdmKX0qd0RoTn2TBQTs9zdf=_JP8pW8hFRUR_7n_t-sfxsGdg@mail.gmail.com>

On Wed, Sep 4, 2024 at 2:44?AM Jens Wiklander <jens.wiklander at linaro.org> wrote:
>
> On Tue, Sep 3, 2024 at 7:50?PM T.J. Mercier <tjmercier at google.com> wrote:
> >
> > On Fri, Aug 30, 2024 at 12:04?AM Jens Wiklander
> > <jens.wiklander at linaro.org> wrote:
> > >
> > > Add a Linaro restricted heap using the linaro,restricted-heap bindings
> > > implemented based on the generic restricted heap.
> > >
> > > The bindings defines a range of physical restricted memory. The heap
> > > manages this address range using genalloc. The allocated dma-buf file
> > > descriptor can later be registered with the TEE subsystem for later use
> > > via Trusted Applications in the secure world.
> > >
> > > Co-developed-by: Olivier Masse <olivier.masse at nxp.com>
> > > Signed-off-by: Olivier Masse <olivier.masse at nxp.com>
> > > Signed-off-by: Jens Wiklander <jens.wiklander at linaro.org>
> > > ---
> > >  drivers/dma-buf/heaps/Kconfig                 |  10 ++
> > >  drivers/dma-buf/heaps/Makefile                |   1 +
> > >  .../dma-buf/heaps/restricted_heap_linaro.c    | 165 ++++++++++++++++++
> > >  3 files changed, 176 insertions(+)
> > >  create mode 100644 drivers/dma-buf/heaps/restricted_heap_linaro.c
> > >
> > > diff --git a/drivers/dma-buf/heaps/Kconfig b/drivers/dma-buf/heaps/Kconfig
> > > index 58903bc62ac8..82e2c5d09242 100644
> > > --- a/drivers/dma-buf/heaps/Kconfig
> > > +++ b/drivers/dma-buf/heaps/Kconfig
> > > @@ -28,3 +28,13 @@ config DMABUF_HEAPS_RESTRICTED_MTK
> > >         help
> > >           Enable restricted dma-buf heaps for MediaTek platform. This heap is backed by
> > >           TEE client interfaces. If in doubt, say N.
> > > +
> > > +config DMABUF_HEAPS_RESTRICTED_LINARO
> > > +       bool "Linaro DMA-BUF Restricted Heap"
> > > +       depends on DMABUF_HEAPS_RESTRICTED
> > > +       help
> > > +         Choose this option to enable the Linaro restricted dma-buf heap.
> > > +         The restricted heap pools are defined according to the DT. Heaps
> > > +         are allocated in the pools using gen allocater.
> > > +         If in doubt, say N.
> > > +
> > > diff --git a/drivers/dma-buf/heaps/Makefile b/drivers/dma-buf/heaps/Makefile
> > > index 0028aa9d875f..66b2f67c47b5 100644
> > > --- a/drivers/dma-buf/heaps/Makefile
> > > +++ b/drivers/dma-buf/heaps/Makefile
> > > @@ -2,4 +2,5 @@
> > >  obj-$(CONFIG_DMABUF_HEAPS_CMA)         += cma_heap.o
> > >  obj-$(CONFIG_DMABUF_HEAPS_RESTRICTED)  += restricted_heap.o
> > >  obj-$(CONFIG_DMABUF_HEAPS_RESTRICTED_MTK)      += restricted_heap_mtk.o
> > > +obj-$(CONFIG_DMABUF_HEAPS_RESTRICTED_LINARO)   += restricted_heap_linaro.o
> > >  obj-$(CONFIG_DMABUF_HEAPS_SYSTEM)      += system_heap.o
> > > diff --git a/drivers/dma-buf/heaps/restricted_heap_linaro.c b/drivers/dma-buf/heaps/restricted_heap_linaro.c
> > > new file mode 100644
> > > index 000000000000..4b08ed514023
> > > --- /dev/null
> > > +++ b/drivers/dma-buf/heaps/restricted_heap_linaro.c
> > > @@ -0,0 +1,165 @@
> > > +// SPDX-License-Identifier: GPL-2.0
> > > +/*
> > > + * DMABUF secure heap exporter
> > > + *
> > > + * Copyright 2021 NXP.
> > > + * Copyright 2024 Linaro Limited.
> > > + */
> > > +
> > > +#define pr_fmt(fmt)     "rheap_linaro: " fmt
> > > +
> > > +#include <linux/dma-buf.h>
> > > +#include <linux/err.h>
> > > +#include <linux/genalloc.h>
> > > +#include <linux/module.h>
> > > +#include <linux/of.h>
> > > +#include <linux/of_fdt.h>
> > > +#include <linux/of_reserved_mem.h>
> > > +#include <linux/scatterlist.h>
> > > +#include <linux/slab.h>
> > > +
> > > +#include "restricted_heap.h"
> > > +
> > > +#define MAX_HEAP_COUNT 2
> >
> > Are multiple supported because of what Cyrille mentioned here about permissions?
> > https://lore.kernel.org/lkml/DBBPR04MB7514E006455AEA407041E4F788709 at DBBPR04MB7514.eurprd04.prod.outlook.com/
>
> Yes, I kept that as is.

Ok thanks.

> > So this is just some arbitrary limit? I'd prefer to have some sort of
> > documentation about this.
>
> How about removing the limit and using dynamic allocation instead?

That works too!

>
> Thanks,
> Jens
>
> >
> >
> > > +#define HEAP_NAME_LEN  32
> > > +
> > > +struct resmem_restricted {
> > > +       phys_addr_t base;
> > > +       phys_addr_t size;
> > > +
> > > +       char name[HEAP_NAME_LEN];
> > > +
> > > +       bool no_map;
> > > +};
> > > +
> > > +static struct resmem_restricted restricted_data[MAX_HEAP_COUNT] = {0};
> > > +static unsigned int restricted_data_count;
> > > +
> > > +static int linaro_restricted_memory_allocate(struct restricted_heap *heap,
> > > +                                            struct restricted_buffer *buf)
> > > +{
> > > +       struct gen_pool *pool = heap->priv_data;
> > > +       unsigned long pa;
> > > +       int ret;
> > > +
> > > +       buf->size = ALIGN(buf->size, PAGE_SIZE);
> > > +       pa = gen_pool_alloc(pool, buf->size);
> > > +       if (!pa)
> > > +               return -ENOMEM;
> > > +
> > > +       ret = sg_alloc_table(&buf->sg_table, 1, GFP_KERNEL);
> > > +       if (ret) {
> > > +               gen_pool_free(pool, pa, buf->size);
> > > +               return ret;
> > > +       }
> > > +
> > > +       sg_set_page(buf->sg_table.sgl, phys_to_page(pa), buf->size, 0);
> > > +
> > > +       return 0;
> > > +}
> > > +
> > > +static void linaro_restricted_memory_free(struct restricted_heap *heap,
> > > +                                         struct restricted_buffer *buf)
> > > +{
> > > +       struct gen_pool *pool = heap->priv_data;
> > > +       struct scatterlist *sg;
> > > +       unsigned int i;
> > > +
> > > +       for_each_sg(buf->sg_table.sgl, sg, buf->sg_table.nents, i)
> > > +               gen_pool_free(pool, page_to_phys(sg_page(sg)), sg->length);
> > > +       sg_free_table(&buf->sg_table);
> > > +}
> > > +
> > > +static const struct restricted_heap_ops linaro_restricted_heap_ops = {
> > > +       .alloc = linaro_restricted_memory_allocate,
> > > +       .free = linaro_restricted_memory_free,
> > > +};
> > > +
> > > +static int add_heap(struct resmem_restricted *mem)
> > > +{
> > > +       struct restricted_heap *heap;
> > > +       struct gen_pool *pool;
> > > +       int ret;
> > > +
> > > +       if (mem->base == 0 || mem->size == 0) {
> > > +               pr_err("restricted_data base or size is not correct\n");
> > > +               return -EINVAL;
> > > +       }
> > > +
> > > +       heap = kzalloc(sizeof(*heap), GFP_KERNEL);
> > > +       if (!heap)
> > > +               return -ENOMEM;
> > > +
> > > +       pool = gen_pool_create(PAGE_SHIFT, -1);
> > > +       if (!pool) {
> > > +               ret = -ENOMEM;
> > > +               goto err_free_heap;
> > > +       }
> > > +
> > > +       ret = gen_pool_add(pool, mem->base, mem->size, -1);
> > > +       if (ret)
> > > +               goto err_free_pool;
> > > +
> > > +       heap->no_map = mem->no_map;
> > > +       heap->priv_data = pool;
> > > +       heap->name = mem->name;
> > > +       heap->ops = &linaro_restricted_heap_ops;
> > > +
> > > +       ret = restricted_heap_add(heap);
> > > +       if (ret)
> > > +               goto err_free_pool;
> > > +
> > > +       return 0;
> > > +
> > > +err_free_pool:
> > > +       gen_pool_destroy(pool);
> > > +err_free_heap:
> > > +       kfree(heap);
> > > +
> > > +       return ret;
> > > +}
> > > +
> > > +static int __init rmem_restricted_heap_setup(struct reserved_mem *rmem)
> > > +{
> > > +       size_t len = HEAP_NAME_LEN;
> > > +       const char *s;
> > > +       bool no_map;
> > > +
> > > +       if (WARN_ONCE(restricted_data_count >= MAX_HEAP_COUNT,
> > > +                     "Cannot handle more than %u restricted heaps\n",
> > > +                     MAX_HEAP_COUNT))
> > > +               return -EINVAL;
> > > +
> > > +       no_map = of_get_flat_dt_prop(rmem->fdt_node, "no-map", NULL);
> > > +       s = strchr(rmem->name, '@');
> > > +       if (s)
> > > +               len = umin(s - rmem->name + 1, len);
> > > +
> > > +       restricted_data[restricted_data_count].base = rmem->base;
> > > +       restricted_data[restricted_data_count].size = rmem->size;
> > > +       restricted_data[restricted_data_count].no_map = no_map;
> > > +       strscpy(restricted_data[restricted_data_count].name, rmem->name, len);
> > > +
> > > +       restricted_data_count++;
> > > +       return 0;
> > > +}
> > > +
> > > +RESERVEDMEM_OF_DECLARE(linaro_restricted_heap, "linaro,restricted-heap",
> > > +                      rmem_restricted_heap_setup);
> > > +
> > > +static int linaro_restricted_heap_init(void)
> > > +{
> > > +       unsigned int i;
> > > +       int ret;
> > > +
> > > +       for (i = 0; i < restricted_data_count; i++) {
> > > +               ret = add_heap(&restricted_data[i]);
> > > +               if (ret)
> > > +                       return ret;
> > > +       }
> > > +       return 0;
> > > +}
> > > +
> > > +module_init(linaro_restricted_heap_init);
> > > +MODULE_DESCRIPTION("Linaro Restricted Heap Driver");
> > > +MODULE_LICENSE("GPL");
> > > --
> > > 2.34.1
> > >


From dianders at chromium.org  Wed Sep  4 15:57:18 2024
From: dianders at chromium.org (Doug Anderson)
Date: Wed, 4 Sep 2024 15:57:18 -0700
Subject: [PATCH v6 09/12] i2c: of-prober: Add regulator support
In-Reply-To: <20240904090016.2841572-10-wenst@chromium.org>
References: <20240904090016.2841572-1-wenst@chromium.org> <20240904090016.2841572-10-wenst@chromium.org>
Message-ID: <CAD=FV=UGOz3Xzg7reJKP=tA1LqTxszv5w-CL9krmoXQtXdJLaQ@mail.gmail.com>

Hi,

On Wed, Sep 4, 2024 at 2:01?AM Chen-Yu Tsai <wenst at chromium.org> wrote:
>
> This adds regulator management to the I2C OF component prober.
> Components that the prober intends to probe likely require their
> regulator supplies be enabled, and GPIOs be toggled to enable them or
> bring them out of reset before they will respond to probe attempts.
> GPIOs will be handled in the next patch.
>
> Without specific knowledge of each component's resource names or
> power sequencing requirements, the prober can only enable the
> regulator supplies all at once, and toggle the GPIOs all at once.
> Luckily, reset pins tend to be active low, while enable pins tend to
> be active high, so setting the raw status of all GPIO pins to high
> should work. The wait time before and after resources are enabled
> are collected from existing drivers and device trees.
>
> The prober collects resources from all possible components and enables
> them together, instead of enabling resources and probing each component
> one by one. The latter approach does not provide any boot time benefits
> over simply enabling each component and letting each driver probe
> sequentially.
>
> The prober will also deduplicate the resources, since on a component
> swap out or co-layout design, the resources are always the same.
> While duplicate regulator supplies won't cause much issue, shared
> GPIOs don't work reliably, especially with other drivers. For the
> same reason, the prober will release the GPIOs before the successfully
> probed component is actually enabled.
>
> Signed-off-by: Chen-Yu Tsai <wenst at chromium.org>
> ---
> Changes since v5:
> - Split of_regulator_bulk_get_all() return value check and explain
>   "ret == 0" case
> - Switched to of_get_next_child_with_prefix_scoped() where applicable
> - Used krealloc_array() instead of directly calculating size
> - copy whole regulator array in one memcpy() call
> - Drop "0" from struct zeroing initializer
> - Split out regulator helper from i2c_of_probe_enable_res() to keep
>   code cleaner when combined with the next patch
> - Added options for customizing power sequencing delay
> - Rename i2c_of_probe_get_regulator() to i2c_of_probe_get_regulators()
> - Add i2c_of_probe_free_regulator() helper
>
> Changes since v4:
> - Split out GPIO handling to separate patch
> - Rewrote using of_regulator_bulk_get_all()
> - Replaced "regulators" with "regulator supplies" in debug messages
>
> Changes since v3:
> - New patch
>
> This change is kept as a separate patch for now since the changes are
> quite numerous.
> ---
>  drivers/i2c/i2c-core-of-prober.c | 154 +++++++++++++++++++++++++++++--
>  include/linux/i2c.h              |  10 +-
>  2 files changed, 155 insertions(+), 9 deletions(-)

I never jumped back into looking at this since you started sending new
versions last month (sorry), but I finally did...

At a high level, I have to say I'm not really a fan of the "reach into
all of the devices, jam their regulators on, force their GPIOs high,
and hope for the best" approach. It just feels like it's going to
break at the first bit of slightly different hardware and cause power
sequence violations left and right. If nothing else, regulators often
need delays between when one regulator is enabled and the next. There
may also be complex relationships between regulators and GPIOs, GPIOs,
GPIOs that need to be low, or even GPIO "toggle sequences" (power on
rail 1, wait 1 ms, assert reset, wait 10 ms, deassert reset, power on
rail 2).

IMO the only way to make this reliable is to have this stuff be much
less automatic and much more driven by the board.

I think that, in general, before the board prober checks i2c address
then the prober should be in charge of setting up pinctrl and turning
on regulators / GPIOs. Given that the same regulator(s) and GPIO(s)
may be specified by different children, the prober will just have to
pick one child to find those resources. It should have enough
board-specific knowledge to make this choice. Then the prober should
turn them on via a board-specific power-on sequence that's known to
work for all the children. Then it should start probing.

I think there can still be plenty of common helper functions that the
board-specific prober can leverage, but overall I'd expect the actual
power-on and power-off code to be board-specific.

If many boards have in common that we need to turn on exactly one
regulator + one GPIO, or just one regulator, or whatever then having a
helper function that handles these cases is fine. ...but it should be
one of many choices that a board proper could use and not the only
one.

-Doug


From benjamin.larsson at genexis.eu  Wed Sep  4 16:09:48 2024
From: benjamin.larsson at genexis.eu (Benjamin Larsson)
Date: Thu, 5 Sep 2024 01:09:48 +0200
Subject: [PATCH v3 5/5] pwm: airoha: Add support for EN7581 SoC
In-Reply-To: <t2f5kockuvfi66qqumda6jxf5a4c4zf35ld5ainsnksavkchyj@kdueaqlhjoar>
References: <20240831-en7581-pinctrl-v3-0-98eebfb4da66@kernel.org>
 <20240831-en7581-pinctrl-v3-5-98eebfb4da66@kernel.org>
 <yfqmlca6cnhrghpo5s6tml36tngmekcfbyjakxs7or7wtap3ka@7qlrxjowo4ou>
 <d9298199-fe10-4b28-8e28-dc252bd6832c@genexis.eu>
 <t2f5kockuvfi66qqumda6jxf5a4c4zf35ld5ainsnksavkchyj@kdueaqlhjoar>
Message-ID: <b7e44fb2-6cf6-4530-a271-9e1730d4f431@genexis.eu>

Hi.

On 03/09/2024 17:47, Uwe Kleine-K?nig wrote:
> Hello Benjamin,
>
> On Tue, Sep 03, 2024 at 01:58:30PM +0200, Benjamin Larsson wrote:
>> On 2024-09-03 12:46, Uwe Kleine-K?nig wrote:
>>> Would you please add a "Limitations" paragraph here covering the
>>> following questions:
>>>
>>>    - How does the hardware behave on changes of configuration (does it
>>>      complete the currently running period? Are there any glitches?)
>>>    - How does the hardware behave on disabling?
>>>
>>> Please stick to the format used in several other drivers such that
>>>
>>> 	sed -rn '/Limitations:/,/\*\/?$/p' drivers/pwm/*.c
>>>
>>> emits the informations.
>> The answer to your questions are currently unknown. Is this information
>> needed for a merge of the driver ?
> It would be very welcome and typically isn't that hard to work out if
> you have an LED connected to the output or a similar means to observe
> the output. An oscilloscope makes it still easier.
>
> For example to check if the current period is completed configure the
> PWM with period = 1s and duty_cycle = 0 disabling the LED. (I leave it
> as an exercise for the reader what to do if duty_cycle = 0 enables the
> LED :-) Then do:
>
> 	pwm_apply_might_sleep(mypwm, &(struct pwm_state){
> 		.period = NSEC_PER_SEC,
> 		.duty_cycle = NSEC_PER_SEC,
> 		.enabled = true,
> 	});
> 	pwm_apply_might_sleep(mypwm, &(struct pwm_state){
> 		.period = NSEC_PER_SEC,
> 		.duty_cycle = 0,
> 		.enabled = true,
> 	});
>
> Iff that enables the LED for a second, the period is completed. The
> question about glitches is a bit harder to answer, but with a tool like
> memtool should be possible to answer. Alternatively add delays and
> printk output to .apply() in the critical places.
>
>

I connected a logic analyzer to a pin and configured the pwm for it.

I then configured the pwm with these parameters (setup for 2Hz).

echo 1000000000 > /sys/class/pwm/pwmchip0/pwm12/period
echo 0 > /sys/class/pwm/pwmchip0/pwm12/duty_cycle

If I then ran the following (in a script) no pulse was detected:

echo 500000000 > /sys/class/pwm/pwmchip0/pwm12/duty_cycle
echo 0 > /sys/class/pwm/pwmchip0/pwm12/duty_cycle

If I added a sleep 1 in between I always got 1 500ms pulse.

I then did the same but with direct register access with the same 
result. Setting the duty cycle to 0 disables the pwm function on the 
pin, it seems to take a while before it properly activates but before it 
disables it the cycle completes.


I also tested with enabling the pwn signal and then setting a 0 duty 
cycle. The last observed pulse was always 500ms long.


I am not sure what of your questions this answers and is there some 
other tests I should perform ?

For the record while toggling the registers I noticed that it was 
actually possible to generate 1 second long pulses. The documentation is 
not clear on this part.

MvH

Benjamin Larsson



From make24 at iscas.ac.cn  Wed Sep  4 18:47:53 2024
From: make24 at iscas.ac.cn (Ma Ke)
Date: Thu,  5 Sep 2024 09:47:53 +0800
Subject: [PATCH] mt76: mt7615: check devm_kasprintf() returned value
Message-ID: <20240905014753.353271-1-make24@iscas.ac.cn>

devm_kasprintf() can return a NULL pointer on failure but this returned
value is not checked. Fix this lack and check the returned value.

Found by code review.

Cc: stable at vger.kernel.org
Fixes: 0bb4e9187ea4 ("mt76: mt7615: fix hwmon temp sensor mem use-after-free")
Signed-off-by: Ma Ke <make24 at iscas.ac.cn>
---
 drivers/net/wireless/mediatek/mt76/mt7615/init.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/init.c b/drivers/net/wireless/mediatek/mt76/mt7615/init.c
index f7722f67db57..0b9ebdcda221 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7615/init.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7615/init.c
@@ -56,6 +56,9 @@ int mt7615_thermal_init(struct mt7615_dev *dev)
 
 	name = devm_kasprintf(&wiphy->dev, GFP_KERNEL, "mt7615_%s",
 			      wiphy_name(wiphy));
+	if (!name)
+		return -ENOMEM;
+
 	hwmon = devm_hwmon_device_register_with_groups(&wiphy->dev, name, dev,
 						       mt7615_hwmon_groups);
 	return PTR_ERR_OR_ZERO(hwmon);
-- 
2.25.1



From liujing at cmss.chinamobile.com  Wed Sep  4 11:54:17 2024
From: liujing at cmss.chinamobile.com (Liu Jing)
Date: Thu,  5 Sep 2024 02:54:17 +0800
Subject: [PATCH] remoteproc:remove redundant dev_err message
Message-ID: <20240904185417.14357-1-liujing@cmss.chinamobile.com>

devm_ioremap_resource already contains error message, so remove
the redundant dev_err message

Signed-off-by: Liu Jing <liujing at cmss.chinamobile.com>

diff --git a/drivers/remoteproc/da8xx_remoteproc.c b/drivers/remoteproc/da8xx_remoteproc.c
index 9041a0e07fb2..289d5ce9f7af 100644
--- a/drivers/remoteproc/da8xx_remoteproc.c
+++ b/drivers/remoteproc/da8xx_remoteproc.c
@@ -214,8 +214,6 @@ static int da8xx_rproc_get_internal_memories(struct platform_device *pdev,
 						   mem_names[i]);
 		drproc->mem[i].cpu_addr = devm_ioremap_resource(dev, res);
 		if (IS_ERR(drproc->mem[i].cpu_addr)) {
-			dev_err(dev, "failed to parse and map %s memory\n",
-				mem_names[i]);
 			return PTR_ERR(drproc->mem[i].cpu_addr);
 		}
 		drproc->mem[i].bus_addr = res->start;
diff --git a/drivers/remoteproc/ingenic_rproc.c b/drivers/remoteproc/ingenic_rproc.c
index 9902cce28692..b3ee5c47001d 100644
--- a/drivers/remoteproc/ingenic_rproc.c
+++ b/drivers/remoteproc/ingenic_rproc.c
@@ -186,7 +186,6 @@ static int ingenic_rproc_probe(struct platform_device *pdev)
 	mem = platform_get_resource_byname(pdev, IORESOURCE_MEM, "aux");
 	vpu->aux_base = devm_ioremap_resource(dev, mem);
 	if (IS_ERR(vpu->aux_base)) {
-		dev_err(dev, "Failed to ioremap\n");
 		return PTR_ERR(vpu->aux_base);
 	}
 
@@ -197,7 +196,6 @@ static int ingenic_rproc_probe(struct platform_device *pdev)
 		vpu->mem_info[i].base = devm_ioremap_resource(dev, mem);
 		if (IS_ERR(vpu->mem_info[i].base)) {
 			ret = PTR_ERR(vpu->mem_info[i].base);
-			dev_err(dev, "Failed to ioremap\n");
 			return ret;
 		}
 
diff --git a/drivers/remoteproc/keystone_remoteproc.c b/drivers/remoteproc/keystone_remoteproc.c
index 7e57b90bcaf8..a31f94a290c9 100644
--- a/drivers/remoteproc/keystone_remoteproc.c
+++ b/drivers/remoteproc/keystone_remoteproc.c
@@ -312,8 +312,6 @@ static int keystone_rproc_of_get_memories(struct platform_device *pdev,
 						   mem_names[i]);
 		ksproc->mem[i].cpu_addr = devm_ioremap_resource(dev, res);
 		if (IS_ERR(ksproc->mem[i].cpu_addr)) {
-			dev_err(dev, "failed to parse and map %s memory\n",
-				mem_names[i]);
 			return PTR_ERR(ksproc->mem[i].cpu_addr);
 		}
 		ksproc->mem[i].bus_addr = res->start;
diff --git a/drivers/remoteproc/mtk_scp.c b/drivers/remoteproc/mtk_scp.c
index e744c07507ee..cb8ad16583c7 100644
--- a/drivers/remoteproc/mtk_scp.c
+++ b/drivers/remoteproc/mtk_scp.c
@@ -1126,7 +1126,6 @@ static struct mtk_scp *scp_rproc_init(struct platform_device *pdev,
 	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "sram");
 	scp->sram_base = devm_ioremap_resource(dev, res);
 	if (IS_ERR(scp->sram_base)) {
-		dev_err(dev, "Failed to parse and map sram memory\n");
 		return ERR_CAST(scp->sram_base);
 	}
 
diff --git a/drivers/remoteproc/omap_remoteproc.c b/drivers/remoteproc/omap_remoteproc.c
index 9ae2e831456d..07e707776cf9 100644
--- a/drivers/remoteproc/omap_remoteproc.c
+++ b/drivers/remoteproc/omap_remoteproc.c
@@ -1201,8 +1201,6 @@ static int omap_rproc_of_get_internal_memories(struct platform_device *pdev,
 		}
 		oproc->mem[i].cpu_addr = devm_ioremap_resource(dev, res);
 		if (IS_ERR(oproc->mem[i].cpu_addr)) {
-			dev_err(dev, "failed to parse and map %s memory\n",
-				data->mems[i].name);
 			return PTR_ERR(oproc->mem[i].cpu_addr);
 		}
 		oproc->mem[i].bus_addr = res->start;
diff --git a/drivers/remoteproc/pru_rproc.c b/drivers/remoteproc/pru_rproc.c
index 327f0c7ee3d6..85b95e025c17 100644
--- a/drivers/remoteproc/pru_rproc.c
+++ b/drivers/remoteproc/pru_rproc.c
@@ -1047,8 +1047,6 @@ static int pru_rproc_probe(struct platform_device *pdev)
 						   mem_names[i]);
 		pru->mem_regions[i].va = devm_ioremap_resource(dev, res);
 		if (IS_ERR(pru->mem_regions[i].va)) {
-			dev_err(dev, "failed to parse and map memory resource %d %s\n",
-				i, mem_names[i]);
 			ret = PTR_ERR(pru->mem_regions[i].va);
 			return ret;
 		}
diff --git a/drivers/remoteproc/qcom_q6v5_adsp.c b/drivers/remoteproc/qcom_q6v5_adsp.c
index 572dcb0f055b..fe65ffa9a93f 100644
--- a/drivers/remoteproc/qcom_q6v5_adsp.c
+++ b/drivers/remoteproc/qcom_q6v5_adsp.c
@@ -602,7 +602,6 @@ static int adsp_init_mmio(struct qcom_adsp *adsp,
 	} else {
 		adsp->lpass_efuse = devm_ioremap_resource(&pdev->dev, efuse_region);
 		if (IS_ERR(adsp->lpass_efuse)) {
-			dev_err(adsp->dev, "failed to map efuse registers\n");
 			return PTR_ERR(adsp->lpass_efuse);
 		}
 	}
diff --git a/drivers/remoteproc/st_slim_rproc.c b/drivers/remoteproc/st_slim_rproc.c
index d17719384c16..a6e50f51c794 100644
--- a/drivers/remoteproc/st_slim_rproc.c
+++ b/drivers/remoteproc/st_slim_rproc.c
@@ -251,7 +251,6 @@ struct st_slim_rproc *st_slim_rproc_alloc(struct platform_device *pdev,
 
 		slim_rproc->mem[i].cpu_addr = devm_ioremap_resource(dev, res);
 		if (IS_ERR(slim_rproc->mem[i].cpu_addr)) {
-			dev_err(&pdev->dev, "devm_ioremap_resource failed\n");
 			err = PTR_ERR(slim_rproc->mem[i].cpu_addr);
 			goto err;
 		}
@@ -262,7 +261,6 @@ struct st_slim_rproc *st_slim_rproc_alloc(struct platform_device *pdev,
 	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "slimcore");
 	slim_rproc->slimcore = devm_ioremap_resource(dev, res);
 	if (IS_ERR(slim_rproc->slimcore)) {
-		dev_err(&pdev->dev, "failed to ioremap slimcore IO\n");
 		err = PTR_ERR(slim_rproc->slimcore);
 		goto err;
 	}
@@ -270,7 +268,6 @@ struct st_slim_rproc *st_slim_rproc_alloc(struct platform_device *pdev,
 	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "peripherals");
 	slim_rproc->peri = devm_ioremap_resource(dev, res);
 	if (IS_ERR(slim_rproc->peri)) {
-		dev_err(&pdev->dev, "failed to ioremap peripherals IO\n");
 		err = PTR_ERR(slim_rproc->peri);
 		goto err;
 	}
diff --git a/drivers/remoteproc/wkup_m3_rproc.c b/drivers/remoteproc/wkup_m3_rproc.c
index 36a55f7ffa64..5648f450c018 100644
--- a/drivers/remoteproc/wkup_m3_rproc.c
+++ b/drivers/remoteproc/wkup_m3_rproc.c
@@ -186,8 +186,6 @@ static int wkup_m3_rproc_probe(struct platform_device *pdev)
 						   mem_names[i]);
 		wkupm3->mem[i].cpu_addr = devm_ioremap_resource(dev, res);
 		if (IS_ERR(wkupm3->mem[i].cpu_addr)) {
-			dev_err(&pdev->dev, "devm_ioremap_resource failed for resource %d\n",
-				i);
 			ret = PTR_ERR(wkupm3->mem[i].cpu_addr);
 			goto err_put_rproc;
 		}
-- 
2.33.0





From wenst at chromium.org  Wed Sep  4 20:52:32 2024
From: wenst at chromium.org (Chen-Yu Tsai)
Date: Thu, 5 Sep 2024 11:52:32 +0800
Subject: [PATCH v6 11/12] platform/chrome: Introduce device tree hardware prober
In-Reply-To: <Ztgxlmhnkn7NVC81@google.com>
References: <20240904090016.2841572-1-wenst@chromium.org> <20240904090016.2841572-12-wenst@chromium.org>
 <Ztgxlmhnkn7NVC81@google.com>
Message-ID: <CAGXv+5GpKu-b4_dbRcuSG4NxQi_FKh9p7iMh6DfgavkLFdLLdQ@mail.gmail.com>

On Wed, Sep 4, 2024 at 6:08?PM Tzung-Bi Shih <tzungbi at kernel.org> wrote:
>
> On Wed, Sep 04, 2024 at 05:00:13PM +0800, Chen-Yu Tsai wrote:
> > diff --git a/drivers/platform/chrome/chromeos_of_hw_prober.c b/drivers/platform/chrome/chromeos_of_hw_prober.c
> [...]
> > +static int chromeos_of_hw_prober_probe(struct platform_device *pdev)
> > +{
> > +     for (size_t i = 0; i < ARRAY_SIZE(hw_prober_platforms); i++) {
> > +             int ret;
> > +
> > +             if (!of_machine_is_compatible(hw_prober_platforms[i].compatible))
> > +                     continue;
> > +
> > +             ret = hw_prober_platforms[i].prober(&pdev->dev, hw_prober_platforms[i].data);
> > +             /* Ignore unrecoverable errors and keep going through other probers */
> > +             if (ret == -EPROBE_DEFER)
> > +                     return ret;
>
> Is it harmless if some of the components get probed multiple times?  E.g.:
> comp1 probed -> comp2 probed -> comp3 returned -EPROBE_DEFER -> some time
> later, chromeos_of_hw_prober_probe() gets called again.

Yes it is harmless. Components already enabled will not get disabled
in the error path. And the prober that enabled that component will see
that a component was enabled, and skip doing the whole process again.

So something like:

    comp1 probed -> comp2 probed -> comp3 -EPROBE_DEFER ->
        comp1 skip -> comp2 skip -> comp3 probed


ChenYu


From tzungbi at kernel.org  Wed Sep  4 21:34:40 2024
From: tzungbi at kernel.org (Tzung-Bi Shih)
Date: Thu, 5 Sep 2024 04:34:40 +0000
Subject: [PATCH v6 11/12] platform/chrome: Introduce device tree hardware
 prober
In-Reply-To: <CAGXv+5GpKu-b4_dbRcuSG4NxQi_FKh9p7iMh6DfgavkLFdLLdQ@mail.gmail.com>
References: <20240904090016.2841572-1-wenst@chromium.org>
 <20240904090016.2841572-12-wenst@chromium.org>
 <Ztgxlmhnkn7NVC81@google.com>
 <CAGXv+5GpKu-b4_dbRcuSG4NxQi_FKh9p7iMh6DfgavkLFdLLdQ@mail.gmail.com>
Message-ID: <Ztk04Pfa3tXyrDJq@google.com>

On Thu, Sep 05, 2024 at 11:52:32AM +0800, Chen-Yu Tsai wrote:
> On Wed, Sep 4, 2024 at 6:08?PM Tzung-Bi Shih <tzungbi at kernel.org> wrote:
> >
> > On Wed, Sep 04, 2024 at 05:00:13PM +0800, Chen-Yu Tsai wrote:
> > > diff --git a/drivers/platform/chrome/chromeos_of_hw_prober.c b/drivers/platform/chrome/chromeos_of_hw_prober.c
> > [...]
> > > +static int chromeos_of_hw_prober_probe(struct platform_device *pdev)
> > > +{
> > > +     for (size_t i = 0; i < ARRAY_SIZE(hw_prober_platforms); i++) {
> > > +             int ret;
> > > +
> > > +             if (!of_machine_is_compatible(hw_prober_platforms[i].compatible))
> > > +                     continue;
> > > +
> > > +             ret = hw_prober_platforms[i].prober(&pdev->dev, hw_prober_platforms[i].data);
> > > +             /* Ignore unrecoverable errors and keep going through other probers */
> > > +             if (ret == -EPROBE_DEFER)
> > > +                     return ret;
> >
> > Is it harmless if some of the components get probed multiple times?  E.g.:
> > comp1 probed -> comp2 probed -> comp3 returned -EPROBE_DEFER -> some time
> > later, chromeos_of_hw_prober_probe() gets called again.
> 
> Yes it is harmless. Components already enabled will not get disabled
> in the error path. And the prober that enabled that component will see
> that a component was enabled, and skip doing the whole process again.
> 
> So something like:
> 
>     comp1 probed -> comp2 probed -> comp3 -EPROBE_DEFER ->
>         comp1 skip -> comp2 skip -> comp3 probed

I assume this patch will be applied through the i2c tree:
Acked-by: Tzung-Bi Shih <tzungbi at kernel.org>


From jens.wiklander at linaro.org  Wed Sep  4 23:56:11 2024
From: jens.wiklander at linaro.org (Jens Wiklander)
Date: Thu, 5 Sep 2024 08:56:11 +0200
Subject: [RFC PATCH 1/4] dma-buf: heaps: restricted_heap: add no_map attribute
In-Reply-To: <4a498990-2d9e-4555-85f3-d1d22e26b9dd@amd.com>
References: <20240830070351.2855919-1-jens.wiklander@linaro.org>
 <20240830070351.2855919-2-jens.wiklander@linaro.org> <4a498990-2d9e-4555-85f3-d1d22e26b9dd@amd.com>
Message-ID: <CAHUa44G9yF2GoQD8XrE=agkGCditH1v+NYm16WpdORX4aRixYg@mail.gmail.com>

On Fri, Aug 30, 2024 at 10:47?AM Christian K?nig
<christian.koenig at amd.com> wrote:
>
> Am 30.08.24 um 09:03 schrieb Jens Wiklander:
> > Add a no_map attribute to struct restricted_heap_attachment and struct
> > restricted_heap to skip the call to dma_map_sgtable() if set. This
> > avoids trying to map a dma-buf that doens't refer to memory accessible
> > by the kernel.
>
> You seem to have a misunderstanding here dma_map_sgtable() is called to
> map a table into IOMMU and not any kernel address space.
>
> So please explain why you need that?

You're right, I had misunderstood dma_map_sgtable(). There's no need
for the no_map attribute, so I'll remove it.

Perhaps you have a suggestion on how to fix a problem when using
dma_map_sgtable()?

Without it, I'll have to assign a pointer to teedev->dev.dma_mask when
using the restricted heap with the OP-TEE driver or there will be a
warning in __dma_map_sg_attrs() ending with a failure when trying to
register the dma-buf fd. OP-TEE is probed with a platform device, and
taking the dma_mask pointer from that device works. Is that a good
approach or is there a better way of assigning dma_mask?

Thanks,
Jens

>
> Regards,
> Christian.
>
> >
> > Signed-off-by: Jens Wiklander <jens.wiklander at linaro.org>
> > ---
> >   drivers/dma-buf/heaps/restricted_heap.c | 17 +++++++++++++----
> >   drivers/dma-buf/heaps/restricted_heap.h |  2 ++
> >   2 files changed, 15 insertions(+), 4 deletions(-)
> >
> > diff --git a/drivers/dma-buf/heaps/restricted_heap.c b/drivers/dma-buf/heaps/restricted_heap.c
> > index 8bc8a5e3f969..4bf28e3727ca 100644
> > --- a/drivers/dma-buf/heaps/restricted_heap.c
> > +++ b/drivers/dma-buf/heaps/restricted_heap.c
> > @@ -16,6 +16,7 @@
> >   struct restricted_heap_attachment {
> >       struct sg_table                 *table;
> >       struct device                   *dev;
> > +     bool no_map;
> >   };
> >
> >   static int
> > @@ -54,6 +55,8 @@ restricted_heap_memory_free(struct restricted_heap *rheap, struct restricted_buf
> >   static int restricted_heap_attach(struct dma_buf *dmabuf, struct dma_buf_attachment *attachment)
> >   {
> >       struct restricted_buffer *restricted_buf = dmabuf->priv;
> > +     struct dma_heap *heap = restricted_buf->heap;
> > +     struct restricted_heap *rheap = dma_heap_get_drvdata(heap);
> >       struct restricted_heap_attachment *a;
> >       struct sg_table *table;
> >
> > @@ -70,6 +73,7 @@ static int restricted_heap_attach(struct dma_buf *dmabuf, struct dma_buf_attachm
> >       sg_dma_mark_restricted(table->sgl);
> >       a->table = table;
> >       a->dev = attachment->dev;
> > +     a->no_map = rheap->no_map;
> >       attachment->priv = a;
> >
> >       return 0;
> > @@ -92,9 +96,12 @@ restricted_heap_map_dma_buf(struct dma_buf_attachment *attachment,
> >       struct sg_table *table = a->table;
> >       int ret;
> >
> > -     ret = dma_map_sgtable(attachment->dev, table, direction, DMA_ATTR_SKIP_CPU_SYNC);
> > -     if (ret)
> > -             return ERR_PTR(ret);
> > +     if (!a->no_map) {
> > +             ret = dma_map_sgtable(attachment->dev, table, direction,
> > +                                   DMA_ATTR_SKIP_CPU_SYNC);
> > +             if (ret)
> > +                     return ERR_PTR(ret);
> > +     }
> >       return table;
> >   }
> >
> > @@ -106,7 +113,9 @@ restricted_heap_unmap_dma_buf(struct dma_buf_attachment *attachment, struct sg_t
> >
> >       WARN_ON(a->table != table);
> >
> > -     dma_unmap_sgtable(attachment->dev, table, direction, DMA_ATTR_SKIP_CPU_SYNC);
> > +     if (!a->no_map)
> > +             dma_unmap_sgtable(attachment->dev, table, direction,
> > +                               DMA_ATTR_SKIP_CPU_SYNC);
> >   }
> >
> >   static int
> > diff --git a/drivers/dma-buf/heaps/restricted_heap.h b/drivers/dma-buf/heaps/restricted_heap.h
> > index 7dec4b8a471b..94cc0842f70d 100644
> > --- a/drivers/dma-buf/heaps/restricted_heap.h
> > +++ b/drivers/dma-buf/heaps/restricted_heap.h
> > @@ -27,6 +27,8 @@ struct restricted_heap {
> >       unsigned long           cma_paddr;
> >       unsigned long           cma_size;
> >
> > +     bool                    no_map;
> > +
> >       void                    *priv_data;
> >   };
> >
>


From matthias.bgg at gmail.com  Thu Sep  5 01:01:11 2024
From: matthias.bgg at gmail.com (Matthias Brugger)
Date: Thu, 5 Sep 2024 10:01:11 +0200
Subject: [PATCH] mt76: mt7615: check devm_kasprintf() returned value
In-Reply-To: <20240905014753.353271-1-make24@iscas.ac.cn>
References: <20240905014753.353271-1-make24@iscas.ac.cn>
Message-ID: <1ac78d8a-c0dc-4f90-9e25-6d9569894670@gmail.com>



On 05/09/2024 03:47, Ma Ke wrote:
> devm_kasprintf() can return a NULL pointer on failure but this returned
> value is not checked. Fix this lack and check the returned value.
> 
> Found by code review.
> 
> Cc: stable at vger.kernel.org
> Fixes: 0bb4e9187ea4 ("mt76: mt7615: fix hwmon temp sensor mem use-after-free")
> Signed-off-by: Ma Ke <make24 at iscas.ac.cn>

Reviewed-by: Matthias Brugger <matthias.bgg at gmail.com>

If you find more problems of that sort in the mediatek wireless drivers, I think 
a better approach would be to send them all as one patch.

> ---
>   drivers/net/wireless/mediatek/mt76/mt7615/init.c | 3 +++
>   1 file changed, 3 insertions(+)
> 
> diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/init.c b/drivers/net/wireless/mediatek/mt76/mt7615/init.c
> index f7722f67db57..0b9ebdcda221 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt7615/init.c
> +++ b/drivers/net/wireless/mediatek/mt76/mt7615/init.c
> @@ -56,6 +56,9 @@ int mt7615_thermal_init(struct mt7615_dev *dev)
>   
>   	name = devm_kasprintf(&wiphy->dev, GFP_KERNEL, "mt7615_%s",
>   			      wiphy_name(wiphy));
> +	if (!name)
> +		return -ENOMEM;
> +
>   	hwmon = devm_hwmon_device_register_with_groups(&wiphy->dev, name, dev,
>   						       mt7615_hwmon_groups);
>   	return PTR_ERR_OR_ZERO(hwmon);


From christian.koenig at amd.com  Thu Sep  5 01:01:59 2024
From: christian.koenig at amd.com (=?UTF-8?Q?Christian_K=C3=B6nig?=)
Date: Thu, 5 Sep 2024 10:01:59 +0200
Subject: [RFC PATCH 1/4] dma-buf: heaps: restricted_heap: add no_map
 attribute
In-Reply-To: <CAHUa44G9yF2GoQD8XrE=agkGCditH1v+NYm16WpdORX4aRixYg@mail.gmail.com>
References: <20240830070351.2855919-1-jens.wiklander@linaro.org>
 <20240830070351.2855919-2-jens.wiklander@linaro.org>
 <4a498990-2d9e-4555-85f3-d1d22e26b9dd@amd.com>
 <CAHUa44G9yF2GoQD8XrE=agkGCditH1v+NYm16WpdORX4aRixYg@mail.gmail.com>
Message-ID: <30aa1b85-5c38-4e96-9217-7e0208fd0f6b@amd.com>

Am 05.09.24 um 08:56 schrieb Jens Wiklander:
> On Fri, Aug 30, 2024 at 10:47?AM Christian K?nig
> <christian.koenig at amd.com> wrote:
>> Am 30.08.24 um 09:03 schrieb Jens Wiklander:
>>> Add a no_map attribute to struct restricted_heap_attachment and struct
>>> restricted_heap to skip the call to dma_map_sgtable() if set. This
>>> avoids trying to map a dma-buf that doens't refer to memory accessible
>>> by the kernel.
>> You seem to have a misunderstanding here dma_map_sgtable() is called to
>> map a table into IOMMU and not any kernel address space.
>>
>> So please explain why you need that?
> You're right, I had misunderstood dma_map_sgtable(). There's no need
> for the no_map attribute, so I'll remove it.
>
> Perhaps you have a suggestion on how to fix a problem when using
> dma_map_sgtable()?
>
> Without it, I'll have to assign a pointer to teedev->dev.dma_mask when
> using the restricted heap with the OP-TEE driver or there will be a
> warning in __dma_map_sg_attrs() ending with a failure when trying to
> register the dma-buf fd. OP-TEE is probed with a platform device, and
> taking the dma_mask pointer from that device works. Is that a good
> approach or is there a better way of assigning dma_mask?

Mhm, I don't know the full picture so I have to make some assumptions.

The teedev is just a virtual device which represents the restricted 
memory access paths of a real device?

If that is true then taking the dma-mask from the real device is most 
likely the right thing to do.

Regards,
Christian.

>
> Thanks,
> Jens
>
>> Regards,
>> Christian.
>>
>>> Signed-off-by: Jens Wiklander <jens.wiklander at linaro.org>
>>> ---
>>>    drivers/dma-buf/heaps/restricted_heap.c | 17 +++++++++++++----
>>>    drivers/dma-buf/heaps/restricted_heap.h |  2 ++
>>>    2 files changed, 15 insertions(+), 4 deletions(-)
>>>
>>> diff --git a/drivers/dma-buf/heaps/restricted_heap.c b/drivers/dma-buf/heaps/restricted_heap.c
>>> index 8bc8a5e3f969..4bf28e3727ca 100644
>>> --- a/drivers/dma-buf/heaps/restricted_heap.c
>>> +++ b/drivers/dma-buf/heaps/restricted_heap.c
>>> @@ -16,6 +16,7 @@
>>>    struct restricted_heap_attachment {
>>>        struct sg_table                 *table;
>>>        struct device                   *dev;
>>> +     bool no_map;
>>>    };
>>>
>>>    static int
>>> @@ -54,6 +55,8 @@ restricted_heap_memory_free(struct restricted_heap *rheap, struct restricted_buf
>>>    static int restricted_heap_attach(struct dma_buf *dmabuf, struct dma_buf_attachment *attachment)
>>>    {
>>>        struct restricted_buffer *restricted_buf = dmabuf->priv;
>>> +     struct dma_heap *heap = restricted_buf->heap;
>>> +     struct restricted_heap *rheap = dma_heap_get_drvdata(heap);
>>>        struct restricted_heap_attachment *a;
>>>        struct sg_table *table;
>>>
>>> @@ -70,6 +73,7 @@ static int restricted_heap_attach(struct dma_buf *dmabuf, struct dma_buf_attachm
>>>        sg_dma_mark_restricted(table->sgl);
>>>        a->table = table;
>>>        a->dev = attachment->dev;
>>> +     a->no_map = rheap->no_map;
>>>        attachment->priv = a;
>>>
>>>        return 0;
>>> @@ -92,9 +96,12 @@ restricted_heap_map_dma_buf(struct dma_buf_attachment *attachment,
>>>        struct sg_table *table = a->table;
>>>        int ret;
>>>
>>> -     ret = dma_map_sgtable(attachment->dev, table, direction, DMA_ATTR_SKIP_CPU_SYNC);
>>> -     if (ret)
>>> -             return ERR_PTR(ret);
>>> +     if (!a->no_map) {
>>> +             ret = dma_map_sgtable(attachment->dev, table, direction,
>>> +                                   DMA_ATTR_SKIP_CPU_SYNC);
>>> +             if (ret)
>>> +                     return ERR_PTR(ret);
>>> +     }
>>>        return table;
>>>    }
>>>
>>> @@ -106,7 +113,9 @@ restricted_heap_unmap_dma_buf(struct dma_buf_attachment *attachment, struct sg_t
>>>
>>>        WARN_ON(a->table != table);
>>>
>>> -     dma_unmap_sgtable(attachment->dev, table, direction, DMA_ATTR_SKIP_CPU_SYNC);
>>> +     if (!a->no_map)
>>> +             dma_unmap_sgtable(attachment->dev, table, direction,
>>> +                               DMA_ATTR_SKIP_CPU_SYNC);
>>>    }
>>>
>>>    static int
>>> diff --git a/drivers/dma-buf/heaps/restricted_heap.h b/drivers/dma-buf/heaps/restricted_heap.h
>>> index 7dec4b8a471b..94cc0842f70d 100644
>>> --- a/drivers/dma-buf/heaps/restricted_heap.h
>>> +++ b/drivers/dma-buf/heaps/restricted_heap.h
>>> @@ -27,6 +27,8 @@ struct restricted_heap {
>>>        unsigned long           cma_paddr;
>>>        unsigned long           cma_size;
>>>
>>> +     bool                    no_map;
>>> +
>>>        void                    *priv_data;
>>>    };
>>>



From wenst at chromium.org  Thu Sep  5 01:11:18 2024
From: wenst at chromium.org (Chen-Yu Tsai)
Date: Thu, 5 Sep 2024 16:11:18 +0800
Subject: [PATCH v6 03/12] regulator: Move OF-specific regulator lookup
 code to of_regulator.c
In-Reply-To: <ZthdU6UGlM75GJVj@smile.fi.intel.com>
References: <20240904090016.2841572-1-wenst@chromium.org> <20240904090016.2841572-4-wenst@chromium.org>
 <ZthcBpx8WFIvsrJj@smile.fi.intel.com> <ZthdU6UGlM75GJVj@smile.fi.intel.com>
Message-ID: <CAGXv+5Ew23BGgw6XpikBtAm+wQiOjFDyGuCSpt_GsGhoAwD22A@mail.gmail.com>

On Wed, Sep 4, 2024 at 9:16?PM Andy Shevchenko
<andriy.shevchenko at linux.intel.com> wrote:
>
> On Wed, Sep 04, 2024 at 04:09:26PM +0300, Andy Shevchenko wrote:
> > On Wed, Sep 04, 2024 at 05:00:05PM +0800, Chen-Yu Tsai wrote:
>
> > > +static struct device_node *of_get_child_regulator(struct device_node *parent,
> > > +                                             const char *prop_name)
> > > +{
> > > +   struct device_node *regnode = NULL;
>
> > > +   struct device_node *child = NULL;
>
> Btw, redundant assignment here, as child will be assigned anyway AFAIR.
>
> > > +   for_each_child_of_node(parent, child) {
> >
> > > +           regnode = of_parse_phandle(child, prop_name, 0);
> > > +           if (!regnode) {
> > > +                   regnode = of_get_child_regulator(child, prop_name);
> > > +                   if (regnode)
> > > +                           goto err_node_put;
> > > +           } else {
> > > +                   goto err_node_put;
> > > +           }
> >
> > I know this is just a move of the existing code, but consider negating the
> > conditional and have something like
> >
> >               regnode = of_parse_phandle(child, prop_name, 0);
> >               if (regnode)
> >                       goto err_node_put;
> >
> >               regnode = of_get_child_regulator(child, prop_name);
> >               if (regnode)
> >                       goto err_node_put;
> >

Looks like Mark already merged this one. I'll send extra patches to clean
this up later.

ChenYu

> > > +   }
> > > +   return NULL;
> > > +
> > > +err_node_put:
> > > +   of_node_put(child);
> > > +   return regnode;
> > > +}
>
> --
> With Best Regards,
> Andy Shevchenko
>
>


From andriy.shevchenko at linux.intel.com  Thu Sep  5 01:29:50 2024
From: andriy.shevchenko at linux.intel.com (Andy Shevchenko)
Date: Thu, 5 Sep 2024 11:29:50 +0300
Subject: [PATCH v6 03/12] regulator: Move OF-specific regulator lookup
 code to of_regulator.c
In-Reply-To: <CAGXv+5Ew23BGgw6XpikBtAm+wQiOjFDyGuCSpt_GsGhoAwD22A@mail.gmail.com>
References: <20240904090016.2841572-1-wenst@chromium.org>
 <20240904090016.2841572-4-wenst@chromium.org>
 <ZthcBpx8WFIvsrJj@smile.fi.intel.com>
 <ZthdU6UGlM75GJVj@smile.fi.intel.com>
 <CAGXv+5Ew23BGgw6XpikBtAm+wQiOjFDyGuCSpt_GsGhoAwD22A@mail.gmail.com>
Message-ID: <Ztlr_hKm75fMBaBO@smile.fi.intel.com>

On Thu, Sep 05, 2024 at 04:11:18PM +0800, Chen-Yu Tsai wrote:
> On Wed, Sep 4, 2024 at 9:16?PM Andy Shevchenko
> <andriy.shevchenko at linux.intel.com> wrote:

...

> Looks like Mark already merged this one. I'll send extra patches to clean
> this up later.

I was OOF, haven't read this and I sent already a patch yesterday evening.

-- 
With Best Regards,
Andy Shevchenko




From amergnat at baylibre.com  Thu Sep  5 02:05:27 2024
From: amergnat at baylibre.com (Alexandre Mergnat)
Date: Thu, 5 Sep 2024 11:05:27 +0200
Subject: [PATCH v7 12/16] ASoC: codecs: add MT6357 support
In-Reply-To: <c386c74c-9008-48ea-ad79-524eb85c370b@sirena.org.uk>
References: <20240226-audio-i350-v7-0-6518d953a141@baylibre.com>
 <20240226-audio-i350-v7-12-6518d953a141@baylibre.com>
 <c386c74c-9008-48ea-ad79-524eb85c370b@sirena.org.uk>
Message-ID: <62bc8ee8-f23e-4cd3-a77a-74cb19e6530e@baylibre.com>

Sorry, I'm gonna send a V8 to fix this ASAP

On 03/09/2024 19:14, Mark Brown wrote:
> On Mon, Jul 22, 2024 at 08:53:41AM +0200, amergnat at baylibre.com wrote:
>> From: Nicolas Belin <nbelin at baylibre.com>
>>
>> Add the support of MT6357 PMIC audio codec.
> 
> This breaks the build:
> 
> /build/stage/linux/sound/soc/codecs/mt6357.c: In function ?mt6357_platform_driver_probe?:
> /build/stage/linux/sound/soc/codecs/mt6357.c:1824:55: error: too many arguments for format [-Werror=format-extra-args]
>   1824 |                 return dev_err_probe(&pdev->dev, ret, "Failed to parse dts\n", __func__);
>        |                                                       ^~~~~~~~~~~~~~~~~~~~~~~
> cc1: all warnings being treated as errors

-- 
Regards,
Alexandre


From amergnat at baylibre.com  Thu Sep  5 02:06:57 2024
From: amergnat at baylibre.com (amergnat at baylibre.com)
Date: Thu, 05 Sep 2024 11:06:57 +0200
Subject: [PATCH v8 0/5] Add audio support for the MediaTek Genio 350-evk
 board
Message-ID: <20240226-audio-i350-v8-0-e80a57d026ce@baylibre.com>

This serie aim to add the following audio support for the Genio 350-evk:
- Playback
  - 2ch Headset Jack (Earphone)
  - 1ch Line-out Jack (Speaker)
  - 8ch HDMI Tx
- Capture
  - 1ch DMIC (On-board Digital Microphone)
  - 1ch AMIC (On-board Analogic Microphone)
  - 1ch Headset Jack (External Analogic Microphone)

Of course, HDMI playback need the MT8365 display patches [1] and a DTS
change documented in "mediatek,mt8365-mt6357.yaml".

Applied patch:
- mfd: mt6397-core: register mt6357 sound codec
- ASoC: dt-bindings: mediatek,mt8365-afe: Add audio afe document
- ASoC: dt-bindings: mediatek,mt8365-mt6357: Add audio sound card document
- dt-bindings: mfd: mediatek: Add codec property for MT6357 PMIC
- ASoC: mediatek: mt8365: Add common header
- ASoC: mediatek: mt8365: Add audio clock control support
- ASoC: mediatek: mt8365: Add I2S DAI support
- ASoC: mediatek: mt8365: Add ADDA DAI support
- ASoC: mediatek: mt8365: Add DMIC DAI support
- ASoC: mediatek: mt8365: Add PCM DAI support
- ASoc: mediatek: mt8365: Add a specific soundcard for EVK
- ASoC: mediatek: mt8365: Add the AFE driver support

Test passed:
- mixer-test log: [3]
- pcm-test log: [4]

[1]: https://lore.kernel.org/all/20231023-display-support-v1-0-5c860ed5c33b at baylibre.com/
[2]: https://lore.kernel.org/all/20240313110147.1267793-1-angelogioacchino.delregno at collabora.com/
[3]: https://pastebin.com/pc43AVrT
[4]: https://pastebin.com/cCtGhDpg
[5]: https://gitlab.baylibre.com/baylibre/mediatek/bsp/linux/-/commits/sound/for-next/add-i350-audio-support

Signed-off-by: Alexandre Mergnat <amergnat at baylibre.com>
---
Changes in v8:
- Rebase to "sound/for-next" branch
- Fix build issue by removing extra argument into dev_err_probe function.
- Link to v7: https://lore.kernel.org/r/20240226-audio-i350-v7-0-6518d953a141 at baylibre.com

Changes in v7:
- Rebase to "sound/for-6.11" branch.
- Move audio-codec properties to the parent node
- Remove gain values change at init to keep HW default values.
- Remove spurious function by inlining them directly.
- Use standard adaptators for regmap.
- Use "ARRAY_SIZE()" instead of defined value.
- Remove unused variable which breaks an x86 allmodconfig build.
- Link to v6: https://lore.kernel.org/r/20240226-audio-i350-v6-0-f754ec1a7634 at baylibre.com

Changes in v6:
- Remove spurious defines
- all files: replace "Mediatek" by "MediaTek"
- dts: replace "pins" by "clk-dat-pins"
- dts: drive-strength: use integer instead of define
- Link to v5: https://lore.kernel.org/r/20240226-audio-i350-v5-0-e7e2569df481 at baylibre.com

Changes in v5:
- Rebase to "next-20240523" branch.
- bindings: power supply property moved to the parent node
- Replace "SoC" by "ASoC" in the patch title (5/16)
- Move and rename DAI I2S's defines
- Improve code readability and cleanup
- Link to v4: https://lore.kernel.org/r/20240226-audio-i350-v4-0-082b22186d4c at baylibre.com

Changes in v4:
- Rebase to "next-20240422" branch.
- Re-pass dt_binding_check, functionnal tests, mixer test and pcm test.
- Remove copyright changes.
- Move mt6357 audio codec documention from mt6357.yaml
  to mediatek,mt6357.yaml
- Fix broken indentation in mt8365-evk.dts
- Remove empty node.
- Add more dai link name according to the HW capability.
- Remove spurious property (mediatek,topckgen)
  from mediatek,mt8365-afe.yaml
- Rename "afe" to "audio-controller" in the documentation.
- Link to v3: https://lore.kernel.org/r/20240226-audio-i350-v3-0-16bb2c974c55 at baylibre.com

Changes in v3:
- Re-order documentation commit to fix dt_binding_check error.
- Remove $ref and add "mediatek," prefix to vaud28-supply property.
- Link to v2: https://lore.kernel.org/r/20240226-audio-i350-v2-0-3043d483de0d at baylibre.com

Changes in v2:
- Documentation fixed:
  - Remove spurious description.
  - Change property order to fit with dts coding style rules.
  - micbias property: use microvolt value instead of index.
  - mediatek,i2s-shared-clock property removed.
  - mediatek,dmic-iir-on property removed.
  - mediatek,dmic-irr-mode property removed.
  - Change dmic-two-wire-mode => dmic-mode to be aligned with another SoC
  - Remove the spurious 2nd reg of the afe.
- Manage IIR filter feature using audio controls.
- Fix audio controls to pass mixer-test and pcm-test.
- Refactor some const name according to feedbacks.
- Rework the codec to remove spurious driver data.
- Use the new common MTK probe functions for AFE PCM and sound card.
- Rework pinctrl probe in the soundcard driver.
- Remove spurious "const" variables in all files.
- Link to v1: https://lore.kernel.org/r/20240226-audio-i350-v1-0-4fa1cea1667f at baylibre.com

---
Alexandre Mergnat (4):
      ASoC: mediatek: Add MT8365 support
      arm64: defconfig: enable mt8365 sound
      arm64: dts: mediatek: add afe support for mt8365 SoC
      arm64: dts: mediatek: add audio support for mt8365-evk

Nicolas Belin (1):
      ASoC: codecs: add MT6357 support

 arch/arm64/boot/dts/mediatek/mt8365-evk.dts |   86 ++
 arch/arm64/boot/dts/mediatek/mt8365.dtsi    |   43 +-
 arch/arm64/configs/defconfig                |    2 +
 sound/soc/codecs/Kconfig                    |    7 +
 sound/soc/codecs/Makefile                   |    2 +
 sound/soc/codecs/mt6357.c                   | 1855 +++++++++++++++++++++++++++
 sound/soc/codecs/mt6357.h                   |  660 ++++++++++
 sound/soc/mediatek/Kconfig                  |   20 +
 sound/soc/mediatek/Makefile                 |    1 +
 sound/soc/mediatek/mt8365/Makefile          |   15 +
 10 files changed, 2689 insertions(+), 2 deletions(-)
---
base-commit: 097a44db5747403b19d05a9664e8ec6adba27e3b
change-id: 20240226-audio-i350-4e11da088e55

Best regards,
-- 
Alexandre Mergnat <amergnat at baylibre.com>



From amergnat at baylibre.com  Thu Sep  5 02:06:58 2024
From: amergnat at baylibre.com (amergnat at baylibre.com)
Date: Thu, 05 Sep 2024 11:06:58 +0200
Subject: [PATCH v8 1/5] ASoC: codecs: add MT6357 support
In-Reply-To: <20240226-audio-i350-v8-0-e80a57d026ce@baylibre.com>
References: <20240226-audio-i350-v8-0-e80a57d026ce@baylibre.com>
Message-ID: <20240226-audio-i350-v8-1-e80a57d026ce@baylibre.com>

From: Nicolas Belin <nbelin at baylibre.com>

Add the support of MT6357 PMIC audio codec.

Signed-off-by: Nicolas Belin <nbelin at baylibre.com>
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
Signed-off-by: Alexandre Mergnat <amergnat at baylibre.com>
---
 sound/soc/codecs/Kconfig  |    7 +
 sound/soc/codecs/Makefile |    2 +
 sound/soc/codecs/mt6357.c | 1855 +++++++++++++++++++++++++++++++++++++++++++++
 sound/soc/codecs/mt6357.h |  660 ++++++++++++++++
 4 files changed, 2524 insertions(+)

diff --git a/sound/soc/codecs/Kconfig b/sound/soc/codecs/Kconfig
index b5e6d0a986c8..7092842480ef 100644
--- a/sound/soc/codecs/Kconfig
+++ b/sound/soc/codecs/Kconfig
@@ -157,6 +157,7 @@ config SND_SOC_ALL_CODECS
 	imply SND_SOC_MC13783
 	imply SND_SOC_ML26124
 	imply SND_SOC_MT6351
+	imply SND_SOC_MT6357
 	imply SND_SOC_MT6358
 	imply SND_SOC_MT6359
 	imply SND_SOC_MT6660
@@ -2501,6 +2502,12 @@ config SND_SOC_ML26124
 config SND_SOC_MT6351
 	tristate "MediaTek MT6351 Codec"
 
+config SND_SOC_MT6357
+	tristate "MediaTek MT6357 Codec"
+	help
+	  Enable support for the platform which uses MT6357 as
+	  external codec device.
+
 config SND_SOC_MT6358
 	tristate "MediaTek MT6358 Codec"
 	help
diff --git a/sound/soc/codecs/Makefile b/sound/soc/codecs/Makefile
index 622e360f0086..54cbc3feae32 100644
--- a/sound/soc/codecs/Makefile
+++ b/sound/soc/codecs/Makefile
@@ -177,6 +177,7 @@ snd-soc-ml26124-y := ml26124.o
 snd-soc-msm8916-analog-y := msm8916-wcd-analog.o
 snd-soc-msm8916-digital-y := msm8916-wcd-digital.o
 snd-soc-mt6351-y := mt6351.o
+snd-soc-mt6357-y := mt6357.o
 snd-soc-mt6358-y := mt6358.o
 snd-soc-mt6359-y := mt6359.o
 snd-soc-mt6359-accdet-y := mt6359-accdet.o
@@ -578,6 +579,7 @@ obj-$(CONFIG_SND_SOC_ML26124)	+= snd-soc-ml26124.o
 obj-$(CONFIG_SND_SOC_MSM8916_WCD_ANALOG) +=snd-soc-msm8916-analog.o
 obj-$(CONFIG_SND_SOC_MSM8916_WCD_DIGITAL) +=snd-soc-msm8916-digital.o
 obj-$(CONFIG_SND_SOC_MT6351)	+= snd-soc-mt6351.o
+obj-$(CONFIG_SND_SOC_MT6357)	+= snd-soc-mt6357.o
 obj-$(CONFIG_SND_SOC_MT6358)	+= snd-soc-mt6358.o
 obj-$(CONFIG_SND_SOC_MT6359)	+= snd-soc-mt6359.o
 obj-$(CONFIG_SND_SOC_MT6359_ACCDET) += mt6359-accdet.o
diff --git a/sound/soc/codecs/mt6357.c b/sound/soc/codecs/mt6357.c
new file mode 100644
index 000000000000..988728df15e4
--- /dev/null
+++ b/sound/soc/codecs/mt6357.c
@@ -0,0 +1,1855 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * MT6357 ALSA SoC audio codec driver
+ *
+ * Copyright (c) 2024 Baylibre
+ * Author: Nicolas Belin <nbelin at baylibre.com>
+ */
+
+#include <linux/dma-mapping.h>
+#include <sound/soc.h>
+#include <sound/tlv.h>
+#include <linux/mfd/mt6397/core.h>
+#include <linux/regulator/consumer.h>
+
+#include "mt6357.h"
+
+static void set_playback_gpio(struct mt6357_priv *priv, bool enable)
+{
+	regmap_write(priv->regmap, MT6357_GPIO_MODE2_CLR, MT6357_GPIO_MODE2_CLEAR_ALL);
+	if (enable) {
+		/* set gpio mosi mode */
+		regmap_write(priv->regmap, MT6357_GPIO_MODE2_SET,
+			     MT6357_GPIO8_MODE_SET_AUD_CLK_MOSI |
+			     MT6357_GPIO9_MODE_SET_AUD_DAT_MOSI0 |
+			     MT6357_GPIO10_MODE_SET_AUD_DAT_MOSI1 |
+			     MT6357_GPIO11_MODE_SET_AUD_SYNC_MOSI);
+	} else {
+		/* pad_aud_*_mosi are GPIO mode after clear and set them to dir input
+		 * reason:
+		 * pad_aud_dat_mosi*, because the pin is used as boot strap
+		 */
+		regmap_update_bits(priv->regmap, MT6357_GPIO_DIR0,
+				   MT6357_GPIO8_DIR_MASK |
+				   MT6357_GPIO9_DIR_MASK |
+				   MT6357_GPIO10_DIR_MASK |
+				   MT6357_GPIO11_DIR_MASK,
+				   MT6357_GPIO8_DIR_INPUT |
+				   MT6357_GPIO9_DIR_INPUT |
+				   MT6357_GPIO10_DIR_INPUT |
+				   MT6357_GPIO11_DIR_INPUT);
+	}
+}
+
+static void set_capture_gpio(struct mt6357_priv *priv, bool enable)
+{
+	regmap_write(priv->regmap, MT6357_GPIO_MODE3_CLR, MT6357_GPIO_MODE3_CLEAR_ALL);
+	if (enable) {
+		/* set gpio miso mode */
+		regmap_write(priv->regmap, MT6357_GPIO_MODE3_SET,
+			     MT6357_GPIO12_MODE_SET_AUD_CLK_MISO |
+			     MT6357_GPIO13_MODE_SET_AUD_DAT_MISO0 |
+			     MT6357_GPIO14_MODE_SET_AUD_DAT_MISO1 |
+			     MT6357_GPIO15_MODE_SET_AUD_SYNC_MISO);
+	} else {
+		/* pad_aud_*_mosi are GPIO mode after clear and set them to dir input
+		 * reason:
+		 * pad_aud_clk_miso, because when playback only the miso_clk
+		 * will also have 26m, so will have power leak
+		 * pad_aud_dat_miso*, because the pin is used as boot strap
+		 */
+		regmap_update_bits(priv->regmap, MT6357_GPIO_DIR0,
+				   MT6357_GPIO12_DIR_MASK |
+				   MT6357_GPIO13_DIR_MASK |
+				   MT6357_GPIO14_DIR_MASK |
+				   MT6357_GPIO15_DIR_MASK,
+				   MT6357_GPIO12_DIR_INPUT |
+				   MT6357_GPIO13_DIR_INPUT |
+				   MT6357_GPIO14_DIR_INPUT |
+				   MT6357_GPIO15_DIR_INPUT);
+	}
+}
+
+static void hp_main_output_ramp(struct mt6357_priv *priv, bool up)
+{
+	int i, stage;
+
+	/* Enable/Reduce HPL/R main output stage step by step */
+	for (i = 0; i <= MT6357_HPLOUT_STG_CTRL_VAUDP15_MAX; i++) {
+		stage = up ? i : MT6357_HPLOUT_STG_CTRL_VAUDP15_MAX - i;
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON1,
+				   MT6357_HPLOUT_STG_CTRL_VAUDP15_MASK,
+				   stage << MT6357_HPLOUT_STG_CTRL_VAUDP15_SFT);
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON1,
+				   MT6357_HPROUT_STG_CTRL_VAUDP15_MASK,
+				   stage << MT6357_HPROUT_STG_CTRL_VAUDP15_SFT);
+		usleep_range(600, 700);
+	}
+}
+
+static void hp_aux_feedback_loop_gain_ramp(struct mt6357_priv *priv, bool up)
+{
+	int i, stage;
+
+	/* Reduce HP aux feedback loop gain step by step */
+	for (i = 0; i <= MT6357_HP_AUX_LOOP_GAIN_MAX; i++) {
+		stage = up ? i : MT6357_HP_AUX_LOOP_GAIN_MAX - i;
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON6,
+				   MT6357_HP_AUX_LOOP_GAIN_MASK,
+				   stage << MT6357_HP_AUX_LOOP_GAIN_SFT);
+		usleep_range(600, 700);
+	}
+}
+
+static void hp_pull_down(struct mt6357_priv *priv, bool enable)
+{
+	if (enable)
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON2,
+				   MT6357_HPP_SHORT_2VCM_VAUDP15_MASK,
+				   MT6357_HPP_SHORT_2VCM_VAUDP15_ENABLE);
+	else
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON2,
+				   MT6357_HPP_SHORT_2VCM_VAUDP15_MASK,
+				   MT6357_HPP_SHORT_2VCM_VAUDP15_DISABLE);
+}
+
+static bool is_valid_hp_pga_idx(int reg_idx)
+{
+	return (reg_idx >= DL_GAIN_8DB && reg_idx <= DL_GAIN_N_12DB) || reg_idx == DL_GAIN_N_40DB;
+}
+
+static void volume_ramp(struct mt6357_priv *priv, int lfrom, int lto,
+			int rfrom, int rto, unsigned int reg_addr)
+{
+	int lcount, rcount, sleep = 0;
+
+	if (!is_valid_hp_pga_idx(lfrom) || !is_valid_hp_pga_idx(lto))
+		pr_debug("%s(), invalid left volume index, from %d, to %d\n",
+			 __func__, lfrom, lto);
+
+	if (!is_valid_hp_pga_idx(rfrom) || !is_valid_hp_pga_idx(rto))
+		pr_debug("%s(), invalid right volume index, from %d, to %d\n",
+			 __func__, rfrom, rto);
+
+	if (lto > lfrom)
+		lcount = 1;
+	else
+		lcount = -1;
+
+	if (rto > rfrom)
+		rcount = 1;
+	else
+		rcount = -1;
+
+	while ((lto != lfrom) || (rto != rfrom)) {
+		if (lto != lfrom) {
+			lfrom += lcount;
+			if (is_valid_hp_pga_idx(lfrom)) {
+				regmap_update_bits(priv->regmap, reg_addr,
+						   MT6357_DL_GAIN_REG_LEFT_MASK,
+						   lfrom << MT6357_DL_GAIN_REG_LEFT_SHIFT);
+				sleep = 1;
+			}
+		}
+		if (rto != rfrom) {
+			rfrom += rcount;
+			if (is_valid_hp_pga_idx(rfrom)) {
+				regmap_update_bits(priv->regmap, reg_addr,
+						   MT6357_DL_GAIN_REG_RIGHT_MASK,
+						   rfrom << MT6357_DL_GAIN_REG_RIGHT_SHIFT);
+				sleep = 1;
+			}
+		}
+		if (sleep)
+			usleep_range(200, 300);
+	}
+}
+
+static void lo_volume_ramp(struct mt6357_priv *priv, int lfrom, int lto, int rfrom, int rto)
+{
+	volume_ramp(priv, lfrom, lto, rfrom, rto, MT6357_ZCD_CON1);
+}
+
+static void hp_volume_ramp(struct mt6357_priv *priv, int lfrom, int lto, int rfrom, int rto)
+{
+	volume_ramp(priv, lfrom, lto, rfrom, rto, MT6357_ZCD_CON2);
+}
+
+static void hs_volume_ramp(struct mt6357_priv *priv, int from, int to)
+{
+	volume_ramp(priv, from, to, 0, 0, MT6357_ZCD_CON3);
+}
+
+/* Volume and channel swap controls */
+static const DECLARE_TLV_DB_SCALE(playback_tlv, -1000, 100, 0);
+static const DECLARE_TLV_DB_SCALE(capture_tlv, 0, 600, 0);
+static const DECLARE_TLV_DB_SCALE(hp_degain_tlv, -1200, 1200, 0);
+
+static const struct snd_kcontrol_new mt6357_controls[] = {
+	/* dl pga gain */
+	SOC_DOUBLE_TLV("Headphone Volume",
+		       MT6357_ZCD_CON2, MT6357_AUD_HPL_GAIN_SFT,
+		       MT6357_AUD_HPR_GAIN_SFT, MT6357_AUD_HP_GAIN_MAX,
+		       1, playback_tlv),
+	SOC_SINGLE_TLV("Headphone Vin Volume",
+		       MT6357_AUDDEC_ANA_CON7, MT6357_HP_IVBUF_DEGAIN_SFT,
+		       MT6357_HP_IVBUF_DEGAIN_MAX, 1, hp_degain_tlv),
+	SOC_DOUBLE_TLV("Lineout Volume",
+		       MT6357_ZCD_CON1, MT6357_AUD_LOL_GAIN_SFT,
+		       MT6357_AUD_LOR_GAIN_SFT, MT6357_AUD_LO_GAIN_MAX,
+		       1, playback_tlv),
+	SOC_SINGLE_TLV("Handset Volume",
+		       MT6357_ZCD_CON3, MT6357_AUD_HS_GAIN_SFT,
+		       MT6357_AUD_HS_GAIN_MAX, 1, playback_tlv),
+	/* ul pga gain */
+	SOC_DOUBLE_R_TLV("Mic Volume",
+			 MT6357_AUDENC_ANA_CON0, MT6357_AUDENC_ANA_CON1,
+			 MT6357_AUDPREAMPLGAIN_SFT, MT6357_AUDPREAMPLGAIN_MAX,
+			 0, capture_tlv),
+};
+
+/* Uplink controls */
+
+enum {
+	MIC_TYPE_MUX_IDLE,
+	MIC_TYPE_MUX_ACC,
+	MIC_TYPE_MUX_DMIC,
+	MIC_TYPE_MUX_DCC,
+	MIC_TYPE_MUX_DCC_ECM_DIFF,
+	MIC_TYPE_MUX_DCC_ECM_SINGLE,
+	MIC_TYPE_MUX_LPBK,
+	MIC_TYPE_MUX_SGEN,
+};
+
+#define IS_DCC_BASE(type) ((type) == MIC_TYPE_MUX_DCC || \
+			(type) == MIC_TYPE_MUX_DCC_ECM_DIFF || \
+			(type) == MIC_TYPE_MUX_DCC_ECM_SINGLE)
+
+static const char * const mic_type_mux_map[] = {
+	"Idle",
+	"ACC",
+	"DMIC",
+	"DCC",
+	"DCC_ECM_DIFF",
+	"DCC_ECM_SINGLE",
+	"Loopback",
+	"Sine Generator",
+};
+
+static SOC_ENUM_SINGLE_DECL(mic_type_mux_map_enum, SND_SOC_NOPM,
+			    0, mic_type_mux_map);
+
+static const struct snd_kcontrol_new mic_type_mux_control =
+	SOC_DAPM_ENUM("Mic Type Select", mic_type_mux_map_enum);
+
+static const char * const pga_mux_map[] = {
+	"None", "AIN0", "AIN1", "AIN2"
+};
+
+static SOC_ENUM_SINGLE_DECL(pga_left_mux_map_enum,
+			    MT6357_AUDENC_ANA_CON0,
+			    MT6357_AUDPREAMPLINPUTSEL_SFT,
+			    pga_mux_map);
+
+static const struct snd_kcontrol_new pga_left_mux_control =
+	SOC_DAPM_ENUM("PGA L Select", pga_left_mux_map_enum);
+
+static SOC_ENUM_SINGLE_DECL(pga_right_mux_map_enum,
+			    MT6357_AUDENC_ANA_CON1,
+			    MT6357_AUDPREAMPRINPUTSEL_SFT,
+			    pga_mux_map);
+
+static const struct snd_kcontrol_new pga_right_mux_control =
+	SOC_DAPM_ENUM("PGA R Select", pga_right_mux_map_enum);
+
+/* Downlink controls */
+static const char * const hslo_mux_map[] = {
+	"Open", "DACR", "Playback", "Test mode"
+};
+
+static SOC_ENUM_SINGLE_DECL(lo_mux_map_enum,
+			    MT6357_AUDDEC_ANA_CON4,
+			    MT6357_AUD_LOL_MUX_INPUT_VAUDP15_SFT,
+			    hslo_mux_map);
+
+static const struct snd_kcontrol_new lo_mux_control =
+	SOC_DAPM_ENUM("Line out source", lo_mux_map_enum);
+
+static SOC_ENUM_SINGLE_DECL(hs_mux_map_enum,
+			    MT6357_AUDDEC_ANA_CON3,
+			    MT6357_AUD_HS_MUX_INPUT_VAUDP15_SFT,
+			    hslo_mux_map);
+
+static const struct snd_kcontrol_new hs_mux_control =
+	SOC_DAPM_ENUM("Handset source", hs_mux_map_enum);
+
+static const char * const hplr_mux_map[] = {
+	"Open", "Line Out", "DAC", "Handset"
+};
+
+static SOC_ENUM_SINGLE_DECL(hpr_mux_map_enum,
+			    MT6357_AUDDEC_ANA_CON0,
+			    MT6357_AUD_HPR_MUX_INPUT_VAUDP15_SFT,
+			    hplr_mux_map);
+
+static const struct snd_kcontrol_new hpr_mux_control =
+	SOC_DAPM_ENUM("Headphone Right source", hpr_mux_map_enum);
+
+static SOC_ENUM_SINGLE_DECL(hpl_mux_map_enum,
+			    MT6357_AUDDEC_ANA_CON0,
+			    MT6357_AUD_HPL_MUX_INPUT_VAUDP15_SFT,
+			    hplr_mux_map);
+
+static const struct snd_kcontrol_new hpl_mux_control =
+	SOC_DAPM_ENUM("Headphone Left source", hpl_mux_map_enum);
+
+static const char * const dac_mux_map[] = {
+	"Normal Path", "Sine Generator"
+};
+
+static SOC_ENUM_SINGLE_DECL(dac_mux_map_enum,
+			    MT6357_AFE_TOP_CON0,
+			    MT6357_DL_SINE_ON_SFT,
+			    dac_mux_map);
+
+static const struct snd_kcontrol_new dac_mux_control =
+	SOC_DAPM_ENUM("DAC Select", dac_mux_map_enum);
+
+static int mt6357_set_dmic(struct mt6357_priv *priv, bool enable)
+{
+	if (enable) {
+		/* DMIC enable */
+		regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON7,
+				   MT6357_AUDDIGMICBIAS_MASK | MT6357_AUDDIGMICEN_MASK,
+				   MT6357_AUDDIGMICBIAS_DEFAULT_VALUE | MT6357_AUDDIGMICEN_ENABLE);
+		/* enable aud_pad TX fifos */
+		regmap_update_bits(priv->regmap, MT6357_AFE_AUD_PAD_TOP,
+				   MT6357_AUD_PAD_TX_FIFO_NORMAL_PATH_MASK,
+				   MT6357_AUD_PAD_TX_FIFO_NORMAL_PATH_ENABLE);
+		/* UL dmic setting: dual mode */
+		regmap_update_bits(priv->regmap, MT6357_AFE_UL_SRC_CON0_H,
+				   MT6357_C_TWO_DIGITAL_MIC_CTL_MASK,
+				   MT6357_C_TWO_DIGITAL_MIC_ENABLE);
+		/* UL turn on SDM 3 level mode */
+		regmap_update_bits(priv->regmap, MT6357_AFE_UL_SRC_CON0_L,
+				   MT6357_UL_SDM_3_LEVEL_CTL_MASK,
+				   MT6357_UL_SDM_3_LEVEL_SELECT);
+		/* UL turn on */
+		regmap_update_bits(priv->regmap, MT6357_AFE_UL_SRC_CON0_L,
+				   MT6357_UL_SRC_ON_TMP_CTL_MASK,
+				   MT6357_UL_SRC_ENABLE);
+		/* Wait to avoid any pop noises */
+		msleep(100);
+	} else {
+		/* UL turn off */
+		regmap_update_bits(priv->regmap, MT6357_AFE_UL_SRC_CON0_L,
+				   MT6357_UL_SRC_ON_TMP_CTL_MASK,
+				   MT6357_UL_SRC_DISABLE);
+		/* UL turn on SDM 3 level mode */
+		regmap_update_bits(priv->regmap, MT6357_AFE_UL_SRC_CON0_L,
+				   MT6357_UL_SDM_3_LEVEL_CTL_MASK,
+				   MT6357_UL_SDM_3_LEVEL_DESELECT);
+		/* disable aud_pad TX fifos */
+		regmap_update_bits(priv->regmap, MT6357_AFE_AUD_PAD_TOP,
+				   MT6357_AUD_PAD_TX_FIFO_NORMAL_PATH_MASK,
+				   MT6357_AUD_PAD_TX_FIFO_NORMAL_PATH_DISABLE);
+		/* UL dmic setting: dual mode */
+		regmap_update_bits(priv->regmap, MT6357_AFE_UL_SRC_CON0_H,
+				   MT6357_C_TWO_DIGITAL_MIC_CTL_MASK,
+				   MT6357_C_TWO_DIGITAL_MIC_DISABLE);
+		/* DMIC disable */
+		regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON7,
+				   MT6357_AUDDIGMICBIAS_MASK | MT6357_AUDDIGMICEN_MASK,
+				   MT6357_AUDDIGMICBIAS_OFF | MT6357_AUDDIGMICEN_DISABLE);
+	}
+	return 0;
+}
+
+static int mt6357_set_amic(struct mt6357_priv *priv, bool enable, unsigned int mic_type)
+{
+	if (enable) {
+		if (IS_DCC_BASE(mic_type)) {
+			regmap_update_bits(priv->regmap, MT6357_AFE_DCCLK_CFG0,
+					   MT6357_DCCLK_DIV_MASK, MT6357_DCCLK_DIV_RUN_VALUE);
+			regmap_update_bits(priv->regmap, MT6357_AFE_DCCLK_CFG0,
+					   MT6357_DCCLK_PDN_MASK, MT6357_DCCLK_OUTPUT);
+			regmap_update_bits(priv->regmap, MT6357_AFE_DCCLK_CFG0,
+					   MT6357_DCCLK_GEN_ON_MASK, MT6357_DCCLK_GEN_ON);
+			regmap_update_bits(priv->regmap, MT6357_AFE_DCCLK_CFG1,
+					   MT6357_DCCLK_RESYNC_BYPASS_MASK,
+					   MT6357_DCCLK_RESYNC_BYPASS);
+
+			/* mic bias 0: set the correct DC couple*/
+			switch (mic_type) {
+			case MIC_TYPE_MUX_DCC_ECM_DIFF:
+				regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON8,
+						   MT6357_AUD_MICBIAS0_DC_MASK,
+						   MT6357_AUD_MICBIAS0_DC_ENABLE_ALL);
+				break;
+			case MIC_TYPE_MUX_DCC_ECM_SINGLE:
+				regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON8,
+						   MT6357_AUD_MICBIAS0_DC_MASK,
+						   MT6357_AUD_MICBIAS0_DC_ENABLE_P1);
+				break;
+			default:
+				regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON8,
+						   MT6357_AUD_MICBIAS0_DC_MASK,
+						   MT6357_AUD_MICBIAS0_DC_DISABLE_ALL);
+				break;
+			}
+
+			/* mic bias 1: set the correct DC couple */
+			if (mic_type == MIC_TYPE_MUX_DCC_ECM_SINGLE)
+				regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON9,
+						   MT6357_AUD_MICBIAS1_DCSW1P_EN_MASK,
+						   MT6357_AUD_MICBIAS1_DCSW1P_ENABLE);
+
+			/* Audio L/R preamplifier DCC precharge */
+			regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON0,
+					   MT6357_AUDPREAMPLDCPRECHARGE_MASK,
+					   MT6357_AUDPREAMPLDCPRECHARGE_ENABLE);
+			regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON1,
+					   MT6357_AUDPREAMPRDCPRECHARGE_MASK,
+					   MT6357_AUDPREAMPRDCPRECHARGE_ENABLE);
+			/* L preamplifier DCCEN */
+			regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON0,
+					   MT6357_AUDPREAMPLDCCEN_MASK,
+					   MT6357_AUDPREAMPLDCCEN_DC);
+			/* R preamplifier DCCEN */
+			regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON1,
+					   MT6357_AUDPREAMPRDCCEN_MASK,
+					   MT6357_AUDPREAMPRDCCEN_DC);
+		} else {
+			/* Audio L preamplifier DCC precharge disable */
+			regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON0,
+					   MT6357_AUDPREAMPLDCPRECHARGE_MASK,
+					   MT6357_AUDPREAMPLDCPRECHARGE_DISABLE);
+			/* L preamplifier ACC */
+			regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON0,
+					   MT6357_AUDPREAMPLDCCEN_MASK,
+					   MT6357_AUDPREAMPLDCCEN_AC);
+			/* Audio R preamplifier DCC precharge disable */
+			regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON1,
+					   MT6357_AUDPREAMPRDCPRECHARGE_MASK,
+					   MT6357_AUDPREAMPRDCPRECHARGE_DISABLE);
+			/* R preamplifier ACC */
+			regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON1,
+					   MT6357_AUDPREAMPRDCCEN_MASK,
+					   MT6357_AUDPREAMPRDCCEN_AC);
+		}
+	} else {
+		/* disable any Mic Bias 0 DC couple */
+		regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON8,
+				   MT6357_AUD_MICBIAS0_DC_MASK,
+				   MT6357_AUD_MICBIAS0_DC_DISABLE_ALL);
+		/* disable any Mic Bias 1 DC couple */
+		regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON9,
+				   MT6357_AUD_MICBIAS1_DCSW1P_EN_MASK,
+				   MT6357_AUD_MICBIAS1_DCSW1P_DISABLE);
+		if (IS_DCC_BASE(mic_type)) {
+			regmap_update_bits(priv->regmap, MT6357_AFE_DCCLK_CFG0,
+					   MT6357_DCCLK_GEN_ON_MASK, MT6357_DCCLK_GEN_OFF);
+			regmap_update_bits(priv->regmap, MT6357_AFE_DCCLK_CFG0,
+					   MT6357_DCCLK_PDN_MASK, MT6357_DCCLK_PDN);
+			regmap_update_bits(priv->regmap, MT6357_AFE_DCCLK_CFG0,
+					   MT6357_DCCLK_DIV_MASK, MT6357_DCCLK_DIV_STOP_VALUE);
+		}
+	}
+
+	return 0;
+}
+
+static int mt6357_set_loopback(struct mt6357_priv *priv, bool enable)
+{
+	if (enable) {
+		/* enable aud_pad TX fifos */
+		regmap_update_bits(priv->regmap, MT6357_AFE_AUD_PAD_TOP,
+				   MT6357_AUD_PAD_TX_FIFO_NORMAL_PATH_MASK,
+				   MT6357_AUD_PAD_TX_FIFO_NORMAL_PATH_ENABLE);
+		/* enable aud_pad lpk TX fifos */
+		regmap_update_bits(priv->regmap, MT6357_AFE_AUD_PAD_TOP,
+				   MT6357_AUD_PAD_TX_FIFO_LPBK_MASK,
+				   MT6357_AUD_PAD_TX_FIFO_LPBK_ENABLE);
+		/* Set UL Part: enable new lpbk 2 */
+		regmap_update_bits(priv->regmap, MT6357_AFE_ADDA_MTKAIF_CFG0,
+				   MT6357_ADDA_MTKAIF_LPBK_CTL_MASK,
+				   MT6357_ADDA_MTKAIF_LPBK_ENABLE);
+		/* UL turn on */
+		regmap_update_bits(priv->regmap, MT6357_AFE_UL_SRC_CON0_L,
+				   MT6357_UL_SRC_ON_TMP_CTL_MASK,
+				   MT6357_UL_SRC_ENABLE);
+	} else {
+		/* UL turn off */
+		regmap_update_bits(priv->regmap, MT6357_AFE_UL_SRC_CON0_L,
+				   MT6357_UL_SRC_ON_TMP_CTL_MASK,
+				   MT6357_UL_SRC_DISABLE);
+		/* disable new lpbk 2 */
+		regmap_update_bits(priv->regmap, MT6357_AFE_ADDA_MTKAIF_CFG0,
+				   MT6357_ADDA_MTKAIF_LPBK_CTL_MASK,
+				   MT6357_ADDA_MTKAIF_LPBK_DISABLE);
+		/* disable aud_pad lpbk TX fifos */
+		regmap_update_bits(priv->regmap, MT6357_AFE_AUD_PAD_TOP,
+				   MT6357_AUD_PAD_TX_FIFO_LPBK_MASK,
+				   MT6357_AUD_PAD_TX_FIFO_LPBK_DISABLE);
+		/* disable aud_pad TX fifos */
+		regmap_update_bits(priv->regmap, MT6357_AFE_AUD_PAD_TOP,
+				   MT6357_AUD_PAD_TX_FIFO_NORMAL_PATH_MASK,
+				   MT6357_AUD_PAD_TX_FIFO_NORMAL_PATH_DISABLE);
+	}
+
+	return 0;
+}
+
+static int mt6357_set_ul_sine_gen(struct mt6357_priv *priv, bool enable)
+{
+	if (enable) {
+		/* enable aud_pad TX fifos */
+		regmap_update_bits(priv->regmap, MT6357_AFE_AUD_PAD_TOP,
+				   MT6357_AUD_PAD_TX_FIFO_NORMAL_PATH_MASK,
+				   MT6357_AUD_PAD_TX_FIFO_NORMAL_PATH_ENABLE);
+		/* UL turn on */
+		regmap_update_bits(priv->regmap, MT6357_AFE_UL_SRC_CON0_L,
+				   MT6357_UL_SRC_ON_TMP_CTL_MASK,
+				   MT6357_UL_SRC_ENABLE);
+	} else {
+		/* UL turn off */
+		regmap_update_bits(priv->regmap, MT6357_AFE_UL_SRC_CON0_L,
+				   MT6357_UL_SRC_ON_TMP_CTL_MASK,
+				   MT6357_UL_SRC_DISABLE);
+		/* disable aud_pad TX fifos */
+		regmap_update_bits(priv->regmap, MT6357_AFE_AUD_PAD_TOP,
+				   MT6357_AUD_PAD_TX_FIFO_NORMAL_PATH_MASK,
+				   MT6357_AUD_PAD_TX_FIFO_NORMAL_PATH_DISABLE);
+	}
+
+	return 0;
+}
+
+static int mt_aif_out_event(struct snd_soc_dapm_widget *w,
+			    struct snd_kcontrol *kcontrol,
+			    int event)
+{
+	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
+	struct mt6357_priv *priv = snd_soc_component_get_drvdata(cmpnt);
+
+	switch (event) {
+	case SND_SOC_DAPM_PRE_PMU:
+		set_capture_gpio(priv, true);
+		break;
+	case SND_SOC_DAPM_POST_PMD:
+		set_capture_gpio(priv, false);
+		break;
+	default:
+		break;
+	}
+
+	return 0;
+}
+
+static int mt_adc_supply_event(struct snd_soc_dapm_widget *w,
+			       struct snd_kcontrol *kcontrol,
+			       int event)
+{
+	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
+	struct mt6357_priv *priv = snd_soc_component_get_drvdata(cmpnt);
+
+	switch (event) {
+	case SND_SOC_DAPM_PRE_PMU:
+		/* Enable audio ADC CLKGEN  */
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON11,
+				   MT6357_RSTB_ENCODER_VA28_MASK, MT6357_RSTB_ENCODER_VA28_ENABLE);
+		/* Enable  LCLDO_ENC 2P8V */
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON12,
+				   MT6357_LCLDO_ENC_EN_VA28_MASK, MT6357_LCLDO_ENC_EN_VA28_ENABLE);
+		/* LCLDO_ENC remote sense */
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON12,
+				   MT6357_VA28REFGEN_EN_VA28_MASK |
+				   MT6357_LCLDO_ENC_REMOTE_SENSE_VA28_MASK,
+				   MT6357_VA28REFGEN_EN_VA28_ENABLE |
+				   MT6357_LCLDO_ENC_REMOTE_SENSE_VA28_ENABLE);
+		break;
+	case SND_SOC_DAPM_POST_PMD:
+		/* LCLDO_ENC remote sense off */
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON12,
+				   MT6357_VA28REFGEN_EN_VA28_MASK |
+				   MT6357_LCLDO_ENC_REMOTE_SENSE_VA28_MASK,
+				   MT6357_VA28REFGEN_EN_VA28_DISABLE |
+				   MT6357_LCLDO_ENC_REMOTE_SENSE_VA28_DISABLE);
+		/* disable LCLDO_ENC 2P8V */
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON12,
+				   MT6357_LCLDO_ENC_EN_VA28_MASK,
+				   MT6357_LCLDO_ENC_EN_VA28_DISABLE);
+		/* disable audio ADC CLKGEN  */
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON11,
+				   MT6357_RSTB_ENCODER_VA28_MASK,
+				   MT6357_RSTB_ENCODER_VA28_DISABLE);
+		break;
+	default:
+		break;
+	}
+
+	return 0;
+}
+
+static int mt_mic_type_event(struct snd_soc_dapm_widget *w,
+			     struct snd_kcontrol *kcontrol,
+			     int event)
+{
+	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
+	struct mt6357_priv *priv = snd_soc_component_get_drvdata(cmpnt);
+	unsigned int mic_type = dapm_kcontrol_get_value(w->kcontrols[0]);
+
+	switch (event) {
+	case SND_SOC_DAPM_PRE_PMU:
+		switch (mic_type) {
+		case MIC_TYPE_MUX_DMIC:
+			mt6357_set_dmic(priv, true);
+			break;
+		case MIC_TYPE_MUX_LPBK:
+			mt6357_set_loopback(priv, true);
+			break;
+		case MIC_TYPE_MUX_SGEN:
+			mt6357_set_ul_sine_gen(priv, true);
+			break;
+		default:
+			mt6357_set_amic(priv, true, mic_type);
+			break;
+		}
+		break;
+	case SND_SOC_DAPM_POST_PMD:
+		switch (mic_type) {
+		case MIC_TYPE_MUX_DMIC:
+			mt6357_set_dmic(priv, false);
+			break;
+		case MIC_TYPE_MUX_LPBK:
+			mt6357_set_loopback(priv, false);
+			break;
+		case MIC_TYPE_MUX_SGEN:
+			mt6357_set_ul_sine_gen(priv, false);
+			break;
+		default:
+			mt6357_set_amic(priv, false, mic_type);
+			break;
+		}
+		break;
+	default:
+		break;
+	}
+
+	return 0;
+}
+
+static int mt_pga_left_event(struct snd_soc_dapm_widget *w,
+			     struct snd_kcontrol *kcontrol,
+			     int event)
+{
+	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
+	struct mt6357_priv *priv = snd_soc_component_get_drvdata(cmpnt);
+
+	switch (event) {
+	case SND_SOC_DAPM_POST_PMU:
+		/* L preamplifier enable */
+		regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON0,
+				   MT6357_AUDPREAMPLON_MASK,
+				   MT6357_AUDPREAMPLON_ENABLE);
+		/* L ADC input sel : L PGA. Enable audio L ADC */
+		regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON0,
+				   MT6357_AUDADCLINPUTSEL_MASK,
+				   MT6357_AUDADCLINPUTSEL_PREAMPLIFIER);
+		regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON0,
+				   MT6357_AUDADCLPWRUP_MASK,
+				   MT6357_AUDADCLPWRUP);
+		/* Audio L preamplifier DCC precharge off */
+		regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON0,
+				   MT6357_AUDPREAMPLDCPRECHARGE_MASK,
+				   MT6357_AUDPREAMPLDCPRECHARGE_DISABLE);
+		break;
+	case SND_SOC_DAPM_PRE_PMD:
+		/* Audio L ADC input sel : off, disable audio L ADC */
+		regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON0,
+				   MT6357_AUDADCLPWRUP_MASK,
+				   MT6357_AUDADCLPWRDOWN);
+		regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON0,
+				   MT6357_AUDADCLINPUTSEL_MASK,
+				   MT6357_AUDADCLINPUTSEL_IDLE);
+		/* L preamplifier ACC */
+		regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON0,
+				   MT6357_AUDPREAMPLDCCEN_MASK,
+				   MT6357_AUDPREAMPLDCCEN_AC);
+		/* L preamplifier disable */
+		regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON0,
+				   MT6357_AUDPREAMPLON_MASK,
+				   MT6357_AUDPREAMPLON_DISABLE);
+		/* disable Audio L preamplifier DCC precharge */
+		regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON0,
+				   MT6357_AUDPREAMPLDCPRECHARGE_MASK,
+				   MT6357_AUDPREAMPLDCPRECHARGE_DISABLE);
+		break;
+	default:
+		break;
+	}
+
+	return 0;
+}
+
+static int mt_pga_right_event(struct snd_soc_dapm_widget *w,
+			      struct snd_kcontrol *kcontrol,
+			      int event)
+{
+	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
+	struct mt6357_priv *priv = snd_soc_component_get_drvdata(cmpnt);
+
+	switch (event) {
+	case SND_SOC_DAPM_POST_PMU:
+		/* R preamplifier enable */
+		regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON1,
+				   MT6357_AUDPREAMPRON_MASK, MT6357_AUDPREAMPRON_ENABLE);
+		/* R ADC input sel : R PGA. Enable audio R ADC */
+		regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON1,
+				   MT6357_AUDADCRINPUTSEL_MASK,
+				   MT6357_AUDADCRINPUTSEL_PREAMPLIFIER);
+		regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON1,
+				   MT6357_AUDADCRPWRUP_MASK, MT6357_AUDADCRPWRUP);
+		/* Audio R preamplifier DCC precharge off */
+		regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON1,
+				   MT6357_AUDPREAMPRDCPRECHARGE_MASK,
+				   MT6357_AUDPREAMPRDCPRECHARGE_DISABLE);
+		break;
+	case SND_SOC_DAPM_PRE_PMD:
+		/* Audio R ADC input sel : off, disable audio R ADC */
+		regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON1,
+				   MT6357_AUDADCRPWRUP_MASK, MT6357_AUDADCRPWRDOWN);
+		regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON0,
+				   MT6357_AUDADCRINPUTSEL_MASK, MT6357_AUDADCRINPUTSEL_IDLE);
+		/* R preamplifier ACC */
+		regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON1,
+				   MT6357_AUDPREAMPRDCCEN_MASK, MT6357_AUDPREAMPRDCCEN_AC);
+		/* R preamplifier disable */
+		regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON1,
+				   MT6357_AUDPREAMPRON_MASK, MT6357_AUDPREAMPRON_DISABLE);
+		/* disable Audio R preamplifier DCC precharge */
+		regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON1,
+				   MT6357_AUDPREAMPRDCPRECHARGE_MASK,
+				   MT6357_AUDPREAMPRDCPRECHARGE_DISABLE);
+		break;
+	default:
+		break;
+	}
+
+	return 0;
+}
+
+static int adc_enable_event(struct snd_soc_dapm_widget *w,
+			    struct snd_kcontrol *kcontrol,
+			    int event)
+{
+	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
+	struct mt6357_priv *priv = snd_soc_component_get_drvdata(cmpnt);
+	int lgain, rgain;
+
+	switch (event) {
+	case SND_SOC_DAPM_PRE_PMU:
+		regmap_read(priv->regmap, MT6357_AUDENC_ANA_CON0, &lgain);
+		regmap_read(priv->regmap, MT6357_AUDENC_ANA_CON1, &rgain);
+		/* L PGA 0 dB gain */
+		regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON0,
+				   MT6357_AUDPREAMPLGAIN_MASK,
+				   UL_GAIN_0DB << MT6357_AUDPREAMPLGAIN_SFT);
+		/* R PGA 0 dB gain */
+		regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON1,
+				   MT6357_AUDPREAMPRGAIN_MASK,
+				   UL_GAIN_0DB << MT6357_AUDPREAMPRGAIN_SFT);
+		/* enable aud_pad TX fifos */
+		regmap_update_bits(priv->regmap, MT6357_AFE_AUD_PAD_TOP,
+				   MT6357_AUD_PAD_TX_FIFO_NORMAL_PATH_MASK,
+				   MT6357_AUD_PAD_TX_FIFO_NORMAL_PATH_ENABLE);
+		/* UL turn on */
+		regmap_update_bits(priv->regmap, MT6357_AFE_UL_SRC_CON0_L,
+				   MT6357_UL_SRC_ON_TMP_CTL_MASK, MT6357_UL_SRC_ENABLE);
+		/* Wait to avoid any pop noises */
+		msleep(100);
+		/* set the mic gains to the stored values */
+		regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON0,
+				   MT6357_AUDPREAMPLGAIN_MASK, lgain);
+		regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON1,
+				   MT6357_AUDPREAMPRGAIN_MASK, rgain);
+		break;
+	case SND_SOC_DAPM_POST_PMD:
+		/* UL turn off */
+		regmap_update_bits(priv->regmap, MT6357_AFE_UL_SRC_CON0_L,
+				   MT6357_UL_SRC_ON_TMP_CTL_MASK, MT6357_UL_SRC_DISABLE);
+		/* disable aud_pad TX fifos */
+		regmap_update_bits(priv->regmap, MT6357_AFE_AUD_PAD_TOP,
+				   MT6357_AUD_PAD_TX_FIFO_NORMAL_PATH_MASK,
+				   MT6357_AUD_PAD_TX_FIFO_NORMAL_PATH_DISABLE);
+		break;
+	default:
+		break;
+	}
+
+	return 0;
+}
+
+static void configure_downlinks(struct mt6357_priv *priv, bool enable)
+{
+	if (enable) {
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ELR_0,
+				   MT6357_AUD_HP_TRIM_EN_VAUDP15_MASK,
+				   MT6357_AUD_HP_TRIM_EN_VAUDP15_ENABLE);
+		/* Disable headphone short-circuit protection */
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON0,
+				   MT6357_AUD_HPR_SC_VAUDP15_MASK | MT6357_AUD_HPL_SC_VAUDP15_MASK,
+				   MT6357_AUD_HPR_SC_VAUDP15_DISABLE |
+				   MT6357_AUD_HPL_SC_VAUDP15_DISABLE);
+		/* Disable handset short-circuit protection */
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON3,
+				   MT6357_AUD_HS_SC_VAUDP15_MASK,
+				   MT6357_AUD_HS_SC_VAUDP15_DISABLE);
+		/* Disable lineout short-circuit protection */
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON4,
+				   MT6357_AUD_LOL_SC_VAUDP15_MASK,
+				   MT6357_AUD_LOL_SC_VAUDP15_DISABLE);
+		/* Reduce ESD resistance of AU_REFN */
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON2,
+				   MT6357_AUD_REFN_DERES_VAUDP15_MASK,
+				   MT6357_AUD_REFN_DERES_VAUDP15_ENABLE);
+		/* Turn on DA_600K_NCP_VA18 */
+		regmap_write(priv->regmap, MT6357_AUDNCP_CLKDIV_CON1, MT6357_DIVCKS_ON);
+		/* Set NCP clock as 604kHz // 26MHz/43 = 604KHz */
+		regmap_write(priv->regmap, MT6357_AUDNCP_CLKDIV_CON2, 0x002c);
+		/* Toggle DIVCKS_CHG */
+		regmap_write(priv->regmap, MT6357_AUDNCP_CLKDIV_CON0, MT6357_DIVCKS_CHG);
+		/* Set NCP soft start mode as default mode: 150us */
+		regmap_write(priv->regmap, MT6357_AUDNCP_CLKDIV_CON4,
+			     MT6357_DIVCKS_PWD_NCP_ST_150US);
+		/* Enable NCP */
+		regmap_write(priv->regmap, MT6357_AUDNCP_CLKDIV_CON3,
+			     MT6357_DIVCKS_PWD_NCP_ENABLE);
+		usleep_range(250, 270);
+		/* Enable cap-less LDOs (1.5V) */
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON12,
+				   MT6357_VA33REFGEN_EN_VA18_MASK |
+				   MT6357_LCLDO_REMOTE_SENSE_VA18_MASK |
+				   MT6357_LCLDO_EN_VA18_MASK |
+				   MT6357_HCLDO_REMOTE_SENSE_VA18_MASK |
+				   MT6357_HCLDO_EN_VA18_MASK,
+				   MT6357_VA33REFGEN_EN_VA18_ENABLE |
+				   MT6357_LCLDO_REMOTE_SENSE_VA18_ENABLE |
+				   MT6357_LCLDO_EN_VA18_ENABLE |
+				   MT6357_HCLDO_REMOTE_SENSE_VA18_ENABLE |
+				   MT6357_HCLDO_EN_VA18_ENABLE);
+		/* Enable NV regulator (-1.2V) */
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON13,
+				   MT6357_NVREG_EN_VAUDP15_MASK, MT6357_NVREG_EN_VAUDP15_ENABLE);
+		usleep_range(100, 120);
+		/* Enable IBIST */
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON10,
+				   MT6357_AUD_IBIAS_PWRDN_VAUDP15_MASK,
+				   MT6357_AUD_IBIAS_PWRDN_VAUDP15_ENABLE);
+		/* Enable AUD_CLK */
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON11,
+				   MT6357_RSTB_DECODER_VA28_MASK,
+				   MT6357_RSTB_DECODER_VA28_ENABLE);
+		/* Enable low-noise mode of DAC */
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON6,
+				   MT6357_DAC_LOW_NOISE_MODE_MASK,
+				   MT6357_DAC_LOW_NOISE_MODE_ENABLE);
+		usleep_range(100, 120);
+	} else {
+		/* Disable low-noise mode of DAC */
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON6,
+				   MT6357_DAC_LOW_NOISE_MODE_MASK,
+				   MT6357_DAC_LOW_NOISE_MODE_DISABLE);
+		/* Disable AUD_CLK */
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON11,
+				   MT6357_RSTB_DECODER_VA28_MASK,
+				   MT6357_RSTB_DECODER_VA28_DISABLE);
+		/* Enable linout short-circuit protection */
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON4,
+				   MT6357_AUD_LOL_SC_VAUDP15_MASK,
+				   MT6357_AUD_LOL_SC_VAUDP15_ENABLE);
+		/* Enable handset short-circuit protection */
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON3,
+				   MT6357_AUD_HS_SC_VAUDP15_MASK,
+				   MT6357_AUD_HS_SC_VAUDP15_ENABLE);
+		/* Enable headphone short-circuit protection */
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON0,
+				   MT6357_AUD_HPR_SC_VAUDP15_MASK |
+				   MT6357_AUD_HPL_SC_VAUDP15_MASK,
+				   MT6357_AUD_HPR_SC_VAUDP15_ENABLE |
+				   MT6357_AUD_HPL_SC_VAUDP15_ENABLE);
+		/* Disable IBIST */
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON10,
+				   MT6357_AUD_IBIAS_PWRDN_VAUDP15_MASK,
+				   MT6357_AUD_IBIAS_PWRDN_VAUDP15_DISABLE);
+		/* Disable NV regulator (-1.2V) */
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON13,
+				   MT6357_NVREG_EN_VAUDP15_MASK,
+				   MT6357_NVREG_EN_VAUDP15_DISABLE);
+		/* Disable cap-less LDOs (1.5V) */
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON12,
+				   MT6357_VA33REFGEN_EN_VA18_MASK |
+				   MT6357_LCLDO_REMOTE_SENSE_VA18_MASK |
+				   MT6357_LCLDO_EN_VA18_MASK |
+				   MT6357_HCLDO_REMOTE_SENSE_VA18_MASK |
+				   MT6357_HCLDO_EN_VA18_MASK,
+				   MT6357_VA33REFGEN_EN_VA18_DISABLE |
+				   MT6357_LCLDO_REMOTE_SENSE_VA18_DISABLE |
+				   MT6357_LCLDO_EN_VA18_DISABLE |
+				   MT6357_HCLDO_REMOTE_SENSE_VA18_DISABLE |
+				   MT6357_HCLDO_EN_VA18_DISABLE);
+		/* Disable NCP */
+		regmap_update_bits(priv->regmap, MT6357_AUDNCP_CLKDIV_CON3,
+				   MT6357_DIVCKS_PWD_NCP_MASK, MT6357_DIVCKS_PWD_NCP_DISABLE);
+	}
+}
+
+static int mt_audio_in_event(struct snd_soc_dapm_widget *w,
+			     struct snd_kcontrol *kcontrol,
+			     int event)
+{
+	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
+	struct mt6357_priv *priv = snd_soc_component_get_drvdata(cmpnt);
+
+	switch (event) {
+	case SND_SOC_DAPM_PRE_PMU:
+		set_playback_gpio(priv, true);
+
+		/* Pull-down HPL/R to AVSS28_AUD */
+		if (priv->pull_down_needed)
+			hp_pull_down(priv, true);
+
+		/* Disable HP main CMFB Switch */
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON6,
+				   MT6357_HPRL_MAIN_CMFB_LOOP_MASK,
+				   MT6357_HPRL_MAIN_CMFB_LOOP_DISABLE);
+		/* Audio system digital clock power down release */
+		regmap_write(priv->regmap, MT6357_AFUNC_AUD_CON2,
+			     MT6357_CCI_AUDIO_FIFO_DISABLE |
+			     MT6357_CCI_ACD_MODE_NORMAL_PATH |
+			     MT6357_CCI_AFIFO_CLK_PWDB_ON |
+			     MT6357_CCI_ACD_FUNC_RSTB_RESET);
+		/* sdm audio fifo clock power on */
+		regmap_write(priv->regmap, MT6357_AFUNC_AUD_CON0,
+			     MT6357_CCI_AUD_ANACK_INVERT |
+			     (4 << MT6357_CCI_AUDIO_FIFO_WPTR_SFT) |
+			     MT6357_CCI_SCRAMBLER_CG_ENABLE |
+			     MT6357_CCI_RAND_ENABLE |
+			     MT6357_CCI_SPLT_SCRMB_CLK_ON |
+			     MT6357_CCI_SPLT_SCRMB_ON |
+			     MT6357_CCI_ZERO_PADDING_DISABLE |
+			     MT6357_CCI_SCRAMBLER_ENABLE);
+		/* scrambler clock on enable */
+		regmap_write(priv->regmap, MT6357_AFUNC_AUD_CON2,
+			     MT6357_CCI_AUDIO_FIFO_DISABLE |
+			     MT6357_CCI_ACD_MODE_TEST_PATH |
+			     MT6357_CCI_AFIFO_CLK_PWDB_ON |
+			     MT6357_CCI_ACD_FUNC_RSTB_RELEASE);
+		/* sdm power on */
+		regmap_write(priv->regmap, MT6357_AFUNC_AUD_CON2,
+			     MT6357_CCI_AUDIO_FIFO_ENABLE |
+			     MT6357_CCI_ACD_MODE_TEST_PATH |
+			     MT6357_CCI_AFIFO_CLK_PWDB_ON |
+			     MT6357_CCI_ACD_FUNC_RSTB_RELEASE);
+
+		configure_downlinks(priv, true);
+		break;
+	case SND_SOC_DAPM_POST_PMD:
+		configure_downlinks(priv, false);
+		/* DL scrambler disabling sequence */
+		regmap_write(priv->regmap, MT6357_AFUNC_AUD_CON2,
+			     MT6357_CCI_AUDIO_FIFO_DISABLE |
+			     MT6357_CCI_ACD_MODE_TEST_PATH |
+			     MT6357_CCI_AFIFO_CLK_PWDB_DOWN |
+			     MT6357_CCI_ACD_FUNC_RSTB_RESET);
+		regmap_write(priv->regmap, MT6357_AFUNC_AUD_CON0,
+			     MT6357_CCI_AUD_ANACK_INVERT |
+			     (4 << MT6357_CCI_AUDIO_FIFO_WPTR_SFT) |
+			     MT6357_CCI_SCRAMBLER_CG_ENABLE |
+			     MT6357_CCI_RAND_ENABLE |
+			     MT6357_CCI_SPLT_SCRMB_CLK_ON |
+			     MT6357_CCI_SPLT_SCRMB_ON |
+			     MT6357_CCI_ZERO_PADDING_DISABLE |
+			     MT6357_CCI_SCRAMBLER_DISABLE);
+
+		set_playback_gpio(priv, false);
+
+		/* disable Pull-down HPL/R to AVSS28_AUD */
+		if (priv->pull_down_needed)
+			hp_pull_down(priv, false);
+		break;
+	default:
+		break;
+	}
+
+	return 0;
+}
+
+static int mt_delay_250_event(struct snd_soc_dapm_widget *w,
+			      struct snd_kcontrol *kcontrol,
+			      int event)
+{
+	switch (event) {
+	case SND_SOC_DAPM_POST_PMU:
+		usleep_range(250, 270);
+		break;
+	case SND_SOC_DAPM_PRE_PMD:
+		usleep_range(250, 270);
+		break;
+	default:
+		break;
+	}
+
+	return 0;
+}
+
+static int lo_mux_event(struct snd_soc_dapm_widget *w,
+			struct snd_kcontrol *kcontrol,
+			int event)
+{
+	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
+	struct mt6357_priv *priv = snd_soc_component_get_drvdata(cmpnt);
+	int lgain, rgain;
+
+	/* Get current gain value */
+	regmap_read(priv->regmap, MT6357_ZCD_CON1, &lgain);
+	rgain = (lgain & MT6357_AUD_LOR_GAIN_MASK) >> MT6357_AUD_LOR_GAIN_SFT;
+	lgain = lgain & MT6357_AUD_LOL_GAIN_MASK;
+	switch (event) {
+	case SND_SOC_DAPM_POST_PMU:
+		/* Set -40dB before enable HS to avoid POP noise */
+		regmap_update_bits(priv->regmap, MT6357_ZCD_CON1,
+				   MT6357_AUD_LOL_GAIN_MASK |
+				   MT6357_AUD_LOR_GAIN_MASK,
+				   MT6357_DL_GAIN_N_40DB_REG);
+		/* Set LO STB enhance circuits */
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON4,
+				   MT6357_AUD_LOLOUT_STB_ENH_VAUDP15_MASK,
+				   MT6357_AUD_LOLOUT_STB_ENH_VAUDP15_ENABLE);
+		/* Enable LO driver bias circuits */
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON4,
+				   MT6357_AUD_LOL_PWRUP_BIAS_VAUDP15_MASK,
+				   MT6357_AUD_LOL_PWRUP_BIAS_VAUDP15_ENABLE);
+		/* Enable LO driver core circuits */
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON4,
+				   MT6357_AUD_LOL_PWRUP_VAUDP15_MASK,
+				   MT6357_AUD_LOL_PWRUP_VAUDP15_ENABLE);
+		/* Set LOL gain to normal gain step by step */
+		lo_volume_ramp(priv, DL_GAIN_N_40DB, lgain,
+			       DL_GAIN_N_40DB, rgain);
+		break;
+	case SND_SOC_DAPM_PRE_PMD:
+		/* decrease LOL gain to minimum gain step by step */
+
+		lo_volume_ramp(priv, lgain, DL_GAIN_N_40DB,
+			       rgain, DL_GAIN_N_40DB);
+		/* Disable LO driver core circuits */
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON4,
+				   MT6357_AUD_LOL_PWRUP_VAUDP15_MASK,
+				   MT6357_AUD_LOL_PWRUP_VAUDP15_DISABLE);
+		/* Disable LO driver bias circuits */
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON4,
+				   MT6357_AUD_LOL_PWRUP_BIAS_VAUDP15_MASK,
+				   MT6357_AUD_LOL_PWRUP_BIAS_VAUDP15_DISABLE);
+		/* Clear LO STB enhance circuits */
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON4,
+				   MT6357_AUD_LOLOUT_STB_ENH_VAUDP15_MASK,
+				   MT6357_AUD_LOLOUT_STB_ENH_VAUDP15_DISABLE);
+		/* Save the gain value into the register*/
+		regmap_update_bits(priv->regmap, MT6357_ZCD_CON1,
+				   MT6357_AUD_LOL_GAIN_MASK |
+				   MT6357_AUD_LOR_GAIN_MASK,
+				   lgain << MT6357_AUD_LOL_GAIN_SFT |
+				   rgain << MT6357_AUD_LOR_GAIN_SFT);
+
+		break;
+	default:
+		break;
+	}
+
+	return 0;
+}
+
+static int hs_mux_event(struct snd_soc_dapm_widget *w,
+			struct snd_kcontrol *kcontrol,
+			int event)
+{
+	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
+	struct mt6357_priv *priv = snd_soc_component_get_drvdata(cmpnt);
+	int gain; /* HS register has only one gain slot */
+
+	/* Get current gain value */
+	regmap_read(priv->regmap, MT6357_ZCD_CON3, &gain);
+	switch (event) {
+	case SND_SOC_DAPM_POST_PMU:
+		/* Set -40dB before enable HS to avoid POP noise */
+		regmap_update_bits(priv->regmap, MT6357_ZCD_CON3,
+				   MT6357_AUD_HS_GAIN_MASK,
+				   DL_GAIN_N_40DB);
+
+		/* Set HS STB enhance circuits */
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON3,
+				   MT6357_AUD_HSOUT_STB_ENH_VAUDP15_MASK,
+				   MT6357_AUD_HSOUT_STB_ENH_VAUDP15_ENABLE);
+		/* Enable HS driver bias circuits */
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON3,
+				   MT6357_AUD_HS_PWRUP_BIAS_VAUDP15_MASK,
+				   MT6357_AUD_HS_PWRUP_BIAS_VAUDP15_ENABLE);
+		/* Enable HS driver core circuits */
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON3,
+				   MT6357_AUD_HS_PWRUP_VAUDP15_MASK,
+				   MT6357_AUD_HS_PWRUP_VAUDP15_ENABLE);
+		/* Set HS gain to normal gain step by step */
+		hs_volume_ramp(priv, DL_GAIN_N_40DB, gain);
+		break;
+	case SND_SOC_DAPM_PRE_PMD:
+		/* decrease HS gain to minimum gain step by step */
+		hs_volume_ramp(priv,  gain, DL_GAIN_N_40DB);
+		/* Disable HS driver core circuits */
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON3,
+				   MT6357_AUD_HS_PWRUP_VAUDP15_MASK,
+				   MT6357_AUD_HS_PWRUP_VAUDP15_DISABLE);
+		/* Disable HS driver bias circuits */
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON3,
+				   MT6357_AUD_HS_PWRUP_BIAS_VAUDP15_MASK,
+				   MT6357_AUD_HS_PWRUP_BIAS_VAUDP15_ENABLE);
+		/* Clear HS STB enhance circuits */
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON3,
+				   MT6357_AUD_HSOUT_STB_ENH_VAUDP15_MASK,
+				   MT6357_AUD_HSOUT_STB_ENH_VAUDP15_DISABLE);
+		/* Save the gain value into the register*/
+		regmap_update_bits(priv->regmap, MT6357_ZCD_CON3,
+				   MT6357_AUD_HS_GAIN_MASK, gain);
+		break;
+	default:
+		break;
+	}
+
+	return 0;
+}
+
+static int hp_main_mux_event(struct snd_soc_dapm_widget *w,
+			     struct snd_kcontrol *kcontrol,
+			     int event)
+{
+	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
+	struct mt6357_priv *priv = snd_soc_component_get_drvdata(cmpnt);
+	int lgain, rgain;
+
+	/* Get current gain value */
+	regmap_read(priv->regmap, MT6357_ZCD_CON2, &lgain);
+	rgain = (lgain & MT6357_AUD_HPR_GAIN_MASK) >> MT6357_AUD_HPR_GAIN_SFT;
+	lgain = lgain & MT6357_AUD_HPL_GAIN_MASK;
+	switch (event) {
+	case SND_SOC_DAPM_POST_PMU:
+		priv->hp_channel_number++;
+		if (priv->hp_channel_number > 1)
+			break;
+		/* Set -40dB before enable HS to avoid POP noise */
+		regmap_update_bits(priv->regmap, MT6357_ZCD_CON2,
+				   MT6357_AUD_HPL_GAIN_MASK |
+				   MT6357_AUD_HPR_GAIN_MASK,
+				   MT6357_DL_GAIN_N_40DB_REG);
+		/* Set HPP/N STB enhance circuits */
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON2,
+				   MT6357_HPROUT_STB_ENH_VAUDP15_MASK |
+				   MT6357_HPLOUT_STB_ENH_VAUDP15_MASK,
+				   MT6357_HPROUT_STB_ENH_VAUDP15_N470_P250 |
+				   MT6357_HPLOUT_STB_ENH_VAUDP15_N470_P250);
+		/* Enable HP aux output stage */
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON1,
+				   MT6357_HPROUT_AUX_PWRUP_VAUDP15_MASK |
+				   MT6357_HPLOUT_AUX_PWRUP_VAUDP15_MASK,
+				   MT6357_HPROUT_AUX_PWRUP_VAUDP15_ENABLE |
+				   MT6357_HPLOUT_AUX_PWRUP_VAUDP15_ENABLE);
+		/* Enable HP aux feedback loop */
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON1,
+				   MT6357_HPR_AUX_FBRSW_VAUDP15_MASK |
+				   MT6357_HPL_AUX_FBRSW_VAUDP15_MASK,
+				   MT6357_HPR_AUX_FBRSW_VAUDP15_ENABLE |
+				   MT6357_HPL_AUX_FBRSW_VAUDP15_ENABLE);
+		/* Enable HP aux CMFB loop */
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON6,
+				   MT6357_HP_CMFB_RST_MASK |
+				   MT6357_HPL_AUX_CMFB_LOOP_MASK |
+				   MT6357_HPR_AUX_CMFB_LOOP_MASK,
+				   MT6357_HP_CMFB_RST_NORMAL |
+				   MT6357_HPL_AUX_CMFB_LOOP_ENABLE |
+				   MT6357_HPR_AUX_CMFB_LOOP_ENABLE);
+		/* Enable HP driver bias circuits */
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON0,
+				   MT6357_AUD_HPR_BIAS_VAUDP15_MASK |
+				   MT6357_AUD_HPL_BIAS_VAUDP15_MASK,
+				   MT6357_AUD_HPR_BIAS_VAUDP15_ENABLE |
+				   MT6357_AUD_HPL_BIAS_VAUDP15_ENABLE);
+		/* Enable HP driver core circuits */
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON0,
+				   MT6357_AUD_HPR_PWRUP_VAUDP15_MASK |
+				   MT6357_AUD_HPL_PWRUP_VAUDP15_MASK,
+				   MT6357_AUD_HPR_PWRUP_VAUDP15_ENABLE |
+				   MT6357_AUD_HPL_PWRUP_VAUDP15_ENABLE);
+		/* Short HP main output to HP aux output stage */
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON1,
+				   MT6357_HPR_SHORT2HPR_AUX_VAUDP15_MASK |
+				   MT6357_HPL_SHORT2HPR_AUX_VAUDP15_MASK,
+				   MT6357_HPR_SHORT2HPR_AUX_VAUDP15_ENABLE |
+				   MT6357_HPL_SHORT2HPR_AUX_VAUDP15_ENABLE);
+		/* Enable HP main CMFB loop */
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON6,
+				   MT6357_HPRL_MAIN_CMFB_LOOP_MASK,
+				   MT6357_HPRL_MAIN_CMFB_LOOP_ENABLE);
+		/* Disable HP aux CMFB loop */
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON6,
+				   MT6357_HPR_AUX_CMFB_LOOP_MASK |
+				   MT6357_HPL_AUX_CMFB_LOOP_MASK,
+				   MT6357_HPR_AUX_CMFB_LOOP_DISABLE |
+				   MT6357_HPL_AUX_CMFB_LOOP_DISABLE);
+		/* Enable HP main output stage */
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON1,
+				   MT6357_HPROUT_PWRUP_VAUDP15_MASK |
+				   MT6357_HPLOUT_PWRUP_VAUDP15_MASK,
+				   MT6357_HPROUT_PWRUP_VAUDP15_ENABLE |
+				   MT6357_HPLOUT_PWRUP_VAUDP15_ENABLE);
+		/* Enable HPR/L main output stage step by step */
+		hp_main_output_ramp(priv, true);
+		usleep_range(1000, 1200);
+		/* Reduce HP aux feedback loop gain */
+		hp_aux_feedback_loop_gain_ramp(priv, true);
+		/* Disable HP aux feedback loop */
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON1,
+				   MT6357_HPR_AUX_FBRSW_VAUDP15_MASK |
+				   MT6357_HPL_AUX_FBRSW_VAUDP15_MASK,
+				   MT6357_HPR_AUX_FBRSW_VAUDP15_DISABLE |
+				   MT6357_HPL_AUX_FBRSW_VAUDP15_DISABLE);
+		/* apply volume setting */
+		hp_volume_ramp(priv, DL_GAIN_N_40DB, lgain,
+			       DL_GAIN_N_40DB, rgain);
+		/* Disable HP aux output stage */
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON1,
+				   MT6357_HPROUT_AUX_PWRUP_VAUDP15_MASK |
+				   MT6357_HPLOUT_AUX_PWRUP_VAUDP15_MASK,
+				   MT6357_HPROUT_AUX_PWRUP_VAUDP15_DISABLE |
+				   MT6357_HPLOUT_AUX_PWRUP_VAUDP15_DISABLE);
+		/* Unshort HP main output to HP aux output stage */
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON1,
+				   MT6357_HPR_SHORT2HPR_AUX_VAUDP15_MASK |
+				   MT6357_HPL_SHORT2HPR_AUX_VAUDP15_MASK,
+				   MT6357_HPR_SHORT2HPR_AUX_VAUDP15_DISABLE |
+				   MT6357_HPL_SHORT2HPR_AUX_VAUDP15_DISABLE);
+		usleep_range(100, 120);
+		break;
+	case SND_SOC_DAPM_PRE_PMD:
+		priv->hp_channel_number--;
+		if (priv->hp_channel_number > 0)
+			break;
+		/* Short HP main output to HP aux output stage */
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON1,
+				   MT6357_HPR_SHORT2HPR_AUX_VAUDP15_MASK |
+				   MT6357_HPL_SHORT2HPR_AUX_VAUDP15_MASK,
+				   MT6357_HPR_SHORT2HPR_AUX_VAUDP15_ENABLE |
+				   MT6357_HPL_SHORT2HPR_AUX_VAUDP15_ENABLE);
+		/* Enable HP aux output stage */
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON1,
+				   MT6357_HPROUT_AUX_PWRUP_VAUDP15_MASK |
+				   MT6357_HPLOUT_AUX_PWRUP_VAUDP15_MASK,
+				   MT6357_HPROUT_AUX_PWRUP_VAUDP15_ENABLE |
+				   MT6357_HPLOUT_AUX_PWRUP_VAUDP15_ENABLE);
+		/* decrease HPL/R gain to normal gain step by step */
+		hp_volume_ramp(priv, lgain, DL_GAIN_N_40DB,
+			       rgain, DL_GAIN_N_40DB);
+		/* Enable HP aux feedback loop */
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON1,
+				   MT6357_HPR_AUX_FBRSW_VAUDP15_MASK |
+				   MT6357_HPL_AUX_FBRSW_VAUDP15_MASK,
+				   MT6357_HPR_AUX_FBRSW_VAUDP15_ENABLE |
+				   MT6357_HPL_AUX_FBRSW_VAUDP15_ENABLE);
+		/* Reduce HP aux feedback loop gain */
+		hp_aux_feedback_loop_gain_ramp(priv, false);
+		/* decrease HPR/L main output stage step by step */
+		hp_main_output_ramp(priv, false);
+		/* Disable HP main output stage */
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON1,
+				   MT6357_HPROUT_PWRUP_VAUDP15_MASK |
+				   MT6357_HPLOUT_PWRUP_VAUDP15_MASK,
+				   MT6357_HPROUT_PWRUP_VAUDP15_DISABLE |
+				   MT6357_HPLOUT_PWRUP_VAUDP15_DISABLE);
+		/* Enable HP aux CMFB loop */
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON6,
+				   MT6357_HP_CMFB_RST_MASK |
+				   MT6357_HPL_AUX_CMFB_LOOP_MASK |
+				   MT6357_HPR_AUX_CMFB_LOOP_MASK,
+				   MT6357_HP_CMFB_RST_RESET |
+				   MT6357_HPL_AUX_CMFB_LOOP_ENABLE |
+				   MT6357_HPR_AUX_CMFB_LOOP_ENABLE);
+		/* Disable HP main CMFB loop */
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON6,
+				   MT6357_HPRL_MAIN_CMFB_LOOP_MASK,
+				   MT6357_HPRL_MAIN_CMFB_LOOP_DISABLE);
+		/* Unshort HP main output to HP aux output stage */
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON1,
+				   MT6357_HPR_SHORT2HPR_AUX_VAUDP15_MASK |
+				   MT6357_HPL_SHORT2HPR_AUX_VAUDP15_MASK,
+				   MT6357_HPR_SHORT2HPR_AUX_VAUDP15_DISABLE |
+				   MT6357_HPL_SHORT2HPR_AUX_VAUDP15_DISABLE);
+		/* Disable HP driver core circuits */
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON0,
+				   MT6357_AUD_HPR_PWRUP_VAUDP15_MASK |
+				   MT6357_AUD_HPL_PWRUP_VAUDP15_MASK,
+				   MT6357_AUD_HPR_PWRUP_VAUDP15_DISABLE |
+				   MT6357_AUD_HPL_PWRUP_VAUDP15_DISABLE);
+		/* Disable HP driver bias circuits */
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON0,
+				   MT6357_AUD_HPR_BIAS_VAUDP15_MASK |
+				   MT6357_AUD_HPL_BIAS_VAUDP15_MASK,
+				   MT6357_AUD_HPR_BIAS_VAUDP15_DISABLE |
+				   MT6357_AUD_HPL_BIAS_VAUDP15_DISABLE);
+		/* Disable HP aux CMFB loop,
+		 * Enable HP main CMFB for HP off state
+		 */
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON6,
+				   MT6357_HPRL_MAIN_CMFB_LOOP_MASK |
+				   MT6357_HPR_AUX_CMFB_LOOP_MASK |
+				   MT6357_HPL_AUX_CMFB_LOOP_MASK,
+				   MT6357_HPRL_MAIN_CMFB_LOOP_ENABLE |
+				   MT6357_HPR_AUX_CMFB_LOOP_DISABLE |
+				   MT6357_HPL_AUX_CMFB_LOOP_DISABLE);
+		/* Disable HP aux feedback loop */
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON1,
+				   MT6357_HPR_AUX_FBRSW_VAUDP15_MASK |
+				   MT6357_HPL_AUX_FBRSW_VAUDP15_MASK,
+				   MT6357_HPR_AUX_FBRSW_VAUDP15_DISABLE |
+				   MT6357_HPL_AUX_FBRSW_VAUDP15_DISABLE);
+		/* Disable HP aux output stage */
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON1,
+				   MT6357_HPROUT_AUX_PWRUP_VAUDP15_MASK |
+				   MT6357_HPLOUT_AUX_PWRUP_VAUDP15_MASK,
+				   MT6357_HPROUT_AUX_PWRUP_VAUDP15_DISABLE |
+				   MT6357_HPLOUT_AUX_PWRUP_VAUDP15_DISABLE);
+		/* Save the gain value into the register*/
+		regmap_update_bits(priv->regmap, MT6357_ZCD_CON2,
+				   MT6357_AUD_HPL_GAIN_MASK |
+				   MT6357_AUD_HPR_GAIN_MASK,
+				   lgain << MT6357_AUD_HPL_GAIN_SFT |
+				   rgain << MT6357_AUD_HPR_GAIN_SFT);
+		break;
+	default:
+		break;
+	}
+
+	return 0;
+}
+
+static int right_dac_event(struct snd_soc_dapm_widget *w,
+			   struct snd_kcontrol *kcontrol,
+			   int event)
+{
+	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
+	struct mt6357_priv *priv = snd_soc_component_get_drvdata(cmpnt);
+
+	switch (event) {
+	case SND_SOC_DAPM_PRE_PMU:
+		/* Enable Audio DAC and control audio bias gen */
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON0,
+				   MT6357_AUD_DACR_PWRUP_VA28_MASK |
+				   MT6357_AUD_DACR_PWRUP_VAUDP15_MASK,
+				   MT6357_AUD_DACR_PWRUP_VA28_ENABLE |
+				   MT6357_AUD_DACR_PWRUP_VAUDP15_ENABLE);
+		break;
+	case SND_SOC_DAPM_POST_PMU:
+		/* disable Pull-down HPL/R to AVSS28_AUD */
+		if (priv->pull_down_needed)
+			hp_pull_down(priv, false);
+		break;
+	case SND_SOC_DAPM_PRE_PMD:
+		/* Pull-down HPL/R to AVSS28_AUD */
+		if (priv->pull_down_needed)
+			hp_pull_down(priv, true);
+		/* Disable Audio DAC and control audio bias gen  */
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON0,
+				   MT6357_AUD_DACR_PWRUP_VA28_MASK |
+				   MT6357_AUD_DACR_PWRUP_VAUDP15_MASK,
+				   MT6357_AUD_DACR_PWRUP_VA28_DISABLE |
+				   MT6357_AUD_DACR_PWRUP_VAUDP15_DISABLE);
+		break;
+	default:
+		break;
+	}
+
+	return 0;
+}
+
+static int left_dac_event(struct snd_soc_dapm_widget *w,
+			  struct snd_kcontrol *kcontrol,
+			  int event)
+{
+	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
+	struct mt6357_priv *priv = snd_soc_component_get_drvdata(cmpnt);
+
+	switch (event) {
+	case SND_SOC_DAPM_PRE_PMU:
+		/* Enable Audio DAC and control audio bias gen  */
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON0,
+				   MT6357_AUD_DACL_PWRUP_VA28_MASK |
+				   MT6357_AUD_DACL_PWRUP_VAUDP15_MASK,
+				   MT6357_AUD_DACL_PWRUP_VA28_ENABLE |
+				   MT6357_AUD_DACL_PWRUP_VAUDP15_ENABLE);
+		break;
+	case SND_SOC_DAPM_POST_PMU:
+		/* disable Pull-down HPL/R to AVSS28_AUD */
+		if (priv->pull_down_needed)
+			hp_pull_down(priv, false);
+		break;
+	case SND_SOC_DAPM_PRE_PMD:
+		/* Pull-down HPL/R to AVSS28_AUD */
+		if (priv->pull_down_needed)
+			hp_pull_down(priv, true);
+		/* Disable Audio DAC and control audio bias gen  */
+		regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON0,
+				   MT6357_AUD_DACL_PWRUP_VA28_MASK |
+				   MT6357_AUD_DACL_PWRUP_VAUDP15_MASK,
+				   MT6357_AUD_DACL_PWRUP_VA28_DISABLE |
+				   MT6357_AUD_DACL_PWRUP_VAUDP15_DISABLE);
+		break;
+	default:
+		break;
+	}
+
+	return 0;
+}
+
+/* Supply widgets subsequence */
+enum {
+	/* common */
+	SUPPLY_SEQ_CLK_BUF,
+	SUPPLY_SEQ_AUD_GLB,
+	SUPPLY_SEQ_CLKSQ,
+	SUPPLY_SEQ_VOW_AUD_LPW,
+	SUPPLY_SEQ_AUD_VOW,
+	SUPPLY_SEQ_VOW_CLK,
+	SUPPLY_SEQ_VOW_LDO,
+	SUPPLY_SEQ_TOP_CK,
+	SUPPLY_SEQ_TOP_CK_LAST,
+	SUPPLY_SEQ_AUD_TOP,
+	SUPPLY_SEQ_AUD_TOP_LAST,
+	SUPPLY_SEQ_AFE,
+	/* capture */
+	SUPPLY_SEQ_ADC_SUPPLY,
+};
+
+/* DAPM Widgets */
+static const struct snd_soc_dapm_widget mt6357_dapm_widgets[] = {
+	/* Analog Clocks */
+	SND_SOC_DAPM_SUPPLY_S("CLK_BUF", SUPPLY_SEQ_CLK_BUF,
+			      MT6357_DCXO_CW14,
+			      MT6357_XO_AUDIO_EN_M_SFT, 0, NULL, 0),
+	SND_SOC_DAPM_SUPPLY_S("AUDGLB", SUPPLY_SEQ_AUD_GLB,
+			      MT6357_AUDDEC_ANA_CON11,
+			      MT6357_AUDGLB_PWRDN_VA28_SFT, 1, NULL, 0),
+	SND_SOC_DAPM_SUPPLY_S("CLKSQ Audio", SUPPLY_SEQ_CLKSQ,
+			      MT6357_AUDENC_ANA_CON6,
+			      MT6357_CLKSQ_EN_SFT, 0, NULL, 0),
+	SND_SOC_DAPM_SUPPLY_S("AUDNCP_CK", SUPPLY_SEQ_TOP_CK,
+			      MT6357_AUD_TOP_CKPDN_CON0,
+			      MT6357_AUDNCP_CK_PDN_SFT, 1, NULL, 0),
+	SND_SOC_DAPM_SUPPLY_S("ZCD13M_CK", SUPPLY_SEQ_TOP_CK,
+			      MT6357_AUD_TOP_CKPDN_CON0,
+			      MT6357_ZCD13M_CK_PDN_SFT, 1, NULL, 0),
+	SND_SOC_DAPM_SUPPLY_S("AUD_CK", SUPPLY_SEQ_TOP_CK_LAST,
+			      MT6357_AUD_TOP_CKPDN_CON0,
+			      MT6357_AUD_CK_PDN_SFT, 1,
+			      mt_delay_250_event,
+			      SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
+	SND_SOC_DAPM_SUPPLY_S("AUDIF_CK", SUPPLY_SEQ_TOP_CK,
+			      MT6357_AUD_TOP_CKPDN_CON0,
+			      MT6357_AUDIF_CK_PDN_SFT, 1, NULL, 0),
+
+	/* Digital Clocks */
+	SND_SOC_DAPM_SUPPLY_S("AUDIO_TOP_AFE_CTL", SUPPLY_SEQ_AUD_TOP_LAST,
+			      MT6357_AUDIO_TOP_CON0,
+			      MT6357_PDN_AFE_CTL_SFT, 1,
+			      mt_delay_250_event,
+			      SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
+	SND_SOC_DAPM_SUPPLY_S("AUDIO_TOP_DAC_CTL", SUPPLY_SEQ_AUD_TOP,
+			      MT6357_AUDIO_TOP_CON0,
+			      MT6357_PDN_DAC_CTL_SFT, 1, NULL, 0),
+	SND_SOC_DAPM_SUPPLY_S("AUDIO_TOP_ADC_CTL", SUPPLY_SEQ_AUD_TOP,
+			      MT6357_AUDIO_TOP_CON0,
+			      MT6357_PDN_ADC_CTL_SFT, 1, NULL, 0),
+	SND_SOC_DAPM_SUPPLY_S("AUDIO_TOP_I2S_DL", SUPPLY_SEQ_AUD_TOP,
+			      MT6357_AUDIO_TOP_CON0,
+			      MT6357_PDN_I2S_DL_CTL_SFT, 1, NULL, 0),
+	SND_SOC_DAPM_SUPPLY_S("AUDIO_TOP_PWR_CLK", SUPPLY_SEQ_AUD_TOP,
+			      MT6357_AUDIO_TOP_CON0,
+			      MT6357_PWR_CLK_DIS_CTL_SFT, 1, NULL, 0),
+	SND_SOC_DAPM_SUPPLY_S("AUDIO_TOP_PDN_AFE_TESTMODEL", SUPPLY_SEQ_AUD_TOP,
+			      MT6357_AUDIO_TOP_CON0,
+			      MT6357_PDN_AFE_TESTMODEL_CTL_SFT, 1, NULL, 0),
+	SND_SOC_DAPM_SUPPLY_S("AUDIO_TOP_PDN_RESERVED", SUPPLY_SEQ_AUD_TOP,
+			      MT6357_AUDIO_TOP_CON0,
+			      MT6357_PDN_RESERVED_SFT, 1, NULL, 0),
+	SND_SOC_DAPM_SUPPLY_S("AUDIO_TOP_LPBK", SUPPLY_SEQ_AUD_TOP,
+			      MT6357_AUDIO_TOP_CON0,
+			      MT6357_PDN_LPBK_CTL_SFT, 1, NULL, 0),
+
+	/* General */
+	SND_SOC_DAPM_SUPPLY_S("AFE_ON", SUPPLY_SEQ_AFE,
+			      MT6357_AFE_UL_DL_CON0,
+			      MT6357_AFE_ON_SFT, 0, NULL, 0),
+
+	/* Uplinks */
+	SND_SOC_DAPM_AIF_OUT_E("AIF1TX", "MT6357 Capture", 0,
+			       SND_SOC_NOPM, 0, 0,
+			       mt_aif_out_event,
+			       SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
+	SND_SOC_DAPM_SUPPLY_S("ADC Supply", SUPPLY_SEQ_ADC_SUPPLY,
+			      SND_SOC_NOPM, 0, 0,
+			      mt_adc_supply_event,
+			      SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
+	SND_SOC_DAPM_ADC_E("ADC", NULL, SND_SOC_NOPM, 0, 0, adc_enable_event,
+			   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
+	SND_SOC_DAPM_MUX_E("PGA L Mux", SND_SOC_NOPM, 0, 0,
+			   &pga_left_mux_control,
+			   mt_pga_left_event,
+			   SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
+	SND_SOC_DAPM_MUX_E("PGA R Mux", SND_SOC_NOPM, 0, 0,
+			   &pga_right_mux_control,
+			   mt_pga_right_event,
+			   SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
+	SND_SOC_DAPM_PGA("PGA L", SND_SOC_NOPM, 0, 0, NULL, 0),
+	SND_SOC_DAPM_PGA("PGA R", SND_SOC_NOPM, 0, 0, NULL, 0),
+	SND_SOC_DAPM_MUX_E("Mic Type Mux", SND_SOC_NOPM, 0, 0,
+			   &mic_type_mux_control,
+			   mt_mic_type_event,
+			   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
+	SND_SOC_DAPM_SUPPLY("MICBIAS0", MT6357_AUDENC_ANA_CON8,
+			    MT6357_AUD_MICBIAS0_PWD_SFT, 0, NULL, 0),
+	SND_SOC_DAPM_SUPPLY("MICBIAS1", MT6357_AUDENC_ANA_CON9,
+			    MT6357_AUD_MICBIAS1_PWD_SFT, 0, NULL, 0),
+
+	/* UL inputs */
+	SND_SOC_DAPM_INPUT("AIN0"),
+	SND_SOC_DAPM_INPUT("AIN1"),
+	SND_SOC_DAPM_INPUT("AIN2"),
+	SND_SOC_DAPM_INPUT("LPBK"),
+	SND_SOC_DAPM_INPUT("SGEN UL"),
+
+	/* Downlinks */
+	SND_SOC_DAPM_AIF_IN_E("AIF_RX", "MT6357 Playback", 0,
+			      SND_SOC_NOPM, 0, 0,
+			      mt_audio_in_event,
+			      SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
+	SND_SOC_DAPM_INPUT("SGEN DL"),
+	SND_SOC_DAPM_MUX("DAC Mux", SND_SOC_NOPM, 0, 0, &dac_mux_control),
+
+	SND_SOC_DAPM_DAC_E("DACR", NULL, SND_SOC_NOPM, 0, 0, right_dac_event,
+			   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
+	SND_SOC_DAPM_DAC_E("DACL", NULL, SND_SOC_NOPM, 0, 0, left_dac_event,
+			   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
+
+	SND_SOC_DAPM_SUPPLY("DL Digital Supply", SND_SOC_NOPM, 0, 0, NULL, 0),
+	SND_SOC_DAPM_SUPPLY("DL Analog Supply", SND_SOC_NOPM, 0, 0, NULL, 0),
+	SND_SOC_DAPM_SUPPLY("DL SRC", MT6357_AFE_DL_SRC2_CON0_L,
+			    MT6357_DL_2_SRC_ON_TMP_CTL_PRE_SFT, 0, NULL, 0),
+
+	SND_SOC_DAPM_MUX_E("Line Out Source", SND_SOC_NOPM, 0, 0, &lo_mux_control,
+			   lo_mux_event,
+			   SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
+
+	SND_SOC_DAPM_MUX_E("Handset Source", SND_SOC_NOPM, 0, 0, &hs_mux_control,
+			   hs_mux_event,
+			   SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
+
+	SND_SOC_DAPM_MUX_E("Headphone Right Source", SND_SOC_NOPM, 0, 0, &hpr_mux_control,
+			   hp_main_mux_event,
+			   SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
+
+	SND_SOC_DAPM_MUX_E("Headphone Left Source", SND_SOC_NOPM, 0, 0, &hpl_mux_control,
+			   hp_main_mux_event,
+			   SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
+	/* DL outputs */
+	SND_SOC_DAPM_OUTPUT("Headphones"),
+	SND_SOC_DAPM_OUTPUT("Hansdet"),
+	SND_SOC_DAPM_OUTPUT("Line out"),
+
+	/* Sine generator */
+	SND_SOC_DAPM_SUPPLY("SGEN UL Enable",
+			    MT6357_AFE_TOP_CON0, MT6357_UL_SINE_ON_SFT, 0, NULL, 0),
+	SND_SOC_DAPM_SUPPLY("SGEN Enable",
+			    MT6357_AFE_SGEN_CFG0,
+			    MT6357_SGEN_DAC_EN_CTL_SFT, 0, mt_audio_in_event,
+			    SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
+	SND_SOC_DAPM_SUPPLY("SGEN MUTE",
+			    MT6357_AFE_SGEN_CFG0,
+			    MT6357_SGEN_MUTE_SW_CTL_SFT, 1, NULL, 0)
+};
+
+static const struct snd_soc_dapm_route mt6357_dapm_routes[] = {
+	/* Capture */
+	{"AIF1TX", NULL, "Mic Type Mux"},
+	{"AIF1TX", NULL, "CLK_BUF"},
+	{"AIF1TX", NULL, "AUDGLB"},
+	{"AIF1TX", NULL, "CLKSQ Audio"},
+	{"AIF1TX", NULL, "AUD_CK"},
+	{"AIF1TX", NULL, "AUDIF_CK"},
+
+	{"AIF1TX", NULL, "AUDIO_TOP_AFE_CTL"},
+	{"AIF1TX", NULL, "AUDIO_TOP_ADC_CTL"},
+	{"AIF1TX", NULL, "AUDIO_TOP_PWR_CLK"},
+	{"AIF1TX", NULL, "AUDIO_TOP_PDN_RESERVED"},
+	{"AIF1TX", NULL, "AUDIO_TOP_I2S_DL"},
+	{"AIF1TX", NULL, "AFE_ON"},
+
+	{"Mic Type Mux", "ACC", "ADC"},
+	{"Mic Type Mux", "DCC", "ADC"},
+	{"Mic Type Mux", "DCC_ECM_DIFF", "ADC"},
+	{"Mic Type Mux", "DCC_ECM_SINGLE", "ADC"},
+	{"Mic Type Mux", "DMIC", "AIN0"},
+	{"Mic Type Mux", "DMIC", "AIN2"},
+	{"Mic Type Mux", "Loopback", "LPBK"},
+	{"Mic Type Mux", "Sine Generator", "SGEN UL"},
+
+	{"SGEN UL", NULL, "AUDIO_TOP_PDN_AFE_TESTMODEL"},
+	{"SGEN UL", NULL, "SGEN UL Enable"},
+	{"SGEN UL", NULL, "SGEN MUTE"},
+	{"SGEN UL", NULL, "SGEN Enable"},
+
+	{"ADC", NULL, "PGA L Mux"},
+	{"ADC", NULL, "PGA R Mux"},
+	{"ADC", NULL, "ADC Supply"},
+
+	{"PGA L Mux", "AIN0", "AIN0"},
+	{"PGA L Mux", "AIN1", "AIN1"},
+	{"PGA L Mux", "AIN2", "AIN2"},
+
+	{"PGA R Mux", "AIN0", "AIN0"},
+	{"PGA R Mux", "AIN1", "AIN1"},
+	{"PGA R Mux", "AIN2", "AIN2"},
+
+	{"AIN0", NULL, "MICBIAS0"},
+	{"AIN1", NULL, "MICBIAS1"},
+	{"AIN2", NULL, "MICBIAS0"},
+	{"LPBK", NULL, "AUDIO_TOP_LPBK"},
+
+	/* Playback */
+	{"DAC Mux", "Normal Path", "AIF_RX"},
+	{"DAC Mux", "Sine Generator", "SGEN DL"},
+
+	{"AIF_RX", NULL, "DL SRC"},
+
+	{"SGEN DL", NULL, "DL SRC"},
+	{"SGEN DL", NULL, "SGEN MUTE"},
+	{"SGEN DL", NULL, "SGEN Enable"},
+	{"SGEN DL", NULL, "DL Digital Supply"},
+	{"SGEN DL", NULL, "AUDIO_TOP_PDN_AFE_TESTMODEL"},
+
+	{"DACL", NULL, "DAC Mux"},
+	{"DACR", NULL, "DAC Mux"},
+
+	{"DL Analog Supply", NULL, "CLK_BUF"},
+	{"DL Analog Supply", NULL, "AUDGLB"},
+	{"DL Analog Supply", NULL, "CLKSQ Audio"},
+	{"DL Analog Supply", NULL, "AUDNCP_CK"},
+	{"DL Analog Supply", NULL, "ZCD13M_CK"},
+	{"DL Analog Supply", NULL, "AUD_CK"},
+	{"DL Analog Supply", NULL, "AUDIF_CK"},
+
+	{"DL Digital Supply", NULL, "AUDIO_TOP_AFE_CTL"},
+	{"DL Digital Supply", NULL, "AUDIO_TOP_DAC_CTL"},
+	{"DL Digital Supply", NULL, "AUDIO_TOP_PWR_CLK"},
+	{"DL Digital Supply", NULL, "AFE_ON"},
+
+	{"DACR", NULL, "DL Digital Supply"},
+	{"DACR", NULL, "DL Analog Supply"},
+	{"DACL", NULL, "DL Digital Supply"},
+	{"DACL", NULL, "DL Analog Supply"},
+
+	{"Line Out Source", "DACR", "DACR"},
+	{"Line Out Source", "Playback", "DACL"},
+	{"Line Out Source", "Test mode", "DACL"},
+
+	{"Handset Source", "DACR", "DACR"},
+	{"Handset Source", "Playback", "DACL"},
+	{"Handset Source", "Test mode", "DACL"},
+
+	{"Headphone Right Source", "DAC", "DACR"},
+	{"Headphone Right Source", "Line Out", "Line Out Source"},
+	{"Headphone Right Source", "Handset", "Handset Source"},
+
+	{"Headphone Left Source", "DAC", "DACL"},
+	{"Headphone Left Source", "Line Out", "Line Out Source"},
+	{"Headphone Left Source", "Handset", "Handset Source"},
+
+	{"Line out", NULL, "Line Out Source"},
+	{"Hansdet", NULL, "Handset Source"},
+
+	{"Headphones", NULL, "Headphone Right Source"},
+	{"Headphones", NULL, "Headphone Left Source"},
+};
+
+static struct snd_soc_dai_driver mtk_6357_dai_codecs[] = {
+	{
+		.name = "mt6357-snd-codec-aif1",
+		.playback = {
+			.stream_name = "MT6357 Playback",
+			.channels_min = 1,
+			.channels_max = 2,
+			.rates = SNDRV_PCM_RATE_8000_192000,
+			.formats = MT6357_SND_SOC_ADV_MT_FMTS,
+			},
+		.capture = {
+			.stream_name = "MT6357 Capture",
+			.channels_min = 1,
+			.channels_max = 2,
+			.rates = MT6357_SOC_HIGH_USE_RATE,
+			.formats = MT6357_SND_SOC_ADV_MT_FMTS,
+			},
+	},
+};
+
+static int mt6357_codec_probe(struct snd_soc_component *codec)
+{
+	struct mt6357_priv *priv = snd_soc_component_get_drvdata(codec);
+
+	snd_soc_component_init_regmap(codec, priv->regmap);
+
+	/* Enable audio part */
+	regmap_update_bits(priv->regmap, MT6357_DCXO_CW14,
+			   MT6357_XO_AUDIO_EN_M_MASK, MT6357_XO_AUDIO_EN_M_ENABLE);
+	/* Disable HeadphoneL/HeadphoneR short circuit protection */
+	regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON0,
+			   MT6357_AUD_HPR_SC_VAUDP15_MASK |
+			   MT6357_AUD_HPL_SC_VAUDP15_MASK,
+			   MT6357_AUD_HPR_SC_VAUDP15_DISABLE |
+			   MT6357_AUD_HPL_SC_VAUDP15_DISABLE);
+	/* Disable voice short circuit protection */
+	regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON3,
+			   MT6357_AUD_HS_SC_VAUDP15_MASK,
+			   MT6357_AUD_HS_SC_VAUDP15_DISABLE);
+	/* disable LO buffer left short circuit protection */
+	regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON4,
+			   MT6357_AUD_LOL_SC_VAUDP15_MASK,
+			   MT6357_AUD_LOL_SC_VAUDP15_DISABLE);
+	/* set gpio */
+	set_playback_gpio(priv, false);
+	set_capture_gpio(priv, false);
+	/* Disable audio part */
+	regmap_update_bits(priv->regmap, MT6357_DCXO_CW14,
+			   MT6357_XO_AUDIO_EN_M_MASK,
+			   MT6357_XO_AUDIO_EN_M_DISABLE);
+
+	return 0;
+}
+
+static const struct snd_soc_component_driver mt6357_soc_component_driver = {
+	.probe = mt6357_codec_probe,
+	.read = snd_soc_component_read,
+	.write = snd_soc_component_write,
+	.controls = mt6357_controls,
+	.num_controls = ARRAY_SIZE(mt6357_controls),
+	.dapm_widgets = mt6357_dapm_widgets,
+	.num_dapm_widgets = ARRAY_SIZE(mt6357_dapm_widgets),
+	.dapm_routes = mt6357_dapm_routes,
+	.num_dapm_routes = ARRAY_SIZE(mt6357_dapm_routes),
+};
+
+static const u32 micbias_values[] = {
+	1700000, 1800000, 1900000, 2000000,
+	2100000, 2500000, 2600000, 2700000
+};
+
+static u32 mt6357_get_micbias_idx(struct device_node *np, const char *micbias)
+{
+	int err;
+	u32 idx, val;
+
+	err = of_property_read_u32(np, micbias,  &val);
+	if (err)
+		return 0;
+
+	for (idx = 0; idx < ARRAY_SIZE(micbias_values); idx++) {
+		if (val == micbias_values[idx])
+			return idx;
+	}
+	return 0;
+}
+
+static int mt6357_parse_dt(struct mt6357_priv *priv)
+{
+	u32 micbias_voltage_index = 0;
+	struct device_node *np = priv->dev->parent->of_node;
+
+	if (!np)
+		return -EINVAL;
+
+	priv->pull_down_needed = false;
+	if (of_property_read_bool(np, "mediatek,hp-pull-down"))
+		priv->pull_down_needed = true;
+
+	micbias_voltage_index = mt6357_get_micbias_idx(np, "mediatek,micbias0-microvolt");
+	regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON8,
+			   MT6357_AUD_MICBIAS0_VREF_MASK,
+			   micbias_voltage_index << MT6357_AUD_MICBIAS0_VREF_SFT);
+
+	micbias_voltage_index = mt6357_get_micbias_idx(np, "mediatek,micbias1-microvolt");
+	regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON9,
+			   MT6357_AUD_MICBIAS1_VREF_MASK,
+			   micbias_voltage_index << MT6357_AUD_MICBIAS1_VREF_SFT);
+
+	return 0;
+}
+
+static int mt6357_platform_driver_probe(struct platform_device *pdev)
+{
+	struct mt6397_chip *mt6397 = dev_get_drvdata(pdev->dev.parent);
+	struct mt6357_priv *priv;
+	int ret;
+
+	ret = devm_regulator_get_enable(&pdev->dev, "vaud28");
+	if (ret)
+		return dev_err_probe(&pdev->dev, ret, "Failed to enable vaud28 regulator\n");
+
+	priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
+	if (!priv)
+		return -ENOMEM;
+
+	dev_set_drvdata(&pdev->dev, priv);
+	priv->dev = &pdev->dev;
+
+	priv->regmap = mt6397->regmap;
+	if (IS_ERR(priv->regmap))
+		return PTR_ERR(priv->regmap);
+
+	ret = mt6357_parse_dt(priv);
+	if (ret)
+		return dev_err_probe(&pdev->dev, ret, "Failed to parse dts\n");
+
+	pdev->dev.coherent_dma_mask = DMA_BIT_MASK(64);
+	if (!pdev->dev.dma_mask)
+		pdev->dev.dma_mask = &pdev->dev.coherent_dma_mask;
+
+	return devm_snd_soc_register_component(&pdev->dev,
+					       &mt6357_soc_component_driver,
+					       mtk_6357_dai_codecs,
+					       ARRAY_SIZE(mtk_6357_dai_codecs));
+}
+
+static const struct platform_device_id mt6357_platform_ids[] = {
+	{"mt6357-sound", 0},
+	{ /* sentinel */ },
+};
+MODULE_DEVICE_TABLE(platform, mt6357_platform_ids);
+
+static struct platform_driver mt6357_platform_driver = {
+	.driver = {
+		.name = "mt6357-sound",
+		.probe_type = PROBE_PREFER_ASYNCHRONOUS,
+	},
+	.probe = mt6357_platform_driver_probe,
+	.id_table = mt6357_platform_ids,
+};
+
+module_platform_driver(mt6357_platform_driver)
+
+MODULE_DESCRIPTION("MT6357 ALSA SoC codec driver");
+MODULE_AUTHOR("Nicolas Belin <nbelin at baylibre.com>");
+MODULE_LICENSE("GPL");
diff --git a/sound/soc/codecs/mt6357.h b/sound/soc/codecs/mt6357.h
new file mode 100644
index 000000000000..7f6fccada6a2
--- /dev/null
+++ b/sound/soc/codecs/mt6357.h
@@ -0,0 +1,660 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * mt6357.h  --  mt6357 ALSA SoC audio codec driver
+ *
+ * Copyright (c) 2024 Baylibre
+ * Author: Nicolas Belin <nbelin at baylibre.com>
+ */
+
+#ifndef __MT6357_H__
+#define __MT6357_H__
+
+#include <linux/types.h>
+
+/* Reg bit defines */
+/* MT6357_GPIO_DIR0 */
+#define MT6357_GPIO8_DIR_MASK			BIT(8)
+#define MT6357_GPIO8_DIR_INPUT			0
+#define MT6357_GPIO8_DIR_OUTPUT			BIT(8)
+#define MT6357_GPIO9_DIR_MASK			BIT(9)
+#define MT6357_GPIO9_DIR_INPUT			0
+#define MT6357_GPIO9_DIR_OUTPUT			BIT(9)
+#define MT6357_GPIO10_DIR_MASK			BIT(10)
+#define MT6357_GPIO10_DIR_INPUT			0
+#define MT6357_GPIO10_DIR_OUTPUT		BIT(10)
+#define MT6357_GPIO11_DIR_MASK			BIT(11)
+#define MT6357_GPIO11_DIR_INPUT			0
+#define MT6357_GPIO11_DIR_OUTPUT		BIT(11)
+#define MT6357_GPIO12_DIR_MASK			BIT(12)
+#define MT6357_GPIO12_DIR_INPUT			0
+#define MT6357_GPIO12_DIR_OUTPUT		BIT(12)
+#define MT6357_GPIO13_DIR_MASK			BIT(13)
+#define MT6357_GPIO13_DIR_INPUT			0
+#define MT6357_GPIO13_DIR_OUTPUT		BIT(13)
+#define MT6357_GPIO14_DIR_MASK			BIT(14)
+#define MT6357_GPIO14_DIR_INPUT			0
+#define MT6357_GPIO14_DIR_OUTPUT		BIT(14)
+#define MT6357_GPIO15_DIR_MASK			BIT(15)
+#define MT6357_GPIO15_DIR_INPUT			0
+#define MT6357_GPIO15_DIR_OUTPUT		BIT(15)
+
+/* MT6357_GPIO_MODE2 */
+#define MT6357_GPIO8_MODE_MASK			GENMASK(2, 0)
+#define MT6357_GPIO8_MODE_AUD_CLK_MOSI		BIT(0)
+#define MT6357_GPIO8_MODE_GPIO			0
+#define MT6357_GPIO9_MODE_MASK			GENMASK(5, 3)
+#define MT6357_GPIO9_MODE_AUD_DAT_MOSI0		BIT(3)
+#define MT6357_GPIO9_MODE_GPIO			0
+#define MT6357_GPIO10_MODE_MASK			GENMASK(8, 6)
+#define MT6357_GPIO10_MODE_AUD_DAT_MOSI1	BIT(6)
+#define MT6357_GPIO10_MODE_GPIO			0
+#define MT6357_GPIO11_MODE_MASK			GENMASK(11, 9)
+#define MT6357_GPIO11_MODE_AUD_SYNC_MOSI	BIT(9)
+#define MT6357_GPIO11_MODE_GPIO			0
+
+/* MT6357_GPIO_MODE2_SET */
+#define MT6357_GPIO8_MODE_SET_MASK		GENMASK(2, 0)
+#define MT6357_GPIO8_MODE_SET_AUD_CLK_MOSI	BIT(0)
+#define MT6357_GPIO9_MODE_SET_MASK		GENMASK(5, 3)
+#define MT6357_GPIO9_MODE_SET_AUD_DAT_MOSI0	BIT(3)
+#define MT6357_GPIO10_MODE_SET_MASK		GENMASK(8, 6)
+#define MT6357_GPIO10_MODE_SET_AUD_DAT_MOSI1	BIT(6)
+#define MT6357_GPIO11_MODE_SET_MASK		GENMASK(11, 9)
+#define MT6357_GPIO11_MODE_SET_AUD_SYNC_MOSI	BIT(9)
+
+/* MT6357_GPIO_MODE2_CLR */
+#define MT6357_GPIO_MODE2_CLEAR_ALL		GENMASK(15, 0)
+
+/* MT6357_GPIO_MODE3 */
+#define MT6357_GPIO12_MODE_MASK			GENMASK(2, 0)
+#define MT6357_GPIO12_MODE_AUD_CLK_MISO		BIT(0)
+#define MT6357_GPIO12_MODE_GPIO			0
+#define MT6357_GPIO13_MODE_MASK			GENMASK(5, 3)
+#define MT6357_GPIO13_MODE_AUD_DAT_MISO0	BIT(3)
+#define MT6357_GPIO13_MODE_GPIO			0
+#define MT6357_GPIO14_MODE_MASK			GENMASK(8, 6)
+#define MT6357_GPIO14_MODE_AUD_DAT_MISO1	BIT(6)
+#define MT6357_GPIO14_MODE_GPIO			0
+#define MT6357_GPIO15_MODE_MASK			GENMASK(11, 9)
+#define MT6357_GPIO15_MODE_AUD_SYNC_MISO	BIT(9)
+#define MT6357_GPIO15_MODE_GPIO			0
+
+/* MT6357_GPIO_MODE3_SET */
+#define MT6357_GPIO12_MODE_SET_MASK		GENMASK(2, 0)
+#define MT6357_GPIO12_MODE_SET_AUD_CLK_MISO	BIT(0)
+#define MT6357_GPIO13_MODE_SET_MASK		GENMASK(5, 3)
+#define MT6357_GPIO13_MODE_SET_AUD_DAT_MISO0	BIT(3)
+#define MT6357_GPIO14_MODE_SET_MASK		GENMASK(8, 6)
+#define MT6357_GPIO14_MODE_SET_AUD_DAT_MISO1	BIT(6)
+#define MT6357_GPIO15_MODE_SET_MASK		GENMASK(11, 9)
+#define MT6357_GPIO15_MODE_SET_AUD_SYNC_MISO	BIT(9)
+
+/* MT6357_GPIO_MODE3_CLR */
+#define MT6357_GPIO_MODE3_CLEAR_ALL		GENMASK(15, 0)
+
+/* MT6357_DCXO_CW14 */
+#define MT6357_XO_AUDIO_EN_M_SFT		13
+#define MT6357_XO_AUDIO_EN_M_MASK		BIT(13)
+#define MT6357_XO_AUDIO_EN_M_ENABLE		BIT(13)
+#define MT6357_XO_AUDIO_EN_M_DISABLE		0
+
+/* MT6357_AUD_TOP_CKPDN_CON0 */
+#define MT6357_AUDNCP_CK_PDN_SFT		6
+#define MT6357_ZCD13M_CK_PDN_SFT		5
+#define MT6357_AUDIF_CK_PDN_SFT			2
+#define MT6357_AUD_CK_PDN_SFT			1
+
+/* MT6357_AUDNCP_CLKDIV_CON0 */
+#define MT6357_DIVCKS_CHG			BIT(0)
+
+/* MT6357_AUDNCP_CLKDIV_CON1 */
+#define MT6357_DIVCKS_ON			BIT(0)
+
+/* MT6357_AUDNCP_CLKDIV_CON3 */
+#define MT6357_DIVCKS_PWD_NCP_MASK		BIT(0)
+#define MT6357_DIVCKS_PWD_NCP_DISABLE		BIT(0)
+#define MT6357_DIVCKS_PWD_NCP_ENABLE		0
+
+/* MT6357_AUDNCP_CLKDIV_CON4 */
+#define MT6357_DIVCKS_PWD_NCP_ST_SEL_MASK	GENMASK(1, 0)
+#define MT6357_DIVCKS_PWD_NCP_ST_50US		0
+#define MT6357_DIVCKS_PWD_NCP_ST_100US		1
+#define MT6357_DIVCKS_PWD_NCP_ST_150US		2
+#define MT6357_DIVCKS_PWD_NCP_ST_200US		3
+
+/* MT6357_AFE_UL_DL_CON0 */
+#define MT6357_AFE_UL_LR_SWAP_SFT		15
+#define MT6357_AFE_ON_SFT			0
+
+/* MT6357_AFE_DL_SRC2_CON0_L */
+#define MT6357_DL_2_SRC_ON_TMP_CTL_PRE_SFT	0
+
+/* MT6357_AFE_UL_SRC_CON0_H */
+#define MT6357_C_TWO_DIGITAL_MIC_CTL_MASK	BIT(7)
+#define MT6357_C_TWO_DIGITAL_MIC_ENABLE		BIT(7)
+#define MT6357_C_TWO_DIGITAL_MIC_DISABLE	0
+
+/* MT6357_AFE_UL_SRC_CON0_L */
+#define MT6357_UL_SDM_3_LEVEL_CTL_MASK		BIT(1)
+#define MT6357_UL_SDM_3_LEVEL_SELECT		BIT(1)
+#define MT6357_UL_SDM_3_LEVEL_DESELECT		0
+#define MT6357_UL_SRC_ON_TMP_CTL_MASK		BIT(0)
+#define MT6357_UL_SRC_ENABLE			BIT(0)
+#define MT6357_UL_SRC_DISABLE			0
+
+/* MT6357_AFE_TOP_CON0 */
+#define MT6357_UL_SINE_ON_SFT			1
+#define MT6357_UL_SINE_ON_MASK			BIT(1)
+#define MT6357_DL_SINE_ON_SFT			0
+#define MT6357_DL_SINE_ON_MASK			BIT(0)
+
+/* MT6357_AUDIO_TOP_CON0 */
+#define MT6357_PDN_LPBK_CTL_SFT			15
+#define MT6357_PDN_AFE_CTL_SFT			7
+#define MT6357_PDN_DAC_CTL_SFT			6
+#define MT6357_PDN_ADC_CTL_SFT			5
+#define MT6357_PDN_I2S_DL_CTL_SFT		3
+#define MT6357_PWR_CLK_DIS_CTL_SFT		2
+#define MT6357_PDN_AFE_TESTMODEL_CTL_SFT	1
+#define MT6357_PDN_RESERVED_SFT			0
+
+/* MT6357_AFUNC_AUD_CON0 */
+#define MT6357_CCI_AUD_ANACK_INVERT			BIT(15)
+#define MT6357_CCI_AUD_ANACK_NORMAL			0
+#define MT6357_CCI_AUDIO_FIFO_WPTR_SFT			12
+#define MT6357_CCI_SCRAMBLER_CG_ENABLE			BIT(11)
+#define MT6357_CCI_SCRAMBLER_CG_DISABLE			0
+#define MT6357_CCI_LCK_INV_OUT_OF_PHASE			BIT(10)
+#define MT6357_CCI_LCK_INV_IN_PHASE			0
+#define MT6357_CCI_RAND_ENABLE				BIT(9)
+#define MT6357_CCI_RAND_DISABLE				0
+#define MT6357_CCI_SPLT_SCRMB_CLK_ON			BIT(8)
+#define MT6357_CCI_SPLT_SCRMB_CLK_OFF			0
+#define MT6357_CCI_SPLT_SCRMB_ON			BIT(7)
+#define MT6357_CCI_SPLT_SCRMB_OFF			0
+#define MT6357_CCI_AUD_IDAC_TEST_EN_FROM_TEST_IN	BIT(6)
+#define MT6357_CCI_AUD_IDAC_TEST_EN_NORMAL_PATH		0
+#define MT6357_CCI_ZERO_PADDING_DISABLE			BIT(5)
+#define MT6357_CCI_ZERO_PADDING_ENABLE			0
+#define MT6357_CCI_AUD_SPLIT_TEST_EN_FROM_TEST_IN	BIT(4)
+#define MT6357_CCI_AUD_SPLIT_TEST_EN_NORMAL_PATH	0
+#define MT6357_CCI_AUD_SDM_MUTE_L_REG_CTL		BIT(3)
+#define MT6357_CCI_AUD_SDM_MUTE_L_NO_CTL		0
+#define MT6357_CCI_AUD_SDM_MUTE_R_REG_CTL		BIT(2)
+#define MT6357_CCI_AUD_SDM_MUTE_R_NO_CTL		0
+#define MT6357_CCI_AUD_SDM_7BIT_FROM_SPLITTER3		BIT(1)
+#define MT6357_CCI_AUD_SDM_7BIT_FROM_SPLITTER1		0
+#define MT6357_CCI_SCRAMBLER_ENABLE			BIT(0)
+#define MT6357_CCI_SCRAMBLER_DISABLE			0
+
+/* MT6357_AFUNC_AUD_CON2 */
+#define MT6357_CCI_AUDIO_FIFO_ENABLE		BIT(3)
+#define MT6357_CCI_AUDIO_FIFO_DISABLE		0
+#define MT6357_CCI_ACD_MODE_NORMAL_PATH		BIT(2)
+#define MT6357_CCI_ACD_MODE_TEST_PATH		0
+#define MT6357_CCI_AFIFO_CLK_PWDB_ON		BIT(1)
+#define MT6357_CCI_AFIFO_CLK_PWDB_DOWN		0
+#define MT6357_CCI_ACD_FUNC_RSTB_RELEASE	BIT(0)
+#define MT6357_CCI_ACD_FUNC_RSTB_RESET		0
+
+/* MT6357_AFE_ADDA_MTKAIF_CFG0 */
+#define MT6357_ADDA_MTKAIF_LPBK_CTL_MASK	BIT(1)
+#define MT6357_ADDA_MTKAIF_LPBK_ENABLE		BIT(1)
+#define MT6357_ADDA_MTKAIF_LPBK_DISABLE		0
+
+/* MT6357_AFE_SGEN_CFG0 */
+#define MT6357_SGEN_DAC_EN_CTL_SFT		7
+#define MT6357_SGEN_DAC_ENABLE			BIT(7)
+#define MT6357_SGEN_MUTE_SW_CTL_SFT		6
+#define MT6357_SGEN_MUTE_SW_DISABLE		0
+
+/* MT6357_AFE_DCCLK_CFG0 */
+#define MT6357_DCCLK_DIV_MASK			GENMASK(15, 5)
+#define MT6357_DCCLK_DIV_SFT			5
+#define MT6357_DCCLK_DIV_RUN_VALUE		(32 << MT6357_DCCLK_DIV_SFT)
+#define MT6357_DCCLK_DIV_STOP_VALUE		(259 << MT6357_DCCLK_DIV_SFT)
+#define MT6357_DCCLK_PDN_MASK			BIT(1)
+#define MT6357_DCCLK_PDN			BIT(1)
+#define MT6357_DCCLK_OUTPUT			0
+#define MT6357_DCCLK_GEN_ON_MASK		BIT(0)
+#define MT6357_DCCLK_GEN_ON			BIT(0)
+#define MT6357_DCCLK_GEN_OFF			0
+
+/* MT6357_AFE_DCCLK_CFG1 */
+#define MT6357_DCCLK_RESYNC_BYPASS_MASK		BIT(8)
+#define MT6357_DCCLK_RESYNC_BYPASS		BIT(8)
+
+/* MT6357_AFE_AUD_PAD_TOP */
+#define MT6357_AUD_PAD_TX_FIFO_NORMAL_PATH_MASK		GENMASK(15, 8)
+#define MT6357_AUD_PAD_TX_FIFO_NORMAL_PATH_ENABLE	(BIT(13) | BIT(12) | BIT(8))
+#define MT6357_AUD_PAD_TX_FIFO_NORMAL_PATH_DISABLE	(BIT(13) | BIT(12))
+#define MT6357_AUD_PAD_TX_FIFO_LPBK_MASK		GENMASK(7, 0)
+#define MT6357_AUD_PAD_TX_FIFO_LPBK_ENABLE		(BIT(5) | BIT(4) | BIT(0))
+#define MT6357_AUD_PAD_TX_FIFO_LPBK_DISABLE		0
+
+/* MT6357_AUDENC_ANA_CON0 */
+#define MT6357_AUDADCLINPUTSEL_MASK		GENMASK(14, 13)
+#define MT6357_AUDADCLINPUTSEL_PREAMPLIFIER	BIT(14)
+#define MT6357_AUDADCLINPUTSEL_IDLE		0
+#define MT6357_AUDADCLPWRUP_SFT			12
+#define MT6357_AUDADCLPWRUP_MASK		BIT(12)
+#define MT6357_AUDADCLPWRUP			BIT(12)
+#define MT6357_AUDADCLPWRDOWN			0
+#define MT6357_AUDPREAMPLGAIN_SFT		8
+#define MT6357_AUDPREAMPLGAIN_MASK		GENMASK(10, 8)
+#define MT6357_AUDPREAMPLGAIN_MAX		4
+#define MT6357_AUDPREAMPLINPUTSEL_SFT		6
+#define MT6357_AUDPREAMPLINPUTSEL_MASK_NOSFT	GENMASK(1, 0)
+#define MT6357_AUDPREAMPLDCPRECHARGE_MASK	BIT(2)
+#define MT6357_AUDPREAMPLDCPRECHARGE_ENABLE	BIT(2)
+#define MT6357_AUDPREAMPLDCPRECHARGE_DISABLE	0
+#define MT6357_AUDPREAMPLDCCEN_MASK		BIT(1)
+#define MT6357_AUDPREAMPLDCCEN_DC		BIT(1)
+#define MT6357_AUDPREAMPLDCCEN_AC		0
+#define MT6357_AUDPREAMPLON_MASK		BIT(0)
+#define MT6357_AUDPREAMPLON_ENABLE		BIT(0)
+#define MT6357_AUDPREAMPLON_DISABLE		0
+
+/* MT6357_AUDENC_ANA_CON1 */
+#define MT6357_AUDADCRINPUTSEL_MASK		GENMASK(14, 13)
+#define MT6357_AUDADCRINPUTSEL_PREAMPLIFIER	BIT(14)
+#define MT6357_AUDADCRINPUTSEL_IDLE		0
+#define MT6357_AUDADCRPWRUP_SFT			12
+#define MT6357_AUDADCRPWRUP_MASK		BIT(12)
+#define MT6357_AUDADCRPWRUP			BIT(12)
+#define MT6357_AUDADCRPWRDOWN			0
+#define MT6357_AUDPREAMPRGAIN_SFT		8
+#define MT6357_AUDPREAMPRGAIN_MASK		GENMASK(10, 8)
+#define MT6357_AUDPREAMPRGAIN_MAX		4
+#define MT6357_AUDPREAMPRINPUTSEL_SFT		6
+#define MT6357_AUDPREAMPRINPUTSEL_MASK_NOSFT	GENMASK(1, 0)
+#define MT6357_AUDPREAMPRDCPRECHARGE_MASK	BIT(2)
+#define MT6357_AUDPREAMPRDCPRECHARGE_ENABLE	BIT(2)
+#define MT6357_AUDPREAMPRDCPRECHARGE_DISABLE	0
+#define MT6357_AUDPREAMPRDCCEN_MASK		BIT(1)
+#define MT6357_AUDPREAMPRDCCEN_DC		BIT(1)
+#define MT6357_AUDPREAMPRDCCEN_AC		0
+#define MT6357_AUDPREAMPRON_MASK		BIT(0)
+#define MT6357_AUDPREAMPRON_ENABLE		BIT(0)
+#define MT6357_AUDPREAMPRON_DISABLE		0
+
+/* MT6357_AUDENC_ANA_CON6 */
+#define MT6357_CLKSQ_EN_SFT			0
+
+/* MT6357_AUDENC_ANA_CON7 */
+#define MT6357_AUDDIGMICBIAS_MASK		GENMASK(2, 1)
+#define MT6357_AUDDIGMICBIAS_DEFAULT_VALUE	BIT(2)
+#define MT6357_AUDDIGMICBIAS_OFF		0
+#define MT6357_AUDDIGMICEN_MASK			BIT(0)
+#define MT6357_AUDDIGMICEN_ENABLE		BIT(0)
+#define MT6357_AUDDIGMICEN_DISABLE		0
+
+/* MT6357_AUDENC_ANA_CON8 */
+#define MT6357_AUD_MICBIAS0_DCSW2N_EN_MASK	BIT(14)
+#define MT6357_AUD_MICBIAS0_DCSW2N_ENABLE	BIT(14)
+#define MT6357_AUD_MICBIAS0_DCSW2N_DISABLE	0
+#define MT6357_AUD_MICBIAS0_DCSW2P2_EN_MASK	BIT(13)
+#define MT6357_AUD_MICBIAS0_DCSW2P2_ENABLE	BIT(13)
+#define MT6357_AUD_MICBIAS0_DCSW2P2_DISABLE	0
+#define MT6357_AUD_MICBIAS0_DCSW2P1_EN_MASK	BIT(12)
+#define MT6357_AUD_MICBIAS0_DCSW2P1_ENABLE	BIT(12)
+#define MT6357_AUD_MICBIAS0_DCSW2P1_DISABLE	0
+#define MT6357_AUD_MICBIAS0_DCSW0N_EN_MASK	BIT(10)
+#define MT6357_AUD_MICBIAS0_DCSW0N_ENABLE	BIT(10)
+#define MT6357_AUD_MICBIAS0_DCSWN_DISABLE	0
+#define MT6357_AUD_MICBIAS0_DCSW0P2_EN_MASK	BIT(9)
+#define MT6357_AUD_MICBIAS0_DCSW0P2_ENABLE	BIT(9)
+#define MT6357_AUD_MICBIAS0_DCSW0P2_DISABLE	0
+#define MT6357_AUD_MICBIAS0_DCSW0P1_EN_MASK	BIT(8)
+#define MT6357_AUD_MICBIAS0_DCSW0P1_ENABLE	BIT(8)
+#define MT6357_AUD_MICBIAS0_DCSW0P1_DISABLE	0
+#define MT6357_AUD_MICBIAS0_VREF_MASK		GENMASK(6, 4)
+#define MT6357_AUD_MICBIAS0_VREF_SFT		4
+#define MT6357_AUD_MICBIAS0_PWD_SFT		0
+
+#define MT6357_AUD_MICBIAS0_DC_MASK		(MT6357_AUD_MICBIAS0_DCSW2N_EN_MASK | \
+						 MT6357_AUD_MICBIAS0_DCSW2P2_EN_MASK | \
+						 MT6357_AUD_MICBIAS0_DCSW2P1_EN_MASK | \
+						 MT6357_AUD_MICBIAS0_DCSW0N_EN_MASK | \
+						 MT6357_AUD_MICBIAS0_DCSW0P2_EN_MASK | \
+						 MT6357_AUD_MICBIAS0_DCSW0P1_EN_MASK)
+
+#define MT6357_AUD_MICBIAS0_DC_ENABLE_ALL	(MT6357_AUD_MICBIAS0_DCSW2N_ENABLE | \
+						 MT6357_AUD_MICBIAS0_DCSW2P2_ENABLE | \
+						 MT6357_AUD_MICBIAS0_DCSW2P1_ENABLE | \
+						 MT6357_AUD_MICBIAS0_DCSW0N_ENABLE | \
+						 MT6357_AUD_MICBIAS0_DCSW0P2_ENABLE | \
+						 MT6357_AUD_MICBIAS0_DCSW0P1_ENABLE)
+
+#define MT6357_AUD_MICBIAS0_DC_ENABLE_P1	(MT6357_AUD_MICBIAS0_DCSW2P1_ENABLE | \
+						 MT6357_AUD_MICBIAS0_DCSW0P1_ENABLE)
+
+#define MT6357_AUD_MICBIAS0_DC_DISABLE_ALL	0
+
+/* MT6357_AUDENC_ANA_CON9 */
+#define MT6357_AUD_MICBIAS1_DCSW1P_EN_MASK	BIT(8)
+#define MT6357_AUD_MICBIAS1_DCSW1P_ENABLE	BIT(8)
+#define MT6357_AUD_MICBIAS1_DCSW1P_DISABLE	0
+#define MT6357_AUD_MICBIAS1_VREF_MASK		GENMASK(6, 4)
+#define MT6357_AUD_MICBIAS1_VREF_SFT		4
+#define MT6357_AUD_MICBIAS1_PWD_SFT		0
+
+/* MT6357_AUDDEC_ANA_CON0 */
+#define MT6357_AUD_HPR_SC_VAUDP15_MASK			BIT(13)
+#define MT6357_AUD_HPR_SC_VAUDP15_DISABLE		BIT(13)
+#define MT6357_AUD_HPR_SC_VAUDP15_ENABLE		0
+#define MT6357_AUD_HPL_SC_VAUDP15_MASK			BIT(12)
+#define MT6357_AUD_HPL_SC_VAUDP15_DISABLE		BIT(12)
+#define MT6357_AUD_HPL_SC_VAUDP15_ENABLE		0
+#define MT6357_AUD_HPR_MUX_INPUT_VAUDP15_MASK_NOSFT	GENMASK(1, 0)
+#define MT6357_AUD_HPR_MUX_INPUT_VAUDP15_SFT		10
+#define MT6357_AUD_HPL_MUX_INPUT_VAUDP15_MASK_NOSFT	GENMASK(1, 0)
+#define MT6357_AUD_HPL_MUX_INPUT_VAUDP15_SFT		8
+#define MT6357_AUD_HPR_BIAS_VAUDP15_MASK		BIT(7)
+#define MT6357_AUD_HPR_BIAS_VAUDP15_ENABLE		BIT(7)
+#define MT6357_AUD_HPR_BIAS_VAUDP15_DISABLE		0
+#define MT6357_AUD_HPL_BIAS_VAUDP15_MASK		BIT(6)
+#define MT6357_AUD_HPL_BIAS_VAUDP15_ENABLE		BIT(6)
+#define MT6357_AUD_HPL_BIAS_VAUDP15_DISABLE		0
+#define MT6357_AUD_HPR_PWRUP_VAUDP15_MASK		BIT(5)
+#define MT6357_AUD_HPR_PWRUP_VAUDP15_ENABLE		BIT(5)
+#define MT6357_AUD_HPR_PWRUP_VAUDP15_DISABLE		0
+#define MT6357_AUD_HPL_PWRUP_VAUDP15_MASK		BIT(4)
+#define MT6357_AUD_HPL_PWRUP_VAUDP15_ENABLE		BIT(4)
+#define MT6357_AUD_HPL_PWRUP_VAUDP15_DISABLE		0
+#define MT6357_AUD_DACL_PWRUP_VA28_MASK			BIT(3)
+#define MT6357_AUD_DACL_PWRUP_VA28_ENABLE		BIT(3)
+#define MT6357_AUD_DACL_PWRUP_VA28_DISABLE		0
+#define MT6357_AUD_DACR_PWRUP_VA28_MASK			BIT(2)
+#define MT6357_AUD_DACR_PWRUP_VA28_ENABLE		BIT(2)
+#define MT6357_AUD_DACR_PWRUP_VA28_DISABLE		0
+#define MT6357_AUD_DACR_PWRUP_VAUDP15_MASK		BIT(1)
+#define MT6357_AUD_DACR_PWRUP_VAUDP15_ENABLE		BIT(1)
+#define MT6357_AUD_DACR_PWRUP_VAUDP15_DISABLE		0
+#define MT6357_AUD_DACL_PWRUP_VAUDP15_MASK		BIT(0)
+#define MT6357_AUD_DACL_PWRUP_VAUDP15_ENABLE		BIT(0)
+#define MT6357_AUD_DACL_PWRUP_VAUDP15_DISABLE		0
+
+/* MT6357_AUDDEC_ANA_CON1 */
+#define MT6357_HPROUT_STG_CTRL_VAUDP15_MASK		GENMASK(14, 12)
+#define MT6357_HPROUT_STG_CTRL_VAUDP15_SFT		12
+#define MT6357_HPLOUT_STG_CTRL_VAUDP15_MASK		GENMASK(10, 8)
+#define MT6357_HPLOUT_STG_CTRL_VAUDP15_SFT		8
+#define MT6357_HPLOUT_STG_CTRL_VAUDP15_MAX		7
+#define MT6357_HPR_SHORT2HPR_AUX_VAUDP15_MASK		BIT(7)
+#define MT6357_HPR_SHORT2HPR_AUX_VAUDP15_ENABLE		BIT(7)
+#define MT6357_HPR_SHORT2HPR_AUX_VAUDP15_DISABLE	0
+#define MT6357_HPL_SHORT2HPR_AUX_VAUDP15_MASK		BIT(6)
+#define MT6357_HPL_SHORT2HPR_AUX_VAUDP15_ENABLE		BIT(6)
+#define MT6357_HPL_SHORT2HPR_AUX_VAUDP15_DISABLE	0
+#define MT6357_HPR_AUX_FBRSW_VAUDP15_MASK		BIT(5)
+#define MT6357_HPR_AUX_FBRSW_VAUDP15_ENABLE		BIT(5)
+#define MT6357_HPR_AUX_FBRSW_VAUDP15_DISABLE		0
+#define MT6357_HPL_AUX_FBRSW_VAUDP15_MASK		BIT(4)
+#define MT6357_HPL_AUX_FBRSW_VAUDP15_ENABLE		BIT(4)
+#define MT6357_HPL_AUX_FBRSW_VAUDP15_DISABLE		0
+#define MT6357_HPROUT_AUX_PWRUP_VAUDP15_MASK		BIT(3)
+#define MT6357_HPROUT_AUX_PWRUP_VAUDP15_ENABLE		BIT(3)
+#define MT6357_HPROUT_AUX_PWRUP_VAUDP15_DISABLE	0
+#define MT6357_HPLOUT_AUX_PWRUP_VAUDP15_MASK		BIT(2)
+#define MT6357_HPLOUT_AUX_PWRUP_VAUDP15_ENABLE		BIT(2)
+#define MT6357_HPLOUT_AUX_PWRUP_VAUDP15_DISABLE	0
+#define MT6357_HPROUT_PWRUP_VAUDP15_MASK		BIT(1)
+#define MT6357_HPROUT_PWRUP_VAUDP15_ENABLE		BIT(1)
+#define MT6357_HPROUT_PWRUP_VAUDP15_DISABLE		0
+#define MT6357_HPLOUT_PWRUP_VAUDP15_MASK		BIT(0)
+#define MT6357_HPLOUT_PWRUP_VAUDP15_ENABLE		BIT(0)
+#define MT6357_HPLOUT_PWRUP_VAUDP15_DISABLE		0
+
+/* MT6357_AUDDEC_ANA_CON2 */
+#define MT6357_HPP_SHORT_2VCM_VAUDP15_MASK		BIT(10)
+#define MT6357_HPP_SHORT_2VCM_VAUDP15_ENABLE		BIT(10)
+#define MT6357_HPP_SHORT_2VCM_VAUDP15_DISABLE		0
+#define MT6357_AUD_REFN_DERES_VAUDP15_MASK		BIT(9)
+#define MT6357_AUD_REFN_DERES_VAUDP15_ENABLE		BIT(9)
+#define MT6357_AUD_REFN_DERES_VAUDP15_DISABLE		0
+#define MT6357_HPROUT_STB_ENH_VAUDP15_MASK		GENMASK(6, 4)
+#define MT6357_HPROUT_STB_ENH_VAUDP15_OPEN		0
+#define MT6357_HPROUT_STB_ENH_VAUDP15_NOPEN_P250	BIT(4)
+#define MT6357_HPROUT_STB_ENH_VAUDP15_N470_POPEN	BIT(5)
+#define MT6357_HPROUT_STB_ENH_VAUDP15_N470_P250		(BIT(4) | BIT(5))
+#define MT6357_HPROUT_STB_ENH_VAUDP15_NOPEN_P470	(BIT(4) | BIT(6))
+#define MT6357_HPROUT_STB_ENH_VAUDP15_N470_P470		(BIT(4) | BIT(5) | BIT(6))
+#define MT6357_HPLOUT_STB_ENH_VAUDP15_MASK		GENMASK(2, 0)
+#define MT6357_HPLOUT_STB_ENH_VAUDP15_OPEN		0
+#define MT6357_HPLOUT_STB_ENH_VAUDP15_NOPEN_P250	BIT(0)
+#define MT6357_HPLOUT_STB_ENH_VAUDP15_N470_POPEN	BIT(1)
+#define MT6357_HPLOUT_STB_ENH_VAUDP15_N470_P250		(BIT(0) | BIT(1))
+#define MT6357_HPLOUT_STB_ENH_VAUDP15_NOPEN_P470	(BIT(0) | BIT(2))
+#define MT6357_HPLOUT_STB_ENH_VAUDP15_N470_P470		(BIT(0) | BIT(1) | BIT(2))
+
+/* MT6357_AUDDEC_ANA_CON3 */
+#define MT6357_AUD_HSOUT_STB_ENH_VAUDP15_MASK		BIT(7)
+#define MT6357_AUD_HSOUT_STB_ENH_VAUDP15_ENABLE		BIT(7)
+#define MT6357_AUD_HSOUT_STB_ENH_VAUDP15_DISABLE	0
+#define MT6357_AUD_HS_SC_VAUDP15_MASK			BIT(4)
+#define MT6357_AUD_HS_SC_VAUDP15_DISABLE		BIT(4)
+#define MT6357_AUD_HS_SC_VAUDP15_ENABLE			0
+#define MT6357_AUD_HS_MUX_INPUT_VAUDP15_MASK_NOSFT	GENMASK(1, 0)
+#define MT6357_AUD_HS_MUX_INPUT_VAUDP15_SFT		2
+#define MT6357_AUD_HS_PWRUP_BIAS_VAUDP15_MASK		BIT(1)
+#define MT6357_AUD_HS_PWRUP_BIAS_VAUDP15_ENABLE		BIT(1)
+#define MT6357_AUD_HS_PWRUP_BIAS_VAUDP15_DISABLE	0
+#define MT6357_AUD_HS_PWRUP_VAUDP15_MASK		BIT(0)
+#define MT6357_AUD_HS_PWRUP_VAUDP15_ENABLE		BIT(0)
+#define MT6357_AUD_HS_PWRUP_VAUDP15_DISABLE		0
+
+/* MT6357_AUDDEC_ANA_CON4 */
+#define MT6357_AUD_LOLOUT_STB_ENH_VAUDP15_MASK		BIT(8)
+#define MT6357_AUD_LOLOUT_STB_ENH_VAUDP15_ENABLE	BIT(8)
+#define MT6357_AUD_LOLOUT_STB_ENH_VAUDP15_DISABLE	0
+#define MT6357_AUD_LOL_SC_VAUDP15_MASK			BIT(4)
+#define MT6357_AUD_LOL_SC_VAUDP15_DISABLE		BIT(4)
+#define MT6357_AUD_LOL_SC_VAUDP15_ENABLE		0
+#define MT6357_AUD_LOL_MUX_INPUT_VAUDP15_MASK_NOSFT	GENMASK(1, 0)
+#define MT6357_AUD_LOL_MUX_INPUT_VAUDP15_SFT		2
+#define MT6357_AUD_LOL_PWRUP_BIAS_VAUDP15_MASK		BIT(1)
+#define MT6357_AUD_LOL_PWRUP_BIAS_VAUDP15_ENABLE	BIT(1)
+#define MT6357_AUD_LOL_PWRUP_BIAS_VAUDP15_DISABLE	0
+#define MT6357_AUD_LOL_PWRUP_VAUDP15_MASK		BIT(0)
+#define MT6357_AUD_LOL_PWRUP_VAUDP15_ENABLE		BIT(0)
+#define MT6357_AUD_LOL_PWRUP_VAUDP15_DISABLE		0
+
+/* MT6357_AUDDEC_ANA_CON6 */
+#define MT6357_HP_AUX_LOOP_GAIN_MASK		GENMASK(15, 12)
+#define MT6357_HP_AUX_LOOP_GAIN_SFT		12
+#define MT6357_HP_AUX_LOOP_GAIN_MAX		0x0f
+#define MT6357_HPR_AUX_CMFB_LOOP_MASK		BIT(11)
+#define MT6357_HPR_AUX_CMFB_LOOP_ENABLE		BIT(11)
+#define MT6357_HPR_AUX_CMFB_LOOP_DISABLE	0
+#define MT6357_HPL_AUX_CMFB_LOOP_MASK		BIT(10)
+#define MT6357_HPL_AUX_CMFB_LOOP_ENABLE		BIT(10)
+#define MT6357_HPL_AUX_CMFB_LOOP_DISABLE	0
+#define MT6357_HPRL_MAIN_CMFB_LOOP_MASK		BIT(9)
+#define MT6357_HPRL_MAIN_CMFB_LOOP_ENABLE	BIT(9)
+#define MT6357_HPRL_MAIN_CMFB_LOOP_DISABLE	0
+#define MT6357_HP_CMFB_RST_MASK			BIT(7)
+#define MT6357_HP_CMFB_RST_NORMAL		BIT(7)
+#define MT6357_HP_CMFB_RST_RESET		0
+#define MT6357_DAC_LOW_NOISE_MODE_MASK		BIT(0)
+#define MT6357_DAC_LOW_NOISE_MODE_ENABLE	BIT(0)
+#define MT6357_DAC_LOW_NOISE_MODE_DISABLE	0
+
+/* MT6357_AUDDEC_ANA_CON7 */
+#define MT6357_HP_IVBUF_DEGAIN_SFT		2
+#define MT6357_HP_IVBUF_DEGAIN_MAX		1
+
+/* MT6357_AUDDEC_ANA_CON10 */
+#define MT6357_AUD_IBIAS_PWRDN_VAUDP15_MASK	BIT(8)
+#define MT6357_AUD_IBIAS_PWRDN_VAUDP15_DISABLE	BIT(8)
+#define MT6357_AUD_IBIAS_PWRDN_VAUDP15_ENABLE	0
+
+/* MT6357_AUDDEC_ANA_CON11 */
+#define MT6357_RSTB_ENCODER_VA28_MASK		BIT(5)
+#define MT6357_RSTB_ENCODER_VA28_ENABLE		BIT(5)
+#define MT6357_RSTB_ENCODER_VA28_DISABLE	0
+#define MT6357_AUDGLB_PWRDN_VA28_SFT		4
+#define MT6357_RSTB_DECODER_VA28_MASK		BIT(0)
+#define MT6357_RSTB_DECODER_VA28_ENABLE		BIT(0)
+#define MT6357_RSTB_DECODER_VA28_DISABLE	0
+
+/* MT6357_AUDDEC_ANA_CON12 */
+#define MT6357_VA28REFGEN_EN_VA28_MASK			BIT(13)
+#define MT6357_VA28REFGEN_EN_VA28_ENABLE		BIT(13)
+#define MT6357_VA28REFGEN_EN_VA28_DISABLE		0
+#define MT6357_VA33REFGEN_EN_VA18_MASK			BIT(12)
+#define MT6357_VA33REFGEN_EN_VA18_ENABLE		BIT(12)
+#define MT6357_VA33REFGEN_EN_VA18_DISABLE		0
+#define MT6357_LCLDO_ENC_REMOTE_SENSE_VA28_MASK		BIT(10)
+#define MT6357_LCLDO_ENC_REMOTE_SENSE_VA28_ENABLE	BIT(10)
+#define MT6357_LCLDO_ENC_REMOTE_SENSE_VA28_DISABLE	0
+#define MT6357_LCLDO_ENC_EN_VA28_MASK			BIT(8)
+#define MT6357_LCLDO_ENC_EN_VA28_ENABLE			BIT(8)
+#define MT6357_LCLDO_ENC_EN_VA28_DISABLE		0
+#define MT6357_LCLDO_REMOTE_SENSE_VA18_MASK		BIT(6)
+#define MT6357_LCLDO_REMOTE_SENSE_VA18_ENABLE		BIT(6)
+#define MT6357_LCLDO_REMOTE_SENSE_VA18_DISABLE		0
+#define MT6357_LCLDO_EN_VA18_MASK			BIT(4)
+#define MT6357_LCLDO_EN_VA18_ENABLE			BIT(4)
+#define MT6357_LCLDO_EN_VA18_DISABLE			0
+#define MT6357_HCLDO_REMOTE_SENSE_VA18_MASK		BIT(2)
+#define MT6357_HCLDO_REMOTE_SENSE_VA18_ENABLE		BIT(2)
+#define MT6357_HCLDO_REMOTE_SENSE_VA18_DISABLE		0
+#define MT6357_HCLDO_EN_VA18_MASK			BIT(0)
+#define MT6357_HCLDO_EN_VA18_ENABLE			BIT(0)
+#define MT6357_HCLDO_EN_VA18_DISABLE			0
+
+/* MT6357_AUDDEC_ANA_CON13 */
+#define MT6357_NVREG_EN_VAUDP15_MASK		BIT(0)
+#define MT6357_NVREG_EN_VAUDP15_ENABLE		BIT(0)
+#define MT6357_NVREG_EN_VAUDP15_DISABLE		0
+
+/* MT6357_AUDDEC_ELR_0 */
+#define MT6357_AUD_HP_TRIM_EN_VAUDP15_MASK	BIT(12)
+#define MT6357_AUD_HP_TRIM_EN_VAUDP15_ENABLE	BIT(12)
+#define MT6357_AUD_HP_TRIM_EN_VAUDP15_DISABLE	0
+
+/* MT6357_ZCD_CON1 */
+#define MT6357_AUD_LOL_GAIN_MASK		GENMASK(4, 0)
+#define MT6357_AUD_LOL_GAIN_SFT			0
+#define MT6357_AUD_LOR_GAIN_MASK		GENMASK(11, 7)
+#define MT6357_AUD_LOR_GAIN_SFT			7
+#define MT6357_AUD_LO_GAIN_MAX			0x12
+
+/* MT6357_ZCD_CON2 */
+#define MT6357_AUD_HPL_GAIN_MASK		GENMASK(4, 0)
+#define MT6357_AUD_HPL_GAIN_SFT			0
+#define MT6357_AUD_HPR_GAIN_MASK		GENMASK(11, 7)
+#define MT6357_AUD_HPR_GAIN_SFT			7
+#define MT6357_AUD_HP_GAIN_MAX			0x12
+
+/* MT6357_ZCD_CON3 */
+#define MT6357_AUD_HS_GAIN_MASK			GENMASK(4, 0)
+#define MT6357_AUD_HS_GAIN_SFT			0
+#define MT6357_AUD_HS_GAIN_MAX			0x12
+
+/* Registers list */
+/* gpio direction */
+#define MT6357_GPIO_DIR0			0x0088
+/* mosi */
+#define MT6357_GPIO_MODE2			0x00B6
+#define MT6357_GPIO_MODE2_SET			0x00B8
+#define MT6357_GPIO_MODE2_CLR			0x00BA
+/* miso */
+#define MT6357_GPIO_MODE3			0x00BC
+#define MT6357_GPIO_MODE3_SET			0x00BE
+#define MT6357_GPIO_MODE3_CLR			0x00C0
+
+#define MT6357_DCXO_CW14			0x07AC
+
+#define MT6357_AUD_TOP_CKPDN_CON0		0x208C
+#define MT6357_AUDNCP_CLKDIV_CON0		0x20B4
+#define MT6357_AUDNCP_CLKDIV_CON1		0x20B6
+#define MT6357_AUDNCP_CLKDIV_CON2		0x20B8
+#define MT6357_AUDNCP_CLKDIV_CON3		0x20BA
+#define MT6357_AUDNCP_CLKDIV_CON4		0x20BC
+#define MT6357_AFE_UL_DL_CON0			0x2108
+#define MT6357_AFE_DL_SRC2_CON0_L		0x210A
+#define MT6357_AFE_UL_SRC_CON0_H		0x210C
+#define MT6357_AFE_UL_SRC_CON0_L		0x210E
+#define MT6357_AFE_TOP_CON0			0x2110
+#define MT6357_AUDIO_TOP_CON0			0x2112
+#define MT6357_AFUNC_AUD_CON0			0x2116
+#define MT6357_AFUNC_AUD_CON2			0x211A
+#define MT6357_AFE_ADDA_MTKAIF_CFG0		0x2134
+#define MT6357_AFE_SGEN_CFG0			0x2140
+#define MT6357_AFE_DCCLK_CFG0			0x2146
+#define MT6357_AFE_DCCLK_CFG1			0x2148
+#define MT6357_AFE_AUD_PAD_TOP			0x214C
+#define MT6357_AUDENC_ANA_CON0			0x2188
+#define MT6357_AUDENC_ANA_CON1			0x218A
+#define MT6357_AUDENC_ANA_CON6			0x2194
+#define MT6357_AUDENC_ANA_CON7			0x2196
+#define MT6357_AUDENC_ANA_CON8			0x2198
+#define MT6357_AUDENC_ANA_CON9			0x219A
+#define MT6357_AUDDEC_ANA_CON0			0x2208
+#define MT6357_AUDDEC_ANA_CON1			0x220A
+#define MT6357_AUDDEC_ANA_CON2			0x220C
+#define MT6357_AUDDEC_ANA_CON3			0x220E
+#define MT6357_AUDDEC_ANA_CON4			0x2210
+#define MT6357_AUDDEC_ANA_CON6			0x2214
+#define MT6357_AUDDEC_ANA_CON7			0x2216
+#define MT6357_AUDDEC_ANA_CON10			0x221C
+#define MT6357_AUDDEC_ANA_CON11			0x221E
+#define MT6357_AUDDEC_ANA_CON12			0x2220
+#define MT6357_AUDDEC_ANA_CON13			0x2222
+#define MT6357_AUDDEC_ELR_0			0x2226
+#define MT6357_ZCD_CON1				0x228A
+#define MT6357_ZCD_CON2				0x228C
+#define MT6357_ZCD_CON3				0x228E
+
+enum {
+	DL_GAIN_8DB = 0,
+	DL_GAIN_0DB = 8,
+	DL_GAIN_N_1DB = 9,
+	DL_GAIN_N_10DB = 18,
+	DL_GAIN_N_12DB = 20,
+	DL_GAIN_N_40DB = 0x1f,
+};
+
+enum {
+	UL_GAIN_0DB = 0,
+	UL_GAIN_6DB,
+	UL_GAIN_12DB,
+	UL_GAIN_18DB,
+	UL_GAIN_24DB,
+};
+
+#define MT6357_DL_GAIN_N_40DB_REG		(DL_GAIN_N_40DB << 7 | DL_GAIN_N_40DB)
+#define MT6357_DL_GAIN_REG_LEFT_MASK		0x001f
+#define MT6357_DL_GAIN_REG_LEFT_SHIFT		0
+#define MT6357_DL_GAIN_REG_RIGHT_MASK		0x0f80
+#define MT6357_DL_GAIN_REG_RIGHT_SHIFT		7
+#define MT6357_DL_GAIN_REG_MASK			0x0f9f
+
+#define MT6357_SND_SOC_ADV_MT_FMTS (\
+				SNDRV_PCM_FMTBIT_S16_LE |\
+				SNDRV_PCM_FMTBIT_S16_BE |\
+				SNDRV_PCM_FMTBIT_U16_LE |\
+				SNDRV_PCM_FMTBIT_U16_BE |\
+				SNDRV_PCM_FMTBIT_S24_LE |\
+				SNDRV_PCM_FMTBIT_S24_BE |\
+				SNDRV_PCM_FMTBIT_U24_LE |\
+				SNDRV_PCM_FMTBIT_U24_BE |\
+				SNDRV_PCM_FMTBIT_S32_LE |\
+				SNDRV_PCM_FMTBIT_S32_BE |\
+				SNDRV_PCM_FMTBIT_U32_LE |\
+				SNDRV_PCM_FMTBIT_U32_BE)
+
+#define MT6357_SOC_HIGH_USE_RATE (\
+				SNDRV_PCM_RATE_CONTINUOUS |\
+				SNDRV_PCM_RATE_8000_192000)
+
+/* codec private structure */
+struct mt6357_priv {
+	struct device *dev;
+	struct regmap *regmap;
+	bool pull_down_needed;
+	int hp_channel_number;
+};
+#endif

-- 
2.25.1



From amergnat at baylibre.com  Thu Sep  5 02:06:59 2024
From: amergnat at baylibre.com (Alexandre Mergnat)
Date: Thu, 05 Sep 2024 11:06:59 +0200
Subject: [PATCH v8 2/5] ASoC: mediatek: Add MT8365 support
In-Reply-To: <20240226-audio-i350-v8-0-e80a57d026ce@baylibre.com>
References: <20240226-audio-i350-v8-0-e80a57d026ce@baylibre.com>
Message-ID: <20240226-audio-i350-v8-2-e80a57d026ce@baylibre.com>

- Add specific config to enable:
  - MT8365 sound support
  - MT6357 audio codec support
- Add the mt8365 directory and all drivers under it.

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
Signed-off-by: Alexandre Mergnat <amergnat at baylibre.com>
---
 sound/soc/mediatek/Kconfig         | 20 ++++++++++++++++++++
 sound/soc/mediatek/Makefile        |  1 +
 sound/soc/mediatek/mt8365/Makefile | 15 +++++++++++++++
 3 files changed, 36 insertions(+)

diff --git a/sound/soc/mediatek/Kconfig b/sound/soc/mediatek/Kconfig
index 5a8476e1ecca..e6f7a5a49794 100644
--- a/sound/soc/mediatek/Kconfig
+++ b/sound/soc/mediatek/Kconfig
@@ -298,3 +298,23 @@ config SND_SOC_MT8195_MT6359
 	  boards with the MT6359 and other I2S audio codecs.
 	  Select Y if you have such device.
 	  If unsure select "N".
+
+config SND_SOC_MT8365
+	tristate "ASoC support for MediaTek MT8365 chip"
+	depends on ARCH_MEDIATEK
+	select SND_SOC_MEDIATEK
+	help
+	  This adds ASoC platform driver support for MediaTek MT8365 chip
+	  that can be used with other codecs.
+	  Select Y if you have such device.
+	  If unsure select "N".
+
+config SND_SOC_MT8365_MT6357
+	tristate "ASoC Audio driver for MT8365 with MT6357 codec"
+	depends on SND_SOC_MT8365 && MTK_PMIC_WRAP
+	select SND_SOC_MT6357
+	help
+	  This adds support for ASoC machine driver for MediaTek MT8365
+	  boards with the MT6357 PMIC codec.
+	  Select Y if you have such device.
+	  If unsure select "N".
diff --git a/sound/soc/mediatek/Makefile b/sound/soc/mediatek/Makefile
index 3938e7f75c2e..4b55434f2168 100644
--- a/sound/soc/mediatek/Makefile
+++ b/sound/soc/mediatek/Makefile
@@ -9,3 +9,4 @@ obj-$(CONFIG_SND_SOC_MT8186) += mt8186/
 obj-$(CONFIG_SND_SOC_MT8188) += mt8188/
 obj-$(CONFIG_SND_SOC_MT8192) += mt8192/
 obj-$(CONFIG_SND_SOC_MT8195) += mt8195/
+obj-$(CONFIG_SND_SOC_MT8365) += mt8365/
diff --git a/sound/soc/mediatek/mt8365/Makefile b/sound/soc/mediatek/mt8365/Makefile
new file mode 100644
index 000000000000..52ba45a8498a
--- /dev/null
+++ b/sound/soc/mediatek/mt8365/Makefile
@@ -0,0 +1,15 @@
+# SPDX-License-Identifier: GPL-2.0
+
+# MTK Platform driver
+snd-soc-mt8365-pcm-objs := \
+	mt8365-afe-clk.o \
+	mt8365-afe-pcm.o \
+	mt8365-dai-adda.o \
+	mt8365-dai-dmic.o \
+	mt8365-dai-i2s.o \
+	mt8365-dai-pcm.o
+
+obj-$(CONFIG_SND_SOC_MT8365) += snd-soc-mt8365-pcm.o
+
+# Machine driver
+obj-$(CONFIG_SND_SOC_MT8365_MT6357) += mt8365-mt6357.o

-- 
2.25.1



From amergnat at baylibre.com  Thu Sep  5 02:07:00 2024
From: amergnat at baylibre.com (Alexandre Mergnat)
Date: Thu, 05 Sep 2024 11:07:00 +0200
Subject: [PATCH v8 3/5] arm64: defconfig: enable mt8365 sound
In-Reply-To: <20240226-audio-i350-v8-0-e80a57d026ce@baylibre.com>
References: <20240226-audio-i350-v8-0-e80a57d026ce@baylibre.com>
Message-ID: <20240226-audio-i350-v8-3-e80a57d026ce@baylibre.com>

Enable the MediaTek MT8365-EVK sound support.

The audio feature is handled by the MT8365 SoC and
the MT6357 PMIC codec audio.

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
Signed-off-by: Alexandre Mergnat <amergnat at baylibre.com>
---
 arch/arm64/configs/defconfig | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/arch/arm64/configs/defconfig b/arch/arm64/configs/defconfig
index 7d32fca64996..111ca3abd651 100644
--- a/arch/arm64/configs/defconfig
+++ b/arch/arm64/configs/defconfig
@@ -960,6 +960,8 @@ CONFIG_SND_SOC_MT8192=m
 CONFIG_SND_SOC_MT8192_MT6359_RT1015_RT5682=m
 CONFIG_SND_SOC_MT8195=m
 CONFIG_SND_SOC_MT8195_MT6359=m
+CONFIG_SND_SOC_MT8365=m
+CONFIG_SND_SOC_MT8365_MT6357=m
 CONFIG_SND_MESON_AXG_SOUND_CARD=m
 CONFIG_SND_MESON_GX_SOUND_CARD=m
 CONFIG_SND_SOC_QCOM=m

-- 
2.25.1



From amergnat at baylibre.com  Thu Sep  5 02:07:01 2024
From: amergnat at baylibre.com (Alexandre Mergnat)
Date: Thu, 05 Sep 2024 11:07:01 +0200
Subject: [PATCH v8 4/5] arm64: dts: mediatek: add afe support for mt8365
 SoC
In-Reply-To: <20240226-audio-i350-v8-0-e80a57d026ce@baylibre.com>
References: <20240226-audio-i350-v8-0-e80a57d026ce@baylibre.com>
Message-ID: <20240226-audio-i350-v8-4-e80a57d026ce@baylibre.com>

Add audio front end support of MT8365 SoC.
Update the file header.

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
Signed-off-by: Alexandre Mergnat <amergnat at baylibre.com>
---
 arch/arm64/boot/dts/mediatek/mt8365.dtsi | 43 ++++++++++++++++++++++++++++++--
 1 file changed, 41 insertions(+), 2 deletions(-)

diff --git a/arch/arm64/boot/dts/mediatek/mt8365.dtsi b/arch/arm64/boot/dts/mediatek/mt8365.dtsi
index eb449bfa8803..9c91fe8ea0f9 100644
--- a/arch/arm64/boot/dts/mediatek/mt8365.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8365.dtsi
@@ -2,9 +2,11 @@
 /*
  * (C) 2018 MediaTek Inc.
  * Copyright (C) 2022 BayLibre SAS
- * Fabien Parent <fparent at baylibre.com>
- * Bernhard Rosenkr?nzer <bero at baylibre.com>
+ * Authors: Fabien Parent <fparent at baylibre.com>
+ *	    Bernhard Rosenkr?nzer <bero at baylibre.com>
+ *	    Alexandre Mergnat <amergnat at baylibre.com>
  */
+
 #include <dt-bindings/clock/mediatek,mt8365-clk.h>
 #include <dt-bindings/interrupt-controller/arm-gic.h>
 #include <dt-bindings/interrupt-controller/irq.h>
@@ -812,6 +814,43 @@ apu: syscon at 19020000 {
 			reg = <0 0x19020000 0 0x1000>;
 			#clock-cells = <1>;
 		};
+
+		afe: audio-controller at 11220000 {
+			compatible = "mediatek,mt8365-afe-pcm";
+			reg = <0 0x11220000 0 0x1000>;
+			#sound-dai-cells = <0>;
+			clocks = <&clk26m>,
+				 <&topckgen CLK_TOP_AUDIO_SEL>,
+				 <&topckgen CLK_TOP_AUD_I2S0_M>,
+				 <&topckgen CLK_TOP_AUD_I2S1_M>,
+				 <&topckgen CLK_TOP_AUD_I2S2_M>,
+				 <&topckgen CLK_TOP_AUD_I2S3_M>,
+				 <&topckgen CLK_TOP_AUD_ENGEN1_SEL>,
+				 <&topckgen CLK_TOP_AUD_ENGEN2_SEL>,
+				 <&topckgen CLK_TOP_AUD_1_SEL>,
+				 <&topckgen CLK_TOP_AUD_2_SEL>,
+				 <&topckgen CLK_TOP_APLL_I2S0_SEL>,
+				 <&topckgen CLK_TOP_APLL_I2S1_SEL>,
+				 <&topckgen CLK_TOP_APLL_I2S2_SEL>,
+				 <&topckgen CLK_TOP_APLL_I2S3_SEL>;
+			clock-names = "top_clk26m_clk",
+				      "top_audio_sel",
+				      "audio_i2s0_m",
+				      "audio_i2s1_m",
+				      "audio_i2s2_m",
+				      "audio_i2s3_m",
+				      "engen1",
+				      "engen2",
+				      "aud1",
+				      "aud2",
+				      "i2s0_m_sel",
+				      "i2s1_m_sel",
+				      "i2s2_m_sel",
+				      "i2s3_m_sel";
+			interrupts = <GIC_SPI 97 IRQ_TYPE_LEVEL_LOW>;
+			power-domains = <&spm MT8365_POWER_DOMAIN_AUDIO>;
+			status = "disabled";
+		};
 	};
 
 	timer {

-- 
2.25.1



From amergnat at baylibre.com  Thu Sep  5 02:07:02 2024
From: amergnat at baylibre.com (Alexandre Mergnat)
Date: Thu, 05 Sep 2024 11:07:02 +0200
Subject: [PATCH v8 5/5] arm64: dts: mediatek: add audio support for
 mt8365-evk
In-Reply-To: <20240226-audio-i350-v8-0-e80a57d026ce@baylibre.com>
References: <20240226-audio-i350-v8-0-e80a57d026ce@baylibre.com>
Message-ID: <20240226-audio-i350-v8-5-e80a57d026ce@baylibre.com>

Add the sound node which is linked to the MT8365 SoC AFE and
the MT6357 audio codec.

Update the file header.

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
Signed-off-by: Alexandre Mergnat <amergnat at baylibre.com>
---
 arch/arm64/boot/dts/mediatek/mt8365-evk.dts | 86 +++++++++++++++++++++++++++++
 1 file changed, 86 insertions(+)

diff --git a/arch/arm64/boot/dts/mediatek/mt8365-evk.dts b/arch/arm64/boot/dts/mediatek/mt8365-evk.dts
index 4211a992dd9d..7d90112a7e27 100644
--- a/arch/arm64/boot/dts/mediatek/mt8365-evk.dts
+++ b/arch/arm64/boot/dts/mediatek/mt8365-evk.dts
@@ -4,6 +4,7 @@
  * Authors:
  * Fabien Parent <fparent at baylibre.com>
  * Bernhard Rosenkr?nzer <bero at baylibre.com>
+ * Alexandre Mergnat <amergnat at baylibre.com>
  */
 
 /dts-v1/;
@@ -86,6 +87,28 @@ optee_reserved: optee at 43200000 {
 			reg = <0 0x43200000 0 0x00c00000>;
 		};
 	};
+
+	sound: sound {
+		compatible = "mediatek,mt8365-mt6357";
+		pinctrl-names = "default",
+				"dmic",
+				"miso_off",
+				"miso_on",
+				"mosi_off",
+				"mosi_on";
+		pinctrl-0 = <&aud_default_pins>;
+		pinctrl-1 = <&aud_dmic_pins>;
+		pinctrl-2 = <&aud_miso_off_pins>;
+		pinctrl-3 = <&aud_miso_on_pins>;
+		pinctrl-4 = <&aud_mosi_off_pins>;
+		pinctrl-5 = <&aud_mosi_on_pins>;
+		mediatek,platform = <&afe>;
+	};
+};
+
+&afe {
+	mediatek,dmic-mode = <1>;
+	status = "okay";
 };
 
 &cpu0 {
@@ -178,9 +201,72 @@ &mt6357_pmic {
 	interrupts-extended = <&pio 145 IRQ_TYPE_LEVEL_HIGH>;
 	interrupt-controller;
 	#interrupt-cells = <2>;
+	mediatek,micbias0-microvolt = <1900000>;
+	mediatek,micbias1-microvolt = <1700000>;
 };
 
 &pio {
+	aud_default_pins: audiodefault-pins {
+		clk-dat-pins {
+			pinmux = <MT8365_PIN_72_CMDAT4__FUNC_I2S3_BCK>,
+				 <MT8365_PIN_73_CMDAT5__FUNC_I2S3_LRCK>,
+				 <MT8365_PIN_74_CMDAT6__FUNC_I2S3_MCK>,
+				 <MT8365_PIN_75_CMDAT7__FUNC_I2S3_DO>;
+		};
+	};
+
+	aud_dmic_pins: audiodmic-pins {
+		clk-dat-pins {
+			pinmux = <MT8365_PIN_117_DMIC0_CLK__FUNC_DMIC0_CLK>,
+				 <MT8365_PIN_118_DMIC0_DAT0__FUNC_DMIC0_DAT0>,
+				 <MT8365_PIN_119_DMIC0_DAT1__FUNC_DMIC0_DAT1>;
+		};
+	};
+
+	aud_miso_off_pins: misooff-pins {
+		clk-dat-pins {
+			pinmux = <MT8365_PIN_53_AUD_CLK_MISO__FUNC_GPIO53>,
+				 <MT8365_PIN_54_AUD_SYNC_MISO__FUNC_GPIO54>,
+				 <MT8365_PIN_55_AUD_DAT_MISO0__FUNC_GPIO55>,
+				 <MT8365_PIN_56_AUD_DAT_MISO1__FUNC_GPIO56>;
+			input-enable;
+			bias-pull-down;
+			drive-strength = <2>;
+		};
+	};
+
+	aud_miso_on_pins: misoon-pins {
+		clk-dat-pins {
+			pinmux = <MT8365_PIN_53_AUD_CLK_MISO__FUNC_AUD_CLK_MISO>,
+				 <MT8365_PIN_54_AUD_SYNC_MISO__FUNC_AUD_SYNC_MISO>,
+				 <MT8365_PIN_55_AUD_DAT_MISO0__FUNC_AUD_DAT_MISO0>,
+				 <MT8365_PIN_56_AUD_DAT_MISO1__FUNC_AUD_DAT_MISO1>;
+			drive-strength = <6>;
+		};
+	};
+
+	aud_mosi_off_pins: mosioff-pins {
+		clk-dat-pins {
+			pinmux = <MT8365_PIN_49_AUD_CLK_MOSI__FUNC_GPIO49>,
+				 <MT8365_PIN_50_AUD_SYNC_MOSI__FUNC_GPIO50>,
+				 <MT8365_PIN_51_AUD_DAT_MOSI0__FUNC_GPIO51>,
+				 <MT8365_PIN_52_AUD_DAT_MOSI1__FUNC_GPIO52>;
+			input-enable;
+			bias-pull-down;
+			drive-strength = <2>;
+		};
+	};
+
+	aud_mosi_on_pins: mosion-pins {
+		clk-dat-pins {
+			pinmux = <MT8365_PIN_49_AUD_CLK_MOSI__FUNC_AUD_CLK_MOSI>,
+				 <MT8365_PIN_50_AUD_SYNC_MOSI__FUNC_AUD_SYNC_MOSI>,
+				 <MT8365_PIN_51_AUD_DAT_MOSI0__FUNC_AUD_DAT_MOSI0>,
+				 <MT8365_PIN_52_AUD_DAT_MOSI1__FUNC_AUD_DAT_MOSI1>;
+			drive-strength = <6>;
+		};
+	};
+
 	ethernet_pins: ethernet-pins {
 		phy_reset_pins {
 			pinmux = <MT8365_PIN_133_TDM_TX_DATA1__FUNC_GPIO133>;

-- 
2.25.1



From u.kleine-koenig at baylibre.com  Thu Sep  5 02:30:40 2024
From: u.kleine-koenig at baylibre.com (Uwe =?utf-8?Q?Kleine-K=C3=B6nig?=)
Date: Thu, 5 Sep 2024 11:30:40 +0200
Subject: [PATCH v3 5/5] pwm: airoha: Add support for EN7581 SoC
In-Reply-To: <b7e44fb2-6cf6-4530-a271-9e1730d4f431@genexis.eu>
References: <20240831-en7581-pinctrl-v3-0-98eebfb4da66@kernel.org>
 <20240831-en7581-pinctrl-v3-5-98eebfb4da66@kernel.org>
 <yfqmlca6cnhrghpo5s6tml36tngmekcfbyjakxs7or7wtap3ka@7qlrxjowo4ou>
 <d9298199-fe10-4b28-8e28-dc252bd6832c@genexis.eu>
 <t2f5kockuvfi66qqumda6jxf5a4c4zf35ld5ainsnksavkchyj@kdueaqlhjoar>
 <b7e44fb2-6cf6-4530-a271-9e1730d4f431@genexis.eu>
Message-ID: <xmlta4za6malgthd6cmt5fcipxgyzwmqwxqdg5e4qahcuqzcrt@eidsf6mexrkz>

Hello,

On Thu, Sep 05, 2024 at 01:09:48AM +0200, Benjamin Larsson wrote:
> On 03/09/2024 17:47, Uwe Kleine-K?nig wrote:
> > Hello Benjamin,
> > 
> > On Tue, Sep 03, 2024 at 01:58:30PM +0200, Benjamin Larsson wrote:
> > > On 2024-09-03 12:46, Uwe Kleine-K?nig wrote:
> > > > Would you please add a "Limitations" paragraph here covering the
> > > > following questions:
> > > > 
> > > >    - How does the hardware behave on changes of configuration (does it
> > > >      complete the currently running period? Are there any glitches?)
> > > >    - How does the hardware behave on disabling?
> > > > 
> > > > Please stick to the format used in several other drivers such that
> > > > 
> > > > 	sed -rn '/Limitations:/,/\*\/?$/p' drivers/pwm/*.c
> > > > 
> > > > emits the informations.
> > > The answer to your questions are currently unknown. Is this information
> > > needed for a merge of the driver ?
> > It would be very welcome and typically isn't that hard to work out if
> > you have an LED connected to the output or a similar means to observe
> > the output. An oscilloscope makes it still easier.
> > 
> > For example to check if the current period is completed configure the
> > PWM with period = 1s and duty_cycle = 0 disabling the LED. (I leave it
> > as an exercise for the reader what to do if duty_cycle = 0 enables the
> > LED :-) Then do:
> > 
> > 	pwm_apply_might_sleep(mypwm, &(struct pwm_state){
> > 		.period = NSEC_PER_SEC,
> > 		.duty_cycle = NSEC_PER_SEC,
> > 		.enabled = true,
> > 	});
> > 	pwm_apply_might_sleep(mypwm, &(struct pwm_state){
> > 		.period = NSEC_PER_SEC,
> > 		.duty_cycle = 0,
> > 		.enabled = true,
> > 	});
> > 
> > Iff that enables the LED for a second, the period is completed. The
> > question about glitches is a bit harder to answer, but with a tool like
> > memtool should be possible to answer. Alternatively add delays and
> > printk output to .apply() in the critical places.
> > 
> > 
> 
> I connected a logic analyzer to a pin and configured the pwm for it.
> 
> I then configured the pwm with these parameters (setup for 2Hz).
> 
> echo 1000000000 > /sys/class/pwm/pwmchip0/pwm12/period
> echo 0 > /sys/class/pwm/pwmchip0/pwm12/duty_cycle
> 
> If I then ran the following (in a script) no pulse was detected:
> 
> echo 500000000 > /sys/class/pwm/pwmchip0/pwm12/duty_cycle
> echo 0 > /sys/class/pwm/pwmchip0/pwm12/duty_cycle
> 
> If I added a sleep 1 in between I always got 1 500ms pulse.
> 
> I then did the same but with direct register access with the same result.
> Setting the duty cycle to 0 disables the pwm function on the pin, it seems
> to take a while before it properly activates but before it disables it the
> cycle completes.
> 
> 
> I also tested with enabling the pwn signal and then setting a 0 duty cycle.
> The last observed pulse was always 500ms long.
> 
> 
> I am not sure what of your questions this answers and is there some other
> tests I should perform ?

IIUC that means to add:

	On configuration the currently running period is completed.

to the Limitations paragraph.

> For the record while toggling the registers I noticed that it was actually
> possible to generate 1 second long pulses. The documentation is not clear on
> this part.

1 second long pulses with a period size of 1 second, so a constant high
signal?

Another thing that would be interesting is, if it can happen that you
get a mixed signal. That is, if you update from 

	.period = A
	.duty_cycle = B

to

	.period = C
	.duty_cycle = D

that you get one period with length C and duty_cycle B when the period
completes after configuring period but before duty_cycle.

Best regards
UWe
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-mediatek/attachments/20240905/8226abbc/attachment.sig>

From yenchia.chen at mediatek.com  Thu Sep  5 02:34:33 2024
From: yenchia.chen at mediatek.com (Yenchia Chen)
Date: Thu, 5 Sep 2024 17:34:33 +0800
Subject: [PATCH 6.6 1/1] PM: sleep: Restore asynchronous device resume optimization
In-Reply-To: <2024090420-protozoan-clench-cca7@gregkh>
References: <2024090420-protozoan-clench-cca7@gregkh>
Message-ID: <20240905093433.4798-1-yenchia.chen@mediatek.com>

>> From: "Rafael J. Wysocki" <rafael.j.wysocki at intel.com>
>> 
>> commit 3e999770ac1c7c31a70685dd5b88e89473509e9c upstream.
>> 
>> Before commit 7839d0078e0d ("PM: sleep: Fix possible deadlocks in core
>> system-wide PM code"), the resume of devices that were allowed to resume
>> asynchronously was scheduled before starting the resume of the other
>> devices, so the former did not have to wait for the latter unless
>> functional dependencies were present.
>> 
>> Commit 7839d0078e0d removed that optimization in order to address a
>> correctness issue, but it can be restored with the help of a new device
>> power management flag, so do that now.
>> 
>> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki at intel.com>
>> Reviewed-by: Stanislaw Gruszka <stanislaw.gruszka at linux.intel.com>
>> Signed-off-by: Yenchia Chen <yenchia.chen at mediatek.com>
>> ---
>>  drivers/base/power/main.c | 117 +++++++++++++++++++++-----------------
>>  include/linux/pm.h        |   1 +
>>  2 files changed, 65 insertions(+), 53 deletions(-)

>Why does this need to be backported?  What bug is it fixing?

>confused,

>greg k-h

Below is the scenario we met the issue:
1) use command 'echo 3 > /proc/sys/vm/drop_caches'
   and enter suspending stage immediately.
2) power on device, our driver try to read mmc after leaving resume callback
   and got stucked.

We found if we did not drop caches, mmc_blk_resume will be called and
system works fine.

If we drop caches before suspending, there is a high possibility that
mmc_blk_resume not be called and our driver stucked at filp_open.

We still try to find the root casue is but with this patch, it works.

Since it has been merged in mainline, we'd like to know it is ok to merge to stable.



From gregkh at linuxfoundation.org  Thu Sep  5 02:38:34 2024
From: gregkh at linuxfoundation.org (Greg KH)
Date: Thu, 5 Sep 2024 11:38:34 +0200
Subject: [PATCH 6.6 1/1] PM: sleep: Restore asynchronous device resume
 optimization
In-Reply-To: <20240905093433.4798-1-yenchia.chen@mediatek.com>
References: <2024090420-protozoan-clench-cca7@gregkh>
 <20240905093433.4798-1-yenchia.chen@mediatek.com>
Message-ID: <2024090534-footage-player-10e5@gregkh>

On Thu, Sep 05, 2024 at 05:34:33PM +0800, Yenchia Chen wrote:
> >> From: "Rafael J. Wysocki" <rafael.j.wysocki at intel.com>
> >> 
> >> commit 3e999770ac1c7c31a70685dd5b88e89473509e9c upstream.
> >> 
> >> Before commit 7839d0078e0d ("PM: sleep: Fix possible deadlocks in core
> >> system-wide PM code"), the resume of devices that were allowed to resume
> >> asynchronously was scheduled before starting the resume of the other
> >> devices, so the former did not have to wait for the latter unless
> >> functional dependencies were present.
> >> 
> >> Commit 7839d0078e0d removed that optimization in order to address a
> >> correctness issue, but it can be restored with the help of a new device
> >> power management flag, so do that now.
> >> 
> >> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki at intel.com>
> >> Reviewed-by: Stanislaw Gruszka <stanislaw.gruszka at linux.intel.com>
> >> Signed-off-by: Yenchia Chen <yenchia.chen at mediatek.com>
> >> ---
> >>  drivers/base/power/main.c | 117 +++++++++++++++++++++-----------------
> >>  include/linux/pm.h        |   1 +
> >>  2 files changed, 65 insertions(+), 53 deletions(-)
> 
> >Why does this need to be backported?  What bug is it fixing?
> 
> >confused,
> 
> >greg k-h
> 
> Below is the scenario we met the issue:
> 1) use command 'echo 3 > /proc/sys/vm/drop_caches'
>    and enter suspending stage immediately.
> 2) power on device, our driver try to read mmc after leaving resume callback
>    and got stucked.
> 
> We found if we did not drop caches, mmc_blk_resume will be called and
> system works fine.
> 
> If we drop caches before suspending, there is a high possibility that
> mmc_blk_resume not be called and our driver stucked at filp_open.
> 
> We still try to find the root casue is but with this patch, it works.

I think you are getting lucky as this is just changing the order in
which things are suspending.  Please find and fix the root problem.

> Since it has been merged in mainline, we'd like to know it is ok to merge to stable.

It changes the behavior of the system overall, and doesn't really fix a
bug on its own, so I don't want to, sorry.

Please find the real problem in your driver, or the mmc subsystem.

thanks,

greg k-h


From vignesh.raman at collabora.com  Thu Sep  5 02:39:32 2024
From: vignesh.raman at collabora.com (Vignesh Raman)
Date: Thu,  5 Sep 2024 15:09:32 +0530
Subject: [PATCH v1] drm/ci: uprev IGT and deqp-runner
Message-ID: <20240905093935.2780632-1-vignesh.raman@collabora.com>

Uprev IGT to the latest version and deqp-runner
to v0.20.0. Also update expectation files.

Signed-off-by: Vignesh Raman <vignesh.raman at collabora.com>
---

v1:
- Flaky test report will be sent to maintainers after this
  patch series is reviewed.

---
 drivers/gpu/drm/ci/gitlab-ci.yml              |  4 +-
 drivers/gpu/drm/ci/image-tags.yml             |  2 +-
 .../gpu/drm/ci/xfails/amdgpu-stoney-fails.txt |  2 +-
 .../drm/ci/xfails/amdgpu-stoney-flakes.txt    |  7 +++
 drivers/gpu/drm/ci/xfails/i915-amly-fails.txt |  2 +-
 .../gpu/drm/ci/xfails/i915-amly-flakes.txt    |  7 +++
 drivers/gpu/drm/ci/xfails/i915-apl-fails.txt  |  1 -
 drivers/gpu/drm/ci/xfails/i915-apl-flakes.txt |  7 +++
 drivers/gpu/drm/ci/xfails/i915-cml-fails.txt  | 10 +---
 drivers/gpu/drm/ci/xfails/i915-cml-flakes.txt | 14 +++++
 drivers/gpu/drm/ci/xfails/i915-glk-fails.txt  |  1 +
 drivers/gpu/drm/ci/xfails/i915-kbl-fails.txt  |  2 -
 drivers/gpu/drm/ci/xfails/i915-tgl-fails.txt  | 34 +++++++++--
 drivers/gpu/drm/ci/xfails/i915-whl-fails.txt  |  9 ++-
 .../drm/ci/xfails/mediatek-mt8173-fails.txt   | 11 +---
 .../drm/ci/xfails/mediatek-mt8183-fails.txt   |  6 --
 .../gpu/drm/ci/xfails/meson-g12b-fails.txt    |  1 -
 .../gpu/drm/ci/xfails/msm-apq8016-fails.txt   |  5 --
 .../gpu/drm/ci/xfails/msm-apq8096-fails.txt   |  5 --
 .../msm-sc7180-trogdor-kingoftown-fails.txt   | 27 ---------
 .../msm-sc7180-trogdor-kingoftown-skips.txt   | 60 +++++++++++++++++++
 ...sm-sc7180-trogdor-lazor-limozeen-fails.txt | 27 ---------
 .../gpu/drm/ci/xfails/msm-sdm845-fails.txt    |  7 +--
 .../gpu/drm/ci/xfails/msm-sdm845-flakes.txt   |  7 +++
 .../drm/ci/xfails/rockchip-rk3288-fails.txt   | 22 ++++---
 .../drm/ci/xfails/rockchip-rk3288-flakes.txt  | 28 +++++++++
 .../drm/ci/xfails/rockchip-rk3399-fails.txt   |  5 --
 .../drm/ci/xfails/rockchip-rk3399-flakes.txt  |  7 +++
 drivers/gpu/drm/ci/xfails/vkms-none-fails.txt | 21 -------
 29 files changed, 196 insertions(+), 145 deletions(-)

diff --git a/drivers/gpu/drm/ci/gitlab-ci.yml b/drivers/gpu/drm/ci/gitlab-ci.yml
index eca47d4f816f..eba5aad4a012 100644
--- a/drivers/gpu/drm/ci/gitlab-ci.yml
+++ b/drivers/gpu/drm/ci/gitlab-ci.yml
@@ -5,10 +5,10 @@ variables:
   UPSTREAM_REPO: https://gitlab.freedesktop.org/drm/kernel.git
   TARGET_BRANCH: drm-next
 
-  IGT_VERSION: f13702b8e4e847c56da3ef6f0969065d686049c5
+  IGT_VERSION: a73311079a5d8ac99eb25336a8369a2c3c6b519b
 
   DEQP_RUNNER_GIT_URL: https://gitlab.freedesktop.org/mesa/deqp-runner.git
-  DEQP_RUNNER_GIT_TAG: v0.15.0
+  DEQP_RUNNER_GIT_TAG: v0.20.0
 
   FDO_UPSTREAM_REPO: helen.fornazier/linux   # The repo where the git-archive daily runs
   MESA_TEMPLATES_COMMIT: &ci-templates-commit d5aa3941aa03c2f716595116354fb81eb8012acb
diff --git a/drivers/gpu/drm/ci/image-tags.yml b/drivers/gpu/drm/ci/image-tags.yml
index 2c340d063a96..4825a5cf813b 100644
--- a/drivers/gpu/drm/ci/image-tags.yml
+++ b/drivers/gpu/drm/ci/image-tags.yml
@@ -1,5 +1,5 @@
 variables:
-   CONTAINER_TAG: "2024-08-07-mesa-uprev"
+   CONTAINER_TAG: "2024-09-04-igt-deqp"
    DEBIAN_X86_64_BUILD_BASE_IMAGE: "debian/x86_64_build-base"
    DEBIAN_BASE_TAG: "${CONTAINER_TAG}"
 
diff --git a/drivers/gpu/drm/ci/xfails/amdgpu-stoney-fails.txt b/drivers/gpu/drm/ci/xfails/amdgpu-stoney-fails.txt
index 8e2fed6d76a3..f44dbce3151a 100644
--- a/drivers/gpu/drm/ci/xfails/amdgpu-stoney-fails.txt
+++ b/drivers/gpu/drm/ci/xfails/amdgpu-stoney-fails.txt
@@ -2,6 +2,7 @@ amdgpu/amd_abm at abm_enabled,Fail
 amdgpu/amd_abm at abm_gradual,Fail
 amdgpu/amd_abm at backlight_monotonic_abm,Fail
 amdgpu/amd_abm at backlight_monotonic_basic,Fail
+amdgpu/amd_abm at dpms_cycle,Fail
 amdgpu/amd_assr at assr-links,Fail
 amdgpu/amd_assr at assr-links-dpms,Fail
 amdgpu/amd_mall at static-screen,Crash
@@ -14,7 +15,6 @@ amdgpu/amd_plane at mpo-scale-p010,Fail
 amdgpu/amd_plane at mpo-scale-rgb,Crash
 amdgpu/amd_plane at mpo-swizzle-toggle,Fail
 amdgpu/amd_uvd_dec at amdgpu_uvd_decode,Fail
-dumb_buffer at invalid-bpp,Fail
 kms_addfb_basic at bad-pitch-65536,Fail
 kms_addfb_basic at bo-too-small,Fail
 kms_addfb_basic at too-high,Fail
diff --git a/drivers/gpu/drm/ci/xfails/amdgpu-stoney-flakes.txt b/drivers/gpu/drm/ci/xfails/amdgpu-stoney-flakes.txt
index e4faa96fa000..bcd4e320b1ea 100644
--- a/drivers/gpu/drm/ci/xfails/amdgpu-stoney-flakes.txt
+++ b/drivers/gpu/drm/ci/xfails/amdgpu-stoney-flakes.txt
@@ -18,3 +18,10 @@ kms_async_flips at crc
 # IGT Version: 1.28-g0df7b9b97
 # Linux Version: 6.9.0-rc7
 kms_plane at pixel-format-source-clamping
+
+# Board Name: hp-11A-G6-EE-grunt
+# Bug Report:
+# Failure Rate: 100
+# IGT Version: 1.28-ga73311079
+# Linux Version: 6.11.0-rc2
+kms_async_flips at async-flip-with-page-flip-events
diff --git a/drivers/gpu/drm/ci/xfails/i915-amly-fails.txt b/drivers/gpu/drm/ci/xfails/i915-amly-fails.txt
index 9b84f68a5122..0907cb0f6d9e 100644
--- a/drivers/gpu/drm/ci/xfails/i915-amly-fails.txt
+++ b/drivers/gpu/drm/ci/xfails/i915-amly-fails.txt
@@ -1,3 +1,4 @@
+core_setmaster at master-drop-set-shared-fd,Fail
 core_setmaster at master-drop-set-user,Fail
 core_setmaster_vs_auth,Fail
 i915_module_load at load,Fail
@@ -6,7 +7,6 @@ i915_module_load at reload-no-display,Fail
 i915_module_load at resize-bar,Fail
 i915_pm_rpm at gem-execbuf-stress,Timeout
 i915_pm_rpm at module-reload,Fail
-kms_ccs at crc-primary-rotation-180-yf-tiled-ccs,Timeout
 kms_cursor_legacy at short-flip-before-cursor-atomic-transitions,Timeout
 kms_fb_coherency at memset-crc,Crash
 kms_flip at busy-flip,Timeout
diff --git a/drivers/gpu/drm/ci/xfails/i915-amly-flakes.txt b/drivers/gpu/drm/ci/xfails/i915-amly-flakes.txt
index 581f0da4d0f2..e4a202630eba 100644
--- a/drivers/gpu/drm/ci/xfails/i915-amly-flakes.txt
+++ b/drivers/gpu/drm/ci/xfails/i915-amly-flakes.txt
@@ -46,3 +46,10 @@ i915_hangman at engine-engine-hang
 # IGT Version: 1.28-gf13702b8e
 # Linux Version: 6.10.0-rc5
 kms_pm_rpm at modeset-lpsp-stress
+
+# Board Name: asus-C433TA-AJ0005-rammus
+# Bug Report:
+# Failure Rate: 50
+# IGT Version: 1.28-ga73311079
+# Linux Version: 6.11.0-rc2
+kms_pm_rpm at drm-resources-equal
diff --git a/drivers/gpu/drm/ci/xfails/i915-apl-fails.txt b/drivers/gpu/drm/ci/xfails/i915-apl-fails.txt
index e612281149aa..64772fedaed5 100644
--- a/drivers/gpu/drm/ci/xfails/i915-apl-fails.txt
+++ b/drivers/gpu/drm/ci/xfails/i915-apl-fails.txt
@@ -8,7 +8,6 @@ kms_flip_scaled_crc at flip-32bpp-xtile-to-64bpp-xtile-downscaling,Fail
 kms_flip_scaled_crc at flip-32bpp-xtile-to-64bpp-xtile-upscaling,Fail
 kms_flip_scaled_crc at flip-32bpp-ytile-to-64bpp-ytile-downscaling,Fail
 kms_flip_scaled_crc at flip-32bpp-ytile-to-64bpp-ytile-upscaling,Fail
-kms_flip_scaled_crc at flip-32bpp-ytileccs-to-64bpp-ytile-downscaling,Fail
 kms_flip_scaled_crc at flip-32bpp-ytileccs-to-64bpp-ytile-upscaling,Fail
 kms_flip_scaled_crc at flip-64bpp-linear-to-16bpp-linear-downscaling,Fail
 kms_flip_scaled_crc at flip-64bpp-linear-to-16bpp-linear-upscaling,Fail
diff --git a/drivers/gpu/drm/ci/xfails/i915-apl-flakes.txt b/drivers/gpu/drm/ci/xfails/i915-apl-flakes.txt
index 4663d4d13f35..91685b3401be 100644
--- a/drivers/gpu/drm/ci/xfails/i915-apl-flakes.txt
+++ b/drivers/gpu/drm/ci/xfails/i915-apl-flakes.txt
@@ -4,3 +4,10 @@
 # IGT Version: 1.28-g0df7b9b97
 # Linux Version: 6.9.0-rc7
 kms_fb_coherency at memset-crc
+
+# Board Name: asus-C523NA-A20057-coral
+# Bug Report:
+# Failure Rate: 100
+# IGT Version: 1.28-ga73311079
+# Linux Version: 6.11.0-rc2
+kms_universal_plane at cursor-fb-leak
diff --git a/drivers/gpu/drm/ci/xfails/i915-cml-fails.txt b/drivers/gpu/drm/ci/xfails/i915-cml-fails.txt
index 2723e2832797..f352b719cf7d 100644
--- a/drivers/gpu/drm/ci/xfails/i915-cml-fails.txt
+++ b/drivers/gpu/drm/ci/xfails/i915-cml-fails.txt
@@ -1,5 +1,5 @@
+core_setmaster at master-drop-set-shared-fd,Fail
 core_setmaster at master-drop-set-user,Fail
-core_setmaster_vs_auth,Fail
 i915_module_load at load,Fail
 i915_module_load at reload,Fail
 i915_module_load at reload-no-display,Fail
@@ -9,10 +9,10 @@ i915_pipe_stress at stress-xrgb8888-ytiled,Fail
 i915_pm_rpm at gem-execbuf-stress,Timeout
 i915_pm_rpm at module-reload,Fail
 i915_pm_rpm at system-suspend-execbuf,Timeout
-kms_ccs at crc-primary-rotation-180-yf-tiled-ccs,Timeout
+i915_pm_rps at engine-order,Fail
+kms_big_fb at linear-16bpp-rotate-180,Timeout
 kms_fb_coherency at memset-crc,Crash
 kms_flip at busy-flip,Timeout
-kms_flip at single-buffer-flip-vs-dpms-off-vs-modeset-interruptible,Fail
 kms_flip_scaled_crc at flip-32bpp-linear-to-64bpp-linear-downscaling,Fail
 kms_flip_scaled_crc at flip-32bpp-linear-to-64bpp-linear-upscaling,Fail
 kms_flip_scaled_crc at flip-32bpp-xtile-to-64bpp-xtile-downscaling,Fail
@@ -40,14 +40,11 @@ kms_plane_alpha_blend at alpha-basic,Fail
 kms_plane_alpha_blend at alpha-opaque-fb,Fail
 kms_plane_alpha_blend at alpha-transparent-fb,Fail
 kms_plane_alpha_blend at constant-alpha-max,Fail
-kms_plane_scaling at plane-scaler-with-clipping-clamping-rotation,Timeout
 kms_plane_scaling at planes-upscale-factor-0-25-downscale-factor-0-5,Timeout
 kms_pm_rpm at modeset-stress-extra-wait,Timeout
 kms_pm_rpm at universal-planes,Timeout
 kms_pm_rpm at universal-planes-dpms,Timeout
-kms_prop_blob at invalid-set-prop,Fail
 kms_psr2_sf at cursor-plane-update-sf,Fail
-kms_psr2_sf at fbc-plane-move-sf-dmg-area,Timeout
 kms_psr2_sf at overlay-plane-update-continuous-sf,Fail
 kms_psr2_sf at overlay-plane-update-sf-dmg-area,Fail
 kms_psr2_sf at overlay-primary-update-sf-dmg-area,Fail
@@ -55,7 +52,6 @@ kms_psr2_sf at plane-move-sf-dmg-area,Fail
 kms_psr2_sf at primary-plane-update-sf-dmg-area,Fail
 kms_psr2_sf at primary-plane-update-sf-dmg-area-big-fb,Fail
 kms_psr2_su at page_flip-NV12,Fail
-kms_psr2_su at page_flip-P010,Fail
 kms_rotation_crc at primary-rotation-180,Timeout
 kms_setmode at basic,Fail
 kms_vblank at query-forked-hang,Timeout
diff --git a/drivers/gpu/drm/ci/xfails/i915-cml-flakes.txt b/drivers/gpu/drm/ci/xfails/i915-cml-flakes.txt
index 58a6001abb28..9dac2b898f34 100644
--- a/drivers/gpu/drm/ci/xfails/i915-cml-flakes.txt
+++ b/drivers/gpu/drm/ci/xfails/i915-cml-flakes.txt
@@ -11,3 +11,17 @@ kms_plane_alpha_blend at constant-alpha-min
 # IGT Version: 1.28-gf13702b8e
 # Linux Version: 6.10.0-rc5
 kms_atomic_transition at plane-all-modeset-transition-internal-panels
+
+# Board Name: asus-C436FA-Flip-hatch
+# Bug Report:
+# Failure Rate: 100
+# IGT Version: 1.28-ga73311079
+# Linux Version: 6.11.0-rc2
+kms_plane_alpha_blend at constant-alpha-min
+
+# Board Name: asus-C436FA-Flip-hatch
+# Bug Report:
+# Failure Rate: 50
+# IGT Version: 1.28-ga73311079
+# Linux Version: 6.11.0-rc2
+kms_async_flips at crc
diff --git a/drivers/gpu/drm/ci/xfails/i915-glk-fails.txt b/drivers/gpu/drm/ci/xfails/i915-glk-fails.txt
index 4821c9adefd1..6eb64c672f7d 100644
--- a/drivers/gpu/drm/ci/xfails/i915-glk-fails.txt
+++ b/drivers/gpu/drm/ci/xfails/i915-glk-fails.txt
@@ -63,3 +63,4 @@ xe_module_load at load,Fail
 xe_module_load at many-reload,Fail
 xe_module_load at reload,Fail
 xe_module_load at reload-no-display,Fail
+core_setmaster at master-drop-set-shared-fd,Fail
diff --git a/drivers/gpu/drm/ci/xfails/i915-kbl-fails.txt b/drivers/gpu/drm/ci/xfails/i915-kbl-fails.txt
index 1de04a3308c4..d4fba4f55ec1 100644
--- a/drivers/gpu/drm/ci/xfails/i915-kbl-fails.txt
+++ b/drivers/gpu/drm/ci/xfails/i915-kbl-fails.txt
@@ -17,12 +17,10 @@ perf at i915-ref-count,Fail
 perf_pmu at busy-accuracy-50,Fail
 perf_pmu at module-unload,Fail
 perf_pmu at rc6,Crash
-prime_busy at after,Fail
 sysfs_heartbeat_interval at long,Timeout
 sysfs_heartbeat_interval at off,Timeout
 sysfs_preempt_timeout at off,Timeout
 sysfs_timeslice_duration at off,Timeout
-testdisplay,Timeout
 xe_module_load at force-load,Fail
 xe_module_load at load,Fail
 xe_module_load at many-reload,Fail
diff --git a/drivers/gpu/drm/ci/xfails/i915-tgl-fails.txt b/drivers/gpu/drm/ci/xfails/i915-tgl-fails.txt
index e728ccc62326..461ef69ef08a 100644
--- a/drivers/gpu/drm/ci/xfails/i915-tgl-fails.txt
+++ b/drivers/gpu/drm/ci/xfails/i915-tgl-fails.txt
@@ -1,40 +1,64 @@
+api_intel_allocator at fork-simple-stress-signal,Timeout
+api_intel_allocator at open-vm,Timeout
 api_intel_allocator at simple-allocator,Timeout
+api_intel_bb at lot-of-buffers,Timeout
 api_intel_bb at object-reloc-keep-cache,Timeout
 api_intel_bb at offset-control,Timeout
-core_auth at getclient-simple,Timeout
-core_hotunplug at hotunbind-rebind,Timeout
+api_intel_bb at render-ccs,Timeout
+api_intel_bb at reset-bb,Timeout
+core_auth at basic-auth,Timeout
+core_hotunplug at hotrebind,Timeout
+core_setmaster at master-drop-set-user,Fail
 debugfs_test at read_all_entries_display_on,Timeout
-drm_read at invalid-buffer,Timeout
-drm_read at short-buffer-nonblock,Timeout
+drm_read at empty-block,Timeout
+dumb_buffer at create-clear,Timeout
+dumb_buffer at invalid-bpp,Timeout
 gen3_render_tiledx_blits,Timeout
 gen7_exec_parse at basic-allocation,Timeout
-gen7_exec_parse at batch-without-end,Timeout
 gen9_exec_parse at batch-invalid-length,Timeout
 gen9_exec_parse at bb-secure,Timeout
 gen9_exec_parse at secure-batches,Timeout
 gen9_exec_parse at shadow-peek,Timeout
 gen9_exec_parse at unaligned-jump,Timeout
+i915_getparams_basic at basic-subslice-total,Timeout
+i915_hangman at gt-engine-hang,Timeout
 i915_module_load at load,Fail
 i915_module_load at reload,Fail
 i915_module_load at reload-no-display,Fail
 i915_module_load at resize-bar,Fail
+i915_pciid,Timeout
+i915_pipe_stress at stress-xrgb8888-ytiled,Timeout
+i915_pm_rpm at gem-execbuf-stress,Timeout
+i915_pm_rps at engine-order,Timeout
+i915_pm_rps at thresholds-idle-park,Timeout
 i915_query at engine-info,Timeout
 i915_query at query-topology-kernel-writes,Timeout
 i915_query at test-query-geometry-subslices,Timeout
 kms_lease at lease-uevent,Fail
 kms_rotation_crc at multiplane-rotation,Fail
 perf at i915-ref-count,Fail
+perf_pmu at busy,Timeout
 perf_pmu at enable-race,Timeout
 perf_pmu at event-wait,Timeout
+perf_pmu at faulting-read,Timeout
 perf_pmu at gt-awake,Timeout
 perf_pmu at interrupts,Timeout
 perf_pmu at module-unload,Fail
+perf_pmu at most-busy-idle-check-all,Timeout
 perf_pmu at rc6,Crash
+perf_pmu at render-node-busy-idle,Fail
+perf_pmu at semaphore-wait-idle,Timeout
+prime_busy at after,Timeout
+prime_mmap at test_aperture_limit,Timeout
 prime_mmap at test_map_unmap,Timeout
 prime_mmap at test_refcounting,Timeout
 prime_self_import at basic-with_one_bo,Timeout
+sriov_basic at enable-vfs-autoprobe-off,Timeout
+syncobj_basic at bad-destroy,Timeout
 syncobj_basic at bad-flags-fd-to-handle,Timeout
+syncobj_basic at create-signaled,Timeout
 syncobj_eventfd at invalid-bad-pad,Timeout
+syncobj_eventfd at timeline-wait-before-signal,Timeout
 syncobj_wait at invalid-multi-wait-unsubmitted-signaled,Timeout
 syncobj_wait at invalid-signal-illegal-handle,Timeout
 syncobj_wait at invalid-single-wait-all-unsubmitted,Timeout
diff --git a/drivers/gpu/drm/ci/xfails/i915-whl-fails.txt b/drivers/gpu/drm/ci/xfails/i915-whl-fails.txt
index 2adae2175501..0ce240e3aa07 100644
--- a/drivers/gpu/drm/ci/xfails/i915-whl-fails.txt
+++ b/drivers/gpu/drm/ci/xfails/i915-whl-fails.txt
@@ -1,5 +1,5 @@
+core_setmaster at master-drop-set-shared-fd,Fail
 core_setmaster at master-drop-set-user,Fail
-core_setmaster_vs_auth,Fail
 i915_module_load at load,Fail
 i915_module_load at reload,Fail
 i915_module_load at reload-no-display,Fail
@@ -7,7 +7,8 @@ i915_module_load at resize-bar,Fail
 i915_pm_rpm at gem-execbuf-stress,Timeout
 i915_pm_rpm at module-reload,Fail
 i915_pm_rpm at system-suspend-execbuf,Timeout
-kms_ccs at crc-primary-rotation-180-yf-tiled-ccs,Timeout
+i915_pm_rps at engine-order,Fail
+kms_big_fb at linear-16bpp-rotate-180,Timeout
 kms_cursor_legacy at short-flip-before-cursor-atomic-transitions,Timeout
 kms_dirtyfb at default-dirtyfb-ioctl,Fail
 kms_dirtyfb at fbc-dirtyfb-ioctl,Fail
@@ -32,19 +33,17 @@ kms_flip_scaled_crc at flip-64bpp-ytile-to-32bpp-ytile-downscaling,Fail
 kms_flip_scaled_crc at flip-64bpp-ytile-to-32bpp-ytile-upscaling,Fail
 kms_flip_scaled_crc at flip-64bpp-ytile-to-32bpp-ytilegen12rcccs-upscaling,Fail
 kms_flip_scaled_crc at flip-64bpp-ytile-to-32bpp-ytilercccs-downscaling,Fail
-kms_frontbuffer_tracking at fbc-rgb565-draw-mmap-cpu,Timeout
 kms_frontbuffer_tracking at fbc-tiling-linear,Fail
+kms_frontbuffer_tracking at fbc-1p-indfb-fliptrack-mmap-gtt,Timeout
 kms_lease at lease-uevent,Fail
 kms_plane_alpha_blend at alpha-basic,Fail
 kms_plane_alpha_blend at alpha-opaque-fb,Fail
 kms_plane_alpha_blend at alpha-transparent-fb,Fail
 kms_plane_alpha_blend at constant-alpha-max,Fail
-kms_plane_scaling at plane-scaler-with-clipping-clamping-rotation,Timeout
 kms_plane_scaling at planes-upscale-factor-0-25-downscale-factor-0-5,Timeout
 kms_pm_rpm at modeset-stress-extra-wait,Timeout
 kms_pm_rpm at universal-planes,Timeout
 kms_pm_rpm at universal-planes-dpms,Timeout
-kms_prop_blob at invalid-set-prop,Fail
 kms_rotation_crc at primary-rotation-180,Timeout
 kms_vblank at query-forked-hang,Timeout
 perf at i915-ref-count,Fail
diff --git a/drivers/gpu/drm/ci/xfails/mediatek-mt8173-fails.txt b/drivers/gpu/drm/ci/xfails/mediatek-mt8173-fails.txt
index a14349a1967f..8e0efc80d510 100644
--- a/drivers/gpu/drm/ci/xfails/mediatek-mt8173-fails.txt
+++ b/drivers/gpu/drm/ci/xfails/mediatek-mt8173-fails.txt
@@ -1,8 +1,3 @@
-device_reset at cold-reset-bound,Fail
-device_reset at reset-bound,Fail
-device_reset at unbind-cold-reset-rebind,Fail
-device_reset at unbind-reset-rebind,Fail
-dumb_buffer at invalid-bpp,Fail
 fbdev at eof,Fail
 fbdev at read,Fail
 kms_3d,Fail
@@ -27,10 +22,6 @@ kms_cursor_legacy at cursor-vs-flip-atomic,Fail
 kms_cursor_legacy at cursor-vs-flip-legacy,Fail
 kms_flip at flip-vs-modeset-vs-hang,Fail
 kms_flip at flip-vs-panning-vs-hang,Fail
-kms_flip at flip-vs-suspend,Fail
-kms_flip at flip-vs-suspend-interruptible,Fail
 kms_lease at lease-uevent,Fail
-kms_properties at get_properties-sanity-atomic,Fail
-kms_properties at plane-properties-atomic,Fail
-kms_properties at plane-properties-legacy,Fail
 kms_rmfb at close-fd,Fail
+kms_flip at flip-vs-suspend-interruptible,Fail
diff --git a/drivers/gpu/drm/ci/xfails/mediatek-mt8183-fails.txt b/drivers/gpu/drm/ci/xfails/mediatek-mt8183-fails.txt
index 8cb2cb67853d..845f852bb4a0 100644
--- a/drivers/gpu/drm/ci/xfails/mediatek-mt8183-fails.txt
+++ b/drivers/gpu/drm/ci/xfails/mediatek-mt8183-fails.txt
@@ -1,10 +1,5 @@
 core_setmaster at master-drop-set-shared-fd,Fail
-device_reset at cold-reset-bound,Fail
-device_reset at reset-bound,Fail
-device_reset at unbind-cold-reset-rebind,Fail
-device_reset at unbind-reset-rebind,Fail
 dumb_buffer at create-clear,Crash
-dumb_buffer at invalid-bpp,Fail
 fbdev at eof,Fail
 fbdev at pan,Fail
 fbdev at read,Fail
@@ -18,5 +13,4 @@ kms_color at invalid-gamma-lut-sizes,Fail
 kms_flip at flip-vs-panning-vs-hang,Fail
 kms_flip at flip-vs-suspend,Fail
 kms_lease at lease-uevent,Fail
-kms_properties at plane-properties-atomic,Fail
 kms_rmfb at close-fd,Fail
diff --git a/drivers/gpu/drm/ci/xfails/meson-g12b-fails.txt b/drivers/gpu/drm/ci/xfails/meson-g12b-fails.txt
index 328967d3e23d..fc3745180683 100644
--- a/drivers/gpu/drm/ci/xfails/meson-g12b-fails.txt
+++ b/drivers/gpu/drm/ci/xfails/meson-g12b-fails.txt
@@ -1,4 +1,3 @@
-dumb_buffer at invalid-bpp,Fail
 kms_3d,Fail
 kms_cursor_legacy at forked-bo,Fail
 kms_cursor_legacy at forked-move,Fail
diff --git a/drivers/gpu/drm/ci/xfails/msm-apq8016-fails.txt b/drivers/gpu/drm/ci/xfails/msm-apq8016-fails.txt
index 4ac46168eff3..066d24ee3e08 100644
--- a/drivers/gpu/drm/ci/xfails/msm-apq8016-fails.txt
+++ b/drivers/gpu/drm/ci/xfails/msm-apq8016-fails.txt
@@ -1,8 +1,3 @@
-device_reset at cold-reset-bound,Fail
-device_reset at reset-bound,Fail
-device_reset at unbind-cold-reset-rebind,Fail
-device_reset at unbind-reset-rebind,Fail
-dumb_buffer at invalid-bpp,Fail
 kms_3d,Fail
 kms_cursor_legacy at torture-bo,Fail
 kms_force_connector_basic at force-edid,Fail
diff --git a/drivers/gpu/drm/ci/xfails/msm-apq8096-fails.txt b/drivers/gpu/drm/ci/xfails/msm-apq8096-fails.txt
index bd0653caf7a0..2893f98a6b97 100644
--- a/drivers/gpu/drm/ci/xfails/msm-apq8096-fails.txt
+++ b/drivers/gpu/drm/ci/xfails/msm-apq8096-fails.txt
@@ -1,7 +1,2 @@
-device_reset at cold-reset-bound,Fail
-device_reset at reset-bound,Fail
-device_reset at unbind-cold-reset-rebind,Fail
-device_reset at unbind-reset-rebind,Fail
-dumb_buffer at invalid-bpp,Fail
 kms_3d,Fail
 kms_lease at lease-uevent,Fail
diff --git a/drivers/gpu/drm/ci/xfails/msm-sc7180-trogdor-kingoftown-fails.txt b/drivers/gpu/drm/ci/xfails/msm-sc7180-trogdor-kingoftown-fails.txt
index d42004cd6977..6dbc2080347d 100644
--- a/drivers/gpu/drm/ci/xfails/msm-sc7180-trogdor-kingoftown-fails.txt
+++ b/drivers/gpu/drm/ci/xfails/msm-sc7180-trogdor-kingoftown-fails.txt
@@ -1,8 +1,3 @@
-device_reset at cold-reset-bound,Fail
-device_reset at reset-bound,Fail
-device_reset at unbind-cold-reset-rebind,Fail
-device_reset at unbind-reset-rebind,Fail
-dumb_buffer at invalid-bpp,Fail
 kms_color at ctm-0-25,Fail
 kms_color at ctm-0-50,Fail
 kms_color at ctm-0-75,Fail
@@ -11,35 +6,13 @@ kms_color at ctm-green-to-red,Fail
 kms_color at ctm-negative,Fail
 kms_color at ctm-red-to-blue,Fail
 kms_color at ctm-signed,Fail
-kms_content_protection at atomic,Crash
-kms_content_protection at atomic-dpms,Crash
-kms_content_protection at content-type-change,Crash
-kms_content_protection at lic-type-0,Crash
-kms_content_protection at lic-type-1,Crash
-kms_content_protection at srm,Crash
-kms_content_protection at type1,Crash
-kms_content_protection at uevent,Crash
-kms_cursor_legacy at 2x-cursor-vs-flip-atomic,Fail
-kms_cursor_legacy at 2x-cursor-vs-flip-legacy,Fail
-kms_cursor_legacy at 2x-flip-vs-cursor-atomic,Fail
-kms_cursor_legacy at 2x-flip-vs-cursor-legacy,Fail
-kms_cursor_legacy at 2x-long-cursor-vs-flip-atomic,Fail
-kms_cursor_legacy at 2x-long-cursor-vs-flip-legacy,Fail
-kms_cursor_legacy at 2x-long-flip-vs-cursor-atomic,Fail
-kms_cursor_legacy at 2x-long-flip-vs-cursor-legacy,Fail
 kms_cursor_legacy at cursor-vs-flip-toggle,Fail
 kms_cursor_legacy at cursor-vs-flip-varying-size,Fail
-kms_display_modes at extended-mode-basic,Fail
-kms_flip at 2x-flip-vs-modeset-vs-hang,Fail
-kms_flip at 2x-flip-vs-panning-vs-hang,Fail
 kms_flip at flip-vs-modeset-vs-hang,Fail
 kms_flip at flip-vs-panning-vs-hang,Fail
 kms_lease at lease-uevent,Fail
-kms_multipipe_modeset at basic-max-pipe-crc-check,Fail
 kms_pipe_crc_basic at compare-crc-sanitycheck-nv12,Fail
 kms_plane_alpha_blend at alpha-7efc,Fail
 kms_plane_alpha_blend at coverage-7efc,Fail
 kms_plane_alpha_blend at coverage-vs-premult-vs-constant,Fail
-kms_plane_lowres at tiling-none,Fail
 kms_rmfb at close-fd,Fail
-kms_vblank at ts-continuation-dpms-rpm,Fail
diff --git a/drivers/gpu/drm/ci/xfails/msm-sc7180-trogdor-kingoftown-skips.txt b/drivers/gpu/drm/ci/xfails/msm-sc7180-trogdor-kingoftown-skips.txt
index c2833eee1c4b..8f8d8da3068c 100644
--- a/drivers/gpu/drm/ci/xfails/msm-sc7180-trogdor-kingoftown-skips.txt
+++ b/drivers/gpu/drm/ci/xfails/msm-sc7180-trogdor-kingoftown-skips.txt
@@ -23,3 +23,63 @@ kms_flip at 2x-wf_vblank-ts-check
 
 # Hangs the machine
 kms_cursor_crc at cursor-random-max-size
+
+# Kernel panic
+kms_setmode at invalid-clone-single-crtc-stealing
+# [IGT] kms_setmode: executing
+# [IGT] kms_setmode: starting subtest invalid-clone-single-crtc-stealing
+# [IGT] kms_setmode: starting dynamic subtest pipe-A-eDP-1-DP-1
+# Unable to handle kernel NULL pointer dereference at virtual address 0000000000000178
+# Mem abort info:
+#   ESR = 0x0000000096000004
+#   EC = 0x25: DABT (current EL), IL = 32 bits
+#   SET = 0, FnV = 0
+#   EA = 0, S1PTW = 0
+#   FSC = 0x04: level 0 translation fault
+# Data abort info:
+#   ISV = 0, ISS = 0x00000004, ISS2 = 0x00000000
+#   CM = 0, WnR = 0, TnD = 0, TagAccess = 0
+#   GCS = 0, Overlay = 0, DirtyBit = 0, Xs = 0
+# user pgtable: 4k pages, 48-bit VAs, pgdp=000000024b2bb000
+# [0000000000000178] pgd=0000000000000000, p4d=0000000000000000
+# Internal error: Oops: 0000000096000004 [#1] PREEMPT SMP
+# Modules linked in:
+# CPU: 1 UID: 0 PID: 617 Comm: kms_setmode Not tainted 6.11.0-rc2-gee04e3109fb7 #1
+# Hardware name: Google Kingoftown (DT)
+# pstate: 60400009 (nZCv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=--)
+# pc : drm_mode_is_420_only+0x24/0x40
+# lr : drm_mode_is_420_only+0x20/0x40
+# sp : ffff80008730b830
+# x29: ffff80008730b830 x28: 0000000000000001 x27: ffff70b8c174b8b0
+# x26: ffffb111a6a5ec60 x25: ffffb111a70ed178 x24: 0000000000000028
+# x23: ffff70b8c4350480 x22: ffffb111a8e2c000 x21: ffff70b8c36eba80
+# x20: ffffb111a7ce0e30 x19: 0000000000000178 x18: 0000000000000003
+# x17: 000000040044ffff x16: 005000f2b5503510 x15: 0000000000000000
+# x14: 0000000000040000 x13: 0000000000000000 x12: 0000000000000000
+# x11: 0000000000000078 x10: 0000000000000000 x9 : ffffb111a8a23de8
+# x8 : ffff80008730b828 x7 : 0000000000000000 x6 : 0000000000244140
+# x5 : 00000000012e1fc0 x4 : 00000000000003e8 x3 : 0000000000000005
+# x2 : 0000000000000000 x1 : 0000000000000000 x0 : 0000000000000000
+# Call trace:
+#  drm_mode_is_420_only+0x24/0x40
+#  dpu_encoder_get_drm_fmt+0x20/0x44
+#  dpu_encoder_phys_vid_enable+0x24/0x1f8
+#  dpu_encoder_virt_atomic_enable+0xd4/0x234
+#  drm_atomic_helper_commit_modeset_enables+0x188/0x26c
+#  msm_atomic_commit_tail+0x1d8/0x688
+#  commit_tail+0xa0/0x188
+#  drm_atomic_helper_commit+0x190/0x1a4
+#  drm_atomic_commit+0xb4/0xec
+#  drm_atomic_helper_set_config+0xdc/0x114
+#  drm_mode_setcrtc+0x420/0x808
+#  drm_ioctl_kernel+0xbc/0x12c
+#  drm_ioctl+0x230/0x4c0
+#  __arm64_sys_ioctl+0xac/0xf0
+#  invoke_syscall+0x48/0x110
+#  el0_svc_common.constprop.0+0x40/0xe0
+#  do_el0_svc+0x1c/0x28
+#  el0_svc+0x4c/0x120
+#  el0t_64_sync_handler+0x100/0x12c
+#  el0t_64_sync+0x190/0x194
+# Code: 91010273 aa0103e0 97ffad23 d3461c01 (f8617a61)
+# ---[ end trace 0000000000000000 ]---
diff --git a/drivers/gpu/drm/ci/xfails/msm-sc7180-trogdor-lazor-limozeen-fails.txt b/drivers/gpu/drm/ci/xfails/msm-sc7180-trogdor-lazor-limozeen-fails.txt
index d42004cd6977..6dbc2080347d 100644
--- a/drivers/gpu/drm/ci/xfails/msm-sc7180-trogdor-lazor-limozeen-fails.txt
+++ b/drivers/gpu/drm/ci/xfails/msm-sc7180-trogdor-lazor-limozeen-fails.txt
@@ -1,8 +1,3 @@
-device_reset at cold-reset-bound,Fail
-device_reset at reset-bound,Fail
-device_reset at unbind-cold-reset-rebind,Fail
-device_reset at unbind-reset-rebind,Fail
-dumb_buffer at invalid-bpp,Fail
 kms_color at ctm-0-25,Fail
 kms_color at ctm-0-50,Fail
 kms_color at ctm-0-75,Fail
@@ -11,35 +6,13 @@ kms_color at ctm-green-to-red,Fail
 kms_color at ctm-negative,Fail
 kms_color at ctm-red-to-blue,Fail
 kms_color at ctm-signed,Fail
-kms_content_protection at atomic,Crash
-kms_content_protection at atomic-dpms,Crash
-kms_content_protection at content-type-change,Crash
-kms_content_protection at lic-type-0,Crash
-kms_content_protection at lic-type-1,Crash
-kms_content_protection at srm,Crash
-kms_content_protection at type1,Crash
-kms_content_protection at uevent,Crash
-kms_cursor_legacy at 2x-cursor-vs-flip-atomic,Fail
-kms_cursor_legacy at 2x-cursor-vs-flip-legacy,Fail
-kms_cursor_legacy at 2x-flip-vs-cursor-atomic,Fail
-kms_cursor_legacy at 2x-flip-vs-cursor-legacy,Fail
-kms_cursor_legacy at 2x-long-cursor-vs-flip-atomic,Fail
-kms_cursor_legacy at 2x-long-cursor-vs-flip-legacy,Fail
-kms_cursor_legacy at 2x-long-flip-vs-cursor-atomic,Fail
-kms_cursor_legacy at 2x-long-flip-vs-cursor-legacy,Fail
 kms_cursor_legacy at cursor-vs-flip-toggle,Fail
 kms_cursor_legacy at cursor-vs-flip-varying-size,Fail
-kms_display_modes at extended-mode-basic,Fail
-kms_flip at 2x-flip-vs-modeset-vs-hang,Fail
-kms_flip at 2x-flip-vs-panning-vs-hang,Fail
 kms_flip at flip-vs-modeset-vs-hang,Fail
 kms_flip at flip-vs-panning-vs-hang,Fail
 kms_lease at lease-uevent,Fail
-kms_multipipe_modeset at basic-max-pipe-crc-check,Fail
 kms_pipe_crc_basic at compare-crc-sanitycheck-nv12,Fail
 kms_plane_alpha_blend at alpha-7efc,Fail
 kms_plane_alpha_blend at coverage-7efc,Fail
 kms_plane_alpha_blend at coverage-vs-premult-vs-constant,Fail
-kms_plane_lowres at tiling-none,Fail
 kms_rmfb at close-fd,Fail
-kms_vblank at ts-continuation-dpms-rpm,Fail
diff --git a/drivers/gpu/drm/ci/xfails/msm-sdm845-fails.txt b/drivers/gpu/drm/ci/xfails/msm-sdm845-fails.txt
index 770a1c685fde..f7539aef95f2 100644
--- a/drivers/gpu/drm/ci/xfails/msm-sdm845-fails.txt
+++ b/drivers/gpu/drm/ci/xfails/msm-sdm845-fails.txt
@@ -1,8 +1,4 @@
-device_reset at cold-reset-bound,Fail
-device_reset at reset-bound,Fail
-device_reset at unbind-cold-reset-rebind,Fail
-device_reset at unbind-reset-rebind,Fail
-dumb_buffer at invalid-bpp,Fail
+drm_read at invalid-buffer,Fail
 kms_color at ctm-0-25,Fail
 kms_color at ctm-0-50,Fail
 kms_color at ctm-0-75,Fail
@@ -11,6 +7,7 @@ kms_color at ctm-green-to-red,Fail
 kms_color at ctm-negative,Fail
 kms_color at ctm-red-to-blue,Fail
 kms_color at ctm-signed,Fail
+kms_content_protection at uevent,Crash
 kms_cursor_legacy at basic-flip-before-cursor-atomic,Fail
 kms_cursor_legacy at basic-flip-before-cursor-legacy,Fail
 kms_cursor_legacy at cursor-vs-flip-atomic,Fail
diff --git a/drivers/gpu/drm/ci/xfails/msm-sdm845-flakes.txt b/drivers/gpu/drm/ci/xfails/msm-sdm845-flakes.txt
index 2aa96b1241c3..0052b2535bec 100644
--- a/drivers/gpu/drm/ci/xfails/msm-sdm845-flakes.txt
+++ b/drivers/gpu/drm/ci/xfails/msm-sdm845-flakes.txt
@@ -116,3 +116,10 @@ kms_cursor_legacy at flip-vs-cursor-toggle
 # IGT Version: 1.28-gf13702b8e
 # Linux Version: 6.10.0-rc5
 msm/msm_shrink at copy-mmap-oom-8
+
+# Board Name: sdm845-cheza-r3
+# Bug Report:
+# Failure Rate: 50
+# IGT Version: 1.28-ga73311079
+# Linux Version: 6.11.0-rc2
+kms_lease at page-flip-implicit-plane
diff --git a/drivers/gpu/drm/ci/xfails/rockchip-rk3288-fails.txt b/drivers/gpu/drm/ci/xfails/rockchip-rk3288-fails.txt
index ea7b2ceb95b9..90282dfa19f4 100644
--- a/drivers/gpu/drm/ci/xfails/rockchip-rk3288-fails.txt
+++ b/drivers/gpu/drm/ci/xfails/rockchip-rk3288-fails.txt
@@ -1,18 +1,24 @@
-core_setmaster at master-drop-set-root,Crash
 core_setmaster at master-drop-set-user,Crash
-core_setmaster_vs_auth,Crash
-device_reset at cold-reset-bound,Crash
-device_reset at reset-bound,Crash
-device_reset at unbind-cold-reset-rebind,Crash
-device_reset at unbind-reset-rebind,Crash
 dumb_buffer at create-clear,Crash
-dumb_buffer at invalid-bpp,Crash
 fbdev at pan,Crash
+kms_bw at linear-tiling-2-displays-1920x1080p,Fail
 kms_cursor_crc at cursor-onscreen-32x10,Crash
 kms_cursor_crc at cursor-onscreen-32x32,Crash
+kms_cursor_crc at cursor-onscreen-64x64,Crash
 kms_cursor_crc at cursor-random-32x10,Crash
+kms_cursor_crc at cursor-sliding-32x10,Crash
 kms_cursor_crc at cursor-sliding-32x32,Crash
+kms_cursor_crc at cursor-sliding-64x21,Crash
 kms_cursor_legacy at basic-flip-before-cursor-atomic,Fail
 kms_cursor_legacy at cursor-vs-flip-legacy,Fail
+kms_cursor_legacy at flip-vs-cursor-crc-atomic,Crash
+kms_flip at flip-vs-panning-vs-hang,Crash
+kms_invalid_mode at int-max-clock,Crash
+kms_lease at invalid-create-leases,Fail
+kms_pipe_crc_basic at read-crc-frame-sequence,Crash
+kms_plane at pixel-format,Crash
+kms_plane at pixel-format-source-clamping,Crash
 kms_prop_blob at invalid-set-prop,Crash
-kms_prop_blob at invalid-set-prop-any,Crash
+kms_properties at get_properties-sanity-atomic,Crash
+kms_properties at get_properties-sanity-non-atomic,Crash
+kms_rmfb at close-fd,Crash
diff --git a/drivers/gpu/drm/ci/xfails/rockchip-rk3288-flakes.txt b/drivers/gpu/drm/ci/xfails/rockchip-rk3288-flakes.txt
index 7ede273aab20..7f731e4db250 100644
--- a/drivers/gpu/drm/ci/xfails/rockchip-rk3288-flakes.txt
+++ b/drivers/gpu/drm/ci/xfails/rockchip-rk3288-flakes.txt
@@ -4,3 +4,31 @@
 # IGT Version: 1.28-gf13702b8e
 # Linux Version: 6.10.0-rc5
 kms_cursor_legacy at flip-vs-cursor-atomic
+
+# Board Name: rk3288-veyron-jaq
+# Bug Report:
+# Failure Rate: 100
+# IGT Version: 1.28-ga73311079
+# Linux Version: 6.11.0-rc2
+kms_cursor_crc at cursor-offscreen-32x10
+
+# Board Name: rk3288-veyron-jaq
+# Bug Report:
+# Failure Rate: 100
+# IGT Version: 1.28-ga73311079
+# Linux Version: 6.11.0-rc2
+kms_cursor_edge_walk at 64x64-left-edge
+
+# Board Name: rk3288-veyron-jaq
+# Bug Report:
+# Failure Rate: 100
+# IGT Version: 1.28-ga73311079
+# Linux Version: 6.11.0-rc2
+kms_flip at plain-flip-ts-check
+
+# Board Name: rk3288-veyron-jaq
+# Bug Report:
+# Failure Rate: 100
+# IGT Version: 1.28-ga73311079
+# Linux Version: 6.11.0-rc2
+kms_cursor_crc at cursor-alpha-opaque
diff --git a/drivers/gpu/drm/ci/xfails/rockchip-rk3399-fails.txt b/drivers/gpu/drm/ci/xfails/rockchip-rk3399-fails.txt
index 9309ff15e23a..10c454e48b8d 100644
--- a/drivers/gpu/drm/ci/xfails/rockchip-rk3399-fails.txt
+++ b/drivers/gpu/drm/ci/xfails/rockchip-rk3399-fails.txt
@@ -1,9 +1,4 @@
-device_reset at cold-reset-bound,Fail
-device_reset at reset-bound,Fail
-device_reset at unbind-cold-reset-rebind,Fail
-device_reset at unbind-reset-rebind,Fail
 dumb_buffer at create-clear,Crash
-dumb_buffer at invalid-bpp,Fail
 kms_atomic_transition at modeset-transition,Fail
 kms_atomic_transition at modeset-transition-fencing,Fail
 kms_atomic_transition at plane-toggle-modeset-transition,Fail
diff --git a/drivers/gpu/drm/ci/xfails/rockchip-rk3399-flakes.txt b/drivers/gpu/drm/ci/xfails/rockchip-rk3399-flakes.txt
index d98f6a17343c..85c18580372f 100644
--- a/drivers/gpu/drm/ci/xfails/rockchip-rk3399-flakes.txt
+++ b/drivers/gpu/drm/ci/xfails/rockchip-rk3399-flakes.txt
@@ -46,3 +46,10 @@ kms_setmode at basic
 # IGT Version: 1.28-gf13702b8e
 # Linux Version: 6.10.0-rc5
 kms_bw at connected-linear-tiling-1-displays-2560x1440p
+
+# Board Name: rk3399-gru-kevin
+# Bug Report:
+# Failure Rate: 50
+# IGT Version: 1.28-ga73311079
+# Linux Version: 6.11.0-rc2
+kms_flip at wf_vblank-ts-check
diff --git a/drivers/gpu/drm/ci/xfails/vkms-none-fails.txt b/drivers/gpu/drm/ci/xfails/vkms-none-fails.txt
index 5408110f4c60..71c02104a683 100644
--- a/drivers/gpu/drm/ci/xfails/vkms-none-fails.txt
+++ b/drivers/gpu/drm/ci/xfails/vkms-none-fails.txt
@@ -1,24 +1,3 @@
-core_hotunplug at hotrebind,Fail
-core_hotunplug at hotrebind-lateclose,Fail
-core_hotunplug at hotreplug,Fail
-core_hotunplug at hotreplug-lateclose,Fail
-core_hotunplug at hotunbind-rebind,Fail
-core_hotunplug at hotunplug-rescan,Fail
-core_hotunplug at unbind-rebind,Fail
-core_hotunplug at unplug-rescan,Fail
-device_reset at cold-reset-bound,Fail
-device_reset at reset-bound,Fail
-device_reset at unbind-cold-reset-rebind,Fail
-device_reset at unbind-reset-rebind,Fail
-dumb_buffer at invalid-bpp,Fail
-kms_content_protection at atomic,Crash
-kms_content_protection at atomic-dpms,Crash
-kms_content_protection at content-type-change,Crash
-kms_content_protection at lic-type-0,Crash
-kms_content_protection at lic-type-1,Crash
-kms_content_protection at srm,Crash
-kms_content_protection at type1,Crash
-kms_content_protection at uevent,Crash
 kms_cursor_crc at cursor-rapid-movement-128x128,Fail
 kms_cursor_crc at cursor-rapid-movement-128x42,Fail
 kms_cursor_crc at cursor-rapid-movement-256x256,Fail
-- 
2.43.0



From mcgrof at kernel.org  Thu Sep  5 02:41:29 2024
From: mcgrof at kernel.org (Luis Chamberlain)
Date: Thu, 5 Sep 2024 02:41:29 -0700
Subject: [PATCH v2] module: abort module loading when sysfs setup suffer
 errors
In-Reply-To: <20240904124108.20444-1-chunhui.li@mediatek.com>
References: <20240904124108.20444-1-chunhui.li@mediatek.com>
Message-ID: <Ztl8yWZMhjSExF4L@bombadil.infradead.org>

On Wed, Sep 04, 2024 at 08:41:07PM +0800, Chunhui Li wrote:
> When insmod a kernel module, if fails in add_notes_attrs or
> add_sysfs_attrs such as memory allocation fail, mod_sysfs_setup
> will still return success, but we can't access user interface
> on android device.
> 
> Patch for make mod_sysfs_setup can check the error of
> add_notes_attrs and add_sysfs_attrs.
> 
> Reported-by: kernel test robot <lkp at intel.com>
> Closes: https://lore.kernel.org/oe-kbuild-all/202409010016.3XIFSmRA-lkp at intel.com/
> Signed-off-by: Xion Wang <xion.wang at mediatek.com>
> Signed-off-by: Chunhui Li <chunhui.li at mediatek.com>

Please use Fixes tag and resend.
 
  Luis


From daniel at fooishbar.org  Thu Sep  5 03:16:23 2024
From: daniel at fooishbar.org (Daniel Stone)
Date: Thu, 5 Sep 2024 11:16:23 +0100
Subject: [PATCH v1] drm/ci: uprev IGT and deqp-runner
In-Reply-To: <20240905093935.2780632-1-vignesh.raman@collabora.com>
References: <20240905093935.2780632-1-vignesh.raman@collabora.com>
Message-ID: <CAPj87rPCctE=iJKfQXR-PJdUHR+5f-t2bRA5Daq2fzUTNekzcg@mail.gmail.com>

Hi Vignesh,

On Thu, 5 Sept 2024 at 10:41, Vignesh Raman <vignesh.raman at collabora.com> wrote:
> Uprev IGT to the latest version and deqp-runner
> to v0.20.0. Also update expectation files.

Thanks! This is:
Reviewed-by: Daniel Stone <daniels at collabora.com>


From helen.koike at collabora.com  Thu Sep  5 05:09:53 2024
From: helen.koike at collabora.com (Helen Mae Koike Fornazier)
Date: Thu, 05 Sep 2024 09:09:53 -0300
Subject: [PATCH v1] drm/ci: uprev IGT and deqp-runner
In-Reply-To: <20240905093935.2780632-1-vignesh.raman@collabora.com>
References: <20240905093935.2780632-1-vignesh.raman@collabora.com>
Message-ID: <191c2174ea6.c21ecee31017726.6623374043771391596@collabora.com>





---- On Thu, 05 Sep 2024 06:39:32 -0300 Vignesh Raman  wrote ---

 > Uprev IGT to the latest version and deqp-runner 
 > to v0.20.0. Also update expectation files. 
 >  
 > Signed-off-by: Vignesh Raman vignesh.raman at collabora.com> 
 > --- 
 >  
 > v1: 
 > - Flaky test report will be sent to maintainers after this 
 >  patch series is reviewed. 
 >  
 > --- 
 >  drivers/gpu/drm/ci/gitlab-ci.yml              |  4 +- 
 >  drivers/gpu/drm/ci/image-tags.yml             |  2 +- 
 >  .../gpu/drm/ci/xfails/amdgpu-stoney-fails.txt |  2 +- 
 >  .../drm/ci/xfails/amdgpu-stoney-flakes.txt    |  7 +++ 
 >  drivers/gpu/drm/ci/xfails/i915-amly-fails.txt |  2 +- 
 >  .../gpu/drm/ci/xfails/i915-amly-flakes.txt    |  7 +++ 
 >  drivers/gpu/drm/ci/xfails/i915-apl-fails.txt  |  1 - 
 >  drivers/gpu/drm/ci/xfails/i915-apl-flakes.txt |  7 +++ 
 >  drivers/gpu/drm/ci/xfails/i915-cml-fails.txt  | 10 +--- 
 >  drivers/gpu/drm/ci/xfails/i915-cml-flakes.txt | 14 +++++ 
 >  drivers/gpu/drm/ci/xfails/i915-glk-fails.txt  |  1 + 
 >  drivers/gpu/drm/ci/xfails/i915-kbl-fails.txt  |  2 - 
 >  drivers/gpu/drm/ci/xfails/i915-tgl-fails.txt  | 34 +++++++++-- 
 >  drivers/gpu/drm/ci/xfails/i915-whl-fails.txt  |  9 ++- 
 >  .../drm/ci/xfails/mediatek-mt8173-fails.txt   | 11 +--- 
 >  .../drm/ci/xfails/mediatek-mt8183-fails.txt   |  6 -- 
 >  .../gpu/drm/ci/xfails/meson-g12b-fails.txt    |  1 - 
 >  .../gpu/drm/ci/xfails/msm-apq8016-fails.txt   |  5 -- 
 >  .../gpu/drm/ci/xfails/msm-apq8096-fails.txt   |  5 -- 
 >  .../msm-sc7180-trogdor-kingoftown-fails.txt   | 27 --------- 
 >  .../msm-sc7180-trogdor-kingoftown-skips.txt   | 60 +++++++++++++++++++ 
 >  ...sm-sc7180-trogdor-lazor-limozeen-fails.txt | 27 --------- 
 >  .../gpu/drm/ci/xfails/msm-sdm845-fails.txt    |  7 +-- 
 >  .../gpu/drm/ci/xfails/msm-sdm845-flakes.txt   |  7 +++ 
 >  .../drm/ci/xfails/rockchip-rk3288-fails.txt   | 22 ++++--- 
 >  .../drm/ci/xfails/rockchip-rk3288-flakes.txt  | 28 +++++++++ 
 >  .../drm/ci/xfails/rockchip-rk3399-fails.txt   |  5 -- 
 >  .../drm/ci/xfails/rockchip-rk3399-flakes.txt  |  7 +++ 
 >  drivers/gpu/drm/ci/xfails/vkms-none-fails.txt | 21 ------- 
 >  29 files changed, 196 insertions(+), 145 deletions(-) 
 >  
 > diff --git a/drivers/gpu/drm/ci/gitlab-ci.yml b/drivers/gpu/drm/ci/gitlab-ci.yml 
 > index eca47d4f816f..eba5aad4a012 100644 
 > --- a/drivers/gpu/drm/ci/gitlab-ci.yml 
 > +++ b/drivers/gpu/drm/ci/gitlab-ci.yml 
 > @@ -5,10 +5,10 @@ variables: 
 >  UPSTREAM_REPO: https://gitlab.freedesktop.org/drm/kernel.git 
 >  TARGET_BRANCH: drm-next 
 >  
 > -  IGT_VERSION: f13702b8e4e847c56da3ef6f0969065d686049c5 
 > +  IGT_VERSION: a73311079a5d8ac99eb25336a8369a2c3c6b519b 
 >  
 >  DEQP_RUNNER_GIT_URL: https://gitlab.freedesktop.org/mesa/deqp-runner.git 
 > -  DEQP_RUNNER_GIT_TAG: v0.15.0 
 > +  DEQP_RUNNER_GIT_TAG: v0.20.0 
 >  
 >  FDO_UPSTREAM_REPO: helen.fornazier/linux   # The repo where the git-archive daily runs 
 >  MESA_TEMPLATES_COMMIT: &ci-templates-commit d5aa3941aa03c2f716595116354fb81eb8012acb 
 > diff --git a/drivers/gpu/drm/ci/image-tags.yml b/drivers/gpu/drm/ci/image-tags.yml 
 > index 2c340d063a96..4825a5cf813b 100644 
 > --- a/drivers/gpu/drm/ci/image-tags.yml 
 > +++ b/drivers/gpu/drm/ci/image-tags.yml 
 > @@ -1,5 +1,5 @@ 
 >  variables: 
 > -   CONTAINER_TAG: "2024-08-07-mesa-uprev" 
 > +   CONTAINER_TAG: "2024-09-04-igt-deqp" 
 >  DEBIAN_X86_64_BUILD_BASE_IMAGE: "debian/x86_64_build-base" 
 >  DEBIAN_BASE_TAG: "${CONTAINER_TAG}" 
 >  
 > diff --git a/drivers/gpu/drm/ci/xfails/amdgpu-stoney-fails.txt b/drivers/gpu/drm/ci/xfails/amdgpu-stoney-fails.txt 
 > index 8e2fed6d76a3..f44dbce3151a 100644 
 > --- a/drivers/gpu/drm/ci/xfails/amdgpu-stoney-fails.txt 
 > +++ b/drivers/gpu/drm/ci/xfails/amdgpu-stoney-fails.txt 
 > @@ -2,6 +2,7 @@ amdgpu/amd_abm at abm_enabled,Fail 
 >  amdgpu/amd_abm at abm_gradual,Fail 
 >  amdgpu/amd_abm at backlight_monotonic_abm,Fail 
 >  amdgpu/amd_abm at backlight_monotonic_basic,Fail 
 > +amdgpu/amd_abm at dpms_cycle,Fail 
 >  amdgpu/amd_assr at assr-links,Fail 
 >  amdgpu/amd_assr at assr-links-dpms,Fail 
 >  amdgpu/amd_mall at static-screen,Crash 
 > @@ -14,7 +15,6 @@ amdgpu/amd_plane at mpo-scale-p010,Fail 
 >  amdgpu/amd_plane at mpo-scale-rgb,Crash 
 >  amdgpu/amd_plane at mpo-swizzle-toggle,Fail 
 >  amdgpu/amd_uvd_dec at amdgpu_uvd_decode,Fail 
 > -dumb_buffer at invalid-bpp,Fail 
 >  kms_addfb_basic at bad-pitch-65536,Fail 
 >  kms_addfb_basic at bo-too-small,Fail 
 >  kms_addfb_basic at too-high,Fail 
 > diff --git a/drivers/gpu/drm/ci/xfails/amdgpu-stoney-flakes.txt b/drivers/gpu/drm/ci/xfails/amdgpu-stoney-flakes.txt 
 > index e4faa96fa000..bcd4e320b1ea 100644 
 > --- a/drivers/gpu/drm/ci/xfails/amdgpu-stoney-flakes.txt 
 > +++ b/drivers/gpu/drm/ci/xfails/amdgpu-stoney-flakes.txt 
 > @@ -18,3 +18,10 @@ kms_async_flips at crc 
 >  # IGT Version: 1.28-g0df7b9b97 
 >  # Linux Version: 6.9.0-rc7 
 >  kms_plane at pixel-format-source-clamping 
 > + 
 > +# Board Name: hp-11A-G6-EE-grunt 
 > +# Bug Report: 
 > +# Failure Rate: 100 
 > +# IGT Version: 1.28-ga73311079 
 > +# Linux Version: 6.11.0-rc2 
 > +kms_async_flips at async-flip-with-page-flip-events 
 > diff --git a/drivers/gpu/drm/ci/xfails/i915-amly-fails.txt b/drivers/gpu/drm/ci/xfails/i915-amly-fails.txt 
 > index 9b84f68a5122..0907cb0f6d9e 100644 
 > --- a/drivers/gpu/drm/ci/xfails/i915-amly-fails.txt 
 > +++ b/drivers/gpu/drm/ci/xfails/i915-amly-fails.txt 
 > @@ -1,3 +1,4 @@ 
 > +core_setmaster at master-drop-set-shared-fd,Fail 
 >  core_setmaster at master-drop-set-user,Fail 
 >  core_setmaster_vs_auth,Fail 
 >  i915_module_load at load,Fail 
 > @@ -6,7 +7,6 @@ i915_module_load at reload-no-display,Fail 
 >  i915_module_load at resize-bar,Fail 
 >  i915_pm_rpm at gem-execbuf-stress,Timeout 
 >  i915_pm_rpm at module-reload,Fail 
 > -kms_ccs at crc-primary-rotation-180-yf-tiled-ccs,Timeout 
 >  kms_cursor_legacy at short-flip-before-cursor-atomic-transitions,Timeout 
 >  kms_fb_coherency at memset-crc,Crash 
 >  kms_flip at busy-flip,Timeout 
 > diff --git a/drivers/gpu/drm/ci/xfails/i915-amly-flakes.txt b/drivers/gpu/drm/ci/xfails/i915-amly-flakes.txt 
 > index 581f0da4d0f2..e4a202630eba 100644 
 > --- a/drivers/gpu/drm/ci/xfails/i915-amly-flakes.txt 
 > +++ b/drivers/gpu/drm/ci/xfails/i915-amly-flakes.txt 
 > @@ -46,3 +46,10 @@ i915_hangman at engine-engine-hang 
 >  # IGT Version: 1.28-gf13702b8e 
 >  # Linux Version: 6.10.0-rc5 
 >  kms_pm_rpm at modeset-lpsp-stress 
 > + 
 > +# Board Name: asus-C433TA-AJ0005-rammus 
 > +# Bug Report: 
 > +# Failure Rate: 50 
 > +# IGT Version: 1.28-ga73311079 
 > +# Linux Version: 6.11.0-rc2 
 > +kms_pm_rpm at drm-resources-equal 
 > diff --git a/drivers/gpu/drm/ci/xfails/i915-apl-fails.txt b/drivers/gpu/drm/ci/xfails/i915-apl-fails.txt 
 > index e612281149aa..64772fedaed5 100644 
 > --- a/drivers/gpu/drm/ci/xfails/i915-apl-fails.txt 
 > +++ b/drivers/gpu/drm/ci/xfails/i915-apl-fails.txt 
 > @@ -8,7 +8,6 @@ kms_flip_scaled_crc at flip-32bpp-xtile-to-64bpp-xtile-downscaling,Fail 
 >  kms_flip_scaled_crc at flip-32bpp-xtile-to-64bpp-xtile-upscaling,Fail 
 >  kms_flip_scaled_crc at flip-32bpp-ytile-to-64bpp-ytile-downscaling,Fail 
 >  kms_flip_scaled_crc at flip-32bpp-ytile-to-64bpp-ytile-upscaling,Fail 
 > -kms_flip_scaled_crc at flip-32bpp-ytileccs-to-64bpp-ytile-downscaling,Fail 
 >  kms_flip_scaled_crc at flip-32bpp-ytileccs-to-64bpp-ytile-upscaling,Fail 
 >  kms_flip_scaled_crc at flip-64bpp-linear-to-16bpp-linear-downscaling,Fail 
 >  kms_flip_scaled_crc at flip-64bpp-linear-to-16bpp-linear-upscaling,Fail 
 > diff --git a/drivers/gpu/drm/ci/xfails/i915-apl-flakes.txt b/drivers/gpu/drm/ci/xfails/i915-apl-flakes.txt 
 > index 4663d4d13f35..91685b3401be 100644 
 > --- a/drivers/gpu/drm/ci/xfails/i915-apl-flakes.txt 
 > +++ b/drivers/gpu/drm/ci/xfails/i915-apl-flakes.txt 
 > @@ -4,3 +4,10 @@ 
 >  # IGT Version: 1.28-g0df7b9b97 
 >  # Linux Version: 6.9.0-rc7 
 >  kms_fb_coherency at memset-crc 
 > + 
 > +# Board Name: asus-C523NA-A20057-coral 
 > +# Bug Report: 
 > +# Failure Rate: 100 
 > +# IGT Version: 1.28-ga73311079 
 > +# Linux Version: 6.11.0-rc2 
 > +kms_universal_plane at cursor-fb-leak 
 > diff --git a/drivers/gpu/drm/ci/xfails/i915-cml-fails.txt b/drivers/gpu/drm/ci/xfails/i915-cml-fails.txt 
 > index 2723e2832797..f352b719cf7d 100644 
 > --- a/drivers/gpu/drm/ci/xfails/i915-cml-fails.txt 
 > +++ b/drivers/gpu/drm/ci/xfails/i915-cml-fails.txt 
 > @@ -1,5 +1,5 @@ 
 > +core_setmaster at master-drop-set-shared-fd,Fail 
 >  core_setmaster at master-drop-set-user,Fail 
 > -core_setmaster_vs_auth,Fail 
 >  i915_module_load at load,Fail 
 >  i915_module_load at reload,Fail 
 >  i915_module_load at reload-no-display,Fail 
 > @@ -9,10 +9,10 @@ i915_pipe_stress at stress-xrgb8888-ytiled,Fail 
 >  i915_pm_rpm at gem-execbuf-stress,Timeout 
 >  i915_pm_rpm at module-reload,Fail 
 >  i915_pm_rpm at system-suspend-execbuf,Timeout 
 > -kms_ccs at crc-primary-rotation-180-yf-tiled-ccs,Timeout 
 > +i915_pm_rps at engine-order,Fail 
 > +kms_big_fb at linear-16bpp-rotate-180,Timeout 
 >  kms_fb_coherency at memset-crc,Crash 
 >  kms_flip at busy-flip,Timeout 
 > -kms_flip at single-buffer-flip-vs-dpms-off-vs-modeset-interruptible,Fail 
 >  kms_flip_scaled_crc at flip-32bpp-linear-to-64bpp-linear-downscaling,Fail 
 >  kms_flip_scaled_crc at flip-32bpp-linear-to-64bpp-linear-upscaling,Fail 
 >  kms_flip_scaled_crc at flip-32bpp-xtile-to-64bpp-xtile-downscaling,Fail 
 > @@ -40,14 +40,11 @@ kms_plane_alpha_blend at alpha-basic,Fail 
 >  kms_plane_alpha_blend at alpha-opaque-fb,Fail 
 >  kms_plane_alpha_blend at alpha-transparent-fb,Fail 
 >  kms_plane_alpha_blend at constant-alpha-max,Fail 
 > -kms_plane_scaling at plane-scaler-with-clipping-clamping-rotation,Timeout 
 >  kms_plane_scaling at planes-upscale-factor-0-25-downscale-factor-0-5,Timeout 
 >  kms_pm_rpm at modeset-stress-extra-wait,Timeout 
 >  kms_pm_rpm at universal-planes,Timeout 
 >  kms_pm_rpm at universal-planes-dpms,Timeout 
 > -kms_prop_blob at invalid-set-prop,Fail 
 >  kms_psr2_sf at cursor-plane-update-sf,Fail 
 > -kms_psr2_sf at fbc-plane-move-sf-dmg-area,Timeout 
 >  kms_psr2_sf at overlay-plane-update-continuous-sf,Fail 
 >  kms_psr2_sf at overlay-plane-update-sf-dmg-area,Fail 
 >  kms_psr2_sf at overlay-primary-update-sf-dmg-area,Fail 
 > @@ -55,7 +52,6 @@ kms_psr2_sf at plane-move-sf-dmg-area,Fail 
 >  kms_psr2_sf at primary-plane-update-sf-dmg-area,Fail 
 >  kms_psr2_sf at primary-plane-update-sf-dmg-area-big-fb,Fail 
 >  kms_psr2_su at page_flip-NV12,Fail 
 > -kms_psr2_su at page_flip-P010,Fail 
 >  kms_rotation_crc at primary-rotation-180,Timeout 
 >  kms_setmode at basic,Fail 
 >  kms_vblank at query-forked-hang,Timeout 
 > diff --git a/drivers/gpu/drm/ci/xfails/i915-cml-flakes.txt b/drivers/gpu/drm/ci/xfails/i915-cml-flakes.txt 
 > index 58a6001abb28..9dac2b898f34 100644 
 > --- a/drivers/gpu/drm/ci/xfails/i915-cml-flakes.txt 
 > +++ b/drivers/gpu/drm/ci/xfails/i915-cml-flakes.txt 
 > @@ -11,3 +11,17 @@ kms_plane_alpha_blend at constant-alpha-min 
 >  # IGT Version: 1.28-gf13702b8e 
 >  # Linux Version: 6.10.0-rc5 
 >  kms_atomic_transition at plane-all-modeset-transition-internal-panels 
 > + 
 > +# Board Name: asus-C436FA-Flip-hatch 
 > +# Bug Report: 
 > +# Failure Rate: 100 
 > +# IGT Version: 1.28-ga73311079 
 > +# Linux Version: 6.11.0-rc2 
 > +kms_plane_alpha_blend at constant-alpha-min 
 > + 
 > +# Board Name: asus-C436FA-Flip-hatch 
 > +# Bug Report: 
 > +# Failure Rate: 50 
 > +# IGT Version: 1.28-ga73311079 
 > +# Linux Version: 6.11.0-rc2 
 > +kms_async_flips at crc 
 > diff --git a/drivers/gpu/drm/ci/xfails/i915-glk-fails.txt b/drivers/gpu/drm/ci/xfails/i915-glk-fails.txt 
 > index 4821c9adefd1..6eb64c672f7d 100644 
 > --- a/drivers/gpu/drm/ci/xfails/i915-glk-fails.txt 
 > +++ b/drivers/gpu/drm/ci/xfails/i915-glk-fails.txt 
 > @@ -63,3 +63,4 @@ xe_module_load at load,Fail 
 >  xe_module_load at many-reload,Fail 
 >  xe_module_load at reload,Fail 
 >  xe_module_load at reload-no-display,Fail 
 > +core_setmaster at master-drop-set-shared-fd,Fail 
 > diff --git a/drivers/gpu/drm/ci/xfails/i915-kbl-fails.txt b/drivers/gpu/drm/ci/xfails/i915-kbl-fails.txt 
 > index 1de04a3308c4..d4fba4f55ec1 100644 
 > --- a/drivers/gpu/drm/ci/xfails/i915-kbl-fails.txt 
 > +++ b/drivers/gpu/drm/ci/xfails/i915-kbl-fails.txt 
 > @@ -17,12 +17,10 @@ perf at i915-ref-count,Fail 
 >  perf_pmu at busy-accuracy-50,Fail 
 >  perf_pmu at module-unload,Fail 
 >  perf_pmu at rc6,Crash 
 > -prime_busy at after,Fail 
 >  sysfs_heartbeat_interval at long,Timeout 
 >  sysfs_heartbeat_interval at off,Timeout 
 >  sysfs_preempt_timeout at off,Timeout 
 >  sysfs_timeslice_duration at off,Timeout 
 > -testdisplay,Timeout 
 >  xe_module_load at force-load,Fail 
 >  xe_module_load at load,Fail 
 >  xe_module_load at many-reload,Fail 
 > diff --git a/drivers/gpu/drm/ci/xfails/i915-tgl-fails.txt b/drivers/gpu/drm/ci/xfails/i915-tgl-fails.txt 
 > index e728ccc62326..461ef69ef08a 100644 
 > --- a/drivers/gpu/drm/ci/xfails/i915-tgl-fails.txt 
 > +++ b/drivers/gpu/drm/ci/xfails/i915-tgl-fails.txt 
 > @@ -1,40 +1,64 @@ 
 > +api_intel_allocator at fork-simple-stress-signal,Timeout 
 > +api_intel_allocator at open-vm,Timeout 
 >  api_intel_allocator at simple-allocator,Timeout 
 > +api_intel_bb at lot-of-buffers,Timeout 
 >  api_intel_bb at object-reloc-keep-cache,Timeout 
 >  api_intel_bb at offset-control,Timeout 
 > -core_auth at getclient-simple,Timeout 
 > -core_hotunplug at hotunbind-rebind,Timeout 
 > +api_intel_bb at render-ccs,Timeout 
 > +api_intel_bb at reset-bb,Timeout 
 > +core_auth at basic-auth,Timeout 
 > +core_hotunplug at hotrebind,Timeout 
 > +core_setmaster at master-drop-set-user,Fail 
 >  debugfs_test at read_all_entries_display_on,Timeout 
 > -drm_read at invalid-buffer,Timeout 
 > -drm_read at short-buffer-nonblock,Timeout 
 > +drm_read at empty-block,Timeout 
 > +dumb_buffer at create-clear,Timeout 
 > +dumb_buffer at invalid-bpp,Timeout 
 >  gen3_render_tiledx_blits,Timeout 
 >  gen7_exec_parse at basic-allocation,Timeout 
 > -gen7_exec_parse at batch-without-end,Timeout 
 >  gen9_exec_parse at batch-invalid-length,Timeout 
 >  gen9_exec_parse at bb-secure,Timeout 
 >  gen9_exec_parse at secure-batches,Timeout 
 >  gen9_exec_parse at shadow-peek,Timeout 
 >  gen9_exec_parse at unaligned-jump,Timeout 
 > +i915_getparams_basic at basic-subslice-total,Timeout 
 > +i915_hangman at gt-engine-hang,Timeout 
 >  i915_module_load at load,Fail 
 >  i915_module_load at reload,Fail 
 >  i915_module_load at reload-no-display,Fail 
 >  i915_module_load at resize-bar,Fail 
 > +i915_pciid,Timeout 
 > +i915_pipe_stress at stress-xrgb8888-ytiled,Timeout 
 > +i915_pm_rpm at gem-execbuf-stress,Timeout 
 > +i915_pm_rps at engine-order,Timeout 
 > +i915_pm_rps at thresholds-idle-park,Timeout 
 >  i915_query at engine-info,Timeout 
 >  i915_query at query-topology-kernel-writes,Timeout 
 >  i915_query at test-query-geometry-subslices,Timeout 
 >  kms_lease at lease-uevent,Fail 
 >  kms_rotation_crc at multiplane-rotation,Fail 
 >  perf at i915-ref-count,Fail 
 > +perf_pmu at busy,Timeout 
 >  perf_pmu at enable-race,Timeout 
 >  perf_pmu at event-wait,Timeout 
 > +perf_pmu at faulting-read,Timeout 
 >  perf_pmu at gt-awake,Timeout 
 >  perf_pmu at interrupts,Timeout 
 >  perf_pmu at module-unload,Fail 
 > +perf_pmu at most-busy-idle-check-all,Timeout 
 >  perf_pmu at rc6,Crash 
 > +perf_pmu at render-node-busy-idle,Fail 
 > +perf_pmu at semaphore-wait-idle,Timeout 
 > +prime_busy at after,Timeout 
 > +prime_mmap at test_aperture_limit,Timeout 
 >  prime_mmap at test_map_unmap,Timeout 
 >  prime_mmap at test_refcounting,Timeout 
 >  prime_self_import at basic-with_one_bo,Timeout 
 > +sriov_basic at enable-vfs-autoprobe-off,Timeout 
 > +syncobj_basic at bad-destroy,Timeout 
 >  syncobj_basic at bad-flags-fd-to-handle,Timeout 
 > +syncobj_basic at create-signaled,Timeout 
 >  syncobj_eventfd at invalid-bad-pad,Timeout 
 > +syncobj_eventfd at timeline-wait-before-signal,Timeout 
 >  syncobj_wait at invalid-multi-wait-unsubmitted-signaled,Timeout 
 >  syncobj_wait at invalid-signal-illegal-handle,Timeout 
 >  syncobj_wait at invalid-single-wait-all-unsubmitted,Timeout 
 > diff --git a/drivers/gpu/drm/ci/xfails/i915-whl-fails.txt b/drivers/gpu/drm/ci/xfails/i915-whl-fails.txt 
 > index 2adae2175501..0ce240e3aa07 100644 
 > --- a/drivers/gpu/drm/ci/xfails/i915-whl-fails.txt 
 > +++ b/drivers/gpu/drm/ci/xfails/i915-whl-fails.txt 
 > @@ -1,5 +1,5 @@ 
 > +core_setmaster at master-drop-set-shared-fd,Fail 
 >  core_setmaster at master-drop-set-user,Fail 
 > -core_setmaster_vs_auth,Fail 
 >  i915_module_load at load,Fail 
 >  i915_module_load at reload,Fail 
 >  i915_module_load at reload-no-display,Fail 
 > @@ -7,7 +7,8 @@ i915_module_load at resize-bar,Fail 
 >  i915_pm_rpm at gem-execbuf-stress,Timeout 
 >  i915_pm_rpm at module-reload,Fail 
 >  i915_pm_rpm at system-suspend-execbuf,Timeout 
 > -kms_ccs at crc-primary-rotation-180-yf-tiled-ccs,Timeout 
 > +i915_pm_rps at engine-order,Fail 
 > +kms_big_fb at linear-16bpp-rotate-180,Timeout 
 >  kms_cursor_legacy at short-flip-before-cursor-atomic-transitions,Timeout 
 >  kms_dirtyfb at default-dirtyfb-ioctl,Fail 
 >  kms_dirtyfb at fbc-dirtyfb-ioctl,Fail 
 > @@ -32,19 +33,17 @@ kms_flip_scaled_crc at flip-64bpp-ytile-to-32bpp-ytile-downscaling,Fail 
 >  kms_flip_scaled_crc at flip-64bpp-ytile-to-32bpp-ytile-upscaling,Fail 
 >  kms_flip_scaled_crc at flip-64bpp-ytile-to-32bpp-ytilegen12rcccs-upscaling,Fail 
 >  kms_flip_scaled_crc at flip-64bpp-ytile-to-32bpp-ytilercccs-downscaling,Fail 
 > -kms_frontbuffer_tracking at fbc-rgb565-draw-mmap-cpu,Timeout 
 >  kms_frontbuffer_tracking at fbc-tiling-linear,Fail 
 > +kms_frontbuffer_tracking at fbc-1p-indfb-fliptrack-mmap-gtt,Timeout 
 >  kms_lease at lease-uevent,Fail 
 >  kms_plane_alpha_blend at alpha-basic,Fail 
 >  kms_plane_alpha_blend at alpha-opaque-fb,Fail 
 >  kms_plane_alpha_blend at alpha-transparent-fb,Fail 
 >  kms_plane_alpha_blend at constant-alpha-max,Fail 
 > -kms_plane_scaling at plane-scaler-with-clipping-clamping-rotation,Timeout 
 >  kms_plane_scaling at planes-upscale-factor-0-25-downscale-factor-0-5,Timeout 
 >  kms_pm_rpm at modeset-stress-extra-wait,Timeout 
 >  kms_pm_rpm at universal-planes,Timeout 
 >  kms_pm_rpm at universal-planes-dpms,Timeout 
 > -kms_prop_blob at invalid-set-prop,Fail 
 >  kms_rotation_crc at primary-rotation-180,Timeout 
 >  kms_vblank at query-forked-hang,Timeout 
 >  perf at i915-ref-count,Fail 
 > diff --git a/drivers/gpu/drm/ci/xfails/mediatek-mt8173-fails.txt b/drivers/gpu/drm/ci/xfails/mediatek-mt8173-fails.txt 
 > index a14349a1967f..8e0efc80d510 100644 
 > --- a/drivers/gpu/drm/ci/xfails/mediatek-mt8173-fails.txt 
 > +++ b/drivers/gpu/drm/ci/xfails/mediatek-mt8173-fails.txt 
 > @@ -1,8 +1,3 @@ 
 > -device_reset at cold-reset-bound,Fail 
 > -device_reset at reset-bound,Fail 
 > -device_reset at unbind-cold-reset-rebind,Fail 
 > -device_reset at unbind-reset-rebind,Fail 
 > -dumb_buffer at invalid-bpp,Fail 
 >  fbdev at eof,Fail 
 >  fbdev at read,Fail 
 >  kms_3d,Fail 
 > @@ -27,10 +22,6 @@ kms_cursor_legacy at cursor-vs-flip-atomic,Fail 
 >  kms_cursor_legacy at cursor-vs-flip-legacy,Fail 
 >  kms_flip at flip-vs-modeset-vs-hang,Fail 
 >  kms_flip at flip-vs-panning-vs-hang,Fail 
 > -kms_flip at flip-vs-suspend,Fail 
 > -kms_flip at flip-vs-suspend-interruptible,Fail 
 >  kms_lease at lease-uevent,Fail 
 > -kms_properties at get_properties-sanity-atomic,Fail 
 > -kms_properties at plane-properties-atomic,Fail 
 > -kms_properties at plane-properties-legacy,Fail 
 >  kms_rmfb at close-fd,Fail 
 > +kms_flip at flip-vs-suspend-interruptible,Fail 
 > diff --git a/drivers/gpu/drm/ci/xfails/mediatek-mt8183-fails.txt b/drivers/gpu/drm/ci/xfails/mediatek-mt8183-fails.txt 
 > index 8cb2cb67853d..845f852bb4a0 100644 
 > --- a/drivers/gpu/drm/ci/xfails/mediatek-mt8183-fails.txt 
 > +++ b/drivers/gpu/drm/ci/xfails/mediatek-mt8183-fails.txt 
 > @@ -1,10 +1,5 @@ 
 >  core_setmaster at master-drop-set-shared-fd,Fail 
 > -device_reset at cold-reset-bound,Fail 
 > -device_reset at reset-bound,Fail 
 > -device_reset at unbind-cold-reset-rebind,Fail 
 > -device_reset at unbind-reset-rebind,Fail 
 >  dumb_buffer at create-clear,Crash 
 > -dumb_buffer at invalid-bpp,Fail 
 >  fbdev at eof,Fail 
 >  fbdev at pan,Fail 
 >  fbdev at read,Fail 
 > @@ -18,5 +13,4 @@ kms_color at invalid-gamma-lut-sizes,Fail 
 >  kms_flip at flip-vs-panning-vs-hang,Fail 
 >  kms_flip at flip-vs-suspend,Fail 
 >  kms_lease at lease-uevent,Fail 
 > -kms_properties at plane-properties-atomic,Fail 
 >  kms_rmfb at close-fd,Fail 
 > diff --git a/drivers/gpu/drm/ci/xfails/meson-g12b-fails.txt b/drivers/gpu/drm/ci/xfails/meson-g12b-fails.txt 
 > index 328967d3e23d..fc3745180683 100644 
 > --- a/drivers/gpu/drm/ci/xfails/meson-g12b-fails.txt 
 > +++ b/drivers/gpu/drm/ci/xfails/meson-g12b-fails.txt 
 > @@ -1,4 +1,3 @@ 
 > -dumb_buffer at invalid-bpp,Fail 
 >  kms_3d,Fail 
 >  kms_cursor_legacy at forked-bo,Fail 
 >  kms_cursor_legacy at forked-move,Fail 
 > diff --git a/drivers/gpu/drm/ci/xfails/msm-apq8016-fails.txt b/drivers/gpu/drm/ci/xfails/msm-apq8016-fails.txt 
 > index 4ac46168eff3..066d24ee3e08 100644 
 > --- a/drivers/gpu/drm/ci/xfails/msm-apq8016-fails.txt 
 > +++ b/drivers/gpu/drm/ci/xfails/msm-apq8016-fails.txt 
 > @@ -1,8 +1,3 @@ 
 > -device_reset at cold-reset-bound,Fail 
 > -device_reset at reset-bound,Fail 
 > -device_reset at unbind-cold-reset-rebind,Fail 
 > -device_reset at unbind-reset-rebind,Fail 
 > -dumb_buffer at invalid-bpp,Fail 
 >  kms_3d,Fail 
 >  kms_cursor_legacy at torture-bo,Fail 
 >  kms_force_connector_basic at force-edid,Fail 
 > diff --git a/drivers/gpu/drm/ci/xfails/msm-apq8096-fails.txt b/drivers/gpu/drm/ci/xfails/msm-apq8096-fails.txt 
 > index bd0653caf7a0..2893f98a6b97 100644 
 > --- a/drivers/gpu/drm/ci/xfails/msm-apq8096-fails.txt 
 > +++ b/drivers/gpu/drm/ci/xfails/msm-apq8096-fails.txt 
 > @@ -1,7 +1,2 @@ 
 > -device_reset at cold-reset-bound,Fail 
 > -device_reset at reset-bound,Fail 
 > -device_reset at unbind-cold-reset-rebind,Fail 
 > -device_reset at unbind-reset-rebind,Fail 
 > -dumb_buffer at invalid-bpp,Fail 
 >  kms_3d,Fail 
 >  kms_lease at lease-uevent,Fail 
 > diff --git a/drivers/gpu/drm/ci/xfails/msm-sc7180-trogdor-kingoftown-fails.txt b/drivers/gpu/drm/ci/xfails/msm-sc7180-trogdor-kingoftown-fails.txt 
 > index d42004cd6977..6dbc2080347d 100644 
 > --- a/drivers/gpu/drm/ci/xfails/msm-sc7180-trogdor-kingoftown-fails.txt 
 > +++ b/drivers/gpu/drm/ci/xfails/msm-sc7180-trogdor-kingoftown-fails.txt 
 > @@ -1,8 +1,3 @@ 
 > -device_reset at cold-reset-bound,Fail 
 > -device_reset at reset-bound,Fail 
 > -device_reset at unbind-cold-reset-rebind,Fail 
 > -device_reset at unbind-reset-rebind,Fail 
 > -dumb_buffer at invalid-bpp,Fail 
 >  kms_color at ctm-0-25,Fail 
 >  kms_color at ctm-0-50,Fail 
 >  kms_color at ctm-0-75,Fail 
 > @@ -11,35 +6,13 @@ kms_color at ctm-green-to-red,Fail 
 >  kms_color at ctm-negative,Fail 
 >  kms_color at ctm-red-to-blue,Fail 
 >  kms_color at ctm-signed,Fail 
 > -kms_content_protection at atomic,Crash 
 > -kms_content_protection at atomic-dpms,Crash 
 > -kms_content_protection at content-type-change,Crash 
 > -kms_content_protection at lic-type-0,Crash 
 > -kms_content_protection at lic-type-1,Crash 
 > -kms_content_protection at srm,Crash 
 > -kms_content_protection at type1,Crash 
 > -kms_content_protection at uevent,Crash 
 > -kms_cursor_legacy at 2x-cursor-vs-flip-atomic,Fail 
 > -kms_cursor_legacy at 2x-cursor-vs-flip-legacy,Fail 
 > -kms_cursor_legacy at 2x-flip-vs-cursor-atomic,Fail 
 > -kms_cursor_legacy at 2x-flip-vs-cursor-legacy,Fail 
 > -kms_cursor_legacy at 2x-long-cursor-vs-flip-atomic,Fail 
 > -kms_cursor_legacy at 2x-long-cursor-vs-flip-legacy,Fail 
 > -kms_cursor_legacy at 2x-long-flip-vs-cursor-atomic,Fail 
 > -kms_cursor_legacy at 2x-long-flip-vs-cursor-legacy,Fail 
 >  kms_cursor_legacy at cursor-vs-flip-toggle,Fail 
 >  kms_cursor_legacy at cursor-vs-flip-varying-size,Fail 
 > -kms_display_modes at extended-mode-basic,Fail 
 > -kms_flip at 2x-flip-vs-modeset-vs-hang,Fail 
 > -kms_flip at 2x-flip-vs-panning-vs-hang,Fail 
 >  kms_flip at flip-vs-modeset-vs-hang,Fail 
 >  kms_flip at flip-vs-panning-vs-hang,Fail 
 >  kms_lease at lease-uevent,Fail 
 > -kms_multipipe_modeset at basic-max-pipe-crc-check,Fail 
 >  kms_pipe_crc_basic at compare-crc-sanitycheck-nv12,Fail 
 >  kms_plane_alpha_blend at alpha-7efc,Fail 
 >  kms_plane_alpha_blend at coverage-7efc,Fail 
 >  kms_plane_alpha_blend at coverage-vs-premult-vs-constant,Fail 
 > -kms_plane_lowres at tiling-none,Fail 
 >  kms_rmfb at close-fd,Fail 
 > -kms_vblank at ts-continuation-dpms-rpm,Fail 
 > diff --git a/drivers/gpu/drm/ci/xfails/msm-sc7180-trogdor-kingoftown-skips.txt b/drivers/gpu/drm/ci/xfails/msm-sc7180-trogdor-kingoftown-skips.txt 
 > index c2833eee1c4b..8f8d8da3068c 100644 
 > --- a/drivers/gpu/drm/ci/xfails/msm-sc7180-trogdor-kingoftown-skips.txt 
 > +++ b/drivers/gpu/drm/ci/xfails/msm-sc7180-trogdor-kingoftown-skips.txt 
 > @@ -23,3 +23,63 @@ kms_flip at 2x-wf_vblank-ts-check 
 >  
 >  # Hangs the machine 
 >  kms_cursor_crc at cursor-random-max-size 
 > + 
 > +# Kernel panic 
 > +kms_setmode at invalid-clone-single-crtc-stealing 
 > +# [IGT] kms_setmode: executing 
 > +# [IGT] kms_setmode: starting subtest invalid-clone-single-crtc-stealing 
 > +# [IGT] kms_setmode: starting dynamic subtest pipe-A-eDP-1-DP-1 
 > +# Unable to handle kernel NULL pointer dereference at virtual address 0000000000000178 
 > +# Mem abort info: 
 > +#   ESR = 0x0000000096000004 
 > +#   EC = 0x25: DABT (current EL), IL = 32 bits 
 > +#   SET = 0, FnV = 0 
 > +#   EA = 0, S1PTW = 0 
 > +#   FSC = 0x04: level 0 translation fault 
 > +# Data abort info: 
 > +#   ISV = 0, ISS = 0x00000004, ISS2 = 0x00000000 
 > +#   CM = 0, WnR = 0, TnD = 0, TagAccess = 0 
 > +#   GCS = 0, Overlay = 0, DirtyBit = 0, Xs = 0 
 > +# user pgtable: 4k pages, 48-bit VAs, pgdp=000000024b2bb000 
 > +# [0000000000000178] pgd=0000000000000000, p4d=0000000000000000 
 > +# Internal error: Oops: 0000000096000004 [#1] PREEMPT SMP 
 > +# Modules linked in: 
 > +# CPU: 1 UID: 0 PID: 617 Comm: kms_setmode Not tainted 6.11.0-rc2-gee04e3109fb7 #1 
 > +# Hardware name: Google Kingoftown (DT) 
 > +# pstate: 60400009 (nZCv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=--) 
 > +# pc : drm_mode_is_420_only+0x24/0x40 
 > +# lr : drm_mode_is_420_only+0x20/0x40 
 > +# sp : ffff80008730b830 
 > +# x29: ffff80008730b830 x28: 0000000000000001 x27: ffff70b8c174b8b0 
 > +# x26: ffffb111a6a5ec60 x25: ffffb111a70ed178 x24: 0000000000000028 
 > +# x23: ffff70b8c4350480 x22: ffffb111a8e2c000 x21: ffff70b8c36eba80 
 > +# x20: ffffb111a7ce0e30 x19: 0000000000000178 x18: 0000000000000003 
 > +# x17: 000000040044ffff x16: 005000f2b5503510 x15: 0000000000000000 
 > +# x14: 0000000000040000 x13: 0000000000000000 x12: 0000000000000000 
 > +# x11: 0000000000000078 x10: 0000000000000000 x9 : ffffb111a8a23de8 
 > +# x8 : ffff80008730b828 x7 : 0000000000000000 x6 : 0000000000244140 
 > +# x5 : 00000000012e1fc0 x4 : 00000000000003e8 x3 : 0000000000000005 
 > +# x2 : 0000000000000000 x1 : 0000000000000000 x0 : 0000000000000000 
 > +# Call trace: 
 > +#  drm_mode_is_420_only+0x24/0x40 
 > +#  dpu_encoder_get_drm_fmt+0x20/0x44 
 > +#  dpu_encoder_phys_vid_enable+0x24/0x1f8 
 > +#  dpu_encoder_virt_atomic_enable+0xd4/0x234 
 > +#  drm_atomic_helper_commit_modeset_enables+0x188/0x26c 
 > +#  msm_atomic_commit_tail+0x1d8/0x688 
 > +#  commit_tail+0xa0/0x188 
 > +#  drm_atomic_helper_commit+0x190/0x1a4 
 > +#  drm_atomic_commit+0xb4/0xec 
 > +#  drm_atomic_helper_set_config+0xdc/0x114 
 > +#  drm_mode_setcrtc+0x420/0x808 
 > +#  drm_ioctl_kernel+0xbc/0x12c 
 > +#  drm_ioctl+0x230/0x4c0 
 > +#  __arm64_sys_ioctl+0xac/0xf0 
 > +#  invoke_syscall+0x48/0x110 
 > +#  el0_svc_common.constprop.0+0x40/0xe0 
 > +#  do_el0_svc+0x1c/0x28 
 > +#  el0_svc+0x4c/0x120 
 > +#  el0t_64_sync_handler+0x100/0x12c 
 > +#  el0t_64_sync+0x190/0x194 
 > +# Code: 91010273 aa0103e0 97ffad23 d3461c01 (f8617a61) 
 > +# ---[ end trace 0000000000000000 ]--- 
 > diff --git a/drivers/gpu/drm/ci/xfails/msm-sc7180-trogdor-lazor-limozeen-fails.txt b/drivers/gpu/drm/ci/xfails/msm-sc7180-trogdor-lazor-limozeen-fails.txt 
 > index d42004cd6977..6dbc2080347d 100644 
 > --- a/drivers/gpu/drm/ci/xfails/msm-sc7180-trogdor-lazor-limozeen-fails.txt 
 > +++ b/drivers/gpu/drm/ci/xfails/msm-sc7180-trogdor-lazor-limozeen-fails.txt 
 > @@ -1,8 +1,3 @@ 
 > -device_reset at cold-reset-bound,Fail 
 > -device_reset at reset-bound,Fail 
 > -device_reset at unbind-cold-reset-rebind,Fail 
 > -device_reset at unbind-reset-rebind,Fail 
 > -dumb_buffer at invalid-bpp,Fail 
 >  kms_color at ctm-0-25,Fail 
 >  kms_color at ctm-0-50,Fail 
 >  kms_color at ctm-0-75,Fail 
 > @@ -11,35 +6,13 @@ kms_color at ctm-green-to-red,Fail 
 >  kms_color at ctm-negative,Fail 
 >  kms_color at ctm-red-to-blue,Fail 
 >  kms_color at ctm-signed,Fail 
 > -kms_content_protection at atomic,Crash 
 > -kms_content_protection at atomic-dpms,Crash 
 > -kms_content_protection at content-type-change,Crash 
 > -kms_content_protection at lic-type-0,Crash 
 > -kms_content_protection at lic-type-1,Crash 
 > -kms_content_protection at srm,Crash 
 > -kms_content_protection at type1,Crash 
 > -kms_content_protection at uevent,Crash 
 > -kms_cursor_legacy at 2x-cursor-vs-flip-atomic,Fail 
 > -kms_cursor_legacy at 2x-cursor-vs-flip-legacy,Fail 
 > -kms_cursor_legacy at 2x-flip-vs-cursor-atomic,Fail 
 > -kms_cursor_legacy at 2x-flip-vs-cursor-legacy,Fail 
 > -kms_cursor_legacy at 2x-long-cursor-vs-flip-atomic,Fail 
 > -kms_cursor_legacy at 2x-long-cursor-vs-flip-legacy,Fail 
 > -kms_cursor_legacy at 2x-long-flip-vs-cursor-atomic,Fail 
 > -kms_cursor_legacy at 2x-long-flip-vs-cursor-legacy,Fail 
 >  kms_cursor_legacy at cursor-vs-flip-toggle,Fail 
 >  kms_cursor_legacy at cursor-vs-flip-varying-size,Fail 
 > -kms_display_modes at extended-mode-basic,Fail 
 > -kms_flip at 2x-flip-vs-modeset-vs-hang,Fail 
 > -kms_flip at 2x-flip-vs-panning-vs-hang,Fail 
 >  kms_flip at flip-vs-modeset-vs-hang,Fail 
 >  kms_flip at flip-vs-panning-vs-hang,Fail 
 >  kms_lease at lease-uevent,Fail 
 > -kms_multipipe_modeset at basic-max-pipe-crc-check,Fail 
 >  kms_pipe_crc_basic at compare-crc-sanitycheck-nv12,Fail 
 >  kms_plane_alpha_blend at alpha-7efc,Fail 
 >  kms_plane_alpha_blend at coverage-7efc,Fail 
 >  kms_plane_alpha_blend at coverage-vs-premult-vs-constant,Fail 
 > -kms_plane_lowres at tiling-none,Fail 
 >  kms_rmfb at close-fd,Fail 
 > -kms_vblank at ts-continuation-dpms-rpm,Fail 
 > diff --git a/drivers/gpu/drm/ci/xfails/msm-sdm845-fails.txt b/drivers/gpu/drm/ci/xfails/msm-sdm845-fails.txt 
 > index 770a1c685fde..f7539aef95f2 100644 
 > --- a/drivers/gpu/drm/ci/xfails/msm-sdm845-fails.txt 
 > +++ b/drivers/gpu/drm/ci/xfails/msm-sdm845-fails.txt 
 > @@ -1,8 +1,4 @@ 
 > -device_reset at cold-reset-bound,Fail 
 > -device_reset at reset-bound,Fail 
 > -device_reset at unbind-cold-reset-rebind,Fail 
 > -device_reset at unbind-reset-rebind,Fail 
 > -dumb_buffer at invalid-bpp,Fail 
 > +drm_read at invalid-buffer,Fail 
 >  kms_color at ctm-0-25,Fail 
 >  kms_color at ctm-0-50,Fail 
 >  kms_color at ctm-0-75,Fail 
 > @@ -11,6 +7,7 @@ kms_color at ctm-green-to-red,Fail 
 >  kms_color at ctm-negative,Fail 
 >  kms_color at ctm-red-to-blue,Fail 
 >  kms_color at ctm-signed,Fail 
 > +kms_content_protection at uevent,Crash 
 >  kms_cursor_legacy at basic-flip-before-cursor-atomic,Fail 
 >  kms_cursor_legacy at basic-flip-before-cursor-legacy,Fail 
 >  kms_cursor_legacy at cursor-vs-flip-atomic,Fail 
 > diff --git a/drivers/gpu/drm/ci/xfails/msm-sdm845-flakes.txt b/drivers/gpu/drm/ci/xfails/msm-sdm845-flakes.txt 
 > index 2aa96b1241c3..0052b2535bec 100644 
 > --- a/drivers/gpu/drm/ci/xfails/msm-sdm845-flakes.txt 
 > +++ b/drivers/gpu/drm/ci/xfails/msm-sdm845-flakes.txt 
 > @@ -116,3 +116,10 @@ kms_cursor_legacy at flip-vs-cursor-toggle 
 >  # IGT Version: 1.28-gf13702b8e 
 >  # Linux Version: 6.10.0-rc5 
 >  msm/msm_shrink at copy-mmap-oom-8 
 > + 
 > +# Board Name: sdm845-cheza-r3 
 > +# Bug Report: 
 > +# Failure Rate: 50 
 > +# IGT Version: 1.28-ga73311079 
 > +# Linux Version: 6.11.0-rc2 
 > +kms_lease at page-flip-implicit-plane 
 > diff --git a/drivers/gpu/drm/ci/xfails/rockchip-rk3288-fails.txt b/drivers/gpu/drm/ci/xfails/rockchip-rk3288-fails.txt 
 > index ea7b2ceb95b9..90282dfa19f4 100644 
 > --- a/drivers/gpu/drm/ci/xfails/rockchip-rk3288-fails.txt 
 > +++ b/drivers/gpu/drm/ci/xfails/rockchip-rk3288-fails.txt 
 > @@ -1,18 +1,24 @@ 
 > -core_setmaster at master-drop-set-root,Crash 
 >  core_setmaster at master-drop-set-user,Crash 
 > -core_setmaster_vs_auth,Crash 
 > -device_reset at cold-reset-bound,Crash 
 > -device_reset at reset-bound,Crash 
 > -device_reset at unbind-cold-reset-rebind,Crash 
 > -device_reset at unbind-reset-rebind,Crash 
 >  dumb_buffer at create-clear,Crash 
 > -dumb_buffer at invalid-bpp,Crash 
 >  fbdev at pan,Crash 
 > +kms_bw at linear-tiling-2-displays-1920x1080p,Fail 
 >  kms_cursor_crc at cursor-onscreen-32x10,Crash 
 >  kms_cursor_crc at cursor-onscreen-32x32,Crash 
 > +kms_cursor_crc at cursor-onscreen-64x64,Crash 
 >  kms_cursor_crc at cursor-random-32x10,Crash 
 > +kms_cursor_crc at cursor-sliding-32x10,Crash 
 >  kms_cursor_crc at cursor-sliding-32x32,Crash 
 > +kms_cursor_crc at cursor-sliding-64x21,Crash 
 >  kms_cursor_legacy at basic-flip-before-cursor-atomic,Fail 
 >  kms_cursor_legacy at cursor-vs-flip-legacy,Fail 
 > +kms_cursor_legacy at flip-vs-cursor-crc-atomic,Crash 
 > +kms_flip at flip-vs-panning-vs-hang,Crash 
 > +kms_invalid_mode at int-max-clock,Crash 
 > +kms_lease at invalid-create-leases,Fail 
 > +kms_pipe_crc_basic at read-crc-frame-sequence,Crash 
 > +kms_plane at pixel-format,Crash 
 > +kms_plane at pixel-format-source-clamping,Crash 
 >  kms_prop_blob at invalid-set-prop,Crash 
 > -kms_prop_blob at invalid-set-prop-any,Crash 
 > +kms_properties at get_properties-sanity-atomic,Crash 
 > +kms_properties at get_properties-sanity-non-atomic,Crash 
 > +kms_rmfb at close-fd,Crash 
 > diff --git a/drivers/gpu/drm/ci/xfails/rockchip-rk3288-flakes.txt b/drivers/gpu/drm/ci/xfails/rockchip-rk3288-flakes.txt 
 > index 7ede273aab20..7f731e4db250 100644 
 > --- a/drivers/gpu/drm/ci/xfails/rockchip-rk3288-flakes.txt 
 > +++ b/drivers/gpu/drm/ci/xfails/rockchip-rk3288-flakes.txt 
 > @@ -4,3 +4,31 @@ 
 >  # IGT Version: 1.28-gf13702b8e 
 >  # Linux Version: 6.10.0-rc5 
 >  kms_cursor_legacy at flip-vs-cursor-atomic 
 > + 
 > +# Board Name: rk3288-veyron-jaq 
 > +# Bug Report: 
 > +# Failure Rate: 100 
 > +# IGT Version: 1.28-ga73311079 
 > +# Linux Version: 6.11.0-rc2 
 > +kms_cursor_crc at cursor-offscreen-32x10 
 > + 
 > +# Board Name: rk3288-veyron-jaq 
 > +# Bug Report: 
 > +# Failure Rate: 100 
 > +# IGT Version: 1.28-ga73311079 
 > +# Linux Version: 6.11.0-rc2 
 > +kms_cursor_edge_walk at 64x64-left-edge 
 > + 
 > +# Board Name: rk3288-veyron-jaq 
 > +# Bug Report: 
 > +# Failure Rate: 100 
 > +# IGT Version: 1.28-ga73311079 
 > +# Linux Version: 6.11.0-rc2 
 > +kms_flip at plain-flip-ts-check 
 > + 
 > +# Board Name: rk3288-veyron-jaq 
 > +# Bug Report: 
 > +# Failure Rate: 100 
 > +# IGT Version: 1.28-ga73311079 
 > +# Linux Version: 6.11.0-rc2 
 > +kms_cursor_crc at cursor-alpha-opaque 
 > diff --git a/drivers/gpu/drm/ci/xfails/rockchip-rk3399-fails.txt b/drivers/gpu/drm/ci/xfails/rockchip-rk3399-fails.txt 
 > index 9309ff15e23a..10c454e48b8d 100644 
 > --- a/drivers/gpu/drm/ci/xfails/rockchip-rk3399-fails.txt 
 > +++ b/drivers/gpu/drm/ci/xfails/rockchip-rk3399-fails.txt 
 > @@ -1,9 +1,4 @@ 
 > -device_reset at cold-reset-bound,Fail 
 > -device_reset at reset-bound,Fail 
 > -device_reset at unbind-cold-reset-rebind,Fail 
 > -device_reset at unbind-reset-rebind,Fail 
 >  dumb_buffer at create-clear,Crash 
 > -dumb_buffer at invalid-bpp,Fail 
 >  kms_atomic_transition at modeset-transition,Fail 
 >  kms_atomic_transition at modeset-transition-fencing,Fail 
 >  kms_atomic_transition at plane-toggle-modeset-transition,Fail 
 > diff --git a/drivers/gpu/drm/ci/xfails/rockchip-rk3399-flakes.txt b/drivers/gpu/drm/ci/xfails/rockchip-rk3399-flakes.txt 
 > index d98f6a17343c..85c18580372f 100644 
 > --- a/drivers/gpu/drm/ci/xfails/rockchip-rk3399-flakes.txt 
 > +++ b/drivers/gpu/drm/ci/xfails/rockchip-rk3399-flakes.txt 
 > @@ -46,3 +46,10 @@ kms_setmode at basic 
 >  # IGT Version: 1.28-gf13702b8e 
 >  # Linux Version: 6.10.0-rc5 
 >  kms_bw at connected-linear-tiling-1-displays-2560x1440p 
 > + 
 > +# Board Name: rk3399-gru-kevin 
 > +# Bug Report: 
 > +# Failure Rate: 50 
 > +# IGT Version: 1.28-ga73311079 
 > +# Linux Version: 6.11.0-rc2 
 > +kms_flip at wf_vblank-ts-check 
 > diff --git a/drivers/gpu/drm/ci/xfails/vkms-none-fails.txt b/drivers/gpu/drm/ci/xfails/vkms-none-fails.txt 
 > index 5408110f4c60..71c02104a683 100644 
 > --- a/drivers/gpu/drm/ci/xfails/vkms-none-fails.txt 
 > +++ b/drivers/gpu/drm/ci/xfails/vkms-none-fails.txt 
 > @@ -1,24 +1,3 @@ 
 > -core_hotunplug at hotrebind,Fail 
 > -core_hotunplug at hotrebind-lateclose,Fail 
 > -core_hotunplug at hotreplug,Fail 
 > -core_hotunplug at hotreplug-lateclose,Fail 
 > -core_hotunplug at hotunbind-rebind,Fail 
 > -core_hotunplug at hotunplug-rescan,Fail 
 > -core_hotunplug at unbind-rebind,Fail 
 > -core_hotunplug at unplug-rescan,Fail 
 > -device_reset at cold-reset-bound,Fail 
 > -device_reset at reset-bound,Fail 
 > -device_reset at unbind-cold-reset-rebind,Fail 
 > -device_reset at unbind-reset-rebind,Fail 
 > -dumb_buffer at invalid-bpp,Fail 
 > -kms_content_protection at atomic,Crash 
 > -kms_content_protection at atomic-dpms,Crash 
 > -kms_content_protection at content-type-change,Crash 
 > -kms_content_protection at lic-type-0,Crash 
 > -kms_content_protection at lic-type-1,Crash 
 > -kms_content_protection at srm,Crash 
 > -kms_content_protection at type1,Crash 
 > -kms_content_protection at uevent,Crash 


Awesome!

Acked-by: Helen Koike <helen.koike at collabora.com>

Thanks
Helen


 >  kms_cursor_crc at cursor-rapid-movement-128x128,Fail 
 >  kms_cursor_crc at cursor-rapid-movement-128x42,Fail 
 >  kms_cursor_crc at cursor-rapid-movement-256x256,Fail 
 > -- 
 > 2.43.0 
 >  
 > 


From benjamin.larsson at genexis.eu  Thu Sep  5 05:18:41 2024
From: benjamin.larsson at genexis.eu (Benjamin Larsson)
Date: Thu, 5 Sep 2024 14:18:41 +0200
Subject: [PATCH v3 5/5] pwm: airoha: Add support for EN7581 SoC
In-Reply-To: <xmlta4za6malgthd6cmt5fcipxgyzwmqwxqdg5e4qahcuqzcrt@eidsf6mexrkz>
References: <20240831-en7581-pinctrl-v3-0-98eebfb4da66@kernel.org>
 <20240831-en7581-pinctrl-v3-5-98eebfb4da66@kernel.org>
 <yfqmlca6cnhrghpo5s6tml36tngmekcfbyjakxs7or7wtap3ka@7qlrxjowo4ou>
 <d9298199-fe10-4b28-8e28-dc252bd6832c@genexis.eu>
 <t2f5kockuvfi66qqumda6jxf5a4c4zf35ld5ainsnksavkchyj@kdueaqlhjoar>
 <b7e44fb2-6cf6-4530-a271-9e1730d4f431@genexis.eu>
 <xmlta4za6malgthd6cmt5fcipxgyzwmqwxqdg5e4qahcuqzcrt@eidsf6mexrkz>
Message-ID: <a0a14b57-cc4e-43ef-984f-fb405949b41d@genexis.eu>

On 2024-09-05 11:30, Uwe Kleine-K?nig wrote:
> 1 second long pulses with a period size of 1 second, so a constant high
> signal?

Hi, I think I was unclear. The SoC documentation is not that detailed. 
But I think I understand how it works now.

One register contains the minimum duration (d_min). And then there is 
one 8 bit register for the signal low period (lp) and then another 8bit 
register for the high period (hp). Per my understanding a change of 
polarity is then just a swap of lp and hp.

The period is d_min * (lp + hp) and duty_cycle (on time) is then 
d_min*hp (per my understanding of the linux api). This means that there 
can be different settings that result in the same pwm signal (if you 
double d_min and halving lp and hp the signal should be the same).

This means that when requesting a period and duty cycle you need to 
search through the configuration space to find the optimal value.

>
> Another thing that would be interesting is, if it can happen that you
> get a mixed signal. That is, if you update from
>
> 	.period = A
> 	.duty_cycle = B
>
> to
>
> 	.period = C
> 	.duty_cycle = D
>
> that you get one period with length C and duty_cycle B when the period
> completes after configuring period but before duty_cycle.
>
> Best regards
> UWe

I will perform this test also.

MvH

Benjamin Larsson



From liankun.yang at mediatek.com  Thu Sep  5 05:40:02 2024
From: liankun.yang at mediatek.com (Liankun Yang)
Date: Thu, 5 Sep 2024 20:40:02 +0800
Subject: [PATCH v4 1/1] drm/mediatek: Fix get efuse issue for MT8188 DPTX
Message-ID: <20240905124041.3658-1-liankun.yang@mediatek.com>

Update efuse data for MT8188 displayport.

The DP monitor can not display when DUT connected to USB-c to DP dongle.
Analysis view is invalid DP efuse data.

Fixes: 350c3fe907fb ("drm/mediatek: dp: Add support MT8188 dp/edp function")
Reviewed-by: Matthias Brugger <matthias.bgg at gmail.com>
Signed-off-by: Liankun Yang <liankun.yang at mediatek.com>
---
Changes in V4:
- Remove excess newlines.
Per suggestion from the previous thread:
https://patchwork.kernel.org/project/linux-mediatek/patch/20240903121028.20689-1-liankun.yang at mediatek.com/

Changes in V3
- Update change log position in commit message.
Per suggestion from the previous thread:
https://patchwork.kernel.org/project/linux-mediatek/patch/20240902133736.16461-1-liankun.yang at mediatek.com/

Changes in V2
- Add Fixes tag.
- Update the commit title.
- Update the commit description.
Per suggestion from the previous thread:
https://patchwork.kernel.org/project/linux-mediatek/patch/20240510061716.31103-1-liankun.yang at mediatek.com/
---
 drivers/gpu/drm/mediatek/mtk_dp.c | 85 ++++++++++++++++++++++++++++++-
 1 file changed, 84 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/mediatek/mtk_dp.c b/drivers/gpu/drm/mediatek/mtk_dp.c
index d8796a904eca..f2bee617f063 100644
--- a/drivers/gpu/drm/mediatek/mtk_dp.c
+++ b/drivers/gpu/drm/mediatek/mtk_dp.c
@@ -145,6 +145,89 @@ struct mtk_dp_data {
 	u16 audio_m_div2_bit;
 };
 
+static const struct mtk_dp_efuse_fmt mt8188_dp_efuse_fmt[MTK_DP_CAL_MAX] = {
+	[MTK_DP_CAL_GLB_BIAS_TRIM] = {
+		.idx = 0,
+		.shift = 10,
+		.mask = 0x1f,
+		.min_val = 1,
+		.max_val = 0x1e,
+		.default_val = 0xf,
+	},
+	[MTK_DP_CAL_CLKTX_IMPSE] = {
+		.idx = 0,
+		.shift = 15,
+		.mask = 0xf,
+		.min_val = 1,
+		.max_val = 0xe,
+		.default_val = 0x8,
+	},
+	[MTK_DP_CAL_LN_TX_IMPSEL_PMOS_0] = {
+		.idx = 1,
+		.shift = 0,
+		.mask = 0xf,
+		.min_val = 1,
+		.max_val = 0xe,
+		.default_val = 0x8,
+	},
+	[MTK_DP_CAL_LN_TX_IMPSEL_PMOS_1] = {
+		.idx = 1,
+		.shift = 8,
+		.mask = 0xf,
+		.min_val = 1,
+		.max_val = 0xe,
+		.default_val = 0x8,
+	},
+	[MTK_DP_CAL_LN_TX_IMPSEL_PMOS_2] = {
+		.idx = 1,
+		.shift = 16,
+		.mask = 0xf,
+		.min_val = 1,
+		.max_val = 0xe,
+		.default_val = 0x8,
+	},
+	[MTK_DP_CAL_LN_TX_IMPSEL_PMOS_3] = {
+		.idx = 1,
+		.shift = 24,
+		.mask = 0xf,
+		.min_val = 1,
+		.max_val = 0xe,
+		.default_val = 0x8,
+	},
+	[MTK_DP_CAL_LN_TX_IMPSEL_NMOS_0] = {
+		.idx = 1,
+		.shift = 4,
+		.mask = 0xf,
+		.min_val = 1,
+		.max_val = 0xe,
+		.default_val = 0x8,
+	},
+	[MTK_DP_CAL_LN_TX_IMPSEL_NMOS_1] = {
+		.idx = 1,
+		.shift = 12,
+		.mask = 0xf,
+		.min_val = 1,
+		.max_val = 0xe,
+		.default_val = 0x8,
+	},
+	[MTK_DP_CAL_LN_TX_IMPSEL_NMOS_2] = {
+		.idx = 1,
+		.shift = 20,
+		.mask = 0xf,
+		.min_val = 1,
+		.max_val = 0xe,
+		.default_val = 0x8,
+	},
+	[MTK_DP_CAL_LN_TX_IMPSEL_NMOS_3] = {
+		.idx = 1,
+		.shift = 28,
+		.mask = 0xf,
+		.min_val = 1,
+		.max_val = 0xe,
+		.default_val = 0x8,
+	},
+};
+
 static const struct mtk_dp_efuse_fmt mt8195_edp_efuse_fmt[MTK_DP_CAL_MAX] = {
 	[MTK_DP_CAL_GLB_BIAS_TRIM] = {
 		.idx = 3,
@@ -2771,7 +2854,7 @@ static SIMPLE_DEV_PM_OPS(mtk_dp_pm_ops, mtk_dp_suspend, mtk_dp_resume);
 static const struct mtk_dp_data mt8188_dp_data = {
 	.bridge_type = DRM_MODE_CONNECTOR_DisplayPort,
 	.smc_cmd = MTK_DP_SIP_ATF_VIDEO_UNMUTE,
-	.efuse_fmt = mt8195_dp_efuse_fmt,
+	.efuse_fmt = mt8188_dp_efuse_fmt,
 	.audio_supported = true,
 	.audio_pkt_in_hblank_area = true,
 	.audio_m_div2_bit = MT8188_AUDIO_M_CODE_MULT_DIV_SEL_DP_ENC0_P0_DIV_2,
-- 
2.45.2



From kvalo at kernel.org  Thu Sep  5 06:33:24 2024
From: kvalo at kernel.org (Kalle Valo)
Date: Thu, 05 Sep 2024 16:33:24 +0300
Subject: [PATCH] wifi: mt76: mt7921: fix null pointer access in
 mt792x_mac_link_bss_remove
In-Reply-To: <CAHbf0-HbLRRhtUEj1TDzemePoaLo71sxMFDN526HPEB_zO+4ow@mail.gmail.com>
	(Mike Lothian's message of "Thu, 29 Aug 2024 17:52:36 +0100")
References: <20240718234633.12737-1-sean.wang@kernel.org>
	<0124ff39-7d63-49f8-bacd-3a40ce37ec4d@leemhuis.info>
	<CAHbf0-Hn=ZyYpk7bS1yLK7K3ZpfWKgt3-t=c9Nhdj3Ov3H84mQ@mail.gmail.com>
	<f7197c55d059cc8ddbf6c3def16dc414c5ec0b42.camel@web.de>
	<CAHbf0-EBHERbxPGakY4-1jTQWqGqua3F0OYZjxcakdemJ5Soqw@mail.gmail.com>
	<51e80bde6e3f3256ecdea2e5260463341e65578e.camel@web.de>
	<CAHbf0-HYi=x11bc-sMJFbZ4cbkdphMYQ_hjzD_wrPvJevVwyYg@mail.gmail.com>
	<980698e0d6dfa1e0043edfed6e174ff17705e053.camel@web.de>
	<CAHbf0-FfAQhuu1TgQ_jVcxPqLsF-ON8vC1QJ=mNhis44dYWufw@mail.gmail.com>
	<d657110b726646efa972c5e83bfce6c6b1627626.camel@web.de>
	<CAHbf0-ETMTYs+T=qkLd=Y-W1ssQq1ZMDkxqHCJPSYA9U9CCgHw@mail.gmail.com>
	<CAHbf0-HbLRRhtUEj1TDzemePoaLo71sxMFDN526HPEB_zO+4ow@mail.gmail.com>
Message-ID: <8734mecjiz.fsf@kernel.org>

Mike Lothian <mike at fireburn.co.uk> writes:

>> > this seems to be exactly the same error as I had (It can also be actively
>> > provoked by "nmcli radio wifi off"), but in my case commit 479ffee68d59c599 is
>> > enough to fix the issue. Can you please double check that your faulty kernel
>> > does not include this commit. If it does and you still get the error I can post
>> > the fix to the list.
>>
>> 479ffee68d59c599 isn't enough to fix it here, I've been applying the
>> second patch since it was pointed out
>
> Sorry I've gotten myself confused as the patches changed
>
> My kernel with
> 6557a28f3e3a54cff4f0dcdd1dfa649b26557ab3
> 479ffee68d59c599f8aed8fa2dcc8e13e7bd13c3
>
> Is enough to fix things
>
> I've been applying  the old fix on top which was only applying
>
> @@ -1206,6 +1206,9 @@ static void mt7921_ipv6_addr_change(struct
> ieee80211_hw *hw,
>                },
>        };
>
> +       if (!mvif->phy)
> +               return;
> +
>        read_lock_bh(&idev->lock);
>        list_for_each_entry(ifa, &idev->addr_list, if_list) {
>                if (ifa->flags & IFA_F_TENTATIVE)
>
> Casing it to be rebuilt each time

So just to confirm: all fixes are now applied to the tree and we don't
have any missing fixes?

-- 
https://patchwork.kernel.org/project/linux-wireless/list/

https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches


From wenst at chromium.org  Thu Sep  5 08:10:34 2024
From: wenst at chromium.org (Chen-Yu Tsai)
Date: Thu, 5 Sep 2024 23:10:34 +0800
Subject: [PATCH v6 09/12] i2c: of-prober: Add regulator support
In-Reply-To: <CAD=FV=UGOz3Xzg7reJKP=tA1LqTxszv5w-CL9krmoXQtXdJLaQ@mail.gmail.com>
References: <20240904090016.2841572-1-wenst@chromium.org> <20240904090016.2841572-10-wenst@chromium.org>
 <CAD=FV=UGOz3Xzg7reJKP=tA1LqTxszv5w-CL9krmoXQtXdJLaQ@mail.gmail.com>
Message-ID: <CAGXv+5F27K76t=ht5v75jKsNF-J+C0r5+m=czHz6PtV3t5DxcQ@mail.gmail.com>

On Thu, Sep 5, 2024 at 6:57?AM Doug Anderson <dianders at chromium.org> wrote:
>
> Hi,
>
> On Wed, Sep 4, 2024 at 2:01?AM Chen-Yu Tsai <wenst at chromium.org> wrote:
> >
> > This adds regulator management to the I2C OF component prober.
> > Components that the prober intends to probe likely require their
> > regulator supplies be enabled, and GPIOs be toggled to enable them or
> > bring them out of reset before they will respond to probe attempts.
> > GPIOs will be handled in the next patch.
> >
> > Without specific knowledge of each component's resource names or
> > power sequencing requirements, the prober can only enable the
> > regulator supplies all at once, and toggle the GPIOs all at once.
> > Luckily, reset pins tend to be active low, while enable pins tend to
> > be active high, so setting the raw status of all GPIO pins to high
> > should work. The wait time before and after resources are enabled
> > are collected from existing drivers and device trees.
> >
> > The prober collects resources from all possible components and enables
> > them together, instead of enabling resources and probing each component
> > one by one. The latter approach does not provide any boot time benefits
> > over simply enabling each component and letting each driver probe
> > sequentially.
> >
> > The prober will also deduplicate the resources, since on a component
> > swap out or co-layout design, the resources are always the same.
> > While duplicate regulator supplies won't cause much issue, shared
> > GPIOs don't work reliably, especially with other drivers. For the
> > same reason, the prober will release the GPIOs before the successfully
> > probed component is actually enabled.
> >
> > Signed-off-by: Chen-Yu Tsai <wenst at chromium.org>
> > ---
> > Changes since v5:
> > - Split of_regulator_bulk_get_all() return value check and explain
> >   "ret == 0" case
> > - Switched to of_get_next_child_with_prefix_scoped() where applicable
> > - Used krealloc_array() instead of directly calculating size
> > - copy whole regulator array in one memcpy() call
> > - Drop "0" from struct zeroing initializer
> > - Split out regulator helper from i2c_of_probe_enable_res() to keep
> >   code cleaner when combined with the next patch
> > - Added options for customizing power sequencing delay
> > - Rename i2c_of_probe_get_regulator() to i2c_of_probe_get_regulators()
> > - Add i2c_of_probe_free_regulator() helper
> >
> > Changes since v4:
> > - Split out GPIO handling to separate patch
> > - Rewrote using of_regulator_bulk_get_all()
> > - Replaced "regulators" with "regulator supplies" in debug messages
> >
> > Changes since v3:
> > - New patch
> >
> > This change is kept as a separate patch for now since the changes are
> > quite numerous.
> > ---
> >  drivers/i2c/i2c-core-of-prober.c | 154 +++++++++++++++++++++++++++++--
> >  include/linux/i2c.h              |  10 +-
> >  2 files changed, 155 insertions(+), 9 deletions(-)
>
> I never jumped back into looking at this since you started sending new
> versions last month (sorry), but I finally did...
>
> At a high level, I have to say I'm not really a fan of the "reach into
> all of the devices, jam their regulators on, force their GPIOs high,
> and hope for the best" approach. It just feels like it's going to
> break at the first bit of slightly different hardware and cause power
> sequence violations left and right. If nothing else, regulators often
> need delays between when one regulator is enabled and the next. There
> may also be complex relationships between regulators and GPIOs, GPIOs,
> GPIOs that need to be low, or even GPIO "toggle sequences" (power on
> rail 1, wait 1 ms, assert reset, wait 10 ms, deassert reset, power on
> rail 2).
>
> IMO the only way to make this reliable is to have this stuff be much
> less automatic and much more driven by the board.
>
> I think that, in general, before the board prober checks i2c address
> then the prober should be in charge of setting up pinctrl and turning
> on regulators / GPIOs. Given that the same regulator(s) and GPIO(s)
> may be specified by different children, the prober will just have to
> pick one child to find those resources. It should have enough
> board-specific knowledge to make this choice. Then the prober should
> turn them on via a board-specific power-on sequence that's known to
> work for all the children. Then it should start probing.
>
> I think there can still be plenty of common helper functions that the
> board-specific prober can leverage, but overall I'd expect the actual
> power-on and power-off code to be board-specific.
>
> If many boards have in common that we need to turn on exactly one
> regulator + one GPIO, or just one regulator, or whatever then having a
> helper function that handles these cases is fine. ...but it should be
> one of many choices that a board proper could use and not the only
> one.

IIUC we could have the "options" data structure have much more board
specific information:

  - name of node to fetch resources (regulator supplies and GPIOs) from
  - names of the resources for the node given from the previous item
  - delay time after each resource is toggled
  - polarity in the case of GPIOs
  - prober callback to do power sequencing

The "resource collection" step would use the first two items to retrieve
the regulator supplies and GPIOS instead of the bulk APIs used right now.

The power sequencing callback would use the resources combined with the
given delays to enable the supplies and toggle the GPIOs.

For now I would probably only implement a generic one regulator supply
plus one GPIO helper. That is the common case for touchscreens and
trackpads connected over a ribbon cable.

Does that sound like what you have in mind?


This next item would be a later enhancement (which isn't implemented in
this series anyway):

  - optional prober callback that does actual probing

In our case it would only be used for cases where an HID-over-I2C
component shares the same address as a non-HID one, and some extra
work is needed to determine which type it is. I still need to think
about the structure of this.


Thanks
ChenYu


From u.kleine-koenig at baylibre.com  Thu Sep  5 08:39:52 2024
From: u.kleine-koenig at baylibre.com (Uwe =?utf-8?Q?Kleine-K=C3=B6nig?=)
Date: Thu, 5 Sep 2024 17:39:52 +0200
Subject: [PATCH v3 5/5] pwm: airoha: Add support for EN7581 SoC
In-Reply-To: <a0a14b57-cc4e-43ef-984f-fb405949b41d@genexis.eu>
References: <20240831-en7581-pinctrl-v3-0-98eebfb4da66@kernel.org>
 <20240831-en7581-pinctrl-v3-5-98eebfb4da66@kernel.org>
 <yfqmlca6cnhrghpo5s6tml36tngmekcfbyjakxs7or7wtap3ka@7qlrxjowo4ou>
 <d9298199-fe10-4b28-8e28-dc252bd6832c@genexis.eu>
 <t2f5kockuvfi66qqumda6jxf5a4c4zf35ld5ainsnksavkchyj@kdueaqlhjoar>
 <b7e44fb2-6cf6-4530-a271-9e1730d4f431@genexis.eu>
 <xmlta4za6malgthd6cmt5fcipxgyzwmqwxqdg5e4qahcuqzcrt@eidsf6mexrkz>
 <a0a14b57-cc4e-43ef-984f-fb405949b41d@genexis.eu>
Message-ID: <64zfjgmc2dutmsukg2bxhb44k3wu2y7tt3h26hej7d4fx5nc7z@5zvo3hsucipc>

Hello Benjamin,

On Thu, Sep 05, 2024 at 02:18:41PM +0200, Benjamin Larsson wrote:
> On 2024-09-05 11:30, Uwe Kleine-K?nig wrote:
> > 1 second long pulses with a period size of 1 second, so a constant high
> > signal?
> 
> Hi, I think I was unclear. The SoC documentation is not that detailed. But I
> think I understand how it works now.
> 
> One register contains the minimum duration (d_min). And then there is one 8
> bit register for the signal low period (lp) and then another 8bit register
> for the high period (hp). Per my understanding a change of polarity is then
> just a swap of lp and hp.

that doesn't sound right.

A "normal" waveform with period = 10 ns and duty_cycle = 2 ns looks as
follows:

   _         _         _
  / \_______/ \_______/ \_______/ 
  ^         ^         ^         ^

assuming a monospace font that's 1 char per ns, the ^ marking the period
start.

Ignoring scaling, your hardware needs to have hp = 2 and lp = 8. If you
switch that (assuming you mean switching in the same way as I do) to hp
= 8 and lp = 2, you get:

   _______   _______   _______
  /       \_/       \_/       \_/
  ^         ^         ^         ^

which is still a "normal" polarity output as a period starts with the
active part.

I admit that's a bit artificial, because the waveform for

	period = 10 ns
	duty_cycle = 2 ns
	polarity = inversed

looks as follows:

     _______   _______   _______
  \_/       \_/       \_/       \_/
  ^         ^         ^         ^

which isn't any different from the 2nd waveform above if you ignore the
period start markers (which are not observable apart from the moments
where you reconfigure the output).

However it matters if you have a chip with >1 output that are not
independent.

> The period is d_min * (lp + hp) and duty_cycle (on time) is then d_min*hp
> (per my understanding of the linux api). This means that there can be
> different settings that result in the same pwm signal (if you double d_min
> and halving lp and hp the signal should be the same).

Sounds correct.

> This means that when requesting a period and duty cycle you need to search
> through the configuration space to find the optimal value.

Or restrict yourself consistently to something simpler than a exhaustive
search through the complete configuration space.

> MvH

(BTW, I had to research the meaning of MvH. In case someone else doesn't
know it: It's the usual abbreviation for "Med v?nliga h?lsningar" in
Sweden or "Med vennlig hilsen" in Norway; both meaning "With friendly
greetings".)

Best regards
Uwe
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-mediatek/attachments/20240905/b9446535/attachment.sig>

From mathieu.poirier at linaro.org  Thu Sep  5 09:22:59 2024
From: mathieu.poirier at linaro.org (Mathieu Poirier)
Date: Thu, 5 Sep 2024 10:22:59 -0600
Subject: [PATCH] remoteproc:remove redundant dev_err message
In-Reply-To: <20240904185417.14357-1-liujing@cmss.chinamobile.com>
References: <20240904185417.14357-1-liujing@cmss.chinamobile.com>
Message-ID: <Ztna4xyKbOJTw5C1@p14s>

On Thu, Sep 05, 2024 at 02:54:17AM +0800, Liu Jing wrote:
> devm_ioremap_resource already contains error message, so remove
> the redundant dev_err message
> 
> Signed-off-by: Liu Jing <liujing at cmss.chinamobile.com>
> 
> diff --git a/drivers/remoteproc/da8xx_remoteproc.c b/drivers/remoteproc/da8xx_remoteproc.c
> index 9041a0e07fb2..289d5ce9f7af 100644
> --- a/drivers/remoteproc/da8xx_remoteproc.c
> +++ b/drivers/remoteproc/da8xx_remoteproc.c
> @@ -214,8 +214,6 @@ static int da8xx_rproc_get_internal_memories(struct platform_device *pdev,
>  						   mem_names[i]);
>  		drproc->mem[i].cpu_addr = devm_ioremap_resource(dev, res);
>  		if (IS_ERR(drproc->mem[i].cpu_addr)) {
> -			dev_err(dev, "failed to parse and map %s memory\n",
> -				mem_names[i]);
>  			return PTR_ERR(drproc->mem[i].cpu_addr);
>  		}
>  		drproc->mem[i].bus_addr = res->start;
> diff --git a/drivers/remoteproc/ingenic_rproc.c b/drivers/remoteproc/ingenic_rproc.c
> index 9902cce28692..b3ee5c47001d 100644
> --- a/drivers/remoteproc/ingenic_rproc.c
> +++ b/drivers/remoteproc/ingenic_rproc.c
> @@ -186,7 +186,6 @@ static int ingenic_rproc_probe(struct platform_device *pdev)
>  	mem = platform_get_resource_byname(pdev, IORESOURCE_MEM, "aux");
>  	vpu->aux_base = devm_ioremap_resource(dev, mem);
>  	if (IS_ERR(vpu->aux_base)) {
> -		dev_err(dev, "Failed to ioremap\n");
>  		return PTR_ERR(vpu->aux_base);
>  	}
>  
> @@ -197,7 +196,6 @@ static int ingenic_rproc_probe(struct platform_device *pdev)
>  		vpu->mem_info[i].base = devm_ioremap_resource(dev, mem);
>  		if (IS_ERR(vpu->mem_info[i].base)) {
>  			ret = PTR_ERR(vpu->mem_info[i].base);
> -			dev_err(dev, "Failed to ioremap\n");
>  			return ret;
>  		}
>  
> diff --git a/drivers/remoteproc/keystone_remoteproc.c b/drivers/remoteproc/keystone_remoteproc.c
> index 7e57b90bcaf8..a31f94a290c9 100644
> --- a/drivers/remoteproc/keystone_remoteproc.c
> +++ b/drivers/remoteproc/keystone_remoteproc.c
> @@ -312,8 +312,6 @@ static int keystone_rproc_of_get_memories(struct platform_device *pdev,
>  						   mem_names[i]);
>  		ksproc->mem[i].cpu_addr = devm_ioremap_resource(dev, res);
>  		if (IS_ERR(ksproc->mem[i].cpu_addr)) {
> -			dev_err(dev, "failed to parse and map %s memory\n",
> -				mem_names[i]);
>  			return PTR_ERR(ksproc->mem[i].cpu_addr);
>  		}
>  		ksproc->mem[i].bus_addr = res->start;
> diff --git a/drivers/remoteproc/mtk_scp.c b/drivers/remoteproc/mtk_scp.c
> index e744c07507ee..cb8ad16583c7 100644
> --- a/drivers/remoteproc/mtk_scp.c
> +++ b/drivers/remoteproc/mtk_scp.c
> @@ -1126,7 +1126,6 @@ static struct mtk_scp *scp_rproc_init(struct platform_device *pdev,
>  	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "sram");
>  	scp->sram_base = devm_ioremap_resource(dev, res);
>  	if (IS_ERR(scp->sram_base)) {
> -		dev_err(dev, "Failed to parse and map sram memory\n");
>  		return ERR_CAST(scp->sram_base);
>  	}

There is another instance in the Mediatek driver - please address.

Thanks,
Mathieu

>  
> diff --git a/drivers/remoteproc/omap_remoteproc.c b/drivers/remoteproc/omap_remoteproc.c
> index 9ae2e831456d..07e707776cf9 100644
> --- a/drivers/remoteproc/omap_remoteproc.c
> +++ b/drivers/remoteproc/omap_remoteproc.c
> @@ -1201,8 +1201,6 @@ static int omap_rproc_of_get_internal_memories(struct platform_device *pdev,
>  		}
>  		oproc->mem[i].cpu_addr = devm_ioremap_resource(dev, res);
>  		if (IS_ERR(oproc->mem[i].cpu_addr)) {
> -			dev_err(dev, "failed to parse and map %s memory\n",
> -				data->mems[i].name);
>  			return PTR_ERR(oproc->mem[i].cpu_addr);
>  		}
>  		oproc->mem[i].bus_addr = res->start;
> diff --git a/drivers/remoteproc/pru_rproc.c b/drivers/remoteproc/pru_rproc.c
> index 327f0c7ee3d6..85b95e025c17 100644
> --- a/drivers/remoteproc/pru_rproc.c
> +++ b/drivers/remoteproc/pru_rproc.c
> @@ -1047,8 +1047,6 @@ static int pru_rproc_probe(struct platform_device *pdev)
>  						   mem_names[i]);
>  		pru->mem_regions[i].va = devm_ioremap_resource(dev, res);
>  		if (IS_ERR(pru->mem_regions[i].va)) {
> -			dev_err(dev, "failed to parse and map memory resource %d %s\n",
> -				i, mem_names[i]);
>  			ret = PTR_ERR(pru->mem_regions[i].va);
>  			return ret;
>  		}
> diff --git a/drivers/remoteproc/qcom_q6v5_adsp.c b/drivers/remoteproc/qcom_q6v5_adsp.c
> index 572dcb0f055b..fe65ffa9a93f 100644
> --- a/drivers/remoteproc/qcom_q6v5_adsp.c
> +++ b/drivers/remoteproc/qcom_q6v5_adsp.c
> @@ -602,7 +602,6 @@ static int adsp_init_mmio(struct qcom_adsp *adsp,
>  	} else {
>  		adsp->lpass_efuse = devm_ioremap_resource(&pdev->dev, efuse_region);
>  		if (IS_ERR(adsp->lpass_efuse)) {
> -			dev_err(adsp->dev, "failed to map efuse registers\n");
>  			return PTR_ERR(adsp->lpass_efuse);
>  		}
>  	}
> diff --git a/drivers/remoteproc/st_slim_rproc.c b/drivers/remoteproc/st_slim_rproc.c
> index d17719384c16..a6e50f51c794 100644
> --- a/drivers/remoteproc/st_slim_rproc.c
> +++ b/drivers/remoteproc/st_slim_rproc.c
> @@ -251,7 +251,6 @@ struct st_slim_rproc *st_slim_rproc_alloc(struct platform_device *pdev,
>  
>  		slim_rproc->mem[i].cpu_addr = devm_ioremap_resource(dev, res);
>  		if (IS_ERR(slim_rproc->mem[i].cpu_addr)) {
> -			dev_err(&pdev->dev, "devm_ioremap_resource failed\n");
>  			err = PTR_ERR(slim_rproc->mem[i].cpu_addr);
>  			goto err;
>  		}
> @@ -262,7 +261,6 @@ struct st_slim_rproc *st_slim_rproc_alloc(struct platform_device *pdev,
>  	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "slimcore");
>  	slim_rproc->slimcore = devm_ioremap_resource(dev, res);
>  	if (IS_ERR(slim_rproc->slimcore)) {
> -		dev_err(&pdev->dev, "failed to ioremap slimcore IO\n");
>  		err = PTR_ERR(slim_rproc->slimcore);
>  		goto err;
>  	}
> @@ -270,7 +268,6 @@ struct st_slim_rproc *st_slim_rproc_alloc(struct platform_device *pdev,
>  	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "peripherals");
>  	slim_rproc->peri = devm_ioremap_resource(dev, res);
>  	if (IS_ERR(slim_rproc->peri)) {
> -		dev_err(&pdev->dev, "failed to ioremap peripherals IO\n");
>  		err = PTR_ERR(slim_rproc->peri);
>  		goto err;
>  	}
> diff --git a/drivers/remoteproc/wkup_m3_rproc.c b/drivers/remoteproc/wkup_m3_rproc.c
> index 36a55f7ffa64..5648f450c018 100644
> --- a/drivers/remoteproc/wkup_m3_rproc.c
> +++ b/drivers/remoteproc/wkup_m3_rproc.c
> @@ -186,8 +186,6 @@ static int wkup_m3_rproc_probe(struct platform_device *pdev)
>  						   mem_names[i]);
>  		wkupm3->mem[i].cpu_addr = devm_ioremap_resource(dev, res);
>  		if (IS_ERR(wkupm3->mem[i].cpu_addr)) {
> -			dev_err(&pdev->dev, "devm_ioremap_resource failed for resource %d\n",
> -				i);
>  			ret = PTR_ERR(wkupm3->mem[i].cpu_addr);
>  			goto err_put_rproc;
>  		}
> -- 
> 2.33.0
> 
> 
> 


From dianders at chromium.org  Thu Sep  5 11:14:58 2024
From: dianders at chromium.org (Doug Anderson)
Date: Thu, 5 Sep 2024 11:14:58 -0700
Subject: [PATCH v6 09/12] i2c: of-prober: Add regulator support
In-Reply-To: <CAGXv+5F27K76t=ht5v75jKsNF-J+C0r5+m=czHz6PtV3t5DxcQ@mail.gmail.com>
References: <20240904090016.2841572-1-wenst@chromium.org> <20240904090016.2841572-10-wenst@chromium.org>
 <CAD=FV=UGOz3Xzg7reJKP=tA1LqTxszv5w-CL9krmoXQtXdJLaQ@mail.gmail.com> <CAGXv+5F27K76t=ht5v75jKsNF-J+C0r5+m=czHz6PtV3t5DxcQ@mail.gmail.com>
Message-ID: <CAD=FV=XVrAdQN8p9QJtt3Ah_YQAG7Y-D4wDx8_+qb1EGN7+Uig@mail.gmail.com>

Hi,

On Thu, Sep 5, 2024 at 8:10?AM Chen-Yu Tsai <wenst at chromium.org> wrote:
>
> On Thu, Sep 5, 2024 at 6:57?AM Doug Anderson <dianders at chromium.org> wrote:
> >
> > Hi,
> >
> > On Wed, Sep 4, 2024 at 2:01?AM Chen-Yu Tsai <wenst at chromium.org> wrote:
> > >
> > > This adds regulator management to the I2C OF component prober.
> > > Components that the prober intends to probe likely require their
> > > regulator supplies be enabled, and GPIOs be toggled to enable them or
> > > bring them out of reset before they will respond to probe attempts.
> > > GPIOs will be handled in the next patch.
> > >
> > > Without specific knowledge of each component's resource names or
> > > power sequencing requirements, the prober can only enable the
> > > regulator supplies all at once, and toggle the GPIOs all at once.
> > > Luckily, reset pins tend to be active low, while enable pins tend to
> > > be active high, so setting the raw status of all GPIO pins to high
> > > should work. The wait time before and after resources are enabled
> > > are collected from existing drivers and device trees.
> > >
> > > The prober collects resources from all possible components and enables
> > > them together, instead of enabling resources and probing each component
> > > one by one. The latter approach does not provide any boot time benefits
> > > over simply enabling each component and letting each driver probe
> > > sequentially.
> > >
> > > The prober will also deduplicate the resources, since on a component
> > > swap out or co-layout design, the resources are always the same.
> > > While duplicate regulator supplies won't cause much issue, shared
> > > GPIOs don't work reliably, especially with other drivers. For the
> > > same reason, the prober will release the GPIOs before the successfully
> > > probed component is actually enabled.
> > >
> > > Signed-off-by: Chen-Yu Tsai <wenst at chromium.org>
> > > ---
> > > Changes since v5:
> > > - Split of_regulator_bulk_get_all() return value check and explain
> > >   "ret == 0" case
> > > - Switched to of_get_next_child_with_prefix_scoped() where applicable
> > > - Used krealloc_array() instead of directly calculating size
> > > - copy whole regulator array in one memcpy() call
> > > - Drop "0" from struct zeroing initializer
> > > - Split out regulator helper from i2c_of_probe_enable_res() to keep
> > >   code cleaner when combined with the next patch
> > > - Added options for customizing power sequencing delay
> > > - Rename i2c_of_probe_get_regulator() to i2c_of_probe_get_regulators()
> > > - Add i2c_of_probe_free_regulator() helper
> > >
> > > Changes since v4:
> > > - Split out GPIO handling to separate patch
> > > - Rewrote using of_regulator_bulk_get_all()
> > > - Replaced "regulators" with "regulator supplies" in debug messages
> > >
> > > Changes since v3:
> > > - New patch
> > >
> > > This change is kept as a separate patch for now since the changes are
> > > quite numerous.
> > > ---
> > >  drivers/i2c/i2c-core-of-prober.c | 154 +++++++++++++++++++++++++++++--
> > >  include/linux/i2c.h              |  10 +-
> > >  2 files changed, 155 insertions(+), 9 deletions(-)
> >
> > I never jumped back into looking at this since you started sending new
> > versions last month (sorry), but I finally did...
> >
> > At a high level, I have to say I'm not really a fan of the "reach into
> > all of the devices, jam their regulators on, force their GPIOs high,
> > and hope for the best" approach. It just feels like it's going to
> > break at the first bit of slightly different hardware and cause power
> > sequence violations left and right. If nothing else, regulators often
> > need delays between when one regulator is enabled and the next. There
> > may also be complex relationships between regulators and GPIOs, GPIOs,
> > GPIOs that need to be low, or even GPIO "toggle sequences" (power on
> > rail 1, wait 1 ms, assert reset, wait 10 ms, deassert reset, power on
> > rail 2).
> >
> > IMO the only way to make this reliable is to have this stuff be much
> > less automatic and much more driven by the board.
> >
> > I think that, in general, before the board prober checks i2c address
> > then the prober should be in charge of setting up pinctrl and turning
> > on regulators / GPIOs. Given that the same regulator(s) and GPIO(s)
> > may be specified by different children, the prober will just have to
> > pick one child to find those resources. It should have enough
> > board-specific knowledge to make this choice. Then the prober should
> > turn them on via a board-specific power-on sequence that's known to
> > work for all the children. Then it should start probing.
> >
> > I think there can still be plenty of common helper functions that the
> > board-specific prober can leverage, but overall I'd expect the actual
> > power-on and power-off code to be board-specific.
> >
> > If many boards have in common that we need to turn on exactly one
> > regulator + one GPIO, or just one regulator, or whatever then having a
> > helper function that handles these cases is fine. ...but it should be
> > one of many choices that a board proper could use and not the only
> > one.
>
> IIUC we could have the "options" data structure have much more board
> specific information:
>
>   - name of node to fetch resources (regulator supplies and GPIOs) from
>   - names of the resources for the node given from the previous item
>   - delay time after each resource is toggled
>   - polarity in the case of GPIOs
>   - prober callback to do power sequencing
>
> The "resource collection" step would use the first two items to retrieve
> the regulator supplies and GPIOS instead of the bulk APIs used right now.
>
> The power sequencing callback would use the resources combined with the
> given delays to enable the supplies and toggle the GPIOs.
>
> For now I would probably only implement a generic one regulator supply
> plus one GPIO helper. That is the common case for touchscreens and
> trackpads connected over a ribbon cable.
>
> Does that sound like what you have in mind?

I guess I'd have to see how the code looks to know for sure, but if I
understand it sounds a little awkward. Specifically, the "options"
sound like they might become complicated enough that you're inventing
your own little programming language (with delays, abilities to drive
pins low and high, abilities to turn on/off clocks, and abilities to
turn off/on regulators) and then probers need to code up their
programs in this language. You also need to handle undoing things
properly if there is a failure in the middle. Like your "program"
would look like this (obviously you'd have to play with enums more,
but you get the idea):

{
   { OPCODE_TURN_REGULATOR_ON, "vdd" },
   { OPCODE_DELAY, 10 },
   { OPCODE_GPIO_ASSERT, "reset" },
   { OPCODE_DELAY, 5 },
   { OPCODE_GPIO_DEASSERT "reset" },
   { OPCODE_DELAY, 100 },
   { OPCODE_TURN_REGULATOR_ON, "vddIO" },
}

Why not just expect the board probers to write C code to turn things
on before looking for i2c devices, then provide helpers to the C code?

So there wouldn't be some generic "resource collection" API, but you'd
provide a helper to make it easy to grab regulators from one of the
nodes by name. If you think bulk enabling regulators is common then
you could make a helper that grabs all of the regulators from a node
in a way that is consistent with the bulk APIs, but I wouldn't expect
every driver to use that since devices I've seen expect regulators to
be enabled in a very specific order even if they don't need a delay
between them.

I wouldn't expect a "collect all GPIOs" API because it seems really
weird to me that we'd ever want to jam multiple GPIOs in a state
without knowing exactly which GPIO was what and asserting them in the
right sequence.


> This next item would be a later enhancement (which isn't implemented in
> this series anyway):
>
>   - optional prober callback that does actual probing
>
> In our case it would only be used for cases where an HID-over-I2C
> component shares the same address as a non-HID one, and some extra
> work is needed to determine which type it is. I still need to think
> about the structure of this.

IMO _that_ would be a great option to the i2c prober. It feels like
you could have an optional register read that needs to match to have
the i2c prober succeed. Most people would leave it blank (just the i2c
device existing is enough) but probably a single register read would
be enough to confirm you got the right device. Most i2c devices have
some sort of "version" / "vendor" / "id" type register somewhere.

-Doug


From benjamin.larsson at genexis.eu  Thu Sep  5 11:35:17 2024
From: benjamin.larsson at genexis.eu (Benjamin Larsson)
Date: Thu, 5 Sep 2024 20:35:17 +0200
Subject: [PATCH v3 5/5] pwm: airoha: Add support for EN7581 SoC
In-Reply-To: <64zfjgmc2dutmsukg2bxhb44k3wu2y7tt3h26hej7d4fx5nc7z@5zvo3hsucipc>
References: <20240831-en7581-pinctrl-v3-0-98eebfb4da66@kernel.org>
 <20240831-en7581-pinctrl-v3-5-98eebfb4da66@kernel.org>
 <yfqmlca6cnhrghpo5s6tml36tngmekcfbyjakxs7or7wtap3ka@7qlrxjowo4ou>
 <d9298199-fe10-4b28-8e28-dc252bd6832c@genexis.eu>
 <t2f5kockuvfi66qqumda6jxf5a4c4zf35ld5ainsnksavkchyj@kdueaqlhjoar>
 <b7e44fb2-6cf6-4530-a271-9e1730d4f431@genexis.eu>
 <xmlta4za6malgthd6cmt5fcipxgyzwmqwxqdg5e4qahcuqzcrt@eidsf6mexrkz>
 <a0a14b57-cc4e-43ef-984f-fb405949b41d@genexis.eu>
 <64zfjgmc2dutmsukg2bxhb44k3wu2y7tt3h26hej7d4fx5nc7z@5zvo3hsucipc>
Message-ID: <2e8806fa-c476-4cfa-bc2e-dc02754830d1@genexis.eu>

Hi.

On 05/09/2024 17:39, Uwe Kleine-K?nig wrote:
> Hello Benjamin,
>
> On Thu, Sep 05, 2024 at 02:18:41PM +0200, Benjamin Larsson wrote:
>> On 2024-09-05 11:30, Uwe Kleine-K?nig wrote:
>>> 1 second long pulses with a period size of 1 second, so a constant high
>>> signal?
>> Hi, I think I was unclear. The SoC documentation is not that detailed. But I
>> think I understand how it works now.
>>
>> One register contains the minimum duration (d_min). And then there is one 8
>> bit register for the signal low period (lp) and then another 8bit register
>> for the high period (hp). Per my understanding a change of polarity is then
>> just a swap of lp and hp.
> that doesn't sound right.
>
> A "normal" waveform with period = 10 ns and duty_cycle = 2 ns looks as
> follows:
>
>     _         _         _
>    / \_______/ \_______/ \_______/
>    ^         ^         ^         ^
>
> assuming a monospace font that's 1 char per ns, the ^ marking the period
> start.
>
> Ignoring scaling, your hardware needs to have hp = 2 and lp = 8. If you
> switch that (assuming you mean switching in the same way as I do) to hp
> = 8 and lp = 2, you get:
>
>     _______   _______   _______
>    /       \_/       \_/       \_/
>    ^         ^         ^         ^
>
> which is still a "normal" polarity output as a period starts with the
> active part.
>
> I admit that's a bit artificial, because the waveform for
>
> 	period = 10 ns
> 	duty_cycle = 2 ns
> 	polarity = inversed
>
> looks as follows:
>
>       _______   _______   _______
>    \_/       \_/       \_/       \_/
>    ^         ^         ^         ^
>
> which isn't any different from the 2nd waveform above if you ignore the
> period start markers (which are not observable apart from the moments
> where you reconfigure the output).
>
> However it matters if you have a chip with >1 output that are not
> independent.


Ok that was a clear explanation, anyway the pwm hardware is then not 
capable of a polarity change. It is possible to change the polarity via 
other means but there is no way for the pwm block (and driver) to handle 
this.


>> This means that when requesting a period and duty cycle you need to search
>> through the configuration space to find the optimal value.
> Or restrict yourself consistently to something simpler than a exhaustive
> search through the complete configuration space.

Is there a recommendation on what is more important? Period duration or 
duty cycle percentage?


>> MvH
> (BTW, I had to research the meaning of MvH. In case someone else doesn't
> know it: It's the usual abbreviation for "Med v?nliga h?lsningar" in
> Sweden or "Med vennlig hilsen" in Norway; both meaning "With friendly
> greetings".)
>
> Best regards
> Uwe

MvH

Benjamin Larsson



From broonie at kernel.org  Thu Sep  5 11:42:00 2024
From: broonie at kernel.org (Mark Brown)
Date: Thu, 5 Sep 2024 19:42:00 +0100
Subject: [PATCH v6 09/12] i2c: of-prober: Add regulator support
In-Reply-To: <CAD=FV=XVrAdQN8p9QJtt3Ah_YQAG7Y-D4wDx8_+qb1EGN7+Uig@mail.gmail.com>
References: <20240904090016.2841572-1-wenst@chromium.org>
 <20240904090016.2841572-10-wenst@chromium.org>
 <CAD=FV=UGOz3Xzg7reJKP=tA1LqTxszv5w-CL9krmoXQtXdJLaQ@mail.gmail.com>
 <CAGXv+5F27K76t=ht5v75jKsNF-J+C0r5+m=czHz6PtV3t5DxcQ@mail.gmail.com>
 <CAD=FV=XVrAdQN8p9QJtt3Ah_YQAG7Y-D4wDx8_+qb1EGN7+Uig@mail.gmail.com>
Message-ID: <1e91439d-e8fe-4675-ac0b-03939f563bca@sirena.org.uk>

On Thu, Sep 05, 2024 at 11:14:58AM -0700, Doug Anderson wrote:
> On Thu, Sep 5, 2024 at 8:10?AM Chen-Yu Tsai <wenst at chromium.org> wrote:

> > This next item would be a later enhancement (which isn't implemented in
> > this series anyway):

> >   - optional prober callback that does actual probing

> > In our case it would only be used for cases where an HID-over-I2C
> > component shares the same address as a non-HID one, and some extra
> > work is needed to determine which type it is. I still need to think
> > about the structure of this.

> IMO _that_ would be a great option to the i2c prober. It feels like
> you could have an optional register read that needs to match to have
> the i2c prober succeed. Most people would leave it blank (just the i2c
> device existing is enough) but probably a single register read would
> be enough to confirm you got the right device. Most i2c devices have
> some sort of "version" / "vendor" / "id" type register somewhere.

I'm not so sure about the "most" there - it depends quite a bit on the
class of device.  This also imply that the prober would have a regmap
config as well...
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-mediatek/attachments/20240905/f3e16dbe/attachment.sig>

From broonie at kernel.org  Thu Sep  5 11:42:23 2024
From: broonie at kernel.org (Mark Brown)
Date: Thu, 05 Sep 2024 19:42:23 +0100
Subject: (subset) [PATCH v8 0/5] Add audio support for the MediaTek
 Genio 350-evk board
In-Reply-To: <20240226-audio-i350-v8-0-e80a57d026ce@baylibre.com>
References: <20240226-audio-i350-v8-0-e80a57d026ce@baylibre.com>
Message-ID: <172556174352.65454.6443840128203694133.b4-ty@kernel.org>

On Thu, 05 Sep 2024 11:06:57 +0200, amergnat at baylibre.com wrote:
> This serie aim to add the following audio support for the Genio 350-evk:
> - Playback
>   - 2ch Headset Jack (Earphone)
>   - 1ch Line-out Jack (Speaker)
>   - 8ch HDMI Tx
> - Capture
>   - 1ch DMIC (On-board Digital Microphone)
>   - 1ch AMIC (On-board Analogic Microphone)
>   - 1ch Headset Jack (External Analogic Microphone)
> 
> [...]

Applied to

   https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git for-next

Thanks!

[1/5] ASoC: codecs: add MT6357 support
      commit: 5e2404493f9f6028bf143972b18c88156c9893e6
[2/5] ASoC: mediatek: Add MT8365 support
      commit: 5bbfdad8cf8d4b2c3189fee8e6300b38f65f8d72

All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.

You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.

If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.

Please add any relevant lists and maintainers to the CCs when replying
to this mail.

Thanks,
Mark



From andriy.shevchenko at linux.intel.com  Thu Sep  5 12:13:50 2024
From: andriy.shevchenko at linux.intel.com (Andy Shevchenko)
Date: Thu, 5 Sep 2024 22:13:50 +0300
Subject: [PATCH v6 09/12] i2c: of-prober: Add regulator support
In-Reply-To: <CAD=FV=XVrAdQN8p9QJtt3Ah_YQAG7Y-D4wDx8_+qb1EGN7+Uig@mail.gmail.com>
References: <20240904090016.2841572-1-wenst@chromium.org>
 <20240904090016.2841572-10-wenst@chromium.org>
 <CAD=FV=UGOz3Xzg7reJKP=tA1LqTxszv5w-CL9krmoXQtXdJLaQ@mail.gmail.com>
 <CAGXv+5F27K76t=ht5v75jKsNF-J+C0r5+m=czHz6PtV3t5DxcQ@mail.gmail.com>
 <CAD=FV=XVrAdQN8p9QJtt3Ah_YQAG7Y-D4wDx8_+qb1EGN7+Uig@mail.gmail.com>
Message-ID: <ZtoC7kz-5Cd4CZe5@smile.fi.intel.com>

On Thu, Sep 05, 2024 at 11:14:58AM -0700, Doug Anderson wrote:
> On Thu, Sep 5, 2024 at 8:10?AM Chen-Yu Tsai <wenst at chromium.org> wrote:

...

> I guess I'd have to see how the code looks to know for sure, but if I
> understand it sounds a little awkward. Specifically, the "options"
> sound like they might become complicated enough that you're inventing
> your own little programming language (with delays, abilities to drive
> pins low and high, abilities to turn on/off clocks, and abilities to
> turn off/on regulators) and then probers need to code up their
> programs in this language.

You beat me up to it. I have the same thought.
However, what is described is exactly what a regular PMIC has.
They already have their own language for exactly this purposes.
(At least I see that in a few Intel SoC-based platforms.)

So, after all it may be not a bad idea But would be good to have it
standardized (if it's even possible :-).

-- 
With Best Regards,
Andy Shevchenko




From bvanassche at acm.org  Thu Sep  5 14:06:41 2024
From: bvanassche at acm.org (Bart Van Assche)
Date: Thu, 5 Sep 2024 14:06:41 -0700
Subject: [PATCH v2 1/2] ufs: core: fix the issue of ICU failure
In-Reply-To: <20240902021805.1125-2-peter.wang@mediatek.com>
References: <20240902021805.1125-1-peter.wang@mediatek.com>
 <20240902021805.1125-2-peter.wang@mediatek.com>
Message-ID: <f5274603-3687-4386-b785-129183d84f4c@acm.org>

On 9/1/24 7:18 PM, peter.wang at mediatek.com wrote:
>   	/* SQRTCy.ICU = 1 */

Feel free to leave out the above comment since it duplicates the code
below this comment. A comment that explains that "ICU = Initiate
Cleanup" probably would be appropriate.

> -	writel(SQ_ICU, opr_sqd_base + REG_SQRTC);
> +	writel(readl(opr_sqd_base + REG_SQRTC) | SQ_ICU,
> +		opr_sqd_base + REG_SQRTC);

Is this perhaps an open-coded version of ufshcd_rmwl()?

>   
>   	/* Poll SQRTSy.CUS = 1. Return result from SQRTSy.RTC */
>   	reg = opr_sqd_base + REG_SQRTS;
>   	err = read_poll_timeout(readl, val, val & SQ_CUS, 20,
>   				MCQ_POLL_US, false, reg);
> -	if (err)
> -		dev_err(hba->dev, "%s: failed. hwq=%d, tag=%d err=%ld\n",
> -			__func__, id, task_tag,
> +	if (err || FIELD_GET(SQ_ICU_ERR_CODE_MASK, readl(reg)))
> +		dev_err(hba->dev, "%s: failed. hwq=%d, tag=%d err=%d RTC=%ld\n",
> +			__func__, id, task_tag, err,
>   			FIELD_GET(SQ_ICU_ERR_CODE_MASK, readl(reg)));

In the above code the expression "FIELD_GET(SQ_ICU_ERR_CODE_MASK, 
readl(reg))" occurs twice. Please consider storing that expression in
a variable such that this expression only occurs once.

Thanks,

Bart.



From bvanassche at acm.org  Thu Sep  5 14:16:40 2024
From: bvanassche at acm.org (Bart Van Assche)
Date: Thu, 5 Sep 2024 14:16:40 -0700
Subject: [PATCH v2 2/2] ufs: core: requeue MCQ abort request
In-Reply-To: <20240902021805.1125-3-peter.wang@mediatek.com>
References: <20240902021805.1125-1-peter.wang@mediatek.com>
 <20240902021805.1125-3-peter.wang@mediatek.com>
Message-ID: <b31bf24f-588e-43e5-b71f-b4e9edd1b60a@acm.org>

On 9/1/24 7:18 PM, peter.wang at mediatek.com wrote:
> diff --git a/drivers/ufs/core/ufs-mcq.c b/drivers/ufs/core/ufs-mcq.c
> index afd9541f4bd8..abdc55a8b960 100644
> --- a/drivers/ufs/core/ufs-mcq.c
> +++ b/drivers/ufs/core/ufs-mcq.c
> @@ -642,6 +642,7 @@ static bool ufshcd_mcq_sqe_search(struct ufs_hba *hba,
>   		match = le64_to_cpu(utrd->command_desc_base_addr) & CQE_UCD_BA;
>   		if (addr == match) {
>   			ufshcd_mcq_nullify_sqe(utrd);
> +			lrbp->host_initiate_abort = true;
>   			ret = true;
>   			goto out;
>   		}

I think this is wrong. The above code is only executed if the SCSI core
decides to abort a SCSI command. It is up to the SCSI core to decide
whether or not to retry an aborted command.

> -	/* Release cmd in MCQ mode if abort succeeds */
> -	if (hba->mcq_enabled && (*ret == 0)) {
> -		hwq = ufshcd_mcq_req_to_hwq(hba, scsi_cmd_to_rq(lrbp->cmd));
> -		if (!hwq)
> -			return 0;
> -		spin_lock_irqsave(&hwq->cq_lock, flags);
> -		if (ufshcd_cmd_inflight(lrbp->cmd))
> -			ufshcd_release_scsi_cmd(hba, lrbp);
> -		spin_unlock_irqrestore(&hwq->cq_lock, flags);
> -	}
> +	/* Host will post to CQ with OCS_ABORTED after SQ cleanup */
> +	if (hba->mcq_enabled && (*ret == 0))
> +		lrbp->host_initiate_abort = true;

I think this code is racy because the UFS host controller may have 
posted a completion before the "lrbp->host_initiate_abort = true"
assignment is executed.

> + * @host_initiate_abort: Abort flag initiated by host

What is "Abort flag"? Please consider renaming "host_initiate_abort"
into "abort_initiated_by_err_handler" since I think that aborted
commands should only be retried if these have been aborted by
ufshcd_err_handler().

Thanks,

Bart.


From matthias.bgg at gmail.com  Thu Sep  5 15:01:00 2024
From: matthias.bgg at gmail.com (Matthias Brugger)
Date: Fri, 6 Sep 2024 00:01:00 +0200
Subject: [PATCH v8 3/5] arm64: defconfig: enable mt8365 sound
In-Reply-To: <20240226-audio-i350-v8-3-e80a57d026ce@baylibre.com>
References: <20240226-audio-i350-v8-0-e80a57d026ce@baylibre.com>
 <20240226-audio-i350-v8-3-e80a57d026ce@baylibre.com>
Message-ID: <72b3ddc2-1c56-402b-a58a-cfe7e9f4aaa7@gmail.com>



On 05/09/2024 11:07, Alexandre Mergnat wrote:
> Enable the MediaTek MT8365-EVK sound support.
> 
> The audio feature is handled by the MT8365 SoC and
> the MT6357 PMIC codec audio.
> 
> Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
> Signed-off-by: Alexandre Mergnat <amergnat at baylibre.com>

Applied, thanks.

> ---
>   arch/arm64/configs/defconfig | 2 ++
>   1 file changed, 2 insertions(+)
> 
> diff --git a/arch/arm64/configs/defconfig b/arch/arm64/configs/defconfig
> index 7d32fca64996..111ca3abd651 100644
> --- a/arch/arm64/configs/defconfig
> +++ b/arch/arm64/configs/defconfig
> @@ -960,6 +960,8 @@ CONFIG_SND_SOC_MT8192=m
>   CONFIG_SND_SOC_MT8192_MT6359_RT1015_RT5682=m
>   CONFIG_SND_SOC_MT8195=m
>   CONFIG_SND_SOC_MT8195_MT6359=m
> +CONFIG_SND_SOC_MT8365=m
> +CONFIG_SND_SOC_MT8365_MT6357=m
>   CONFIG_SND_MESON_AXG_SOUND_CARD=m
>   CONFIG_SND_MESON_GX_SOUND_CARD=m
>   CONFIG_SND_SOC_QCOM=m
> 


From matthias.bgg at gmail.com  Thu Sep  5 15:01:20 2024
From: matthias.bgg at gmail.com (Matthias Brugger)
Date: Fri, 6 Sep 2024 00:01:20 +0200
Subject: [PATCH v8 4/5] arm64: dts: mediatek: add afe support for mt8365
 SoC
In-Reply-To: <20240226-audio-i350-v8-4-e80a57d026ce@baylibre.com>
References: <20240226-audio-i350-v8-0-e80a57d026ce@baylibre.com>
 <20240226-audio-i350-v8-4-e80a57d026ce@baylibre.com>
Message-ID: <732cea84-3d2d-469c-93a0-76d93d8271bc@gmail.com>



On 05/09/2024 11:07, Alexandre Mergnat wrote:
> Add audio front end support of MT8365 SoC.
> Update the file header.
> 
> Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
> Signed-off-by: Alexandre Mergnat <amergnat at baylibre.com>

Applied, thanks

> ---
>   arch/arm64/boot/dts/mediatek/mt8365.dtsi | 43 ++++++++++++++++++++++++++++++--
>   1 file changed, 41 insertions(+), 2 deletions(-)
> 
> diff --git a/arch/arm64/boot/dts/mediatek/mt8365.dtsi b/arch/arm64/boot/dts/mediatek/mt8365.dtsi
> index eb449bfa8803..9c91fe8ea0f9 100644
> --- a/arch/arm64/boot/dts/mediatek/mt8365.dtsi
> +++ b/arch/arm64/boot/dts/mediatek/mt8365.dtsi
> @@ -2,9 +2,11 @@
>   /*
>    * (C) 2018 MediaTek Inc.
>    * Copyright (C) 2022 BayLibre SAS
> - * Fabien Parent <fparent at baylibre.com>
> - * Bernhard Rosenkr?nzer <bero at baylibre.com>
> + * Authors: Fabien Parent <fparent at baylibre.com>
> + *	    Bernhard Rosenkr?nzer <bero at baylibre.com>
> + *	    Alexandre Mergnat <amergnat at baylibre.com>
>    */
> +
>   #include <dt-bindings/clock/mediatek,mt8365-clk.h>
>   #include <dt-bindings/interrupt-controller/arm-gic.h>
>   #include <dt-bindings/interrupt-controller/irq.h>
> @@ -812,6 +814,43 @@ apu: syscon at 19020000 {
>   			reg = <0 0x19020000 0 0x1000>;
>   			#clock-cells = <1>;
>   		};
> +
> +		afe: audio-controller at 11220000 {
> +			compatible = "mediatek,mt8365-afe-pcm";
> +			reg = <0 0x11220000 0 0x1000>;
> +			#sound-dai-cells = <0>;
> +			clocks = <&clk26m>,
> +				 <&topckgen CLK_TOP_AUDIO_SEL>,
> +				 <&topckgen CLK_TOP_AUD_I2S0_M>,
> +				 <&topckgen CLK_TOP_AUD_I2S1_M>,
> +				 <&topckgen CLK_TOP_AUD_I2S2_M>,
> +				 <&topckgen CLK_TOP_AUD_I2S3_M>,
> +				 <&topckgen CLK_TOP_AUD_ENGEN1_SEL>,
> +				 <&topckgen CLK_TOP_AUD_ENGEN2_SEL>,
> +				 <&topckgen CLK_TOP_AUD_1_SEL>,
> +				 <&topckgen CLK_TOP_AUD_2_SEL>,
> +				 <&topckgen CLK_TOP_APLL_I2S0_SEL>,
> +				 <&topckgen CLK_TOP_APLL_I2S1_SEL>,
> +				 <&topckgen CLK_TOP_APLL_I2S2_SEL>,
> +				 <&topckgen CLK_TOP_APLL_I2S3_SEL>;
> +			clock-names = "top_clk26m_clk",
> +				      "top_audio_sel",
> +				      "audio_i2s0_m",
> +				      "audio_i2s1_m",
> +				      "audio_i2s2_m",
> +				      "audio_i2s3_m",
> +				      "engen1",
> +				      "engen2",
> +				      "aud1",
> +				      "aud2",
> +				      "i2s0_m_sel",
> +				      "i2s1_m_sel",
> +				      "i2s2_m_sel",
> +				      "i2s3_m_sel";
> +			interrupts = <GIC_SPI 97 IRQ_TYPE_LEVEL_LOW>;
> +			power-domains = <&spm MT8365_POWER_DOMAIN_AUDIO>;
> +			status = "disabled";
> +		};
>   	};
>   
>   	timer {
> 


From matthias.bgg at gmail.com  Thu Sep  5 15:01:46 2024
From: matthias.bgg at gmail.com (Matthias Brugger)
Date: Fri, 6 Sep 2024 00:01:46 +0200
Subject: [PATCH v8 5/5] arm64: dts: mediatek: add audio support for
 mt8365-evk
In-Reply-To: <20240226-audio-i350-v8-5-e80a57d026ce@baylibre.com>
References: <20240226-audio-i350-v8-0-e80a57d026ce@baylibre.com>
 <20240226-audio-i350-v8-5-e80a57d026ce@baylibre.com>
Message-ID: <0ffcc54f-f06d-41c6-b0d0-cc420ebc1527@gmail.com>



On 05/09/2024 11:07, Alexandre Mergnat wrote:
> Add the sound node which is linked to the MT8365 SoC AFE and
> the MT6357 audio codec.
> 
> Update the file header.
> 
> Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
> Signed-off-by: Alexandre Mergnat <amergnat at baylibre.com>

Applied, thanks!

> ---
>   arch/arm64/boot/dts/mediatek/mt8365-evk.dts | 86 +++++++++++++++++++++++++++++
>   1 file changed, 86 insertions(+)
> 
> diff --git a/arch/arm64/boot/dts/mediatek/mt8365-evk.dts b/arch/arm64/boot/dts/mediatek/mt8365-evk.dts
> index 4211a992dd9d..7d90112a7e27 100644
> --- a/arch/arm64/boot/dts/mediatek/mt8365-evk.dts
> +++ b/arch/arm64/boot/dts/mediatek/mt8365-evk.dts
> @@ -4,6 +4,7 @@
>    * Authors:
>    * Fabien Parent <fparent at baylibre.com>
>    * Bernhard Rosenkr?nzer <bero at baylibre.com>
> + * Alexandre Mergnat <amergnat at baylibre.com>
>    */
>   
>   /dts-v1/;
> @@ -86,6 +87,28 @@ optee_reserved: optee at 43200000 {
>   			reg = <0 0x43200000 0 0x00c00000>;
>   		};
>   	};
> +
> +	sound: sound {
> +		compatible = "mediatek,mt8365-mt6357";
> +		pinctrl-names = "default",
> +				"dmic",
> +				"miso_off",
> +				"miso_on",
> +				"mosi_off",
> +				"mosi_on";
> +		pinctrl-0 = <&aud_default_pins>;
> +		pinctrl-1 = <&aud_dmic_pins>;
> +		pinctrl-2 = <&aud_miso_off_pins>;
> +		pinctrl-3 = <&aud_miso_on_pins>;
> +		pinctrl-4 = <&aud_mosi_off_pins>;
> +		pinctrl-5 = <&aud_mosi_on_pins>;
> +		mediatek,platform = <&afe>;
> +	};
> +};
> +
> +&afe {
> +	mediatek,dmic-mode = <1>;
> +	status = "okay";
>   };
>   
>   &cpu0 {
> @@ -178,9 +201,72 @@ &mt6357_pmic {
>   	interrupts-extended = <&pio 145 IRQ_TYPE_LEVEL_HIGH>;
>   	interrupt-controller;
>   	#interrupt-cells = <2>;
> +	mediatek,micbias0-microvolt = <1900000>;
> +	mediatek,micbias1-microvolt = <1700000>;
>   };
>   
>   &pio {
> +	aud_default_pins: audiodefault-pins {
> +		clk-dat-pins {
> +			pinmux = <MT8365_PIN_72_CMDAT4__FUNC_I2S3_BCK>,
> +				 <MT8365_PIN_73_CMDAT5__FUNC_I2S3_LRCK>,
> +				 <MT8365_PIN_74_CMDAT6__FUNC_I2S3_MCK>,
> +				 <MT8365_PIN_75_CMDAT7__FUNC_I2S3_DO>;
> +		};
> +	};
> +
> +	aud_dmic_pins: audiodmic-pins {
> +		clk-dat-pins {
> +			pinmux = <MT8365_PIN_117_DMIC0_CLK__FUNC_DMIC0_CLK>,
> +				 <MT8365_PIN_118_DMIC0_DAT0__FUNC_DMIC0_DAT0>,
> +				 <MT8365_PIN_119_DMIC0_DAT1__FUNC_DMIC0_DAT1>;
> +		};
> +	};
> +
> +	aud_miso_off_pins: misooff-pins {
> +		clk-dat-pins {
> +			pinmux = <MT8365_PIN_53_AUD_CLK_MISO__FUNC_GPIO53>,
> +				 <MT8365_PIN_54_AUD_SYNC_MISO__FUNC_GPIO54>,
> +				 <MT8365_PIN_55_AUD_DAT_MISO0__FUNC_GPIO55>,
> +				 <MT8365_PIN_56_AUD_DAT_MISO1__FUNC_GPIO56>;
> +			input-enable;
> +			bias-pull-down;
> +			drive-strength = <2>;
> +		};
> +	};
> +
> +	aud_miso_on_pins: misoon-pins {
> +		clk-dat-pins {
> +			pinmux = <MT8365_PIN_53_AUD_CLK_MISO__FUNC_AUD_CLK_MISO>,
> +				 <MT8365_PIN_54_AUD_SYNC_MISO__FUNC_AUD_SYNC_MISO>,
> +				 <MT8365_PIN_55_AUD_DAT_MISO0__FUNC_AUD_DAT_MISO0>,
> +				 <MT8365_PIN_56_AUD_DAT_MISO1__FUNC_AUD_DAT_MISO1>;
> +			drive-strength = <6>;
> +		};
> +	};
> +
> +	aud_mosi_off_pins: mosioff-pins {
> +		clk-dat-pins {
> +			pinmux = <MT8365_PIN_49_AUD_CLK_MOSI__FUNC_GPIO49>,
> +				 <MT8365_PIN_50_AUD_SYNC_MOSI__FUNC_GPIO50>,
> +				 <MT8365_PIN_51_AUD_DAT_MOSI0__FUNC_GPIO51>,
> +				 <MT8365_PIN_52_AUD_DAT_MOSI1__FUNC_GPIO52>;
> +			input-enable;
> +			bias-pull-down;
> +			drive-strength = <2>;
> +		};
> +	};
> +
> +	aud_mosi_on_pins: mosion-pins {
> +		clk-dat-pins {
> +			pinmux = <MT8365_PIN_49_AUD_CLK_MOSI__FUNC_AUD_CLK_MOSI>,
> +				 <MT8365_PIN_50_AUD_SYNC_MOSI__FUNC_AUD_SYNC_MOSI>,
> +				 <MT8365_PIN_51_AUD_DAT_MOSI0__FUNC_AUD_DAT_MOSI0>,
> +				 <MT8365_PIN_52_AUD_DAT_MOSI1__FUNC_AUD_DAT_MOSI1>;
> +			drive-strength = <6>;
> +		};
> +	};
> +
>   	ethernet_pins: ethernet-pins {
>   		phy_reset_pins {
>   			pinmux = <MT8365_PIN_133_TDM_TX_DATA1__FUNC_GPIO133>;
> 


From matthias.bgg at gmail.com  Thu Sep  5 15:28:27 2024
From: matthias.bgg at gmail.com (Matthias Brugger)
Date: Fri, 6 Sep 2024 00:28:27 +0200
Subject: [PATCH v3 0/2] arm64: dts: mediatek: Add MT8186 Ponyta
In-Reply-To: <20240904081501.2060933-1-cengjianeng@huaqin.corp-partner.google.com>
References: <20240904081501.2060933-1-cengjianeng@huaqin.corp-partner.google.com>
Message-ID: <3d85b40b-bcb1-430f-89d5-739ad6f907d4@gmail.com>



On 04/09/2024 10:14, Jianeng Ceng wrote:
> This is v3 of the MT8186 Chromebook device tree series.

Please send this kind of patches also to the mediatek mailinglist:
moderated list:ARM/Mediatek SoC support <linux-mediatek at lists.infradead.org>

Thanks
Matthias

> ---
> Changes in v3:
> - PATCH 0/2: Add the modify records.
> - PATCH 1/2: Modify lable to label.
> - Link to v2:https://lore.kernel.org/all/20240903061603.3007289-1-cengjianeng at huaqin.corp-partner.google.com/
> 
> Changes in v2:
> - PATCH 2/2: Modify the dtb name without rev2.
> - Link to v1:https://lore.kernel.org/all/20240902125502.1844374-1-cengjianeng at huaqin.corp-partner.google.com/
> 
> Jianeng Ceng (2):
>    dt-bindings: arm: mediatek: Add MT8186 Ponyta Chromebook
>    arm64: dts: mediatek: Add MT8186 Ponyta Chromebooks
> 
>   .../devicetree/bindings/arm/mediatek.yaml     | 11 +++++
>   arch/arm64/boot/dts/mediatek/Makefile         |  2 +
>   .../mediatek/mt8186-corsola-ponyta-sku0.dts   | 24 ++++++++++
>   .../mediatek/mt8186-corsola-ponyta-sku1.dts   | 27 ++++++++++++
>   .../dts/mediatek/mt8186-corsola-ponyta.dtsi   | 44 +++++++++++++++++++
>   5 files changed, 108 insertions(+)
>   create mode 100644 arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku0.dts
>   create mode 100644 arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku1.dts
>   create mode 100644 arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta.dtsi
> 


From wenst at chromium.org  Thu Sep  5 20:45:32 2024
From: wenst at chromium.org (Chen-Yu Tsai)
Date: Fri, 6 Sep 2024 11:45:32 +0800
Subject: [PATCH v6 09/12] i2c: of-prober: Add regulator support
In-Reply-To: <CAD=FV=XVrAdQN8p9QJtt3Ah_YQAG7Y-D4wDx8_+qb1EGN7+Uig@mail.gmail.com>
References: <20240904090016.2841572-1-wenst@chromium.org> <20240904090016.2841572-10-wenst@chromium.org>
 <CAD=FV=UGOz3Xzg7reJKP=tA1LqTxszv5w-CL9krmoXQtXdJLaQ@mail.gmail.com>
 <CAGXv+5F27K76t=ht5v75jKsNF-J+C0r5+m=czHz6PtV3t5DxcQ@mail.gmail.com> <CAD=FV=XVrAdQN8p9QJtt3Ah_YQAG7Y-D4wDx8_+qb1EGN7+Uig@mail.gmail.com>
Message-ID: <CAGXv+5HO=POHNL_tQHCsy+8=a0gPLMDVHcWMguferahVU+BnZA@mail.gmail.com>

On Fri, Sep 6, 2024 at 2:15?AM Doug Anderson <dianders at chromium.org> wrote:
>
> Hi,
>
> On Thu, Sep 5, 2024 at 8:10?AM Chen-Yu Tsai <wenst at chromium.org> wrote:
> >
> > On Thu, Sep 5, 2024 at 6:57?AM Doug Anderson <dianders at chromium.org> wrote:
> > >
> > > Hi,
> > >
> > > On Wed, Sep 4, 2024 at 2:01?AM Chen-Yu Tsai <wenst at chromium.org> wrote:
> > > >
> > > > This adds regulator management to the I2C OF component prober.
> > > > Components that the prober intends to probe likely require their
> > > > regulator supplies be enabled, and GPIOs be toggled to enable them or
> > > > bring them out of reset before they will respond to probe attempts.
> > > > GPIOs will be handled in the next patch.
> > > >
> > > > Without specific knowledge of each component's resource names or
> > > > power sequencing requirements, the prober can only enable the
> > > > regulator supplies all at once, and toggle the GPIOs all at once.
> > > > Luckily, reset pins tend to be active low, while enable pins tend to
> > > > be active high, so setting the raw status of all GPIO pins to high
> > > > should work. The wait time before and after resources are enabled
> > > > are collected from existing drivers and device trees.
> > > >
> > > > The prober collects resources from all possible components and enables
> > > > them together, instead of enabling resources and probing each component
> > > > one by one. The latter approach does not provide any boot time benefits
> > > > over simply enabling each component and letting each driver probe
> > > > sequentially.
> > > >
> > > > The prober will also deduplicate the resources, since on a component
> > > > swap out or co-layout design, the resources are always the same.
> > > > While duplicate regulator supplies won't cause much issue, shared
> > > > GPIOs don't work reliably, especially with other drivers. For the
> > > > same reason, the prober will release the GPIOs before the successfully
> > > > probed component is actually enabled.
> > > >
> > > > Signed-off-by: Chen-Yu Tsai <wenst at chromium.org>
> > > > ---
> > > > Changes since v5:
> > > > - Split of_regulator_bulk_get_all() return value check and explain
> > > >   "ret == 0" case
> > > > - Switched to of_get_next_child_with_prefix_scoped() where applicable
> > > > - Used krealloc_array() instead of directly calculating size
> > > > - copy whole regulator array in one memcpy() call
> > > > - Drop "0" from struct zeroing initializer
> > > > - Split out regulator helper from i2c_of_probe_enable_res() to keep
> > > >   code cleaner when combined with the next patch
> > > > - Added options for customizing power sequencing delay
> > > > - Rename i2c_of_probe_get_regulator() to i2c_of_probe_get_regulators()
> > > > - Add i2c_of_probe_free_regulator() helper
> > > >
> > > > Changes since v4:
> > > > - Split out GPIO handling to separate patch
> > > > - Rewrote using of_regulator_bulk_get_all()
> > > > - Replaced "regulators" with "regulator supplies" in debug messages
> > > >
> > > > Changes since v3:
> > > > - New patch
> > > >
> > > > This change is kept as a separate patch for now since the changes are
> > > > quite numerous.
> > > > ---
> > > >  drivers/i2c/i2c-core-of-prober.c | 154 +++++++++++++++++++++++++++++--
> > > >  include/linux/i2c.h              |  10 +-
> > > >  2 files changed, 155 insertions(+), 9 deletions(-)
> > >
> > > I never jumped back into looking at this since you started sending new
> > > versions last month (sorry), but I finally did...
> > >
> > > At a high level, I have to say I'm not really a fan of the "reach into
> > > all of the devices, jam their regulators on, force their GPIOs high,
> > > and hope for the best" approach. It just feels like it's going to
> > > break at the first bit of slightly different hardware and cause power
> > > sequence violations left and right. If nothing else, regulators often
> > > need delays between when one regulator is enabled and the next. There
> > > may also be complex relationships between regulators and GPIOs, GPIOs,
> > > GPIOs that need to be low, or even GPIO "toggle sequences" (power on
> > > rail 1, wait 1 ms, assert reset, wait 10 ms, deassert reset, power on
> > > rail 2).
> > >
> > > IMO the only way to make this reliable is to have this stuff be much
> > > less automatic and much more driven by the board.
> > >
> > > I think that, in general, before the board prober checks i2c address
> > > then the prober should be in charge of setting up pinctrl and turning
> > > on regulators / GPIOs. Given that the same regulator(s) and GPIO(s)
> > > may be specified by different children, the prober will just have to
> > > pick one child to find those resources. It should have enough
> > > board-specific knowledge to make this choice. Then the prober should
> > > turn them on via a board-specific power-on sequence that's known to
> > > work for all the children. Then it should start probing.
> > >
> > > I think there can still be plenty of common helper functions that the
> > > board-specific prober can leverage, but overall I'd expect the actual
> > > power-on and power-off code to be board-specific.
> > >
> > > If many boards have in common that we need to turn on exactly one
> > > regulator + one GPIO, or just one regulator, or whatever then having a
> > > helper function that handles these cases is fine. ...but it should be
> > > one of many choices that a board proper could use and not the only
> > > one.
> >
> > IIUC we could have the "options" data structure have much more board
> > specific information:
> >
> >   - name of node to fetch resources (regulator supplies and GPIOs) from
> >   - names of the resources for the node given from the previous item
> >   - delay time after each resource is toggled
> >   - polarity in the case of GPIOs
> >   - prober callback to do power sequencing
> >
> > The "resource collection" step would use the first two items to retrieve
> > the regulator supplies and GPIOS instead of the bulk APIs used right now.
> >
> > The power sequencing callback would use the resources combined with the
> > given delays to enable the supplies and toggle the GPIOs.
> >
> > For now I would probably only implement a generic one regulator supply
> > plus one GPIO helper. That is the common case for touchscreens and
> > trackpads connected over a ribbon cable.
> >
> > Does that sound like what you have in mind?
>
> I guess I'd have to see how the code looks to know for sure, but if I
> understand it sounds a little awkward. Specifically, the "options"
> sound like they might become complicated enough that you're inventing
> your own little programming language (with delays, abilities to drive
> pins low and high, abilities to turn on/off clocks, and abilities to
> turn off/on regulators) and then probers need to code up their
> programs in this language. You also need to handle undoing things
> properly if there is a failure in the middle. Like your "program"
> would look like this (obviously you'd have to play with enums more,
> but you get the idea):
>
> {
>    { OPCODE_TURN_REGULATOR_ON, "vdd" },
>    { OPCODE_DELAY, 10 },
>    { OPCODE_GPIO_ASSERT, "reset" },
>    { OPCODE_DELAY, 5 },
>    { OPCODE_GPIO_DEASSERT "reset" },
>    { OPCODE_DELAY, 100 },
>    { OPCODE_TURN_REGULATOR_ON, "vddIO" },
> }
>
> Why not just expect the board probers to write C code to turn things
> on before looking for i2c devices, then provide helpers to the C code?
>
> So there wouldn't be some generic "resource collection" API, but you'd
> provide a helper to make it easy to grab regulators from one of the
> nodes by name. If you think bulk enabling regulators is common then
> you could make a helper that grabs all of the regulators from a node
> in a way that is consistent with the bulk APIs, but I wouldn't expect
> every driver to use that since devices I've seen expect regulators to
> be enabled in a very specific order even if they don't need a delay
> between them.
>
> I wouldn't expect a "collect all GPIOs" API because it seems really
> weird to me that we'd ever want to jam multiple GPIOs in a state
> without knowing exactly which GPIO was what and asserting them in the
> right sequence.

So I'm slightly confused, as it sounds like at this point the i2c prober
would be litter more than just a framework, and the heavy lifting is to
be all done by callbacks provided by the board-specific driver?

So the framework becomes something like:

1. find i2c bus node
2. call provided callback with i2c bus node to gather resources;
   let callback handle specifics
3. call provided callback to enable resources
4. for each i2c component, call provided callback to probe

  If the probe succeeded:

    5. call provided callback for early release of resources (GPIOs)
    6. set "status" to "okay"
    7. call provided callback for late release of resources (regulators)

  Otherwise at the end of the loop

8. release resources

The current code can be reworked into helpers for steps 2, 3, 5, 7 for
the single regulator single GPIO case.

> > This next item would be a later enhancement (which isn't implemented in
> > this series anyway):
> >
> >   - optional prober callback that does actual probing
> >
> > In our case it would only be used for cases where an HID-over-I2C
> > component shares the same address as a non-HID one, and some extra
> > work is needed to determine which type it is. I still need to think
> > about the structure of this.
>
> IMO _that_ would be a great option to the i2c prober. It feels like
> you could have an optional register read that needs to match to have
> the i2c prober succeed. Most people would leave it blank (just the i2c
> device existing is enough) but probably a single register read would
> be enough to confirm you got the right device. Most i2c devices have
> some sort of "version" / "vendor" / "id" type register somewhere.

At least for the stuff that we have (touchscreens and trackpads) such
registers typically don't exist, unless it's an HID-over-I2C device,
in which case there's the standard HID descriptor at some address.
But, yeah, reading the HID descriptor was the use case I had in mind.

At least for one Chromebooks it's a bit more tricky because that one
HID-over-I2C component shares the same address as a non-HID one. We
currently have different SKU IDs and thus different device trees for
them, but we could make the prober work with this. It just has be able
to tell if the component it's currently probing needs the special
prober and is it responding correctly. This bit I need to think about.


ChenYu


From herbert at gondor.apana.org.au  Thu Sep  5 23:59:33 2024
From: herbert at gondor.apana.org.au (Herbert Xu)
Date: Fri, 6 Sep 2024 14:59:33 +0800
Subject: [PATCH] hwrng: mtk - Use devm_pm_runtime_enable
In-Reply-To: <20240826070415.12425-1-guoqing.jiang@canonical.com>
References: <20240826070415.12425-1-guoqing.jiang@canonical.com>
Message-ID: <ZtqoVVpgqmVgCcc-@gondor.apana.org.au>

On Mon, Aug 26, 2024 at 03:04:15PM +0800, Guoqing Jiang wrote:
> Replace pm_runtime_enable with the devres-enabled version which
> can trigger pm_runtime_disable.
> 
> Otherwise, the below appears during reload driver.
> 
> mtk_rng 1020f000.rng: Unbalanced pm_runtime_enable!
> 
> Suggested-by: Chen-Yu Tsai <wenst at chromium.org>
> Signed-off-by: Guoqing Jiang <guoqing.jiang at canonical.com>
> ---
>  drivers/char/hw_random/mtk-rng.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)

Patch applied.  Thanks.
-- 
Email: Herbert Xu <herbert at gondor.apana.org.au>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt


From u.kleine-koenig at baylibre.com  Fri Sep  6 01:01:38 2024
From: u.kleine-koenig at baylibre.com (Uwe =?utf-8?Q?Kleine-K=C3=B6nig?=)
Date: Fri, 6 Sep 2024 10:01:38 +0200
Subject: [PATCH v3 5/5] pwm: airoha: Add support for EN7581 SoC
In-Reply-To: <2e8806fa-c476-4cfa-bc2e-dc02754830d1@genexis.eu>
References: <20240831-en7581-pinctrl-v3-0-98eebfb4da66@kernel.org>
 <20240831-en7581-pinctrl-v3-5-98eebfb4da66@kernel.org>
 <yfqmlca6cnhrghpo5s6tml36tngmekcfbyjakxs7or7wtap3ka@7qlrxjowo4ou>
 <d9298199-fe10-4b28-8e28-dc252bd6832c@genexis.eu>
 <t2f5kockuvfi66qqumda6jxf5a4c4zf35ld5ainsnksavkchyj@kdueaqlhjoar>
 <b7e44fb2-6cf6-4530-a271-9e1730d4f431@genexis.eu>
 <xmlta4za6malgthd6cmt5fcipxgyzwmqwxqdg5e4qahcuqzcrt@eidsf6mexrkz>
 <a0a14b57-cc4e-43ef-984f-fb405949b41d@genexis.eu>
 <64zfjgmc2dutmsukg2bxhb44k3wu2y7tt3h26hej7d4fx5nc7z@5zvo3hsucipc>
 <2e8806fa-c476-4cfa-bc2e-dc02754830d1@genexis.eu>
Message-ID: <e53ye6cu5debj2jn5uv4vxdujedwf4gu3ocuk5ccbhzkhosk66@hovtzgbqhesm>

Hello Benjamin,

On Thu, Sep 05, 2024 at 08:35:17PM +0200, Benjamin Larsson wrote:
> On 05/09/2024 17:39, Uwe Kleine-K?nig wrote:
> > On Thu, Sep 05, 2024 at 02:18:41PM +0200, Benjamin Larsson wrote:
> > > On 2024-09-05 11:30, Uwe Kleine-K?nig wrote:
> > > > 1 second long pulses with a period size of 1 second, so a constant high
> > > > signal?
> > > Hi, I think I was unclear. The SoC documentation is not that detailed. But I
> > > think I understand how it works now.
> > > 
> > > One register contains the minimum duration (d_min). And then there is one 8
> > > bit register for the signal low period (lp) and then another 8bit register
> > > for the high period (hp). Per my understanding a change of polarity is then
> > > just a swap of lp and hp.
> > that doesn't sound right.
> > 
> > A "normal" waveform with period = 10 ns and duty_cycle = 2 ns looks as
> > follows:
> > 
> >     _         _         _
> >    / \_______/ \_______/ \_______/
> >    ^         ^         ^         ^
> > 
> > assuming a monospace font that's 1 char per ns, the ^ marking the period
> > start.
> > 
> > Ignoring scaling, your hardware needs to have hp = 2 and lp = 8. If you
> > switch that (assuming you mean switching in the same way as I do) to hp
> > = 8 and lp = 2, you get:
> > 
> >     _______   _______   _______
> >    /       \_/       \_/       \_/
> >    ^         ^         ^         ^
> > 
> > which is still a "normal" polarity output as a period starts with the
> > active part.
> > 
> > I admit that's a bit artificial, because the waveform for
> > 
> > 	period = 10 ns
> > 	duty_cycle = 2 ns
> > 	polarity = inversed
> > 
> > looks as follows:
> > 
> >       _______   _______   _______
> >    \_/       \_/       \_/       \_/
> >    ^         ^         ^         ^
> > 
> > which isn't any different from the 2nd waveform above if you ignore the
> > period start markers (which are not observable apart from the moments
> > where you reconfigure the output).
> > 
> > However it matters if you have a chip with >1 output that are not
> > independent.
> 
> 
> Ok that was a clear explanation,

\o/

> anyway the pwm hardware is then not capable
> of a polarity change. It is possible to change the polarity via other means
> but there is no way for the pwm block (and driver) to handle this.

That's ok. Just do something like

	if (state->polarity != PWM_POLARITY_NORMAL)
		return -EINVAL;

It's quite usual that drivers only support a single polarity.

> > > This means that when requesting a period and duty cycle you need to search
> > > through the configuration space to find the optimal value.
> > Or restrict yourself consistently to something simpler than a exhaustive
> > search through the complete configuration space.
> 
> Is there a recommendation on what is more important? Period duration or duty
> cycle percentage?

That really depends on your usage domain. Just pick an algorithm that is
sound, ideally easy to review and serves your purpose. If you pick
something that is too simple for the next consumer, we can add the
needed complexity still later.

So in my book even something like restricting the period to a single
fixed value and just modify the duty cycle is fine. In that case add a
comment that there is room for improvement and I'm happy.

Best regards
Uwe
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-mediatek/attachments/20240906/692aa83a/attachment-0001.sig>

From angelogioacchino.delregno at collabora.com  Fri Sep  6 01:09:31 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Fri, 6 Sep 2024 08:09:31 +0000
Subject: [PATCH] arm64: dts: mediatek: mt8186: Fix supported-hw mask for
 GPU OPPs
In-Reply-To: <9aec2480-5b49-4fd0-8ad0-9fd87c865630@gmail.com>
References: <20240725072243.173104-1-angelogioacchino.delregno@collabora.com>
 <9aec2480-5b49-4fd0-8ad0-9fd87c865630@gmail.com>
Message-ID: <01020191c6619a72-e5b5627b-9094-4737-8333-28d2e0837303-000000@eu-west-1.amazonses.com>

Il 02/09/24 18:07, Matthias Brugger ha scritto:
> 
> 
> On 25/07/2024 09:22, AngeloGioacchino Del Regno wrote:
>> The speedbin eFuse reads a value 'x' from 0 to 7 and, in order to
>> make that compatible with opp-supported-hw, it gets post processed
>> as BIT(x).
>>
>> Change all of the 0x30 supported-hw to 0x20 to avoid getting
>> duplicate OPPs for speedbin 4, and also change all of the 0x8 to
>> 0xcf because speedbins different from 4 and 5 do support 900MHz,
>> 950MHz, 1000MHz with the higher voltage of 850mV, 900mV, 950mV
>> respectively.
>>
>> Fixes: f38ea593ad0d ("arm64: dts: mediatek: mt8186: Wire up GPU voltage/frequency 
>> scaling")
>> Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
> 
> Patch got applied and is queued for v6.12 (v6.11-next/dts64 branch).
> Somehow no email was send to inform about this.
> 
> Angelo, not sure if it's worth investigating what happened.
> 

Thanks for that, yes I checked and I know what went wrong - shouldn't happen
anymore :-)

Cheers!
Angelo

> Regards,
> Matthias
> 
>> ---
>> ? arch/arm64/boot/dts/mediatek/mt8186.dtsi | 12 ++++++------
>> ? 1 file changed, 6 insertions(+), 6 deletions(-)
>>
>> diff --git a/arch/arm64/boot/dts/mediatek/mt8186.dtsi 
>> b/arch/arm64/boot/dts/mediatek/mt8186.dtsi
>> index 4763ed5dc86c..d63a9defe73e 100644
>> --- a/arch/arm64/boot/dts/mediatek/mt8186.dtsi
>> +++ b/arch/arm64/boot/dts/mediatek/mt8186.dtsi
>> @@ -731,7 +731,7 @@ opp-850000000 {
>> ????????? opp-900000000-3 {
>> ????????????? opp-hz = /bits/ 64 <900000000>;
>> ????????????? opp-microvolt = <850000>;
>> -??????????? opp-supported-hw = <0x8>;
>> +??????????? opp-supported-hw = <0xcf>;
>> ????????? };
>> ????????? opp-900000000-4 {
>> @@ -743,13 +743,13 @@ opp-900000000-4 {
>> ????????? opp-900000000-5 {
>> ????????????? opp-hz = /bits/ 64 <900000000>;
>> ????????????? opp-microvolt = <825000>;
>> -??????????? opp-supported-hw = <0x30>;
>> +??????????? opp-supported-hw = <0x20>;
>> ????????? };
>> ????????? opp-950000000-3 {
>> ????????????? opp-hz = /bits/ 64 <950000000>;
>> ????????????? opp-microvolt = <900000>;
>> -??????????? opp-supported-hw = <0x8>;
>> +??????????? opp-supported-hw = <0xcf>;
>> ????????? };
>> ????????? opp-950000000-4 {
>> @@ -761,13 +761,13 @@ opp-950000000-4 {
>> ????????? opp-950000000-5 {
>> ????????????? opp-hz = /bits/ 64 <950000000>;
>> ????????????? opp-microvolt = <850000>;
>> -??????????? opp-supported-hw = <0x30>;
>> +??????????? opp-supported-hw = <0x20>;
>> ????????? };
>> ????????? opp-1000000000-3 {
>> ????????????? opp-hz = /bits/ 64 <1000000000>;
>> ????????????? opp-microvolt = <950000>;
>> -??????????? opp-supported-hw = <0x8>;
>> +??????????? opp-supported-hw = <0xcf>;
>> ????????? };
>> ????????? opp-1000000000-4 {
>> @@ -779,7 +779,7 @@ opp-1000000000-4 {
>> ????????? opp-1000000000-5 {
>> ????????????? opp-hz = /bits/ 64 <1000000000>;
>> ????????????? opp-microvolt = <875000>;
>> -??????????? opp-supported-hw = <0x30>;
>> +??????????? opp-supported-hw = <0x20>;
>> ????????? };
>> ????? };




From angelogioacchino.delregno at collabora.com  Fri Sep  6 01:14:03 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Fri, 6 Sep 2024 08:14:03 +0000
Subject: [PATCH v2 1/1] drm/mediatek: Fix get efuse issue for MT8188 DPTX
In-Reply-To: <20240902133736.16461-1-liankun.yang@mediatek.com>
References: <20240902133736.16461-1-liankun.yang@mediatek.com>
Message-ID: <01020191c665c261-8b839b39-d297-441f-8b83-49edd60ba752-000000@eu-west-1.amazonses.com>

Il 02/09/24 15:36, Liankun Yang ha scritto:
> Update efuse data for MT8188 displayport.
> 
> The DP monitor can not display when DUT connected to USB-c to DP dongle.
> Analysis view is invalid DP efuse data.
> 
> Fixes: 350c3fe907fb ("drm/mediatek: dp: Add support MT8188 dp/edp function")
> 
> Changes in V2:
> - Add Fixes tag.
> - Update the commit title.
> - Update the commit description.
> Per suggestion from the previous thread:
> https://patchwork.kernel.org/project/linux-mediatek/patch/
> 20240510061716.31103-1-liankun.yang at mediatek.com/
> 
> Signed-off-by: Liankun Yang <liankun.yang at mediatek.com>

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>



From angelogioacchino.delregno at collabora.com  Fri Sep  6 01:15:45 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Fri, 6 Sep 2024 08:15:45 +0000
Subject: [PATCH v4 2/3] media: platform: mtk-mdp3: Use cmdq_pkt_create()
 and cmdq_pkt_destroy()
In-Reply-To: <20240901143259.16849-3-chunkuang.hu@kernel.org>
References: <20240901143259.16849-1-chunkuang.hu@kernel.org>
 <20240901143259.16849-3-chunkuang.hu@kernel.org>
Message-ID: <01020191c6674f69-5391f772-bfad-44bd-884e-c3ce732c19b5-000000@eu-west-1.amazonses.com>

Il 01/09/24 16:32, Chun-Kuang Hu ha scritto:
> Use cmdq_pkt_create() and cmdq_pkt_destroy() common function
> instead of implementing mdp3 version.
> 
> Signed-off-by: Chun-Kuang Hu <chunkuang.hu at kernel.org>

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>



From angelogioacchino.delregno at collabora.com  Fri Sep  6 01:15:45 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Fri, 6 Sep 2024 08:15:45 +0000
Subject: [PATCH v4 1/3] media: platform: mtk-mdp3: Get fine-grain control
 of cmdq_pkt_finalize()
In-Reply-To: <20240901143259.16849-2-chunkuang.hu@kernel.org>
References: <20240901143259.16849-1-chunkuang.hu@kernel.org>
 <20240901143259.16849-2-chunkuang.hu@kernel.org>
Message-ID: <01020191c667530a-66e8f4db-1b0e-46d3-a69b-3362e84e0f02-000000@eu-west-1.amazonses.com>

Il 01/09/24 16:32, Chun-Kuang Hu ha scritto:
> In order to have fine-grained control, use cmdq_pkt_eoc() and
> cmdq_pkt_jump_rel() to replace cmdq_pkt_finalize().
> 
> Signed-off-by: Chun-Kuang Hu <chunkuang.hu at kernel.org>

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>




From angelogioacchino.delregno at collabora.com  Fri Sep  6 01:17:36 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Fri, 6 Sep 2024 08:17:36 +0000
Subject: [PATCH v4 3/3] soc: mediatek: cmdq: Remove cmdq_pkt_finalize()
 helper function
In-Reply-To: <20240901143259.16849-4-chunkuang.hu@kernel.org>
References: <20240901143259.16849-1-chunkuang.hu@kernel.org>
 <20240901143259.16849-4-chunkuang.hu@kernel.org>
Message-ID: <01020191c669040b-0320e5c0-d4b2-4241-a403-09ec32f7ef35-000000@eu-west-1.amazonses.com>

Il 01/09/24 16:32, Chun-Kuang Hu ha scritto:
> In order to have fine-grained control, use cmdq_pkt_eoc() and
> cmdq_pkt_jump_rel() to replace cmdq_pkt_finalize().
> 
> Signed-off-by: Chun-Kuang Hu <chunkuang.hu at kernel.org>

I'll pick this one after the media patches will be mainlined to avoid issues.

In the meanwhile, mainly as a self-reminder:
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>




From cengjianeng at huaqin.corp-partner.google.com  Fri Sep  6 01:57:37 2024
From: cengjianeng at huaqin.corp-partner.google.com (Jianeng Ceng)
Date: Fri,  6 Sep 2024 16:57:37 +0800
Subject: [PATCH v4 0/2] arm64: dts: mediatek: Add MT8186 Ponyta
Message-ID: <20240906085739.1322676-1-cengjianeng@huaqin.corp-partner.google.com>

This is v4 of the MT8186 Chromebook device tree series.
---
Changes in v4:
- PATCH 1/2: Add more info for Ponyta custom label in commit.
- Link to v3:https://lore.kernel.org/all/20240904081501.2060933-1-cengjianeng at huaqin.corp-partner.google.com/

Changes in v3:
- PATCH 0/2: Add the modify records.
- PATCH 1/2: Modify lable to label.
- Link to v2:https://lore.kernel.org/all/20240903061603.3007289-1-cengjianeng at huaqin.corp-partner.google.com/

Changes in v2:
- PATCH 2/2: Modify the dtb name without rev2.
- Link to v1:https://lore.kernel.org/all/20240902125502.1844374-1-cengjianeng at huaqin.corp-partner.google.com/

Jianeng Ceng (2):
  dt-bindings: arm: mediatek: Add MT8186 Ponyta Chromebook
  arm64: dts: mediatek: Add MT8186 Ponyta Chromebooks

 .../devicetree/bindings/arm/mediatek.yaml     | 11 +++++
 arch/arm64/boot/dts/mediatek/Makefile         |  2 +
 .../mediatek/mt8186-corsola-ponyta-sku0.dts   | 24 ++++++++++
 .../mediatek/mt8186-corsola-ponyta-sku1.dts   | 27 ++++++++++++
 .../dts/mediatek/mt8186-corsola-ponyta.dtsi   | 44 +++++++++++++++++++
 5 files changed, 108 insertions(+)
 create mode 100644 arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku0.dts
 create mode 100644 arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku1.dts
 create mode 100644 arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta.dtsi

-- 
2.34.1



From cengjianeng at huaqin.corp-partner.google.com  Fri Sep  6 01:57:38 2024
From: cengjianeng at huaqin.corp-partner.google.com (Jianeng Ceng)
Date: Fri,  6 Sep 2024 16:57:38 +0800
Subject: [PATCH v4 1/2] dt-bindings: arm: mediatek: Add MT8186 Ponyta Chromebook
In-Reply-To: <20240906085739.1322676-1-cengjianeng@huaqin.corp-partner.google.com>
References: <20240906085739.1322676-1-cengjianeng@huaqin.corp-partner.google.com>
Message-ID: <20240906085739.1322676-2-cengjianeng@huaqin.corp-partner.google.com>

Ponyta is a custom label Chromebook based on MT8186. It is a
self-developed project of Huaqin and has no fixed OEM.

Signed-off-by: Jianeng Ceng <cengjianeng at huaqin.corp-partner.google.com>
---
Changes in v4:
- PATCH 1/2: Add more info for Ponyta custom label in commit.
- Link to v3:https://lore.kernel.org/all/20240904081501.2060933-1-cengjianeng at huaqin.corp-partner.google.com/

Changes in v3:
- PATCH 1/2: Modify lable to label.
- Link to v2:https://lore.kernel.org/all/20240903061603.3007289-1-cengjianeng at huaqin.corp-partner.google.com/

Chage since V2:
- No change.

---
 Documentation/devicetree/bindings/arm/mediatek.yaml | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/Documentation/devicetree/bindings/arm/mediatek.yaml b/Documentation/devicetree/bindings/arm/mediatek.yaml
index 1d4bb50fcd8d..4bc1777b9ea6 100644
--- a/Documentation/devicetree/bindings/arm/mediatek.yaml
+++ b/Documentation/devicetree/bindings/arm/mediatek.yaml
@@ -257,6 +257,17 @@ properties:
           - const: google,steelix-sku393218
           - const: google,steelix
           - const: mediatek,mt8186
+      - description: Google Ponyta (Custom label)
+        items:
+          - const: google,ponyta-sku0
+          - const: google,ponyta-sku2147483647
+          - const: google,ponyta
+          - const: mediatek,mt8186
+      - description: Google Ponyta (Custom label)
+        items:
+          - const: google,ponyta-sku1
+          - const: google,ponyta
+          - const: mediatek,mt8186
       - description: Google Rusty (Lenovo 100e Chromebook Gen 4)
         items:
           - const: google,steelix-sku196609
-- 
2.34.1



From cengjianeng at huaqin.corp-partner.google.com  Fri Sep  6 01:57:39 2024
From: cengjianeng at huaqin.corp-partner.google.com (Jianeng Ceng)
Date: Fri,  6 Sep 2024 16:57:39 +0800
Subject: [PATCH v4 2/2] arm64: dts: mediatek: Add MT8186 Ponyta Chromebooks
In-Reply-To: <20240906085739.1322676-1-cengjianeng@huaqin.corp-partner.google.com>
References: <20240906085739.1322676-1-cengjianeng@huaqin.corp-partner.google.com>
Message-ID: <20240906085739.1322676-3-cengjianeng@huaqin.corp-partner.google.com>

MT8186 ponyta, known as huaqin custom label, is a
MT8186 based laptop. It is based on the "corsola" design.
It includes LTE, touchpad combinations.

Signed-off-by: Jianeng Ceng <cengjianeng at huaqin.corp-partner.google.com>
---
Changes in v2:
- PATCH 2/2: Modify the dtb name without rev2.
- Link to v1:https://lore.kernel.org/all/20240902125502.1844374-1-cengjianeng at huaqin.corp-partner.google.com/

---
 arch/arm64/boot/dts/mediatek/Makefile         |  2 +
 .../mediatek/mt8186-corsola-ponyta-sku0.dts   | 24 ++++++++++
 .../mediatek/mt8186-corsola-ponyta-sku1.dts   | 27 ++++++++++++
 .../dts/mediatek/mt8186-corsola-ponyta.dtsi   | 44 +++++++++++++++++++
 4 files changed, 97 insertions(+)
 create mode 100644 arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku0.dts
 create mode 100644 arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku1.dts
 create mode 100644 arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta.dtsi

diff --git a/arch/arm64/boot/dts/mediatek/Makefile b/arch/arm64/boot/dts/mediatek/Makefile
index 8fd7b2bb7a15..50b5cf04d3ae 100644
--- a/arch/arm64/boot/dts/mediatek/Makefile
+++ b/arch/arm64/boot/dts/mediatek/Makefile
@@ -58,6 +58,8 @@ dtb-$(CONFIG_ARCH_MEDIATEK) += mt8183-pumpkin.dtb
 dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-magneton-sku393216.dtb
 dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-magneton-sku393217.dtb
 dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-magneton-sku393218.dtb
+dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-ponyta-sku0.dtb
+dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-ponyta-sku1.dtb
 dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-rusty-sku196608.dtb
 dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-steelix-sku131072.dtb
 dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-steelix-sku131073.dtb
diff --git a/arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku0.dts b/arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku0.dts
new file mode 100644
index 000000000000..87e8368189d9
--- /dev/null
+++ b/arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku0.dts
@@ -0,0 +1,24 @@
+// SPDX-License-Identifier: (GPL-2.0 OR MIT)
+/*
+ * Copyright 2023 Google LLC
+ */
+
+/dts-v1/;
+#include "mt8186-corsola-ponyta.dtsi"
+
+/ {
+	model = "Google Ponyta sku0/unprovisioned board";
+	compatible = "google,ponyta-sku0", "google,ponyta-sku2147483647",
+		     "google,ponyta", "mediatek,mt8186";
+};
+
+&i2c2 {
+	touchpad at 2c {
+		compatible = "hid-over-i2c";
+		reg = <0x2c>;
+		hid-descr-addr = <0x20>;
+		interrupts-extended = <&pio 11 IRQ_TYPE_LEVEL_LOW>;
+		vcc-supply = <&pp3300_s3>;
+		wakeup-source;
+	};
+};
diff --git a/arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku1.dts b/arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku1.dts
new file mode 100644
index 000000000000..203ee109bbf7
--- /dev/null
+++ b/arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku1.dts
@@ -0,0 +1,27 @@
+// SPDX-License-Identifier: (GPL-2.0 OR MIT)
+/*
+ * Copyright 2023 Google LLC
+ */
+
+/dts-v1/;
+#include "mt8186-corsola-ponyta.dtsi"
+
+/ {
+	model = "Google Ponyta sku1 board";
+	compatible = "google,ponyta-sku1", "google,ponyta", "mediatek,mt8186";
+};
+
+&i2c2 {
+	touchpad at 15 {
+		compatible = "elan,ekth3000";
+		reg = <0x15>;
+		interrupt-parent = <&pio>;
+		interrupts = <11 IRQ_TYPE_LEVEL_LOW>;
+		vcc-supply = <&pp3300_s3>;
+		wakeup-source;
+	};
+};
+
+&usb_c1 {
+	status = "disabled";
+};
diff --git a/arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta.dtsi b/arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta.dtsi
new file mode 100644
index 000000000000..59594022331e
--- /dev/null
+++ b/arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta.dtsi
@@ -0,0 +1,44 @@
+// SPDX-License-Identifier: (GPL-2.0 OR MIT)
+/*
+ * Copyright 2023 Google LLC
+ */
+
+/dts-v1/;
+#include "mt8186-corsola-steelix.dtsi"
+
+&keyboard_controller {
+	function-row-physmap = <
+		MATRIX_KEY(0x00, 0x02, 0)	/* T1 */
+		MATRIX_KEY(0x03, 0x02, 0)	/* T2 */
+		MATRIX_KEY(0x02, 0x02, 0)	/* T3 */
+		MATRIX_KEY(0x01, 0x02, 0)	/* T4 */
+		MATRIX_KEY(0x03, 0x04, 0)	/* T5 */
+		MATRIX_KEY(0x02, 0x04, 0)	/* T6 */
+		MATRIX_KEY(0x01, 0x04, 0)	/* T7 */
+		MATRIX_KEY(0x00, 0x04, 0)	/* T8 */
+		MATRIX_KEY(0x00, 0x01, 0)	/* T9 */
+		MATRIX_KEY(0x02, 0x09, 0)	/* T10 */
+		MATRIX_KEY(0x01, 0x09, 0)	/* T11 */
+		MATRIX_KEY(0x01, 0x05, 0)	/* T12 */
+	>;
+
+	linux,keymap = <
+		CROS_STD_MAIN_KEYMAP
+		MATRIX_KEY(0x00, 0x02, KEY_BACK)
+		MATRIX_KEY(0x03, 0x02, KEY_REFRESH)
+		MATRIX_KEY(0x02, 0x02, KEY_ZOOM)
+		MATRIX_KEY(0x01, 0x02, KEY_SCALE)
+		MATRIX_KEY(0x03, 0x04, KEY_SYSRQ)
+		MATRIX_KEY(0x02, 0x04, KEY_BRIGHTNESSDOWN)
+		MATRIX_KEY(0x01, 0x04, KEY_BRIGHTNESSUP)
+		MATRIX_KEY(0x00, 0x04, KEY_PLAYPAUSE)
+		MATRIX_KEY(0x00, 0x01, KEY_MICMUTE)
+		MATRIX_KEY(0x02, 0x09, KEY_MUTE)
+		MATRIX_KEY(0x01, 0x09, KEY_VOLUMEDOWN)
+		MATRIX_KEY(0x01, 0x05, KEY_VOLUMEUP)
+	>;
+};
+
+&mt6366codec {
+	mediatek,dmic-mode = <1>; /* one-wire */
+};
-- 
2.34.1



From regressions at leemhuis.info  Fri Sep  6 03:34:18 2024
From: regressions at leemhuis.info (Linux regression tracking (Thorsten Leemhuis))
Date: Fri, 6 Sep 2024 12:34:18 +0200
Subject: [REGRESSION] [BISECTED] btusb: driver fails to initialize
 MT7921AUN on v6.11-rc4
In-Reply-To: <76922517-7497-48b5-a581-d1290d413604@molgen.mpg.de>
References: <ZsTh7Jyug7MbZsLE@mdpsys.co.uk>
 <76922517-7497-48b5-a581-d1290d413604@molgen.mpg.de>
Message-ID: <acc76c2a-b176-4a19-8b5b-2ced402c3c8e@leemhuis.info>

Hi, Thorsten here, the Linux kernel's regression tracker. Top-posting
for once, to make this easily accessible to everyone.

Marc, does the problem still occur with recent mainline? It looks like
nobody ever took care of this report, but I might be missing something
-- or maybe some later change fixed this intentionally or due to
side-effects.

Ciao, Thorsten (wearing his 'the Linux kernel's regression tracker' hat)

On 21.08.24 07:27, Paul Menzel wrote:
> [Cc: +Marcel, +Luiz]
> 
> Thank you for your report and bisecting the issue. I just add the
> maintainers, and tell regzbot about it.
> 
> Am 20.08.24 um 20:35 schrieb Marc Payne:
>> Hello,
>>
>> I'm testing v6.11-rc4 and the btusb driver fails to properly
>> initialize my
>> MT7921AUN-based Alfa Networks AWUS036AXML:
>>
>> [?? 63.896319] usb 4-3.1.2: new SuperSpeed USB device number 4 using
>> xhci_hcd
>> [?? 63.915436] usb 4-3.1.2: New USB device found, idVendor=0e8d,
>> idProduct=7961, bcdDevice= 1.00
>> [?? 63.915450] usb 4-3.1.2: New USB device strings: Mfr=6, Product=7,
>> SerialNumber=8
>> [?? 63.915455] usb 4-3.1.2: Product: Wireless_Device
>> [?? 63.915459] usb 4-3.1.2: Manufacturer: MediaTek Inc.
>> [?? 63.915461] usb 4-3.1.2: SerialNumber: 000000000
>> [?? 69.146856] Bluetooth: hci1: Failed to write uhw reg(-110)
>> [?? 69.149213] Bluetooth: hci1: HW/SW Version: 0x008a008a, Build Time:
>> 20240716151445
>> [?? 78.530621] usb 4-3.1.2: Failed to suspend device, error -110
>> [?? 88.553074] Bluetooth: hci1: Execution of wmt command timed out
>> [?? 88.553097] Bluetooth: hci1: Failed to send wmt patch dwnld (-110)
>> [?? 88.553186] Bluetooth: hci1: Failed to set up firmware (-110)
>> [?? 88.553193] Bluetooth: hci1: HCI Enhanced Setup Synchronous
>> Connection command is advertised, but not supported.
>> [?? 90.899462] usb 4-3.1.2: Failed to suspend device, error -110
>>
>> I have bisected the issue down to the following commit:
>>
>> ???? ccfc8948d7e4 ("Bluetooth: btusb: mediatek: reset the controller
>> before downloading the fw")
>>
>> The commit does not revert cleanly due to refactoring in subsequent
>> commits but
>> removing the relevant ten lines of code allows the driver to
>> initialize the
>> device correctly, albeit with some failures and 'Mediatek coredump'
>> errors
>> followed by an additional reset. Interestingly, after the reset the
>> device is
>> now showing as hci2 rather than hci1, suggesting an HCI device
>> registration
>> issue... Bluetooth devices are able to pair and connect as expected:
>>
>> [?? 77.765047] usb 4-3.1.2: new SuperSpeed USB device number 4 using
>> xhci_hcd
>> [?? 77.785044] usb 4-3.1.2: New USB device found, idVendor=0e8d,
>> idProduct=7961, bcdDevice= 1.00
>> [?? 77.785063] usb 4-3.1.2: New USB device strings: Mfr=6, Product=7,
>> SerialNumber=8
>> [?? 77.785069] usb 4-3.1.2: Product: Wireless_Device
>> [?? 77.785073] usb 4-3.1.2: Manufacturer: MediaTek Inc.
>> [?? 77.785077] usb 4-3.1.2: SerialNumber: 000000000
>> [?? 77.807685] Bluetooth: hci1: HW/SW Version: 0x008a008a, Build Time:
>> 20240716151445
>> [?? 80.570163] Bluetooth: hci1: Device setup in 2710186 usecs
>> [?? 80.570173] Bluetooth: hci1: HCI Enhanced Setup Synchronous
>> Connection command is advertised, but not supported.
>> [?? 81.871516] Bluetooth: hci1: Mediatek coredump end
>> [?? 82.734805] Bluetooth: hci1: Opcode 0x0c03 failed: -110
>> [?? 82.754807] Bluetooth: hci1: Mediatek coredump end
>> [?? 84.868215] Bluetooth: hci1: Failed to read MSFT supported features
>> (-110)
>> [?? 87.001566] Bluetooth: hci1: AOSP get vendor capabilities (-110)
>> [?? 92.292375] usb 4-3.1.2: reset SuperSpeed USB device number 4 using
>> xhci_hcd
>> [?? 92.385619] usb 4-3.1.2: reset SuperSpeed USB device number 4 using
>> xhci_hcd
>> [?? 92.406786] Bluetooth: hci2: HW/SW Version: 0x008a008a, Build Time:
>> 20240716151445
>> [?? 94.920337] Bluetooth: hci2: Device setup in 2455839 usecs
>> [?? 94.920343] Bluetooth: hci2: HCI Enhanced Setup Synchronous
>> Connection command is advertised, but not supported.
>> [?? 94.994480] Bluetooth: hci2: AOSP extensions version v1.00
>> [?? 94.994494] Bluetooth: hci2: AOSP quality report is supported
>> [?? 94.995001] Bluetooth: MGMT ver 1.23
>>
>> However, when disconnecting the AWUS036AXML device I get an Oops in
>> the hci_unregister_dev function, again indicating an issue with HCI
>> registration
>> which was not present in the 6.10 kernel versions:
>>
>> [ 1210.222351] usb 4-3.1.2: USB disconnect, device number 4
>> [ 1210.271146] Oops: general protection fault, probably for non-
>> canonical address 0xdead000000000122: 0000 [#1] PREEMPT SMP NOPTI
>> [ 1210.271166] CPU: 2 UID: 0 PID: 2275 Comm: kworker/2:1 Not tainted
>> 6.11.0-rc4-dirty #67 a319890a1bc323fc297a70bfc980897913c059f7
>> [ 1210.271178] Hardware name: Intel(R) Client Systems NUC12WSHi7/
>> NUC12WSBi7, BIOS WSADL357.0088.2023.0505.1623 05/05/2023
>> [ 1210.271183] Workqueue: usb_hub_wq hub_event
>> [ 1210.271200] RIP: 0010:hci_unregister_dev+0x45/0x1f0 [bluetooth]
>> [ 1210.271292] Code: 89 ef e8 0e c4 ca dc f0 80 8b e9 0e 00 00 08 48
>> 89 ef e8 6e b1 ca dc 48 c7 c7 68 70 44 c1 e8 82 12 cb dc 48 8b 43 08
>> 48 8b 13 <48> 3b 18 0f 85 35 c8 06 00 48 3b 5a 08 0f 85 2b c8 06 00 48
>> 89 42
>> [ 1210.271297] RSP: 0018:ffffbb3b0661bb98 EFLAGS: 00010246
>> [ 1210.271305] RAX: dead000000000122 RBX: ffff97bc8f92e000 RCX:
>> 0000000000000000
>> [ 1210.271310] RDX: dead000000000100 RSI: ffff97bc8ba8b610 RDI:
>> ffffffffc1447068
>> [ 1210.271314] RBP: ffff97bc8f92e4d0 R08: ffff97bc8424b5c0 R09:
>> 00000000802a0026
>> [ 1210.271318] R10: 00000000802a0026 R11: 0000000000000001 R12:
>> ffff97bc8f92e000
>> [ 1210.271323] R13: ffffffffc12ff278 R14: ffffffffc12ff278 R15:
>> ffff97bcf25acc50
>> [ 1210.271327] FS:? 0000000000000000(0000) GS:ffff97cbd7300000(0000)
>> knlGS:0000000000000000
>> [ 1210.271332] CS:? 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
>> [ 1210.271337] CR2: 0000285c01b10000 CR3: 00000003d6e22000 CR4:
>> 0000000000f50ef0
>> [ 1210.271342] PKRU: 55555554
>> [ 1210.271346] Call Trace:
>> [ 1210.271352]? <TASK>
>> [ 1210.271359]? ? __die_body.cold+0x19/0x27
>> [ 1210.271371]? ? die_addr+0x3c/0x60
>> [ 1210.271378]? ? exc_general_protection+0x17d/0x400
>> [ 1210.271391]? ? asm_exc_general_protection+0x26/0x30
>> [ 1210.271403]? ? hci_unregister_dev+0x45/0x1f0 [bluetooth
>> ffdb4fb65cead032fbb8f4718e5d0aa7b94d492f]
>> [ 1210.271479]? ? hci_unregister_dev+0x3e/0x1f0 [bluetooth
>> ffdb4fb65cead032fbb8f4718e5d0aa7b94d492f]
>> [ 1210.271551]? btusb_disconnect+0x67/0x170 [btusb
>> ce322bda915639979ec31f72a2b85eb752188d36]
>> [ 1210.271563]? usb_unbind_interface+0x90/0x290
>> [ 1210.271576]? device_release_driver_internal+0x19c/0x200
>> [ 1210.271589]? bus_remove_device+0xc6/0x130
>> [ 1210.271599]? device_del+0x161/0x3e0
>> [ 1210.271608]? ? kobject_put+0xa0/0x1d0
>> [ 1210.271617]? usb_disable_device+0x104/0x220
>> [ 1210.271627]? usb_disconnect+0xe6/0x2e0
>> [ 1210.271637]? hub_event+0x7f9/0x19d0
>> [ 1210.271648]? ? __schedule+0x3dd/0x1520
>> [ 1210.271656]? process_one_work+0x17b/0x330
>> [ 1210.271667]? worker_thread+0x2d2/0x400
>> [ 1210.271676]? ? __pfx_worker_thread+0x10/0x10
>> [ 1210.271684]? kthread+0xcf/0x100
>> [ 1210.271695]? ? __pfx_kthread+0x10/0x10
>> [ 1210.271705]? ret_from_fork+0x31/0x50
>> [ 1210.271711]? ? __pfx_kthread+0x10/0x10
>> [ 1210.271720]? ret_from_fork_asm+0x1a/0x30
>> [ 1210.271732]? </TASK>
>> [ 1210.271735] Modules linked in: mt792x_usb mt7921_common mt792x_lib
>> mt76_connac_lib mt76_usb mt76 ccm option usb_wwan rndis_host uhid cmac
>> algif_hash algif_skcipher af_alg bnep vfat fat cdc_ether usbnet
>> intel_rapl_msr intel_rapl_common intel_uncore_frequency
>> intel_uncore_frequency_common snd_sof_pci_intel_tgl
>> snd_sof_pci_intel_cnl iwlmvm snd_sof_intel_hda_generic soundwire_intel
>> soundwire_cadence snd_sof_intel_hda_common x86_pkg_temp_thermal
>> intel_powerclamp snd_sof_intel_hda_mlink snd_sof_intel_hda coretemp
>> snd_sof_pci snd_sof_xtensa_dsp kvm_intel snd_sof r8152 mii
>> snd_sof_utils mac80211 libphy snd_soc_hdac_hda kvm
>> snd_soc_acpi_intel_match soundwire_generic_allocation snd_soc_acpi
>> soundwire_bus snd_soc_avs snd_hda_codec_hdmi snd_soc_hda_codec
>> snd_hda_ext_core snd_hda_codec_realtek snd_soc_core
>> snd_hda_codec_generic snd_hda_scodec_component crct10dif_pclmul
>> crc32_pclmul polyval_clmulni snd_compress polyval_generic ac97_bus
>> libarc4 ghash_clmulni_intel snd_pcm_dmaengine sha512_ssse3
>> sha256_ssse3 snd_hda_intel sha1_ssse3
>> [ 1210.271851]? aesni_intel btusb snd_intel_dspcfg snd_intel_sdw_acpi
>> gf128mul iwlwifi snd_hda_codec btrtl crypto_simd cryptd btintel
>> tps6598x btbcm typec snd_hda_core btmtk rapl cfg80211 roles mei_pxp
>> mei_hdcp snd_hwdep intel_cstate ee1004 bluetooth igc snd_pcm spi_nor
>> intel_uncore ov13858 mei_me snd_timer thunderbolt v4l2_fwnode snd ptp
>> mei i2c_i801 v4l2_async wdat_wdt mtd pcspkr intel_lpss_pci wmi_bmof
>> pps_core i2c_smbus intel_lpss videodev soundcore i2c_mux rfkill idma64
>> intel_pmc_core mousedev igen6_edac joydev serial_multi_instantiate
>> intel_vsec mc pmt_telemetry acpi_pad acpi_tad pinctrl_tigerlake
>> pmt_class mac_hid i2c_dev dm_mod sg crypto_user loop nfnetlink
>> ip_tables x_tables ext4 crc32c_generic crc16 mbcache jbd2 xe
>> drm_ttm_helper gpu_sched drm_suballoc_helper drm_gpuvm drm_exec i915
>> hid_generic usbhid i2c_algo_bit drm_buddy ttm intel_gtt nvme
>> drm_display_helper nvme_core video spi_intel_pci cec xhci_pci
>> crc32c_intel nvme_auth spi_intel xhci_pci_renesas wmi
>> [ 1210.271992] ---[ end trace 0000000000000000 ]---
>> [ 1210.271996] RIP: 0010:hci_unregister_dev+0x45/0x1f0 [bluetooth]
>> [ 1210.272061] Code: 89 ef e8 0e c4 ca dc f0 80 8b e9 0e 00 00 08 48
>> 89 ef e8 6e b1 ca dc 48 c7 c7 68 70 44 c1 e8 82 12 cb dc 48 8b 43 08
>> 48 8b 13 <48> 3b 18 0f 85 35 c8 06 00 48 3b 5a 08 0f 85 2b c8 06 00 48
>> 89 42
>> [ 1210.272066] RSP: 0018:ffffbb3b0661bb98 EFLAGS: 00010246
>> [ 1210.272071] RAX: dead000000000122 RBX: ffff97bc8f92e000 RCX:
>> 0000000000000000
>> [ 1210.272075] RDX: dead000000000100 RSI: ffff97bc8ba8b610 RDI:
>> ffffffffc1447068
>> [ 1210.272078] RBP: ffff97bc8f92e4d0 R08: ffff97bc8424b5c0 R09:
>> 00000000802a0026
>> [ 1210.272082] R10: 00000000802a0026 R11: 0000000000000001 R12:
>> ffff97bc8f92e000
>> [ 1210.272085] R13: ffffffffc12ff278 R14: ffffffffc12ff278 R15:
>> ffff97bcf25acc50
>> [ 1210.272088] FS:? 0000000000000000(0000) GS:ffff97cbd7300000(0000)
>> knlGS:0000000000000000
>> [ 1210.272092] CS:? 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
>> [ 1210.272096] CR2: 0000285c01b10000 CR3: 00000003d6e22000 CR4:
>> 0000000000f50ef0
>> [ 1210.272099] PKRU: 55555554
>> [ 1210.272102] note: kworker/2:1[2275] exited with preempt_count 1
>>
>>
>> The kworker exiting obviously means that the kernel no longer responds
>> to events
>> on any of the USB ports...
>>
>> I hope you can track down the issue, let me know if you need any
>> additional
>> details.
>>
>> Regards,
>>
>> Marc

--
Everything you wanna know about Linux kernel regression tracking:
https://linux-regtracking.leemhuis.info/about/#tldr
If I did something stupid, please tell me, as explained on that page.

#regzbot poke



From chunhui.li at mediatek.com  Fri Sep  6 04:57:47 2024
From: chunhui.li at mediatek.com (Chunhui Li)
Date: Fri, 6 Sep 2024 19:57:47 +0800
Subject: [PATCH v3 0/1] fix module sysfs patch defect
Message-ID: <20240906115748.5367-1-chunhui.li@mediatek.com>

Hi Maintainer,

I have update the patch base on your feedback, please help review again.

V3:
-Fix initial value;
-Remove unnecessary checks about mod->sects_attrs
-Check sysfs_creat_* return value as error code
-Reorder the reveral of successful operations before exiting

We will use the information recorded in mod->sects_attrs for debugging.
   When a panic occurs in a .ko, we can use gdb to load the symbols of the .ko file
along with the coredump, and use the text segment address and init.text segment address
in mod->sects_attrs to debug. 
   If there is an error in add_sysfs_setup and the .ko is still loaded and runs normally,
when the ko suffer panic later, we would not be able to access the loading addresses
of the ko, which would prevent us from being able to debug effectively.
   Therefore, it is desired that if there is an error during load module, it should prevent
the ko from being inserted with insmod. This ensures that as long as the .ko is
successfully loaded, all necessary information for debugging is available.

Thanks for your time.


Chunhui Li (1):
  module: abort module loading when sysfs setup suffer errors

 kernel/module/sysfs.c | 57 +++++++++++++++++++++++++++----------------
 1 file changed, 36 insertions(+), 21 deletions(-)

-- 
2.45.2



From chunhui.li at mediatek.com  Fri Sep  6 04:57:48 2024
From: chunhui.li at mediatek.com (Chunhui Li)
Date: Fri, 6 Sep 2024 19:57:48 +0800
Subject: [PATCH v3 1/1] module: abort module loading when sysfs setup suffer errors
In-Reply-To: <20240906115748.5367-1-chunhui.li@mediatek.com>
References: <20240906115748.5367-1-chunhui.li@mediatek.com>
Message-ID: <20240906115748.5367-2-chunhui.li@mediatek.com>

When insmod a kernel module, if fails in add_notes_attrs or
add_sysfs_attrs such as memory allocation fail, mod_sysfs_setup
will still return success, but we can't access user interface
on android device.

Patch for make mod_sysfs_setup can check the error of
add_notes_attrs and add_sysfs_attrs

Acked-by: Luis Chamberlain <mcgrof at kernel.org>
Reviewed-by: Petr Pavlu <petr.pavlu at suse.com>
Reported-by: kernel test robot <lkp at intel.com>
Closes: https://lore.kernel.org/oe-kbuild-all/202409010016.3XIFSmRA-lkp at intel.com/
Signed-off-by: Xion Wang <xion.wang at mediatek.com>
Signed-off-by: Chunhui Li <chunhui.li at mediatek.com>
---
 kernel/module/sysfs.c | 57 +++++++++++++++++++++++++++----------------
 1 file changed, 36 insertions(+), 21 deletions(-)

diff --git a/kernel/module/sysfs.c b/kernel/module/sysfs.c
index 26efe1305c12..0e0a9137a273 100644
--- a/kernel/module/sysfs.c
+++ b/kernel/module/sysfs.c
@@ -69,12 +69,13 @@ static void free_sect_attrs(struct module_sect_attrs *sect_attrs)
 	kfree(sect_attrs);
 }
 
-static void add_sect_attrs(struct module *mod, const struct load_info *info)
+static int add_sect_attrs(struct module *mod, const struct load_info *info)
 {
 	unsigned int nloaded = 0, i, size[2];
 	struct module_sect_attrs *sect_attrs;
 	struct module_sect_attr *sattr;
 	struct bin_attribute **gattr;
+	int ret;
 
 	/* Count loaded sections and allocate structures */
 	for (i = 0; i < info->hdr->e_shnum; i++)
@@ -85,7 +86,7 @@ static void add_sect_attrs(struct module *mod, const struct load_info *info)
 	size[1] = (nloaded + 1) * sizeof(sect_attrs->grp.bin_attrs[0]);
 	sect_attrs = kzalloc(size[0] + size[1], GFP_KERNEL);
 	if (!sect_attrs)
-		return;
+		return -ENOMEM;
 
 	/* Setup section attributes. */
 	sect_attrs->grp.name = "sections";
@@ -103,8 +104,10 @@ static void add_sect_attrs(struct module *mod, const struct load_info *info)
 		sattr->address = sec->sh_addr;
 		sattr->battr.attr.name =
 			kstrdup(info->secstrings + sec->sh_name, GFP_KERNEL);
-		if (!sattr->battr.attr.name)
+		if (!sattr->battr.attr.name) {
+			ret = -ENOMEM;
 			goto out;
+		}
 		sect_attrs->nsections++;
 		sattr->battr.read = module_sect_read;
 		sattr->battr.size = MODULE_SECT_READ_SIZE;
@@ -113,13 +116,15 @@ static void add_sect_attrs(struct module *mod, const struct load_info *info)
 	}
 	*gattr = NULL;
 
-	if (sysfs_create_group(&mod->mkobj.kobj, &sect_attrs->grp))
+	ret = sysfs_create_group(&mod->mkobj.kobj, &sect_attrs->grp);
+	if (ret)
 		goto out;
 
 	mod->sect_attrs = sect_attrs;
-	return;
+	return 0;
 out:
 	free_sect_attrs(sect_attrs);
+	return ret;
 }
 
 static void remove_sect_attrs(struct module *mod)
@@ -158,15 +163,12 @@ static void free_notes_attrs(struct module_notes_attrs *notes_attrs,
 	kfree(notes_attrs);
 }
 
-static void add_notes_attrs(struct module *mod, const struct load_info *info)
+static int add_notes_attrs(struct module *mod, const struct load_info *info)
 {
 	unsigned int notes, loaded, i;
 	struct module_notes_attrs *notes_attrs;
 	struct bin_attribute *nattr;
-
-	/* failed to create section attributes, so can't create notes */
-	if (!mod->sect_attrs)
-		return;
+	int ret;
 
 	/* Count notes sections and allocate structures.  */
 	notes = 0;
@@ -176,12 +178,12 @@ static void add_notes_attrs(struct module *mod, const struct load_info *info)
 			++notes;
 
 	if (notes == 0)
-		return;
+		return 0;
 
 	notes_attrs = kzalloc(struct_size(notes_attrs, attrs, notes),
 			      GFP_KERNEL);
 	if (!notes_attrs)
-		return;
+		return -ENOMEM;
 
 	notes_attrs->notes = notes;
 	nattr = &notes_attrs->attrs[0];
@@ -201,19 +203,23 @@ static void add_notes_attrs(struct module *mod, const struct load_info *info)
 	}
 
 	notes_attrs->dir = kobject_create_and_add("notes", &mod->mkobj.kobj);
-	if (!notes_attrs->dir)
+	if (!notes_attrs->dir) {
+		ret = -ENOMEM;
 		goto out;
+	}
 
-	for (i = 0; i < notes; ++i)
-		if (sysfs_create_bin_file(notes_attrs->dir,
-					  &notes_attrs->attrs[i]))
+	for (i = 0; i < notes; ++i) {
+		ret = sysfs_create_bin_file(notes_attrs->dir, &notes_attrs->attrs[i]);
+		if (ret)
 			goto out;
+	}
 
 	mod->notes_attrs = notes_attrs;
-	return;
+	return 0;
 
 out:
 	free_notes_attrs(notes_attrs, i);
+	return ret;
 }
 
 static void remove_notes_attrs(struct module *mod)
@@ -223,9 +229,9 @@ static void remove_notes_attrs(struct module *mod)
 }
 
 #else /* !CONFIG_KALLSYMS */
-static inline void add_sect_attrs(struct module *mod, const struct load_info *info) { }
+static inline int add_sect_attrs(struct module *mod, const struct load_info *info) { }
 static inline void remove_sect_attrs(struct module *mod) { }
-static inline void add_notes_attrs(struct module *mod, const struct load_info *info) { }
+static inline int add_notes_attrs(struct module *mod, const struct load_info *info) { }
 static inline void remove_notes_attrs(struct module *mod) { }
 #endif /* CONFIG_KALLSYMS */
 
@@ -385,11 +391,20 @@ int mod_sysfs_setup(struct module *mod,
 	if (err)
 		goto out_unreg_modinfo_attrs;
 
-	add_sect_attrs(mod, info);
-	add_notes_attrs(mod, info);
+	err = add_sect_attrs(mod, info);
+	if (err)
+		goto out_del_usage_links;
+
+	err = add_notes_attrs(mod, info);
+	if (err)
+		goto out_unreg_sect_attrs;
 
 	return 0;
 
+out_unreg_sect_attrs:
+	remove_sect_attrs(mod);
+out_del_usage_links:
+	del_usage_links(mod);
 out_unreg_modinfo_attrs:
 	module_remove_modinfo_attrs(mod, -1);
 out_unreg_param:
-- 
2.45.2



From dse at thaumatec.com  Fri Sep  6 06:47:10 2024
From: dse at thaumatec.com (Daniel Semkowicz)
Date: Fri, 6 Sep 2024 15:47:10 +0200
Subject: [PATCH 07/20] drm/bridge: tc358775: use regmap instead of open
 coded access functions
In-Reply-To: <20240506-tc358775-fix-powerup-v1-7-545dcf00b8dd@kernel.org>
References: <20240506-tc358775-fix-powerup-v1-0-545dcf00b8dd@kernel.org> <20240506-tc358775-fix-powerup-v1-7-545dcf00b8dd@kernel.org>
Message-ID: <CAHgnY3=JKUCRvTtw6NzLvm+hy_GeNigj0tjOmbFupEs+=8f6ZQ@mail.gmail.com>

Hello Michael,

Thank you for the patch!

On Mon, May 6, 2024 at 3:35?PM Michael Walle <mwalle at kernel.org> wrote:
>
> The DSI bridge also supports access via DSI in-band reads and writes.
> Prepare the driver for that by converting all the access functions to
> regmap. This also have the advantage that it will make tracing and
> debugging easier and we can use all the bit manipulation helpers from
> regmap.
>
> Signed-off-by: Michael Walle <mwalle at kernel.org>
> ---
>  drivers/gpu/drm/bridge/tc358775.c | 150 +++++++++++++++++---------------------
>  1 file changed, 68 insertions(+), 82 deletions(-)
>
> diff --git a/drivers/gpu/drm/bridge/tc358775.c b/drivers/gpu/drm/bridge/tc358775.c
> index 7ae86e8d4c72..b7f15164e655 100644
> --- a/drivers/gpu/drm/bridge/tc358775.c
> +++ b/drivers/gpu/drm/bridge/tc358775.c
> @@ -16,6 +16,7 @@
>  #include <linux/media-bus-format.h>
>  #include <linux/module.h>
>  #include <linux/of_device.h>
> +#include <linux/regmap.h>
>  #include <linux/regulator/consumer.h>
>  #include <linux/slab.h>
>
> @@ -238,7 +239,7 @@ enum tc3587x5_type {
>  };
>
>  struct tc_data {
> -       struct i2c_client       *i2c;

The 'i2c' node is removed here,

> +       struct regmap           *regmap;
>         struct device           *dev;
>
>         struct drm_bridge       bridge;
> @@ -309,42 +310,6 @@ static void tc_bridge_post_disable(struct drm_bridge *bridge)
>         usleep_range(10000, 11000);
>  }
>
> -static void d2l_read(struct i2c_client *i2c, u16 addr, u32 *val)
> -{
> -       int ret;
> -       u8 buf_addr[2];
> -
> -       put_unaligned_be16(addr, buf_addr);
> -       ret = i2c_master_send(i2c, buf_addr, sizeof(buf_addr));
> -       if (ret < 0)
> -               goto fail;
> -
> -       ret = i2c_master_recv(i2c, (u8 *)val, sizeof(*val));
> -       if (ret < 0)
> -               goto fail;
> -
> -       pr_debug("d2l: I2C : addr:%04x value:%08x\n", addr, *val);
> -       return;
> -
> -fail:
> -       dev_err(&i2c->dev, "Error %d reading from subaddress 0x%x\n",
> -               ret, addr);
> -}
> -
> -static void d2l_write(struct i2c_client *i2c, u16 addr, u32 val)
> -{
> -       u8 data[6];
> -       int ret;
> -
> -       put_unaligned_be16(addr, data);
> -       put_unaligned_le32(val, data + 2);
> -
> -       ret = i2c_master_send(i2c, data, ARRAY_SIZE(data));
> -       if (ret < 0)
> -               dev_err(&i2c->dev, "Error %d writing to subaddress 0x%x\n",
> -                       ret, addr);
> -}
> -
>  /* helper function to access bus_formats */
>  static struct drm_connector *get_connector(struct drm_encoder *encoder)
>  {
> @@ -358,12 +323,33 @@ static struct drm_connector *get_connector(struct drm_encoder *encoder)
>         return NULL;
>  }
>
> +static const struct reg_sequence tc_lvmux_vesa24[] = {
> +       { LV_MX0003, LV_MX(LVI_R0, LVI_R1, LVI_R2, LVI_R3) },
> +       { LV_MX0407, LV_MX(LVI_R4, LVI_R7, LVI_R5, LVI_G0) },
> +       { LV_MX0811, LV_MX(LVI_G1, LVI_G2, LVI_G6, LVI_G7) },
> +       { LV_MX1215, LV_MX(LVI_G3, LVI_G4, LVI_G5, LVI_B0) },
> +       { LV_MX1619, LV_MX(LVI_B6, LVI_B7, LVI_B1, LVI_B2) },
> +       { LV_MX2023, LV_MX(LVI_B3, LVI_B4, LVI_B5, LVI_L0) },
> +       { LV_MX2427, LV_MX(LVI_HS, LVI_VS, LVI_DE, LVI_R6) },
> +};
> +
> +/* JEIDA-24/JEIDA-18 have the same mapping */
> +static const struct reg_sequence tc_lvmux_jeida18_24[] = {
> +       { LV_MX0003, LV_MX(LVI_R2, LVI_R3, LVI_R4, LVI_R5) },
> +       { LV_MX0407, LV_MX(LVI_R6, LVI_R1, LVI_R7, LVI_G2) },
> +       { LV_MX0811, LV_MX(LVI_G3, LVI_G4, LVI_G0, LVI_G1) },
> +       { LV_MX1215, LV_MX(LVI_G5, LVI_G6, LVI_G7, LVI_B2) },
> +       { LV_MX1619, LV_MX(LVI_B0, LVI_B1, LVI_B3, LVI_B4) },
> +       { LV_MX2023, LV_MX(LVI_B5, LVI_B6, LVI_B7, LVI_L0) },
> +       { LV_MX2427, LV_MX(LVI_HS, LVI_VS, LVI_DE, LVI_R0) },
> +};
> +
>  static void tc_bridge_enable(struct drm_bridge *bridge)
>  {
>         struct tc_data *tc = bridge_to_tc(bridge);
>         u32 hback_porch, hsync_len, hfront_porch, hactive, htime1, htime2;
>         u32 vback_porch, vsync_len, vfront_porch, vactive, vtime1, vtime2;
> -       u32 val = 0;
> +       unsigned int val = 0;
>         u16 dsiclk, clkdiv, byteclk, t1, t2, t3, vsdelay;
>         struct drm_display_mode *mode;
>         struct drm_connector *connector = get_connector(bridge->encoder);
> @@ -386,28 +372,29 @@ static void tc_bridge_enable(struct drm_bridge *bridge)
>         htime2 = (hfront_porch << 16) + hactive;
>         vtime2 = (vfront_porch << 16) + vactive;
>
> -       d2l_read(tc->i2c, IDREG, &val);
> +       regmap_read(tc->regmap, IDREG, &val);
>
>         dev_info(tc->dev, "DSI2LVDS Chip ID.%02x Revision ID. %02x **\n",
>                  (val >> 8) & 0xFF, val & 0xFF);
>
> -       d2l_write(tc->i2c, SYSRST, SYS_RST_REG | SYS_RST_DSIRX | SYS_RST_BM |
> -                 SYS_RST_LCD | SYS_RST_I2CM);
> +       regmap_write(tc->regmap, SYSRST,
> +                    SYS_RST_REG | SYS_RST_DSIRX | SYS_RST_BM | SYS_RST_LCD |
> +                    SYS_RST_I2CM);
>         usleep_range(30000, 40000);
>
> -       d2l_write(tc->i2c, PPI_TX_RX_TA, TTA_GET | TTA_SURE);
> -       d2l_write(tc->i2c, PPI_LPTXTIMECNT, LPX_PERIOD);
> -       d2l_write(tc->i2c, PPI_D0S_CLRSIPOCOUNT, 3);
> -       d2l_write(tc->i2c, PPI_D1S_CLRSIPOCOUNT, 3);
> -       d2l_write(tc->i2c, PPI_D2S_CLRSIPOCOUNT, 3);
> -       d2l_write(tc->i2c, PPI_D3S_CLRSIPOCOUNT, 3);
> +       regmap_write(tc->regmap, PPI_TX_RX_TA, TTA_GET | TTA_SURE);
> +       regmap_write(tc->regmap, PPI_LPTXTIMECNT, LPX_PERIOD);
> +       regmap_write(tc->regmap, PPI_D0S_CLRSIPOCOUNT, 3);
> +       regmap_write(tc->regmap, PPI_D1S_CLRSIPOCOUNT, 3);
> +       regmap_write(tc->regmap, PPI_D2S_CLRSIPOCOUNT, 3);
> +       regmap_write(tc->regmap, PPI_D3S_CLRSIPOCOUNT, 3);
>
>         val = ((L0EN << tc->num_dsi_lanes) - L0EN) | DSI_CLEN_BIT;
> -       d2l_write(tc->i2c, PPI_LANEENABLE, val);
> -       d2l_write(tc->i2c, DSI_LANEENABLE, val);
> +       regmap_write(tc->regmap, PPI_LANEENABLE, val);
> +       regmap_write(tc->regmap, DSI_LANEENABLE, val);
>
> -       d2l_write(tc->i2c, PPI_STARTPPI, PPI_START_FUNCTION);
> -       d2l_write(tc->i2c, DSI_STARTDSI, DSI_RX_START);
> +       regmap_write(tc->regmap, PPI_STARTPPI, PPI_START_FUNCTION);
> +       regmap_write(tc->regmap, DSI_STARTDSI, DSI_RX_START);
>
>         /* Video event mode vs pulse mode bit, does not exist for tc358775 */
>         if (tc->type == TC358765)
> @@ -431,42 +418,28 @@ static void tc_bridge_enable(struct drm_bridge *bridge)
>         vsdelay = (clkdiv * (t1 + t3) / byteclk) - hback_porch - hsync_len - hactive;
>
>         val |= TC358775_VPCTRL_VSDELAY(vsdelay);
> -       d2l_write(tc->i2c, VPCTRL, val);
> +       regmap_write(tc->regmap, VPCTRL, val);
>
> -       d2l_write(tc->i2c, HTIM1, htime1);
> -       d2l_write(tc->i2c, VTIM1, vtime1);
> -       d2l_write(tc->i2c, HTIM2, htime2);
> -       d2l_write(tc->i2c, VTIM2, vtime2);
> +       regmap_write(tc->regmap, HTIM1, htime1);
> +       regmap_write(tc->regmap, VTIM1, vtime1);
> +       regmap_write(tc->regmap, HTIM2, htime2);
> +       regmap_write(tc->regmap, VTIM2, vtime2);
>
> -       d2l_write(tc->i2c, VFUEN, VFUEN_EN);
> -       d2l_write(tc->i2c, SYSRST, SYS_RST_LCD);
> -       d2l_write(tc->i2c, LVPHY0, LV_PHY0_PRBS_ON(4) | LV_PHY0_ND(6));
> +       regmap_write(tc->regmap, VFUEN, VFUEN_EN);
> +       regmap_write(tc->regmap, SYSRST, SYS_RST_LCD);
> +       regmap_write(tc->regmap, LVPHY0, LV_PHY0_PRBS_ON(4) | LV_PHY0_ND(6));
>
>         dev_dbg(tc->dev, "bus_formats %04x bpc %d\n",
>                 connector->display_info.bus_formats[0],
>                 tc->bpc);
> -       if (connector->display_info.bus_formats[0] ==
> -               MEDIA_BUS_FMT_RGB888_1X7X4_SPWG) {
> -               /* VESA-24 */
> -               d2l_write(tc->i2c, LV_MX0003, LV_MX(LVI_R0, LVI_R1, LVI_R2, LVI_R3));
> -               d2l_write(tc->i2c, LV_MX0407, LV_MX(LVI_R4, LVI_R7, LVI_R5, LVI_G0));
> -               d2l_write(tc->i2c, LV_MX0811, LV_MX(LVI_G1, LVI_G2, LVI_G6, LVI_G7));
> -               d2l_write(tc->i2c, LV_MX1215, LV_MX(LVI_G3, LVI_G4, LVI_G5, LVI_B0));
> -               d2l_write(tc->i2c, LV_MX1619, LV_MX(LVI_B6, LVI_B7, LVI_B1, LVI_B2));
> -               d2l_write(tc->i2c, LV_MX2023, LV_MX(LVI_B3, LVI_B4, LVI_B5, LVI_L0));
> -               d2l_write(tc->i2c, LV_MX2427, LV_MX(LVI_HS, LVI_VS, LVI_DE, LVI_R6));
> -       } else {
> -               /* JEIDA-18 and JEIDA-24 */
> -               d2l_write(tc->i2c, LV_MX0003, LV_MX(LVI_R2, LVI_R3, LVI_R4, LVI_R5));
> -               d2l_write(tc->i2c, LV_MX0407, LV_MX(LVI_R6, LVI_R1, LVI_R7, LVI_G2));
> -               d2l_write(tc->i2c, LV_MX0811, LV_MX(LVI_G3, LVI_G4, LVI_G0, LVI_G1));
> -               d2l_write(tc->i2c, LV_MX1215, LV_MX(LVI_G5, LVI_G6, LVI_G7, LVI_B2));
> -               d2l_write(tc->i2c, LV_MX1619, LV_MX(LVI_B0, LVI_B1, LVI_B3, LVI_B4));
> -               d2l_write(tc->i2c, LV_MX2023, LV_MX(LVI_B5, LVI_B6, LVI_B7, LVI_L0));
> -               d2l_write(tc->i2c, LV_MX2427, LV_MX(LVI_HS, LVI_VS, LVI_DE, LVI_R0));
> -       }
> +       if (connector->display_info.bus_formats[0] == MEDIA_BUS_FMT_RGB888_1X7X4_SPWG)
> +               regmap_multi_reg_write(tc->regmap, tc_lvmux_vesa24,
> +                                      ARRAY_SIZE(tc_lvmux_vesa24));
> +       else
> +               regmap_multi_reg_write(tc->regmap, tc_lvmux_jeida18_24,
> +                                      ARRAY_SIZE(tc_lvmux_jeida18_24));
>
> -       d2l_write(tc->i2c, VFUEN, VFUEN_EN);
> +       regmap_write(tc->regmap, VFUEN, VFUEN_EN);
>
>         val = LVCFG_LVEN_BIT;
>         if (tc->lvds_link == DUAL_LINK) {
> @@ -475,7 +448,7 @@ static void tc_bridge_enable(struct drm_bridge *bridge)
>         } else {
>                 val |= TC358775_LVCFG_PCLKDIV(DIVIDE_BY_3);
>         }
> -       d2l_write(tc->i2c, LVCFG, val);
> +       regmap_write(tc->regmap, LVCFG, val);
>  }
>
>  /*
> @@ -617,7 +590,7 @@ static const struct drm_bridge_funcs tc_bridge_funcs = {
>
>  static int tc_attach_host(struct tc_data *tc)
>  {
> -       struct device *dev = &tc->i2c->dev;
> +       struct device *dev = tc->dev;
>         struct mipi_dsi_host *host;
>         struct mipi_dsi_device *dsi;
>         int ret;
> @@ -665,6 +638,14 @@ static int tc_attach_host(struct tc_data *tc)
>         return 0;
>  }
>
> +static const struct regmap_config tc358775_regmap_config = {
> +       .reg_bits = 16,
> +       .val_bits = 32,
> +       .max_register = 0xffff,
> +       .reg_format_endian = REGMAP_ENDIAN_BIG,
> +       .val_format_endian = REGMAP_ENDIAN_LITTLE,
> +};
> +
>  static int tc_probe(struct i2c_client *client)
>  {
>         struct device *dev = &client->dev;
> @@ -679,6 +660,11 @@ static int tc_probe(struct i2c_client *client)
>         tc->i2c = client;

so the assignment above is no longer correct and should
be also removed. Otherwise, this code will not compile.

>         tc->type = (enum tc3587x5_type)(unsigned long)of_device_get_match_data(dev);
>
> +       tc->regmap = devm_regmap_init_i2c(client, &tc358775_regmap_config);
> +       if (IS_ERR(tc->regmap))
> +               return dev_err_probe(dev, PTR_ERR(tc->regmap),
> +                                    "regmap i2c init failed\n");
> +
>         tc->panel_bridge = devm_drm_of_get_bridge(dev, dev->of_node,
>                                                   TC358775_LVDS_OUT0, 0);
>         if (IS_ERR(tc->panel_bridge))
>
> --
> 2.39.2
>

Kind regards
Daniel Semkowicz


From mwalle at kernel.org  Fri Sep  6 06:58:18 2024
From: mwalle at kernel.org (Michael Walle)
Date: Fri, 06 Sep 2024 15:58:18 +0200
Subject: [PATCH 07/20] drm/bridge: tc358775: use regmap instead of open
 coded access functions
In-Reply-To: <CAHgnY3=JKUCRvTtw6NzLvm+hy_GeNigj0tjOmbFupEs+=8f6ZQ@mail.gmail.com>
References: <20240506-tc358775-fix-powerup-v1-0-545dcf00b8dd@kernel.org>
 <20240506-tc358775-fix-powerup-v1-7-545dcf00b8dd@kernel.org>
 <CAHgnY3=JKUCRvTtw6NzLvm+hy_GeNigj0tjOmbFupEs+=8f6ZQ@mail.gmail.com>
Message-ID: <D3Z966PUEDVC.2HJCER9HHLTY7@kernel.org>

Hi Daniel,

On Fri Sep 6, 2024 at 3:47 PM CEST, Daniel Semkowicz wrote:
> >         tc->i2c = client;
>
> so the assignment above is no longer correct and should
> be also removed. Otherwise, this code will not compile.


Ahh yes. Thanks for noticing. I have a wip patch which I didn't
post, which had this line removed. Will post a new version soon.

Probably also going to split the patches because it seems due to
the controversy in patch 01/20 this whole series is ignored.

-michael
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 297 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-mediatek/attachments/20240906/cbc0f1f8/attachment.sig>

From dse at thaumatec.com  Fri Sep  6 07:20:28 2024
From: dse at thaumatec.com (Daniel Semkowicz)
Date: Fri, 6 Sep 2024 16:20:28 +0200
Subject: [PATCH 09/20] drm/bridge: tc358775: remove complex vsdelay calculation
In-Reply-To: <20240506-tc358775-fix-powerup-v1-9-545dcf00b8dd@kernel.org>
References: <20240506-tc358775-fix-powerup-v1-0-545dcf00b8dd@kernel.org> <20240506-tc358775-fix-powerup-v1-9-545dcf00b8dd@kernel.org>
Message-ID: <CAHgnY3=KCD4gyJ4nL6nN1tvWcsiRQL+Oz11RNOniDdyMoEPcSg@mail.gmail.com>

Hello Michael,

On Mon, May 6, 2024 at 3:35?PM Michael Walle <mwalle at kernel.org> wrote:
>
> To cite the datasheet on VSDELAY:
>   During DSI link speed is slower than that of LVDS link?s, data needs
>   to be buffer within 775XBG before outputting to prevent data from
>   underflow. Register field VPCTRL[VSDELAY] is used to for this purpose
>
> This driver assumes that the DSI link speed is the pixel clock (as does
> every DSI bridge driver), after all the LVDS clock is derived from the
> DSI clock. Thus we know for a fact, that the DSI link is not slower than
> the LVDS side. Just use the (sane) default value of the bridge and drop
> the complicated calculation here.

I am not convinced this is a good idea to revert to a default
VSdelay value. I tested your patch series with RK3399 platform
and default value (5) was not enough there. There was small data
underflow visible, resulting in display offset. Removing this patch
and using the original calculation formula fixed the problem.
The calculated VSDELAY value seems to be a lot bigger than required,
but keeps us on the safe side.

It looks that hback-porch value for panel is used also on DSI link,
effectively delaying hactive data delivered to TC358775 bridge.
I suspect this causes the requirement for higher VSDELAY.

>
> While at it, replace the TC358775_VPCTRL_MSF() and
> TC358775_VPCTRL_OPXLFMT() inline functions by the usual macros for a bit
> flag.
>
> Signed-off-by: Michael Walle <mwalle at kernel.org>
> ---
>  drivers/gpu/drm/bridge/tc358775.c | 49 +++++++--------------------------------
>  1 file changed, 8 insertions(+), 41 deletions(-)
>
> diff --git a/drivers/gpu/drm/bridge/tc358775.c b/drivers/gpu/drm/bridge/tc358775.c
> index 54aea58a3406..a9d731e87970 100644
> --- a/drivers/gpu/drm/bridge/tc358775.c
> +++ b/drivers/gpu/drm/bridge/tc358775.c
> @@ -109,7 +109,9 @@
>  #define RDPKTLN         0x0404  /* Command Read Packet Length */
>
>  #define VPCTRL          0x0450  /* Video Path Control */
> -#define EVTMODE                BIT(5)  /* Video event mode enable, tc35876x only */
> +#define VPCTRL_MSF     BIT(0)
> +#define VPCTRL_OPXLFMT BIT(8)
> +#define VPCTRL_EVTMODE BIT(5)  /* Video event mode enable, tc35876x only */
>  #define HTIM1           0x0454  /* Horizontal Timing Control 1 */
>  #define HTIM2           0x0458  /* Horizontal Timing Control 2 */
>  #define VTIM1           0x045C  /* Vertical Timing Control 1 */
> @@ -187,30 +189,6 @@ enum {
>
>  #define L0EN BIT(1)
>
> -#define TC358775_VPCTRL_VSDELAY__MASK  0x3FF00000
> -#define TC358775_VPCTRL_VSDELAY__SHIFT 20
> -static inline u32 TC358775_VPCTRL_VSDELAY(uint32_t val)
> -{
> -       return ((val) << TC358775_VPCTRL_VSDELAY__SHIFT) &
> -                       TC358775_VPCTRL_VSDELAY__MASK;
> -}
> -
> -#define TC358775_VPCTRL_OPXLFMT__MASK  0x00000100
> -#define TC358775_VPCTRL_OPXLFMT__SHIFT 8
> -static inline u32 TC358775_VPCTRL_OPXLFMT(uint32_t val)
> -{
> -       return ((val) << TC358775_VPCTRL_OPXLFMT__SHIFT) &
> -                       TC358775_VPCTRL_OPXLFMT__MASK;
> -}
> -
> -#define TC358775_VPCTRL_MSF__MASK      0x00000001
> -#define TC358775_VPCTRL_MSF__SHIFT     0
> -static inline u32 TC358775_VPCTRL_MSF(uint32_t val)
> -{
> -       return ((val) << TC358775_VPCTRL_MSF__SHIFT) &
> -                       TC358775_VPCTRL_MSF__MASK;
> -}
> -
>  #define TC358775_LVCFG_PCLKDIV__MASK   0x000000f0
>  #define TC358775_LVCFG_PCLKDIV__SHIFT  4
>  static inline u32 TC358775_LVCFG_PCLKDIV(uint32_t val)
> @@ -350,7 +328,6 @@ static void tc_bridge_enable(struct drm_bridge *bridge)
>         u32 hback_porch, hsync_len, hfront_porch, hactive, htime1, htime2;
>         u32 vback_porch, vsync_len, vfront_porch, vactive, vtime1, vtime2;
>         unsigned int val = 0;
> -       u16 dsiclk, clkdiv, byteclk, t1, t2, t3, vsdelay;
>         struct drm_display_mode *mode;
>         struct drm_connector *connector = get_connector(bridge->encoder);
>
> @@ -398,27 +375,17 @@ static void tc_bridge_enable(struct drm_bridge *bridge)
>
>         /* Video event mode vs pulse mode bit, does not exist for tc358775 */
>         if (tc->type == TC358765)
> -               val = EVTMODE;
> +               val = VPCTRL_EVTMODE;
>         else
>                 val = 0;
>
>         if (tc->bpc == 8)
> -               val |= TC358775_VPCTRL_OPXLFMT(1);
> +               val |= VPCTRL_OPXLFMT;
>         else /* bpc = 6; */
> -               val |= TC358775_VPCTRL_MSF(1);
> -
> -       dsiclk = mode->crtc_clock * 3 * tc->bpc / tc->num_dsi_lanes / 1000;
> -       clkdiv = dsiclk / (tc->lvds_link == DUAL_LINK ? DIVIDE_BY_6 : DIVIDE_BY_3);
> -       byteclk = dsiclk / 4;
> -       t1 = hactive * (tc->bpc * 3 / 8) / tc->num_dsi_lanes;
> -       t2 = ((100000 / clkdiv)) * (hactive + hback_porch + hsync_len + hfront_porch) / 1000;
> -       t3 = ((t2 * byteclk) / 100) - (hactive * (tc->bpc * 3 / 8) /
> -               tc->num_dsi_lanes);
> -
> -       vsdelay = (clkdiv * (t1 + t3) / byteclk) - hback_porch - hsync_len - hactive;
> +               val |= VPCTRL_MSF;
>
> -       val |= TC358775_VPCTRL_VSDELAY(vsdelay);
> -       regmap_write(tc->regmap, VPCTRL, val);
> +       regmap_update_bits(tc->regmap, VPCTRL, val,
> +                          VPCTRL_OPXLFMT | VPCTRL_MSF | VPCTRL_EVTMODE);
>
>         regmap_write(tc->regmap, HTIM1, htime1);
>         regmap_write(tc->regmap, VTIM1, vtime1);
>
> --
> 2.39.2
>

Kind regards
Daniel


From mwalle at kernel.org  Fri Sep  6 07:34:23 2024
From: mwalle at kernel.org (Michael Walle)
Date: Fri, 06 Sep 2024 16:34:23 +0200
Subject: [PATCH 09/20] drm/bridge: tc358775: remove complex vsdelay
 calculation
In-Reply-To: <CAHgnY3=KCD4gyJ4nL6nN1tvWcsiRQL+Oz11RNOniDdyMoEPcSg@mail.gmail.com>
References: <20240506-tc358775-fix-powerup-v1-0-545dcf00b8dd@kernel.org>
 <20240506-tc358775-fix-powerup-v1-9-545dcf00b8dd@kernel.org>
 <CAHgnY3=KCD4gyJ4nL6nN1tvWcsiRQL+Oz11RNOniDdyMoEPcSg@mail.gmail.com>
Message-ID: <D3Z9XTBHSUEN.2GW0UCIPLR6HY@kernel.org>

Hi Daniel,

> > To cite the datasheet on VSDELAY:
> >   During DSI link speed is slower than that of LVDS link?s, data needs
> >   to be buffer within 775XBG before outputting to prevent data from
> >   underflow. Register field VPCTRL[VSDELAY] is used to for this purpose
> >
> > This driver assumes that the DSI link speed is the pixel clock (as does
> > every DSI bridge driver), after all the LVDS clock is derived from the
> > DSI clock. Thus we know for a fact, that the DSI link is not slower than
> > the LVDS side. Just use the (sane) default value of the bridge and drop
> > the complicated calculation here.
>
> I am not convinced this is a good idea to revert to a default
> VSdelay value. I tested your patch series with RK3399 platform
> and default value (5) was not enough there. There was small data
> underflow visible, resulting in display offset. Removing this patch
> and using the original calculation formula fixed the problem.
> The calculated VSDELAY value seems to be a lot bigger than required,
> but keeps us on the safe side.

Did you use just parts of this series or did you port the "lp11
notify" mechanism to the rk3399 platform? Please keep in mind, that
this bridge doesn't really work if the reset isn't deasserted during
lp-11 mode and lots of odd things happen.

Also, do you know if you have an EEPROM attached to the bridge or
does any firmware part initialize that bridge?

> It looks that hback-porch value for panel is used also on DSI link,
> effectively delaying hactive data delivered to TC358775 bridge.
> I suspect this causes the requirement for higher VSDELAY.

It was ages ago since I've worked on this bridge and extensively
tested and even measured and decoded the DSI link and the LVDS
stream. But IIRC this delay was only to compensate the difference
between the DSI clock and the LVDS clock, that is, if you push the
pixel stream slower into the bridge than the bridge is pushing it
out to the LVDS panel.

So the back porch should be irrelevant here (?!).

-michael
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 297 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-mediatek/attachments/20240906/871c802d/attachment.sig>

From miquel.raynal at bootlin.com  Fri Sep  6 08:03:20 2024
From: miquel.raynal at bootlin.com (Miquel Raynal)
Date: Fri,  6 Sep 2024 17:03:20 +0200
Subject: [PATCH -next RESEND 10/10] mtd: rawnand: sunxi: Use for_each_child_of_node_scoped()
In-Reply-To: <20240826094328.2991664-11-ruanjinjie@huawei.com>
Message-ID: <20240906150320.734507-1-miquel.raynal@bootlin.com>

On Mon, 2024-08-26 at 09:43:28 UTC, Jinjie Ruan wrote:
> Avoids the need for manual cleanup of_node_put() in early exits
> from the loop.
> 
> Signed-off-by: Jinjie Ruan <ruanjinjie at huawei.com>

Applied to https://git.kernel.org/pub/scm/linux/kernel/git/mtd/linux.git nand/next, thanks.

Miquel


From miquel.raynal at bootlin.com  Fri Sep  6 08:03:26 2024
From: miquel.raynal at bootlin.com (Miquel Raynal)
Date: Fri,  6 Sep 2024 17:03:26 +0200
Subject: [PATCH -next RESEND 09/10] mtd: rawnand: stm32_fmc2: Use for_each_child_of_node_scoped()
In-Reply-To: <20240826094328.2991664-10-ruanjinjie@huawei.com>
Message-ID: <20240906150327.734538-1-miquel.raynal@bootlin.com>

On Mon, 2024-08-26 at 09:43:27 UTC, Jinjie Ruan wrote:
> Avoids the need for manual cleanup of_node_put() in early exits
> from the loop.
> 
> Signed-off-by: Jinjie Ruan <ruanjinjie at huawei.com>

Applied to https://git.kernel.org/pub/scm/linux/kernel/git/mtd/linux.git nand/next, thanks.

Miquel


From miquel.raynal at bootlin.com  Fri Sep  6 08:03:34 2024
From: miquel.raynal at bootlin.com (Miquel Raynal)
Date: Fri,  6 Sep 2024 17:03:34 +0200
Subject: [PATCH -next RESEND 08/10] mtd: rawnand: renesas: Use for_each_child_of_node_scoped()
In-Reply-To: <20240826094328.2991664-9-ruanjinjie@huawei.com>
Message-ID: <20240906150334.734568-1-miquel.raynal@bootlin.com>

On Mon, 2024-08-26 at 09:43:26 UTC, Jinjie Ruan wrote:
> Avoids the need for manual cleanup of_node_put() in early exits
> from the loop.
> 
> Signed-off-by: Jinjie Ruan <ruanjinjie at huawei.com>
> Reviewed-by: Geert Uytterhoeven <geert+renesas at glider.be>

Applied to https://git.kernel.org/pub/scm/linux/kernel/git/mtd/linux.git nand/next, thanks.

Miquel


From miquel.raynal at bootlin.com  Fri Sep  6 08:03:40 2024
From: miquel.raynal at bootlin.com (Miquel Raynal)
Date: Fri,  6 Sep 2024 17:03:40 +0200
Subject: [PATCH -next RESEND 07/10] mtd: rawnand: mtk: Use for_each_child_of_node_scoped()
In-Reply-To: <20240826094328.2991664-8-ruanjinjie@huawei.com>
Message-ID: <20240906150341.734598-1-miquel.raynal@bootlin.com>

On Mon, 2024-08-26 at 09:43:25 UTC, Jinjie Ruan wrote:
> Avoids the need for manual cleanup of_node_put() in early exits
> from the loop.
> 
> Signed-off-by: Jinjie Ruan <ruanjinjie at huawei.com>

Applied to https://git.kernel.org/pub/scm/linux/kernel/git/mtd/linux.git nand/next, thanks.

Miquel


From miquel.raynal at bootlin.com  Fri Sep  6 08:03:46 2024
From: miquel.raynal at bootlin.com (Miquel Raynal)
Date: Fri,  6 Sep 2024 17:03:46 +0200
Subject: [PATCH -next RESEND 06/10] mtd: rawnand: meson: Use for_each_child_of_node_scoped()
In-Reply-To: <20240826094328.2991664-7-ruanjinjie@huawei.com>
Message-ID: <20240906150346.734628-1-miquel.raynal@bootlin.com>

On Mon, 2024-08-26 at 09:43:24 UTC, Jinjie Ruan wrote:
> Avoids the need for manual cleanup of_node_put() in early exits
> from the loop.
> 
> Signed-off-by: Jinjie Ruan <ruanjinjie at huawei.com>

Applied to https://git.kernel.org/pub/scm/linux/kernel/git/mtd/linux.git nand/next, thanks.

Miquel


From miquel.raynal at bootlin.com  Fri Sep  6 08:03:51 2024
From: miquel.raynal at bootlin.com (Miquel Raynal)
Date: Fri,  6 Sep 2024 17:03:51 +0200
Subject: [PATCH -next RESEND 05/10] mtd: rawnand: rockchip: Use for_each_child_of_node_scoped()
In-Reply-To: <20240826094328.2991664-6-ruanjinjie@huawei.com>
Message-ID: <20240906150351.734658-1-miquel.raynal@bootlin.com>

On Mon, 2024-08-26 at 09:43:23 UTC, Jinjie Ruan wrote:
> Avoids the need for manual cleanup of_node_put() in early exits
> from the loop.
> 
> Signed-off-by: Jinjie Ruan <ruanjinjie at huawei.com>

Applied to https://git.kernel.org/pub/scm/linux/kernel/git/mtd/linux.git nand/next, thanks.

Miquel


From miquel.raynal at bootlin.com  Fri Sep  6 08:03:57 2024
From: miquel.raynal at bootlin.com (Miquel Raynal)
Date: Fri,  6 Sep 2024 17:03:57 +0200
Subject: [PATCH -next RESEND 04/10] mtd: rawnand: marvell: drm/rockchip: Use for_each_child_of_node_scoped()
In-Reply-To: <20240826094328.2991664-5-ruanjinjie@huawei.com>
Message-ID: <20240906150357.734687-1-miquel.raynal@bootlin.com>

On Mon, 2024-08-26 at 09:43:22 UTC, Jinjie Ruan wrote:
> Avoids the need for manual cleanup of_node_put() in early exits
> from the loop.
> 
> Signed-off-by: Jinjie Ruan <ruanjinjie at huawei.com>

Applied to https://git.kernel.org/pub/scm/linux/kernel/git/mtd/linux.git nand/next, thanks.

Miquel


From miquel.raynal at bootlin.com  Fri Sep  6 08:04:03 2024
From: miquel.raynal at bootlin.com (Miquel Raynal)
Date: Fri,  6 Sep 2024 17:04:03 +0200
Subject: [PATCH -next RESEND 03/10] mtd: rawnand: pl353: Use for_each_child_of_node_scoped()
In-Reply-To: <20240826094328.2991664-4-ruanjinjie@huawei.com>
Message-ID: <20240906150403.734743-1-miquel.raynal@bootlin.com>

On Mon, 2024-08-26 at 09:43:21 UTC, Jinjie Ruan wrote:
> Avoids the need for manual cleanup of_node_put() in early exits
> from the loop by using for_each_child_of_node_scoped().
> 
> Signed-off-by: Jinjie Ruan <ruanjinjie at huawei.com>

Applied to https://git.kernel.org/pub/scm/linux/kernel/git/mtd/linux.git nand/next, thanks.

Miquel


From miquel.raynal at bootlin.com  Fri Sep  6 08:04:09 2024
From: miquel.raynal at bootlin.com (Miquel Raynal)
Date: Fri,  6 Sep 2024 17:04:09 +0200
Subject: [PATCH -next RESEND 02/10] mtd: rawnand: cadence: Use for_each_child_of_node_scoped()
In-Reply-To: <20240826094328.2991664-3-ruanjinjie@huawei.com>
Message-ID: <20240906150409.734780-1-miquel.raynal@bootlin.com>

On Mon, 2024-08-26 at 09:43:20 UTC, Jinjie Ruan wrote:
> Avoids the need for manual cleanup of_node_put() in early exits
> from the loop by using for_each_child_of_node_scoped().
> 
> Signed-off-by: Jinjie Ruan <ruanjinjie at huawei.com>

Applied to https://git.kernel.org/pub/scm/linux/kernel/git/mtd/linux.git nand/next, thanks.

Miquel


From miquel.raynal at bootlin.com  Fri Sep  6 08:04:13 2024
From: miquel.raynal at bootlin.com (Miquel Raynal)
Date: Fri,  6 Sep 2024 17:04:13 +0200
Subject: [PATCH -next RESEND 01/10] mtd: rawnand: arasan: Use for_each_child_of_node_scoped()
In-Reply-To: <20240826094328.2991664-2-ruanjinjie@huawei.com>
Message-ID: <20240906150413.734809-1-miquel.raynal@bootlin.com>

On Mon, 2024-08-26 at 09:43:19 UTC, Jinjie Ruan wrote:
> Avoids the need for manual cleanup of_node_put() in early exits
> from the loop.
> 
> Signed-off-by: Jinjie Ruan <ruanjinjie at huawei.com>

Applied to https://git.kernel.org/pub/scm/linux/kernel/git/mtd/linux.git nand/next, thanks.

Miquel


From nathan at kernel.org  Fri Sep  6 11:03:48 2024
From: nathan at kernel.org (Nathan Chancellor)
Date: Fri, 6 Sep 2024 11:03:48 -0700
Subject: (subset) [PATCH v7 00/16] Add audio support for the MediaTek
 Genio 350-evk board
In-Reply-To: <172544860860.19172.7052813450885034844.b4-ty@kernel.org>
References: <20240226-audio-i350-v7-0-6518d953a141@baylibre.com>
 <172544860860.19172.7052813450885034844.b4-ty@kernel.org>
Message-ID: <20240906180348.GA1239602@thelio-3990X>

On Wed, Sep 04, 2024 at 12:16:48PM +0100, Mark Brown wrote:
> [01/16] ASoC: dt-bindings: mediatek,mt8365-afe: Add audio afe document
>         commit: ceb3ca2876243e3ea02f78b3d488b1f2d734de49
> [02/16] ASoC: dt-bindings: mediatek,mt8365-mt6357: Add audio sound card document
>         commit: 76d80dcdd55f70b28930edb97b96ee375e1cce5a
> [03/16] dt-bindings: mfd: mediatek: Add codec property for MT6357 PMIC
>         commit: 761cab667898d86c04867948f1b7aec1090be796
> [04/16] ASoC: mediatek: mt8365: Add common header
>         commit: 38c7c9ddc74033406461d64e541bbc8268e77f73
> [05/16] ASoC: mediatek: mt8365: Add audio clock control support
>         commit: ef307b40b7f0042d54f020bccb3e728ced292282
> [06/16] ASoC: mediatek: mt8365: Add I2S DAI support
>         commit: 402bbb13a195caa83b3279ebecdabfb11ddee084
> [07/16] ASoC: mediatek: mt8365: Add ADDA DAI support
>         commit: 7c58c88e524180e8439acdfc44872325e7f6d33d
> [08/16] ASoC: mediatek: mt8365: Add DMIC DAI support
>         commit: 1c50ec75ce6c0c6b5736499393e522f73e19d0cf
> [09/16] ASoC: mediatek: mt8365: Add PCM DAI support
>         commit: 5097c0c8634d703e3c59cfb89831b7db9dc46339
> [10/16] ASoc: mediatek: mt8365: Add a specific soundcard for EVK
>         commit: 1bf6dbd75f7603dd026660bebf324f812200dc1b
> [11/16] ASoC: mediatek: mt8365: Add the AFE driver support
>         commit: e1991d102bc2abb32331c462f8f3e77059c69578

I am seeing several warnings/errors from both GCC and Clang with
ARCH=arm64 allmodconfig after this series appeared in next-20240906.
As far as I can tell, they appear to agree. I wondered how this was not
caught during the series development but perhaps it was written against
a development tree that did not have Arnd's extrawarn series from 6.10
in it yet? I was going to work on a series but I was not sure about the
best way to address the overflow errors, hence just the report.

Clang 19:

  sound/soc/mediatek/mt8365/mt8365-afe-clk.c:298:5: error: no previous prototype for function 'mt8365_afe_hd_engen_enable' [-Werror,-Wmissing-prototypes]
    298 | int mt8365_afe_hd_engen_enable(struct mtk_base_afe *afe, bool apll1)
        |     ^
  sound/soc/mediatek/mt8365/mt8365-afe-clk.c:298:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
    298 | int mt8365_afe_hd_engen_enable(struct mtk_base_afe *afe, bool apll1)
        | ^
        | static 
  sound/soc/mediatek/mt8365/mt8365-afe-clk.c:310:5: error: no previous prototype for function 'mt8365_afe_hd_engen_disable' [-Werror,-Wmissing-prototypes]
    310 | int mt8365_afe_hd_engen_disable(struct mtk_base_afe *afe, bool apll1)
        |     ^
  sound/soc/mediatek/mt8365/mt8365-afe-clk.c:310:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
    310 | int mt8365_afe_hd_engen_disable(struct mtk_base_afe *afe, bool apll1)
        | ^
        | static 
  sound/soc/mediatek/mt8365/mt8365-afe-clk.c:314:24: error: implicit conversion from 'unsigned long' to 'unsigned int' changes value from 18446744073709551614 to 4294967294 [-Werror,-Wconstant-conversion]
    313 |                 regmap_update_bits(afe->regmap, AFE_HD_ENGEN_ENABLE,
        |                 ~~~~~~~~~~~~~~~~~~
    314 |                                    AFE_22M_PLL_EN, ~AFE_22M_PLL_EN);
        |                                                    ^~~~~~~~~~~~~~~
  sound/soc/mediatek/mt8365/mt8365-afe-clk.c:317:24: error: implicit conversion from 'unsigned long' to 'unsigned int' changes value from 18446744073709551613 to 4294967293 [-Werror,-Wconstant-conversion]
    316 |                 regmap_update_bits(afe->regmap, AFE_HD_ENGEN_ENABLE,
        |                 ~~~~~~~~~~~~~~~~~~
    317 |                                    AFE_24M_PLL_EN, ~AFE_24M_PLL_EN);
        |                                                    ^~~~~~~~~~~~~~~
  4 errors generated.

  sound/soc/mediatek/mt8365/mt8365-dai-adda.c:93:8: error: implicit conversion from 'unsigned long' to 'unsigned int' changes value from 18446744073709551614 to 4294967294 [-Werror,-Wconstant-conversion]
     91 |                 regmap_update_bits(afe->regmap, AFE_ADDA_UL_DL_CON0,
        |                 ~~~~~~~~~~~~~~~~~~
     92 |                                    AFE_ADDA_UL_DL_ADDA_AFE_ON,
     93 |                                    ~AFE_ADDA_UL_DL_ADDA_AFE_ON);
        |                                    ^~~~~~~~~~~~~~~~~~~~~~~~~~~
  1 error generated.

  sound/soc/mediatek/mt8365/mt8365-mt6357.c:293:22: error: unused variable 'platform_node' [-Werror,-Wunused-variable]
    293 |         struct device_node *platform_node;
        |                             ^~~~~~~~~~~~~
  sound/soc/mediatek/mt8365/mt8365-mt6357.c:295:6: error: unused variable 'i' [-Werror,-Wunused-variable]
    295 |         int i, ret;
        |             ^
  2 errors generated.

  sound/soc/mediatek/mt8365/mt8365-dai-dmic.c:64:7: error: implicit conversion from 'unsigned long' to 'unsigned int' changes value from 18446744073709551613 to 4294967293 [-Werror,-Wconstant-conversion]
     62 |         regmap_update_bits(afe->regmap, AFE_ADDA_UL_DL_CON0,
        |         ~~~~~~~~~~~~~~~~~~
     63 |                            AFE_ADDA_UL_DL_DMIC_CLKDIV_ON,
     64 |                            ~AFE_ADDA_UL_DL_DMIC_CLKDIV_ON);
        |                            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  1 error generated.

  sound/soc/mediatek/mt8365/mt8365-dai-i2s.c:388:8: error: implicit conversion from 'unsigned long' to 'unsigned int' changes value from 18446744073709551613 to 4294967293 [-Werror,-Wconstant-conversion]
    386 |                 regmap_update_bits(afe->regmap, AFE_ASRC_2CH_CON0,
        |                 ~~~~~~~~~~~~~~~~~~
    387 |                                    COEFF_SRAM_CTRL,
    388 |                                    (unsigned long)~COEFF_SRAM_CTRL);
        |                                    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  sound/soc/mediatek/mt8365/mt8365-dai-i2s.c:396:16: error: implicit conversion from 'unsigned long' to 'unsigned int' changes value from 18446744073709549567 to 4294965247 [-Werror,-Wconstant-conversion]
    395 |                 regmap_update_bits(afe->regmap, AFE_ASRC_2CH_CON2,
        |                 ~~~~~~~~~~~~~~~~~~
    396 |                                    IIR_EN, (unsigned long)~IIR_EN);
        |                                            ^~~~~~~~~~~~~~~~~~~~~~
  sound/soc/mediatek/mt8365/mt8365-dai-i2s.c:459:16: error: implicit conversion from 'unsigned long' to 'unsigned int' changes value from 18446744073709551614 to 4294967294 [-Werror,-Wconstant-conversion]
    458 |                 regmap_update_bits(afe->regmap, AFE_ASRC_2CH_CON0,
        |                 ~~~~~~~~~~~~~~~~~~
    459 |                                    ASM_ON, (unsigned long)~ASM_ON);
        |                                            ^~~~~~~~~~~~~~~~~~~~~~
  3 errors generated.

  sound/soc/mediatek/mt8365/mt8365-afe-pcm.c:173:6: error: no previous prototype for function 'mt8365_afe_clk_group_44k' [-Werror,-Wmissing-prototypes]
    173 | bool mt8365_afe_clk_group_44k(int sample_rate)
        |      ^
  sound/soc/mediatek/mt8365/mt8365-afe-pcm.c:173:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
    173 | bool mt8365_afe_clk_group_44k(int sample_rate)
        | ^
        | static 
  sound/soc/mediatek/mt8365/mt8365-afe-pcm.c:499:5: error: no previous prototype for function 'mt8365_afe_fe_startup' [-Werror,-Wmissing-prototypes]
    499 | int mt8365_afe_fe_startup(struct snd_pcm_substream *substream,
        |     ^
  sound/soc/mediatek/mt8365/mt8365-afe-pcm.c:499:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
    499 | int mt8365_afe_fe_startup(struct snd_pcm_substream *substream,
        | ^
        | static 
  sound/soc/mediatek/mt8365/mt8365-afe-pcm.c:575:9: error: implicit conversion from 'unsigned long' to 'unsigned int' changes value from 18446744073709547519 to 4294963199 [-Werror,-Wconstant-conversion]
    573 |                         regmap_update_bits(afe->regmap, AFE_CM2_CON0,
        |                         ~~~~~~~~~~~~~~~~~~
    574 |                                            CM_AFE_CM2_TDM_SEL,
    575 |                                            ~CM_AFE_CM2_TDM_SEL);
        |                                            ^~~~~~~~~~~~~~~~~~~
  sound/soc/mediatek/mt8365/mt8365-afe-pcm.c:654:29: error: unused variable 'memif' [-Werror,-Wunused-variable]
    654 |         struct mtk_base_afe_memif *memif = &afe->memif[dai_id];
        |                                    ^~~~~
  sound/soc/mediatek/mt8365/mt8365-afe-pcm.c:717:5: error: no previous prototype for function 'mt8365_afe_fe_trigger' [-Werror,-Wmissing-prototypes]
    717 | int mt8365_afe_fe_trigger(struct snd_pcm_substream *substream, int cmd,
        |     ^
  sound/soc/mediatek/mt8365/mt8365-afe-pcm.c:717:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
    717 | int mt8365_afe_fe_trigger(struct snd_pcm_substream *substream, int cmd,
        | ^
        | static 
  sound/soc/mediatek/mt8365/mt8365-afe-pcm.c:746:23: error: implicit conversion from 'unsigned long' to 'unsigned int' changes value from 18446744073709551599 to 4294967279 [-Werror,-Wconstant-conversion]
    745 |                         regmap_update_bits(afe->regmap, AFE_CM1_CON0,
        |                         ~~~~~~~~~~~~~~~~~~
    746 |                                            CM_AFE_CM_ON, ~CM_AFE_CM_ON);
        |                                                          ^~~~~~~~~~~~~
  sound/soc/mediatek/mt8365/mt8365-afe-pcm.c:750:23: error: implicit conversion from 'unsigned long' to 'unsigned int' changes value from 18446744073709551599 to 4294967279 [-Werror,-Wconstant-conversion]
    749 |                         regmap_update_bits(afe->regmap, AFE_CM2_CON0,
        |                         ~~~~~~~~~~~~~~~~~~
    750 |                                            CM_AFE_CM_ON, ~CM_AFE_CM_ON);
        |                                                          ^~~~~~~~~~~~~
  7 errors generated.

GCC 14:

  sound/soc/mediatek/mt8365/mt8365-mt6357.c: In function 'mt8365_mt6357_dev_probe':
  sound/soc/mediatek/mt8365/mt8365-mt6357.c:295:13: error: unused variable 'i' [-Werror=unused-variable]
    295 |         int i, ret;
        |             ^
  sound/soc/mediatek/mt8365/mt8365-mt6357.c:293:29: error: unused variable 'platform_node' [-Werror=unused-variable]
    293 |         struct device_node *platform_node;
        |                             ^~~~~~~~~~~~~
  cc1: all warnings being treated as errors

  sound/soc/mediatek/mt8365/mt8365-dai-dmic.c: In function 'audio_dmic_adda_disable':
  sound/soc/mediatek/mt8365/mt8365-dai-dmic.c:64:28: error: conversion from 'long unsigned int' to 'unsigned int' changes value from '18446744073709551613' to '4294967293' [-Werror=overflow]
     64 |                            ~AFE_ADDA_UL_DL_DMIC_CLKDIV_ON);
  sound/soc/mediatek/mt8365/mt8365-dai-dmic.c: At top level:
  sound/soc/mediatek/mt8365/mt8365-dai-dmic.c:134:12: error: 'mt8365_dai_load_dmic_iir_coeff_table' defined but not used [-Werror=unused-function]
    134 | static int mt8365_dai_load_dmic_iir_coeff_table(struct mtk_base_afe *afe)
        |            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  cc1: all warnings being treated as errors

  sound/soc/mediatek/mt8365/mt8365-dai-adda.c: In function 'mt8365_dai_disable_adda_on':
  sound/soc/mediatek/mt8365/mt8365-dai-adda.c:93:36: error: conversion from 'long unsigned int' to 'unsigned int' changes value from '18446744073709551614' to '4294967294' [-Werror=overflow]
     93 |                                    ~AFE_ADDA_UL_DL_ADDA_AFE_ON);
  cc1: all warnings being treated as errors

  sound/soc/mediatek/mt8365/mt8365-afe-clk.c:298:5: error: no previous prototype for 'mt8365_afe_hd_engen_enable' [-Werror=missing-prototypes]
    298 | int mt8365_afe_hd_engen_enable(struct mtk_base_afe *afe, bool apll1)
        |     ^~~~~~~~~~~~~~~~~~~~~~~~~~
  sound/soc/mediatek/mt8365/mt8365-afe-clk.c:310:5: error: no previous prototype for 'mt8365_afe_hd_engen_disable' [-Werror=missing-prototypes]
    310 | int mt8365_afe_hd_engen_disable(struct mtk_base_afe *afe, bool apll1)
        |     ^~~~~~~~~~~~~~~~~~~~~~~~~~~
  sound/soc/mediatek/mt8365/mt8365-afe-clk.c: In function 'mt8365_afe_hd_engen_disable':
  sound/soc/mediatek/mt8365/mt8365-afe-clk.c:314:52: error: conversion from 'long unsigned int' to 'unsigned int' changes value from '18446744073709551614' to '4294967294' [-Werror=overflow]
    314 |                                    AFE_22M_PLL_EN, ~AFE_22M_PLL_EN);
  sound/soc/mediatek/mt8365/mt8365-afe-clk.c:317:52: error: conversion from 'long unsigned int' to 'unsigned int' changes value from '18446744073709551613' to '4294967293' [-Werror=overflow]
    317 |                                    AFE_24M_PLL_EN, ~AFE_24M_PLL_EN);
  cc1: all warnings being treated as errors

  sound/soc/mediatek/mt8365/mt8365-dai-i2s.c: In function 'mt8365_afe_set_2nd_i2s_asrc':
  sound/soc/mediatek/mt8365/mt8365-dai-i2s.c:388:36: error: conversion from 'long unsigned int' to 'unsigned int' changes value from '18446744073709551613' to '4294967293' [-Werror=overflow]
    388 |                                    (unsigned long)~COEFF_SRAM_CTRL);
  sound/soc/mediatek/mt8365/mt8365-dai-i2s.c:396:44: error: conversion from 'long unsigned int' to 'unsigned int' changes value from '18446744073709549567' to '4294965247' [-Werror=overflow]
    396 |                                    IIR_EN, (unsigned long)~IIR_EN);
  sound/soc/mediatek/mt8365/mt8365-dai-i2s.c: In function 'mt8365_afe_set_2nd_i2s_asrc_enable':
  sound/soc/mediatek/mt8365/mt8365-dai-i2s.c:459:44: error: conversion from 'long unsigned int' to 'unsigned int' changes value from '18446744073709551614' to '4294967294' [-Werror=overflow]
    459 |                                    ASM_ON, (unsigned long)~ASM_ON);
  cc1: all warnings being treated as errors

  sound/soc/mediatek/mt8365/mt8365-afe-pcm.c:173:6: error: no previous prototype for 'mt8365_afe_clk_group_44k' [-Werror=missing-prototypes]
    173 | bool mt8365_afe_clk_group_44k(int sample_rate)
        |      ^~~~~~~~~~~~~~~~~~~~~~~~
  sound/soc/mediatek/mt8365/mt8365-afe-pcm.c:499:5: error: no previous prototype for 'mt8365_afe_fe_startup' [-Werror=missing-prototypes]
    499 | int mt8365_afe_fe_startup(struct snd_pcm_substream *substream,
        |     ^~~~~~~~~~~~~~~~~~~~~
  sound/soc/mediatek/mt8365/mt8365-afe-pcm.c: In function 'mt8365_afe_fe_hw_params':
  sound/soc/mediatek/mt8365/mt8365-afe-pcm.c:575:44: error: conversion from 'long unsigned int' to 'unsigned int' changes value from '18446744073709547519' to '4294963199' [-Werror=overflow]
    575 |                                            ~CM_AFE_CM2_TDM_SEL);
  sound/soc/mediatek/mt8365/mt8365-afe-pcm.c: In function 'mt8365_afe_fe_hw_free':
  sound/soc/mediatek/mt8365/mt8365-afe-pcm.c:654:36: error: unused variable 'memif' [-Werror=unused-variable]
    654 |         struct mtk_base_afe_memif *memif = &afe->memif[dai_id];
        |                                    ^~~~~
  sound/soc/mediatek/mt8365/mt8365-afe-pcm.c: At top level:
  sound/soc/mediatek/mt8365/mt8365-afe-pcm.c:717:5: error: no previous prototype for 'mt8365_afe_fe_trigger' [-Werror=missing-prototypes]
    717 | int mt8365_afe_fe_trigger(struct snd_pcm_substream *substream, int cmd,
        |     ^~~~~~~~~~~~~~~~~~~~~
  sound/soc/mediatek/mt8365/mt8365-afe-pcm.c: In function 'mt8365_afe_fe_trigger':
  sound/soc/mediatek/mt8365/mt8365-afe-pcm.c:746:58: error: conversion from 'long unsigned int' to 'unsigned int' changes value from '18446744073709551599' to '4294967279' [-Werror=overflow]
    746 |                                            CM_AFE_CM_ON, ~CM_AFE_CM_ON);
  sound/soc/mediatek/mt8365/mt8365-afe-pcm.c:750:58: error: conversion from 'long unsigned int' to 'unsigned int' changes value from '18446744073709551599' to '4294967279' [-Werror=overflow]
    750 |                                            CM_AFE_CM_ON, ~CM_AFE_CM_ON);
  cc1: all warnings being treated as errors

Cheers,
Nathan


From broonie at kernel.org  Fri Sep  6 11:27:01 2024
From: broonie at kernel.org (Mark Brown)
Date: Fri, 6 Sep 2024 19:27:01 +0100
Subject: (subset) [PATCH v7 00/16] Add audio support for the MediaTek
 Genio 350-evk board
In-Reply-To: <20240906180348.GA1239602@thelio-3990X>
References: <20240226-audio-i350-v7-0-6518d953a141@baylibre.com>
 <172544860860.19172.7052813450885034844.b4-ty@kernel.org>
 <20240906180348.GA1239602@thelio-3990X>
Message-ID: <ZttJdexQFOq2Q9iQ@finisterre.sirena.org.uk>

On Fri, Sep 06, 2024 at 11:03:48AM -0700, Nathan Chancellor wrote:

> I am seeing several warnings/errors from both GCC and Clang with
> ARCH=arm64 allmodconfig after this series appeared in next-20240906.
> As far as I can tell, they appear to agree. I wondered how this was not
> caught during the series development but perhaps it was written against
> a development tree that did not have Arnd's extrawarn series from 6.10
> in it yet? I was going to work on a series but I was not sure about the
> best way to address the overflow errors, hence just the report.

Are these just warnings introduced by recent versions of the toolchains?
These commits passed an x86 allmodconfig with GCC 12 at each step (I did
catch one warning there with another patch in the series that didn't get
applied) and 0day didn't say anything at any point.

> Clang 19:

That's relatively modern, though some of the warnings don't look
particularly new and exciting.

>   sound/soc/mediatek/mt8365/mt8365-dai-adda.c:93:8: error: implicit conversion from 'unsigned long' to 'unsigned int' changes value from 18446744073709551614 to 4294967294 [-Werror,-Wconstant-conversion]
>      91 |                 regmap_update_bits(afe->regmap, AFE_ADDA_UL_DL_CON0,
>         |                 ~~~~~~~~~~~~~~~~~~
>      92 |                                    AFE_ADDA_UL_DL_ADDA_AFE_ON,
>      93 |                                    ~AFE_ADDA_UL_DL_ADDA_AFE_ON);
>         |                                    ^~~~~~~~~~~~~~~~~~~~~~~~~~~
>   1 error generated.

That's a bit surprising, regmap_update_bits() takes an unsigned long?  I
suspect the constants need to be defined as unsigned.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-mediatek/attachments/20240906/93f4ecbd/attachment.sig>

From broonie at kernel.org  Fri Sep  6 11:34:46 2024
From: broonie at kernel.org (Mark Brown)
Date: Fri, 6 Sep 2024 19:34:46 +0100
Subject: (subset) [PATCH v7 00/16] Add audio support for the MediaTek
 Genio 350-evk board
In-Reply-To: <ZttJdexQFOq2Q9iQ@finisterre.sirena.org.uk>
References: <20240226-audio-i350-v7-0-6518d953a141@baylibre.com>
 <172544860860.19172.7052813450885034844.b4-ty@kernel.org>
 <20240906180348.GA1239602@thelio-3990X>
 <ZttJdexQFOq2Q9iQ@finisterre.sirena.org.uk>
Message-ID: <ZttLRhOn9uIuk0Kl@finisterre.sirena.org.uk>

On Fri, Sep 06, 2024 at 07:27:04PM +0100, Mark Brown wrote:

> These commits passed an x86 allmodconfig with GCC 12 at each step (I did
> catch one warning there with another patch in the series that didn't get
> applied) and 0day didn't say anything at any point.

Oh, actually right as I was writing that message 0day decided to report
that (and some other things that look rather preexisting), though only
with clang 20.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-mediatek/attachments/20240906/f9e17d9f/attachment.sig>

From nathan at kernel.org  Fri Sep  6 12:23:23 2024
From: nathan at kernel.org (Nathan Chancellor)
Date: Fri, 6 Sep 2024 12:23:23 -0700
Subject: (subset) [PATCH v7 00/16] Add audio support for the MediaTek
 Genio 350-evk board
In-Reply-To: <ZttJdexQFOq2Q9iQ@finisterre.sirena.org.uk>
References: <20240226-audio-i350-v7-0-6518d953a141@baylibre.com>
 <172544860860.19172.7052813450885034844.b4-ty@kernel.org>
 <20240906180348.GA1239602@thelio-3990X>
 <ZttJdexQFOq2Q9iQ@finisterre.sirena.org.uk>
Message-ID: <20240906192323.GA3160860@thelio-3990X>

On Fri, Sep 06, 2024 at 07:27:01PM +0100, Mark Brown wrote:
> Are these just warnings introduced by recent versions of the toolchains?
> These commits passed an x86 allmodconfig with GCC 12 at each step (I did
> catch one warning there with another patch in the series that didn't get
> applied) and 0day didn't say anything at any point.

Not sure, I did not look too hard. At cursory glance, I am not sure x86
allmodconfig would catch these, as this code depends on ARCH_MEDIATEK
(not COMPILE_TEST), which only exists for arm and arm64.

> > Clang 19:
> 
> That's relatively modern, though some of the warnings don't look
> particularly new and exciting.

Fair although I still see some of them on old versions too:

https://github.com/ClangBuiltLinux/continuous-integration2/actions/runs/10738441894

> >   sound/soc/mediatek/mt8365/mt8365-dai-adda.c:93:8: error: implicit conversion from 'unsigned long' to 'unsigned int' changes value from 18446744073709551614 to 4294967294 [-Werror,-Wconstant-conversion]
> >      91 |                 regmap_update_bits(afe->regmap, AFE_ADDA_UL_DL_CON0,
> >         |                 ~~~~~~~~~~~~~~~~~~
> >      92 |                                    AFE_ADDA_UL_DL_ADDA_AFE_ON,
> >      93 |                                    ~AFE_ADDA_UL_DL_ADDA_AFE_ON);
> >         |                                    ^~~~~~~~~~~~~~~~~~~~~~~~~~~
> >   1 error generated.
> 
> That's a bit surprising, regmap_update_bits() takes an unsigned long?  I
> suspect the constants need to be defined as unsigned.

Does it? I see it taking 'unsigned int' for all of its parameters.

$ sed -n '1242,1250p' include/linux/regmap.h
int regmap_update_bits_base(struct regmap *map, unsigned int reg,
                            unsigned int mask, unsigned int val,
                            bool *change, bool async, bool force);

static inline int regmap_update_bits(struct regmap *map, unsigned int reg,
                                     unsigned int mask, unsigned int val)
{
        return regmap_update_bits_base(map, reg, mask, val, NULL, false, false);
}

Cheers,
Nathan


From robh at kernel.org  Fri Sep  6 12:37:41 2024
From: robh at kernel.org (Rob Herring (Arm))
Date: Fri, 06 Sep 2024 14:37:41 -0500
Subject: [PATCH v4 0/2] arm64: dts: mediatek: Add MT8186 Ponyta
In-Reply-To: <20240906085739.1322676-1-cengjianeng@huaqin.corp-partner.google.com>
References: <20240906085739.1322676-1-cengjianeng@huaqin.corp-partner.google.com>
Message-ID: <172565139880.2035162.15354421619669422961.robh@kernel.org>


On Fri, 06 Sep 2024 16:57:37 +0800, Jianeng Ceng wrote:
> This is v4 of the MT8186 Chromebook device tree series.
> ---
> Changes in v4:
> - PATCH 1/2: Add more info for Ponyta custom label in commit.
> - Link to v3:https://lore.kernel.org/all/20240904081501.2060933-1-cengjianeng at huaqin.corp-partner.google.com/
> 
> Changes in v3:
> - PATCH 0/2: Add the modify records.
> - PATCH 1/2: Modify lable to label.
> - Link to v2:https://lore.kernel.org/all/20240903061603.3007289-1-cengjianeng at huaqin.corp-partner.google.com/
> 
> Changes in v2:
> - PATCH 2/2: Modify the dtb name without rev2.
> - Link to v1:https://lore.kernel.org/all/20240902125502.1844374-1-cengjianeng at huaqin.corp-partner.google.com/
> 
> Jianeng Ceng (2):
>   dt-bindings: arm: mediatek: Add MT8186 Ponyta Chromebook
>   arm64: dts: mediatek: Add MT8186 Ponyta Chromebooks
> 
>  .../devicetree/bindings/arm/mediatek.yaml     | 11 +++++
>  arch/arm64/boot/dts/mediatek/Makefile         |  2 +
>  .../mediatek/mt8186-corsola-ponyta-sku0.dts   | 24 ++++++++++
>  .../mediatek/mt8186-corsola-ponyta-sku1.dts   | 27 ++++++++++++
>  .../dts/mediatek/mt8186-corsola-ponyta.dtsi   | 44 +++++++++++++++++++
>  5 files changed, 108 insertions(+)
>  create mode 100644 arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku0.dts
>  create mode 100644 arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku1.dts
>  create mode 100644 arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta.dtsi
> 
> --
> 2.34.1
> 
> 
> 


My bot found new DTB warnings on the .dts files added or changed in this
series.

Some warnings may be from an existing SoC .dtsi. Or perhaps the warnings
are fixed by another series. Ultimately, it is up to the platform
maintainer whether these warnings are acceptable or not. No need to reply
unless the platform maintainer has comments.

If you already ran DT checks and didn't see these error(s), then
make sure dt-schema is up to date:

  pip3 install dtschema --upgrade


New warnings running 'make CHECK_DTBS=y mediatek/mt8186-corsola-ponyta-sku0.dtb mediatek/mt8186-corsola-ponyta-sku1.dtb' for 20240906085739.1322676-1-cengjianeng at huaqin.corp-partner.google.com:

arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku1.dtb: /soc/pwrap at 1000d000/pmic: failed to match any schema with compatible: ['mediatek,mt6366', 'mediatek,mt6358']
arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku1.dtb: /soc/pwrap at 1000d000/pmic: failed to match any schema with compatible: ['mediatek,mt6366', 'mediatek,mt6358']
arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku1.dtb: /soc/pwrap at 1000d000/pmic/codec: failed to match any schema with compatible: ['mediatek,mt6366-sound', 'mediatek,mt6358-sound']
arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku1.dtb: /soc/pwrap at 1000d000/pmic/codec: failed to match any schema with compatible: ['mediatek,mt6366-sound', 'mediatek,mt6358-sound']
arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku0.dtb: /soc/pwrap at 1000d000/pmic: failed to match any schema with compatible: ['mediatek,mt6366', 'mediatek,mt6358']
arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku0.dtb: /soc/pwrap at 1000d000/pmic: failed to match any schema with compatible: ['mediatek,mt6366', 'mediatek,mt6358']
arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku0.dtb: /soc/pwrap at 1000d000/pmic/codec: failed to match any schema with compatible: ['mediatek,mt6366-sound', 'mediatek,mt6358-sound']
arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku0.dtb: /soc/pwrap at 1000d000/pmic/codec: failed to match any schema with compatible: ['mediatek,mt6366-sound', 'mediatek,mt6358-sound']
arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku1.dtb: /soc/pwrap at 1000d000/pmic/rtc: failed to match any schema with compatible: ['mediatek,mt6366-rtc', 'mediatek,mt6358-rtc']
arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku1.dtb: /soc/pwrap at 1000d000/pmic/rtc: failed to match any schema with compatible: ['mediatek,mt6366-rtc', 'mediatek,mt6358-rtc']
arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku0.dtb: /soc/pwrap at 1000d000/pmic/rtc: failed to match any schema with compatible: ['mediatek,mt6366-rtc', 'mediatek,mt6358-rtc']
arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku0.dtb: /soc/pwrap at 1000d000/pmic/rtc: failed to match any schema with compatible: ['mediatek,mt6366-rtc', 'mediatek,mt6358-rtc']
arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku1.dtb: dp-bridge at 5c: 'extcon' is a required property
	from schema $id: http://devicetree.org/schemas/display/bridge/ite,it6505.yaml
arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku0.dtb: touchpad at 2c: 'vcc-supply' does not match any of the regexes: 'pinctrl-[0-9]+'
	from schema $id: http://devicetree.org/schemas/input/hid-over-i2c.yaml
arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku0.dtb: dp-bridge at 5c: 'extcon' is a required property
	from schema $id: http://devicetree.org/schemas/display/bridge/ite,it6505.yaml
arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku1.dtb: sound: 'model' is a required property
	from schema $id: http://devicetree.org/schemas/sound/mt8186-mt6366-rt1019-rt5682s.yaml
arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku0.dtb: sound: 'model' is a required property
	from schema $id: http://devicetree.org/schemas/sound/mt8186-mt6366-rt1019-rt5682s.yaml







From quic_nguyenb at quicinc.com  Fri Sep  6 13:39:18 2024
From: quic_nguyenb at quicinc.com (Bao D. Nguyen)
Date: Fri, 6 Sep 2024 13:39:18 -0700
Subject: [PATCH v2 1/2] ufs: core: fix the issue of ICU failure
In-Reply-To: <20240902021805.1125-2-peter.wang@mediatek.com>
References: <20240902021805.1125-1-peter.wang@mediatek.com>
 <20240902021805.1125-2-peter.wang@mediatek.com>
Message-ID: <4d28f099-137f-b9b8-463f-40ec2a745694@quicinc.com>

On 9/1/2024 7:18 PM, peter.wang at mediatek.com wrote:

>   	/* SQRTCy.ICU = 1 */
> -	writel(SQ_ICU, opr_sqd_base + REG_SQRTC);
> +	writel(readl(opr_sqd_base + REG_SQRTC) | SQ_ICU,
> +		opr_sqd_base + REG_SQRTC);
Hi Peter,
Instead of readl() here, how about write (SQ_STOP | SQ_ICU) to SQRTC?

Thanks, Bao


From broonie at kernel.org  Fri Sep  6 14:04:48 2024
From: broonie at kernel.org (Mark Brown)
Date: Fri, 6 Sep 2024 22:04:48 +0100
Subject: (subset) [PATCH v7 00/16] Add audio support for the MediaTek
 Genio 350-evk board
In-Reply-To: <20240906192323.GA3160860@thelio-3990X>
References: <20240226-audio-i350-v7-0-6518d953a141@baylibre.com>
 <172544860860.19172.7052813450885034844.b4-ty@kernel.org>
 <20240906180348.GA1239602@thelio-3990X>
 <ZttJdexQFOq2Q9iQ@finisterre.sirena.org.uk>
 <20240906192323.GA3160860@thelio-3990X>
Message-ID: <ZttucCV86ryyqIiT@finisterre.sirena.org.uk>

On Fri, Sep 06, 2024 at 12:23:23PM -0700, Nathan Chancellor wrote:
> On Fri, Sep 06, 2024 at 07:27:01PM +0100, Mark Brown wrote:
> > Are these just warnings introduced by recent versions of the toolchains?
> > These commits passed an x86 allmodconfig with GCC 12 at each step (I did
> > catch one warning there with another patch in the series that didn't get
> > applied) and 0day didn't say anything at any point.

> Not sure, I did not look too hard. At cursory glance, I am not sure x86
> allmodconfig would catch these, as this code depends on ARCH_MEDIATEK
> (not COMPILE_TEST), which only exists for arm and arm64.

Ah, I hadn't seen that (the other bits were building on x86).

> > > Clang 19:

> > That's relatively modern, though some of the warnings don't look
> > particularly new and exciting.

> Fair although I still see some of them on old versions too:

Yeah, like I say some of the warnings didn't look like they were new.

> https://github.com/ClangBuiltLinux/continuous-integration2/actions/runs/10738441894
> 
> > >   sound/soc/mediatek/mt8365/mt8365-dai-adda.c:93:8: error: implicit conversion from 'unsigned long' to 'unsigned int' changes value from 18446744073709551614 to 4294967294 [-Werror,-Wconstant-conversion]
> > >      91 |                 regmap_update_bits(afe->regmap, AFE_ADDA_UL_DL_CON0,
> > >         |                 ~~~~~~~~~~~~~~~~~~
> > >      92 |                                    AFE_ADDA_UL_DL_ADDA_AFE_ON,
> > >      93 |                                    ~AFE_ADDA_UL_DL_ADDA_AFE_ON);
> > >         |                                    ^~~~~~~~~~~~~~~~~~~~~~~~~~~
> > >   1 error generated.
> > 
> > That's a bit surprising, regmap_update_bits() takes an unsigned long?  I
> > suspect the constants need to be defined as unsigned.

> Does it? I see it taking 'unsigned int' for all of its parameters.

Sorry, I misread the warning there (or was perhaps looking at another
one) and for some reason though it was about dropping signs but it's
rather due to BIT() being defined for longs which is a rather bad
landmine given how common a pattern negation is.  I do see that
synclink.h has some convenient BITn macros for some reason which would
do the trick but really I think it's just a case of open coding the
BIT() usage, or defining a BITI() or something but that seems ugly.
Probably just open code the definitions.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-mediatek/attachments/20240906/252c4c1d/attachment-0001.sig>

From hsinyi at chromium.org  Fri Sep  6 14:26:25 2024
From: hsinyi at chromium.org (Hsin-Yi Wang)
Date: Fri, 6 Sep 2024 14:26:25 -0700
Subject: [PATCH v4 1/2] dt-bindings: arm: mediatek: Add MT8186 Ponyta Chromebook
In-Reply-To: <20240906085739.1322676-2-cengjianeng@huaqin.corp-partner.google.com>
References: <20240906085739.1322676-1-cengjianeng@huaqin.corp-partner.google.com>
 <20240906085739.1322676-2-cengjianeng@huaqin.corp-partner.google.com>
Message-ID: <CAJMQK-imYrDTuycVzQxkfbkZuHehE8uwc+qS2w=UDShETsBvEw@mail.gmail.com>

On Fri, Sep 6, 2024 at 1:57?AM Jianeng Ceng
<cengjianeng at huaqin.corp-partner.google.com> wrote:
>
> Ponyta is a custom label Chromebook based on MT8186. It is a
> self-developed project of Huaqin and has no fixed OEM.
>
> Signed-off-by: Jianeng Ceng <cengjianeng at huaqin.corp-partner.google.com>
> ---
> Changes in v4:
> - PATCH 1/2: Add more info for Ponyta custom label in commit.
> - Link to v3:https://lore.kernel.org/all/20240904081501.2060933-1-cengjianeng at huaqin.corp-partner.google.com/
>
> Changes in v3:
> - PATCH 1/2: Modify lable to label.
> - Link to v2:https://lore.kernel.org/all/20240903061603.3007289-1-cengjianeng at huaqin.corp-partner.google.com/
>
> Chage since V2:
> - No change.
>
> ---
>  Documentation/devicetree/bindings/arm/mediatek.yaml | 11 +++++++++++
>  1 file changed, 11 insertions(+)
>
> diff --git a/Documentation/devicetree/bindings/arm/mediatek.yaml b/Documentation/devicetree/bindings/arm/mediatek.yaml
> index 1d4bb50fcd8d..4bc1777b9ea6 100644
> --- a/Documentation/devicetree/bindings/arm/mediatek.yaml
> +++ b/Documentation/devicetree/bindings/arm/mediatek.yaml
> @@ -257,6 +257,17 @@ properties:
>            - const: google,steelix-sku393218
>            - const: google,steelix
>            - const: mediatek,mt8186
> +      - description: Google Ponyta (Custom label)
> +        items:
> +          - const: google,ponyta-sku0
> +          - const: google,ponyta-sku2147483647

sku2147483647 is not available anywhere besides the factory, so you
can drop this. Same for the v4 2/2 dts patch.

> +          - const: google,ponyta
> +          - const: mediatek,mt8186
> +      - description: Google Ponyta (Custom label)
> +        items:
> +          - const: google,ponyta-sku1
> +          - const: google,ponyta
> +          - const: mediatek,mt8186
>        - description: Google Rusty (Lenovo 100e Chromebook Gen 4)
>          items:
>            - const: google,steelix-sku196609


From mcgrof at kernel.org  Fri Sep  6 16:26:05 2024
From: mcgrof at kernel.org (Luis Chamberlain)
Date: Fri, 6 Sep 2024 16:26:05 -0700
Subject: [PATCH v3 1/1] module: abort module loading when sysfs setup
 suffer errors
In-Reply-To: <20240906115748.5367-2-chunhui.li@mediatek.com>
References: <20240906115748.5367-1-chunhui.li@mediatek.com>
 <20240906115748.5367-2-chunhui.li@mediatek.com>
Message-ID: <ZtuPjYaA54RmY279@bombadil.infradead.org>

On Fri, Sep 06, 2024 at 07:57:48PM +0800, Chunhui Li wrote:
> When insmod a kernel module, if fails in add_notes_attrs or
> add_sysfs_attrs such as memory allocation fail, mod_sysfs_setup
> will still return success, but we can't access user interface
> on android device.
> 
> Patch for make mod_sysfs_setup can check the error of
> add_notes_attrs and add_sysfs_attrs
> 
> Acked-by: Luis Chamberlain <mcgrof at kernel.org>
> Reviewed-by: Petr Pavlu <petr.pavlu at suse.com>
> Reported-by: kernel test robot <lkp at intel.com>
> Closes: https://lore.kernel.org/oe-kbuild-all/202409010016.3XIFSmRA-lkp at intel.com/
> Signed-off-by: Xion Wang <xion.wang at mediatek.com>
> Signed-off-by: Chunhui Li <chunhui.li at mediatek.com>

Please add a Fixes: tag.

  Luis


From broonie at kernel.org  Fri Sep  6 17:53:25 2024
From: broonie at kernel.org (Mark Brown)
Date: Sat, 07 Sep 2024 01:53:25 +0100
Subject: [PATCH 0/7] ASoC: mt8365: Fix -Werror builds
Message-ID: <20240907-asoc-fix-mt8365-build-v1-0-7ad0bac20161@kernel.org>

Nathan reported that the newly added mt8365 drivers were causing a
number of warnings which break -Werror builds, these were only visible
on arm64 since the drivers did not have COMPILE_TEST enabled.  Fix this
and some other minor stuff I noticed while doing so.

Signed-off-by: Mark Brown <broonie at kernel.org>
---
Mark Brown (7):
      ASoC: mt8365: Open code BIT() to avoid spurious warnings
      ASoC: mt8365: Remove spurious unsigned long casts
      ASoC: mt8365: Remove unused prototype for mt8365_afe_clk_group_48k()
      ASoC: mt8365: Make non-exported functions static
      ASoC: mt8365: Remove unused variables
      ASoC: mt8365: Remove unused DMIC IIR coefficient configuration
      ASoC: mt8365: Allow build coverage

 sound/soc/mediatek/Kconfig                    |   2 +-
 sound/soc/mediatek/mt8365/mt8365-afe-clk.c    |   4 +-
 sound/soc/mediatek/mt8365/mt8365-afe-common.h |   1 -
 sound/soc/mediatek/mt8365/mt8365-afe-pcm.c    |  13 +-
 sound/soc/mediatek/mt8365/mt8365-dai-dmic.c   |  30 ----
 sound/soc/mediatek/mt8365/mt8365-dai-i2s.c    |   6 +-
 sound/soc/mediatek/mt8365/mt8365-mt6357.c     |   3 +-
 sound/soc/mediatek/mt8365/mt8365-reg.h        | 214 +++++++++++++-------------
 8 files changed, 120 insertions(+), 153 deletions(-)
---
base-commit: 813751eaec93bfeb6236aaed99607a44c01b3110
change-id: 20240906-asoc-fix-mt8365-build-974117b12f0a

Best regards,
-- 
Mark Brown <broonie at kernel.org>



From broonie at kernel.org  Fri Sep  6 17:53:26 2024
From: broonie at kernel.org (Mark Brown)
Date: Sat, 07 Sep 2024 01:53:26 +0100
Subject: [PATCH 1/7] ASoC: mt8365: Open code BIT() to avoid spurious
 warnings
In-Reply-To: <20240907-asoc-fix-mt8365-build-v1-0-7ad0bac20161@kernel.org>
References: <20240907-asoc-fix-mt8365-build-v1-0-7ad0bac20161@kernel.org>
Message-ID: <20240907-asoc-fix-mt8365-build-v1-1-7ad0bac20161@kernel.org>

The mt8365 driver uses bits.h to define bitfields but BIT() uses unsigned
long constants so does not play well with being bitwise negated and
converted to an unsigned int, the compiler complains about width reduction
on a number of architectures. Just open code the shifting to avoid the
issue.

Generated with s/BIT(/(1U << /

Reported-by: Nathan Chancellor <nathan at kernel.org>
Signed-off-by: Mark Brown <broonie at kernel.org>
---
 sound/soc/mediatek/mt8365/mt8365-reg.h | 214 ++++++++++++++++-----------------
 1 file changed, 107 insertions(+), 107 deletions(-)

diff --git a/sound/soc/mediatek/mt8365/mt8365-reg.h b/sound/soc/mediatek/mt8365/mt8365-reg.h
index b7334c2e64ed..b763cddc93db 100644
--- a/sound/soc/mediatek/mt8365/mt8365-reg.h
+++ b/sound/soc/mediatek/mt8365/mt8365-reg.h
@@ -734,57 +734,57 @@
 #define AFE_IRQ_STATUS_BITS		0x3ff
 
 /* AUDIO_TOP_CON0 (0x0000) */
-#define AUD_TCON0_PDN_TML		BIT(27)
-#define AUD_TCON0_PDN_DAC_PREDIS	BIT(26)
-#define AUD_TCON0_PDN_DAC		BIT(25)
-#define AUD_TCON0_PDN_ADC		BIT(24)
-#define AUD_TCON0_PDN_TDM_IN		BIT(23)
-#define AUD_TCON0_PDN_TDM_OUT		BIT(22)
-#define AUD_TCON0_PDN_SPDIF		BIT(21)
-#define AUD_TCON0_PDN_APLL_TUNER	BIT(19)
-#define AUD_TCON0_PDN_APLL2_TUNER	BIT(18)
-#define AUD_TCON0_PDN_INTDIR		BIT(15)
-#define AUD_TCON0_PDN_24M		BIT(9)
-#define AUD_TCON0_PDN_22M		BIT(8)
-#define AUD_TCON0_PDN_I2S_IN		BIT(6)
-#define AUD_TCON0_PDN_AFE		BIT(2)
+#define AUD_TCON0_PDN_TML		(1U << 27)
+#define AUD_TCON0_PDN_DAC_PREDIS	(1U << 26)
+#define AUD_TCON0_PDN_DAC		(1U << 25)
+#define AUD_TCON0_PDN_ADC		(1U << 24)
+#define AUD_TCON0_PDN_TDM_IN		(1U << 23)
+#define AUD_TCON0_PDN_TDM_OUT		(1U << 22)
+#define AUD_TCON0_PDN_SPDIF		(1U << 21)
+#define AUD_TCON0_PDN_APLL_TUNER	(1U << 19)
+#define AUD_TCON0_PDN_APLL2_TUNER	(1U << 18)
+#define AUD_TCON0_PDN_INTDIR		(1U << 15)
+#define AUD_TCON0_PDN_24M		(1U << 9)
+#define AUD_TCON0_PDN_22M		(1U << 8)
+#define AUD_TCON0_PDN_I2S_IN		(1U << 6)
+#define AUD_TCON0_PDN_AFE		(1U << 2)
 
 /* AUDIO_TOP_CON1 (0x0004) */
-#define AUD_TCON1_PDN_TDM_ASRC		BIT(15)
-#define AUD_TCON1_PDN_GENERAL2_ASRC	BIT(14)
-#define AUD_TCON1_PDN_GENERAL1_ASRC	BIT(13)
-#define AUD_TCON1_PDN_CONNSYS_I2S_ASRC	BIT(12)
-#define AUD_TCON1_PDN_DMIC3_ADC		BIT(11)
-#define AUD_TCON1_PDN_DMIC2_ADC		BIT(10)
-#define AUD_TCON1_PDN_DMIC1_ADC		BIT(9)
-#define AUD_TCON1_PDN_DMIC0_ADC		BIT(8)
-#define AUD_TCON1_PDN_I2S4_BCLK		BIT(7)
-#define AUD_TCON1_PDN_I2S3_BCLK		BIT(6)
-#define AUD_TCON1_PDN_I2S2_BCLK		BIT(5)
-#define AUD_TCON1_PDN_I2S1_BCLK		BIT(4)
+#define AUD_TCON1_PDN_TDM_ASRC		(1U << 15)
+#define AUD_TCON1_PDN_GENERAL2_ASRC	(1U << 14)
+#define AUD_TCON1_PDN_GENERAL1_ASRC	(1U << 13)
+#define AUD_TCON1_PDN_CONNSYS_I2S_ASRC	(1U << 12)
+#define AUD_TCON1_PDN_DMIC3_ADC		(1U << 11)
+#define AUD_TCON1_PDN_DMIC2_ADC		(1U << 10)
+#define AUD_TCON1_PDN_DMIC1_ADC		(1U << 9)
+#define AUD_TCON1_PDN_DMIC0_ADC		(1U << 8)
+#define AUD_TCON1_PDN_I2S4_BCLK		(1U << 7)
+#define AUD_TCON1_PDN_I2S3_BCLK		(1U << 6)
+#define AUD_TCON1_PDN_I2S2_BCLK		(1U << 5)
+#define AUD_TCON1_PDN_I2S1_BCLK		(1U << 4)
 
 /* AUDIO_TOP_CON3 (0x000C) */
-#define AUD_TCON3_HDMI_BCK_INV		BIT(3)
+#define AUD_TCON3_HDMI_BCK_INV		(1U << 3)
 
 /* AFE_I2S_CON (0x0018) */
-#define AFE_I2S_CON_PHASE_SHIFT_FIX	BIT(31)
-#define AFE_I2S_CON_FROM_IO_MUX		BIT(28)
-#define AFE_I2S_CON_LOW_JITTER_CLK	BIT(12)
+#define AFE_I2S_CON_PHASE_SHIFT_FIX	(1U << 31)
+#define AFE_I2S_CON_FROM_IO_MUX		(1U << 28)
+#define AFE_I2S_CON_LOW_JITTER_CLK	(1U << 12)
 #define AFE_I2S_CON_RATE_MASK		GENMASK(11, 8)
-#define AFE_I2S_CON_FORMAT_I2S		BIT(3)
-#define AFE_I2S_CON_SRC_SLAVE		BIT(2)
+#define AFE_I2S_CON_FORMAT_I2S		(1U << 3)
+#define AFE_I2S_CON_SRC_SLAVE		(1U << 2)
 
 /* AFE_ASRC_2CH_CON0 */
-#define ONE_HEART	BIT(31)
-#define CHSET_STR_CLR	BIT(4)
-#define COEFF_SRAM_CTRL	BIT(1)
-#define ASM_ON		BIT(0)
+#define ONE_HEART	(1U << 31)
+#define CHSET_STR_CLR	(1U << 4)
+#define COEFF_SRAM_CTRL	(1U << 1)
+#define ASM_ON		(1U << 0)
 
 /* CON2 */
-#define O16BIT		BIT(19)
-#define CLR_IIR_HISTORY	BIT(17)
-#define IS_MONO		BIT(16)
-#define IIR_EN		BIT(11)
+#define O16BIT		(1U << 19)
+#define CLR_IIR_HISTORY	(1U << 17)
+#define IS_MONO		(1U << 16)
+#define IIR_EN		(1U << 11)
 #define IIR_STAGE_MASK	GENMASK(10, 8)
 
 /* CON5 */
@@ -793,80 +793,80 @@
 #define CALI_96_CYCLE	FIELD_PREP(CALI_CYCLE_MASK, 0x5F)
 #define CALI_441_CYCLE	FIELD_PREP(CALI_CYCLE_MASK, 0x1B8)
 
-#define CALI_AUTORST	BIT(15)
-#define AUTO_TUNE_FREQ5	BIT(12)
-#define COMP_FREQ_RES	BIT(11)
+#define CALI_AUTORST	(1U << 15)
+#define AUTO_TUNE_FREQ5	(1U << 12)
+#define COMP_FREQ_RES	(1U << 11)
 
 #define CALI_SEL_MASK	GENMASK(9, 8)
 #define CALI_SEL_00	FIELD_PREP(CALI_SEL_MASK, 0)
 #define CALI_SEL_01	FIELD_PREP(CALI_SEL_MASK, 1)
 
-#define CALI_BP_DGL		BIT(7) /* Bypass the deglitch circuit */
-#define AUTO_TUNE_FREQ4		BIT(3)
-#define CALI_AUTO_RESTART	BIT(2)
-#define CALI_USE_FREQ_OUT	BIT(1)
-#define CALI_ON			BIT(0)
+#define CALI_BP_DGL		(1U << 7) /* Bypass the deglitch circuit */
+#define AUTO_TUNE_FREQ4		(1U << 3)
+#define CALI_AUTO_RESTART	(1U << 2)
+#define CALI_USE_FREQ_OUT	(1U << 1)
+#define CALI_ON			(1U << 0)
 
-#define AFE_I2S_CON_WLEN_32BIT		BIT(1)
-#define AFE_I2S_CON_EN			BIT(0)
+#define AFE_I2S_CON_WLEN_32BIT		(1U << 1)
+#define AFE_I2S_CON_EN			(1U << 0)
 
-#define AFE_CONN3_I03_O03_S		BIT(3)
-#define AFE_CONN4_I04_O04_S		BIT(4)
-#define AFE_CONN4_I03_O04_S		BIT(3)
+#define AFE_CONN3_I03_O03_S		(1U << 3)
+#define AFE_CONN4_I04_O04_S		(1U << 4)
+#define AFE_CONN4_I03_O04_S		(1U << 3)
 
 /* AFE_I2S_CON1 (0x0034) */
-#define AFE_I2S_CON1_I2S2_TO_PAD	BIT(18)
+#define AFE_I2S_CON1_I2S2_TO_PAD	(1U << 18)
 #define AFE_I2S_CON1_TDMOUT_TO_PAD	(0 << 18)
 #define AFE_I2S_CON1_RATE		GENMASK(11, 8)
-#define AFE_I2S_CON1_FORMAT_I2S		BIT(3)
-#define AFE_I2S_CON1_WLEN_32BIT		BIT(1)
-#define AFE_I2S_CON1_EN			BIT(0)
+#define AFE_I2S_CON1_FORMAT_I2S		(1U << 3)
+#define AFE_I2S_CON1_WLEN_32BIT		(1U << 1)
+#define AFE_I2S_CON1_EN			(1U << 0)
 
 /* AFE_I2S_CON2 (0x0038) */
-#define AFE_I2S_CON2_LOW_JITTER_CLK	BIT(12)
+#define AFE_I2S_CON2_LOW_JITTER_CLK	(1U << 12)
 #define AFE_I2S_CON2_RATE		GENMASK(11, 8)
-#define AFE_I2S_CON2_FORMAT_I2S		BIT(3)
-#define AFE_I2S_CON2_WLEN_32BIT		BIT(1)
-#define AFE_I2S_CON2_EN			BIT(0)
+#define AFE_I2S_CON2_FORMAT_I2S		(1U << 3)
+#define AFE_I2S_CON2_WLEN_32BIT		(1U << 1)
+#define AFE_I2S_CON2_EN			(1U << 0)
 
 /* AFE_I2S_CON3 (0x004C) */
-#define AFE_I2S_CON3_LOW_JITTER_CLK	BIT(12)
+#define AFE_I2S_CON3_LOW_JITTER_CLK	(1U << 12)
 #define AFE_I2S_CON3_RATE		GENMASK(11, 8)
-#define AFE_I2S_CON3_FORMAT_I2S		BIT(3)
-#define AFE_I2S_CON3_WLEN_32BIT		BIT(1)
-#define AFE_I2S_CON3_EN			BIT(0)
+#define AFE_I2S_CON3_FORMAT_I2S		(1U << 3)
+#define AFE_I2S_CON3_WLEN_32BIT		(1U << 1)
+#define AFE_I2S_CON3_EN			(1U << 0)
 
 /* AFE_ADDA_DL_SRC2_CON0 (0x0108) */
 #define AFE_ADDA_DL_SAMPLING_RATE	GENMASK(31, 28)
 #define AFE_ADDA_DL_8X_UPSAMPLE		GENMASK(25, 24)
-#define AFE_ADDA_DL_MUTE_OFF_CH1	BIT(12)
-#define AFE_ADDA_DL_MUTE_OFF_CH2	BIT(11)
-#define AFE_ADDA_DL_VOICE_DATA		BIT(5)
-#define AFE_ADDA_DL_DEGRADE_GAIN	BIT(1)
+#define AFE_ADDA_DL_MUTE_OFF_CH1	(1U << 12)
+#define AFE_ADDA_DL_MUTE_OFF_CH2	(1U << 11)
+#define AFE_ADDA_DL_VOICE_DATA		(1U << 5)
+#define AFE_ADDA_DL_DEGRADE_GAIN	(1U << 1)
 
 /* AFE_ADDA_UL_SRC_CON0 (0x0114) */
 #define AFE_ADDA_UL_SAMPLING_RATE	GENMASK(19, 17)
 
 /* AFE_ADDA_UL_DL_CON0 */
-#define AFE_ADDA_UL_DL_ADDA_AFE_ON	BIT(0)
-#define AFE_ADDA_UL_DL_DMIC_CLKDIV_ON	BIT(1)
+#define AFE_ADDA_UL_DL_ADDA_AFE_ON	(1U << 0)
+#define AFE_ADDA_UL_DL_DMIC_CLKDIV_ON	(1U << 1)
 
 /* AFE_APLL_TUNER_CFG (0x03f0) */
 #define AFE_APLL_TUNER_CFG_MASK		GENMASK(15, 1)
-#define AFE_APLL_TUNER_CFG_EN_MASK	BIT(0)
+#define AFE_APLL_TUNER_CFG_EN_MASK	(1U << 0)
 
 /* AFE_APLL_TUNER_CFG1 (0x03f4) */
 #define AFE_APLL_TUNER_CFG1_MASK	GENMASK(15, 1)
-#define AFE_APLL_TUNER_CFG1_EN_MASK	BIT(0)
+#define AFE_APLL_TUNER_CFG1_EN_MASK	(1U << 0)
 
 /* PCM_INTF_CON1 (0x0550) */
-#define PCM_INTF_CON1_EXT_MODEM		BIT(17)
+#define PCM_INTF_CON1_EXT_MODEM		(1U << 17)
 #define PCM_INTF_CON1_16BIT		(0 << 16)
-#define PCM_INTF_CON1_24BIT		BIT(16)
+#define PCM_INTF_CON1_24BIT		(1U << 16)
 #define PCM_INTF_CON1_32BCK		(0 << 14)
-#define PCM_INTF_CON1_64BCK		BIT(14)
+#define PCM_INTF_CON1_64BCK		(1U << 14)
 #define PCM_INTF_CON1_MASTER_MODE	(0 << 5)
-#define PCM_INTF_CON1_SLAVE_MODE	BIT(5)
+#define PCM_INTF_CON1_SLAVE_MODE	(1U << 5)
 #define PCM_INTF_CON1_FS_MASK		GENMASK(4, 3)
 #define PCM_INTF_CON1_FS_8K		FIELD_PREP(PCM_INTF_CON1_FS_MASK, 0)
 #define PCM_INTF_CON1_FS_16K		FIELD_PREP(PCM_INTF_CON1_FS_MASK, 1)
@@ -875,12 +875,12 @@
 #define PCM_INTF_CON1_SYNC_LEN_MASK	GENMASK(13, 9)
 #define PCM_INTF_CON1_SYNC_LEN(x)	FIELD_PREP(PCM_INTF_CON1_SYNC_LEN_MASK, ((x) - 1))
 #define PCM_INTF_CON1_FORMAT_MASK	GENMASK(2, 1)
-#define PCM_INTF_CON1_SYNC_OUT_INV	BIT(23)
-#define PCM_INTF_CON1_BCLK_OUT_INV	BIT(22)
-#define PCM_INTF_CON1_SYNC_IN_INV	BIT(21)
-#define PCM_INTF_CON1_BCLK_IN_INV	BIT(20)
-#define PCM_INTF_CON1_BYPASS_ASRC	BIT(6)
-#define PCM_INTF_CON1_EN		BIT(0)
+#define PCM_INTF_CON1_SYNC_OUT_INV	(1U << 23)
+#define PCM_INTF_CON1_BCLK_OUT_INV	(1U << 22)
+#define PCM_INTF_CON1_SYNC_IN_INV	(1U << 21)
+#define PCM_INTF_CON1_BCLK_IN_INV	(1U << 20)
+#define PCM_INTF_CON1_BYPASS_ASRC	(1U << 6)
+#define PCM_INTF_CON1_EN		(1U << 0)
 #define PCM_INTF_CON1_CONFIG_MASK	(0xf3fffe)
 
 /* AFE_DMIC0_UL_SRC_CON0 (0x05b4)
@@ -890,9 +890,9 @@
  */
 #define DMIC_TOP_CON_CK_PHASE_SEL_CH1		GENMASK(29, 27)
 #define DMIC_TOP_CON_CK_PHASE_SEL_CH2		GENMASK(26, 24)
-#define DMIC_TOP_CON_TWO_WIRE_MODE		BIT(23)
-#define DMIC_TOP_CON_CH2_ON			BIT(22)
-#define DMIC_TOP_CON_CH1_ON			BIT(21)
+#define DMIC_TOP_CON_TWO_WIRE_MODE		(1U << 23)
+#define DMIC_TOP_CON_CH2_ON			(1U << 22)
+#define DMIC_TOP_CON_CH1_ON			(1U << 21)
 #define DMIC_TOP_CON_VOICE_MODE_MASK		GENMASK(19, 17)
 #define DMIC_TOP_CON_VOICE_MODE_8K		FIELD_PREP(DMIC_TOP_CON_VOICE_MODE_MASK, 0)
 #define DMIC_TOP_CON_VOICE_MODE_16K		FIELD_PREP(DMIC_TOP_CON_VOICE_MODE_MASK, 1)
@@ -900,28 +900,28 @@
 #define DMIC_TOP_CON_VOICE_MODE_48K		FIELD_PREP(DMIC_TOP_CON_VOICE_MODE_MASK, 3)
 #define DMIC_TOP_CON_LOW_POWER_MODE_MASK	GENMASK(15, 14)
 #define DMIC_TOP_CON_LOW_POWER_MODE(x)		FIELD_PREP(DMIC_TOP_CON_LOW_POWER_MODE_MASK, (x))
-#define DMIC_TOP_CON_IIR_ON			BIT(10)
+#define DMIC_TOP_CON_IIR_ON			(1U << 10)
 #define DMIC_TOP_CON_IIR_MODE			GENMASK(9, 7)
-#define DMIC_TOP_CON_INPUT_MODE			BIT(5)
-#define DMIC_TOP_CON_SDM3_LEVEL_MODE		BIT(1)
-#define DMIC_TOP_CON_SRC_ON			BIT(0)
+#define DMIC_TOP_CON_INPUT_MODE			(1U << 5)
+#define DMIC_TOP_CON_SDM3_LEVEL_MODE		(1U << 1)
+#define DMIC_TOP_CON_SRC_ON			(1U << 0)
 #define DMIC_TOP_CON_SDM3_DE_SELECT		(0 << 1)
 #define DMIC_TOP_CON_CONFIG_MASK		(0x3f8ed7a6)
 
 /* AFE_CONN_24BIT (0x0AA4) */
-#define AFE_CONN_24BIT_O10		BIT(10)
-#define AFE_CONN_24BIT_O09		BIT(9)
-#define AFE_CONN_24BIT_O06		BIT(6)
-#define AFE_CONN_24BIT_O05		BIT(5)
-#define AFE_CONN_24BIT_O04		BIT(4)
-#define AFE_CONN_24BIT_O03		BIT(3)
-#define AFE_CONN_24BIT_O02		BIT(2)
-#define AFE_CONN_24BIT_O01		BIT(1)
-#define AFE_CONN_24BIT_O00		BIT(0)
+#define AFE_CONN_24BIT_O10		(1U << 10)
+#define AFE_CONN_24BIT_O09		(1U << 9)
+#define AFE_CONN_24BIT_O06		(1U << 6)
+#define AFE_CONN_24BIT_O05		(1U << 5)
+#define AFE_CONN_24BIT_O04		(1U << 4)
+#define AFE_CONN_24BIT_O03		(1U << 3)
+#define AFE_CONN_24BIT_O02		(1U << 2)
+#define AFE_CONN_24BIT_O01		(1U << 1)
+#define AFE_CONN_24BIT_O00		(1U << 0)
 
 /* AFE_HD_ENGEN_ENABLE */
-#define AFE_22M_PLL_EN		BIT(0)
-#define AFE_24M_PLL_EN		BIT(1)
+#define AFE_22M_PLL_EN		(1U << 0)
+#define AFE_24M_PLL_EN		(1U << 1)
 
 /* AFE_GAIN1_CON0 (0x0410) */
 #define AFE_GAIN1_CON0_EN_MASK			GENMASK(0, 0)
@@ -938,15 +938,15 @@
 /* AFE_CM2_CON0 (0x0e60) */
 #define CM_AFE_CM_CH_NUM_MASK		GENMASK(3, 0)
 #define CM_AFE_CM_CH_NUM(x)		FIELD_PREP(CM_AFE_CM_CH_NUM_MASK, ((x) - 1))
-#define CM_AFE_CM_ON			BIT(4)
+#define CM_AFE_CM_ON			(1U << 4)
 #define CM_AFE_CM_START_DATA_MASK	GENMASK(11, 8)
 
-#define CM_AFE_CM1_VUL_SEL		BIT(12)
+#define CM_AFE_CM1_VUL_SEL		(1U << 12)
 #define CM_AFE_CM1_IN_MODE_MASK		GENMASK(19, 16)
-#define CM_AFE_CM2_TDM_SEL		BIT(12)
-#define CM_AFE_CM2_CLK_SEL		BIT(13)
-#define CM_AFE_CM2_GASRC1_OUT_SEL	BIT(17)
-#define CM_AFE_CM2_GASRC2_OUT_SEL	BIT(16)
+#define CM_AFE_CM2_TDM_SEL		(1U << 12)
+#define CM_AFE_CM2_CLK_SEL		(1U << 13)
+#define CM_AFE_CM2_GASRC1_OUT_SEL	(1U << 17)
+#define CM_AFE_CM2_GASRC2_OUT_SEL	(1U << 16)
 
 /* AFE_CM2_CONN* */
 #define CM2_AFE_CM2_CONN_CFG1(x)	FIELD_PREP(CM2_AFE_CM2_CONN_CFG1_MASK, (x))

-- 
2.39.2



From broonie at kernel.org  Fri Sep  6 17:53:27 2024
From: broonie at kernel.org (Mark Brown)
Date: Sat, 07 Sep 2024 01:53:27 +0100
Subject: [PATCH 2/7] ASoC: mt8365: Remove spurious unsigned long casts
In-Reply-To: <20240907-asoc-fix-mt8365-build-v1-0-7ad0bac20161@kernel.org>
References: <20240907-asoc-fix-mt8365-build-v1-0-7ad0bac20161@kernel.org>
Message-ID: <20240907-asoc-fix-mt8365-build-v1-2-7ad0bac20161@kernel.org>

The regmap APIs take unsigned ints not unsigned longs so casting their
arguments to unsigned longs is not a good choice, the constants being
cast here are all unsigned ints anyway.

Signed-off-by: Mark Brown <broonie at kernel.org>
---
 sound/soc/mediatek/mt8365/mt8365-dai-i2s.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/sound/soc/mediatek/mt8365/mt8365-dai-i2s.c b/sound/soc/mediatek/mt8365/mt8365-dai-i2s.c
index 5003fe5e5ccf..6b4d8b7e24ca 100644
--- a/sound/soc/mediatek/mt8365/mt8365-dai-i2s.c
+++ b/sound/soc/mediatek/mt8365/mt8365-dai-i2s.c
@@ -385,7 +385,7 @@ static int mt8365_afe_set_2nd_i2s_asrc(struct mtk_base_afe *afe,
 		/* disable IIR coeff SRAM access */
 		regmap_update_bits(afe->regmap, AFE_ASRC_2CH_CON0,
 				   COEFF_SRAM_CTRL,
-				   (unsigned long)~COEFF_SRAM_CTRL);
+				   ~COEFF_SRAM_CTRL);
 		regmap_update_bits(afe->regmap, AFE_ASRC_2CH_CON2,
 				   CLR_IIR_HISTORY | IIR_EN | IIR_STAGE_MASK,
 				   CLR_IIR_HISTORY | IIR_EN |
@@ -393,7 +393,7 @@ static int mt8365_afe_set_2nd_i2s_asrc(struct mtk_base_afe *afe,
 	} else {
 		/* disable IIR */
 		regmap_update_bits(afe->regmap, AFE_ASRC_2CH_CON2,
-				   IIR_EN, (unsigned long)~IIR_EN);
+				   IIR_EN, ~IIR_EN);
 	}
 
 	/* CON3 setting (RX OFS) */
@@ -456,7 +456,7 @@ static int mt8365_afe_set_2nd_i2s_asrc_enable(struct mtk_base_afe *afe,
 				   ASM_ON, ASM_ON);
 	else
 		regmap_update_bits(afe->regmap, AFE_ASRC_2CH_CON0,
-				   ASM_ON, (unsigned long)~ASM_ON);
+				   ASM_ON, ~ASM_ON);
 	return 0;
 }
 

-- 
2.39.2



From broonie at kernel.org  Fri Sep  6 17:53:28 2024
From: broonie at kernel.org (Mark Brown)
Date: Sat, 07 Sep 2024 01:53:28 +0100
Subject: [PATCH 3/7] ASoC: mt8365: Remove unused prototype for
 mt8365_afe_clk_group_48k()
In-Reply-To: <20240907-asoc-fix-mt8365-build-v1-0-7ad0bac20161@kernel.org>
References: <20240907-asoc-fix-mt8365-build-v1-0-7ad0bac20161@kernel.org>
Message-ID: <20240907-asoc-fix-mt8365-build-v1-3-7ad0bac20161@kernel.org>

The function is not used outside of the file it is defined and the
equivalent function for 44.1kHz is not prototyped so remove the prototype
for this function.

Signed-off-by: Mark Brown <broonie at kernel.org>
---
 sound/soc/mediatek/mt8365/mt8365-afe-common.h | 1 -
 1 file changed, 1 deletion(-)

diff --git a/sound/soc/mediatek/mt8365/mt8365-afe-common.h b/sound/soc/mediatek/mt8365/mt8365-afe-common.h
index 1fa87e54a57f..731406e15ac7 100644
--- a/sound/soc/mediatek/mt8365/mt8365-afe-common.h
+++ b/sound/soc/mediatek/mt8365/mt8365-afe-common.h
@@ -421,7 +421,6 @@ static inline u32 AutoRstThLo(unsigned int fs)
 	}
 }
 
-bool mt8365_afe_clk_group_48k(int sample_rate);
 bool mt8365_afe_rate_supported(unsigned int rate, unsigned int id);
 bool mt8365_afe_channel_supported(unsigned int channel, unsigned int id);
 

-- 
2.39.2



From broonie at kernel.org  Fri Sep  6 17:53:29 2024
From: broonie at kernel.org (Mark Brown)
Date: Sat, 07 Sep 2024 01:53:29 +0100
Subject: [PATCH 4/7] ASoC: mt8365: Make non-exported functions static
In-Reply-To: <20240907-asoc-fix-mt8365-build-v1-0-7ad0bac20161@kernel.org>
References: <20240907-asoc-fix-mt8365-build-v1-0-7ad0bac20161@kernel.org>
Message-ID: <20240907-asoc-fix-mt8365-build-v1-4-7ad0bac20161@kernel.org>

The compilers warn if functions without a prototype are not static so add
appropriate static declarations.

Reported-by: Nathan Chancellor <nathan at kernel.org>
Signed-off-by: Mark Brown <broonie at kernel.org>
---
 sound/soc/mediatek/mt8365/mt8365-afe-clk.c |  4 ++--
 sound/soc/mediatek/mt8365/mt8365-afe-pcm.c | 12 ++++++------
 2 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/sound/soc/mediatek/mt8365/mt8365-afe-clk.c b/sound/soc/mediatek/mt8365/mt8365-afe-clk.c
index 300d1f0ae660..8a0af2ea8546 100644
--- a/sound/soc/mediatek/mt8365/mt8365-afe-clk.c
+++ b/sound/soc/mediatek/mt8365/mt8365-afe-clk.c
@@ -295,7 +295,7 @@ int mt8365_afe_disable_afe_on(struct mtk_base_afe *afe)
 	return 0;
 }
 
-int mt8365_afe_hd_engen_enable(struct mtk_base_afe *afe, bool apll1)
+static int mt8365_afe_hd_engen_enable(struct mtk_base_afe *afe, bool apll1)
 {
 	if (apll1)
 		regmap_update_bits(afe->regmap, AFE_HD_ENGEN_ENABLE,
@@ -307,7 +307,7 @@ int mt8365_afe_hd_engen_enable(struct mtk_base_afe *afe, bool apll1)
 	return 0;
 }
 
-int mt8365_afe_hd_engen_disable(struct mtk_base_afe *afe, bool apll1)
+static int mt8365_afe_hd_engen_disable(struct mtk_base_afe *afe, bool apll1)
 {
 	if (apll1)
 		regmap_update_bits(afe->regmap, AFE_HD_ENGEN_ENABLE,
diff --git a/sound/soc/mediatek/mt8365/mt8365-afe-pcm.c b/sound/soc/mediatek/mt8365/mt8365-afe-pcm.c
index df6dd8c5bbe5..54d2112d2e92 100644
--- a/sound/soc/mediatek/mt8365/mt8365-afe-pcm.c
+++ b/sound/soc/mediatek/mt8365/mt8365-afe-pcm.c
@@ -170,7 +170,7 @@ bool mt8365_afe_channel_supported(unsigned int channel, unsigned int id)
 	return false;
 }
 
-bool mt8365_afe_clk_group_44k(int sample_rate)
+static bool mt8365_afe_clk_group_44k(int sample_rate)
 {
 	if (sample_rate == 11025 ||
 	    sample_rate == 22050 ||
@@ -182,7 +182,7 @@ bool mt8365_afe_clk_group_44k(int sample_rate)
 		return false;
 }
 
-bool mt8365_afe_clk_group_48k(int sample_rate)
+static bool mt8365_afe_clk_group_48k(int sample_rate)
 {
 	return (!mt8365_afe_clk_group_44k(sample_rate));
 }
@@ -496,8 +496,8 @@ static int mt8365_afe_configure_cm(struct mtk_base_afe *afe,
 	return 0;
 }
 
-int mt8365_afe_fe_startup(struct snd_pcm_substream *substream,
-			  struct snd_soc_dai *dai)
+static int mt8365_afe_fe_startup(struct snd_pcm_substream *substream,
+				 struct snd_soc_dai *dai)
 {
 	struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
 	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
@@ -714,8 +714,8 @@ static int mt8365_afe_fe_prepare(struct snd_pcm_substream *substream,
 	return 0;
 }
 
-int mt8365_afe_fe_trigger(struct snd_pcm_substream *substream, int cmd,
-			  struct snd_soc_dai *dai)
+static int mt8365_afe_fe_trigger(struct snd_pcm_substream *substream, int cmd,
+				 struct snd_soc_dai *dai)
 {
 	struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
 	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);

-- 
2.39.2



From broonie at kernel.org  Fri Sep  6 17:53:30 2024
From: broonie at kernel.org (Mark Brown)
Date: Sat, 07 Sep 2024 01:53:30 +0100
Subject: [PATCH 5/7] ASoC: mt8365: Remove unused variables
In-Reply-To: <20240907-asoc-fix-mt8365-build-v1-0-7ad0bac20161@kernel.org>
References: <20240907-asoc-fix-mt8365-build-v1-0-7ad0bac20161@kernel.org>
Message-ID: <20240907-asoc-fix-mt8365-build-v1-5-7ad0bac20161@kernel.org>

Silence compiler warnings by removing unused variables.

Reported-by: Nathan Chancellor <nathan at kernel.org>
Signed-off-by: Mark Brown <broonie at kernel.org>
---
 sound/soc/mediatek/mt8365/mt8365-afe-pcm.c | 1 -
 sound/soc/mediatek/mt8365/mt8365-mt6357.c  | 3 +--
 2 files changed, 1 insertion(+), 3 deletions(-)

diff --git a/sound/soc/mediatek/mt8365/mt8365-afe-pcm.c b/sound/soc/mediatek/mt8365/mt8365-afe-pcm.c
index 54d2112d2e92..21b1319a6c28 100644
--- a/sound/soc/mediatek/mt8365/mt8365-afe-pcm.c
+++ b/sound/soc/mediatek/mt8365/mt8365-afe-pcm.c
@@ -651,7 +651,6 @@ static int mt8365_afe_fe_hw_free(struct snd_pcm_substream *substream,
 	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
 	struct mt8365_afe_private *afe_priv = afe->platform_priv;
 	int dai_id = snd_soc_rtd_to_cpu(rtd, 0)->id;
-	struct mtk_base_afe_memif *memif = &afe->memif[dai_id];
 	struct mt8365_fe_dai_data *fe_data = &afe_priv->fe_data[dai_id];
 	int ret = 0;
 
diff --git a/sound/soc/mediatek/mt8365/mt8365-mt6357.c b/sound/soc/mediatek/mt8365/mt8365-mt6357.c
index fef76118f801..1b8d1656101b 100644
--- a/sound/soc/mediatek/mt8365/mt8365-mt6357.c
+++ b/sound/soc/mediatek/mt8365/mt8365-mt6357.c
@@ -290,9 +290,8 @@ static int mt8365_mt6357_dev_probe(struct mtk_soc_card_data *soc_card_data, bool
 	struct mtk_platform_card_data *card_data = soc_card_data->card_data;
 	struct snd_soc_card *card = card_data->card;
 	struct device *dev = card->dev;
-	struct device_node *platform_node;
 	struct mt8365_mt6357_priv *mach_priv;
-	int i, ret;
+	int ret;
 
 	card->dev = dev;
 	ret = parse_dai_link_info(card);

-- 
2.39.2



From broonie at kernel.org  Fri Sep  6 17:53:31 2024
From: broonie at kernel.org (Mark Brown)
Date: Sat, 07 Sep 2024 01:53:31 +0100
Subject: [PATCH 6/7] ASoC: mt8365: Remove unused DMIC IIR coefficient
 configuration
In-Reply-To: <20240907-asoc-fix-mt8365-build-v1-0-7ad0bac20161@kernel.org>
References: <20240907-asoc-fix-mt8365-build-v1-0-7ad0bac20161@kernel.org>
Message-ID: <20240907-asoc-fix-mt8365-build-v1-6-7ad0bac20161@kernel.org>

Nothing ever calls mt8365_dai_load_dmic_iirc_coeff_table() so the compiler
warns about an unused static function. While it seems likely that something
should be calling the function I don't know what and this is breaking
-Werror builds like allmodconfig so let's just remove it. It can be added
again along with the user.

Reported-by: Nathan Chancellor <nathan at kernel.org>
Signed-off-by: Mark Brown <broonie at kernel.org>
---
 sound/soc/mediatek/mt8365/mt8365-dai-dmic.c | 30 -----------------------------
 1 file changed, 30 deletions(-)

diff --git a/sound/soc/mediatek/mt8365/mt8365-dai-dmic.c b/sound/soc/mediatek/mt8365/mt8365-dai-dmic.c
index a3bf54751420..f9945c2a2cd1 100644
--- a/sound/soc/mediatek/mt8365/mt8365-dai-dmic.c
+++ b/sound/soc/mediatek/mt8365/mt8365-dai-dmic.c
@@ -108,36 +108,6 @@ static void mt8365_dai_disable_dmic(struct mtk_base_afe *afe,
 	regmap_update_bits(afe->regmap, reg, mask, 0);
 }
 
-static const struct reg_sequence mt8365_dmic_iir_coeff[] = {
-	{ AFE_DMIC0_IIR_COEF_02_01, 0x00000000 },
-	{ AFE_DMIC0_IIR_COEF_04_03, 0x00003FB8 },
-	{ AFE_DMIC0_IIR_COEF_06_05, 0x3FB80000 },
-	{ AFE_DMIC0_IIR_COEF_08_07, 0x3FB80000 },
-	{ AFE_DMIC0_IIR_COEF_10_09, 0x0000C048 },
-	{ AFE_DMIC1_IIR_COEF_02_01, 0x00000000 },
-	{ AFE_DMIC1_IIR_COEF_04_03, 0x00003FB8 },
-	{ AFE_DMIC1_IIR_COEF_06_05, 0x3FB80000 },
-	{ AFE_DMIC1_IIR_COEF_08_07, 0x3FB80000 },
-	{ AFE_DMIC1_IIR_COEF_10_09, 0x0000C048 },
-	{ AFE_DMIC2_IIR_COEF_02_01, 0x00000000 },
-	{ AFE_DMIC2_IIR_COEF_04_03, 0x00003FB8 },
-	{ AFE_DMIC2_IIR_COEF_06_05, 0x3FB80000 },
-	{ AFE_DMIC2_IIR_COEF_08_07, 0x3FB80000 },
-	{ AFE_DMIC2_IIR_COEF_10_09, 0x0000C048 },
-	{ AFE_DMIC3_IIR_COEF_02_01, 0x00000000 },
-	{ AFE_DMIC3_IIR_COEF_04_03, 0x00003FB8 },
-	{ AFE_DMIC3_IIR_COEF_06_05, 0x3FB80000 },
-	{ AFE_DMIC3_IIR_COEF_08_07, 0x3FB80000 },
-	{ AFE_DMIC3_IIR_COEF_10_09, 0x0000C048 },
-};
-
-static int mt8365_dai_load_dmic_iir_coeff_table(struct mtk_base_afe *afe)
-{
-	return regmap_multi_reg_write(afe->regmap,
-				      mt8365_dmic_iir_coeff,
-				      ARRAY_SIZE(mt8365_dmic_iir_coeff));
-}
-
 static int mt8365_dai_configure_dmic(struct mtk_base_afe *afe,
 				     struct snd_pcm_substream *substream,
 				     struct snd_soc_dai *dai)

-- 
2.39.2



From broonie at kernel.org  Fri Sep  6 17:53:32 2024
From: broonie at kernel.org (Mark Brown)
Date: Sat, 07 Sep 2024 01:53:32 +0100
Subject: [PATCH 7/7] ASoC: mt8365: Allow build coverage
In-Reply-To: <20240907-asoc-fix-mt8365-build-v1-0-7ad0bac20161@kernel.org>
References: <20240907-asoc-fix-mt8365-build-v1-0-7ad0bac20161@kernel.org>
Message-ID: <20240907-asoc-fix-mt8365-build-v1-7-7ad0bac20161@kernel.org>

There is no build time dependency on anything specific to ARCH_MEDIATEK so
enable COMPILE_TEST builds.

Signed-off-by: Mark Brown <broonie at kernel.org>
---
 sound/soc/mediatek/Kconfig | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/sound/soc/mediatek/Kconfig b/sound/soc/mediatek/Kconfig
index e6f7a5a49794..3033e2d3fe16 100644
--- a/sound/soc/mediatek/Kconfig
+++ b/sound/soc/mediatek/Kconfig
@@ -301,7 +301,7 @@ config SND_SOC_MT8195_MT6359
 
 config SND_SOC_MT8365
 	tristate "ASoC support for MediaTek MT8365 chip"
-	depends on ARCH_MEDIATEK
+	depends on ARCH_MEDIATEK || COMPILE_TEST
 	select SND_SOC_MEDIATEK
 	help
 	  This adds ASoC platform driver support for MediaTek MT8365 chip

-- 
2.39.2



From linruifeng4 at huawei.com  Fri Sep  6 20:42:26 2024
From: linruifeng4 at huawei.com (Lin Ruifeng)
Date: Sat, 7 Sep 2024 11:42:26 +0800
Subject: [PATCH -next] usb: musb: mediatek: Simplify code with dev_err_probe()
Message-ID: <20240907034226.120159-1-linruifeng4@huawei.com>

The combination of dev_err() and the returned error code could be
replaced by dev_err_probe() in driver's probe function. Let's,
converting to dev_err_probe() to make code more simple.

Signed-off-by: Lin Ruifeng <linruifeng4 at huawei.com>
---
 drivers/usb/musb/mediatek.c | 27 +++++++++++----------------
 1 file changed, 11 insertions(+), 16 deletions(-)

diff --git a/drivers/usb/musb/mediatek.c b/drivers/usb/musb/mediatek.c
index 0a35aab3ab81..393b909de238 100644
--- a/drivers/usb/musb/mediatek.c
+++ b/drivers/usb/musb/mediatek.c
@@ -416,10 +416,9 @@ static int mtk_musb_probe(struct platform_device *pdev)
 		return -ENOMEM;
 
 	ret = of_platform_populate(np, NULL, NULL, dev);
-	if (ret) {
-		dev_err(dev, "failed to create child devices at %p\n", np);
-		return ret;
-	}
+	if (ret)
+		return dev_err_probe(dev, ret,
+				"failed to create child devices at %p\n", np);
 
 	ret = mtk_musb_clks_get(glue);
 	if (ret)
@@ -448,23 +447,19 @@ static int mtk_musb_probe(struct platform_device *pdev)
 		glue->role = USB_ROLE_NONE;
 		break;
 	default:
-		dev_err(&pdev->dev, "Error 'dr_mode' property\n");
-		return -EINVAL;
+		return dev_err_probe(&pdev->dev, -EINVAL,
+				"failed to create child devices at %p\n", np);
 	}
 
 	glue->phy = devm_of_phy_get_by_index(dev, np, 0);
-	if (IS_ERR(glue->phy)) {
-		dev_err(dev, "fail to getting phy %ld\n",
-			PTR_ERR(glue->phy));
-		return PTR_ERR(glue->phy);
-	}
+	if (IS_ERR(glue->phy))
+		return dev_err_probe(dev, PTR_ERR(glue->phy),
+				"fail to getting phy\n");
 
 	glue->usb_phy = usb_phy_generic_register();
-	if (IS_ERR(glue->usb_phy)) {
-		dev_err(dev, "fail to registering usb-phy %ld\n",
-			PTR_ERR(glue->usb_phy));
-		return PTR_ERR(glue->usb_phy);
-	}
+	if (IS_ERR(glue->usb_phy))
+		return dev_err_probe(dev, PTR_ERR(glue->usb_phy),
+				"fail to registering usb-phy\n");
 
 	glue->xceiv = devm_usb_get_phy(dev, USB_PHY_TYPE_USB2);
 	if (IS_ERR(glue->xceiv)) {
-- 
2.17.1



From christophe.jaillet at wanadoo.fr  Fri Sep  6 22:17:56 2024
From: christophe.jaillet at wanadoo.fr (Christophe JAILLET)
Date: Sat, 7 Sep 2024 07:17:56 +0200
Subject: [PATCH -next] usb: musb: mediatek: Simplify code with
 dev_err_probe()
In-Reply-To: <20240907034226.120159-1-linruifeng4@huawei.com>
References: <20240907034226.120159-1-linruifeng4@huawei.com>
Message-ID: <1cda7882-56e2-445f-b3cf-0366236250e6@wanadoo.fr>

Le 07/09/2024 ? 05:42, Lin Ruifeng a ?crit?:
> The combination of dev_err() and the returned error code could be
> replaced by dev_err_probe() in driver's probe function. Let's,
> converting to dev_err_probe() to make code more simple.
> 
> Signed-off-by: Lin Ruifeng <linruifeng4-hv44wF8Li93QT0dZR+AlfA at public.gmane.org>
> ---
>   drivers/usb/musb/mediatek.c | 27 +++++++++++----------------
>   1 file changed, 11 insertions(+), 16 deletions(-)
> 
> diff --git a/drivers/usb/musb/mediatek.c b/drivers/usb/musb/mediatek.c
> index 0a35aab3ab81..393b909de238 100644
> --- a/drivers/usb/musb/mediatek.c
> +++ b/drivers/usb/musb/mediatek.c
> @@ -416,10 +416,9 @@ static int mtk_musb_probe(struct platform_device *pdev)
>   		return -ENOMEM;
>   
>   	ret = of_platform_populate(np, NULL, NULL, dev);
> -	if (ret) {
> -		dev_err(dev, "failed to create child devices at %p\n", np);
> -		return ret;
> -	}
> +	if (ret)
> +		return dev_err_probe(dev, ret,
> +				"failed to create child devices at %p\n", np);
>   
>   	ret = mtk_musb_clks_get(glue);
>   	if (ret)
> @@ -448,23 +447,19 @@ static int mtk_musb_probe(struct platform_device *pdev)
>   		glue->role = USB_ROLE_NONE;
>   		break;
>   	default:
> -		dev_err(&pdev->dev, "Error 'dr_mode' property\n");
> -		return -EINVAL;
> +		return dev_err_probe(&pdev->dev, -EINVAL,
> +				"failed to create child devices at %p\n", np);

This message is wrong.
You made a cut'n'paste of the previous one.

>   	}
>   
>   	glue->phy = devm_of_phy_get_by_index(dev, np, 0);
> -	if (IS_ERR(glue->phy)) {
> -		dev_err(dev, "fail to getting phy %ld\n",
> -			PTR_ERR(glue->phy));
> -		return PTR_ERR(glue->phy);
> -	}
> +	if (IS_ERR(glue->phy))
> +		return dev_err_probe(dev, PTR_ERR(glue->phy),
> +				"fail to getting phy\n");

While a it, change it to "failed to get phy"?

>   
>   	glue->usb_phy = usb_phy_generic_register();
> -	if (IS_ERR(glue->usb_phy)) {
> -		dev_err(dev, "fail to registering usb-phy %ld\n",
> -			PTR_ERR(glue->usb_phy));
> -		return PTR_ERR(glue->usb_phy);
> -	}
> +	if (IS_ERR(glue->usb_phy))
> +		return dev_err_probe(dev, PTR_ERR(glue->usb_phy),
> +				"fail to registering usb-phy\n");

While a it, change it to "failed to register usb-phy"?

CJ

>   
>   	glue->xceiv = devm_usb_get_phy(dev, USB_PHY_TYPE_USB2);
>   	if (IS_ERR(glue->xceiv)) {



From linruifeng4 at huawei.com  Sat Sep  7 00:55:08 2024
From: linruifeng4 at huawei.com (Lin Ruifeng)
Date: Sat, 7 Sep 2024 15:55:08 +0800
Subject: [PATCH -next] usb: musb: mediatek: Simplify code with dev_err_probe()
Message-ID: <20240907075508.79889-1-linruifeng4@huawei.com>

The combination of dev_err() and the returned error code could be
replaced by dev_err_probe() in driver's probe function. Let's,
converting to dev_err_probe() to make code more simple.

Signed-off-by: Lin Ruifeng <linruifeng4 at huawei.com>
---
 drivers/usb/musb/mediatek.c | 27 +++++++++++----------------
 1 file changed, 11 insertions(+), 16 deletions(-)

diff --git a/drivers/usb/musb/mediatek.c b/drivers/usb/musb/mediatek.c
index 0a35aab3ab81..63c86c046b98 100644
--- a/drivers/usb/musb/mediatek.c
+++ b/drivers/usb/musb/mediatek.c
@@ -416,10 +416,9 @@ static int mtk_musb_probe(struct platform_device *pdev)
 		return -ENOMEM;
 
 	ret = of_platform_populate(np, NULL, NULL, dev);
-	if (ret) {
-		dev_err(dev, "failed to create child devices at %p\n", np);
-		return ret;
-	}
+	if (ret)
+		return dev_err_probe(dev, ret,
+				"failed to create child devices at %p\n", np);
 
 	ret = mtk_musb_clks_get(glue);
 	if (ret)
@@ -448,23 +447,19 @@ static int mtk_musb_probe(struct platform_device *pdev)
 		glue->role = USB_ROLE_NONE;
 		break;
 	default:
-		dev_err(&pdev->dev, "Error 'dr_mode' property\n");
-		return -EINVAL;
+		return dev_err_probe(&pdev->dev, -EINVAL,
+				"Error 'dr_mode' property\n");
 	}
 
 	glue->phy = devm_of_phy_get_by_index(dev, np, 0);
-	if (IS_ERR(glue->phy)) {
-		dev_err(dev, "fail to getting phy %ld\n",
-			PTR_ERR(glue->phy));
-		return PTR_ERR(glue->phy);
-	}
+	if (IS_ERR(glue->phy))
+		return dev_err_probe(dev, PTR_ERR(glue->phy),
+				"fail to getting phy\n");
 
 	glue->usb_phy = usb_phy_generic_register();
-	if (IS_ERR(glue->usb_phy)) {
-		dev_err(dev, "fail to registering usb-phy %ld\n",
-			PTR_ERR(glue->usb_phy));
-		return PTR_ERR(glue->usb_phy);
-	}
+	if (IS_ERR(glue->usb_phy))
+		return dev_err_probe(dev, PTR_ERR(glue->usb_phy),
+				"fail to registering usb-phy\n");
 
 	glue->xceiv = devm_usb_get_phy(dev, USB_PHY_TYPE_USB2);
 	if (IS_ERR(glue->xceiv)) {
-- 
2.17.1



From gregkh at linuxfoundation.org  Sat Sep  7 01:17:16 2024
From: gregkh at linuxfoundation.org (Greg KH)
Date: Sat, 7 Sep 2024 10:17:16 +0200
Subject: [PATCH -next] usb: musb: mediatek: Simplify code with
 dev_err_probe()
In-Reply-To: <20240907075508.79889-1-linruifeng4@huawei.com>
References: <20240907075508.79889-1-linruifeng4@huawei.com>
Message-ID: <2024090704-jingle-playroom-7411@gregkh>

On Sat, Sep 07, 2024 at 03:55:08PM +0800, Lin Ruifeng wrote:
> The combination of dev_err() and the returned error code could be
> replaced by dev_err_probe() in driver's probe function. Let's,
> converting to dev_err_probe() to make code more simple.
> 
> Signed-off-by: Lin Ruifeng <linruifeng4 at huawei.com>
> ---
>  drivers/usb/musb/mediatek.c | 27 +++++++++++----------------
>  1 file changed, 11 insertions(+), 16 deletions(-)
> 
> diff --git a/drivers/usb/musb/mediatek.c b/drivers/usb/musb/mediatek.c
> index 0a35aab3ab81..63c86c046b98 100644
> --- a/drivers/usb/musb/mediatek.c
> +++ b/drivers/usb/musb/mediatek.c
> @@ -416,10 +416,9 @@ static int mtk_musb_probe(struct platform_device *pdev)
>  		return -ENOMEM;
>  
>  	ret = of_platform_populate(np, NULL, NULL, dev);
> -	if (ret) {
> -		dev_err(dev, "failed to create child devices at %p\n", np);
> -		return ret;
> -	}
> +	if (ret)
> +		return dev_err_probe(dev, ret,
> +				"failed to create child devices at %p\n", np);
>  
>  	ret = mtk_musb_clks_get(glue);
>  	if (ret)
> @@ -448,23 +447,19 @@ static int mtk_musb_probe(struct platform_device *pdev)
>  		glue->role = USB_ROLE_NONE;
>  		break;
>  	default:
> -		dev_err(&pdev->dev, "Error 'dr_mode' property\n");
> -		return -EINVAL;
> +		return dev_err_probe(&pdev->dev, -EINVAL,
> +				"Error 'dr_mode' property\n");
>  	}
>  
>  	glue->phy = devm_of_phy_get_by_index(dev, np, 0);
> -	if (IS_ERR(glue->phy)) {
> -		dev_err(dev, "fail to getting phy %ld\n",
> -			PTR_ERR(glue->phy));
> -		return PTR_ERR(glue->phy);
> -	}
> +	if (IS_ERR(glue->phy))
> +		return dev_err_probe(dev, PTR_ERR(glue->phy),
> +				"fail to getting phy\n");
>  
>  	glue->usb_phy = usb_phy_generic_register();
> -	if (IS_ERR(glue->usb_phy)) {
> -		dev_err(dev, "fail to registering usb-phy %ld\n",
> -			PTR_ERR(glue->usb_phy));
> -		return PTR_ERR(glue->usb_phy);
> -	}
> +	if (IS_ERR(glue->usb_phy))
> +		return dev_err_probe(dev, PTR_ERR(glue->usb_phy),
> +				"fail to registering usb-phy\n");
>  
>  	glue->xceiv = devm_usb_get_phy(dev, USB_PHY_TYPE_USB2);
>  	if (IS_ERR(glue->xceiv)) {
> -- 
> 2.17.1
> 
> 

Hi,

This is the friendly patch-bot of Greg Kroah-Hartman.  You have sent him
a patch that has triggered this response.  He used to manually respond
to these common problems, but in order to save his sanity (he kept
writing the same thing over and over, yet to different people), I was
created.  Hopefully you will not take offence and will fix the problem
in your patch and resubmit it so that it can be accepted into the Linux
kernel tree.

You are receiving this message because of the following common error(s)
as indicated below:

- This looks like a new version of a previously submitted patch, but you
  did not list below the --- line any changes from the previous version.
  Please read the section entitled "The canonical patch format" in the
  kernel file, Documentation/process/submitting-patches.rst for what
  needs to be done here to properly describe this.

If you wish to discuss this problem further, or you have questions about
how to resolve this issue, please feel free to respond to this email and
Greg will reply once he has dug out from the pending patches received
from other developers.

thanks,

greg k-h's patch email bot


From linruifeng4 at huawei.com  Sat Sep  7 01:13:51 2024
From: linruifeng4 at huawei.com (Lin Ruifeng)
Date: Sat, 7 Sep 2024 16:13:51 +0800
Subject: [PATCH -next v2] usb: musb: mediatek: Simplify code with dev_err_probe()
Message-ID: <20240907081351.19879-1-linruifeng4@huawei.com>

The combination of dev_err() and the returned error code could be
replaced by dev_err_probe() in driver's probe function. Let's,
converting to dev_err_probe() to make code more simple.

Signed-off-by: Lin Ruifeng <linruifeng4 at huawei.com>
---
v2:
- The wrong message is modified.
 drivers/usb/musb/mediatek.c | 27 +++++++++++----------------
 1 file changed, 11 insertions(+), 16 deletions(-)

diff --git a/drivers/usb/musb/mediatek.c b/drivers/usb/musb/mediatek.c
index 0a35aab3ab81..63c86c046b98 100644
--- a/drivers/usb/musb/mediatek.c
+++ b/drivers/usb/musb/mediatek.c
@@ -416,10 +416,9 @@ static int mtk_musb_probe(struct platform_device *pdev)
 		return -ENOMEM;
 
 	ret = of_platform_populate(np, NULL, NULL, dev);
-	if (ret) {
-		dev_err(dev, "failed to create child devices at %p\n", np);
-		return ret;
-	}
+	if (ret)
+		return dev_err_probe(dev, ret,
+				"failed to create child devices at %p\n", np);
 
 	ret = mtk_musb_clks_get(glue);
 	if (ret)
@@ -448,23 +447,19 @@ static int mtk_musb_probe(struct platform_device *pdev)
 		glue->role = USB_ROLE_NONE;
 		break;
 	default:
-		dev_err(&pdev->dev, "Error 'dr_mode' property\n");
-		return -EINVAL;
+		return dev_err_probe(&pdev->dev, -EINVAL,
+				"Error 'dr_mode' property\n");
 	}
 
 	glue->phy = devm_of_phy_get_by_index(dev, np, 0);
-	if (IS_ERR(glue->phy)) {
-		dev_err(dev, "fail to getting phy %ld\n",
-			PTR_ERR(glue->phy));
-		return PTR_ERR(glue->phy);
-	}
+	if (IS_ERR(glue->phy))
+		return dev_err_probe(dev, PTR_ERR(glue->phy),
+				"fail to getting phy\n");
 
 	glue->usb_phy = usb_phy_generic_register();
-	if (IS_ERR(glue->usb_phy)) {
-		dev_err(dev, "fail to registering usb-phy %ld\n",
-			PTR_ERR(glue->usb_phy));
-		return PTR_ERR(glue->usb_phy);
-	}
+	if (IS_ERR(glue->usb_phy))
+		return dev_err_probe(dev, PTR_ERR(glue->usb_phy),
+				"fail to registering usb-phy\n");
 
 	glue->xceiv = devm_usb_get_phy(dev, USB_PHY_TYPE_USB2);
 	if (IS_ERR(glue->xceiv)) {
-- 
2.17.1



From lkp at intel.com  Sat Sep  7 05:55:44 2024
From: lkp at intel.com (kernel test robot)
Date: Sat, 7 Sep 2024 20:55:44 +0800
Subject: [PATCH v3 1/1] module: abort module loading when sysfs setup
 suffer errors
In-Reply-To: <20240906115748.5367-2-chunhui.li@mediatek.com>
References: <20240906115748.5367-2-chunhui.li@mediatek.com>
Message-ID: <202409072018.qfEzZbO7-lkp@intel.com>

Hi Chunhui,

kernel test robot noticed the following build warnings:

[auto build test WARNING on mcgrof/modules-next]
[also build test WARNING on linus/master v6.11-rc6 next-20240906]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Chunhui-Li/module-abort-module-loading-when-sysfs-setup-suffer-errors/20240907-000002
base:   https://git.kernel.org/pub/scm/linux/kernel/git/mcgrof/linux.git modules-next
patch link:    https://lore.kernel.org/r/20240906115748.5367-2-chunhui.li%40mediatek.com
patch subject: [PATCH v3 1/1] module: abort module loading when sysfs setup suffer errors
config: openrisc-defconfig (https://download.01.org/0day-ci/archive/20240907/202409072018.qfEzZbO7-lkp at intel.com/config)
compiler: or1k-linux-gcc (GCC) 14.1.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240907/202409072018.qfEzZbO7-lkp at intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp at intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202409072018.qfEzZbO7-lkp at intel.com/

All warnings (new ones prefixed by >>):

   kernel/module/sysfs.c: In function 'add_sect_attrs':
>> kernel/module/sysfs.c:232:67: warning: no return statement in function returning non-void [-Wreturn-type]
     232 | static inline int add_sect_attrs(struct module *mod, const struct load_info *info) { }
         |                                                                   ^~~~~~~~~
   kernel/module/sysfs.c: In function 'add_notes_attrs':
   kernel/module/sysfs.c:234:68: warning: no return statement in function returning non-void [-Wreturn-type]
     234 | static inline int add_notes_attrs(struct module *mod, const struct load_info *info) { }
         |                                                                    ^~~~~~~~~


vim +232 kernel/module/sysfs.c

   230	
   231	#else /* !CONFIG_KALLSYMS */
 > 232	static inline int add_sect_attrs(struct module *mod, const struct load_info *info) { }
   233	static inline void remove_sect_attrs(struct module *mod) { }
   234	static inline int add_notes_attrs(struct module *mod, const struct load_info *info) { }
   235	static inline void remove_notes_attrs(struct module *mod) { }
   236	#endif /* CONFIG_KALLSYMS */
   237	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki


From wsa+renesas at sang-engineering.com  Sat Sep  7 09:58:14 2024
From: wsa+renesas at sang-engineering.com (Wolfram Sang)
Date: Sat, 7 Sep 2024 18:58:14 +0200
Subject: [PATCH v6 00/12] platform/chrome: Introduce DT hardware prober
In-Reply-To: <20240904090016.2841572-1-wenst@chromium.org>
References: <20240904090016.2841572-1-wenst@chromium.org>
Message-ID: <ZtyGJhm-0GEEFfYf@shikoro>

Hi,

this series gets quite some review from people I trust. This is awesome.
So, I will keep to some high level questions:

> undiscoverable devices" [2] series, but follows the scheme suggested by
> Rob, marking all second source component device nodes as "fail-needs-probe",
> and having a hardware prober driver enable the one of them.

Where is this "fail-needs-probe" documented? I neither see it here nor
in the dt-schema repo.

> The other case, selecting a display panel to use based on the SKU ID
> from the firmware, hit a bit of an issue with fixing the OF graph.
> It has been left out since v3.

Does it make sense then to add touchscreens only? Will the panels be
worked on once this is upstream? Or what is the way forward?

> Wolfram, would you be able to handle the late PR? Assuming you get a
> chance to look at the patches that is.

Yes, I can do this, but...

>  drivers/i2c/Makefile                          |   7 +-
>  drivers/i2c/i2c-core-of-prober.c              | 437 ++++++++++++++++++

... this is quite some code. Would you be willing to maintain it (i.e.
please add a MAINTAINERS entry then). Kudos for not touching other parts
of the I2C core!

All the best,

   Wolfram

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-mediatek/attachments/20240907/a404b99a/attachment.sig>

From arnd at kernel.org  Sat Sep  7 13:00:38 2024
From: arnd at kernel.org (Arnd Bergmann)
Date: Sat,  7 Sep 2024 20:00:38 +0000
Subject: [PATCH] ASoC: mediatek: mt8365: remove unused mt8365_i2s_hd_str
Message-ID: <20240907200053.3027553-1-arnd@kernel.org>

From: Arnd Bergmann <arnd at arndb.de>

The mt8365_i2s_enum and mt8365_i2s_hd_str variables are not
used anywhere, but cause a warning when building with C=1
or when enabling -Wunused-const-variable:

sound/soc/mediatek/mt8365/mt8365-dai-i2s.c:781:27: error: 'mt8365_i2s_hd_str' defined but not used [-Werror=unused-const-variable=]
  781 | static const char * const mt8365_i2s_hd_str[] = {
      |                           ^~~~~~~~~~~~~~~~~

Remove these for the moment, they can be added back if a
user comes up.

Fixes: 402bbb13a195 ("ASoC: mediatek: mt8365: Add I2S DAI support")
Signed-off-by: Arnd Bergmann <arnd at arndb.de>
---
 sound/soc/mediatek/mt8365/mt8365-dai-i2s.c | 7 -------
 1 file changed, 7 deletions(-)

diff --git a/sound/soc/mediatek/mt8365/mt8365-dai-i2s.c b/sound/soc/mediatek/mt8365/mt8365-dai-i2s.c
index 6b4d8b7e24ca..3482d8f8b4e7 100644
--- a/sound/soc/mediatek/mt8365/mt8365-dai-i2s.c
+++ b/sound/soc/mediatek/mt8365/mt8365-dai-i2s.c
@@ -777,13 +777,6 @@ static struct snd_soc_dai_driver mtk_dai_i2s_driver[] = {
 	}
 };
 
-/* low jitter control */
-static const char * const mt8365_i2s_hd_str[] = {
-	"Normal", "Low_Jitter"
-};
-
-static SOC_ENUM_SINGLE_EXT_DECL(mt8365_i2s_enum, mt8365_i2s_hd_str);
-
 static const char * const fmi2sin_text[] = {
 	"OPEN", "FM_2ND_I2S_IN"
 };
-- 
2.39.2



From lkp at intel.com  Sat Sep  7 15:19:57 2024
From: lkp at intel.com (kernel test robot)
Date: Sun, 8 Sep 2024 06:19:57 +0800
Subject: [PATCH v3 1/1] module: abort module loading when sysfs setup
 suffer errors
In-Reply-To: <20240906115748.5367-2-chunhui.li@mediatek.com>
References: <20240906115748.5367-2-chunhui.li@mediatek.com>
Message-ID: <202409080534.y2m1URF1-lkp@intel.com>

Hi Chunhui,

kernel test robot noticed the following build warnings:

[auto build test WARNING on mcgrof/modules-next]
[also build test WARNING on linus/master v6.11-rc6 next-20240906]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Chunhui-Li/module-abort-module-loading-when-sysfs-setup-suffer-errors/20240907-000002
base:   https://git.kernel.org/pub/scm/linux/kernel/git/mcgrof/linux.git modules-next
patch link:    https://lore.kernel.org/r/20240906115748.5367-2-chunhui.li%40mediatek.com
patch subject: [PATCH v3 1/1] module: abort module loading when sysfs setup suffer errors
config: powerpc-asp8347_defconfig (https://download.01.org/0day-ci/archive/20240908/202409080534.y2m1URF1-lkp at intel.com/config)
compiler: clang version 17.0.6 (https://github.com/llvm/llvm-project 6009708b4367171ccdbf4b5905cb6a803753fe18)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240908/202409080534.y2m1URF1-lkp at intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp at intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202409080534.y2m1URF1-lkp at intel.com/

All warnings (new ones prefixed by >>):

>> kernel/module/sysfs.c:232:86: warning: non-void function does not return a value [-Wreturn-type]
     232 | static inline int add_sect_attrs(struct module *mod, const struct load_info *info) { }
         |                                                                                      ^
   kernel/module/sysfs.c:234:87: warning: non-void function does not return a value [-Wreturn-type]
     234 | static inline int add_notes_attrs(struct module *mod, const struct load_info *info) { }
         |                                                                                       ^
   2 warnings generated.


vim +232 kernel/module/sysfs.c

   230	
   231	#else /* !CONFIG_KALLSYMS */
 > 232	static inline int add_sect_attrs(struct module *mod, const struct load_info *info) { }
   233	static inline void remove_sect_attrs(struct module *mod) { }
   234	static inline int add_notes_attrs(struct module *mod, const struct load_info *info) { }
   235	static inline void remove_notes_attrs(struct module *mod) { }
   236	#endif /* CONFIG_KALLSYMS */
   237	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki


From tangbin at cmss.chinamobile.com  Sun Sep  8 06:46:04 2024
From: tangbin at cmss.chinamobile.com (Tang Bin)
Date: Sun,  8 Sep 2024 21:46:04 +0800
Subject: [PATCH] ASoC: codecs: fix the right check and simplify code
Message-ID: <20240908134604.3652-1-tangbin@cmss.chinamobile.com>

In the file drivers/base/platform.c, the return description of
platform_get_irq is 'non-zero IRQ number on success, negative
error number on failure.', so the check is wrong, fix it. And
when get irq failed, the function platform_get_irq logs an error
message.

Fixes: 5e2404493f9f ("ASoC: codecs: add MT6357 support")
Signed-off-by: Tang Bin <tangbin at cmss.chinamobile.com>
---
 sound/soc/mediatek/mt8365/mt8365-afe-pcm.c | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/sound/soc/mediatek/mt8365/mt8365-afe-pcm.c b/sound/soc/mediatek/mt8365/mt8365-afe-pcm.c
index df6dd8c5b..4ec86b71d 100644
--- a/sound/soc/mediatek/mt8365/mt8365-afe-pcm.c
+++ b/sound/soc/mediatek/mt8365/mt8365-afe-pcm.c
@@ -2155,11 +2155,11 @@ static int mt8365_afe_pcm_dev_probe(struct platform_device *pdev)
 	for (i = 0; i < afe->irqs_size; i++)
 		afe->irqs[i].irq_data = &irq_data[i];
 
-	irq_id = platform_get_irq(pdev, 0);
-	if (!irq_id) {
-		dev_err_probe(afe->dev, irq_id, "np %s no irq\n", afe->dev->of_node->name);
-		return -ENXIO;
-	}
+	ret = platform_get_irq(pdev, 0);
+	if (ret < 0)
+		return ret;
+
+	irq_id = ret;
 	ret = devm_request_irq(afe->dev, irq_id, mt8365_afe_irq_handler,
 			       0, "Afe_ISR_Handle", (void *)afe);
 	if (ret)
-- 
2.33.0





From krzysztof.kozlowski at linaro.org  Sun Sep  8 07:21:30 2024
From: krzysztof.kozlowski at linaro.org (Krzysztof Kozlowski)
Date: Sun, 08 Sep 2024 16:21:30 +0200
Subject: [PATCH 0/5] drm: misc: few simple cleanups
Message-ID: <20240908-regmap-config-const-v1-0-28f349004811@linaro.org>

No dependencies, trivial patches.

Best regards,
Krzysztof

---
Krzysztof Kozlowski (5):
      drm/meson: drop unused staitc dw_hdmi_dwc_write_bits
      drm/meson: constify regmap_config
      drm/fsl-dcu: constify regmap_config
      drm/mediatek: dp: constify regmap_config
      drm/bridge: ti-dlpc3433: constify regmap_config

 drivers/gpu/drm/bridge/ti-dlpc3433.c  |  2 +-
 drivers/gpu/drm/fsl-dcu/fsl_tcon.c    |  2 +-
 drivers/gpu/drm/mediatek/mtk_dp.c     |  2 +-
 drivers/gpu/drm/meson/meson_drv.c     |  2 +-
 drivers/gpu/drm/meson/meson_dw_hdmi.c | 14 --------------
 5 files changed, 4 insertions(+), 18 deletions(-)
---
base-commit: ad40aff1edffeccc412cde93894196dca7bc739e
change-id: 20240908-regmap-config-const-2b6e126feb8b

Best regards,
-- 
Krzysztof Kozlowski <krzysztof.kozlowski at linaro.org>



From krzysztof.kozlowski at linaro.org  Sun Sep  8 07:21:31 2024
From: krzysztof.kozlowski at linaro.org (Krzysztof Kozlowski)
Date: Sun, 08 Sep 2024 16:21:31 +0200
Subject: [PATCH 1/5] drm/meson: drop unused staitc dw_hdmi_dwc_write_bits
In-Reply-To: <20240908-regmap-config-const-v1-0-28f349004811@linaro.org>
References: <20240908-regmap-config-const-v1-0-28f349004811@linaro.org>
Message-ID: <20240908-regmap-config-const-v1-1-28f349004811@linaro.org>

static inline dw_hdmi_dwc_write_bits() function is not used at all:

  drivers/gpu/drm/meson/meson_dw_hdmi.c:276:20: error: unused function 'dw_hdmi_dwc_write_bits' [-Werror,-Wunused-function]

Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski at linaro.org>
---
 drivers/gpu/drm/meson/meson_dw_hdmi.c | 14 --------------
 1 file changed, 14 deletions(-)

diff --git a/drivers/gpu/drm/meson/meson_dw_hdmi.c b/drivers/gpu/drm/meson/meson_dw_hdmi.c
index 5565f7777529..b75db829b1da 100644
--- a/drivers/gpu/drm/meson/meson_dw_hdmi.c
+++ b/drivers/gpu/drm/meson/meson_dw_hdmi.c
@@ -272,20 +272,6 @@ static inline void dw_hdmi_g12a_dwc_write(struct meson_dw_hdmi *dw_hdmi,
 	writeb(data, dw_hdmi->hdmitx + addr);
 }
 
-/* Helper to change specific bits in controller registers */
-static inline void dw_hdmi_dwc_write_bits(struct meson_dw_hdmi *dw_hdmi,
-					  unsigned int addr,
-					  unsigned int mask,
-					  unsigned int val)
-{
-	unsigned int data = dw_hdmi->data->dwc_read(dw_hdmi, addr);
-
-	data &= ~mask;
-	data |= val;
-
-	dw_hdmi->data->dwc_write(dw_hdmi, addr, data);
-}
-
 /* Bridge */
 
 /* Setup PHY bandwidth modes */

-- 
2.43.0



From krzysztof.kozlowski at linaro.org  Sun Sep  8 07:21:32 2024
From: krzysztof.kozlowski at linaro.org (Krzysztof Kozlowski)
Date: Sun, 08 Sep 2024 16:21:32 +0200
Subject: [PATCH 2/5] drm/meson: constify regmap_config
In-Reply-To: <20240908-regmap-config-const-v1-0-28f349004811@linaro.org>
References: <20240908-regmap-config-const-v1-0-28f349004811@linaro.org>
Message-ID: <20240908-regmap-config-const-v1-2-28f349004811@linaro.org>

Mark local static 'struct regmap_config' as const for safer and more
obvious code.

Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski at linaro.org>
---
 drivers/gpu/drm/meson/meson_drv.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/meson/meson_drv.c b/drivers/gpu/drm/meson/meson_drv.c
index 4bd0baa2a4f5..6c8677d1f562 100644
--- a/drivers/gpu/drm/meson/meson_drv.c
+++ b/drivers/gpu/drm/meson/meson_drv.c
@@ -126,7 +126,7 @@ static bool meson_vpu_has_available_connectors(struct device *dev)
 	return false;
 }
 
-static struct regmap_config meson_regmap_config = {
+static const struct regmap_config meson_regmap_config = {
 	.reg_bits       = 32,
 	.val_bits       = 32,
 	.reg_stride     = 4,

-- 
2.43.0



From krzysztof.kozlowski at linaro.org  Sun Sep  8 07:21:33 2024
From: krzysztof.kozlowski at linaro.org (Krzysztof Kozlowski)
Date: Sun, 08 Sep 2024 16:21:33 +0200
Subject: [PATCH 3/5] drm/fsl-dcu: constify regmap_config
In-Reply-To: <20240908-regmap-config-const-v1-0-28f349004811@linaro.org>
References: <20240908-regmap-config-const-v1-0-28f349004811@linaro.org>
Message-ID: <20240908-regmap-config-const-v1-3-28f349004811@linaro.org>

Mark local static 'struct regmap_config' as const for safer and more
obvious code.

Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski at linaro.org>
---
 drivers/gpu/drm/fsl-dcu/fsl_tcon.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/fsl-dcu/fsl_tcon.c b/drivers/gpu/drm/fsl-dcu/fsl_tcon.c
index 9eb5abaf7d66..49bbd00c77ae 100644
--- a/drivers/gpu/drm/fsl-dcu/fsl_tcon.c
+++ b/drivers/gpu/drm/fsl-dcu/fsl_tcon.c
@@ -29,7 +29,7 @@ void fsl_tcon_bypass_enable(struct fsl_tcon *tcon)
 			   FSL_TCON_CTRL1_TCON_BYPASS);
 }
 
-static struct regmap_config fsl_tcon_regmap_config = {
+static const struct regmap_config fsl_tcon_regmap_config = {
 	.reg_bits = 32,
 	.reg_stride = 4,
 	.val_bits = 32,

-- 
2.43.0



From krzysztof.kozlowski at linaro.org  Sun Sep  8 07:21:34 2024
From: krzysztof.kozlowski at linaro.org (Krzysztof Kozlowski)
Date: Sun, 08 Sep 2024 16:21:34 +0200
Subject: [PATCH 4/5] drm/mediatek: dp: constify regmap_config
In-Reply-To: <20240908-regmap-config-const-v1-0-28f349004811@linaro.org>
References: <20240908-regmap-config-const-v1-0-28f349004811@linaro.org>
Message-ID: <20240908-regmap-config-const-v1-4-28f349004811@linaro.org>

Mark local static 'struct regmap_config' as const for safer and more
obvious code.

Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski at linaro.org>
---
 drivers/gpu/drm/mediatek/mtk_dp.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/mediatek/mtk_dp.c b/drivers/gpu/drm/mediatek/mtk_dp.c
index d8796a904eca..f0f6f402994a 100644
--- a/drivers/gpu/drm/mediatek/mtk_dp.c
+++ b/drivers/gpu/drm/mediatek/mtk_dp.c
@@ -311,7 +311,7 @@ static const struct mtk_dp_efuse_fmt mt8195_dp_efuse_fmt[MTK_DP_CAL_MAX] = {
 	},
 };
 
-static struct regmap_config mtk_dp_regmap_config = {
+static const struct regmap_config mtk_dp_regmap_config = {
 	.reg_bits = 32,
 	.val_bits = 32,
 	.reg_stride = 4,

-- 
2.43.0



From krzysztof.kozlowski at linaro.org  Sun Sep  8 07:21:35 2024
From: krzysztof.kozlowski at linaro.org (Krzysztof Kozlowski)
Date: Sun, 08 Sep 2024 16:21:35 +0200
Subject: [PATCH 5/5] drm/bridge: ti-dlpc3433: constify regmap_config
In-Reply-To: <20240908-regmap-config-const-v1-0-28f349004811@linaro.org>
References: <20240908-regmap-config-const-v1-0-28f349004811@linaro.org>
Message-ID: <20240908-regmap-config-const-v1-5-28f349004811@linaro.org>

Mark local static 'struct regmap_config' as const for safer and more
obvious code.

Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski at linaro.org>
---
 drivers/gpu/drm/bridge/ti-dlpc3433.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/bridge/ti-dlpc3433.c b/drivers/gpu/drm/bridge/ti-dlpc3433.c
index 6b559e071301..a0a1b5dd794e 100644
--- a/drivers/gpu/drm/bridge/ti-dlpc3433.c
+++ b/drivers/gpu/drm/bridge/ti-dlpc3433.c
@@ -94,7 +94,7 @@ static const struct regmap_access_table dlpc_volatile_table = {
 	.n_yes_ranges = ARRAY_SIZE(dlpc_volatile_ranges),
 };
 
-static struct regmap_config dlpc_regmap_config = {
+static const struct regmap_config dlpc_regmap_config = {
 	.reg_bits		= 8,
 	.val_bits		= 8,
 	.max_register		= WR_DSI_PORT_EN,

-- 
2.43.0



From Markus.Elfring at web.de  Sun Sep  8 07:36:07 2024
From: Markus.Elfring at web.de (Markus Elfring)
Date: Sun, 8 Sep 2024 16:36:07 +0200
Subject: [PATCH] ASoC: codecs: fix the right check and simplify code
In-Reply-To: <20240908134604.3652-1-tangbin@cmss.chinamobile.com>
References: <20240908134604.3652-1-tangbin@cmss.chinamobile.com>
Message-ID: <066bcaba-8f3c-4afc-82ab-2c81ca4ceb95@web.de>

> In the file drivers/base/platform.c, the return description of
> platform_get_irq is 'non-zero IRQ number on success, negative
> error number on failure.', so the check is wrong, fix it. And
> when get irq failed, the function platform_get_irq logs an error
> message.

1. You may occasionally put more than 64 characters into text lines
   of such a change description.

2. How do you think about to split any changes into separate update steps?
   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/process/submitting-patches.rst?h=v6.11-rc6#n81

3. I find the wording ?fix the right check? confusing.


Regards,
Markus


From arnd at kernel.org  Sun Sep  8 15:17:34 2024
From: arnd at kernel.org (Arnd Bergmann)
Date: Sun,  8 Sep 2024 22:17:34 +0000
Subject: [PATCH] ASoC: mediatek: mt8365: include linux/bitfield.h
Message-ID: <20240908221754.2210857-1-arnd@kernel.org>

From: Arnd Bergmann <arnd at arndb.de>

On x86, the header is not already included implicitly,
breaking compile-testing:

In file included from sound/soc/mediatek/mt8365/mt8365-afe-common.h:19,
                 from sound/soc/mediatek/mt8365/mt8365-afe-pcm.c:18:
sound/soc/mediatek/mt8365/mt8365-afe-pcm.c: In function 'mt8365_afe_cm2_mux_conn':
sound/soc/mediatek/mt8365/mt8365-reg.h:952:41: error: implicit declaration of function 'FIELD_PREP' [-Wimplicit-function-declaration]
  952 | #define CM2_AFE_CM2_CONN_CFG1(x)        FIELD_PREP(CM2_AFE_CM2_CONN_CFG1_MASK, (x))
      |                                         ^~~~~~~~~~

Included it ahead of the field definitions.

Fixes: 38c7c9ddc740 ("ASoC: mediatek: mt8365: Add common header")
Signed-off-by: Arnd Bergmann <arnd at arndb.de>
---

This started happening after I applied "ASoC: mt8365: Allow build coverage".
---
 sound/soc/mediatek/mt8365/mt8365-reg.h | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/sound/soc/mediatek/mt8365/mt8365-reg.h b/sound/soc/mediatek/mt8365/mt8365-reg.h
index b763cddc93db..4ebbb94ff02e 100644
--- a/sound/soc/mediatek/mt8365/mt8365-reg.h
+++ b/sound/soc/mediatek/mt8365/mt8365-reg.h
@@ -10,6 +10,8 @@
 #ifndef _MT8365_REG_H_
 #define _MT8365_REG_H_
 
+#include <linux/bitfield.h>
+
 #define AUDIO_TOP_CON0			(0x0000)
 #define AUDIO_TOP_CON1			(0x0004)
 #define AUDIO_TOP_CON2			(0x0008)
-- 
2.39.2



From cengjianeng at huaqin.corp-partner.google.com  Sun Sep  8 19:31:46 2024
From: cengjianeng at huaqin.corp-partner.google.com (Jianeng Ceng)
Date: Mon,  9 Sep 2024 10:31:46 +0800
Subject: [PATCH v5 0/2] arm64: dts: mediatek: Add MT8186 Ponyta
In-Reply-To: <CAJMQK-imYrDTuycVzQxkfbkZuHehE8uwc+qS2w=UDShETsBvEw@mail.gmail.com>
References: <CAJMQK-imYrDTuycVzQxkfbkZuHehE8uwc+qS2w=UDShETsBvEw@mail.gmail.com>
Message-ID: <20240909023148.1677936-1-cengjianeng@huaqin.corp-partner.google.com>

This is v5 of the MT8186 Chromebook device tree series.
---
Changes in v5:
- PATCH 1/2: Remove sku2147483647.
- PATCH 2/2: Remove sku2147483647.
- Link to v4:https://lore.kernel.org/all/20240906085739.1322676-1-cengjianeng at huaqin.corp-partner.google.com/

Changes in v4:
- PATCH 1/2: Add more info for Ponyta custom label in commit.
- Link to v3:https://lore.kernel.org/all/20240904081501.2060933-1-cengjianeng at huaqin.corp-partner.google.com/

Changes in v3:
- PATCH 0/2: Add the modify records.
- PATCH 1/2: Modify lable to label.
- Link to v2:https://lore.kernel.org/all/20240903061603.3007289-1-cengjianeng at huaqin.corp-partner.google.com/

Changes in v2:
- PATCH 2/2: Modify the dtb name without rev2.
- Link to v1:https://lore.kernel.org/all/20240902125502.1844374-1-cengjianeng at huaqin.corp-partner.google.com/

Jianeng Ceng (2):
  dt-bindings: arm: mediatek: Add MT8186 Ponyta Chromebook
  arm64: dts: mediatek: Add MT8186 Ponyta Chromebooks

 .../devicetree/bindings/arm/mediatek.yaml     | 10 +++++
 arch/arm64/boot/dts/mediatek/Makefile         |  2 +
 .../mediatek/mt8186-corsola-ponyta-sku0.dts   | 23 ++++++++++
 .../mediatek/mt8186-corsola-ponyta-sku1.dts   | 27 ++++++++++++
 .../dts/mediatek/mt8186-corsola-ponyta.dtsi   | 44 +++++++++++++++++++
 5 files changed, 106 insertions(+)
 create mode 100644 arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku0.dts
 create mode 100644 arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku1.dts
 create mode 100644 arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta.dtsi

-- 
2.34.1



From cengjianeng at huaqin.corp-partner.google.com  Sun Sep  8 19:31:47 2024
From: cengjianeng at huaqin.corp-partner.google.com (Jianeng Ceng)
Date: Mon,  9 Sep 2024 10:31:47 +0800
Subject: [PATCH v5 1/2] dt-bindings: arm: mediatek: Add MT8186 Ponyta Chromebook
In-Reply-To: <20240909023148.1677936-1-cengjianeng@huaqin.corp-partner.google.com>
References: <CAJMQK-imYrDTuycVzQxkfbkZuHehE8uwc+qS2w=UDShETsBvEw@mail.gmail.com>
 <20240909023148.1677936-1-cengjianeng@huaqin.corp-partner.google.com>
Message-ID: <20240909023148.1677936-2-cengjianeng@huaqin.corp-partner.google.com>

Ponyta is a custom label Chromebook based on MT8186. It is a
self-developed project of Huaqin and has no fixed OEM.

Signed-off-by: Jianeng Ceng <cengjianeng at huaqin.corp-partner.google.com>
---
Changes in v5:
- PATCH 1/2: Remove sku2147483647.
- Link to v4:https://lore.kernel.org/all/20240906085739.1322676-2-cengjianeng at huaqin.corp-partner.google.com/

Changes in v4:
- PATCH 1/2: Add more info for Ponyta custom label in commit.
- Link to v3:https://lore.kernel.org/all/20240904081501.2060933-1-cengjianeng at huaqin.corp-partner.google.com/

Changes in v3:
- PATCH 1/2: Modify lable to label.
- Link to v2:https://lore.kernel.org/all/20240903061603.3007289-1-cengjianeng at huaqin.corp-partner.google.com/

Chage since V2:
- No change.

---
 Documentation/devicetree/bindings/arm/mediatek.yaml | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/Documentation/devicetree/bindings/arm/mediatek.yaml b/Documentation/devicetree/bindings/arm/mediatek.yaml
index 1d4bb50fcd8d..43a824bee1b6 100644
--- a/Documentation/devicetree/bindings/arm/mediatek.yaml
+++ b/Documentation/devicetree/bindings/arm/mediatek.yaml
@@ -257,6 +257,16 @@ properties:
           - const: google,steelix-sku393218
           - const: google,steelix
           - const: mediatek,mt8186
+      - description: Google Ponyta (Custom label)
+        items:
+          - const: google,ponyta-sku0
+          - const: google,ponyta
+          - const: mediatek,mt8186
+      - description: Google Ponyta (Custom label)
+        items:
+          - const: google,ponyta-sku1
+          - const: google,ponyta
+          - const: mediatek,mt8186
       - description: Google Rusty (Lenovo 100e Chromebook Gen 4)
         items:
           - const: google,steelix-sku196609
-- 
2.34.1



From cengjianeng at huaqin.corp-partner.google.com  Sun Sep  8 19:31:48 2024
From: cengjianeng at huaqin.corp-partner.google.com (Jianeng Ceng)
Date: Mon,  9 Sep 2024 10:31:48 +0800
Subject: [PATCH v5 2/2] arm64: dts: mediatek: Add MT8186 Ponyta Chromebooks
In-Reply-To: <20240909023148.1677936-1-cengjianeng@huaqin.corp-partner.google.com>
References: <CAJMQK-imYrDTuycVzQxkfbkZuHehE8uwc+qS2w=UDShETsBvEw@mail.gmail.com>
 <20240909023148.1677936-1-cengjianeng@huaqin.corp-partner.google.com>
Message-ID: <20240909023148.1677936-3-cengjianeng@huaqin.corp-partner.google.com>

MT8186 ponyta, known as huaqin custom label, is a
MT8186 based laptop. It is based on the "corsola" design.
It includes LTE, touchpad combinations.

Signed-off-by: Jianeng Ceng <cengjianeng at huaqin.corp-partner.google.com>
---
Changes in v5:
- PATCH 2/2: Remove sku2147483647.
- Link to v4:https://lore.kernel.org/all/20240906085739.1322676-3-cengjianeng at huaqin.corp-partner.google.com/

Chage since v3:
- No change.

Changes in v2:
- PATCH 2/2: Modify the dtb name without rev2.
- Link to v1:https://lore.kernel.org/all/20240902125502.1844374-1-cengjianeng at huaqin.corp-partner.google.com/

---
 arch/arm64/boot/dts/mediatek/Makefile         |  2 +
 .../mediatek/mt8186-corsola-ponyta-sku0.dts   | 23 ++++++++++
 .../mediatek/mt8186-corsola-ponyta-sku1.dts   | 27 ++++++++++++
 .../dts/mediatek/mt8186-corsola-ponyta.dtsi   | 44 +++++++++++++++++++
 4 files changed, 96 insertions(+)
 create mode 100644 arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku0.dts
 create mode 100644 arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku1.dts
 create mode 100644 arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta.dtsi

diff --git a/arch/arm64/boot/dts/mediatek/Makefile b/arch/arm64/boot/dts/mediatek/Makefile
index 8fd7b2bb7a15..50b5cf04d3ae 100644
--- a/arch/arm64/boot/dts/mediatek/Makefile
+++ b/arch/arm64/boot/dts/mediatek/Makefile
@@ -58,6 +58,8 @@ dtb-$(CONFIG_ARCH_MEDIATEK) += mt8183-pumpkin.dtb
 dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-magneton-sku393216.dtb
 dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-magneton-sku393217.dtb
 dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-magneton-sku393218.dtb
+dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-ponyta-sku0.dtb
+dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-ponyta-sku1.dtb
 dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-rusty-sku196608.dtb
 dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-steelix-sku131072.dtb
 dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-steelix-sku131073.dtb
diff --git a/arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku0.dts b/arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku0.dts
new file mode 100644
index 000000000000..f6448e91436a
--- /dev/null
+++ b/arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku0.dts
@@ -0,0 +1,23 @@
+// SPDX-License-Identifier: (GPL-2.0 OR MIT)
+/*
+ * Copyright 2023 Google LLC
+ */
+
+/dts-v1/;
+#include "mt8186-corsola-ponyta.dtsi"
+
+/ {
+	model = "Google Ponyta sku0/unprovisioned board";
+	compatible = "google,ponyta-sku0", "google,ponyta", "mediatek,mt8186";
+};
+
+&i2c2 {
+	touchpad at 2c {
+		compatible = "hid-over-i2c";
+		reg = <0x2c>;
+		hid-descr-addr = <0x20>;
+		interrupts-extended = <&pio 11 IRQ_TYPE_LEVEL_LOW>;
+		vcc-supply = <&pp3300_s3>;
+		wakeup-source;
+	};
+};
diff --git a/arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku1.dts b/arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku1.dts
new file mode 100644
index 000000000000..203ee109bbf7
--- /dev/null
+++ b/arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku1.dts
@@ -0,0 +1,27 @@
+// SPDX-License-Identifier: (GPL-2.0 OR MIT)
+/*
+ * Copyright 2023 Google LLC
+ */
+
+/dts-v1/;
+#include "mt8186-corsola-ponyta.dtsi"
+
+/ {
+	model = "Google Ponyta sku1 board";
+	compatible = "google,ponyta-sku1", "google,ponyta", "mediatek,mt8186";
+};
+
+&i2c2 {
+	touchpad at 15 {
+		compatible = "elan,ekth3000";
+		reg = <0x15>;
+		interrupt-parent = <&pio>;
+		interrupts = <11 IRQ_TYPE_LEVEL_LOW>;
+		vcc-supply = <&pp3300_s3>;
+		wakeup-source;
+	};
+};
+
+&usb_c1 {
+	status = "disabled";
+};
diff --git a/arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta.dtsi b/arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta.dtsi
new file mode 100644
index 000000000000..59594022331e
--- /dev/null
+++ b/arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta.dtsi
@@ -0,0 +1,44 @@
+// SPDX-License-Identifier: (GPL-2.0 OR MIT)
+/*
+ * Copyright 2023 Google LLC
+ */
+
+/dts-v1/;
+#include "mt8186-corsola-steelix.dtsi"
+
+&keyboard_controller {
+	function-row-physmap = <
+		MATRIX_KEY(0x00, 0x02, 0)	/* T1 */
+		MATRIX_KEY(0x03, 0x02, 0)	/* T2 */
+		MATRIX_KEY(0x02, 0x02, 0)	/* T3 */
+		MATRIX_KEY(0x01, 0x02, 0)	/* T4 */
+		MATRIX_KEY(0x03, 0x04, 0)	/* T5 */
+		MATRIX_KEY(0x02, 0x04, 0)	/* T6 */
+		MATRIX_KEY(0x01, 0x04, 0)	/* T7 */
+		MATRIX_KEY(0x00, 0x04, 0)	/* T8 */
+		MATRIX_KEY(0x00, 0x01, 0)	/* T9 */
+		MATRIX_KEY(0x02, 0x09, 0)	/* T10 */
+		MATRIX_KEY(0x01, 0x09, 0)	/* T11 */
+		MATRIX_KEY(0x01, 0x05, 0)	/* T12 */
+	>;
+
+	linux,keymap = <
+		CROS_STD_MAIN_KEYMAP
+		MATRIX_KEY(0x00, 0x02, KEY_BACK)
+		MATRIX_KEY(0x03, 0x02, KEY_REFRESH)
+		MATRIX_KEY(0x02, 0x02, KEY_ZOOM)
+		MATRIX_KEY(0x01, 0x02, KEY_SCALE)
+		MATRIX_KEY(0x03, 0x04, KEY_SYSRQ)
+		MATRIX_KEY(0x02, 0x04, KEY_BRIGHTNESSDOWN)
+		MATRIX_KEY(0x01, 0x04, KEY_BRIGHTNESSUP)
+		MATRIX_KEY(0x00, 0x04, KEY_PLAYPAUSE)
+		MATRIX_KEY(0x00, 0x01, KEY_MICMUTE)
+		MATRIX_KEY(0x02, 0x09, KEY_MUTE)
+		MATRIX_KEY(0x01, 0x09, KEY_VOLUMEDOWN)
+		MATRIX_KEY(0x01, 0x05, KEY_VOLUMEUP)
+	>;
+};
+
+&mt6366codec {
+	mediatek,dmic-mode = <1>; /* one-wire */
+};
-- 
2.34.1



From wenst at chromium.org  Sun Sep  8 19:39:42 2024
From: wenst at chromium.org (Chen-Yu Tsai)
Date: Mon, 9 Sep 2024 10:39:42 +0800
Subject: [PATCH v6 05/12] regulator: Do pure DT regulator lookup in of_regulator_bulk_get_all()
In-Reply-To: <Zthc8r62z2eaR8k0@smile.fi.intel.com>
References: <20240904090016.2841572-1-wenst@chromium.org> <20240904090016.2841572-6-wenst@chromium.org>
 <Zthc8r62z2eaR8k0@smile.fi.intel.com>
Message-ID: <CAGXv+5FCctBG5uOSvH_-0z2Jgi36zRs-Cg0_P+q8aikxLcwmbw@mail.gmail.com>

On Wed, Sep 4, 2024 at 9:13?PM Andy Shevchenko
<andriy.shevchenko at linux.intel.com> wrote:
>
> On Wed, Sep 04, 2024 at 05:00:07PM +0800, Chen-Yu Tsai wrote:
> > The to-be-introduced I2C component prober needs to enable regulator
> > supplies (and toggle GPIO pins) for the various components it intends
> > to probe. To support this, a new "pure DT lookup" method for getting
> > regulator supplies is needed, since the device normally requesting
> > the supply won't get created until after the component is probed to
> > be available.
> >
> > Convert the existing of_regulator_bulk_get_all() for this purpose.
> > This function has no in-tree users, as the original patch [1] that
> > used it was never landed. This patch changes the function ABI, but
> > it is straightforward to convert users.
> >
> > The underlying code that supports the existing regulator_get*()
> > functions has been reworked in previous patches to support this
> > specific case. An internal OF-specific version of regulator_get(),
> > of_regulator_get_optional(), is added for this.
> >
> > Also convert an existing usage of "dev && dev->of_node" to
> > "dev_of_node(dev)".
>
> > [1] https://lore.kernel.org/all/20231220203537.83479-2-jernej.skrabec at gmail.com/
> >
> > Signed-off-by: Chen-Yu Tsai <wenst at chromium.org>
>
> Make it Link tag.
>
>   Link: https://lore.kernel.org/all/20231220203537.83479-2-jernej.skrabec at gmail.com/ [1]
>   Signed-off-by: Chen-Yu Tsai <wenst at chromium.org>

Ack.


From wenst at chromium.org  Sun Sep  8 19:45:29 2024
From: wenst at chromium.org (Chen-Yu Tsai)
Date: Mon, 9 Sep 2024 10:45:29 +0800
Subject: [PATCH v6 06/12] gpiolib: Add gpio_get_property_name_length()
In-Reply-To: <ZthjSK9N9z11YXi2@smile.fi.intel.com>
References: <20240904090016.2841572-1-wenst@chromium.org> <20240904090016.2841572-7-wenst@chromium.org>
 <ZthjSK9N9z11YXi2@smile.fi.intel.com>
Message-ID: <CAGXv+5GrW0EZZw6HVY7ALvm0dBj5Wwrvp02vtTPZYwqxxiZQyg@mail.gmail.com>

On Wed, Sep 4, 2024 at 9:40?PM Andy Shevchenko
<andriy.shevchenko at linux.intel.com> wrote:
>
> On Wed, Sep 04, 2024 at 05:00:08PM +0800, Chen-Yu Tsai wrote:
> > The I2C device tree component prober needs to get and toggle GPIO lines
> > for the components it intends to probe. These components may not use the
> > same name for their GPIO lines, so the prober must go through the device
> > tree, check each property to see it is a GPIO property, and get the GPIO
> > line.
> >
> > Instead of duplicating the GPIO suffixes, or exporting them to the
> > prober to do pattern matching, simply add and export a new function that
> > does the pattern matching and returns the length of the GPIO name. The
> > caller can then use that to copy out the name if it needs to.
>
> > Andy suggested a much shorter implementation.
>
> No need to have this sentence in the commit message, changelog area is fine.
> But if you wish... :-)

It does seem out of place without any context. I'll move it to the
changelog area. :D

> > Suggested-by: Andy Shevchenko <andriy.shevchenko at linux.intel.com>
> > Signed-off-by: Chen-Yu Tsai <wenst at chromium.org>
>
> ...
>
> > +/**
> > + * gpio_get_property_name_length - Returns the GPIO name length from a property name
> > + * @propname:        name of the property to check
> > + *
> > + * This function checks if the given property name matches the GPIO property
> > + * patterns, and returns the length of the name of the GPIO. The pattern is
> > + * "*-<GPIO suffix>" or just "<GPIO suffix>".
> > + *
> > + * Returns:
> > + * The length of the string before '-<GPIO suffix>' if it matches
> > + * "*-<GPIO suffix>", or 0 if no name part, just the suffix, or
> > + * -EINVAL if the string doesn't match the pattern.
>
> Should be %-EINVAL as we agreed with Bart when I updated GPIOLIB kernel-doc.

Ack.

In the regulator cleanups I did, I used -%EINVAL instead. But then I
realized that constants aren't really cross-referenced. I probably
have to go through all of them to fix those up.


ChenYu


From wenst at chromium.org  Sun Sep  8 20:02:06 2024
From: wenst at chromium.org (Chen-Yu Tsai)
Date: Mon, 9 Sep 2024 11:02:06 +0800
Subject: [PATCH v6 08/12] i2c: Introduce OF component probe function
In-Reply-To: <Zthk25W0zXcHWRdt@smile.fi.intel.com>
References: <20240904090016.2841572-1-wenst@chromium.org> <20240904090016.2841572-9-wenst@chromium.org>
 <Zthk25W0zXcHWRdt@smile.fi.intel.com>
Message-ID: <CAGXv+5FyEJBO8=eb3i7hdytfS-iuAx=o=2SL46GDPVkfiz-Dyg@mail.gmail.com>

On Wed, Sep 4, 2024 at 9:47?PM Andy Shevchenko
<andriy.shevchenko at linux.intel.com> wrote:
>
> On Wed, Sep 04, 2024 at 05:00:10PM +0800, Chen-Yu Tsai wrote:
> > Some devices are designed and manufactured with some components having
> > multiple drop-in replacement options. These components are often
> > connected to the mainboard via ribbon cables, having the same signals
> > and pin assignments across all options. These may include the display
> > panel and touchscreen on laptops and tablets, and the trackpad on
> > laptops. Sometimes which component option is used in a particular device
> > can be detected by some firmware provided identifier, other times that
> > information is not available, and the kernel has to try to probe each
> > device.
> >
> > This change attempts to make the "probe each device" case cleaner. The
> > current approach is to have all options added and enabled in the device
> > tree. The kernel would then bind each device and run each driver's probe
> > function. This works, but has been broken before due to the introduction
> > of asynchronous probing, causing multiple instances requesting "shared"
> > resources, such as pinmuxes, GPIO pins, interrupt lines, at the same
> > time, with only one instance succeeding. Work arounds for these include
> > moving the pinmux to the parent I2C controller, using GPIO hogs or
> > pinmux settings to keep the GPIO pins in some fixed configuration, and
> > requesting the interrupt line very late. Such configurations can be seen
> > on the MT8183 Krane Chromebook tablets, and the Qualcomm sc8280xp-based
> > Lenovo Thinkpad 13S.
> >
> > Instead of this delicate dance between drivers and device tree quirks,
> > this change introduces a simple I2C component probe. function For a
> > given class of devices on the same I2C bus, it will go through all of
> > them, doing a simple I2C read transfer and see which one of them responds.
> > It will then enable the device that responds.
> >
> > This requires some minor modifications in the existing device tree. The
> > status for all the device nodes for the component options must be set
> > to "failed-needs-probe". This makes it clear that some mechanism is
> > needed to enable one of them, and also prevents the prober and device
> > drivers running at the same time.
>
> ...
>
> > +int i2c_of_probe_component(struct device *dev, const char *type)
> > +{
> > +     struct i2c_adapter *i2c;
> > +     int ret;
> > +
> > +     struct device_node *i2c_node __free(device_node) = i2c_of_probe_get_i2c_node(dev, type);
> > +     if (IS_ERR(i2c_node))
> > +             return PTR_ERR(i2c_node);
>
> > +     for_each_child_of_node_scoped(i2c_node, node) {
>
> Hmm, but can it be for_each_child_of_node_with_prefix_scoped() now?

Looks like at least one of the fixups got squashed into the wrong patch.
I fixed both of them to use for_each_child_of_node_with_prefix().

That isn't compatible with Rob's comment though, and I'm not sure we
want a for_each_available_child_of_node_with_prefix() helper just for
one instance?

> > +             if (!of_node_name_prefix(node, type))
> > +                     continue;
> > +             if (!of_device_is_available(node))
> > +                     continue;
> > +
> > +             /*
> > +              * Device tree has component already enabled. Either the
> > +              * device tree isn't supported or we already probed once.
> > +              */
> > +             return 0;
> > +     }
> > +
> > +     i2c = of_get_i2c_adapter_by_node(i2c_node);
> > +     if (!i2c)
> > +             return dev_err_probe(dev, -EPROBE_DEFER, "Couldn't get I2C adapter\n");
> > +
> > +     ret = 0;
> > +     for_each_child_of_node_scoped(i2c_node, node) {
>
> Ditto.
>
> > +             union i2c_smbus_data data;
> > +             u32 addr;
> > +
> > +             if (!of_node_name_prefix(node, type))
> > +                     continue;
> > +             if (of_property_read_u32(node, "reg", &addr))
> > +                     continue;
> > +             if (i2c_smbus_xfer(i2c, addr, 0, I2C_SMBUS_READ, 0, I2C_SMBUS_BYTE, &data) < 0)
> > +                     continue;
> > +
> > +             /* Found a device that is responding */
> > +             ret = i2c_of_probe_enable_node(dev, node);
> > +             break;
> > +     }
> > +
> > +     i2c_put_adapter(i2c);
> > +
> > +     return ret;
> > +}
>
> ...
>
> > +EXPORT_SYMBOL_GPL(i2c_of_probe_component);
>
> Wonder if we may already use namespaced export from day 1.

I think that would be a good idea, especially given Doug's request for
exposing more helpers.

Thanks
ChenYu


From wenst at chromium.org  Sun Sep  8 20:24:17 2024
From: wenst at chromium.org (Chen-Yu Tsai)
Date: Mon, 9 Sep 2024 11:24:17 +0800
Subject: [PATCH v6 00/12] platform/chrome: Introduce DT hardware prober
In-Reply-To: <ZtyGJhm-0GEEFfYf@shikoro>
References: <20240904090016.2841572-1-wenst@chromium.org> <ZtyGJhm-0GEEFfYf@shikoro>
Message-ID: <CAGXv+5F8rTLdYGjkxyJqUxs=W_L9gGgpHRZZ250swbvDR=zJMQ@mail.gmail.com>

On Sun, Sep 8, 2024 at 12:58?AM Wolfram Sang
<wsa+renesas at sang-engineering.com> wrote:
>
> Hi,
>
> this series gets quite some review from people I trust. This is awesome.
> So, I will keep to some high level questions:
>
> > undiscoverable devices" [2] series, but follows the scheme suggested by
> > Rob, marking all second source component device nodes as "fail-needs-probe",
> > and having a hardware prober driver enable the one of them.
>
> Where is this "fail-needs-probe" documented? I neither see it here nor
> in the dt-schema repo.

You are correct that it has not been documented yet. I will send a patch
to the dt-schema repo.

> > The other case, selecting a display panel to use based on the SKU ID
> > from the firmware, hit a bit of an issue with fixing the OF graph.
> > It has been left out since v3.
>
> Does it make sense then to add touchscreens only? Will the panels be
> worked on once this is upstream? Or what is the way forward?

The devices this patch series targets all use eDP panels, which are
more or less directly probe-able.

The panels mentioned for the second phase are MIPI panels, which require
specific power and command sequences and thus are not probe-able. This
will be worked on once this part is done. For the panels it is entirely
handled in the chrome platform device tree prober. See the following
patch for an earlier version of it:

    https://lore.kernel.org/all/20231109100606.1245545-6-wenst at chromium.org/

> > Wolfram, would you be able to handle the late PR? Assuming you get a
> > chance to look at the patches that is.
>
> Yes, I can do this, but...
>
> >  drivers/i2c/Makefile                          |   7 +-
> >  drivers/i2c/i2c-core-of-prober.c              | 437 ++++++++++++++++++
>
> ... this is quite some code. Would you be willing to maintain it (i.e.
> please add a MAINTAINERS entry then). Kudos for not touching other parts
> of the I2C core!

Sure!

> All the best,
>
>    Wolfram

Thanks. There are still some comments to address, in particular making
the prober more of a pluggable framework and exposing more code as
helpers.


ChenYu


From peter.wang at mediatek.com  Sun Sep  8 20:38:22 2024
From: peter.wang at mediatek.com (=?utf-8?B?UGV0ZXIgV2FuZyAo546L5L+h5Y+LKQ==?=)
Date: Mon, 9 Sep 2024 03:38:22 +0000
Subject: [PATCH v2 1/2] ufs: core: fix the issue of ICU failure
In-Reply-To: <f5274603-3687-4386-b785-129183d84f4c@acm.org>
References: <20240902021805.1125-1-peter.wang@mediatek.com>
	 <20240902021805.1125-2-peter.wang@mediatek.com>
	 <f5274603-3687-4386-b785-129183d84f4c@acm.org>
Message-ID: <6fcf127810308a6a696d54312f35310a3a125eb9.camel@mediatek.com>

On Thu, 2024-09-05 at 14:06 -0700, Bart Van Assche wrote:
>  	 
> External email : Please do not click links or open attachments until
> you have verified the sender or the content.
>  On 9/1/24 7:18 PM, peter.wang at mediatek.com wrote:
> >   /* SQRTCy.ICU = 1 */
> 
> Feel free to leave out the above comment since it duplicates the code
> below this comment. A comment that explains that "ICU = Initiate
> Cleanup" probably would be appropriate.
> 

Hi Bart,

Will change comment to  "/* Initiate Cleanup */"


> > -writel(SQ_ICU, opr_sqd_base + REG_SQRTC);
> > +writel(readl(opr_sqd_base + REG_SQRTC) | SQ_ICU,
> > +opr_sqd_base + REG_SQRTC);
> 
> Is this perhaps an open-coded version of ufshcd_rmwl()?
> 
> 

ufshcd_rmwl usage includes mmio_base, and it's not suitable for use
here.

> >   
> >   /* Poll SQRTSy.CUS = 1. Return result from SQRTSy.RTC */
> >   reg = opr_sqd_base + REG_SQRTS;
> >   err = read_poll_timeout(readl, val, val & SQ_CUS, 20,
> >   MCQ_POLL_US, false, reg);
> > -if (err)
> > -dev_err(hba->dev, "%s: failed. hwq=%d, tag=%d err=%ld\n",
> > -__func__, id, task_tag,
> > +if (err || FIELD_GET(SQ_ICU_ERR_CODE_MASK, readl(reg)))
> > +dev_err(hba->dev, "%s: failed. hwq=%d, tag=%d err=%d RTC=%ld\n",
> > +__func__, id, task_tag, err,
> >   FIELD_GET(SQ_ICU_ERR_CODE_MASK, readl(reg)));
> 
> In the above code the expression "FIELD_GET(SQ_ICU_ERR_CODE_MASK, 
> readl(reg))" occurs twice. Please consider storing that expression in
> a variable such that this expression only occurs once.
> 

Will use a variable.

Thanks.
Peter


> Thanks,
> 
> Bart.
> 

From peter.wang at mediatek.com  Sun Sep  8 20:40:47 2024
From: peter.wang at mediatek.com (=?utf-8?B?UGV0ZXIgV2FuZyAo546L5L+h5Y+LKQ==?=)
Date: Mon, 9 Sep 2024 03:40:47 +0000
Subject: [PATCH v2 2/2] ufs: core: requeue MCQ abort request
In-Reply-To: <b31bf24f-588e-43e5-b71f-b4e9edd1b60a@acm.org>
References: <20240902021805.1125-1-peter.wang@mediatek.com>
	 <20240902021805.1125-3-peter.wang@mediatek.com>
	 <b31bf24f-588e-43e5-b71f-b4e9edd1b60a@acm.org>
Message-ID: <e31f180a8e78efbbab1a9a4cb5c83478f2bf4516.camel@mediatek.com>

On Thu, 2024-09-05 at 14:16 -0700, Bart Van Assche wrote:
>  	 
> External email : Please do not click links or open attachments until
> you have verified the sender or the content.
>  On 9/1/24 7:18 PM, peter.wang at mediatek.com wrote:
> > diff --git a/drivers/ufs/core/ufs-mcq.c b/drivers/ufs/core/ufs-
> mcq.c
> > index afd9541f4bd8..abdc55a8b960 100644
> > --- a/drivers/ufs/core/ufs-mcq.c
> > +++ b/drivers/ufs/core/ufs-mcq.c
> > @@ -642,6 +642,7 @@ static bool ufshcd_mcq_sqe_search(struct
> ufs_hba *hba,
> >   match = le64_to_cpu(utrd->command_desc_base_addr) & CQE_UCD_BA;
> >   if (addr == match) {
> >   ufshcd_mcq_nullify_sqe(utrd);
> > +lrbp->host_initiate_abort = true;
> >   ret = true;
> >   goto out;
> >   }
> 
> I think this is wrong. The above code is only executed if the SCSI
> core
> decides to abort a SCSI command. It is up to the SCSI core to decide
> whether or not to retry an aborted command.
> 

Hi Bart,

This is eh_abort_handler call flow for scsi err handler.
If abort is trigger because error, should't we do retry?
Anyway, I think this case could not happen because if scsi
timeout happen (30s), host hw should not keep cmd in SQ such 
a long time. But once it happen, ufshcd_mcq_sqe_search return 
true and scsi got eh_abort_handler fail. So, I think in this 
case, notify scsi retry this command is properly.


> > -/* Release cmd in MCQ mode if abort succeeds */
> > -if (hba->mcq_enabled && (*ret == 0)) {
> > -hwq = ufshcd_mcq_req_to_hwq(hba, scsi_cmd_to_rq(lrbp->cmd));
> > -if (!hwq)
> > -return 0;
> > -spin_lock_irqsave(&hwq->cq_lock, flags);
> > -if (ufshcd_cmd_inflight(lrbp->cmd))
> > -ufshcd_release_scsi_cmd(hba, lrbp);
> > -spin_unlock_irqrestore(&hwq->cq_lock, flags);
> > -}
> > +/* Host will post to CQ with OCS_ABORTED after SQ cleanup */
> > +if (hba->mcq_enabled && (*ret == 0))
> > +lrbp->host_initiate_abort = true;
> 
> I think this code is racy because the UFS host controller may have 
> posted a completion before the "lrbp->host_initiate_abort = true"
> assignment is executed.
> 

Yes, I should add this code before ufshcd_clear_cmd, thanks.

> > + * @host_initiate_abort: Abort flag initiated by host
> 
> What is "Abort flag"? Please consider renaming "host_initiate_abort"
> into "abort_initiated_by_err_handler" since I think that aborted
> commands should only be retried if these have been aborted by
> ufshcd_err_handler().
> 

Okay, but abort_initiated_by_err maybe better because aborted by
ufshcd_err_handler or scsi err handler could happen. 
What do you think?


> Thanks,
> 
> Bart.

From peter.wang at mediatek.com  Sun Sep  8 20:41:37 2024
From: peter.wang at mediatek.com (=?utf-8?B?UGV0ZXIgV2FuZyAo546L5L+h5Y+LKQ==?=)
Date: Mon, 9 Sep 2024 03:41:37 +0000
Subject: [PATCH v2 1/2] ufs: core: fix the issue of ICU failure
In-Reply-To: <4d28f099-137f-b9b8-463f-40ec2a745694@quicinc.com>
References: <20240902021805.1125-1-peter.wang@mediatek.com>
	 <20240902021805.1125-2-peter.wang@mediatek.com>
	 <4d28f099-137f-b9b8-463f-40ec2a745694@quicinc.com>
Message-ID: <ffbd0593f8f736a2631b7711c7a1287189806006.camel@mediatek.com>

On Fri, 2024-09-06 at 13:39 -0700, Bao D. Nguyen wrote:
>  	 
> External email : Please do not click links or open attachments until
> you have verified the sender or the content.
>  On 9/1/2024 7:18 PM, peter.wang at mediatek.com wrote:
> 
> >   /* SQRTCy.ICU = 1 */
> > -writel(SQ_ICU, opr_sqd_base + REG_SQRTC);
> > +writel(readl(opr_sqd_base + REG_SQRTC) | SQ_ICU,
> > +opr_sqd_base + REG_SQRTC);
> Hi Peter,
> Instead of readl() here, how about write (SQ_STOP | SQ_ICU) to SQRTC?
> 
> Thanks, Bao

Hi Bao,

My opinion is not to do it this way, because we don't know if 
the future specification of REG_SQRTC will add extra bits. 
Once added, such an approach would again become a bug in ufs driver.

Thanks
Peter

From dse at thaumatec.com  Sun Sep  8 22:29:50 2024
From: dse at thaumatec.com (Daniel Semkowicz)
Date: Mon, 9 Sep 2024 07:29:50 +0200
Subject: [PATCH 09/20] drm/bridge: tc358775: remove complex vsdelay calculation
In-Reply-To: <D3Z9XTBHSUEN.2GW0UCIPLR6HY@kernel.org>
References: <20240506-tc358775-fix-powerup-v1-0-545dcf00b8dd@kernel.org>
 <20240506-tc358775-fix-powerup-v1-9-545dcf00b8dd@kernel.org>
 <CAHgnY3=KCD4gyJ4nL6nN1tvWcsiRQL+Oz11RNOniDdyMoEPcSg@mail.gmail.com> <D3Z9XTBHSUEN.2GW0UCIPLR6HY@kernel.org>
Message-ID: <CAHgnY3=bRyAoDDm8dCuT0z7MaF_LzCa-MDYRqQgKVqgVhFcJjw@mail.gmail.com>

On Fri, Sep 6, 2024 at 4:34?PM Michael Walle <mwalle at kernel.org> wrote:
>
> Hi Daniel,
>
> > > To cite the datasheet on VSDELAY:
> > >   During DSI link speed is slower than that of LVDS link?s, data needs
> > >   to be buffer within 775XBG before outputting to prevent data from
> > >   underflow. Register field VPCTRL[VSDELAY] is used to for this purpose
> > >
> > > This driver assumes that the DSI link speed is the pixel clock (as does
> > > every DSI bridge driver), after all the LVDS clock is derived from the
> > > DSI clock. Thus we know for a fact, that the DSI link is not slower than
> > > the LVDS side. Just use the (sane) default value of the bridge and drop
> > > the complicated calculation here.
> >
> > I am not convinced this is a good idea to revert to a default
> > VSdelay value. I tested your patch series with RK3399 platform
> > and default value (5) was not enough there. There was small data
> > underflow visible, resulting in display offset. Removing this patch
> > and using the original calculation formula fixed the problem.
> > The calculated VSDELAY value seems to be a lot bigger than required,
> > but keeps us on the safe side.
>
> Did you use just parts of this series or did you port the "lp11
> notify" mechanism to the rk3399 platform? Please keep in mind, that
> this bridge doesn't really work if the reset isn't deasserted during
> lp-11 mode and lots of odd things happen.

I pulled in your complete series and ported "lp11 notify" to RK3399.
Both reset and standby pins are connected to the bridge on my board.

>
> Also, do you know if you have an EEPROM attached to the bridge or
> does any firmware part initialize that bridge?

The initialization is done only by Linux kernel driver with your patches.

>
> > It looks that hback-porch value for panel is used also on DSI link,
> > effectively delaying hactive data delivered to TC358775 bridge.
> > I suspect this causes the requirement for higher VSDELAY.
>
> It was ages ago since I've worked on this bridge and extensively
> tested and even measured and decoded the DSI link and the LVDS
> stream. But IIRC this delay was only to compensate the difference
> between the DSI clock and the LVDS clock, that is, if you push the
> pixel stream slower into the bridge than the bridge is pushing it
> out to the LVDS panel.
>
> So the back porch should be irrelevant here (?!).

That was also my initial understanding, but for some reason original algorithm
for VSDELAY in tc358775 driver, takes blanking period into calculation.
It does not base only on DSI and LVDS clocks.
Additionally, my experiments show that the default value is too low
in my configuration.

>
> -michael

Kind regards
Daniel


From krzk at kernel.org  Sun Sep  8 23:25:56 2024
From: krzk at kernel.org (Krzysztof Kozlowski)
Date: Mon, 9 Sep 2024 08:25:56 +0200
Subject: [PATCH v5 1/2] dt-bindings: arm: mediatek: Add MT8186 Ponyta
 Chromebook
In-Reply-To: <20240909023148.1677936-2-cengjianeng@huaqin.corp-partner.google.com>
References: <CAJMQK-imYrDTuycVzQxkfbkZuHehE8uwc+qS2w=UDShETsBvEw@mail.gmail.com>
 <20240909023148.1677936-1-cengjianeng@huaqin.corp-partner.google.com>
 <20240909023148.1677936-2-cengjianeng@huaqin.corp-partner.google.com>
Message-ID: <lp7rhdmz5khuu7cpw7cg2oilkgfcip3fu2gr4r2f6vkk3cbg3e@iyqhqhn26pw4>

On Mon, Sep 09, 2024 at 10:31:47AM +0800, Jianeng Ceng wrote:
> Ponyta is a custom label Chromebook based on MT8186. It is a
> self-developed project of Huaqin and has no fixed OEM.
> 
> Signed-off-by: Jianeng Ceng <cengjianeng at huaqin.corp-partner.google.com>
> ---

Do not attach (thread) your patchsets to some other threads (unrelated
or older versions). This buries them deep in the mailbox and might
interfere with applying entire sets.


Acked-by: Krzysztof Kozlowski <krzysztof.kozlowski at linaro.org>

Best regards,
Krzysztof



From matthias.bgg at kernel.org  Sun Sep  8 23:59:19 2024
From: matthias.bgg at kernel.org (Matthias Brugger)
Date: Mon, 9 Sep 2024 08:59:19 +0200
Subject: [PATCH] ASoC: mediatek: mt8365: include linux/bitfield.h
In-Reply-To: <20240908221754.2210857-1-arnd@kernel.org>
References: <20240908221754.2210857-1-arnd@kernel.org>
Message-ID: <e419964e-0da6-4257-bc0b-40db42399465@kernel.org>



On 09/09/2024 00:17, Arnd Bergmann wrote:
> From: Arnd Bergmann <arnd at arndb.de>
> 
> On x86, the header is not already included implicitly,
> breaking compile-testing:
> 
> In file included from sound/soc/mediatek/mt8365/mt8365-afe-common.h:19,
>                   from sound/soc/mediatek/mt8365/mt8365-afe-pcm.c:18:
> sound/soc/mediatek/mt8365/mt8365-afe-pcm.c: In function 'mt8365_afe_cm2_mux_conn':
> sound/soc/mediatek/mt8365/mt8365-reg.h:952:41: error: implicit declaration of function 'FIELD_PREP' [-Wimplicit-function-declaration]
>    952 | #define CM2_AFE_CM2_CONN_CFG1(x)        FIELD_PREP(CM2_AFE_CM2_CONN_CFG1_MASK, (x))
>        |                                         ^~~~~~~~~~
> 
> Included it ahead of the field definitions.
> 
> Fixes: 38c7c9ddc740 ("ASoC: mediatek: mt8365: Add common header")
> Signed-off-by: Arnd Bergmann <arnd at arndb.de>

Reviewed-by: Matthias Brugger <matthias.bgg at gmail.com>

> ---
> 
> This started happening after I applied "ASoC: mt8365: Allow build coverage".
> ---
>   sound/soc/mediatek/mt8365/mt8365-reg.h | 2 ++
>   1 file changed, 2 insertions(+)
> 
> diff --git a/sound/soc/mediatek/mt8365/mt8365-reg.h b/sound/soc/mediatek/mt8365/mt8365-reg.h
> index b763cddc93db..4ebbb94ff02e 100644
> --- a/sound/soc/mediatek/mt8365/mt8365-reg.h
> +++ b/sound/soc/mediatek/mt8365/mt8365-reg.h
> @@ -10,6 +10,8 @@
>   #ifndef _MT8365_REG_H_
>   #define _MT8365_REG_H_
>   
> +#include <linux/bitfield.h>
> +
>   #define AUDIO_TOP_CON0			(0x0000)
>   #define AUDIO_TOP_CON1			(0x0004)
>   #define AUDIO_TOP_CON2			(0x0008)


From yuanhsinte at chromium.org  Mon Sep  9 00:29:02 2024
From: yuanhsinte at chromium.org (Hsin-Te Yuan)
Date: Mon, 09 Sep 2024 07:29:02 +0000
Subject: [PATCH 0/4] arm64: dts: mt8183: Add i2c-scl-internal-delay-ns
Message-ID: <20240909-i2c-delay-v1-0-4b406617a5f5@chromium.org>

Add i2c-scl-internal-delay-ns for each device.

Signed-off-by: Hsin-Te Yuan <yuanhsinte at chromium.org>
---
Daolong Zhu (4):
      arm64: dts: mt8183: fennel: add i2c2's i2c-scl-internal-delay-ns
      arm64: dts: mt8183: burnet: add i2c2's i2c-scl-internal-delay-ns
      arm64: dts: mt8183: cozmo: add i2c2's i2c-scl-internal-delay-ns
      arm64: dts: mt8183: Damu: add i2c2's i2c-scl-internal-delay-ns

 arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-burnet.dts  | 3 +++
 arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-cozmo.dts   | 2 ++
 arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-damu.dts    | 3 +++
 arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-fennel.dtsi | 3 +++
 4 files changed, 11 insertions(+)
---
base-commit: ee9a43b7cfe2d8a3520335fea7d8ce71b8cabd9d
change-id: 20240909-i2c-delay-6d202918ee0f

Best regards,
-- 
Hsin-Te Yuan <yuanhsinte at chromium.org>



From yuanhsinte at chromium.org  Mon Sep  9 00:29:04 2024
From: yuanhsinte at chromium.org (Hsin-Te Yuan)
Date: Mon, 09 Sep 2024 07:29:04 +0000
Subject: [PATCH 2/4] arm64: dts: mt8183: burnet: add i2c2's
 i2c-scl-internal-delay-ns
In-Reply-To: <20240909-i2c-delay-v1-0-4b406617a5f5@chromium.org>
References: <20240909-i2c-delay-v1-0-4b406617a5f5@chromium.org>
Message-ID: <20240909-i2c-delay-v1-2-4b406617a5f5@chromium.org>

From: Daolong Zhu <jg_daolongzhu at mediatek.corp-partner.google.com>

Add i2c2's i2c-scl-internal-delay-ns.

Fixes: dd6e3b06214f ("arm64: dts: mt8183: Add kukui-jacuzzi-burnet board")
Signed-off-by: Hsin-Te Yuan <yuanhsinte at chromium.org>
---
 arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-burnet.dts | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-burnet.dts b/arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-burnet.dts
index 19c1e2bee494c98c0db87308494713a26e304cd2..20b71f2e7159ade7e7d2135aabe6587c8f8d64de 100644
--- a/arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-burnet.dts
+++ b/arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-burnet.dts
@@ -30,3 +30,6 @@ touchscreen at 2c {
 	};
 };
 
+&i2c2 {
+	i2c-scl-internal-delay-ns = <4100>;
+};

-- 
2.46.0.469.g59c65b2a67-goog



From yuanhsinte at chromium.org  Mon Sep  9 00:29:03 2024
From: yuanhsinte at chromium.org (Hsin-Te Yuan)
Date: Mon, 09 Sep 2024 07:29:03 +0000
Subject: [PATCH 1/4] arm64: dts: mt8183: fennel: add i2c2's
 i2c-scl-internal-delay-ns
In-Reply-To: <20240909-i2c-delay-v1-0-4b406617a5f5@chromium.org>
References: <20240909-i2c-delay-v1-0-4b406617a5f5@chromium.org>
Message-ID: <20240909-i2c-delay-v1-1-4b406617a5f5@chromium.org>

From: Daolong Zhu <jg_daolongzhu at mediatek.corp-partner.google.com>

Add i2c2's i2c-scl-internal-delay-ns.

Fixes: 6cd7fdc8c530 ("arm64: dts: mt8183: Add kukui-jacuzzi-fennel board")
Signed-off-by: Hsin-Te Yuan <yuanhsinte at chromium.org>
---
 arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-fennel.dtsi | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-fennel.dtsi b/arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-fennel.dtsi
index bbe6c338f465ee7c11bfbfc30767bdb142706480..f9c1ec366b26607581c116b364cc2f80f8621a57 100644
--- a/arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-fennel.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-fennel.dtsi
@@ -25,3 +25,6 @@ trackpad at 2c {
 	};
 };
 
+&i2c2 {
+	i2c-scl-internal-delay-ns = <21500>;
+};

-- 
2.46.0.469.g59c65b2a67-goog



From yuanhsinte at chromium.org  Mon Sep  9 00:29:05 2024
From: yuanhsinte at chromium.org (Hsin-Te Yuan)
Date: Mon, 09 Sep 2024 07:29:05 +0000
Subject: [PATCH 3/4] arm64: dts: mt8183: cozmo: add i2c2's
 i2c-scl-internal-delay-ns
In-Reply-To: <20240909-i2c-delay-v1-0-4b406617a5f5@chromium.org>
References: <20240909-i2c-delay-v1-0-4b406617a5f5@chromium.org>
Message-ID: <20240909-i2c-delay-v1-3-4b406617a5f5@chromium.org>

From: Daolong Zhu <jg_daolongzhu at mediatek.corp-partner.google.com>

Add i2c2's i2c-scl-internal-delay-ns.

Fixes: 52e84f233459 ("arm64: dts: mt8183: Add kukui-jacuzzi-cozmo board")
Signed-off-by: Hsin-Te Yuan <yuanhsinte at chromium.org>
---
 arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-cozmo.dts | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-cozmo.dts b/arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-cozmo.dts
index f34964afe39b5353de7b17e82d14d1fba88551ab..83bbcfe620835ab6d34cd2f4c2183fbdf11d0909 100644
--- a/arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-cozmo.dts
+++ b/arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-cozmo.dts
@@ -18,6 +18,8 @@ &i2c_tunnel {
 };
 
 &i2c2 {
+	i2c-scl-internal-delay-ns = <25000>;
+
 	trackpad at 2c {
 		compatible = "hid-over-i2c";
 		reg = <0x2c>;

-- 
2.46.0.469.g59c65b2a67-goog



From yuanhsinte at chromium.org  Mon Sep  9 00:29:06 2024
From: yuanhsinte at chromium.org (Hsin-Te Yuan)
Date: Mon, 09 Sep 2024 07:29:06 +0000
Subject: [PATCH 4/4] arm64: dts: mt8183: Damu: add i2c2's
 i2c-scl-internal-delay-ns
In-Reply-To: <20240909-i2c-delay-v1-0-4b406617a5f5@chromium.org>
References: <20240909-i2c-delay-v1-0-4b406617a5f5@chromium.org>
Message-ID: <20240909-i2c-delay-v1-4-4b406617a5f5@chromium.org>

From: Daolong Zhu <jg_daolongzhu at mediatek.corp-partner.google.com>

Add i2c2's i2c-scl-internal-delay-ns.

Fixes: cabc71b08eb5 ("arm64: dts: mt8183: Add kukui-jacuzzi-damu board")
Signed-off-by: Hsin-Te Yuan <yuanhsinte at chromium.org>
---
 arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-damu.dts | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-damu.dts b/arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-damu.dts
index 0b45aee2e29953b6117b462034a00dff2596b9ff..65860b33c01fe832f3a4b2e21d24ea6b4f0cba2b 100644
--- a/arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-damu.dts
+++ b/arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-damu.dts
@@ -30,3 +30,6 @@ &qca_wifi {
 	qcom,ath10k-calibration-variant = "GO_DAMU";
 };
 
+&i2c2 {
+	i2c-scl-internal-delay-ns = <20000>;
+};

-- 
2.46.0.469.g59c65b2a67-goog



From peter.wang at mediatek.com  Mon Sep  9 01:20:59 2024
From: peter.wang at mediatek.com (peter.wang at mediatek.com)
Date: Mon, 9 Sep 2024 16:20:59 +0800
Subject: [PATCH v3 1/2] ufs: core: fix the issue of ICU failure
In-Reply-To: <20240909082100.24019-1-peter.wang@mediatek.com>
References: <20240909082100.24019-1-peter.wang@mediatek.com>
Message-ID: <20240909082100.24019-2-peter.wang@mediatek.com>

From: Peter Wang <peter.wang at mediatek.com>

When setting the ICU bit without using read-modify-write,
SQRTCy will restart SQ again and receive an RTC return
error code 2 (Failure - SQ not stopped).

Additionally, the error log has been modified so that
this type of error can be observed.

Fixes: ab248643d3d6 ("scsi: ufs: core: Add error handling for MCQ mode")
Cc: stable at vger.kernel.org
Signed-off-by: Peter Wang <peter.wang at mediatek.com>
---
 drivers/ufs/core/ufs-mcq.c | 15 ++++++++-------
 1 file changed, 8 insertions(+), 7 deletions(-)

diff --git a/drivers/ufs/core/ufs-mcq.c b/drivers/ufs/core/ufs-mcq.c
index 5891cdacd0b3..3903947dbed1 100644
--- a/drivers/ufs/core/ufs-mcq.c
+++ b/drivers/ufs/core/ufs-mcq.c
@@ -539,7 +539,7 @@ int ufshcd_mcq_sq_cleanup(struct ufs_hba *hba, int task_tag)
 	struct scsi_cmnd *cmd = lrbp->cmd;
 	struct ufs_hw_queue *hwq;
 	void __iomem *reg, *opr_sqd_base;
-	u32 nexus, id, val;
+	u32 nexus, id, val, rtc;
 	int err;
 
 	if (hba->quirks & UFSHCD_QUIRK_MCQ_BROKEN_RTC)
@@ -569,17 +569,18 @@ int ufshcd_mcq_sq_cleanup(struct ufs_hba *hba, int task_tag)
 	opr_sqd_base = mcq_opr_base(hba, OPR_SQD, id);
 	writel(nexus, opr_sqd_base + REG_SQCTI);
 
-	/* SQRTCy.ICU = 1 */
-	writel(SQ_ICU, opr_sqd_base + REG_SQRTC);
+	/* Initiate Cleanup */
+	writel(readl(opr_sqd_base + REG_SQRTC) | SQ_ICU,
+		opr_sqd_base + REG_SQRTC);
 
 	/* Poll SQRTSy.CUS = 1. Return result from SQRTSy.RTC */
 	reg = opr_sqd_base + REG_SQRTS;
 	err = read_poll_timeout(readl, val, val & SQ_CUS, 20,
 				MCQ_POLL_US, false, reg);
-	if (err)
-		dev_err(hba->dev, "%s: failed. hwq=%d, tag=%d err=%ld\n",
-			__func__, id, task_tag,
-			FIELD_GET(SQ_ICU_ERR_CODE_MASK, readl(reg)));
+	rtc = FIELD_GET(SQ_ICU_ERR_CODE_MASK, readl(reg));
+	if (err || rtc)
+		dev_err(hba->dev, "%s: failed. hwq=%d, tag=%d err=%d RTC=%d\n",
+			__func__, id, task_tag, err, rtc);
 
 	if (ufshcd_mcq_sq_start(hba, hwq))
 		err = -ETIMEDOUT;
-- 
2.45.2



From peter.wang at mediatek.com  Mon Sep  9 01:20:58 2024
From: peter.wang at mediatek.com (peter.wang at mediatek.com)
Date: Mon, 9 Sep 2024 16:20:58 +0800
Subject: [PATCH v3 0/2] fix abort defect
Message-ID: <20240909082100.24019-1-peter.wang@mediatek.com>

From: Peter Wang <peter.wang at mediatek.com>

This series fixes MCQ and SDB abort defect.

V3:
 - Change comment and use variable(rtc) for error print
 - Change flag name and move flag set before ufshcd_clear_cmd
 - Add SDB mode clear UTRLCLR tag receive OCS_ABORTED requeue

V2:
 - Fix mcq_enabled build error.

Peter Wang (2):
  ufs: core: fix the issue of ICU failure
  ufs: core: requeue aborted request

 drivers/ufs/core/ufs-mcq.c | 16 +++++++++-------
 drivers/ufs/core/ufshcd.c  | 29 +++++++++++++++--------------
 include/ufs/ufshcd.h       |  2 ++
 3 files changed, 26 insertions(+), 21 deletions(-)

-- 
2.45.2



From peter.wang at mediatek.com  Mon Sep  9 01:21:00 2024
From: peter.wang at mediatek.com (peter.wang at mediatek.com)
Date: Mon, 9 Sep 2024 16:21:00 +0800
Subject: [PATCH v3 2/2] ufs: core: requeue aborted request
In-Reply-To: <20240909082100.24019-1-peter.wang@mediatek.com>
References: <20240909082100.24019-1-peter.wang@mediatek.com>
Message-ID: <20240909082100.24019-3-peter.wang@mediatek.com>

From: Peter Wang <peter.wang at mediatek.com>

MCQ aborts a command using two methods below:
1. Nullified UTRD, Host controller skips this transfer request,
   reply Completion Queue entry to Host SW with OCS=ABORTED
2. SQ cleanup, The host controller will post to the Completion Queue
   to update the OCS field with ABORTED.

SDB aborts a command using UTRLCLR. Task Management response
which means a Transfer Request was aborted.

For these three cases, set a flag to notify SCSI to requeue the
command after receiving response with OCS_ABORTED.

Fixes: ab248643d3d6 ("scsi: ufs: core: Add error handling for MCQ mode")
Cc: stable at vger.kernel.org
Signed-off-by: Peter Wang <peter.wang at mediatek.com>
---
 drivers/ufs/core/ufs-mcq.c |  1 +
 drivers/ufs/core/ufshcd.c  | 29 +++++++++++++++--------------
 include/ufs/ufshcd.h       |  2 ++
 3 files changed, 18 insertions(+), 14 deletions(-)

diff --git a/drivers/ufs/core/ufs-mcq.c b/drivers/ufs/core/ufs-mcq.c
index 3903947dbed1..1f57ebf24a39 100644
--- a/drivers/ufs/core/ufs-mcq.c
+++ b/drivers/ufs/core/ufs-mcq.c
@@ -642,6 +642,7 @@ static bool ufshcd_mcq_sqe_search(struct ufs_hba *hba,
 		match = le64_to_cpu(utrd->command_desc_base_addr) & CQE_UCD_BA;
 		if (addr == match) {
 			ufshcd_mcq_nullify_sqe(utrd);
+			lrbp->abort_initiated_by_err = true;
 			ret = true;
 			goto out;
 		}
diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
index a6f818cdef0e..83a06b0730ea 100644
--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -3006,6 +3006,7 @@ static int ufshcd_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd)
 	ufshcd_prepare_lrbp_crypto(scsi_cmd_to_rq(cmd), lrbp);
 
 	lrbp->req_abort_skip = false;
+	lrbp->abort_initiated_by_err = false;
 
 	ufshcd_comp_scsi_upiu(hba, lrbp);
 
@@ -5404,7 +5405,10 @@ ufshcd_transfer_rsp_status(struct ufs_hba *hba, struct ufshcd_lrb *lrbp,
 		}
 		break;
 	case OCS_ABORTED:
-		result |= DID_ABORT << 16;
+		if (lrbp->abort_initiated_by_err)
+			result |= DID_REQUEUE << 16;
+		else
+			result |= DID_ABORT << 16;
 		break;
 	case OCS_INVALID_COMMAND_STATUS:
 		result |= DID_REQUEUE << 16;
@@ -6472,25 +6476,12 @@ static bool ufshcd_abort_one(struct request *rq, void *priv)
 	struct Scsi_Host *shost = sdev->host;
 	struct ufs_hba *hba = shost_priv(shost);
 	struct ufshcd_lrb *lrbp = &hba->lrb[tag];
-	struct ufs_hw_queue *hwq;
-	unsigned long flags;
 
 	*ret = ufshcd_try_to_abort_task(hba, tag);
 	dev_err(hba->dev, "Aborting tag %d / CDB %#02x %s\n", tag,
 		hba->lrb[tag].cmd ? hba->lrb[tag].cmd->cmnd[0] : -1,
 		*ret ? "failed" : "succeeded");
 
-	/* Release cmd in MCQ mode if abort succeeds */
-	if (hba->mcq_enabled && (*ret == 0)) {
-		hwq = ufshcd_mcq_req_to_hwq(hba, scsi_cmd_to_rq(lrbp->cmd));
-		if (!hwq)
-			return 0;
-		spin_lock_irqsave(&hwq->cq_lock, flags);
-		if (ufshcd_cmd_inflight(lrbp->cmd))
-			ufshcd_release_scsi_cmd(hba, lrbp);
-		spin_unlock_irqrestore(&hwq->cq_lock, flags);
-	}
-
 	return *ret == 0;
 }
 
@@ -7561,6 +7552,16 @@ int ufshcd_try_to_abort_task(struct ufs_hba *hba, int tag)
 		goto out;
 	}
 
+	/*
+	 * When the host software receives a "FUNCTION COMPLETE", set flag
+	 * to requeue command after receive response with OCS_ABORTED
+	 * SDB mode: UTRLCLR Task Management response which means a Transfer
+	 *           Request was aborted.
+	 * MCQ mode: Host will post to CQ with OCS_ABORTED after SQ cleanup
+	 */
+	if (!err)
+		lrbp->abort_initiated_by_err = true;
+
 	err = ufshcd_clear_cmd(hba, tag);
 	if (err)
 		dev_err(hba->dev, "%s: Failed clearing cmd at tag %d, err %d\n",
diff --git a/include/ufs/ufshcd.h b/include/ufs/ufshcd.h
index 0fd2aebac728..4edeabcd3e88 100644
--- a/include/ufs/ufshcd.h
+++ b/include/ufs/ufshcd.h
@@ -173,6 +173,7 @@ struct ufs_pm_lvl_states {
  * @crypto_key_slot: the key slot to use for inline crypto (-1 if none)
  * @data_unit_num: the data unit number for the first block for inline crypto
  * @req_abort_skip: skip request abort task flag
+ * @abort_initiated_by_err: abort initiated by error
  */
 struct ufshcd_lrb {
 	struct utp_transfer_req_desc *utr_descriptor_ptr;
@@ -202,6 +203,7 @@ struct ufshcd_lrb {
 #endif
 
 	bool req_abort_skip;
+	bool abort_initiated_by_err;
 };
 
 /**
-- 
2.45.2



From norbert.karecki at quirkbyte.pl  Mon Sep  9 01:15:56 2024
From: norbert.karecki at quirkbyte.pl (Norbert Karecki)
Date: Mon,  9 Sep 2024 08:15:56 GMT
Subject: Fotowoltaika - propozycja instalacji
Message-ID: <20240909084501-0.1.59.30k28.0.df7w3oqmp0@quirkbyte.pl>

Dzie? dobry,
 
Czy rozwa?ali Pa?stwo monta? systemu fotowoltaicznego?
 
Instalacja fotowoltaiczna jest najlepszym sposobem na obni?enie wysoko?ci rachunk?w za pr?d (pozostaj? tylko op?aty sta?e) i zabezpieczenie si? przed rosn?cymi cenami energii elektrycznej. Jest to w pe?ni odnawialne i bezemisyjne ?r?d?o energii, dzi?ki czemu przyczyniamy si? do ochrony ?rodowiska naturalnego.
 
Dzia?amy od wielu lat na rynku energetycznym. Przygotujemy projekt, wycen? oraz kompleksowo wykonamy i zg?osimy realizacj? do zak?adu energetycznego. 
 
Czy chc? Pa?stwo pozna? nasz? propozycj??  


Pozdrawiam
Norbert Karecki


From yuanhsinte at chromium.org  Mon Sep  9 01:33:45 2024
From: yuanhsinte at chromium.org (Hsin-Te Yuan)
Date: Mon, 09 Sep 2024 08:33:45 +0000
Subject: [PATCH 0/2] Fix the address of eeprom of mt8183-kukui
Message-ID: <20240909-eeprom-v1-0-1ed2bc5064f4@chromium.org>

The address of eeprom should be 50. The fixed commit in krane one is
older than the rest, so split it for backporting.

Signed-off-by: Hsin-Te Yuan <yuanhsinte at chromium.org>
---
Hsin-Te Yuan (2):
      arm64: dts: mt8183: krane: Fix the address of eeprom at i2c4
      arm64: dts: mt8183: kukui: Fix the address of eeprom at i2c4

 arch/arm64/boot/dts/mediatek/mt8183-kukui-kakadu.dtsi | 4 ++--
 arch/arm64/boot/dts/mediatek/mt8183-kukui-kodama.dtsi | 4 ++--
 arch/arm64/boot/dts/mediatek/mt8183-kukui-krane.dtsi  | 4 ++--
 3 files changed, 6 insertions(+), 6 deletions(-)
---
base-commit: da3ea35007d0af457a0afc87e84fddaebc4e0b63
change-id: 20240909-eeprom-00dd82c7b4aa

Best regards,
-- 
Hsin-Te Yuan <yuanhsinte at chromium.org>



From yuanhsinte at chromium.org  Mon Sep  9 01:33:46 2024
From: yuanhsinte at chromium.org (Hsin-Te Yuan)
Date: Mon, 09 Sep 2024 08:33:46 +0000
Subject: [PATCH 1/2] arm64: dts: mt8183: krane: Fix the address of eeprom
 at i2c4
In-Reply-To: <20240909-eeprom-v1-0-1ed2bc5064f4@chromium.org>
References: <20240909-eeprom-v1-0-1ed2bc5064f4@chromium.org>
Message-ID: <20240909-eeprom-v1-1-1ed2bc5064f4@chromium.org>

The address of eeprom should be 50.

Fixes: cd894e274b74 ("arm64: dts: mt8183: Add krane-sku176 board")
Signed-off-by: Hsin-Te Yuan <yuanhsinte at chromium.org>
---
 arch/arm64/boot/dts/mediatek/mt8183-kukui-krane.dtsi | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/arch/arm64/boot/dts/mediatek/mt8183-kukui-krane.dtsi b/arch/arm64/boot/dts/mediatek/mt8183-kukui-krane.dtsi
index 0f5fa893a77426d50c293f780b75cacfe988d866..8b56b8564ed7a25c269f4231ddadf8621aec41d8 100644
--- a/arch/arm64/boot/dts/mediatek/mt8183-kukui-krane.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8183-kukui-krane.dtsi
@@ -88,9 +88,9 @@ &i2c4 {
 	clock-frequency = <400000>;
 	vbus-supply = <&mt6358_vcn18_reg>;
 
-	eeprom at 54 {
+	eeprom at 50 {
 		compatible = "atmel,24c32";
-		reg = <0x54>;
+		reg = <0x50>;
 		pagesize = <32>;
 		vcc-supply = <&mt6358_vcn18_reg>;
 	};

-- 
2.46.0.469.g59c65b2a67-goog



From yuanhsinte at chromium.org  Mon Sep  9 01:33:47 2024
From: yuanhsinte at chromium.org (Hsin-Te Yuan)
Date: Mon, 09 Sep 2024 08:33:47 +0000
Subject: [PATCH 2/2] arm64: dts: mt8183: kukui: Fix the address of eeprom
 at i2c4
In-Reply-To: <20240909-eeprom-v1-0-1ed2bc5064f4@chromium.org>
References: <20240909-eeprom-v1-0-1ed2bc5064f4@chromium.org>
Message-ID: <20240909-eeprom-v1-2-1ed2bc5064f4@chromium.org>

The address of eeprom should be 50.

Fixes: ff33d889567e ("arm64: dts: mt8183: Add kukui kodama board")
Fixes: d1eaf77f2c66 ("arm64: dts: mt8183: Add kukui kakadu board")
Signed-off-by: Hsin-Te Yuan <yuanhsinte at chromium.org>
---
 arch/arm64/boot/dts/mediatek/mt8183-kukui-kakadu.dtsi | 4 ++--
 arch/arm64/boot/dts/mediatek/mt8183-kukui-kodama.dtsi | 4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/arch/arm64/boot/dts/mediatek/mt8183-kukui-kakadu.dtsi b/arch/arm64/boot/dts/mediatek/mt8183-kukui-kakadu.dtsi
index bfb9e42c8acaa7c2e5515888a77fe97258a1b78a..ff02f63bac29b2c473bfdd90a15aba09c2915271 100644
--- a/arch/arm64/boot/dts/mediatek/mt8183-kukui-kakadu.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8183-kukui-kakadu.dtsi
@@ -92,9 +92,9 @@ &i2c4 {
 	clock-frequency = <400000>;
 	vbus-supply = <&mt6358_vcn18_reg>;
 
-	eeprom at 54 {
+	eeprom at 50 {
 		compatible = "atmel,24c32";
-		reg = <0x54>;
+		reg = <0x50>;
 		pagesize = <32>;
 		vcc-supply = <&mt6358_vcn18_reg>;
 	};
diff --git a/arch/arm64/boot/dts/mediatek/mt8183-kukui-kodama.dtsi b/arch/arm64/boot/dts/mediatek/mt8183-kukui-kodama.dtsi
index 5c1bf6a1e475865fc0f6187e9733d7d98908797e..da6e767b4ceede9f5258274fbd702c6e6929f515 100644
--- a/arch/arm64/boot/dts/mediatek/mt8183-kukui-kodama.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8183-kukui-kodama.dtsi
@@ -79,9 +79,9 @@ &i2c4 {
 	clock-frequency = <400000>;
 	vbus-supply = <&mt6358_vcn18_reg>;
 
-	eeprom at 54 {
+	eeprom at 50 {
 		compatible = "atmel,24c64";
-		reg = <0x54>;
+		reg = <0x50>;
 		pagesize = <32>;
 		vcc-supply = <&mt6358_vcn18_reg>;
 	};

-- 
2.46.0.469.g59c65b2a67-goog



From neil.armstrong at linaro.org  Mon Sep  9 02:04:37 2024
From: neil.armstrong at linaro.org (Neil Armstrong)
Date: Mon, 9 Sep 2024 11:04:37 +0200
Subject: [PATCH 1/5] drm/meson: drop unused staitc dw_hdmi_dwc_write_bits
In-Reply-To: <20240908-regmap-config-const-v1-1-28f349004811@linaro.org>
References: <20240908-regmap-config-const-v1-0-28f349004811@linaro.org>
 <20240908-regmap-config-const-v1-1-28f349004811@linaro.org>
Message-ID: <b4ac3e8e-1d0c-4a6e-97de-482a77a3a3aa@linaro.org>

On 08/09/2024 16:21, Krzysztof Kozlowski wrote:
> static inline dw_hdmi_dwc_write_bits() function is not used at all:
> 
>    drivers/gpu/drm/meson/meson_dw_hdmi.c:276:20: error: unused function 'dw_hdmi_dwc_write_bits' [-Werror,-Wunused-function]
> 
> Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski at linaro.org>
> ---
>   drivers/gpu/drm/meson/meson_dw_hdmi.c | 14 --------------
>   1 file changed, 14 deletions(-)
> 
> diff --git a/drivers/gpu/drm/meson/meson_dw_hdmi.c b/drivers/gpu/drm/meson/meson_dw_hdmi.c
> index 5565f7777529..b75db829b1da 100644
> --- a/drivers/gpu/drm/meson/meson_dw_hdmi.c
> +++ b/drivers/gpu/drm/meson/meson_dw_hdmi.c
> @@ -272,20 +272,6 @@ static inline void dw_hdmi_g12a_dwc_write(struct meson_dw_hdmi *dw_hdmi,
>   	writeb(data, dw_hdmi->hdmitx + addr);
>   }
>   
> -/* Helper to change specific bits in controller registers */
> -static inline void dw_hdmi_dwc_write_bits(struct meson_dw_hdmi *dw_hdmi,
> -					  unsigned int addr,
> -					  unsigned int mask,
> -					  unsigned int val)
> -{
> -	unsigned int data = dw_hdmi->data->dwc_read(dw_hdmi, addr);
> -
> -	data &= ~mask;
> -	data |= val;
> -
> -	dw_hdmi->data->dwc_write(dw_hdmi, addr, data);
> -}
> -
>   /* Bridge */
>   
>   /* Setup PHY bandwidth modes */
> 

Reviewed-by: Neil Armstrong <neil.armstrong at linaro.org>


From neil.armstrong at linaro.org  Mon Sep  9 02:04:50 2024
From: neil.armstrong at linaro.org (Neil Armstrong)
Date: Mon, 9 Sep 2024 11:04:50 +0200
Subject: [PATCH 2/5] drm/meson: constify regmap_config
In-Reply-To: <20240908-regmap-config-const-v1-2-28f349004811@linaro.org>
References: <20240908-regmap-config-const-v1-0-28f349004811@linaro.org>
 <20240908-regmap-config-const-v1-2-28f349004811@linaro.org>
Message-ID: <81392013-5dda-424f-b185-c350b163c82d@linaro.org>

On 08/09/2024 16:21, Krzysztof Kozlowski wrote:
> Mark local static 'struct regmap_config' as const for safer and more
> obvious code.
> 
> Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski at linaro.org>
> ---
>   drivers/gpu/drm/meson/meson_drv.c | 2 +-
>   1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/meson/meson_drv.c b/drivers/gpu/drm/meson/meson_drv.c
> index 4bd0baa2a4f5..6c8677d1f562 100644
> --- a/drivers/gpu/drm/meson/meson_drv.c
> +++ b/drivers/gpu/drm/meson/meson_drv.c
> @@ -126,7 +126,7 @@ static bool meson_vpu_has_available_connectors(struct device *dev)
>   	return false;
>   }
>   
> -static struct regmap_config meson_regmap_config = {
> +static const struct regmap_config meson_regmap_config = {
>   	.reg_bits       = 32,
>   	.val_bits       = 32,
>   	.reg_stride     = 4,
> 

Reviewed-by: Neil Armstrong <neil.armstrong at linaro.org>


From guoqing.jiang at canonical.com  Mon Sep  9 02:29:23 2024
From: guoqing.jiang at canonical.com (Guoqing Jiang)
Date: Mon, 9 Sep 2024 17:29:23 +0800
Subject: [PATCH -next v2] usb: musb: mediatek: Simplify code with
 dev_err_probe()
In-Reply-To: <20240907081351.19879-1-linruifeng4@huawei.com>
References: <20240907081351.19879-1-linruifeng4@huawei.com>
Message-ID: <9fddd930-21ae-4e7d-86ee-c586af3b50e0@canonical.com>



On 9/7/24 16:13, Lin Ruifeng wrote:
> The combination of dev_err() and the returned error code could be
> replaced by dev_err_probe() in driver's probe function. Let's,
> converting to dev_err_probe() to make code more simple.
>
> Signed-off-by: Lin Ruifeng <linruifeng4 at huawei.com>
> ---
> v2:
> - The wrong message is modified.
>   drivers/usb/musb/mediatek.c | 27 +++++++++++----------------
>   1 file changed, 11 insertions(+), 16 deletions(-)
>
> diff --git a/drivers/usb/musb/mediatek.c b/drivers/usb/musb/mediatek.c
> index 0a35aab3ab81..63c86c046b98 100644
> --- a/drivers/usb/musb/mediatek.c
> +++ b/drivers/usb/musb/mediatek.c
> @@ -416,10 +416,9 @@ static int mtk_musb_probe(struct platform_device *pdev)
>   		return -ENOMEM;
>   
>   	ret = of_platform_populate(np, NULL, NULL, dev);
> -	if (ret) {
> -		dev_err(dev, "failed to create child devices at %p\n", np);
> -		return ret;
> -	}
> +	if (ret)
> +		return dev_err_probe(dev, ret,
> +				"failed to create child devices at %p\n", np);
>   
>   	ret = mtk_musb_clks_get(glue);
>   	if (ret)
> @@ -448,23 +447,19 @@ static int mtk_musb_probe(struct platform_device *pdev)
>   		glue->role = USB_ROLE_NONE;
>   		break;
>   	default:
> -		dev_err(&pdev->dev, "Error 'dr_mode' property\n");
> -		return -EINVAL;
> +		return dev_err_probe(&pdev->dev, -EINVAL,
> +				"Error 'dr_mode' property\n");
>   	}
>   
>   	glue->phy = devm_of_phy_get_by_index(dev, np, 0);
> -	if (IS_ERR(glue->phy)) {
> -		dev_err(dev, "fail to getting phy %ld\n",
> -			PTR_ERR(glue->phy));
> -		return PTR_ERR(glue->phy);
> -	}
> +	if (IS_ERR(glue->phy))
> +		return dev_err_probe(dev, PTR_ERR(glue->phy),
> +				"fail to getting phy\n");
>   
>   	glue->usb_phy = usb_phy_generic_register();
> -	if (IS_ERR(glue->usb_phy)) {
> -		dev_err(dev, "fail to registering usb-phy %ld\n",
> -			PTR_ERR(glue->usb_phy));
> -		return PTR_ERR(glue->usb_phy);
> -	}
> +	if (IS_ERR(glue->usb_phy))
> +		return dev_err_probe(dev, PTR_ERR(glue->usb_phy),
> +				"fail to registering usb-phy\n");
>   
>   	glue->xceiv = devm_usb_get_phy(dev, USB_PHY_TYPE_USB2);
>   	if (IS_ERR(glue->xceiv)) {

Sorry, this is probably out of topic. I had seen one relevant kmemleak 
report (probably false
positive) which is related to dev_err_probe.

[<ffff800083692200>] kmemleak_alloc+0xe0/0x120
[<ffff800080a1d7f4>] __kmalloc_node_track_caller+0x354/0x4d0
[<ffff800081443520>] kvasprintf+0xd0/0x1a0
[<ffff8000814438bc>] kasprintf+0xac/0x120
[<ffff8000820b5578>] device_set_deferred_probe_reason+0x68/0x148
[<ffff8000820a1844>] dev_err_probe+0x164/0x1b0
[<ffff800081ba00a8>] __clk_bulk_get+0x108/0x238
[<ffff800081ba0248>] clk_bulk_get_optional+0x20/0x50
[<ffff800081b9f294>] devm_clk_bulk_get_optional+0x6c/0x160
[<ffff800081791efc>] mtk_tphy_probe+0x38c/0x7a8
[<ffff8000820bbe98>] platform_probe+0xd0/0x240
[<ffff8000820b35c8>] really_probe+0x368/0xa10
[<ffff8000820b3de0>] __driver_probe_device+0x170/0x420
[<ffff8000820b40f8>] driver_probe_device+0x68/0x1f0
[<ffff8000820b47fc>] __driver_attach+0x234/0x558
[<ffff8000820ae1b8>] bus_for_each_dev+0x108/0x1c8

Not sure if this patch could trigger the same report.

Thanks,
Guoqing


From matthias.bgg at gmail.com  Mon Sep  9 03:42:20 2024
From: matthias.bgg at gmail.com (Matthias Brugger)
Date: Mon, 9 Sep 2024 12:42:20 +0200
Subject: [PATCH] ASoC: mediatek: mt8365: remove unused mt8365_i2s_hd_str
In-Reply-To: <20240907200053.3027553-1-arnd@kernel.org>
References: <20240907200053.3027553-1-arnd@kernel.org>
Message-ID: <d39fe852-23f9-4202-8785-70cc977f22d7@gmail.com>



On 07/09/2024 22:00, Arnd Bergmann wrote:
> From: Arnd Bergmann <arnd at arndb.de>
> 
> The mt8365_i2s_enum and mt8365_i2s_hd_str variables are not
> used anywhere, but cause a warning when building with C=1
> or when enabling -Wunused-const-variable:
> 
> sound/soc/mediatek/mt8365/mt8365-dai-i2s.c:781:27: error: 'mt8365_i2s_hd_str' defined but not used [-Werror=unused-const-variable=]
>    781 | static const char * const mt8365_i2s_hd_str[] = {
>        |                           ^~~~~~~~~~~~~~~~~
> 
> Remove these for the moment, they can be added back if a
> user comes up.
> 
> Fixes: 402bbb13a195 ("ASoC: mediatek: mt8365: Add I2S DAI support")
> Signed-off-by: Arnd Bergmann <arnd at arndb.de>

Reviewed-by: Matthias Brugger <matthias.bgg at gmail.com>

> ---
>   sound/soc/mediatek/mt8365/mt8365-dai-i2s.c | 7 -------
>   1 file changed, 7 deletions(-)
> 
> diff --git a/sound/soc/mediatek/mt8365/mt8365-dai-i2s.c b/sound/soc/mediatek/mt8365/mt8365-dai-i2s.c
> index 6b4d8b7e24ca..3482d8f8b4e7 100644
> --- a/sound/soc/mediatek/mt8365/mt8365-dai-i2s.c
> +++ b/sound/soc/mediatek/mt8365/mt8365-dai-i2s.c
> @@ -777,13 +777,6 @@ static struct snd_soc_dai_driver mtk_dai_i2s_driver[] = {
>   	}
>   };
>   
> -/* low jitter control */
> -static const char * const mt8365_i2s_hd_str[] = {
> -	"Normal", "Low_Jitter"
> -};
> -
> -static SOC_ENUM_SINGLE_EXT_DECL(mt8365_i2s_enum, mt8365_i2s_hd_str);
> -
>   static const char * const fmi2sin_text[] = {
>   	"OPEN", "FM_2ND_I2S_IN"
>   };


From matthias.bgg at gmail.com  Mon Sep  9 04:05:58 2024
From: matthias.bgg at gmail.com (Matthias Brugger)
Date: Mon, 9 Sep 2024 13:05:58 +0200
Subject: [PATCH -next v2] usb: musb: mediatek: Simplify code with
 dev_err_probe()
In-Reply-To: <20240907081351.19879-1-linruifeng4@huawei.com>
References: <20240907081351.19879-1-linruifeng4@huawei.com>
Message-ID: <f623afa8-7c5a-44c5-be63-199a06ddbcfc@gmail.com>



On 07/09/2024 10:13, Lin Ruifeng wrote:
> The combination of dev_err() and the returned error code could be
> replaced by dev_err_probe() in driver's probe function. Let's,
> converting to dev_err_probe() to make code more simple.
> 
> Signed-off-by: Lin Ruifeng <linruifeng4 at huawei.com>

Reviewed-by: Matthias Brugger <matthias.bgg at gmail.com>

> ---
> v2:
> - The wrong message is modified.
>   drivers/usb/musb/mediatek.c | 27 +++++++++++----------------
>   1 file changed, 11 insertions(+), 16 deletions(-)
> 
> diff --git a/drivers/usb/musb/mediatek.c b/drivers/usb/musb/mediatek.c
> index 0a35aab3ab81..63c86c046b98 100644
> --- a/drivers/usb/musb/mediatek.c
> +++ b/drivers/usb/musb/mediatek.c
> @@ -416,10 +416,9 @@ static int mtk_musb_probe(struct platform_device *pdev)
>   		return -ENOMEM;
>   
>   	ret = of_platform_populate(np, NULL, NULL, dev);
> -	if (ret) {
> -		dev_err(dev, "failed to create child devices at %p\n", np);
> -		return ret;
> -	}
> +	if (ret)
> +		return dev_err_probe(dev, ret,
> +				"failed to create child devices at %p\n", np);
>   
>   	ret = mtk_musb_clks_get(glue);
>   	if (ret)
> @@ -448,23 +447,19 @@ static int mtk_musb_probe(struct platform_device *pdev)
>   		glue->role = USB_ROLE_NONE;
>   		break;
>   	default:
> -		dev_err(&pdev->dev, "Error 'dr_mode' property\n");
> -		return -EINVAL;
> +		return dev_err_probe(&pdev->dev, -EINVAL,
> +				"Error 'dr_mode' property\n");
>   	}
>   
>   	glue->phy = devm_of_phy_get_by_index(dev, np, 0);
> -	if (IS_ERR(glue->phy)) {
> -		dev_err(dev, "fail to getting phy %ld\n",
> -			PTR_ERR(glue->phy));
> -		return PTR_ERR(glue->phy);
> -	}
> +	if (IS_ERR(glue->phy))
> +		return dev_err_probe(dev, PTR_ERR(glue->phy),
> +				"fail to getting phy\n");
>   
>   	glue->usb_phy = usb_phy_generic_register();
> -	if (IS_ERR(glue->usb_phy)) {
> -		dev_err(dev, "fail to registering usb-phy %ld\n",
> -			PTR_ERR(glue->usb_phy));
> -		return PTR_ERR(glue->usb_phy);
> -	}
> +	if (IS_ERR(glue->usb_phy))
> +		return dev_err_probe(dev, PTR_ERR(glue->usb_phy),
> +				"fail to registering usb-phy\n");
>   
>   	glue->xceiv = devm_usb_get_phy(dev, USB_PHY_TYPE_USB2);
>   	if (IS_ERR(glue->xceiv)) {


From matthias.bgg at gmail.com  Mon Sep  9 04:07:21 2024
From: matthias.bgg at gmail.com (Matthias Brugger)
Date: Mon, 9 Sep 2024 13:07:21 +0200
Subject: [PATCH 4/5] drm/mediatek: dp: constify regmap_config
In-Reply-To: <20240908-regmap-config-const-v1-4-28f349004811@linaro.org>
References: <20240908-regmap-config-const-v1-0-28f349004811@linaro.org>
 <20240908-regmap-config-const-v1-4-28f349004811@linaro.org>
Message-ID: <39a07b50-e403-4799-9091-edfcbfba067e@gmail.com>



On 08/09/2024 16:21, Krzysztof Kozlowski wrote:
> Mark local static 'struct regmap_config' as const for safer and more
> obvious code.
> 
> Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski at linaro.org>

Reviewed-by: Matthias Brugger <matthias.bgg at gmail.com>

> ---
>   drivers/gpu/drm/mediatek/mtk_dp.c | 2 +-
>   1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/mediatek/mtk_dp.c b/drivers/gpu/drm/mediatek/mtk_dp.c
> index d8796a904eca..f0f6f402994a 100644
> --- a/drivers/gpu/drm/mediatek/mtk_dp.c
> +++ b/drivers/gpu/drm/mediatek/mtk_dp.c
> @@ -311,7 +311,7 @@ static const struct mtk_dp_efuse_fmt mt8195_dp_efuse_fmt[MTK_DP_CAL_MAX] = {
>   	},
>   };
>   
> -static struct regmap_config mtk_dp_regmap_config = {
> +static const struct regmap_config mtk_dp_regmap_config = {
>   	.reg_bits = 32,
>   	.val_bits = 32,
>   	.reg_stride = 4,
> 


From matthias.bgg at gmail.com  Mon Sep  9 04:08:43 2024
From: matthias.bgg at gmail.com (Matthias Brugger)
Date: Mon, 9 Sep 2024 13:08:43 +0200
Subject: [PATCH 1/2] arm64: dts: mt8183: krane: Fix the address of eeprom
 at i2c4
In-Reply-To: <20240909-eeprom-v1-1-1ed2bc5064f4@chromium.org>
References: <20240909-eeprom-v1-0-1ed2bc5064f4@chromium.org>
 <20240909-eeprom-v1-1-1ed2bc5064f4@chromium.org>
Message-ID: <c88b24fa-5393-462a-8781-07cdcca01b12@gmail.com>



On 09/09/2024 10:33, Hsin-Te Yuan wrote:
> The address of eeprom should be 50.
> 
> Fixes: cd894e274b74 ("arm64: dts: mt8183: Add krane-sku176 board")
> Signed-off-by: Hsin-Te Yuan <yuanhsinte at chromium.org>

Reviewed-by: Matthias Brugger <matthias.bgg at gmail.com>

> ---
>   arch/arm64/boot/dts/mediatek/mt8183-kukui-krane.dtsi | 4 ++--
>   1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/arch/arm64/boot/dts/mediatek/mt8183-kukui-krane.dtsi b/arch/arm64/boot/dts/mediatek/mt8183-kukui-krane.dtsi
> index 0f5fa893a77426d50c293f780b75cacfe988d866..8b56b8564ed7a25c269f4231ddadf8621aec41d8 100644
> --- a/arch/arm64/boot/dts/mediatek/mt8183-kukui-krane.dtsi
> +++ b/arch/arm64/boot/dts/mediatek/mt8183-kukui-krane.dtsi
> @@ -88,9 +88,9 @@ &i2c4 {
>   	clock-frequency = <400000>;
>   	vbus-supply = <&mt6358_vcn18_reg>;
>   
> -	eeprom at 54 {
> +	eeprom at 50 {
>   		compatible = "atmel,24c32";
> -		reg = <0x54>;
> +		reg = <0x50>;
>   		pagesize = <32>;
>   		vcc-supply = <&mt6358_vcn18_reg>;
>   	};
> 


From matthias.bgg at gmail.com  Mon Sep  9 04:09:04 2024
From: matthias.bgg at gmail.com (Matthias Brugger)
Date: Mon, 9 Sep 2024 13:09:04 +0200
Subject: [PATCH 2/2] arm64: dts: mt8183: kukui: Fix the address of eeprom
 at i2c4
In-Reply-To: <20240909-eeprom-v1-2-1ed2bc5064f4@chromium.org>
References: <20240909-eeprom-v1-0-1ed2bc5064f4@chromium.org>
 <20240909-eeprom-v1-2-1ed2bc5064f4@chromium.org>
Message-ID: <252cba39-b55c-4ea8-9a5e-271b77a6a064@gmail.com>



On 09/09/2024 10:33, Hsin-Te Yuan wrote:
> The address of eeprom should be 50.
> 
> Fixes: ff33d889567e ("arm64: dts: mt8183: Add kukui kodama board")
> Fixes: d1eaf77f2c66 ("arm64: dts: mt8183: Add kukui kakadu board")
> Signed-off-by: Hsin-Te Yuan <yuanhsinte at chromium.org>

Reviewed-by: Matthias Brugger <matthias.bgg at gmail.com>

> ---
>   arch/arm64/boot/dts/mediatek/mt8183-kukui-kakadu.dtsi | 4 ++--
>   arch/arm64/boot/dts/mediatek/mt8183-kukui-kodama.dtsi | 4 ++--
>   2 files changed, 4 insertions(+), 4 deletions(-)
> 
> diff --git a/arch/arm64/boot/dts/mediatek/mt8183-kukui-kakadu.dtsi b/arch/arm64/boot/dts/mediatek/mt8183-kukui-kakadu.dtsi
> index bfb9e42c8acaa7c2e5515888a77fe97258a1b78a..ff02f63bac29b2c473bfdd90a15aba09c2915271 100644
> --- a/arch/arm64/boot/dts/mediatek/mt8183-kukui-kakadu.dtsi
> +++ b/arch/arm64/boot/dts/mediatek/mt8183-kukui-kakadu.dtsi
> @@ -92,9 +92,9 @@ &i2c4 {
>   	clock-frequency = <400000>;
>   	vbus-supply = <&mt6358_vcn18_reg>;
>   
> -	eeprom at 54 {
> +	eeprom at 50 {
>   		compatible = "atmel,24c32";
> -		reg = <0x54>;
> +		reg = <0x50>;
>   		pagesize = <32>;
>   		vcc-supply = <&mt6358_vcn18_reg>;
>   	};
> diff --git a/arch/arm64/boot/dts/mediatek/mt8183-kukui-kodama.dtsi b/arch/arm64/boot/dts/mediatek/mt8183-kukui-kodama.dtsi
> index 5c1bf6a1e475865fc0f6187e9733d7d98908797e..da6e767b4ceede9f5258274fbd702c6e6929f515 100644
> --- a/arch/arm64/boot/dts/mediatek/mt8183-kukui-kodama.dtsi
> +++ b/arch/arm64/boot/dts/mediatek/mt8183-kukui-kodama.dtsi
> @@ -79,9 +79,9 @@ &i2c4 {
>   	clock-frequency = <400000>;
>   	vbus-supply = <&mt6358_vcn18_reg>;
>   
> -	eeprom at 54 {
> +	eeprom at 50 {
>   		compatible = "atmel,24c64";
> -		reg = <0x54>;
> +		reg = <0x50>;
>   		pagesize = <32>;
>   		vcc-supply = <&mt6358_vcn18_reg>;
>   	};
> 


From fshao at chromium.org  Mon Sep  9 04:14:13 2024
From: fshao at chromium.org (Fei Shao)
Date: Mon,  9 Sep 2024 19:14:13 +0800
Subject: [PATCH 00/13] Several fixes and supports for MediaTek MT8188 SoC
Message-ID: <20240909111535.528624-1-fshao@chromium.org>

Hi all,

This series contains several fixes and patches to the MediaTek MT8188
SoC.
It aims to add more fundamental supports and lay the groundwork for
introducing MT8188-based boards in the future:
- Supports for CPUFreq, SPMI, IOMMU, PWM and audio.
- Fixes for CPU big core clusters, missing dma-ranges in soc node and
  power-off sequence issue in vcodec pipeline.
- MT8188 CHECK_DTBS fixes for dt-bindings and device tree.

Note that there are more changes for MT8188 SoC on the way - PCIe, MIPI
DSI panel, DRM, multimedia encoders and decoders etc. I'll keep working
on organizing those changes, and I believe the feedback here will also
help me improve those before posting. Thanks!

Regards,
Fei


Fei Shao (13):
  arm64: dts: mediatek: mt8188: Add CPU performance controller for
    CPUFreq
  arm64: dts: mediatek: mt8188: Specify CPU big core cluster
  arm64: dts: mediatek: mt8188: Add missing dma-ranges to soc node
  arm64: dts: mediatek: mt8188: Move vdec1 power domain under vdec0
  arm64: dts: mediatek: mt8188: Add missing GCE clock names
  arm64: dts: mediatek: mt8188: Update VPPSYS node name and compatible
  dt-bindings: power: mediatek: Add another nested power-domain layer
  arm64: dts: mediatek: mt8188: Add SMI/LARB/IOMMU support
  arm64: dts: mediatek: mt8188: Add PWM nodes for display backlight
  dt-bindings: spmi: spmi-mtk-pmif: Add compatible for MT8188
  arm64: dts: mediatek: mt8188: Add SPMI support for PMIC control
  dt-bindings: mailbox: mtk,adsp-mbox: Add compatible for MT8188
  arm64: dts: mediatek: mt8188: Add audio support

 .../bindings/mailbox/mtk,adsp-mbox.yaml       |  12 +-
 .../power/mediatek,power-controller.yaml      |   4 +
 .../bindings/spmi/mtk,spmi-mtk-pmif.yaml      |   1 +
 arch/arm64/boot/dts/mediatek/mt8188.dtsi      | 352 +++++++++++++++++-
 4 files changed, 350 insertions(+), 19 deletions(-)

-- 
2.46.0.469.g59c65b2a67-goog



From fshao at chromium.org  Mon Sep  9 04:14:14 2024
From: fshao at chromium.org (Fei Shao)
Date: Mon,  9 Sep 2024 19:14:14 +0800
Subject: [PATCH 01/13] arm64: dts: mediatek: mt8188: Add CPU performance controller for CPUFreq
In-Reply-To: <20240909111535.528624-1-fshao@chromium.org>
References: <20240909111535.528624-1-fshao@chromium.org>
Message-ID: <20240909111535.528624-2-fshao@chromium.org>

Add performance controller node and performance-domains properties for
CPUFreq support on MT8188 SoC.

Signed-off-by: Fei Shao <fshao at chromium.org>
---

 arch/arm64/boot/dts/mediatek/mt8188.dtsi | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/arch/arm64/boot/dts/mediatek/mt8188.dtsi b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
index cd27966d2e3c..cdd2fe14effa 100644
--- a/arch/arm64/boot/dts/mediatek/mt8188.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
@@ -41,6 +41,7 @@ cpu0: cpu at 0 {
 			d-cache-line-size = <64>;
 			d-cache-sets = <128>;
 			next-level-cache = <&l2_0>;
+			performance-domains = <&performance 0>;
 			#cooling-cells = <2>;
 		};
 
@@ -59,6 +60,7 @@ cpu1: cpu at 100 {
 			d-cache-line-size = <64>;
 			d-cache-sets = <128>;
 			next-level-cache = <&l2_0>;
+			performance-domains = <&performance 0>;
 			#cooling-cells = <2>;
 		};
 
@@ -77,6 +79,7 @@ cpu2: cpu at 200 {
 			d-cache-line-size = <64>;
 			d-cache-sets = <128>;
 			next-level-cache = <&l2_0>;
+			performance-domains = <&performance 0>;
 			#cooling-cells = <2>;
 		};
 
@@ -95,6 +98,7 @@ cpu3: cpu at 300 {
 			d-cache-line-size = <64>;
 			d-cache-sets = <128>;
 			next-level-cache = <&l2_0>;
+			performance-domains = <&performance 0>;
 			#cooling-cells = <2>;
 		};
 
@@ -113,6 +117,7 @@ cpu4: cpu at 400 {
 			d-cache-line-size = <64>;
 			d-cache-sets = <128>;
 			next-level-cache = <&l2_0>;
+			performance-domains = <&performance 0>;
 			#cooling-cells = <2>;
 		};
 
@@ -131,6 +136,7 @@ cpu5: cpu at 500 {
 			d-cache-line-size = <64>;
 			d-cache-sets = <128>;
 			next-level-cache = <&l2_0>;
+			performance-domains = <&performance 0>;
 			#cooling-cells = <2>;
 		};
 
@@ -149,6 +155,7 @@ cpu6: cpu at 600 {
 			d-cache-line-size = <64>;
 			d-cache-sets = <256>;
 			next-level-cache = <&l2_1>;
+			performance-domains = <&performance 1>;
 			#cooling-cells = <2>;
 		};
 
@@ -167,6 +174,7 @@ cpu7: cpu at 700 {
 			d-cache-line-size = <64>;
 			d-cache-sets = <256>;
 			next-level-cache = <&l2_1>;
+			performance-domains = <&performance 1>;
 			#cooling-cells = <2>;
 		};
 
@@ -880,6 +888,12 @@ soc {
 		compatible = "simple-bus";
 		ranges;
 
+		performance: performance-controller at 11bc10 {
+			compatible = "mediatek,cpufreq-hw";
+			reg = <0 0x0011bc10 0 0x120>, <0 0x0011bd30 0 0x120>;
+			#performance-domain-cells = <1>;
+		};
+
 		gic: interrupt-controller at c000000 {
 			compatible = "arm,gic-v3";
 			#interrupt-cells = <4>;
-- 
2.46.0.469.g59c65b2a67-goog



From matthias.bgg at gmail.com  Mon Sep  9 04:17:48 2024
From: matthias.bgg at gmail.com (Matthias Brugger)
Date: Mon, 9 Sep 2024 13:17:48 +0200
Subject: [PATCH 1/4] arm64: dts: mt8183: fennel: add i2c2's
 i2c-scl-internal-delay-ns
In-Reply-To: <20240909-i2c-delay-v1-1-4b406617a5f5@chromium.org>
References: <20240909-i2c-delay-v1-0-4b406617a5f5@chromium.org>
 <20240909-i2c-delay-v1-1-4b406617a5f5@chromium.org>
Message-ID: <9903db96-1960-4715-a1e3-1d477003e92f@gmail.com>



On 09/09/2024 09:29, Hsin-Te Yuan wrote:
> From: Daolong Zhu <jg_daolongzhu at mediatek.corp-partner.google.com>
> 
> Add i2c2's i2c-scl-internal-delay-ns.
> 
> Fixes: 6cd7fdc8c530 ("arm64: dts: mt8183: Add kukui-jacuzzi-fennel board")
> Signed-off-by: Hsin-Te Yuan <yuanhsinte at chromium.org>

Reviewed-by: Matthias Brugger <matthias.bgg at gmail.com>2

> ---
>   arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-fennel.dtsi | 3 +++
>   1 file changed, 3 insertions(+)
> 
> diff --git a/arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-fennel.dtsi b/arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-fennel.dtsi
> index bbe6c338f465ee7c11bfbfc30767bdb142706480..f9c1ec366b26607581c116b364cc2f80f8621a57 100644
> --- a/arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-fennel.dtsi
> +++ b/arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-fennel.dtsi
> @@ -25,3 +25,6 @@ trackpad at 2c {
>   	};
>   };
>   
> +&i2c2 {
> +	i2c-scl-internal-delay-ns = <21500>;
> +};
> 


From fshao at chromium.org  Mon Sep  9 04:14:15 2024
From: fshao at chromium.org (Fei Shao)
Date: Mon,  9 Sep 2024 19:14:15 +0800
Subject: [PATCH 02/13] arm64: dts: mediatek: mt8188: Specify CPU big core cluster
In-Reply-To: <20240909111535.528624-1-fshao@chromium.org>
References: <20240909111535.528624-1-fshao@chromium.org>
Message-ID: <20240909111535.528624-3-fshao@chromium.org>

The MT8188 SoC features two CPU clusters: one with 6 little A55 cores,
and the other with 2 big A78 cores.

Update the CPU topology to reflect the actual hardware configurations.

Signed-off-by: Fei Shao <fshao at chromium.org>
---

 arch/arm64/boot/dts/mediatek/mt8188.dtsi | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/arch/arm64/boot/dts/mediatek/mt8188.dtsi b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
index cdd2fe14effa..788dfb5484bd 100644
--- a/arch/arm64/boot/dts/mediatek/mt8188.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
@@ -203,12 +203,14 @@ core4 {
 				core5 {
 					cpu = <&cpu5>;
 				};
+			};
 
-				core6 {
+			cluster1 {
+				core0 {
 					cpu = <&cpu6>;
 				};
 
-				core7 {
+				core1 {
 					cpu = <&cpu7>;
 				};
 			};
-- 
2.46.0.469.g59c65b2a67-goog



From fshao at chromium.org  Mon Sep  9 04:14:16 2024
From: fshao at chromium.org (Fei Shao)
Date: Mon,  9 Sep 2024 19:14:16 +0800
Subject: [PATCH 03/13] arm64: dts: mediatek: mt8188: Add missing dma-ranges to soc node
In-Reply-To: <20240909111535.528624-1-fshao@chromium.org>
References: <20240909111535.528624-1-fshao@chromium.org>
Message-ID: <20240909111535.528624-4-fshao@chromium.org>

Add the missing dma-ranges property to the soc node, similar to how it
was done for MT8195 and MT8192.

This allows the entire 16GB of iova range to be used and enables
multimedia processing usages, like vcodec and MIPI camera.

Signed-off-by: Fei Shao <fshao at chromium.org>
---

 arch/arm64/boot/dts/mediatek/mt8188.dtsi | 1 +
 1 file changed, 1 insertion(+)

diff --git a/arch/arm64/boot/dts/mediatek/mt8188.dtsi b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
index 788dfb5484bd..dfbc50c878c4 100644
--- a/arch/arm64/boot/dts/mediatek/mt8188.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
@@ -888,6 +888,7 @@ soc {
 		#address-cells = <2>;
 		#size-cells = <2>;
 		compatible = "simple-bus";
+		dma-ranges = <0x0 0x0 0x0 0x0 0x4 0x0>;
 		ranges;
 
 		performance: performance-controller at 11bc10 {
-- 
2.46.0.469.g59c65b2a67-goog



From fshao at chromium.org  Mon Sep  9 04:14:17 2024
From: fshao at chromium.org (Fei Shao)
Date: Mon,  9 Sep 2024 19:14:17 +0800
Subject: [PATCH 04/13] arm64: dts: mediatek: mt8188: Move vdec1 power domain under vdec0
In-Reply-To: <20240909111535.528624-1-fshao@chromium.org>
References: <20240909111535.528624-1-fshao@chromium.org>
Message-ID: <20240909111535.528624-5-fshao@chromium.org>

There are two hardware IP blocks in MT8188 video decoder pipeline:
vdec-lat and vdec-core, which are powered by vdec0 and vdec1 power
domains respectively.

We noticed that vdec-core needs to be powered down before vdec-lat
during suspend to prevent failures. It's unclear if it's an intended
hardware design or due to power isolation glitch. But in any case, we
observed a power-off sequence here, and it can be considered as an
indirect dependency implication between the vdec0 and vdec1 domains.

Given that, update vdec1 as a sub-domain of vdec0 to enforce the
sequence. Also, use more specific clock names for both power domains.

Signed-off-by: Fei Shao <fshao at chromium.org>
---

 arch/arm64/boot/dts/mediatek/mt8188.dtsi | 22 ++++++++++++----------
 1 file changed, 12 insertions(+), 10 deletions(-)

diff --git a/arch/arm64/boot/dts/mediatek/mt8188.dtsi b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
index dfbc50c878c4..445d30eee2a1 100644
--- a/arch/arm64/boot/dts/mediatek/mt8188.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
@@ -1078,20 +1078,22 @@ power-domain at MT8188_POWER_DOMAIN_VPPSYS1 {
 							#power-domain-cells = <0>;
 						};
 
-						power-domain at MT8188_POWER_DOMAIN_VDEC1 {
-							reg = <MT8188_POWER_DOMAIN_VDEC1>;
-							clocks = <&vdecsys CLK_VDEC2_LARB1>;
-							clock-names = "ss-vdec";
-							mediatek,infracfg = <&infracfg_ao>;
-							#power-domain-cells = <0>;
-						};
-
 						power-domain at MT8188_POWER_DOMAIN_VDEC0 {
 							reg = <MT8188_POWER_DOMAIN_VDEC0>;
 							clocks = <&vdecsys_soc CLK_VDEC1_SOC_LARB1>;
-							clock-names = "ss-vdec";
+							clock-names = "ss-vdec1-soc-l1";
 							mediatek,infracfg = <&infracfg_ao>;
-							#power-domain-cells = <0>;
+							#address-cells = <1>;
+							#size-cells = <0>;
+							#power-domain-cells = <1>;
+
+							power-domain at MT8188_POWER_DOMAIN_VDEC1 {
+								reg = <MT8188_POWER_DOMAIN_VDEC1>;
+								clocks = <&vdecsys CLK_VDEC2_LARB1>;
+								clock-names = "ss-vdec2-l1";
+								mediatek,infracfg = <&infracfg_ao>;
+								#power-domain-cells = <0>;
+							};
 						};
 
 						cam_vcore: power-domain at MT8188_POWER_DOMAIN_CAM_VCORE {
-- 
2.46.0.469.g59c65b2a67-goog



From fshao at chromium.org  Mon Sep  9 04:14:18 2024
From: fshao at chromium.org (Fei Shao)
Date: Mon,  9 Sep 2024 19:14:18 +0800
Subject: [PATCH 05/13] arm64: dts: mediatek: mt8188: Add missing GCE clock names
In-Reply-To: <20240909111535.528624-1-fshao@chromium.org>
References: <20240909111535.528624-1-fshao@chromium.org>
Message-ID: <20240909111535.528624-6-fshao@chromium.org>

Add the missing clock-names property for GCE nodes to fix errors from
`make CHECK_DTBS=y mediatek/mt8188-evb.dtb`.

Signed-off-by: Fei Shao <fshao at chromium.org>
---

 arch/arm64/boot/dts/mediatek/mt8188.dtsi | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/arch/arm64/boot/dts/mediatek/mt8188.dtsi b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
index 445d30eee2a1..2900d78b7ceb 100644
--- a/arch/arm64/boot/dts/mediatek/mt8188.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
@@ -1316,6 +1316,7 @@ gce0: mailbox at 10320000 {
 			interrupts = <GIC_SPI 226 IRQ_TYPE_LEVEL_HIGH 0>;
 			#mbox-cells = <2>;
 			clocks = <&infracfg_ao CLK_INFRA_AO_GCE>;
+			clock-names = "gce";
 		};
 
 		gce1: mailbox at 10330000 {
@@ -1324,6 +1325,7 @@ gce1: mailbox at 10330000 {
 			interrupts = <GIC_SPI 228 IRQ_TYPE_LEVEL_HIGH 0>;
 			#mbox-cells = <2>;
 			clocks = <&infracfg_ao CLK_INFRA_AO_GCE2>;
+			clock-names = "gce";
 		};
 
 		scp: scp at 10500000 {
-- 
2.46.0.469.g59c65b2a67-goog



From fshao at chromium.org  Mon Sep  9 04:14:19 2024
From: fshao at chromium.org (Fei Shao)
Date: Mon,  9 Sep 2024 19:14:19 +0800
Subject: [PATCH 06/13] arm64: dts: mediatek: mt8188: Update VPPSYS node name and compatible
In-Reply-To: <20240909111535.528624-1-fshao@chromium.org>
References: <20240909111535.528624-1-fshao@chromium.org>
Message-ID: <20240909111535.528624-7-fshao@chromium.org>

Use and add "syscon" in VPPSYS node names and compatible to fix errors
from `make CHECK_DTBS=y mediatek/mt8188-evb.dtb`.

Signed-off-by: Fei Shao <fshao at chromium.org>
---

 arch/arm64/boot/dts/mediatek/mt8188.dtsi | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/arch/arm64/boot/dts/mediatek/mt8188.dtsi b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
index 2900d78b7ceb..14e51a11f688 100644
--- a/arch/arm64/boot/dts/mediatek/mt8188.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
@@ -1799,8 +1799,8 @@ mfgcfg: clock-controller at 13fbf000 {
 			#clock-cells = <1>;
 		};
 
-		vppsys0: clock-controller at 14000000 {
-			compatible = "mediatek,mt8188-vppsys0";
+		vppsys0: syscon at 14000000 {
+			compatible = "mediatek,mt8188-vppsys0", "syscon";
 			reg = <0 0x14000000 0 0x1000>;
 			#clock-cells = <1>;
 		};
@@ -1817,8 +1817,8 @@ wpesys_vpp0: clock-controller at 14e02000 {
 			#clock-cells = <1>;
 		};
 
-		vppsys1: clock-controller at 14f00000 {
-			compatible = "mediatek,mt8188-vppsys1";
+		vppsys1: syscon at 14f00000 {
+			compatible = "mediatek,mt8188-vppsys1", "syscon";
 			reg = <0 0x14f00000 0 0x1000>;
 			#clock-cells = <1>;
 		};
-- 
2.46.0.469.g59c65b2a67-goog



From fshao at chromium.org  Mon Sep  9 04:14:20 2024
From: fshao at chromium.org (Fei Shao)
Date: Mon,  9 Sep 2024 19:14:20 +0800
Subject: [PATCH 07/13] dt-bindings: power: mediatek: Add another nested power-domain layer
In-Reply-To: <20240909111535.528624-1-fshao@chromium.org>
References: <20240909111535.528624-1-fshao@chromium.org>
Message-ID: <20240909111535.528624-8-fshao@chromium.org>

The MT8188 SoC has a more in-depth power-domain tree, and the
CHECK_DTBS=y check could fail because the current MediaTek power
dt-binding is insufficient to cover its CAM_SUBA and CAM_SUBB
sub-domains.

Add one more nested power-domain layer to pass the check.

Signed-off-by: Fei Shao <fshao at chromium.org>
---

 .../devicetree/bindings/power/mediatek,power-controller.yaml  | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/Documentation/devicetree/bindings/power/mediatek,power-controller.yaml b/Documentation/devicetree/bindings/power/mediatek,power-controller.yaml
index 8985e2df8a56..a7df4041b745 100644
--- a/Documentation/devicetree/bindings/power/mediatek,power-controller.yaml
+++ b/Documentation/devicetree/bindings/power/mediatek,power-controller.yaml
@@ -54,6 +54,10 @@ patternProperties:
             patternProperties:
               "^power-domain@[0-9a-f]+$":
                 $ref: "#/$defs/power-domain-node"
+                patternProperties:
+                  "^power-domain@[0-9a-f]+$":
+                    $ref: "#/$defs/power-domain-node"
+                    unevaluatedProperties: false
                 unevaluatedProperties: false
             unevaluatedProperties: false
         unevaluatedProperties: false
-- 
2.46.0.469.g59c65b2a67-goog



From fshao at chromium.org  Mon Sep  9 04:14:21 2024
From: fshao at chromium.org (Fei Shao)
Date: Mon,  9 Sep 2024 19:14:21 +0800
Subject: [PATCH 08/13] arm64: dts: mediatek: mt8188: Add SMI/LARB/IOMMU support
In-Reply-To: <20240909111535.528624-1-fshao@chromium.org>
References: <20240909111535.528624-1-fshao@chromium.org>
Message-ID: <20240909111535.528624-9-fshao@chromium.org>

Local Arbiter (LARB) is a component of Smart Multimedia Interface (SMI)
that supports IOMMU on the MediaTek SoCs.

Add the following nodes for memory management support on MT8188 SoC:
- one Infra IOMMU
- two Multimedia (MM) IOMMUs of VDO and VPP
- corresponding SMI common and LARB nodes of the MM IOMMUs

Signed-off-by: Fei Shao <fshao at chromium.org>
---

 arch/arm64/boot/dts/mediatek/mt8188.dtsi | 169 +++++++++++++++++++++++
 1 file changed, 169 insertions(+)

diff --git a/arch/arm64/boot/dts/mediatek/mt8188.dtsi b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
index 14e51a11f688..7e3a90c1a173 100644
--- a/arch/arm64/boot/dts/mediatek/mt8188.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
@@ -9,6 +9,7 @@
 #include <dt-bindings/interrupt-controller/arm-gic.h>
 #include <dt-bindings/interrupt-controller/irq.h>
 #include <dt-bindings/mailbox/mediatek,mt8188-gce.h>
+#include <dt-bindings/memory/mediatek,mt8188-memory-port.h>
 #include <dt-bindings/phy/phy.h>
 #include <dt-bindings/pinctrl/mediatek,mt8188-pinfunc.h>
 #include <dt-bindings/power/mediatek,mt8188-power.h>
@@ -1310,6 +1311,13 @@ pwrap: pwrap at 10024000 {
 			clock-names = "spi", "wrap";
 		};
 
+		infra_iommu: iommu at 10315000 {
+			compatible = "mediatek,mt8188-iommu-infra";
+			reg = <0 0x10315000 0 0x1000>;
+			interrupts = <GIC_SPI 795 IRQ_TYPE_LEVEL_HIGH 0>;
+			#iommu-cells = <1>;
+		};
+
 		gce0: mailbox at 10320000 {
 			compatible = "mediatek,mt8188-gce";
 			reg = <0 0x10320000 0 0x4000>;
@@ -1805,6 +1813,37 @@ vppsys0: syscon at 14000000 {
 			#clock-cells = <1>;
 		};
 
+		vpp_smi_common: smi at 14012000 {
+			compatible = "mediatek,mt8188-smi-common-vpp";
+			reg = <0 0x14012000 0 0x1000>;
+			clocks = <&vppsys0 CLK_VPP0_SMI_COMMON_LARB4>,
+				 <&vppsys0 CLK_VPP0_SMI_SUB_COMMON_REORDER>;
+			clock-names = "apb", "smi";
+			power-domains = <&spm MT8188_POWER_DOMAIN_VPPSYS0>;
+		};
+
+		larb4: smi at 14013000 {
+			compatible = "mediatek,mt8188-smi-larb";
+			reg = <0 0x14013000 0 0x1000>;
+			clocks = <&vppsys0 CLK_VPP0_SMI_COMMON_LARB4>,
+				 <&vppsys0 CLK_VPP0_SMI_COMMON_LARB4>;
+			clock-names = "apb", "smi";
+			power-domains = <&spm MT8188_POWER_DOMAIN_VPPSYS0>;
+			mediatek,larb-id = <SMI_L4_ID>;
+			mediatek,smi = <&vpp_smi_common>;
+		};
+
+		vpp_iommu: iommu at 14018000 {
+			compatible = "mediatek,mt8188-iommu-vpp";
+			reg = <0 0x14018000 0 0x5000>;
+			clocks = <&vppsys0 CLK_VPP0_SMI_IOMMU>;
+			clock-names = "bclk";
+			interrupts = <GIC_SPI 594 IRQ_TYPE_LEVEL_HIGH 0>;
+			power-domains = <&spm MT8188_POWER_DOMAIN_VPPSYS0>;
+			#iommu-cells = <1>;
+			mediatek,larbs = <&larb1 &larb3 &larb4 &larb6 &larb7 &larb23>;
+		};
+
 		wpesys: clock-controller at 14e00000 {
 			compatible = "mediatek,mt8188-wpesys";
 			reg = <0 0x14e00000 0 0x1000>;
@@ -1817,12 +1856,45 @@ wpesys_vpp0: clock-controller at 14e02000 {
 			#clock-cells = <1>;
 		};
 
+		larb7: smi at 14e04000 {
+			compatible = "mediatek,mt8188-smi-larb";
+			reg = <0 0x14e04000 0 0x1000>;
+			clocks = <&wpesys CLK_WPE_TOP_SMI_LARB7>,
+				 <&wpesys CLK_WPE_TOP_SMI_LARB7>;
+			clock-names = "apb", "smi";
+			power-domains = <&spm MT8188_POWER_DOMAIN_WPE>;
+			mediatek,larb-id = <SMI_L7_ID>;
+			mediatek,smi = <&vpp_smi_common>;
+		};
+
 		vppsys1: syscon at 14f00000 {
 			compatible = "mediatek,mt8188-vppsys1", "syscon";
 			reg = <0 0x14f00000 0 0x1000>;
 			#clock-cells = <1>;
 		};
 
+		larb5: smi at 14f02000 {
+			compatible = "mediatek,mt8188-smi-larb";
+			reg = <0 0x14f02000 0 0x1000>;
+			clocks = <&vppsys1 CLK_VPP1_GALS5>,
+				 <&vppsys1 CLK_VPP1_LARB5>;
+			clock-names = "apb", "smi";
+			power-domains = <&spm MT8188_POWER_DOMAIN_VPPSYS1>;
+			mediatek,larb-id = <SMI_L5_ID>;
+			mediatek,smi = <&vdo_smi_common>;
+		};
+
+		larb6: smi at 14f03000 {
+			compatible = "mediatek,mt8188-smi-larb";
+			reg = <0 0x14f03000 0 0x1000>;
+			clocks = <&vppsys1 CLK_VPP1_GALS6>,
+				 <&vppsys1 CLK_VPP1_LARB6>;
+			clock-names = "apb", "smi";
+			power-domains = <&spm MT8188_POWER_DOMAIN_VPPSYS1>;
+			mediatek,larb-id = <SMI_L6_ID>;
+			mediatek,smi = <&vpp_smi_common>;
+		};
+
 		imgsys: clock-controller at 15000000 {
 			compatible = "mediatek,mt8188-imgsys";
 			reg = <0 0x15000000 0 0x1000>;
@@ -1901,12 +1973,34 @@ ccusys: clock-controller at 17200000 {
 			#clock-cells = <1>;
 		};
 
+		larb23: smi at 1800d000 {
+			compatible = "mediatek,mt8188-smi-larb";
+			reg = <0 0x1800d000 0 0x1000>;
+			clocks = <&vdecsys_soc CLK_VDEC1_SOC_LARB1>,
+				 <&vdecsys_soc CLK_VDEC1_SOC_LARB1>;
+			clock-names = "apb", "smi";
+			power-domains = <&spm MT8188_POWER_DOMAIN_VDEC0>;
+			mediatek,larb-id = <SMI_L23_ID>;
+			mediatek,smi = <&vpp_smi_common>;
+		};
+
 		vdecsys_soc: clock-controller at 1800f000 {
 			compatible = "mediatek,mt8188-vdecsys-soc";
 			reg = <0 0x1800f000 0 0x1000>;
 			#clock-cells = <1>;
 		};
 
+		larb21: smi at 1802e000 {
+			compatible = "mediatek,mt8188-smi-larb";
+			reg = <0 0x1802e000 0 0x1000>;
+			clocks = <&vdecsys CLK_VDEC2_LARB1>,
+				 <&vdecsys CLK_VDEC2_LARB1>;
+			clock-names = "apb", "smi";
+			power-domains = <&spm MT8188_POWER_DOMAIN_VDEC1>;
+			mediatek,larb-id = <SMI_L21_ID>;
+			mediatek,smi = <&vdo_smi_common>;
+		};
+
 		vdecsys: clock-controller at 1802f000 {
 			compatible = "mediatek,mt8188-vdecsys";
 			reg = <0 0x1802f000 0 0x1000>;
@@ -1919,6 +2013,17 @@ vencsys: clock-controller at 1a000000 {
 			#clock-cells = <1>;
 		};
 
+		larb19: smi at 1a010000 {
+			compatible = "mediatek,mt8188-smi-larb";
+			reg = <0 0x1a010000 0 0x1000>;
+			clocks = <&vencsys CLK_VENC1_VENC>,
+				 <&vencsys CLK_VENC1_VENC>;
+			clock-names = "apb", "smi";
+			power-domains = <&spm MT8188_POWER_DOMAIN_VENC>;
+			mediatek,larb-id = <SMI_L19_ID>;
+			mediatek,smi = <&vdo_smi_common>;
+		};
+
 		vdosys0: syscon at 1c01d000 {
 			compatible = "mediatek,mt8188-vdosys0", "syscon";
 			reg = <0 0x1c01d000 0 0x1000>;
@@ -1927,6 +2032,48 @@ vdosys0: syscon at 1c01d000 {
 			mediatek,gce-client-reg = <&gce0 SUBSYS_1c01XXXX 0xd000 0x1000>;
 		};
 
+		larb0: smi at 1c022000 {
+			compatible = "mediatek,mt8188-smi-larb";
+			reg = <0 0x1c022000 0 0x1000>;
+			clocks = <&vdosys0 CLK_VDO0_SMI_LARB>,
+				 <&vdosys0 CLK_VDO0_SMI_LARB>;
+			clock-names = "apb", "smi";
+			power-domains = <&spm MT8188_POWER_DOMAIN_VDOSYS0>;
+			mediatek,larb-id = <SMI_L0_ID>;
+			mediatek,smi = <&vdo_smi_common>;
+		};
+
+		larb1: smi at 1c023000 {
+			compatible = "mediatek,mt8188-smi-larb";
+			reg = <0 0x1c023000 0 0x1000>;
+			clocks = <&vdosys0 CLK_VDO0_SMI_LARB>,
+				 <&vdosys0 CLK_VDO0_SMI_LARB>;
+			clock-names = "apb", "smi";
+			power-domains = <&spm MT8188_POWER_DOMAIN_VDOSYS0>;
+			mediatek,larb-id = <SMI_L1_ID>;
+			mediatek,smi = <&vpp_smi_common>;
+		};
+
+		vdo_smi_common: smi at 1c024000 {
+			compatible = "mediatek,mt8188-smi-common-vdo";
+			reg = <0 0x1c024000 0 0x1000>;
+			clocks = <&vdosys0 CLK_VDO0_SMI_COMMON>,
+				 <&vdosys0 CLK_VDO0_SMI_GALS>;
+			clock-names = "apb", "smi";
+			power-domains = <&spm MT8188_POWER_DOMAIN_VDOSYS0>;
+		};
+
+		vdo_iommu: iommu at 1c028000 {
+			compatible = "mediatek,mt8188-iommu-vdo";
+			reg = <0 0x1c028000 0 0x5000>;
+			clocks = <&vdosys0 CLK_VDO0_SMI_IOMMU>;
+			clock-names = "bclk";
+			interrupts = <GIC_SPI 673 IRQ_TYPE_LEVEL_HIGH 0>;
+			power-domains = <&spm MT8188_POWER_DOMAIN_VDOSYS0>;
+			#iommu-cells = <1>;
+			mediatek,larbs = <&larb0 &larb2 &larb5 &larb19 &larb21>;
+		};
+
 		vdosys1: syscon at 1c100000 {
 			compatible = "mediatek,mt8188-vdosys1", "syscon";
 			reg = <0 0x1c100000 0 0x1000>;
@@ -1935,5 +2082,27 @@ vdosys1: syscon at 1c100000 {
 			mboxes = <&gce0 1 CMDQ_THR_PRIO_4>;
 			mediatek,gce-client-reg = <&gce0 SUBSYS_1c10XXXX 0 0x1000>;
 		};
+
+		larb2: smi at 1c102000 {
+			compatible = "mediatek,mt8188-smi-larb";
+			reg = <0 0x1c102000 0 0x1000>;
+			clocks = <&vdosys1 CLK_VDO1_SMI_LARB2>,
+				 <&vdosys1 CLK_VDO1_SMI_LARB2>;
+			clock-names = "apb", "smi";
+			power-domains = <&spm MT8188_POWER_DOMAIN_VDOSYS1>;
+			mediatek,larb-id = <SMI_L2_ID>;
+			mediatek,smi = <&vdo_smi_common>;
+		};
+
+		larb3: smi at 1c103000 {
+			compatible = "mediatek,mt8188-smi-larb";
+			reg = <0 0x1c103000 0 0x1000>;
+			clocks = <&vdosys1 CLK_VDO1_SMI_LARB3>,
+				 <&vdosys1 CLK_VDO1_SMI_LARB3>;
+			clock-names = "apb", "smi";
+			power-domains = <&spm MT8188_POWER_DOMAIN_VDOSYS1>;
+			mediatek,larb-id = <SMI_L3_ID>;
+			mediatek,smi = <&vpp_smi_common>;
+		};
 	};
 };
-- 
2.46.0.469.g59c65b2a67-goog



From fshao at chromium.org  Mon Sep  9 04:14:22 2024
From: fshao at chromium.org (Fei Shao)
Date: Mon,  9 Sep 2024 19:14:22 +0800
Subject: [PATCH 09/13] arm64: dts: mediatek: mt8188: Add PWM nodes for display backlight
In-Reply-To: <20240909111535.528624-1-fshao@chromium.org>
References: <20240909111535.528624-1-fshao@chromium.org>
Message-ID: <20240909111535.528624-10-fshao@chromium.org>

Add two hardware PWM nodes for display backlight usage on MT8188 SoC,
and mark them as disabled by default.
Boards can enable the necessary PWM node as needed.

Signed-off-by: Fei Shao <fshao at chromium.org>
---

 arch/arm64/boot/dts/mediatek/mt8188.dtsi | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

diff --git a/arch/arm64/boot/dts/mediatek/mt8188.dtsi b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
index 7e3a90c1a173..4593bc1fb5b7 100644
--- a/arch/arm64/boot/dts/mediatek/mt8188.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
@@ -1425,6 +1425,28 @@ lvts_ap: thermal-sensor at 1100b000 {
 			#thermal-sensor-cells = <1>;
 		};
 
+		disp_pwm0: pwm at 1100e000 {
+			compatible = "mediatek,mt8188-disp-pwm", "mediatek,mt8183-disp-pwm";
+			reg = <0 0x1100e000 0 0x1000>;
+			clocks = <&topckgen CLK_TOP_DISP_PWM0>,
+				 <&infracfg_ao CLK_INFRA_AO_DISP_PWM>;
+			clock-names = "main", "mm";
+			interrupts = <GIC_SPI 203 IRQ_TYPE_LEVEL_HIGH 0>;
+			#pwm-cells = <2>;
+			status = "disabled";
+		};
+
+		disp_pwm1: pwm at 1100f000 {
+			compatible = "mediatek,mt8188-disp-pwm", "mediatek,mt8183-disp-pwm";
+			reg = <0 0x1100f000 0 0x1000>;
+			clocks = <&topckgen CLK_TOP_DISP_PWM1>,
+				 <&infracfg_ao CLK_INFRA_AO_DISP_PWM1>;
+			clock-names = "main", "mm";
+			interrupts = <GIC_SPI 793 IRQ_TYPE_LEVEL_HIGH 0>;
+			#pwm-cells = <2>;
+			status = "disabled";
+		};
+
 		spi1: spi at 11010000 {
 			compatible = "mediatek,mt8188-spi-ipm", "mediatek,spi-ipm";
 			#address-cells = <1>;
-- 
2.46.0.469.g59c65b2a67-goog



From fshao at chromium.org  Mon Sep  9 04:14:23 2024
From: fshao at chromium.org (Fei Shao)
Date: Mon,  9 Sep 2024 19:14:23 +0800
Subject: [PATCH 10/13] dt-bindings: spmi: spmi-mtk-pmif: Add compatible for MT8188
In-Reply-To: <20240909111535.528624-1-fshao@chromium.org>
References: <20240909111535.528624-1-fshao@chromium.org>
Message-ID: <20240909111535.528624-11-fshao@chromium.org>

Add compatible string for the SPMI block on MT8188 SoC, which is
compatible with the one used on MT8195.

Signed-off-by: Fei Shao <fshao at chromium.org>
---

 Documentation/devicetree/bindings/spmi/mtk,spmi-mtk-pmif.yaml | 1 +
 1 file changed, 1 insertion(+)

diff --git a/Documentation/devicetree/bindings/spmi/mtk,spmi-mtk-pmif.yaml b/Documentation/devicetree/bindings/spmi/mtk,spmi-mtk-pmif.yaml
index ac99883a3f29..7f0be0ac644a 100644
--- a/Documentation/devicetree/bindings/spmi/mtk,spmi-mtk-pmif.yaml
+++ b/Documentation/devicetree/bindings/spmi/mtk,spmi-mtk-pmif.yaml
@@ -25,6 +25,7 @@ properties:
       - items:
           - enum:
               - mediatek,mt8186-spmi
+              - mediatek,mt8188-spmi
           - const: mediatek,mt8195-spmi
 
   reg:
-- 
2.46.0.469.g59c65b2a67-goog



From fshao at chromium.org  Mon Sep  9 04:14:24 2024
From: fshao at chromium.org (Fei Shao)
Date: Mon,  9 Sep 2024 19:14:24 +0800
Subject: [PATCH 11/13] arm64: dts: mediatek: mt8188: Add SPMI support for PMIC control
In-Reply-To: <20240909111535.528624-1-fshao@chromium.org>
References: <20240909111535.528624-1-fshao@chromium.org>
Message-ID: <20240909111535.528624-12-fshao@chromium.org>

Add SPMI node for PMIC control on MT8188 SoC.

Signed-off-by: Fei Shao <fshao at chromium.org>
---

 arch/arm64/boot/dts/mediatek/mt8188.dtsi | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/arch/arm64/boot/dts/mediatek/mt8188.dtsi b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
index 4593bc1fb5b7..08f13ccefcfc 100644
--- a/arch/arm64/boot/dts/mediatek/mt8188.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
@@ -1311,6 +1311,18 @@ pwrap: pwrap at 10024000 {
 			clock-names = "spi", "wrap";
 		};
 
+		spmi: spmi at 10027000 {
+			compatible = "mediatek,mt8188-spmi", "mediatek,mt8195-spmi";
+			reg = <0 0x10027000 0 0x000e00>, <0 0x10029000 0 0x000100>;
+			reg-names = "pmif", "spmimst";
+			assigned-clocks = <&topckgen CLK_TOP_SPMI_M_MST>;
+			assigned-clock-parents = <&topckgen CLK_TOP_ULPOSC1_D10>;
+			clocks = <&infracfg_ao CLK_INFRA_AO_PMIC_AP>,
+				 <&infracfg_ao CLK_INFRA_AO_PMIC_TMR>,
+				 <&topckgen CLK_TOP_SPMI_M_MST>;
+			clock-names = "pmif_sys_ck", "pmif_tmr_ck", "spmimst_clk_mux";
+		};
+
 		infra_iommu: iommu at 10315000 {
 			compatible = "mediatek,mt8188-iommu-infra";
 			reg = <0 0x10315000 0 0x1000>;
-- 
2.46.0.469.g59c65b2a67-goog



From fshao at chromium.org  Mon Sep  9 04:14:25 2024
From: fshao at chromium.org (Fei Shao)
Date: Mon,  9 Sep 2024 19:14:25 +0800
Subject: [PATCH 12/13] dt-bindings: mailbox: mtk,adsp-mbox: Add compatible for MT8188
In-Reply-To: <20240909111535.528624-1-fshao@chromium.org>
References: <20240909111535.528624-1-fshao@chromium.org>
Message-ID: <20240909111535.528624-13-fshao@chromium.org>

Add compatible string for ADSP mailbox on MT8188 SoC, which is
compatible with the one used on MT8186.

Signed-off-by: Fei Shao <fshao at chromium.org>
---

 .../devicetree/bindings/mailbox/mtk,adsp-mbox.yaml   | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

diff --git a/Documentation/devicetree/bindings/mailbox/mtk,adsp-mbox.yaml b/Documentation/devicetree/bindings/mailbox/mtk,adsp-mbox.yaml
index 72c1d9e82c89..8a1369df4ecb 100644
--- a/Documentation/devicetree/bindings/mailbox/mtk,adsp-mbox.yaml
+++ b/Documentation/devicetree/bindings/mailbox/mtk,adsp-mbox.yaml
@@ -17,9 +17,15 @@ description: |
 
 properties:
   compatible:
-    enum:
-      - mediatek,mt8195-adsp-mbox
-      - mediatek,mt8186-adsp-mbox
+    oneOf:
+      - enum:
+          - mediatek,mt8186-adsp-mbox
+          - mediatek,mt8195-adsp-mbox
+      - items:
+          - enum:
+              - mediatek,mt8188-adsp-mbox
+          - const: mediatek,mt8186-adsp-mbox
+
 
   "#mbox-cells":
     const: 0
-- 
2.46.0.469.g59c65b2a67-goog



From fshao at chromium.org  Mon Sep  9 04:14:26 2024
From: fshao at chromium.org (Fei Shao)
Date: Mon,  9 Sep 2024 19:14:26 +0800
Subject: [PATCH 13/13] arm64: dts: mediatek: mt8188: Add audio support
In-Reply-To: <20240909111535.528624-1-fshao@chromium.org>
References: <20240909111535.528624-1-fshao@chromium.org>
Message-ID: <20240909111535.528624-14-fshao@chromium.org>

Add following nodes to support audio enablement on MT8188 SoC:
- sound card
- audio controller (AFE)
- audio DSP and its associated mailboxes

Signed-off-by: Fei Shao <fshao at chromium.org>
---

 arch/arm64/boot/dts/mediatek/mt8188.dtsi | 96 ++++++++++++++++++++++++
 1 file changed, 96 insertions(+)

diff --git a/arch/arm64/boot/dts/mediatek/mt8188.dtsi b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
index 08f13ccefcfc..d99447a01a60 100644
--- a/arch/arm64/boot/dts/mediatek/mt8188.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
@@ -431,6 +431,11 @@ psci {
 		method = "smc";
 	};
 
+	sound: sound {
+		mediatek,platform = <&afe>;
+		status = "disabled";
+	};
+
 	thermal_zones: thermal-zones {
 		cpu-little0-thermal {
 			polling-delay = <1000>;
@@ -1356,6 +1361,97 @@ scp: scp at 10500000 {
 			interrupts = <GIC_SPI 462 IRQ_TYPE_LEVEL_HIGH 0>;
 		};
 
+		afe: audio-controller at 10b10000 {
+			compatible = "mediatek,mt8188-afe";
+			reg = <0 0x10b10000 0 0x10000>;
+			assigned-clocks = <&topckgen CLK_TOP_A1SYS_HP>;
+			assigned-clock-parents =  <&clk26m>;
+			clocks = <&clk26m>,
+				 <&apmixedsys CLK_APMIXED_APLL1>,
+				 <&apmixedsys CLK_APMIXED_APLL2>,
+				 <&topckgen CLK_TOP_APLL12_CK_DIV0>,
+				 <&topckgen CLK_TOP_APLL12_CK_DIV1>,
+				 <&topckgen CLK_TOP_APLL12_CK_DIV2>,
+				 <&topckgen CLK_TOP_APLL12_CK_DIV3>,
+				 <&topckgen CLK_TOP_APLL12_CK_DIV9>,
+				 <&topckgen CLK_TOP_A1SYS_HP>,
+				 <&topckgen CLK_TOP_AUD_INTBUS>,
+				 <&topckgen CLK_TOP_AUDIO_H>,
+				 <&topckgen CLK_TOP_AUDIO_LOCAL_BUS>,
+				 <&topckgen CLK_TOP_DPTX>,
+				 <&topckgen CLK_TOP_I2SO1>,
+				 <&topckgen CLK_TOP_I2SO2>,
+				 <&topckgen CLK_TOP_I2SI1>,
+				 <&topckgen CLK_TOP_I2SI2>,
+				 <&adsp_audio26m CLK_AUDIODSP_AUDIO26M>,
+				 <&topckgen CLK_TOP_APLL1_D4>,
+				 <&topckgen CLK_TOP_APLL2_D4>,
+				 <&topckgen CLK_TOP_APLL12_CK_DIV4>,
+				 <&topckgen CLK_TOP_A2SYS>,
+				 <&topckgen CLK_TOP_AUD_IEC>;
+			clock-names = "clk26m",
+				      "apll1",
+				      "apll2",
+				      "apll12_div0",
+				      "apll12_div1",
+				      "apll12_div2",
+				      "apll12_div3",
+				      "apll12_div9",
+				      "top_a1sys_hp",
+				      "top_aud_intbus",
+				      "top_audio_h",
+				      "top_audio_local_bus",
+				      "top_dptx",
+				      "top_i2so1",
+				      "top_i2so2",
+				      "top_i2si1",
+				      "top_i2si2",
+				      "adsp_audio_26m",
+				      "apll1_d4",
+				      "apll2_d4",
+				      "apll12_div4",
+				      "top_a2sys",
+				      "top_aud_iec";
+			interrupts = <GIC_SPI 822 IRQ_TYPE_LEVEL_HIGH 0>;
+			power-domains = <&spm MT8188_POWER_DOMAIN_AUDIO>;
+			resets = <&watchdog 14>;
+			reset-names = "audiosys";
+			mediatek,infracfg = <&infracfg_ao>;
+			mediatek,topckgen = <&topckgen>;
+			status = "disabled";
+		};
+
+		adsp: adsp at 10b80000 {
+			compatible = "mediatek,mt8188-dsp";
+			reg = <0 0x10b80000 0 0x2000>,
+			      <0 0x10d00000 0 0x80000>,
+			      <0 0x10b8b000 0 0x100>,
+			      <0 0x10b8f000 0 0x1000>;
+			reg-names = "cfg", "sram", "sec", "bus";
+			assigned-clocks = <&topckgen CLK_TOP_ADSP>;
+			clocks = <&topckgen CLK_TOP_ADSP>,
+				 <&topckgen CLK_TOP_AUDIO_LOCAL_BUS>;
+			clock-names = "audiodsp", "adsp_bus";
+			mboxes = <&adsp_mailbox0>, <&adsp_mailbox1>;
+			mbox-names = "rx", "tx";
+			power-domains = <&spm MT8188_POWER_DOMAIN_ADSP>;
+			status = "disabled";
+		};
+
+		adsp_mailbox0: mailbox at 10b86000 {
+			compatible = "mediatek,mt8188-adsp-mbox", "mediatek,mt8186-adsp-mbox";
+			reg = <0 0x10b86100 0 0x1000>;
+			interrupts = <GIC_SPI 478 IRQ_TYPE_LEVEL_HIGH 0>;
+			#mbox-cells = <0>;
+		};
+
+		adsp_mailbox1: mailbox at 10b87000 {
+			compatible = "mediatek,mt8188-adsp-mbox", "mediatek,mt8186-adsp-mbox";
+			reg = <0 0x10b87100 0 0x1000>;
+			interrupts = <GIC_SPI 479 IRQ_TYPE_LEVEL_HIGH 0>;
+			#mbox-cells = <0>;
+		};
+
 		adsp_audio26m: clock-controller at 10b91100 {
 			compatible = "mediatek,mt8188-adsp-audio26m";
 			reg = <0 0x10b91100 0 0x100>;
-- 
2.46.0.469.g59c65b2a67-goog



From matthias.bgg at gmail.com  Mon Sep  9 04:18:23 2024
From: matthias.bgg at gmail.com (Matthias Brugger)
Date: Mon, 9 Sep 2024 13:18:23 +0200
Subject: [PATCH 2/4] arm64: dts: mt8183: burnet: add i2c2's
 i2c-scl-internal-delay-ns
In-Reply-To: <20240909-i2c-delay-v1-2-4b406617a5f5@chromium.org>
References: <20240909-i2c-delay-v1-0-4b406617a5f5@chromium.org>
 <20240909-i2c-delay-v1-2-4b406617a5f5@chromium.org>
Message-ID: <39eeb382-1354-406f-800c-ac5db02f8469@gmail.com>



On 09/09/2024 09:29, Hsin-Te Yuan wrote:
> From: Daolong Zhu <jg_daolongzhu at mediatek.corp-partner.google.com>
> 
> Add i2c2's i2c-scl-internal-delay-ns.
> 
> Fixes: dd6e3b06214f ("arm64: dts: mt8183: Add kukui-jacuzzi-burnet board")
> Signed-off-by: Hsin-Te Yuan <yuanhsinte at chromium.org>

Reviewed-by: Matthias Brugger <matthias.bgg at gmail.com>

> ---
>   arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-burnet.dts | 3 +++
>   1 file changed, 3 insertions(+)
> 
> diff --git a/arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-burnet.dts b/arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-burnet.dts
> index 19c1e2bee494c98c0db87308494713a26e304cd2..20b71f2e7159ade7e7d2135aabe6587c8f8d64de 100644
> --- a/arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-burnet.dts
> +++ b/arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-burnet.dts
> @@ -30,3 +30,6 @@ touchscreen at 2c {
>   	};
>   };
>   
> +&i2c2 {
> +	i2c-scl-internal-delay-ns = <4100>;
> +};
> 


From matthias.bgg at gmail.com  Mon Sep  9 04:18:33 2024
From: matthias.bgg at gmail.com (Matthias Brugger)
Date: Mon, 9 Sep 2024 13:18:33 +0200
Subject: [PATCH 3/4] arm64: dts: mt8183: cozmo: add i2c2's
 i2c-scl-internal-delay-ns
In-Reply-To: <20240909-i2c-delay-v1-3-4b406617a5f5@chromium.org>
References: <20240909-i2c-delay-v1-0-4b406617a5f5@chromium.org>
 <20240909-i2c-delay-v1-3-4b406617a5f5@chromium.org>
Message-ID: <7d1b36fc-463c-47d7-b5e2-ddca744e1c05@gmail.com>



On 09/09/2024 09:29, Hsin-Te Yuan wrote:
> From: Daolong Zhu <jg_daolongzhu at mediatek.corp-partner.google.com>
> 
> Add i2c2's i2c-scl-internal-delay-ns.
> 
> Fixes: 52e84f233459 ("arm64: dts: mt8183: Add kukui-jacuzzi-cozmo board")
> Signed-off-by: Hsin-Te Yuan <yuanhsinte at chromium.org>

Reviewed-by: Matthias Brugger <matthias.bgg at gmail.com>

> ---
>   arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-cozmo.dts | 2 ++
>   1 file changed, 2 insertions(+)
> 
> diff --git a/arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-cozmo.dts b/arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-cozmo.dts
> index f34964afe39b5353de7b17e82d14d1fba88551ab..83bbcfe620835ab6d34cd2f4c2183fbdf11d0909 100644
> --- a/arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-cozmo.dts
> +++ b/arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-cozmo.dts
> @@ -18,6 +18,8 @@ &i2c_tunnel {
>   };
>   
>   &i2c2 {
> +	i2c-scl-internal-delay-ns = <25000>;
> +
>   	trackpad at 2c {
>   		compatible = "hid-over-i2c";
>   		reg = <0x2c>;
> 


From matthias.bgg at gmail.com  Mon Sep  9 04:18:44 2024
From: matthias.bgg at gmail.com (Matthias Brugger)
Date: Mon, 9 Sep 2024 13:18:44 +0200
Subject: [PATCH 4/4] arm64: dts: mt8183: Damu: add i2c2's
 i2c-scl-internal-delay-ns
In-Reply-To: <20240909-i2c-delay-v1-4-4b406617a5f5@chromium.org>
References: <20240909-i2c-delay-v1-0-4b406617a5f5@chromium.org>
 <20240909-i2c-delay-v1-4-4b406617a5f5@chromium.org>
Message-ID: <af3bf83e-8bd5-4349-8647-a2cbafb5d7ec@gmail.com>



On 09/09/2024 09:29, Hsin-Te Yuan wrote:
> From: Daolong Zhu <jg_daolongzhu at mediatek.corp-partner.google.com>
> 
> Add i2c2's i2c-scl-internal-delay-ns.
> 
> Fixes: cabc71b08eb5 ("arm64: dts: mt8183: Add kukui-jacuzzi-damu board")
> Signed-off-by: Hsin-Te Yuan <yuanhsinte at chromium.org>

Reviewed-by: Matthias Brugger <matthias.bgg at gmail.com>

> ---
>   arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-damu.dts | 3 +++
>   1 file changed, 3 insertions(+)
> 
> diff --git a/arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-damu.dts b/arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-damu.dts
> index 0b45aee2e29953b6117b462034a00dff2596b9ff..65860b33c01fe832f3a4b2e21d24ea6b4f0cba2b 100644
> --- a/arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-damu.dts
> +++ b/arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-damu.dts
> @@ -30,3 +30,6 @@ &qca_wifi {
>   	qcom,ath10k-calibration-variant = "GO_DAMU";
>   };
>   
> +&i2c2 {
> +	i2c-scl-internal-delay-ns = <20000>;
> +};
> 


From krzk at kernel.org  Mon Sep  9 04:41:00 2024
From: krzk at kernel.org (Krzysztof Kozlowski)
Date: Mon, 9 Sep 2024 13:41:00 +0200
Subject: [PATCH 06/13] arm64: dts: mediatek: mt8188: Update VPPSYS node
 name and compatible
In-Reply-To: <20240909111535.528624-7-fshao@chromium.org>
References: <20240909111535.528624-1-fshao@chromium.org>
 <20240909111535.528624-7-fshao@chromium.org>
Message-ID: <11bc2522-bc10-4dcf-8142-708b57d181cf@kernel.org>

On 09/09/2024 13:14, Fei Shao wrote:
> Use and add "syscon" in VPPSYS node names and compatible to fix errors
> from `make CHECK_DTBS=y mediatek/mt8188-evb.dtb`.
> 
> Signed-off-by: Fei Shao <fshao at chromium.org>
> ---
> 
>  arch/arm64/boot/dts/mediatek/mt8188.dtsi | 8 ++++----
>  1 file changed, 4 insertions(+), 4 deletions(-)
> 
> diff --git a/arch/arm64/boot/dts/mediatek/mt8188.dtsi b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
> index 2900d78b7ceb..14e51a11f688 100644
> --- a/arch/arm64/boot/dts/mediatek/mt8188.dtsi
> +++ b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
> @@ -1799,8 +1799,8 @@ mfgcfg: clock-controller at 13fbf000 {
>  			#clock-cells = <1>;
>  		};
>  
> -		vppsys0: clock-controller at 14000000 {
> -			compatible = "mediatek,mt8188-vppsys0";
> +		vppsys0: syscon at 14000000 {
> +			compatible = "mediatek,mt8188-vppsys0", "syscon";

If this was working before, it looks like this is not a syscon and
bindings need to be fixed.

Best regards,
Krzysztof



From angelogioacchino.delregno at collabora.com  Mon Sep  9 04:41:56 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Mon, 9 Sep 2024 11:41:56 +0000
Subject: [PATCH 2/2] arm64: dts: mt8183: kukui: Fix the address of eeprom
 at i2c4
In-Reply-To: <20240909-eeprom-v1-2-1ed2bc5064f4@chromium.org>
References: <20240909-eeprom-v1-0-1ed2bc5064f4@chromium.org>
 <20240909-eeprom-v1-2-1ed2bc5064f4@chromium.org>
Message-ID: <01020191d6972b34-b6f0e6f8-bc74-4360-ba9e-d934b2baac16-000000@eu-west-1.amazonses.com>

Il 09/09/24 10:33, Hsin-Te Yuan ha scritto:
> The address of eeprom should be 50.
> 
> Fixes: ff33d889567e ("arm64: dts: mt8183: Add kukui kodama board")
> Fixes: d1eaf77f2c66 ("arm64: dts: mt8183: Add kukui kakadu board")
> Signed-off-by: Hsin-Te Yuan <yuanhsinte at chromium.org>

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>




From krzk at kernel.org  Mon Sep  9 04:42:34 2024
From: krzk at kernel.org (Krzysztof Kozlowski)
Date: Mon, 9 Sep 2024 13:42:34 +0200
Subject: [PATCH 01/13] arm64: dts: mediatek: mt8188: Add CPU performance
 controller for CPUFreq
In-Reply-To: <20240909111535.528624-2-fshao@chromium.org>
References: <20240909111535.528624-1-fshao@chromium.org>
 <20240909111535.528624-2-fshao@chromium.org>
Message-ID: <b5b540f7-d26f-4529-8066-506aa02a0654@kernel.org>

On 09/09/2024 13:14, Fei Shao wrote:
> Add performance controller node and performance-domains properties for
> CPUFreq support on MT8188 SoC.
> 
> Signed-off-by: Fei Shao <fshao at chromium.org>
> ---

Order of these patches is not helping. You mix new features with fixes
and bindings.

Please split fixes from the rest. Bindings are expected to be first in
the series.

Best regards,
Krzysztof



From angelogioacchino.delregno at collabora.com  Mon Sep  9 04:44:05 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Mon, 9 Sep 2024 11:44:05 +0000
Subject: [PATCH 0/4] arm64: dts: mt8183: Add i2c-scl-internal-delay-ns
In-Reply-To: <20240909-i2c-delay-v1-0-4b406617a5f5@chromium.org>
References: <20240909-i2c-delay-v1-0-4b406617a5f5@chromium.org>
Message-ID: <01020191d6992288-f834e61d-ad1d-4de7-90b4-77525530532c-000000@eu-west-1.amazonses.com>

Il 09/09/24 09:29, Hsin-Te Yuan ha scritto:
> Add i2c-scl-internal-delay-ns for each device.
> 
> Signed-off-by: Hsin-Te Yuan <yuanhsinte at chromium.org>
> ---
> Daolong Zhu (4):
>        arm64: dts: mt8183: fennel: add i2c2's i2c-scl-internal-delay-ns
>        arm64: dts: mt8183: burnet: add i2c2's i2c-scl-internal-delay-ns
>        arm64: dts: mt8183: cozmo: add i2c2's i2c-scl-internal-delay-ns
>        arm64: dts: mt8183: Damu: add i2c2's i2c-scl-internal-delay-ns
> 
>   arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-burnet.dts  | 3 +++
>   arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-cozmo.dts   | 2 ++
>   arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-damu.dts    | 3 +++
>   arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-fennel.dtsi | 3 +++
>   4 files changed, 11 insertions(+)
> ---
> base-commit: ee9a43b7cfe2d8a3520335fea7d8ce71b8cabd9d
> change-id: 20240909-i2c-delay-6d202918ee0f
> 
> Best regards,


For the entire series:

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>


From angelogioacchino.delregno at collabora.com  Mon Sep  9 04:41:57 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Mon, 9 Sep 2024 11:41:57 +0000
Subject: [PATCH 1/2] arm64: dts: mt8183: krane: Fix the address of eeprom
 at i2c4
In-Reply-To: <20240909-eeprom-v1-1-1ed2bc5064f4@chromium.org>
References: <20240909-eeprom-v1-0-1ed2bc5064f4@chromium.org>
 <20240909-eeprom-v1-1-1ed2bc5064f4@chromium.org>
Message-ID: <01020191d6972ef5-12c59f31-ae58-4aad-b33e-5b7618c0443d-000000@eu-west-1.amazonses.com>

Il 09/09/24 10:33, Hsin-Te Yuan ha scritto:
> The address of eeprom should be 50.
> 
> Fixes: cd894e274b74 ("arm64: dts: mt8183: Add krane-sku176 board")
> Signed-off-by: Hsin-Te Yuan <yuanhsinte at chromium.org>

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>




From angelogioacchino.delregno at collabora.com  Mon Sep  9 04:49:59 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Mon, 9 Sep 2024 11:49:59 +0000
Subject: [PATCH 7/7] ASoC: mt8365: Allow build coverage
In-Reply-To: <20240907-asoc-fix-mt8365-build-v1-7-7ad0bac20161@kernel.org>
References: <20240907-asoc-fix-mt8365-build-v1-0-7ad0bac20161@kernel.org>
 <20240907-asoc-fix-mt8365-build-v1-7-7ad0bac20161@kernel.org>
Message-ID: <01020191d69e8733-e5caff8d-c8ad-4cda-b8bb-ae7368a8dd9a-000000@eu-west-1.amazonses.com>

Il 07/09/24 02:53, Mark Brown ha scritto:
> There is no build time dependency on anything specific to ARCH_MEDIATEK so
> enable COMPILE_TEST builds.
> 
> Signed-off-by: Mark Brown <broonie at kernel.org>

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>



From angelogioacchino.delregno at collabora.com  Mon Sep  9 04:50:00 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Mon, 9 Sep 2024 11:50:00 +0000
Subject: [PATCH 5/7] ASoC: mt8365: Remove unused variables
In-Reply-To: <20240907-asoc-fix-mt8365-build-v1-5-7ad0bac20161@kernel.org>
References: <20240907-asoc-fix-mt8365-build-v1-0-7ad0bac20161@kernel.org>
 <20240907-asoc-fix-mt8365-build-v1-5-7ad0bac20161@kernel.org>
Message-ID: <01020191d69e8e04-38cc173b-c8e2-4da3-99ba-c5598e90dea4-000000@eu-west-1.amazonses.com>

Il 07/09/24 02:53, Mark Brown ha scritto:
> Silence compiler warnings by removing unused variables.
> 
> Reported-by: Nathan Chancellor <nathan at kernel.org>
> Signed-off-by: Mark Brown <broonie at kernel.org>

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>




From angelogioacchino.delregno at collabora.com  Mon Sep  9 04:50:01 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Mon, 9 Sep 2024 11:50:01 +0000
Subject: [PATCH 4/7] ASoC: mt8365: Make non-exported functions static
In-Reply-To: <20240907-asoc-fix-mt8365-build-v1-4-7ad0bac20161@kernel.org>
References: <20240907-asoc-fix-mt8365-build-v1-0-7ad0bac20161@kernel.org>
 <20240907-asoc-fix-mt8365-build-v1-4-7ad0bac20161@kernel.org>
Message-ID: <01020191d69e91bd-6b0ddb3d-ebaa-4e15-ac44-99feee5e0a07-000000@eu-west-1.amazonses.com>

Il 07/09/24 02:53, Mark Brown ha scritto:
> The compilers warn if functions without a prototype are not static so add
> appropriate static declarations.
> 
> Reported-by: Nathan Chancellor <nathan at kernel.org>
> Signed-off-by: Mark Brown <broonie at kernel.org>

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>




From angelogioacchino.delregno at collabora.com  Mon Sep  9 04:50:02 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Mon, 9 Sep 2024 11:50:02 +0000
Subject: [PATCH 3/7] ASoC: mt8365: Remove unused prototype for
 mt8365_afe_clk_group_48k()
In-Reply-To: <20240907-asoc-fix-mt8365-build-v1-3-7ad0bac20161@kernel.org>
References: <20240907-asoc-fix-mt8365-build-v1-0-7ad0bac20161@kernel.org>
 <20240907-asoc-fix-mt8365-build-v1-3-7ad0bac20161@kernel.org>
Message-ID: <01020191d69e9539-c581e25a-4379-46cb-8bdd-d186ec99f6e9-000000@eu-west-1.amazonses.com>

Il 07/09/24 02:53, Mark Brown ha scritto:
> The function is not used outside of the file it is defined and the
> equivalent function for 44.1kHz is not prototyped so remove the prototype
> for this function.
> 
> Signed-off-by: Mark Brown <broonie at kernel.org>

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>




From angelogioacchino.delregno at collabora.com  Mon Sep  9 04:50:04 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Mon, 9 Sep 2024 11:50:04 +0000
Subject: [PATCH 2/7] ASoC: mt8365: Remove spurious unsigned long casts
In-Reply-To: <20240907-asoc-fix-mt8365-build-v1-2-7ad0bac20161@kernel.org>
References: <20240907-asoc-fix-mt8365-build-v1-0-7ad0bac20161@kernel.org>
 <20240907-asoc-fix-mt8365-build-v1-2-7ad0bac20161@kernel.org>
Message-ID: <01020191d69e9a85-63fc522f-fb6d-4379-9ee6-5165a820991f-000000@eu-west-1.amazonses.com>

Il 07/09/24 02:53, Mark Brown ha scritto:
> The regmap APIs take unsigned ints not unsigned longs so casting their
> arguments to unsigned longs is not a good choice, the constants being
> cast here are all unsigned ints anyway.
> 
> Signed-off-by: Mark Brown <broonie at kernel.org>

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>




From angelogioacchino.delregno at collabora.com  Mon Sep  9 04:50:00 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Mon, 9 Sep 2024 11:50:00 +0000
Subject: [PATCH 6/7] ASoC: mt8365: Remove unused DMIC IIR coefficient
 configuration
In-Reply-To: <20240907-asoc-fix-mt8365-build-v1-6-7ad0bac20161@kernel.org>
References: <20240907-asoc-fix-mt8365-build-v1-0-7ad0bac20161@kernel.org>
 <20240907-asoc-fix-mt8365-build-v1-6-7ad0bac20161@kernel.org>
Message-ID: <01020191d69e8a97-8bce7a3d-8327-4aac-b280-7856aa17f31b-000000@eu-west-1.amazonses.com>

Il 07/09/24 02:53, Mark Brown ha scritto:
> Nothing ever calls mt8365_dai_load_dmic_iirc_coeff_table() so the compiler
> warns about an unused static function. While it seems likely that something
> should be calling the function I don't know what and this is breaking
> -Werror builds like allmodconfig so let's just remove it. It can be added
> again along with the user.
> 
> Reported-by: Nathan Chancellor <nathan at kernel.org>
> Signed-off-by: Mark Brown <broonie at kernel.org>

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>




From amergnat at baylibre.com  Mon Sep  9 05:47:15 2024
From: amergnat at baylibre.com (Alexandre Mergnat)
Date: Mon, 9 Sep 2024 14:47:15 +0200
Subject: [PATCH 0/7] ASoC: mt8365: Fix -Werror builds
In-Reply-To: <20240907-asoc-fix-mt8365-build-v1-0-7ad0bac20161@kernel.org>
References: <20240907-asoc-fix-mt8365-build-v1-0-7ad0bac20161@kernel.org>
Message-ID: <b2b8b181-1bbd-4925-9d6c-40c4b9e29743@baylibre.com>

I'm embarrassed, my apologies for this oversight...
Thank you for the fixes.

-- 
Regards,
Alexandre


From amergnat at baylibre.com  Mon Sep  9 05:50:36 2024
From: amergnat at baylibre.com (Alexandre Mergnat)
Date: Mon, 9 Sep 2024 14:50:36 +0200
Subject: [PATCH 1/7] ASoC: mt8365: Open code BIT() to avoid spurious
 warnings
In-Reply-To: <20240907-asoc-fix-mt8365-build-v1-1-7ad0bac20161@kernel.org>
References: <20240907-asoc-fix-mt8365-build-v1-0-7ad0bac20161@kernel.org>
 <20240907-asoc-fix-mt8365-build-v1-1-7ad0bac20161@kernel.org>
Message-ID: <28afca15-561e-4712-858d-e3aaf130c72c@baylibre.com>

Reviewed-by: Alexandre Mergnat <amergnat at baylibre.com>

On 07/09/2024 02:53, Mark Brown wrote:
> The mt8365 driver uses bits.h to define bitfields but BIT() uses unsigned
> long constants so does not play well with being bitwise negated and
> converted to an unsigned int, the compiler complains about width reduction
> on a number of architectures. Just open code the shifting to avoid the
> issue.
> 
> Generated with s/BIT(/(1U << /

-- 
Regards,
Alexandre


From amergnat at baylibre.com  Mon Sep  9 05:51:10 2024
From: amergnat at baylibre.com (Alexandre Mergnat)
Date: Mon, 9 Sep 2024 14:51:10 +0200
Subject: [PATCH 2/7] ASoC: mt8365: Remove spurious unsigned long casts
In-Reply-To: <20240907-asoc-fix-mt8365-build-v1-2-7ad0bac20161@kernel.org>
References: <20240907-asoc-fix-mt8365-build-v1-0-7ad0bac20161@kernel.org>
 <20240907-asoc-fix-mt8365-build-v1-2-7ad0bac20161@kernel.org>
Message-ID: <5db7058c-79d8-4fc8-8f37-89cdde68984a@baylibre.com>

Reviewed-by: Alexandre Mergnat <amergnat at baylibre.com>

On 07/09/2024 02:53, Mark Brown wrote:
> The regmap APIs take unsigned ints not unsigned longs so casting their
> arguments to unsigned longs is not a good choice, the constants being
> cast here are all unsigned ints anyway.
> 
> Signed-off-by: Mark Brown <broonie at kernel.org>
> ---
>   sound/soc/mediatek/mt8365/mt8365-dai-i2s.c | 6 +++---
>   1 file changed, 3 insertions(+), 3 deletions(-)
> 
> diff --git a/sound/soc/mediatek/mt8365/mt8365-dai-i2s.c b/sound/soc/mediatek/mt8365/mt8365-dai-i2s.c
> index 5003fe5e5ccf..6b4d8b7e24ca 100644
> --- a/sound/soc/mediatek/mt8365/mt8365-dai-i2s.c
> +++ b/sound/soc/mediatek/mt8365/mt8365-dai-i2s.c
> @@ -385,7 +385,7 @@ static int mt8365_afe_set_2nd_i2s_asrc(struct mtk_base_afe *afe,
>   		/* disable IIR coeff SRAM access */
>   		regmap_update_bits(afe->regmap, AFE_ASRC_2CH_CON0,
>   				   COEFF_SRAM_CTRL,
> -				   (unsigned long)~COEFF_SRAM_CTRL);
> +				   ~COEFF_SRAM_CTRL);
>   		regmap_update_bits(afe->regmap, AFE_ASRC_2CH_CON2,
>   				   CLR_IIR_HISTORY | IIR_EN | IIR_STAGE_MASK,
>   				   CLR_IIR_HISTORY | IIR_EN |
> @@ -393,7 +393,7 @@ static int mt8365_afe_set_2nd_i2s_asrc(struct mtk_base_afe *afe,
>   	} else {
>   		/* disable IIR */
>   		regmap_update_bits(afe->regmap, AFE_ASRC_2CH_CON2,
> -				   IIR_EN, (unsigned long)~IIR_EN);
> +				   IIR_EN, ~IIR_EN);
>   	}
>   
>   	/* CON3 setting (RX OFS) */
> @@ -456,7 +456,7 @@ static int mt8365_afe_set_2nd_i2s_asrc_enable(struct mtk_base_afe *afe,
>   				   ASM_ON, ASM_ON);
>   	else
>   		regmap_update_bits(afe->regmap, AFE_ASRC_2CH_CON0,
> -				   ASM_ON, (unsigned long)~ASM_ON);
> +				   ASM_ON, ~ASM_ON);
>   	return 0;
>   }
>   
> 

-- 
Regards,
Alexandre


From amergnat at baylibre.com  Mon Sep  9 05:51:33 2024
From: amergnat at baylibre.com (Alexandre Mergnat)
Date: Mon, 9 Sep 2024 14:51:33 +0200
Subject: [PATCH 3/7] ASoC: mt8365: Remove unused prototype for
 mt8365_afe_clk_group_48k()
In-Reply-To: <20240907-asoc-fix-mt8365-build-v1-3-7ad0bac20161@kernel.org>
References: <20240907-asoc-fix-mt8365-build-v1-0-7ad0bac20161@kernel.org>
 <20240907-asoc-fix-mt8365-build-v1-3-7ad0bac20161@kernel.org>
Message-ID: <16decde3-f9ee-4962-8015-239c53fe9b2e@baylibre.com>

Reviewed-by: Alexandre Mergnat <amergnat at baylibre.com>

On 07/09/2024 02:53, Mark Brown wrote:
> The function is not used outside of the file it is defined and the
> equivalent function for 44.1kHz is not prototyped so remove the prototype
> for this function.
> 
> Signed-off-by: Mark Brown <broonie at kernel.org>
> ---
>   sound/soc/mediatek/mt8365/mt8365-afe-common.h | 1 -
>   1 file changed, 1 deletion(-)
> 
> diff --git a/sound/soc/mediatek/mt8365/mt8365-afe-common.h b/sound/soc/mediatek/mt8365/mt8365-afe-common.h
> index 1fa87e54a57f..731406e15ac7 100644
> --- a/sound/soc/mediatek/mt8365/mt8365-afe-common.h
> +++ b/sound/soc/mediatek/mt8365/mt8365-afe-common.h
> @@ -421,7 +421,6 @@ static inline u32 AutoRstThLo(unsigned int fs)
>   	}
>   }
>   
> -bool mt8365_afe_clk_group_48k(int sample_rate);
>   bool mt8365_afe_rate_supported(unsigned int rate, unsigned int id);
>   bool mt8365_afe_channel_supported(unsigned int channel, unsigned int id);
>   
> 

-- 
Regards,
Alexandre


From amergnat at baylibre.com  Mon Sep  9 05:52:31 2024
From: amergnat at baylibre.com (Alexandre Mergnat)
Date: Mon, 9 Sep 2024 14:52:31 +0200
Subject: [PATCH 4/7] ASoC: mt8365: Make non-exported functions static
In-Reply-To: <20240907-asoc-fix-mt8365-build-v1-4-7ad0bac20161@kernel.org>
References: <20240907-asoc-fix-mt8365-build-v1-0-7ad0bac20161@kernel.org>
 <20240907-asoc-fix-mt8365-build-v1-4-7ad0bac20161@kernel.org>
Message-ID: <95cab48e-989f-42b4-8f31-0fdffbaface4@baylibre.com>

Reviewed-by: Alexandre Mergnat <amergnat at baylibre.com>

On 07/09/2024 02:53, Mark Brown wrote:
> The compilers warn if functions without a prototype are not static so add
> appropriate static declarations.
> 
> Reported-by: Nathan Chancellor <nathan at kernel.org>
> Signed-off-by: Mark Brown <broonie at kernel.org>
> ---
>   sound/soc/mediatek/mt8365/mt8365-afe-clk.c |  4 ++--
>   sound/soc/mediatek/mt8365/mt8365-afe-pcm.c | 12 ++++++------
>   2 files changed, 8 insertions(+), 8 deletions(-)
> 
> diff --git a/sound/soc/mediatek/mt8365/mt8365-afe-clk.c b/sound/soc/mediatek/mt8365/mt8365-afe-clk.c
> index 300d1f0ae660..8a0af2ea8546 100644
> --- a/sound/soc/mediatek/mt8365/mt8365-afe-clk.c
> +++ b/sound/soc/mediatek/mt8365/mt8365-afe-clk.c
> @@ -295,7 +295,7 @@ int mt8365_afe_disable_afe_on(struct mtk_base_afe *afe)
>   	return 0;
>   }
>   
> -int mt8365_afe_hd_engen_enable(struct mtk_base_afe *afe, bool apll1)
> +static int mt8365_afe_hd_engen_enable(struct mtk_base_afe *afe, bool apll1)
>   {
>   	if (apll1)
>   		regmap_update_bits(afe->regmap, AFE_HD_ENGEN_ENABLE,
> @@ -307,7 +307,7 @@ int mt8365_afe_hd_engen_enable(struct mtk_base_afe *afe, bool apll1)
>   	return 0;
>   }
>   
> -int mt8365_afe_hd_engen_disable(struct mtk_base_afe *afe, bool apll1)
> +static int mt8365_afe_hd_engen_disable(struct mtk_base_afe *afe, bool apll1)
>   {
>   	if (apll1)
>   		regmap_update_bits(afe->regmap, AFE_HD_ENGEN_ENABLE,
> diff --git a/sound/soc/mediatek/mt8365/mt8365-afe-pcm.c b/sound/soc/mediatek/mt8365/mt8365-afe-pcm.c
> index df6dd8c5bbe5..54d2112d2e92 100644
> --- a/sound/soc/mediatek/mt8365/mt8365-afe-pcm.c
> +++ b/sound/soc/mediatek/mt8365/mt8365-afe-pcm.c
> @@ -170,7 +170,7 @@ bool mt8365_afe_channel_supported(unsigned int channel, unsigned int id)
>   	return false;
>   }
>   
> -bool mt8365_afe_clk_group_44k(int sample_rate)
> +static bool mt8365_afe_clk_group_44k(int sample_rate)
>   {
>   	if (sample_rate == 11025 ||
>   	    sample_rate == 22050 ||
> @@ -182,7 +182,7 @@ bool mt8365_afe_clk_group_44k(int sample_rate)
>   		return false;
>   }
>   
> -bool mt8365_afe_clk_group_48k(int sample_rate)
> +static bool mt8365_afe_clk_group_48k(int sample_rate)
>   {
>   	return (!mt8365_afe_clk_group_44k(sample_rate));
>   }
> @@ -496,8 +496,8 @@ static int mt8365_afe_configure_cm(struct mtk_base_afe *afe,
>   	return 0;
>   }
>   
> -int mt8365_afe_fe_startup(struct snd_pcm_substream *substream,
> -			  struct snd_soc_dai *dai)
> +static int mt8365_afe_fe_startup(struct snd_pcm_substream *substream,
> +				 struct snd_soc_dai *dai)
>   {
>   	struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
>   	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
> @@ -714,8 +714,8 @@ static int mt8365_afe_fe_prepare(struct snd_pcm_substream *substream,
>   	return 0;
>   }
>   
> -int mt8365_afe_fe_trigger(struct snd_pcm_substream *substream, int cmd,
> -			  struct snd_soc_dai *dai)
> +static int mt8365_afe_fe_trigger(struct snd_pcm_substream *substream, int cmd,
> +				 struct snd_soc_dai *dai)
>   {
>   	struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
>   	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
> 

-- 
Regards,
Alexandre


From amergnat at baylibre.com  Mon Sep  9 05:52:57 2024
From: amergnat at baylibre.com (Alexandre Mergnat)
Date: Mon, 9 Sep 2024 14:52:57 +0200
Subject: [PATCH 5/7] ASoC: mt8365: Remove unused variables
In-Reply-To: <20240907-asoc-fix-mt8365-build-v1-5-7ad0bac20161@kernel.org>
References: <20240907-asoc-fix-mt8365-build-v1-0-7ad0bac20161@kernel.org>
 <20240907-asoc-fix-mt8365-build-v1-5-7ad0bac20161@kernel.org>
Message-ID: <e461d366-ddeb-4d87-813d-9d8cb7e30238@baylibre.com>

Reviewed-by: Alexandre Mergnat <amergnat at baylibre.com>

On 07/09/2024 02:53, Mark Brown wrote:
> Silence compiler warnings by removing unused variables.

-- 
Regards,
Alexandre


From amergnat at baylibre.com  Mon Sep  9 06:01:40 2024
From: amergnat at baylibre.com (Alexandre Mergnat)
Date: Mon, 9 Sep 2024 15:01:40 +0200
Subject: [PATCH 7/7] ASoC: mt8365: Allow build coverage
In-Reply-To: <20240907-asoc-fix-mt8365-build-v1-7-7ad0bac20161@kernel.org>
References: <20240907-asoc-fix-mt8365-build-v1-0-7ad0bac20161@kernel.org>
 <20240907-asoc-fix-mt8365-build-v1-7-7ad0bac20161@kernel.org>
Message-ID: <ce36e6e6-2e56-489c-be15-5a2d84d035b0@baylibre.com>

Reviewed-by: Alexandre Mergnat <amergnat at baylibre.com>

On 07/09/2024 02:53, Mark Brown wrote:
> There is no build time dependency on anything specific to ARCH_MEDIATEK so
> enable COMPILE_TEST builds.
> 
> Signed-off-by: Mark Brown <broonie at kernel.org>
> ---
>   sound/soc/mediatek/Kconfig | 2 +-
>   1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/sound/soc/mediatek/Kconfig b/sound/soc/mediatek/Kconfig
> index e6f7a5a49794..3033e2d3fe16 100644
> --- a/sound/soc/mediatek/Kconfig
> +++ b/sound/soc/mediatek/Kconfig
> @@ -301,7 +301,7 @@ config SND_SOC_MT8195_MT6359
>   
>   config SND_SOC_MT8365
>   	tristate "ASoC support for MediaTek MT8365 chip"
> -	depends on ARCH_MEDIATEK
> +	depends on ARCH_MEDIATEK || COMPILE_TEST
>   	select SND_SOC_MEDIATEK
>   	help
>   	  This adds ASoC platform driver support for MediaTek MT8365 chip
> 

-- 
Regards,
Alexandre


From krzysztof.kozlowski at linaro.org  Mon Sep  9 06:51:11 2024
From: krzysztof.kozlowski at linaro.org (Krzysztof Kozlowski)
Date: Mon, 09 Sep 2024 15:51:11 +0200
Subject: [PATCH 00/17] regulator: Few constifications of static data
Message-ID: <20240909-regulator-const-v1-0-8934704a5787@linaro.org>

Hi,

Few cleanups (safer code), built tested.  Last two patches should
probably be tested.

Best regards,
Krzysztof

---
Krzysztof Kozlowski (17):
      regulator: da9052: Constify static data
      regulator: da9055: Constify static data
      regulator: da9063: Constify static data
      regulator: da9121: Constify static data
      regulator: da9211: Constify static data
      regulator: hi6421: Constify static data
      regulator: hi6421v600: Constify static data
      regulator: tps65023: Constify static data
      regulator: max77826: Drop unused 'rdesc' in 'struct max77826_regulator_info'
      regulator: max77826: Constify static data
      regulator: mtk-dvfsrc: Constify static data
      regulator: pcap: Constify static data
      regulator: pfuze100: Constify static data
      regulator: qcom-refgen: Constify static data
      regulator: hi6421v530: Drop unused 'eco_microamp'
      regulator: hi6421v530: Use container_of and constify static data
      regulator: max77650: Use container_of and constify static data

 drivers/regulator/da9052-regulator.c      | 22 +++++++++++-----------
 drivers/regulator/da9055-regulator.c      | 28 ++++++++++++++--------------
 drivers/regulator/da9063-regulator.c      |  2 +-
 drivers/regulator/da9121-regulator.c      | 20 ++++++++++----------
 drivers/regulator/da9211-regulator.c      |  2 +-
 drivers/regulator/hi6421-regulator.c      | 14 +++++++-------
 drivers/regulator/hi6421v530-regulator.c  | 27 +++++++++++----------------
 drivers/regulator/hi6421v600-regulator.c  | 10 +++++-----
 drivers/regulator/max77650-regulator.c    | 31 ++++++++++++++-----------------
 drivers/regulator/max77826-regulator.c    |  4 +---
 drivers/regulator/mtk-dvfsrc-regulator.c  | 10 +++++-----
 drivers/regulator/pcap-regulator.c        | 12 ++++++------
 drivers/regulator/pfuze100-regulator.c    | 10 +++++-----
 drivers/regulator/qcom-refgen-regulator.c |  4 ++--
 drivers/regulator/tps65023-regulator.c    |  6 +++---
 15 files changed, 96 insertions(+), 106 deletions(-)
---
base-commit: fd9058d56c6de25c2d3215db4e2e950a7965ffd2
change-id: 20240909-regulator-const-b70dc22450b0

Best regards,
-- 
Krzysztof Kozlowski <krzysztof.kozlowski at linaro.org>



From krzysztof.kozlowski at linaro.org  Mon Sep  9 06:51:12 2024
From: krzysztof.kozlowski at linaro.org (Krzysztof Kozlowski)
Date: Mon, 09 Sep 2024 15:51:12 +0200
Subject: [PATCH 01/17] regulator: da9052: Constify static data
In-Reply-To: <20240909-regulator-const-v1-0-8934704a5787@linaro.org>
References: <20240909-regulator-const-v1-0-8934704a5787@linaro.org>
Message-ID: <20240909-regulator-const-v1-1-8934704a5787@linaro.org>

Driver does not modify static data with regulators description (struct
da9052_regulator_info), so make it const for code safety.

Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski at linaro.org>
---
 drivers/regulator/da9052-regulator.c | 22 +++++++++++-----------
 1 file changed, 11 insertions(+), 11 deletions(-)

diff --git a/drivers/regulator/da9052-regulator.c b/drivers/regulator/da9052-regulator.c
index ab6f5d61b173..fbebe538a648 100644
--- a/drivers/regulator/da9052-regulator.c
+++ b/drivers/regulator/da9052-regulator.c
@@ -67,11 +67,11 @@ struct da9052_regulator_info {
 
 struct da9052_regulator {
 	struct da9052 *da9052;
-	struct da9052_regulator_info *info;
+	const struct da9052_regulator_info *info;
 	struct regulator_dev *rdev;
 };
 
-static int verify_range(struct da9052_regulator_info *info,
+static int verify_range(const struct da9052_regulator_info *info,
 			 int min_uV, int max_uV)
 {
 	if (min_uV > info->max_uV || max_uV < info->min_uV)
@@ -151,7 +151,7 @@ static int da9052_list_voltage(struct regulator_dev *rdev,
 				unsigned int selector)
 {
 	struct da9052_regulator *regulator = rdev_get_drvdata(rdev);
-	struct da9052_regulator_info *info = regulator->info;
+	const struct da9052_regulator_info *info = regulator->info;
 	int id = rdev_get_id(rdev);
 	int volt_uV;
 
@@ -175,7 +175,7 @@ static int da9052_map_voltage(struct regulator_dev *rdev,
 			      int min_uV, int max_uV)
 {
 	struct da9052_regulator *regulator = rdev_get_drvdata(rdev);
-	struct da9052_regulator_info *info = regulator->info;
+	const struct da9052_regulator_info *info = regulator->info;
 	int id = rdev_get_id(rdev);
 	int ret, sel;
 
@@ -206,7 +206,7 @@ static int da9052_regulator_set_voltage_sel(struct regulator_dev *rdev,
 					    unsigned int selector)
 {
 	struct da9052_regulator *regulator = rdev_get_drvdata(rdev);
-	struct da9052_regulator_info *info = regulator->info;
+	const struct da9052_regulator_info *info = regulator->info;
 	int id = rdev_get_id(rdev);
 	int ret;
 
@@ -237,7 +237,7 @@ static int da9052_regulator_set_voltage_time_sel(struct regulator_dev *rdev,
 						 unsigned int new_sel)
 {
 	struct da9052_regulator *regulator = rdev_get_drvdata(rdev);
-	struct da9052_regulator_info *info = regulator->info;
+	const struct da9052_regulator_info *info = regulator->info;
 	int id = rdev_get_id(rdev);
 	int ret = 0;
 
@@ -327,7 +327,7 @@ static const struct regulator_ops da9052_ldo_ops = {
 	.activate_bit = (abits),\
 }
 
-static struct da9052_regulator_info da9052_regulator_info[] = {
+static const struct da9052_regulator_info da9052_regulator_info[] = {
 	DA9052_DCDC(BUCK1, buck1, 25, 500, 2075, 6, 6, DA9052_SUPPLY_VBCOREGO),
 	DA9052_DCDC(BUCK2, buck2, 25, 500, 2075, 6, 6, DA9052_SUPPLY_VBPROGO),
 	DA9052_DCDC(BUCK3, buck3, 25, 950, 2525, 6, 6, DA9052_SUPPLY_VBMEMGO),
@@ -344,7 +344,7 @@ static struct da9052_regulator_info da9052_regulator_info[] = {
 	DA9052_LDO(LDO10, ldo10, 50, 1200, 3600, 6, 6, 0),
 };
 
-static struct da9052_regulator_info da9053_regulator_info[] = {
+static const struct da9052_regulator_info da9053_regulator_info[] = {
 	DA9052_DCDC(BUCK1, buck1, 25, 500, 2075, 6, 6, DA9052_SUPPLY_VBCOREGO),
 	DA9052_DCDC(BUCK2, buck2, 25, 500, 2075, 6, 6, DA9052_SUPPLY_VBPROGO),
 	DA9052_DCDC(BUCK3, buck3, 25, 950, 2525, 6, 6, DA9052_SUPPLY_VBMEMGO),
@@ -361,10 +361,10 @@ static struct da9052_regulator_info da9053_regulator_info[] = {
 	DA9052_LDO(LDO10, ldo10, 50, 1200, 3600, 6, 6, 0),
 };
 
-static inline struct da9052_regulator_info *find_regulator_info(u8 chip_id,
-								 int id)
+static inline const struct da9052_regulator_info *find_regulator_info(u8 chip_id,
+								      int id)
 {
-	struct da9052_regulator_info *info;
+	const struct da9052_regulator_info *info;
 	int i;
 
 	switch (chip_id) {

-- 
2.43.0



From krzysztof.kozlowski at linaro.org  Mon Sep  9 06:51:13 2024
From: krzysztof.kozlowski at linaro.org (Krzysztof Kozlowski)
Date: Mon, 09 Sep 2024 15:51:13 +0200
Subject: [PATCH 02/17] regulator: da9055: Constify static data
In-Reply-To: <20240909-regulator-const-v1-0-8934704a5787@linaro.org>
References: <20240909-regulator-const-v1-0-8934704a5787@linaro.org>
Message-ID: <20240909-regulator-const-v1-2-8934704a5787@linaro.org>

Driver does not modify static data with regulators description (struct
da9055_regulator_info), so make it const for code safety.

Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski at linaro.org>
---
 drivers/regulator/da9055-regulator.c | 28 ++++++++++++++--------------
 1 file changed, 14 insertions(+), 14 deletions(-)

diff --git a/drivers/regulator/da9055-regulator.c b/drivers/regulator/da9055-regulator.c
index 352547c375bd..a0d3414aa79e 100644
--- a/drivers/regulator/da9055-regulator.c
+++ b/drivers/regulator/da9055-regulator.c
@@ -73,7 +73,7 @@ struct da9055_regulator_info {
 
 struct da9055_regulator {
 	struct da9055 *da9055;
-	struct da9055_regulator_info *info;
+	const struct da9055_regulator_info *info;
 	struct regulator_dev *rdev;
 	enum gpio_select reg_rselect;
 };
@@ -81,7 +81,7 @@ struct da9055_regulator {
 static unsigned int da9055_buck_get_mode(struct regulator_dev *rdev)
 {
 	struct da9055_regulator *regulator = rdev_get_drvdata(rdev);
-	struct da9055_regulator_info *info = regulator->info;
+	const struct da9055_regulator_info *info = regulator->info;
 	int ret, mode = 0;
 
 	ret = da9055_reg_read(regulator->da9055, info->mode.reg);
@@ -107,7 +107,7 @@ static int da9055_buck_set_mode(struct regulator_dev *rdev,
 					unsigned int mode)
 {
 	struct da9055_regulator *regulator = rdev_get_drvdata(rdev);
-	struct da9055_regulator_info *info = regulator->info;
+	const struct da9055_regulator_info *info = regulator->info;
 	int val = 0;
 
 	switch (mode) {
@@ -129,7 +129,7 @@ static int da9055_buck_set_mode(struct regulator_dev *rdev,
 static unsigned int da9055_ldo_get_mode(struct regulator_dev *rdev)
 {
 	struct da9055_regulator *regulator = rdev_get_drvdata(rdev);
-	struct da9055_regulator_info *info = regulator->info;
+	const struct da9055_regulator_info *info = regulator->info;
 	int ret;
 
 	ret = da9055_reg_read(regulator->da9055, info->volt.reg_b);
@@ -145,7 +145,7 @@ static unsigned int da9055_ldo_get_mode(struct regulator_dev *rdev)
 static int da9055_ldo_set_mode(struct regulator_dev *rdev, unsigned int mode)
 {
 	struct da9055_regulator *regulator = rdev_get_drvdata(rdev);
-	struct da9055_regulator_info *info = regulator->info;
+	const struct da9055_regulator_info *info = regulator->info;
 	struct da9055_volt_reg volt = info->volt;
 	int val = 0;
 
@@ -167,7 +167,7 @@ static int da9055_ldo_set_mode(struct regulator_dev *rdev, unsigned int mode)
 static int da9055_regulator_get_voltage_sel(struct regulator_dev *rdev)
 {
 	struct da9055_regulator *regulator = rdev_get_drvdata(rdev);
-	struct da9055_regulator_info *info = regulator->info;
+	const struct da9055_regulator_info *info = regulator->info;
 	struct da9055_volt_reg volt = info->volt;
 	int ret, sel;
 
@@ -199,7 +199,7 @@ static int da9055_regulator_set_voltage_sel(struct regulator_dev *rdev,
 					    unsigned int selector)
 {
 	struct da9055_regulator *regulator = rdev_get_drvdata(rdev);
-	struct da9055_regulator_info *info = regulator->info;
+	const struct da9055_regulator_info *info = regulator->info;
 	int ret;
 
 	/*
@@ -242,7 +242,7 @@ static int da9055_regulator_set_suspend_voltage(struct regulator_dev *rdev,
 						int uV)
 {
 	struct da9055_regulator *regulator = rdev_get_drvdata(rdev);
-	struct da9055_regulator_info *info = regulator->info;
+	const struct da9055_regulator_info *info = regulator->info;
 	int ret;
 
 	/* Select register set B for suspend voltage ramping. */
@@ -264,7 +264,7 @@ static int da9055_regulator_set_suspend_voltage(struct regulator_dev *rdev,
 static int da9055_suspend_enable(struct regulator_dev *rdev)
 {
 	struct da9055_regulator *regulator = rdev_get_drvdata(rdev);
-	struct da9055_regulator_info *info = regulator->info;
+	const struct da9055_regulator_info *info = regulator->info;
 
 	/* Select register set B for voltage ramping. */
 	if (regulator->reg_rselect == NO_GPIO)
@@ -277,7 +277,7 @@ static int da9055_suspend_enable(struct regulator_dev *rdev)
 static int da9055_suspend_disable(struct regulator_dev *rdev)
 {
 	struct da9055_regulator *regulator = rdev_get_drvdata(rdev);
-	struct da9055_regulator_info *info = regulator->info;
+	const struct da9055_regulator_info *info = regulator->info;
 
 	/* Diselect register set B. */
 	if (regulator->reg_rselect == NO_GPIO)
@@ -396,7 +396,7 @@ static const struct regulator_ops da9055_ldo_ops = {
 	},\
 }
 
-static struct da9055_regulator_info da9055_regulator_info[] = {
+static const struct da9055_regulator_info da9055_regulator_info[] = {
 	DA9055_BUCK(BUCK1, 25, 725, 2075, 6, 9, 0xc, 2),
 	DA9055_BUCK(BUCK2, 25, 925, 2500, 6, 0, 3, 0),
 	DA9055_LDO(LDO1, 50, 900, 3300, 6, 2),
@@ -417,7 +417,7 @@ static int da9055_gpio_init(struct device *dev,
 			    struct regulator_config *config,
 			    struct da9055_pdata *pdata, int id)
 {
-	struct da9055_regulator_info *info = regulator->info;
+	const struct da9055_regulator_info *info = regulator->info;
 	struct gpio_desc *ren;
 	struct gpio_desc *ena;
 	struct gpio_desc *rsel;
@@ -491,9 +491,9 @@ static irqreturn_t da9055_ldo5_6_oc_irq(int irq, void *data)
 	return IRQ_HANDLED;
 }
 
-static inline struct da9055_regulator_info *find_regulator_info(int id)
+static inline const struct da9055_regulator_info *find_regulator_info(int id)
 {
-	struct da9055_regulator_info *info;
+	const struct da9055_regulator_info *info;
 	int i;
 
 	for (i = 0; i < ARRAY_SIZE(da9055_regulator_info); i++) {

-- 
2.43.0



From krzysztof.kozlowski at linaro.org  Mon Sep  9 06:51:14 2024
From: krzysztof.kozlowski at linaro.org (Krzysztof Kozlowski)
Date: Mon, 09 Sep 2024 15:51:14 +0200
Subject: [PATCH 03/17] regulator: da9063: Constify static data
In-Reply-To: <20240909-regulator-const-v1-0-8934704a5787@linaro.org>
References: <20240909-regulator-const-v1-0-8934704a5787@linaro.org>
Message-ID: <20240909-regulator-const-v1-3-8934704a5787@linaro.org>

Driver does not modify static data with device variant description
(struct da9063_dev_model), so make it const for code safety.

Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski at linaro.org>
---
 drivers/regulator/da9063-regulator.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/regulator/da9063-regulator.c b/drivers/regulator/da9063-regulator.c
index 82bf321ae06f..4b5f1d6a4b3c 100644
--- a/drivers/regulator/da9063-regulator.c
+++ b/drivers/regulator/da9063-regulator.c
@@ -715,7 +715,7 @@ static const struct da9063_regulator_info da9063_regulator_info[] = {
 };
 
 /* Link chip model with regulators info table */
-static struct da9063_dev_model regulators_models[] = {
+static const struct da9063_dev_model regulators_models[] = {
 	{
 		.regulator_info = da9063_regulator_info,
 		.n_regulators = ARRAY_SIZE(da9063_regulator_info),

-- 
2.43.0



From krzysztof.kozlowski at linaro.org  Mon Sep  9 06:51:15 2024
From: krzysztof.kozlowski at linaro.org (Krzysztof Kozlowski)
Date: Mon, 09 Sep 2024 15:51:15 +0200
Subject: [PATCH 04/17] regulator: da9121: Constify static data
In-Reply-To: <20240909-regulator-const-v1-0-8934704a5787@linaro.org>
References: <20240909-regulator-const-v1-0-8934704a5787@linaro.org>
Message-ID: <20240909-regulator-const-v1-4-8934704a5787@linaro.org>

Driver does not modify static data with regulator description (struct
da9121_range), so make it const for code safety.

Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski at linaro.org>
---
 drivers/regulator/da9121-regulator.c | 20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)

diff --git a/drivers/regulator/da9121-regulator.c b/drivers/regulator/da9121-regulator.c
index 5524bd314f13..ef161eb0ca27 100644
--- a/drivers/regulator/da9121-regulator.c
+++ b/drivers/regulator/da9121-regulator.c
@@ -53,7 +53,7 @@ struct da9121_range {
 	int reg_max;
 };
 
-static struct da9121_range da9121_10A_2phase_current = {
+static const struct da9121_range da9121_10A_2phase_current = {
 	.val_min =  7000000,
 	.val_max = 20000000,
 	.val_stp =  1000000,
@@ -61,7 +61,7 @@ static struct da9121_range da9121_10A_2phase_current = {
 	.reg_max = 14,
 };
 
-static struct da9121_range da9121_6A_2phase_current = {
+static const struct da9121_range da9121_6A_2phase_current = {
 	.val_min =  7000000,
 	.val_max = 12000000,
 	.val_stp =  1000000,
@@ -69,7 +69,7 @@ static struct da9121_range da9121_6A_2phase_current = {
 	.reg_max = 6,
 };
 
-static struct da9121_range da9121_5A_1phase_current = {
+static const struct da9121_range da9121_5A_1phase_current = {
 	.val_min =  3500000,
 	.val_max = 10000000,
 	.val_stp =   500000,
@@ -77,7 +77,7 @@ static struct da9121_range da9121_5A_1phase_current = {
 	.reg_max = 14,
 };
 
-static struct da9121_range da9121_3A_1phase_current = {
+static const struct da9121_range da9121_3A_1phase_current = {
 	.val_min = 3500000,
 	.val_max = 6000000,
 	.val_stp =  500000,
@@ -85,7 +85,7 @@ static struct da9121_range da9121_3A_1phase_current = {
 	.reg_max = 6,
 };
 
-static struct da9121_range da914x_40A_4phase_current = {
+static const struct da9121_range da914x_40A_4phase_current = {
 	.val_min = 26000000,
 	.val_max = 78000000,
 	.val_stp =  4000000,
@@ -93,7 +93,7 @@ static struct da9121_range da914x_40A_4phase_current = {
 	.reg_max = 14,
 };
 
-static struct da9121_range da914x_20A_2phase_current = {
+static const struct da9121_range da914x_20A_2phase_current = {
 	.val_min = 13000000,
 	.val_max = 39000000,
 	.val_stp =  2000000,
@@ -104,7 +104,7 @@ static struct da9121_range da914x_20A_2phase_current = {
 struct da9121_variant_info {
 	int num_bucks;
 	int num_phases;
-	struct da9121_range *current_range;
+	const struct da9121_range *current_range;
 };
 
 static const struct da9121_variant_info variant_parameters[] = {
@@ -188,7 +188,7 @@ static int da9121_get_current_limit(struct regulator_dev *rdev)
 {
 	struct da9121 *chip = rdev_get_drvdata(rdev);
 	int id = rdev_get_id(rdev);
-	struct da9121_range *range =
+	const struct da9121_range *range =
 		variant_parameters[chip->variant_id].current_range;
 	unsigned int val = 0;
 	int ret = 0;
@@ -219,7 +219,7 @@ static int da9121_ceiling_selector(struct regulator_dev *rdev,
 		unsigned int *selector)
 {
 	struct da9121 *chip = rdev_get_drvdata(rdev);
-	struct da9121_range *range =
+	const struct da9121_range *range =
 		variant_parameters[chip->variant_id].current_range;
 	unsigned int level;
 	unsigned int i = 0;
@@ -259,7 +259,7 @@ static int da9121_set_current_limit(struct regulator_dev *rdev,
 {
 	struct da9121 *chip = rdev_get_drvdata(rdev);
 	int id = rdev_get_id(rdev);
-	struct da9121_range *range =
+	const struct da9121_range *range =
 		variant_parameters[chip->variant_id].current_range;
 	unsigned int sel = 0;
 	int ret = 0;

-- 
2.43.0



From krzysztof.kozlowski at linaro.org  Mon Sep  9 06:51:16 2024
From: krzysztof.kozlowski at linaro.org (Krzysztof Kozlowski)
Date: Mon, 09 Sep 2024 15:51:16 +0200
Subject: [PATCH 05/17] regulator: da9211: Constify static data
In-Reply-To: <20240909-regulator-const-v1-0-8934704a5787@linaro.org>
References: <20240909-regulator-const-v1-0-8934704a5787@linaro.org>
Message-ID: <20240909-regulator-const-v1-5-8934704a5787@linaro.org>

Driver does not modify static data with regulator description (struct
regulator_desc), so make it const for code safety.

Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski at linaro.org>
---
 drivers/regulator/da9211-regulator.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/regulator/da9211-regulator.c b/drivers/regulator/da9211-regulator.c
index d8b39ea3de0e..d4f14d7ea8cf 100644
--- a/drivers/regulator/da9211-regulator.c
+++ b/drivers/regulator/da9211-regulator.c
@@ -264,7 +264,7 @@ static const struct regulator_ops da9211_buck_ops = {
 	.of_map_mode = da9211_map_buck_mode,\
 }
 
-static struct regulator_desc da9211_regulators[] = {
+static const struct regulator_desc da9211_regulators[] = {
 	DA9211_BUCK(BUCKA),
 	DA9211_BUCK(BUCKB),
 };

-- 
2.43.0



From krzysztof.kozlowski at linaro.org  Mon Sep  9 06:51:17 2024
From: krzysztof.kozlowski at linaro.org (Krzysztof Kozlowski)
Date: Mon, 09 Sep 2024 15:51:17 +0200
Subject: [PATCH 06/17] regulator: hi6421: Constify static data
In-Reply-To: <20240909-regulator-const-v1-0-8934704a5787@linaro.org>
References: <20240909-regulator-const-v1-0-8934704a5787@linaro.org>
Message-ID: <20240909-regulator-const-v1-6-8934704a5787@linaro.org>

Driver does not modify static data with regulator description (struct
hi6421_regulator_info), so make it const for code safety.

Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski at linaro.org>
---
 drivers/regulator/hi6421-regulator.c | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/drivers/regulator/hi6421-regulator.c b/drivers/regulator/hi6421-regulator.c
index 82e9e364d4d4..69d24728d6a4 100644
--- a/drivers/regulator/hi6421-regulator.c
+++ b/drivers/regulator/hi6421-regulator.c
@@ -303,7 +303,7 @@ static const struct regulator_ops hi6421_buck345_ops;
 	}
 
 /* HI6421 regulator information */
-static struct hi6421_regulator_info
+static const struct hi6421_regulator_info
 		hi6421_regulator_info[HI6421_NUM_REGULATORS] = {
 	HI6421_LDO(LDO0, hi6421_vout0, ldo_0_voltages, 0x20, 0x07, 0x20, 0x10,
 		   10000, 0x20, 8000),
@@ -384,7 +384,7 @@ static int hi6421_regulator_enable(struct regulator_dev *rdev)
 
 static unsigned int hi6421_regulator_ldo_get_mode(struct regulator_dev *rdev)
 {
-	struct hi6421_regulator_info *info;
+	const struct hi6421_regulator_info *info;
 	unsigned int reg_val;
 
 	info = container_of(rdev->desc, struct hi6421_regulator_info, desc);
@@ -397,7 +397,7 @@ static unsigned int hi6421_regulator_ldo_get_mode(struct regulator_dev *rdev)
 
 static unsigned int hi6421_regulator_buck_get_mode(struct regulator_dev *rdev)
 {
-	struct hi6421_regulator_info *info;
+	const struct hi6421_regulator_info *info;
 	unsigned int reg_val;
 
 	info = container_of(rdev->desc, struct hi6421_regulator_info, desc);
@@ -411,7 +411,7 @@ static unsigned int hi6421_regulator_buck_get_mode(struct regulator_dev *rdev)
 static int hi6421_regulator_ldo_set_mode(struct regulator_dev *rdev,
 						unsigned int mode)
 {
-	struct hi6421_regulator_info *info;
+	const struct hi6421_regulator_info *info;
 	unsigned int new_mode;
 
 	info = container_of(rdev->desc, struct hi6421_regulator_info, desc);
@@ -436,7 +436,7 @@ static int hi6421_regulator_ldo_set_mode(struct regulator_dev *rdev,
 static int hi6421_regulator_buck_set_mode(struct regulator_dev *rdev,
 						unsigned int mode)
 {
-	struct hi6421_regulator_info *info;
+	const struct hi6421_regulator_info *info;
 	unsigned int new_mode;
 
 	info = container_of(rdev->desc, struct hi6421_regulator_info, desc);
@@ -462,7 +462,7 @@ static unsigned int
 hi6421_regulator_ldo_get_optimum_mode(struct regulator_dev *rdev,
 			int input_uV, int output_uV, int load_uA)
 {
-	struct hi6421_regulator_info *info;
+	const struct hi6421_regulator_info *info;
 
 	info = container_of(rdev->desc, struct hi6421_regulator_info, desc);
 
@@ -539,7 +539,7 @@ static int hi6421_regulator_probe(struct platform_device *pdev)
 {
 	struct hi6421_pmic *pmic = dev_get_drvdata(pdev->dev.parent);
 	struct hi6421_regulator_pdata *pdata;
-	struct hi6421_regulator_info *info;
+	const struct hi6421_regulator_info *info;
 	struct regulator_config config = { };
 	struct regulator_dev *rdev;
 	int i;

-- 
2.43.0



From krzysztof.kozlowski at linaro.org  Mon Sep  9 06:51:18 2024
From: krzysztof.kozlowski at linaro.org (Krzysztof Kozlowski)
Date: Mon, 09 Sep 2024 15:51:18 +0200
Subject: [PATCH 07/17] regulator: hi6421v600: Constify static data
In-Reply-To: <20240909-regulator-const-v1-0-8934704a5787@linaro.org>
References: <20240909-regulator-const-v1-0-8934704a5787@linaro.org>
Message-ID: <20240909-regulator-const-v1-7-8934704a5787@linaro.org>

Driver does not modify static data with regulator description (struct
hi6421_spmi_reg_info), so make it const for code safety.

Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski at linaro.org>
---
 drivers/regulator/hi6421v600-regulator.c | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/drivers/regulator/hi6421v600-regulator.c b/drivers/regulator/hi6421v600-regulator.c
index 4e10daa1e689..e5f6fbfc9016 100644
--- a/drivers/regulator/hi6421v600-regulator.c
+++ b/drivers/regulator/hi6421v600-regulator.c
@@ -118,7 +118,7 @@ static int hi6421_spmi_regulator_enable(struct regulator_dev *rdev)
 
 static unsigned int hi6421_spmi_regulator_get_mode(struct regulator_dev *rdev)
 {
-	struct hi6421_spmi_reg_info *sreg;
+	const struct hi6421_spmi_reg_info *sreg;
 	unsigned int reg_val;
 
 	sreg = container_of(rdev->desc, struct hi6421_spmi_reg_info, desc);
@@ -133,7 +133,7 @@ static unsigned int hi6421_spmi_regulator_get_mode(struct regulator_dev *rdev)
 static int hi6421_spmi_regulator_set_mode(struct regulator_dev *rdev,
 					  unsigned int mode)
 {
-	struct hi6421_spmi_reg_info *sreg;
+	const struct hi6421_spmi_reg_info *sreg;
 	unsigned int val;
 
 	sreg = container_of(rdev->desc, struct hi6421_spmi_reg_info, desc);
@@ -160,7 +160,7 @@ hi6421_spmi_regulator_get_optimum_mode(struct regulator_dev *rdev,
 				       int input_uV, int output_uV,
 				       int load_uA)
 {
-	struct hi6421_spmi_reg_info *sreg;
+	const struct hi6421_spmi_reg_info *sreg;
 
 	sreg = container_of(rdev->desc, struct hi6421_spmi_reg_info, desc);
 
@@ -195,7 +195,7 @@ enum hi6421_spmi_regulator_id {
 	hi6421v600_ldo34,
 };
 
-static struct hi6421_spmi_reg_info regulator_info[] = {
+static const struct hi6421_spmi_reg_info regulator_info[] = {
 	HI6421V600_LDO(ldo3, range_1v5_to_2v0,
 		       0x16, 0x01, 0x51,
 		       20000, 120,
@@ -235,7 +235,7 @@ static int hi6421_spmi_regulator_probe(struct platform_device *pdev)
 	struct device *pmic_dev = pdev->dev.parent;
 	struct regulator_config config = { };
 	struct hi6421_spmi_reg_priv *priv;
-	struct hi6421_spmi_reg_info *info;
+	const struct hi6421_spmi_reg_info *info;
 	struct device *dev = &pdev->dev;
 	struct regmap *regmap;
 	struct regulator_dev *rdev;

-- 
2.43.0



From krzysztof.kozlowski at linaro.org  Mon Sep  9 06:51:20 2024
From: krzysztof.kozlowski at linaro.org (Krzysztof Kozlowski)
Date: Mon, 09 Sep 2024 15:51:20 +0200
Subject: [PATCH 09/17] regulator: max77826: Drop unused 'rdesc' in 'struct
 max77826_regulator_info'
In-Reply-To: <20240909-regulator-const-v1-0-8934704a5787@linaro.org>
References: <20240909-regulator-const-v1-0-8934704a5787@linaro.org>
Message-ID: <20240909-regulator-const-v1-9-8934704a5787@linaro.org>

The max77826_regulator_info.rdesc is assigned once and never used again.

Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski at linaro.org>
---
 drivers/regulator/max77826-regulator.c | 2 --
 1 file changed, 2 deletions(-)

diff --git a/drivers/regulator/max77826-regulator.c b/drivers/regulator/max77826-regulator.c
index 5590cdf615b7..4b656a694108 100644
--- a/drivers/regulator/max77826-regulator.c
+++ b/drivers/regulator/max77826-regulator.c
@@ -153,7 +153,6 @@ enum max77826_regulators {
 
 struct max77826_regulator_info {
 	struct regmap *regmap;
-	struct regulator_desc *rdesc;
 };
 
 static const struct regmap_config max77826_regmap_config = {
@@ -246,7 +245,6 @@ static int max77826_i2c_probe(struct i2c_client *client)
 	if (!info)
 		return -ENOMEM;
 
-	info->rdesc = max77826_regulators_desc;
 	regmap = devm_regmap_init_i2c(client, &max77826_regmap_config);
 	if (IS_ERR(regmap)) {
 		dev_err(dev, "Failed to allocate regmap!\n");

-- 
2.43.0



From krzysztof.kozlowski at linaro.org  Mon Sep  9 06:51:21 2024
From: krzysztof.kozlowski at linaro.org (Krzysztof Kozlowski)
Date: Mon, 09 Sep 2024 15:51:21 +0200
Subject: [PATCH 10/17] regulator: max77826: Constify static data
In-Reply-To: <20240909-regulator-const-v1-0-8934704a5787@linaro.org>
References: <20240909-regulator-const-v1-0-8934704a5787@linaro.org>
Message-ID: <20240909-regulator-const-v1-10-8934704a5787@linaro.org>

Driver does not modify static data with regulator description (struct
regulator_desc), so make it const for code safety.

Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski at linaro.org>
---
 drivers/regulator/max77826-regulator.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/regulator/max77826-regulator.c b/drivers/regulator/max77826-regulator.c
index 4b656a694108..310bc8ee7af8 100644
--- a/drivers/regulator/max77826-regulator.c
+++ b/drivers/regulator/max77826-regulator.c
@@ -186,7 +186,7 @@ static const struct regulator_ops max77826_buck_ops = {
 	.set_voltage_time_sel	= max77826_set_voltage_time_sel,
 };
 
-static struct regulator_desc max77826_regulators_desc[] = {
+static const struct regulator_desc max77826_regulators_desc[] = {
 	MAX77826_LDO(1, NMOS),
 	MAX77826_LDO(2, NMOS),
 	MAX77826_LDO(3, NMOS),

-- 
2.43.0



From krzysztof.kozlowski at linaro.org  Mon Sep  9 06:51:22 2024
From: krzysztof.kozlowski at linaro.org (Krzysztof Kozlowski)
Date: Mon, 09 Sep 2024 15:51:22 +0200
Subject: [PATCH 11/17] regulator: mtk-dvfsrc: Constify static data
In-Reply-To: <20240909-regulator-const-v1-0-8934704a5787@linaro.org>
References: <20240909-regulator-const-v1-0-8934704a5787@linaro.org>
Message-ID: <20240909-regulator-const-v1-11-8934704a5787@linaro.org>

Driver does not modify static data with regulator description (struct
regulator_desc), so make it const for code safety.

Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski at linaro.org>

---

Have in mind that to compile this code, you need pending (off-tree)
patches, which I applied.
---
 drivers/regulator/mtk-dvfsrc-regulator.c | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/drivers/regulator/mtk-dvfsrc-regulator.c b/drivers/regulator/mtk-dvfsrc-regulator.c
index 9bf4163221f1..f5662c569464 100644
--- a/drivers/regulator/mtk-dvfsrc-regulator.c
+++ b/drivers/regulator/mtk-dvfsrc-regulator.c
@@ -19,7 +19,7 @@ enum dvfsrc_regulator_id {
 };
 
 struct dvfsrc_regulator_pdata {
-	struct regulator_desc *descs;
+	const struct regulator_desc *descs;
 	u32 size;
 };
 
@@ -107,7 +107,7 @@ static const unsigned int mt6873_voltages[] = {
 	725000,
 };
 
-static struct regulator_desc mt6873_regulators[] = {
+static const struct regulator_desc mt6873_regulators[] = {
 	MTK_DVFSRC_VREG("dvfsrc-vcore", VCORE, mt6873_voltages),
 	MTK_DVFSRC_VREG("dvfsrc-vscp", VSCP, mt6873_voltages),
 };
@@ -122,7 +122,7 @@ static const unsigned int mt8183_voltages[] = {
 	800000,
 };
 
-static struct regulator_desc mt8183_regulators[] = {
+static const struct regulator_desc mt8183_regulators[] = {
 	MTK_DVFSRC_VREG("dvfsrc-vcore", VCORE, mt8183_voltages),
 };
 
@@ -138,7 +138,7 @@ static const unsigned int mt8195_voltages[] = {
 	750000,
 };
 
-static struct regulator_desc mt8195_regulators[] = {
+static const struct regulator_desc mt8195_regulators[] = {
 	MTK_DVFSRC_VREG("dvfsrc-vcore", VCORE, mt8195_voltages),
 	MTK_DVFSRC_VREG("dvfsrc-vscp", VSCP, mt8195_voltages),
 };
@@ -159,7 +159,7 @@ static int dvfsrc_vcore_regulator_probe(struct platform_device *pdev)
 		return -EINVAL;
 
 	for (i = 0; i < pdata->size; i++) {
-		struct regulator_desc *vrdesc = &pdata->descs[i];
+		const struct regulator_desc *vrdesc = &pdata->descs[i];
 		struct regulator_dev *rdev;
 
 		rdev = devm_regulator_register(&pdev->dev, vrdesc, &config);

-- 
2.43.0



From krzysztof.kozlowski at linaro.org  Mon Sep  9 06:51:23 2024
From: krzysztof.kozlowski at linaro.org (Krzysztof Kozlowski)
Date: Mon, 09 Sep 2024 15:51:23 +0200
Subject: [PATCH 12/17] regulator: pcap: Constify static data
In-Reply-To: <20240909-regulator-const-v1-0-8934704a5787@linaro.org>
References: <20240909-regulator-const-v1-0-8934704a5787@linaro.org>
Message-ID: <20240909-regulator-const-v1-12-8934704a5787@linaro.org>

Driver does not modify static data with regulator description (struct
pcap_regulator), so make it const for code safety.

Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski at linaro.org>
---
 drivers/regulator/pcap-regulator.c | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/drivers/regulator/pcap-regulator.c b/drivers/regulator/pcap-regulator.c
index 319a88412154..441c9344aef7 100644
--- a/drivers/regulator/pcap-regulator.c
+++ b/drivers/regulator/pcap-regulator.c
@@ -105,7 +105,7 @@ struct pcap_regulator {
 		.lowpwr		= _lowpwr,				\
 	}
 
-static struct pcap_regulator vreg_table[] = {
+static const struct pcap_regulator vreg_table[] = {
 	VREG_INFO(V1,    PCAP_REG_VREG1,   1,  2,  18, 0),
 	VREG_INFO(V2,    PCAP_REG_VREG1,   5,  6,  19, 22),
 	VREG_INFO(V3,    PCAP_REG_VREG1,   7,  8,  20, 23),
@@ -141,7 +141,7 @@ static struct pcap_regulator vreg_table[] = {
 static int pcap_regulator_set_voltage_sel(struct regulator_dev *rdev,
 					  unsigned selector)
 {
-	struct pcap_regulator *vreg = &vreg_table[rdev_get_id(rdev)];
+	const struct pcap_regulator *vreg = &vreg_table[rdev_get_id(rdev)];
 	void *pcap = rdev_get_drvdata(rdev);
 
 	/* the regulator doesn't support voltage switching */
@@ -155,7 +155,7 @@ static int pcap_regulator_set_voltage_sel(struct regulator_dev *rdev,
 
 static int pcap_regulator_get_voltage_sel(struct regulator_dev *rdev)
 {
-	struct pcap_regulator *vreg = &vreg_table[rdev_get_id(rdev)];
+	const struct pcap_regulator *vreg = &vreg_table[rdev_get_id(rdev)];
 	void *pcap = rdev_get_drvdata(rdev);
 	u32 tmp;
 
@@ -169,7 +169,7 @@ static int pcap_regulator_get_voltage_sel(struct regulator_dev *rdev)
 
 static int pcap_regulator_enable(struct regulator_dev *rdev)
 {
-	struct pcap_regulator *vreg = &vreg_table[rdev_get_id(rdev)];
+	const struct pcap_regulator *vreg = &vreg_table[rdev_get_id(rdev)];
 	void *pcap = rdev_get_drvdata(rdev);
 
 	if (vreg->en == NA)
@@ -180,7 +180,7 @@ static int pcap_regulator_enable(struct regulator_dev *rdev)
 
 static int pcap_regulator_disable(struct regulator_dev *rdev)
 {
-	struct pcap_regulator *vreg = &vreg_table[rdev_get_id(rdev)];
+	const struct pcap_regulator *vreg = &vreg_table[rdev_get_id(rdev)];
 	void *pcap = rdev_get_drvdata(rdev);
 
 	if (vreg->en == NA)
@@ -191,7 +191,7 @@ static int pcap_regulator_disable(struct regulator_dev *rdev)
 
 static int pcap_regulator_is_enabled(struct regulator_dev *rdev)
 {
-	struct pcap_regulator *vreg = &vreg_table[rdev_get_id(rdev)];
+	const struct pcap_regulator *vreg = &vreg_table[rdev_get_id(rdev)];
 	void *pcap = rdev_get_drvdata(rdev);
 	u32 tmp;
 

-- 
2.43.0



From krzysztof.kozlowski at linaro.org  Mon Sep  9 06:51:24 2024
From: krzysztof.kozlowski at linaro.org (Krzysztof Kozlowski)
Date: Mon, 09 Sep 2024 15:51:24 +0200
Subject: [PATCH 13/17] regulator: pfuze100: Constify static data
In-Reply-To: <20240909-regulator-const-v1-0-8934704a5787@linaro.org>
References: <20240909-regulator-const-v1-0-8934704a5787@linaro.org>
Message-ID: <20240909-regulator-const-v1-13-8934704a5787@linaro.org>

Driver does not modify static data with regulator description (struct
pfuze_regulator), so make it const for code safety.

Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski at linaro.org>
---
 drivers/regulator/pfuze100-regulator.c | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/drivers/regulator/pfuze100-regulator.c b/drivers/regulator/pfuze100-regulator.c
index 7c04870442d3..7d56c22b5e40 100644
--- a/drivers/regulator/pfuze100-regulator.c
+++ b/drivers/regulator/pfuze100-regulator.c
@@ -76,7 +76,7 @@ struct pfuze_chip {
 	struct device *dev;
 	struct pfuze_regulator regulator_descs[PFUZE100_MAX_REGULATOR];
 	struct regulator_dev *regulators[PFUZE100_MAX_REGULATOR];
-	struct pfuze_regulator *pfuze_regulators;
+	const struct pfuze_regulator *pfuze_regulators;
 };
 
 static const int pfuze100_swbst[] = {
@@ -367,7 +367,7 @@ static const struct regulator_ops pfuze3000_sw_regulator_ops = {
 }
 
 /* PFUZE100 */
-static struct pfuze_regulator pfuze100_regulators[] = {
+static const struct pfuze_regulator pfuze100_regulators[] = {
 	PFUZE100_SW_REG(PFUZE100, SW1AB, PFUZE100_SW1ABVOL, 300000, 1875000, 25000),
 	PFUZE100_SW_REG(PFUZE100, SW1C, PFUZE100_SW1CVOL, 300000, 1875000, 25000),
 	PFUZE100_SW_REG(PFUZE100, SW2, PFUZE100_SW2VOL, 400000, 1975000, 25000),
@@ -386,7 +386,7 @@ static struct pfuze_regulator pfuze100_regulators[] = {
 	PFUZE100_COIN_REG(PFUZE100, COIN, PFUZE100_COINVOL, 0x7, pfuze100_coin),
 };
 
-static struct pfuze_regulator pfuze200_regulators[] = {
+static const struct pfuze_regulator pfuze200_regulators[] = {
 	PFUZE100_SW_REG(PFUZE200, SW1AB, PFUZE100_SW1ABVOL, 300000, 1875000, 25000),
 	PFUZE100_SW_REG(PFUZE200, SW2, PFUZE100_SW2VOL, 400000, 1975000, 25000),
 	PFUZE100_SW_REG(PFUZE200, SW3A, PFUZE100_SW3AVOL, 400000, 1975000, 25000),
@@ -403,7 +403,7 @@ static struct pfuze_regulator pfuze200_regulators[] = {
 	PFUZE100_COIN_REG(PFUZE200, COIN, PFUZE100_COINVOL, 0x7, pfuze100_coin),
 };
 
-static struct pfuze_regulator pfuze3000_regulators[] = {
+static const struct pfuze_regulator pfuze3000_regulators[] = {
 	PFUZE3000_SW_REG(PFUZE3000, SW1A, PFUZE100_SW1ABVOL, 0x1f, pfuze3000_sw1a),
 	PFUZE100_SW_REG(PFUZE3000, SW1B, PFUZE100_SW1CVOL, 700000, 1475000, 25000),
 	PFUZE3000_SW_REG(PFUZE3000, SW2, PFUZE100_SW2VOL, 0x7, pfuze3000_sw2lo),
@@ -419,7 +419,7 @@ static struct pfuze_regulator pfuze3000_regulators[] = {
 	PFUZE100_VGEN_REG(PFUZE3000, VLDO4, PFUZE100_VGEN6VOL, 1800000, 3300000, 100000),
 };
 
-static struct pfuze_regulator pfuze3001_regulators[] = {
+static const struct pfuze_regulator pfuze3001_regulators[] = {
 	PFUZE3000_SW_REG(PFUZE3001, SW1, PFUZE100_SW1ABVOL, 0x1f, pfuze3000_sw1a),
 	PFUZE3000_SW_REG(PFUZE3001, SW2, PFUZE100_SW2VOL, 0x7, pfuze3000_sw2lo),
 	PFUZE3000_SW3_REG(PFUZE3001, SW3, PFUZE100_SW3AVOL, 900000, 1650000, 50000),

-- 
2.43.0



From krzysztof.kozlowski at linaro.org  Mon Sep  9 06:51:25 2024
From: krzysztof.kozlowski at linaro.org (Krzysztof Kozlowski)
Date: Mon, 09 Sep 2024 15:51:25 +0200
Subject: [PATCH 14/17] regulator: qcom-refgen: Constify static data
In-Reply-To: <20240909-regulator-const-v1-0-8934704a5787@linaro.org>
References: <20240909-regulator-const-v1-0-8934704a5787@linaro.org>
Message-ID: <20240909-regulator-const-v1-14-8934704a5787@linaro.org>

Driver does not modify static data with regulator description (struct
regulator_desc), so make it const for code safety.

Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski at linaro.org>
---
 drivers/regulator/qcom-refgen-regulator.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/regulator/qcom-refgen-regulator.c b/drivers/regulator/qcom-refgen-regulator.c
index 063e12c08e75..cfa72ce85bc8 100644
--- a/drivers/regulator/qcom-refgen-regulator.c
+++ b/drivers/regulator/qcom-refgen-regulator.c
@@ -62,7 +62,7 @@ static int qcom_sdm845_refgen_is_enabled(struct regulator_dev *rdev)
 	return 1;
 }
 
-static struct regulator_desc sdm845_refgen_desc = {
+static const struct regulator_desc sdm845_refgen_desc = {
 	.enable_time = 5,
 	.name = "refgen",
 	.owner = THIS_MODULE,
@@ -74,7 +74,7 @@ static struct regulator_desc sdm845_refgen_desc = {
 	},
 };
 
-static struct regulator_desc sm8250_refgen_desc = {
+static const struct regulator_desc sm8250_refgen_desc = {
 	.enable_reg = REFGEN_REG_PWRDWN_CTRL5,
 	.enable_mask = REFGEN_PWRDWN_CTRL5_MASK,
 	.enable_val = REFGEN_PWRDWN_CTRL5_ENABLE,

-- 
2.43.0



From krzysztof.kozlowski at linaro.org  Mon Sep  9 06:51:26 2024
From: krzysztof.kozlowski at linaro.org (Krzysztof Kozlowski)
Date: Mon, 09 Sep 2024 15:51:26 +0200
Subject: [PATCH 15/17] regulator: hi6421v530: Drop unused 'eco_microamp'
In-Reply-To: <20240909-regulator-const-v1-0-8934704a5787@linaro.org>
References: <20240909-regulator-const-v1-0-8934704a5787@linaro.org>
Message-ID: <20240909-regulator-const-v1-15-8934704a5787@linaro.org>

The hi6421v530_regulator_info.eco_microamp is assigned once and never
used again.

Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski at linaro.org>
---
 drivers/regulator/hi6421v530-regulator.c | 16 ++++++----------
 1 file changed, 6 insertions(+), 10 deletions(-)

diff --git a/drivers/regulator/hi6421v530-regulator.c b/drivers/regulator/hi6421v530-regulator.c
index 23924ff0c7b2..a9c6c077f50d 100644
--- a/drivers/regulator/hi6421v530-regulator.c
+++ b/drivers/regulator/hi6421v530-regulator.c
@@ -21,12 +21,10 @@
  * struct hi6421v530_regulator_info - hi6421v530 regulator information
  * @desc: regulator description
  * @mode_mask: ECO mode bitmask of LDOs; for BUCKs, this masks sleep
- * @eco_microamp: eco mode load upper limit (in uA), valid for LDOs only
  */
 struct hi6421v530_regulator_info {
 	struct regulator_desc rdesc;
 	u8 mode_mask;
-	u32 eco_microamp;
 };
 
 /* HI6421v530 regulators */
@@ -68,10 +66,9 @@ static const struct regulator_ops hi6421v530_ldo_ops;
  * emask - enable mask
  * odelay - off/on delay time in uS
  * ecomask - eco mode mask
- * ecoamp - eco mode load uppler limit in uA
  */
 #define HI6421V530_LDO(_ID, v_table, vreg, vmask, ereg, emask,		\
-		   odelay, ecomask, ecoamp) {				\
+		   odelay, ecomask) {					\
 	.rdesc = {							\
 		.name		 = #_ID,				\
 		.of_match        = of_match_ptr(#_ID),			\
@@ -90,22 +87,21 @@ static const struct regulator_ops hi6421v530_ldo_ops;
 		.off_on_delay	 = odelay,				\
 	},								\
 	.mode_mask	= ecomask,					\
-	.eco_microamp	= ecoamp,					\
 }
 
 /* HI6421V530 regulator information */
 
 static struct hi6421v530_regulator_info hi6421v530_regulator_info[] = {
 	HI6421V530_LDO(LDO3, ldo_3_voltages, 0x061, 0xf, 0x060, 0x2,
-		   20000, 0x6, 8000),
+		   20000, 0x6),
 	HI6421V530_LDO(LDO9, ldo_9_11_voltages, 0x06b, 0x7, 0x06a, 0x2,
-		   40000, 0x6, 8000),
+		   40000, 0x6),
 	HI6421V530_LDO(LDO11, ldo_9_11_voltages, 0x06f, 0x7, 0x06e, 0x2,
-		   40000, 0x6, 8000),
+		   40000, 0x6),
 	HI6421V530_LDO(LDO15, ldo_15_16_voltages, 0x077, 0x7, 0x076, 0x2,
-		   40000, 0x6, 8000),
+		   40000, 0x6),
 	HI6421V530_LDO(LDO16, ldo_15_16_voltages, 0x079, 0x7, 0x078, 0x2,
-		   40000, 0x6, 8000),
+		   40000, 0x6),
 };
 
 static unsigned int hi6421v530_regulator_ldo_get_mode(

-- 
2.43.0



From krzysztof.kozlowski at linaro.org  Mon Sep  9 06:51:19 2024
From: krzysztof.kozlowski at linaro.org (Krzysztof Kozlowski)
Date: Mon, 09 Sep 2024 15:51:19 +0200
Subject: [PATCH 08/17] regulator: tps65023: Constify static data
In-Reply-To: <20240909-regulator-const-v1-0-8934704a5787@linaro.org>
References: <20240909-regulator-const-v1-0-8934704a5787@linaro.org>
Message-ID: <20240909-regulator-const-v1-8-8934704a5787@linaro.org>

Driver does not modify static data with regulator description (struct
tps_driver_data), so make it const for code safety.

Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski at linaro.org>
---
 drivers/regulator/tps65023-regulator.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/regulator/tps65023-regulator.c b/drivers/regulator/tps65023-regulator.c
index d5757fd9a65b..3334b5b7d907 100644
--- a/drivers/regulator/tps65023-regulator.c
+++ b/drivers/regulator/tps65023-regulator.c
@@ -242,17 +242,17 @@ static const struct regulator_desc tps65023_regulators[] = {
 	TPS65023_REGULATOR_LDO(2, TPS65023_LDO2_VSEL_table, 0x70),
 };
 
-static struct tps_driver_data tps65020_drv_data = {
+static const struct tps_driver_data tps65020_drv_data = {
 	.desc = tps65020_regulators,
 	.core_regulator = TPS65023_DCDC_3,
 };
 
-static struct tps_driver_data tps65021_drv_data = {
+static const struct tps_driver_data tps65021_drv_data = {
 	.desc = tps65021_regulators,
 	.core_regulator = TPS65023_DCDC_3,
 };
 
-static struct tps_driver_data tps65023_drv_data = {
+static const struct tps_driver_data tps65023_drv_data = {
 	.desc = tps65023_regulators,
 	.core_regulator = TPS65023_DCDC_1,
 };

-- 
2.43.0



From krzysztof.kozlowski at linaro.org  Mon Sep  9 06:51:27 2024
From: krzysztof.kozlowski at linaro.org (Krzysztof Kozlowski)
Date: Mon, 09 Sep 2024 15:51:27 +0200
Subject: [PATCH 16/17] regulator: hi6421v530: Use container_of and constify
 static data
In-Reply-To: <20240909-regulator-const-v1-0-8934704a5787@linaro.org>
References: <20240909-regulator-const-v1-0-8934704a5787@linaro.org>
Message-ID: <20240909-regulator-const-v1-16-8934704a5787@linaro.org>

Switch from rdev_get_drvdata() to container_of(), so the static
'struct hi6421v530_regulator_info' holding 'struct regulator_desc' can
be made const for code safety.

Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski at linaro.org>

---

[RFT]: Not tested, only built.
---
 drivers/regulator/hi6421v530-regulator.c | 11 +++++------
 1 file changed, 5 insertions(+), 6 deletions(-)

diff --git a/drivers/regulator/hi6421v530-regulator.c b/drivers/regulator/hi6421v530-regulator.c
index a9c6c077f50d..b3ebd1624814 100644
--- a/drivers/regulator/hi6421v530-regulator.c
+++ b/drivers/regulator/hi6421v530-regulator.c
@@ -91,7 +91,7 @@ static const struct regulator_ops hi6421v530_ldo_ops;
 
 /* HI6421V530 regulator information */
 
-static struct hi6421v530_regulator_info hi6421v530_regulator_info[] = {
+static const struct hi6421v530_regulator_info hi6421v530_regulator_info[] = {
 	HI6421V530_LDO(LDO3, ldo_3_voltages, 0x061, 0xf, 0x060, 0x2,
 		   20000, 0x6),
 	HI6421V530_LDO(LDO9, ldo_9_11_voltages, 0x06b, 0x7, 0x06a, 0x2,
@@ -107,10 +107,10 @@ static struct hi6421v530_regulator_info hi6421v530_regulator_info[] = {
 static unsigned int hi6421v530_regulator_ldo_get_mode(
 					struct regulator_dev *rdev)
 {
-	struct hi6421v530_regulator_info *info;
+	const struct hi6421v530_regulator_info *info;
 	unsigned int reg_val;
 
-	info = rdev_get_drvdata(rdev);
+	info = container_of(rdev->desc, struct hi6421v530_regulator_info, rdesc);
 	regmap_read(rdev->regmap, rdev->desc->enable_reg, &reg_val);
 
 	if (reg_val & (info->mode_mask))
@@ -122,10 +122,10 @@ static unsigned int hi6421v530_regulator_ldo_get_mode(
 static int hi6421v530_regulator_ldo_set_mode(struct regulator_dev *rdev,
 						unsigned int mode)
 {
-	struct hi6421v530_regulator_info *info;
+	const struct hi6421v530_regulator_info *info;
 	unsigned int new_mode;
 
-	info = rdev_get_drvdata(rdev);
+	info = container_of(rdev->desc, struct hi6421v530_regulator_info, rdesc);
 	switch (mode) {
 	case REGULATOR_MODE_NORMAL:
 		new_mode = 0;
@@ -172,7 +172,6 @@ static int hi6421v530_regulator_probe(struct platform_device *pdev)
 	for (i = 0; i < ARRAY_SIZE(hi6421v530_regulator_info); i++) {
 		config.dev = pdev->dev.parent;
 		config.regmap = pmic->regmap;
-		config.driver_data = &hi6421v530_regulator_info[i];
 
 		rdev = devm_regulator_register(&pdev->dev,
 				&hi6421v530_regulator_info[i].rdesc,

-- 
2.43.0



From krzysztof.kozlowski at linaro.org  Mon Sep  9 06:51:28 2024
From: krzysztof.kozlowski at linaro.org (Krzysztof Kozlowski)
Date: Mon, 09 Sep 2024 15:51:28 +0200
Subject: [PATCH 17/17] regulator: max77650: Use container_of and constify
 static data
In-Reply-To: <20240909-regulator-const-v1-0-8934704a5787@linaro.org>
References: <20240909-regulator-const-v1-0-8934704a5787@linaro.org>
Message-ID: <20240909-regulator-const-v1-17-8934704a5787@linaro.org>

Switch from rdev_get_drvdata() to container_of(), so the static
'struct max77650_regulator_desc' holding 'struct regulator_desc' can
be made const for code safety.

Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski at linaro.org>

---

[RFT]: Not tested, only built.
---
 drivers/regulator/max77650-regulator.c | 31 ++++++++++++++-----------------
 1 file changed, 14 insertions(+), 17 deletions(-)

diff --git a/drivers/regulator/max77650-regulator.c b/drivers/regulator/max77650-regulator.c
index 94abfbb2bc1e..7368f54f046d 100644
--- a/drivers/regulator/max77650-regulator.c
+++ b/drivers/regulator/max77650-regulator.c
@@ -43,8 +43,6 @@ struct max77650_regulator_desc {
 	unsigned int regB;
 };
 
-static struct max77650_regulator_desc max77651_SBB1_desc;
-
 static const unsigned int max77651_sbb1_volt_range_sel[] = {
 	0x0, 0x1, 0x2, 0x3
 };
@@ -66,11 +64,11 @@ static const unsigned int max77650_current_limit_table[] = {
 
 static int max77650_regulator_is_enabled(struct regulator_dev *rdev)
 {
-	struct max77650_regulator_desc *rdesc;
+	const struct max77650_regulator_desc *rdesc;
 	struct regmap *map;
 	int val, rv, en;
 
-	rdesc = rdev_get_drvdata(rdev);
+	rdesc = container_of(rdev->desc, struct max77650_regulator_desc, desc);
 	map = rdev_get_regmap(rdev);
 
 	rv = regmap_read(map, rdesc->regB, &val);
@@ -84,10 +82,10 @@ static int max77650_regulator_is_enabled(struct regulator_dev *rdev)
 
 static int max77650_regulator_enable(struct regulator_dev *rdev)
 {
-	struct max77650_regulator_desc *rdesc;
+	const struct max77650_regulator_desc *rdesc;
 	struct regmap *map;
 
-	rdesc = rdev_get_drvdata(rdev);
+	rdesc = container_of(rdev->desc, struct max77650_regulator_desc, desc);
 	map = rdev_get_regmap(rdev);
 
 	return regmap_update_bits(map, rdesc->regB,
@@ -97,10 +95,10 @@ static int max77650_regulator_enable(struct regulator_dev *rdev)
 
 static int max77650_regulator_disable(struct regulator_dev *rdev)
 {
-	struct max77650_regulator_desc *rdesc;
+	const struct max77650_regulator_desc *rdesc;
 	struct regmap *map;
 
-	rdesc = rdev_get_drvdata(rdev);
+	rdesc = container_of(rdev->desc, struct max77650_regulator_desc, desc);
 	map = rdev_get_regmap(rdev);
 
 	return regmap_update_bits(map, rdesc->regB,
@@ -145,7 +143,7 @@ static const struct regulator_ops max77651_SBB1_regulator_ops = {
 	.set_active_discharge	= regulator_set_active_discharge_regmap,
 };
 
-static struct max77650_regulator_desc max77650_LDO_desc = {
+static const struct max77650_regulator_desc max77650_LDO_desc = {
 	.desc = {
 		.name			= "ldo",
 		.of_match		= of_match_ptr("ldo"),
@@ -171,7 +169,7 @@ static struct max77650_regulator_desc max77650_LDO_desc = {
 	.regB		= MAX77650_REG_CNFG_LDO_B,
 };
 
-static struct max77650_regulator_desc max77650_SBB0_desc = {
+static const struct max77650_regulator_desc max77650_SBB0_desc = {
 	.desc = {
 		.name			= "sbb0",
 		.of_match		= of_match_ptr("sbb0"),
@@ -201,7 +199,7 @@ static struct max77650_regulator_desc max77650_SBB0_desc = {
 	.regB		= MAX77650_REG_CNFG_SBB0_B,
 };
 
-static struct max77650_regulator_desc max77650_SBB1_desc = {
+static const struct max77650_regulator_desc max77650_SBB1_desc = {
 	.desc = {
 		.name			= "sbb1",
 		.of_match		= of_match_ptr("sbb1"),
@@ -231,7 +229,7 @@ static struct max77650_regulator_desc max77650_SBB1_desc = {
 	.regB		= MAX77650_REG_CNFG_SBB1_B,
 };
 
-static struct max77650_regulator_desc max77651_SBB1_desc = {
+static const struct max77650_regulator_desc max77651_SBB1_desc = {
 	.desc = {
 		.name			= "sbb1",
 		.of_match		= of_match_ptr("sbb1"),
@@ -264,7 +262,7 @@ static struct max77650_regulator_desc max77651_SBB1_desc = {
 	.regB		= MAX77650_REG_CNFG_SBB1_B,
 };
 
-static struct max77650_regulator_desc max77650_SBB2_desc = {
+static const struct max77650_regulator_desc max77650_SBB2_desc = {
 	.desc = {
 		.name			= "sbb2",
 		.of_match		= of_match_ptr("sbb2"),
@@ -294,7 +292,7 @@ static struct max77650_regulator_desc max77650_SBB2_desc = {
 	.regB		= MAX77650_REG_CNFG_SBB2_B,
 };
 
-static struct max77650_regulator_desc max77651_SBB2_desc = {
+static const struct max77650_regulator_desc max77651_SBB2_desc = {
 	.desc = {
 		.name			= "sbb2",
 		.of_match		= of_match_ptr("sbb2"),
@@ -326,8 +324,8 @@ static struct max77650_regulator_desc max77651_SBB2_desc = {
 
 static int max77650_regulator_probe(struct platform_device *pdev)
 {
-	struct max77650_regulator_desc **rdescs;
-	struct max77650_regulator_desc *rdesc;
+	const struct max77650_regulator_desc **rdescs;
+	const struct max77650_regulator_desc *rdesc;
 	struct regulator_config config = { };
 	struct device *dev, *parent;
 	struct regulator_dev *rdev;
@@ -376,7 +374,6 @@ static int max77650_regulator_probe(struct platform_device *pdev)
 
 	for (i = 0; i < MAX77650_REGULATOR_NUM_REGULATORS; i++) {
 		rdesc = rdescs[i];
-		config.driver_data = rdesc;
 
 		rdev = devm_regulator_register(dev, &rdesc->desc, &config);
 		if (IS_ERR(rdev))

-- 
2.43.0



From angelogioacchino.delregno at collabora.com  Mon Sep  9 07:34:35 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Mon, 9 Sep 2024 14:34:35 +0000
Subject: [PATCH v5 2/2] arm64: dts: mediatek: Add MT8186 Ponyta
 Chromebooks
In-Reply-To: <20240909023148.1677936-3-cengjianeng@huaqin.corp-partner.google.com>
References: <CAJMQK-imYrDTuycVzQxkfbkZuHehE8uwc+qS2w=UDShETsBvEw@mail.gmail.com>
 <20240909023148.1677936-1-cengjianeng@huaqin.corp-partner.google.com>
 <20240909023148.1677936-3-cengjianeng@huaqin.corp-partner.google.com>
Message-ID: <01020191d7353903-ef7f28db-4285-473b-af03-38d1cc663042-000000@eu-west-1.amazonses.com>

Il 09/09/24 04:31, Jianeng Ceng ha scritto:
> MT8186 ponyta, known as huaqin custom label, is a
> MT8186 based laptop. It is based on the "corsola" design.
> It includes LTE, touchpad combinations.
> 
> Signed-off-by: Jianeng Ceng <cengjianeng at huaqin.corp-partner.google.com>
> ---
> Changes in v5:
> - PATCH 2/2: Remove sku2147483647.
> - Link to v4:https://lore.kernel.org/all/20240906085739.1322676-3-cengjianeng at huaqin.corp-partner.google.com/
> 
> Chage since v3:
> - No change.
> 
> Changes in v2:
> - PATCH 2/2: Modify the dtb name without rev2.
> - Link to v1:https://lore.kernel.org/all/20240902125502.1844374-1-cengjianeng at huaqin.corp-partner.google.com/
> 
> ---
>   arch/arm64/boot/dts/mediatek/Makefile         |  2 +
>   .../mediatek/mt8186-corsola-ponyta-sku0.dts   | 23 ++++++++++
>   .../mediatek/mt8186-corsola-ponyta-sku1.dts   | 27 ++++++++++++
>   .../dts/mediatek/mt8186-corsola-ponyta.dtsi   | 44 +++++++++++++++++++
>   4 files changed, 96 insertions(+)
>   create mode 100644 arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku0.dts
>   create mode 100644 arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku1.dts
>   create mode 100644 arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta.dtsi
> 
> diff --git a/arch/arm64/boot/dts/mediatek/Makefile b/arch/arm64/boot/dts/mediatek/Makefile
> index 8fd7b2bb7a15..50b5cf04d3ae 100644
> --- a/arch/arm64/boot/dts/mediatek/Makefile
> +++ b/arch/arm64/boot/dts/mediatek/Makefile
> @@ -58,6 +58,8 @@ dtb-$(CONFIG_ARCH_MEDIATEK) += mt8183-pumpkin.dtb
>   dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-magneton-sku393216.dtb
>   dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-magneton-sku393217.dtb
>   dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-magneton-sku393218.dtb
> +dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-ponyta-sku0.dtb
> +dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-ponyta-sku1.dtb
>   dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-rusty-sku196608.dtb
>   dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-steelix-sku131072.dtb
>   dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-steelix-sku131073.dtb
> diff --git a/arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku0.dts b/arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku0.dts
> new file mode 100644
> index 000000000000..f6448e91436a
> --- /dev/null
> +++ b/arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku0.dts
> @@ -0,0 +1,23 @@
> +// SPDX-License-Identifier: (GPL-2.0 OR MIT)
> +/*
> + * Copyright 2023 Google LLC
> + */
> +
> +/dts-v1/;
> +#include "mt8186-corsola-ponyta.dtsi"
> +
> +/ {
> +	model = "Google Ponyta sku0/unprovisioned board";

Is this a prototype that will never go into the wild?!
Those machines will anyway be unavailable in the following months, so it looks
like it's really useless to add them.

If that's not just a prototype, then nevermind, we can add it.

> +	compatible = "google,ponyta-sku0", "google,ponyta", "mediatek,mt8186";
> +};
> +
> +&i2c2 {
> +	touchpad at 2c {

This is already inherited from mt8186-corsola-steelix.dtsi, so you simply need
to disable the other trackpad.

	trackpad at 15 {
		status = "disabled";
	};

> +		compatible = "hid-over-i2c";
> +		reg = <0x2c>;
> +		hid-descr-addr = <0x20>;
> +		interrupts-extended = <&pio 11 IRQ_TYPE_LEVEL_LOW>;
> +		vcc-supply = <&pp3300_s3>;
> +		wakeup-source;
> +	};
> +};
> diff --git a/arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku1.dts b/arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku1.dts
> new file mode 100644
> index 000000000000..203ee109bbf7
> --- /dev/null
> +++ b/arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku1.dts
> @@ -0,0 +1,27 @@
> +// SPDX-License-Identifier: (GPL-2.0 OR MIT)
> +/*
> + * Copyright 2023 Google LLC
> + */
> +
> +/dts-v1/;
> +#include "mt8186-corsola-ponyta.dtsi"
> +
> +/ {
> +	model = "Google Ponyta sku1 board";
> +	compatible = "google,ponyta-sku1", "google,ponyta", "mediatek,mt8186";
> +};
> +
> +&i2c2 {
> +	touchpad at 15 {

Same comment as the other one.... but here it will be

	trackpad at 2c {
		status = "disabled";
	};


Regards,
Angelo

> +		compatible = "elan,ekth3000";
> +		reg = <0x15>;
> +		interrupt-parent = <&pio>;
> +		interrupts = <11 IRQ_TYPE_LEVEL_LOW>;
> +		vcc-supply = <&pp3300_s3>;
> +		wakeup-source;
> +	};
> +};
> +
> +&usb_c1 {
> +	status = "disabled";
> +};
> diff --git a/arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta.dtsi b/arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta.dtsi
> new file mode 100644
> index 000000000000..59594022331e
> --- /dev/null
> +++ b/arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta.dtsi
> @@ -0,0 +1,44 @@
> +// SPDX-License-Identifier: (GPL-2.0 OR MIT)
> +/*
> + * Copyright 2023 Google LLC
> + */
> +
> +/dts-v1/;
> +#include "mt8186-corsola-steelix.dtsi"
> +
> +&keyboard_controller {
> +	function-row-physmap = <
> +		MATRIX_KEY(0x00, 0x02, 0)	/* T1 */
> +		MATRIX_KEY(0x03, 0x02, 0)	/* T2 */
> +		MATRIX_KEY(0x02, 0x02, 0)	/* T3 */
> +		MATRIX_KEY(0x01, 0x02, 0)	/* T4 */
> +		MATRIX_KEY(0x03, 0x04, 0)	/* T5 */
> +		MATRIX_KEY(0x02, 0x04, 0)	/* T6 */
> +		MATRIX_KEY(0x01, 0x04, 0)	/* T7 */
> +		MATRIX_KEY(0x00, 0x04, 0)	/* T8 */
> +		MATRIX_KEY(0x00, 0x01, 0)	/* T9 */
> +		MATRIX_KEY(0x02, 0x09, 0)	/* T10 */
> +		MATRIX_KEY(0x01, 0x09, 0)	/* T11 */
> +		MATRIX_KEY(0x01, 0x05, 0)	/* T12 */
> +	>;
> +
> +	linux,keymap = <
> +		CROS_STD_MAIN_KEYMAP
> +		MATRIX_KEY(0x00, 0x02, KEY_BACK)
> +		MATRIX_KEY(0x03, 0x02, KEY_REFRESH)
> +		MATRIX_KEY(0x02, 0x02, KEY_ZOOM)
> +		MATRIX_KEY(0x01, 0x02, KEY_SCALE)
> +		MATRIX_KEY(0x03, 0x04, KEY_SYSRQ)
> +		MATRIX_KEY(0x02, 0x04, KEY_BRIGHTNESSDOWN)
> +		MATRIX_KEY(0x01, 0x04, KEY_BRIGHTNESSUP)
> +		MATRIX_KEY(0x00, 0x04, KEY_PLAYPAUSE)
> +		MATRIX_KEY(0x00, 0x01, KEY_MICMUTE)
> +		MATRIX_KEY(0x02, 0x09, KEY_MUTE)
> +		MATRIX_KEY(0x01, 0x09, KEY_VOLUMEDOWN)
> +		MATRIX_KEY(0x01, 0x05, KEY_VOLUMEUP)
> +	>;
> +};
> +
> +&mt6366codec {
> +	mediatek,dmic-mode = <1>; /* one-wire */
> +};




From u.kleine-koenig at baylibre.com  Mon Sep  9 07:40:25 2024
From: u.kleine-koenig at baylibre.com (=?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?=)
Date: Mon,  9 Sep 2024 16:40:25 +0200
Subject: [PATCH] clk: Switch back to struct platform_driver::remove()
Message-ID: <20240909144026.870565-2-u.kleine-koenig@baylibre.com>

After commit 0edb555a65d1 ("platform: Make platform_driver::remove()
return void") .remove() is (again) the right callback to implement for
platform drivers.

Convert all clk drivers to use .remove(), with the eventual goal to drop
struct platform_driver::remove_new(). As .remove() and .remove_new() have
the same prototypes, conversion is done by just changing the structure
member name in the driver initializer.

Signed-off-by: Uwe Kleine-K?nig <u.kleine-koenig at baylibre.com>
---
Hello,

I was lazy and created a single patch for all of clk. Please tell me if
I should split per vendor (or per-driver). Given that touches so many
drivers, I also stripped the individual maintainers and just kept the
mailing lists. I hope this doesn't prevent people to give feedback, but
otherwise the Cc: list gets Huge.

Best regards
Uwe

 drivers/clk/axs10x/i2s_pll_clock.c              | 2 +-
 drivers/clk/bcm/clk-bcm2711-dvp.c               | 2 +-
 drivers/clk/bcm/clk-bcm63xx-gate.c              | 2 +-
 drivers/clk/bcm/clk-raspberrypi.c               | 2 +-
 drivers/clk/clk-fixed-factor.c                  | 2 +-
 drivers/clk/clk-fixed-mmio.c                    | 2 +-
 drivers/clk/clk-fixed-rate.c                    | 2 +-
 drivers/clk/clk-palmas.c                        | 2 +-
 drivers/clk/clk-pwm.c                           | 2 +-
 drivers/clk/clk-s2mps11.c                       | 2 +-
 drivers/clk/clk-scpi.c                          | 2 +-
 drivers/clk/hisilicon/clk-hi3519.c              | 2 +-
 drivers/clk/hisilicon/clk-hi3559a.c             | 2 +-
 drivers/clk/hisilicon/crg-hi3516cv300.c         | 2 +-
 drivers/clk/hisilicon/crg-hi3798cv200.c         | 2 +-
 drivers/clk/imx/clk-imx8-acm.c                  | 2 +-
 drivers/clk/imx/clk-imx8mp-audiomix.c           | 2 +-
 drivers/clk/keystone/sci-clk.c                  | 2 +-
 drivers/clk/mediatek/clk-mt2701-aud.c           | 2 +-
 drivers/clk/mediatek/clk-mt2701-bdp.c           | 2 +-
 drivers/clk/mediatek/clk-mt2701-eth.c           | 2 +-
 drivers/clk/mediatek/clk-mt2701-g3d.c           | 2 +-
 drivers/clk/mediatek/clk-mt2701-hif.c           | 2 +-
 drivers/clk/mediatek/clk-mt2701-img.c           | 2 +-
 drivers/clk/mediatek/clk-mt2701-mm.c            | 2 +-
 drivers/clk/mediatek/clk-mt2701-vdec.c          | 2 +-
 drivers/clk/mediatek/clk-mt2712-apmixedsys.c    | 2 +-
 drivers/clk/mediatek/clk-mt2712-bdp.c           | 2 +-
 drivers/clk/mediatek/clk-mt2712-img.c           | 2 +-
 drivers/clk/mediatek/clk-mt2712-jpgdec.c        | 2 +-
 drivers/clk/mediatek/clk-mt2712-mfg.c           | 2 +-
 drivers/clk/mediatek/clk-mt2712-mm.c            | 2 +-
 drivers/clk/mediatek/clk-mt2712-vdec.c          | 2 +-
 drivers/clk/mediatek/clk-mt2712-venc.c          | 2 +-
 drivers/clk/mediatek/clk-mt2712.c               | 2 +-
 drivers/clk/mediatek/clk-mt6765-audio.c         | 2 +-
 drivers/clk/mediatek/clk-mt6765-cam.c           | 2 +-
 drivers/clk/mediatek/clk-mt6765-img.c           | 2 +-
 drivers/clk/mediatek/clk-mt6765-mipi0a.c        | 2 +-
 drivers/clk/mediatek/clk-mt6765-mm.c            | 2 +-
 drivers/clk/mediatek/clk-mt6765-vcodec.c        | 2 +-
 drivers/clk/mediatek/clk-mt6779-aud.c           | 2 +-
 drivers/clk/mediatek/clk-mt6779-cam.c           | 2 +-
 drivers/clk/mediatek/clk-mt6779-img.c           | 2 +-
 drivers/clk/mediatek/clk-mt6779-ipe.c           | 2 +-
 drivers/clk/mediatek/clk-mt6779-mfg.c           | 2 +-
 drivers/clk/mediatek/clk-mt6779-mm.c            | 2 +-
 drivers/clk/mediatek/clk-mt6779-vdec.c          | 2 +-
 drivers/clk/mediatek/clk-mt6779-venc.c          | 2 +-
 drivers/clk/mediatek/clk-mt6779.c               | 2 +-
 drivers/clk/mediatek/clk-mt6795-apmixedsys.c    | 2 +-
 drivers/clk/mediatek/clk-mt6795-infracfg.c      | 2 +-
 drivers/clk/mediatek/clk-mt6795-mfg.c           | 2 +-
 drivers/clk/mediatek/clk-mt6795-mm.c            | 2 +-
 drivers/clk/mediatek/clk-mt6795-pericfg.c       | 2 +-
 drivers/clk/mediatek/clk-mt6795-topckgen.c      | 2 +-
 drivers/clk/mediatek/clk-mt6795-vdecsys.c       | 2 +-
 drivers/clk/mediatek/clk-mt6795-vencsys.c       | 2 +-
 drivers/clk/mediatek/clk-mt6797-img.c           | 2 +-
 drivers/clk/mediatek/clk-mt6797-mm.c            | 2 +-
 drivers/clk/mediatek/clk-mt6797-vdec.c          | 2 +-
 drivers/clk/mediatek/clk-mt6797-venc.c          | 2 +-
 drivers/clk/mediatek/clk-mt7622-apmixedsys.c    | 2 +-
 drivers/clk/mediatek/clk-mt7622-aud.c           | 2 +-
 drivers/clk/mediatek/clk-mt7622-eth.c           | 2 +-
 drivers/clk/mediatek/clk-mt7622-hif.c           | 2 +-
 drivers/clk/mediatek/clk-mt7622-infracfg.c      | 2 +-
 drivers/clk/mediatek/clk-mt7622.c               | 2 +-
 drivers/clk/mediatek/clk-mt7629-hif.c           | 2 +-
 drivers/clk/mediatek/clk-mt7981-eth.c           | 2 +-
 drivers/clk/mediatek/clk-mt7981-infracfg.c      | 2 +-
 drivers/clk/mediatek/clk-mt7981-topckgen.c      | 2 +-
 drivers/clk/mediatek/clk-mt7986-eth.c           | 2 +-
 drivers/clk/mediatek/clk-mt7986-infracfg.c      | 2 +-
 drivers/clk/mediatek/clk-mt7986-topckgen.c      | 2 +-
 drivers/clk/mediatek/clk-mt7988-eth.c           | 2 +-
 drivers/clk/mediatek/clk-mt7988-infracfg.c      | 2 +-
 drivers/clk/mediatek/clk-mt7988-topckgen.c      | 2 +-
 drivers/clk/mediatek/clk-mt7988-xfipll.c        | 2 +-
 drivers/clk/mediatek/clk-mt8135-apmixedsys.c    | 2 +-
 drivers/clk/mediatek/clk-mt8135.c               | 2 +-
 drivers/clk/mediatek/clk-mt8167-aud.c           | 2 +-
 drivers/clk/mediatek/clk-mt8167-img.c           | 2 +-
 drivers/clk/mediatek/clk-mt8167-mfgcfg.c        | 2 +-
 drivers/clk/mediatek/clk-mt8167-mm.c            | 2 +-
 drivers/clk/mediatek/clk-mt8167-vdec.c          | 2 +-
 drivers/clk/mediatek/clk-mt8167.c               | 2 +-
 drivers/clk/mediatek/clk-mt8173-apmixedsys.c    | 2 +-
 drivers/clk/mediatek/clk-mt8173-img.c           | 2 +-
 drivers/clk/mediatek/clk-mt8173-infracfg.c      | 2 +-
 drivers/clk/mediatek/clk-mt8173-mm.c            | 2 +-
 drivers/clk/mediatek/clk-mt8173-pericfg.c       | 2 +-
 drivers/clk/mediatek/clk-mt8173-topckgen.c      | 2 +-
 drivers/clk/mediatek/clk-mt8173-vdecsys.c       | 2 +-
 drivers/clk/mediatek/clk-mt8173-vencsys.c       | 2 +-
 drivers/clk/mediatek/clk-mt8183-audio.c         | 2 +-
 drivers/clk/mediatek/clk-mt8183-cam.c           | 2 +-
 drivers/clk/mediatek/clk-mt8183-img.c           | 2 +-
 drivers/clk/mediatek/clk-mt8183-ipu0.c          | 2 +-
 drivers/clk/mediatek/clk-mt8183-ipu1.c          | 2 +-
 drivers/clk/mediatek/clk-mt8183-ipu_adl.c       | 2 +-
 drivers/clk/mediatek/clk-mt8183-ipu_conn.c      | 2 +-
 drivers/clk/mediatek/clk-mt8183-mfgcfg.c        | 2 +-
 drivers/clk/mediatek/clk-mt8183-mm.c            | 2 +-
 drivers/clk/mediatek/clk-mt8183-vdec.c          | 2 +-
 drivers/clk/mediatek/clk-mt8183-venc.c          | 2 +-
 drivers/clk/mediatek/clk-mt8183.c               | 2 +-
 drivers/clk/mediatek/clk-mt8186-apmixedsys.c    | 2 +-
 drivers/clk/mediatek/clk-mt8186-cam.c           | 2 +-
 drivers/clk/mediatek/clk-mt8186-img.c           | 2 +-
 drivers/clk/mediatek/clk-mt8186-imp_iic_wrap.c  | 2 +-
 drivers/clk/mediatek/clk-mt8186-infra_ao.c      | 2 +-
 drivers/clk/mediatek/clk-mt8186-ipe.c           | 2 +-
 drivers/clk/mediatek/clk-mt8186-mcu.c           | 2 +-
 drivers/clk/mediatek/clk-mt8186-mdp.c           | 2 +-
 drivers/clk/mediatek/clk-mt8186-mfg.c           | 2 +-
 drivers/clk/mediatek/clk-mt8186-mm.c            | 2 +-
 drivers/clk/mediatek/clk-mt8186-topckgen.c      | 2 +-
 drivers/clk/mediatek/clk-mt8186-vdec.c          | 2 +-
 drivers/clk/mediatek/clk-mt8186-venc.c          | 2 +-
 drivers/clk/mediatek/clk-mt8186-wpe.c           | 2 +-
 drivers/clk/mediatek/clk-mt8188-adsp_audio26m.c | 2 +-
 drivers/clk/mediatek/clk-mt8188-apmixedsys.c    | 2 +-
 drivers/clk/mediatek/clk-mt8188-cam.c           | 2 +-
 drivers/clk/mediatek/clk-mt8188-ccu.c           | 2 +-
 drivers/clk/mediatek/clk-mt8188-img.c           | 2 +-
 drivers/clk/mediatek/clk-mt8188-imp_iic_wrap.c  | 2 +-
 drivers/clk/mediatek/clk-mt8188-infra_ao.c      | 2 +-
 drivers/clk/mediatek/clk-mt8188-ipe.c           | 2 +-
 drivers/clk/mediatek/clk-mt8188-mfg.c           | 2 +-
 drivers/clk/mediatek/clk-mt8188-peri_ao.c       | 2 +-
 drivers/clk/mediatek/clk-mt8188-topckgen.c      | 2 +-
 drivers/clk/mediatek/clk-mt8188-vdec.c          | 2 +-
 drivers/clk/mediatek/clk-mt8188-vdo0.c          | 2 +-
 drivers/clk/mediatek/clk-mt8188-vdo1.c          | 2 +-
 drivers/clk/mediatek/clk-mt8188-venc.c          | 2 +-
 drivers/clk/mediatek/clk-mt8188-vpp0.c          | 2 +-
 drivers/clk/mediatek/clk-mt8188-vpp1.c          | 2 +-
 drivers/clk/mediatek/clk-mt8188-wpe.c           | 2 +-
 drivers/clk/mediatek/clk-mt8192-apmixedsys.c    | 2 +-
 drivers/clk/mediatek/clk-mt8192-aud.c           | 2 +-
 drivers/clk/mediatek/clk-mt8192-cam.c           | 2 +-
 drivers/clk/mediatek/clk-mt8192-img.c           | 2 +-
 drivers/clk/mediatek/clk-mt8192-imp_iic_wrap.c  | 2 +-
 drivers/clk/mediatek/clk-mt8192-ipe.c           | 2 +-
 drivers/clk/mediatek/clk-mt8192-mdp.c           | 2 +-
 drivers/clk/mediatek/clk-mt8192-mfg.c           | 2 +-
 drivers/clk/mediatek/clk-mt8192-mm.c            | 2 +-
 drivers/clk/mediatek/clk-mt8192-msdc.c          | 2 +-
 drivers/clk/mediatek/clk-mt8192-scp_adsp.c      | 2 +-
 drivers/clk/mediatek/clk-mt8192-vdec.c          | 2 +-
 drivers/clk/mediatek/clk-mt8192-venc.c          | 2 +-
 drivers/clk/mediatek/clk-mt8192.c               | 2 +-
 drivers/clk/mediatek/clk-mt8195-apmixedsys.c    | 2 +-
 drivers/clk/mediatek/clk-mt8195-apusys_pll.c    | 2 +-
 drivers/clk/mediatek/clk-mt8195-cam.c           | 2 +-
 drivers/clk/mediatek/clk-mt8195-ccu.c           | 2 +-
 drivers/clk/mediatek/clk-mt8195-img.c           | 2 +-
 drivers/clk/mediatek/clk-mt8195-imp_iic_wrap.c  | 2 +-
 drivers/clk/mediatek/clk-mt8195-infra_ao.c      | 2 +-
 drivers/clk/mediatek/clk-mt8195-ipe.c           | 2 +-
 drivers/clk/mediatek/clk-mt8195-mfg.c           | 2 +-
 drivers/clk/mediatek/clk-mt8195-peri_ao.c       | 2 +-
 drivers/clk/mediatek/clk-mt8195-scp_adsp.c      | 2 +-
 drivers/clk/mediatek/clk-mt8195-topckgen.c      | 2 +-
 drivers/clk/mediatek/clk-mt8195-vdec.c          | 2 +-
 drivers/clk/mediatek/clk-mt8195-vdo0.c          | 2 +-
 drivers/clk/mediatek/clk-mt8195-vdo1.c          | 2 +-
 drivers/clk/mediatek/clk-mt8195-venc.c          | 2 +-
 drivers/clk/mediatek/clk-mt8195-vpp0.c          | 2 +-
 drivers/clk/mediatek/clk-mt8195-vpp1.c          | 2 +-
 drivers/clk/mediatek/clk-mt8195-wpe.c           | 2 +-
 drivers/clk/mediatek/clk-mt8365-apu.c           | 2 +-
 drivers/clk/mediatek/clk-mt8365-cam.c           | 2 +-
 drivers/clk/mediatek/clk-mt8365-mfg.c           | 2 +-
 drivers/clk/mediatek/clk-mt8365-mm.c            | 2 +-
 drivers/clk/mediatek/clk-mt8365-vdec.c          | 2 +-
 drivers/clk/mediatek/clk-mt8365-venc.c          | 2 +-
 drivers/clk/mediatek/clk-mt8365.c               | 2 +-
 drivers/clk/mediatek/clk-mt8516-aud.c           | 2 +-
 drivers/clk/mediatek/clk-mt8516.c               | 2 +-
 drivers/clk/mmp/clk-audio.c                     | 2 +-
 drivers/clk/mvebu/armada-37xx-periph.c          | 2 +-
 drivers/clk/mvebu/armada-37xx-tbg.c             | 2 +-
 drivers/clk/mvebu/armada-37xx-xtal.c            | 2 +-
 drivers/clk/qcom/apcs-msm8916.c                 | 2 +-
 drivers/clk/qcom/apcs-sdx55.c                   | 2 +-
 drivers/clk/qcom/clk-cbf-8996.c                 | 2 +-
 drivers/clk/qcom/gcc-msm8960.c                  | 2 +-
 drivers/clk/renesas/rcar-usb2-clock-sel.c       | 2 +-
 drivers/clk/samsung/clk-exynos-audss.c          | 2 +-
 drivers/clk/samsung/clk-exynos-clkout.c         | 2 +-
 drivers/clk/starfive/clk-starfive-jh7110-isp.c  | 2 +-
 drivers/clk/starfive/clk-starfive-jh7110-vout.c | 2 +-
 drivers/clk/stm32/clk-stm32mp1.c                | 2 +-
 drivers/clk/tegra/clk-tegra124-dfll-fcpu.c      | 2 +-
 drivers/clk/ti/adpll.c                          | 2 +-
 drivers/clk/x86/clk-fch.c                       | 2 +-
 drivers/clk/x86/clk-pmc-atom.c                  | 2 +-
 drivers/clk/xilinx/clk-xlnx-clock-wizard.c      | 2 +-
 drivers/clk/xilinx/xlnx_vcu.c                   | 2 +-
 201 files changed, 201 insertions(+), 201 deletions(-)

diff --git a/drivers/clk/axs10x/i2s_pll_clock.c b/drivers/clk/axs10x/i2s_pll_clock.c
index 2334e6c334cf..9667ce898428 100644
--- a/drivers/clk/axs10x/i2s_pll_clock.c
+++ b/drivers/clk/axs10x/i2s_pll_clock.c
@@ -215,7 +215,7 @@ static struct platform_driver i2s_pll_clk_driver = {
 		.of_match_table = i2s_pll_clk_id,
 	},
 	.probe = i2s_pll_clk_probe,
-	.remove_new = i2s_pll_clk_remove,
+	.remove = i2s_pll_clk_remove,
 };
 module_platform_driver(i2s_pll_clk_driver);
 
diff --git a/drivers/clk/bcm/clk-bcm2711-dvp.c b/drivers/clk/bcm/clk-bcm2711-dvp.c
index 3cb235df9d37..e79720e85685 100644
--- a/drivers/clk/bcm/clk-bcm2711-dvp.c
+++ b/drivers/clk/bcm/clk-bcm2711-dvp.c
@@ -110,7 +110,7 @@ MODULE_DEVICE_TABLE(of, clk_dvp_dt_ids);
 
 static struct platform_driver clk_dvp_driver = {
 	.probe	= clk_dvp_probe,
-	.remove_new = clk_dvp_remove,
+	.remove = clk_dvp_remove,
 	.driver	= {
 		.name		= "brcm2711-dvp",
 		.of_match_table	= clk_dvp_dt_ids,
diff --git a/drivers/clk/bcm/clk-bcm63xx-gate.c b/drivers/clk/bcm/clk-bcm63xx-gate.c
index 36c7b302e396..d6d857474436 100644
--- a/drivers/clk/bcm/clk-bcm63xx-gate.c
+++ b/drivers/clk/bcm/clk-bcm63xx-gate.c
@@ -567,7 +567,7 @@ static const struct of_device_id clk_bcm63xx_dt_ids[] = {
 
 static struct platform_driver clk_bcm63xx = {
 	.probe = clk_bcm63xx_probe,
-	.remove_new = clk_bcm63xx_remove,
+	.remove = clk_bcm63xx_remove,
 	.driver = {
 		.name = "bcm63xx-clock",
 		.of_match_table = clk_bcm63xx_dt_ids,
diff --git a/drivers/clk/bcm/clk-raspberrypi.c b/drivers/clk/bcm/clk-raspberrypi.c
index 4d411408e4af..a18a8768feb4 100644
--- a/drivers/clk/bcm/clk-raspberrypi.c
+++ b/drivers/clk/bcm/clk-raspberrypi.c
@@ -458,7 +458,7 @@ static struct platform_driver raspberrypi_clk_driver = {
 		.of_match_table = raspberrypi_clk_match,
 	},
 	.probe          = raspberrypi_clk_probe,
-	.remove_new	= raspberrypi_clk_remove,
+	.remove		= raspberrypi_clk_remove,
 };
 module_platform_driver(raspberrypi_clk_driver);
 
diff --git a/drivers/clk/clk-fixed-factor.c b/drivers/clk/clk-fixed-factor.c
index fe0500a1af3e..8fba63fc70c5 100644
--- a/drivers/clk/clk-fixed-factor.c
+++ b/drivers/clk/clk-fixed-factor.c
@@ -405,7 +405,7 @@ static struct platform_driver of_fixed_factor_clk_driver = {
 		.of_match_table = of_fixed_factor_clk_ids,
 	},
 	.probe = of_fixed_factor_clk_probe,
-	.remove_new = of_fixed_factor_clk_remove,
+	.remove = of_fixed_factor_clk_remove,
 };
 builtin_platform_driver(of_fixed_factor_clk_driver);
 #endif
diff --git a/drivers/clk/clk-fixed-mmio.c b/drivers/clk/clk-fixed-mmio.c
index 0e08cb22c196..3bfcf4cd98a2 100644
--- a/drivers/clk/clk-fixed-mmio.c
+++ b/drivers/clk/clk-fixed-mmio.c
@@ -91,7 +91,7 @@ static struct platform_driver of_fixed_mmio_clk_driver = {
 		.of_match_table = of_fixed_mmio_clk_ids,
 	},
 	.probe = of_fixed_mmio_clk_probe,
-	.remove_new = of_fixed_mmio_clk_remove,
+	.remove = of_fixed_mmio_clk_remove,
 };
 module_platform_driver(of_fixed_mmio_clk_driver);
 
diff --git a/drivers/clk/clk-fixed-rate.c b/drivers/clk/clk-fixed-rate.c
index 3481eb8cdeb3..6b4f76b9c4da 100644
--- a/drivers/clk/clk-fixed-rate.c
+++ b/drivers/clk/clk-fixed-rate.c
@@ -232,7 +232,7 @@ static struct platform_driver of_fixed_clk_driver = {
 		.of_match_table = of_fixed_clk_ids,
 	},
 	.probe = of_fixed_clk_probe,
-	.remove_new = of_fixed_clk_remove,
+	.remove = of_fixed_clk_remove,
 };
 builtin_platform_driver(of_fixed_clk_driver);
 #endif
diff --git a/drivers/clk/clk-palmas.c b/drivers/clk/clk-palmas.c
index 5efb10776ae5..39049f62dbbb 100644
--- a/drivers/clk/clk-palmas.c
+++ b/drivers/clk/clk-palmas.c
@@ -281,7 +281,7 @@ static struct platform_driver palmas_clks_driver = {
 		.of_match_table = palmas_clks_of_match,
 	},
 	.probe = palmas_clks_probe,
-	.remove_new = palmas_clks_remove,
+	.remove = palmas_clks_remove,
 };
 
 module_platform_driver(palmas_clks_driver);
diff --git a/drivers/clk/clk-pwm.c b/drivers/clk/clk-pwm.c
index 3dd2b83d0404..bd4f21c22004 100644
--- a/drivers/clk/clk-pwm.c
+++ b/drivers/clk/clk-pwm.c
@@ -142,7 +142,7 @@ MODULE_DEVICE_TABLE(of, clk_pwm_dt_ids);
 
 static struct platform_driver clk_pwm_driver = {
 	.probe = clk_pwm_probe,
-	.remove_new = clk_pwm_remove,
+	.remove = clk_pwm_remove,
 	.driver = {
 		.name = "pwm-clock",
 		.of_match_table = clk_pwm_dt_ids,
diff --git a/drivers/clk/clk-s2mps11.c b/drivers/clk/clk-s2mps11.c
index 38c456540d1b..014db6386624 100644
--- a/drivers/clk/clk-s2mps11.c
+++ b/drivers/clk/clk-s2mps11.c
@@ -263,7 +263,7 @@ static struct platform_driver s2mps11_clk_driver = {
 		.name  = "s2mps11-clk",
 	},
 	.probe = s2mps11_clk_probe,
-	.remove_new = s2mps11_clk_remove,
+	.remove = s2mps11_clk_remove,
 	.id_table = s2mps11_clk_id,
 };
 module_platform_driver(s2mps11_clk_driver);
diff --git a/drivers/clk/clk-scpi.c b/drivers/clk/clk-scpi.c
index 108b697bd317..19d530d52e64 100644
--- a/drivers/clk/clk-scpi.c
+++ b/drivers/clk/clk-scpi.c
@@ -303,7 +303,7 @@ static struct platform_driver scpi_clocks_driver = {
 		.of_match_table = scpi_clocks_ids,
 	},
 	.probe = scpi_clocks_probe,
-	.remove_new = scpi_clocks_remove,
+	.remove = scpi_clocks_remove,
 };
 module_platform_driver(scpi_clocks_driver);
 
diff --git a/drivers/clk/hisilicon/clk-hi3519.c b/drivers/clk/hisilicon/clk-hi3519.c
index 141b727ff60d..0c50acd8543a 100644
--- a/drivers/clk/hisilicon/clk-hi3519.c
+++ b/drivers/clk/hisilicon/clk-hi3519.c
@@ -179,7 +179,7 @@ MODULE_DEVICE_TABLE(of, hi3519_clk_match_table);
 
 static struct platform_driver hi3519_clk_driver = {
 	.probe          = hi3519_clk_probe,
-	.remove_new	= hi3519_clk_remove,
+	.remove		= hi3519_clk_remove,
 	.driver         = {
 		.name   = "hi3519-clk",
 		.of_match_table = hi3519_clk_match_table,
diff --git a/drivers/clk/hisilicon/clk-hi3559a.c b/drivers/clk/hisilicon/clk-hi3559a.c
index 8646e9d352ed..f297fb25c512 100644
--- a/drivers/clk/hisilicon/clk-hi3559a.c
+++ b/drivers/clk/hisilicon/clk-hi3559a.c
@@ -817,7 +817,7 @@ static void hi3559av100_crg_remove(struct platform_device *pdev)
 
 static struct platform_driver hi3559av100_crg_driver = {
 	.probe		= hi3559av100_crg_probe,
-	.remove_new	= hi3559av100_crg_remove,
+	.remove		= hi3559av100_crg_remove,
 	.driver		= {
 		.name	= "hi3559av100-clock",
 		.of_match_table = hi3559av100_crg_match_table,
diff --git a/drivers/clk/hisilicon/crg-hi3516cv300.c b/drivers/clk/hisilicon/crg-hi3516cv300.c
index e602e65fbc38..b66140f74c51 100644
--- a/drivers/clk/hisilicon/crg-hi3516cv300.c
+++ b/drivers/clk/hisilicon/crg-hi3516cv300.c
@@ -294,7 +294,7 @@ static void hi3516cv300_crg_remove(struct platform_device *pdev)
 
 static struct platform_driver hi3516cv300_crg_driver = {
 	.probe          = hi3516cv300_crg_probe,
-	.remove_new	= hi3516cv300_crg_remove,
+	.remove		= hi3516cv300_crg_remove,
 	.driver         = {
 		.name   = "hi3516cv300-crg",
 		.of_match_table = hi3516cv300_crg_match_table,
diff --git a/drivers/clk/hisilicon/crg-hi3798cv200.c b/drivers/clk/hisilicon/crg-hi3798cv200.c
index f651b197e45a..8eabd1cc229f 100644
--- a/drivers/clk/hisilicon/crg-hi3798cv200.c
+++ b/drivers/clk/hisilicon/crg-hi3798cv200.c
@@ -377,7 +377,7 @@ static void hi3798cv200_crg_remove(struct platform_device *pdev)
 
 static struct platform_driver hi3798cv200_crg_driver = {
 	.probe          = hi3798cv200_crg_probe,
-	.remove_new	= hi3798cv200_crg_remove,
+	.remove		= hi3798cv200_crg_remove,
 	.driver         = {
 		.name   = "hi3798cv200-crg",
 		.of_match_table = hi3798cv200_crg_match_table,
diff --git a/drivers/clk/imx/clk-imx8-acm.c b/drivers/clk/imx/clk-imx8-acm.c
index 61d8c7e9ae0b..6c351050b82a 100644
--- a/drivers/clk/imx/clk-imx8-acm.c
+++ b/drivers/clk/imx/clk-imx8-acm.c
@@ -488,7 +488,7 @@ static struct platform_driver imx8_acm_clk_driver = {
 		.pm = &imx8_acm_pm_ops,
 	},
 	.probe = imx8_acm_clk_probe,
-	.remove_new = imx8_acm_clk_remove,
+	.remove = imx8_acm_clk_remove,
 };
 module_platform_driver(imx8_acm_clk_driver);
 
diff --git a/drivers/clk/imx/clk-imx8mp-audiomix.c b/drivers/clk/imx/clk-imx8mp-audiomix.c
index 50ad5873c990..b2cb157703c5 100644
--- a/drivers/clk/imx/clk-imx8mp-audiomix.c
+++ b/drivers/clk/imx/clk-imx8mp-audiomix.c
@@ -454,7 +454,7 @@ MODULE_DEVICE_TABLE(of, clk_imx8mp_audiomix_of_match);
 
 static struct platform_driver clk_imx8mp_audiomix_driver = {
 	.probe	= clk_imx8mp_audiomix_probe,
-	.remove_new = clk_imx8mp_audiomix_remove,
+	.remove = clk_imx8mp_audiomix_remove,
 	.driver = {
 		.name = "imx8mp-audio-blk-ctrl",
 		.of_match_table = clk_imx8mp_audiomix_of_match,
diff --git a/drivers/clk/keystone/sci-clk.c b/drivers/clk/keystone/sci-clk.c
index 5cefc30a843e..c5894fc9395e 100644
--- a/drivers/clk/keystone/sci-clk.c
+++ b/drivers/clk/keystone/sci-clk.c
@@ -707,7 +707,7 @@ static void ti_sci_clk_remove(struct platform_device *pdev)
 
 static struct platform_driver ti_sci_clk_driver = {
 	.probe = ti_sci_clk_probe,
-	.remove_new = ti_sci_clk_remove,
+	.remove = ti_sci_clk_remove,
 	.driver = {
 		.name = "ti-sci-clk",
 		.of_match_table = of_match_ptr(ti_sci_clk_of_match),
diff --git a/drivers/clk/mediatek/clk-mt2701-aud.c b/drivers/clk/mediatek/clk-mt2701-aud.c
index 15859132c769..425c69cfb105 100644
--- a/drivers/clk/mediatek/clk-mt2701-aud.c
+++ b/drivers/clk/mediatek/clk-mt2701-aud.c
@@ -158,7 +158,7 @@ static void clk_mt2701_aud_remove(struct platform_device *pdev)
 
 static struct platform_driver clk_mt2701_aud_drv = {
 	.probe = clk_mt2701_aud_probe,
-	.remove_new = clk_mt2701_aud_remove,
+	.remove = clk_mt2701_aud_remove,
 	.driver = {
 		.name = "clk-mt2701-aud",
 		.of_match_table = of_match_clk_mt2701_aud,
diff --git a/drivers/clk/mediatek/clk-mt2701-bdp.c b/drivers/clk/mediatek/clk-mt2701-bdp.c
index e203dca70786..5da3eabffd3e 100644
--- a/drivers/clk/mediatek/clk-mt2701-bdp.c
+++ b/drivers/clk/mediatek/clk-mt2701-bdp.c
@@ -99,7 +99,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt2701_bdp);
 
 static struct platform_driver clk_mt2701_bdp_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt2701-bdp",
 		.of_match_table = of_match_clk_mt2701_bdp,
diff --git a/drivers/clk/mediatek/clk-mt2701-eth.c b/drivers/clk/mediatek/clk-mt2701-eth.c
index f6e1fdc9ee0a..608252e73f24 100644
--- a/drivers/clk/mediatek/clk-mt2701-eth.c
+++ b/drivers/clk/mediatek/clk-mt2701-eth.c
@@ -53,7 +53,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt2701_eth);
 
 static struct platform_driver clk_mt2701_eth_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt2701-eth",
 		.of_match_table = of_match_clk_mt2701_eth,
diff --git a/drivers/clk/mediatek/clk-mt2701-g3d.c b/drivers/clk/mediatek/clk-mt2701-g3d.c
index 5e04975433ea..b3e18b6db75d 100644
--- a/drivers/clk/mediatek/clk-mt2701-g3d.c
+++ b/drivers/clk/mediatek/clk-mt2701-g3d.c
@@ -50,7 +50,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt2701_g3d);
 
 static struct platform_driver clk_mt2701_g3d_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt2701-g3d",
 		.of_match_table = of_match_clk_mt2701_g3d,
diff --git a/drivers/clk/mediatek/clk-mt2701-hif.c b/drivers/clk/mediatek/clk-mt2701-hif.c
index c7b38d066403..000e00576052 100644
--- a/drivers/clk/mediatek/clk-mt2701-hif.c
+++ b/drivers/clk/mediatek/clk-mt2701-hif.c
@@ -50,7 +50,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt2701_hif);
 
 static struct platform_driver clk_mt2701_hif_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt2701-hif",
 		.of_match_table = of_match_clk_mt2701_hif,
diff --git a/drivers/clk/mediatek/clk-mt2701-img.c b/drivers/clk/mediatek/clk-mt2701-img.c
index ce13b79a7994..875594bc9dcb 100644
--- a/drivers/clk/mediatek/clk-mt2701-img.c
+++ b/drivers/clk/mediatek/clk-mt2701-img.c
@@ -47,7 +47,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt2701_img);
 
 static struct platform_driver clk_mt2701_img_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt2701-img",
 		.of_match_table = of_match_clk_mt2701_img,
diff --git a/drivers/clk/mediatek/clk-mt2701-mm.c b/drivers/clk/mediatek/clk-mt2701-mm.c
index 903592be56b5..bc68fa718878 100644
--- a/drivers/clk/mediatek/clk-mt2701-mm.c
+++ b/drivers/clk/mediatek/clk-mt2701-mm.c
@@ -80,7 +80,7 @@ MODULE_DEVICE_TABLE(platform, clk_mt2701_mm_id_table);
 
 static struct platform_driver clk_mt2701_mm_drv = {
 	.probe = mtk_clk_pdev_probe,
-	.remove_new = mtk_clk_pdev_remove,
+	.remove = mtk_clk_pdev_remove,
 	.driver = {
 		.name = "clk-mt2701-mm",
 	},
diff --git a/drivers/clk/mediatek/clk-mt2701-vdec.c b/drivers/clk/mediatek/clk-mt2701-vdec.c
index 591091fb2151..94db86f8d0a4 100644
--- a/drivers/clk/mediatek/clk-mt2701-vdec.c
+++ b/drivers/clk/mediatek/clk-mt2701-vdec.c
@@ -52,7 +52,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt2701_vdec);
 
 static struct platform_driver clk_mt2701_vdec_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt2701-vdec",
 		.of_match_table = of_match_clk_mt2701_vdec,
diff --git a/drivers/clk/mediatek/clk-mt2712-apmixedsys.c b/drivers/clk/mediatek/clk-mt2712-apmixedsys.c
index 66987d205eee..a60622d251ff 100644
--- a/drivers/clk/mediatek/clk-mt2712-apmixedsys.c
+++ b/drivers/clk/mediatek/clk-mt2712-apmixedsys.c
@@ -156,7 +156,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt2712_apmixed);
 
 static struct platform_driver clk_mt2712_apmixed_drv = {
 	.probe = clk_mt2712_apmixed_probe,
-	.remove_new = clk_mt2712_apmixed_remove,
+	.remove = clk_mt2712_apmixed_remove,
 	.driver = {
 		.name = "clk-mt2712-apmixed",
 		.of_match_table = of_match_clk_mt2712_apmixed,
diff --git a/drivers/clk/mediatek/clk-mt2712-bdp.c b/drivers/clk/mediatek/clk-mt2712-bdp.c
index 93c5453e4392..c838311a0c51 100644
--- a/drivers/clk/mediatek/clk-mt2712-bdp.c
+++ b/drivers/clk/mediatek/clk-mt2712-bdp.c
@@ -69,7 +69,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt2712_bdp);
 
 static struct platform_driver clk_mt2712_bdp_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt2712-bdp",
 		.of_match_table = of_match_clk_mt2712_bdp,
diff --git a/drivers/clk/mediatek/clk-mt2712-img.c b/drivers/clk/mediatek/clk-mt2712-img.c
index 84abd0515fd2..bedebf86b0b5 100644
--- a/drivers/clk/mediatek/clk-mt2712-img.c
+++ b/drivers/clk/mediatek/clk-mt2712-img.c
@@ -47,7 +47,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt2712_img);
 
 static struct platform_driver clk_mt2712_img_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt2712-img",
 		.of_match_table = of_match_clk_mt2712_img,
diff --git a/drivers/clk/mediatek/clk-mt2712-jpgdec.c b/drivers/clk/mediatek/clk-mt2712-jpgdec.c
index 89be9082adba..1a73474b2f99 100644
--- a/drivers/clk/mediatek/clk-mt2712-jpgdec.c
+++ b/drivers/clk/mediatek/clk-mt2712-jpgdec.c
@@ -43,7 +43,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt2712_jpgdec);
 
 static struct platform_driver clk_mt2712_jpgdec_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt2712-jpgdec",
 		.of_match_table = of_match_clk_mt2712_jpgdec,
diff --git a/drivers/clk/mediatek/clk-mt2712-mfg.c b/drivers/clk/mediatek/clk-mt2712-mfg.c
index f7e0d0ebf665..c1bb45c7469e 100644
--- a/drivers/clk/mediatek/clk-mt2712-mfg.c
+++ b/drivers/clk/mediatek/clk-mt2712-mfg.c
@@ -42,7 +42,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt2712_mfg);
 
 static struct platform_driver clk_mt2712_mfg_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt2712-mfg",
 		.of_match_table = of_match_clk_mt2712_mfg,
diff --git a/drivers/clk/mediatek/clk-mt2712-mm.c b/drivers/clk/mediatek/clk-mt2712-mm.c
index 248529d3134d..32ecb949f7eb 100644
--- a/drivers/clk/mediatek/clk-mt2712-mm.c
+++ b/drivers/clk/mediatek/clk-mt2712-mm.c
@@ -121,7 +121,7 @@ MODULE_DEVICE_TABLE(platform, clk_mt2712_mm_id_table);
 
 static struct platform_driver clk_mt2712_mm_drv = {
 	.probe = mtk_clk_pdev_probe,
-	.remove_new = mtk_clk_pdev_remove,
+	.remove = mtk_clk_pdev_remove,
 	.driver = {
 		.name = "clk-mt2712-mm",
 	},
diff --git a/drivers/clk/mediatek/clk-mt2712-vdec.c b/drivers/clk/mediatek/clk-mt2712-vdec.c
index a063f1f0aa52..a766342fbafa 100644
--- a/drivers/clk/mediatek/clk-mt2712-vdec.c
+++ b/drivers/clk/mediatek/clk-mt2712-vdec.c
@@ -55,7 +55,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt2712_vdec);
 
 static struct platform_driver clk_mt2712_vdec_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt2712-vdec",
 		.of_match_table = of_match_clk_mt2712_vdec,
diff --git a/drivers/clk/mediatek/clk-mt2712-venc.c b/drivers/clk/mediatek/clk-mt2712-venc.c
index 5b15df0a26f5..fc193dc8e8f6 100644
--- a/drivers/clk/mediatek/clk-mt2712-venc.c
+++ b/drivers/clk/mediatek/clk-mt2712-venc.c
@@ -44,7 +44,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt2712_venc);
 
 static struct platform_driver clk_mt2712_venc_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt2712-venc",
 		.of_match_table = of_match_clk_mt2712_venc,
diff --git a/drivers/clk/mediatek/clk-mt2712.c b/drivers/clk/mediatek/clk-mt2712.c
index 91af45160aa4..964c92130e3c 100644
--- a/drivers/clk/mediatek/clk-mt2712.c
+++ b/drivers/clk/mediatek/clk-mt2712.c
@@ -993,7 +993,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt2712);
 
 static struct platform_driver clk_mt2712_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt2712",
 		.of_match_table = of_match_clk_mt2712,
diff --git a/drivers/clk/mediatek/clk-mt6765-audio.c b/drivers/clk/mediatek/clk-mt6765-audio.c
index 3e481c697eff..2be1458087e6 100644
--- a/drivers/clk/mediatek/clk-mt6765-audio.c
+++ b/drivers/clk/mediatek/clk-mt6765-audio.c
@@ -69,7 +69,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt6765_audio);
 
 static struct platform_driver clk_mt6765_audio_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt6765-audio",
 		.of_match_table = of_match_clk_mt6765_audio,
diff --git a/drivers/clk/mediatek/clk-mt6765-cam.c b/drivers/clk/mediatek/clk-mt6765-cam.c
index fed9c789d9fa..2a7f30dc85bb 100644
--- a/drivers/clk/mediatek/clk-mt6765-cam.c
+++ b/drivers/clk/mediatek/clk-mt6765-cam.c
@@ -50,7 +50,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt6765_cam);
 
 static struct platform_driver clk_mt6765_cam_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt6765-cam",
 		.of_match_table = of_match_clk_mt6765_cam,
diff --git a/drivers/clk/mediatek/clk-mt6765-img.c b/drivers/clk/mediatek/clk-mt6765-img.c
index 34bb89ffd2dd..ff857852cfb0 100644
--- a/drivers/clk/mediatek/clk-mt6765-img.c
+++ b/drivers/clk/mediatek/clk-mt6765-img.c
@@ -46,7 +46,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt6765_img);
 
 static struct platform_driver clk_mt6765_img_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt6765-img",
 		.of_match_table = of_match_clk_mt6765_img,
diff --git a/drivers/clk/mediatek/clk-mt6765-mipi0a.c b/drivers/clk/mediatek/clk-mt6765-mipi0a.c
index 957eb494fee5..8261dfd12a9a 100644
--- a/drivers/clk/mediatek/clk-mt6765-mipi0a.c
+++ b/drivers/clk/mediatek/clk-mt6765-mipi0a.c
@@ -43,7 +43,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt6765_mipi0a);
 
 static struct platform_driver clk_mt6765_mipi0a_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt6765-mipi0a",
 		.of_match_table = of_match_clk_mt6765_mipi0a,
diff --git a/drivers/clk/mediatek/clk-mt6765-mm.c b/drivers/clk/mediatek/clk-mt6765-mm.c
index 099540fcfc76..e525919f9e81 100644
--- a/drivers/clk/mediatek/clk-mt6765-mm.c
+++ b/drivers/clk/mediatek/clk-mt6765-mm.c
@@ -72,7 +72,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt6765_mm);
 
 static struct platform_driver clk_mt6765_mm_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt6765-mm",
 		.of_match_table = of_match_clk_mt6765_mm,
diff --git a/drivers/clk/mediatek/clk-mt6765-vcodec.c b/drivers/clk/mediatek/clk-mt6765-vcodec.c
index 64f3451d0aee..f309d1090cda 100644
--- a/drivers/clk/mediatek/clk-mt6765-vcodec.c
+++ b/drivers/clk/mediatek/clk-mt6765-vcodec.c
@@ -45,7 +45,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt6765_vcodec);
 
 static struct platform_driver clk_mt6765_vcodec_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt6765-vcodec",
 		.of_match_table = of_match_clk_mt6765_vcodec,
diff --git a/drivers/clk/mediatek/clk-mt6779-aud.c b/drivers/clk/mediatek/clk-mt6779-aud.c
index 3d23b8e29af6..8ed318bd7765 100644
--- a/drivers/clk/mediatek/clk-mt6779-aud.c
+++ b/drivers/clk/mediatek/clk-mt6779-aud.c
@@ -104,7 +104,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt6779_aud);
 
 static struct platform_driver clk_mt6779_aud_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt6779-aud",
 		.of_match_table = of_match_clk_mt6779_aud,
diff --git a/drivers/clk/mediatek/clk-mt6779-cam.c b/drivers/clk/mediatek/clk-mt6779-cam.c
index e76b2c4f548e..f397b55606de 100644
--- a/drivers/clk/mediatek/clk-mt6779-cam.c
+++ b/drivers/clk/mediatek/clk-mt6779-cam.c
@@ -55,7 +55,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt6779_cam);
 
 static struct platform_driver clk_mt6779_cam_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt6779-cam",
 		.of_match_table = of_match_clk_mt6779_cam,
diff --git a/drivers/clk/mediatek/clk-mt6779-img.c b/drivers/clk/mediatek/clk-mt6779-img.c
index 0c5971f3966a..474a59a4ca9e 100644
--- a/drivers/clk/mediatek/clk-mt6779-img.c
+++ b/drivers/clk/mediatek/clk-mt6779-img.c
@@ -47,7 +47,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt6779_img);
 
 static struct platform_driver clk_mt6779_img_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt6779-img",
 		.of_match_table = of_match_clk_mt6779_img,
diff --git a/drivers/clk/mediatek/clk-mt6779-ipe.c b/drivers/clk/mediatek/clk-mt6779-ipe.c
index 9c1a9f1b0f3e..c2314654f43a 100644
--- a/drivers/clk/mediatek/clk-mt6779-ipe.c
+++ b/drivers/clk/mediatek/clk-mt6779-ipe.c
@@ -49,7 +49,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt6779_ipe);
 
 static struct platform_driver clk_mt6779_ipe_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt6779-ipe",
 		.of_match_table = of_match_clk_mt6779_ipe,
diff --git a/drivers/clk/mediatek/clk-mt6779-mfg.c b/drivers/clk/mediatek/clk-mt6779-mfg.c
index 3cc82b59117f..21793cb6e6e3 100644
--- a/drivers/clk/mediatek/clk-mt6779-mfg.c
+++ b/drivers/clk/mediatek/clk-mt6779-mfg.c
@@ -44,7 +44,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt6779_mfg);
 
 static struct platform_driver clk_mt6779_mfg_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt6779-mfg",
 		.of_match_table = of_match_clk_mt6779_mfg,
diff --git a/drivers/clk/mediatek/clk-mt6779-mm.c b/drivers/clk/mediatek/clk-mt6779-mm.c
index 97d437a6f98f..30bbab308388 100644
--- a/drivers/clk/mediatek/clk-mt6779-mm.c
+++ b/drivers/clk/mediatek/clk-mt6779-mm.c
@@ -98,7 +98,7 @@ MODULE_DEVICE_TABLE(platform, clk_mt6779_mm_id_table);
 
 static struct platform_driver clk_mt6779_mm_drv = {
 	.probe = mtk_clk_pdev_probe,
-	.remove_new = mtk_clk_pdev_remove,
+	.remove = mtk_clk_pdev_remove,
 	.driver = {
 		.name = "clk-mt6779-mm",
 	},
diff --git a/drivers/clk/mediatek/clk-mt6779-vdec.c b/drivers/clk/mediatek/clk-mt6779-vdec.c
index a9122e627aa5..458d012f023c 100644
--- a/drivers/clk/mediatek/clk-mt6779-vdec.c
+++ b/drivers/clk/mediatek/clk-mt6779-vdec.c
@@ -56,7 +56,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt6779_vdec);
 
 static struct platform_driver clk_mt6779_vdec_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt6779-vdec",
 		.of_match_table = of_match_clk_mt6779_vdec,
diff --git a/drivers/clk/mediatek/clk-mt6779-venc.c b/drivers/clk/mediatek/clk-mt6779-venc.c
index 2cd032648eb1..70cebc274031 100644
--- a/drivers/clk/mediatek/clk-mt6779-venc.c
+++ b/drivers/clk/mediatek/clk-mt6779-venc.c
@@ -47,7 +47,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt6779_venc);
 
 static struct platform_driver clk_mt6779_venc_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt6779-venc",
 		.of_match_table = of_match_clk_mt6779_venc,
diff --git a/drivers/clk/mediatek/clk-mt6779.c b/drivers/clk/mediatek/clk-mt6779.c
index 819253b97a02..86732f5acf93 100644
--- a/drivers/clk/mediatek/clk-mt6779.c
+++ b/drivers/clk/mediatek/clk-mt6779.c
@@ -1305,7 +1305,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt6779);
 
 static struct platform_driver clk_mt6779_infra_drv  = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt6779-infra",
 		.of_match_table = of_match_clk_mt6779_infra,
diff --git a/drivers/clk/mediatek/clk-mt6795-apmixedsys.c b/drivers/clk/mediatek/clk-mt6795-apmixedsys.c
index 8c65974ed9b8..91665d7f125e 100644
--- a/drivers/clk/mediatek/clk-mt6795-apmixedsys.c
+++ b/drivers/clk/mediatek/clk-mt6795-apmixedsys.c
@@ -201,7 +201,7 @@ static void clk_mt6795_apmixed_remove(struct platform_device *pdev)
 
 static struct platform_driver clk_mt6795_apmixed_drv = {
 	.probe = clk_mt6795_apmixed_probe,
-	.remove_new = clk_mt6795_apmixed_remove,
+	.remove = clk_mt6795_apmixed_remove,
 	.driver = {
 		.name = "clk-mt6795-apmixed",
 		.of_match_table = of_match_clk_mt6795_apmixed,
diff --git a/drivers/clk/mediatek/clk-mt6795-infracfg.c b/drivers/clk/mediatek/clk-mt6795-infracfg.c
index 06d7fdf3098b..e4559569f5b0 100644
--- a/drivers/clk/mediatek/clk-mt6795-infracfg.c
+++ b/drivers/clk/mediatek/clk-mt6795-infracfg.c
@@ -144,7 +144,7 @@ static struct platform_driver clk_mt6795_infracfg_drv = {
 		.of_match_table = of_match_clk_mt6795_infracfg,
 	},
 	.probe = clk_mt6795_infracfg_probe,
-	.remove_new = clk_mt6795_infracfg_remove,
+	.remove = clk_mt6795_infracfg_remove,
 };
 module_platform_driver(clk_mt6795_infracfg_drv);
 
diff --git a/drivers/clk/mediatek/clk-mt6795-mfg.c b/drivers/clk/mediatek/clk-mt6795-mfg.c
index dff6a6ded837..1d658bb19e82 100644
--- a/drivers/clk/mediatek/clk-mt6795-mfg.c
+++ b/drivers/clk/mediatek/clk-mt6795-mfg.c
@@ -43,7 +43,7 @@ static struct platform_driver clk_mt6795_mfg_drv = {
 		.of_match_table = of_match_clk_mt6795_mfg,
 	},
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 };
 module_platform_driver(clk_mt6795_mfg_drv);
 
diff --git a/drivers/clk/mediatek/clk-mt6795-mm.c b/drivers/clk/mediatek/clk-mt6795-mm.c
index dd1708d689dc..733d0e2021fc 100644
--- a/drivers/clk/mediatek/clk-mt6795-mm.c
+++ b/drivers/clk/mediatek/clk-mt6795-mm.c
@@ -93,7 +93,7 @@ static struct platform_driver clk_mt6795_mm_drv = {
 	},
 	.id_table = clk_mt6795_mm_id_table,
 	.probe = mtk_clk_pdev_probe,
-	.remove_new = mtk_clk_pdev_remove,
+	.remove = mtk_clk_pdev_remove,
 };
 module_platform_driver(clk_mt6795_mm_drv);
 
diff --git a/drivers/clk/mediatek/clk-mt6795-pericfg.c b/drivers/clk/mediatek/clk-mt6795-pericfg.c
index 3f6bea418a5a..d48240eb2a67 100644
--- a/drivers/clk/mediatek/clk-mt6795-pericfg.c
+++ b/drivers/clk/mediatek/clk-mt6795-pericfg.c
@@ -153,7 +153,7 @@ static struct platform_driver clk_mt6795_pericfg_drv = {
 		.of_match_table = of_match_clk_mt6795_pericfg,
 	},
 	.probe = clk_mt6795_pericfg_probe,
-	.remove_new = clk_mt6795_pericfg_remove,
+	.remove = clk_mt6795_pericfg_remove,
 };
 module_platform_driver(clk_mt6795_pericfg_drv);
 
diff --git a/drivers/clk/mediatek/clk-mt6795-topckgen.c b/drivers/clk/mediatek/clk-mt6795-topckgen.c
index be595853a925..9c6d63a80b19 100644
--- a/drivers/clk/mediatek/clk-mt6795-topckgen.c
+++ b/drivers/clk/mediatek/clk-mt6795-topckgen.c
@@ -547,7 +547,7 @@ static struct platform_driver clk_mt6795_topckgen_drv = {
 		.of_match_table = of_match_clk_mt6795_topckgen,
 	},
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 };
 module_platform_driver(clk_mt6795_topckgen_drv);
 
diff --git a/drivers/clk/mediatek/clk-mt6795-vdecsys.c b/drivers/clk/mediatek/clk-mt6795-vdecsys.c
index 9e91d6f7f5bf..f2968f859dca 100644
--- a/drivers/clk/mediatek/clk-mt6795-vdecsys.c
+++ b/drivers/clk/mediatek/clk-mt6795-vdecsys.c
@@ -44,7 +44,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt6795_vdecsys);
 
 static struct platform_driver clk_mt6795_vdecsys_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt6795-vdecsys",
 		.of_match_table = of_match_clk_mt6795_vdecsys,
diff --git a/drivers/clk/mediatek/clk-mt6795-vencsys.c b/drivers/clk/mediatek/clk-mt6795-vencsys.c
index bd81e80b744f..2f8d48da1a85 100644
--- a/drivers/clk/mediatek/clk-mt6795-vencsys.c
+++ b/drivers/clk/mediatek/clk-mt6795-vencsys.c
@@ -43,7 +43,7 @@ static struct platform_driver clk_mt6795_vencsys_drv = {
 		.of_match_table = of_match_clk_mt6795_vencsys,
 	},
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 };
 module_platform_driver(clk_mt6795_vencsys_drv);
 
diff --git a/drivers/clk/mediatek/clk-mt6797-img.c b/drivers/clk/mediatek/clk-mt6797-img.c
index 0ec0cf2154dc..338c69234f24 100644
--- a/drivers/clk/mediatek/clk-mt6797-img.c
+++ b/drivers/clk/mediatek/clk-mt6797-img.c
@@ -43,7 +43,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt6797_img);
 
 static struct platform_driver clk_mt6797_img_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt6797-img",
 		.of_match_table = of_match_clk_mt6797_img,
diff --git a/drivers/clk/mediatek/clk-mt6797-mm.c b/drivers/clk/mediatek/clk-mt6797-mm.c
index f5701e965792..ddb40b8a1a7d 100644
--- a/drivers/clk/mediatek/clk-mt6797-mm.c
+++ b/drivers/clk/mediatek/clk-mt6797-mm.c
@@ -93,7 +93,7 @@ MODULE_DEVICE_TABLE(platform, clk_mt6797_mm_id_table);
 
 static struct platform_driver clk_mt6797_mm_drv = {
 	.probe = mtk_clk_pdev_probe,
-	.remove_new = mtk_clk_pdev_remove,
+	.remove = mtk_clk_pdev_remove,
 	.driver = {
 		.name = "clk-mt6797-mm",
 	},
diff --git a/drivers/clk/mediatek/clk-mt6797-vdec.c b/drivers/clk/mediatek/clk-mt6797-vdec.c
index c967d5e25c7d..d832f48123f5 100644
--- a/drivers/clk/mediatek/clk-mt6797-vdec.c
+++ b/drivers/clk/mediatek/clk-mt6797-vdec.c
@@ -54,7 +54,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt6797_vdec);
 
 static struct platform_driver clk_mt6797_vdec_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt6797-vdec",
 		.of_match_table = of_match_clk_mt6797_vdec,
diff --git a/drivers/clk/mediatek/clk-mt6797-venc.c b/drivers/clk/mediatek/clk-mt6797-venc.c
index f6fac5db65b0..fd4446f4a9d7 100644
--- a/drivers/clk/mediatek/clk-mt6797-venc.c
+++ b/drivers/clk/mediatek/clk-mt6797-venc.c
@@ -45,7 +45,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt6797_venc);
 
 static struct platform_driver clk_mt6797_venc_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt6797-venc",
 		.of_match_table = of_match_clk_mt6797_venc,
diff --git a/drivers/clk/mediatek/clk-mt7622-apmixedsys.c b/drivers/clk/mediatek/clk-mt7622-apmixedsys.c
index 1b8f859b6b6c..2350592d9a93 100644
--- a/drivers/clk/mediatek/clk-mt7622-apmixedsys.c
+++ b/drivers/clk/mediatek/clk-mt7622-apmixedsys.c
@@ -137,7 +137,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt7622_apmixed);
 
 static struct platform_driver clk_mt7622_apmixed_drv = {
 	.probe = clk_mt7622_apmixed_probe,
-	.remove_new = clk_mt7622_apmixed_remove,
+	.remove = clk_mt7622_apmixed_remove,
 	.driver = {
 		.name = "clk-mt7622-apmixed",
 		.of_match_table = of_match_clk_mt7622_apmixed,
diff --git a/drivers/clk/mediatek/clk-mt7622-aud.c b/drivers/clk/mediatek/clk-mt7622-aud.c
index b7bf626e4d14..931a0598e598 100644
--- a/drivers/clk/mediatek/clk-mt7622-aud.c
+++ b/drivers/clk/mediatek/clk-mt7622-aud.c
@@ -149,7 +149,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt7622_aud);
 
 static struct platform_driver clk_mt7622_aud_drv = {
 	.probe = clk_mt7622_aud_probe,
-	.remove_new = clk_mt7622_aud_remove,
+	.remove = clk_mt7622_aud_remove,
 	.driver = {
 		.name = "clk-mt7622-aud",
 		.of_match_table = of_match_clk_mt7622_aud,
diff --git a/drivers/clk/mediatek/clk-mt7622-eth.c b/drivers/clk/mediatek/clk-mt7622-eth.c
index fa4876317a8d..1c1033a92c46 100644
--- a/drivers/clk/mediatek/clk-mt7622-eth.c
+++ b/drivers/clk/mediatek/clk-mt7622-eth.c
@@ -79,7 +79,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt7622_eth);
 
 static struct platform_driver clk_mt7622_eth_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt7622-eth",
 		.of_match_table = of_match_clk_mt7622_eth,
diff --git a/drivers/clk/mediatek/clk-mt7622-hif.c b/drivers/clk/mediatek/clk-mt7622-hif.c
index 8e57582454c2..5bcfe12c4fd0 100644
--- a/drivers/clk/mediatek/clk-mt7622-hif.c
+++ b/drivers/clk/mediatek/clk-mt7622-hif.c
@@ -91,7 +91,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt7622_hif);
 
 static struct platform_driver clk_mt7622_hif_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt7622-hif",
 		.of_match_table = of_match_clk_mt7622_hif,
diff --git a/drivers/clk/mediatek/clk-mt7622-infracfg.c b/drivers/clk/mediatek/clk-mt7622-infracfg.c
index 6bc911cb29a6..cfdf3b07c3e0 100644
--- a/drivers/clk/mediatek/clk-mt7622-infracfg.c
+++ b/drivers/clk/mediatek/clk-mt7622-infracfg.c
@@ -118,7 +118,7 @@ static struct platform_driver clk_mt7622_infracfg_drv = {
 		.of_match_table = of_match_clk_mt7622_infracfg,
 	},
 	.probe = clk_mt7622_infracfg_probe,
-	.remove_new = clk_mt7622_infracfg_remove,
+	.remove = clk_mt7622_infracfg_remove,
 };
 module_platform_driver(clk_mt7622_infracfg_drv);
 
diff --git a/drivers/clk/mediatek/clk-mt7622.c b/drivers/clk/mediatek/clk-mt7622.c
index 27781a62a131..f62b03abab4f 100644
--- a/drivers/clk/mediatek/clk-mt7622.c
+++ b/drivers/clk/mediatek/clk-mt7622.c
@@ -524,7 +524,7 @@ static struct platform_driver clk_mt7622_drv = {
 		.of_match_table = of_match_clk_mt7622,
 	},
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 };
 module_platform_driver(clk_mt7622_drv)
 
diff --git a/drivers/clk/mediatek/clk-mt7629-hif.c b/drivers/clk/mediatek/clk-mt7629-hif.c
index 96d1a82ad75f..3fdc2d7d4274 100644
--- a/drivers/clk/mediatek/clk-mt7629-hif.c
+++ b/drivers/clk/mediatek/clk-mt7629-hif.c
@@ -86,7 +86,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt7629_hif);
 
 static struct platform_driver clk_mt7629_hif_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt7629-hif",
 		.of_match_table = of_match_clk_mt7629_hif,
diff --git a/drivers/clk/mediatek/clk-mt7981-eth.c b/drivers/clk/mediatek/clk-mt7981-eth.c
index e8cb247db0ce..906aec9ddff5 100644
--- a/drivers/clk/mediatek/clk-mt7981-eth.c
+++ b/drivers/clk/mediatek/clk-mt7981-eth.c
@@ -107,7 +107,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt7981_eth);
 
 static struct platform_driver clk_mt7981_eth_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt7981-eth",
 		.of_match_table = of_match_clk_mt7981_eth,
diff --git a/drivers/clk/mediatek/clk-mt7981-infracfg.c b/drivers/clk/mediatek/clk-mt7981-infracfg.c
index b2b055151297..0487b6bb80ae 100644
--- a/drivers/clk/mediatek/clk-mt7981-infracfg.c
+++ b/drivers/clk/mediatek/clk-mt7981-infracfg.c
@@ -197,7 +197,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt7981_infracfg);
 
 static struct platform_driver clk_mt7981_infracfg_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt7981-infracfg",
 		.of_match_table = of_match_clk_mt7981_infracfg,
diff --git a/drivers/clk/mediatek/clk-mt7981-topckgen.c b/drivers/clk/mediatek/clk-mt7981-topckgen.c
index 72f2f4f30e85..1943f11e47c1 100644
--- a/drivers/clk/mediatek/clk-mt7981-topckgen.c
+++ b/drivers/clk/mediatek/clk-mt7981-topckgen.c
@@ -413,7 +413,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt7981_topckgen);
 
 static struct platform_driver clk_mt7981_topckgen_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt7981-topckgen",
 		.of_match_table = of_match_clk_mt7981_topckgen,
diff --git a/drivers/clk/mediatek/clk-mt7986-eth.c b/drivers/clk/mediatek/clk-mt7986-eth.c
index 7ab78e0f49a1..4514d42c0829 100644
--- a/drivers/clk/mediatek/clk-mt7986-eth.c
+++ b/drivers/clk/mediatek/clk-mt7986-eth.c
@@ -92,7 +92,7 @@ static struct platform_driver clk_mt7986_eth_drv = {
 		.of_match_table = of_match_clk_mt7986_eth,
 	},
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 };
 module_platform_driver(clk_mt7986_eth_drv);
 
diff --git a/drivers/clk/mediatek/clk-mt7986-infracfg.c b/drivers/clk/mediatek/clk-mt7986-infracfg.c
index cb8ab3e53abf..732c65e616de 100644
--- a/drivers/clk/mediatek/clk-mt7986-infracfg.c
+++ b/drivers/clk/mediatek/clk-mt7986-infracfg.c
@@ -177,7 +177,7 @@ static struct platform_driver clk_mt7986_infracfg_drv = {
 		.of_match_table = of_match_clk_mt7986_infracfg,
 	},
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 };
 module_platform_driver(clk_mt7986_infracfg_drv);
 
diff --git a/drivers/clk/mediatek/clk-mt7986-topckgen.c b/drivers/clk/mediatek/clk-mt7986-topckgen.c
index b644b4ca4710..2dd30da306d9 100644
--- a/drivers/clk/mediatek/clk-mt7986-topckgen.c
+++ b/drivers/clk/mediatek/clk-mt7986-topckgen.c
@@ -306,7 +306,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt7986_topckgen);
 
 static struct platform_driver clk_mt7986_topckgen_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt7986-topckgen",
 		.of_match_table = of_match_clk_mt7986_topckgen,
diff --git a/drivers/clk/mediatek/clk-mt7988-eth.c b/drivers/clk/mediatek/clk-mt7988-eth.c
index adf4a9d39b38..7d9463688be2 100644
--- a/drivers/clk/mediatek/clk-mt7988-eth.c
+++ b/drivers/clk/mediatek/clk-mt7988-eth.c
@@ -142,7 +142,7 @@ static struct platform_driver clk_mt7988_eth_drv = {
 		.of_match_table = of_match_clk_mt7988_eth,
 	},
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 };
 module_platform_driver(clk_mt7988_eth_drv);
 
diff --git a/drivers/clk/mediatek/clk-mt7988-infracfg.c b/drivers/clk/mediatek/clk-mt7988-infracfg.c
index 6c2bebabb4de..ef8267319d91 100644
--- a/drivers/clk/mediatek/clk-mt7988-infracfg.c
+++ b/drivers/clk/mediatek/clk-mt7988-infracfg.c
@@ -292,7 +292,7 @@ static struct platform_driver clk_mt7988_infracfg_drv = {
 		.of_match_table = of_match_clk_mt7988_infracfg,
 	},
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 };
 module_platform_driver(clk_mt7988_infracfg_drv);
 
diff --git a/drivers/clk/mediatek/clk-mt7988-topckgen.c b/drivers/clk/mediatek/clk-mt7988-topckgen.c
index 7300e9694582..50e02cc7a214 100644
--- a/drivers/clk/mediatek/clk-mt7988-topckgen.c
+++ b/drivers/clk/mediatek/clk-mt7988-topckgen.c
@@ -315,7 +315,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt7988_topckgen);
 
 static struct platform_driver clk_mt7988_topckgen_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt7988-topckgen",
 		.of_match_table = of_match_clk_mt7988_topckgen,
diff --git a/drivers/clk/mediatek/clk-mt7988-xfipll.c b/drivers/clk/mediatek/clk-mt7988-xfipll.c
index 9b9ca5471158..f941e4d3ef28 100644
--- a/drivers/clk/mediatek/clk-mt7988-xfipll.c
+++ b/drivers/clk/mediatek/clk-mt7988-xfipll.c
@@ -74,7 +74,7 @@ static struct platform_driver clk_mt7988_xfipll_drv = {
 		.of_match_table = of_match_clk_mt7988_xfipll,
 	},
 	.probe = clk_mt7988_xfipll_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 };
 module_platform_driver(clk_mt7988_xfipll_drv);
 
diff --git a/drivers/clk/mediatek/clk-mt8135-apmixedsys.c b/drivers/clk/mediatek/clk-mt8135-apmixedsys.c
index 41bb2d2e2ea7..bdadc35c64cb 100644
--- a/drivers/clk/mediatek/clk-mt8135-apmixedsys.c
+++ b/drivers/clk/mediatek/clk-mt8135-apmixedsys.c
@@ -93,7 +93,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8135_apmixed);
 
 static struct platform_driver clk_mt8135_apmixed_drv = {
 	.probe = clk_mt8135_apmixed_probe,
-	.remove_new = clk_mt8135_apmixed_remove,
+	.remove = clk_mt8135_apmixed_remove,
 	.driver = {
 		.name = "clk-mt8135-apmixed",
 		.of_match_table = of_match_clk_mt8135_apmixed,
diff --git a/drivers/clk/mediatek/clk-mt8135.c b/drivers/clk/mediatek/clk-mt8135.c
index 019af88d7f9c..084e48a554c2 100644
--- a/drivers/clk/mediatek/clk-mt8135.c
+++ b/drivers/clk/mediatek/clk-mt8135.c
@@ -558,7 +558,7 @@ static struct platform_driver clk_mt8135_drv = {
 		.of_match_table = of_match_clk_mt8135,
 	},
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 };
 module_platform_driver(clk_mt8135_drv);
 
diff --git a/drivers/clk/mediatek/clk-mt8167-aud.c b/drivers/clk/mediatek/clk-mt8167-aud.c
index d1a42ff549c1..d6cff4bdf4cb 100644
--- a/drivers/clk/mediatek/clk-mt8167-aud.c
+++ b/drivers/clk/mediatek/clk-mt8167-aud.c
@@ -54,7 +54,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8167_audsys);
 
 static struct platform_driver clk_mt8167_audsys_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt8167-audsys",
 		.of_match_table = of_match_clk_mt8167_audsys,
diff --git a/drivers/clk/mediatek/clk-mt8167-img.c b/drivers/clk/mediatek/clk-mt8167-img.c
index 888ac3bdeacb..42d38ae94b69 100644
--- a/drivers/clk/mediatek/clk-mt8167-img.c
+++ b/drivers/clk/mediatek/clk-mt8167-img.c
@@ -46,7 +46,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8167_imgsys);
 
 static struct platform_driver clk_mt8167_imgsys_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt8167-imgsys",
 		.of_match_table = of_match_clk_mt8167_imgsys,
diff --git a/drivers/clk/mediatek/clk-mt8167-mfgcfg.c b/drivers/clk/mediatek/clk-mt8167-mfgcfg.c
index e873766f130c..1ef37a3e6851 100644
--- a/drivers/clk/mediatek/clk-mt8167-mfgcfg.c
+++ b/drivers/clk/mediatek/clk-mt8167-mfgcfg.c
@@ -44,7 +44,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8167_mfgcfg);
 
 static struct platform_driver clk_mt8167_mfgcfg_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt8167-mfgcfg",
 		.of_match_table = of_match_clk_mt8167_mfgcfg,
diff --git a/drivers/clk/mediatek/clk-mt8167-mm.c b/drivers/clk/mediatek/clk-mt8167-mm.c
index 38deedffaacf..cef66ee836f3 100644
--- a/drivers/clk/mediatek/clk-mt8167-mm.c
+++ b/drivers/clk/mediatek/clk-mt8167-mm.c
@@ -85,7 +85,7 @@ MODULE_DEVICE_TABLE(platform, clk_mt8167_mm_id_table);
 
 static struct platform_driver clk_mt8167_mm_drv = {
 	.probe = mtk_clk_pdev_probe,
-	.remove_new = mtk_clk_pdev_remove,
+	.remove = mtk_clk_pdev_remove,
 	.driver = {
 		.name = "clk-mt8167-mm",
 	},
diff --git a/drivers/clk/mediatek/clk-mt8167-vdec.c b/drivers/clk/mediatek/clk-mt8167-vdec.c
index c3c892bb8334..e3769bc556a9 100644
--- a/drivers/clk/mediatek/clk-mt8167-vdec.c
+++ b/drivers/clk/mediatek/clk-mt8167-vdec.c
@@ -53,7 +53,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8167_vdec);
 
 static struct platform_driver clk_mt8167_vdec_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt8167-vdecsys",
 		.of_match_table = of_match_clk_mt8167_vdec,
diff --git a/drivers/clk/mediatek/clk-mt8167.c b/drivers/clk/mediatek/clk-mt8167.c
index 5c94995f859c..c64d918c37de 100644
--- a/drivers/clk/mediatek/clk-mt8167.c
+++ b/drivers/clk/mediatek/clk-mt8167.c
@@ -887,7 +887,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8167);
 
 static struct platform_driver clk_mt8167_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt8167",
 		.of_match_table = of_match_clk_mt8167,
diff --git a/drivers/clk/mediatek/clk-mt8173-apmixedsys.c b/drivers/clk/mediatek/clk-mt8173-apmixedsys.c
index 6cab483b8e1e..95385bb67d55 100644
--- a/drivers/clk/mediatek/clk-mt8173-apmixedsys.c
+++ b/drivers/clk/mediatek/clk-mt8173-apmixedsys.c
@@ -207,7 +207,7 @@ static void clk_mt8173_apmixed_remove(struct platform_device *pdev)
 
 static struct platform_driver clk_mt8173_apmixed_drv = {
 	.probe = clk_mt8173_apmixed_probe,
-	.remove_new = clk_mt8173_apmixed_remove,
+	.remove = clk_mt8173_apmixed_remove,
 	.driver = {
 		.name = "clk-mt8173-apmixed",
 		.of_match_table = of_match_clk_mt8173_apmixed,
diff --git a/drivers/clk/mediatek/clk-mt8173-img.c b/drivers/clk/mediatek/clk-mt8173-img.c
index 1011b9ab3dad..6db2b9ab2bc9 100644
--- a/drivers/clk/mediatek/clk-mt8173-img.c
+++ b/drivers/clk/mediatek/clk-mt8173-img.c
@@ -44,7 +44,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8173_imgsys);
 
 static struct platform_driver clk_mt8173_vdecsys_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt8173-imgsys",
 		.of_match_table = of_match_clk_mt8173_imgsys,
diff --git a/drivers/clk/mediatek/clk-mt8173-infracfg.c b/drivers/clk/mediatek/clk-mt8173-infracfg.c
index ecc8b0063ea5..fa2d1d557e04 100644
--- a/drivers/clk/mediatek/clk-mt8173-infracfg.c
+++ b/drivers/clk/mediatek/clk-mt8173-infracfg.c
@@ -156,7 +156,7 @@ static struct platform_driver clk_mt8173_infracfg_drv = {
 		.of_match_table = of_match_clk_mt8173_infracfg,
 	},
 	.probe = clk_mt8173_infracfg_probe,
-	.remove_new = clk_mt8173_infracfg_remove,
+	.remove = clk_mt8173_infracfg_remove,
 };
 module_platform_driver(clk_mt8173_infracfg_drv);
 
diff --git a/drivers/clk/mediatek/clk-mt8173-mm.c b/drivers/clk/mediatek/clk-mt8173-mm.c
index fd903bee328f..26d27250b914 100644
--- a/drivers/clk/mediatek/clk-mt8173-mm.c
+++ b/drivers/clk/mediatek/clk-mt8173-mm.c
@@ -106,7 +106,7 @@ static struct platform_driver clk_mt8173_mm_drv = {
 	},
 	.id_table = clk_mt8173_mm_id_table,
 	.probe = mtk_clk_pdev_probe,
-	.remove_new = mtk_clk_pdev_remove,
+	.remove = mtk_clk_pdev_remove,
 };
 module_platform_driver(clk_mt8173_mm_drv);
 
diff --git a/drivers/clk/mediatek/clk-mt8173-pericfg.c b/drivers/clk/mediatek/clk-mt8173-pericfg.c
index 783efed3f254..bebda74d0f43 100644
--- a/drivers/clk/mediatek/clk-mt8173-pericfg.c
+++ b/drivers/clk/mediatek/clk-mt8173-pericfg.c
@@ -115,7 +115,7 @@ static struct platform_driver clk_mt8173_pericfg_drv = {
 		.of_match_table = of_match_clk_mt8173_pericfg,
 	},
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 };
 module_platform_driver(clk_mt8173_pericfg_drv);
 
diff --git a/drivers/clk/mediatek/clk-mt8173-topckgen.c b/drivers/clk/mediatek/clk-mt8173-topckgen.c
index 6bb7ffd74487..42c37541cebb 100644
--- a/drivers/clk/mediatek/clk-mt8173-topckgen.c
+++ b/drivers/clk/mediatek/clk-mt8173-topckgen.c
@@ -646,7 +646,7 @@ static struct platform_driver clk_mt8173_topckgen_drv = {
 		.of_match_table = of_match_clk_mt8173_topckgen,
 	},
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 };
 module_platform_driver(clk_mt8173_topckgen_drv);
 
diff --git a/drivers/clk/mediatek/clk-mt8173-vdecsys.c b/drivers/clk/mediatek/clk-mt8173-vdecsys.c
index 011e3812156f..625ca0b09cc2 100644
--- a/drivers/clk/mediatek/clk-mt8173-vdecsys.c
+++ b/drivers/clk/mediatek/clk-mt8173-vdecsys.c
@@ -46,7 +46,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8173_vdecsys);
 
 static struct platform_driver clk_mt8173_vdecsys_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt8173-vdecsys",
 		.of_match_table = of_match_clk_mt8173_vdecsys,
diff --git a/drivers/clk/mediatek/clk-mt8173-vencsys.c b/drivers/clk/mediatek/clk-mt8173-vencsys.c
index 1bf84ae6a0bc..87755dd1a337 100644
--- a/drivers/clk/mediatek/clk-mt8173-vencsys.c
+++ b/drivers/clk/mediatek/clk-mt8173-vencsys.c
@@ -57,7 +57,7 @@ static struct platform_driver clk_mt8173_vencsys_drv = {
 		.of_match_table = of_match_clk_mt8173_vencsys,
 	},
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 };
 module_platform_driver(clk_mt8173_vencsys_drv);
 
diff --git a/drivers/clk/mediatek/clk-mt8183-audio.c b/drivers/clk/mediatek/clk-mt8183-audio.c
index 30a20e8ba84b..011d329ad30e 100644
--- a/drivers/clk/mediatek/clk-mt8183-audio.c
+++ b/drivers/clk/mediatek/clk-mt8183-audio.c
@@ -101,7 +101,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8183_audio);
 
 static struct platform_driver clk_mt8183_audio_drv = {
 	.probe = clk_mt8183_audio_probe,
-	.remove_new = clk_mt8183_audio_remove,
+	.remove = clk_mt8183_audio_remove,
 	.driver = {
 		.name = "clk-mt8183-audio",
 		.of_match_table = of_match_clk_mt8183_audio,
diff --git a/drivers/clk/mediatek/clk-mt8183-cam.c b/drivers/clk/mediatek/clk-mt8183-cam.c
index f16c3aa3c911..c7642085f8de 100644
--- a/drivers/clk/mediatek/clk-mt8183-cam.c
+++ b/drivers/clk/mediatek/clk-mt8183-cam.c
@@ -51,7 +51,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8183_cam);
 
 static struct platform_driver clk_mt8183_cam_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt8183-cam",
 		.of_match_table = of_match_clk_mt8183_cam,
diff --git a/drivers/clk/mediatek/clk-mt8183-img.c b/drivers/clk/mediatek/clk-mt8183-img.c
index 32ee6a1867fc..ee92459c74ca 100644
--- a/drivers/clk/mediatek/clk-mt8183-img.c
+++ b/drivers/clk/mediatek/clk-mt8183-img.c
@@ -51,7 +51,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8183_img);
 
 static struct platform_driver clk_mt8183_img_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt8183-img",
 		.of_match_table = of_match_clk_mt8183_img,
diff --git a/drivers/clk/mediatek/clk-mt8183-ipu0.c b/drivers/clk/mediatek/clk-mt8183-ipu0.c
index dc2916c4e0dc..6831747f123b 100644
--- a/drivers/clk/mediatek/clk-mt8183-ipu0.c
+++ b/drivers/clk/mediatek/clk-mt8183-ipu0.c
@@ -44,7 +44,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8183_ipu_core0);
 
 static struct platform_driver clk_mt8183_ipu_core0_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt8183-ipu_core0",
 		.of_match_table = of_match_clk_mt8183_ipu_core0,
diff --git a/drivers/clk/mediatek/clk-mt8183-ipu1.c b/drivers/clk/mediatek/clk-mt8183-ipu1.c
index 9c63e4c592d0..ecf434432e7b 100644
--- a/drivers/clk/mediatek/clk-mt8183-ipu1.c
+++ b/drivers/clk/mediatek/clk-mt8183-ipu1.c
@@ -44,7 +44,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8183_ipu_core1);
 
 static struct platform_driver clk_mt8183_ipu_core1_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt8183-ipu_core1",
 		.of_match_table = of_match_clk_mt8183_ipu_core1,
diff --git a/drivers/clk/mediatek/clk-mt8183-ipu_adl.c b/drivers/clk/mediatek/clk-mt8183-ipu_adl.c
index 54a50eda1719..c1a770ba3245 100644
--- a/drivers/clk/mediatek/clk-mt8183-ipu_adl.c
+++ b/drivers/clk/mediatek/clk-mt8183-ipu_adl.c
@@ -42,7 +42,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8183_ipu_adl);
 
 static struct platform_driver clk_mt8183_ipu_adl_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt8183-ipu_adl",
 		.of_match_table = of_match_clk_mt8183_ipu_adl,
diff --git a/drivers/clk/mediatek/clk-mt8183-ipu_conn.c b/drivers/clk/mediatek/clk-mt8183-ipu_conn.c
index 99a817d3be6c..f0e72e6edb7a 100644
--- a/drivers/clk/mediatek/clk-mt8183-ipu_conn.c
+++ b/drivers/clk/mediatek/clk-mt8183-ipu_conn.c
@@ -111,7 +111,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8183_ipu_conn);
 
 static struct platform_driver clk_mt8183_ipu_conn_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt8183-ipu_conn",
 		.of_match_table = of_match_clk_mt8183_ipu_conn,
diff --git a/drivers/clk/mediatek/clk-mt8183-mfgcfg.c b/drivers/clk/mediatek/clk-mt8183-mfgcfg.c
index b1e802bbfaef..be44889783ff 100644
--- a/drivers/clk/mediatek/clk-mt8183-mfgcfg.c
+++ b/drivers/clk/mediatek/clk-mt8183-mfgcfg.c
@@ -44,7 +44,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8183_mfg);
 
 static struct platform_driver clk_mt8183_mfg_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt8183-mfg",
 		.of_match_table = of_match_clk_mt8183_mfg,
diff --git a/drivers/clk/mediatek/clk-mt8183-mm.c b/drivers/clk/mediatek/clk-mt8183-mm.c
index 59acf1e2951b..0f132f05fa8b 100644
--- a/drivers/clk/mediatek/clk-mt8183-mm.c
+++ b/drivers/clk/mediatek/clk-mt8183-mm.c
@@ -95,7 +95,7 @@ MODULE_DEVICE_TABLE(platform, clk_mt8183_mm_id_table);
 
 static struct platform_driver clk_mt8183_mm_drv = {
 	.probe = mtk_clk_pdev_probe,
-	.remove_new = mtk_clk_pdev_remove,
+	.remove = mtk_clk_pdev_remove,
 	.driver = {
 		.name = "clk-mt8183-mm",
 	},
diff --git a/drivers/clk/mediatek/clk-mt8183-vdec.c b/drivers/clk/mediatek/clk-mt8183-vdec.c
index 48a8ef3f69aa..43bf34077b16 100644
--- a/drivers/clk/mediatek/clk-mt8183-vdec.c
+++ b/drivers/clk/mediatek/clk-mt8183-vdec.c
@@ -55,7 +55,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8183_vdec);
 
 static struct platform_driver clk_mt8183_vdec_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt8183-vdec",
 		.of_match_table = of_match_clk_mt8183_vdec,
diff --git a/drivers/clk/mediatek/clk-mt8183-venc.c b/drivers/clk/mediatek/clk-mt8183-venc.c
index 8f36688dfa14..c3d99b3b8ff7 100644
--- a/drivers/clk/mediatek/clk-mt8183-venc.c
+++ b/drivers/clk/mediatek/clk-mt8183-venc.c
@@ -47,7 +47,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8183_venc);
 
 static struct platform_driver clk_mt8183_venc_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt8183-venc",
 		.of_match_table = of_match_clk_mt8183_venc,
diff --git a/drivers/clk/mediatek/clk-mt8183.c b/drivers/clk/mediatek/clk-mt8183.c
index 27eee4ef2c0f..aa7cc7709b2d 100644
--- a/drivers/clk/mediatek/clk-mt8183.c
+++ b/drivers/clk/mediatek/clk-mt8183.c
@@ -899,7 +899,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8183);
 
 static struct platform_driver clk_mt8183_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt8183",
 		.of_match_table = of_match_clk_mt8183,
diff --git a/drivers/clk/mediatek/clk-mt8186-apmixedsys.c b/drivers/clk/mediatek/clk-mt8186-apmixedsys.c
index 6f7127003e4f..4b2b16578232 100644
--- a/drivers/clk/mediatek/clk-mt8186-apmixedsys.c
+++ b/drivers/clk/mediatek/clk-mt8186-apmixedsys.c
@@ -185,7 +185,7 @@ static void clk_mt8186_apmixed_remove(struct platform_device *pdev)
 
 static struct platform_driver clk_mt8186_apmixed_drv = {
 	.probe = clk_mt8186_apmixed_probe,
-	.remove_new = clk_mt8186_apmixed_remove,
+	.remove = clk_mt8186_apmixed_remove,
 	.driver = {
 		.name = "clk-mt8186-apmixed",
 		.of_match_table = of_match_clk_mt8186_apmixed,
diff --git a/drivers/clk/mediatek/clk-mt8186-cam.c b/drivers/clk/mediatek/clk-mt8186-cam.c
index 0082f0d9286b..2ddd5f90377f 100644
--- a/drivers/clk/mediatek/clk-mt8186-cam.c
+++ b/drivers/clk/mediatek/clk-mt8186-cam.c
@@ -82,7 +82,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8186_cam);
 
 static struct platform_driver clk_mt8186_cam_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt8186-cam",
 		.of_match_table = of_match_clk_mt8186_cam,
diff --git a/drivers/clk/mediatek/clk-mt8186-img.c b/drivers/clk/mediatek/clk-mt8186-img.c
index 0583a18805ce..5e466e1f5f44 100644
--- a/drivers/clk/mediatek/clk-mt8186-img.c
+++ b/drivers/clk/mediatek/clk-mt8186-img.c
@@ -60,7 +60,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8186_img);
 
 static struct platform_driver clk_mt8186_img_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt8186-img",
 		.of_match_table = of_match_clk_mt8186_img,
diff --git a/drivers/clk/mediatek/clk-mt8186-imp_iic_wrap.c b/drivers/clk/mediatek/clk-mt8186-imp_iic_wrap.c
index 2a2a6bb23205..75abb871044c 100644
--- a/drivers/clk/mediatek/clk-mt8186-imp_iic_wrap.c
+++ b/drivers/clk/mediatek/clk-mt8186-imp_iic_wrap.c
@@ -59,7 +59,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8186_imp_iic_wrap);
 
 static struct platform_driver clk_mt8186_imp_iic_wrap_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt8186-imp_iic_wrap",
 		.of_match_table = of_match_clk_mt8186_imp_iic_wrap,
diff --git a/drivers/clk/mediatek/clk-mt8186-infra_ao.c b/drivers/clk/mediatek/clk-mt8186-infra_ao.c
index d7239875fb15..8d9d86a510ff 100644
--- a/drivers/clk/mediatek/clk-mt8186-infra_ao.c
+++ b/drivers/clk/mediatek/clk-mt8186-infra_ao.c
@@ -231,7 +231,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8186_infra_ao);
 
 static struct platform_driver clk_mt8186_infra_ao_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt8186-infra-ao",
 		.of_match_table = of_match_clk_mt8186_infra_ao,
diff --git a/drivers/clk/mediatek/clk-mt8186-ipe.c b/drivers/clk/mediatek/clk-mt8186-ipe.c
index 77bdd2806517..f66a0aeaa6b3 100644
--- a/drivers/clk/mediatek/clk-mt8186-ipe.c
+++ b/drivers/clk/mediatek/clk-mt8186-ipe.c
@@ -47,7 +47,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8186_ipe);
 
 static struct platform_driver clk_mt8186_ipe_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt8186-ipe",
 		.of_match_table = of_match_clk_mt8186_ipe,
diff --git a/drivers/clk/mediatek/clk-mt8186-mcu.c b/drivers/clk/mediatek/clk-mt8186-mcu.c
index eb54ccb77b74..d1640e4dc2ad 100644
--- a/drivers/clk/mediatek/clk-mt8186-mcu.c
+++ b/drivers/clk/mediatek/clk-mt8186-mcu.c
@@ -60,7 +60,7 @@ static struct platform_driver clk_mt8186_mcu_drv = {
 		.of_match_table = of_match_clk_mt8186_mcu,
 	},
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 };
 module_platform_driver(clk_mt8186_mcu_drv);
 
diff --git a/drivers/clk/mediatek/clk-mt8186-mdp.c b/drivers/clk/mediatek/clk-mt8186-mdp.c
index fb47d6bacf7f..01561cf902c4 100644
--- a/drivers/clk/mediatek/clk-mt8186-mdp.c
+++ b/drivers/clk/mediatek/clk-mt8186-mdp.c
@@ -72,7 +72,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8186_mdp);
 
 static struct platform_driver clk_mt8186_mdp_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt8186-mdp",
 		.of_match_table = of_match_clk_mt8186_mdp,
diff --git a/drivers/clk/mediatek/clk-mt8186-mfg.c b/drivers/clk/mediatek/clk-mt8186-mfg.c
index 64cdee1fddd4..3f21b1f222e1 100644
--- a/drivers/clk/mediatek/clk-mt8186-mfg.c
+++ b/drivers/clk/mediatek/clk-mt8186-mfg.c
@@ -41,7 +41,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8186_mfg);
 
 static struct platform_driver clk_mt8186_mfg_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt8186-mfg",
 		.of_match_table = of_match_clk_mt8186_mfg,
diff --git a/drivers/clk/mediatek/clk-mt8186-mm.c b/drivers/clk/mediatek/clk-mt8186-mm.c
index 403566187e64..fc8488c44866 100644
--- a/drivers/clk/mediatek/clk-mt8186-mm.c
+++ b/drivers/clk/mediatek/clk-mt8186-mm.c
@@ -71,7 +71,7 @@ MODULE_DEVICE_TABLE(platform, clk_mt8186_mm_id_table);
 
 static struct platform_driver clk_mt8186_mm_drv = {
 	.probe = mtk_clk_pdev_probe,
-	.remove_new = mtk_clk_pdev_remove,
+	.remove = mtk_clk_pdev_remove,
 	.driver = {
 		.name = "clk-mt8186-mm",
 	},
diff --git a/drivers/clk/mediatek/clk-mt8186-topckgen.c b/drivers/clk/mediatek/clk-mt8186-topckgen.c
index eb9f51e77ca8..14f1cbdbbd13 100644
--- a/drivers/clk/mediatek/clk-mt8186-topckgen.c
+++ b/drivers/clk/mediatek/clk-mt8186-topckgen.c
@@ -725,7 +725,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8186_topck);
 
 static struct platform_driver clk_mt8186_topck_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt8186-topck",
 		.of_match_table = of_match_clk_mt8186_topck,
diff --git a/drivers/clk/mediatek/clk-mt8186-vdec.c b/drivers/clk/mediatek/clk-mt8186-vdec.c
index 25465704ddfb..522b8c952969 100644
--- a/drivers/clk/mediatek/clk-mt8186-vdec.c
+++ b/drivers/clk/mediatek/clk-mt8186-vdec.c
@@ -80,7 +80,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8186_vdec);
 
 static struct platform_driver clk_mt8186_vdec_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt8186-vdec",
 		.of_match_table = of_match_clk_mt8186_vdec,
diff --git a/drivers/clk/mediatek/clk-mt8186-venc.c b/drivers/clk/mediatek/clk-mt8186-venc.c
index 647dd66a3ce0..c0c98bc75112 100644
--- a/drivers/clk/mediatek/clk-mt8186-venc.c
+++ b/drivers/clk/mediatek/clk-mt8186-venc.c
@@ -43,7 +43,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8186_venc);
 
 static struct platform_driver clk_mt8186_venc_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt8186-venc",
 		.of_match_table = of_match_clk_mt8186_venc,
diff --git a/drivers/clk/mediatek/clk-mt8186-wpe.c b/drivers/clk/mediatek/clk-mt8186-wpe.c
index 47f96e088361..babd7b2778c2 100644
--- a/drivers/clk/mediatek/clk-mt8186-wpe.c
+++ b/drivers/clk/mediatek/clk-mt8186-wpe.c
@@ -43,7 +43,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8186_wpe);
 
 static struct platform_driver clk_mt8186_wpe_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt8186-wpe",
 		.of_match_table = of_match_clk_mt8186_wpe,
diff --git a/drivers/clk/mediatek/clk-mt8188-adsp_audio26m.c b/drivers/clk/mediatek/clk-mt8188-adsp_audio26m.c
index 5ac035bbe684..dcde2187d24a 100644
--- a/drivers/clk/mediatek/clk-mt8188-adsp_audio26m.c
+++ b/drivers/clk/mediatek/clk-mt8188-adsp_audio26m.c
@@ -40,7 +40,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8188_adsp_audio26m);
 
 static struct platform_driver clk_mt8188_adsp_audio26m_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt8188-adsp_audio26m",
 		.of_match_table = of_match_clk_mt8188_adsp_audio26m,
diff --git a/drivers/clk/mediatek/clk-mt8188-apmixedsys.c b/drivers/clk/mediatek/clk-mt8188-apmixedsys.c
index 85d573d96081..21d7a9a2ab1a 100644
--- a/drivers/clk/mediatek/clk-mt8188-apmixedsys.c
+++ b/drivers/clk/mediatek/clk-mt8188-apmixedsys.c
@@ -145,7 +145,7 @@ static void clk_mt8188_apmixed_remove(struct platform_device *pdev)
 
 static struct platform_driver clk_mt8188_apmixed_drv = {
 	.probe = clk_mt8188_apmixed_probe,
-	.remove_new = clk_mt8188_apmixed_remove,
+	.remove = clk_mt8188_apmixed_remove,
 	.driver = {
 		.name = "clk-mt8188-apmixed",
 		.of_match_table = of_match_clk_mt8188_apmixed,
diff --git a/drivers/clk/mediatek/clk-mt8188-cam.c b/drivers/clk/mediatek/clk-mt8188-cam.c
index a6a6581f0461..7500bd25387f 100644
--- a/drivers/clk/mediatek/clk-mt8188-cam.c
+++ b/drivers/clk/mediatek/clk-mt8188-cam.c
@@ -109,7 +109,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8188_cam);
 
 static struct platform_driver clk_mt8188_cam_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt8188-cam",
 		.of_match_table = of_match_clk_mt8188_cam,
diff --git a/drivers/clk/mediatek/clk-mt8188-ccu.c b/drivers/clk/mediatek/clk-mt8188-ccu.c
index 9532fc652f01..1566fc437ea3 100644
--- a/drivers/clk/mediatek/clk-mt8188-ccu.c
+++ b/drivers/clk/mediatek/clk-mt8188-ccu.c
@@ -39,7 +39,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8188_ccu);
 
 static struct platform_driver clk_mt8188_ccu_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt8188-ccu",
 		.of_match_table = of_match_clk_mt8188_ccu,
diff --git a/drivers/clk/mediatek/clk-mt8188-img.c b/drivers/clk/mediatek/clk-mt8188-img.c
index 00ad6d7884ae..cb2fbd4136b9 100644
--- a/drivers/clk/mediatek/clk-mt8188-img.c
+++ b/drivers/clk/mediatek/clk-mt8188-img.c
@@ -101,7 +101,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8188_imgsys_main);
 
 static struct platform_driver clk_mt8188_imgsys_main_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt8188-imgsys_main",
 		.of_match_table = of_match_clk_mt8188_imgsys_main,
diff --git a/drivers/clk/mediatek/clk-mt8188-imp_iic_wrap.c b/drivers/clk/mediatek/clk-mt8188-imp_iic_wrap.c
index 7b713f4cd662..14a4b575b583 100644
--- a/drivers/clk/mediatek/clk-mt8188-imp_iic_wrap.c
+++ b/drivers/clk/mediatek/clk-mt8188-imp_iic_wrap.c
@@ -71,7 +71,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8188_imp_iic_wrap);
 
 static struct platform_driver clk_mt8188_imp_iic_wrap_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt8188-imp_iic_wrap",
 		.of_match_table = of_match_clk_mt8188_imp_iic_wrap,
diff --git a/drivers/clk/mediatek/clk-mt8188-infra_ao.c b/drivers/clk/mediatek/clk-mt8188-infra_ao.c
index face3e191464..b9bc8fcc2ade 100644
--- a/drivers/clk/mediatek/clk-mt8188-infra_ao.c
+++ b/drivers/clk/mediatek/clk-mt8188-infra_ao.c
@@ -213,7 +213,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8188_infra_ao);
 
 static struct platform_driver clk_mt8188_infra_ao_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt8188-infra_ao",
 		.of_match_table = of_match_clk_mt8188_infra_ao,
diff --git a/drivers/clk/mediatek/clk-mt8188-ipe.c b/drivers/clk/mediatek/clk-mt8188-ipe.c
index fa439af34359..8f1933b71e28 100644
--- a/drivers/clk/mediatek/clk-mt8188-ipe.c
+++ b/drivers/clk/mediatek/clk-mt8188-ipe.c
@@ -41,7 +41,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8188_ipe);
 
 static struct platform_driver clk_mt8188_ipe_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt8188-ipe",
 		.of_match_table = of_match_clk_mt8188_ipe,
diff --git a/drivers/clk/mediatek/clk-mt8188-mfg.c b/drivers/clk/mediatek/clk-mt8188-mfg.c
index ec562e7d459d..2ddfb1a3de47 100644
--- a/drivers/clk/mediatek/clk-mt8188-mfg.c
+++ b/drivers/clk/mediatek/clk-mt8188-mfg.c
@@ -38,7 +38,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8188_mfgcfg);
 
 static struct platform_driver clk_mt8188_mfgcfg_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt8188-mfgcfg",
 		.of_match_table = of_match_clk_mt8188_mfgcfg,
diff --git a/drivers/clk/mediatek/clk-mt8188-peri_ao.c b/drivers/clk/mediatek/clk-mt8188-peri_ao.c
index e4339885b062..639865335fc8 100644
--- a/drivers/clk/mediatek/clk-mt8188-peri_ao.c
+++ b/drivers/clk/mediatek/clk-mt8188-peri_ao.c
@@ -49,7 +49,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8188_peri_ao);
 
 static struct platform_driver clk_mt8188_peri_ao_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt8188-peri_ao",
 		.of_match_table = of_match_clk_mt8188_peri_ao,
diff --git a/drivers/clk/mediatek/clk-mt8188-topckgen.c b/drivers/clk/mediatek/clk-mt8188-topckgen.c
index 2ccc8a1c98f9..c4baf4076ed6 100644
--- a/drivers/clk/mediatek/clk-mt8188-topckgen.c
+++ b/drivers/clk/mediatek/clk-mt8188-topckgen.c
@@ -1347,7 +1347,7 @@ static void clk_mt8188_topck_remove(struct platform_device *pdev)
 
 static struct platform_driver clk_mt8188_topck_drv = {
 	.probe = clk_mt8188_topck_probe,
-	.remove_new = clk_mt8188_topck_remove,
+	.remove = clk_mt8188_topck_remove,
 	.driver = {
 		.name = "clk-mt8188-topck",
 		.of_match_table = of_match_clk_mt8188_topck,
diff --git a/drivers/clk/mediatek/clk-mt8188-vdec.c b/drivers/clk/mediatek/clk-mt8188-vdec.c
index bf388997c3f8..f48f0716d7c2 100644
--- a/drivers/clk/mediatek/clk-mt8188-vdec.c
+++ b/drivers/clk/mediatek/clk-mt8188-vdec.c
@@ -81,7 +81,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8188_vdec);
 
 static struct platform_driver clk_mt8188_vdec_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt8188-vdec",
 		.of_match_table = of_match_clk_mt8188_vdec,
diff --git a/drivers/clk/mediatek/clk-mt8188-vdo0.c b/drivers/clk/mediatek/clk-mt8188-vdo0.c
index 935371fbf1d2..017d6662589b 100644
--- a/drivers/clk/mediatek/clk-mt8188-vdo0.c
+++ b/drivers/clk/mediatek/clk-mt8188-vdo0.c
@@ -97,7 +97,7 @@ MODULE_DEVICE_TABLE(platform, clk_mt8188_vdo0_id_table);
 
 static struct platform_driver clk_mt8188_vdo0_drv = {
 	.probe = mtk_clk_pdev_probe,
-	.remove_new = mtk_clk_pdev_remove,
+	.remove = mtk_clk_pdev_remove,
 	.driver = {
 		.name = "clk-mt8188-vdo0",
 	},
diff --git a/drivers/clk/mediatek/clk-mt8188-vdo1.c b/drivers/clk/mediatek/clk-mt8188-vdo1.c
index fb24c9026fd8..4fa355f8f0c2 100644
--- a/drivers/clk/mediatek/clk-mt8188-vdo1.c
+++ b/drivers/clk/mediatek/clk-mt8188-vdo1.c
@@ -144,7 +144,7 @@ MODULE_DEVICE_TABLE(platform, clk_mt8188_vdo1_id_table);
 
 static struct platform_driver clk_mt8188_vdo1_drv = {
 	.probe = mtk_clk_pdev_probe,
-	.remove_new = mtk_clk_pdev_remove,
+	.remove = mtk_clk_pdev_remove,
 	.driver = {
 		.name = "clk-mt8188-vdo1",
 	},
diff --git a/drivers/clk/mediatek/clk-mt8188-venc.c b/drivers/clk/mediatek/clk-mt8188-venc.c
index 4df8d4e05159..01e971545506 100644
--- a/drivers/clk/mediatek/clk-mt8188-venc.c
+++ b/drivers/clk/mediatek/clk-mt8188-venc.c
@@ -45,7 +45,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8188_venc1);
 
 static struct platform_driver clk_mt8188_venc1_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt8188-venc1",
 		.of_match_table = of_match_clk_mt8188_venc1,
diff --git a/drivers/clk/mediatek/clk-mt8188-vpp0.c b/drivers/clk/mediatek/clk-mt8188-vpp0.c
index 310792108793..cd2579b7b9c3 100644
--- a/drivers/clk/mediatek/clk-mt8188-vpp0.c
+++ b/drivers/clk/mediatek/clk-mt8188-vpp0.c
@@ -104,7 +104,7 @@ MODULE_DEVICE_TABLE(platform, clk_mt8188_vpp0_id_table);
 
 static struct platform_driver clk_mt8188_vpp0_drv = {
 	.probe = mtk_clk_pdev_probe,
-	.remove_new = mtk_clk_pdev_remove,
+	.remove = mtk_clk_pdev_remove,
 	.driver = {
 		.name = "clk-mt8188-vpp0",
 	},
diff --git a/drivers/clk/mediatek/clk-mt8188-vpp1.c b/drivers/clk/mediatek/clk-mt8188-vpp1.c
index 0aa10aaa0292..0e1bd8306e8a 100644
--- a/drivers/clk/mediatek/clk-mt8188-vpp1.c
+++ b/drivers/clk/mediatek/clk-mt8188-vpp1.c
@@ -99,7 +99,7 @@ MODULE_DEVICE_TABLE(platform, clk_mt8188_vpp1_id_table);
 
 static struct platform_driver clk_mt8188_vpp1_drv = {
 	.probe = mtk_clk_pdev_probe,
-	.remove_new = mtk_clk_pdev_remove,
+	.remove = mtk_clk_pdev_remove,
 	.driver = {
 		.name = "clk-mt8188-vpp1",
 	},
diff --git a/drivers/clk/mediatek/clk-mt8188-wpe.c b/drivers/clk/mediatek/clk-mt8188-wpe.c
index fbac440363cc..d709bb1ee1d6 100644
--- a/drivers/clk/mediatek/clk-mt8188-wpe.c
+++ b/drivers/clk/mediatek/clk-mt8188-wpe.c
@@ -94,7 +94,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8188_wpe);
 
 static struct platform_driver clk_mt8188_wpe_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt8188-wpe",
 		.of_match_table = of_match_clk_mt8188_wpe,
diff --git a/drivers/clk/mediatek/clk-mt8192-apmixedsys.c b/drivers/clk/mediatek/clk-mt8192-apmixedsys.c
index 3590932acc63..0b66a27e4d5a 100644
--- a/drivers/clk/mediatek/clk-mt8192-apmixedsys.c
+++ b/drivers/clk/mediatek/clk-mt8192-apmixedsys.c
@@ -206,7 +206,7 @@ static struct platform_driver clk_mt8192_apmixed_drv = {
 		.of_match_table = of_match_clk_mt8192_apmixed,
 	},
 	.probe = clk_mt8192_apmixed_probe,
-	.remove_new = clk_mt8192_apmixed_remove,
+	.remove = clk_mt8192_apmixed_remove,
 };
 module_platform_driver(clk_mt8192_apmixed_drv);
 MODULE_DESCRIPTION("MediaTek MT8192 apmixed clocks driver");
diff --git a/drivers/clk/mediatek/clk-mt8192-aud.c b/drivers/clk/mediatek/clk-mt8192-aud.c
index b438ebad998d..f3ebf8713fbb 100644
--- a/drivers/clk/mediatek/clk-mt8192-aud.c
+++ b/drivers/clk/mediatek/clk-mt8192-aud.c
@@ -111,7 +111,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8192_aud);
 
 static struct platform_driver clk_mt8192_aud_drv = {
 	.probe = clk_mt8192_aud_probe,
-	.remove_new = clk_mt8192_aud_remove,
+	.remove = clk_mt8192_aud_remove,
 	.driver = {
 		.name = "clk-mt8192-aud",
 		.of_match_table = of_match_clk_mt8192_aud,
diff --git a/drivers/clk/mediatek/clk-mt8192-cam.c b/drivers/clk/mediatek/clk-mt8192-cam.c
index 3eed4a7b6d8e..891d2f88d9cf 100644
--- a/drivers/clk/mediatek/clk-mt8192-cam.c
+++ b/drivers/clk/mediatek/clk-mt8192-cam.c
@@ -99,7 +99,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8192_cam);
 
 static struct platform_driver clk_mt8192_cam_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt8192-cam",
 		.of_match_table = of_match_clk_mt8192_cam,
diff --git a/drivers/clk/mediatek/clk-mt8192-img.c b/drivers/clk/mediatek/clk-mt8192-img.c
index 13a435332752..c08e831125a5 100644
--- a/drivers/clk/mediatek/clk-mt8192-img.c
+++ b/drivers/clk/mediatek/clk-mt8192-img.c
@@ -62,7 +62,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8192_img);
 
 static struct platform_driver clk_mt8192_img_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt8192-img",
 		.of_match_table = of_match_clk_mt8192_img,
diff --git a/drivers/clk/mediatek/clk-mt8192-imp_iic_wrap.c b/drivers/clk/mediatek/clk-mt8192-imp_iic_wrap.c
index 45585f2edd50..0f9530d9263c 100644
--- a/drivers/clk/mediatek/clk-mt8192-imp_iic_wrap.c
+++ b/drivers/clk/mediatek/clk-mt8192-imp_iic_wrap.c
@@ -111,7 +111,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8192_imp_iic_wrap);
 
 static struct platform_driver clk_mt8192_imp_iic_wrap_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt8192-imp_iic_wrap",
 		.of_match_table = of_match_clk_mt8192_imp_iic_wrap,
diff --git a/drivers/clk/mediatek/clk-mt8192-ipe.c b/drivers/clk/mediatek/clk-mt8192-ipe.c
index da2e2d83cd25..c932b8b20edc 100644
--- a/drivers/clk/mediatek/clk-mt8192-ipe.c
+++ b/drivers/clk/mediatek/clk-mt8192-ipe.c
@@ -49,7 +49,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8192_ipe);
 
 static struct platform_driver clk_mt8192_ipe_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt8192-ipe",
 		.of_match_table = of_match_clk_mt8192_ipe,
diff --git a/drivers/clk/mediatek/clk-mt8192-mdp.c b/drivers/clk/mediatek/clk-mt8192-mdp.c
index be674d6c31d7..30334ebca864 100644
--- a/drivers/clk/mediatek/clk-mt8192-mdp.c
+++ b/drivers/clk/mediatek/clk-mt8192-mdp.c
@@ -74,7 +74,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8192_mdp);
 
 static struct platform_driver clk_mt8192_mdp_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt8192-mdp",
 		.of_match_table = of_match_clk_mt8192_mdp,
diff --git a/drivers/clk/mediatek/clk-mt8192-mfg.c b/drivers/clk/mediatek/clk-mt8192-mfg.c
index 2da969f4ca6b..9d176659e8a2 100644
--- a/drivers/clk/mediatek/clk-mt8192-mfg.c
+++ b/drivers/clk/mediatek/clk-mt8192-mfg.c
@@ -44,7 +44,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8192_mfg);
 
 static struct platform_driver clk_mt8192_mfg_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt8192-mfg",
 		.of_match_table = of_match_clk_mt8192_mfg,
diff --git a/drivers/clk/mediatek/clk-mt8192-mm.c b/drivers/clk/mediatek/clk-mt8192-mm.c
index 2b9c1c4524c2..bda4406e1304 100644
--- a/drivers/clk/mediatek/clk-mt8192-mm.c
+++ b/drivers/clk/mediatek/clk-mt8192-mm.c
@@ -93,7 +93,7 @@ MODULE_DEVICE_TABLE(platform, clk_mt8192_mm_id_table);
 
 static struct platform_driver clk_mt8192_mm_drv = {
 	.probe = mtk_clk_pdev_probe,
-	.remove_new = mtk_clk_pdev_remove,
+	.remove = mtk_clk_pdev_remove,
 	.driver = {
 		.name = "clk-mt8192-mm",
 	},
diff --git a/drivers/clk/mediatek/clk-mt8192-msdc.c b/drivers/clk/mediatek/clk-mt8192-msdc.c
index bc5ce987b76c..04a66220f269 100644
--- a/drivers/clk/mediatek/clk-mt8192-msdc.c
+++ b/drivers/clk/mediatek/clk-mt8192-msdc.c
@@ -56,7 +56,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8192_msdc);
 
 static struct platform_driver clk_mt8192_msdc_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt8192-msdc",
 		.of_match_table = of_match_clk_mt8192_msdc,
diff --git a/drivers/clk/mediatek/clk-mt8192-scp_adsp.c b/drivers/clk/mediatek/clk-mt8192-scp_adsp.c
index e017d30a8832..f9e4c16573e2 100644
--- a/drivers/clk/mediatek/clk-mt8192-scp_adsp.c
+++ b/drivers/clk/mediatek/clk-mt8192-scp_adsp.c
@@ -42,7 +42,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8192_scp_adsp);
 
 static struct platform_driver clk_mt8192_scp_adsp_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt8192-scp_adsp",
 		.of_match_table = of_match_clk_mt8192_scp_adsp,
diff --git a/drivers/clk/mediatek/clk-mt8192-vdec.c b/drivers/clk/mediatek/clk-mt8192-vdec.c
index fcb34b1dcdab..9c10161807b2 100644
--- a/drivers/clk/mediatek/clk-mt8192-vdec.c
+++ b/drivers/clk/mediatek/clk-mt8192-vdec.c
@@ -86,7 +86,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8192_vdec);
 
 static struct platform_driver clk_mt8192_vdec_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt8192-vdec",
 		.of_match_table = of_match_clk_mt8192_vdec,
diff --git a/drivers/clk/mediatek/clk-mt8192-venc.c b/drivers/clk/mediatek/clk-mt8192-venc.c
index 98d58a9397cd..0b01e2b7f036 100644
--- a/drivers/clk/mediatek/clk-mt8192-venc.c
+++ b/drivers/clk/mediatek/clk-mt8192-venc.c
@@ -45,7 +45,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8192_venc);
 
 static struct platform_driver clk_mt8192_venc_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt8192-venc",
 		.of_match_table = of_match_clk_mt8192_venc,
diff --git a/drivers/clk/mediatek/clk-mt8192.c b/drivers/clk/mediatek/clk-mt8192.c
index bce2298ebc8d..50b43807c60c 100644
--- a/drivers/clk/mediatek/clk-mt8192.c
+++ b/drivers/clk/mediatek/clk-mt8192.c
@@ -1026,7 +1026,7 @@ static struct platform_driver clk_mt8192_drv = {
 		.of_match_table = of_match_clk_mt8192,
 	},
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 };
 module_platform_driver(clk_mt8192_drv);
 
diff --git a/drivers/clk/mediatek/clk-mt8195-apmixedsys.c b/drivers/clk/mediatek/clk-mt8195-apmixedsys.c
index 049ae8123e34..282a3137dc89 100644
--- a/drivers/clk/mediatek/clk-mt8195-apmixedsys.c
+++ b/drivers/clk/mediatek/clk-mt8195-apmixedsys.c
@@ -223,7 +223,7 @@ static void clk_mt8195_apmixed_remove(struct platform_device *pdev)
 
 static struct platform_driver clk_mt8195_apmixed_drv = {
 	.probe = clk_mt8195_apmixed_probe,
-	.remove_new = clk_mt8195_apmixed_remove,
+	.remove = clk_mt8195_apmixed_remove,
 	.driver = {
 		.name = "clk-mt8195-apmixed",
 		.of_match_table = of_match_clk_mt8195_apmixed,
diff --git a/drivers/clk/mediatek/clk-mt8195-apusys_pll.c b/drivers/clk/mediatek/clk-mt8195-apusys_pll.c
index b1b562e44cb4..8b45a3fad02f 100644
--- a/drivers/clk/mediatek/clk-mt8195-apusys_pll.c
+++ b/drivers/clk/mediatek/clk-mt8195-apusys_pll.c
@@ -103,7 +103,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8195_apusys_pll);
 
 static struct platform_driver clk_mt8195_apusys_pll_drv = {
 	.probe = clk_mt8195_apusys_pll_probe,
-	.remove_new = clk_mt8195_apusys_pll_remove,
+	.remove = clk_mt8195_apusys_pll_remove,
 	.driver = {
 		.name = "clk-mt8195-apusys_pll",
 		.of_match_table = of_match_clk_mt8195_apusys_pll,
diff --git a/drivers/clk/mediatek/clk-mt8195-cam.c b/drivers/clk/mediatek/clk-mt8195-cam.c
index 7c8f77817616..02cb20c2948b 100644
--- a/drivers/clk/mediatek/clk-mt8195-cam.c
+++ b/drivers/clk/mediatek/clk-mt8195-cam.c
@@ -135,7 +135,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8195_cam);
 
 static struct platform_driver clk_mt8195_cam_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt8195-cam",
 		.of_match_table = of_match_clk_mt8195_cam,
diff --git a/drivers/clk/mediatek/clk-mt8195-ccu.c b/drivers/clk/mediatek/clk-mt8195-ccu.c
index f78afd7b6ade..22cd1cb070f1 100644
--- a/drivers/clk/mediatek/clk-mt8195-ccu.c
+++ b/drivers/clk/mediatek/clk-mt8195-ccu.c
@@ -43,7 +43,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8195_ccu);
 
 static struct platform_driver clk_mt8195_ccu_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt8195-ccu",
 		.of_match_table = of_match_clk_mt8195_ccu,
diff --git a/drivers/clk/mediatek/clk-mt8195-img.c b/drivers/clk/mediatek/clk-mt8195-img.c
index a59c082ef522..11beba4b2ac2 100644
--- a/drivers/clk/mediatek/clk-mt8195-img.c
+++ b/drivers/clk/mediatek/clk-mt8195-img.c
@@ -89,7 +89,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8195_img);
 
 static struct platform_driver clk_mt8195_img_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt8195-img",
 		.of_match_table = of_match_clk_mt8195_img,
diff --git a/drivers/clk/mediatek/clk-mt8195-imp_iic_wrap.c b/drivers/clk/mediatek/clk-mt8195-imp_iic_wrap.c
index 54557f1b0681..8711b18b1576 100644
--- a/drivers/clk/mediatek/clk-mt8195-imp_iic_wrap.c
+++ b/drivers/clk/mediatek/clk-mt8195-imp_iic_wrap.c
@@ -59,7 +59,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8195_imp_iic_wrap);
 
 static struct platform_driver clk_mt8195_imp_iic_wrap_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt8195-imp_iic_wrap",
 		.of_match_table = of_match_clk_mt8195_imp_iic_wrap,
diff --git a/drivers/clk/mediatek/clk-mt8195-infra_ao.c b/drivers/clk/mediatek/clk-mt8195-infra_ao.c
index 165fe92c6f61..bb648a88e43a 100644
--- a/drivers/clk/mediatek/clk-mt8195-infra_ao.c
+++ b/drivers/clk/mediatek/clk-mt8195-infra_ao.c
@@ -233,7 +233,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8195_infra_ao);
 
 static struct platform_driver clk_mt8195_infra_ao_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt8195-infra_ao",
 		.of_match_table = of_match_clk_mt8195_infra_ao,
diff --git a/drivers/clk/mediatek/clk-mt8195-ipe.c b/drivers/clk/mediatek/clk-mt8195-ipe.c
index 38a23d88370b..b1af00348a86 100644
--- a/drivers/clk/mediatek/clk-mt8195-ipe.c
+++ b/drivers/clk/mediatek/clk-mt8195-ipe.c
@@ -44,7 +44,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8195_ipe);
 
 static struct platform_driver clk_mt8195_ipe_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt8195-ipe",
 		.of_match_table = of_match_clk_mt8195_ipe,
diff --git a/drivers/clk/mediatek/clk-mt8195-mfg.c b/drivers/clk/mediatek/clk-mt8195-mfg.c
index e19968eeb346..07c358db1af9 100644
--- a/drivers/clk/mediatek/clk-mt8195-mfg.c
+++ b/drivers/clk/mediatek/clk-mt8195-mfg.c
@@ -42,7 +42,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8195_mfg);
 
 static struct platform_driver clk_mt8195_mfg_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt8195-mfg",
 		.of_match_table = of_match_clk_mt8195_mfg,
diff --git a/drivers/clk/mediatek/clk-mt8195-peri_ao.c b/drivers/clk/mediatek/clk-mt8195-peri_ao.c
index fc341030f10b..b743eb60a30b 100644
--- a/drivers/clk/mediatek/clk-mt8195-peri_ao.c
+++ b/drivers/clk/mediatek/clk-mt8195-peri_ao.c
@@ -55,7 +55,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8195_peri_ao);
 
 static struct platform_driver clk_mt8195_peri_ao_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt8195-peri_ao",
 		.of_match_table = of_match_clk_mt8195_peri_ao,
diff --git a/drivers/clk/mediatek/clk-mt8195-scp_adsp.c b/drivers/clk/mediatek/clk-mt8195-scp_adsp.c
index 1f37bde97d90..bc73fccd0515 100644
--- a/drivers/clk/mediatek/clk-mt8195-scp_adsp.c
+++ b/drivers/clk/mediatek/clk-mt8195-scp_adsp.c
@@ -40,7 +40,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8195_scp_adsp);
 
 static struct platform_driver clk_mt8195_scp_adsp_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt8195-scp_adsp",
 		.of_match_table = of_match_clk_mt8195_scp_adsp,
diff --git a/drivers/clk/mediatek/clk-mt8195-topckgen.c b/drivers/clk/mediatek/clk-mt8195-topckgen.c
index 704498c40349..b1f44b873354 100644
--- a/drivers/clk/mediatek/clk-mt8195-topckgen.c
+++ b/drivers/clk/mediatek/clk-mt8195-topckgen.c
@@ -1354,7 +1354,7 @@ static void clk_mt8195_topck_remove(struct platform_device *pdev)
 
 static struct platform_driver clk_mt8195_topck_drv = {
 	.probe = clk_mt8195_topck_probe,
-	.remove_new = clk_mt8195_topck_remove,
+	.remove = clk_mt8195_topck_remove,
 	.driver = {
 		.name = "clk-mt8195-topck",
 		.of_match_table = of_match_clk_mt8195_topck,
diff --git a/drivers/clk/mediatek/clk-mt8195-vdec.c b/drivers/clk/mediatek/clk-mt8195-vdec.c
index 9e4cc1a82cbe..0bad706047c9 100644
--- a/drivers/clk/mediatek/clk-mt8195-vdec.c
+++ b/drivers/clk/mediatek/clk-mt8195-vdec.c
@@ -97,7 +97,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8195_vdec);
 
 static struct platform_driver clk_mt8195_vdec_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt8195-vdec",
 		.of_match_table = of_match_clk_mt8195_vdec,
diff --git a/drivers/clk/mediatek/clk-mt8195-vdo0.c b/drivers/clk/mediatek/clk-mt8195-vdo0.c
index 6e9c3ef19502..581d99f8c254 100644
--- a/drivers/clk/mediatek/clk-mt8195-vdo0.c
+++ b/drivers/clk/mediatek/clk-mt8195-vdo0.c
@@ -106,7 +106,7 @@ MODULE_DEVICE_TABLE(platform, clk_mt8195_vdo0_id_table);
 
 static struct platform_driver clk_mt8195_vdo0_drv = {
 	.probe = mtk_clk_pdev_probe,
-	.remove_new = mtk_clk_pdev_remove,
+	.remove = mtk_clk_pdev_remove,
 	.driver = {
 		.name = "clk-mt8195-vdo0",
 	},
diff --git a/drivers/clk/mediatek/clk-mt8195-vdo1.c b/drivers/clk/mediatek/clk-mt8195-vdo1.c
index 422e5729386c..7f8b1a8967bd 100644
--- a/drivers/clk/mediatek/clk-mt8195-vdo1.c
+++ b/drivers/clk/mediatek/clk-mt8195-vdo1.c
@@ -133,7 +133,7 @@ MODULE_DEVICE_TABLE(platform, clk_mt8195_vdo1_id_table);
 
 static struct platform_driver clk_mt8195_vdo1_drv = {
 	.probe = mtk_clk_pdev_probe,
-	.remove_new = mtk_clk_pdev_remove,
+	.remove = mtk_clk_pdev_remove,
 	.driver = {
 		.name = "clk-mt8195-vdo1",
 	},
diff --git a/drivers/clk/mediatek/clk-mt8195-venc.c b/drivers/clk/mediatek/clk-mt8195-venc.c
index db7a6ce97ed0..3b52ff025d5e 100644
--- a/drivers/clk/mediatek/clk-mt8195-venc.c
+++ b/drivers/clk/mediatek/clk-mt8195-venc.c
@@ -62,7 +62,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8195_venc);
 
 static struct platform_driver clk_mt8195_venc_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt8195-venc",
 		.of_match_table = of_match_clk_mt8195_venc,
diff --git a/drivers/clk/mediatek/clk-mt8195-vpp0.c b/drivers/clk/mediatek/clk-mt8195-vpp0.c
index 77d9aaf47a25..0e3e1dd7977c 100644
--- a/drivers/clk/mediatek/clk-mt8195-vpp0.c
+++ b/drivers/clk/mediatek/clk-mt8195-vpp0.c
@@ -99,7 +99,7 @@ MODULE_DEVICE_TABLE(platform, clk_mt8195_vpp0_id_table);
 
 static struct platform_driver clk_mt8195_vpp0_drv = {
 	.probe = mtk_clk_pdev_probe,
-	.remove_new = mtk_clk_pdev_remove,
+	.remove = mtk_clk_pdev_remove,
 	.driver = {
 		.name = "clk-mt8195-vpp0",
 	},
diff --git a/drivers/clk/mediatek/clk-mt8195-vpp1.c b/drivers/clk/mediatek/clk-mt8195-vpp1.c
index 18ca8f1d9538..fb7b7aef0bba 100644
--- a/drivers/clk/mediatek/clk-mt8195-vpp1.c
+++ b/drivers/clk/mediatek/clk-mt8195-vpp1.c
@@ -97,7 +97,7 @@ MODULE_DEVICE_TABLE(platform, clk_mt8195_vpp1_id_table);
 
 static struct platform_driver clk_mt8195_vpp1_drv = {
 	.probe = mtk_clk_pdev_probe,
-	.remove_new = mtk_clk_pdev_remove,
+	.remove = mtk_clk_pdev_remove,
 	.driver = {
 		.name = "clk-mt8195-vpp1",
 	},
diff --git a/drivers/clk/mediatek/clk-mt8195-wpe.c b/drivers/clk/mediatek/clk-mt8195-wpe.c
index 9c45a2fed0ce..315b93bbfcdc 100644
--- a/drivers/clk/mediatek/clk-mt8195-wpe.c
+++ b/drivers/clk/mediatek/clk-mt8195-wpe.c
@@ -136,7 +136,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8195_wpe);
 
 static struct platform_driver clk_mt8195_wpe_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt8195-wpe",
 		.of_match_table = of_match_clk_mt8195_wpe,
diff --git a/drivers/clk/mediatek/clk-mt8365-apu.c b/drivers/clk/mediatek/clk-mt8365-apu.c
index 934060e6d9e9..2583c4704ffa 100644
--- a/drivers/clk/mediatek/clk-mt8365-apu.c
+++ b/drivers/clk/mediatek/clk-mt8365-apu.c
@@ -46,7 +46,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8365_apu);
 
 static struct platform_driver clk_mt8365_apu_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt8365-apu",
 		.of_match_table = of_match_clk_mt8365_apu,
diff --git a/drivers/clk/mediatek/clk-mt8365-cam.c b/drivers/clk/mediatek/clk-mt8365-cam.c
index c8fe5f5bb06c..89d2bd50263b 100644
--- a/drivers/clk/mediatek/clk-mt8365-cam.c
+++ b/drivers/clk/mediatek/clk-mt8365-cam.c
@@ -48,7 +48,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8365_cam);
 
 static struct platform_driver clk_mt8365_cam_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt8365-cam",
 		.of_match_table = of_match_clk_mt8365_cam,
diff --git a/drivers/clk/mediatek/clk-mt8365-mfg.c b/drivers/clk/mediatek/clk-mt8365-mfg.c
index 5355f725363d..41bcd389119c 100644
--- a/drivers/clk/mediatek/clk-mt8365-mfg.c
+++ b/drivers/clk/mediatek/clk-mt8365-mfg.c
@@ -54,7 +54,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8365_mfg);
 
 static struct platform_driver clk_mt8365_mfg_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt8365-mfg",
 		.of_match_table = of_match_clk_mt8365_mfg,
diff --git a/drivers/clk/mediatek/clk-mt8365-mm.c b/drivers/clk/mediatek/clk-mt8365-mm.c
index 8201949bfdae..56fb2a43ecd0 100644
--- a/drivers/clk/mediatek/clk-mt8365-mm.c
+++ b/drivers/clk/mediatek/clk-mt8365-mm.c
@@ -85,7 +85,7 @@ MODULE_DEVICE_TABLE(platform, clk_mt8365_mm_id_table);
 
 static struct platform_driver clk_mt8365_mm_drv = {
 	.probe = mtk_clk_pdev_probe,
-	.remove_new = mtk_clk_pdev_remove,
+	.remove = mtk_clk_pdev_remove,
 	.driver = {
 		.name = "clk-mt8365-mm",
 	},
diff --git a/drivers/clk/mediatek/clk-mt8365-vdec.c b/drivers/clk/mediatek/clk-mt8365-vdec.c
index 1be0b3faa2c3..f5d0518bc2e0 100644
--- a/drivers/clk/mediatek/clk-mt8365-vdec.c
+++ b/drivers/clk/mediatek/clk-mt8365-vdec.c
@@ -54,7 +54,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8365_vdec);
 
 static struct platform_driver clk_mt8365_vdec_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt8365-vdec",
 		.of_match_table = of_match_clk_mt8365_vdec,
diff --git a/drivers/clk/mediatek/clk-mt8365-venc.c b/drivers/clk/mediatek/clk-mt8365-venc.c
index 4228ddec5657..35abd908537c 100644
--- a/drivers/clk/mediatek/clk-mt8365-venc.c
+++ b/drivers/clk/mediatek/clk-mt8365-venc.c
@@ -43,7 +43,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8365_venc);
 
 static struct platform_driver clk_mt8365_venc_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt8365-venc",
 		.of_match_table = of_match_clk_mt8365_venc,
diff --git a/drivers/clk/mediatek/clk-mt8365.c b/drivers/clk/mediatek/clk-mt8365.c
index 485b525b8acd..e7952121112e 100644
--- a/drivers/clk/mediatek/clk-mt8365.c
+++ b/drivers/clk/mediatek/clk-mt8365.c
@@ -809,7 +809,7 @@ static struct platform_driver clk_mt8365_drv = {
 		.of_match_table = of_match_clk_mt8365,
 	},
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 };
 module_platform_driver(clk_mt8365_drv);
 
diff --git a/drivers/clk/mediatek/clk-mt8516-aud.c b/drivers/clk/mediatek/clk-mt8516-aud.c
index 53e1866fb8e2..6227635fd5a1 100644
--- a/drivers/clk/mediatek/clk-mt8516-aud.c
+++ b/drivers/clk/mediatek/clk-mt8516-aud.c
@@ -53,7 +53,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8516_aud);
 
 static struct platform_driver clk_mt8516_aud_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt8516-aud",
 		.of_match_table = of_match_clk_mt8516_aud,
diff --git a/drivers/clk/mediatek/clk-mt8516.c b/drivers/clk/mediatek/clk-mt8516.c
index b8ae837c59dc..21eb052b0a53 100644
--- a/drivers/clk/mediatek/clk-mt8516.c
+++ b/drivers/clk/mediatek/clk-mt8516.c
@@ -669,7 +669,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8516);
 
 static struct platform_driver clk_mt8516_drv = {
 	.probe = mtk_clk_simple_probe,
-	.remove_new = mtk_clk_simple_remove,
+	.remove = mtk_clk_simple_remove,
 	.driver = {
 		.name = "clk-mt8516",
 		.of_match_table = of_match_clk_mt8516,
diff --git a/drivers/clk/mmp/clk-audio.c b/drivers/clk/mmp/clk-audio.c
index ae521aaf8cdc..88d798d510cd 100644
--- a/drivers/clk/mmp/clk-audio.c
+++ b/drivers/clk/mmp/clk-audio.c
@@ -436,7 +436,7 @@ static struct platform_driver mmp2_audio_clk_driver = {
 		.pm = &mmp2_audio_clk_pm_ops,
 	},
 	.probe = mmp2_audio_clk_probe,
-	.remove_new = mmp2_audio_clk_remove,
+	.remove = mmp2_audio_clk_remove,
 };
 module_platform_driver(mmp2_audio_clk_driver);
 
diff --git a/drivers/clk/mvebu/armada-37xx-periph.c b/drivers/clk/mvebu/armada-37xx-periph.c
index 8701a58a5804..13906e31bef8 100644
--- a/drivers/clk/mvebu/armada-37xx-periph.c
+++ b/drivers/clk/mvebu/armada-37xx-periph.c
@@ -792,7 +792,7 @@ static void armada_3700_periph_clock_remove(struct platform_device *pdev)
 
 static struct platform_driver armada_3700_periph_clock_driver = {
 	.probe = armada_3700_periph_clock_probe,
-	.remove_new = armada_3700_periph_clock_remove,
+	.remove = armada_3700_periph_clock_remove,
 	.driver		= {
 		.name	= "marvell-armada-3700-periph-clock",
 		.of_match_table = armada_3700_periph_clock_of_match,
diff --git a/drivers/clk/mvebu/armada-37xx-tbg.c b/drivers/clk/mvebu/armada-37xx-tbg.c
index e94c336e0f1c..1a16f9c0b1d8 100644
--- a/drivers/clk/mvebu/armada-37xx-tbg.c
+++ b/drivers/clk/mvebu/armada-37xx-tbg.c
@@ -141,7 +141,7 @@ static const struct of_device_id armada_3700_tbg_clock_of_match[] = {
 
 static struct platform_driver armada_3700_tbg_clock_driver = {
 	.probe = armada_3700_tbg_clock_probe,
-	.remove_new = armada_3700_tbg_clock_remove,
+	.remove = armada_3700_tbg_clock_remove,
 	.driver		= {
 		.name	= "marvell-armada-3700-tbg-clock",
 		.of_match_table = armada_3700_tbg_clock_of_match,
diff --git a/drivers/clk/mvebu/armada-37xx-xtal.c b/drivers/clk/mvebu/armada-37xx-xtal.c
index 0e2e7d00ae11..ca88e5e78b06 100644
--- a/drivers/clk/mvebu/armada-37xx-xtal.c
+++ b/drivers/clk/mvebu/armada-37xx-xtal.c
@@ -77,7 +77,7 @@ static const struct of_device_id armada_3700_xtal_clock_of_match[] = {
 
 static struct platform_driver armada_3700_xtal_clock_driver = {
 	.probe = armada_3700_xtal_clock_probe,
-	.remove_new = armada_3700_xtal_clock_remove,
+	.remove = armada_3700_xtal_clock_remove,
 	.driver		= {
 		.name	= "marvell-armada-3700-xtal-clock",
 		.of_match_table = armada_3700_xtal_clock_of_match,
diff --git a/drivers/clk/qcom/apcs-msm8916.c b/drivers/clk/qcom/apcs-msm8916.c
index ce57b333ec99..ef31386831eb 100644
--- a/drivers/clk/qcom/apcs-msm8916.c
+++ b/drivers/clk/qcom/apcs-msm8916.c
@@ -128,7 +128,7 @@ static void qcom_apcs_msm8916_clk_remove(struct platform_device *pdev)
 
 static struct platform_driver qcom_apcs_msm8916_clk_driver = {
 	.probe = qcom_apcs_msm8916_clk_probe,
-	.remove_new = qcom_apcs_msm8916_clk_remove,
+	.remove = qcom_apcs_msm8916_clk_remove,
 	.driver = {
 		.name = "qcom-apcs-msm8916-clk",
 	},
diff --git a/drivers/clk/qcom/apcs-sdx55.c b/drivers/clk/qcom/apcs-sdx55.c
index d644e6e1f8b7..76ece6c4a969 100644
--- a/drivers/clk/qcom/apcs-sdx55.c
+++ b/drivers/clk/qcom/apcs-sdx55.c
@@ -131,7 +131,7 @@ static void qcom_apcs_sdx55_clk_remove(struct platform_device *pdev)
 
 static struct platform_driver qcom_apcs_sdx55_clk_driver = {
 	.probe = qcom_apcs_sdx55_clk_probe,
-	.remove_new = qcom_apcs_sdx55_clk_remove,
+	.remove = qcom_apcs_sdx55_clk_remove,
 	.driver = {
 		.name = "qcom-sdx55-acps-clk",
 	},
diff --git a/drivers/clk/qcom/clk-cbf-8996.c b/drivers/clk/qcom/clk-cbf-8996.c
index f5fd1ff9c6c9..ce4efcd995ea 100644
--- a/drivers/clk/qcom/clk-cbf-8996.c
+++ b/drivers/clk/qcom/clk-cbf-8996.c
@@ -346,7 +346,7 @@ MODULE_DEVICE_TABLE(of, qcom_msm8996_cbf_match_table);
 
 static struct platform_driver qcom_msm8996_cbf_driver = {
 	.probe = qcom_msm8996_cbf_probe,
-	.remove_new = qcom_msm8996_cbf_remove,
+	.remove = qcom_msm8996_cbf_remove,
 	.driver = {
 		.name = "qcom-msm8996-cbf",
 		.of_match_table = qcom_msm8996_cbf_match_table,
diff --git a/drivers/clk/qcom/gcc-msm8960.c b/drivers/clk/qcom/gcc-msm8960.c
index a82a8212e322..9ddce11db6df 100644
--- a/drivers/clk/qcom/gcc-msm8960.c
+++ b/drivers/clk/qcom/gcc-msm8960.c
@@ -3761,7 +3761,7 @@ static void gcc_msm8960_remove(struct platform_device *pdev)
 
 static struct platform_driver gcc_msm8960_driver = {
 	.probe		= gcc_msm8960_probe,
-	.remove_new	= gcc_msm8960_remove,
+	.remove		= gcc_msm8960_remove,
 	.driver		= {
 		.name	= "gcc-msm8960",
 		.of_match_table = gcc_msm8960_match_table,
diff --git a/drivers/clk/renesas/rcar-usb2-clock-sel.c b/drivers/clk/renesas/rcar-usb2-clock-sel.c
index de4896cf5f40..421ae973ea8e 100644
--- a/drivers/clk/renesas/rcar-usb2-clock-sel.c
+++ b/drivers/clk/renesas/rcar-usb2-clock-sel.c
@@ -212,7 +212,7 @@ static struct platform_driver rcar_usb2_clock_sel_driver = {
 		.pm	= &rcar_usb2_clock_sel_pm_ops,
 	},
 	.probe		= rcar_usb2_clock_sel_probe,
-	.remove_new	= rcar_usb2_clock_sel_remove,
+	.remove		= rcar_usb2_clock_sel_remove,
 };
 builtin_platform_driver(rcar_usb2_clock_sel_driver);
 
diff --git a/drivers/clk/samsung/clk-exynos-audss.c b/drivers/clk/samsung/clk-exynos-audss.c
index e44b172d7255..abd49edcf707 100644
--- a/drivers/clk/samsung/clk-exynos-audss.c
+++ b/drivers/clk/samsung/clk-exynos-audss.c
@@ -292,7 +292,7 @@ static struct platform_driver exynos_audss_clk_driver = {
 		.pm = &exynos_audss_clk_pm_ops,
 	},
 	.probe = exynos_audss_clk_probe,
-	.remove_new = exynos_audss_clk_remove,
+	.remove = exynos_audss_clk_remove,
 };
 
 module_platform_driver(exynos_audss_clk_driver);
diff --git a/drivers/clk/samsung/clk-exynos-clkout.c b/drivers/clk/samsung/clk-exynos-clkout.c
index 89cf2000884f..2ef5748c139b 100644
--- a/drivers/clk/samsung/clk-exynos-clkout.c
+++ b/drivers/clk/samsung/clk-exynos-clkout.c
@@ -241,7 +241,7 @@ static struct platform_driver exynos_clkout_driver = {
 		.pm = &exynos_clkout_pm_ops,
 	},
 	.probe = exynos_clkout_probe,
-	.remove_new = exynos_clkout_remove,
+	.remove = exynos_clkout_remove,
 };
 module_platform_driver(exynos_clkout_driver);
 
diff --git a/drivers/clk/starfive/clk-starfive-jh7110-isp.c b/drivers/clk/starfive/clk-starfive-jh7110-isp.c
index d3c85421f948..8c4c3a958a9f 100644
--- a/drivers/clk/starfive/clk-starfive-jh7110-isp.c
+++ b/drivers/clk/starfive/clk-starfive-jh7110-isp.c
@@ -216,7 +216,7 @@ MODULE_DEVICE_TABLE(of, jh7110_ispcrg_match);
 
 static struct platform_driver jh7110_ispcrg_driver = {
 	.probe = jh7110_ispcrg_probe,
-	.remove_new = jh7110_ispcrg_remove,
+	.remove = jh7110_ispcrg_remove,
 	.driver = {
 		.name = "clk-starfive-jh7110-isp",
 		.of_match_table = jh7110_ispcrg_match,
diff --git a/drivers/clk/starfive/clk-starfive-jh7110-vout.c b/drivers/clk/starfive/clk-starfive-jh7110-vout.c
index aabd0484ac23..04eeed199087 100644
--- a/drivers/clk/starfive/clk-starfive-jh7110-vout.c
+++ b/drivers/clk/starfive/clk-starfive-jh7110-vout.c
@@ -223,7 +223,7 @@ MODULE_DEVICE_TABLE(of, jh7110_voutcrg_match);
 
 static struct platform_driver jh7110_voutcrg_driver = {
 	.probe = jh7110_voutcrg_probe,
-	.remove_new = jh7110_voutcrg_remove,
+	.remove = jh7110_voutcrg_remove,
 	.driver = {
 		.name = "clk-starfive-jh7110-vout",
 		.of_match_table = jh7110_voutcrg_match,
diff --git a/drivers/clk/stm32/clk-stm32mp1.c b/drivers/clk/stm32/clk-stm32mp1.c
index 7e2337297402..5fcc4c77c11f 100644
--- a/drivers/clk/stm32/clk-stm32mp1.c
+++ b/drivers/clk/stm32/clk-stm32mp1.c
@@ -2354,7 +2354,7 @@ static struct platform_driver stm32mp1_rcc_clocks_driver = {
 		.of_match_table = stm32mp1_match_data,
 	},
 	.probe = stm32mp1_rcc_clocks_probe,
-	.remove_new = stm32mp1_rcc_clocks_remove,
+	.remove = stm32mp1_rcc_clocks_remove,
 };
 
 static int __init stm32mp1_clocks_init(void)
diff --git a/drivers/clk/tegra/clk-tegra124-dfll-fcpu.c b/drivers/clk/tegra/clk-tegra124-dfll-fcpu.c
index a9be4b56b2b7..0251618b82c8 100644
--- a/drivers/clk/tegra/clk-tegra124-dfll-fcpu.c
+++ b/drivers/clk/tegra/clk-tegra124-dfll-fcpu.c
@@ -635,7 +635,7 @@ static const struct dev_pm_ops tegra124_dfll_pm_ops = {
 
 static struct platform_driver tegra124_dfll_fcpu_driver = {
 	.probe = tegra124_dfll_fcpu_probe,
-	.remove_new = tegra124_dfll_fcpu_remove,
+	.remove = tegra124_dfll_fcpu_remove,
 	.driver = {
 		.name = "tegra124-dfll",
 		.of_match_table = tegra124_dfll_fcpu_of_match,
diff --git a/drivers/clk/ti/adpll.c b/drivers/clk/ti/adpll.c
index 6121020b4b38..e305fcbac647 100644
--- a/drivers/clk/ti/adpll.c
+++ b/drivers/clk/ti/adpll.c
@@ -934,7 +934,7 @@ static struct platform_driver ti_adpll_driver = {
 		.of_match_table = ti_adpll_match,
 	},
 	.probe = ti_adpll_probe,
-	.remove_new = ti_adpll_remove,
+	.remove = ti_adpll_remove,
 };
 
 static int __init ti_adpll_init(void)
diff --git a/drivers/clk/x86/clk-fch.c b/drivers/clk/x86/clk-fch.c
index aed7d22fae63..cf5cd3ad4647 100644
--- a/drivers/clk/x86/clk-fch.c
+++ b/drivers/clk/x86/clk-fch.c
@@ -115,6 +115,6 @@ static struct platform_driver fch_clk_driver = {
 		.suppress_bind_attrs = true,
 	},
 	.probe = fch_clk_probe,
-	.remove_new = fch_clk_remove,
+	.remove = fch_clk_remove,
 };
 builtin_platform_driver(fch_clk_driver);
diff --git a/drivers/clk/x86/clk-pmc-atom.c b/drivers/clk/x86/clk-pmc-atom.c
index 5ec9255e33fa..99291ba65da7 100644
--- a/drivers/clk/x86/clk-pmc-atom.c
+++ b/drivers/clk/x86/clk-pmc-atom.c
@@ -373,6 +373,6 @@ static struct platform_driver plt_clk_driver = {
 		.name = "clk-pmc-atom",
 	},
 	.probe = plt_clk_probe,
-	.remove_new = plt_clk_remove,
+	.remove = plt_clk_remove,
 };
 builtin_platform_driver(plt_clk_driver);
diff --git a/drivers/clk/xilinx/clk-xlnx-clock-wizard.c b/drivers/clk/xilinx/clk-xlnx-clock-wizard.c
index 19eb3fb7ae31..7a0269bdfbb3 100644
--- a/drivers/clk/xilinx/clk-xlnx-clock-wizard.c
+++ b/drivers/clk/xilinx/clk-xlnx-clock-wizard.c
@@ -1257,7 +1257,7 @@ static struct platform_driver clk_wzrd_driver = {
 		.pm = &clk_wzrd_dev_pm_ops,
 	},
 	.probe = clk_wzrd_probe,
-	.remove_new = clk_wzrd_remove,
+	.remove = clk_wzrd_remove,
 };
 module_platform_driver(clk_wzrd_driver);
 
diff --git a/drivers/clk/xilinx/xlnx_vcu.c b/drivers/clk/xilinx/xlnx_vcu.c
index d983fab12756..81501b48412e 100644
--- a/drivers/clk/xilinx/xlnx_vcu.c
+++ b/drivers/clk/xilinx/xlnx_vcu.c
@@ -729,7 +729,7 @@ static struct platform_driver xvcu_driver = {
 		.of_match_table = xvcu_of_id_table,
 	},
 	.probe                  = xvcu_probe,
-	.remove_new             = xvcu_remove,
+	.remove                 = xvcu_remove,
 };
 
 module_platform_driver(xvcu_driver);

base-commit: 100cc857359b5d731407d1038f7e76cd0e871d94
-- 
2.45.2



From quic_nguyenb at quicinc.com  Mon Sep  9 07:51:35 2024
From: quic_nguyenb at quicinc.com (Bao D. Nguyen)
Date: Mon, 9 Sep 2024 07:51:35 -0700
Subject: [PATCH v3 1/2] ufs: core: fix the issue of ICU failure
In-Reply-To: <20240909082100.24019-2-peter.wang@mediatek.com>
References: <20240909082100.24019-1-peter.wang@mediatek.com>
 <20240909082100.24019-2-peter.wang@mediatek.com>
Message-ID: <f133990e-548e-1d57-ccfd-b130a642fc58@quicinc.com>

On 9/9/2024 1:20 AM, peter.wang at mediatek.com wrote:
> From: Peter Wang <peter.wang at mediatek.com>
> 
> When setting the ICU bit without using read-modify-write,
> SQRTCy will restart SQ again and receive an RTC return
> error code 2 (Failure - SQ not stopped).
> 
> Additionally, the error log has been modified so that
> this type of error can be observed.
> 
> Fixes: ab248643d3d6 ("scsi: ufs: core: Add error handling for MCQ mode")
> Cc: stable at vger.kernel.org
> Signed-off-by: Peter Wang <peter.wang at mediatek.com>
> ---

Reviewed-by: Bao D. Nguyen <quic_nguyenb at quicinc.com>


From u.kleine-koenig at baylibre.com  Mon Sep  9 08:12:30 2024
From: u.kleine-koenig at baylibre.com (=?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?=)
Date: Mon,  9 Sep 2024 17:12:30 +0200
Subject: [PATCH] ASoC: Switch back to struct platform_driver::remove()
Message-ID: <20240909151230.909818-2-u.kleine-koenig@baylibre.com>

After commit 0edb555a65d1 ("platform: Make platform_driver::remove()
return void") .remove() is (again) the right callback to implement for
platform drivers.

Convert all drivers below sound/soc to use .remove(), with the eventual
goal to drop struct platform_driver::remove_new(). As .remove() and
.remove_new() have the same prototypes, conversion is done by just
changing the structure member name in the driver initializer.

Signed-off-by: Uwe Kleine-K?nig <u.kleine-koenig at baylibre.com>
---
Hello,

this is a single patch for all of sound/soc. If you prefer, I can split
it. If so, just tell how (per subdir? per driver? somehow else?) Also I trimmed
the list of recipents compared to what scripts/get_maintainer.sh emits. I
dropped all the maintainers for the individual drivers and only kept the list.
Otherwise the set of recipents is too huge.

Best regards
Uwe

 sound/soc/adi/axi-i2s.c                             | 2 +-
 sound/soc/adi/axi-spdif.c                           | 2 +-
 sound/soc/amd/acp-pcm-dma.c                         | 2 +-
 sound/soc/amd/acp/acp-rembrandt.c                   | 2 +-
 sound/soc/amd/acp/acp-renoir.c                      | 2 +-
 sound/soc/amd/acp/acp-sdw-sof-mach.c                | 2 +-
 sound/soc/amd/acp/acp63.c                           | 2 +-
 sound/soc/amd/acp/acp70.c                           | 2 +-
 sound/soc/amd/ps/ps-pdm-dma.c                       | 2 +-
 sound/soc/amd/ps/ps-sdw-dma.c                       | 2 +-
 sound/soc/amd/raven/acp3x-pcm-dma.c                 | 2 +-
 sound/soc/amd/renoir/acp3x-pdm-dma.c                | 2 +-
 sound/soc/amd/vangogh/acp5x-pcm-dma.c               | 2 +-
 sound/soc/amd/yc/acp6x-pdm-dma.c                    | 2 +-
 sound/soc/apple/mca.c                               | 2 +-
 sound/soc/atmel/atmel-i2s.c                         | 2 +-
 sound/soc/atmel/atmel_wm8904.c                      | 2 +-
 sound/soc/atmel/mchp-i2s-mcc.c                      | 2 +-
 sound/soc/atmel/mchp-pdmc.c                         | 2 +-
 sound/soc/atmel/mchp-spdifrx.c                      | 2 +-
 sound/soc/atmel/mchp-spdiftx.c                      | 2 +-
 sound/soc/atmel/sam9g20_wm8731.c                    | 2 +-
 sound/soc/atmel/sam9x5_wm8731.c                     | 2 +-
 sound/soc/atmel/tse850-pcm5142.c                    | 2 +-
 sound/soc/au1x/ac97c.c                              | 2 +-
 sound/soc/au1x/i2sc.c                               | 2 +-
 sound/soc/au1x/psc-ac97.c                           | 2 +-
 sound/soc/au1x/psc-i2s.c                            | 2 +-
 sound/soc/bcm/bcm63xx-i2s-whistler.c                | 2 +-
 sound/soc/bcm/cygnus-ssp.c                          | 2 +-
 sound/soc/cirrus/edb93xx.c                          | 2 +-
 sound/soc/cirrus/ep93xx-i2s.c                       | 2 +-
 sound/soc/codecs/cs42l43.c                          | 2 +-
 sound/soc/codecs/cs47l15.c                          | 2 +-
 sound/soc/codecs/cs47l24.c                          | 2 +-
 sound/soc/codecs/cs47l35.c                          | 2 +-
 sound/soc/codecs/cs47l85.c                          | 2 +-
 sound/soc/codecs/cs47l90.c                          | 2 +-
 sound/soc/codecs/cs47l92.c                          | 2 +-
 sound/soc/codecs/inno_rk3036.c                      | 2 +-
 sound/soc/codecs/lpass-rx-macro.c                   | 2 +-
 sound/soc/codecs/lpass-tx-macro.c                   | 2 +-
 sound/soc/codecs/lpass-va-macro.c                   | 2 +-
 sound/soc/codecs/lpass-wsa-macro.c                  | 2 +-
 sound/soc/codecs/msm8916-wcd-digital.c              | 2 +-
 sound/soc/codecs/rk817_codec.c                      | 2 +-
 sound/soc/codecs/wcd937x.c                          | 2 +-
 sound/soc/codecs/wcd938x.c                          | 2 +-
 sound/soc/codecs/wcd939x.c                          | 2 +-
 sound/soc/codecs/wm5102.c                           | 2 +-
 sound/soc/codecs/wm5110.c                           | 2 +-
 sound/soc/codecs/wm8994.c                           | 2 +-
 sound/soc/codecs/wm8997.c                           | 2 +-
 sound/soc/codecs/wm8998.c                           | 2 +-
 sound/soc/dwc/dwc-i2s.c                             | 2 +-
 sound/soc/fsl/fsl_asrc.c                            | 2 +-
 sound/soc/fsl/fsl_aud2htx.c                         | 2 +-
 sound/soc/fsl/fsl_audmix.c                          | 2 +-
 sound/soc/fsl/fsl_dma.c                             | 2 +-
 sound/soc/fsl/fsl_easrc.c                           | 2 +-
 sound/soc/fsl/fsl_esai.c                            | 2 +-
 sound/soc/fsl/fsl_micfil.c                          | 2 +-
 sound/soc/fsl/fsl_mqs.c                             | 2 +-
 sound/soc/fsl/fsl_rpmsg.c                           | 2 +-
 sound/soc/fsl/fsl_sai.c                             | 2 +-
 sound/soc/fsl/fsl_spdif.c                           | 2 +-
 sound/soc/fsl/fsl_ssi.c                             | 2 +-
 sound/soc/fsl/fsl_xcvr.c                            | 2 +-
 sound/soc/fsl/imx-audmux.c                          | 2 +-
 sound/soc/fsl/imx-pcm-rpmsg.c                       | 2 +-
 sound/soc/fsl/imx-sgtl5000.c                        | 2 +-
 sound/soc/fsl/mpc5200_psc_ac97.c                    | 2 +-
 sound/soc/fsl/mpc5200_psc_i2s.c                     | 2 +-
 sound/soc/fsl/p1022_ds.c                            | 2 +-
 sound/soc/fsl/p1022_rdk.c                           | 2 +-
 sound/soc/fsl/pcm030-audio-fabric.c                 | 2 +-
 sound/soc/generic/audio-graph-card.c                | 2 +-
 sound/soc/generic/audio-graph-card2-custom-sample.c | 2 +-
 sound/soc/generic/audio-graph-card2.c               | 2 +-
 sound/soc/generic/simple-card.c                     | 2 +-
 sound/soc/generic/test-component.c                  | 2 +-
 sound/soc/img/img-i2s-in.c                          | 2 +-
 sound/soc/img/img-i2s-out.c                         | 2 +-
 sound/soc/img/img-parallel-out.c                    | 2 +-
 sound/soc/img/img-spdif-in.c                        | 2 +-
 sound/soc/img/img-spdif-out.c                       | 2 +-
 sound/soc/img/pistachio-internal-dac.c              | 2 +-
 sound/soc/intel/atom/sst-mfld-platform-pcm.c        | 2 +-
 sound/soc/intel/atom/sst/sst_acpi.c                 | 2 +-
 sound/soc/intel/boards/bytcht_es8316.c              | 2 +-
 sound/soc/intel/boards/bytcr_rt5640.c               | 2 +-
 sound/soc/intel/boards/bytcr_rt5651.c               | 2 +-
 sound/soc/intel/boards/bytcr_wm5102.c               | 2 +-
 sound/soc/intel/boards/cht_bsw_max98090_ti.c        | 2 +-
 sound/soc/intel/boards/sof_es8336.c                 | 2 +-
 sound/soc/intel/boards/sof_pcm512x.c                | 2 +-
 sound/soc/intel/boards/sof_sdw.c                    | 2 +-
 sound/soc/intel/boards/sof_wm8804.c                 | 2 +-
 sound/soc/intel/catpt/device.c                      | 2 +-
 sound/soc/kirkwood/kirkwood-i2s.c                   | 2 +-
 sound/soc/mediatek/common/mtk-btcvsd.c              | 2 +-
 sound/soc/mediatek/mt2701/mt2701-afe-pcm.c          | 2 +-
 sound/soc/mediatek/mt6797/mt6797-afe-pcm.c          | 2 +-
 sound/soc/mediatek/mt7986/mt7986-afe-pcm.c          | 2 +-
 sound/soc/mediatek/mt8173/mt8173-afe-pcm.c          | 2 +-
 sound/soc/mediatek/mt8183/mt8183-afe-pcm.c          | 2 +-
 sound/soc/mediatek/mt8192/mt8192-afe-pcm.c          | 2 +-
 sound/soc/mediatek/mt8195/mt8195-afe-pcm.c          | 2 +-
 sound/soc/mediatek/mt8365/mt8365-afe-pcm.c          | 2 +-
 sound/soc/meson/aiu.c                               | 2 +-
 sound/soc/meson/axg-card.c                          | 2 +-
 sound/soc/meson/gx-card.c                           | 2 +-
 sound/soc/mxs/mxs-sgtl5000.c                        | 2 +-
 sound/soc/pxa/mmp-sspa.c                            | 2 +-
 sound/soc/pxa/pxa2xx-ac97.c                         | 2 +-
 sound/soc/qcom/lpass-apq8016.c                      | 2 +-
 sound/soc/qcom/lpass-ipq806x.c                      | 2 +-
 sound/soc/qcom/lpass-sc7180.c                       | 2 +-
 sound/soc/qcom/lpass-sc7280.c                       | 2 +-
 sound/soc/qcom/qdsp6/q6routing.c                    | 2 +-
 sound/soc/rockchip/rockchip_i2s.c                   | 2 +-
 sound/soc/rockchip/rockchip_i2s_tdm.c               | 2 +-
 sound/soc/rockchip/rockchip_pdm.c                   | 2 +-
 sound/soc/rockchip/rockchip_rt5645.c                | 2 +-
 sound/soc/rockchip/rockchip_spdif.c                 | 2 +-
 sound/soc/samsung/arndale.c                         | 2 +-
 sound/soc/samsung/i2s.c                             | 2 +-
 sound/soc/samsung/odroid.c                          | 2 +-
 sound/soc/samsung/pcm.c                             | 2 +-
 sound/soc/samsung/snow.c                            | 2 +-
 sound/soc/samsung/spdif.c                           | 2 +-
 sound/soc/sh/fsi.c                                  | 2 +-
 sound/soc/sh/hac.c                                  | 2 +-
 sound/soc/sh/rcar/core.c                            | 2 +-
 sound/soc/sh/rz-ssi.c                               | 2 +-
 sound/soc/sh/siu_dai.c                              | 2 +-
 sound/soc/sof/imx/imx8.c                            | 2 +-
 sound/soc/sof/imx/imx8m.c                           | 2 +-
 sound/soc/sof/imx/imx8ulp.c                         | 2 +-
 sound/soc/sof/intel/bdw.c                           | 2 +-
 sound/soc/sof/intel/byt.c                           | 2 +-
 sound/soc/sof/mediatek/mt8186/mt8186.c              | 2 +-
 sound/soc/sof/mediatek/mt8195/mt8195.c              | 2 +-
 sound/soc/sprd/sprd-mcdt.c                          | 2 +-
 sound/soc/starfive/jh7110_pwmdac.c                  | 2 +-
 sound/soc/starfive/jh7110_tdm.c                     | 2 +-
 sound/soc/stm/stm32_adfsdm.c                        | 2 +-
 sound/soc/stm/stm32_i2s.c                           | 2 +-
 sound/soc/stm/stm32_sai_sub.c                       | 2 +-
 sound/soc/stm/stm32_spdifrx.c                       | 2 +-
 sound/soc/sunxi/sun4i-codec.c                       | 2 +-
 sound/soc/sunxi/sun4i-i2s.c                         | 2 +-
 sound/soc/sunxi/sun4i-spdif.c                       | 2 +-
 sound/soc/sunxi/sun50i-dmic.c                       | 2 +-
 sound/soc/sunxi/sun8i-codec.c                       | 2 +-
 sound/soc/tegra/tegra186_asrc.c                     | 2 +-
 sound/soc/tegra/tegra186_dspk.c                     | 2 +-
 sound/soc/tegra/tegra20_ac97.c                      | 2 +-
 sound/soc/tegra/tegra20_i2s.c                       | 2 +-
 sound/soc/tegra/tegra210_admaif.c                   | 2 +-
 sound/soc/tegra/tegra210_adx.c                      | 2 +-
 sound/soc/tegra/tegra210_ahub.c                     | 2 +-
 sound/soc/tegra/tegra210_amx.c                      | 2 +-
 sound/soc/tegra/tegra210_dmic.c                     | 2 +-
 sound/soc/tegra/tegra210_i2s.c                      | 2 +-
 sound/soc/tegra/tegra210_mixer.c                    | 2 +-
 sound/soc/tegra/tegra210_mvc.c                      | 2 +-
 sound/soc/tegra/tegra210_ope.c                      | 2 +-
 sound/soc/tegra/tegra210_sfc.c                      | 2 +-
 sound/soc/tegra/tegra30_ahub.c                      | 2 +-
 sound/soc/tegra/tegra30_i2s.c                       | 2 +-
 sound/soc/tegra/tegra_audio_graph_card.c            | 2 +-
 sound/soc/ti/ams-delta.c                            | 2 +-
 sound/soc/ti/davinci-i2s.c                          | 2 +-
 sound/soc/ti/davinci-mcasp.c                        | 2 +-
 sound/soc/ti/omap-mcbsp.c                           | 2 +-
 sound/soc/uniphier/aio-ld11.c                       | 2 +-
 sound/soc/uniphier/aio-pxs2.c                       | 2 +-
 sound/soc/uniphier/evea.c                           | 2 +-
 sound/soc/ux500/mop500.c                            | 2 +-
 sound/soc/ux500/ux500_msp_dai.c                     | 2 +-
 sound/soc/xilinx/xlnx_formatter_pcm.c               | 2 +-
 sound/soc/xilinx/xlnx_spdif.c                       | 2 +-
 sound/soc/xtensa/xtfpga-i2s.c                       | 2 +-
 184 files changed, 184 insertions(+), 184 deletions(-)

diff --git a/sound/soc/adi/axi-i2s.c b/sound/soc/adi/axi-i2s.c
index 4107eddc9ca8..41f89384f8fd 100644
--- a/sound/soc/adi/axi-i2s.c
+++ b/sound/soc/adi/axi-i2s.c
@@ -293,7 +293,7 @@ static struct platform_driver axi_i2s_driver = {
 		.of_match_table = axi_i2s_of_match,
 	},
 	.probe = axi_i2s_probe,
-	.remove_new = axi_i2s_dev_remove,
+	.remove = axi_i2s_dev_remove,
 };
 module_platform_driver(axi_i2s_driver);
 
diff --git a/sound/soc/adi/axi-spdif.c b/sound/soc/adi/axi-spdif.c
index 10545bd99704..5581134201a3 100644
--- a/sound/soc/adi/axi-spdif.c
+++ b/sound/soc/adi/axi-spdif.c
@@ -258,7 +258,7 @@ static struct platform_driver axi_spdif_driver = {
 		.of_match_table = axi_spdif_of_match,
 	},
 	.probe = axi_spdif_probe,
-	.remove_new = axi_spdif_dev_remove,
+	.remove = axi_spdif_dev_remove,
 };
 module_platform_driver(axi_spdif_driver);
 
diff --git a/sound/soc/amd/acp-pcm-dma.c b/sound/soc/amd/acp-pcm-dma.c
index b857e2676fe8..897dde630022 100644
--- a/sound/soc/amd/acp-pcm-dma.c
+++ b/sound/soc/amd/acp-pcm-dma.c
@@ -1426,7 +1426,7 @@ static const struct dev_pm_ops acp_pm_ops = {
 
 static struct platform_driver acp_dma_driver = {
 	.probe = acp_audio_probe,
-	.remove_new = acp_audio_remove,
+	.remove = acp_audio_remove,
 	.driver = {
 		.name = DRV_NAME,
 		.pm = &acp_pm_ops,
diff --git a/sound/soc/amd/acp/acp-rembrandt.c b/sound/soc/amd/acp/acp-rembrandt.c
index e19981c7d65a..396434a45eea 100644
--- a/sound/soc/amd/acp/acp-rembrandt.c
+++ b/sound/soc/amd/acp/acp-rembrandt.c
@@ -295,7 +295,7 @@ static const struct dev_pm_ops rmb_dma_pm_ops = {
 
 static struct platform_driver rembrandt_driver = {
 	.probe = rembrandt_audio_probe,
-	.remove_new = rembrandt_audio_remove,
+	.remove = rembrandt_audio_remove,
 	.driver = {
 		.name = "acp_asoc_rembrandt",
 		.pm = &rmb_dma_pm_ops,
diff --git a/sound/soc/amd/acp/acp-renoir.c b/sound/soc/amd/acp/acp-renoir.c
index db835ed7c208..5e3f730aa6bf 100644
--- a/sound/soc/amd/acp/acp-renoir.c
+++ b/sound/soc/amd/acp/acp-renoir.c
@@ -244,7 +244,7 @@ static const struct dev_pm_ops rn_dma_pm_ops = {
 
 static struct platform_driver renoir_driver = {
 	.probe = renoir_audio_probe,
-	.remove_new = renoir_audio_remove,
+	.remove = renoir_audio_remove,
 	.driver = {
 		.name = "acp_asoc_renoir",
 		.pm = &rn_dma_pm_ops,
diff --git a/sound/soc/amd/acp/acp-sdw-sof-mach.c b/sound/soc/amd/acp/acp-sdw-sof-mach.c
index 08f368b3bbc8..b1cd173f607d 100644
--- a/sound/soc/amd/acp/acp-sdw-sof-mach.c
+++ b/sound/soc/amd/acp/acp-sdw-sof-mach.c
@@ -729,7 +729,7 @@ static struct platform_driver sof_sdw_driver = {
 		.pm = &snd_soc_pm_ops,
 	},
 	.probe = mc_probe,
-	.remove_new = mc_remove,
+	.remove = mc_remove,
 	.id_table = mc_id_table,
 };
 
diff --git a/sound/soc/amd/acp/acp63.c b/sound/soc/amd/acp/acp63.c
index f340920b3289..f325c374f228 100644
--- a/sound/soc/amd/acp/acp63.c
+++ b/sound/soc/amd/acp/acp63.c
@@ -304,7 +304,7 @@ static const struct dev_pm_ops acp63_dma_pm_ops = {
 
 static struct platform_driver acp63_driver = {
 	.probe = acp63_audio_probe,
-	.remove_new = acp63_audio_remove,
+	.remove = acp63_audio_remove,
 	.driver = {
 		.name = "acp_asoc_acp63",
 		.pm = &acp63_dma_pm_ops,
diff --git a/sound/soc/amd/acp/acp70.c b/sound/soc/amd/acp/acp70.c
index 1b0b59a22924..68d2590e1a4e 100644
--- a/sound/soc/amd/acp/acp70.c
+++ b/sound/soc/amd/acp/acp70.c
@@ -278,7 +278,7 @@ static const struct dev_pm_ops acp70_dma_pm_ops = {
 
 static struct platform_driver acp70_driver = {
 	.probe = acp_acp70_audio_probe,
-	.remove_new = acp_acp70_audio_remove,
+	.remove = acp_acp70_audio_remove,
 	.driver = {
 		.name = "acp_asoc_acp70",
 		.pm = &acp70_dma_pm_ops,
diff --git a/sound/soc/amd/ps/ps-pdm-dma.c b/sound/soc/amd/ps/ps-pdm-dma.c
index 7bbacbab1095..318fc260f293 100644
--- a/sound/soc/amd/ps/ps-pdm-dma.c
+++ b/sound/soc/amd/ps/ps-pdm-dma.c
@@ -448,7 +448,7 @@ static const struct dev_pm_ops acp63_pdm_pm_ops = {
 
 static struct platform_driver acp63_pdm_dma_driver = {
 	.probe = acp63_pdm_audio_probe,
-	.remove_new = acp63_pdm_audio_remove,
+	.remove = acp63_pdm_audio_remove,
 	.driver = {
 		.name = "acp_ps_pdm_dma",
 		.pm = &acp63_pdm_pm_ops,
diff --git a/sound/soc/amd/ps/ps-sdw-dma.c b/sound/soc/amd/ps/ps-sdw-dma.c
index 2f630753278d..3b4b9c6b3171 100644
--- a/sound/soc/amd/ps/ps-sdw-dma.c
+++ b/sound/soc/amd/ps/ps-sdw-dma.c
@@ -551,7 +551,7 @@ static const struct dev_pm_ops acp63_pm_ops = {
 
 static struct platform_driver acp63_sdw_dma_driver = {
 	.probe = acp63_sdw_platform_probe,
-	.remove_new = acp63_sdw_platform_remove,
+	.remove = acp63_sdw_platform_remove,
 	.driver = {
 		.name = "amd_ps_sdw_dma",
 		.pm = &acp63_pm_ops,
diff --git a/sound/soc/amd/raven/acp3x-pcm-dma.c b/sound/soc/amd/raven/acp3x-pcm-dma.c
index 3a50558f6751..bb9ed52d744d 100644
--- a/sound/soc/amd/raven/acp3x-pcm-dma.c
+++ b/sound/soc/amd/raven/acp3x-pcm-dma.c
@@ -509,7 +509,7 @@ static const struct dev_pm_ops acp3x_pm_ops = {
 
 static struct platform_driver acp3x_dma_driver = {
 	.probe = acp3x_audio_probe,
-	.remove_new = acp3x_audio_remove,
+	.remove = acp3x_audio_remove,
 	.driver = {
 		.name = "acp3x_rv_i2s_dma",
 		.pm = &acp3x_pm_ops,
diff --git a/sound/soc/amd/renoir/acp3x-pdm-dma.c b/sound/soc/amd/renoir/acp3x-pdm-dma.c
index c3b47e9bd239..95ac8c680037 100644
--- a/sound/soc/amd/renoir/acp3x-pdm-dma.c
+++ b/sound/soc/amd/renoir/acp3x-pdm-dma.c
@@ -489,7 +489,7 @@ static const struct dev_pm_ops acp_pdm_pm_ops = {
 
 static struct platform_driver acp_pdm_dma_driver = {
 	.probe = acp_pdm_audio_probe,
-	.remove_new = acp_pdm_audio_remove,
+	.remove = acp_pdm_audio_remove,
 	.driver = {
 		.name = "acp_rn_pdm_dma",
 		.pm = &acp_pdm_pm_ops,
diff --git a/sound/soc/amd/vangogh/acp5x-pcm-dma.c b/sound/soc/amd/vangogh/acp5x-pcm-dma.c
index 491b16e52a72..d5965f2b09bc 100644
--- a/sound/soc/amd/vangogh/acp5x-pcm-dma.c
+++ b/sound/soc/amd/vangogh/acp5x-pcm-dma.c
@@ -499,7 +499,7 @@ static const struct dev_pm_ops acp5x_pm_ops = {
 
 static struct platform_driver acp5x_dma_driver = {
 	.probe = acp5x_audio_probe,
-	.remove_new = acp5x_audio_remove,
+	.remove = acp5x_audio_remove,
 	.driver = {
 		.name = "acp5x_i2s_dma",
 		.pm = &acp5x_pm_ops,
diff --git a/sound/soc/amd/yc/acp6x-pdm-dma.c b/sound/soc/amd/yc/acp6x-pdm-dma.c
index 72c4591e451b..3eb3e82efb10 100644
--- a/sound/soc/amd/yc/acp6x-pdm-dma.c
+++ b/sound/soc/amd/yc/acp6x-pdm-dma.c
@@ -440,7 +440,7 @@ static const struct dev_pm_ops acp6x_pdm_pm_ops = {
 
 static struct platform_driver acp6x_pdm_dma_driver = {
 	.probe = acp6x_pdm_audio_probe,
-	.remove_new = acp6x_pdm_audio_remove,
+	.remove = acp6x_pdm_audio_remove,
 	.driver = {
 		.name = "acp_yc_pdm_dma",
 		.pm = &acp6x_pdm_pm_ops,
diff --git a/sound/soc/apple/mca.c b/sound/soc/apple/mca.c
index 3780aca71076..c9e7d40c47cc 100644
--- a/sound/soc/apple/mca.c
+++ b/sound/soc/apple/mca.c
@@ -1179,7 +1179,7 @@ static struct platform_driver apple_mca_driver = {
 		.of_match_table = apple_mca_of_match,
 	},
 	.probe = apple_mca_probe,
-	.remove_new = apple_mca_remove,
+	.remove = apple_mca_remove,
 };
 module_platform_driver(apple_mca_driver);
 
diff --git a/sound/soc/atmel/atmel-i2s.c b/sound/soc/atmel/atmel-i2s.c
index 6c20c643f321..762199faf872 100644
--- a/sound/soc/atmel/atmel-i2s.c
+++ b/sound/soc/atmel/atmel-i2s.c
@@ -733,7 +733,7 @@ static struct platform_driver atmel_i2s_driver = {
 		.of_match_table	= atmel_i2s_dt_ids,
 	},
 	.probe		= atmel_i2s_probe,
-	.remove_new	= atmel_i2s_remove,
+	.remove		= atmel_i2s_remove,
 };
 module_platform_driver(atmel_i2s_driver);
 
diff --git a/sound/soc/atmel/atmel_wm8904.c b/sound/soc/atmel/atmel_wm8904.c
index b7f16ea0cdfc..0f4021c6c588 100644
--- a/sound/soc/atmel/atmel_wm8904.c
+++ b/sound/soc/atmel/atmel_wm8904.c
@@ -187,7 +187,7 @@ static struct platform_driver atmel_asoc_wm8904_driver = {
 		.pm		= &snd_soc_pm_ops,
 	},
 	.probe = atmel_asoc_wm8904_probe,
-	.remove_new = atmel_asoc_wm8904_remove,
+	.remove = atmel_asoc_wm8904_remove,
 };
 
 module_platform_driver(atmel_asoc_wm8904_driver);
diff --git a/sound/soc/atmel/mchp-i2s-mcc.c b/sound/soc/atmel/mchp-i2s-mcc.c
index 35a56b266b8d..fbcb0070c188 100644
--- a/sound/soc/atmel/mchp-i2s-mcc.c
+++ b/sound/soc/atmel/mchp-i2s-mcc.c
@@ -1129,7 +1129,7 @@ static struct platform_driver mchp_i2s_mcc_driver = {
 		.of_match_table	= mchp_i2s_mcc_dt_ids,
 	},
 	.probe		= mchp_i2s_mcc_probe,
-	.remove_new	= mchp_i2s_mcc_remove,
+	.remove		= mchp_i2s_mcc_remove,
 };
 module_platform_driver(mchp_i2s_mcc_driver);
 
diff --git a/sound/soc/atmel/mchp-pdmc.c b/sound/soc/atmel/mchp-pdmc.c
index dcc4e14b3dde..260074018da9 100644
--- a/sound/soc/atmel/mchp-pdmc.c
+++ b/sound/soc/atmel/mchp-pdmc.c
@@ -1153,7 +1153,7 @@ static struct platform_driver mchp_pdmc_driver = {
 		.pm		= pm_ptr(&mchp_pdmc_pm_ops),
 	},
 	.probe	= mchp_pdmc_probe,
-	.remove_new = mchp_pdmc_remove,
+	.remove = mchp_pdmc_remove,
 };
 module_platform_driver(mchp_pdmc_driver);
 
diff --git a/sound/soc/atmel/mchp-spdifrx.c b/sound/soc/atmel/mchp-spdifrx.c
index 33ce5e54482b..b2507a1491b7 100644
--- a/sound/soc/atmel/mchp-spdifrx.c
+++ b/sound/soc/atmel/mchp-spdifrx.c
@@ -1194,7 +1194,7 @@ static void mchp_spdifrx_remove(struct platform_device *pdev)
 
 static struct platform_driver mchp_spdifrx_driver = {
 	.probe	= mchp_spdifrx_probe,
-	.remove_new = mchp_spdifrx_remove,
+	.remove = mchp_spdifrx_remove,
 	.driver	= {
 		.name	= "mchp_spdifrx",
 		.of_match_table = mchp_spdifrx_dt_ids,
diff --git a/sound/soc/atmel/mchp-spdiftx.c b/sound/soc/atmel/mchp-spdiftx.c
index a201a96fa690..4c60ea652896 100644
--- a/sound/soc/atmel/mchp-spdiftx.c
+++ b/sound/soc/atmel/mchp-spdiftx.c
@@ -888,7 +888,7 @@ static void mchp_spdiftx_remove(struct platform_device *pdev)
 
 static struct platform_driver mchp_spdiftx_driver = {
 	.probe	= mchp_spdiftx_probe,
-	.remove_new = mchp_spdiftx_remove,
+	.remove = mchp_spdiftx_remove,
 	.driver	= {
 		.name	= "mchp_spdiftx",
 		.of_match_table = mchp_spdiftx_dt_ids,
diff --git a/sound/soc/atmel/sam9g20_wm8731.c b/sound/soc/atmel/sam9g20_wm8731.c
index d3ec9826d505..335e216ea7b4 100644
--- a/sound/soc/atmel/sam9g20_wm8731.c
+++ b/sound/soc/atmel/sam9g20_wm8731.c
@@ -207,7 +207,7 @@ static struct platform_driver at91sam9g20ek_audio_driver = {
 		.of_match_table = of_match_ptr(at91sam9g20ek_wm8731_dt_ids),
 	},
 	.probe	= at91sam9g20ek_audio_probe,
-	.remove_new = at91sam9g20ek_audio_remove,
+	.remove = at91sam9g20ek_audio_remove,
 };
 
 module_platform_driver(at91sam9g20ek_audio_driver);
diff --git a/sound/soc/atmel/sam9x5_wm8731.c b/sound/soc/atmel/sam9x5_wm8731.c
index d1c1f370a9cd..1b5ef4e9d2b8 100644
--- a/sound/soc/atmel/sam9x5_wm8731.c
+++ b/sound/soc/atmel/sam9x5_wm8731.c
@@ -196,7 +196,7 @@ static struct platform_driver sam9x5_wm8731_driver = {
 		.of_match_table = of_match_ptr(sam9x5_wm8731_of_match),
 	},
 	.probe = sam9x5_wm8731_driver_probe,
-	.remove_new = sam9x5_wm8731_driver_remove,
+	.remove = sam9x5_wm8731_driver_remove,
 };
 module_platform_driver(sam9x5_wm8731_driver);
 
diff --git a/sound/soc/atmel/tse850-pcm5142.c b/sound/soc/atmel/tse850-pcm5142.c
index 5d208e0b4b90..0a9efd5f2861 100644
--- a/sound/soc/atmel/tse850-pcm5142.c
+++ b/sound/soc/atmel/tse850-pcm5142.c
@@ -431,7 +431,7 @@ static struct platform_driver tse850_driver = {
 		.of_match_table = tse850_dt_ids,
 	},
 	.probe = tse850_probe,
-	.remove_new = tse850_remove,
+	.remove = tse850_remove,
 };
 
 module_platform_driver(tse850_driver);
diff --git a/sound/soc/au1x/ac97c.c b/sound/soc/au1x/ac97c.c
index b0e1a1253e10..f8ab936250dc 100644
--- a/sound/soc/au1x/ac97c.c
+++ b/sound/soc/au1x/ac97c.c
@@ -336,7 +336,7 @@ static struct platform_driver au1xac97c_driver = {
 		.pm	= AU1XPSCAC97_PMOPS,
 	},
 	.probe		= au1xac97c_drvprobe,
-	.remove_new	= au1xac97c_drvremove,
+	.remove		= au1xac97c_drvremove,
 };
 
 module_platform_driver(au1xac97c_driver);
diff --git a/sound/soc/au1x/i2sc.c b/sound/soc/au1x/i2sc.c
index 064406080d72..7d296f29dade 100644
--- a/sound/soc/au1x/i2sc.c
+++ b/sound/soc/au1x/i2sc.c
@@ -313,7 +313,7 @@ static struct platform_driver au1xi2s_driver = {
 		.pm	= AU1XI2SC_PMOPS,
 	},
 	.probe		= au1xi2s_drvprobe,
-	.remove_new	= au1xi2s_drvremove,
+	.remove		= au1xi2s_drvremove,
 };
 
 module_platform_driver(au1xi2s_driver);
diff --git a/sound/soc/au1x/psc-ac97.c b/sound/soc/au1x/psc-ac97.c
index 1727eeb12b64..8a59a50978b9 100644
--- a/sound/soc/au1x/psc-ac97.c
+++ b/sound/soc/au1x/psc-ac97.c
@@ -486,7 +486,7 @@ static struct platform_driver au1xpsc_ac97_driver = {
 		.pm	= AU1XPSCAC97_PMOPS,
 	},
 	.probe		= au1xpsc_ac97_drvprobe,
-	.remove_new	= au1xpsc_ac97_drvremove,
+	.remove		= au1xpsc_ac97_drvremove,
 };
 
 module_platform_driver(au1xpsc_ac97_driver);
diff --git a/sound/soc/au1x/psc-i2s.c b/sound/soc/au1x/psc-i2s.c
index 52734dec8247..bee013555e7a 100644
--- a/sound/soc/au1x/psc-i2s.c
+++ b/sound/soc/au1x/psc-i2s.c
@@ -404,7 +404,7 @@ static struct platform_driver au1xpsc_i2s_driver = {
 		.pm	= AU1XPSCI2S_PMOPS,
 	},
 	.probe		= au1xpsc_i2s_drvprobe,
-	.remove_new	= au1xpsc_i2s_drvremove,
+	.remove		= au1xpsc_i2s_drvremove,
 };
 
 module_platform_driver(au1xpsc_i2s_driver);
diff --git a/sound/soc/bcm/bcm63xx-i2s-whistler.c b/sound/soc/bcm/bcm63xx-i2s-whistler.c
index c64609718738..c47ed1e6ea2b 100644
--- a/sound/soc/bcm/bcm63xx-i2s-whistler.c
+++ b/sound/soc/bcm/bcm63xx-i2s-whistler.c
@@ -293,7 +293,7 @@ static struct platform_driver bcm63xx_i2s_driver = {
 		.of_match_table = of_match_ptr(snd_soc_bcm_audio_match),
 	},
 	.probe = bcm63xx_i2s_dev_probe,
-	.remove_new = bcm63xx_i2s_dev_remove,
+	.remove = bcm63xx_i2s_dev_remove,
 };
 
 module_platform_driver(bcm63xx_i2s_driver);
diff --git a/sound/soc/bcm/cygnus-ssp.c b/sound/soc/bcm/cygnus-ssp.c
index 90088516fed0..e0ce0232eb1e 100644
--- a/sound/soc/bcm/cygnus-ssp.c
+++ b/sound/soc/bcm/cygnus-ssp.c
@@ -1390,7 +1390,7 @@ MODULE_DEVICE_TABLE(of, cygnus_ssp_of_match);
 
 static struct platform_driver cygnus_ssp_driver = {
 	.probe		= cygnus_ssp_probe,
-	.remove_new	= cygnus_ssp_remove,
+	.remove		= cygnus_ssp_remove,
 	.driver		= {
 		.name	= "cygnus-ssp",
 		.of_match_table = cygnus_ssp_of_match,
diff --git a/sound/soc/cirrus/edb93xx.c b/sound/soc/cirrus/edb93xx.c
index 8bb67d7d2b4b..8dac754ddb0d 100644
--- a/sound/soc/cirrus/edb93xx.c
+++ b/sound/soc/cirrus/edb93xx.c
@@ -105,7 +105,7 @@ static struct platform_driver edb93xx_driver = {
 		.name	= "edb93xx-audio",
 	},
 	.probe		= edb93xx_probe,
-	.remove_new	= edb93xx_remove,
+	.remove		= edb93xx_remove,
 };
 
 module_platform_driver(edb93xx_driver);
diff --git a/sound/soc/cirrus/ep93xx-i2s.c b/sound/soc/cirrus/ep93xx-i2s.c
index 522de4b80293..d45862ceb0c9 100644
--- a/sound/soc/cirrus/ep93xx-i2s.c
+++ b/sound/soc/cirrus/ep93xx-i2s.c
@@ -523,7 +523,7 @@ MODULE_DEVICE_TABLE(of, ep93xx_i2s_of_ids);
 
 static struct platform_driver ep93xx_i2s_driver = {
 	.probe	= ep93xx_i2s_probe,
-	.remove_new = ep93xx_i2s_remove,
+	.remove = ep93xx_i2s_remove,
 	.driver	= {
 		.name	= "ep93xx-i2s",
 		.of_match_table = ep93xx_i2s_of_ids,
diff --git a/sound/soc/codecs/cs42l43.c b/sound/soc/codecs/cs42l43.c
index 5183b4586424..d0098b4558b5 100644
--- a/sound/soc/codecs/cs42l43.c
+++ b/sound/soc/codecs/cs42l43.c
@@ -2461,7 +2461,7 @@ static struct platform_driver cs42l43_codec_driver = {
 	},
 
 	.probe		= cs42l43_codec_probe,
-	.remove_new	= cs42l43_codec_remove,
+	.remove		= cs42l43_codec_remove,
 	.id_table	= cs42l43_codec_id_table,
 };
 module_platform_driver(cs42l43_codec_driver);
diff --git a/sound/soc/codecs/cs47l15.c b/sound/soc/codecs/cs47l15.c
index ab6e7cd99733..29a2bcfb3048 100644
--- a/sound/soc/codecs/cs47l15.c
+++ b/sound/soc/codecs/cs47l15.c
@@ -1493,7 +1493,7 @@ static struct platform_driver cs47l15_codec_driver = {
 		.name = "cs47l15-codec",
 	},
 	.probe = &cs47l15_probe,
-	.remove_new = cs47l15_remove,
+	.remove = cs47l15_remove,
 };
 
 module_platform_driver(cs47l15_codec_driver);
diff --git a/sound/soc/codecs/cs47l24.c b/sound/soc/codecs/cs47l24.c
index ec405ef66a8e..e2a839fae4fc 100644
--- a/sound/soc/codecs/cs47l24.c
+++ b/sound/soc/codecs/cs47l24.c
@@ -1344,7 +1344,7 @@ static struct platform_driver cs47l24_codec_driver = {
 		.name = "cs47l24-codec",
 	},
 	.probe = cs47l24_probe,
-	.remove_new = cs47l24_remove,
+	.remove = cs47l24_remove,
 };
 
 module_platform_driver(cs47l24_codec_driver);
diff --git a/sound/soc/codecs/cs47l35.c b/sound/soc/codecs/cs47l35.c
index 0d7ee7ea6257..85555c7a2e4b 100644
--- a/sound/soc/codecs/cs47l35.c
+++ b/sound/soc/codecs/cs47l35.c
@@ -1769,7 +1769,7 @@ static struct platform_driver cs47l35_codec_driver = {
 		.name = "cs47l35-codec",
 	},
 	.probe = &cs47l35_probe,
-	.remove_new = cs47l35_remove,
+	.remove = cs47l35_remove,
 };
 
 module_platform_driver(cs47l35_codec_driver);
diff --git a/sound/soc/codecs/cs47l85.c b/sound/soc/codecs/cs47l85.c
index 2dfb867e6edd..d34f4e8c26d3 100644
--- a/sound/soc/codecs/cs47l85.c
+++ b/sound/soc/codecs/cs47l85.c
@@ -2720,7 +2720,7 @@ static struct platform_driver cs47l85_codec_driver = {
 		.name = "cs47l85-codec",
 	},
 	.probe = &cs47l85_probe,
-	.remove_new = cs47l85_remove,
+	.remove = cs47l85_remove,
 };
 
 module_platform_driver(cs47l85_codec_driver);
diff --git a/sound/soc/codecs/cs47l90.c b/sound/soc/codecs/cs47l90.c
index 2549cb1fc121..a9e703981f37 100644
--- a/sound/soc/codecs/cs47l90.c
+++ b/sound/soc/codecs/cs47l90.c
@@ -2644,7 +2644,7 @@ static struct platform_driver cs47l90_codec_driver = {
 		.name = "cs47l90-codec",
 	},
 	.probe = &cs47l90_probe,
-	.remove_new = cs47l90_remove,
+	.remove = cs47l90_remove,
 };
 
 module_platform_driver(cs47l90_codec_driver);
diff --git a/sound/soc/codecs/cs47l92.c b/sound/soc/codecs/cs47l92.c
index 0c05ae0b09fb..2c355c61acd8 100644
--- a/sound/soc/codecs/cs47l92.c
+++ b/sound/soc/codecs/cs47l92.c
@@ -2092,7 +2092,7 @@ static struct platform_driver cs47l92_codec_driver = {
 		.name = "cs47l92-codec",
 	},
 	.probe = &cs47l92_probe,
-	.remove_new = cs47l92_remove,
+	.remove = cs47l92_remove,
 };
 
 module_platform_driver(cs47l92_codec_driver);
diff --git a/sound/soc/codecs/inno_rk3036.c b/sound/soc/codecs/inno_rk3036.c
index 11320423c69c..fdd19f8e8864 100644
--- a/sound/soc/codecs/inno_rk3036.c
+++ b/sound/soc/codecs/inno_rk3036.c
@@ -476,7 +476,7 @@ static struct platform_driver rk3036_codec_platform_driver = {
 		.of_match_table = of_match_ptr(rk3036_codec_of_match),
 	},
 	.probe = rk3036_codec_platform_probe,
-	.remove_new = rk3036_codec_platform_remove,
+	.remove = rk3036_codec_platform_remove,
 };
 
 module_platform_driver(rk3036_codec_platform_driver);
diff --git a/sound/soc/codecs/lpass-rx-macro.c b/sound/soc/codecs/lpass-rx-macro.c
index ce42749660c8..71e0d3bffd3f 100644
--- a/sound/soc/codecs/lpass-rx-macro.c
+++ b/sound/soc/codecs/lpass-rx-macro.c
@@ -4024,7 +4024,7 @@ static struct platform_driver rx_macro_driver = {
 		.pm = &rx_macro_pm_ops,
 	},
 	.probe = rx_macro_probe,
-	.remove_new = rx_macro_remove,
+	.remove = rx_macro_remove,
 };
 
 module_platform_driver(rx_macro_driver);
diff --git a/sound/soc/codecs/lpass-tx-macro.c b/sound/soc/codecs/lpass-tx-macro.c
index 209c12ec16dd..a134584acf90 100644
--- a/sound/soc/codecs/lpass-tx-macro.c
+++ b/sound/soc/codecs/lpass-tx-macro.c
@@ -2534,7 +2534,7 @@ static struct platform_driver tx_macro_driver = {
 		.pm = &tx_macro_pm_ops,
 	},
 	.probe = tx_macro_probe,
-	.remove_new = tx_macro_remove,
+	.remove = tx_macro_remove,
 };
 
 module_platform_driver(tx_macro_driver);
diff --git a/sound/soc/codecs/lpass-va-macro.c b/sound/soc/codecs/lpass-va-macro.c
index e95d1f29ef18..c781da476240 100644
--- a/sound/soc/codecs/lpass-va-macro.c
+++ b/sound/soc/codecs/lpass-va-macro.c
@@ -1738,7 +1738,7 @@ static struct platform_driver va_macro_driver = {
 		.pm = &va_macro_pm_ops,
 	},
 	.probe = va_macro_probe,
-	.remove_new = va_macro_remove,
+	.remove = va_macro_remove,
 };
 
 module_platform_driver(va_macro_driver);
diff --git a/sound/soc/codecs/lpass-wsa-macro.c b/sound/soc/codecs/lpass-wsa-macro.c
index 76900274acf3..c989d82d1d3c 100644
--- a/sound/soc/codecs/lpass-wsa-macro.c
+++ b/sound/soc/codecs/lpass-wsa-macro.c
@@ -2980,7 +2980,7 @@ static struct platform_driver wsa_macro_driver = {
 		.pm = &wsa_macro_pm_ops,
 	},
 	.probe = wsa_macro_probe,
-	.remove_new = wsa_macro_remove,
+	.remove = wsa_macro_remove,
 };
 
 module_platform_driver(wsa_macro_driver);
diff --git a/sound/soc/codecs/msm8916-wcd-digital.c b/sound/soc/codecs/msm8916-wcd-digital.c
index 978c4d056e81..ebb6f2e84818 100644
--- a/sound/soc/codecs/msm8916-wcd-digital.c
+++ b/sound/soc/codecs/msm8916-wcd-digital.c
@@ -1241,7 +1241,7 @@ static struct platform_driver msm8916_wcd_digital_driver = {
 		   .of_match_table = msm8916_wcd_digital_match_table,
 	},
 	.probe = msm8916_wcd_digital_probe,
-	.remove_new = msm8916_wcd_digital_remove,
+	.remove = msm8916_wcd_digital_remove,
 };
 
 module_platform_driver(msm8916_wcd_digital_driver);
diff --git a/sound/soc/codecs/rk817_codec.c b/sound/soc/codecs/rk817_codec.c
index 5fea600bc3a4..3c5b66357661 100644
--- a/sound/soc/codecs/rk817_codec.c
+++ b/sound/soc/codecs/rk817_codec.c
@@ -529,7 +529,7 @@ static struct platform_driver rk817_codec_driver = {
 		   .name = "rk817-codec",
 		   },
 	.probe = rk817_platform_probe,
-	.remove_new = rk817_platform_remove,
+	.remove = rk817_platform_remove,
 };
 
 module_platform_driver(rk817_codec_driver);
diff --git a/sound/soc/codecs/wcd937x.c b/sound/soc/codecs/wcd937x.c
index af296b77a723..45f32d281908 100644
--- a/sound/soc/codecs/wcd937x.c
+++ b/sound/soc/codecs/wcd937x.c
@@ -2957,7 +2957,7 @@ MODULE_DEVICE_TABLE(of, wcd937x_of_match);
 
 static struct platform_driver wcd937x_codec_driver = {
 	.probe = wcd937x_probe,
-	.remove_new = wcd937x_remove,
+	.remove = wcd937x_remove,
 	.driver = {
 		.name = "wcd937x_codec",
 		.of_match_table = of_match_ptr(wcd937x_of_match),
diff --git a/sound/soc/codecs/wcd938x.c b/sound/soc/codecs/wcd938x.c
index aa92f1bfc921..f2a4f3262bdb 100644
--- a/sound/soc/codecs/wcd938x.c
+++ b/sound/soc/codecs/wcd938x.c
@@ -3596,7 +3596,7 @@ MODULE_DEVICE_TABLE(of, wcd938x_dt_match);
 
 static struct platform_driver wcd938x_codec_driver = {
 	.probe = wcd938x_probe,
-	.remove_new = wcd938x_remove,
+	.remove = wcd938x_remove,
 	.driver = {
 		.name = "wcd938x_codec",
 		.of_match_table = of_match_ptr(wcd938x_dt_match),
diff --git a/sound/soc/codecs/wcd939x.c b/sound/soc/codecs/wcd939x.c
index 68fc591670dc..4a417a92514d 100644
--- a/sound/soc/codecs/wcd939x.c
+++ b/sound/soc/codecs/wcd939x.c
@@ -3683,7 +3683,7 @@ MODULE_DEVICE_TABLE(of, wcd939x_dt_match);
 
 static struct platform_driver wcd939x_codec_driver = {
 	.probe = wcd939x_probe,
-	.remove_new = wcd939x_remove,
+	.remove = wcd939x_remove,
 	.driver = {
 		.name = "wcd939x_codec",
 		.of_match_table = of_match_ptr(wcd939x_dt_match),
diff --git a/sound/soc/codecs/wm5102.c b/sound/soc/codecs/wm5102.c
index 4ecf07c7448c..651f1319204d 100644
--- a/sound/soc/codecs/wm5102.c
+++ b/sound/soc/codecs/wm5102.c
@@ -2174,7 +2174,7 @@ static struct platform_driver wm5102_codec_driver = {
 		.name = "wm5102-codec",
 	},
 	.probe = wm5102_probe,
-	.remove_new = wm5102_remove,
+	.remove = wm5102_remove,
 };
 
 module_platform_driver(wm5102_codec_driver);
diff --git a/sound/soc/codecs/wm5110.c b/sound/soc/codecs/wm5110.c
index 0f299cd07b2e..502196253d42 100644
--- a/sound/soc/codecs/wm5110.c
+++ b/sound/soc/codecs/wm5110.c
@@ -2534,7 +2534,7 @@ static struct platform_driver wm5110_codec_driver = {
 		.name = "wm5110-codec",
 	},
 	.probe = wm5110_probe,
-	.remove_new = wm5110_remove,
+	.remove = wm5110_remove,
 };
 
 module_platform_driver(wm5110_codec_driver);
diff --git a/sound/soc/codecs/wm8994.c b/sound/soc/codecs/wm8994.c
index a99908582a50..a4abe6e53bfc 100644
--- a/sound/soc/codecs/wm8994.c
+++ b/sound/soc/codecs/wm8994.c
@@ -4699,7 +4699,7 @@ static struct platform_driver wm8994_codec_driver = {
 		.pm = &wm8994_pm_ops,
 	},
 	.probe = wm8994_probe,
-	.remove_new = wm8994_remove,
+	.remove = wm8994_remove,
 };
 
 module_platform_driver(wm8994_codec_driver);
diff --git a/sound/soc/codecs/wm8997.c b/sound/soc/codecs/wm8997.c
index 87442840f0af..5389c363b14e 100644
--- a/sound/soc/codecs/wm8997.c
+++ b/sound/soc/codecs/wm8997.c
@@ -1210,7 +1210,7 @@ static struct platform_driver wm8997_codec_driver = {
 		.name = "wm8997-codec",
 	},
 	.probe = wm8997_probe,
-	.remove_new = wm8997_remove,
+	.remove = wm8997_remove,
 };
 
 module_platform_driver(wm8997_codec_driver);
diff --git a/sound/soc/codecs/wm8998.c b/sound/soc/codecs/wm8998.c
index 3c2c4d12c08e..b72b8a64be8f 100644
--- a/sound/soc/codecs/wm8998.c
+++ b/sound/soc/codecs/wm8998.c
@@ -1426,7 +1426,7 @@ static struct platform_driver wm8998_codec_driver = {
 		.name = "wm8998-codec",
 	},
 	.probe = wm8998_probe,
-	.remove_new = wm8998_remove,
+	.remove = wm8998_remove,
 };
 
 module_platform_driver(wm8998_codec_driver);
diff --git a/sound/soc/dwc/dwc-i2s.c b/sound/soc/dwc/dwc-i2s.c
index e6a5eebe5bc9..57b789d7fbed 100644
--- a/sound/soc/dwc/dwc-i2s.c
+++ b/sound/soc/dwc/dwc-i2s.c
@@ -1089,7 +1089,7 @@ static const struct dev_pm_ops dwc_pm_ops = {
 
 static struct platform_driver dw_i2s_driver = {
 	.probe		= dw_i2s_probe,
-	.remove_new	= dw_i2s_remove,
+	.remove		= dw_i2s_remove,
 	.driver		= {
 		.name	= "designware-i2s",
 		.of_match_table = of_match_ptr(dw_i2s_of_match),
diff --git a/sound/soc/fsl/fsl_asrc.c b/sound/soc/fsl/fsl_asrc.c
index b793263291dc..bd5c46d763c0 100644
--- a/sound/soc/fsl/fsl_asrc.c
+++ b/sound/soc/fsl/fsl_asrc.c
@@ -1392,7 +1392,7 @@ MODULE_DEVICE_TABLE(of, fsl_asrc_ids);
 
 static struct platform_driver fsl_asrc_driver = {
 	.probe = fsl_asrc_probe,
-	.remove_new = fsl_asrc_remove,
+	.remove = fsl_asrc_remove,
 	.driver = {
 		.name = "fsl-asrc",
 		.of_match_table = fsl_asrc_ids,
diff --git a/sound/soc/fsl/fsl_aud2htx.c b/sound/soc/fsl/fsl_aud2htx.c
index a6cbaa6364c7..021d73e409aa 100644
--- a/sound/soc/fsl/fsl_aud2htx.c
+++ b/sound/soc/fsl/fsl_aud2htx.c
@@ -296,7 +296,7 @@ static const struct dev_pm_ops fsl_aud2htx_pm_ops = {
 
 static struct platform_driver fsl_aud2htx_driver = {
 	.probe = fsl_aud2htx_probe,
-	.remove_new = fsl_aud2htx_remove,
+	.remove = fsl_aud2htx_remove,
 	.driver = {
 		.name = "fsl-aud2htx",
 		.pm = pm_ptr(&fsl_aud2htx_pm_ops),
diff --git a/sound/soc/fsl/fsl_audmix.c b/sound/soc/fsl/fsl_audmix.c
index f3a24758aedb..3cd9a66b70a1 100644
--- a/sound/soc/fsl/fsl_audmix.c
+++ b/sound/soc/fsl/fsl_audmix.c
@@ -548,7 +548,7 @@ static const struct dev_pm_ops fsl_audmix_pm = {
 
 static struct platform_driver fsl_audmix_driver = {
 	.probe = fsl_audmix_probe,
-	.remove_new = fsl_audmix_remove,
+	.remove = fsl_audmix_remove,
 	.driver = {
 		.name = "fsl-audmix",
 		.of_match_table = fsl_audmix_ids,
diff --git a/sound/soc/fsl/fsl_dma.c b/sound/soc/fsl/fsl_dma.c
index c4bc9395dff7..aca066b5a43c 100644
--- a/sound/soc/fsl/fsl_dma.c
+++ b/sound/soc/fsl/fsl_dma.c
@@ -911,7 +911,7 @@ static struct platform_driver fsl_soc_dma_driver = {
 		.of_match_table = fsl_soc_dma_ids,
 	},
 	.probe = fsl_soc_dma_probe,
-	.remove_new = fsl_soc_dma_remove,
+	.remove = fsl_soc_dma_remove,
 };
 
 module_platform_driver(fsl_soc_dma_driver);
diff --git a/sound/soc/fsl/fsl_easrc.c b/sound/soc/fsl/fsl_easrc.c
index 962f30912091..82359edd6a8b 100644
--- a/sound/soc/fsl/fsl_easrc.c
+++ b/sound/soc/fsl/fsl_easrc.c
@@ -2093,7 +2093,7 @@ static const struct dev_pm_ops fsl_easrc_pm_ops = {
 
 static struct platform_driver fsl_easrc_driver = {
 	.probe = fsl_easrc_probe,
-	.remove_new = fsl_easrc_remove,
+	.remove = fsl_easrc_remove,
 	.driver = {
 		.name = "fsl-easrc",
 		.pm = pm_ptr(&fsl_easrc_pm_ops),
diff --git a/sound/soc/fsl/fsl_esai.c b/sound/soc/fsl/fsl_esai.c
index d0d8a01da9bd..a65f5b9935a2 100644
--- a/sound/soc/fsl/fsl_esai.c
+++ b/sound/soc/fsl/fsl_esai.c
@@ -1198,7 +1198,7 @@ static const struct dev_pm_ops fsl_esai_pm_ops = {
 
 static struct platform_driver fsl_esai_driver = {
 	.probe = fsl_esai_probe,
-	.remove_new = fsl_esai_remove,
+	.remove = fsl_esai_remove,
 	.driver = {
 		.name = "fsl-esai-dai",
 		.pm = &fsl_esai_pm_ops,
diff --git a/sound/soc/fsl/fsl_micfil.c b/sound/soc/fsl/fsl_micfil.c
index 22b240a70ad4..193be098fa5e 100644
--- a/sound/soc/fsl/fsl_micfil.c
+++ b/sound/soc/fsl/fsl_micfil.c
@@ -1317,7 +1317,7 @@ static const struct dev_pm_ops fsl_micfil_pm_ops = {
 
 static struct platform_driver fsl_micfil_driver = {
 	.probe = fsl_micfil_probe,
-	.remove_new = fsl_micfil_remove,
+	.remove = fsl_micfil_remove,
 	.driver = {
 		.name = "fsl-micfil-dai",
 		.pm = &fsl_micfil_pm_ops,
diff --git a/sound/soc/fsl/fsl_mqs.c b/sound/soc/fsl/fsl_mqs.c
index df160834c81b..145f9ca15e43 100644
--- a/sound/soc/fsl/fsl_mqs.c
+++ b/sound/soc/fsl/fsl_mqs.c
@@ -381,7 +381,7 @@ MODULE_DEVICE_TABLE(of, fsl_mqs_dt_ids);
 
 static struct platform_driver fsl_mqs_driver = {
 	.probe		= fsl_mqs_probe,
-	.remove_new	= fsl_mqs_remove,
+	.remove		= fsl_mqs_remove,
 	.driver		= {
 		.name	= "fsl-mqs",
 		.of_match_table = fsl_mqs_dt_ids,
diff --git a/sound/soc/fsl/fsl_rpmsg.c b/sound/soc/fsl/fsl_rpmsg.c
index be46fbfd487a..0a551be3053b 100644
--- a/sound/soc/fsl/fsl_rpmsg.c
+++ b/sound/soc/fsl/fsl_rpmsg.c
@@ -328,7 +328,7 @@ static const struct dev_pm_ops fsl_rpmsg_pm_ops = {
 
 static struct platform_driver fsl_rpmsg_driver = {
 	.probe  = fsl_rpmsg_probe,
-	.remove_new = fsl_rpmsg_remove,
+	.remove = fsl_rpmsg_remove,
 	.driver = {
 		.name = "fsl_rpmsg",
 		.pm = pm_ptr(&fsl_rpmsg_pm_ops),
diff --git a/sound/soc/fsl/fsl_sai.c b/sound/soc/fsl/fsl_sai.c
index d03b0172b8ad..ab58a4461073 100644
--- a/sound/soc/fsl/fsl_sai.c
+++ b/sound/soc/fsl/fsl_sai.c
@@ -1817,7 +1817,7 @@ static const struct dev_pm_ops fsl_sai_pm_ops = {
 
 static struct platform_driver fsl_sai_driver = {
 	.probe = fsl_sai_probe,
-	.remove_new = fsl_sai_remove,
+	.remove = fsl_sai_remove,
 	.driver = {
 		.name = "fsl-sai",
 		.pm = &fsl_sai_pm_ops,
diff --git a/sound/soc/fsl/fsl_spdif.c b/sound/soc/fsl/fsl_spdif.c
index eace399cb064..b6ff04f7138a 100644
--- a/sound/soc/fsl/fsl_spdif.c
+++ b/sound/soc/fsl/fsl_spdif.c
@@ -1763,7 +1763,7 @@ static struct platform_driver fsl_spdif_driver = {
 		.pm = pm_ptr(&fsl_spdif_pm),
 	},
 	.probe = fsl_spdif_probe,
-	.remove_new = fsl_spdif_remove,
+	.remove = fsl_spdif_remove,
 };
 
 module_platform_driver(fsl_spdif_driver);
diff --git a/sound/soc/fsl/fsl_ssi.c b/sound/soc/fsl/fsl_ssi.c
index c4c1d9c44056..320108bebf30 100644
--- a/sound/soc/fsl/fsl_ssi.c
+++ b/sound/soc/fsl/fsl_ssi.c
@@ -1734,7 +1734,7 @@ static struct platform_driver fsl_ssi_driver = {
 		.pm = pm_sleep_ptr(&fsl_ssi_pm),
 	},
 	.probe = fsl_ssi_probe,
-	.remove_new = fsl_ssi_remove,
+	.remove = fsl_ssi_remove,
 };
 
 module_platform_driver(fsl_ssi_driver);
diff --git a/sound/soc/fsl/fsl_xcvr.c b/sound/soc/fsl/fsl_xcvr.c
index c98e3db74fe7..beede7344efd 100644
--- a/sound/soc/fsl/fsl_xcvr.c
+++ b/sound/soc/fsl/fsl_xcvr.c
@@ -1540,7 +1540,7 @@ static struct platform_driver fsl_xcvr_driver = {
 		.pm = pm_ptr(&fsl_xcvr_pm_ops),
 		.of_match_table = fsl_xcvr_dt_ids,
 	},
-	.remove_new = fsl_xcvr_remove,
+	.remove = fsl_xcvr_remove,
 };
 module_platform_driver(fsl_xcvr_driver);
 
diff --git a/sound/soc/fsl/imx-audmux.c b/sound/soc/fsl/imx-audmux.c
index f97ae14dc452..43e14f2eca8d 100644
--- a/sound/soc/fsl/imx-audmux.c
+++ b/sound/soc/fsl/imx-audmux.c
@@ -354,7 +354,7 @@ static const struct dev_pm_ops imx_audmux_pm = {
 
 static struct platform_driver imx_audmux_driver = {
 	.probe		= imx_audmux_probe,
-	.remove_new	= imx_audmux_remove,
+	.remove		= imx_audmux_remove,
 	.driver	= {
 		.name	= DRIVER_NAME,
 		.pm = pm_sleep_ptr(&imx_audmux_pm),
diff --git a/sound/soc/fsl/imx-pcm-rpmsg.c b/sound/soc/fsl/imx-pcm-rpmsg.c
index 22156f99dcee..1daf0be3d100 100644
--- a/sound/soc/fsl/imx-pcm-rpmsg.c
+++ b/sound/soc/fsl/imx-pcm-rpmsg.c
@@ -822,7 +822,7 @@ MODULE_DEVICE_TABLE(platform, imx_rpmsg_pcm_id_table);
 
 static struct platform_driver imx_pcm_rpmsg_driver = {
 	.probe  = imx_rpmsg_pcm_probe,
-	.remove_new = imx_rpmsg_pcm_remove,
+	.remove = imx_rpmsg_pcm_remove,
 	.id_table = imx_rpmsg_pcm_id_table,
 	.driver = {
 		.name = IMX_PCM_DRV_NAME,
diff --git a/sound/soc/fsl/imx-sgtl5000.c b/sound/soc/fsl/imx-sgtl5000.c
index 3c1e69092d2f..8bcf54ef709e 100644
--- a/sound/soc/fsl/imx-sgtl5000.c
+++ b/sound/soc/fsl/imx-sgtl5000.c
@@ -214,7 +214,7 @@ static struct platform_driver imx_sgtl5000_driver = {
 		.of_match_table = imx_sgtl5000_dt_ids,
 	},
 	.probe = imx_sgtl5000_probe,
-	.remove_new = imx_sgtl5000_remove,
+	.remove = imx_sgtl5000_remove,
 };
 module_platform_driver(imx_sgtl5000_driver);
 
diff --git a/sound/soc/fsl/mpc5200_psc_ac97.c b/sound/soc/fsl/mpc5200_psc_ac97.c
index 0423cf43c7a0..8554fb690772 100644
--- a/sound/soc/fsl/mpc5200_psc_ac97.c
+++ b/sound/soc/fsl/mpc5200_psc_ac97.c
@@ -327,7 +327,7 @@ MODULE_DEVICE_TABLE(of, psc_ac97_match);
 
 static struct platform_driver psc_ac97_driver = {
 	.probe = psc_ac97_of_probe,
-	.remove_new = psc_ac97_of_remove,
+	.remove = psc_ac97_of_remove,
 	.driver = {
 		.name = "mpc5200-psc-ac97",
 		.of_match_table = psc_ac97_match,
diff --git a/sound/soc/fsl/mpc5200_psc_i2s.c b/sound/soc/fsl/mpc5200_psc_i2s.c
index 931b430fa983..9ad44eeed6ad 100644
--- a/sound/soc/fsl/mpc5200_psc_i2s.c
+++ b/sound/soc/fsl/mpc5200_psc_i2s.c
@@ -225,7 +225,7 @@ MODULE_DEVICE_TABLE(of, psc_i2s_match);
 
 static struct platform_driver psc_i2s_driver = {
 	.probe = psc_i2s_of_probe,
-	.remove_new = psc_i2s_of_remove,
+	.remove = psc_i2s_of_remove,
 	.driver = {
 		.name = "mpc5200-psc-i2s",
 		.of_match_table = psc_i2s_match,
diff --git a/sound/soc/fsl/p1022_ds.c b/sound/soc/fsl/p1022_ds.c
index 6f5eecf6d88c..66db05970d82 100644
--- a/sound/soc/fsl/p1022_ds.c
+++ b/sound/soc/fsl/p1022_ds.c
@@ -408,7 +408,7 @@ static void p1022_ds_remove(struct platform_device *pdev)
 
 static struct platform_driver p1022_ds_driver = {
 	.probe = p1022_ds_probe,
-	.remove_new = p1022_ds_remove,
+	.remove = p1022_ds_remove,
 	.driver = {
 		/*
 		 * The name must match 'compatible' property in the device tree,
diff --git a/sound/soc/fsl/p1022_rdk.c b/sound/soc/fsl/p1022_rdk.c
index a42149311c8b..d4568346714f 100644
--- a/sound/soc/fsl/p1022_rdk.c
+++ b/sound/soc/fsl/p1022_rdk.c
@@ -370,7 +370,7 @@ static void p1022_rdk_remove(struct platform_device *pdev)
 
 static struct platform_driver p1022_rdk_driver = {
 	.probe = p1022_rdk_probe,
-	.remove_new = p1022_rdk_remove,
+	.remove = p1022_rdk_remove,
 	.driver = {
 		/*
 		 * The name must match 'compatible' property in the device tree,
diff --git a/sound/soc/fsl/pcm030-audio-fabric.c b/sound/soc/fsl/pcm030-audio-fabric.c
index 2bab0fc1de59..5542c4ee6d12 100644
--- a/sound/soc/fsl/pcm030-audio-fabric.c
+++ b/sound/soc/fsl/pcm030-audio-fabric.c
@@ -124,7 +124,7 @@ MODULE_DEVICE_TABLE(of, pcm030_audio_match);
 
 static struct platform_driver pcm030_fabric_driver = {
 	.probe		= pcm030_fabric_probe,
-	.remove_new	= pcm030_fabric_remove,
+	.remove		= pcm030_fabric_remove,
 	.driver		= {
 		.name	= DRV_NAME,
 		.of_match_table    = pcm030_audio_match,
diff --git a/sound/soc/generic/audio-graph-card.c b/sound/soc/generic/audio-graph-card.c
index 03add80e75f3..4b384475b972 100644
--- a/sound/soc/generic/audio-graph-card.c
+++ b/sound/soc/generic/audio-graph-card.c
@@ -664,7 +664,7 @@ static struct platform_driver graph_card = {
 		.of_match_table = graph_of_match,
 	},
 	.probe = graph_probe,
-	.remove_new = simple_util_remove,
+	.remove = simple_util_remove,
 };
 module_platform_driver(graph_card);
 
diff --git a/sound/soc/generic/audio-graph-card2-custom-sample.c b/sound/soc/generic/audio-graph-card2-custom-sample.c
index 8e5a51098490..7151d426bee9 100644
--- a/sound/soc/generic/audio-graph-card2-custom-sample.c
+++ b/sound/soc/generic/audio-graph-card2-custom-sample.c
@@ -177,7 +177,7 @@ static struct platform_driver custom_card = {
 		.of_match_table = custom_of_match,
 	},
 	.probe	= custom_probe,
-	.remove_new = simple_util_remove,
+	.remove = simple_util_remove,
 };
 module_platform_driver(custom_card);
 
diff --git a/sound/soc/generic/audio-graph-card2.c b/sound/soc/generic/audio-graph-card2.c
index bf4c1ab4ec58..4ad3d1b0714f 100644
--- a/sound/soc/generic/audio-graph-card2.c
+++ b/sound/soc/generic/audio-graph-card2.c
@@ -1438,7 +1438,7 @@ static struct platform_driver graph_card = {
 		.of_match_table = graph_of_match,
 	},
 	.probe	= graph_probe,
-	.remove_new = simple_util_remove,
+	.remove = simple_util_remove,
 };
 module_platform_driver(graph_card);
 
diff --git a/sound/soc/generic/simple-card.c b/sound/soc/generic/simple-card.c
index 42c60b92cca5..76a1d05e2ebe 100644
--- a/sound/soc/generic/simple-card.c
+++ b/sound/soc/generic/simple-card.c
@@ -838,7 +838,7 @@ static struct platform_driver simple_card = {
 		.of_match_table = simple_of_match,
 	},
 	.probe = simple_probe,
-	.remove_new = simple_util_remove,
+	.remove = simple_util_remove,
 };
 
 module_platform_driver(simple_card);
diff --git a/sound/soc/generic/test-component.c b/sound/soc/generic/test-component.c
index df2487b700cc..407288055741 100644
--- a/sound/soc/generic/test-component.c
+++ b/sound/soc/generic/test-component.c
@@ -637,7 +637,7 @@ static struct platform_driver test_driver = {
 		.of_match_table = test_of_match,
 	},
 	.probe  = test_driver_probe,
-	.remove_new = test_driver_remove,
+	.remove = test_driver_remove,
 };
 module_platform_driver(test_driver);
 
diff --git a/sound/soc/img/img-i2s-in.c b/sound/soc/img/img-i2s-in.c
index b69a364d619e..6a988976fb0d 100644
--- a/sound/soc/img/img-i2s-in.c
+++ b/sound/soc/img/img-i2s-in.c
@@ -607,7 +607,7 @@ static struct platform_driver img_i2s_in_driver = {
 		.pm = &img_i2s_in_pm_ops
 	},
 	.probe = img_i2s_in_probe,
-	.remove_new = img_i2s_in_dev_remove
+	.remove = img_i2s_in_dev_remove
 };
 module_platform_driver(img_i2s_in_driver);
 
diff --git a/sound/soc/img/img-i2s-out.c b/sound/soc/img/img-i2s-out.c
index 6f9831c6d6e0..1211e6184d97 100644
--- a/sound/soc/img/img-i2s-out.c
+++ b/sound/soc/img/img-i2s-out.c
@@ -607,7 +607,7 @@ static struct platform_driver img_i2s_out_driver = {
 		.pm = &img_i2s_out_pm_ops
 	},
 	.probe = img_i2s_out_probe,
-	.remove_new = img_i2s_out_dev_remove
+	.remove = img_i2s_out_dev_remove
 };
 module_platform_driver(img_i2s_out_driver);
 
diff --git a/sound/soc/img/img-parallel-out.c b/sound/soc/img/img-parallel-out.c
index 815e68a7048c..4ec63119d67c 100644
--- a/sound/soc/img/img-parallel-out.c
+++ b/sound/soc/img/img-parallel-out.c
@@ -311,7 +311,7 @@ static struct platform_driver img_prl_out_driver = {
 		.pm = &img_prl_out_pm_ops
 	},
 	.probe = img_prl_out_probe,
-	.remove_new = img_prl_out_dev_remove
+	.remove = img_prl_out_dev_remove
 };
 module_platform_driver(img_prl_out_driver);
 
diff --git a/sound/soc/img/img-spdif-in.c b/sound/soc/img/img-spdif-in.c
index 9646e9d3f0bc..3c513f5b8c54 100644
--- a/sound/soc/img/img-spdif-in.c
+++ b/sound/soc/img/img-spdif-in.c
@@ -878,7 +878,7 @@ static struct platform_driver img_spdif_in_driver = {
 		.pm = &img_spdif_in_pm_ops
 	},
 	.probe = img_spdif_in_probe,
-	.remove_new = img_spdif_in_dev_remove
+	.remove = img_spdif_in_dev_remove
 };
 module_platform_driver(img_spdif_in_driver);
 
diff --git a/sound/soc/img/img-spdif-out.c b/sound/soc/img/img-spdif-out.c
index dfa72afa946e..402695b5fc41 100644
--- a/sound/soc/img/img-spdif-out.c
+++ b/sound/soc/img/img-spdif-out.c
@@ -468,7 +468,7 @@ static struct platform_driver img_spdif_out_driver = {
 		.pm = &img_spdif_out_pm_ops
 	},
 	.probe = img_spdif_out_probe,
-	.remove_new = img_spdif_out_dev_remove
+	.remove = img_spdif_out_dev_remove
 };
 module_platform_driver(img_spdif_out_driver);
 
diff --git a/sound/soc/img/pistachio-internal-dac.c b/sound/soc/img/pistachio-internal-dac.c
index da6251680e41..fdeceb271e7f 100644
--- a/sound/soc/img/pistachio-internal-dac.c
+++ b/sound/soc/img/pistachio-internal-dac.c
@@ -271,7 +271,7 @@ static struct platform_driver pistachio_internal_dac_plat_driver = {
 		.pm = &pistachio_internal_dac_pm_ops
 	},
 	.probe = pistachio_internal_dac_probe,
-	.remove_new = pistachio_internal_dac_remove
+	.remove = pistachio_internal_dac_remove
 };
 module_platform_driver(pistachio_internal_dac_plat_driver);
 
diff --git a/sound/soc/intel/atom/sst-mfld-platform-pcm.c b/sound/soc/intel/atom/sst-mfld-platform-pcm.c
index 8652b4a20020..373d68b4cf88 100644
--- a/sound/soc/intel/atom/sst-mfld-platform-pcm.c
+++ b/sound/soc/intel/atom/sst-mfld-platform-pcm.c
@@ -812,7 +812,7 @@ static struct platform_driver sst_platform_driver = {
 		.pm             = &sst_platform_pm,
 	},
 	.probe		= sst_platform_probe,
-	.remove_new	= sst_platform_remove,
+	.remove		= sst_platform_remove,
 };
 
 module_platform_driver(sst_platform_driver);
diff --git a/sound/soc/intel/atom/sst/sst_acpi.c b/sound/soc/intel/atom/sst/sst_acpi.c
index 29d44c989e5f..9956dc63db74 100644
--- a/sound/soc/intel/atom/sst/sst_acpi.c
+++ b/sound/soc/intel/atom/sst/sst_acpi.c
@@ -358,7 +358,7 @@ static struct platform_driver sst_acpi_driver = {
 		.pm			= &intel_sst_pm,
 	},
 	.probe	= sst_acpi_probe,
-	.remove_new = sst_acpi_remove,
+	.remove = sst_acpi_remove,
 };
 
 module_platform_driver(sst_acpi_driver);
diff --git a/sound/soc/intel/boards/bytcht_es8316.c b/sound/soc/intel/boards/bytcht_es8316.c
index 3539c9ff0fd2..d3327bc237b5 100644
--- a/sound/soc/intel/boards/bytcht_es8316.c
+++ b/sound/soc/intel/boards/bytcht_es8316.c
@@ -709,7 +709,7 @@ static struct platform_driver snd_byt_cht_es8316_mc_driver = {
 		.name = "bytcht_es8316",
 	},
 	.probe = snd_byt_cht_es8316_mc_probe,
-	.remove_new = snd_byt_cht_es8316_mc_remove,
+	.remove = snd_byt_cht_es8316_mc_remove,
 };
 
 module_platform_driver(snd_byt_cht_es8316_mc_driver);
diff --git a/sound/soc/intel/boards/bytcr_rt5640.c b/sound/soc/intel/boards/bytcr_rt5640.c
index 4479825c08b5..2ed49acb4e36 100644
--- a/sound/soc/intel/boards/bytcr_rt5640.c
+++ b/sound/soc/intel/boards/bytcr_rt5640.c
@@ -1918,7 +1918,7 @@ static struct platform_driver snd_byt_rt5640_mc_driver = {
 		.name = "bytcr_rt5640",
 	},
 	.probe = snd_byt_rt5640_mc_probe,
-	.remove_new = snd_byt_rt5640_mc_remove,
+	.remove = snd_byt_rt5640_mc_remove,
 };
 
 module_platform_driver(snd_byt_rt5640_mc_driver);
diff --git a/sound/soc/intel/boards/bytcr_rt5651.c b/sound/soc/intel/boards/bytcr_rt5651.c
index 1f54da98aacf..8e4b821efe92 100644
--- a/sound/soc/intel/boards/bytcr_rt5651.c
+++ b/sound/soc/intel/boards/bytcr_rt5651.c
@@ -1142,7 +1142,7 @@ static struct platform_driver snd_byt_rt5651_mc_driver = {
 		.name = "bytcr_rt5651",
 	},
 	.probe = snd_byt_rt5651_mc_probe,
-	.remove_new = snd_byt_rt5651_mc_remove,
+	.remove = snd_byt_rt5651_mc_remove,
 };
 
 module_platform_driver(snd_byt_rt5651_mc_driver);
diff --git a/sound/soc/intel/boards/bytcr_wm5102.c b/sound/soc/intel/boards/bytcr_wm5102.c
index e5a7cc606aa9..0b10d89cb189 100644
--- a/sound/soc/intel/boards/bytcr_wm5102.c
+++ b/sound/soc/intel/boards/bytcr_wm5102.c
@@ -663,7 +663,7 @@ static struct platform_driver snd_byt_wm5102_mc_driver = {
 		.name = "bytcr_wm5102",
 	},
 	.probe = snd_byt_wm5102_mc_probe,
-	.remove_new = snd_byt_wm5102_mc_remove,
+	.remove = snd_byt_wm5102_mc_remove,
 };
 
 module_platform_driver(snd_byt_wm5102_mc_driver);
diff --git a/sound/soc/intel/boards/cht_bsw_max98090_ti.c b/sound/soc/intel/boards/cht_bsw_max98090_ti.c
index f43bc20d6aae..d7c114858833 100644
--- a/sound/soc/intel/boards/cht_bsw_max98090_ti.c
+++ b/sound/soc/intel/boards/cht_bsw_max98090_ti.c
@@ -637,7 +637,7 @@ static struct platform_driver snd_cht_mc_driver = {
 		.name = "cht-bsw-max98090",
 	},
 	.probe = snd_cht_mc_probe,
-	.remove_new = snd_cht_mc_remove,
+	.remove = snd_cht_mc_remove,
 };
 
 module_platform_driver(snd_cht_mc_driver)
diff --git a/sound/soc/intel/boards/sof_es8336.c b/sound/soc/intel/boards/sof_es8336.c
index 578271b4230a..fc998fe4b196 100644
--- a/sound/soc/intel/boards/sof_es8336.c
+++ b/sound/soc/intel/boards/sof_es8336.c
@@ -838,7 +838,7 @@ static struct platform_driver sof_es8336_driver = {
 		.pm = &snd_soc_pm_ops,
 	},
 	.probe = sof_es8336_probe,
-	.remove_new = sof_es8336_remove,
+	.remove = sof_es8336_remove,
 	.id_table = board_ids,
 };
 module_platform_driver(sof_es8336_driver);
diff --git a/sound/soc/intel/boards/sof_pcm512x.c b/sound/soc/intel/boards/sof_pcm512x.c
index b01cb2329542..5de883b9563e 100644
--- a/sound/soc/intel/boards/sof_pcm512x.c
+++ b/sound/soc/intel/boards/sof_pcm512x.c
@@ -430,7 +430,7 @@ static void sof_pcm512x_remove(struct platform_device *pdev)
 
 static struct platform_driver sof_audio = {
 	.probe = sof_audio_probe,
-	.remove_new = sof_pcm512x_remove,
+	.remove = sof_pcm512x_remove,
 	.driver = {
 		.name = "sof_pcm512x",
 		.pm = &snd_soc_pm_ops,
diff --git a/sound/soc/intel/boards/sof_sdw.c b/sound/soc/intel/boards/sof_sdw.c
index 855109d22131..f10ed95770ea 100644
--- a/sound/soc/intel/boards/sof_sdw.c
+++ b/sound/soc/intel/boards/sof_sdw.c
@@ -1368,7 +1368,7 @@ static struct platform_driver sof_sdw_driver = {
 		.pm = &snd_soc_pm_ops,
 	},
 	.probe = mc_probe,
-	.remove_new = mc_remove,
+	.remove = mc_remove,
 	.id_table = mc_id_table,
 };
 
diff --git a/sound/soc/intel/boards/sof_wm8804.c b/sound/soc/intel/boards/sof_wm8804.c
index 0a5ce34d7f7b..facc6c32cbfe 100644
--- a/sound/soc/intel/boards/sof_wm8804.c
+++ b/sound/soc/intel/boards/sof_wm8804.c
@@ -294,7 +294,7 @@ static struct platform_driver sof_wm8804_driver = {
 		.pm = &snd_soc_pm_ops,
 	},
 	.probe = sof_wm8804_probe,
-	.remove_new = sof_wm8804_remove,
+	.remove = sof_wm8804_remove,
 };
 module_platform_driver(sof_wm8804_driver);
 
diff --git a/sound/soc/intel/catpt/device.c b/sound/soc/intel/catpt/device.c
index 2e1fa79a04d4..2aa637124bec 100644
--- a/sound/soc/intel/catpt/device.c
+++ b/sound/soc/intel/catpt/device.c
@@ -374,7 +374,7 @@ MODULE_DEVICE_TABLE(acpi, catpt_ids);
 
 static struct platform_driver catpt_acpi_driver = {
 	.probe = catpt_acpi_probe,
-	.remove_new = catpt_acpi_remove,
+	.remove = catpt_acpi_remove,
 	.driver = {
 		.name = "intel_catpt",
 		.acpi_match_table = catpt_ids,
diff --git a/sound/soc/kirkwood/kirkwood-i2s.c b/sound/soc/kirkwood/kirkwood-i2s.c
index d1eb90310afa..99bd066c7309 100644
--- a/sound/soc/kirkwood/kirkwood-i2s.c
+++ b/sound/soc/kirkwood/kirkwood-i2s.c
@@ -759,7 +759,7 @@ MODULE_DEVICE_TABLE(of, mvebu_audio_of_match);
 
 static struct platform_driver kirkwood_i2s_driver = {
 	.probe  = kirkwood_i2s_dev_probe,
-	.remove_new = kirkwood_i2s_dev_remove,
+	.remove = kirkwood_i2s_dev_remove,
 	.driver = {
 		.name = DRV_NAME,
 		.of_match_table = of_match_ptr(mvebu_audio_of_match),
diff --git a/sound/soc/mediatek/common/mtk-btcvsd.c b/sound/soc/mediatek/common/mtk-btcvsd.c
index c12d170fa1de..d07f288f9752 100644
--- a/sound/soc/mediatek/common/mtk-btcvsd.c
+++ b/sound/soc/mediatek/common/mtk-btcvsd.c
@@ -1400,7 +1400,7 @@ static struct platform_driver mtk_btcvsd_snd_driver = {
 		.of_match_table = mtk_btcvsd_snd_dt_match,
 	},
 	.probe = mtk_btcvsd_snd_probe,
-	.remove_new = mtk_btcvsd_snd_remove,
+	.remove = mtk_btcvsd_snd_remove,
 };
 
 module_platform_driver(mtk_btcvsd_snd_driver);
diff --git a/sound/soc/mediatek/mt2701/mt2701-afe-pcm.c b/sound/soc/mediatek/mt2701/mt2701-afe-pcm.c
index 6a17deb874df..5f11bc5438bd 100644
--- a/sound/soc/mediatek/mt2701/mt2701-afe-pcm.c
+++ b/sound/soc/mediatek/mt2701/mt2701-afe-pcm.c
@@ -1473,7 +1473,7 @@ static struct platform_driver mt2701_afe_pcm_driver = {
 		   .pm = &mt2701_afe_pm_ops,
 	},
 	.probe = mt2701_afe_pcm_dev_probe,
-	.remove_new = mt2701_afe_pcm_dev_remove,
+	.remove = mt2701_afe_pcm_dev_remove,
 };
 
 module_platform_driver(mt2701_afe_pcm_driver);
diff --git a/sound/soc/mediatek/mt6797/mt6797-afe-pcm.c b/sound/soc/mediatek/mt6797/mt6797-afe-pcm.c
index c1dee119e93a..9159b42adf6a 100644
--- a/sound/soc/mediatek/mt6797/mt6797-afe-pcm.c
+++ b/sound/soc/mediatek/mt6797/mt6797-afe-pcm.c
@@ -890,7 +890,7 @@ static struct platform_driver mt6797_afe_pcm_driver = {
 		   .pm = &mt6797_afe_pm_ops,
 	},
 	.probe = mt6797_afe_pcm_dev_probe,
-	.remove_new = mt6797_afe_pcm_dev_remove,
+	.remove = mt6797_afe_pcm_dev_remove,
 };
 
 module_platform_driver(mt6797_afe_pcm_driver);
diff --git a/sound/soc/mediatek/mt7986/mt7986-afe-pcm.c b/sound/soc/mediatek/mt7986/mt7986-afe-pcm.c
index 572ded279b53..d400bea0ef9c 100644
--- a/sound/soc/mediatek/mt7986/mt7986-afe-pcm.c
+++ b/sound/soc/mediatek/mt7986/mt7986-afe-pcm.c
@@ -601,7 +601,7 @@ static struct platform_driver mt7986_afe_pcm_driver = {
 		   .pm = &mt7986_afe_pm_ops,
 	},
 	.probe = mt7986_afe_pcm_dev_probe,
-	.remove_new = mt7986_afe_pcm_dev_remove,
+	.remove = mt7986_afe_pcm_dev_remove,
 };
 module_platform_driver(mt7986_afe_pcm_driver);
 
diff --git a/sound/soc/mediatek/mt8173/mt8173-afe-pcm.c b/sound/soc/mediatek/mt8173/mt8173-afe-pcm.c
index b6291b7c811e..03250273ea9c 100644
--- a/sound/soc/mediatek/mt8173/mt8173-afe-pcm.c
+++ b/sound/soc/mediatek/mt8173/mt8173-afe-pcm.c
@@ -1223,7 +1223,7 @@ static struct platform_driver mt8173_afe_pcm_driver = {
 		   .pm = &mt8173_afe_pm_ops,
 	},
 	.probe = mt8173_afe_pcm_dev_probe,
-	.remove_new = mt8173_afe_pcm_dev_remove,
+	.remove = mt8173_afe_pcm_dev_remove,
 };
 
 module_platform_driver(mt8173_afe_pcm_driver);
diff --git a/sound/soc/mediatek/mt8183/mt8183-afe-pcm.c b/sound/soc/mediatek/mt8183/mt8183-afe-pcm.c
index 25348fdf75fa..3f377ba4ad53 100644
--- a/sound/soc/mediatek/mt8183/mt8183-afe-pcm.c
+++ b/sound/soc/mediatek/mt8183/mt8183-afe-pcm.c
@@ -1268,7 +1268,7 @@ static struct platform_driver mt8183_afe_pcm_driver = {
 		   .pm = &mt8183_afe_pm_ops,
 	},
 	.probe = mt8183_afe_pcm_dev_probe,
-	.remove_new = mt8183_afe_pcm_dev_remove,
+	.remove = mt8183_afe_pcm_dev_remove,
 };
 
 module_platform_driver(mt8183_afe_pcm_driver);
diff --git a/sound/soc/mediatek/mt8192/mt8192-afe-pcm.c b/sound/soc/mediatek/mt8192/mt8192-afe-pcm.c
index 424c5c68f78a..9b502f4cd6ea 100644
--- a/sound/soc/mediatek/mt8192/mt8192-afe-pcm.c
+++ b/sound/soc/mediatek/mt8192/mt8192-afe-pcm.c
@@ -2325,7 +2325,7 @@ static struct platform_driver mt8192_afe_pcm_driver = {
 		   .pm = &mt8192_afe_pm_ops,
 	},
 	.probe = mt8192_afe_pcm_dev_probe,
-	.remove_new = mt8192_afe_pcm_dev_remove,
+	.remove = mt8192_afe_pcm_dev_remove,
 };
 
 module_platform_driver(mt8192_afe_pcm_driver);
diff --git a/sound/soc/mediatek/mt8195/mt8195-afe-pcm.c b/sound/soc/mediatek/mt8195/mt8195-afe-pcm.c
index 38891d1bd18a..8016bfb35015 100644
--- a/sound/soc/mediatek/mt8195/mt8195-afe-pcm.c
+++ b/sound/soc/mediatek/mt8195/mt8195-afe-pcm.c
@@ -3199,7 +3199,7 @@ static struct platform_driver mt8195_afe_pcm_driver = {
 		   .pm = &mt8195_afe_pm_ops,
 	},
 	.probe = mt8195_afe_pcm_dev_probe,
-	.remove_new = mt8195_afe_pcm_dev_remove,
+	.remove = mt8195_afe_pcm_dev_remove,
 };
 
 module_platform_driver(mt8195_afe_pcm_driver);
diff --git a/sound/soc/mediatek/mt8365/mt8365-afe-pcm.c b/sound/soc/mediatek/mt8365/mt8365-afe-pcm.c
index df6dd8c5bbe5..49efcdea975e 100644
--- a/sound/soc/mediatek/mt8365/mt8365-afe-pcm.c
+++ b/sound/soc/mediatek/mt8365/mt8365-afe-pcm.c
@@ -2264,7 +2264,7 @@ static struct platform_driver mt8365_afe_pcm_driver = {
 		   .pm = &mt8365_afe_pm_ops,
 	},
 	.probe = mt8365_afe_pcm_dev_probe,
-	.remove_new = mt8365_afe_pcm_dev_remove,
+	.remove = mt8365_afe_pcm_dev_remove,
 };
 
 module_platform_driver(mt8365_afe_pcm_driver);
diff --git a/sound/soc/meson/aiu.c b/sound/soc/meson/aiu.c
index 5d1419ed7a62..f2890111c1d2 100644
--- a/sound/soc/meson/aiu.c
+++ b/sound/soc/meson/aiu.c
@@ -345,7 +345,7 @@ MODULE_DEVICE_TABLE(of, aiu_of_match);
 
 static struct platform_driver aiu_pdrv = {
 	.probe = aiu_probe,
-	.remove_new = aiu_remove,
+	.remove = aiu_remove,
 	.driver = {
 		.name = "meson-aiu",
 		.of_match_table = aiu_of_match,
diff --git a/sound/soc/meson/axg-card.c b/sound/soc/meson/axg-card.c
index 646ab87afac2..59deb332bd35 100644
--- a/sound/soc/meson/axg-card.c
+++ b/sound/soc/meson/axg-card.c
@@ -360,7 +360,7 @@ MODULE_DEVICE_TABLE(of, axg_card_of_match);
 
 static struct platform_driver axg_card_pdrv = {
 	.probe = meson_card_probe,
-	.remove_new = meson_card_remove,
+	.remove = meson_card_remove,
 	.driver = {
 		.name = "axg-sound-card",
 		.of_match_table = axg_card_of_match,
diff --git a/sound/soc/meson/gx-card.c b/sound/soc/meson/gx-card.c
index 7edca3e49c8f..455f6bfc9f8f 100644
--- a/sound/soc/meson/gx-card.c
+++ b/sound/soc/meson/gx-card.c
@@ -129,7 +129,7 @@ MODULE_DEVICE_TABLE(of, gx_card_of_match);
 
 static struct platform_driver gx_card_pdrv = {
 	.probe = meson_card_probe,
-	.remove_new = meson_card_remove,
+	.remove = meson_card_remove,
 	.driver = {
 		.name = "gx-sound-card",
 		.of_match_table = gx_card_of_match,
diff --git a/sound/soc/mxs/mxs-sgtl5000.c b/sound/soc/mxs/mxs-sgtl5000.c
index 310e3ac77424..a41a13ae38a5 100644
--- a/sound/soc/mxs/mxs-sgtl5000.c
+++ b/sound/soc/mxs/mxs-sgtl5000.c
@@ -185,7 +185,7 @@ static struct platform_driver mxs_sgtl5000_audio_driver = {
 		.of_match_table = mxs_sgtl5000_dt_ids,
 	},
 	.probe = mxs_sgtl5000_probe,
-	.remove_new = mxs_sgtl5000_remove,
+	.remove = mxs_sgtl5000_remove,
 };
 
 module_platform_driver(mxs_sgtl5000_audio_driver);
diff --git a/sound/soc/pxa/mmp-sspa.c b/sound/soc/pxa/mmp-sspa.c
index abfaf3cdf5bb..73f36c9dd35c 100644
--- a/sound/soc/pxa/mmp-sspa.c
+++ b/sound/soc/pxa/mmp-sspa.c
@@ -574,7 +574,7 @@ static struct platform_driver asoc_mmp_sspa_driver = {
 		.of_match_table = of_match_ptr(mmp_sspa_of_match),
 	},
 	.probe = asoc_mmp_sspa_probe,
-	.remove_new = asoc_mmp_sspa_remove,
+	.remove = asoc_mmp_sspa_remove,
 };
 
 module_platform_driver(asoc_mmp_sspa_driver);
diff --git a/sound/soc/pxa/pxa2xx-ac97.c b/sound/soc/pxa/pxa2xx-ac97.c
index 80e0ea0ec9fb..78f50032afc5 100644
--- a/sound/soc/pxa/pxa2xx-ac97.c
+++ b/sound/soc/pxa/pxa2xx-ac97.c
@@ -286,7 +286,7 @@ static DEFINE_SIMPLE_DEV_PM_OPS(pxa2xx_ac97_pm_ops,
 
 static struct platform_driver pxa2xx_ac97_driver = {
 	.probe		= pxa2xx_ac97_dev_probe,
-	.remove_new	= pxa2xx_ac97_dev_remove,
+	.remove		= pxa2xx_ac97_dev_remove,
 	.driver		= {
 		.name	= "pxa2xx-ac97",
 		.pm	= &pxa2xx_ac97_pm_ops,
diff --git a/sound/soc/qcom/lpass-apq8016.c b/sound/soc/qcom/lpass-apq8016.c
index 9005c85f8c54..b8f23414eb77 100644
--- a/sound/soc/qcom/lpass-apq8016.c
+++ b/sound/soc/qcom/lpass-apq8016.c
@@ -300,7 +300,7 @@ static struct platform_driver apq8016_lpass_cpu_platform_driver = {
 		.of_match_table	= of_match_ptr(apq8016_lpass_cpu_device_id),
 	},
 	.probe	= asoc_qcom_lpass_cpu_platform_probe,
-	.remove_new = asoc_qcom_lpass_cpu_platform_remove,
+	.remove = asoc_qcom_lpass_cpu_platform_remove,
 };
 module_platform_driver(apq8016_lpass_cpu_platform_driver);
 
diff --git a/sound/soc/qcom/lpass-ipq806x.c b/sound/soc/qcom/lpass-ipq806x.c
index 5c874139f39d..e57d29ea4ce7 100644
--- a/sound/soc/qcom/lpass-ipq806x.c
+++ b/sound/soc/qcom/lpass-ipq806x.c
@@ -172,7 +172,7 @@ static struct platform_driver ipq806x_lpass_cpu_platform_driver = {
 		.of_match_table	= of_match_ptr(ipq806x_lpass_cpu_device_id),
 	},
 	.probe	= asoc_qcom_lpass_cpu_platform_probe,
-	.remove_new = asoc_qcom_lpass_cpu_platform_remove,
+	.remove = asoc_qcom_lpass_cpu_platform_remove,
 };
 module_platform_driver(ipq806x_lpass_cpu_platform_driver);
 
diff --git a/sound/soc/qcom/lpass-sc7180.c b/sound/soc/qcom/lpass-sc7180.c
index e6bcdf6ed796..fbead6af3d95 100644
--- a/sound/soc/qcom/lpass-sc7180.c
+++ b/sound/soc/qcom/lpass-sc7180.c
@@ -315,7 +315,7 @@ static struct platform_driver sc7180_lpass_cpu_platform_driver = {
 		.pm = &sc7180_lpass_pm_ops,
 	},
 	.probe = asoc_qcom_lpass_cpu_platform_probe,
-	.remove_new = asoc_qcom_lpass_cpu_platform_remove,
+	.remove = asoc_qcom_lpass_cpu_platform_remove,
 	.shutdown = asoc_qcom_lpass_cpu_platform_shutdown,
 };
 
diff --git a/sound/soc/qcom/lpass-sc7280.c b/sound/soc/qcom/lpass-sc7280.c
index 47c622327a8d..7cd3e291382a 100644
--- a/sound/soc/qcom/lpass-sc7280.c
+++ b/sound/soc/qcom/lpass-sc7280.c
@@ -445,7 +445,7 @@ static struct platform_driver sc7280_lpass_cpu_platform_driver = {
 		.pm = &sc7280_lpass_pm_ops,
 	},
 	.probe = asoc_qcom_lpass_cpu_platform_probe,
-	.remove_new = asoc_qcom_lpass_cpu_platform_remove,
+	.remove = asoc_qcom_lpass_cpu_platform_remove,
 	.shutdown = asoc_qcom_lpass_cpu_platform_shutdown,
 };
 
diff --git a/sound/soc/qcom/qdsp6/q6routing.c b/sound/soc/qcom/qdsp6/q6routing.c
index 81fde0681f95..90228699ba7d 100644
--- a/sound/soc/qcom/qdsp6/q6routing.c
+++ b/sound/soc/qcom/qdsp6/q6routing.c
@@ -1161,7 +1161,7 @@ static struct platform_driver q6pcm_routing_platform_driver = {
 		.of_match_table = of_match_ptr(q6pcm_routing_device_id),
 	},
 	.probe = q6pcm_routing_probe,
-	.remove_new = q6pcm_routing_remove,
+	.remove = q6pcm_routing_remove,
 };
 module_platform_driver(q6pcm_routing_platform_driver);
 
diff --git a/sound/soc/rockchip/rockchip_i2s.c b/sound/soc/rockchip/rockchip_i2s.c
index b378f870b3ad..4315da4a47c1 100644
--- a/sound/soc/rockchip/rockchip_i2s.c
+++ b/sound/soc/rockchip/rockchip_i2s.c
@@ -866,7 +866,7 @@ static const struct dev_pm_ops rockchip_i2s_pm_ops = {
 
 static struct platform_driver rockchip_i2s_driver = {
 	.probe = rockchip_i2s_probe,
-	.remove_new = rockchip_i2s_remove,
+	.remove = rockchip_i2s_remove,
 	.driver = {
 		.name = DRV_NAME,
 		.of_match_table = of_match_ptr(rockchip_i2s_match),
diff --git a/sound/soc/rockchip/rockchip_i2s_tdm.c b/sound/soc/rockchip/rockchip_i2s_tdm.c
index ee517d7b5b7b..d1f28699652f 100644
--- a/sound/soc/rockchip/rockchip_i2s_tdm.c
+++ b/sound/soc/rockchip/rockchip_i2s_tdm.c
@@ -1423,7 +1423,7 @@ static const struct dev_pm_ops rockchip_i2s_tdm_pm_ops = {
 
 static struct platform_driver rockchip_i2s_tdm_driver = {
 	.probe = rockchip_i2s_tdm_probe,
-	.remove_new = rockchip_i2s_tdm_remove,
+	.remove = rockchip_i2s_tdm_remove,
 	.driver = {
 		.name = DRV_NAME,
 		.of_match_table = rockchip_i2s_tdm_match,
diff --git a/sound/soc/rockchip/rockchip_pdm.c b/sound/soc/rockchip/rockchip_pdm.c
index d16a4a67a6a2..cae91108f7a8 100644
--- a/sound/soc/rockchip/rockchip_pdm.c
+++ b/sound/soc/rockchip/rockchip_pdm.c
@@ -703,7 +703,7 @@ static const struct dev_pm_ops rockchip_pdm_pm_ops = {
 
 static struct platform_driver rockchip_pdm_driver = {
 	.probe  = rockchip_pdm_probe,
-	.remove_new = rockchip_pdm_remove,
+	.remove = rockchip_pdm_remove,
 	.driver = {
 		.name = "rockchip-pdm",
 		.of_match_table = of_match_ptr(rockchip_pdm_match),
diff --git a/sound/soc/rockchip/rockchip_rt5645.c b/sound/soc/rockchip/rockchip_rt5645.c
index 449f62820045..b085d80ea2e4 100644
--- a/sound/soc/rockchip/rockchip_rt5645.c
+++ b/sound/soc/rockchip/rockchip_rt5645.c
@@ -233,7 +233,7 @@ MODULE_DEVICE_TABLE(of, rockchip_rt5645_of_match);
 
 static struct platform_driver snd_rk_mc_driver = {
 	.probe = snd_rk_mc_probe,
-	.remove_new = snd_rk_mc_remove,
+	.remove = snd_rk_mc_remove,
 	.driver = {
 		.name = DRV_NAME,
 		.pm = &snd_soc_pm_ops,
diff --git a/sound/soc/rockchip/rockchip_spdif.c b/sound/soc/rockchip/rockchip_spdif.c
index eb9d5dee196e..d87c0e4f6f91 100644
--- a/sound/soc/rockchip/rockchip_spdif.c
+++ b/sound/soc/rockchip/rockchip_spdif.c
@@ -380,7 +380,7 @@ static const struct dev_pm_ops rk_spdif_pm_ops = {
 
 static struct platform_driver rk_spdif_driver = {
 	.probe = rk_spdif_probe,
-	.remove_new = rk_spdif_remove,
+	.remove = rk_spdif_remove,
 	.driver = {
 		.name = "rockchip-spdif",
 		.of_match_table = of_match_ptr(rk_spdif_match),
diff --git a/sound/soc/samsung/arndale.c b/sound/soc/samsung/arndale.c
index f02873b6ce7f..9619f550608c 100644
--- a/sound/soc/samsung/arndale.c
+++ b/sound/soc/samsung/arndale.c
@@ -207,7 +207,7 @@ static struct platform_driver arndale_audio_driver = {
 		.of_match_table = arndale_audio_of_match,
 	},
 	.probe = arndale_audio_probe,
-	.remove_new = arndale_audio_remove,
+	.remove = arndale_audio_remove,
 };
 
 module_platform_driver(arndale_audio_driver);
diff --git a/sound/soc/samsung/i2s.c b/sound/soc/samsung/i2s.c
index 1bcabb114e29..8f6deb06e234 100644
--- a/sound/soc/samsung/i2s.c
+++ b/sound/soc/samsung/i2s.c
@@ -1741,7 +1741,7 @@ static const struct dev_pm_ops samsung_i2s_pm = {
 
 static struct platform_driver samsung_i2s_driver = {
 	.probe  = samsung_i2s_probe,
-	.remove_new = samsung_i2s_remove,
+	.remove = samsung_i2s_remove,
 	.id_table = samsung_i2s_driver_ids,
 	.driver = {
 		.name = "samsung-i2s",
diff --git a/sound/soc/samsung/odroid.c b/sound/soc/samsung/odroid.c
index 110ae14dd7ea..ed865cc07e2e 100644
--- a/sound/soc/samsung/odroid.c
+++ b/sound/soc/samsung/odroid.c
@@ -341,7 +341,7 @@ static struct platform_driver odroid_audio_driver = {
 		.pm		= &snd_soc_pm_ops,
 	},
 	.probe	= odroid_audio_probe,
-	.remove_new = odroid_audio_remove,
+	.remove = odroid_audio_remove,
 };
 module_platform_driver(odroid_audio_driver);
 
diff --git a/sound/soc/samsung/pcm.c b/sound/soc/samsung/pcm.c
index 573b2dee7f07..a03ba9374c2e 100644
--- a/sound/soc/samsung/pcm.c
+++ b/sound/soc/samsung/pcm.c
@@ -590,7 +590,7 @@ static void s3c_pcm_dev_remove(struct platform_device *pdev)
 
 static struct platform_driver s3c_pcm_driver = {
 	.probe  = s3c_pcm_dev_probe,
-	.remove_new = s3c_pcm_dev_remove,
+	.remove = s3c_pcm_dev_remove,
 	.driver = {
 		.name = "samsung-pcm",
 	},
diff --git a/sound/soc/samsung/snow.c b/sound/soc/samsung/snow.c
index aad0f9b4d4fc..4bbe7bcdb845 100644
--- a/sound/soc/samsung/snow.c
+++ b/sound/soc/samsung/snow.c
@@ -245,7 +245,7 @@ static struct platform_driver snow_driver = {
 		.of_match_table = snow_of_match,
 	},
 	.probe = snow_probe,
-	.remove_new = snow_remove,
+	.remove = snow_remove,
 };
 
 module_platform_driver(snow_driver);
diff --git a/sound/soc/samsung/spdif.c b/sound/soc/samsung/spdif.c
index f44e3180e8d3..235d0063d1b3 100644
--- a/sound/soc/samsung/spdif.c
+++ b/sound/soc/samsung/spdif.c
@@ -476,7 +476,7 @@ static void spdif_remove(struct platform_device *pdev)
 
 static struct platform_driver samsung_spdif_driver = {
 	.probe	= spdif_probe,
-	.remove_new = spdif_remove,
+	.remove = spdif_remove,
 	.driver	= {
 		.name	= "samsung-spdif",
 	},
diff --git a/sound/soc/sh/fsi.c b/sound/soc/sh/fsi.c
index 087e379aa3bc..221ce91f1950 100644
--- a/sound/soc/sh/fsi.c
+++ b/sound/soc/sh/fsi.c
@@ -2107,7 +2107,7 @@ static struct platform_driver fsi_driver = {
 		.of_match_table = fsi_of_match,
 	},
 	.probe		= fsi_probe,
-	.remove_new	= fsi_remove,
+	.remove		= fsi_remove,
 	.id_table	= fsi_id_table,
 };
 
diff --git a/sound/soc/sh/hac.c b/sound/soc/sh/hac.c
index cc200f45826c..db618c09d1e0 100644
--- a/sound/soc/sh/hac.c
+++ b/sound/soc/sh/hac.c
@@ -334,7 +334,7 @@ static struct platform_driver hac_pcm_driver = {
 	},
 
 	.probe = hac_soc_platform_probe,
-	.remove_new = hac_soc_platform_remove,
+	.remove = hac_soc_platform_remove,
 };
 
 module_platform_driver(hac_pcm_driver);
diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c
index 15cb5e7008f9..9784718a2b6f 100644
--- a/sound/soc/sh/rcar/core.c
+++ b/sound/soc/sh/rcar/core.c
@@ -2087,7 +2087,7 @@ static struct platform_driver rsnd_driver = {
 		.of_match_table = rsnd_of_match,
 	},
 	.probe		= rsnd_probe,
-	.remove_new	= rsnd_remove,
+	.remove		= rsnd_remove,
 };
 module_platform_driver(rsnd_driver);
 
diff --git a/sound/soc/sh/rz-ssi.c b/sound/soc/sh/rz-ssi.c
index d0bf0487bf1b..040ce0431fd2 100644
--- a/sound/soc/sh/rz-ssi.c
+++ b/sound/soc/sh/rz-ssi.c
@@ -1204,7 +1204,7 @@ static struct platform_driver rz_ssi_driver = {
 		.of_match_table = rz_ssi_of_match,
 	},
 	.probe		= rz_ssi_probe,
-	.remove_new	= rz_ssi_remove,
+	.remove		= rz_ssi_remove,
 };
 
 module_platform_driver(rz_ssi_driver);
diff --git a/sound/soc/sh/siu_dai.c b/sound/soc/sh/siu_dai.c
index d0b5c543fd2f..7e771a164a80 100644
--- a/sound/soc/sh/siu_dai.c
+++ b/sound/soc/sh/siu_dai.c
@@ -788,7 +788,7 @@ static struct platform_driver siu_driver = {
 		.name	= "siu-pcm-audio",
 	},
 	.probe		= siu_probe,
-	.remove_new	= siu_remove,
+	.remove		= siu_remove,
 };
 
 module_platform_driver(siu_driver);
diff --git a/sound/soc/sof/imx/imx8.c b/sound/soc/sof/imx/imx8.c
index 9f24e3c283dd..f09ee0dea2cc 100644
--- a/sound/soc/sof/imx/imx8.c
+++ b/sound/soc/sof/imx/imx8.c
@@ -658,7 +658,7 @@ MODULE_DEVICE_TABLE(of, sof_of_imx8_ids);
 /* DT driver definition */
 static struct platform_driver snd_sof_of_imx8_driver = {
 	.probe = sof_of_probe,
-	.remove_new = sof_of_remove,
+	.remove = sof_of_remove,
 	.driver = {
 		.name = "sof-audio-of-imx8",
 		.pm = &sof_of_pm,
diff --git a/sound/soc/sof/imx/imx8m.c b/sound/soc/sof/imx/imx8m.c
index cdd1e79ef9f6..01d3ad3314f3 100644
--- a/sound/soc/sof/imx/imx8m.c
+++ b/sound/soc/sof/imx/imx8m.c
@@ -505,7 +505,7 @@ MODULE_DEVICE_TABLE(of, sof_of_imx8m_ids);
 /* DT driver definition */
 static struct platform_driver snd_sof_of_imx8m_driver = {
 	.probe = sof_of_probe,
-	.remove_new = sof_of_remove,
+	.remove = sof_of_remove,
 	.driver = {
 		.name = "sof-audio-of-imx8m",
 		.pm = &sof_of_pm,
diff --git a/sound/soc/sof/imx/imx8ulp.c b/sound/soc/sof/imx/imx8ulp.c
index 2585b1beef23..e5eee1c9f6da 100644
--- a/sound/soc/sof/imx/imx8ulp.c
+++ b/sound/soc/sof/imx/imx8ulp.c
@@ -507,7 +507,7 @@ MODULE_DEVICE_TABLE(of, sof_of_imx8ulp_ids);
 /* DT driver definition */
 static struct platform_driver snd_sof_of_imx8ulp_driver = {
 	.probe = sof_of_probe,
-	.remove_new = sof_of_remove,
+	.remove = sof_of_remove,
 	.driver = {
 		.name = "sof-audio-of-imx8ulp",
 		.pm = &sof_of_pm,
diff --git a/sound/soc/sof/intel/bdw.c b/sound/soc/sof/intel/bdw.c
index 7f18080e4e19..322ff118f0f6 100644
--- a/sound/soc/sof/intel/bdw.c
+++ b/sound/soc/sof/intel/bdw.c
@@ -684,7 +684,7 @@ static int sof_broadwell_probe(struct platform_device *pdev)
 /* acpi_driver definition */
 static struct platform_driver snd_sof_acpi_intel_bdw_driver = {
 	.probe = sof_broadwell_probe,
-	.remove_new = sof_acpi_remove,
+	.remove = sof_acpi_remove,
 	.driver = {
 		.name = "sof-audio-acpi-intel-bdw",
 		.pm = &sof_acpi_pm,
diff --git a/sound/soc/sof/intel/byt.c b/sound/soc/sof/intel/byt.c
index 7a57e162fb1c..f531710cf94e 100644
--- a/sound/soc/sof/intel/byt.c
+++ b/sound/soc/sof/intel/byt.c
@@ -465,7 +465,7 @@ static int sof_baytrail_probe(struct platform_device *pdev)
 /* acpi_driver definition */
 static struct platform_driver snd_sof_acpi_intel_byt_driver = {
 	.probe = sof_baytrail_probe,
-	.remove_new = sof_acpi_remove,
+	.remove = sof_acpi_remove,
 	.driver = {
 		.name = "sof-audio-acpi-intel-byt",
 		.pm = &sof_acpi_pm,
diff --git a/sound/soc/sof/mediatek/mt8186/mt8186.c b/sound/soc/sof/mediatek/mt8186/mt8186.c
index 74522400207e..9466f7d2e535 100644
--- a/sound/soc/sof/mediatek/mt8186/mt8186.c
+++ b/sound/soc/sof/mediatek/mt8186/mt8186.c
@@ -656,7 +656,7 @@ MODULE_DEVICE_TABLE(of, sof_of_mt8186_ids);
 /* DT driver definition */
 static struct platform_driver snd_sof_of_mt8186_driver = {
 	.probe = sof_of_probe,
-	.remove_new = sof_of_remove,
+	.remove = sof_of_remove,
 	.shutdown = sof_of_shutdown,
 	.driver = {
 	.name = "sof-audio-of-mt8186",
diff --git a/sound/soc/sof/mediatek/mt8195/mt8195.c b/sound/soc/sof/mediatek/mt8195/mt8195.c
index 82d221f53a46..5b4423ed8023 100644
--- a/sound/soc/sof/mediatek/mt8195/mt8195.c
+++ b/sound/soc/sof/mediatek/mt8195/mt8195.c
@@ -612,7 +612,7 @@ MODULE_DEVICE_TABLE(of, sof_of_mt8195_ids);
 /* DT driver definition */
 static struct platform_driver snd_sof_of_mt8195_driver = {
 	.probe = sof_of_probe,
-	.remove_new = sof_of_remove,
+	.remove = sof_of_remove,
 	.shutdown = sof_of_shutdown,
 	.driver = {
 	.name = "sof-audio-of-mt8195",
diff --git a/sound/soc/sprd/sprd-mcdt.c b/sound/soc/sprd/sprd-mcdt.c
index 688419c6b092..814a1cde1d35 100644
--- a/sound/soc/sprd/sprd-mcdt.c
+++ b/sound/soc/sprd/sprd-mcdt.c
@@ -993,7 +993,7 @@ MODULE_DEVICE_TABLE(of, sprd_mcdt_of_match);
 
 static struct platform_driver sprd_mcdt_driver = {
 	.probe = sprd_mcdt_probe,
-	.remove_new = sprd_mcdt_remove,
+	.remove = sprd_mcdt_remove,
 	.driver = {
 		.name = "sprd-mcdt",
 		.of_match_table = sprd_mcdt_of_match,
diff --git a/sound/soc/starfive/jh7110_pwmdac.c b/sound/soc/starfive/jh7110_pwmdac.c
index 4a4dd431b82b..a603dd17931c 100644
--- a/sound/soc/starfive/jh7110_pwmdac.c
+++ b/sound/soc/starfive/jh7110_pwmdac.c
@@ -516,7 +516,7 @@ static struct platform_driver jh7110_pwmdac_driver = {
 		.pm = pm_ptr(&jh7110_pwmdac_pm_ops),
 	},
 	.probe		= jh7110_pwmdac_probe,
-	.remove_new	= jh7110_pwmdac_remove,
+	.remove		= jh7110_pwmdac_remove,
 };
 module_platform_driver(jh7110_pwmdac_driver);
 
diff --git a/sound/soc/starfive/jh7110_tdm.c b/sound/soc/starfive/jh7110_tdm.c
index 1e0ff6720747..d38090e68df5 100644
--- a/sound/soc/starfive/jh7110_tdm.c
+++ b/sound/soc/starfive/jh7110_tdm.c
@@ -660,7 +660,7 @@ static struct platform_driver jh7110_tdm_driver = {
 		.pm = pm_ptr(&jh7110_tdm_pm_ops),
 	},
 	.probe = jh7110_tdm_probe,
-	.remove_new = jh7110_tdm_dev_remove,
+	.remove = jh7110_tdm_dev_remove,
 };
 module_platform_driver(jh7110_tdm_driver);
 
diff --git a/sound/soc/stm/stm32_adfsdm.c b/sound/soc/stm/stm32_adfsdm.c
index fb5dd9a68bea..9351727dce1a 100644
--- a/sound/soc/stm/stm32_adfsdm.c
+++ b/sound/soc/stm/stm32_adfsdm.c
@@ -398,7 +398,7 @@ static struct platform_driver stm32_adfsdm_driver = {
 		   .of_match_table = stm32_adfsdm_of_match,
 		   },
 	.probe = stm32_adfsdm_probe,
-	.remove_new = stm32_adfsdm_remove,
+	.remove = stm32_adfsdm_remove,
 };
 
 module_platform_driver(stm32_adfsdm_driver);
diff --git a/sound/soc/stm/stm32_i2s.c b/sound/soc/stm/stm32_i2s.c
index a96aa308681a..faa00103ee7f 100644
--- a/sound/soc/stm/stm32_i2s.c
+++ b/sound/soc/stm/stm32_i2s.c
@@ -1216,7 +1216,7 @@ static struct platform_driver stm32_i2s_driver = {
 		.pm = &stm32_i2s_pm_ops,
 	},
 	.probe = stm32_i2s_probe,
-	.remove_new = stm32_i2s_remove,
+	.remove = stm32_i2s_remove,
 };
 
 module_platform_driver(stm32_i2s_driver);
diff --git a/sound/soc/stm/stm32_sai_sub.c b/sound/soc/stm/stm32_sai_sub.c
index ad2492efb1cd..7bc4a96b7503 100644
--- a/sound/soc/stm/stm32_sai_sub.c
+++ b/sound/soc/stm/stm32_sai_sub.c
@@ -1619,7 +1619,7 @@ static struct platform_driver stm32_sai_sub_driver = {
 		.pm = &stm32_sai_sub_pm_ops,
 	},
 	.probe = stm32_sai_sub_probe,
-	.remove_new = stm32_sai_sub_remove,
+	.remove = stm32_sai_sub_remove,
 };
 
 module_platform_driver(stm32_sai_sub_driver);
diff --git a/sound/soc/stm/stm32_spdifrx.c b/sound/soc/stm/stm32_spdifrx.c
index 9eed3c57e3f1..d1b32ba1e1a2 100644
--- a/sound/soc/stm/stm32_spdifrx.c
+++ b/sound/soc/stm/stm32_spdifrx.c
@@ -1072,7 +1072,7 @@ static struct platform_driver stm32_spdifrx_driver = {
 		.pm = &stm32_spdifrx_pm_ops,
 	},
 	.probe = stm32_spdifrx_probe,
-	.remove_new = stm32_spdifrx_remove,
+	.remove = stm32_spdifrx_remove,
 };
 
 module_platform_driver(stm32_spdifrx_driver);
diff --git a/sound/soc/sunxi/sun4i-codec.c b/sound/soc/sunxi/sun4i-codec.c
index 25af47b63bdd..330bc0c09f56 100644
--- a/sound/soc/sunxi/sun4i-codec.c
+++ b/sound/soc/sunxi/sun4i-codec.c
@@ -1828,7 +1828,7 @@ static struct platform_driver sun4i_codec_driver = {
 		.of_match_table = sun4i_codec_of_match,
 	},
 	.probe = sun4i_codec_probe,
-	.remove_new = sun4i_codec_remove,
+	.remove = sun4i_codec_remove,
 };
 module_platform_driver(sun4i_codec_driver);
 
diff --git a/sound/soc/sunxi/sun4i-i2s.c b/sound/soc/sunxi/sun4i-i2s.c
index 3af0b2aab291..40de99a34bc3 100644
--- a/sound/soc/sunxi/sun4i-i2s.c
+++ b/sound/soc/sunxi/sun4i-i2s.c
@@ -1684,7 +1684,7 @@ static const struct dev_pm_ops sun4i_i2s_pm_ops = {
 
 static struct platform_driver sun4i_i2s_driver = {
 	.probe	= sun4i_i2s_probe,
-	.remove_new = sun4i_i2s_remove,
+	.remove = sun4i_i2s_remove,
 	.driver	= {
 		.name		= "sun4i-i2s",
 		.of_match_table	= sun4i_i2s_match,
diff --git a/sound/soc/sunxi/sun4i-spdif.c b/sound/soc/sunxi/sun4i-spdif.c
index f41c30955857..0aa416423246 100644
--- a/sound/soc/sunxi/sun4i-spdif.c
+++ b/sound/soc/sunxi/sun4i-spdif.c
@@ -726,7 +726,7 @@ static struct platform_driver sun4i_spdif_driver = {
 		.pm	= &sun4i_spdif_pm,
 	},
 	.probe		= sun4i_spdif_probe,
-	.remove_new	= sun4i_spdif_remove,
+	.remove		= sun4i_spdif_remove,
 };
 
 module_platform_driver(sun4i_spdif_driver);
diff --git a/sound/soc/sunxi/sun50i-dmic.c b/sound/soc/sunxi/sun50i-dmic.c
index 884394ddaf86..3e751b5694fe 100644
--- a/sound/soc/sunxi/sun50i-dmic.c
+++ b/sound/soc/sunxi/sun50i-dmic.c
@@ -426,7 +426,7 @@ static struct platform_driver sun50i_dmic_driver = {
 		.pm     = &sun50i_dmic_pm,
 	},
 	.probe          = sun50i_dmic_probe,
-	.remove_new     = sun50i_dmic_remove,
+	.remove         = sun50i_dmic_remove,
 };
 
 module_platform_driver(sun50i_dmic_driver);
diff --git a/sound/soc/sunxi/sun8i-codec.c b/sound/soc/sunxi/sun8i-codec.c
index b5dafb749c3f..8c645e04d571 100644
--- a/sound/soc/sunxi/sun8i-codec.c
+++ b/sound/soc/sunxi/sun8i-codec.c
@@ -1713,7 +1713,7 @@ static struct platform_driver sun8i_codec_driver = {
 		.pm = &sun8i_codec_pm_ops,
 	},
 	.probe = sun8i_codec_probe,
-	.remove_new = sun8i_codec_remove,
+	.remove = sun8i_codec_remove,
 };
 module_platform_driver(sun8i_codec_driver);
 
diff --git a/sound/soc/tegra/tegra186_asrc.c b/sound/soc/tegra/tegra186_asrc.c
index 22af5135d77a..d914dba56013 100644
--- a/sound/soc/tegra/tegra186_asrc.c
+++ b/sound/soc/tegra/tegra186_asrc.c
@@ -1034,7 +1034,7 @@ static struct platform_driver tegra186_asrc_driver = {
 		.pm = &tegra186_asrc_pm_ops,
 	},
 	.probe = tegra186_asrc_platform_probe,
-	.remove_new = tegra186_asrc_platform_remove,
+	.remove = tegra186_asrc_platform_remove,
 };
 module_platform_driver(tegra186_asrc_driver)
 
diff --git a/sound/soc/tegra/tegra186_dspk.c b/sound/soc/tegra/tegra186_dspk.c
index 21cd41fec7a9..508128b7783e 100644
--- a/sound/soc/tegra/tegra186_dspk.c
+++ b/sound/soc/tegra/tegra186_dspk.c
@@ -542,7 +542,7 @@ static struct platform_driver tegra186_dspk_driver = {
 		.pm = &tegra186_dspk_pm_ops,
 	},
 	.probe = tegra186_dspk_platform_probe,
-	.remove_new = tegra186_dspk_platform_remove,
+	.remove = tegra186_dspk_platform_remove,
 };
 module_platform_driver(tegra186_dspk_driver);
 
diff --git a/sound/soc/tegra/tegra20_ac97.c b/sound/soc/tegra/tegra20_ac97.c
index 8011afe93c96..08c58e8f3c22 100644
--- a/sound/soc/tegra/tegra20_ac97.c
+++ b/sound/soc/tegra/tegra20_ac97.c
@@ -448,7 +448,7 @@ static struct platform_driver tegra20_ac97_driver = {
 		.of_match_table = tegra20_ac97_of_match,
 	},
 	.probe = tegra20_ac97_platform_probe,
-	.remove_new = tegra20_ac97_platform_remove,
+	.remove = tegra20_ac97_platform_remove,
 };
 module_platform_driver(tegra20_ac97_driver);
 
diff --git a/sound/soc/tegra/tegra20_i2s.c b/sound/soc/tegra/tegra20_i2s.c
index f11618e8f13e..3b9823d1a87a 100644
--- a/sound/soc/tegra/tegra20_i2s.c
+++ b/sound/soc/tegra/tegra20_i2s.c
@@ -500,7 +500,7 @@ static struct platform_driver tegra20_i2s_driver = {
 		.pm = &tegra20_i2s_pm_ops,
 	},
 	.probe = tegra20_i2s_platform_probe,
-	.remove_new = tegra20_i2s_platform_remove,
+	.remove = tegra20_i2s_platform_remove,
 };
 module_platform_driver(tegra20_i2s_driver);
 
diff --git a/sound/soc/tegra/tegra210_admaif.c b/sound/soc/tegra/tegra210_admaif.c
index 9f9334e48049..a866aeb2719d 100644
--- a/sound/soc/tegra/tegra210_admaif.c
+++ b/sound/soc/tegra/tegra210_admaif.c
@@ -856,7 +856,7 @@ static const struct dev_pm_ops tegra_admaif_pm_ops = {
 
 static struct platform_driver tegra_admaif_driver = {
 	.probe = tegra_admaif_probe,
-	.remove_new = tegra_admaif_remove,
+	.remove = tegra_admaif_remove,
 	.driver = {
 		.name = "tegra210-admaif",
 		.of_match_table = tegra_admaif_of_match,
diff --git a/sound/soc/tegra/tegra210_adx.c b/sound/soc/tegra/tegra210_adx.c
index d2530443a221..109f763fe211 100644
--- a/sound/soc/tegra/tegra210_adx.c
+++ b/sound/soc/tegra/tegra210_adx.c
@@ -532,7 +532,7 @@ static struct platform_driver tegra210_adx_driver = {
 		.pm = &tegra210_adx_pm_ops,
 	},
 	.probe = tegra210_adx_platform_probe,
-	.remove_new = tegra210_adx_platform_remove,
+	.remove = tegra210_adx_platform_remove,
 };
 module_platform_driver(tegra210_adx_driver);
 
diff --git a/sound/soc/tegra/tegra210_ahub.c b/sound/soc/tegra/tegra210_ahub.c
index ab3c6b2544d2..1920b996e9aa 100644
--- a/sound/soc/tegra/tegra210_ahub.c
+++ b/sound/soc/tegra/tegra210_ahub.c
@@ -1416,7 +1416,7 @@ static const struct dev_pm_ops tegra_ahub_pm_ops = {
 
 static struct platform_driver tegra_ahub_driver = {
 	.probe = tegra_ahub_probe,
-	.remove_new = tegra_ahub_remove,
+	.remove = tegra_ahub_remove,
 	.driver = {
 		.name = "tegra210-ahub",
 		.of_match_table = tegra_ahub_of_match,
diff --git a/sound/soc/tegra/tegra210_amx.c b/sound/soc/tegra/tegra210_amx.c
index 91e405909e0f..38a2d6ec033b 100644
--- a/sound/soc/tegra/tegra210_amx.c
+++ b/sound/soc/tegra/tegra210_amx.c
@@ -589,7 +589,7 @@ static struct platform_driver tegra210_amx_driver = {
 		.pm = &tegra210_amx_pm_ops,
 	},
 	.probe = tegra210_amx_platform_probe,
-	.remove_new = tegra210_amx_platform_remove,
+	.remove = tegra210_amx_platform_remove,
 };
 module_platform_driver(tegra210_amx_driver);
 
diff --git a/sound/soc/tegra/tegra210_dmic.c b/sound/soc/tegra/tegra210_dmic.c
index e53c0278ae9a..d9b577f146dc 100644
--- a/sound/soc/tegra/tegra210_dmic.c
+++ b/sound/soc/tegra/tegra210_dmic.c
@@ -559,7 +559,7 @@ static struct platform_driver tegra210_dmic_driver = {
 		.pm = &tegra210_dmic_pm_ops,
 	},
 	.probe = tegra210_dmic_probe,
-	.remove_new = tegra210_dmic_remove,
+	.remove = tegra210_dmic_remove,
 };
 module_platform_driver(tegra210_dmic_driver)
 
diff --git a/sound/soc/tegra/tegra210_i2s.c b/sound/soc/tegra/tegra210_i2s.c
index e93ceb7afb4c..a3908b15dfdc 100644
--- a/sound/soc/tegra/tegra210_i2s.c
+++ b/sound/soc/tegra/tegra210_i2s.c
@@ -1019,7 +1019,7 @@ static struct platform_driver tegra210_i2s_driver = {
 		.pm = &tegra210_i2s_pm_ops,
 	},
 	.probe = tegra210_i2s_probe,
-	.remove_new = tegra210_i2s_remove,
+	.remove = tegra210_i2s_remove,
 };
 module_platform_driver(tegra210_i2s_driver)
 
diff --git a/sound/soc/tegra/tegra210_mixer.c b/sound/soc/tegra/tegra210_mixer.c
index 024614f6ec0b..e07e2f1d2f70 100644
--- a/sound/soc/tegra/tegra210_mixer.c
+++ b/sound/soc/tegra/tegra210_mixer.c
@@ -674,7 +674,7 @@ static struct platform_driver tegra210_mixer_driver = {
 		.pm = &tegra210_mixer_pm_ops,
 	},
 	.probe = tegra210_mixer_platform_probe,
-	.remove_new = tegra210_mixer_platform_remove,
+	.remove = tegra210_mixer_platform_remove,
 };
 module_platform_driver(tegra210_mixer_driver);
 
diff --git a/sound/soc/tegra/tegra210_mvc.c b/sound/soc/tegra/tegra210_mvc.c
index b89f5edafa03..4ead52564ab6 100644
--- a/sound/soc/tegra/tegra210_mvc.c
+++ b/sound/soc/tegra/tegra210_mvc.c
@@ -766,7 +766,7 @@ static struct platform_driver tegra210_mvc_driver = {
 		.pm = &tegra210_mvc_pm_ops,
 	},
 	.probe = tegra210_mvc_platform_probe,
-	.remove_new = tegra210_mvc_platform_remove,
+	.remove = tegra210_mvc_platform_remove,
 };
 module_platform_driver(tegra210_mvc_driver)
 
diff --git a/sound/soc/tegra/tegra210_ope.c b/sound/soc/tegra/tegra210_ope.c
index 136ed17f3650..e2bc604e8b79 100644
--- a/sound/soc/tegra/tegra210_ope.c
+++ b/sound/soc/tegra/tegra210_ope.c
@@ -407,7 +407,7 @@ static struct platform_driver tegra210_ope_driver = {
 		.pm = &tegra210_ope_pm_ops,
 	},
 	.probe = tegra210_ope_probe,
-	.remove_new = tegra210_ope_remove,
+	.remove = tegra210_ope_remove,
 };
 module_platform_driver(tegra210_ope_driver)
 
diff --git a/sound/soc/tegra/tegra210_sfc.c b/sound/soc/tegra/tegra210_sfc.c
index 028747c44f37..e16bbb44cc77 100644
--- a/sound/soc/tegra/tegra210_sfc.c
+++ b/sound/soc/tegra/tegra210_sfc.c
@@ -3631,7 +3631,7 @@ static struct platform_driver tegra210_sfc_driver = {
 		.pm = &tegra210_sfc_pm_ops,
 	},
 	.probe = tegra210_sfc_platform_probe,
-	.remove_new = tegra210_sfc_platform_remove,
+	.remove = tegra210_sfc_platform_remove,
 };
 module_platform_driver(tegra210_sfc_driver)
 
diff --git a/sound/soc/tegra/tegra30_ahub.c b/sound/soc/tegra/tegra30_ahub.c
index d2e8078e444a..c9b52f54cea8 100644
--- a/sound/soc/tegra/tegra30_ahub.c
+++ b/sound/soc/tegra/tegra30_ahub.c
@@ -608,7 +608,7 @@ static const struct dev_pm_ops tegra30_ahub_pm_ops = {
 
 static struct platform_driver tegra30_ahub_driver = {
 	.probe = tegra30_ahub_probe,
-	.remove_new = tegra30_ahub_remove,
+	.remove = tegra30_ahub_remove,
 	.driver = {
 		.name = DRV_NAME,
 		.of_match_table = tegra30_ahub_of_match,
diff --git a/sound/soc/tegra/tegra30_i2s.c b/sound/soc/tegra/tegra30_i2s.c
index a8ff51d12edb..0d3badfbe143 100644
--- a/sound/soc/tegra/tegra30_i2s.c
+++ b/sound/soc/tegra/tegra30_i2s.c
@@ -560,7 +560,7 @@ static struct platform_driver tegra30_i2s_driver = {
 		.pm = &tegra30_i2s_pm_ops,
 	},
 	.probe = tegra30_i2s_platform_probe,
-	.remove_new = tegra30_i2s_platform_remove,
+	.remove = tegra30_i2s_platform_remove,
 };
 module_platform_driver(tegra30_i2s_driver);
 
diff --git a/sound/soc/tegra/tegra_audio_graph_card.c b/sound/soc/tegra/tegra_audio_graph_card.c
index feba9d42bbc5..8b48813c2c59 100644
--- a/sound/soc/tegra/tegra_audio_graph_card.c
+++ b/sound/soc/tegra/tegra_audio_graph_card.c
@@ -248,7 +248,7 @@ static struct platform_driver tegra_audio_graph_card = {
 		.of_match_table = graph_of_tegra_match,
 	},
 	.probe = tegra_audio_graph_probe,
-	.remove_new = simple_util_remove,
+	.remove = simple_util_remove,
 };
 module_platform_driver(tegra_audio_graph_card);
 
diff --git a/sound/soc/ti/ams-delta.c b/sound/soc/ti/ams-delta.c
index 76bda188e992..94645f275495 100644
--- a/sound/soc/ti/ams-delta.c
+++ b/sound/soc/ti/ams-delta.c
@@ -595,7 +595,7 @@ static struct platform_driver ams_delta_driver = {
 		.name = DRV_NAME,
 	},
 	.probe = ams_delta_probe,
-	.remove_new = ams_delta_remove,
+	.remove = ams_delta_remove,
 };
 
 module_platform_driver(ams_delta_driver);
diff --git a/sound/soc/ti/davinci-i2s.c b/sound/soc/ti/davinci-i2s.c
index 0f15a743c798..d682b98d6848 100644
--- a/sound/soc/ti/davinci-i2s.c
+++ b/sound/soc/ti/davinci-i2s.c
@@ -920,7 +920,7 @@ MODULE_DEVICE_TABLE(of, davinci_i2s_match);
 
 static struct platform_driver davinci_mcbsp_driver = {
 	.probe		= davinci_i2s_probe,
-	.remove_new	= davinci_i2s_remove,
+	.remove		= davinci_i2s_remove,
 	.driver		= {
 		.name	= "davinci-mcbsp",
 		.of_match_table = of_match_ptr(davinci_i2s_match),
diff --git a/sound/soc/ti/davinci-mcasp.c b/sound/soc/ti/davinci-mcasp.c
index 2b1ed91a736c..a0b8cca31cba 100644
--- a/sound/soc/ti/davinci-mcasp.c
+++ b/sound/soc/ti/davinci-mcasp.c
@@ -2535,7 +2535,7 @@ static const struct dev_pm_ops davinci_mcasp_pm_ops = {
 
 static struct platform_driver davinci_mcasp_driver = {
 	.probe		= davinci_mcasp_probe,
-	.remove_new	= davinci_mcasp_remove,
+	.remove		= davinci_mcasp_remove,
 	.driver		= {
 		.name	= "davinci-mcasp",
 		.pm     = &davinci_mcasp_pm_ops,
diff --git a/sound/soc/ti/omap-mcbsp.c b/sound/soc/ti/omap-mcbsp.c
index 2110ffe5281c..411970399271 100644
--- a/sound/soc/ti/omap-mcbsp.c
+++ b/sound/soc/ti/omap-mcbsp.c
@@ -1430,7 +1430,7 @@ static struct platform_driver asoc_mcbsp_driver = {
 	},
 
 	.probe = asoc_mcbsp_probe,
-	.remove_new = asoc_mcbsp_remove,
+	.remove = asoc_mcbsp_remove,
 };
 
 module_platform_driver(asoc_mcbsp_driver);
diff --git a/sound/soc/uniphier/aio-ld11.c b/sound/soc/uniphier/aio-ld11.c
index 01cc3b961999..a041ce8e23a4 100644
--- a/sound/soc/uniphier/aio-ld11.c
+++ b/sound/soc/uniphier/aio-ld11.c
@@ -347,7 +347,7 @@ static struct platform_driver uniphier_aio_driver = {
 		.of_match_table = of_match_ptr(uniphier_aio_of_match),
 	},
 	.probe    = uniphier_aio_probe,
-	.remove_new = uniphier_aio_remove,
+	.remove = uniphier_aio_remove,
 };
 module_platform_driver(uniphier_aio_driver);
 
diff --git a/sound/soc/uniphier/aio-pxs2.c b/sound/soc/uniphier/aio-pxs2.c
index fba13a212bdb..889f64b2c01f 100644
--- a/sound/soc/uniphier/aio-pxs2.c
+++ b/sound/soc/uniphier/aio-pxs2.c
@@ -256,7 +256,7 @@ static struct platform_driver uniphier_aio_driver = {
 		.of_match_table = of_match_ptr(uniphier_aio_of_match),
 	},
 	.probe    = uniphier_aio_probe,
-	.remove_new = uniphier_aio_remove,
+	.remove = uniphier_aio_remove,
 };
 module_platform_driver(uniphier_aio_driver);
 
diff --git a/sound/soc/uniphier/evea.c b/sound/soc/uniphier/evea.c
index d90b3e4b0104..662e45882c90 100644
--- a/sound/soc/uniphier/evea.c
+++ b/sound/soc/uniphier/evea.c
@@ -560,7 +560,7 @@ static struct platform_driver evea_codec_driver = {
 		.of_match_table = of_match_ptr(evea_of_match),
 	},
 	.probe  = evea_probe,
-	.remove_new = evea_remove,
+	.remove = evea_remove,
 };
 module_platform_driver(evea_codec_driver);
 
diff --git a/sound/soc/ux500/mop500.c b/sound/soc/ux500/mop500.c
index e0ab4534fe3e..ae6d326167d1 100644
--- a/sound/soc/ux500/mop500.c
+++ b/sound/soc/ux500/mop500.c
@@ -157,7 +157,7 @@ static struct platform_driver snd_soc_mop500_driver = {
 		.of_match_table = snd_soc_mop500_match,
 	},
 	.probe = mop500_probe,
-	.remove_new = mop500_remove,
+	.remove = mop500_remove,
 };
 
 module_platform_driver(snd_soc_mop500_driver);
diff --git a/sound/soc/ux500/ux500_msp_dai.c b/sound/soc/ux500/ux500_msp_dai.c
index 3fd13e8dd110..a2dd739fdf2d 100644
--- a/sound/soc/ux500/ux500_msp_dai.c
+++ b/sound/soc/ux500/ux500_msp_dai.c
@@ -816,7 +816,7 @@ static struct platform_driver msp_i2s_driver = {
 		.of_match_table = ux500_msp_i2s_match,
 	},
 	.probe = ux500_msp_drv_probe,
-	.remove_new = ux500_msp_drv_remove,
+	.remove = ux500_msp_drv_remove,
 };
 module_platform_driver(msp_i2s_driver);
 
diff --git a/sound/soc/xilinx/xlnx_formatter_pcm.c b/sound/soc/xilinx/xlnx_formatter_pcm.c
index 158fc21a86c1..17ef05309469 100644
--- a/sound/soc/xilinx/xlnx_formatter_pcm.c
+++ b/sound/soc/xilinx/xlnx_formatter_pcm.c
@@ -713,7 +713,7 @@ MODULE_DEVICE_TABLE(of, xlnx_formatter_pcm_of_match);
 
 static struct platform_driver xlnx_formatter_pcm_driver = {
 	.probe	= xlnx_formatter_pcm_probe,
-	.remove_new = xlnx_formatter_pcm_remove,
+	.remove = xlnx_formatter_pcm_remove,
 	.driver	= {
 		.name	= DRV_NAME,
 		.of_match_table	= xlnx_formatter_pcm_of_match,
diff --git a/sound/soc/xilinx/xlnx_spdif.c b/sound/soc/xilinx/xlnx_spdif.c
index d52d5fc7b5b8..7febb3830dc2 100644
--- a/sound/soc/xilinx/xlnx_spdif.c
+++ b/sound/soc/xilinx/xlnx_spdif.c
@@ -325,7 +325,7 @@ static struct platform_driver xlnx_spdif_driver = {
 		.of_match_table = xlnx_spdif_of_match,
 	},
 	.probe = xlnx_spdif_probe,
-	.remove_new = xlnx_spdif_remove,
+	.remove = xlnx_spdif_remove,
 };
 module_platform_driver(xlnx_spdif_driver);
 
diff --git a/sound/soc/xtensa/xtfpga-i2s.c b/sound/soc/xtensa/xtfpga-i2s.c
index 6e2b72d7a65d..4eaa9011405f 100644
--- a/sound/soc/xtensa/xtfpga-i2s.c
+++ b/sound/soc/xtensa/xtfpga-i2s.c
@@ -635,7 +635,7 @@ static const struct dev_pm_ops xtfpga_i2s_pm_ops = {
 
 static struct platform_driver xtfpga_i2s_driver = {
 	.probe   = xtfpga_i2s_probe,
-	.remove_new = xtfpga_i2s_remove,
+	.remove = xtfpga_i2s_remove,
 	.driver  = {
 		.name = "xtfpga-i2s",
 		.of_match_table = of_match_ptr(xtfpga_i2s_of_match),

base-commit: 100cc857359b5d731407d1038f7e76cd0e871d94
-- 
2.45.2


From geert at linux-m68k.org  Mon Sep  9 08:38:31 2024
From: geert at linux-m68k.org (Geert Uytterhoeven)
Date: Mon, 9 Sep 2024 17:38:31 +0200
Subject: [PATCH] clk: Switch back to struct platform_driver::remove()
In-Reply-To: <20240909144026.870565-2-u.kleine-koenig@baylibre.com>
References: <20240909144026.870565-2-u.kleine-koenig@baylibre.com>
Message-ID: <CAMuHMdXOwfHgLwCSB-koVjW0eHDXkNvo_Af8eRkfbLPdU8ZrsA@mail.gmail.com>

On Mon, Sep 9, 2024 at 4:40?PM Uwe Kleine-K?nig
<u.kleine-koenig at baylibre.com> wrote:
> After commit 0edb555a65d1 ("platform: Make platform_driver::remove()
> return void") .remove() is (again) the right callback to implement for
> platform drivers.
>
> Convert all clk drivers to use .remove(), with the eventual goal to drop
> struct platform_driver::remove_new(). As .remove() and .remove_new() have
> the same prototypes, conversion is done by just changing the structure
> member name in the driver initializer.
>
> Signed-off-by: Uwe Kleine-K?nig <u.kleine-koenig at baylibre.com>

>  drivers/clk/renesas/rcar-usb2-clock-sel.c       | 2 +-

Acked-by: Geert Uytterhoeven <geert+renesas at glider.be> # renesas

Gr{oetje,eeting}s,

                        Geert

-- 
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert at linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
                                -- Linus Torvalds


From robh at kernel.org  Mon Sep  9 08:45:16 2024
From: robh at kernel.org (Rob Herring (Arm))
Date: Mon, 09 Sep 2024 10:45:16 -0500
Subject: [PATCH v5 0/2] arm64: dts: mediatek: Add MT8186 Ponyta
In-Reply-To: <20240909023148.1677936-1-cengjianeng@huaqin.corp-partner.google.com>
References: <CAJMQK-imYrDTuycVzQxkfbkZuHehE8uwc+qS2w=UDShETsBvEw@mail.gmail.com>
 <20240909023148.1677936-1-cengjianeng@huaqin.corp-partner.google.com>
Message-ID: <172589660972.199140.1860414842334878111.robh@kernel.org>


On Mon, 09 Sep 2024 10:31:46 +0800, Jianeng Ceng wrote:
> This is v5 of the MT8186 Chromebook device tree series.
> ---
> Changes in v5:
> - PATCH 1/2: Remove sku2147483647.
> - PATCH 2/2: Remove sku2147483647.
> - Link to v4:https://lore.kernel.org/all/20240906085739.1322676-1-cengjianeng at huaqin.corp-partner.google.com/
> 
> Changes in v4:
> - PATCH 1/2: Add more info for Ponyta custom label in commit.
> - Link to v3:https://lore.kernel.org/all/20240904081501.2060933-1-cengjianeng at huaqin.corp-partner.google.com/
> 
> Changes in v3:
> - PATCH 0/2: Add the modify records.
> - PATCH 1/2: Modify lable to label.
> - Link to v2:https://lore.kernel.org/all/20240903061603.3007289-1-cengjianeng at huaqin.corp-partner.google.com/
> 
> Changes in v2:
> - PATCH 2/2: Modify the dtb name without rev2.
> - Link to v1:https://lore.kernel.org/all/20240902125502.1844374-1-cengjianeng at huaqin.corp-partner.google.com/
> 
> Jianeng Ceng (2):
>   dt-bindings: arm: mediatek: Add MT8186 Ponyta Chromebook
>   arm64: dts: mediatek: Add MT8186 Ponyta Chromebooks
> 
>  .../devicetree/bindings/arm/mediatek.yaml     | 10 +++++
>  arch/arm64/boot/dts/mediatek/Makefile         |  2 +
>  .../mediatek/mt8186-corsola-ponyta-sku0.dts   | 23 ++++++++++
>  .../mediatek/mt8186-corsola-ponyta-sku1.dts   | 27 ++++++++++++
>  .../dts/mediatek/mt8186-corsola-ponyta.dtsi   | 44 +++++++++++++++++++
>  5 files changed, 106 insertions(+)
>  create mode 100644 arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku0.dts
>  create mode 100644 arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku1.dts
>  create mode 100644 arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta.dtsi
> 
> --
> 2.34.1
> 
> 
> 


My bot found new DTB warnings on the .dts files added or changed in this
series.

Some warnings may be from an existing SoC .dtsi. Or perhaps the warnings
are fixed by another series. Ultimately, it is up to the platform
maintainer whether these warnings are acceptable or not. No need to reply
unless the platform maintainer has comments.

If you already ran DT checks and didn't see these error(s), then
make sure dt-schema is up to date:

  pip3 install dtschema --upgrade


New warnings running 'make CHECK_DTBS=y mediatek/mt8186-corsola-ponyta-sku0.dtb mediatek/mt8186-corsola-ponyta-sku1.dtb' for 20240909023148.1677936-1-cengjianeng at huaqin.corp-partner.google.com:

arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku0.dtb: /soc/pwrap at 1000d000/pmic: failed to match any schema with compatible: ['mediatek,mt6366', 'mediatek,mt6358']
arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku1.dtb: /soc/pwrap at 1000d000/pmic: failed to match any schema with compatible: ['mediatek,mt6366', 'mediatek,mt6358']
arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku0.dtb: /soc/pwrap at 1000d000/pmic: failed to match any schema with compatible: ['mediatek,mt6366', 'mediatek,mt6358']
arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku1.dtb: /soc/pwrap at 1000d000/pmic: failed to match any schema with compatible: ['mediatek,mt6366', 'mediatek,mt6358']
arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku0.dtb: /soc/pwrap at 1000d000/pmic/codec: failed to match any schema with compatible: ['mediatek,mt6366-sound', 'mediatek,mt6358-sound']
arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku1.dtb: /soc/pwrap at 1000d000/pmic/codec: failed to match any schema with compatible: ['mediatek,mt6366-sound', 'mediatek,mt6358-sound']
arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku0.dtb: /soc/pwrap at 1000d000/pmic/codec: failed to match any schema with compatible: ['mediatek,mt6366-sound', 'mediatek,mt6358-sound']
arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku1.dtb: /soc/pwrap at 1000d000/pmic/codec: failed to match any schema with compatible: ['mediatek,mt6366-sound', 'mediatek,mt6358-sound']
arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku0.dtb: /soc/pwrap at 1000d000/pmic/rtc: failed to match any schema with compatible: ['mediatek,mt6366-rtc', 'mediatek,mt6358-rtc']
arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku0.dtb: /soc/pwrap at 1000d000/pmic/rtc: failed to match any schema with compatible: ['mediatek,mt6366-rtc', 'mediatek,mt6358-rtc']
arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku1.dtb: /soc/pwrap at 1000d000/pmic/rtc: failed to match any schema with compatible: ['mediatek,mt6366-rtc', 'mediatek,mt6358-rtc']
arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku1.dtb: /soc/pwrap at 1000d000/pmic/rtc: failed to match any schema with compatible: ['mediatek,mt6366-rtc', 'mediatek,mt6358-rtc']
arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku0.dtb: touchpad at 2c: 'vcc-supply' does not match any of the regexes: 'pinctrl-[0-9]+'
	from schema $id: http://devicetree.org/schemas/input/hid-over-i2c.yaml
arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku0.dtb: dp-bridge at 5c: 'extcon' is a required property
	from schema $id: http://devicetree.org/schemas/display/bridge/ite,it6505.yaml
arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku1.dtb: dp-bridge at 5c: 'extcon' is a required property
	from schema $id: http://devicetree.org/schemas/display/bridge/ite,it6505.yaml
arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku0.dtb: sound: 'model' is a required property
	from schema $id: http://devicetree.org/schemas/sound/mt8186-mt6366-rt1019-rt5682s.yaml
arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku1.dtb: sound: 'model' is a required property
	from schema $id: http://devicetree.org/schemas/sound/mt8186-mt6366-rt1019-rt5682s.yaml







From nathan at kernel.org  Mon Sep  9 08:48:39 2024
From: nathan at kernel.org (Nathan Chancellor)
Date: Mon, 9 Sep 2024 08:48:39 -0700
Subject: [PATCH 0/7] ASoC: mt8365: Fix -Werror builds
In-Reply-To: <20240907-asoc-fix-mt8365-build-v1-0-7ad0bac20161@kernel.org>
References: <20240907-asoc-fix-mt8365-build-v1-0-7ad0bac20161@kernel.org>
Message-ID: <20240909154839.GA59917@thelio-3990X>

On Sat, Sep 07, 2024 at 01:53:25AM +0100, Mark Brown wrote:
> Nathan reported that the newly added mt8365 drivers were causing a
> number of warnings which break -Werror builds, these were only visible
> on arm64 since the drivers did not have COMPILE_TEST enabled.  Fix this
> and some other minor stuff I noticed while doing so.
> ---
> Mark Brown (7):
>       ASoC: mt8365: Open code BIT() to avoid spurious warnings
>       ASoC: mt8365: Remove spurious unsigned long casts
>       ASoC: mt8365: Remove unused prototype for mt8365_afe_clk_group_48k()
>       ASoC: mt8365: Make non-exported functions static
>       ASoC: mt8365: Remove unused variables
>       ASoC: mt8365: Remove unused DMIC IIR coefficient configuration
>       ASoC: mt8365: Allow build coverage

Thanks for this. It appears to resolve all the issues from a build of
allmodconfig for arm, arm64, and x86.

Tested-by: Nathan Chancellor <nathan at kernel.org> # build

Cheers,
Nathan


From robh at kernel.org  Mon Sep  9 09:12:31 2024
From: robh at kernel.org (Rob Herring (Arm))
Date: Mon, 9 Sep 2024 11:12:31 -0500
Subject: [PATCH 07/13] dt-bindings: power: mediatek: Add another nested
 power-domain layer
In-Reply-To: <20240909111535.528624-8-fshao@chromium.org>
References: <20240909111535.528624-1-fshao@chromium.org>
 <20240909111535.528624-8-fshao@chromium.org>
Message-ID: <172589835005.306979.15596103474181849299.robh@kernel.org>


On Mon, 09 Sep 2024 19:14:20 +0800, Fei Shao wrote:
> The MT8188 SoC has a more in-depth power-domain tree, and the
> CHECK_DTBS=y check could fail because the current MediaTek power
> dt-binding is insufficient to cover its CAM_SUBA and CAM_SUBB
> sub-domains.
> 
> Add one more nested power-domain layer to pass the check.
> 
> Signed-off-by: Fei Shao <fshao at chromium.org>
> ---
> 
>  .../devicetree/bindings/power/mediatek,power-controller.yaml  | 4 ++++
>  1 file changed, 4 insertions(+)
> 

Acked-by: Rob Herring (Arm) <robh at kernel.org>



From robh at kernel.org  Mon Sep  9 09:13:03 2024
From: robh at kernel.org (Rob Herring (Arm))
Date: Mon, 9 Sep 2024 11:13:03 -0500
Subject: [PATCH 10/13] dt-bindings: spmi: spmi-mtk-pmif: Add compatible
 for MT8188
In-Reply-To: <20240909111535.528624-11-fshao@chromium.org>
References: <20240909111535.528624-1-fshao@chromium.org>
 <20240909111535.528624-11-fshao@chromium.org>
Message-ID: <172589838295.312976.17005993093788269336.robh@kernel.org>


On Mon, 09 Sep 2024 19:14:23 +0800, Fei Shao wrote:
> Add compatible string for the SPMI block on MT8188 SoC, which is
> compatible with the one used on MT8195.
> 
> Signed-off-by: Fei Shao <fshao at chromium.org>
> ---
> 
>  Documentation/devicetree/bindings/spmi/mtk,spmi-mtk-pmif.yaml | 1 +
>  1 file changed, 1 insertion(+)
> 

Acked-by: Rob Herring (Arm) <robh at kernel.org>



From robh at kernel.org  Mon Sep  9 09:13:58 2024
From: robh at kernel.org (Rob Herring (Arm))
Date: Mon, 9 Sep 2024 11:13:58 -0500
Subject: [PATCH 12/13] dt-bindings: mailbox: mtk,adsp-mbox: Add
 compatible for MT8188
In-Reply-To: <20240909111535.528624-13-fshao@chromium.org>
References: <20240909111535.528624-1-fshao@chromium.org>
 <20240909111535.528624-13-fshao@chromium.org>
Message-ID: <172589843790.327330.8035137632260512976.robh@kernel.org>


On Mon, 09 Sep 2024 19:14:25 +0800, Fei Shao wrote:
> Add compatible string for ADSP mailbox on MT8188 SoC, which is
> compatible with the one used on MT8186.
> 
> Signed-off-by: Fei Shao <fshao at chromium.org>
> ---
> 
>  .../devicetree/bindings/mailbox/mtk,adsp-mbox.yaml   | 12 +++++++++---
>  1 file changed, 9 insertions(+), 3 deletions(-)
> 

Acked-by: Rob Herring (Arm) <robh at kernel.org>



From bvanassche at acm.org  Mon Sep  9 09:24:02 2024
From: bvanassche at acm.org (Bart Van Assche)
Date: Mon, 9 Sep 2024 09:24:02 -0700
Subject: [PATCH v3 1/2] ufs: core: fix the issue of ICU failure
In-Reply-To: <20240909082100.24019-2-peter.wang@mediatek.com>
References: <20240909082100.24019-1-peter.wang@mediatek.com>
 <20240909082100.24019-2-peter.wang@mediatek.com>
Message-ID: <edbabf35-8111-4672-b14c-52d76ed46fd9@acm.org>

On 9/9/24 1:20 AM, peter.wang at mediatek.com wrote:
> diff --git a/drivers/ufs/core/ufs-mcq.c b/drivers/ufs/core/ufs-mcq.c
> index 5891cdacd0b3..3903947dbed1 100644
> --- a/drivers/ufs/core/ufs-mcq.c
> +++ b/drivers/ufs/core/ufs-mcq.c
> @@ -539,7 +539,7 @@ int ufshcd_mcq_sq_cleanup(struct ufs_hba *hba, int task_tag)
>   	struct scsi_cmnd *cmd = lrbp->cmd;
>   	struct ufs_hw_queue *hwq;
>   	void __iomem *reg, *opr_sqd_base;
> -	u32 nexus, id, val;
> +	u32 nexus, id, val, rtc;
>   	int err;
>   
>   	if (hba->quirks & UFSHCD_QUIRK_MCQ_BROKEN_RTC)
> @@ -569,17 +569,18 @@ int ufshcd_mcq_sq_cleanup(struct ufs_hba *hba, int task_tag)
>   	opr_sqd_base = mcq_opr_base(hba, OPR_SQD, id);
>   	writel(nexus, opr_sqd_base + REG_SQCTI);
>   
> -	/* SQRTCy.ICU = 1 */
> -	writel(SQ_ICU, opr_sqd_base + REG_SQRTC);
> +	/* Initiate Cleanup */
> +	writel(readl(opr_sqd_base + REG_SQRTC) | SQ_ICU,
> +		opr_sqd_base + REG_SQRTC);
>   
>   	/* Poll SQRTSy.CUS = 1. Return result from SQRTSy.RTC */
>   	reg = opr_sqd_base + REG_SQRTS;
>   	err = read_poll_timeout(readl, val, val & SQ_CUS, 20,
>   				MCQ_POLL_US, false, reg);
> -	if (err)
> -		dev_err(hba->dev, "%s: failed. hwq=%d, tag=%d err=%ld\n",
> -			__func__, id, task_tag,
> -			FIELD_GET(SQ_ICU_ERR_CODE_MASK, readl(reg)));
> +	rtc = FIELD_GET(SQ_ICU_ERR_CODE_MASK, readl(reg));
> +	if (err || rtc)
> +		dev_err(hba->dev, "%s: failed. hwq=%d, tag=%d err=%d RTC=%d\n",
> +			__func__, id, task_tag, err, rtc);
>   
>   	if (ufshcd_mcq_sq_start(hba, hwq))
>   		err = -ETIMEDOUT;

Reviewed-by: Bart Van Assche <bvanassche at acm.org>


From bvanassche at acm.org  Mon Sep  9 09:34:52 2024
From: bvanassche at acm.org (Bart Van Assche)
Date: Mon, 9 Sep 2024 09:34:52 -0700
Subject: [PATCH v3 2/2] ufs: core: requeue aborted request
In-Reply-To: <20240909082100.24019-3-peter.wang@mediatek.com>
References: <20240909082100.24019-1-peter.wang@mediatek.com>
 <20240909082100.24019-3-peter.wang@mediatek.com>
Message-ID: <c4d22b9c-2554-4871-94dc-3dae4bd62a5a@acm.org>

On 9/9/24 1:21 AM, peter.wang at mediatek.com wrote:
> diff --git a/drivers/ufs/core/ufs-mcq.c b/drivers/ufs/core/ufs-mcq.c
> index 3903947dbed1..1f57ebf24a39 100644
> --- a/drivers/ufs/core/ufs-mcq.c
> +++ b/drivers/ufs/core/ufs-mcq.c
> @@ -642,6 +642,7 @@ static bool ufshcd_mcq_sqe_search(struct ufs_hba *hba,
>   		match = le64_to_cpu(utrd->command_desc_base_addr) & CQE_UCD_BA;
>   		if (addr == match) {
>   			ufshcd_mcq_nullify_sqe(utrd);
> +			lrbp->abort_initiated_by_err = true;
>   			ret = true;
>   			goto out;
>   		}

As mentioned before, I think that this change is wrong. Setting
lrbp->abort_initiated_by_err affects the value of scsi_cmnd::result.
This member variable is ignored for aborted commands. Although the
above change does not affect the SCSI error handler, I think it should
be left out because it will confuse anyone who reads the UFS driver code
and who has not followed this discussion.

> @@ -7561,6 +7552,16 @@ int ufshcd_try_to_abort_task(struct ufs_hba *hba, int tag)
>   		goto out;
>   	}
>   
> +	/*
> +	 * When the host software receives a "FUNCTION COMPLETE", set flag
> +	 * to requeue command after receive response with OCS_ABORTED
> +	 * SDB mode: UTRLCLR Task Management response which means a Transfer
> +	 *           Request was aborted.
> +	 * MCQ mode: Host will post to CQ with OCS_ABORTED after SQ cleanup
> +	 */
> +	if (!err)
> +		lrbp->abort_initiated_by_err = true;

Please add a comment that explains that the purpose of this code is to 
requeue commands aborted by ufshcd_abort_all().

> + * @abort_initiated_by_err: abort initiated by error

The member variable name and also the explanation of this member
variable are incomprehensible to me.

Thanks,

Bart.


From broonie at kernel.org  Mon Sep  9 10:18:46 2024
From: broonie at kernel.org (Mark Brown)
Date: Mon, 09 Sep 2024 18:18:46 +0100
Subject: [PATCH] ASoC: mediatek: mt8365: remove unused
 mt8365_i2s_hd_str
In-Reply-To: <20240907200053.3027553-1-arnd@kernel.org>
References: <20240907200053.3027553-1-arnd@kernel.org>
Message-ID: <172590232608.1707146.10719220040805343879.b4-ty@kernel.org>

On Sat, 07 Sep 2024 20:00:38 +0000, Arnd Bergmann wrote:
> The mt8365_i2s_enum and mt8365_i2s_hd_str variables are not
> used anywhere, but cause a warning when building with C=1
> or when enabling -Wunused-const-variable:
> 
> sound/soc/mediatek/mt8365/mt8365-dai-i2s.c:781:27: error: 'mt8365_i2s_hd_str' defined but not used [-Werror=unused-const-variable=]
>   781 | static const char * const mt8365_i2s_hd_str[] = {
>       |                           ^~~~~~~~~~~~~~~~~
> 
> [...]

Applied to

   https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git for-next

Thanks!

[1/1] ASoC: mediatek: mt8365: remove unused mt8365_i2s_hd_str
      commit: 876dec03fdfb7eeb592d01a95ba292c9e53b324b

All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.

You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.

If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.

Please add any relevant lists and maintainers to the CCs when replying
to this mail.

Thanks,
Mark



From broonie at kernel.org  Mon Sep  9 10:18:49 2024
From: broonie at kernel.org (Mark Brown)
Date: Mon, 09 Sep 2024 18:18:49 +0100
Subject: [PATCH] ASoC: mediatek: mt8365: include linux/bitfield.h
In-Reply-To: <20240908221754.2210857-1-arnd@kernel.org>
References: <20240908221754.2210857-1-arnd@kernel.org>
Message-ID: <172590232922.1707146.8389752525404411197.b4-ty@kernel.org>

On Sun, 08 Sep 2024 22:17:34 +0000, Arnd Bergmann wrote:
> On x86, the header is not already included implicitly,
> breaking compile-testing:
> 
> In file included from sound/soc/mediatek/mt8365/mt8365-afe-common.h:19,
>                  from sound/soc/mediatek/mt8365/mt8365-afe-pcm.c:18:
> sound/soc/mediatek/mt8365/mt8365-afe-pcm.c: In function 'mt8365_afe_cm2_mux_conn':
> sound/soc/mediatek/mt8365/mt8365-reg.h:952:41: error: implicit declaration of function 'FIELD_PREP' [-Wimplicit-function-declaration]
>   952 | #define CM2_AFE_CM2_CONN_CFG1(x)        FIELD_PREP(CM2_AFE_CM2_CONN_CFG1_MASK, (x))
>       |                                         ^~~~~~~~~~
> 
> [...]

Applied to

   https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git for-next

Thanks!

[1/1] ASoC: mediatek: mt8365: include linux/bitfield.h
      commit: 6b31d6a4ca3b4d8abfb39127130889f9a9a38aa1

All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.

You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.

If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.

Please add any relevant lists and maintainers to the CCs when replying
to this mail.

Thanks,
Mark



From nfraprado at collabora.com  Mon Sep  9 11:37:31 2024
From: nfraprado at collabora.com (=?utf-8?q?N=C3=ADcolas_F=2E_R=2E_A=2E_Prado?=)
Date: Mon, 09 Sep 2024 14:37:31 -0400
Subject: [PATCH RFC 0/3] Verify bias functionality for pinctrl_paris driver
 through new gpio test
Message-ID: <20240909-kselftest-gpio-set-get-config-v1-0-16a065afc3c1@collabora.com>

This series was motivated by the regression fixed by 166bf8af9122
("pinctrl: mediatek: common-v2: Fix broken bias-disable for
PULL_PU_PD_RSEL_TYPE"). A bug was introduced in the pinctrl_paris driver
which prevented certain pins from having their bias configured.

Running this test on the mt8195-tomato platform with the test plan
included below[1] shows the test passing with the fix applied, but failing
without the fix:

With fix:
  $ ./gpio-setget-config.py
  TAP version 13
  # Using test plan file: ./google,tomato.yaml
  1..3
  ok 1 pinctrl_paris.34.pull-up
  ok 2 pinctrl_paris.34.pull-down
  ok 3 pinctrl_paris.34.disabled
  # Totals: pass:3 fail:0 xfail:0 xpass:0 skip:0 error:0

Without fix:
  $ ./gpio-setget-config.py
  TAP version 13
  # Using test plan file: ./google,tomato.yaml
  1..3
  # Bias doesn't match: Expected pull-up, read pull-down.
  not ok 1 pinctrl_paris.34.pull-up
  ok 2 pinctrl_paris.34.pull-down
  # Bias doesn't match: Expected disabled, read pull-down.
  not ok 3 pinctrl_paris.34.disabled
  # Totals: pass:1 fail:2 xfail:0 xpass:0 skip:0 error:0

In order to achieve this, the first patch exposes bias configuration
through the GPIO API in the pinctrl_paris driver, patch 2 extends the
gpio-mockup-cdev utility for use by patch 3, and patch 3 introduces a
new GPIO kselftest that takes a test plan in YAML, which can be tailored
per-platform to specify the configurations to test, and sets and gets
back each pin configuration to verify that they match and thus that the
driver is behaving as expected.

Since the GPIO uAPI only allows setting the pin configuration, getting
it back is done through pinconf-pins in the pinctrl debugfs folder.

The test currently only verifies bias but it would be easy to extend to
verify other pin configurations.

The test plan YAML file can be customized for each use-case and is
platform-dependant. For that reason, only an example is included in
patch 3 and the user is supposed to provide their test plan. That said,
the aim is to collect test plans for ease of use at [2].

[1] This is the test plan used for mt8195-tomato:

- label: "pinctrl_paris"
  tests:
  # Pin 34 has type MTK_PULL_PU_PD_RSEL_TYPE and is unused.
  # Setting bias to MTK_PULL_PU_PD_RSEL_TYPE pins was fixed by
  # 166bf8af9122 ("pinctrl: mediatek: common-v2: Fix broken bias-disable for PULL_PU_PD_RSEL_TYPE")
  - pin: 34
    bias: "pull-up"
  - pin: 34
    bias: "pull-down"
  - pin: 34
    bias: "disabled"

[2] https://github.com/kernelci/platform-test-parameters

Signed-off-by: N?colas F. R. A. Prado <nfraprado at collabora.com>
---
N?colas F. R. A. Prado (3):
      pinctrl: mediatek: paris: Expose more configurations to GPIO set_config
      selftest: gpio: Add wait flag to gpio-mockup-cdev
      selftest: gpio: Add a new set-get config test

 drivers/pinctrl/mediatek/pinctrl-paris.c           |  20 +--
 tools/testing/selftests/gpio/Makefile              |   2 +-
 tools/testing/selftests/gpio/gpio-mockup-cdev.c    |  14 +-
 .../gpio-set-get-config-example-test-plan.yaml     |  15 ++
 .../testing/selftests/gpio/gpio-set-get-config.py  | 183 +++++++++++++++++++++
 5 files changed, 220 insertions(+), 14 deletions(-)
---
base-commit: 6a7917c89f219f09b1d88d09f376000914a52763
change-id: 20240906-kselftest-gpio-set-get-config-6e5bb670c1a5

Best regards,
-- 
N?colas F. R. A. Prado <nfraprado at collabora.com>



From nfraprado at collabora.com  Mon Sep  9 11:37:32 2024
From: nfraprado at collabora.com (=?utf-8?q?N=C3=ADcolas_F=2E_R=2E_A=2E_Prado?=)
Date: Mon, 09 Sep 2024 14:37:32 -0400
Subject: [PATCH RFC 1/3] pinctrl: mediatek: paris: Expose more
 configurations to GPIO set_config
In-Reply-To: <20240909-kselftest-gpio-set-get-config-v1-0-16a065afc3c1@collabora.com>
References: <20240909-kselftest-gpio-set-get-config-v1-0-16a065afc3c1@collabora.com>
Message-ID: <20240909-kselftest-gpio-set-get-config-v1-1-16a065afc3c1@collabora.com>

Currently the set_config callback in the gpio_chip registered by the
pinctrl_paris driver only supports PIN_CONFIG_INPUT_DEBOUNCE, despite
many other configurations already being implemented and available
through the pinctrl API for configuration of pins by the Devicetree and
other drivers.

Expose all configurations currently implemented through the GPIO API so
they can also be set from userspace, which is particularly useful to
allow testing them from userspace.

Signed-off-by: N?colas F. R. A. Prado <nfraprado at collabora.com>
---
 drivers/pinctrl/mediatek/pinctrl-paris.c | 20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)

diff --git a/drivers/pinctrl/mediatek/pinctrl-paris.c b/drivers/pinctrl/mediatek/pinctrl-paris.c
index e12316c42698..668f8055a544 100644
--- a/drivers/pinctrl/mediatek/pinctrl-paris.c
+++ b/drivers/pinctrl/mediatek/pinctrl-paris.c
@@ -255,10 +255,9 @@ static int mtk_pinconf_get(struct pinctrl_dev *pctldev,
 	return err;
 }
 
-static int mtk_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin,
+static int mtk_pinconf_set(struct mtk_pinctrl *hw, unsigned int pin,
 			   enum pin_config_param param, u32 arg)
 {
-	struct mtk_pinctrl *hw = pinctrl_dev_get_drvdata(pctldev);
 	const struct mtk_pin_desc *desc;
 	int err = -ENOTSUPP;
 	u32 reg;
@@ -795,7 +794,7 @@ static int mtk_pconf_group_set(struct pinctrl_dev *pctldev, unsigned group,
 	int i, ret;
 
 	for (i = 0; i < num_configs; i++) {
-		ret = mtk_pinconf_set(pctldev, grp->pin,
+		ret = mtk_pinconf_set(hw, grp->pin,
 				      pinconf_to_config_param(configs[i]),
 				      pinconf_to_config_argument(configs[i]));
 		if (ret < 0)
@@ -937,18 +936,19 @@ static int mtk_gpio_set_config(struct gpio_chip *chip, unsigned int offset,
 {
 	struct mtk_pinctrl *hw = gpiochip_get_data(chip);
 	const struct mtk_pin_desc *desc;
-	u32 debounce;
+	enum pin_config_param param = pinconf_to_config_param(config);
+	u32 arg = pinconf_to_config_argument(config);
 
 	desc = (const struct mtk_pin_desc *)&hw->soc->pins[offset];
 
-	if (!hw->eint ||
-	    pinconf_to_config_param(config) != PIN_CONFIG_INPUT_DEBOUNCE ||
-	    desc->eint.eint_n == EINT_NA)
-		return -ENOTSUPP;
+	if (param == PIN_CONFIG_INPUT_DEBOUNCE) {
+		if (!hw->eint || desc->eint.eint_n == EINT_NA)
+			return -ENOTSUPP;
 
-	debounce = pinconf_to_config_argument(config);
+		return mtk_eint_set_debounce(hw->eint, desc->eint.eint_n, arg);
+	}
 
-	return mtk_eint_set_debounce(hw->eint, desc->eint.eint_n, debounce);
+	return mtk_pinconf_set(hw, offset, param, arg);
 }
 
 static int mtk_build_gpiochip(struct mtk_pinctrl *hw)

-- 
2.46.0



From nfraprado at collabora.com  Mon Sep  9 11:37:33 2024
From: nfraprado at collabora.com (=?utf-8?q?N=C3=ADcolas_F=2E_R=2E_A=2E_Prado?=)
Date: Mon, 09 Sep 2024 14:37:33 -0400
Subject: [PATCH RFC 2/3] selftest: gpio: Add wait flag to gpio-mockup-cdev
In-Reply-To: <20240909-kselftest-gpio-set-get-config-v1-0-16a065afc3c1@collabora.com>
References: <20240909-kselftest-gpio-set-get-config-v1-0-16a065afc3c1@collabora.com>
Message-ID: <20240909-kselftest-gpio-set-get-config-v1-2-16a065afc3c1@collabora.com>

Add a -w flag to the gpio-mockup-cdev utility that causes the program to
wait until a signal is received before exiting, even when its behavior
is to retrieve the GPIO value of the line. This allows using this
utility to keep a GPIO line configured even when in input mode, which
will be relied on in other tests.

Signed-off-by: N?colas F. R. A. Prado <nfraprado at collabora.com>
---
 tools/testing/selftests/gpio/gpio-mockup-cdev.c | 14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)

diff --git a/tools/testing/selftests/gpio/gpio-mockup-cdev.c b/tools/testing/selftests/gpio/gpio-mockup-cdev.c
index d1640f44f8ac..f674dcafa60a 100644
--- a/tools/testing/selftests/gpio/gpio-mockup-cdev.c
+++ b/tools/testing/selftests/gpio/gpio-mockup-cdev.c
@@ -15,6 +15,7 @@
 #include <unistd.h>
 #include <sys/ioctl.h>
 #include <linux/gpio.h>
+#include <stdbool.h>
 
 #define CONSUMER	"gpio-mockup-cdev"
 
@@ -95,6 +96,7 @@ static void usage(char *prog)
 	printf("               (default is to leave bias unchanged):\n");
 	printf("        -l: set line active low (default is active high)\n");
 	printf("        -s: set line value (default is to get line value)\n");
+	printf("        -w: wait even in get mode\n");
 	printf("        -u: uAPI version to use (default is 2)\n");
 	exit(-1);
 }
@@ -120,13 +122,14 @@ int main(int argc, char *argv[])
 	unsigned int offset, val = 0, abiv;
 	uint32_t flags_v1;
 	uint64_t flags_v2;
+	bool wait = false;
 
 	abiv = 2;
 	ret = 0;
 	flags_v1 = GPIOHANDLE_REQUEST_INPUT;
 	flags_v2 = GPIO_V2_LINE_FLAG_INPUT;
 
-	while ((opt = getopt(argc, argv, "lb:s:u:")) != -1) {
+	while ((opt = getopt(argc, argv, "lb:s:u:w")) != -1) {
 		switch (opt) {
 		case 'l':
 			flags_v1 |= GPIOHANDLE_REQUEST_ACTIVE_LOW;
@@ -150,10 +153,14 @@ int main(int argc, char *argv[])
 			flags_v1 |= GPIOHANDLE_REQUEST_OUTPUT;
 			flags_v2 &= ~GPIO_V2_LINE_FLAG_INPUT;
 			flags_v2 |= GPIO_V2_LINE_FLAG_OUTPUT;
+			wait = true;
 			break;
 		case 'u':
 			abiv = atoi(optarg);
 			break;
+		case 'w':
+			wait = true;
+			break;
 		default:
 			usage(argv[0]);
 		}
@@ -183,9 +190,10 @@ int main(int argc, char *argv[])
 		return lfd;
 	}
 
-	if (flags_v2 & GPIO_V2_LINE_FLAG_OUTPUT) {
+	if (wait)
 		wait_signal();
-	} else {
+
+	if (flags_v2 & GPIO_V2_LINE_FLAG_INPUT) {
 		if (abiv == 1)
 			ret = get_value_v1(lfd);
 		else

-- 
2.46.0



From nfraprado at collabora.com  Mon Sep  9 11:37:34 2024
From: nfraprado at collabora.com (=?utf-8?q?N=C3=ADcolas_F=2E_R=2E_A=2E_Prado?=)
Date: Mon, 09 Sep 2024 14:37:34 -0400
Subject: [PATCH RFC 3/3] selftest: gpio: Add a new set-get config test
In-Reply-To: <20240909-kselftest-gpio-set-get-config-v1-0-16a065afc3c1@collabora.com>
References: <20240909-kselftest-gpio-set-get-config-v1-0-16a065afc3c1@collabora.com>
Message-ID: <20240909-kselftest-gpio-set-get-config-v1-3-16a065afc3c1@collabora.com>

Add a new kselftest that sets a configuration to a GPIO line and then
gets it back to verify that it was correctly carried out by the driver.

Setting a configuration is done through the GPIO uAPI, but retrieving it
is done through the debugfs interface since that is the only place where
it can be retrieved from userspace.

The test reads the test plan from a YAML file, which includes the chips
and pin settings to set and validate.

Signed-off-by: N?colas F. R. A. Prado <nfraprado at collabora.com>
---
 tools/testing/selftests/gpio/Makefile              |   2 +-
 .../gpio-set-get-config-example-test-plan.yaml     |  15 ++
 .../testing/selftests/gpio/gpio-set-get-config.py  | 183 +++++++++++++++++++++
 3 files changed, 199 insertions(+), 1 deletion(-)

diff --git a/tools/testing/selftests/gpio/Makefile b/tools/testing/selftests/gpio/Makefile
index e0884390447d..bdfeb0c9aadd 100644
--- a/tools/testing/selftests/gpio/Makefile
+++ b/tools/testing/selftests/gpio/Makefile
@@ -1,6 +1,6 @@
 # SPDX-License-Identifier: GPL-2.0
 
-TEST_PROGS := gpio-mockup.sh gpio-sim.sh
+TEST_PROGS := gpio-mockup.sh gpio-sim.sh gpio-set-get-config.py
 TEST_FILES := gpio-mockup-sysfs.sh
 TEST_GEN_PROGS_EXTENDED := gpio-mockup-cdev gpio-chip-info gpio-line-name
 CFLAGS += -O2 -g -Wall $(KHDR_INCLUDES)
diff --git a/tools/testing/selftests/gpio/gpio-set-get-config-example-test-plan.yaml b/tools/testing/selftests/gpio/gpio-set-get-config-example-test-plan.yaml
new file mode 100644
index 000000000000..3b749be3c8dc
--- /dev/null
+++ b/tools/testing/selftests/gpio/gpio-set-get-config-example-test-plan.yaml
@@ -0,0 +1,15 @@
+# SPDX-License-Identifier: GPL-2.0
+# Top-level contains a list of the GPIO chips that will be tested. Each one is
+# chosen based on the GPIO chip's info label.
+- label: "gpiochip_device_label"
+  # For each GPIO chip, multiple pin configurations can be tested, which are
+  # listed under 'tests'
+  tests:
+  # pin indicates the pin number to test
+  - pin: 34
+    # bias can be 'pull-up', 'pull-down', 'disabled'
+    bias: "pull-up"
+  - pin: 34
+    bias: "pull-down"
+  - pin: 34
+    bias: "disabled"
diff --git a/tools/testing/selftests/gpio/gpio-set-get-config.py b/tools/testing/selftests/gpio/gpio-set-get-config.py
new file mode 100755
index 000000000000..6f1444c8d46b
--- /dev/null
+++ b/tools/testing/selftests/gpio/gpio-set-get-config.py
@@ -0,0 +1,183 @@
+#!/usr/bin/env python3
+# SPDX-License-Identifier: GPL-2.0
+# Copyright (c) 2024 Collabora Ltd
+
+#
+# This test validates GPIO pin configuration. It takes a test plan in YAML (see
+# gpio-set-get-config-example-test-plan.yaml) and sets and gets back each pin
+# configuration described in the plan and checks that they match in order to
+# validate that they are being applied correctly.
+#
+# When the file name for the test plan is not provided through --test-plan, it
+# will be guessed based on the platform ID (DT compatible or DMI).
+#
+
+import time
+import os
+import sys
+import argparse
+import re
+import subprocess
+import glob
+import signal
+
+import yaml
+
+# Allow ksft module to be imported from different directory
+this_dir = os.path.dirname(os.path.realpath(__file__))
+sys.path.append(os.path.join(this_dir, "../kselftest/"))
+
+import ksft
+
+
+def config_pin(chip_dev, pin_config):
+    flags = []
+    if pin_config.get("bias"):
+        flags += f"-b {pin_config['bias']}".split()
+    flags += ["-w", chip_dev, str(pin_config["pin"])]
+    gpio_mockup_cdev_path = os.path.join(this_dir, "gpio-mockup-cdev")
+    return subprocess.Popen([gpio_mockup_cdev_path] + flags)
+
+
+def get_bias_debugfs(chip_debugfs_path, pin):
+    with open(os.path.join(chip_debugfs_path, "pinconf-pins")) as f:
+        for l in f:
+            m = re.match(rf"pin {pin}.*bias (?P<bias>(pull )?\w+)", l)
+            if m:
+                return m.group("bias")
+
+
+def check_config_pin(chip, chip_debugfs_dir, pin_config):
+    test_passed = True
+
+    if pin_config.get("bias"):
+        bias = get_bias_debugfs(chip_debugfs_dir, pin_config["pin"])
+        # Convert "pull up" / "pull down" to "pull-up" / "pull-down"
+        bias = bias.replace(" ", "-")
+        if bias != pin_config["bias"]:
+            ksft.print_msg(
+                f"Bias doesn't match: Expected {pin_config['bias']}, read {bias}."
+            )
+            test_passed = False
+
+    ksft.test_result(
+        test_passed,
+        f"{chip['label']}.{pin_config['pin']}.{pin_config['bias']}",
+    )
+
+
+def get_devfs_chip_file(chip_dict):
+    gpio_chip_info_path = os.path.join(this_dir, 'gpio-chip-info')
+    for f in glob.glob("/dev/gpiochip*"):
+        proc = subprocess.run(
+            f"{gpio_chip_info_path} {f} label".split(), capture_output=True, text=True
+        )
+        if proc.returncode:
+            ksft.print_msg(f"Error opening gpio device {f}: {proc.returncode}")
+            ksft.exit_fail()
+
+        if chip_dict["label"] in proc.stdout:
+            return f
+
+
+def get_debugfs_chip_dir(chip):
+    pinctrl_debugfs = "/sys/kernel/debug/pinctrl/"
+
+    for name in os.listdir(pinctrl_debugfs):
+        if chip["label"] in name:
+            return os.path.join(pinctrl_debugfs, name)
+
+
+def run_test(test_plan_filename):
+    ksft.print_msg(f"Using test plan file: {test_plan_filename}")
+
+    with open(test_plan_filename) as f:
+        plan = yaml.safe_load(f)
+
+    num_tests = 0
+    for chip in plan:
+        num_tests += len(chip["tests"])
+
+    ksft.set_plan(num_tests)
+
+    for chip in plan:
+        chip_dev = get_devfs_chip_file(chip)
+        if not chip_dev:
+            ksft.print_msg("Couldn't find /dev file for GPIO chip")
+            ksft.exit_fail()
+        chip_debugfs_dir = get_debugfs_chip_dir(chip)
+        if not chip_debugfs_dir:
+            ksft.print_msg("Couldn't find pinctrl folder in debugfs for GPIO chip")
+            ksft.exit_fail()
+        for pin_config in chip["tests"]:
+            proc = config_pin(chip_dev, pin_config)
+            time.sleep(0.1)  # Give driver some time to update pin
+            check_config_pin(chip, chip_debugfs_dir, pin_config)
+            proc.send_signal(signal.SIGTERM)
+            proc.wait()
+
+
+def get_possible_test_plan_filenames():
+    filenames = []
+
+    dt_board_compatible_file = "/proc/device-tree/compatible"
+    if os.path.exists(dt_board_compatible_file):
+        with open(dt_board_compatible_file) as f:
+            for line in f:
+                compatibles = [compat for compat in line.split("\0") if compat]
+                filenames.extend(compatibles)
+    else:
+        dmi_id_dir = "/sys/devices/virtual/dmi/id"
+        vendor_dmi_file = os.path.join(dmi_id_dir, "sys_vendor")
+        product_dmi_file = os.path.join(dmi_id_dir, "product_name")
+
+        with open(vendor_dmi_file) as f:
+            vendor = f.read().replace("\n", "")
+        with open(product_dmi_file) as f:
+            product = f.read().replace("\n", "")
+
+        filenames = [vendor + "," + product]
+
+    return filenames
+
+
+def get_test_plan_filename(test_plan_dir):
+    chosen_test_plan_filename = ""
+    full_test_plan_paths = [
+        os.path.join(test_plan_dir, f + ".yaml")
+        for f in get_possible_test_plan_filenames()
+    ]
+    for path in full_test_plan_paths:
+        if os.path.exists(path):
+            chosen_test_plan_filename = path
+            break
+
+    if not chosen_test_plan_filename:
+        tried_paths = ",".join(["'" + p + "'" for p in full_test_plan_paths])
+        ksft.print_msg(f"No matching test plan file found (tried {tried_paths})")
+        ksft.print_cnts()
+        sys.exit(4)
+
+    return chosen_test_plan_filename
+
+
+parser = argparse.ArgumentParser()
+parser.add_argument(
+    "--test-plan-dir", default=".", help="Directory containing the test plan files"
+)
+parser.add_argument("--test-plan", help="Test plan file to use")
+args = parser.parse_args()
+
+ksft.print_header()
+
+if args.test_plan:
+    test_plan_filename = os.path.join(args.test_plan_dir, args.test_plan)
+    if not os.path.exists(test_plan_filename):
+        ksft.print_msg(f"Test plan file not found: {test_plan_filename}")
+        ksft.exit_fail()
+else:
+    test_plan_filename = get_test_plan_filename(args.test_plan_dir)
+
+run_test(test_plan_filename)
+
+ksft.finished()

-- 
2.46.0



From matthias.bgg at gmail.com  Mon Sep  9 12:05:24 2024
From: matthias.bgg at gmail.com (Matthias Brugger)
Date: Mon, 9 Sep 2024 21:05:24 +0200
Subject: [GIT PULL] MediaTek config updates for v6.12
Message-ID: <ea168bd6-b54b-47d3-ba5d-e545a9b406c1@gmail.com>

Hi Arnd,

Please find below the one and only update to the defconfig for MediaTek.
Sorry for the delay.

Matthias

---

The following changes since commit 8400291e289ee6b2bf9779ff1c83a291501f017b:

   Linux 6.11-rc1 (2024-07-28 14:19:55 -0700)

are available in the Git repository at:

   https://git.kernel.org/pub/scm/linux/kernel/git/mediatek/linux.git/ 
tags/v6.11-next-defconfig

for you to fetch changes up to e6be129f4c1865ad6985a853439a75d1ad6fad78:

   arm64: defconfig: enable mt8365 sound (2024-09-09 16:46:58 +0200)

----------------------------------------------------------------
mt8365:
- Enable audio handled by the SoC and the PMIC codec.

----------------------------------------------------------------
Alexandre Mergnat (1):
       arm64: defconfig: enable mt8365 sound

  arch/arm64/configs/defconfig | 2 ++
  1 file changed, 2 insertions(+)


From matthias.bgg at gmail.com  Mon Sep  9 12:05:32 2024
From: matthias.bgg at gmail.com (Matthias Brugger)
Date: Mon, 9 Sep 2024 21:05:32 +0200
Subject: [GIT PULL] MediaTek arm64 DTS updates for v6.12
Message-ID: <059656ad-5365-4097-86a1-f4ba43edf5da@gmail.com>

Hi Arnd,

Please find below the patches for the MediaTek device trees.
As you can see it's quite a bit, but several of them are actually fixing 
problems that were encountered. Would be great if you could find the time to 
pull them. Sorry for the delay.

Matthias

---

The following changes since commit 8400291e289ee6b2bf9779ff1c83a291501f017b:

   Linux 6.11-rc1 (2024-07-28 14:19:55 -0700)

are available in the Git repository at:

   https://git.kernel.org/pub/scm/linux/kernel/git/mediatek/linux.git/ 
tags/v6.11-next-dts64

for you to fetch changes up to a9efc40fd601cf779eab4e420d8da3372e4302cf:

   arm64: dts: mediatek: add audio support for mt8365-evk (2024-09-09 16:41:36 
+0200)

----------------------------------------------------------------
mt63xx:
- add ADC node to the different PMICs

mt7981:
- Add SPI controller nodes.

mt8183:
- use referenced label for DSI endpoint.
- disable soc_data efuse node, which does not has any cell definde
   (kukui).
- fix the regulator tree (kukui).
- fix potential deadlock by removing not needed clock in the MFG async
   power domain.
- add DPI node.

mt8186:
- fix opp-supported-hw mask for GPU.
- add lvts thermal sensor node.
- add thermal zones.
- fix reserved memory region of ADSP firmware (corsola).
- add power domain to DPI node.
- add SVS node.
- fix internal display by disabling the external display temporarily
   (corsola).

mt8188:
- add thermal sensor for the AP.
- add thermal zones.

mt8195:
- fix pull resistance for hdmi pins (cherry).
- remove keyboard backlight node (cherry), this is detected through
   ChromeOS EC communication.
- fix warning in mdp3 driver by providing a phandel to the SCP.
- fix probe error of the USB controller by disabeling USB3 on the
   controller (cherry).
- assign per default both phys to the USB controller (cherry).
- fix binding validation by re-ordering the dp_intf clocks.

mt8365:
- add AFE audio controller.
- add AFE and audio codec support (evk).

mt8395:
- fix probe error of the USB controller by disabeling USB3 on the
   controller (radax-nio-12l).
- assign per default both phys to the USB controller (genio, kontron,
   radax).

----------------------------------------------------------------
Alexandre Mergnat (2):
       arm64: dts: mediatek: add afe support for mt8365 SoC
       arm64: dts: mediatek: add audio support for mt8365-evk

AngeloGioacchino Del Regno (2):
       arm64: dts: mediatek: mt8186: Fix supported-hw mask for GPU OPPs
       arm64: dts: mediatek: Add ADC node on MT6357, MT6358, MT6359 PMICs

Chen-Yu Tsai (7):
       arm64: dts: mediatek: mt8183-kukui-jacuzzi: Simplify DSI endpoint replacement
       arm64: dts: mediatek: mt8195-cherry: Mark USB 3.0 on xhci1 as disabled
       arm64: dts: mediatek: mt8395-nio-12l: Mark USB 3.0 on xhci1 as disabled
       arm64: dts: mediatek: mt8195: Assign USB 3.0 PHY to xhci1 by default
       arm64: dts: mt8183-kukui: clean up regulator tree
       arm64: dts: mediatek: mt8195: Correct clock order for dp_intf*
       arm64: dts: mediatek: mt8186-corsola: Disable DPI display interface

Fei Shao (1):
       arm64: dts: mediatek: mt8186-corsola: Update ADSP reserved memory region

Nicolas Pitre (4):
       arm64: dts: mediatek: mt8186: add lvts definitions
       arm64: dts: mediatek: mt8186: add default thermal zones
       arm64: dts: mediatek: mt8188: add lvts definitions
       arm64: dts: mediatek: mt8188: add default thermal zones

N?colas F. R. A. Prado (4):
       arm64: dts: mediatek: cherry: Specify pull resistance for RSEL GPIOs
       arm64: dts: mediatek: mt8195-cherry: Remove keyboard-backlight node
       arm64: dts: mediatek: mt8195: Add SCP phandle to MDP3 DMA controller
       arm64: dts: mediatek: mt8183-kukui: Disable unused efuse at 8000000

Pi-Hsun Shih (1):
       arm64: dts: mt8183: add dpi node to mt8183

Pin-yen Lin (1):
       arm64: dts: mediatek: mt8183: Remove clock from mfg_async power domain

Rafa? Mi?ecki (1):
       arm64: dts: mediatek: mt7981: add SPI controllers

Rohit Agarwal (2):
       arm64: dts: mediatek: mt8186: Add power domain for DPI
       arm64: dts: mediatek: mt8186: Add svs node

  arch/arm64/boot/dts/mediatek/mt6357.dtsi           |   5 +
  arch/arm64/boot/dts/mediatek/mt6358.dtsi           |   5 +
  arch/arm64/boot/dts/mediatek/mt6359.dtsi           |   5 +
  arch/arm64/boot/dts/mediatek/mt7981b.dtsi          |  42 ++
  .../boot/dts/mediatek/mt8183-kukui-jacuzzi.dtsi    |  13 +-
  arch/arm64/boot/dts/mediatek/mt8183-kukui.dtsi     |  26 +-
  arch/arm64/boot/dts/mediatek/mt8183.dtsi           |  13 +-
  arch/arm64/boot/dts/mediatek/mt8186-corsola.dtsi   |   5 +-
  arch/arm64/boot/dts/mediatek/mt8186.dtsi           | 345 ++++++++++++++-
  arch/arm64/boot/dts/mediatek/mt8188.dtsi           | 482 +++++++++++++++++++++
  .../boot/dts/mediatek/mt8195-cherry-dojo-r1.dts    |  11 +-
  .../boot/dts/mediatek/mt8195-cherry-tomato-r2.dts  |  11 +-
  .../boot/dts/mediatek/mt8195-cherry-tomato-r3.dts  |  11 +-
  arch/arm64/boot/dts/mediatek/mt8195-cherry.dtsi    |   6 +-
  arch/arm64/boot/dts/mediatek/mt8195.dtsi           |  15 +-
  arch/arm64/boot/dts/mediatek/mt8365-evk.dts        |  86 ++++
  arch/arm64/boot/dts/mediatek/mt8365.dtsi           |  43 +-
  .../boot/dts/mediatek/mt8395-genio-1200-evk.dts    |   2 -
  .../dts/mediatek/mt8395-kontron-3-5-sbc-i1200.dts  |   1 +
  .../boot/dts/mediatek/mt8395-radxa-nio-12l.dts     |   2 +
  20 files changed, 1066 insertions(+), 63 deletions(-)


From matthias.bgg at gmail.com  Mon Sep  9 12:05:40 2024
From: matthias.bgg at gmail.com (Matthias Brugger)
Date: Mon, 9 Sep 2024 21:05:40 +0200
Subject: [GIT PULL] MediaTek driver updates for v6.12
Message-ID: <bfa9ab87-9de8-41fc-bfd1-de5ec324cfe0@gmail.com>

Hi Arnd,

Please find below the changes for the SoC driver for MediaTek. Sorry for the 
delay. Hope we are still in time to get the patches in.

Matthias

---


The following changes since commit 8400291e289ee6b2bf9779ff1c83a291501f017b:

   Linux 6.11-rc1 (2024-07-28 14:19:55 -0700)

are available in the Git repository at:

   https://git.kernel.org/pub/scm/linux/kernel/git/mediatek/linux.git/ 
tags/v6.11-next-soc

for you to fetch changes up to d1e5d531d20b085bb83d9ab1868ed99fdeb0cc42:

   soc: mediatek: mtk-mutex: Reduce type size for mtk_mutex_data members 
(2024-07-30 10:58:46 +0200)

----------------------------------------------------------------
pmic warpper:
- reduce size by constifying data structures
- use devm_clk_bulk_det_all_enable

mutex:
- reduce size by changing variable bit size

----------------------------------------------------------------
AngeloGioacchino Del Regno (1):
       soc: mediatek: mtk-mutex: Reduce type size for mtk_mutex_data members

Christophe JAILLET (3):
       soc: mediatek: pwrap: Constify struct pmic_wrapper_type
       soc: mediatek: pwrap: Constify some struct int[]
       soc: mediatek: pwrap: Use devm_clk_bulk_get_all_enable()

  drivers/soc/mediatek/mtk-mutex.c     |  52 +++++++--------
  drivers/soc/mediatek/mtk-pmic-wrap.c | 118 +++++++++--------------------------
  2 files changed, 56 insertions(+), 114 deletions(-)


From sboyd at kernel.org  Mon Sep  9 13:53:56 2024
From: sboyd at kernel.org (Stephen Boyd)
Date: Mon, 09 Sep 2024 13:53:56 -0700
Subject: [PATCH 10/13] dt-bindings: spmi: spmi-mtk-pmif: Add compatible for MT8188
In-Reply-To: <20240909111535.528624-11-fshao@chromium.org>
References: <20240909111535.528624-1-fshao@chromium.org> <20240909111535.528624-11-fshao@chromium.org>
Message-ID: <702f0a6c2a7529eee53681239056ffef.sboyd@kernel.org>

Quoting Fei Shao (2024-09-09 04:14:23)
> Add compatible string for the SPMI block on MT8188 SoC, which is
> compatible with the one used on MT8195.
> 
> Signed-off-by: Fei Shao <fshao at chromium.org>
> ---

Acked-by: Stephen Boyd <sboyd at kernel.org>


From broonie at kernel.org  Mon Sep  9 14:01:42 2024
From: broonie at kernel.org (Mark Brown)
Date: Mon, 09 Sep 2024 22:01:42 +0100
Subject: [PATCH] ASoC: codecs: fix the right check and simplify code
In-Reply-To: <20240908134604.3652-1-tangbin@cmss.chinamobile.com>
References: <20240908134604.3652-1-tangbin@cmss.chinamobile.com>
Message-ID: <172591570270.136248.14851761791754524473.b4-ty@kernel.org>

On Sun, 08 Sep 2024 21:46:04 +0800, Tang Bin wrote:
> In the file drivers/base/platform.c, the return description of
> platform_get_irq is 'non-zero IRQ number on success, negative
> error number on failure.', so the check is wrong, fix it. And
> when get irq failed, the function platform_get_irq logs an error
> message.
> 
> 
> [...]

Applied to

   https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git for-next

Thanks!

[1/1] ASoC: codecs: fix the right check and simplify code
      commit: 130eb72d3cb38a629205a2a192800b4b1b9bc5c9

All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.

You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.

If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.

Please add any relevant lists and maintainers to the CCs when replying
to this mail.

Thanks,
Mark



From broonie at kernel.org  Mon Sep  9 14:01:48 2024
From: broonie at kernel.org (Mark Brown)
Date: Mon, 09 Sep 2024 22:01:48 +0100
Subject: [PATCH] ASoC: Switch back to struct platform_driver::remove()
In-Reply-To: <20240909151230.909818-2-u.kleine-koenig@baylibre.com>
References: <20240909151230.909818-2-u.kleine-koenig@baylibre.com>
Message-ID: <172591570834.136248.17412626468486255591.b4-ty@kernel.org>

On Mon, 09 Sep 2024 17:12:30 +0200, Uwe Kleine-K?nig wrote:
> After commit 0edb555a65d1 ("platform: Make platform_driver::remove()
> return void") .remove() is (again) the right callback to implement for
> platform drivers.
> 
> Convert all drivers below sound/soc to use .remove(), with the eventual
> goal to drop struct platform_driver::remove_new(). As .remove() and
> .remove_new() have the same prototypes, conversion is done by just
> changing the structure member name in the driver initializer.
> 
> [...]

Applied to

   https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git for-next

Thanks!

[1/1] ASoC: Switch back to struct platform_driver::remove()
      commit: 130af75b5c05eef4ecd8593371f3e924bcd41241

All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.

You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.

If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.

Please add any relevant lists and maintainers to the CCs when replying
to this mail.

Thanks,
Mark



From sboyd at kernel.org  Mon Sep  9 14:20:55 2024
From: sboyd at kernel.org (Stephen Boyd)
Date: Mon, 09 Sep 2024 14:20:55 -0700
Subject: [PATCH] clk: Switch back to struct platform_driver::remove()
In-Reply-To: <20240909144026.870565-2-u.kleine-koenig@baylibre.com>
References: <20240909144026.870565-2-u.kleine-koenig@baylibre.com>
Message-ID: <ca22b69fe6311ba87a7dcca9948a62a7.sboyd@kernel.org>

Quoting Uwe Kleine-K?nig (2024-09-09 07:40:25)
> After commit 0edb555a65d1 ("platform: Make platform_driver::remove()
> return void") .remove() is (again) the right callback to implement for
> platform drivers.
> 
> Convert all clk drivers to use .remove(), with the eventual goal to drop
> struct platform_driver::remove_new(). As .remove() and .remove_new() have
> the same prototypes, conversion is done by just changing the structure
> member name in the driver initializer.
> 
> Signed-off-by: Uwe Kleine-K?nig <u.kleine-koenig at baylibre.com>
> ---
> Hello,
> 
> I was lazy and created a single patch for all of clk. Please tell me if
> I should split per vendor (or per-driver). Given that touches so many
> drivers, I also stripped the individual maintainers and just kept the
> mailing lists. I hope this doesn't prevent people to give feedback, but
> otherwise the Cc: list gets Huge.
> 

I'll apply it on top of clk-next right before sending the main clk PR to
Linus.


From broonie at kernel.org  Mon Sep  9 14:57:17 2024
From: broonie at kernel.org (Mark Brown)
Date: Mon, 09 Sep 2024 22:57:17 +0100
Subject: [PATCH 0/7] ASoC: mt8365: Fix -Werror builds
In-Reply-To: <20240907-asoc-fix-mt8365-build-v1-0-7ad0bac20161@kernel.org>
References: <20240907-asoc-fix-mt8365-build-v1-0-7ad0bac20161@kernel.org>
Message-ID: <172591903776.148496.17884899696654432666.b4-ty@kernel.org>

On Sat, 07 Sep 2024 01:53:25 +0100, Mark Brown wrote:
> Nathan reported that the newly added mt8365 drivers were causing a
> number of warnings which break -Werror builds, these were only visible
> on arm64 since the drivers did not have COMPILE_TEST enabled.  Fix this
> and some other minor stuff I noticed while doing so.
> 
> 

Applied to

   https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git for-next

Thanks!

[1/7] ASoC: mt8365: Open code BIT() to avoid spurious warnings
      commit: d01c6a398750aae265c17859b57d7409a6d9181d
[2/7] ASoC: mt8365: Remove spurious unsigned long casts
      commit: 1b084d8e3b98ca460b815cff14617719ebe605ad
[3/7] ASoC: mt8365: Remove unused prototype for mt8365_afe_clk_group_48k()
      commit: 3e61df7d2ff67875c770a7f548038054d05a0f15
[4/7] ASoC: mt8365: Make non-exported functions static
      commit: 63157d994025639075b3faa372976a96186322c1
[5/7] ASoC: mt8365: Remove unused variables
      commit: 067d832806225cfaabeec8f5f683b7e2bc508a6d
[6/7] ASoC: mt8365: Remove unused DMIC IIR coefficient configuration
      commit: d70ce6d3105a6bd02b1708c399105631643a550a
[7/7] ASoC: mt8365: Allow build coverage
      commit: 36fa259b214c37bbae3e0b7a47e7fb49cb0ab462

All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.

You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.

If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.

Please add any relevant lists and maintainers to the CCs when replying
to this mail.

Thanks,
Mark



From lkp at intel.com  Mon Sep  9 18:33:49 2024
From: lkp at intel.com (kernel test robot)
Date: Tue, 10 Sep 2024 09:33:49 +0800
Subject: [PATCH v3 2/2] ufs: core: requeue aborted request
In-Reply-To: <20240909082100.24019-3-peter.wang@mediatek.com>
References: <20240909082100.24019-3-peter.wang@mediatek.com>
Message-ID: <202409100826.Iql38Ss9-lkp@intel.com>

Hi,

kernel test robot noticed the following build warnings:

[auto build test WARNING on jejb-scsi/for-next]
[also build test WARNING on mkp-scsi/for-next linus/master v6.11-rc7 next-20240909]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/peter-wang-mediatek-com/ufs-core-fix-the-issue-of-ICU-failure/20240909-163021
base:   https://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi.git for-next
patch link:    https://lore.kernel.org/r/20240909082100.24019-3-peter.wang%40mediatek.com
patch subject: [PATCH v3 2/2] ufs: core: requeue aborted request
config: i386-buildonly-randconfig-002-20240910 (https://download.01.org/0day-ci/archive/20240910/202409100826.Iql38Ss9-lkp at intel.com/config)
compiler: gcc-12 (Debian 12.2.0-14) 12.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240910/202409100826.Iql38Ss9-lkp at intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp at intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202409100826.Iql38Ss9-lkp at intel.com/

All warnings (new ones prefixed by >>):

   drivers/ufs/core/ufshcd.c: In function 'ufshcd_abort_one':
>> drivers/ufs/core/ufshcd.c:6491:28: warning: unused variable 'lrbp' [-Wunused-variable]
    6491 |         struct ufshcd_lrb *lrbp = &hba->lrb[tag];
         |                            ^~~~


vim +/lrbp +6491 drivers/ufs/core/ufshcd.c

2355b66ed20ce4 drivers/scsi/ufs/ufshcd.c Can Guo         2020-08-24  6482  
f9c028e7415a5b drivers/ufs/core/ufshcd.c Bart Van Assche 2023-07-27  6483  static bool ufshcd_abort_one(struct request *rq, void *priv)
b817e6ffbad7a1 drivers/ufs/core/ufshcd.c Bart Van Assche 2022-10-31  6484  {
f9c028e7415a5b drivers/ufs/core/ufshcd.c Bart Van Assche 2023-07-27  6485  	int *ret = priv;
f9c028e7415a5b drivers/ufs/core/ufshcd.c Bart Van Assche 2023-07-27  6486  	u32 tag = rq->tag;
f9c028e7415a5b drivers/ufs/core/ufshcd.c Bart Van Assche 2023-07-27  6487  	struct scsi_cmnd *cmd = blk_mq_rq_to_pdu(rq);
f9c028e7415a5b drivers/ufs/core/ufshcd.c Bart Van Assche 2023-07-27  6488  	struct scsi_device *sdev = cmd->device;
f9c028e7415a5b drivers/ufs/core/ufshcd.c Bart Van Assche 2023-07-27  6489  	struct Scsi_Host *shost = sdev->host;
f9c028e7415a5b drivers/ufs/core/ufshcd.c Bart Van Assche 2023-07-27  6490  	struct ufs_hba *hba = shost_priv(shost);
93e6c0e19d5bb1 drivers/ufs/core/ufshcd.c Peter Wang      2023-11-15 @6491  	struct ufshcd_lrb *lrbp = &hba->lrb[tag];
ab248643d3d68b drivers/ufs/core/ufshcd.c Bao D. Nguyen   2023-05-29  6492  
f9c028e7415a5b drivers/ufs/core/ufshcd.c Bart Van Assche 2023-07-27  6493  	*ret = ufshcd_try_to_abort_task(hba, tag);
ab248643d3d68b drivers/ufs/core/ufshcd.c Bao D. Nguyen   2023-05-29  6494  	dev_err(hba->dev, "Aborting tag %d / CDB %#02x %s\n", tag,
ab248643d3d68b drivers/ufs/core/ufshcd.c Bao D. Nguyen   2023-05-29  6495  		hba->lrb[tag].cmd ? hba->lrb[tag].cmd->cmnd[0] : -1,
f9c028e7415a5b drivers/ufs/core/ufshcd.c Bart Van Assche 2023-07-27  6496  		*ret ? "failed" : "succeeded");
93e6c0e19d5bb1 drivers/ufs/core/ufshcd.c Peter Wang      2023-11-15  6497  
f9c028e7415a5b drivers/ufs/core/ufshcd.c Bart Van Assche 2023-07-27  6498  	return *ret == 0;
ab248643d3d68b drivers/ufs/core/ufshcd.c Bao D. Nguyen   2023-05-29  6499  }
f9c028e7415a5b drivers/ufs/core/ufshcd.c Bart Van Assche 2023-07-27  6500  

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki


From fshao at chromium.org  Mon Sep  9 22:12:15 2024
From: fshao at chromium.org (Fei Shao)
Date: Tue, 10 Sep 2024 13:12:15 +0800
Subject: [PATCH 06/13] arm64: dts: mediatek: mt8188: Update VPPSYS node
 name and compatible
In-Reply-To: <11bc2522-bc10-4dcf-8142-708b57d181cf@kernel.org>
References: <20240909111535.528624-1-fshao@chromium.org> <20240909111535.528624-7-fshao@chromium.org>
 <11bc2522-bc10-4dcf-8142-708b57d181cf@kernel.org>
Message-ID: <CAC=S1nhiJ=7yAucJsaYKUUBrwrxOVBMB2CF=bFwyLa2o-5RmWw@mail.gmail.com>

On Mon, Sep 9, 2024 at 7:41?PM Krzysztof Kozlowski <krzk at kernel.org> wrote:
>
> On 09/09/2024 13:14, Fei Shao wrote:
> > Use and add "syscon" in VPPSYS node names and compatible to fix errors
> > from `make CHECK_DTBS=y mediatek/mt8188-evb.dtb`.
> >
> > Signed-off-by: Fei Shao <fshao at chromium.org>
> > ---
> >
> >  arch/arm64/boot/dts/mediatek/mt8188.dtsi | 8 ++++----
> >  1 file changed, 4 insertions(+), 4 deletions(-)
> >
> > diff --git a/arch/arm64/boot/dts/mediatek/mt8188.dtsi b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
> > index 2900d78b7ceb..14e51a11f688 100644
> > --- a/arch/arm64/boot/dts/mediatek/mt8188.dtsi
> > +++ b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
> > @@ -1799,8 +1799,8 @@ mfgcfg: clock-controller at 13fbf000 {
> >                       #clock-cells = <1>;
> >               };
> >
> > -             vppsys0: clock-controller at 14000000 {
> > -                     compatible = "mediatek,mt8188-vppsys0";
> > +             vppsys0: syscon at 14000000 {
> > +                     compatible = "mediatek,mt8188-vppsys0", "syscon";
>
> If this was working before, it looks like this is not a syscon and
> bindings need to be fixed.

I guess it's because the binding was later updated in commit
26bcd8a53098 ("dt-bindings: arm: mediatek: mmsys: Add VPPSYS
compatible for MT8188"), and the corresponding DT update was unnoticed
at the time.
If that makes sense then this should be a valid fix.

Regards,
Fei

>
> Best regards,
> Krzysztof
>


From fshao at chromium.org  Mon Sep  9 22:15:20 2024
From: fshao at chromium.org (Fei Shao)
Date: Tue, 10 Sep 2024 13:15:20 +0800
Subject: [PATCH 01/13] arm64: dts: mediatek: mt8188: Add CPU performance
 controller for CPUFreq
In-Reply-To: <b5b540f7-d26f-4529-8066-506aa02a0654@kernel.org>
References: <20240909111535.528624-1-fshao@chromium.org> <20240909111535.528624-2-fshao@chromium.org>
 <b5b540f7-d26f-4529-8066-506aa02a0654@kernel.org>
Message-ID: <CAC=S1nhaNE3qoL=H1cx2XLszLO7EqTHX13KoKwgFENX_=Eqqvw@mail.gmail.com>

On Mon, Sep 9, 2024 at 7:42?PM Krzysztof Kozlowski <krzk at kernel.org> wrote:
>
> On 09/09/2024 13:14, Fei Shao wrote:
> > Add performance controller node and performance-domains properties for
> > CPUFreq support on MT8188 SoC.
> >
> > Signed-off-by: Fei Shao <fshao at chromium.org>
> > ---
>
> Order of these patches is not helping. You mix new features with fixes
> and bindings.
>
> Please split fixes from the rest. Bindings are expected to be first in
> the series.

Understood. I'll resend the fixes and features in separate series, and
group the binding changes in the beginning.
Thanks for the feedback.

Regards,
Fei

>
> Best regards,
> Krzysztof
>


From peter.wang at mediatek.com  Mon Sep  9 22:40:34 2024
From: peter.wang at mediatek.com (=?utf-8?B?UGV0ZXIgV2FuZyAo546L5L+h5Y+LKQ==?=)
Date: Tue, 10 Sep 2024 05:40:34 +0000
Subject: [PATCH v3 2/2] ufs: core: requeue aborted request
In-Reply-To: <c4d22b9c-2554-4871-94dc-3dae4bd62a5a@acm.org>
References: <20240909082100.24019-1-peter.wang@mediatek.com>
	 <20240909082100.24019-3-peter.wang@mediatek.com>
	 <c4d22b9c-2554-4871-94dc-3dae4bd62a5a@acm.org>
Message-ID: <2c93526e74cca5ac7ee6d952a80051733ea37c2c.camel@mediatek.com>

On Mon, 2024-09-09 at 09:34 -0700, Bart Van Assche wrote:
>  	 
> External email : Please do not click links or open attachments until
> you have verified the sender or the content.
>  On 9/9/24 1:21 AM, peter.wang at mediatek.com wrote:
> > diff --git a/drivers/ufs/core/ufs-mcq.c b/drivers/ufs/core/ufs-
> mcq.c
> > index 3903947dbed1..1f57ebf24a39 100644
> > --- a/drivers/ufs/core/ufs-mcq.c
> > +++ b/drivers/ufs/core/ufs-mcq.c
> > @@ -642,6 +642,7 @@ static bool ufshcd_mcq_sqe_search(struct
> ufs_hba *hba,
> >   match = le64_to_cpu(utrd->command_desc_base_addr) & CQE_UCD_BA;
> >   if (addr == match) {
> >   ufshcd_mcq_nullify_sqe(utrd);
> > +lrbp->abort_initiated_by_err = true;
> >   ret = true;
> >   goto out;
> >   }
> 
> As mentioned before, I think that this change is wrong. Setting
> lrbp->abort_initiated_by_err affects the value of scsi_cmnd::result.
> This member variable is ignored for aborted commands. Although the
> above change does not affect the SCSI error handler, I think it
> should
> be left out because it will confuse anyone who reads the UFS driver
> code
> and who has not followed this discussion.
> 

Hi Bart,

Since this is unlikely to happen and the code is not expected 
to reach here, I think it's better to wait and see if it occurs.
And open a discussion on how to deal with this case if occurs.
I will remove it in the next version.


> > @@ -7561,6 +7552,16 @@ int ufshcd_try_to_abort_task(struct ufs_hba
> *hba, int tag)
> >   goto out;
> >   }
> >   
> > +/*
> > + * When the host software receives a "FUNCTION COMPLETE", set flag
> > + * to requeue command after receive response with OCS_ABORTED
> > + * SDB mode: UTRLCLR Task Management response which means a
> Transfer
> > + *           Request was aborted.
> > + * MCQ mode: Host will post to CQ with OCS_ABORTED after SQ
> cleanup
> > + */
> > +if (!err)
> > +lrbp->abort_initiated_by_err = true;
> 
> Please add a comment that explains that the purpose of this code is
> to 
> requeue commands aborted by ufshcd_abort_all().
> 

Okay, I will add more comment.

> > + * @abort_initiated_by_err: abort initiated by error
> 
> The member variable name and also the explanation of this member
> variable are incomprehensible to me.
> 

I will add more flag description too.

Thanks.
Peter


> Thanks,
> 
> Bart.

From jens.wiklander at linaro.org  Mon Sep  9 23:06:46 2024
From: jens.wiklander at linaro.org (Jens Wiklander)
Date: Tue, 10 Sep 2024 08:06:46 +0200
Subject: [RFC PATCH 4/4] dma-buf: heaps: add Linaro restricted dmabuf heap support
In-Reply-To: <CABdmKX0qd0RoTn2TBQTs9zdf=_JP8pW8hFRUR_7n_t-sfxsGdg@mail.gmail.com>
References: <20240830070351.2855919-1-jens.wiklander@linaro.org>
 <20240830070351.2855919-5-jens.wiklander@linaro.org> <CABdmKX2KzswmiDY4oWw69_rPWs8d_Cqp7OXouSeMQaYX1SDSmw@mail.gmail.com>
 <CAHUa44FYYFVQWf0DGUXNHoOVQEC0-HRyYa0386dHNjo4y1qSiQ@mail.gmail.com> <CABdmKX0qd0RoTn2TBQTs9zdf=_JP8pW8hFRUR_7n_t-sfxsGdg@mail.gmail.com>
Message-ID: <CAHUa44E-7UMseWSEeneYYnAPyhH___=a1YYR6uaOVTNZytzg7g@mail.gmail.com>

On Wed, Sep 4, 2024 at 11:42?PM T.J. Mercier <tjmercier at google.com> wrote:
>
> On Wed, Sep 4, 2024 at 2:44?AM Jens Wiklander <jens.wiklander at linaro.org> wrote:
> >
> > On Tue, Sep 3, 2024 at 7:50?PM T.J. Mercier <tjmercier at google.com> wrote:
> > >
> > > On Fri, Aug 30, 2024 at 12:04?AM Jens Wiklander
> > > <jens.wiklander at linaro.org> wrote:
> > > >
> > > > Add a Linaro restricted heap using the linaro,restricted-heap bindings
> > > > implemented based on the generic restricted heap.
> > > >
> > > > The bindings defines a range of physical restricted memory. The heap
> > > > manages this address range using genalloc. The allocated dma-buf file
> > > > descriptor can later be registered with the TEE subsystem for later use
> > > > via Trusted Applications in the secure world.
> > > >
> > > > Co-developed-by: Olivier Masse <olivier.masse at nxp.com>
> > > > Signed-off-by: Olivier Masse <olivier.masse at nxp.com>
> > > > Signed-off-by: Jens Wiklander <jens.wiklander at linaro.org>
> > > > ---
> > > >  drivers/dma-buf/heaps/Kconfig                 |  10 ++
> > > >  drivers/dma-buf/heaps/Makefile                |   1 +
> > > >  .../dma-buf/heaps/restricted_heap_linaro.c    | 165 ++++++++++++++++++
> > > >  3 files changed, 176 insertions(+)
> > > >  create mode 100644 drivers/dma-buf/heaps/restricted_heap_linaro.c
> > > >
> > > > diff --git a/drivers/dma-buf/heaps/Kconfig b/drivers/dma-buf/heaps/Kconfig
> > > > index 58903bc62ac8..82e2c5d09242 100644
> > > > --- a/drivers/dma-buf/heaps/Kconfig
> > > > +++ b/drivers/dma-buf/heaps/Kconfig
> > > > @@ -28,3 +28,13 @@ config DMABUF_HEAPS_RESTRICTED_MTK
> > > >         help
> > > >           Enable restricted dma-buf heaps for MediaTek platform. This heap is backed by
> > > >           TEE client interfaces. If in doubt, say N.
> > > > +
> > > > +config DMABUF_HEAPS_RESTRICTED_LINARO
> > > > +       bool "Linaro DMA-BUF Restricted Heap"
> > > > +       depends on DMABUF_HEAPS_RESTRICTED
> > > > +       help
> > > > +         Choose this option to enable the Linaro restricted dma-buf heap.
> > > > +         The restricted heap pools are defined according to the DT. Heaps
> > > > +         are allocated in the pools using gen allocater.
> > > > +         If in doubt, say N.
> > > > +
> > > > diff --git a/drivers/dma-buf/heaps/Makefile b/drivers/dma-buf/heaps/Makefile
> > > > index 0028aa9d875f..66b2f67c47b5 100644
> > > > --- a/drivers/dma-buf/heaps/Makefile
> > > > +++ b/drivers/dma-buf/heaps/Makefile
> > > > @@ -2,4 +2,5 @@
> > > >  obj-$(CONFIG_DMABUF_HEAPS_CMA)         += cma_heap.o
> > > >  obj-$(CONFIG_DMABUF_HEAPS_RESTRICTED)  += restricted_heap.o
> > > >  obj-$(CONFIG_DMABUF_HEAPS_RESTRICTED_MTK)      += restricted_heap_mtk.o
> > > > +obj-$(CONFIG_DMABUF_HEAPS_RESTRICTED_LINARO)   += restricted_heap_linaro.o
> > > >  obj-$(CONFIG_DMABUF_HEAPS_SYSTEM)      += system_heap.o
> > > > diff --git a/drivers/dma-buf/heaps/restricted_heap_linaro.c b/drivers/dma-buf/heaps/restricted_heap_linaro.c
> > > > new file mode 100644
> > > > index 000000000000..4b08ed514023
> > > > --- /dev/null
> > > > +++ b/drivers/dma-buf/heaps/restricted_heap_linaro.c
> > > > @@ -0,0 +1,165 @@
> > > > +// SPDX-License-Identifier: GPL-2.0
> > > > +/*
> > > > + * DMABUF secure heap exporter
> > > > + *
> > > > + * Copyright 2021 NXP.
> > > > + * Copyright 2024 Linaro Limited.
> > > > + */
> > > > +
> > > > +#define pr_fmt(fmt)     "rheap_linaro: " fmt
> > > > +
> > > > +#include <linux/dma-buf.h>
> > > > +#include <linux/err.h>
> > > > +#include <linux/genalloc.h>
> > > > +#include <linux/module.h>
> > > > +#include <linux/of.h>
> > > > +#include <linux/of_fdt.h>
> > > > +#include <linux/of_reserved_mem.h>
> > > > +#include <linux/scatterlist.h>
> > > > +#include <linux/slab.h>
> > > > +
> > > > +#include "restricted_heap.h"
> > > > +
> > > > +#define MAX_HEAP_COUNT 2
> > >
> > > Are multiple supported because of what Cyrille mentioned here about permissions?
> > > https://lore.kernel.org/lkml/DBBPR04MB7514E006455AEA407041E4F788709 at DBBPR04MB7514.eurprd04.prod.outlook.com/
> >
> > Yes, I kept that as is.
>
> Ok thanks.
>
> > > So this is just some arbitrary limit? I'd prefer to have some sort of
> > > documentation about this.
> >
> > How about removing the limit and using dynamic allocation instead?
>
> That works too!

It turns out that was easier said than done. The limit is hardcoded
because dynamic memory allocation isn't available at that stage during
boot. We have a short description of this heap in Kconfig. I'll add
something about the limit there if that makes sense.

Thanks,
Jens


From yuanhsinte at chromium.org  Mon Sep  9 23:20:55 2024
From: yuanhsinte at chromium.org (Hsin-Te Yuan)
Date: Tue, 10 Sep 2024 06:20:55 +0000
Subject: [PATCH] arm64: dts: mt8183: Add encoder node
Message-ID: <20240910-venc-v1-1-d17dfd931dc8@chromium.org>

Add encoder node.

Signed-off-by: Hsin-Te Yuan <yuanhsinte at chromium.org>
---
According to
https://lore.kernel.org/all/184d895c-239e-3f23-970e-6a9563235cd9 at gmail.com/,
the encoder node of MT8183 should be added only after its dependency has
been accepted. Add the encoder node in this patch.
---
 arch/arm64/boot/dts/mediatek/mt8183.dtsi | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/arch/arm64/boot/dts/mediatek/mt8183.dtsi b/arch/arm64/boot/dts/mediatek/mt8183.dtsi
index fbf145639b8c90b2c69da1cb4bac4f61ca7a1c9e..d24c89e4e13b0c74f549e638e97e0729052909a7 100644
--- a/arch/arm64/boot/dts/mediatek/mt8183.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8183.dtsi
@@ -1965,6 +1965,24 @@ larb4: larb at 17010000 {
 			power-domains = <&spm MT8183_POWER_DOMAIN_VENC>;
 		};
 
+		vcodec_enc: vcodec at 17020000 {
+			compatible = "mediatek,mt8183-vcodec-enc";
+			reg = <0 0x17020000 0 0x1000>,
+			interrupts = <GIC_SPI 247 IRQ_TYPE_LEVEL_LOW>;
+			mediatek,larb = <&larb4>;
+			iommus = <&iommu M4U_PORT_VENC_REC>,
+				 <&iommu M4U_PORT_VENC_BSDMA>,
+				 <&iommu M4U_PORT_VENC_RD_COMV>,
+				 <&iommu M4U_PORT_VENC_CUR_LUMA>,
+				 <&iommu M4U_PORT_VENC_CUR_CHROMA>,
+				 <&iommu M4U_PORT_VENC_REF_LUMA>,
+				 <&iommu M4U_PORT_VENC_REF_CHROMA>;
+			mediatek,scp = <&scp>;
+			power-domains = <&spm MT8183_POWER_DOMAIN_VENC>;
+			clocks = <&vencsys CLK_VENC_VENC>;
+			clock-names = "MT_CG_VENC";
+		};
+
 		venc_jpg: jpeg-encoder at 17030000 {
 			compatible = "mediatek,mt8183-jpgenc", "mediatek,mtk-jpgenc";
 			reg = <0 0x17030000 0 0x1000>;

---
base-commit: da3ea35007d0af457a0afc87e84fddaebc4e0b63
change-id: 20240909-venc-4705c7fff5d6

Best regards,
-- 
Hsin-Te Yuan <yuanhsinte at chromium.org>



From yuanhsinte at chromium.org  Mon Sep  9 23:33:33 2024
From: yuanhsinte at chromium.org (Hsin-Te Yuan)
Date: Tue, 10 Sep 2024 06:33:33 +0000
Subject: [PATCH] arm64: dts: mt8183: set DMIC one-wire mode on Damu
Message-ID: <20240910-one-wire-v1-1-d25486a6ba6d@chromium.org>

From: Hsin-Yi Wang <hsinyi at chromium.org>

Sets DMIC one-wire mode on Damu.

Signed-off-by: Hsin-Te Yuan <yuanhsinte at chromium.org>
---
 arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-damu.dts | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-damu.dts b/arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-damu.dts
index 0b45aee2e29953b6117b462034a00dff2596b9ff..06a689feff52945d141d196d439cba034f25fdf6 100644
--- a/arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-damu.dts
+++ b/arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-damu.dts
@@ -26,6 +26,10 @@ &touchscreen {
 	hid-descr-addr = <0x0001>;
 };
 
+&mt6358codec {
+	mediatek,dmic-mode = <1>; /* one-wire */
+};
+
 &qca_wifi {
 	qcom,ath10k-calibration-variant = "GO_DAMU";
 };

---
base-commit: da3ea35007d0af457a0afc87e84fddaebc4e0b63
change-id: 20240910-one-wire-2d0f7113dc8b

Best regards,
-- 
Hsin-Te Yuan <yuanhsinte at chromium.org>



From krzk at kernel.org  Tue Sep 10 00:18:51 2024
From: krzk at kernel.org (Krzysztof Kozlowski)
Date: Tue, 10 Sep 2024 09:18:51 +0200
Subject: [PATCH 06/13] arm64: dts: mediatek: mt8188: Update VPPSYS node
 name and compatible
In-Reply-To: <CAC=S1nhiJ=7yAucJsaYKUUBrwrxOVBMB2CF=bFwyLa2o-5RmWw@mail.gmail.com>
References: <20240909111535.528624-1-fshao@chromium.org>
 <20240909111535.528624-7-fshao@chromium.org>
 <11bc2522-bc10-4dcf-8142-708b57d181cf@kernel.org>
 <CAC=S1nhiJ=7yAucJsaYKUUBrwrxOVBMB2CF=bFwyLa2o-5RmWw@mail.gmail.com>
Message-ID: <64cc35c8-30df-4882-a933-f42119270f48@kernel.org>

On 10/09/2024 07:12, Fei Shao wrote:
> On Mon, Sep 9, 2024 at 7:41?PM Krzysztof Kozlowski <krzk at kernel.org> wrote:
>>
>> On 09/09/2024 13:14, Fei Shao wrote:
>>> Use and add "syscon" in VPPSYS node names and compatible to fix errors
>>> from `make CHECK_DTBS=y mediatek/mt8188-evb.dtb`.
>>>
>>> Signed-off-by: Fei Shao <fshao at chromium.org>
>>> ---
>>>
>>>  arch/arm64/boot/dts/mediatek/mt8188.dtsi | 8 ++++----
>>>  1 file changed, 4 insertions(+), 4 deletions(-)
>>>
>>> diff --git a/arch/arm64/boot/dts/mediatek/mt8188.dtsi b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
>>> index 2900d78b7ceb..14e51a11f688 100644
>>> --- a/arch/arm64/boot/dts/mediatek/mt8188.dtsi
>>> +++ b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
>>> @@ -1799,8 +1799,8 @@ mfgcfg: clock-controller at 13fbf000 {
>>>                       #clock-cells = <1>;
>>>               };
>>>
>>> -             vppsys0: clock-controller at 14000000 {
>>> -                     compatible = "mediatek,mt8188-vppsys0";
>>> +             vppsys0: syscon at 14000000 {
>>> +                     compatible = "mediatek,mt8188-vppsys0", "syscon";
>>
>> If this was working before, it looks like this is not a syscon and
>> bindings need to be fixed.
> 
> I guess it's because the binding was later updated in commit
> 26bcd8a53098 ("dt-bindings: arm: mediatek: mmsys: Add VPPSYS
> compatible for MT8188"), and the corresponding DT update was unnoticed
> at the time.
> If that makes sense then this should be a valid fix.

Not necessarily. Why not fixing bindings? Prove that bindings are
correct, not DTS, first.

Best regards,
Krzysztof



From peter.wang at mediatek.com  Tue Sep 10 00:30:34 2024
From: peter.wang at mediatek.com (peter.wang at mediatek.com)
Date: Tue, 10 Sep 2024 15:30:34 +0800
Subject: [PATCH v4 1/2] ufs: core: fix the issue of ICU failure
In-Reply-To: <20240910073035.25974-1-peter.wang@mediatek.com>
References: <20240910073035.25974-1-peter.wang@mediatek.com>
Message-ID: <20240910073035.25974-2-peter.wang@mediatek.com>

From: Peter Wang <peter.wang at mediatek.com>

When setting the ICU bit without using read-modify-write,
SQRTCy will restart SQ again and receive an RTC return
error code 2 (Failure - SQ not stopped).

Additionally, the error log has been modified so that
this type of error can be observed.

Fixes: ab248643d3d6 ("scsi: ufs: core: Add error handling for MCQ mode")
Cc: stable at vger.kernel.org
Signed-off-by: Peter Wang <peter.wang at mediatek.com>
Reviewed-by: Bao D. Nguyen <quic_nguyenb at quicinc.com>
Reviewed-by: Bart Van Assche <bvanassche at acm.org>
---
 drivers/ufs/core/ufs-mcq.c | 15 ++++++++-------
 1 file changed, 8 insertions(+), 7 deletions(-)

diff --git a/drivers/ufs/core/ufs-mcq.c b/drivers/ufs/core/ufs-mcq.c
index 5891cdacd0b3..3903947dbed1 100644
--- a/drivers/ufs/core/ufs-mcq.c
+++ b/drivers/ufs/core/ufs-mcq.c
@@ -539,7 +539,7 @@ int ufshcd_mcq_sq_cleanup(struct ufs_hba *hba, int task_tag)
 	struct scsi_cmnd *cmd = lrbp->cmd;
 	struct ufs_hw_queue *hwq;
 	void __iomem *reg, *opr_sqd_base;
-	u32 nexus, id, val;
+	u32 nexus, id, val, rtc;
 	int err;
 
 	if (hba->quirks & UFSHCD_QUIRK_MCQ_BROKEN_RTC)
@@ -569,17 +569,18 @@ int ufshcd_mcq_sq_cleanup(struct ufs_hba *hba, int task_tag)
 	opr_sqd_base = mcq_opr_base(hba, OPR_SQD, id);
 	writel(nexus, opr_sqd_base + REG_SQCTI);
 
-	/* SQRTCy.ICU = 1 */
-	writel(SQ_ICU, opr_sqd_base + REG_SQRTC);
+	/* Initiate Cleanup */
+	writel(readl(opr_sqd_base + REG_SQRTC) | SQ_ICU,
+		opr_sqd_base + REG_SQRTC);
 
 	/* Poll SQRTSy.CUS = 1. Return result from SQRTSy.RTC */
 	reg = opr_sqd_base + REG_SQRTS;
 	err = read_poll_timeout(readl, val, val & SQ_CUS, 20,
 				MCQ_POLL_US, false, reg);
-	if (err)
-		dev_err(hba->dev, "%s: failed. hwq=%d, tag=%d err=%ld\n",
-			__func__, id, task_tag,
-			FIELD_GET(SQ_ICU_ERR_CODE_MASK, readl(reg)));
+	rtc = FIELD_GET(SQ_ICU_ERR_CODE_MASK, readl(reg));
+	if (err || rtc)
+		dev_err(hba->dev, "%s: failed. hwq=%d, tag=%d err=%d RTC=%d\n",
+			__func__, id, task_tag, err, rtc);
 
 	if (ufshcd_mcq_sq_start(hba, hwq))
 		err = -ETIMEDOUT;
-- 
2.45.2



From peter.wang at mediatek.com  Tue Sep 10 00:30:35 2024
From: peter.wang at mediatek.com (peter.wang at mediatek.com)
Date: Tue, 10 Sep 2024 15:30:35 +0800
Subject: [PATCH v4 2/2] ufs: core: requeue aborted request
In-Reply-To: <20240910073035.25974-1-peter.wang@mediatek.com>
References: <20240910073035.25974-1-peter.wang@mediatek.com>
Message-ID: <20240910073035.25974-3-peter.wang@mediatek.com>

From: Peter Wang <peter.wang at mediatek.com>

ufshcd_abort_all froce abort all on-going command and the host
will automatically fill in the OCS field of the corresponding
response with OCS_ABORTED based on different working modes.

MCQ mode: aborts a command using SQ cleanup, The host controller
will post a Completion Queue entry with OCS = ABORTED.

SDB mode: aborts a command using UTRLCLR. Task Management response
which means a Transfer Request was aborted.

For these two cases, set a flag to notify SCSI to requeue the
command after receiving response with OCS_ABORTED.

Fixes: ab248643d3d6 ("scsi: ufs: core: Add error handling for MCQ mode")
Cc: stable at vger.kernel.org
Signed-off-by: Peter Wang <peter.wang at mediatek.com>
---
 drivers/ufs/core/ufshcd.c | 34 +++++++++++++++++++---------------
 include/ufs/ufshcd.h      |  3 +++
 2 files changed, 22 insertions(+), 15 deletions(-)

diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
index a6f818cdef0e..615da47c1727 100644
--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -3006,6 +3006,7 @@ static int ufshcd_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd)
 	ufshcd_prepare_lrbp_crypto(scsi_cmd_to_rq(cmd), lrbp);
 
 	lrbp->req_abort_skip = false;
+	lrbp->abort_initiated_by_err = false;
 
 	ufshcd_comp_scsi_upiu(hba, lrbp);
 
@@ -5404,7 +5405,10 @@ ufshcd_transfer_rsp_status(struct ufs_hba *hba, struct ufshcd_lrb *lrbp,
 		}
 		break;
 	case OCS_ABORTED:
-		result |= DID_ABORT << 16;
+		if (lrbp->abort_initiated_by_err)
+			result |= DID_REQUEUE << 16;
+		else
+			result |= DID_ABORT << 16;
 		break;
 	case OCS_INVALID_COMMAND_STATUS:
 		result |= DID_REQUEUE << 16;
@@ -6471,26 +6475,12 @@ static bool ufshcd_abort_one(struct request *rq, void *priv)
 	struct scsi_device *sdev = cmd->device;
 	struct Scsi_Host *shost = sdev->host;
 	struct ufs_hba *hba = shost_priv(shost);
-	struct ufshcd_lrb *lrbp = &hba->lrb[tag];
-	struct ufs_hw_queue *hwq;
-	unsigned long flags;
 
 	*ret = ufshcd_try_to_abort_task(hba, tag);
 	dev_err(hba->dev, "Aborting tag %d / CDB %#02x %s\n", tag,
 		hba->lrb[tag].cmd ? hba->lrb[tag].cmd->cmnd[0] : -1,
 		*ret ? "failed" : "succeeded");
 
-	/* Release cmd in MCQ mode if abort succeeds */
-	if (hba->mcq_enabled && (*ret == 0)) {
-		hwq = ufshcd_mcq_req_to_hwq(hba, scsi_cmd_to_rq(lrbp->cmd));
-		if (!hwq)
-			return 0;
-		spin_lock_irqsave(&hwq->cq_lock, flags);
-		if (ufshcd_cmd_inflight(lrbp->cmd))
-			ufshcd_release_scsi_cmd(hba, lrbp);
-		spin_unlock_irqrestore(&hwq->cq_lock, flags);
-	}
-
 	return *ret == 0;
 }
 
@@ -7561,6 +7551,20 @@ int ufshcd_try_to_abort_task(struct ufs_hba *hba, int tag)
 		goto out;
 	}
 
+	/*
+	 * When the host software receives a "FUNCTION COMPLETE", set flag
+	 * to requeue command after receive response with OCS_ABORTED
+	 * SDB mode: UTRLCLR Task Management response which means a Transfer
+	 *           Request was aborted.
+	 * MCQ mode: Host will post to CQ with OCS_ABORTED after SQ cleanup
+	 * This flag is set because ufshcd_abort_all forcibly aborts all
+	 * commands, and the host will automatically fill in the OCS field
+	 * of the corresponding response with OCS_ABORTED.
+	 * Therefore, upon receiving this response, it needs to be requeued.
+	 */
+	if (!err)
+		lrbp->abort_initiated_by_err = true;
+
 	err = ufshcd_clear_cmd(hba, tag);
 	if (err)
 		dev_err(hba->dev, "%s: Failed clearing cmd at tag %d, err %d\n",
diff --git a/include/ufs/ufshcd.h b/include/ufs/ufshcd.h
index 0fd2aebac728..15b357672ca5 100644
--- a/include/ufs/ufshcd.h
+++ b/include/ufs/ufshcd.h
@@ -173,6 +173,8 @@ struct ufs_pm_lvl_states {
  * @crypto_key_slot: the key slot to use for inline crypto (-1 if none)
  * @data_unit_num: the data unit number for the first block for inline crypto
  * @req_abort_skip: skip request abort task flag
+ * @abort_initiated_by_err: The flag is specifically used to handle aborts
+ *                          caused by errors due to host/device communication
  */
 struct ufshcd_lrb {
 	struct utp_transfer_req_desc *utr_descriptor_ptr;
@@ -202,6 +204,7 @@ struct ufshcd_lrb {
 #endif
 
 	bool req_abort_skip;
+	bool abort_initiated_by_err;
 };
 
 /**
-- 
2.45.2



From peter.wang at mediatek.com  Tue Sep 10 00:30:33 2024
From: peter.wang at mediatek.com (peter.wang at mediatek.com)
Date: Tue, 10 Sep 2024 15:30:33 +0800
Subject: [PATCH v4 0/2] fix abort defect
Message-ID: <20240910073035.25974-1-peter.wang@mediatek.com>

From: Peter Wang <peter.wang at mediatek.com>

This series fixes MCQ and SDB abort defect.

V4:
 - Remove nullify SQ entry abort requeue.
 - Add more comment for flag usage and set description.
 - Fix build warning.

V3:
 - Change comment and use variable(rtc) for error print
 - Change flag name and move flag set before ufshcd_clear_cmd
 - Add SDB mode clear UTRLCLR tag receive OCS_ABORTED requeue

V2:
 - Fix mcq_enabled build error.

Peter Wang (2):
  ufs: core: fix the issue of ICU failure
  ufs: core: requeue aborted request

 drivers/ufs/core/ufs-mcq.c | 15 ++++++++-------
 drivers/ufs/core/ufshcd.c  | 34 +++++++++++++++++++---------------
 include/ufs/ufshcd.h       |  3 +++
 3 files changed, 30 insertions(+), 22 deletions(-)

-- 
2.45.2



From angelogioacchino.delregno at collabora.com  Tue Sep 10 01:08:40 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Tue, 10 Sep 2024 08:08:40 +0000
Subject: [PATCH v8 1/3] dt-bindings: display: mediatek: Add OF graph
 support for board path
In-Reply-To: <3e58a224e6323e28c370d460fa72e23b958bcf62.camel@mediatek.com>
References: <20240618101726.110416-1-angelogioacchino.delregno@collabora.com>
 <20240618101726.110416-2-angelogioacchino.delregno@collabora.com>
 <3e58a224e6323e28c370d460fa72e23b958bcf62.camel@mediatek.com>
Message-ID: <01020191dafa43a8-cca2fb3f-7eda-4e39-9ca1-eccb78c566a4-000000@eu-west-1.amazonses.com>

Il 08/08/24 05:45, CK Hu (???) ha scritto:
> Hi, Angelo:
> 
> On Tue, 2024-06-18 at 12:17 +0200, AngeloGioacchino Del Regno wrote:
>> The display IPs in MediaTek SoCs support being interconnected with
>> different instances of DDP IPs (for example, merge0 or merge1) and/or
>> with different DDP IPs (for example, rdma can be connected with either
>> color, dpi, dsi, merge, etc), forming a full Display Data Path that
>> ends with an actual display.
>>
>> The final display pipeline is effectively board specific, as it does
>> depend on the display that is attached to it, and eventually on the
>> sensors supported by the board (for example, Adaptive Ambient Light
>> would need an Ambient Light Sensor, otherwise it's pointless!), other
>> than the output type.
>>
>> Add support for OF graphs to most of the MediaTek DDP (display) bindings
>> to add flexibility to build custom hardware paths, hence enabling board
>> specific configuration of the display pipeline and allowing to finally
>> migrate away from using hardcoded paths.
>>
>> Reviewed-by: Rob Herring (Arm) <robh at kernel.org>
>> Reviewed-by: Alexandre Mergnat <amergnat at baylibre.com>
>> Tested-by: Alexandre Mergnat <amergnat at baylibre.com>
>> Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
>> ---
> 
> [snip]
> 
>>   
>> diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,ethdr.yaml b/Documentation/devicetree/bindings/display/mediatek/mediatek,ethdr.yaml
>> index 677882348ede..98db47894eeb 100644
>> --- a/Documentation/devicetree/bindings/display/mediatek/mediatek,ethdr.yaml
>> +++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,ethdr.yaml
>> @@ -110,6 +110,28 @@ properties:
>>         include/dt-bindings/gce/<chip>-gce.h, mapping to the register of display
>>         function block.
>>   
>> +  ports:
>> +    $ref: /schemas/graph.yaml#/properties/ports
>> +    description:
>> +      Input and output ports can have multiple endpoints, each of those
>> +      connects to either the primary, secondary, etc, display pipeline.
>> +
>> +    properties:
>> +      port at 0:
>> +        $ref: /schemas/graph.yaml#/properties/port
>> +        description: ETHDR input, usually from one of the MERGE blocks.
> 
> Sorry, I find one question now.
> I think ETHDR may have multiple input, and ETHDR receive data from all input at the same time.
> Why here has only one input port?
> 
> MERGE -->+-----------------+
>           |                 |
> MERGE -->|                 |
>           |      ETHDR      |
> MERGE -->|                 |
>           |                 |
> MERGE -->+-----------------+
> 

Because ETHDR takes one input (ex. "one image", or "one data stream") port, which
is composed of multiple input endpoints (where each endpoint is a MERGE block) :-)

Cheers,
Angelo

> Regards,
> CK
> 
>> +
>> +      port at 1:
>> +        $ref: /schemas/graph.yaml#/properties/port
>> +        description:
>> +          ETHDR output to the input of the next desired component in the
>> +          display pipeline, for example one of the available MERGE blocks,
>> +          or others.
>> +
>> +    required:
>> +      - port at 0
>> +      - port at 1
>> +
>>   required:
>>     - compatible
>>     - reg
>>



From angelogioacchino.delregno at collabora.com  Tue Sep 10 01:28:30 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Tue, 10 Sep 2024 08:28:30 +0000
Subject: [PATCH] arm64: dts: mt8183: set DMIC one-wire mode on Damu
In-Reply-To: <20240910-one-wire-v1-1-d25486a6ba6d@chromium.org>
References: <20240910-one-wire-v1-1-d25486a6ba6d@chromium.org>
Message-ID: <01020191db0c6d91-0c23da5b-eb4d-4869-a27b-d1d3b14afb3b-000000@eu-west-1.amazonses.com>

Il 10/09/24 08:33, Hsin-Te Yuan ha scritto:
> From: Hsin-Yi Wang <hsinyi at chromium.org>
> 
> Sets DMIC one-wire mode on Damu.
> 
> Signed-off-by: Hsin-Te Yuan <yuanhsinte at chromium.org>

Isn't this a fix? (fixes tag!)

Cheers,
Angelo

> ---
>   arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-damu.dts | 4 ++++
>   1 file changed, 4 insertions(+)
> 
> diff --git a/arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-damu.dts b/arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-damu.dts
> index 0b45aee2e29953b6117b462034a00dff2596b9ff..06a689feff52945d141d196d439cba034f25fdf6 100644
> --- a/arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-damu.dts
> +++ b/arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-damu.dts
> @@ -26,6 +26,10 @@ &touchscreen {
>   	hid-descr-addr = <0x0001>;
>   };
>   
> +&mt6358codec {
> +	mediatek,dmic-mode = <1>; /* one-wire */
> +};
> +
>   &qca_wifi {
>   	qcom,ath10k-calibration-variant = "GO_DAMU";
>   };
> 
> ---
> base-commit: da3ea35007d0af457a0afc87e84fddaebc4e0b63
> change-id: 20240910-one-wire-2d0f7113dc8b
> 
> Best regards,



From angelogioacchino.delregno at collabora.com  Tue Sep 10 01:38:24 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Tue, 10 Sep 2024 08:38:24 +0000
Subject: [PATCH v8 3/3] drm/mediatek: Implement OF graphs support for
 display paths
In-Reply-To: <1e1b0ff224dfa99041b54408c16633d5885efda9.camel@mediatek.com>
References: <20240618101726.110416-1-angelogioacchino.delregno@collabora.com>
 <20240618101726.110416-4-angelogioacchino.delregno@collabora.com>
 <1e1b0ff224dfa99041b54408c16633d5885efda9.camel@mediatek.com>
Message-ID: <01020191db157c68-71e1f1a2-46c3-4c9f-a561-132319742e69-000000@eu-west-1.amazonses.com>

Il 08/08/24 05:48, CK Hu (???) ha scritto:
> Hi, Angelo:
> 
> On Tue, 2024-06-18 at 12:17 +0200, AngeloGioacchino Del Regno wrote:
>> It is impossible to add each and every possible DDP path combination
>> for each and every possible combination of SoC and board: right now,
>> this driver hardcodes configuration for 10 SoCs and this is going to
>> grow larger and larger, and with new hacks like the introduction of
>> mtk_drm_route which is anyway not enough for all final routes as the
>> DSI cannot be connected to MERGE if it's not a dual-DSI, or enabling
>> DSC preventively doesn't work if the display doesn't support it, or
>> others.
>>
>> Since practically all display IPs in MediaTek SoCs support being
>> interconnected with different instances of other, or the same, IPs
>> or with different IPs and in different combinations, the final DDP
>> pipeline is effectively a board specific configuration.
>>
>> Implement OF graphs support to the mediatek-drm drivers, allowing to
>> stop hardcoding the paths, and preventing this driver to get a huge
>> amount of arrays for each board and SoC combination, also paving the
>> way to share the same mtk_mmsys_driver_data between multiple SoCs,
>> making it more straightforward to add support for new chips.
>>
>> Reviewed-by: Alexandre Mergnat <amergnat at baylibre.com>
>> Tested-by: Alexandre Mergnat <amergnat at baylibre.com>
>> Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
>> ---
> 
> [snip]
> 
>> +static int mtk_drm_of_ddp_path_build_one(struct device *dev, enum mtk_crtc_path cpath,
>> +					 const unsigned int **out_path,
>> +					 unsigned int *out_path_len)
>> +{
>> +	struct device_node *next, *prev, *vdo = dev->parent->of_node;
>> +	unsigned int temp_path[DDP_COMPONENT_DRM_ID_MAX] = { 0 };
>> +	unsigned int *final_ddp_path;
>> +	unsigned short int idx = 0;
>> +	bool ovl_adaptor_comp_added = false;
>> +	int ret;
>> +
>> +	/* Get the first entry for the temp_path array */
>> +	ret = mtk_drm_of_get_ddp_ep_cid(vdo, 0, cpath, &next, &temp_path[idx]);
>> +	if (ret) {
>> +		if (next && temp_path[idx] == DDP_COMPONENT_DRM_OVL_ADAPTOR) {
>> +			dev_err(dev, "Adding OVL Adaptor for %pOF\n", next);
> 
> This looks not an error.
> 

Thanks for catching that, I used that line for debugging and forgot to change it
back to dev_dbg(). Will fix.

>> +			ovl_adaptor_comp_added = true;
>> +		} else {
>> +			if (next)
>> +				dev_err(dev, "Invalid component %pOF\n", next);
>> +			else
>> +				dev_err(dev, "Cannot find first endpoint for path %d\n", cpath);
>> +
>> +			return ret;
>> +		}
>> +	}
>> +	idx++;
>> +
>> +	/*
>> +	 * Walk through port outputs until we reach the last valid mediatek-drm component.
>> +	 * To be valid, this must end with an "invalid" component that is a display node.
>> +	 */
>> +	do {
>> +		prev = next;
>> +		ret = mtk_drm_of_get_ddp_ep_cid(next, 1, cpath, &next, &temp_path[idx]);
>> +		of_node_put(prev);
>> +		if (ret) {
>> +			of_node_put(next);
>> +			break;
>> +		}
>> +
>> +		/*
>> +		 * If this is an OVL adaptor exclusive component and one of those
>> +		 * was already added, don't add another instance of the generic
>> +		 * DDP_COMPONENT_OVL_ADAPTOR, as this is used only to decide whether
>> +		 * to probe that component master driver of which only one instance
>> +		 * is needed and possible.
>> +		 */
>> +		if (temp_path[idx] == DDP_COMPONENT_DRM_OVL_ADAPTOR) {
>> +			if (!ovl_adaptor_comp_added)
>> +				ovl_adaptor_comp_added = true;
>> +			else
>> +				idx--;
>> +		}
>> +	} while (++idx < DDP_COMPONENT_DRM_ID_MAX);
>> +
>> +	/*
>> +	 * The device component might not be enabled: in that case, don't
>> +	 * check the last entry and just report that the device is missing.
>> +	 */
>> +	if (ret == -ENODEV)
>> +		return ret;
>> +
>> +	/* If the last entry is not a final display output, the configuration is wrong */
>> +	switch (temp_path[idx - 1]) {
>> +	case DDP_COMPONENT_DP_INTF0:
>> +	case DDP_COMPONENT_DP_INTF1:
>> +	case DDP_COMPONENT_DPI0:
>> +	case DDP_COMPONENT_DPI1:
>> +	case DDP_COMPONENT_DSI0:
>> +	case DDP_COMPONENT_DSI1:
>> +	case DDP_COMPONENT_DSI2:
>> +	case DDP_COMPONENT_DSI3:
>> +		break;
>> +	default:
>> +		dev_err(dev, "Invalid display hw pipeline. Last component: %d (ret=%d)\n",
>> +			temp_path[idx - 1], ret);
>> +		return -EINVAL;
>> +	}
>> +
>> +	final_ddp_path = devm_kmemdup(dev, temp_path, idx * sizeof(temp_path[0]), GFP_KERNEL);
>> +	if (!final_ddp_path)
>> +		return -ENOMEM;
>> +
>> +	dev_dbg(dev, "Display HW Pipeline built with %d components.\n", idx);
>> +
>> +	/* Pipeline built! */
>> +	*out_path = final_ddp_path;
>> +	*out_path_len = idx;
>> +
>> +	return 0;
>> +}
>> +
>> +static int mtk_drm_of_ddp_path_build(struct device *dev, struct device_node *node,
>> +				     struct mtk_mmsys_driver_data *data)
>> +{
>> +	struct device_node *ep_node;
>> +	struct of_endpoint of_ep;
>> +	bool output_present[MAX_CRTC] = { false };
>> +	int ret;
>> +
>> +	for_each_endpoint_of_node(node, ep_node) {
>> +		ret = of_graph_parse_endpoint(ep_node, &of_ep);
>> +		if (ret) {
>> +			dev_err_probe(dev, ret, "Cannot parse endpoint\n");
>> +			break;
>> +		}
>> +
>> +		if (of_ep.id >= MAX_CRTC) {
>> +			ret = dev_err_probe(dev, -EINVAL,
>> +					    "Invalid endpoint%u number\n", of_ep.port);
>> +			break;
>> +		}
>> +
>> +		output_present[of_ep.id] = true;
>> +	}
>> +
>> +	if (ret) {
>> +		of_node_put(ep_node);
>> +		return ret;
>> +	}
>> +
>> +	if (output_present[CRTC_MAIN]) {
>> +		ret = mtk_drm_of_ddp_path_build_one(dev, CRTC_MAIN,
>> +						    &data->main_path, &data->main_len);
>> +		if (ret && ret != -ENODEV)
>> +			return ret;
>> +	}
>> +
>> +	if (output_present[CRTC_EXT]) {
>> +		ret = mtk_drm_of_ddp_path_build_one(dev, CRTC_EXT,
>> +						    &data->ext_path, &data->ext_len);
>> +		if (ret && ret != -ENODEV)
>> +			return ret;
>> +	}
>> +
>> +	if (output_present[CRTC_THIRD]) {
>> +		ret = mtk_drm_of_ddp_path_build_one(dev, CRTC_THIRD,
>> +						    &data->third_path, &data->third_len);
>> +		if (ret && ret != -ENODEV)
>> +			return ret;
>> +	}
>> +
>> +	return 0;
>> +}
>> +
>>   static int mtk_drm_probe(struct platform_device *pdev)
>>   {
>>   	struct device *dev = &pdev->dev;
>>   	struct device_node *phandle = dev->parent->of_node;
>>   	const struct of_device_id *of_id;
>>   	struct mtk_drm_private *private;
>> +	struct mtk_mmsys_driver_data *mtk_drm_data;
>>   	struct device_node *node;
>>   	struct component_match *match = NULL;
>>   	struct platform_device *ovl_adaptor;
>> @@ -824,7 +1048,31 @@ static int mtk_drm_probe(struct platform_device *pdev)
>>   	if (!of_id)
>>   		return -ENODEV;
>>   
>> -	private->data = of_id->data;
>> +	mtk_drm_data = (struct mtk_mmsys_driver_data *)of_id->data;
>> +	if (!mtk_drm_data)
>> +		return -EINVAL;
>> +
>> +	private->data = kmemdup(mtk_drm_data, sizeof(*mtk_drm_data), GFP_KERNEL);
> 
> This is redundant. You would assign private->data below.
> 

Right. Will remove.

>> +	if (!private->data)
>> +		return -ENOMEM;
>> +
>> +	/* Try to build the display pipeline from devicetree graphs */
>> +	if (of_graph_is_present(phandle)) {
>> +		dev_dbg(dev, "Building display pipeline for MMSYS %u\n",
>> +			mtk_drm_data->mmsys_id);
>> +		private->data = devm_kmemdup(dev, mtk_drm_data,
>> +					     sizeof(*mtk_drm_data), GFP_KERNEL);
>> +		if (!private->data)
>> +			return -ENOMEM;
>> +
>> +		ret = mtk_drm_of_ddp_path_build(dev, phandle, private->data);
>> +		if (ret)
>> +			return ret;
>> +	} else {
>> +		/* No devicetree graphs support: go with hardcoded paths if present */
>> +		dev_dbg(dev, "Using hardcoded paths for MMSYS %u\n", mtk_drm_data->mmsys_id);
>> +		private->data = mtk_drm_data;
>> +	};
>>   
>>   	private->all_drm_private = devm_kmalloc_array(dev, private->data->mmsys_dev_num,
>>   						      sizeof(*private->all_drm_private),
>> @@ -846,12 +1094,11 @@ static int mtk_drm_probe(struct platform_device *pdev)
>>   
>>   	/* Iterate over sibling DISP function blocks */
>>   	for_each_child_of_node(phandle->parent, node) {
>> -		const struct of_device_id *of_id;
>>   		enum mtk_ddp_comp_type comp_type;
>>   		int comp_id;
>>   
>> -		of_id = of_match_node(mtk_ddp_comp_dt_ids, node);
>> -		if (!of_id)
>> +		ret = mtk_drm_of_get_ddp_comp_type(node, &comp_type);
>> +		if (ret)
>>   			continue;
>>   
>>   		if (!of_device_is_available(node)) {
>> @@ -860,8 +1107,6 @@ static int mtk_drm_probe(struct platform_device *pdev)
>>   			continue;
>>   		}
>>   
>> -		comp_type = (enum mtk_ddp_comp_type)(uintptr_t)of_id->data;
>> -
>>   		if (comp_type == MTK_DISP_MUTEX) {
>>   			int id;
>>   
>> @@ -890,22 +1135,24 @@ static int mtk_drm_probe(struct platform_device *pdev)
>>   		 * blocks have separate component platform drivers and initialize their own
>>   		 * DDP component structure. The others are initialized here.
>>   		 */
>> -		if (comp_type == MTK_DISP_AAL ||
>> -		    comp_type == MTK_DISP_CCORR ||
>> -		    comp_type == MTK_DISP_COLOR ||
>> -		    comp_type == MTK_DISP_GAMMA ||
>> -		    comp_type == MTK_DISP_MERGE ||
>> -		    comp_type == MTK_DISP_OVL ||
>> -		    comp_type == MTK_DISP_OVL_2L ||
>> -		    comp_type == MTK_DISP_OVL_ADAPTOR ||
>> -		    comp_type == MTK_DISP_RDMA ||
>> -		    comp_type == MTK_DP_INTF ||
>> -		    comp_type == MTK_DPI ||
>> -		    comp_type == MTK_DSI) {
>> -			dev_info(dev, "Adding component match for %pOF\n",
>> -				 node);
>> -			drm_of_component_match_add(dev, &match, component_compare_of,
>> -						   node);
>> +		switch (comp_type) {
>> +		default:
>> +			break;
>> +		case MTK_DISP_AAL:
>> +		case MTK_DISP_CCORR:
>> +		case MTK_DISP_COLOR:
>> +		case MTK_DISP_GAMMA:
>> +		case MTK_DISP_MERGE:
>> +		case MTK_DISP_OVL:
>> +		case MTK_DISP_OVL_2L:
>> +		case MTK_DISP_OVL_ADAPTOR:
>> +		case MTK_DISP_RDMA:
>> +		case MTK_DP_INTF:
>> +		case MTK_DPI:
>> +		case MTK_DSI:
>> +			dev_info(dev, "Adding component match for %pOF\n", node);
>> +			drm_of_component_match_add(dev, &match, component_compare_of, node);
>> +			break;
> 
> This modification seems not related to OF graphs support. If you need this, separate this to another patch.
> 

Will do for v9.

Thanks,
Angelo

>>   		}
>>   
>>   		ret = mtk_ddp_comp_init(node, &private->ddp_comp[comp_id], comp_id);
>> diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.h b/drivers/gpu/drm/mediatek/mtk_drm_drv.h
>> index 78d698ede1bf..7e54d86e25a3 100644
>> --- a/drivers/gpu/drm/mediatek/mtk_drm_drv.h
>> +++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.h
>> @@ -59,7 +59,7 @@ struct mtk_drm_private {
>>   	struct device *mmsys_dev;
>>   	struct device_node *comp_node[DDP_COMPONENT_DRM_ID_MAX];
>>   	struct mtk_ddp_comp ddp_comp[DDP_COMPONENT_DRM_ID_MAX];
>> -	const struct mtk_mmsys_driver_data *data;
>> +	struct mtk_mmsys_driver_data *data;
>>   	struct drm_atomic_state *suspend_state;
>>   	unsigned int mbox_index;
>>   	struct mtk_drm_private **all_drm_private;
>> diff --git a/drivers/gpu/drm/mediatek/mtk_dsi.c b/drivers/gpu/drm/mediatek/mtk_dsi.c
>> index c255559cc56e..880ea37937da 100644
>> --- a/drivers/gpu/drm/mediatek/mtk_dsi.c
>> +++ b/drivers/gpu/drm/mediatek/mtk_dsi.c
>> @@ -904,9 +904,17 @@ static int mtk_dsi_host_attach(struct mipi_dsi_host *host,
>>   	dsi->lanes = device->lanes;
>>   	dsi->format = device->format;
>>   	dsi->mode_flags = device->mode_flags;
>> -	dsi->next_bridge = devm_drm_of_get_bridge(dev, dev->of_node, 0, 0);
>> -	if (IS_ERR(dsi->next_bridge))
>> -		return PTR_ERR(dsi->next_bridge);
>> +	dsi->next_bridge = devm_drm_of_get_bridge(dev, dev->of_node, 1, 0);
>> +	if (IS_ERR(dsi->next_bridge)) {
>> +		ret = PTR_ERR(dsi->next_bridge);
>> +		if (ret == -EPROBE_DEFER)
>> +			return ret;
>> +
>> +		/* Old devicetree has only one endpoint */
>> +		dsi->next_bridge = devm_drm_of_get_bridge(dev, dev->of_node, 0, 0);
>> +		if (IS_ERR(dsi->next_bridge))
>> +			return PTR_ERR(dsi->next_bridge);
>> +	}
>>   
>>   	drm_bridge_add(&dsi->bridge);
>>   



From yuanhsinte at chromium.org  Tue Sep 10 01:47:44 2024
From: yuanhsinte at chromium.org (Hsin-Te Yuan)
Date: Tue, 10 Sep 2024 08:47:44 +0000
Subject: [PATCH v2] arm64: dts: mt8183: set DMIC one-wire mode on Damu
Message-ID: <20240910-one-wire-v2-1-2bb40d5a3cf8@chromium.org>

From: Hsin-Yi Wang <hsinyi at chromium.org>

Sets DMIC one-wire mode on Damu.

Fixes: cabc71b08eb5 ("arm64: dts: mt8183: Add kukui-jacuzzi-damu board")
Signed-off-by: Hsin-Te Yuan <yuanhsinte at chromium.org>
---
Changes in v2:
- Add fixes tag 
- Link to v1: https://lore.kernel.org/r/20240910-one-wire-v1-1-d25486a6ba6d at chromium.org
---
 arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-damu.dts | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-damu.dts b/arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-damu.dts
index 0b45aee2e29953b6117b462034a00dff2596b9ff..06a689feff52945d141d196d439cba034f25fdf6 100644
--- a/arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-damu.dts
+++ b/arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi-damu.dts
@@ -26,6 +26,10 @@ &touchscreen {
 	hid-descr-addr = <0x0001>;
 };
 
+&mt6358codec {
+	mediatek,dmic-mode = <1>; /* one-wire */
+};
+
 &qca_wifi {
 	qcom,ath10k-calibration-variant = "GO_DAMU";
 };

---
base-commit: da3ea35007d0af457a0afc87e84fddaebc4e0b63
change-id: 20240910-one-wire-2d0f7113dc8b

Best regards,
-- 
Hsin-Te Yuan <yuanhsinte at chromium.org>



From angelogioacchino.delregno at collabora.com  Tue Sep 10 02:01:38 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Tue, 10 Sep 2024 09:01:38 +0000
Subject: [PATCH v9 0/3] drm/mediatek: Add support for OF graphs
Message-ID: <01020191db2ac439-4e2dc95a-6323-4f0f-b9fc-c482948018a8-000000@eu-west-1.amazonses.com>

Changes in v9:
 - Rebased on next-20240910
 - Removed redundant assignment and changed a print to dev_err()
 - Dropped if branch to switch conversion as requested; this will
   be sent as a separate commit out of this series.

Changes in v8:
 - Rebased on next-20240617
 - Changed to allow probing a VDO with no available display outputs

Changes in v7:
 - Fix typo in patch 3/3

Changes in v6:
 - Added EPROBE_DEFER check to fix dsi/dpi false positive DT fallback case
 - Dropped refcount of ep_out in mtk_drm_of_get_ddp_ep_cid()
 - Fixed double refcount drop during path building
 - Removed failure upon finding a DT-disabled path as requested
 - Tested again on MT8195, MT8395 boards

Changes in v5:
 - Fixed commit [2/3], changed allOf -> anyOf to get the
   intended allowance in the binding

Changes in v4:
 - Fixed a typo that caused pure OF graphs pipelines multiple
   concurrent outputs to not get correctly parsed (port->id); 
 - Added OVL_ADAPTOR support for OF graph specified pipelines;
 - Now tested with fully OF Graph specified pipelines on MT8195
   Chromebooks and MT8395 boards;
 - Rebased on next-20240516

Changes in v3:
 - Rebased on next-20240502 because of renames in mediatek-drm

Changes in v2:
 - Fixed wrong `required` block indentation in commit [2/3]


The display IPs in MediaTek SoCs are *VERY* flexible and those support
being interconnected with different instances of DDP IPs (for example,
merge0 or merge1) and/or with different DDP IPs (for example, rdma can
be connected with either color, dpi, dsi, merge, etc), forming a full
Display Data Path that ends with an actual display.

This series was born because of an issue that I've found while enabling
support for MT8195/MT8395 boards with DSI output as main display: the
current mtk_drm_route variations would not work as currently, the driver
hardcodes a display path for Chromebooks, which have a DisplayPort panel
with DSC support, instead of a DSI panel without DSC support.

There are other reasons for which I wrote this series, and I find that
hardcoding those paths - when a HW path is clearly board-specific - is
highly suboptimal. Also, let's not forget about keeping this driver from
becoming a huge list of paths for each combination of SoC->board->disp
and... this and that.

For more information, please look at the commit description for each of
the commits included in this series.

This series is essential to enable support for the MT8195/MT8395 EVK,
Kontron i1200, Radxa NIO-12L and, mainly, for non-Chromebook boards
and Chromebooks to co-exist without conflicts.

Besides, this is also a valid option for MT8188 Chromebooks which might
have different DSI-or-eDP displays depending on the model (as far as I
can see from the mtk_drm_route attempt for this SoC that is already
present in this driver).

This series was tested on MT8195 Cherry Tomato and on MT8395 Radxa
NIO-12L with both hardcoded paths, OF graph support and partially
hardcoded paths, and pure OF graph support including pipelines that
require OVL_ADAPTOR support.

AngeloGioacchino Del Regno (3):
  dt-bindings: display: mediatek: Add OF graph support for board path
  dt-bindings: arm: mediatek: mmsys: Add OF graph support for board path
  drm/mediatek: Implement OF graphs support for display paths

 .../bindings/arm/mediatek/mediatek,mmsys.yaml |  28 ++
 .../arm/mediatek/mediatek,mmsys.yaml.orig     | 140 ++++++++++
 .../display/mediatek/mediatek,aal.yaml        |  40 +++
 .../display/mediatek/mediatek,aal.yaml.orig   |  93 +++++++
 .../display/mediatek/mediatek,ccorr.yaml      |  21 ++
 .../display/mediatek/mediatek,ccorr.yaml.orig |  88 ++++++
 .../display/mediatek/mediatek,color.yaml      |  22 ++
 .../display/mediatek/mediatek,color.yaml.orig |  96 +++++++
 .../display/mediatek/mediatek,dither.yaml     |  22 ++
 .../mediatek/mediatek,dither.yaml.orig        |  87 ++++++
 .../display/mediatek/mediatek,dpi.yaml        |  25 +-
 .../display/mediatek/mediatek,dpi.yaml.orig   | 122 +++++++++
 .../display/mediatek/mediatek,dsc.yaml        |  24 ++
 .../display/mediatek/mediatek,dsi.yaml        |  27 +-
 .../display/mediatek/mediatek,dsi.yaml.orig   | 126 +++++++++
 .../display/mediatek/mediatek,ethdr.yaml      |  22 ++
 .../display/mediatek/mediatek,gamma.yaml      |  19 ++
 .../display/mediatek/mediatek,gamma.yaml.orig |  96 +++++++
 .../display/mediatek/mediatek,merge.yaml      |  23 ++
 .../display/mediatek/mediatek,merge.yaml.orig | 110 ++++++++
 .../display/mediatek/mediatek,od.yaml         |  22 ++
 .../display/mediatek/mediatek,ovl-2l.yaml     |  22 ++
 .../mediatek/mediatek,ovl-2l.yaml.orig        |  78 ++++++
 .../display/mediatek/mediatek,ovl.yaml        |  22 ++
 .../display/mediatek/mediatek,ovl.yaml.orig   | 109 ++++++++
 .../display/mediatek/mediatek,postmask.yaml   |  21 ++
 .../display/mediatek/mediatek,rdma.yaml       |  22 ++
 .../display/mediatek/mediatek,rdma.yaml.orig  | 122 +++++++++
 .../display/mediatek/mediatek,ufoe.yaml       |  21 ++
 .../display/mediatek/mediatek,wdma.yaml.orig  |  76 ++++++
 .../bindings/gpu/arm,mali-bifrost.yaml.orig   | 250 +++++++++++++++++
 .../bindings/leds/leds-mt6323.txt.orig        |  60 +++++
 .../bindings/ufs/mediatek,ufs.yaml.orig       |  71 +++++
 drivers/gpu/drm/mediatek/mtk_disp_drv.h       |   1 +
 .../gpu/drm/mediatek/mtk_disp_ovl_adaptor.c   |  40 ++-
 drivers/gpu/drm/mediatek/mtk_dpi.c            |  21 +-
 drivers/gpu/drm/mediatek/mtk_drm_drv.c        | 253 +++++++++++++++++-
 drivers/gpu/drm/mediatek/mtk_drm_drv.h        |   2 +-
 drivers/gpu/drm/mediatek/mtk_dsi.c            |  14 +-
 39 files changed, 2433 insertions(+), 25 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/arm/mediatek/mediatek,mmsys.yaml.orig
 create mode 100644 Documentation/devicetree/bindings/display/mediatek/mediatek,aal.yaml.orig
 create mode 100644 Documentation/devicetree/bindings/display/mediatek/mediatek,ccorr.yaml.orig
 create mode 100644 Documentation/devicetree/bindings/display/mediatek/mediatek,color.yaml.orig
 create mode 100644 Documentation/devicetree/bindings/display/mediatek/mediatek,dither.yaml.orig
 create mode 100644 Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml.orig
 create mode 100644 Documentation/devicetree/bindings/display/mediatek/mediatek,dsi.yaml.orig
 create mode 100644 Documentation/devicetree/bindings/display/mediatek/mediatek,gamma.yaml.orig
 create mode 100644 Documentation/devicetree/bindings/display/mediatek/mediatek,merge.yaml.orig
 create mode 100644 Documentation/devicetree/bindings/display/mediatek/mediatek,ovl-2l.yaml.orig
 create mode 100644 Documentation/devicetree/bindings/display/mediatek/mediatek,ovl.yaml.orig
 create mode 100644 Documentation/devicetree/bindings/display/mediatek/mediatek,rdma.yaml.orig
 create mode 100644 Documentation/devicetree/bindings/display/mediatek/mediatek,wdma.yaml.orig
 create mode 100644 Documentation/devicetree/bindings/gpu/arm,mali-bifrost.yaml.orig
 create mode 100644 Documentation/devicetree/bindings/leds/leds-mt6323.txt.orig
 create mode 100644 Documentation/devicetree/bindings/ufs/mediatek,ufs.yaml.orig

-- 
2.46.0



From angelogioacchino.delregno at collabora.com  Tue Sep 10 02:01:42 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Tue, 10 Sep 2024 09:01:42 +0000
Subject: [PATCH v9 2/3] dt-bindings: arm: mediatek: mmsys: Add OF graph support for board path
In-Reply-To: <20240910090127.78905-1-angelogioacchino.delregno@collabora.com>
References: <20240910090127.78905-1-angelogioacchino.delregno@collabora.com>
Message-ID: <01020191db2ad3bd-dafdac93-c1ab-4ef4-9287-5a17c3dccfd4-000000@eu-west-1.amazonses.com>

Document OF graph on MMSYS/VDOSYS: this supports up to three DDP paths
per HW instance (so potentially up to six displays for multi-vdo SoCs).

The MMSYS or VDOSYS is always the first component in the DDP pipeline,
so it only supports an output port with multiple endpoints - where each
endpoint defines the starting point for one of the (currently three)
possible hardware paths.

Reviewed-by: Rob Herring (Arm) <robh at kernel.org>
Reviewed-by: Alexandre Mergnat <amergnat at baylibre.com>
Tested-by: Alexandre Mergnat <amergnat at baylibre.com>
Reviewed-by: CK Hu <ck.hu at mediatek.com>
Tested-by: Michael Walle <mwalle at kernel.org> # on kontron-sbc-i1200
Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
---
 .../bindings/arm/mediatek/mediatek,mmsys.yaml | 28 +++++++++++++++++++
 1 file changed, 28 insertions(+)

diff --git a/Documentation/devicetree/bindings/arm/mediatek/mediatek,mmsys.yaml b/Documentation/devicetree/bindings/arm/mediatek/mediatek,mmsys.yaml
index b3c6888c1457..3f4262e93c78 100644
--- a/Documentation/devicetree/bindings/arm/mediatek/mediatek,mmsys.yaml
+++ b/Documentation/devicetree/bindings/arm/mediatek/mediatek,mmsys.yaml
@@ -93,6 +93,34 @@ properties:
   '#reset-cells':
     const: 1
 
+  port:
+    $ref: /schemas/graph.yaml#/properties/port
+    description:
+      Output port node. This port connects the MMSYS/VDOSYS output to
+      the first component of one display pipeline, for example one of
+      the available OVL or RDMA blocks.
+      Some MediaTek SoCs support multiple display outputs per MMSYS.
+    properties:
+      endpoint at 0:
+        $ref: /schemas/graph.yaml#/properties/endpoint
+        description: Output to the primary display pipeline
+
+      endpoint at 1:
+        $ref: /schemas/graph.yaml#/properties/endpoint
+        description: Output to the secondary display pipeline
+
+      endpoint at 2:
+        $ref: /schemas/graph.yaml#/properties/endpoint
+        description: Output to the tertiary display pipeline
+
+    anyOf:
+      - required:
+          - endpoint at 0
+      - required:
+          - endpoint at 1
+      - required:
+          - endpoint at 2
+
 required:
   - compatible
   - reg
-- 
2.46.0



From angelogioacchino.delregno at collabora.com  Tue Sep 10 02:01:44 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Tue, 10 Sep 2024 09:01:44 +0000
Subject: [PATCH v9 3/3] drm/mediatek: Implement OF graphs support for display paths
In-Reply-To: <20240910090127.78905-1-angelogioacchino.delregno@collabora.com>
References: <20240910090127.78905-1-angelogioacchino.delregno@collabora.com>
Message-ID: <01020191db2adb7b-522d2ce1-e041-4a09-995d-de799c48406d-000000@eu-west-1.amazonses.com>

It is impossible to add each and every possible DDP path combination
for each and every possible combination of SoC and board: right now,
this driver hardcodes configuration for 10 SoCs and this is going to
grow larger and larger, and with new hacks like the introduction of
mtk_drm_route which is anyway not enough for all final routes as the
DSI cannot be connected to MERGE if it's not a dual-DSI, or enabling
DSC preventively doesn't work if the display doesn't support it, or
others.

Since practically all display IPs in MediaTek SoCs support being
interconnected with different instances of other, or the same, IPs
or with different IPs and in different combinations, the final DDP
pipeline is effectively a board specific configuration.

Implement OF graphs support to the mediatek-drm drivers, allowing to
stop hardcoding the paths, and preventing this driver to get a huge
amount of arrays for each board and SoC combination, also paving the
way to share the same mtk_mmsys_driver_data between multiple SoCs,
making it more straightforward to add support for new chips.

Reviewed-by: Alexandre Mergnat <amergnat at baylibre.com>
Tested-by: Alexandre Mergnat <amergnat at baylibre.com>
Acked-by: Sui Jingfeng <sui.jingfeng at linux.dev>
Tested-by: Michael Walle <mwalle at kernel.org> # on kontron-sbc-i1200
Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
---
 drivers/gpu/drm/mediatek/mtk_disp_drv.h       |   1 +
 .../gpu/drm/mediatek/mtk_disp_ovl_adaptor.c   |  40 ++-
 drivers/gpu/drm/mediatek/mtk_dpi.c            |  21 +-
 drivers/gpu/drm/mediatek/mtk_drm_drv.c        | 253 +++++++++++++++++-
 drivers/gpu/drm/mediatek/mtk_drm_drv.h        |   2 +-
 drivers/gpu/drm/mediatek/mtk_dsi.c            |  14 +-
 6 files changed, 309 insertions(+), 22 deletions(-)

diff --git a/drivers/gpu/drm/mediatek/mtk_disp_drv.h b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
index 082ac18fe04a..94843974851f 100644
--- a/drivers/gpu/drm/mediatek/mtk_disp_drv.h
+++ b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
@@ -108,6 +108,7 @@ size_t mtk_ovl_get_num_formats(struct device *dev);
 
 void mtk_ovl_adaptor_add_comp(struct device *dev, struct mtk_mutex *mutex);
 void mtk_ovl_adaptor_remove_comp(struct device *dev, struct mtk_mutex *mutex);
+bool mtk_ovl_adaptor_is_comp_present(struct device_node *node);
 void mtk_ovl_adaptor_connect(struct device *dev, struct device *mmsys_dev,
 			     unsigned int next);
 void mtk_ovl_adaptor_disconnect(struct device *dev, struct device *mmsys_dev,
diff --git a/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c b/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c
index c6768210b08b..e9dc89764495 100644
--- a/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c
+++ b/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c
@@ -490,6 +490,38 @@ static int compare_of(struct device *dev, void *data)
 	return dev->of_node == data;
 }
 
+static int ovl_adaptor_of_get_ddp_comp_type(struct device_node *node,
+					    enum mtk_ovl_adaptor_comp_type *ctype)
+{
+	const struct of_device_id *of_id = of_match_node(mtk_ovl_adaptor_comp_dt_ids, node);
+
+	if (!of_id)
+		return -EINVAL;
+
+	*ctype = (enum mtk_ovl_adaptor_comp_type)((uintptr_t)of_id->data);
+
+	return 0;
+}
+
+bool mtk_ovl_adaptor_is_comp_present(struct device_node *node)
+{
+	enum mtk_ovl_adaptor_comp_type type;
+	int ret;
+
+	ret = ovl_adaptor_of_get_ddp_comp_type(node, &type);
+	if (ret)
+		return false;
+
+	if (type >= OVL_ADAPTOR_TYPE_NUM)
+		return false;
+
+	/*
+	 * ETHDR and Padding are used exclusively in OVL Adaptor: if this
+	 * component is not one of those, it's likely not an OVL Adaptor path.
+	 */
+	return type == OVL_ADAPTOR_TYPE_ETHDR || type == OVL_ADAPTOR_TYPE_PADDING;
+}
+
 static int ovl_adaptor_comp_init(struct device *dev, struct component_match **match)
 {
 	struct mtk_disp_ovl_adaptor *priv = dev_get_drvdata(dev);
@@ -499,12 +531,11 @@ static int ovl_adaptor_comp_init(struct device *dev, struct component_match **ma
 	parent = dev->parent->parent->of_node->parent;
 
 	for_each_child_of_node_scoped(parent, node) {
-		const struct of_device_id *of_id;
 		enum mtk_ovl_adaptor_comp_type type;
-		int id;
+		int id, ret;
 
-		of_id = of_match_node(mtk_ovl_adaptor_comp_dt_ids, node);
-		if (!of_id)
+		ret = ovl_adaptor_of_get_ddp_comp_type(node, &type);
+		if (ret)
 			continue;
 
 		if (!of_device_is_available(node)) {
@@ -513,7 +544,6 @@ static int ovl_adaptor_comp_init(struct device *dev, struct component_match **ma
 			continue;
 		}
 
-		type = (enum mtk_ovl_adaptor_comp_type)(uintptr_t)of_id->data;
 		id = ovl_adaptor_comp_get_id(dev, node, type);
 		if (id < 0) {
 			dev_warn(dev, "Skipping unknown component %pOF\n",
diff --git a/drivers/gpu/drm/mediatek/mtk_dpi.c b/drivers/gpu/drm/mediatek/mtk_dpi.c
index a08d20654954..20a9d589fd75 100644
--- a/drivers/gpu/drm/mediatek/mtk_dpi.c
+++ b/drivers/gpu/drm/mediatek/mtk_dpi.c
@@ -704,6 +704,20 @@ static int mtk_dpi_bridge_attach(struct drm_bridge *bridge,
 				 enum drm_bridge_attach_flags flags)
 {
 	struct mtk_dpi *dpi = bridge_to_dpi(bridge);
+	int ret;
+
+	dpi->next_bridge = devm_drm_of_get_bridge(dpi->dev, dpi->dev->of_node, 1, -1);
+	if (IS_ERR(dpi->next_bridge)) {
+		ret = PTR_ERR(dpi->next_bridge);
+		if (ret == -EPROBE_DEFER)
+			return ret;
+
+		/* Old devicetree has only one endpoint */
+		dpi->next_bridge = devm_drm_of_get_bridge(dpi->dev, dpi->dev->of_node, 0, 0);
+		if (IS_ERR(dpi->next_bridge))
+			return dev_err_probe(dpi->dev, PTR_ERR(dpi->next_bridge),
+					     "Failed to get bridge\n");
+	}
 
 	return drm_bridge_attach(bridge->encoder, dpi->next_bridge,
 				 &dpi->bridge, flags);
@@ -1058,13 +1072,6 @@ static int mtk_dpi_probe(struct platform_device *pdev)
 	if (dpi->irq < 0)
 		return dpi->irq;
 
-	dpi->next_bridge = devm_drm_of_get_bridge(dev, dev->of_node, 0, 0);
-	if (IS_ERR(dpi->next_bridge))
-		return dev_err_probe(dev, PTR_ERR(dpi->next_bridge),
-				     "Failed to get bridge\n");
-
-	dev_info(dev, "Found bridge node: %pOF\n", dpi->next_bridge->of_node);
-
 	platform_set_drvdata(pdev, dpi);
 
 	dpi->bridge.funcs = &mtk_dpi_bridge_funcs;
diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.c b/drivers/gpu/drm/mediatek/mtk_drm_drv.c
index 3e807195a0d0..6cff020a1bf8 100644
--- a/drivers/gpu/drm/mediatek/mtk_drm_drv.c
+++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.c
@@ -26,6 +26,7 @@
 
 #include "mtk_crtc.h"
 #include "mtk_ddp_comp.h"
+#include "mtk_disp_drv.h"
 #include "mtk_drm_drv.h"
 #include "mtk_gem.h"
 
@@ -818,12 +819,235 @@ static const struct of_device_id mtk_ddp_comp_dt_ids[] = {
 	{ }
 };
 
+static int mtk_drm_of_get_ddp_comp_type(struct device_node *node, enum mtk_ddp_comp_type *ctype)
+{
+	const struct of_device_id *of_id = of_match_node(mtk_ddp_comp_dt_ids, node);
+
+	if (!of_id)
+		return -EINVAL;
+
+	*ctype = (enum mtk_ddp_comp_type)((uintptr_t)of_id->data);
+
+	return 0;
+}
+
+static int mtk_drm_of_get_ddp_ep_cid(struct device_node *node,
+				     int output_port, enum mtk_crtc_path crtc_path,
+				     struct device_node **next, unsigned int *cid)
+{
+	struct device_node *ep_dev_node, *ep_out;
+	enum mtk_ddp_comp_type comp_type;
+	int ret;
+
+	ep_out = of_graph_get_endpoint_by_regs(node, output_port, crtc_path);
+	if (!ep_out)
+		return -ENOENT;
+
+	ep_dev_node = of_graph_get_remote_port_parent(ep_out);
+	of_node_put(ep_out);
+	if (!ep_dev_node)
+		return -EINVAL;
+
+	/*
+	 * Pass the next node pointer regardless of failures in the later code
+	 * so that if this function is called in a loop it will walk through all
+	 * of the subsequent endpoints anyway.
+	 */
+	*next = ep_dev_node;
+
+	if (!of_device_is_available(ep_dev_node))
+		return -ENODEV;
+
+	ret = mtk_drm_of_get_ddp_comp_type(ep_dev_node, &comp_type);
+	if (ret) {
+		if (mtk_ovl_adaptor_is_comp_present(ep_dev_node)) {
+			*cid = (unsigned int)DDP_COMPONENT_DRM_OVL_ADAPTOR;
+			return 0;
+		}
+		return ret;
+	}
+
+	ret = mtk_ddp_comp_get_id(ep_dev_node, comp_type);
+	if (ret < 0)
+		return ret;
+
+	/* All ok! Pass the Component ID to the caller. */
+	*cid = (unsigned int)ret;
+
+	return 0;
+}
+
+/**
+ * mtk_drm_of_ddp_path_build_one - Build a Display HW Pipeline for a CRTC Path
+ * @dev:          The mediatek-drm device
+ * @cpath:        CRTC Path relative to a VDO or MMSYS
+ * @out_path:     Pointer to an array that will contain the new pipeline
+ * @out_path_len: Number of entries in the pipeline array
+ *
+ * MediaTek SoCs can use different DDP hardware pipelines (or paths) depending
+ * on the board-specific desired display configuration; this function walks
+ * through all of the output endpoints starting from a VDO or MMSYS hardware
+ * instance and builds the right pipeline as specified in device trees.
+ *
+ * Return:
+ * * %0       - Display HW Pipeline successfully built and validated
+ * * %-ENOENT - Display pipeline was not specified in device tree
+ * * %-EINVAL - Display pipeline built but validation failed
+ * * %-ENOMEM - Failure to allocate pipeline array to pass to the caller
+ */
+static int mtk_drm_of_ddp_path_build_one(struct device *dev, enum mtk_crtc_path cpath,
+					 const unsigned int **out_path,
+					 unsigned int *out_path_len)
+{
+	struct device_node *next, *prev, *vdo = dev->parent->of_node;
+	unsigned int temp_path[DDP_COMPONENT_DRM_ID_MAX] = { 0 };
+	unsigned int *final_ddp_path;
+	unsigned short int idx = 0;
+	bool ovl_adaptor_comp_added = false;
+	int ret;
+
+	/* Get the first entry for the temp_path array */
+	ret = mtk_drm_of_get_ddp_ep_cid(vdo, 0, cpath, &next, &temp_path[idx]);
+	if (ret) {
+		if (next && temp_path[idx] == DDP_COMPONENT_DRM_OVL_ADAPTOR) {
+			dev_dbg(dev, "Adding OVL Adaptor for %pOF\n", next);
+			ovl_adaptor_comp_added = true;
+		} else {
+			if (next)
+				dev_err(dev, "Invalid component %pOF\n", next);
+			else
+				dev_err(dev, "Cannot find first endpoint for path %d\n", cpath);
+
+			return ret;
+		}
+	}
+	idx++;
+
+	/*
+	 * Walk through port outputs until we reach the last valid mediatek-drm component.
+	 * To be valid, this must end with an "invalid" component that is a display node.
+	 */
+	do {
+		prev = next;
+		ret = mtk_drm_of_get_ddp_ep_cid(next, 1, cpath, &next, &temp_path[idx]);
+		of_node_put(prev);
+		if (ret) {
+			of_node_put(next);
+			break;
+		}
+
+		/*
+		 * If this is an OVL adaptor exclusive component and one of those
+		 * was already added, don't add another instance of the generic
+		 * DDP_COMPONENT_OVL_ADAPTOR, as this is used only to decide whether
+		 * to probe that component master driver of which only one instance
+		 * is needed and possible.
+		 */
+		if (temp_path[idx] == DDP_COMPONENT_DRM_OVL_ADAPTOR) {
+			if (!ovl_adaptor_comp_added)
+				ovl_adaptor_comp_added = true;
+			else
+				idx--;
+		}
+	} while (++idx < DDP_COMPONENT_DRM_ID_MAX);
+
+	/*
+	 * The device component might not be enabled: in that case, don't
+	 * check the last entry and just report that the device is missing.
+	 */
+	if (ret == -ENODEV)
+		return ret;
+
+	/* If the last entry is not a final display output, the configuration is wrong */
+	switch (temp_path[idx - 1]) {
+	case DDP_COMPONENT_DP_INTF0:
+	case DDP_COMPONENT_DP_INTF1:
+	case DDP_COMPONENT_DPI0:
+	case DDP_COMPONENT_DPI1:
+	case DDP_COMPONENT_DSI0:
+	case DDP_COMPONENT_DSI1:
+	case DDP_COMPONENT_DSI2:
+	case DDP_COMPONENT_DSI3:
+		break;
+	default:
+		dev_err(dev, "Invalid display hw pipeline. Last component: %d (ret=%d)\n",
+			temp_path[idx - 1], ret);
+		return -EINVAL;
+	}
+
+	final_ddp_path = devm_kmemdup(dev, temp_path, idx * sizeof(temp_path[0]), GFP_KERNEL);
+	if (!final_ddp_path)
+		return -ENOMEM;
+
+	dev_dbg(dev, "Display HW Pipeline built with %d components.\n", idx);
+
+	/* Pipeline built! */
+	*out_path = final_ddp_path;
+	*out_path_len = idx;
+
+	return 0;
+}
+
+static int mtk_drm_of_ddp_path_build(struct device *dev, struct device_node *node,
+				     struct mtk_mmsys_driver_data *data)
+{
+	struct device_node *ep_node;
+	struct of_endpoint of_ep;
+	bool output_present[MAX_CRTC] = { false };
+	int ret;
+
+	for_each_endpoint_of_node(node, ep_node) {
+		ret = of_graph_parse_endpoint(ep_node, &of_ep);
+		if (ret) {
+			dev_err_probe(dev, ret, "Cannot parse endpoint\n");
+			break;
+		}
+
+		if (of_ep.id >= MAX_CRTC) {
+			ret = dev_err_probe(dev, -EINVAL,
+					    "Invalid endpoint%u number\n", of_ep.port);
+			break;
+		}
+
+		output_present[of_ep.id] = true;
+	}
+
+	if (ret) {
+		of_node_put(ep_node);
+		return ret;
+	}
+
+	if (output_present[CRTC_MAIN]) {
+		ret = mtk_drm_of_ddp_path_build_one(dev, CRTC_MAIN,
+						    &data->main_path, &data->main_len);
+		if (ret && ret != -ENODEV)
+			return ret;
+	}
+
+	if (output_present[CRTC_EXT]) {
+		ret = mtk_drm_of_ddp_path_build_one(dev, CRTC_EXT,
+						    &data->ext_path, &data->ext_len);
+		if (ret && ret != -ENODEV)
+			return ret;
+	}
+
+	if (output_present[CRTC_THIRD]) {
+		ret = mtk_drm_of_ddp_path_build_one(dev, CRTC_THIRD,
+						    &data->third_path, &data->third_len);
+		if (ret && ret != -ENODEV)
+			return ret;
+	}
+
+	return 0;
+}
+
 static int mtk_drm_probe(struct platform_device *pdev)
 {
 	struct device *dev = &pdev->dev;
 	struct device_node *phandle = dev->parent->of_node;
 	const struct of_device_id *of_id;
 	struct mtk_drm_private *private;
+	struct mtk_mmsys_driver_data *mtk_drm_data;
 	struct device_node *node;
 	struct component_match *match = NULL;
 	struct platform_device *ovl_adaptor;
@@ -844,7 +1068,27 @@ static int mtk_drm_probe(struct platform_device *pdev)
 	if (!of_id)
 		return -ENODEV;
 
-	private->data = of_id->data;
+	mtk_drm_data = (struct mtk_mmsys_driver_data *)of_id->data;
+	if (!mtk_drm_data)
+		return -EINVAL;
+
+	/* Try to build the display pipeline from devicetree graphs */
+	if (of_graph_is_present(phandle)) {
+		dev_dbg(dev, "Building display pipeline for MMSYS %u\n",
+			mtk_drm_data->mmsys_id);
+		private->data = devm_kmemdup(dev, mtk_drm_data,
+					     sizeof(*mtk_drm_data), GFP_KERNEL);
+		if (!private->data)
+			return -ENOMEM;
+
+		ret = mtk_drm_of_ddp_path_build(dev, phandle, private->data);
+		if (ret)
+			return ret;
+	} else {
+		/* No devicetree graphs support: go with hardcoded paths if present */
+		dev_dbg(dev, "Using hardcoded paths for MMSYS %u\n", mtk_drm_data->mmsys_id);
+		private->data = mtk_drm_data;
+	};
 
 	private->all_drm_private = devm_kmalloc_array(dev, private->data->mmsys_dev_num,
 						      sizeof(*private->all_drm_private),
@@ -866,12 +1110,11 @@ static int mtk_drm_probe(struct platform_device *pdev)
 
 	/* Iterate over sibling DISP function blocks */
 	for_each_child_of_node(phandle->parent, node) {
-		const struct of_device_id *of_id;
 		enum mtk_ddp_comp_type comp_type;
 		int comp_id;
 
-		of_id = of_match_node(mtk_ddp_comp_dt_ids, node);
-		if (!of_id)
+		ret = mtk_drm_of_get_ddp_comp_type(node, &comp_type);
+		if (ret)
 			continue;
 
 		if (!of_device_is_available(node)) {
@@ -880,8 +1123,6 @@ static int mtk_drm_probe(struct platform_device *pdev)
 			continue;
 		}
 
-		comp_type = (enum mtk_ddp_comp_type)(uintptr_t)of_id->data;
-
 		if (comp_type == MTK_DISP_MUTEX) {
 			int id;
 
diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.h b/drivers/gpu/drm/mediatek/mtk_drm_drv.h
index ce897984de51..675cdc90a440 100644
--- a/drivers/gpu/drm/mediatek/mtk_drm_drv.h
+++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.h
@@ -63,7 +63,7 @@ struct mtk_drm_private {
 	struct device *mmsys_dev;
 	struct device_node *comp_node[DDP_COMPONENT_DRM_ID_MAX];
 	struct mtk_ddp_comp ddp_comp[DDP_COMPONENT_DRM_ID_MAX];
-	const struct mtk_mmsys_driver_data *data;
+	struct mtk_mmsys_driver_data *data;
 	struct drm_atomic_state *suspend_state;
 	unsigned int mbox_index;
 	struct mtk_drm_private **all_drm_private;
diff --git a/drivers/gpu/drm/mediatek/mtk_dsi.c b/drivers/gpu/drm/mediatek/mtk_dsi.c
index eeec641cab60..33ceeb8d6925 100644
--- a/drivers/gpu/drm/mediatek/mtk_dsi.c
+++ b/drivers/gpu/drm/mediatek/mtk_dsi.c
@@ -988,9 +988,17 @@ static int mtk_dsi_host_attach(struct mipi_dsi_host *host,
 	dsi->lanes = device->lanes;
 	dsi->format = device->format;
 	dsi->mode_flags = device->mode_flags;
-	dsi->next_bridge = devm_drm_of_get_bridge(dev, dev->of_node, 0, 0);
-	if (IS_ERR(dsi->next_bridge))
-		return PTR_ERR(dsi->next_bridge);
+	dsi->next_bridge = devm_drm_of_get_bridge(dev, dev->of_node, 1, 0);
+	if (IS_ERR(dsi->next_bridge)) {
+		ret = PTR_ERR(dsi->next_bridge);
+		if (ret == -EPROBE_DEFER)
+			return ret;
+
+		/* Old devicetree has only one endpoint */
+		dsi->next_bridge = devm_drm_of_get_bridge(dev, dev->of_node, 0, 0);
+		if (IS_ERR(dsi->next_bridge))
+			return PTR_ERR(dsi->next_bridge);
+	}
 
 	drm_bridge_add(&dsi->bridge);
 
-- 
2.46.0



From angelogioacchino.delregno at collabora.com  Tue Sep 10 02:01:40 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Tue, 10 Sep 2024 09:01:40 +0000
Subject: [PATCH v9 1/3] dt-bindings: display: mediatek: Add OF graph support for board path
In-Reply-To: <20240910090127.78905-1-angelogioacchino.delregno@collabora.com>
References: <20240910090127.78905-1-angelogioacchino.delregno@collabora.com>
Message-ID: <01020191db2acc04-e089f151-ea7f-4cd3-8179-6f3552ee6966-000000@eu-west-1.amazonses.com>

The display IPs in MediaTek SoCs support being interconnected with
different instances of DDP IPs (for example, merge0 or merge1) and/or
with different DDP IPs (for example, rdma can be connected with either
color, dpi, dsi, merge, etc), forming a full Display Data Path that
ends with an actual display.

The final display pipeline is effectively board specific, as it does
depend on the display that is attached to it, and eventually on the
sensors supported by the board (for example, Adaptive Ambient Light
would need an Ambient Light Sensor, otherwise it's pointless!), other
than the output type.

Add support for OF graphs to most of the MediaTek DDP (display) bindings
to add flexibility to build custom hardware paths, hence enabling board
specific configuration of the display pipeline and allowing to finally
migrate away from using hardcoded paths.

Reviewed-by: Rob Herring (Arm) <robh at kernel.org>
Reviewed-by: Alexandre Mergnat <amergnat at baylibre.com>
Tested-by: Alexandre Mergnat <amergnat at baylibre.com>
Reviewed-by: CK Hu <ck.hu at mediatek.com>
Tested-by: Michael Walle <mwalle at kernel.org> # on kontron-sbc-i1200
Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
---
 .../arm/mediatek/mediatek,mmsys.yaml.orig     | 140 ++++++++++
 .../display/mediatek/mediatek,aal.yaml        |  40 +++
 .../display/mediatek/mediatek,aal.yaml.orig   |  93 +++++++
 .../display/mediatek/mediatek,ccorr.yaml      |  21 ++
 .../display/mediatek/mediatek,ccorr.yaml.orig |  88 ++++++
 .../display/mediatek/mediatek,color.yaml      |  22 ++
 .../display/mediatek/mediatek,color.yaml.orig |  96 +++++++
 .../display/mediatek/mediatek,dither.yaml     |  22 ++
 .../mediatek/mediatek,dither.yaml.orig        |  87 ++++++
 .../display/mediatek/mediatek,dpi.yaml        |  25 +-
 .../display/mediatek/mediatek,dpi.yaml.orig   | 122 +++++++++
 .../display/mediatek/mediatek,dsc.yaml        |  24 ++
 .../display/mediatek/mediatek,dsi.yaml        |  27 +-
 .../display/mediatek/mediatek,dsi.yaml.orig   | 126 +++++++++
 .../display/mediatek/mediatek,ethdr.yaml      |  22 ++
 .../display/mediatek/mediatek,gamma.yaml      |  19 ++
 .../display/mediatek/mediatek,gamma.yaml.orig |  96 +++++++
 .../display/mediatek/mediatek,merge.yaml      |  23 ++
 .../display/mediatek/mediatek,merge.yaml.orig | 110 ++++++++
 .../display/mediatek/mediatek,od.yaml         |  22 ++
 .../display/mediatek/mediatek,ovl-2l.yaml     |  22 ++
 .../mediatek/mediatek,ovl-2l.yaml.orig        |  78 ++++++
 .../display/mediatek/mediatek,ovl.yaml        |  22 ++
 .../display/mediatek/mediatek,ovl.yaml.orig   | 109 ++++++++
 .../display/mediatek/mediatek,postmask.yaml   |  21 ++
 .../display/mediatek/mediatek,rdma.yaml       |  22 ++
 .../display/mediatek/mediatek,rdma.yaml.orig  | 122 +++++++++
 .../display/mediatek/mediatek,ufoe.yaml       |  21 ++
 .../display/mediatek/mediatek,wdma.yaml.orig  |  76 ++++++
 .../bindings/gpu/arm,mali-bifrost.yaml.orig   | 250 ++++++++++++++++++
 .../bindings/leds/leds-mt6323.txt.orig        |  60 +++++
 .../bindings/ufs/mediatek,ufs.yaml.orig       |  71 +++++
 32 files changed, 2096 insertions(+), 3 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/arm/mediatek/mediatek,mmsys.yaml.orig
 create mode 100644 Documentation/devicetree/bindings/display/mediatek/mediatek,aal.yaml.orig
 create mode 100644 Documentation/devicetree/bindings/display/mediatek/mediatek,ccorr.yaml.orig
 create mode 100644 Documentation/devicetree/bindings/display/mediatek/mediatek,color.yaml.orig
 create mode 100644 Documentation/devicetree/bindings/display/mediatek/mediatek,dither.yaml.orig
 create mode 100644 Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml.orig
 create mode 100644 Documentation/devicetree/bindings/display/mediatek/mediatek,dsi.yaml.orig
 create mode 100644 Documentation/devicetree/bindings/display/mediatek/mediatek,gamma.yaml.orig
 create mode 100644 Documentation/devicetree/bindings/display/mediatek/mediatek,merge.yaml.orig
 create mode 100644 Documentation/devicetree/bindings/display/mediatek/mediatek,ovl-2l.yaml.orig
 create mode 100644 Documentation/devicetree/bindings/display/mediatek/mediatek,ovl.yaml.orig
 create mode 100644 Documentation/devicetree/bindings/display/mediatek/mediatek,rdma.yaml.orig
 create mode 100644 Documentation/devicetree/bindings/display/mediatek/mediatek,wdma.yaml.orig
 create mode 100644 Documentation/devicetree/bindings/gpu/arm,mali-bifrost.yaml.orig
 create mode 100644 Documentation/devicetree/bindings/leds/leds-mt6323.txt.orig
 create mode 100644 Documentation/devicetree/bindings/ufs/mediatek,ufs.yaml.orig

diff --git a/Documentation/devicetree/bindings/arm/mediatek/mediatek,mmsys.yaml.orig b/Documentation/devicetree/bindings/arm/mediatek/mediatek,mmsys.yaml.orig
new file mode 100644
index 000000000000..90758bb5bcb1
--- /dev/null
+++ b/Documentation/devicetree/bindings/arm/mediatek/mediatek,mmsys.yaml.orig
@@ -0,0 +1,140 @@
+# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/arm/mediatek/mediatek,mmsys.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: MediaTek mmsys controller
+
+maintainers:
+  - Matthias Brugger <matthias.bgg at gmail.com>
+
+description:
+  The MediaTek mmsys system controller provides clock control, routing control,
+  and miscellaneous control in mmsys partition.
+
+properties:
+  $nodename:
+    pattern: "^syscon@[0-9a-f]+$"
+
+  compatible:
+    oneOf:
+      - items:
+          - enum:
+              - mediatek,mt2701-mmsys
+              - mediatek,mt2712-mmsys
+              - mediatek,mt6765-mmsys
+              - mediatek,mt6779-mmsys
+              - mediatek,mt6795-mmsys
+              - mediatek,mt6797-mmsys
+              - mediatek,mt8167-mmsys
+              - mediatek,mt8173-mmsys
+              - mediatek,mt8183-mmsys
+              - mediatek,mt8186-mmsys
+              - mediatek,mt8188-vdosys0
+              - mediatek,mt8188-vdosys1
+              - mediatek,mt8188-vppsys0
+              - mediatek,mt8188-vppsys1
+              - mediatek,mt8192-mmsys
+              - mediatek,mt8195-vdosys1
+              - mediatek,mt8195-vppsys0
+              - mediatek,mt8195-vppsys1
+              - mediatek,mt8365-mmsys
+          - const: syscon
+
+      - description: vdosys0 and vdosys1 are 2 display HW pipelines,
+                     so mt8195 binding should be deprecated.
+        deprecated: true
+        items:
+          - const: mediatek,mt8195-mmsys
+          - const: syscon
+
+      - items:
+          - const: mediatek,mt7623-mmsys
+          - const: mediatek,mt2701-mmsys
+          - const: syscon
+
+      - items:
+          - const: mediatek,mt8195-vdosys0
+          - const: mediatek,mt8195-mmsys
+          - const: syscon
+
+  reg:
+    maxItems: 1
+
+  power-domains:
+    description:
+      A phandle and PM domain specifier as defined by bindings
+      of the power controller specified by phandle. See
+      Documentation/devicetree/bindings/power/power-domain.yaml for details.
+
+  mboxes:
+    description:
+      Using mailbox to communicate with GCE, it should have this
+      property and list of phandle, mailbox specifiers. See
+      Documentation/devicetree/bindings/mailbox/mediatek,gce-mailbox.yaml
+      for details.
+    $ref: /schemas/types.yaml#/definitions/phandle-array
+
+  mediatek,gce-client-reg:
+    description:
+      The register of client driver can be configured by gce with 4 arguments
+      defined in this property, such as phandle of gce, subsys id,
+      register offset and size.
+      Each subsys id is mapping to a base address of display function blocks
+      register which is defined in the gce header
+      include/dt-bindings/gce/<chip>-gce.h.
+    $ref: /schemas/types.yaml#/definitions/phandle-array
+    maxItems: 1
+
+  "#clock-cells":
+    const: 1
+
+  '#reset-cells':
+    const: 1
+
+  port:
+    $ref: /schemas/graph.yaml#/properties/port
+    description:
+      Output port node. This port connects the MMSYS/VDOSYS output to
+      the first component of one display pipeline, for example one of
+      the available OVL or RDMA blocks.
+      Some MediaTek SoCs support up to three display outputs per MMSYS.
+    properties:
+      endpoint at 0:
+        $ref: /schemas/graph.yaml#/properties/endpoint
+        description: Output to the primary display pipeline
+
+      endpoint at 1:
+        $ref: /schemas/graph.yaml#/properties/endpoint
+        description: Output to the secondary display pipeline
+
+      endpoint at 2:
+        $ref: /schemas/graph.yaml#/properties/endpoint
+        description: Output to the tertiary display pipeline
+
+      required:
+        - endpoint at 0
+
+required:
+  - compatible
+  - reg
+  - "#clock-cells"
+
+additionalProperties: false
+
+examples:
+  - |
+    #include <dt-bindings/power/mt8173-power.h>
+    #include <dt-bindings/gce/mt8173-gce.h>
+
+    mmsys: syscon at 14000000 {
+        compatible = "mediatek,mt8173-mmsys", "syscon";
+        reg = <0x14000000 0x1000>;
+        power-domains = <&spm MT8173_POWER_DOMAIN_MM>;
+        #clock-cells = <1>;
+        #reset-cells = <1>;
+        mboxes = <&gce 0 CMDQ_THR_PRIO_HIGHEST>,
+                 <&gce 1 CMDQ_THR_PRIO_HIGHEST>;
+        mediatek,gce-client-reg = <&gce SUBSYS_1400XXXX 0 0x1000>;
+    };
diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,aal.yaml b/Documentation/devicetree/bindings/display/mediatek/mediatek,aal.yaml
index cf24434854ff..47ddba5c41af 100644
--- a/Documentation/devicetree/bindings/display/mediatek/mediatek,aal.yaml
+++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,aal.yaml
@@ -62,6 +62,27 @@ properties:
     $ref: /schemas/types.yaml#/definitions/phandle-array
     maxItems: 1
 
+  ports:
+    $ref: /schemas/graph.yaml#/properties/ports
+    description:
+      Input and output ports can have multiple endpoints, each of those
+      connects to either the primary, secondary, etc, display pipeline.
+
+    properties:
+      port at 0:
+        $ref: /schemas/graph.yaml#/properties/port
+        description: AAL input port
+
+      port at 1:
+        $ref: /schemas/graph.yaml#/properties/port
+        description:
+          AAL output to the next component's input, for example could be one
+          of many gamma, overdrive or other blocks.
+
+    required:
+      - port at 0
+      - port at 1
+
 required:
   - compatible
   - reg
@@ -89,5 +110,24 @@ examples:
            power-domains = <&scpsys MT8173_POWER_DOMAIN_MM>;
            clocks = <&mmsys CLK_MM_DISP_AAL>;
            mediatek,gce-client-reg = <&gce SUBSYS_1401XXXX 0x5000 0x1000>;
+
+           ports {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               port at 0 {
+                   reg = <0>;
+                   aal0_in: endpoint {
+                       remote-endpoint = <&ccorr0_out>;
+                   };
+               };
+
+               port at 1 {
+                   reg = <1>;
+                   aal0_out: endpoint {
+                       remote-endpoint = <&gamma0_in>;
+                   };
+               };
+           };
        };
     };
diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,aal.yaml.orig b/Documentation/devicetree/bindings/display/mediatek/mediatek,aal.yaml.orig
new file mode 100644
index 000000000000..cf24434854ff
--- /dev/null
+++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,aal.yaml.orig
@@ -0,0 +1,93 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/display/mediatek/mediatek,aal.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Mediatek display adaptive ambient light processor
+
+maintainers:
+  - Chun-Kuang Hu <chunkuang.hu at kernel.org>
+  - Philipp Zabel <p.zabel at pengutronix.de>
+
+description: |
+  Mediatek display adaptive ambient light processor, namely AAL,
+  is responsible for backlight power saving and sunlight visibility improving.
+  AAL device node must be siblings to the central MMSYS_CONFIG node.
+  For a description of the MMSYS_CONFIG binding, see
+  Documentation/devicetree/bindings/arm/mediatek/mediatek,mmsys.yaml
+  for details.
+
+properties:
+  compatible:
+    oneOf:
+      - enum:
+          - mediatek,mt8173-disp-aal
+          - mediatek,mt8183-disp-aal
+          - mediatek,mt8195-mdp3-aal
+      - items:
+          - enum:
+              - mediatek,mt2712-disp-aal
+              - mediatek,mt6795-disp-aal
+          - const: mediatek,mt8173-disp-aal
+      - items:
+          - enum:
+              - mediatek,mt8186-disp-aal
+              - mediatek,mt8188-disp-aal
+              - mediatek,mt8192-disp-aal
+              - mediatek,mt8195-disp-aal
+              - mediatek,mt8365-disp-aal
+          - const: mediatek,mt8183-disp-aal
+
+  reg:
+    maxItems: 1
+
+  interrupts:
+    maxItems: 1
+
+  power-domains:
+    description: A phandle and PM domain specifier as defined by bindings of
+      the power controller specified by phandle. See
+      Documentation/devicetree/bindings/power/power-domain.yaml for details.
+
+  clocks:
+    items:
+      - description: AAL Clock
+
+  mediatek,gce-client-reg:
+    description: The register of client driver can be configured by gce with
+      4 arguments defined in this property, such as phandle of gce, subsys id,
+      register offset and size. Each GCE subsys id is mapping to a client
+      defined in the header include/dt-bindings/gce/<chip>-gce.h.
+    $ref: /schemas/types.yaml#/definitions/phandle-array
+    maxItems: 1
+
+required:
+  - compatible
+  - reg
+  - interrupts
+  - power-domains
+  - clocks
+
+additionalProperties: false
+
+examples:
+  - |
+    #include <dt-bindings/interrupt-controller/arm-gic.h>
+    #include <dt-bindings/clock/mt8173-clk.h>
+    #include <dt-bindings/power/mt8173-power.h>
+    #include <dt-bindings/gce/mt8173-gce.h>
+
+    soc {
+        #address-cells = <2>;
+        #size-cells = <2>;
+
+        aal at 14015000 {
+           compatible = "mediatek,mt8173-disp-aal";
+           reg = <0 0x14015000 0 0x1000>;
+           interrupts = <GIC_SPI 189 IRQ_TYPE_LEVEL_LOW>;
+           power-domains = <&scpsys MT8173_POWER_DOMAIN_MM>;
+           clocks = <&mmsys CLK_MM_DISP_AAL>;
+           mediatek,gce-client-reg = <&gce SUBSYS_1401XXXX 0x5000 0x1000>;
+       };
+    };
diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,ccorr.yaml b/Documentation/devicetree/bindings/display/mediatek/mediatek,ccorr.yaml
index 9f8366763831..fca8e7bb0cbc 100644
--- a/Documentation/devicetree/bindings/display/mediatek/mediatek,ccorr.yaml
+++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,ccorr.yaml
@@ -57,6 +57,27 @@ properties:
     $ref: /schemas/types.yaml#/definitions/phandle-array
     maxItems: 1
 
+  ports:
+    $ref: /schemas/graph.yaml#/properties/ports
+    description:
+      Input and output ports can have multiple endpoints, each of those
+      connects to either the primary, secondary, etc, display pipeline.
+
+    properties:
+      port at 0:
+        $ref: /schemas/graph.yaml#/properties/port
+        description: CCORR input port
+
+      port at 1:
+        $ref: /schemas/graph.yaml#/properties/port
+        description:
+          CCORR output to the input of the next desired component in the
+          display pipeline, usually only one of the available AAL blocks.
+
+    required:
+      - port at 0
+      - port at 1
+
 required:
   - compatible
   - reg
diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,ccorr.yaml.orig b/Documentation/devicetree/bindings/display/mediatek/mediatek,ccorr.yaml.orig
new file mode 100644
index 000000000000..9f8366763831
--- /dev/null
+++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,ccorr.yaml.orig
@@ -0,0 +1,88 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/display/mediatek/mediatek,ccorr.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Mediatek display color correction
+
+maintainers:
+  - Chun-Kuang Hu <chunkuang.hu at kernel.org>
+  - Philipp Zabel <p.zabel at pengutronix.de>
+
+description: |
+  Mediatek display color correction, namely CCORR, reproduces correct color
+  on panels with different color gamut.
+  CCORR device node must be siblings to the central MMSYS_CONFIG node.
+  For a description of the MMSYS_CONFIG binding, see
+  Documentation/devicetree/bindings/arm/mediatek/mediatek,mmsys.yaml
+  for details.
+
+properties:
+  compatible:
+    oneOf:
+      - enum:
+          - mediatek,mt8183-disp-ccorr
+          - mediatek,mt8192-disp-ccorr
+      - items:
+          - const: mediatek,mt8365-disp-ccorr
+          - const: mediatek,mt8183-disp-ccorr
+      - items:
+          - enum:
+              - mediatek,mt8186-disp-ccorr
+              - mediatek,mt8188-disp-ccorr
+              - mediatek,mt8195-disp-ccorr
+          - const: mediatek,mt8192-disp-ccorr
+
+  reg:
+    maxItems: 1
+
+  interrupts:
+    maxItems: 1
+
+  power-domains:
+    description: A phandle and PM domain specifier as defined by bindings of
+      the power controller specified by phandle. See
+      Documentation/devicetree/bindings/power/power-domain.yaml for details.
+
+  clocks:
+    items:
+      - description: CCORR Clock
+
+  mediatek,gce-client-reg:
+    description: The register of client driver can be configured by gce with
+      4 arguments defined in this property, such as phandle of gce, subsys id,
+      register offset and size. Each GCE subsys id is mapping to a client
+      defined in the header include/dt-bindings/gce/<chip>-gce.h.
+    $ref: /schemas/types.yaml#/definitions/phandle-array
+    maxItems: 1
+
+required:
+  - compatible
+  - reg
+  - interrupts
+  - power-domains
+  - clocks
+
+additionalProperties: false
+
+examples:
+  - |
+    #include <dt-bindings/interrupt-controller/arm-gic.h>
+    #include <dt-bindings/clock/mt8183-clk.h>
+    #include <dt-bindings/power/mt8183-power.h>
+    #include <dt-bindings/gce/mt8183-gce.h>
+
+    soc {
+        #address-cells = <2>;
+        #size-cells = <2>;
+
+        ccorr0: ccorr at 1400f000 {
+            compatible = "mediatek,mt8183-disp-ccorr";
+            reg = <0 0x1400f000 0 0x1000>;
+            interrupts = <GIC_SPI 232 IRQ_TYPE_LEVEL_LOW>;
+            power-domains = <&spm MT8183_POWER_DOMAIN_DISP>;
+            clocks = <&mmsys CLK_MM_DISP_CCORR0>;
+            mediatek,gce-client-reg = <&gce SUBSYS_1400XXXX 0xf000 0x1000>;
+        };
+    };
diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,color.yaml b/Documentation/devicetree/bindings/display/mediatek/mediatek,color.yaml
index 7df786bbad20..6160439ce4d7 100644
--- a/Documentation/devicetree/bindings/display/mediatek/mediatek,color.yaml
+++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,color.yaml
@@ -65,6 +65,28 @@ properties:
     $ref: /schemas/types.yaml#/definitions/phandle-array
     maxItems: 1
 
+  ports:
+    $ref: /schemas/graph.yaml#/properties/ports
+    description:
+      Input and output ports can have multiple endpoints, each of those
+      connects to either the primary, secondary, etc, display pipeline.
+
+    properties:
+      port at 0:
+        $ref: /schemas/graph.yaml#/properties/port
+        description: COLOR input port
+
+      port at 1:
+        $ref: /schemas/graph.yaml#/properties/port
+        description:
+          COLOR output to the input of the next desired component in the
+          display pipeline, for example one of the available CCORR or AAL
+          blocks.
+
+    required:
+      - port at 0
+      - port at 1
+
 required:
   - compatible
   - reg
diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,color.yaml.orig b/Documentation/devicetree/bindings/display/mediatek/mediatek,color.yaml.orig
new file mode 100644
index 000000000000..7df786bbad20
--- /dev/null
+++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,color.yaml.orig
@@ -0,0 +1,96 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/display/mediatek/mediatek,color.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Mediatek display color processor
+
+maintainers:
+  - Chun-Kuang Hu <chunkuang.hu at kernel.org>
+  - Philipp Zabel <p.zabel at pengutronix.de>
+
+description: |
+  Mediatek display color processor, namely COLOR, provides hue, luma and
+  saturation adjustments to get better picture quality and to have one panel
+  resemble the other in their output characteristics.
+  COLOR device node must be siblings to the central MMSYS_CONFIG node.
+  For a description of the MMSYS_CONFIG binding, see
+  Documentation/devicetree/bindings/arm/mediatek/mediatek,mmsys.yaml
+  for details.
+
+properties:
+  compatible:
+    oneOf:
+      - enum:
+          - mediatek,mt2701-disp-color
+          - mediatek,mt8167-disp-color
+          - mediatek,mt8173-disp-color
+          - mediatek,mt8195-mdp3-color
+      - items:
+          - enum:
+              - mediatek,mt7623-disp-color
+              - mediatek,mt2712-disp-color
+          - const: mediatek,mt2701-disp-color
+      - items:
+          - enum:
+              - mediatek,mt6795-disp-color
+              - mediatek,mt8183-disp-color
+              - mediatek,mt8186-disp-color
+              - mediatek,mt8188-disp-color
+              - mediatek,mt8192-disp-color
+              - mediatek,mt8195-disp-color
+              - mediatek,mt8365-disp-color
+          - const: mediatek,mt8173-disp-color
+  reg:
+    maxItems: 1
+
+  interrupts:
+    maxItems: 1
+
+  power-domains:
+    description: A phandle and PM domain specifier as defined by bindings of
+      the power controller specified by phandle. See
+      Documentation/devicetree/bindings/power/power-domain.yaml for details.
+
+  clocks:
+    items:
+      - description: COLOR Clock
+
+  mediatek,gce-client-reg:
+    description: The register of client driver can be configured by gce with
+      4 arguments defined in this property, such as phandle of gce, subsys id,
+      register offset and size. Each GCE subsys id is mapping to a client
+      defined in the header include/dt-bindings/gce/<chip>-gce.h.
+    $ref: /schemas/types.yaml#/definitions/phandle-array
+    maxItems: 1
+
+required:
+  - compatible
+  - reg
+  - interrupts
+  - power-domains
+  - clocks
+
+additionalProperties: false
+
+examples:
+  - |
+    #include <dt-bindings/interrupt-controller/arm-gic.h>
+    #include <dt-bindings/clock/mt8173-clk.h>
+    #include <dt-bindings/power/mt8173-power.h>
+    #include <dt-bindings/gce/mt8173-gce.h>
+
+    soc {
+        #address-cells = <2>;
+        #size-cells = <2>;
+
+        color0: color at 14013000 {
+            compatible = "mediatek,mt8173-disp-color";
+            reg = <0 0x14013000 0 0x1000>;
+            interrupts = <GIC_SPI 187 IRQ_TYPE_LEVEL_LOW>;
+            power-domains = <&scpsys MT8173_POWER_DOMAIN_MM>;
+            clocks = <&mmsys CLK_MM_DISP_COLOR0>;
+            mediatek,gce-client-reg = <&gce SUBSYS_1401XXXX 0x3000 0x1000>;
+        };
+    };
diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,dither.yaml b/Documentation/devicetree/bindings/display/mediatek/mediatek,dither.yaml
index 6fceb1f95d2a..abaf27916d13 100644
--- a/Documentation/devicetree/bindings/display/mediatek/mediatek,dither.yaml
+++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,dither.yaml
@@ -56,6 +56,28 @@ properties:
     $ref: /schemas/types.yaml#/definitions/phandle-array
     maxItems: 1
 
+  ports:
+    $ref: /schemas/graph.yaml#/properties/ports
+    description:
+      Input and output ports can have multiple endpoints, each of those
+      connects to either the primary, secondary, etc, display pipeline.
+
+    properties:
+      port at 0:
+        $ref: /schemas/graph.yaml#/properties/port
+        description: DITHER input, usually from a POSTMASK or GAMMA block.
+
+      port at 1:
+        $ref: /schemas/graph.yaml#/properties/port
+        description:
+          DITHER output to the input of the next desired component in the
+          display pipeline, for example one of the available DSC compressors,
+          DP_INTF, DSI, LVDS or others.
+
+    required:
+      - port at 0
+      - port at 1
+
 required:
   - compatible
   - reg
diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,dither.yaml.orig b/Documentation/devicetree/bindings/display/mediatek/mediatek,dither.yaml.orig
new file mode 100644
index 000000000000..6fceb1f95d2a
--- /dev/null
+++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,dither.yaml.orig
@@ -0,0 +1,87 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/display/mediatek/mediatek,dither.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Mediatek display dither processor
+
+maintainers:
+  - Chun-Kuang Hu <chunkuang.hu at kernel.org>
+  - Philipp Zabel <p.zabel at pengutronix.de>
+
+description: |
+  Mediatek display dither processor, namely DITHER, works by approximating
+  unavailable colors with available colors and by mixing and matching available
+  colors to mimic unavailable ones.
+  DITHER device node must be siblings to the central MMSYS_CONFIG node.
+  For a description of the MMSYS_CONFIG binding, see
+  Documentation/devicetree/bindings/arm/mediatek/mediatek,mmsys.yaml
+  for details.
+
+properties:
+  compatible:
+    oneOf:
+      - enum:
+          - mediatek,mt8183-disp-dither
+      - items:
+          - enum:
+              - mediatek,mt8186-disp-dither
+              - mediatek,mt8188-disp-dither
+              - mediatek,mt8192-disp-dither
+              - mediatek,mt8195-disp-dither
+              - mediatek,mt8365-disp-dither
+          - const: mediatek,mt8183-disp-dither
+
+  reg:
+    maxItems: 1
+
+  interrupts:
+    maxItems: 1
+
+  power-domains:
+    description: A phandle and PM domain specifier as defined by bindings of
+      the power controller specified by phandle. See
+      Documentation/devicetree/bindings/power/power-domain.yaml for details.
+
+  clocks:
+    items:
+      - description: DITHER Clock
+
+  mediatek,gce-client-reg:
+    description: The register of client driver can be configured by gce with
+      4 arguments defined in this property, such as phandle of gce, subsys id,
+      register offset and size. Each GCE subsys id is mapping to a client
+      defined in the header include/dt-bindings/gce/<chip>-gce.h.
+    $ref: /schemas/types.yaml#/definitions/phandle-array
+    maxItems: 1
+
+required:
+  - compatible
+  - reg
+  - interrupts
+  - power-domains
+  - clocks
+
+additionalProperties: false
+
+examples:
+  - |
+    #include <dt-bindings/interrupt-controller/arm-gic.h>
+    #include <dt-bindings/clock/mt8183-clk.h>
+    #include <dt-bindings/power/mt8183-power.h>
+    #include <dt-bindings/gce/mt8183-gce.h>
+
+    soc {
+        #address-cells = <2>;
+        #size-cells = <2>;
+
+        dither0: dither at 14012000 {
+            compatible = "mediatek,mt8183-disp-dither";
+            reg = <0 0x14012000 0 0x1000>;
+            interrupts = <GIC_SPI 235 IRQ_TYPE_LEVEL_LOW>;
+            power-domains = <&spm MT8183_POWER_DOMAIN_DISP>;
+            clocks = <&mmsys CLK_MM_DISP_DITHER0>;
+            mediatek,gce-client-reg = <&gce SUBSYS_1401XXXX 0x2000 0x1000>;
+        };
+    };
diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml b/Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml
index 3a82aec9021c..b567e3d58aa1 100644
--- a/Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml
+++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml
@@ -71,13 +71,34 @@ properties:
       Output port node. This port should be connected to the input port of an
       attached HDMI, LVDS or DisplayPort encoder chip.
 
+  ports:
+    $ref: /schemas/graph.yaml#/properties/ports
+
+    properties:
+      port at 0:
+        $ref: /schemas/graph.yaml#/properties/port
+        description: DPI input port
+
+      port at 1:
+        $ref: /schemas/graph.yaml#/properties/port
+        description: DPI output to an HDMI, LVDS or DisplayPort encoder input
+
+    required:
+      - port at 0
+      - port at 1
+
 required:
   - compatible
   - reg
   - interrupts
   - clocks
   - clock-names
-  - port
+
+oneOf:
+  - required:
+      - port
+  - required:
+      - ports
 
 allOf:
   - if:
@@ -100,7 +121,7 @@ examples:
     #include <dt-bindings/interrupt-controller/arm-gic.h>
     #include <dt-bindings/clock/mt8173-clk.h>
 
-    dpi0: dpi at 1401d000 {
+    dpi: dpi at 1401d000 {
         compatible = "mediatek,mt8173-dpi";
         reg = <0x1401d000 0x1000>;
         interrupts = <GIC_SPI 194 IRQ_TYPE_LEVEL_LOW>;
diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml.orig b/Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml.orig
new file mode 100644
index 000000000000..3a82aec9021c
--- /dev/null
+++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml.orig
@@ -0,0 +1,122 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/display/mediatek/mediatek,dpi.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: MediaTek DPI and DP_INTF Controller
+
+maintainers:
+  - CK Hu <ck.hu at mediatek.com>
+  - Jitao shi <jitao.shi at mediatek.com>
+
+description: |
+  The MediaTek DPI and DP_INTF function blocks are a sink of the display
+  subsystem and provides 8-bit RGB/YUV444 or 8/10/10-bit YUV422 pixel data on a
+  parallel output bus.
+
+properties:
+  compatible:
+    oneOf:
+      - enum:
+          - mediatek,mt2701-dpi
+          - mediatek,mt7623-dpi
+          - mediatek,mt8173-dpi
+          - mediatek,mt8183-dpi
+          - mediatek,mt8186-dpi
+          - mediatek,mt8188-dp-intf
+          - mediatek,mt8192-dpi
+          - mediatek,mt8195-dp-intf
+      - items:
+          - enum:
+              - mediatek,mt6795-dpi
+          - const: mediatek,mt8183-dpi
+      - items:
+          - enum:
+              - mediatek,mt8365-dpi
+          - const: mediatek,mt8192-dpi
+
+  reg:
+    maxItems: 1
+
+  interrupts:
+    maxItems: 1
+
+  clocks:
+    items:
+      - description: Pixel Clock
+      - description: Engine Clock
+      - description: DPI PLL
+
+  clock-names:
+    items:
+      - const: pixel
+      - const: engine
+      - const: pll
+
+  pinctrl-0: true
+  pinctrl-1: true
+
+  pinctrl-names:
+    items:
+      - const: default
+      - const: sleep
+
+  power-domains:
+    maxItems: 1
+
+  port:
+    $ref: /schemas/graph.yaml#/properties/port
+    description:
+      Output port node. This port should be connected to the input port of an
+      attached HDMI, LVDS or DisplayPort encoder chip.
+
+required:
+  - compatible
+  - reg
+  - interrupts
+  - clocks
+  - clock-names
+  - port
+
+allOf:
+  - if:
+      not:
+        properties:
+          compatible:
+            contains:
+              enum:
+                - mediatek,mt6795-dpi
+                - mediatek,mt8173-dpi
+                - mediatek,mt8186-dpi
+    then:
+      properties:
+        power-domains: false
+
+additionalProperties: false
+
+examples:
+  - |
+    #include <dt-bindings/interrupt-controller/arm-gic.h>
+    #include <dt-bindings/clock/mt8173-clk.h>
+
+    dpi0: dpi at 1401d000 {
+        compatible = "mediatek,mt8173-dpi";
+        reg = <0x1401d000 0x1000>;
+        interrupts = <GIC_SPI 194 IRQ_TYPE_LEVEL_LOW>;
+        clocks = <&mmsys CLK_MM_DPI_PIXEL>,
+             <&mmsys CLK_MM_DPI_ENGINE>,
+             <&apmixedsys CLK_APMIXED_TVDPLL>;
+        clock-names = "pixel", "engine", "pll";
+        pinctrl-names = "default", "sleep";
+        pinctrl-0 = <&dpi_pin_func>;
+        pinctrl-1 = <&dpi_pin_idle>;
+
+        port {
+            dpi0_out: endpoint {
+                remote-endpoint = <&hdmi0_in>;
+            };
+        };
+    };
+
+...
diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,dsc.yaml b/Documentation/devicetree/bindings/display/mediatek/mediatek,dsc.yaml
index 2cbdd9ee449d..846de6c17d93 100644
--- a/Documentation/devicetree/bindings/display/mediatek/mediatek,dsc.yaml
+++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,dsc.yaml
@@ -49,6 +49,30 @@ properties:
     $ref: /schemas/types.yaml#/definitions/phandle-array
     maxItems: 1
 
+  ports:
+    $ref: /schemas/graph.yaml#/properties/ports
+    description:
+      Input and output ports can have multiple endpoints, each of those
+      connects to either the primary, secondary, etc, display pipeline.
+
+    properties:
+      port at 0:
+        $ref: /schemas/graph.yaml#/properties/port
+        description:
+          Display Stream Compression input, usually from one of the DITHER
+          or MERGE blocks.
+
+      port at 1:
+        $ref: /schemas/graph.yaml#/properties/port
+        description:
+          Display Stream Compression output to the input of the next desired
+          component in the display pipeline, for example to MERGE, DP_INTF,
+          DPI or DSI.
+
+    required:
+      - port at 0
+      - port at 1
+
 required:
   - compatible
   - reg
diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,dsi.yaml b/Documentation/devicetree/bindings/display/mediatek/mediatek,dsi.yaml
index a7aa8fcb0dd1..27ffbccc2a08 100644
--- a/Documentation/devicetree/bindings/display/mediatek/mediatek,dsi.yaml
+++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,dsi.yaml
@@ -77,6 +77,26 @@ properties:
       Output port node. This port should be connected to the input
       port of an attached DSI panel or DSI-to-eDP encoder chip.
 
+  ports:
+    $ref: /schemas/graph.yaml#/properties/ports
+    description:
+      Input ports can have multiple endpoints, each of those connects
+      to either the primary, secondary, etc, display pipeline.
+
+    properties:
+      port at 0:
+        $ref: /schemas/graph.yaml#/properties/port
+        description: DSI input port, usually from DITHER, DSC or MERGE
+
+      port at 1:
+        $ref: /schemas/graph.yaml#/properties/port
+        description:
+          DSI output to an attached DSI panel, or a DSI-to-X encoder chip
+
+    required:
+      - port at 0
+      - port at 1
+
 required:
   - compatible
   - reg
@@ -86,7 +106,12 @@ required:
   - clock-names
   - phys
   - phy-names
-  - port
+
+oneOf:
+  - required:
+      - port
+  - required:
+      - ports
 
 unevaluatedProperties: false
 
diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,dsi.yaml.orig b/Documentation/devicetree/bindings/display/mediatek/mediatek,dsi.yaml.orig
new file mode 100644
index 000000000000..a7aa8fcb0dd1
--- /dev/null
+++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,dsi.yaml.orig
@@ -0,0 +1,126 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/display/mediatek/mediatek,dsi.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: MediaTek DSI Controller
+
+maintainers:
+  - Chun-Kuang Hu <chunkuang.hu at kernel.org>
+  - Philipp Zabel <p.zabel at pengutronix.de>
+  - Jitao Shi <jitao.shi at mediatek.com>
+
+description: |
+  The MediaTek DSI function block is a sink of the display subsystem and can
+  drive up to 4-lane MIPI DSI output. Two DSIs can be synchronized for dual-
+  channel output.
+
+allOf:
+  - $ref: /schemas/display/dsi-controller.yaml#
+
+properties:
+  compatible:
+    oneOf:
+      - enum:
+          - mediatek,mt2701-dsi
+          - mediatek,mt7623-dsi
+          - mediatek,mt8167-dsi
+          - mediatek,mt8173-dsi
+          - mediatek,mt8183-dsi
+          - mediatek,mt8186-dsi
+          - mediatek,mt8188-dsi
+      - items:
+          - enum:
+              - mediatek,mt6795-dsi
+          - const: mediatek,mt8173-dsi
+      - items:
+          - enum:
+              - mediatek,mt8195-dsi
+              - mediatek,mt8365-dsi
+          - const: mediatek,mt8183-dsi
+
+  reg:
+    maxItems: 1
+
+  interrupts:
+    maxItems: 1
+
+  power-domains:
+    maxItems: 1
+
+  clocks:
+    items:
+      - description: Engine Clock
+      - description: Digital Clock
+      - description: HS Clock
+
+  clock-names:
+    items:
+      - const: engine
+      - const: digital
+      - const: hs
+
+  resets:
+    maxItems: 1
+
+  phys:
+    maxItems: 1
+
+  phy-names:
+    items:
+      - const: dphy
+
+  port:
+    $ref: /schemas/graph.yaml#/properties/port
+    description:
+      Output port node. This port should be connected to the input
+      port of an attached DSI panel or DSI-to-eDP encoder chip.
+
+required:
+  - compatible
+  - reg
+  - interrupts
+  - power-domains
+  - clocks
+  - clock-names
+  - phys
+  - phy-names
+  - port
+
+unevaluatedProperties: false
+
+examples:
+  - |
+    #include <dt-bindings/clock/mt8183-clk.h>
+    #include <dt-bindings/interrupt-controller/arm-gic.h>
+    #include <dt-bindings/interrupt-controller/irq.h>
+    #include <dt-bindings/power/mt8183-power.h>
+    #include <dt-bindings/phy/phy.h>
+    #include <dt-bindings/reset/mt8183-resets.h>
+
+    soc {
+        #address-cells = <2>;
+        #size-cells = <2>;
+
+        dsi0: dsi at 14014000 {
+            compatible = "mediatek,mt8183-dsi";
+            reg = <0 0x14014000 0 0x1000>;
+            interrupts = <GIC_SPI 236 IRQ_TYPE_LEVEL_LOW>;
+            power-domains = <&spm MT8183_POWER_DOMAIN_DISP>;
+            clocks = <&mmsys CLK_MM_DSI0_MM>,
+                <&mmsys CLK_MM_DSI0_IF>,
+                <&mipi_tx0>;
+            clock-names = "engine", "digital", "hs";
+            resets = <&mmsys MT8183_MMSYS_SW0_RST_B_DISP_DSI0>;
+            phys = <&mipi_tx0>;
+            phy-names = "dphy";
+            port {
+                dsi0_out: endpoint {
+                    remote-endpoint = <&panel_in>;
+                };
+            };
+        };
+    };
+
+...
diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,ethdr.yaml b/Documentation/devicetree/bindings/display/mediatek/mediatek,ethdr.yaml
index 677882348ede..98db47894eeb 100644
--- a/Documentation/devicetree/bindings/display/mediatek/mediatek,ethdr.yaml
+++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,ethdr.yaml
@@ -110,6 +110,28 @@ properties:
       include/dt-bindings/gce/<chip>-gce.h, mapping to the register of display
       function block.
 
+  ports:
+    $ref: /schemas/graph.yaml#/properties/ports
+    description:
+      Input and output ports can have multiple endpoints, each of those
+      connects to either the primary, secondary, etc, display pipeline.
+
+    properties:
+      port at 0:
+        $ref: /schemas/graph.yaml#/properties/port
+        description: ETHDR input, usually from one of the MERGE blocks.
+
+      port at 1:
+        $ref: /schemas/graph.yaml#/properties/port
+        description:
+          ETHDR output to the input of the next desired component in the
+          display pipeline, for example one of the available MERGE blocks,
+          or others.
+
+    required:
+      - port at 0
+      - port at 1
+
 required:
   - compatible
   - reg
diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,gamma.yaml b/Documentation/devicetree/bindings/display/mediatek/mediatek,gamma.yaml
index 6823d3ce5049..48542dc7e784 100644
--- a/Documentation/devicetree/bindings/display/mediatek/mediatek,gamma.yaml
+++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,gamma.yaml
@@ -65,6 +65,25 @@ properties:
     $ref: /schemas/types.yaml#/definitions/phandle-array
     maxItems: 1
 
+  ports:
+    $ref: /schemas/graph.yaml#/properties/ports
+
+    properties:
+      port at 0:
+        $ref: /schemas/graph.yaml#/properties/port
+        description: GAMMA input, usually from one of the AAL blocks.
+
+      port at 1:
+        $ref: /schemas/graph.yaml#/properties/port
+        description:
+          GAMMA output to the input of the next desired component in the
+          display pipeline, for example one of the available DITHER or
+          POSTMASK blocks.
+
+    required:
+      - port at 0
+      - port at 1
+
 required:
   - compatible
   - reg
diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,gamma.yaml.orig b/Documentation/devicetree/bindings/display/mediatek/mediatek,gamma.yaml.orig
new file mode 100644
index 000000000000..6823d3ce5049
--- /dev/null
+++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,gamma.yaml.orig
@@ -0,0 +1,96 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/display/mediatek/mediatek,gamma.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Mediatek display gamma correction
+
+maintainers:
+  - Chun-Kuang Hu <chunkuang.hu at kernel.org>
+  - Philipp Zabel <p.zabel at pengutronix.de>
+
+description: |
+  Mediatek display gamma correction, namely GAMMA, provides a nonlinear
+  operation used to adjust luminance in?display system.
+  GAMMA device node must be siblings to the central MMSYS_CONFIG node.
+  For a description of the MMSYS_CONFIG binding, see
+  Documentation/devicetree/bindings/arm/mediatek/mediatek,mmsys.yaml
+  for details.
+
+properties:
+  compatible:
+    oneOf:
+      - enum:
+          - mediatek,mt8173-disp-gamma
+          - mediatek,mt8183-disp-gamma
+          - mediatek,mt8195-disp-gamma
+      - items:
+          - enum:
+              - mediatek,mt6795-disp-gamma
+          - const: mediatek,mt8173-disp-gamma
+      - items:
+          - enum:
+              - mediatek,mt8186-disp-gamma
+              - mediatek,mt8188-disp-gamma
+              - mediatek,mt8192-disp-gamma
+              - mediatek,mt8195-disp-gamma
+              - mediatek,mt8365-disp-gamma
+          - const: mediatek,mt8183-disp-gamma
+      - items:
+          - enum:
+              - mediatek,mt8188-disp-gamma
+          - const: mediatek,mt8195-disp-gamma
+
+  reg:
+    maxItems: 1
+
+  interrupts:
+    maxItems: 1
+
+  power-domains:
+    description: A phandle and PM domain specifier as defined by bindings of
+      the power controller specified by phandle. See
+      Documentation/devicetree/bindings/power/power-domain.yaml for details.
+
+  clocks:
+    items:
+      - description: GAMMA Clock
+
+  mediatek,gce-client-reg:
+    description: The register of client driver can be configured by gce with
+      4 arguments defined in this property, such as phandle of gce, subsys id,
+      register offset and size. Each GCE subsys id is mapping to a client
+      defined in the header include/dt-bindings/gce/<chip>-gce.h.
+    $ref: /schemas/types.yaml#/definitions/phandle-array
+    maxItems: 1
+
+required:
+  - compatible
+  - reg
+  - interrupts
+  - power-domains
+  - clocks
+
+additionalProperties: false
+
+examples:
+  - |
+    #include <dt-bindings/interrupt-controller/arm-gic.h>
+    #include <dt-bindings/clock/mt8173-clk.h>
+    #include <dt-bindings/power/mt8173-power.h>
+    #include <dt-bindings/gce/mt8173-gce.h>
+
+    soc {
+        #address-cells = <2>;
+        #size-cells = <2>;
+
+        gamma at 14016000 {
+            compatible = "mediatek,mt8173-disp-gamma";
+            reg = <0 0x14016000 0 0x1000>;
+            interrupts = <GIC_SPI 190 IRQ_TYPE_LEVEL_LOW>;
+            power-domains = <&scpsys MT8173_POWER_DOMAIN_MM>;
+            clocks = <&mmsys CLK_MM_DISP_GAMMA>;
+            mediatek,gce-client-reg = <&gce SUBSYS_1401XXXX 0x6000 0x1000>;
+        };
+    };
diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,merge.yaml b/Documentation/devicetree/bindings/display/mediatek/mediatek,merge.yaml
index dae839279950..0de9f64f3f84 100644
--- a/Documentation/devicetree/bindings/display/mediatek/mediatek,merge.yaml
+++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,merge.yaml
@@ -77,6 +77,29 @@ properties:
     $ref: /schemas/types.yaml#/definitions/phandle-array
     maxItems: 1
 
+  ports:
+    $ref: /schemas/graph.yaml#/properties/ports
+    description:
+      Input and output ports can have multiple endpoints, each of those
+      connects to either the primary, secondary, etc, display pipeline.
+
+    properties:
+      port at 0:
+        $ref: /schemas/graph.yaml#/properties/port
+        description:
+          MERGE input port, usually from DITHER, DPI, DSC, DSI, MDP_RDMA,
+          ETHDR or even from a different MERGE block
+
+      port at 1:
+        $ref: /schemas/graph.yaml#/properties/port
+        description:
+          MERGE output to a DSC, DPI, DP_INTF, DSI, ETHDR, Write DMA, or
+          a different MERGE block, or others.
+
+    required:
+      - port at 0
+      - port at 1
+
   resets:
     description: reset controller
       See Documentation/devicetree/bindings/reset/reset.txt for details.
diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,merge.yaml.orig b/Documentation/devicetree/bindings/display/mediatek/mediatek,merge.yaml.orig
new file mode 100644
index 000000000000..d5cd69b7f501
--- /dev/null
+++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,merge.yaml.orig
@@ -0,0 +1,110 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/display/mediatek/mediatek,merge.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Mediatek display merge
+
+maintainers:
+  - Chun-Kuang Hu <chunkuang.hu at kernel.org>
+  - Philipp Zabel <p.zabel at pengutronix.de>
+
+description: |
+  Mediatek display merge, namely MERGE, is used to merge two slice-per-line
+  inputs into one side-by-side output.
+  MERGE device node must be siblings to the central MMSYS_CONFIG node.
+  For a description of the MMSYS_CONFIG binding, see
+  Documentation/devicetree/bindings/arm/mediatek/mediatek,mmsys.yaml
+  for details.
+
+properties:
+  compatible:
+    oneOf:
+      - items:
+          - const: mediatek,mt8173-disp-merge
+      - items:
+          - const: mediatek,mt8195-disp-merge
+
+  reg:
+    maxItems: 1
+
+  interrupts:
+    maxItems: 1
+
+  power-domains:
+    description: A phandle and PM domain specifier as defined by bindings of
+      the power controller specified by phandle. See
+      Documentation/devicetree/bindings/power/power-domain.yaml for details.
+
+  clocks:
+    maxItems: 2
+    items:
+      - description: MERGE Clock
+      - description: MERGE Async Clock
+          Controlling the synchronous process between MERGE and other display
+          function blocks cross clock domain.
+
+  clock-names:
+    maxItems: 2
+    items:
+      - const: merge
+      - const: merge_async
+
+  mediatek,merge-fifo-en:
+    description:
+      The setting of merge fifo is mainly provided for the display latency
+      buffer to ensure that the back-end panel display data will not be
+      underrun, a little more data is needed in the fifo.
+      According to the merge fifo settings, when the water level is detected
+      to be insufficient, it will trigger RDMA sending ultra and preulra
+      command to SMI to speed up the data rate.
+    type: boolean
+
+  mediatek,merge-mute:
+    description: Support mute function. Mute the content of merge output.
+    type: boolean
+
+  mediatek,gce-client-reg:
+    description: The register of client driver can be configured by gce with
+      4 arguments defined in this property, such as phandle of gce, subsys id,
+      register offset and size. Each GCE subsys id is mapping to a client
+      defined in the header include/dt-bindings/gce/<chip>-gce.h.
+    $ref: /schemas/types.yaml#/definitions/phandle-array
+    maxItems: 1
+
+  resets:
+    description: reset controller
+      See Documentation/devicetree/bindings/reset/reset.txt for details.
+    maxItems: 1
+
+required:
+  - compatible
+  - reg
+  - power-domains
+  - clocks
+
+additionalProperties: false
+
+examples:
+  - |
+
+    merge at 14017000 {
+        compatible = "mediatek,mt8173-disp-merge";
+        reg = <0 0x14017000 0 0x1000>;
+        power-domains = <&spm MT8173_POWER_DOMAIN_MM>;
+        clocks = <&mmsys CLK_MM_DISP_MERGE>;
+    };
+
+    merge5: disp_vpp_merge5 at 1c110000 {
+        compatible = "mediatek,mt8195-disp-merge";
+        reg = <0 0x1c110000 0 0x1000>;
+        interrupts = <GIC_SPI 507 IRQ_TYPE_LEVEL_HIGH 0>;
+        clocks = <&vdosys1 CLK_VDO1_VPP_MERGE4>,
+                 <&vdosys1 CLK_VDO1_MERGE4_DL_ASYNC>;
+        clock-names = "merge","merge_async";
+        power-domains = <&spm MT8195_POWER_DOMAIN_VDOSYS1>;
+        mediatek,gce-client-reg = <&gce1 SUBSYS_1c11XXXX 0x0000 0x1000>;
+        mediatek,merge-fifo-en = <1>;
+        resets = <&vdosys1 MT8195_VDOSYS1_SW0_RST_B_MERGE4_DL_ASYNC>;
+    };
diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,od.yaml b/Documentation/devicetree/bindings/display/mediatek/mediatek,od.yaml
index 831c653caffd..71534febd49c 100644
--- a/Documentation/devicetree/bindings/display/mediatek/mediatek,od.yaml
+++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,od.yaml
@@ -38,6 +38,28 @@ properties:
     items:
       - description: OD Clock
 
+  ports:
+    $ref: /schemas/graph.yaml#/properties/ports
+    description:
+      Input and output ports can have multiple endpoints, each of those
+      connects to either the primary, secondary, etc, display pipeline.
+
+    properties:
+      port at 0:
+        $ref: /schemas/graph.yaml#/properties/port
+        description: OD input port, usually from an AAL block
+
+      port at 1:
+        $ref: /schemas/graph.yaml#/properties/port
+        description:
+          OD output to the input of the next desired component in the
+          display pipeline, for example one of the available RDMA or
+          other blocks.
+
+    required:
+      - port at 0
+      - port at 1
+
 required:
   - compatible
   - reg
diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,ovl-2l.yaml b/Documentation/devicetree/bindings/display/mediatek/mediatek,ovl-2l.yaml
index c7dd0ef02dcf..bacdfe7d08a6 100644
--- a/Documentation/devicetree/bindings/display/mediatek/mediatek,ovl-2l.yaml
+++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,ovl-2l.yaml
@@ -57,6 +57,28 @@ properties:
     $ref: /schemas/types.yaml#/definitions/phandle-array
     maxItems: 1
 
+  ports:
+    $ref: /schemas/graph.yaml#/properties/ports
+    description:
+      Input and output ports can have multiple endpoints, each of those
+      connects to either the primary, secondary, etc, display pipeline.
+
+    properties:
+      port at 0:
+        $ref: /schemas/graph.yaml#/properties/port
+        description: OVL input port from MMSYS, VDOSYS or other OVLs
+
+      port at 1:
+        $ref: /schemas/graph.yaml#/properties/port
+        description:
+          OVL output to the input of the next desired component in the
+          display pipeline, for example one of the available COLOR, RDMA
+          or WDMA blocks.
+
+    required:
+      - port at 0
+      - port at 1
+
 required:
   - compatible
   - reg
diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,ovl-2l.yaml.orig b/Documentation/devicetree/bindings/display/mediatek/mediatek,ovl-2l.yaml.orig
new file mode 100644
index 000000000000..e3cef99d0f98
--- /dev/null
+++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,ovl-2l.yaml.orig
@@ -0,0 +1,78 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/display/mediatek/mediatek,ovl-2l.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Mediatek display overlay 2 layer
+
+maintainers:
+  - Chun-Kuang Hu <chunkuang.hu at kernel.org>
+  - Philipp Zabel <p.zabel at pengutronix.de>
+
+description: |
+  Mediatek display overlay 2 layer, namely OVL-2L, provides 2 more layer
+  for OVL.
+  OVL-2L device node must be siblings to the central MMSYS_CONFIG node.
+  For a description of the MMSYS_CONFIG binding, see
+  Documentation/devicetree/bindings/arm/mediatek/mediatek,mmsys.yaml
+  for details.
+
+properties:
+  compatible:
+    oneOf:
+      - items:
+          - const: mediatek,mt8183-disp-ovl-2l
+      - items:
+          - const: mediatek,mt8192-disp-ovl-2l
+
+  reg:
+    maxItems: 1
+
+  interrupts:
+    maxItems: 1
+
+  power-domains:
+    description: A phandle and PM domain specifier as defined by bindings of
+      the power controller specified by phandle. See
+      Documentation/devicetree/bindings/power/power-domain.yaml for details.
+
+  clocks:
+    items:
+      - description: OVL-2L Clock
+
+  iommus:
+    description:
+      This property should point to the respective IOMMU block with master port as argument,
+      see Documentation/devicetree/bindings/iommu/mediatek,iommu.yaml for details.
+
+  mediatek,gce-client-reg:
+    description: The register of client driver can be configured by gce with
+      4 arguments defined in this property, such as phandle of gce, subsys id,
+      register offset and size. Each GCE subsys id is mapping to a client
+      defined in the header include/dt-bindings/gce/<chip>-gce.h.
+    $ref: /schemas/types.yaml#/definitions/phandle-array
+    maxItems: 1
+
+required:
+  - compatible
+  - reg
+  - interrupts
+  - power-domains
+  - clocks
+  - iommus
+
+additionalProperties: false
+
+examples:
+  - |
+
+    ovl_2l0: ovl at 14009000 {
+        compatible = "mediatek,mt8183-disp-ovl-2l";
+        reg = <0 0x14009000 0 0x1000>;
+        interrupts = <GIC_SPI 226 IRQ_TYPE_LEVEL_LOW>;
+        power-domains = <&spm MT8183_POWER_DOMAIN_DISP>;
+        clocks = <&mmsys CLK_MM_DISP_OVL0_2L>;
+        iommus = <&iommu M4U_PORT_DISP_2L_OVL0_LARB0>;
+        mediatek,gce-client-reg = <&gce SUBSYS_1400XXXX 0x9000 0x1000>;
+    };
diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,ovl.yaml b/Documentation/devicetree/bindings/display/mediatek/mediatek,ovl.yaml
index d55611c7ce5e..9ea796a033b2 100644
--- a/Documentation/devicetree/bindings/display/mediatek/mediatek,ovl.yaml
+++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,ovl.yaml
@@ -75,6 +75,28 @@ properties:
     $ref: /schemas/types.yaml#/definitions/phandle-array
     maxItems: 1
 
+  ports:
+    $ref: /schemas/graph.yaml#/properties/ports
+    description:
+      Input and output ports can have multiple endpoints, each of those
+      connects to either the primary, secondary, etc, display pipeline.
+
+    properties:
+      port at 0:
+        $ref: /schemas/graph.yaml#/properties/port
+        description: OVL input port from MMSYS or one of multiple VDOSYS
+
+      port at 1:
+        $ref: /schemas/graph.yaml#/properties/port
+        description:
+          OVL output to the input of the next desired component in the
+          display pipeline, for example one of the available COLOR, RDMA
+          or WDMA blocks.
+
+    required:
+      - port at 0
+      - port at 1
+
 required:
   - compatible
   - reg
diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,ovl.yaml.orig b/Documentation/devicetree/bindings/display/mediatek/mediatek,ovl.yaml.orig
new file mode 100644
index 000000000000..d55611c7ce5e
--- /dev/null
+++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,ovl.yaml.orig
@@ -0,0 +1,109 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/display/mediatek/mediatek,ovl.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Mediatek display overlay
+
+maintainers:
+  - Chun-Kuang Hu <chunkuang.hu at kernel.org>
+  - Philipp Zabel <p.zabel at pengutronix.de>
+
+description: |
+  Mediatek display overlay, namely OVL, can do alpha blending from
+  the memory.
+  OVL device node must be siblings to the central MMSYS_CONFIG node.
+  For a description of the MMSYS_CONFIG binding, see
+  Documentation/devicetree/bindings/arm/mediatek/mediatek,mmsys.yaml
+  for details.
+
+properties:
+  compatible:
+    oneOf:
+      - enum:
+          - mediatek,mt2701-disp-ovl
+          - mediatek,mt8173-disp-ovl
+          - mediatek,mt8183-disp-ovl
+          - mediatek,mt8192-disp-ovl
+          - mediatek,mt8195-mdp3-ovl
+      - items:
+          - enum:
+              - mediatek,mt7623-disp-ovl
+              - mediatek,mt2712-disp-ovl
+          - const: mediatek,mt2701-disp-ovl
+      - items:
+          - enum:
+              - mediatek,mt6795-disp-ovl
+          - const: mediatek,mt8173-disp-ovl
+      - items:
+          - enum:
+              - mediatek,mt8188-disp-ovl
+              - mediatek,mt8195-disp-ovl
+          - const: mediatek,mt8183-disp-ovl
+      - items:
+          - enum:
+              - mediatek,mt8186-disp-ovl
+              - mediatek,mt8365-disp-ovl
+          - const: mediatek,mt8192-disp-ovl
+
+  reg:
+    maxItems: 1
+
+  interrupts:
+    maxItems: 1
+
+  power-domains:
+    description: A phandle and PM domain specifier as defined by bindings of
+      the power controller specified by phandle. See
+      Documentation/devicetree/bindings/power/power-domain.yaml for details.
+
+  clocks:
+    items:
+      - description: OVL Clock
+
+  iommus:
+    description:
+      This property should point to the respective IOMMU block with master port as argument,
+      see Documentation/devicetree/bindings/iommu/mediatek,iommu.yaml for details.
+
+  mediatek,gce-client-reg:
+    description: The register of client driver can be configured by gce with
+      4 arguments defined in this property, such as phandle of gce, subsys id,
+      register offset and size. Each GCE subsys id is mapping to a client
+      defined in the header include/dt-bindings/gce/<chip>-gce.h.
+    $ref: /schemas/types.yaml#/definitions/phandle-array
+    maxItems: 1
+
+required:
+  - compatible
+  - reg
+  - interrupts
+  - power-domains
+  - clocks
+  - iommus
+
+additionalProperties: false
+
+examples:
+  - |
+    #include <dt-bindings/interrupt-controller/arm-gic.h>
+    #include <dt-bindings/clock/mt8173-clk.h>
+    #include <dt-bindings/power/mt8173-power.h>
+    #include <dt-bindings/gce/mt8173-gce.h>
+    #include <dt-bindings/memory/mt8173-larb-port.h>
+
+    soc {
+        #address-cells = <2>;
+        #size-cells = <2>;
+
+        ovl0: ovl at 1400c000 {
+            compatible = "mediatek,mt8173-disp-ovl";
+            reg = <0 0x1400c000 0 0x1000>;
+            interrupts = <GIC_SPI 180 IRQ_TYPE_LEVEL_LOW>;
+            power-domains = <&scpsys MT8173_POWER_DOMAIN_MM>;
+            clocks = <&mmsys CLK_MM_DISP_OVL0>;
+            iommus = <&iommu M4U_PORT_DISP_OVL0>;
+            mediatek,gce-client-reg = <&gce SUBSYS_1400XXXX 0xc000 0x1000>;
+        };
+    };
diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,postmask.yaml b/Documentation/devicetree/bindings/display/mediatek/mediatek,postmask.yaml
index 11fe32e50a59..fb6fe4742624 100644
--- a/Documentation/devicetree/bindings/display/mediatek/mediatek,postmask.yaml
+++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,postmask.yaml
@@ -52,6 +52,27 @@ properties:
     $ref: /schemas/types.yaml#/definitions/phandle-array
     maxItems: 1
 
+  ports:
+    $ref: /schemas/graph.yaml#/properties/ports
+    description:
+      Input and output ports can have multiple endpoints, each of those
+      connects to either the primary, secondary, etc, display pipeline.
+
+    properties:
+      port at 0:
+        $ref: /schemas/graph.yaml#/properties/port
+        description: POSTMASK input port, usually from GAMMA
+
+      port at 1:
+        $ref: /schemas/graph.yaml#/properties/port
+        description:
+          POSTMASK output to the input of the next desired component in the
+          display pipeline, for example one of the available DITHER blocks.
+
+    required:
+      - port at 0
+      - port at 1
+
 required:
   - compatible
   - reg
diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,rdma.yaml b/Documentation/devicetree/bindings/display/mediatek/mediatek,rdma.yaml
index 4cadb245d028..878f676b581f 100644
--- a/Documentation/devicetree/bindings/display/mediatek/mediatek,rdma.yaml
+++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,rdma.yaml
@@ -87,6 +87,28 @@ properties:
     $ref: /schemas/types.yaml#/definitions/phandle-array
     maxItems: 1
 
+  ports:
+    $ref: /schemas/graph.yaml#/properties/ports
+    description:
+      Input and output ports can have multiple endpoints, each of those
+      connects to either the primary, secondary, etc, display pipeline.
+
+    properties:
+      port at 0:
+        $ref: /schemas/graph.yaml#/properties/port
+        description: RDMA input port, usually from MMSYS, OD or OVL
+
+      port at 1:
+        $ref: /schemas/graph.yaml#/properties/port
+        description:
+          RDMA output to the input of the next desired component in the
+          display pipeline, for example one of the available COLOR, DPI,
+          DSI, MERGE or UFOE blocks.
+
+    required:
+      - port at 0
+      - port at 1
+
 required:
   - compatible
   - reg
diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,rdma.yaml.orig b/Documentation/devicetree/bindings/display/mediatek/mediatek,rdma.yaml.orig
new file mode 100644
index 000000000000..4cadb245d028
--- /dev/null
+++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,rdma.yaml.orig
@@ -0,0 +1,122 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/display/mediatek/mediatek,rdma.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Mediatek Read Direct Memory Access
+
+maintainers:
+  - Chun-Kuang Hu <chunkuang.hu at kernel.org>
+  - Philipp Zabel <p.zabel at pengutronix.de>
+
+description: |
+  Mediatek Read Direct Memory Access(RDMA) component used to read the
+  data into DMA. It provides real time data to the back-end panel
+  driver, such as DSI, DPI and DP_INTF.
+  It contains one line buffer to store the sufficient pixel data.
+  RDMA device node must be siblings to the central MMSYS_CONFIG node.
+  For a description of the MMSYS_CONFIG binding, see
+  Documentation/devicetree/bindings/arm/mediatek/mediatek,mmsys.yaml
+  for details.
+
+properties:
+  compatible:
+    oneOf:
+      - enum:
+          - mediatek,mt2701-disp-rdma
+          - mediatek,mt8173-disp-rdma
+          - mediatek,mt8183-disp-rdma
+          - mediatek,mt8195-disp-rdma
+      - items:
+          - enum:
+              - mediatek,mt8188-disp-rdma
+          - const: mediatek,mt8195-disp-rdma
+      - items:
+          - enum:
+              - mediatek,mt7623-disp-rdma
+              - mediatek,mt2712-disp-rdma
+          - const: mediatek,mt2701-disp-rdma
+      - items:
+          - enum:
+              - mediatek,mt6795-disp-rdma
+          - const: mediatek,mt8173-disp-rdma
+      - items:
+          - enum:
+              - mediatek,mt8186-disp-rdma
+              - mediatek,mt8192-disp-rdma
+              - mediatek,mt8365-disp-rdma
+          - const: mediatek,mt8183-disp-rdma
+
+  reg:
+    maxItems: 1
+
+  interrupts:
+    maxItems: 1
+
+  power-domains:
+    description: A phandle and PM domain specifier as defined by bindings of
+      the power controller specified by phandle. See
+      Documentation/devicetree/bindings/power/power-domain.yaml for details.
+
+  clocks:
+    items:
+      - description: RDMA Clock
+
+  iommus:
+    description:
+      This property should point to the respective IOMMU block with master port as argument,
+      see Documentation/devicetree/bindings/iommu/mediatek,iommu.yaml for details.
+
+  mediatek,rdma-fifo-size:
+    description:
+      rdma fifo size may be different even in same SOC, add this property to the
+      corresponding rdma.
+      The value below is the Max value which defined in hardware data sheet
+      mediatek,rdma-fifo-size of mt8173-rdma0 is 8K
+      mediatek,rdma-fifo-size of mt8183-rdma0 is 5K
+      mediatek,rdma-fifo-size of mt8183-rdma1 is 2K
+    $ref: /schemas/types.yaml#/definitions/uint32
+    enum: [8192, 5120, 2048]
+
+  mediatek,gce-client-reg:
+    description: The register of client driver can be configured by gce with
+      4 arguments defined in this property, such as phandle of gce, subsys id,
+      register offset and size. Each GCE subsys id is mapping to a client
+      defined in the header include/dt-bindings/gce/<chip>-gce.h.
+    $ref: /schemas/types.yaml#/definitions/phandle-array
+    maxItems: 1
+
+required:
+  - compatible
+  - reg
+  - interrupts
+  - power-domains
+  - clocks
+  - iommus
+
+additionalProperties: false
+
+examples:
+  - |
+    #include <dt-bindings/interrupt-controller/arm-gic.h>
+    #include <dt-bindings/clock/mt8173-clk.h>
+    #include <dt-bindings/power/mt8173-power.h>
+    #include <dt-bindings/gce/mt8173-gce.h>
+    #include <dt-bindings/memory/mt8173-larb-port.h>
+
+    soc {
+        #address-cells = <2>;
+        #size-cells = <2>;
+
+        rdma0: rdma at 1400e000 {
+            compatible = "mediatek,mt8173-disp-rdma";
+            reg = <0 0x1400e000 0 0x1000>;
+            interrupts = <GIC_SPI 182 IRQ_TYPE_LEVEL_LOW>;
+            power-domains = <&scpsys MT8173_POWER_DOMAIN_MM>;
+            clocks = <&mmsys CLK_MM_DISP_RDMA0>;
+            iommus = <&iommu M4U_PORT_DISP_RDMA0>;
+            mediatek,rdma-fifo-size = <8192>;
+            mediatek,gce-client-reg = <&gce SUBSYS_1400XXXX 0xe000 0x1000>;
+        };
+    };
diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,ufoe.yaml b/Documentation/devicetree/bindings/display/mediatek/mediatek,ufoe.yaml
index 39e3e2d4a0db..61a5e22effbf 100644
--- a/Documentation/devicetree/bindings/display/mediatek/mediatek,ufoe.yaml
+++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,ufoe.yaml
@@ -43,6 +43,27 @@ properties:
     items:
       - description: UFOe Clock
 
+  ports:
+    $ref: /schemas/graph.yaml#/properties/ports
+    description:
+      Input and output ports can have multiple endpoints, each of those
+      connects to either the primary, secondary, etc, display pipeline.
+
+    properties:
+      port at 0:
+        $ref: /schemas/graph.yaml#/properties/port
+        description: UFOE input, usually from one of the RDMA blocks.
+
+      port at 1:
+        $ref: /schemas/graph.yaml#/properties/port
+        description:
+          UFOE output to the input of the next desired component in the
+          display pipeline, usually one of the available DSI blocks.
+
+    required:
+      - port at 0
+      - port at 1
+
 required:
   - compatible
   - reg
diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,wdma.yaml.orig b/Documentation/devicetree/bindings/display/mediatek/mediatek,wdma.yaml.orig
new file mode 100644
index 000000000000..f9f00a518edf
--- /dev/null
+++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,wdma.yaml.orig
@@ -0,0 +1,76 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/display/mediatek/mediatek,wdma.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Mediatek Write Direct Memory Access
+
+maintainers:
+  - Chun-Kuang Hu <chunkuang.hu at kernel.org>
+  - Philipp Zabel <p.zabel at pengutronix.de>
+
+description: |
+  Mediatek Write Direct Memory Access(WDMA) component used to write
+  the data into DMA.
+  WDMA device node must be siblings to the central MMSYS_CONFIG node.
+  For a description of the MMSYS_CONFIG binding, see
+  Documentation/devicetree/bindings/arm/mediatek/mediatek,mmsys.yaml
+  for details.
+
+properties:
+  compatible:
+    oneOf:
+      - items:
+          - const: mediatek,mt8173-disp-wdma
+
+  reg:
+    maxItems: 1
+
+  interrupts:
+    maxItems: 1
+
+  power-domains:
+    description: A phandle and PM domain specifier as defined by bindings of
+      the power controller specified by phandle. See
+      Documentation/devicetree/bindings/power/power-domain.yaml for details.
+
+  clocks:
+    items:
+      - description: WDMA Clock
+
+  iommus:
+    description:
+      This property should point to the respective IOMMU block with master port as argument,
+      see Documentation/devicetree/bindings/iommu/mediatek,iommu.yaml for details.
+
+  mediatek,gce-client-reg:
+    description: The register of client driver can be configured by gce with
+      4 arguments defined in this property, such as phandle of gce, subsys id,
+      register offset and size. Each GCE subsys id is mapping to a client
+      defined in the header include/dt-bindings/gce/<chip>-gce.h.
+    $ref: /schemas/types.yaml#/definitions/phandle-array
+    maxItems: 1
+
+required:
+  - compatible
+  - reg
+  - interrupts
+  - power-domains
+  - clocks
+  - iommus
+
+additionalProperties: false
+
+examples:
+  - |
+
+    wdma0: wdma at 14011000 {
+        compatible = "mediatek,mt8173-disp-wdma";
+        reg = <0 0x14011000 0 0x1000>;
+        interrupts = <GIC_SPI 185 IRQ_TYPE_LEVEL_LOW>;
+        power-domains = <&scpsys MT8173_POWER_DOMAIN_MM>;
+        clocks = <&mmsys CLK_MM_DISP_WDMA0>;
+        iommus = <&iommu M4U_PORT_DISP_WDMA0>;
+        mediatek,gce-client-reg = <&gce SUBSYS_1401XXXX 0x1000 0x1000>;
+    };
diff --git a/Documentation/devicetree/bindings/gpu/arm,mali-bifrost.yaml.orig b/Documentation/devicetree/bindings/gpu/arm,mali-bifrost.yaml.orig
new file mode 100644
index 000000000000..bf0f7f1f71e0
--- /dev/null
+++ b/Documentation/devicetree/bindings/gpu/arm,mali-bifrost.yaml.orig
@@ -0,0 +1,250 @@
+# SPDX-License-Identifier: GPL-2.0-only
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/gpu/arm,mali-bifrost.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: ARM Mali Bifrost GPU
+
+maintainers:
+  - Rob Herring <robh at kernel.org>
+
+properties:
+  $nodename:
+    pattern: '^gpu@[a-f0-9]+$'
+
+  compatible:
+    oneOf:
+      - items:
+          - enum:
+              - amlogic,meson-g12a-mali
+              - mediatek,mt8183-mali
+              - realtek,rtd1619-mali
+              - renesas,r9a07g044-mali
+              - renesas,r9a07g054-mali
+              - rockchip,px30-mali
+              - rockchip,rk3568-mali
+          - const: arm,mali-bifrost # Mali Bifrost GPU model/revision is fully discoverable
+      - items:
+          - enum:
+              - mediatek,mt8192-mali
+          - const: arm,mali-valhall-jm # Mali Valhall GPU model/revision is fully discoverable
+
+  reg:
+    maxItems: 1
+
+  interrupts:
+    minItems: 3
+    items:
+      - description: Job interrupt
+      - description: MMU interrupt
+      - description: GPU interrupt
+      - description: Event interrupt
+
+  interrupt-names:
+    minItems: 3
+    items:
+      - const: job
+      - const: mmu
+      - const: gpu
+      - const: event
+
+  clocks:
+    minItems: 1
+    maxItems: 3
+
+  clock-names: true
+
+  mali-supply: true
+
+  sram-supply: true
+
+  operating-points-v2: true
+
+  power-domains:
+    minItems: 1
+    maxItems: 5
+
+  power-domain-names:
+    minItems: 1
+    maxItems: 5
+
+  resets:
+    minItems: 1
+    maxItems: 3
+
+  reset-names: true
+
+  "#cooling-cells":
+    const: 2
+
+  dynamic-power-coefficient:
+    $ref: '/schemas/types.yaml#/definitions/uint32'
+    description:
+      A u32 value that represents the running time dynamic
+      power coefficient in units of uW/MHz/V^2. The
+      coefficient can either be calculated from power
+      measurements or derived by analysis.
+
+      The dynamic power consumption of the GPU is
+      proportional to the square of the Voltage (V) and
+      the clock frequency (f). The coefficient is used to
+      calculate the dynamic power as below -
+
+      Pdyn = dynamic-power-coefficient * V^2 * f
+
+      where voltage is in V, frequency is in MHz.
+
+  dma-coherent: true
+
+required:
+  - compatible
+  - reg
+  - interrupts
+  - interrupt-names
+  - clocks
+
+additionalProperties: false
+
+allOf:
+  - if:
+      properties:
+        compatible:
+          contains:
+            const: amlogic,meson-g12a-mali
+    then:
+      properties:
+        power-domains:
+          maxItems: 1
+        power-domain-names: false
+      required:
+        - resets
+  - if:
+      properties:
+        compatible:
+          contains:
+            enum:
+              - renesas,r9a07g044-mali
+              - renesas,r9a07g054-mali
+    then:
+      properties:
+        interrupts:
+          minItems: 4
+        interrupt-names:
+          minItems: 4
+        clocks:
+          minItems: 3
+        clock-names:
+          items:
+            - const: gpu
+            - const: bus
+            - const: bus_ace
+        power-domains:
+          maxItems: 1
+        power-domain-names: false
+        resets:
+          minItems: 3
+        reset-names:
+          items:
+            - const: rst
+            - const: axi_rst
+            - const: ace_rst
+      required:
+        - clock-names
+        - power-domains
+        - resets
+        - reset-names
+  - if:
+      properties:
+        compatible:
+          contains:
+            const: mediatek,mt8183-mali
+    then:
+      properties:
+        power-domains:
+          minItems: 3
+          maxItems: 3
+        power-domain-names:
+          items:
+            - const: core0
+            - const: core1
+            - const: core2
+
+      required:
+        - sram-supply
+        - power-domains
+        - power-domain-names
+    else:
+      properties:
+        sram-supply: false
+  - if:
+      properties:
+        compatible:
+          contains:
+            const: rockchip,rk3568-mali
+    then:
+      properties:
+        clocks:
+          minItems: 2
+        clock-names:
+          items:
+            - const: gpu
+            - const: bus
+        power-domains:
+          maxItems: 1
+        power-domain-names: false
+      required:
+        - clock-names
+
+examples:
+  - |
+    #include <dt-bindings/interrupt-controller/irq.h>
+    #include <dt-bindings/interrupt-controller/arm-gic.h>
+
+    gpu at ffe40000 {
+      compatible = "amlogic,meson-g12a-mali", "arm,mali-bifrost";
+      reg = <0xffe40000 0x10000>;
+      interrupts = <GIC_SPI 160 IRQ_TYPE_LEVEL_HIGH>,
+             <GIC_SPI 161 IRQ_TYPE_LEVEL_HIGH>,
+             <GIC_SPI 162 IRQ_TYPE_LEVEL_HIGH>;
+      interrupt-names = "job", "mmu", "gpu";
+      clocks = <&clk 1>;
+      mali-supply = <&vdd_gpu>;
+      operating-points-v2 = <&gpu_opp_table>;
+      resets = <&reset 0>, <&reset 1>;
+    };
+
+    gpu_opp_table: opp-table {
+      compatible = "operating-points-v2";
+
+      opp-533000000 {
+        opp-hz = /bits/ 64 <533000000>;
+        opp-microvolt = <1250000>;
+      };
+      opp-450000000 {
+        opp-hz = /bits/ 64 <450000000>;
+        opp-microvolt = <1150000>;
+      };
+      opp-400000000 {
+        opp-hz = /bits/ 64 <400000000>;
+        opp-microvolt = <1125000>;
+      };
+      opp-350000000 {
+        opp-hz = /bits/ 64 <350000000>;
+        opp-microvolt = <1075000>;
+      };
+      opp-266000000 {
+        opp-hz = /bits/ 64 <266000000>;
+        opp-microvolt = <1025000>;
+      };
+      opp-160000000 {
+        opp-hz = /bits/ 64 <160000000>;
+        opp-microvolt = <925000>;
+      };
+      opp-100000000 {
+        opp-hz = /bits/ 64 <100000000>;
+        opp-microvolt = <912500>;
+      };
+    };
+
+...
diff --git a/Documentation/devicetree/bindings/leds/leds-mt6323.txt.orig b/Documentation/devicetree/bindings/leds/leds-mt6323.txt.orig
new file mode 100644
index 000000000000..73353692efa1
--- /dev/null
+++ b/Documentation/devicetree/bindings/leds/leds-mt6323.txt.orig
@@ -0,0 +1,60 @@
+Device Tree Bindings for LED support on MT6323 PMIC
+
+MT6323 LED controller is subfunction provided by MT6323 PMIC, so the LED
+controllers are defined as the subnode of the function node provided by MT6323
+PMIC controller that is being defined as one kind of Muti-Function Device (MFD)
+using shared bus called PMIC wrapper for each subfunction to access remote
+MT6323 PMIC hardware.
+
+For MT6323 MFD bindings see:
+Documentation/devicetree/bindings/mfd/mt6397.txt
+For MediaTek PMIC wrapper bindings see:
+Documentation/devicetree/bindings/soc/mediatek/mediatek,pwrap.yaml
+
+Required properties:
+- compatible : Must be "mediatek,mt6323-led"
+- address-cells : Must be 1
+- size-cells : Must be 0
+
+Each led is represented as a child node of the mediatek,mt6323-led that
+describes the initial behavior for each LED physically and currently only four
+LED child nodes can be supported.
+
+Required properties for the LED child node:
+- reg : LED channel number (0..3)
+
+Optional properties for the LED child node:
+- label : See Documentation/devicetree/bindings/leds/common.txt
+- linux,default-trigger : See Documentation/devicetree/bindings/leds/common.txt
+- default-state: See Documentation/devicetree/bindings/leds/common.txt
+
+Example:
+
+	mt6323: pmic {
+		compatible = "mediatek,mt6323";
+
+		...
+
+		mt6323led: leds {
+			compatible = "mediatek,mt6323-led";
+			#address-cells = <1>;
+			#size-cells = <0>;
+
+			led at 0 {
+				reg = <0>;
+				label = "LED0";
+				linux,default-trigger = "timer";
+				default-state = "on";
+			};
+			led at 1 {
+				reg = <1>;
+				label = "LED1";
+				default-state = "off";
+			};
+			led at 2 {
+				reg = <2>;
+				label = "LED2";
+				default-state = "on";
+			};
+		};
+	};
diff --git a/Documentation/devicetree/bindings/ufs/mediatek,ufs.yaml.orig b/Documentation/devicetree/bindings/ufs/mediatek,ufs.yaml.orig
new file mode 100644
index 000000000000..5728e750761f
--- /dev/null
+++ b/Documentation/devicetree/bindings/ufs/mediatek,ufs.yaml.orig
@@ -0,0 +1,71 @@
+# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/ufs/mediatek,ufs.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Mediatek Universal Flash Storage (UFS) Controller
+
+maintainers:
+  - AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
+
+allOf:
+  - $ref: ufs-common.yaml
+
+properties:
+  compatible:
+    oneOf:
+      - const: mediatek,mt8183-ufshci
+      - items:
+          - enum:
+              - mediatek,mt8192-ufshci
+              - mediatek,mt8195-ufshci
+          - const: mediatek,mt8183-ufshci
+
+  clocks:
+    maxItems: 1
+
+  clock-names:
+    items:
+      - const: ufs
+
+  phys:
+    maxItems: 1
+
+  reg:
+    maxItems: 1
+
+  vcc-supply: true
+
+required:
+  - compatible
+  - clocks
+  - clock-names
+  - phys
+  - reg
+  - vcc-supply
+
+unevaluatedProperties: false
+
+examples:
+  - |
+    #include <dt-bindings/clock/mt8183-clk.h>
+    #include <dt-bindings/interrupt-controller/arm-gic.h>
+
+    soc {
+        #address-cells = <2>;
+        #size-cells = <2>;
+
+        ufs at ff3c0000 {
+            compatible = "mediatek,mt8183-ufshci";
+            reg = <0 0x11270000 0 0x2300>;
+            interrupts = <GIC_SPI 104 IRQ_TYPE_LEVEL_LOW>;
+            phys = <&ufsphy>;
+
+            clocks = <&infracfg_ao CLK_INFRA_UFS>;
+            clock-names = "ufs";
+            freq-table-hz = <0 0>;
+
+            vcc-supply = <&mt_pmic_vemc_ldo_reg>;
+        };
+    };
-- 
2.46.0



From angelogioacchino.delregno at collabora.com  Tue Sep 10 02:05:37 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Tue, 10 Sep 2024 09:05:37 +0000
Subject: [PATCH 0/2] PCI: mediatek-gen3: Support limiting link speed and
 width
In-Reply-To: <20240806094816.92137-1-angelogioacchino.delregno@collabora.com>
References: <20240806094816.92137-1-angelogioacchino.delregno@collabora.com>
Message-ID: <01020191db2e68dd-f46a7a3b-61d3-4f99-a449-5c9b86d667cb-000000@eu-west-1.amazonses.com>

Il 06/08/24 11:48, AngeloGioacchino Del Regno ha scritto:
> This series adds support for limiting the PCI-Express link speed
> (or PCIe gen restriction) and link width (number of lanes) in the
> pcie-mediatek-gen3 driver.
> 
> The maximum supported pcie gen is read from the controller itself,
> so defining a max gen through platform data for each SoC is avoided.
> 
> Both are done by adding support for the standard devicetree properties
> `max-link-speed` and `num-lanes`.
> 
> Please note that changing the bindings is not required, as those do
> already allow specifying those properties for this controller.
> 
> AngeloGioacchino Del Regno (2):
>    PCI: mediatek-gen3: Add support for setting max-link-speed limit
>    PCI: mediatek-gen3: Add support for restricting link width
> 
>   drivers/pci/controller/pcie-mediatek-gen3.c | 76 ++++++++++++++++++++-
>   1 file changed, 74 insertions(+), 2 deletions(-)
> 

Gentle ping for this series.

Thanks,
Angelo.


From angelogioacchino.delregno at collabora.com  Tue Sep 10 02:08:02 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Tue, 10 Sep 2024 09:08:02 +0000
Subject: [PATCH 4/4] media: platform: mtk-mdp3: Remove mask parameter from
 MM_REG_POLL macro
In-Reply-To: <20240823-mdp3-comp-cleanups-v1-4-1f8c1395ecd3@collabora.com>
References: <20240823-mdp3-comp-cleanups-v1-0-1f8c1395ecd3@collabora.com>
 <20240823-mdp3-comp-cleanups-v1-4-1f8c1395ecd3@collabora.com>
Message-ID: <01020191db309dcb-22192dd3-993f-45e4-9bf2-1997ba46acb5-000000@eu-west-1.amazonses.com>

Il 23/08/24 23:31, N?colas F. R. A. Prado ha scritto:
> Just like was done with MM_REG_WRITE, remove the mask from the
> MM_REG_POLL macro, leaving MM_REG_POLL_MASK to be used when a mask is
> required, and update the call sites accordingly. In this case, all calls
> require a mask, so MM_REG_POLL remains unused, but at least this makes
> the MM_REG_POLL macros consistent with the MM_REG_WRITE ones.
> 
> Signed-off-by: N?colas F. R. A. Prado <nfraprado at collabora.com>

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>




From angelogioacchino.delregno at collabora.com  Tue Sep 10 02:08:04 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Tue, 10 Sep 2024 09:08:04 +0000
Subject: [PATCH 2/4] media: platform: mtk-mdp3: Remove useless variadic
 arguments from macros
In-Reply-To: <20240823-mdp3-comp-cleanups-v1-2-1f8c1395ecd3@collabora.com>
References: <20240823-mdp3-comp-cleanups-v1-0-1f8c1395ecd3@collabora.com>
 <20240823-mdp3-comp-cleanups-v1-2-1f8c1395ecd3@collabora.com>
Message-ID: <01020191db30a663-da080c6b-23b4-4a2b-9e3b-b32c2f1318df-000000@eu-west-1.amazonses.com>

Il 23/08/24 23:31, N?colas F. R. A. Prado ha scritto:
> A few macros declare variadic arguments even though the underlying
> functions don't support them. Remove them.
> 
> Signed-off-by: N?colas F. R. A. Prado <nfraprado at collabora.com>

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>


From angelogioacchino.delregno at collabora.com  Tue Sep 10 02:08:05 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Tue, 10 Sep 2024 09:08:05 +0000
Subject: [PATCH 3/4] media: platform: mtk-mdp3: Remove mask parameter from
 MM_REG_WRITE macro
In-Reply-To: <20240823-mdp3-comp-cleanups-v1-3-1f8c1395ecd3@collabora.com>
References: <20240823-mdp3-comp-cleanups-v1-0-1f8c1395ecd3@collabora.com>
 <20240823-mdp3-comp-cleanups-v1-3-1f8c1395ecd3@collabora.com>
Message-ID: <01020191db30ab48-f8d1ad5b-7468-4675-a11d-46b1df659e32-000000@eu-west-1.amazonses.com>

Il 23/08/24 23:31, N?colas F. R. A. Prado ha scritto:
> There are two macros to issue a cmdq write: MM_REG_WRITE_MASK and
> MM_REG_WRITE, but confusingly, both of them take a mask parameter. The
> difference is that MM_REG_WRITE additionally checks whether the mask
> passed in contains the register mask, in which case, the 0xffffffff mask
> is passed to cmdq_pkt_write_mask(), effectively disregarding the mask
> and calling cmdq_pkt_write() as an optimization.
> 
> Move that optimization to the MM_REG_WRITE_MASK macro and make
> MM_REG_WRITE the variant that doesn't take a mask, directly calling to
> cmdq_pkt_write().
> 
> Change the call sites to MM_REG_WRITE whenever a mask wasn't necessary
> (ie 0xffffffff or a <register>_MASK was passed as mask) and in other
> cases to MM_REG_WRITE_MASK.
> 
> Signed-off-by: N?colas F. R. A. Prado <nfraprado at collabora.com>

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>




From angelogioacchino.delregno at collabora.com  Tue Sep 10 02:08:07 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Tue, 10 Sep 2024 09:08:07 +0000
Subject: [PATCH 1/4] media: platform: mtk-mdp3: Use cmdq_pkt_write when no
 mask is needed
In-Reply-To: <20240823-mdp3-comp-cleanups-v1-1-1f8c1395ecd3@collabora.com>
References: <20240823-mdp3-comp-cleanups-v1-0-1f8c1395ecd3@collabora.com>
 <20240823-mdp3-comp-cleanups-v1-1-1f8c1395ecd3@collabora.com>
Message-ID: <01020191db30b13f-7c843665-0c84-40d2-ac68-6f21dac57bbd-000000@eu-west-1.amazonses.com>

Il 23/08/24 23:31, N?colas F. R. A. Prado ha scritto:
> cmdq_pkt_write_mask() boils down to a cmdq_pkt_write() when the mask is
> 0xFFFFFFFF. Call cmdq_pkt_write() directly in those cases to simplify
> the code.
> 
> Suggested-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
> Signed-off-by: N?colas F. R. A. Prado <nfraprado at collabora.com>

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>




From angelogioacchino.delregno at collabora.com  Tue Sep 10 02:30:55 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Tue, 10 Sep 2024 09:30:55 +0000
Subject: [PATCH v4 1/1] drm/mediatek: Fix get efuse issue for MT8188 DPTX
In-Reply-To: <20240905124041.3658-1-liankun.yang@mediatek.com>
References: <20240905124041.3658-1-liankun.yang@mediatek.com>
Message-ID: <01020191db45928b-bcb6d066-e490-41ff-aefd-f274d03da21e-000000@eu-west-1.amazonses.com>

Il 05/09/24 14:40, Liankun Yang ha scritto:
> Update efuse data for MT8188 displayport.
> 
> The DP monitor can not display when DUT connected to USB-c to DP dongle.
> Analysis view is invalid DP efuse data.
> 
> Fixes: 350c3fe907fb ("drm/mediatek: dp: Add support MT8188 dp/edp function")
> Reviewed-by: Matthias Brugger <matthias.bgg at gmail.com>
> Signed-off-by: Liankun Yang <liankun.yang at mediatek.com>

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>

> ---
> Changes in V4:
> - Remove excess newlines.
> Per suggestion from the previous thread:
> https://patchwork.kernel.org/project/linux-mediatek/patch/20240903121028.20689-1-liankun.yang at mediatek.com/
> 
> Changes in V3
> - Update change log position in commit message.
> Per suggestion from the previous thread:
> https://patchwork.kernel.org/project/linux-mediatek/patch/20240902133736.16461-1-liankun.yang at mediatek.com/
> 
> Changes in V2
> - Add Fixes tag.
> - Update the commit title.
> - Update the commit description.
> Per suggestion from the previous thread:
> https://patchwork.kernel.org/project/linux-mediatek/patch/20240510061716.31103-1-liankun.yang at mediatek.com/
> ---
>   drivers/gpu/drm/mediatek/mtk_dp.c | 85 ++++++++++++++++++++++++++++++-
>   1 file changed, 84 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/mediatek/mtk_dp.c b/drivers/gpu/drm/mediatek/mtk_dp.c
> index d8796a904eca..f2bee617f063 100644
> --- a/drivers/gpu/drm/mediatek/mtk_dp.c
> +++ b/drivers/gpu/drm/mediatek/mtk_dp.c
> @@ -145,6 +145,89 @@ struct mtk_dp_data {
>   	u16 audio_m_div2_bit;
>   };
>   
> +static const struct mtk_dp_efuse_fmt mt8188_dp_efuse_fmt[MTK_DP_CAL_MAX] = {
> +	[MTK_DP_CAL_GLB_BIAS_TRIM] = {
> +		.idx = 0,
> +		.shift = 10,
> +		.mask = 0x1f,
> +		.min_val = 1,
> +		.max_val = 0x1e,
> +		.default_val = 0xf,
> +	},
> +	[MTK_DP_CAL_CLKTX_IMPSE] = {
> +		.idx = 0,
> +		.shift = 15,
> +		.mask = 0xf,
> +		.min_val = 1,
> +		.max_val = 0xe,
> +		.default_val = 0x8,
> +	},
> +	[MTK_DP_CAL_LN_TX_IMPSEL_PMOS_0] = {
> +		.idx = 1,
> +		.shift = 0,
> +		.mask = 0xf,
> +		.min_val = 1,
> +		.max_val = 0xe,
> +		.default_val = 0x8,
> +	},
> +	[MTK_DP_CAL_LN_TX_IMPSEL_PMOS_1] = {
> +		.idx = 1,
> +		.shift = 8,
> +		.mask = 0xf,
> +		.min_val = 1,
> +		.max_val = 0xe,
> +		.default_val = 0x8,
> +	},
> +	[MTK_DP_CAL_LN_TX_IMPSEL_PMOS_2] = {
> +		.idx = 1,
> +		.shift = 16,
> +		.mask = 0xf,
> +		.min_val = 1,
> +		.max_val = 0xe,
> +		.default_val = 0x8,
> +	},
> +	[MTK_DP_CAL_LN_TX_IMPSEL_PMOS_3] = {
> +		.idx = 1,
> +		.shift = 24,
> +		.mask = 0xf,
> +		.min_val = 1,
> +		.max_val = 0xe,
> +		.default_val = 0x8,
> +	},
> +	[MTK_DP_CAL_LN_TX_IMPSEL_NMOS_0] = {
> +		.idx = 1,
> +		.shift = 4,
> +		.mask = 0xf,
> +		.min_val = 1,
> +		.max_val = 0xe,
> +		.default_val = 0x8,
> +	},
> +	[MTK_DP_CAL_LN_TX_IMPSEL_NMOS_1] = {
> +		.idx = 1,
> +		.shift = 12,
> +		.mask = 0xf,
> +		.min_val = 1,
> +		.max_val = 0xe,
> +		.default_val = 0x8,
> +	},
> +	[MTK_DP_CAL_LN_TX_IMPSEL_NMOS_2] = {
> +		.idx = 1,
> +		.shift = 20,
> +		.mask = 0xf,
> +		.min_val = 1,
> +		.max_val = 0xe,
> +		.default_val = 0x8,
> +	},
> +	[MTK_DP_CAL_LN_TX_IMPSEL_NMOS_3] = {
> +		.idx = 1,
> +		.shift = 28,
> +		.mask = 0xf,
> +		.min_val = 1,
> +		.max_val = 0xe,
> +		.default_val = 0x8,
> +	},
> +};
> +
>   static const struct mtk_dp_efuse_fmt mt8195_edp_efuse_fmt[MTK_DP_CAL_MAX] = {
>   	[MTK_DP_CAL_GLB_BIAS_TRIM] = {
>   		.idx = 3,
> @@ -2771,7 +2854,7 @@ static SIMPLE_DEV_PM_OPS(mtk_dp_pm_ops, mtk_dp_suspend, mtk_dp_resume);
>   static const struct mtk_dp_data mt8188_dp_data = {
>   	.bridge_type = DRM_MODE_CONNECTOR_DisplayPort,
>   	.smc_cmd = MTK_DP_SIP_ATF_VIDEO_UNMUTE,
> -	.efuse_fmt = mt8195_dp_efuse_fmt,
> +	.efuse_fmt = mt8188_dp_efuse_fmt,
>   	.audio_supported = true,
>   	.audio_pkt_in_hblank_area = true,
>   	.audio_m_div2_bit = MT8188_AUDIO_M_CODE_MULT_DIV_SEL_DP_ENC0_P0_DIV_2,



From wenst at chromium.org  Tue Sep 10 02:39:59 2024
From: wenst at chromium.org (Chen-Yu Tsai)
Date: Tue, 10 Sep 2024 17:39:59 +0800
Subject: [PATCH v9 0/3] drm/mediatek: Add support for OF graphs
In-Reply-To: <01020191db2ac439-4e2dc95a-6323-4f0f-b9fc-c482948018a8-000000@eu-west-1.amazonses.com>
References: <01020191db2ac439-4e2dc95a-6323-4f0f-b9fc-c482948018a8-000000@eu-west-1.amazonses.com>
Message-ID: <CAGXv+5Ff4+HS5_DSTX2U7SaCnZhWMWTN44wr+4_vYNrQQm_mDA@mail.gmail.com>

On Tue, Sep 10, 2024 at 5:01?PM AngeloGioacchino Del Regno
<angelogioacchino.delregno at collabora.com> wrote:
>
> Changes in v9:
>  - Rebased on next-20240910
>  - Removed redundant assignment and changed a print to dev_err()
>  - Dropped if branch to switch conversion as requested; this will
>    be sent as a separate commit out of this series.
>
> Changes in v8:
>  - Rebased on next-20240617
>  - Changed to allow probing a VDO with no available display outputs
>
> Changes in v7:
>  - Fix typo in patch 3/3
>
> Changes in v6:
>  - Added EPROBE_DEFER check to fix dsi/dpi false positive DT fallback case
>  - Dropped refcount of ep_out in mtk_drm_of_get_ddp_ep_cid()
>  - Fixed double refcount drop during path building
>  - Removed failure upon finding a DT-disabled path as requested
>  - Tested again on MT8195, MT8395 boards
>
> Changes in v5:
>  - Fixed commit [2/3], changed allOf -> anyOf to get the
>    intended allowance in the binding
>
> Changes in v4:
>  - Fixed a typo that caused pure OF graphs pipelines multiple
>    concurrent outputs to not get correctly parsed (port->id);
>  - Added OVL_ADAPTOR support for OF graph specified pipelines;
>  - Now tested with fully OF Graph specified pipelines on MT8195
>    Chromebooks and MT8395 boards;
>  - Rebased on next-20240516
>
> Changes in v3:
>  - Rebased on next-20240502 because of renames in mediatek-drm
>
> Changes in v2:
>  - Fixed wrong `required` block indentation in commit [2/3]
>
>
> The display IPs in MediaTek SoCs are *VERY* flexible and those support
> being interconnected with different instances of DDP IPs (for example,
> merge0 or merge1) and/or with different DDP IPs (for example, rdma can
> be connected with either color, dpi, dsi, merge, etc), forming a full
> Display Data Path that ends with an actual display.
>
> This series was born because of an issue that I've found while enabling
> support for MT8195/MT8395 boards with DSI output as main display: the
> current mtk_drm_route variations would not work as currently, the driver
> hardcodes a display path for Chromebooks, which have a DisplayPort panel
> with DSC support, instead of a DSI panel without DSC support.
>
> There are other reasons for which I wrote this series, and I find that
> hardcoding those paths - when a HW path is clearly board-specific - is
> highly suboptimal. Also, let's not forget about keeping this driver from
> becoming a huge list of paths for each combination of SoC->board->disp
> and... this and that.
>
> For more information, please look at the commit description for each of
> the commits included in this series.
>
> This series is essential to enable support for the MT8195/MT8395 EVK,
> Kontron i1200, Radxa NIO-12L and, mainly, for non-Chromebook boards
> and Chromebooks to co-exist without conflicts.
>
> Besides, this is also a valid option for MT8188 Chromebooks which might
> have different DSI-or-eDP displays depending on the model (as far as I
> can see from the mtk_drm_route attempt for this SoC that is already
> present in this driver).
>
> This series was tested on MT8195 Cherry Tomato and on MT8395 Radxa
> NIO-12L with both hardcoded paths, OF graph support and partially
> hardcoded paths, and pure OF graph support including pipelines that
> require OVL_ADAPTOR support.
>
> AngeloGioacchino Del Regno (3):
>   dt-bindings: display: mediatek: Add OF graph support for board path
>   dt-bindings: arm: mediatek: mmsys: Add OF graph support for board path
>   drm/mediatek: Implement OF graphs support for display paths
>
>  .../bindings/arm/mediatek/mediatek,mmsys.yaml |  28 ++
>  .../arm/mediatek/mediatek,mmsys.yaml.orig     | 140 ++++++++++
>  .../display/mediatek/mediatek,aal.yaml        |  40 +++
>  .../display/mediatek/mediatek,aal.yaml.orig   |  93 +++++++
>  .../display/mediatek/mediatek,ccorr.yaml      |  21 ++
>  .../display/mediatek/mediatek,ccorr.yaml.orig |  88 ++++++
>  .../display/mediatek/mediatek,color.yaml      |  22 ++
>  .../display/mediatek/mediatek,color.yaml.orig |  96 +++++++
>  .../display/mediatek/mediatek,dither.yaml     |  22 ++
>  .../mediatek/mediatek,dither.yaml.orig        |  87 ++++++
>  .../display/mediatek/mediatek,dpi.yaml        |  25 +-
>  .../display/mediatek/mediatek,dpi.yaml.orig   | 122 +++++++++
>  .../display/mediatek/mediatek,dsc.yaml        |  24 ++
>  .../display/mediatek/mediatek,dsi.yaml        |  27 +-
>  .../display/mediatek/mediatek,dsi.yaml.orig   | 126 +++++++++
>  .../display/mediatek/mediatek,ethdr.yaml      |  22 ++
>  .../display/mediatek/mediatek,gamma.yaml      |  19 ++
>  .../display/mediatek/mediatek,gamma.yaml.orig |  96 +++++++
>  .../display/mediatek/mediatek,merge.yaml      |  23 ++
>  .../display/mediatek/mediatek,merge.yaml.orig | 110 ++++++++
>  .../display/mediatek/mediatek,od.yaml         |  22 ++
>  .../display/mediatek/mediatek,ovl-2l.yaml     |  22 ++
>  .../mediatek/mediatek,ovl-2l.yaml.orig        |  78 ++++++
>  .../display/mediatek/mediatek,ovl.yaml        |  22 ++
>  .../display/mediatek/mediatek,ovl.yaml.orig   | 109 ++++++++
>  .../display/mediatek/mediatek,postmask.yaml   |  21 ++
>  .../display/mediatek/mediatek,rdma.yaml       |  22 ++
>  .../display/mediatek/mediatek,rdma.yaml.orig  | 122 +++++++++
>  .../display/mediatek/mediatek,ufoe.yaml       |  21 ++
>  .../display/mediatek/mediatek,wdma.yaml.orig  |  76 ++++++
>  .../bindings/gpu/arm,mali-bifrost.yaml.orig   | 250 +++++++++++++++++
>  .../bindings/leds/leds-mt6323.txt.orig        |  60 +++++
>  .../bindings/ufs/mediatek,ufs.yaml.orig       |  71 +++++
>  drivers/gpu/drm/mediatek/mtk_disp_drv.h       |   1 +
>  .../gpu/drm/mediatek/mtk_disp_ovl_adaptor.c   |  40 ++-
>  drivers/gpu/drm/mediatek/mtk_dpi.c            |  21 +-
>  drivers/gpu/drm/mediatek/mtk_drm_drv.c        | 253 +++++++++++++++++-
>  drivers/gpu/drm/mediatek/mtk_drm_drv.h        |   2 +-
>  drivers/gpu/drm/mediatek/mtk_dsi.c            |  14 +-
>  39 files changed, 2433 insertions(+), 25 deletions(-)
>  create mode 100644 Documentation/devicetree/bindings/arm/mediatek/mediatek,mmsys.yaml.orig
>  create mode 100644 Documentation/devicetree/bindings/display/mediatek/mediatek,aal.yaml.orig
>  create mode 100644 Documentation/devicetree/bindings/display/mediatek/mediatek,ccorr.yaml.orig
>  create mode 100644 Documentation/devicetree/bindings/display/mediatek/mediatek,color.yaml.orig
>  create mode 100644 Documentation/devicetree/bindings/display/mediatek/mediatek,dither.yaml.orig
>  create mode 100644 Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml.orig
>  create mode 100644 Documentation/devicetree/bindings/display/mediatek/mediatek,dsi.yaml.orig
>  create mode 100644 Documentation/devicetree/bindings/display/mediatek/mediatek,gamma.yaml.orig
>  create mode 100644 Documentation/devicetree/bindings/display/mediatek/mediatek,merge.yaml.orig
>  create mode 100644 Documentation/devicetree/bindings/display/mediatek/mediatek,ovl-2l.yaml.orig
>  create mode 100644 Documentation/devicetree/bindings/display/mediatek/mediatek,ovl.yaml.orig
>  create mode 100644 Documentation/devicetree/bindings/display/mediatek/mediatek,rdma.yaml.orig
>  create mode 100644 Documentation/devicetree/bindings/display/mediatek/mediatek,wdma.yaml.orig
>  create mode 100644 Documentation/devicetree/bindings/gpu/arm,mali-bifrost.yaml.orig
>  create mode 100644 Documentation/devicetree/bindings/leds/leds-mt6323.txt.orig
>  create mode 100644 Documentation/devicetree/bindings/ufs/mediatek,ufs.yaml.orig

It looks like you accidentally imported a bunch of files from Git.

ChenYu

>
> --
> 2.46.0
>


From angelogioacchino.delregno at collabora.com  Tue Sep 10 02:50:39 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Tue, 10 Sep 2024 09:50:39 +0000
Subject: [PATCH v9 0/3] drm/mediatek: Add support for OF graphs
In-Reply-To: <CAGXv+5Ff4+HS5_DSTX2U7SaCnZhWMWTN44wr+4_vYNrQQm_mDA@mail.gmail.com>
References: <01020191db2ac439-4e2dc95a-6323-4f0f-b9fc-c482948018a8-000000@eu-west-1.amazonses.com>
 <CAGXv+5Ff4+HS5_DSTX2U7SaCnZhWMWTN44wr+4_vYNrQQm_mDA@mail.gmail.com>
Message-ID: <01020191db57a3d1-2c076978-c7c0-4685-9621-10ecdc3c5e99-000000@eu-west-1.amazonses.com>

Il 10/09/24 11:39, Chen-Yu Tsai ha scritto:
> On Tue, Sep 10, 2024 at 5:01?PM AngeloGioacchino Del Regno
> <angelogioacchino.delregno at collabora.com> wrote:
>>
>> Changes in v9:
>>   - Rebased on next-20240910
>>   - Removed redundant assignment and changed a print to dev_err()
>>   - Dropped if branch to switch conversion as requested; this will
>>     be sent as a separate commit out of this series.
>>
>> Changes in v8:
>>   - Rebased on next-20240617
>>   - Changed to allow probing a VDO with no available display outputs
>>
>> Changes in v7:
>>   - Fix typo in patch 3/3
>>
>> Changes in v6:
>>   - Added EPROBE_DEFER check to fix dsi/dpi false positive DT fallback case
>>   - Dropped refcount of ep_out in mtk_drm_of_get_ddp_ep_cid()
>>   - Fixed double refcount drop during path building
>>   - Removed failure upon finding a DT-disabled path as requested
>>   - Tested again on MT8195, MT8395 boards
>>
>> Changes in v5:
>>   - Fixed commit [2/3], changed allOf -> anyOf to get the
>>     intended allowance in the binding
>>
>> Changes in v4:
>>   - Fixed a typo that caused pure OF graphs pipelines multiple
>>     concurrent outputs to not get correctly parsed (port->id);
>>   - Added OVL_ADAPTOR support for OF graph specified pipelines;
>>   - Now tested with fully OF Graph specified pipelines on MT8195
>>     Chromebooks and MT8395 boards;
>>   - Rebased on next-20240516
>>
>> Changes in v3:
>>   - Rebased on next-20240502 because of renames in mediatek-drm
>>
>> Changes in v2:
>>   - Fixed wrong `required` block indentation in commit [2/3]
>>
>>
>> The display IPs in MediaTek SoCs are *VERY* flexible and those support
>> being interconnected with different instances of DDP IPs (for example,
>> merge0 or merge1) and/or with different DDP IPs (for example, rdma can
>> be connected with either color, dpi, dsi, merge, etc), forming a full
>> Display Data Path that ends with an actual display.
>>
>> This series was born because of an issue that I've found while enabling
>> support for MT8195/MT8395 boards with DSI output as main display: the
>> current mtk_drm_route variations would not work as currently, the driver
>> hardcodes a display path for Chromebooks, which have a DisplayPort panel
>> with DSC support, instead of a DSI panel without DSC support.
>>
>> There are other reasons for which I wrote this series, and I find that
>> hardcoding those paths - when a HW path is clearly board-specific - is
>> highly suboptimal. Also, let's not forget about keeping this driver from
>> becoming a huge list of paths for each combination of SoC->board->disp
>> and... this and that.
>>
>> For more information, please look at the commit description for each of
>> the commits included in this series.
>>
>> This series is essential to enable support for the MT8195/MT8395 EVK,
>> Kontron i1200, Radxa NIO-12L and, mainly, for non-Chromebook boards
>> and Chromebooks to co-exist without conflicts.
>>
>> Besides, this is also a valid option for MT8188 Chromebooks which might
>> have different DSI-or-eDP displays depending on the model (as far as I
>> can see from the mtk_drm_route attempt for this SoC that is already
>> present in this driver).
>>
>> This series was tested on MT8195 Cherry Tomato and on MT8395 Radxa
>> NIO-12L with both hardcoded paths, OF graph support and partially
>> hardcoded paths, and pure OF graph support including pipelines that
>> require OVL_ADAPTOR support.
>>
>> AngeloGioacchino Del Regno (3):
>>    dt-bindings: display: mediatek: Add OF graph support for board path
>>    dt-bindings: arm: mediatek: mmsys: Add OF graph support for board path
>>    drm/mediatek: Implement OF graphs support for display paths
>>
>>   .../bindings/arm/mediatek/mediatek,mmsys.yaml |  28 ++
>>   .../arm/mediatek/mediatek,mmsys.yaml.orig     | 140 ++++++++++
>>   .../display/mediatek/mediatek,aal.yaml        |  40 +++
>>   .../display/mediatek/mediatek,aal.yaml.orig   |  93 +++++++
>>   .../display/mediatek/mediatek,ccorr.yaml      |  21 ++
>>   .../display/mediatek/mediatek,ccorr.yaml.orig |  88 ++++++
>>   .../display/mediatek/mediatek,color.yaml      |  22 ++
>>   .../display/mediatek/mediatek,color.yaml.orig |  96 +++++++
>>   .../display/mediatek/mediatek,dither.yaml     |  22 ++
>>   .../mediatek/mediatek,dither.yaml.orig        |  87 ++++++
>>   .../display/mediatek/mediatek,dpi.yaml        |  25 +-
>>   .../display/mediatek/mediatek,dpi.yaml.orig   | 122 +++++++++
>>   .../display/mediatek/mediatek,dsc.yaml        |  24 ++
>>   .../display/mediatek/mediatek,dsi.yaml        |  27 +-
>>   .../display/mediatek/mediatek,dsi.yaml.orig   | 126 +++++++++
>>   .../display/mediatek/mediatek,ethdr.yaml      |  22 ++
>>   .../display/mediatek/mediatek,gamma.yaml      |  19 ++
>>   .../display/mediatek/mediatek,gamma.yaml.orig |  96 +++++++
>>   .../display/mediatek/mediatek,merge.yaml      |  23 ++
>>   .../display/mediatek/mediatek,merge.yaml.orig | 110 ++++++++
>>   .../display/mediatek/mediatek,od.yaml         |  22 ++
>>   .../display/mediatek/mediatek,ovl-2l.yaml     |  22 ++
>>   .../mediatek/mediatek,ovl-2l.yaml.orig        |  78 ++++++
>>   .../display/mediatek/mediatek,ovl.yaml        |  22 ++
>>   .../display/mediatek/mediatek,ovl.yaml.orig   | 109 ++++++++
>>   .../display/mediatek/mediatek,postmask.yaml   |  21 ++
>>   .../display/mediatek/mediatek,rdma.yaml       |  22 ++
>>   .../display/mediatek/mediatek,rdma.yaml.orig  | 122 +++++++++
>>   .../display/mediatek/mediatek,ufoe.yaml       |  21 ++
>>   .../display/mediatek/mediatek,wdma.yaml.orig  |  76 ++++++
>>   .../bindings/gpu/arm,mali-bifrost.yaml.orig   | 250 +++++++++++++++++
>>   .../bindings/leds/leds-mt6323.txt.orig        |  60 +++++
>>   .../bindings/ufs/mediatek,ufs.yaml.orig       |  71 +++++
>>   drivers/gpu/drm/mediatek/mtk_disp_drv.h       |   1 +
>>   .../gpu/drm/mediatek/mtk_disp_ovl_adaptor.c   |  40 ++-
>>   drivers/gpu/drm/mediatek/mtk_dpi.c            |  21 +-
>>   drivers/gpu/drm/mediatek/mtk_drm_drv.c        | 253 +++++++++++++++++-
>>   drivers/gpu/drm/mediatek/mtk_drm_drv.h        |   2 +-
>>   drivers/gpu/drm/mediatek/mtk_dsi.c            |  14 +-
>>   39 files changed, 2433 insertions(+), 25 deletions(-)
>>   create mode 100644 Documentation/devicetree/bindings/arm/mediatek/mediatek,mmsys.yaml.orig
>>   create mode 100644 Documentation/devicetree/bindings/display/mediatek/mediatek,aal.yaml.orig
>>   create mode 100644 Documentation/devicetree/bindings/display/mediatek/mediatek,ccorr.yaml.orig
>>   create mode 100644 Documentation/devicetree/bindings/display/mediatek/mediatek,color.yaml.orig
>>   create mode 100644 Documentation/devicetree/bindings/display/mediatek/mediatek,dither.yaml.orig
>>   create mode 100644 Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml.orig
>>   create mode 100644 Documentation/devicetree/bindings/display/mediatek/mediatek,dsi.yaml.orig
>>   create mode 100644 Documentation/devicetree/bindings/display/mediatek/mediatek,gamma.yaml.orig
>>   create mode 100644 Documentation/devicetree/bindings/display/mediatek/mediatek,merge.yaml.orig
>>   create mode 100644 Documentation/devicetree/bindings/display/mediatek/mediatek,ovl-2l.yaml.orig
>>   create mode 100644 Documentation/devicetree/bindings/display/mediatek/mediatek,ovl.yaml.orig
>>   create mode 100644 Documentation/devicetree/bindings/display/mediatek/mediatek,rdma.yaml.orig
>>   create mode 100644 Documentation/devicetree/bindings/display/mediatek/mediatek,wdma.yaml.orig
>>   create mode 100644 Documentation/devicetree/bindings/gpu/arm,mali-bifrost.yaml.orig
>>   create mode 100644 Documentation/devicetree/bindings/leds/leds-mt6323.txt.orig
>>   create mode 100644 Documentation/devicetree/bindings/ufs/mediatek,ufs.yaml.orig
> 
> It looks like you accidentally imported a bunch of files from Git.
> 

Ouch. Yeah, looks like I did.

Will send a v10 soon, I apparently need some coffee :-P

Thanks,
Angelo

> ChenYu
> 
>>
>> --
>> 2.46.0
>>




From angelogioacchino.delregno at collabora.com  Tue Sep 10 03:51:11 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Tue, 10 Sep 2024 10:51:11 +0000
Subject: [PATCH v10 0/3] drm/mediatek: Add support for OF graphs
Message-ID: <01020191db8f0f22-7d4eed45-6265-420c-8dfa-d7c0f6637f9e-000000@eu-west-1.amazonses.com>

Changes in v10:
 - Removed erroneously added *.orig/*.rej files

Changes in v9:
 - Rebased on next-20240910
 - Removed redundant assignment and changed a print to dev_err()
 - Dropped if branch to switch conversion as requested; this will
   be sent as a separate commit out of this series.

Changes in v8:
 - Rebased on next-20240617
 - Changed to allow probing a VDO with no available display outputs

Changes in v7:
 - Fix typo in patch 3/3

Changes in v6:
 - Added EPROBE_DEFER check to fix dsi/dpi false positive DT fallback case
 - Dropped refcount of ep_out in mtk_drm_of_get_ddp_ep_cid()
 - Fixed double refcount drop during path building
 - Removed failure upon finding a DT-disabled path as requested
 - Tested again on MT8195, MT8395 boards

Changes in v5:
 - Fixed commit [2/3], changed allOf -> anyOf to get the
   intended allowance in the binding

Changes in v4:
 - Fixed a typo that caused pure OF graphs pipelines multiple
   concurrent outputs to not get correctly parsed (port->id); 
 - Added OVL_ADAPTOR support for OF graph specified pipelines;
 - Now tested with fully OF Graph specified pipelines on MT8195
   Chromebooks and MT8395 boards;
 - Rebased on next-20240516

Changes in v3:
 - Rebased on next-20240502 because of renames in mediatek-drm

Changes in v2:
 - Fixed wrong `required` block indentation in commit [2/3]


The display IPs in MediaTek SoCs are *VERY* flexible and those support
being interconnected with different instances of DDP IPs (for example,
merge0 or merge1) and/or with different DDP IPs (for example, rdma can
be connected with either color, dpi, dsi, merge, etc), forming a full
Display Data Path that ends with an actual display.

This series was born because of an issue that I've found while enabling
support for MT8195/MT8395 boards with DSI output as main display: the
current mtk_drm_route variations would not work as currently, the driver
hardcodes a display path for Chromebooks, which have a DisplayPort panel
with DSC support, instead of a DSI panel without DSC support.

There are other reasons for which I wrote this series, and I find that
hardcoding those paths - when a HW path is clearly board-specific - is
highly suboptimal. Also, let's not forget about keeping this driver from
becoming a huge list of paths for each combination of SoC->board->disp
and... this and that.

For more information, please look at the commit description for each of
the commits included in this series.

This series is essential to enable support for the MT8195/MT8395 EVK,
Kontron i1200, Radxa NIO-12L and, mainly, for non-Chromebook boards
and Chromebooks to co-exist without conflicts.

Besides, this is also a valid option for MT8188 Chromebooks which might
have different DSI-or-eDP displays depending on the model (as far as I
can see from the mtk_drm_route attempt for this SoC that is already
present in this driver).

This series was tested on MT8195 Cherry Tomato and on MT8395 Radxa
NIO-12L with both hardcoded paths, OF graph support and partially
hardcoded paths, and pure OF graph support including pipelines that
require OVL_ADAPTOR support.


AngeloGioacchino Del Regno (3):
  dt-bindings: display: mediatek: Add OF graph support for board path
  dt-bindings: arm: mediatek: mmsys: Add OF graph support for board path
  drm/mediatek: Implement OF graphs support for display paths

 .../bindings/arm/mediatek/mediatek,mmsys.yaml |  28 ++
 .../display/mediatek/mediatek,aal.yaml        |  40 +++
 .../display/mediatek/mediatek,ccorr.yaml      |  21 ++
 .../display/mediatek/mediatek,color.yaml      |  22 ++
 .../display/mediatek/mediatek,dither.yaml     |  22 ++
 .../display/mediatek/mediatek,dpi.yaml        |  25 +-
 .../display/mediatek/mediatek,dsc.yaml        |  24 ++
 .../display/mediatek/mediatek,dsi.yaml        |  27 +-
 .../display/mediatek/mediatek,ethdr.yaml      |  22 ++
 .../display/mediatek/mediatek,gamma.yaml      |  19 ++
 .../display/mediatek/mediatek,merge.yaml      |  23 ++
 .../display/mediatek/mediatek,od.yaml         |  22 ++
 .../display/mediatek/mediatek,ovl-2l.yaml     |  22 ++
 .../display/mediatek/mediatek,ovl.yaml        |  22 ++
 .../display/mediatek/mediatek,postmask.yaml   |  21 ++
 .../display/mediatek/mediatek,rdma.yaml       |  22 ++
 .../display/mediatek/mediatek,ufoe.yaml       |  21 ++
 drivers/gpu/drm/mediatek/mtk_disp_drv.h       |   1 +
 .../gpu/drm/mediatek/mtk_disp_ovl_adaptor.c   |  40 ++-
 drivers/gpu/drm/mediatek/mtk_dpi.c            |  21 +-
 drivers/gpu/drm/mediatek/mtk_drm_drv.c        | 253 +++++++++++++++++-
 drivers/gpu/drm/mediatek/mtk_drm_drv.h        |   2 +-
 drivers/gpu/drm/mediatek/mtk_dsi.c            |  14 +-
 23 files changed, 709 insertions(+), 25 deletions(-)

-- 
2.46.0



From angelogioacchino.delregno at collabora.com  Tue Sep 10 03:51:13 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Tue, 10 Sep 2024 10:51:13 +0000
Subject: [PATCH v10 1/3] dt-bindings: display: mediatek: Add OF graph support for board path
In-Reply-To: <20240910105054.125005-1-angelogioacchino.delregno@collabora.com>
References: <20240910105054.125005-1-angelogioacchino.delregno@collabora.com>
Message-ID: <01020191db8f15b7-e522d284-2ecf-4623-b6f7-4694b8703294-000000@eu-west-1.amazonses.com>

The display IPs in MediaTek SoCs support being interconnected with
different instances of DDP IPs (for example, merge0 or merge1) and/or
with different DDP IPs (for example, rdma can be connected with either
color, dpi, dsi, merge, etc), forming a full Display Data Path that
ends with an actual display.

The final display pipeline is effectively board specific, as it does
depend on the display that is attached to it, and eventually on the
sensors supported by the board (for example, Adaptive Ambient Light
would need an Ambient Light Sensor, otherwise it's pointless!), other
than the output type.

Add support for OF graphs to most of the MediaTek DDP (display) bindings
to add flexibility to build custom hardware paths, hence enabling board
specific configuration of the display pipeline and allowing to finally
migrate away from using hardcoded paths.

Reviewed-by: Rob Herring (Arm) <robh at kernel.org>
Reviewed-by: Alexandre Mergnat <amergnat at baylibre.com>
Tested-by: Alexandre Mergnat <amergnat at baylibre.com>
Reviewed-by: CK Hu <ck.hu at mediatek.com>
Tested-by: Michael Walle <mwalle at kernel.org> # on kontron-sbc-i1200
Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
---
 .../display/mediatek/mediatek,aal.yaml        | 40 +++++++++++++++++++
 .../display/mediatek/mediatek,ccorr.yaml      | 21 ++++++++++
 .../display/mediatek/mediatek,color.yaml      | 22 ++++++++++
 .../display/mediatek/mediatek,dither.yaml     | 22 ++++++++++
 .../display/mediatek/mediatek,dpi.yaml        | 25 +++++++++++-
 .../display/mediatek/mediatek,dsc.yaml        | 24 +++++++++++
 .../display/mediatek/mediatek,dsi.yaml        | 27 ++++++++++++-
 .../display/mediatek/mediatek,ethdr.yaml      | 22 ++++++++++
 .../display/mediatek/mediatek,gamma.yaml      | 19 +++++++++
 .../display/mediatek/mediatek,merge.yaml      | 23 +++++++++++
 .../display/mediatek/mediatek,od.yaml         | 22 ++++++++++
 .../display/mediatek/mediatek,ovl-2l.yaml     | 22 ++++++++++
 .../display/mediatek/mediatek,ovl.yaml        | 22 ++++++++++
 .../display/mediatek/mediatek,postmask.yaml   | 21 ++++++++++
 .../display/mediatek/mediatek,rdma.yaml       | 22 ++++++++++
 .../display/mediatek/mediatek,ufoe.yaml       | 21 ++++++++++
 16 files changed, 372 insertions(+), 3 deletions(-)

diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,aal.yaml b/Documentation/devicetree/bindings/display/mediatek/mediatek,aal.yaml
index cf24434854ff..47ddba5c41af 100644
--- a/Documentation/devicetree/bindings/display/mediatek/mediatek,aal.yaml
+++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,aal.yaml
@@ -62,6 +62,27 @@ properties:
     $ref: /schemas/types.yaml#/definitions/phandle-array
     maxItems: 1
 
+  ports:
+    $ref: /schemas/graph.yaml#/properties/ports
+    description:
+      Input and output ports can have multiple endpoints, each of those
+      connects to either the primary, secondary, etc, display pipeline.
+
+    properties:
+      port at 0:
+        $ref: /schemas/graph.yaml#/properties/port
+        description: AAL input port
+
+      port at 1:
+        $ref: /schemas/graph.yaml#/properties/port
+        description:
+          AAL output to the next component's input, for example could be one
+          of many gamma, overdrive or other blocks.
+
+    required:
+      - port at 0
+      - port at 1
+
 required:
   - compatible
   - reg
@@ -89,5 +110,24 @@ examples:
            power-domains = <&scpsys MT8173_POWER_DOMAIN_MM>;
            clocks = <&mmsys CLK_MM_DISP_AAL>;
            mediatek,gce-client-reg = <&gce SUBSYS_1401XXXX 0x5000 0x1000>;
+
+           ports {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               port at 0 {
+                   reg = <0>;
+                   aal0_in: endpoint {
+                       remote-endpoint = <&ccorr0_out>;
+                   };
+               };
+
+               port at 1 {
+                   reg = <1>;
+                   aal0_out: endpoint {
+                       remote-endpoint = <&gamma0_in>;
+                   };
+               };
+           };
        };
     };
diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,ccorr.yaml b/Documentation/devicetree/bindings/display/mediatek/mediatek,ccorr.yaml
index 9f8366763831..fca8e7bb0cbc 100644
--- a/Documentation/devicetree/bindings/display/mediatek/mediatek,ccorr.yaml
+++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,ccorr.yaml
@@ -57,6 +57,27 @@ properties:
     $ref: /schemas/types.yaml#/definitions/phandle-array
     maxItems: 1
 
+  ports:
+    $ref: /schemas/graph.yaml#/properties/ports
+    description:
+      Input and output ports can have multiple endpoints, each of those
+      connects to either the primary, secondary, etc, display pipeline.
+
+    properties:
+      port at 0:
+        $ref: /schemas/graph.yaml#/properties/port
+        description: CCORR input port
+
+      port at 1:
+        $ref: /schemas/graph.yaml#/properties/port
+        description:
+          CCORR output to the input of the next desired component in the
+          display pipeline, usually only one of the available AAL blocks.
+
+    required:
+      - port at 0
+      - port at 1
+
 required:
   - compatible
   - reg
diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,color.yaml b/Documentation/devicetree/bindings/display/mediatek/mediatek,color.yaml
index 7df786bbad20..6160439ce4d7 100644
--- a/Documentation/devicetree/bindings/display/mediatek/mediatek,color.yaml
+++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,color.yaml
@@ -65,6 +65,28 @@ properties:
     $ref: /schemas/types.yaml#/definitions/phandle-array
     maxItems: 1
 
+  ports:
+    $ref: /schemas/graph.yaml#/properties/ports
+    description:
+      Input and output ports can have multiple endpoints, each of those
+      connects to either the primary, secondary, etc, display pipeline.
+
+    properties:
+      port at 0:
+        $ref: /schemas/graph.yaml#/properties/port
+        description: COLOR input port
+
+      port at 1:
+        $ref: /schemas/graph.yaml#/properties/port
+        description:
+          COLOR output to the input of the next desired component in the
+          display pipeline, for example one of the available CCORR or AAL
+          blocks.
+
+    required:
+      - port at 0
+      - port at 1
+
 required:
   - compatible
   - reg
diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,dither.yaml b/Documentation/devicetree/bindings/display/mediatek/mediatek,dither.yaml
index 6fceb1f95d2a..abaf27916d13 100644
--- a/Documentation/devicetree/bindings/display/mediatek/mediatek,dither.yaml
+++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,dither.yaml
@@ -56,6 +56,28 @@ properties:
     $ref: /schemas/types.yaml#/definitions/phandle-array
     maxItems: 1
 
+  ports:
+    $ref: /schemas/graph.yaml#/properties/ports
+    description:
+      Input and output ports can have multiple endpoints, each of those
+      connects to either the primary, secondary, etc, display pipeline.
+
+    properties:
+      port at 0:
+        $ref: /schemas/graph.yaml#/properties/port
+        description: DITHER input, usually from a POSTMASK or GAMMA block.
+
+      port at 1:
+        $ref: /schemas/graph.yaml#/properties/port
+        description:
+          DITHER output to the input of the next desired component in the
+          display pipeline, for example one of the available DSC compressors,
+          DP_INTF, DSI, LVDS or others.
+
+    required:
+      - port at 0
+      - port at 1
+
 required:
   - compatible
   - reg
diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml b/Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml
index 3a82aec9021c..b567e3d58aa1 100644
--- a/Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml
+++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml
@@ -71,13 +71,34 @@ properties:
       Output port node. This port should be connected to the input port of an
       attached HDMI, LVDS or DisplayPort encoder chip.
 
+  ports:
+    $ref: /schemas/graph.yaml#/properties/ports
+
+    properties:
+      port at 0:
+        $ref: /schemas/graph.yaml#/properties/port
+        description: DPI input port
+
+      port at 1:
+        $ref: /schemas/graph.yaml#/properties/port
+        description: DPI output to an HDMI, LVDS or DisplayPort encoder input
+
+    required:
+      - port at 0
+      - port at 1
+
 required:
   - compatible
   - reg
   - interrupts
   - clocks
   - clock-names
-  - port
+
+oneOf:
+  - required:
+      - port
+  - required:
+      - ports
 
 allOf:
   - if:
@@ -100,7 +121,7 @@ examples:
     #include <dt-bindings/interrupt-controller/arm-gic.h>
     #include <dt-bindings/clock/mt8173-clk.h>
 
-    dpi0: dpi at 1401d000 {
+    dpi: dpi at 1401d000 {
         compatible = "mediatek,mt8173-dpi";
         reg = <0x1401d000 0x1000>;
         interrupts = <GIC_SPI 194 IRQ_TYPE_LEVEL_LOW>;
diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,dsc.yaml b/Documentation/devicetree/bindings/display/mediatek/mediatek,dsc.yaml
index 2cbdd9ee449d..846de6c17d93 100644
--- a/Documentation/devicetree/bindings/display/mediatek/mediatek,dsc.yaml
+++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,dsc.yaml
@@ -49,6 +49,30 @@ properties:
     $ref: /schemas/types.yaml#/definitions/phandle-array
     maxItems: 1
 
+  ports:
+    $ref: /schemas/graph.yaml#/properties/ports
+    description:
+      Input and output ports can have multiple endpoints, each of those
+      connects to either the primary, secondary, etc, display pipeline.
+
+    properties:
+      port at 0:
+        $ref: /schemas/graph.yaml#/properties/port
+        description:
+          Display Stream Compression input, usually from one of the DITHER
+          or MERGE blocks.
+
+      port at 1:
+        $ref: /schemas/graph.yaml#/properties/port
+        description:
+          Display Stream Compression output to the input of the next desired
+          component in the display pipeline, for example to MERGE, DP_INTF,
+          DPI or DSI.
+
+    required:
+      - port at 0
+      - port at 1
+
 required:
   - compatible
   - reg
diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,dsi.yaml b/Documentation/devicetree/bindings/display/mediatek/mediatek,dsi.yaml
index a7aa8fcb0dd1..27ffbccc2a08 100644
--- a/Documentation/devicetree/bindings/display/mediatek/mediatek,dsi.yaml
+++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,dsi.yaml
@@ -77,6 +77,26 @@ properties:
       Output port node. This port should be connected to the input
       port of an attached DSI panel or DSI-to-eDP encoder chip.
 
+  ports:
+    $ref: /schemas/graph.yaml#/properties/ports
+    description:
+      Input ports can have multiple endpoints, each of those connects
+      to either the primary, secondary, etc, display pipeline.
+
+    properties:
+      port at 0:
+        $ref: /schemas/graph.yaml#/properties/port
+        description: DSI input port, usually from DITHER, DSC or MERGE
+
+      port at 1:
+        $ref: /schemas/graph.yaml#/properties/port
+        description:
+          DSI output to an attached DSI panel, or a DSI-to-X encoder chip
+
+    required:
+      - port at 0
+      - port at 1
+
 required:
   - compatible
   - reg
@@ -86,7 +106,12 @@ required:
   - clock-names
   - phys
   - phy-names
-  - port
+
+oneOf:
+  - required:
+      - port
+  - required:
+      - ports
 
 unevaluatedProperties: false
 
diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,ethdr.yaml b/Documentation/devicetree/bindings/display/mediatek/mediatek,ethdr.yaml
index 677882348ede..98db47894eeb 100644
--- a/Documentation/devicetree/bindings/display/mediatek/mediatek,ethdr.yaml
+++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,ethdr.yaml
@@ -110,6 +110,28 @@ properties:
       include/dt-bindings/gce/<chip>-gce.h, mapping to the register of display
       function block.
 
+  ports:
+    $ref: /schemas/graph.yaml#/properties/ports
+    description:
+      Input and output ports can have multiple endpoints, each of those
+      connects to either the primary, secondary, etc, display pipeline.
+
+    properties:
+      port at 0:
+        $ref: /schemas/graph.yaml#/properties/port
+        description: ETHDR input, usually from one of the MERGE blocks.
+
+      port at 1:
+        $ref: /schemas/graph.yaml#/properties/port
+        description:
+          ETHDR output to the input of the next desired component in the
+          display pipeline, for example one of the available MERGE blocks,
+          or others.
+
+    required:
+      - port at 0
+      - port at 1
+
 required:
   - compatible
   - reg
diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,gamma.yaml b/Documentation/devicetree/bindings/display/mediatek/mediatek,gamma.yaml
index 6823d3ce5049..48542dc7e784 100644
--- a/Documentation/devicetree/bindings/display/mediatek/mediatek,gamma.yaml
+++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,gamma.yaml
@@ -65,6 +65,25 @@ properties:
     $ref: /schemas/types.yaml#/definitions/phandle-array
     maxItems: 1
 
+  ports:
+    $ref: /schemas/graph.yaml#/properties/ports
+
+    properties:
+      port at 0:
+        $ref: /schemas/graph.yaml#/properties/port
+        description: GAMMA input, usually from one of the AAL blocks.
+
+      port at 1:
+        $ref: /schemas/graph.yaml#/properties/port
+        description:
+          GAMMA output to the input of the next desired component in the
+          display pipeline, for example one of the available DITHER or
+          POSTMASK blocks.
+
+    required:
+      - port at 0
+      - port at 1
+
 required:
   - compatible
   - reg
diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,merge.yaml b/Documentation/devicetree/bindings/display/mediatek/mediatek,merge.yaml
index dae839279950..0de9f64f3f84 100644
--- a/Documentation/devicetree/bindings/display/mediatek/mediatek,merge.yaml
+++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,merge.yaml
@@ -77,6 +77,29 @@ properties:
     $ref: /schemas/types.yaml#/definitions/phandle-array
     maxItems: 1
 
+  ports:
+    $ref: /schemas/graph.yaml#/properties/ports
+    description:
+      Input and output ports can have multiple endpoints, each of those
+      connects to either the primary, secondary, etc, display pipeline.
+
+    properties:
+      port at 0:
+        $ref: /schemas/graph.yaml#/properties/port
+        description:
+          MERGE input port, usually from DITHER, DPI, DSC, DSI, MDP_RDMA,
+          ETHDR or even from a different MERGE block
+
+      port at 1:
+        $ref: /schemas/graph.yaml#/properties/port
+        description:
+          MERGE output to a DSC, DPI, DP_INTF, DSI, ETHDR, Write DMA, or
+          a different MERGE block, or others.
+
+    required:
+      - port at 0
+      - port at 1
+
   resets:
     description: reset controller
       See Documentation/devicetree/bindings/reset/reset.txt for details.
diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,od.yaml b/Documentation/devicetree/bindings/display/mediatek/mediatek,od.yaml
index 831c653caffd..71534febd49c 100644
--- a/Documentation/devicetree/bindings/display/mediatek/mediatek,od.yaml
+++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,od.yaml
@@ -38,6 +38,28 @@ properties:
     items:
       - description: OD Clock
 
+  ports:
+    $ref: /schemas/graph.yaml#/properties/ports
+    description:
+      Input and output ports can have multiple endpoints, each of those
+      connects to either the primary, secondary, etc, display pipeline.
+
+    properties:
+      port at 0:
+        $ref: /schemas/graph.yaml#/properties/port
+        description: OD input port, usually from an AAL block
+
+      port at 1:
+        $ref: /schemas/graph.yaml#/properties/port
+        description:
+          OD output to the input of the next desired component in the
+          display pipeline, for example one of the available RDMA or
+          other blocks.
+
+    required:
+      - port at 0
+      - port at 1
+
 required:
   - compatible
   - reg
diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,ovl-2l.yaml b/Documentation/devicetree/bindings/display/mediatek/mediatek,ovl-2l.yaml
index c7dd0ef02dcf..bacdfe7d08a6 100644
--- a/Documentation/devicetree/bindings/display/mediatek/mediatek,ovl-2l.yaml
+++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,ovl-2l.yaml
@@ -57,6 +57,28 @@ properties:
     $ref: /schemas/types.yaml#/definitions/phandle-array
     maxItems: 1
 
+  ports:
+    $ref: /schemas/graph.yaml#/properties/ports
+    description:
+      Input and output ports can have multiple endpoints, each of those
+      connects to either the primary, secondary, etc, display pipeline.
+
+    properties:
+      port at 0:
+        $ref: /schemas/graph.yaml#/properties/port
+        description: OVL input port from MMSYS, VDOSYS or other OVLs
+
+      port at 1:
+        $ref: /schemas/graph.yaml#/properties/port
+        description:
+          OVL output to the input of the next desired component in the
+          display pipeline, for example one of the available COLOR, RDMA
+          or WDMA blocks.
+
+    required:
+      - port at 0
+      - port at 1
+
 required:
   - compatible
   - reg
diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,ovl.yaml b/Documentation/devicetree/bindings/display/mediatek/mediatek,ovl.yaml
index d55611c7ce5e..9ea796a033b2 100644
--- a/Documentation/devicetree/bindings/display/mediatek/mediatek,ovl.yaml
+++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,ovl.yaml
@@ -75,6 +75,28 @@ properties:
     $ref: /schemas/types.yaml#/definitions/phandle-array
     maxItems: 1
 
+  ports:
+    $ref: /schemas/graph.yaml#/properties/ports
+    description:
+      Input and output ports can have multiple endpoints, each of those
+      connects to either the primary, secondary, etc, display pipeline.
+
+    properties:
+      port at 0:
+        $ref: /schemas/graph.yaml#/properties/port
+        description: OVL input port from MMSYS or one of multiple VDOSYS
+
+      port at 1:
+        $ref: /schemas/graph.yaml#/properties/port
+        description:
+          OVL output to the input of the next desired component in the
+          display pipeline, for example one of the available COLOR, RDMA
+          or WDMA blocks.
+
+    required:
+      - port at 0
+      - port at 1
+
 required:
   - compatible
   - reg
diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,postmask.yaml b/Documentation/devicetree/bindings/display/mediatek/mediatek,postmask.yaml
index 11fe32e50a59..fb6fe4742624 100644
--- a/Documentation/devicetree/bindings/display/mediatek/mediatek,postmask.yaml
+++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,postmask.yaml
@@ -52,6 +52,27 @@ properties:
     $ref: /schemas/types.yaml#/definitions/phandle-array
     maxItems: 1
 
+  ports:
+    $ref: /schemas/graph.yaml#/properties/ports
+    description:
+      Input and output ports can have multiple endpoints, each of those
+      connects to either the primary, secondary, etc, display pipeline.
+
+    properties:
+      port at 0:
+        $ref: /schemas/graph.yaml#/properties/port
+        description: POSTMASK input port, usually from GAMMA
+
+      port at 1:
+        $ref: /schemas/graph.yaml#/properties/port
+        description:
+          POSTMASK output to the input of the next desired component in the
+          display pipeline, for example one of the available DITHER blocks.
+
+    required:
+      - port at 0
+      - port at 1
+
 required:
   - compatible
   - reg
diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,rdma.yaml b/Documentation/devicetree/bindings/display/mediatek/mediatek,rdma.yaml
index 4cadb245d028..878f676b581f 100644
--- a/Documentation/devicetree/bindings/display/mediatek/mediatek,rdma.yaml
+++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,rdma.yaml
@@ -87,6 +87,28 @@ properties:
     $ref: /schemas/types.yaml#/definitions/phandle-array
     maxItems: 1
 
+  ports:
+    $ref: /schemas/graph.yaml#/properties/ports
+    description:
+      Input and output ports can have multiple endpoints, each of those
+      connects to either the primary, secondary, etc, display pipeline.
+
+    properties:
+      port at 0:
+        $ref: /schemas/graph.yaml#/properties/port
+        description: RDMA input port, usually from MMSYS, OD or OVL
+
+      port at 1:
+        $ref: /schemas/graph.yaml#/properties/port
+        description:
+          RDMA output to the input of the next desired component in the
+          display pipeline, for example one of the available COLOR, DPI,
+          DSI, MERGE or UFOE blocks.
+
+    required:
+      - port at 0
+      - port at 1
+
 required:
   - compatible
   - reg
diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,ufoe.yaml b/Documentation/devicetree/bindings/display/mediatek/mediatek,ufoe.yaml
index 39e3e2d4a0db..61a5e22effbf 100644
--- a/Documentation/devicetree/bindings/display/mediatek/mediatek,ufoe.yaml
+++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,ufoe.yaml
@@ -43,6 +43,27 @@ properties:
     items:
       - description: UFOe Clock
 
+  ports:
+    $ref: /schemas/graph.yaml#/properties/ports
+    description:
+      Input and output ports can have multiple endpoints, each of those
+      connects to either the primary, secondary, etc, display pipeline.
+
+    properties:
+      port at 0:
+        $ref: /schemas/graph.yaml#/properties/port
+        description: UFOE input, usually from one of the RDMA blocks.
+
+      port at 1:
+        $ref: /schemas/graph.yaml#/properties/port
+        description:
+          UFOE output to the input of the next desired component in the
+          display pipeline, usually one of the available DSI blocks.
+
+    required:
+      - port at 0
+      - port at 1
+
 required:
   - compatible
   - reg
-- 
2.46.0



From angelogioacchino.delregno at collabora.com  Tue Sep 10 03:51:14 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Tue, 10 Sep 2024 10:51:14 +0000
Subject: [PATCH v10 2/3] dt-bindings: arm: mediatek: mmsys: Add OF graph support for board path
In-Reply-To: <20240910105054.125005-1-angelogioacchino.delregno@collabora.com>
References: <20240910105054.125005-1-angelogioacchino.delregno@collabora.com>
Message-ID: <01020191db8f1c5b-75771ca6-ad57-4568-96c9-b97353248de2-000000@eu-west-1.amazonses.com>

Document OF graph on MMSYS/VDOSYS: this supports up to three DDP paths
per HW instance (so potentially up to six displays for multi-vdo SoCs).

The MMSYS or VDOSYS is always the first component in the DDP pipeline,
so it only supports an output port with multiple endpoints - where each
endpoint defines the starting point for one of the (currently three)
possible hardware paths.

Reviewed-by: Rob Herring (Arm) <robh at kernel.org>
Reviewed-by: Alexandre Mergnat <amergnat at baylibre.com>
Tested-by: Alexandre Mergnat <amergnat at baylibre.com>
Reviewed-by: CK Hu <ck.hu at mediatek.com>
Tested-by: Michael Walle <mwalle at kernel.org> # on kontron-sbc-i1200
Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
---
 .../bindings/arm/mediatek/mediatek,mmsys.yaml | 28 +++++++++++++++++++
 1 file changed, 28 insertions(+)

diff --git a/Documentation/devicetree/bindings/arm/mediatek/mediatek,mmsys.yaml b/Documentation/devicetree/bindings/arm/mediatek/mediatek,mmsys.yaml
index b3c6888c1457..3f4262e93c78 100644
--- a/Documentation/devicetree/bindings/arm/mediatek/mediatek,mmsys.yaml
+++ b/Documentation/devicetree/bindings/arm/mediatek/mediatek,mmsys.yaml
@@ -93,6 +93,34 @@ properties:
   '#reset-cells':
     const: 1
 
+  port:
+    $ref: /schemas/graph.yaml#/properties/port
+    description:
+      Output port node. This port connects the MMSYS/VDOSYS output to
+      the first component of one display pipeline, for example one of
+      the available OVL or RDMA blocks.
+      Some MediaTek SoCs support multiple display outputs per MMSYS.
+    properties:
+      endpoint at 0:
+        $ref: /schemas/graph.yaml#/properties/endpoint
+        description: Output to the primary display pipeline
+
+      endpoint at 1:
+        $ref: /schemas/graph.yaml#/properties/endpoint
+        description: Output to the secondary display pipeline
+
+      endpoint at 2:
+        $ref: /schemas/graph.yaml#/properties/endpoint
+        description: Output to the tertiary display pipeline
+
+    anyOf:
+      - required:
+          - endpoint at 0
+      - required:
+          - endpoint at 1
+      - required:
+          - endpoint at 2
+
 required:
   - compatible
   - reg
-- 
2.46.0



From angelogioacchino.delregno at collabora.com  Tue Sep 10 03:51:16 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Tue, 10 Sep 2024 10:51:16 +0000
Subject: [PATCH v10 3/3] drm/mediatek: Implement OF graphs support for display paths
In-Reply-To: <20240910105054.125005-1-angelogioacchino.delregno@collabora.com>
References: <20240910105054.125005-1-angelogioacchino.delregno@collabora.com>
Message-ID: <01020191db8f22cd-0f5d733b-420e-453c-8607-a3e9f70f32d6-000000@eu-west-1.amazonses.com>

It is impossible to add each and every possible DDP path combination
for each and every possible combination of SoC and board: right now,
this driver hardcodes configuration for 10 SoCs and this is going to
grow larger and larger, and with new hacks like the introduction of
mtk_drm_route which is anyway not enough for all final routes as the
DSI cannot be connected to MERGE if it's not a dual-DSI, or enabling
DSC preventively doesn't work if the display doesn't support it, or
others.

Since practically all display IPs in MediaTek SoCs support being
interconnected with different instances of other, or the same, IPs
or with different IPs and in different combinations, the final DDP
pipeline is effectively a board specific configuration.

Implement OF graphs support to the mediatek-drm drivers, allowing to
stop hardcoding the paths, and preventing this driver to get a huge
amount of arrays for each board and SoC combination, also paving the
way to share the same mtk_mmsys_driver_data between multiple SoCs,
making it more straightforward to add support for new chips.

Reviewed-by: Alexandre Mergnat <amergnat at baylibre.com>
Tested-by: Alexandre Mergnat <amergnat at baylibre.com>
Acked-by: Sui Jingfeng <sui.jingfeng at linux.dev>
Tested-by: Michael Walle <mwalle at kernel.org> # on kontron-sbc-i1200
Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
---
 drivers/gpu/drm/mediatek/mtk_disp_drv.h       |   1 +
 .../gpu/drm/mediatek/mtk_disp_ovl_adaptor.c   |  40 ++-
 drivers/gpu/drm/mediatek/mtk_dpi.c            |  21 +-
 drivers/gpu/drm/mediatek/mtk_drm_drv.c        | 253 +++++++++++++++++-
 drivers/gpu/drm/mediatek/mtk_drm_drv.h        |   2 +-
 drivers/gpu/drm/mediatek/mtk_dsi.c            |  14 +-
 6 files changed, 309 insertions(+), 22 deletions(-)

diff --git a/drivers/gpu/drm/mediatek/mtk_disp_drv.h b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
index 082ac18fe04a..94843974851f 100644
--- a/drivers/gpu/drm/mediatek/mtk_disp_drv.h
+++ b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
@@ -108,6 +108,7 @@ size_t mtk_ovl_get_num_formats(struct device *dev);
 
 void mtk_ovl_adaptor_add_comp(struct device *dev, struct mtk_mutex *mutex);
 void mtk_ovl_adaptor_remove_comp(struct device *dev, struct mtk_mutex *mutex);
+bool mtk_ovl_adaptor_is_comp_present(struct device_node *node);
 void mtk_ovl_adaptor_connect(struct device *dev, struct device *mmsys_dev,
 			     unsigned int next);
 void mtk_ovl_adaptor_disconnect(struct device *dev, struct device *mmsys_dev,
diff --git a/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c b/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c
index c6768210b08b..e9dc89764495 100644
--- a/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c
+++ b/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c
@@ -490,6 +490,38 @@ static int compare_of(struct device *dev, void *data)
 	return dev->of_node == data;
 }
 
+static int ovl_adaptor_of_get_ddp_comp_type(struct device_node *node,
+					    enum mtk_ovl_adaptor_comp_type *ctype)
+{
+	const struct of_device_id *of_id = of_match_node(mtk_ovl_adaptor_comp_dt_ids, node);
+
+	if (!of_id)
+		return -EINVAL;
+
+	*ctype = (enum mtk_ovl_adaptor_comp_type)((uintptr_t)of_id->data);
+
+	return 0;
+}
+
+bool mtk_ovl_adaptor_is_comp_present(struct device_node *node)
+{
+	enum mtk_ovl_adaptor_comp_type type;
+	int ret;
+
+	ret = ovl_adaptor_of_get_ddp_comp_type(node, &type);
+	if (ret)
+		return false;
+
+	if (type >= OVL_ADAPTOR_TYPE_NUM)
+		return false;
+
+	/*
+	 * ETHDR and Padding are used exclusively in OVL Adaptor: if this
+	 * component is not one of those, it's likely not an OVL Adaptor path.
+	 */
+	return type == OVL_ADAPTOR_TYPE_ETHDR || type == OVL_ADAPTOR_TYPE_PADDING;
+}
+
 static int ovl_adaptor_comp_init(struct device *dev, struct component_match **match)
 {
 	struct mtk_disp_ovl_adaptor *priv = dev_get_drvdata(dev);
@@ -499,12 +531,11 @@ static int ovl_adaptor_comp_init(struct device *dev, struct component_match **ma
 	parent = dev->parent->parent->of_node->parent;
 
 	for_each_child_of_node_scoped(parent, node) {
-		const struct of_device_id *of_id;
 		enum mtk_ovl_adaptor_comp_type type;
-		int id;
+		int id, ret;
 
-		of_id = of_match_node(mtk_ovl_adaptor_comp_dt_ids, node);
-		if (!of_id)
+		ret = ovl_adaptor_of_get_ddp_comp_type(node, &type);
+		if (ret)
 			continue;
 
 		if (!of_device_is_available(node)) {
@@ -513,7 +544,6 @@ static int ovl_adaptor_comp_init(struct device *dev, struct component_match **ma
 			continue;
 		}
 
-		type = (enum mtk_ovl_adaptor_comp_type)(uintptr_t)of_id->data;
 		id = ovl_adaptor_comp_get_id(dev, node, type);
 		if (id < 0) {
 			dev_warn(dev, "Skipping unknown component %pOF\n",
diff --git a/drivers/gpu/drm/mediatek/mtk_dpi.c b/drivers/gpu/drm/mediatek/mtk_dpi.c
index a08d20654954..20a9d589fd75 100644
--- a/drivers/gpu/drm/mediatek/mtk_dpi.c
+++ b/drivers/gpu/drm/mediatek/mtk_dpi.c
@@ -704,6 +704,20 @@ static int mtk_dpi_bridge_attach(struct drm_bridge *bridge,
 				 enum drm_bridge_attach_flags flags)
 {
 	struct mtk_dpi *dpi = bridge_to_dpi(bridge);
+	int ret;
+
+	dpi->next_bridge = devm_drm_of_get_bridge(dpi->dev, dpi->dev->of_node, 1, -1);
+	if (IS_ERR(dpi->next_bridge)) {
+		ret = PTR_ERR(dpi->next_bridge);
+		if (ret == -EPROBE_DEFER)
+			return ret;
+
+		/* Old devicetree has only one endpoint */
+		dpi->next_bridge = devm_drm_of_get_bridge(dpi->dev, dpi->dev->of_node, 0, 0);
+		if (IS_ERR(dpi->next_bridge))
+			return dev_err_probe(dpi->dev, PTR_ERR(dpi->next_bridge),
+					     "Failed to get bridge\n");
+	}
 
 	return drm_bridge_attach(bridge->encoder, dpi->next_bridge,
 				 &dpi->bridge, flags);
@@ -1058,13 +1072,6 @@ static int mtk_dpi_probe(struct platform_device *pdev)
 	if (dpi->irq < 0)
 		return dpi->irq;
 
-	dpi->next_bridge = devm_drm_of_get_bridge(dev, dev->of_node, 0, 0);
-	if (IS_ERR(dpi->next_bridge))
-		return dev_err_probe(dev, PTR_ERR(dpi->next_bridge),
-				     "Failed to get bridge\n");
-
-	dev_info(dev, "Found bridge node: %pOF\n", dpi->next_bridge->of_node);
-
 	platform_set_drvdata(pdev, dpi);
 
 	dpi->bridge.funcs = &mtk_dpi_bridge_funcs;
diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.c b/drivers/gpu/drm/mediatek/mtk_drm_drv.c
index 3e807195a0d0..6cff020a1bf8 100644
--- a/drivers/gpu/drm/mediatek/mtk_drm_drv.c
+++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.c
@@ -26,6 +26,7 @@
 
 #include "mtk_crtc.h"
 #include "mtk_ddp_comp.h"
+#include "mtk_disp_drv.h"
 #include "mtk_drm_drv.h"
 #include "mtk_gem.h"
 
@@ -818,12 +819,235 @@ static const struct of_device_id mtk_ddp_comp_dt_ids[] = {
 	{ }
 };
 
+static int mtk_drm_of_get_ddp_comp_type(struct device_node *node, enum mtk_ddp_comp_type *ctype)
+{
+	const struct of_device_id *of_id = of_match_node(mtk_ddp_comp_dt_ids, node);
+
+	if (!of_id)
+		return -EINVAL;
+
+	*ctype = (enum mtk_ddp_comp_type)((uintptr_t)of_id->data);
+
+	return 0;
+}
+
+static int mtk_drm_of_get_ddp_ep_cid(struct device_node *node,
+				     int output_port, enum mtk_crtc_path crtc_path,
+				     struct device_node **next, unsigned int *cid)
+{
+	struct device_node *ep_dev_node, *ep_out;
+	enum mtk_ddp_comp_type comp_type;
+	int ret;
+
+	ep_out = of_graph_get_endpoint_by_regs(node, output_port, crtc_path);
+	if (!ep_out)
+		return -ENOENT;
+
+	ep_dev_node = of_graph_get_remote_port_parent(ep_out);
+	of_node_put(ep_out);
+	if (!ep_dev_node)
+		return -EINVAL;
+
+	/*
+	 * Pass the next node pointer regardless of failures in the later code
+	 * so that if this function is called in a loop it will walk through all
+	 * of the subsequent endpoints anyway.
+	 */
+	*next = ep_dev_node;
+
+	if (!of_device_is_available(ep_dev_node))
+		return -ENODEV;
+
+	ret = mtk_drm_of_get_ddp_comp_type(ep_dev_node, &comp_type);
+	if (ret) {
+		if (mtk_ovl_adaptor_is_comp_present(ep_dev_node)) {
+			*cid = (unsigned int)DDP_COMPONENT_DRM_OVL_ADAPTOR;
+			return 0;
+		}
+		return ret;
+	}
+
+	ret = mtk_ddp_comp_get_id(ep_dev_node, comp_type);
+	if (ret < 0)
+		return ret;
+
+	/* All ok! Pass the Component ID to the caller. */
+	*cid = (unsigned int)ret;
+
+	return 0;
+}
+
+/**
+ * mtk_drm_of_ddp_path_build_one - Build a Display HW Pipeline for a CRTC Path
+ * @dev:          The mediatek-drm device
+ * @cpath:        CRTC Path relative to a VDO or MMSYS
+ * @out_path:     Pointer to an array that will contain the new pipeline
+ * @out_path_len: Number of entries in the pipeline array
+ *
+ * MediaTek SoCs can use different DDP hardware pipelines (or paths) depending
+ * on the board-specific desired display configuration; this function walks
+ * through all of the output endpoints starting from a VDO or MMSYS hardware
+ * instance and builds the right pipeline as specified in device trees.
+ *
+ * Return:
+ * * %0       - Display HW Pipeline successfully built and validated
+ * * %-ENOENT - Display pipeline was not specified in device tree
+ * * %-EINVAL - Display pipeline built but validation failed
+ * * %-ENOMEM - Failure to allocate pipeline array to pass to the caller
+ */
+static int mtk_drm_of_ddp_path_build_one(struct device *dev, enum mtk_crtc_path cpath,
+					 const unsigned int **out_path,
+					 unsigned int *out_path_len)
+{
+	struct device_node *next, *prev, *vdo = dev->parent->of_node;
+	unsigned int temp_path[DDP_COMPONENT_DRM_ID_MAX] = { 0 };
+	unsigned int *final_ddp_path;
+	unsigned short int idx = 0;
+	bool ovl_adaptor_comp_added = false;
+	int ret;
+
+	/* Get the first entry for the temp_path array */
+	ret = mtk_drm_of_get_ddp_ep_cid(vdo, 0, cpath, &next, &temp_path[idx]);
+	if (ret) {
+		if (next && temp_path[idx] == DDP_COMPONENT_DRM_OVL_ADAPTOR) {
+			dev_dbg(dev, "Adding OVL Adaptor for %pOF\n", next);
+			ovl_adaptor_comp_added = true;
+		} else {
+			if (next)
+				dev_err(dev, "Invalid component %pOF\n", next);
+			else
+				dev_err(dev, "Cannot find first endpoint for path %d\n", cpath);
+
+			return ret;
+		}
+	}
+	idx++;
+
+	/*
+	 * Walk through port outputs until we reach the last valid mediatek-drm component.
+	 * To be valid, this must end with an "invalid" component that is a display node.
+	 */
+	do {
+		prev = next;
+		ret = mtk_drm_of_get_ddp_ep_cid(next, 1, cpath, &next, &temp_path[idx]);
+		of_node_put(prev);
+		if (ret) {
+			of_node_put(next);
+			break;
+		}
+
+		/*
+		 * If this is an OVL adaptor exclusive component and one of those
+		 * was already added, don't add another instance of the generic
+		 * DDP_COMPONENT_OVL_ADAPTOR, as this is used only to decide whether
+		 * to probe that component master driver of which only one instance
+		 * is needed and possible.
+		 */
+		if (temp_path[idx] == DDP_COMPONENT_DRM_OVL_ADAPTOR) {
+			if (!ovl_adaptor_comp_added)
+				ovl_adaptor_comp_added = true;
+			else
+				idx--;
+		}
+	} while (++idx < DDP_COMPONENT_DRM_ID_MAX);
+
+	/*
+	 * The device component might not be enabled: in that case, don't
+	 * check the last entry and just report that the device is missing.
+	 */
+	if (ret == -ENODEV)
+		return ret;
+
+	/* If the last entry is not a final display output, the configuration is wrong */
+	switch (temp_path[idx - 1]) {
+	case DDP_COMPONENT_DP_INTF0:
+	case DDP_COMPONENT_DP_INTF1:
+	case DDP_COMPONENT_DPI0:
+	case DDP_COMPONENT_DPI1:
+	case DDP_COMPONENT_DSI0:
+	case DDP_COMPONENT_DSI1:
+	case DDP_COMPONENT_DSI2:
+	case DDP_COMPONENT_DSI3:
+		break;
+	default:
+		dev_err(dev, "Invalid display hw pipeline. Last component: %d (ret=%d)\n",
+			temp_path[idx - 1], ret);
+		return -EINVAL;
+	}
+
+	final_ddp_path = devm_kmemdup(dev, temp_path, idx * sizeof(temp_path[0]), GFP_KERNEL);
+	if (!final_ddp_path)
+		return -ENOMEM;
+
+	dev_dbg(dev, "Display HW Pipeline built with %d components.\n", idx);
+
+	/* Pipeline built! */
+	*out_path = final_ddp_path;
+	*out_path_len = idx;
+
+	return 0;
+}
+
+static int mtk_drm_of_ddp_path_build(struct device *dev, struct device_node *node,
+				     struct mtk_mmsys_driver_data *data)
+{
+	struct device_node *ep_node;
+	struct of_endpoint of_ep;
+	bool output_present[MAX_CRTC] = { false };
+	int ret;
+
+	for_each_endpoint_of_node(node, ep_node) {
+		ret = of_graph_parse_endpoint(ep_node, &of_ep);
+		if (ret) {
+			dev_err_probe(dev, ret, "Cannot parse endpoint\n");
+			break;
+		}
+
+		if (of_ep.id >= MAX_CRTC) {
+			ret = dev_err_probe(dev, -EINVAL,
+					    "Invalid endpoint%u number\n", of_ep.port);
+			break;
+		}
+
+		output_present[of_ep.id] = true;
+	}
+
+	if (ret) {
+		of_node_put(ep_node);
+		return ret;
+	}
+
+	if (output_present[CRTC_MAIN]) {
+		ret = mtk_drm_of_ddp_path_build_one(dev, CRTC_MAIN,
+						    &data->main_path, &data->main_len);
+		if (ret && ret != -ENODEV)
+			return ret;
+	}
+
+	if (output_present[CRTC_EXT]) {
+		ret = mtk_drm_of_ddp_path_build_one(dev, CRTC_EXT,
+						    &data->ext_path, &data->ext_len);
+		if (ret && ret != -ENODEV)
+			return ret;
+	}
+
+	if (output_present[CRTC_THIRD]) {
+		ret = mtk_drm_of_ddp_path_build_one(dev, CRTC_THIRD,
+						    &data->third_path, &data->third_len);
+		if (ret && ret != -ENODEV)
+			return ret;
+	}
+
+	return 0;
+}
+
 static int mtk_drm_probe(struct platform_device *pdev)
 {
 	struct device *dev = &pdev->dev;
 	struct device_node *phandle = dev->parent->of_node;
 	const struct of_device_id *of_id;
 	struct mtk_drm_private *private;
+	struct mtk_mmsys_driver_data *mtk_drm_data;
 	struct device_node *node;
 	struct component_match *match = NULL;
 	struct platform_device *ovl_adaptor;
@@ -844,7 +1068,27 @@ static int mtk_drm_probe(struct platform_device *pdev)
 	if (!of_id)
 		return -ENODEV;
 
-	private->data = of_id->data;
+	mtk_drm_data = (struct mtk_mmsys_driver_data *)of_id->data;
+	if (!mtk_drm_data)
+		return -EINVAL;
+
+	/* Try to build the display pipeline from devicetree graphs */
+	if (of_graph_is_present(phandle)) {
+		dev_dbg(dev, "Building display pipeline for MMSYS %u\n",
+			mtk_drm_data->mmsys_id);
+		private->data = devm_kmemdup(dev, mtk_drm_data,
+					     sizeof(*mtk_drm_data), GFP_KERNEL);
+		if (!private->data)
+			return -ENOMEM;
+
+		ret = mtk_drm_of_ddp_path_build(dev, phandle, private->data);
+		if (ret)
+			return ret;
+	} else {
+		/* No devicetree graphs support: go with hardcoded paths if present */
+		dev_dbg(dev, "Using hardcoded paths for MMSYS %u\n", mtk_drm_data->mmsys_id);
+		private->data = mtk_drm_data;
+	};
 
 	private->all_drm_private = devm_kmalloc_array(dev, private->data->mmsys_dev_num,
 						      sizeof(*private->all_drm_private),
@@ -866,12 +1110,11 @@ static int mtk_drm_probe(struct platform_device *pdev)
 
 	/* Iterate over sibling DISP function blocks */
 	for_each_child_of_node(phandle->parent, node) {
-		const struct of_device_id *of_id;
 		enum mtk_ddp_comp_type comp_type;
 		int comp_id;
 
-		of_id = of_match_node(mtk_ddp_comp_dt_ids, node);
-		if (!of_id)
+		ret = mtk_drm_of_get_ddp_comp_type(node, &comp_type);
+		if (ret)
 			continue;
 
 		if (!of_device_is_available(node)) {
@@ -880,8 +1123,6 @@ static int mtk_drm_probe(struct platform_device *pdev)
 			continue;
 		}
 
-		comp_type = (enum mtk_ddp_comp_type)(uintptr_t)of_id->data;
-
 		if (comp_type == MTK_DISP_MUTEX) {
 			int id;
 
diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.h b/drivers/gpu/drm/mediatek/mtk_drm_drv.h
index ce897984de51..675cdc90a440 100644
--- a/drivers/gpu/drm/mediatek/mtk_drm_drv.h
+++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.h
@@ -63,7 +63,7 @@ struct mtk_drm_private {
 	struct device *mmsys_dev;
 	struct device_node *comp_node[DDP_COMPONENT_DRM_ID_MAX];
 	struct mtk_ddp_comp ddp_comp[DDP_COMPONENT_DRM_ID_MAX];
-	const struct mtk_mmsys_driver_data *data;
+	struct mtk_mmsys_driver_data *data;
 	struct drm_atomic_state *suspend_state;
 	unsigned int mbox_index;
 	struct mtk_drm_private **all_drm_private;
diff --git a/drivers/gpu/drm/mediatek/mtk_dsi.c b/drivers/gpu/drm/mediatek/mtk_dsi.c
index eeec641cab60..33ceeb8d6925 100644
--- a/drivers/gpu/drm/mediatek/mtk_dsi.c
+++ b/drivers/gpu/drm/mediatek/mtk_dsi.c
@@ -988,9 +988,17 @@ static int mtk_dsi_host_attach(struct mipi_dsi_host *host,
 	dsi->lanes = device->lanes;
 	dsi->format = device->format;
 	dsi->mode_flags = device->mode_flags;
-	dsi->next_bridge = devm_drm_of_get_bridge(dev, dev->of_node, 0, 0);
-	if (IS_ERR(dsi->next_bridge))
-		return PTR_ERR(dsi->next_bridge);
+	dsi->next_bridge = devm_drm_of_get_bridge(dev, dev->of_node, 1, 0);
+	if (IS_ERR(dsi->next_bridge)) {
+		ret = PTR_ERR(dsi->next_bridge);
+		if (ret == -EPROBE_DEFER)
+			return ret;
+
+		/* Old devicetree has only one endpoint */
+		dsi->next_bridge = devm_drm_of_get_bridge(dev, dev->of_node, 0, 0);
+		if (IS_ERR(dsi->next_bridge))
+			return PTR_ERR(dsi->next_bridge);
+	}
 
 	drm_bridge_add(&dsi->bridge);
 
-- 
2.46.0



From angelogioacchino.delregno at collabora.com  Tue Sep 10 03:52:20 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Tue, 10 Sep 2024 10:52:20 +0000
Subject: [PATCH v2] arm64: dts: mt8183: set DMIC one-wire mode on Damu
In-Reply-To: <20240910-one-wire-v2-1-2bb40d5a3cf8@chromium.org>
References: <20240910-one-wire-v2-1-2bb40d5a3cf8@chromium.org>
Message-ID: <01020191db901d32-5c318445-b8f4-4f4d-86db-316dc0db04ec-000000@eu-west-1.amazonses.com>

Il 10/09/24 10:47, Hsin-Te Yuan ha scritto:
> From: Hsin-Yi Wang <hsinyi at chromium.org>
> 
> Sets DMIC one-wire mode on Damu.
> 
> Fixes: cabc71b08eb5 ("arm64: dts: mt8183: Add kukui-jacuzzi-damu board")
> Signed-off-by: Hsin-Te Yuan <yuanhsinte at chromium.org>

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>




From fshao at chromium.org  Tue Sep 10 04:06:43 2024
From: fshao at chromium.org (Fei Shao)
Date: Tue, 10 Sep 2024 19:06:43 +0800
Subject: [PATCH 06/13] arm64: dts: mediatek: mt8188: Update VPPSYS node
 name and compatible
In-Reply-To: <64cc35c8-30df-4882-a933-f42119270f48@kernel.org>
References: <20240909111535.528624-1-fshao@chromium.org> <20240909111535.528624-7-fshao@chromium.org>
 <11bc2522-bc10-4dcf-8142-708b57d181cf@kernel.org> <CAC=S1nhiJ=7yAucJsaYKUUBrwrxOVBMB2CF=bFwyLa2o-5RmWw@mail.gmail.com>
 <64cc35c8-30df-4882-a933-f42119270f48@kernel.org>
Message-ID: <CAC=S1ni+pJJZhbjvVqhba5u1JqGv=dZTv8+KH4xburea2AG4Qg@mail.gmail.com>

On Tue, Sep 10, 2024 at 3:19?PM Krzysztof Kozlowski <krzk at kernel.org> wrote:
>
> On 10/09/2024 07:12, Fei Shao wrote:
> > On Mon, Sep 9, 2024 at 7:41?PM Krzysztof Kozlowski <krzk at kernel.org> wrote:
> >>
> >> On 09/09/2024 13:14, Fei Shao wrote:
> >>> Use and add "syscon" in VPPSYS node names and compatible to fix errors
> >>> from `make CHECK_DTBS=y mediatek/mt8188-evb.dtb`.
> >>>
> >>> Signed-off-by: Fei Shao <fshao at chromium.org>
> >>> ---
> >>>
> >>>  arch/arm64/boot/dts/mediatek/mt8188.dtsi | 8 ++++----
> >>>  1 file changed, 4 insertions(+), 4 deletions(-)
> >>>
> >>> diff --git a/arch/arm64/boot/dts/mediatek/mt8188.dtsi b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
> >>> index 2900d78b7ceb..14e51a11f688 100644
> >>> --- a/arch/arm64/boot/dts/mediatek/mt8188.dtsi
> >>> +++ b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
> >>> @@ -1799,8 +1799,8 @@ mfgcfg: clock-controller at 13fbf000 {
> >>>                       #clock-cells = <1>;
> >>>               };
> >>>
> >>> -             vppsys0: clock-controller at 14000000 {
> >>> -                     compatible = "mediatek,mt8188-vppsys0";
> >>> +             vppsys0: syscon at 14000000 {
> >>> +                     compatible = "mediatek,mt8188-vppsys0", "syscon";
> >>
> >> If this was working before, it looks like this is not a syscon and
> >> bindings need to be fixed.
> >
> > I guess it's because the binding was later updated in commit
> > 26bcd8a53098 ("dt-bindings: arm: mediatek: mmsys: Add VPPSYS
> > compatible for MT8188"), and the corresponding DT update was unnoticed
> > at the time.
> > If that makes sense then this should be a valid fix.
>
> Not necessarily. Why not fixing bindings? Prove that bindings are
> correct, not DTS, first.

MediaTek's mmsys doesn't merely control clocks, it also provides
display pipeline routing control and other misc control registers, so
it's appropriate to categorize it as a system controller over a clock
controller.
As for vdosys and vppsys, they are likely variants or aliases of mmsys
introduced in their newer SoCs.

That description was updated in commit 1a680aa888d6 ("dt-bindings:
mediatek: Update mmsys binding to reflect it is a system controller"),
so I just assumed it's correct without thinking much...

Regards,
Fei


From alexander.sverdlin at siemens.com  Tue Sep 10 06:03:14 2024
From: alexander.sverdlin at siemens.com (A. Sverdlin)
Date: Tue, 10 Sep 2024 15:03:14 +0200
Subject: [PATCH 0/2] net: dsa: RCU-protect dsa_ptr in struct net_device
Message-ID: <20240910130321.337154-1-alexander.sverdlin@siemens.com>

From: Alexander Sverdlin <alexander.sverdlin at siemens.com>

There are multiple races of zeroing dsa_ptr in struct net_device (on
shutdown/remove) against asynchronous dereferences all over the net
code. Widespread pattern is as follows:

CPU0					CPU1
if (netdev_uses_dsa())
					dev->dsa_ptr = NULL;
        dev->dsa_ptr->...

RCU-protect the dsa_ptr and ajust the documentation where unsafe patterns
were mentioned.

The first patch has been compiled with ARCH=arm64 and allyesconfig against
v6.11-rc6. Backported to v6.1 and tested on arm64 HW with LAN9303 switch
(where the issue was initially reproduced), including LOCKDEP and
PROVE_RCU. Therefore I will be able to provide v6.1 backport (for -stable
purposes) and later v6.8 backport as well.

Alexander Sverdlin (2):
  net: dsa: RCU-protect dsa_ptr in struct net_device
  docs: net: dsa: RCU protection of dsa_ptr in struct net_device

 Documentation/networking/dsa/dsa.rst        |  18 ++--
 drivers/net/dsa/mt7530.c                    |   3 +-
 drivers/net/dsa/ocelot/felix.c              |   3 +-
 drivers/net/dsa/qca/qca8k-8xxx.c            |   3 +-
 drivers/net/ethernet/broadcom/bcmsysport.c  |   8 +-
 drivers/net/ethernet/mediatek/airoha_eth.c  |   2 +-
 drivers/net/ethernet/mediatek/mtk_eth_soc.c |  22 +++--
 drivers/net/ethernet/mediatek/mtk_ppe.c     |  15 ++-
 include/linux/netdevice.h                   |   2 +-
 include/net/dsa.h                           |  36 +++++--
 include/net/dsa_stubs.h                     |   6 +-
 net/bridge/br_input.c                       |   2 +-
 net/core/dev.c                              |   3 +-
 net/core/flow_dissector.c                   |  19 ++--
 net/dsa/conduit.c                           |  66 ++++++++-----
 net/dsa/dsa.c                               |  19 ++--
 net/dsa/port.c                              |   3 +-
 net/dsa/tag.c                               |   3 +-
 net/dsa/tag.h                               |  19 ++--
 net/dsa/tag_8021q.c                         |  10 +-
 net/dsa/tag_brcm.c                          |   2 +-
 net/dsa/tag_dsa.c                           |   8 +-
 net/dsa/tag_qca.c                           |  10 +-
 net/dsa/tag_sja1105.c                       |  22 +++--
 net/dsa/user.c                              | 104 +++++++++++---------
 net/ethernet/eth.c                          |   2 +-
 26 files changed, 249 insertions(+), 161 deletions(-)

-- 
2.46.0



From alexander.sverdlin at siemens.com  Tue Sep 10 06:03:15 2024
From: alexander.sverdlin at siemens.com (A. Sverdlin)
Date: Tue, 10 Sep 2024 15:03:15 +0200
Subject: [PATCH 1/2] net: dsa: RCU-protect dsa_ptr in struct net_device
In-Reply-To: <20240910130321.337154-1-alexander.sverdlin@siemens.com>
References: <20240910130321.337154-1-alexander.sverdlin@siemens.com>
Message-ID: <20240910130321.337154-2-alexander.sverdlin@siemens.com>

From: Alexander Sverdlin <alexander.sverdlin at siemens.com>

There are multiple races of zeroing dsa_ptr in struct net_device (on
shutdown/remove) against asynchronous dereferences all over the net
code. Widespread pattern is as follows:

CPU0					CPU1
if (netdev_uses_dsa())
					dev->dsa_ptr = NULL;
        dev->dsa_ptr->...

One of the possible crashes:

Unable to handle kernel NULL pointer dereference at virtual address 0000000000000010
CPU: 0 PID: 12 Comm: ksoftirqd/0 Tainted: G O 6.1.99+ #1
pc : lan9303_rcv
lr : lan9303_rcv
Call trace:
 lan9303_rcv
 dsa_switch_rcv
 __netif_receive_skb_list_core
 netif_receive_skb_list_internal
 napi_gro_receive
 fec_enet_rx_napi
 __napi_poll
 net_rx_action
...

RCU-protect dsa_ptr and use rcu_dereference() or rtnl_dereference()
depending on the calling context.

Rename netdev_uses_dsa() into __netdev_uses_dsa_currently()
(assumes ether RCU or RTNL lock held) and netdev_uses_dsa_currently()
variants which better reflect the uselessness of the function's
return value, which becomes outdated right after the call.

Fixes: ee534378f005 ("net: dsa: fix panic when DSA master device unbinds on shutdown")
Cc: stable at vger.kernel.org
Signed-off-by: Alexander Sverdlin <alexander.sverdlin at siemens.com>
---
 drivers/net/dsa/mt7530.c                    |   3 +-
 drivers/net/dsa/ocelot/felix.c              |   3 +-
 drivers/net/dsa/qca/qca8k-8xxx.c            |   3 +-
 drivers/net/ethernet/broadcom/bcmsysport.c  |   8 +-
 drivers/net/ethernet/mediatek/airoha_eth.c  |   2 +-
 drivers/net/ethernet/mediatek/mtk_eth_soc.c |  22 +++--
 drivers/net/ethernet/mediatek/mtk_ppe.c     |  15 ++-
 include/linux/netdevice.h                   |   2 +-
 include/net/dsa.h                           |  36 +++++--
 include/net/dsa_stubs.h                     |   6 +-
 net/bridge/br_input.c                       |   2 +-
 net/core/dev.c                              |   3 +-
 net/core/flow_dissector.c                   |  19 ++--
 net/dsa/conduit.c                           |  66 ++++++++-----
 net/dsa/dsa.c                               |  19 ++--
 net/dsa/port.c                              |   3 +-
 net/dsa/tag.c                               |   3 +-
 net/dsa/tag.h                               |  19 ++--
 net/dsa/tag_8021q.c                         |  10 +-
 net/dsa/tag_brcm.c                          |   2 +-
 net/dsa/tag_dsa.c                           |   8 +-
 net/dsa/tag_qca.c                           |  10 +-
 net/dsa/tag_sja1105.c                       |  22 +++--
 net/dsa/user.c                              | 104 +++++++++++---------
 net/ethernet/eth.c                          |   2 +-
 25 files changed, 240 insertions(+), 152 deletions(-)

diff --git a/drivers/net/dsa/mt7530.c b/drivers/net/dsa/mt7530.c
index ec18e68bf3a8..82d3f1786156 100644
--- a/drivers/net/dsa/mt7530.c
+++ b/drivers/net/dsa/mt7530.c
@@ -20,6 +20,7 @@
 #include <linux/reset.h>
 #include <linux/gpio/consumer.h>
 #include <linux/gpio/driver.h>
+#include <linux/rtnetlink.h>
 #include <net/dsa.h>
 
 #include "mt7530.h"
@@ -3092,7 +3093,7 @@ mt753x_conduit_state_change(struct dsa_switch *ds,
 			    const struct net_device *conduit,
 			    bool operational)
 {
-	struct dsa_port *cpu_dp = conduit->dsa_ptr;
+	struct dsa_port *cpu_dp = rtnl_dereference(conduit->dsa_ptr);
 	struct mt7530_priv *priv = ds->priv;
 	int val = 0;
 	u8 mask;
diff --git a/drivers/net/dsa/ocelot/felix.c b/drivers/net/dsa/ocelot/felix.c
index 4a705f7333f4..f6bc0ff0c116 100644
--- a/drivers/net/dsa/ocelot/felix.c
+++ b/drivers/net/dsa/ocelot/felix.c
@@ -21,6 +21,7 @@
 #include <linux/of_net.h>
 #include <linux/pci.h>
 #include <linux/of.h>
+#include <linux/rtnetlink.h>
 #include <net/pkt_sched.h>
 #include <net/dsa.h>
 #include "felix.h"
@@ -57,7 +58,7 @@ static int felix_cpu_port_for_conduit(struct dsa_switch *ds,
 		return lag;
 	}
 
-	cpu_dp = conduit->dsa_ptr;
+	cpu_dp = rtnl_dereference(conduit->dsa_ptr);
 	return cpu_dp->index;
 }
 
diff --git a/drivers/net/dsa/qca/qca8k-8xxx.c b/drivers/net/dsa/qca/qca8k-8xxx.c
index f8d8c70642c4..10b4d7e9be2f 100644
--- a/drivers/net/dsa/qca/qca8k-8xxx.c
+++ b/drivers/net/dsa/qca/qca8k-8xxx.c
@@ -20,6 +20,7 @@
 #include <linux/gpio/consumer.h>
 #include <linux/etherdevice.h>
 #include <linux/dsa/tag_qca.h>
+#include <linux/rtnetlink.h>
 
 #include "qca8k.h"
 #include "qca8k_leds.h"
@@ -1754,7 +1755,7 @@ static void
 qca8k_conduit_change(struct dsa_switch *ds, const struct net_device *conduit,
 		     bool operational)
 {
-	struct dsa_port *dp = conduit->dsa_ptr;
+	struct dsa_port *dp = rtnl_dereference(conduit->dsa_ptr);
 	struct qca8k_priv *priv = ds->priv;
 
 	/* Ethernet MIB/MDIO is only supported for CPU port 0 */
diff --git a/drivers/net/ethernet/broadcom/bcmsysport.c b/drivers/net/ethernet/broadcom/bcmsysport.c
index c9faa8540859..bd9bc081346d 100644
--- a/drivers/net/ethernet/broadcom/bcmsysport.c
+++ b/drivers/net/ethernet/broadcom/bcmsysport.c
@@ -145,7 +145,7 @@ static void bcm_sysport_set_rx_csum(struct net_device *dev,
 	 * sure we tell the RXCHK hardware to expect a 4-bytes Broadcom
 	 * tag after the Ethernet MAC Source Address.
 	 */
-	if (netdev_uses_dsa(dev))
+	if (__netdev_uses_dsa_currently(dev))
 		reg |= RXCHK_BRCM_TAG_EN;
 	else
 		reg &= ~RXCHK_BRCM_TAG_EN;
@@ -173,7 +173,7 @@ static void bcm_sysport_set_tx_csum(struct net_device *dev,
 	 * checksum to be computed correctly when using VLAN HW acceleration,
 	 * else it has no effect, so it can always be turned on.
 	 */
-	if (netdev_uses_dsa(dev))
+	if (__netdev_uses_dsa_currently(dev))
 		reg |= tdma_control_bit(priv, SW_BRCM_TAG);
 	else
 		reg &= ~tdma_control_bit(priv, SW_BRCM_TAG);
@@ -1950,7 +1950,7 @@ static inline void gib_set_pad_extension(struct bcm_sysport_priv *priv)
 
 	reg = gib_readl(priv, GIB_CONTROL);
 	/* Include Broadcom tag in pad extension and fix up IPG_LENGTH */
-	if (netdev_uses_dsa(priv->netdev)) {
+	if (__netdev_uses_dsa_currently(priv->netdev)) {
 		reg &= ~(GIB_PAD_EXTENSION_MASK << GIB_PAD_EXTENSION_SHIFT);
 		reg |= ENET_BRCM_TAG_LEN << GIB_PAD_EXTENSION_SHIFT;
 	}
@@ -2299,7 +2299,7 @@ static u16 bcm_sysport_select_queue(struct net_device *dev, struct sk_buff *skb,
 	struct bcm_sysport_tx_ring *tx_ring;
 	unsigned int q, port;
 
-	if (!netdev_uses_dsa(dev))
+	if (!__netdev_uses_dsa_currently(dev))
 		return netdev_pick_tx(dev, skb, NULL);
 
 	/* DSA tagging layer will have configured the correct queue */
diff --git a/drivers/net/ethernet/mediatek/airoha_eth.c b/drivers/net/ethernet/mediatek/airoha_eth.c
index 1c5b85a86df1..f7425d393b22 100644
--- a/drivers/net/ethernet/mediatek/airoha_eth.c
+++ b/drivers/net/ethernet/mediatek/airoha_eth.c
@@ -2255,7 +2255,7 @@ static int airoha_dev_open(struct net_device *dev)
 	if (err)
 		return err;
 
-	if (netdev_uses_dsa(dev))
+	if (__netdev_uses_dsa_currently(dev))
 		airoha_fe_set(eth, REG_GDM_INGRESS_CFG(port->id),
 			      GDM_STAG_EN_MASK);
 	else
diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.c b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
index 16ca427cf4c3..82a828349323 100644
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
@@ -24,6 +24,7 @@
 #include <linux/pcs/pcs-mtk-lynxi.h>
 #include <linux/jhash.h>
 #include <linux/bitfield.h>
+#include <linux/rcupdate.h>
 #include <net/dsa.h>
 #include <net/dst_metadata.h>
 #include <net/page_pool/helpers.h>
@@ -1375,7 +1376,8 @@ static void mtk_tx_set_dma_desc_v2(struct net_device *dev, void *txd,
 		/* tx checksum offload */
 		if (info->csum)
 			data |= TX_DMA_CHKSUM_V2;
-		if (mtk_is_netsys_v3_or_greater(eth) && netdev_uses_dsa(dev))
+		if (mtk_is_netsys_v3_or_greater(eth) &&
+		    __netdev_uses_dsa_currently(dev))
 			data |= TX_DMA_SPTAG_V3;
 	}
 	WRITE_ONCE(desc->txd5, data);
@@ -2183,7 +2185,7 @@ static int mtk_poll_rx(struct napi_struct *napi, int budget,
 		 * hardware treats the MTK special tag as a VLAN and untags it.
 		 */
 		if (mtk_is_netsys_v1(eth) && (trxd.rxd2 & RX_DMA_VTAG) &&
-		    netdev_uses_dsa(netdev)) {
+		    __netdev_uses_dsa_currently(netdev)) {
 			unsigned int port = RX_DMA_VPID(trxd.rxd3) & GENMASK(2, 0);
 
 			if (port < ARRAY_SIZE(eth->dsa_meta) &&
@@ -3304,7 +3306,7 @@ static void mtk_gdm_config(struct mtk_eth *eth, u32 id, u32 config)
 
 	val |= config;
 
-	if (eth->netdev[id] && netdev_uses_dsa(eth->netdev[id]))
+	if (eth->netdev[id] && __netdev_uses_dsa_currently(eth->netdev[id]))
 		val |= MTK_GDMA_SPECIAL_TAG;
 
 	mtk_w32(eth, val, MTK_GDMA_FWD_CFG(id));
@@ -3313,12 +3315,16 @@ static void mtk_gdm_config(struct mtk_eth *eth, u32 id, u32 config)
 
 static bool mtk_uses_dsa(struct net_device *dev)
 {
+	bool ret = false;
 #if IS_ENABLED(CONFIG_NET_DSA)
-	return netdev_uses_dsa(dev) &&
-	       dev->dsa_ptr->tag_ops->proto == DSA_TAG_PROTO_MTK;
-#else
-	return false;
+	struct dsa_port *dp;
+
+	rcu_read_lock();
+	dp = rcu_dereference(dev->dsa_ptr);
+	ret = dp && dp->tag_ops->proto == DSA_TAG_PROTO_MTK;
+	rcu_read_unlock();
 #endif
+	return ret;
 }
 
 static int mtk_device_event(struct notifier_block *n, unsigned long event, void *ptr)
@@ -4482,7 +4488,7 @@ static u16 mtk_select_queue(struct net_device *dev, struct sk_buff *skb,
 	struct mtk_mac *mac = netdev_priv(dev);
 	unsigned int queue = 0;
 
-	if (netdev_uses_dsa(dev))
+	if (__netdev_uses_dsa_currently(dev))
 		queue = skb_get_queue_mapping(skb) + 3;
 	else
 		queue = mac->id;
diff --git a/drivers/net/ethernet/mediatek/mtk_ppe.c b/drivers/net/ethernet/mediatek/mtk_ppe.c
index 0acee405a749..0c78ec90d855 100644
--- a/drivers/net/ethernet/mediatek/mtk_ppe.c
+++ b/drivers/net/ethernet/mediatek/mtk_ppe.c
@@ -8,6 +8,7 @@
 #include <linux/platform_device.h>
 #include <linux/if_ether.h>
 #include <linux/if_vlan.h>
+#include <linux/rcupdate.h>
 #include <net/dst_metadata.h>
 #include <net/dsa.h>
 #include "mtk_eth_soc.h"
@@ -785,9 +786,17 @@ void __mtk_ppe_check_skb(struct mtk_ppe *ppe, struct sk_buff *skb, u16 hash)
 	switch (skb->protocol) {
 #if IS_ENABLED(CONFIG_NET_DSA)
 	case htons(ETH_P_XDSA):
-		if (!netdev_uses_dsa(skb->dev) ||
-		    skb->dev->dsa_ptr->tag_ops->proto != DSA_TAG_PROTO_MTK)
-			goto out;
+		{
+			struct dsa_port *dp;
+			bool proto_mtk;
+
+			rcu_read_lock();
+			dp = rcu_dereference(skb->dev->dsa_ptr);
+			proto_mtk = dp && dp->tag_ops->proto == DSA_TAG_PROTO_MTK;
+			rcu_read_unlock();
+			if (!proto_mtk)
+				goto out;
+		}
 
 		if (!skb_metadata_dst(skb))
 			tag += 4;
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index 607009150b5f..e645c7eabd42 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -2229,7 +2229,7 @@ struct net_device {
 	struct vlan_info __rcu	*vlan_info;
 #endif
 #if IS_ENABLED(CONFIG_NET_DSA)
-	struct dsa_port		*dsa_ptr;
+	struct dsa_port	 __rcu	*dsa_ptr;
 #endif
 #if IS_ENABLED(CONFIG_TIPC)
 	struct tipc_bearer __rcu *tipc_ptr;
diff --git a/include/net/dsa.h b/include/net/dsa.h
index d7a6c2930277..ab2777611e71 100644
--- a/include/net/dsa.h
+++ b/include/net/dsa.h
@@ -19,6 +19,7 @@
 #include <linux/phy.h>
 #include <linux/platform_data/dsa.h>
 #include <linux/phylink.h>
+#include <linux/rcupdate.h>
 #include <net/devlink.h>
 #include <net/switchdev.h>
 
@@ -92,8 +93,9 @@ struct dsa_switch;
 struct dsa_device_ops {
 	struct sk_buff *(*xmit)(struct sk_buff *skb, struct net_device *dev);
 	struct sk_buff *(*rcv)(struct sk_buff *skb, struct net_device *dev);
-	void (*flow_dissect)(const struct sk_buff *skb, __be16 *proto,
-			     int *offset);
+	void (*flow_dissect)(const struct sk_buff *skb,
+			     const struct dsa_port *dp,
+			     __be16 *proto, int *offset);
 	int (*connect)(struct dsa_switch *ds);
 	void (*disconnect)(struct dsa_switch *ds);
 	unsigned int needed_headroom;
@@ -1334,14 +1336,29 @@ bool dsa_mdb_present_in_other_db(struct dsa_switch *ds, int port,
 				 struct dsa_db db);
 
 /* Keep inline for faster access in hot path */
-static inline bool netdev_uses_dsa(const struct net_device *dev)
+
+/* Must be called under RCU or RTNL lock */
+static inline bool __netdev_uses_dsa_currently(const struct net_device *dev)
 {
 #if IS_ENABLED(CONFIG_NET_DSA)
-	return dev->dsa_ptr && dev->dsa_ptr->rcv;
+	struct dsa_port *dp = rcu_dereference_rtnl(dev->dsa_ptr);
+
+	return dp && dp->rcv;
 #endif
 	return false;
 }
 
+static inline bool netdev_uses_dsa_currently(const struct net_device *dev)
+{
+	bool ret = false;
+#if IS_ENABLED(CONFIG_NET_DSA)
+	rcu_read_lock();
+	ret = __netdev_uses_dsa_currently(dev);
+	rcu_read_unlock();
+#endif
+	return ret;
+}
+
 /* All DSA tags that push the EtherType to the right (basically all except tail
  * tags, which don't break dissection) can be treated the same from the
  * perspective of the flow dissector.
@@ -1355,17 +1372,20 @@ static inline bool netdev_uses_dsa(const struct net_device *dev)
  *    that, in __be16 shorts).
  *
  *  - proto: the value of the real EtherType.
+ *
+ * Must be called under RCU read lock (because of dp).
  */
 static inline void dsa_tag_generic_flow_dissect(const struct sk_buff *skb,
+						const struct dsa_port *dp,
 						__be16 *proto, int *offset)
 {
-#if IS_ENABLED(CONFIG_NET_DSA)
-	const struct dsa_device_ops *ops = skb->dev->dsa_ptr->tag_ops;
-	int tag_len = ops->needed_headroom;
+	int tag_len;
 
+	RCU_LOCKDEP_WARN(!rcu_read_lock_any_held(), "no rcu lock held");
+
+	tag_len = dp->tag_ops->needed_headroom;
 	*offset = tag_len;
 	*proto = ((__be16 *)skb->data)[(tag_len / 2) - 1];
-#endif
 }
 
 void dsa_unregister_switch(struct dsa_switch *ds);
diff --git a/include/net/dsa_stubs.h b/include/net/dsa_stubs.h
index 6f384897f287..ca899305ba36 100644
--- a/include/net/dsa_stubs.h
+++ b/include/net/dsa_stubs.h
@@ -22,9 +22,6 @@ static inline int dsa_conduit_hwtstamp_validate(struct net_device *dev,
 						const struct kernel_hwtstamp_config *config,
 						struct netlink_ext_ack *extack)
 {
-	if (!netdev_uses_dsa(dev))
-		return 0;
-
 	/* rtnl_lock() is a sufficient guarantee, because as long as
 	 * netdev_uses_dsa() returns true, the dsa_core module is still
 	 * registered, and so, dsa_unregister_stubs() couldn't have run.
@@ -33,6 +30,9 @@ static inline int dsa_conduit_hwtstamp_validate(struct net_device *dev,
 	 */
 	ASSERT_RTNL();
 
+	if (!__netdev_uses_dsa_currently(dev))
+		return 0;
+
 	return dsa_stubs->conduit_hwtstamp_validate(dev, config, extack);
 }
 
diff --git a/net/bridge/br_input.c b/net/bridge/br_input.c
index ceaa5a89b947..542cfc5678df 100644
--- a/net/bridge/br_input.c
+++ b/net/bridge/br_input.c
@@ -443,7 +443,7 @@ static rx_handler_result_t br_handle_frame_dummy(struct sk_buff **pskb)
 
 rx_handler_func_t *br_get_rx_handler(const struct net_device *dev)
 {
-	if (netdev_uses_dsa(dev))
+	if (__netdev_uses_dsa_currently(dev))
 		return br_handle_frame_dummy;
 
 	return br_handle_frame;
diff --git a/net/core/dev.c b/net/core/dev.c
index f66e61407883..9ae1c097cbad 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -5568,7 +5568,8 @@ static int __netif_receive_skb_core(struct sk_buff **pskb, bool pfmemalloc,
 		}
 	}
 
-	if (unlikely(skb_vlan_tag_present(skb)) && !netdev_uses_dsa(skb->dev)) {
+	if (unlikely(skb_vlan_tag_present(skb)) &&
+	    !__netdev_uses_dsa_currently(skb->dev)) {
 check_vlan_id:
 		if (skb_vlan_tag_get_id(skb)) {
 			/* Vlan id is non 0 and vlan_do_receive() above couldn't
diff --git a/net/core/flow_dissector.c b/net/core/flow_dissector.c
index 0e638a37aa09..e1523c609bb7 100644
--- a/net/core/flow_dissector.c
+++ b/net/core/flow_dissector.c
@@ -1071,25 +1071,30 @@ bool __skb_flow_dissect(const struct net *net,
 		nhoff = skb_network_offset(skb);
 		hlen = skb_headlen(skb);
 #if IS_ENABLED(CONFIG_NET_DSA)
-		if (unlikely(skb->dev && netdev_uses_dsa(skb->dev) &&
-			     proto == htons(ETH_P_XDSA))) {
+		if (unlikely(skb->dev && proto == htons(ETH_P_XDSA))) {
 			struct metadata_dst *md_dst = skb_metadata_dst(skb);
-			const struct dsa_device_ops *ops;
+			struct dsa_port *dp;
 			int offset = 0;
 
-			ops = skb->dev->dsa_ptr->tag_ops;
+			rcu_read_lock();
+
+			dp = rcu_dereference(skb->dev->dsa_ptr);
 			/* Only DSA header taggers break flow dissection */
-			if (ops->needed_headroom &&
+			if (dp && dp->tag_ops->needed_headroom &&
 			    (!md_dst || md_dst->type != METADATA_HW_PORT_MUX)) {
-				if (ops->flow_dissect)
-					ops->flow_dissect(skb, &proto, &offset);
+				if (dp->tag_ops->flow_dissect)
+					dp->tag_ops->flow_dissect(skb, dp,
+								  &proto, &offset);
 				else
 					dsa_tag_generic_flow_dissect(skb,
+								     dp,
 								     &proto,
 								     &offset);
 				hlen -= offset;
 				nhoff += offset;
 			}
+
+			rcu_read_unlock();
 		}
 #endif
 	}
diff --git a/net/dsa/conduit.c b/net/dsa/conduit.c
index 3dfdb3cb47dc..967770cdf88f 100644
--- a/net/dsa/conduit.c
+++ b/net/dsa/conduit.c
@@ -9,6 +9,7 @@
 #include <linux/ethtool.h>
 #include <linux/netdevice.h>
 #include <linux/netlink.h>
+#include <linux/rcupdate.h>
 #include <net/dsa.h>
 
 #include "conduit.h"
@@ -18,7 +19,7 @@
 
 static int dsa_conduit_get_regs_len(struct net_device *dev)
 {
-	struct dsa_port *cpu_dp = dev->dsa_ptr;
+	struct dsa_port *cpu_dp = rtnl_dereference(dev->dsa_ptr);
 	const struct ethtool_ops *ops = cpu_dp->orig_ethtool_ops;
 	struct dsa_switch *ds = cpu_dp->ds;
 	int port = cpu_dp->index;
@@ -48,7 +49,7 @@ static int dsa_conduit_get_regs_len(struct net_device *dev)
 static void dsa_conduit_get_regs(struct net_device *dev,
 				 struct ethtool_regs *regs, void *data)
 {
-	struct dsa_port *cpu_dp = dev->dsa_ptr;
+	struct dsa_port *cpu_dp = rtnl_dereference(dev->dsa_ptr);
 	const struct ethtool_ops *ops = cpu_dp->orig_ethtool_ops;
 	struct dsa_switch *ds = cpu_dp->ds;
 	struct ethtool_drvinfo *cpu_info;
@@ -84,7 +85,7 @@ static void dsa_conduit_get_ethtool_stats(struct net_device *dev,
 					  struct ethtool_stats *stats,
 					  uint64_t *data)
 {
-	struct dsa_port *cpu_dp = dev->dsa_ptr;
+	struct dsa_port *cpu_dp = rtnl_dereference(dev->dsa_ptr);
 	const struct ethtool_ops *ops = cpu_dp->orig_ethtool_ops;
 	struct dsa_switch *ds = cpu_dp->ds;
 	int port = cpu_dp->index;
@@ -103,7 +104,7 @@ static void dsa_conduit_get_ethtool_phy_stats(struct net_device *dev,
 					      struct ethtool_stats *stats,
 					      uint64_t *data)
 {
-	struct dsa_port *cpu_dp = dev->dsa_ptr;
+	struct dsa_port *cpu_dp = rtnl_dereference(dev->dsa_ptr);
 	const struct ethtool_ops *ops = cpu_dp->orig_ethtool_ops;
 	struct dsa_switch *ds = cpu_dp->ds;
 	int port = cpu_dp->index;
@@ -127,7 +128,7 @@ static void dsa_conduit_get_ethtool_phy_stats(struct net_device *dev,
 
 static int dsa_conduit_get_sset_count(struct net_device *dev, int sset)
 {
-	struct dsa_port *cpu_dp = dev->dsa_ptr;
+	struct dsa_port *cpu_dp = rtnl_dereference(dev->dsa_ptr);
 	const struct ethtool_ops *ops = cpu_dp->orig_ethtool_ops;
 	struct dsa_switch *ds = cpu_dp->ds;
 	int count = 0;
@@ -150,7 +151,7 @@ static int dsa_conduit_get_sset_count(struct net_device *dev, int sset)
 static void dsa_conduit_get_strings(struct net_device *dev, uint32_t stringset,
 				    uint8_t *data)
 {
-	struct dsa_port *cpu_dp = dev->dsa_ptr;
+	struct dsa_port *cpu_dp = rtnl_dereference(dev->dsa_ptr);
 	const struct ethtool_ops *ops = cpu_dp->orig_ethtool_ops;
 	struct dsa_switch *ds = cpu_dp->ds;
 	int port = cpu_dp->index;
@@ -202,7 +203,7 @@ int __dsa_conduit_hwtstamp_validate(struct net_device *dev,
 				    const struct kernel_hwtstamp_config *config,
 				    struct netlink_ext_ack *extack)
 {
-	struct dsa_port *cpu_dp = dev->dsa_ptr;
+	struct dsa_port *cpu_dp = rtnl_dereference(dev->dsa_ptr);
 	struct dsa_switch *ds = cpu_dp->ds;
 	struct dsa_switch_tree *dst;
 	struct dsa_port *dp;
@@ -222,7 +223,7 @@ int __dsa_conduit_hwtstamp_validate(struct net_device *dev,
 
 static int dsa_conduit_ethtool_setup(struct net_device *dev)
 {
-	struct dsa_port *cpu_dp = dev->dsa_ptr;
+	struct dsa_port *cpu_dp = rtnl_dereference(dev->dsa_ptr);
 	struct dsa_switch *ds = cpu_dp->ds;
 	struct ethtool_ops *ops;
 
@@ -251,7 +252,7 @@ static int dsa_conduit_ethtool_setup(struct net_device *dev)
 
 static void dsa_conduit_ethtool_teardown(struct net_device *dev)
 {
-	struct dsa_port *cpu_dp = dev->dsa_ptr;
+	struct dsa_port *cpu_dp = rtnl_dereference(dev->dsa_ptr);
 
 	if (netif_is_lag_master(dev))
 		return;
@@ -267,13 +268,14 @@ static void dsa_conduit_ethtool_teardown(struct net_device *dev)
  */
 static void dsa_conduit_set_promiscuity(struct net_device *dev, int inc)
 {
-	const struct dsa_device_ops *ops = dev->dsa_ptr->tag_ops;
+	const struct dsa_device_ops *ops;
+
+	ASSERT_RTNL();
+	ops = rtnl_dereference(dev->dsa_ptr)->tag_ops;
 
 	if ((dev->priv_flags & IFF_UNICAST_FLT) && !ops->promisc_on_conduit)
 		return;
 
-	ASSERT_RTNL();
-
 	dev_set_promiscuity(dev, inc);
 }
 
@@ -281,10 +283,17 @@ static ssize_t tagging_show(struct device *d, struct device_attribute *attr,
 			    char *buf)
 {
 	struct net_device *dev = to_net_dev(d);
-	struct dsa_port *cpu_dp = dev->dsa_ptr;
+	struct dsa_port *cpu_dp;
+	int ret = 0;
+
+	rcu_read_lock();
+	cpu_dp = rcu_dereference(dev->dsa_ptr);
+	if (cpu_dp)
+		ret = sysfs_emit(buf, "%s\n",
+				 dsa_tag_protocol_to_str(cpu_dp->tag_ops));
+	rcu_read_unlock();
 
-	return sysfs_emit(buf, "%s\n",
-		       dsa_tag_protocol_to_str(cpu_dp->tag_ops));
+	return ret;
 }
 
 static ssize_t tagging_store(struct device *d, struct device_attribute *attr,
@@ -293,7 +302,7 @@ static ssize_t tagging_store(struct device *d, struct device_attribute *attr,
 	const struct dsa_device_ops *new_tag_ops, *old_tag_ops;
 	const char *end = strchrnul(buf, '\n'), *name;
 	struct net_device *dev = to_net_dev(d);
-	struct dsa_port *cpu_dp = dev->dsa_ptr;
+	struct dsa_port *cpu_dp;
 	size_t len = end - buf;
 	int err;
 
@@ -305,13 +314,17 @@ static ssize_t tagging_store(struct device *d, struct device_attribute *attr,
 	if (!name)
 		return -ENOMEM;
 
-	old_tag_ops = cpu_dp->tag_ops;
 	new_tag_ops = dsa_tag_driver_get_by_name(name);
 	kfree(name);
 	/* Bad tagger name? */
 	if (IS_ERR(new_tag_ops))
 		return PTR_ERR(new_tag_ops);
 
+	if (!rtnl_trylock())
+		return restart_syscall();
+
+	cpu_dp = rtnl_dereference(dev->dsa_ptr);
+	old_tag_ops = cpu_dp->tag_ops;
 	if (new_tag_ops == old_tag_ops)
 		/* Drop the temporarily held duplicate reference, since
 		 * the DSA switch tree uses this tagger.
@@ -321,6 +334,7 @@ static ssize_t tagging_store(struct device *d, struct device_attribute *attr,
 	err = dsa_tree_change_tag_proto(cpu_dp->ds->dst, new_tag_ops,
 					old_tag_ops);
 	if (err) {
+		rtnl_unlock();
 		/* On failure the old tagger is restored, so we don't need the
 		 * driver for the new one.
 		 */
@@ -331,6 +345,7 @@ static ssize_t tagging_store(struct device *d, struct device_attribute *attr,
 	/* On success we no longer need the module for the old tagging protocol
 	 */
 out:
+	rtnl_unlock();
 	dsa_tag_driver_put(old_tag_ops);
 	return count;
 }
@@ -384,13 +399,11 @@ int dsa_conduit_setup(struct net_device *dev, struct dsa_port *cpu_dp)
 		netdev_warn(dev, "error %d setting MTU to %d to include DSA overhead\n",
 			    ret, mtu);
 
-	/* If we use a tagging format that doesn't have an ethertype
-	 * field, make sure that all packets from this point on get
-	 * sent to the tag format's receive function.
+	rcu_assign_pointer(dev->dsa_ptr, cpu_dp);
+	/*
+	 * No need to synchronize_rcu() here because dsa_ptr in not going away
+	 * before it will be zeroed
 	 */
-	wmb();
-
-	dev->dsa_ptr = cpu_dp;
 
 	dsa_conduit_set_promiscuity(dev, 1);
 
@@ -418,13 +431,12 @@ void dsa_conduit_teardown(struct net_device *dev)
 	dsa_conduit_reset_mtu(dev);
 	dsa_conduit_set_promiscuity(dev, -1);
 
-	dev->dsa_ptr = NULL;
-
 	/* If we used a tagging format that doesn't have an ethertype
 	 * field, make sure that all packets from this point get sent
 	 * without the tag and go through the regular receive path.
 	 */
-	wmb();
+	rcu_assign_pointer(dev->dsa_ptr, NULL);
+	synchronize_rcu();
 }
 
 int dsa_conduit_lag_setup(struct net_device *lag_dev, struct dsa_port *cpu_dp,
@@ -434,7 +446,7 @@ int dsa_conduit_lag_setup(struct net_device *lag_dev, struct dsa_port *cpu_dp,
 	bool conduit_setup = false;
 	int err;
 
-	if (!netdev_uses_dsa(lag_dev)) {
+	if (!__netdev_uses_dsa_currently(lag_dev)) {
 		err = dsa_conduit_setup(lag_dev, cpu_dp);
 		if (err)
 			return err;
diff --git a/net/dsa/dsa.c b/net/dsa/dsa.c
index 668c729946ea..36b9ebddc8b8 100644
--- a/net/dsa/dsa.c
+++ b/net/dsa/dsa.c
@@ -976,6 +976,8 @@ static int dsa_tree_bind_tag_proto(struct dsa_switch_tree *dst,
 /* Since the dsa/tagging sysfs device attribute is per conduit, the assumption
  * is that all DSA switches within a tree share the same tagger, otherwise
  * they would have formed disjoint trees (different "dsa,member" values).
+ *
+ * Must be called with RTNL lock held.
  */
 int dsa_tree_change_tag_proto(struct dsa_switch_tree *dst,
 			      const struct dsa_device_ops *tag_ops,
@@ -985,8 +987,7 @@ int dsa_tree_change_tag_proto(struct dsa_switch_tree *dst,
 	struct dsa_port *dp;
 	int err = -EBUSY;
 
-	if (!rtnl_trylock())
-		return restart_syscall();
+	ASSERT_RTNL();
 
 	/* At the moment we don't allow changing the tag protocol under
 	 * traffic. The rtnl_mutex also happens to serialize concurrent
@@ -1011,15 +1012,12 @@ int dsa_tree_change_tag_proto(struct dsa_switch_tree *dst,
 	if (err)
 		goto out_unwind_tagger;
 
-	rtnl_unlock();
-
 	return 0;
 
 out_unwind_tagger:
 	info.tag_ops = old_tag_ops;
 	dsa_tree_notify(dst, DSA_NOTIFIER_TAG_PROTO, &info);
 out_unlock:
-	rtnl_unlock();
 	return err;
 }
 
@@ -1027,7 +1025,7 @@ static void dsa_tree_conduit_state_change(struct dsa_switch_tree *dst,
 					  struct net_device *conduit)
 {
 	struct dsa_notifier_conduit_state_info info;
-	struct dsa_port *cpu_dp = conduit->dsa_ptr;
+	struct dsa_port *cpu_dp = rtnl_dereference(conduit->dsa_ptr);
 
 	info.conduit = conduit;
 	info.operational = dsa_port_conduit_is_operational(cpu_dp);
@@ -1039,7 +1037,7 @@ void dsa_tree_conduit_admin_state_change(struct dsa_switch_tree *dst,
 					 struct net_device *conduit,
 					 bool up)
 {
-	struct dsa_port *cpu_dp = conduit->dsa_ptr;
+	struct dsa_port *cpu_dp = rtnl_dereference(conduit->dsa_ptr);
 	bool notify = false;
 
 	/* Don't keep track of admin state on LAG DSA conduits,
@@ -1062,7 +1060,7 @@ void dsa_tree_conduit_oper_state_change(struct dsa_switch_tree *dst,
 					struct net_device *conduit,
 					bool up)
 {
-	struct dsa_port *cpu_dp = conduit->dsa_ptr;
+	struct dsa_port *cpu_dp = rtnl_dereference(conduit->dsa_ptr);
 	bool notify = false;
 
 	/* Don't keep track of oper state on LAG DSA conduits,
@@ -1594,10 +1592,11 @@ void dsa_switch_shutdown(struct dsa_switch *ds)
 	}
 
 	/* Disconnect from further netdevice notifiers on the conduit,
-	 * since netdev_uses_dsa() will now return false.
+	 * from now on, netdev_uses_dsa_currently() will return false.
 	 */
 	dsa_switch_for_each_cpu_port(dp, ds)
-		dp->conduit->dsa_ptr = NULL;
+		rcu_assign_pointer(dp->conduit->dsa_ptr, NULL);
+	synchronize_rcu();
 
 	rtnl_unlock();
 out:
diff --git a/net/dsa/port.c b/net/dsa/port.c
index 25258b33e59e..6220c520d776 100644
--- a/net/dsa/port.c
+++ b/net/dsa/port.c
@@ -11,6 +11,7 @@
 #include <linux/notifier.h>
 #include <linux/of_mdio.h>
 #include <linux/of_net.h>
+#include <linux/rtnetlink.h>
 
 #include "dsa.h"
 #include "port.h"
@@ -1414,7 +1415,7 @@ static int dsa_port_assign_conduit(struct dsa_port *dp,
 	if (err && fail_on_err)
 		return err;
 
-	dp->cpu_dp = conduit->dsa_ptr;
+	dp->cpu_dp = rtnl_dereference(conduit->dsa_ptr);
 	dp->cpu_port_in_lag = netif_is_lag_master(conduit);
 
 	return 0;
diff --git a/net/dsa/tag.c b/net/dsa/tag.c
index 79ad105902d9..ba662adecc14 100644
--- a/net/dsa/tag.c
+++ b/net/dsa/tag.c
@@ -10,6 +10,7 @@
 #include <linux/netdevice.h>
 #include <linux/ptp_classify.h>
 #include <linux/skbuff.h>
+#include <linux/rcupdate.h>
 #include <net/dsa.h>
 #include <net/dst_metadata.h>
 
@@ -55,7 +56,7 @@ static int dsa_switch_rcv(struct sk_buff *skb, struct net_device *dev,
 			  struct packet_type *pt, struct net_device *unused)
 {
 	struct metadata_dst *md_dst = skb_metadata_dst(skb);
-	struct dsa_port *cpu_dp = dev->dsa_ptr;
+	struct dsa_port *cpu_dp = rcu_dereference(dev->dsa_ptr);
 	struct sk_buff *nskb = NULL;
 	struct dsa_user_priv *p;
 
diff --git a/net/dsa/tag.h b/net/dsa/tag.h
index d5707870906b..dbb2217d4344 100644
--- a/net/dsa/tag.h
+++ b/net/dsa/tag.h
@@ -5,6 +5,7 @@
 
 #include <linux/if_vlan.h>
 #include <linux/list.h>
+#include <linux/rcupdate.h>
 #include <linux/types.h>
 #include <net/dsa.h>
 
@@ -32,11 +33,14 @@ static inline int dsa_tag_protocol_overhead(const struct dsa_device_ops *ops)
 static inline struct net_device *dsa_conduit_find_user(struct net_device *dev,
 						       int device, int port)
 {
-	struct dsa_port *cpu_dp = dev->dsa_ptr;
-	struct dsa_switch_tree *dst = cpu_dp->dst;
+	struct dsa_port *cpu_dp;
 	struct dsa_port *dp;
 
-	list_for_each_entry(dp, &dst->ports, list)
+	cpu_dp = rcu_dereference(dev->dsa_ptr);
+	if (!cpu_dp)
+		return NULL;
+
+	list_for_each_entry(dp, &cpu_dp->dst->ports, list)
 		if (dp->ds->index == device && dp->index == port &&
 		    dp->type == DSA_PORT_TYPE_USER)
 			return dp->user;
@@ -184,14 +188,17 @@ static inline struct sk_buff *dsa_software_vlan_untag(struct sk_buff *skb)
 static inline struct net_device *
 dsa_find_designated_bridge_port_by_vid(struct net_device *conduit, u16 vid)
 {
-	struct dsa_port *cpu_dp = conduit->dsa_ptr;
-	struct dsa_switch_tree *dst = cpu_dp->dst;
+	struct dsa_port *cpu_dp;
 	struct bridge_vlan_info vinfo;
 	struct net_device *user;
 	struct dsa_port *dp;
 	int err;
 
-	list_for_each_entry(dp, &dst->ports, list) {
+	cpu_dp = rcu_dereference(conduit->dsa_ptr);
+	if (!cpu_dp)
+		return NULL;
+
+	list_for_each_entry(dp, &cpu_dp->dst->ports, list) {
 		if (dp->type != DSA_PORT_TYPE_USER)
 			continue;
 
diff --git a/net/dsa/tag_8021q.c b/net/dsa/tag_8021q.c
index 3ee53e28ec2e..c9fb4fd2a4cf 100644
--- a/net/dsa/tag_8021q.c
+++ b/net/dsa/tag_8021q.c
@@ -5,6 +5,7 @@
  * primitives for taggers that rely on 802.1Q VLAN tags to use.
  */
 #include <linux/if_vlan.h>
+#include <linux/rcupdate.h>
 #include <linux/dsa/8021q.h>
 
 #include "port.h"
@@ -474,14 +475,17 @@ EXPORT_SYMBOL_GPL(dsa_8021q_xmit);
 static struct net_device *
 dsa_tag_8021q_find_port_by_vbid(struct net_device *conduit, int vbid)
 {
-	struct dsa_port *cpu_dp = conduit->dsa_ptr;
-	struct dsa_switch_tree *dst = cpu_dp->dst;
+	struct dsa_port *cpu_dp;
 	struct dsa_port *dp;
 
 	if (WARN_ON(!vbid))
 		return NULL;
 
-	dsa_tree_for_each_user_port(dp, dst) {
+	cpu_dp = rcu_dereference(conduit->dsa_ptr);
+	if (!cpu_dp)
+		return NULL;
+
+	dsa_tree_for_each_user_port(dp, cpu_dp->dst) {
 		if (!dp->bridge)
 			continue;
 
diff --git a/net/dsa/tag_brcm.c b/net/dsa/tag_brcm.c
index 8c3c068728e5..c87f16cd959f 100644
--- a/net/dsa/tag_brcm.c
+++ b/net/dsa/tag_brcm.c
@@ -269,7 +269,7 @@ static struct sk_buff *brcm_leg_tag_rcv(struct sk_buff *skb,
 		return NULL;
 
 	/* VLAN tag is added by BCM63xx internal switch */
-	if (netdev_uses_dsa(skb->dev))
+	if (__netdev_uses_dsa_currently(skb->dev))
 		len += VLAN_HLEN;
 
 	/* Remove Broadcom tag and update checksum */
diff --git a/net/dsa/tag_dsa.c b/net/dsa/tag_dsa.c
index 2a2c4fb61a65..7f5dc8d384c9 100644
--- a/net/dsa/tag_dsa.c
+++ b/net/dsa/tag_dsa.c
@@ -48,6 +48,7 @@
 #include <linux/dsa/mv88e6xxx.h>
 #include <linux/etherdevice.h>
 #include <linux/list.h>
+#include <linux/rcupdate.h>
 #include <linux/slab.h>
 
 #include "tag.h"
@@ -257,14 +258,15 @@ static struct sk_buff *dsa_rcv_ll(struct sk_buff *skb, struct net_device *dev,
 	source_port = (dsa_header[1] >> 3) & 0x1f;
 
 	if (trunk) {
-		struct dsa_port *cpu_dp = dev->dsa_ptr;
-		struct dsa_lag *lag;
+		struct dsa_port *cpu_dp = rcu_dereference(dev->dsa_ptr);
+		struct dsa_lag *lag = NULL;
 
 		/* The exact source port is not available in the tag,
 		 * so we inject the frame directly on the upper
 		 * team/bond.
 		 */
-		lag = dsa_lag_by_id(cpu_dp->dst, source_port + 1);
+		if (cpu_dp)
+			lag = dsa_lag_by_id(cpu_dp->dst, source_port + 1);
 		skb->dev = lag ? lag->dev : NULL;
 	} else {
 		skb->dev = dsa_conduit_find_user(dev, source_device,
diff --git a/net/dsa/tag_qca.c b/net/dsa/tag_qca.c
index 0cf61286b426..dbc1f659ed07 100644
--- a/net/dsa/tag_qca.c
+++ b/net/dsa/tag_qca.c
@@ -5,6 +5,7 @@
 
 #include <linux/etherdevice.h>
 #include <linux/bitfield.h>
+#include <linux/rcupdate.h>
 #include <net/dsa.h>
 #include <linux/dsa/tag_qca.h>
 
@@ -36,8 +37,8 @@ static struct sk_buff *qca_tag_xmit(struct sk_buff *skb, struct net_device *dev)
 static struct sk_buff *qca_tag_rcv(struct sk_buff *skb, struct net_device *dev)
 {
 	struct qca_tagger_data *tagger_data;
-	struct dsa_port *dp = dev->dsa_ptr;
-	struct dsa_switch *ds = dp->ds;
+	struct dsa_port *dp;
+	struct dsa_switch *ds;
 	u8 ver, pk_type;
 	__be16 *phdr;
 	int port;
@@ -45,6 +46,11 @@ static struct sk_buff *qca_tag_rcv(struct sk_buff *skb, struct net_device *dev)
 
 	BUILD_BUG_ON(sizeof(struct qca_mgmt_ethhdr) != QCA_HDR_MGMT_HEADER_LEN + QCA_HDR_LEN);
 
+	dp = rcu_dereference(dev->dsa_ptr);
+	if (!dp)
+		return NULL;
+	ds = dp->ds;
+
 	tagger_data = ds->tagger_data;
 
 	if (unlikely(!pskb_may_pull(skb, QCA_HDR_LEN)))
diff --git a/net/dsa/tag_sja1105.c b/net/dsa/tag_sja1105.c
index 3e902af7eea6..0746a7d34178 100644
--- a/net/dsa/tag_sja1105.c
+++ b/net/dsa/tag_sja1105.c
@@ -5,6 +5,7 @@
 #include <linux/dsa/sja1105.h>
 #include <linux/dsa/8021q.h>
 #include <linux/packing.h>
+#include <linux/rcupdate.h>
 
 #include "tag.h"
 #include "tag_8021q.h"
@@ -530,12 +531,13 @@ static struct sk_buff *sja1110_rcv_meta(struct sk_buff *skb, u16 rx_header)
 	int n_ts = SJA1110_RX_HEADER_N_TS(rx_header);
 	struct sja1105_tagger_data *tagger_data;
 	struct net_device *conduit = skb->dev;
+	struct dsa_switch *ds = NULL;
 	struct dsa_port *cpu_dp;
-	struct dsa_switch *ds;
 	int i;
 
-	cpu_dp = conduit->dsa_ptr;
-	ds = dsa_switch_find(cpu_dp->dst->index, switch_id);
+	cpu_dp = rcu_dereference(conduit->dsa_ptr);
+	if (cpu_dp)
+		ds = dsa_switch_find(cpu_dp->dst->index, switch_id);
 	if (!ds) {
 		net_err_ratelimited("%s: cannot find switch id %d\n",
 				    conduit->name, switch_id);
@@ -662,24 +664,26 @@ static struct sk_buff *sja1110_rcv(struct sk_buff *skb,
 	return skb;
 }
 
-static void sja1105_flow_dissect(const struct sk_buff *skb, __be16 *proto,
-				 int *offset)
+static void sja1105_flow_dissect(const struct sk_buff *skb,
+				 const struct dsa_port *dp,
+				 __be16 *proto, int *offset)
 {
 	/* No tag added for management frames, all ok */
 	if (unlikely(sja1105_is_link_local(skb)))
 		return;
 
-	dsa_tag_generic_flow_dissect(skb, proto, offset);
+	dsa_tag_generic_flow_dissect(skb, dp, proto, offset);
 }
 
-static void sja1110_flow_dissect(const struct sk_buff *skb, __be16 *proto,
-				 int *offset)
+static void sja1110_flow_dissect(const struct sk_buff *skb,
+				 const struct dsa_port *dp,
+				 __be16 *proto, int *offset)
 {
 	/* Management frames have 2 DSA tags on RX, so the needed_headroom we
 	 * declared is fine for the generic dissector adjustment procedure.
 	 */
 	if (unlikely(sja1105_is_link_local(skb)))
-		return dsa_tag_generic_flow_dissect(skb, proto, offset);
+		return dsa_tag_generic_flow_dissect(skb, dp, proto, offset);
 
 	/* For the rest, there is a single DSA tag, the tag_8021q one */
 	*offset = VLAN_HLEN;
diff --git a/net/dsa/user.c b/net/dsa/user.c
index f5adfa1d978a..2afd21e34772 100644
--- a/net/dsa/user.c
+++ b/net/dsa/user.c
@@ -21,6 +21,7 @@
 #include <linux/if_hsr.h>
 #include <net/dcbnl.h>
 #include <linux/netpoll.h>
+#include <linux/rcupdate.h>
 #include <linux/string.h>
 
 #include "conduit.h"
@@ -2839,7 +2840,7 @@ int dsa_user_change_conduit(struct net_device *dev, struct net_device *conduit,
 		return -EOPNOTSUPP;
 	}
 
-	if (!netdev_uses_dsa(conduit)) {
+	if (!__netdev_uses_dsa_currently(conduit)) {
 		NL_SET_ERR_MSG_MOD(extack,
 				   "Interface not eligible as DSA conduit");
 		return -EOPNOTSUPP;
@@ -3141,8 +3142,8 @@ static int dsa_lag_conduit_validate(struct net_device *lag_dev,
 
 	netdev_for_each_lower_dev(lag_dev, lower1, iter1) {
 		netdev_for_each_lower_dev(lag_dev, lower2, iter2) {
-			if (!netdev_uses_dsa(lower1) ||
-			    !netdev_uses_dsa(lower2)) {
+			if (!__netdev_uses_dsa_currently(lower1) ||
+			    !__netdev_uses_dsa_currently(lower2)) {
 				NL_SET_ERR_MSG_MOD(extack,
 						   "All LAG ports must be eligible as DSA conduits");
 				return notifier_from_errno(-EINVAL);
@@ -3151,8 +3152,8 @@ static int dsa_lag_conduit_validate(struct net_device *lag_dev,
 			if (lower1 == lower2)
 				continue;
 
-			if (!dsa_port_tree_same(lower1->dsa_ptr,
-						lower2->dsa_ptr)) {
+			if (!dsa_port_tree_same(rtnl_dereference(lower1->dsa_ptr),
+						rtnl_dereference(lower2->dsa_ptr))) {
 				NL_SET_ERR_MSG_MOD(extack,
 						   "LAG contains DSA conduits of disjoint switch trees");
 				return notifier_from_errno(-EINVAL);
@@ -3169,7 +3170,7 @@ dsa_conduit_prechangeupper_sanity_check(struct net_device *conduit,
 {
 	struct netlink_ext_ack *extack = netdev_notifier_info_to_extack(&info->info);
 
-	if (!netdev_uses_dsa(conduit))
+	if (!__netdev_uses_dsa_currently(conduit))
 		return NOTIFY_DONE;
 
 	if (!info->linking)
@@ -3205,20 +3206,22 @@ dsa_lag_conduit_prechangelower_sanity_check(struct net_device *dev,
 	struct net_device *lower;
 	struct list_head *iter;
 
-	if (!netdev_uses_dsa(lag_dev) || !netif_is_lag_master(lag_dev))
+	if (!__netdev_uses_dsa_currently(lag_dev) ||
+	    !netif_is_lag_master(lag_dev))
 		return NOTIFY_DONE;
 
 	if (!info->linking)
 		return NOTIFY_DONE;
 
-	if (!netdev_uses_dsa(dev)) {
+	if (!__netdev_uses_dsa_currently(dev)) {
 		NL_SET_ERR_MSG(extack,
 			       "Only DSA conduits can join a LAG DSA conduit");
 		return notifier_from_errno(-EINVAL);
 	}
 
 	netdev_for_each_lower_dev(lag_dev, lower, iter) {
-		if (!dsa_port_tree_same(dev->dsa_ptr, lower->dsa_ptr)) {
+		if (!dsa_port_tree_same(rtnl_dereference(dev->dsa_ptr),
+					rtnl_dereference(lower->dsa_ptr))) {
 			NL_SET_ERR_MSG(extack,
 				       "Interface is DSA conduit for a different switch tree than this LAG");
 			return notifier_from_errno(-EINVAL);
@@ -3257,7 +3260,8 @@ dsa_bridge_prechangelower_sanity_check(struct net_device *new_lower,
 	extack = netdev_notifier_info_to_extack(&info->info);
 
 	netdev_for_each_lower_dev(br, lower, iter) {
-		if (!netdev_uses_dsa(new_lower) && !netdev_uses_dsa(lower))
+		if (!__netdev_uses_dsa_currently(new_lower) &&
+		    !__netdev_uses_dsa_currently(lower))
 			continue;
 
 		if (!netdev_port_same_parent_id(lower, new_lower)) {
@@ -3295,7 +3299,7 @@ static int dsa_conduit_lag_join(struct net_device *conduit,
 				struct netdev_lag_upper_info *uinfo,
 				struct netlink_ext_ack *extack)
 {
-	struct dsa_port *cpu_dp = conduit->dsa_ptr;
+	struct dsa_port *cpu_dp = rtnl_dereference(conduit->dsa_ptr);
 	struct dsa_switch_tree *dst = cpu_dp->dst;
 	struct dsa_port *dp;
 	int err;
@@ -3328,7 +3332,7 @@ static int dsa_conduit_lag_join(struct net_device *conduit,
 		}
 	}
 
-	dsa_conduit_lag_teardown(lag_dev, conduit->dsa_ptr);
+	dsa_conduit_lag_teardown(lag_dev, rtnl_dereference(conduit->dsa_ptr));
 
 	return err;
 }
@@ -3336,17 +3340,16 @@ static int dsa_conduit_lag_join(struct net_device *conduit,
 static void dsa_conduit_lag_leave(struct net_device *conduit,
 				  struct net_device *lag_dev)
 {
-	struct dsa_port *dp, *cpu_dp = lag_dev->dsa_ptr;
+	struct dsa_port *dp, *cpu_dp = rtnl_dereference(lag_dev->dsa_ptr);
 	struct dsa_switch_tree *dst = cpu_dp->dst;
 	struct dsa_port *new_cpu_dp = NULL;
 	struct net_device *lower;
 	struct list_head *iter;
 
 	netdev_for_each_lower_dev(lag_dev, lower, iter) {
-		if (netdev_uses_dsa(lower)) {
-			new_cpu_dp = lower->dsa_ptr;
+		new_cpu_dp = rtnl_dereference(lower->dsa_ptr);
+		if (new_cpu_dp)
 			break;
-		}
 	}
 
 	if (new_cpu_dp) {
@@ -3360,8 +3363,11 @@ static void dsa_conduit_lag_leave(struct net_device *conduit,
 		/* Update the index of the virtual CPU port to match the lowest
 		 * physical CPU port
 		 */
-		lag_dev->dsa_ptr = new_cpu_dp;
-		wmb();
+		rcu_assign_pointer(lag_dev->dsa_ptr, new_cpu_dp);
+		/*
+		 * No need to synchronize_rcu() here because dsa_ptr in not
+		 * going away before it will be zeroed
+		 */
 	} else {
 		/* If the LAG DSA conduit has no ports left, migrate back all
 		 * user ports to the first physical CPU port
@@ -3372,7 +3378,7 @@ static void dsa_conduit_lag_leave(struct net_device *conduit,
 	/* This DSA conduit has left its LAG in any case, so let
 	 * the CPU port leave the hardware LAG as well
 	 */
-	dsa_conduit_lag_teardown(lag_dev, conduit->dsa_ptr);
+	dsa_conduit_lag_teardown(lag_dev, rtnl_dereference(conduit->dsa_ptr));
 }
 
 static int dsa_conduit_changeupper(struct net_device *dev,
@@ -3381,7 +3387,7 @@ static int dsa_conduit_changeupper(struct net_device *dev,
 	struct netlink_ext_ack *extack;
 	int err = NOTIFY_DONE;
 
-	if (!netdev_uses_dsa(dev))
+	if (!__netdev_uses_dsa_currently(dev))
 		return err;
 
 	extack = netdev_notifier_info_to_extack(&info->info);
@@ -3464,14 +3470,14 @@ static int dsa_user_netdevice_event(struct notifier_block *nb,
 			err = dsa_port_lag_change(dp, info->lower_state_info);
 		}
 
+		dp = rtnl_dereference(dev->dsa_ptr);
+		if (!dp)
+			return NOTIFY_OK;
+
 		/* Mirror LAG port events on DSA conduits that are in
 		 * a LAG towards their respective switch CPU ports
 		 */
-		if (netdev_uses_dsa(dev)) {
-			dp = dev->dsa_ptr;
-
-			err = dsa_port_lag_change(dp, info->lower_state_info);
-		}
+		err = dsa_port_lag_change(dp, info->lower_state_info);
 
 		return notifier_from_errno(err);
 	}
@@ -3481,39 +3487,41 @@ static int dsa_user_netdevice_event(struct notifier_block *nb,
 		 * DSA driver may require the conduit port (and indirectly
 		 * the tagger) to be available for some special operation.
 		 */
-		if (netdev_uses_dsa(dev)) {
-			struct dsa_port *cpu_dp = dev->dsa_ptr;
-			struct dsa_switch_tree *dst = cpu_dp->ds->dst;
-
-			/* Track when the conduit port is UP */
-			dsa_tree_conduit_oper_state_change(dst, dev,
-							   netif_oper_up(dev));
-
-			/* Track when the conduit port is ready and can accept
-			 * packet.
-			 * NETDEV_UP event is not enough to flag a port as ready.
-			 * We also have to wait for linkwatch_do_dev to dev_activate
-			 * and emit a NETDEV_CHANGE event.
-			 * We check if a conduit port is ready by checking if the dev
-			 * have a qdisc assigned and is not noop.
-			 */
-			dsa_tree_conduit_admin_state_change(dst, dev,
-							    !qdisc_tx_is_noop(dev));
+		struct dsa_port *cpu_dp = rtnl_dereference(dev->dsa_ptr);
+		struct dsa_switch_tree *dst;
 
-			return NOTIFY_OK;
-		}
+		if (!cpu_dp)
+			return NOTIFY_DONE;
+
+		dst = cpu_dp->ds->dst;
+
+		/* Track when the conduit port is UP */
+		dsa_tree_conduit_oper_state_change(dst, dev,
+						   netif_oper_up(dev));
+
+		/* Track when the conduit port is ready and can accept
+		 * packet.
+		 * NETDEV_UP event is not enough to flag a port as ready.
+		 * We also have to wait for linkwatch_do_dev to dev_activate
+		 * and emit a NETDEV_CHANGE event.
+		 * We check if a conduit port is ready by checking if the dev
+		 * have a qdisc assigned and is not noop.
+		 */
+		dsa_tree_conduit_admin_state_change(dst, dev,
+						    !qdisc_tx_is_noop(dev));
+
+		return NOTIFY_OK;
 
-		return NOTIFY_DONE;
 	}
 	case NETDEV_GOING_DOWN: {
 		struct dsa_port *dp, *cpu_dp;
 		struct dsa_switch_tree *dst;
 		LIST_HEAD(close_list);
 
-		if (!netdev_uses_dsa(dev))
+		cpu_dp = rtnl_dereference(dev->dsa_ptr);
+		if (!cpu_dp)
 			return NOTIFY_DONE;
 
-		cpu_dp = dev->dsa_ptr;
 		dst = cpu_dp->ds->dst;
 
 		dsa_tree_conduit_admin_state_change(dst, dev, false);
diff --git a/net/ethernet/eth.c b/net/ethernet/eth.c
index 4e3651101b86..a05ff82551c3 100644
--- a/net/ethernet/eth.c
+++ b/net/ethernet/eth.c
@@ -170,7 +170,7 @@ __be16 eth_type_trans(struct sk_buff *skb, struct net_device *dev)
 	 * variants has been configured on the receiving interface,
 	 * and if so, set skb->protocol without looking at the packet.
 	 */
-	if (unlikely(netdev_uses_dsa(dev)))
+	if (unlikely(netdev_uses_dsa_currently(dev)))
 		return htons(ETH_P_XDSA);
 
 	if (likely(eth_proto_is_802_3(eth->h_proto)))
-- 
2.46.0



From vignesh.raman at collabora.com  Tue Sep 10 06:19:24 2024
From: vignesh.raman at collabora.com (Vignesh Raman)
Date: Tue, 10 Sep 2024 18:49:24 +0530
Subject: [PATCH v2] drm/ci: uprev mesa, IGT and deqp-runner
Message-ID: <20240910131927.161883-1-vignesh.raman@collabora.com>

Uprev mesa, IGT to the latest version and deqp-runner
to v0.20.0. Also update expectation files.

Acked-by: Helen Koike <helen.koike at collabora.com>
Reviewed-by: Daniel Stone <daniels at collabora.com>
Signed-off-by: Vignesh Raman <vignesh.raman at collabora.com>
---

v1:
- Flaky test report will be sent to maintainers after this
  patch series is reviewed.

v2:
- Uprev mesa and rerun with latest drm-misc-next.
  Updated flaky tests bug report link.

---
 drivers/gpu/drm/ci/gitlab-ci.yml              | 14 +++--
 drivers/gpu/drm/ci/image-tags.yml             |  2 +-
 .../gpu/drm/ci/xfails/amdgpu-stoney-fails.txt |  2 +-
 .../drm/ci/xfails/amdgpu-stoney-flakes.txt    |  7 +++
 drivers/gpu/drm/ci/xfails/i915-amly-fails.txt |  2 +-
 .../gpu/drm/ci/xfails/i915-amly-flakes.txt    |  7 +++
 drivers/gpu/drm/ci/xfails/i915-apl-fails.txt  |  1 -
 drivers/gpu/drm/ci/xfails/i915-apl-flakes.txt |  7 +++
 drivers/gpu/drm/ci/xfails/i915-cml-fails.txt  | 10 ++--
 drivers/gpu/drm/ci/xfails/i915-cml-flakes.txt | 14 +++++
 drivers/gpu/drm/ci/xfails/i915-glk-fails.txt  |  1 +
 drivers/gpu/drm/ci/xfails/i915-kbl-fails.txt  |  2 -
 drivers/gpu/drm/ci/xfails/i915-tgl-fails.txt  | 34 ++++++++++--
 drivers/gpu/drm/ci/xfails/i915-whl-fails.txt  |  9 ++--
 .../drm/ci/xfails/mediatek-mt8173-fails.txt   | 11 +---
 .../drm/ci/xfails/mediatek-mt8183-fails.txt   |  6 ---
 .../gpu/drm/ci/xfails/meson-g12b-fails.txt    |  1 -
 .../gpu/drm/ci/xfails/msm-apq8016-fails.txt   |  5 --
 .../gpu/drm/ci/xfails/msm-apq8096-fails.txt   |  5 --
 .../msm-sc7180-trogdor-kingoftown-fails.txt   | 27 ----------
 ...sm-sc7180-trogdor-lazor-limozeen-fails.txt | 27 ----------
 .../gpu/drm/ci/xfails/msm-sdm845-fails.txt    |  6 +--
 .../gpu/drm/ci/xfails/msm-sdm845-flakes.txt   | 14 +++++
 .../gpu/drm/ci/xfails/msm-sdm845-skips.txt    |  5 ++
 .../gpu/drm/ci/xfails/panfrost-g12b-fails.txt |  1 +
 .../drm/ci/xfails/panfrost-mt8183-fails.txt   |  1 +
 .../drm/ci/xfails/panfrost-rk3288-fails.txt   |  1 +
 .../drm/ci/xfails/panfrost-rk3399-fails.txt   |  1 +
 .../drm/ci/xfails/rockchip-rk3288-fails.txt   | 22 +++++---
 .../drm/ci/xfails/rockchip-rk3288-flakes.txt  | 28 ++++++++++
 .../drm/ci/xfails/rockchip-rk3399-fails.txt   |  7 ---
 .../drm/ci/xfails/rockchip-rk3399-flakes.txt  | 28 ++++++++++
 drivers/gpu/drm/ci/xfails/vkms-none-fails.txt | 21 --------
 drivers/gpu/drm/ci/xfails/vkms-none-skips.txt | 53 +++++++++++++++++++
 34 files changed, 234 insertions(+), 148 deletions(-)

diff --git a/drivers/gpu/drm/ci/gitlab-ci.yml b/drivers/gpu/drm/ci/gitlab-ci.yml
index eca47d4f816f..90bde9f00cc3 100644
--- a/drivers/gpu/drm/ci/gitlab-ci.yml
+++ b/drivers/gpu/drm/ci/gitlab-ci.yml
@@ -1,14 +1,14 @@
 variables:
   DRM_CI_PROJECT_PATH: &drm-ci-project-path mesa/mesa
-  DRM_CI_COMMIT_SHA: &drm-ci-commit-sha d9849ac46623797a9f56fb9d46dc52460ac477de
+  DRM_CI_COMMIT_SHA: &drm-ci-commit-sha c6a9a9c3bce90923f7700219354e0b6e5a3c9ba6
 
   UPSTREAM_REPO: https://gitlab.freedesktop.org/drm/kernel.git
   TARGET_BRANCH: drm-next
 
-  IGT_VERSION: f13702b8e4e847c56da3ef6f0969065d686049c5
+  IGT_VERSION: a73311079a5d8ac99eb25336a8369a2c3c6b519b
 
   DEQP_RUNNER_GIT_URL: https://gitlab.freedesktop.org/mesa/deqp-runner.git
-  DEQP_RUNNER_GIT_TAG: v0.15.0
+  DEQP_RUNNER_GIT_TAG: v0.20.0
 
   FDO_UPSTREAM_REPO: helen.fornazier/linux   # The repo where the git-archive daily runs
   MESA_TEMPLATES_COMMIT: &ci-templates-commit d5aa3941aa03c2f716595116354fb81eb8012acb
@@ -153,6 +153,14 @@ stages:
     # Pre-merge pipeline for Marge Bot
     - if: &is-pre-merge-for-marge '$GITLAB_USER_LOGIN == "marge-bot" && $CI_PIPELINE_SOURCE == "merge_request_event"'
       when: on_success
+    # Push to a branch on a fork
+    - &is-fork-push '$CI_PROJECT_NAMESPACE != "mesa" && $CI_PIPELINE_SOURCE == "push"'
+
+# Rules applied to every job in the pipeline
+.common-rules:
+  rules:
+    - if: *is-fork-push
+      when: manual
 
 .never-post-merge-rules:
   rules:
diff --git a/drivers/gpu/drm/ci/image-tags.yml b/drivers/gpu/drm/ci/image-tags.yml
index 2c340d063a96..8d8b9e71852e 100644
--- a/drivers/gpu/drm/ci/image-tags.yml
+++ b/drivers/gpu/drm/ci/image-tags.yml
@@ -1,5 +1,5 @@
 variables:
-   CONTAINER_TAG: "2024-08-07-mesa-uprev"
+   CONTAINER_TAG: "2024-09-09-uprevs"
    DEBIAN_X86_64_BUILD_BASE_IMAGE: "debian/x86_64_build-base"
    DEBIAN_BASE_TAG: "${CONTAINER_TAG}"
 
diff --git a/drivers/gpu/drm/ci/xfails/amdgpu-stoney-fails.txt b/drivers/gpu/drm/ci/xfails/amdgpu-stoney-fails.txt
index 8e2fed6d76a3..f44dbce3151a 100644
--- a/drivers/gpu/drm/ci/xfails/amdgpu-stoney-fails.txt
+++ b/drivers/gpu/drm/ci/xfails/amdgpu-stoney-fails.txt
@@ -2,6 +2,7 @@ amdgpu/amd_abm at abm_enabled,Fail
 amdgpu/amd_abm at abm_gradual,Fail
 amdgpu/amd_abm at backlight_monotonic_abm,Fail
 amdgpu/amd_abm at backlight_monotonic_basic,Fail
+amdgpu/amd_abm at dpms_cycle,Fail
 amdgpu/amd_assr at assr-links,Fail
 amdgpu/amd_assr at assr-links-dpms,Fail
 amdgpu/amd_mall at static-screen,Crash
@@ -14,7 +15,6 @@ amdgpu/amd_plane at mpo-scale-p010,Fail
 amdgpu/amd_plane at mpo-scale-rgb,Crash
 amdgpu/amd_plane at mpo-swizzle-toggle,Fail
 amdgpu/amd_uvd_dec at amdgpu_uvd_decode,Fail
-dumb_buffer at invalid-bpp,Fail
 kms_addfb_basic at bad-pitch-65536,Fail
 kms_addfb_basic at bo-too-small,Fail
 kms_addfb_basic at too-high,Fail
diff --git a/drivers/gpu/drm/ci/xfails/amdgpu-stoney-flakes.txt b/drivers/gpu/drm/ci/xfails/amdgpu-stoney-flakes.txt
index e4faa96fa000..e70bd9d447ca 100644
--- a/drivers/gpu/drm/ci/xfails/amdgpu-stoney-flakes.txt
+++ b/drivers/gpu/drm/ci/xfails/amdgpu-stoney-flakes.txt
@@ -18,3 +18,10 @@ kms_async_flips at crc
 # IGT Version: 1.28-g0df7b9b97
 # Linux Version: 6.9.0-rc7
 kms_plane at pixel-format-source-clamping
+
+# Board Name: hp-11A-G6-EE-grunt
+# Bug Report: https://lore.kernel.org/amd-gfx/09ee1862-3a0e-4085-ac1b-262601b1122b at collabora.com/T/#t
+# Failure Rate: 100
+# IGT Version: 1.28-ga73311079
+# Linux Version: 6.11.0-rc2
+kms_async_flips at async-flip-with-page-flip-events
diff --git a/drivers/gpu/drm/ci/xfails/i915-amly-fails.txt b/drivers/gpu/drm/ci/xfails/i915-amly-fails.txt
index 9b84f68a5122..0907cb0f6d9e 100644
--- a/drivers/gpu/drm/ci/xfails/i915-amly-fails.txt
+++ b/drivers/gpu/drm/ci/xfails/i915-amly-fails.txt
@@ -1,3 +1,4 @@
+core_setmaster at master-drop-set-shared-fd,Fail
 core_setmaster at master-drop-set-user,Fail
 core_setmaster_vs_auth,Fail
 i915_module_load at load,Fail
@@ -6,7 +7,6 @@ i915_module_load at reload-no-display,Fail
 i915_module_load at resize-bar,Fail
 i915_pm_rpm at gem-execbuf-stress,Timeout
 i915_pm_rpm at module-reload,Fail
-kms_ccs at crc-primary-rotation-180-yf-tiled-ccs,Timeout
 kms_cursor_legacy at short-flip-before-cursor-atomic-transitions,Timeout
 kms_fb_coherency at memset-crc,Crash
 kms_flip at busy-flip,Timeout
diff --git a/drivers/gpu/drm/ci/xfails/i915-amly-flakes.txt b/drivers/gpu/drm/ci/xfails/i915-amly-flakes.txt
index 581f0da4d0f2..0207c9807bee 100644
--- a/drivers/gpu/drm/ci/xfails/i915-amly-flakes.txt
+++ b/drivers/gpu/drm/ci/xfails/i915-amly-flakes.txt
@@ -46,3 +46,10 @@ i915_hangman at engine-engine-hang
 # IGT Version: 1.28-gf13702b8e
 # Linux Version: 6.10.0-rc5
 kms_pm_rpm at modeset-lpsp-stress
+
+# Board Name: asus-C433TA-AJ0005-rammus
+# Bug Report: https://lore.kernel.org/intel-gfx/61f62c86-3e82-4eff-bd3c-8123fa0ca332 at collabora.com/T/#t
+# Failure Rate: 50
+# IGT Version: 1.28-ga73311079
+# Linux Version: 6.11.0-rc2
+kms_pm_rpm at drm-resources-equal
diff --git a/drivers/gpu/drm/ci/xfails/i915-apl-fails.txt b/drivers/gpu/drm/ci/xfails/i915-apl-fails.txt
index e612281149aa..64772fedaed5 100644
--- a/drivers/gpu/drm/ci/xfails/i915-apl-fails.txt
+++ b/drivers/gpu/drm/ci/xfails/i915-apl-fails.txt
@@ -8,7 +8,6 @@ kms_flip_scaled_crc at flip-32bpp-xtile-to-64bpp-xtile-downscaling,Fail
 kms_flip_scaled_crc at flip-32bpp-xtile-to-64bpp-xtile-upscaling,Fail
 kms_flip_scaled_crc at flip-32bpp-ytile-to-64bpp-ytile-downscaling,Fail
 kms_flip_scaled_crc at flip-32bpp-ytile-to-64bpp-ytile-upscaling,Fail
-kms_flip_scaled_crc at flip-32bpp-ytileccs-to-64bpp-ytile-downscaling,Fail
 kms_flip_scaled_crc at flip-32bpp-ytileccs-to-64bpp-ytile-upscaling,Fail
 kms_flip_scaled_crc at flip-64bpp-linear-to-16bpp-linear-downscaling,Fail
 kms_flip_scaled_crc at flip-64bpp-linear-to-16bpp-linear-upscaling,Fail
diff --git a/drivers/gpu/drm/ci/xfails/i915-apl-flakes.txt b/drivers/gpu/drm/ci/xfails/i915-apl-flakes.txt
index 4663d4d13f35..e8bddda56737 100644
--- a/drivers/gpu/drm/ci/xfails/i915-apl-flakes.txt
+++ b/drivers/gpu/drm/ci/xfails/i915-apl-flakes.txt
@@ -4,3 +4,10 @@
 # IGT Version: 1.28-g0df7b9b97
 # Linux Version: 6.9.0-rc7
 kms_fb_coherency at memset-crc
+
+# Board Name: asus-C523NA-A20057-coral
+# Bug Report: https://lore.kernel.org/intel-gfx/61f62c86-3e82-4eff-bd3c-8123fa0ca332 at collabora.com/T/#t
+# Failure Rate: 100
+# IGT Version: 1.28-ga73311079
+# Linux Version: 6.11.0-rc2
+kms_universal_plane at cursor-fb-leak
diff --git a/drivers/gpu/drm/ci/xfails/i915-cml-fails.txt b/drivers/gpu/drm/ci/xfails/i915-cml-fails.txt
index 2723e2832797..f352b719cf7d 100644
--- a/drivers/gpu/drm/ci/xfails/i915-cml-fails.txt
+++ b/drivers/gpu/drm/ci/xfails/i915-cml-fails.txt
@@ -1,5 +1,5 @@
+core_setmaster at master-drop-set-shared-fd,Fail
 core_setmaster at master-drop-set-user,Fail
-core_setmaster_vs_auth,Fail
 i915_module_load at load,Fail
 i915_module_load at reload,Fail
 i915_module_load at reload-no-display,Fail
@@ -9,10 +9,10 @@ i915_pipe_stress at stress-xrgb8888-ytiled,Fail
 i915_pm_rpm at gem-execbuf-stress,Timeout
 i915_pm_rpm at module-reload,Fail
 i915_pm_rpm at system-suspend-execbuf,Timeout
-kms_ccs at crc-primary-rotation-180-yf-tiled-ccs,Timeout
+i915_pm_rps at engine-order,Fail
+kms_big_fb at linear-16bpp-rotate-180,Timeout
 kms_fb_coherency at memset-crc,Crash
 kms_flip at busy-flip,Timeout
-kms_flip at single-buffer-flip-vs-dpms-off-vs-modeset-interruptible,Fail
 kms_flip_scaled_crc at flip-32bpp-linear-to-64bpp-linear-downscaling,Fail
 kms_flip_scaled_crc at flip-32bpp-linear-to-64bpp-linear-upscaling,Fail
 kms_flip_scaled_crc at flip-32bpp-xtile-to-64bpp-xtile-downscaling,Fail
@@ -40,14 +40,11 @@ kms_plane_alpha_blend at alpha-basic,Fail
 kms_plane_alpha_blend at alpha-opaque-fb,Fail
 kms_plane_alpha_blend at alpha-transparent-fb,Fail
 kms_plane_alpha_blend at constant-alpha-max,Fail
-kms_plane_scaling at plane-scaler-with-clipping-clamping-rotation,Timeout
 kms_plane_scaling at planes-upscale-factor-0-25-downscale-factor-0-5,Timeout
 kms_pm_rpm at modeset-stress-extra-wait,Timeout
 kms_pm_rpm at universal-planes,Timeout
 kms_pm_rpm at universal-planes-dpms,Timeout
-kms_prop_blob at invalid-set-prop,Fail
 kms_psr2_sf at cursor-plane-update-sf,Fail
-kms_psr2_sf at fbc-plane-move-sf-dmg-area,Timeout
 kms_psr2_sf at overlay-plane-update-continuous-sf,Fail
 kms_psr2_sf at overlay-plane-update-sf-dmg-area,Fail
 kms_psr2_sf at overlay-primary-update-sf-dmg-area,Fail
@@ -55,7 +52,6 @@ kms_psr2_sf at plane-move-sf-dmg-area,Fail
 kms_psr2_sf at primary-plane-update-sf-dmg-area,Fail
 kms_psr2_sf at primary-plane-update-sf-dmg-area-big-fb,Fail
 kms_psr2_su at page_flip-NV12,Fail
-kms_psr2_su at page_flip-P010,Fail
 kms_rotation_crc at primary-rotation-180,Timeout
 kms_setmode at basic,Fail
 kms_vblank at query-forked-hang,Timeout
diff --git a/drivers/gpu/drm/ci/xfails/i915-cml-flakes.txt b/drivers/gpu/drm/ci/xfails/i915-cml-flakes.txt
index 58a6001abb28..d8401251e5f4 100644
--- a/drivers/gpu/drm/ci/xfails/i915-cml-flakes.txt
+++ b/drivers/gpu/drm/ci/xfails/i915-cml-flakes.txt
@@ -11,3 +11,17 @@ kms_plane_alpha_blend at constant-alpha-min
 # IGT Version: 1.28-gf13702b8e
 # Linux Version: 6.10.0-rc5
 kms_atomic_transition at plane-all-modeset-transition-internal-panels
+
+# Board Name: asus-C436FA-Flip-hatch
+# Bug Report: https://lore.kernel.org/intel-gfx/61f62c86-3e82-4eff-bd3c-8123fa0ca332 at collabora.com/T/#t
+# Failure Rate: 100
+# IGT Version: 1.28-ga73311079
+# Linux Version: 6.11.0-rc2
+kms_plane_alpha_blend at constant-alpha-min
+
+# Board Name: asus-C436FA-Flip-hatch
+# Bug Report: https://lore.kernel.org/intel-gfx/61f62c86-3e82-4eff-bd3c-8123fa0ca332 at collabora.com/T/#t
+# Failure Rate: 50
+# IGT Version: 1.28-ga73311079
+# Linux Version: 6.11.0-rc2
+kms_async_flips at crc
diff --git a/drivers/gpu/drm/ci/xfails/i915-glk-fails.txt b/drivers/gpu/drm/ci/xfails/i915-glk-fails.txt
index 4821c9adefd1..6eb64c672f7d 100644
--- a/drivers/gpu/drm/ci/xfails/i915-glk-fails.txt
+++ b/drivers/gpu/drm/ci/xfails/i915-glk-fails.txt
@@ -63,3 +63,4 @@ xe_module_load at load,Fail
 xe_module_load at many-reload,Fail
 xe_module_load at reload,Fail
 xe_module_load at reload-no-display,Fail
+core_setmaster at master-drop-set-shared-fd,Fail
diff --git a/drivers/gpu/drm/ci/xfails/i915-kbl-fails.txt b/drivers/gpu/drm/ci/xfails/i915-kbl-fails.txt
index 1de04a3308c4..d4fba4f55ec1 100644
--- a/drivers/gpu/drm/ci/xfails/i915-kbl-fails.txt
+++ b/drivers/gpu/drm/ci/xfails/i915-kbl-fails.txt
@@ -17,12 +17,10 @@ perf at i915-ref-count,Fail
 perf_pmu at busy-accuracy-50,Fail
 perf_pmu at module-unload,Fail
 perf_pmu at rc6,Crash
-prime_busy at after,Fail
 sysfs_heartbeat_interval at long,Timeout
 sysfs_heartbeat_interval at off,Timeout
 sysfs_preempt_timeout at off,Timeout
 sysfs_timeslice_duration at off,Timeout
-testdisplay,Timeout
 xe_module_load at force-load,Fail
 xe_module_load at load,Fail
 xe_module_load at many-reload,Fail
diff --git a/drivers/gpu/drm/ci/xfails/i915-tgl-fails.txt b/drivers/gpu/drm/ci/xfails/i915-tgl-fails.txt
index e728ccc62326..461ef69ef08a 100644
--- a/drivers/gpu/drm/ci/xfails/i915-tgl-fails.txt
+++ b/drivers/gpu/drm/ci/xfails/i915-tgl-fails.txt
@@ -1,40 +1,64 @@
+api_intel_allocator at fork-simple-stress-signal,Timeout
+api_intel_allocator at open-vm,Timeout
 api_intel_allocator at simple-allocator,Timeout
+api_intel_bb at lot-of-buffers,Timeout
 api_intel_bb at object-reloc-keep-cache,Timeout
 api_intel_bb at offset-control,Timeout
-core_auth at getclient-simple,Timeout
-core_hotunplug at hotunbind-rebind,Timeout
+api_intel_bb at render-ccs,Timeout
+api_intel_bb at reset-bb,Timeout
+core_auth at basic-auth,Timeout
+core_hotunplug at hotrebind,Timeout
+core_setmaster at master-drop-set-user,Fail
 debugfs_test at read_all_entries_display_on,Timeout
-drm_read at invalid-buffer,Timeout
-drm_read at short-buffer-nonblock,Timeout
+drm_read at empty-block,Timeout
+dumb_buffer at create-clear,Timeout
+dumb_buffer at invalid-bpp,Timeout
 gen3_render_tiledx_blits,Timeout
 gen7_exec_parse at basic-allocation,Timeout
-gen7_exec_parse at batch-without-end,Timeout
 gen9_exec_parse at batch-invalid-length,Timeout
 gen9_exec_parse at bb-secure,Timeout
 gen9_exec_parse at secure-batches,Timeout
 gen9_exec_parse at shadow-peek,Timeout
 gen9_exec_parse at unaligned-jump,Timeout
+i915_getparams_basic at basic-subslice-total,Timeout
+i915_hangman at gt-engine-hang,Timeout
 i915_module_load at load,Fail
 i915_module_load at reload,Fail
 i915_module_load at reload-no-display,Fail
 i915_module_load at resize-bar,Fail
+i915_pciid,Timeout
+i915_pipe_stress at stress-xrgb8888-ytiled,Timeout
+i915_pm_rpm at gem-execbuf-stress,Timeout
+i915_pm_rps at engine-order,Timeout
+i915_pm_rps at thresholds-idle-park,Timeout
 i915_query at engine-info,Timeout
 i915_query at query-topology-kernel-writes,Timeout
 i915_query at test-query-geometry-subslices,Timeout
 kms_lease at lease-uevent,Fail
 kms_rotation_crc at multiplane-rotation,Fail
 perf at i915-ref-count,Fail
+perf_pmu at busy,Timeout
 perf_pmu at enable-race,Timeout
 perf_pmu at event-wait,Timeout
+perf_pmu at faulting-read,Timeout
 perf_pmu at gt-awake,Timeout
 perf_pmu at interrupts,Timeout
 perf_pmu at module-unload,Fail
+perf_pmu at most-busy-idle-check-all,Timeout
 perf_pmu at rc6,Crash
+perf_pmu at render-node-busy-idle,Fail
+perf_pmu at semaphore-wait-idle,Timeout
+prime_busy at after,Timeout
+prime_mmap at test_aperture_limit,Timeout
 prime_mmap at test_map_unmap,Timeout
 prime_mmap at test_refcounting,Timeout
 prime_self_import at basic-with_one_bo,Timeout
+sriov_basic at enable-vfs-autoprobe-off,Timeout
+syncobj_basic at bad-destroy,Timeout
 syncobj_basic at bad-flags-fd-to-handle,Timeout
+syncobj_basic at create-signaled,Timeout
 syncobj_eventfd at invalid-bad-pad,Timeout
+syncobj_eventfd at timeline-wait-before-signal,Timeout
 syncobj_wait at invalid-multi-wait-unsubmitted-signaled,Timeout
 syncobj_wait at invalid-signal-illegal-handle,Timeout
 syncobj_wait at invalid-single-wait-all-unsubmitted,Timeout
diff --git a/drivers/gpu/drm/ci/xfails/i915-whl-fails.txt b/drivers/gpu/drm/ci/xfails/i915-whl-fails.txt
index 2adae2175501..0ce240e3aa07 100644
--- a/drivers/gpu/drm/ci/xfails/i915-whl-fails.txt
+++ b/drivers/gpu/drm/ci/xfails/i915-whl-fails.txt
@@ -1,5 +1,5 @@
+core_setmaster at master-drop-set-shared-fd,Fail
 core_setmaster at master-drop-set-user,Fail
-core_setmaster_vs_auth,Fail
 i915_module_load at load,Fail
 i915_module_load at reload,Fail
 i915_module_load at reload-no-display,Fail
@@ -7,7 +7,8 @@ i915_module_load at resize-bar,Fail
 i915_pm_rpm at gem-execbuf-stress,Timeout
 i915_pm_rpm at module-reload,Fail
 i915_pm_rpm at system-suspend-execbuf,Timeout
-kms_ccs at crc-primary-rotation-180-yf-tiled-ccs,Timeout
+i915_pm_rps at engine-order,Fail
+kms_big_fb at linear-16bpp-rotate-180,Timeout
 kms_cursor_legacy at short-flip-before-cursor-atomic-transitions,Timeout
 kms_dirtyfb at default-dirtyfb-ioctl,Fail
 kms_dirtyfb at fbc-dirtyfb-ioctl,Fail
@@ -32,19 +33,17 @@ kms_flip_scaled_crc at flip-64bpp-ytile-to-32bpp-ytile-downscaling,Fail
 kms_flip_scaled_crc at flip-64bpp-ytile-to-32bpp-ytile-upscaling,Fail
 kms_flip_scaled_crc at flip-64bpp-ytile-to-32bpp-ytilegen12rcccs-upscaling,Fail
 kms_flip_scaled_crc at flip-64bpp-ytile-to-32bpp-ytilercccs-downscaling,Fail
-kms_frontbuffer_tracking at fbc-rgb565-draw-mmap-cpu,Timeout
 kms_frontbuffer_tracking at fbc-tiling-linear,Fail
+kms_frontbuffer_tracking at fbc-1p-indfb-fliptrack-mmap-gtt,Timeout
 kms_lease at lease-uevent,Fail
 kms_plane_alpha_blend at alpha-basic,Fail
 kms_plane_alpha_blend at alpha-opaque-fb,Fail
 kms_plane_alpha_blend at alpha-transparent-fb,Fail
 kms_plane_alpha_blend at constant-alpha-max,Fail
-kms_plane_scaling at plane-scaler-with-clipping-clamping-rotation,Timeout
 kms_plane_scaling at planes-upscale-factor-0-25-downscale-factor-0-5,Timeout
 kms_pm_rpm at modeset-stress-extra-wait,Timeout
 kms_pm_rpm at universal-planes,Timeout
 kms_pm_rpm at universal-planes-dpms,Timeout
-kms_prop_blob at invalid-set-prop,Fail
 kms_rotation_crc at primary-rotation-180,Timeout
 kms_vblank at query-forked-hang,Timeout
 perf at i915-ref-count,Fail
diff --git a/drivers/gpu/drm/ci/xfails/mediatek-mt8173-fails.txt b/drivers/gpu/drm/ci/xfails/mediatek-mt8173-fails.txt
index a14349a1967f..8e0efc80d510 100644
--- a/drivers/gpu/drm/ci/xfails/mediatek-mt8173-fails.txt
+++ b/drivers/gpu/drm/ci/xfails/mediatek-mt8173-fails.txt
@@ -1,8 +1,3 @@
-device_reset at cold-reset-bound,Fail
-device_reset at reset-bound,Fail
-device_reset at unbind-cold-reset-rebind,Fail
-device_reset at unbind-reset-rebind,Fail
-dumb_buffer at invalid-bpp,Fail
 fbdev at eof,Fail
 fbdev at read,Fail
 kms_3d,Fail
@@ -27,10 +22,6 @@ kms_cursor_legacy at cursor-vs-flip-atomic,Fail
 kms_cursor_legacy at cursor-vs-flip-legacy,Fail
 kms_flip at flip-vs-modeset-vs-hang,Fail
 kms_flip at flip-vs-panning-vs-hang,Fail
-kms_flip at flip-vs-suspend,Fail
-kms_flip at flip-vs-suspend-interruptible,Fail
 kms_lease at lease-uevent,Fail
-kms_properties at get_properties-sanity-atomic,Fail
-kms_properties at plane-properties-atomic,Fail
-kms_properties at plane-properties-legacy,Fail
 kms_rmfb at close-fd,Fail
+kms_flip at flip-vs-suspend-interruptible,Fail
diff --git a/drivers/gpu/drm/ci/xfails/mediatek-mt8183-fails.txt b/drivers/gpu/drm/ci/xfails/mediatek-mt8183-fails.txt
index 8cb2cb67853d..845f852bb4a0 100644
--- a/drivers/gpu/drm/ci/xfails/mediatek-mt8183-fails.txt
+++ b/drivers/gpu/drm/ci/xfails/mediatek-mt8183-fails.txt
@@ -1,10 +1,5 @@
 core_setmaster at master-drop-set-shared-fd,Fail
-device_reset at cold-reset-bound,Fail
-device_reset at reset-bound,Fail
-device_reset at unbind-cold-reset-rebind,Fail
-device_reset at unbind-reset-rebind,Fail
 dumb_buffer at create-clear,Crash
-dumb_buffer at invalid-bpp,Fail
 fbdev at eof,Fail
 fbdev at pan,Fail
 fbdev at read,Fail
@@ -18,5 +13,4 @@ kms_color at invalid-gamma-lut-sizes,Fail
 kms_flip at flip-vs-panning-vs-hang,Fail
 kms_flip at flip-vs-suspend,Fail
 kms_lease at lease-uevent,Fail
-kms_properties at plane-properties-atomic,Fail
 kms_rmfb at close-fd,Fail
diff --git a/drivers/gpu/drm/ci/xfails/meson-g12b-fails.txt b/drivers/gpu/drm/ci/xfails/meson-g12b-fails.txt
index 328967d3e23d..fc3745180683 100644
--- a/drivers/gpu/drm/ci/xfails/meson-g12b-fails.txt
+++ b/drivers/gpu/drm/ci/xfails/meson-g12b-fails.txt
@@ -1,4 +1,3 @@
-dumb_buffer at invalid-bpp,Fail
 kms_3d,Fail
 kms_cursor_legacy at forked-bo,Fail
 kms_cursor_legacy at forked-move,Fail
diff --git a/drivers/gpu/drm/ci/xfails/msm-apq8016-fails.txt b/drivers/gpu/drm/ci/xfails/msm-apq8016-fails.txt
index 4ac46168eff3..066d24ee3e08 100644
--- a/drivers/gpu/drm/ci/xfails/msm-apq8016-fails.txt
+++ b/drivers/gpu/drm/ci/xfails/msm-apq8016-fails.txt
@@ -1,8 +1,3 @@
-device_reset at cold-reset-bound,Fail
-device_reset at reset-bound,Fail
-device_reset at unbind-cold-reset-rebind,Fail
-device_reset at unbind-reset-rebind,Fail
-dumb_buffer at invalid-bpp,Fail
 kms_3d,Fail
 kms_cursor_legacy at torture-bo,Fail
 kms_force_connector_basic at force-edid,Fail
diff --git a/drivers/gpu/drm/ci/xfails/msm-apq8096-fails.txt b/drivers/gpu/drm/ci/xfails/msm-apq8096-fails.txt
index bd0653caf7a0..2893f98a6b97 100644
--- a/drivers/gpu/drm/ci/xfails/msm-apq8096-fails.txt
+++ b/drivers/gpu/drm/ci/xfails/msm-apq8096-fails.txt
@@ -1,7 +1,2 @@
-device_reset at cold-reset-bound,Fail
-device_reset at reset-bound,Fail
-device_reset at unbind-cold-reset-rebind,Fail
-device_reset at unbind-reset-rebind,Fail
-dumb_buffer at invalid-bpp,Fail
 kms_3d,Fail
 kms_lease at lease-uevent,Fail
diff --git a/drivers/gpu/drm/ci/xfails/msm-sc7180-trogdor-kingoftown-fails.txt b/drivers/gpu/drm/ci/xfails/msm-sc7180-trogdor-kingoftown-fails.txt
index d42004cd6977..6dbc2080347d 100644
--- a/drivers/gpu/drm/ci/xfails/msm-sc7180-trogdor-kingoftown-fails.txt
+++ b/drivers/gpu/drm/ci/xfails/msm-sc7180-trogdor-kingoftown-fails.txt
@@ -1,8 +1,3 @@
-device_reset at cold-reset-bound,Fail
-device_reset at reset-bound,Fail
-device_reset at unbind-cold-reset-rebind,Fail
-device_reset at unbind-reset-rebind,Fail
-dumb_buffer at invalid-bpp,Fail
 kms_color at ctm-0-25,Fail
 kms_color at ctm-0-50,Fail
 kms_color at ctm-0-75,Fail
@@ -11,35 +6,13 @@ kms_color at ctm-green-to-red,Fail
 kms_color at ctm-negative,Fail
 kms_color at ctm-red-to-blue,Fail
 kms_color at ctm-signed,Fail
-kms_content_protection at atomic,Crash
-kms_content_protection at atomic-dpms,Crash
-kms_content_protection at content-type-change,Crash
-kms_content_protection at lic-type-0,Crash
-kms_content_protection at lic-type-1,Crash
-kms_content_protection at srm,Crash
-kms_content_protection at type1,Crash
-kms_content_protection at uevent,Crash
-kms_cursor_legacy at 2x-cursor-vs-flip-atomic,Fail
-kms_cursor_legacy at 2x-cursor-vs-flip-legacy,Fail
-kms_cursor_legacy at 2x-flip-vs-cursor-atomic,Fail
-kms_cursor_legacy at 2x-flip-vs-cursor-legacy,Fail
-kms_cursor_legacy at 2x-long-cursor-vs-flip-atomic,Fail
-kms_cursor_legacy at 2x-long-cursor-vs-flip-legacy,Fail
-kms_cursor_legacy at 2x-long-flip-vs-cursor-atomic,Fail
-kms_cursor_legacy at 2x-long-flip-vs-cursor-legacy,Fail
 kms_cursor_legacy at cursor-vs-flip-toggle,Fail
 kms_cursor_legacy at cursor-vs-flip-varying-size,Fail
-kms_display_modes at extended-mode-basic,Fail
-kms_flip at 2x-flip-vs-modeset-vs-hang,Fail
-kms_flip at 2x-flip-vs-panning-vs-hang,Fail
 kms_flip at flip-vs-modeset-vs-hang,Fail
 kms_flip at flip-vs-panning-vs-hang,Fail
 kms_lease at lease-uevent,Fail
-kms_multipipe_modeset at basic-max-pipe-crc-check,Fail
 kms_pipe_crc_basic at compare-crc-sanitycheck-nv12,Fail
 kms_plane_alpha_blend at alpha-7efc,Fail
 kms_plane_alpha_blend at coverage-7efc,Fail
 kms_plane_alpha_blend at coverage-vs-premult-vs-constant,Fail
-kms_plane_lowres at tiling-none,Fail
 kms_rmfb at close-fd,Fail
-kms_vblank at ts-continuation-dpms-rpm,Fail
diff --git a/drivers/gpu/drm/ci/xfails/msm-sc7180-trogdor-lazor-limozeen-fails.txt b/drivers/gpu/drm/ci/xfails/msm-sc7180-trogdor-lazor-limozeen-fails.txt
index d42004cd6977..6dbc2080347d 100644
--- a/drivers/gpu/drm/ci/xfails/msm-sc7180-trogdor-lazor-limozeen-fails.txt
+++ b/drivers/gpu/drm/ci/xfails/msm-sc7180-trogdor-lazor-limozeen-fails.txt
@@ -1,8 +1,3 @@
-device_reset at cold-reset-bound,Fail
-device_reset at reset-bound,Fail
-device_reset at unbind-cold-reset-rebind,Fail
-device_reset at unbind-reset-rebind,Fail
-dumb_buffer at invalid-bpp,Fail
 kms_color at ctm-0-25,Fail
 kms_color at ctm-0-50,Fail
 kms_color at ctm-0-75,Fail
@@ -11,35 +6,13 @@ kms_color at ctm-green-to-red,Fail
 kms_color at ctm-negative,Fail
 kms_color at ctm-red-to-blue,Fail
 kms_color at ctm-signed,Fail
-kms_content_protection at atomic,Crash
-kms_content_protection at atomic-dpms,Crash
-kms_content_protection at content-type-change,Crash
-kms_content_protection at lic-type-0,Crash
-kms_content_protection at lic-type-1,Crash
-kms_content_protection at srm,Crash
-kms_content_protection at type1,Crash
-kms_content_protection at uevent,Crash
-kms_cursor_legacy at 2x-cursor-vs-flip-atomic,Fail
-kms_cursor_legacy at 2x-cursor-vs-flip-legacy,Fail
-kms_cursor_legacy at 2x-flip-vs-cursor-atomic,Fail
-kms_cursor_legacy at 2x-flip-vs-cursor-legacy,Fail
-kms_cursor_legacy at 2x-long-cursor-vs-flip-atomic,Fail
-kms_cursor_legacy at 2x-long-cursor-vs-flip-legacy,Fail
-kms_cursor_legacy at 2x-long-flip-vs-cursor-atomic,Fail
-kms_cursor_legacy at 2x-long-flip-vs-cursor-legacy,Fail
 kms_cursor_legacy at cursor-vs-flip-toggle,Fail
 kms_cursor_legacy at cursor-vs-flip-varying-size,Fail
-kms_display_modes at extended-mode-basic,Fail
-kms_flip at 2x-flip-vs-modeset-vs-hang,Fail
-kms_flip at 2x-flip-vs-panning-vs-hang,Fail
 kms_flip at flip-vs-modeset-vs-hang,Fail
 kms_flip at flip-vs-panning-vs-hang,Fail
 kms_lease at lease-uevent,Fail
-kms_multipipe_modeset at basic-max-pipe-crc-check,Fail
 kms_pipe_crc_basic at compare-crc-sanitycheck-nv12,Fail
 kms_plane_alpha_blend at alpha-7efc,Fail
 kms_plane_alpha_blend at coverage-7efc,Fail
 kms_plane_alpha_blend at coverage-vs-premult-vs-constant,Fail
-kms_plane_lowres at tiling-none,Fail
 kms_rmfb at close-fd,Fail
-kms_vblank at ts-continuation-dpms-rpm,Fail
diff --git a/drivers/gpu/drm/ci/xfails/msm-sdm845-fails.txt b/drivers/gpu/drm/ci/xfails/msm-sdm845-fails.txt
index 770a1c685fde..fa8c7e663858 100644
--- a/drivers/gpu/drm/ci/xfails/msm-sdm845-fails.txt
+++ b/drivers/gpu/drm/ci/xfails/msm-sdm845-fails.txt
@@ -1,8 +1,4 @@
-device_reset at cold-reset-bound,Fail
-device_reset at reset-bound,Fail
-device_reset at unbind-cold-reset-rebind,Fail
-device_reset at unbind-reset-rebind,Fail
-dumb_buffer at invalid-bpp,Fail
+drm_read at invalid-buffer,Fail
 kms_color at ctm-0-25,Fail
 kms_color at ctm-0-50,Fail
 kms_color at ctm-0-75,Fail
diff --git a/drivers/gpu/drm/ci/xfails/msm-sdm845-flakes.txt b/drivers/gpu/drm/ci/xfails/msm-sdm845-flakes.txt
index 2aa96b1241c3..38ec0305c1f4 100644
--- a/drivers/gpu/drm/ci/xfails/msm-sdm845-flakes.txt
+++ b/drivers/gpu/drm/ci/xfails/msm-sdm845-flakes.txt
@@ -116,3 +116,17 @@ kms_cursor_legacy at flip-vs-cursor-toggle
 # IGT Version: 1.28-gf13702b8e
 # Linux Version: 6.10.0-rc5
 msm/msm_shrink at copy-mmap-oom-8
+
+# Board Name: sdm845-cheza-r3
+# Bug Report: https://lore.kernel.org/linux-arm-msm/64bc4bcf-de51-4e60-a9f7-1295a1e64c65 at collabora.com/T/#t
+# Failure Rate: 50
+# IGT Version: 1.28-ga73311079
+# Linux Version: 6.11.0-rc2
+kms_lease at page-flip-implicit-plane
+
+# Board Name: sdm845-cheza-r3
+# Bug Report: https://lore.kernel.org/linux-arm-msm/64bc4bcf-de51-4e60-a9f7-1295a1e64c65 at collabora.com/T/#t
+# Failure Rate: 50
+# IGT Version: 1.28-ga73311079
+# Linux Version: 6.11.0-rc5
+kms_flip at flip-vs-expired-vblank
diff --git a/drivers/gpu/drm/ci/xfails/msm-sdm845-skips.txt b/drivers/gpu/drm/ci/xfails/msm-sdm845-skips.txt
index 90651048ab61..94783cafc21a 100644
--- a/drivers/gpu/drm/ci/xfails/msm-sdm845-skips.txt
+++ b/drivers/gpu/drm/ci/xfails/msm-sdm845-skips.txt
@@ -25,3 +25,8 @@ core_hotunplug.*
 
 # Whole machine hangs
 kms_cursor_crc.*
+
+# IGT test crash
+# IGT Version: 1.28-ga73311079
+# Linux Version: 6.11.0-rc2
+kms_content_protection at uevent
diff --git a/drivers/gpu/drm/ci/xfails/panfrost-g12b-fails.txt b/drivers/gpu/drm/ci/xfails/panfrost-g12b-fails.txt
index fe8ce2ce33e6..abd1ccb71561 100644
--- a/drivers/gpu/drm/ci/xfails/panfrost-g12b-fails.txt
+++ b/drivers/gpu/drm/ci/xfails/panfrost-g12b-fails.txt
@@ -1 +1,2 @@
 panfrost/panfrost_prime at gem-prime-import,Fail
+panfrost/panfrost_submit at pan-submit-error-bad-requirements,Fail
diff --git a/drivers/gpu/drm/ci/xfails/panfrost-mt8183-fails.txt b/drivers/gpu/drm/ci/xfails/panfrost-mt8183-fails.txt
index fe8ce2ce33e6..abd1ccb71561 100644
--- a/drivers/gpu/drm/ci/xfails/panfrost-mt8183-fails.txt
+++ b/drivers/gpu/drm/ci/xfails/panfrost-mt8183-fails.txt
@@ -1 +1,2 @@
 panfrost/panfrost_prime at gem-prime-import,Fail
+panfrost/panfrost_submit at pan-submit-error-bad-requirements,Fail
diff --git a/drivers/gpu/drm/ci/xfails/panfrost-rk3288-fails.txt b/drivers/gpu/drm/ci/xfails/panfrost-rk3288-fails.txt
index 4a2f4b6b14c1..8330b934602a 100644
--- a/drivers/gpu/drm/ci/xfails/panfrost-rk3288-fails.txt
+++ b/drivers/gpu/drm/ci/xfails/panfrost-rk3288-fails.txt
@@ -1 +1,2 @@
 panfrost/panfrost_prime at gem-prime-import,Crash
+panfrost/panfrost_submit at pan-submit-error-bad-requirements,Crash
diff --git a/drivers/gpu/drm/ci/xfails/panfrost-rk3399-fails.txt b/drivers/gpu/drm/ci/xfails/panfrost-rk3399-fails.txt
index fe8ce2ce33e6..abd1ccb71561 100644
--- a/drivers/gpu/drm/ci/xfails/panfrost-rk3399-fails.txt
+++ b/drivers/gpu/drm/ci/xfails/panfrost-rk3399-fails.txt
@@ -1 +1,2 @@
 panfrost/panfrost_prime at gem-prime-import,Fail
+panfrost/panfrost_submit at pan-submit-error-bad-requirements,Fail
diff --git a/drivers/gpu/drm/ci/xfails/rockchip-rk3288-fails.txt b/drivers/gpu/drm/ci/xfails/rockchip-rk3288-fails.txt
index ea7b2ceb95b9..90282dfa19f4 100644
--- a/drivers/gpu/drm/ci/xfails/rockchip-rk3288-fails.txt
+++ b/drivers/gpu/drm/ci/xfails/rockchip-rk3288-fails.txt
@@ -1,18 +1,24 @@
-core_setmaster at master-drop-set-root,Crash
 core_setmaster at master-drop-set-user,Crash
-core_setmaster_vs_auth,Crash
-device_reset at cold-reset-bound,Crash
-device_reset at reset-bound,Crash
-device_reset at unbind-cold-reset-rebind,Crash
-device_reset at unbind-reset-rebind,Crash
 dumb_buffer at create-clear,Crash
-dumb_buffer at invalid-bpp,Crash
 fbdev at pan,Crash
+kms_bw at linear-tiling-2-displays-1920x1080p,Fail
 kms_cursor_crc at cursor-onscreen-32x10,Crash
 kms_cursor_crc at cursor-onscreen-32x32,Crash
+kms_cursor_crc at cursor-onscreen-64x64,Crash
 kms_cursor_crc at cursor-random-32x10,Crash
+kms_cursor_crc at cursor-sliding-32x10,Crash
 kms_cursor_crc at cursor-sliding-32x32,Crash
+kms_cursor_crc at cursor-sliding-64x21,Crash
 kms_cursor_legacy at basic-flip-before-cursor-atomic,Fail
 kms_cursor_legacy at cursor-vs-flip-legacy,Fail
+kms_cursor_legacy at flip-vs-cursor-crc-atomic,Crash
+kms_flip at flip-vs-panning-vs-hang,Crash
+kms_invalid_mode at int-max-clock,Crash
+kms_lease at invalid-create-leases,Fail
+kms_pipe_crc_basic at read-crc-frame-sequence,Crash
+kms_plane at pixel-format,Crash
+kms_plane at pixel-format-source-clamping,Crash
 kms_prop_blob at invalid-set-prop,Crash
-kms_prop_blob at invalid-set-prop-any,Crash
+kms_properties at get_properties-sanity-atomic,Crash
+kms_properties at get_properties-sanity-non-atomic,Crash
+kms_rmfb at close-fd,Crash
diff --git a/drivers/gpu/drm/ci/xfails/rockchip-rk3288-flakes.txt b/drivers/gpu/drm/ci/xfails/rockchip-rk3288-flakes.txt
index 7ede273aab20..cd0b27d8b636 100644
--- a/drivers/gpu/drm/ci/xfails/rockchip-rk3288-flakes.txt
+++ b/drivers/gpu/drm/ci/xfails/rockchip-rk3288-flakes.txt
@@ -4,3 +4,31 @@
 # IGT Version: 1.28-gf13702b8e
 # Linux Version: 6.10.0-rc5
 kms_cursor_legacy at flip-vs-cursor-atomic
+
+# Board Name: rk3288-veyron-jaq
+# Bug Report: https://lore.kernel.org/linux-rockchip/7505ac00-29ef-4ad9-8904-94b4c024c02b at collabora.com/T/#t
+# Failure Rate: 100
+# IGT Version: 1.28-ga73311079
+# Linux Version: 6.11.0-rc2
+kms_cursor_crc at cursor-offscreen-32x10
+
+# Board Name: rk3288-veyron-jaq
+# Bug Report: https://lore.kernel.org/linux-rockchip/7505ac00-29ef-4ad9-8904-94b4c024c02b at collabora.com/T/#t
+# Failure Rate: 100
+# IGT Version: 1.28-ga73311079
+# Linux Version: 6.11.0-rc2
+kms_cursor_edge_walk at 64x64-left-edge
+
+# Board Name: rk3288-veyron-jaq
+# Bug Report: https://lore.kernel.org/linux-rockchip/7505ac00-29ef-4ad9-8904-94b4c024c02b at collabora.com/T/#t
+# Failure Rate: 100
+# IGT Version: 1.28-ga73311079
+# Linux Version: 6.11.0-rc2
+kms_flip at plain-flip-ts-check
+
+# Board Name: rk3288-veyron-jaq
+# Bug Report: https://lore.kernel.org/linux-rockchip/7505ac00-29ef-4ad9-8904-94b4c024c02b at collabora.com/T/#t
+# Failure Rate: 100
+# IGT Version: 1.28-ga73311079
+# Linux Version: 6.11.0-rc2
+kms_cursor_crc at cursor-alpha-opaque
diff --git a/drivers/gpu/drm/ci/xfails/rockchip-rk3399-fails.txt b/drivers/gpu/drm/ci/xfails/rockchip-rk3399-fails.txt
index 9309ff15e23a..83a38853b4af 100644
--- a/drivers/gpu/drm/ci/xfails/rockchip-rk3399-fails.txt
+++ b/drivers/gpu/drm/ci/xfails/rockchip-rk3399-fails.txt
@@ -1,9 +1,4 @@
-device_reset at cold-reset-bound,Fail
-device_reset at reset-bound,Fail
-device_reset at unbind-cold-reset-rebind,Fail
-device_reset at unbind-reset-rebind,Fail
 dumb_buffer at create-clear,Crash
-dumb_buffer at invalid-bpp,Fail
 kms_atomic_transition at modeset-transition,Fail
 kms_atomic_transition at modeset-transition-fencing,Fail
 kms_atomic_transition at plane-toggle-modeset-transition,Fail
@@ -46,7 +41,6 @@ kms_cursor_legacy at flip-vs-cursor-legacy,Fail
 kms_cursor_legacy at long-nonblocking-modeset-vs-cursor-atomic,Fail
 kms_flip at basic-flip-vs-wf_vblank,Fail
 kms_flip at blocking-wf_vblank,Fail
-kms_flip at dpms-vs-vblank-race,Fail
 kms_flip at flip-vs-absolute-wf_vblank,Fail
 kms_flip at flip-vs-blocking-wf-vblank,Fail
 kms_flip at flip-vs-modeset-vs-hang,Fail
@@ -59,7 +53,6 @@ kms_flip at plain-flip-fb-recreate,Fail
 kms_flip at plain-flip-fb-recreate-interruptible,Fail
 kms_flip at plain-flip-ts-check,Fail
 kms_flip at plain-flip-ts-check-interruptible,Fail
-kms_flip at wf_vblank-ts-check,Fail
 kms_flip at wf_vblank-ts-check-interruptible,Fail
 kms_invalid_mode at int-max-clock,Fail
 kms_lease at lease-uevent,Fail
diff --git a/drivers/gpu/drm/ci/xfails/rockchip-rk3399-flakes.txt b/drivers/gpu/drm/ci/xfails/rockchip-rk3399-flakes.txt
index d98f6a17343c..56f7d4f1ed15 100644
--- a/drivers/gpu/drm/ci/xfails/rockchip-rk3399-flakes.txt
+++ b/drivers/gpu/drm/ci/xfails/rockchip-rk3399-flakes.txt
@@ -46,3 +46,31 @@ kms_setmode at basic
 # IGT Version: 1.28-gf13702b8e
 # Linux Version: 6.10.0-rc5
 kms_bw at connected-linear-tiling-1-displays-2560x1440p
+
+# Board Name: rk3399-gru-kevin
+# Bug Report: https://lore.kernel.org/linux-rockchip/7505ac00-29ef-4ad9-8904-94b4c024c02b at collabora.com/T/#t
+# Failure Rate: 50
+# IGT Version: 1.28-ga73311079
+# Linux Version: 6.11.0-rc2
+kms_flip at wf_vblank-ts-check
+
+# Board Name: rk3399-gru-kevin
+# Bug Report: https://lore.kernel.org/linux-rockchip/7505ac00-29ef-4ad9-8904-94b4c024c02b at collabora.com/T/#t
+# Failure Rate: 50
+# IGT Version: 1.28-ga73311079
+# Linux Version: 6.11.0-rc5
+kms_flip at dpms-vs-vblank-race
+
+# Board Name: rk3399-gru-kevin
+# Bug Report: https://lore.kernel.org/linux-rockchip/7505ac00-29ef-4ad9-8904-94b4c024c02b at collabora.com/T/#t
+# Failure Rate: 50
+# IGT Version: 1.28-ga73311079
+# Linux Version: 6.11.0-rc5
+kms_bw at linear-tiling-2-displays-2160x1440p
+
+# Board Name: rk3399-gru-kevin
+# Bug Report: https://lore.kernel.org/linux-rockchip/7505ac00-29ef-4ad9-8904-94b4c024c02b at collabora.com/T/#t
+# Failure Rate: 50
+# IGT Version: 1.28-ga73311079
+# Linux Version: 6.11.0-rc5
+kms_flip at flip-vs-expired-vblank
diff --git a/drivers/gpu/drm/ci/xfails/vkms-none-fails.txt b/drivers/gpu/drm/ci/xfails/vkms-none-fails.txt
index 5408110f4c60..71c02104a683 100644
--- a/drivers/gpu/drm/ci/xfails/vkms-none-fails.txt
+++ b/drivers/gpu/drm/ci/xfails/vkms-none-fails.txt
@@ -1,24 +1,3 @@
-core_hotunplug at hotrebind,Fail
-core_hotunplug at hotrebind-lateclose,Fail
-core_hotunplug at hotreplug,Fail
-core_hotunplug at hotreplug-lateclose,Fail
-core_hotunplug at hotunbind-rebind,Fail
-core_hotunplug at hotunplug-rescan,Fail
-core_hotunplug at unbind-rebind,Fail
-core_hotunplug at unplug-rescan,Fail
-device_reset at cold-reset-bound,Fail
-device_reset at reset-bound,Fail
-device_reset at unbind-cold-reset-rebind,Fail
-device_reset at unbind-reset-rebind,Fail
-dumb_buffer at invalid-bpp,Fail
-kms_content_protection at atomic,Crash
-kms_content_protection at atomic-dpms,Crash
-kms_content_protection at content-type-change,Crash
-kms_content_protection at lic-type-0,Crash
-kms_content_protection at lic-type-1,Crash
-kms_content_protection at srm,Crash
-kms_content_protection at type1,Crash
-kms_content_protection at uevent,Crash
 kms_cursor_crc at cursor-rapid-movement-128x128,Fail
 kms_cursor_crc at cursor-rapid-movement-128x42,Fail
 kms_cursor_crc at cursor-rapid-movement-256x256,Fail
diff --git a/drivers/gpu/drm/ci/xfails/vkms-none-skips.txt b/drivers/gpu/drm/ci/xfails/vkms-none-skips.txt
index 5ccc771fbb36..b3d16e82e9a2 100644
--- a/drivers/gpu/drm/ci/xfails/vkms-none-skips.txt
+++ b/drivers/gpu/drm/ci/xfails/vkms-none-skips.txt
@@ -205,6 +205,59 @@ kms_cursor_edge_walk at 128x128-right-edge
 # R10: ffffa2c181790000 R11: 0000000000000000 R12: ffffa2c1814fa810
 # R13: 0000000000000031 R14: 0000000000000031 R15: 000000000000
 
+kms_cursor_edge_walk at 128x128-left-edge
+# DEBUG - Begin test kms_cursor_edge_walk at 128x128-left-edge
+# Oops: Oops: 0000 [#1] PREEMPT SMP NOPTI
+# CPU: 0 UID: 0 PID: 27 Comm: kworker/u8:1 Not tainted 6.11.0-rc5-g5d3429a7e9aa #1
+# Hardware name: ChromiumOS crosvm, BIOS 0
+# Workqueue: vkms_composer vkms_composer_worker [vkms]
+# RIP: 0010:compose_active_planes+0x344/0x4e0 [vkms]
+# Code: 6a 34 0f 8e 91 fe ff ff 44 89 ea 48 8d 7c 24 48 e8 71 f0 ff ff 4b 8b 04 fc 48 8b 4c 24 50 48 8b 7c 24 40 48 8b 80 48 01 00 00 <48> 63 70 18 8b 40 20 48 89 f2 48 c1 e6 03 29 d0 48 8b 54 24 48 48
+# RSP: 0018:ffffa437800ebd58 EFLAGS: 00010282
+# RAX: 0000000000000000 RBX: 0000000000000002 RCX: ffffa0e841904000
+# RDX: 00000000000000ff RSI: ffffa0e841905ff8 RDI: ffffa0e841902000
+# RBP: 0000000000000000 R08: ffffa0e84158a600 R09: 00000000000003ff
+# R10: 0000000078b2bcd2 R11: 00000000278b2bcd R12: ffffa0e84870fc60
+# R13: 0000000000000000 R14: 0000000000000000 R15: 0000000000000000
+# FS:  0000000000000000(0000) GS:ffffa0e86bc00000(0000) knlGS:0000000000000000
+# CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
+# CR2: 0000000000000018 CR3: 0000000101710000 CR4: 0000000000350ef0
+# Call Trace:
+#  <TASK>
+#  ? __die+0x1e/0x60
+#  ? page_fault_oops+0x17b/0x4a0
+#  ? exc_page_fault+0x6d/0x230
+#  ? asm_exc_page_fault+0x26/0x30
+#  ? compose_active_planes+0x344/0x4e0 [vkms]
+#  ? compose_active_planes+0x32f/0x4e0 [vkms]
+#  ? srso_return_thunk+0x5/0x5f
+#  vkms_composer_worker+0x205/0x240 [vkms]
+#  process_one_work+0x201/0x6c0
+#  ? lock_is_held_type+0x9e/0x110
+#  worker_thread+0x17e/0x310
+#  ? __pfx_worker_thread+0x10/0x10
+#  kthread+0xce/0x100
+#  ? __pfx_kthread+0x10/0x10
+#  ret_from_fork+0x2f/0x50
+#  ? __pfx_kthread+0x10/0x10
+#  ret_from_fork_asm+0x1a/0x30
+#  </TASK>
+# Modules linked in: vkms
+# CR2: 0000000000000018
+# ---[ end trace 0000000000000000 ]---
+# RIP: 0010:compose_active_planes+0x344/0x4e0 [vkms]
+# Code: 6a 34 0f 8e 91 fe ff ff 44 89 ea 48 8d 7c 24 48 e8 71 f0 ff ff 4b 8b 04 fc 48 8b 4c 24 50 48 8b 7c 24 40 48 8b 80 48 01 00 00 <48> 63 70 18 8b 40 20 48 89 f2 48 c1 e6 03 29 d0 48 8b 54 24 48 48
+# RSP: 0018:ffffa437800ebd58 EFLAGS: 00010282
+# RAX: 0000000000000000 RBX: 0000000000000002 RCX: ffffa0e841904000
+# RDX: 00000000000000ff RSI: ffffa0e841905ff8 RDI: ffffa0e841902000
+# RBP: 0000000000000000 R08: ffffa0e84158a600 R09: 00000000000003ff
+# R10: 0000000078b2bcd2 R11: 00000000278b2bcd R12: ffffa0e84870fc60
+# R13: 0000000000000000 R14: 0000000000000000 R15: 0000000000000000
+# FS:  0000000000000000(0000) GS:ffffa0e86bc00000(0000) knlGS:0000000000000000
+# CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
+# CR2: 0000000000000018 CR3: 0000000101710000 CR4: 0000000000350ef0
+# vkms_vblank_simulate: vblank timer overrun
+
 # Skip driver specific tests
 ^amdgpu.*
 ^msm.*
-- 
2.43.0



From pablo.sun at mediatek.com  Tue Sep 10 07:32:45 2024
From: pablo.sun at mediatek.com (Pablo Sun)
Date: Tue, 10 Sep 2024 22:32:45 +0800
Subject: [PATCH] arm64: dts: mediatek: mt8395-genio-1200-evk: Enable GPU
Message-ID: <20240910143245.5282-1-pablo.sun@mediatek.com>

Enable the Mali Valhall GPU on Genio 1200 EVK by providing regulator
supply settings and enable the GPU node.

In addition, set the GPU related regulator voltage range:

1. Set the recommended input voltage range of DVDD_GPU to (0.546V-0.787V),
   based on Table 5-3 of MT8395 Application Processor Datasheet.
   The regulator mt6315_7_vbuck1("Vgpu") connects to the DVDD_GPU input.
2. Set the input voltage of DVDD_SRAM_GPU, supplied by
   mt6359_vsram_others_ldo_reg, to 0.75V and set it always on for GPU SRAM.

This patch is tested by enabling CONFIG_DRM_PANFROST and
on Genio 1200 EVK it probed with following dmesg:

```
panfrost 13000000.gpu: clock rate = 700000092
panfrost 13000000.gpu: mali-g57 id 0x9093 major 0x0 minor 0x1 status 0x0
panfrost 13000000.gpu: features: 00000000,000019f7,
	               issues: 00000001,80000400
panfrost 13000000.gpu: Features: L2:0x07120206 Shader:0x00000000
                       Tiler:0x00000809 Mem:0x301
		       MMU:0x00002830 AS:0xff JS:0x7
panfrost 13000000.gpu: shader_present=0x50045 l2_present=0x1
[drm] Initialized panfrost 1.2.0 for 13000000.gpu on minor 0
```

Signed-off-by: Pablo Sun <pablo.sun at mediatek.com>
---
 .../boot/dts/mediatek/mt8395-genio-1200-evk.dts  | 16 ++++++++++++++--
 1 file changed, 14 insertions(+), 2 deletions(-)

diff --git a/arch/arm64/boot/dts/mediatek/mt8395-genio-1200-evk.dts b/arch/arm64/boot/dts/mediatek/mt8395-genio-1200-evk.dts
index a06610fff8ad..9b7850b0b9b4 100644
--- a/arch/arm64/boot/dts/mediatek/mt8395-genio-1200-evk.dts
+++ b/arch/arm64/boot/dts/mediatek/mt8395-genio-1200-evk.dts
@@ -194,6 +194,11 @@ eth_phy0: eth-phy0 at 1 {
 	};
 };
 
+&gpu {
+	mali-supply = <&mt6315_7_vbuck1>;
+	status = "okay";
+};
+
 &i2c0 {
 	clock-frequency = <400000>;
 	pinctrl-0 = <&i2c0_pins>;
@@ -407,6 +412,13 @@ &mt6359_vrf12_ldo_reg {
 	regulator-always-on;
 };
 
+/* for GPU SRAM */
+&mt6359_vsram_others_ldo_reg {
+	regulator-always-on;
+	regulator-min-microvolt = <750000>;
+	regulator-max-microvolt = <750000>;
+};
+
 &mt6359codec {
 	mediatek,mic-type-0 = <1>; /* ACC */
 	mediatek,mic-type-1 = <3>; /* DCC */
@@ -839,8 +851,8 @@ regulators {
 			mt6315_7_vbuck1: vbuck1 {
 				regulator-compatible = "vbuck1";
 				regulator-name = "Vgpu";
-				regulator-min-microvolt = <300000>;
-				regulator-max-microvolt = <1193750>;
+				regulator-min-microvolt = <546000>;
+				regulator-max-microvolt = <787000>;
 				regulator-enable-ramp-delay = <256>;
 				regulator-allowed-modes = <0 1 2>;
 			};
-- 
2.45.2



From tjmercier at google.com  Tue Sep 10 08:08:10 2024
From: tjmercier at google.com (T.J. Mercier)
Date: Tue, 10 Sep 2024 08:08:10 -0700
Subject: [RFC PATCH 4/4] dma-buf: heaps: add Linaro restricted dmabuf heap support
In-Reply-To: <CAHUa44E-7UMseWSEeneYYnAPyhH___=a1YYR6uaOVTNZytzg7g@mail.gmail.com>
References: <20240830070351.2855919-1-jens.wiklander@linaro.org>
 <20240830070351.2855919-5-jens.wiklander@linaro.org> <CABdmKX2KzswmiDY4oWw69_rPWs8d_Cqp7OXouSeMQaYX1SDSmw@mail.gmail.com>
 <CAHUa44FYYFVQWf0DGUXNHoOVQEC0-HRyYa0386dHNjo4y1qSiQ@mail.gmail.com>
 <CABdmKX0qd0RoTn2TBQTs9zdf=_JP8pW8hFRUR_7n_t-sfxsGdg@mail.gmail.com> <CAHUa44E-7UMseWSEeneYYnAPyhH___=a1YYR6uaOVTNZytzg7g@mail.gmail.com>
Message-ID: <CABdmKX2Tsp-KG6_Lth7VUcZcxCfgbsBYqZ5N2h574J+sNP2SxA@mail.gmail.com>

On Mon, Sep 9, 2024 at 11:06?PM Jens Wiklander
<jens.wiklander at linaro.org> wrote:
>
> On Wed, Sep 4, 2024 at 11:42?PM T.J. Mercier <tjmercier at google.com> wrote:
> >
> > On Wed, Sep 4, 2024 at 2:44?AM Jens Wiklander <jens.wiklander at linaro.org> wrote:
> > >
> > > On Tue, Sep 3, 2024 at 7:50?PM T.J. Mercier <tjmercier at google.com> wrote:
> > > >
> > > > On Fri, Aug 30, 2024 at 12:04?AM Jens Wiklander
> > > > <jens.wiklander at linaro.org> wrote:
> > > > >
> > > > > Add a Linaro restricted heap using the linaro,restricted-heap bindings
> > > > > implemented based on the generic restricted heap.
> > > > >
> > > > > The bindings defines a range of physical restricted memory. The heap
> > > > > manages this address range using genalloc. The allocated dma-buf file
> > > > > descriptor can later be registered with the TEE subsystem for later use
> > > > > via Trusted Applications in the secure world.
> > > > >
> > > > > Co-developed-by: Olivier Masse <olivier.masse at nxp.com>
> > > > > Signed-off-by: Olivier Masse <olivier.masse at nxp.com>
> > > > > Signed-off-by: Jens Wiklander <jens.wiklander at linaro.org>
> > > > > ---
> > > > >  drivers/dma-buf/heaps/Kconfig                 |  10 ++
> > > > >  drivers/dma-buf/heaps/Makefile                |   1 +
> > > > >  .../dma-buf/heaps/restricted_heap_linaro.c    | 165 ++++++++++++++++++
> > > > >  3 files changed, 176 insertions(+)
> > > > >  create mode 100644 drivers/dma-buf/heaps/restricted_heap_linaro.c
> > > > >
> > > > > diff --git a/drivers/dma-buf/heaps/Kconfig b/drivers/dma-buf/heaps/Kconfig
> > > > > index 58903bc62ac8..82e2c5d09242 100644
> > > > > --- a/drivers/dma-buf/heaps/Kconfig
> > > > > +++ b/drivers/dma-buf/heaps/Kconfig
> > > > > @@ -28,3 +28,13 @@ config DMABUF_HEAPS_RESTRICTED_MTK
> > > > >         help
> > > > >           Enable restricted dma-buf heaps for MediaTek platform. This heap is backed by
> > > > >           TEE client interfaces. If in doubt, say N.
> > > > > +
> > > > > +config DMABUF_HEAPS_RESTRICTED_LINARO
> > > > > +       bool "Linaro DMA-BUF Restricted Heap"
> > > > > +       depends on DMABUF_HEAPS_RESTRICTED
> > > > > +       help
> > > > > +         Choose this option to enable the Linaro restricted dma-buf heap.
> > > > > +         The restricted heap pools are defined according to the DT. Heaps
> > > > > +         are allocated in the pools using gen allocater.
> > > > > +         If in doubt, say N.
> > > > > +
> > > > > diff --git a/drivers/dma-buf/heaps/Makefile b/drivers/dma-buf/heaps/Makefile
> > > > > index 0028aa9d875f..66b2f67c47b5 100644
> > > > > --- a/drivers/dma-buf/heaps/Makefile
> > > > > +++ b/drivers/dma-buf/heaps/Makefile
> > > > > @@ -2,4 +2,5 @@
> > > > >  obj-$(CONFIG_DMABUF_HEAPS_CMA)         += cma_heap.o
> > > > >  obj-$(CONFIG_DMABUF_HEAPS_RESTRICTED)  += restricted_heap.o
> > > > >  obj-$(CONFIG_DMABUF_HEAPS_RESTRICTED_MTK)      += restricted_heap_mtk.o
> > > > > +obj-$(CONFIG_DMABUF_HEAPS_RESTRICTED_LINARO)   += restricted_heap_linaro.o
> > > > >  obj-$(CONFIG_DMABUF_HEAPS_SYSTEM)      += system_heap.o
> > > > > diff --git a/drivers/dma-buf/heaps/restricted_heap_linaro.c b/drivers/dma-buf/heaps/restricted_heap_linaro.c
> > > > > new file mode 100644
> > > > > index 000000000000..4b08ed514023
> > > > > --- /dev/null
> > > > > +++ b/drivers/dma-buf/heaps/restricted_heap_linaro.c
> > > > > @@ -0,0 +1,165 @@
> > > > > +// SPDX-License-Identifier: GPL-2.0
> > > > > +/*
> > > > > + * DMABUF secure heap exporter
> > > > > + *
> > > > > + * Copyright 2021 NXP.
> > > > > + * Copyright 2024 Linaro Limited.
> > > > > + */
> > > > > +
> > > > > +#define pr_fmt(fmt)     "rheap_linaro: " fmt
> > > > > +
> > > > > +#include <linux/dma-buf.h>
> > > > > +#include <linux/err.h>
> > > > > +#include <linux/genalloc.h>
> > > > > +#include <linux/module.h>
> > > > > +#include <linux/of.h>
> > > > > +#include <linux/of_fdt.h>
> > > > > +#include <linux/of_reserved_mem.h>
> > > > > +#include <linux/scatterlist.h>
> > > > > +#include <linux/slab.h>
> > > > > +
> > > > > +#include "restricted_heap.h"
> > > > > +
> > > > > +#define MAX_HEAP_COUNT 2
> > > >
> > > > Are multiple supported because of what Cyrille mentioned here about permissions?
> > > > https://lore.kernel.org/lkml/DBBPR04MB7514E006455AEA407041E4F788709 at DBBPR04MB7514.eurprd04.prod.outlook.com/
> > >
> > > Yes, I kept that as is.
> >
> > Ok thanks.
> >
> > > > So this is just some arbitrary limit? I'd prefer to have some sort of
> > > > documentation about this.
> > >
> > > How about removing the limit and using dynamic allocation instead?
> >
> > That works too!
>
> It turns out that was easier said than done. The limit is hardcoded
> because dynamic memory allocation isn't available at that stage during
> boot. We have a short description of this heap in Kconfig. I'll add
> something about the limit there if that makes sense.
>
> Thanks,
> Jens

Ah ok sounds good.

I noticed one other thing, linaro_restricted_heap_init and add_heap
should probably have __init. Last week I sent a patch to add that for
the CMA and system heaps.


From druth at google.com  Tue Sep 10 08:55:42 2024
From: druth at google.com (David Ruth)
Date: Tue, 10 Sep 2024 11:55:42 -0400
Subject: [PATCH] wifi: mt76: mt7921: fix using incorrect group cipher
 after disconnection.
In-Reply-To: <20240801024335.12981-1-mingyen.hsieh@mediatek.com>
References: <20240801024335.12981-1-mingyen.hsieh@mediatek.com>
Message-ID: <CAKHmtrQCvDO=0m6GC_dkcqbnCUhsCk2hemMsLmrpcFsQsuRHoA@mail.gmail.com>

Tested-by: David Ruth <druth at chromium.org>
Reviewed-by: David Ruth <druth at chromium.org>


From druth at chromium.org  Tue Sep 10 08:57:32 2024
From: druth at chromium.org (David Ruth)
Date: Tue, 10 Sep 2024 11:57:32 -0400
Subject: [PATCH] wifi: mt76: mt7921: fix a potential scan no APs
In-Reply-To: <1ac1ae779db86d4012199a24ea2ca74050ed4af6.1721300411.git.quan.zhou@mediatek.com>
References: <1ac1ae779db86d4012199a24ea2ca74050ed4af6.1721300411.git.quan.zhou@mediatek.com>
Message-ID: <CAKHmtrQFv5S0Z+mEy01haFLu=pi8XuAUDs-UZxR9CjNtBYOzTg@mail.gmail.com>

Tested-by: David Ruth <druth at chromium.org>
Reviewed-by: David Ruth <druth at chromium.org>


From marc.payne at mdpsys.co.uk  Tue Sep 10 10:09:05 2024
From: marc.payne at mdpsys.co.uk (Marc Payne)
Date: Tue, 10 Sep 2024 18:09:05 +0100
Subject: [PATCH] Bluetooth: btmtk: Remove resetting mt7921 before
 downloading the fw
In-Reply-To: <20240822052310.25220-1-hao.qin@mediatek.com>
References: <20240822052310.25220-1-hao.qin@mediatek.com>
Message-ID: <ZuB3omUkdUHLggYu@mdpsys.co.uk>

Hi,

The 22/08/2024 13:23, Hao Qin wrote:
> Remove resetting mt7921 before downloading the fw, as it may cause
> command timeout when performing the reset.
> 
> Signed-off-by: Hao Qin <hao.qin at mediatek.com>
> ---
>  drivers/bluetooth/btmtk.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/bluetooth/btmtk.c b/drivers/bluetooth/btmtk.c
> index 2b7c80043aa2..a46f70135cbd 100644
> --- a/drivers/bluetooth/btmtk.c
> +++ b/drivers/bluetooth/btmtk.c
> @@ -1326,7 +1326,6 @@ int btmtk_usb_setup(struct hci_dev *hdev)
>  		fwname = FIRMWARE_MT7668;
>  		break;
>  	case 0x7922:
> -	case 0x7961:
>  	case 0x7925:
>  		/* Reset the device to ensure it's in the initial state before
>  		 * downloading the firmware to ensure.
> @@ -1334,7 +1333,8 @@ int btmtk_usb_setup(struct hci_dev *hdev)
>  
>  		if (!test_bit(BTMTK_FIRMWARE_LOADED, &btmtk_data->flags))
>  			btmtk_usb_subsys_reset(hdev, dev_id);
> -
> +		fallthrough;
> +	case 0x7961:
>  		btmtk_fw_get_filename(fw_bin_name, sizeof(fw_bin_name), dev_id,
>  				      fw_version, fw_flavor);
>  
> -- 
> 2.18.0
> 

[Original regression report
https://lore.kernel.org/linux-bluetooth/ZsTh7Jyug7MbZsLE at mdpsys.co.uk/]

Thanks for the patch, I have tested it on top of v6.11-rc7 and can confirm
that it resolves the initial command timeout issue.

Unfortunately, when using the latest firmware version 20240826151221 from the
linux-firmware repo I'm still seeing "Mediatek coredump end" errors
followed by MSFT and AOSP errors. The device then appears unresponsive
and the kernel eventually gives up attempting to enumerate:

[  230.042936] usb 4-3.2: new SuperSpeed USB device number 4 using xhci_hcd
[  230.065228] usb 4-3.2: New USB device found, idVendor=0e8d, idProduct=7961, bcdDevice= 1.00
[  230.065237] usb 4-3.2: New USB device strings: Mfr=6, Product=7, SerialNumber=8
[  230.065240] usb 4-3.2: Product: Wireless_Device
[  230.065242] usb 4-3.2: Manufacturer: MediaTek Inc.
[  230.065245] usb 4-3.2: SerialNumber: 000000000
[  230.101915] Bluetooth: hci2: HW/SW Version: 0x008a008a, Build Time: 20240826151221
[  233.005938] Bluetooth: hci2: Device setup in 2862056 usecs
[  233.005983] Bluetooth: hci2: HCI Enhanced Setup Synchronous Connection command is advertised, but not supported.
[  234.306071] Bluetooth: hci2: Mediatek coredump end
[  235.092729] Bluetooth: hci2: Opcode 0x0c03 failed: -110
[  235.192772] Bluetooth: hci2: Mediatek coredump end
[  237.226157] Bluetooth: hci2: Failed to read MSFT supported features (-110)
[  239.359435] Bluetooth: hci2: AOSP get vendor capabilities (-110)
[  244.479726] usb 4-3.2: Disable of device-initiated U1 failed.
[  249.599598] usb 4-3.2: Disable of device-initiated U2 failed.
[  259.839215] Bluetooth: hci2: Failed to write uhw reg(-110)
[  259.839240] usb 4-3.2: Disable of device-initiated U1 failed.
[  264.959343] usb 4-3.2: Disable of device-initiated U2 failed.
[  270.079038] xhci_hcd 0000:00:14.0: Timeout while waiting for setup device command
[  275.412299] xhci_hcd 0000:00:14.0: Timeout while waiting for setup device command
[  275.618812] usb 4-3.2: device not accepting address 4, error -62
[  280.958852] xhci_hcd 0000:00:14.0: Timeout while waiting for setup device command
[  286.292034] xhci_hcd 0000:00:14.0: Timeout while waiting for setup device command
[  286.498618] usb 4-3.2: device not accepting address 4, error -62
[  291.838759] xhci_hcd 0000:00:14.0: Timeout while waiting for setup device command
[  297.172018] xhci_hcd 0000:00:14.0: Timeout while waiting for setup device command
[  297.378477] usb 4-3.2: device not accepting address 4, error -62
[  302.718497] xhci_hcd 0000:00:14.0: Timeout while waiting for setup device command
[  308.051867] xhci_hcd 0000:00:14.0: Timeout while waiting for setup device command
[  308.258345] usb 4-3.2: device not accepting address 4, error -62
[  308.260253] usb 4-3.2: USB disconnect, device number 4
[  313.598307] xhci_hcd 0000:00:14.0: Timeout while waiting for setup device command
[  318.931586] xhci_hcd 0000:00:14.0: Timeout while waiting for setup device command
[  319.138278] usb 4-3.2: device not accepting address 5, error -62
[  324.478224] xhci_hcd 0000:00:14.0: Timeout while waiting for setup device command
[  329.811444] xhci_hcd 0000:00:14.0: Timeout while waiting for setup device command
[  330.018032] usb 4-3.2: device not accepting address 6, error -62
[  330.018489] usb 4-3-port2: attempt power cycle
[  336.211505] xhci_hcd 0000:00:14.0: Timeout while waiting for setup device command
[  341.544640] xhci_hcd 0000:00:14.0: Timeout while waiting for setup device command
[  341.751239] usb 4-3.2: device not accepting address 7, error -62
[  347.091375] xhci_hcd 0000:00:14.0: Timeout while waiting for setup device command
[  352.424563] xhci_hcd 0000:00:14.0: Timeout while waiting for setup device command
[  352.631136] usb 4-3.2: device not accepting address 8, error -62
[  352.631538] usb 4-3-port2: unable to enumerate USB device


Interestingly, if I revert back to an known-good firmware version
20231025113744 along with your patch, the device enumerates and works fine:

[ 4001.366725] usb 4-1: new SuperSpeed USB device number 4 using xhci_hcd
[ 4001.385840] usb 4-1: New USB device found, idVendor=0e8d, idProduct=7961, bcdDevice= 1.00
[ 4001.385855] usb 4-1: New USB device strings: Mfr=6, Product=7, SerialNumber=8
[ 4001.385860] usb 4-1: Product: Wireless_Device
[ 4001.385863] usb 4-1: Manufacturer: MediaTek Inc.
[ 4001.385867] usb 4-1: SerialNumber: 000000000
[ 4001.398010] Bluetooth: hci1: HW/SW Version: 0x008a008a, Build Time: 20231025113744
[ 4004.275656] Bluetooth: hci1: Device setup in 2812288 usecs
[ 4004.275661] Bluetooth: hci1: HCI Enhanced Setup Synchronous Connection command is advertised, but not supported.
[ 4004.355137] Bluetooth: hci1: AOSP extensions version v0.96
[ 4004.355156] Bluetooth: hci1: AOSP quality report is not supported
[ 4004.355698] Bluetooth: MGMT ver 1.23

But if I then disconnect it, I get the Oops that I shared in my original
regression report:

[ 4043.436215] usb 4-1: USB disconnect, device number 4
[ 4043.437308] Oops: general protection fault, probably for non-canonical address 0xdead000000000122: 0000 [#1] PREEMPT SMP NOPTI
[ 4043.437332] CPU: 2 UID: 0 PID: 3698 Comm: kworker/2:0 Not tainted 6.11.0-rc7-00001-g0e2ad6528188-dirty #71 d90fb9085e2a0686ac48ebcc408d97b104c6fbf1
[ 4043.437352] Hardware name: Intel(R) Client Systems NUC12WSHi7/NUC12WSBi7, BIOS WSADL357.0088.2023.0505.1623 05/05/2023
[ 4043.437361] Workqueue: usb_hub_wq hub_event
[ 4043.437386] RIP: 0010:hci_unregister_dev+0x45/0x1f0 [bluetooth]
[ 4043.437548] Code: 89 ef e8 ae d4 5c c1 f0 80 8b e9 0e 00 00 08 48 89 ef e8 0e c2 5c c1 48 c7 c7 68 60 52 c1 e8 22 23 5d c1 48 8b 43 08 48 8b 13 <48> 3b 18 0f 85 f5 c7 06 00 48 3b 5a 08 0f 85 eb c7 06 00 48 89 42
[ 4043.437560] RSP: 0018:ffffa10f4ae43b98 EFLAGS: 00010246
[ 4043.437574] RAX: dead000000000122 RBX: ffff8cf86c160000 RCX: 0000000000000000
[ 4043.437585] RDX: dead000000000100 RSI: ffff8cf7b7d16c50 RDI: ffffffffc1526068
[ 4043.437594] RBP: ffff8cf86c1604d0 R08: 0000000000000000 R09: ffff8cf7401d8e10
[ 4043.437602] R10: ffffa10f4ae43ba0 R11: ffffa10f4ae43ba8 R12: ffff8cf86c160000
[ 4043.437610] R13: ffffffffc1416278 R14: ffffffffc1416278 R15: ffff8cf7f8d73850
[ 4043.437620] FS:  0000000000000000(0000) GS:ffff8d0697300000(0000) knlGS:0000000000000000
[ 4043.437632] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[ 4043.437641] CR2: 00007f98d66dc000 CR3: 0000000131124000 CR4: 0000000000f50ef0
[ 4043.437651] PKRU: 55555554
[ 4043.437658] Call Trace:
[ 4043.437670]  <TASK>
[ 4043.437680]  ? __die_body.cold+0x19/0x27
[ 4043.437700]  ? die_addr+0x3c/0x60
[ 4043.437716]  ? exc_general_protection+0x17d/0x400
[ 4043.437738]  ? asm_exc_general_protection+0x26/0x30
[ 4043.437760]  ? hci_unregister_dev+0x45/0x1f0 [bluetooth 6dca047d1088401e195d97746b2b4936e5756d61]
[ 4043.437930]  ? hci_unregister_dev+0x3e/0x1f0 [bluetooth 6dca047d1088401e195d97746b2b4936e5756d61]
[ 4043.438080]  btusb_disconnect+0x67/0x170 [btusb 5bf8186d9cab4c5be1762247dadb6753a7c72a7f]
[ 4043.438108]  usb_unbind_interface+0x90/0x290
[ 4043.438130]  device_release_driver_internal+0x19c/0x200
[ 4043.438150]  bus_remove_device+0xc6/0x130
[ 4043.438166]  device_del+0x161/0x3e0
[ 4043.438182]  ? kobject_put+0xa0/0x1d0
[ 4043.438196]  usb_disable_device+0x104/0x220
[ 4043.438213]  usb_disconnect+0xe6/0x2e0
[ 4043.438231]  hub_event+0x7f9/0x19d0
[ 4043.438250]  ? __pm_runtime_suspend+0x47/0xc0
[ 4043.438269]  process_one_work+0x17b/0x330
[ 4043.438287]  worker_thread+0x2c6/0x3f0
[ 4043.438304]  ? __pfx_worker_thread+0x10/0x10
[ 4043.438318]  kthread+0xcf/0x100
[ 4043.438337]  ? __pfx_kthread+0x10/0x10
[ 4043.438354]  ret_from_fork+0x31/0x50
[ 4043.438367]  ? __pfx_kthread+0x10/0x10
[ 4043.438382]  ret_from_fork_asm+0x1a/0x30
[ 4043.438403]  </TASK>
[ 4043.438408] Modules linked in: uhid mt792x_usb mt7921_common mt792x_lib mt76_connac_lib mt76_usb mt76 ccm option usb_wwan cmac algif_hash algif_skcipher af_alg sr_mod cdrom bnep mousedev joydev vfat fat snd_sof_pci_intel_tgl snd_sof_pci_intel_cnl intel_rapl_msr snd_sof_intel_hda_generic intel_rapl_common soundwire_intel intel_uncore_frequency soundwire_cadence intel_uncore_frequency_common snd_sof_intel_hda_common snd_sof_intel_hda_mlink snd_sof_intel_hda snd_sof_pci snd_sof_xtensa_dsp snd_sof iwlmvm snd_sof_utils snd_soc_hdac_hda snd_soc_acpi_intel_match soundwire_generic_allocation snd_soc_acpi soundwire_bus snd_soc_avs r8152 x86_pkg_temp_thermal intel_powerclamp libphy snd_soc_hda_codec coretemp mac80211 snd_hda_ext_core kvm_intel snd_soc_core snd_hda_codec_hdmi cdc_ether hid_generic uas usbnet snd_hda_codec_realtek snd_compress kvm usb_storage mii usbhid snd_hda_codec_generic ac97_bus snd_pcm_dmaengine snd_hda_scodec_component snd_hda_intel libarc4 snd_intel_dspcfg btusb crct10dif_pclmul snd_intel_sdw_acpi
[ 4043.438617]  crc32_pclmul iwlwifi btrtl snd_hda_codec polyval_clmulni btintel polyval_generic btbcm ghash_clmulni_intel sha512_ssse3 btmtk tps6598x sha256_ssse3 snd_hda_core typec sha1_ssse3 cfg80211 bluetooth aesni_intel snd_hwdep roles gf128mul crypto_simd snd_pcm cryptd mei_hdcp mei_pxp rapl ee1004 ov13858 snd_timer intel_cstate igc spi_nor intel_uncore i2c_i801 thunderbolt snd v4l2_fwnode mei_me v4l2_async ptp wdat_wdt i2c_smbus mtd pcspkr wmi_bmof intel_lpss_pci videodev mei pps_core soundcore intel_pmc_core i2c_mux intel_lpss rfkill idma64 igen6_edac intel_vsec serial_multi_instantiate mc pmt_telemetry pinctrl_tigerlake pmt_class acpi_pad acpi_tad mac_hid i2c_dev dm_mod sg crypto_user loop nfnetlink ip_tables x_tables ext4 crc32c_generic crc16 mbcache jbd2 xe drm_ttm_helper gpu_sched drm_suballoc_helper drm_gpuvm drm_exec i915 i2c_algo_bit drm_buddy ttm nvme intel_gtt drm_display_helper nvme_core spi_intel_pci cec xhci_pci crc32c_intel spi_intel nvme_auth xhci_pci_renesas video wmi
[ 4043.438898] ---[ end trace 0000000000000000 ]---
[ 4043.438905] RIP: 0010:hci_unregister_dev+0x45/0x1f0 [bluetooth]
[ 4043.439039] Code: 89 ef e8 ae d4 5c c1 f0 80 8b e9 0e 00 00 08 48 89 ef e8 0e c2 5c c1 48 c7 c7 68 60 52 c1 e8 22 23 5d c1 48 8b 43 08 48 8b 13 <48> 3b 18 0f 85 f5 c7 06 00 48 3b 5a 08 0f 85 eb c7 06 00 48 89 42
[ 4043.439048] RSP: 0018:ffffa10f4ae43b98 EFLAGS: 00010246
[ 4043.439058] RAX: dead000000000122 RBX: ffff8cf86c160000 RCX: 0000000000000000
[ 4043.439065] RDX: dead000000000100 RSI: ffff8cf7b7d16c50 RDI: ffffffffc1526068
[ 4043.439072] RBP: ffff8cf86c1604d0 R08: 0000000000000000 R09: ffff8cf7401d8e10
[ 4043.439078] R10: ffffa10f4ae43ba0 R11: ffffa10f4ae43ba8 R12: ffff8cf86c160000
[ 4043.439085] R13: ffffffffc1416278 R14: ffffffffc1416278 R15: ffff8cf7f8d73850
[ 4043.439091] FS:  0000000000000000(0000) GS:ffff8d0697300000(0000) knlGS:0000000000000000
[ 4043.439100] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[ 4043.439108] CR2: 00007f98d66dc000 CR3: 0000000131124000 CR4: 0000000000f50ef0
[ 4043.439116] PKRU: 55555554
[ 4043.439122] note: kworker/2:0[3698] exited with preempt_count 1

So, in summary, it looks as though there are two issues here:

1. The latest firmware does not seem to work well with this chipset,
   perhaps it is crashing after loading?
2. The Oops in the hci_unregister_dev function suggests some HCI
   registration bug.

Let me know if I can provide any further assistance.

Regards,

Marc



From sashal at kernel.org  Tue Sep 10 10:21:53 2024
From: sashal at kernel.org (Sasha Levin)
Date: Tue, 10 Sep 2024 13:21:53 -0400
Subject: [PATCH AUTOSEL 6.10 08/18] ASoC: mediatek: mt8188-mt6359: Modify key
In-Reply-To: <20240910172214.2415568-1-sashal@kernel.org>
References: <20240910172214.2415568-1-sashal@kernel.org>
Message-ID: <20240910172214.2415568-8-sashal@kernel.org>

From: Zhang Yi <zhangyi at everest-semi.com>

[ Upstream commit 5325b96769a5b282e330023e1d0881018e89e266 ]

In order to get the correct keys when using the ES8326.We will associate
SND_JACK_BTN_1 to KEY_VOLUMEUP and SND_JACK_BTN_2 to KEY_VOLUMEDOWN
when the ES8326 flag is recognized.

Signed-off-by: Zhang Yi <zhangyi at everest-semi.com>
Link: https://patch.msgid.link/20240816114921.48913-1-zhangyi at everest-semi.com
Signed-off-by: Mark Brown <broonie at kernel.org>
Signed-off-by: Sasha Levin <sashal at kernel.org>
---
 sound/soc/mediatek/mt8188/mt8188-mt6359.c | 17 +++++++++++++----
 1 file changed, 13 insertions(+), 4 deletions(-)

diff --git a/sound/soc/mediatek/mt8188/mt8188-mt6359.c b/sound/soc/mediatek/mt8188/mt8188-mt6359.c
index eba6f4c445ff..08ae962afeb9 100644
--- a/sound/soc/mediatek/mt8188/mt8188-mt6359.c
+++ b/sound/soc/mediatek/mt8188/mt8188-mt6359.c
@@ -734,6 +734,7 @@ static int mt8188_headset_codec_init(struct snd_soc_pcm_runtime *rtd)
 	struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(rtd->card);
 	struct snd_soc_jack *jack = &soc_card_data->card_data->jacks[MT8188_JACK_HEADSET];
 	struct snd_soc_component *component = snd_soc_rtd_to_codec(rtd, 0)->component;
+	struct mtk_platform_card_data *card_data = soc_card_data->card_data;
 	int ret;
 
 	ret = snd_soc_dapm_new_controls(&card->dapm, mt8188_nau8825_widgets,
@@ -762,10 +763,18 @@ static int mt8188_headset_codec_init(struct snd_soc_pcm_runtime *rtd)
 		return ret;
 	}
 
-	snd_jack_set_key(jack->jack, SND_JACK_BTN_0, KEY_PLAYPAUSE);
-	snd_jack_set_key(jack->jack, SND_JACK_BTN_1, KEY_VOICECOMMAND);
-	snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEUP);
-	snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOLUMEDOWN);
+	if (card_data->flags & ES8326_HS_PRESENT) {
+		snd_jack_set_key(jack->jack, SND_JACK_BTN_0, KEY_PLAYPAUSE);
+		snd_jack_set_key(jack->jack, SND_JACK_BTN_1, KEY_VOLUMEUP);
+		snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEDOWN);
+		snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOICECOMMAND);			
+	} else {
+		snd_jack_set_key(jack->jack, SND_JACK_BTN_0, KEY_PLAYPAUSE);
+		snd_jack_set_key(jack->jack, SND_JACK_BTN_1, KEY_VOICECOMMAND);
+		snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEUP);
+		snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOLUMEDOWN);	
+	}
+	
 	ret = snd_soc_component_set_jack(component, jack, NULL);
 
 	if (ret) {
-- 
2.43.0



From marc.payne at mdpsys.co.uk  Tue Sep 10 10:29:27 2024
From: marc.payne at mdpsys.co.uk (Marc Payne)
Date: Tue, 10 Sep 2024 18:29:27 +0100
Subject: [REGRESSION] [BISECTED] btusb: driver fails to initialize
 MT7921AUN on v6.11-rc4
In-Reply-To: <acc76c2a-b176-4a19-8b5b-2ced402c3c8e@leemhuis.info>
References: <ZsTh7Jyug7MbZsLE@mdpsys.co.uk>
 <76922517-7497-48b5-a581-d1290d413604@molgen.mpg.de>
 <acc76c2a-b176-4a19-8b5b-2ced402c3c8e@leemhuis.info>
Message-ID: <ZuCB98DSdtKCgxaL@mdpsys.co.uk>

Hi Thorsten,

Thanks for following this up.

The 06/09/2024 12:34, Linux regression tracking (Thorsten Leemhuis) wrote:
> Hi, Thorsten here, the Linux kernel's regression tracker. Top-posting
> for once, to make this easily accessible to everyone.
> 
> Marc, does the problem still occur with recent mainline? It looks like
> nobody ever took care of this report, but I might be missing something
> -- or maybe some later change fixed this intentionally or due to
> side-effects.
> 

I can confirm that the regression is still present on v6.11-rc7. I have
tested the patch I have been made aware of [1] and it solves the command
timeout but the device remains unusable running the latest firmware and the
Oops still occurs on device disconnection. I have reported this back in
response to the patch [2].

[1] https://lore.kernel.org/lkml/20240822052310.25220-1-hao.qin at mediatek.com/
[2] https://lore.kernel.org/lkml/ZuB3omUkdUHLggYu at mdpsys.co.uk/

> Ciao, Thorsten (wearing his 'the Linux kernel's regression tracker' hat)
> 
> On 21.08.24 07:27, Paul Menzel wrote:
> > [Cc: +Marcel, +Luiz]
> > 
> > Thank you for your report and bisecting the issue. I just add the
> > maintainers, and tell regzbot about it.
> > 
> > Am 20.08.24 um 20:35 schrieb Marc Payne:
> >> Hello,
> >>
> >> I'm testing v6.11-rc4 and the btusb driver fails to properly
> >> initialize my
> >> MT7921AUN-based Alfa Networks AWUS036AXML:
> >>
> >> [?? 63.896319] usb 4-3.1.2: new SuperSpeed USB device number 4 using
> >> xhci_hcd
> >> [?? 63.915436] usb 4-3.1.2: New USB device found, idVendor=0e8d,
> >> idProduct=7961, bcdDevice= 1.00
> >> [?? 63.915450] usb 4-3.1.2: New USB device strings: Mfr=6, Product=7,
> >> SerialNumber=8
> >> [?? 63.915455] usb 4-3.1.2: Product: Wireless_Device
> >> [?? 63.915459] usb 4-3.1.2: Manufacturer: MediaTek Inc.
> >> [?? 63.915461] usb 4-3.1.2: SerialNumber: 000000000
> >> [?? 69.146856] Bluetooth: hci1: Failed to write uhw reg(-110)
> >> [?? 69.149213] Bluetooth: hci1: HW/SW Version: 0x008a008a, Build Time:
> >> 20240716151445
> >> [?? 78.530621] usb 4-3.1.2: Failed to suspend device, error -110
> >> [?? 88.553074] Bluetooth: hci1: Execution of wmt command timed out
> >> [?? 88.553097] Bluetooth: hci1: Failed to send wmt patch dwnld (-110)
> >> [?? 88.553186] Bluetooth: hci1: Failed to set up firmware (-110)
> >> [?? 88.553193] Bluetooth: hci1: HCI Enhanced Setup Synchronous
> >> Connection command is advertised, but not supported.
> >> [?? 90.899462] usb 4-3.1.2: Failed to suspend device, error -110
> >>
> >> I have bisected the issue down to the following commit:
> >>
> >> ???? ccfc8948d7e4 ("Bluetooth: btusb: mediatek: reset the controller
> >> before downloading the fw")
> >>
> >> The commit does not revert cleanly due to refactoring in subsequent
> >> commits but
> >> removing the relevant ten lines of code allows the driver to
> >> initialize the
> >> device correctly, albeit with some failures and 'Mediatek coredump'
> >> errors
> >> followed by an additional reset. Interestingly, after the reset the
> >> device is
> >> now showing as hci2 rather than hci1, suggesting an HCI device
> >> registration
> >> issue... Bluetooth devices are able to pair and connect as expected:
> >>
> >> [?? 77.765047] usb 4-3.1.2: new SuperSpeed USB device number 4 using
> >> xhci_hcd
> >> [?? 77.785044] usb 4-3.1.2: New USB device found, idVendor=0e8d,
> >> idProduct=7961, bcdDevice= 1.00
> >> [?? 77.785063] usb 4-3.1.2: New USB device strings: Mfr=6, Product=7,
> >> SerialNumber=8
> >> [?? 77.785069] usb 4-3.1.2: Product: Wireless_Device
> >> [?? 77.785073] usb 4-3.1.2: Manufacturer: MediaTek Inc.
> >> [?? 77.785077] usb 4-3.1.2: SerialNumber: 000000000
> >> [?? 77.807685] Bluetooth: hci1: HW/SW Version: 0x008a008a, Build Time:
> >> 20240716151445
> >> [?? 80.570163] Bluetooth: hci1: Device setup in 2710186 usecs
> >> [?? 80.570173] Bluetooth: hci1: HCI Enhanced Setup Synchronous
> >> Connection command is advertised, but not supported.
> >> [?? 81.871516] Bluetooth: hci1: Mediatek coredump end
> >> [?? 82.734805] Bluetooth: hci1: Opcode 0x0c03 failed: -110
> >> [?? 82.754807] Bluetooth: hci1: Mediatek coredump end
> >> [?? 84.868215] Bluetooth: hci1: Failed to read MSFT supported features
> >> (-110)
> >> [?? 87.001566] Bluetooth: hci1: AOSP get vendor capabilities (-110)
> >> [?? 92.292375] usb 4-3.1.2: reset SuperSpeed USB device number 4 using
> >> xhci_hcd
> >> [?? 92.385619] usb 4-3.1.2: reset SuperSpeed USB device number 4 using
> >> xhci_hcd
> >> [?? 92.406786] Bluetooth: hci2: HW/SW Version: 0x008a008a, Build Time:
> >> 20240716151445
> >> [?? 94.920337] Bluetooth: hci2: Device setup in 2455839 usecs
> >> [?? 94.920343] Bluetooth: hci2: HCI Enhanced Setup Synchronous
> >> Connection command is advertised, but not supported.
> >> [?? 94.994480] Bluetooth: hci2: AOSP extensions version v1.00
> >> [?? 94.994494] Bluetooth: hci2: AOSP quality report is supported
> >> [?? 94.995001] Bluetooth: MGMT ver 1.23
> >>
> >> However, when disconnecting the AWUS036AXML device I get an Oops in
> >> the hci_unregister_dev function, again indicating an issue with HCI
> >> registration
> >> which was not present in the 6.10 kernel versions:
> >>
> >> [ 1210.222351] usb 4-3.1.2: USB disconnect, device number 4
> >> [ 1210.271146] Oops: general protection fault, probably for non-
> >> canonical address 0xdead000000000122: 0000 [#1] PREEMPT SMP NOPTI
> >> [ 1210.271166] CPU: 2 UID: 0 PID: 2275 Comm: kworker/2:1 Not tainted
> >> 6.11.0-rc4-dirty #67 a319890a1bc323fc297a70bfc980897913c059f7
> >> [ 1210.271178] Hardware name: Intel(R) Client Systems NUC12WSHi7/
> >> NUC12WSBi7, BIOS WSADL357.0088.2023.0505.1623 05/05/2023
> >> [ 1210.271183] Workqueue: usb_hub_wq hub_event
> >> [ 1210.271200] RIP: 0010:hci_unregister_dev+0x45/0x1f0 [bluetooth]
> >> [ 1210.271292] Code: 89 ef e8 0e c4 ca dc f0 80 8b e9 0e 00 00 08 48
> >> 89 ef e8 6e b1 ca dc 48 c7 c7 68 70 44 c1 e8 82 12 cb dc 48 8b 43 08
> >> 48 8b 13 <48> 3b 18 0f 85 35 c8 06 00 48 3b 5a 08 0f 85 2b c8 06 00 48
> >> 89 42
> >> [ 1210.271297] RSP: 0018:ffffbb3b0661bb98 EFLAGS: 00010246
> >> [ 1210.271305] RAX: dead000000000122 RBX: ffff97bc8f92e000 RCX:
> >> 0000000000000000
> >> [ 1210.271310] RDX: dead000000000100 RSI: ffff97bc8ba8b610 RDI:
> >> ffffffffc1447068
> >> [ 1210.271314] RBP: ffff97bc8f92e4d0 R08: ffff97bc8424b5c0 R09:
> >> 00000000802a0026
> >> [ 1210.271318] R10: 00000000802a0026 R11: 0000000000000001 R12:
> >> ffff97bc8f92e000
> >> [ 1210.271323] R13: ffffffffc12ff278 R14: ffffffffc12ff278 R15:
> >> ffff97bcf25acc50
> >> [ 1210.271327] FS:? 0000000000000000(0000) GS:ffff97cbd7300000(0000)
> >> knlGS:0000000000000000
> >> [ 1210.271332] CS:? 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
> >> [ 1210.271337] CR2: 0000285c01b10000 CR3: 00000003d6e22000 CR4:
> >> 0000000000f50ef0
> >> [ 1210.271342] PKRU: 55555554
> >> [ 1210.271346] Call Trace:
> >> [ 1210.271352]? <TASK>
> >> [ 1210.271359]? ? __die_body.cold+0x19/0x27
> >> [ 1210.271371]? ? die_addr+0x3c/0x60
> >> [ 1210.271378]? ? exc_general_protection+0x17d/0x400
> >> [ 1210.271391]? ? asm_exc_general_protection+0x26/0x30
> >> [ 1210.271403]? ? hci_unregister_dev+0x45/0x1f0 [bluetooth
> >> ffdb4fb65cead032fbb8f4718e5d0aa7b94d492f]
> >> [ 1210.271479]? ? hci_unregister_dev+0x3e/0x1f0 [bluetooth
> >> ffdb4fb65cead032fbb8f4718e5d0aa7b94d492f]
> >> [ 1210.271551]? btusb_disconnect+0x67/0x170 [btusb
> >> ce322bda915639979ec31f72a2b85eb752188d36]
> >> [ 1210.271563]? usb_unbind_interface+0x90/0x290
> >> [ 1210.271576]? device_release_driver_internal+0x19c/0x200
> >> [ 1210.271589]? bus_remove_device+0xc6/0x130
> >> [ 1210.271599]? device_del+0x161/0x3e0
> >> [ 1210.271608]? ? kobject_put+0xa0/0x1d0
> >> [ 1210.271617]? usb_disable_device+0x104/0x220
> >> [ 1210.271627]? usb_disconnect+0xe6/0x2e0
> >> [ 1210.271637]? hub_event+0x7f9/0x19d0
> >> [ 1210.271648]? ? __schedule+0x3dd/0x1520
> >> [ 1210.271656]? process_one_work+0x17b/0x330
> >> [ 1210.271667]? worker_thread+0x2d2/0x400
> >> [ 1210.271676]? ? __pfx_worker_thread+0x10/0x10
> >> [ 1210.271684]? kthread+0xcf/0x100
> >> [ 1210.271695]? ? __pfx_kthread+0x10/0x10
> >> [ 1210.271705]? ret_from_fork+0x31/0x50
> >> [ 1210.271711]? ? __pfx_kthread+0x10/0x10
> >> [ 1210.271720]? ret_from_fork_asm+0x1a/0x30
> >> [ 1210.271732]? </TASK>
> >> [ 1210.271735] Modules linked in: mt792x_usb mt7921_common mt792x_lib
> >> mt76_connac_lib mt76_usb mt76 ccm option usb_wwan rndis_host uhid cmac
> >> algif_hash algif_skcipher af_alg bnep vfat fat cdc_ether usbnet
> >> intel_rapl_msr intel_rapl_common intel_uncore_frequency
> >> intel_uncore_frequency_common snd_sof_pci_intel_tgl
> >> snd_sof_pci_intel_cnl iwlmvm snd_sof_intel_hda_generic soundwire_intel
> >> soundwire_cadence snd_sof_intel_hda_common x86_pkg_temp_thermal
> >> intel_powerclamp snd_sof_intel_hda_mlink snd_sof_intel_hda coretemp
> >> snd_sof_pci snd_sof_xtensa_dsp kvm_intel snd_sof r8152 mii
> >> snd_sof_utils mac80211 libphy snd_soc_hdac_hda kvm
> >> snd_soc_acpi_intel_match soundwire_generic_allocation snd_soc_acpi
> >> soundwire_bus snd_soc_avs snd_hda_codec_hdmi snd_soc_hda_codec
> >> snd_hda_ext_core snd_hda_codec_realtek snd_soc_core
> >> snd_hda_codec_generic snd_hda_scodec_component crct10dif_pclmul
> >> crc32_pclmul polyval_clmulni snd_compress polyval_generic ac97_bus
> >> libarc4 ghash_clmulni_intel snd_pcm_dmaengine sha512_ssse3
> >> sha256_ssse3 snd_hda_intel sha1_ssse3
> >> [ 1210.271851]? aesni_intel btusb snd_intel_dspcfg snd_intel_sdw_acpi
> >> gf128mul iwlwifi snd_hda_codec btrtl crypto_simd cryptd btintel
> >> tps6598x btbcm typec snd_hda_core btmtk rapl cfg80211 roles mei_pxp
> >> mei_hdcp snd_hwdep intel_cstate ee1004 bluetooth igc snd_pcm spi_nor
> >> intel_uncore ov13858 mei_me snd_timer thunderbolt v4l2_fwnode snd ptp
> >> mei i2c_i801 v4l2_async wdat_wdt mtd pcspkr intel_lpss_pci wmi_bmof
> >> pps_core i2c_smbus intel_lpss videodev soundcore i2c_mux rfkill idma64
> >> intel_pmc_core mousedev igen6_edac joydev serial_multi_instantiate
> >> intel_vsec mc pmt_telemetry acpi_pad acpi_tad pinctrl_tigerlake
> >> pmt_class mac_hid i2c_dev dm_mod sg crypto_user loop nfnetlink
> >> ip_tables x_tables ext4 crc32c_generic crc16 mbcache jbd2 xe
> >> drm_ttm_helper gpu_sched drm_suballoc_helper drm_gpuvm drm_exec i915
> >> hid_generic usbhid i2c_algo_bit drm_buddy ttm intel_gtt nvme
> >> drm_display_helper nvme_core video spi_intel_pci cec xhci_pci
> >> crc32c_intel nvme_auth spi_intel xhci_pci_renesas wmi
> >> [ 1210.271992] ---[ end trace 0000000000000000 ]---
> >> [ 1210.271996] RIP: 0010:hci_unregister_dev+0x45/0x1f0 [bluetooth]
> >> [ 1210.272061] Code: 89 ef e8 0e c4 ca dc f0 80 8b e9 0e 00 00 08 48
> >> 89 ef e8 6e b1 ca dc 48 c7 c7 68 70 44 c1 e8 82 12 cb dc 48 8b 43 08
> >> 48 8b 13 <48> 3b 18 0f 85 35 c8 06 00 48 3b 5a 08 0f 85 2b c8 06 00 48
> >> 89 42
> >> [ 1210.272066] RSP: 0018:ffffbb3b0661bb98 EFLAGS: 00010246
> >> [ 1210.272071] RAX: dead000000000122 RBX: ffff97bc8f92e000 RCX:
> >> 0000000000000000
> >> [ 1210.272075] RDX: dead000000000100 RSI: ffff97bc8ba8b610 RDI:
> >> ffffffffc1447068
> >> [ 1210.272078] RBP: ffff97bc8f92e4d0 R08: ffff97bc8424b5c0 R09:
> >> 00000000802a0026
> >> [ 1210.272082] R10: 00000000802a0026 R11: 0000000000000001 R12:
> >> ffff97bc8f92e000
> >> [ 1210.272085] R13: ffffffffc12ff278 R14: ffffffffc12ff278 R15:
> >> ffff97bcf25acc50
> >> [ 1210.272088] FS:? 0000000000000000(0000) GS:ffff97cbd7300000(0000)
> >> knlGS:0000000000000000
> >> [ 1210.272092] CS:? 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
> >> [ 1210.272096] CR2: 0000285c01b10000 CR3: 00000003d6e22000 CR4:
> >> 0000000000f50ef0
> >> [ 1210.272099] PKRU: 55555554
> >> [ 1210.272102] note: kworker/2:1[2275] exited with preempt_count 1
> >>
> >>
> >> The kworker exiting obviously means that the kernel no longer responds
> >> to events
> >> on any of the USB ports...
> >>
> >> I hope you can track down the issue, let me know if you need any
> >> additional
> >> details.
> >>
> >> Regards,
> >>
> >> Marc
> 
> --
> Everything you wanna know about Linux kernel regression tracking:
> https://linux-regtracking.leemhuis.info/about/#tldr
> If I did something stupid, please tell me, as explained on that page.
> 
> #regzbot poke
> 

Regards,

Marc



From florian.fainelli at broadcom.com  Tue Sep 10 10:40:40 2024
From: florian.fainelli at broadcom.com (Florian Fainelli)
Date: Tue, 10 Sep 2024 10:40:40 -0700
Subject: [PATCH 1/2] net: dsa: RCU-protect dsa_ptr in struct net_device
In-Reply-To: <20240910130321.337154-2-alexander.sverdlin@siemens.com>
References: <20240910130321.337154-1-alexander.sverdlin@siemens.com>
 <20240910130321.337154-2-alexander.sverdlin@siemens.com>
Message-ID: <b6604e07-9add-4e93-ad6b-f1efc336e3bf@broadcom.com>

On 9/10/24 06:03, 'A. Sverdlin' via BCM-KERNEL-FEEDBACK-LIST,PDL wrote:
> From: Alexander Sverdlin <alexander.sverdlin at siemens.com>
> 
> There are multiple races of zeroing dsa_ptr in struct net_device (on
> shutdown/remove) against asynchronous dereferences all over the net
> code. Widespread pattern is as follows:
> 
> CPU0					CPU1
> if (netdev_uses_dsa())
> 					dev->dsa_ptr = NULL;
>          dev->dsa_ptr->...
> 
> One of the possible crashes:
> 
> Unable to handle kernel NULL pointer dereference at virtual address 0000000000000010
> CPU: 0 PID: 12 Comm: ksoftirqd/0 Tainted: G O 6.1.99+ #1
> pc : lan9303_rcv
> lr : lan9303_rcv
> Call trace:
>   lan9303_rcv
>   dsa_switch_rcv
>   __netif_receive_skb_list_core
>   netif_receive_skb_list_internal
>   napi_gro_receive
>   fec_enet_rx_napi
>   __napi_poll
>   net_rx_action
> ...
> 
> RCU-protect dsa_ptr and use rcu_dereference() or rtnl_dereference()
> depending on the calling context.
> 
> Rename netdev_uses_dsa() into __netdev_uses_dsa_currently()
> (assumes ether RCU or RTNL lock held) and netdev_uses_dsa_currently()
> variants which better reflect the uselessness of the function's
> return value, which becomes outdated right after the call.
> 
> Fixes: ee534378f005 ("net: dsa: fix panic when DSA master device unbinds on shutdown")
> Cc: stable at vger.kernel.org
> Signed-off-by: Alexander Sverdlin <alexander.sverdlin at siemens.com>

Thanks for doing this work, just a few nits below. This is likely to be 
difficult to backport to stable trees.

> ---
>   drivers/net/dsa/mt7530.c                    |   3 +-
>   drivers/net/dsa/ocelot/felix.c              |   3 +-
>   drivers/net/dsa/qca/qca8k-8xxx.c            |   3 +-
>   drivers/net/ethernet/broadcom/bcmsysport.c  |   8 +-
>   drivers/net/ethernet/mediatek/airoha_eth.c  |   2 +-
>   drivers/net/ethernet/mediatek/mtk_eth_soc.c |  22 +++--
>   drivers/net/ethernet/mediatek/mtk_ppe.c     |  15 ++-
>   include/linux/netdevice.h                   |   2 +-
>   include/net/dsa.h                           |  36 +++++--
>   include/net/dsa_stubs.h                     |   6 +-
>   net/bridge/br_input.c                       |   2 +-
>   net/core/dev.c                              |   3 +-
>   net/core/flow_dissector.c                   |  19 ++--
>   net/dsa/conduit.c                           |  66 ++++++++-----
>   net/dsa/dsa.c                               |  19 ++--
>   net/dsa/port.c                              |   3 +-
>   net/dsa/tag.c                               |   3 +-
>   net/dsa/tag.h                               |  19 ++--
>   net/dsa/tag_8021q.c                         |  10 +-
>   net/dsa/tag_brcm.c                          |   2 +-
>   net/dsa/tag_dsa.c                           |   8 +-
>   net/dsa/tag_qca.c                           |  10 +-
>   net/dsa/tag_sja1105.c                       |  22 +++--
>   net/dsa/user.c                              | 104 +++++++++++---------
>   net/ethernet/eth.c                          |   2 +-
>   25 files changed, 240 insertions(+), 152 deletions(-)
> 
> diff --git a/drivers/net/dsa/mt7530.c b/drivers/net/dsa/mt7530.c
> index ec18e68bf3a8..82d3f1786156 100644
> --- a/drivers/net/dsa/mt7530.c
> +++ b/drivers/net/dsa/mt7530.c
> @@ -20,6 +20,7 @@
>   #include <linux/reset.h>
>   #include <linux/gpio/consumer.h>
>   #include <linux/gpio/driver.h>
> +#include <linux/rtnetlink.h>
>   #include <net/dsa.h>
>   
>   #include "mt7530.h"
> @@ -3092,7 +3093,7 @@ mt753x_conduit_state_change(struct dsa_switch *ds,
>   			    const struct net_device *conduit,
>   			    bool operational)
>   {
> -	struct dsa_port *cpu_dp = conduit->dsa_ptr;
> +	struct dsa_port *cpu_dp = rtnl_dereference(conduit->dsa_ptr);

Out of curiosity, only sparse will likely be able to recognize the __rcu 
annotation of net_device::dsa_ptr so there is still unfortunately room 
for programmers to forget about using rtnl_dereference(), this should 
hopefully be caught by CI when patches are submitted.

>   	struct mt7530_priv *priv = ds->priv;
>   	int val = 0;
>   	u8 mask;
> diff --git a/drivers/net/dsa/ocelot/felix.c b/drivers/net/dsa/ocelot/felix.c
> index 4a705f7333f4..f6bc0ff0c116 100644
> --- a/drivers/net/dsa/ocelot/felix.c
> +++ b/drivers/net/dsa/ocelot/felix.c
> @@ -21,6 +21,7 @@
>   #include <linux/of_net.h>
>   #include <linux/pci.h>
>   #include <linux/of.h>
> +#include <linux/rtnetlink.h>
>   #include <net/pkt_sched.h>
>   #include <net/dsa.h>
>   #include "felix.h"
> @@ -57,7 +58,7 @@ static int felix_cpu_port_for_conduit(struct dsa_switch *ds,
>   		return lag;
>   	}
>   
> -	cpu_dp = conduit->dsa_ptr;
> +	cpu_dp = rtnl_dereference(conduit->dsa_ptr);
>   	return cpu_dp->index;
>   }
>   
> diff --git a/drivers/net/dsa/qca/qca8k-8xxx.c b/drivers/net/dsa/qca/qca8k-8xxx.c
> index f8d8c70642c4..10b4d7e9be2f 100644
> --- a/drivers/net/dsa/qca/qca8k-8xxx.c
> +++ b/drivers/net/dsa/qca/qca8k-8xxx.c
> @@ -20,6 +20,7 @@
>   #include <linux/gpio/consumer.h>
>   #include <linux/etherdevice.h>
>   #include <linux/dsa/tag_qca.h>
> +#include <linux/rtnetlink.h>
>   
>   #include "qca8k.h"
>   #include "qca8k_leds.h"
> @@ -1754,7 +1755,7 @@ static void
>   qca8k_conduit_change(struct dsa_switch *ds, const struct net_device *conduit,
>   		     bool operational)
>   {
> -	struct dsa_port *dp = conduit->dsa_ptr;
> +	struct dsa_port *dp = rtnl_dereference(conduit->dsa_ptr);
>   	struct qca8k_priv *priv = ds->priv;
>   
>   	/* Ethernet MIB/MDIO is only supported for CPU port 0 */
> diff --git a/drivers/net/ethernet/broadcom/bcmsysport.c b/drivers/net/ethernet/broadcom/bcmsysport.c
> index c9faa8540859..bd9bc081346d 100644
> --- a/drivers/net/ethernet/broadcom/bcmsysport.c
> +++ b/drivers/net/ethernet/broadcom/bcmsysport.c
> @@ -145,7 +145,7 @@ static void bcm_sysport_set_rx_csum(struct net_device *dev,
>   	 * sure we tell the RXCHK hardware to expect a 4-bytes Broadcom
>   	 * tag after the Ethernet MAC Source Address.
>   	 */
> -	if (netdev_uses_dsa(dev))
> +	if (__netdev_uses_dsa_currently(dev))

I appreciate the thought given into the function name, though I am not 
sure it is warranted to suffix with _currently().

>   		reg |= RXCHK_BRCM_TAG_EN;
>   	else
>   		reg &= ~RXCHK_BRCM_TAG_EN;
> @@ -173,7 +173,7 @@ static void bcm_sysport_set_tx_csum(struct net_device *dev,
>   	 * checksum to be computed correctly when using VLAN HW acceleration,
>   	 * else it has no effect, so it can always be turned on.
>   	 */
> -	if (netdev_uses_dsa(dev))
> +	if (__netdev_uses_dsa_currently(dev))
>   		reg |= tdma_control_bit(priv, SW_BRCM_TAG);
>   	else
>   		reg &= ~tdma_control_bit(priv, SW_BRCM_TAG);
> @@ -1950,7 +1950,7 @@ static inline void gib_set_pad_extension(struct bcm_sysport_priv *priv)
>   
>   	reg = gib_readl(priv, GIB_CONTROL);
>   	/* Include Broadcom tag in pad extension and fix up IPG_LENGTH */
> -	if (netdev_uses_dsa(priv->netdev)) {
> +	if (__netdev_uses_dsa_currently(priv->netdev)) {
>   		reg &= ~(GIB_PAD_EXTENSION_MASK << GIB_PAD_EXTENSION_SHIFT);
>   		reg |= ENET_BRCM_TAG_LEN << GIB_PAD_EXTENSION_SHIFT;
>   	}
> @@ -2299,7 +2299,7 @@ static u16 bcm_sysport_select_queue(struct net_device *dev, struct sk_buff *skb,
>   	struct bcm_sysport_tx_ring *tx_ring;
>   	unsigned int q, port;
>   
> -	if (!netdev_uses_dsa(dev))
> +	if (!__netdev_uses_dsa_currently(dev))
>   		return netdev_pick_tx(dev, skb, NULL);
>   
>   	/* DSA tagging layer will have configured the correct queue */
> diff --git a/drivers/net/ethernet/mediatek/airoha_eth.c b/drivers/net/ethernet/mediatek/airoha_eth.c
> index 1c5b85a86df1..f7425d393b22 100644
> --- a/drivers/net/ethernet/mediatek/airoha_eth.c
> +++ b/drivers/net/ethernet/mediatek/airoha_eth.c
> @@ -2255,7 +2255,7 @@ static int airoha_dev_open(struct net_device *dev)
>   	if (err)
>   		return err;
>   
> -	if (netdev_uses_dsa(dev))
> +	if (__netdev_uses_dsa_currently(dev))
>   		airoha_fe_set(eth, REG_GDM_INGRESS_CFG(port->id),
>   			      GDM_STAG_EN_MASK);
>   	else
> diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.c b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
> index 16ca427cf4c3..82a828349323 100644
> --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
> +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
> @@ -24,6 +24,7 @@
>   #include <linux/pcs/pcs-mtk-lynxi.h>
>   #include <linux/jhash.h>
>   #include <linux/bitfield.h>
> +#include <linux/rcupdate.h>
>   #include <net/dsa.h>
>   #include <net/dst_metadata.h>
>   #include <net/page_pool/helpers.h>
> @@ -1375,7 +1376,8 @@ static void mtk_tx_set_dma_desc_v2(struct net_device *dev, void *txd,
>   		/* tx checksum offload */
>   		if (info->csum)
>   			data |= TX_DMA_CHKSUM_V2;
> -		if (mtk_is_netsys_v3_or_greater(eth) && netdev_uses_dsa(dev))
> +		if (mtk_is_netsys_v3_or_greater(eth) &&
> +		    __netdev_uses_dsa_currently(dev))
>   			data |= TX_DMA_SPTAG_V3;
>   	}
>   	WRITE_ONCE(desc->txd5, data);
> @@ -2183,7 +2185,7 @@ static int mtk_poll_rx(struct napi_struct *napi, int budget,
>   		 * hardware treats the MTK special tag as a VLAN and untags it.
>   		 */
>   		if (mtk_is_netsys_v1(eth) && (trxd.rxd2 & RX_DMA_VTAG) &&
> -		    netdev_uses_dsa(netdev)) {
> +		    __netdev_uses_dsa_currently(netdev)) {
>   			unsigned int port = RX_DMA_VPID(trxd.rxd3) & GENMASK(2, 0);
>   
>   			if (port < ARRAY_SIZE(eth->dsa_meta) &&
> @@ -3304,7 +3306,7 @@ static void mtk_gdm_config(struct mtk_eth *eth, u32 id, u32 config)
>   
>   	val |= config;
>   
> -	if (eth->netdev[id] && netdev_uses_dsa(eth->netdev[id]))
> +	if (eth->netdev[id] && __netdev_uses_dsa_currently(eth->netdev[id]))
>   		val |= MTK_GDMA_SPECIAL_TAG;
>   
>   	mtk_w32(eth, val, MTK_GDMA_FWD_CFG(id));
> @@ -3313,12 +3315,16 @@ static void mtk_gdm_config(struct mtk_eth *eth, u32 id, u32 config)
>   
>   static bool mtk_uses_dsa(struct net_device *dev)
>   {
> +	bool ret = false;
>   #if IS_ENABLED(CONFIG_NET_DSA)
> -	return netdev_uses_dsa(dev) &&
> -	       dev->dsa_ptr->tag_ops->proto == DSA_TAG_PROTO_MTK;
> -#else
> -	return false;
> +	struct dsa_port *dp;
> +
> +	rcu_read_lock();
> +	dp = rcu_dereference(dev->dsa_ptr);
> +	ret = dp && dp->tag_ops->proto == DSA_TAG_PROTO_MTK;
> +	rcu_read_unlock();

This pattern repeats in mtk_ppe.c, a possible factoring for later.
-- 
Florian


From bvanassche at acm.org  Tue Sep 10 10:59:31 2024
From: bvanassche at acm.org (Bart Van Assche)
Date: Tue, 10 Sep 2024 10:59:31 -0700
Subject: [PATCH v4 2/2] ufs: core: requeue aborted request
In-Reply-To: <20240910073035.25974-3-peter.wang@mediatek.com>
References: <20240910073035.25974-1-peter.wang@mediatek.com>
 <20240910073035.25974-3-peter.wang@mediatek.com>
Message-ID: <e42abf07-ba6b-4301-8717-8d5b01d56640@acm.org>

On 9/10/24 12:30 AM, peter.wang at mediatek.com wrote:
> ufshcd_abort_all froce abort all on-going command and the host
                    ^^^^^ ^^^^^              ^^^^^^^         ^^^^
                forcibly? aborts?            commands?   host controller?
> will automatically fill in the OCS field of the corresponding
> response with OCS_ABORTED based on different working modes.
                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
The host controller only sets the OCS field to OCS_ABORTED in MCQ mode
if the host controller successfully aborted the command. If the
abort TMF is submitted to the UFS device, the OCS field won't be changed
into OCS_ABORTED. In SDB mode, the host controller does not modify the 
OCS field either.

> SDB mode: aborts a command using UTRLCLR. Task Management response
> which means a Transfer Request was aborted.

Hmm ... my understanding is that clearing a bit from UTRLCLR is only
allowed *after* a command has been aborted and also that clearing a bit
from this register does not abort a command but only frees the resources
in the host controller associated with the command.

> For these two cases, set a flag to notify SCSI to requeue the
> command after receiving response with OCS_ABORTED.

I think there is only one case when the SCSI core needs to be requested
to requeue a command, namely when the UFS driver decided to initiate the
abort (ufshcd_abort_all()).

> @@ -7561,6 +7551,20 @@ int ufshcd_try_to_abort_task(struct ufs_hba *hba, int tag)
>   		goto out;
>   	}
>   
> +	/*
> +	 * When the host software receives a "FUNCTION COMPLETE", set flag
> +	 * to requeue command after receive response with OCS_ABORTED
> +	 * SDB mode: UTRLCLR Task Management response which means a Transfer
> +	 *           Request was aborted.
> +	 * MCQ mode: Host will post to CQ with OCS_ABORTED after SQ cleanup
> +	 * This flag is set because ufshcd_abort_all forcibly aborts all
> +	 * commands, and the host will automatically fill in the OCS field
> +	 * of the corresponding response with OCS_ABORTED.
> +	 * Therefore, upon receiving this response, it needs to be requeued.
> +	 */
> +	if (!err)
> +		lrbp->abort_initiated_by_err = true;
> +
>   	err = ufshcd_clear_cmd(hba, tag);
>   	if (err)
>   		dev_err(hba->dev, "%s: Failed clearing cmd at tag %d, err %d\n",

The above change is misplaced. ufshcd_try_to_abort_task() can be called
when the SCSI core decides to abort a command while
abort_initiated_by_err must not be set in that case. Please move the
above code block into ufshcd_abort_one().

Regarding the word "host" in the above comment block: the host is the 
Android device. I think that in the above comment "host" should be
changed into "host controller".

> diff --git a/include/ufs/ufshcd.h b/include/ufs/ufshcd.h
> index 0fd2aebac728..15b357672ca5 100644
> --- a/include/ufs/ufshcd.h
> +++ b/include/ufs/ufshcd.h
> @@ -173,6 +173,8 @@ struct ufs_pm_lvl_states {
>    * @crypto_key_slot: the key slot to use for inline crypto (-1 if none)
>    * @data_unit_num: the data unit number for the first block for inline crypto
>    * @req_abort_skip: skip request abort task flag
> + * @abort_initiated_by_err: The flag is specifically used to handle aborts
> + *                          caused by errors due to host/device communication

The "abort_initiated_by_err" name still seems confusing to me. Please
make it more clear that this flag is only set if the UFS error handler
decides to abort a command. How about "abort_initiated_by_eh"?

Please also make the description of this member variable more clear.

Thanks,

Bart.


From alexander.sverdlin at siemens.com  Tue Sep 10 13:40:26 2024
From: alexander.sverdlin at siemens.com (Sverdlin, Alexander)
Date: Tue, 10 Sep 2024 20:40:26 +0000
Subject: [PATCH 1/2] net: dsa: RCU-protect dsa_ptr in struct net_device
In-Reply-To: <b6604e07-9add-4e93-ad6b-f1efc336e3bf@broadcom.com>
References: <20240910130321.337154-1-alexander.sverdlin@siemens.com>
	 <20240910130321.337154-2-alexander.sverdlin@siemens.com>
	 <b6604e07-9add-4e93-ad6b-f1efc336e3bf@broadcom.com>
Message-ID: <a89dfb1524d9592a5077d2a7a34dceed579e7d3d.camel@siemens.com>

Hi Florian!

On Tue, 2024-09-10 at 10:40 -0700, Florian Fainelli wrote:
> > RCU-protect dsa_ptr and use rcu_dereference() or rtnl_dereference()
> > depending on the calling context.
> > 
> > Rename netdev_uses_dsa() into __netdev_uses_dsa_currently()
> > (assumes ether RCU or RTNL lock held) and netdev_uses_dsa_currently()
> > variants which better reflect the uselessness of the function's
> > return value, which becomes outdated right after the call.
> > 
> > Fixes: ee534378f005 ("net: dsa: fix panic when DSA master device unbinds on shutdown")
> > Cc: stable at vger.kernel.org
> > Signed-off-by: Alexander Sverdlin <alexander.sverdlin at siemens.com>
> 
> Thanks for doing this work, just a few nits below. This is likely to be 
> difficult to backport to stable trees.

Thanks for the quick feedback!
As I've mentioned in the cover letter, I've v6.1 backport already available
and I'm ready to backport to v6.8 as soon as we agree on the final form for
v6.11.

-- 
Alexander Sverdlin
Siemens AG
www.siemens.com

From sean.wang at kernel.org  Tue Sep 10 14:06:11 2024
From: sean.wang at kernel.org (Sean Wang)
Date: Tue, 10 Sep 2024 14:06:11 -0700
Subject: [PATCH] wifi: mt76: mt7921: fix a potential scan no APs
In-Reply-To: <1ac1ae779db86d4012199a24ea2ca74050ed4af6.1721300411.git.quan.zhou@mediatek.com>
References: <1ac1ae779db86d4012199a24ea2ca74050ed4af6.1721300411.git.quan.zhou@mediatek.com>
Message-ID: <CAGp9Lzo=gErNFtYiR4a33jbo9LCHmWZf+j7GLAgSGPgFN9xbmA@mail.gmail.com>

Hi nbd,

It seems the patch hasn't been merged into the current tree yet. The
patch is beneficial for improving scan stability since we?ve applied
ROC. If there's any opportunity for further improvement from your
perspective, please let us know.

    Reviewed-by: Sean Wang <sean.wang at mediatek.com>

         Sean



On Thu, Jul 18, 2024 at 6:51?AM Quan Zhou <quan.zhou at mediatek.com> wrote:
>
> In multi-channel scenarios, the granted channel must be aborted before
> station remove. Otherwise, the firmware will be put into a wrong state,
> resulting in have chance to make subsequence scan no APs.
> With this patch, the granted channel will be always aborted before
> station remove.
>
> Signed-off-by: Quan Zhou <quan.zhou at mediatek.com>
> ---
>  drivers/net/wireless/mediatek/mt76/mt7921/main.c | 7 ++++---
>  1 file changed, 4 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/main.c b/drivers/net/wireless/mediatek/mt76/mt7921/main.c
> index 2e6268cb06c0..84d6881eb4c9 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt7921/main.c
> +++ b/drivers/net/wireless/mediatek/mt76/mt7921/main.c
> @@ -359,9 +359,9 @@ void mt7921_roc_abort_sync(struct mt792x_dev *dev)
>         del_timer_sync(&phy->roc_timer);
>         cancel_work_sync(&phy->roc_work);
>         if (test_and_clear_bit(MT76_STATE_ROC, &phy->mt76->state))
> -               ieee80211_iterate_active_interfaces(mt76_hw(dev),
> -                                                   IEEE80211_IFACE_ITER_RESUME_ALL,
> -                                                   mt7921_roc_iter, (void *)phy);
> +               ieee80211_iterate_interfaces(mt76_hw(dev),
> +                                            IEEE80211_IFACE_ITER_RESUME_ALL,
> +                                            mt7921_roc_iter, (void *)phy);
>  }
>  EXPORT_SYMBOL_GPL(mt7921_roc_abort_sync);
>
> @@ -861,6 +861,7 @@ void mt7921_mac_sta_remove(struct mt76_dev *mdev, struct ieee80211_vif *vif,
>         struct mt792x_dev *dev = container_of(mdev, struct mt792x_dev, mt76);
>         struct mt792x_sta *msta = (struct mt792x_sta *)sta->drv_priv;
>
> +       mt7921_roc_abort_sync(dev);
>         mt76_connac_free_pending_tx_skbs(&dev->pm, &msta->deflink.wcid);
>         mt76_connac_pm_wake(&dev->mphy, &dev->pm);
>
> --
> 2.18.0
>
>


From robh at kernel.org  Tue Sep 10 16:42:37 2024
From: robh at kernel.org (Rob Herring (Arm))
Date: Tue, 10 Sep 2024 18:42:37 -0500
Subject: [PATCH] dt-bindings: clock: mediatek: Drop duplicate mediatek,mt6795-sys-clock.yaml
Message-ID: <20240910234238.1028422-1-robh@kernel.org>

The compatible strings for mt6795 clocks are also documented in other
schemas:

"mediatek,mt6795-apmixedsys" in clock/mediatek,apmixedsys.yaml
"mediatek,mt6795-topckgen" in clock/mediatek,topckgen.yaml
"mediatek,mt6795-pericfg" in clock/mediatek,pericfg.yaml
"mediatek,mt6795-infracfg" in clock/mediatek,infracfg.yaml

The only difference is #reset-cells is not allowed in some of these,
but that aligns with actual users in .dts files.

Signed-off-by: Rob Herring (Arm) <robh at kernel.org>
---
 .../clock/mediatek,mt6795-sys-clock.yaml      | 54 -------------------
 1 file changed, 54 deletions(-)
 delete mode 100644 Documentation/devicetree/bindings/clock/mediatek,mt6795-sys-clock.yaml

diff --git a/Documentation/devicetree/bindings/clock/mediatek,mt6795-sys-clock.yaml b/Documentation/devicetree/bindings/clock/mediatek,mt6795-sys-clock.yaml
deleted file mode 100644
index 378b761237d3..000000000000
--- a/Documentation/devicetree/bindings/clock/mediatek,mt6795-sys-clock.yaml
+++ /dev/null
@@ -1,54 +0,0 @@
-# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
-%YAML 1.2
----
-$id: http://devicetree.org/schemas/clock/mediatek,mt6795-sys-clock.yaml#
-$schema: http://devicetree.org/meta-schemas/core.yaml#
-
-title: MediaTek System Clock Controller for MT6795
-
-maintainers:
-  - AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
-  - Chun-Jie Chen <chun-jie.chen at mediatek.com>
-
-description:
-  The Mediatek system clock controller provides various clocks and system
-  configuration like reset and bus protection on MT6795.
-
-properties:
-  compatible:
-    items:
-      - enum:
-          - mediatek,mt6795-apmixedsys
-          - mediatek,mt6795-infracfg
-          - mediatek,mt6795-pericfg
-          - mediatek,mt6795-topckgen
-      - const: syscon
-
-  reg:
-    maxItems: 1
-
-  '#clock-cells':
-    const: 1
-
-  '#reset-cells':
-    const: 1
-
-required:
-  - compatible
-  - reg
-  - '#clock-cells'
-
-additionalProperties: false
-
-examples:
-  - |
-    soc {
-        #address-cells = <2>;
-        #size-cells = <2>;
-
-        topckgen: clock-controller at 10000000 {
-            compatible = "mediatek,mt6795-topckgen", "syscon";
-            reg = <0 0x10000000 0 0x1000>;
-            #clock-cells = <1>;
-        };
-    };
-- 
2.45.2



From qianqiang.liu at 163.com  Tue Sep 10 17:15:17 2024
From: qianqiang.liu at 163.com (Qianqiang Liu)
Date: Wed, 11 Sep 2024 08:15:17 +0800
Subject: [PATCH] ASoC: mt8365: Fix using uninitialized value "i2s_data" issue
Message-ID: <20240911001516.47268-1-qianqiang.liu@163.com>

The "i2s_data" might not be initialized before using it.
Set it to NULL by default and also check if it is valid.

Signed-off-by: Qianqiang Liu <qianqiang.liu at 163.com>
---
 sound/soc/mediatek/mt8365/mt8365-dai-i2s.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/sound/soc/mediatek/mt8365/mt8365-dai-i2s.c b/sound/soc/mediatek/mt8365/mt8365-dai-i2s.c
index 3482d8f8b4e7..3a8a5d975a04 100644
--- a/sound/soc/mediatek/mt8365/mt8365-dai-i2s.c
+++ b/sound/soc/mediatek/mt8365/mt8365-dai-i2s.c
@@ -465,7 +465,7 @@ void mt8365_afe_set_i2s_out_enable(struct mtk_base_afe *afe, bool enable)
 	int i;
 	unsigned long flags;
 	struct mt8365_afe_private *afe_priv = afe->platform_priv;
-	struct mtk_afe_i2s_priv *i2s_data;
+	struct mtk_afe_i2s_priv *i2s_data = NULL;
 
 	for (i = 0; i < DAI_I2S_NUM; i++) {
 		if (mt8365_i2s_priv[i].adda_link)
@@ -474,6 +474,11 @@ void mt8365_afe_set_i2s_out_enable(struct mtk_base_afe *afe, bool enable)
 
 	spin_lock_irqsave(&afe_priv->afe_ctrl_lock, flags);
 
+	if (!i2s_data) {
+		spin_unlock_irqrestore(&afe_priv->afe_ctrl_lock, flags);
+		return;
+	}
+
 	if (enable) {
 		i2s_data->i2s_out_on_ref_cnt++;
 		if (i2s_data->i2s_out_on_ref_cnt == 1)
-- 
2.39.2



From dianders at chromium.org  Tue Sep 10 17:30:07 2024
From: dianders at chromium.org (Doug Anderson)
Date: Tue, 10 Sep 2024 17:30:07 -0700
Subject: [PATCH v6 09/12] i2c: of-prober: Add regulator support
In-Reply-To: <CAGXv+5HO=POHNL_tQHCsy+8=a0gPLMDVHcWMguferahVU+BnZA@mail.gmail.com>
References: <20240904090016.2841572-1-wenst@chromium.org> <20240904090016.2841572-10-wenst@chromium.org>
 <CAD=FV=UGOz3Xzg7reJKP=tA1LqTxszv5w-CL9krmoXQtXdJLaQ@mail.gmail.com>
 <CAGXv+5F27K76t=ht5v75jKsNF-J+C0r5+m=czHz6PtV3t5DxcQ@mail.gmail.com>
 <CAD=FV=XVrAdQN8p9QJtt3Ah_YQAG7Y-D4wDx8_+qb1EGN7+Uig@mail.gmail.com> <CAGXv+5HO=POHNL_tQHCsy+8=a0gPLMDVHcWMguferahVU+BnZA@mail.gmail.com>
Message-ID: <CAD=FV=U2yDGv74GQWRQuHN9sjdY5iThqpH-br-jYXMkV1cujEg@mail.gmail.com>

Hi,

On Thu, Sep 5, 2024 at 8:45?PM Chen-Yu Tsai <wenst at chromium.org> wrote:
>
> > > IIUC we could have the "options" data structure have much more board
> > > specific information:
> > >
> > >   - name of node to fetch resources (regulator supplies and GPIOs) from
> > >   - names of the resources for the node given from the previous item
> > >   - delay time after each resource is toggled
> > >   - polarity in the case of GPIOs
> > >   - prober callback to do power sequencing
> > >
> > > The "resource collection" step would use the first two items to retrieve
> > > the regulator supplies and GPIOS instead of the bulk APIs used right now.
> > >
> > > The power sequencing callback would use the resources combined with the
> > > given delays to enable the supplies and toggle the GPIOs.
> > >
> > > For now I would probably only implement a generic one regulator supply
> > > plus one GPIO helper. That is the common case for touchscreens and
> > > trackpads connected over a ribbon cable.
> > >
> > > Does that sound like what you have in mind?
> >
> > I guess I'd have to see how the code looks to know for sure, but if I
> > understand it sounds a little awkward. Specifically, the "options"
> > sound like they might become complicated enough that you're inventing
> > your own little programming language (with delays, abilities to drive
> > pins low and high, abilities to turn on/off clocks, and abilities to
> > turn off/on regulators) and then probers need to code up their
> > programs in this language. You also need to handle undoing things
> > properly if there is a failure in the middle. Like your "program"
> > would look like this (obviously you'd have to play with enums more,
> > but you get the idea):
> >
> > {
> >    { OPCODE_TURN_REGULATOR_ON, "vdd" },
> >    { OPCODE_DELAY, 10 },
> >    { OPCODE_GPIO_ASSERT, "reset" },
> >    { OPCODE_DELAY, 5 },
> >    { OPCODE_GPIO_DEASSERT "reset" },
> >    { OPCODE_DELAY, 100 },
> >    { OPCODE_TURN_REGULATOR_ON, "vddIO" },
> > }
> >
> > Why not just expect the board probers to write C code to turn things
> > on before looking for i2c devices, then provide helpers to the C code?
> >
> > So there wouldn't be some generic "resource collection" API, but you'd
> > provide a helper to make it easy to grab regulators from one of the
> > nodes by name. If you think bulk enabling regulators is common then
> > you could make a helper that grabs all of the regulators from a node
> > in a way that is consistent with the bulk APIs, but I wouldn't expect
> > every driver to use that since devices I've seen expect regulators to
> > be enabled in a very specific order even if they don't need a delay
> > between them.
> >
> > I wouldn't expect a "collect all GPIOs" API because it seems really
> > weird to me that we'd ever want to jam multiple GPIOs in a state
> > without knowing exactly which GPIO was what and asserting them in the
> > right sequence.
>
> So I'm slightly confused, as it sounds like at this point the i2c prober
> would be litter more than just a framework, and the heavy lifting is to
> be all done by callbacks provided by the board-specific driver?
>
> So the framework becomes something like:
>
> 1. find i2c bus node
> 2. call provided callback with i2c bus node to gather resources;
>    let callback handle specifics
> 3. call provided callback to enable resources
> 4. for each i2c component, call provided callback to probe

I don't think I'd do it as callbacks but just have the HW prober call
the functions directly. AKA, instead of doing:

  i2c_of_probe_component(dev, "touchscreen", ts_opts, ts_callbacks);

Do:

  grab_touchscreen_resources(...);
  power_on_touchscreens(...);
  i2c_of_probe_component(...);
  power_off_touchscreen(...);
  release_touchscreen_resources(...);

Obviously I'm spitballing here, though. Without writing the code it's
hard for me to know that my proposal would be better, but my gut tells
me that trying to write something overly generic with lots of options
/ callbacks would be more confusing.


>   If the probe succeeded:
>
>     5. call provided callback for early release of resources (GPIOs)
>     6. set "status" to "okay"
>     7. call provided callback for late release of resources (regulators)
>
>   Otherwise at the end of the loop
>
> 8. release resources
>
> The current code can be reworked into helpers for steps 2, 3, 5, 7 for
> the single regulator single GPIO case.
>
> > > This next item would be a later enhancement (which isn't implemented in
> > > this series anyway):
> > >
> > >   - optional prober callback that does actual probing
> > >
> > > In our case it would only be used for cases where an HID-over-I2C
> > > component shares the same address as a non-HID one, and some extra
> > > work is needed to determine which type it is. I still need to think
> > > about the structure of this.
> >
> > IMO _that_ would be a great option to the i2c prober. It feels like
> > you could have an optional register read that needs to match to have
> > the i2c prober succeed. Most people would leave it blank (just the i2c
> > device existing is enough) but probably a single register read would
> > be enough to confirm you got the right device. Most i2c devices have
> > some sort of "version" / "vendor" / "id" type register somewhere.
>
> At least for the stuff that we have (touchscreens and trackpads) such
> registers typically don't exist, unless it's an HID-over-I2C device,
> in which case there's the standard HID descriptor at some address.
> But, yeah, reading the HID descriptor was the use case I had in mind.
>
> At least for one Chromebooks it's a bit more tricky because that one
> HID-over-I2C component shares the same address as a non-HID one. We
> currently have different SKU IDs and thus different device trees for
> them, but we could make the prober work with this. It just has be able
> to tell if the component it's currently probing needs the special
> prober and is it responding correctly. This bit I need to think about.

I guess Mark Brown also thought that there wouldn't be some magic
register, but my gut still tells me that most i2c devices have some
way to confirm that they are what you expect even if it's not an
official "vendor" or "version" register. Some type of predictable
register at a predictable location that you could use, at least if you
knew all of the options that someone might stuff.

For instance, in elan trackpads you can see elan_i2c_get_product_id().
That just reads a location (ETP_I2C_UNIQUEID_CMD = 0x0101) that could
theoretically be used to figure out (maybe in conjunction with other
registers) that it's an elan trackpad instead of an i2c-hid one. You'd
have to (of course) confirm that an i2c-hid device wouldn't somehow
return back data from this read that made it look like an elan
trackpad, but it feels like there ought to be some way to figure it
out with a few i2c register reads.

...that being said, I guess my original assertion that you might be
able to figure out with a simple register read was naive and you'd
actually need a function (maybe as a callback) to figure this out.


-Doug


From kuba at kernel.org  Tue Sep 10 19:19:45 2024
From: kuba at kernel.org (Jakub Kicinski)
Date: Tue, 10 Sep 2024 19:19:45 -0700
Subject: [PATCH 0/2] net: dsa: RCU-protect dsa_ptr in struct net_device
In-Reply-To: <20240910130321.337154-1-alexander.sverdlin@siemens.com>
References: <20240910130321.337154-1-alexander.sverdlin@siemens.com>
Message-ID: <20240910191945.717ea514@kernel.org>

On Tue, 10 Sep 2024 15:03:14 +0200 A. Sverdlin wrote:
> Subject: [PATCH 0/2] net: dsa: RCU-protect dsa_ptr in struct net_device

When you repost please use --subject-prefix="PATCH net v2" 
in git format-patch. The "net" part, specifically, is important,
the patch doesn't apply to net-next so we need to give our bots
a bit of a hint as to which tree this should be (build) tested 
against.
-- 
pw-bot: cr


From chunhui.li at mediatek.com  Tue Sep 10 20:28:01 2024
From: chunhui.li at mediatek.com (Chunhui Li)
Date: Wed, 11 Sep 2024 11:28:01 +0800
Subject: [PATCH v4 0/1] fix sysfs patch build warning and add fixes
Message-ID: <20240911032802.22413-1-chunhui.li@mediatek.com>

Hi Maintainer,

V4:
-Fix build warning when CONFIG_KALLSYMS is not enabled;
-Add Fixes tag;

I can't find add_sect_attrs and add_notes_attrs commit in linux.next git log,
and Petr Pavlu show /sys/module patch link when review,
so I label Fixes as below, If incorrect please notify me. 

Fixes: db939b519bea ("Module section offsets in /sys/module")
Fixes: 6d76013381ed ("Add /sys/module/name/notes")

https://github.com/mpe/linux-fullhistory/commit/db939b519bea9b88ae1c95c3b479c0b07145f2a0
[PATCH] Module section offsets in /sys/module

https://github.com/torvalds/linux/commit/6d76013381ed28979cd122eb4b249a88b5e384fa
Add /sys/module/name/notes

Thanks for your patience.

Chunhui Li (1):
  module: abort module loading when sysfs setup suffer errors

 kernel/module/sysfs.c | 63 ++++++++++++++++++++++++++++---------------
 1 file changed, 42 insertions(+), 21 deletions(-)

-- 
2.45.2



From chunhui.li at mediatek.com  Tue Sep 10 20:28:02 2024
From: chunhui.li at mediatek.com (Chunhui Li)
Date: Wed, 11 Sep 2024 11:28:02 +0800
Subject: [PATCH v4 1/1] module: abort module loading when sysfs setup suffer errors
In-Reply-To: <20240911032802.22413-1-chunhui.li@mediatek.com>
References: <20240911032802.22413-1-chunhui.li@mediatek.com>
Message-ID: <20240911032802.22413-2-chunhui.li@mediatek.com>

When insmod a kernel module, if fails in add_notes_attrs or
add_sysfs_attrs such as memory allocation fail, mod_sysfs_setup
will still return success, but we can't access user interface
on android device.

Patch for make mod_sysfs_setup can check the error of
add_notes_attrs and add_sysfs_attrs

Fixes: db939b519bea ("Module section offsets in /sys/module")
Fixes: 6d76013381ed ("Add /sys/module/name/notes")
Acked-by: Luis Chamberlain <mcgrof at kernel.org>
Reviewed-by: Petr Pavlu <petr.pavlu at suse.com>
Reported-by: kernel test robot <lkp at intel.com>
Closes: https://lore.kernel.org/oe-kbuild-all/202409010016.3XIFSmRA-lkp at intel.com/
Closes: https://lore.kernel.org/oe-kbuild-all/202409072018.qfEzZbO7-lkp at intel.com/
Signed-off-by: Xion Wang <xion.wang at mediatek.com>
Signed-off-by: Chunhui Li <chunhui.li at mediatek.com>
---
 kernel/module/sysfs.c | 63 ++++++++++++++++++++++++++++---------------
 1 file changed, 42 insertions(+), 21 deletions(-)

diff --git a/kernel/module/sysfs.c b/kernel/module/sysfs.c
index 26efe1305c12..456358e1fdc4 100644
--- a/kernel/module/sysfs.c
+++ b/kernel/module/sysfs.c
@@ -69,12 +69,13 @@ static void free_sect_attrs(struct module_sect_attrs *sect_attrs)
 	kfree(sect_attrs);
 }
 
-static void add_sect_attrs(struct module *mod, const struct load_info *info)
+static int add_sect_attrs(struct module *mod, const struct load_info *info)
 {
 	unsigned int nloaded = 0, i, size[2];
 	struct module_sect_attrs *sect_attrs;
 	struct module_sect_attr *sattr;
 	struct bin_attribute **gattr;
+	int ret;
 
 	/* Count loaded sections and allocate structures */
 	for (i = 0; i < info->hdr->e_shnum; i++)
@@ -85,7 +86,7 @@ static void add_sect_attrs(struct module *mod, const struct load_info *info)
 	size[1] = (nloaded + 1) * sizeof(sect_attrs->grp.bin_attrs[0]);
 	sect_attrs = kzalloc(size[0] + size[1], GFP_KERNEL);
 	if (!sect_attrs)
-		return;
+		return -ENOMEM;
 
 	/* Setup section attributes. */
 	sect_attrs->grp.name = "sections";
@@ -103,8 +104,10 @@ static void add_sect_attrs(struct module *mod, const struct load_info *info)
 		sattr->address = sec->sh_addr;
 		sattr->battr.attr.name =
 			kstrdup(info->secstrings + sec->sh_name, GFP_KERNEL);
-		if (!sattr->battr.attr.name)
+		if (!sattr->battr.attr.name) {
+			ret = -ENOMEM;
 			goto out;
+		}
 		sect_attrs->nsections++;
 		sattr->battr.read = module_sect_read;
 		sattr->battr.size = MODULE_SECT_READ_SIZE;
@@ -113,13 +116,15 @@ static void add_sect_attrs(struct module *mod, const struct load_info *info)
 	}
 	*gattr = NULL;
 
-	if (sysfs_create_group(&mod->mkobj.kobj, &sect_attrs->grp))
+	ret = sysfs_create_group(&mod->mkobj.kobj, &sect_attrs->grp);
+	if (ret)
 		goto out;
 
 	mod->sect_attrs = sect_attrs;
-	return;
+	return 0;
 out:
 	free_sect_attrs(sect_attrs);
+	return ret;
 }
 
 static void remove_sect_attrs(struct module *mod)
@@ -158,15 +163,12 @@ static void free_notes_attrs(struct module_notes_attrs *notes_attrs,
 	kfree(notes_attrs);
 }
 
-static void add_notes_attrs(struct module *mod, const struct load_info *info)
+static int add_notes_attrs(struct module *mod, const struct load_info *info)
 {
 	unsigned int notes, loaded, i;
 	struct module_notes_attrs *notes_attrs;
 	struct bin_attribute *nattr;
-
-	/* failed to create section attributes, so can't create notes */
-	if (!mod->sect_attrs)
-		return;
+	int ret;
 
 	/* Count notes sections and allocate structures.  */
 	notes = 0;
@@ -176,12 +178,12 @@ static void add_notes_attrs(struct module *mod, const struct load_info *info)
 			++notes;
 
 	if (notes == 0)
-		return;
+		return 0;
 
 	notes_attrs = kzalloc(struct_size(notes_attrs, attrs, notes),
 			      GFP_KERNEL);
 	if (!notes_attrs)
-		return;
+		return -ENOMEM;
 
 	notes_attrs->notes = notes;
 	nattr = &notes_attrs->attrs[0];
@@ -201,19 +203,23 @@ static void add_notes_attrs(struct module *mod, const struct load_info *info)
 	}
 
 	notes_attrs->dir = kobject_create_and_add("notes", &mod->mkobj.kobj);
-	if (!notes_attrs->dir)
+	if (!notes_attrs->dir) {
+		ret = -ENOMEM;
 		goto out;
+	}
 
-	for (i = 0; i < notes; ++i)
-		if (sysfs_create_bin_file(notes_attrs->dir,
-					  &notes_attrs->attrs[i]))
+	for (i = 0; i < notes; ++i) {
+		ret = sysfs_create_bin_file(notes_attrs->dir, &notes_attrs->attrs[i]);
+		if (ret)
 			goto out;
+	}
 
 	mod->notes_attrs = notes_attrs;
-	return;
+	return 0;
 
 out:
 	free_notes_attrs(notes_attrs, i);
+	return ret;
 }
 
 static void remove_notes_attrs(struct module *mod)
@@ -223,9 +229,15 @@ static void remove_notes_attrs(struct module *mod)
 }
 
 #else /* !CONFIG_KALLSYMS */
-static inline void add_sect_attrs(struct module *mod, const struct load_info *info) { }
+static inline int add_sect_attrs(struct module *mod, const struct load_info *info)
+{
+	return 0;
+}
 static inline void remove_sect_attrs(struct module *mod) { }
-static inline void add_notes_attrs(struct module *mod, const struct load_info *info) { }
+static inline int add_notes_attrs(struct module *mod, const struct load_info *info)
+{
+	return 0;
+}
 static inline void remove_notes_attrs(struct module *mod) { }
 #endif /* CONFIG_KALLSYMS */
 
@@ -385,11 +397,20 @@ int mod_sysfs_setup(struct module *mod,
 	if (err)
 		goto out_unreg_modinfo_attrs;
 
-	add_sect_attrs(mod, info);
-	add_notes_attrs(mod, info);
+	err = add_sect_attrs(mod, info);
+	if (err)
+		goto out_del_usage_links;
+
+	err = add_notes_attrs(mod, info);
+	if (err)
+		goto out_unreg_sect_attrs;
 
 	return 0;
 
+out_unreg_sect_attrs:
+	remove_sect_attrs(mod);
+out_del_usage_links:
+	del_usage_links(mod);
 out_unreg_modinfo_attrs:
 	module_remove_modinfo_attrs(mod, -1);
 out_unreg_param:
-- 
2.45.2



From shenlichuan at vivo.com  Tue Sep 10 20:42:43 2024
From: shenlichuan at vivo.com (Shen Lichuan)
Date: Wed, 11 Sep 2024 11:42:43 +0800
Subject: [PATCH v1] wifi: mt76: mt7615: Convert comma to semicolon
Message-ID: <20240911034243.31596-1-shenlichuan@vivo.com>

To ensure code clarity and prevent potential errors, it's advisable
to employ the ';' as a statement separator, except when ',' are
intentionally used for specific purposes.

Signed-off-by: Shen Lichuan <shenlichuan at vivo.com>
---
 drivers/net/wireless/mediatek/mt76/mt7615/mcu.c      | 2 +-
 drivers/net/wireless/mediatek/mt76/mt7615/sdio_mcu.c | 2 +-
 drivers/net/wireless/mediatek/mt76/mt7615/usb_mcu.c  | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7615/mcu.c
index 96e34277fece..804d3f5a5244 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7615/mcu.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7615/mcu.c
@@ -1700,7 +1700,7 @@ int mt7615_mcu_init(struct mt7615_dev *dev)
 	};
 	int ret;
 
-	dev->mt76.mcu_ops = &mt7615_mcu_ops,
+	dev->mt76.mcu_ops = &mt7615_mcu_ops;
 
 	ret = mt7615_mcu_drv_pmctrl(dev);
 	if (ret)
diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/sdio_mcu.c b/drivers/net/wireless/mediatek/mt76/mt7615/sdio_mcu.c
index b0094205ba95..a7b8acb2da83 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7615/sdio_mcu.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7615/sdio_mcu.c
@@ -147,7 +147,7 @@ int mt7663s_mcu_init(struct mt7615_dev *dev)
 	if (ret)
 		return ret;
 
-	dev->mt76.mcu_ops = &mt7663s_mcu_ops,
+	dev->mt76.mcu_ops = &mt7663s_mcu_ops;
 
 	ret = mt76_get_field(dev, MT_CONN_ON_MISC, MT_TOP_MISC2_FW_N9_RDY);
 	if (ret) {
diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/usb_mcu.c b/drivers/net/wireless/mediatek/mt76/mt7615/usb_mcu.c
index a8b1a0f8b2d7..33c01f8ce8e2 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7615/usb_mcu.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7615/usb_mcu.c
@@ -72,7 +72,7 @@ int mt7663u_mcu_init(struct mt7615_dev *dev)
 	};
 	int ret;
 
-	dev->mt76.mcu_ops = &mt7663u_mcu_ops,
+	dev->mt76.mcu_ops = &mt7663u_mcu_ops;
 
 	mt76_set(dev, MT_UDMA_TX_QSEL, MT_FW_DL_EN);
 	if (test_and_clear_bit(MT76_STATE_POWER_OFF, &dev->mphy.state)) {
-- 
2.17.1



From jens.wiklander at linaro.org  Tue Sep 10 22:58:36 2024
From: jens.wiklander at linaro.org (Jens Wiklander)
Date: Wed, 11 Sep 2024 07:58:36 +0200
Subject: [RFC PATCH 4/4] dma-buf: heaps: add Linaro restricted dmabuf heap support
In-Reply-To: <CABdmKX2Tsp-KG6_Lth7VUcZcxCfgbsBYqZ5N2h574J+sNP2SxA@mail.gmail.com>
References: <20240830070351.2855919-1-jens.wiklander@linaro.org>
 <20240830070351.2855919-5-jens.wiklander@linaro.org> <CABdmKX2KzswmiDY4oWw69_rPWs8d_Cqp7OXouSeMQaYX1SDSmw@mail.gmail.com>
 <CAHUa44FYYFVQWf0DGUXNHoOVQEC0-HRyYa0386dHNjo4y1qSiQ@mail.gmail.com>
 <CABdmKX0qd0RoTn2TBQTs9zdf=_JP8pW8hFRUR_7n_t-sfxsGdg@mail.gmail.com>
 <CAHUa44E-7UMseWSEeneYYnAPyhH___=a1YYR6uaOVTNZytzg7g@mail.gmail.com> <CABdmKX2Tsp-KG6_Lth7VUcZcxCfgbsBYqZ5N2h574J+sNP2SxA@mail.gmail.com>
Message-ID: <CAHUa44G9j4rOZHX+XCQyM+mkru12Hy01iyj=USHHiD0raTDfZA@mail.gmail.com>

On Tue, Sep 10, 2024 at 5:08?PM T.J. Mercier <tjmercier at google.com> wrote:
>
> On Mon, Sep 9, 2024 at 11:06?PM Jens Wiklander
> <jens.wiklander at linaro.org> wrote:
> >
> > On Wed, Sep 4, 2024 at 11:42?PM T.J. Mercier <tjmercier at google.com> wrote:
> > >
> > > On Wed, Sep 4, 2024 at 2:44?AM Jens Wiklander <jens.wiklander at linaro.org> wrote:
> > > >
> > > > On Tue, Sep 3, 2024 at 7:50?PM T.J. Mercier <tjmercier at google.com> wrote:
> > > > >
> > > > > On Fri, Aug 30, 2024 at 12:04?AM Jens Wiklander
> > > > > <jens.wiklander at linaro.org> wrote:
> > > > > >
> > > > > > Add a Linaro restricted heap using the linaro,restricted-heap bindings
> > > > > > implemented based on the generic restricted heap.
> > > > > >
> > > > > > The bindings defines a range of physical restricted memory. The heap
> > > > > > manages this address range using genalloc. The allocated dma-buf file
> > > > > > descriptor can later be registered with the TEE subsystem for later use
> > > > > > via Trusted Applications in the secure world.
> > > > > >
> > > > > > Co-developed-by: Olivier Masse <olivier.masse at nxp.com>
> > > > > > Signed-off-by: Olivier Masse <olivier.masse at nxp.com>
> > > > > > Signed-off-by: Jens Wiklander <jens.wiklander at linaro.org>
> > > > > > ---
> > > > > >  drivers/dma-buf/heaps/Kconfig                 |  10 ++
> > > > > >  drivers/dma-buf/heaps/Makefile                |   1 +
> > > > > >  .../dma-buf/heaps/restricted_heap_linaro.c    | 165 ++++++++++++++++++
> > > > > >  3 files changed, 176 insertions(+)
> > > > > >  create mode 100644 drivers/dma-buf/heaps/restricted_heap_linaro.c
> > > > > >
> > > > > > diff --git a/drivers/dma-buf/heaps/Kconfig b/drivers/dma-buf/heaps/Kconfig
> > > > > > index 58903bc62ac8..82e2c5d09242 100644
> > > > > > --- a/drivers/dma-buf/heaps/Kconfig
> > > > > > +++ b/drivers/dma-buf/heaps/Kconfig
> > > > > > @@ -28,3 +28,13 @@ config DMABUF_HEAPS_RESTRICTED_MTK
> > > > > >         help
> > > > > >           Enable restricted dma-buf heaps for MediaTek platform. This heap is backed by
> > > > > >           TEE client interfaces. If in doubt, say N.
> > > > > > +
> > > > > > +config DMABUF_HEAPS_RESTRICTED_LINARO
> > > > > > +       bool "Linaro DMA-BUF Restricted Heap"
> > > > > > +       depends on DMABUF_HEAPS_RESTRICTED
> > > > > > +       help
> > > > > > +         Choose this option to enable the Linaro restricted dma-buf heap.
> > > > > > +         The restricted heap pools are defined according to the DT. Heaps
> > > > > > +         are allocated in the pools using gen allocater.
> > > > > > +         If in doubt, say N.
> > > > > > +
> > > > > > diff --git a/drivers/dma-buf/heaps/Makefile b/drivers/dma-buf/heaps/Makefile
> > > > > > index 0028aa9d875f..66b2f67c47b5 100644
> > > > > > --- a/drivers/dma-buf/heaps/Makefile
> > > > > > +++ b/drivers/dma-buf/heaps/Makefile
> > > > > > @@ -2,4 +2,5 @@
> > > > > >  obj-$(CONFIG_DMABUF_HEAPS_CMA)         += cma_heap.o
> > > > > >  obj-$(CONFIG_DMABUF_HEAPS_RESTRICTED)  += restricted_heap.o
> > > > > >  obj-$(CONFIG_DMABUF_HEAPS_RESTRICTED_MTK)      += restricted_heap_mtk.o
> > > > > > +obj-$(CONFIG_DMABUF_HEAPS_RESTRICTED_LINARO)   += restricted_heap_linaro.o
> > > > > >  obj-$(CONFIG_DMABUF_HEAPS_SYSTEM)      += system_heap.o
> > > > > > diff --git a/drivers/dma-buf/heaps/restricted_heap_linaro.c b/drivers/dma-buf/heaps/restricted_heap_linaro.c
> > > > > > new file mode 100644
> > > > > > index 000000000000..4b08ed514023
> > > > > > --- /dev/null
> > > > > > +++ b/drivers/dma-buf/heaps/restricted_heap_linaro.c
> > > > > > @@ -0,0 +1,165 @@
> > > > > > +// SPDX-License-Identifier: GPL-2.0
> > > > > > +/*
> > > > > > + * DMABUF secure heap exporter
> > > > > > + *
> > > > > > + * Copyright 2021 NXP.
> > > > > > + * Copyright 2024 Linaro Limited.
> > > > > > + */
> > > > > > +
> > > > > > +#define pr_fmt(fmt)     "rheap_linaro: " fmt
> > > > > > +
> > > > > > +#include <linux/dma-buf.h>
> > > > > > +#include <linux/err.h>
> > > > > > +#include <linux/genalloc.h>
> > > > > > +#include <linux/module.h>
> > > > > > +#include <linux/of.h>
> > > > > > +#include <linux/of_fdt.h>
> > > > > > +#include <linux/of_reserved_mem.h>
> > > > > > +#include <linux/scatterlist.h>
> > > > > > +#include <linux/slab.h>
> > > > > > +
> > > > > > +#include "restricted_heap.h"
> > > > > > +
> > > > > > +#define MAX_HEAP_COUNT 2
> > > > >
> > > > > Are multiple supported because of what Cyrille mentioned here about permissions?
> > > > > https://lore.kernel.org/lkml/DBBPR04MB7514E006455AEA407041E4F788709 at DBBPR04MB7514.eurprd04.prod.outlook.com/
> > > >
> > > > Yes, I kept that as is.
> > >
> > > Ok thanks.
> > >
> > > > > So this is just some arbitrary limit? I'd prefer to have some sort of
> > > > > documentation about this.
> > > >
> > > > How about removing the limit and using dynamic allocation instead?
> > >
> > > That works too!
> >
> > It turns out that was easier said than done. The limit is hardcoded
> > because dynamic memory allocation isn't available at that stage during
> > boot. We have a short description of this heap in Kconfig. I'll add
> > something about the limit there if that makes sense.
> >
> > Thanks,
> > Jens
>
> Ah ok sounds good.
>
> I noticed one other thing, linaro_restricted_heap_init and add_heap
> should probably have __init. Last week I sent a patch to add that for
> the CMA and system heaps.

Thanks, I'll add it.

Cheers,
Jens


From peter.wang at mediatek.com  Tue Sep 10 23:03:53 2024
From: peter.wang at mediatek.com (=?utf-8?B?UGV0ZXIgV2FuZyAo546L5L+h5Y+LKQ==?=)
Date: Wed, 11 Sep 2024 06:03:53 +0000
Subject: [PATCH v4 2/2] ufs: core: requeue aborted request
In-Reply-To: <e42abf07-ba6b-4301-8717-8d5b01d56640@acm.org>
References: <20240910073035.25974-1-peter.wang@mediatek.com>
	 <20240910073035.25974-3-peter.wang@mediatek.com>
	 <e42abf07-ba6b-4301-8717-8d5b01d56640@acm.org>
Message-ID: <04e392c00986ac798e881dcd347ff5045cf61708.camel@mediatek.com>

On Tue, 2024-09-10 at 10:59 -0700, Bart Van Assche wrote:
>  	 
> External email : Please do not click links or open attachments until
> you have verified the sender or the content.
>  On 9/10/24 12:30 AM, peter.wang at mediatek.com wrote:
> > ufshcd_abort_all froce abort all on-going command and the host
>                     ^^^^^ ^^^^^              ^^^^^^^         ^^^^
>                 forcibly? aborts?            commands?   host
> controller?
> 

Hi Bart,

Sorry, will correct words next version.


> > will automatically fill in the OCS field of the corresponding
> > response with OCS_ABORTED based on different working modes.
>                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> The host controller only sets the OCS field to OCS_ABORTED in MCQ
> mode
> if the host controller successfully aborted the command. If the
> abort TMF is submitted to the UFS device, the OCS field won't be
> changed
> into OCS_ABORTED. In SDB mode, the host controller does not modify
> the 
> OCS field either.
> 

This statement is not quite accurate becasue in UFSHIC2.1, SDB mode 
specification already have OCS: ABORTED (0x6) define.
And it is used in below UTRLCLR description:
'which means a Transfer Request was "aborted"'
Therefore, the host controller should follow the 
specification and fill the OCS field with OCS: ABORTED. 
If not so, at what point does your host controller use the 
OCS: ABORTED status?


> > SDB mode: aborts a command using UTRLCLR. Task Management response
> > which means a Transfer Request was aborted.
> 
> Hmm ... my understanding is that clearing a bit from UTRLCLR is only
> allowed *after* a command has been aborted and also that clearing a
> bit
> from this register does not abort a command but only frees the
> resources
> in the host controller associated with the command.
> 

Although this specification description does not explicitly 
state the OCS behavior, to my understanding, the specification
for MCQ abort behavior is formulated with reference to the SDB mode.


> > For these two cases, set a flag to notify SCSI to requeue the
> > command after receiving response with OCS_ABORTED.
> 
> I think there is only one case when the SCSI core needs to be
> requested
> to requeue a command, namely when the UFS driver decided to initiate
> the
> abort (ufshcd_abort_all()).
> 
> > @@ -7561,6 +7551,20 @@ int ufshcd_try_to_abort_task(struct ufs_hba
> *hba, int tag)
> >   goto out;
> >   }
> >   
> > +/*
> > + * When the host software receives a "FUNCTION COMPLETE", set flag
> > + * to requeue command after receive response with OCS_ABORTED
> > + * SDB mode: UTRLCLR Task Management response which means a
> Transfer
> > + *           Request was aborted.
> > + * MCQ mode: Host will post to CQ with OCS_ABORTED after SQ
> cleanup
> > + * This flag is set because ufshcd_abort_all forcibly aborts all
> > + * commands, and the host will automatically fill in the OCS field
> > + * of the corresponding response with OCS_ABORTED.
> > + * Therefore, upon receiving this response, it needs to be
> requeued.
> > + */
> > +if (!err)
> > +lrbp->abort_initiated_by_err = true;
> > +
> >   err = ufshcd_clear_cmd(hba, tag);
> >   if (err)
> >   dev_err(hba->dev, "%s: Failed clearing cmd at tag %d, err %d\n",
> 
> The above change is misplaced. ufshcd_try_to_abort_task() can be
> called
> when the SCSI core decides to abort a command while
> abort_initiated_by_err must not be set in that case. Please move the
> above code block into ufshcd_abort_one().
> 

But move to ufshcd_abort_one may have race condition, beacause we
need set this flag before ufshcd_clear_cmd host controller fill
OCS_ABORTED to response. I will add check ufshcd_eh_in_progress.


> Regarding the word "host" in the above comment block: the host is
> the 
> Android device. I think that in the above comment "host" should be
> changed into "host controller".
> 

It will be changed to 'host controller' to make the comment clearer.


> > diff --git a/include/ufs/ufshcd.h b/include/ufs/ufshcd.h
> > index 0fd2aebac728..15b357672ca5 100644
> > --- a/include/ufs/ufshcd.h
> > +++ b/include/ufs/ufshcd.h
> > @@ -173,6 +173,8 @@ struct ufs_pm_lvl_states {
> >    * @crypto_key_slot: the key slot to use for inline crypto (-1 if
> none)
> >    * @data_unit_num: the data unit number for the first block for
> inline crypto
> >    * @req_abort_skip: skip request abort task flag
> > + * @abort_initiated_by_err: The flag is specifically used to
> handle aborts
> > + *                          caused by errors due to host/device
> communication
> 
> The "abort_initiated_by_err" name still seems confusing to me. Please
> make it more clear that this flag is only set if the UFS error
> handler
> decides to abort a command. How about "abort_initiated_by_eh"?
> 
> Please also make the description of this member variable more clear.
> 

Sure, will change this name and make description clearer.

Thanks.
Peter



> Thanks,
> 
> Bart.

From wenst at chromium.org  Tue Sep 10 23:12:40 2024
From: wenst at chromium.org (Chen-Yu Tsai)
Date: Wed, 11 Sep 2024 14:12:40 +0800
Subject: [PATCH v6 09/12] i2c: of-prober: Add regulator support
In-Reply-To: <CAD=FV=U2yDGv74GQWRQuHN9sjdY5iThqpH-br-jYXMkV1cujEg@mail.gmail.com>
References: <20240904090016.2841572-1-wenst@chromium.org> <20240904090016.2841572-10-wenst@chromium.org>
 <CAD=FV=UGOz3Xzg7reJKP=tA1LqTxszv5w-CL9krmoXQtXdJLaQ@mail.gmail.com>
 <CAGXv+5F27K76t=ht5v75jKsNF-J+C0r5+m=czHz6PtV3t5DxcQ@mail.gmail.com>
 <CAD=FV=XVrAdQN8p9QJtt3Ah_YQAG7Y-D4wDx8_+qb1EGN7+Uig@mail.gmail.com>
 <CAGXv+5HO=POHNL_tQHCsy+8=a0gPLMDVHcWMguferahVU+BnZA@mail.gmail.com> <CAD=FV=U2yDGv74GQWRQuHN9sjdY5iThqpH-br-jYXMkV1cujEg@mail.gmail.com>
Message-ID: <CAGXv+5G9pMOU+SZpNH=Rk31wnhADQc3MTm4TjykmdGb=WXdVDw@mail.gmail.com>

On Wed, Sep 11, 2024 at 8:30?AM Doug Anderson <dianders at chromium.org> wrote:
>
> Hi,
>
> On Thu, Sep 5, 2024 at 8:45?PM Chen-Yu Tsai <wenst at chromium.org> wrote:
> >
> > > > IIUC we could have the "options" data structure have much more board
> > > > specific information:
> > > >
> > > >   - name of node to fetch resources (regulator supplies and GPIOs) from
> > > >   - names of the resources for the node given from the previous item
> > > >   - delay time after each resource is toggled
> > > >   - polarity in the case of GPIOs
> > > >   - prober callback to do power sequencing
> > > >
> > > > The "resource collection" step would use the first two items to retrieve
> > > > the regulator supplies and GPIOS instead of the bulk APIs used right now.
> > > >
> > > > The power sequencing callback would use the resources combined with the
> > > > given delays to enable the supplies and toggle the GPIOs.
> > > >
> > > > For now I would probably only implement a generic one regulator supply
> > > > plus one GPIO helper. That is the common case for touchscreens and
> > > > trackpads connected over a ribbon cable.
> > > >
> > > > Does that sound like what you have in mind?
> > >
> > > I guess I'd have to see how the code looks to know for sure, but if I
> > > understand it sounds a little awkward. Specifically, the "options"
> > > sound like they might become complicated enough that you're inventing
> > > your own little programming language (with delays, abilities to drive
> > > pins low and high, abilities to turn on/off clocks, and abilities to
> > > turn off/on regulators) and then probers need to code up their
> > > programs in this language. You also need to handle undoing things
> > > properly if there is a failure in the middle. Like your "program"
> > > would look like this (obviously you'd have to play with enums more,
> > > but you get the idea):
> > >
> > > {
> > >    { OPCODE_TURN_REGULATOR_ON, "vdd" },
> > >    { OPCODE_DELAY, 10 },
> > >    { OPCODE_GPIO_ASSERT, "reset" },
> > >    { OPCODE_DELAY, 5 },
> > >    { OPCODE_GPIO_DEASSERT "reset" },
> > >    { OPCODE_DELAY, 100 },
> > >    { OPCODE_TURN_REGULATOR_ON, "vddIO" },
> > > }
> > >
> > > Why not just expect the board probers to write C code to turn things
> > > on before looking for i2c devices, then provide helpers to the C code?
> > >
> > > So there wouldn't be some generic "resource collection" API, but you'd
> > > provide a helper to make it easy to grab regulators from one of the
> > > nodes by name. If you think bulk enabling regulators is common then
> > > you could make a helper that grabs all of the regulators from a node
> > > in a way that is consistent with the bulk APIs, but I wouldn't expect
> > > every driver to use that since devices I've seen expect regulators to
> > > be enabled in a very specific order even if they don't need a delay
> > > between them.
> > >
> > > I wouldn't expect a "collect all GPIOs" API because it seems really
> > > weird to me that we'd ever want to jam multiple GPIOs in a state
> > > without knowing exactly which GPIO was what and asserting them in the
> > > right sequence.
> >
> > So I'm slightly confused, as it sounds like at this point the i2c prober
> > would be litter more than just a framework, and the heavy lifting is to
> > be all done by callbacks provided by the board-specific driver?
> >
> > So the framework becomes something like:
> >
> > 1. find i2c bus node
> > 2. call provided callback with i2c bus node to gather resources;
> >    let callback handle specifics
> > 3. call provided callback to enable resources
> > 4. for each i2c component, call provided callback to probe
>
> I don't think I'd do it as callbacks but just have the HW prober call
> the functions directly. AKA, instead of doing:
>
>   i2c_of_probe_component(dev, "touchscreen", ts_opts, ts_callbacks);
>
> Do:
>
>   grab_touchscreen_resources(...);
>   power_on_touchscreens(...);
>   i2c_of_probe_component(...);
>   power_off_touchscreen(...);
>   release_touchscreen_resources(...);
>
> Obviously I'm spitballing here, though. Without writing the code it's
> hard for me to know that my proposal would be better, but my gut tells
> me that trying to write something overly generic with lots of options
> / callbacks would be more confusing.

The helpers would be exported along with the framework, so there's nothing
preventing others from using the helpers directly. The framework provides
boilerplate so that scenarios fitting it won't have to duplicate the code.
Obviously I'm basing it on my scenario here, but I think it works out for
the simpler cases.

I'll send out what I have reworked, and we can continue the discussion
either on the mailing list or in person at ELCE and Plumbers.

> >   If the probe succeeded:
> >
> >     5. call provided callback for early release of resources (GPIOs)
> >     6. set "status" to "okay"
> >     7. call provided callback for late release of resources (regulators)
> >
> >   Otherwise at the end of the loop
> >
> > 8. release resources
> >
> > The current code can be reworked into helpers for steps 2, 3, 5, 7 for
> > the single regulator single GPIO case.
> >
> > > > This next item would be a later enhancement (which isn't implemented in
> > > > this series anyway):
> > > >
> > > >   - optional prober callback that does actual probing
> > > >
> > > > In our case it would only be used for cases where an HID-over-I2C
> > > > component shares the same address as a non-HID one, and some extra
> > > > work is needed to determine which type it is. I still need to think
> > > > about the structure of this.
> > >
> > > IMO _that_ would be a great option to the i2c prober. It feels like
> > > you could have an optional register read that needs to match to have
> > > the i2c prober succeed. Most people would leave it blank (just the i2c
> > > device existing is enough) but probably a single register read would
> > > be enough to confirm you got the right device. Most i2c devices have
> > > some sort of "version" / "vendor" / "id" type register somewhere.
> >
> > At least for the stuff that we have (touchscreens and trackpads) such
> > registers typically don't exist, unless it's an HID-over-I2C device,
> > in which case there's the standard HID descriptor at some address.
> > But, yeah, reading the HID descriptor was the use case I had in mind.
> >
> > At least for one Chromebooks it's a bit more tricky because that one
> > HID-over-I2C component shares the same address as a non-HID one. We
> > currently have different SKU IDs and thus different device trees for
> > them, but we could make the prober work with this. It just has be able
> > to tell if the component it's currently probing needs the special
> > prober and is it responding correctly. This bit I need to think about.
>
> I guess Mark Brown also thought that there wouldn't be some magic
> register, but my gut still tells me that most i2c devices have some
> way to confirm that they are what you expect even if it's not an
> official "vendor" or "version" register. Some type of predictable
> register at a predictable location that you could use, at least if you
> knew all of the options that someone might stuff.
>
> For instance, in elan trackpads you can see elan_i2c_get_product_id().
> That just reads a location (ETP_I2C_UNIQUEID_CMD = 0x0101) that could
> theoretically be used to figure out (maybe in conjunction with other
> registers) that it's an elan trackpad instead of an i2c-hid one. You'd
> have to (of course) confirm that an i2c-hid device wouldn't somehow
> return back data from this read that made it look like an elan
> trackpad, but it feels like there ought to be some way to figure it
> out with a few i2c register reads.
>
> ...that being said, I guess my original assertion that you might be
> able to figure out with a simple register read was naive and you'd
> actually need a function (maybe as a callback) to figure this out.

Yeah, that's my plan for a follow-up series, likely after the SKU ID
based prober work is done. The actual probe function would likely only
target the known cases of I2C address conflicts we have on ChromeOS
devices.


From fshao at chromium.org  Tue Sep 10 23:29:02 2024
From: fshao at chromium.org (Fei Shao)
Date: Wed, 11 Sep 2024 14:29:02 +0800
Subject: [PATCH] media: mediatek: vcodec: Reduce msg queue trans buffer size
In-Reply-To: <20240822142403.qz3ia26at3rxob2v@basti-XPS-13-9310>
References: <20240521095536.3869399-1-fshao@chromium.org> <9f73dffc48394e6304263ac2293a2b18864ae3dd.camel@collabora.com>
 <CAC=S1njnqrdrQqJZYQ7mffgmAUUxtoO7utZumED0dmX=Fa9+Qw@mail.gmail.com> <20240822142403.qz3ia26at3rxob2v@basti-XPS-13-9310>
Message-ID: <CAC=S1ngw0h9=i_sH8BvUqi8hTt1JgyvO6Epq9jA2D_WmqRLQeg@mail.gmail.com>

Hi Sebastian,

On Thu, Aug 22, 2024 at 10:24?PM Sebastian Fricke
<sebastian.fricke at collabora.com> wrote:
> So are you going to send a new version for this?

Sorry for the delayed response.

Not likely in a short period. I haven't had a more detailed discussion
with MediaTek about their buffer requirements on this.
I'll resend a new version after I have a better picture of a more
dynamic implementation based on the resolution size.
Feel free to archive or ignore this patch as needed.

Thanks,
Fei


From rohiagar at chromium.org  Wed Sep 11 00:17:21 2024
From: rohiagar at chromium.org (Rohit Agarwal)
Date: Wed, 11 Sep 2024 07:17:21 +0000
Subject: [PATCH] dt-bindings: display: mediatek: dpi: Add power domain for MT8195 DP_INTF
Message-ID: <20240911071722.558960-1-rohiagar@chromium.org>

Add power domain binding for MT8195 DP_INTF that resolves the following
error and many more similar ones:

arch/arm64/boot/dts/mediatek/mt8195-cherry-dojo-r1.dtb: dp-intf at 1c113000:
power-domains: False schema does not allow [[55, 18]]

Reported-by: kernel test robot <lkp at intel.com>
Closes: https://lore.kernel.org/oe-kbuild-all/202409102119.AYvaTjUi-lkp at intel.com/
Signed-off-by: Rohit Agarwal <rohiagar at chromium.org>
---
 .../devicetree/bindings/display/mediatek/mediatek,dpi.yaml       | 1 +
 1 file changed, 1 insertion(+)

diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml b/Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml
index 3a82aec9021c..07acc8a76bfc 100644
--- a/Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml
+++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml
@@ -89,6 +89,7 @@ allOf:
                 - mediatek,mt6795-dpi
                 - mediatek,mt8173-dpi
                 - mediatek,mt8186-dpi
+                - mediatek,mt8195-dp-intf
     then:
       properties:
         power-domains: false
-- 
2.46.0.662.g92d0881bb0-goog



From wenst at chromium.org  Wed Sep 11 00:27:38 2024
From: wenst at chromium.org (Chen-Yu Tsai)
Date: Wed, 11 Sep 2024 15:27:38 +0800
Subject: [PATCH v7 00/10] platform/chrome: Introduce DT hardware prober
Message-ID: <20240911072751.365361-1-wenst@chromium.org>

Hi everyone,

This is v7 of my "of: Introduce hardware prober driver" [1] series.
v7 mainly refactors the code into a series of helpers. The scope of
supported components is also reduced to those with at most one regulator
supply and one GPIO pin. Also the helpers expect these to be named and
so the "bulk get" API changes have been dropped.

Also, a pull request to document the "fail-needs-probe" status has been
sent: https://github.com/devicetree-org/dt-schema/pull/141

v2 continued Doug's "of: device: Support 2nd sources of probeable but
undiscoverable devices" [2] series, but follows the scheme suggested by
Rob, marking all second source component device nodes as "fail-needs-probe",
and having a hardware prober driver enable the one of them.


Changes since v6:
- Link to v6:
  https://lore.kernel.org/all/20240904090016.2841572-1-wenst at chromium.org/
- Dropped patch "gpiolib: Add gpio_property_name_length()"
  No longer needed
- Dropped patch "regulator: Move OF-specific regulator lookup code to of_regulator.c"
  Already merged
- Patch 2 "of: base: Add for_each_child_of_node_with_prefix()"
  - Changed helper name to "for_each_child_of_node_with_prefix()"
- Patch 4 "regulator: Add of_regulator_get_optional() for pure DT regulator lookup"
  - Was "regulator: Do pure DT regulator lookup in of_regulator_bulk_get_all()"
  - Changed reference [1] to Link: tag
  - Rebased on top of commit 401d078eaf2e ("regulator: of: Refactor
    of_get_*regulator() to decrease indentation")
  - Exported of_regulator_get_optional()
  - Changed commit message to focus on "of_regulator_get_optional()"
  - Dropped change to of_regulator_bulk_get_all()
- Patch 5 "i2c: core: Remove extra space in Makefile"
  - Collected Andy's Reviewed-by
- Patch 6 "i2c: Introduce OF component probe function"
  - Correctly replaced for_each_child_of_node_scoped() with
    for_each_child_of_node_with_prefix()
  - Added namespace for exported symbols
  - Made the probe function a framework with hooks
  - Split out a new header file
  - Added MAINTAINERS entry
  - Reworded kernel-doc
  - Dropped usage of __free from i2c_of_probe_component() since error
    path cleanup is needed anyway
- Patch 7 "i2c: of-prober: Add simple helpers for regulator support"
  - Moved change of of_get_next_child_scoped() to
    of_get_next_child_with_prefix() to previous patch
  - Restructured into helpers for the I2C OF component prober
  - Reduced to only handle one regulator
  - Commit message updated
- Patch 8 "i2c: of-prober: Add GPIO support to simple helpers"
  - Restructured into helpers for the I2C OF component prober
  - Reduced to only handle one GPIO
  - Set GPIO to input on (failure) cleanup
  - Updated commit message
- Patch 9 "platform/chrome: Introduce device tree hardware prober"
  - Adapted to new I2C OF prober interface
  - Collected Acked-by tag

Changes since v5:
- Link to v5:
  https://lore.kernel.org/all/20240822092006.3134096-1-wenst at chromium.org/
- Patch 1 "of: dynamic: Add of_changeset_update_prop_string"
  - Collected Rob's reviewed-by
- Patch 2 "of: base: Add for_each_child_of_node_with_prefix_scoped()"
  - New patch
- Patch 3 "regulator: Move OF-specific regulator lookup code to of_regulator.c"
  - Fix kerneldoc format of of_regulator_dev_lookup()
  - Fix stub compile error for !CONFIG_OF in drivers/regulator/internal.h
- Patch 4 "regulator: Split up _regulator_get()"
  - Fixed kerneldoc "Return" section format for _regulator_get_common()
  - Slightly reworded return value description
- Patch 5 "regulator: Do pure DT regulator lookup in of_regulator_bulk_get_all()"
  - Used "dev_of_node(dev)" instead of "dev->of_node"
  - Replaced "dev_printk" with "dev_printk()" in kerneldoc mentions
  - Fixed kerneldoc "Return" section format for of_regulator_get_optional()
  - Fix @np parameter name in of_regulator_dev_lookup() kerneldoc
- Patch 6 "gpiolib: Add gpio_property_name_length()"
  - Changed function name to "gpio_get_property_name_length()"
  - Changed argument name to "propname"
  - Clarified return value for "*-<GPIO suffix>" case
  - Reworked according to Andy's suggestion
  - Added stub function
- Patch 7 "i2c: core: Remove extra space in Makefile"
  - New patch
- Patch 8 "i2c: Introduce OF component probe function"
  - Fixed indent in Makefile
  - Split regulator and GPIO TODO items
  - Reversed final conditional in i2c_of_probe_enable_node()
- Patch 9 "i2c: of-prober: Add regulator support"
  - Split of_regulator_bulk_get_all() return value check and explain
    "ret == 0" case
  - Switched to of_get_next_child_with_prefix_scoped() where applicable
  - Used krealloc_array() instead of directly calculating size
  - copy whole regulator array in one memcpy() call
  - Drop "0" from struct zeroing initializer
  - Split out regulator helper from i2c_of_probe_enable_res() to keep
    code cleaner when combined with the next patch
  - Added options for customizing power sequencing delay
  - Rename i2c_of_probe_get_regulator() to i2c_of_probe_get_regulators()
  - Add i2c_of_probe_free_regulator() helper
- Patch 10 "i2c: of-prober: Add GPIO support"
  - Renamed "con" to "propname" in i2c_of_probe_get_gpiod()
  - Copy string first and check return value of strscpy() for overflow in
    i2c_of_probe_get_gpiod()
  - Add parenthesis around "enable" and "reset" GPIO names in comments
  - Split resource count debug message into two separate lines
  - Split out GPIO helper from i2c_of_probe_enable_res() to keep code
    cleaner following the previous patch
  - Adopted options for customizing power sequencing delay following
    previous patch
- Patch 11 "platform/chrome: Introduce device tree hardware prober"
  - Adapt to new i2c_of_probe_component() parameters
- Patch 12 "arm64: dts: mediatek: mt8173-elm-hana: Mark touchscreens and
	    trackpads as fail"
  - None

See v5 cover letter for previous change logs.

For the I2C component (touchscreens and trackpads) case from the
original series, the hardware prober driver finds the particular
class of device in the device tree, gets its parent I2C adapter,
and tries to initiate a simple I2C read for each device under that
I2C bus. When it finds one that responds, it considers that one
present, marks it as "okay", and returns, letting the driver core
actually probe the device.

This works fine in most cases since these components are connected
via a ribbon cable and always have the same resources. The prober
will also grab these resources and enable them.

The other case, selecting a display panel to use based on the SKU ID
from the firmware, hit a bit of an issue with fixing the OF graph.
It has been left out since v3.

Patch 1 adds of_changeset_update_prop_string(), as requested by Rob.

Patch 2 adds for_each_child_of_node_with_prefix(), as suggested by Andy.

Patches 3 through 4 reorganize the OF-specific regulator core code and
adds a new of_regulator_get_optional() function to look up regulator
supplies solely using device tree nodes.

Patch 5 cleans up some extra spaces in the i2c core Makefile

Patch 6 implements probing the I2C bus for presence of components as
a hookable helper function in the I2C core.

Patch 7 implements regulator supply support as a set of simple helpers
for the I2C component prober.

Patch 8 implements GPIO support for the I2C component prober simple
helpers.

Patch 9 adds a ChromeOS specific DT hardware prober. This initial
version targets the Hana Chromebooks, probing its I2C trackpads and
touchscreens.

Patch 10 modifies the Hana device tree and marks the touchscreens
and trackpads as "fail-needs-probe", ready for the driver to probe.


The patch and build time dependencies for this series is now quite
complicated:

  regulator cleanups in -next -> regulator patches here ----
							   |
							   v
  platform/chrome device tree hardware prober <--- i2c of-prober
 
The regulator patches in this series depend on other cleanup patches [1]
that are already in -next. Patches 6 through 8 introducting i2c of-prober
depend on the first 5 patches. Patch 11, The chrome prober, depends on
patch 6 for now.

I think it would be easier if the respective maintainers take the first
four patches for -rc1. Wolfram has agreed to take the remaining i2c and
chrome patches through the i2c tree once the other bits have landed,
Patch 12 can go in only after everything else is in. This should be
better than having an immutable branch on top of some commit in -next
for other trees to consume.

This might be the last revision I send out before ELCE / Plumbers, as
I'm traveling to Austria a few day earlier. If there are more concerns
about the design, maybe we could discuss it in person then if all
concerned parties are present.


Thanks
ChenYu


Chen-Yu Tsai (10):
  of: dynamic: Add of_changeset_update_prop_string
  of: base: Add for_each_child_of_node_with_prefix()
  regulator: Split up _regulator_get()
  regulator: Add of_regulator_get_optional() for pure DT regulator
    lookup
  i2c: core: Remove extra space in Makefile
  i2c: Introduce OF component probe function
  i2c: of-prober: Add simple helpers for regulator support
  i2c: of-prober: Add GPIO support to simple helpers
  platform/chrome: Introduce device tree hardware prober
  arm64: dts: mediatek: mt8173-elm-hana: Mark touchscreens and trackpads
    as fail

 MAINTAINERS                                   |   8 +
 .../boot/dts/mediatek/mt8173-elm-hana.dtsi    |  13 +
 arch/arm64/boot/dts/mediatek/mt8173-elm.dtsi  |   4 +-
 drivers/i2c/Makefile                          |   7 +-
 drivers/i2c/i2c-core-of-prober.c              | 455 ++++++++++++++++++
 drivers/of/base.c                             |  35 ++
 drivers/of/dynamic.c                          |  44 ++
 drivers/platform/chrome/Kconfig               |  11 +
 drivers/platform/chrome/Makefile              |   1 +
 .../platform/chrome/chromeos_of_hw_prober.c   | 125 +++++
 drivers/regulator/core.c                      |  58 ++-
 drivers/regulator/internal.h                  |   6 +
 drivers/regulator/of_regulator.c              |  51 +-
 include/linux/i2c-of-prober.h                 | 131 +++++
 include/linux/of.h                            |  13 +
 include/linux/regulator/consumer.h            |   4 +
 16 files changed, 942 insertions(+), 24 deletions(-)
 create mode 100644 drivers/i2c/i2c-core-of-prober.c
 create mode 100644 drivers/platform/chrome/chromeos_of_hw_prober.c
 create mode 100644 include/linux/i2c-of-prober.h

-- 
2.46.0.598.g6f2099f65c-goog



From wenst at chromium.org  Wed Sep 11 00:27:39 2024
From: wenst at chromium.org (Chen-Yu Tsai)
Date: Wed, 11 Sep 2024 15:27:39 +0800
Subject: [PATCH v7 01/10] of: dynamic: Add of_changeset_update_prop_string
In-Reply-To: <20240911072751.365361-1-wenst@chromium.org>
References: <20240911072751.365361-1-wenst@chromium.org>
Message-ID: <20240911072751.365361-2-wenst@chromium.org>

Add a helper function to add string property updates to an OF changeset.
This is similar to of_changeset_add_prop_string(), but instead of adding
the property (and failing if it exists), it will update the property.

This shall be used later in the DT hardware prober.

Signed-off-by: Chen-Yu Tsai <wenst at chromium.org>
Reviewed-by: Rob Herring (Arm) <robh at kernel.org>
---
Changes since v6:
None.

Changes since v5:
- Collected Rob's tag

Changes since v4:
- Use modern designated initializer for |prop|

Changes since v3:
- Use new __of_prop_free() helper
- Add new line before header declaration

Changes since v2:
- New patch added in v3
---
 drivers/of/dynamic.c | 44 ++++++++++++++++++++++++++++++++++++++++++++
 include/linux/of.h   |  4 ++++
 2 files changed, 48 insertions(+)

diff --git a/drivers/of/dynamic.c b/drivers/of/dynamic.c
index 110104a936d9..daa69d160a78 100644
--- a/drivers/of/dynamic.c
+++ b/drivers/of/dynamic.c
@@ -1072,3 +1072,47 @@ int of_changeset_add_prop_bool(struct of_changeset *ocs, struct device_node *np,
 	return of_changeset_add_prop_helper(ocs, np, &prop);
 }
 EXPORT_SYMBOL_GPL(of_changeset_add_prop_bool);
+
+static int of_changeset_update_prop_helper(struct of_changeset *ocs,
+					   struct device_node *np,
+					   const struct property *pp)
+{
+	struct property *new_pp;
+	int ret;
+
+	new_pp = __of_prop_dup(pp, GFP_KERNEL);
+	if (!new_pp)
+		return -ENOMEM;
+
+	ret = of_changeset_update_property(ocs, np, new_pp);
+	if (ret)
+		__of_prop_free(new_pp);
+
+	return ret;
+}
+
+/**
+ * of_changeset_update_prop_string - Add a string property update to a changeset
+ *
+ * @ocs:	changeset pointer
+ * @np:		device node pointer
+ * @prop_name:	name of the property to be updated
+ * @str:	pointer to null terminated string
+ *
+ * Create a string property to be updated and add it to a changeset.
+ *
+ * Return: 0 on success, a negative error value in case of an error.
+ */
+int of_changeset_update_prop_string(struct of_changeset *ocs,
+				    struct device_node *np,
+				    const char *prop_name, const char *str)
+{
+	struct property prop = {
+		.name = (char *)prop_name,
+		.length = strlen(str) + 1,
+		.value = (void *)str,
+	};
+
+	return of_changeset_update_prop_helper(ocs, np, &prop);
+}
+EXPORT_SYMBOL_GPL(of_changeset_update_prop_string);
diff --git a/include/linux/of.h b/include/linux/of.h
index 85b60ac9eec5..046283be1cd3 100644
--- a/include/linux/of.h
+++ b/include/linux/of.h
@@ -1651,6 +1651,10 @@ static inline int of_changeset_add_prop_u32(struct of_changeset *ocs,
 	return of_changeset_add_prop_u32_array(ocs, np, prop_name, &val, 1);
 }
 
+int of_changeset_update_prop_string(struct of_changeset *ocs,
+				    struct device_node *np,
+				    const char *prop_name, const char *str);
+
 int of_changeset_add_prop_bool(struct of_changeset *ocs, struct device_node *np,
 			       const char *prop_name);
 
-- 
2.46.0.598.g6f2099f65c-goog



From wenst at chromium.org  Wed Sep 11 00:27:40 2024
From: wenst at chromium.org (Chen-Yu Tsai)
Date: Wed, 11 Sep 2024 15:27:40 +0800
Subject: [PATCH v7 02/10] of: base: Add for_each_child_of_node_with_prefix()
In-Reply-To: <20240911072751.365361-1-wenst@chromium.org>
References: <20240911072751.365361-1-wenst@chromium.org>
Message-ID: <20240911072751.365361-3-wenst@chromium.org>

There are cases where drivers would go through child device nodes and
operate on only the ones whose node name starts with a given prefix.

Provide a helper for these users. This will mainly be used in a
subsequent patch that implements a hardware component prober for I2C
busses.

Signed-off-by: Chen-Yu Tsai <wenst at chromium.org>
---
Changes since v6:
- Changed helper name to "for_each_child_of_node_with_prefix()"
Changes since v5:
- New patch
---
 drivers/of/base.c  | 35 +++++++++++++++++++++++++++++++++++
 include/linux/of.h |  9 +++++++++
 2 files changed, 44 insertions(+)

diff --git a/drivers/of/base.c b/drivers/of/base.c
index 20603d3c9931..d3c123b3261a 100644
--- a/drivers/of/base.c
+++ b/drivers/of/base.c
@@ -628,6 +628,41 @@ struct device_node *of_get_next_child(const struct device_node *node,
 }
 EXPORT_SYMBOL(of_get_next_child);
 
+/**
+ * of_get_next_child_with_prefix - Find the next child node with prefix
+ * @node:	parent node
+ * @prev:	previous child of the parent node, or NULL to get first
+ *
+ * This function is like of_get_next_child(), except that it automatically
+ * skips any nodes whose name doesn't have the given prefix.
+ *
+ * Return: A node pointer with refcount incremented, use
+ * of_node_put() on it when done.
+ */
+struct device_node *of_get_next_child_with_prefix(const struct device_node *node,
+						  struct device_node *prev,
+						  const char *prefix)
+{
+	struct device_node *next;
+	unsigned long flags;
+
+	if (!node)
+		return NULL;
+
+	raw_spin_lock_irqsave(&devtree_lock, flags);
+	next = prev ? prev->sibling : node->child;
+	for (; next; next = next->sibling) {
+		if (!of_node_name_prefix(next, prefix))
+			continue;
+		if (of_node_get(next))
+			break;
+	}
+	of_node_put(prev);
+	raw_spin_unlock_irqrestore(&devtree_lock, flags);
+	return next;
+}
+EXPORT_SYMBOL(of_get_next_child_with_prefix);
+
 static struct device_node *of_get_next_status_child(const struct device_node *node,
 						    struct device_node *prev,
 						    bool (*checker)(const struct device_node *))
diff --git a/include/linux/of.h b/include/linux/of.h
index 046283be1cd3..48cfb39197d6 100644
--- a/include/linux/of.h
+++ b/include/linux/of.h
@@ -289,6 +289,9 @@ extern struct device_node *of_get_parent(const struct device_node *node);
 extern struct device_node *of_get_next_parent(struct device_node *node);
 extern struct device_node *of_get_next_child(const struct device_node *node,
 					     struct device_node *prev);
+extern struct device_node *of_get_next_child_with_prefix(const struct device_node *node,
+							 struct device_node *prev,
+							 const char *prefix);
 extern struct device_node *of_get_next_available_child(
 	const struct device_node *node, struct device_node *prev);
 extern struct device_node *of_get_next_reserved_child(
@@ -1468,6 +1471,12 @@ static inline int of_property_read_s32(const struct device_node *np,
 	     child != NULL;						\
 	     child = of_get_next_child(parent, child))
 
+#define for_each_child_of_node_with_prefix(parent, child, prefix)	\
+	for (struct device_node *child __free(device_node) =		\
+	     of_get_next_child_with_prefix(parent, NULL, prefix);	\
+	     child != NULL;						\
+	     child = of_get_next_child_with_prefix(parent, child, prefix))
+
 #define for_each_available_child_of_node(parent, child) \
 	for (child = of_get_next_available_child(parent, NULL); child != NULL; \
 	     child = of_get_next_available_child(parent, child))
-- 
2.46.0.598.g6f2099f65c-goog



From wenst at chromium.org  Wed Sep 11 00:27:41 2024
From: wenst at chromium.org (Chen-Yu Tsai)
Date: Wed, 11 Sep 2024 15:27:41 +0800
Subject: [PATCH v7 03/10] regulator: Split up _regulator_get()
In-Reply-To: <20240911072751.365361-1-wenst@chromium.org>
References: <20240911072751.365361-1-wenst@chromium.org>
Message-ID: <20240911072751.365361-4-wenst@chromium.org>

_regulator_get() contains a lot of common code doing checks prior to the
regulator lookup and housekeeping work after the lookup. Almost all the
code could be shared with a OF-specific variant of _regulator_get().

Split out the common parts so that they can be reused. The OF-specific
version of _regulator_get() will be added in a subsequent patch.
No functional changes were made.

Signed-off-by: Chen-Yu Tsai <wenst at chromium.org>
---
Changes since v6:
None.

Changes since v5:
- Fixed kerneldoc "Return" section format for _regulator_get_common()
- Slightly reworded return value description

Changes since v4:
- New patch
---
 drivers/regulator/core.c     | 54 ++++++++++++++++++++++++++++--------
 drivers/regulator/internal.h |  4 +++
 2 files changed, 47 insertions(+), 11 deletions(-)

diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c
index 835a5531d045..d60c86477ac2 100644
--- a/drivers/regulator/core.c
+++ b/drivers/regulator/core.c
@@ -2103,26 +2103,43 @@ static int regulator_resolve_supply(struct regulator_dev *rdev)
 	return ret;
 }
 
-/* Internal regulator request function */
-struct regulator *_regulator_get(struct device *dev, const char *id,
-				 enum regulator_get_type get_type)
+/* common pre-checks for regulator requests */
+int _regulator_get_common_check(struct device *dev, const char *id,
+				enum regulator_get_type get_type)
 {
-	struct regulator_dev *rdev;
-	struct regulator *regulator;
-	struct device_link *link;
-	int ret;
-
 	if (get_type >= MAX_GET_TYPE) {
 		dev_err(dev, "invalid type %d in %s\n", get_type, __func__);
-		return ERR_PTR(-EINVAL);
+		return -EINVAL;
 	}
 
 	if (id == NULL) {
 		dev_err(dev, "regulator request with no identifier\n");
-		return ERR_PTR(-EINVAL);
+		return -EINVAL;
 	}
 
-	rdev = regulator_dev_lookup(dev, id);
+	return 0;
+}
+
+/**
+ * _regulator_get_common - Common code for regulator requests
+ * @rdev: regulator device pointer as returned by *regulator_dev_lookup()
+ *       Its reference count is expected to have been incremented.
+ * @dev: device used for dev_printk messages
+ * @id: Supply name or regulator ID
+ * @get_type: enum regulator_get_type value corresponding to type of request
+ *
+ * Returns: pointer to struct regulator corresponding to @rdev, or ERR_PTR()
+ *	    encoded error.
+ *
+ * This function should be chained with *regulator_dev_lookup() functions.
+ */
+struct regulator *_regulator_get_common(struct regulator_dev *rdev, struct device *dev,
+					const char *id, enum regulator_get_type get_type)
+{
+	struct regulator *regulator;
+	struct device_link *link;
+	int ret;
+
 	if (IS_ERR(rdev)) {
 		ret = PTR_ERR(rdev);
 
@@ -2238,6 +2255,21 @@ struct regulator *_regulator_get(struct device *dev, const char *id,
 	return regulator;
 }
 
+/* Internal regulator request function */
+struct regulator *_regulator_get(struct device *dev, const char *id,
+				 enum regulator_get_type get_type)
+{
+	struct regulator_dev *rdev;
+	int ret;
+
+	ret = _regulator_get_common_check(dev, id, get_type);
+	if (ret)
+		return ERR_PTR(ret);
+
+	rdev = regulator_dev_lookup(dev, id);
+	return _regulator_get_common(rdev, dev, id, get_type);
+}
+
 /**
  * regulator_get - lookup and obtain a reference to a regulator.
  * @dev: device for regulator "consumer"
diff --git a/drivers/regulator/internal.h b/drivers/regulator/internal.h
index 8e5506c5ee94..5b43f802468d 100644
--- a/drivers/regulator/internal.h
+++ b/drivers/regulator/internal.h
@@ -121,6 +121,10 @@ enum regulator_get_type {
 	MAX_GET_TYPE
 };
 
+int _regulator_get_common_check(struct device *dev, const char *id,
+				enum regulator_get_type get_type);
+struct regulator *_regulator_get_common(struct regulator_dev *rdev, struct device *dev,
+					const char *id, enum regulator_get_type get_type);
 struct regulator *_regulator_get(struct device *dev, const char *id,
 				 enum regulator_get_type get_type);
 int _regulator_bulk_get(struct device *dev, int num_consumers,
-- 
2.46.0.598.g6f2099f65c-goog



From wenst at chromium.org  Wed Sep 11 00:27:42 2024
From: wenst at chromium.org (Chen-Yu Tsai)
Date: Wed, 11 Sep 2024 15:27:42 +0800
Subject: [PATCH v7 04/10] regulator: Add of_regulator_get_optional() for pure DT regulator lookup
In-Reply-To: <20240911072751.365361-1-wenst@chromium.org>
References: <20240911072751.365361-1-wenst@chromium.org>
Message-ID: <20240911072751.365361-5-wenst@chromium.org>

The to-be-introduced I2C component prober needs to enable regulator
supplies (and toggle GPIO pins) for the various components it intends
to probe. To support this, a new "pure DT lookup" method for getting
regulator supplies is needed, since the device normally requesting
the supply won't get created until after the component is probed to
be available.

Add a new of_regulator_get_optional() function for this. This mirrors
the existing regulator_get_optional() function, but is OF-specific.
The underlying code that supports the existing regulator_get*()
functions has been reworked in previous patches to support this
specific case.

Also convert an existing usage of "dev && dev->of_node" to
"dev_of_node(dev)".

Link: https://lore.kernel.org/all/20231220203537.83479-2-jernej.skrabec at gmail.com/ [1]
Signed-off-by: Chen-Yu Tsai <wenst at chromium.org>
---
Changes since v6:
- Changed reference [1] to Link: tag
- Rebased on top of commit 401d078eaf2e ("regulator: of: Refactor
  of_get_*regulator() to decrease indentation")
- Exported of_regulator_get_optional()
- Changed commit message to focus on "of_regulator_get_optional()"
- Dropped change to of_regulator_bulk_get_all()

Changes since v5:
- Used "dev_of_node(dev)" instead of "dev->of_node"
- Replaced "dev_printk" with "dev_printk()" in kerneldoc mentions
- Fixed kerneldoc "Return" section format for of_regulator_get_optional()
- Fix @np parameter name in of_regulator_dev_lookup() kerneldoc

Changes since v4:
- Restore platform-agnostic regulator consumer code to original state
- Move OF-specific regulator code to of_regulator.c (separate patch)
- Split _regulator_get() into three parts for reuse (separate patch)
- Add OF-specific _of_regulator_get() function
- Rename regulator_of_get_optional() to of_regulator_get_optional() for
  consistency
- Make of_regulator_get_optional static, as it is only used internally
- Convert of_regulator_bulk_get_all()

Changes since v3:
- New patch
---
 drivers/regulator/core.c           |  4 +--
 drivers/regulator/internal.h       |  2 ++
 drivers/regulator/of_regulator.c   | 51 ++++++++++++++++++++++++++----
 include/linux/regulator/consumer.h |  4 +++
 4 files changed, 53 insertions(+), 8 deletions(-)

diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c
index d60c86477ac2..f94a06ac2109 100644
--- a/drivers/regulator/core.c
+++ b/drivers/regulator/core.c
@@ -1959,8 +1959,8 @@ static struct regulator_dev *regulator_dev_lookup(struct device *dev,
 	regulator_supply_alias(&dev, &supply);
 
 	/* first do a dt based lookup */
-	if (dev && dev->of_node) {
-		r = of_regulator_dev_lookup(dev, supply);
+	if (dev_of_node(dev)) {
+		r = of_regulator_dev_lookup(dev, dev_of_node(dev), supply);
 		if (!IS_ERR(r))
 			return r;
 		if (PTR_ERR(r) == -EPROBE_DEFER)
diff --git a/drivers/regulator/internal.h b/drivers/regulator/internal.h
index 5b43f802468d..f62cacbbc729 100644
--- a/drivers/regulator/internal.h
+++ b/drivers/regulator/internal.h
@@ -67,6 +67,7 @@ static inline struct regulator_dev *dev_to_rdev(struct device *dev)
 
 #ifdef CONFIG_OF
 struct regulator_dev *of_regulator_dev_lookup(struct device *dev,
+					      struct device_node *np,
 					      const char *supply);
 struct regulator_init_data *regulator_of_get_init_data(struct device *dev,
 			         const struct regulator_desc *desc,
@@ -82,6 +83,7 @@ bool of_check_coupling_data(struct regulator_dev *rdev);
 
 #else
 static inline struct regulator_dev *of_regulator_dev_lookup(struct device *dev,
+							    struct device_node *np,
 							    const char *supply)
 {
 	return ERR_PTR(-ENODEV);
diff --git a/drivers/regulator/of_regulator.c b/drivers/regulator/of_regulator.c
index 3f490d81abc2..358c3ed791db 100644
--- a/drivers/regulator/of_regulator.c
+++ b/drivers/regulator/of_regulator.c
@@ -588,7 +588,8 @@ static struct device_node *of_get_child_regulator(struct device_node *parent,
 
 /**
  * of_get_regulator - get a regulator device node based on supply name
- * @dev: Device pointer for the consumer (of regulator) device
+ * @dev: Device pointer for dev_printk() messages
+ * @node: Device node pointer for supply property lookup
  * @supply: regulator supply name
  *
  * Extract the regulator device node corresponding to the supply name.
@@ -596,15 +597,16 @@ static struct device_node *of_get_child_regulator(struct device_node *parent,
  * Return: Pointer to the &struct device_node corresponding to the regulator
  *	   if found, or %NULL if not found.
  */
-static struct device_node *of_get_regulator(struct device *dev, const char *supply)
+static struct device_node *of_get_regulator(struct device *dev, struct device_node *node,
+					    const char *supply)
 {
 	struct device_node *regnode = NULL;
 	char prop_name[64]; /* 64 is max size of property name */
 
-	dev_dbg(dev, "Looking up %s-supply from device tree\n", supply);
+	dev_dbg(dev, "Looking up %s-supply from device node %pOF\n", supply, node);
 
 	snprintf(prop_name, 64, "%s-supply", supply);
-	regnode = of_parse_phandle(dev->of_node, prop_name, 0);
+	regnode = of_parse_phandle(node, prop_name, 0);
 	if (regnode)
 		return regnode;
 
@@ -628,6 +630,7 @@ static struct regulator_dev *of_find_regulator_by_node(struct device_node *np)
 /**
  * of_regulator_dev_lookup - lookup a regulator device with device tree only
  * @dev: Device pointer for regulator supply lookup.
+ * @np: Device node pointer for regulator supply lookup.
  * @supply: Supply name or regulator ID.
  *
  * Return: Pointer to the &struct regulator_dev on success, or ERR_PTR()
@@ -642,13 +645,13 @@ static struct regulator_dev *of_find_regulator_by_node(struct device_node *np)
  * * -%ENODEV if lookup fails permanently.
  * * -%EPROBE_DEFER if lookup could succeed in the future.
  */
-struct regulator_dev *of_regulator_dev_lookup(struct device *dev,
+struct regulator_dev *of_regulator_dev_lookup(struct device *dev, struct device_node *np,
 					      const char *supply)
 {
 	struct regulator_dev *r;
 	struct device_node *node;
 
-	node = of_get_regulator(dev, supply);
+	node = of_get_regulator(dev, np, supply);
 	if (node) {
 		r = of_find_regulator_by_node(node);
 		of_node_put(node);
@@ -665,6 +668,42 @@ struct regulator_dev *of_regulator_dev_lookup(struct device *dev,
 	return ERR_PTR(-ENODEV);
 }
 
+static struct regulator *_of_regulator_get(struct device *dev, struct device_node *node,
+					   const char *id, enum regulator_get_type get_type)
+{
+	struct regulator_dev *r;
+	int ret;
+
+	ret = _regulator_get_common_check(dev, id, get_type);
+	if (ret)
+		return ERR_PTR(ret);
+
+	r = of_regulator_dev_lookup(dev, node, id);
+	return _regulator_get_common(r, dev, id, get_type);
+}
+
+/**
+ * of_regulator_get_optional - get optional regulator via device tree lookup
+ * @dev: device used for dev_printk() messages
+ * @node: device node for regulator "consumer"
+ * @id: Supply name
+ *
+ * Return: pointer to struct regulator corresponding to the regulator producer,
+ *	   or PTR_ERR() encoded error number.
+ *
+ * This is intended for use by consumers that want to get a regulator
+ * supply directly from a device node, and can and want to deal with
+ * absence of such supplies. This will _not_ consider supply aliases.
+ * See regulator_dev_lookup().
+ */
+struct regulator *of_regulator_get_optional(struct device *dev,
+					    struct device_node *node,
+					    const char *id)
+{
+	return _of_regulator_get(dev, node, id, OPTIONAL_GET);
+}
+EXPORT_SYMBOL_GPL(of_regulator_get_optional);
+
 /*
  * Returns number of regulators coupled with rdev.
  */
diff --git a/include/linux/regulator/consumer.h b/include/linux/regulator/consumer.h
index b9ce521910a0..d7325e27a1ce 100644
--- a/include/linux/regulator/consumer.h
+++ b/include/linux/regulator/consumer.h
@@ -168,6 +168,10 @@ int devm_regulator_get_enable_read_voltage(struct device *dev, const char *id);
 void regulator_put(struct regulator *regulator);
 void devm_regulator_put(struct regulator *regulator);
 
+struct regulator *__must_check of_regulator_get_optional(struct device *dev,
+							 struct device_node *node,
+							 const char *id);
+
 int regulator_register_supply_alias(struct device *dev, const char *id,
 				    struct device *alias_dev,
 				    const char *alias_id);
-- 
2.46.0.598.g6f2099f65c-goog



From wenst at chromium.org  Wed Sep 11 00:27:43 2024
From: wenst at chromium.org (Chen-Yu Tsai)
Date: Wed, 11 Sep 2024 15:27:43 +0800
Subject: [PATCH v7 05/10] i2c: core: Remove extra space in Makefile
In-Reply-To: <20240911072751.365361-1-wenst@chromium.org>
References: <20240911072751.365361-1-wenst@chromium.org>
Message-ID: <20240911072751.365361-6-wenst@chromium.org>

Some lines in the Makefile have a space before tabs. Remove those.

Reported-by: Andy Shevchenko <andriy.shevchenko at linux.intel.com>
Closes: https://lore.kernel.org/all/ZsdE0PxKnGRjzChl at smile.fi.intel.com/
Signed-off-by: Chen-Yu Tsai <wenst at chromium.org>
Reviewed-by: Andy Shevchenko <andriy.shevchenko at linux.intel.com>
---
Changes since v6:
- Collected Andy's Reviewed-by
Changes since v5:
- new patch
---
 drivers/i2c/Makefile | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/i2c/Makefile b/drivers/i2c/Makefile
index 3f71ce4711e3..f12d6b10a85e 100644
--- a/drivers/i2c/Makefile
+++ b/drivers/i2c/Makefile
@@ -5,10 +5,10 @@
 
 obj-$(CONFIG_I2C_BOARDINFO)	+= i2c-boardinfo.o
 obj-$(CONFIG_I2C)		+= i2c-core.o
-i2c-core-objs 			:= i2c-core-base.o i2c-core-smbus.o
+i2c-core-objs			:= i2c-core-base.o i2c-core-smbus.o
 i2c-core-$(CONFIG_ACPI)		+= i2c-core-acpi.o
-i2c-core-$(CONFIG_I2C_SLAVE) 	+= i2c-core-slave.o
-i2c-core-$(CONFIG_OF) 		+= i2c-core-of.o
+i2c-core-$(CONFIG_I2C_SLAVE)	+= i2c-core-slave.o
+i2c-core-$(CONFIG_OF)		+= i2c-core-of.o
 
 obj-$(CONFIG_I2C_SMBUS)		+= i2c-smbus.o
 obj-$(CONFIG_I2C_CHARDEV)	+= i2c-dev.o
-- 
2.46.0.598.g6f2099f65c-goog



From wenst at chromium.org  Wed Sep 11 00:27:44 2024
From: wenst at chromium.org (Chen-Yu Tsai)
Date: Wed, 11 Sep 2024 15:27:44 +0800
Subject: [PATCH v7 06/10] i2c: Introduce OF component probe function
In-Reply-To: <20240911072751.365361-1-wenst@chromium.org>
References: <20240911072751.365361-1-wenst@chromium.org>
Message-ID: <20240911072751.365361-7-wenst@chromium.org>

Some devices are designed and manufactured with some components having
multiple drop-in replacement options. These components are often
connected to the mainboard via ribbon cables, having the same signals
and pin assignments across all options. These may include the display
panel and touchscreen on laptops and tablets, and the trackpad on
laptops. Sometimes which component option is used in a particular device
can be detected by some firmware provided identifier, other times that
information is not available, and the kernel has to try to probe each
device.

This change attempts to make the "probe each device" case cleaner. The
current approach is to have all options added and enabled in the device
tree. The kernel would then bind each device and run each driver's probe
function. This works, but has been broken before due to the introduction
of asynchronous probing, causing multiple instances requesting "shared"
resources, such as pinmuxes, GPIO pins, interrupt lines, at the same
time, with only one instance succeeding. Work arounds for these include
moving the pinmux to the parent I2C controller, using GPIO hogs or
pinmux settings to keep the GPIO pins in some fixed configuration, and
requesting the interrupt line very late. Such configurations can be seen
on the MT8183 Krane Chromebook tablets, and the Qualcomm sc8280xp-based
Lenovo Thinkpad 13S.

Instead of this delicate dance between drivers and device tree quirks,
this change introduces a simple I2C component probe. function For a
given class of devices on the same I2C bus, it will go through all of
them, doing a simple I2C read transfer and see which one of them responds.
It will then enable the device that responds.

This requires some minor modifications in the existing device tree. The
status for all the device nodes for the component options must be set
to "failed-needs-probe". This makes it clear that some mechanism is
needed to enable one of them, and also prevents the prober and device
drivers running at the same time.

Signed-off-by: Chen-Yu Tsai <wenst at chromium.org>
---
Changes since v6:
- Correctly replaced for_each_child_of_node_scoped() with
  for_each_child_of_node_with_prefix()
- Added namespace for exported symbol
- Made the probe function a framework with hooks
- Split out a new header file
- Added MAINTAINERS entry
- Reworded kernel-doc
- Dropped usage of __free from i2c_of_probe_component() since error
  path cleanup is needed anyway

Changes since v5:
- Fixed indent in Makefile
- Split regulator and GPIO TODO items
- Reversed final conditional in i2c_of_probe_enable_node()

Changes since v4:
- Split code into helper functions
- Use scoped helpers and __free() to reduce error path

Changes since v3:
- Complete kernel-doc
- Return different error if I2C controller is disabled
- Expand comment to explain assumptions and constraints
- Split for-loop finding target node and operations on target node
- Add missing i2c_put_adapter()
- Move prober code to separate file

Rob also asked why there was a limitation of "exactly one touchscreen
will be enabled across the whole tree".

The use case this prober currently targets is a component on consumer
electronics (tablet or laptop) being swapped out due to cost or supply
reasons. Designs with multiple components of the same type are pretty
rare. The way the next patch is written also assumes this for efficiency
reasons.

Changes since v2:
- New patch split out from "of: Introduce hardware prober driver"
- Addressed Rob's comments
  - Move i2c prober to i2c subsystem
  - Use of_node_is_available() to check if node is enabled.
  - Use OF changeset API to update status property
- Addressed Andy's comments
  - Probe function now accepts "struct device *dev" instead to reduce
    line length and dereferences
  - Move "ret = 0" to just before for_each_child_of_node(i2c_node, node)
---
 MAINTAINERS                      |   8 ++
 drivers/i2c/Makefile             |   1 +
 drivers/i2c/i2c-core-of-prober.c | 195 +++++++++++++++++++++++++++++++
 include/linux/i2c-of-prober.h    |  73 ++++++++++++
 4 files changed, 277 insertions(+)
 create mode 100644 drivers/i2c/i2c-core-of-prober.c
 create mode 100644 include/linux/i2c-of-prober.h

diff --git a/MAINTAINERS b/MAINTAINERS
index 927f81c12543..d88646380786 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -10645,6 +10645,14 @@ S:	Maintained
 F:	Documentation/devicetree/bindings/i2c/marvell,mv64xxx-i2c.yaml
 F:	drivers/i2c/busses/i2c-mv64xxx.c
 
+I2C OF COMPONENT PROBER
+M:	Chen-Yu Tsai <wenst at chromium.org>
+L:	linux-i2c at vger.kernel.org
+L:	devicetree at vger.kernel.org
+S:	Maintained
+F:	drivers/i2c/i2c-core-of-prober.c
+F:	include/linux-i2c-of-prober.h
+
 I2C OVER PARALLEL PORT
 M:	Jean Delvare <jdelvare at suse.com>
 L:	linux-i2c at vger.kernel.org
diff --git a/drivers/i2c/Makefile b/drivers/i2c/Makefile
index f12d6b10a85e..c539cdc1e305 100644
--- a/drivers/i2c/Makefile
+++ b/drivers/i2c/Makefile
@@ -9,6 +9,7 @@ i2c-core-objs			:= i2c-core-base.o i2c-core-smbus.o
 i2c-core-$(CONFIG_ACPI)		+= i2c-core-acpi.o
 i2c-core-$(CONFIG_I2C_SLAVE)	+= i2c-core-slave.o
 i2c-core-$(CONFIG_OF)		+= i2c-core-of.o
+i2c-core-$(CONFIG_OF_DYNAMIC)	+= i2c-core-of-prober.o
 
 obj-$(CONFIG_I2C_SMBUS)		+= i2c-smbus.o
 obj-$(CONFIG_I2C_CHARDEV)	+= i2c-dev.o
diff --git a/drivers/i2c/i2c-core-of-prober.c b/drivers/i2c/i2c-core-of-prober.c
new file mode 100644
index 000000000000..62ff2f4b6177
--- /dev/null
+++ b/drivers/i2c/i2c-core-of-prober.c
@@ -0,0 +1,195 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Linux I2C core OF component prober code
+ *
+ * Copyright (C) 2024 Google LLC
+ */
+
+#include <linux/cleanup.h>
+#include <linux/device.h>
+#include <linux/dev_printk.h>
+#include <linux/err.h>
+#include <linux/i2c.h>
+#include <linux/i2c-of-prober.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/slab.h>
+
+/*
+ * Some devices, such as Google Hana Chromebooks, are produced by multiple
+ * vendors each using their preferred components. Such components are all
+ * in the device tree. Instead of having all of them enabled and having each
+ * driver separately try and probe its device while fighting over shared
+ * resources, they can be marked as "fail-needs-probe" and have a prober
+ * figure out which one is actually used beforehand.
+ *
+ * This prober assumes such drop-in parts are on the same I2C bus, have
+ * non-conflicting addresses, and can be directly probed by seeing which
+ * address responds.
+ *
+ * TODO:
+ * - Support handling common regulators.
+ * - Support handling common GPIOs.
+ * - Support I2C muxes
+ */
+
+static struct device_node *i2c_of_probe_get_i2c_node(struct device *dev, const char *type)
+{
+	struct device_node *node __free(device_node) = of_find_node_by_name(NULL, type);
+	if (!node)
+		return dev_err_ptr_probe(dev, -ENODEV, "Could not find %s device node\n", type);
+
+	struct device_node *i2c_node __free(device_node) = of_get_parent(node);
+	if (!of_node_name_eq(i2c_node, "i2c"))
+		return dev_err_ptr_probe(dev, -EINVAL, "%s device isn't on I2C bus\n", type);
+
+	if (!of_device_is_available(i2c_node))
+		return dev_err_ptr_probe(dev, -ENODEV, "I2C controller not available\n");
+
+	return no_free_ptr(i2c_node);
+}
+
+static int i2c_of_probe_enable_node(struct device *dev, struct device_node *node)
+{
+	int ret;
+
+	dev_info(dev, "Enabling %pOF\n", node);
+
+	struct of_changeset *ocs __free(kfree) = kzalloc(sizeof(*ocs), GFP_KERNEL);
+	if (!ocs)
+		return -ENOMEM;
+
+	of_changeset_init(ocs);
+	ret = of_changeset_update_prop_string(ocs, node, "status", "okay");
+	if (ret)
+		return ret;
+
+	ret = of_changeset_apply(ocs);
+	if (ret) {
+		/* ocs needs to be explicitly cleaned up before being freed. */
+		of_changeset_destroy(ocs);
+	} else {
+		/*
+		 * ocs is intentionally kept around as it needs to
+		 * exist as long as the change is applied.
+		 */
+		void *ptr __always_unused = no_free_ptr(ocs);
+	}
+
+	return ret;
+}
+
+static const struct i2c_of_probe_ops i2c_of_probe_dummy_ops;
+
+/**
+ * i2c_of_probe_component() - probe for devices of "type" on the same i2c bus
+ * @dev: Pointer to the &struct device of the caller, only used for dev_printk() messages.
+ * @cfg: Pointer to the &struct i2c_of_probe_cfg containing callbacks and other options
+ *       for the prober.
+ * @ctx: Context data for callbacks.
+ *
+ * Probe for possible I2C components of the same "type" (&i2c_of_probe_cfg->type)
+ * on the same I2C bus that have their status marked as "fail".
+ *
+ * Assumes that across the entire device tree the only instances of nodes
+ * prefixed with "type" are the ones that need handling for second source
+ * components. In other words, if "type" is "touchscreen", then all device
+ * nodes named "touchscreen*" are the ones that need probing. There cannot
+ * be another "touchscreen" node that is already enabled.
+ *
+ * Assumes that for each "type" of component, only one actually exists. In
+ * other words, only one matching and existing device will be enabled.
+ *
+ * Context: Process context only. Does non-atomic I2C transfers.
+ *          Should only be used from a driver probe function, as the function
+ *          can return -EPROBE_DEFER if the I2C adapter or other resources
+ *          are unavailable.
+ * Return: 0 on success or no-op, error code otherwise.
+ *         A no-op can happen when it seems like the device tree already
+ *         has components of the type to be probed already enabled. This
+ *         can happen when the device tree had not been updated to mark
+ *         the status of the to-be-probed components as "fail". Or this
+ *         function was already run with the same parameters and succeeded
+ *         in enabling a component. The latter could happen if the user
+ *         had multiple types of components to probe, and one of them down
+ *         the list caused a deferred probe. This is expected behavior.
+ */
+int i2c_of_probe_component(struct device *dev, const struct i2c_of_probe_cfg *cfg, void *ctx)
+{
+	const struct i2c_of_probe_ops *ops;
+	const char *type;
+	struct device_node *i2c_node;
+	struct i2c_adapter *i2c;
+	int ret;
+
+	if (!cfg)
+		return -EINVAL;
+
+	ops = cfg->ops ?: &i2c_of_probe_dummy_ops;
+	type = cfg->type;
+
+	i2c_node = i2c_of_probe_get_i2c_node(dev, type);
+	if (IS_ERR(i2c_node))
+		return PTR_ERR(i2c_node);
+
+	for_each_child_of_node_with_prefix(i2c_node, node, type) {
+		if (!of_device_is_available(node))
+			continue;
+
+		/*
+		 * Device tree has component already enabled. Either the
+		 * device tree isn't supported or we already probed once.
+		 */
+		ret = 0;
+		goto out_put_i2c_node;
+	}
+
+	i2c = of_get_i2c_adapter_by_node(i2c_node);
+	if (!i2c) {
+		ret = dev_err_probe(dev, -EPROBE_DEFER, "Couldn't get I2C adapter\n");
+		goto out_put_i2c_node;
+	}
+
+	/* Grab resources */
+	ret = 0;
+	if (ops->get_resources)
+		ret = ops->get_resources(dev, i2c_node, ctx);
+	if (ret)
+		goto out_put_i2c_adapter;
+
+	/* Enable resources */
+	if (ops->enable)
+		ret = ops->enable(dev, ctx);
+	if (ret)
+		goto out_release_resources;
+
+	ret = 0;
+	for_each_child_of_node_with_prefix(i2c_node, node, type) {
+		union i2c_smbus_data data;
+		u32 addr;
+
+		if (of_property_read_u32(node, "reg", &addr))
+			continue;
+		if (i2c_smbus_xfer(i2c, addr, 0, I2C_SMBUS_READ, 0, I2C_SMBUS_BYTE, &data) < 0)
+			continue;
+
+		/* Found a device that is responding */
+		if (ops->free_resources_early)
+			ops->free_resources_early(ctx);
+		ret = i2c_of_probe_enable_node(dev, node);
+		break;
+	}
+
+	if (ops->cleanup)
+		ops->cleanup(dev, ctx);
+out_release_resources:
+	if (ops->free_resources_late)
+		ops->free_resources_late(ctx);
+out_put_i2c_adapter:
+	i2c_put_adapter(i2c);
+out_put_i2c_node:
+	of_node_put(i2c_node);
+
+	return ret;
+}
+EXPORT_SYMBOL_NS_GPL(i2c_of_probe_component, I2C_OF_PROBER);
diff --git a/include/linux/i2c-of-prober.h b/include/linux/i2c-of-prober.h
new file mode 100644
index 000000000000..0f94e7c94310
--- /dev/null
+++ b/include/linux/i2c-of-prober.h
@@ -0,0 +1,73 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/*
+ * i2c-of-prober.h - definitions for the Linux I2C OF component prober
+ *
+ * Copyright (C) 2024 Google LLC
+ */
+
+#ifndef _LINUX_I2C_OF_PROBER_H
+#define _LINUX_I2C_OF_PROBER_H
+
+#if IS_ENABLED(CONFIG_OF_DYNAMIC)
+
+struct device;
+struct device_node;
+
+/**
+ * struct i2c_of_probe_ops - I2C OF component prober callbacks
+ *
+ * A set of callbacks to be used by i2c_of_probe_component().
+ *
+ * All callbacks are optional. Callbacks are called only once per run, and are
+ * used in the order they are defined in this structure.
+ *
+ * All callbacks that have return values shall return %0 on success,
+ * or a negative error number on failure.
+ *
+ * The @dev parameter passed to the callbacks is the same as @dev passed to
+ * i2c_of_probe_component(). It should only be used for dev_printk() calls
+ * and nothing else, especially not managed device resource (devres) APIs.
+ */
+struct i2c_of_probe_ops {
+	/** @get_resources: Retrieve resources for components. */
+	int (*get_resources)(struct device *dev, struct device_node *bus_node, void *data);
+
+	/** @free_resources_early: Release exclusive resources prior to enabling component. */
+	void (*free_resources_early)(void *data);
+
+	/**
+	 * @enable: Enable resources so that the components respond to probes.
+	 *
+	 * Resources should be reverted to their initial state before returning if this fails.
+	 */
+	int (*enable)(struct device *dev, void *data);
+
+	/**
+	 * @cleanup: Opposite of @enable to balance refcounts after probing.
+	 *
+	 * Can not operate on resources already freed in @free_resources_early.
+	 */
+	int (*cleanup)(struct device *dev, void *data);
+
+	/**
+	 * @free_resources_late: Release all resources, including those that would have
+	 *                       been released by @free_resources_early.
+	 */
+	void (*free_resources_late)(void *data);
+};
+
+/**
+ * struct i2c_of_probe_cfg - I2C OF component prober configuration
+ * @ops: Callbacks for the prober to use.
+ * @type: A string to match the device node name prefix to probe for.
+ */
+struct i2c_of_probe_cfg {
+	const struct i2c_of_probe_ops *ops;
+	const char *type;
+};
+
+int i2c_of_probe_component(struct device *dev, const struct i2c_of_probe_cfg *cfg, void *ctx);
+
+#endif /* IS_ENABLED(CONFIG_OF_DYNAMIC) */
+
+#endif /* _LINUX_I2C_OF_PROBER_H */
-- 
2.46.0.598.g6f2099f65c-goog



From wenst at chromium.org  Wed Sep 11 00:27:45 2024
From: wenst at chromium.org (Chen-Yu Tsai)
Date: Wed, 11 Sep 2024 15:27:45 +0800
Subject: [PATCH v7 07/10] i2c: of-prober: Add simple helpers for regulator support
In-Reply-To: <20240911072751.365361-1-wenst@chromium.org>
References: <20240911072751.365361-1-wenst@chromium.org>
Message-ID: <20240911072751.365361-8-wenst@chromium.org>

Add helpers to do regulator management for the I2C OF component prober.
Components that the prober intends to probe likely require their
regulator supplies be enabled, and GPIOs be toggled to enable them or
bring them out of reset before they will respond to probe attempts.
GPIOs will be handled in the next patch.

The assumption is that the same class of components to be probed are
always connected in the same fashion with the same regulator supply
and GPIO. The names may vary due to binding differences, but the
physical layout does not change.

This set of helpers supports at most one regulator supply. The user
must specify the node from which the supply is retrieved. The supply
name and the amount of time to wait after the supply is enabled are
also given by the user.

Signed-off-by: Chen-Yu Tsai <wenst at chromium.org>
---
Changes since v6:
- Moved change of of_get_next_child_scoped() to
  of_get_next_child_with_prefix() to previous patch
- Restructured into helpers for the I2C OF component prober
- Reduced to only handle one regulator
- Commit message updated

Changes since v5:
- Split of_regulator_bulk_get_all() return value check and explain
  "ret == 0" case
- Switched to of_get_next_child_with_prefix_scoped() where applicable
- Used krealloc_array() instead of directly calculating size
- copy whole regulator array in one memcpy() call
- Drop "0" from struct zeroing initializer
- Split out regulator helper from i2c_of_probe_enable_res() to keep
  code cleaner when combined with the next patch
- Added options for customizing power sequencing delay
- Rename i2c_of_probe_get_regulator() to i2c_of_probe_get_regulators()
- Add i2c_of_probe_free_regulator() helper

Changes since v4:
- Split out GPIO handling to separate patch
- Rewrote using of_regulator_bulk_get_all()
- Replaced "regulators" with "regulator supplies" in debug messages

Changes since v3:
- New patch

This change is kept as a separate patch for now since the changes are
quite numerous.
---
 drivers/i2c/i2c-core-of-prober.c | 169 ++++++++++++++++++++++++++++++-
 include/linux/i2c-of-prober.h    |  48 +++++++++
 2 files changed, 216 insertions(+), 1 deletion(-)

diff --git a/drivers/i2c/i2c-core-of-prober.c b/drivers/i2c/i2c-core-of-prober.c
index 62ff2f4b6177..1371ea565556 100644
--- a/drivers/i2c/i2c-core-of-prober.c
+++ b/drivers/i2c/i2c-core-of-prober.c
@@ -6,6 +6,7 @@
  */
 
 #include <linux/cleanup.h>
+#include <linux/delay.h>
 #include <linux/device.h>
 #include <linux/dev_printk.h>
 #include <linux/err.h>
@@ -13,6 +14,7 @@
 #include <linux/i2c-of-prober.h>
 #include <linux/module.h>
 #include <linux/of.h>
+#include <linux/regulator/consumer.h>
 #include <linux/slab.h>
 
 /*
@@ -28,7 +30,6 @@
  * address responds.
  *
  * TODO:
- * - Support handling common regulators.
  * - Support handling common GPIOs.
  * - Support I2C muxes
  */
@@ -193,3 +194,169 @@ int i2c_of_probe_component(struct device *dev, const struct i2c_of_probe_cfg *cf
 	return ret;
 }
 EXPORT_SYMBOL_NS_GPL(i2c_of_probe_component, I2C_OF_PROBER);
+
+static int i2c_of_probe_simple_get_supply(struct device *dev, struct device_node *node,
+					  struct i2c_of_probe_simple_ctx *ctx)
+{
+	const char *supply_name;
+	struct regulator *supply;
+
+	/*
+	 * It's entirely possible for the component's device node to not have regulator
+	 * supplies. While it does not make sense from a hardware perspective, the
+	 * supplies could be always on or otherwise not modeled in the device tree, but
+	 * the device would still work.
+	 */
+	supply_name = ctx->opts->supply_name;
+	if (!supply_name)
+		return 0;
+
+	supply = of_regulator_get_optional(dev, node, supply_name);
+	if (IS_ERR(supply)) {
+		return dev_err_probe(dev, PTR_ERR(supply),
+				     "Failed to get regulator supply \"%s\" from %pOF\n",
+				     supply_name, node);
+	}
+
+	ctx->supply = supply;
+
+	return 0;
+}
+
+static void i2c_of_probe_simple_put_supply(struct i2c_of_probe_simple_ctx *ctx)
+{
+	regulator_put(ctx->supply);
+	ctx->supply = NULL;
+}
+
+static int i2c_of_probe_simple_enable_regulator(struct device *dev, struct i2c_of_probe_simple_ctx *ctx)
+{
+	int ret;
+
+	if (!ctx->supply)
+		return 0;
+
+	dev_dbg(dev, "Enabling regulator supply \"%s\"\n", ctx->opts->supply_name);
+
+	ret = regulator_enable(ctx->supply);
+	if (ret)
+		return ret;
+
+	msleep(ctx->opts->post_power_on_delay_ms);
+
+	return 0;
+}
+
+static void i2c_of_probe_simple_disable_regulator(struct device *dev, struct i2c_of_probe_simple_ctx *ctx)
+{
+	if (!ctx->supply)
+		return;
+
+	dev_dbg(dev, "Disabling regulator supply \"%s\"\n", ctx->opts->supply_name);
+
+	regulator_disable(ctx->supply);
+}
+
+/**
+ * i2c_of_probe_simple_get_res - Simple helper for I2C OF prober to get resources
+ * @dev: Pointer to the &struct device of the caller, only used for dev_printk() messages
+ * @bus_node: Pointer to the &struct device_node of the I2C adapter.
+ * @data: Pointer to &struct i2c_of_probe_simple_ctx helper context.
+ *
+ * If &i2c_of_probe_simple_opts->supply_name is given, request the named regulator supply.
+ *
+ * Return: %0 on success or no-op, or a negative error number on failure.
+ */
+int i2c_of_probe_simple_get_res(struct device *dev, struct device_node *bus_node, void *data)
+{
+	struct i2c_of_probe_simple_ctx *ctx = data;
+	struct device_node *node;
+	const char *compat;
+	int ret;
+
+	dev_dbg(dev, "Requesting resources for components under I2C bus %pOF\n", bus_node);
+
+	if (!ctx || !ctx->opts)
+		return -EINVAL;
+
+	compat = ctx->opts->res_node_compatible;
+	if (!compat)
+		return -EINVAL;
+
+	node = of_get_compatible_child(bus_node, compat);
+	if (!node)
+		return dev_err_probe(dev, -ENODEV, "No device compatible with \"%s\" found\n",
+				     compat);
+
+	ret = i2c_of_probe_simple_get_supply(dev, node, ctx);
+	if (ret)
+		goto out_put_node;
+
+	return 0;
+
+out_put_node:
+	of_node_put(node);
+	return ret;
+}
+EXPORT_SYMBOL_NS_GPL(i2c_of_probe_simple_get_res, I2C_OF_PROBER);
+
+/**
+ * i2c_of_probe_simple_free_res_late - Simple helper for I2C OF prober to release all resources.
+ * @data: Pointer to &struct i2c_of_probe_simple_ctx helper context.
+ */
+void i2c_of_probe_simple_free_res_late(void *data)
+{
+	struct i2c_of_probe_simple_ctx *ctx = data;
+
+	i2c_of_probe_simple_put_supply(ctx);
+}
+EXPORT_SYMBOL_NS_GPL(i2c_of_probe_simple_free_res_late, I2C_OF_PROBER);
+
+/**
+ * i2c_of_probe_simple_enable - Enable resources for I2C OF prober simple helpers
+ * @dev: Pointer to the &struct device of the caller, only used for dev_printk() messages
+ * @data: Pointer to &struct i2c_of_probe_simple_ctx helper context.
+ *
+ * If a regulator supply was found, enable that regulator.
+ *
+ * Return: %0 on success or no-op, or a negative error number on failure.
+ */
+int i2c_of_probe_simple_enable(struct device *dev, void *data)
+{
+	struct i2c_of_probe_simple_ctx *ctx = data;
+	int ret;
+
+	ret = i2c_of_probe_simple_enable_regulator(dev, ctx);
+	if (ret)
+		return ret;
+
+	return 0;
+}
+EXPORT_SYMBOL_NS_GPL(i2c_of_probe_simple_enable, I2C_OF_PROBER);
+
+/**
+ * i2c_of_probe_simple_cleanup - Clean up resources for I2C OF prober simple helpers
+ * @dev: Pointer to the &struct device of the caller, only used for dev_printk() messages
+ * @data: Pointer to &struct i2c_of_probe_simple_ctx helper context.
+ *
+ * If a regulator supply was found, disable that regulator.
+ *
+ * Return: %0 on success or no-op, or a negative error number on failure.
+ */
+int i2c_of_probe_simple_cleanup(struct device *dev, void *data)
+{
+	struct i2c_of_probe_simple_ctx *ctx = data;
+
+	i2c_of_probe_simple_disable_regulator(dev, ctx);
+
+	return 0;
+}
+EXPORT_SYMBOL_NS_GPL(i2c_of_probe_simple_cleanup, I2C_OF_PROBER);
+
+struct i2c_of_probe_ops i2c_of_probe_simple_ops = {
+	.get_resources = i2c_of_probe_simple_get_res,
+	.enable = i2c_of_probe_simple_enable,
+	.cleanup = i2c_of_probe_simple_cleanup,
+	.free_resources_late = i2c_of_probe_simple_free_res_late,
+};
+EXPORT_SYMBOL_NS_GPL(i2c_of_probe_simple_ops, I2C_OF_PROBER);
diff --git a/include/linux/i2c-of-prober.h b/include/linux/i2c-of-prober.h
index 0f94e7c94310..541451fbf58d 100644
--- a/include/linux/i2c-of-prober.h
+++ b/include/linux/i2c-of-prober.h
@@ -68,6 +68,54 @@ struct i2c_of_probe_cfg {
 
 int i2c_of_probe_component(struct device *dev, const struct i2c_of_probe_cfg *cfg, void *ctx);
 
+/**
+ * DOC: I2C OF component prober simple helpers
+ *
+ * Components such as trackpads are commonly connected to a devices baseboard
+ * with a 6-pin ribbon cable. That gives at most one voltage supply and one
+ * GPIO besides the I2C bus, interrupt pin, and common ground. Touchscreens,
+ * while integrated into the display panel's connection, typically have the
+ * same set of connections.
+ *
+ * A simple set of helpers are provided here for use with the I2C OF component
+ * prober. This implementation targets such components, allowing for at most
+ * one regulator supply.
+ *
+ * The following helpers are provided:
+ * * i2c_of_probe_simple_get_res()
+ * * i2c_of_probe_simple_free_res_late()
+ * * i2c_of_probe_simple_enable()
+ * * i2c_of_probe_simple_cleanup()
+ */
+
+/**
+ * struct i2c_of_probe_simple_opts - Options for simple I2C component prober callbacks
+ * @res_node_compatible: Compatible string of device node to retrieve resources from.
+ * @supply_name: Name of regulator supply.
+ * @post_power_on_delay_ms: Delay in ms after regulators are powered on. Passed to msleep().
+ */
+struct i2c_of_probe_simple_opts {
+	const char *res_node_compatible;
+	const char *supply_name;
+	unsigned int post_power_on_delay_ms;
+};
+
+struct regulator;
+
+struct i2c_of_probe_simple_ctx {
+	/* public: provided by user before helpers are used. */
+	const struct i2c_of_probe_simple_opts *opts;
+	/* private: internal fields for helpers. */
+	struct regulator *supply;
+};
+
+int i2c_of_probe_simple_get_res(struct device *dev, struct device_node *bus_node, void *data);
+void i2c_of_probe_simple_free_res_late(void *data);
+int i2c_of_probe_simple_enable(struct device *dev, void *data);
+int i2c_of_probe_simple_cleanup(struct device *dev, void *data);
+
+extern struct i2c_of_probe_ops i2c_of_probe_simple_ops;
+
 #endif /* IS_ENABLED(CONFIG_OF_DYNAMIC) */
 
 #endif /* _LINUX_I2C_OF_PROBER_H */
-- 
2.46.0.598.g6f2099f65c-goog



From wenst at chromium.org  Wed Sep 11 00:27:46 2024
From: wenst at chromium.org (Chen-Yu Tsai)
Date: Wed, 11 Sep 2024 15:27:46 +0800
Subject: [PATCH v7 08/10] i2c: of-prober: Add GPIO support to simple helpers
In-Reply-To: <20240911072751.365361-1-wenst@chromium.org>
References: <20240911072751.365361-1-wenst@chromium.org>
Message-ID: <20240911072751.365361-9-wenst@chromium.org>

Add GPIO support to the simple helpers for the I2C OF component prober.
Components that the prober intends to probe likely require their
regulator supplies be enabled, and GPIOs be toggled to enable them or
bring them out of reset before they will respond to probe attempts.
Regulator supplies were handled in the previous patch.

The assumption is that the same class of components to be probed are
always connected in the same fashion with the same regulator supply
and GPIO. The names may vary due to binding differences, but the
physical layout does not change.

This supports at most one GPIO pin. The user must specify the GPIO name,
the polarity, and the amount of time to wait after the GPIO is toggled.
Devices with more than one GPIO pin likely require specific power
sequencing beyond what generic code can easily support.

Signed-off-by: Chen-Yu Tsai <wenst at chromium.org>

---
Changes since v6:
- Restructured into helpers for the I2C OF component prober
- Reduced to only handle one GPIO
- Set GPIO to input on (failure) cleanup
- Updated commit message

Changes since v5:
- Renamed "con" to "propname" in i2c_of_probe_get_gpiod()
- Copy string first and check return value of strscpy() for overflow in
  i2c_of_probe_get_gpiod()
- Add parenthesis around "enable" and "reset" GPIO names in comments
- Split resource count debug message into two separate lines
- Split out GPIO helper from i2c_of_probe_enable_res() to keep code
  cleaner following the previous patch
- Adopted options for customizing power sequencing delay following
  previous patch

Changes since v4:
- Split out from previous patch
- Moved GPIO property name check to common function in gpiolib.c in new
  patch
- Moved i2c_of_probe_free_gpios() into for_each_child_of_node_scoped()
- Rewrote in gpiod_*_array-esque fashion
---
 drivers/i2c/i2c-core-of-prober.c | 95 +++++++++++++++++++++++++++++++-
 include/linux/i2c-of-prober.h    | 10 ++++
 2 files changed, 104 insertions(+), 1 deletion(-)

diff --git a/drivers/i2c/i2c-core-of-prober.c b/drivers/i2c/i2c-core-of-prober.c
index 1371ea565556..6794ec749882 100644
--- a/drivers/i2c/i2c-core-of-prober.c
+++ b/drivers/i2c/i2c-core-of-prober.c
@@ -10,6 +10,7 @@
 #include <linux/device.h>
 #include <linux/dev_printk.h>
 #include <linux/err.h>
+#include <linux/gpio/consumer.h>
 #include <linux/i2c.h>
 #include <linux/i2c-of-prober.h>
 #include <linux/module.h>
@@ -30,7 +31,6 @@
  * address responds.
  *
  * TODO:
- * - Support handling common GPIOs.
  * - Support I2C muxes
  */
 
@@ -257,6 +257,64 @@ static void i2c_of_probe_simple_disable_regulator(struct device *dev, struct i2c
 	regulator_disable(ctx->supply);
 }
 
+static int i2c_of_probe_simple_get_gpiod(struct device *dev, struct device_node *node,
+					 struct i2c_of_probe_simple_ctx *ctx)
+{
+	struct fwnode_handle *fwnode = of_fwnode_handle(node);
+	struct gpio_desc *gpiod;
+	const char *con_id = NULL;
+
+	/* NULL signals no GPIO needed */
+	if (!ctx->opts->gpio_name)
+		return 0;
+
+	/* An empty string signals an unnamed GPIO */
+	if (strlen(ctx->opts->gpio_name))
+		con_id = ctx->opts->gpio_name;
+
+	gpiod = fwnode_gpiod_get_index(fwnode, con_id, 0, GPIOD_ASIS, "i2c-of-prober");
+	if (IS_ERR(gpiod))
+		return PTR_ERR(gpiod);
+
+	ctx->gpiod = gpiod;
+
+	return 0;
+}
+
+static void i2c_of_probe_simple_put_gpiod(struct i2c_of_probe_simple_ctx *ctx)
+{
+	gpiod_put(ctx->gpiod);
+	ctx->gpiod = NULL;
+}
+
+static int i2c_of_probe_simple_set_gpio(struct device *dev, struct i2c_of_probe_simple_ctx *ctx)
+{
+	int ret;
+
+	if (!ctx->gpiod)
+		return 0;
+
+	dev_dbg(dev, "Setting GPIO\n");
+
+	ret = gpiod_direction_output_raw(ctx->gpiod, ctx->opts->gpio_high_to_enable ? 1 : 0);
+	if (ret)
+		return ret;
+
+	msleep(ctx->opts->post_reset_deassert_delay_ms);
+
+	return 0;
+}
+
+static void i2c_of_probe_simple_disable_gpio(struct device *dev, struct i2c_of_probe_simple_ctx *ctx)
+{
+	if (!ctx->gpiod)
+		return;
+
+	dev_dbg(dev, "Setting GPIO to input\n");
+
+	gpiod_direction_input(ctx->gpiod);
+}
+
 /**
  * i2c_of_probe_simple_get_res - Simple helper for I2C OF prober to get resources
  * @dev: Pointer to the &struct device of the caller, only used for dev_printk() messages
@@ -264,6 +322,8 @@ static void i2c_of_probe_simple_disable_regulator(struct device *dev, struct i2c
  * @data: Pointer to &struct i2c_of_probe_simple_ctx helper context.
  *
  * If &i2c_of_probe_simple_opts->supply_name is given, request the named regulator supply.
+ * If &i2c_of_probe_simple_opts->gpio_name is given, request the named GPIO. Or if it is
+ * the empty string, request the unnamed GPIO.
  *
  * Return: %0 on success or no-op, or a negative error number on failure.
  */
@@ -292,14 +352,36 @@ int i2c_of_probe_simple_get_res(struct device *dev, struct device_node *bus_node
 	if (ret)
 		goto out_put_node;
 
+	ret = i2c_of_probe_simple_get_gpiod(dev, node, ctx);
+	if (ret)
+		goto out_put_supply;
+
 	return 0;
 
+out_put_supply:
+	i2c_of_probe_simple_put_supply(ctx);
 out_put_node:
 	of_node_put(node);
 	return ret;
 }
 EXPORT_SYMBOL_NS_GPL(i2c_of_probe_simple_get_res, I2C_OF_PROBER);
 
+/**
+ * i2c_of_probe_simple_free_res_early - \
+ *	Simple helper for I2C OF prober to release GPIOs before component is enabled
+ * @data: Pointer to &struct i2c_of_probe_simple_ctx helper context.
+ *
+ * GPIO descriptors are exclusive and have to be released before the
+ * actual driver probes so that the latter can acquire them.
+ */
+void i2c_of_probe_simple_free_res_early(void *data)
+{
+	struct i2c_of_probe_simple_ctx *ctx = data;
+
+	i2c_of_probe_simple_put_gpiod(ctx);
+}
+EXPORT_SYMBOL_NS_GPL(i2c_of_probe_simple_free_res_early, I2C_OF_PROBER);
+
 /**
  * i2c_of_probe_simple_free_res_late - Simple helper for I2C OF prober to release all resources.
  * @data: Pointer to &struct i2c_of_probe_simple_ctx helper context.
@@ -308,6 +390,7 @@ void i2c_of_probe_simple_free_res_late(void *data)
 {
 	struct i2c_of_probe_simple_ctx *ctx = data;
 
+	i2c_of_probe_simple_put_gpiod(ctx);
 	i2c_of_probe_simple_put_supply(ctx);
 }
 EXPORT_SYMBOL_NS_GPL(i2c_of_probe_simple_free_res_late, I2C_OF_PROBER);
@@ -330,7 +413,15 @@ int i2c_of_probe_simple_enable(struct device *dev, void *data)
 	if (ret)
 		return ret;
 
+	ret = i2c_of_probe_simple_set_gpio(dev, ctx);
+	if (ret)
+		goto err;
+
 	return 0;
+
+err:
+	i2c_of_probe_simple_disable_regulator(dev, ctx);
+	return ret;
 }
 EXPORT_SYMBOL_NS_GPL(i2c_of_probe_simple_enable, I2C_OF_PROBER);
 
@@ -347,6 +438,7 @@ int i2c_of_probe_simple_cleanup(struct device *dev, void *data)
 {
 	struct i2c_of_probe_simple_ctx *ctx = data;
 
+	i2c_of_probe_simple_disable_gpio(dev, ctx);
 	i2c_of_probe_simple_disable_regulator(dev, ctx);
 
 	return 0;
@@ -355,6 +447,7 @@ EXPORT_SYMBOL_NS_GPL(i2c_of_probe_simple_cleanup, I2C_OF_PROBER);
 
 struct i2c_of_probe_ops i2c_of_probe_simple_ops = {
 	.get_resources = i2c_of_probe_simple_get_res,
+	.free_resources_early = i2c_of_probe_simple_free_res_early,
 	.enable = i2c_of_probe_simple_enable,
 	.cleanup = i2c_of_probe_simple_cleanup,
 	.free_resources_late = i2c_of_probe_simple_free_res_late,
diff --git a/include/linux/i2c-of-prober.h b/include/linux/i2c-of-prober.h
index 541451fbf58d..c5e241163c94 100644
--- a/include/linux/i2c-of-prober.h
+++ b/include/linux/i2c-of-prober.h
@@ -83,6 +83,7 @@ int i2c_of_probe_component(struct device *dev, const struct i2c_of_probe_cfg *cf
  *
  * The following helpers are provided:
  * * i2c_of_probe_simple_get_res()
+ * * i2c_of_probe_simple_free_res_early()
  * * i2c_of_probe_simple_free_res_late()
  * * i2c_of_probe_simple_enable()
  * * i2c_of_probe_simple_cleanup()
@@ -92,24 +93,33 @@ int i2c_of_probe_component(struct device *dev, const struct i2c_of_probe_cfg *cf
  * struct i2c_of_probe_simple_opts - Options for simple I2C component prober callbacks
  * @res_node_compatible: Compatible string of device node to retrieve resources from.
  * @supply_name: Name of regulator supply.
+ * @gpio_name: Name of GPIO.
  * @post_power_on_delay_ms: Delay in ms after regulators are powered on. Passed to msleep().
+ * @post_reset_deassert_delay_ms: Delay in ms after GPIOs are set. Passed to msleep().
+ * @gpio_high_to_enable: %true if GPIO should be set to electrical high to enable component.
  */
 struct i2c_of_probe_simple_opts {
 	const char *res_node_compatible;
 	const char *supply_name;
+	const char *gpio_name;
 	unsigned int post_power_on_delay_ms;
+	unsigned int post_reset_deassert_delay_ms;
+	bool gpio_high_to_enable;
 };
 
 struct regulator;
+struct gpio_desc;
 
 struct i2c_of_probe_simple_ctx {
 	/* public: provided by user before helpers are used. */
 	const struct i2c_of_probe_simple_opts *opts;
 	/* private: internal fields for helpers. */
 	struct regulator *supply;
+	struct gpio_desc *gpiod;
 };
 
 int i2c_of_probe_simple_get_res(struct device *dev, struct device_node *bus_node, void *data);
+void i2c_of_probe_simple_free_res_early(void *data);
 void i2c_of_probe_simple_free_res_late(void *data);
 int i2c_of_probe_simple_enable(struct device *dev, void *data);
 int i2c_of_probe_simple_cleanup(struct device *dev, void *data);
-- 
2.46.0.598.g6f2099f65c-goog



From wenst at chromium.org  Wed Sep 11 00:27:47 2024
From: wenst at chromium.org (Chen-Yu Tsai)
Date: Wed, 11 Sep 2024 15:27:47 +0800
Subject: [PATCH v7 09/10] platform/chrome: Introduce device tree hardware prober
In-Reply-To: <20240911072751.365361-1-wenst@chromium.org>
References: <20240911072751.365361-1-wenst@chromium.org>
Message-ID: <20240911072751.365361-10-wenst@chromium.org>

Some devices are designed and manufactured with some components having
multiple drop-in replacement options. These components are often
connected to the mainboard via ribbon cables, having the same signals
and pin assignments across all options. These may include the display
panel and touchscreen on laptops and tablets, and the trackpad on
laptops. Sometimes which component option is used in a particular device
can be detected by some firmware provided identifier, other times that
information is not available, and the kernel has to try to probe each
device.

This change attempts to make the "probe each device" case cleaner. The
current approach is to have all options added and enabled in the device
tree. The kernel would then bind each device and run each driver's probe
function. This works, but has been broken before due to the introduction
of asynchronous probing, causing multiple instances requesting "shared"
resources, such as pinmuxes, GPIO pins, interrupt lines, at the same
time, with only one instance succeeding. Work arounds for these include
moving the pinmux to the parent I2C controller, using GPIO hogs or
pinmux settings to keep the GPIO pins in some fixed configuration, and
requesting the interrupt line very late. Such configurations can be seen
on the MT8183 Krane Chromebook tablets, and the Qualcomm sc8280xp-based
Lenovo Thinkpad 13S.

Instead of this delicate dance between drivers and device tree quirks,
this change introduces a simple I2C component prober. For any given
class of devices on the same I2C bus, it will go through all of them,
doing a simple I2C read transfer and see which one of them responds.
It will then enable the device that responds.

This requires some minor modifications in the existing device tree.
The status for all the device nodes for the component options must be
set to "failed-needs-probe". This makes it clear that some mechanism is
needed to enable one of them, and also prevents the prober and device
drivers running at the same time.

Signed-off-by: Chen-Yu Tsai <wenst at chromium.org>
Acked-by: Tzung-Bi Shih <tzungbi at kernel.org>
---
Changes since v6:
- Adapted to new I2C OF prober interface
- Collected Acked-by

Changes since v5:
- Adapt to new i2c_of_probe_component() parameters

Changes since v4:
- Fix Kconfig dependency
- Update copyright year
- Drop "linux/of.h" header
- Include "linux/errno.h"
- Move |int ret| declaration to top of block
- Return -ENODEV on no match instead of 0
- Unregister platform driver and device unconditionally after previous
  change

Changes since v3:
- Include linux/init.h
- Rewrite for loop in driver probe function as suggested by Andy
- Make prober driver buildable as module
- Ignore prober errors other than probe deferral

Changes since v2:
- Addressed Rob's comments
  - Move remaining driver code to drivers/platform/chrome/
  - Depend on rather than select CONFIG_I2C
  - Copy machine check to driver init function
- Addressed Andy's comments
  - Explicitly mention "device tree" or OF in driver name, description
    and Kconfig symbol
  - Drop filename from inside the file
  - Switch to passing "struct device *" to shorten lines
  - Move "ret = 0" to just before for_each_child_of_node(i2c_node, node)
  - Make loop variable size_t (instead of unsigned int as Andy asked)
  - Use PLATFORM_DEVID_NONE instead of raw -1
  - Use standard goto error path pattern in hw_prober_driver_init()

- Changes since v1:
  - New patch
---
 drivers/platform/chrome/Kconfig               |  11 ++
 drivers/platform/chrome/Makefile              |   1 +
 .../platform/chrome/chromeos_of_hw_prober.c   | 125 ++++++++++++++++++
 3 files changed, 137 insertions(+)
 create mode 100644 drivers/platform/chrome/chromeos_of_hw_prober.c

diff --git a/drivers/platform/chrome/Kconfig b/drivers/platform/chrome/Kconfig
index 7dbeb786352a..b7dbaf77b6db 100644
--- a/drivers/platform/chrome/Kconfig
+++ b/drivers/platform/chrome/Kconfig
@@ -61,6 +61,17 @@ config CHROMEOS_TBMC
 	  To compile this driver as a module, choose M here: the
 	  module will be called chromeos_tbmc.
 
+config CHROMEOS_OF_HW_PROBER
+	tristate "ChromeOS Device Tree Hardware Prober"
+	depends on OF
+	depends on I2C
+	select OF_DYNAMIC
+	default OF
+	help
+	  This option enables the device tree hardware prober for ChromeOS
+	  devices. The driver will probe the correct component variant in
+	  devices that have multiple drop-in options for one component.
+
 config CROS_EC
 	tristate "ChromeOS Embedded Controller"
 	select CROS_EC_PROTO
diff --git a/drivers/platform/chrome/Makefile b/drivers/platform/chrome/Makefile
index 2dcc6ccc2302..21a9d5047053 100644
--- a/drivers/platform/chrome/Makefile
+++ b/drivers/platform/chrome/Makefile
@@ -8,6 +8,7 @@ obj-$(CONFIG_CHROMEOS_ACPI)		+= chromeos_acpi.o
 obj-$(CONFIG_CHROMEOS_LAPTOP)		+= chromeos_laptop.o
 obj-$(CONFIG_CHROMEOS_PRIVACY_SCREEN)	+= chromeos_privacy_screen.o
 obj-$(CONFIG_CHROMEOS_PSTORE)		+= chromeos_pstore.o
+obj-$(CONFIG_CHROMEOS_OF_HW_PROBER)	+= chromeos_of_hw_prober.o
 obj-$(CONFIG_CHROMEOS_TBMC)		+= chromeos_tbmc.o
 obj-$(CONFIG_CROS_EC)			+= cros_ec.o
 obj-$(CONFIG_CROS_EC_I2C)		+= cros_ec_i2c.o
diff --git a/drivers/platform/chrome/chromeos_of_hw_prober.c b/drivers/platform/chrome/chromeos_of_hw_prober.c
new file mode 100644
index 000000000000..6d9667c40cc7
--- /dev/null
+++ b/drivers/platform/chrome/chromeos_of_hw_prober.c
@@ -0,0 +1,125 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * ChromeOS Device Tree Hardware Prober
+ *
+ * Copyright (c) 2024 Google LLC
+ */
+
+#include <linux/array_size.h>
+#include <linux/errno.h>
+#include <linux/i2c-of-prober.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+
+#define DRV_NAME	"chromeos_of_hw_prober"
+
+/**
+ * struct hw_prober_entry - Holds an entry for the hardware prober
+ *
+ * @compatible:	compatible string to match against the machine
+ * @prober:	prober function to call when machine matches
+ * @data:	extra data for the prober function
+ */
+struct hw_prober_entry {
+	const char *compatible;
+	int (*prober)(struct device *dev, const void *data);
+	const void *data;
+};
+
+struct chromeos_i2c_probe_data {
+	const struct i2c_of_probe_cfg *cfg;
+	const struct i2c_of_probe_simple_opts *opts;
+};
+
+static int chromeos_i2c_component_prober(struct device *dev, const void *_data)
+{
+	const struct chromeos_i2c_probe_data *data = _data;
+	struct i2c_of_probe_simple_ctx ctx = {
+		.opts = data->opts
+	};
+
+	return i2c_of_probe_component(dev, data->cfg, &ctx);
+}
+
+static const struct chromeos_i2c_probe_data chromeos_i2c_probe_dumb_touchscreen = {
+	.cfg = &(const struct i2c_of_probe_cfg) {
+		.type = "touchscreen"
+	}
+};
+
+static const struct chromeos_i2c_probe_data chromeos_i2c_probe_dumb_trackpad = {
+	.cfg = &(const struct i2c_of_probe_cfg) {
+		.type = "trackpad"
+	}
+};
+
+static const struct hw_prober_entry hw_prober_platforms[] = {
+	{ .compatible = "google,hana", .prober = chromeos_i2c_component_prober, .data = &chromeos_i2c_probe_dumb_touchscreen },
+	{ .compatible = "google,hana", .prober = chromeos_i2c_component_prober, .data = &chromeos_i2c_probe_dumb_trackpad },
+};
+
+static int chromeos_of_hw_prober_probe(struct platform_device *pdev)
+{
+	for (size_t i = 0; i < ARRAY_SIZE(hw_prober_platforms); i++) {
+		int ret;
+
+		if (!of_machine_is_compatible(hw_prober_platforms[i].compatible))
+			continue;
+
+		ret = hw_prober_platforms[i].prober(&pdev->dev, hw_prober_platforms[i].data);
+		/* Ignore unrecoverable errors and keep going through other probers */
+		if (ret == -EPROBE_DEFER)
+			return ret;
+	}
+
+	return 0;
+}
+
+static struct platform_driver chromeos_of_hw_prober_driver = {
+	.probe	= chromeos_of_hw_prober_probe,
+	.driver	= {
+		.name = DRV_NAME,
+	},
+};
+
+static struct platform_device *chromeos_of_hw_prober_pdev;
+
+static int chromeos_of_hw_prober_driver_init(void)
+{
+	size_t i;
+	int ret;
+
+	for (i = 0; i < ARRAY_SIZE(hw_prober_platforms); i++)
+		if (of_machine_is_compatible(hw_prober_platforms[i].compatible))
+			break;
+	if (i == ARRAY_SIZE(hw_prober_platforms))
+		return -ENODEV;
+
+	ret = platform_driver_register(&chromeos_of_hw_prober_driver);
+	if (ret)
+		return ret;
+
+	chromeos_of_hw_prober_pdev =
+			platform_device_register_simple(DRV_NAME, PLATFORM_DEVID_NONE, NULL, 0);
+	if (IS_ERR(chromeos_of_hw_prober_pdev))
+		goto err;
+
+	return 0;
+
+err:
+	platform_driver_unregister(&chromeos_of_hw_prober_driver);
+
+	return PTR_ERR(chromeos_of_hw_prober_pdev);
+}
+module_init(chromeos_of_hw_prober_driver_init);
+
+static void chromeos_of_hw_prober_driver_exit(void)
+{
+	platform_device_unregister(chromeos_of_hw_prober_pdev);
+	platform_driver_unregister(&chromeos_of_hw_prober_driver);
+}
+module_exit(chromeos_of_hw_prober_driver_exit);
+
+MODULE_LICENSE("GPL");
+MODULE_DESCRIPTION("ChromeOS device tree hardware prober");
+MODULE_IMPORT_NS(I2C_OF_PROBER);
-- 
2.46.0.598.g6f2099f65c-goog



From wenst at chromium.org  Wed Sep 11 00:27:48 2024
From: wenst at chromium.org (Chen-Yu Tsai)
Date: Wed, 11 Sep 2024 15:27:48 +0800
Subject: [PATCH v7 10/10] arm64: dts: mediatek: mt8173-elm-hana: Mark touchscreens and trackpads as fail
In-Reply-To: <20240911072751.365361-1-wenst@chromium.org>
References: <20240911072751.365361-1-wenst@chromium.org>
Message-ID: <20240911072751.365361-11-wenst@chromium.org>

Instead of having them all available, mark them all as "fail-needs-probe"
and have the implementation try to probe which one is present.

Also remove the shared resource workaround by moving the pinctrl entry
for the trackpad interrupt line back into the individual trackpad nodes.

Signed-off-by: Chen-Yu Tsai <wenst at chromium.org>
---
Changes since v6:
None.

Changes since v5:
None.

Changes since v4:
- Rebased

Changes since v3:
- Also remove second source workaround, i.e. move the interrupt line
  pinctrl entry from the i2c node back to the components.

Changes since v2:
- Drop class from status
---
 arch/arm64/boot/dts/mediatek/mt8173-elm-hana.dtsi | 13 +++++++++++++
 arch/arm64/boot/dts/mediatek/mt8173-elm.dtsi      |  4 ++--
 2 files changed, 15 insertions(+), 2 deletions(-)

diff --git a/arch/arm64/boot/dts/mediatek/mt8173-elm-hana.dtsi b/arch/arm64/boot/dts/mediatek/mt8173-elm-hana.dtsi
index 8d1cbc92bce3..251e084bf7de 100644
--- a/arch/arm64/boot/dts/mediatek/mt8173-elm-hana.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8173-elm-hana.dtsi
@@ -14,6 +14,7 @@ touchscreen2: touchscreen at 34 {
 		compatible = "melfas,mip4_ts";
 		reg = <0x34>;
 		interrupts-extended = <&pio 88 IRQ_TYPE_LEVEL_LOW>;
+		status = "fail-needs-probe";
 	};
 
 	/*
@@ -26,6 +27,7 @@ touchscreen3: touchscreen at 20 {
 		reg = <0x20>;
 		hid-descr-addr = <0x0020>;
 		interrupts-extended = <&pio 88 IRQ_TYPE_LEVEL_LOW>;
+		status = "fail-needs-probe";
 	};
 
 	/* Lenovo Ideapad C330 uses G2Touch touchscreen as a 2nd source touchscreen */
@@ -47,9 +49,12 @@ &i2c4 {
 	trackpad2: trackpad at 2c {
 		compatible = "hid-over-i2c";
 		interrupts-extended = <&pio 117 IRQ_TYPE_LEVEL_LOW>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&trackpad_irq>;
 		reg = <0x2c>;
 		hid-descr-addr = <0x0020>;
 		wakeup-source;
+		status = "fail-needs-probe";
 	};
 };
 
@@ -74,3 +79,11 @@ pins_wp {
 		};
 	};
 };
+
+&touchscreen {
+	status = "fail-needs-probe";
+};
+
+&trackpad {
+	status = "fail-needs-probe";
+};
diff --git a/arch/arm64/boot/dts/mediatek/mt8173-elm.dtsi b/arch/arm64/boot/dts/mediatek/mt8173-elm.dtsi
index b4d85147b77b..eee64461421f 100644
--- a/arch/arm64/boot/dts/mediatek/mt8173-elm.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8173-elm.dtsi
@@ -358,12 +358,12 @@ touchscreen: touchscreen at 10 {
 &i2c4 {
 	clock-frequency = <400000>;
 	status = "okay";
-	pinctrl-names = "default";
-	pinctrl-0 = <&trackpad_irq>;
 
 	trackpad: trackpad at 15 {
 		compatible = "elan,ekth3000";
 		interrupts-extended = <&pio 117 IRQ_TYPE_LEVEL_LOW>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&trackpad_irq>;
 		reg = <0x15>;
 		vcc-supply = <&mt6397_vgp6_reg>;
 		wakeup-source;
-- 
2.46.0.598.g6f2099f65c-goog



From dan.carpenter at linaro.org  Wed Sep 11 00:33:43 2024
From: dan.carpenter at linaro.org (Dan Carpenter)
Date: Wed, 11 Sep 2024 10:33:43 +0300
Subject: [bug report] ASoC: mediatek: mt8365: Add I2S DAI support
Message-ID: <67af3580-a907-403d-8bfd-76b5c304ab99@stanley.mountain>

Hello Alexandre Mergnat,

Commit 402bbb13a195 ("ASoC: mediatek: mt8365: Add I2S DAI support")
from Jul 22, 2024 (linux-next), leads to the following Smatch static
checker warning:

	sound/soc/mediatek/mt8365/mt8365-dai-i2s.c:271 get_iir_coef()
	error: buffer overflow 'iir_coef_tbl_list' 8 <= 8

sound/soc/mediatek/mt8365/mt8365-dai-i2s.c
    259         const u32 *coef = NULL;
    260         unsigned int cnt = 0;
    261         u32 i = freq_new_index[input_fs];
    262         u32 j = freq_new_index[output_fs];
    263 
    264         if (i < 13 && j < 13) {
    265                 u32 k = iir_coef_tbl_matrix[i][j];
    266 
    267                 if (k >= IIR_NO_NEED) {
    268                 } else if (k == IIR_RATIOVER) {
    269                 } else if (k == IIR_INV_COEF) {

These if statements limit "k" to the 0-8 range.

    270                 } else {
--> 271                         coef = iir_coef_tbl_list[k].coef;
                                       ^^^^^^^^^^^^^^^^^^^^
But this array has 8 elements so it's off by one.

    272                         cnt = iir_coef_tbl_list[k].cnt;
    273                 }
    274         }
    275         *count = cnt;
    276         return coef;
    277 }

regards,
dan carpenter


From peter.wang at mediatek.com  Wed Sep 11 00:36:31 2024
From: peter.wang at mediatek.com (peter.wang at mediatek.com)
Date: Wed, 11 Sep 2024 15:36:31 +0800
Subject: [PATCH v5 2/2] ufs: core: requeue aborted request
In-Reply-To: <20240911073631.32410-1-peter.wang@mediatek.com>
References: <20240911073631.32410-1-peter.wang@mediatek.com>
Message-ID: <20240911073631.32410-3-peter.wang@mediatek.com>

From: Peter Wang <peter.wang at mediatek.com>

ufshcd_abort_all forcibly aborts all on-going commands and the host
controller will automatically fill in the OCS field of the corresponding
response with OCS_ABORTED based on different working modes.

MCQ mode: aborts a command using SQ cleanup, The host controller
will post a Completion Queue entry with OCS = ABORTED.

SDB mode: aborts a command using UTRLCLR. Task Management response
which means a Transfer Request was aborted.

For these two cases, set a flag to notify SCSI to requeue the
command after receiving response with OCS_ABORTED.

Fixes: ab248643d3d6 ("scsi: ufs: core: Add error handling for MCQ mode")
Cc: stable at vger.kernel.org
Signed-off-by: Peter Wang <peter.wang at mediatek.com>
---
 drivers/ufs/core/ufshcd.c | 35 ++++++++++++++++++++---------------
 include/ufs/ufshcd.h      |  3 +++
 2 files changed, 23 insertions(+), 15 deletions(-)

diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
index a6f818cdef0e..8380e8861d83 100644
--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -3006,6 +3006,7 @@ static int ufshcd_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd)
 	ufshcd_prepare_lrbp_crypto(scsi_cmd_to_rq(cmd), lrbp);
 
 	lrbp->req_abort_skip = false;
+	lrbp->abort_initiated_by_eh = false;
 
 	ufshcd_comp_scsi_upiu(hba, lrbp);
 
@@ -5404,7 +5405,10 @@ ufshcd_transfer_rsp_status(struct ufs_hba *hba, struct ufshcd_lrb *lrbp,
 		}
 		break;
 	case OCS_ABORTED:
-		result |= DID_ABORT << 16;
+		if (lrbp->abort_initiated_by_eh)
+			result |= DID_REQUEUE << 16;
+		else
+			result |= DID_ABORT << 16;
 		break;
 	case OCS_INVALID_COMMAND_STATUS:
 		result |= DID_REQUEUE << 16;
@@ -6471,26 +6475,12 @@ static bool ufshcd_abort_one(struct request *rq, void *priv)
 	struct scsi_device *sdev = cmd->device;
 	struct Scsi_Host *shost = sdev->host;
 	struct ufs_hba *hba = shost_priv(shost);
-	struct ufshcd_lrb *lrbp = &hba->lrb[tag];
-	struct ufs_hw_queue *hwq;
-	unsigned long flags;
 
 	*ret = ufshcd_try_to_abort_task(hba, tag);
 	dev_err(hba->dev, "Aborting tag %d / CDB %#02x %s\n", tag,
 		hba->lrb[tag].cmd ? hba->lrb[tag].cmd->cmnd[0] : -1,
 		*ret ? "failed" : "succeeded");
 
-	/* Release cmd in MCQ mode if abort succeeds */
-	if (hba->mcq_enabled && (*ret == 0)) {
-		hwq = ufshcd_mcq_req_to_hwq(hba, scsi_cmd_to_rq(lrbp->cmd));
-		if (!hwq)
-			return 0;
-		spin_lock_irqsave(&hwq->cq_lock, flags);
-		if (ufshcd_cmd_inflight(lrbp->cmd))
-			ufshcd_release_scsi_cmd(hba, lrbp);
-		spin_unlock_irqrestore(&hwq->cq_lock, flags);
-	}
-
 	return *ret == 0;
 }
 
@@ -7561,6 +7551,21 @@ int ufshcd_try_to_abort_task(struct ufs_hba *hba, int tag)
 		goto out;
 	}
 
+	/*
+	 * When the host software receives a "FUNCTION COMPLETE", set flag
+	 * to requeue command after receive response with OCS_ABORTED
+	 * SDB mode: UTRLCLR Task Management response which means a Transfer
+	 *           Request was aborted.
+	 * MCQ mode: Host will post to CQ with OCS_ABORTED after SQ cleanup
+	 *
+	 * This flag is set because error handler ufshcd_abort_all forcibly
+	 * aborts all commands, and the host controller will automatically
+	 * fill in the OCS field of the corresponding response with OCS_ABORTED.
+	 * Therefore, upon receiving this response, it needs to be requeued.
+	 */
+	if (!err)
+		lrbp->abort_initiated_by_eh = true;
+
 	err = ufshcd_clear_cmd(hba, tag);
 	if (err)
 		dev_err(hba->dev, "%s: Failed clearing cmd at tag %d, err %d\n",
diff --git a/include/ufs/ufshcd.h b/include/ufs/ufshcd.h
index 0fd2aebac728..07b5e60e6c44 100644
--- a/include/ufs/ufshcd.h
+++ b/include/ufs/ufshcd.h
@@ -173,6 +173,8 @@ struct ufs_pm_lvl_states {
  * @crypto_key_slot: the key slot to use for inline crypto (-1 if none)
  * @data_unit_num: the data unit number for the first block for inline crypto
  * @req_abort_skip: skip request abort task flag
+ * @abort_initiated_by_eh: The flag is specifically used to handle
+ *                         ufshcd_err_handler forcibly aborts.
  */
 struct ufshcd_lrb {
 	struct utp_transfer_req_desc *utr_descriptor_ptr;
@@ -202,6 +204,7 @@ struct ufshcd_lrb {
 #endif
 
 	bool req_abort_skip;
+	bool abort_initiated_by_eh;
 };
 
 /**
-- 
2.45.2



From peter.wang at mediatek.com  Wed Sep 11 00:36:30 2024
From: peter.wang at mediatek.com (peter.wang at mediatek.com)
Date: Wed, 11 Sep 2024 15:36:30 +0800
Subject: [PATCH v5 1/2] ufs: core: fix the issue of ICU failure
In-Reply-To: <20240911073631.32410-1-peter.wang@mediatek.com>
References: <20240911073631.32410-1-peter.wang@mediatek.com>
Message-ID: <20240911073631.32410-2-peter.wang@mediatek.com>

From: Peter Wang <peter.wang at mediatek.com>

When setting the ICU bit without using read-modify-write,
SQRTCy will restart SQ again and receive an RTC return
error code 2 (Failure - SQ not stopped).

Additionally, the error log has been modified so that
this type of error can be observed.

Fixes: ab248643d3d6 ("scsi: ufs: core: Add error handling for MCQ mode")
Cc: stable at vger.kernel.org
Signed-off-by: Peter Wang <peter.wang at mediatek.com>
Reviewed-by: Bao D. Nguyen <quic_nguyenb at quicinc.com>
Reviewed-by: Bart Van Assche <bvanassche at acm.org>
---
 drivers/ufs/core/ufs-mcq.c | 15 ++++++++-------
 1 file changed, 8 insertions(+), 7 deletions(-)

diff --git a/drivers/ufs/core/ufs-mcq.c b/drivers/ufs/core/ufs-mcq.c
index 5891cdacd0b3..3903947dbed1 100644
--- a/drivers/ufs/core/ufs-mcq.c
+++ b/drivers/ufs/core/ufs-mcq.c
@@ -539,7 +539,7 @@ int ufshcd_mcq_sq_cleanup(struct ufs_hba *hba, int task_tag)
 	struct scsi_cmnd *cmd = lrbp->cmd;
 	struct ufs_hw_queue *hwq;
 	void __iomem *reg, *opr_sqd_base;
-	u32 nexus, id, val;
+	u32 nexus, id, val, rtc;
 	int err;
 
 	if (hba->quirks & UFSHCD_QUIRK_MCQ_BROKEN_RTC)
@@ -569,17 +569,18 @@ int ufshcd_mcq_sq_cleanup(struct ufs_hba *hba, int task_tag)
 	opr_sqd_base = mcq_opr_base(hba, OPR_SQD, id);
 	writel(nexus, opr_sqd_base + REG_SQCTI);
 
-	/* SQRTCy.ICU = 1 */
-	writel(SQ_ICU, opr_sqd_base + REG_SQRTC);
+	/* Initiate Cleanup */
+	writel(readl(opr_sqd_base + REG_SQRTC) | SQ_ICU,
+		opr_sqd_base + REG_SQRTC);
 
 	/* Poll SQRTSy.CUS = 1. Return result from SQRTSy.RTC */
 	reg = opr_sqd_base + REG_SQRTS;
 	err = read_poll_timeout(readl, val, val & SQ_CUS, 20,
 				MCQ_POLL_US, false, reg);
-	if (err)
-		dev_err(hba->dev, "%s: failed. hwq=%d, tag=%d err=%ld\n",
-			__func__, id, task_tag,
-			FIELD_GET(SQ_ICU_ERR_CODE_MASK, readl(reg)));
+	rtc = FIELD_GET(SQ_ICU_ERR_CODE_MASK, readl(reg));
+	if (err || rtc)
+		dev_err(hba->dev, "%s: failed. hwq=%d, tag=%d err=%d RTC=%d\n",
+			__func__, id, task_tag, err, rtc);
 
 	if (ufshcd_mcq_sq_start(hba, hwq))
 		err = -ETIMEDOUT;
-- 
2.45.2



From peter.wang at mediatek.com  Wed Sep 11 00:36:29 2024
From: peter.wang at mediatek.com (peter.wang at mediatek.com)
Date: Wed, 11 Sep 2024 15:36:29 +0800
Subject: [PATCH v5 0/2] fix abort defect
Message-ID: <20240911073631.32410-1-peter.wang@mediatek.com>

From: Peter Wang <peter.wang at mediatek.com>

This series fixes MCQ and SDB abort defect.

V5:
 - Change flag name.
 - Add err handler check before set flag true.
 - Amend comment and patch description.

V4:
 - Remove nullify SQ entry abort requeue.
 - Add more comment for flag usage and set description.
 - Fix build warning.

V3:
 - Change comment and use variable(rtc) for error print
 - Change flag name and move flag set before ufshcd_clear_cmd
 - Add SDB mode clear UTRLCLR tag receive OCS_ABORTED requeue

V2:
 - Fix mcq_enabled build error.

Peter Wang (2):
  ufs: core: fix the issue of ICU failure
  ufs: core: requeue aborted request

 drivers/ufs/core/ufs-mcq.c | 15 ++++++++-------
 drivers/ufs/core/ufshcd.c  | 35 ++++++++++++++++++++---------------
 include/ufs/ufshcd.h       |  3 +++
 3 files changed, 31 insertions(+), 22 deletions(-)

-- 
2.45.2



From wenst at chromium.org  Wed Sep 11 00:37:35 2024
From: wenst at chromium.org (Chen-Yu Tsai)
Date: Wed, 11 Sep 2024 15:37:35 +0800
Subject: [PATCH v6 06/12] gpiolib: Add gpio_get_property_name_length()
In-Reply-To: <CAGXv+5GrW0EZZw6HVY7ALvm0dBj5Wwrvp02vtTPZYwqxxiZQyg@mail.gmail.com>
References: <20240904090016.2841572-1-wenst@chromium.org> <20240904090016.2841572-7-wenst@chromium.org>
 <ZthjSK9N9z11YXi2@smile.fi.intel.com> <CAGXv+5GrW0EZZw6HVY7ALvm0dBj5Wwrvp02vtTPZYwqxxiZQyg@mail.gmail.com>
Message-ID: <CAGXv+5Hrz2rA1_eAY8S96ankeWS4wr9EX-hr1LUY5JGx=FoNPQ@mail.gmail.com>

On Mon, Sep 9, 2024 at 10:45?AM Chen-Yu Tsai <wenst at chromium.org> wrote:
>
> On Wed, Sep 4, 2024 at 9:40?PM Andy Shevchenko
> <andriy.shevchenko at linux.intel.com> wrote:
> >
> > On Wed, Sep 04, 2024 at 05:00:08PM +0800, Chen-Yu Tsai wrote:
> > > The I2C device tree component prober needs to get and toggle GPIO lines
> > > for the components it intends to probe. These components may not use the
> > > same name for their GPIO lines, so the prober must go through the device
> > > tree, check each property to see it is a GPIO property, and get the GPIO
> > > line.
> > >
> > > Instead of duplicating the GPIO suffixes, or exporting them to the
> > > prober to do pattern matching, simply add and export a new function that
> > > does the pattern matching and returns the length of the GPIO name. The
> > > caller can then use that to copy out the name if it needs to.
> >
> > > Andy suggested a much shorter implementation.
> >
> > No need to have this sentence in the commit message, changelog area is fine.
> > But if you wish... :-)
>
> It does seem out of place without any context. I'll move it to the
> changelog area. :D
>
> > > Suggested-by: Andy Shevchenko <andriy.shevchenko at linux.intel.com>
> > > Signed-off-by: Chen-Yu Tsai <wenst at chromium.org>
> >
> > ...
> >
> > > +/**
> > > + * gpio_get_property_name_length - Returns the GPIO name length from a property name
> > > + * @propname:        name of the property to check
> > > + *
> > > + * This function checks if the given property name matches the GPIO property
> > > + * patterns, and returns the length of the name of the GPIO. The pattern is
> > > + * "*-<GPIO suffix>" or just "<GPIO suffix>".
> > > + *
> > > + * Returns:
> > > + * The length of the string before '-<GPIO suffix>' if it matches
> > > + * "*-<GPIO suffix>", or 0 if no name part, just the suffix, or
> > > + * -EINVAL if the string doesn't match the pattern.
> >
> > Should be %-EINVAL as we agreed with Bart when I updated GPIOLIB kernel-doc.
>
> Ack.
>
> In the regulator cleanups I did, I used -%EINVAL instead. But then I
> realized that constants aren't really cross-referenced. I probably
> have to go through all of them to fix those up.

FTR this patch ended up getting dropped from the series as it was no
longer needed. However if folks think there is still value in this patch,
I can still send a new version.


ChenYu


From angelogioacchino.delregno at collabora.com  Wed Sep 11 00:42:34 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Wed, 11 Sep 2024 07:42:34 +0000
Subject: [PATCH 4/5] drm/mediatek: dp: constify regmap_config
In-Reply-To: <20240908-regmap-config-const-v1-4-28f349004811@linaro.org>
References: <20240908-regmap-config-const-v1-0-28f349004811@linaro.org>
 <20240908-regmap-config-const-v1-4-28f349004811@linaro.org>
Message-ID: <01020191e008baec-ca547413-aeba-4508-8a05-2c35b06150c2-000000@eu-west-1.amazonses.com>

Il 08/09/24 16:21, Krzysztof Kozlowski ha scritto:
> Mark local static 'struct regmap_config' as const for safer and more
> obvious code.
> 
> Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski at linaro.org>

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>



From dan.carpenter at linaro.org  Wed Sep 11 00:43:03 2024
From: dan.carpenter at linaro.org (Dan Carpenter)
Date: Wed, 11 Sep 2024 10:43:03 +0300
Subject: [PATCH next] wifi: mt76: mt7925: fix off by one in mt7925_load_clc()
Message-ID: <84bf5dd2-2fe3-4410-a7af-ae841e41082a@stanley.mountain>

This comparison should be >= instead of > to prevent an out of bounds
read and write.

Fixes: 9679ca7326e5 ("wifi: mt76: mt7925: fix a potential array-index-out-of-bounds issue for clc")
Signed-off-by: Dan Carpenter <dan.carpenter at linaro.org>
---
 drivers/net/wireless/mediatek/mt76/mt7925/mcu.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c
index 748ea6adbc6b..0c2a2337c313 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c
@@ -638,7 +638,7 @@ static int mt7925_load_clc(struct mt792x_dev *dev, const char *fw_name)
 	for (offset = 0; offset < len; offset += le32_to_cpu(clc->len)) {
 		clc = (const struct mt7925_clc *)(clc_base + offset);
 
-		if (clc->idx > ARRAY_SIZE(phy->clc))
+		if (clc->idx >= ARRAY_SIZE(phy->clc))
 			break;
 
 		/* do not init buf again if chip reset triggered */
-- 
2.45.2



From angelogioacchino.delregno at collabora.com  Wed Sep 11 00:48:42 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Wed, 11 Sep 2024 07:48:42 +0000
Subject: [PATCH -next v2] usb: musb: mediatek: Simplify code with
 dev_err_probe()
In-Reply-To: <20240907081351.19879-1-linruifeng4@huawei.com>
References: <20240907081351.19879-1-linruifeng4@huawei.com>
Message-ID: <01020191e00e5b01-2762c208-54d4-459f-b81f-b9cfbf9bd569-000000@eu-west-1.amazonses.com>

Il 07/09/24 10:13, Lin Ruifeng ha scritto:
> The combination of dev_err() and the returned error code could be
> replaced by dev_err_probe() in driver's probe function.
 >

> Let's,
> converting to dev_err_probe() to make code more simple.

Convert to dev_err_probe() to simplify the code.

> 
> Signed-off-by: Lin Ruifeng <linruifeng4 at huawei.com>

After which,
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>




From lkp at intel.com  Wed Sep 11 01:06:55 2024
From: lkp at intel.com (kernel test robot)
Date: Wed, 11 Sep 2024 16:06:55 +0800
Subject: [PATCH] arm64: dts: mt8183: Add encoder node
In-Reply-To: <20240910-venc-v1-1-d17dfd931dc8@chromium.org>
References: <20240910-venc-v1-1-d17dfd931dc8@chromium.org>
Message-ID: <202409111520.z5LrGscP-lkp@intel.com>

Hi Hsin-Te,

kernel test robot noticed the following build errors:

[auto build test ERROR on da3ea35007d0af457a0afc87e84fddaebc4e0b63]

url:    https://github.com/intel-lab-lkp/linux/commits/Hsin-Te-Yuan/arm64-dts-mt8183-Add-encoder-node/20240910-142236
base:   da3ea35007d0af457a0afc87e84fddaebc4e0b63
patch link:    https://lore.kernel.org/r/20240910-venc-v1-1-d17dfd931dc8%40chromium.org
patch subject: [PATCH] arm64: dts: mt8183: Add encoder node
config: arm64-defconfig (https://download.01.org/0day-ci/archive/20240911/202409111520.z5LrGscP-lkp at intel.com/config)
compiler: aarch64-linux-gcc (GCC) 14.1.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240911/202409111520.z5LrGscP-lkp at intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp at intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202409111520.z5LrGscP-lkp at intel.com/

All errors (new ones prefixed by >>):

>> Error: arch/arm64/boot/dts/mediatek/mt8183.dtsi:1971.4-5 syntax error
   FATAL ERROR: Unable to parse input tree

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki


From angelogioacchino.delregno at collabora.com  Wed Sep 11 01:24:27 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Wed, 11 Sep 2024 08:24:27 +0000
Subject: [PATCH] dt-bindings: clock: mediatek: Drop duplicate
 mediatek,mt6795-sys-clock.yaml
In-Reply-To: <20240910234238.1028422-1-robh@kernel.org>
References: <20240910234238.1028422-1-robh@kernel.org>
Message-ID: <01020191e02f1538-47c02c52-c508-4cf3-ba84-fc339b55047c-000000@eu-west-1.amazonses.com>

Il 11/09/24 01:42, Rob Herring (Arm) ha scritto:
> The compatible strings for mt6795 clocks are also documented in other
> schemas:
> 
> "mediatek,mt6795-apmixedsys" in clock/mediatek,apmixedsys.yaml
> "mediatek,mt6795-topckgen" in clock/mediatek,topckgen.yaml
> "mediatek,mt6795-pericfg" in clock/mediatek,pericfg.yaml
> "mediatek,mt6795-infracfg" in clock/mediatek,infracfg.yaml
> 
> The only difference is #reset-cells is not allowed in some of these,
> but that aligns with actual users in .dts files.
> 
> Signed-off-by: Rob Herring (Arm) <robh at kernel.org>

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>




From angelogioacchino.delregno at collabora.com  Wed Sep 11 01:25:26 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Wed, 11 Sep 2024 08:25:26 +0000
Subject: [PATCH v1] wifi: mt76: mt7615: Convert comma to semicolon
In-Reply-To: <20240911034243.31596-1-shenlichuan@vivo.com>
References: <20240911034243.31596-1-shenlichuan@vivo.com>
Message-ID: <01020191e02ffa5a-26aca14f-dede-4675-a177-92a1e3b5a27a-000000@eu-west-1.amazonses.com>

Il 11/09/24 05:42, Shen Lichuan ha scritto:
> To ensure code clarity and prevent potential errors, it's advisable
> to employ the ';' as a statement separator, except when ',' are
> intentionally used for specific purposes.
> 
> Signed-off-by: Shen Lichuan <shenlichuan at vivo.com>

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>




From angelogioacchino.delregno at collabora.com  Wed Sep 11 01:57:25 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Wed, 11 Sep 2024 08:57:25 +0000
Subject: [PATCH] arm64: dts: mediatek: mt8395-genio-1200-evk: Enable GPU
In-Reply-To: <20240910143245.5282-1-pablo.sun@mediatek.com>
References: <20240910143245.5282-1-pablo.sun@mediatek.com>
Message-ID: <01020191e04d4237-204596e1-6cc1-491c-a60f-de3917af7d42-000000@eu-west-1.amazonses.com>

Il 10/09/24 16:32, Pablo Sun ha scritto:
> Enable the Mali Valhall GPU on Genio 1200 EVK by providing regulator
> supply settings and enable the GPU node.
> 
> In addition, set the GPU related regulator voltage range:
> 
> 1. Set the recommended input voltage range of DVDD_GPU to (0.546V-0.787V),
>     based on Table 5-3 of MT8395 Application Processor Datasheet.
>     The regulator mt6315_7_vbuck1("Vgpu") connects to the DVDD_GPU input.
> 2. Set the input voltage of DVDD_SRAM_GPU, supplied by
>     mt6359_vsram_others_ldo_reg, to 0.75V and set it always on for GPU SRAM.
> 
> This patch is tested by enabling CONFIG_DRM_PANFROST and
> on Genio 1200 EVK it probed with following dmesg:
> 
> ```
> panfrost 13000000.gpu: clock rate = 700000092
> panfrost 13000000.gpu: mali-g57 id 0x9093 major 0x0 minor 0x1 status 0x0
> panfrost 13000000.gpu: features: 00000000,000019f7,
> 	               issues: 00000001,80000400
> panfrost 13000000.gpu: Features: L2:0x07120206 Shader:0x00000000
>                         Tiler:0x00000809 Mem:0x301
> 		       MMU:0x00002830 AS:0xff JS:0x7
> panfrost 13000000.gpu: shader_present=0x50045 l2_present=0x1
> [drm] Initialized panfrost 1.2.0 for 13000000.gpu on minor 0
> ```
> 
> Signed-off-by: Pablo Sun <pablo.sun at mediatek.com>
> ---
>   .../boot/dts/mediatek/mt8395-genio-1200-evk.dts  | 16 ++++++++++++++--
>   1 file changed, 14 insertions(+), 2 deletions(-)
> 
> diff --git a/arch/arm64/boot/dts/mediatek/mt8395-genio-1200-evk.dts b/arch/arm64/boot/dts/mediatek/mt8395-genio-1200-evk.dts
> index a06610fff8ad..9b7850b0b9b4 100644
> --- a/arch/arm64/boot/dts/mediatek/mt8395-genio-1200-evk.dts
> +++ b/arch/arm64/boot/dts/mediatek/mt8395-genio-1200-evk.dts
> @@ -194,6 +194,11 @@ eth_phy0: eth-phy0 at 1 {
>   	};
>   };
>   
> +&gpu {
> +	mali-supply = <&mt6315_7_vbuck1>;
> +	status = "okay";
> +};
> +
>   &i2c0 {
>   	clock-frequency = <400000>;
>   	pinctrl-0 = <&i2c0_pins>;
> @@ -407,6 +412,13 @@ &mt6359_vrf12_ldo_reg {
>   	regulator-always-on;
>   };
>   
> +/* for GPU SRAM */
> +&mt6359_vsram_others_ldo_reg {
> +	regulator-always-on;

No, that's not good. Like that, the GPU VSRAM will be subject to current leakage.

Remove the regulator-always-on property.
The right way of doing that is to add the vgpu to the mfg0's domain supply and
vsram to mfg1; that way all of the GPU regulators will be off at PM suspend time.

> +	regulator-min-microvolt = <750000>;
> +	regulator-max-microvolt = <750000>;
> +};
> +
>   &mt6359codec {
>   	mediatek,mic-type-0 = <1>; /* ACC */
>   	mediatek,mic-type-1 = <3>; /* DCC */
> @@ -839,8 +851,8 @@ regulators {
>   			mt6315_7_vbuck1: vbuck1 {
>   				regulator-compatible = "vbuck1";
>   				regulator-name = "Vgpu";
> -				regulator-min-microvolt = <300000>;
> -				regulator-max-microvolt = <1193750>;
> +				regulator-min-microvolt = <546000>;

I'm okay with this constraint but are you sure that MTK-SVS won't go any lower
than 0.546V?

Cheers,
Angelo

> +				regulator-max-microvolt = <787000>;
>   				regulator-enable-ramp-delay = <256>;
>   				regulator-allowed-modes = <0 1 2>;
>   			};




From yuanhsinte at chromium.org  Wed Sep 11 02:07:03 2024
From: yuanhsinte at chromium.org (Hsin-Te Yuan)
Date: Wed, 11 Sep 2024 09:07:03 +0000
Subject: [PATCH v2] arm64: dts: mt8183: Add encoder node
Message-ID: <20240911-venc-v2-1-5566c07756fd@chromium.org>

Add encoder node.

Signed-off-by: Hsin-Te Yuan <yuanhsinte at chromium.org>
---
According to
https://lore.kernel.org/all/184d895c-239e-3f23-970e-6a9563235cd9 at gmail.com/,
the encoder node of MT8183 should be added only after its dependency has
been accepted. Add the encoder node in this patch.
---
Changes in v2:
- Fix typo in dts 
- Rename clock-names to venc_sel to match dt-bindings
- Remove deprecated property: mediatek,larb
- Link to v1: https://lore.kernel.org/r/20240910-venc-v1-1-d17dfd931dc8 at chromium.org
---
 arch/arm64/boot/dts/mediatek/mt8183.dtsi | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/arch/arm64/boot/dts/mediatek/mt8183.dtsi b/arch/arm64/boot/dts/mediatek/mt8183.dtsi
index fbf145639b8c90b2c69da1cb4bac4f61ca7a1c9e..d33c0e4fdfc1132463c1d8f058a791fb2b06579c 100644
--- a/arch/arm64/boot/dts/mediatek/mt8183.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8183.dtsi
@@ -1965,6 +1965,23 @@ larb4: larb at 17010000 {
 			power-domains = <&spm MT8183_POWER_DOMAIN_VENC>;
 		};
 
+		vcodec_enc: vcodec at 17020000 {
+			compatible = "mediatek,mt8183-vcodec-enc";
+			reg = <0 0x17020000 0 0x1000>;
+			interrupts = <GIC_SPI 247 IRQ_TYPE_LEVEL_LOW>;
+			iommus = <&iommu M4U_PORT_VENC_REC>,
+				 <&iommu M4U_PORT_VENC_BSDMA>,
+				 <&iommu M4U_PORT_VENC_RD_COMV>,
+				 <&iommu M4U_PORT_VENC_CUR_LUMA>,
+				 <&iommu M4U_PORT_VENC_CUR_CHROMA>,
+				 <&iommu M4U_PORT_VENC_REF_LUMA>,
+				 <&iommu M4U_PORT_VENC_REF_CHROMA>;
+			mediatek,scp = <&scp>;
+			power-domains = <&spm MT8183_POWER_DOMAIN_VENC>;
+			clocks = <&vencsys CLK_VENC_VENC>;
+			clock-names = "venc_sel";
+		};
+
 		venc_jpg: jpeg-encoder at 17030000 {
 			compatible = "mediatek,mt8183-jpgenc", "mediatek,mtk-jpgenc";
 			reg = <0 0x17030000 0 0x1000>;

---
base-commit: da3ea35007d0af457a0afc87e84fddaebc4e0b63
change-id: 20240909-venc-4705c7fff5d6

Best regards,
-- 
Hsin-Te Yuan <yuanhsinte at chromium.org>



From peter.wang at mediatek.com  Wed Sep 11 02:56:21 2024
From: peter.wang at mediatek.com (peter.wang at mediatek.com)
Date: Wed, 11 Sep 2024 17:56:21 +0800
Subject: [PATCH v6 1/2] ufs: core: fix the issue of ICU failure
In-Reply-To: <20240911095622.19225-1-peter.wang@mediatek.com>
References: <20240911095622.19225-1-peter.wang@mediatek.com>
Message-ID: <20240911095622.19225-2-peter.wang@mediatek.com>

From: Peter Wang <peter.wang at mediatek.com>

When setting the ICU bit without using read-modify-write,
SQRTCy will restart SQ again and receive an RTC return
error code 2 (Failure - SQ not stopped).

Additionally, the error log has been modified so that
this type of error can be observed.

Fixes: ab248643d3d6 ("scsi: ufs: core: Add error handling for MCQ mode")
Cc: stable at vger.kernel.org
Signed-off-by: Peter Wang <peter.wang at mediatek.com>
Reviewed-by: Bao D. Nguyen <quic_nguyenb at quicinc.com>
Reviewed-by: Bart Van Assche <bvanassche at acm.org>
---
 drivers/ufs/core/ufs-mcq.c | 15 ++++++++-------
 1 file changed, 8 insertions(+), 7 deletions(-)

diff --git a/drivers/ufs/core/ufs-mcq.c b/drivers/ufs/core/ufs-mcq.c
index 5891cdacd0b3..3903947dbed1 100644
--- a/drivers/ufs/core/ufs-mcq.c
+++ b/drivers/ufs/core/ufs-mcq.c
@@ -539,7 +539,7 @@ int ufshcd_mcq_sq_cleanup(struct ufs_hba *hba, int task_tag)
 	struct scsi_cmnd *cmd = lrbp->cmd;
 	struct ufs_hw_queue *hwq;
 	void __iomem *reg, *opr_sqd_base;
-	u32 nexus, id, val;
+	u32 nexus, id, val, rtc;
 	int err;
 
 	if (hba->quirks & UFSHCD_QUIRK_MCQ_BROKEN_RTC)
@@ -569,17 +569,18 @@ int ufshcd_mcq_sq_cleanup(struct ufs_hba *hba, int task_tag)
 	opr_sqd_base = mcq_opr_base(hba, OPR_SQD, id);
 	writel(nexus, opr_sqd_base + REG_SQCTI);
 
-	/* SQRTCy.ICU = 1 */
-	writel(SQ_ICU, opr_sqd_base + REG_SQRTC);
+	/* Initiate Cleanup */
+	writel(readl(opr_sqd_base + REG_SQRTC) | SQ_ICU,
+		opr_sqd_base + REG_SQRTC);
 
 	/* Poll SQRTSy.CUS = 1. Return result from SQRTSy.RTC */
 	reg = opr_sqd_base + REG_SQRTS;
 	err = read_poll_timeout(readl, val, val & SQ_CUS, 20,
 				MCQ_POLL_US, false, reg);
-	if (err)
-		dev_err(hba->dev, "%s: failed. hwq=%d, tag=%d err=%ld\n",
-			__func__, id, task_tag,
-			FIELD_GET(SQ_ICU_ERR_CODE_MASK, readl(reg)));
+	rtc = FIELD_GET(SQ_ICU_ERR_CODE_MASK, readl(reg));
+	if (err || rtc)
+		dev_err(hba->dev, "%s: failed. hwq=%d, tag=%d err=%d RTC=%d\n",
+			__func__, id, task_tag, err, rtc);
 
 	if (ufshcd_mcq_sq_start(hba, hwq))
 		err = -ETIMEDOUT;
-- 
2.45.2



From peter.wang at mediatek.com  Wed Sep 11 02:56:22 2024
From: peter.wang at mediatek.com (peter.wang at mediatek.com)
Date: Wed, 11 Sep 2024 17:56:22 +0800
Subject: [PATCH v6 2/2] ufs: core: requeue aborted request
In-Reply-To: <20240911095622.19225-1-peter.wang@mediatek.com>
References: <20240911095622.19225-1-peter.wang@mediatek.com>
Message-ID: <20240911095622.19225-3-peter.wang@mediatek.com>

From: Peter Wang <peter.wang at mediatek.com>

ufshcd_abort_all forcibly aborts all on-going commands and the host
controller will automatically fill in the OCS field of the corresponding
response with OCS_ABORTED based on different working modes.

MCQ mode: aborts a command using SQ cleanup, The host controller
will post a Completion Queue entry with OCS = ABORTED.

SDB mode: aborts a command using UTRLCLR. Task Management response
which means a Transfer Request was aborted.

For these two cases, set a flag to notify SCSI to requeue the
command after receiving response with OCS_ABORTED.

Fixes: ab248643d3d6 ("scsi: ufs: core: Add error handling for MCQ mode")
Cc: stable at vger.kernel.org
Signed-off-by: Peter Wang <peter.wang at mediatek.com>
---
 drivers/ufs/core/ufshcd.c | 35 ++++++++++++++++++++---------------
 include/ufs/ufshcd.h      |  3 +++
 2 files changed, 23 insertions(+), 15 deletions(-)

diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
index a6f818cdef0e..a0548a495f30 100644
--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -3006,6 +3006,7 @@ static int ufshcd_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd)
 	ufshcd_prepare_lrbp_crypto(scsi_cmd_to_rq(cmd), lrbp);
 
 	lrbp->req_abort_skip = false;
+	lrbp->abort_initiated_by_eh = false;
 
 	ufshcd_comp_scsi_upiu(hba, lrbp);
 
@@ -5404,7 +5405,10 @@ ufshcd_transfer_rsp_status(struct ufs_hba *hba, struct ufshcd_lrb *lrbp,
 		}
 		break;
 	case OCS_ABORTED:
-		result |= DID_ABORT << 16;
+		if (lrbp->abort_initiated_by_eh)
+			result |= DID_REQUEUE << 16;
+		else
+			result |= DID_ABORT << 16;
 		break;
 	case OCS_INVALID_COMMAND_STATUS:
 		result |= DID_REQUEUE << 16;
@@ -6471,26 +6475,12 @@ static bool ufshcd_abort_one(struct request *rq, void *priv)
 	struct scsi_device *sdev = cmd->device;
 	struct Scsi_Host *shost = sdev->host;
 	struct ufs_hba *hba = shost_priv(shost);
-	struct ufshcd_lrb *lrbp = &hba->lrb[tag];
-	struct ufs_hw_queue *hwq;
-	unsigned long flags;
 
 	*ret = ufshcd_try_to_abort_task(hba, tag);
 	dev_err(hba->dev, "Aborting tag %d / CDB %#02x %s\n", tag,
 		hba->lrb[tag].cmd ? hba->lrb[tag].cmd->cmnd[0] : -1,
 		*ret ? "failed" : "succeeded");
 
-	/* Release cmd in MCQ mode if abort succeeds */
-	if (hba->mcq_enabled && (*ret == 0)) {
-		hwq = ufshcd_mcq_req_to_hwq(hba, scsi_cmd_to_rq(lrbp->cmd));
-		if (!hwq)
-			return 0;
-		spin_lock_irqsave(&hwq->cq_lock, flags);
-		if (ufshcd_cmd_inflight(lrbp->cmd))
-			ufshcd_release_scsi_cmd(hba, lrbp);
-		spin_unlock_irqrestore(&hwq->cq_lock, flags);
-	}
-
 	return *ret == 0;
 }
 
@@ -7561,6 +7551,21 @@ int ufshcd_try_to_abort_task(struct ufs_hba *hba, int tag)
 		goto out;
 	}
 
+	/*
+	 * When the host software receives a "FUNCTION COMPLETE", set flag
+	 * to requeue command after receive response with OCS_ABORTED
+	 * SDB mode: UTRLCLR Task Management response which means a Transfer
+	 *           Request was aborted.
+	 * MCQ mode: Host will post to CQ with OCS_ABORTED after SQ cleanup
+	 *
+	 * This flag is set because error handler ufshcd_abort_all forcibly
+	 * aborts all commands, and the host controller will automatically
+	 * fill in the OCS field of the corresponding response with OCS_ABORTED.
+	 * Therefore, upon receiving this response, it needs to be requeued.
+	 */
+	if (!err && ufshcd_eh_in_progress(hba))
+		lrbp->abort_initiated_by_eh = true;
+
 	err = ufshcd_clear_cmd(hba, tag);
 	if (err)
 		dev_err(hba->dev, "%s: Failed clearing cmd at tag %d, err %d\n",
diff --git a/include/ufs/ufshcd.h b/include/ufs/ufshcd.h
index 0fd2aebac728..07b5e60e6c44 100644
--- a/include/ufs/ufshcd.h
+++ b/include/ufs/ufshcd.h
@@ -173,6 +173,8 @@ struct ufs_pm_lvl_states {
  * @crypto_key_slot: the key slot to use for inline crypto (-1 if none)
  * @data_unit_num: the data unit number for the first block for inline crypto
  * @req_abort_skip: skip request abort task flag
+ * @abort_initiated_by_eh: The flag is specifically used to handle
+ *                         ufshcd_err_handler forcibly aborts.
  */
 struct ufshcd_lrb {
 	struct utp_transfer_req_desc *utr_descriptor_ptr;
@@ -202,6 +204,7 @@ struct ufshcd_lrb {
 #endif
 
 	bool req_abort_skip;
+	bool abort_initiated_by_eh;
 };
 
 /**
-- 
2.45.2



From peter.wang at mediatek.com  Wed Sep 11 02:56:20 2024
From: peter.wang at mediatek.com (peter.wang at mediatek.com)
Date: Wed, 11 Sep 2024 17:56:20 +0800
Subject: [PATCH v6 0/2] fix abort defect
Message-ID: <20240911095622.19225-1-peter.wang@mediatek.com>

From: Peter Wang <peter.wang at mediatek.com>

This series fixes MCQ and SDB abort defect.

V6:
 - Add err handler check before set flag true.

V5:
 - Change flag name.
 - Amend comment and patch description.

V4:
 - Remove nullify SQ entry abort requeue.
 - Add more comment for flag usage and set description.
 - Fix build warning.

V3:
 - Change comment and use variable(rtc) for error print
 - Change flag name and move flag set before ufshcd_clear_cmd
 - Add SDB mode clear UTRLCLR tag receive OCS_ABORTED requeue

V2:
 - Fix mcq_enabled build error.

Peter Wang (2):
  ufs: core: fix the issue of ICU failure
  ufs: core: requeue aborted request

 drivers/ufs/core/ufs-mcq.c | 15 ++++++++-------
 drivers/ufs/core/ufshcd.c  | 35 ++++++++++++++++++++---------------
 include/ufs/ufshcd.h       |  3 +++
 3 files changed, 31 insertions(+), 22 deletions(-)

-- 
2.45.2



From angelogioacchino.delregno at collabora.com  Wed Sep 11 03:10:26 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Wed, 11 Sep 2024 10:10:26 +0000
Subject: [PATCH RFC 1/3] pinctrl: mediatek: paris: Expose more
 configurations to GPIO set_config
In-Reply-To: <20240909-kselftest-gpio-set-get-config-v1-1-16a065afc3c1@collabora.com>
References: <20240909-kselftest-gpio-set-get-config-v1-0-16a065afc3c1@collabora.com>
 <20240909-kselftest-gpio-set-get-config-v1-1-16a065afc3c1@collabora.com>
Message-ID: <01020191e0901d10-d427a5dd-af4e-4ecf-99e1-4bb051ad1475-000000@eu-west-1.amazonses.com>

Il 09/09/24 20:37, N?colas F. R. A. Prado ha scritto:
> Currently the set_config callback in the gpio_chip registered by the
> pinctrl_paris driver only supports PIN_CONFIG_INPUT_DEBOUNCE, despite

[...] only supports operations configuring the input debounce parameter
of the EINT controller and denies configuring params on the other AP GPIOs [...]

(reword as needed)

> many other configurations already being implemented and available
> through the pinctrl API for configuration of pins by the Devicetree and
> other drivers.
> 
> Expose all configurations currently implemented through the GPIO API so
> they can also be set from userspace, which is particularly useful to
> allow testing them from userspace.
> 
> Signed-off-by: N?colas F. R. A. Prado <nfraprado at collabora.com>
> ---
>   drivers/pinctrl/mediatek/pinctrl-paris.c | 20 ++++++++++----------

You can do the same for pinctrl-moore too, it's trivial.

Other than that, I agree about performing this change, as this may be useful
for more than just testing.

Cheers,
Angelo

>   1 file changed, 10 insertions(+), 10 deletions(-)
> 
> diff --git a/drivers/pinctrl/mediatek/pinctrl-paris.c b/drivers/pinctrl/mediatek/pinctrl-paris.c
> index e12316c42698..668f8055a544 100644
> --- a/drivers/pinctrl/mediatek/pinctrl-paris.c
> +++ b/drivers/pinctrl/mediatek/pinctrl-paris.c
> @@ -255,10 +255,9 @@ static int mtk_pinconf_get(struct pinctrl_dev *pctldev,
>   	return err;
>   }
>   
> -static int mtk_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin,
> +static int mtk_pinconf_set(struct mtk_pinctrl *hw, unsigned int pin,
>   			   enum pin_config_param param, u32 arg)
>   {
> -	struct mtk_pinctrl *hw = pinctrl_dev_get_drvdata(pctldev);
>   	const struct mtk_pin_desc *desc;
>   	int err = -ENOTSUPP;
>   	u32 reg;
> @@ -795,7 +794,7 @@ static int mtk_pconf_group_set(struct pinctrl_dev *pctldev, unsigned group,
>   	int i, ret;
>   
>   	for (i = 0; i < num_configs; i++) {
> -		ret = mtk_pinconf_set(pctldev, grp->pin,
> +		ret = mtk_pinconf_set(hw, grp->pin,
>   				      pinconf_to_config_param(configs[i]),
>   				      pinconf_to_config_argument(configs[i]));
>   		if (ret < 0)
> @@ -937,18 +936,19 @@ static int mtk_gpio_set_config(struct gpio_chip *chip, unsigned int offset,
>   {
>   	struct mtk_pinctrl *hw = gpiochip_get_data(chip);
>   	const struct mtk_pin_desc *desc;
> -	u32 debounce;
> +	enum pin_config_param param = pinconf_to_config_param(config);
> +	u32 arg = pinconf_to_config_argument(config);
>   
>   	desc = (const struct mtk_pin_desc *)&hw->soc->pins[offset];
>   
> -	if (!hw->eint ||
> -	    pinconf_to_config_param(config) != PIN_CONFIG_INPUT_DEBOUNCE ||
> -	    desc->eint.eint_n == EINT_NA)
> -		return -ENOTSUPP;
> +	if (param == PIN_CONFIG_INPUT_DEBOUNCE) {
> +		if (!hw->eint || desc->eint.eint_n == EINT_NA)
> +			return -ENOTSUPP;
>   
> -	debounce = pinconf_to_config_argument(config);
> +		return mtk_eint_set_debounce(hw->eint, desc->eint.eint_n, arg);
> +	}
>   
> -	return mtk_eint_set_debounce(hw->eint, desc->eint.eint_n, debounce);
> +	return mtk_pinconf_set(hw, offset, param, arg);
>   }
>   
>   static int mtk_build_gpiochip(struct mtk_pinctrl *hw)
> 





From pablo.sun at mediatek.com  Wed Sep 11 03:35:48 2024
From: pablo.sun at mediatek.com (Pablo Sun)
Date: Wed, 11 Sep 2024 18:35:48 +0800
Subject: [PATCH] arm64: dts: mediatek: mt8395-genio-1200-evk: Enable GPU
In-Reply-To: <01020191e04d4237-204596e1-6cc1-491c-a60f-de3917af7d42-000000@eu-west-1.amazonses.com>
References: <20240910143245.5282-1-pablo.sun@mediatek.com>
 <01020191e04d4237-204596e1-6cc1-491c-a60f-de3917af7d42-000000@eu-west-1.amazonses.com>
Message-ID: <2fd45240-a341-806b-f336-78d0595a8031@mediatek.com>

Hi Angelo,

Thanks for the review,

On 9/11/24 16:57, AngeloGioacchino Del Regno wrote:

[snip]

>> +/* for GPU SRAM */
>> +&mt6359_vsram_others_ldo_reg {
>> +??? regulator-always-on;
> 
> No, that's not good. Like that, the GPU VSRAM will be subject to current 
> leakage.
> 
> Remove the regulator-always-on property.
> The right way of doing that is to add the vgpu to the mfg0's domain 
> supply and
> vsram to mfg1; that way all of the GPU regulators will be off at PM 
> suspend time.

Thanks for pointing this out, I'll send v2 to fix this.

>> ? &mt6359codec {
>> ????? mediatek,mic-type-0 = <1>; /* ACC */
>> ????? mediatek,mic-type-1 = <3>; /* DCC */
>> @@ -839,8 +851,8 @@ regulators {
>> ????????????? mt6315_7_vbuck1: vbuck1 {
>> ????????????????? regulator-compatible = "vbuck1";
>> ????????????????? regulator-name = "Vgpu";
>> -??????????????? regulator-min-microvolt = <300000>;
>> -??????????????? regulator-max-microvolt = <1193750>;
>> +??????????????? regulator-min-microvolt = <546000>;
> 
> I'm okay with this constraint but are you sure that MTK-SVS won't go any 
> lower than 0.546V?

I'll see if I could confirm the maximum voltage drop that may be lowered 
by mtk-svs for MT8395. There are 3 constraints that I am aware of:

- capability of Vgpu buck: 0.3V-1.193V
- sign-off voltage of the EVK board: 0.6V to 1.2V
- recommended operating voltage of MT8395 DVDD_GPU: 0.546V to 0.787V

For the device tree of the board, would you recommend set the regulator 
voltage constraints in narrower range (because it's safer to keep in 
recommended operating conditions), or in a wider range (leaving the 
check to driver software for potential power saving?)

Thanks




From angelogioacchino.delregno at collabora.com  Wed Sep 11 03:43:27 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Wed, 11 Sep 2024 12:43:27 +0200
Subject: [PATCH] dt-bindings: mailbox: mediatek,gce-mailbox: Stop requiring clock-names
Message-ID: <20240911104327.123602-1-angelogioacchino.delregno@collabora.com>

There is no reason to make specifying the clock-names property
mandatory, as the Global Command Engine HW needs only one clock.

Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
---
 .../bindings/mailbox/mediatek,gce-mailbox.yaml        | 11 -----------
 1 file changed, 11 deletions(-)

diff --git a/Documentation/devicetree/bindings/mailbox/mediatek,gce-mailbox.yaml b/Documentation/devicetree/bindings/mailbox/mediatek,gce-mailbox.yaml
index cef9d7601398..ff5d010fbcf0 100644
--- a/Documentation/devicetree/bindings/mailbox/mediatek,gce-mailbox.yaml
+++ b/Documentation/devicetree/bindings/mailbox/mediatek,gce-mailbox.yaml
@@ -56,17 +56,6 @@ required:
   - interrupts
   - clocks
 
-allOf:
-  - if:
-      not:
-        properties:
-          compatible:
-            contains:
-              const: mediatek,mt8195-gce
-    then:
-      required:
-        - clock-names
-
 additionalProperties: false
 
 examples:
-- 
2.46.0



From angelogioacchino.delregno at collabora.com  Wed Sep 11 03:46:22 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Wed, 11 Sep 2024 10:46:22 +0000
Subject: [PATCH 05/13] arm64: dts: mediatek: mt8188: Add missing GCE clock
 names
In-Reply-To: <20240909111535.528624-6-fshao@chromium.org>
References: <20240909111535.528624-1-fshao@chromium.org>
 <20240909111535.528624-6-fshao@chromium.org>
Message-ID: <01020191e0b103c3-00fad6e7-f81f-4a76-a75f-1420574f71df-000000@eu-west-1.amazonses.com>

Il 09/09/24 13:14, Fei Shao ha scritto:
> Add the missing clock-names property for GCE nodes to fix errors from
> `make CHECK_DTBS=y mediatek/mt8188-evb.dtb`.

I've sent a patch [1] relaxing the requirement for clock-names in the binding.
There's no reason to make clock-names mandatory, as there is and there always
will be one single clock for each GCE mailbox - and also the driver is not
trying to get the clock by name, but rather gets the clock at index 0 anyway.

Please drop this patch.

Cheers,
Angelo

[1]: 
https://lore.kernel.org/all/20240911104327.123602-1-angelogioacchino.delregno at collabora.com/

> 
> Signed-off-by: Fei Shao <fshao at chromium.org>
> ---
> 
>   arch/arm64/boot/dts/mediatek/mt8188.dtsi | 2 ++
>   1 file changed, 2 insertions(+)
> 
> diff --git a/arch/arm64/boot/dts/mediatek/mt8188.dtsi b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
> index 445d30eee2a1..2900d78b7ceb 100644
> --- a/arch/arm64/boot/dts/mediatek/mt8188.dtsi
> +++ b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
> @@ -1316,6 +1316,7 @@ gce0: mailbox at 10320000 {
>   			interrupts = <GIC_SPI 226 IRQ_TYPE_LEVEL_HIGH 0>;
>   			#mbox-cells = <2>;
>   			clocks = <&infracfg_ao CLK_INFRA_AO_GCE>;
> +			clock-names = "gce";
>   		};
>   
>   		gce1: mailbox at 10330000 {
> @@ -1324,6 +1325,7 @@ gce1: mailbox at 10330000 {
>   			interrupts = <GIC_SPI 228 IRQ_TYPE_LEVEL_HIGH 0>;
>   			#mbox-cells = <2>;
>   			clocks = <&infracfg_ao CLK_INFRA_AO_GCE2>;
> +			clock-names = "gce";
>   		};
>   
>   		scp: scp at 10500000 {



From fshao at chromium.org  Wed Sep 11 03:51:05 2024
From: fshao at chromium.org (Fei Shao)
Date: Wed, 11 Sep 2024 18:51:05 +0800
Subject: [PATCH v2 0/8] Add platform supports to MediaTek MT8188 SoC
Message-ID: <20240911105131.4094027-1-fshao@chromium.org>

Hi all,

This series is a subset of the previous series[1], focusing on enabling few
platform functionalities on MediaTek MT8188 SoC, including:
- CPU performance controller
- IOMMU / SMI / LARB
- PWM for display backlight
- SPMI for PMIC control
- audio
- socinfo

along with the corresponding binding changes (acked in the previous series).

[1]: https://lore.kernel.org/all/20240909111535.528624-1-fshao at chromium.org/

Regards,
Fei

Changes in v2:
- Replace hardcoded AFE reset ID with correct definition
- Added socinfo nodes in v2

Fei Shao (8):
  dt-bindings: spmi: spmi-mtk-pmif: Add compatible for MT8188
  dt-bindings: mailbox: mtk,adsp-mbox: Add compatible for MT8188
  arm64: dts: mediatek: mt8188: Add CPU performance controller for
    CPUFreq
  arm64: dts: mediatek: mt8188: Add SMI/LARB/IOMMU support
  arm64: dts: mediatek: mt8188: Add PWM nodes for display backlight
  arm64: dts: mediatek: mt8188: Add SPMI support for PMIC control
  arm64: dts: mediatek: mt8188: Add audio support
  arm64: dts: mediatek: mt8188: Add socinfo nodes

 .../bindings/mailbox/mtk,adsp-mbox.yaml       |  12 +-
 .../bindings/spmi/mtk,spmi-mtk-pmif.yaml      |   1 +
 arch/arm64/boot/dts/mediatek/mt8188.dtsi      | 321 ++++++++++++++++++
 3 files changed, 331 insertions(+), 3 deletions(-)

-- 
2.46.0.598.g6f2099f65c-goog



From fshao at chromium.org  Wed Sep 11 03:51:06 2024
From: fshao at chromium.org (Fei Shao)
Date: Wed, 11 Sep 2024 18:51:06 +0800
Subject: [PATCH v2 1/8] dt-bindings: spmi: spmi-mtk-pmif: Add compatible for MT8188
In-Reply-To: <20240911105131.4094027-1-fshao@chromium.org>
References: <20240911105131.4094027-1-fshao@chromium.org>
Message-ID: <20240911105131.4094027-2-fshao@chromium.org>

Add compatible string for the SPMI block on MT8188 SoC, which is
compatible with the one used on MT8195.

Acked-by: Stephen Boyd <sboyd at kernel.org>
Acked-by: Rob Herring (Arm) <robh at kernel.org>
Signed-off-by: Fei Shao <fshao at chromium.org>
---

(no changes since v1)

 Documentation/devicetree/bindings/spmi/mtk,spmi-mtk-pmif.yaml | 1 +
 1 file changed, 1 insertion(+)

diff --git a/Documentation/devicetree/bindings/spmi/mtk,spmi-mtk-pmif.yaml b/Documentation/devicetree/bindings/spmi/mtk,spmi-mtk-pmif.yaml
index ac99883a3f29..7f0be0ac644a 100644
--- a/Documentation/devicetree/bindings/spmi/mtk,spmi-mtk-pmif.yaml
+++ b/Documentation/devicetree/bindings/spmi/mtk,spmi-mtk-pmif.yaml
@@ -25,6 +25,7 @@ properties:
       - items:
           - enum:
               - mediatek,mt8186-spmi
+              - mediatek,mt8188-spmi
           - const: mediatek,mt8195-spmi
 
   reg:
-- 
2.46.0.598.g6f2099f65c-goog



From fshao at chromium.org  Wed Sep 11 03:51:07 2024
From: fshao at chromium.org (Fei Shao)
Date: Wed, 11 Sep 2024 18:51:07 +0800
Subject: [PATCH v2 2/8] dt-bindings: mailbox: mtk,adsp-mbox: Add compatible for MT8188
In-Reply-To: <20240911105131.4094027-1-fshao@chromium.org>
References: <20240911105131.4094027-1-fshao@chromium.org>
Message-ID: <20240911105131.4094027-3-fshao@chromium.org>

Add compatible string for ADSP mailbox on MT8188 SoC, which is
compatible with the one used on MT8186.

Acked-by: Rob Herring (Arm) <robh at kernel.org>
Signed-off-by: Fei Shao <fshao at chromium.org>
---

(no changes since v1)

 .../devicetree/bindings/mailbox/mtk,adsp-mbox.yaml   | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

diff --git a/Documentation/devicetree/bindings/mailbox/mtk,adsp-mbox.yaml b/Documentation/devicetree/bindings/mailbox/mtk,adsp-mbox.yaml
index 72c1d9e82c89..8a1369df4ecb 100644
--- a/Documentation/devicetree/bindings/mailbox/mtk,adsp-mbox.yaml
+++ b/Documentation/devicetree/bindings/mailbox/mtk,adsp-mbox.yaml
@@ -17,9 +17,15 @@ description: |
 
 properties:
   compatible:
-    enum:
-      - mediatek,mt8195-adsp-mbox
-      - mediatek,mt8186-adsp-mbox
+    oneOf:
+      - enum:
+          - mediatek,mt8186-adsp-mbox
+          - mediatek,mt8195-adsp-mbox
+      - items:
+          - enum:
+              - mediatek,mt8188-adsp-mbox
+          - const: mediatek,mt8186-adsp-mbox
+
 
   "#mbox-cells":
     const: 0
-- 
2.46.0.598.g6f2099f65c-goog



From fshao at chromium.org  Wed Sep 11 03:51:08 2024
From: fshao at chromium.org (Fei Shao)
Date: Wed, 11 Sep 2024 18:51:08 +0800
Subject: [PATCH v2 3/8] arm64: dts: mediatek: mt8188: Add CPU performance controller for CPUFreq
In-Reply-To: <20240911105131.4094027-1-fshao@chromium.org>
References: <20240911105131.4094027-1-fshao@chromium.org>
Message-ID: <20240911105131.4094027-4-fshao@chromium.org>

Add performance controller node and performance-domains properties for
CPUFreq support on MT8188 SoC.

Signed-off-by: Fei Shao <fshao at chromium.org>
---

(no changes since v1)

 arch/arm64/boot/dts/mediatek/mt8188.dtsi | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/arch/arm64/boot/dts/mediatek/mt8188.dtsi b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
index cd27966d2e3c..cdd2fe14effa 100644
--- a/arch/arm64/boot/dts/mediatek/mt8188.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
@@ -41,6 +41,7 @@ cpu0: cpu at 0 {
 			d-cache-line-size = <64>;
 			d-cache-sets = <128>;
 			next-level-cache = <&l2_0>;
+			performance-domains = <&performance 0>;
 			#cooling-cells = <2>;
 		};
 
@@ -59,6 +60,7 @@ cpu1: cpu at 100 {
 			d-cache-line-size = <64>;
 			d-cache-sets = <128>;
 			next-level-cache = <&l2_0>;
+			performance-domains = <&performance 0>;
 			#cooling-cells = <2>;
 		};
 
@@ -77,6 +79,7 @@ cpu2: cpu at 200 {
 			d-cache-line-size = <64>;
 			d-cache-sets = <128>;
 			next-level-cache = <&l2_0>;
+			performance-domains = <&performance 0>;
 			#cooling-cells = <2>;
 		};
 
@@ -95,6 +98,7 @@ cpu3: cpu at 300 {
 			d-cache-line-size = <64>;
 			d-cache-sets = <128>;
 			next-level-cache = <&l2_0>;
+			performance-domains = <&performance 0>;
 			#cooling-cells = <2>;
 		};
 
@@ -113,6 +117,7 @@ cpu4: cpu at 400 {
 			d-cache-line-size = <64>;
 			d-cache-sets = <128>;
 			next-level-cache = <&l2_0>;
+			performance-domains = <&performance 0>;
 			#cooling-cells = <2>;
 		};
 
@@ -131,6 +136,7 @@ cpu5: cpu at 500 {
 			d-cache-line-size = <64>;
 			d-cache-sets = <128>;
 			next-level-cache = <&l2_0>;
+			performance-domains = <&performance 0>;
 			#cooling-cells = <2>;
 		};
 
@@ -149,6 +155,7 @@ cpu6: cpu at 600 {
 			d-cache-line-size = <64>;
 			d-cache-sets = <256>;
 			next-level-cache = <&l2_1>;
+			performance-domains = <&performance 1>;
 			#cooling-cells = <2>;
 		};
 
@@ -167,6 +174,7 @@ cpu7: cpu at 700 {
 			d-cache-line-size = <64>;
 			d-cache-sets = <256>;
 			next-level-cache = <&l2_1>;
+			performance-domains = <&performance 1>;
 			#cooling-cells = <2>;
 		};
 
@@ -880,6 +888,12 @@ soc {
 		compatible = "simple-bus";
 		ranges;
 
+		performance: performance-controller at 11bc10 {
+			compatible = "mediatek,cpufreq-hw";
+			reg = <0 0x0011bc10 0 0x120>, <0 0x0011bd30 0 0x120>;
+			#performance-domain-cells = <1>;
+		};
+
 		gic: interrupt-controller at c000000 {
 			compatible = "arm,gic-v3";
 			#interrupt-cells = <4>;
-- 
2.46.0.598.g6f2099f65c-goog



From fshao at chromium.org  Wed Sep 11 03:51:09 2024
From: fshao at chromium.org (Fei Shao)
Date: Wed, 11 Sep 2024 18:51:09 +0800
Subject: [PATCH v2 4/8] arm64: dts: mediatek: mt8188: Add SMI/LARB/IOMMU support
In-Reply-To: <20240911105131.4094027-1-fshao@chromium.org>
References: <20240911105131.4094027-1-fshao@chromium.org>
Message-ID: <20240911105131.4094027-5-fshao@chromium.org>

Local Arbiter (LARB) is a component of Smart Multimedia Interface (SMI)
that supports IOMMU on the MediaTek SoCs.

Add the following nodes for memory management support on MT8188 SoC:
- one Infra IOMMU
- two Multimedia (MM) IOMMUs of VDO and VPP
- corresponding SMI common and LARB nodes of the MM IOMMUs

Signed-off-by: Fei Shao <fshao at chromium.org>
---

(no changes since v1)

 arch/arm64/boot/dts/mediatek/mt8188.dtsi | 169 +++++++++++++++++++++++
 1 file changed, 169 insertions(+)

diff --git a/arch/arm64/boot/dts/mediatek/mt8188.dtsi b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
index cdd2fe14effa..f746b89c1ec6 100644
--- a/arch/arm64/boot/dts/mediatek/mt8188.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
@@ -9,6 +9,7 @@
 #include <dt-bindings/interrupt-controller/arm-gic.h>
 #include <dt-bindings/interrupt-controller/irq.h>
 #include <dt-bindings/mailbox/mediatek,mt8188-gce.h>
+#include <dt-bindings/memory/mediatek,mt8188-memory-port.h>
 #include <dt-bindings/phy/phy.h>
 #include <dt-bindings/pinctrl/mediatek,mt8188-pinfunc.h>
 #include <dt-bindings/power/mediatek,mt8188-power.h>
@@ -1305,6 +1306,13 @@ pwrap: pwrap at 10024000 {
 			clock-names = "spi", "wrap";
 		};
 
+		infra_iommu: iommu at 10315000 {
+			compatible = "mediatek,mt8188-iommu-infra";
+			reg = <0 0x10315000 0 0x1000>;
+			interrupts = <GIC_SPI 795 IRQ_TYPE_LEVEL_HIGH 0>;
+			#iommu-cells = <1>;
+		};
+
 		gce0: mailbox at 10320000 {
 			compatible = "mediatek,mt8188-gce";
 			reg = <0 0x10320000 0 0x4000>;
@@ -1798,6 +1806,37 @@ vppsys0: clock-controller at 14000000 {
 			#clock-cells = <1>;
 		};
 
+		vpp_smi_common: smi at 14012000 {
+			compatible = "mediatek,mt8188-smi-common-vpp";
+			reg = <0 0x14012000 0 0x1000>;
+			clocks = <&vppsys0 CLK_VPP0_SMI_COMMON_LARB4>,
+				 <&vppsys0 CLK_VPP0_SMI_SUB_COMMON_REORDER>;
+			clock-names = "apb", "smi";
+			power-domains = <&spm MT8188_POWER_DOMAIN_VPPSYS0>;
+		};
+
+		larb4: smi at 14013000 {
+			compatible = "mediatek,mt8188-smi-larb";
+			reg = <0 0x14013000 0 0x1000>;
+			clocks = <&vppsys0 CLK_VPP0_SMI_COMMON_LARB4>,
+				 <&vppsys0 CLK_VPP0_SMI_COMMON_LARB4>;
+			clock-names = "apb", "smi";
+			power-domains = <&spm MT8188_POWER_DOMAIN_VPPSYS0>;
+			mediatek,larb-id = <SMI_L4_ID>;
+			mediatek,smi = <&vpp_smi_common>;
+		};
+
+		vpp_iommu: iommu at 14018000 {
+			compatible = "mediatek,mt8188-iommu-vpp";
+			reg = <0 0x14018000 0 0x5000>;
+			clocks = <&vppsys0 CLK_VPP0_SMI_IOMMU>;
+			clock-names = "bclk";
+			interrupts = <GIC_SPI 594 IRQ_TYPE_LEVEL_HIGH 0>;
+			power-domains = <&spm MT8188_POWER_DOMAIN_VPPSYS0>;
+			#iommu-cells = <1>;
+			mediatek,larbs = <&larb1 &larb3 &larb4 &larb6 &larb7 &larb23>;
+		};
+
 		wpesys: clock-controller at 14e00000 {
 			compatible = "mediatek,mt8188-wpesys";
 			reg = <0 0x14e00000 0 0x1000>;
@@ -1810,12 +1849,45 @@ wpesys_vpp0: clock-controller at 14e02000 {
 			#clock-cells = <1>;
 		};
 
+		larb7: smi at 14e04000 {
+			compatible = "mediatek,mt8188-smi-larb";
+			reg = <0 0x14e04000 0 0x1000>;
+			clocks = <&wpesys CLK_WPE_TOP_SMI_LARB7>,
+				 <&wpesys CLK_WPE_TOP_SMI_LARB7>;
+			clock-names = "apb", "smi";
+			power-domains = <&spm MT8188_POWER_DOMAIN_WPE>;
+			mediatek,larb-id = <SMI_L7_ID>;
+			mediatek,smi = <&vpp_smi_common>;
+		};
+
 		vppsys1: clock-controller at 14f00000 {
 			compatible = "mediatek,mt8188-vppsys1";
 			reg = <0 0x14f00000 0 0x1000>;
 			#clock-cells = <1>;
 		};
 
+		larb5: smi at 14f02000 {
+			compatible = "mediatek,mt8188-smi-larb";
+			reg = <0 0x14f02000 0 0x1000>;
+			clocks = <&vppsys1 CLK_VPP1_GALS5>,
+				 <&vppsys1 CLK_VPP1_LARB5>;
+			clock-names = "apb", "smi";
+			power-domains = <&spm MT8188_POWER_DOMAIN_VPPSYS1>;
+			mediatek,larb-id = <SMI_L5_ID>;
+			mediatek,smi = <&vdo_smi_common>;
+		};
+
+		larb6: smi at 14f03000 {
+			compatible = "mediatek,mt8188-smi-larb";
+			reg = <0 0x14f03000 0 0x1000>;
+			clocks = <&vppsys1 CLK_VPP1_GALS6>,
+				 <&vppsys1 CLK_VPP1_LARB6>;
+			clock-names = "apb", "smi";
+			power-domains = <&spm MT8188_POWER_DOMAIN_VPPSYS1>;
+			mediatek,larb-id = <SMI_L6_ID>;
+			mediatek,smi = <&vpp_smi_common>;
+		};
+
 		imgsys: clock-controller at 15000000 {
 			compatible = "mediatek,mt8188-imgsys";
 			reg = <0 0x15000000 0 0x1000>;
@@ -1894,12 +1966,34 @@ ccusys: clock-controller at 17200000 {
 			#clock-cells = <1>;
 		};
 
+		larb23: smi at 1800d000 {
+			compatible = "mediatek,mt8188-smi-larb";
+			reg = <0 0x1800d000 0 0x1000>;
+			clocks = <&vdecsys_soc CLK_VDEC1_SOC_LARB1>,
+				 <&vdecsys_soc CLK_VDEC1_SOC_LARB1>;
+			clock-names = "apb", "smi";
+			power-domains = <&spm MT8188_POWER_DOMAIN_VDEC0>;
+			mediatek,larb-id = <SMI_L23_ID>;
+			mediatek,smi = <&vpp_smi_common>;
+		};
+
 		vdecsys_soc: clock-controller at 1800f000 {
 			compatible = "mediatek,mt8188-vdecsys-soc";
 			reg = <0 0x1800f000 0 0x1000>;
 			#clock-cells = <1>;
 		};
 
+		larb21: smi at 1802e000 {
+			compatible = "mediatek,mt8188-smi-larb";
+			reg = <0 0x1802e000 0 0x1000>;
+			clocks = <&vdecsys CLK_VDEC2_LARB1>,
+				 <&vdecsys CLK_VDEC2_LARB1>;
+			clock-names = "apb", "smi";
+			power-domains = <&spm MT8188_POWER_DOMAIN_VDEC1>;
+			mediatek,larb-id = <SMI_L21_ID>;
+			mediatek,smi = <&vdo_smi_common>;
+		};
+
 		vdecsys: clock-controller at 1802f000 {
 			compatible = "mediatek,mt8188-vdecsys";
 			reg = <0 0x1802f000 0 0x1000>;
@@ -1912,6 +2006,17 @@ vencsys: clock-controller at 1a000000 {
 			#clock-cells = <1>;
 		};
 
+		larb19: smi at 1a010000 {
+			compatible = "mediatek,mt8188-smi-larb";
+			reg = <0 0x1a010000 0 0x1000>;
+			clocks = <&vencsys CLK_VENC1_VENC>,
+				 <&vencsys CLK_VENC1_VENC>;
+			clock-names = "apb", "smi";
+			power-domains = <&spm MT8188_POWER_DOMAIN_VENC>;
+			mediatek,larb-id = <SMI_L19_ID>;
+			mediatek,smi = <&vdo_smi_common>;
+		};
+
 		vdosys0: syscon at 1c01d000 {
 			compatible = "mediatek,mt8188-vdosys0", "syscon";
 			reg = <0 0x1c01d000 0 0x1000>;
@@ -1920,6 +2025,48 @@ vdosys0: syscon at 1c01d000 {
 			mediatek,gce-client-reg = <&gce0 SUBSYS_1c01XXXX 0xd000 0x1000>;
 		};
 
+		larb0: smi at 1c022000 {
+			compatible = "mediatek,mt8188-smi-larb";
+			reg = <0 0x1c022000 0 0x1000>;
+			clocks = <&vdosys0 CLK_VDO0_SMI_LARB>,
+				 <&vdosys0 CLK_VDO0_SMI_LARB>;
+			clock-names = "apb", "smi";
+			power-domains = <&spm MT8188_POWER_DOMAIN_VDOSYS0>;
+			mediatek,larb-id = <SMI_L0_ID>;
+			mediatek,smi = <&vdo_smi_common>;
+		};
+
+		larb1: smi at 1c023000 {
+			compatible = "mediatek,mt8188-smi-larb";
+			reg = <0 0x1c023000 0 0x1000>;
+			clocks = <&vdosys0 CLK_VDO0_SMI_LARB>,
+				 <&vdosys0 CLK_VDO0_SMI_LARB>;
+			clock-names = "apb", "smi";
+			power-domains = <&spm MT8188_POWER_DOMAIN_VDOSYS0>;
+			mediatek,larb-id = <SMI_L1_ID>;
+			mediatek,smi = <&vpp_smi_common>;
+		};
+
+		vdo_smi_common: smi at 1c024000 {
+			compatible = "mediatek,mt8188-smi-common-vdo";
+			reg = <0 0x1c024000 0 0x1000>;
+			clocks = <&vdosys0 CLK_VDO0_SMI_COMMON>,
+				 <&vdosys0 CLK_VDO0_SMI_GALS>;
+			clock-names = "apb", "smi";
+			power-domains = <&spm MT8188_POWER_DOMAIN_VDOSYS0>;
+		};
+
+		vdo_iommu: iommu at 1c028000 {
+			compatible = "mediatek,mt8188-iommu-vdo";
+			reg = <0 0x1c028000 0 0x5000>;
+			clocks = <&vdosys0 CLK_VDO0_SMI_IOMMU>;
+			clock-names = "bclk";
+			interrupts = <GIC_SPI 673 IRQ_TYPE_LEVEL_HIGH 0>;
+			power-domains = <&spm MT8188_POWER_DOMAIN_VDOSYS0>;
+			#iommu-cells = <1>;
+			mediatek,larbs = <&larb0 &larb2 &larb5 &larb19 &larb21>;
+		};
+
 		vdosys1: syscon at 1c100000 {
 			compatible = "mediatek,mt8188-vdosys1", "syscon";
 			reg = <0 0x1c100000 0 0x1000>;
@@ -1928,5 +2075,27 @@ vdosys1: syscon at 1c100000 {
 			mboxes = <&gce0 1 CMDQ_THR_PRIO_4>;
 			mediatek,gce-client-reg = <&gce0 SUBSYS_1c10XXXX 0 0x1000>;
 		};
+
+		larb2: smi at 1c102000 {
+			compatible = "mediatek,mt8188-smi-larb";
+			reg = <0 0x1c102000 0 0x1000>;
+			clocks = <&vdosys1 CLK_VDO1_SMI_LARB2>,
+				 <&vdosys1 CLK_VDO1_SMI_LARB2>;
+			clock-names = "apb", "smi";
+			power-domains = <&spm MT8188_POWER_DOMAIN_VDOSYS1>;
+			mediatek,larb-id = <SMI_L2_ID>;
+			mediatek,smi = <&vdo_smi_common>;
+		};
+
+		larb3: smi at 1c103000 {
+			compatible = "mediatek,mt8188-smi-larb";
+			reg = <0 0x1c103000 0 0x1000>;
+			clocks = <&vdosys1 CLK_VDO1_SMI_LARB3>,
+				 <&vdosys1 CLK_VDO1_SMI_LARB3>;
+			clock-names = "apb", "smi";
+			power-domains = <&spm MT8188_POWER_DOMAIN_VDOSYS1>;
+			mediatek,larb-id = <SMI_L3_ID>;
+			mediatek,smi = <&vpp_smi_common>;
+		};
 	};
 };
-- 
2.46.0.598.g6f2099f65c-goog



From fshao at chromium.org  Wed Sep 11 03:51:10 2024
From: fshao at chromium.org (Fei Shao)
Date: Wed, 11 Sep 2024 18:51:10 +0800
Subject: [PATCH v2 5/8] arm64: dts: mediatek: mt8188: Add PWM nodes for display backlight
In-Reply-To: <20240911105131.4094027-1-fshao@chromium.org>
References: <20240911105131.4094027-1-fshao@chromium.org>
Message-ID: <20240911105131.4094027-6-fshao@chromium.org>

Add two hardware PWM nodes for display backlight usage on MT8188 SoC,
and mark them as disabled by default.
Boards can enable the necessary PWM node as needed.

Signed-off-by: Fei Shao <fshao at chromium.org>
---

(no changes since v1)

 arch/arm64/boot/dts/mediatek/mt8188.dtsi | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

diff --git a/arch/arm64/boot/dts/mediatek/mt8188.dtsi b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
index f746b89c1ec6..61530f8c5599 100644
--- a/arch/arm64/boot/dts/mediatek/mt8188.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
@@ -1418,6 +1418,28 @@ lvts_ap: thermal-sensor at 1100b000 {
 			#thermal-sensor-cells = <1>;
 		};
 
+		disp_pwm0: pwm at 1100e000 {
+			compatible = "mediatek,mt8188-disp-pwm", "mediatek,mt8183-disp-pwm";
+			reg = <0 0x1100e000 0 0x1000>;
+			clocks = <&topckgen CLK_TOP_DISP_PWM0>,
+				 <&infracfg_ao CLK_INFRA_AO_DISP_PWM>;
+			clock-names = "main", "mm";
+			interrupts = <GIC_SPI 203 IRQ_TYPE_LEVEL_HIGH 0>;
+			#pwm-cells = <2>;
+			status = "disabled";
+		};
+
+		disp_pwm1: pwm at 1100f000 {
+			compatible = "mediatek,mt8188-disp-pwm", "mediatek,mt8183-disp-pwm";
+			reg = <0 0x1100f000 0 0x1000>;
+			clocks = <&topckgen CLK_TOP_DISP_PWM1>,
+				 <&infracfg_ao CLK_INFRA_AO_DISP_PWM1>;
+			clock-names = "main", "mm";
+			interrupts = <GIC_SPI 793 IRQ_TYPE_LEVEL_HIGH 0>;
+			#pwm-cells = <2>;
+			status = "disabled";
+		};
+
 		spi1: spi at 11010000 {
 			compatible = "mediatek,mt8188-spi-ipm", "mediatek,spi-ipm";
 			#address-cells = <1>;
-- 
2.46.0.598.g6f2099f65c-goog



From fshao at chromium.org  Wed Sep 11 03:51:11 2024
From: fshao at chromium.org (Fei Shao)
Date: Wed, 11 Sep 2024 18:51:11 +0800
Subject: [PATCH v2 6/8] arm64: dts: mediatek: mt8188: Add SPMI support for PMIC control
In-Reply-To: <20240911105131.4094027-1-fshao@chromium.org>
References: <20240911105131.4094027-1-fshao@chromium.org>
Message-ID: <20240911105131.4094027-7-fshao@chromium.org>

Add SPMI node for PMIC control on MT8188 SoC.

Signed-off-by: Fei Shao <fshao at chromium.org>
---

(no changes since v1)

 arch/arm64/boot/dts/mediatek/mt8188.dtsi | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/arch/arm64/boot/dts/mediatek/mt8188.dtsi b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
index 61530f8c5599..32e5b7108f6a 100644
--- a/arch/arm64/boot/dts/mediatek/mt8188.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
@@ -1306,6 +1306,18 @@ pwrap: pwrap at 10024000 {
 			clock-names = "spi", "wrap";
 		};
 
+		spmi: spmi at 10027000 {
+			compatible = "mediatek,mt8188-spmi", "mediatek,mt8195-spmi";
+			reg = <0 0x10027000 0 0x000e00>, <0 0x10029000 0 0x000100>;
+			reg-names = "pmif", "spmimst";
+			assigned-clocks = <&topckgen CLK_TOP_SPMI_M_MST>;
+			assigned-clock-parents = <&topckgen CLK_TOP_ULPOSC1_D10>;
+			clocks = <&infracfg_ao CLK_INFRA_AO_PMIC_AP>,
+				 <&infracfg_ao CLK_INFRA_AO_PMIC_TMR>,
+				 <&topckgen CLK_TOP_SPMI_M_MST>;
+			clock-names = "pmif_sys_ck", "pmif_tmr_ck", "spmimst_clk_mux";
+		};
+
 		infra_iommu: iommu at 10315000 {
 			compatible = "mediatek,mt8188-iommu-infra";
 			reg = <0 0x10315000 0 0x1000>;
-- 
2.46.0.598.g6f2099f65c-goog



From fshao at chromium.org  Wed Sep 11 03:51:12 2024
From: fshao at chromium.org (Fei Shao)
Date: Wed, 11 Sep 2024 18:51:12 +0800
Subject: [PATCH v2 7/8] arm64: dts: mediatek: mt8188: Add audio support
In-Reply-To: <20240911105131.4094027-1-fshao@chromium.org>
References: <20240911105131.4094027-1-fshao@chromium.org>
Message-ID: <20240911105131.4094027-8-fshao@chromium.org>

Add following nodes to support audio enablement on MT8188 SoC:
- sound card
- audio controller (AFE)
- audio DSP and its associated mailboxes

Signed-off-by: Fei Shao <fshao at chromium.org>
---

Changes in v2:
- Replace hardcoded AFE reset ID with correct definition

 arch/arm64/boot/dts/mediatek/mt8188.dtsi | 96 ++++++++++++++++++++++++
 1 file changed, 96 insertions(+)

diff --git a/arch/arm64/boot/dts/mediatek/mt8188.dtsi b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
index 32e5b7108f6a..f459e86d4024 100644
--- a/arch/arm64/boot/dts/mediatek/mt8188.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
@@ -429,6 +429,11 @@ psci {
 		method = "smc";
 	};
 
+	sound: sound {
+		mediatek,platform = <&afe>;
+		status = "disabled";
+	};
+
 	thermal_zones: thermal-zones {
 		cpu-little0-thermal {
 			polling-delay = <1000>;
@@ -1349,6 +1354,97 @@ scp: scp at 10500000 {
 			interrupts = <GIC_SPI 462 IRQ_TYPE_LEVEL_HIGH 0>;
 		};
 
+		afe: audio-controller at 10b10000 {
+			compatible = "mediatek,mt8188-afe";
+			reg = <0 0x10b10000 0 0x10000>;
+			assigned-clocks = <&topckgen CLK_TOP_A1SYS_HP>;
+			assigned-clock-parents =  <&clk26m>;
+			clocks = <&clk26m>,
+				 <&apmixedsys CLK_APMIXED_APLL1>,
+				 <&apmixedsys CLK_APMIXED_APLL2>,
+				 <&topckgen CLK_TOP_APLL12_CK_DIV0>,
+				 <&topckgen CLK_TOP_APLL12_CK_DIV1>,
+				 <&topckgen CLK_TOP_APLL12_CK_DIV2>,
+				 <&topckgen CLK_TOP_APLL12_CK_DIV3>,
+				 <&topckgen CLK_TOP_APLL12_CK_DIV9>,
+				 <&topckgen CLK_TOP_A1SYS_HP>,
+				 <&topckgen CLK_TOP_AUD_INTBUS>,
+				 <&topckgen CLK_TOP_AUDIO_H>,
+				 <&topckgen CLK_TOP_AUDIO_LOCAL_BUS>,
+				 <&topckgen CLK_TOP_DPTX>,
+				 <&topckgen CLK_TOP_I2SO1>,
+				 <&topckgen CLK_TOP_I2SO2>,
+				 <&topckgen CLK_TOP_I2SI1>,
+				 <&topckgen CLK_TOP_I2SI2>,
+				 <&adsp_audio26m CLK_AUDIODSP_AUDIO26M>,
+				 <&topckgen CLK_TOP_APLL1_D4>,
+				 <&topckgen CLK_TOP_APLL2_D4>,
+				 <&topckgen CLK_TOP_APLL12_CK_DIV4>,
+				 <&topckgen CLK_TOP_A2SYS>,
+				 <&topckgen CLK_TOP_AUD_IEC>;
+			clock-names = "clk26m",
+				      "apll1",
+				      "apll2",
+				      "apll12_div0",
+				      "apll12_div1",
+				      "apll12_div2",
+				      "apll12_div3",
+				      "apll12_div9",
+				      "top_a1sys_hp",
+				      "top_aud_intbus",
+				      "top_audio_h",
+				      "top_audio_local_bus",
+				      "top_dptx",
+				      "top_i2so1",
+				      "top_i2so2",
+				      "top_i2si1",
+				      "top_i2si2",
+				      "adsp_audio_26m",
+				      "apll1_d4",
+				      "apll2_d4",
+				      "apll12_div4",
+				      "top_a2sys",
+				      "top_aud_iec";
+			interrupts = <GIC_SPI 822 IRQ_TYPE_LEVEL_HIGH 0>;
+			power-domains = <&spm MT8188_POWER_DOMAIN_AUDIO>;
+			resets = <&watchdog MT8188_TOPRGU_AUDIO_SW_RST>;
+			reset-names = "audiosys";
+			mediatek,infracfg = <&infracfg_ao>;
+			mediatek,topckgen = <&topckgen>;
+			status = "disabled";
+		};
+
+		adsp: adsp at 10b80000 {
+			compatible = "mediatek,mt8188-dsp";
+			reg = <0 0x10b80000 0 0x2000>,
+			      <0 0x10d00000 0 0x80000>,
+			      <0 0x10b8b000 0 0x100>,
+			      <0 0x10b8f000 0 0x1000>;
+			reg-names = "cfg", "sram", "sec", "bus";
+			assigned-clocks = <&topckgen CLK_TOP_ADSP>;
+			clocks = <&topckgen CLK_TOP_ADSP>,
+				 <&topckgen CLK_TOP_AUDIO_LOCAL_BUS>;
+			clock-names = "audiodsp", "adsp_bus";
+			mboxes = <&adsp_mailbox0>, <&adsp_mailbox1>;
+			mbox-names = "rx", "tx";
+			power-domains = <&spm MT8188_POWER_DOMAIN_ADSP>;
+			status = "disabled";
+		};
+
+		adsp_mailbox0: mailbox at 10b86000 {
+			compatible = "mediatek,mt8188-adsp-mbox", "mediatek,mt8186-adsp-mbox";
+			reg = <0 0x10b86100 0 0x1000>;
+			interrupts = <GIC_SPI 478 IRQ_TYPE_LEVEL_HIGH 0>;
+			#mbox-cells = <0>;
+		};
+
+		adsp_mailbox1: mailbox at 10b87000 {
+			compatible = "mediatek,mt8188-adsp-mbox", "mediatek,mt8186-adsp-mbox";
+			reg = <0 0x10b87100 0 0x1000>;
+			interrupts = <GIC_SPI 479 IRQ_TYPE_LEVEL_HIGH 0>;
+			#mbox-cells = <0>;
+		};
+
 		adsp_audio26m: clock-controller at 10b91100 {
 			compatible = "mediatek,mt8188-adsp-audio26m";
 			reg = <0 0x10b91100 0 0x100>;
-- 
2.46.0.598.g6f2099f65c-goog



From fshao at chromium.org  Wed Sep 11 03:51:13 2024
From: fshao at chromium.org (Fei Shao)
Date: Wed, 11 Sep 2024 18:51:13 +0800
Subject: [PATCH v2 8/8] arm64: dts: mediatek: mt8188: Add socinfo nodes
In-Reply-To: <20240911105131.4094027-1-fshao@chromium.org>
References: <20240911105131.4094027-1-fshao@chromium.org>
Message-ID: <20240911105131.4094027-9-fshao@chromium.org>

Add two socinfo efuse data nodes for the SoC information probing on
MT8188.

Signed-off-by: Fei Shao <fshao at chromium.org>
---

Changes in v2:
- Added socinfo nodes in v2

 arch/arm64/boot/dts/mediatek/mt8188.dtsi | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/arch/arm64/boot/dts/mediatek/mt8188.dtsi b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
index f459e86d4024..37fd16691ec7 100644
--- a/arch/arm64/boot/dts/mediatek/mt8188.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
@@ -1904,6 +1904,14 @@ efuse: efuse at 11f20000 {
 			lvts_efuse_data1: lvts1-calib at 1ac {
 				reg = <0x1ac 0x40>;
 			};
+
+			socinfo-data1 at 7a0 {
+				reg = <0x7a0 0x4>;
+			};
+
+			socinfo-data2 at 7e0 {
+				reg = <0x7e0 0x4>;
+			};
 		};
 
 		gpu: gpu at 13000000 {
-- 
2.46.0.598.g6f2099f65c-goog



From broonie at kernel.org  Wed Sep 11 03:52:58 2024
From: broonie at kernel.org (Mark Brown)
Date: Wed, 11 Sep 2024 11:52:58 +0100
Subject: [PATCH] ASoC: mt8365: Fix using uninitialized value "i2s_data"
 issue
In-Reply-To: <20240911001516.47268-1-qianqiang.liu@163.com>
References: <20240911001516.47268-1-qianqiang.liu@163.com>
Message-ID: <9ea8731a-7888-40a2-a183-4598884bbb27@sirena.org.uk>

On Wed, Sep 11, 2024 at 08:15:17AM +0800, Qianqiang Liu wrote:

>  
>  	spin_lock_irqsave(&afe_priv->afe_ctrl_lock, flags);
>  
> +	if (!i2s_data) {
> +		spin_unlock_irqrestore(&afe_priv->afe_ctrl_lock, flags);
> +		return;
> +	}
> +

Why would we look up i2s_data without the lock, take the lock, then
check if we actually found it?  That doesn't seem right.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-mediatek/attachments/20240911/d21d91d4/attachment-0001.sig>

From fshao at chromium.org  Wed Sep 11 03:56:11 2024
From: fshao at chromium.org (Fei Shao)
Date: Wed, 11 Sep 2024 18:56:11 +0800
Subject: [PATCH 05/13] arm64: dts: mediatek: mt8188: Add missing GCE clock names
In-Reply-To: <01020191e0b103c3-00fad6e7-f81f-4a76-a75f-1420574f71df-000000@eu-west-1.amazonses.com>
References: <20240909111535.528624-1-fshao@chromium.org> <20240909111535.528624-6-fshao@chromium.org>
 <01020191e0b103c3-00fad6e7-f81f-4a76-a75f-1420574f71df-000000@eu-west-1.amazonses.com>
Message-ID: <CAC=S1ng5+K5Rn7b6XVfm6rcJnBH4Ggm8vybSSeRgDX2tdv-VDw@mail.gmail.com>

On Wed, Sep 11, 2024 at 6:46?PM AngeloGioacchino Del Regno
<angelogioacchino.delregno at collabora.com> wrote:
>
> Il 09/09/24 13:14, Fei Shao ha scritto:
> > Add the missing clock-names property for GCE nodes to fix errors from
> > `make CHECK_DTBS=y mediatek/mt8188-evb.dtb`.
>
> I've sent a patch [1] relaxing the requirement for clock-names in the binding.
> There's no reason to make clock-names mandatory, as there is and there always
> will be one single clock for each GCE mailbox - and also the driver is not
> trying to get the clock by name, but rather gets the clock at index 0 anyway.
>
> Please drop this patch.

Acknowledged. I'll drop this in the next revision.

Thanks,
Fei


From dan.carpenter at linaro.org  Wed Sep 11 04:02:40 2024
From: dan.carpenter at linaro.org (Dan Carpenter)
Date: Wed, 11 Sep 2024 14:02:40 +0300
Subject: [bug report] drm/mediatek: Add mbox_free_channel in
 mtk_drm_crtc_destroy
Message-ID: <77b85cdc-ecfe-42c7-a3f3-a757566b6f5f@stanley.mountain>

Hello jason-jh.lin,

Commit 593b655f0523 ("drm/mediatek: Add mbox_free_channel in
mtk_drm_crtc_destroy") from Oct 28, 2021 (linux-next), leads to the
following Smatch static checker warning:

	drivers/gpu/drm/mediatek/mtk_crtc.c:132 mtk_crtc_destroy()
	warn: variable dereferenced before check 'mtk_crtc->cmdq_client.chan' (see line 130)

drivers/gpu/drm/mediatek/mtk_crtc.c
    123 static void mtk_crtc_destroy(struct drm_crtc *crtc)
    124 {
    125         struct mtk_crtc *mtk_crtc = to_mtk_crtc(crtc);
    126         int i;
    127 
    128         mtk_mutex_put(mtk_crtc->mutex);
    129 #if IS_REACHABLE(CONFIG_MTK_CMDQ)
    130         cmdq_pkt_destroy(&mtk_crtc->cmdq_client, &mtk_crtc->cmdq_handle);
                                 ^^^^^^^^^^^^^^^^^^^^^^
Dereferenced without checking.  We recently refactored these so the dereference
is detectable by static analysis.

    131 
--> 132         if (mtk_crtc->cmdq_client.chan) {
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^
Checked too late.

    133                 mbox_free_channel(mtk_crtc->cmdq_client.chan);
    134                 mtk_crtc->cmdq_client.chan = NULL;
    135         }
    136 #endif
    137 
    138         for (i = 0; i < mtk_crtc->ddp_comp_nr; i++) {
    139                 struct mtk_ddp_comp *comp;
    140 
    141                 comp = mtk_crtc->ddp_comp[i];
    142                 mtk_ddp_comp_unregister_vblank_cb(comp);
    143         }
    144 
    145         drm_crtc_cleanup(crtc);
    146 }

regards,
dan carpenter


From usama.anjum at collabora.com  Wed Sep 11 04:13:07 2024
From: usama.anjum at collabora.com (Muhammad Usama Anjum)
Date: Wed, 11 Sep 2024 16:13:07 +0500
Subject: [PATCH] ASoC: mediatek: mt8365: check validity before usage of i2s_data
Message-ID: <20240911111317.4072349-1-usama.anjum@collabora.com>

There may be a case where i2s_data may not get initialized by the for
loop which will cause the kernel crash. Initialize the i2s_data to NULL
and abort execute if it isn't found.

Fixes: 402bbb13a195 ("ASoC: mediatek: mt8365: Add I2S DAI support")
Signed-off-by: Muhammad Usama Anjum <usama.anjum at collabora.com>
---
 sound/soc/mediatek/mt8365/mt8365-dai-i2s.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/sound/soc/mediatek/mt8365/mt8365-dai-i2s.c b/sound/soc/mediatek/mt8365/mt8365-dai-i2s.c
index 5003fe5e5ccfe..89ba891c2669b 100644
--- a/sound/soc/mediatek/mt8365/mt8365-dai-i2s.c
+++ b/sound/soc/mediatek/mt8365/mt8365-dai-i2s.c
@@ -465,13 +465,16 @@ void mt8365_afe_set_i2s_out_enable(struct mtk_base_afe *afe, bool enable)
 	int i;
 	unsigned long flags;
 	struct mt8365_afe_private *afe_priv = afe->platform_priv;
-	struct mtk_afe_i2s_priv *i2s_data;
+	struct mtk_afe_i2s_priv *i2s_data = NULL;
 
 	for (i = 0; i < DAI_I2S_NUM; i++) {
 		if (mt8365_i2s_priv[i].adda_link)
 			i2s_data = afe_priv->dai_priv[mt8365_i2s_priv[i].id];
 	}
 
+	if (!i2s_data)
+		return;
+
 	spin_lock_irqsave(&afe_priv->afe_ctrl_lock, flags);
 
 	if (enable) {
-- 
2.39.2



From broonie at kernel.org  Wed Sep 11 04:16:09 2024
From: broonie at kernel.org (Mark Brown)
Date: Wed, 11 Sep 2024 12:16:09 +0100
Subject: [PATCH 00/17] regulator: Few constifications of static data
In-Reply-To: <20240909-regulator-const-v1-0-8934704a5787@linaro.org>
References: <20240909-regulator-const-v1-0-8934704a5787@linaro.org>
Message-ID: <172605336975.30061.1450890402175817381.b4-ty@kernel.org>

On Mon, 09 Sep 2024 15:51:11 +0200, Krzysztof Kozlowski wrote:
> Few cleanups (safer code), built tested.  Last two patches should
> probably be tested.
> 
> Best regards,
> Krzysztof
> 

Applied to

   https://git.kernel.org/pub/scm/linux/kernel/git/broonie/regulator.git for-next

Thanks!

[01/17] regulator: da9052: Constify static data
        commit: 9653007e7d878609be205ced4803ca57be341845
[02/17] regulator: da9055: Constify static data
        commit: dfa9e708c63e7833c61f551069d3ff4b03af7895
[03/17] regulator: da9063: Constify static data
        commit: 0601c1e5c4a1162c909675233645889237b003a2
[04/17] regulator: da9121: Constify static data
        commit: b3f1e8e32ef579907fe0c0c9c102bb13883454d6
[05/17] regulator: da9211: Constify static data
        (no commit info)
[06/17] regulator: hi6421: Constify static data
        commit: b94afa51cad448d7d9bcb600ce267153132369ad
[07/17] regulator: hi6421v600: Constify static data
        commit: 5ec424afc95ab2490ae28b3e7756e6e9b271a5f0
[08/17] regulator: tps65023: Constify static data
        commit: 7fb636dc26d6fc532fbc96fc74847afedc128154
[09/17] regulator: max77826: Drop unused 'rdesc' in 'struct max77826_regulator_info'
        commit: 653976707d03f9c8e07f1c7733f27c89a1d5eb1c
[10/17] regulator: max77826: Constify static data
        commit: 96d7ee7cb01203ae0b6078631738754424d89cf8
[11/17] regulator: mtk-dvfsrc: Constify static data
        commit: 90b94a05b6cd54b6ae65d09df86d7b602a228ae1
[12/17] regulator: pcap: Constify static data
        commit: 7f1bfca46b1524a774d03eccd8042935c453843a
[13/17] regulator: pfuze100: Constify static data
        commit: 6f4fd2b8a5c08656d293ed491335747ff3d34104
[14/17] regulator: qcom-refgen: Constify static data
        commit: 7eb5d065ec6725d7da9a4f7ba71b6ff4aaf7eb42
[15/17] regulator: hi6421v530: Drop unused 'eco_microamp'
        commit: e9c7ff34c26d009c2f7c3d51236ed5a808dbc0d7
[16/17] regulator: hi6421v530: Use container_of and constify static data
        commit: 7dd36b3287182bc889953f7741bdcef037109210
[17/17] regulator: max77650: Use container_of and constify static data
        commit: c4d6a804713ac080841d1711a98ae1a6ecaede38

All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.

You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.

If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.

Please add any relevant lists and maintainers to the CCs when replying
to this mail.

Thanks,
Mark



From usama.anjum at collabora.com  Wed Sep 11 04:19:09 2024
From: usama.anjum at collabora.com (Muhammad Usama Anjum)
Date: Wed, 11 Sep 2024 16:19:09 +0500
Subject: [PATCH] ASoc: mediatek: mt8365: Print the ret value
Message-ID: <20240911111917.4091809-1-usama.anjum@collabora.com>

Print the ret value otherwise it is just being set without ever getting
used. The author may have missed printing it.

Fixes: 1bf6dbd75f76 ("ASoc: mediatek: mt8365: Add a specific soundcard for EVK")
Signed-off-by: Muhammad Usama Anjum <usama.anjum at collabora.com>
---
If it isn't useful, the ret value assignment statement can be removed.
---
 sound/soc/mediatek/mt8365/mt8365-mt6357.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/sound/soc/mediatek/mt8365/mt8365-mt6357.c b/sound/soc/mediatek/mt8365/mt8365-mt6357.c
index fef76118f8010..412f5fdd8fc52 100644
--- a/sound/soc/mediatek/mt8365/mt8365-mt6357.c
+++ b/sound/soc/mediatek/mt8365/mt8365-mt6357.c
@@ -258,8 +258,8 @@ static int mt8365_mt6357_gpio_probe(struct snd_soc_card *card)
 							   mt8365_mt6357_pin_str[i]);
 		if (IS_ERR(priv->pin_states[i])) {
 			ret = PTR_ERR(priv->pin_states[i]);
-			dev_warn(card->dev, "No pin state for %s\n",
-				 mt8365_mt6357_pin_str[i]);
+			dev_warn(card->dev, "No pin state(%d) for %s\n",
+				 ret, mt8365_mt6357_pin_str[i]);
 		} else {
 			ret = pinctrl_select_state(priv->pinctrl,
 						   priv->pin_states[i]);
-- 
2.39.2



From angelogioacchino.delregno at collabora.com  Wed Sep 11 04:24:15 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Wed, 11 Sep 2024 11:24:15 +0000
Subject: [PATCH v2 5/8] arm64: dts: mediatek: mt8188: Add PWM nodes for
 display backlight
In-Reply-To: <20240911105131.4094027-6-fshao@chromium.org>
References: <20240911105131.4094027-1-fshao@chromium.org>
 <20240911105131.4094027-6-fshao@chromium.org>
Message-ID: <01020191e0d3b260-aab4dc96-e245-49b8-8b77-494823ddce5e-000000@eu-west-1.amazonses.com>

Il 11/09/24 12:51, Fei Shao ha scritto:
> Add two hardware PWM nodes for display backlight usage on MT8188 SoC,
> and mark them as disabled by default.
> Boards can enable the necessary PWM node as needed.
> 
> Signed-off-by: Fei Shao <fshao at chromium.org>

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>



From angelogioacchino.delregno at collabora.com  Wed Sep 11 04:24:15 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Wed, 11 Sep 2024 11:24:15 +0000
Subject: [PATCH v2 6/8] arm64: dts: mediatek: mt8188: Add SPMI support for
 PMIC control
In-Reply-To: <20240911105131.4094027-7-fshao@chromium.org>
References: <20240911105131.4094027-1-fshao@chromium.org>
 <20240911105131.4094027-7-fshao@chromium.org>
Message-ID: <01020191e0d3af7a-8a1d9882-90d0-4def-a05f-c29e7c479dff-000000@eu-west-1.amazonses.com>

Il 11/09/24 12:51, Fei Shao ha scritto:
> Add SPMI node for PMIC control on MT8188 SoC.
> 
> Signed-off-by: Fei Shao <fshao at chromium.org>
> ---
> 
> (no changes since v1)
> 
>   arch/arm64/boot/dts/mediatek/mt8188.dtsi | 12 ++++++++++++
>   1 file changed, 12 insertions(+)
> 
> diff --git a/arch/arm64/boot/dts/mediatek/mt8188.dtsi b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
> index 61530f8c5599..32e5b7108f6a 100644
> --- a/arch/arm64/boot/dts/mediatek/mt8188.dtsi
> +++ b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
> @@ -1306,6 +1306,18 @@ pwrap: pwrap at 10024000 {
>   			clock-names = "spi", "wrap";
>   		};
>   
> +		spmi: spmi at 10027000 {
> +			compatible = "mediatek,mt8188-spmi", "mediatek,mt8195-spmi";
> +			reg = <0 0x10027000 0 0x000e00>, <0 0x10029000 0 0x000100>;

Please drop leading zeroes on iospace sizes 0xe00 and 0x100, after which:

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>




From angelogioacchino.delregno at collabora.com  Wed Sep 11 04:24:17 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Wed, 11 Sep 2024 11:24:17 +0000
Subject: [PATCH v2 3/8] arm64: dts: mediatek: mt8188: Add CPU performance
 controller for CPUFreq
In-Reply-To: <20240911105131.4094027-4-fshao@chromium.org>
References: <20240911105131.4094027-1-fshao@chromium.org>
 <20240911105131.4094027-4-fshao@chromium.org>
Message-ID: <01020191e0d3b9ef-b15d5d4b-c167-48ff-b34d-ed3cc10b3555-000000@eu-west-1.amazonses.com>

Il 11/09/24 12:51, Fei Shao ha scritto:
> Add performance controller node and performance-domains properties for
> CPUFreq support on MT8188 SoC.
> 
> Signed-off-by: Fei Shao <fshao at chromium.org>

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>




From angelogioacchino.delregno at collabora.com  Wed Sep 11 04:24:22 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Wed, 11 Sep 2024 11:24:22 +0000
Subject: [PATCH v2 1/8] dt-bindings: spmi: spmi-mtk-pmif: Add compatible
 for MT8188
In-Reply-To: <20240911105131.4094027-2-fshao@chromium.org>
References: <20240911105131.4094027-1-fshao@chromium.org>
 <20240911105131.4094027-2-fshao@chromium.org>
Message-ID: <01020191e0d3cd23-55b96d22-80a9-4eca-bc01-f02e5c642544-000000@eu-west-1.amazonses.com>

Il 11/09/24 12:51, Fei Shao ha scritto:
> Add compatible string for the SPMI block on MT8188 SoC, which is
> compatible with the one used on MT8195.
> 
> Acked-by: Stephen Boyd <sboyd at kernel.org>
> Acked-by: Rob Herring (Arm) <robh at kernel.org>
> Signed-off-by: Fei Shao <fshao at chromium.org>

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.dleregno at collabora.com>




From angelogioacchino.delregno at collabora.com  Wed Sep 11 04:24:58 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Wed, 11 Sep 2024 11:24:58 +0000
Subject: [PATCH v2 2/8] dt-bindings: mailbox: mtk,adsp-mbox: Add
 compatible for MT8188
In-Reply-To: <20240911105131.4094027-3-fshao@chromium.org>
References: <20240911105131.4094027-1-fshao@chromium.org>
 <20240911105131.4094027-3-fshao@chromium.org>
Message-ID: <01020191e0d4570b-2178f43c-6912-4722-a0c4-41560dd73643-000000@eu-west-1.amazonses.com>

Il 11/09/24 12:51, Fei Shao ha scritto:
> Add compatible string for ADSP mailbox on MT8188 SoC, which is
> compatible with the one used on MT8186.
> 
> Acked-by: Rob Herring (Arm) <robh at kernel.org>
> Signed-off-by: Fei Shao <fshao at chromium.org>

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>




From angelogioacchino.delregno at collabora.com  Wed Sep 11 04:25:43 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Wed, 11 Sep 2024 11:25:43 +0000
Subject: [PATCH v2 8/8] arm64: dts: mediatek: mt8188: Add socinfo nodes
In-Reply-To: <20240911105131.4094027-9-fshao@chromium.org>
References: <20240911105131.4094027-1-fshao@chromium.org>
 <20240911105131.4094027-9-fshao@chromium.org>
Message-ID: <01020191e0d508d9-18f9aef4-fecc-4486-a8c8-f41bd4784e13-000000@eu-west-1.amazonses.com>

Il 11/09/24 12:51, Fei Shao ha scritto:
> Add two socinfo efuse data nodes for the SoC information probing on
> MT8188.
> 
> Signed-off-by: Fei Shao <fshao at chromium.org>

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>



From angelogioacchino.delregno at collabora.com  Wed Sep 11 04:28:00 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Wed, 11 Sep 2024 11:28:00 +0000
Subject: [PATCH] ASoC: mediatek: mt8365: check validity before usage of
 i2s_data
In-Reply-To: <20240911111317.4072349-1-usama.anjum@collabora.com>
References: <20240911111317.4072349-1-usama.anjum@collabora.com>
Message-ID: <01020191e0d72122-0c833bde-7096-4a90-b81d-84945a57b9aa-000000@eu-west-1.amazonses.com>

Il 11/09/24 13:13, Muhammad Usama Anjum ha scritto:
> There may be a case where i2s_data may not get initialized by the for
> loop which will cause the kernel crash. Initialize the i2s_data to NULL
> and abort execute if it isn't found.
> 
> Fixes: 402bbb13a195 ("ASoC: mediatek: mt8365: Add I2S DAI support")
> Signed-off-by: Muhammad Usama Anjum <usama.anjum at collabora.com>

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>




From qianqiang.liu at 163.com  Wed Sep 11 04:36:33 2024
From: qianqiang.liu at 163.com (Qianqiang Liu)
Date: Wed, 11 Sep 2024 19:36:33 +0800
Subject: [PATCH] ASoC: mt8365: Fix using uninitialized value "i2s_data"
 issue
In-Reply-To: <9ea8731a-7888-40a2-a183-4598884bbb27@sirena.org.uk>
References: <20240911001516.47268-1-qianqiang.liu@163.com>
 <9ea8731a-7888-40a2-a183-4598884bbb27@sirena.org.uk>
Message-ID: <ZuGAwQGPWdpO1-G9@iZbp1asjb3cy8ks0srf007Z>

On Wed, Sep 11, 2024 at 11:52:58AM +0100, Mark Brown wrote:
> On Wed, Sep 11, 2024 at 08:15:17AM +0800, Qianqiang Liu wrote:
> 
> >  
> >  	spin_lock_irqsave(&afe_priv->afe_ctrl_lock, flags);
> >  
> > +	if (!i2s_data) {
> > +		spin_unlock_irqrestore(&afe_priv->afe_ctrl_lock, flags);
> > +		return;
> > +	}
> > +
> 
> Why would we look up i2s_data without the lock, take the lock, then
> check if we actually found it?  That doesn't seem right.

Just check the "i2s_data" is NULL or not.

-- 
Best,
Qianqiang Liu



From broonie at kernel.org  Wed Sep 11 04:41:15 2024
From: broonie at kernel.org (Mark Brown)
Date: Wed, 11 Sep 2024 12:41:15 +0100
Subject: [PATCH] ASoC: mt8365: Fix using uninitialized value "i2s_data"
 issue
In-Reply-To: <ZuGAwQGPWdpO1-G9@iZbp1asjb3cy8ks0srf007Z>
References: <20240911001516.47268-1-qianqiang.liu@163.com>
 <9ea8731a-7888-40a2-a183-4598884bbb27@sirena.org.uk>
 <ZuGAwQGPWdpO1-G9@iZbp1asjb3cy8ks0srf007Z>
Message-ID: <eb21bcab-333d-4ab3-9222-058764ced720@sirena.org.uk>

On Wed, Sep 11, 2024 at 07:36:33PM +0800, Qianqiang Liu wrote:
> On Wed, Sep 11, 2024 at 11:52:58AM +0100, Mark Brown wrote:
> > On Wed, Sep 11, 2024 at 08:15:17AM +0800, Qianqiang Liu wrote:

> > >  	spin_lock_irqsave(&afe_priv->afe_ctrl_lock, flags);

> > > +	if (!i2s_data) {
> > > +		spin_unlock_irqrestore(&afe_priv->afe_ctrl_lock, flags);
> > > +		return;
> > > +	}

> > Why would we look up i2s_data without the lock, take the lock, then
> > check if we actually found it?  That doesn't seem right.

> Just check the "i2s_data" is NULL or not.

That doesn't address my question at all.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-mediatek/attachments/20240911/d011ed3d/attachment.sig>

From angelogioacchino.delregno at collabora.com  Wed Sep 11 04:41:50 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Wed, 11 Sep 2024 11:41:50 +0000
Subject: [PATCH] ASoc: mediatek: mt8365: Print the ret value
In-Reply-To: <20240911111917.4091809-1-usama.anjum@collabora.com>
References: <20240911111917.4091809-1-usama.anjum@collabora.com>
Message-ID: <01020191e0e3cb9f-833b6cb7-1233-4b4d-9b48-bdf446d0ab70-000000@eu-west-1.amazonses.com>

Il 11/09/24 13:19, Muhammad Usama Anjum ha scritto:
> Print the ret value otherwise it is just being set without ever getting
> used. The author may have missed printing it.
> 
> Fixes: 1bf6dbd75f76 ("ASoc: mediatek: mt8365: Add a specific soundcard for EVK")
> Signed-off-by: Muhammad Usama Anjum <usama.anjum at collabora.com>
> ---
> If it isn't useful, the ret value assignment statement can be removed.

Nah, please just remove the ret assignment... and while you're at it, can you also
change that dev_warn() to dev_info()?

That print is actually expected to be seen on some boards, and it may, or may not,
be something to be warned about; this is because some the states are optional, or
actually the only requirement is to have at least one pin group muxed to audio but
not forcefully a specific one (so you may have i2s0 on a board, i2s1 on the other).

Cheers,
Angelo


> ---
>   sound/soc/mediatek/mt8365/mt8365-mt6357.c | 4 ++--
>   1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/sound/soc/mediatek/mt8365/mt8365-mt6357.c b/sound/soc/mediatek/mt8365/mt8365-mt6357.c
> index fef76118f8010..412f5fdd8fc52 100644
> --- a/sound/soc/mediatek/mt8365/mt8365-mt6357.c
> +++ b/sound/soc/mediatek/mt8365/mt8365-mt6357.c
> @@ -258,8 +258,8 @@ static int mt8365_mt6357_gpio_probe(struct snd_soc_card *card)
>   							   mt8365_mt6357_pin_str[i]);
>   		if (IS_ERR(priv->pin_states[i])) {
>   			ret = PTR_ERR(priv->pin_states[i]);
> -			dev_warn(card->dev, "No pin state for %s\n",
> -				 mt8365_mt6357_pin_str[i]);
> +			dev_warn(card->dev, "No pin state(%d) for %s\n",
> +				 ret, mt8365_mt6357_pin_str[i]);
>   		} else {
>   			ret = pinctrl_select_state(priv->pinctrl,
>   						   priv->pin_states[i]);




From qianqiang.liu at 163.com  Wed Sep 11 05:02:38 2024
From: qianqiang.liu at 163.com (Qianqiang Liu)
Date: Wed, 11 Sep 2024 20:02:38 +0800
Subject: [PATCH] ASoC: mt8365: Fix using uninitialized value "i2s_data"
 issue
In-Reply-To: <eb21bcab-333d-4ab3-9222-058764ced720@sirena.org.uk>
References: <20240911001516.47268-1-qianqiang.liu@163.com>
 <9ea8731a-7888-40a2-a183-4598884bbb27@sirena.org.uk>
 <ZuGAwQGPWdpO1-G9@iZbp1asjb3cy8ks0srf007Z>
 <eb21bcab-333d-4ab3-9222-058764ced720@sirena.org.uk>
Message-ID: <ZuGG3jk6oqq7sUMw@iZbp1asjb3cy8ks0srf007Z>

On Wed, Sep 11, 2024 at 12:41:15PM +0100, Mark Brown wrote:
> On Wed, Sep 11, 2024 at 07:36:33PM +0800, Qianqiang Liu wrote:
> > On Wed, Sep 11, 2024 at 11:52:58AM +0100, Mark Brown wrote:
> > > On Wed, Sep 11, 2024 at 08:15:17AM +0800, Qianqiang Liu wrote:
> 
> > > >  	spin_lock_irqsave(&afe_priv->afe_ctrl_lock, flags);
> 
> > > > +	if (!i2s_data) {
> > > > +		spin_unlock_irqrestore(&afe_priv->afe_ctrl_lock, flags);
> > > > +		return;
> > > > +	}
> 
> > > Why would we look up i2s_data without the lock, take the lock, then
> > > check if we actually found it?  That doesn't seem right.
> 
> > Just check the "i2s_data" is NULL or not.
> 
> That doesn't address my question at all.

How about this new patch:

diff --git a/sound/soc/mediatek/mt8365/mt8365-dai-i2s.c b/sound/soc/mediatek/mt8365/mt8365-dai-i2s.c
index 3482d8f8b4e7..11b9a5bc7163 100644
--- a/sound/soc/mediatek/mt8365/mt8365-dai-i2s.c
+++ b/sound/soc/mediatek/mt8365/mt8365-dai-i2s.c
@@ -465,13 +465,16 @@ void mt8365_afe_set_i2s_out_enable(struct mtk_base_afe *afe, bool enable)
 	int i;
 	unsigned long flags;
 	struct mt8365_afe_private *afe_priv = afe->platform_priv;
-	struct mtk_afe_i2s_priv *i2s_data;
+	struct mtk_afe_i2s_priv *i2s_data = NULL;
 
 	for (i = 0; i < DAI_I2S_NUM; i++) {
 		if (mt8365_i2s_priv[i].adda_link)
 			i2s_data = afe_priv->dai_priv[mt8365_i2s_priv[i].id];
 	}
 
+	if (!i2s_data)
+		return;
+
 	spin_lock_irqsave(&afe_priv->afe_ctrl_lock, flags);
 
 	if (enable) {

-- 
Best,
Qianqiang Liu



From broonie at kernel.org  Wed Sep 11 05:07:52 2024
From: broonie at kernel.org (Mark Brown)
Date: Wed, 11 Sep 2024 13:07:52 +0100
Subject: [PATCH] ASoC: mt8365: Fix using uninitialized value "i2s_data"
 issue
In-Reply-To: <ZuGG3jk6oqq7sUMw@iZbp1asjb3cy8ks0srf007Z>
References: <20240911001516.47268-1-qianqiang.liu@163.com>
 <9ea8731a-7888-40a2-a183-4598884bbb27@sirena.org.uk>
 <ZuGAwQGPWdpO1-G9@iZbp1asjb3cy8ks0srf007Z>
 <eb21bcab-333d-4ab3-9222-058764ced720@sirena.org.uk>
 <ZuGG3jk6oqq7sUMw@iZbp1asjb3cy8ks0srf007Z>
Message-ID: <8d921122-7271-451a-8bcb-83a1066b7b87@sirena.org.uk>

On Wed, Sep 11, 2024 at 08:02:38PM +0800, Qianqiang Liu wrote:

> How about this new patch:

That looks good, thanks but an equivalent patch has already been sent
and is in my queue:

    https://lore.kernel.org/r/20240911111317.4072349-1-usama.anjum at collabora.com
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-mediatek/attachments/20240911/9d920a0d/attachment.sig>

From qianqiang.liu at 163.com  Wed Sep 11 05:11:49 2024
From: qianqiang.liu at 163.com (Qianqiang Liu)
Date: Wed, 11 Sep 2024 20:11:49 +0800
Subject: [PATCH] ASoC: mt8365: Fix using uninitialized value "i2s_data"
 issue
In-Reply-To: <8d921122-7271-451a-8bcb-83a1066b7b87@sirena.org.uk>
References: <20240911001516.47268-1-qianqiang.liu@163.com>
 <9ea8731a-7888-40a2-a183-4598884bbb27@sirena.org.uk>
 <ZuGAwQGPWdpO1-G9@iZbp1asjb3cy8ks0srf007Z>
 <eb21bcab-333d-4ab3-9222-058764ced720@sirena.org.uk>
 <ZuGG3jk6oqq7sUMw@iZbp1asjb3cy8ks0srf007Z>
 <8d921122-7271-451a-8bcb-83a1066b7b87@sirena.org.uk>
Message-ID: <ZuGJBQA90j1UB9En@iZbp1asjb3cy8ks0srf007Z>

On Wed, Sep 11, 2024 at 01:07:52PM +0100, Mark Brown wrote:
> On Wed, Sep 11, 2024 at 08:02:38PM +0800, Qianqiang Liu wrote:
> 
> > How about this new patch:
> 
> That looks good, thanks but an equivalent patch has already been sent
> and is in my queue:
> 
>     https://lore.kernel.org/r/20240911111317.4072349-1-usama.anjum at collabora.com

OK, got it, thanks!

-- 
Best,
Qianqiang Liu



From usama.anjum at collabora.com  Wed Sep 11 05:36:22 2024
From: usama.anjum at collabora.com (Muhammad Usama Anjum)
Date: Wed, 11 Sep 2024 17:36:22 +0500
Subject: [PATCH v2] ASoc: mediatek: mt8365: Remove unneeded assignment
Message-ID: <20240911123629.125686-1-usama.anjum@collabora.com>

The ret is being assigned, but not being used. Remove the assignment.
One of the reviewer mentioned that dev_warn should be replaced with
dev_info. Make this change as well.

Fixes: 1bf6dbd75f76 ("ASoc: mediatek: mt8365: Add a specific soundcard for EVK")
Signed-off-by: Muhammad Usama Anjum <usama.anjum at collabora.com>
---
Changes since v1:
- Remove assignment to ret and don't print it from dev_warn
- Change dev_warn to dev_info on request of reviewer
---
 sound/soc/mediatek/mt8365/mt8365-mt6357.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/sound/soc/mediatek/mt8365/mt8365-mt6357.c b/sound/soc/mediatek/mt8365/mt8365-mt6357.c
index fef76118f8010..577f3b1e20a18 100644
--- a/sound/soc/mediatek/mt8365/mt8365-mt6357.c
+++ b/sound/soc/mediatek/mt8365/mt8365-mt6357.c
@@ -257,8 +257,7 @@ static int mt8365_mt6357_gpio_probe(struct snd_soc_card *card)
 		priv->pin_states[i] = pinctrl_lookup_state(priv->pinctrl,
 							   mt8365_mt6357_pin_str[i]);
 		if (IS_ERR(priv->pin_states[i])) {
-			ret = PTR_ERR(priv->pin_states[i]);
-			dev_warn(card->dev, "No pin state for %s\n",
+			dev_info(card->dev, "No pin state for %s\n",
 				 mt8365_mt6357_pin_str[i]);
 		} else {
 			ret = pinctrl_select_state(priv->pinctrl,
-- 
2.39.2



From tangbin at cmss.chinamobile.com  Wed Sep 11 05:37:51 2024
From: tangbin at cmss.chinamobile.com (Tang Bin)
Date: Wed, 11 Sep 2024 20:37:51 +0800
Subject: [PATCH] ASoC: mediatek: Remove redundant error message
Message-ID: <20240911123751.2078-1-tangbin@cmss.chinamobile.com>

In the function mt7986_afe_pcm_dev_probe, when get irq
failed, the function platform_get_irq() logs an error
message, so remove redundant one here.

Signed-off-by: Tang Bin <tangbin at cmss.chinamobile.com>
---
 sound/soc/mediatek/mt7986/mt7986-afe-pcm.c | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

diff --git a/sound/soc/mediatek/mt7986/mt7986-afe-pcm.c b/sound/soc/mediatek/mt7986/mt7986-afe-pcm.c
index d400bea0e..7db090414 100644
--- a/sound/soc/mediatek/mt7986/mt7986-afe-pcm.c
+++ b/sound/soc/mediatek/mt7986/mt7986-afe-pcm.c
@@ -529,10 +529,9 @@ static int mt7986_afe_pcm_dev_probe(struct platform_device *pdev)
 
 	/* request irq */
 	irq_id = platform_get_irq(pdev, 0);
-	if (irq_id < 0) {
-		ret = irq_id;
-		return dev_err_probe(dev, ret, "No irq found\n");
-	}
+	if (irq_id < 0)
+		return irq_id;
+
 	ret = devm_request_irq(dev, irq_id, mt7986_afe_irq_handler,
 			       IRQF_TRIGGER_NONE, "asys-isr", (void *)afe);
 	if (ret)
-- 
2.33.0





From qianqiang.liu at 163.com  Wed Sep 11 07:31:55 2024
From: qianqiang.liu at 163.com (Qianqiang Liu)
Date: Wed, 11 Sep 2024 22:31:55 +0800
Subject: [PATCH] PCI: mediatek-gen3: Check the return value of the reset_control_bulk_deassert
Message-ID: <20240911143154.59816-1-qianqiang.liu@163.com>

"reset_control_bulk_deassert" may return error code, we should check the
return value of it.

Signed-off-by: Qianqiang Liu <qianqiang.liu at 163.com>
---
 drivers/pci/controller/pcie-mediatek-gen3.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/pci/controller/pcie-mediatek-gen3.c b/drivers/pci/controller/pcie-mediatek-gen3.c
index 66ce4b5d309b..5b35dc32ad47 100644
--- a/drivers/pci/controller/pcie-mediatek-gen3.c
+++ b/drivers/pci/controller/pcie-mediatek-gen3.c
@@ -1016,7 +1016,9 @@ static int mtk_pcie_setup(struct mtk_gen3_pcie *pcie)
 	 * Deassert the line in order to avoid unbalance in deassert_count
 	 * counter since the bulk is shared.
 	 */
-	reset_control_bulk_deassert(pcie->soc->phy_resets.num_resets, pcie->phy_resets);
+	err = reset_control_bulk_deassert(pcie->soc->phy_resets.num_resets, pcie->phy_resets);
+	if (err)
+		return err;
 	/*
 	 * The controller may have been left out of reset by the bootloader
 	 * so make sure that we get a clean start by asserting resets here.
-- 
2.39.2



From fshao at chromium.org  Wed Sep 11 07:33:53 2024
From: fshao at chromium.org (Fei Shao)
Date: Wed, 11 Sep 2024 22:33:53 +0800
Subject: [PATCH v3 0/8] Add platform supports to MediaTek MT8188 SoC
Message-ID: <20240911143429.850071-1-fshao@chromium.org>

Hi all,

This series is a subset of the previous series [v1], focusing on
enabling few platform functionalities on MediaTek MT8188 SoC, including:
- CPU performance controller
- IOMMU / SMI / LARB
- PWM for display backlight
- SPMI for PMIC control
- audio
- socinfo

along with the corresponding binding changes (acked in the previous series).

[v1]: https://lore.kernel.org/all/20240909111535.528624-1-fshao at chromium.org/
[v2]: https://lore.kernel.org/all/20240911105131.4094027-1-fshao at chromium.org/

Regards,
Fei

Changes in v3:
- Remove leading zeros in spmi reg size

Changes in v2:
- Replace hardcoded AFE reset ID with correct definition
- Added socinfo nodes in v2

Fei Shao (8):
  dt-bindings: spmi: spmi-mtk-pmif: Add compatible for MT8188
  dt-bindings: mailbox: mtk,adsp-mbox: Add compatible for MT8188
  arm64: dts: mediatek: mt8188: Add CPU performance controller for
    CPUFreq
  arm64: dts: mediatek: mt8188: Add SMI/LARB/IOMMU support
  arm64: dts: mediatek: mt8188: Add PWM nodes for display backlight
  arm64: dts: mediatek: mt8188: Add SPMI support for PMIC control
  arm64: dts: mediatek: mt8188: Add audio support
  arm64: dts: mediatek: mt8188: Add socinfo nodes

 .../bindings/mailbox/mtk,adsp-mbox.yaml       |  12 +-
 .../bindings/spmi/mtk,spmi-mtk-pmif.yaml      |   1 +
 arch/arm64/boot/dts/mediatek/mt8188.dtsi      | 321 ++++++++++++++++++
 3 files changed, 331 insertions(+), 3 deletions(-)

-- 
2.46.0.598.g6f2099f65c-goog



From fshao at chromium.org  Wed Sep 11 07:33:54 2024
From: fshao at chromium.org (Fei Shao)
Date: Wed, 11 Sep 2024 22:33:54 +0800
Subject: [PATCH v3 1/8] dt-bindings: spmi: spmi-mtk-pmif: Add compatible for MT8188
In-Reply-To: <20240911143429.850071-1-fshao@chromium.org>
References: <20240911143429.850071-1-fshao@chromium.org>
Message-ID: <20240911143429.850071-2-fshao@chromium.org>

Add compatible string for the SPMI block on MT8188 SoC, which is
compatible with the one used on MT8195.

Acked-by: Stephen Boyd <sboyd at kernel.org>
Acked-by: Rob Herring (Arm) <robh at kernel.org>
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
Signed-off-by: Fei Shao <fshao at chromium.org>
---

(no changes since v1)

 Documentation/devicetree/bindings/spmi/mtk,spmi-mtk-pmif.yaml | 1 +
 1 file changed, 1 insertion(+)

diff --git a/Documentation/devicetree/bindings/spmi/mtk,spmi-mtk-pmif.yaml b/Documentation/devicetree/bindings/spmi/mtk,spmi-mtk-pmif.yaml
index ac99883a3f29..7f0be0ac644a 100644
--- a/Documentation/devicetree/bindings/spmi/mtk,spmi-mtk-pmif.yaml
+++ b/Documentation/devicetree/bindings/spmi/mtk,spmi-mtk-pmif.yaml
@@ -25,6 +25,7 @@ properties:
       - items:
           - enum:
               - mediatek,mt8186-spmi
+              - mediatek,mt8188-spmi
           - const: mediatek,mt8195-spmi
 
   reg:
-- 
2.46.0.598.g6f2099f65c-goog



From fshao at chromium.org  Wed Sep 11 07:33:55 2024
From: fshao at chromium.org (Fei Shao)
Date: Wed, 11 Sep 2024 22:33:55 +0800
Subject: [PATCH v3 2/8] dt-bindings: mailbox: mtk,adsp-mbox: Add compatible for MT8188
In-Reply-To: <20240911143429.850071-1-fshao@chromium.org>
References: <20240911143429.850071-1-fshao@chromium.org>
Message-ID: <20240911143429.850071-3-fshao@chromium.org>

Add compatible string for ADSP mailbox on MT8188 SoC, which is
compatible with the one used on MT8186.

Acked-by: Rob Herring (Arm) <robh at kernel.org>
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
Signed-off-by: Fei Shao <fshao at chromium.org>
---

(no changes since v1)

 .../devicetree/bindings/mailbox/mtk,adsp-mbox.yaml   | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

diff --git a/Documentation/devicetree/bindings/mailbox/mtk,adsp-mbox.yaml b/Documentation/devicetree/bindings/mailbox/mtk,adsp-mbox.yaml
index 72c1d9e82c89..8a1369df4ecb 100644
--- a/Documentation/devicetree/bindings/mailbox/mtk,adsp-mbox.yaml
+++ b/Documentation/devicetree/bindings/mailbox/mtk,adsp-mbox.yaml
@@ -17,9 +17,15 @@ description: |
 
 properties:
   compatible:
-    enum:
-      - mediatek,mt8195-adsp-mbox
-      - mediatek,mt8186-adsp-mbox
+    oneOf:
+      - enum:
+          - mediatek,mt8186-adsp-mbox
+          - mediatek,mt8195-adsp-mbox
+      - items:
+          - enum:
+              - mediatek,mt8188-adsp-mbox
+          - const: mediatek,mt8186-adsp-mbox
+
 
   "#mbox-cells":
     const: 0
-- 
2.46.0.598.g6f2099f65c-goog



From fshao at chromium.org  Wed Sep 11 07:33:56 2024
From: fshao at chromium.org (Fei Shao)
Date: Wed, 11 Sep 2024 22:33:56 +0800
Subject: [PATCH v3 3/8] arm64: dts: mediatek: mt8188: Add CPU performance controller for CPUFreq
In-Reply-To: <20240911143429.850071-1-fshao@chromium.org>
References: <20240911143429.850071-1-fshao@chromium.org>
Message-ID: <20240911143429.850071-4-fshao@chromium.org>

Add performance controller node and performance-domains properties for
CPUFreq support on MT8188 SoC.

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
Signed-off-by: Fei Shao <fshao at chromium.org>
---

(no changes since v1)

 arch/arm64/boot/dts/mediatek/mt8188.dtsi | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/arch/arm64/boot/dts/mediatek/mt8188.dtsi b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
index cd27966d2e3c..cdd2fe14effa 100644
--- a/arch/arm64/boot/dts/mediatek/mt8188.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
@@ -41,6 +41,7 @@ cpu0: cpu at 0 {
 			d-cache-line-size = <64>;
 			d-cache-sets = <128>;
 			next-level-cache = <&l2_0>;
+			performance-domains = <&performance 0>;
 			#cooling-cells = <2>;
 		};
 
@@ -59,6 +60,7 @@ cpu1: cpu at 100 {
 			d-cache-line-size = <64>;
 			d-cache-sets = <128>;
 			next-level-cache = <&l2_0>;
+			performance-domains = <&performance 0>;
 			#cooling-cells = <2>;
 		};
 
@@ -77,6 +79,7 @@ cpu2: cpu at 200 {
 			d-cache-line-size = <64>;
 			d-cache-sets = <128>;
 			next-level-cache = <&l2_0>;
+			performance-domains = <&performance 0>;
 			#cooling-cells = <2>;
 		};
 
@@ -95,6 +98,7 @@ cpu3: cpu at 300 {
 			d-cache-line-size = <64>;
 			d-cache-sets = <128>;
 			next-level-cache = <&l2_0>;
+			performance-domains = <&performance 0>;
 			#cooling-cells = <2>;
 		};
 
@@ -113,6 +117,7 @@ cpu4: cpu at 400 {
 			d-cache-line-size = <64>;
 			d-cache-sets = <128>;
 			next-level-cache = <&l2_0>;
+			performance-domains = <&performance 0>;
 			#cooling-cells = <2>;
 		};
 
@@ -131,6 +136,7 @@ cpu5: cpu at 500 {
 			d-cache-line-size = <64>;
 			d-cache-sets = <128>;
 			next-level-cache = <&l2_0>;
+			performance-domains = <&performance 0>;
 			#cooling-cells = <2>;
 		};
 
@@ -149,6 +155,7 @@ cpu6: cpu at 600 {
 			d-cache-line-size = <64>;
 			d-cache-sets = <256>;
 			next-level-cache = <&l2_1>;
+			performance-domains = <&performance 1>;
 			#cooling-cells = <2>;
 		};
 
@@ -167,6 +174,7 @@ cpu7: cpu at 700 {
 			d-cache-line-size = <64>;
 			d-cache-sets = <256>;
 			next-level-cache = <&l2_1>;
+			performance-domains = <&performance 1>;
 			#cooling-cells = <2>;
 		};
 
@@ -880,6 +888,12 @@ soc {
 		compatible = "simple-bus";
 		ranges;
 
+		performance: performance-controller at 11bc10 {
+			compatible = "mediatek,cpufreq-hw";
+			reg = <0 0x0011bc10 0 0x120>, <0 0x0011bd30 0 0x120>;
+			#performance-domain-cells = <1>;
+		};
+
 		gic: interrupt-controller at c000000 {
 			compatible = "arm,gic-v3";
 			#interrupt-cells = <4>;
-- 
2.46.0.598.g6f2099f65c-goog



From fshao at chromium.org  Wed Sep 11 07:33:57 2024
From: fshao at chromium.org (Fei Shao)
Date: Wed, 11 Sep 2024 22:33:57 +0800
Subject: [PATCH v3 4/8] arm64: dts: mediatek: mt8188: Add SMI/LARB/IOMMU support
In-Reply-To: <20240911143429.850071-1-fshao@chromium.org>
References: <20240911143429.850071-1-fshao@chromium.org>
Message-ID: <20240911143429.850071-5-fshao@chromium.org>

Local Arbiter (LARB) is a component of Smart Multimedia Interface (SMI)
that supports IOMMU on the MediaTek SoCs.

Add the following nodes for memory management support on MT8188 SoC:
- one Infra IOMMU
- two Multimedia (MM) IOMMUs of VDO and VPP
- corresponding SMI common and LARB nodes of the MM IOMMUs

Signed-off-by: Fei Shao <fshao at chromium.org>
---

(no changes since v1)

 arch/arm64/boot/dts/mediatek/mt8188.dtsi | 169 +++++++++++++++++++++++
 1 file changed, 169 insertions(+)

diff --git a/arch/arm64/boot/dts/mediatek/mt8188.dtsi b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
index cdd2fe14effa..f746b89c1ec6 100644
--- a/arch/arm64/boot/dts/mediatek/mt8188.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
@@ -9,6 +9,7 @@
 #include <dt-bindings/interrupt-controller/arm-gic.h>
 #include <dt-bindings/interrupt-controller/irq.h>
 #include <dt-bindings/mailbox/mediatek,mt8188-gce.h>
+#include <dt-bindings/memory/mediatek,mt8188-memory-port.h>
 #include <dt-bindings/phy/phy.h>
 #include <dt-bindings/pinctrl/mediatek,mt8188-pinfunc.h>
 #include <dt-bindings/power/mediatek,mt8188-power.h>
@@ -1305,6 +1306,13 @@ pwrap: pwrap at 10024000 {
 			clock-names = "spi", "wrap";
 		};
 
+		infra_iommu: iommu at 10315000 {
+			compatible = "mediatek,mt8188-iommu-infra";
+			reg = <0 0x10315000 0 0x1000>;
+			interrupts = <GIC_SPI 795 IRQ_TYPE_LEVEL_HIGH 0>;
+			#iommu-cells = <1>;
+		};
+
 		gce0: mailbox at 10320000 {
 			compatible = "mediatek,mt8188-gce";
 			reg = <0 0x10320000 0 0x4000>;
@@ -1798,6 +1806,37 @@ vppsys0: clock-controller at 14000000 {
 			#clock-cells = <1>;
 		};
 
+		vpp_smi_common: smi at 14012000 {
+			compatible = "mediatek,mt8188-smi-common-vpp";
+			reg = <0 0x14012000 0 0x1000>;
+			clocks = <&vppsys0 CLK_VPP0_SMI_COMMON_LARB4>,
+				 <&vppsys0 CLK_VPP0_SMI_SUB_COMMON_REORDER>;
+			clock-names = "apb", "smi";
+			power-domains = <&spm MT8188_POWER_DOMAIN_VPPSYS0>;
+		};
+
+		larb4: smi at 14013000 {
+			compatible = "mediatek,mt8188-smi-larb";
+			reg = <0 0x14013000 0 0x1000>;
+			clocks = <&vppsys0 CLK_VPP0_SMI_COMMON_LARB4>,
+				 <&vppsys0 CLK_VPP0_SMI_COMMON_LARB4>;
+			clock-names = "apb", "smi";
+			power-domains = <&spm MT8188_POWER_DOMAIN_VPPSYS0>;
+			mediatek,larb-id = <SMI_L4_ID>;
+			mediatek,smi = <&vpp_smi_common>;
+		};
+
+		vpp_iommu: iommu at 14018000 {
+			compatible = "mediatek,mt8188-iommu-vpp";
+			reg = <0 0x14018000 0 0x5000>;
+			clocks = <&vppsys0 CLK_VPP0_SMI_IOMMU>;
+			clock-names = "bclk";
+			interrupts = <GIC_SPI 594 IRQ_TYPE_LEVEL_HIGH 0>;
+			power-domains = <&spm MT8188_POWER_DOMAIN_VPPSYS0>;
+			#iommu-cells = <1>;
+			mediatek,larbs = <&larb1 &larb3 &larb4 &larb6 &larb7 &larb23>;
+		};
+
 		wpesys: clock-controller at 14e00000 {
 			compatible = "mediatek,mt8188-wpesys";
 			reg = <0 0x14e00000 0 0x1000>;
@@ -1810,12 +1849,45 @@ wpesys_vpp0: clock-controller at 14e02000 {
 			#clock-cells = <1>;
 		};
 
+		larb7: smi at 14e04000 {
+			compatible = "mediatek,mt8188-smi-larb";
+			reg = <0 0x14e04000 0 0x1000>;
+			clocks = <&wpesys CLK_WPE_TOP_SMI_LARB7>,
+				 <&wpesys CLK_WPE_TOP_SMI_LARB7>;
+			clock-names = "apb", "smi";
+			power-domains = <&spm MT8188_POWER_DOMAIN_WPE>;
+			mediatek,larb-id = <SMI_L7_ID>;
+			mediatek,smi = <&vpp_smi_common>;
+		};
+
 		vppsys1: clock-controller at 14f00000 {
 			compatible = "mediatek,mt8188-vppsys1";
 			reg = <0 0x14f00000 0 0x1000>;
 			#clock-cells = <1>;
 		};
 
+		larb5: smi at 14f02000 {
+			compatible = "mediatek,mt8188-smi-larb";
+			reg = <0 0x14f02000 0 0x1000>;
+			clocks = <&vppsys1 CLK_VPP1_GALS5>,
+				 <&vppsys1 CLK_VPP1_LARB5>;
+			clock-names = "apb", "smi";
+			power-domains = <&spm MT8188_POWER_DOMAIN_VPPSYS1>;
+			mediatek,larb-id = <SMI_L5_ID>;
+			mediatek,smi = <&vdo_smi_common>;
+		};
+
+		larb6: smi at 14f03000 {
+			compatible = "mediatek,mt8188-smi-larb";
+			reg = <0 0x14f03000 0 0x1000>;
+			clocks = <&vppsys1 CLK_VPP1_GALS6>,
+				 <&vppsys1 CLK_VPP1_LARB6>;
+			clock-names = "apb", "smi";
+			power-domains = <&spm MT8188_POWER_DOMAIN_VPPSYS1>;
+			mediatek,larb-id = <SMI_L6_ID>;
+			mediatek,smi = <&vpp_smi_common>;
+		};
+
 		imgsys: clock-controller at 15000000 {
 			compatible = "mediatek,mt8188-imgsys";
 			reg = <0 0x15000000 0 0x1000>;
@@ -1894,12 +1966,34 @@ ccusys: clock-controller at 17200000 {
 			#clock-cells = <1>;
 		};
 
+		larb23: smi at 1800d000 {
+			compatible = "mediatek,mt8188-smi-larb";
+			reg = <0 0x1800d000 0 0x1000>;
+			clocks = <&vdecsys_soc CLK_VDEC1_SOC_LARB1>,
+				 <&vdecsys_soc CLK_VDEC1_SOC_LARB1>;
+			clock-names = "apb", "smi";
+			power-domains = <&spm MT8188_POWER_DOMAIN_VDEC0>;
+			mediatek,larb-id = <SMI_L23_ID>;
+			mediatek,smi = <&vpp_smi_common>;
+		};
+
 		vdecsys_soc: clock-controller at 1800f000 {
 			compatible = "mediatek,mt8188-vdecsys-soc";
 			reg = <0 0x1800f000 0 0x1000>;
 			#clock-cells = <1>;
 		};
 
+		larb21: smi at 1802e000 {
+			compatible = "mediatek,mt8188-smi-larb";
+			reg = <0 0x1802e000 0 0x1000>;
+			clocks = <&vdecsys CLK_VDEC2_LARB1>,
+				 <&vdecsys CLK_VDEC2_LARB1>;
+			clock-names = "apb", "smi";
+			power-domains = <&spm MT8188_POWER_DOMAIN_VDEC1>;
+			mediatek,larb-id = <SMI_L21_ID>;
+			mediatek,smi = <&vdo_smi_common>;
+		};
+
 		vdecsys: clock-controller at 1802f000 {
 			compatible = "mediatek,mt8188-vdecsys";
 			reg = <0 0x1802f000 0 0x1000>;
@@ -1912,6 +2006,17 @@ vencsys: clock-controller at 1a000000 {
 			#clock-cells = <1>;
 		};
 
+		larb19: smi at 1a010000 {
+			compatible = "mediatek,mt8188-smi-larb";
+			reg = <0 0x1a010000 0 0x1000>;
+			clocks = <&vencsys CLK_VENC1_VENC>,
+				 <&vencsys CLK_VENC1_VENC>;
+			clock-names = "apb", "smi";
+			power-domains = <&spm MT8188_POWER_DOMAIN_VENC>;
+			mediatek,larb-id = <SMI_L19_ID>;
+			mediatek,smi = <&vdo_smi_common>;
+		};
+
 		vdosys0: syscon at 1c01d000 {
 			compatible = "mediatek,mt8188-vdosys0", "syscon";
 			reg = <0 0x1c01d000 0 0x1000>;
@@ -1920,6 +2025,48 @@ vdosys0: syscon at 1c01d000 {
 			mediatek,gce-client-reg = <&gce0 SUBSYS_1c01XXXX 0xd000 0x1000>;
 		};
 
+		larb0: smi at 1c022000 {
+			compatible = "mediatek,mt8188-smi-larb";
+			reg = <0 0x1c022000 0 0x1000>;
+			clocks = <&vdosys0 CLK_VDO0_SMI_LARB>,
+				 <&vdosys0 CLK_VDO0_SMI_LARB>;
+			clock-names = "apb", "smi";
+			power-domains = <&spm MT8188_POWER_DOMAIN_VDOSYS0>;
+			mediatek,larb-id = <SMI_L0_ID>;
+			mediatek,smi = <&vdo_smi_common>;
+		};
+
+		larb1: smi at 1c023000 {
+			compatible = "mediatek,mt8188-smi-larb";
+			reg = <0 0x1c023000 0 0x1000>;
+			clocks = <&vdosys0 CLK_VDO0_SMI_LARB>,
+				 <&vdosys0 CLK_VDO0_SMI_LARB>;
+			clock-names = "apb", "smi";
+			power-domains = <&spm MT8188_POWER_DOMAIN_VDOSYS0>;
+			mediatek,larb-id = <SMI_L1_ID>;
+			mediatek,smi = <&vpp_smi_common>;
+		};
+
+		vdo_smi_common: smi at 1c024000 {
+			compatible = "mediatek,mt8188-smi-common-vdo";
+			reg = <0 0x1c024000 0 0x1000>;
+			clocks = <&vdosys0 CLK_VDO0_SMI_COMMON>,
+				 <&vdosys0 CLK_VDO0_SMI_GALS>;
+			clock-names = "apb", "smi";
+			power-domains = <&spm MT8188_POWER_DOMAIN_VDOSYS0>;
+		};
+
+		vdo_iommu: iommu at 1c028000 {
+			compatible = "mediatek,mt8188-iommu-vdo";
+			reg = <0 0x1c028000 0 0x5000>;
+			clocks = <&vdosys0 CLK_VDO0_SMI_IOMMU>;
+			clock-names = "bclk";
+			interrupts = <GIC_SPI 673 IRQ_TYPE_LEVEL_HIGH 0>;
+			power-domains = <&spm MT8188_POWER_DOMAIN_VDOSYS0>;
+			#iommu-cells = <1>;
+			mediatek,larbs = <&larb0 &larb2 &larb5 &larb19 &larb21>;
+		};
+
 		vdosys1: syscon at 1c100000 {
 			compatible = "mediatek,mt8188-vdosys1", "syscon";
 			reg = <0 0x1c100000 0 0x1000>;
@@ -1928,5 +2075,27 @@ vdosys1: syscon at 1c100000 {
 			mboxes = <&gce0 1 CMDQ_THR_PRIO_4>;
 			mediatek,gce-client-reg = <&gce0 SUBSYS_1c10XXXX 0 0x1000>;
 		};
+
+		larb2: smi at 1c102000 {
+			compatible = "mediatek,mt8188-smi-larb";
+			reg = <0 0x1c102000 0 0x1000>;
+			clocks = <&vdosys1 CLK_VDO1_SMI_LARB2>,
+				 <&vdosys1 CLK_VDO1_SMI_LARB2>;
+			clock-names = "apb", "smi";
+			power-domains = <&spm MT8188_POWER_DOMAIN_VDOSYS1>;
+			mediatek,larb-id = <SMI_L2_ID>;
+			mediatek,smi = <&vdo_smi_common>;
+		};
+
+		larb3: smi at 1c103000 {
+			compatible = "mediatek,mt8188-smi-larb";
+			reg = <0 0x1c103000 0 0x1000>;
+			clocks = <&vdosys1 CLK_VDO1_SMI_LARB3>,
+				 <&vdosys1 CLK_VDO1_SMI_LARB3>;
+			clock-names = "apb", "smi";
+			power-domains = <&spm MT8188_POWER_DOMAIN_VDOSYS1>;
+			mediatek,larb-id = <SMI_L3_ID>;
+			mediatek,smi = <&vpp_smi_common>;
+		};
 	};
 };
-- 
2.46.0.598.g6f2099f65c-goog



From fshao at chromium.org  Wed Sep 11 07:33:58 2024
From: fshao at chromium.org (Fei Shao)
Date: Wed, 11 Sep 2024 22:33:58 +0800
Subject: [PATCH v3 5/8] arm64: dts: mediatek: mt8188: Add PWM nodes for display backlight
In-Reply-To: <20240911143429.850071-1-fshao@chromium.org>
References: <20240911143429.850071-1-fshao@chromium.org>
Message-ID: <20240911143429.850071-6-fshao@chromium.org>

Add two hardware PWM nodes for display backlight usage on MT8188 SoC,
and mark them as disabled by default.
Boards can enable the necessary PWM node as needed.

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
Signed-off-by: Fei Shao <fshao at chromium.org>
---

(no changes since v1)

 arch/arm64/boot/dts/mediatek/mt8188.dtsi | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

diff --git a/arch/arm64/boot/dts/mediatek/mt8188.dtsi b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
index f746b89c1ec6..61530f8c5599 100644
--- a/arch/arm64/boot/dts/mediatek/mt8188.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
@@ -1418,6 +1418,28 @@ lvts_ap: thermal-sensor at 1100b000 {
 			#thermal-sensor-cells = <1>;
 		};
 
+		disp_pwm0: pwm at 1100e000 {
+			compatible = "mediatek,mt8188-disp-pwm", "mediatek,mt8183-disp-pwm";
+			reg = <0 0x1100e000 0 0x1000>;
+			clocks = <&topckgen CLK_TOP_DISP_PWM0>,
+				 <&infracfg_ao CLK_INFRA_AO_DISP_PWM>;
+			clock-names = "main", "mm";
+			interrupts = <GIC_SPI 203 IRQ_TYPE_LEVEL_HIGH 0>;
+			#pwm-cells = <2>;
+			status = "disabled";
+		};
+
+		disp_pwm1: pwm at 1100f000 {
+			compatible = "mediatek,mt8188-disp-pwm", "mediatek,mt8183-disp-pwm";
+			reg = <0 0x1100f000 0 0x1000>;
+			clocks = <&topckgen CLK_TOP_DISP_PWM1>,
+				 <&infracfg_ao CLK_INFRA_AO_DISP_PWM1>;
+			clock-names = "main", "mm";
+			interrupts = <GIC_SPI 793 IRQ_TYPE_LEVEL_HIGH 0>;
+			#pwm-cells = <2>;
+			status = "disabled";
+		};
+
 		spi1: spi at 11010000 {
 			compatible = "mediatek,mt8188-spi-ipm", "mediatek,spi-ipm";
 			#address-cells = <1>;
-- 
2.46.0.598.g6f2099f65c-goog



From fshao at chromium.org  Wed Sep 11 07:33:59 2024
From: fshao at chromium.org (Fei Shao)
Date: Wed, 11 Sep 2024 22:33:59 +0800
Subject: [PATCH v3 6/8] arm64: dts: mediatek: mt8188: Add SPMI support for PMIC control
In-Reply-To: <20240911143429.850071-1-fshao@chromium.org>
References: <20240911143429.850071-1-fshao@chromium.org>
Message-ID: <20240911143429.850071-7-fshao@chromium.org>

Add SPMI node for PMIC control on MT8188 SoC.

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
Signed-off-by: Fei Shao <fshao at chromium.org>
---

Changes in v3:
- Remove leading zeros in spmi reg size

 arch/arm64/boot/dts/mediatek/mt8188.dtsi | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/arch/arm64/boot/dts/mediatek/mt8188.dtsi b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
index 61530f8c5599..a826ca4d10e3 100644
--- a/arch/arm64/boot/dts/mediatek/mt8188.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
@@ -1306,6 +1306,18 @@ pwrap: pwrap at 10024000 {
 			clock-names = "spi", "wrap";
 		};
 
+		spmi: spmi at 10027000 {
+			compatible = "mediatek,mt8188-spmi", "mediatek,mt8195-spmi";
+			reg = <0 0x10027000 0 0xe00>, <0 0x10029000 0 0x100>;
+			reg-names = "pmif", "spmimst";
+			assigned-clocks = <&topckgen CLK_TOP_SPMI_M_MST>;
+			assigned-clock-parents = <&topckgen CLK_TOP_ULPOSC1_D10>;
+			clocks = <&infracfg_ao CLK_INFRA_AO_PMIC_AP>,
+				 <&infracfg_ao CLK_INFRA_AO_PMIC_TMR>,
+				 <&topckgen CLK_TOP_SPMI_M_MST>;
+			clock-names = "pmif_sys_ck", "pmif_tmr_ck", "spmimst_clk_mux";
+		};
+
 		infra_iommu: iommu at 10315000 {
 			compatible = "mediatek,mt8188-iommu-infra";
 			reg = <0 0x10315000 0 0x1000>;
-- 
2.46.0.598.g6f2099f65c-goog



From fshao at chromium.org  Wed Sep 11 07:34:00 2024
From: fshao at chromium.org (Fei Shao)
Date: Wed, 11 Sep 2024 22:34:00 +0800
Subject: [PATCH v3 7/8] arm64: dts: mediatek: mt8188: Add audio support
In-Reply-To: <20240911143429.850071-1-fshao@chromium.org>
References: <20240911143429.850071-1-fshao@chromium.org>
Message-ID: <20240911143429.850071-8-fshao@chromium.org>

Add following nodes to support audio enablement on MT8188 SoC:
- sound card
- audio controller (AFE)
- audio DSP and its associated mailboxes

Signed-off-by: Fei Shao <fshao at chromium.org>
---

(no changes since v2)

Changes in v2:
- Replace hardcoded AFE reset ID with correct definition

 arch/arm64/boot/dts/mediatek/mt8188.dtsi | 96 ++++++++++++++++++++++++
 1 file changed, 96 insertions(+)

diff --git a/arch/arm64/boot/dts/mediatek/mt8188.dtsi b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
index a826ca4d10e3..6327e1006de8 100644
--- a/arch/arm64/boot/dts/mediatek/mt8188.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
@@ -429,6 +429,11 @@ psci {
 		method = "smc";
 	};
 
+	sound: sound {
+		mediatek,platform = <&afe>;
+		status = "disabled";
+	};
+
 	thermal_zones: thermal-zones {
 		cpu-little0-thermal {
 			polling-delay = <1000>;
@@ -1349,6 +1354,97 @@ scp: scp at 10500000 {
 			interrupts = <GIC_SPI 462 IRQ_TYPE_LEVEL_HIGH 0>;
 		};
 
+		afe: audio-controller at 10b10000 {
+			compatible = "mediatek,mt8188-afe";
+			reg = <0 0x10b10000 0 0x10000>;
+			assigned-clocks = <&topckgen CLK_TOP_A1SYS_HP>;
+			assigned-clock-parents =  <&clk26m>;
+			clocks = <&clk26m>,
+				 <&apmixedsys CLK_APMIXED_APLL1>,
+				 <&apmixedsys CLK_APMIXED_APLL2>,
+				 <&topckgen CLK_TOP_APLL12_CK_DIV0>,
+				 <&topckgen CLK_TOP_APLL12_CK_DIV1>,
+				 <&topckgen CLK_TOP_APLL12_CK_DIV2>,
+				 <&topckgen CLK_TOP_APLL12_CK_DIV3>,
+				 <&topckgen CLK_TOP_APLL12_CK_DIV9>,
+				 <&topckgen CLK_TOP_A1SYS_HP>,
+				 <&topckgen CLK_TOP_AUD_INTBUS>,
+				 <&topckgen CLK_TOP_AUDIO_H>,
+				 <&topckgen CLK_TOP_AUDIO_LOCAL_BUS>,
+				 <&topckgen CLK_TOP_DPTX>,
+				 <&topckgen CLK_TOP_I2SO1>,
+				 <&topckgen CLK_TOP_I2SO2>,
+				 <&topckgen CLK_TOP_I2SI1>,
+				 <&topckgen CLK_TOP_I2SI2>,
+				 <&adsp_audio26m CLK_AUDIODSP_AUDIO26M>,
+				 <&topckgen CLK_TOP_APLL1_D4>,
+				 <&topckgen CLK_TOP_APLL2_D4>,
+				 <&topckgen CLK_TOP_APLL12_CK_DIV4>,
+				 <&topckgen CLK_TOP_A2SYS>,
+				 <&topckgen CLK_TOP_AUD_IEC>;
+			clock-names = "clk26m",
+				      "apll1",
+				      "apll2",
+				      "apll12_div0",
+				      "apll12_div1",
+				      "apll12_div2",
+				      "apll12_div3",
+				      "apll12_div9",
+				      "top_a1sys_hp",
+				      "top_aud_intbus",
+				      "top_audio_h",
+				      "top_audio_local_bus",
+				      "top_dptx",
+				      "top_i2so1",
+				      "top_i2so2",
+				      "top_i2si1",
+				      "top_i2si2",
+				      "adsp_audio_26m",
+				      "apll1_d4",
+				      "apll2_d4",
+				      "apll12_div4",
+				      "top_a2sys",
+				      "top_aud_iec";
+			interrupts = <GIC_SPI 822 IRQ_TYPE_LEVEL_HIGH 0>;
+			power-domains = <&spm MT8188_POWER_DOMAIN_AUDIO>;
+			resets = <&watchdog MT8188_TOPRGU_AUDIO_SW_RST>;
+			reset-names = "audiosys";
+			mediatek,infracfg = <&infracfg_ao>;
+			mediatek,topckgen = <&topckgen>;
+			status = "disabled";
+		};
+
+		adsp: adsp at 10b80000 {
+			compatible = "mediatek,mt8188-dsp";
+			reg = <0 0x10b80000 0 0x2000>,
+			      <0 0x10d00000 0 0x80000>,
+			      <0 0x10b8b000 0 0x100>,
+			      <0 0x10b8f000 0 0x1000>;
+			reg-names = "cfg", "sram", "sec", "bus";
+			assigned-clocks = <&topckgen CLK_TOP_ADSP>;
+			clocks = <&topckgen CLK_TOP_ADSP>,
+				 <&topckgen CLK_TOP_AUDIO_LOCAL_BUS>;
+			clock-names = "audiodsp", "adsp_bus";
+			mboxes = <&adsp_mailbox0>, <&adsp_mailbox1>;
+			mbox-names = "rx", "tx";
+			power-domains = <&spm MT8188_POWER_DOMAIN_ADSP>;
+			status = "disabled";
+		};
+
+		adsp_mailbox0: mailbox at 10b86000 {
+			compatible = "mediatek,mt8188-adsp-mbox", "mediatek,mt8186-adsp-mbox";
+			reg = <0 0x10b86100 0 0x1000>;
+			interrupts = <GIC_SPI 478 IRQ_TYPE_LEVEL_HIGH 0>;
+			#mbox-cells = <0>;
+		};
+
+		adsp_mailbox1: mailbox at 10b87000 {
+			compatible = "mediatek,mt8188-adsp-mbox", "mediatek,mt8186-adsp-mbox";
+			reg = <0 0x10b87100 0 0x1000>;
+			interrupts = <GIC_SPI 479 IRQ_TYPE_LEVEL_HIGH 0>;
+			#mbox-cells = <0>;
+		};
+
 		adsp_audio26m: clock-controller at 10b91100 {
 			compatible = "mediatek,mt8188-adsp-audio26m";
 			reg = <0 0x10b91100 0 0x100>;
-- 
2.46.0.598.g6f2099f65c-goog



From fshao at chromium.org  Wed Sep 11 07:34:01 2024
From: fshao at chromium.org (Fei Shao)
Date: Wed, 11 Sep 2024 22:34:01 +0800
Subject: [PATCH v3 8/8] arm64: dts: mediatek: mt8188: Add socinfo nodes
In-Reply-To: <20240911143429.850071-1-fshao@chromium.org>
References: <20240911143429.850071-1-fshao@chromium.org>
Message-ID: <20240911143429.850071-9-fshao@chromium.org>

Add two socinfo efuse data nodes for the SoC information probing on
MT8188.

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
Signed-off-by: Fei Shao <fshao at chromium.org>
---

(no changes since v2)

Changes in v2:
- Added socinfo nodes in v2

 arch/arm64/boot/dts/mediatek/mt8188.dtsi | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/arch/arm64/boot/dts/mediatek/mt8188.dtsi b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
index 6327e1006de8..bf15ac9901da 100644
--- a/arch/arm64/boot/dts/mediatek/mt8188.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
@@ -1904,6 +1904,14 @@ efuse: efuse at 11f20000 {
 			lvts_efuse_data1: lvts1-calib at 1ac {
 				reg = <0x1ac 0x40>;
 			};
+
+			socinfo-data1 at 7a0 {
+				reg = <0x7a0 0x4>;
+			};
+
+			socinfo-data2 at 7e0 {
+				reg = <0x7e0 0x4>;
+			};
 		};
 
 		gpu: gpu at 13000000 {
-- 
2.46.0.598.g6f2099f65c-goog



From andriy.shevchenko at linux.intel.com  Wed Sep 11 07:38:23 2024
From: andriy.shevchenko at linux.intel.com (Andy Shevchenko)
Date: Wed, 11 Sep 2024 17:38:23 +0300
Subject: [PATCH v6 09/12] i2c: of-prober: Add regulator support
In-Reply-To: <CAD=FV=U2yDGv74GQWRQuHN9sjdY5iThqpH-br-jYXMkV1cujEg@mail.gmail.com>
References: <20240904090016.2841572-1-wenst@chromium.org>
 <20240904090016.2841572-10-wenst@chromium.org>
 <CAD=FV=UGOz3Xzg7reJKP=tA1LqTxszv5w-CL9krmoXQtXdJLaQ@mail.gmail.com>
 <CAGXv+5F27K76t=ht5v75jKsNF-J+C0r5+m=czHz6PtV3t5DxcQ@mail.gmail.com>
 <CAD=FV=XVrAdQN8p9QJtt3Ah_YQAG7Y-D4wDx8_+qb1EGN7+Uig@mail.gmail.com>
 <CAGXv+5HO=POHNL_tQHCsy+8=a0gPLMDVHcWMguferahVU+BnZA@mail.gmail.com>
 <CAD=FV=U2yDGv74GQWRQuHN9sjdY5iThqpH-br-jYXMkV1cujEg@mail.gmail.com>
Message-ID: <ZuGrX67LzMe9S6ce@smile.fi.intel.com>

On Tue, Sep 10, 2024 at 05:30:07PM -0700, Doug Anderson wrote:
> On Thu, Sep 5, 2024 at 8:45?PM Chen-Yu Tsai <wenst at chromium.org> wrote:

...

> > At least for the stuff that we have (touchscreens and trackpads) such
> > registers typically don't exist, unless it's an HID-over-I2C device,
> > in which case there's the standard HID descriptor at some address.
> > But, yeah, reading the HID descriptor was the use case I had in mind.
> >
> > At least for one Chromebooks it's a bit more tricky because that one
> > HID-over-I2C component shares the same address as a non-HID one. We
> > currently have different SKU IDs and thus different device trees for
> > them, but we could make the prober work with this. It just has be able
> > to tell if the component it's currently probing needs the special
> > prober and is it responding correctly. This bit I need to think about.
> 
> I guess Mark Brown also thought that there wouldn't be some magic
> register, but my gut still tells me that most i2c devices have some
> way to confirm that they are what you expect even if it's not an
> official "vendor" or "version" register. Some type of predictable
> register at a predictable location that you could use, at least if you
> knew all of the options that someone might stuff.

"most" is way too optimistic to say, I believe that not even close to majority
of I?C target devices they are not reliably discoverable.

That's the downside of non-discoverable busses like I?C. Maybe I?C has
a mechanism for that, but I am not an expert, just wondering.

> For instance, in elan trackpads you can see elan_i2c_get_product_id().
> That just reads a location (ETP_I2C_UNIQUEID_CMD = 0x0101) that could
> theoretically be used to figure out (maybe in conjunction with other
> registers) that it's an elan trackpad instead of an i2c-hid one. You'd
> have to (of course) confirm that an i2c-hid device wouldn't somehow
> return back data from this read that made it look like an elan
> trackpad, but it feels like there ought to be some way to figure it
> out with a few i2c register reads.
> 
> ...that being said, I guess my original assertion that you might be
> able to figure out with a simple register read was naive and you'd
> actually need a function (maybe as a callback) to figure this out.

-- 
With Best Regards,
Andy Shevchenko




From andriy.shevchenko at linux.intel.com  Wed Sep 11 07:39:56 2024
From: andriy.shevchenko at linux.intel.com (Andy Shevchenko)
Date: Wed, 11 Sep 2024 17:39:56 +0300
Subject: [PATCH v6 06/12] gpiolib: Add gpio_get_property_name_length()
In-Reply-To: <CAGXv+5Hrz2rA1_eAY8S96ankeWS4wr9EX-hr1LUY5JGx=FoNPQ@mail.gmail.com>
References: <20240904090016.2841572-1-wenst@chromium.org>
 <20240904090016.2841572-7-wenst@chromium.org>
 <ZthjSK9N9z11YXi2@smile.fi.intel.com>
 <CAGXv+5GrW0EZZw6HVY7ALvm0dBj5Wwrvp02vtTPZYwqxxiZQyg@mail.gmail.com>
 <CAGXv+5Hrz2rA1_eAY8S96ankeWS4wr9EX-hr1LUY5JGx=FoNPQ@mail.gmail.com>
Message-ID: <ZuGrvIb_kZpiA9QC@smile.fi.intel.com>

On Wed, Sep 11, 2024 at 03:37:35PM +0800, Chen-Yu Tsai wrote:
> On Mon, Sep 9, 2024 at 10:45?AM Chen-Yu Tsai <wenst at chromium.org> wrote:
> > On Wed, Sep 4, 2024 at 9:40?PM Andy Shevchenko
> > <andriy.shevchenko at linux.intel.com> wrote:
> > > On Wed, Sep 04, 2024 at 05:00:08PM +0800, Chen-Yu Tsai wrote:

...

> > > > +/**
> > > > + * gpio_get_property_name_length - Returns the GPIO name length from a property name
> > > > + * @propname:        name of the property to check
> > > > + *
> > > > + * This function checks if the given property name matches the GPIO property
> > > > + * patterns, and returns the length of the name of the GPIO. The pattern is
> > > > + * "*-<GPIO suffix>" or just "<GPIO suffix>".
> > > > + *
> > > > + * Returns:
> > > > + * The length of the string before '-<GPIO suffix>' if it matches
> > > > + * "*-<GPIO suffix>", or 0 if no name part, just the suffix, or
> > > > + * -EINVAL if the string doesn't match the pattern.
> > >
> > > Should be %-EINVAL as we agreed with Bart when I updated GPIOLIB kernel-doc.
> >
> > Ack.
> >
> > In the regulator cleanups I did, I used -%EINVAL instead. But then I
> > realized that constants aren't really cross-referenced. I probably
> > have to go through all of them to fix those up.
> 
> FTR this patch ended up getting dropped from the series as it was no
> longer needed.

That's great news!

> However if folks think there is still value in this patch,
> I can still send a new version.

Not for me, thanks.

-- 
With Best Regards,
Andy Shevchenko




From broonie at kernel.org  Wed Sep 11 07:49:31 2024
From: broonie at kernel.org (Mark Brown)
Date: Wed, 11 Sep 2024 15:49:31 +0100
Subject: [PATCH v6 09/12] i2c: of-prober: Add regulator support
In-Reply-To: <ZuGrX67LzMe9S6ce@smile.fi.intel.com>
References: <20240904090016.2841572-1-wenst@chromium.org>
 <20240904090016.2841572-10-wenst@chromium.org>
 <CAD=FV=UGOz3Xzg7reJKP=tA1LqTxszv5w-CL9krmoXQtXdJLaQ@mail.gmail.com>
 <CAGXv+5F27K76t=ht5v75jKsNF-J+C0r5+m=czHz6PtV3t5DxcQ@mail.gmail.com>
 <CAD=FV=XVrAdQN8p9QJtt3Ah_YQAG7Y-D4wDx8_+qb1EGN7+Uig@mail.gmail.com>
 <CAGXv+5HO=POHNL_tQHCsy+8=a0gPLMDVHcWMguferahVU+BnZA@mail.gmail.com>
 <CAD=FV=U2yDGv74GQWRQuHN9sjdY5iThqpH-br-jYXMkV1cujEg@mail.gmail.com>
 <ZuGrX67LzMe9S6ce@smile.fi.intel.com>
Message-ID: <04704b5d-ae3f-488f-91a5-acdbc993efc6@sirena.org.uk>

On Wed, Sep 11, 2024 at 05:38:23PM +0300, Andy Shevchenko wrote:
> On Tue, Sep 10, 2024 at 05:30:07PM -0700, Doug Anderson wrote:
> > On Thu, Sep 5, 2024 at 8:45?PM Chen-Yu Tsai <wenst at chromium.org> wrote:

> > > At least for one Chromebooks it's a bit more tricky because that one
> > > HID-over-I2C component shares the same address as a non-HID one. We
> > > currently have different SKU IDs and thus different device trees for
> > > them, but we could make the prober work with this. It just has be able
> > > to tell if the component it's currently probing needs the special
> > > prober and is it responding correctly. This bit I need to think about.

> > I guess Mark Brown also thought that there wouldn't be some magic
> > register, but my gut still tells me that most i2c devices have some
> > way to confirm that they are what you expect even if it's not an
> > official "vendor" or "version" register. Some type of predictable
> > register at a predictable location that you could use, at least if you
> > knew all of the options that someone might stuff.

> "most" is way too optimistic to say, I believe that not even close to majority
> of I?C target devices they are not reliably discoverable.

> That's the downside of non-discoverable busses like I?C. Maybe I?C has
> a mechanism for that, but I am not an expert, just wondering.

There's no standard mechanism for I2C, however it is relatively common
for devices to have some kind of ID registers.  This is especially true
if you're confining yourself to a particular class of device, bigger and
more modern devices are more likely to have this - if you want to pick
your audio CODEC or touchscreen controller it's a lot more likely
that'll work than something like a simple DAC or ADC for example.  You
also have the different I2C addresses that vendors pick to help out.
It's not an actual specified discovery mechanism, but practically
speaking you probably can generalise some of the ID register probing.
Though equally it's good practice for drivers to check this anyway so
it's not clear how much benefit there is over just trying to run probe().
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-mediatek/attachments/20240911/8a9fd9e6/attachment-0001.sig>

From broonie at kernel.org  Wed Sep 11 07:53:48 2024
From: broonie at kernel.org (Mark Brown)
Date: Wed, 11 Sep 2024 15:53:48 +0100
Subject: [PATCH] ASoC: mediatek: mt8365: check validity before usage of
 i2s_data
In-Reply-To: <20240911111317.4072349-1-usama.anjum@collabora.com>
References: <20240911111317.4072349-1-usama.anjum@collabora.com>
Message-ID: <172606642824.81433.11338479643338212337.b4-ty@kernel.org>

On Wed, 11 Sep 2024 16:13:07 +0500, Muhammad Usama Anjum wrote:
> There may be a case where i2s_data may not get initialized by the for
> loop which will cause the kernel crash. Initialize the i2s_data to NULL
> and abort execute if it isn't found.
> 
> 

Applied to

   https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git for-next

Thanks!

[1/1] ASoC: mediatek: mt8365: check validity before usage of i2s_data
      commit: 5c4e15e63216e7268bb2f1132ee8fad0ec46bbb7

All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.

You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.

If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.

Please add any relevant lists and maintainers to the CCs when replying
to this mail.

Thanks,
Mark



From conor at kernel.org  Wed Sep 11 10:51:04 2024
From: conor at kernel.org (Conor Dooley)
Date: Wed, 11 Sep 2024 18:51:04 +0100
Subject: [PATCH] dt-bindings: mailbox: mediatek,gce-mailbox: Stop
 requiring clock-names
In-Reply-To: <20240911104327.123602-1-angelogioacchino.delregno@collabora.com>
References: <20240911104327.123602-1-angelogioacchino.delregno@collabora.com>
Message-ID: <20240911-unhappy-wifi-b0a851e261bb@spud>

On Wed, Sep 11, 2024 at 12:43:27PM +0200, AngeloGioacchino Del Regno wrote:
> There is no reason to make specifying the clock-names property
> mandatory, as the Global Command Engine HW needs only one clock.

Have you checked to make sure that there are no users that do the lookup
by name?

> 
> Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
> ---
>  .../bindings/mailbox/mediatek,gce-mailbox.yaml        | 11 -----------
>  1 file changed, 11 deletions(-)
> 
> diff --git a/Documentation/devicetree/bindings/mailbox/mediatek,gce-mailbox.yaml b/Documentation/devicetree/bindings/mailbox/mediatek,gce-mailbox.yaml
> index cef9d7601398..ff5d010fbcf0 100644
> --- a/Documentation/devicetree/bindings/mailbox/mediatek,gce-mailbox.yaml
> +++ b/Documentation/devicetree/bindings/mailbox/mediatek,gce-mailbox.yaml
> @@ -56,17 +56,6 @@ required:
>    - interrupts
>    - clocks
>  
> -allOf:
> -  - if:
> -      not:
> -        properties:
> -          compatible:
> -            contains:
> -              const: mediatek,mt8195-gce
> -    then:
> -      required:
> -        - clock-names
> -
>  additionalProperties: false
>  
>  examples:
> -- 
> 2.46.0
> 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 228 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-mediatek/attachments/20240911/56a8c99f/attachment.sig>

From mcgrof at kernel.org  Wed Sep 11 11:18:23 2024
From: mcgrof at kernel.org (Luis Chamberlain)
Date: Wed, 11 Sep 2024 11:18:23 -0700
Subject: [PATCH v4 1/1] module: abort module loading when sysfs setup
 suffer errors
In-Reply-To: <20240911032802.22413-2-chunhui.li@mediatek.com>
References: <20240911032802.22413-1-chunhui.li@mediatek.com>
 <20240911032802.22413-2-chunhui.li@mediatek.com>
Message-ID: <ZuHe7zib3MiRn8l3@bombadil.infradead.org>

On Wed, Sep 11, 2024 at 11:28:02AM +0800, Chunhui Li wrote:
> When insmod a kernel module, if fails in add_notes_attrs or
> add_sysfs_attrs such as memory allocation fail, mod_sysfs_setup
> will still return success, but we can't access user interface
> on android device.
> 
> Patch for make mod_sysfs_setup can check the error of
> add_notes_attrs and add_sysfs_attrs
> 
> Fixes: db939b519bea ("Module section offsets in /sys/module")
> Fixes: 6d76013381ed ("Add /sys/module/name/notes")
> Acked-by: Luis Chamberlain <mcgrof at kernel.org>
> Reviewed-by: Petr Pavlu <petr.pavlu at suse.com>
> Reported-by: kernel test robot <lkp at intel.com>
> Closes: https://lore.kernel.org/oe-kbuild-all/202409010016.3XIFSmRA-lkp at intel.com/
> Closes: https://lore.kernel.org/oe-kbuild-all/202409072018.qfEzZbO7-lkp at intel.com/
> Signed-off-by: Xion Wang <xion.wang at mediatek.com>
> Signed-off-by: Chunhui Li <chunhui.li at mediatek.com>

Applied and pushed! I modified the commit log slighlty to fix the commit
referelcen to the first issue with sections as that is part
linux history.git.

[0] https://git.kernel.org/pub/scm/linux/kernel/git/history/history.git/commit/?id=3f7b0672086b97b2d7f322bdc289cbfa203f10ef

  Luis


From bvanassche at acm.org  Wed Sep 11 12:11:50 2024
From: bvanassche at acm.org (Bart Van Assche)
Date: Wed, 11 Sep 2024 12:11:50 -0700
Subject: [PATCH v4 2/2] ufs: core: requeue aborted request
In-Reply-To: <04e392c00986ac798e881dcd347ff5045cf61708.camel@mediatek.com>
References: <20240910073035.25974-1-peter.wang@mediatek.com>
 <20240910073035.25974-3-peter.wang@mediatek.com>
 <e42abf07-ba6b-4301-8717-8d5b01d56640@acm.org>
 <04e392c00986ac798e881dcd347ff5045cf61708.camel@mediatek.com>
Message-ID: <858c4b6b-fcbc-4d51-8641-051aeda387c5@acm.org>

On 9/10/24 11:03 PM, Peter Wang (???) wrote:
> This statement is not quite accurate becasue in UFSHIC2.1, SDB mode
> specification already have OCS: ABORTED (0x6) define.
> And it is used in below UTRLCLR description:
> 'which means a Transfer Request was "aborted"'
> Therefore, the host controller should follow the
> specification and fill the OCS field with OCS: ABORTED.
> If not so, at what point does your host controller use the
> OCS: ABORTED status?

Hmm ... I have not been able to find any explanation in the UFSHCI 2.1
specification that says when the OCS status is set to aborted. Did I
perhaps overlook something?

This is what I found in the UTRLCLR description: "The host software 
shall use this field only when a UTP Transfer Request is expected to
not be completed, e.g., when the host software receives a ?FUNCTION
COMPLETE? Task Management response which means a Transfer Request was
aborted." This does not mean that the host controller is expected to
set the OCS status to "ABORTED". I will send an email to the JC-64
mailing list to request clarification.

>>> +/*
>>> + * When the host software receives a "FUNCTION COMPLETE", set flag
>>> + * to requeue command after receive response with OCS_ABORTED
>>> + * SDB mode: UTRLCLR Task Management response which means a
>> Transfer
>>> + *           Request was aborted.
>>> + * MCQ mode: Host will post to CQ with OCS_ABORTED after SQ
>> cleanup
>>> + * This flag is set because ufshcd_abort_all forcibly aborts all
>>> + * commands, and the host will automatically fill in the OCS field
>>> + * of the corresponding response with OCS_ABORTED.
>>> + * Therefore, upon receiving this response, it needs to be
>> requeued.
>>> + */
>>> +if (!err)
>>> +lrbp->abort_initiated_by_err = true;
>>> +
>>>    err = ufshcd_clear_cmd(hba, tag);
>>>    if (err)
>>>    dev_err(hba->dev, "%s: Failed clearing cmd at tag %d, err %d\n",
>>
>> The above change is misplaced. ufshcd_try_to_abort_task() can be
>> called
>> when the SCSI core decides to abort a command while
>> abort_initiated_by_err must not be set in that case. Please move the
>> above code block into ufshcd_abort_one().
> 
> But move to ufshcd_abort_one may have race condition, beacause we
> need set this flag before ufshcd_clear_cmd host controller fill
> OCS_ABORTED to response. I will add check ufshcd_eh_in_progress.

Calling ufshcd_clear_cmd() does not affect the OCS status as far as I
know. Did I perhaps overlook something?

Thanks,

Bart.


From conor at kernel.org  Wed Sep 11 12:17:04 2024
From: conor at kernel.org (Conor Dooley)
Date: Wed, 11 Sep 2024 20:17:04 +0100
Subject: [PATCH] dt-bindings: clock: mediatek: Drop duplicate
 mediatek,mt6795-sys-clock.yaml
In-Reply-To: <20240910234238.1028422-1-robh@kernel.org>
References: <20240910234238.1028422-1-robh@kernel.org>
Message-ID: <20240911-train-carnage-f19405590f8d@spud>

On Tue, Sep 10, 2024 at 06:42:37PM -0500, Rob Herring (Arm) wrote:
> The compatible strings for mt6795 clocks are also documented in other
> schemas:
> 
> "mediatek,mt6795-apmixedsys" in clock/mediatek,apmixedsys.yaml
> "mediatek,mt6795-topckgen" in clock/mediatek,topckgen.yaml
> "mediatek,mt6795-pericfg" in clock/mediatek,pericfg.yaml
> "mediatek,mt6795-infracfg" in clock/mediatek,infracfg.yaml
> 
> The only difference is #reset-cells is not allowed in some of these,
> but that aligns with actual users in .dts files.

Acked-by: Conor Dooley <conor.dooley at microchip.com>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 228 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-mediatek/attachments/20240911/b171aae3/attachment.sig>

From bvanassche at acm.org  Wed Sep 11 12:37:12 2024
From: bvanassche at acm.org (Bart Van Assche)
Date: Wed, 11 Sep 2024 12:37:12 -0700
Subject: [PATCH v6 2/2] ufs: core: requeue aborted request
In-Reply-To: <20240911095622.19225-3-peter.wang@mediatek.com>
References: <20240911095622.19225-1-peter.wang@mediatek.com>
 <20240911095622.19225-3-peter.wang@mediatek.com>
Message-ID: <55d2cca5-0e30-4734-aa25-d5f5cdfbfd93@acm.org>

On 9/11/24 2:56 AM, peter.wang at mediatek.com wrote:
> ufshcd_abort_all forcibly aborts all on-going commands and the host
> controller will automatically fill in the OCS field of the corresponding
> response with OCS_ABORTED based on different working modes.
> 
> MCQ mode: aborts a command using SQ cleanup, The host controller
> will post a Completion Queue entry with OCS = ABORTED.
> 
> SDB mode: aborts a command using UTRLCLR. Task Management response
> which means a Transfer Request was aborted.

I think this is incorrect. The UFSHCI specification does not require a
host controller to set the OCS field if a SCSI command is aborted by the
ABORT TMF nor if its resources are freed by writing into the UTRLCLR
register.

> @@ -5404,7 +5405,10 @@ ufshcd_transfer_rsp_status(struct ufs_hba *hba, struct ufshcd_lrb *lrbp,
>   		}
>   		break;
>   	case OCS_ABORTED:
> -		result |= DID_ABORT << 16;
> +		if (lrbp->abort_initiated_by_eh)
> +			result |= DID_REQUEUE << 16;
> +		else
> +			result |= DID_ABORT << 16;
>   		break;

Is the above change necessary? ufshcd_abort_one() aborts commands by
submitting an ABORT TMF. Hence, ufshcd_transfer_rsp_status() won't be
called if aborting the command succeeds.

> @@ -7561,6 +7551,21 @@ int ufshcd_try_to_abort_task(struct ufs_hba *hba, int tag)
>   		goto out;
>   	}
>   
> +	/*
> +	 * When the host software receives a "FUNCTION COMPLETE", set flag
> +	 * to requeue command after receive response with OCS_ABORTED
> +	 * SDB mode: UTRLCLR Task Management response which means a Transfer
> +	 *           Request was aborted.
> +	 * MCQ mode: Host will post to CQ with OCS_ABORTED after SQ cleanup
> +	 *
> +	 * This flag is set because error handler ufshcd_abort_all forcibly
> +	 * aborts all commands, and the host controller will automatically
> +	 * fill in the OCS field of the corresponding response with OCS_ABORTED.
> +	 * Therefore, upon receiving this response, it needs to be requeued.
> +	 */
> +	if (!err && ufshcd_eh_in_progress(hba))
> +		lrbp->abort_initiated_by_eh = true;
> +
>   	err = ufshcd_clear_cmd(hba, tag);
>   	if (err)
>   		dev_err(hba->dev, "%s: Failed clearing cmd at tag %d, err %d\n",

The above change will cause lrbp->abort_initiated_by_eh to be set not
only if the UFS error handler decides to abort a command but also if the
SCSI core decides to abort a command. I think this is wrong.

Is this patch 2/2 necessary or is patch 1/2 perhaps sufficient?

Thanks,

Bart.


From lorenzo at kernel.org  Wed Sep 11 12:50:00 2024
From: lorenzo at kernel.org (Lorenzo Bianconi)
Date: Wed, 11 Sep 2024 21:50:00 +0200
Subject: [PATCH v4 0/5] Add mfd, pinctrl and pwm support to EN7581 SoC
Message-ID: <20240911-en7581-pinctrl-v4-0-60ac93d760bb@kernel.org>

Introduce airoha-mfd driver in order to load pinctrl and pwm drivers for
EN7581 SoC. airoha-mfd is needed since both pinctrl and pwm drivers
needs to access the same memory block (gpio memory region) to configure
{gio,irq}_chip and pwm functionalities respectively, so model them as
childs of a parent mfd driver.
Current EN7581 pinctrl driver supports the following functionalities:
- pin multiplexing via chip_scu syscon
- pin pull-up, pull-down, open-drain, current strength,
  {input,output}_enable, output_{low,high} via chip_scu syscon
- gpio controller
- irq controller

---
Changes in v4:
- add 'Limitation' description in pwm driver
- fix comments in pwm driver
- rely on mfd->base __iomem pointer in pwm driver, modify register
  offsets according to it and get rid of sgpio_cfg, flash_cfg and
  cycle_cfg pointers
- simplify register utility routines in pwm driver
- use 'generator' instead of 'waveform' suffix for pwm routines
- fix possible overflow calculating duty cycle in pwm driver
- do not modify pwm state in free callback in pwm driver
- cap the maximum period in pwm driver
- do not allow inverse polarity in pwm driver
- do not set of_xlate callback in the pwm driver and allow the stack to
  do it
- fix MAINTAINERS file for airoha pinctrl driver
- fix undefined reference to __ffsdi2 in pinctrl driver
- simplify airoha,en7581-gpio-sysctl.yam binding
- Link to v3: https://lore.kernel.org/r/20240831-en7581-pinctrl-v3-0-98eebfb4da66 at kernel.org

Changes in v3:
- introduce airoha-mfd driver
- add pwm driver to the same series
- model pinctrl and pwm drivers as childs of a parent mfd driver.
- access chip-scu memory region in pinctrl driver via syscon
- introduce a single airoha,en7581-gpio-sysctl.yaml binding and get rid
  of dedicated bindings for pinctrl and pwm
- add airoha,en7581-chip-scu.yaml binding do the series
- Link to v2: https://lore.kernel.org/r/20240822-en7581-pinctrl-v2-0-ba1559173a7f at kernel.org

Changes in v2:
- Fix compilation errors
- Collapse some register mappings for gpio and irq controllers
- update dt-bindings according to new register mapping
- fix some dt-bindings errors
- Link to v1: https://lore.kernel.org/all/cover.1723392444.git.lorenzo at kernel.org/

---
Benjamin Larsson (1):
      pwm: airoha: Add support for EN7581 SoC

Christian Marangi (2):
      dt-bindings: mfd: Add support for Airoha EN7581 GPIO System Controller
      mfd: airoha: Add support for Airoha EN7581 MFD

Lorenzo Bianconi (2):
      dt-bindings: arm: airoha: Add the chip-scu node for EN7581 SoC
      pinctrl: airoha: Add support for EN7581 SoC

 .../bindings/arm/airoha,en7581-chip-scu.yaml       |   42 +
 .../bindings/mfd/airoha,en7581-gpio-sysctl.yaml    |  433 +++
 MAINTAINERS                                        |    7 +
 drivers/mfd/Kconfig                                |    8 +
 drivers/mfd/Makefile                               |    2 +
 drivers/mfd/airoha-en7581-gpio-mfd.c               |   72 +
 drivers/pinctrl/mediatek/Kconfig                   |   16 +-
 drivers/pinctrl/mediatek/Makefile                  |    1 +
 drivers/pinctrl/mediatek/pinctrl-airoha.c          | 2964 ++++++++++++++++++++
 drivers/pwm/Kconfig                                |   10 +
 drivers/pwm/Makefile                               |    1 +
 drivers/pwm/pwm-airoha.c                           |  414 +++
 include/linux/mfd/airoha-en7581-mfd.h              |    9 +
 13 files changed, 3978 insertions(+), 1 deletion(-)
---
base-commit: 264c13114bd71ddfd7b25c7b94f6cda4587eca25
change-id: 20240818-en7581-pinctrl-1bf120154be0
prerequisite-change-id: 20240705-for-6-11-bpf-a349efc08df8:v2

Best regards,
-- 
Lorenzo Bianconi <lorenzo at kernel.org>



From lorenzo at kernel.org  Wed Sep 11 12:50:01 2024
From: lorenzo at kernel.org (Lorenzo Bianconi)
Date: Wed, 11 Sep 2024 21:50:01 +0200
Subject: [PATCH v4 1/5] dt-bindings: arm: airoha: Add the chip-scu node for
 EN7581 SoC
In-Reply-To: <20240911-en7581-pinctrl-v4-0-60ac93d760bb@kernel.org>
References: <20240911-en7581-pinctrl-v4-0-60ac93d760bb@kernel.org>
Message-ID: <20240911-en7581-pinctrl-v4-1-60ac93d760bb@kernel.org>

This patch adds the chip-scu document bindings for EN7581 SoC.
The airoha chip-scu block provides a configuration interface for clock,
io-muxing and other functionalities used by multiple controllers (e.g.
clock, pinctrl, ecc.) on EN7581 SoC.

Reviewed-by: Rob Herring (Arm) <robh at kernel.org>
Signed-off-by: Lorenzo Bianconi <lorenzo at kernel.org>
---
 .../bindings/arm/airoha,en7581-chip-scu.yaml       | 42 ++++++++++++++++++++++
 1 file changed, 42 insertions(+)

diff --git a/Documentation/devicetree/bindings/arm/airoha,en7581-chip-scu.yaml b/Documentation/devicetree/bindings/arm/airoha,en7581-chip-scu.yaml
new file mode 100644
index 000000000000..67c449d804c2
--- /dev/null
+++ b/Documentation/devicetree/bindings/arm/airoha,en7581-chip-scu.yaml
@@ -0,0 +1,42 @@
+# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/arm/airoha,en7581-chip-scu.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Airoha Chip SCU Controller for EN7581 SoC
+
+maintainers:
+  - Lorenzo Bianconi <lorenzo at kernel.org>
+
+description:
+  The airoha chip-scu block provides a configuration interface for clock,
+  io-muxing and other functionalities used by multiple controllers (e.g. clock,
+  pinctrl, ecc) on EN7581 SoC.
+
+properties:
+  compatible:
+    items:
+      - enum:
+          - airoha,en7581-chip-scu
+      - const: syscon
+
+  reg:
+    maxItems: 1
+
+required:
+  - compatible
+  - reg
+
+additionalProperties: false
+
+examples:
+  - |
+    soc {
+      #address-cells = <2>;
+      #size-cells = <2>;
+      syscon at 1fa20000 {
+        compatible = "airoha,en7581-chip-scu", "syscon";
+        reg = <0x0 0x1fa20000 0x0 0x388>;
+      };
+    };

-- 
2.46.0



From lorenzo at kernel.org  Wed Sep 11 12:50:02 2024
From: lorenzo at kernel.org (Lorenzo Bianconi)
Date: Wed, 11 Sep 2024 21:50:02 +0200
Subject: [PATCH v4 2/5] dt-bindings: mfd: Add support for Airoha EN7581
 GPIO System Controller
In-Reply-To: <20240911-en7581-pinctrl-v4-0-60ac93d760bb@kernel.org>
References: <20240911-en7581-pinctrl-v4-0-60ac93d760bb@kernel.org>
Message-ID: <20240911-en7581-pinctrl-v4-2-60ac93d760bb@kernel.org>

From: Christian Marangi <ansuelsmth at gmail.com>

Add support for Airoha EN7581 GPIO System Controller which provide a
register map for controlling the GPIO, pinctrl and PWM of the SoC.

Schema define cells for both gpio/interrupt controller and PWM.
Moreover it provides a dedicated pinctrl node for pins and config
definitions.

Signed-off-by: Christian Marangi <ansuelsmth at gmail.com>
Co-developed-by: Lorenzo Bianconi <lorenzo at kernel.org>
Signed-off-by: Lorenzo Bianconi <lorenzo at kernel.org>
---
 .../bindings/mfd/airoha,en7581-gpio-sysctl.yaml    | 433 +++++++++++++++++++++
 1 file changed, 433 insertions(+)

diff --git a/Documentation/devicetree/bindings/mfd/airoha,en7581-gpio-sysctl.yaml b/Documentation/devicetree/bindings/mfd/airoha,en7581-gpio-sysctl.yaml
new file mode 100644
index 000000000000..98396db40e67
--- /dev/null
+++ b/Documentation/devicetree/bindings/mfd/airoha,en7581-gpio-sysctl.yaml
@@ -0,0 +1,433 @@
+# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/mfd/airoha,en7581-gpio-sysctl.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Airoha EN7581 GPIO System Controller
+
+maintainers:
+  - Christian Marangi <ansuelsmth at gmail.com>
+  - Lorenzo Bianconi <lorenzo at kernel.org>
+
+description:
+  Airoha EN7581 SoC GPIO system controller which provided a register map
+  for controlling the GPIO, pins and PWM of the SoC.
+
+properties:
+  compatible:
+    const: airoha,en7581-gpio-sysctl
+
+  reg:
+    maxItems: 1
+
+  interrupts:
+    maxItems: 1
+
+  gpio-controller: true
+
+  '#gpio-cells':
+    const: 2
+
+  interrupt-controller: true
+
+  '#interrupt-cells':
+    const: 2
+
+  "#pwm-cells":
+    const: 3
+
+  pinctrl:
+    type: object
+
+    $ref: /schemas/pinctrl/pinctrl.yaml
+
+    patternProperties:
+      '-pins$':
+        type: object
+
+        patternProperties:
+          '^mux(-|$)':
+            type: object
+
+            description:
+              pinmux configuration nodes.
+
+            $ref: /schemas/pinctrl/pinmux-node.yaml
+
+            properties:
+              function:
+                description:
+                  A string containing the name of the function to mux to the group.
+                enum: [pon, tod_1pps, sipo, mdio, uart, i2c, jtag, pcm, spi,
+                       pcm_spi, i2s, emmc, pnand, pcie_reset, pwm, phy1_led0,
+                       phy2_led0, phy3_led0, phy4_led0, phy1_led1, phy2_led1,
+                       phy3_led1, phy4_led1]
+
+              groups:
+                description:
+                  An array of strings. Each string contains the name of a group.
+
+            required:
+              - function
+              - groups
+
+            allOf:
+              - if:
+                  properties:
+                    function:
+                      const: pon
+                then:
+                  properties:
+                    groups:
+                      enum: [pon]
+              - if:
+                  properties:
+                    function:
+                      const: tod_1pps
+                then:
+                  properties:
+                    groups:
+                      enum: [pon_tod_1pps, gsw_tod_1pps]
+              - if:
+                  properties:
+                    function:
+                      const: sipo
+                then:
+                  properties:
+                    groups:
+                      enum: [sipo, sipo_rclk]
+              - if:
+                  properties:
+                    function:
+                      const: mdio
+                then:
+                  properties:
+                    groups:
+                      enum: [mdio]
+              - if:
+                  properties:
+                    function:
+                      const: uart
+                then:
+                  properties:
+                    groups:
+                      items:
+                        enum: [uart2, uart2_cts_rts, hsuart, hsuart_cts_rts, uart4,
+                               uart5]
+                      maxItems: 2
+              - if:
+                  properties:
+                    function:
+                      const: i2c
+                then:
+                  properties:
+                    groups:
+                      enum: [i2c1]
+              - if:
+                  properties:
+                    function:
+                      const: jtag
+                then:
+                  properties:
+                    groups:
+                      enum: [jtag_udi, jtag_dfd]
+              - if:
+                  properties:
+                    function:
+                      const: pcm
+                then:
+                  properties:
+                    groups:
+                      enum: [pcm1, pcm2]
+              - if:
+                  properties:
+                    function:
+                      const: spi
+                then:
+                  properties:
+                    groups:
+                      items:
+                        enum: [spi_quad, spi_cs1]
+                      maxItems: 2
+              - if:
+                  properties:
+                    function:
+                      const: pcm_spi
+                then:
+                  properties:
+                    groups:
+                      items:
+                        enum: [pcm_spi, pcm_spi_int, pcm_spi_rst, pcm_spi_cs1,
+                               pcm_spi_cs2_p156, pcm_spi_cs2_p128, pcm_spi_cs3,
+                               pcm_spi_cs4]
+                      maxItems: 7
+              - if:
+                  properties:
+                    function:
+                      const: i2c
+                then:
+                  properties:
+                    groups:
+                      enum: [i2s]
+              - if:
+                  properties:
+                    function:
+                      const: emmc
+                then:
+                  properties:
+                    groups:
+                      enum: [emmc]
+              - if:
+                  properties:
+                    function:
+                      const: pnand
+                then:
+                  properties:
+                    groups:
+                      enum: [pnand]
+              - if:
+                  properties:
+                    function:
+                      const: pcie_reset
+                then:
+                  properties:
+                    groups:
+                      enum: [pcie_reset0, pcie_reset1, pcie_reset2]
+              - if:
+                  properties:
+                    function:
+                      const: pwm
+                then:
+                  properties:
+                    groups:
+                      enum: [gpio0, gpio1, gpio2, gpio3, gpio4, gpio5, gpio6,
+                             gpio7, gpio8, gpio9, gpio10, gpio11, gpio12, gpio13,
+                             gpio14, gpio15, gpio16, gpio17, gpio18, gpio19,
+                             gpio20, gpio21, gpio22, gpio23, gpio24, gpio25,
+                             gpio26, gpio27, gpio28, gpio29, gpio30, gpio31,
+                             gpio36, gpio37, gpio38, gpio39, gpio40, gpio41,
+                             gpio42, gpio43, gpio44, gpio45, gpio46, gpio47]
+              - if:
+                  properties:
+                    function:
+                      const: phy1_led0
+                then:
+                  properties:
+                    groups:
+                      enum: [gpio33, gpio34, gpio35, gpio42]
+              - if:
+                  properties:
+                    function:
+                      const: phy2_led0
+                then:
+                  properties:
+                    groups:
+                      enum: [gpio33, gpio34, gpio35, gpio42]
+              - if:
+                  properties:
+                    function:
+                      const: phy3_led0
+                then:
+                  properties:
+                    groups:
+                      enum: [gpio33, gpio34, gpio35, gpio42]
+              - if:
+                  properties:
+                    function:
+                      const: phy4_led0
+                then:
+                  properties:
+                    groups:
+                      enum: [gpio33, gpio34, gpio35, gpio42]
+              - if:
+                  properties:
+                    function:
+                      const: phy1_led1
+                then:
+                  properties:
+                    groups:
+                      enum: [gpio43, gpio44, gpio45, gpio46]
+              - if:
+                  properties:
+                    function:
+                      const: phy2_led1
+                then:
+                  properties:
+                    groups:
+                      enum: [gpio43, gpio44, gpio45, gpio46]
+              - if:
+                  properties:
+                    function:
+                      const: phy3_led1
+                then:
+                  properties:
+                    groups:
+                      enum: [gpio43, gpio44, gpio45, gpio46]
+              - if:
+                  properties:
+                    function:
+                      const: phy4_led1
+                then:
+                  properties:
+                    groups:
+                      enum: [gpio43, gpio44, gpio45, gpio46]
+
+            additionalProperties: false
+
+          '^conf(-|$)':
+            type: object
+
+            description:
+              pinconf configuration nodes.
+
+            $ref: /schemas/pinctrl/pincfg-node.yaml
+
+            properties:
+              pins:
+                description:
+                  An array of strings. Each string contains the name of a pin.
+                items:
+                  enum: [uart1_txd, uart1_rxd, i2c_scl, i2c_sda, spi_cs0, spi_clk,
+                         spi_mosi, spi_miso, gpio0, gpio1, gpio2, gpio3, gpio4,
+                         gpio5, gpio6, gpio7, gpio8, gpio9, gpio10, gpio11, gpio12,
+                         gpio13, gpio14, gpio15, gpio16, gpio17, gpio18, gpio19,
+                         gpio20, gpio21, gpio22, gpio23, gpio24, gpio25, gpio26,
+                         gpio27, gpio28, gpio29, gpio30, gpio31, gpio32, gpio33,
+                         gpio34, gpio35, gpio36, gpio37, gpio38, gpio39, gpio40,
+                         gpio41, gpio42, gpio43, gpio44, gpio45, gpio46,
+                         pcie_reset0, pcie_reset1, pcie_reset2]
+                minItems: 1
+                maxItems: 58
+
+              bias-disable: true
+
+              bias-pull-up: true
+
+              bias-pull-down: true
+
+              input-enable: true
+
+              output-enable: true
+
+              output-low: true
+
+              output-high: true
+
+              drive-open-drain: true
+
+              drive-strength:
+                description:
+                  Selects the drive strength for MIO pins, in mA.
+                enum: [2, 4, 6, 8]
+
+            required:
+              - pins
+
+            additionalProperties: false
+
+        additionalProperties: false
+
+    additionalProperties: false
+
+required:
+  - compatible
+  - reg
+  - interrupts
+  - gpio-controller
+  - "#gpio-cells"
+  - "#pwm-cells"
+
+additionalProperties: false
+
+examples:
+  - |
+    #include <dt-bindings/interrupt-controller/arm-gic.h>
+
+    mfd at 1fbf0200 {
+        compatible = "airoha,en7581-gpio-sysctl";
+        reg = <0x1fbf0200 0xc0>;
+
+        interrupt-parent = <&gic>;
+        interrupts = <GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>;
+
+        gpio-controller;
+        #gpio-cells = <2>;
+
+        interrupt-controller;
+        #interrupt-cells = <2>;
+
+        #pwm-cells = <3>;
+
+        pinctrl {
+            pcie1-rst-pins {
+                conf {
+                    pins = "pcie_reset1";
+                    drive-open-drain = <1>;
+                };
+            };
+
+            pwm-pins {
+                mux {
+                    function = "pwm";
+                    groups = "gpio18";
+                };
+            };
+
+            spi-pins {
+                mux {
+                    function = "spi";
+                    groups = "spi_quad", "spi_cs1";
+                };
+            };
+
+            uart2-pins {
+                mux {
+                    function = "uart";
+                    groups = "uart2", "uart2_cts_rts";
+                };
+            };
+
+            uar5-pins {
+                mux {
+                    function = "uart";
+                    groups = "uart5";
+                };
+            };
+
+            mmc-pins {
+                mux {
+                    function = "emmc";
+                    groups = "emmc";
+                };
+            };
+
+            mdio-pins {
+                mux {
+                    function = "mdio";
+                    groups = "mdio";
+                };
+
+                conf {
+                    pins = "gpio2";
+                    output-enable;
+                };
+            };
+
+            gswp1-led0-pins {
+                mux {
+                    function = "phy1_led0";
+                    groups = "gpio33";
+                };
+            };
+
+            gswp2-led1-pins {
+                mux {
+                    function = "phy2_led1";
+                    groups = "gpio44";
+                };
+            };
+        };
+    };
+
+...

-- 
2.46.0



From lorenzo at kernel.org  Wed Sep 11 12:50:03 2024
From: lorenzo at kernel.org (Lorenzo Bianconi)
Date: Wed, 11 Sep 2024 21:50:03 +0200
Subject: [PATCH v4 3/5] mfd: airoha: Add support for Airoha EN7581 MFD
In-Reply-To: <20240911-en7581-pinctrl-v4-0-60ac93d760bb@kernel.org>
References: <20240911-en7581-pinctrl-v4-0-60ac93d760bb@kernel.org>
Message-ID: <20240911-en7581-pinctrl-v4-3-60ac93d760bb@kernel.org>

From: Christian Marangi <ansuelsmth at gmail.com>

Support for Airoha EN7581 Multi Function Device that
expose PINCTRL functionality and PWM functionality.

Signed-off-by: Christian Marangi <ansuelsmth at gmail.com>
---
 drivers/mfd/Kconfig                   |  8 ++++
 drivers/mfd/Makefile                  |  2 +
 drivers/mfd/airoha-en7581-gpio-mfd.c  | 72 +++++++++++++++++++++++++++++++++++
 include/linux/mfd/airoha-en7581-mfd.h |  9 +++++
 4 files changed, 91 insertions(+)

diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
index bc8be2e593b6..c690378066ac 100644
--- a/drivers/mfd/Kconfig
+++ b/drivers/mfd/Kconfig
@@ -20,6 +20,14 @@ config MFD_CS5535
 	  This is the core driver for CS5535/CS5536 MFD functions.  This is
 	  necessary for using the board's GPIO and MFGPT functionality.
 
+config MFD_AIROHA_EN7581
+	bool "Airoha EN7581 Multi Function Device"
+	depends on (ARCH_AIROHA || COMPILE_TEST) && OF
+	select MFD_CORE
+	help
+	  Support for Airoha EN7581 Multi Function Device that
+	  expose PINCTRL functionality and PWM functionality.
+
 config MFD_ALTERA_A10SR
 	bool "Altera Arria10 DevKit System Resource chip"
 	depends on ARCH_INTEL_SOCFPGA && SPI_MASTER=y && OF
diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
index 02b651cd7535..075dbff618e0 100644
--- a/drivers/mfd/Makefile
+++ b/drivers/mfd/Makefile
@@ -256,6 +256,8 @@ obj-$(CONFIG_INTEL_SOC_PMIC_CHTWC)	+= intel_soc_pmic_chtwc.o
 obj-$(CONFIG_INTEL_SOC_PMIC_CHTDC_TI)	+= intel_soc_pmic_chtdc_ti.o
 obj-$(CONFIG_INTEL_SOC_PMIC_MRFLD)	+= intel_soc_pmic_mrfld.o
 
+obj-$(CONFIG_MFD_AIROHA_EN7581)	+= airoha-en7581-gpio-mfd.o
+
 obj-$(CONFIG_MFD_ALTERA_A10SR)	+= altera-a10sr.o
 obj-$(CONFIG_MFD_ALTERA_SYSMGR) += altera-sysmgr.o
 obj-$(CONFIG_MFD_STPMIC1)	+= stpmic1.o
diff --git a/drivers/mfd/airoha-en7581-gpio-mfd.c b/drivers/mfd/airoha-en7581-gpio-mfd.c
new file mode 100644
index 000000000000..88407ce5747e
--- /dev/null
+++ b/drivers/mfd/airoha-en7581-gpio-mfd.c
@@ -0,0 +1,72 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * MFD driver for Airoha EN7581
+ */
+
+#include <linux/io.h>
+#include <linux/of.h>
+#include <linux/mfd/airoha-en7581-mfd.h>
+#include <linux/mfd/core.h>
+#include <linux/module.h>
+
+static struct resource airoha_mfd_pinctrl_intr[] = {
+	{
+		.flags = IORESOURCE_IRQ,
+	},
+};
+
+static const struct mfd_cell airoha_mfd_devs[] = {
+	{
+		.name = "pinctrl-airoha",
+		.resources = airoha_mfd_pinctrl_intr,
+		.num_resources = ARRAY_SIZE(airoha_mfd_pinctrl_intr),
+	}, {
+		.name = "pwm-airoha",
+	},
+};
+
+static int airoha_mfd_probe(struct platform_device *pdev)
+{
+	struct device *dev = &pdev->dev;
+	struct airoha_mfd *mfd;
+	int irq;
+
+	mfd = devm_kzalloc(dev, sizeof(*mfd), GFP_KERNEL);
+	if (!mfd)
+		return -ENOMEM;
+
+	platform_set_drvdata(pdev, mfd);
+
+	mfd->base = devm_platform_ioremap_resource(pdev, 0);
+	if (IS_ERR(mfd->base))
+		return PTR_ERR(mfd->base);
+
+	irq = platform_get_irq(pdev, 0);
+	if (irq < 0)
+		return irq;
+
+	airoha_mfd_pinctrl_intr[0].start = irq;
+	airoha_mfd_pinctrl_intr[0].end = irq;
+
+	return devm_mfd_add_devices(dev, PLATFORM_DEVID_AUTO, airoha_mfd_devs,
+				    ARRAY_SIZE(airoha_mfd_devs), NULL, 0,
+				    NULL);
+}
+
+static const struct of_device_id airoha_mfd_of_match[] = {
+	{ .compatible = "airoha,en7581-gpio-sysctl" },
+	{ /* sentinel */ }
+};
+MODULE_DEVICE_TABLE(of, airoha_mfd_of_match);
+
+static struct platform_driver airoha_mfd_driver = {
+	.probe = airoha_mfd_probe,
+	.driver = {
+		.name = KBUILD_MODNAME,
+		.of_match_table = airoha_mfd_of_match,
+	},
+};
+module_platform_driver(airoha_mfd_driver);
+
+MODULE_AUTHOR("Christian Marangi <ansuelsmth at gmail.com>");
+MODULE_DESCRIPTION("Driver for Airoha EN7581 MFD");
diff --git a/include/linux/mfd/airoha-en7581-mfd.h b/include/linux/mfd/airoha-en7581-mfd.h
new file mode 100644
index 000000000000..25e73952a777
--- /dev/null
+++ b/include/linux/mfd/airoha-en7581-mfd.h
@@ -0,0 +1,9 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef _LINUX_INCLUDE_MFD_AIROHA_EN7581_MFD_H_
+#define _LINUX_INCLUDE_MFD_AIROHA_EN7581_MFD_H_
+
+struct airoha_mfd {
+	void __iomem *base;
+};
+
+#endif  /* _LINUX_INCLUDE_MFD_AIROHA_EN7581_MFD_H_ */

-- 
2.46.0



From lorenzo at kernel.org  Wed Sep 11 12:50:05 2024
From: lorenzo at kernel.org (Lorenzo Bianconi)
Date: Wed, 11 Sep 2024 21:50:05 +0200
Subject: [PATCH v4 5/5] pwm: airoha: Add support for EN7581 SoC
In-Reply-To: <20240911-en7581-pinctrl-v4-0-60ac93d760bb@kernel.org>
References: <20240911-en7581-pinctrl-v4-0-60ac93d760bb@kernel.org>
Message-ID: <20240911-en7581-pinctrl-v4-5-60ac93d760bb@kernel.org>

From: Benjamin Larsson <benjamin.larsson at genexis.eu>

Introduce driver for PWM module available on EN7581 SoC.

Signed-off-by: Benjamin Larsson <benjamin.larsson at genexis.eu>
Co-developed-by: Lorenzo Bianconi <lorenzo at kernel.org>
Signed-off-by: Lorenzo Bianconi <lorenzo at kernel.org>
---
 drivers/pwm/Kconfig      |  10 ++
 drivers/pwm/Makefile     |   1 +
 drivers/pwm/pwm-airoha.c | 414 +++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 425 insertions(+)

diff --git a/drivers/pwm/Kconfig b/drivers/pwm/Kconfig
index 3e53838990f5..0a78bda0707d 100644
--- a/drivers/pwm/Kconfig
+++ b/drivers/pwm/Kconfig
@@ -47,6 +47,16 @@ config PWM_AB8500
 	  To compile this driver as a module, choose M here: the module
 	  will be called pwm-ab8500.
 
+config PWM_AIROHA
+	tristate "Airoha PWM support"
+	depends on ARCH_AIROHA || COMPILE_TEST
+	depends on OF
+	help
+	  Generic PWM framework driver for Airoha SoC.
+
+	  To compile this driver as a module, choose M here: the module
+	  will be called pwm-airoha.
+
 config PWM_APPLE
 	tristate "Apple SoC PWM support"
 	depends on ARCH_APPLE || COMPILE_TEST
diff --git a/drivers/pwm/Makefile b/drivers/pwm/Makefile
index 0be4f3e6dd43..7ee61822d88d 100644
--- a/drivers/pwm/Makefile
+++ b/drivers/pwm/Makefile
@@ -1,6 +1,7 @@
 # SPDX-License-Identifier: GPL-2.0
 obj-$(CONFIG_PWM)		+= core.o
 obj-$(CONFIG_PWM_AB8500)	+= pwm-ab8500.o
+obj-$(CONFIG_PWM_AIROHA)	+= pwm-airoha.o
 obj-$(CONFIG_PWM_APPLE)		+= pwm-apple.o
 obj-$(CONFIG_PWM_ATMEL)		+= pwm-atmel.o
 obj-$(CONFIG_PWM_ATMEL_HLCDC_PWM)	+= pwm-atmel-hlcdc.o
diff --git a/drivers/pwm/pwm-airoha.c b/drivers/pwm/pwm-airoha.c
new file mode 100644
index 000000000000..bab2e15e06e7
--- /dev/null
+++ b/drivers/pwm/pwm-airoha.c
@@ -0,0 +1,414 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright 2022 Markus Gothe <markus.gothe at genexis.eu>
+ *
+ *  Limitations:
+ *  - No disable bit, so a disabled PWM is simulated by setting duty_cycle to 0
+ *  - Only 8 concurrent waveform generators are available for 8 combinations of
+ *    duty_cycle and period. Waveform generators are shared between 16 GPIO
+ *    pins and 17 SIPO GPIO pins.
+ *  - Supports only normal polarity.
+ *  - On configuration the currently running period is completed.
+ */
+
+#include <linux/bitfield.h>
+#include <linux/err.h>
+#include <linux/io.h>
+#include <linux/iopoll.h>
+#include <linux/mfd/airoha-en7581-mfd.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/platform_device.h>
+#include <linux/pwm.h>
+#include <linux/gpio.h>
+#include <linux/bitops.h>
+#include <asm/div64.h>
+
+#define REG_SGPIO_LED_DATA		0x0024
+#define SGPIO_LED_DATA_SHIFT_FLAG	BIT(31)
+#define SGPIO_LED_DATA_DATA		GENMASK(16, 0)
+
+#define REG_SGPIO_CLK_DIVR		0x0028
+#define REG_SGPIO_CLK_DLY		0x002c
+
+#define REG_SIPO_FLASH_MODE_CFG		0x0030
+#define SERIAL_GPIO_FLASH_MODE		BIT(1)
+#define SERIAL_GPIO_MODE		BIT(0)
+
+#define REG_GPIO_FLASH_PRD_SET(_n)	(0x003c + ((_n) << 2))
+#define GPIO_FLASH_PRD_MASK(_n)		GENMASK(15 + ((_n) << 4), ((_n) << 4))
+
+#define REG_GPIO_FLASH_MAP(_n)		(0x004c + ((_n) << 2))
+#define GPIO_FLASH_SETID_MASK(_n)	GENMASK(2 + ((_n) << 2), ((_n) << 2))
+#define GPIO_FLASH_EN(_n)		BIT(3 + ((_n) << 2))
+
+#define REG_SIPO_FLASH_MAP(_n)		(0x0054 + ((_n) << 2))
+
+#define REG_CYCLE_CFG_VALUE(_n)		(0x0098 + ((_n) << 2))
+#define WAVE_GEN_CYCLE_MASK(_n)		GENMASK(7 + ((_n) << 3), ((_n) << 3))
+
+struct airoha_pwm {
+	void __iomem *base;
+
+	struct device_node *np;
+	u64 initialized;
+
+	struct {
+		/* Bitmask of PWM channels using this bucket */
+		u64 used;
+		u64 period_ns;
+		u64 duty_ns;
+	} bucket[8];
+};
+
+/*
+ * The first 16 GPIO pins, GPIO0-GPIO15, are mapped into 16 PWM channels, 0-15.
+ * The SIPO GPIO pins are 17 pins which are mapped into 17 PWM channels, 16-32.
+ * However, we've only got 8 concurrent waveform generators and can therefore
+ * only use up to 8 different combinations of duty cycle and period at a time.
+ */
+#define PWM_NUM_GPIO	16
+#define PWM_NUM_SIPO	17
+
+/* The PWM hardware supports periods between 4 ms and 1 s */
+#define PERIOD_MIN_NS	(4 * NSEC_PER_MSEC)
+#define PERIOD_MAX_NS	(1 * NSEC_PER_SEC)
+/* It is represented internally as 1/250 s between 1 and 250 */
+#define PERIOD_MIN	1
+#define PERIOD_MAX	250
+/* Duty cycle is relative with 255 corresponding to 100% */
+#define DUTY_FULL	255
+
+static u32 airoha_pwm_rmw(struct airoha_pwm *pc, u32 addr, u32 mask, u32 val)
+{
+	val |= (readl(pc->base + addr) & ~mask);
+	writel(val, pc->base + addr);
+
+	return val;
+}
+
+#define airoha_pwm_set_bits(pc, addr, val)	\
+	airoha_pwm_rmw((pc), (addr), (val), (val))
+
+#define airoha_pwm_clear_bit(pc, addr, mask)	\
+	airoha_pwm_rmw(pc, addr, mask, 0)
+
+static int airoha_pwm_get_generator(struct airoha_pwm *pc, u64 duty_ns,
+				    u64 period_ns)
+{
+	int i;
+
+	for (i = 0; i < ARRAY_SIZE(pc->bucket); i++) {
+		if (!pc->bucket[i].used)
+			continue;
+
+		if (duty_ns == pc->bucket[i].duty_ns &&
+		    period_ns == pc->bucket[i].period_ns)
+			return i;
+
+		/*
+		 * Unlike duty cycle zero, which can be handled by
+		 * disabling PWM, a generator is needed for full duty
+		 * cycle but it can be reused regardless of period
+		 */
+		if (duty_ns == DUTY_FULL && pc->bucket[i].duty_ns == DUTY_FULL)
+			return i;
+	}
+
+	return -1;
+}
+
+static void airoha_pwm_release_bucket_config(struct airoha_pwm *pc,
+					     unsigned int hwpwm)
+{
+	int i;
+
+	for (i = 0; i < ARRAY_SIZE(pc->bucket); i++)
+		pc->bucket[i].used &= ~BIT_ULL(hwpwm);
+}
+
+static int airoha_pwm_consume_generator(struct airoha_pwm *pc,
+					u64 duty_ns, u64 period_ns,
+					unsigned int hwpwm)
+{
+	int id = airoha_pwm_get_generator(pc, duty_ns, period_ns);
+
+	if (id < 0) {
+		int i;
+
+		/* find an unused waveform generator */
+		for (i = 0; i < ARRAY_SIZE(pc->bucket); i++) {
+			if (!(pc->bucket[i].used & ~BIT_ULL(hwpwm))) {
+				id = i;
+				break;
+			}
+		}
+	}
+
+	if (id >= 0) {
+		airoha_pwm_release_bucket_config(pc, hwpwm);
+		pc->bucket[id].used |= BIT_ULL(hwpwm);
+		pc->bucket[id].period_ns = period_ns;
+		pc->bucket[id].duty_ns = duty_ns;
+	}
+
+	return id;
+}
+
+static int airoha_pwm_sipo_init(struct airoha_pwm *pc)
+{
+	u32 clk_divr_val = 3, sipo_clock_delay = 1;
+	u32 val, sipo_clock_divisor = 32;
+
+	if (!(pc->initialized >> PWM_NUM_GPIO))
+		return 0;
+
+	/* Select the right shift register chip */
+	if (of_property_read_bool(pc->np, "hc74595"))
+		airoha_pwm_set_bits(pc, REG_SIPO_FLASH_MODE_CFG,
+				    SERIAL_GPIO_MODE);
+	else
+		airoha_pwm_clear_bit(pc, REG_SIPO_FLASH_MODE_CFG,
+				     SERIAL_GPIO_MODE);
+
+	if (!of_property_read_u32(pc->np, "sipo-clock-divisor",
+				  &sipo_clock_divisor)) {
+		switch (sipo_clock_divisor) {
+		case 4:
+			clk_divr_val = 0;
+			break;
+		case 8:
+			clk_divr_val = 1;
+			break;
+		case 16:
+			clk_divr_val = 2;
+			break;
+		case 32:
+			clk_divr_val = 3;
+			break;
+		default:
+			return -EINVAL;
+		}
+	}
+	/* Configure shift register timings */
+	writel(clk_divr_val, pc->base + REG_SGPIO_CLK_DIVR);
+
+	of_property_read_u32(pc->np, "sipo-clock-delay", &sipo_clock_delay);
+	if (sipo_clock_delay < 1 || sipo_clock_delay > sipo_clock_divisor / 2)
+		return -EINVAL;
+
+	/*
+	 * The actual delay is sclkdly + 1 so subtract 1 from
+	 * sipo-clock-delay to calculate the register value
+	 */
+	sipo_clock_delay--;
+	writel(sipo_clock_delay, pc->base + REG_SGPIO_CLK_DLY);
+
+	/*
+	 * It it necessary to after muxing explicitly shift out all
+	 * zeroes to initialize the shift register before enabling PWM
+	 * mode because in PWM mode SIPO will not start shifting until
+	 * it needs to output a non-zero value (bit 31 of led_data
+	 * indicates shifting in progress and it must return to zero
+	 * before led_data can be written or PWM mode can be set)
+	 */
+	if (readl_poll_timeout(pc->base + REG_SGPIO_LED_DATA, val,
+			       !(val & SGPIO_LED_DATA_SHIFT_FLAG), 10,
+			       200 * USEC_PER_MSEC))
+		return -ETIMEDOUT;
+
+	airoha_pwm_clear_bit(pc, REG_SGPIO_LED_DATA, SGPIO_LED_DATA_DATA);
+	if (readl_poll_timeout(pc->base + REG_SGPIO_LED_DATA, val,
+			       !(val & SGPIO_LED_DATA_SHIFT_FLAG), 10,
+			       200 * USEC_PER_MSEC))
+		return -ETIMEDOUT;
+
+	/* Set SIPO in PWM mode */
+	airoha_pwm_set_bits(pc, REG_SIPO_FLASH_MODE_CFG,
+			    SERIAL_GPIO_FLASH_MODE);
+
+	return 0;
+}
+
+static void airoha_pwm_calc_bucket_config(struct airoha_pwm *pc, int index,
+					  u64 duty_ns, u64 period_ns)
+{
+	u32 period, duty, mask, val;
+	u64 tmp;
+
+	tmp = duty_ns * DUTY_FULL;
+	duty = clamp_val(div64_u64(tmp, period_ns), 0, DUTY_FULL);
+	tmp = period_ns * 25;
+	period = clamp_val(div64_u64(tmp, 100000000), PERIOD_MIN, PERIOD_MAX);
+
+	/* Configure frequency divisor */
+	mask = WAVE_GEN_CYCLE_MASK(index % 4);
+	val = (period << __ffs(mask)) & mask;
+	airoha_pwm_rmw(pc, REG_CYCLE_CFG_VALUE(index / 4), mask, val);
+
+	/* Configure duty cycle */
+	duty = ((DUTY_FULL - duty) << 8) | duty;
+	mask = GPIO_FLASH_PRD_MASK(index % 2);
+	val = (duty << __ffs(mask)) & mask;
+	airoha_pwm_rmw(pc, REG_GPIO_FLASH_PRD_SET(index / 2), mask, val);
+}
+
+static void airoha_pwm_config_flash_map(struct airoha_pwm *pc,
+					unsigned int hwpwm, int index)
+{
+	u32 addr, mask, val;
+
+	if (hwpwm < PWM_NUM_GPIO) {
+		addr = REG_GPIO_FLASH_MAP(hwpwm / 8);
+	} else {
+		addr = REG_SIPO_FLASH_MAP(hwpwm / 8);
+		hwpwm -= PWM_NUM_GPIO;
+	}
+
+	if (index < 0) {
+		/*
+		 * Change of waveform takes effect immediately but
+		 * disabling has some delay so to prevent glitching
+		 * only the enable bit is touched when disabling
+		 */
+		airoha_pwm_clear_bit(pc, addr, GPIO_FLASH_EN(hwpwm % 8));
+		return;
+	}
+
+	mask = GPIO_FLASH_SETID_MASK(hwpwm % 8);
+	val = ((index & 7) << __ffs(mask)) & mask;
+	airoha_pwm_rmw(pc, addr, mask, val);
+	airoha_pwm_set_bits(pc, addr, GPIO_FLASH_EN(hwpwm % 8));
+}
+
+static int airoha_pwm_config(struct airoha_pwm *pc, struct pwm_device *pwm,
+			     u64 duty_ns, u64 period_ns)
+{
+	int index = -1;
+
+	index = airoha_pwm_consume_generator(pc, duty_ns, period_ns,
+					     pwm->hwpwm);
+	if (index < 0)
+		return -EBUSY;
+
+	if (!(pc->initialized & BIT_ULL(pwm->hwpwm)) &&
+	    pwm->hwpwm >= PWM_NUM_GPIO)
+		airoha_pwm_sipo_init(pc);
+
+	if (index >= 0) {
+		airoha_pwm_calc_bucket_config(pc, index, duty_ns, period_ns);
+		airoha_pwm_config_flash_map(pc, pwm->hwpwm, index);
+	} else {
+		airoha_pwm_config_flash_map(pc, pwm->hwpwm, index);
+		airoha_pwm_release_bucket_config(pc, pwm->hwpwm);
+	}
+
+	pc->initialized |= BIT_ULL(pwm->hwpwm);
+
+	return 0;
+}
+
+static void airoha_pwm_disable(struct pwm_chip *chip, struct pwm_device *pwm)
+{
+	struct airoha_pwm *pc = pwmchip_get_drvdata(chip);
+
+	/* Disable PWM and release the waveform */
+	airoha_pwm_config_flash_map(pc, pwm->hwpwm, -1);
+	airoha_pwm_release_bucket_config(pc, pwm->hwpwm);
+
+	pc->initialized &= ~BIT_ULL(pwm->hwpwm);
+	if (!(pc->initialized >> PWM_NUM_GPIO))
+		airoha_pwm_clear_bit(pc, REG_SIPO_FLASH_MODE_CFG,
+				     SERIAL_GPIO_FLASH_MODE);
+}
+
+static int airoha_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm,
+			    const struct pwm_state *state)
+{
+	struct airoha_pwm *pc = pwmchip_get_drvdata(chip);
+	u64 duty = state->enabled ? state->duty_cycle : 0;
+	u64 period = state->period;
+
+	/* Only normal polarity is supported */
+	if (state->polarity == PWM_POLARITY_INVERSED)
+		return -EINVAL;
+
+	if (!state->enabled) {
+		airoha_pwm_disable(chip, pwm);
+		return 0;
+	}
+
+	if (period < PERIOD_MIN_NS)
+		return -EINVAL;
+
+	if (period > PERIOD_MAX_NS)
+		period = PERIOD_MAX_NS;
+
+	return airoha_pwm_config(pc, pwm, duty, period);
+}
+
+static int airoha_pwm_get_state(struct pwm_chip *chip, struct pwm_device *pwm,
+				struct pwm_state *state)
+{
+	struct airoha_pwm *pc = pwmchip_get_drvdata(chip);
+	int i;
+
+	/* find hwpwm in waveform generator bucket */
+	for (i = 0; i < ARRAY_SIZE(pc->bucket); i++) {
+		if (pc->bucket[i].used & BIT_ULL(pwm->hwpwm)) {
+			state->enabled = pc->initialized & BIT_ULL(pwm->hwpwm);
+			state->polarity = PWM_POLARITY_NORMAL;
+			state->period = pc->bucket[i].period_ns;
+			state->duty_cycle = pc->bucket[i].duty_ns;
+			break;
+		}
+	}
+
+	if (i == ARRAY_SIZE(pc->bucket))
+		state->enabled = false;
+
+	return 0;
+}
+
+static const struct pwm_ops airoha_pwm_ops = {
+	.get_state = airoha_pwm_get_state,
+	.apply = airoha_pwm_apply,
+};
+
+static int airoha_pwm_probe(struct platform_device *pdev)
+{
+	struct device *dev = &pdev->dev;
+	struct airoha_mfd *mfd;
+	struct airoha_pwm *pc;
+	struct pwm_chip *chip;
+
+	/* Assign parent MFD of_node to dev */
+	device_set_of_node_from_dev(dev, dev->parent);
+	mfd = dev_get_drvdata(dev->parent);
+
+	chip = devm_pwmchip_alloc(dev, PWM_NUM_GPIO + PWM_NUM_SIPO,
+				  sizeof(*pc));
+	if (IS_ERR(chip))
+		return PTR_ERR(chip);
+
+	pc = pwmchip_get_drvdata(chip);
+	pc->np = dev->of_node;
+	pc->base = mfd->base;
+	chip->ops = &airoha_pwm_ops;
+
+	return devm_pwmchip_add(&pdev->dev, chip);
+}
+
+static struct platform_driver airoha_pwm_driver = {
+	.driver = {
+		.name = "pwm-airoha",
+	},
+	.probe = airoha_pwm_probe,
+};
+module_platform_driver(airoha_pwm_driver);
+
+MODULE_AUTHOR("Lorenzo Bianconi <lorenzo at kernel.org>");
+MODULE_AUTHOR("Markus Gothe <markus.gothe at genexis.eu>");
+MODULE_AUTHOR("Benjamin Larsson <benjamin.larsson at genexis.eu>");
+MODULE_DESCRIPTION("Airoha EN7581 PWM driver");
+MODULE_LICENSE("GPL");

-- 
2.46.0



From lorenzo at kernel.org  Wed Sep 11 12:50:04 2024
From: lorenzo at kernel.org (Lorenzo Bianconi)
Date: Wed, 11 Sep 2024 21:50:04 +0200
Subject: [PATCH v4 4/5] pinctrl: airoha: Add support for EN7581 SoC
In-Reply-To: <20240911-en7581-pinctrl-v4-0-60ac93d760bb@kernel.org>
References: <20240911-en7581-pinctrl-v4-0-60ac93d760bb@kernel.org>
Message-ID: <20240911-en7581-pinctrl-v4-4-60ac93d760bb@kernel.org>

Introduce pinctrl driver for EN7581 SoC. Current EN7581 pinctrl driver
supports the following functionalities:
- pin multiplexing
- pin pull-up, pull-down, open-drain, current strength,
  {input,output}_enable, output_{low,high}
- gpio controller
- irq controller

Tested-by: Benjamin Larsson <benjamin.larsson at genexis.eu>
Co-developed-by: Benjamin Larsson <benjamin.larsson at genexis.eu>
Signed-off-by: Benjamin Larsson <benjamin.larsson at genexis.eu>
Signed-off-by: Lorenzo Bianconi <lorenzo at kernel.org>
---
 MAINTAINERS                               |    7 +
 drivers/pinctrl/mediatek/Kconfig          |   16 +-
 drivers/pinctrl/mediatek/Makefile         |    1 +
 drivers/pinctrl/mediatek/pinctrl-airoha.c | 2964 +++++++++++++++++++++++++++++
 4 files changed, 2987 insertions(+), 1 deletion(-)

diff --git a/MAINTAINERS b/MAINTAINERS
index 42decde38320..b12a90b2355b 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -17966,6 +17966,13 @@ F:	drivers/pinctrl/
 F:	include/dt-bindings/pinctrl/
 F:	include/linux/pinctrl/
 
+PIN CONTROLLER - AIROHA
+M:	Lorenzo Bianconi <lorenzo at kernel.org>
+L:	linux-mediatek at lists.infradead.org (moderated for non-subscribers)
+S:	Maintained
+F:	Documentation/devicetree/bindings/mfd/airoha,en7581-gpio-sysctl.yaml
+F:	drivers/pinctrl/mediatek/pinctrl-airoha.c
+
 PIN CONTROLLER - AMD
 M:	Basavaraj Natikar <Basavaraj.Natikar at amd.com>
 M:	Shyam Sundar S K <Shyam-sundar.S-k at amd.com>
diff --git a/drivers/pinctrl/mediatek/Kconfig b/drivers/pinctrl/mediatek/Kconfig
index 7af287252834..43bbf606ee7d 100644
--- a/drivers/pinctrl/mediatek/Kconfig
+++ b/drivers/pinctrl/mediatek/Kconfig
@@ -1,6 +1,6 @@
 # SPDX-License-Identifier: GPL-2.0-only
 menu "MediaTek pinctrl drivers"
-	depends on ARCH_MEDIATEK || RALINK || COMPILE_TEST
+	depends on ARCH_MEDIATEK || ARCH_AIROHA || RALINK || COMPILE_TEST
 
 config EINT_MTK
 	tristate "MediaTek External Interrupt Support"
@@ -126,6 +126,20 @@ config PINCTRL_MT8127
 	select PINCTRL_MTK
 
 # For ARMv8 SoCs
+config PINCTRL_AIROHA
+	tristate "Airoha pin control"
+	depends on OF
+	depends on ARM64 || COMPILE_TEST
+	select PINMUX
+	select GENERIC_PINCONF
+	select GENERIC_PINCTRL_GROUPS
+	select GENERIC_PINMUX_FUNCTIONS
+	select GPIOLIB
+	select GPIOLIB_IRQCHIP
+	help
+	  Say yes here to support pin controller and gpio driver
+	  on Airoha EN7581 SoC.
+
 config PINCTRL_MT2712
 	bool "MediaTek MT2712 pin control"
 	depends on OF
diff --git a/drivers/pinctrl/mediatek/Makefile b/drivers/pinctrl/mediatek/Makefile
index 680f7e8526e0..1405d434218e 100644
--- a/drivers/pinctrl/mediatek/Makefile
+++ b/drivers/pinctrl/mediatek/Makefile
@@ -8,6 +8,7 @@ obj-$(CONFIG_PINCTRL_MTK_MOORE)		+= pinctrl-moore.o
 obj-$(CONFIG_PINCTRL_MTK_PARIS)		+= pinctrl-paris.o
 
 # SoC Drivers
+obj-$(CONFIG_PINCTRL_AIROHA)		+= pinctrl-airoha.o
 obj-$(CONFIG_PINCTRL_MT7620)		+= pinctrl-mt7620.o
 obj-$(CONFIG_PINCTRL_MT7621)		+= pinctrl-mt7621.o
 obj-$(CONFIG_PINCTRL_MT76X8)		+= pinctrl-mt76x8.o
diff --git a/drivers/pinctrl/mediatek/pinctrl-airoha.c b/drivers/pinctrl/mediatek/pinctrl-airoha.c
new file mode 100644
index 000000000000..a6fe4a7cf916
--- /dev/null
+++ b/drivers/pinctrl/mediatek/pinctrl-airoha.c
@@ -0,0 +1,2964 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Author: Lorenzo Bianconi <lorenzo at kernel.org>
+ * Author: Benjamin Larsson <benjamin.larsson at genexis.eu>
+ * Author: Markus Gothe <markus.gothe at genexis.eu>
+ */
+
+#include <dt-bindings/pinctrl/mt65xx.h>
+#include <linux/bitfield.h>
+#include <linux/gpio/driver.h>
+#include <linux/interrupt.h>
+#include <linux/io.h>
+#include <linux/irq.h>
+#include <linux/irqdomain.h>
+#include <linux/kernel.h>
+#include <linux/mfd/airoha-en7581-mfd.h>
+#include <linux/mfd/syscon.h>
+#include <linux/of.h>
+#include <linux/of_irq.h>
+#include <linux/of_platform.h>
+#include <linux/pinctrl/consumer.h>
+#include <linux/pinctrl/pinctrl.h>
+#include <linux/pinctrl/pinconf.h>
+#include <linux/pinctrl/pinconf-generic.h>
+#include <linux/pinctrl/pinmux.h>
+#include <linux/platform_device.h>
+#include <linux/regmap.h>
+
+#include "../core.h"
+#include "../pinconf.h"
+#include "../pinmux.h"
+
+#define PINCTRL_PIN_GROUP(id)						\
+	PINCTRL_PINGROUP(#id, id##_pins, ARRAY_SIZE(id##_pins))
+
+#define PINCTRL_FUNC_DESC(id)						\
+	{								\
+		.desc = {						\
+			.func = {					\
+				.name = #id,				\
+				.groups = id##_groups,			\
+				.ngroups = ARRAY_SIZE(id##_groups),	\
+			}						\
+		},							\
+		.groups = id##_func_group,				\
+		.group_size = ARRAY_SIZE(id##_func_group),		\
+	}
+
+#define PINCTRL_CONF_DESC(p, offset, mask)				\
+	{								\
+		.pin = p,						\
+		.reg = { offset, mask },				\
+	}
+
+/* MUX */
+#define REG_GPIO_2ND_I2C_MODE			0x0214
+#define GPIO_MDC_IO_MASTER_MODE_MODE		BIT(14)
+#define GPIO_I2C_MASTER_MODE_MODE		BIT(13)
+#define GPIO_I2S_MODE_MASK			BIT(12)
+#define GPIO_I2C_SLAVE_MODE_MODE		BIT(11)
+#define GPIO_LAN3_LED1_MODE_MASK		BIT(10)
+#define GPIO_LAN3_LED0_MODE_MASK		BIT(9)
+#define GPIO_LAN2_LED1_MODE_MASK		BIT(8)
+#define GPIO_LAN2_LED0_MODE_MASK		BIT(7)
+#define GPIO_LAN1_LED1_MODE_MASK		BIT(6)
+#define GPIO_LAN1_LED0_MODE_MASK		BIT(5)
+#define GPIO_LAN0_LED1_MODE_MASK		BIT(4)
+#define GPIO_LAN0_LED0_MODE_MASK		BIT(3)
+#define PON_TOD_1PPS_MODE_MASK			BIT(2)
+#define GSW_TOD_1PPS_MODE_MASK			BIT(1)
+#define GPIO_2ND_I2C_MODE_MASK			BIT(0)
+
+#define REG_GPIO_SPI_CS1_MODE			0x0218
+#define GPIO_PCM_SPI_CS4_MODE_MASK		BIT(21)
+#define GPIO_PCM_SPI_CS3_MODE_MASK		BIT(20)
+#define GPIO_PCM_SPI_CS2_MODE_P156_MASK		BIT(19)
+#define GPIO_PCM_SPI_CS2_MODE_P128_MASK		BIT(18)
+#define GPIO_PCM_SPI_CS1_MODE_MASK		BIT(17)
+#define GPIO_PCM_SPI_MODE_MASK			BIT(16)
+#define GPIO_PCM2_MODE_MASK			BIT(13)
+#define GPIO_PCM1_MODE_MASK			BIT(12)
+#define GPIO_PCM_INT_MODE_MASK			BIT(9)
+#define GPIO_PCM_RESET_MODE_MASK		BIT(8)
+#define GPIO_SPI_QUAD_MODE_MASK			BIT(4)
+#define GPIO_SPI_CS4_MODE_MASK			BIT(3)
+#define GPIO_SPI_CS3_MODE_MASK			BIT(2)
+#define GPIO_SPI_CS2_MODE_MASK			BIT(1)
+#define GPIO_SPI_CS1_MODE_MASK			BIT(0)
+
+#define REG_GPIO_PON_MODE			0x021c
+#define GPIO_PARALLEL_NAND_MODE_MASK		BIT(14)
+#define GPIO_SGMII_MDIO_MODE_MASK		BIT(13)
+#define GPIO_PCIE_RESET2_MASK			BIT(12)
+#define SIPO_RCLK_MODE_MASK			BIT(11)
+#define GPIO_PCIE_RESET1_MASK			BIT(10)
+#define GPIO_PCIE_RESET0_MASK			BIT(9)
+#define GPIO_UART5_MODE_MASK			BIT(8)
+#define GPIO_UART4_MODE_MASK			BIT(7)
+#define GPIO_HSUART_CTS_RTS_MODE_MASK		BIT(6)
+#define GPIO_HSUART_MODE_MASK			BIT(5)
+#define GPIO_UART2_CTS_RTS_MODE_MASK		BIT(4)
+#define GPIO_UART2_MODE_MASK			BIT(3)
+#define GPIO_SIPO_MODE_MASK			BIT(2)
+#define GPIO_EMMC_MODE_MASK			BIT(1)
+#define GPIO_PON_MODE_MASK			BIT(0)
+
+#define REG_NPU_UART_EN				0x0224
+#define JTAG_UDI_EN_MASK			BIT(4)
+#define JTAG_DFD_EN_MASK			BIT(3)
+
+/* LED MAP */
+#define REG_LAN_LED0_MAPPING			0x027c
+#define REG_LAN_LED1_MAPPING			0x0280
+
+#define LAN4_LED_MAPPING_MASK			GENMASK(18, 16)
+#define LAN4_PHY4_LED_MAP			BIT(18)
+#define LAN4_PHY2_LED_MAP			BIT(17)
+#define LAN4_PHY1_LED_MAP			BIT(16)
+#define LAN4_PHY0_LED_MAP			0
+#define LAN4_PHY3_LED_MAP			GENMASK(17, 16)
+
+#define LAN3_LED_MAPPING_MASK			GENMASK(14, 12)
+#define LAN3_PHY4_LED_MAP			BIT(14)
+#define LAN3_PHY2_LED_MAP			BIT(13)
+#define LAN3_PHY1_LED_MAP			BIT(12)
+#define LAN3_PHY0_LED_MAP			0
+#define LAN3_PHY3_LED_MAP			GENMASK(13, 12)
+
+#define LAN2_LED_MAPPING_MASK			GENMASK(10, 8)
+#define LAN2_PHY4_LED_MAP			BIT(12)
+#define LAN2_PHY2_LED_MAP			BIT(11)
+#define LAN2_PHY1_LED_MAP			BIT(10)
+#define LAN2_PHY0_LED_MAP			0
+#define LAN2_PHY3_LED_MAP			GENMASK(11, 10)
+
+#define LAN1_LED_MAPPING_MASK			GENMASK(6, 4)
+#define LAN1_PHY4_LED_MAP			BIT(6)
+#define LAN1_PHY2_LED_MAP			BIT(5)
+#define LAN1_PHY1_LED_MAP			BIT(4)
+#define LAN1_PHY0_LED_MAP			0
+#define LAN1_PHY3_LED_MAP			GENMASK(5, 4)
+
+#define LAN0_LED_MAPPING_MASK			GENMASK(2, 0)
+#define LAN0_PHY4_LED_MAP			BIT(3)
+#define LAN0_PHY2_LED_MAP			BIT(2)
+#define LAN0_PHY1_LED_MAP			BIT(1)
+#define LAN0_PHY0_LED_MAP			0
+#define LAN0_PHY3_LED_MAP			GENMASK(2, 1)
+
+/* CONF */
+#define REG_I2C_SDA_E2				0x001c
+#define SPI_MISO_E2_MASK			BIT(14)
+#define SPI_MOSI_E2_MASK			BIT(13)
+#define SPI_CLK_E2_MASK				BIT(12)
+#define SPI_CS0_E2_MASK				BIT(11)
+#define PCIE2_RESET_E2_MASK			BIT(10)
+#define PCIE1_RESET_E2_MASK			BIT(9)
+#define PCIE0_RESET_E2_MASK			BIT(8)
+#define UART1_RXD_E2_MASK			BIT(3)
+#define UART1_TXD_E2_MASK			BIT(2)
+#define I2C_SCL_E2_MASK				BIT(1)
+#define I2C_SDA_E2_MASK				BIT(0)
+
+#define REG_I2C_SDA_E4				0x0020
+#define SPI_MISO_E4_MASK			BIT(14)
+#define SPI_MOSI_E4_MASK			BIT(13)
+#define SPI_CLK_E4_MASK				BIT(12)
+#define SPI_CS0_E4_MASK				BIT(11)
+#define PCIE2_RESET_E4_MASK			BIT(10)
+#define PCIE1_RESET_E4_MASK			BIT(9)
+#define PCIE0_RESET_E4_MASK			BIT(8)
+#define UART1_RXD_E4_MASK			BIT(3)
+#define UART1_TXD_E4_MASK			BIT(2)
+#define I2C_SCL_E4_MASK				BIT(1)
+#define I2C_SDA_E4_MASK				BIT(0)
+
+#define REG_GPIO_L_E2				0x0024
+#define REG_GPIO_L_E4				0x0028
+#define REG_GPIO_H_E2				0x002c
+#define REG_GPIO_H_E4				0x0030
+
+#define REG_I2C_SDA_PU				0x0044
+#define SPI_MISO_PU_MASK			BIT(14)
+#define SPI_MOSI_PU_MASK			BIT(13)
+#define SPI_CLK_PU_MASK				BIT(12)
+#define SPI_CS0_PU_MASK				BIT(11)
+#define PCIE2_RESET_PU_MASK			BIT(10)
+#define PCIE1_RESET_PU_MASK			BIT(9)
+#define PCIE0_RESET_PU_MASK			BIT(8)
+#define UART1_RXD_PU_MASK			BIT(3)
+#define UART1_TXD_PU_MASK			BIT(2)
+#define I2C_SCL_PU_MASK				BIT(1)
+#define I2C_SDA_PU_MASK				BIT(0)
+
+#define REG_I2C_SDA_PD				0x0048
+#define SPI_MISO_PD_MASK			BIT(14)
+#define SPI_MOSI_PD_MASK			BIT(13)
+#define SPI_CLK_PD_MASK				BIT(12)
+#define SPI_CS0_PD_MASK				BIT(11)
+#define PCIE2_RESET_PD_MASK			BIT(10)
+#define PCIE1_RESET_PD_MASK			BIT(9)
+#define PCIE0_RESET_PD_MASK			BIT(8)
+#define UART1_RXD_PD_MASK			BIT(3)
+#define UART1_TXD_PD_MASK			BIT(2)
+#define I2C_SCL_PD_MASK				BIT(1)
+#define I2C_SDA_PD_MASK				BIT(0)
+
+#define REG_GPIO_L_PU				0x004c
+#define REG_GPIO_L_PD				0x0050
+#define REG_GPIO_H_PU				0x0054
+#define REG_GPIO_H_PD				0x0058
+
+#define REG_PCIE_RESET_OD			0x018c
+#define PCIE2_RESET_OD_MASK			BIT(2)
+#define PCIE1_RESET_OD_MASK			BIT(1)
+#define PCIE0_RESET_OD_MASK			BIT(0)
+
+/* GPIOs */
+#define REG_GPIO_CTRL				0x0000
+#define REG_GPIO_DATA				0x0004
+#define REG_GPIO_INT				0x0008
+#define REG_GPIO_INT_EDGE			0x000c
+#define REG_GPIO_INT_LEVEL			0x0010
+#define REG_GPIO_OE				0x0014
+#define REG_GPIO_CTRL1				0x0020
+
+/* PWM MODE CONF */
+#define REG_GPIO_FLASH_MODE_CFG			0x0034
+#define GPIO15_FLASH_MODE_CFG			BIT(15)
+#define GPIO14_FLASH_MODE_CFG			BIT(14)
+#define GPIO13_FLASH_MODE_CFG			BIT(13)
+#define GPIO12_FLASH_MODE_CFG			BIT(12)
+#define GPIO11_FLASH_MODE_CFG			BIT(11)
+#define GPIO10_FLASH_MODE_CFG			BIT(10)
+#define GPIO9_FLASH_MODE_CFG			BIT(9)
+#define GPIO8_FLASH_MODE_CFG			BIT(8)
+#define GPIO7_FLASH_MODE_CFG			BIT(7)
+#define GPIO6_FLASH_MODE_CFG			BIT(6)
+#define GPIO5_FLASH_MODE_CFG			BIT(5)
+#define GPIO4_FLASH_MODE_CFG			BIT(4)
+#define GPIO3_FLASH_MODE_CFG			BIT(3)
+#define GPIO2_FLASH_MODE_CFG			BIT(2)
+#define GPIO1_FLASH_MODE_CFG			BIT(1)
+#define GPIO0_FLASH_MODE_CFG			BIT(0)
+
+#define REG_GPIO_CTRL2				0x0060
+#define REG_GPIO_CTRL3				0x0064
+
+/* PWM MODE CONF EXT */
+#define REG_GPIO_FLASH_MODE_CFG_EXT		0x0068
+#define GPIO51_FLASH_MODE_CFG			BIT(31)
+#define GPIO50_FLASH_MODE_CFG			BIT(30)
+#define GPIO49_FLASH_MODE_CFG			BIT(29)
+#define GPIO48_FLASH_MODE_CFG			BIT(28)
+#define GPIO47_FLASH_MODE_CFG			BIT(27)
+#define GPIO46_FLASH_MODE_CFG			BIT(26)
+#define GPIO45_FLASH_MODE_CFG			BIT(25)
+#define GPIO44_FLASH_MODE_CFG			BIT(24)
+#define GPIO43_FLASH_MODE_CFG			BIT(23)
+#define GPIO42_FLASH_MODE_CFG			BIT(22)
+#define GPIO41_FLASH_MODE_CFG			BIT(21)
+#define GPIO40_FLASH_MODE_CFG			BIT(20)
+#define GPIO39_FLASH_MODE_CFG			BIT(19)
+#define GPIO38_FLASH_MODE_CFG			BIT(18)
+#define GPIO37_FLASH_MODE_CFG			BIT(17)
+#define GPIO36_FLASH_MODE_CFG			BIT(16)
+#define GPIO31_FLASH_MODE_CFG			BIT(15)
+#define GPIO30_FLASH_MODE_CFG			BIT(14)
+#define GPIO29_FLASH_MODE_CFG			BIT(13)
+#define GPIO28_FLASH_MODE_CFG			BIT(12)
+#define GPIO27_FLASH_MODE_CFG			BIT(11)
+#define GPIO26_FLASH_MODE_CFG			BIT(10)
+#define GPIO25_FLASH_MODE_CFG			BIT(9)
+#define GPIO24_FLASH_MODE_CFG			BIT(8)
+#define GPIO23_FLASH_MODE_CFG			BIT(7)
+#define GPIO22_FLASH_MODE_CFG			BIT(6)
+#define GPIO21_FLASH_MODE_CFG			BIT(5)
+#define GPIO20_FLASH_MODE_CFG			BIT(4)
+#define GPIO19_FLASH_MODE_CFG			BIT(3)
+#define GPIO18_FLASH_MODE_CFG			BIT(2)
+#define GPIO17_FLASH_MODE_CFG			BIT(1)
+#define GPIO16_FLASH_MODE_CFG			BIT(0)
+
+#define REG_GPIO_DATA1				0x0070
+#define REG_GPIO_OE1				0x0078
+#define REG_GPIO_INT1				0x007c
+#define REG_GPIO_INT_EDGE1			0x0080
+#define REG_GPIO_INT_EDGE2			0x0084
+#define REG_GPIO_INT_EDGE3			0x0088
+#define REG_GPIO_INT_LEVEL1			0x008c
+#define REG_GPIO_INT_LEVEL2			0x0090
+#define REG_GPIO_INT_LEVEL3			0x0094
+
+#define AIROHA_NUM_GPIOS			64
+#define AIROHA_GPIO_BANK_SIZE			(AIROHA_NUM_GPIOS / 2)
+#define AIROHA_REG_GPIOCTRL_NUM_GPIO		(AIROHA_NUM_GPIOS / 4)
+
+struct airoha_pinctrl_reg {
+	u32 offset;
+	u32 mask;
+};
+
+enum airoha_pinctrl_mux_func {
+	AIROHA_FUNC_MUX,
+	AIROHA_FUNC_PWM_MUX,
+	AIROHA_FUNC_PWM_EXT_MUX,
+};
+
+struct airoha_pinctrl_func_group {
+	const char *name;
+	struct {
+		enum airoha_pinctrl_mux_func mux;
+		u32 offset;
+		u32 mask;
+		u32 val;
+	} regmap[2];
+	int regmap_size;
+};
+
+struct airoha_pinctrl_func {
+	const struct function_desc desc;
+	const struct airoha_pinctrl_func_group *groups;
+	u8 group_size;
+};
+
+struct airoha_pinctrl_conf {
+	u32 pin;
+	struct airoha_pinctrl_reg reg;
+};
+
+struct airoha_pinctrl_gpiochip {
+	struct gpio_chip chip;
+
+	void __iomem *data[2];
+	void __iomem *dir[4];
+	void __iomem *out[2];
+
+	/* protect concurrent register accesses */
+	spinlock_t lock;
+	void __iomem *status[2];
+	void __iomem *level[4];
+	void __iomem *edge[4];
+
+	u32 irq_type[AIROHA_NUM_GPIOS];
+};
+
+struct airoha_pinctrl {
+	struct pinctrl_dev *ctrl;
+
+	struct regmap *chip_scu;
+	/* protect concurrent register accesses */
+	struct mutex mutex;
+	void __iomem *base;
+
+	struct airoha_pinctrl_gpiochip gpiochip;
+};
+
+static struct pinctrl_pin_desc airoha_pinctrl_pins[] = {
+	PINCTRL_PIN(0, "uart1_txd"),
+	PINCTRL_PIN(1, "uart1_rxd"),
+	PINCTRL_PIN(2, "i2c_scl"),
+	PINCTRL_PIN(3, "i2c_sda"),
+	PINCTRL_PIN(4, "spi_cs0"),
+	PINCTRL_PIN(5, "spi_clk"),
+	PINCTRL_PIN(6, "spi_mosi"),
+	PINCTRL_PIN(7, "spi_miso"),
+	PINCTRL_PIN(13, "gpio0"),
+	PINCTRL_PIN(14, "gpio1"),
+	PINCTRL_PIN(15, "gpio2"),
+	PINCTRL_PIN(16, "gpio3"),
+	PINCTRL_PIN(17, "gpio4"),
+	PINCTRL_PIN(18, "gpio5"),
+	PINCTRL_PIN(19, "gpio6"),
+	PINCTRL_PIN(20, "gpio7"),
+	PINCTRL_PIN(21, "gpio8"),
+	PINCTRL_PIN(22, "gpio9"),
+	PINCTRL_PIN(23, "gpio10"),
+	PINCTRL_PIN(24, "gpio11"),
+	PINCTRL_PIN(25, "gpio12"),
+	PINCTRL_PIN(26, "gpio13"),
+	PINCTRL_PIN(27, "gpio14"),
+	PINCTRL_PIN(28, "gpio15"),
+	PINCTRL_PIN(29, "gpio16"),
+	PINCTRL_PIN(30, "gpio17"),
+	PINCTRL_PIN(31, "gpio18"),
+	PINCTRL_PIN(32, "gpio19"),
+	PINCTRL_PIN(33, "gpio20"),
+	PINCTRL_PIN(34, "gpio21"),
+	PINCTRL_PIN(35, "gpio22"),
+	PINCTRL_PIN(36, "gpio23"),
+	PINCTRL_PIN(37, "gpio24"),
+	PINCTRL_PIN(38, "gpio25"),
+	PINCTRL_PIN(39, "gpio26"),
+	PINCTRL_PIN(40, "gpio27"),
+	PINCTRL_PIN(41, "gpio28"),
+	PINCTRL_PIN(42, "gpio29"),
+	PINCTRL_PIN(43, "gpio30"),
+	PINCTRL_PIN(44, "gpio31"),
+	PINCTRL_PIN(45, "gpio32"),
+	PINCTRL_PIN(46, "gpio33"),
+	PINCTRL_PIN(47, "gpio34"),
+	PINCTRL_PIN(48, "gpio35"),
+	PINCTRL_PIN(49, "gpio36"),
+	PINCTRL_PIN(50, "gpio37"),
+	PINCTRL_PIN(51, "gpio38"),
+	PINCTRL_PIN(52, "gpio39"),
+	PINCTRL_PIN(53, "gpio40"),
+	PINCTRL_PIN(54, "gpio41"),
+	PINCTRL_PIN(55, "gpio42"),
+	PINCTRL_PIN(56, "gpio43"),
+	PINCTRL_PIN(57, "gpio44"),
+	PINCTRL_PIN(58, "gpio45"),
+	PINCTRL_PIN(59, "gpio46"),
+	PINCTRL_PIN(61, "pcie_reset0"),
+	PINCTRL_PIN(62, "pcie_reset1"),
+	PINCTRL_PIN(63, "pcie_reset2"),
+};
+
+static const int pon_pins[] = { 49, 50, 51, 52, 53, 54 };
+static const int pon_tod_1pps_pins[] = { 46 };
+static const int gsw_tod_1pps_pins[] = { 46 };
+static const int sipo_pins[] = { 16, 17 };
+static const int sipo_rclk_pins[] = { 16, 17, 43 };
+static const int mdio_pins[] = { 14, 15 };
+static const int uart2_pins[] = { 48, 55 };
+static const int uart2_cts_rts_pins[] = { 46, 47 };
+static const int hsuart_pins[] = { 28, 29 };
+static const int hsuart_cts_rts_pins[] = { 26, 27 };
+static const int uart4_pins[] = { 38, 39 };
+static const int uart5_pins[] = { 18, 19 };
+static const int i2c0_pins[] = { 2, 3 };
+static const int i2c1_pins[] = { 14, 15 };
+static const int jtag_udi_pins[] = { 16, 17, 18, 19, 20 };
+static const int jtag_dfd_pins[] = { 16, 17, 18, 19, 20 };
+static const int i2s_pins[] = { 26, 27, 28, 29 };
+static const int pcm1_pins[] = { 22, 23, 24, 25 };
+static const int pcm2_pins[] = { 18, 19, 20, 21 };
+static const int spi_quad_pins[] = { 32, 33 };
+static const int spi_pins[] = { 4, 5, 6, 7 };
+static const int spi_cs1_pins[] = { 34 };
+static const int pcm_spi_pins[] = { 18, 19, 20, 21, 22, 23, 24, 25 };
+static const int pcm_spi_int_pins[] = { 14 };
+static const int pcm_spi_rst_pins[] = { 15 };
+static const int pcm_spi_cs1_pins[] = { 43 };
+static const int pcm_spi_cs2_pins[] = { 40 };
+static const int pcm_spi_cs2_p128_pins[] = { 40 };
+static const int pcm_spi_cs2_p156_pins[] = { 40 };
+static const int pcm_spi_cs3_pins[] = { 41 };
+static const int pcm_spi_cs4_pins[] = { 42 };
+static const int emmc_pins[] = { 4, 5, 6, 30, 31, 32, 33, 34, 35, 36, 37 };
+static const int pnand_pins[] = { 4, 5, 6, 7, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42 };
+static const int gpio0_pins[] = { 13 };
+static const int gpio1_pins[] = { 14 };
+static const int gpio2_pins[] = { 15 };
+static const int gpio3_pins[] = { 16 };
+static const int gpio4_pins[] = { 17 };
+static const int gpio5_pins[] = { 18 };
+static const int gpio6_pins[] = { 19 };
+static const int gpio7_pins[] = { 20 };
+static const int gpio8_pins[] = { 21 };
+static const int gpio9_pins[] = { 22 };
+static const int gpio10_pins[] = { 23 };
+static const int gpio11_pins[] = { 24 };
+static const int gpio12_pins[] = { 25 };
+static const int gpio13_pins[] = { 26 };
+static const int gpio14_pins[] = { 27 };
+static const int gpio15_pins[] = { 28 };
+static const int gpio16_pins[] = { 29 };
+static const int gpio17_pins[] = { 30 };
+static const int gpio18_pins[] = { 31 };
+static const int gpio19_pins[] = { 32 };
+static const int gpio20_pins[] = { 33 };
+static const int gpio21_pins[] = { 34 };
+static const int gpio22_pins[] = { 35 };
+static const int gpio23_pins[] = { 36 };
+static const int gpio24_pins[] = { 37 };
+static const int gpio25_pins[] = { 38 };
+static const int gpio26_pins[] = { 39 };
+static const int gpio27_pins[] = { 40 };
+static const int gpio28_pins[] = { 41 };
+static const int gpio29_pins[] = { 42 };
+static const int gpio30_pins[] = { 43 };
+static const int gpio31_pins[] = { 44 };
+static const int gpio33_pins[] = { 46 };
+static const int gpio34_pins[] = { 47 };
+static const int gpio35_pins[] = { 48 };
+static const int gpio36_pins[] = { 49 };
+static const int gpio37_pins[] = { 50 };
+static const int gpio38_pins[] = { 51 };
+static const int gpio39_pins[] = { 52 };
+static const int gpio40_pins[] = { 53 };
+static const int gpio41_pins[] = { 54 };
+static const int gpio42_pins[] = { 55 };
+static const int gpio43_pins[] = { 56 };
+static const int gpio44_pins[] = { 57 };
+static const int gpio45_pins[] = { 58 };
+static const int gpio46_pins[] = { 59 };
+static const int pcie_reset0_pins[] = { 61 };
+static const int pcie_reset1_pins[] = { 62 };
+static const int pcie_reset2_pins[] = { 63 };
+
+static const struct pingroup airoha_pinctrl_groups[] = {
+	PINCTRL_PIN_GROUP(pon),
+	PINCTRL_PIN_GROUP(pon_tod_1pps),
+	PINCTRL_PIN_GROUP(gsw_tod_1pps),
+	PINCTRL_PIN_GROUP(sipo),
+	PINCTRL_PIN_GROUP(sipo_rclk),
+	PINCTRL_PIN_GROUP(mdio),
+	PINCTRL_PIN_GROUP(uart2),
+	PINCTRL_PIN_GROUP(uart2_cts_rts),
+	PINCTRL_PIN_GROUP(hsuart),
+	PINCTRL_PIN_GROUP(hsuart_cts_rts),
+	PINCTRL_PIN_GROUP(uart4),
+	PINCTRL_PIN_GROUP(uart5),
+	PINCTRL_PIN_GROUP(i2c0),
+	PINCTRL_PIN_GROUP(i2c1),
+	PINCTRL_PIN_GROUP(jtag_udi),
+	PINCTRL_PIN_GROUP(jtag_dfd),
+	PINCTRL_PIN_GROUP(i2s),
+	PINCTRL_PIN_GROUP(pcm1),
+	PINCTRL_PIN_GROUP(pcm2),
+	PINCTRL_PIN_GROUP(spi),
+	PINCTRL_PIN_GROUP(spi_quad),
+	PINCTRL_PIN_GROUP(spi_cs1),
+	PINCTRL_PIN_GROUP(pcm_spi),
+	PINCTRL_PIN_GROUP(pcm_spi_int),
+	PINCTRL_PIN_GROUP(pcm_spi_rst),
+	PINCTRL_PIN_GROUP(pcm_spi_cs1),
+	PINCTRL_PIN_GROUP(pcm_spi_cs2_p128),
+	PINCTRL_PIN_GROUP(pcm_spi_cs2_p156),
+	PINCTRL_PIN_GROUP(pcm_spi_cs2),
+	PINCTRL_PIN_GROUP(pcm_spi_cs3),
+	PINCTRL_PIN_GROUP(pcm_spi_cs4),
+	PINCTRL_PIN_GROUP(emmc),
+	PINCTRL_PIN_GROUP(pnand),
+	PINCTRL_PIN_GROUP(gpio0),
+	PINCTRL_PIN_GROUP(gpio1),
+	PINCTRL_PIN_GROUP(gpio2),
+	PINCTRL_PIN_GROUP(gpio3),
+	PINCTRL_PIN_GROUP(gpio4),
+	PINCTRL_PIN_GROUP(gpio5),
+	PINCTRL_PIN_GROUP(gpio6),
+	PINCTRL_PIN_GROUP(gpio7),
+	PINCTRL_PIN_GROUP(gpio8),
+	PINCTRL_PIN_GROUP(gpio9),
+	PINCTRL_PIN_GROUP(gpio10),
+	PINCTRL_PIN_GROUP(gpio11),
+	PINCTRL_PIN_GROUP(gpio12),
+	PINCTRL_PIN_GROUP(gpio13),
+	PINCTRL_PIN_GROUP(gpio14),
+	PINCTRL_PIN_GROUP(gpio15),
+	PINCTRL_PIN_GROUP(gpio16),
+	PINCTRL_PIN_GROUP(gpio17),
+	PINCTRL_PIN_GROUP(gpio18),
+	PINCTRL_PIN_GROUP(gpio19),
+	PINCTRL_PIN_GROUP(gpio20),
+	PINCTRL_PIN_GROUP(gpio21),
+	PINCTRL_PIN_GROUP(gpio22),
+	PINCTRL_PIN_GROUP(gpio23),
+	PINCTRL_PIN_GROUP(gpio24),
+	PINCTRL_PIN_GROUP(gpio25),
+	PINCTRL_PIN_GROUP(gpio26),
+	PINCTRL_PIN_GROUP(gpio27),
+	PINCTRL_PIN_GROUP(gpio28),
+	PINCTRL_PIN_GROUP(gpio29),
+	PINCTRL_PIN_GROUP(gpio30),
+	PINCTRL_PIN_GROUP(gpio31),
+	PINCTRL_PIN_GROUP(gpio33),
+	PINCTRL_PIN_GROUP(gpio34),
+	PINCTRL_PIN_GROUP(gpio35),
+	PINCTRL_PIN_GROUP(gpio36),
+	PINCTRL_PIN_GROUP(gpio37),
+	PINCTRL_PIN_GROUP(gpio38),
+	PINCTRL_PIN_GROUP(gpio39),
+	PINCTRL_PIN_GROUP(gpio40),
+	PINCTRL_PIN_GROUP(gpio41),
+	PINCTRL_PIN_GROUP(gpio42),
+	PINCTRL_PIN_GROUP(gpio43),
+	PINCTRL_PIN_GROUP(gpio44),
+	PINCTRL_PIN_GROUP(gpio45),
+	PINCTRL_PIN_GROUP(gpio46),
+	PINCTRL_PIN_GROUP(pcie_reset0),
+	PINCTRL_PIN_GROUP(pcie_reset1),
+	PINCTRL_PIN_GROUP(pcie_reset2),
+};
+
+static const char *const pon_groups[] = { "pon" };
+static const char *const tod_1pps_groups[] = { "pon_tod_1pps", "gsw_tod_1pps" };
+static const char *const sipo_groups[] = { "sipo", "sipo_rclk" };
+static const char *const mdio_groups[] = { "mdio" };
+static const char *const uart_groups[] = { "uart2", "uart2_cts_rts", "hsuart",
+					   "hsuart_cts_rts", "uart4",
+					   "uart5" };
+static const char *const i2c_groups[] = { "i2c1" };
+static const char *const jtag_groups[] = { "jtag_udi", "jtag_dfd" };
+static const char *const pcm_groups[] = { "pcm1", "pcm2" };
+static const char *const spi_groups[] = { "spi_quad", "spi_cs1" };
+static const char *const pcm_spi_groups[] = { "pcm_spi", "pcm_spi_int",
+					      "pcm_spi_rst", "pcm_spi_cs1",
+					      "pcm_spi_cs2_p156",
+					      "pcm_spi_cs2_p128",
+					      "pcm_spi_cs3", "pcm_spi_cs4" };
+static const char *const i2s_groups[] = { "i2s" };
+static const char *const emmc_groups[] = { "emmc" };
+static const char *const pnand_groups[] = { "pnand" };
+static const char *const pcie_reset_groups[] = { "pcie_reset0", "pcie_reset1",
+						 "pcie_reset2" };
+static const char *const pwm_groups[] = { "gpio0", "gpio1",
+					  "gpio2", "gpio3",
+					  "gpio4", "gpio5",
+					  "gpio6", "gpio7",
+					  "gpio8", "gpio9",
+					  "gpio10", "gpio11",
+					  "gpio12", "gpio13",
+					  "gpio14", "gpio15",
+					  "gpio16", "gpio17",
+					  "gpio18", "gpio19",
+					  "gpio20", "gpio21",
+					  "gpio22", "gpio23",
+					  "gpio24", "gpio25",
+					  "gpio26", "gpio27",
+					  "gpio28", "gpio29",
+					  "gpio30", "gpio31",
+					  "gpio36", "gpio37",
+					  "gpio38", "gpio39",
+					  "gpio40", "gpio41",
+					  "gpio42", "gpio43",
+					  "gpio44", "gpio45",
+					  "gpio46", "gpio47" };
+static const char *const phy1_led0_groups[] = { "gpio33", "gpio34",
+						"gpio35", "gpio42" };
+static const char *const phy2_led0_groups[] = { "gpio33", "gpio34",
+						"gpio35", "gpio42" };
+static const char *const phy3_led0_groups[] = { "gpio33", "gpio34",
+						"gpio35", "gpio42" };
+static const char *const phy4_led0_groups[] = { "gpio33", "gpio34",
+						"gpio35", "gpio42" };
+static const char *const phy1_led1_groups[] = { "gpio43", "gpio44",
+						"gpio45", "gpio46" };
+static const char *const phy2_led1_groups[] = { "gpio43", "gpio44",
+						"gpio45", "gpio46" };
+static const char *const phy3_led1_groups[] = { "gpio43", "gpio44",
+						"gpio45", "gpio46" };
+static const char *const phy4_led1_groups[] = { "gpio43", "gpio44",
+						"gpio45", "gpio46" };
+
+static const struct airoha_pinctrl_func_group pon_func_group[] = {
+	{
+		.name = "pon",
+		.regmap[0] = {
+			AIROHA_FUNC_MUX,
+			REG_GPIO_PON_MODE,
+			GPIO_PON_MODE_MASK,
+			GPIO_PON_MODE_MASK
+		},
+		.regmap_size = 1,
+	},
+};
+
+static const struct airoha_pinctrl_func_group tod_1pps_func_group[] = {
+	{
+		.name = "pon_tod_1pps",
+		.regmap[0] = {
+			AIROHA_FUNC_MUX,
+			REG_GPIO_2ND_I2C_MODE,
+			PON_TOD_1PPS_MODE_MASK,
+			PON_TOD_1PPS_MODE_MASK
+		},
+		.regmap_size = 1,
+	}, {
+		.name = "gsw_tod_1pps",
+		.regmap[0] = {
+			AIROHA_FUNC_MUX,
+			REG_GPIO_2ND_I2C_MODE,
+			GSW_TOD_1PPS_MODE_MASK,
+			GSW_TOD_1PPS_MODE_MASK
+		},
+		.regmap_size = 1,
+	},
+};
+
+static const struct airoha_pinctrl_func_group sipo_func_group[] = {
+	{
+		.name = "sipo",
+		.regmap[0] = {
+			AIROHA_FUNC_MUX,
+			REG_GPIO_PON_MODE,
+			GPIO_SIPO_MODE_MASK | SIPO_RCLK_MODE_MASK,
+			GPIO_SIPO_MODE_MASK
+		},
+		.regmap_size = 1,
+	}, {
+		.name = "sipo_rclk",
+		.regmap[0] = {
+			AIROHA_FUNC_MUX,
+			REG_GPIO_PON_MODE,
+			GPIO_SIPO_MODE_MASK | SIPO_RCLK_MODE_MASK,
+			GPIO_SIPO_MODE_MASK | SIPO_RCLK_MODE_MASK
+		},
+		.regmap_size = 1,
+	},
+};
+
+static const struct airoha_pinctrl_func_group mdio_func_group[] = {
+	{
+		.name = "mdio",
+		.regmap[0] = {
+			AIROHA_FUNC_MUX,
+			REG_GPIO_PON_MODE,
+			GPIO_SGMII_MDIO_MODE_MASK,
+			GPIO_SGMII_MDIO_MODE_MASK
+		},
+		.regmap[1] = {
+			AIROHA_FUNC_MUX,
+			REG_GPIO_2ND_I2C_MODE,
+			GPIO_MDC_IO_MASTER_MODE_MODE,
+			GPIO_MDC_IO_MASTER_MODE_MODE
+		},
+		.regmap_size = 2,
+	},
+};
+
+static const struct airoha_pinctrl_func_group uart_func_group[] = {
+	{
+		.name = "uart2",
+		.regmap[0] = {
+			AIROHA_FUNC_MUX,
+			REG_GPIO_PON_MODE,
+			GPIO_UART2_MODE_MASK,
+			GPIO_UART2_MODE_MASK
+		},
+		.regmap_size = 1,
+	}, {
+		.name = "uart2_cts_rts",
+		.regmap[0] = {
+			AIROHA_FUNC_MUX,
+			REG_GPIO_PON_MODE,
+			GPIO_UART2_MODE_MASK | GPIO_UART2_CTS_RTS_MODE_MASK,
+			GPIO_UART2_MODE_MASK | GPIO_UART2_CTS_RTS_MODE_MASK
+		},
+		.regmap_size = 1,
+	}, {
+		.name = "hsuart",
+		.regmap[0] = {
+			AIROHA_FUNC_MUX,
+			REG_GPIO_PON_MODE,
+			GPIO_HSUART_MODE_MASK | GPIO_HSUART_CTS_RTS_MODE_MASK,
+			GPIO_HSUART_MODE_MASK
+		},
+		.regmap_size = 1,
+	},
+	{
+		.name = "hsuart_cts_rts",
+		.regmap[0] = {
+			AIROHA_FUNC_MUX,
+			REG_GPIO_PON_MODE,
+			GPIO_HSUART_MODE_MASK | GPIO_HSUART_CTS_RTS_MODE_MASK,
+			GPIO_HSUART_MODE_MASK | GPIO_HSUART_CTS_RTS_MODE_MASK
+		},
+		.regmap_size = 1,
+	}, {
+		.name = "uart4",
+		.regmap[0] = {
+			AIROHA_FUNC_MUX,
+			REG_GPIO_PON_MODE,
+			GPIO_UART4_MODE_MASK,
+			GPIO_UART4_MODE_MASK
+		},
+		.regmap_size = 1,
+	}, {
+		.name = "uart5",
+		.regmap[0] = {
+			AIROHA_FUNC_MUX,
+			REG_GPIO_PON_MODE,
+			GPIO_UART5_MODE_MASK,
+			GPIO_UART5_MODE_MASK
+		},
+		.regmap_size = 1,
+	},
+};
+
+static const struct airoha_pinctrl_func_group i2c_func_group[] = {
+	{
+		.name = "i2c1",
+		.regmap[0] = {
+			AIROHA_FUNC_MUX,
+			REG_GPIO_2ND_I2C_MODE,
+			GPIO_2ND_I2C_MODE_MASK,
+			GPIO_2ND_I2C_MODE_MASK
+		},
+		.regmap_size = 1,
+	},
+};
+
+static const struct airoha_pinctrl_func_group jtag_func_group[] = {
+	{
+		.name = "jtag_udi",
+		.regmap[0] = {
+			AIROHA_FUNC_MUX,
+			REG_NPU_UART_EN,
+			JTAG_UDI_EN_MASK,
+			JTAG_UDI_EN_MASK
+		},
+		.regmap_size = 1,
+	}, {
+		.name = "jtag_dfd",
+		.regmap[0] = {
+			AIROHA_FUNC_MUX,
+			REG_NPU_UART_EN,
+			JTAG_DFD_EN_MASK,
+			JTAG_DFD_EN_MASK
+		},
+		.regmap_size = 1,
+	},
+};
+
+static const struct airoha_pinctrl_func_group pcm_func_group[] = {
+	{
+		.name = "pcm1",
+		.regmap[0] = {
+			AIROHA_FUNC_MUX,
+			REG_GPIO_SPI_CS1_MODE,
+			GPIO_PCM1_MODE_MASK,
+			GPIO_PCM1_MODE_MASK
+		},
+		.regmap_size = 1,
+	}, {
+		.name = "pcm2",
+		.regmap[0] = {
+			AIROHA_FUNC_MUX,
+			REG_GPIO_SPI_CS1_MODE,
+			GPIO_PCM2_MODE_MASK,
+			GPIO_PCM2_MODE_MASK
+		},
+		.regmap_size = 1,
+	},
+};
+
+static const struct airoha_pinctrl_func_group spi_func_group[] = {
+	{
+		.name = "spi_quad",
+		.regmap[0] = {
+			AIROHA_FUNC_MUX,
+			REG_GPIO_SPI_CS1_MODE,
+			GPIO_SPI_QUAD_MODE_MASK,
+			GPIO_SPI_QUAD_MODE_MASK
+		},
+		.regmap_size = 1,
+	}, {
+		.name = "spi_cs1",
+		.regmap[0] = {
+			AIROHA_FUNC_MUX,
+			REG_GPIO_SPI_CS1_MODE,
+			GPIO_SPI_CS1_MODE_MASK,
+			GPIO_SPI_CS1_MODE_MASK
+		},
+		.regmap_size = 1,
+	}, {
+		.name = "spi_cs2",
+		.regmap[0] = {
+			AIROHA_FUNC_MUX,
+			REG_GPIO_SPI_CS1_MODE,
+			GPIO_SPI_CS2_MODE_MASK,
+			GPIO_SPI_CS2_MODE_MASK
+		},
+		.regmap_size = 1,
+	}, {
+		.name = "spi_cs3",
+		.regmap[0] = {
+			AIROHA_FUNC_MUX,
+			REG_GPIO_SPI_CS1_MODE,
+			GPIO_SPI_CS3_MODE_MASK,
+			GPIO_SPI_CS3_MODE_MASK
+		},
+		.regmap_size = 1,
+	}, {
+		.name = "spi_cs4",
+		.regmap[0] = {
+			AIROHA_FUNC_MUX,
+			REG_GPIO_SPI_CS1_MODE,
+			GPIO_SPI_CS4_MODE_MASK,
+			GPIO_SPI_CS4_MODE_MASK
+		},
+		.regmap_size = 1,
+	},
+};
+
+static const struct airoha_pinctrl_func_group pcm_spi_func_group[] = {
+	{
+		.name = "pcm_spi",
+		.regmap[0] = {
+			AIROHA_FUNC_MUX,
+			REG_GPIO_SPI_CS1_MODE,
+			GPIO_PCM_SPI_MODE_MASK,
+			GPIO_PCM_SPI_MODE_MASK
+		},
+		.regmap_size = 1,
+	}, {
+		.name = "pcm_spi_int",
+		.regmap[0] = {
+			AIROHA_FUNC_MUX,
+			REG_GPIO_SPI_CS1_MODE,
+			GPIO_PCM_INT_MODE_MASK,
+			GPIO_PCM_INT_MODE_MASK
+		},
+		.regmap_size = 1,
+	}, {
+		.name = "pcm_spi_rst",
+		.regmap[0] = {
+			AIROHA_FUNC_MUX,
+			REG_GPIO_SPI_CS1_MODE,
+			GPIO_PCM_RESET_MODE_MASK,
+			GPIO_PCM_RESET_MODE_MASK
+		},
+		.regmap_size = 1,
+	}, {
+		.name = "pcm_spi_cs1",
+		.regmap[0] = {
+			AIROHA_FUNC_MUX,
+			REG_GPIO_SPI_CS1_MODE,
+			GPIO_PCM_SPI_CS1_MODE_MASK,
+			GPIO_PCM_SPI_CS1_MODE_MASK
+		},
+		.regmap_size = 1,
+	}, {
+		.name = "pcm_spi_cs2_p128",
+		.regmap[0] = {
+			AIROHA_FUNC_MUX,
+			REG_GPIO_SPI_CS1_MODE,
+			GPIO_PCM_SPI_CS2_MODE_P128_MASK,
+			GPIO_PCM_SPI_CS2_MODE_P128_MASK
+		},
+		.regmap_size = 1,
+	}, {
+		.name = "pcm_spi_cs2_p156",
+		.regmap[0] = {
+			AIROHA_FUNC_MUX,
+			REG_GPIO_SPI_CS1_MODE,
+			GPIO_PCM_SPI_CS2_MODE_P156_MASK,
+			GPIO_PCM_SPI_CS2_MODE_P156_MASK
+		},
+		.regmap_size = 1,
+	}, {
+		.name = "pcm_spi_cs3",
+		.regmap[0] = {
+			AIROHA_FUNC_MUX,
+			REG_GPIO_SPI_CS1_MODE,
+			GPIO_PCM_SPI_CS3_MODE_MASK,
+			GPIO_PCM_SPI_CS3_MODE_MASK
+		},
+		.regmap_size = 1,
+	}, {
+		.name = "pcm_spi_cs4",
+		.regmap[0] = {
+			AIROHA_FUNC_MUX,
+			REG_GPIO_SPI_CS1_MODE,
+			GPIO_PCM_SPI_CS4_MODE_MASK,
+			GPIO_PCM_SPI_CS4_MODE_MASK
+		},
+		.regmap_size = 1,
+	},
+};
+
+static const struct airoha_pinctrl_func_group i2s_func_group[] = {
+	{
+		.name = "i2s",
+		.regmap[0] = {
+			AIROHA_FUNC_MUX,
+			REG_GPIO_2ND_I2C_MODE,
+			GPIO_I2S_MODE_MASK,
+			GPIO_I2S_MODE_MASK
+		},
+		.regmap_size = 1,
+	},
+};
+
+static const struct airoha_pinctrl_func_group emmc_func_group[] = {
+	{
+		.name = "emmc",
+		.regmap[0] = {
+			AIROHA_FUNC_MUX,
+			REG_GPIO_PON_MODE,
+			GPIO_EMMC_MODE_MASK,
+			GPIO_EMMC_MODE_MASK
+		},
+		.regmap_size = 1,
+	},
+};
+
+static const struct airoha_pinctrl_func_group pnand_func_group[] = {
+	{
+		.name = "pnand",
+		.regmap[0] = {
+			AIROHA_FUNC_MUX,
+			REG_GPIO_PON_MODE,
+			GPIO_PARALLEL_NAND_MODE_MASK,
+			GPIO_PARALLEL_NAND_MODE_MASK
+		},
+		.regmap_size = 1,
+	},
+};
+
+static const struct airoha_pinctrl_func_group pcie_reset_func_group[] = {
+	{
+		.name = "pcie_reset0",
+		.regmap[0] = {
+			AIROHA_FUNC_MUX,
+			REG_GPIO_PON_MODE,
+			GPIO_PCIE_RESET0_MASK,
+			GPIO_PCIE_RESET0_MASK
+		},
+		.regmap_size = 1,
+	}, {
+		.name = "pcie_reset1",
+		.regmap[0] = {
+			AIROHA_FUNC_MUX,
+			REG_GPIO_PON_MODE,
+			GPIO_PCIE_RESET1_MASK,
+			GPIO_PCIE_RESET1_MASK
+		},
+		.regmap_size = 1,
+	}, {
+		.name = "pcie_reset2",
+		.regmap[0] = {
+			AIROHA_FUNC_MUX,
+			REG_GPIO_PON_MODE,
+			GPIO_PCIE_RESET2_MASK,
+			GPIO_PCIE_RESET2_MASK
+		},
+		.regmap_size = 1,
+	},
+};
+
+/* PWM */
+static const struct airoha_pinctrl_func_group pwm_func_group[] = {
+	{
+		.name = "gpio0",
+		.regmap[0] = {
+			AIROHA_FUNC_PWM_MUX,
+			REG_GPIO_FLASH_MODE_CFG,
+			GPIO0_FLASH_MODE_CFG,
+			GPIO0_FLASH_MODE_CFG
+		},
+		.regmap_size = 1,
+	}, {
+		.name = "gpio1",
+		.regmap[0] = {
+			AIROHA_FUNC_PWM_MUX,
+			REG_GPIO_FLASH_MODE_CFG,
+			GPIO1_FLASH_MODE_CFG,
+			GPIO1_FLASH_MODE_CFG
+		},
+		.regmap_size = 1,
+	}, {
+		.name = "gpio2",
+		.regmap[0] = {
+			AIROHA_FUNC_PWM_MUX,
+			REG_GPIO_FLASH_MODE_CFG,
+			GPIO2_FLASH_MODE_CFG,
+			GPIO2_FLASH_MODE_CFG
+		},
+		.regmap_size = 1,
+	}, {
+		.name = "gpio3",
+		.regmap[0] = {
+			AIROHA_FUNC_PWM_MUX,
+			REG_GPIO_FLASH_MODE_CFG,
+			GPIO3_FLASH_MODE_CFG,
+			GPIO3_FLASH_MODE_CFG
+		},
+		.regmap_size = 1,
+	}, {
+		.name = "gpio4",
+		.regmap[0] = {
+			AIROHA_FUNC_PWM_MUX,
+			REG_GPIO_FLASH_MODE_CFG,
+			GPIO4_FLASH_MODE_CFG,
+			GPIO4_FLASH_MODE_CFG
+		},
+		.regmap_size = 1,
+	}, {
+		.name = "gpio5",
+		.regmap[0] = {
+			AIROHA_FUNC_PWM_MUX,
+			REG_GPIO_FLASH_MODE_CFG,
+			GPIO5_FLASH_MODE_CFG,
+			GPIO5_FLASH_MODE_CFG
+		},
+		.regmap_size = 1,
+	}, {
+		.name = "gpio6",
+		.regmap[0] = {
+			AIROHA_FUNC_PWM_MUX,
+			REG_GPIO_FLASH_MODE_CFG,
+			GPIO6_FLASH_MODE_CFG,
+			GPIO6_FLASH_MODE_CFG
+		},
+		.regmap_size = 1,
+	}, {
+		.name = "gpio7",
+		.regmap[0] = {
+			AIROHA_FUNC_PWM_MUX,
+			REG_GPIO_FLASH_MODE_CFG,
+			GPIO7_FLASH_MODE_CFG,
+			GPIO7_FLASH_MODE_CFG
+		},
+		.regmap_size = 1,
+	}, {
+		.name = "gpio8",
+		.regmap[0] = {
+			AIROHA_FUNC_PWM_MUX,
+			REG_GPIO_FLASH_MODE_CFG,
+			GPIO8_FLASH_MODE_CFG,
+			GPIO8_FLASH_MODE_CFG
+		},
+		.regmap_size = 1,
+	}, {
+		.name = "gpio9",
+		.regmap[0] = {
+			AIROHA_FUNC_PWM_MUX,
+			REG_GPIO_FLASH_MODE_CFG,
+			GPIO9_FLASH_MODE_CFG,
+			GPIO9_FLASH_MODE_CFG
+		},
+		.regmap_size = 1,
+	}, {
+		.name = "gpio10",
+		.regmap[0] = {
+			AIROHA_FUNC_PWM_MUX,
+			REG_GPIO_FLASH_MODE_CFG,
+			GPIO10_FLASH_MODE_CFG,
+			GPIO10_FLASH_MODE_CFG
+		},
+		.regmap_size = 1,
+	}, {
+		.name = "gpio11",
+		.regmap[0] = {
+			AIROHA_FUNC_PWM_MUX,
+			REG_GPIO_FLASH_MODE_CFG,
+			GPIO11_FLASH_MODE_CFG,
+			GPIO11_FLASH_MODE_CFG
+		},
+		.regmap_size = 1,
+	}, {
+		.name = "gpio12",
+		.regmap[0] = {
+			AIROHA_FUNC_PWM_MUX,
+			REG_GPIO_FLASH_MODE_CFG,
+			GPIO12_FLASH_MODE_CFG,
+			GPIO12_FLASH_MODE_CFG
+		},
+		.regmap_size = 1,
+	}, {
+		.name = "gpio13",
+		.regmap[0] = {
+			AIROHA_FUNC_PWM_MUX,
+			REG_GPIO_FLASH_MODE_CFG,
+			GPIO13_FLASH_MODE_CFG,
+			GPIO13_FLASH_MODE_CFG
+		},
+		.regmap_size = 1,
+	}, {
+		.name = "gpio14",
+		.regmap[0] = {
+			AIROHA_FUNC_PWM_MUX,
+			REG_GPIO_FLASH_MODE_CFG,
+			GPIO14_FLASH_MODE_CFG,
+			GPIO14_FLASH_MODE_CFG
+		},
+		.regmap_size = 1,
+	}, {
+		.name = "gpio15",
+		.regmap[0] = {
+			AIROHA_FUNC_PWM_MUX,
+			REG_GPIO_FLASH_MODE_CFG,
+			GPIO15_FLASH_MODE_CFG,
+			GPIO15_FLASH_MODE_CFG
+		},
+		.regmap_size = 1,
+	}, {
+		.name = "gpio16",
+		.regmap[0] = {
+			AIROHA_FUNC_PWM_EXT_MUX,
+			REG_GPIO_FLASH_MODE_CFG_EXT,
+			GPIO16_FLASH_MODE_CFG,
+			GPIO16_FLASH_MODE_CFG
+		},
+		.regmap_size = 1,
+	}, {
+		.name = "gpio17",
+		.regmap[0] = {
+			AIROHA_FUNC_PWM_EXT_MUX,
+			REG_GPIO_FLASH_MODE_CFG_EXT,
+			GPIO17_FLASH_MODE_CFG,
+			GPIO17_FLASH_MODE_CFG
+		},
+		.regmap_size = 1,
+	}, {
+		.name = "gpio18",
+		.regmap[0] = {
+			AIROHA_FUNC_PWM_EXT_MUX,
+			REG_GPIO_FLASH_MODE_CFG_EXT,
+			GPIO18_FLASH_MODE_CFG,
+			GPIO18_FLASH_MODE_CFG
+		},
+		.regmap_size = 1,
+	}, {
+		.name = "gpio19",
+		.regmap[0] = {
+			AIROHA_FUNC_PWM_EXT_MUX,
+			REG_GPIO_FLASH_MODE_CFG_EXT,
+			GPIO19_FLASH_MODE_CFG,
+			GPIO19_FLASH_MODE_CFG
+		},
+		.regmap_size = 1,
+	}, {
+		.name = "gpio20",
+		.regmap[0] = {
+			AIROHA_FUNC_PWM_EXT_MUX,
+			REG_GPIO_FLASH_MODE_CFG_EXT,
+			GPIO20_FLASH_MODE_CFG,
+			GPIO20_FLASH_MODE_CFG
+		},
+		.regmap_size = 1,
+	}, {
+		.name = "gpio21",
+		.regmap[0] = {
+			AIROHA_FUNC_PWM_EXT_MUX,
+			REG_GPIO_FLASH_MODE_CFG_EXT,
+			GPIO21_FLASH_MODE_CFG,
+			GPIO21_FLASH_MODE_CFG
+		},
+		.regmap_size = 1,
+	}, {
+		.name = "gpio22",
+		.regmap[0] = {
+			AIROHA_FUNC_PWM_EXT_MUX,
+			REG_GPIO_FLASH_MODE_CFG_EXT,
+			GPIO22_FLASH_MODE_CFG,
+			GPIO22_FLASH_MODE_CFG
+		},
+		.regmap_size = 1,
+	}, {
+		.name = "gpio23",
+		.regmap[0] = {
+			AIROHA_FUNC_PWM_EXT_MUX,
+			REG_GPIO_FLASH_MODE_CFG_EXT,
+			GPIO23_FLASH_MODE_CFG,
+			GPIO23_FLASH_MODE_CFG
+		},
+		.regmap_size = 1,
+	}, {
+		.name = "gpio24",
+		.regmap[0] = {
+			AIROHA_FUNC_PWM_EXT_MUX,
+			REG_GPIO_FLASH_MODE_CFG_EXT,
+			GPIO24_FLASH_MODE_CFG,
+			GPIO24_FLASH_MODE_CFG
+		},
+		.regmap_size = 1,
+	}, {
+		.name = "gpio25",
+		.regmap[0] = {
+			AIROHA_FUNC_PWM_EXT_MUX,
+			REG_GPIO_FLASH_MODE_CFG_EXT,
+			GPIO25_FLASH_MODE_CFG,
+			GPIO25_FLASH_MODE_CFG
+		},
+		.regmap_size = 1,
+	}, {
+		.name = "gpio26",
+		.regmap[0] = {
+			AIROHA_FUNC_PWM_EXT_MUX,
+			REG_GPIO_FLASH_MODE_CFG_EXT,
+			GPIO26_FLASH_MODE_CFG,
+			GPIO26_FLASH_MODE_CFG
+		},
+		.regmap_size = 1,
+	}, {
+		.name = "gpio27",
+		.regmap[0] = {
+			AIROHA_FUNC_PWM_EXT_MUX,
+			REG_GPIO_FLASH_MODE_CFG_EXT,
+			GPIO27_FLASH_MODE_CFG,
+			GPIO27_FLASH_MODE_CFG
+		},
+		.regmap_size = 1,
+	}, {
+		.name = "gpio28",
+		.regmap[0] = {
+			AIROHA_FUNC_PWM_EXT_MUX,
+			REG_GPIO_FLASH_MODE_CFG_EXT,
+			GPIO28_FLASH_MODE_CFG,
+			GPIO28_FLASH_MODE_CFG
+		},
+		.regmap_size = 1,
+	}, {
+		.name = "gpio29",
+		.regmap[0] = {
+			AIROHA_FUNC_PWM_EXT_MUX,
+			REG_GPIO_FLASH_MODE_CFG_EXT,
+			GPIO29_FLASH_MODE_CFG,
+			GPIO29_FLASH_MODE_CFG
+		},
+		.regmap_size = 1,
+	}, {
+		.name = "gpio30",
+		.regmap[0] = {
+			AIROHA_FUNC_PWM_EXT_MUX,
+			REG_GPIO_FLASH_MODE_CFG_EXT,
+			GPIO30_FLASH_MODE_CFG,
+			GPIO30_FLASH_MODE_CFG
+		},
+		.regmap_size = 1,
+	}, {
+		.name = "gpio31",
+		.regmap[0] = {
+			AIROHA_FUNC_PWM_EXT_MUX,
+			REG_GPIO_FLASH_MODE_CFG_EXT,
+			GPIO31_FLASH_MODE_CFG,
+			GPIO31_FLASH_MODE_CFG
+		},
+		.regmap_size = 1,
+	}, {
+		.name = "gpio36",
+		.regmap[0] = {
+			AIROHA_FUNC_PWM_EXT_MUX,
+			REG_GPIO_FLASH_MODE_CFG_EXT,
+			GPIO36_FLASH_MODE_CFG,
+			GPIO36_FLASH_MODE_CFG
+		},
+		.regmap_size = 1,
+	}, {
+		.name = "gpio37",
+		.regmap[0] = {
+			AIROHA_FUNC_PWM_EXT_MUX,
+			REG_GPIO_FLASH_MODE_CFG_EXT,
+			GPIO37_FLASH_MODE_CFG,
+			GPIO37_FLASH_MODE_CFG
+		},
+		.regmap_size = 1,
+	}, {
+		.name = "gpio38",
+		.regmap[0] = {
+			AIROHA_FUNC_PWM_EXT_MUX,
+			REG_GPIO_FLASH_MODE_CFG_EXT,
+			GPIO38_FLASH_MODE_CFG,
+			GPIO38_FLASH_MODE_CFG
+		},
+		.regmap_size = 1,
+	}, {
+		.name = "gpio39",
+		.regmap[0] = {
+			AIROHA_FUNC_PWM_EXT_MUX,
+			REG_GPIO_FLASH_MODE_CFG_EXT,
+			GPIO39_FLASH_MODE_CFG,
+			GPIO39_FLASH_MODE_CFG
+		},
+		.regmap_size = 1,
+	}, {
+		.name = "gpio40",
+		.regmap[0] = {
+			AIROHA_FUNC_PWM_EXT_MUX,
+			REG_GPIO_FLASH_MODE_CFG_EXT,
+			GPIO40_FLASH_MODE_CFG,
+			GPIO40_FLASH_MODE_CFG
+		},
+		.regmap_size = 1,
+	}, {
+		.name = "gpio41",
+		.regmap[0] = {
+			AIROHA_FUNC_PWM_EXT_MUX,
+			REG_GPIO_FLASH_MODE_CFG_EXT,
+			GPIO41_FLASH_MODE_CFG,
+			GPIO41_FLASH_MODE_CFG
+		},
+		.regmap_size = 1,
+	}, {
+		.name = "gpio42",
+		.regmap[0] = {
+			AIROHA_FUNC_PWM_EXT_MUX,
+			REG_GPIO_FLASH_MODE_CFG_EXT,
+			GPIO42_FLASH_MODE_CFG,
+			GPIO42_FLASH_MODE_CFG
+		},
+		.regmap_size = 1,
+	}, {
+		.name = "gpio43",
+		.regmap[0] = {
+			AIROHA_FUNC_PWM_EXT_MUX,
+			REG_GPIO_FLASH_MODE_CFG_EXT,
+			GPIO43_FLASH_MODE_CFG,
+			GPIO43_FLASH_MODE_CFG
+		},
+		.regmap_size = 1,
+	}, {
+		.name = "gpio44",
+		.regmap[0] = {
+			AIROHA_FUNC_PWM_EXT_MUX,
+			REG_GPIO_FLASH_MODE_CFG_EXT,
+			GPIO44_FLASH_MODE_CFG,
+			GPIO44_FLASH_MODE_CFG
+		},
+		.regmap_size = 1,
+	}, {
+		.name = "gpio45",
+		.regmap[0] = {
+			AIROHA_FUNC_PWM_EXT_MUX,
+			REG_GPIO_FLASH_MODE_CFG_EXT,
+			GPIO45_FLASH_MODE_CFG,
+			GPIO45_FLASH_MODE_CFG
+		},
+		.regmap_size = 1,
+	}, {
+		.name = "gpio46",
+		.regmap[0] = {
+			AIROHA_FUNC_PWM_EXT_MUX,
+			REG_GPIO_FLASH_MODE_CFG_EXT,
+			GPIO46_FLASH_MODE_CFG,
+			GPIO46_FLASH_MODE_CFG
+		},
+		.regmap_size = 1,
+	}, {
+		.name = "gpio47",
+		.regmap[0] = {
+			AIROHA_FUNC_PWM_EXT_MUX,
+			REG_GPIO_FLASH_MODE_CFG_EXT,
+			GPIO47_FLASH_MODE_CFG,
+			GPIO47_FLASH_MODE_CFG
+		},
+		.regmap_size = 1,
+	},
+};
+
+static const struct airoha_pinctrl_func_group phy1_led0_func_group[] = {
+	{
+		.name = "gpio33",
+		.regmap[0] = {
+			AIROHA_FUNC_MUX,
+			REG_GPIO_2ND_I2C_MODE,
+			GPIO_LAN0_LED0_MODE_MASK,
+			GPIO_LAN0_LED0_MODE_MASK
+		},
+		.regmap[1] = {
+			AIROHA_FUNC_MUX,
+			REG_LAN_LED0_MAPPING,
+			LAN1_LED_MAPPING_MASK,
+			LAN1_PHY1_LED_MAP
+		},
+		.regmap_size = 2,
+	}, {
+		.name = "gpio34",
+		.regmap[0] = {
+			AIROHA_FUNC_MUX,
+			REG_GPIO_2ND_I2C_MODE,
+			GPIO_LAN1_LED0_MODE_MASK,
+			GPIO_LAN1_LED0_MODE_MASK
+		},
+		.regmap[1] = {
+			AIROHA_FUNC_MUX,
+			REG_LAN_LED0_MAPPING,
+			LAN2_LED_MAPPING_MASK,
+			LAN2_PHY1_LED_MAP
+		},
+		.regmap_size = 2,
+	}, {
+		.name = "gpio35",
+		.regmap[0] = {
+			AIROHA_FUNC_MUX,
+			REG_GPIO_2ND_I2C_MODE,
+			GPIO_LAN2_LED0_MODE_MASK,
+			GPIO_LAN2_LED0_MODE_MASK
+		},
+		.regmap[1] = {
+			AIROHA_FUNC_MUX,
+			REG_LAN_LED0_MAPPING,
+			LAN3_LED_MAPPING_MASK,
+			LAN3_PHY1_LED_MAP
+		},
+		.regmap_size = 2,
+	}, {
+		.name = "gpio42",
+		.regmap[0] = {
+			AIROHA_FUNC_MUX,
+			REG_GPIO_2ND_I2C_MODE,
+			GPIO_LAN3_LED0_MODE_MASK,
+			GPIO_LAN3_LED0_MODE_MASK
+		},
+		.regmap[1] = {
+			AIROHA_FUNC_MUX,
+			REG_LAN_LED0_MAPPING,
+			LAN4_LED_MAPPING_MASK,
+			LAN4_PHY1_LED_MAP
+		},
+		.regmap_size = 2,
+	},
+};
+
+static const struct airoha_pinctrl_func_group phy2_led0_func_group[] = {
+	{
+		.name = "gpio33",
+		.regmap[0] = {
+			AIROHA_FUNC_MUX,
+			REG_GPIO_2ND_I2C_MODE,
+			GPIO_LAN0_LED0_MODE_MASK,
+			GPIO_LAN0_LED0_MODE_MASK
+		},
+		.regmap[1] = {
+			AIROHA_FUNC_MUX,
+			REG_LAN_LED0_MAPPING,
+			LAN1_LED_MAPPING_MASK,
+			LAN1_PHY2_LED_MAP
+		},
+		.regmap_size = 2,
+	}, {
+		.name = "gpio34",
+		.regmap[0] = {
+			AIROHA_FUNC_MUX,
+			REG_GPIO_2ND_I2C_MODE,
+			GPIO_LAN1_LED0_MODE_MASK,
+			GPIO_LAN1_LED0_MODE_MASK
+		},
+		.regmap[1] = {
+			AIROHA_FUNC_MUX,
+			REG_LAN_LED0_MAPPING,
+			LAN2_LED_MAPPING_MASK,
+			LAN2_PHY2_LED_MAP
+		},
+		.regmap_size = 2,
+	}, {
+		.name = "gpio35",
+		.regmap[0] = {
+			AIROHA_FUNC_MUX,
+			REG_GPIO_2ND_I2C_MODE,
+			GPIO_LAN2_LED0_MODE_MASK,
+			GPIO_LAN2_LED0_MODE_MASK
+		},
+		.regmap[1] = {
+			AIROHA_FUNC_MUX,
+			REG_LAN_LED0_MAPPING,
+			LAN3_LED_MAPPING_MASK,
+			LAN3_PHY2_LED_MAP
+		},
+		.regmap_size = 2,
+	}, {
+		.name = "gpio42",
+		.regmap[0] = {
+			AIROHA_FUNC_MUX,
+			REG_GPIO_2ND_I2C_MODE,
+			GPIO_LAN3_LED0_MODE_MASK,
+			GPIO_LAN3_LED0_MODE_MASK
+		},
+		.regmap[1] = {
+			AIROHA_FUNC_MUX,
+			REG_LAN_LED0_MAPPING,
+			LAN4_LED_MAPPING_MASK,
+			LAN4_PHY2_LED_MAP
+		},
+		.regmap_size = 2,
+	},
+};
+
+static const struct airoha_pinctrl_func_group phy3_led0_func_group[] = {
+	{
+		.name = "gpio33",
+		.regmap[0] = {
+			AIROHA_FUNC_MUX,
+			REG_GPIO_2ND_I2C_MODE,
+			GPIO_LAN0_LED0_MODE_MASK,
+			GPIO_LAN0_LED0_MODE_MASK
+		},
+		.regmap[1] = {
+			AIROHA_FUNC_MUX,
+			REG_LAN_LED0_MAPPING,
+			LAN1_LED_MAPPING_MASK,
+			LAN1_PHY3_LED_MAP
+		},
+		.regmap_size = 2,
+	}, {
+		.name = "gpio34",
+		.regmap[0] = {
+			AIROHA_FUNC_MUX,
+			REG_GPIO_2ND_I2C_MODE,
+			GPIO_LAN1_LED0_MODE_MASK,
+			GPIO_LAN1_LED0_MODE_MASK
+		},
+		.regmap[1] = {
+			AIROHA_FUNC_MUX,
+			REG_LAN_LED0_MAPPING,
+			LAN2_LED_MAPPING_MASK,
+			LAN2_PHY3_LED_MAP
+		},
+		.regmap_size = 2,
+	}, {
+		.name = "gpio35",
+		.regmap[0] = {
+			AIROHA_FUNC_MUX,
+			REG_GPIO_2ND_I2C_MODE,
+			GPIO_LAN2_LED0_MODE_MASK,
+			GPIO_LAN2_LED0_MODE_MASK
+		},
+		.regmap[1] = {
+			AIROHA_FUNC_MUX,
+			REG_LAN_LED0_MAPPING,
+			LAN3_LED_MAPPING_MASK,
+			LAN3_PHY3_LED_MAP
+		},
+		.regmap_size = 2,
+	}, {
+		.name = "gpio42",
+		.regmap[0] = {
+			AIROHA_FUNC_MUX,
+			REG_GPIO_2ND_I2C_MODE,
+			GPIO_LAN3_LED0_MODE_MASK,
+			GPIO_LAN3_LED0_MODE_MASK
+		},
+		.regmap[1] = {
+			AIROHA_FUNC_MUX,
+			REG_LAN_LED0_MAPPING,
+			LAN4_LED_MAPPING_MASK,
+			LAN4_PHY3_LED_MAP
+		},
+		.regmap_size = 2,
+	},
+};
+
+static const struct airoha_pinctrl_func_group phy4_led0_func_group[] = {
+	{
+		.name = "gpio33",
+		.regmap[0] = {
+			AIROHA_FUNC_MUX,
+			REG_GPIO_2ND_I2C_MODE,
+			GPIO_LAN0_LED0_MODE_MASK,
+			GPIO_LAN0_LED0_MODE_MASK
+		},
+		.regmap[1] = {
+			AIROHA_FUNC_MUX,
+			REG_LAN_LED0_MAPPING,
+			LAN1_LED_MAPPING_MASK,
+			LAN1_PHY4_LED_MAP
+		},
+		.regmap_size = 2,
+	}, {
+		.name = "gpio34",
+		.regmap[0] = {
+			AIROHA_FUNC_MUX,
+			REG_GPIO_2ND_I2C_MODE,
+			GPIO_LAN1_LED0_MODE_MASK,
+			GPIO_LAN1_LED0_MODE_MASK
+		},
+		.regmap[1] = {
+			AIROHA_FUNC_MUX,
+			REG_LAN_LED0_MAPPING,
+			LAN2_LED_MAPPING_MASK,
+			LAN2_PHY4_LED_MAP
+		},
+		.regmap_size = 2,
+	}, {
+		.name = "gpio35",
+		.regmap[0] = {
+			AIROHA_FUNC_MUX,
+			REG_GPIO_2ND_I2C_MODE,
+			GPIO_LAN2_LED0_MODE_MASK,
+			GPIO_LAN2_LED0_MODE_MASK
+		},
+		.regmap[1] = {
+			AIROHA_FUNC_MUX,
+			REG_LAN_LED0_MAPPING,
+			LAN3_LED_MAPPING_MASK,
+			LAN3_PHY4_LED_MAP
+		},
+		.regmap_size = 2,
+	}, {
+		.name = "gpio42",
+		.regmap[0] = {
+			AIROHA_FUNC_MUX,
+			REG_GPIO_2ND_I2C_MODE,
+			GPIO_LAN3_LED0_MODE_MASK,
+			GPIO_LAN3_LED0_MODE_MASK
+		},
+		.regmap[1] = {
+			AIROHA_FUNC_MUX,
+			REG_LAN_LED0_MAPPING,
+			LAN4_LED_MAPPING_MASK,
+			LAN4_PHY4_LED_MAP
+		},
+		.regmap_size = 2,
+	},
+};
+
+static const struct airoha_pinctrl_func_group phy1_led1_func_group[] = {
+	{
+		.name = "gpio43",
+		.regmap[0] = {
+			AIROHA_FUNC_MUX,
+			REG_GPIO_2ND_I2C_MODE,
+			GPIO_LAN0_LED1_MODE_MASK,
+			GPIO_LAN0_LED1_MODE_MASK
+		},
+		.regmap[1] = {
+			AIROHA_FUNC_MUX,
+			REG_LAN_LED1_MAPPING,
+			LAN1_LED_MAPPING_MASK,
+			LAN1_PHY1_LED_MAP
+		},
+		.regmap_size = 2,
+	}, {
+		.name = "gpio44",
+		.regmap[0] = {
+			AIROHA_FUNC_MUX,
+			REG_GPIO_2ND_I2C_MODE,
+			GPIO_LAN1_LED1_MODE_MASK,
+			GPIO_LAN1_LED1_MODE_MASK
+		},
+		.regmap[1] = {
+			AIROHA_FUNC_MUX,
+			REG_LAN_LED1_MAPPING,
+			LAN2_LED_MAPPING_MASK,
+			LAN2_PHY1_LED_MAP
+		},
+		.regmap_size = 2,
+	}, {
+		.name = "gpio45",
+		.regmap[0] = {
+			AIROHA_FUNC_MUX,
+			REG_GPIO_2ND_I2C_MODE,
+			GPIO_LAN2_LED1_MODE_MASK,
+			GPIO_LAN2_LED1_MODE_MASK
+		},
+		.regmap[1] = {
+			AIROHA_FUNC_MUX,
+			REG_LAN_LED1_MAPPING,
+			LAN3_LED_MAPPING_MASK,
+			LAN3_PHY1_LED_MAP
+		},
+		.regmap_size = 2,
+	}, {
+		.name = "gpio46",
+		.regmap[0] = {
+			AIROHA_FUNC_MUX,
+			REG_GPIO_2ND_I2C_MODE,
+			GPIO_LAN3_LED0_MODE_MASK,
+			GPIO_LAN3_LED0_MODE_MASK
+		},
+		.regmap[1] = {
+			AIROHA_FUNC_MUX,
+			REG_LAN_LED1_MAPPING,
+			LAN4_LED_MAPPING_MASK,
+			LAN4_PHY1_LED_MAP
+		},
+		.regmap_size = 2,
+	},
+};
+
+static const struct airoha_pinctrl_func_group phy2_led1_func_group[] = {
+	{
+		.name = "gpio43",
+		.regmap[0] = {
+			AIROHA_FUNC_MUX,
+			REG_GPIO_2ND_I2C_MODE,
+			GPIO_LAN0_LED1_MODE_MASK,
+			GPIO_LAN0_LED1_MODE_MASK
+		},
+		.regmap[1] = {
+			AIROHA_FUNC_MUX,
+			REG_LAN_LED1_MAPPING,
+			LAN1_LED_MAPPING_MASK,
+			LAN1_PHY2_LED_MAP
+		},
+		.regmap_size = 2,
+	}, {
+		.name = "gpio44",
+		.regmap[0] = {
+			AIROHA_FUNC_MUX,
+			REG_GPIO_2ND_I2C_MODE,
+			GPIO_LAN1_LED1_MODE_MASK,
+			GPIO_LAN1_LED1_MODE_MASK
+		},
+		.regmap[1] = {
+			AIROHA_FUNC_MUX,
+			REG_LAN_LED1_MAPPING,
+			LAN2_LED_MAPPING_MASK,
+			LAN2_PHY2_LED_MAP
+		},
+		.regmap_size = 2,
+	}, {
+		.name = "gpio45",
+		.regmap[0] = {
+			AIROHA_FUNC_MUX,
+			REG_GPIO_2ND_I2C_MODE,
+			GPIO_LAN2_LED1_MODE_MASK,
+			GPIO_LAN2_LED1_MODE_MASK
+		},
+		.regmap[1] = {
+			AIROHA_FUNC_MUX,
+			REG_LAN_LED1_MAPPING,
+			LAN3_LED_MAPPING_MASK,
+			LAN3_PHY2_LED_MAP
+		},
+		.regmap_size = 2,
+	}, {
+		.name = "gpio46",
+		.regmap[0] = {
+			AIROHA_FUNC_MUX,
+			REG_GPIO_2ND_I2C_MODE,
+			GPIO_LAN3_LED0_MODE_MASK,
+			GPIO_LAN3_LED0_MODE_MASK
+		},
+		.regmap[1] = {
+			AIROHA_FUNC_MUX,
+			REG_LAN_LED1_MAPPING,
+			LAN4_LED_MAPPING_MASK,
+			LAN4_PHY2_LED_MAP
+		},
+		.regmap_size = 2,
+	},
+};
+
+static const struct airoha_pinctrl_func_group phy3_led1_func_group[] = {
+	{
+		.name = "gpio43",
+		.regmap[0] = {
+			AIROHA_FUNC_MUX,
+			REG_GPIO_2ND_I2C_MODE,
+			GPIO_LAN0_LED1_MODE_MASK,
+			GPIO_LAN0_LED1_MODE_MASK
+		},
+		.regmap[1] = {
+			AIROHA_FUNC_MUX,
+			REG_LAN_LED1_MAPPING,
+			LAN1_LED_MAPPING_MASK,
+			LAN1_PHY3_LED_MAP
+		},
+		.regmap_size = 2,
+	}, {
+		.name = "gpio44",
+		.regmap[0] = {
+			AIROHA_FUNC_MUX,
+			REG_GPIO_2ND_I2C_MODE,
+			GPIO_LAN1_LED1_MODE_MASK,
+			GPIO_LAN1_LED1_MODE_MASK
+		},
+		.regmap[1] = {
+			AIROHA_FUNC_MUX,
+			REG_LAN_LED1_MAPPING,
+			LAN2_LED_MAPPING_MASK,
+			LAN2_PHY3_LED_MAP
+		},
+		.regmap_size = 2,
+	}, {
+		.name = "gpio45",
+		.regmap[0] = {
+			AIROHA_FUNC_MUX,
+			REG_GPIO_2ND_I2C_MODE,
+			GPIO_LAN2_LED1_MODE_MASK,
+			GPIO_LAN2_LED1_MODE_MASK
+		},
+		.regmap[1] = {
+			AIROHA_FUNC_MUX,
+			REG_LAN_LED1_MAPPING,
+			LAN3_LED_MAPPING_MASK,
+			LAN3_PHY3_LED_MAP
+		},
+		.regmap_size = 2,
+	}, {
+		.name = "gpio46",
+		.regmap[0] = {
+			AIROHA_FUNC_MUX,
+			REG_GPIO_2ND_I2C_MODE,
+			GPIO_LAN3_LED0_MODE_MASK,
+			GPIO_LAN3_LED0_MODE_MASK
+		},
+		.regmap[1] = {
+			AIROHA_FUNC_MUX,
+			REG_LAN_LED1_MAPPING,
+			LAN4_LED_MAPPING_MASK,
+			LAN4_PHY3_LED_MAP
+		},
+		.regmap_size = 2,
+	},
+};
+
+static const struct airoha_pinctrl_func_group phy4_led1_func_group[] = {
+	{
+		.name = "gpio43",
+		.regmap[0] = {
+			AIROHA_FUNC_MUX,
+			REG_GPIO_2ND_I2C_MODE,
+			GPIO_LAN0_LED1_MODE_MASK,
+			GPIO_LAN0_LED1_MODE_MASK
+		},
+		.regmap[1] = {
+			AIROHA_FUNC_MUX,
+			REG_LAN_LED1_MAPPING,
+			LAN1_LED_MAPPING_MASK,
+			LAN1_PHY4_LED_MAP
+		},
+		.regmap_size = 2,
+	}, {
+		.name = "gpio44",
+		.regmap[0] = {
+			AIROHA_FUNC_MUX,
+			REG_GPIO_2ND_I2C_MODE,
+			GPIO_LAN1_LED1_MODE_MASK,
+			GPIO_LAN1_LED1_MODE_MASK
+		},
+		.regmap[1] = {
+			AIROHA_FUNC_MUX,
+			REG_LAN_LED1_MAPPING,
+			LAN2_LED_MAPPING_MASK,
+			LAN2_PHY4_LED_MAP
+		},
+		.regmap_size = 2,
+	}, {
+		.name = "gpio45",
+		.regmap[0] = {
+			AIROHA_FUNC_MUX,
+			REG_GPIO_2ND_I2C_MODE,
+			GPIO_LAN2_LED1_MODE_MASK,
+			GPIO_LAN2_LED1_MODE_MASK
+		},
+		.regmap[1] = {
+			AIROHA_FUNC_MUX,
+			REG_LAN_LED1_MAPPING,
+			LAN3_LED_MAPPING_MASK,
+			LAN3_PHY4_LED_MAP
+		},
+		.regmap_size = 2,
+	}, {
+		.name = "gpio46",
+		.regmap[0] = {
+			AIROHA_FUNC_MUX,
+			REG_GPIO_2ND_I2C_MODE,
+			GPIO_LAN3_LED0_MODE_MASK,
+			GPIO_LAN3_LED0_MODE_MASK
+		},
+		.regmap[1] = {
+			AIROHA_FUNC_MUX,
+			REG_LAN_LED1_MAPPING,
+			LAN4_LED_MAPPING_MASK,
+			LAN4_PHY4_LED_MAP
+		},
+		.regmap_size = 2,
+	},
+};
+
+static const struct airoha_pinctrl_func airoha_pinctrl_funcs[] = {
+	PINCTRL_FUNC_DESC(pon),
+	PINCTRL_FUNC_DESC(tod_1pps),
+	PINCTRL_FUNC_DESC(sipo),
+	PINCTRL_FUNC_DESC(mdio),
+	PINCTRL_FUNC_DESC(uart),
+	PINCTRL_FUNC_DESC(i2c),
+	PINCTRL_FUNC_DESC(jtag),
+	PINCTRL_FUNC_DESC(pcm),
+	PINCTRL_FUNC_DESC(spi),
+	PINCTRL_FUNC_DESC(pcm_spi),
+	PINCTRL_FUNC_DESC(i2s),
+	PINCTRL_FUNC_DESC(emmc),
+	PINCTRL_FUNC_DESC(pnand),
+	PINCTRL_FUNC_DESC(pcie_reset),
+	PINCTRL_FUNC_DESC(pwm),
+	PINCTRL_FUNC_DESC(phy1_led0),
+	PINCTRL_FUNC_DESC(phy2_led0),
+	PINCTRL_FUNC_DESC(phy3_led0),
+	PINCTRL_FUNC_DESC(phy4_led0),
+	PINCTRL_FUNC_DESC(phy1_led1),
+	PINCTRL_FUNC_DESC(phy2_led1),
+	PINCTRL_FUNC_DESC(phy3_led1),
+	PINCTRL_FUNC_DESC(phy4_led1),
+};
+
+static const struct airoha_pinctrl_conf airoha_pinctrl_pullup_conf[] = {
+	PINCTRL_CONF_DESC(0, REG_I2C_SDA_PU, UART1_TXD_PU_MASK),
+	PINCTRL_CONF_DESC(1, REG_I2C_SDA_PU, UART1_RXD_PU_MASK),
+	PINCTRL_CONF_DESC(2, REG_I2C_SDA_PU, I2C_SDA_PU_MASK),
+	PINCTRL_CONF_DESC(3, REG_I2C_SDA_PU, I2C_SCL_PU_MASK),
+	PINCTRL_CONF_DESC(4, REG_I2C_SDA_PU, SPI_CS0_PU_MASK),
+	PINCTRL_CONF_DESC(5, REG_I2C_SDA_PU, SPI_CLK_PU_MASK),
+	PINCTRL_CONF_DESC(6, REG_I2C_SDA_PU, SPI_MOSI_PU_MASK),
+	PINCTRL_CONF_DESC(7, REG_I2C_SDA_PU, SPI_MISO_PU_MASK),
+	PINCTRL_CONF_DESC(13, REG_GPIO_L_PU, BIT(0)),
+	PINCTRL_CONF_DESC(14, REG_GPIO_L_PU, BIT(1)),
+	PINCTRL_CONF_DESC(15, REG_GPIO_L_PU, BIT(2)),
+	PINCTRL_CONF_DESC(16, REG_GPIO_L_PU, BIT(3)),
+	PINCTRL_CONF_DESC(17, REG_GPIO_L_PU, BIT(4)),
+	PINCTRL_CONF_DESC(18, REG_GPIO_L_PU, BIT(5)),
+	PINCTRL_CONF_DESC(19, REG_GPIO_L_PU, BIT(6)),
+	PINCTRL_CONF_DESC(20, REG_GPIO_L_PU, BIT(7)),
+	PINCTRL_CONF_DESC(21, REG_GPIO_L_PU, BIT(8)),
+	PINCTRL_CONF_DESC(22, REG_GPIO_L_PU, BIT(9)),
+	PINCTRL_CONF_DESC(23, REG_GPIO_L_PU, BIT(10)),
+	PINCTRL_CONF_DESC(24, REG_GPIO_L_PU, BIT(11)),
+	PINCTRL_CONF_DESC(25, REG_GPIO_L_PU, BIT(12)),
+	PINCTRL_CONF_DESC(26, REG_GPIO_L_PU, BIT(13)),
+	PINCTRL_CONF_DESC(27, REG_GPIO_L_PU, BIT(14)),
+	PINCTRL_CONF_DESC(28, REG_GPIO_L_PU, BIT(15)),
+	PINCTRL_CONF_DESC(29, REG_GPIO_L_PU, BIT(16)),
+	PINCTRL_CONF_DESC(30, REG_GPIO_L_PU, BIT(17)),
+	PINCTRL_CONF_DESC(31, REG_GPIO_L_PU, BIT(18)),
+	PINCTRL_CONF_DESC(32, REG_GPIO_L_PU, BIT(18)),
+	PINCTRL_CONF_DESC(33, REG_GPIO_L_PU, BIT(20)),
+	PINCTRL_CONF_DESC(34, REG_GPIO_L_PU, BIT(21)),
+	PINCTRL_CONF_DESC(35, REG_GPIO_L_PU, BIT(22)),
+	PINCTRL_CONF_DESC(36, REG_GPIO_L_PU, BIT(23)),
+	PINCTRL_CONF_DESC(37, REG_GPIO_L_PU, BIT(24)),
+	PINCTRL_CONF_DESC(38, REG_GPIO_L_PU, BIT(25)),
+	PINCTRL_CONF_DESC(39, REG_GPIO_L_PU, BIT(26)),
+	PINCTRL_CONF_DESC(40, REG_GPIO_L_PU, BIT(27)),
+	PINCTRL_CONF_DESC(41, REG_GPIO_L_PU, BIT(28)),
+	PINCTRL_CONF_DESC(42, REG_GPIO_L_PU, BIT(29)),
+	PINCTRL_CONF_DESC(43, REG_GPIO_L_PU, BIT(30)),
+	PINCTRL_CONF_DESC(44, REG_GPIO_L_PU, BIT(31)),
+	PINCTRL_CONF_DESC(45, REG_GPIO_H_PU, BIT(0)),
+	PINCTRL_CONF_DESC(46, REG_GPIO_H_PU, BIT(1)),
+	PINCTRL_CONF_DESC(47, REG_GPIO_H_PU, BIT(2)),
+	PINCTRL_CONF_DESC(48, REG_GPIO_H_PU, BIT(3)),
+	PINCTRL_CONF_DESC(49, REG_GPIO_H_PU, BIT(4)),
+	PINCTRL_CONF_DESC(50, REG_GPIO_H_PU, BIT(5)),
+	PINCTRL_CONF_DESC(51, REG_GPIO_H_PU, BIT(6)),
+	PINCTRL_CONF_DESC(52, REG_GPIO_H_PU, BIT(7)),
+	PINCTRL_CONF_DESC(53, REG_GPIO_H_PU, BIT(8)),
+	PINCTRL_CONF_DESC(54, REG_GPIO_H_PU, BIT(9)),
+	PINCTRL_CONF_DESC(55, REG_GPIO_H_PU, BIT(10)),
+	PINCTRL_CONF_DESC(56, REG_GPIO_H_PU, BIT(11)),
+	PINCTRL_CONF_DESC(57, REG_GPIO_H_PU, BIT(12)),
+	PINCTRL_CONF_DESC(58, REG_GPIO_H_PU, BIT(13)),
+	PINCTRL_CONF_DESC(59, REG_GPIO_H_PU, BIT(14)),
+	PINCTRL_CONF_DESC(61, REG_I2C_SDA_PU, PCIE0_RESET_PU_MASK),
+	PINCTRL_CONF_DESC(62, REG_I2C_SDA_PU, PCIE1_RESET_PU_MASK),
+	PINCTRL_CONF_DESC(63, REG_I2C_SDA_PU, PCIE2_RESET_PU_MASK),
+};
+
+static const struct airoha_pinctrl_conf airoha_pinctrl_pulldown_conf[] = {
+	PINCTRL_CONF_DESC(0, REG_I2C_SDA_PD, UART1_TXD_PD_MASK),
+	PINCTRL_CONF_DESC(1, REG_I2C_SDA_PD, UART1_RXD_PD_MASK),
+	PINCTRL_CONF_DESC(2, REG_I2C_SDA_PD, I2C_SDA_PD_MASK),
+	PINCTRL_CONF_DESC(3, REG_I2C_SDA_PD, I2C_SCL_PD_MASK),
+	PINCTRL_CONF_DESC(4, REG_I2C_SDA_PD, SPI_CS0_PD_MASK),
+	PINCTRL_CONF_DESC(5, REG_I2C_SDA_PD, SPI_CLK_PD_MASK),
+	PINCTRL_CONF_DESC(6, REG_I2C_SDA_PD, SPI_MOSI_PD_MASK),
+	PINCTRL_CONF_DESC(7, REG_I2C_SDA_PD, SPI_MISO_PD_MASK),
+	PINCTRL_CONF_DESC(13, REG_GPIO_L_PD, BIT(0)),
+	PINCTRL_CONF_DESC(14, REG_GPIO_L_PD, BIT(1)),
+	PINCTRL_CONF_DESC(15, REG_GPIO_L_PD, BIT(2)),
+	PINCTRL_CONF_DESC(16, REG_GPIO_L_PD, BIT(3)),
+	PINCTRL_CONF_DESC(17, REG_GPIO_L_PD, BIT(4)),
+	PINCTRL_CONF_DESC(18, REG_GPIO_L_PD, BIT(5)),
+	PINCTRL_CONF_DESC(19, REG_GPIO_L_PD, BIT(6)),
+	PINCTRL_CONF_DESC(20, REG_GPIO_L_PD, BIT(7)),
+	PINCTRL_CONF_DESC(21, REG_GPIO_L_PD, BIT(8)),
+	PINCTRL_CONF_DESC(22, REG_GPIO_L_PD, BIT(9)),
+	PINCTRL_CONF_DESC(23, REG_GPIO_L_PD, BIT(10)),
+	PINCTRL_CONF_DESC(24, REG_GPIO_L_PD, BIT(11)),
+	PINCTRL_CONF_DESC(25, REG_GPIO_L_PD, BIT(12)),
+	PINCTRL_CONF_DESC(26, REG_GPIO_L_PD, BIT(13)),
+	PINCTRL_CONF_DESC(27, REG_GPIO_L_PD, BIT(14)),
+	PINCTRL_CONF_DESC(28, REG_GPIO_L_PD, BIT(15)),
+	PINCTRL_CONF_DESC(29, REG_GPIO_L_PD, BIT(16)),
+	PINCTRL_CONF_DESC(30, REG_GPIO_L_PD, BIT(17)),
+	PINCTRL_CONF_DESC(31, REG_GPIO_L_PD, BIT(18)),
+	PINCTRL_CONF_DESC(32, REG_GPIO_L_PD, BIT(18)),
+	PINCTRL_CONF_DESC(33, REG_GPIO_L_PD, BIT(20)),
+	PINCTRL_CONF_DESC(34, REG_GPIO_L_PD, BIT(21)),
+	PINCTRL_CONF_DESC(35, REG_GPIO_L_PD, BIT(22)),
+	PINCTRL_CONF_DESC(36, REG_GPIO_L_PD, BIT(23)),
+	PINCTRL_CONF_DESC(37, REG_GPIO_L_PD, BIT(24)),
+	PINCTRL_CONF_DESC(38, REG_GPIO_L_PD, BIT(25)),
+	PINCTRL_CONF_DESC(39, REG_GPIO_L_PD, BIT(26)),
+	PINCTRL_CONF_DESC(40, REG_GPIO_L_PD, BIT(27)),
+	PINCTRL_CONF_DESC(41, REG_GPIO_L_PD, BIT(28)),
+	PINCTRL_CONF_DESC(42, REG_GPIO_L_PD, BIT(29)),
+	PINCTRL_CONF_DESC(43, REG_GPIO_L_PD, BIT(30)),
+	PINCTRL_CONF_DESC(44, REG_GPIO_L_PD, BIT(31)),
+	PINCTRL_CONF_DESC(45, REG_GPIO_H_PD, BIT(0)),
+	PINCTRL_CONF_DESC(46, REG_GPIO_H_PD, BIT(1)),
+	PINCTRL_CONF_DESC(47, REG_GPIO_H_PD, BIT(2)),
+	PINCTRL_CONF_DESC(48, REG_GPIO_H_PD, BIT(3)),
+	PINCTRL_CONF_DESC(49, REG_GPIO_H_PD, BIT(4)),
+	PINCTRL_CONF_DESC(50, REG_GPIO_H_PD, BIT(5)),
+	PINCTRL_CONF_DESC(51, REG_GPIO_H_PD, BIT(6)),
+	PINCTRL_CONF_DESC(52, REG_GPIO_H_PD, BIT(7)),
+	PINCTRL_CONF_DESC(53, REG_GPIO_H_PD, BIT(8)),
+	PINCTRL_CONF_DESC(54, REG_GPIO_H_PD, BIT(9)),
+	PINCTRL_CONF_DESC(55, REG_GPIO_H_PD, BIT(10)),
+	PINCTRL_CONF_DESC(56, REG_GPIO_H_PD, BIT(11)),
+	PINCTRL_CONF_DESC(57, REG_GPIO_H_PD, BIT(12)),
+	PINCTRL_CONF_DESC(58, REG_GPIO_H_PD, BIT(13)),
+	PINCTRL_CONF_DESC(59, REG_GPIO_H_PD, BIT(14)),
+	PINCTRL_CONF_DESC(61, REG_I2C_SDA_PD, PCIE0_RESET_PD_MASK),
+	PINCTRL_CONF_DESC(62, REG_I2C_SDA_PD, PCIE1_RESET_PD_MASK),
+	PINCTRL_CONF_DESC(63, REG_I2C_SDA_PD, PCIE2_RESET_PD_MASK),
+};
+
+static const struct airoha_pinctrl_conf airoha_pinctrl_drive_e2_conf[] = {
+	PINCTRL_CONF_DESC(0, REG_I2C_SDA_E2, UART1_TXD_E2_MASK),
+	PINCTRL_CONF_DESC(1, REG_I2C_SDA_E2, UART1_RXD_E2_MASK),
+	PINCTRL_CONF_DESC(2, REG_I2C_SDA_E2, I2C_SDA_E2_MASK),
+	PINCTRL_CONF_DESC(3, REG_I2C_SDA_E2, I2C_SCL_E2_MASK),
+	PINCTRL_CONF_DESC(4, REG_I2C_SDA_E2, SPI_CS0_E2_MASK),
+	PINCTRL_CONF_DESC(5, REG_I2C_SDA_E2, SPI_CLK_E2_MASK),
+	PINCTRL_CONF_DESC(6, REG_I2C_SDA_E2, SPI_MOSI_E2_MASK),
+	PINCTRL_CONF_DESC(7, REG_I2C_SDA_E2, SPI_MISO_E2_MASK),
+	PINCTRL_CONF_DESC(13, REG_GPIO_L_E2, BIT(0)),
+	PINCTRL_CONF_DESC(14, REG_GPIO_L_E2, BIT(1)),
+	PINCTRL_CONF_DESC(15, REG_GPIO_L_E2, BIT(2)),
+	PINCTRL_CONF_DESC(16, REG_GPIO_L_E2, BIT(3)),
+	PINCTRL_CONF_DESC(17, REG_GPIO_L_E2, BIT(4)),
+	PINCTRL_CONF_DESC(18, REG_GPIO_L_E2, BIT(5)),
+	PINCTRL_CONF_DESC(19, REG_GPIO_L_E2, BIT(6)),
+	PINCTRL_CONF_DESC(20, REG_GPIO_L_E2, BIT(7)),
+	PINCTRL_CONF_DESC(21, REG_GPIO_L_E2, BIT(8)),
+	PINCTRL_CONF_DESC(22, REG_GPIO_L_E2, BIT(9)),
+	PINCTRL_CONF_DESC(23, REG_GPIO_L_E2, BIT(10)),
+	PINCTRL_CONF_DESC(24, REG_GPIO_L_E2, BIT(11)),
+	PINCTRL_CONF_DESC(25, REG_GPIO_L_E2, BIT(12)),
+	PINCTRL_CONF_DESC(26, REG_GPIO_L_E2, BIT(13)),
+	PINCTRL_CONF_DESC(27, REG_GPIO_L_E2, BIT(14)),
+	PINCTRL_CONF_DESC(28, REG_GPIO_L_E2, BIT(15)),
+	PINCTRL_CONF_DESC(29, REG_GPIO_L_E2, BIT(16)),
+	PINCTRL_CONF_DESC(30, REG_GPIO_L_E2, BIT(17)),
+	PINCTRL_CONF_DESC(31, REG_GPIO_L_E2, BIT(18)),
+	PINCTRL_CONF_DESC(32, REG_GPIO_L_E2, BIT(18)),
+	PINCTRL_CONF_DESC(33, REG_GPIO_L_E2, BIT(20)),
+	PINCTRL_CONF_DESC(34, REG_GPIO_L_E2, BIT(21)),
+	PINCTRL_CONF_DESC(35, REG_GPIO_L_E2, BIT(22)),
+	PINCTRL_CONF_DESC(36, REG_GPIO_L_E2, BIT(23)),
+	PINCTRL_CONF_DESC(37, REG_GPIO_L_E2, BIT(24)),
+	PINCTRL_CONF_DESC(38, REG_GPIO_L_E2, BIT(25)),
+	PINCTRL_CONF_DESC(39, REG_GPIO_L_E2, BIT(26)),
+	PINCTRL_CONF_DESC(40, REG_GPIO_L_E2, BIT(27)),
+	PINCTRL_CONF_DESC(41, REG_GPIO_L_E2, BIT(28)),
+	PINCTRL_CONF_DESC(42, REG_GPIO_L_E2, BIT(29)),
+	PINCTRL_CONF_DESC(43, REG_GPIO_L_E2, BIT(30)),
+	PINCTRL_CONF_DESC(44, REG_GPIO_L_E2, BIT(31)),
+	PINCTRL_CONF_DESC(45, REG_GPIO_H_E2, BIT(0)),
+	PINCTRL_CONF_DESC(46, REG_GPIO_H_E2, BIT(1)),
+	PINCTRL_CONF_DESC(47, REG_GPIO_H_E2, BIT(2)),
+	PINCTRL_CONF_DESC(48, REG_GPIO_H_E2, BIT(3)),
+	PINCTRL_CONF_DESC(49, REG_GPIO_H_E2, BIT(4)),
+	PINCTRL_CONF_DESC(50, REG_GPIO_H_E2, BIT(5)),
+	PINCTRL_CONF_DESC(51, REG_GPIO_H_E2, BIT(6)),
+	PINCTRL_CONF_DESC(52, REG_GPIO_H_E2, BIT(7)),
+	PINCTRL_CONF_DESC(53, REG_GPIO_H_E2, BIT(8)),
+	PINCTRL_CONF_DESC(54, REG_GPIO_H_E2, BIT(9)),
+	PINCTRL_CONF_DESC(55, REG_GPIO_H_E2, BIT(10)),
+	PINCTRL_CONF_DESC(56, REG_GPIO_H_E2, BIT(11)),
+	PINCTRL_CONF_DESC(57, REG_GPIO_H_E2, BIT(12)),
+	PINCTRL_CONF_DESC(58, REG_GPIO_H_E2, BIT(13)),
+	PINCTRL_CONF_DESC(59, REG_GPIO_H_E2, BIT(14)),
+	PINCTRL_CONF_DESC(61, REG_I2C_SDA_E2, PCIE0_RESET_E2_MASK),
+	PINCTRL_CONF_DESC(62, REG_I2C_SDA_E2, PCIE1_RESET_E2_MASK),
+	PINCTRL_CONF_DESC(63, REG_I2C_SDA_E2, PCIE2_RESET_E2_MASK),
+};
+
+static const struct airoha_pinctrl_conf airoha_pinctrl_drive_e4_conf[] = {
+	PINCTRL_CONF_DESC(0, REG_I2C_SDA_E4, UART1_TXD_E4_MASK),
+	PINCTRL_CONF_DESC(1, REG_I2C_SDA_E4, UART1_RXD_E4_MASK),
+	PINCTRL_CONF_DESC(2, REG_I2C_SDA_E4, I2C_SDA_E4_MASK),
+	PINCTRL_CONF_DESC(3, REG_I2C_SDA_E4, I2C_SCL_E4_MASK),
+	PINCTRL_CONF_DESC(4, REG_I2C_SDA_E4, SPI_CS0_E4_MASK),
+	PINCTRL_CONF_DESC(5, REG_I2C_SDA_E4, SPI_CLK_E4_MASK),
+	PINCTRL_CONF_DESC(6, REG_I2C_SDA_E4, SPI_MOSI_E4_MASK),
+	PINCTRL_CONF_DESC(7, REG_I2C_SDA_E4, SPI_MISO_E4_MASK),
+	PINCTRL_CONF_DESC(13, REG_GPIO_L_E4, BIT(0)),
+	PINCTRL_CONF_DESC(14, REG_GPIO_L_E4, BIT(1)),
+	PINCTRL_CONF_DESC(15, REG_GPIO_L_E4, BIT(2)),
+	PINCTRL_CONF_DESC(16, REG_GPIO_L_E4, BIT(3)),
+	PINCTRL_CONF_DESC(17, REG_GPIO_L_E4, BIT(4)),
+	PINCTRL_CONF_DESC(18, REG_GPIO_L_E4, BIT(5)),
+	PINCTRL_CONF_DESC(19, REG_GPIO_L_E4, BIT(6)),
+	PINCTRL_CONF_DESC(20, REG_GPIO_L_E4, BIT(7)),
+	PINCTRL_CONF_DESC(21, REG_GPIO_L_E4, BIT(8)),
+	PINCTRL_CONF_DESC(22, REG_GPIO_L_E4, BIT(9)),
+	PINCTRL_CONF_DESC(23, REG_GPIO_L_E4, BIT(10)),
+	PINCTRL_CONF_DESC(24, REG_GPIO_L_E4, BIT(11)),
+	PINCTRL_CONF_DESC(25, REG_GPIO_L_E4, BIT(12)),
+	PINCTRL_CONF_DESC(26, REG_GPIO_L_E4, BIT(13)),
+	PINCTRL_CONF_DESC(27, REG_GPIO_L_E4, BIT(14)),
+	PINCTRL_CONF_DESC(28, REG_GPIO_L_E4, BIT(15)),
+	PINCTRL_CONF_DESC(29, REG_GPIO_L_E4, BIT(16)),
+	PINCTRL_CONF_DESC(30, REG_GPIO_L_E4, BIT(17)),
+	PINCTRL_CONF_DESC(31, REG_GPIO_L_E4, BIT(18)),
+	PINCTRL_CONF_DESC(32, REG_GPIO_L_E4, BIT(18)),
+	PINCTRL_CONF_DESC(33, REG_GPIO_L_E4, BIT(20)),
+	PINCTRL_CONF_DESC(34, REG_GPIO_L_E4, BIT(21)),
+	PINCTRL_CONF_DESC(35, REG_GPIO_L_E4, BIT(22)),
+	PINCTRL_CONF_DESC(36, REG_GPIO_L_E4, BIT(23)),
+	PINCTRL_CONF_DESC(37, REG_GPIO_L_E4, BIT(24)),
+	PINCTRL_CONF_DESC(38, REG_GPIO_L_E4, BIT(25)),
+	PINCTRL_CONF_DESC(39, REG_GPIO_L_E4, BIT(26)),
+	PINCTRL_CONF_DESC(40, REG_GPIO_L_E4, BIT(27)),
+	PINCTRL_CONF_DESC(41, REG_GPIO_L_E4, BIT(28)),
+	PINCTRL_CONF_DESC(42, REG_GPIO_L_E4, BIT(29)),
+	PINCTRL_CONF_DESC(43, REG_GPIO_L_E4, BIT(30)),
+	PINCTRL_CONF_DESC(44, REG_GPIO_L_E4, BIT(31)),
+	PINCTRL_CONF_DESC(45, REG_GPIO_H_E4, BIT(0)),
+	PINCTRL_CONF_DESC(46, REG_GPIO_H_E4, BIT(1)),
+	PINCTRL_CONF_DESC(47, REG_GPIO_H_E4, BIT(2)),
+	PINCTRL_CONF_DESC(48, REG_GPIO_H_E4, BIT(3)),
+	PINCTRL_CONF_DESC(49, REG_GPIO_H_E4, BIT(4)),
+	PINCTRL_CONF_DESC(50, REG_GPIO_H_E4, BIT(5)),
+	PINCTRL_CONF_DESC(51, REG_GPIO_H_E4, BIT(6)),
+	PINCTRL_CONF_DESC(52, REG_GPIO_H_E4, BIT(7)),
+	PINCTRL_CONF_DESC(53, REG_GPIO_H_E4, BIT(8)),
+	PINCTRL_CONF_DESC(54, REG_GPIO_H_E4, BIT(9)),
+	PINCTRL_CONF_DESC(55, REG_GPIO_H_E4, BIT(10)),
+	PINCTRL_CONF_DESC(56, REG_GPIO_H_E4, BIT(11)),
+	PINCTRL_CONF_DESC(57, REG_GPIO_H_E4, BIT(12)),
+	PINCTRL_CONF_DESC(58, REG_GPIO_H_E4, BIT(13)),
+	PINCTRL_CONF_DESC(59, REG_GPIO_H_E4, BIT(14)),
+	PINCTRL_CONF_DESC(61, REG_I2C_SDA_E4, PCIE0_RESET_E4_MASK),
+	PINCTRL_CONF_DESC(62, REG_I2C_SDA_E4, PCIE1_RESET_E4_MASK),
+	PINCTRL_CONF_DESC(63, REG_I2C_SDA_E4, PCIE2_RESET_E4_MASK),
+};
+
+static const struct airoha_pinctrl_conf airoha_pinctrl_pcie_rst_od_conf[] = {
+	PINCTRL_CONF_DESC(61, REG_PCIE_RESET_OD, PCIE0_RESET_OD_MASK),
+	PINCTRL_CONF_DESC(62, REG_PCIE_RESET_OD, PCIE1_RESET_OD_MASK),
+	PINCTRL_CONF_DESC(63, REG_PCIE_RESET_OD, PCIE2_RESET_OD_MASK),
+};
+
+static u32 airoha_pinctrl_rmw_unlock(void __iomem *addr, u32 mask, u32 val)
+{
+	val |= (readl(addr) & ~mask);
+	writel(val, addr);
+
+	return val;
+}
+
+#define airoha_pinctrl_set_unlock(addr, val)					\
+	airoha_pinctrl_rmw_unlock((addr), 0, (val))
+#define airoha_pinctrl_clear_unlock(addr, mask)					\
+	airoha_pinctrl_rmw_unlock((addr), (mask), (0))
+
+static u32 airoha_pinctrl_rmw(struct airoha_pinctrl *pinctrl,
+			      void __iomem *addr, u32 mask, u32 val)
+{
+	mutex_lock(&pinctrl->mutex);
+	val = airoha_pinctrl_rmw_unlock(addr, mask, val);
+	mutex_unlock(&pinctrl->mutex);
+
+	return val;
+}
+
+static void airoha_pinctrl_gpio_set_direction(struct airoha_pinctrl *pinctrl,
+					      unsigned int gpio, bool input)
+{
+	u32 mask, index;
+
+	/* set output enable */
+	mask = BIT(gpio % AIROHA_GPIO_BANK_SIZE);
+	index = gpio / AIROHA_GPIO_BANK_SIZE;
+	airoha_pinctrl_rmw(pinctrl, pinctrl->gpiochip.out[index],
+			   mask, !input ? mask : 0);
+
+	/* set gpio direction */
+	mask = BIT(2 * (gpio % AIROHA_REG_GPIOCTRL_NUM_GPIO));
+	index = gpio / AIROHA_REG_GPIOCTRL_NUM_GPIO;
+	airoha_pinctrl_rmw(pinctrl, pinctrl->gpiochip.dir[index],
+			   mask, !input ? mask : 0);
+}
+
+static void airoha_pinctrl_gpio_set_value(struct airoha_pinctrl *pinctrl,
+					  unsigned int gpio, bool value)
+{
+	u8 index = gpio / AIROHA_GPIO_BANK_SIZE;
+	u32 pin = gpio % AIROHA_GPIO_BANK_SIZE;
+
+	airoha_pinctrl_rmw(pinctrl, pinctrl->gpiochip.data[index],
+			   BIT(pin), value ? BIT(pin) : 0);
+}
+
+static int airoha_pinctrl_gpio_get_direction(struct airoha_pinctrl *pinctrl,
+					     unsigned int gpio)
+{
+	u32 val, mask = BIT(2 * (gpio % AIROHA_REG_GPIOCTRL_NUM_GPIO));
+	u8 index = gpio / AIROHA_REG_GPIOCTRL_NUM_GPIO;
+
+	val = (readl(pinctrl->gpiochip.dir[index]) & mask);
+
+	return val ? PIN_CONFIG_OUTPUT_ENABLE : PIN_CONFIG_INPUT_ENABLE;
+}
+
+static int airoha_pinmux_set_mux(struct pinctrl_dev *pctrl_dev,
+				 unsigned int selector,
+				 unsigned int group)
+{
+	struct airoha_pinctrl *pinctrl = pinctrl_dev_get_drvdata(pctrl_dev);
+	const struct airoha_pinctrl_func *func;
+	struct function_desc *desc;
+	struct group_desc *grp;
+	int i;
+
+	desc = pinmux_generic_get_function(pctrl_dev, selector);
+	if (!desc)
+		return -EINVAL;
+
+	grp = pinctrl_generic_get_group(pctrl_dev, group);
+	if (!grp)
+		return -EINVAL;
+
+	dev_dbg(pctrl_dev->dev, "enable function %s group %s\n",
+		desc->func.name, grp->grp.name);
+
+	func = desc->data;
+	for (i = 0; i < func->group_size; i++) {
+		const struct airoha_pinctrl_func_group *group;
+		int j;
+
+		group = &func->groups[i];
+		if (strcmp(group->name, grp->grp.name))
+			continue;
+
+		for (j = 0; j < group->regmap_size; j++) {
+			switch (group->regmap[j].mux) {
+			case AIROHA_FUNC_PWM_EXT_MUX:
+			case AIROHA_FUNC_PWM_MUX: {
+				void __iomem *addr;
+
+				addr = pinctrl->base + group->regmap[j].offset;
+				airoha_pinctrl_rmw(pinctrl, addr,
+						   group->regmap[j].mask,
+						   group->regmap[j].val);
+				break;
+			}
+			default:
+				regmap_update_bits(pinctrl->chip_scu,
+						   group->regmap[j].offset,
+						   group->regmap[j].mask,
+						   group->regmap[j].val);
+				break;
+			}
+		}
+		return 0;
+	}
+
+	return -EINVAL;
+}
+
+static int airoha_pinmux_gpio_set_direction(struct pinctrl_dev *pctrl_dev,
+					    struct pinctrl_gpio_range *range,
+					    unsigned int pin, bool input)
+{
+	struct airoha_pinctrl *pinctrl = pinctrl_dev_get_drvdata(pctrl_dev);
+	int gpio = pin - range->pin_base;
+
+	airoha_pinctrl_gpio_set_direction(pinctrl, gpio, input);
+
+	return 0;
+}
+
+static int airoha_pinctrl_get_gpio_from_pin(struct pinctrl_dev *pctrl_dev,
+					    int pin)
+{
+	struct pinctrl_gpio_range *range;
+	int gpio;
+
+	range = pinctrl_find_gpio_range_from_pin_nolock(pctrl_dev, pin);
+	if (!range)
+		return -EINVAL;
+
+	gpio = pin - range->pin_base;
+	if (gpio < 0)
+		return -EINVAL;
+
+	return gpio;
+}
+
+static const struct airoha_pinctrl_reg *
+airoha_pinctrl_get_conf_reg(const struct airoha_pinctrl_conf *conf,
+			    int conf_size, int pin)
+{
+	int i;
+
+	for (i = 0; i < conf_size; i++) {
+		if (conf[i].pin == pin)
+			return &conf[i].reg;
+	}
+
+	return NULL;
+}
+
+static int airoha_pinctrl_get_conf(struct airoha_pinctrl *pinctrl,
+				   const struct airoha_pinctrl_conf *conf,
+				   int conf_size, int pin, u32 *val)
+{
+	const struct airoha_pinctrl_reg *reg;
+
+	reg = airoha_pinctrl_get_conf_reg(conf, conf_size, pin);
+	if (!reg)
+		return -EINVAL;
+
+	if (regmap_read(pinctrl->chip_scu, reg->offset, val))
+		return -EINVAL;
+
+	*val = (*val & reg->mask) >> __ffs(reg->mask);
+
+	return 0;
+}
+
+static int airoha_pinctrl_set_conf(struct airoha_pinctrl *pinctrl,
+				   const struct airoha_pinctrl_conf *conf,
+				   int conf_size, int pin, u32 val)
+{
+	const struct airoha_pinctrl_reg *reg = NULL;
+
+	reg = airoha_pinctrl_get_conf_reg(conf, conf_size, pin);
+	if (!reg)
+		return -EINVAL;
+
+
+	if (regmap_update_bits(pinctrl->chip_scu, reg->offset, reg->mask,
+			       val << __ffs(reg->mask)))
+		return -EINVAL;
+
+	return 0;
+}
+
+#define airoha_pinctrl_get_pullup_conf(pinctrl, pin, val)			\
+	airoha_pinctrl_get_conf((pinctrl), airoha_pinctrl_pullup_conf,		\
+				ARRAY_SIZE(airoha_pinctrl_pullup_conf),		\
+				(pin), (val))
+#define airoha_pinctrl_get_pulldown_conf(pinctrl, pin, val)			\
+	airoha_pinctrl_get_conf((pinctrl), airoha_pinctrl_pulldown_conf,	\
+				ARRAY_SIZE(airoha_pinctrl_pulldown_conf),	\
+				(pin), (val))
+#define airoha_pinctrl_get_drive_e2_conf(pinctrl, pin, val)			\
+	airoha_pinctrl_get_conf((pinctrl), airoha_pinctrl_drive_e2_conf,	\
+				ARRAY_SIZE(airoha_pinctrl_drive_e2_conf),	\
+				(pin), (val))
+#define airoha_pinctrl_get_drive_e4_conf(pinctrl, pin, val)			\
+	airoha_pinctrl_get_conf((pinctrl), airoha_pinctrl_drive_e4_conf,	\
+				ARRAY_SIZE(airoha_pinctrl_drive_e4_conf),	\
+				(pin), (val))
+#define airoha_pinctrl_get_pcie_rst_od_conf(pinctrl, pin, val)			\
+	airoha_pinctrl_get_conf((pinctrl), airoha_pinctrl_pcie_rst_od_conf,	\
+				ARRAY_SIZE(airoha_pinctrl_pcie_rst_od_conf),	\
+				(pin), (val))
+#define airoha_pinctrl_set_pullup_conf(pinctrl, pin, val)			\
+	airoha_pinctrl_set_conf((pinctrl), airoha_pinctrl_pullup_conf,		\
+				ARRAY_SIZE(airoha_pinctrl_pullup_conf),		\
+				(pin), (val))
+#define airoha_pinctrl_set_pulldown_conf(pinctrl, pin, val)			\
+	airoha_pinctrl_set_conf((pinctrl), airoha_pinctrl_pulldown_conf,	\
+				ARRAY_SIZE(airoha_pinctrl_pulldown_conf),	\
+				(pin), (val))
+#define airoha_pinctrl_set_drive_e2_conf(pinctrl, pin, val)			\
+	airoha_pinctrl_set_conf((pinctrl), airoha_pinctrl_drive_e2_conf,	\
+				ARRAY_SIZE(airoha_pinctrl_drive_e2_conf),	\
+				(pin), (val))
+#define airoha_pinctrl_set_drive_e4_conf(pinctrl, pin, val)			\
+	airoha_pinctrl_set_conf((pinctrl), airoha_pinctrl_drive_e4_conf,	\
+				ARRAY_SIZE(airoha_pinctrl_drive_e4_conf),	\
+				(pin), (val))
+#define airoha_pinctrl_set_pcie_rst_od_conf(pinctrl, pin, val)			\
+	airoha_pinctrl_set_conf((pinctrl), airoha_pinctrl_pcie_rst_od_conf,	\
+				ARRAY_SIZE(airoha_pinctrl_pcie_rst_od_conf),	\
+				(pin), (val))
+
+static int airoha_pinconf_get(struct pinctrl_dev *pctrl_dev,
+			      unsigned int pin, unsigned long *config)
+{
+	struct airoha_pinctrl *pinctrl = pinctrl_dev_get_drvdata(pctrl_dev);
+	enum pin_config_param param = pinconf_to_config_param(*config);
+	u32 arg;
+
+	switch (param) {
+	case PIN_CONFIG_BIAS_PULL_DOWN:
+	case PIN_CONFIG_BIAS_DISABLE:
+	case PIN_CONFIG_BIAS_PULL_UP: {
+		u32 pull_up, pull_down;
+
+		if (airoha_pinctrl_get_pullup_conf(pinctrl, pin, &pull_up) ||
+		    airoha_pinctrl_get_pulldown_conf(pinctrl, pin, &pull_down))
+			return -EINVAL;
+
+		if (param == PIN_CONFIG_BIAS_PULL_UP &&
+		    !(pull_up && !pull_down))
+			return -EINVAL;
+		else if (param == PIN_CONFIG_BIAS_PULL_DOWN &&
+			 !(pull_down && !pull_up))
+			return -EINVAL;
+		else if (pull_up || pull_down)
+			return -EINVAL;
+
+		arg = 1;
+		break;
+	}
+	case PIN_CONFIG_DRIVE_STRENGTH: {
+		u32 e2, e4;
+
+		if (airoha_pinctrl_get_drive_e2_conf(pinctrl, pin, &e2) ||
+		    airoha_pinctrl_get_drive_e4_conf(pinctrl, pin, &e4))
+			return -EINVAL;
+
+		arg = e4 << 1 | e2;
+		break;
+	}
+	case PIN_CONFIG_DRIVE_OPEN_DRAIN:
+		if (airoha_pinctrl_get_pcie_rst_od_conf(pinctrl, pin, &arg))
+			return -EINVAL;
+		break;
+	case PIN_CONFIG_OUTPUT_ENABLE:
+	case PIN_CONFIG_INPUT_ENABLE: {
+		int gpio = airoha_pinctrl_get_gpio_from_pin(pctrl_dev, pin);
+
+		if (gpio < 0)
+			return gpio;
+
+		arg = airoha_pinctrl_gpio_get_direction(pinctrl, gpio);
+		if (arg != param)
+			return -EINVAL;
+
+		arg = 1;
+		break;
+	}
+	default:
+		return -EOPNOTSUPP;
+	}
+
+	*config = pinconf_to_config_packed(param, arg);
+
+	return 0;
+}
+
+static int airoha_pinconf_set(struct pinctrl_dev *pctrl_dev,
+			      unsigned int pin, unsigned long *configs,
+			      unsigned int num_configs)
+{
+	struct airoha_pinctrl *pinctrl = pinctrl_dev_get_drvdata(pctrl_dev);
+	int i;
+
+	for (i = 0; i < num_configs; i++) {
+		u32 param = pinconf_to_config_param(configs[i]);
+		u32 arg = pinconf_to_config_argument(configs[i]);
+
+		switch (param) {
+		case PIN_CONFIG_BIAS_DISABLE:
+			airoha_pinctrl_set_pulldown_conf(pinctrl, pin, 0);
+			airoha_pinctrl_set_pullup_conf(pinctrl, pin, 0);
+			break;
+		case PIN_CONFIG_BIAS_PULL_UP:
+			airoha_pinctrl_set_pulldown_conf(pinctrl, pin, 0);
+			airoha_pinctrl_set_pullup_conf(pinctrl, pin, 1);
+			break;
+		case PIN_CONFIG_BIAS_PULL_DOWN:
+			airoha_pinctrl_set_pulldown_conf(pinctrl, pin, 1);
+			airoha_pinctrl_set_pullup_conf(pinctrl, pin, 0);
+			break;
+		case PIN_CONFIG_DRIVE_STRENGTH: {
+			u32 e2 = 0, e4 = 0;
+
+			switch (arg) {
+			case MTK_DRIVE_2mA:
+				break;
+			case MTK_DRIVE_4mA:
+				e2 = 1;
+				break;
+			case MTK_DRIVE_6mA:
+				e4 = 1;
+				break;
+			case MTK_DRIVE_8mA:
+				e2 = 1;
+				e4 = 1;
+				break;
+			default:
+				return -EINVAL;
+			}
+
+			airoha_pinctrl_set_drive_e2_conf(pinctrl, pin, e2);
+			airoha_pinctrl_set_drive_e4_conf(pinctrl, pin, e4);
+			break;
+		}
+		case PIN_CONFIG_DRIVE_OPEN_DRAIN:
+			airoha_pinctrl_set_pcie_rst_od_conf(pinctrl, pin, !!arg);
+			break;
+		case PIN_CONFIG_OUTPUT_ENABLE:
+		case PIN_CONFIG_INPUT_ENABLE:
+		case PIN_CONFIG_OUTPUT: {
+			int gpio = airoha_pinctrl_get_gpio_from_pin(pctrl_dev, pin);
+			bool input = param == PIN_CONFIG_INPUT_ENABLE;
+
+			if (gpio < 0)
+				return gpio;
+
+			airoha_pinctrl_gpio_set_direction(pinctrl, gpio, input);
+			if (param == PIN_CONFIG_OUTPUT)
+				airoha_pinctrl_gpio_set_value(pinctrl, gpio, !!arg);
+			break;
+		}
+		default:
+			return -EOPNOTSUPP;
+		}
+	}
+
+	return 0;
+}
+
+static int airoha_pinconf_group_get(struct pinctrl_dev *pctrl_dev,
+				    unsigned int group, unsigned long *config)
+{
+	u32 cur_config = 0;
+	int i;
+
+	for (i = 0; i < airoha_pinctrl_groups[group].npins; i++) {
+		if (airoha_pinconf_get(pctrl_dev,
+				       airoha_pinctrl_groups[group].pins[i],
+				       config))
+			return -EOPNOTSUPP;
+
+		if (i && cur_config != *config)
+			return -EOPNOTSUPP;
+
+		cur_config = *config;
+	}
+
+	return 0;
+}
+
+static int airoha_pinconf_group_set(struct pinctrl_dev *pctrl_dev,
+				    unsigned int group, unsigned long *configs,
+				    unsigned int num_configs)
+{
+	int i;
+
+	for (i = 0; i < airoha_pinctrl_groups[group].npins; i++) {
+		int err;
+
+		err = airoha_pinconf_set(pctrl_dev,
+					 airoha_pinctrl_groups[group].pins[i],
+					 configs, num_configs);
+		if (err)
+			return err;
+	}
+
+	return 0;
+}
+
+static const struct pinconf_ops airoha_confops = {
+	.is_generic = true,
+	.pin_config_get = airoha_pinconf_get,
+	.pin_config_set = airoha_pinconf_set,
+	.pin_config_group_get = airoha_pinconf_group_get,
+	.pin_config_group_set = airoha_pinconf_group_set,
+	.pin_config_config_dbg_show = pinconf_generic_dump_config,
+};
+
+static const struct pinctrl_ops airoha_pctlops = {
+	.get_groups_count = pinctrl_generic_get_group_count,
+	.get_group_name = pinctrl_generic_get_group_name,
+	.get_group_pins = pinctrl_generic_get_group_pins,
+	.dt_node_to_map = pinconf_generic_dt_node_to_map_all,
+	.dt_free_map = pinconf_generic_dt_free_map,
+};
+
+static const struct pinmux_ops airoha_pmxops = {
+	.get_functions_count = pinmux_generic_get_function_count,
+	.get_function_name = pinmux_generic_get_function_name,
+	.get_function_groups = pinmux_generic_get_function_groups,
+	.gpio_set_direction = airoha_pinmux_gpio_set_direction,
+	.set_mux = airoha_pinmux_set_mux,
+	.strict = true,
+};
+
+static struct pinctrl_desc airoha_pinctrl_desc = {
+	.name = KBUILD_MODNAME,
+	.owner = THIS_MODULE,
+	.pctlops = &airoha_pctlops,
+	.pmxops = &airoha_pmxops,
+	.confops = &airoha_confops,
+	.pins = airoha_pinctrl_pins,
+	.npins = ARRAY_SIZE(airoha_pinctrl_pins),
+};
+
+static void airoha_pinctrl_gpio_set(struct gpio_chip *chip, unsigned int gpio,
+				    int value)
+{
+	struct airoha_pinctrl *pinctrl = gpiochip_get_data(chip);
+
+	airoha_pinctrl_gpio_set_value(pinctrl, gpio, value);
+}
+
+static int airoha_pinctrl_gpio_get(struct gpio_chip *chip, unsigned int gpio)
+{
+	struct airoha_pinctrl *pinctrl = gpiochip_get_data(chip);
+	u8 index = gpio / AIROHA_GPIO_BANK_SIZE;
+	u32 pin = gpio % AIROHA_GPIO_BANK_SIZE;
+
+	return !!(readl(pinctrl->gpiochip.data[index]) & BIT(pin));
+}
+
+static int airoha_pinctrl_gpio_direction_output(struct gpio_chip *chip,
+						unsigned int gpio, int value)
+{
+	int err;
+
+	err = pinctrl_gpio_direction_output(chip, gpio);
+	if (err)
+		return err;
+
+	airoha_pinctrl_gpio_set(chip, gpio, value);
+
+	return 0;
+}
+
+static void airoha_pinctrl_gpio_irq_unmask(struct irq_data *data)
+{
+	u8 offset = data->hwirq % AIROHA_REG_GPIOCTRL_NUM_GPIO;
+	u8 index = data->hwirq / AIROHA_REG_GPIOCTRL_NUM_GPIO;
+	u32 mask = GENMASK(2 * offset + 1, 2 * offset);
+	struct airoha_pinctrl_gpiochip *gpiochip;
+	u32 val = BIT(2 * offset);
+	unsigned long flags;
+
+	gpiochip = irq_data_get_irq_chip_data(data);
+	if (WARN_ON_ONCE(data->hwirq >= ARRAY_SIZE(gpiochip->irq_type)))
+		return;
+
+	spin_lock_irqsave(&gpiochip->lock, flags);
+
+	switch (gpiochip->irq_type[data->hwirq] & IRQ_TYPE_SENSE_MASK) {
+	case IRQ_TYPE_LEVEL_LOW:
+		val = val << 1;
+		fallthrough;
+	case IRQ_TYPE_LEVEL_HIGH:
+		airoha_pinctrl_rmw_unlock(gpiochip->level[index], mask, val);
+		break;
+	case IRQ_TYPE_EDGE_FALLING:
+		val = val << 1;
+		fallthrough;
+	case IRQ_TYPE_EDGE_RISING:
+		airoha_pinctrl_rmw_unlock(gpiochip->edge[index], mask, val);
+		break;
+	case IRQ_TYPE_EDGE_BOTH:
+		airoha_pinctrl_set_unlock(gpiochip->edge[index], mask);
+		break;
+	default:
+		break;
+	}
+
+	spin_unlock_irqrestore(&gpiochip->lock, flags);
+}
+
+static void airoha_pinctrl_gpio_irq_mask(struct irq_data *data)
+{
+	u8 offset = data->hwirq % AIROHA_REG_GPIOCTRL_NUM_GPIO;
+	u8 index = data->hwirq / AIROHA_REG_GPIOCTRL_NUM_GPIO;
+	u32 mask = GENMASK(2 * offset + 1, 2 * offset);
+	struct airoha_pinctrl_gpiochip *gpiochip;
+	unsigned long flags;
+
+	gpiochip = irq_data_get_irq_chip_data(data);
+
+	spin_lock_irqsave(&gpiochip->lock, flags);
+
+	airoha_pinctrl_clear_unlock(gpiochip->edge[index], mask);
+	airoha_pinctrl_clear_unlock(gpiochip->level[index], mask);
+
+	spin_unlock_irqrestore(&gpiochip->lock, flags);
+}
+
+static int airoha_pinctrl_gpio_irq_type(struct irq_data *data,
+					unsigned int type)
+{
+	struct airoha_pinctrl_gpiochip *gpiochip;
+	unsigned long flags;
+
+	gpiochip = irq_data_get_irq_chip_data(data);
+	if (data->hwirq >= ARRAY_SIZE(gpiochip->irq_type))
+		return -EINVAL;
+
+	spin_lock_irqsave(&gpiochip->lock, flags);
+
+	if (type == IRQ_TYPE_PROBE) {
+		if (gpiochip->irq_type[data->hwirq])
+			goto unlock;
+
+		type = IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING;
+	}
+	gpiochip->irq_type[data->hwirq] = type & IRQ_TYPE_SENSE_MASK;
+unlock:
+	spin_unlock_irqrestore(&gpiochip->lock, flags);
+
+	return 0;
+}
+
+static irqreturn_t airoha_pinctrl_gpio_irq_handler(int irq, void *data)
+{
+	struct airoha_pinctrl_gpiochip *gpiochip;
+	bool handled = false;
+	int i;
+
+	gpiochip = container_of(data, struct airoha_pinctrl_gpiochip, chip);
+	for (i = 0; i < ARRAY_SIZE(gpiochip->status); i++) {
+		unsigned long status = readl(gpiochip->status[i]);
+		struct gpio_irq_chip *girq = &gpiochip->chip.irq;
+		int irq;
+
+		for_each_set_bit(irq, &status, AIROHA_GPIO_BANK_SIZE) {
+			u32 offset = irq + i * AIROHA_GPIO_BANK_SIZE;
+
+			generic_handle_irq(irq_find_mapping(girq->domain,
+							    offset));
+			writel(BIT(irq), gpiochip->status[i]);
+		}
+		handled |= !!status;
+	}
+
+	return handled ? IRQ_HANDLED : IRQ_NONE;
+}
+
+static int airoha_pinctrl_add_gpiochip(struct airoha_pinctrl *pinctrl,
+				       struct platform_device *pdev)
+{
+	struct gpio_chip *chip = &pinctrl->gpiochip.chip;
+	struct gpio_irq_chip *girq = &chip->irq;
+	struct device *dev = &pdev->dev;
+	int irq, err;
+
+	pinctrl->gpiochip.data[0] = pinctrl->base + REG_GPIO_DATA;
+	pinctrl->gpiochip.data[1] = pinctrl->base + REG_GPIO_DATA1;
+	pinctrl->gpiochip.dir[0] = pinctrl->base + REG_GPIO_CTRL;
+	pinctrl->gpiochip.dir[1] = pinctrl->base + REG_GPIO_CTRL1;
+	pinctrl->gpiochip.dir[2] = pinctrl->base + REG_GPIO_CTRL2;
+	pinctrl->gpiochip.dir[3] = pinctrl->base + REG_GPIO_CTRL3;
+	pinctrl->gpiochip.out[0] = pinctrl->base + REG_GPIO_OE;
+	pinctrl->gpiochip.out[1] = pinctrl->base + REG_GPIO_OE1;
+
+	chip->parent = dev;
+	chip->label = dev_name(dev);
+	chip->request = gpiochip_generic_request;
+	chip->free = gpiochip_generic_free;
+	chip->direction_input = pinctrl_gpio_direction_input;
+	chip->direction_output = airoha_pinctrl_gpio_direction_output;
+	chip->set = airoha_pinctrl_gpio_set;
+	chip->get = airoha_pinctrl_gpio_get;
+	chip->base = -1;
+	chip->ngpio = AIROHA_NUM_GPIOS;
+
+	if (!of_property_read_bool(dev->of_node, "interrupt-controller"))
+		goto out;
+
+	pinctrl->gpiochip.status[0] = pinctrl->base + REG_GPIO_INT;
+	pinctrl->gpiochip.status[1] = pinctrl->base + REG_GPIO_INT1;
+	pinctrl->gpiochip.level[0] = pinctrl->base + REG_GPIO_INT_LEVEL;
+	pinctrl->gpiochip.level[1] = pinctrl->base + REG_GPIO_INT_LEVEL1;
+	pinctrl->gpiochip.level[2] = pinctrl->base + REG_GPIO_INT_LEVEL2;
+	pinctrl->gpiochip.level[3] = pinctrl->base + REG_GPIO_INT_LEVEL3;
+	pinctrl->gpiochip.edge[0] = pinctrl->base + REG_GPIO_INT_EDGE;
+	pinctrl->gpiochip.edge[1] = pinctrl->base + REG_GPIO_INT_EDGE1;
+	pinctrl->gpiochip.edge[2] = pinctrl->base + REG_GPIO_INT_EDGE2;
+	pinctrl->gpiochip.edge[3] = pinctrl->base + REG_GPIO_INT_EDGE3;
+
+	spin_lock_init(&pinctrl->gpiochip.lock);
+	irq = platform_get_irq(pdev, 0);
+	if (irq < 0)
+		return irq;
+
+	err = devm_request_irq(dev, irq, airoha_pinctrl_gpio_irq_handler,
+			       IRQF_SHARED, dev_name(dev), chip);
+	if (err) {
+		dev_err(dev, "error requesting irq %d: %d\n", irq, err);
+		return err;
+	}
+
+	girq->chip = devm_kzalloc(dev, sizeof(*girq->chip), GFP_KERNEL);
+	if (!girq->chip)
+		return -ENOMEM;
+
+	girq->chip->name = dev_name(dev);
+	girq->chip->irq_unmask = airoha_pinctrl_gpio_irq_unmask;
+	girq->chip->irq_mask = airoha_pinctrl_gpio_irq_mask;
+	girq->chip->irq_mask_ack = airoha_pinctrl_gpio_irq_mask;
+	girq->chip->irq_set_type = airoha_pinctrl_gpio_irq_type;
+	girq->chip->flags = IRQCHIP_SET_TYPE_MASKED | IRQCHIP_IMMUTABLE;
+	girq->default_type = IRQ_TYPE_NONE;
+	girq->handler = handle_simple_irq;
+out:
+	return devm_gpiochip_add_data(dev, chip, pinctrl);
+}
+
+static int airoha_pinctrl_probe(struct platform_device *pdev)
+{
+	struct device *dev = &pdev->dev;
+	struct airoha_pinctrl *pinctrl;
+	struct airoha_mfd *mfd;
+	struct regmap *map;
+	int err, i;
+
+	/* Assign parent MFD of_node to dev */
+	device_set_of_node_from_dev(dev, dev->parent);
+	mfd = dev_get_drvdata(dev->parent);
+
+	pinctrl = devm_kzalloc(dev, sizeof(*pinctrl), GFP_KERNEL);
+	if (!pinctrl)
+		return -ENOMEM;
+
+	mutex_init(&pinctrl->mutex);
+	pinctrl->base = mfd->base;
+
+	map = syscon_regmap_lookup_by_compatible("airoha,en7581-chip-scu");
+	if (IS_ERR(map))
+		return PTR_ERR(map);
+
+	pinctrl->chip_scu = map;
+
+	err = devm_pinctrl_register_and_init(dev, &airoha_pinctrl_desc,
+					     pinctrl, &pinctrl->ctrl);
+	if (err)
+		return err;
+
+	/* build pin groups */
+	for (i = 0; i < ARRAY_SIZE(airoha_pinctrl_groups); i++) {
+		const struct pingroup *grp = &airoha_pinctrl_groups[i];
+
+		err = pinctrl_generic_add_group(pinctrl->ctrl, grp->name,
+						grp->pins, grp->npins,
+						(void *)grp);
+		if (err < 0) {
+			dev_err(&pdev->dev, "Failed to register group %s\n",
+				grp->name);
+			return err;
+		}
+	}
+
+	/* build functions */
+	for (i = 0; i < ARRAY_SIZE(airoha_pinctrl_funcs); i++) {
+		const struct airoha_pinctrl_func *func;
+
+		func = &airoha_pinctrl_funcs[i];
+		err = pinmux_generic_add_function(pinctrl->ctrl,
+						  func->desc.func.name,
+						  func->desc.func.groups,
+						  func->desc.func.ngroups,
+						  (void *)func);
+		if (err < 0) {
+			dev_err(dev, "Failed to register function %s\n",
+				func->desc.func.name);
+			return err;
+		}
+	}
+
+	err = pinctrl_enable(pinctrl->ctrl);
+	if (err)
+		return err;
+
+	/* build gpio-chip */
+	return airoha_pinctrl_add_gpiochip(pinctrl, pdev);
+}
+
+static struct platform_driver airoha_pinctrl_driver = {
+	.probe = airoha_pinctrl_probe,
+	.driver = {
+		.name = "pinctrl-airoha",
+	},
+};
+module_platform_driver(airoha_pinctrl_driver);
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Lorenzo Bianconi <lorenzo at kernel.org>");
+MODULE_AUTHOR("Benjamin Larsson <benjamin.larsson at genexis.eu>");
+MODULE_AUTHOR("Markus Gothe <markus.gothe at genexis.eu>");
+MODULE_DESCRIPTION("Pinctrl driver for Airoha SoC");

-- 
2.46.0



From robh at kernel.org  Wed Sep 11 14:12:32 2024
From: robh at kernel.org (Rob Herring (Arm))
Date: Wed, 11 Sep 2024 16:12:32 -0500
Subject: [PATCH v4 1/5] dt-bindings: arm: airoha: Add the chip-scu node
 for EN7581 SoC
In-Reply-To: <20240911-en7581-pinctrl-v4-1-60ac93d760bb@kernel.org>
References: <20240911-en7581-pinctrl-v4-0-60ac93d760bb@kernel.org>
 <20240911-en7581-pinctrl-v4-1-60ac93d760bb@kernel.org>
Message-ID: <172608915149.1388705.7137335166206916411.robh@kernel.org>


On Wed, 11 Sep 2024 21:50:01 +0200, Lorenzo Bianconi wrote:
> This patch adds the chip-scu document bindings for EN7581 SoC.
> The airoha chip-scu block provides a configuration interface for clock,
> io-muxing and other functionalities used by multiple controllers (e.g.
> clock, pinctrl, ecc.) on EN7581 SoC.
> 
> Reviewed-by: Rob Herring (Arm) <robh at kernel.org>
> Signed-off-by: Lorenzo Bianconi <lorenzo at kernel.org>
> ---
>  .../bindings/arm/airoha,en7581-chip-scu.yaml       | 42 ++++++++++++++++++++++
>  1 file changed, 42 insertions(+)
> 

My bot found errors running 'make dt_binding_check' on your patch:

yamllint warnings/errors:

dtschema/dtc warnings/errors:


doc reference errors (make refcheckdocs):

See https://patchwork.ozlabs.org/project/devicetree-bindings/patch/20240911-en7581-pinctrl-v4-1-60ac93d760bb at kernel.org

The base for the series is generally the latest rc1. A different dependency
should be noted in *this* patch.

If you already ran 'make dt_binding_check' and didn't see the above
error(s), then make sure 'yamllint' is installed and dt-schema is up to
date:

pip3 install dtschema --upgrade

Please check and re-submit after running the above command yourself. Note
that DT_SCHEMA_FILES can be set to your schema file to speed up checking
your schema. However, it must be unset to test all examples with your schema.



From robh at kernel.org  Wed Sep 11 14:12:34 2024
From: robh at kernel.org (Rob Herring (Arm))
Date: Wed, 11 Sep 2024 16:12:34 -0500
Subject: [PATCH v4 2/5] dt-bindings: mfd: Add support for Airoha EN7581
 GPIO System Controller
In-Reply-To: <20240911-en7581-pinctrl-v4-2-60ac93d760bb@kernel.org>
References: <20240911-en7581-pinctrl-v4-0-60ac93d760bb@kernel.org>
 <20240911-en7581-pinctrl-v4-2-60ac93d760bb@kernel.org>
Message-ID: <172608915288.1388772.4934918553914498433.robh@kernel.org>


On Wed, 11 Sep 2024 21:50:02 +0200, Lorenzo Bianconi wrote:
> From: Christian Marangi <ansuelsmth at gmail.com>
> 
> Add support for Airoha EN7581 GPIO System Controller which provide a
> register map for controlling the GPIO, pinctrl and PWM of the SoC.
> 
> Schema define cells for both gpio/interrupt controller and PWM.
> Moreover it provides a dedicated pinctrl node for pins and config
> definitions.
> 
> Signed-off-by: Christian Marangi <ansuelsmth at gmail.com>
> Co-developed-by: Lorenzo Bianconi <lorenzo at kernel.org>
> Signed-off-by: Lorenzo Bianconi <lorenzo at kernel.org>
> ---
>  .../bindings/mfd/airoha,en7581-gpio-sysctl.yaml    | 433 +++++++++++++++++++++
>  1 file changed, 433 insertions(+)
> 

My bot found errors running 'make dt_binding_check' on your patch:

yamllint warnings/errors:

dtschema/dtc warnings/errors:


doc reference errors (make refcheckdocs):

See https://patchwork.ozlabs.org/project/devicetree-bindings/patch/20240911-en7581-pinctrl-v4-2-60ac93d760bb at kernel.org

The base for the series is generally the latest rc1. A different dependency
should be noted in *this* patch.

If you already ran 'make dt_binding_check' and didn't see the above
error(s), then make sure 'yamllint' is installed and dt-schema is up to
date:

pip3 install dtschema --upgrade

Please check and re-submit after running the above command yourself. Note
that DT_SCHEMA_FILES can be set to your schema file to speed up checking
your schema. However, it must be unset to test all examples with your schema.



From lorenzo at kernel.org  Wed Sep 11 14:46:11 2024
From: lorenzo at kernel.org (Lorenzo Bianconi)
Date: Wed, 11 Sep 2024 23:46:11 +0200
Subject: [PATCH v4 1/5] dt-bindings: arm: airoha: Add the chip-scu node
 for EN7581 SoC
In-Reply-To: <172608915149.1388705.7137335166206916411.robh@kernel.org>
References: <20240911-en7581-pinctrl-v4-0-60ac93d760bb@kernel.org>
 <20240911-en7581-pinctrl-v4-1-60ac93d760bb@kernel.org>
 <172608915149.1388705.7137335166206916411.robh@kernel.org>
Message-ID: <ZuIPo8BMBVGuaGMI@lore-desk>

> 
> On Wed, 11 Sep 2024 21:50:01 +0200, Lorenzo Bianconi wrote:
> > This patch adds the chip-scu document bindings for EN7581 SoC.
> > The airoha chip-scu block provides a configuration interface for clock,
> > io-muxing and other functionalities used by multiple controllers (e.g.
> > clock, pinctrl, ecc.) on EN7581 SoC.
> > 
> > Reviewed-by: Rob Herring (Arm) <robh at kernel.org>
> > Signed-off-by: Lorenzo Bianconi <lorenzo at kernel.org>
> > ---
> >  .../bindings/arm/airoha,en7581-chip-scu.yaml       | 42 ++++++++++++++++++++++
> >  1 file changed, 42 insertions(+)
> > 
> 
> My bot found errors running 'make dt_binding_check' on your patch:
> 
> yamllint warnings/errors:
> 
> dtschema/dtc warnings/errors:
> 
> 
> doc reference errors (make refcheckdocs):
> 
> See https://patchwork.ozlabs.org/project/devicetree-bindings/patch/20240911-en7581-pinctrl-v4-1-60ac93d760bb at kernel.org
> 
> The base for the series is generally the latest rc1. A different dependency
> should be noted in *this* patch.
> 
> If you already ran 'make dt_binding_check' and didn't see the above
> error(s), then make sure 'yamllint' is installed and dt-schema is up to
> date:
> 
> pip3 install dtschema --upgrade
> 
> Please check and re-submit after running the above command yourself. Note
> that DT_SCHEMA_FILES can be set to your schema file to speed up checking
> your schema. However, it must be unset to test all examples with your schema.
> 

Hi Rob,

before posting the series I run make dt_binding_check:

$ make dt_binding_check DT_SCHEMA_FILES=airoha
  SCHEMA  Documentation/devicetree/bindings/processed-schema.json
  CHKDT   Documentation/devicetree/bindings
  LINT    Documentation/devicetree/bindings
  DTC_CHK Documentation/devicetree/bindings/arm/airoha.example.dtb
  DTEX    Documentation/devicetree/bindings/arm/airoha,en7581-chip-scu.example.dts
  DTC_CHK Documentation/devicetree/bindings/arm/airoha,en7581-chip-scu.example.dtb
  DTC_CHK Documentation/devicetree/bindings/clock/airoha,en7523-scu.example.dtb
  DTC_CHK Documentation/devicetree/bindings/net/airoha,en7581-eth.example.dtb
  DTC_CHK Documentation/devicetree/bindings/net/airoha,en8811h.example.dtb
  DTC_CHK Documentation/devicetree/bindings/gpio/airoha,en7523-gpio.example.dtb
  DTC_CHK Documentation/devicetree/bindings/spi/airoha,en7581-snand.example.dtb
  DTC_CHK Documentation/devicetree/bindings/phy/airoha,en7581-pcie-phy.example.dtb

$yamllint --version
yamllint 1.35.1

dtschema is at the latest version.
Is it a false positive or am I missing something?

Regards,
Lorenzo
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 228 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-mediatek/attachments/20240911/007117bb/attachment.sig>

From lorenzo at kernel.org  Wed Sep 11 14:48:00 2024
From: lorenzo at kernel.org (Lorenzo Bianconi)
Date: Wed, 11 Sep 2024 23:48:00 +0200
Subject: [PATCH v4 2/5] dt-bindings: mfd: Add support for Airoha EN7581
 GPIO System Controller
In-Reply-To: <172608915288.1388772.4934918553914498433.robh@kernel.org>
References: <20240911-en7581-pinctrl-v4-0-60ac93d760bb@kernel.org>
 <20240911-en7581-pinctrl-v4-2-60ac93d760bb@kernel.org>
 <172608915288.1388772.4934918553914498433.robh@kernel.org>
Message-ID: <ZuIQEC4T6a69LmIM@lore-desk>

> 
> On Wed, 11 Sep 2024 21:50:02 +0200, Lorenzo Bianconi wrote:
> > From: Christian Marangi <ansuelsmth at gmail.com>
> > 
> > Add support for Airoha EN7581 GPIO System Controller which provide a
> > register map for controlling the GPIO, pinctrl and PWM of the SoC.
> > 
> > Schema define cells for both gpio/interrupt controller and PWM.
> > Moreover it provides a dedicated pinctrl node for pins and config
> > definitions.
> > 
> > Signed-off-by: Christian Marangi <ansuelsmth at gmail.com>
> > Co-developed-by: Lorenzo Bianconi <lorenzo at kernel.org>
> > Signed-off-by: Lorenzo Bianconi <lorenzo at kernel.org>
> > ---
> >  .../bindings/mfd/airoha,en7581-gpio-sysctl.yaml    | 433 +++++++++++++++++++++
> >  1 file changed, 433 insertions(+)
> > 
> 
> My bot found errors running 'make dt_binding_check' on your patch:
> 
> yamllint warnings/errors:
> 
> dtschema/dtc warnings/errors:
> 
> 
> doc reference errors (make refcheckdocs):
> 
> See https://patchwork.ozlabs.org/project/devicetree-bindings/patch/20240911-en7581-pinctrl-v4-2-60ac93d760bb at kernel.org
> 
> The base for the series is generally the latest rc1. A different dependency
> should be noted in *this* patch.
> 
> If you already ran 'make dt_binding_check' and didn't see the above
> error(s), then make sure 'yamllint' is installed and dt-schema is up to
> date:
> 
> pip3 install dtschema --upgrade
> 
> Please check and re-submit after running the above command yourself. Note
> that DT_SCHEMA_FILES can be set to your schema file to speed up checking
> your schema. However, it must be unset to test all examples with your schema.
> 

Similar to the previous patch, I run the following command before posting the
series:

$make dt_binding_check DT_SCHEMA_FILES=airoha
  SCHEMA  Documentation/devicetree/bindings/processed-schema.json
  CHKDT   Documentation/devicetree/bindings
  LINT    Documentation/devicetree/bindings
  DTEX    Documentation/devicetree/bindings/mfd/airoha,en7581-gpio-sysctl.example.dts
  DTC_CHK Documentation/devicetree/bindings/mfd/airoha,en7581-gpio-sysctl.example.dtb
  DTC_CHK Documentation/devicetree/bindings/arm/airoha.example.dtb
  DTC_CHK Documentation/devicetree/bindings/arm/airoha,en7581-chip-scu.example.dtb
  DTC_CHK Documentation/devicetree/bindings/clock/airoha,en7523-scu.example.dtb
  DTC_CHK Documentation/devicetree/bindings/net/airoha,en7581-eth.example.dtb
  DTC_CHK Documentation/devicetree/bindings/net/airoha,en8811h.example.dtb
  DTC_CHK Documentation/devicetree/bindings/gpio/airoha,en7523-gpio.example.dtb
  DTC_CHK Documentation/devicetree/bindings/spi/airoha,en7581-snand.example.dtb
  DTC_CHK Documentation/devicetree/bindings/phy/airoha,en7581-pcie-phy.example.dtb

Regards,
Lorenzo
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 228 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-mediatek/attachments/20240911/cfd91b96/attachment.sig>

From guoqing.jiang at canonical.com  Wed Sep 11 19:48:01 2024
From: guoqing.jiang at canonical.com (Guoqing Jiang)
Date: Thu, 12 Sep 2024 10:48:01 +0800
Subject: [PATCH] media: mtk-jpeg: Fix null-ptr-deref during unload module
Message-ID: <20240912024801.6904-1-guoqing.jiang@canonical.com>

The workqueue should be destroyed in mtk_jpeg_core.c since commit
09aea13ecf6f ("media: mtk-jpeg: refactor some variables"), otherwise
the below calltrace can be easily triggered.

[  677.862514] Unable to handle kernel paging request at virtual address dfff800000000023
[  677.863633] KASAN: null-ptr-deref in range [0x0000000000000118-0x000000000000011f]
...
[  677.879654] CPU: 6 PID: 1071 Comm: modprobe Tainted: G           O       6.8.12-mtk+gfa1a78e5d24b+ #17
...
[  677.882838] pc : destroy_workqueue+0x3c/0x770
[  677.883413] lr : mtk_jpegdec_destroy_workqueue+0x70/0x88 [mtk_jpeg_dec_hw]
[  677.884314] sp : ffff80008ad974f0
[  677.884744] x29: ffff80008ad974f0 x28: ffff0000d7115580 x27: ffff0000dd691070
[  677.885669] x26: ffff0000dd691408 x25: ffff8000844af3e0 x24: ffff80008ad97690
[  677.886592] x23: ffff0000e051d400 x22: ffff0000dd691010 x21: dfff800000000000
[  677.887515] x20: 0000000000000000 x19: 0000000000000000 x18: ffff800085397ac0
[  677.888438] x17: 0000000000000000 x16: ffff8000801b87c8 x15: 1ffff000115b2e10
[  677.889361] x14: 00000000f1f1f1f1 x13: 0000000000000000 x12: ffff7000115b2e4d
[  677.890285] x11: 1ffff000115b2e4c x10: ffff7000115b2e4c x9 : ffff80000aa43e90
[  677.891208] x8 : 00008fffeea4d1b4 x7 : ffff80008ad97267 x6 : 0000000000000001
[  677.892131] x5 : ffff80008ad97260 x4 : ffff7000115b2e4d x3 : 0000000000000000
[  677.893054] x2 : 0000000000000023 x1 : dfff800000000000 x0 : 0000000000000118
[  677.893977] Call trace:
[  677.894297]  destroy_workqueue+0x3c/0x770
[  677.894826]  mtk_jpegdec_destroy_workqueue+0x70/0x88 [mtk_jpeg_dec_hw]
[  677.895677]  devm_action_release+0x50/0x90
[  677.896211]  release_nodes+0xe8/0x170
[  677.896688]  devres_release_all+0xf8/0x178
[  677.897219]  device_unbind_cleanup+0x24/0x170
[  677.897785]  device_release_driver_internal+0x35c/0x480
[  677.898461]  device_release_driver+0x20/0x38
...
[  677.912665] ---[ end trace 0000000000000000 ]---

Fixes: 09aea13ecf6f ("media: mtk-jpeg: refactor some variables")
Signed-off-by: Guoqing Jiang <guoqing.jiang at canonical.com>
---
 drivers/media/platform/mediatek/jpeg/mtk_jpeg_core.c  | 10 ++++++++++
 .../media/platform/mediatek/jpeg/mtk_jpeg_dec_hw.c    | 11 -----------
 2 files changed, 10 insertions(+), 11 deletions(-)

diff --git a/drivers/media/platform/mediatek/jpeg/mtk_jpeg_core.c b/drivers/media/platform/mediatek/jpeg/mtk_jpeg_core.c
index ac48658e2de4..ff2694676355 100644
--- a/drivers/media/platform/mediatek/jpeg/mtk_jpeg_core.c
+++ b/drivers/media/platform/mediatek/jpeg/mtk_jpeg_core.c
@@ -1293,6 +1293,11 @@ static int mtk_jpeg_single_core_init(struct platform_device *pdev,
 	return 0;
 }
 
+static void mtk_jpeg_destroy_workqueue(void *data)
+{
+	destroy_workqueue(data);
+}
+
 static int mtk_jpeg_probe(struct platform_device *pdev)
 {
 	struct mtk_jpeg_dev *jpeg;
@@ -1337,6 +1342,11 @@ static int mtk_jpeg_probe(struct platform_device *pdev)
 							  | WQ_FREEZABLE);
 		if (!jpeg->workqueue)
 			return -EINVAL;
+		ret = devm_add_action_or_reset(&pdev->dev,
+					       mtk_jpeg_destroy_workqueue,
+					       jpeg->workqueue);
+		if (ret)
+			return ret;
 	}
 
 	ret = v4l2_device_register(&pdev->dev, &jpeg->v4l2_dev);
diff --git a/drivers/media/platform/mediatek/jpeg/mtk_jpeg_dec_hw.c b/drivers/media/platform/mediatek/jpeg/mtk_jpeg_dec_hw.c
index 4a6ee211e18f..2c5d74939d0a 100644
--- a/drivers/media/platform/mediatek/jpeg/mtk_jpeg_dec_hw.c
+++ b/drivers/media/platform/mediatek/jpeg/mtk_jpeg_dec_hw.c
@@ -578,11 +578,6 @@ static int mtk_jpegdec_hw_init_irq(struct mtk_jpegdec_comp_dev *dev)
 	return 0;
 }
 
-static void mtk_jpegdec_destroy_workqueue(void *data)
-{
-	destroy_workqueue(data);
-}
-
 static int mtk_jpegdec_hw_probe(struct platform_device *pdev)
 {
 	struct mtk_jpegdec_clk *jpegdec_clk;
@@ -606,12 +601,6 @@ static int mtk_jpegdec_hw_probe(struct platform_device *pdev)
 	dev->plat_dev = pdev;
 	dev->dev = &pdev->dev;
 
-	ret = devm_add_action_or_reset(&pdev->dev,
-				       mtk_jpegdec_destroy_workqueue,
-				       master_dev->workqueue);
-	if (ret)
-		return ret;
-
 	spin_lock_init(&dev->hw_lock);
 	dev->hw_state = MTK_JPEG_HW_IDLE;
 
-- 
2.34.1



From pablo.sun at mediatek.com  Thu Sep 12 00:06:24 2024
From: pablo.sun at mediatek.com (Pablo Sun)
Date: Thu, 12 Sep 2024 15:06:24 +0800
Subject: [PATCH v2] arm64: dts: mediatek: mt8395-genio-1200-evk: Enable GPU
Message-ID: <20240912070624.25540-1-pablo.sun@mediatek.com>

Enable the Mali Valhall GPU on Genio 1200 EVK by providing regulator
supply settingsi to gpu and mfg1, and enable the GPU node.

In addition, set the GPU related regulator voltage range:

1. Set the recommended input voltage range of DVDD_GPU to (0.546V-0.787V),
   based on Table 5-3 of MT8395 Application Processor Datasheet.
   The regulator mt6315_7_vbuck1("Vgpu") connects to the DVDD_GPU input.
   Note that the minimum voltage in SoC eFuse data, which is read by
   MTK-SVS to adjust the regulator voltage, does not go below
   the recommended operating voltage in the datasheet.

2. Set the input voltage of DVDD_SRAM_GPU, supplied by
   mt6359_vsram_others_ldo_reg, to 0.75V, the recommended typical
   operating voltage in MT8395 Application Processor Datasheet.

This patch is tested by enabling CONFIG_DRM_PANFROST and
on Genio 1200 EVK it probed with following dmesg:

```
panfrost 13000000.gpu: clock rate = 700000092
panfrost 13000000.gpu: mali-g57 id 0x9093 major 0x0 minor 0x1 status 0x0
panfrost 13000000.gpu: features: 00000000,000019f7,
					   issues: 00000001,80000400
panfrost 13000000.gpu: Features: L2:0x07120206 Shader:0x00000000
					   Tiler:0x00000809 Mem:0x301
					   MMU:0x00002830 AS:0xff JS:0x7
panfrost 13000000.gpu: shader_present=0x50045 l2_present=0x1
[drm] Initialized panfrost 1.2.0 for 13000000.gpu on minor 0
```

Signed-off-by: Pablo Sun <pablo.sun at mediatek.com>
---
 .../dts/mediatek/mt8395-genio-1200-evk.dts    | 19 +++++++++++++++++--
 1 file changed, 17 insertions(+), 2 deletions(-)

diff --git a/arch/arm64/boot/dts/mediatek/mt8395-genio-1200-evk.dts b/arch/arm64/boot/dts/mediatek/mt8395-genio-1200-evk.dts
index a06610fff8ad..4f7d66d6d785 100644
--- a/arch/arm64/boot/dts/mediatek/mt8395-genio-1200-evk.dts
+++ b/arch/arm64/boot/dts/mediatek/mt8395-genio-1200-evk.dts
@@ -194,6 +194,11 @@ eth_phy0: eth-phy0 at 1 {
 	};
 };
 
+&gpu {
+	mali-supply = <&mt6315_7_vbuck1>;
+	status = "okay";
+};
+
 &i2c0 {
 	clock-frequency = <400000>;
 	pinctrl-0 = <&i2c0_pins>;
@@ -337,6 +342,10 @@ &mfg0 {
 	domain-supply = <&mt6315_7_vbuck1>;
 };
 
+&mfg1 {
+	domain-supply = <&mt6359_vsram_others_ldo_reg>;
+};
+
 &mmc0 {
 	status = "okay";
 	pinctrl-names = "default", "state_uhs";
@@ -407,6 +416,12 @@ &mt6359_vrf12_ldo_reg {
 	regulator-always-on;
 };
 
+/* for GPU SRAM */
+&mt6359_vsram_others_ldo_reg {
+	regulator-min-microvolt = <750000>;
+	regulator-max-microvolt = <750000>;
+};
+
 &mt6359codec {
 	mediatek,mic-type-0 = <1>; /* ACC */
 	mediatek,mic-type-1 = <3>; /* DCC */
@@ -839,8 +854,8 @@ regulators {
 			mt6315_7_vbuck1: vbuck1 {
 				regulator-compatible = "vbuck1";
 				regulator-name = "Vgpu";
-				regulator-min-microvolt = <300000>;
-				regulator-max-microvolt = <1193750>;
+				regulator-min-microvolt = <546000>;
+				regulator-max-microvolt = <787000>;
 				regulator-enable-ramp-delay = <256>;
 				regulator-allowed-modes = <0 1 2>;
 			};
-- 
2.45.2



From Chris.Lu at mediatek.com  Thu Sep 12 00:09:58 2024
From: Chris.Lu at mediatek.com (=?utf-8?B?Q2hyaXMgTHUgKOmZuOeomuazkyk=?=)
Date: Thu, 12 Sep 2024 07:09:58 +0000
Subject: [PATCH] Bluetooth: btmtk: Remove resetting mt7921 before
 downloading the fw
In-Reply-To: <ZuB3omUkdUHLggYu@mdpsys.co.uk>
References: <20240822052310.25220-1-hao.qin@mediatek.com>
	 <ZuB3omUkdUHLggYu@mdpsys.co.uk>
Message-ID: <790e542aa9d08c7efeee6ef298fce2a87d8035e4.camel@mediatek.com>

On Tue, 2024-09-10 at 18:09 +0100, Marc Payne wrote:

Hi Marc,

Is it possible to provide entire kernel log for further debugging?
(From boot up to issue heppen)

We suspect that the issue occurred event earilier and our controller is
not able to recover itself. Therfore, we need to check if Bluetooth
works as expected in the booting stage.

BRs,
Chris Lu

>  	 
> External email : Please do not click links or open attachments until
> you have verified the sender or the content.
>  Hi,
> 
> The 22/08/2024 13:23, Hao Qin wrote:
> > Remove resetting mt7921 before downloading the fw, as it may cause
> > command timeout when performing the reset.
> > 
> > Signed-off-by: Hao Qin <hao.qin at mediatek.com>
> > ---
> >  drivers/bluetooth/btmtk.c | 4 ++--
> >  1 file changed, 2 insertions(+), 2 deletions(-)
> > 
> > diff --git a/drivers/bluetooth/btmtk.c b/drivers/bluetooth/btmtk.c
> > index 2b7c80043aa2..a46f70135cbd 100644
> > --- a/drivers/bluetooth/btmtk.c
> > +++ b/drivers/bluetooth/btmtk.c
> > @@ -1326,7 +1326,6 @@ int btmtk_usb_setup(struct hci_dev *hdev)
> >  fwname = FIRMWARE_MT7668;
> >  break;
> >  case 0x7922:
> > -case 0x7961:
> >  case 0x7925:
> >  /* Reset the device to ensure it's in the initial state before
> >   * downloading the firmware to ensure.
> > @@ -1334,7 +1333,8 @@ int btmtk_usb_setup(struct hci_dev *hdev)
> >  
> >  if (!test_bit(BTMTK_FIRMWARE_LOADED, &btmtk_data->flags))
> >  btmtk_usb_subsys_reset(hdev, dev_id);
> > -
> > +fallthrough;
> > +case 0x7961:
> >  btmtk_fw_get_filename(fw_bin_name, sizeof(fw_bin_name), dev_id,
> >        fw_version, fw_flavor);
> >  
> > -- 
> > 2.18.0
> > 
> 
> [Original regression report
> 
https://lore.kernel.org/linux-bluetooth/ZsTh7Jyug7MbZsLE at mdpsys.co.uk/
> ]
> 
> Thanks for the patch, I have tested it on top of v6.11-rc7 and can
> confirm
> that it resolves the initial command timeout issue.
> 
> Unfortunately, when using the latest firmware version 20240826151221
> from the
> linux-firmware repo I'm still seeing "Mediatek coredump end" errors
> followed by MSFT and AOSP errors. The device then appears
> unresponsive
> and the kernel eventually gives up attempting to enumerate:
> 
> [  230.042936] usb 4-3.2: new SuperSpeed USB device number 4 using
> xhci_hcd
> [  230.065228] usb 4-3.2: New USB device found, idVendor=0e8d,
> idProduct=7961, bcdDevice= 1.00
> [  230.065237] usb 4-3.2: New USB device strings: Mfr=6, Product=7,
> SerialNumber=8
> [  230.065240] usb 4-3.2: Product: Wireless_Device
> [  230.065242] usb 4-3.2: Manufacturer: MediaTek Inc.
> [  230.065245] usb 4-3.2: SerialNumber: 000000000
> [  230.101915] Bluetooth: hci2: HW/SW Version: 0x008a008a, Build
> Time: 20240826151221
> [  233.005938] Bluetooth: hci2: Device setup in 2862056 usecs
> [  233.005983] Bluetooth: hci2: HCI Enhanced Setup Synchronous
> Connection command is advertised, but not supported.
> [  234.306071] Bluetooth: hci2: Mediatek coredump end
> [  235.092729] Bluetooth: hci2: Opcode 0x0c03 failed: -110
> [  235.192772] Bluetooth: hci2: Mediatek coredump end
> [  237.226157] Bluetooth: hci2: Failed to read MSFT supported
> features (-110)
> [  239.359435] Bluetooth: hci2: AOSP get vendor capabilities (-110)
> [  244.479726] usb 4-3.2: Disable of device-initiated U1 failed.
> [  249.599598] usb 4-3.2: Disable of device-initiated U2 failed.
> [  259.839215] Bluetooth: hci2: Failed to write uhw reg(-110)
> [  259.839240] usb 4-3.2: Disable of device-initiated U1 failed.
> [  264.959343] usb 4-3.2: Disable of device-initiated U2 failed.
> [  270.079038] xhci_hcd 0000:00:14.0: Timeout while waiting for setup
> device command
> [  275.412299] xhci_hcd 0000:00:14.0: Timeout while waiting for setup
> device command
> [  275.618812] usb 4-3.2: device not accepting address 4, error -62
> [  280.958852] xhci_hcd 0000:00:14.0: Timeout while waiting for setup
> device command
> [  286.292034] xhci_hcd 0000:00:14.0: Timeout while waiting for setup
> device command
> [  286.498618] usb 4-3.2: device not accepting address 4, error -62
> [  291.838759] xhci_hcd 0000:00:14.0: Timeout while waiting for setup
> device command
> [  297.172018] xhci_hcd 0000:00:14.0: Timeout while waiting for setup
> device command
> [  297.378477] usb 4-3.2: device not accepting address 4, error -62
> [  302.718497] xhci_hcd 0000:00:14.0: Timeout while waiting for setup
> device command
> [  308.051867] xhci_hcd 0000:00:14.0: Timeout while waiting for setup
> device command
> [  308.258345] usb 4-3.2: device not accepting address 4, error -62
> [  308.260253] usb 4-3.2: USB disconnect, device number 4
> [  313.598307] xhci_hcd 0000:00:14.0: Timeout while waiting for setup
> device command
> [  318.931586] xhci_hcd 0000:00:14.0: Timeout while waiting for setup
> device command
> [  319.138278] usb 4-3.2: device not accepting address 5, error -62
> [  324.478224] xhci_hcd 0000:00:14.0: Timeout while waiting for setup
> device command
> [  329.811444] xhci_hcd 0000:00:14.0: Timeout while waiting for setup
> device command
> [  330.018032] usb 4-3.2: device not accepting address 6, error -62
> [  330.018489] usb 4-3-port2: attempt power cycle
> [  336.211505] xhci_hcd 0000:00:14.0: Timeout while waiting for setup
> device command
> [  341.544640] xhci_hcd 0000:00:14.0: Timeout while waiting for setup
> device command
> [  341.751239] usb 4-3.2: device not accepting address 7, error -62
> [  347.091375] xhci_hcd 0000:00:14.0: Timeout while waiting for setup
> device command
> [  352.424563] xhci_hcd 0000:00:14.0: Timeout while waiting for setup
> device command
> [  352.631136] usb 4-3.2: device not accepting address 8, error -62
> [  352.631538] usb 4-3-port2: unable to enumerate USB device
> 
> 
> Interestingly, if I revert back to an known-good firmware version
> 20231025113744 along with your patch, the device enumerates and works
> fine:
> 
> [ 4001.366725] usb 4-1: new SuperSpeed USB device number 4 using
> xhci_hcd
> [ 4001.385840] usb 4-1: New USB device found, idVendor=0e8d,
> idProduct=7961, bcdDevice= 1.00
> [ 4001.385855] usb 4-1: New USB device strings: Mfr=6, Product=7,
> SerialNumber=8
> [ 4001.385860] usb 4-1: Product: Wireless_Device
> [ 4001.385863] usb 4-1: Manufacturer: MediaTek Inc.
> [ 4001.385867] usb 4-1: SerialNumber: 000000000
> [ 4001.398010] Bluetooth: hci1: HW/SW Version: 0x008a008a, Build
> Time: 20231025113744
> [ 4004.275656] Bluetooth: hci1: Device setup in 2812288 usecs
> [ 4004.275661] Bluetooth: hci1: HCI Enhanced Setup Synchronous
> Connection command is advertised, but not supported.
> [ 4004.355137] Bluetooth: hci1: AOSP extensions version v0.96
> [ 4004.355156] Bluetooth: hci1: AOSP quality report is not supported
> [ 4004.355698] Bluetooth: MGMT ver 1.23
> 
> But if I then disconnect it, I get the Oops that I shared in my
> original
> regression report:
> 
> [ 4043.436215] usb 4-1: USB disconnect, device number 4
> [ 4043.437308] Oops: general protection fault, probably for non-
> canonical address 0xdead000000000122: 0000 [#1] PREEMPT SMP NOPTI
> [ 4043.437332] CPU: 2 UID: 0 PID: 3698 Comm: kworker/2:0 Not tainted
> 6.11.0-rc7-00001-g0e2ad6528188-dirty #71
> d90fb9085e2a0686ac48ebcc408d97b104c6fbf1
> [ 4043.437352] Hardware name: Intel(R) Client Systems
> NUC12WSHi7/NUC12WSBi7, BIOS WSADL357.0088.2023.0505.1623 05/05/2023
> [ 4043.437361] Workqueue: usb_hub_wq hub_event
> [ 4043.437386] RIP: 0010:hci_unregister_dev+0x45/0x1f0 [bluetooth]
> [ 4043.437548] Code: 89 ef e8 ae d4 5c c1 f0 80 8b e9 0e 00 00 08 48
> 89 ef e8 0e c2 5c c1 48 c7 c7 68 60 52 c1 e8 22 23 5d c1 48 8b 43 08
> 48 8b 13 <48> 3b 18 0f 85 f5 c7 06 00 48 3b 5a 08 0f 85 eb c7 06 00
> 48 89 42
> [ 4043.437560] RSP: 0018:ffffa10f4ae43b98 EFLAGS: 00010246
> [ 4043.437574] RAX: dead000000000122 RBX: ffff8cf86c160000 RCX:
> 0000000000000000
> [ 4043.437585] RDX: dead000000000100 RSI: ffff8cf7b7d16c50 RDI:
> ffffffffc1526068
> [ 4043.437594] RBP: ffff8cf86c1604d0 R08: 0000000000000000 R09:
> ffff8cf7401d8e10
> [ 4043.437602] R10: ffffa10f4ae43ba0 R11: ffffa10f4ae43ba8 R12:
> ffff8cf86c160000
> [ 4043.437610] R13: ffffffffc1416278 R14: ffffffffc1416278 R15:
> ffff8cf7f8d73850
> [ 4043.437620] FS:  0000000000000000(0000) GS:ffff8d0697300000(0000)
> knlGS:0000000000000000
> [ 4043.437632] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
> [ 4043.437641] CR2: 00007f98d66dc000 CR3: 0000000131124000 CR4:
> 0000000000f50ef0
> [ 4043.437651] PKRU: 55555554
> [ 4043.437658] Call Trace:
> [ 4043.437670]  <TASK>
> [ 4043.437680]  ? __die_body.cold+0x19/0x27
> [ 4043.437700]  ? die_addr+0x3c/0x60
> [ 4043.437716]  ? exc_general_protection+0x17d/0x400
> [ 4043.437738]  ? asm_exc_general_protection+0x26/0x30
> [ 4043.437760]  ? hci_unregister_dev+0x45/0x1f0 [bluetooth
> 6dca047d1088401e195d97746b2b4936e5756d61]
> [ 4043.437930]  ? hci_unregister_dev+0x3e/0x1f0 [bluetooth
> 6dca047d1088401e195d97746b2b4936e5756d61]
> [ 4043.438080]  btusb_disconnect+0x67/0x170 [btusb
> 5bf8186d9cab4c5be1762247dadb6753a7c72a7f]
> [ 4043.438108]  usb_unbind_interface+0x90/0x290
> [ 4043.438130]  device_release_driver_internal+0x19c/0x200
> [ 4043.438150]  bus_remove_device+0xc6/0x130
> [ 4043.438166]  device_del+0x161/0x3e0
> [ 4043.438182]  ? kobject_put+0xa0/0x1d0
> [ 4043.438196]  usb_disable_device+0x104/0x220
> [ 4043.438213]  usb_disconnect+0xe6/0x2e0
> [ 4043.438231]  hub_event+0x7f9/0x19d0
> [ 4043.438250]  ? __pm_runtime_suspend+0x47/0xc0
> [ 4043.438269]  process_one_work+0x17b/0x330
> [ 4043.438287]  worker_thread+0x2c6/0x3f0
> [ 4043.438304]  ? __pfx_worker_thread+0x10/0x10
> [ 4043.438318]  kthread+0xcf/0x100
> [ 4043.438337]  ? __pfx_kthread+0x10/0x10
> [ 4043.438354]  ret_from_fork+0x31/0x50
> [ 4043.438367]  ? __pfx_kthread+0x10/0x10
> [ 4043.438382]  ret_from_fork_asm+0x1a/0x30
> [ 4043.438403]  </TASK>
> [ 4043.438408] Modules linked in: uhid mt792x_usb mt7921_common
> mt792x_lib mt76_connac_lib mt76_usb mt76 ccm option usb_wwan cmac
> algif_hash algif_skcipher af_alg sr_mod cdrom bnep mousedev joydev
> vfat fat snd_sof_pci_intel_tgl snd_sof_pci_intel_cnl intel_rapl_msr
> snd_sof_intel_hda_generic intel_rapl_common soundwire_intel
> intel_uncore_frequency soundwire_cadence
> intel_uncore_frequency_common snd_sof_intel_hda_common
> snd_sof_intel_hda_mlink snd_sof_intel_hda snd_sof_pci
> snd_sof_xtensa_dsp snd_sof iwlmvm snd_sof_utils snd_soc_hdac_hda
> snd_soc_acpi_intel_match soundwire_generic_allocation snd_soc_acpi
> soundwire_bus snd_soc_avs r8152 x86_pkg_temp_thermal intel_powerclamp
> libphy snd_soc_hda_codec coretemp mac80211 snd_hda_ext_core kvm_intel
> snd_soc_core snd_hda_codec_hdmi cdc_ether hid_generic uas usbnet
> snd_hda_codec_realtek snd_compress kvm usb_storage mii usbhid
> snd_hda_codec_generic ac97_bus snd_pcm_dmaengine
> snd_hda_scodec_component snd_hda_intel libarc4 snd_intel_dspcfg btusb
> crct10dif_pclmul snd_intel_sdw_acpi
> [ 4043.438617]  crc32_pclmul iwlwifi btrtl snd_hda_codec
> polyval_clmulni btintel polyval_generic btbcm ghash_clmulni_intel
> sha512_ssse3 btmtk tps6598x sha256_ssse3 snd_hda_core typec
> sha1_ssse3 cfg80211 bluetooth aesni_intel snd_hwdep roles gf128mul
> crypto_simd snd_pcm cryptd mei_hdcp mei_pxp rapl ee1004 ov13858
> snd_timer intel_cstate igc spi_nor intel_uncore i2c_i801 thunderbolt
> snd v4l2_fwnode mei_me v4l2_async ptp wdat_wdt i2c_smbus mtd pcspkr
> wmi_bmof intel_lpss_pci videodev mei pps_core soundcore
> intel_pmc_core i2c_mux intel_lpss rfkill idma64 igen6_edac intel_vsec
> serial_multi_instantiate mc pmt_telemetry pinctrl_tigerlake pmt_class
> acpi_pad acpi_tad mac_hid i2c_dev dm_mod sg crypto_user loop
> nfnetlink ip_tables x_tables ext4 crc32c_generic crc16 mbcache jbd2
> xe drm_ttm_helper gpu_sched drm_suballoc_helper drm_gpuvm drm_exec
> i915 i2c_algo_bit drm_buddy ttm nvme intel_gtt drm_display_helper
> nvme_core spi_intel_pci cec xhci_pci crc32c_intel spi_intel nvme_auth
> xhci_pci_renesas video wmi
> [ 4043.438898] ---[ end trace 0000000000000000 ]---
> [ 4043.438905] RIP: 0010:hci_unregister_dev+0x45/0x1f0 [bluetooth]
> [ 4043.439039] Code: 89 ef e8 ae d4 5c c1 f0 80 8b e9 0e 00 00 08 48
> 89 ef e8 0e c2 5c c1 48 c7 c7 68 60 52 c1 e8 22 23 5d c1 48 8b 43 08
> 48 8b 13 <48> 3b 18 0f 85 f5 c7 06 00 48 3b 5a 08 0f 85 eb c7 06 00
> 48 89 42
> [ 4043.439048] RSP: 0018:ffffa10f4ae43b98 EFLAGS: 00010246
> [ 4043.439058] RAX: dead000000000122 RBX: ffff8cf86c160000 RCX:
> 0000000000000000
> [ 4043.439065] RDX: dead000000000100 RSI: ffff8cf7b7d16c50 RDI:
> ffffffffc1526068
> [ 4043.439072] RBP: ffff8cf86c1604d0 R08: 0000000000000000 R09:
> ffff8cf7401d8e10
> [ 4043.439078] R10: ffffa10f4ae43ba0 R11: ffffa10f4ae43ba8 R12:
> ffff8cf86c160000
> [ 4043.439085] R13: ffffffffc1416278 R14: ffffffffc1416278 R15:
> ffff8cf7f8d73850
> [ 4043.439091] FS:  0000000000000000(0000) GS:ffff8d0697300000(0000)
> knlGS:0000000000000000
> [ 4043.439100] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
> [ 4043.439108] CR2: 00007f98d66dc000 CR3: 0000000131124000 CR4:
> 0000000000f50ef0
> [ 4043.439116] PKRU: 55555554
> [ 4043.439122] note: kworker/2:0[3698] exited with preempt_count 1
> 
> So, in summary, it looks as though there are two issues here:
> 
> 1. The latest firmware does not seem to work well with this chipset,
>    perhaps it is crashing after loading?
> 2. The Oops in the hci_unregister_dev function suggests some HCI
>    registration bug.
> 
> Let me know if I can provide any further assistance.
> 
> Regards,
> 
> Marc
> 

From angelogioacchino.delregno at collabora.com  Thu Sep 12 00:52:32 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Thu, 12 Sep 2024 07:52:32 +0000
Subject: [PATCH] arm64: dts: mediatek: mt8395-genio-1200-evk: Enable GPU
In-Reply-To: <2fd45240-a341-806b-f336-78d0595a8031@mediatek.com>
References: <20240910143245.5282-1-pablo.sun@mediatek.com>
 <01020191e04d4237-204596e1-6cc1-491c-a60f-de3917af7d42-000000@eu-west-1.amazonses.com>
 <2fd45240-a341-806b-f336-78d0595a8031@mediatek.com>
Message-ID: <01020191e5383829-7eb375ea-ee17-419e-b173-30df46f61863-000000@eu-west-1.amazonses.com>

Il 11/09/24 12:35, Pablo Sun ha scritto:
> Hi Angelo,
> 
> Thanks for the review,
> 
> On 9/11/24 16:57, AngeloGioacchino Del Regno wrote:
> 
> [snip]
> 
>>> +/* for GPU SRAM */
>>> +&mt6359_vsram_others_ldo_reg {
>>> +??? regulator-always-on;
>>
>> No, that's not good. Like that, the GPU VSRAM will be subject to current leakage.
>>
>> Remove the regulator-always-on property.
>> The right way of doing that is to add the vgpu to the mfg0's domain supply and
>> vsram to mfg1; that way all of the GPU regulators will be off at PM suspend time.
> 
> Thanks for pointing this out, I'll send v2 to fix this.
> 
>>> ? &mt6359codec {
>>> ????? mediatek,mic-type-0 = <1>; /* ACC */
>>> ????? mediatek,mic-type-1 = <3>; /* DCC */
>>> @@ -839,8 +851,8 @@ regulators {
>>> ????????????? mt6315_7_vbuck1: vbuck1 {
>>> ????????????????? regulator-compatible = "vbuck1";
>>> ????????????????? regulator-name = "Vgpu";
>>> -??????????????? regulator-min-microvolt = <300000>;
>>> -??????????????? regulator-max-microvolt = <1193750>;
>>> +??????????????? regulator-min-microvolt = <546000>;
>>
>> I'm okay with this constraint but are you sure that MTK-SVS won't go any lower 
>> than 0.546V?
> 
> I'll see if I could confirm the maximum voltage drop that may be lowered by mtk-svs 
> for MT8395. There are 3 constraints that I am aware of:
> 
> - capability of Vgpu buck: 0.3V-1.193V
> - sign-off voltage of the EVK board: 0.6V to 1.2V
> - recommended operating voltage of MT8395 DVDD_GPU: 0.546V to 0.787V
> 
> For the device tree of the board, would you recommend set the regulator voltage 
> constraints in narrower range (because it's safer to keep in recommended operating 
> conditions), or in a wider range (leaving the check to driver software for 
> potential power saving?)
> 

The range should match the target device's Vin constraints; in this case, it
should be no lower than the minimum working voltage of the Vgpu-in of the Mali IP.

The drivers will be responsible of setting the lowest possible voltage for
enhanced efficiency (power saving), taking into account the fused chip quality bits
(in this case, the MediaTek SVS driver!).

You should, at this point, check the constraints of SVS, as in, given a reference
voltage (in this case, located in the GPU OPP table, the voltage associated with
the lowest frequency of the GPU), what is the maximum voltage *subtraction* that
SVS will do on the VGPU?

After the subtraction, may this voltage be lower than 0.546V? :-)

Cheers,
Angelo

> Thanks
> 
> 





From angelogioacchino.delregno at collabora.com  Thu Sep 12 00:53:59 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Thu, 12 Sep 2024 07:53:59 +0000
Subject: [PATCH v2] ASoc: mediatek: mt8365: Remove unneeded assignment
In-Reply-To: <20240911123629.125686-1-usama.anjum@collabora.com>
References: <20240911123629.125686-1-usama.anjum@collabora.com>
Message-ID: <01020191e5398d69-e1c1cbbf-1617-4df9-bbff-2e728d8e04b2-000000@eu-west-1.amazonses.com>

Il 11/09/24 14:36, Muhammad Usama Anjum ha scritto:
> The ret is being assigned, but not being used. Remove the assignment.
> One of the reviewer mentioned that dev_warn should be replaced with
> dev_info. Make this change as well.
> 
> Fixes: 1bf6dbd75f76 ("ASoc: mediatek: mt8365: Add a specific soundcard for EVK")
> Signed-off-by: Muhammad Usama Anjum <usama.anjum at collabora.com>

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>




From angelogioacchino.delregno at collabora.com  Thu Sep 12 00:55:41 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Thu, 12 Sep 2024 07:55:41 +0000
Subject: [PATCH] ASoC: mediatek: Remove redundant error message
In-Reply-To: <20240911123751.2078-1-tangbin@cmss.chinamobile.com>
References: <20240911123751.2078-1-tangbin@cmss.chinamobile.com>
Message-ID: <01020191e53b1b5a-173497ca-00f1-4f81-be2e-0eed9ba7cd67-000000@eu-west-1.amazonses.com>

Il 11/09/24 14:37, Tang Bin ha scritto:
> In the function mt7986_afe_pcm_dev_probe, when get irq
> failed, the function platform_get_irq() logs an error
> message, so remove redundant one here.
> 
> Signed-off-by: Tang Bin <tangbin at cmss.chinamobile.com>

Please clarify the commit titie, like
ASoC: mediatek: mt7986-afe-pcm: Remove redundant error message

After which,
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>




From Jason-JH.Lin at mediatek.com  Thu Sep 12 00:56:27 2024
From: Jason-JH.Lin at mediatek.com (=?utf-8?B?SmFzb24tSkggTGluICjmnpfnnb/npaUp?=)
Date: Thu, 12 Sep 2024 07:56:27 +0000
Subject: [bug report] drm/mediatek: Add mbox_free_channel in
 mtk_drm_crtc_destroy
In-Reply-To: <77b85cdc-ecfe-42c7-a3f3-a757566b6f5f@stanley.mountain>
References: <77b85cdc-ecfe-42c7-a3f3-a757566b6f5f@stanley.mountain>
Message-ID: <fd3890987a56a01be8954f3d10d6e744918c62d7.camel@mediatek.com>

Hi Dan,

Thanks for the bug report.

On Wed, 2024-09-11 at 14:02 +0300, Dan Carpenter wrote:
>  	 
> External email : Please do not click links or open attachments until
> you have verified the sender or the content.
>  Hello jason-jh.lin,
> 
> Commit 593b655f0523 ("drm/mediatek: Add mbox_free_channel in
> mtk_drm_crtc_destroy") from Oct 28, 2021 (linux-next), leads to the
> following Smatch static checker warning:
> 

It's actaully caused by this Commit d7c66b5fbc70 ("drm/mediatek: Use
cmdq_pkt_create() and cmdq_pkt_destroy()").

> drivers/gpu/drm/mediatek/mtk_crtc.c:132 mtk_crtc_destroy()
> warn: variable dereferenced before check 'mtk_crtc->cmdq_client.chan' 
> (see line 130)
> 
> drivers/gpu/drm/mediatek/mtk_crtc.c
>     123 static void mtk_crtc_destroy(struct drm_crtc *crtc)
>     124 {
>     125         struct mtk_crtc *mtk_crtc = to_mtk_crtc(crtc);
>     126         int i;
>     127 
>     128         mtk_mutex_put(mtk_crtc->mutex);
>     129 #if IS_REACHABLE(CONFIG_MTK_CMDQ)
>     130         cmdq_pkt_destroy(&mtk_crtc->cmdq_client, &mtk_crtc-
> >cmdq_handle);
>                                  ^^^^^^^^^^^^^^^^^^^^^^
> Dereferenced without checking.  We recently refactored these so the
> dereference
> is detectable by static analysis.

cmdq_client is a static variable in struct mtk_crtc, it's not a
pointer. Do we really need to check this?


Regards,
Jason-JH.Lin

> 
>     131 
> --> 132         if (mtk_crtc->cmdq_client.chan) {
>                     ^^^^^^^^^^^^^^^^^^^^^^^^^^
> Checked too late.
> 
>     133                 mbox_free_channel(mtk_crtc-
> >cmdq_client.chan);
>     134                 mtk_crtc->cmdq_client.chan = NULL;
>     135         }
>     136 #endif
>     137 
>     138         for (i = 0; i < mtk_crtc->ddp_comp_nr; i++) {
>     139                 struct mtk_ddp_comp *comp;
>     140 
>     141                 comp = mtk_crtc->ddp_comp[i];
>     142                 mtk_ddp_comp_unregister_vblank_cb(comp);
>     143         }
>     144 
>     145         drm_crtc_cleanup(crtc);
>     146 }
> 
> regards,
> dan carpenter

From angelogioacchino.delregno at collabora.com  Thu Sep 12 00:59:21 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Thu, 12 Sep 2024 07:59:21 +0000
Subject: [PATCH] dt-bindings: mailbox: mediatek,gce-mailbox: Stop
 requiring clock-names
In-Reply-To: <20240911-unhappy-wifi-b0a851e261bb@spud>
References: <20240911104327.123602-1-angelogioacchino.delregno@collabora.com>
 <20240911-unhappy-wifi-b0a851e261bb@spud>
Message-ID: <01020191e53e7670-d04af181-0137-4f35-962e-2f1119d026df-000000@eu-west-1.amazonses.com>

Il 11/09/24 19:51, Conor Dooley ha scritto:
> On Wed, Sep 11, 2024 at 12:43:27PM +0200, AngeloGioacchino Del Regno wrote:
>> There is no reason to make specifying the clock-names property
>> mandatory, as the Global Command Engine HW needs only one clock.
> 
> Have you checked to make sure that there are no users that do the lookup
> by name?
> 

It's just that I didn't want to mention any "driver" word in the commit description
for a binding ;-)

(Of course I did, and the driver is not doing any by_name lookup)

Cheers,
Angelo

>>
>> Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
>> ---
>>   .../bindings/mailbox/mediatek,gce-mailbox.yaml        | 11 -----------
>>   1 file changed, 11 deletions(-)
>>
>> diff --git a/Documentation/devicetree/bindings/mailbox/mediatek,gce-mailbox.yaml b/Documentation/devicetree/bindings/mailbox/mediatek,gce-mailbox.yaml
>> index cef9d7601398..ff5d010fbcf0 100644
>> --- a/Documentation/devicetree/bindings/mailbox/mediatek,gce-mailbox.yaml
>> +++ b/Documentation/devicetree/bindings/mailbox/mediatek,gce-mailbox.yaml
>> @@ -56,17 +56,6 @@ required:
>>     - interrupts
>>     - clocks
>>   
>> -allOf:
>> -  - if:
>> -      not:
>> -        properties:
>> -          compatible:
>> -            contains:
>> -              const: mediatek,mt8195-gce
>> -    then:
>> -      required:
>> -        - clock-names
>> -
>>   additionalProperties: false
>>   
>>   examples:
>> -- 
>> 2.46.0
>>




From conor.dooley at microchip.com  Thu Sep 12 01:27:30 2024
From: conor.dooley at microchip.com (Conor Dooley)
Date: Thu, 12 Sep 2024 09:27:30 +0100
Subject: [PATCH] dt-bindings: mailbox: mediatek,gce-mailbox: Stop
 requiring clock-names
In-Reply-To: <01020191e53e7670-d04af181-0137-4f35-962e-2f1119d026df-000000@eu-west-1.amazonses.com>
References: <20240911104327.123602-1-angelogioacchino.delregno@collabora.com>
 <20240911-unhappy-wifi-b0a851e261bb@spud>
 <01020191e53e7670-d04af181-0137-4f35-962e-2f1119d026df-000000@eu-west-1.amazonses.com>
Message-ID: <20240912-unsaddle-rubbing-9aedc46c024b@wendy>

On Thu, Sep 12, 2024 at 07:59:21AM +0000, AngeloGioacchino Del Regno wrote:
> Il 11/09/24 19:51, Conor Dooley ha scritto:
> > On Wed, Sep 11, 2024 at 12:43:27PM +0200, AngeloGioacchino Del Regno wrote:
> > > There is no reason to make specifying the clock-names property
> > > mandatory, as the Global Command Engine HW needs only one clock.
> > 
> > Have you checked to make sure that there are no users that do the lookup
> > by name?
> > 
> 
> It's just that I didn't want to mention any "driver" word in the commit description
> for a binding ;-)
> 
> (Of course I did, and the driver is not doing any by_name lookup)

It's fine to mention drivers in this case, it'd save us asking. Given
your choice of article, is the gce-mailbox not used outside of the
kernel?

> 
> > > 
> > > Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
> > > ---
> > >   .../bindings/mailbox/mediatek,gce-mailbox.yaml        | 11 -----------
> > >   1 file changed, 11 deletions(-)
> > > 
> > > diff --git a/Documentation/devicetree/bindings/mailbox/mediatek,gce-mailbox.yaml b/Documentation/devicetree/bindings/mailbox/mediatek,gce-mailbox.yaml
> > > index cef9d7601398..ff5d010fbcf0 100644
> > > --- a/Documentation/devicetree/bindings/mailbox/mediatek,gce-mailbox.yaml
> > > +++ b/Documentation/devicetree/bindings/mailbox/mediatek,gce-mailbox.yaml
> > > @@ -56,17 +56,6 @@ required:
> > >     - interrupts
> > >     - clocks
> > > -allOf:
> > > -  - if:
> > > -      not:
> > > -        properties:
> > > -          compatible:
> > > -            contains:
> > > -              const: mediatek,mt8195-gce
> > > -    then:
> > > -      required:
> > > -        - clock-names
> > > -
> > >   additionalProperties: false
> > >   examples:
> > > -- 
> > > 2.46.0
> > > 
> 
> 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 228 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-mediatek/attachments/20240912/bce4095a/attachment.sig>

From tangbin at cmss.chinamobile.com  Thu Sep 12 01:41:10 2024
From: tangbin at cmss.chinamobile.com (Tang Bin)
Date: Thu, 12 Sep 2024 16:41:10 +0800
Subject: [PATCH v2] ASoC: mediatek: mt7986-afe-pcm: Remove redundant error message
Message-ID: <20240912084110.1854-1-tangbin@cmss.chinamobile.com>

In the function mt7986_afe_pcm_dev_probe, when get irq
failed, the function platform_get_irq() logs an error
message, so remove redundant one here.

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
Signed-off-by: Tang Bin <tangbin at cmss.chinamobile.com>
---
Changes from v1
- clarify the commit titie.
---
 sound/soc/mediatek/mt7986/mt7986-afe-pcm.c | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

diff --git a/sound/soc/mediatek/mt7986/mt7986-afe-pcm.c b/sound/soc/mediatek/mt7986/mt7986-afe-pcm.c
index d400bea0e..7db090414 100644
--- a/sound/soc/mediatek/mt7986/mt7986-afe-pcm.c
+++ b/sound/soc/mediatek/mt7986/mt7986-afe-pcm.c
@@ -529,10 +529,9 @@ static int mt7986_afe_pcm_dev_probe(struct platform_device *pdev)
 
 	/* request irq */
 	irq_id = platform_get_irq(pdev, 0);
-	if (irq_id < 0) {
-		ret = irq_id;
-		return dev_err_probe(dev, ret, "No irq found\n");
-	}
+	if (irq_id < 0)
+		return irq_id;
+
 	ret = devm_request_irq(dev, irq_id, mt7986_afe_irq_handler,
 			       IRQF_TRIGGER_NONE, "asys-isr", (void *)afe);
 	if (ret)
-- 
2.33.0





From dan.carpenter at linaro.org  Thu Sep 12 01:43:39 2024
From: dan.carpenter at linaro.org (Dan Carpenter)
Date: Thu, 12 Sep 2024 11:43:39 +0300
Subject: [bug report] drm/mediatek: Add mbox_free_channel in
 mtk_drm_crtc_destroy
In-Reply-To: <fd3890987a56a01be8954f3d10d6e744918c62d7.camel@mediatek.com>
References: <77b85cdc-ecfe-42c7-a3f3-a757566b6f5f@stanley.mountain>
 <fd3890987a56a01be8954f3d10d6e744918c62d7.camel@mediatek.com>
Message-ID: <b5c51c93-633f-4f6e-84f6-e409e729c7cf@stanley.mountain>

On Thu, Sep 12, 2024 at 07:56:27AM +0000, Jason-JH Lin (???) wrote:
> Hi Dan,
> 
> Thanks for the bug report.
> 
> On Wed, 2024-09-11 at 14:02 +0300, Dan Carpenter wrote:
> >  	 
> > External email : Please do not click links or open attachments until
> > you have verified the sender or the content.
> >  Hello jason-jh.lin,
> > 
> > Commit 593b655f0523 ("drm/mediatek: Add mbox_free_channel in
> > mtk_drm_crtc_destroy") from Oct 28, 2021 (linux-next), leads to the
> > following Smatch static checker warning:
> > 
> 
> It's actaully caused by this Commit d7c66b5fbc70 ("drm/mediatek: Use
> cmdq_pkt_create() and cmdq_pkt_destroy()").
> 
> > drivers/gpu/drm/mediatek/mtk_crtc.c:132 mtk_crtc_destroy()
> > warn: variable dereferenced before check 'mtk_crtc->cmdq_client.chan' 
> > (see line 130)
> > 
> > drivers/gpu/drm/mediatek/mtk_crtc.c
> >     123 static void mtk_crtc_destroy(struct drm_crtc *crtc)
> >     124 {
> >     125         struct mtk_crtc *mtk_crtc = to_mtk_crtc(crtc);
> >     126         int i;
> >     127 
> >     128         mtk_mutex_put(mtk_crtc->mutex);
> >     129 #if IS_REACHABLE(CONFIG_MTK_CMDQ)
> >     130         cmdq_pkt_destroy(&mtk_crtc->cmdq_client, &mtk_crtc-
> > >cmdq_handle);
> >                                  ^^^^^^^^^^^^^^^^^^^^^^
> > Dereferenced without checking.  We recently refactored these so the
> > dereference
> > is detectable by static analysis.
> 
> cmdq_client is a static variable in struct mtk_crtc, it's not a
> pointer. Do we really need to check this?
> 

Sorry, the bug report was a bit unclear.  The issue is
"mtk_crtc->cmdq_client.chan", not "cmdq_client".  I've done this analysis now,
and we do need to check for NULL.  I'll send a patch.

regards,
dan carpenter



From dan.carpenter at linaro.org  Thu Sep 12 01:44:59 2024
From: dan.carpenter at linaro.org (Dan Carpenter)
Date: Thu, 12 Sep 2024 11:44:59 +0300
Subject: [PATCH] drm/mediatek: Fix potential NULL dereference in
 mtk_crtc_destroy()
Message-ID: <cc537bd6-837f-4c85-a37b-1a007e268310@stanley.mountain>

In mtk_crtc_create(), if the call to mbox_request_channel() fails then we
set the "mtk_crtc->cmdq_client.chan" pointer to NULL.  In that situation,
we do not call cmdq_pkt_create().

During the cleanup, we need to check if the "mtk_crtc->cmdq_client.chan"
is NULL first before calling cmdq_pkt_destroy().  Calling
cmdq_pkt_destroy() is unnecessary if we didn't call cmdq_pkt_create() and
it will result in a NULL pointer dereference.

Fixes: 7627122fd1c0 ("drm/mediatek: Add cmdq_handle in mtk_crtc")
Signed-off-by: Dan Carpenter <dan.carpenter at linaro.org>
---
 drivers/gpu/drm/mediatek/mtk_crtc.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/mediatek/mtk_crtc.c b/drivers/gpu/drm/mediatek/mtk_crtc.c
index 175b00e5a253..c15013792583 100644
--- a/drivers/gpu/drm/mediatek/mtk_crtc.c
+++ b/drivers/gpu/drm/mediatek/mtk_crtc.c
@@ -127,9 +127,8 @@ static void mtk_crtc_destroy(struct drm_crtc *crtc)
 
 	mtk_mutex_put(mtk_crtc->mutex);
 #if IS_REACHABLE(CONFIG_MTK_CMDQ)
-	cmdq_pkt_destroy(&mtk_crtc->cmdq_client, &mtk_crtc->cmdq_handle);
-
 	if (mtk_crtc->cmdq_client.chan) {
+		cmdq_pkt_destroy(&mtk_crtc->cmdq_client, &mtk_crtc->cmdq_handle);
 		mbox_free_channel(mtk_crtc->cmdq_client.chan);
 		mtk_crtc->cmdq_client.chan = NULL;
 	}
-- 
2.45.2



From angelogioacchino.delregno at collabora.com  Thu Sep 12 01:52:38 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Thu, 12 Sep 2024 08:52:38 +0000
Subject: [PATCH v2 2/5] dt-bindings: mfd: mediatek,mt6357: Describe
 Auxiliary ADC subdev
In-Reply-To: <20240604123008.327424-3-angelogioacchino.delregno@collabora.com>
References: <20240604123008.327424-1-angelogioacchino.delregno@collabora.com>
 <20240604123008.327424-3-angelogioacchino.delregno@collabora.com>
Message-ID: <01020191e56f3f66-1afb592c-a676-4871-b75a-bc38d896ae03-000000@eu-west-1.amazonses.com>

Il 04/06/24 14:30, AngeloGioacchino Del Regno ha scritto:
> Describe the PMIC-integrated Auxiliary Analog to Digital Converter
> subdevice node.
> Full description is available in the mediatek,mt6359-auxadc.yaml
> binding relative to that hardware.
> 

Hello,

I just realized (indeed too late) that while all of the other commits of this
series are upstream, this patch was not picked, causing dts validation warnings.

Should I resend or can you just simply pick it?

Cheers,
Angelo

> Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
> ---
>   .../devicetree/bindings/mfd/mediatek,mt6357.yaml       | 10 ++++++++++
>   1 file changed, 10 insertions(+)
> 
> diff --git a/Documentation/devicetree/bindings/mfd/mediatek,mt6357.yaml b/Documentation/devicetree/bindings/mfd/mediatek,mt6357.yaml
> index 37423c2e0fdf..e3513cad25f6 100644
> --- a/Documentation/devicetree/bindings/mfd/mediatek,mt6357.yaml
> +++ b/Documentation/devicetree/bindings/mfd/mediatek,mt6357.yaml
> @@ -37,6 +37,11 @@ properties:
>     "#interrupt-cells":
>       const: 2
>   
> +  adc:
> +    type: object
> +    $ref: /schemas/iio/adc/mediatek,mt6359-auxadc.yaml
> +    unevaluatedProperties: false
> +
>     regulators:
>       type: object
>       $ref: /schemas/regulator/mediatek,mt6357-regulator.yaml
> @@ -83,6 +88,11 @@ examples:
>               interrupt-controller;
>               #interrupt-cells = <2>;
>   
> +            pmic_adc: adc {
> +                    compatible = "mediatek,mt6357-auxadc";
> +                    #io-channel-cells = <1>;
> +            };
> +
>               regulators {
>                   mt6357_vproc_reg: buck-vproc {
>                       regulator-name = "vproc";



From angelogioacchino.delregno at collabora.com  Thu Sep 12 02:05:09 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Thu, 12 Sep 2024 09:05:09 +0000
Subject: [PATCH] drm/mediatek: Fix potential NULL dereference in
 mtk_crtc_destroy()
In-Reply-To: <cc537bd6-837f-4c85-a37b-1a007e268310@stanley.mountain>
References: <cc537bd6-837f-4c85-a37b-1a007e268310@stanley.mountain>
Message-ID: <01020191e57ab41a-424e6c2f-08fb-43db-b45a-af4aaa22ef0b-000000@eu-west-1.amazonses.com>

Il 12/09/24 10:44, Dan Carpenter ha scritto:
> In mtk_crtc_create(), if the call to mbox_request_channel() fails then we
> set the "mtk_crtc->cmdq_client.chan" pointer to NULL.  In that situation,
> we do not call cmdq_pkt_create().
> 
> During the cleanup, we need to check if the "mtk_crtc->cmdq_client.chan"
> is NULL first before calling cmdq_pkt_destroy().  Calling
> cmdq_pkt_destroy() is unnecessary if we didn't call cmdq_pkt_create() and
> it will result in a NULL pointer dereference.
> 
> Fixes: 7627122fd1c0 ("drm/mediatek: Add cmdq_handle in mtk_crtc")
> Signed-off-by: Dan Carpenter <dan.carpenter at linaro.org>

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>




From Jason-JH.Lin at mediatek.com  Thu Sep 12 02:59:24 2024
From: Jason-JH.Lin at mediatek.com (=?utf-8?B?SmFzb24tSkggTGluICjmnpfnnb/npaUp?=)
Date: Thu, 12 Sep 2024 09:59:24 +0000
Subject: [bug report] drm/mediatek: Add mbox_free_channel in
 mtk_drm_crtc_destroy
In-Reply-To: <b5c51c93-633f-4f6e-84f6-e409e729c7cf@stanley.mountain>
References: <77b85cdc-ecfe-42c7-a3f3-a757566b6f5f@stanley.mountain>
	 <fd3890987a56a01be8954f3d10d6e744918c62d7.camel@mediatek.com>
	 <b5c51c93-633f-4f6e-84f6-e409e729c7cf@stanley.mountain>
Message-ID: <eb8fe5555779fc5b23cb95636bf6befa75a67581.camel@mediatek.com>

On Thu, 2024-09-12 at 11:43 +0300, Dan Carpenter wrote:
>  	 
> External email : Please do not click links or open attachments until
> you have verified the sender or the content.
>  On Thu, Sep 12, 2024 at 07:56:27AM +0000, Jason-JH Lin (???) wrote:
> > Hi Dan,
> > 
> > Thanks for the bug report.
> > 
> > On Wed, 2024-09-11 at 14:02 +0300, Dan Carpenter wrote:
> > >   
> > > External email : Please do not click links or open attachments
> until
> > > you have verified the sender or the content.
> > >  Hello jason-jh.lin,
> > > 
> > > Commit 593b655f0523 ("drm/mediatek: Add mbox_free_channel in
> > > mtk_drm_crtc_destroy") from Oct 28, 2021 (linux-next), leads to
> the
> > > following Smatch static checker warning:
> > > 
> > 
> > It's actaully caused by this Commit d7c66b5fbc70 ("drm/mediatek:
> Use
> > cmdq_pkt_create() and cmdq_pkt_destroy()").
> > 
> > > drivers/gpu/drm/mediatek/mtk_crtc.c:132 mtk_crtc_destroy()
> > > warn: variable dereferenced before check 'mtk_crtc-
> >cmdq_client.chan' 
> > > (see line 130)
> > > 
> > > drivers/gpu/drm/mediatek/mtk_crtc.c
> > >     123 static void mtk_crtc_destroy(struct drm_crtc *crtc)
> > >     124 {
> > >     125         struct mtk_crtc *mtk_crtc = to_mtk_crtc(crtc);
> > >     126         int i;
> > >     127 
> > >     128         mtk_mutex_put(mtk_crtc->mutex);
> > >     129 #if IS_REACHABLE(CONFIG_MTK_CMDQ)
> > >     130         cmdq_pkt_destroy(&mtk_crtc->cmdq_client,
> &mtk_crtc-
> > > >cmdq_handle);
> > >                                  ^^^^^^^^^^^^^^^^^^^^^^
> > > Dereferenced without checking.  We recently refactored these so
> the
> > > dereference
> > > is detectable by static analysis.
> > 
> > cmdq_client is a static variable in struct mtk_crtc, it's not a
> > pointer. Do we really need to check this?
> > 
> 
> Sorry, the bug report was a bit unclear.  The issue is
> "mtk_crtc->cmdq_client.chan", not "cmdq_client".  I've done this
> analysis now,
> and we do need to check for NULL.  I'll send a patch.
> 

Got it. Thanks a lot!

Regards,
Jason-JH.Lin

> regards,
> dan carpenter
> 

From pablo.sun at mediatek.com  Thu Sep 12 04:38:10 2024
From: pablo.sun at mediatek.com (Pablo Sun)
Date: Thu, 12 Sep 2024 19:38:10 +0800
Subject: [PATCH] arm64: dts: mediatek: mt8395-genio-1200-evk: Enable GPU
In-Reply-To: <01020191e5383829-7eb375ea-ee17-419e-b173-30df46f61863-000000@eu-west-1.amazonses.com>
References: <20240910143245.5282-1-pablo.sun@mediatek.com>
 <01020191e04d4237-204596e1-6cc1-491c-a60f-de3917af7d42-000000@eu-west-1.amazonses.com>
 <2fd45240-a341-806b-f336-78d0595a8031@mediatek.com>
 <01020191e5383829-7eb375ea-ee17-419e-b173-30df46f61863-000000@eu-west-1.amazonses.com>
Message-ID: <30184391-12a6-c095-7862-35c7677b0ede@mediatek.com>

Hi Angelo,

On 9/12/24 15:52, AngeloGioacchino Del Regno wrote:
[snip]
>>
> 
> The range should match the target device's Vin constraints; in this 
> case, it
> should be no lower than the minimum working voltage of the Vgpu-in of 
> the Mali IP.
> 
> The drivers will be responsible of setting the lowest possible voltage for
> enhanced efficiency (power saving), taking into account the fused chip 
> quality bits
> (in this case, the MediaTek SVS driver!).
> 
> You should, at this point, check the constraints of SVS, as in, given a 
> reference
> voltage (in this case, located in the GPU OPP table, the voltage 
> associated with
> the lowest frequency of the GPU), what is the maximum voltage 
> *subtraction* that
> SVS will do on the VGPU?
> 
> After the subtraction, may this voltage be lower than 0.546V? :-)

Thanks for the clear explanation. While there are no explicit constraint 
in the maximum voltage subtraction in the SVS driver, I have
confirmed that the fuse data of MT8395 is written in a way that the SVS
driver would never go lower than the minimum recommended operating
voltage of DVDD_GPU in the datasheet[1], which supplies power to the 
Mali IP.

I have sent patch v2 to remove the always-on property and add a note
about the fuse(eFuse) data in [2].


[1]: 
https://mediatek-marketing.files.svdcdn.com/production/documents/MTK_MT8395_Application-Processor-Datasheet_v1.8.pdf?dm=1724252510
[2]: https://lkml.org/lkml/2024/9/12/285

Many thanks,
Pablo


From angelogioacchino.delregno at collabora.com  Thu Sep 12 05:11:08 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Thu, 12 Sep 2024 12:11:08 +0000
Subject: [PATCH v2] arm64: dts: mediatek: mt8395-genio-1200-evk: Enable
 GPU
In-Reply-To: <20240912070624.25540-1-pablo.sun@mediatek.com>
References: <20240912070624.25540-1-pablo.sun@mediatek.com>
Message-ID: <01020191e624f788-d1ad3271-81ef-47ec-931a-e638927114a0-000000@eu-west-1.amazonses.com>

Il 12/09/24 09:06, Pablo Sun ha scritto:
> Enable the Mali Valhall GPU on Genio 1200 EVK by providing regulator
> supply settingsi to gpu and mfg1, and enable the GPU node.
> 
> In addition, set the GPU related regulator voltage range:
> 
> 1. Set the recommended input voltage range of DVDD_GPU to (0.546V-0.787V),
>     based on Table 5-3 of MT8395 Application Processor Datasheet.
>     The regulator mt6315_7_vbuck1("Vgpu") connects to the DVDD_GPU input.
>     Note that the minimum voltage in SoC eFuse data, which is read by
>     MTK-SVS to adjust the regulator voltage, does not go below
>     the recommended operating voltage in the datasheet.
> 
> 2. Set the input voltage of DVDD_SRAM_GPU, supplied by
>     mt6359_vsram_others_ldo_reg, to 0.75V, the recommended typical
>     operating voltage in MT8395 Application Processor Datasheet.
> 
> This patch is tested by enabling CONFIG_DRM_PANFROST and
> on Genio 1200 EVK it probed with following dmesg:
> 
> ```
> panfrost 13000000.gpu: clock rate = 700000092
> panfrost 13000000.gpu: mali-g57 id 0x9093 major 0x0 minor 0x1 status 0x0
> panfrost 13000000.gpu: features: 00000000,000019f7,
> 					   issues: 00000001,80000400
> panfrost 13000000.gpu: Features: L2:0x07120206 Shader:0x00000000
> 					   Tiler:0x00000809 Mem:0x301
> 					   MMU:0x00002830 AS:0xff JS:0x7
> panfrost 13000000.gpu: shader_present=0x50045 l2_present=0x1
> [drm] Initialized panfrost 1.2.0 for 13000000.gpu on minor 0
> ```
> 
> Signed-off-by: Pablo Sun <pablo.sun at mediatek.com>

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>




From amergnat at baylibre.com  Thu Sep 12 05:21:03 2024
From: amergnat at baylibre.com (Alexandre Mergnat)
Date: Thu, 12 Sep 2024 14:21:03 +0200
Subject: [PATCH v2] ASoc: mediatek: mt8365: Remove unneeded assignment
In-Reply-To: <20240911123629.125686-1-usama.anjum@collabora.com>
References: <20240911123629.125686-1-usama.anjum@collabora.com>
Message-ID: <88927a41-a49d-4560-ba73-f01d0c1601e8@baylibre.com>

Reviewed-by: Alexandre Mergnat <amergnat at baylibre.com>

On 11/09/2024 14:36, Muhammad Usama Anjum wrote:
> The ret is being assigned, but not being used. Remove the assignment.
> One of the reviewer mentioned that dev_warn should be replaced with
> dev_info. Make this change as well.
> 
> Fixes: 1bf6dbd75f76 ("ASoc: mediatek: mt8365: Add a specific soundcard for EVK")
> Signed-off-by: Muhammad Usama Anjum <usama.anjum at collabora.com>

-- 
Regards,
Alexandre


From linyunsheng at huawei.com  Thu Sep 12 05:45:11 2024
From: linyunsheng at huawei.com (Yunsheng Lin)
Date: Thu, 12 Sep 2024 20:45:11 +0800
Subject: [RFC 0/2] fix two bugs related to page_pool
Message-ID: <20240912124514.2329991-1-linyunsheng@huawei.com>

Patch 1 fix a possible time window problem for pagw_pool.
Patch 2 fix the kernel crash problem at iommu_get_dma_domain
reported in [1].

1. https://lore.kernel.org/lkml/8067f204-1380-4d37-8ffd-007fc6f26738 at kernel.org/T/

CC: Alexander Lobakin <aleksander.lobakin at intel.com>
CC: Robin Murphy <robin.murphy at arm.com>
CC: Alexander Duyck <alexander.duyck at gmail.com>
CC: IOMMU <iommu at lists.linux.dev>

Yunsheng Lin (2):
  page_pool: fix timing for checking and disabling napi_local
  page_pool: fix IOMMU crash when driver has already unbound

 drivers/net/ethernet/freescale/fec_main.c     |   8 +-
 drivers/net/ethernet/intel/iavf/iavf_txrx.c   |   6 +-
 drivers/net/ethernet/intel/idpf/idpf_txrx.c   |  14 +-
 drivers/net/ethernet/intel/libeth/rx.c        |   2 +-
 .../net/ethernet/mellanox/mlx5/core/en/xdp.c  |   3 +-
 drivers/net/netdevsim/netdev.c                |   6 +-
 drivers/net/wireless/mediatek/mt76/mt76.h     |   2 +-
 include/linux/mm_types.h                      |   2 +-
 include/linux/skbuff.h                        |   1 +
 include/net/libeth/rx.h                       |   3 +-
 include/net/netmem.h                          |   2 +-
 include/net/page_pool/helpers.h               |  11 ++
 include/net/page_pool/types.h                 |  15 +-
 net/core/devmem.c                             |   2 +-
 net/core/page_pool.c                          | 176 +++++++++++++++---
 net/core/page_pool_priv.h                     |   9 +-
 net/core/skbuff.c                             |   3 +-
 net/core/xdp.c                                |   3 +-
 18 files changed, 219 insertions(+), 49 deletions(-)

-- 
2.33.0



From linyunsheng at huawei.com  Thu Sep 12 05:45:13 2024
From: linyunsheng at huawei.com (Yunsheng Lin)
Date: Thu, 12 Sep 2024 20:45:13 +0800
Subject: [RFC 2/2] page_pool: fix IOMMU crash when driver has already unbound
In-Reply-To: <20240912124514.2329991-1-linyunsheng@huawei.com>
References: <20240912124514.2329991-1-linyunsheng@huawei.com>
Message-ID: <20240912124514.2329991-3-linyunsheng@huawei.com>

Networking driver with page_pool support may hand over page
still with dma mapping to network stack and try to reuse that
page after network stack is done with it and passes it back
to page_pool to avoid the penalty of dma mapping/unmapping.
With all the caching in the network stack, some pages may be
held in the network stack without returning to the page_pool
soon enough, and with VF disable causing the driver unbound,
the page_pool does not stop the driver from doing it's
unbounding work, instead page_pool uses workqueue to check
if there is some pages coming back from the network stack
periodically, if there is any, it will do the dma unmmapping
related cleanup work.

As mentioned in [1], attempting DMA unmaps after the driver
has already unbound may leak resources or at worst corrupt
memory. Fundamentally, the page pool code cannot allow DMA
mappings to outlive the driver they belong to.

Currently it seems there are at least two cases that the page
is not released fast enough causing dma unmmapping done after
driver has already unbound:
1. ipv4 packet defragmentation timeout: this seems to cause
   delay up to 30 secs:

2. skb_defer_free_flush(): this may cause infinite delay if
   there is no triggering for net_rx_action().

In order not to do the dma unmmapping after driver has already
unbound and stall the unloading of the networking driver, add
the pool->items array to record all the pages including the ones
which are handed over to network stack, so the page_pool can
do the dma unmmapping for those pages when page_pool_destroy()
is called.

Note, the devmem patchset seems to make the bug harder to fix
and to backport too, this patch does not consider fixing the
case for devmem yet.

1. https://lore.kernel.org/lkml/8067f204-1380-4d37-8ffd-007fc6f26738 at kernel.org/T/

Signed-off-by: Yunsheng Lin <linyunsheng at huawei.com>
CC: Robin Murphy <robin.murphy at arm.com>
CC: Alexander Duyck <alexander.duyck at gmail.com>
CC: IOMMU <iommu at lists.linux.dev>
---
 drivers/net/ethernet/freescale/fec_main.c     |   8 +-
 drivers/net/ethernet/intel/iavf/iavf_txrx.c   |   6 +-
 drivers/net/ethernet/intel/idpf/idpf_txrx.c   |  14 +-
 drivers/net/ethernet/intel/libeth/rx.c        |   2 +-
 .../net/ethernet/mellanox/mlx5/core/en/xdp.c  |   3 +-
 drivers/net/netdevsim/netdev.c                |   6 +-
 drivers/net/wireless/mediatek/mt76/mt76.h     |   2 +-
 include/linux/mm_types.h                      |   2 +-
 include/linux/skbuff.h                        |   1 +
 include/net/libeth/rx.h                       |   3 +-
 include/net/netmem.h                          |   2 +-
 include/net/page_pool/helpers.h               |  11 ++
 include/net/page_pool/types.h                 |  15 +-
 net/core/devmem.c                             |   2 +-
 net/core/page_pool.c                          | 159 +++++++++++++++---
 net/core/page_pool_priv.h                     |   9 +-
 net/core/skbuff.c                             |   3 +-
 net/core/xdp.c                                |   3 +-
 18 files changed, 202 insertions(+), 49 deletions(-)

diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c
index acbb627d51bf..c00f8c460759 100644
--- a/drivers/net/ethernet/freescale/fec_main.c
+++ b/drivers/net/ethernet/freescale/fec_main.c
@@ -1009,7 +1009,8 @@ static void fec_enet_bd_init(struct net_device *dev)
 				struct page *page = txq->tx_buf[i].buf_p;
 
 				if (page)
-					page_pool_put_page(page->pp, page, 0, false);
+					page_pool_put_page(page_pool_to_pp(page),
+							   page, 0, false);
 			}
 
 			txq->tx_buf[i].buf_p = NULL;
@@ -1538,7 +1539,7 @@ fec_enet_tx_queue(struct net_device *ndev, u16 queue_id, int budget)
 			xdp_return_frame_rx_napi(xdpf);
 		} else { /* recycle pages of XDP_TX frames */
 			/* The dma_sync_size = 0 as XDP_TX has already synced DMA for_device */
-			page_pool_put_page(page->pp, page, 0, true);
+			page_pool_put_page(page_pool_to_pp(page), page, 0, true);
 		}
 
 		txq->tx_buf[index].buf_p = NULL;
@@ -3300,7 +3301,8 @@ static void fec_enet_free_buffers(struct net_device *ndev)
 			} else {
 				struct page *page = txq->tx_buf[i].buf_p;
 
-				page_pool_put_page(page->pp, page, 0, false);
+				page_pool_put_page(page_pool_to_pp(page),
+						   page, 0, false);
 			}
 
 			txq->tx_buf[i].buf_p = NULL;
diff --git a/drivers/net/ethernet/intel/iavf/iavf_txrx.c b/drivers/net/ethernet/intel/iavf/iavf_txrx.c
index 26b424fd6718..658d8f9a6abb 100644
--- a/drivers/net/ethernet/intel/iavf/iavf_txrx.c
+++ b/drivers/net/ethernet/intel/iavf/iavf_txrx.c
@@ -1050,7 +1050,8 @@ static void iavf_add_rx_frag(struct sk_buff *skb,
 			     const struct libeth_fqe *rx_buffer,
 			     unsigned int size)
 {
-	u32 hr = rx_buffer->page->pp->p.offset;
+	struct page_pool *pool = page_pool_to_pp(rx_buffer->page);
+	u32 hr = pool->p.offset;
 
 	skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags, rx_buffer->page,
 			rx_buffer->offset + hr, size, rx_buffer->truesize);
@@ -1067,7 +1068,8 @@ static void iavf_add_rx_frag(struct sk_buff *skb,
 static struct sk_buff *iavf_build_skb(const struct libeth_fqe *rx_buffer,
 				      unsigned int size)
 {
-	u32 hr = rx_buffer->page->pp->p.offset;
+	struct page_pool *pool = page_pool_to_pp(rx_buffer->page);
+	u32 hr = pool->p.offset;
 	struct sk_buff *skb;
 	void *va;
 
diff --git a/drivers/net/ethernet/intel/idpf/idpf_txrx.c b/drivers/net/ethernet/intel/idpf/idpf_txrx.c
index d4e6f0e10487..1a4d83b8fda7 100644
--- a/drivers/net/ethernet/intel/idpf/idpf_txrx.c
+++ b/drivers/net/ethernet/intel/idpf/idpf_txrx.c
@@ -385,7 +385,8 @@ static void idpf_rx_page_rel(struct libeth_fqe *rx_buf)
 	if (unlikely(!rx_buf->page))
 		return;
 
-	page_pool_put_full_page(rx_buf->page->pp, rx_buf->page, false);
+	page_pool_put_full_page(page_pool_to_pp(rx_buf->page), rx_buf->page,
+				false);
 
 	rx_buf->page = NULL;
 	rx_buf->offset = 0;
@@ -3097,7 +3098,8 @@ idpf_rx_process_skb_fields(struct idpf_rx_queue *rxq, struct sk_buff *skb,
 void idpf_rx_add_frag(struct idpf_rx_buf *rx_buf, struct sk_buff *skb,
 		      unsigned int size)
 {
-	u32 hr = rx_buf->page->pp->p.offset;
+	struct page_pool *pool = page_pool_to_pp(rx_buffer->page);
+	u32 hr = pool->p.offset;
 
 	skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags, rx_buf->page,
 			rx_buf->offset + hr, size, rx_buf->truesize);
@@ -3129,8 +3131,10 @@ static u32 idpf_rx_hsplit_wa(const struct libeth_fqe *hdr,
 	if (!libeth_rx_sync_for_cpu(buf, copy))
 		return 0;
 
-	dst = page_address(hdr->page) + hdr->offset + hdr->page->pp->p.offset;
-	src = page_address(buf->page) + buf->offset + buf->page->pp->p.offset;
+	dst = page_address(hdr->page) + hdr->offset +
+		page_pool_to_pp(hdr->page)->p.offset;
+	src = page_address(buf->page) + buf->offset +
+		page_pool_to_pp(buf->page)->p.offset;
 	memcpy(dst, src, LARGEST_ALIGN(copy));
 
 	buf->offset += copy;
@@ -3148,7 +3152,7 @@ static u32 idpf_rx_hsplit_wa(const struct libeth_fqe *hdr,
  */
 struct sk_buff *idpf_rx_build_skb(const struct libeth_fqe *buf, u32 size)
 {
-	u32 hr = buf->page->pp->p.offset;
+	u32 hr = page_pool_to_pp(buf->page)->p.offset;
 	struct sk_buff *skb;
 	void *va;
 
diff --git a/drivers/net/ethernet/intel/libeth/rx.c b/drivers/net/ethernet/intel/libeth/rx.c
index f20926669318..385afca0e61d 100644
--- a/drivers/net/ethernet/intel/libeth/rx.c
+++ b/drivers/net/ethernet/intel/libeth/rx.c
@@ -207,7 +207,7 @@ EXPORT_SYMBOL_NS_GPL(libeth_rx_fq_destroy, LIBETH);
  */
 void libeth_rx_recycle_slow(struct page *page)
 {
-	page_pool_recycle_direct(page->pp, page);
+	page_pool_recycle_direct(page_pool_to_pp(page), page);
 }
 EXPORT_SYMBOL_NS_GPL(libeth_rx_recycle_slow, LIBETH);
 
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c b/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c
index 4610621a340e..83511a45a6dc 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c
@@ -716,7 +716,8 @@ static void mlx5e_free_xdpsq_desc(struct mlx5e_xdpsq *sq,
 				/* No need to check ((page->pp_magic & ~0x3UL) == PP_SIGNATURE)
 				 * as we know this is a page_pool page.
 				 */
-				page_pool_recycle_direct(page->pp, page);
+				page_pool_recycle_direct(page_pool_to_pp(page),
+							 page);
 			} while (++n < num);
 
 			break;
diff --git a/drivers/net/netdevsim/netdev.c b/drivers/net/netdevsim/netdev.c
index 017a6102be0a..9bfa593cd5dd 100644
--- a/drivers/net/netdevsim/netdev.c
+++ b/drivers/net/netdevsim/netdev.c
@@ -593,7 +593,8 @@ nsim_pp_hold_write(struct file *file, const char __user *data,
 		if (!ns->page)
 			ret = -ENOMEM;
 	} else {
-		page_pool_put_full_page(ns->page->pp, ns->page, false);
+		page_pool_put_full_page(page_pool_to_pp(ns->page), ns->page,
+					false);
 		ns->page = NULL;
 	}
 	rtnl_unlock();
@@ -788,7 +789,8 @@ void nsim_destroy(struct netdevsim *ns)
 
 	/* Put this intentionally late to exercise the orphaning path */
 	if (ns->page) {
-		page_pool_put_full_page(ns->page->pp, ns->page, false);
+		page_pool_put_full_page(page_pool_to_pp(ns->page), ns->page,
+					false);
 		ns->page = NULL;
 	}
 
diff --git a/drivers/net/wireless/mediatek/mt76/mt76.h b/drivers/net/wireless/mediatek/mt76/mt76.h
index 0b75a45ad2e8..94a277290909 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76.h
+++ b/drivers/net/wireless/mediatek/mt76/mt76.h
@@ -1688,7 +1688,7 @@ static inline void mt76_put_page_pool_buf(void *buf, bool allow_direct)
 {
 	struct page *page = virt_to_head_page(buf);
 
-	page_pool_put_full_page(page->pp, page, allow_direct);
+	page_pool_put_full_page(page_pool_to_pp(page), page, allow_direct);
 }
 
 static inline void *
diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h
index 485424979254..410187133d27 100644
--- a/include/linux/mm_types.h
+++ b/include/linux/mm_types.h
@@ -120,7 +120,7 @@ struct page {
 			 * page_pool allocated pages.
 			 */
 			unsigned long pp_magic;
-			struct page_pool *pp;
+			struct page_pool_item *pp_item;
 			unsigned long _pp_mapping_pad;
 			unsigned long dma_addr;
 			atomic_long_t pp_ref_count;
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
index 39f1d16f3628..64d1ecb7a7fc 100644
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
@@ -38,6 +38,7 @@
 #include <net/net_debug.h>
 #include <net/dropreason-core.h>
 #include <net/netmem.h>
+#include <net/page_pool/types.h>
 
 /**
  * DOC: skb checksums
diff --git a/include/net/libeth/rx.h b/include/net/libeth/rx.h
index 43574bd6612f..beee7ddd77a5 100644
--- a/include/net/libeth/rx.h
+++ b/include/net/libeth/rx.h
@@ -137,7 +137,8 @@ static inline bool libeth_rx_sync_for_cpu(const struct libeth_fqe *fqe,
 		return false;
 	}
 
-	page_pool_dma_sync_for_cpu(page->pp, page, fqe->offset, len);
+	page_pool_dma_sync_for_cpu(page_pool_to_pp(page), page, fqe->offset,
+				   len);
 
 	return true;
 }
diff --git a/include/net/netmem.h b/include/net/netmem.h
index 8a6e20be4b9d..9bd2db627dbb 100644
--- a/include/net/netmem.h
+++ b/include/net/netmem.h
@@ -49,7 +49,7 @@ struct net_iov {
 	static_assert(offsetof(struct page, pg) == \
 		      offsetof(struct net_iov, iov))
 NET_IOV_ASSERT_OFFSET(pp_magic, pp_magic);
-NET_IOV_ASSERT_OFFSET(pp, pp);
+NET_IOV_ASSERT_OFFSET(pp_item, pp);
 NET_IOV_ASSERT_OFFSET(dma_addr, dma_addr);
 NET_IOV_ASSERT_OFFSET(pp_ref_count, pp_ref_count);
 #undef NET_IOV_ASSERT_OFFSET
diff --git a/include/net/page_pool/helpers.h b/include/net/page_pool/helpers.h
index 793e6fd78bc5..ed068b3cee3b 100644
--- a/include/net/page_pool/helpers.h
+++ b/include/net/page_pool/helpers.h
@@ -83,6 +83,17 @@ static inline u64 *page_pool_ethtool_stats_get(u64 *data, const void *stats)
 }
 #endif
 
+static inline struct page_pool *page_pool_to_pp(struct page *page)
+{
+	struct page_pool_item *item = page->pp_item;
+	struct page_pool *pool;
+
+	item -= item->pp_idx;
+	pool = (struct page_pool *)item;
+
+	return --pool;
+}
+
 /**
  * page_pool_dev_alloc_pages() - allocate a page.
  * @pool:	pool from which to allocate
diff --git a/include/net/page_pool/types.h b/include/net/page_pool/types.h
index c022c410abe3..a5ed747f6c38 100644
--- a/include/net/page_pool/types.h
+++ b/include/net/page_pool/types.h
@@ -142,6 +142,11 @@ struct page_pool_stats {
 };
 #endif
 
+struct page_pool_item {
+	struct page *pp_pg;
+	unsigned int pp_idx;
+};
+
 /* The whole frag API block must stay within one cacheline. On 32-bit systems,
  * sizeof(long) == sizeof(int), so that the block size is ``3 * sizeof(long)``.
  * On 64-bit systems, the actual size is ``2 * sizeof(long) + sizeof(int)``.
@@ -161,6 +166,8 @@ struct page_pool {
 
 	int cpuid;
 	u32 pages_state_hold_cnt;
+	unsigned int item_mask;
+	unsigned int item_idx;
 
 	bool has_init_callback:1;	/* slow::init_callback is set */
 	bool dma_map:1;			/* Perform DMA mapping */
@@ -228,7 +235,11 @@ struct page_pool {
 	 */
 	refcount_t user_cnt;
 
-	u64 destroy_cnt;
+	/* Lock to avoid doing dma unmapping concurrently when
+	 * destroy_cnt > 0.
+	 */
+	spinlock_t destroy_lock;
+	unsigned int destroy_cnt;
 
 	/* Slow/Control-path information follows */
 	struct page_pool_params_slow slow;
@@ -239,6 +250,8 @@ struct page_pool {
 		u32 napi_id;
 		u32 id;
 	} user;
+
+	struct page_pool_item items[] ____cacheline_aligned_in_smp;
 };
 
 struct page *page_pool_alloc_pages(struct page_pool *pool, gfp_t gfp);
diff --git a/net/core/devmem.c b/net/core/devmem.c
index 11b91c12ee11..3ff2e0d0d1a1 100644
--- a/net/core/devmem.c
+++ b/net/core/devmem.c
@@ -380,7 +380,7 @@ bool mp_dmabuf_devmem_release_page(struct page_pool *pool, netmem_ref netmem)
 	if (WARN_ON_ONCE(refcount != 1))
 		return false;
 
-	page_pool_clear_pp_info(netmem);
+	page_pool_clear_pp_info(pool, netmem);
 
 	net_devmem_free_dmabuf(netmem_to_net_iov(netmem));
 
diff --git a/net/core/page_pool.c b/net/core/page_pool.c
index 18645907cec2..2578f37fc1e1 100644
--- a/net/core/page_pool.c
+++ b/net/core/page_pool.c
@@ -267,14 +267,12 @@ static int page_pool_init(struct page_pool *pool,
 		return -ENOMEM;
 	}
 
+	spin_lock_init(&pool->destroy_lock);
 	atomic_set(&pool->pages_state_release_cnt, 0);
 
 	/* Driver calling page_pool_create() also call page_pool_destroy() */
 	refcount_set(&pool->user_cnt, 1);
 
-	if (pool->dma_map)
-		get_device(pool->p.dev);
-
 	if (pool->slow.flags & PP_FLAG_ALLOW_UNREADABLE_NETMEM) {
 		/* We rely on rtnl_lock()ing to make sure netdev_rx_queue
 		 * configuration doesn't change while we're initializing
@@ -312,15 +310,91 @@ static void page_pool_uninit(struct page_pool *pool)
 {
 	ptr_ring_cleanup(&pool->ring, NULL);
 
-	if (pool->dma_map)
-		put_device(pool->p.dev);
-
 #ifdef CONFIG_PAGE_POOL_STATS
 	if (!pool->system)
 		free_percpu(pool->recycle_stats);
 #endif
 }
 
+static void page_pool_item_init(struct page_pool *pool, unsigned int item_cnt)
+{
+	struct page_pool_item *items = pool->items;
+	unsigned int i;
+
+	WARN_ON_ONCE(!is_power_of_2(item_cnt));
+
+	for (i = 0; i < item_cnt; i++)
+		items[i].pp_idx = i;
+
+	pool->item_mask = item_cnt - 1;
+}
+
+static void page_pool_item_uninit(struct page_pool *pool)
+{
+	struct page_pool_item *items = pool->items;
+	unsigned int mask = pool->item_mask;
+	unsigned int i;
+
+	if (!pool->dma_map)
+		return;
+
+	spin_lock_bh(&pool->destroy_lock);
+
+	for (i = 0; i <= mask; i++) {
+		struct page *page = READ_ONCE(items[i].pp_pg);
+
+		if (!page)
+			continue;
+
+		WARN_ONCE(1, "dma unmapping in %s: %p for %p\n", __func__, page,
+			  pool);
+
+		dma_unmap_page_attrs(pool->p.dev, page_pool_get_dma_addr(page),
+				     PAGE_SIZE << pool->p.order,
+				     pool->p.dma_dir, DMA_ATTR_SKIP_CPU_SYNC |
+				     DMA_ATTR_WEAK_ORDERING);
+		page_pool_set_dma_addr(page, 0);
+	}
+
+	pool->dma_map = false;
+	spin_unlock_bh(&pool->destroy_lock);
+}
+
+static bool page_pool_item_add(struct page_pool *pool, struct page *page)
+{
+	struct page_pool_item *items = pool->items;
+	unsigned int mask = pool->item_mask;
+	unsigned int idx = pool->item_idx;
+	unsigned int i;
+
+	for (i = 0; i <= mask; i++) {
+		unsigned int mask_idx = idx++ & mask;
+
+		if (!READ_ONCE(items[mask_idx].pp_pg)) {
+			WRITE_ONCE(items[mask_idx].pp_pg, page);
+			page->pp_item = &items[mask_idx];
+			return true;
+		}
+	}
+
+	pool->item_idx = idx;
+	WARN_ONCE(1, "pool->items array is full\n");
+	return false;
+}
+
+static void page_pool_item_del(struct page_pool *pool, struct page *page)
+{
+	struct page_pool_item *item = page->pp_item;
+	struct page_pool_item *items = pool->items;
+	unsigned int idx = item->pp_idx;
+
+	WARN_ON_ONCE(items[idx].pp_pg != page);
+
+	WRITE_ONCE(items[idx].pp_pg, NULL);
+}
+
+#define PAGE_POOL_MIN_ITEM_CNT	512
+
 /**
  * page_pool_create_percpu() - create a page pool for a given cpu.
  * @params: parameters, see struct page_pool_params
@@ -329,10 +403,14 @@ static void page_pool_uninit(struct page_pool *pool)
 struct page_pool *
 page_pool_create_percpu(const struct page_pool_params *params, int cpuid)
 {
+	unsigned int item_cnt = (params->pool_size ? : 1024) +
+				PP_ALLOC_CACHE_SIZE + PAGE_POOL_MIN_ITEM_CNT;
 	struct page_pool *pool;
 	int err;
 
-	pool = kzalloc_node(sizeof(*pool), GFP_KERNEL, params->nid);
+	item_cnt = roundup_pow_of_two(item_cnt);
+	pool = kvzalloc_node(struct_size(pool, items, item_cnt), GFP_KERNEL,
+			     params->nid);
 	if (!pool)
 		return ERR_PTR(-ENOMEM);
 
@@ -340,6 +418,8 @@ page_pool_create_percpu(const struct page_pool_params *params, int cpuid)
 	if (err < 0)
 		goto err_free;
 
+	page_pool_item_init(pool, item_cnt);
+
 	err = page_pool_list(pool);
 	if (err)
 		goto err_uninit;
@@ -350,7 +430,7 @@ page_pool_create_percpu(const struct page_pool_params *params, int cpuid)
 	page_pool_uninit(pool);
 err_free:
 	pr_warn("%s() gave up with errno %d\n", __func__, err);
-	kfree(pool);
+	kvfree(pool);
 	return ERR_PTR(err);
 }
 EXPORT_SYMBOL(page_pool_create_percpu);
@@ -499,19 +579,24 @@ static struct page *__page_pool_alloc_page_order(struct page_pool *pool,
 	if (unlikely(!page))
 		return NULL;
 
-	if (pool->dma_map && unlikely(!page_pool_dma_map(pool, page_to_netmem(page)))) {
-		put_page(page);
-		return NULL;
-	}
+	if (unlikely(!page_pool_set_pp_info(pool, page_to_netmem(page))))
+		goto err_alloc;
+
+	if (pool->dma_map && unlikely(!page_pool_dma_map(pool, page_to_netmem(page))))
+		goto err_set_info;
 
 	alloc_stat_inc(pool, slow_high_order);
-	page_pool_set_pp_info(pool, page_to_netmem(page));
 
 	/* Track how many pages are held 'in-flight' */
 	pool->pages_state_hold_cnt++;
 	trace_page_pool_state_hold(pool, page_to_netmem(page),
 				   pool->pages_state_hold_cnt);
 	return page;
+err_set_info:
+	page_pool_clear_pp_info(pool, page_to_netmem(page));
+err_alloc:
+	put_page(page);
+	return NULL;
 }
 
 /* slow path */
@@ -546,12 +631,18 @@ static noinline netmem_ref __page_pool_alloc_pages_slow(struct page_pool *pool,
 	 */
 	for (i = 0; i < nr_pages; i++) {
 		netmem = pool->alloc.cache[i];
+
+		if (unlikely(!page_pool_set_pp_info(pool, netmem))) {
+			put_page(netmem_to_page(netmem));
+			continue;
+		}
+
 		if (dma_map && unlikely(!page_pool_dma_map(pool, netmem))) {
+			page_pool_clear_pp_info(pool, netmem);
 			put_page(netmem_to_page(netmem));
 			continue;
 		}
 
-		page_pool_set_pp_info(pool, netmem);
 		pool->alloc.cache[pool->alloc.count++] = netmem;
 		/* Track how many pages are held 'in-flight' */
 		pool->pages_state_hold_cnt++;
@@ -623,9 +714,14 @@ s32 page_pool_inflight(const struct page_pool *pool, bool strict)
 	return inflight;
 }
 
-void page_pool_set_pp_info(struct page_pool *pool, netmem_ref netmem)
+bool page_pool_set_pp_info(struct page_pool *pool, netmem_ref netmem)
 {
-	netmem_set_pp(netmem, pool);
+	if (unlikely(!page_pool_item_add(pool, netmem_to_page(netmem))))
+		return false;
+
+	WARN_ON_ONCE(page_pool_to_pp(netmem_to_page(netmem)) != pool);
+
+	//netmem_set_pp(netmem, pool);
 	netmem_or_pp_magic(netmem, PP_SIGNATURE);
 
 	/* Ensuring all pages have been split into one fragment initially:
@@ -637,10 +733,13 @@ void page_pool_set_pp_info(struct page_pool *pool, netmem_ref netmem)
 	page_pool_fragment_netmem(netmem, 1);
 	if (pool->has_init_callback)
 		pool->slow.init_callback(netmem, pool->slow.init_arg);
+
+	return true;
 }
 
-void page_pool_clear_pp_info(netmem_ref netmem)
+void page_pool_clear_pp_info(struct page_pool *pool, netmem_ref netmem)
 {
+	page_pool_item_del(pool, netmem_to_page(netmem));
 	netmem_clear_pp_magic(netmem);
 	netmem_set_pp(netmem, NULL);
 }
@@ -672,9 +771,13 @@ static __always_inline void __page_pool_release_page_dma(struct page_pool *pool,
  */
 void page_pool_return_page(struct page_pool *pool, netmem_ref netmem)
 {
+	unsigned int destroy_cnt = READ_ONCE(pool->destroy_cnt);
 	int count;
 	bool put;
 
+	if (unlikely(destroy_cnt))
+		spin_lock_bh(&pool->destroy_lock);
+
 	put = true;
 	if (static_branch_unlikely(&page_pool_mem_providers) && pool->mp_priv)
 		put = mp_dmabuf_devmem_release_page(pool, netmem);
@@ -688,9 +791,13 @@ void page_pool_return_page(struct page_pool *pool, netmem_ref netmem)
 	trace_page_pool_state_release(pool, netmem, count);
 
 	if (put) {
-		page_pool_clear_pp_info(netmem);
+		page_pool_clear_pp_info(pool, netmem);
 		put_page(netmem_to_page(netmem));
 	}
+
+	if (unlikely(destroy_cnt))
+		spin_unlock_bh(&pool->destroy_lock);
+
 	/* An optimization would be to call __free_pages(page, pool->p.order)
 	 * knowing page is not part of page-cache (thus avoiding a
 	 * __page_cache_release() call).
@@ -1026,14 +1133,14 @@ static void __page_pool_destroy(struct page_pool *pool)
 		static_branch_dec(&page_pool_mem_providers);
 	}
 
-	kfree(pool);
+	kvfree(pool);
 }
 
 static void page_pool_empty_alloc_cache_once(struct page_pool *pool)
 {
 	netmem_ref netmem;
 
-	if (pool->destroy_cnt)
+	if (pool->destroy_cnt > 1)
 		return;
 
 	/* Empty alloc cache, assume caller made sure this is
@@ -1049,7 +1156,7 @@ static void page_pool_empty_alloc_cache_once(struct page_pool *pool)
 static void page_pool_scrub(struct page_pool *pool)
 {
 	page_pool_empty_alloc_cache_once(pool);
-	pool->destroy_cnt++;
+	WRITE_ONCE(pool->destroy_cnt, pool->destroy_cnt + 1);
 
 	/* No more consumers should exist, but producers could still
 	 * be in-flight.
@@ -1131,10 +1238,14 @@ void page_pool_destroy(struct page_pool *pool)
 	if (!page_pool_put(pool))
 		return;
 
+	/* disable dma_sync_for_device */
+	pool->dma_sync = false;
+
 	page_pool_disable_direct_recycling(pool);
+	WRITE_ONCE(pool->destroy_cnt, 1);
 
-	/* Wait for the freeing side see the disabling direct recycling setting
-	 * to avoid the concurrent access to the pool->alloc cache.
+	/* Wait for the freeing side to see the new pool->dma_sync,
+	 * disable_direct and pool->destroy_cnt in page_pool_put_page.
 	 */
 	synchronize_rcu();
 
@@ -1143,6 +1254,8 @@ void page_pool_destroy(struct page_pool *pool)
 	if (!page_pool_release(pool))
 		return;
 
+	page_pool_item_uninit(pool);
+
 	page_pool_detached(pool);
 	pool->defer_start = jiffies;
 	pool->defer_warn  = jiffies + DEFER_WARN_INTERVAL;
diff --git a/net/core/page_pool_priv.h b/net/core/page_pool_priv.h
index 57439787b9c2..2f83caea7be7 100644
--- a/net/core/page_pool_priv.h
+++ b/net/core/page_pool_priv.h
@@ -36,16 +36,17 @@ static inline bool page_pool_set_dma_addr(struct page *page, dma_addr_t addr)
 }
 
 #if defined(CONFIG_PAGE_POOL)
-void page_pool_set_pp_info(struct page_pool *pool, netmem_ref netmem);
-void page_pool_clear_pp_info(netmem_ref netmem);
+bool page_pool_set_pp_info(struct page_pool *pool, netmem_ref netmem);
+void page_pool_clear_pp_info(struct page_pool *pool, netmem_ref netmem);
 int page_pool_check_memory_provider(struct net_device *dev,
 				    struct netdev_rx_queue *rxq);
 #else
-static inline void page_pool_set_pp_info(struct page_pool *pool,
+static inline bool page_pool_set_pp_info(struct page_pool *pool,
 					 netmem_ref netmem)
 {
 }
-static inline void page_pool_clear_pp_info(netmem_ref netmem)
+static inline void page_pool_clear_pp_info(struct page_pool *pool,
+					   netmem_ref netmem)
 {
 }
 static inline int page_pool_check_memory_provider(struct net_device *dev,
diff --git a/net/core/skbuff.c b/net/core/skbuff.c
index 74149dc4ee31..d4295353ca6e 100644
--- a/net/core/skbuff.c
+++ b/net/core/skbuff.c
@@ -1033,7 +1033,8 @@ bool napi_pp_put_page(netmem_ref netmem)
 	if (unlikely(!is_pp_netmem(netmem)))
 		return false;
 
-	page_pool_put_full_netmem(netmem_get_pp(netmem), netmem, false);
+	page_pool_put_full_netmem(page_pool_to_pp(netmem_to_page(netmem)),
+				  netmem, false);
 
 	return true;
 }
diff --git a/net/core/xdp.c b/net/core/xdp.c
index bcc5551c6424..e8582036b411 100644
--- a/net/core/xdp.c
+++ b/net/core/xdp.c
@@ -384,7 +384,8 @@ void __xdp_return(void *data, struct xdp_mem_info *mem, bool napi_direct,
 		/* No need to check ((page->pp_magic & ~0x3UL) == PP_SIGNATURE)
 		 * as mem->type knows this a page_pool page
 		 */
-		page_pool_put_full_page(page->pp, page, napi_direct);
+		page_pool_put_full_page(page_pool_to_pp(page), page,
+					napi_direct);
 		break;
 	case MEM_TYPE_PAGE_SHARED:
 		page_frag_free(data);
-- 
2.33.0



From qianqiang.liu at 163.com  Thu Sep 12 06:26:45 2024
From: qianqiang.liu at 163.com (Qianqiang Liu)
Date: Thu, 12 Sep 2024 21:26:45 +0800
Subject: Is this a out-of-bounds issue?
Message-ID: <ZuLsFWd6yg07B20y@thinkpad.>

Hi,

The code in drivers/net/wireless/mediatek/mt76/mt7925/mcu.c may have a
out-of-bounds issue:

638         for (offset = 0; offset < len; offset += le32_to_cpu(clc->len)) {
639                 clc = (const struct mt7925_clc *)(clc_base + offset);
640
641                 if (clc->idx > ARRAY_SIZE(phy->clc)) <-
642                         break;
643
644                 /* do not init buf again if chip reset triggered */
645                 if (phy->clc[clc->idx])
646                         continue;
647
648                 phy->clc[clc->idx] = devm_kmemdup(mdev->dev, clc,
649                                                   le32_to_cpu(clc->len),
650                                                   GFP_KERNEL);
651
652                 if (!phy->clc[clc->idx]) {
653                         ret = -ENOMEM;
654                         goto out;
655                 }
656         }

Let's say the array size of "phy->clc" is 2, then the valid index is 0 and 1.
If "clc->idx" is 2, "clc->idx > ARRAY_SIZE(phy->clc)" must be false, the "break"
statement won't be executed, and "phy->clc[2]" may access illegal memory address.

So, should we modify the code like this?

diff --git a/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c
index 748ea6adbc6b..0c2a2337c313 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c
@@ -638,7 +638,7 @@ static int mt7925_load_clc(struct mt792x_dev *dev, const char *fw_name)
 	for (offset = 0; offset < len; offset += le32_to_cpu(clc->len)) {
 		clc = (const struct mt7925_clc *)(clc_base + offset);
 
-		if (clc->idx > ARRAY_SIZE(phy->clc))
+		if (clc->idx >= ARRAY_SIZE(phy->clc))
 			break;
 
 		/* do not init buf again if chip reset triggered */

-- 
Best,
Qianqiang Li 



From lorenzo at kernel.org  Thu Sep 12 06:34:26 2024
From: lorenzo at kernel.org (Lorenzo Bianconi)
Date: Thu, 12 Sep 2024 15:34:26 +0200
Subject: Is this a out-of-bounds issue?
In-Reply-To: <66e2ec22.050a0220.37047b.174cSMTPIN_ADDED_BROKEN@mx.google.com>
References: <66e2ec22.050a0220.37047b.174cSMTPIN_ADDED_BROKEN@mx.google.com>
Message-ID: <ZuLt4mJIKXldo9LH@lore-desk>

> Hi,
> 
> The code in drivers/net/wireless/mediatek/mt76/mt7925/mcu.c may have a
> out-of-bounds issue:
> 
> 638         for (offset = 0; offset < len; offset += le32_to_cpu(clc->len)) {
> 639                 clc = (const struct mt7925_clc *)(clc_base + offset);
> 640
> 641                 if (clc->idx > ARRAY_SIZE(phy->clc)) <-
> 642                         break;
> 643
> 644                 /* do not init buf again if chip reset triggered */
> 645                 if (phy->clc[clc->idx])
> 646                         continue;
> 647
> 648                 phy->clc[clc->idx] = devm_kmemdup(mdev->dev, clc,
> 649                                                   le32_to_cpu(clc->len),
> 650                                                   GFP_KERNEL);
> 651
> 652                 if (!phy->clc[clc->idx]) {
> 653                         ret = -ENOMEM;
> 654                         goto out;
> 655                 }
> 656         }
> 
> Let's say the array size of "phy->clc" is 2, then the valid index is 0 and 1.
> If "clc->idx" is 2, "clc->idx > ARRAY_SIZE(phy->clc)" must be false, the "break"
> statement won't be executed, and "phy->clc[2]" may access illegal memory address.
> 
> So, should we modify the code like this?
> 
> diff --git a/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c
> index 748ea6adbc6b..0c2a2337c313 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c
> +++ b/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c
> @@ -638,7 +638,7 @@ static int mt7925_load_clc(struct mt792x_dev *dev, const char *fw_name)
>  	for (offset = 0; offset < len; offset += le32_to_cpu(clc->len)) {
>  		clc = (const struct mt7925_clc *)(clc_base + offset);
>  
> -		if (clc->idx > ARRAY_SIZE(phy->clc))
> +		if (clc->idx >= ARRAY_SIZE(phy->clc))
>  			break;
>  
>  		/* do not init buf again if chip reset triggered */
> 
> -- 
> Best,
> Qianqiang Li 
> 

Hi,

I think this is already fixed here:
https://patchwork.kernel.org/project/linux-wireless/patch/84bf5dd2-2fe3-4410-a7af-ae841e41082a at stanley.mountain/

Regards,
Lornzo
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 228 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-mediatek/attachments/20240912/691f501d/attachment.sig>

From peter.wang at mediatek.com  Thu Sep 12 06:49:12 2024
From: peter.wang at mediatek.com (=?utf-8?B?UGV0ZXIgV2FuZyAo546L5L+h5Y+LKQ==?=)
Date: Thu, 12 Sep 2024 13:49:12 +0000
Subject: [PATCH v6 2/2] ufs: core: requeue aborted request
In-Reply-To: <55d2cca5-0e30-4734-aa25-d5f5cdfbfd93@acm.org>
References: <20240911095622.19225-1-peter.wang@mediatek.com>
	 <20240911095622.19225-3-peter.wang@mediatek.com>
	 <55d2cca5-0e30-4734-aa25-d5f5cdfbfd93@acm.org>
Message-ID: <d3306f9d2b88c5b6ae8d2104041e5c941898dee5.camel@mediatek.com>

On Wed, 2024-09-11 at 12:37 -0700, Bart Van Assche wrote:
>  	 
> External email : Please do not click links or open attachments until
> you have verified the sender or the content.
>  On 9/11/24 2:56 AM, peter.wang at mediatek.com wrote:
> > ufshcd_abort_all forcibly aborts all on-going commands and the host
> > controller will automatically fill in the OCS field of the
> corresponding
> > response with OCS_ABORTED based on different working modes.
> > 
> > MCQ mode: aborts a command using SQ cleanup, The host controller
> > will post a Completion Queue entry with OCS = ABORTED.
> > 
> > SDB mode: aborts a command using UTRLCLR. Task Management response
> > which means a Transfer Request was aborted.
> 
> I think this is incorrect. The UFSHCI specification does not require
> a
> host controller to set the OCS field if a SCSI command is aborted by
> the
> ABORT TMF nor if its resources are freed by writing into the UTRLCLR
> register.
> 

Hi Bart,

I'm thinking of removing the SDB descriptive comment, so that 
it can be applicable in cases with OCS ABORTED, and it won't 
matter if there isn't OCS ABORTED because setting this flag 
won't have any effect. 
Or I add more MCQ check only set this flag in MCQ mode. 
What do you think?



> > @@ -5404,7 +5405,10 @@ ufshcd_transfer_rsp_status(struct ufs_hba
> *hba, struct ufshcd_lrb *lrbp,
> >   }
> >   break;
> >   case OCS_ABORTED:
> > -result |= DID_ABORT << 16;
> > +if (lrbp->abort_initiated_by_eh)
> > +result |= DID_REQUEUE << 16;
> > +else
> > +result |= DID_ABORT << 16;
> >   break;
> 
> Is the above change necessary? ufshcd_abort_one() aborts commands by
> submitting an ABORT TMF. Hence, ufshcd_transfer_rsp_status() won't be
> called if aborting the command succeeds.
> 

Yes, Just becasue ABORT TMF COMPLETE, in spec description:
"A response of FUNCTION COMPLETE shall indicate that the 
command was aborted or was not in the task set. In either case, 
the SCSI target device shall guarantee that no further 
requests or responses are sent from the command."

So at this time, the device will not have a corresponding 
response coming back. The host controller will automatically 
fill in the response for the corresponding command based on 
the results of SQ cleanup (MCQ) or UTRLCLR (DBR, mediatek), 
with the COS content being ABORTED by interrupt.
ISR will handle the response which is from host, not from device.


> > @@ -7561,6 +7551,21 @@ int ufshcd_try_to_abort_task(struct ufs_hba
> *hba, int tag)
> >   goto out;
> >   }
> >   
> > +/*
> > + * When the host software receives a "FUNCTION COMPLETE", set flag
> > + * to requeue command after receive response with OCS_ABORTED
> > + * SDB mode: UTRLCLR Task Management response which means a
> Transfer
> > + *           Request was aborted.
> > + * MCQ mode: Host will post to CQ with OCS_ABORTED after SQ
> cleanup
> > + *
> > + * This flag is set because error handler ufshcd_abort_all
> forcibly
> > + * aborts all commands, and the host controller will automatically
> > + * fill in the OCS field of the corresponding response with
> OCS_ABORTED.
> > + * Therefore, upon receiving this response, it needs to be
> requeued.
> > + */
> > +if (!err && ufshcd_eh_in_progress(hba))
> > +lrbp->abort_initiated_by_eh = true;
> > +
> >   err = ufshcd_clear_cmd(hba, tag);
> >   if (err)
> >   dev_err(hba->dev, "%s: Failed clearing cmd at tag %d, err %d\n",
> 
> The above change will cause lrbp->abort_initiated_by_eh to be set not
> only if the UFS error handler decides to abort a command but also if
> the
> SCSI core decides to abort a command. I think this is wrong.
> 
> Is this patch 2/2 necessary or is patch 1/2 perhaps sufficient?
> 
> Thanks,
> 
> Bart.

Sorry, I might have missed something, but I didn't see 
scsi abort (ufshcd_abort) calling ufshcd_set_eh_in_progress. 
So, during a SCSI abort, ufshcd_eh_in_progress(hba) 
should return false and not set this flag, right?


Additionally, SCSI abort (ufshcd_abort) will have different
return values for MCQ mode and DBR mode when the device 
does not respond with a response.
MCQ mode will receivce OCS_ABORTED (nullify)
	case OCS_ABORTED:
		result |= DID_ABORT << 16;
		break;
But DBR mode, OCS won't change, it is 0x0F
	case OCS_INVALID_COMMAND_STATUS:
		result |= DID_REQUEUE << 16;
		break;
In this case, should we also return DID_ABORT for DBR mode?


Thanks.
Peter



From peter.wang at mediatek.com  Thu Sep 12 06:31:29 2024
From: peter.wang at mediatek.com (=?utf-8?B?UGV0ZXIgV2FuZyAo546L5L+h5Y+LKQ==?=)
Date: Thu, 12 Sep 2024 13:31:29 +0000
Subject: [PATCH v4 2/2] ufs: core: requeue aborted request
In-Reply-To: <858c4b6b-fcbc-4d51-8641-051aeda387c5@acm.org>
References: <20240910073035.25974-1-peter.wang@mediatek.com>
	 <20240910073035.25974-3-peter.wang@mediatek.com>
	 <e42abf07-ba6b-4301-8717-8d5b01d56640@acm.org>
	 <04e392c00986ac798e881dcd347ff5045cf61708.camel@mediatek.com>
	 <858c4b6b-fcbc-4d51-8641-051aeda387c5@acm.org>
Message-ID: <524e9da9196cc0acf497ff87eba3a8043b780332.camel@mediatek.com>

On Wed, 2024-09-11 at 12:11 -0700, Bart Van Assche wrote:
>  	 
> External email : Please do not click links or open attachments until
> you have verified the sender or the content.
>  On 9/10/24 11:03 PM, Peter Wang (???) wrote:
> > This statement is not quite accurate becasue in UFSHIC2.1, SDB mode
> > specification already have OCS: ABORTED (0x6) define.
> > And it is used in below UTRLCLR description:
> > 'which means a Transfer Request was "aborted"'
> > Therefore, the host controller should follow the
> > specification and fill the OCS field with OCS: ABORTED.
> > If not so, at what point does your host controller use the
> > OCS: ABORTED status?
> 
> Hmm ... I have not been able to find any explanation in the UFSHCI
> 2.1
> specification that says when the OCS status is set to aborted. Did I
> perhaps overlook something?
> 
> This is what I found in the UTRLCLR description: "The host software 
> shall use this field only when a UTP Transfer Request is expected to
> not be completed, e.g., when the host software receives a ?FUNCTION
> COMPLETE? Task Management response which means a Transfer Request was
> aborted." This does not mean that the host controller is expected to
> set the OCS status to "ABORTED". I will send an email to the JC-64
> mailing list to request clarification.
> 

Hi Bart,


Yes, you're right, just as I mentioned earlier, I also think
the spec does not explicitly state that UTRLC should have 
corresponding behavior for OCS. This might lead to inconsistencies
in how host controllers operate. 


> >>> +/*
> >>> + * When the host software receives a "FUNCTION COMPLETE", set
> flag
> >>> + * to requeue command after receive response with OCS_ABORTED
> >>> + * SDB mode: UTRLCLR Task Management response which means a
> >> Transfer
> >>> + *           Request was aborted.
> >>> + * MCQ mode: Host will post to CQ with OCS_ABORTED after SQ
> >> cleanup
> >>> + * This flag is set because ufshcd_abort_all forcibly aborts all
> >>> + * commands, and the host will automatically fill in the OCS
> field
> >>> + * of the corresponding response with OCS_ABORTED.
> >>> + * Therefore, upon receiving this response, it needs to be
> >> requeued.
> >>> + */
> >>> +if (!err)
> >>> +lrbp->abort_initiated_by_err = true;
> >>> +
> >>>    err = ufshcd_clear_cmd(hba, tag);
> >>>    if (err)
> >>>    dev_err(hba->dev, "%s: Failed clearing cmd at tag %d, err
> %d\n",
> >>
> >> The above change is misplaced. ufshcd_try_to_abort_task() can be
> >> called
> >> when the SCSI core decides to abort a command while
> >> abort_initiated_by_err must not be set in that case. Please move
> the
> >> above code block into ufshcd_abort_one().
> > 
> > But move to ufshcd_abort_one may have race condition, beacause we
> > need set this flag before ufshcd_clear_cmd host controller fill
> > OCS_ABORTED to response. I will add check ufshcd_eh_in_progress.
> 
> Calling ufshcd_clear_cmd() does not affect the OCS status as far as I
> know. Did I perhaps overlook something?
> 

Because after ufshcd_clear_cmd,

in MCQ mode: 
ufshcd_mcq_sq_cleanup, host controller will post CQ response with OCS
ABORTED.

in SDB mode: 
ufshcd_utrl_clear set UTRLC, Mediatek host controller 
(may not all host controller) will post response with OCS ABORTED.

In both cases, we have an interrupt sent to the host, and there 
may be a race condition before we set this flag for requeue.
So I need to set this flag before ufshcd_clear_cmd.


Thanks.
Peter


> Thanks,
> 
> Bart.

From qianqiang.liu at 163.com  Thu Sep 12 07:20:13 2024
From: qianqiang.liu at 163.com (Qianqiang Liu)
Date: Thu, 12 Sep 2024 22:20:13 +0800
Subject: Is this a out-of-bounds issue?
In-Reply-To: <ZuLt4mJIKXldo9LH@lore-desk>
References: <66e2ec22.050a0220.37047b.174cSMTPIN_ADDED_BROKEN@mx.google.com>
 <ZuLt4mJIKXldo9LH@lore-desk>
Message-ID: <ZuL4naNUi9LgFcfM@thinkpad.>

> Hi,
> 
> I think this is already fixed here:
> https://patchwork.kernel.org/project/linux-wireless/patch/84bf5dd2-2fe3-4410-a7af-ae841e41082a at stanley.mountain/
> 
> Regards,
> Lornzo

Thanks!

-- 
Best,
Qianqiang Liu



From almasrymina at google.com  Thu Sep 12 07:25:23 2024
From: almasrymina at google.com (Mina Almasry)
Date: Thu, 12 Sep 2024 07:25:23 -0700
Subject: [RFC 2/2] page_pool: fix IOMMU crash when driver has already unbound
In-Reply-To: <20240912124514.2329991-3-linyunsheng@huawei.com>
References: <20240912124514.2329991-1-linyunsheng@huawei.com> <20240912124514.2329991-3-linyunsheng@huawei.com>
Message-ID: <CAHS8izPc8fy08mL1RJtnxiOvTx=Uk037Q5SKobC80jQocEKMJQ@mail.gmail.com>

On Thu, Sep 12, 2024 at 5:51?AM Yunsheng Lin <linyunsheng at huawei.com> wrote:
>
> Networking driver with page_pool support may hand over page
> still with dma mapping to network stack and try to reuse that
> page after network stack is done with it and passes it back
> to page_pool to avoid the penalty of dma mapping/unmapping.
> With all the caching in the network stack, some pages may be
> held in the network stack without returning to the page_pool
> soon enough, and with VF disable causing the driver unbound,
> the page_pool does not stop the driver from doing it's
> unbounding work, instead page_pool uses workqueue to check
> if there is some pages coming back from the network stack
> periodically, if there is any, it will do the dma unmmapping
> related cleanup work.
>
> As mentioned in [1], attempting DMA unmaps after the driver
> has already unbound may leak resources or at worst corrupt
> memory. Fundamentally, the page pool code cannot allow DMA
> mappings to outlive the driver they belong to.
>
> Currently it seems there are at least two cases that the page
> is not released fast enough causing dma unmmapping done after
> driver has already unbound:
> 1. ipv4 packet defragmentation timeout: this seems to cause
>    delay up to 30 secs:
>
> 2. skb_defer_free_flush(): this may cause infinite delay if
>    there is no triggering for net_rx_action().
>
> In order not to do the dma unmmapping after driver has already
> unbound and stall the unloading of the networking driver, add
> the pool->items array to record all the pages including the ones
> which are handed over to network stack, so the page_pool can
> do the dma unmmapping for those pages when page_pool_destroy()
> is called.
>

The approach in this patch is a bit complicated. I wonder if there is
something simpler that we can do. From reading the thread, it seems
the issue is that in __page_pool_release_page_dma we're calling
dma_unmap_page_attrs() on a pool->p.dev that has been deleted via
device_del, right?

Why not consider pool->p.dev unusable if pool->destroy_cnt > 0? I.e.
in __page_pool_release_page_dma, we can skip dma_unmap_page_attrs() if
destry_cnt > 0?

More generally, probably any use of pool->p.dev may be invalid if
page_pool_destroy has been called. The call sites can be scrubbed for
latent bugs.

The hard part is handling the concurrency. I'm not so sure we can fix
this without introducing some synchronization between the
page_pool_destroy seeing the device go away and the code paths using
the device. Are these being called from the fast paths? Jespers
benchmark can tell for sure if there is any impact on the fast path.

> Note, the devmem patchset seems to make the bug harder to fix
> and to backport too, this patch does not consider fixing the
> case for devmem yet.
>

FWIW from a quick look I did not see anything in this patch that is
extremely hard to port to netmem. AFAICT the issue is that you skipped
changing page_pool to page_pool_items in net_iov. Once that is done, I
think the rest should be straightforward.

-- 
Thanks,
Mina


From treapking at chromium.org  Thu Sep 12 07:43:57 2024
From: treapking at chromium.org (Pin-yen Lin)
Date: Thu, 12 Sep 2024 22:43:57 +0800
Subject: [PATCH 0/2] Fix dtcheck warnings for mediatek,dpi binding
Message-ID: <20240912144430.3161717-1-treapking@chromium.org>

This series fixes two binding schema errors in mediatek,dpi binding.
The first patch adds the power-domain property to the binding, and the
second patch adds the port node as it's required by the binding.


Pin-yen Lin (2):
  dt-bindings: display: mediatek: dpi: Add power-domains to the bindings
  arm64: dts: mt8183: Add port node to dpi node

 .../bindings/display/mediatek/mediatek,dpi.yaml           | 8 ++++++++
 arch/arm64/boot/dts/mediatek/mt8183.dtsi                  | 4 ++++
 2 files changed, 12 insertions(+)

-- 
2.46.0.662.g92d0881bb0-goog



From treapking at chromium.org  Thu Sep 12 07:43:58 2024
From: treapking at chromium.org (Pin-yen Lin)
Date: Thu, 12 Sep 2024 22:43:58 +0800
Subject: [PATCH 1/2] dt-bindings: display: mediatek: dpi: Add power-domains to the bindings
In-Reply-To: <20240912144430.3161717-1-treapking@chromium.org>
References: <20240912144430.3161717-1-treapking@chromium.org>
Message-ID: <20240912144430.3161717-2-treapking@chromium.org>

The power-domains property is used by most DT nodes using mediatek,dpi
bindings. Add this to the bindings to fix the schema check error.

Signed-off-by: Pin-yen Lin <treapking at chromium.org>
---

 .../bindings/display/mediatek/mediatek,dpi.yaml           | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml b/Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml
index 5ca7679d5427..7e0bb88f5856 100644
--- a/Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml
+++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml
@@ -42,6 +42,12 @@ properties:
   interrupts:
     maxItems: 1
 
+  power-domains:
+    description:
+      A phandle and PM domain specifier as defined by bindings
+      of the power controller specified by phandle. See
+      Documentation/devicetree/bindings/power/power-domain.yaml for details.
+
   clocks:
     items:
       - description: Pixel Clock
@@ -82,11 +88,13 @@ examples:
   - |
     #include <dt-bindings/interrupt-controller/arm-gic.h>
     #include <dt-bindings/clock/mt8173-clk.h>
+    #include <dt-bindings/power/mt8173-power.h>
 
     dpi0: dpi at 1401d000 {
         compatible = "mediatek,mt8173-dpi";
         reg = <0x1401d000 0x1000>;
         interrupts = <GIC_SPI 194 IRQ_TYPE_LEVEL_LOW>;
+        power-domains = <&spm MT8173_POWER_DOMAIN_MM>;
         clocks = <&mmsys CLK_MM_DPI_PIXEL>,
              <&mmsys CLK_MM_DPI_ENGINE>,
              <&apmixedsys CLK_APMIXED_TVDPLL>;
-- 
2.46.0.662.g92d0881bb0-goog



From treapking at chromium.org  Thu Sep 12 07:43:59 2024
From: treapking at chromium.org (Pin-yen Lin)
Date: Thu, 12 Sep 2024 22:43:59 +0800
Subject: [PATCH 2/2] arm64: dts: mt8183: Add port node to dpi node
In-Reply-To: <20240912144430.3161717-1-treapking@chromium.org>
References: <20240912144430.3161717-1-treapking@chromium.org>
Message-ID: <20240912144430.3161717-3-treapking@chromium.org>

Add the port node to fix the binding schema check.

Fixes: 009d855a26fd ("arm64: dts: mt8183: add dpi node to mt8183")
Signed-off-by: Pin-yen Lin <treapking at chromium.org>
Reported-by: kernel test robot <lkp at intel.com>
Closes: https://lore.kernel.org/oe-kbuild-all/202409110843.Hm5W9upr-lkp at intel.com/

---

 arch/arm64/boot/dts/mediatek/mt8183.dtsi | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/arch/arm64/boot/dts/mediatek/mt8183.dtsi b/arch/arm64/boot/dts/mediatek/mt8183.dtsi
index 266441e999f2..0a6578aacf82 100644
--- a/arch/arm64/boot/dts/mediatek/mt8183.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8183.dtsi
@@ -1845,6 +1845,10 @@ dpi0: dpi at 14015000 {
 				 <&mmsys CLK_MM_DPI_MM>,
 				 <&apmixedsys CLK_APMIXED_TVDPLL>;
 			clock-names = "pixel", "engine", "pll";
+
+			port {
+				dpi_out: endpoint { };
+			};
 		};
 
 		mutex: mutex at 14016000 {
-- 
2.46.0.662.g92d0881bb0-goog



From lee at kernel.org  Thu Sep 12 07:51:00 2024
From: lee at kernel.org (Lee Jones)
Date: Thu, 12 Sep 2024 15:51:00 +0100
Subject: (subset) [PATCH v7 00/16] Add audio support for the MediaTek
 Genio 350-evk board
In-Reply-To: <172544860860.19172.7052813450885034844.b4-ty@kernel.org>
References: <20240226-audio-i350-v7-0-6518d953a141@baylibre.com>
 <172544860860.19172.7052813450885034844.b4-ty@kernel.org>
Message-ID: <20240912145100.GE24460@google.com>

On Wed, 04 Sep 2024, Mark Brown wrote:

> On Mon, 22 Jul 2024 08:53:29 +0200, Alexandre Mergnat wrote:
> > This serie aim to add the following audio support for the Genio 350-evk:
> > - Playback
> >   - 2ch Headset Jack (Earphone)
> >   - 1ch Line-out Jack (Speaker)
> >   - 8ch HDMI Tx
> > - Capture
> >   - 1ch DMIC (On-board Digital Microphone)
> >   - 1ch AMIC (On-board Analogic Microphone)
> >   - 1ch Headset Jack (External Analogic Microphone)
> > 
> > [...]
> 
> Applied to
> 
>    https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git for-next
> 
> Thanks!
> 
> [01/16] ASoC: dt-bindings: mediatek,mt8365-afe: Add audio afe document
>         commit: ceb3ca2876243e3ea02f78b3d488b1f2d734de49
> [02/16] ASoC: dt-bindings: mediatek,mt8365-mt6357: Add audio sound card document
>         commit: 76d80dcdd55f70b28930edb97b96ee375e1cce5a
> [03/16] dt-bindings: mfd: mediatek: Add codec property for MT6357 PMIC
>         commit: 761cab667898d86c04867948f1b7aec1090be796

Did you mean to hoover this up?

> [04/16] ASoC: mediatek: mt8365: Add common header
>         commit: 38c7c9ddc74033406461d64e541bbc8268e77f73
> [05/16] ASoC: mediatek: mt8365: Add audio clock control support
>         commit: ef307b40b7f0042d54f020bccb3e728ced292282
> [06/16] ASoC: mediatek: mt8365: Add I2S DAI support
>         commit: 402bbb13a195caa83b3279ebecdabfb11ddee084
> [07/16] ASoC: mediatek: mt8365: Add ADDA DAI support
>         commit: 7c58c88e524180e8439acdfc44872325e7f6d33d
> [08/16] ASoC: mediatek: mt8365: Add DMIC DAI support
>         commit: 1c50ec75ce6c0c6b5736499393e522f73e19d0cf
> [09/16] ASoC: mediatek: mt8365: Add PCM DAI support
>         commit: 5097c0c8634d703e3c59cfb89831b7db9dc46339
> [10/16] ASoc: mediatek: mt8365: Add a specific soundcard for EVK
>         commit: 1bf6dbd75f7603dd026660bebf324f812200dc1b
> [11/16] ASoC: mediatek: mt8365: Add the AFE driver support
>         commit: e1991d102bc2abb32331c462f8f3e77059c69578
> [12/16] ASoC: codecs: add MT6357 support
>         (no commit info)
> [13/16] ASoC: mediatek: Add MT8365 support
>         (no commit info)
> 
> All being well this means that it will be integrated into the linux-next
> tree (usually sometime in the next 24 hours) and sent to Linus during
> the next merge window (or sooner if it is a bug fix), however if
> problems are discovered then the patch may be dropped or reverted.
> 
> You may get further e-mails resulting from automated or manual testing
> and review of the tree, please engage with people reporting problems and
> send followup patches addressing any issues that are reported if needed.
> 
> If any updates are required or you are submitting further changes they
> should be sent as incremental updates against current git, existing
> patches will not be replaced.
> 
> Please add any relevant lists and maintainers to the CCs when replying
> to this mail.
> 
> Thanks,
> Mark
> 

-- 
Lee Jones [???]


From broonie at kernel.org  Thu Sep 12 08:17:21 2024
From: broonie at kernel.org (Mark Brown)
Date: Thu, 12 Sep 2024 16:17:21 +0100
Subject: (subset) [PATCH v7 00/16] Add audio support for the MediaTek
 Genio 350-evk board
In-Reply-To: <20240912145100.GE24460@google.com>
References: <20240226-audio-i350-v7-0-6518d953a141@baylibre.com>
 <172544860860.19172.7052813450885034844.b4-ty@kernel.org>
 <20240912145100.GE24460@google.com>
Message-ID: <10c1217b-d8a3-489c-93fc-6de45dcbe47c@sirena.org.uk>

On Thu, Sep 12, 2024 at 03:51:00PM +0100, Lee Jones wrote:
> On Wed, 04 Sep 2024, Mark Brown wrote:

> > [03/16] dt-bindings: mfd: mediatek: Add codec property for MT6357 PMIC
> >         commit: 761cab667898d86c04867948f1b7aec1090be796

> Did you mean to hoover this up?

It seemed to go along with the series and had a DT review so it looked
like you'd just left it to the DT people to review, there wasn't any
other MFD content in the series.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-mediatek/attachments/20240912/a3e323ea/attachment.sig>

From lee at kernel.org  Thu Sep 12 08:20:50 2024
From: lee at kernel.org (Lee Jones)
Date: Thu, 12 Sep 2024 16:20:50 +0100
Subject: [PATCH v2 2/5] dt-bindings: mfd: mediatek,mt6357: Describe
 Auxiliary ADC subdev
In-Reply-To: <01020191e56f3f66-1afb592c-a676-4871-b75a-bc38d896ae03-000000@eu-west-1.amazonses.com>
References: <20240604123008.327424-1-angelogioacchino.delregno@collabora.com>
 <20240604123008.327424-3-angelogioacchino.delregno@collabora.com>
 <01020191e56f3f66-1afb592c-a676-4871-b75a-bc38d896ae03-000000@eu-west-1.amazonses.com>
Message-ID: <20240912152050.GF24460@google.com>

On Thu, 12 Sep 2024, AngeloGioacchino Del Regno wrote:

> Il 04/06/24 14:30, AngeloGioacchino Del Regno ha scritto:
> > Describe the PMIC-integrated Auxiliary Analog to Digital Converter
> > subdevice node.
> > Full description is available in the mediatek,mt6359-auxadc.yaml
> > binding relative to that hardware.
> > 
> 
> Hello,
> 
> I just realized (indeed too late) that while all of the other commits of this
> series are upstream, this patch was not picked, causing dts validation warnings.
> 
> Should I resend or can you just simply pick it?

It's lacking a DT review.

-- 
Lee Jones [???]


From robh at kernel.org  Thu Sep 12 08:39:59 2024
From: robh at kernel.org (Rob Herring (Arm))
Date: Thu, 12 Sep 2024 10:39:59 -0500
Subject: [PATCH v2] arm64: dts: mediatek: mt8395-genio-1200-evk: Enable
 GPU
In-Reply-To: <20240912070624.25540-1-pablo.sun@mediatek.com>
References: <20240912070624.25540-1-pablo.sun@mediatek.com>
Message-ID: <172615543357.3778398.2957632897168854309.robh@kernel.org>


On Thu, 12 Sep 2024 15:06:24 +0800, Pablo Sun wrote:
> Enable the Mali Valhall GPU on Genio 1200 EVK by providing regulator
> supply settingsi to gpu and mfg1, and enable the GPU node.
> 
> In addition, set the GPU related regulator voltage range:
> 
> 1. Set the recommended input voltage range of DVDD_GPU to (0.546V-0.787V),
>    based on Table 5-3 of MT8395 Application Processor Datasheet.
>    The regulator mt6315_7_vbuck1("Vgpu") connects to the DVDD_GPU input.
>    Note that the minimum voltage in SoC eFuse data, which is read by
>    MTK-SVS to adjust the regulator voltage, does not go below
>    the recommended operating voltage in the datasheet.
> 
> 2. Set the input voltage of DVDD_SRAM_GPU, supplied by
>    mt6359_vsram_others_ldo_reg, to 0.75V, the recommended typical
>    operating voltage in MT8395 Application Processor Datasheet.
> 
> This patch is tested by enabling CONFIG_DRM_PANFROST and
> on Genio 1200 EVK it probed with following dmesg:
> 
> ```
> panfrost 13000000.gpu: clock rate = 700000092
> panfrost 13000000.gpu: mali-g57 id 0x9093 major 0x0 minor 0x1 status 0x0
> panfrost 13000000.gpu: features: 00000000,000019f7,
> 					   issues: 00000001,80000400
> panfrost 13000000.gpu: Features: L2:0x07120206 Shader:0x00000000
> 					   Tiler:0x00000809 Mem:0x301
> 					   MMU:0x00002830 AS:0xff JS:0x7
> panfrost 13000000.gpu: shader_present=0x50045 l2_present=0x1
> [drm] Initialized panfrost 1.2.0 for 13000000.gpu on minor 0
> ```
> 
> Signed-off-by: Pablo Sun <pablo.sun at mediatek.com>
> ---
>  .../dts/mediatek/mt8395-genio-1200-evk.dts    | 19 +++++++++++++++++--
>  1 file changed, 17 insertions(+), 2 deletions(-)
> 


My bot found new DTB warnings on the .dts files added or changed in this
series.

Some warnings may be from an existing SoC .dtsi. Or perhaps the warnings
are fixed by another series. Ultimately, it is up to the platform
maintainer whether these warnings are acceptable or not. No need to reply
unless the platform maintainer has comments.

If you already ran DT checks and didn't see these error(s), then
make sure dt-schema is up to date:

  pip3 install dtschema --upgrade


New warnings running 'make CHECK_DTBS=y mediatek/mt8395-genio-1200-evk.dtb' for 20240912070624.25540-1-pablo.sun at mediatek.com:

arch/arm64/boot/dts/mediatek/mt8395-genio-1200-evk.dtb: display at 14f06000: clocks: [[32, 14], [32, 43], [32, 44]] is too long
	from schema $id: http://devicetree.org/schemas/display/mediatek/mediatek,split.yaml#
arch/arm64/boot/dts/mediatek/mt8395-genio-1200-evk.dtb: dp-intf at 1c113000: power-domains: False schema does not allow [[45, 18]]
	from schema $id: http://devicetree.org/schemas/display/mediatek/mediatek,dpi.yaml#







From treapking at chromium.org  Thu Sep 12 08:44:29 2024
From: treapking at chromium.org (Pin-yen Lin)
Date: Thu, 12 Sep 2024 23:44:29 +0800
Subject: [PATCH] arm64: dts: mt8192-asurada-spherion: Add Synaptics trackpad support
Message-ID: <20240912154451.3447081-1-treapking@chromium.org>

Some spherion variants use Synaptics trackpad at address 0x2c in the
I2C2 bus with the generic HID-over-i2c driver, and this cannot be
distinguished from the firmware compatible string.

Support both trackpads in the same devicetree by moving the trackpad
pinctrl property to i2c2 and adding the node for Synaptics trackpad.

Signed-off-by: Pin-yen Lin <treapking at chromium.org>
---

 .../boot/dts/mediatek/mt8192-asurada-spherion-r0.dts  | 11 +++++++++++
 arch/arm64/boot/dts/mediatek/mt8192-asurada.dtsi      |  4 +---
 2 files changed, 12 insertions(+), 3 deletions(-)

diff --git a/arch/arm64/boot/dts/mediatek/mt8192-asurada-spherion-r0.dts b/arch/arm64/boot/dts/mediatek/mt8192-asurada-spherion-r0.dts
index 29aa87e93888..8c485c3ced2c 100644
--- a/arch/arm64/boot/dts/mediatek/mt8192-asurada-spherion-r0.dts
+++ b/arch/arm64/boot/dts/mediatek/mt8192-asurada-spherion-r0.dts
@@ -79,3 +79,14 @@ headset-codec {
 &touchscreen {
 	compatible = "elan,ekth3500";
 };
+
+&i2c2 {
+	/* synaptics touchpad */
+	trackpad at 2c {
+		compatible = "hid-over-i2c";
+		reg = <0x2c>;
+		hid-descr-addr = <0x20>;
+		interrupts-extended = <&pio 15 IRQ_TYPE_LEVEL_LOW>;
+		wakeup-source;
+	};
+};
diff --git a/arch/arm64/boot/dts/mediatek/mt8192-asurada.dtsi b/arch/arm64/boot/dts/mediatek/mt8192-asurada.dtsi
index 08d71ddf3668..8dda8b63765b 100644
--- a/arch/arm64/boot/dts/mediatek/mt8192-asurada.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8192-asurada.dtsi
@@ -335,14 +335,12 @@ &i2c2 {
 	clock-frequency = <400000>;
 	clock-stretch-ns = <12600>;
 	pinctrl-names = "default";
-	pinctrl-0 = <&i2c2_pins>;
+	pinctrl-0 = <&i2c2_pins>, <&trackpad_pins>;
 
 	trackpad at 15 {
 		compatible = "elan,ekth3000";
 		reg = <0x15>;
 		interrupts-extended = <&pio 15 IRQ_TYPE_LEVEL_LOW>;
-		pinctrl-names = "default";
-		pinctrl-0 = <&trackpad_pins>;
 		vcc-supply = <&pp3300_u>;
 		wakeup-source;
 	};
-- 
2.46.0.662.g92d0881bb0-goog



From robh at kernel.org  Thu Sep 12 09:43:19 2024
From: robh at kernel.org (Rob Herring)
Date: Thu, 12 Sep 2024 11:43:19 -0500
Subject: [PATCH v4 1/5] dt-bindings: arm: airoha: Add the chip-scu node
 for EN7581 SoC
In-Reply-To: <ZuIPo8BMBVGuaGMI@lore-desk>
References: <20240911-en7581-pinctrl-v4-0-60ac93d760bb@kernel.org>
 <20240911-en7581-pinctrl-v4-1-60ac93d760bb@kernel.org>
 <172608915149.1388705.7137335166206916411.robh@kernel.org>
 <ZuIPo8BMBVGuaGMI@lore-desk>
Message-ID: <20240912164319.GA3907493-robh@kernel.org>

On Wed, Sep 11, 2024 at 11:46:11PM +0200, Lorenzo Bianconi wrote:
> > 
> > On Wed, 11 Sep 2024 21:50:01 +0200, Lorenzo Bianconi wrote:
> > > This patch adds the chip-scu document bindings for EN7581 SoC.
> > > The airoha chip-scu block provides a configuration interface for clock,
> > > io-muxing and other functionalities used by multiple controllers (e.g.
> > > clock, pinctrl, ecc.) on EN7581 SoC.
> > > 
> > > Reviewed-by: Rob Herring (Arm) <robh at kernel.org>
> > > Signed-off-by: Lorenzo Bianconi <lorenzo at kernel.org>
> > > ---
> > >  .../bindings/arm/airoha,en7581-chip-scu.yaml       | 42 ++++++++++++++++++++++
> > >  1 file changed, 42 insertions(+)
> > > 
> > 
> > My bot found errors running 'make dt_binding_check' on your patch:
> > 
> > yamllint warnings/errors:
> > 
> > dtschema/dtc warnings/errors:
> > 
> > 
> > doc reference errors (make refcheckdocs):
> > 
> > See https://patchwork.ozlabs.org/project/devicetree-bindings/patch/20240911-en7581-pinctrl-v4-1-60ac93d760bb at kernel.org
> > 
> > The base for the series is generally the latest rc1. A different dependency
> > should be noted in *this* patch.
> > 
> > If you already ran 'make dt_binding_check' and didn't see the above
> > error(s), then make sure 'yamllint' is installed and dt-schema is up to
> > date:
> > 
> > pip3 install dtschema --upgrade
> > 
> > Please check and re-submit after running the above command yourself. Note
> > that DT_SCHEMA_FILES can be set to your schema file to speed up checking
> > your schema. However, it must be unset to test all examples with your schema.
> > 
> 
> Hi Rob,
> 
> before posting the series I run make dt_binding_check:
> 
> $ make dt_binding_check DT_SCHEMA_FILES=airoha

Technically, you have to run it without DT_SCHEMA_FILES as sometimes 
there is interaction with other schemas.

>   SCHEMA  Documentation/devicetree/bindings/processed-schema.json
>   CHKDT   Documentation/devicetree/bindings
>   LINT    Documentation/devicetree/bindings
>   DTC_CHK Documentation/devicetree/bindings/arm/airoha.example.dtb
>   DTEX    Documentation/devicetree/bindings/arm/airoha,en7581-chip-scu.example.dts
>   DTC_CHK Documentation/devicetree/bindings/arm/airoha,en7581-chip-scu.example.dtb
>   DTC_CHK Documentation/devicetree/bindings/clock/airoha,en7523-scu.example.dtb
>   DTC_CHK Documentation/devicetree/bindings/net/airoha,en7581-eth.example.dtb
>   DTC_CHK Documentation/devicetree/bindings/net/airoha,en8811h.example.dtb
>   DTC_CHK Documentation/devicetree/bindings/gpio/airoha,en7523-gpio.example.dtb
>   DTC_CHK Documentation/devicetree/bindings/spi/airoha,en7581-snand.example.dtb
>   DTC_CHK Documentation/devicetree/bindings/phy/airoha,en7581-pcie-phy.example.dtb
> 
> $yamllint --version
> yamllint 1.35.1
> 
> dtschema is at the latest version.
> Is it a false positive or am I missing something?

Looks like something went sideways. Will look into it. You can ignore 
this.

Rob


From robh at kernel.org  Thu Sep 12 09:44:56 2024
From: robh at kernel.org (Rob Herring (Arm))
Date: Thu, 12 Sep 2024 11:44:56 -0500
Subject: [PATCH v4 2/5] dt-bindings: mfd: Add support for Airoha EN7581
 GPIO System Controller
In-Reply-To: <20240911-en7581-pinctrl-v4-2-60ac93d760bb@kernel.org>
References: <20240911-en7581-pinctrl-v4-0-60ac93d760bb@kernel.org>
 <20240911-en7581-pinctrl-v4-2-60ac93d760bb@kernel.org>
Message-ID: <172615949582.3911596.4077414513470594513.robh@kernel.org>


On Wed, 11 Sep 2024 21:50:02 +0200, Lorenzo Bianconi wrote:
> From: Christian Marangi <ansuelsmth at gmail.com>
> 
> Add support for Airoha EN7581 GPIO System Controller which provide a
> register map for controlling the GPIO, pinctrl and PWM of the SoC.
> 
> Schema define cells for both gpio/interrupt controller and PWM.
> Moreover it provides a dedicated pinctrl node for pins and config
> definitions.
> 
> Signed-off-by: Christian Marangi <ansuelsmth at gmail.com>
> Co-developed-by: Lorenzo Bianconi <lorenzo at kernel.org>
> Signed-off-by: Lorenzo Bianconi <lorenzo at kernel.org>
> ---
>  .../bindings/mfd/airoha,en7581-gpio-sysctl.yaml    | 433 +++++++++++++++++++++
>  1 file changed, 433 insertions(+)
> 

Reviewed-by: Rob Herring (Arm) <robh at kernel.org>



From lee at kernel.org  Thu Sep 12 09:54:04 2024
From: lee at kernel.org (Lee Jones)
Date: Thu, 12 Sep 2024 17:54:04 +0100
Subject: (subset) [PATCH v7 00/16] Add audio support for the MediaTek
 Genio 350-evk board
In-Reply-To: <10c1217b-d8a3-489c-93fc-6de45dcbe47c@sirena.org.uk>
References: <20240226-audio-i350-v7-0-6518d953a141@baylibre.com>
 <172544860860.19172.7052813450885034844.b4-ty@kernel.org>
 <20240912145100.GE24460@google.com>
 <10c1217b-d8a3-489c-93fc-6de45dcbe47c@sirena.org.uk>
Message-ID: <20240912165404.GG24460@google.com>

On Thu, 12 Sep 2024, Mark Brown wrote:

> On Thu, Sep 12, 2024 at 03:51:00PM +0100, Lee Jones wrote:
> > On Wed, 04 Sep 2024, Mark Brown wrote:
> 
> > > [03/16] dt-bindings: mfd: mediatek: Add codec property for MT6357 PMIC
> > >         commit: 761cab667898d86c04867948f1b7aec1090be796
> 
> > Did you mean to hoover this up?
> 
> It seemed to go along with the series and had a DT review so it looked
> like you'd just left it to the DT people to review, there wasn't any
> other MFD content in the series.

I applied it from this set 6 weeks ago! :)


-- 
Lee Jones [???]


From broonie at kernel.org  Thu Sep 12 10:05:15 2024
From: broonie at kernel.org (Mark Brown)
Date: Thu, 12 Sep 2024 18:05:15 +0100
Subject: [PATCH v2] ASoc: mediatek: mt8365: Remove unneeded assignment
In-Reply-To: <20240911123629.125686-1-usama.anjum@collabora.com>
References: <20240911123629.125686-1-usama.anjum@collabora.com>
Message-ID: <172616071500.69425.1928964300196117932.b4-ty@kernel.org>

On Wed, 11 Sep 2024 17:36:22 +0500, Muhammad Usama Anjum wrote:
> The ret is being assigned, but not being used. Remove the assignment.
> One of the reviewer mentioned that dev_warn should be replaced with
> dev_info. Make this change as well.
> 
> 

Applied to

   https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git for-next

Thanks!

[1/1] ASoc: mediatek: mt8365: Remove unneeded assignment
      commit: d69f11e8c57e9459c9e60bffc0f2c6c3aa02f4b1

All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.

You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.

If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.

Please add any relevant lists and maintainers to the CCs when replying
to this mail.

Thanks,
Mark



From broonie at kernel.org  Thu Sep 12 11:59:37 2024
From: broonie at kernel.org (Mark Brown)
Date: Thu, 12 Sep 2024 19:59:37 +0100
Subject: [PATCH v2] ASoC: mediatek: mt7986-afe-pcm: Remove redundant
 error message
In-Reply-To: <20240912084110.1854-1-tangbin@cmss.chinamobile.com>
References: <20240912084110.1854-1-tangbin@cmss.chinamobile.com>
Message-ID: <172616757716.88520.13515459901367957704.b4-ty@kernel.org>

On Thu, 12 Sep 2024 16:41:10 +0800, Tang Bin wrote:
> In the function mt7986_afe_pcm_dev_probe, when get irq
> failed, the function platform_get_irq() logs an error
> message, so remove redundant one here.
> 
> 

Applied to

   https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git for-next

Thanks!

[1/1] ASoC: mediatek: mt7986-afe-pcm: Remove redundant error message
      commit: f6e2e7397d00192bda11166d5fb3e2e67a8cf92e

All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.

You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.

If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.

Please add any relevant lists and maintainers to the CCs when replying
to this mail.

Thanks,
Mark



From alpernebiyasak at gmail.com  Thu Sep 12 13:29:00 2024
From: alpernebiyasak at gmail.com (Alper Nebi Yasak)
Date: Thu, 12 Sep 2024 23:29:00 +0300
Subject: [PATCH v4 0/5] Support alpha blending in MTK display driver
In-Reply-To: <CAAOTY_8ThuusfHk9Gd5pFP8VhJkG2seuJmkFiruK1rPQFZGBzg@mail.gmail.com>
References: <20240717-alpha-blending-v4-0-4b1c806c0749@mediatek.com>
 <CAAOTY_8ThuusfHk9Gd5pFP8VhJkG2seuJmkFiruK1rPQFZGBzg@mail.gmail.com>
Message-ID: <6c9b7f85-f92d-44ed-ae9d-00f6d55ea614@gmail.com>

Hi,

On 2024-07-31 16:34 +03:00, Chun-Kuang Hu wrote:
> Hi, Shawn:
> 
> Hsiao Chien Sung via B4 Relay
> <devnull+shawn.sung.mediatek.com at kernel.org> ? 2024?7?17? ?? ??1:24???
>>
>> Support "Pre-multiplied" and "None" blend mode on MediaTek's chips by
>> adding correct blend mode property when the planes init.
>> Before this patch, only the "Coverage" mode (default) is supported.
> 
> For the whole series, applied to mediatek-drm-next [1], thanks.
> 
> [1] https://git.kernel.org/pub/scm/linux/kernel/git/chunkuang.hu/linux.git/log/?h=mediatek-drm-next

I am seeing broken colors on an MT8173 Chromebook with next-20240912,
which goes away if I git-revert this series (commits 1f66fe62cc09
eb17c5909481 a3f7f7ef4bfe 59e9d9de25f0 4225d5d5e779).

To illustrate, I took a picture [1] of some color mixing diagrams from
Wikipedia [2]. Do you have an idea of what goes wrong?

(I'm busy with too many things so I don't want to debug it now...)

[1] https://i.imgur.com/tNFvovB.jpeg
[2] https://en.wikipedia.org/wiki/Color_space#Generic


From robh at kernel.org  Thu Sep 12 13:31:32 2024
From: robh at kernel.org (Rob Herring (Arm))
Date: Thu, 12 Sep 2024 15:31:32 -0500
Subject: [PATCH v7 02/10] of: base: Add
 for_each_child_of_node_with_prefix()
In-Reply-To: <20240911072751.365361-3-wenst@chromium.org>
References: <20240911072751.365361-1-wenst@chromium.org>
 <20240911072751.365361-3-wenst@chromium.org>
Message-ID: <172617309153.737512.5462269215203973657.robh@kernel.org>


On Wed, 11 Sep 2024 15:27:40 +0800, Chen-Yu Tsai wrote:
> There are cases where drivers would go through child device nodes and
> operate on only the ones whose node name starts with a given prefix.
> 
> Provide a helper for these users. This will mainly be used in a
> subsequent patch that implements a hardware component prober for I2C
> busses.
> 
> Signed-off-by: Chen-Yu Tsai <wenst at chromium.org>
> ---
> Changes since v6:
> - Changed helper name to "for_each_child_of_node_with_prefix()"
> Changes since v5:
> - New patch
> ---
>  drivers/of/base.c  | 35 +++++++++++++++++++++++++++++++++++
>  include/linux/of.h |  9 +++++++++
>  2 files changed, 44 insertions(+)
> 

Reviewed-by: Rob Herring (Arm) <robh at kernel.org>



From bvanassche at acm.org  Thu Sep 12 14:11:46 2024
From: bvanassche at acm.org (Bart Van Assche)
Date: Thu, 12 Sep 2024 14:11:46 -0700
Subject: [PATCH v6 2/2] ufs: core: requeue aborted request
In-Reply-To: <d3306f9d2b88c5b6ae8d2104041e5c941898dee5.camel@mediatek.com>
References: <20240911095622.19225-1-peter.wang@mediatek.com>
 <20240911095622.19225-3-peter.wang@mediatek.com>
 <55d2cca5-0e30-4734-aa25-d5f5cdfbfd93@acm.org>
 <d3306f9d2b88c5b6ae8d2104041e5c941898dee5.camel@mediatek.com>
Message-ID: <cad4804b-2102-4c95-9387-a63ff847cf21@acm.org>

On 9/12/24 6:49 AM, Peter Wang (???) wrote:
> On Wed, 2024-09-11 at 12:37 -0700, Bart Van Assche wrote:
[ ... ]
> So at this time, the device will not have a corresponding
> response coming back. The host controller will automatically
> fill in the response for the corresponding command based on
> the results of SQ cleanup (MCQ) or UTRLCLR (DBR, mediatek),
> with the COS content being ABORTED by interrupt.

I don't think so. In SDB mode, writing into the UTRLCLR register does
NOT cause the ABORTED status to be written into the OCS field. Even if
there would be UFSHCI controllers that do this, the UFSHCI specification
does not require this behavior and hence the UFS driver should not
assume this behavior.

>> The above change will cause lrbp->abort_initiated_by_eh to be set not
>> only if the UFS error handler decides to abort a command but also if
>> the
>> SCSI core decides to abort a command. I think this is wrong.
> 
> Sorry, I might have missed something, but I didn't see
> scsi abort (ufshcd_abort) calling ufshcd_set_eh_in_progress.
> So, during a SCSI abort, ufshcd_eh_in_progress(hba)
> should return false and not set this flag, right?

I think you are right so please ignore my comment above.

> Additionally, SCSI abort (ufshcd_abort) will have different
> return values for MCQ mode and DBR mode when the device
> does not respond with a response.
> MCQ mode will receivce OCS_ABORTED (nullify)
> 	case OCS_ABORTED:
> 		result |= DID_ABORT << 16;
> 		break;

No. ufshcd_abort() submits an abort TMF and the OCS status is not
modified if the abort TMF succeeds.

> But DBR mode, OCS won't change, it is 0x0F
> 	case OCS_INVALID_COMMAND_STATUS:
> 		result |= DID_REQUEUE << 16;
> 		break;
> In this case, should we also return DID_ABORT for DBR mode?

The above code comes from ufshcd_transfer_rsp_status(), isn't it?
ufshcd_transfer_rsp_status() should not be called if the SCSI core
aborts a SCSI command (ufshcd_abort()). It is not allowed to call
scsi_done() from a SCSI abort handler like ufshcd_abort(). SCSI
abort handlers must return SUCCESS, FAILED or FAST_IO_FAIL and let
the SCSI core decide whether to complete or whether to resubmit the
SCSI command.

Thanks,

Bart.


From bvanassche at acm.org  Thu Sep 12 14:17:27 2024
From: bvanassche at acm.org (Bart Van Assche)
Date: Thu, 12 Sep 2024 14:17:27 -0700
Subject: [PATCH v4 2/2] ufs: core: requeue aborted request
In-Reply-To: <524e9da9196cc0acf497ff87eba3a8043b780332.camel@mediatek.com>
References: <20240910073035.25974-1-peter.wang@mediatek.com>
 <20240910073035.25974-3-peter.wang@mediatek.com>
 <e42abf07-ba6b-4301-8717-8d5b01d56640@acm.org>
 <04e392c00986ac798e881dcd347ff5045cf61708.camel@mediatek.com>
 <858c4b6b-fcbc-4d51-8641-051aeda387c5@acm.org>
 <524e9da9196cc0acf497ff87eba3a8043b780332.camel@mediatek.com>
Message-ID: <6203d7c9-b33c-4bf1-aca3-5fc8ba5636b9@acm.org>

On 9/12/24 6:31 AM, Peter Wang (???) wrote:
> in SDB mode:
> ufshcd_utrl_clear set UTRLC, Mediatek host controller
> (may not all host controller) will post response with OCS ABORTED.
> 
> In both cases, we have an interrupt sent to the host, and there
> may be a race condition before we set this flag for requeue.
> So I need to set this flag before ufshcd_clear_cmd.

If a completion interrupt is sent to the host if a command has been
cleared in SDB mode (I doubt this is what happens), I think that's a
severe controller bug. A UFSHCI controller is not allowed to send a
completion interrupt to the host if a command is cleared by writing into
the UTRLCLR register.

Thanks,

Bart.


From ck.hu at mediatek.com  Thu Sep 12 18:25:13 2024
From: ck.hu at mediatek.com (=?utf-8?B?Q0sgSHUgKOiDoeS/iuWFiSk=?=)
Date: Fri, 13 Sep 2024 01:25:13 +0000
Subject: [PATCH v4 0/5] Support alpha blending in MTK display driver
In-Reply-To: <6c9b7f85-f92d-44ed-ae9d-00f6d55ea614@gmail.com>
References: <20240717-alpha-blending-v4-0-4b1c806c0749@mediatek.com>
	 <CAAOTY_8ThuusfHk9Gd5pFP8VhJkG2seuJmkFiruK1rPQFZGBzg@mail.gmail.com>
	 <6c9b7f85-f92d-44ed-ae9d-00f6d55ea614@gmail.com>
Message-ID: <a2cf4e9b9c3343a7398521760934f1740505aa13.camel@mediatek.com>

Hi, Jason:

Please help to fix this issue.
Otherwise, I would revert this series.

Regards,
CK

On Thu, 2024-09-12 at 23:29 +0300, Alper Nebi Yasak wrote:
>  	 
> External email : Please do not click links or open attachments until you have verified the sender or the content.
>  Hi,
> 
> On 2024-07-31 16:34 +03:00, Chun-Kuang Hu wrote:
> > Hi, Shawn:
> > 
> > Hsiao Chien Sung via B4 Relay
> > <devnull+shawn.sung.mediatek.com at kernel.org> ? 2024?7?17? ?? ??1:24???
> >>
> >> Support "Pre-multiplied" and "None" blend mode on MediaTek's chips by
> >> adding correct blend mode property when the planes init.
> >> Before this patch, only the "Coverage" mode (default) is supported.
> > 
> > For the whole series, applied to mediatek-drm-next [1], thanks.
> > 
> > [1] https://git.kernel.org/pub/scm/linux/kernel/git/chunkuang.hu/linux.git/log/?h=mediatek-drm-next
> 
> I am seeing broken colors on an MT8173 Chromebook with next-20240912,
> which goes away if I git-revert this series (commits 1f66fe62cc09
> eb17c5909481 a3f7f7ef4bfe 59e9d9de25f0 4225d5d5e779).
> 
> To illustrate, I took a picture [1] of some color mixing diagrams from
> Wikipedia [2]. Do you have an idea of what goes wrong?
> 
> (I'm busy with too many things so I don't want to debug it now...)
> 
> [1] https://i.imgur.com/tNFvovB.jpeg
> [2] https://en.wikipedia.org/wiki/Color_space#Generic
> 

From cengjianeng at huaqin.corp-partner.google.com  Thu Sep 12 18:55:01 2024
From: cengjianeng at huaqin.corp-partner.google.com (Jianeng Ceng)
Date: Fri, 13 Sep 2024 09:55:01 +0800
Subject: [PATCH v6 0/2] arm64: dts: mediatek: Add MT8186 Ponyta
Message-ID: <20240913015503.4192806-1-cengjianeng@huaqin.corp-partner.google.com>

This is v6 of the MT8186 Chromebook device tree series.
---
Changes in v6:
- PATCH 2/2: Remove prototype sku.
- PATCH 2/2: Disable the other trackpad to enable one of them.
- Link to v5:https://lore.kernel.org/all/20240909023148.1677936-1-cengjianeng at huaqin.corp-partner.google.com/

Changes in v5:
- PATCH 1/2: Remove sku2147483647.
- PATCH 2/2: Remove sku2147483647.
- Link to v4:https://lore.kernel.org/all/20240906085739.1322676-1-cengjianeng at huaqin.corp-partner.google.com/

Changes in v4:
- PATCH 1/2: Add more info for Ponyta custom label in commit.
- Link to v3:https://lore.kernel.org/all/20240904081501.2060933-1-cengjianeng at huaqin.corp-partner.google.com/

Changes in v3:
- PATCH 0/2: Add the modify records.
- PATCH 1/2: Modify lable to label.
- Link to v2:https://lore.kernel.org/all/20240903061603.3007289-1-cengjianeng at huaqin.corp-partner.google.com/

Changes in v2:
- PATCH 2/2: Modify the dtb name without rev2.
- Link to v1:https://lore.kernel.org/all/20240902125502.1844374-1-cengjianeng at huaqin.corp-partner.google.com/

Jianeng Ceng (2):
  dt-bindings: arm: mediatek: Add MT8186 Ponyta Chromebook
  arm64: dts: mediatek: Add MT8186 Ponyta Chromebooks

 .../devicetree/bindings/arm/mediatek.yaml     | 10 +++++
 arch/arm64/boot/dts/mediatek/Makefile         |  2 +
 .../mediatek/mt8186-corsola-ponyta-sku0.dts   | 23 ++++++++++
 .../mediatek/mt8186-corsola-ponyta-sku1.dts   | 27 ++++++++++++
 .../dts/mediatek/mt8186-corsola-ponyta.dtsi   | 44 +++++++++++++++++++
 5 files changed, 106 insertions(+)
 create mode 100644 arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku0.dts
 create mode 100644 arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku1.dts
 create mode 100644 arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta.dtsi

-- 
2.34.1



From cengjianeng at huaqin.corp-partner.google.com  Thu Sep 12 18:55:02 2024
From: cengjianeng at huaqin.corp-partner.google.com (Jianeng Ceng)
Date: Fri, 13 Sep 2024 09:55:02 +0800
Subject: [PATCH v6 1/2] dt-bindings: arm: mediatek: Add MT8186 Ponyta Chromebook
In-Reply-To: <20240913015503.4192806-1-cengjianeng@huaqin.corp-partner.google.com>
References: <20240913015503.4192806-1-cengjianeng@huaqin.corp-partner.google.com>
Message-ID: <20240913015503.4192806-2-cengjianeng@huaqin.corp-partner.google.com>

Ponyta is a custom label Chromebook based on MT8186. It is a
self-developed project of Huaqin and has no fixed OEM.

Acked-by: Krzysztof Kozlowski <krzysztof.kozlowski at linaro.org>
Signed-off-by: Jianeng Ceng <cengjianeng at huaqin.corp-partner.google.com>
---
Changes in v5:
- PATCH 1/2: Remove sku2147483647.
- Link to v4:https://lore.kernel.org/all/20240906085739.1322676-2-cengjianeng at huaqin.corp-partner.google.com/

Changes in v4:
- PATCH 1/2: Add more info for Ponyta custom label in commit.
- Link to v3:https://lore.kernel.org/all/20240904081501.2060933-1-cengjianeng at huaqin.corp-partner.google.com/

Changes in v3:
- PATCH 1/2: Modify lable to label.
- Link to v2:https://lore.kernel.org/all/20240903061603.3007289-1-cengjianeng at huaqin.corp-partner.google.com/

Chage since V2:
- No change.

---
 Documentation/devicetree/bindings/arm/mediatek.yaml | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/Documentation/devicetree/bindings/arm/mediatek.yaml b/Documentation/devicetree/bindings/arm/mediatek.yaml
index 1d4bb50fcd8d..43a824bee1b6 100644
--- a/Documentation/devicetree/bindings/arm/mediatek.yaml
+++ b/Documentation/devicetree/bindings/arm/mediatek.yaml
@@ -257,6 +257,16 @@ properties:
           - const: google,steelix-sku393218
           - const: google,steelix
           - const: mediatek,mt8186
+      - description: Google Ponyta (Custom label)
+        items:
+          - const: google,ponyta-sku0
+          - const: google,ponyta
+          - const: mediatek,mt8186
+      - description: Google Ponyta (Custom label)
+        items:
+          - const: google,ponyta-sku1
+          - const: google,ponyta
+          - const: mediatek,mt8186
       - description: Google Rusty (Lenovo 100e Chromebook Gen 4)
         items:
           - const: google,steelix-sku196609
-- 
2.34.1



From cengjianeng at huaqin.corp-partner.google.com  Thu Sep 12 18:55:03 2024
From: cengjianeng at huaqin.corp-partner.google.com (Jianeng Ceng)
Date: Fri, 13 Sep 2024 09:55:03 +0800
Subject: [PATCH v6 2/2] arm64: dts: mediatek: Add MT8186 Ponyta Chromebooks
In-Reply-To: <20240913015503.4192806-1-cengjianeng@huaqin.corp-partner.google.com>
References: <20240913015503.4192806-1-cengjianeng@huaqin.corp-partner.google.com>
Message-ID: <20240913015503.4192806-3-cengjianeng@huaqin.corp-partner.google.com>

MT8186 ponyta, known as huaqin custom label, is a
MT8186 based laptop. It is based on the "corsola" design.
It includes LTE, touchpad combinations.

Signed-off-by: Jianeng Ceng <cengjianeng at huaqin.corp-partner.google.com>
---
Changes in v6:
- PATCH 2/2: Remove prototype sku.
- PATCH 2/2: Disable the other trackpad to enable one of them.
- Link to v5:https://lore.kernel.org/all/20240909023148.1677936-3-cengjianeng at huaqin.corp-partner.google.com/

Changes in v5:
- PATCH 2/2: Remove sku2147483647.
- Link to v4:https://lore.kernel.org/all/20240906085739.1322676-3-cengjianeng at huaqin.corp-partner.google.com/

Chage since v3:
- No change.

Changes in v2:
- PATCH 2/2: Modify the dtb name without rev2.
- Link to v1:https://lore.kernel.org/all/20240902125502.1844374-1-cengjianeng at huaqin.corp-partner.google.com/

---
 arch/arm64/boot/dts/mediatek/Makefile         |  2 +
 .../mediatek/mt8186-corsola-ponyta-sku0.dts   | 23 ++++++++++
 .../mediatek/mt8186-corsola-ponyta-sku1.dts   | 27 ++++++++++++
 .../dts/mediatek/mt8186-corsola-ponyta.dtsi   | 44 +++++++++++++++++++
 4 files changed, 96 insertions(+)
 create mode 100644 arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku0.dts
 create mode 100644 arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku1.dts
 create mode 100644 arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta.dtsi

diff --git a/arch/arm64/boot/dts/mediatek/Makefile b/arch/arm64/boot/dts/mediatek/Makefile
index 8fd7b2bb7a15..50b5cf04d3ae 100644
--- a/arch/arm64/boot/dts/mediatek/Makefile
+++ b/arch/arm64/boot/dts/mediatek/Makefile
@@ -58,6 +58,8 @@ dtb-$(CONFIG_ARCH_MEDIATEK) += mt8183-pumpkin.dtb
 dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-magneton-sku393216.dtb
 dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-magneton-sku393217.dtb
 dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-magneton-sku393218.dtb
+dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-ponyta-sku0.dtb
+dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-ponyta-sku1.dtb
 dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-rusty-sku196608.dtb
 dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-steelix-sku131072.dtb
 dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-steelix-sku131073.dtb
diff --git a/arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku0.dts b/arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku0.dts
new file mode 100644
index 000000000000..f6448e91436a
--- /dev/null
+++ b/arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku0.dts
@@ -0,0 +1,23 @@
+// SPDX-License-Identifier: (GPL-2.0 OR MIT)
+/*
+ * Copyright 2023 Google LLC
+ */
+
+/dts-v1/;
+#include "mt8186-corsola-ponyta.dtsi"
+
+/ {
+	model = "Google Ponyta sku0/unprovisioned board";
+	compatible = "google,ponyta-sku0", "google,ponyta", "mediatek,mt8186";
+};
+
+&i2c2 {
+	touchpad at 2c {
+		compatible = "hid-over-i2c";
+		reg = <0x2c>;
+		hid-descr-addr = <0x20>;
+		interrupts-extended = <&pio 11 IRQ_TYPE_LEVEL_LOW>;
+		vcc-supply = <&pp3300_s3>;
+		wakeup-source;
+	};
+};
diff --git a/arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku1.dts b/arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku1.dts
new file mode 100644
index 000000000000..203ee109bbf7
--- /dev/null
+++ b/arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku1.dts
@@ -0,0 +1,27 @@
+// SPDX-License-Identifier: (GPL-2.0 OR MIT)
+/*
+ * Copyright 2023 Google LLC
+ */
+
+/dts-v1/;
+#include "mt8186-corsola-ponyta.dtsi"
+
+/ {
+	model = "Google Ponyta sku1 board";
+	compatible = "google,ponyta-sku1", "google,ponyta", "mediatek,mt8186";
+};
+
+&i2c2 {
+	touchpad at 15 {
+		compatible = "elan,ekth3000";
+		reg = <0x15>;
+		interrupt-parent = <&pio>;
+		interrupts = <11 IRQ_TYPE_LEVEL_LOW>;
+		vcc-supply = <&pp3300_s3>;
+		wakeup-source;
+	};
+};
+
+&usb_c1 {
+	status = "disabled";
+};
diff --git a/arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta.dtsi b/arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta.dtsi
new file mode 100644
index 000000000000..59594022331e
--- /dev/null
+++ b/arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta.dtsi
@@ -0,0 +1,44 @@
+// SPDX-License-Identifier: (GPL-2.0 OR MIT)
+/*
+ * Copyright 2023 Google LLC
+ */
+
+/dts-v1/;
+#include "mt8186-corsola-steelix.dtsi"
+
+&keyboard_controller {
+	function-row-physmap = <
+		MATRIX_KEY(0x00, 0x02, 0)	/* T1 */
+		MATRIX_KEY(0x03, 0x02, 0)	/* T2 */
+		MATRIX_KEY(0x02, 0x02, 0)	/* T3 */
+		MATRIX_KEY(0x01, 0x02, 0)	/* T4 */
+		MATRIX_KEY(0x03, 0x04, 0)	/* T5 */
+		MATRIX_KEY(0x02, 0x04, 0)	/* T6 */
+		MATRIX_KEY(0x01, 0x04, 0)	/* T7 */
+		MATRIX_KEY(0x00, 0x04, 0)	/* T8 */
+		MATRIX_KEY(0x00, 0x01, 0)	/* T9 */
+		MATRIX_KEY(0x02, 0x09, 0)	/* T10 */
+		MATRIX_KEY(0x01, 0x09, 0)	/* T11 */
+		MATRIX_KEY(0x01, 0x05, 0)	/* T12 */
+	>;
+
+	linux,keymap = <
+		CROS_STD_MAIN_KEYMAP
+		MATRIX_KEY(0x00, 0x02, KEY_BACK)
+		MATRIX_KEY(0x03, 0x02, KEY_REFRESH)
+		MATRIX_KEY(0x02, 0x02, KEY_ZOOM)
+		MATRIX_KEY(0x01, 0x02, KEY_SCALE)
+		MATRIX_KEY(0x03, 0x04, KEY_SYSRQ)
+		MATRIX_KEY(0x02, 0x04, KEY_BRIGHTNESSDOWN)
+		MATRIX_KEY(0x01, 0x04, KEY_BRIGHTNESSUP)
+		MATRIX_KEY(0x00, 0x04, KEY_PLAYPAUSE)
+		MATRIX_KEY(0x00, 0x01, KEY_MICMUTE)
+		MATRIX_KEY(0x02, 0x09, KEY_MUTE)
+		MATRIX_KEY(0x01, 0x09, KEY_VOLUMEDOWN)
+		MATRIX_KEY(0x01, 0x05, KEY_VOLUMEUP)
+	>;
+};
+
+&mt6366codec {
+	mediatek,dmic-mode = <1>; /* one-wire */
+};
-- 
2.34.1



From Shawn.Sung at mediatek.com  Thu Sep 12 19:56:01 2024
From: Shawn.Sung at mediatek.com (=?utf-8?B?U2hhd24gU3VuZyAo5a6L5a2d6KyZKQ==?=)
Date: Fri, 13 Sep 2024 02:56:01 +0000
Subject: [PATCH v4 0/5] Support alpha blending in MTK display driver
In-Reply-To: <6c9b7f85-f92d-44ed-ae9d-00f6d55ea614@gmail.com>
References: <20240717-alpha-blending-v4-0-4b1c806c0749@mediatek.com>
	 <CAAOTY_8ThuusfHk9Gd5pFP8VhJkG2seuJmkFiruK1rPQFZGBzg@mail.gmail.com>
	 <6c9b7f85-f92d-44ed-ae9d-00f6d55ea614@gmail.com>
Message-ID: <26504ee033e506db17fc130d08b2f85a187af2e7.camel@mediatek.com>

Hi Alper,

On Thu, 2024-09-12 at 23:29 +0300, Alper Nebi Yasak wrote:
> Hi,
> 
> On 2024-07-31 16:34 +03:00, Chun-Kuang Hu wrote:
> > Hi, Shawn:
> > 
> > Hsiao Chien Sung via B4 Relay
> > <devnull+shawn.sung.mediatek.com at kernel.org> ? 2024?7?17? ??
> > ??1:24???
> > > 
> > > Support "Pre-multiplied" and "None" blend mode on MediaTek's
> > > chips by
> > > adding correct blend mode property when the planes init.
> > > Before this patch, only the "Coverage" mode (default) is
> > > supported.
> > 
> > For the whole series, applied to mediatek-drm-next [1], thanks.
> > 
> > [1] 
> > https://git.kernel.org/pub/scm/linux/kernel/git/chunkuang.hu/linux.git/log/?h=mediatek-drm-next
> 
> I am seeing broken colors on an MT8173 Chromebook with next-20240912,
> which goes away if I git-revert this series (commits 1f66fe62cc09
> eb17c5909481 a3f7f7ef4bfe 59e9d9de25f0 4225d5d5e779).

Thank you for your feedback. I apologize for the delay in my response;
I was just notified of your email by my colleague.

> 
> To illustrate, I took a picture [1] of some color mixing diagrams
> from
> Wikipedia [2]. Do you have an idea of what goes wrong?

Based on the provided pictures, it appears that this issue is related
to the way the MT8173 chip handles alpha channel (ARGB -> RGBA), which
differes from the behavior of later chips.

> 
> (I'm busy with too many things so I don't want to debug it now...)
> 
> [1] https://i.imgur.com/tNFvovB.jpeg
> [2] https://en.wikipedia.org/wiki/Color_space#Generic

We will either submit a new fix ASAP or revert this series as a first
step.

Best regards,
Shawn

From Jason-JH.Lin at mediatek.com  Thu Sep 12 19:56:21 2024
From: Jason-JH.Lin at mediatek.com (=?utf-8?B?SmFzb24tSkggTGluICjmnpfnnb/npaUp?=)
Date: Fri, 13 Sep 2024 02:56:21 +0000
Subject: [PATCH v4 0/5] Support alpha blending in MTK display driver
In-Reply-To: <a2cf4e9b9c3343a7398521760934f1740505aa13.camel@mediatek.com>
References: <20240717-alpha-blending-v4-0-4b1c806c0749@mediatek.com>
	 <CAAOTY_8ThuusfHk9Gd5pFP8VhJkG2seuJmkFiruK1rPQFZGBzg@mail.gmail.com>
	 <6c9b7f85-f92d-44ed-ae9d-00f6d55ea614@gmail.com>
	 <a2cf4e9b9c3343a7398521760934f1740505aa13.camel@mediatek.com>
Message-ID: <13f6dbc5d460e746352f68b001e85f870c89993d.camel@mediatek.com>

Hi Alper,

I think that's a platform issue because it works find in my MT8188
platform, but I don't have any MT8173 platform.

Can you help me test the fix patch in your MT8173 platform?
I'll provide a fix patch in 2 weeks via Google Chat.

Regards,
Jason-JH.Lin

On Fri, 2024-09-13 at 01:25 +0000, CK Hu (???) wrote:
> Hi, Jason:
> 
> Please help to fix this issue.
> Otherwise, I would revert this series.
> 
> Regards,
> CK
> 
> On Thu, 2024-09-12 at 23:29 +0300, Alper Nebi Yasak wrote:
> >  	 
> > External email : Please do not click links or open attachments
> > until you have verified the sender or the content.
> >  Hi,
> > 
> > On 2024-07-31 16:34 +03:00, Chun-Kuang Hu wrote:
> > > Hi, Shawn:
> > > 
> > > Hsiao Chien Sung via B4 Relay
> > > <devnull+shawn.sung.mediatek.com at kernel.org> ? 2024?7?17? ??
> > > ??1:24???
> > > > 
> > > > Support "Pre-multiplied" and "None" blend mode on MediaTek's
> > > > chips by
> > > > adding correct blend mode property when the planes init.
> > > > Before this patch, only the "Coverage" mode (default) is
> > > > supported.
> > > 
> > > For the whole series, applied to mediatek-drm-next [1], thanks.
> > > 
> > > [1] 
> > > https://git.kernel.org/pub/scm/linux/kernel/git/chunkuang.hu/linux.git/log/?h=mediatek-drm-next
> > 
> > I am seeing broken colors on an MT8173 Chromebook with next-
> > 20240912,
> > which goes away if I git-revert this series (commits 1f66fe62cc09
> > eb17c5909481 a3f7f7ef4bfe 59e9d9de25f0 4225d5d5e779).
> > 
> > To illustrate, I took a picture [1] of some color mixing diagrams
> > from
> > Wikipedia [2]. Do you have an idea of what goes wrong?
> > 
> > (I'm busy with too many things so I don't want to debug it now...)
> > 
> > [1] https://i.imgur.com/tNFvovB.jpeg
> > [2] https://en.wikipedia.org/wiki/Color_space#Generic
> > 

From cengjianeng at huaqin.corp-partner.google.com  Thu Sep 12 20:15:03 2024
From: cengjianeng at huaqin.corp-partner.google.com (Jianeng Ceng)
Date: Fri, 13 Sep 2024 11:15:03 +0800
Subject: [PATCH v7 0/2] arm64: dts: mediatek: Add MT8186 Ponyta
Message-ID: <20240913031505.372868-1-cengjianeng@huaqin.corp-partner.google.com>

This is v7 of the MT8186 Chromebook device tree series.
---
Changes in v7:
- PATCH 2/2: Remove prototype sku.
- PATCH 2/2: Disable the other trackpad to enable one of them.
- Link to v5:https://lore.kernel.org/all/20240913015503.4192806-1-cengjianeng at huaqin.corp-partner.google.com/

Changes in v6:
- No change.

Changes in v5:
- PATCH 1/2: Remove sku2147483647.
- PATCH 2/2: Remove sku2147483647.
- Link to v4:https://lore.kernel.org/all/20240906085739.1322676-1-cengjianeng at huaqin.corp-partner.google.com/

Changes in v4:
- PATCH 1/2: Add more info for Ponyta custom label in commit.
- Link to v3:https://lore.kernel.org/all/20240904081501.2060933-1-cengjianeng at huaqin.corp-partner.google.com/

Changes in v3:
- PATCH 0/2: Add the modify records.
- PATCH 1/2: Modify lable to label.
- Link to v2:https://lore.kernel.org/all/20240903061603.3007289-1-cengjianeng at huaqin.corp-partner.google.com/

Changes in v2:
- PATCH 2/2: Modify the dtb name without rev2.
- Link to v1:https://lore.kernel.org/all/20240902125502.1844374-1-cengjianeng at huaqin.corp-partner.google.com/

Jianeng Ceng (2):
  dt-bindings: arm: mediatek: Add MT8186 Ponyta Chromebook
  arm64: dts: mediatek: Add MT8186 Ponyta Chromebooks

 .../devicetree/bindings/arm/mediatek.yaml     | 10 +++++
 arch/arm64/boot/dts/mediatek/Makefile         |  2 +
 .../mediatek/mt8186-corsola-ponyta-sku0.dts   | 18 ++++++++
 .../mediatek/mt8186-corsola-ponyta-sku1.dts   | 22 ++++++++++
 .../dts/mediatek/mt8186-corsola-ponyta.dtsi   | 44 +++++++++++++++++++
 5 files changed, 96 insertions(+)
 create mode 100644 arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku0.dts
 create mode 100644 arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku1.dts
 create mode 100644 arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta.dtsi

-- 
2.34.1



From cengjianeng at huaqin.corp-partner.google.com  Thu Sep 12 20:15:04 2024
From: cengjianeng at huaqin.corp-partner.google.com (Jianeng Ceng)
Date: Fri, 13 Sep 2024 11:15:04 +0800
Subject: [PATCH v7 1/2] dt-bindings: arm: mediatek: Add MT8186 Ponyta Chromebook
In-Reply-To: <20240913031505.372868-1-cengjianeng@huaqin.corp-partner.google.com>
References: <20240913031505.372868-1-cengjianeng@huaqin.corp-partner.google.com>
Message-ID: <20240913031505.372868-2-cengjianeng@huaqin.corp-partner.google.com>

Ponyta is a custom label Chromebook based on MT8186. It is a
self-developed project of Huaqin and has no fixed OEM.

Acked-by: Krzysztof Kozlowski <krzysztof.kozlowski at linaro.org>
Signed-off-by: Jianeng Ceng <cengjianeng at huaqin.corp-partner.google.com>
---
Changes in v5:
- PATCH 1/2: Remove sku2147483647.
- Link to v4:https://lore.kernel.org/all/20240906085739.1322676-2-cengjianeng at huaqin.corp-partner.google.com/

Changes in v4:
- PATCH 1/2: Add more info for Ponyta custom label in commit.
- Link to v3:https://lore.kernel.org/all/20240904081501.2060933-1-cengjianeng at huaqin.corp-partner.google.com/

Changes in v3:
- PATCH 1/2: Modify lable to label.
- Link to v2:https://lore.kernel.org/all/20240903061603.3007289-1-cengjianeng at huaqin.corp-partner.google.com/

Chage since V2:
- No change.

---
 Documentation/devicetree/bindings/arm/mediatek.yaml | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/Documentation/devicetree/bindings/arm/mediatek.yaml b/Documentation/devicetree/bindings/arm/mediatek.yaml
index 1d4bb50fcd8d..43a824bee1b6 100644
--- a/Documentation/devicetree/bindings/arm/mediatek.yaml
+++ b/Documentation/devicetree/bindings/arm/mediatek.yaml
@@ -257,6 +257,16 @@ properties:
           - const: google,steelix-sku393218
           - const: google,steelix
           - const: mediatek,mt8186
+      - description: Google Ponyta (Custom label)
+        items:
+          - const: google,ponyta-sku0
+          - const: google,ponyta
+          - const: mediatek,mt8186
+      - description: Google Ponyta (Custom label)
+        items:
+          - const: google,ponyta-sku1
+          - const: google,ponyta
+          - const: mediatek,mt8186
       - description: Google Rusty (Lenovo 100e Chromebook Gen 4)
         items:
           - const: google,steelix-sku196609
-- 
2.34.1



From cengjianeng at huaqin.corp-partner.google.com  Thu Sep 12 20:15:05 2024
From: cengjianeng at huaqin.corp-partner.google.com (Jianeng Ceng)
Date: Fri, 13 Sep 2024 11:15:05 +0800
Subject: [PATCH v7 2/2] arm64: dts: mediatek: Add MT8186 Ponyta Chromebooks
In-Reply-To: <20240913031505.372868-1-cengjianeng@huaqin.corp-partner.google.com>
References: <20240913031505.372868-1-cengjianeng@huaqin.corp-partner.google.com>
Message-ID: <20240913031505.372868-3-cengjianeng@huaqin.corp-partner.google.com>

MT8186 ponyta, known as huaqin custom label, is a
MT8186 based laptop. It is based on the "corsola" design.
It includes LTE, touchpad combinations.

Signed-off-by: Jianeng Ceng <cengjianeng at huaqin.corp-partner.google.com>
---
Changes in v7:
- PATCH 2/2: Remove prototype sku.
- PATCH 2/2: Disable the other trackpad to enable one of them.
- Link to v5:https://lore.kernel.org/all/20240909023148.1677936-3-cengjianeng at huaqin.corp-partner.google.com/

Changes in v6:
- No change.

Changes in v5:
- PATCH 2/2: Remove sku2147483647.
- Link to v4:https://lore.kernel.org/all/20240906085739.1322676-3-cengjianeng at huaqin.corp-partner.google.com/

Chage since v3:
- No change.

Changes in v2:
- PATCH 2/2: Modify the dtb name without rev2.
- Link to v1:https://lore.kernel.org/all/20240902125502.1844374-1-cengjianeng at huaqin.corp-partner.google.com/

---
 arch/arm64/boot/dts/mediatek/Makefile         |  2 +
 .../mediatek/mt8186-corsola-ponyta-sku0.dts   | 18 ++++++++
 .../mediatek/mt8186-corsola-ponyta-sku1.dts   | 22 ++++++++++
 .../dts/mediatek/mt8186-corsola-ponyta.dtsi   | 44 +++++++++++++++++++
 4 files changed, 86 insertions(+)
 create mode 100644 arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku0.dts
 create mode 100644 arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku1.dts
 create mode 100644 arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta.dtsi

diff --git a/arch/arm64/boot/dts/mediatek/Makefile b/arch/arm64/boot/dts/mediatek/Makefile
index 8fd7b2bb7a15..50b5cf04d3ae 100644
--- a/arch/arm64/boot/dts/mediatek/Makefile
+++ b/arch/arm64/boot/dts/mediatek/Makefile
@@ -58,6 +58,8 @@ dtb-$(CONFIG_ARCH_MEDIATEK) += mt8183-pumpkin.dtb
 dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-magneton-sku393216.dtb
 dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-magneton-sku393217.dtb
 dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-magneton-sku393218.dtb
+dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-ponyta-sku0.dtb
+dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-ponyta-sku1.dtb
 dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-rusty-sku196608.dtb
 dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-steelix-sku131072.dtb
 dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-steelix-sku131073.dtb
diff --git a/arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku0.dts b/arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku0.dts
new file mode 100644
index 000000000000..986498af4c70
--- /dev/null
+++ b/arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku0.dts
@@ -0,0 +1,18 @@
+// SPDX-License-Identifier: (GPL-2.0 OR MIT)
+/*
+ * Copyright 2023 Google LLC
+ */
+
+/dts-v1/;
+#include "mt8186-corsola-ponyta.dtsi"
+
+/ {
+	model = "Google Ponyta sku0 board";
+	compatible = "google,ponyta-sku0", "google,ponyta", "mediatek,mt8186";
+};
+
+&i2c2 {
+	trackpad at 15 {
+		status = "disabled";
+	};
+};
diff --git a/arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku1.dts b/arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku1.dts
new file mode 100644
index 000000000000..ff5eea0ddeb4
--- /dev/null
+++ b/arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku1.dts
@@ -0,0 +1,22 @@
+// SPDX-License-Identifier: (GPL-2.0 OR MIT)
+/*
+ * Copyright 2023 Google LLC
+ */
+
+/dts-v1/;
+#include "mt8186-corsola-ponyta.dtsi"
+
+/ {
+	model = "Google Ponyta sku1 board";
+	compatible = "google,ponyta-sku1", "google,ponyta", "mediatek,mt8186";
+};
+
+&i2c2 {
+	trackpad at 2c {
+		status = "disabled";
+	};
+};
+
+&usb_c1 {
+	status = "disabled";
+};
diff --git a/arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta.dtsi b/arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta.dtsi
new file mode 100644
index 000000000000..59594022331e
--- /dev/null
+++ b/arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta.dtsi
@@ -0,0 +1,44 @@
+// SPDX-License-Identifier: (GPL-2.0 OR MIT)
+/*
+ * Copyright 2023 Google LLC
+ */
+
+/dts-v1/;
+#include "mt8186-corsola-steelix.dtsi"
+
+&keyboard_controller {
+	function-row-physmap = <
+		MATRIX_KEY(0x00, 0x02, 0)	/* T1 */
+		MATRIX_KEY(0x03, 0x02, 0)	/* T2 */
+		MATRIX_KEY(0x02, 0x02, 0)	/* T3 */
+		MATRIX_KEY(0x01, 0x02, 0)	/* T4 */
+		MATRIX_KEY(0x03, 0x04, 0)	/* T5 */
+		MATRIX_KEY(0x02, 0x04, 0)	/* T6 */
+		MATRIX_KEY(0x01, 0x04, 0)	/* T7 */
+		MATRIX_KEY(0x00, 0x04, 0)	/* T8 */
+		MATRIX_KEY(0x00, 0x01, 0)	/* T9 */
+		MATRIX_KEY(0x02, 0x09, 0)	/* T10 */
+		MATRIX_KEY(0x01, 0x09, 0)	/* T11 */
+		MATRIX_KEY(0x01, 0x05, 0)	/* T12 */
+	>;
+
+	linux,keymap = <
+		CROS_STD_MAIN_KEYMAP
+		MATRIX_KEY(0x00, 0x02, KEY_BACK)
+		MATRIX_KEY(0x03, 0x02, KEY_REFRESH)
+		MATRIX_KEY(0x02, 0x02, KEY_ZOOM)
+		MATRIX_KEY(0x01, 0x02, KEY_SCALE)
+		MATRIX_KEY(0x03, 0x04, KEY_SYSRQ)
+		MATRIX_KEY(0x02, 0x04, KEY_BRIGHTNESSDOWN)
+		MATRIX_KEY(0x01, 0x04, KEY_BRIGHTNESSUP)
+		MATRIX_KEY(0x00, 0x04, KEY_PLAYPAUSE)
+		MATRIX_KEY(0x00, 0x01, KEY_MICMUTE)
+		MATRIX_KEY(0x02, 0x09, KEY_MUTE)
+		MATRIX_KEY(0x01, 0x09, KEY_VOLUMEDOWN)
+		MATRIX_KEY(0x01, 0x05, KEY_VOLUMEUP)
+	>;
+};
+
+&mt6366codec {
+	mediatek,dmic-mode = <1>; /* one-wire */
+};
-- 
2.34.1



From alpernebiyasak at gmail.com  Thu Sep 12 22:40:23 2024
From: alpernebiyasak at gmail.com (Alper Nebi Yasak)
Date: Fri, 13 Sep 2024 08:40:23 +0300
Subject: [PATCH v4 0/5] Support alpha blending in MTK display driver
In-Reply-To: <13f6dbc5d460e746352f68b001e85f870c89993d.camel@mediatek.com>
References: <20240717-alpha-blending-v4-0-4b1c806c0749@mediatek.com>
 <CAAOTY_8ThuusfHk9Gd5pFP8VhJkG2seuJmkFiruK1rPQFZGBzg@mail.gmail.com>
 <6c9b7f85-f92d-44ed-ae9d-00f6d55ea614@gmail.com>
 <a2cf4e9b9c3343a7398521760934f1740505aa13.camel@mediatek.com>
 <13f6dbc5d460e746352f68b001e85f870c89993d.camel@mediatek.com>
Message-ID: <69776448-0328-4880-9108-54466e40ddd9@gmail.com>

Hi,

On 2024-09-13 05:56 +03:00, Jason-JH Lin (???) wrote:
> Hi Alper,
> 
> I think that's a platform issue because it works find in my MT8188
> platform, but I don't have any MT8173 platform.
> 
> Can you help me test the fix patch in your MT8173 platform?
> I'll provide a fix patch in 2 weeks via Google Chat.
> 
> Regards,
> Jason-JH.Lin

I replied over Google Chat, but to make it clear for others on the
mailing list: Yes, I'll try to test patches when you send them.

> On Fri, 2024-09-13 at 01:25 +0000, CK Hu (???) wrote:
>> Hi, Jason:
>> 
>> Please help to fix this issue.
>> Otherwise, I would revert this series.
>> 
>> Regards,
>> CK
>> 
>> On Thu, 2024-09-12 at 23:29 +0300, Alper Nebi Yasak wrote:
>> >   
>> > External email : Please do not click links or open attachments
>> > until you have verified the sender or the content.
>> >  Hi,
>> > 
>> > On 2024-07-31 16:34 +03:00, Chun-Kuang Hu wrote:
>> > > Hi, Shawn:
>> > > 
>> > > Hsiao Chien Sung via B4 Relay
>> > > <devnull+shawn.sung.mediatek.com at kernel.org> ? 2024?7?17? ??
>> > > ??1:24???
>> > > > 
>> > > > Support "Pre-multiplied" and "None" blend mode on MediaTek's
>> > > > chips by
>> > > > adding correct blend mode property when the planes init.
>> > > > Before this patch, only the "Coverage" mode (default) is
>> > > > supported.
>> > > 
>> > > For the whole series, applied to mediatek-drm-next [1], thanks.
>> > > 
>> > > [1] 
>> > > https://git.kernel.org/pub/scm/linux/kernel/git/chunkuang.hu/linux.git/log/?h=mediatek-drm-next
>> > 
>> > I am seeing broken colors on an MT8173 Chromebook with next-
>> > 20240912,
>> > which goes away if I git-revert this series (commits 1f66fe62cc09
>> > eb17c5909481 a3f7f7ef4bfe 59e9d9de25f0 4225d5d5e779).
>> > 
>> > To illustrate, I took a picture [1] of some color mixing diagrams
>> > from
>> > Wikipedia [2]. Do you have an idea of what goes wrong?
>> > 
>> > (I'm busy with too many things so I don't want to debug it now...)
>> > 
>> > [1] https://i.imgur.com/tNFvovB.jpeg
>> > [2] https://en.wikipedia.org/wiki/Color_space#Generic


From peter.wang at mediatek.com  Fri Sep 13 00:10:05 2024
From: peter.wang at mediatek.com (=?utf-8?B?UGV0ZXIgV2FuZyAo546L5L+h5Y+LKQ==?=)
Date: Fri, 13 Sep 2024 07:10:05 +0000
Subject: [PATCH v4 2/2] ufs: core: requeue aborted request
In-Reply-To: <6203d7c9-b33c-4bf1-aca3-5fc8ba5636b9@acm.org>
References: <20240910073035.25974-1-peter.wang@mediatek.com>
	 <20240910073035.25974-3-peter.wang@mediatek.com>
	 <e42abf07-ba6b-4301-8717-8d5b01d56640@acm.org>
	 <04e392c00986ac798e881dcd347ff5045cf61708.camel@mediatek.com>
	 <858c4b6b-fcbc-4d51-8641-051aeda387c5@acm.org>
	 <524e9da9196cc0acf497ff87eba3a8043b780332.camel@mediatek.com>
	 <6203d7c9-b33c-4bf1-aca3-5fc8ba5636b9@acm.org>
Message-ID: <6fc025d7ffb9d702a117381fb5da318b40a24246.camel@mediatek.com>

On Thu, 2024-09-12 at 14:17 -0700, Bart Van Assche wrote:
>  	 
> External email : Please do not click links or open attachments until
> you have verified the sender or the content.
>  On 9/12/24 6:31 AM, Peter Wang (???) wrote:
> > in SDB mode:
> > ufshcd_utrl_clear set UTRLC, Mediatek host controller
> > (may not all host controller) will post response with OCS ABORTED.
> > 
> > In both cases, we have an interrupt sent to the host, and there
> > may be a race condition before we set this flag for requeue.
> > So I need to set this flag before ufshcd_clear_cmd.
> 
> If a completion interrupt is sent to the host if a command has been
> cleared in SDB mode (I doubt this is what happens), I think that's a
> severe controller bug. A UFSHCI controller is not allowed to send a
> completion interrupt to the host if a command is cleared by writing
> into
> the UTRLCLR register.
> 
> Thanks,
> 
> Bart.

Hi Bart,

Because the MediaTek UFS controller uses UTRLCLR to clear 
commands and fills OCS with ABORTED. 

Regarding the specification of UTRCS:
This bit is set to '1' by the host controller upon one of the
following:
	Overall command Status (OCS) of the completed command is not 
	equal to 'SUCCESS' even if its UTRD Interrupt bit set to '0'

So, MediaTek host controller will send interrupt in this case.

Thanks.
Peter

From peter.wang at mediatek.com  Fri Sep 13 00:18:36 2024
From: peter.wang at mediatek.com (=?utf-8?B?UGV0ZXIgV2FuZyAo546L5L+h5Y+LKQ==?=)
Date: Fri, 13 Sep 2024 07:18:36 +0000
Subject: [PATCH v6 2/2] ufs: core: requeue aborted request
In-Reply-To: <cad4804b-2102-4c95-9387-a63ff847cf21@acm.org>
References: <20240911095622.19225-1-peter.wang@mediatek.com>
	 <20240911095622.19225-3-peter.wang@mediatek.com>
	 <55d2cca5-0e30-4734-aa25-d5f5cdfbfd93@acm.org>
	 <d3306f9d2b88c5b6ae8d2104041e5c941898dee5.camel@mediatek.com>
	 <cad4804b-2102-4c95-9387-a63ff847cf21@acm.org>
Message-ID: <0e4332fefcb20ca50ff6716d0a41b26b708ac605.camel@mediatek.com>

On Thu, 2024-09-12 at 14:11 -0700, Bart Van Assche wrote:
>  	 
> External email : Please do not click links or open attachments until
> you have verified the sender or the content.
>  On 9/12/24 6:49 AM, Peter Wang (???) wrote:
> > On Wed, 2024-09-11 at 12:37 -0700, Bart Van Assche wrote:
> [ ... ]
> > So at this time, the device will not have a corresponding
> > response coming back. The host controller will automatically
> > fill in the response for the corresponding command based on
> > the results of SQ cleanup (MCQ) or UTRLCLR (DBR, mediatek),
> > with the COS content being ABORTED by interrupt.
> 
> I don't think so. In SDB mode, writing into the UTRLCLR register does
> NOT cause the ABORTED status to be written into the OCS field. Even
> if
> there would be UFSHCI controllers that do this, the UFSHCI
> specification
> does not require this behavior and hence the UFS driver should not
> assume this behavior.
> 

Hi Bart,

Okay, I will add MCQ check only set this flag in MCQ mode.


> >> The above change will cause lrbp->abort_initiated_by_eh to be set
> not
> >> only if the UFS error handler decides to abort a command but also
> if
> >> the
> >> SCSI core decides to abort a command. I think this is wrong.
> > 
> > Sorry, I might have missed something, but I didn't see
> > scsi abort (ufshcd_abort) calling ufshcd_set_eh_in_progress.
> > So, during a SCSI abort, ufshcd_eh_in_progress(hba)
> > should return false and not set this flag, right?
> 
> I think you are right so please ignore my comment above.
> 
> > Additionally, SCSI abort (ufshcd_abort) will have different
> > return values for MCQ mode and DBR mode when the device
> > does not respond with a response.
> > MCQ mode will receivce OCS_ABORTED (nullify)
> > case OCS_ABORTED:
> > result |= DID_ABORT << 16;
> > break;
> 
> No. ufshcd_abort() submits an abort TMF and the OCS status is not
> modified if the abort TMF succeeds.
> 

Yes, TMF won't update the OCS status.
MCQ mode update OCS status by 
1. nullify: ufshcd_mcq_nullify_sqe
2. sq cleanup: ufshcd_mcq_sq_cleanup
In both case, host will fills OCS with ABORTED.



> > But DBR mode, OCS won't change, it is 0x0F
> > case OCS_INVALID_COMMAND_STATUS:
> > result |= DID_REQUEUE << 16;
> > break;
> > In this case, should we also return DID_ABORT for DBR mode?
> 
> The above code comes from ufshcd_transfer_rsp_status(), isn't it?
> ufshcd_transfer_rsp_status() should not be called if the SCSI core
> aborts a SCSI command (ufshcd_abort()). It is not allowed to call
> scsi_done() from a SCSI abort handler like ufshcd_abort(). SCSI
> abort handlers must return SUCCESS, FAILED or FAST_IO_FAIL and let
> the SCSI core decide whether to complete or whether to resubmit the
> SCSI command.
> 


Yes, it is from ufshcd_transfer_rsp_status, another ISR process.

Regarding the specification of UTRLDBR:
When a transfer request is "completed" (with success or error),
the corresponding bit is cleared to '0' by the host controller.

ufshcd_abort is error case that host controller clear UTRLDBR 
tag bit by UTRLCLR.

Regarding the specification of UTRCS:
This bit is set to '1' by the host controller upon one of the
following:
	Completion of a UTP transfer request with its UTRD
	Interrupt bit set to "1"
	Overall command Status (OCS) of the completed command is not 
	equal to 'SUCCESS' even if its UTRD Interrupt bit set to '0'

So, this case is transfer request is "completed" with error.
Whether the OCS is 'ABORTED' or 'INVALID_OCS_VALUE'
We should always receive an interrupt upon completion 
becasue UTRCS will set to '1'


> Thanks,
> 
> Bart.

From neil.armstrong at linaro.org  Fri Sep 13 00:43:34 2024
From: neil.armstrong at linaro.org (Neil Armstrong)
Date: Fri, 13 Sep 2024 09:43:34 +0200
Subject: [PATCH 5/5] drm/bridge: ti-dlpc3433: constify regmap_config
In-Reply-To: <20240908-regmap-config-const-v1-5-28f349004811@linaro.org>
References: <20240908-regmap-config-const-v1-0-28f349004811@linaro.org>
 <20240908-regmap-config-const-v1-5-28f349004811@linaro.org>
Message-ID: <e455aac1-d7fe-47a3-b3ec-e382b2de9b82@linaro.org>

On 08/09/2024 16:21, Krzysztof Kozlowski wrote:
> Mark local static 'struct regmap_config' as const for safer and more
> obvious code.
> 
> Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski at linaro.org>
> ---
>   drivers/gpu/drm/bridge/ti-dlpc3433.c | 2 +-
>   1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/bridge/ti-dlpc3433.c b/drivers/gpu/drm/bridge/ti-dlpc3433.c
> index 6b559e071301..a0a1b5dd794e 100644
> --- a/drivers/gpu/drm/bridge/ti-dlpc3433.c
> +++ b/drivers/gpu/drm/bridge/ti-dlpc3433.c
> @@ -94,7 +94,7 @@ static const struct regmap_access_table dlpc_volatile_table = {
>   	.n_yes_ranges = ARRAY_SIZE(dlpc_volatile_ranges),
>   };
>   
> -static struct regmap_config dlpc_regmap_config = {
> +static const struct regmap_config dlpc_regmap_config = {
>   	.reg_bits		= 8,
>   	.val_bits		= 8,
>   	.max_register		= WR_DSI_PORT_EN,
> 

Reviewed-by: Neil Armstrong <neil.armstrong at linaro.org>


From neil.armstrong at linaro.org  Fri Sep 13 01:20:05 2024
From: neil.armstrong at linaro.org (Neil Armstrong)
Date: Fri, 13 Sep 2024 10:20:05 +0200
Subject: [PATCH 3/5] drm/fsl-dcu: constify regmap_config
In-Reply-To: <20240908-regmap-config-const-v1-3-28f349004811@linaro.org>
References: <20240908-regmap-config-const-v1-0-28f349004811@linaro.org>
 <20240908-regmap-config-const-v1-3-28f349004811@linaro.org>
Message-ID: <fa108de3-66c3-4dc6-b241-06ee535198f1@linaro.org>

On 08/09/2024 16:21, Krzysztof Kozlowski wrote:
> Mark local static 'struct regmap_config' as const for safer and more
> obvious code.
> 
> Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski at linaro.org>
> ---
>   drivers/gpu/drm/fsl-dcu/fsl_tcon.c | 2 +-
>   1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/fsl-dcu/fsl_tcon.c b/drivers/gpu/drm/fsl-dcu/fsl_tcon.c
> index 9eb5abaf7d66..49bbd00c77ae 100644
> --- a/drivers/gpu/drm/fsl-dcu/fsl_tcon.c
> +++ b/drivers/gpu/drm/fsl-dcu/fsl_tcon.c
> @@ -29,7 +29,7 @@ void fsl_tcon_bypass_enable(struct fsl_tcon *tcon)
>   			   FSL_TCON_CTRL1_TCON_BYPASS);
>   }
>   
> -static struct regmap_config fsl_tcon_regmap_config = {
> +static const struct regmap_config fsl_tcon_regmap_config = {
>   	.reg_bits = 32,
>   	.reg_stride = 4,
>   	.val_bits = 32,
> 

Reviewed-by: Neil Armstrong <neil.armstrong at linaro.org>


From angelogioacchino.delregno at collabora.com  Fri Sep 13 01:52:00 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Fri, 13 Sep 2024 08:52:00 +0000
Subject: [PATCH v7 2/2] arm64: dts: mediatek: Add MT8186 Ponyta
 Chromebooks
In-Reply-To: <20240913031505.372868-3-cengjianeng@huaqin.corp-partner.google.com>
References: <20240913031505.372868-1-cengjianeng@huaqin.corp-partner.google.com>
 <20240913031505.372868-3-cengjianeng@huaqin.corp-partner.google.com>
Message-ID: <01020191ea950641-b277d24e-52ee-4699-a074-8604bbd09021-000000@eu-west-1.amazonses.com>

Il 13/09/24 05:15, Jianeng Ceng ha scritto:
> MT8186 ponyta, known as huaqin custom label, is a

MT8186 Ponyta is a Huaqin board based on the Corsola board design with the
addition of (optional??) LTE connectivity through (usb? pcie? what?) integrated
module.

> MT8186 based laptop. It is based on the "corsola" design.
> It includes LTE, touchpad combinations.
> 
> Signed-off-by: Jianeng Ceng <cengjianeng at huaqin.corp-partner.google.com>

After clarifying the commit description like suggested,

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>




From angelogioacchino.delregno at collabora.com  Fri Sep 13 01:55:58 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Fri, 13 Sep 2024 08:55:58 +0000
Subject: [PATCH v7 1/2] dt-bindings: arm: mediatek: Add MT8186 Ponyta
 Chromebook
In-Reply-To: <20240913031505.372868-2-cengjianeng@huaqin.corp-partner.google.com>
References: <20240913031505.372868-1-cengjianeng@huaqin.corp-partner.google.com>
 <20240913031505.372868-2-cengjianeng@huaqin.corp-partner.google.com>
Message-ID: <01020191ea98a643-2d0be5d1-e00b-48e0-b823-bfe2c65b0d00-000000@eu-west-1.amazonses.com>

Il 13/09/24 05:15, Jianeng Ceng ha scritto:
> Ponyta is a custom label Chromebook based on MT8186. It is a
> self-developed project of Huaqin and has no fixed OEM.
> 
> Acked-by: Krzysztof Kozlowski <krzysztof.kozlowski at linaro.org>
> Signed-off-by: Jianeng Ceng <cengjianeng at huaqin.corp-partner.google.com>
> ---
> Changes in v5:
> - PATCH 1/2: Remove sku2147483647.
> - Link to v4:https://lore.kernel.org/all/20240906085739.1322676-2-cengjianeng at huaqin.corp-partner.google.com/
> 
> Changes in v4:
> - PATCH 1/2: Add more info for Ponyta custom label in commit.
> - Link to v3:https://lore.kernel.org/all/20240904081501.2060933-1-cengjianeng at huaqin.corp-partner.google.com/
> 
> Changes in v3:
> - PATCH 1/2: Modify lable to label.
> - Link to v2:https://lore.kernel.org/all/20240903061603.3007289-1-cengjianeng at huaqin.corp-partner.google.com/
> 
> Chage since V2:
> - No change.
> 
> ---
>   Documentation/devicetree/bindings/arm/mediatek.yaml | 10 ++++++++++
>   1 file changed, 10 insertions(+)
> 
> diff --git a/Documentation/devicetree/bindings/arm/mediatek.yaml b/Documentation/devicetree/bindings/arm/mediatek.yaml
> index 1d4bb50fcd8d..43a824bee1b6 100644
> --- a/Documentation/devicetree/bindings/arm/mediatek.yaml
> +++ b/Documentation/devicetree/bindings/arm/mediatek.yaml
> @@ -257,6 +257,16 @@ properties:
>             - const: google,steelix-sku393218
>             - const: google,steelix
>             - const: mediatek,mt8186
> +      - description: Google Ponyta (Custom label)

Instead of "(Custom label)", why don't we just label it as "(Huaqin ODM)" or as
the ODM board number (if not confidential)?

Or we could even drop it and just say "Google Ponyta" instead, maybe?

I don't really like "Custom label", as that looks really like a placeholder
for something else, which doesn't look right.

Cheers,
Angelo

> +        items:
> +          - const: google,ponyta-sku0
> +          - const: google,ponyta
> +          - const: mediatek,mt8186
> +      - description: Google Ponyta (Custom label)
> +        items:
> +          - const: google,ponyta-sku1
> +          - const: google,ponyta
> +          - const: mediatek,mt8186
>         - description: Google Rusty (Lenovo 100e Chromebook Gen 4)
>           items:
>             - const: google,steelix-sku196609



From angelogioacchino.delregno at collabora.com  Fri Sep 13 02:01:47 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Fri, 13 Sep 2024 09:01:47 +0000
Subject: [PATCH v4 0/5] Support alpha blending in MTK display driver
In-Reply-To: <69776448-0328-4880-9108-54466e40ddd9@gmail.com>
References: <20240717-alpha-blending-v4-0-4b1c806c0749@mediatek.com>
 <CAAOTY_8ThuusfHk9Gd5pFP8VhJkG2seuJmkFiruK1rPQFZGBzg@mail.gmail.com>
 <6c9b7f85-f92d-44ed-ae9d-00f6d55ea614@gmail.com>
 <a2cf4e9b9c3343a7398521760934f1740505aa13.camel@mediatek.com>
 <13f6dbc5d460e746352f68b001e85f870c89993d.camel@mediatek.com>
 <69776448-0328-4880-9108-54466e40ddd9@gmail.com>
Message-ID: <01020191ea9dface-81c48f9d-4cf2-4f96-a1cd-59c11fa810ff-000000@eu-west-1.amazonses.com>

Il 13/09/24 07:40, Alper Nebi Yasak ha scritto:
> Hi,
> 
> On 2024-09-13 05:56 +03:00, Jason-JH Lin (???) wrote:
>> Hi Alper,
>>
>> I think that's a platform issue because it works find in my MT8188
>> platform, but I don't have any MT8173 platform.
>>
>> Can you help me test the fix patch in your MT8173 platform?
>> I'll provide a fix patch in 2 weeks via Google Chat.

Jason, Two weeks is a bit too late as CK already picked your series: reverting
and reapplying creates noise in the commit log, and when this can be avoided it
should be avoided.

Since upstream is broken, please understand that this fix should be developed
with *highest* priority (so, as immediate as possible).

Thanks,
Angelo

>>
>> Regards,
>> Jason-JH.Lin
> 
> I replied over Google Chat, but to make it clear for others on the
> mailing list: Yes, I'll try to test patches when you send them.
> 
>> On Fri, 2024-09-13 at 01:25 +0000, CK Hu (???) wrote:
>>> Hi, Jason:
>>>
>>> Please help to fix this issue.
>>> Otherwise, I would revert this series.
>>>
>>> Regards,
>>> CK
>>>
>>> On Thu, 2024-09-12 at 23:29 +0300, Alper Nebi Yasak wrote:
>>>>    
>>>> External email : Please do not click links or open attachments
>>>> until you have verified the sender or the content.
>>>>   Hi,
>>>>
>>>> On 2024-07-31 16:34 +03:00, Chun-Kuang Hu wrote:
>>>>> Hi, Shawn:
>>>>>
>>>>> Hsiao Chien Sung via B4 Relay
>>>>> <devnull+shawn.sung.mediatek.com at kernel.org> ? 2024?7?17? ??
>>>>> ??1:24???
>>>>>>
>>>>>> Support "Pre-multiplied" and "None" blend mode on MediaTek's
>>>>>> chips by
>>>>>> adding correct blend mode property when the planes init.
>>>>>> Before this patch, only the "Coverage" mode (default) is
>>>>>> supported.
>>>>>
>>>>> For the whole series, applied to mediatek-drm-next [1], thanks.
>>>>>
>>>>> [1]
>>>>> https://git.kernel.org/pub/scm/linux/kernel/git/chunkuang.hu/linux.git/log/?h=mediatek-drm-next
>>>>
>>>> I am seeing broken colors on an MT8173 Chromebook with next-
>>>> 20240912,
>>>> which goes away if I git-revert this series (commits 1f66fe62cc09
>>>> eb17c5909481 a3f7f7ef4bfe 59e9d9de25f0 4225d5d5e779).
>>>>
>>>> To illustrate, I took a picture [1] of some color mixing diagrams
>>>> from
>>>> Wikipedia [2]. Do you have an idea of what goes wrong?
>>>>
>>>> (I'm busy with too many things so I don't want to debug it now...)
>>>>
>>>> [1] https://i.imgur.com/tNFvovB.jpeg
>>>> [2] https://en.wikipedia.org/wiki/Color_space#Generic



From linyunsheng at huawei.com  Fri Sep 13 02:35:51 2024
From: linyunsheng at huawei.com (Yunsheng Lin)
Date: Fri, 13 Sep 2024 17:35:51 +0800
Subject: [RFC 2/2] page_pool: fix IOMMU crash when driver has already
 unbound
In-Reply-To: <CAHS8izPc8fy08mL1RJtnxiOvTx=Uk037Q5SKobC80jQocEKMJQ@mail.gmail.com>
References: <20240912124514.2329991-1-linyunsheng@huawei.com>
 <20240912124514.2329991-3-linyunsheng@huawei.com>
 <CAHS8izPc8fy08mL1RJtnxiOvTx=Uk037Q5SKobC80jQocEKMJQ@mail.gmail.com>
Message-ID: <00c41a5b-6a5b-4ee1-b0e2-eae819e3cf3b@huawei.com>

On 2024/9/12 22:25, Mina Almasry wrote:
> On Thu, Sep 12, 2024 at 5:51?AM Yunsheng Lin <linyunsheng at huawei.com> wrote:
>>
>> Networking driver with page_pool support may hand over page
>> still with dma mapping to network stack and try to reuse that
>> page after network stack is done with it and passes it back
>> to page_pool to avoid the penalty of dma mapping/unmapping.
>> With all the caching in the network stack, some pages may be
>> held in the network stack without returning to the page_pool
>> soon enough, and with VF disable causing the driver unbound,
>> the page_pool does not stop the driver from doing it's
>> unbounding work, instead page_pool uses workqueue to check
>> if there is some pages coming back from the network stack
>> periodically, if there is any, it will do the dma unmmapping
>> related cleanup work.
>>
>> As mentioned in [1], attempting DMA unmaps after the driver
>> has already unbound may leak resources or at worst corrupt
>> memory. Fundamentally, the page pool code cannot allow DMA
>> mappings to outlive the driver they belong to.
>>
>> Currently it seems there are at least two cases that the page
>> is not released fast enough causing dma unmmapping done after
>> driver has already unbound:
>> 1. ipv4 packet defragmentation timeout: this seems to cause
>>    delay up to 30 secs:
>>
>> 2. skb_defer_free_flush(): this may cause infinite delay if
>>    there is no triggering for net_rx_action().
>>
>> In order not to do the dma unmmapping after driver has already
>> unbound and stall the unloading of the networking driver, add
>> the pool->items array to record all the pages including the ones
>> which are handed over to network stack, so the page_pool can
>> do the dma unmmapping for those pages when page_pool_destroy()
>> is called.
>>
> 
> The approach in this patch is a bit complicated. I wonder if there is
> something simpler that we can do. From reading the thread, it seems
> the issue is that in __page_pool_release_page_dma we're calling
> dma_unmap_page_attrs() on a pool->p.dev that has been deleted via
> device_del, right?
> 
> Why not consider pool->p.dev unusable if pool->destroy_cnt > 0? I.e.
> in __page_pool_release_page_dma, we can skip dma_unmap_page_attrs() if
> destry_cnt > 0?

The skipping is already done for __dma_sync_single_for_device() in this
patch, but not for dma_unmap_page_attrs(), see the clearing of dma_sync
in page_pool_destroy().

> 
> More generally, probably any use of pool->p.dev may be invalid if
> page_pool_destroy has been called. The call sites can be scrubbed for
> latent bugs.

As mentioned in commit log, attempting DMA unmaps after the driver has
already unbound may leak resources or at worst corrupt memory.
The skipping only avoid corrupting memory, but not leaking resources, as
there may be bounce buffer or iova resources before the dma mapping as my
understanding.

And when page_pool_destroy() is called, there is currently no way to
tell if the device is going to be invalid or not.

> 
> The hard part is handling the concurrency. I'm not so sure we can fix
> this without introducing some synchronization between the
> page_pool_destroy seeing the device go away and the code paths using
> the device. Are these being called from the fast paths? Jespers
> benchmark can tell for sure if there is any impact on the fast path.

It depends on what your definition of fast path here, there are three
kinds of fast path for page pool as my understanding.

For the first and second fast path, the synchronization cost is the
rcu read lock overhead introduced in patch 1.

For the third fast path when we need to refill from or flush to the
page allocator, the added overhead is the page_pool_item_add() and
page_pool_item_del() calling as my understanding.

Will provide the performance data in the next version.

> 
>> Note, the devmem patchset seems to make the bug harder to fix
>> and to backport too, this patch does not consider fixing the
>> case for devmem yet.
>>
> 
> FWIW from a quick look I did not see anything in this patch that is
> extremely hard to port to netmem. AFAICT the issue is that you skipped
> changing page_pool to page_pool_items in net_iov. Once that is done, I
> think the rest should be straightforward.

Does page_pool_item_uninit() need to handle 'netmem' case?

How does the devmem handle the case net_iov being cached in network stack
when the driver has already unbound? I am supposing there is a device for
dma_buf_unmap_attachment_unlocked(), and is it possible that the device
become invalid too when the driver has unbound? If yes, doesn't it have a
similar problem as the case of normal page?

> 


From andriy.shevchenko at linux.intel.com  Fri Sep 13 03:25:25 2024
From: andriy.shevchenko at linux.intel.com (Andy Shevchenko)
Date: Fri, 13 Sep 2024 13:25:25 +0300
Subject: [PATCH v7 06/10] i2c: Introduce OF component probe function
In-Reply-To: <20240911072751.365361-7-wenst@chromium.org>
References: <20240911072751.365361-1-wenst@chromium.org>
 <20240911072751.365361-7-wenst@chromium.org>
Message-ID: <ZuQTFTNTBLCziD05@smile.fi.intel.com>

On Wed, Sep 11, 2024 at 03:27:44PM +0800, Chen-Yu Tsai wrote:
> Some devices are designed and manufactured with some components having
> multiple drop-in replacement options. These components are often
> connected to the mainboard via ribbon cables, having the same signals
> and pin assignments across all options. These may include the display
> panel and touchscreen on laptops and tablets, and the trackpad on
> laptops. Sometimes which component option is used in a particular device
> can be detected by some firmware provided identifier, other times that
> information is not available, and the kernel has to try to probe each
> device.
> 
> This change attempts to make the "probe each device" case cleaner. The
> current approach is to have all options added and enabled in the device
> tree. The kernel would then bind each device and run each driver's probe
> function. This works, but has been broken before due to the introduction
> of asynchronous probing, causing multiple instances requesting "shared"
> resources, such as pinmuxes, GPIO pins, interrupt lines, at the same
> time, with only one instance succeeding. Work arounds for these include
> moving the pinmux to the parent I2C controller, using GPIO hogs or
> pinmux settings to keep the GPIO pins in some fixed configuration, and
> requesting the interrupt line very late. Such configurations can be seen
> on the MT8183 Krane Chromebook tablets, and the Qualcomm sc8280xp-based
> Lenovo Thinkpad 13S.
> 
> Instead of this delicate dance between drivers and device tree quirks,
> this change introduces a simple I2C component probe. function For a
> given class of devices on the same I2C bus, it will go through all of
> them, doing a simple I2C read transfer and see which one of them responds.
> It will then enable the device that responds.
> 
> This requires some minor modifications in the existing device tree. The
> status for all the device nodes for the component options must be set
> to "failed-needs-probe". This makes it clear that some mechanism is
> needed to enable one of them, and also prevents the prober and device
> drivers running at the same time.

...

> +static int i2c_of_probe_enable_node(struct device *dev, struct device_node *node)
> +{
> +	int ret;

> +	dev_info(dev, "Enabling %pOF\n", node);

Is it important to be on INFO level?

> +	struct of_changeset *ocs __free(kfree) = kzalloc(sizeof(*ocs), GFP_KERNEL);
> +	if (!ocs)
> +		return -ENOMEM;
> +
> +	of_changeset_init(ocs);
> +	ret = of_changeset_update_prop_string(ocs, node, "status", "okay");
> +	if (ret)
> +		return ret;
> +
> +	ret = of_changeset_apply(ocs);
> +	if (ret) {
> +		/* ocs needs to be explicitly cleaned up before being freed. */
> +		of_changeset_destroy(ocs);
> +	} else {
> +		/*
> +		 * ocs is intentionally kept around as it needs to
> +		 * exist as long as the change is applied.
> +		 */
> +		void *ptr __always_unused = no_free_ptr(ocs);
> +	}
> +
> +	return ret;
> +}

...

> +int i2c_of_probe_component(struct device *dev, const struct i2c_of_probe_cfg *cfg, void *ctx)
> +{
> +	const struct i2c_of_probe_ops *ops;
> +	const char *type;
> +	struct device_node *i2c_node;
> +	struct i2c_adapter *i2c;
> +	int ret;
> +
> +	if (!cfg)
> +		return -EINVAL;
> +
> +	ops = cfg->ops ?: &i2c_of_probe_dummy_ops;
> +	type = cfg->type;
> +
> +	i2c_node = i2c_of_probe_get_i2c_node(dev, type);


	struct device_node *i2c_node __free(of_node_put) =
		i2c_...;

> +	if (IS_ERR(i2c_node))
> +		return PTR_ERR(i2c_node);
> +
> +	for_each_child_of_node_with_prefix(i2c_node, node, type) {
> +		if (!of_device_is_available(node))
> +			continue;
> +
> +		/*
> +		 * Device tree has component already enabled. Either the
> +		 * device tree isn't supported or we already probed once.
> +		 */
> +		ret = 0;

Shouldn't you drop reference count for "node"? (See also below)

> +		goto out_put_i2c_node;
> +	}
> +
> +	i2c = of_get_i2c_adapter_by_node(i2c_node);
> +	if (!i2c) {
> +		ret = dev_err_probe(dev, -EPROBE_DEFER, "Couldn't get I2C adapter\n");
> +		goto out_put_i2c_node;
> +	}
> +
> +	/* Grab resources */
> +	ret = 0;
> +	if (ops->get_resources)
> +		ret = ops->get_resources(dev, i2c_node, ctx);
> +	if (ret)
> +		goto out_put_i2c_adapter;
> +
> +	/* Enable resources */
> +	if (ops->enable)
> +		ret = ops->enable(dev, ctx);
> +	if (ret)
> +		goto out_release_resources;
> +
> +	ret = 0;
> +	for_each_child_of_node_with_prefix(i2c_node, node, type) {
> +		union i2c_smbus_data data;
> +		u32 addr;
> +
> +		if (of_property_read_u32(node, "reg", &addr))
> +			continue;
> +		if (i2c_smbus_xfer(i2c, addr, 0, I2C_SMBUS_READ, 0, I2C_SMBUS_BYTE, &data) < 0)
> +			continue;
> +
> +		/* Found a device that is responding */
> +		if (ops->free_resources_early)
> +			ops->free_resources_early(ctx);
> +		ret = i2c_of_probe_enable_node(dev, node);

Hmm... Is "node" reference count left bumped up for a reason?

> +		break;
> +	}
> +
> +	if (ops->cleanup)
> +		ops->cleanup(dev, ctx);
> +out_release_resources:
> +	if (ops->free_resources_late)
> +		ops->free_resources_late(ctx);
> +out_put_i2c_adapter:
> +	i2c_put_adapter(i2c);
> +out_put_i2c_node:
> +	of_node_put(i2c_node);
> +
> +	return ret;
> +}

...

> +/*
> + * i2c-of-prober.h - definitions for the Linux I2C OF component prober

Please avoid putting filenames inside files. In the possible future event of
file renaming this may become a burden and sometimes even forgotten.

> + * Copyright (C) 2024 Google LLC
> + */
> +
> +#ifndef _LINUX_I2C_OF_PROBER_H
> +#define _LINUX_I2C_OF_PROBER_H

> +#if IS_ENABLED(CONFIG_OF_DYNAMIC)

Do you really need to hide data types with this? Wouldn't be enough to hide
APIs only?

> +struct device;
> +struct device_node;
> +
> +/**
> + * struct i2c_of_probe_ops - I2C OF component prober callbacks
> + *
> + * A set of callbacks to be used by i2c_of_probe_component().
> + *
> + * All callbacks are optional. Callbacks are called only once per run, and are
> + * used in the order they are defined in this structure.
> + *
> + * All callbacks that have return values shall return %0 on success,
> + * or a negative error number on failure.
> + *
> + * The @dev parameter passed to the callbacks is the same as @dev passed to
> + * i2c_of_probe_component(). It should only be used for dev_printk() calls
> + * and nothing else, especially not managed device resource (devres) APIs.
> + */
> +struct i2c_of_probe_ops {
> +	/** @get_resources: Retrieve resources for components. */
> +	int (*get_resources)(struct device *dev, struct device_node *bus_node, void *data);
> +
> +	/** @free_resources_early: Release exclusive resources prior to enabling component. */
> +	void (*free_resources_early)(void *data);
> +
> +	/**
> +	 * @enable: Enable resources so that the components respond to probes.
> +	 *
> +	 * Resources should be reverted to their initial state before returning if this fails.
> +	 */
> +	int (*enable)(struct device *dev, void *data);
> +
> +	/**
> +	 * @cleanup: Opposite of @enable to balance refcounts after probing.
> +	 *
> +	 * Can not operate on resources already freed in @free_resources_early.
> +	 */
> +	int (*cleanup)(struct device *dev, void *data);
> +
> +	/**
> +	 * @free_resources_late: Release all resources, including those that would have
> +	 *                       been released by @free_resources_early.
> +	 */
> +	void (*free_resources_late)(void *data);
> +};
> +
> +/**
> + * struct i2c_of_probe_cfg - I2C OF component prober configuration
> + * @ops: Callbacks for the prober to use.
> + * @type: A string to match the device node name prefix to probe for.
> + */
> +struct i2c_of_probe_cfg {
> +	const struct i2c_of_probe_ops *ops;
> +	const char *type;
> +};
> +
> +int i2c_of_probe_component(struct device *dev, const struct i2c_of_probe_cfg *cfg, void *ctx);
> +
> +#endif /* IS_ENABLED(CONFIG_OF_DYNAMIC) */
> +
> +#endif /* _LINUX_I2C_OF_PROBER_H */

-- 
With Best Regards,
Andy Shevchenko




From andriy.shevchenko at linux.intel.com  Fri Sep 13 03:27:11 2024
From: andriy.shevchenko at linux.intel.com (Andy Shevchenko)
Date: Fri, 13 Sep 2024 13:27:11 +0300
Subject: [PATCH v7 03/10] regulator: Split up _regulator_get()
In-Reply-To: <20240911072751.365361-4-wenst@chromium.org>
References: <20240911072751.365361-1-wenst@chromium.org>
 <20240911072751.365361-4-wenst@chromium.org>
Message-ID: <ZuQTf0MiktCGAELP@smile.fi.intel.com>

On Wed, Sep 11, 2024 at 03:27:41PM +0800, Chen-Yu Tsai wrote:
> _regulator_get() contains a lot of common code doing checks prior to the
> regulator lookup and housekeeping work after the lookup. Almost all the
> code could be shared with a OF-specific variant of _regulator_get().
> 
> Split out the common parts so that they can be reused. The OF-specific
> version of _regulator_get() will be added in a subsequent patch.
> No functional changes were made.

I think this patch makes sense on its own, but it of course up to Mark.
FWIW,
Reviewed-by: Andy Shevchenko <andriy.shevchenko at linux.intel.com>

-- 
With Best Regards,
Andy Shevchenko




From chun-jen.tseng at mediatek.com  Fri Sep 13 03:39:33 2024
From: chun-jen.tseng at mediatek.com (Mark Tseng)
Date: Fri, 13 Sep 2024 18:39:33 +0800
Subject: [PATCH v1 2/2] cpufreq: mediatek: Fixed cpufreq has 2 policy will cause concurrency
In-Reply-To: <20240913103933.30895-1-chun-jen.tseng@mediatek.com>
References: <20240913103933.30895-1-chun-jen.tseng@mediatek.com>
Message-ID: <20240913103933.30895-3-chun-jen.tseng@mediatek.com>

mtk_cpufreq_set_target() is re-enter function but the mutex lock decalre
in mtk_cpu_dvfs_info structure for each policy. It should change to
global variable for critical session avoid policy get wrong OPP.

SoC with CCI architecture should set transition_delay to 10 ms
because cpufreq need to call devfreq notifier in async mode. if delay
less than 10ms may get wrong OPP-level in CCI driver.

Add CPUFREQ_ASYNC_NOTIFICATION flages for cpufreq policy because some of
process will get CPU frequency by cpufreq sysfs node. It may get wrong
frequency then call cpufreq_out_of_sync() to fixed frequency.

Signed-off-by: Mark Tseng <chun-jen.tseng at mediatek.com>
---
 drivers/cpufreq/mediatek-cpufreq.c | 65 ++++++++++++++++++++++--------
 1 file changed, 49 insertions(+), 16 deletions(-)

diff --git a/drivers/cpufreq/mediatek-cpufreq.c b/drivers/cpufreq/mediatek-cpufreq.c
index 663f61565cf7..3303b6d72ea7 100644
--- a/drivers/cpufreq/mediatek-cpufreq.c
+++ b/drivers/cpufreq/mediatek-cpufreq.c
@@ -49,8 +49,6 @@ struct mtk_cpu_dvfs_info {
 	bool need_voltage_tracking;
 	int vproc_on_boot;
 	int pre_vproc;
-	/* Avoid race condition for regulators between notify and policy */
-	struct mutex reg_lock;
 	struct notifier_block opp_nb;
 	unsigned int opp_cpu;
 	unsigned long current_freq;
@@ -59,6 +57,9 @@ struct mtk_cpu_dvfs_info {
 	bool ccifreq_bound;
 };
 
+/* Avoid race condition for regulators between notify and policy */
+static DEFINE_MUTEX(mtk_policy_lock);
+
 static struct platform_device *cpufreq_pdev;
 
 static LIST_HEAD(dvfs_info_list);
@@ -200,20 +201,29 @@ static bool is_ccifreq_ready(struct mtk_cpu_dvfs_info *info)
 static int mtk_cpufreq_set_target(struct cpufreq_policy *policy,
 				  unsigned int index)
 {
-	struct cpufreq_frequency_table *freq_table = policy->freq_table;
-	struct clk *cpu_clk = policy->clk;
-	struct clk *armpll = clk_get_parent(cpu_clk);
-	struct mtk_cpu_dvfs_info *info = policy->driver_data;
-	struct device *cpu_dev = info->cpu_dev;
+	struct cpufreq_frequency_table *freq_table;
+	struct clk *cpu_clk;
+	struct clk *armpll;
+	struct mtk_cpu_dvfs_info *info;
+	struct device *cpu_dev;
 	struct dev_pm_opp *opp;
 	long freq_hz, pre_freq_hz;
 	int vproc, pre_vproc, inter_vproc, target_vproc, ret;
+	struct cpufreq_freqs freqs;
 
-	inter_vproc = info->intermediate_voltage;
+	mutex_lock(&mtk_policy_lock);
 
-	pre_freq_hz = clk_get_rate(cpu_clk);
+	freq_table = policy->freq_table;
+	cpu_clk = policy->clk;
+	armpll = clk_get_parent(cpu_clk);
+	info = policy->driver_data;
+	cpu_dev = info->cpu_dev;
+	inter_vproc = info->intermediate_voltage;
+	pre_freq_hz = policy->cur * 1000;
 
-	mutex_lock(&info->reg_lock);
+	freqs.old = policy->cur;
+	freqs.new = freq_table[index].frequency;
+	cpufreq_freq_transition_begin(policy, &freqs);
 
 	if (unlikely(info->pre_vproc <= 0))
 		pre_vproc = regulator_get_voltage(info->proc_reg);
@@ -308,7 +318,8 @@ static int mtk_cpufreq_set_target(struct cpufreq_policy *policy,
 	info->current_freq = freq_hz;
 
 out:
-	mutex_unlock(&info->reg_lock);
+	cpufreq_freq_transition_end(policy, &freqs, false);
+	mutex_unlock(&mtk_policy_lock);
 
 	return ret;
 }
@@ -316,19 +327,20 @@ static int mtk_cpufreq_set_target(struct cpufreq_policy *policy,
 static int mtk_cpufreq_opp_notifier(struct notifier_block *nb,
 				    unsigned long event, void *data)
 {
-	struct dev_pm_opp *opp = data;
+	struct dev_pm_opp *opp;
 	struct dev_pm_opp *new_opp;
 	struct mtk_cpu_dvfs_info *info;
 	unsigned long freq, volt;
 	struct cpufreq_policy *policy;
 	int ret = 0;
 
+	mutex_lock(&mtk_policy_lock);
+	opp = data;
 	info = container_of(nb, struct mtk_cpu_dvfs_info, opp_nb);
 
 	if (event == OPP_EVENT_ADJUST_VOLTAGE) {
 		freq = dev_pm_opp_get_freq(opp);
 
-		mutex_lock(&info->reg_lock);
 		if (info->current_freq == freq) {
 			volt = dev_pm_opp_get_voltage(opp);
 			ret = mtk_cpufreq_set_voltage(info, volt);
@@ -336,7 +348,6 @@ static int mtk_cpufreq_opp_notifier(struct notifier_block *nb,
 				dev_err(info->cpu_dev,
 					"failed to scale voltage: %d\n", ret);
 		}
-		mutex_unlock(&info->reg_lock);
 	} else if (event == OPP_EVENT_DISABLE) {
 		freq = dev_pm_opp_get_freq(opp);
 
@@ -361,6 +372,7 @@ static int mtk_cpufreq_opp_notifier(struct notifier_block *nb,
 			}
 		}
 	}
+	mutex_unlock(&mtk_policy_lock);
 
 	return notifier_from_errno(ret);
 }
@@ -495,7 +507,6 @@ static int mtk_cpu_dvfs_info_init(struct mtk_cpu_dvfs_info *info, int cpu)
 	info->intermediate_voltage = dev_pm_opp_get_voltage(opp);
 	dev_pm_opp_put(opp);
 
-	mutex_init(&info->reg_lock);
 	info->current_freq = clk_get_rate(info->cpu_clk);
 
 	info->opp_cpu = cpu;
@@ -597,6 +608,9 @@ static int mtk_cpufreq_init(struct cpufreq_policy *policy)
 	policy->driver_data = info;
 	policy->clk = info->cpu_clk;
 
+	if (info->soc_data->ccifreq_supported)
+		policy->transition_delay_us = 10000;
+
 	return 0;
 }
 
@@ -607,13 +621,32 @@ static void mtk_cpufreq_exit(struct cpufreq_policy *policy)
 	dev_pm_opp_free_cpufreq_table(info->cpu_dev, &policy->freq_table);
 }
 
+static unsigned int mtk_cpufreq_get(unsigned int cpu)
+{
+	struct mtk_cpu_dvfs_info *info;
+	unsigned long current_freq;
+
+	mutex_lock(&mtk_policy_lock);
+	info = mtk_cpu_dvfs_info_lookup(cpu);
+	if (!info) {
+		mutex_unlock(&mtk_policy_lock);
+		return 0;
+	}
+
+	current_freq = info->current_freq / 1000;
+	mutex_unlock(&mtk_policy_lock);
+
+	return current_freq;
+}
+
 static struct cpufreq_driver mtk_cpufreq_driver = {
 	.flags = CPUFREQ_NEED_INITIAL_FREQ_CHECK |
 		 CPUFREQ_HAVE_GOVERNOR_PER_POLICY |
+		 CPUFREQ_ASYNC_NOTIFICATION |
 		 CPUFREQ_IS_COOLING_DEV,
 	.verify = cpufreq_generic_frequency_table_verify,
 	.target_index = mtk_cpufreq_set_target,
-	.get = cpufreq_generic_get,
+	.get = mtk_cpufreq_get,
 	.init = mtk_cpufreq_init,
 	.exit = mtk_cpufreq_exit,
 	.register_em = cpufreq_register_em_with_opp,
-- 
2.45.2



From chun-jen.tseng at mediatek.com  Fri Sep 13 03:39:31 2024
From: chun-jen.tseng at mediatek.com (Mark Tseng)
Date: Fri, 13 Sep 2024 18:39:31 +0800
Subject: [PATCH v1 0/2] fixed mediatek-cpufreq has multi policy concurrency issue
Message-ID: <20240913103933.30895-1-chun-jen.tseng@mediatek.com>

For multi cluster SoC, the cpufreq->target_index() is re-enter function 
for each policy to change CPU frequency. In the cirtical session must 
use glocal mutex lock to avoid get wrong OPP.

Mark Tseng (2):
  PM / devfreq: mediatek: protect oop in critical session
  cpufreq: mediatek: Fixed cpufreq has 2 policy will cause concurrency

 drivers/cpufreq/mediatek-cpufreq.c | 65 ++++++++++++++++++++++--------
 drivers/devfreq/mtk-cci-devfreq.c  | 30 +++++++-------
 2 files changed, 64 insertions(+), 31 deletions(-)

-- 
2.45.2



From andriy.shevchenko at linux.intel.com  Fri Sep 13 03:46:26 2024
From: andriy.shevchenko at linux.intel.com (Andy Shevchenko)
Date: Fri, 13 Sep 2024 13:46:26 +0300
Subject: [PATCH v7 07/10] i2c: of-prober: Add simple helpers for
 regulator support
In-Reply-To: <20240911072751.365361-8-wenst@chromium.org>
References: <20240911072751.365361-1-wenst@chromium.org>
 <20240911072751.365361-8-wenst@chromium.org>
Message-ID: <ZuQYAu9tBN0wrNfo@smile.fi.intel.com>

On Wed, Sep 11, 2024 at 03:27:45PM +0800, Chen-Yu Tsai wrote:
> Add helpers to do regulator management for the I2C OF component prober.
> Components that the prober intends to probe likely require their
> regulator supplies be enabled, and GPIOs be toggled to enable them or
> bring them out of reset before they will respond to probe attempts.
> GPIOs will be handled in the next patch.
> 
> The assumption is that the same class of components to be probed are
> always connected in the same fashion with the same regulator supply
> and GPIO. The names may vary due to binding differences, but the
> physical layout does not change.
> 
> This set of helpers supports at most one regulator supply. The user
> must specify the node from which the supply is retrieved. The supply
> name and the amount of time to wait after the supply is enabled are
> also given by the user.

...

> +static int i2c_of_probe_simple_get_supply(struct device *dev, struct device_node *node,
> +					  struct i2c_of_probe_simple_ctx *ctx)
> +{
> +	const char *supply_name;
> +	struct regulator *supply;
> +
> +	/*
> +	 * It's entirely possible for the component's device node to not have regulator
> +	 * supplies. While it does not make sense from a hardware perspective, the
> +	 * supplies could be always on or otherwise not modeled in the device tree, but
> +	 * the device would still work.
> +	 */

I would reformat as

	/*
	 * It's entirely possible for the component's device node to not have the
	 * regulator supplies. While it does not make sense from a hardware perspective,
	 * the supplies could be always on or otherwise not modeled in the device tree,
	 * but the device would still work.
	 */

> +	supply_name = ctx->opts->supply_name;
> +	if (!supply_name)
> +		return 0;
> +
> +	supply = of_regulator_get_optional(dev, node, supply_name);
> +	if (IS_ERR(supply)) {
> +		return dev_err_probe(dev, PTR_ERR(supply),
> +				     "Failed to get regulator supply \"%s\" from %pOF\n",
> +				     supply_name, node);
> +	}
> +
> +	ctx->supply = supply;
> +
> +	return 0;
> +}

...

> +int i2c_of_probe_simple_get_res(struct device *dev, struct device_node *bus_node, void *data)
> +{
> +	struct i2c_of_probe_simple_ctx *ctx = data;
> +	struct device_node *node;
> +	const char *compat;
> +	int ret;
> +
> +	dev_dbg(dev, "Requesting resources for components under I2C bus %pOF\n", bus_node);
> +
> +	if (!ctx || !ctx->opts)
> +		return -EINVAL;
> +
> +	compat = ctx->opts->res_node_compatible;
> +	if (!compat)
> +		return -EINVAL;

> +	node = of_get_compatible_child(bus_node, compat);

	__free(of_node_put) ?

> +	if (!node)
> +		return dev_err_probe(dev, -ENODEV, "No device compatible with \"%s\" found\n",
> +				     compat);
> +
> +	ret = i2c_of_probe_simple_get_supply(dev, node, ctx);
> +	if (ret)
> +		goto out_put_node;
> +
> +	return 0;
> +
> +out_put_node:
> +	of_node_put(node);
> +	return ret;
> +}

...

> + * @post_power_on_delay_ms: Delay in ms after regulators are powered on. Passed to msleep().

No need to duplicate the units as it's obvious from the variable name and msleep().

 * @post_power_on_delay_ms: Delay after regulators are powered on. Passed to msleep().

-- 
With Best Regards,
Andy Shevchenko




From chun-jen.tseng at mediatek.com  Fri Sep 13 03:39:32 2024
From: chun-jen.tseng at mediatek.com (Mark Tseng)
Date: Fri, 13 Sep 2024 18:39:32 +0800
Subject: [PATCH v1 1/2] PM / devfreq: mediatek: protect oop in critical session
In-Reply-To: <20240913103933.30895-1-chun-jen.tseng@mediatek.com>
References: <20240913103933.30895-1-chun-jen.tseng@mediatek.com>
Message-ID: <20240913103933.30895-2-chun-jen.tseng@mediatek.com>

mtk_ccifreq_target() & mtk_ccifreq_opp_notifier() is re-enter funtion
when cpufreq governor is more than one. It should add global mutex to
protect OPP , avoid get wrong frequency & voltage.

Signed-off-by: Mark Tseng <chun-jen.tseng at mediatek.com>
---
 drivers/devfreq/mtk-cci-devfreq.c | 30 +++++++++++++++---------------
 1 file changed, 15 insertions(+), 15 deletions(-)

diff --git a/drivers/devfreq/mtk-cci-devfreq.c b/drivers/devfreq/mtk-cci-devfreq.c
index 7ad5225b0381..293cf81e53fe 100644
--- a/drivers/devfreq/mtk-cci-devfreq.c
+++ b/drivers/devfreq/mtk-cci-devfreq.c
@@ -29,13 +29,14 @@ struct mtk_ccifreq_drv {
 	struct clk *inter_clk;
 	int inter_voltage;
 	unsigned long pre_freq;
-	/* Avoid race condition for regulators between notify and policy */
-	struct mutex reg_lock;
 	struct notifier_block opp_nb;
 	const struct mtk_ccifreq_platform_data *soc_data;
 	int vtrack_max;
 };
 
+/* Avoid race condition for regulators between notify and policy */
+static DEFINE_MUTEX(reg_lock);
+
 static int mtk_ccifreq_set_voltage(struct mtk_ccifreq_drv *drv, int new_voltage)
 {
 	const struct mtk_ccifreq_platform_data *soc_data = drv->soc_data;
@@ -125,22 +126,20 @@ static int mtk_ccifreq_set_voltage(struct mtk_ccifreq_drv *drv, int new_voltage)
 static int mtk_ccifreq_target(struct device *dev, unsigned long *freq,
 			      u32 flags)
 {
-	struct mtk_ccifreq_drv *drv = dev_get_drvdata(dev);
+	struct mtk_ccifreq_drv *drv;
 	struct clk *cci_pll;
 	struct dev_pm_opp *opp;
 	unsigned long opp_rate;
 	int voltage, pre_voltage, inter_voltage, target_voltage, ret;
 
+	mutex_lock(&reg_lock);
+
+	drv = dev_get_drvdata(dev);
 	if (!drv)
 		return -EINVAL;
 
-	if (drv->pre_freq == *freq)
-		return 0;
-
-	mutex_lock(&drv->reg_lock);
-
-	inter_voltage = drv->inter_voltage;
 	cci_pll = clk_get_parent(drv->cci_clk);
+	inter_voltage = drv->inter_voltage;
 
 	opp_rate = *freq;
 	opp = devfreq_recommended_opp(dev, &opp_rate, 1);
@@ -206,7 +205,7 @@ static int mtk_ccifreq_target(struct device *dev, unsigned long *freq,
 	}
 
 	drv->pre_freq = *freq;
-	mutex_unlock(&drv->reg_lock);
+	mutex_unlock(&reg_lock);
 
 	return 0;
 
@@ -214,21 +213,23 @@ static int mtk_ccifreq_target(struct device *dev, unsigned long *freq,
 	mtk_ccifreq_set_voltage(drv, pre_voltage);
 
 out_unlock:
-	mutex_unlock(&drv->reg_lock);
+	mutex_unlock(&reg_lock);
 	return ret;
 }
 
 static int mtk_ccifreq_opp_notifier(struct notifier_block *nb,
 				    unsigned long event, void *data)
 {
-	struct dev_pm_opp *opp = data;
+	struct dev_pm_opp *opp;
 	struct mtk_ccifreq_drv *drv;
 	unsigned long freq, volt;
 
+	mutex_lock(&reg_lock);
+
+	opp = data;
 	drv = container_of(nb, struct mtk_ccifreq_drv, opp_nb);
 
 	if (event == OPP_EVENT_ADJUST_VOLTAGE) {
-		mutex_lock(&drv->reg_lock);
 		freq = dev_pm_opp_get_freq(opp);
 
 		/* current opp item is changed */
@@ -236,8 +237,8 @@ static int mtk_ccifreq_opp_notifier(struct notifier_block *nb,
 			volt = dev_pm_opp_get_voltage(opp);
 			mtk_ccifreq_set_voltage(drv, volt);
 		}
-		mutex_unlock(&drv->reg_lock);
 	}
+	mutex_unlock(&reg_lock);
 
 	return 0;
 }
@@ -262,7 +263,6 @@ static int mtk_ccifreq_probe(struct platform_device *pdev)
 	drv->dev = dev;
 	drv->soc_data = (const struct mtk_ccifreq_platform_data *)
 				of_device_get_match_data(&pdev->dev);
-	mutex_init(&drv->reg_lock);
 	platform_set_drvdata(pdev, drv);
 
 	drv->cci_clk = devm_clk_get(dev, "cci");
-- 
2.45.2



From andriy.shevchenko at linux.intel.com  Fri Sep 13 03:52:46 2024
From: andriy.shevchenko at linux.intel.com (Andy Shevchenko)
Date: Fri, 13 Sep 2024 13:52:46 +0300
Subject: [PATCH v7 08/10] i2c: of-prober: Add GPIO support to simple
 helpers
In-Reply-To: <20240911072751.365361-9-wenst@chromium.org>
References: <20240911072751.365361-1-wenst@chromium.org>
 <20240911072751.365361-9-wenst@chromium.org>
Message-ID: <ZuQZfvqGii9fcH-j@smile.fi.intel.com>

On Wed, Sep 11, 2024 at 03:27:46PM +0800, Chen-Yu Tsai wrote:
> Add GPIO support to the simple helpers for the I2C OF component prober.
> Components that the prober intends to probe likely require their
> regulator supplies be enabled, and GPIOs be toggled to enable them or
> bring them out of reset before they will respond to probe attempts.
> Regulator supplies were handled in the previous patch.
> 
> The assumption is that the same class of components to be probed are
> always connected in the same fashion with the same regulator supply
> and GPIO. The names may vary due to binding differences, but the
> physical layout does not change.
> 
> This supports at most one GPIO pin. The user must specify the GPIO name,
> the polarity, and the amount of time to wait after the GPIO is toggled.
> Devices with more than one GPIO pin likely require specific power
> sequencing beyond what generic code can easily support.

...

> +static int i2c_of_probe_simple_get_gpiod(struct device *dev, struct device_node *node,
> +					 struct i2c_of_probe_simple_ctx *ctx)
> +{
> +	struct fwnode_handle *fwnode = of_fwnode_handle(node);
> +	struct gpio_desc *gpiod;
> +	const char *con_id = NULL;
> +
> +	/* NULL signals no GPIO needed */
> +	if (!ctx->opts->gpio_name)
> +		return 0;
> +
> +	/* An empty string signals an unnamed GPIO */
> +	if (strlen(ctx->opts->gpio_name))

You run for entire string in order to check the first byte only?

	if (ctx->opts->gpio_name[0] == '\0')
		con_id = NULL;
	else

> +		con_id = ctx->opts->gpio_name;

Also note, that comment is given in inverted condition to what you actually do
in the code. With my suggestion it looks better.

> +	gpiod = fwnode_gpiod_get_index(fwnode, con_id, 0, GPIOD_ASIS, "i2c-of-prober");
> +	if (IS_ERR(gpiod))
> +		return PTR_ERR(gpiod);
> +
> +	ctx->gpiod = gpiod;
> +
> +	return 0;
> +}

...

> +static int i2c_of_probe_simple_set_gpio(struct device *dev, struct i2c_of_probe_simple_ctx *ctx)
> +{
> +	int ret;
> +
> +	if (!ctx->gpiod)
> +		return 0;

> +	dev_dbg(dev, "Setting GPIO\n");

> +	ret = gpiod_direction_output_raw(ctx->gpiod, ctx->opts->gpio_high_to_enable ? 1 : 0);

Hmm... _raw() in use... Perhaps it's on a territory of Bart and Linus to review
and comment on this.

> +	if (ret)
> +		return ret;
> +
> +	msleep(ctx->opts->post_reset_deassert_delay_ms);
> +
> +	return 0;
> +}

-- 
With Best Regards,
Andy Shevchenko




From matthias.bgg at gmail.com  Fri Sep 13 04:33:12 2024
From: matthias.bgg at gmail.com (Matthias Brugger)
Date: Fri, 13 Sep 2024 13:33:12 +0200
Subject: [PATCH] arm64: dts: mt8192-asurada-spherion: Add Synaptics
 trackpad support
In-Reply-To: <20240912154451.3447081-1-treapking@chromium.org>
References: <20240912154451.3447081-1-treapking@chromium.org>
Message-ID: <e820d20b-3a5f-46bb-8293-d1e85098aaf2@gmail.com>



On 12/09/2024 17:44, Pin-yen Lin wrote:
> Some spherion variants use Synaptics trackpad at address 0x2c in the
> I2C2 bus with the generic HID-over-i2c driver, and this cannot be
> distinguished from the firmware compatible string.
> 
> Support both trackpads in the same devicetree by moving the trackpad
> pinctrl property to i2c2 and adding the node for Synaptics trackpad.
> 
> Signed-off-by: Pin-yen Lin <treapking at chromium.org>

Reviewed-by: Matthias Brugger <matthias.bgg at gmail.com>

> ---
> 
>   .../boot/dts/mediatek/mt8192-asurada-spherion-r0.dts  | 11 +++++++++++
>   arch/arm64/boot/dts/mediatek/mt8192-asurada.dtsi      |  4 +---
>   2 files changed, 12 insertions(+), 3 deletions(-)
> 
> diff --git a/arch/arm64/boot/dts/mediatek/mt8192-asurada-spherion-r0.dts b/arch/arm64/boot/dts/mediatek/mt8192-asurada-spherion-r0.dts
> index 29aa87e93888..8c485c3ced2c 100644
> --- a/arch/arm64/boot/dts/mediatek/mt8192-asurada-spherion-r0.dts
> +++ b/arch/arm64/boot/dts/mediatek/mt8192-asurada-spherion-r0.dts
> @@ -79,3 +79,14 @@ headset-codec {
>   &touchscreen {
>   	compatible = "elan,ekth3500";
>   };
> +
> +&i2c2 {
> +	/* synaptics touchpad */
> +	trackpad at 2c {
> +		compatible = "hid-over-i2c";
> +		reg = <0x2c>;
> +		hid-descr-addr = <0x20>;
> +		interrupts-extended = <&pio 15 IRQ_TYPE_LEVEL_LOW>;
> +		wakeup-source;
> +	};
> +};
> diff --git a/arch/arm64/boot/dts/mediatek/mt8192-asurada.dtsi b/arch/arm64/boot/dts/mediatek/mt8192-asurada.dtsi
> index 08d71ddf3668..8dda8b63765b 100644
> --- a/arch/arm64/boot/dts/mediatek/mt8192-asurada.dtsi
> +++ b/arch/arm64/boot/dts/mediatek/mt8192-asurada.dtsi
> @@ -335,14 +335,12 @@ &i2c2 {
>   	clock-frequency = <400000>;
>   	clock-stretch-ns = <12600>;
>   	pinctrl-names = "default";
> -	pinctrl-0 = <&i2c2_pins>;
> +	pinctrl-0 = <&i2c2_pins>, <&trackpad_pins>;
>   
>   	trackpad at 15 {
>   		compatible = "elan,ekth3000";
>   		reg = <0x15>;
>   		interrupts-extended = <&pio 15 IRQ_TYPE_LEVEL_LOW>;
> -		pinctrl-names = "default";
> -		pinctrl-0 = <&trackpad_pins>;
>   		vcc-supply = <&pp3300_u>;
>   		wakeup-source;
>   	};


From matthias.bgg at gmail.com  Fri Sep 13 04:34:49 2024
From: matthias.bgg at gmail.com (Matthias Brugger)
Date: Fri, 13 Sep 2024 13:34:49 +0200
Subject: [PATCH v2] arm64: dts: mediatek: mt8395-genio-1200-evk: Enable
 GPU
In-Reply-To: <20240912070624.25540-1-pablo.sun@mediatek.com>
References: <20240912070624.25540-1-pablo.sun@mediatek.com>
Message-ID: <edf25359-1804-445d-bd49-45c7238a3cd5@gmail.com>



On 12/09/2024 09:06, Pablo Sun wrote:
> Enable the Mali Valhall GPU on Genio 1200 EVK by providing regulator
> supply settingsi to gpu and mfg1, and enable the GPU node.
> 
> In addition, set the GPU related regulator voltage range:
> 
> 1. Set the recommended input voltage range of DVDD_GPU to (0.546V-0.787V),
>     based on Table 5-3 of MT8395 Application Processor Datasheet.
>     The regulator mt6315_7_vbuck1("Vgpu") connects to the DVDD_GPU input.
>     Note that the minimum voltage in SoC eFuse data, which is read by
>     MTK-SVS to adjust the regulator voltage, does not go below
>     the recommended operating voltage in the datasheet.
> 
> 2. Set the input voltage of DVDD_SRAM_GPU, supplied by
>     mt6359_vsram_others_ldo_reg, to 0.75V, the recommended typical
>     operating voltage in MT8395 Application Processor Datasheet.
> 
> This patch is tested by enabling CONFIG_DRM_PANFROST and
> on Genio 1200 EVK it probed with following dmesg:
> 
> ```
> panfrost 13000000.gpu: clock rate = 700000092
> panfrost 13000000.gpu: mali-g57 id 0x9093 major 0x0 minor 0x1 status 0x0
> panfrost 13000000.gpu: features: 00000000,000019f7,
> 					   issues: 00000001,80000400
> panfrost 13000000.gpu: Features: L2:0x07120206 Shader:0x00000000
> 					   Tiler:0x00000809 Mem:0x301
> 					   MMU:0x00002830 AS:0xff JS:0x7
> panfrost 13000000.gpu: shader_present=0x50045 l2_present=0x1
> [drm] Initialized panfrost 1.2.0 for 13000000.gpu on minor 0
> ```
> 
> Signed-off-by: Pablo Sun <pablo.sun at mediatek.com>

Reviewed-by: Matthias Brugger <matthias.bgg at gmail.com>

> ---
>   .../dts/mediatek/mt8395-genio-1200-evk.dts    | 19 +++++++++++++++++--
>   1 file changed, 17 insertions(+), 2 deletions(-)
> 
> diff --git a/arch/arm64/boot/dts/mediatek/mt8395-genio-1200-evk.dts b/arch/arm64/boot/dts/mediatek/mt8395-genio-1200-evk.dts
> index a06610fff8ad..4f7d66d6d785 100644
> --- a/arch/arm64/boot/dts/mediatek/mt8395-genio-1200-evk.dts
> +++ b/arch/arm64/boot/dts/mediatek/mt8395-genio-1200-evk.dts
> @@ -194,6 +194,11 @@ eth_phy0: eth-phy0 at 1 {
>   	};
>   };
>   
> +&gpu {
> +	mali-supply = <&mt6315_7_vbuck1>;
> +	status = "okay";
> +};
> +
>   &i2c0 {
>   	clock-frequency = <400000>;
>   	pinctrl-0 = <&i2c0_pins>;
> @@ -337,6 +342,10 @@ &mfg0 {
>   	domain-supply = <&mt6315_7_vbuck1>;
>   };
>   
> +&mfg1 {
> +	domain-supply = <&mt6359_vsram_others_ldo_reg>;
> +};
> +
>   &mmc0 {
>   	status = "okay";
>   	pinctrl-names = "default", "state_uhs";
> @@ -407,6 +416,12 @@ &mt6359_vrf12_ldo_reg {
>   	regulator-always-on;
>   };
>   
> +/* for GPU SRAM */
> +&mt6359_vsram_others_ldo_reg {
> +	regulator-min-microvolt = <750000>;
> +	regulator-max-microvolt = <750000>;
> +};
> +
>   &mt6359codec {
>   	mediatek,mic-type-0 = <1>; /* ACC */
>   	mediatek,mic-type-1 = <3>; /* DCC */
> @@ -839,8 +854,8 @@ regulators {
>   			mt6315_7_vbuck1: vbuck1 {
>   				regulator-compatible = "vbuck1";
>   				regulator-name = "Vgpu";
> -				regulator-min-microvolt = <300000>;
> -				regulator-max-microvolt = <1193750>;
> +				regulator-min-microvolt = <546000>;
> +				regulator-max-microvolt = <787000>;
>   				regulator-enable-ramp-delay = <256>;
>   				regulator-allowed-modes = <0 1 2>;
>   			};


From andre.draszik at linaro.org  Fri Sep 13 04:43:58 2024
From: andre.draszik at linaro.org (=?utf-8?q?Andr=C3=A9_Draszik?=)
Date: Fri, 13 Sep 2024 12:43:58 +0100
Subject: [PATCH] regulator: update some comments ([gs]et_voltage_vsel vs
 [gs]et_voltage_sel)
Message-ID: <20240913-regulator-typos-v1-1-92781c93f638@linaro.org>

Some comments here are referring to a non-existent
regulator_ops::get_voltage_vsel() where ::get_voltage_sel() is meant,
and similar for ::set_voltage_vsel() / ::set_voltage_sel().

Update the comments.

Signed-off-by: Andr? Draszik <andre.draszik at linaro.org>
---
 drivers/regulator/helpers.c          | 8 ++++----
 drivers/regulator/mt6357-regulator.c | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/drivers/regulator/helpers.c b/drivers/regulator/helpers.c
index 6e1ace660b8c..0def82eb8b46 100644
--- a/drivers/regulator/helpers.c
+++ b/drivers/regulator/helpers.c
@@ -125,7 +125,7 @@ static int regulator_range_selector_to_index(struct regulator_dev *rdev,
  *
  * Regulators that use regmap for their register I/O and use pickable
  * ranges can set the vsel_reg, vsel_mask, vsel_range_reg and vsel_range_mask
- * fields in their descriptor and then use this as their get_voltage_vsel
+ * fields in their descriptor and then use this as their get_voltage_sel
  * operation, saving some code.
  */
 int regulator_get_voltage_sel_pickable_regmap(struct regulator_dev *rdev)
@@ -195,7 +195,7 @@ static int write_separate_vsel_and_range(struct regulator_dev *rdev,
  *
  * Regulators that use regmap for their register I/O and use pickable
  * ranges can set the vsel_reg, vsel_mask, vsel_range_reg and vsel_range_mask
- * fields in their descriptor and then use this as their set_voltage_vsel
+ * fields in their descriptor and then use this as their set_voltage_sel
  * operation, saving some code.
  */
 int regulator_set_voltage_sel_pickable_regmap(struct regulator_dev *rdev,
@@ -250,7 +250,7 @@ EXPORT_SYMBOL_GPL(regulator_set_voltage_sel_pickable_regmap);
  *
  * Regulators that use regmap for their register I/O can set the
  * vsel_reg and vsel_mask fields in their descriptor and then use this
- * as their get_voltage_vsel operation, saving some code.
+ * as their get_voltage_sel operation, saving some code.
  */
 int regulator_get_voltage_sel_regmap(struct regulator_dev *rdev)
 {
@@ -276,7 +276,7 @@ EXPORT_SYMBOL_GPL(regulator_get_voltage_sel_regmap);
  *
  * Regulators that use regmap for their register I/O can set the
  * vsel_reg and vsel_mask fields in their descriptor and then use this
- * as their set_voltage_vsel operation, saving some code.
+ * as their set_voltage_sel operation, saving some code.
  */
 int regulator_set_voltage_sel_regmap(struct regulator_dev *rdev, unsigned sel)
 {
diff --git a/drivers/regulator/mt6357-regulator.c b/drivers/regulator/mt6357-regulator.c
index c0439a4e0b50..1eb69c7a6acb 100644
--- a/drivers/regulator/mt6357-regulator.c
+++ b/drivers/regulator/mt6357-regulator.c
@@ -123,7 +123,7 @@ struct mt6357_regulator_info {
  *
  * Regulators that use regmap for their register I/O can set the
  * da_vsel_reg and da_vsel_mask fields in the info structure and
- * then use this as their get_voltage_vsel operation.
+ * then use this as their get_voltage_sel operation.
  */
 static int mt6357_get_buck_voltage_sel(struct regulator_dev *rdev)
 {

---
base-commit: 5acd9952f95fb4b7da6d09a3be39195a80845eb6
change-id: 20240913-regulator-typos-5c918985e91e

Best regards,
-- 
Andr? Draszik <andre.draszik at linaro.org>



From ulf.hansson at linaro.org  Fri Sep 13 05:01:55 2024
From: ulf.hansson at linaro.org (Ulf Hansson)
Date: Fri, 13 Sep 2024 14:01:55 +0200
Subject: [PATCH -next] pmdomain: mediatek: make use of dev_err_cast_probe()
In-Reply-To: <20240828121230.3696315-1-lihongbo22@huawei.com>
References: <20240828121230.3696315-1-lihongbo22@huawei.com>
Message-ID: <CAPDyKFoy_5qHANFOoQGk0hvHOMrWiOp4p4aqpUTWyAFWiJdh4Q@mail.gmail.com>

On Wed, 28 Aug 2024 at 14:04, Hongbo Li <lihongbo22 at huawei.com> wrote:
>
> Using dev_err_cast_probe() to simplify the code.
>
> Signed-off-by: Hongbo Li <lihongbo22 at huawei.com>

Applied for next, thanks!

Kind regards
Uffe


> ---
>  drivers/pmdomain/mediatek/mtk-pm-domains.c | 6 ++----
>  1 file changed, 2 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/pmdomain/mediatek/mtk-pm-domains.c b/drivers/pmdomain/mediatek/mtk-pm-domains.c
> index e274e3315fe7..88406e9ac63c 100644
> --- a/drivers/pmdomain/mediatek/mtk-pm-domains.c
> +++ b/drivers/pmdomain/mediatek/mtk-pm-domains.c
> @@ -398,12 +398,10 @@ generic_pm_domain *scpsys_add_one_domain(struct scpsys *scpsys, struct device_no
>                 scpsys->dev->of_node = node;
>                 pd->supply = devm_regulator_get(scpsys->dev, "domain");
>                 scpsys->dev->of_node = root_node;
> -               if (IS_ERR(pd->supply)) {
> -                       dev_err_probe(scpsys->dev, PTR_ERR(pd->supply),
> +               if (IS_ERR(pd->supply))
> +                       return dev_err_cast_probe(scpsys->dev, pd->supply,
>                                       "%pOF: failed to get power supply.\n",
>                                       node);
> -                       return ERR_CAST(pd->supply);
> -               }
>         }
>
>         pd->infracfg = syscon_regmap_lookup_by_phandle_optional(node, "mediatek,infracfg");
> --
> 2.34.1
>


From robh at kernel.org  Fri Sep 13 07:24:23 2024
From: robh at kernel.org (Rob Herring (Arm))
Date: Fri, 13 Sep 2024 09:24:23 -0500
Subject: [PATCH v7 0/2] arm64: dts: mediatek: Add MT8186 Ponyta
In-Reply-To: <20240913031505.372868-1-cengjianeng@huaqin.corp-partner.google.com>
References: <20240913031505.372868-1-cengjianeng@huaqin.corp-partner.google.com>
Message-ID: <172623730455.4076217.5756397383239098534.robh@kernel.org>


On Fri, 13 Sep 2024 11:15:03 +0800, Jianeng Ceng wrote:
> This is v7 of the MT8186 Chromebook device tree series.
> ---
> Changes in v7:
> - PATCH 2/2: Remove prototype sku.
> - PATCH 2/2: Disable the other trackpad to enable one of them.
> - Link to v5:https://lore.kernel.org/all/20240913015503.4192806-1-cengjianeng at huaqin.corp-partner.google.com/
> 
> Changes in v6:
> - No change.
> 
> Changes in v5:
> - PATCH 1/2: Remove sku2147483647.
> - PATCH 2/2: Remove sku2147483647.
> - Link to v4:https://lore.kernel.org/all/20240906085739.1322676-1-cengjianeng at huaqin.corp-partner.google.com/
> 
> Changes in v4:
> - PATCH 1/2: Add more info for Ponyta custom label in commit.
> - Link to v3:https://lore.kernel.org/all/20240904081501.2060933-1-cengjianeng at huaqin.corp-partner.google.com/
> 
> Changes in v3:
> - PATCH 0/2: Add the modify records.
> - PATCH 1/2: Modify lable to label.
> - Link to v2:https://lore.kernel.org/all/20240903061603.3007289-1-cengjianeng at huaqin.corp-partner.google.com/
> 
> Changes in v2:
> - PATCH 2/2: Modify the dtb name without rev2.
> - Link to v1:https://lore.kernel.org/all/20240902125502.1844374-1-cengjianeng at huaqin.corp-partner.google.com/
> 
> Jianeng Ceng (2):
>   dt-bindings: arm: mediatek: Add MT8186 Ponyta Chromebook
>   arm64: dts: mediatek: Add MT8186 Ponyta Chromebooks
> 
>  .../devicetree/bindings/arm/mediatek.yaml     | 10 +++++
>  arch/arm64/boot/dts/mediatek/Makefile         |  2 +
>  .../mediatek/mt8186-corsola-ponyta-sku0.dts   | 18 ++++++++
>  .../mediatek/mt8186-corsola-ponyta-sku1.dts   | 22 ++++++++++
>  .../dts/mediatek/mt8186-corsola-ponyta.dtsi   | 44 +++++++++++++++++++
>  5 files changed, 96 insertions(+)
>  create mode 100644 arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku0.dts
>  create mode 100644 arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku1.dts
>  create mode 100644 arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta.dtsi
> 
> --
> 2.34.1
> 
> 
> 


My bot found new DTB warnings on the .dts files added or changed in this
series.

Some warnings may be from an existing SoC .dtsi. Or perhaps the warnings
are fixed by another series. Ultimately, it is up to the platform
maintainer whether these warnings are acceptable or not. No need to reply
unless the platform maintainer has comments.

If you already ran DT checks and didn't see these error(s), then
make sure dt-schema is up to date:

  pip3 install dtschema --upgrade


New warnings running 'make CHECK_DTBS=y mediatek/mt8186-corsola-ponyta-sku0.dtb mediatek/mt8186-corsola-ponyta-sku1.dtb' for 20240913031505.372868-1-cengjianeng at huaqin.corp-partner.google.com:

arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku0.dtb: /soc/pwrap at 1000d000/pmic: failed to match any schema with compatible: ['mediatek,mt6366', 'mediatek,mt6358']
arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku0.dtb: /soc/pwrap at 1000d000/pmic: failed to match any schema with compatible: ['mediatek,mt6366', 'mediatek,mt6358']
arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku1.dtb: /soc/pwrap at 1000d000/pmic: failed to match any schema with compatible: ['mediatek,mt6366', 'mediatek,mt6358']
arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku1.dtb: /soc/pwrap at 1000d000/pmic: failed to match any schema with compatible: ['mediatek,mt6366', 'mediatek,mt6358']
arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku0.dtb: /soc/pwrap at 1000d000/pmic/codec: failed to match any schema with compatible: ['mediatek,mt6366-sound', 'mediatek,mt6358-sound']
arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku0.dtb: /soc/pwrap at 1000d000/pmic/codec: failed to match any schema with compatible: ['mediatek,mt6366-sound', 'mediatek,mt6358-sound']
arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku1.dtb: /soc/pwrap at 1000d000/pmic/codec: failed to match any schema with compatible: ['mediatek,mt6366-sound', 'mediatek,mt6358-sound']
arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku1.dtb: /soc/pwrap at 1000d000/pmic/codec: failed to match any schema with compatible: ['mediatek,mt6366-sound', 'mediatek,mt6358-sound']
arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku0.dtb: /soc/pwrap at 1000d000/pmic/rtc: failed to match any schema with compatible: ['mediatek,mt6366-rtc', 'mediatek,mt6358-rtc']
arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku0.dtb: /soc/pwrap at 1000d000/pmic/rtc: failed to match any schema with compatible: ['mediatek,mt6366-rtc', 'mediatek,mt6358-rtc']
arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku1.dtb: /soc/pwrap at 1000d000/pmic/rtc: failed to match any schema with compatible: ['mediatek,mt6366-rtc', 'mediatek,mt6358-rtc']
arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku1.dtb: /soc/pwrap at 1000d000/pmic/rtc: failed to match any schema with compatible: ['mediatek,mt6366-rtc', 'mediatek,mt6358-rtc']
arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku0.dtb: dp-bridge at 5c: 'extcon' is a required property
	from schema $id: http://devicetree.org/schemas/display/bridge/ite,it6505.yaml#
arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku1.dtb: dp-bridge at 5c: 'extcon' is a required property
	from schema $id: http://devicetree.org/schemas/display/bridge/ite,it6505.yaml#
arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku0.dtb: sound: 'model' is a required property
	from schema $id: http://devicetree.org/schemas/sound/mt8186-mt6366-rt1019-rt5682s.yaml#
arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku1.dtb: sound: 'model' is a required property
	from schema $id: http://devicetree.org/schemas/sound/mt8186-mt6366-rt1019-rt5682s.yaml#







From andi.shyti at kernel.org  Fri Sep 13 07:59:42 2024
From: andi.shyti at kernel.org (Andi Shyti)
Date: Fri, 13 Sep 2024 16:59:42 +0200
Subject: [PATCH v7 05/10] i2c: core: Remove extra space in Makefile
In-Reply-To: <20240911072751.365361-6-wenst@chromium.org>
References: <20240911072751.365361-1-wenst@chromium.org>
 <20240911072751.365361-6-wenst@chromium.org>
Message-ID: <q5g4lus3fifwtaypqvljtmw754px473mpx66b2vtemyivqfpm2@4q3mnojbfp66>

Hi Chen-Yu,

On Wed, Sep 11, 2024 at 03:27:43PM GMT, Chen-Yu Tsai wrote:
> Some lines in the Makefile have a space before tabs. Remove those.
> 
> Reported-by: Andy Shevchenko <andriy.shevchenko at linux.intel.com>
> Closes: https://lore.kernel.org/all/ZsdE0PxKnGRjzChl at smile.fi.intel.com/
> Signed-off-by: Chen-Yu Tsai <wenst at chromium.org>
> Reviewed-by: Andy Shevchenko <andriy.shevchenko at linux.intel.com>

Reviewed-by: Andi Shyti <andi.shyti at kernel.org>

Thanks,
Andi


From broonie at kernel.org  Fri Sep 13 09:11:54 2024
From: broonie at kernel.org (Mark Brown)
Date: Fri, 13 Sep 2024 17:11:54 +0100
Subject: [PATCH] regulator: update some comments ([gs]et_voltage_vsel
 vs [gs]et_voltage_sel)
In-Reply-To: <20240913-regulator-typos-v1-1-92781c93f638@linaro.org>
References: <20240913-regulator-typos-v1-1-92781c93f638@linaro.org>
Message-ID: <172624391451.49323.15305955333400059916.b4-ty@kernel.org>

On Fri, 13 Sep 2024 12:43:58 +0100, Andr? Draszik wrote:
> Some comments here are referring to a non-existent
> regulator_ops::get_voltage_vsel() where ::get_voltage_sel() is meant,
> and similar for ::set_voltage_vsel() / ::set_voltage_sel().
> 
> Update the comments.
> 
> 
> [...]

Applied to

   https://git.kernel.org/pub/scm/linux/kernel/git/broonie/regulator.git for-next

Thanks!

[1/1] regulator: update some comments ([gs]et_voltage_vsel vs [gs]et_voltage_sel)
      commit: fb9ce84a01582c9d67dc51d5330136ea684172ef

All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.

You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.

If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.

Please add any relevant lists and maintainers to the CCs when replying
to this mail.

Thanks,
Mark



From macpaul.lin at mediatek.com  Fri Sep 13 09:29:48 2024
From: macpaul.lin at mediatek.com (Macpaul Lin)
Date: Sat, 14 Sep 2024 00:29:48 +0800
Subject: [PATCH v2 3/7] dt-bindings: rtc: mt6397: merge to MFD
 mediatek,mt6397 DT schema
In-Reply-To: <20240830153437.GB4175444-robh@kernel.org>
References: <20240830110732.30080-1-macpaul.lin@mediatek.com>
 <20240830110732.30080-3-macpaul.lin@mediatek.com>
 <20240830153437.GB4175444-robh@kernel.org>
Message-ID: <d77b6a8c-f499-7980-868d-7717046ec3e3@mediatek.com>


On 8/30/24 23:34, Rob Herring wrote:
> 	
> 
> External email : Please do not click links or open attachments until you 
> have verified the sender or the content.
> 
> On Fri, Aug 30, 2024 at 07:07:28PM +0800, Macpaul Lin wrote:
>> Convert rtc-mt6397.txt be compatible with the DT schema.
>> Since this is a simple RTC device node, merge it into parent
>> mediatek,mt6397.yaml. Subsequently, remove rtc-mt6397.txt with a
>> separate patch.
> 
> This doesn't match what the patch does. You can just squash this into
> the MFD patch where you add the schema.
> 

[snip]

Will squash the other patches for removing text format files in to the 
MFD patch in next (v3) version. Thanks!

Regards,
Macpaul Lin


From macpaul.lin at mediatek.com  Fri Sep 13 09:33:20 2024
From: macpaul.lin at mediatek.com (Macpaul Lin)
Date: Sat, 14 Sep 2024 00:33:20 +0800
Subject: [PATCH v2 6/7] dt-bindings: power: reset: mt6323: merge to MFD
 mediatek,mt6397 DT schema
In-Reply-To: <01020191b9d74883-4c4deeb2-1be0-4c45-9fff-c228767de23d-000000@eu-west-1.amazonses.com>
References: <20240830110732.30080-1-macpaul.lin@mediatek.com>
 <20240830110732.30080-6-macpaul.lin@mediatek.com>
 <01020191b9d74883-4c4deeb2-1be0-4c45-9fff-c228767de23d-000000@eu-west-1.amazonses.com>
Message-ID: <117a6f04-4228-8ff5-5b19-766cfbbf0771@mediatek.com>



On 9/4/24 05:42, Sebastian Reichel wrote:
> Hi,
> 
> On Fri, Aug 30, 2024 at 07:07:31PM GMT, Macpaul Lin wrote:
>> Convert mt6323-poweroff.txt to be compatible with DT schema.
>> Since this is a power-controller device node, merge it into parent
>> mediatek,mt6397.yaml. Subsequently, remove mt6323-poweroff.txt with a
>> separate patch.
>>
>> Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
>> ---
> 
> Please merge this into PATCH 2/7 in the next version of the patchset
> (i.e. the patch creating the new YAML binding).
> 
> -- Sebastian
> 

[snip]

Will squash the other patches for removing text format files in to the 
MFD patch in next (v3) version. Thanks!

Regards,
Macpaul Lin




From bvanassche at acm.org  Fri Sep 13 10:41:27 2024
From: bvanassche at acm.org (Bart Van Assche)
Date: Fri, 13 Sep 2024 10:41:27 -0700
Subject: [PATCH v4 2/2] ufs: core: requeue aborted request
In-Reply-To: <6fc025d7ffb9d702a117381fb5da318b40a24246.camel@mediatek.com>
References: <20240910073035.25974-1-peter.wang@mediatek.com>
 <20240910073035.25974-3-peter.wang@mediatek.com>
 <e42abf07-ba6b-4301-8717-8d5b01d56640@acm.org>
 <04e392c00986ac798e881dcd347ff5045cf61708.camel@mediatek.com>
 <858c4b6b-fcbc-4d51-8641-051aeda387c5@acm.org>
 <524e9da9196cc0acf497ff87eba3a8043b780332.camel@mediatek.com>
 <6203d7c9-b33c-4bf1-aca3-5fc8ba5636b9@acm.org>
 <6fc025d7ffb9d702a117381fb5da318b40a24246.camel@mediatek.com>
Message-ID: <46d8be04-10db-4de1-8a59-6cd402bcecb1@acm.org>

On 9/13/24 12:10 AM, Peter Wang (???) wrote:
> Because the MediaTek UFS controller uses UTRLCLR to clear
> commands and fills OCS with ABORTED.
> 
> Regarding the specification of UTRCS:
> This bit is set to '1' by the host controller upon one of the
> following:
> 	Overall command Status (OCS) of the completed command is not
> 	equal to 'SUCCESS' even if its UTRD Interrupt bit set to '0'
> 
> So, MediaTek host controller will send interrupt in this case.

Hi Peter,

Thank you for having shared this information. Please consider
introducing a quirk for ignoring completions triggered by clearing
a command, e.g. as follows (there may be better approaches):
* In ufshcd_clear_cmd(), before a command is cleared, initialize
   the completion that will be used for waiting for the completion
   interrupt. After a command has been cleared, call
   wait_for_completion_timeout().
* In ufshcd_compl_one_cqe(), check whether the completion is the
   result of a command being cleared. If so, call complete() instead
   of executing the regular completion code.

Thanks,

Bart.


From macpaul.lin at mediatek.com  Fri Sep 13 10:47:52 2024
From: macpaul.lin at mediatek.com (Macpaul Lin)
Date: Sat, 14 Sep 2024 01:47:52 +0800
Subject: [PATCH v2 1/7] regulator: dt-bindings: mt6323: Convert to DT
 schema
In-Reply-To: <20240830145056.GA4170065-robh@kernel.org>
References: <20240830110732.30080-1-macpaul.lin@mediatek.com>
 <20240830145056.GA4170065-robh@kernel.org>
Message-ID: <f6050fa5-4cb5-9283-263b-bcd0d97a09bc@mediatek.com>

On 8/30/24 22:50, Rob Herring wrote:
> 	
> 
> External email : Please do not click links or open attachments until you 
> have verified the sender or the content.
> 
> On Fri, Aug 30, 2024 at 07:07:26PM +0800, Macpaul Lin wrote:
>> Convert this from the old style text based binding to the new DT schema
>> style.
>> 
>> The examples have been trimmed down and move to parent schema
>> mfd/mediatek,mt6397.yaml.
>> 
>> Add new maintainers and submitter from MediaTek.
>> 
>> Signed-off-by: Sen Chu <sen.chu at mediatek.com>
>> Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>

[snip]

>> +
>> +patternProperties:
>> +  "^(buck_)?v(pa|proc|sys)$":
>> +    description: Buck regulators
>> +    type: object
>> +    $ref: regulator.yaml#
>> +    properties:
>> +      regulator-allowed-modes: false
>> +    unevaluatedProperties: false
>> +
>> +  "^(ldo_)?v(camio|cn18)$":
> 
> Why are buck_ and ldo_ prefixes optional? The old binding didn't reflect
> actual (upstream) users? If so, that's fine, but mention that in the
> commit message.
> 
> Rob
> 

Will use "^buck_v" and "^ldo_v" as the prefixes of each items in 
patternProperties. Thanks!

Regards,
Macpaul Lin


From macpaul.lin at mediatek.com  Fri Sep 13 10:57:53 2024
From: macpaul.lin at mediatek.com (Macpaul Lin)
Date: Sat, 14 Sep 2024 01:57:53 +0800
Subject: [PATCH v3 1/3] regulator: dt-bindings: mt6323: Convert to DT schema
Message-ID: <20240913175753.6562-1-macpaul.lin@mediatek.com>

Convert the MT6323 regulator binding from the old text-based format to
the new DT schema style. The property "regulator-name" has been added
as required property to reflect current usage in mt6323.dtsi.

Examples have been streamlined and relocated to the parent schema file:
  mfd/mediatek,mt6397.yaml.

Update maintainer and submitter information with new entries from MediaTek.

The reference document cited in "mediatek,mt7530.yaml" has been updated
to point to this new DT schema file

Signed-off-by: Sen Chu <sen.chu at mediatek.com>
Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
---
 .../bindings/net/dsa/mediatek,mt7530.yaml     |   4 +-
 .../regulator/mediatek,mt6323-regulator.yaml  | 120 +++++++++
 .../bindings/regulator/mt6323-regulator.txt   | 237 ------------------
 3 files changed, 122 insertions(+), 239 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/regulator/mediatek,mt6323-regulator.yaml
 delete mode 100644 Documentation/devicetree/bindings/regulator/mt6323-regulator.txt

Changes for v1 and v2:
 - This is the first version of converting mt6323-regulator.
   This is because converting mt6323-regulator together
   with mfd/mediatek,mt6397.yaml, so we've create a patch set
   instead of single patch for each skydives.
 - This patch has been made base on linux-next/master git repo.

Changes for v3:
 - Rebased on linux-next/master git repo near next-20240906.
 - Added 'regulator-name' to 'requried' property to reflect current usage.
 - replace ^(buck_)? and ^(ldo_)? to ^buck_ and ^ldo_ prefix.
 - Update file name of 'mediatek,mt6323-regulator.yaml' in
   'mediatek,mt7530.yaml'

diff --git a/Documentation/devicetree/bindings/net/dsa/mediatek,mt7530.yaml b/Documentation/devicetree/bindings/net/dsa/mediatek,mt7530.yaml
index ea979bc..413db38 100644
--- a/Documentation/devicetree/bindings/net/dsa/mediatek,mt7530.yaml
+++ b/Documentation/devicetree/bindings/net/dsa/mediatek,mt7530.yaml
@@ -129,8 +129,8 @@ properties:
   io-supply:
     description: |
       Phandle to the regulator node necessary for the I/O power.
-      See Documentation/devicetree/bindings/regulator/mt6323-regulator.txt for
-      details for the regulator setup on these boards.
+      See Documentation/devicetree/bindings/regulator/mediatek,mt6323-regulator.yaml
+      for details for the regulator setup on these boards.
 
   mediatek,mcm:
     type: boolean
diff --git a/Documentation/devicetree/bindings/regulator/mediatek,mt6323-regulator.yaml b/Documentation/devicetree/bindings/regulator/mediatek,mt6323-regulator.yaml
new file mode 100644
index 0000000..01b0aba
--- /dev/null
+++ b/Documentation/devicetree/bindings/regulator/mediatek,mt6323-regulator.yaml
@@ -0,0 +1,120 @@
+# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/regulator/mediatek,mt6323-regulator.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: MediaTek MT6323 Regulator
+
+maintainers:
+  - John Crispin <john at phrozen.org>
+  - Sen Chu <sen.chu at mediatek.com>
+  - Macpaul Lin <macpaul.lin at mediatek.com>
+
+description: |
+  Regulator node of the PMIC. This node should under the PMIC's device node.
+  All voltage regulators provided by the PMIC are described as sub-nodes of
+  this node.
+
+properties:
+  compatible:
+    items:
+      - const: mediatek,mt6323-regulator
+
+patternProperties:
+  "^buck_v(pa|proc|sys)$":
+    description: Buck regulators
+    type: object
+    $ref: regulator.yaml#
+
+    properties:
+      regulator-allowed-modes: false
+
+    unevaluatedProperties: false
+
+    required:
+      - regulator-name
+
+  "^ldo_v(camio|cn18)$":
+    description: LDO with fixed 1.8V output and 0~100/10mV tuning
+    type: object
+    $ref: regulator.yaml#
+
+    properties:
+      regulator-allowed-modes: false
+
+    unevaluatedProperties: false
+
+    required:
+      - regulator-name
+
+  "^ldo_v((io|rf)18)$":
+    description: LDOs with fixed 1.825V output and 0~100/10mV tuning
+    type: object
+    $ref: regulator.yaml#
+
+    properties:
+      regulator-allowed-modes: false
+
+    unevaluatedProperties: false
+
+    required:
+      - regulator-name
+
+  "^ldo_v(a|rtc|tcxo|(cn|io)28)$":
+    description: LDOs with fixed 2.8V output and 0~100/10mV tuning
+    type: object
+    $ref: regulator.yaml#
+
+    properties:
+      regulator-allowed-modes: false
+
+    unevaluatedProperties: false
+
+    required:
+      - regulator-name
+
+  "^ldo_v(usb)$":
+    description: LDOs with fixed 3.3V output and 0~100/10mV tuning
+    type: object
+    $ref: regulator.yaml#
+
+    properties:
+      regulator-allowed-modes: false
+
+    unevaluatedProperties: false
+
+    required:
+      - regulator-name
+
+  "^ldo_v(cn33_(bt|wifi))$":
+    description: LDOs with variable 3.3V output and 0~100/10mV tuning
+    type: object
+    $ref: regulator.yaml#
+
+    properties:
+      regulator-allowed-modes: false
+
+    unevaluatedProperties: false
+
+    required:
+      - regulator-name
+
+  "^ldo_v(cama|camaf|camd|emc3v3|gp[123]|ibr|m|mc|mch|sim[12])$":
+    description: LDOs with variable output and 0~100/10mV tuning
+    type: object
+    $ref: regulator.yaml#
+
+    properties:
+      regulator-allowed-modes: false
+
+    unevaluatedProperties: false
+
+    required:
+      - regulator-name
+
+required:
+  - compatible
+
+additionalProperties: false
+
diff --git a/Documentation/devicetree/bindings/regulator/mt6323-regulator.txt b/Documentation/devicetree/bindings/regulator/mt6323-regulator.txt
deleted file mode 100644
index a48749d..0000000
--- a/Documentation/devicetree/bindings/regulator/mt6323-regulator.txt
+++ /dev/null
@@ -1,237 +0,0 @@
-Mediatek MT6323 Regulator
-
-All voltage regulators are defined as subnodes of the regulators node. A list
-of regulators provided by this controller are defined as subnodes of the
-PMIC's node. Each regulator is named according to its regulator type,
-buck_<name> and ldo_<name>. The definition for each of these nodes is defined
-using the standard binding for regulators at
-Documentation/devicetree/bindings/regulator/regulator.txt.
-
-The valid names for regulators are::
-BUCK:
-  buck_vproc, buck_vsys, buck_vpa
-LDO:
-  ldo_vtcxo, ldo_vcn28, ldo_vcn33_bt, ldo_vcn33_wifi, ldo_va, ldo_vcama,
-  ldo_vio28, ldo_vusb, ldo_vmc, ldo_vmch, ldo_vemc3v3, ldo_vgp1, ldo_vgp2,
-  ldo_vgp3, ldo_vcn18, ldo_vsim1, ldo_vsim2, ldo_vrtc, ldo_vcamaf, ldo_vibr,
-  ldo_vrf18, ldo_vm, ldo_vio18, ldo_vcamd, ldo_vcamio
-
-Example:
-
-	pmic: mt6323 {
-		mt6323regulator: regulators {
-			mt6323_vproc_reg: buck_vproc{
-				regulator-name = "vproc";
-				regulator-min-microvolt = < 700000>;
-				regulator-max-microvolt = <1350000>;
-				regulator-ramp-delay = <12500>;
-				regulator-always-on;
-				regulator-boot-on;
-			};
-
-			mt6323_vsys_reg: buck_vsys{
-				regulator-name = "vsys";
-				regulator-min-microvolt = <1400000>;
-				regulator-max-microvolt = <2987500>;
-				regulator-ramp-delay = <25000>;
-				regulator-always-on;
-				regulator-boot-on;
-			};
-
-			mt6323_vpa_reg: buck_vpa{
-				regulator-name = "vpa";
-				regulator-min-microvolt = < 500000>;
-				regulator-max-microvolt = <3650000>;
-			};
-
-			mt6323_vtcxo_reg: ldo_vtcxo{
-				regulator-name = "vtcxo";
-				regulator-min-microvolt = <2800000>;
-				regulator-max-microvolt = <2800000>;
-				regulator-enable-ramp-delay = <90>;
-				regulator-always-on;
-				regulator-boot-on;
-			};
-
-			mt6323_vcn28_reg: ldo_vcn28{
-				regulator-name = "vcn28";
-				regulator-min-microvolt = <2800000>;
-				regulator-max-microvolt = <2800000>;
-				regulator-enable-ramp-delay = <185>;
-			};
-
-			mt6323_vcn33_bt_reg: ldo_vcn33_bt{
-				regulator-name = "vcn33_bt";
-				regulator-min-microvolt = <3300000>;
-				regulator-max-microvolt = <3600000>;
-				regulator-enable-ramp-delay = <185>;
-			};
-
-			mt6323_vcn33_wifi_reg: ldo_vcn33_wifi{
-				regulator-name = "vcn33_wifi";
-				regulator-min-microvolt = <3300000>;
-				regulator-max-microvolt = <3600000>;
-				regulator-enable-ramp-delay = <185>;
-			};
-
-			mt6323_va_reg: ldo_va{
-				regulator-name = "va";
-				regulator-min-microvolt = <2800000>;
-				regulator-max-microvolt = <2800000>;
-				regulator-enable-ramp-delay = <216>;
-				regulator-always-on;
-				regulator-boot-on;
-			};
-
-			mt6323_vcama_reg: ldo_vcama{
-				regulator-name = "vcama";
-				regulator-min-microvolt = <1500000>;
-				regulator-max-microvolt = <2800000>;
-				regulator-enable-ramp-delay = <216>;
-			};
-
-			mt6323_vio28_reg: ldo_vio28{
-				regulator-name = "vio28";
-				regulator-min-microvolt = <2800000>;
-				regulator-max-microvolt = <2800000>;
-				regulator-enable-ramp-delay = <216>;
-				regulator-always-on;
-				regulator-boot-on;
-			};
-
-			mt6323_vusb_reg: ldo_vusb{
-				regulator-name = "vusb";
-				regulator-min-microvolt = <3300000>;
-				regulator-max-microvolt = <3300000>;
-				regulator-enable-ramp-delay = <216>;
-				regulator-boot-on;
-			};
-
-			mt6323_vmc_reg: ldo_vmc{
-				regulator-name = "vmc";
-				regulator-min-microvolt = <1800000>;
-				regulator-max-microvolt = <3300000>;
-				regulator-enable-ramp-delay = <36>;
-				regulator-boot-on;
-			};
-
-			mt6323_vmch_reg: ldo_vmch{
-				regulator-name = "vmch";
-				regulator-min-microvolt = <3000000>;
-				regulator-max-microvolt = <3300000>;
-				regulator-enable-ramp-delay = <36>;
-				regulator-boot-on;
-			};
-
-			mt6323_vemc3v3_reg: ldo_vemc3v3{
-				regulator-name = "vemc3v3";
-				regulator-min-microvolt = <3000000>;
-				regulator-max-microvolt = <3300000>;
-				regulator-enable-ramp-delay = <36>;
-				regulator-boot-on;
-			};
-
-			mt6323_vgp1_reg: ldo_vgp1{
-				regulator-name = "vgp1";
-				regulator-min-microvolt = <1200000>;
-				regulator-max-microvolt = <3300000>;
-				regulator-enable-ramp-delay = <216>;
-			};
-
-			mt6323_vgp2_reg: ldo_vgp2{
-				regulator-name = "vgp2";
-				regulator-min-microvolt = <1200000>;
-				regulator-max-microvolt = <3000000>;
-				regulator-enable-ramp-delay = <216>;
-			};
-
-			mt6323_vgp3_reg: ldo_vgp3{
-				regulator-name = "vgp3";
-				regulator-min-microvolt = <1200000>;
-				regulator-max-microvolt = <1800000>;
-				regulator-enable-ramp-delay = <216>;
-			};
-
-			mt6323_vcn18_reg: ldo_vcn18{
-				regulator-name = "vcn18";
-				regulator-min-microvolt = <1800000>;
-				regulator-max-microvolt = <1800000>;
-				regulator-enable-ramp-delay = <216>;
-			};
-
-			mt6323_vsim1_reg: ldo_vsim1{
-				regulator-name = "vsim1";
-				regulator-min-microvolt = <1800000>;
-				regulator-max-microvolt = <3000000>;
-				regulator-enable-ramp-delay = <216>;
-			};
-
-			mt6323_vsim2_reg: ldo_vsim2{
-				regulator-name = "vsim2";
-				regulator-min-microvolt = <1800000>;
-				regulator-max-microvolt = <3000000>;
-				regulator-enable-ramp-delay = <216>;
-			};
-
-			mt6323_vrtc_reg: ldo_vrtc{
-				regulator-name = "vrtc";
-				regulator-min-microvolt = <2800000>;
-				regulator-max-microvolt = <2800000>;
-				regulator-always-on;
-				regulator-boot-on;
-			};
-
-			mt6323_vcamaf_reg: ldo_vcamaf{
-				regulator-name = "vcamaf";
-				regulator-min-microvolt = <1200000>;
-				regulator-max-microvolt = <3300000>;
-				regulator-enable-ramp-delay = <216>;
-			};
-
-			mt6323_vibr_reg: ldo_vibr{
-				regulator-name = "vibr";
-				regulator-min-microvolt = <1200000>;
-				regulator-max-microvolt = <3300000>;
-				regulator-enable-ramp-delay = <36>;
-			};
-
-			mt6323_vrf18_reg: ldo_vrf18{
-				regulator-name = "vrf18";
-				regulator-min-microvolt = <1825000>;
-				regulator-max-microvolt = <1825000>;
-				regulator-enable-ramp-delay = <187>;
-			};
-
-			mt6323_vm_reg: ldo_vm{
-				regulator-name = "vm";
-				regulator-min-microvolt = <1200000>;
-				regulator-max-microvolt = <1800000>;
-				regulator-enable-ramp-delay = <216>;
-				regulator-always-on;
-				regulator-boot-on;
-			};
-
-			mt6323_vio18_reg: ldo_vio18{
-				regulator-name = "vio18";
-				regulator-min-microvolt = <1800000>;
-				regulator-max-microvolt = <1800000>;
-				regulator-enable-ramp-delay = <216>;
-				regulator-always-on;
-				regulator-boot-on;
-			};
-
-			mt6323_vcamd_reg: ldo_vcamd{
-				regulator-name = "vcamd";
-				regulator-min-microvolt = <1200000>;
-				regulator-max-microvolt = <1800000>;
-				regulator-enable-ramp-delay = <216>;
-			};
-
-			mt6323_vcamio_reg: ldo_vcamio{
-				regulator-name = "vcamio";
-				regulator-min-microvolt = <1800000>;
-				regulator-max-microvolt = <1800000>;
-				regulator-enable-ramp-delay = <216>;
-			};
-		};
-	};
-- 
2.45.2



From macpaul.lin at mediatek.com  Fri Sep 13 10:59:26 2024
From: macpaul.lin at mediatek.com (Macpaul Lin)
Date: Sat, 14 Sep 2024 01:59:26 +0800
Subject: [PATCH v3 2/3] dt-bindings: mfd: mediatek: mt6397: Convert to DT schema format
Message-ID: <20240913175926.7443-1-macpaul.lin@mediatek.com>

Convert the mfd: mediatek: mt6397 binding to DT schema format.

MT6323, MT6358, and MT6397 are PMIC devices with multiple function
subdevices. They share a common PMIC design but have variations in
subdevice combinations.

Key updates in this conversion:

1. RTC:
   - Convert rtc-mt6397.txt and merge into parent MT6397 PMIC DT schema.

2. Regulators:
   - Align to generic name "regulators".
   - Update references from .txt to .yaml for mt6323, mt6358, and mt6397
     regulators.
   - Simplify regulator name labels in device tree examples.

3. Audio Codec:
   - Convert sound/mt6358.txt and merge into parent MT6397 PMIC DT schema.
   - Align to generic name "audio-codec" for codec and sound subdevices.
   - Add "mediatek,dmic-mode" and "Avdd-supply" properties.

4. Clocks:
   - Align to generic name "clocks" for clockbuffer subdevices.

5. LEDs:
   - Convert leds-mt6323.txt and merge into parent MT6397 PMIC DT schema.
   - Update LED binding.

6. Keys:
   - Add detailed descriptions for power and home keys.
   - Add compatible: mediatek,mt6358-keys.

7. Power Controller:
   - Convert mt6323-poweroff.txt and merge into parent MT6397 PMIC DT
     schema.
   - Add #power-domain-cells property to fix dt-binding check error.
   - Clarify "BBPU" as "Baseband power up".

8. Pinctrl:
   - Align to generic name "pinctrl" instead of "pin-controller".

Additional updates:
- MAINTAINERS: Add co-maintainers and reference to
  mfd/mediatek,mt6397.yaml for LED and power-controller drivers.
- input/mediatek,pmic-keys.yaml: Update reference to
  mfd/mediatek,mt6397.yaml.

Signed-off-by: Sen Chu <sen.chu at mediatek.com>
Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
---
 .../bindings/input/mediatek,pmic-keys.yaml    |    2 +-
 .../devicetree/bindings/leds/leds-mt6323.txt  |   63 -
 .../bindings/mfd/mediatek,mt6397.yaml         | 1078 +++++++++++++++++
 .../devicetree/bindings/mfd/mt6397.txt        |  110 --
 .../bindings/power/reset/mt6323-poweroff.txt  |   20 -
 .../devicetree/bindings/rtc/rtc-mt6397.txt    |   31 -
 .../devicetree/bindings/sound/mt6358.txt      |   26 -
 MAINTAINERS                                   |    8 +-
 8 files changed, 1085 insertions(+), 253 deletions(-)
 delete mode 100644 Documentation/devicetree/bindings/leds/leds-mt6323.txt
 create mode 100644 Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml
 delete mode 100644 Documentation/devicetree/bindings/mfd/mt6397.txt
 delete mode 100644 Documentation/devicetree/bindings/power/reset/mt6323-poweroff.txt
 delete mode 100644 Documentation/devicetree/bindings/rtc/rtc-mt6397.txt
 delete mode 100644 Documentation/devicetree/bindings/sound/mt6358.txt

Changes for v1:
 - This patch depends on conversion of mediatek,mt6397-regulator.yaml
   [1] https://lore.kernel.org/lkml/20240807091738.18387-1-macpaul.lin at mediatek.com/T/

Changes for v2:
 - This patch has been made base on linux-next/master git repo.
 - Keep the parent and child relationship with mediatek,pwrap in description.
   [2] https://lore.kernel.org/all/20240826-slurp-earphone-0d5173923ae8 at spud/
 - Keep the $ref for regulators since dt_binding_check didn't report any issue
   based on linux-next/master repo.
 - Fix description of mt6397/mt6323 devices, use "power management chip"
   instead of "multifunction device"
 - Drop unnecessary comments or description according to the review.
 - Convert sub-modules to DT Schema:
  - RTC, LEDs, power-controllers, regulators
 - Drop duplicate sub node name and description for sub-modules
  - RTC, Keys
 - examples:
  - drop parent pwrap node
  - Add examples from mediatek,mt6323-regulator.yaml
  - Add examples from mediatek,mt6358-regulator.yaml
  - Add examples from mediatek,mt6397-regulator.yaml
  - Complete the examples as could as possible.

Changes for v3:
 - Rebased on linux-next/master git repo near next-20240906.
 - Revise commit message.
 - Regulators:
  - Use "additionalProperties: true" and add "contains" for matching
    $ref DT bindings.
  - Simplify regulator name labels in device tree examples.
 - LEDs:
  - Use LED bindings.
 - Squash following patches in v2 for removing old text format DT bindings
   into this patch, includes:
  - leds-mt6323.txt, mt6323-poweroff.txt, rtc-mt6397.txt, sound/mt6358.txt.
 - Fix file format of DT schemas, add blank between properties.
 - Fix 'make checkrefdoc' errors, update reference in mediatek,pmic-keys.yaml.

diff --git a/Documentation/devicetree/bindings/input/mediatek,pmic-keys.yaml b/Documentation/devicetree/bindings/input/mediatek,pmic-keys.yaml
index 70567d9..466566a 100644
--- a/Documentation/devicetree/bindings/input/mediatek,pmic-keys.yaml
+++ b/Documentation/devicetree/bindings/input/mediatek,pmic-keys.yaml
@@ -19,7 +19,7 @@ description: |
   by the PMIC that is defined as a Multi-Function Device (MFD).
 
   For MediaTek MT6323/MT6397 PMIC bindings see
-  Documentation/devicetree/bindings/mfd/mt6397.txt
+  Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml
 
 properties:
   compatible:
diff --git a/Documentation/devicetree/bindings/leds/leds-mt6323.txt b/Documentation/devicetree/bindings/leds/leds-mt6323.txt
deleted file mode 100644
index 052dccb8..0000000
--- a/Documentation/devicetree/bindings/leds/leds-mt6323.txt
+++ /dev/null
@@ -1,63 +0,0 @@
-Device Tree Bindings for LED support on MT6323 PMIC
-
-MT6323 LED controller is subfunction provided by MT6323 PMIC, so the LED
-controllers are defined as the subnode of the function node provided by MT6323
-PMIC controller that is being defined as one kind of Muti-Function Device (MFD)
-using shared bus called PMIC wrapper for each subfunction to access remote
-MT6323 PMIC hardware.
-
-For MT6323 MFD bindings see:
-Documentation/devicetree/bindings/mfd/mt6397.txt
-For MediaTek PMIC wrapper bindings see:
-Documentation/devicetree/bindings/soc/mediatek/mediatek,pwrap.yaml
-
-Required properties:
-- compatible : Must be one of
-  - "mediatek,mt6323-led"
-  - "mediatek,mt6331-led"
-  - "mediatek,mt6332-led"
-- address-cells : Must be 1
-- size-cells : Must be 0
-
-Each led is represented as a child node of the mediatek,mt6323-led that
-describes the initial behavior for each LED physically and currently only four
-LED child nodes can be supported.
-
-Required properties for the LED child node:
-- reg : LED channel number (0..3)
-
-Optional properties for the LED child node:
-- label : See Documentation/devicetree/bindings/leds/common.txt
-- linux,default-trigger : See Documentation/devicetree/bindings/leds/common.txt
-- default-state: See Documentation/devicetree/bindings/leds/common.txt
-
-Example:
-
-	mt6323: pmic {
-		compatible = "mediatek,mt6323";
-
-		...
-
-		mt6323led: leds {
-			compatible = "mediatek,mt6323-led";
-			#address-cells = <1>;
-			#size-cells = <0>;
-
-			led at 0 {
-				reg = <0>;
-				label = "LED0";
-				linux,default-trigger = "timer";
-				default-state = "on";
-			};
-			led at 1 {
-				reg = <1>;
-				label = "LED1";
-				default-state = "off";
-			};
-			led at 2 {
-				reg = <2>;
-				label = "LED2";
-				default-state = "on";
-			};
-		};
-	};
diff --git a/Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml b/Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml
new file mode 100644
index 0000000..3348ea3
--- /dev/null
+++ b/Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml
@@ -0,0 +1,1078 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/mfd/mediatek,mt6397.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: MediaTek MT6397/MT6323 Multifunction Device (PMIC)
+
+maintainers:
+  - Sen Chu <sen.chu at mediatek.com>
+  - Macpaul Lin <macpaul.lin at mediatek.com>
+
+description: |
+  MT6397/MT6323 is a power management system chip.
+  Please see the sub-modules below for supported features.
+
+  MT6397/MT6323 is a multifunction device with the following sub modules:
+  - Regulators
+  - RTC
+  - Audio codec
+  - GPIO
+  - Clock
+  - LED
+  - Keys
+  - Power controller
+
+  It is interfaced to host controller using SPI interface by a proprietary hardware
+  called PMIC wrapper or pwrap. MT6397/MT6323 PMIC is a child device of pwrap.
+  See the following for pwrap node definitions:
+  Documentation/devicetree/bindings/soc/mediatek/mediatek,pwrap.yaml
+
+properties:
+  compatible:
+    oneOf:
+      - enum:
+          - mediatek,mt6323
+          - mediatek,mt6331 # "mediatek,mt6331" for PMIC MT6331 and MT6332.
+          - mediatek,mt6357
+          - mediatek,mt6358
+          - mediatek,mt6359
+          - mediatek,mt6397
+      - items:
+          - enum:
+              - mediatek,mt6366
+          - const: mediatek,mt6358
+
+  interrupts:
+    maxItems: 1
+
+  interrupt-controller: true
+
+  "#interrupt-cells":
+    const: 2
+
+  rtc:
+    type: object
+    $ref: /schemas/rtc/rtc.yaml#
+    unevaluatedProperties: false
+    description:
+      MT6397 Real Time Clock.
+
+    properties:
+      compatible:
+        oneOf:
+          - enum:
+              - mediatek,mt6323-rtc
+              - mediatek,mt6331-rtc
+              - mediatek,mt6358-rtc
+              - mediatek,mt6397-rtc
+          - items:
+              - enum:
+                  - mediatek,mt6366-rtc
+              - const: mediatek,mt6358-rtc
+
+      start-year: true
+
+    required:
+      - compatible
+
+  regulators:
+    type: object
+    description:
+      List of child nodes that specify the regulators.
+    additionalProperties: true
+    properties:
+      compatible:
+        oneOf:
+          - enum:
+              - mediatek,mt6323-regulator
+              - mediatek,mt6358-regulator
+              - mediatek,mt6397-regulator
+          - items:
+              - enum:
+                  - mediatek,mt6366-regulator
+              - const: mediatek,mt6358-regulator
+
+    required:
+      - compatible
+
+    allOf:
+      - if:
+          properties:
+            compatible:
+              contains:
+                const: mediatek,mt6323-regulator
+
+        then:
+          $ref: /schemas/regulator/mediatek,mt6323-regulator.yaml
+
+      - if:
+          properties:
+            compatible:
+              contains:
+                const: mediatek,mt6358-regulator
+
+        then:
+          $ref: /schemas/regulator/mediatek,mt6358-regulator.yaml
+
+      - if:
+          properties:
+            compatible:
+              contains:
+                const: mediatek,mt6397-regulator
+
+        then:
+          $ref: /schemas/regulator/mediatek,mt6397-regulator.yaml
+
+  audio-codec:
+    type: object
+    additionalProperties: false
+    description:
+      Audio codec support with MT6397 and MT6358.
+    properties:
+      compatible:
+        oneOf:
+          - enum:
+              - mediatek,mt6397-codec
+              - mediatek,mt6358-sound
+          - items:
+              - enum:
+                  - mediatek,mt6366-sound
+              - const: mediatek,mt6358-sound
+
+      mediatek,dmic-mode:
+        description: |
+          Indicates how many data pins are used to transmit two channels of PDM
+          signal.
+          0 - two wires;
+          1 - one wire;
+          Default value is 0.
+        enum: [0, 1]
+        default: 0
+
+      Avdd-supply:
+        description: Power source of AVDD.
+
+    required:
+      - compatible
+
+  clocks:
+    type: object
+    additionalProperties: false
+    description: |
+      This is a clock buffer node for mt6397. However, there are no sub nodes
+      or any public document exposed in public.
+    properties:
+      compatible:
+        const: mediatek,mt6397-clk
+      '#clock-cells':
+        const: 1
+    required:
+      - compatible
+
+  leds:
+    type: object
+    additionalProperties: false
+    description: |
+      MT6323 LED controller is subfunction provided by MT6323 PMIC, so the LED
+      controllers are defined as the subnode of the function node provided by MT6323
+      PMIC controller that is being defined as one kind of Muti-Function Device (MFD)
+      using shared bus called PMIC wrapper for each subfunction to access remote
+      MT6323 PMIC hardware.
+
+      Each led is represented as a child node of the mediatek,mt6323-led that
+      describes the initial behavior for each LED physically and currently only four
+      LED child nodes can be supported.
+
+    properties:
+      compatible:
+        enum:
+          - mediatek,mt6323-led
+          - mediatek,mt6331-led
+          - mediatek,mt6332-led
+
+      reg:
+        maxItems: 1
+
+      "#address-cells":
+        const: 1
+
+      "#size-cells":
+        const: 0
+
+    patternProperties:
+      "^led@[0-3]$":
+        type: object
+        $ref: /schemas/leds/common.yaml#
+        unevaluatedProperties: false
+
+        properties:
+          reg:
+            description:
+              LED channel number (0..3)
+            minimum: 0
+            maximum: 3
+
+        required:
+          - reg
+
+    required:
+      - compatible
+      - '#address-cells'
+      - '#size-cells'
+
+  keys:
+    type: object
+    $ref: /schemas/input/mediatek,pmic-keys.yaml
+    unevaluatedProperties: false
+    description:
+      Power and Home keys.
+    properties:
+      compatible:
+        enum:
+          - mediatek,mt6323-keys
+          - mediatek,mt6331-keys
+          - mediatek,mt6358-keys
+          - mediatek,mt6397-keys
+
+  power-controller:
+    type: object
+    additionalProperties: false
+    description:
+      The power controller which could be found on PMIC is responsible for
+      externally powering off or on the remote MediaTek SoC through the
+      circuit BBPU (baseband power up).
+    properties:
+      compatible:
+        const: mediatek,mt6323-pwrc
+
+      '#power-domain-cells':
+        const: 0
+
+  pinctrl:
+    type: object
+    $ref: /schemas/pinctrl/mediatek,mt65xx-pinctrl.yaml
+    unevaluatedProperties: false
+    description:
+      Pin controller
+    properties:
+      compatible:
+        const: mediatek,mt6397-pinctrl
+
+required:
+  - compatible
+  - regulators
+
+additionalProperties: false
+
+examples:
+  - |
+    #include <dt-bindings/interrupt-controller/arm-gic.h>
+    #include <dt-bindings/leds/common.h>
+
+    pmic {
+        compatible = "mediatek,mt6323";
+        interrupt-parent = <&pio>;
+        interrupts = <150 IRQ_TYPE_LEVEL_HIGH>;
+        interrupt-controller;
+        #interrupt-cells = <2>;
+
+        leds {
+                compatible = "mediatek,mt6323-led";
+                #address-cells = <1>;
+                #size-cells = <0>;
+        };
+
+        regulators {
+            compatible = "mediatek,mt6323-regulator";
+
+            buck_vproc {
+                regulator-name = "vproc";
+                regulator-min-microvolt = < 700000>;
+                regulator-max-microvolt = <1350000>;
+                regulator-ramp-delay = <12500>;
+                regulator-always-on;
+                regulator-boot-on;
+            };
+
+            buck_vsys {
+                regulator-name = "vsys";
+                regulator-min-microvolt = <1400000>;
+                regulator-max-microvolt = <2987500>;
+                regulator-ramp-delay = <25000>;
+                regulator-always-on;
+                regulator-boot-on;
+            };
+
+            buck_vpa {
+                regulator-name = "vpa";
+                regulator-min-microvolt = < 500000>;
+                regulator-max-microvolt = <3650000>;
+            };
+
+            ldo_vtcxo {
+                regulator-name = "vtcxo";
+                regulator-min-microvolt = <2800000>;
+                regulator-max-microvolt = <2800000>;
+                regulator-enable-ramp-delay = <90>;
+                regulator-always-on;
+                regulator-boot-on;
+            };
+
+            ldo_vcn28 {
+                regulator-name = "vcn28";
+                regulator-min-microvolt = <2800000>;
+                regulator-max-microvolt = <2800000>;
+                regulator-enable-ramp-delay = <185>;
+            };
+
+            ldo_vcn33_bt {
+                regulator-name = "vcn33_bt";
+                regulator-min-microvolt = <3300000>;
+                regulator-max-microvolt = <3600000>;
+                regulator-enable-ramp-delay = <185>;
+            };
+
+            ldo_vcn33_wifi {
+                regulator-name = "vcn33_wifi";
+                regulator-min-microvolt = <3300000>;
+                regulator-max-microvolt = <3600000>;
+                regulator-enable-ramp-delay = <185>;
+            };
+
+            ldo_va {
+                regulator-name = "va";
+                regulator-min-microvolt = <2800000>;
+                regulator-max-microvolt = <2800000>;
+                regulator-enable-ramp-delay = <216>;
+                regulator-always-on;
+                regulator-boot-on;
+            };
+
+            ldo_vcama {
+                regulator-name = "vcama";
+                regulator-min-microvolt = <1500000>;
+                regulator-max-microvolt = <2800000>;
+                regulator-enable-ramp-delay = <216>;
+            };
+
+            ldo_vio28 {
+                regulator-name = "vio28";
+                regulator-min-microvolt = <2800000>;
+                regulator-max-microvolt = <2800000>;
+                regulator-enable-ramp-delay = <216>;
+                regulator-always-on;
+                regulator-boot-on;
+            };
+
+            ldo_vusb {
+                regulator-name = "vusb";
+                regulator-min-microvolt = <3300000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <216>;
+                regulator-boot-on;
+            };
+
+            ldo_vmc {
+                regulator-name = "vmc";
+                regulator-min-microvolt = <1800000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <36>;
+                regulator-boot-on;
+            };
+
+            ldo_vmch {
+                regulator-name = "vmch";
+                regulator-min-microvolt = <3000000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <36>;
+                regulator-boot-on;
+            };
+
+            ldo_vemc3v3 {
+                regulator-name = "vemc3v3";
+                regulator-min-microvolt = <3000000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <36>;
+                regulator-boot-on;
+            };
+
+            ldo_vgp1 {
+                regulator-name = "vgp1";
+                regulator-min-microvolt = <1200000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <216>;
+            };
+
+            ldo_vgp2 {
+                regulator-name = "vgp2";
+                regulator-min-microvolt = <1200000>;
+                regulator-max-microvolt = <3000000>;
+                regulator-enable-ramp-delay = <216>;
+            };
+
+            ldo_vgp3 {
+                regulator-name = "vgp3";
+                regulator-min-microvolt = <1200000>;
+                regulator-max-microvolt = <1800000>;
+                regulator-enable-ramp-delay = <216>;
+            };
+
+            ldo_vcn18 {
+                regulator-name = "vcn18";
+                regulator-min-microvolt = <1800000>;
+                regulator-max-microvolt = <1800000>;
+                regulator-enable-ramp-delay = <216>;
+            };
+
+            ldo_vsim1 {
+                regulator-name = "vsim1";
+                regulator-min-microvolt = <1800000>;
+                regulator-max-microvolt = <3000000>;
+                regulator-enable-ramp-delay = <216>;
+            };
+
+            ldo_vsim2 {
+                regulator-name = "vsim2";
+                regulator-min-microvolt = <1800000>;
+                regulator-max-microvolt = <3000000>;
+                regulator-enable-ramp-delay = <216>;
+            };
+
+            ldo_vrtc {
+                regulator-name = "vrtc";
+                regulator-min-microvolt = <2800000>;
+                regulator-max-microvolt = <2800000>;
+                regulator-always-on;
+                regulator-boot-on;
+            };
+
+            ldo_vcamaf {
+                regulator-name = "vcamaf";
+                regulator-min-microvolt = <1200000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <216>;
+            };
+
+            ldo_vibr {
+                regulator-name = "vibr";
+                regulator-min-microvolt = <1200000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <36>;
+            };
+
+            ldo_vrf18 {
+                regulator-name = "vrf18";
+                regulator-min-microvolt = <1825000>;
+                regulator-max-microvolt = <1825000>;
+                regulator-enable-ramp-delay = <187>;
+            };
+
+            ldo_vm {
+                regulator-name = "vm";
+                regulator-min-microvolt = <1200000>;
+                regulator-max-microvolt = <1800000>;
+                regulator-enable-ramp-delay = <216>;
+                regulator-always-on;
+                regulator-boot-on;
+            };
+
+            ldo_vio18 {
+                regulator-name = "vio18";
+                regulator-min-microvolt = <1800000>;
+                regulator-max-microvolt = <1800000>;
+                regulator-enable-ramp-delay = <216>;
+                regulator-always-on;
+                regulator-boot-on;
+            };
+
+           ldo_vcamd {
+                regulator-name = "vcamd";
+                regulator-min-microvolt = <1200000>;
+                regulator-max-microvolt = <1800000>;
+                regulator-enable-ramp-delay = <216>;
+            };
+
+            ldo_vcamio {
+                regulator-name = "vcamio";
+                regulator-min-microvolt = <1800000>;
+                regulator-max-microvolt = <1800000>;
+                regulator-enable-ramp-delay = <216>;
+            };
+        };
+
+        keys {
+                compatible = "mediatek,mt6323-keys";
+                mediatek,long-press-mode = <1>;
+                power-off-time-sec = <0>;
+
+                power {
+                        linux,keycodes = <116>;
+                        wakeup-source;
+                };
+
+                home {
+                        linux,keycodes = <114>;
+                };
+        };
+
+        power-controller {
+            compatible = "mediatek,mt6323-pwrc";
+            #power-domain-cells = <0>;
+        };
+
+        rtc {
+            compatible = "mediatek,mt6323-rtc";
+        };
+    };
+
+  - |
+    #include <dt-bindings/input/input.h>
+    #include <dt-bindings/interrupt-controller/arm-gic.h>
+
+    pmic {
+        compatible = "mediatek,mt6358";
+        interrupt-controller;
+        #interrupt-cells = <2>;
+
+        audio-codec {
+            compatible = "mediatek,mt6358-sound";
+            Avdd-supply = <&mt6358_vaud28_reg>;
+            mediatek,dmic-mode = <0>;
+        };
+
+        regulators {
+            compatible = "mediatek,mt6358-regulator";
+
+            buck_vdram1 {
+                regulator-name = "vdram1";
+                regulator-min-microvolt = <500000>;
+                regulator-max-microvolt = <2087500>;
+                regulator-ramp-delay = <12500>;
+                regulator-enable-ramp-delay = <0>;
+                regulator-always-on;
+                regulator-allowed-modes = <0 1>;
+            };
+
+            buck_vcore {
+                regulator-name = "vcore";
+                regulator-min-microvolt = <500000>;
+                regulator-max-microvolt = <1293750>;
+                regulator-ramp-delay = <6250>;
+                regulator-enable-ramp-delay = <200>;
+                regulator-always-on;
+                regulator-allowed-modes = <0 1>;
+            };
+
+            buck_vpa {
+                regulator-name = "vpa";
+                regulator-min-microvolt = <500000>;
+                regulator-max-microvolt = <3650000>;
+                regulator-ramp-delay = <50000>;
+                regulator-enable-ramp-delay = <250>;
+                regulator-allowed-modes = <0 1>;
+            };
+
+            buck_vproc11 {
+                regulator-name = "vproc11";
+                regulator-min-microvolt = <500000>;
+                regulator-max-microvolt = <1293750>;
+                regulator-ramp-delay = <6250>;
+                regulator-enable-ramp-delay = <200>;
+                regulator-always-on;
+                regulator-allowed-modes = <0 1>;
+            };
+
+            buck_vproc12 {
+                regulator-name = "vproc12";
+                regulator-min-microvolt = <500000>;
+                regulator-max-microvolt = <1293750>;
+                regulator-ramp-delay = <6250>;
+                regulator-enable-ramp-delay = <200>;
+                regulator-always-on;
+                regulator-allowed-modes = <0 1>;
+            };
+
+            buck_vgpu {
+                regulator-name = "vgpu";
+                regulator-min-microvolt = <500000>;
+                regulator-max-microvolt = <1293750>;
+                regulator-ramp-delay = <6250>;
+                regulator-enable-ramp-delay = <200>;
+                regulator-allowed-modes = <0 1>;
+            };
+
+            buck_vs2 {
+                regulator-name = "vs2";
+                regulator-min-microvolt = <500000>;
+                regulator-max-microvolt = <2087500>;
+                regulator-ramp-delay = <12500>;
+                regulator-enable-ramp-delay = <0>;
+                regulator-always-on;
+            };
+
+            buck_vmodem {
+                regulator-name = "vmodem";
+                regulator-min-microvolt = <500000>;
+                regulator-max-microvolt = <1293750>;
+                regulator-ramp-delay = <6250>;
+                regulator-enable-ramp-delay = <900>;
+                regulator-always-on;
+                regulator-allowed-modes = <0 1>;
+            };
+
+            buck_vs1 {
+                regulator-name = "vs1";
+                regulator-min-microvolt = <1000000>;
+                regulator-max-microvolt = <2587500>;
+                regulator-ramp-delay = <12500>;
+                regulator-enable-ramp-delay = <0>;
+                regulator-always-on;
+            };
+
+            ldo_vdram2 {
+                regulator-name = "vdram2";
+                regulator-min-microvolt = <600000>;
+                regulator-max-microvolt = <1800000>;
+                regulator-enable-ramp-delay = <3300>;
+            };
+
+            ldo_vsim1 {
+                regulator-name = "vsim1";
+                regulator-min-microvolt = <1700000>;
+                regulator-max-microvolt = <3100000>;
+                regulator-enable-ramp-delay = <540>;
+            };
+
+            ldo_vibr {
+                regulator-name = "vibr";
+                regulator-min-microvolt = <1200000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <60>;
+            };
+
+            ldo_vrf12 {
+                regulator-name = "vrf12";
+                regulator-min-microvolt = <1200000>;
+                regulator-max-microvolt = <1200000>;
+                regulator-enable-ramp-delay = <120>;
+            };
+
+            ldo_vio18 {
+                regulator-name = "vio18";
+                regulator-min-microvolt = <1800000>;
+                regulator-max-microvolt = <1800000>;
+                regulator-enable-ramp-delay = <2700>;
+                regulator-always-on;
+            };
+
+            ldo_vusb {
+                regulator-name = "vusb";
+                regulator-min-microvolt = <3000000>;
+                regulator-max-microvolt = <3100000>;
+                regulator-enable-ramp-delay = <270>;
+                regulator-always-on;
+            };
+
+            ldo_vcamio {
+                regulator-name = "vcamio";
+                regulator-min-microvolt = <1800000>;
+                regulator-max-microvolt = <1800000>;
+                regulator-enable-ramp-delay = <325>;
+            };
+
+            ldo_vcamd {
+                regulator-name = "vcamd";
+                regulator-min-microvolt = <900000>;
+                regulator-max-microvolt = <1800000>;
+                regulator-enable-ramp-delay = <325>;
+            };
+
+            ldo_vcn18 {
+                regulator-name = "vcn18";
+                regulator-min-microvolt = <1800000>;
+                regulator-max-microvolt = <1800000>;
+                regulator-enable-ramp-delay = <270>;
+            };
+
+            ldo_vfe28 {
+                regulator-name = "vfe28";
+                regulator-min-microvolt = <2800000>;
+                regulator-max-microvolt = <2800000>;
+                regulator-enable-ramp-delay = <270>;
+            };
+
+            ldo_vsram_proc11 {
+                regulator-name = "vsram_proc11";
+                regulator-min-microvolt = <500000>;
+                regulator-max-microvolt = <1293750>;
+                regulator-ramp-delay = <6250>;
+                regulator-enable-ramp-delay = <240>;
+                regulator-always-on;
+            };
+
+            ldo_vcn28 {
+                regulator-name = "vcn28";
+                regulator-min-microvolt = <2800000>;
+                regulator-max-microvolt = <2800000>;
+                regulator-enable-ramp-delay = <270>;
+            };
+
+            ldo_vsram_others {
+                regulator-name = "vsram_others";
+                regulator-min-microvolt = <500000>;
+                regulator-max-microvolt = <1293750>;
+                regulator-ramp-delay = <6250>;
+                regulator-enable-ramp-delay = <240>;
+                regulator-always-on;
+            };
+
+            ldo_vsram_gpu {
+                regulator-name = "vsram_gpu";
+                regulator-min-microvolt = <500000>;
+                regulator-max-microvolt = <1293750>;
+                regulator-ramp-delay = <6250>;
+                regulator-enable-ramp-delay = <240>;
+            };
+
+            ldo_vxo22 {
+                regulator-name = "vxo22";
+                regulator-min-microvolt = <2200000>;
+                regulator-max-microvolt = <2200000>;
+                regulator-enable-ramp-delay = <120>;
+                regulator-always-on;
+            };
+
+            ldo_vefuse {
+                regulator-name = "vefuse";
+                regulator-min-microvolt = <1700000>;
+                regulator-max-microvolt = <1900000>;
+                regulator-enable-ramp-delay = <270>;
+            };
+
+            ldo_vaux18 {
+                regulator-name = "vaux18";
+                regulator-min-microvolt = <1800000>;
+                regulator-max-microvolt = <1800000>;
+                regulator-enable-ramp-delay = <270>;
+            };
+
+            ldo_vmch {
+                regulator-name = "vmch";
+                regulator-min-microvolt = <2900000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <60>;
+            };
+
+            ldo_vbif28 {
+                regulator-name = "vbif28";
+                regulator-min-microvolt = <2800000>;
+                regulator-max-microvolt = <2800000>;
+                regulator-enable-ramp-delay = <270>;
+            };
+
+            ldo_vsram_proc12 {
+                regulator-name = "vsram_proc12";
+                regulator-min-microvolt = <500000>;
+                regulator-max-microvolt = <1293750>;
+                regulator-ramp-delay = <6250>;
+                regulator-enable-ramp-delay = <240>;
+                regulator-always-on;
+            };
+
+            ldo_vcama1 {
+                regulator-name = "vcama1";
+                regulator-min-microvolt = <1800000>;
+                regulator-max-microvolt = <3000000>;
+                regulator-enable-ramp-delay = <325>;
+            };
+
+            ldo_vemc {
+                regulator-name = "vemc";
+                regulator-min-microvolt = <2900000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <60>;
+            };
+
+            ldo_vio28 {
+                regulator-name = "vio28";
+                regulator-min-microvolt = <2800000>;
+                regulator-max-microvolt = <2800000>;
+                regulator-enable-ramp-delay = <270>;
+            };
+
+            ldo_va12 {
+                regulator-name = "va12";
+                regulator-min-microvolt = <1200000>;
+                regulator-max-microvolt = <1200000>;
+                regulator-enable-ramp-delay = <270>;
+                regulator-always-on;
+            };
+
+            ldo_vrf18 {
+                regulator-name = "vrf18";
+                regulator-min-microvolt = <1800000>;
+                regulator-max-microvolt = <1800000>;
+                regulator-enable-ramp-delay = <120>;
+            };
+
+            ldo_vcn33 {
+                regulator-name = "vcn33";
+                regulator-min-microvolt = <3300000>;
+                regulator-max-microvolt = <3500000>;
+                regulator-enable-ramp-delay = <270>;
+            };
+
+            ldo_vcama2 {
+                regulator-name = "vcama2";
+                regulator-min-microvolt = <1800000>;
+                regulator-max-microvolt = <3000000>;
+                regulator-enable-ramp-delay = <325>;
+            };
+
+            ldo_vmc {
+                regulator-name = "vmc";
+                regulator-min-microvolt = <1800000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <60>;
+            };
+
+            ldo_vldo28 {
+                regulator-name = "vldo28";
+                regulator-min-microvolt = <2800000>;
+                regulator-max-microvolt = <3000000>;
+                regulator-enable-ramp-delay = <270>;
+            };
+
+            ldo_vaud28 {
+                regulator-name = "vaud28";
+                regulator-min-microvolt = <2800000>;
+                regulator-max-microvolt = <2800000>;
+                regulator-enable-ramp-delay = <270>;
+            };
+
+            ldo_vsim2 {
+                regulator-name = "vsim2";
+                regulator-min-microvolt = <1700000>;
+                regulator-max-microvolt = <3100000>;
+                regulator-enable-ramp-delay = <540>;
+            };
+        };
+
+        rtc {
+            compatible = "mediatek,mt6358-rtc";
+        };
+
+        keys {
+            compatible = "mediatek,mt6358-keys";
+            power {
+                linux,keycodes = <KEY_POWER>;
+                wakeup-source;
+            };
+            home {
+                linux,keycodes = <KEY_HOME>;
+            };
+        };
+    };
+
+  - |
+    #include <dt-bindings/interrupt-controller/arm-gic.h>
+
+    pmic {
+        compatible = "mediatek,mt6397";
+
+        interrupt-parent = <&pio>;
+        interrupts-extended = <&pio 222 IRQ_TYPE_LEVEL_HIGH>;
+        interrupt-controller;
+        #interrupt-cells = <2>;
+
+        audio-codec {
+            compatible = "mediatek,mt6397-codec";
+        };
+
+        clocks {
+            compatible = "mediatek,mt6397-clk";
+            #clock-cells = <1>;
+        };
+
+        pinctrl {
+            compatible = "mediatek,mt6397-pinctrl";
+            gpio-controller;
+            #gpio-cells = <2>;
+        };
+
+        regulators {
+            compatible = "mediatek,mt6397-regulator";
+
+            buck_vpca15 {
+                regulator-name = "vpca15";
+                regulator-min-microvolt = < 850000>;
+                regulator-max-microvolt = <1350000>;
+                regulator-ramp-delay = <12500>;
+                regulator-enable-ramp-delay = <200>;
+            };
+
+            buck_vpca7 {
+                regulator-name = "vpca7";
+                regulator-min-microvolt = < 850000>;
+                regulator-max-microvolt = <1350000>;
+                regulator-ramp-delay = <12500>;
+                regulator-enable-ramp-delay = <115>;
+            };
+
+            buck_vsramca15 {
+                regulator-name = "vsramca15";
+                regulator-min-microvolt = < 850000>;
+                regulator-max-microvolt = <1350000>;
+                regulator-ramp-delay = <12500>;
+                regulator-enable-ramp-delay = <115>;
+            };
+
+            buck_vsramca7 {
+                regulator-name = "vsramca7";
+                regulator-min-microvolt = < 850000>;
+                regulator-max-microvolt = <1350000>;
+                regulator-ramp-delay = <12500>;
+                regulator-enable-ramp-delay = <115>;
+            };
+
+            buck_vcore {
+                regulator-name = "vcore";
+                regulator-min-microvolt = < 850000>;
+                regulator-max-microvolt = <1350000>;
+                regulator-ramp-delay = <12500>;
+                regulator-enable-ramp-delay = <115>;
+            };
+
+            buck_vgpu {
+                regulator-name = "vgpu";
+                regulator-min-microvolt = < 700000>;
+                regulator-max-microvolt = <1350000>;
+                regulator-ramp-delay = <12500>;
+                regulator-enable-ramp-delay = <115>;
+            };
+
+            buck_vdrm {
+                regulator-name = "vdrm";
+                regulator-min-microvolt = < 800000>;
+                regulator-max-microvolt = <1400000>;
+                regulator-ramp-delay = <12500>;
+                regulator-enable-ramp-delay = <500>;
+            };
+
+            buck_vio18 {
+                regulator-name = "vio18";
+                regulator-min-microvolt = <1500000>;
+                regulator-max-microvolt = <2120000>;
+                regulator-ramp-delay = <12500>;
+                regulator-enable-ramp-delay = <500>;
+            };
+
+            ldo_vtcxo {
+                regulator-name = "vtcxo";
+                regulator-min-microvolt = <2800000>;
+                regulator-max-microvolt = <2800000>;
+                regulator-enable-ramp-delay = <90>;
+            };
+
+            ldo_va28 {
+                regulator-name = "va28";
+                /* fixed output 2.8 V */
+                regulator-enable-ramp-delay = <218>;
+            };
+
+            ldo_vcama {
+                regulator-name = "vcama";
+                regulator-min-microvolt = <1500000>;
+                regulator-max-microvolt = <2800000>;
+                regulator-enable-ramp-delay = <218>;
+            };
+
+            ldo_vio28 {
+                regulator-name = "vio28";
+                /* fixed output 2.8 V */
+                regulator-enable-ramp-delay = <240>;
+            };
+
+            ldo_vusb {
+                regulator-name = "vusb";
+                /* fixed output 3.3 V */
+                regulator-enable-ramp-delay = <218>;
+            };
+
+            ldo_vmc {
+                regulator-name = "vmc";
+                regulator-min-microvolt = <1800000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <218>;
+            };
+
+            ldo_vmch {
+                regulator-name = "vmch";
+                regulator-min-microvolt = <3000000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <218>;
+            };
+
+            ldo_vemc3v3 {
+                regulator-name = "vemc_3v3";
+                regulator-min-microvolt = <3000000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <218>;
+            };
+
+            ldo_vgp1 {
+                regulator-name = "vcamd";
+                regulator-min-microvolt = <1220000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <240>;
+            };
+
+            ldo_vgp2 {
+                regulator-name = "vcamio";
+                regulator-min-microvolt = <1000000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <218>;
+            };
+
+            ldo_vgp3 {
+                regulator-name = "vcamaf";
+                regulator-min-microvolt = <1200000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <218>;
+            };
+
+            ldo_vgp4 {
+                regulator-name = "vgp4";
+                regulator-min-microvolt = <1200000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <218>;
+            };
+
+            ldo_vgp5 {
+                regulator-name = "vgp5";
+                regulator-min-microvolt = <1200000>;
+                regulator-max-microvolt = <3000000>;
+                regulator-enable-ramp-delay = <218>;
+            };
+
+            ldo_vgp6 {
+                regulator-name = "vgp6";
+                regulator-min-microvolt = <1200000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <218>;
+            };
+
+            ldo_vibr {
+                regulator-name = "vibr";
+                regulator-min-microvolt = <1200000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <218>;
+            };
+        };
+
+        rtc {
+            compatible = "mediatek,mt6397-rtc";
+        };
+    };
diff --git a/Documentation/devicetree/bindings/mfd/mt6397.txt b/Documentation/devicetree/bindings/mfd/mt6397.txt
deleted file mode 100644
index 10540aa..0000000
--- a/Documentation/devicetree/bindings/mfd/mt6397.txt
+++ /dev/null
@@ -1,110 +0,0 @@
-MediaTek MT6397/MT6323 Multifunction Device Driver
-
-MT6397/MT6323 is a multifunction device with the following sub modules:
-- Regulator
-- RTC
-- Audio codec
-- GPIO
-- Clock
-- LED
-- Keys
-- Power controller
-
-It is interfaced to host controller using SPI interface by a proprietary hardware
-called PMIC wrapper or pwrap. MT6397/MT6323 MFD is a child device of pwrap.
-See the following for pwarp node definitions:
-../soc/mediatek/mediatek,pwrap.yaml
-
-This document describes the binding for MFD device and its sub module.
-
-Required properties:
-compatible:
-	"mediatek,mt6323" for PMIC MT6323
-	"mediatek,mt6331" for PMIC MT6331 and MT6332
-	"mediatek,mt6357" for PMIC MT6357
-	"mediatek,mt6358" for PMIC MT6358
-	"mediatek,mt6359" for PMIC MT6359
-	"mediatek,mt6366", "mediatek,mt6358" for PMIC MT6366
-	"mediatek,mt6397" for PMIC MT6397
-
-Optional subnodes:
-
-- rtc
-	Required properties: Should be one of follows
-		- compatible: "mediatek,mt6323-rtc"
-		- compatible: "mediatek,mt6331-rtc"
-		- compatible: "mediatek,mt6358-rtc"
-		- compatible: "mediatek,mt6397-rtc"
-	For details, see ../rtc/rtc-mt6397.txt
-- regulators
-	Required properties:
-		- compatible: "mediatek,mt6323-regulator"
-	see ../regulator/mt6323-regulator.txt
-		- compatible: "mediatek,mt6358-regulator"
-		- compatible: "mediatek,mt6366-regulator", "mediatek-mt6358-regulator"
-	see ../regulator/mt6358-regulator.txt
-		- compatible: "mediatek,mt6397-regulator"
-	see ../regulator/mt6397-regulator.txt
-- codec
-	Required properties:
-		- compatible: "mediatek,mt6397-codec" or "mediatek,mt6358-sound"
-- clk
-	Required properties:
-		- compatible: "mediatek,mt6397-clk"
-- led
-	Required properties:
-		- compatible: "mediatek,mt6323-led"
-	see ../leds/leds-mt6323.txt
-
-- keys
-	Required properties: Should be one of the following
-		- compatible: "mediatek,mt6323-keys"
-		- compatible: "mediatek,mt6331-keys"
-		- compatible: "mediatek,mt6397-keys"
-	see ../input/mtk-pmic-keys.txt
-
-- power-controller
-	Required properties:
-		- compatible: "mediatek,mt6323-pwrc"
-	For details, see ../power/reset/mt6323-poweroff.txt
-
-- pin-controller
-	Required properties:
-		- compatible: "mediatek,mt6397-pinctrl"
-	For details, see ../pinctrl/pinctrl-mt65xx.txt
-
-Example:
-	pwrap: pwrap at 1000f000 {
-		compatible = "mediatek,mt8135-pwrap";
-
-		...
-
-		pmic {
-			compatible = "mediatek,mt6397";
-
-			codec: mt6397codec {
-				compatible = "mediatek,mt6397-codec";
-			};
-
-			regulators {
-				compatible = "mediatek,mt6397-regulator";
-
-				mt6397_vpca15_reg: buck_vpca15 {
-					regulator-compatible = "buck_vpca15";
-					regulator-name = "vpca15";
-					regulator-min-microvolt = <850000>;
-					regulator-max-microvolt = <1400000>;
-					regulator-ramp-delay = <12500>;
-					regulator-always-on;
-				};
-
-				mt6397_vgp4_reg: ldo_vgp4 {
-					regulator-compatible = "ldo_vgp4";
-					regulator-name = "vgp4";
-					regulator-min-microvolt = <1200000>;
-					regulator-max-microvolt = <3300000>;
-					regulator-enable-ramp-delay = <218>;
-				};
-			};
-		};
-	};
diff --git a/Documentation/devicetree/bindings/power/reset/mt6323-poweroff.txt b/Documentation/devicetree/bindings/power/reset/mt6323-poweroff.txt
deleted file mode 100644
index 933f0c4..0000000
--- a/Documentation/devicetree/bindings/power/reset/mt6323-poweroff.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-Device Tree Bindings for Power Controller on MediaTek PMIC
-
-The power controller which could be found on PMIC is responsible for externally
-powering off or on the remote MediaTek SoC through the circuit BBPU.
-
-Required properties:
-- compatible: Should be one of follows
-       "mediatek,mt6323-pwrc": for MT6323 PMIC
-
-Example:
-
-       pmic {
-               compatible = "mediatek,mt6323";
-
-               ...
-
-               power-controller {
-                       compatible = "mediatek,mt6323-pwrc";
-               };
-       }
diff --git a/Documentation/devicetree/bindings/rtc/rtc-mt6397.txt b/Documentation/devicetree/bindings/rtc/rtc-mt6397.txt
deleted file mode 100644
index 7212076..0000000
--- a/Documentation/devicetree/bindings/rtc/rtc-mt6397.txt
+++ /dev/null
@@ -1,31 +0,0 @@
-Device-Tree bindings for MediaTek PMIC based RTC
-
-MediaTek PMIC based RTC is an independent function of MediaTek PMIC that works
-as a type of multi-function device (MFD). The RTC can be configured and set up
-with PMIC wrapper bus which is a common resource shared with the other
-functions found on the same PMIC.
-
-For MediaTek PMIC MFD bindings, see:
-../mfd/mt6397.txt
-
-For MediaTek PMIC wrapper bus bindings, see:
-../soc/mediatek/pwrap.txt
-
-Required properties:
-- compatible: Should be one of follows
-       "mediatek,mt6323-rtc": for MT6323 PMIC
-       "mediatek,mt6358-rtc": for MT6358 PMIC
-       "mediatek,mt6366-rtc", "mediatek,mt6358-rtc": for MT6366 PMIC
-       "mediatek,mt6397-rtc": for MT6397 PMIC
-
-Example:
-
-       pmic {
-               compatible = "mediatek,mt6323";
-
-               ...
-
-               rtc {
-                       compatible = "mediatek,mt6323-rtc";
-               };
-       };
diff --git a/Documentation/devicetree/bindings/sound/mt6358.txt b/Documentation/devicetree/bindings/sound/mt6358.txt
deleted file mode 100644
index fbe9e55..0000000
--- a/Documentation/devicetree/bindings/sound/mt6358.txt
+++ /dev/null
@@ -1,26 +0,0 @@
-Mediatek MT6358 Audio Codec
-
-The communication between MT6358 and SoC is through Mediatek PMIC wrapper.
-For more detail, please visit Mediatek PMIC wrapper documentation.
-
-Must be a child node of PMIC wrapper.
-
-Required properties:
-
-- compatible - "string" - One of:
-    "mediatek,mt6358-sound"
-    "mediatek,mt6366-sound"
-- Avdd-supply : power source of AVDD
-
-Optional properties:
-- mediatek,dmic-mode : Indicates how many data pins are used to transmit two
-	channels of PDM signal. 0 means two wires, 1 means one wire. Default
-	value is 0.
-
-Example:
-
-mt6358_snd {
-	compatible = "mediatek,mt6358-sound";
-	Avdd-supply = <&mt6358_vaud28_reg>;
-	mediatek,dmic-mode = <0>;
-};
diff --git a/MAINTAINERS b/MAINTAINERS
index 0a3d9e1..003f096 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -14365,10 +14365,12 @@ F:	Documentation/devicetree/bindings/net/bluetooth/mediatek,mt7921s-bluetooth.ya
 F:	drivers/bluetooth/btmtkuart.c
 
 MEDIATEK BOARD LEVEL SHUTDOWN DRIVERS
+M:	Sen Chu <sen.chu at mediatek.com>
 M:	Sean Wang <sean.wang at mediatek.com>
+M:	Macpaul Lin <macpaul.lin at mediatek.com>
 L:	linux-pm at vger.kernel.org
 S:	Maintained
-F:	Documentation/devicetree/bindings/power/reset/mt6323-poweroff.txt
+F:	Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml
 F:	drivers/power/reset/mt6323-poweroff.c
 
 MEDIATEK CIR DRIVER
@@ -14529,9 +14531,11 @@ F:	Documentation/devicetree/bindings/mtd/mediatek,mtk-nfc.yaml
 F:	drivers/mtd/nand/raw/mtk_*
 
 MEDIATEK PMIC LED DRIVER
+M:	Sen Chu <sen.chu at mediatek.com>
 M:	Sean Wang <sean.wang at mediatek.com>
+M:	Macpaul Lin <macpaul.lin at mediatek.com>
 S:	Maintained
-F:	Documentation/devicetree/bindings/leds/leds-mt6323.txt
+F:	Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml
 F:	drivers/leds/leds-mt6323.c
 
 MEDIATEK RANDOM NUMBER GENERATOR SUPPORT
-- 
2.45.2



From macpaul.lin at mediatek.com  Fri Sep 13 11:00:39 2024
From: macpaul.lin at mediatek.com (Macpaul Lin)
Date: Sat, 14 Sep 2024 02:00:39 +0800
Subject: [PATCH v3 3/3] regulator: dt-bindings: mt6397: move examples to parent PMIC mt6397
Message-ID: <20240913180039.8175-1-macpaul.lin@mediatek.com>

Since the DT schema of multiple function PMIC mt6397 has been converted,
move the examples in "mediatek,mt6397-regulator.yaml" to the parent schema
"mediatek,mt6397.yaml".

Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
---
 .../regulator/mediatek,mt6397-regulator.yaml  | 173 ------------------
 1 file changed, 173 deletions(-)

Changes for v1 and v2:
 - This is the first version of converting rtc-mt6397.txt.
   This is because converting rtc-mt6397 together
   with mfd/mediatek,mt6397.yaml, so we've create a patch set
   instead of submitting single patch for each subdevice.
 - This patch has been made base on linux-next/master git repo.

Changes for v3:
 - Re-order this patch since other patches for removing text DT bindings
   in v2 qill be squash into MFD patch.

diff --git a/Documentation/devicetree/bindings/regulator/mediatek,mt6397-regulator.yaml b/Documentation/devicetree/bindings/regulator/mediatek,mt6397-regulator.yaml
index 50db678..337ac58 100644
--- a/Documentation/devicetree/bindings/regulator/mediatek,mt6397-regulator.yaml
+++ b/Documentation/devicetree/bindings/regulator/mediatek,mt6397-regulator.yaml
@@ -63,176 +63,3 @@ required:
 
 additionalProperties: false
 
-examples:
-  - |
-    #include <dt-bindings/interrupt-controller/arm-gic.h>
-
-    mt6397_regulators: regulators {
-        compatible = "mediatek,mt6397-regulator";
-
-        mt6397_vpca15_reg: buck_vpca15 {
-            regulator-name = "vpca15";
-            regulator-min-microvolt = < 850000>;
-            regulator-max-microvolt = <1350000>;
-            regulator-ramp-delay = <12500>;
-            regulator-enable-ramp-delay = <200>;
-        };
-
-        mt6397_vpca7_reg: buck_vpca7 {
-            regulator-name = "vpca7";
-            regulator-min-microvolt = < 850000>;
-            regulator-max-microvolt = <1350000>;
-            regulator-ramp-delay = <12500>;
-            regulator-enable-ramp-delay = <115>;
-        };
-
-        mt6397_vsramca15_reg: buck_vsramca15 {
-            regulator-name = "vsramca15";
-            regulator-min-microvolt = < 850000>;
-            regulator-max-microvolt = <1350000>;
-            regulator-ramp-delay = <12500>;
-            regulator-enable-ramp-delay = <115>;
-        };
-
-        mt6397_vsramca7_reg: buck_vsramca7 {
-            regulator-name = "vsramca7";
-            regulator-min-microvolt = < 850000>;
-            regulator-max-microvolt = <1350000>;
-            regulator-ramp-delay = <12500>;
-            regulator-enable-ramp-delay = <115>;
-        };
-
-        mt6397_vcore_reg: buck_vcore {
-            regulator-name = "vcore";
-            regulator-min-microvolt = < 850000>;
-            regulator-max-microvolt = <1350000>;
-            regulator-ramp-delay = <12500>;
-            regulator-enable-ramp-delay = <115>;
-        };
-
-        mt6397_vgpu_reg: buck_vgpu {
-            regulator-name = "vgpu";
-            regulator-min-microvolt = < 700000>;
-            regulator-max-microvolt = <1350000>;
-            regulator-ramp-delay = <12500>;
-            regulator-enable-ramp-delay = <115>;
-        };
-
-        mt6397_vdrm_reg: buck_vdrm {
-            regulator-name = "vdrm";
-            regulator-min-microvolt = < 800000>;
-            regulator-max-microvolt = <1400000>;
-            regulator-ramp-delay = <12500>;
-            regulator-enable-ramp-delay = <500>;
-        };
-
-        mt6397_vio18_reg: buck_vio18 {
-            regulator-name = "vio18";
-            regulator-min-microvolt = <1500000>;
-            regulator-max-microvolt = <2120000>;
-            regulator-ramp-delay = <12500>;
-            regulator-enable-ramp-delay = <500>;
-        };
-
-        mt6397_vtcxo_reg: ldo_vtcxo {
-            regulator-name = "vtcxo";
-            regulator-min-microvolt = <2800000>;
-            regulator-max-microvolt = <2800000>;
-            regulator-enable-ramp-delay = <90>;
-        };
-
-        mt6397_va28_reg: ldo_va28 {
-            regulator-name = "va28";
-            /* fixed output 2.8 V */
-            regulator-enable-ramp-delay = <218>;
-        };
-
-        mt6397_vcama_reg: ldo_vcama {
-            regulator-name = "vcama";
-            regulator-min-microvolt = <1500000>;
-            regulator-max-microvolt = <2800000>;
-            regulator-enable-ramp-delay = <218>;
-        };
-
-        mt6397_vio28_reg: ldo_vio28 {
-            regulator-name = "vio28";
-            /* fixed output 2.8 V */
-            regulator-enable-ramp-delay = <240>;
-        };
-
-        mt6397_usb_reg: ldo_vusb {
-            regulator-name = "vusb";
-            /* fixed output 3.3 V */
-            regulator-enable-ramp-delay = <218>;
-        };
-
-        mt6397_vmc_reg: ldo_vmc {
-            regulator-name = "vmc";
-            regulator-min-microvolt = <1800000>;
-            regulator-max-microvolt = <3300000>;
-            regulator-enable-ramp-delay = <218>;
-        };
-
-        mt6397_vmch_reg: ldo_vmch {
-            regulator-name = "vmch";
-            regulator-min-microvolt = <3000000>;
-            regulator-max-microvolt = <3300000>;
-            regulator-enable-ramp-delay = <218>;
-        };
-
-        mt6397_vemc_3v3_reg: ldo_vemc3v3 {
-            regulator-name = "vemc_3v3";
-            regulator-min-microvolt = <3000000>;
-            regulator-max-microvolt = <3300000>;
-            regulator-enable-ramp-delay = <218>;
-        };
-
-        mt6397_vgp1_reg: ldo_vgp1 {
-            regulator-name = "vcamd";
-            regulator-min-microvolt = <1220000>;
-            regulator-max-microvolt = <3300000>;
-            regulator-enable-ramp-delay = <240>;
-        };
-
-        mt6397_vgp2_reg: ldo_vgp2 {
-            regulator-name = "vcamio";
-            regulator-min-microvolt = <1000000>;
-            regulator-max-microvolt = <3300000>;
-            regulator-enable-ramp-delay = <218>;
-        };
-
-        mt6397_vgp3_reg: ldo_vgp3 {
-            regulator-name = "vcamaf";
-            regulator-min-microvolt = <1200000>;
-            regulator-max-microvolt = <3300000>;
-            regulator-enable-ramp-delay = <218>;
-        };
-
-        mt6397_vgp4_reg: ldo_vgp4 {
-            regulator-name = "vgp4";
-            regulator-min-microvolt = <1200000>;
-            regulator-max-microvolt = <3300000>;
-            regulator-enable-ramp-delay = <218>;
-        };
-
-        mt6397_vgp5_reg: ldo_vgp5 {
-            regulator-name = "vgp5";
-            regulator-min-microvolt = <1200000>;
-            regulator-max-microvolt = <3000000>;
-            regulator-enable-ramp-delay = <218>;
-        };
-
-        mt6397_vgp6_reg: ldo_vgp6 {
-            regulator-name = "vgp6";
-            regulator-min-microvolt = <1200000>;
-            regulator-max-microvolt = <3300000>;
-            regulator-enable-ramp-delay = <218>;
-        };
-
-        mt6397_vibr_reg: ldo_vibr {
-            regulator-name = "vibr";
-            regulator-min-microvolt = <1200000>;
-            regulator-max-microvolt = <3300000>;
-            regulator-enable-ramp-delay = <218>;
-        };
-    };
-- 
2.45.2



From broonie at kernel.org  Fri Sep 13 11:08:04 2024
From: broonie at kernel.org (Mark Brown)
Date: Fri, 13 Sep 2024 19:08:04 +0100
Subject: (subset) [PATCH v7 00/10] platform/chrome: Introduce DT
 hardware prober
In-Reply-To: <20240911072751.365361-1-wenst@chromium.org>
References: <20240911072751.365361-1-wenst@chromium.org>
Message-ID: <172625088498.70368.2332989625290315131.b4-ty@kernel.org>

On Wed, 11 Sep 2024 15:27:38 +0800, Chen-Yu Tsai wrote:
> This is v7 of my "of: Introduce hardware prober driver" [1] series.
> v7 mainly refactors the code into a series of helpers. The scope of
> supported components is also reduced to those with at most one regulator
> supply and one GPIO pin. Also the helpers expect these to be named and
> so the "bulk get" API changes have been dropped.
> 
> Also, a pull request to document the "fail-needs-probe" status has been
> sent: https://github.com/devicetree-org/dt-schema/pull/141
> 
> [...]

Applied to

   https://git.kernel.org/pub/scm/linux/kernel/git/broonie/regulator.git for-next

Thanks!

[03/10] regulator: Split up _regulator_get()
        commit: 2a1de5678944147c2a41b6006127d2d0b618e83b

All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.

You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.

If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.

Please add any relevant lists and maintainers to the CCs when replying
to this mail.

Thanks,
Mark



From macpaul.lin at mediatek.com  Fri Sep 13 11:15:50 2024
From: macpaul.lin at mediatek.com (Macpaul Lin)
Date: Sat, 14 Sep 2024 02:15:50 +0800
Subject: [PATCH v2 2/7] dt-bindings: mfd: mediatek: mt6397: Convert to DT
 schema format
In-Reply-To: <20240830153343.GA4175444-robh@kernel.org>
References: <20240830110732.30080-1-macpaul.lin@mediatek.com>
 <20240830110732.30080-2-macpaul.lin@mediatek.com>
 <20240830153343.GA4175444-robh@kernel.org>
Message-ID: <963d092c-9288-2d38-f677-6d99d3d0bcce@mediatek.com>


On 8/30/24 23:33, Rob Herring wrote:
> 	
> 
> External email : Please do not click links or open attachments until you 
> have verified the sender or the content.
> 
> On Fri, Aug 30, 2024 at 07:07:27PM +0800, Macpaul Lin wrote:
>> Convert the mfd: mediatek: mt6397 binding to DT schema format.
>> 
>> MT6323/MT6358/MT6397 are PMIC devices with multiple function of
>> subdevices. They have some variant of the combinations of subdevices
>> but share a common PMIC design.
>> 
>> New updates in this conversion:
>>  - RTC:
>>   - Convert rtc-mt6397.txt and add it into parent's mt6397 PMIC DT schema.
>>  - regulators:
>>   - Align generic names "regulators" instead of origin names.
>>   - mt6323-regulator: Replace "txt" reference with mt6323-regulaotr.yaml
>>   - mt6358-regulator: Replace "txt" reference with mt6358-regulator.yaml
>>   - mt6397-regulator: Replace "txt" reference with mt6397-reuglator.yaml
>>  - audio-codec:
>>   - Align generic name "audio-codec" for codec and sound subdevices.
>>   - Add "mediatek,dmic-mode" and "Avdd-supply".
>>  - clocks:
>>   - Align generic name "clocks" for clockbuffer subdevices.
>>  - leds:
>>   - Convert leds-mt6323.txt and add it into parent's mt6397 PMIC DT schema.
>>  - keys:
>>   - Add more specific descriptions for power and home keys.
>>   - Add compatible: mediatek,mt6358-keys
>>  - power-controller:
>>   - Add property #power-domain-cells for fixing dt-binding check error.
>>   - Add "Baseband power up" as the explaination of abbrevitation "BBPU".
>>  - pinctrl:
>>   - Align generic name "pinctrl" instead of "pin-controller".
>> 
>> Signed-off-by: Sen Chu <sen.chu at mediatek.com>
>> Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
>> ---
>>  .../bindings/mfd/mediatek,mt6397.yaml         | 1026 +++++++++++++++++
>>  .../devicetree/bindings/mfd/mt6397.txt        |  110 --
>>  2 files changed, 1026 insertions(+), 110 deletions(-)
>>  create mode 100644 Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml
>>  delete mode 100644 Documentation/devicetree/bindings/mfd/mt6397.txt
>> 
>> Changes for v1:
>>  - This patch depends on conversion of mediatek,mt6397-regulator.yaml
>>    [1] https://lore.kernel.org/lkml/20240807091738.18387-1-macpaul.lin at mediatek.com/T/
>> 
>> Changes for v2:
>>  - This patch has been made base on linux-next/master git repo.
>>  - Keep the parent and child relationship with mediatek,pwrap in description.
>>    [2] https://lore.kernel.org/all/20240826-slurp-earphone-0d5173923ae8 at spud/
>>  - Keep the $ref for regulators since dt_binding_check didn't report any issue
>>    based on linux-next/master repo.  
>>  - Fix description of mt6397/mt6323 devices, use "power management chip"
>>    instead of "multifunction device"
>>  - Drop unnecessary comments or description according to the review.
>>  - Convert sub-modules to DT Schema:
>>   - RTC, LEDs, power-controllers, regulators
>>  - Drop duplicate sub node name and description for sub-modules
>>   - RTC, Keys
>>  - examples: 
>>   - drop parent pwrap node
>>   - Add examples from mediatek,mt6323-regulator.yaml
>>   - Add examples from mediatek,mt6358-regulator.yaml
>>   - Add examples from mediatek,mt6397-regulator.yaml
>>   - Complete the examples as could as possible.
>> 
>> diff --git a/Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml b/Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml
>> new file mode 100644
>> index 0000000..f5bea33
>> --- /dev/null
>> +++ b/Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml
>> @@ -0,0 +1,1026 @@
>> +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
>> +%YAML 1.2
>> +---
>> +$id: http://devicetree.org/schemas/mfd/mediatek,mt6397.yaml#
>> +$schema: http://devicetree.org/meta-schemas/core.yaml#
>> +
>> +title: MediaTek MT6397/MT6323 Multifunction Device (PMIC)
>> +
>> +maintainers:
>> +  - Sen Chu <sen.chu at mediatek.com>
>> +  - Macpaul Lin <macpaul.lin at mediatek.com>
>> +
>> +description: |
>> +  MT6397/MT6323 is a power management system chip.
>> +  Please see the sub-modules below for supported features.
>> +
>> +  MT6397/MT6323 is a multifunction device with the following sub modules:
>> +  - Regulators
>> +  - RTC
>> +  - Audio codec
>> +  - GPIO
>> +  - Clock
>> +  - LED
>> +  - Keys
>> +  - Power controller
>> +
>> +  It is interfaced to host controller using SPI interface by a proprietary hardware
>> +  called PMIC wrapper or pwrap. MT6397/MT6323 PMIC is a child device of pwrap.
>> +  See the following for pwrap node definitions:
>> +  Documentation/devicetree/bindings/soc/mediatek/mediatek,pwrap.yaml

[snip]

>> +  rtc:
>> +    type: object
>> +    $ref: /schemas/rtc/rtc.yaml#
>> +    unevaluatedProperties: false
>> +    description:
>> +      MT6397 Real Time Clock.
> 
> Blank line

Will fix this in v3 version.

> 
>> +    properties:
>> +      compatible:
>> +        oneOf:
>> +          - enum:
>> +              - mediatek,mt6323-rtc
>> +              - mediatek,mt6331-rtc
>> +              - mediatek,mt6358-rtc
>> +              - mediatek,mt6397-rtc
>> +          - items:
>> +              - enum:
>> +                  - mediatek,mt6366-rtc
>> +              - const: mediatek,mt6358-rtc
> 
> Blank line between DT properties

Will fix this in v3 version.

>> +      start-year: true
>> +    required:
>> +      - compatible
>> +
>> +  regulators:
>> +    type: object
>> +    oneOf:
>> +      - $ref: /schemas/regulator/mediatek,mt6323-regulator.yaml
>> +      - $ref: /schemas/regulator/mediatek,mt6358-regulator.yaml
>> +      - $ref: /schemas/regulator/mediatek,mt6397-regulator.yaml
>> +    unevaluatedProperties: false
>> +    description:
>> +      List of child nodes that specify the regulators.
>> +    properties:
>> +      compatible:
>> +        oneOf:
>> +          - enum:
>> +              - mediatek,mt6323-regulator
>> +              - mediatek,mt6358-regulator
>> +              - mediatek,mt6397-regulator
>> +          - items:
>> +              - enum:
>> +                  - mediatek,mt6366-regulator
>> +              - const: mediatek,mt6358-regulator
> 
> You need the references or compatible, but not both. It's more efficient
> if you list the compatibles along with a 'additionalProperties: true'.
> Otherwise, the referenced schemas have to all be applied and the
> matching one will be applied twice.
> 
> Also, for compatible here, just use 'contains' and list all possible
> compatibles. The exact combinations are enforced in the regulator
> schemas.

Both 'addtionalProperties: true' and 'contains' will be added to
v3 version. Since there are different regulator nodes in these
DT Schema but seems no other common nodes, $ref will be added
to if..then.. match rulesfor each compatible.


[snip]

>> +
>> +  leds:
>> +    type: object
>> +    additionalProperties: false
>> +    description:
> 
> You need '|' or '>' to preserve line breaks.

Will be fixed in v3 version.


>> +
>> +    properties:
>> +      compatible:
>> +        oneOf:
> 
> Only 1 entry, don't need oneOf.
> 

Will be fixed in v3 version.

>> +          - enum:
>> +              - mediatek,mt6323-led
>> +              - mediatek,mt6331-led
>> +              - mediatek,mt6332-led
>> +      "#address-cells":
>> +        const: 1
> 
> blank line

Will be fixed in v3 version.

>> +      "#size-cells":
>> +        const: 0
> 
> blank line. And so on...

Will be fixed in v3 version.

>> +      reg:
>> +        description:
>> +          LED channel number (0..3)
>> +        minimum: 0
>> +        maximum: 3
> 
> Doesn't use the led binding?

Will be fixed in v3 version: using led bindings.

[snip]

>> +

>> +
>> +examples:
>> +  - |
>> +    #include <dt-bindings/interrupt-controller/arm-gic.h>
>> +
>> +    mt6323_pmic: pmic {
> 
> Drop unused labels.

Will be fixed in v3 version.

>> +        compatible = "mediatek,mt6323";
>> +        interrupt-parent = <&pio>;
>> +        interrupts = <150 IRQ_TYPE_LEVEL_HIGH>;
>> +        interrupt-controller;
>> +        #interrupt-cells = <2>;
>> +
>> +        mt6323_leds: leds {
>> +                compatible = "mediatek,mt6323-led";
>> +                #address-cells = <1>;
>> +                status = "disabled";
> 
> Examples shouldn't be disabled.

Will be fixed in v3 version.

[snip]

Thanks for the review.

Regards,
Macpaul Lin


From olteanv at gmail.com  Fri Sep 13 12:03:26 2024
From: olteanv at gmail.com (Vladimir Oltean)
Date: Fri, 13 Sep 2024 22:03:26 +0300
Subject: [PATCH 1/2] net: dsa: RCU-protect dsa_ptr in struct net_device
In-Reply-To: <20240910130321.337154-2-alexander.sverdlin@siemens.com>
References: <20240910130321.337154-1-alexander.sverdlin@siemens.com>
 <20240910130321.337154-2-alexander.sverdlin@siemens.com>
Message-ID: <20240913190326.xv5qkxt7b3sjuroz@skbuf>

Hi Alexander,

On Tue, Sep 10, 2024 at 03:03:15PM +0200, A. Sverdlin wrote:
> From: Alexander Sverdlin <alexander.sverdlin at siemens.com>
> 
> There are multiple races of zeroing dsa_ptr in struct net_device (on
> shutdown/remove) against asynchronous dereferences all over the net
> code. Widespread pattern is as follows:
> 
> CPU0					CPU1
> if (netdev_uses_dsa())
> 					dev->dsa_ptr = NULL;
>         dev->dsa_ptr->...
> 
> One of the possible crashes:
> 
> Unable to handle kernel NULL pointer dereference at virtual address 0000000000000010
> CPU: 0 PID: 12 Comm: ksoftirqd/0 Tainted: G O 6.1.99+ #1
> pc : lan9303_rcv
> lr : lan9303_rcv
> Call trace:
>  lan9303_rcv
>  dsa_switch_rcv
>  __netif_receive_skb_list_core
>  netif_receive_skb_list_internal
>  napi_gro_receive
>  fec_enet_rx_napi
>  __napi_poll
>  net_rx_action
> ...
> 
> RCU-protect dsa_ptr and use rcu_dereference() or rtnl_dereference()
> depending on the calling context.
> 
> Rename netdev_uses_dsa() into __netdev_uses_dsa_currently()
> (assumes ether RCU or RTNL lock held) and netdev_uses_dsa_currently()
> variants which better reflect the uselessness of the function's
> return value, which becomes outdated right after the call.
> 
> Fixes: ee534378f005 ("net: dsa: fix panic when DSA master device unbinds on shutdown")
> Cc: stable at vger.kernel.org
> Signed-off-by: Alexander Sverdlin <alexander.sverdlin at siemens.com>
> ---
>  drivers/net/dsa/mt7530.c                    |   3 +-
>  drivers/net/dsa/ocelot/felix.c              |   3 +-
>  drivers/net/dsa/qca/qca8k-8xxx.c            |   3 +-
>  drivers/net/ethernet/broadcom/bcmsysport.c  |   8 +-
>  drivers/net/ethernet/mediatek/airoha_eth.c  |   2 +-
>  drivers/net/ethernet/mediatek/mtk_eth_soc.c |  22 +++--
>  drivers/net/ethernet/mediatek/mtk_ppe.c     |  15 ++-
>  include/linux/netdevice.h                   |   2 +-
>  include/net/dsa.h                           |  36 +++++--
>  include/net/dsa_stubs.h                     |   6 +-
>  net/bridge/br_input.c                       |   2 +-
>  net/core/dev.c                              |   3 +-
>  net/core/flow_dissector.c                   |  19 ++--
>  net/dsa/conduit.c                           |  66 ++++++++-----
>  net/dsa/dsa.c                               |  19 ++--
>  net/dsa/port.c                              |   3 +-
>  net/dsa/tag.c                               |   3 +-
>  net/dsa/tag.h                               |  19 ++--
>  net/dsa/tag_8021q.c                         |  10 +-
>  net/dsa/tag_brcm.c                          |   2 +-
>  net/dsa/tag_dsa.c                           |   8 +-
>  net/dsa/tag_qca.c                           |  10 +-
>  net/dsa/tag_sja1105.c                       |  22 +++--
>  net/dsa/user.c                              | 104 +++++++++++---------
>  net/ethernet/eth.c                          |   2 +-
>  25 files changed, 240 insertions(+), 152 deletions(-)

Thank you for the patch, and I would like you to not give up on it, even
if we will go for a different bug fix for 'stable'.

It's just that it makes me a bit uneasy to have this as the bug fix.
"Stable" kernels are supposedly named as such because you're not backporting
such a major usage pattern change from the core down to all switch drivers
and N other Ethernet drivers which you can't even test. The diffstat
here says it all, I believe.

This kind of change, in principle, is okay for an early net-next opening.
I have it in my tree, have made a few changes to it, will run more tests
on the HW I have, and will let you know over the course of the following
weeks when it reaches a stage that I'm also comfortable with.


From robh at kernel.org  Fri Sep 13 12:23:20 2024
From: robh at kernel.org (Rob Herring (Arm))
Date: Fri, 13 Sep 2024 14:23:20 -0500
Subject: [PATCH v3 2/3] dt-bindings: mfd: mediatek: mt6397: Convert to
 DT schema format
In-Reply-To: <20240913175926.7443-1-macpaul.lin@mediatek.com>
References: <20240913175926.7443-1-macpaul.lin@mediatek.com>
Message-ID: <172625540069.478205.2893721075637493498.robh@kernel.org>


On Sat, 14 Sep 2024 01:59:26 +0800, Macpaul Lin wrote:
> Convert the mfd: mediatek: mt6397 binding to DT schema format.
> 
> MT6323, MT6358, and MT6397 are PMIC devices with multiple function
> subdevices. They share a common PMIC design but have variations in
> subdevice combinations.
> 
> Key updates in this conversion:
> 
> 1. RTC:
>    - Convert rtc-mt6397.txt and merge into parent MT6397 PMIC DT schema.
> 
> 2. Regulators:
>    - Align to generic name "regulators".
>    - Update references from .txt to .yaml for mt6323, mt6358, and mt6397
>      regulators.
>    - Simplify regulator name labels in device tree examples.
> 
> 3. Audio Codec:
>    - Convert sound/mt6358.txt and merge into parent MT6397 PMIC DT schema.
>    - Align to generic name "audio-codec" for codec and sound subdevices.
>    - Add "mediatek,dmic-mode" and "Avdd-supply" properties.
> 
> 4. Clocks:
>    - Align to generic name "clocks" for clockbuffer subdevices.
> 
> 5. LEDs:
>    - Convert leds-mt6323.txt and merge into parent MT6397 PMIC DT schema.
>    - Update LED binding.
> 
> 6. Keys:
>    - Add detailed descriptions for power and home keys.
>    - Add compatible: mediatek,mt6358-keys.
> 
> 7. Power Controller:
>    - Convert mt6323-poweroff.txt and merge into parent MT6397 PMIC DT
>      schema.
>    - Add #power-domain-cells property to fix dt-binding check error.
>    - Clarify "BBPU" as "Baseband power up".
> 
> 8. Pinctrl:
>    - Align to generic name "pinctrl" instead of "pin-controller".
> 
> Additional updates:
> - MAINTAINERS: Add co-maintainers and reference to
>   mfd/mediatek,mt6397.yaml for LED and power-controller drivers.
> - input/mediatek,pmic-keys.yaml: Update reference to
>   mfd/mediatek,mt6397.yaml.
> 
> Signed-off-by: Sen Chu <sen.chu at mediatek.com>
> Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
> ---
>  .../bindings/input/mediatek,pmic-keys.yaml    |    2 +-
>  .../devicetree/bindings/leds/leds-mt6323.txt  |   63 -
>  .../bindings/mfd/mediatek,mt6397.yaml         | 1078 +++++++++++++++++
>  .../devicetree/bindings/mfd/mt6397.txt        |  110 --
>  .../bindings/power/reset/mt6323-poweroff.txt  |   20 -
>  .../devicetree/bindings/rtc/rtc-mt6397.txt    |   31 -
>  .../devicetree/bindings/sound/mt6358.txt      |   26 -
>  MAINTAINERS                                   |    8 +-
>  8 files changed, 1085 insertions(+), 253 deletions(-)
>  delete mode 100644 Documentation/devicetree/bindings/leds/leds-mt6323.txt
>  create mode 100644 Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml
>  delete mode 100644 Documentation/devicetree/bindings/mfd/mt6397.txt
>  delete mode 100644 Documentation/devicetree/bindings/power/reset/mt6323-poweroff.txt
>  delete mode 100644 Documentation/devicetree/bindings/rtc/rtc-mt6397.txt
>  delete mode 100644 Documentation/devicetree/bindings/sound/mt6358.txt
> 
> Changes for v1:
>  - This patch depends on conversion of mediatek,mt6397-regulator.yaml
>    [1] https://lore.kernel.org/lkml/20240807091738.18387-1-macpaul.lin at mediatek.com/T/
> 
> Changes for v2:
>  - This patch has been made base on linux-next/master git repo.
>  - Keep the parent and child relationship with mediatek,pwrap in description.
>    [2] https://lore.kernel.org/all/20240826-slurp-earphone-0d5173923ae8 at spud/
>  - Keep the $ref for regulators since dt_binding_check didn't report any issue
>    based on linux-next/master repo.
>  - Fix description of mt6397/mt6323 devices, use "power management chip"
>    instead of "multifunction device"
>  - Drop unnecessary comments or description according to the review.
>  - Convert sub-modules to DT Schema:
>   - RTC, LEDs, power-controllers, regulators
>  - Drop duplicate sub node name and description for sub-modules
>   - RTC, Keys
>  - examples:
>   - drop parent pwrap node
>   - Add examples from mediatek,mt6323-regulator.yaml
>   - Add examples from mediatek,mt6358-regulator.yaml
>   - Add examples from mediatek,mt6397-regulator.yaml
>   - Complete the examples as could as possible.
> 
> Changes for v3:
>  - Rebased on linux-next/master git repo near next-20240906.
>  - Revise commit message.
>  - Regulators:
>   - Use "additionalProperties: true" and add "contains" for matching
>     $ref DT bindings.
>   - Simplify regulator name labels in device tree examples.
>  - LEDs:
>   - Use LED bindings.
>  - Squash following patches in v2 for removing old text format DT bindings
>    into this patch, includes:
>   - leds-mt6323.txt, mt6323-poweroff.txt, rtc-mt6397.txt, sound/mt6358.txt.
>  - Fix file format of DT schemas, add blank between properties.
>  - Fix 'make checkrefdoc' errors, update reference in mediatek,pmic-keys.yaml.
> 

My bot found errors running 'make dt_binding_check' on your patch:

yamllint warnings/errors:

dtschema/dtc warnings/errors:
Warning: Duplicate compatible "mediatek,mt6357" found in schemas matching "$id":
	http://devicetree.org/schemas/mfd/mediatek,mt6397.yaml#
	http://devicetree.org/schemas/mfd/mediatek,mt6357.yaml#
/builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/mfd/mediatek,mt6397.example.dtb: pmic: regulators: False schema does not allow {'compatible': ['mediatek,mt6323-regulator'], 'buck_vproc': {'regulator-name': ['vproc'], 'regulator-min-microvolt': [[700000]], 'regulator-max-microvolt': [[1350000]], 'regulator-ramp-delay': 12500, 'regulator-always-on': True, 'regulator-boot-on': True}, 'buck_vsys': {'regulator-name': ['vsys'], 'regulator-min-microvolt': [[1400000]], 'regulator-max-microvolt': [[2987500]], 'regulator-ramp-delay': 25000, 'regulator-always-on': True, 'regulator-boot-on': True}, 'buck_vpa': {'regulator-name': ['vpa'], 'regulator-min-microvolt': [[500000]], 'regulator-max-microvolt': [[3650000]]}, 'ldo_vtcxo': {'regulator-name': ['vtcxo'], 'regulator-min-microvolt': [[2800000]], 'regulator-max-microvolt': [[2800000]], 'regulator-enable-ramp-delay': 90, 'regulator-always-on': True, 'regulator-boot-on': True}, 'ldo_vcn28': {'regulator-name': ['vcn28'], 'r
 egulator-min-microvolt': [[2800000]], 'regulator-max-microvolt': [[2800000]], 'regulator-enable-ramp-delay': 185}, 'ldo_vcn33_bt': {'regulator-name': ['vcn33_bt'], 'regulator-min-microvolt': [[3300000]], 'regulator-max-microvolt': [[3600000]], 'regulator-enable-ramp-delay': 185}, 'ldo_vcn33_wifi': {'regulator-name': ['vcn33_wifi'], 'regulator-min-microvolt': [[3300000]], 'regulator-max-microvolt': [[3600000]], 'regulator-enable-ramp-delay': 185}, 'ldo_va': {'regulator-name': ['va'], 'regulator-min-microvolt': [[2800000]], 'regulator-max-microvolt': [[2800000]], 'regulator-enable-ramp-delay': 216, 'regulator-always-on': True, 'regulator-boot-on': True}, 'ldo_vcama': {'regulator-name': ['vcama'], 'regulator-min-microvolt': [[1500000]], 'regulator-max-microvolt': [[2800000]], 'regulator-enable-ramp-delay': 216}, 'ldo_vio28': {'regulator-name': ['vio28'], 'regulator-min-microvolt': [[2800000]], 'regulator-max-microvolt': [[2800000]], 'regulator-enable-ramp-delay': 216, 'regulator-always
 -on': True, 'regulator-boot-on': True}, 'ldo_vusb': {'regulator-name': ['vusb'], 'regulator-min-microvolt': [[3300000]], 'regulator-max-microvolt': [[3300000]], 'regulator-enable-ramp-delay': 216, 'regulator-boot-on': True}, 'ldo_vmc': {'regulator-name': ['vmc'], 'regulator-min-microvolt': [[1800000]], 'regulator-max-microvolt': [[3300000]], 'regulator-enable-ramp-delay': 36, 'regulator-boot-on': True}, 'ldo_vmch': {'regulator-name': ['vmch'], 'regulator-min-microvolt': [[3000000]], 'regulator-max-microvolt': [[3300000]], 'regulator-enable-ramp-delay': 36, 'regulator-boot-on': True}, 'ldo_vemc3v3': {'regulator-name': ['vemc3v3'], 'regulator-min-microvolt': [[3000000]], 'regulator-max-microvolt': [[3300000]], 'regulator-enable-ramp-delay': 36, 'regulator-boot-on': True}, 'ldo_vgp1': {'regulator-name': ['vgp1'], 'regulator-min-microvolt': [[1200000]], 'regulator-max-microvolt': [[3300000]], 'regulator-enable-ramp-delay': 216}, 'ldo_vgp2': {'regulator-name': ['vgp2'], 'regulator-min-mi
 crovolt': [[1200000]], 'regulator-max-microvolt': [[3000000]], 'regulator-enable-ramp-delay': 216}, 'ldo_vgp3': {'regulator-name': ['vgp3'], 'regulator-min-microvolt': [[1200000]], 'regulator-max-microvolt': [[1800000]], 'regulator-enable-ramp-delay': 216}, 'ldo_vcn18': {'regulator-name': ['vcn18'], 'regulator-min-microvolt': [[1800000]], 'regulator-max-microvolt': [[1800000]], 'regulator-enable-ramp-delay': 216}, 'ldo_vsim1': {'regulator-name': ['vsim1'], 'regulator-min-microvolt': [[1800000]], 'regulator-max-microvolt': [[3000000]], 'regulator-enable-ramp-delay': 216}, 'ldo_vsim2': {'regulator-name': ['vsim2'], 'regulator-min-microvolt': [[1800000]], 'regulator-max-microvolt': [[3000000]], 'regulator-enable-ramp-delay': 216}, 'ldo_vrtc': {'regulator-name': ['vrtc'], 'regulator-min-microvolt': [[2800000]], 'regulator-max-microvolt': [[2800000]], 'regulator-always-on': True, 'regulator-boot-on': True}, 'ldo_vcamaf': {'regulator-name': ['vcamaf'], 'regulator-min-microvolt': [[1200000
 ]], 'regulator-max-microvolt': [[3300000]], 'regulator-enable-ramp-delay': 216}, 'ldo_vibr': {'regulator-name': ['vibr'], 'regulator-min-microvolt': [[1200000]], 'regulator-max-microvolt': [[3300000]], 'regulator-enable-ramp-delay': 36}, 'ldo_vrf18': {'regulator-name': ['vrf18'], 'regulator-min-microvolt': [[1825000]], 'regulator-max-microvolt': [[1825000]], 'regulator-enable-ramp-delay': 187}, 'ldo_vm': {'regulator-name': ['vm'], 'regulator-min-microvolt': [[1200000]], 'regulator-max-microvolt': [[1800000]], 'regulator-enable-ramp-delay': 216, 'regulator-always-on': True, 'regulator-boot-on': True}, 'ldo_vio18': {'regulator-name': ['vio18'], 'regulator-min-microvolt': [[1800000]], 'regulator-max-microvolt': [[1800000]], 'regulator-enable-ramp-delay': 216, 'regulator-always-on': True, 'regulator-boot-on': True}, 'ldo_vcamd': {'regulator-name': ['vcamd'], 'regulator-min-microvolt': [[1200000]], 'regulator-max-microvolt': [[1800000]], 'regulator-enable-ramp-delay': 216}, 'ldo_vcamio':
  {'regulator-name': ['vcamio'], 'regulator-min-microvolt': [[1800000]], 'regulator-max-microvolt': [[1800000]], 'regulator-enable-ramp-delay': 216}}
	from schema $id: http://devicetree.org/schemas/mfd/mediatek,mt6397.yaml#
/builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/mfd/mediatek,mt6397.example.dtb: pmic: regulators: False schema does not allow {'compatible': ['mediatek,mt6397-regulator'], 'buck_vpca15': {'regulator-name': ['vpca15'], 'regulator-min-microvolt': [[850000]], 'regulator-max-microvolt': [[1350000]], 'regulator-ramp-delay': 12500, 'regulator-enable-ramp-delay': 200}, 'buck_vpca7': {'regulator-name': ['vpca7'], 'regulator-min-microvolt': [[850000]], 'regulator-max-microvolt': [[1350000]], 'regulator-ramp-delay': 12500, 'regulator-enable-ramp-delay': 115}, 'buck_vsramca15': {'regulator-name': ['vsramca15'], 'regulator-min-microvolt': [[850000]], 'regulator-max-microvolt': [[1350000]], 'regulator-ramp-delay': 12500, 'regulator-enable-ramp-delay': 115}, 'buck_vsramca7': {'regulator-name': ['vsramca7'], 'regulator-min-microvolt': [[850000]], 'regulator-max-microvolt': [[1350000]], 'regulator-ramp-delay': 12500, 'regulator-enable-ramp-delay': 115}, 'buck_vcore': {'regul
 ator-name': ['vcore'], 'regulator-min-microvolt': [[850000]], 'regulator-max-microvolt': [[1350000]], 'regulator-ramp-delay': 12500, 'regulator-enable-ramp-delay': 115}, 'buck_vgpu': {'regulator-name': ['vgpu'], 'regulator-min-microvolt': [[700000]], 'regulator-max-microvolt': [[1350000]], 'regulator-ramp-delay': 12500, 'regulator-enable-ramp-delay': 115}, 'buck_vdrm': {'regulator-name': ['vdrm'], 'regulator-min-microvolt': [[800000]], 'regulator-max-microvolt': [[1400000]], 'regulator-ramp-delay': 12500, 'regulator-enable-ramp-delay': 500}, 'buck_vio18': {'regulator-name': ['vio18'], 'regulator-min-microvolt': [[1500000]], 'regulator-max-microvolt': [[2120000]], 'regulator-ramp-delay': 12500, 'regulator-enable-ramp-delay': 500}, 'ldo_vtcxo': {'regulator-name': ['vtcxo'], 'regulator-min-microvolt': [[2800000]], 'regulator-max-microvolt': [[2800000]], 'regulator-enable-ramp-delay': 90}, 'ldo_va28': {'regulator-name': ['va28'], 'regulator-enable-ramp-delay': 218}, 'ldo_vcama': {'regul
 ator-name': ['vcama'], 'regulator-min-microvolt': [[1500000]], 'regulator-max-microvolt': [[2800000]], 'regulator-enable-ramp-delay': 218}, 'ldo_vio28': {'regulator-name': ['vio28'], 'regulator-enable-ramp-delay': 240}, 'ldo_vusb': {'regulator-name': ['vusb'], 'regulator-enable-ramp-delay': 218}, 'ldo_vmc': {'regulator-name': ['vmc'], 'regulator-min-microvolt': [[1800000]], 'regulator-max-microvolt': [[3300000]], 'regulator-enable-ramp-delay': 218}, 'ldo_vmch': {'regulator-name': ['vmch'], 'regulator-min-microvolt': [[3000000]], 'regulator-max-microvolt': [[3300000]], 'regulator-enable-ramp-delay': 218}, 'ldo_vemc3v3': {'regulator-name': ['vemc_3v3'], 'regulator-min-microvolt': [[3000000]], 'regulator-max-microvolt': [[3300000]], 'regulator-enable-ramp-delay': 218}, 'ldo_vgp1': {'regulator-name': ['vcamd'], 'regulator-min-microvolt': [[1220000]], 'regulator-max-microvolt': [[3300000]], 'regulator-enable-ramp-delay': 240}, 'ldo_vgp2': {'regulator-name': ['vcamio'], 'regulator-min-mic
 rovolt': [[1000000]], 'regulator-max-microvolt': [[3300000]], 'regulator-enable-ramp-delay': 218}, 'ldo_vgp3': {'regulator-name': ['vcamaf'], 'regulator-min-microvolt': [[1200000]], 'regulator-max-microvolt': [[3300000]], 'regulator-enable-ramp-delay': 218}, 'ldo_vgp4': {'regulator-name': ['vgp4'], 'regulator-min-microvolt': [[1200000]], 'regulator-max-microvolt': [[3300000]], 'regulator-enable-ramp-delay': 218}, 'ldo_vgp5': {'regulator-name': ['vgp5'], 'regulator-min-microvolt': [[1200000]], 'regulator-max-microvolt': [[3000000]], 'regulator-enable-ramp-delay': 218}, 'ldo_vgp6': {'regulator-name': ['vgp6'], 'regulator-min-microvolt': [[1200000]], 'regulator-max-microvolt': [[3300000]], 'regulator-enable-ramp-delay': 218}, 'ldo_vibr': {'regulator-name': ['vibr'], 'regulator-min-microvolt': [[1200000]], 'regulator-max-microvolt': [[3300000]], 'regulator-enable-ramp-delay': 218}}
	from schema $id: http://devicetree.org/schemas/mfd/mediatek,mt6397.yaml#

doc reference errors (make refcheckdocs):

See https://patchwork.ozlabs.org/project/devicetree-bindings/patch/20240913175926.7443-1-macpaul.lin at mediatek.com

The base for the series is generally the latest rc1. A different dependency
should be noted in *this* patch.

If you already ran 'make dt_binding_check' and didn't see the above
error(s), then make sure 'yamllint' is installed and dt-schema is up to
date:

pip3 install dtschema --upgrade

Please check and re-submit after running the above command yourself. Note
that DT_SCHEMA_FILES can be set to your schema file to speed up checking
your schema. However, it must be unset to test all examples with your schema.



From andrew at lunn.ch  Fri Sep 13 12:27:23 2024
From: andrew at lunn.ch (Andrew Lunn)
Date: Fri, 13 Sep 2024 21:27:23 +0200
Subject: [PATCH 1/2] net: dsa: RCU-protect dsa_ptr in struct net_device
In-Reply-To: <20240913190326.xv5qkxt7b3sjuroz@skbuf>
References: <20240910130321.337154-1-alexander.sverdlin@siemens.com>
 <20240910130321.337154-2-alexander.sverdlin@siemens.com>
 <20240913190326.xv5qkxt7b3sjuroz@skbuf>
Message-ID: <28d0a7a5-ead6-4ce0-801c-096038823259@lunn.ch>

> >  drivers/net/dsa/mt7530.c                    |   3 +-
> >  drivers/net/dsa/ocelot/felix.c              |   3 +-
> >  drivers/net/dsa/qca/qca8k-8xxx.c            |   3 +-
> >  drivers/net/ethernet/broadcom/bcmsysport.c  |   8 +-
> >  drivers/net/ethernet/mediatek/airoha_eth.c  |   2 +-
> >  drivers/net/ethernet/mediatek/mtk_eth_soc.c |  22 +++--
> >  drivers/net/ethernet/mediatek/mtk_ppe.c     |  15 ++-
> >  include/linux/netdevice.h                   |   2 +-
> >  include/net/dsa.h                           |  36 +++++--
> >  include/net/dsa_stubs.h                     |   6 +-
> >  net/bridge/br_input.c                       |   2 +-
> >  net/core/dev.c                              |   3 +-
> >  net/core/flow_dissector.c                   |  19 ++--
> >  net/dsa/conduit.c                           |  66 ++++++++-----
> >  net/dsa/dsa.c                               |  19 ++--
> >  net/dsa/port.c                              |   3 +-
> >  net/dsa/tag.c                               |   3 +-
> >  net/dsa/tag.h                               |  19 ++--
> >  net/dsa/tag_8021q.c                         |  10 +-
> >  net/dsa/tag_brcm.c                          |   2 +-
> >  net/dsa/tag_dsa.c                           |   8 +-
> >  net/dsa/tag_qca.c                           |  10 +-
> >  net/dsa/tag_sja1105.c                       |  22 +++--
> >  net/dsa/user.c                              | 104 +++++++++++---------
> >  net/ethernet/eth.c                          |   2 +-
> >  25 files changed, 240 insertions(+), 152 deletions(-)
> 
> Thank you for the patch, and I would like you to not give up on it, even
> if we will go for a different bug fix for 'stable'.
> 
> It's just that it makes me a bit uneasy to have this as the bug fix.

+1

We should try for a minimal fix for stable, and keep this for
net-next, given its size.

https://www.kernel.org/doc/html/latest/process/stable-kernel-rules.html

* It must be obviously correct and tested.
* It cannot be bigger than 100 lines, with context.

	Andrew


From robh at kernel.org  Fri Sep 13 12:55:13 2024
From: robh at kernel.org (Rob Herring (Arm))
Date: Fri, 13 Sep 2024 14:55:13 -0500
Subject: [PATCH] dt-bindings: clock: mediatek: Drop duplicate
 mediatek,mt6795-sys-clock.yaml
In-Reply-To: <20240910234238.1028422-1-robh@kernel.org>
References: <20240910234238.1028422-1-robh@kernel.org>
Message-ID: <172625731189.514249.780064376530933894.robh@kernel.org>


On Tue, 10 Sep 2024 18:42:37 -0500, Rob Herring (Arm) wrote:
> The compatible strings for mt6795 clocks are also documented in other
> schemas:
> 
> "mediatek,mt6795-apmixedsys" in clock/mediatek,apmixedsys.yaml
> "mediatek,mt6795-topckgen" in clock/mediatek,topckgen.yaml
> "mediatek,mt6795-pericfg" in clock/mediatek,pericfg.yaml
> "mediatek,mt6795-infracfg" in clock/mediatek,infracfg.yaml
> 
> The only difference is #reset-cells is not allowed in some of these,
> but that aligns with actual users in .dts files.
> 
> Signed-off-by: Rob Herring (Arm) <robh at kernel.org>
> ---
>  .../clock/mediatek,mt6795-sys-clock.yaml      | 54 -------------------
>  1 file changed, 54 deletions(-)
>  delete mode 100644 Documentation/devicetree/bindings/clock/mediatek,mt6795-sys-clock.yaml
> 

Applied, thanks!



From olteanv at gmail.com  Fri Sep 13 13:29:16 2024
From: olteanv at gmail.com (Vladimir Oltean)
Date: Fri, 13 Sep 2024 23:29:16 +0300
Subject: [PATCH v2 net 2/5] net: dsa: be compatible with masters which
 unregister on shutdown
In-Reply-To: <2d2e3bba17203c14a5ffdabc174e3b6bbb9ad438.camel@siemens.com>
References: <20210917133436.553995-1-vladimir.oltean@nxp.com>
 <20210917133436.553995-3-vladimir.oltean@nxp.com>
 <2d2e3bba17203c14a5ffdabc174e3b6bbb9ad438.camel@siemens.com>
Message-ID: <20240913202916.t7bpdc6ubfdpv47s@skbuf>

Hi Alexander,

On Wed, Sep 04, 2024 at 08:31:13AM +0000, Sverdlin, Alexander wrote:
> > +static void lan9303_mdio_shutdown(struct mdio_device *mdiodev)
> > +{
> > +	struct lan9303_mdio *sw_dev = dev_get_drvdata(&mdiodev->dev);
> > +
> > +	if (!sw_dev)
> > +		return;
> > +
> > +	lan9303_shutdown(&sw_dev->chip);
> > +
> > +	dev_set_drvdata(&mdiodev->dev, NULL);
> > ?}
> 
> This unfortunately didn't work well with LAN9303 and probably will not work
> with others:
> 
> Unable to handle kernel NULL pointer dereference at virtual address 0000000000000000
> CPU: 0 PID: 442 Comm: kworker/0:3 Tainted: G           O       6.1.99+gitb7793b7d9b35 #1
> Workqueue: events_power_efficient phy_state_machine
> pc : lan9303_mdio_phy_read+0x1c/0x34
> lr : lan9303_phy_read+0x50/0x100
> Call trace:
>  lan9303_mdio_phy_read+0x1c/0x34
>  lan9303_phy_read+0x50/0x100
>  dsa_slave_phy_read+0x40/0x50
>  __mdiobus_read+0x34/0x130
>  mdiobus_read+0x44/0x70
>  genphy_update_link+0x2c/0x104
>  genphy_read_status+0x2c/0x120
>  phy_check_link_status+0xb8/0xcc
>  phy_state_machine+0x198/0x27c
>  process_one_work+0x1dc/0x450
>  worker_thread+0x154/0x450
> 
> as long as the ports are not down (and dsa_switch_shutdown() doesn't ensure it),
> we cannot just zero drvdata, because PHY polling will eventually call
> 
> static int lan9303_mdio_phy_read(struct lan9303 *chip, int addr, int reg)
> {
>         struct lan9303_mdio *sw_dev = dev_get_drvdata(chip->dev);
> 
>         return mdiobus_read_nested(sw_dev->device->bus, addr, reg);
> 
> There are however multiple other unsafe patterns.
> I suppose current
> 
> dsa_switch_shutdown();
> dev_set_drvdata(...->dev, NULL);
> 
> pattern is broken in many cases...

Unfortunately the code portion which you've quoted for your reply does not
show the full story. dsa_switch_shutdown(), at the time of this patch,
was implemented like this (stripped of comments):

void dsa_switch_shutdown(struct dsa_switch *ds)
{
	struct net_device *master, *slave_dev;
	LIST_HEAD(unregister_list);
	struct dsa_port *dp;

	mutex_lock(&dsa2_mutex);
	rtnl_lock();

	list_for_each_entry(dp, &ds->dst->ports, list) {
		if (dp->ds != ds)
			continue;

		if (!dsa_port_is_user(dp))
			continue;

		master = dp->cpu_dp->master;
		slave_dev = dp->slave;

		netdev_upper_dev_unlink(master, slave_dev);
		unregister_netdevice_queue(slave_dev, &unregister_list);
	}
	unregister_netdevice_many(&unregister_list);

	rtnl_unlock();
	mutex_unlock(&dsa2_mutex);
}

I believe you would be wrong to blame this patch for exiting with the
slave/user ports still running (and thus ds->ops->phy_read() still
callable), because, as you can see, it doesn't do that - it unregisters
them, which also stops the net_device prior. So, both phylink_stop() and
phylink_destroy() would be called.

The patch had other problems though, and that led to the rework in
commit ee534378f005 ("net: dsa: fix panic when DSA master device unbinds
on shutdown"), rework which is in fact to blame for what you're reporting.

Given that we are talking about a fix to a fix, it doesn't really matter
in terms of backporting targets which one it is, but for correctness sake,
it is the later patch that fixed some things while introducing the race
condition.


From robh at kernel.org  Fri Sep 13 14:37:14 2024
From: robh at kernel.org (Rob Herring)
Date: Fri, 13 Sep 2024 16:37:14 -0500
Subject: [PATCH 2/2] arm64: dts: mt8183: Add port node to dpi node
In-Reply-To: <20240912144430.3161717-3-treapking@chromium.org>
References: <20240912144430.3161717-1-treapking@chromium.org> <20240912144430.3161717-3-treapking@chromium.org>
Message-ID: <CAL_JsqJngFLbNtT3m--xi5nNt9o7M=se8Qkhf20TxRCj-G=6dA@mail.gmail.com>

On Thu, Sep 12, 2024 at 9:44?AM Pin-yen Lin <treapking at chromium.org> wrote:
>
> Add the port node to fix the binding schema check.

The dsi node has the same issue.

> Fixes: 009d855a26fd ("arm64: dts: mt8183: add dpi node to mt8183")
> Signed-off-by: Pin-yen Lin <treapking at chromium.org>
> Reported-by: kernel test robot <lkp at intel.com>
> Closes: https://lore.kernel.org/oe-kbuild-all/202409110843.Hm5W9upr-lkp at intel.com/
>
> ---
>
>  arch/arm64/boot/dts/mediatek/mt8183.dtsi | 4 ++++
>  1 file changed, 4 insertions(+)
>
> diff --git a/arch/arm64/boot/dts/mediatek/mt8183.dtsi b/arch/arm64/boot/dts/mediatek/mt8183.dtsi
> index 266441e999f2..0a6578aacf82 100644
> --- a/arch/arm64/boot/dts/mediatek/mt8183.dtsi
> +++ b/arch/arm64/boot/dts/mediatek/mt8183.dtsi
> @@ -1845,6 +1845,10 @@ dpi0: dpi at 14015000 {
>                                  <&mmsys CLK_MM_DPI_MM>,
>                                  <&apmixedsys CLK_APMIXED_TVDPLL>;
>                         clock-names = "pixel", "engine", "pll";
> +
> +                       port {
> +                               dpi_out: endpoint { };
> +                       };
>                 };
>
>                 mutex: mutex at 14016000 {
> --
> 2.46.0.662.g92d0881bb0-goog
>


From robh at kernel.org  Fri Sep 13 14:39:10 2024
From: robh at kernel.org (Rob Herring)
Date: Fri, 13 Sep 2024 16:39:10 -0500
Subject: [PATCH 1/2] dt-bindings: display: mediatek: dpi: Add
 power-domains to the bindings
In-Reply-To: <20240912144430.3161717-2-treapking@chromium.org>
References: <20240912144430.3161717-1-treapking@chromium.org> <20240912144430.3161717-2-treapking@chromium.org>
Message-ID: <CAL_JsqLhnuqASgOab7RjdrUxGs4ags8CutL0K9Vr_57HmL+TpQ@mail.gmail.com>

On Thu, Sep 12, 2024 at 9:44?AM Pin-yen Lin <treapking at chromium.org> wrote:
>
> The power-domains property is used by most DT nodes using mediatek,dpi
> bindings. Add this to the bindings to fix the schema check error.
>
> Signed-off-by: Pin-yen Lin <treapking at chromium.org>
> ---
>
>  .../bindings/display/mediatek/mediatek,dpi.yaml           | 8 ++++++++
>  1 file changed, 8 insertions(+)
>
> diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml b/Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml
> index 5ca7679d5427..7e0bb88f5856 100644
> --- a/Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml
> +++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml
> @@ -42,6 +42,12 @@ properties:
>    interrupts:
>      maxItems: 1
>
> +  power-domains:
> +    description:
> +      A phandle and PM domain specifier as defined by bindings
> +      of the power controller specified by phandle. See
> +      Documentation/devicetree/bindings/power/power-domain.yaml for details.

power-domains was already added recently, but mt8183 was not included.
So you'll need to adjust the if/then schema for it.

Rob


From robh at kernel.org  Fri Sep 13 14:58:01 2024
From: robh at kernel.org (Rob Herring)
Date: Fri, 13 Sep 2024 16:58:01 -0500
Subject: [PATCH v3 2/3] dt-bindings: mfd: mediatek: mt6397: Convert to DT
 schema format
In-Reply-To: <172625540069.478205.2893721075637493498.robh@kernel.org>
References: <20240913175926.7443-1-macpaul.lin@mediatek.com>
 <172625540069.478205.2893721075637493498.robh@kernel.org>
Message-ID: <20240913215801.GA870426-robh@kernel.org>

On Fri, Sep 13, 2024 at 02:23:20PM -0500, Rob Herring (Arm) wrote:
> 
> On Sat, 14 Sep 2024 01:59:26 +0800, Macpaul Lin wrote:
> > Convert the mfd: mediatek: mt6397 binding to DT schema format.
> > 
> > MT6323, MT6358, and MT6397 are PMIC devices with multiple function
> > subdevices. They share a common PMIC design but have variations in
> > subdevice combinations.
> > 
> > Key updates in this conversion:
> > 
> > 1. RTC:
> >    - Convert rtc-mt6397.txt and merge into parent MT6397 PMIC DT schema.
> > 
> > 2. Regulators:
> >    - Align to generic name "regulators".
> >    - Update references from .txt to .yaml for mt6323, mt6358, and mt6397
> >      regulators.
> >    - Simplify regulator name labels in device tree examples.
> > 
> > 3. Audio Codec:
> >    - Convert sound/mt6358.txt and merge into parent MT6397 PMIC DT schema.
> >    - Align to generic name "audio-codec" for codec and sound subdevices.
> >    - Add "mediatek,dmic-mode" and "Avdd-supply" properties.
> > 
> > 4. Clocks:
> >    - Align to generic name "clocks" for clockbuffer subdevices.
> > 
> > 5. LEDs:
> >    - Convert leds-mt6323.txt and merge into parent MT6397 PMIC DT schema.
> >    - Update LED binding.
> > 
> > 6. Keys:
> >    - Add detailed descriptions for power and home keys.
> >    - Add compatible: mediatek,mt6358-keys.
> > 
> > 7. Power Controller:
> >    - Convert mt6323-poweroff.txt and merge into parent MT6397 PMIC DT
> >      schema.
> >    - Add #power-domain-cells property to fix dt-binding check error.
> >    - Clarify "BBPU" as "Baseband power up".
> > 
> > 8. Pinctrl:
> >    - Align to generic name "pinctrl" instead of "pin-controller".
> > 
> > Additional updates:
> > - MAINTAINERS: Add co-maintainers and reference to
> >   mfd/mediatek,mt6397.yaml for LED and power-controller drivers.
> > - input/mediatek,pmic-keys.yaml: Update reference to
> >   mfd/mediatek,mt6397.yaml.
> > 
> > Signed-off-by: Sen Chu <sen.chu at mediatek.com>
> > Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
> > ---
> >  .../bindings/input/mediatek,pmic-keys.yaml    |    2 +-
> >  .../devicetree/bindings/leds/leds-mt6323.txt  |   63 -
> >  .../bindings/mfd/mediatek,mt6397.yaml         | 1078 +++++++++++++++++
> >  .../devicetree/bindings/mfd/mt6397.txt        |  110 --
> >  .../bindings/power/reset/mt6323-poweroff.txt  |   20 -
> >  .../devicetree/bindings/rtc/rtc-mt6397.txt    |   31 -
> >  .../devicetree/bindings/sound/mt6358.txt      |   26 -
> >  MAINTAINERS                                   |    8 +-
> >  8 files changed, 1085 insertions(+), 253 deletions(-)
> >  delete mode 100644 Documentation/devicetree/bindings/leds/leds-mt6323.txt
> >  create mode 100644 Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml
> >  delete mode 100644 Documentation/devicetree/bindings/mfd/mt6397.txt
> >  delete mode 100644 Documentation/devicetree/bindings/power/reset/mt6323-poweroff.txt
> >  delete mode 100644 Documentation/devicetree/bindings/rtc/rtc-mt6397.txt
> >  delete mode 100644 Documentation/devicetree/bindings/sound/mt6358.txt
> > 
> > Changes for v1:
> >  - This patch depends on conversion of mediatek,mt6397-regulator.yaml
> >    [1] https://lore.kernel.org/lkml/20240807091738.18387-1-macpaul.lin at mediatek.com/T/
> > 
> > Changes for v2:
> >  - This patch has been made base on linux-next/master git repo.
> >  - Keep the parent and child relationship with mediatek,pwrap in description.
> >    [2] https://lore.kernel.org/all/20240826-slurp-earphone-0d5173923ae8 at spud/
> >  - Keep the $ref for regulators since dt_binding_check didn't report any issue
> >    based on linux-next/master repo.
> >  - Fix description of mt6397/mt6323 devices, use "power management chip"
> >    instead of "multifunction device"
> >  - Drop unnecessary comments or description according to the review.
> >  - Convert sub-modules to DT Schema:
> >   - RTC, LEDs, power-controllers, regulators
> >  - Drop duplicate sub node name and description for sub-modules
> >   - RTC, Keys
> >  - examples:
> >   - drop parent pwrap node
> >   - Add examples from mediatek,mt6323-regulator.yaml
> >   - Add examples from mediatek,mt6358-regulator.yaml
> >   - Add examples from mediatek,mt6397-regulator.yaml
> >   - Complete the examples as could as possible.
> > 
> > Changes for v3:
> >  - Rebased on linux-next/master git repo near next-20240906.
> >  - Revise commit message.
> >  - Regulators:
> >   - Use "additionalProperties: true" and add "contains" for matching
> >     $ref DT bindings.
> >   - Simplify regulator name labels in device tree examples.
> >  - LEDs:
> >   - Use LED bindings.
> >  - Squash following patches in v2 for removing old text format DT bindings
> >    into this patch, includes:
> >   - leds-mt6323.txt, mt6323-poweroff.txt, rtc-mt6397.txt, sound/mt6358.txt.
> >  - Fix file format of DT schemas, add blank between properties.
> >  - Fix 'make checkrefdoc' errors, update reference in mediatek,pmic-keys.yaml.
> > 
> 
> My bot found errors running 'make dt_binding_check' on your patch:
> 
> yamllint warnings/errors:
> 
> dtschema/dtc warnings/errors:
> Warning: Duplicate compatible "mediatek,mt6357" found in schemas matching "$id":
> 	http://devicetree.org/schemas/mfd/mediatek,mt6397.yaml#
> 	http://devicetree.org/schemas/mfd/mediatek,mt6357.yaml#

There's a new warning in dtschema main branch.

> /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/mfd/mediatek,mt6397.example.dtb: pmic: regulators: False schema does not allow {'compatible': ['mediatek,mt6323-regulator'], 'buck_vproc': {'regulator-name': ['vproc'], 'regulator-min-microvolt': [[700000]], 'regulator-max-microvolt': [[1350000]], 'regulator-ramp-delay': 12500, 'regulator-always-on': True, 'regulator-boot-on': True}, 'buck_vsys': {'regulator-name': ['vsys'], 'regulator-min-microvolt': [[1400000]], 'regulator-max-microvolt': [[2987500]], 'regulator-ramp-delay': 25000, 'regulator-always-on': True, 'regulator-boot-on': True}, 'buck_vpa': {'regulator-name': ['vpa'], 'regulator-min-microvolt': [[500000]], 'regulator-max-microvolt': [[3650000]]}, 'ldo_vtcxo': {'regulator-name': ['vtcxo'], 'regulator-min-microvolt': [[2800000]], 'regulator-max-microvolt': [[2800000]], 'regulator-enable-ramp-delay': 90, 'regulator-always-on': True, 'regulator-boot-on': True}, 'ldo_vcn28': {'regulator-name': ['vcn28'], 'regulator-min-microvolt': [[2800000]], 'regulator-max-microvolt': [[2800000]], 'regulator-enable-ramp-delay': 185}, 'ldo_vcn33_bt': {'regulator-name': ['vcn33_bt'], 'regulator-min-microvolt': [[3300000]], 'regulator-max-microvolt': [[3600000]], 'regulator-enable-ramp-delay': 185}, 'ldo_vcn33_wifi': {'regulator-name': ['vcn33_wifi'], 'regulator-min-microvolt': [[3300000]], 'regulator-max-microvolt': [[3600000]], 'regulator-enable-ramp-delay': 185}, 'ldo_va': {'regulator-name': ['va'], 'regulator-min-microvolt': [[2800000]], 'regulator-max-microvolt': [[2800000]], 'regulator-enable-ramp-delay': 216, 'regulator-always-on': True, 'regulator-boot-on': True}, 'ldo_vcama': {'regulator-name': ['vcama'], 'regulator-min-microvolt': [[1500000]], 'regulator-max-microvolt': [[2800000]], 'regulator-enable-ramp-delay': 216}, 'ldo_vio28': {'regulator-name': ['vio28'], 'regulator-min-microvolt': [[2800000]], 'regulator-max-microvolt': [[2800000]], 'regulator-enable-ramp-delay': 216, 'regulator-always-on': True, 'regulator-boot-on': True}, 'ldo_vusb': {'regulator-name': ['vusb'], 'regulator-min-microvolt': [[3300000]], 'regulator-max-microvolt': [[3300000]], 'regulator-enable-ramp-delay': 216, 'regulator-boot-on': True}, 'ldo_vmc': {'regulator-name': ['vmc'], 'regulator-min-microvolt': [[1800000]], 'regulator-max-microvolt': [[3300000]], 'regulator-enable-ramp-delay': 36, 'regulator-boot-on': True}, 'ldo_vmch': {'regulator-name': ['vmch'], 'regulator-min-microvolt': [[3000000]], 'regulator-max-microvolt': [[3300000]], 'regulator-enable-ramp-delay': 36, 'regulator-boot-on': True}, 'ldo_vemc3v3': {'regulator-name': ['vemc3v3'], 'regulator-min-microvolt': [[3000000]], 'regulator-max-microvolt': [[3300000]], 'regulator-enable-ramp-delay': 36, 'regulator-boot-on': True}, 'ldo_vgp1': {'regulator-name': ['vgp1'], 'regulator-min-microvolt': [[1200000]], 'regulator-max-microvolt': [[3300000]], 'regulator-enable-ramp-delay': 216}, 'ldo_vgp2': {'regulator-name': ['vgp2'], 'regulator-min-microvolt': [[1200000]], 'regulator-max-microvolt': [[3000000]], 'regulator-enable-ramp-delay': 216}, 'ldo_vgp3': {'regulator-name': ['vgp3'], 'regulator-min-microvolt': [[1200000]], 'regulator-max-microvolt': [[1800000]], 'regulator-enable-ramp-delay': 216}, 'ldo_vcn18': {'regulator-name': ['vcn18'], 'regulator-min-microvolt': [[1800000]], 'regulator-max-microvolt': [[1800000]], 'regulator-enable-ramp-delay': 216}, 'ldo_vsim1': {'regulator-name': ['vsim1'], 'regulator-min-microvolt': [[1800000]], 'regulator-max-microvolt': [[3000000]], 'regulator-enable-ramp-delay': 216}, 'ldo_vsim2': {'regulator-name': ['vsim2'], 'regulator-min-microvolt': [[1800000]], 'regulator-max-microvolt': [[3000000]], 'regulator-enable-ramp-delay': 216}, 'ldo_vrtc': {'regulator-name': ['vrtc'], 'regulator-min-microvolt': [[2800000]], 'regulator-max-microvolt': [[2800000]], 'regulator-always-on': True, 'regulator-boot-on': True}, 'ldo_vcamaf': {'regulator-name': ['vcamaf'], 'regulator-min-microvolt': [[1200000]], 'regulator-max-microvolt': [[3300000]], 'regulator-enable-ramp-delay': 216}, 'ldo_vibr': {'regulator-name': ['vibr'], 'regulator-min-microvolt': [[1200000]], 'regulator-max-microvolt': [[3300000]], 'regulator-enable-ramp-delay': 36}, 'ldo_vrf18': {'regulator-name': ['vrf18'], 'regulator-min-microvolt': [[1825000]], 'regulator-max-microvolt': [[1825000]], 'regulator-enable-ramp-delay': 187}, 'ldo_vm': {'regulator-name': ['vm'], 'regulator-min-microvolt': [[1200000]], 'regulator-max-microvolt': [[1800000]], 'regulator-enable-ramp-delay': 216, 'regulator-always-on': True, 'regulator-boot-on': True}, 'ldo_vio18': {'regulator-name': ['vio18'], 'regulator-min-microvolt': [[1800000]], 'regulator-max-microvolt': [[1800000]], 'regulator-enable-ramp-delay': 216, 'regulator-always-on': True, 'regulator-boot-on': True}, 'ldo_vcamd': {'regulator-name': ['vcamd'], 'regulator-min-microvolt': [[1200000]], 'regulator-max-microvolt': [[1800000]], 'regulator-enable-ramp-delay': 216}, 'ldo_vcamio': {'regulator-name': ['vcamio'], 'regulator-min-microvolt': [[1800000]], 'regulator-max-microvolt': [[1800000]], 'regulator-enable-ramp-delay': 216}}
> 	from schema $id: http://devicetree.org/schemas/mfd/mediatek,mt6397.yaml#
> /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/mfd/mediatek,mt6397.example.dtb: pmic: regulators: False schema does not allow {'compatible': ['mediatek,mt6397-regulator'], 'buck_vpca15': {'regulator-name': ['vpca15'], 'regulator-min-microvolt': [[850000]], 'regulator-max-microvolt': [[1350000]], 'regulator-ramp-delay': 12500, 'regulator-enable-ramp-delay': 200}, 'buck_vpca7': {'regulator-name': ['vpca7'], 'regulator-min-microvolt': [[850000]], 'regulator-max-microvolt': [[1350000]], 'regulator-ramp-delay': 12500, 'regulator-enable-ramp-delay': 115}, 'buck_vsramca15': {'regulator-name': ['vsramca15'], 'regulator-min-microvolt': [[850000]], 'regulator-max-microvolt': [[1350000]], 'regulator-ramp-delay': 12500, 'regulator-enable-ramp-delay': 115}, 'buck_vsramca7': {'regulator-name': ['vsramca7'], 'regulator-min-microvolt': [[850000]], 'regulator-max-microvolt': [[1350000]], 'regulator-ramp-delay': 12500, 'regulator-enable-ramp-delay': 115}, 'buck_vcore': {'regulator-name': ['vcore'], 'regulator-min-microvolt': [[850000]], 'regulator-max-microvolt': [[1350000]], 'regulator-ramp-delay': 12500, 'regulator-enable-ramp-delay': 115}, 'buck_vgpu': {'regulator-name': ['vgpu'], 'regulator-min-microvolt': [[700000]], 'regulator-max-microvolt': [[1350000]], 'regulator-ramp-delay': 12500, 'regulator-enable-ramp-delay': 115}, 'buck_vdrm': {'regulator-name': ['vdrm'], 'regulator-min-microvolt': [[800000]], 'regulator-max-microvolt': [[1400000]], 'regulator-ramp-delay': 12500, 'regulator-enable-ramp-delay': 500}, 'buck_vio18': {'regulator-name': ['vio18'], 'regulator-min-microvolt': [[1500000]], 'regulator-max-microvolt': [[2120000]], 'regulator-ramp-delay': 12500, 'regulator-enable-ramp-delay': 500}, 'ldo_vtcxo': {'regulator-name': ['vtcxo'], 'regulator-min-microvolt': [[2800000]], 'regulator-max-microvolt': [[2800000]], 'regulator-enable-ramp-delay': 90}, 'ldo_va28': {'regulator-name': ['va28'], 'regulator-enable-ramp-delay': 218}, 'ldo_vcama': {'regulator-name': ['vcama'], 'regulator-min-microvolt': [[1500000]], 'regulator-max-microvolt': [[2800000]], 'regulator-enable-ramp-delay': 218}, 'ldo_vio28': {'regulator-name': ['vio28'], 'regulator-enable-ramp-delay': 240}, 'ldo_vusb': {'regulator-name': ['vusb'], 'regulator-enable-ramp-delay': 218}, 'ldo_vmc': {'regulator-name': ['vmc'], 'regulator-min-microvolt': [[1800000]], 'regulator-max-microvolt': [[3300000]], 'regulator-enable-ramp-delay': 218}, 'ldo_vmch': {'regulator-name': ['vmch'], 'regulator-min-microvolt': [[3000000]], 'regulator-max-microvolt': [[3300000]], 'regulator-enable-ramp-delay': 218}, 'ldo_vemc3v3': {'regulator-name': ['vemc_3v3'], 'regulator-min-microvolt': [[3000000]], 'regulator-max-microvolt': [[3300000]], 'regulator-enable-ramp-delay': 218}, 'ldo_vgp1': {'regulator-name': ['vcamd'], 'regulator-min-microvolt': [[1220000]], 'regulator-max-microvolt': [[3300000]], 'regulator-enable-ramp-delay': 240}, 'ldo_vgp2': {'regulator-name': ['vcamio'], 'regulator-min-microvolt': [[1000000]], 'regulator-max-microvolt': [[3300000]], 'regulator-enable-ramp-delay': 218}, 'ldo_vgp3': {'regulator-name': ['vcamaf'], 'regulator-min-microvolt': [[1200000]], 'regulator-max-microvolt': [[3300000]], 'regulator-enable-ramp-delay': 218}, 'ldo_vgp4': {'regulator-name': ['vgp4'], 'regulator-min-microvolt': [[1200000]], 'regulator-max-microvolt': [[3300000]], 'regulator-enable-ramp-delay': 218}, 'ldo_vgp5': {'regulator-name': ['vgp5'], 'regulator-min-microvolt': [[1200000]], 'regulator-max-microvolt': [[3000000]], 'regulator-enable-ramp-delay': 218}, 'ldo_vgp6': {'regulator-name': ['vgp6'], 'regulator-min-microvolt': [[1200000]], 'regulator-max-microvolt': [[3300000]], 'regulator-enable-ramp-delay': 218}, 'ldo_vibr': {'regulator-name': ['vibr'], 'regulator-min-microvolt': [[1200000]], 'regulator-max-microvolt': [[3300000]], 'regulator-enable-ramp-delay': 218}}
> 	from schema $id: http://devicetree.org/schemas/mfd/mediatek,mt6397.yaml#

This probably fails because the threading of your series seems to be 
messed up.

Rob


From dianders at chromium.org  Fri Sep 13 16:43:04 2024
From: dianders at chromium.org (Doug Anderson)
Date: Fri, 13 Sep 2024 16:43:04 -0700
Subject: [PATCH v7 06/10] i2c: Introduce OF component probe function
In-Reply-To: <20240911072751.365361-7-wenst@chromium.org>
References: <20240911072751.365361-1-wenst@chromium.org> <20240911072751.365361-7-wenst@chromium.org>
Message-ID: <CAD=FV=Udc9aP7bSzTWP82zsaztRD2YnVNpSDA54FC0dKQ-Nz2A@mail.gmail.com>

Hi,

On Wed, Sep 11, 2024 at 12:28?AM Chen-Yu Tsai <wenst at chromium.org> wrote:
>
> Some devices are designed and manufactured with some components having
> multiple drop-in replacement options. These components are often
> connected to the mainboard via ribbon cables, having the same signals
> and pin assignments across all options. These may include the display
> panel and touchscreen on laptops and tablets, and the trackpad on
> laptops. Sometimes which component option is used in a particular device
> can be detected by some firmware provided identifier, other times that
> information is not available, and the kernel has to try to probe each
> device.
>
> This change attempts to make the "probe each device" case cleaner. The
> current approach is to have all options added and enabled in the device
> tree. The kernel would then bind each device and run each driver's probe
> function. This works, but has been broken before due to the introduction
> of asynchronous probing, causing multiple instances requesting "shared"
> resources, such as pinmuxes, GPIO pins, interrupt lines, at the same
> time, with only one instance succeeding. Work arounds for these include
> moving the pinmux to the parent I2C controller, using GPIO hogs or
> pinmux settings to keep the GPIO pins in some fixed configuration, and
> requesting the interrupt line very late. Such configurations can be seen
> on the MT8183 Krane Chromebook tablets, and the Qualcomm sc8280xp-based
> Lenovo Thinkpad 13S.
>
> Instead of this delicate dance between drivers and device tree quirks,
> this change introduces a simple I2C component probe. function For a

s/probe. function/probe function./


> +static int i2c_of_probe_enable_node(struct device *dev, struct device_node *node)
> +{
> +       int ret;
> +
> +       dev_info(dev, "Enabling %pOF\n", node);
> +
> +       struct of_changeset *ocs __free(kfree) = kzalloc(sizeof(*ocs), GFP_KERNEL);
> +       if (!ocs)
> +               return -ENOMEM;

I guess the kernel lets you mix code and declarations now? I'm still
used to all declarations being together but maybe I'm old school... I
would have put the "dev_info" below the allocation...


> +/**
> + * i2c_of_probe_component() - probe for devices of "type" on the same i2c bus
> + * @dev: Pointer to the &struct device of the caller, only used for dev_printk() messages.
> + * @cfg: Pointer to the &struct i2c_of_probe_cfg containing callbacks and other options
> + *       for the prober.
> + * @ctx: Context data for callbacks.
> + *
> + * Probe for possible I2C components of the same "type" (&i2c_of_probe_cfg->type)
> + * on the same I2C bus that have their status marked as "fail".

I may have missed it, but originally this was ones marked
"fail-needs-probe", right? Now it tries all types of fail?


> + * Assumes that across the entire device tree the only instances of nodes
> + * prefixed with "type" are the ones that need handling for second source
> + * components. In other words, if "type" is "touchscreen", then all device
> + * nodes named "touchscreen*" are the ones that need probing. There cannot

"touchscreen*" implies that it can have an arbitrary suffix. Can it?
...or can it just have a unit address?


> + * be another "touchscreen" node that is already enabled.
> + *
> + * Assumes that for each "type" of component, only one actually exists. In
> + * other words, only one matching and existing device will be enabled.
> + *
> + * Context: Process context only. Does non-atomic I2C transfers.
> + *          Should only be used from a driver probe function, as the function
> + *          can return -EPROBE_DEFER if the I2C adapter or other resources
> + *          are unavailable.
> + * Return: 0 on success or no-op, error code otherwise.
> + *         A no-op can happen when it seems like the device tree already
> + *         has components of the type to be probed already enabled. This
> + *         can happen when the device tree had not been updated to mark
> + *         the status of the to-be-probed components as "fail". Or this
> + *         function was already run with the same parameters and succeeded
> + *         in enabling a component. The latter could happen if the user

s/latter/later

> + *         had multiple types of components to probe, and one of them down
> + *         the list caused a deferred probe. This is expected behavior.
> + */
> +int i2c_of_probe_component(struct device *dev, const struct i2c_of_probe_cfg *cfg, void *ctx)
> +{
> +       const struct i2c_of_probe_ops *ops;
> +       const char *type;
> +       struct device_node *i2c_node;
> +       struct i2c_adapter *i2c;
> +       int ret;
> +
> +       if (!cfg)
> +               return -EINVAL;

Drop extra check of "!cfg". In general kernel conventions don't check
for NULL pointers passed by caller unless it's an expected case. You
don't check for a NULL "dev" and you shouldn't need to check for a
NULL "cfg". They are both simply required parameters.

There are a few other places in the patch series where it feels like
there are extra arg checks that aren't really needed...


> +       ops = cfg->ops ?: &i2c_of_probe_dummy_ops;
> +       type = cfg->type;
> +
> +       i2c_node = i2c_of_probe_get_i2c_node(dev, type);
> +       if (IS_ERR(i2c_node))
> +               return PTR_ERR(i2c_node);
> +
> +       for_each_child_of_node_with_prefix(i2c_node, node, type) {

I wouldn't object to a comment before this for loop:

/* If any devices of this type are already enabled then the function
is a noop */

...or it could be a helper function.


> +               if (!of_device_is_available(node))
> +                       continue;
> +
> +               /*
> +                * Device tree has component already enabled. Either the
> +                * device tree isn't supported or we already probed once.
> +                */
> +               ret = 0;
> +               goto out_put_i2c_node;
> +       }
> +
> +       i2c = of_get_i2c_adapter_by_node(i2c_node);
> +       if (!i2c) {
> +               ret = dev_err_probe(dev, -EPROBE_DEFER, "Couldn't get I2C adapter\n");
> +               goto out_put_i2c_node;
> +       }
> +
> +       /* Grab resources */
> +       ret = 0;
> +       if (ops->get_resources)
> +               ret = ops->get_resources(dev, i2c_node, ctx);
> +       if (ret)
> +               goto out_put_i2c_adapter;
> +
> +       /* Enable resources */
> +       if (ops->enable)
> +               ret = ops->enable(dev, ctx);
> +       if (ret)
> +               goto out_release_resources;

I won't insist, but a part of me wonders whether we should just
combine "get_resources" and "enable" and then combine "cleanup" and
"free_resources_late". They are always paired one after another and
I'm having a hard time seeing why they need to be separate. It's not
like you'll ever get the resources and then enable/disable multiple
times.


> +/**
> + * struct i2c_of_probe_ops - I2C OF component prober callbacks
> + *
> + * A set of callbacks to be used by i2c_of_probe_component().
> + *
> + * All callbacks are optional. Callbacks are called only once per run, and are
> + * used in the order they are defined in this structure.
> + *
> + * All callbacks that have return values shall return %0 on success,
> + * or a negative error number on failure.
> + *
> + * The @dev parameter passed to the callbacks is the same as @dev passed to
> + * i2c_of_probe_component(). It should only be used for dev_printk() calls
> + * and nothing else, especially not managed device resource (devres) APIs.
> + */
> +struct i2c_of_probe_ops {
> +       /** @get_resources: Retrieve resources for components. */
> +       int (*get_resources)(struct device *dev, struct device_node *bus_node, void *data);
> +
> +       /** @free_resources_early: Release exclusive resources prior to enabling component. */
> +       void (*free_resources_early)(void *data);

It would be good if the doc here mentioned what happened if no
components were found and thus nothing was enabled. Is the function
still called? It looks like "no" and "cleanup" is in charge of
cleaning in this case. Feels like the docs need to be more explicit.


From dianders at chromium.org  Fri Sep 13 16:43:10 2024
From: dianders at chromium.org (Doug Anderson)
Date: Fri, 13 Sep 2024 16:43:10 -0700
Subject: [PATCH v7 07/10] i2c: of-prober: Add simple helpers for regulator support
In-Reply-To: <20240911072751.365361-8-wenst@chromium.org>
References: <20240911072751.365361-1-wenst@chromium.org> <20240911072751.365361-8-wenst@chromium.org>
Message-ID: <CAD=FV=VL3nA8hwC8Ejy9T0ZWdYKxMjts8fgF7Y3CO507njOKkg@mail.gmail.com>

Hi,

On Wed, Sep 11, 2024 at 12:28?AM Chen-Yu Tsai <wenst at chromium.org> wrote:
>
> +static int i2c_of_probe_simple_enable_regulator(struct device *dev, struct i2c_of_probe_simple_ctx *ctx)
> +{
> +       int ret;
> +
> +       if (!ctx->supply)
> +               return 0;
> +
> +       dev_dbg(dev, "Enabling regulator supply \"%s\"\n", ctx->opts->supply_name);
> +
> +       ret = regulator_enable(ctx->supply);
> +       if (ret)
> +               return ret;
> +
> +       msleep(ctx->opts->post_power_on_delay_ms);

Presumably you want an "if (ctx->opts->post_power_on_delay_ms)" before
the call to msleep() since it doesn't check that for you.


> +/**
> + * i2c_of_probe_simple_enable - Enable resources for I2C OF prober simple helpers
> + * @dev: Pointer to the &struct device of the caller, only used for dev_printk() messages
> + * @data: Pointer to &struct i2c_of_probe_simple_ctx helper context.
> + *
> + * If a regulator supply was found, enable that regulator.
> + *
> + * Return: %0 on success or no-op, or a negative error number on failure.
> + */
> +int i2c_of_probe_simple_enable(struct device *dev, void *data)
> +{
> +       struct i2c_of_probe_simple_ctx *ctx = data;
> +       int ret;
> +
> +       ret = i2c_of_probe_simple_enable_regulator(dev, ctx);
> +       if (ret)
> +               return ret;
> +
> +       return 0;

Instead of the above, just:

return i2c_of_probe_simple_enable_regulator(dev, ctx);

I guess maybe you'd have to undo it in the next patch, but it does
make this patch stand by itself better..

Although I'd also say that if it were me I might just get rid of the
helpers and inline the stuff. The helpers don't _really_ add too much.
3 of the 4 callers are just simple wrappers of the helper and I don't
think it would be terrible to inline the last one. I guess with the
next patch when you add GPIOs it maybe makes more sense, but even then
it feels like a stretch to me. Anyway, feel free to ignore if you
want.

> +/**
> + * DOC: I2C OF component prober simple helpers
> + *
> + * Components such as trackpads are commonly connected to a devices baseboard
> + * with a 6-pin ribbon cable. That gives at most one voltage supply and one
> + * GPIO besides the I2C bus, interrupt pin, and common ground. Touchscreens,

Maybe speculate here that the GPIO is often an enable or reset line?
Otherwise you leave the reader wondering what this mysterious GPIO is
for.


From dianders at chromium.org  Fri Sep 13 16:43:20 2024
From: dianders at chromium.org (Doug Anderson)
Date: Fri, 13 Sep 2024 16:43:20 -0700
Subject: [PATCH v7 09/10] platform/chrome: Introduce device tree hardware prober
In-Reply-To: <20240911072751.365361-10-wenst@chromium.org>
References: <20240911072751.365361-1-wenst@chromium.org> <20240911072751.365361-10-wenst@chromium.org>
Message-ID: <CAD=FV=WtVSQ5GX6H5CtxNPTdOAJVMj_xNRvG9siZB6_ePZr7CQ@mail.gmail.com>

Hi,

On Wed, Sep 11, 2024 at 12:29?AM Chen-Yu Tsai <wenst at chromium.org> wrote:
>
> @@ -8,6 +8,7 @@ obj-$(CONFIG_CHROMEOS_ACPI)             += chromeos_acpi.o
>  obj-$(CONFIG_CHROMEOS_LAPTOP)          += chromeos_laptop.o
>  obj-$(CONFIG_CHROMEOS_PRIVACY_SCREEN)  += chromeos_privacy_screen.o
>  obj-$(CONFIG_CHROMEOS_PSTORE)          += chromeos_pstore.o
> +obj-$(CONFIG_CHROMEOS_OF_HW_PROBER)    += chromeos_of_hw_prober.o

"o" sorts before "p" so "of" should sort before "privacy"?

I guess it's not exactly all sorted, but this small section is. Since
it's arbitrary you could preserve the existing sorting. :-P


> +static const struct hw_prober_entry hw_prober_platforms[] = {
> +       { .compatible = "google,hana", .prober = chromeos_i2c_component_prober, .data = &chromeos_i2c_probe_dumb_touchscreen },
> +       { .compatible = "google,hana", .prober = chromeos_i2c_component_prober, .data = &chromeos_i2c_probe_dumb_trackpad },

The fact that the example is only using "dumb" probers doesn't make it
quite as a compelling proof that the code will scale up. Any chance
you could add something that requires a bit more oomph? ;-)


> +static int chromeos_of_hw_prober_driver_init(void)
> +{
> +       size_t i;
> +       int ret;
> +
> +       for (i = 0; i < ARRAY_SIZE(hw_prober_platforms); i++)
> +               if (of_machine_is_compatible(hw_prober_platforms[i].compatible))
> +                       break;
> +       if (i == ARRAY_SIZE(hw_prober_platforms))
> +               return -ENODEV;
> +
> +       ret = platform_driver_register(&chromeos_of_hw_prober_driver);
> +       if (ret)
> +               return ret;
> +
> +       chromeos_of_hw_prober_pdev =
> +                       platform_device_register_simple(DRV_NAME, PLATFORM_DEVID_NONE, NULL, 0);
> +       if (IS_ERR(chromeos_of_hw_prober_pdev))
> +               goto err;

FWIW if you didn't want to see your prober called over and over again
if one of the devices deferred you could just register one device per
type, right? Then each device would be able to defer separately. Dunno
if it's worth it but figured I'd mention it...


Also: as a high level comment, this all looks much nicer to me now
that it's parameterized. :-)


From dianders at chromium.org  Fri Sep 13 16:43:15 2024
From: dianders at chromium.org (Doug Anderson)
Date: Fri, 13 Sep 2024 16:43:15 -0700
Subject: [PATCH v7 08/10] i2c: of-prober: Add GPIO support to simple helpers
In-Reply-To: <20240911072751.365361-9-wenst@chromium.org>
References: <20240911072751.365361-1-wenst@chromium.org> <20240911072751.365361-9-wenst@chromium.org>
Message-ID: <CAD=FV=XvPA0UC87fQ+RvFzPv9qRSEP6eQhT79JOx9Arj87i9Mg@mail.gmail.com>

Hi,

On Wed, Sep 11, 2024 at 12:29?AM Chen-Yu Tsai <wenst at chromium.org> wrote:
>
> +static int i2c_of_probe_simple_set_gpio(struct device *dev, struct i2c_of_probe_simple_ctx *ctx)
> +{
> +       int ret;
> +
> +       if (!ctx->gpiod)
> +               return 0;
> +
> +       dev_dbg(dev, "Setting GPIO\n");
> +
> +       ret = gpiod_direction_output_raw(ctx->gpiod, ctx->opts->gpio_high_to_enable ? 1 : 0);
> +       if (ret)
> +               return ret;
> +
> +       msleep(ctx->opts->post_reset_deassert_delay_ms);

Like in the previous patch, you need an "if
(ctx->opts->post_reset_deassert_delay_ms)" before the msleep().


> +static void i2c_of_probe_simple_disable_gpio(struct device *dev, struct i2c_of_probe_simple_ctx *ctx)
> +{
> +       if (!ctx->gpiod)
> +               return;
> +
> +       dev_dbg(dev, "Setting GPIO to input\n");
> +
> +       gpiod_direction_input(ctx->gpiod);

This is weird. Why set it to input?


> @@ -347,6 +438,7 @@ int i2c_of_probe_simple_cleanup(struct device *dev, void *data)
>  {
>         struct i2c_of_probe_simple_ctx *ctx = data;
>
> +       i2c_of_probe_simple_disable_gpio(dev, ctx);

Maybe add a comment before the GPIO call that it's a noop if we found
something and i2c_of_probe_simple_free_res_early() was already called?
Otherwise you need to read into the function to understand why this
doesn't crash if the early call was made. To me, that makes the
abstraction add confusion instead of simplifying things.


> @@ -92,24 +93,33 @@ int i2c_of_probe_component(struct device *dev, const struct i2c_of_probe_cfg *cf
>   * struct i2c_of_probe_simple_opts - Options for simple I2C component prober callbacks
>   * @res_node_compatible: Compatible string of device node to retrieve resources from.
>   * @supply_name: Name of regulator supply.
> + * @gpio_name: Name of GPIO.

Talk about the fact that gpio_name can be NULL or an empty string and
that they mean different things.


>   * @post_power_on_delay_ms: Delay in ms after regulators are powered on. Passed to msleep().
> + * @post_reset_deassert_delay_ms: Delay in ms after GPIOs are set. Passed to msleep().
> + * @gpio_high_to_enable: %true if GPIO should be set to electrical high to enable component.

Now that you've added the GPIOs and more delays, the description of
this structure needs to list exactly what the power sequence your
simple functions assume.

I would also say: given that you're providing a parameter anyway and
you're giving the GPIO name, can you please move away from the "raw"
values and move to "logical" values?


From greg at kroah.com  Fri Sep 13 22:56:52 2024
From: greg at kroah.com (Greg KH)
Date: Sat, 14 Sep 2024 07:56:52 +0200
Subject: [PATCH 1/2] net: dsa: RCU-protect dsa_ptr in struct net_device
In-Reply-To: <28d0a7a5-ead6-4ce0-801c-096038823259@lunn.ch>
References: <20240910130321.337154-1-alexander.sverdlin@siemens.com>
 <20240910130321.337154-2-alexander.sverdlin@siemens.com>
 <20240913190326.xv5qkxt7b3sjuroz@skbuf>
 <28d0a7a5-ead6-4ce0-801c-096038823259@lunn.ch>
Message-ID: <2024091436-gas-phonebook-0018@gregkh>

On Fri, Sep 13, 2024 at 09:27:23PM +0200, Andrew Lunn wrote:
> > >  drivers/net/dsa/mt7530.c                    |   3 +-
> > >  drivers/net/dsa/ocelot/felix.c              |   3 +-
> > >  drivers/net/dsa/qca/qca8k-8xxx.c            |   3 +-
> > >  drivers/net/ethernet/broadcom/bcmsysport.c  |   8 +-
> > >  drivers/net/ethernet/mediatek/airoha_eth.c  |   2 +-
> > >  drivers/net/ethernet/mediatek/mtk_eth_soc.c |  22 +++--
> > >  drivers/net/ethernet/mediatek/mtk_ppe.c     |  15 ++-
> > >  include/linux/netdevice.h                   |   2 +-
> > >  include/net/dsa.h                           |  36 +++++--
> > >  include/net/dsa_stubs.h                     |   6 +-
> > >  net/bridge/br_input.c                       |   2 +-
> > >  net/core/dev.c                              |   3 +-
> > >  net/core/flow_dissector.c                   |  19 ++--
> > >  net/dsa/conduit.c                           |  66 ++++++++-----
> > >  net/dsa/dsa.c                               |  19 ++--
> > >  net/dsa/port.c                              |   3 +-
> > >  net/dsa/tag.c                               |   3 +-
> > >  net/dsa/tag.h                               |  19 ++--
> > >  net/dsa/tag_8021q.c                         |  10 +-
> > >  net/dsa/tag_brcm.c                          |   2 +-
> > >  net/dsa/tag_dsa.c                           |   8 +-
> > >  net/dsa/tag_qca.c                           |  10 +-
> > >  net/dsa/tag_sja1105.c                       |  22 +++--
> > >  net/dsa/user.c                              | 104 +++++++++++---------
> > >  net/ethernet/eth.c                          |   2 +-
> > >  25 files changed, 240 insertions(+), 152 deletions(-)
> > 
> > Thank you for the patch, and I would like you to not give up on it, even
> > if we will go for a different bug fix for 'stable'.
> > 
> > It's just that it makes me a bit uneasy to have this as the bug fix.
> 
> +1
> 
> We should try for a minimal fix for stable, and keep this for
> net-next, given its size.
> 
> https://www.kernel.org/doc/html/latest/process/stable-kernel-rules.html
> 
> * It must be obviously correct and tested.
> * It cannot be bigger than 100 lines, with context.

It's fine if it fixes something properly, to go over those limits.


From cengjianeng at huaqin.corp-partner.google.com  Fri Sep 13 23:31:20 2024
From: cengjianeng at huaqin.corp-partner.google.com (Jianeng Ceng)
Date: Sat, 14 Sep 2024 14:31:20 +0800
Subject: [PATCH v8 0/2] arm64: dts: mediatek: Add MT8186 Ponyta
Message-ID: <20240914063122.1622196-1-cengjianeng@huaqin.corp-partner.google.com>

This is v8 of the MT8186 Chromebook device tree series.
---
Changes in v8:
- PATCH 1/2: Remove custom label.
- PATCH 2/2: Change the commit about ponyta.
- Link to v7:https://lore.kernel.org/all/20240913031505.372868-1-cengjianeng at huaqin.corp-partner.google.com/

Changes in v7:
- PATCH 2/2: Remove prototype sku.
- PATCH 2/2: Disable the other trackpad to enable one of them.
- Link to v5:https://lore.kernel.org/all/20240913015503.4192806-1-cengjianeng at huaqin.corp-partner.google.com/

Changes in v6:
- No change.

Changes in v5:
- PATCH 1/2: Remove sku2147483647.
- PATCH 2/2: Remove sku2147483647.
- Link to v4:https://lore.kernel.org/all/20240906085739.1322676-1-cengjianeng at huaqin.corp-partner.google.com/

Changes in v4:
- PATCH 1/2: Add more info for Ponyta custom label in commit.
- Link to v3:https://lore.kernel.org/all/20240904081501.2060933-1-cengjianeng at huaqin.corp-partner.google.com/

Changes in v3:
- PATCH 0/2: Add the modify records.
- PATCH 1/2: Modify lable to label.
- Link to v2:https://lore.kernel.org/all/20240903061603.3007289-1-cengjianeng at huaqin.corp-partner.google.com/

Changes in v2:
- PATCH 2/2: Modify the dtb name without rev2.
- Link to v1:https://lore.kernel.org/all/20240902125502.1844374-1-cengjianeng at huaqin.corp-partner.google.com/

Jianeng Ceng (2):
  dt-bindings: arm: mediatek: Add MT8186 Ponyta Chromebook
  arm64: dts: mediatek: Add MT8186 Ponyta Chromebooks

 .../devicetree/bindings/arm/mediatek.yaml     | 10 +++++
 arch/arm64/boot/dts/mediatek/Makefile         |  2 +
 .../mediatek/mt8186-corsola-ponyta-sku0.dts   | 18 ++++++++
 .../mediatek/mt8186-corsola-ponyta-sku1.dts   | 22 ++++++++++
 .../dts/mediatek/mt8186-corsola-ponyta.dtsi   | 44 +++++++++++++++++++
 5 files changed, 96 insertions(+)
 create mode 100644 arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku0.dts
 create mode 100644 arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku1.dts
 create mode 100644 arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta.dtsi

-- 
2.34.1



From cengjianeng at huaqin.corp-partner.google.com  Fri Sep 13 23:31:21 2024
From: cengjianeng at huaqin.corp-partner.google.com (Jianeng Ceng)
Date: Sat, 14 Sep 2024 14:31:21 +0800
Subject: [PATCH v8 1/2] dt-bindings: arm: mediatek: Add MT8186 Ponyta Chromebook
In-Reply-To: <20240914063122.1622196-1-cengjianeng@huaqin.corp-partner.google.com>
References: <20240914063122.1622196-1-cengjianeng@huaqin.corp-partner.google.com>
Message-ID: <20240914063122.1622196-2-cengjianeng@huaqin.corp-partner.google.com>

Ponyta is a custom label Chromebook based on MT8186. It is a
self-developed project of Huaqin and has no fixed OEM.

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
Acked-by: Krzysztof Kozlowski <krzysztof.kozlowski at linaro.org>
Signed-off-by: Jianeng Ceng <cengjianeng at huaqin.corp-partner.google.com>
---
Changes in v8:
- PATCH 1/2: Remove custom label.
- Link to v7:https://lore.kernel.org/all/01020191ea98a643-2d0be5d1-e00b-48e0-b823-bfe2c65b0d00-000000 at eu-west-1.amazonses.com/

Chage since V6:
- No change.

Changes in v5:
- PATCH 1/2: Remove sku2147483647.
- Link to v4:https://lore.kernel.org/all/20240906085739.1322676-2-cengjianeng at huaqin.corp-partner.google.com/

Changes in v4:
- PATCH 1/2: Add more info for Ponyta custom label in commit.
- Link to v3:https://lore.kernel.org/all/20240904081501.2060933-1-cengjianeng at huaqin.corp-partner.google.com/

Changes in v3:
- PATCH 1/2: Modify lable to label.
- Link to v2:https://lore.kernel.org/all/20240903061603.3007289-1-cengjianeng at huaqin.corp-partner.google.com/

Chage since V2:
- No change.

---
 Documentation/devicetree/bindings/arm/mediatek.yaml | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/Documentation/devicetree/bindings/arm/mediatek.yaml b/Documentation/devicetree/bindings/arm/mediatek.yaml
index 1d4bb50fcd8d..88f50989ba3f 100644
--- a/Documentation/devicetree/bindings/arm/mediatek.yaml
+++ b/Documentation/devicetree/bindings/arm/mediatek.yaml
@@ -257,6 +257,16 @@ properties:
           - const: google,steelix-sku393218
           - const: google,steelix
           - const: mediatek,mt8186
+      - description: Google Ponyta
+        items:
+          - const: google,ponyta-sku0
+          - const: google,ponyta
+          - const: mediatek,mt8186
+      - description: Google Ponyta
+        items:
+          - const: google,ponyta-sku1
+          - const: google,ponyta
+          - const: mediatek,mt8186
       - description: Google Rusty (Lenovo 100e Chromebook Gen 4)
         items:
           - const: google,steelix-sku196609
-- 
2.34.1



From cengjianeng at huaqin.corp-partner.google.com  Fri Sep 13 23:31:22 2024
From: cengjianeng at huaqin.corp-partner.google.com (Jianeng Ceng)
Date: Sat, 14 Sep 2024 14:31:22 +0800
Subject: [PATCH v8 2/2] arm64: dts: mediatek: Add MT8186 Ponyta Chromebooks
In-Reply-To: <20240914063122.1622196-1-cengjianeng@huaqin.corp-partner.google.com>
References: <20240914063122.1622196-1-cengjianeng@huaqin.corp-partner.google.com>
Message-ID: <20240914063122.1622196-3-cengjianeng@huaqin.corp-partner.google.com>

MT8186 Ponyta is a Huaqin board based on the Corsola board design
with the addition of LTE connectivity through usb integrated module.
SKU0 with LTE. SKU1 without LTE.

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
Signed-off-by: Jianeng Ceng <cengjianeng at huaqin.corp-partner.google.com>
---
Changes in v8:
- PATCH 2/2: Change the commit about ponyta.
- Link to v7:https://lore.kernel.org/all/20240913031505.372868-3-cengjianeng at huaqin.corp-partner.google.com/

Changes in v7:
- PATCH 2/2: Remove prototype sku.
- PATCH 2/2: Disable the other trackpad to enable one of them.
- Link to v5:https://lore.kernel.org/all/20240909023148.1677936-3-cengjianeng at huaqin.corp-partner.google.com/

Changes in v6:
- No change.

Changes in v5:
- PATCH 2/2: Remove sku2147483647.
- Link to v4:https://lore.kernel.org/all/20240906085739.1322676-3-cengjianeng at huaqin.corp-partner.google.com/

Chage since v3:
- No change.

Changes in v2:
- PATCH 2/2: Modify the dtb name without rev2.
- Link to v1:https://lore.kernel.org/all/20240902125502.1844374-1-cengjianeng at huaqin.corp-partner.google.com/

---
 arch/arm64/boot/dts/mediatek/Makefile         |  2 +
 .../mediatek/mt8186-corsola-ponyta-sku0.dts   | 18 ++++++++
 .../mediatek/mt8186-corsola-ponyta-sku1.dts   | 22 ++++++++++
 .../dts/mediatek/mt8186-corsola-ponyta.dtsi   | 44 +++++++++++++++++++
 4 files changed, 86 insertions(+)
 create mode 100644 arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku0.dts
 create mode 100644 arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku1.dts
 create mode 100644 arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta.dtsi

diff --git a/arch/arm64/boot/dts/mediatek/Makefile b/arch/arm64/boot/dts/mediatek/Makefile
index 8fd7b2bb7a15..50b5cf04d3ae 100644
--- a/arch/arm64/boot/dts/mediatek/Makefile
+++ b/arch/arm64/boot/dts/mediatek/Makefile
@@ -58,6 +58,8 @@ dtb-$(CONFIG_ARCH_MEDIATEK) += mt8183-pumpkin.dtb
 dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-magneton-sku393216.dtb
 dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-magneton-sku393217.dtb
 dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-magneton-sku393218.dtb
+dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-ponyta-sku0.dtb
+dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-ponyta-sku1.dtb
 dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-rusty-sku196608.dtb
 dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-steelix-sku131072.dtb
 dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-steelix-sku131073.dtb
diff --git a/arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku0.dts b/arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku0.dts
new file mode 100644
index 000000000000..986498af4c70
--- /dev/null
+++ b/arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku0.dts
@@ -0,0 +1,18 @@
+// SPDX-License-Identifier: (GPL-2.0 OR MIT)
+/*
+ * Copyright 2023 Google LLC
+ */
+
+/dts-v1/;
+#include "mt8186-corsola-ponyta.dtsi"
+
+/ {
+	model = "Google Ponyta sku0 board";
+	compatible = "google,ponyta-sku0", "google,ponyta", "mediatek,mt8186";
+};
+
+&i2c2 {
+	trackpad at 15 {
+		status = "disabled";
+	};
+};
diff --git a/arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku1.dts b/arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku1.dts
new file mode 100644
index 000000000000..ff5eea0ddeb4
--- /dev/null
+++ b/arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku1.dts
@@ -0,0 +1,22 @@
+// SPDX-License-Identifier: (GPL-2.0 OR MIT)
+/*
+ * Copyright 2023 Google LLC
+ */
+
+/dts-v1/;
+#include "mt8186-corsola-ponyta.dtsi"
+
+/ {
+	model = "Google Ponyta sku1 board";
+	compatible = "google,ponyta-sku1", "google,ponyta", "mediatek,mt8186";
+};
+
+&i2c2 {
+	trackpad at 2c {
+		status = "disabled";
+	};
+};
+
+&usb_c1 {
+	status = "disabled";
+};
diff --git a/arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta.dtsi b/arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta.dtsi
new file mode 100644
index 000000000000..59594022331e
--- /dev/null
+++ b/arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta.dtsi
@@ -0,0 +1,44 @@
+// SPDX-License-Identifier: (GPL-2.0 OR MIT)
+/*
+ * Copyright 2023 Google LLC
+ */
+
+/dts-v1/;
+#include "mt8186-corsola-steelix.dtsi"
+
+&keyboard_controller {
+	function-row-physmap = <
+		MATRIX_KEY(0x00, 0x02, 0)	/* T1 */
+		MATRIX_KEY(0x03, 0x02, 0)	/* T2 */
+		MATRIX_KEY(0x02, 0x02, 0)	/* T3 */
+		MATRIX_KEY(0x01, 0x02, 0)	/* T4 */
+		MATRIX_KEY(0x03, 0x04, 0)	/* T5 */
+		MATRIX_KEY(0x02, 0x04, 0)	/* T6 */
+		MATRIX_KEY(0x01, 0x04, 0)	/* T7 */
+		MATRIX_KEY(0x00, 0x04, 0)	/* T8 */
+		MATRIX_KEY(0x00, 0x01, 0)	/* T9 */
+		MATRIX_KEY(0x02, 0x09, 0)	/* T10 */
+		MATRIX_KEY(0x01, 0x09, 0)	/* T11 */
+		MATRIX_KEY(0x01, 0x05, 0)	/* T12 */
+	>;
+
+	linux,keymap = <
+		CROS_STD_MAIN_KEYMAP
+		MATRIX_KEY(0x00, 0x02, KEY_BACK)
+		MATRIX_KEY(0x03, 0x02, KEY_REFRESH)
+		MATRIX_KEY(0x02, 0x02, KEY_ZOOM)
+		MATRIX_KEY(0x01, 0x02, KEY_SCALE)
+		MATRIX_KEY(0x03, 0x04, KEY_SYSRQ)
+		MATRIX_KEY(0x02, 0x04, KEY_BRIGHTNESSDOWN)
+		MATRIX_KEY(0x01, 0x04, KEY_BRIGHTNESSUP)
+		MATRIX_KEY(0x00, 0x04, KEY_PLAYPAUSE)
+		MATRIX_KEY(0x00, 0x01, KEY_MICMUTE)
+		MATRIX_KEY(0x02, 0x09, KEY_MUTE)
+		MATRIX_KEY(0x01, 0x09, KEY_VOLUMEDOWN)
+		MATRIX_KEY(0x01, 0x05, KEY_VOLUMEUP)
+	>;
+};
+
+&mt6366codec {
+	mediatek,dmic-mode = <1>; /* one-wire */
+};
-- 
2.34.1



From macpaul.lin at mediatek.com  Sat Sep 14 00:06:08 2024
From: macpaul.lin at mediatek.com (Macpaul Lin)
Date: Sat, 14 Sep 2024 15:06:08 +0800
Subject: [PATCH v3 2/3] dt-bindings: mfd: mediatek: mt6397: Convert to DT
 schema format
In-Reply-To: <172625540069.478205.2893721075637493498.robh@kernel.org>
References: <20240913175926.7443-1-macpaul.lin@mediatek.com>
 <172625540069.478205.2893721075637493498.robh@kernel.org>
Message-ID: <099c4f3e-0772-3d30-79f7-8b996142cd7c@mediatek.com>



On 9/14/24 03:23, Rob Herring (Arm) wrote:
> 	
> 
> External email : Please do not click links or open attachments until you 
> have verified the sender or the content.
> 
> On Sat, 14 Sep 2024 01:59:26 +0800, Macpaul Lin wrote:
>> Convert the mfd: mediatek: mt6397 binding to DT schema format.
>> 

[snip]

>> 
> 
> My bot found errors running 'make dt_binding_check' on your patch:
> 
> yamllint warnings/errors:
> 
> dtschema/dtc warnings/errors:
> Warning: Duplicate compatible "mediatek,mt6357" found in schemas matching "$id":

I'm using dtschema 2024.09 and the dt_bindings_check didn't report this 
issue even the full check has been run.
However, the compatible "mediatek,mt6357" indeed existed in the old 
bindings. Since it is a independent DT schema now, I'll remove this line
and update v4 version to see if it will help.

Is there new version of dtschema used by bot? I guess the base shouldn't 
affect this duplicate detection whether using rc-1 or next-20240906.

[snip]

> 
> doc reference errors (make refcheckdocs):
> 
> See https://patchwork.ozlabs.org/project/devicetree-bindings/patch/20240913175926.7443-1-macpaul.lin at mediatek.com
> 
> The base for the series is generally the latest rc1. A different dependency
> should be noted in *this* patch
The base of this patch set is based on next-20240906 with linux-next/master.

> If you already ran 'make dt_binding_check' and didn't see the above
> error(s), then make sure 'yamllint' is installed and dt-schema is up to
> date:
> 
> pip3 install dtschema --upgrade
> 
> Please check and re-submit after running the above command yourself. Note
> that DT_SCHEMA_FILES can be set to your schema file to speed up checking
> your schema. However, it must be unset to test all examples with your schema.
> 

Thanks
Macpaul Lin


From macpaul.lin at mediatek.com  Sat Sep 14 00:25:46 2024
From: macpaul.lin at mediatek.com (Macpaul Lin)
Date: Sat, 14 Sep 2024 15:25:46 +0800
Subject: [PATCH v3 2/3] dt-bindings: mfd: mediatek: mt6397: Convert to DT
 schema format
In-Reply-To: <099c4f3e-0772-3d30-79f7-8b996142cd7c@mediatek.com>
References: <20240913175926.7443-1-macpaul.lin@mediatek.com>
 <172625540069.478205.2893721075637493498.robh@kernel.org>
 <099c4f3e-0772-3d30-79f7-8b996142cd7c@mediatek.com>
Message-ID: <4a396c65-2353-da09-4dd2-71b822237920@mediatek.com>

On 9/14/24 15:06, Macpaul Lin wrote:
> 
> 
> On 9/14/24 03:23, Rob Herring (Arm) wrote:
>>
>>
>> External email : Please do not click links or open attachments until 
>> you have verified the sender or the content.
>>
>> On Sat, 14 Sep 2024 01:59:26 +0800, Macpaul Lin wrote:
>>> Convert the mfd: mediatek: mt6397 binding to DT schema format.
>>>
> 
> [snip]
> 
>>>
>>
>> My bot found errors running 'make dt_binding_check' on your patch:
>>
>> yamllint warnings/errors:
>>
>> dtschema/dtc warnings/errors:
>> Warning: Duplicate compatible "mediatek,mt6357" found in schemas 
>> matching "$id":
> 
> I'm using dtschema 2024.09 and the dt_bindings_check didn't report this 
> issue even the full check has been run.

Hopefully I've found a way to update latest dtschema without bothering 
IT. ;)

pip3 install -U git+https://github.com/devicetree-org/dt-schema.git at main

I'll run latest dt_bindings_check for v4 version.

Thanks.
Macpaul Lin


From macpaul.lin at mediatek.com  Sat Sep 14 02:45:34 2024
From: macpaul.lin at mediatek.com (Macpaul Lin)
Date: Sat, 14 Sep 2024 17:45:34 +0800
Subject: [PATCH v3 2/3] dt-bindings: mfd: mediatek: mt6397: Convert to DT
 schema format
In-Reply-To: <4a396c65-2353-da09-4dd2-71b822237920@mediatek.com>
References: <20240913175926.7443-1-macpaul.lin@mediatek.com>
 <172625540069.478205.2893721075637493498.robh@kernel.org>
 <099c4f3e-0772-3d30-79f7-8b996142cd7c@mediatek.com>
 <4a396c65-2353-da09-4dd2-71b822237920@mediatek.com>
Message-ID: <9a120bc4-f671-dd35-a1f9-b9ae7031bdd1@mediatek.com>


On 9/14/24 15:25, Macpaul Lin wrote:
> On 9/14/24 15:06, Macpaul Lin wrote:
>>
>>
>> On 9/14/24 03:23, Rob Herring (Arm) wrote:
>>>
>>>
>>> External email : Please do not click links or open attachments until 
>>> you have verified the sender or the content.
>>>
>>> On Sat, 14 Sep 2024 01:59:26 +0800, Macpaul Lin wrote:
>>>> Convert the mfd: mediatek: mt6397 binding to DT schema format.
>>>>
>>
>> [snip]
>>
>>>>
>>>
>>> My bot found errors running 'make dt_binding_check' on your patch:
>>>
>>> yamllint warnings/errors:
>>>
>>> dtschema/dtc warnings/errors:
>>> Warning: Duplicate compatible "mediatek,mt6357" found in schemas 
>>> matching "$id":
>>
>> I'm using dtschema 2024.09 and the dt_bindings_check didn't report 
>> this issue even the full check has been run.
> 
> Hopefully I've found a way to update latest dtschema without bothering 
> IT. ;)
> 
> pip3 install -U git+https://github.com/devicetree-org/dt-schema.git at main
> 
> I'll run latest dt_bindings_check for v4 version.
> 
Dear Rob,

Just want to leave a note here.

After I've updated to dtschema 2024.10.dev3+gdc4787b,
the 'make dt_bindings_check' still reported no error with this patch v3.

pip show dtschema

Name: dtschema
Version: 2024.10.dev3+gdc4787b
Summary: DeviceTree validation schema and tools
Home-page: https://github.com/devicetree-org/dt-schema

python: 3.10
pip: 24.2

If you have any clue about root cause or any other dependencies
of this environment issue, please let me know. I'll try to check if
there is a fix. Thanks.

Regards,
Macpaul Lin


From macpaul.lin at mediatek.com  Sat Sep 14 06:27:31 2024
From: macpaul.lin at mediatek.com (Macpaul Lin)
Date: Sat, 14 Sep 2024 21:27:31 +0800
Subject: [PATCH v4 1/3] regulator: dt-bindings: mt6323: Convert to DT schema
Message-ID: <20240914132731.9211-1-macpaul.lin@mediatek.com>

Convert the MT6323 regulator binding from the old text-based format to
the new DT schema style. The property "regulator-name" has been added
as required property to reflect current usage in mt6323.dtsi.

Examples have been streamlined and relocated to the parent schema file:
  mfd/mediatek,mt6397.yaml.

Update maintainer and submitter information with new entries from MediaTek.

The reference document cited in "mediatek,mt7530.yaml" has been updated
to point to this new DT schema file

Signed-off-by: Sen Chu <sen.chu at mediatek.com>
Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
---
 .../bindings/net/dsa/mediatek,mt7530.yaml     |   4 +-
 .../regulator/mediatek,mt6323-regulator.yaml  | 120 +++++++++
 .../bindings/regulator/mt6323-regulator.txt   | 237 ------------------
 3 files changed, 122 insertions(+), 239 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/regulator/mediatek,mt6323-regulator.yaml
 delete mode 100644 Documentation/devicetree/bindings/regulator/mt6323-regulator.txt

Changes for v1 and v2:
 - This is the first version of converting mt6323-regulator.
   This is because converting mt6323-regulator together
   with mfd/mediatek,mt6397.yaml, so we've create a patch set
   instead of single patch for each skydives.
 - This patch has been made base on linux-next/master git repo.

Changes for v3:
 - Rebased on linux-next/master git repo near next-20240906.
 - Added 'regulator-name' to 'requried' property to reflect current usage.
 - replace ^(buck_)? and ^(ldo_)? to ^buck_ and ^ldo_ prefix.
 - Update file name of 'mediatek,mt6323-regulator.yaml' in
   'mediatek,mt7530.yaml'

Changes for v4:
 - No change.

diff --git a/Documentation/devicetree/bindings/net/dsa/mediatek,mt7530.yaml b/Documentation/devicetree/bindings/net/dsa/mediatek,mt7530.yaml
index ea979bc..413db38 100644
--- a/Documentation/devicetree/bindings/net/dsa/mediatek,mt7530.yaml
+++ b/Documentation/devicetree/bindings/net/dsa/mediatek,mt7530.yaml
@@ -129,8 +129,8 @@ properties:
   io-supply:
     description: |
       Phandle to the regulator node necessary for the I/O power.
-      See Documentation/devicetree/bindings/regulator/mt6323-regulator.txt for
-      details for the regulator setup on these boards.
+      See Documentation/devicetree/bindings/regulator/mediatek,mt6323-regulator.yaml
+      for details for the regulator setup on these boards.
 
   mediatek,mcm:
     type: boolean
diff --git a/Documentation/devicetree/bindings/regulator/mediatek,mt6323-regulator.yaml b/Documentation/devicetree/bindings/regulator/mediatek,mt6323-regulator.yaml
new file mode 100644
index 0000000..01b0aba
--- /dev/null
+++ b/Documentation/devicetree/bindings/regulator/mediatek,mt6323-regulator.yaml
@@ -0,0 +1,120 @@
+# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/regulator/mediatek,mt6323-regulator.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: MediaTek MT6323 Regulator
+
+maintainers:
+  - John Crispin <john at phrozen.org>
+  - Sen Chu <sen.chu at mediatek.com>
+  - Macpaul Lin <macpaul.lin at mediatek.com>
+
+description: |
+  Regulator node of the PMIC. This node should under the PMIC's device node.
+  All voltage regulators provided by the PMIC are described as sub-nodes of
+  this node.
+
+properties:
+  compatible:
+    items:
+      - const: mediatek,mt6323-regulator
+
+patternProperties:
+  "^buck_v(pa|proc|sys)$":
+    description: Buck regulators
+    type: object
+    $ref: regulator.yaml#
+
+    properties:
+      regulator-allowed-modes: false
+
+    unevaluatedProperties: false
+
+    required:
+      - regulator-name
+
+  "^ldo_v(camio|cn18)$":
+    description: LDO with fixed 1.8V output and 0~100/10mV tuning
+    type: object
+    $ref: regulator.yaml#
+
+    properties:
+      regulator-allowed-modes: false
+
+    unevaluatedProperties: false
+
+    required:
+      - regulator-name
+
+  "^ldo_v((io|rf)18)$":
+    description: LDOs with fixed 1.825V output and 0~100/10mV tuning
+    type: object
+    $ref: regulator.yaml#
+
+    properties:
+      regulator-allowed-modes: false
+
+    unevaluatedProperties: false
+
+    required:
+      - regulator-name
+
+  "^ldo_v(a|rtc|tcxo|(cn|io)28)$":
+    description: LDOs with fixed 2.8V output and 0~100/10mV tuning
+    type: object
+    $ref: regulator.yaml#
+
+    properties:
+      regulator-allowed-modes: false
+
+    unevaluatedProperties: false
+
+    required:
+      - regulator-name
+
+  "^ldo_v(usb)$":
+    description: LDOs with fixed 3.3V output and 0~100/10mV tuning
+    type: object
+    $ref: regulator.yaml#
+
+    properties:
+      regulator-allowed-modes: false
+
+    unevaluatedProperties: false
+
+    required:
+      - regulator-name
+
+  "^ldo_v(cn33_(bt|wifi))$":
+    description: LDOs with variable 3.3V output and 0~100/10mV tuning
+    type: object
+    $ref: regulator.yaml#
+
+    properties:
+      regulator-allowed-modes: false
+
+    unevaluatedProperties: false
+
+    required:
+      - regulator-name
+
+  "^ldo_v(cama|camaf|camd|emc3v3|gp[123]|ibr|m|mc|mch|sim[12])$":
+    description: LDOs with variable output and 0~100/10mV tuning
+    type: object
+    $ref: regulator.yaml#
+
+    properties:
+      regulator-allowed-modes: false
+
+    unevaluatedProperties: false
+
+    required:
+      - regulator-name
+
+required:
+  - compatible
+
+additionalProperties: false
+
diff --git a/Documentation/devicetree/bindings/regulator/mt6323-regulator.txt b/Documentation/devicetree/bindings/regulator/mt6323-regulator.txt
deleted file mode 100644
index a48749d..0000000
--- a/Documentation/devicetree/bindings/regulator/mt6323-regulator.txt
+++ /dev/null
@@ -1,237 +0,0 @@
-Mediatek MT6323 Regulator
-
-All voltage regulators are defined as subnodes of the regulators node. A list
-of regulators provided by this controller are defined as subnodes of the
-PMIC's node. Each regulator is named according to its regulator type,
-buck_<name> and ldo_<name>. The definition for each of these nodes is defined
-using the standard binding for regulators at
-Documentation/devicetree/bindings/regulator/regulator.txt.
-
-The valid names for regulators are::
-BUCK:
-  buck_vproc, buck_vsys, buck_vpa
-LDO:
-  ldo_vtcxo, ldo_vcn28, ldo_vcn33_bt, ldo_vcn33_wifi, ldo_va, ldo_vcama,
-  ldo_vio28, ldo_vusb, ldo_vmc, ldo_vmch, ldo_vemc3v3, ldo_vgp1, ldo_vgp2,
-  ldo_vgp3, ldo_vcn18, ldo_vsim1, ldo_vsim2, ldo_vrtc, ldo_vcamaf, ldo_vibr,
-  ldo_vrf18, ldo_vm, ldo_vio18, ldo_vcamd, ldo_vcamio
-
-Example:
-
-	pmic: mt6323 {
-		mt6323regulator: regulators {
-			mt6323_vproc_reg: buck_vproc{
-				regulator-name = "vproc";
-				regulator-min-microvolt = < 700000>;
-				regulator-max-microvolt = <1350000>;
-				regulator-ramp-delay = <12500>;
-				regulator-always-on;
-				regulator-boot-on;
-			};
-
-			mt6323_vsys_reg: buck_vsys{
-				regulator-name = "vsys";
-				regulator-min-microvolt = <1400000>;
-				regulator-max-microvolt = <2987500>;
-				regulator-ramp-delay = <25000>;
-				regulator-always-on;
-				regulator-boot-on;
-			};
-
-			mt6323_vpa_reg: buck_vpa{
-				regulator-name = "vpa";
-				regulator-min-microvolt = < 500000>;
-				regulator-max-microvolt = <3650000>;
-			};
-
-			mt6323_vtcxo_reg: ldo_vtcxo{
-				regulator-name = "vtcxo";
-				regulator-min-microvolt = <2800000>;
-				regulator-max-microvolt = <2800000>;
-				regulator-enable-ramp-delay = <90>;
-				regulator-always-on;
-				regulator-boot-on;
-			};
-
-			mt6323_vcn28_reg: ldo_vcn28{
-				regulator-name = "vcn28";
-				regulator-min-microvolt = <2800000>;
-				regulator-max-microvolt = <2800000>;
-				regulator-enable-ramp-delay = <185>;
-			};
-
-			mt6323_vcn33_bt_reg: ldo_vcn33_bt{
-				regulator-name = "vcn33_bt";
-				regulator-min-microvolt = <3300000>;
-				regulator-max-microvolt = <3600000>;
-				regulator-enable-ramp-delay = <185>;
-			};
-
-			mt6323_vcn33_wifi_reg: ldo_vcn33_wifi{
-				regulator-name = "vcn33_wifi";
-				regulator-min-microvolt = <3300000>;
-				regulator-max-microvolt = <3600000>;
-				regulator-enable-ramp-delay = <185>;
-			};
-
-			mt6323_va_reg: ldo_va{
-				regulator-name = "va";
-				regulator-min-microvolt = <2800000>;
-				regulator-max-microvolt = <2800000>;
-				regulator-enable-ramp-delay = <216>;
-				regulator-always-on;
-				regulator-boot-on;
-			};
-
-			mt6323_vcama_reg: ldo_vcama{
-				regulator-name = "vcama";
-				regulator-min-microvolt = <1500000>;
-				regulator-max-microvolt = <2800000>;
-				regulator-enable-ramp-delay = <216>;
-			};
-
-			mt6323_vio28_reg: ldo_vio28{
-				regulator-name = "vio28";
-				regulator-min-microvolt = <2800000>;
-				regulator-max-microvolt = <2800000>;
-				regulator-enable-ramp-delay = <216>;
-				regulator-always-on;
-				regulator-boot-on;
-			};
-
-			mt6323_vusb_reg: ldo_vusb{
-				regulator-name = "vusb";
-				regulator-min-microvolt = <3300000>;
-				regulator-max-microvolt = <3300000>;
-				regulator-enable-ramp-delay = <216>;
-				regulator-boot-on;
-			};
-
-			mt6323_vmc_reg: ldo_vmc{
-				regulator-name = "vmc";
-				regulator-min-microvolt = <1800000>;
-				regulator-max-microvolt = <3300000>;
-				regulator-enable-ramp-delay = <36>;
-				regulator-boot-on;
-			};
-
-			mt6323_vmch_reg: ldo_vmch{
-				regulator-name = "vmch";
-				regulator-min-microvolt = <3000000>;
-				regulator-max-microvolt = <3300000>;
-				regulator-enable-ramp-delay = <36>;
-				regulator-boot-on;
-			};
-
-			mt6323_vemc3v3_reg: ldo_vemc3v3{
-				regulator-name = "vemc3v3";
-				regulator-min-microvolt = <3000000>;
-				regulator-max-microvolt = <3300000>;
-				regulator-enable-ramp-delay = <36>;
-				regulator-boot-on;
-			};
-
-			mt6323_vgp1_reg: ldo_vgp1{
-				regulator-name = "vgp1";
-				regulator-min-microvolt = <1200000>;
-				regulator-max-microvolt = <3300000>;
-				regulator-enable-ramp-delay = <216>;
-			};
-
-			mt6323_vgp2_reg: ldo_vgp2{
-				regulator-name = "vgp2";
-				regulator-min-microvolt = <1200000>;
-				regulator-max-microvolt = <3000000>;
-				regulator-enable-ramp-delay = <216>;
-			};
-
-			mt6323_vgp3_reg: ldo_vgp3{
-				regulator-name = "vgp3";
-				regulator-min-microvolt = <1200000>;
-				regulator-max-microvolt = <1800000>;
-				regulator-enable-ramp-delay = <216>;
-			};
-
-			mt6323_vcn18_reg: ldo_vcn18{
-				regulator-name = "vcn18";
-				regulator-min-microvolt = <1800000>;
-				regulator-max-microvolt = <1800000>;
-				regulator-enable-ramp-delay = <216>;
-			};
-
-			mt6323_vsim1_reg: ldo_vsim1{
-				regulator-name = "vsim1";
-				regulator-min-microvolt = <1800000>;
-				regulator-max-microvolt = <3000000>;
-				regulator-enable-ramp-delay = <216>;
-			};
-
-			mt6323_vsim2_reg: ldo_vsim2{
-				regulator-name = "vsim2";
-				regulator-min-microvolt = <1800000>;
-				regulator-max-microvolt = <3000000>;
-				regulator-enable-ramp-delay = <216>;
-			};
-
-			mt6323_vrtc_reg: ldo_vrtc{
-				regulator-name = "vrtc";
-				regulator-min-microvolt = <2800000>;
-				regulator-max-microvolt = <2800000>;
-				regulator-always-on;
-				regulator-boot-on;
-			};
-
-			mt6323_vcamaf_reg: ldo_vcamaf{
-				regulator-name = "vcamaf";
-				regulator-min-microvolt = <1200000>;
-				regulator-max-microvolt = <3300000>;
-				regulator-enable-ramp-delay = <216>;
-			};
-
-			mt6323_vibr_reg: ldo_vibr{
-				regulator-name = "vibr";
-				regulator-min-microvolt = <1200000>;
-				regulator-max-microvolt = <3300000>;
-				regulator-enable-ramp-delay = <36>;
-			};
-
-			mt6323_vrf18_reg: ldo_vrf18{
-				regulator-name = "vrf18";
-				regulator-min-microvolt = <1825000>;
-				regulator-max-microvolt = <1825000>;
-				regulator-enable-ramp-delay = <187>;
-			};
-
-			mt6323_vm_reg: ldo_vm{
-				regulator-name = "vm";
-				regulator-min-microvolt = <1200000>;
-				regulator-max-microvolt = <1800000>;
-				regulator-enable-ramp-delay = <216>;
-				regulator-always-on;
-				regulator-boot-on;
-			};
-
-			mt6323_vio18_reg: ldo_vio18{
-				regulator-name = "vio18";
-				regulator-min-microvolt = <1800000>;
-				regulator-max-microvolt = <1800000>;
-				regulator-enable-ramp-delay = <216>;
-				regulator-always-on;
-				regulator-boot-on;
-			};
-
-			mt6323_vcamd_reg: ldo_vcamd{
-				regulator-name = "vcamd";
-				regulator-min-microvolt = <1200000>;
-				regulator-max-microvolt = <1800000>;
-				regulator-enable-ramp-delay = <216>;
-			};
-
-			mt6323_vcamio_reg: ldo_vcamio{
-				regulator-name = "vcamio";
-				regulator-min-microvolt = <1800000>;
-				regulator-max-microvolt = <1800000>;
-				regulator-enable-ramp-delay = <216>;
-			};
-		};
-	};
-- 
2.45.2



From macpaul.lin at mediatek.com  Sat Sep 14 06:28:11 2024
From: macpaul.lin at mediatek.com (Macpaul Lin)
Date: Sat, 14 Sep 2024 21:28:11 +0800
Subject: [PATCH v4 2/3] dt-bindings: mfd: mediatek: mt6397: Convert to DT schema format
Message-ID: <20240914132811.9637-1-macpaul.lin@mediatek.com>

Convert the mfd: mediatek: mt6397 binding to DT schema format.

MT6323, MT6358, and MT6397 are PMIC devices with multiple function
subdevices. They share a common PMIC design but have variations in
subdevice combinations.

Key updates in this conversion:

1. RTC:
   - Convert rtc-mt6397.txt and merge into parent MT6397 PMIC DT schema.

2. Regulators:
   - Align to generic name "regulators".
   - Update references from .txt to .yaml for mt6323, mt6358, and mt6397
     regulators.
   - Simplify regulator name labels in device tree examples.

3. Audio Codec:
   - Convert sound/mt6358.txt and merge into parent MT6397 PMIC DT schema.
   - Align to generic name "audio-codec" for codec and sound subdevices.
   - Add "mediatek,dmic-mode" and "Avdd-supply" properties.

4. Clocks:
   - Align to generic name "clocks" for clockbuffer subdevices.

5. LEDs:
   - Convert leds-mt6323.txt and merge into parent MT6397 PMIC DT schema.
   - Update LED binding.

6. Keys:
   - Add detailed descriptions for power and home keys.
   - Add compatible: mediatek,mt6358-keys.

7. Power Controller:
   - Convert mt6323-poweroff.txt and merge into parent MT6397 PMIC DT
     schema.
   - Add #power-domain-cells property to fix dt-binding check error.
   - Clarify "BBPU" as "Baseband power up".

8. Pinctrl:
   - Align to generic name "pinctrl" instead of "pin-controller".

9. Compatible:
   - Drop "mediatek,mt6357" since there is a separated DT Schema
     for PMIC MT6357.

Additional updates:
- MAINTAINERS: Add co-maintainers and reference to
  mfd/mediatek,mt6397.yaml for LED and power-controller drivers.
- input/mediatek,pmic-keys.yaml: Update reference to
  mfd/mediatek,mt6397.yaml.

Signed-off-by: Sen Chu <sen.chu at mediatek.com>
Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
---
 .../bindings/input/mediatek,pmic-keys.yaml    |    2 +-
 .../devicetree/bindings/leds/leds-mt6323.txt  |   63 -
 .../bindings/mfd/mediatek,mt6397.yaml         | 1077 +++++++++++++++++
 .../devicetree/bindings/mfd/mt6397.txt        |  110 --
 .../bindings/power/reset/mt6323-poweroff.txt  |   20 -
 .../devicetree/bindings/rtc/rtc-mt6397.txt    |   31 -
 .../devicetree/bindings/sound/mt6358.txt      |   26 -
 MAINTAINERS                                   |    8 +-
 8 files changed, 1084 insertions(+), 253 deletions(-)
 delete mode 100644 Documentation/devicetree/bindings/leds/leds-mt6323.txt
 create mode 100644 Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml
 delete mode 100644 Documentation/devicetree/bindings/mfd/mt6397.txt
 delete mode 100644 Documentation/devicetree/bindings/power/reset/mt6323-poweroff.txt
 delete mode 100644 Documentation/devicetree/bindings/rtc/rtc-mt6397.txt
 delete mode 100644 Documentation/devicetree/bindings/sound/mt6358.txt

Changes for v1:
 - This patch depends on conversion of mediatek,mt6397-regulator.yaml
   [1] https://lore.kernel.org/lkml/20240807091738.18387-1-macpaul.lin at mediatek.com/T/

Changes for v2:
 - This patch has been made base on linux-next/master git repo.
 - Keep the parent and child relationship with mediatek,pwrap in description.
   [2] https://lore.kernel.org/all/20240826-slurp-earphone-0d5173923ae8 at spud/
 - Keep the $ref for regulators since dt_binding_check didn't report any issue
   based on linux-next/master repo.
 - Fix description of mt6397/mt6323 devices, use "power management chip"
   instead of "multifunction device"
 - Drop unnecessary comments or description according to the review.
 - Convert sub-modules to DT Schema:
  - RTC, LEDs, power-controllers, regulators
 - Drop duplicate sub node name and description for sub-modules
  - RTC, Keys
 - examples:
  - drop parent pwrap node
  - Add examples from mediatek,mt6323-regulator.yaml
  - Add examples from mediatek,mt6358-regulator.yaml
  - Add examples from mediatek,mt6397-regulator.yaml
  - Complete the examples as could as possible.

Changes for v3:
 - Rebased on linux-next/master git repo near next-20240906.
 - Revise commit message.
 - Regulators:
  - Use "additionalProperties: true" and add "contains" for matching
    $ref DT bindings.
  - Simplify regulator name labels in device tree examples.
 - LEDs:
  - Use LED bindings.
 - Squash following patches in v2 for removing old text format DT bindings
   into this patch, includes:
  - leds-mt6323.txt, mt6323-poweroff.txt, rtc-mt6397.txt, sound/mt6358.txt.
 - Fix file format of DT schemas, add blank between properties.
 - Fix 'make checkrefdoc' errors, update reference in mediatek,pmic-keys.yaml.

Changes for v4:
 - Remove "mediatek,mt6357" from PMIC's compatible string since there is a
   seperated DT schema for PMIC mt6357.

diff --git a/Documentation/devicetree/bindings/input/mediatek,pmic-keys.yaml b/Documentation/devicetree/bindings/input/mediatek,pmic-keys.yaml
index 70567d9..466566a 100644
--- a/Documentation/devicetree/bindings/input/mediatek,pmic-keys.yaml
+++ b/Documentation/devicetree/bindings/input/mediatek,pmic-keys.yaml
@@ -19,7 +19,7 @@ description: |
   by the PMIC that is defined as a Multi-Function Device (MFD).
 
   For MediaTek MT6323/MT6397 PMIC bindings see
-  Documentation/devicetree/bindings/mfd/mt6397.txt
+  Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml
 
 properties:
   compatible:
diff --git a/Documentation/devicetree/bindings/leds/leds-mt6323.txt b/Documentation/devicetree/bindings/leds/leds-mt6323.txt
deleted file mode 100644
index 052dccb8..0000000
--- a/Documentation/devicetree/bindings/leds/leds-mt6323.txt
+++ /dev/null
@@ -1,63 +0,0 @@
-Device Tree Bindings for LED support on MT6323 PMIC
-
-MT6323 LED controller is subfunction provided by MT6323 PMIC, so the LED
-controllers are defined as the subnode of the function node provided by MT6323
-PMIC controller that is being defined as one kind of Muti-Function Device (MFD)
-using shared bus called PMIC wrapper for each subfunction to access remote
-MT6323 PMIC hardware.
-
-For MT6323 MFD bindings see:
-Documentation/devicetree/bindings/mfd/mt6397.txt
-For MediaTek PMIC wrapper bindings see:
-Documentation/devicetree/bindings/soc/mediatek/mediatek,pwrap.yaml
-
-Required properties:
-- compatible : Must be one of
-  - "mediatek,mt6323-led"
-  - "mediatek,mt6331-led"
-  - "mediatek,mt6332-led"
-- address-cells : Must be 1
-- size-cells : Must be 0
-
-Each led is represented as a child node of the mediatek,mt6323-led that
-describes the initial behavior for each LED physically and currently only four
-LED child nodes can be supported.
-
-Required properties for the LED child node:
-- reg : LED channel number (0..3)
-
-Optional properties for the LED child node:
-- label : See Documentation/devicetree/bindings/leds/common.txt
-- linux,default-trigger : See Documentation/devicetree/bindings/leds/common.txt
-- default-state: See Documentation/devicetree/bindings/leds/common.txt
-
-Example:
-
-	mt6323: pmic {
-		compatible = "mediatek,mt6323";
-
-		...
-
-		mt6323led: leds {
-			compatible = "mediatek,mt6323-led";
-			#address-cells = <1>;
-			#size-cells = <0>;
-
-			led at 0 {
-				reg = <0>;
-				label = "LED0";
-				linux,default-trigger = "timer";
-				default-state = "on";
-			};
-			led at 1 {
-				reg = <1>;
-				label = "LED1";
-				default-state = "off";
-			};
-			led at 2 {
-				reg = <2>;
-				label = "LED2";
-				default-state = "on";
-			};
-		};
-	};
diff --git a/Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml b/Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml
new file mode 100644
index 0000000..d53003f
--- /dev/null
+++ b/Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml
@@ -0,0 +1,1077 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/mfd/mediatek,mt6397.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: MediaTek MT6397/MT6323 Multifunction Device (PMIC)
+
+maintainers:
+  - Sen Chu <sen.chu at mediatek.com>
+  - Macpaul Lin <macpaul.lin at mediatek.com>
+
+description: |
+  MT6397/MT6323 is a power management system chip.
+  Please see the sub-modules below for supported features.
+
+  MT6397/MT6323 is a multifunction device with the following sub modules:
+  - Regulators
+  - RTC
+  - Audio codec
+  - GPIO
+  - Clock
+  - LED
+  - Keys
+  - Power controller
+
+  It is interfaced to host controller using SPI interface by a proprietary hardware
+  called PMIC wrapper or pwrap. MT6397/MT6323 PMIC is a child device of pwrap.
+  See the following for pwrap node definitions:
+  Documentation/devicetree/bindings/soc/mediatek/mediatek,pwrap.yaml
+
+properties:
+  compatible:
+    oneOf:
+      - enum:
+          - mediatek,mt6323
+          - mediatek,mt6331 # "mediatek,mt6331" for PMIC MT6331 and MT6332.
+          - mediatek,mt6358
+          - mediatek,mt6359
+          - mediatek,mt6397
+      - items:
+          - enum:
+              - mediatek,mt6366
+          - const: mediatek,mt6358
+
+  interrupts:
+    maxItems: 1
+
+  interrupt-controller: true
+
+  "#interrupt-cells":
+    const: 2
+
+  rtc:
+    type: object
+    $ref: /schemas/rtc/rtc.yaml#
+    unevaluatedProperties: false
+    description:
+      MT6397 Real Time Clock.
+
+    properties:
+      compatible:
+        oneOf:
+          - enum:
+              - mediatek,mt6323-rtc
+              - mediatek,mt6331-rtc
+              - mediatek,mt6358-rtc
+              - mediatek,mt6397-rtc
+          - items:
+              - enum:
+                  - mediatek,mt6366-rtc
+              - const: mediatek,mt6358-rtc
+
+      start-year: true
+
+    required:
+      - compatible
+
+  regulators:
+    type: object
+    description:
+      List of child nodes that specify the regulators.
+    additionalProperties: true
+    properties:
+      compatible:
+        oneOf:
+          - enum:
+              - mediatek,mt6323-regulator
+              - mediatek,mt6358-regulator
+              - mediatek,mt6397-regulator
+          - items:
+              - enum:
+                  - mediatek,mt6366-regulator
+              - const: mediatek,mt6358-regulator
+
+    required:
+      - compatible
+
+    allOf:
+      - if:
+          properties:
+            compatible:
+              contains:
+                const: mediatek,mt6323-regulator
+
+        then:
+          $ref: /schemas/regulator/mediatek,mt6323-regulator.yaml
+
+      - if:
+          properties:
+            compatible:
+              contains:
+                const: mediatek,mt6358-regulator
+
+        then:
+          $ref: /schemas/regulator/mediatek,mt6358-regulator.yaml
+
+      - if:
+          properties:
+            compatible:
+              contains:
+                const: mediatek,mt6397-regulator
+
+        then:
+          $ref: /schemas/regulator/mediatek,mt6397-regulator.yaml
+
+  audio-codec:
+    type: object
+    additionalProperties: false
+    description:
+      Audio codec support with MT6397 and MT6358.
+    properties:
+      compatible:
+        oneOf:
+          - enum:
+              - mediatek,mt6397-codec
+              - mediatek,mt6358-sound
+          - items:
+              - enum:
+                  - mediatek,mt6366-sound
+              - const: mediatek,mt6358-sound
+
+      mediatek,dmic-mode:
+        description: |
+          Indicates how many data pins are used to transmit two channels of PDM
+          signal.
+          0 - two wires;
+          1 - one wire;
+          Default value is 0.
+        enum: [0, 1]
+        default: 0
+
+      Avdd-supply:
+        description: Power source of AVDD.
+
+    required:
+      - compatible
+
+  clocks:
+    type: object
+    additionalProperties: false
+    description: |
+      This is a clock buffer node for mt6397. However, there are no sub nodes
+      or any public document exposed in public.
+    properties:
+      compatible:
+        const: mediatek,mt6397-clk
+      '#clock-cells':
+        const: 1
+    required:
+      - compatible
+
+  leds:
+    type: object
+    additionalProperties: false
+    description: |
+      MT6323 LED controller is subfunction provided by MT6323 PMIC, so the LED
+      controllers are defined as the subnode of the function node provided by MT6323
+      PMIC controller that is being defined as one kind of Muti-Function Device (MFD)
+      using shared bus called PMIC wrapper for each subfunction to access remote
+      MT6323 PMIC hardware.
+
+      Each led is represented as a child node of the mediatek,mt6323-led that
+      describes the initial behavior for each LED physically and currently only four
+      LED child nodes can be supported.
+
+    properties:
+      compatible:
+        enum:
+          - mediatek,mt6323-led
+          - mediatek,mt6331-led
+          - mediatek,mt6332-led
+
+      reg:
+        maxItems: 1
+
+      "#address-cells":
+        const: 1
+
+      "#size-cells":
+        const: 0
+
+    patternProperties:
+      "^led@[0-3]$":
+        type: object
+        $ref: /schemas/leds/common.yaml#
+        unevaluatedProperties: false
+
+        properties:
+          reg:
+            description:
+              LED channel number (0..3)
+            minimum: 0
+            maximum: 3
+
+        required:
+          - reg
+
+    required:
+      - compatible
+      - '#address-cells'
+      - '#size-cells'
+
+  keys:
+    type: object
+    $ref: /schemas/input/mediatek,pmic-keys.yaml
+    unevaluatedProperties: false
+    description:
+      Power and Home keys.
+    properties:
+      compatible:
+        enum:
+          - mediatek,mt6323-keys
+          - mediatek,mt6331-keys
+          - mediatek,mt6358-keys
+          - mediatek,mt6397-keys
+
+  power-controller:
+    type: object
+    additionalProperties: false
+    description:
+      The power controller which could be found on PMIC is responsible for
+      externally powering off or on the remote MediaTek SoC through the
+      circuit BBPU (baseband power up).
+    properties:
+      compatible:
+        const: mediatek,mt6323-pwrc
+
+      '#power-domain-cells':
+        const: 0
+
+  pinctrl:
+    type: object
+    $ref: /schemas/pinctrl/mediatek,mt65xx-pinctrl.yaml
+    unevaluatedProperties: false
+    description:
+      Pin controller
+    properties:
+      compatible:
+        const: mediatek,mt6397-pinctrl
+
+required:
+  - compatible
+  - regulators
+
+additionalProperties: false
+
+examples:
+  - |
+    #include <dt-bindings/interrupt-controller/arm-gic.h>
+    #include <dt-bindings/leds/common.h>
+
+    pmic {
+        compatible = "mediatek,mt6323";
+        interrupt-parent = <&pio>;
+        interrupts = <150 IRQ_TYPE_LEVEL_HIGH>;
+        interrupt-controller;
+        #interrupt-cells = <2>;
+
+        leds {
+                compatible = "mediatek,mt6323-led";
+                #address-cells = <1>;
+                #size-cells = <0>;
+        };
+
+        regulators {
+            compatible = "mediatek,mt6323-regulator";
+
+            buck_vproc {
+                regulator-name = "vproc";
+                regulator-min-microvolt = < 700000>;
+                regulator-max-microvolt = <1350000>;
+                regulator-ramp-delay = <12500>;
+                regulator-always-on;
+                regulator-boot-on;
+            };
+
+            buck_vsys {
+                regulator-name = "vsys";
+                regulator-min-microvolt = <1400000>;
+                regulator-max-microvolt = <2987500>;
+                regulator-ramp-delay = <25000>;
+                regulator-always-on;
+                regulator-boot-on;
+            };
+
+            buck_vpa {
+                regulator-name = "vpa";
+                regulator-min-microvolt = < 500000>;
+                regulator-max-microvolt = <3650000>;
+            };
+
+            ldo_vtcxo {
+                regulator-name = "vtcxo";
+                regulator-min-microvolt = <2800000>;
+                regulator-max-microvolt = <2800000>;
+                regulator-enable-ramp-delay = <90>;
+                regulator-always-on;
+                regulator-boot-on;
+            };
+
+            ldo_vcn28 {
+                regulator-name = "vcn28";
+                regulator-min-microvolt = <2800000>;
+                regulator-max-microvolt = <2800000>;
+                regulator-enable-ramp-delay = <185>;
+            };
+
+            ldo_vcn33_bt {
+                regulator-name = "vcn33_bt";
+                regulator-min-microvolt = <3300000>;
+                regulator-max-microvolt = <3600000>;
+                regulator-enable-ramp-delay = <185>;
+            };
+
+            ldo_vcn33_wifi {
+                regulator-name = "vcn33_wifi";
+                regulator-min-microvolt = <3300000>;
+                regulator-max-microvolt = <3600000>;
+                regulator-enable-ramp-delay = <185>;
+            };
+
+            ldo_va {
+                regulator-name = "va";
+                regulator-min-microvolt = <2800000>;
+                regulator-max-microvolt = <2800000>;
+                regulator-enable-ramp-delay = <216>;
+                regulator-always-on;
+                regulator-boot-on;
+            };
+
+            ldo_vcama {
+                regulator-name = "vcama";
+                regulator-min-microvolt = <1500000>;
+                regulator-max-microvolt = <2800000>;
+                regulator-enable-ramp-delay = <216>;
+            };
+
+            ldo_vio28 {
+                regulator-name = "vio28";
+                regulator-min-microvolt = <2800000>;
+                regulator-max-microvolt = <2800000>;
+                regulator-enable-ramp-delay = <216>;
+                regulator-always-on;
+                regulator-boot-on;
+            };
+
+            ldo_vusb {
+                regulator-name = "vusb";
+                regulator-min-microvolt = <3300000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <216>;
+                regulator-boot-on;
+            };
+
+            ldo_vmc {
+                regulator-name = "vmc";
+                regulator-min-microvolt = <1800000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <36>;
+                regulator-boot-on;
+            };
+
+            ldo_vmch {
+                regulator-name = "vmch";
+                regulator-min-microvolt = <3000000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <36>;
+                regulator-boot-on;
+            };
+
+            ldo_vemc3v3 {
+                regulator-name = "vemc3v3";
+                regulator-min-microvolt = <3000000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <36>;
+                regulator-boot-on;
+            };
+
+            ldo_vgp1 {
+                regulator-name = "vgp1";
+                regulator-min-microvolt = <1200000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <216>;
+            };
+
+            ldo_vgp2 {
+                regulator-name = "vgp2";
+                regulator-min-microvolt = <1200000>;
+                regulator-max-microvolt = <3000000>;
+                regulator-enable-ramp-delay = <216>;
+            };
+
+            ldo_vgp3 {
+                regulator-name = "vgp3";
+                regulator-min-microvolt = <1200000>;
+                regulator-max-microvolt = <1800000>;
+                regulator-enable-ramp-delay = <216>;
+            };
+
+            ldo_vcn18 {
+                regulator-name = "vcn18";
+                regulator-min-microvolt = <1800000>;
+                regulator-max-microvolt = <1800000>;
+                regulator-enable-ramp-delay = <216>;
+            };
+
+            ldo_vsim1 {
+                regulator-name = "vsim1";
+                regulator-min-microvolt = <1800000>;
+                regulator-max-microvolt = <3000000>;
+                regulator-enable-ramp-delay = <216>;
+            };
+
+            ldo_vsim2 {
+                regulator-name = "vsim2";
+                regulator-min-microvolt = <1800000>;
+                regulator-max-microvolt = <3000000>;
+                regulator-enable-ramp-delay = <216>;
+            };
+
+            ldo_vrtc {
+                regulator-name = "vrtc";
+                regulator-min-microvolt = <2800000>;
+                regulator-max-microvolt = <2800000>;
+                regulator-always-on;
+                regulator-boot-on;
+            };
+
+            ldo_vcamaf {
+                regulator-name = "vcamaf";
+                regulator-min-microvolt = <1200000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <216>;
+            };
+
+            ldo_vibr {
+                regulator-name = "vibr";
+                regulator-min-microvolt = <1200000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <36>;
+            };
+
+            ldo_vrf18 {
+                regulator-name = "vrf18";
+                regulator-min-microvolt = <1825000>;
+                regulator-max-microvolt = <1825000>;
+                regulator-enable-ramp-delay = <187>;
+            };
+
+            ldo_vm {
+                regulator-name = "vm";
+                regulator-min-microvolt = <1200000>;
+                regulator-max-microvolt = <1800000>;
+                regulator-enable-ramp-delay = <216>;
+                regulator-always-on;
+                regulator-boot-on;
+            };
+
+            ldo_vio18 {
+                regulator-name = "vio18";
+                regulator-min-microvolt = <1800000>;
+                regulator-max-microvolt = <1800000>;
+                regulator-enable-ramp-delay = <216>;
+                regulator-always-on;
+                regulator-boot-on;
+            };
+
+           ldo_vcamd {
+                regulator-name = "vcamd";
+                regulator-min-microvolt = <1200000>;
+                regulator-max-microvolt = <1800000>;
+                regulator-enable-ramp-delay = <216>;
+            };
+
+            ldo_vcamio {
+                regulator-name = "vcamio";
+                regulator-min-microvolt = <1800000>;
+                regulator-max-microvolt = <1800000>;
+                regulator-enable-ramp-delay = <216>;
+            };
+        };
+
+        keys {
+                compatible = "mediatek,mt6323-keys";
+                mediatek,long-press-mode = <1>;
+                power-off-time-sec = <0>;
+
+                power {
+                        linux,keycodes = <116>;
+                        wakeup-source;
+                };
+
+                home {
+                        linux,keycodes = <114>;
+                };
+        };
+
+        power-controller {
+            compatible = "mediatek,mt6323-pwrc";
+            #power-domain-cells = <0>;
+        };
+
+        rtc {
+            compatible = "mediatek,mt6323-rtc";
+        };
+    };
+
+  - |
+    #include <dt-bindings/input/input.h>
+    #include <dt-bindings/interrupt-controller/arm-gic.h>
+
+    pmic {
+        compatible = "mediatek,mt6358";
+        interrupt-controller;
+        #interrupt-cells = <2>;
+
+        audio-codec {
+            compatible = "mediatek,mt6358-sound";
+            Avdd-supply = <&mt6358_vaud28_reg>;
+            mediatek,dmic-mode = <0>;
+        };
+
+        regulators {
+            compatible = "mediatek,mt6358-regulator";
+
+            buck_vdram1 {
+                regulator-name = "vdram1";
+                regulator-min-microvolt = <500000>;
+                regulator-max-microvolt = <2087500>;
+                regulator-ramp-delay = <12500>;
+                regulator-enable-ramp-delay = <0>;
+                regulator-always-on;
+                regulator-allowed-modes = <0 1>;
+            };
+
+            buck_vcore {
+                regulator-name = "vcore";
+                regulator-min-microvolt = <500000>;
+                regulator-max-microvolt = <1293750>;
+                regulator-ramp-delay = <6250>;
+                regulator-enable-ramp-delay = <200>;
+                regulator-always-on;
+                regulator-allowed-modes = <0 1>;
+            };
+
+            buck_vpa {
+                regulator-name = "vpa";
+                regulator-min-microvolt = <500000>;
+                regulator-max-microvolt = <3650000>;
+                regulator-ramp-delay = <50000>;
+                regulator-enable-ramp-delay = <250>;
+                regulator-allowed-modes = <0 1>;
+            };
+
+            buck_vproc11 {
+                regulator-name = "vproc11";
+                regulator-min-microvolt = <500000>;
+                regulator-max-microvolt = <1293750>;
+                regulator-ramp-delay = <6250>;
+                regulator-enable-ramp-delay = <200>;
+                regulator-always-on;
+                regulator-allowed-modes = <0 1>;
+            };
+
+            buck_vproc12 {
+                regulator-name = "vproc12";
+                regulator-min-microvolt = <500000>;
+                regulator-max-microvolt = <1293750>;
+                regulator-ramp-delay = <6250>;
+                regulator-enable-ramp-delay = <200>;
+                regulator-always-on;
+                regulator-allowed-modes = <0 1>;
+            };
+
+            buck_vgpu {
+                regulator-name = "vgpu";
+                regulator-min-microvolt = <500000>;
+                regulator-max-microvolt = <1293750>;
+                regulator-ramp-delay = <6250>;
+                regulator-enable-ramp-delay = <200>;
+                regulator-allowed-modes = <0 1>;
+            };
+
+            buck_vs2 {
+                regulator-name = "vs2";
+                regulator-min-microvolt = <500000>;
+                regulator-max-microvolt = <2087500>;
+                regulator-ramp-delay = <12500>;
+                regulator-enable-ramp-delay = <0>;
+                regulator-always-on;
+            };
+
+            buck_vmodem {
+                regulator-name = "vmodem";
+                regulator-min-microvolt = <500000>;
+                regulator-max-microvolt = <1293750>;
+                regulator-ramp-delay = <6250>;
+                regulator-enable-ramp-delay = <900>;
+                regulator-always-on;
+                regulator-allowed-modes = <0 1>;
+            };
+
+            buck_vs1 {
+                regulator-name = "vs1";
+                regulator-min-microvolt = <1000000>;
+                regulator-max-microvolt = <2587500>;
+                regulator-ramp-delay = <12500>;
+                regulator-enable-ramp-delay = <0>;
+                regulator-always-on;
+            };
+
+            ldo_vdram2 {
+                regulator-name = "vdram2";
+                regulator-min-microvolt = <600000>;
+                regulator-max-microvolt = <1800000>;
+                regulator-enable-ramp-delay = <3300>;
+            };
+
+            ldo_vsim1 {
+                regulator-name = "vsim1";
+                regulator-min-microvolt = <1700000>;
+                regulator-max-microvolt = <3100000>;
+                regulator-enable-ramp-delay = <540>;
+            };
+
+            ldo_vibr {
+                regulator-name = "vibr";
+                regulator-min-microvolt = <1200000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <60>;
+            };
+
+            ldo_vrf12 {
+                regulator-name = "vrf12";
+                regulator-min-microvolt = <1200000>;
+                regulator-max-microvolt = <1200000>;
+                regulator-enable-ramp-delay = <120>;
+            };
+
+            ldo_vio18 {
+                regulator-name = "vio18";
+                regulator-min-microvolt = <1800000>;
+                regulator-max-microvolt = <1800000>;
+                regulator-enable-ramp-delay = <2700>;
+                regulator-always-on;
+            };
+
+            ldo_vusb {
+                regulator-name = "vusb";
+                regulator-min-microvolt = <3000000>;
+                regulator-max-microvolt = <3100000>;
+                regulator-enable-ramp-delay = <270>;
+                regulator-always-on;
+            };
+
+            ldo_vcamio {
+                regulator-name = "vcamio";
+                regulator-min-microvolt = <1800000>;
+                regulator-max-microvolt = <1800000>;
+                regulator-enable-ramp-delay = <325>;
+            };
+
+            ldo_vcamd {
+                regulator-name = "vcamd";
+                regulator-min-microvolt = <900000>;
+                regulator-max-microvolt = <1800000>;
+                regulator-enable-ramp-delay = <325>;
+            };
+
+            ldo_vcn18 {
+                regulator-name = "vcn18";
+                regulator-min-microvolt = <1800000>;
+                regulator-max-microvolt = <1800000>;
+                regulator-enable-ramp-delay = <270>;
+            };
+
+            ldo_vfe28 {
+                regulator-name = "vfe28";
+                regulator-min-microvolt = <2800000>;
+                regulator-max-microvolt = <2800000>;
+                regulator-enable-ramp-delay = <270>;
+            };
+
+            ldo_vsram_proc11 {
+                regulator-name = "vsram_proc11";
+                regulator-min-microvolt = <500000>;
+                regulator-max-microvolt = <1293750>;
+                regulator-ramp-delay = <6250>;
+                regulator-enable-ramp-delay = <240>;
+                regulator-always-on;
+            };
+
+            ldo_vcn28 {
+                regulator-name = "vcn28";
+                regulator-min-microvolt = <2800000>;
+                regulator-max-microvolt = <2800000>;
+                regulator-enable-ramp-delay = <270>;
+            };
+
+            ldo_vsram_others {
+                regulator-name = "vsram_others";
+                regulator-min-microvolt = <500000>;
+                regulator-max-microvolt = <1293750>;
+                regulator-ramp-delay = <6250>;
+                regulator-enable-ramp-delay = <240>;
+                regulator-always-on;
+            };
+
+            ldo_vsram_gpu {
+                regulator-name = "vsram_gpu";
+                regulator-min-microvolt = <500000>;
+                regulator-max-microvolt = <1293750>;
+                regulator-ramp-delay = <6250>;
+                regulator-enable-ramp-delay = <240>;
+            };
+
+            ldo_vxo22 {
+                regulator-name = "vxo22";
+                regulator-min-microvolt = <2200000>;
+                regulator-max-microvolt = <2200000>;
+                regulator-enable-ramp-delay = <120>;
+                regulator-always-on;
+            };
+
+            ldo_vefuse {
+                regulator-name = "vefuse";
+                regulator-min-microvolt = <1700000>;
+                regulator-max-microvolt = <1900000>;
+                regulator-enable-ramp-delay = <270>;
+            };
+
+            ldo_vaux18 {
+                regulator-name = "vaux18";
+                regulator-min-microvolt = <1800000>;
+                regulator-max-microvolt = <1800000>;
+                regulator-enable-ramp-delay = <270>;
+            };
+
+            ldo_vmch {
+                regulator-name = "vmch";
+                regulator-min-microvolt = <2900000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <60>;
+            };
+
+            ldo_vbif28 {
+                regulator-name = "vbif28";
+                regulator-min-microvolt = <2800000>;
+                regulator-max-microvolt = <2800000>;
+                regulator-enable-ramp-delay = <270>;
+            };
+
+            ldo_vsram_proc12 {
+                regulator-name = "vsram_proc12";
+                regulator-min-microvolt = <500000>;
+                regulator-max-microvolt = <1293750>;
+                regulator-ramp-delay = <6250>;
+                regulator-enable-ramp-delay = <240>;
+                regulator-always-on;
+            };
+
+            ldo_vcama1 {
+                regulator-name = "vcama1";
+                regulator-min-microvolt = <1800000>;
+                regulator-max-microvolt = <3000000>;
+                regulator-enable-ramp-delay = <325>;
+            };
+
+            ldo_vemc {
+                regulator-name = "vemc";
+                regulator-min-microvolt = <2900000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <60>;
+            };
+
+            ldo_vio28 {
+                regulator-name = "vio28";
+                regulator-min-microvolt = <2800000>;
+                regulator-max-microvolt = <2800000>;
+                regulator-enable-ramp-delay = <270>;
+            };
+
+            ldo_va12 {
+                regulator-name = "va12";
+                regulator-min-microvolt = <1200000>;
+                regulator-max-microvolt = <1200000>;
+                regulator-enable-ramp-delay = <270>;
+                regulator-always-on;
+            };
+
+            ldo_vrf18 {
+                regulator-name = "vrf18";
+                regulator-min-microvolt = <1800000>;
+                regulator-max-microvolt = <1800000>;
+                regulator-enable-ramp-delay = <120>;
+            };
+
+            ldo_vcn33 {
+                regulator-name = "vcn33";
+                regulator-min-microvolt = <3300000>;
+                regulator-max-microvolt = <3500000>;
+                regulator-enable-ramp-delay = <270>;
+            };
+
+            ldo_vcama2 {
+                regulator-name = "vcama2";
+                regulator-min-microvolt = <1800000>;
+                regulator-max-microvolt = <3000000>;
+                regulator-enable-ramp-delay = <325>;
+            };
+
+            ldo_vmc {
+                regulator-name = "vmc";
+                regulator-min-microvolt = <1800000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <60>;
+            };
+
+            ldo_vldo28 {
+                regulator-name = "vldo28";
+                regulator-min-microvolt = <2800000>;
+                regulator-max-microvolt = <3000000>;
+                regulator-enable-ramp-delay = <270>;
+            };
+
+            ldo_vaud28 {
+                regulator-name = "vaud28";
+                regulator-min-microvolt = <2800000>;
+                regulator-max-microvolt = <2800000>;
+                regulator-enable-ramp-delay = <270>;
+            };
+
+            ldo_vsim2 {
+                regulator-name = "vsim2";
+                regulator-min-microvolt = <1700000>;
+                regulator-max-microvolt = <3100000>;
+                regulator-enable-ramp-delay = <540>;
+            };
+        };
+
+        rtc {
+            compatible = "mediatek,mt6358-rtc";
+        };
+
+        keys {
+            compatible = "mediatek,mt6358-keys";
+            power {
+                linux,keycodes = <KEY_POWER>;
+                wakeup-source;
+            };
+            home {
+                linux,keycodes = <KEY_HOME>;
+            };
+        };
+    };
+
+  - |
+    #include <dt-bindings/interrupt-controller/arm-gic.h>
+
+    pmic {
+        compatible = "mediatek,mt6397";
+
+        interrupt-parent = <&pio>;
+        interrupts-extended = <&pio 222 IRQ_TYPE_LEVEL_HIGH>;
+        interrupt-controller;
+        #interrupt-cells = <2>;
+
+        audio-codec {
+            compatible = "mediatek,mt6397-codec";
+        };
+
+        clocks {
+            compatible = "mediatek,mt6397-clk";
+            #clock-cells = <1>;
+        };
+
+        pinctrl {
+            compatible = "mediatek,mt6397-pinctrl";
+            gpio-controller;
+            #gpio-cells = <2>;
+        };
+
+        regulators {
+            compatible = "mediatek,mt6397-regulator";
+
+            buck_vpca15 {
+                regulator-name = "vpca15";
+                regulator-min-microvolt = < 850000>;
+                regulator-max-microvolt = <1350000>;
+                regulator-ramp-delay = <12500>;
+                regulator-enable-ramp-delay = <200>;
+            };
+
+            buck_vpca7 {
+                regulator-name = "vpca7";
+                regulator-min-microvolt = < 850000>;
+                regulator-max-microvolt = <1350000>;
+                regulator-ramp-delay = <12500>;
+                regulator-enable-ramp-delay = <115>;
+            };
+
+            buck_vsramca15 {
+                regulator-name = "vsramca15";
+                regulator-min-microvolt = < 850000>;
+                regulator-max-microvolt = <1350000>;
+                regulator-ramp-delay = <12500>;
+                regulator-enable-ramp-delay = <115>;
+            };
+
+            buck_vsramca7 {
+                regulator-name = "vsramca7";
+                regulator-min-microvolt = < 850000>;
+                regulator-max-microvolt = <1350000>;
+                regulator-ramp-delay = <12500>;
+                regulator-enable-ramp-delay = <115>;
+            };
+
+            buck_vcore {
+                regulator-name = "vcore";
+                regulator-min-microvolt = < 850000>;
+                regulator-max-microvolt = <1350000>;
+                regulator-ramp-delay = <12500>;
+                regulator-enable-ramp-delay = <115>;
+            };
+
+            buck_vgpu {
+                regulator-name = "vgpu";
+                regulator-min-microvolt = < 700000>;
+                regulator-max-microvolt = <1350000>;
+                regulator-ramp-delay = <12500>;
+                regulator-enable-ramp-delay = <115>;
+            };
+
+            buck_vdrm {
+                regulator-name = "vdrm";
+                regulator-min-microvolt = < 800000>;
+                regulator-max-microvolt = <1400000>;
+                regulator-ramp-delay = <12500>;
+                regulator-enable-ramp-delay = <500>;
+            };
+
+            buck_vio18 {
+                regulator-name = "vio18";
+                regulator-min-microvolt = <1500000>;
+                regulator-max-microvolt = <2120000>;
+                regulator-ramp-delay = <12500>;
+                regulator-enable-ramp-delay = <500>;
+            };
+
+            ldo_vtcxo {
+                regulator-name = "vtcxo";
+                regulator-min-microvolt = <2800000>;
+                regulator-max-microvolt = <2800000>;
+                regulator-enable-ramp-delay = <90>;
+            };
+
+            ldo_va28 {
+                regulator-name = "va28";
+                /* fixed output 2.8 V */
+                regulator-enable-ramp-delay = <218>;
+            };
+
+            ldo_vcama {
+                regulator-name = "vcama";
+                regulator-min-microvolt = <1500000>;
+                regulator-max-microvolt = <2800000>;
+                regulator-enable-ramp-delay = <218>;
+            };
+
+            ldo_vio28 {
+                regulator-name = "vio28";
+                /* fixed output 2.8 V */
+                regulator-enable-ramp-delay = <240>;
+            };
+
+            ldo_vusb {
+                regulator-name = "vusb";
+                /* fixed output 3.3 V */
+                regulator-enable-ramp-delay = <218>;
+            };
+
+            ldo_vmc {
+                regulator-name = "vmc";
+                regulator-min-microvolt = <1800000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <218>;
+            };
+
+            ldo_vmch {
+                regulator-name = "vmch";
+                regulator-min-microvolt = <3000000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <218>;
+            };
+
+            ldo_vemc3v3 {
+                regulator-name = "vemc_3v3";
+                regulator-min-microvolt = <3000000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <218>;
+            };
+
+            ldo_vgp1 {
+                regulator-name = "vcamd";
+                regulator-min-microvolt = <1220000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <240>;
+            };
+
+            ldo_vgp2 {
+                regulator-name = "vcamio";
+                regulator-min-microvolt = <1000000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <218>;
+            };
+
+            ldo_vgp3 {
+                regulator-name = "vcamaf";
+                regulator-min-microvolt = <1200000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <218>;
+            };
+
+            ldo_vgp4 {
+                regulator-name = "vgp4";
+                regulator-min-microvolt = <1200000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <218>;
+            };
+
+            ldo_vgp5 {
+                regulator-name = "vgp5";
+                regulator-min-microvolt = <1200000>;
+                regulator-max-microvolt = <3000000>;
+                regulator-enable-ramp-delay = <218>;
+            };
+
+            ldo_vgp6 {
+                regulator-name = "vgp6";
+                regulator-min-microvolt = <1200000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <218>;
+            };
+
+            ldo_vibr {
+                regulator-name = "vibr";
+                regulator-min-microvolt = <1200000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <218>;
+            };
+        };
+
+        rtc {
+            compatible = "mediatek,mt6397-rtc";
+        };
+    };
diff --git a/Documentation/devicetree/bindings/mfd/mt6397.txt b/Documentation/devicetree/bindings/mfd/mt6397.txt
deleted file mode 100644
index 10540aa..0000000
--- a/Documentation/devicetree/bindings/mfd/mt6397.txt
+++ /dev/null
@@ -1,110 +0,0 @@
-MediaTek MT6397/MT6323 Multifunction Device Driver
-
-MT6397/MT6323 is a multifunction device with the following sub modules:
-- Regulator
-- RTC
-- Audio codec
-- GPIO
-- Clock
-- LED
-- Keys
-- Power controller
-
-It is interfaced to host controller using SPI interface by a proprietary hardware
-called PMIC wrapper or pwrap. MT6397/MT6323 MFD is a child device of pwrap.
-See the following for pwarp node definitions:
-../soc/mediatek/mediatek,pwrap.yaml
-
-This document describes the binding for MFD device and its sub module.
-
-Required properties:
-compatible:
-	"mediatek,mt6323" for PMIC MT6323
-	"mediatek,mt6331" for PMIC MT6331 and MT6332
-	"mediatek,mt6357" for PMIC MT6357
-	"mediatek,mt6358" for PMIC MT6358
-	"mediatek,mt6359" for PMIC MT6359
-	"mediatek,mt6366", "mediatek,mt6358" for PMIC MT6366
-	"mediatek,mt6397" for PMIC MT6397
-
-Optional subnodes:
-
-- rtc
-	Required properties: Should be one of follows
-		- compatible: "mediatek,mt6323-rtc"
-		- compatible: "mediatek,mt6331-rtc"
-		- compatible: "mediatek,mt6358-rtc"
-		- compatible: "mediatek,mt6397-rtc"
-	For details, see ../rtc/rtc-mt6397.txt
-- regulators
-	Required properties:
-		- compatible: "mediatek,mt6323-regulator"
-	see ../regulator/mt6323-regulator.txt
-		- compatible: "mediatek,mt6358-regulator"
-		- compatible: "mediatek,mt6366-regulator", "mediatek-mt6358-regulator"
-	see ../regulator/mt6358-regulator.txt
-		- compatible: "mediatek,mt6397-regulator"
-	see ../regulator/mt6397-regulator.txt
-- codec
-	Required properties:
-		- compatible: "mediatek,mt6397-codec" or "mediatek,mt6358-sound"
-- clk
-	Required properties:
-		- compatible: "mediatek,mt6397-clk"
-- led
-	Required properties:
-		- compatible: "mediatek,mt6323-led"
-	see ../leds/leds-mt6323.txt
-
-- keys
-	Required properties: Should be one of the following
-		- compatible: "mediatek,mt6323-keys"
-		- compatible: "mediatek,mt6331-keys"
-		- compatible: "mediatek,mt6397-keys"
-	see ../input/mtk-pmic-keys.txt
-
-- power-controller
-	Required properties:
-		- compatible: "mediatek,mt6323-pwrc"
-	For details, see ../power/reset/mt6323-poweroff.txt
-
-- pin-controller
-	Required properties:
-		- compatible: "mediatek,mt6397-pinctrl"
-	For details, see ../pinctrl/pinctrl-mt65xx.txt
-
-Example:
-	pwrap: pwrap at 1000f000 {
-		compatible = "mediatek,mt8135-pwrap";
-
-		...
-
-		pmic {
-			compatible = "mediatek,mt6397";
-
-			codec: mt6397codec {
-				compatible = "mediatek,mt6397-codec";
-			};
-
-			regulators {
-				compatible = "mediatek,mt6397-regulator";
-
-				mt6397_vpca15_reg: buck_vpca15 {
-					regulator-compatible = "buck_vpca15";
-					regulator-name = "vpca15";
-					regulator-min-microvolt = <850000>;
-					regulator-max-microvolt = <1400000>;
-					regulator-ramp-delay = <12500>;
-					regulator-always-on;
-				};
-
-				mt6397_vgp4_reg: ldo_vgp4 {
-					regulator-compatible = "ldo_vgp4";
-					regulator-name = "vgp4";
-					regulator-min-microvolt = <1200000>;
-					regulator-max-microvolt = <3300000>;
-					regulator-enable-ramp-delay = <218>;
-				};
-			};
-		};
-	};
diff --git a/Documentation/devicetree/bindings/power/reset/mt6323-poweroff.txt b/Documentation/devicetree/bindings/power/reset/mt6323-poweroff.txt
deleted file mode 100644
index 933f0c4..0000000
--- a/Documentation/devicetree/bindings/power/reset/mt6323-poweroff.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-Device Tree Bindings for Power Controller on MediaTek PMIC
-
-The power controller which could be found on PMIC is responsible for externally
-powering off or on the remote MediaTek SoC through the circuit BBPU.
-
-Required properties:
-- compatible: Should be one of follows
-       "mediatek,mt6323-pwrc": for MT6323 PMIC
-
-Example:
-
-       pmic {
-               compatible = "mediatek,mt6323";
-
-               ...
-
-               power-controller {
-                       compatible = "mediatek,mt6323-pwrc";
-               };
-       }
diff --git a/Documentation/devicetree/bindings/rtc/rtc-mt6397.txt b/Documentation/devicetree/bindings/rtc/rtc-mt6397.txt
deleted file mode 100644
index 7212076..0000000
--- a/Documentation/devicetree/bindings/rtc/rtc-mt6397.txt
+++ /dev/null
@@ -1,31 +0,0 @@
-Device-Tree bindings for MediaTek PMIC based RTC
-
-MediaTek PMIC based RTC is an independent function of MediaTek PMIC that works
-as a type of multi-function device (MFD). The RTC can be configured and set up
-with PMIC wrapper bus which is a common resource shared with the other
-functions found on the same PMIC.
-
-For MediaTek PMIC MFD bindings, see:
-../mfd/mt6397.txt
-
-For MediaTek PMIC wrapper bus bindings, see:
-../soc/mediatek/pwrap.txt
-
-Required properties:
-- compatible: Should be one of follows
-       "mediatek,mt6323-rtc": for MT6323 PMIC
-       "mediatek,mt6358-rtc": for MT6358 PMIC
-       "mediatek,mt6366-rtc", "mediatek,mt6358-rtc": for MT6366 PMIC
-       "mediatek,mt6397-rtc": for MT6397 PMIC
-
-Example:
-
-       pmic {
-               compatible = "mediatek,mt6323";
-
-               ...
-
-               rtc {
-                       compatible = "mediatek,mt6323-rtc";
-               };
-       };
diff --git a/Documentation/devicetree/bindings/sound/mt6358.txt b/Documentation/devicetree/bindings/sound/mt6358.txt
deleted file mode 100644
index fbe9e55..0000000
--- a/Documentation/devicetree/bindings/sound/mt6358.txt
+++ /dev/null
@@ -1,26 +0,0 @@
-Mediatek MT6358 Audio Codec
-
-The communication between MT6358 and SoC is through Mediatek PMIC wrapper.
-For more detail, please visit Mediatek PMIC wrapper documentation.
-
-Must be a child node of PMIC wrapper.
-
-Required properties:
-
-- compatible - "string" - One of:
-    "mediatek,mt6358-sound"
-    "mediatek,mt6366-sound"
-- Avdd-supply : power source of AVDD
-
-Optional properties:
-- mediatek,dmic-mode : Indicates how many data pins are used to transmit two
-	channels of PDM signal. 0 means two wires, 1 means one wire. Default
-	value is 0.
-
-Example:
-
-mt6358_snd {
-	compatible = "mediatek,mt6358-sound";
-	Avdd-supply = <&mt6358_vaud28_reg>;
-	mediatek,dmic-mode = <0>;
-};
diff --git a/MAINTAINERS b/MAINTAINERS
index 0a3d9e1..003f096 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -14365,10 +14365,12 @@ F:	Documentation/devicetree/bindings/net/bluetooth/mediatek,mt7921s-bluetooth.ya
 F:	drivers/bluetooth/btmtkuart.c
 
 MEDIATEK BOARD LEVEL SHUTDOWN DRIVERS
+M:	Sen Chu <sen.chu at mediatek.com>
 M:	Sean Wang <sean.wang at mediatek.com>
+M:	Macpaul Lin <macpaul.lin at mediatek.com>
 L:	linux-pm at vger.kernel.org
 S:	Maintained
-F:	Documentation/devicetree/bindings/power/reset/mt6323-poweroff.txt
+F:	Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml
 F:	drivers/power/reset/mt6323-poweroff.c
 
 MEDIATEK CIR DRIVER
@@ -14529,9 +14531,11 @@ F:	Documentation/devicetree/bindings/mtd/mediatek,mtk-nfc.yaml
 F:	drivers/mtd/nand/raw/mtk_*
 
 MEDIATEK PMIC LED DRIVER
+M:	Sen Chu <sen.chu at mediatek.com>
 M:	Sean Wang <sean.wang at mediatek.com>
+M:	Macpaul Lin <macpaul.lin at mediatek.com>
 S:	Maintained
-F:	Documentation/devicetree/bindings/leds/leds-mt6323.txt
+F:	Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml
 F:	drivers/leds/leds-mt6323.c
 
 MEDIATEK RANDOM NUMBER GENERATOR SUPPORT
-- 
2.45.2



From macpaul.lin at mediatek.com  Sat Sep 14 06:28:32 2024
From: macpaul.lin at mediatek.com (Macpaul Lin)
Date: Sat, 14 Sep 2024 21:28:32 +0800
Subject: [PATCH v4 3/3] regulator: dt-bindings: mt6397: move examples to parent PMIC mt6397
Message-ID: <20240914132833.9882-1-macpaul.lin@mediatek.com>

Since the DT schema of multiple function PMIC mt6397 has been converted,
move the examples in "mediatek,mt6397-regulator.yaml" to the parent schema
"mediatek,mt6397.yaml".

Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
---
 .../regulator/mediatek,mt6397-regulator.yaml  | 173 ------------------
 1 file changed, 173 deletions(-)

Changes for v1 and v2:
 - This is the first version of converting rtc-mt6397.txt.
   This is because converting rtc-mt6397 together
   with mfd/mediatek,mt6397.yaml, so we've create a patch set
   instead of submitting single patch for each subdevice.
 - This patch has been made base on linux-next/master git repo.

Changes for v3:
 - Re-order this patch since other patches for removing text DT bindings
   in v2 qill be squash into MFD patch.

Changes for v4:
 - No change.

diff --git a/Documentation/devicetree/bindings/regulator/mediatek,mt6397-regulator.yaml b/Documentation/devicetree/bindings/regulator/mediatek,mt6397-regulator.yaml
index 50db678..337ac58 100644
--- a/Documentation/devicetree/bindings/regulator/mediatek,mt6397-regulator.yaml
+++ b/Documentation/devicetree/bindings/regulator/mediatek,mt6397-regulator.yaml
@@ -63,176 +63,3 @@ required:
 
 additionalProperties: false
 
-examples:
-  - |
-    #include <dt-bindings/interrupt-controller/arm-gic.h>
-
-    mt6397_regulators: regulators {
-        compatible = "mediatek,mt6397-regulator";
-
-        mt6397_vpca15_reg: buck_vpca15 {
-            regulator-name = "vpca15";
-            regulator-min-microvolt = < 850000>;
-            regulator-max-microvolt = <1350000>;
-            regulator-ramp-delay = <12500>;
-            regulator-enable-ramp-delay = <200>;
-        };
-
-        mt6397_vpca7_reg: buck_vpca7 {
-            regulator-name = "vpca7";
-            regulator-min-microvolt = < 850000>;
-            regulator-max-microvolt = <1350000>;
-            regulator-ramp-delay = <12500>;
-            regulator-enable-ramp-delay = <115>;
-        };
-
-        mt6397_vsramca15_reg: buck_vsramca15 {
-            regulator-name = "vsramca15";
-            regulator-min-microvolt = < 850000>;
-            regulator-max-microvolt = <1350000>;
-            regulator-ramp-delay = <12500>;
-            regulator-enable-ramp-delay = <115>;
-        };
-
-        mt6397_vsramca7_reg: buck_vsramca7 {
-            regulator-name = "vsramca7";
-            regulator-min-microvolt = < 850000>;
-            regulator-max-microvolt = <1350000>;
-            regulator-ramp-delay = <12500>;
-            regulator-enable-ramp-delay = <115>;
-        };
-
-        mt6397_vcore_reg: buck_vcore {
-            regulator-name = "vcore";
-            regulator-min-microvolt = < 850000>;
-            regulator-max-microvolt = <1350000>;
-            regulator-ramp-delay = <12500>;
-            regulator-enable-ramp-delay = <115>;
-        };
-
-        mt6397_vgpu_reg: buck_vgpu {
-            regulator-name = "vgpu";
-            regulator-min-microvolt = < 700000>;
-            regulator-max-microvolt = <1350000>;
-            regulator-ramp-delay = <12500>;
-            regulator-enable-ramp-delay = <115>;
-        };
-
-        mt6397_vdrm_reg: buck_vdrm {
-            regulator-name = "vdrm";
-            regulator-min-microvolt = < 800000>;
-            regulator-max-microvolt = <1400000>;
-            regulator-ramp-delay = <12500>;
-            regulator-enable-ramp-delay = <500>;
-        };
-
-        mt6397_vio18_reg: buck_vio18 {
-            regulator-name = "vio18";
-            regulator-min-microvolt = <1500000>;
-            regulator-max-microvolt = <2120000>;
-            regulator-ramp-delay = <12500>;
-            regulator-enable-ramp-delay = <500>;
-        };
-
-        mt6397_vtcxo_reg: ldo_vtcxo {
-            regulator-name = "vtcxo";
-            regulator-min-microvolt = <2800000>;
-            regulator-max-microvolt = <2800000>;
-            regulator-enable-ramp-delay = <90>;
-        };
-
-        mt6397_va28_reg: ldo_va28 {
-            regulator-name = "va28";
-            /* fixed output 2.8 V */
-            regulator-enable-ramp-delay = <218>;
-        };
-
-        mt6397_vcama_reg: ldo_vcama {
-            regulator-name = "vcama";
-            regulator-min-microvolt = <1500000>;
-            regulator-max-microvolt = <2800000>;
-            regulator-enable-ramp-delay = <218>;
-        };
-
-        mt6397_vio28_reg: ldo_vio28 {
-            regulator-name = "vio28";
-            /* fixed output 2.8 V */
-            regulator-enable-ramp-delay = <240>;
-        };
-
-        mt6397_usb_reg: ldo_vusb {
-            regulator-name = "vusb";
-            /* fixed output 3.3 V */
-            regulator-enable-ramp-delay = <218>;
-        };
-
-        mt6397_vmc_reg: ldo_vmc {
-            regulator-name = "vmc";
-            regulator-min-microvolt = <1800000>;
-            regulator-max-microvolt = <3300000>;
-            regulator-enable-ramp-delay = <218>;
-        };
-
-        mt6397_vmch_reg: ldo_vmch {
-            regulator-name = "vmch";
-            regulator-min-microvolt = <3000000>;
-            regulator-max-microvolt = <3300000>;
-            regulator-enable-ramp-delay = <218>;
-        };
-
-        mt6397_vemc_3v3_reg: ldo_vemc3v3 {
-            regulator-name = "vemc_3v3";
-            regulator-min-microvolt = <3000000>;
-            regulator-max-microvolt = <3300000>;
-            regulator-enable-ramp-delay = <218>;
-        };
-
-        mt6397_vgp1_reg: ldo_vgp1 {
-            regulator-name = "vcamd";
-            regulator-min-microvolt = <1220000>;
-            regulator-max-microvolt = <3300000>;
-            regulator-enable-ramp-delay = <240>;
-        };
-
-        mt6397_vgp2_reg: ldo_vgp2 {
-            regulator-name = "vcamio";
-            regulator-min-microvolt = <1000000>;
-            regulator-max-microvolt = <3300000>;
-            regulator-enable-ramp-delay = <218>;
-        };
-
-        mt6397_vgp3_reg: ldo_vgp3 {
-            regulator-name = "vcamaf";
-            regulator-min-microvolt = <1200000>;
-            regulator-max-microvolt = <3300000>;
-            regulator-enable-ramp-delay = <218>;
-        };
-
-        mt6397_vgp4_reg: ldo_vgp4 {
-            regulator-name = "vgp4";
-            regulator-min-microvolt = <1200000>;
-            regulator-max-microvolt = <3300000>;
-            regulator-enable-ramp-delay = <218>;
-        };
-
-        mt6397_vgp5_reg: ldo_vgp5 {
-            regulator-name = "vgp5";
-            regulator-min-microvolt = <1200000>;
-            regulator-max-microvolt = <3000000>;
-            regulator-enable-ramp-delay = <218>;
-        };
-
-        mt6397_vgp6_reg: ldo_vgp6 {
-            regulator-name = "vgp6";
-            regulator-min-microvolt = <1200000>;
-            regulator-max-microvolt = <3300000>;
-            regulator-enable-ramp-delay = <218>;
-        };
-
-        mt6397_vibr_reg: ldo_vibr {
-            regulator-name = "vibr";
-            regulator-min-microvolt = <1200000>;
-            regulator-max-microvolt = <3300000>;
-            regulator-enable-ramp-delay = <218>;
-        };
-    };
-- 
2.45.2



From robh at kernel.org  Sat Sep 14 07:28:42 2024
From: robh at kernel.org (Rob Herring (Arm))
Date: Sat, 14 Sep 2024 09:28:42 -0500
Subject: [PATCH v4 2/3] dt-bindings: mfd: mediatek: mt6397: Convert to
 DT schema format
In-Reply-To: <20240914132811.9637-1-macpaul.lin@mediatek.com>
References: <20240914132811.9637-1-macpaul.lin@mediatek.com>
Message-ID: <172632412216.3158459.14043151462487699502.robh@kernel.org>


On Sat, 14 Sep 2024 21:28:11 +0800, Macpaul Lin wrote:
> Convert the mfd: mediatek: mt6397 binding to DT schema format.
> 
> MT6323, MT6358, and MT6397 are PMIC devices with multiple function
> subdevices. They share a common PMIC design but have variations in
> subdevice combinations.
> 
> Key updates in this conversion:
> 
> 1. RTC:
>    - Convert rtc-mt6397.txt and merge into parent MT6397 PMIC DT schema.
> 
> 2. Regulators:
>    - Align to generic name "regulators".
>    - Update references from .txt to .yaml for mt6323, mt6358, and mt6397
>      regulators.
>    - Simplify regulator name labels in device tree examples.
> 
> 3. Audio Codec:
>    - Convert sound/mt6358.txt and merge into parent MT6397 PMIC DT schema.
>    - Align to generic name "audio-codec" for codec and sound subdevices.
>    - Add "mediatek,dmic-mode" and "Avdd-supply" properties.
> 
> 4. Clocks:
>    - Align to generic name "clocks" for clockbuffer subdevices.
> 
> 5. LEDs:
>    - Convert leds-mt6323.txt and merge into parent MT6397 PMIC DT schema.
>    - Update LED binding.
> 
> 6. Keys:
>    - Add detailed descriptions for power and home keys.
>    - Add compatible: mediatek,mt6358-keys.
> 
> 7. Power Controller:
>    - Convert mt6323-poweroff.txt and merge into parent MT6397 PMIC DT
>      schema.
>    - Add #power-domain-cells property to fix dt-binding check error.
>    - Clarify "BBPU" as "Baseband power up".
> 
> 8. Pinctrl:
>    - Align to generic name "pinctrl" instead of "pin-controller".
> 
> 9. Compatible:
>    - Drop "mediatek,mt6357" since there is a separated DT Schema
>      for PMIC MT6357.
> 
> Additional updates:
> - MAINTAINERS: Add co-maintainers and reference to
>   mfd/mediatek,mt6397.yaml for LED and power-controller drivers.
> - input/mediatek,pmic-keys.yaml: Update reference to
>   mfd/mediatek,mt6397.yaml.
> 
> Signed-off-by: Sen Chu <sen.chu at mediatek.com>
> Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
> ---
>  .../bindings/input/mediatek,pmic-keys.yaml    |    2 +-
>  .../devicetree/bindings/leds/leds-mt6323.txt  |   63 -
>  .../bindings/mfd/mediatek,mt6397.yaml         | 1077 +++++++++++++++++
>  .../devicetree/bindings/mfd/mt6397.txt        |  110 --
>  .../bindings/power/reset/mt6323-poweroff.txt  |   20 -
>  .../devicetree/bindings/rtc/rtc-mt6397.txt    |   31 -
>  .../devicetree/bindings/sound/mt6358.txt      |   26 -
>  MAINTAINERS                                   |    8 +-
>  8 files changed, 1084 insertions(+), 253 deletions(-)
>  delete mode 100644 Documentation/devicetree/bindings/leds/leds-mt6323.txt
>  create mode 100644 Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml
>  delete mode 100644 Documentation/devicetree/bindings/mfd/mt6397.txt
>  delete mode 100644 Documentation/devicetree/bindings/power/reset/mt6323-poweroff.txt
>  delete mode 100644 Documentation/devicetree/bindings/rtc/rtc-mt6397.txt
>  delete mode 100644 Documentation/devicetree/bindings/sound/mt6358.txt
> 
> Changes for v1:
>  - This patch depends on conversion of mediatek,mt6397-regulator.yaml
>    [1] https://lore.kernel.org/lkml/20240807091738.18387-1-macpaul.lin at mediatek.com/T/
> 
> Changes for v2:
>  - This patch has been made base on linux-next/master git repo.
>  - Keep the parent and child relationship with mediatek,pwrap in description.
>    [2] https://lore.kernel.org/all/20240826-slurp-earphone-0d5173923ae8 at spud/
>  - Keep the $ref for regulators since dt_binding_check didn't report any issue
>    based on linux-next/master repo.
>  - Fix description of mt6397/mt6323 devices, use "power management chip"
>    instead of "multifunction device"
>  - Drop unnecessary comments or description according to the review.
>  - Convert sub-modules to DT Schema:
>   - RTC, LEDs, power-controllers, regulators
>  - Drop duplicate sub node name and description for sub-modules
>   - RTC, Keys
>  - examples:
>   - drop parent pwrap node
>   - Add examples from mediatek,mt6323-regulator.yaml
>   - Add examples from mediatek,mt6358-regulator.yaml
>   - Add examples from mediatek,mt6397-regulator.yaml
>   - Complete the examples as could as possible.
> 
> Changes for v3:
>  - Rebased on linux-next/master git repo near next-20240906.
>  - Revise commit message.
>  - Regulators:
>   - Use "additionalProperties: true" and add "contains" for matching
>     $ref DT bindings.
>   - Simplify regulator name labels in device tree examples.
>  - LEDs:
>   - Use LED bindings.
>  - Squash following patches in v2 for removing old text format DT bindings
>    into this patch, includes:
>   - leds-mt6323.txt, mt6323-poweroff.txt, rtc-mt6397.txt, sound/mt6358.txt.
>  - Fix file format of DT schemas, add blank between properties.
>  - Fix 'make checkrefdoc' errors, update reference in mediatek,pmic-keys.yaml.
> 
> Changes for v4:
>  - Remove "mediatek,mt6357" from PMIC's compatible string since there is a
>    seperated DT schema for PMIC mt6357.
> 

My bot found errors running 'make dt_binding_check' on your patch:

yamllint warnings/errors:

dtschema/dtc warnings/errors:
/builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/mfd/mediatek,mt6397.example.dtb: pmic: regulators: False schema does not allow {'compatible': ['mediatek,mt6323-regulator'], 'buck_vproc': {'regulator-name': ['vproc'], 'regulator-min-microvolt': [[700000]], 'regulator-max-microvolt': [[1350000]], 'regulator-ramp-delay': 12500, 'regulator-always-on': True, 'regulator-boot-on': True}, 'buck_vsys': {'regulator-name': ['vsys'], 'regulator-min-microvolt': [[1400000]], 'regulator-max-microvolt': [[2987500]], 'regulator-ramp-delay': 25000, 'regulator-always-on': True, 'regulator-boot-on': True}, 'buck_vpa': {'regulator-name': ['vpa'], 'regulator-min-microvolt': [[500000]], 'regulator-max-microvolt': [[3650000]]}, 'ldo_vtcxo': {'regulator-name': ['vtcxo'], 'regulator-min-microvolt': [[2800000]], 'regulator-max-microvolt': [[2800000]], 'regulator-enable-ramp-delay': 90, 'regulator-always-on': True, 'regulator-boot-on': True}, 'ldo_vcn28': {'regulator-name': ['vcn28'], 'r
 egulator-min-microvolt': [[2800000]], 'regulator-max-microvolt': [[2800000]], 'regulator-enable-ramp-delay': 185}, 'ldo_vcn33_bt': {'regulator-name': ['vcn33_bt'], 'regulator-min-microvolt': [[3300000]], 'regulator-max-microvolt': [[3600000]], 'regulator-enable-ramp-delay': 185}, 'ldo_vcn33_wifi': {'regulator-name': ['vcn33_wifi'], 'regulator-min-microvolt': [[3300000]], 'regulator-max-microvolt': [[3600000]], 'regulator-enable-ramp-delay': 185}, 'ldo_va': {'regulator-name': ['va'], 'regulator-min-microvolt': [[2800000]], 'regulator-max-microvolt': [[2800000]], 'regulator-enable-ramp-delay': 216, 'regulator-always-on': True, 'regulator-boot-on': True}, 'ldo_vcama': {'regulator-name': ['vcama'], 'regulator-min-microvolt': [[1500000]], 'regulator-max-microvolt': [[2800000]], 'regulator-enable-ramp-delay': 216}, 'ldo_vio28': {'regulator-name': ['vio28'], 'regulator-min-microvolt': [[2800000]], 'regulator-max-microvolt': [[2800000]], 'regulator-enable-ramp-delay': 216, 'regulator-always
 -on': True, 'regulator-boot-on': True}, 'ldo_vusb': {'regulator-name': ['vusb'], 'regulator-min-microvolt': [[3300000]], 'regulator-max-microvolt': [[3300000]], 'regulator-enable-ramp-delay': 216, 'regulator-boot-on': True}, 'ldo_vmc': {'regulator-name': ['vmc'], 'regulator-min-microvolt': [[1800000]], 'regulator-max-microvolt': [[3300000]], 'regulator-enable-ramp-delay': 36, 'regulator-boot-on': True}, 'ldo_vmch': {'regulator-name': ['vmch'], 'regulator-min-microvolt': [[3000000]], 'regulator-max-microvolt': [[3300000]], 'regulator-enable-ramp-delay': 36, 'regulator-boot-on': True}, 'ldo_vemc3v3': {'regulator-name': ['vemc3v3'], 'regulator-min-microvolt': [[3000000]], 'regulator-max-microvolt': [[3300000]], 'regulator-enable-ramp-delay': 36, 'regulator-boot-on': True}, 'ldo_vgp1': {'regulator-name': ['vgp1'], 'regulator-min-microvolt': [[1200000]], 'regulator-max-microvolt': [[3300000]], 'regulator-enable-ramp-delay': 216}, 'ldo_vgp2': {'regulator-name': ['vgp2'], 'regulator-min-mi
 crovolt': [[1200000]], 'regulator-max-microvolt': [[3000000]], 'regulator-enable-ramp-delay': 216}, 'ldo_vgp3': {'regulator-name': ['vgp3'], 'regulator-min-microvolt': [[1200000]], 'regulator-max-microvolt': [[1800000]], 'regulator-enable-ramp-delay': 216}, 'ldo_vcn18': {'regulator-name': ['vcn18'], 'regulator-min-microvolt': [[1800000]], 'regulator-max-microvolt': [[1800000]], 'regulator-enable-ramp-delay': 216}, 'ldo_vsim1': {'regulator-name': ['vsim1'], 'regulator-min-microvolt': [[1800000]], 'regulator-max-microvolt': [[3000000]], 'regulator-enable-ramp-delay': 216}, 'ldo_vsim2': {'regulator-name': ['vsim2'], 'regulator-min-microvolt': [[1800000]], 'regulator-max-microvolt': [[3000000]], 'regulator-enable-ramp-delay': 216}, 'ldo_vrtc': {'regulator-name': ['vrtc'], 'regulator-min-microvolt': [[2800000]], 'regulator-max-microvolt': [[2800000]], 'regulator-always-on': True, 'regulator-boot-on': True}, 'ldo_vcamaf': {'regulator-name': ['vcamaf'], 'regulator-min-microvolt': [[1200000
 ]], 'regulator-max-microvolt': [[3300000]], 'regulator-enable-ramp-delay': 216}, 'ldo_vibr': {'regulator-name': ['vibr'], 'regulator-min-microvolt': [[1200000]], 'regulator-max-microvolt': [[3300000]], 'regulator-enable-ramp-delay': 36}, 'ldo_vrf18': {'regulator-name': ['vrf18'], 'regulator-min-microvolt': [[1825000]], 'regulator-max-microvolt': [[1825000]], 'regulator-enable-ramp-delay': 187}, 'ldo_vm': {'regulator-name': ['vm'], 'regulator-min-microvolt': [[1200000]], 'regulator-max-microvolt': [[1800000]], 'regulator-enable-ramp-delay': 216, 'regulator-always-on': True, 'regulator-boot-on': True}, 'ldo_vio18': {'regulator-name': ['vio18'], 'regulator-min-microvolt': [[1800000]], 'regulator-max-microvolt': [[1800000]], 'regulator-enable-ramp-delay': 216, 'regulator-always-on': True, 'regulator-boot-on': True}, 'ldo_vcamd': {'regulator-name': ['vcamd'], 'regulator-min-microvolt': [[1200000]], 'regulator-max-microvolt': [[1800000]], 'regulator-enable-ramp-delay': 216}, 'ldo_vcamio':
  {'regulator-name': ['vcamio'], 'regulator-min-microvolt': [[1800000]], 'regulator-max-microvolt': [[1800000]], 'regulator-enable-ramp-delay': 216}}
	from schema $id: http://devicetree.org/schemas/mfd/mediatek,mt6397.yaml#
/builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/mfd/mediatek,mt6397.example.dtb: pmic: regulators: False schema does not allow {'compatible': ['mediatek,mt6397-regulator'], 'buck_vpca15': {'regulator-name': ['vpca15'], 'regulator-min-microvolt': [[850000]], 'regulator-max-microvolt': [[1350000]], 'regulator-ramp-delay': 12500, 'regulator-enable-ramp-delay': 200}, 'buck_vpca7': {'regulator-name': ['vpca7'], 'regulator-min-microvolt': [[850000]], 'regulator-max-microvolt': [[1350000]], 'regulator-ramp-delay': 12500, 'regulator-enable-ramp-delay': 115}, 'buck_vsramca15': {'regulator-name': ['vsramca15'], 'regulator-min-microvolt': [[850000]], 'regulator-max-microvolt': [[1350000]], 'regulator-ramp-delay': 12500, 'regulator-enable-ramp-delay': 115}, 'buck_vsramca7': {'regulator-name': ['vsramca7'], 'regulator-min-microvolt': [[850000]], 'regulator-max-microvolt': [[1350000]], 'regulator-ramp-delay': 12500, 'regulator-enable-ramp-delay': 115}, 'buck_vcore': {'regul
 ator-name': ['vcore'], 'regulator-min-microvolt': [[850000]], 'regulator-max-microvolt': [[1350000]], 'regulator-ramp-delay': 12500, 'regulator-enable-ramp-delay': 115}, 'buck_vgpu': {'regulator-name': ['vgpu'], 'regulator-min-microvolt': [[700000]], 'regulator-max-microvolt': [[1350000]], 'regulator-ramp-delay': 12500, 'regulator-enable-ramp-delay': 115}, 'buck_vdrm': {'regulator-name': ['vdrm'], 'regulator-min-microvolt': [[800000]], 'regulator-max-microvolt': [[1400000]], 'regulator-ramp-delay': 12500, 'regulator-enable-ramp-delay': 500}, 'buck_vio18': {'regulator-name': ['vio18'], 'regulator-min-microvolt': [[1500000]], 'regulator-max-microvolt': [[2120000]], 'regulator-ramp-delay': 12500, 'regulator-enable-ramp-delay': 500}, 'ldo_vtcxo': {'regulator-name': ['vtcxo'], 'regulator-min-microvolt': [[2800000]], 'regulator-max-microvolt': [[2800000]], 'regulator-enable-ramp-delay': 90}, 'ldo_va28': {'regulator-name': ['va28'], 'regulator-enable-ramp-delay': 218}, 'ldo_vcama': {'regul
 ator-name': ['vcama'], 'regulator-min-microvolt': [[1500000]], 'regulator-max-microvolt': [[2800000]], 'regulator-enable-ramp-delay': 218}, 'ldo_vio28': {'regulator-name': ['vio28'], 'regulator-enable-ramp-delay': 240}, 'ldo_vusb': {'regulator-name': ['vusb'], 'regulator-enable-ramp-delay': 218}, 'ldo_vmc': {'regulator-name': ['vmc'], 'regulator-min-microvolt': [[1800000]], 'regulator-max-microvolt': [[3300000]], 'regulator-enable-ramp-delay': 218}, 'ldo_vmch': {'regulator-name': ['vmch'], 'regulator-min-microvolt': [[3000000]], 'regulator-max-microvolt': [[3300000]], 'regulator-enable-ramp-delay': 218}, 'ldo_vemc3v3': {'regulator-name': ['vemc_3v3'], 'regulator-min-microvolt': [[3000000]], 'regulator-max-microvolt': [[3300000]], 'regulator-enable-ramp-delay': 218}, 'ldo_vgp1': {'regulator-name': ['vcamd'], 'regulator-min-microvolt': [[1220000]], 'regulator-max-microvolt': [[3300000]], 'regulator-enable-ramp-delay': 240}, 'ldo_vgp2': {'regulator-name': ['vcamio'], 'regulator-min-mic
 rovolt': [[1000000]], 'regulator-max-microvolt': [[3300000]], 'regulator-enable-ramp-delay': 218}, 'ldo_vgp3': {'regulator-name': ['vcamaf'], 'regulator-min-microvolt': [[1200000]], 'regulator-max-microvolt': [[3300000]], 'regulator-enable-ramp-delay': 218}, 'ldo_vgp4': {'regulator-name': ['vgp4'], 'regulator-min-microvolt': [[1200000]], 'regulator-max-microvolt': [[3300000]], 'regulator-enable-ramp-delay': 218}, 'ldo_vgp5': {'regulator-name': ['vgp5'], 'regulator-min-microvolt': [[1200000]], 'regulator-max-microvolt': [[3000000]], 'regulator-enable-ramp-delay': 218}, 'ldo_vgp6': {'regulator-name': ['vgp6'], 'regulator-min-microvolt': [[1200000]], 'regulator-max-microvolt': [[3300000]], 'regulator-enable-ramp-delay': 218}, 'ldo_vibr': {'regulator-name': ['vibr'], 'regulator-min-microvolt': [[1200000]], 'regulator-max-microvolt': [[3300000]], 'regulator-enable-ramp-delay': 218}}
	from schema $id: http://devicetree.org/schemas/mfd/mediatek,mt6397.yaml#

doc reference errors (make refcheckdocs):

See https://patchwork.ozlabs.org/project/devicetree-bindings/patch/20240914132811.9637-1-macpaul.lin at mediatek.com

The base for the series is generally the latest rc1. A different dependency
should be noted in *this* patch.

If you already ran 'make dt_binding_check' and didn't see the above
error(s), then make sure 'yamllint' is installed and dt-schema is up to
date:

pip3 install dtschema --upgrade

Please check and re-submit after running the above command yourself. Note
that DT_SCHEMA_FILES can be set to your schema file to speed up checking
your schema. However, it must be unset to test all examples with your schema.



From bvanassche at acm.org  Sat Sep 14 09:13:46 2024
From: bvanassche at acm.org (Bart Van Assche)
Date: Sat, 14 Sep 2024 09:13:46 -0700
Subject: [PATCH v4 2/2] ufs: core: requeue aborted request
In-Reply-To: <04e392c00986ac798e881dcd347ff5045cf61708.camel@mediatek.com>
References: <20240910073035.25974-1-peter.wang@mediatek.com>
 <20240910073035.25974-3-peter.wang@mediatek.com>
 <e42abf07-ba6b-4301-8717-8d5b01d56640@acm.org>
 <04e392c00986ac798e881dcd347ff5045cf61708.camel@mediatek.com>
Message-ID: <9ed20622-c228-499f-80d9-23760e79af1c@acm.org>

On 9/10/24 11:03 PM, Peter Wang (???) wrote:
> This statement is not quite accurate becasue in UFSHIC2.1, SDB mode
> specification already have OCS: ABORTED (0x6) define.

I think I found why that status code is defined in the UFSHCI 2.1
standard. From the UFS 2.0 standard: "TASK ABORTED - This status shall
be returned when a command is aborted by a command or task management
function on another I_T nexus and the Control mode page TAS bit is set
to one. Since in UFS there is only one I_T nexus and TAS bit is zero
TASK ABORTED status codes will never occur."

Bart.



From cristian.ciocaltea at collabora.com  Sat Sep 14 11:04:54 2024
From: cristian.ciocaltea at collabora.com (Cristian Ciocaltea)
Date: Sat, 14 Sep 2024 21:04:54 +0300
Subject: [PATCH 1/4] clk: Provide devm_clk_bulk_get_all_enabled() helper
In-Reply-To: <20240914-clk_bulk_ena_fix-v1-0-ce3537585c06@collabora.com>
References: <20240914-clk_bulk_ena_fix-v1-0-ce3537585c06@collabora.com>
Message-ID: <20240914-clk_bulk_ena_fix-v1-1-ce3537585c06@collabora.com>

Commit 265b07df758a ("clk: Provide managed helper to get and enable bulk
clocks") added devm_clk_bulk_get_all_enable() function, but missed to
return the number of clocks stored in the clk_bulk_data table referenced
by the clks argument.  Without knowing the number, it's not possible to
iterate these clocks when needed, hence the argument is useless and
could have been simply removed.

Introduce devm_clk_bulk_get_all_enabled() variant, which is consistent
with devm_clk_bulk_get_all() in terms of the returned value:

 > 0 if one or more clocks have been stored
 = 0 if there are no clocks
 < 0 if an error occurred

Moreover, the naming is consistent with devm_clk_get_enabled(), i.e. use
the past form of 'enable'.

Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea at collabora.com>
---
 drivers/clk/clk-devres.c | 34 ++++++++++++++++++++++++++++++++++
 include/linux/clk.h      | 24 ++++++++++++++++++++++++
 2 files changed, 58 insertions(+)

diff --git a/drivers/clk/clk-devres.c b/drivers/clk/clk-devres.c
index 82ae1f26e634..4203aaaa7544 100644
--- a/drivers/clk/clk-devres.c
+++ b/drivers/clk/clk-devres.c
@@ -250,6 +250,40 @@ int __must_check devm_clk_bulk_get_all_enable(struct device *dev,
 }
 EXPORT_SYMBOL_GPL(devm_clk_bulk_get_all_enable);
 
+int __must_check devm_clk_bulk_get_all_enabled(struct device *dev,
+					       struct clk_bulk_data **clks)
+{
+	struct clk_bulk_devres *devres;
+	int ret;
+
+	devres = devres_alloc(devm_clk_bulk_release_all_enable,
+			      sizeof(*devres), GFP_KERNEL);
+	if (!devres)
+		return -ENOMEM;
+
+	ret = clk_bulk_get_all(dev, &devres->clks);
+	if (ret <= 0)
+		goto err_free_devres;
+
+	*clks = devres->clks;
+	devres->num_clks = ret;
+
+	ret = clk_bulk_prepare_enable(devres->num_clks, *clks);
+	if (ret) {
+		clk_bulk_put_all(devres->num_clks, devres->clks);
+		goto err_free_devres;
+	}
+
+	devres_add(dev, devres);
+
+	return devres->num_clks;
+
+err_free_devres:
+	devres_free(devres);
+	return ret;
+}
+EXPORT_SYMBOL_GPL(devm_clk_bulk_get_all_enabled);
+
 static int devm_clk_match(struct device *dev, void *res, void *data)
 {
 	struct clk **c = res;
diff --git a/include/linux/clk.h b/include/linux/clk.h
index 851a0f2cf42c..158c5072852e 100644
--- a/include/linux/clk.h
+++ b/include/linux/clk.h
@@ -511,6 +511,24 @@ int __must_check devm_clk_bulk_get_all(struct device *dev,
 int __must_check devm_clk_bulk_get_all_enable(struct device *dev,
 					      struct clk_bulk_data **clks);
 
+/**
+ * devm_clk_bulk_get_all_enabled - Get and enable all clocks of the consumer (managed)
+ * @dev: device for clock "consumer"
+ * @clks: pointer to the clk_bulk_data table of consumer
+ *
+ * Returns a positive value for the number of clocks obtained while the
+ * clock references are stored in the clk_bulk_data table in @clks field.
+ * Returns 0 if there're none and a negative value if something failed.
+ *
+ * This helper function allows drivers to get all clocks of the
+ * consumer and enables them in one operation with management.
+ * The clks will automatically be disabled and freed when the device
+ * is unbound.
+ */
+
+int __must_check devm_clk_bulk_get_all_enabled(struct device *dev,
+					       struct clk_bulk_data **clks);
+
 /**
  * devm_clk_get - lookup and obtain a managed reference to a clock producer.
  * @dev: device for clock "consumer"
@@ -1040,6 +1058,12 @@ static inline int __must_check devm_clk_bulk_get_all_enable(struct device *dev,
 	return 0;
 }
 
+static inline int __must_check devm_clk_bulk_get_all_enabled(struct device *dev,
+						struct clk_bulk_data **clks)
+{
+	return 0;
+}
+
 static inline struct clk *devm_get_clk_from_child(struct device *dev,
 				struct device_node *np, const char *con_id)
 {

-- 
2.46.0



From cristian.ciocaltea at collabora.com  Sat Sep 14 11:04:53 2024
From: cristian.ciocaltea at collabora.com (Cristian Ciocaltea)
Date: Sat, 14 Sep 2024 21:04:53 +0300
Subject: [PATCH 0/4] Provide devm_clk_bulk_get_all_enabled() helper
Message-ID: <20240914-clk_bulk_ena_fix-v1-0-ce3537585c06@collabora.com>

Commit 265b07df758a ("clk: Provide managed helper to get and enable bulk
clocks") added devm_clk_bulk_get_all_enable() function, but missed to
return the number of clocks stored in the clk_bulk_data table referenced
by the clks argument.

That is required in case there is a need to iterate these clocks later,
therefore I couldn't see any use case of this parameter and should have
been simply removed from the function declaration.

The first patch in the series provides devm_clk_bulk_get_all_enabled()
variant, which is consistent with devm_clk_bulk_get_all() in terms of
the returned value:

 > 0 if one or more clocks have been stored
 = 0 if there are no clocks
 < 0 if an error occurred

Moreover, the naming is consistent with devm_clk_get_enabled(), i.e. use
the past form of 'enable'.

The next two patches switch existing users of devm_clk_get_enable() to
the new helper - there were only two, as of next-20240913.

The last patch drops the now obsolete devm_clk_bulk_get_all_enable()
helper.

Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea at collabora.com>
---
Cristian Ciocaltea (4):
      clk: Provide devm_clk_bulk_get_all_enabled() helper
      soc: mediatek: pwrap: Switch to devm_clk_bulk_get_all_enabled()
      PCI: exynos: Switch to devm_clk_bulk_get_all_enabled()
      clk: Drop obsolete devm_clk_bulk_get_all_enable() helper

 drivers/clk/clk-devres.c                | 30 ++++++++++++++++--------------
 drivers/pci/controller/dwc/pci-exynos.c |  2 +-
 drivers/soc/mediatek/mtk-pmic-wrap.c    |  4 ++--
 include/linux/clk.h                     | 12 +++++++-----
 4 files changed, 26 insertions(+), 22 deletions(-)
---
base-commit: 5acd9952f95fb4b7da6d09a3be39195a80845eb6
change-id: 20240912-clk_bulk_ena_fix-16ba77358ddf



From cristian.ciocaltea at collabora.com  Sat Sep 14 11:04:55 2024
From: cristian.ciocaltea at collabora.com (Cristian Ciocaltea)
Date: Sat, 14 Sep 2024 21:04:55 +0300
Subject: [PATCH 2/4] soc: mediatek: pwrap: Switch to
 devm_clk_bulk_get_all_enabled()
In-Reply-To: <20240914-clk_bulk_ena_fix-v1-0-ce3537585c06@collabora.com>
References: <20240914-clk_bulk_ena_fix-v1-0-ce3537585c06@collabora.com>
Message-ID: <20240914-clk_bulk_ena_fix-v1-2-ce3537585c06@collabora.com>

The helper devm_clk_bulk_get_all_enable() is partially broken and will
be dropped since it missed to return the number of clocks stored in the
clk_bulk_data table referenced by the clks argument.

Use the newly introduced devm_clk_bulk_get_all_enabled() variant
instead, which is consistent with devm_clk_bulk_get_all() in terms of
the returned value:

 > 0 if one or more clocks have been stored
 = 0 if there are no clocks
 < 0 if an error occurred

Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea at collabora.com>
---
 drivers/soc/mediatek/mtk-pmic-wrap.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/soc/mediatek/mtk-pmic-wrap.c b/drivers/soc/mediatek/mtk-pmic-wrap.c
index 9fdc0ef79202..0bcd85826375 100644
--- a/drivers/soc/mediatek/mtk-pmic-wrap.c
+++ b/drivers/soc/mediatek/mtk-pmic-wrap.c
@@ -2518,8 +2518,8 @@ static int pwrap_probe(struct platform_device *pdev)
 		}
 	}
 
-	ret = devm_clk_bulk_get_all_enable(wrp->dev, &clk);
-	if (ret)
+	ret = devm_clk_bulk_get_all_enabled(wrp->dev, &clk);
+	if (ret < 0)
 		return dev_err_probe(wrp->dev, ret,
 				     "failed to get clocks\n");
 

-- 
2.46.0



From cristian.ciocaltea at collabora.com  Sat Sep 14 11:04:56 2024
From: cristian.ciocaltea at collabora.com (Cristian Ciocaltea)
Date: Sat, 14 Sep 2024 21:04:56 +0300
Subject: [PATCH 3/4] PCI: exynos: Switch to devm_clk_bulk_get_all_enabled()
In-Reply-To: <20240914-clk_bulk_ena_fix-v1-0-ce3537585c06@collabora.com>
References: <20240914-clk_bulk_ena_fix-v1-0-ce3537585c06@collabora.com>
Message-ID: <20240914-clk_bulk_ena_fix-v1-3-ce3537585c06@collabora.com>

The helper devm_clk_bulk_get_all_enable() is partially broken and will
be dropped since it missed to return the number of clocks stored in the
clk_bulk_data table referenced by the clks argument.

Use the newly introduced devm_clk_bulk_get_all_enabled() variant
instead, which is consistent with devm_clk_bulk_get_all() in terms of
the returned value:

 > 0 if one or more clocks have been stored
 = 0 if there are no clocks
 < 0 if an error occurred

Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea at collabora.com>
---
 drivers/pci/controller/dwc/pci-exynos.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/pci/controller/dwc/pci-exynos.c b/drivers/pci/controller/dwc/pci-exynos.c
index fa45da28a218..056cebd4e0ba 100644
--- a/drivers/pci/controller/dwc/pci-exynos.c
+++ b/drivers/pci/controller/dwc/pci-exynos.c
@@ -300,7 +300,7 @@ static int exynos_pcie_probe(struct platform_device *pdev)
 	if (IS_ERR(ep->elbi_base))
 		return PTR_ERR(ep->elbi_base);
 
-	ret = devm_clk_bulk_get_all_enable(dev, &ep->clks);
+	ret = devm_clk_bulk_get_all_enabled(dev, &ep->clks);
 	if (ret < 0)
 		return ret;
 

-- 
2.46.0



From cristian.ciocaltea at collabora.com  Sat Sep 14 11:04:57 2024
From: cristian.ciocaltea at collabora.com (Cristian Ciocaltea)
Date: Sat, 14 Sep 2024 21:04:57 +0300
Subject: [PATCH 4/4] clk: Drop obsolete devm_clk_bulk_get_all_enable()
 helper
In-Reply-To: <20240914-clk_bulk_ena_fix-v1-0-ce3537585c06@collabora.com>
References: <20240914-clk_bulk_ena_fix-v1-0-ce3537585c06@collabora.com>
Message-ID: <20240914-clk_bulk_ena_fix-v1-4-ce3537585c06@collabora.com>

Commit 265b07df758a ("clk: Provide managed helper to get and enable bulk
clocks") added devm_clk_bulk_get_all_enable() function, but missed to
return the number of clocks stored in the clk_bulk_data table referenced
by the clks argument.  Without knowing the number, it's not possible to
iterate these clocks when needed, hence the argument is useless and
could have been simply removed.

A new helper devm_clk_bulk_get_all_enabled() has been introduced, which
is consistent with devm_clk_bulk_get_all() in terms of the returned
value.

Drop the obsolete function since all users switched to the new helper.

Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea at collabora.com>
---
 drivers/clk/clk-devres.c | 32 --------------------------------
 include/linux/clk.h      | 22 ----------------------
 2 files changed, 54 deletions(-)

diff --git a/drivers/clk/clk-devres.c b/drivers/clk/clk-devres.c
index 4203aaaa7544..14a657f336fe 100644
--- a/drivers/clk/clk-devres.c
+++ b/drivers/clk/clk-devres.c
@@ -218,38 +218,6 @@ static void devm_clk_bulk_release_all_enable(struct device *dev, void *res)
 	clk_bulk_put_all(devres->num_clks, devres->clks);
 }
 
-int __must_check devm_clk_bulk_get_all_enable(struct device *dev,
-					      struct clk_bulk_data **clks)
-{
-	struct clk_bulk_devres *devres;
-	int ret;
-
-	devres = devres_alloc(devm_clk_bulk_release_all_enable,
-			      sizeof(*devres), GFP_KERNEL);
-	if (!devres)
-		return -ENOMEM;
-
-	ret = clk_bulk_get_all(dev, &devres->clks);
-	if (ret > 0) {
-		*clks = devres->clks;
-		devres->num_clks = ret;
-	} else {
-		devres_free(devres);
-		return ret;
-	}
-
-	ret = clk_bulk_prepare_enable(devres->num_clks, *clks);
-	if (!ret) {
-		devres_add(dev, devres);
-	} else {
-		clk_bulk_put_all(devres->num_clks, devres->clks);
-		devres_free(devres);
-	}
-
-	return ret;
-}
-EXPORT_SYMBOL_GPL(devm_clk_bulk_get_all_enable);
-
 int __must_check devm_clk_bulk_get_all_enabled(struct device *dev,
 					       struct clk_bulk_data **clks)
 {
diff --git a/include/linux/clk.h b/include/linux/clk.h
index 158c5072852e..b607482ca77e 100644
--- a/include/linux/clk.h
+++ b/include/linux/clk.h
@@ -495,22 +495,6 @@ int __must_check devm_clk_bulk_get_optional(struct device *dev, int num_clks,
 int __must_check devm_clk_bulk_get_all(struct device *dev,
 				       struct clk_bulk_data **clks);
 
-/**
- * devm_clk_bulk_get_all_enable - Get and enable all clocks of the consumer (managed)
- * @dev: device for clock "consumer"
- * @clks: pointer to the clk_bulk_data table of consumer
- *
- * Returns success (0) or negative errno.
- *
- * This helper function allows drivers to get all clocks of the
- * consumer and enables them in one operation with management.
- * The clks will automatically be disabled and freed when the device
- * is unbound.
- */
-
-int __must_check devm_clk_bulk_get_all_enable(struct device *dev,
-					      struct clk_bulk_data **clks);
-
 /**
  * devm_clk_bulk_get_all_enabled - Get and enable all clocks of the consumer (managed)
  * @dev: device for clock "consumer"
@@ -1052,12 +1036,6 @@ static inline int __must_check devm_clk_bulk_get_all(struct device *dev,
 	return 0;
 }
 
-static inline int __must_check devm_clk_bulk_get_all_enable(struct device *dev,
-						struct clk_bulk_data **clks)
-{
-	return 0;
-}
-
 static inline int __must_check devm_clk_bulk_get_all_enabled(struct device *dev,
 						struct clk_bulk_data **clks)
 {

-- 
2.46.0



From jason-jh.lin at mediatek.com  Sat Sep 14 13:18:19 2024
From: jason-jh.lin at mediatek.com (Jason-JH.Lin)
Date: Sun, 15 Sep 2024 04:18:19 +0800
Subject: [PATCH] drm/mediatek: ovl: Add fmt_support_man for MT8192 and MT8195
Message-ID: <20240914201819.3357-1-jason-jh.lin@mediatek.com>

OVL_CON_CLRFMT_MAN is an configuration for extending color format
settings of DISP_REG_OVL_CON(n).
It will change some of the original color format settings.

Take the settings of (3 << 12) for example.
- If OVL_CON_CLRFMT_MAN = 0 means OVL_CON_CLRFMT_RGBA8888.
- If OVL_CON_CLRFMT_MAN = 1 means OVL_CON_CLRFMT_PARGB8888.

Since OVL_CON_CLRFMT_MAN is not supported on previous SoCs,
It breaks the OVL color format setting of MT8173.
So add fmt_support_man to the driver data of MT8192 and MT8195
to solve the downgrade problem.

Fixes: a3f7f7ef4bfe ("drm/mediatek: Support "Pre-multiplied" blending in OVL")
Signed-off-by: Jason-JH.Lin <jason-jh.lin at mediatek.com>
---
 drivers/gpu/drm/mediatek/mtk_disp_ovl.c | 28 ++++++++++++++++++-------
 1 file changed, 20 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
index 89b439dcf3a6..aa575569f996 100644
--- a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
+++ b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
@@ -70,10 +70,18 @@
 #define OVL_CON_CLRFMT_UYVY	(4 << 12)
 #define OVL_CON_CLRFMT_YUYV	(5 << 12)
 #define OVL_CON_MTX_YUV_TO_RGB	(6 << 16)
-#define OVL_CON_CLRFMT_PARGB8888 ((3 << 12) | OVL_CON_CLRFMT_MAN)
-#define OVL_CON_CLRFMT_PABGR8888 (OVL_CON_CLRFMT_PARGB8888 | OVL_CON_RGB_SWAP)
-#define OVL_CON_CLRFMT_PBGRA8888 (OVL_CON_CLRFMT_PARGB8888 | OVL_CON_BYTE_SWAP)
-#define OVL_CON_CLRFMT_PRGBA8888 (OVL_CON_CLRFMT_PABGR8888 | OVL_CON_BYTE_SWAP)
+#define OVL_CON_CLRFMT_PARGB8888(ovl)	((ovl)->data->fmt_support_man ? \
+					((3 << 12) | OVL_CON_CLRFMT_MAN) : \
+					OVL_CON_CLRFMT_ABGR8888)
+#define OVL_CON_CLRFMT_PABGR8888(ovl)	((ovl)->data->fmt_support_man ? \
+					(OVL_CON_CLRFMT_PARGB8888 | OVL_CON_RGB_SWAP) : \
+					OVL_CON_CLRFMT_ABGR8888)
+#define OVL_CON_CLRFMT_PBGRA8888(ovl)	((ovl)->data->fmt_support_man ? \
+					(OVL_CON_CLRFMT_PARGB8888 | OVL_CON_BYTE_SWAP) : \
+					OVL_CON_CLRFMT_BGRA8888)
+#define OVL_CON_CLRFMT_PRGBA8888(ovl)	((ovl)->data->fmt_support_man ? \
+					(OVL_CON_CLRFMT_PABGR8888 | OVL_CON_BYTE_SWAP) : \
+					OVL_CON_CLRFMT_RGBA8888)
 #define OVL_CON_CLRFMT_RGB565(ovl)	((ovl)->data->fmt_rgb565_is_0 ? \
 					0 : OVL_CON_CLRFMT_RGB)
 #define OVL_CON_CLRFMT_RGB888(ovl)	((ovl)->data->fmt_rgb565_is_0 ? \
@@ -144,6 +152,7 @@ struct mtk_disp_ovl_data {
 	unsigned int gmc_bits;
 	unsigned int layer_nr;
 	bool fmt_rgb565_is_0;
+	bool fmt_support_man;
 	bool smi_id_en;
 	bool supports_afbc;
 	const u32 *formats;
@@ -410,28 +419,28 @@ static unsigned int ovl_fmt_convert(struct mtk_disp_ovl *ovl, unsigned int fmt,
 	case DRM_FORMAT_RGBA1010102:
 		return blend_mode == DRM_MODE_BLEND_COVERAGE ?
 		       OVL_CON_CLRFMT_RGBA8888 :
-		       OVL_CON_CLRFMT_PRGBA8888;
+		       OVL_CON_CLRFMT_PRGBA8888(ovl);
 	case DRM_FORMAT_BGRX8888:
 	case DRM_FORMAT_BGRA8888:
 	case DRM_FORMAT_BGRX1010102:
 	case DRM_FORMAT_BGRA1010102:
 		return blend_mode == DRM_MODE_BLEND_COVERAGE ?
 		       OVL_CON_CLRFMT_BGRA8888 :
-		       OVL_CON_CLRFMT_PBGRA8888;
+		       OVL_CON_CLRFMT_PBGRA8888(ovl);
 	case DRM_FORMAT_XRGB8888:
 	case DRM_FORMAT_ARGB8888:
 	case DRM_FORMAT_XRGB2101010:
 	case DRM_FORMAT_ARGB2101010:
 		return blend_mode == DRM_MODE_BLEND_COVERAGE ?
 		       OVL_CON_CLRFMT_ARGB8888 :
-		       OVL_CON_CLRFMT_PARGB8888;
+		       OVL_CON_CLRFMT_PARGB8888(ovl);
 	case DRM_FORMAT_XBGR8888:
 	case DRM_FORMAT_ABGR8888:
 	case DRM_FORMAT_XBGR2101010:
 	case DRM_FORMAT_ABGR2101010:
 		return blend_mode == DRM_MODE_BLEND_COVERAGE ?
 		       OVL_CON_CLRFMT_ABGR8888 :
-		       OVL_CON_CLRFMT_PABGR8888;
+		       OVL_CON_CLRFMT_PABGR8888(ovl);
 	case DRM_FORMAT_UYVY:
 		return OVL_CON_CLRFMT_UYVY | OVL_CON_MTX_YUV_TO_RGB;
 	case DRM_FORMAT_YUYV:
@@ -662,6 +671,7 @@ static const struct mtk_disp_ovl_data mt8192_ovl_driver_data = {
 	.gmc_bits = 10,
 	.layer_nr = 4,
 	.fmt_rgb565_is_0 = true,
+	.fmt_support_man = true,
 	.smi_id_en = true,
 	.formats = mt8173_formats,
 	.num_formats = ARRAY_SIZE(mt8173_formats),
@@ -672,6 +682,7 @@ static const struct mtk_disp_ovl_data mt8192_ovl_2l_driver_data = {
 	.gmc_bits = 10,
 	.layer_nr = 2,
 	.fmt_rgb565_is_0 = true,
+	.fmt_support_man = true,
 	.smi_id_en = true,
 	.formats = mt8173_formats,
 	.num_formats = ARRAY_SIZE(mt8173_formats),
@@ -682,6 +693,7 @@ static const struct mtk_disp_ovl_data mt8195_ovl_driver_data = {
 	.gmc_bits = 10,
 	.layer_nr = 4,
 	.fmt_rgb565_is_0 = true,
+	.fmt_support_man = true,
 	.smi_id_en = true,
 	.supports_afbc = true,
 	.formats = mt8195_formats,
-- 
2.43.0



From Jason-JH.Lin at mediatek.com  Sat Sep 14 13:22:00 2024
From: Jason-JH.Lin at mediatek.com (=?utf-8?B?SmFzb24tSkggTGluICjmnpfnnb/npaUp?=)
Date: Sat, 14 Sep 2024 20:22:00 +0000
Subject: [PATCH v4 0/5] Support alpha blending in MTK display driver
In-Reply-To: <01020191ea9dface-81c48f9d-4cf2-4f96-a1cd-59c11fa810ff-000000@eu-west-1.amazonses.com>
References: <20240717-alpha-blending-v4-0-4b1c806c0749@mediatek.com>
	 <CAAOTY_8ThuusfHk9Gd5pFP8VhJkG2seuJmkFiruK1rPQFZGBzg@mail.gmail.com>
	 <6c9b7f85-f92d-44ed-ae9d-00f6d55ea614@gmail.com>
	 <a2cf4e9b9c3343a7398521760934f1740505aa13.camel@mediatek.com>
	 <13f6dbc5d460e746352f68b001e85f870c89993d.camel@mediatek.com>
	 <69776448-0328-4880-9108-54466e40ddd9@gmail.com>
	 <01020191ea9dface-81c48f9d-4cf2-4f96-a1cd-59c11fa810ff-000000@eu-west-1.amazonses.com>
Message-ID: <a34c16613f66b293b54eb6815c8bea80db08d885.camel@mediatek.com>

On Fri, 2024-09-13 at 09:01 +0000, AngeloGioacchino Del Regno wrote:
> Il 13/09/24 07:40, Alper Nebi Yasak ha scritto:
> > Hi,
> > 
> > On 2024-09-13 05:56 +03:00, Jason-JH Lin (???) wrote:
> > > Hi Alper,
> > > 
> > > I think that's a platform issue because it works find in my
> > > MT8188
> > > platform, but I don't have any MT8173 platform.
> > > 
> > > Can you help me test the fix patch in your MT8173 platform?
> > > I'll provide a fix patch in 2 weeks via Google Chat.
> 
> Jason, Two weeks is a bit too late as CK already picked your series:
> reverting
> and reapplying creates noise in the commit log, and when this can be
> avoided it
> should be avoided.
> 
> Since upstream is broken, please understand that this fix should be
> developed
> with *highest* priority (so, as immediate as possible).
> 

OK, I'll send the fix path right away!

Regards,
Jason-JH.Lin

> Thanks,
> Angelo
> 
> > > 
> > > Regards,
> > > Jason-JH.Lin
> > 
> > I replied over Google Chat, but to make it clear for others on the
> > mailing list: Yes, I'll try to test patches when you send them.
> > 
> > > On Fri, 2024-09-13 at 01:25 +0000, CK Hu (???) wrote:
> > > > Hi, Jason:
> > > > 
> > > > Please help to fix this issue.
> > > > Otherwise, I would revert this series.
> > > > 
> > > > Regards,
> > > > CK
> > > > 
> > > > On Thu, 2024-09-12 at 23:29 +0300, Alper Nebi Yasak wrote:
> > > > >    
> > > > > External email : Please do not click links or open
> > > > > attachments
> > > > > until you have verified the sender or the content.
> > > > >   Hi,
> > > > > 
> > > > > On 2024-07-31 16:34 +03:00, Chun-Kuang Hu wrote:
> > > > > > Hi, Shawn:
> > > > > > 
> > > > > > Hsiao Chien Sung via B4 Relay
> > > > > > <devnull+shawn.sung.mediatek.com at kernel.org> ? 2024?7?17?
> > > > > > ??
> > > > > > ??1:24???
> > > > > > > 
> > > > > > > Support "Pre-multiplied" and "None" blend mode on
> > > > > > > MediaTek's
> > > > > > > chips by
> > > > > > > adding correct blend mode property when the planes init.
> > > > > > > Before this patch, only the "Coverage" mode (default) is
> > > > > > > supported.
> > > > > > 
> > > > > > For the whole series, applied to mediatek-drm-next [1],
> > > > > > thanks.
> > > > > > 
> > > > > > [1]
> > > > > > 
https://urldefense.com/v3/__https://git.kernel.org/pub/scm/linux/kernel/git/chunkuang.hu/linux.git/log/?h=mediatek-drm-next__;!!CTRNKA9wMg0ARbw!jrw0cZrT-6A9bviBj9yX0zzeM2NAPin74zALZAajn9k92ZFrRVd3iZVOe0xpjsr21_Xw5v8KDeeF7nDtvT5rhRAMDV7KZ-qQ0Q$
> > > > > >  
> > > > > 
> > > > > I am seeing broken colors on an MT8173 Chromebook with next-
> > > > > 20240912,
> > > > > which goes away if I git-revert this series (commits
> > > > > 1f66fe62cc09
> > > > > eb17c5909481 a3f7f7ef4bfe 59e9d9de25f0 4225d5d5e779).
> > > > > 
> > > > > To illustrate, I took a picture [1] of some color mixing
> > > > > diagrams
> > > > > from
> > > > > Wikipedia [2]. Do you have an idea of what goes wrong?
> > > > > 
> > > > > (I'm busy with too many things so I don't want to debug it
> > > > > now...)
> > > > > 
> > > > > [1] 
> > > > > https://urldefense.com/v3/__https://i.imgur.com/tNFvovB.jpeg__;!!CTRNKA9wMg0ARbw!jrw0cZrT-6A9bviBj9yX0zzeM2NAPin74zALZAajn9k92ZFrRVd3iZVOe0xpjsr21_Xw5v8KDeeF7nDtvT5rhRAMDV42KYfvHA$
> > > > >  
> > > > > [2] 
> > > > > https://urldefense.com/v3/__https://en.wikipedia.org/wiki/Color_space*Generic__;Iw!!CTRNKA9wMg0ARbw!jrw0cZrT-6A9bviBj9yX0zzeM2NAPin74zALZAajn9k92ZFrRVd3iZVOe0xpjsr21_Xw5v8KDeeF7nDtvT5rhRAMDV67WeSFhQ$
> > > > >  
> 
> 

From andrej.skvortzov at gmail.com  Sun Sep 15 02:46:52 2024
From: andrej.skvortzov at gmail.com (Andrey Skvortsov)
Date: Sun, 15 Sep 2024 12:46:52 +0300
Subject: [PATCH v7 08/10] i2c: of-prober: Add GPIO support to simple
 helpers
In-Reply-To: <20240911072751.365361-9-wenst@chromium.org>
References: <20240911072751.365361-1-wenst@chromium.org>
 <20240911072751.365361-9-wenst@chromium.org>
Message-ID: <ZuatDOocfDumBzE_@skv.local>

Hi,

On 24-09-11 15:27, Chen-Yu Tsai wrote:
> Add GPIO support to the simple helpers for the I2C OF component prober.
> Components that the prober intends to probe likely require their
> regulator supplies be enabled, and GPIOs be toggled to enable them or
> bring them out of reset before they will respond to probe attempts.
> Regulator supplies were handled in the previous patch.
> 
> The assumption is that the same class of components to be probed are
> always connected in the same fashion with the same regulator supply
> and GPIO. The names may vary due to binding differences, but the
> physical layout does not change.
> 
> This supports at most one GPIO pin. The user must specify the GPIO name,
> the polarity, and the amount of time to wait after the GPIO is toggled.
> Devices with more than one GPIO pin likely require specific power
> sequencing beyond what generic code can easily support.
> 
> Signed-off-by: Chen-Yu Tsai <wenst at chromium.org>

> diff --git a/include/linux/i2c-of-prober.h b/include/linux/i2c-of-prober.h
> index 541451fbf58d..c5e241163c94 100644
> --- a/include/linux/i2c-of-prober.h
> +++ b/include/linux/i2c-of-prober.h
> @@ -83,6 +83,7 @@ int i2c_of_probe_component(struct device *dev, const struct i2c_of_probe_cfg *cf
>   *
>   * The following helpers are provided:
>   * * i2c_of_probe_simple_get_res()
> + * * i2c_of_probe_simple_free_res_early()
>   * * i2c_of_probe_simple_free_res_late()
>   * * i2c_of_probe_simple_enable()
>   * * i2c_of_probe_simple_cleanup()
> @@ -92,24 +93,33 @@ int i2c_of_probe_component(struct device *dev, const struct i2c_of_probe_cfg *cf
>   * struct i2c_of_probe_simple_opts - Options for simple I2C component prober callbacks
>   * @res_node_compatible: Compatible string of device node to retrieve resources from.
>   * @supply_name: Name of regulator supply.
> + * @gpio_name: Name of GPIO.
>   * @post_power_on_delay_ms: Delay in ms after regulators are powered on. Passed to msleep().
> + * @post_reset_deassert_delay_ms: Delay in ms after GPIOs are set. Passed to msleep().
> + * @gpio_high_to_enable: %true if GPIO should be set to electrical high to enable component.
>   */
>  struct i2c_of_probe_simple_opts {
>  	const char *res_node_compatible;
>  	const char *supply_name;
> +	const char *gpio_name;
>  	unsigned int post_power_on_delay_ms;
> +	unsigned int post_reset_deassert_delay_ms;
> +	bool gpio_high_to_enable;

Missing '#include <linux/types.h>', otherwise compiler complains
about unknown bool type, when 'i2c-of-prober.h' included without any
previous includes.

-- 
Best regards,
Andrey Skvortsov


From andrej.skvortzov at gmail.com  Sun Sep 15 03:09:32 2024
From: andrej.skvortzov at gmail.com (Andrey Skvortsov)
Date: Sun, 15 Sep 2024 13:09:32 +0300
Subject: [PATCH v7 06/10] i2c: Introduce OF component probe function
In-Reply-To: <20240911072751.365361-7-wenst@chromium.org>
References: <20240911072751.365361-1-wenst@chromium.org>
 <20240911072751.365361-7-wenst@chromium.org>
Message-ID: <ZuayXMGMdEqSyvUl@skv.local>

On 24-09-11 15:27, Chen-Yu Tsai wrote:
> Some devices are designed and manufactured with some components having
> multiple drop-in replacement options. These components are often
> connected to the mainboard via ribbon cables, having the same signals
> and pin assignments across all options. These may include the display
> panel and touchscreen on laptops and tablets, and the trackpad on
> laptops. Sometimes which component option is used in a particular device
> can be detected by some firmware provided identifier, other times that
> information is not available, and the kernel has to try to probe each
> device.
> 
> This change attempts to make the "probe each device" case cleaner. The
> current approach is to have all options added and enabled in the device
> tree. The kernel would then bind each device and run each driver's probe
> function. This works, but has been broken before due to the introduction
> of asynchronous probing, causing multiple instances requesting "shared"
> resources, such as pinmuxes, GPIO pins, interrupt lines, at the same
> time, with only one instance succeeding. Work arounds for these include
> moving the pinmux to the parent I2C controller, using GPIO hogs or
> pinmux settings to keep the GPIO pins in some fixed configuration, and
> requesting the interrupt line very late. Such configurations can be seen
> on the MT8183 Krane Chromebook tablets, and the Qualcomm sc8280xp-based
> Lenovo Thinkpad 13S.
> 
> Instead of this delicate dance between drivers and device tree quirks,
> this change introduces a simple I2C component probe. function For a
> given class of devices on the same I2C bus, it will go through all of
> them, doing a simple I2C read transfer and see which one of them responds.
> It will then enable the device that responds.
> 
> This requires some minor modifications in the existing device tree. The
> status for all the device nodes for the component options must be set
> to "failed-needs-probe". This makes it clear that some mechanism is

Wrong status name ("failed-needs-probe"), "fail-needs-probe". This is
minor, but it confused me as I went through patchset first time, since
there are different name in different patches.

> needed to enable one of them, and also prevents the prober and device
> drivers running at the same time.
> 
> Signed-off-by: Chen-Yu Tsai <wenst at chromium.org>

-- 
Best regards,
Andrey Skvortsov


From Shawn.Sung at mediatek.com  Sun Sep 15 03:30:09 2024
From: Shawn.Sung at mediatek.com (=?utf-8?B?U2hhd24gU3VuZyAo5a6L5a2d6KyZKQ==?=)
Date: Sun, 15 Sep 2024 10:30:09 +0000
Subject: [PATCH v4 0/5] Support alpha blending in MTK display driver
In-Reply-To: <a34c16613f66b293b54eb6815c8bea80db08d885.camel@mediatek.com>
References: <20240717-alpha-blending-v4-0-4b1c806c0749@mediatek.com>
	 <CAAOTY_8ThuusfHk9Gd5pFP8VhJkG2seuJmkFiruK1rPQFZGBzg@mail.gmail.com>
	 <6c9b7f85-f92d-44ed-ae9d-00f6d55ea614@gmail.com>
	 <a2cf4e9b9c3343a7398521760934f1740505aa13.camel@mediatek.com>
	 <13f6dbc5d460e746352f68b001e85f870c89993d.camel@mediatek.com>
	 <69776448-0328-4880-9108-54466e40ddd9@gmail.com>
	 <01020191ea9dface-81c48f9d-4cf2-4f96-a1cd-59c11fa810ff-000000@eu-west-1.amazonses.com>
	 <a34c16613f66b293b54eb6815c8bea80db08d885.camel@mediatek.com>
Message-ID: <e63ff4bc247f798d03d93979b15786e2246f29ee.camel@mediatek.com>

Hi Jason,

On Sat, 2024-09-14 at 20:22 +0000, Jason-JH Lin (???) wrote:
> On Fri, 2024-09-13 at 09:01 +0000, AngeloGioacchino Del Regno wrote:
> > Il 13/09/24 07:40, Alper Nebi Yasak ha scritto:
> > > Hi,
> > > 
> > > On 2024-09-13 05:56 +03:00, Jason-JH Lin (???) wrote:
> > > > Hi Alper,
> > > > 
> > > > I think that's a platform issue because it works find in my
> > > > MT8188
> > > > platform, but I don't have any MT8173 platform.
> > > > 
> > > > Can you help me test the fix patch in your MT8173 platform?
> > > > I'll provide a fix patch in 2 weeks via Google Chat.
> > 
> > Jason, Two weeks is a bit too late as CK already picked your
> > series:
> > reverting
> > and reapplying creates noise in the commit log, and when this can
> > be
> > avoided it
> > should be avoided.
> > 
> > Since upstream is broken, please understand that this fix should be
> > developed
> > with *highest* priority (so, as immediate as possible).
> > 
> 
> OK, I'll send the fix path right away!

I notice that I'm unable to see replies from external sources. Not sure
if this is related to B4 relay, but I wanted to bring this to your
attention as feedback while you may want to consider sending the
patches with B4 relay as well.

Regards,
Shawn


From wenst at chromium.org  Sun Sep 15 03:44:13 2024
From: wenst at chromium.org (Chen-Yu Tsai)
Date: Sun, 15 Sep 2024 12:44:13 +0200
Subject: [PATCH v7 06/10] i2c: Introduce OF component probe function
In-Reply-To: <ZuQTFTNTBLCziD05@smile.fi.intel.com>
References: <20240911072751.365361-1-wenst@chromium.org> <20240911072751.365361-7-wenst@chromium.org>
 <ZuQTFTNTBLCziD05@smile.fi.intel.com>
Message-ID: <CAGXv+5HgkCZ=vdHGgvCW1U-nid=cQrVaxC+V+H2Gknf2pnTbYA@mail.gmail.com>

On Fri, Sep 13, 2024 at 12:25?PM Andy Shevchenko
<andriy.shevchenko at linux.intel.com> wrote:
>
> On Wed, Sep 11, 2024 at 03:27:44PM +0800, Chen-Yu Tsai wrote:
> > Some devices are designed and manufactured with some components having
> > multiple drop-in replacement options. These components are often
> > connected to the mainboard via ribbon cables, having the same signals
> > and pin assignments across all options. These may include the display
> > panel and touchscreen on laptops and tablets, and the trackpad on
> > laptops. Sometimes which component option is used in a particular device
> > can be detected by some firmware provided identifier, other times that
> > information is not available, and the kernel has to try to probe each
> > device.
> >
> > This change attempts to make the "probe each device" case cleaner. The
> > current approach is to have all options added and enabled in the device
> > tree. The kernel would then bind each device and run each driver's probe
> > function. This works, but has been broken before due to the introduction
> > of asynchronous probing, causing multiple instances requesting "shared"
> > resources, such as pinmuxes, GPIO pins, interrupt lines, at the same
> > time, with only one instance succeeding. Work arounds for these include
> > moving the pinmux to the parent I2C controller, using GPIO hogs or
> > pinmux settings to keep the GPIO pins in some fixed configuration, and
> > requesting the interrupt line very late. Such configurations can be seen
> > on the MT8183 Krane Chromebook tablets, and the Qualcomm sc8280xp-based
> > Lenovo Thinkpad 13S.
> >
> > Instead of this delicate dance between drivers and device tree quirks,
> > this change introduces a simple I2C component probe. function For a
> > given class of devices on the same I2C bus, it will go through all of
> > them, doing a simple I2C read transfer and see which one of them responds.
> > It will then enable the device that responds.
> >
> > This requires some minor modifications in the existing device tree. The
> > status for all the device nodes for the component options must be set
> > to "failed-needs-probe". This makes it clear that some mechanism is
> > needed to enable one of them, and also prevents the prober and device
> > drivers running at the same time.
>
> ...
>
> > +static int i2c_of_probe_enable_node(struct device *dev, struct device_node *node)
> > +{
> > +     int ret;
>
> > +     dev_info(dev, "Enabling %pOF\n", node);
>
> Is it important to be on INFO level?

Not really.

> > +     struct of_changeset *ocs __free(kfree) = kzalloc(sizeof(*ocs), GFP_KERNEL);
> > +     if (!ocs)
> > +             return -ENOMEM;
> > +
> > +     of_changeset_init(ocs);
> > +     ret = of_changeset_update_prop_string(ocs, node, "status", "okay");
> > +     if (ret)
> > +             return ret;
> > +
> > +     ret = of_changeset_apply(ocs);
> > +     if (ret) {
> > +             /* ocs needs to be explicitly cleaned up before being freed. */
> > +             of_changeset_destroy(ocs);
> > +     } else {
> > +             /*
> > +              * ocs is intentionally kept around as it needs to
> > +              * exist as long as the change is applied.
> > +              */
> > +             void *ptr __always_unused = no_free_ptr(ocs);
> > +     }
> > +
> > +     return ret;
> > +}
>
> ...
>
> > +int i2c_of_probe_component(struct device *dev, const struct i2c_of_probe_cfg *cfg, void *ctx)
> > +{
> > +     const struct i2c_of_probe_ops *ops;
> > +     const char *type;
> > +     struct device_node *i2c_node;
> > +     struct i2c_adapter *i2c;
> > +     int ret;
> > +
> > +     if (!cfg)
> > +             return -EINVAL;
> > +
> > +     ops = cfg->ops ?: &i2c_of_probe_dummy_ops;
> > +     type = cfg->type;
> > +
> > +     i2c_node = i2c_of_probe_get_i2c_node(dev, type);
>
>
>         struct device_node *i2c_node __free(of_node_put) =
>                 i2c_...;

cleanup.h says to not mix the two styles (scoped vs goto). I was trying
to follow that, though I realize now that with the scoped loops it
probably doesn't help.

I'll revert back to having __free().

> > +     if (IS_ERR(i2c_node))
> > +             return PTR_ERR(i2c_node);
> > +
> > +     for_each_child_of_node_with_prefix(i2c_node, node, type) {
> > +             if (!of_device_is_available(node))
> > +                     continue;
> > +
> > +             /*
> > +              * Device tree has component already enabled. Either the
> > +              * device tree isn't supported or we already probed once.
> > +              */
> > +             ret = 0;
>
> Shouldn't you drop reference count for "node"? (See also below)

This for-each loop the "scoped". It just doesn't have the prefix anymore.
I believe you asked if the prefix could be dropped and then Rob agreed.

> > +             goto out_put_i2c_node;
> > +     }
> > +
> > +     i2c = of_get_i2c_adapter_by_node(i2c_node);
> > +     if (!i2c) {
> > +             ret = dev_err_probe(dev, -EPROBE_DEFER, "Couldn't get I2C adapter\n");
> > +             goto out_put_i2c_node;
> > +     }
> > +
> > +     /* Grab resources */
> > +     ret = 0;
> > +     if (ops->get_resources)
> > +             ret = ops->get_resources(dev, i2c_node, ctx);
> > +     if (ret)
> > +             goto out_put_i2c_adapter;
> > +
> > +     /* Enable resources */
> > +     if (ops->enable)
> > +             ret = ops->enable(dev, ctx);
> > +     if (ret)
> > +             goto out_release_resources;
> > +
> > +     ret = 0;
> > +     for_each_child_of_node_with_prefix(i2c_node, node, type) {
> > +             union i2c_smbus_data data;
> > +             u32 addr;
> > +
> > +             if (of_property_read_u32(node, "reg", &addr))
> > +                     continue;
> > +             if (i2c_smbus_xfer(i2c, addr, 0, I2C_SMBUS_READ, 0, I2C_SMBUS_BYTE, &data) < 0)
> > +                     continue;
> > +
> > +             /* Found a device that is responding */
> > +             if (ops->free_resources_early)
> > +                     ops->free_resources_early(ctx);
> > +             ret = i2c_of_probe_enable_node(dev, node);
>
> Hmm... Is "node" reference count left bumped up for a reason?

Same as above.

> > +             break;
> > +     }
> > +
> > +     if (ops->cleanup)
> > +             ops->cleanup(dev, ctx);
> > +out_release_resources:
> > +     if (ops->free_resources_late)
> > +             ops->free_resources_late(ctx);
> > +out_put_i2c_adapter:
> > +     i2c_put_adapter(i2c);
> > +out_put_i2c_node:
> > +     of_node_put(i2c_node);
> > +
> > +     return ret;
> > +}
>
> ...
>
> > +/*
> > + * i2c-of-prober.h - definitions for the Linux I2C OF component prober
>
> Please avoid putting filenames inside files. In the possible future event of
> file renaming this may become a burden and sometimes even forgotten.

Ack.

> > + * Copyright (C) 2024 Google LLC
> > + */
> > +
> > +#ifndef _LINUX_I2C_OF_PROBER_H
> > +#define _LINUX_I2C_OF_PROBER_H
>
> > +#if IS_ENABLED(CONFIG_OF_DYNAMIC)
>
> Do you really need to hide data types with this? Wouldn't be enough to hide
> APIs only?

Ack. Will move the data types outside.


Thanks
ChenYu


> > +struct device;
> > +struct device_node;
> > +
> > +/**
> > + * struct i2c_of_probe_ops - I2C OF component prober callbacks
> > + *
> > + * A set of callbacks to be used by i2c_of_probe_component().
> > + *
> > + * All callbacks are optional. Callbacks are called only once per run, and are
> > + * used in the order they are defined in this structure.
> > + *
> > + * All callbacks that have return values shall return %0 on success,
> > + * or a negative error number on failure.
> > + *
> > + * The @dev parameter passed to the callbacks is the same as @dev passed to
> > + * i2c_of_probe_component(). It should only be used for dev_printk() calls
> > + * and nothing else, especially not managed device resource (devres) APIs.
> > + */
> > +struct i2c_of_probe_ops {
> > +     /** @get_resources: Retrieve resources for components. */
> > +     int (*get_resources)(struct device *dev, struct device_node *bus_node, void *data);
> > +
> > +     /** @free_resources_early: Release exclusive resources prior to enabling component. */
> > +     void (*free_resources_early)(void *data);
> > +
> > +     /**
> > +      * @enable: Enable resources so that the components respond to probes.
> > +      *
> > +      * Resources should be reverted to their initial state before returning if this fails.
> > +      */
> > +     int (*enable)(struct device *dev, void *data);
> > +
> > +     /**
> > +      * @cleanup: Opposite of @enable to balance refcounts after probing.
> > +      *
> > +      * Can not operate on resources already freed in @free_resources_early.
> > +      */
> > +     int (*cleanup)(struct device *dev, void *data);
> > +
> > +     /**
> > +      * @free_resources_late: Release all resources, including those that would have
> > +      *                       been released by @free_resources_early.
> > +      */
> > +     void (*free_resources_late)(void *data);
> > +};
> > +
> > +/**
> > + * struct i2c_of_probe_cfg - I2C OF component prober configuration
> > + * @ops: Callbacks for the prober to use.
> > + * @type: A string to match the device node name prefix to probe for.
> > + */
> > +struct i2c_of_probe_cfg {
> > +     const struct i2c_of_probe_ops *ops;
> > +     const char *type;
> > +};
> > +
> > +int i2c_of_probe_component(struct device *dev, const struct i2c_of_probe_cfg *cfg, void *ctx);
> > +
> > +#endif /* IS_ENABLED(CONFIG_OF_DYNAMIC) */
> > +
> > +#endif /* _LINUX_I2C_OF_PROBER_H */
>
> --
> With Best Regards,
> Andy Shevchenko
>
>


From alpernebiyasak at gmail.com  Sun Sep 15 03:54:59 2024
From: alpernebiyasak at gmail.com (Alper Nebi Yasak)
Date: Sun, 15 Sep 2024 13:54:59 +0300
Subject: [PATCH] drm/mediatek: ovl: Add fmt_support_man for MT8192 and
 MT8195
In-Reply-To: <20240914201819.3357-1-jason-jh.lin@mediatek.com>
References: <20240914201819.3357-1-jason-jh.lin@mediatek.com>
Message-ID: <c8f8d556-77bf-4b60-abd9-bfcf7ac40ac5@gmail.com>

Hi,

On 2024-09-14 23:18 +03:00, Jason-JH.Lin wrote:
> OVL_CON_CLRFMT_MAN is an configuration for extending color format
> settings of DISP_REG_OVL_CON(n).
> It will change some of the original color format settings.
> 
> Take the settings of (3 << 12) for example.
> - If OVL_CON_CLRFMT_MAN = 0 means OVL_CON_CLRFMT_RGBA8888.
> - If OVL_CON_CLRFMT_MAN = 1 means OVL_CON_CLRFMT_PARGB8888.
> 
> Since OVL_CON_CLRFMT_MAN is not supported on previous SoCs,
> It breaks the OVL color format setting of MT8173.
> So add fmt_support_man to the driver data of MT8192 and MT8195
> to solve the downgrade problem.
> 
> Fixes: a3f7f7ef4bfe ("drm/mediatek: Support "Pre-multiplied" blending in OVL")
> Signed-off-by: Jason-JH.Lin <jason-jh.lin at mediatek.com>
> ---
>  drivers/gpu/drm/mediatek/mtk_disp_ovl.c | 28 ++++++++++++++++++-------
>  1 file changed, 20 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
> index 89b439dcf3a6..aa575569f996 100644
> --- a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
> +++ b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
> @@ -70,10 +70,18 @@
>  #define OVL_CON_CLRFMT_UYVY	(4 << 12)
>  #define OVL_CON_CLRFMT_YUYV	(5 << 12)
>  #define OVL_CON_MTX_YUV_TO_RGB	(6 << 16)
> -#define OVL_CON_CLRFMT_PARGB8888 ((3 << 12) | OVL_CON_CLRFMT_MAN)
> -#define OVL_CON_CLRFMT_PABGR8888 (OVL_CON_CLRFMT_PARGB8888 | OVL_CON_RGB_SWAP)
> -#define OVL_CON_CLRFMT_PBGRA8888 (OVL_CON_CLRFMT_PARGB8888 | OVL_CON_BYTE_SWAP)
> -#define OVL_CON_CLRFMT_PRGBA8888 (OVL_CON_CLRFMT_PABGR8888 | OVL_CON_BYTE_SWAP)
> +#define OVL_CON_CLRFMT_PARGB8888(ovl)	((ovl)->data->fmt_support_man ? \
> +					((3 << 12) | OVL_CON_CLRFMT_MAN) : \
> +					OVL_CON_CLRFMT_ABGR8888)

Should be OVL_CON_CLRFMT_ARGB8888 (*RGB* vs *BGR*)?

Otherwise I still see broken colors, but in blue instead of red.

> +#define OVL_CON_CLRFMT_PABGR8888(ovl)	((ovl)->data->fmt_support_man ? \
> +					(OVL_CON_CLRFMT_PARGB8888 | OVL_CON_RGB_SWAP) : \

Compile error, likely (OVL_CON_CLRFMT_PARGB8888(ovl) | ...)?

> +					OVL_CON_CLRFMT_ABGR8888)
> +#define OVL_CON_CLRFMT_PBGRA8888(ovl)	((ovl)->data->fmt_support_man ? \
> +					(OVL_CON_CLRFMT_PARGB8888 | OVL_CON_BYTE_SWAP) : \

Same as above, OVL_CON_CLRFMT_PARGB8888(ovl)

> +					OVL_CON_CLRFMT_BGRA8888)
> +#define OVL_CON_CLRFMT_PRGBA8888(ovl)	((ovl)->data->fmt_support_man ? \
> +					(OVL_CON_CLRFMT_PABGR8888 | OVL_CON_BYTE_SWAP) : \

Same as above, OVL_CON_CLRFMT_PABGR8888(ovl)

> +					OVL_CON_CLRFMT_RGBA8888)
>  #define OVL_CON_CLRFMT_RGB565(ovl)	((ovl)->data->fmt_rgb565_is_0 ? \
>  					0 : OVL_CON_CLRFMT_RGB)
>  #define OVL_CON_CLRFMT_RGB888(ovl)	((ovl)->data->fmt_rgb565_is_0 ? \

With those changes, colors are fine on my MT8173, MT8183, MT8186 
Chromebooks.


From wenst at chromium.org  Sun Sep 15 04:32:32 2024
From: wenst at chromium.org (Chen-Yu Tsai)
Date: Sun, 15 Sep 2024 13:32:32 +0200
Subject: [PATCH v7 06/10] i2c: Introduce OF component probe function
In-Reply-To: <CAD=FV=Udc9aP7bSzTWP82zsaztRD2YnVNpSDA54FC0dKQ-Nz2A@mail.gmail.com>
References: <20240911072751.365361-1-wenst@chromium.org> <20240911072751.365361-7-wenst@chromium.org>
 <CAD=FV=Udc9aP7bSzTWP82zsaztRD2YnVNpSDA54FC0dKQ-Nz2A@mail.gmail.com>
Message-ID: <CAGXv+5FRoiv+TPyeFTcuRanRuSh2-xUo6ttVPkW6o3tktUmcFA@mail.gmail.com>

On Sat, Sep 14, 2024 at 1:44?AM Doug Anderson <dianders at chromium.org> wrote:
>
> Hi,
>
> On Wed, Sep 11, 2024 at 12:28?AM Chen-Yu Tsai <wenst at chromium.org> wrote:
> >
> > Some devices are designed and manufactured with some components having
> > multiple drop-in replacement options. These components are often
> > connected to the mainboard via ribbon cables, having the same signals
> > and pin assignments across all options. These may include the display
> > panel and touchscreen on laptops and tablets, and the trackpad on
> > laptops. Sometimes which component option is used in a particular device
> > can be detected by some firmware provided identifier, other times that
> > information is not available, and the kernel has to try to probe each
> > device.
> >
> > This change attempts to make the "probe each device" case cleaner. The
> > current approach is to have all options added and enabled in the device
> > tree. The kernel would then bind each device and run each driver's probe
> > function. This works, but has been broken before due to the introduction
> > of asynchronous probing, causing multiple instances requesting "shared"
> > resources, such as pinmuxes, GPIO pins, interrupt lines, at the same
> > time, with only one instance succeeding. Work arounds for these include
> > moving the pinmux to the parent I2C controller, using GPIO hogs or
> > pinmux settings to keep the GPIO pins in some fixed configuration, and
> > requesting the interrupt line very late. Such configurations can be seen
> > on the MT8183 Krane Chromebook tablets, and the Qualcomm sc8280xp-based
> > Lenovo Thinkpad 13S.
> >
> > Instead of this delicate dance between drivers and device tree quirks,
> > this change introduces a simple I2C component probe. function For a
>
> s/probe. function/probe function./

Ack.

> > +static int i2c_of_probe_enable_node(struct device *dev, struct device_node *node)
> > +{
> > +       int ret;
> > +
> > +       dev_info(dev, "Enabling %pOF\n", node);
> > +
> > +       struct of_changeset *ocs __free(kfree) = kzalloc(sizeof(*ocs), GFP_KERNEL);
> > +       if (!ocs)
> > +               return -ENOMEM;
>
> I guess the kernel lets you mix code and declarations now? I'm still
> used to all declarations being together but maybe I'm old school... I
> would have put the "dev_info" below the allocation...

AFAIK this is an exception. Excerpt from include/linux/cleanup.h:

    When the unwind order matters it requires that variables be defined
    mid-function scope rather than at the top of the file.

and

    Given that the "__free(...) = NULL" pattern for variables defined at
    the top of the function poses this potential interdependency problem
    the recommendation is to always define and assign variables in one
    statement and not group variable definitions at the top of the
    function when __free() is used.


>
> > +/**
> > + * i2c_of_probe_component() - probe for devices of "type" on the same i2c bus
> > + * @dev: Pointer to the &struct device of the caller, only used for dev_printk() messages.
> > + * @cfg: Pointer to the &struct i2c_of_probe_cfg containing callbacks and other options
> > + *       for the prober.
> > + * @ctx: Context data for callbacks.
> > + *
> > + * Probe for possible I2C components of the same "type" (&i2c_of_probe_cfg->type)
> > + * on the same I2C bus that have their status marked as "fail".
>
> I may have missed it, but originally this was ones marked
> "fail-needs-probe", right? Now it tries all types of fail?
>
>
> > + * Assumes that across the entire device tree the only instances of nodes
> > + * prefixed with "type" are the ones that need handling for second source
> > + * components. In other words, if "type" is "touchscreen", then all device
> > + * nodes named "touchscreen*" are the ones that need probing. There cannot
>
> "touchscreen*" implies that it can have an arbitrary suffix. Can it?

That is the idea. The use case is for components that have conflicting
addresses and need special probing. Such device nodes obviously can't
have the same node name. This is planned but not implemented in this
series.

> ...or can it just have a unit address?

IIUC in DT jargon the "node name" does not include the address. The name
including the address is the "full name".

> > + * be another "touchscreen" node that is already enabled.
> > + *
> > + * Assumes that for each "type" of component, only one actually exists. In
> > + * other words, only one matching and existing device will be enabled.
> > + *
> > + * Context: Process context only. Does non-atomic I2C transfers.
> > + *          Should only be used from a driver probe function, as the function
> > + *          can return -EPROBE_DEFER if the I2C adapter or other resources
> > + *          are unavailable.
> > + * Return: 0 on success or no-op, error code otherwise.
> > + *         A no-op can happen when it seems like the device tree already
> > + *         has components of the type to be probed already enabled. This
> > + *         can happen when the device tree had not been updated to mark
> > + *         the status of the to-be-probed components as "fail". Or this
> > + *         function was already run with the same parameters and succeeded
> > + *         in enabling a component. The latter could happen if the user
>
> s/latter/later

Are you sure?

> > + *         had multiple types of components to probe, and one of them down
> > + *         the list caused a deferred probe. This is expected behavior.
> > + */
> > +int i2c_of_probe_component(struct device *dev, const struct i2c_of_probe_cfg *cfg, void *ctx)
> > +{
> > +       const struct i2c_of_probe_ops *ops;
> > +       const char *type;
> > +       struct device_node *i2c_node;
> > +       struct i2c_adapter *i2c;
> > +       int ret;
> > +
> > +       if (!cfg)
> > +               return -EINVAL;
>
> Drop extra check of "!cfg". In general kernel conventions don't check
> for NULL pointers passed by caller unless it's an expected case. You
> don't check for a NULL "dev" and you shouldn't need to check for a
> NULL "cfg". They are both simply required parameters.

"dev" is only passed to dev_printk(), and that can handle "dev" being
NULL. Same can't be said for "cfg".

I don't know what the preference is though. Crashing is probably not the
nicest thing, even if it only happens to developers.

> There are a few other places in the patch series where it feels like
> there are extra arg checks that aren't really needed...
>
>
> > +       ops = cfg->ops ?: &i2c_of_probe_dummy_ops;
> > +       type = cfg->type;
> > +
> > +       i2c_node = i2c_of_probe_get_i2c_node(dev, type);
> > +       if (IS_ERR(i2c_node))
> > +               return PTR_ERR(i2c_node);
> > +
> > +       for_each_child_of_node_with_prefix(i2c_node, node, type) {
>
> I wouldn't object to a comment before this for loop:
>
> /* If any devices of this type are already enabled then the function
> is a noop */
>
> ...or it could be a helper function.

That is what the commeet within the loop is trying to say. I'll move
it before the loop and incorporate your words. The loop can then be
rewritten to return early.

> > +               if (!of_device_is_available(node))
> > +                       continue;
> > +
> > +               /*
> > +                * Device tree has component already enabled. Either the
> > +                * device tree isn't supported or we already probed once.
> > +                */
> > +               ret = 0;
> > +               goto out_put_i2c_node;
> > +       }
> > +
> > +       i2c = of_get_i2c_adapter_by_node(i2c_node);
> > +       if (!i2c) {
> > +               ret = dev_err_probe(dev, -EPROBE_DEFER, "Couldn't get I2C adapter\n");
> > +               goto out_put_i2c_node;
> > +       }
> > +
> > +       /* Grab resources */
> > +       ret = 0;
> > +       if (ops->get_resources)
> > +               ret = ops->get_resources(dev, i2c_node, ctx);
> > +       if (ret)
> > +               goto out_put_i2c_adapter;
> > +
> > +       /* Enable resources */
> > +       if (ops->enable)
> > +               ret = ops->enable(dev, ctx);
> > +       if (ret)
> > +               goto out_release_resources;
>
> I won't insist, but a part of me wonders whether we should just
> combine "get_resources" and "enable" and then combine "cleanup" and
> "free_resources_late". They are always paired one after another and
> I'm having a hard time seeing why they need to be separate. It's not
> like you'll ever get the resources and then enable/disable multiple
> times.

Maybe. The structure was carried over from the original non-callback
version. I think it's easier to reason about if they are kept separate,
especially since the outgoing path is slightly different when no working
component is found and one of the callbacks ends up not getting called.

> > +/**
> > + * struct i2c_of_probe_ops - I2C OF component prober callbacks
> > + *
> > + * A set of callbacks to be used by i2c_of_probe_component().
> > + *
> > + * All callbacks are optional. Callbacks are called only once per run, and are
> > + * used in the order they are defined in this structure.
> > + *
> > + * All callbacks that have return values shall return %0 on success,
> > + * or a negative error number on failure.
> > + *
> > + * The @dev parameter passed to the callbacks is the same as @dev passed to
> > + * i2c_of_probe_component(). It should only be used for dev_printk() calls
> > + * and nothing else, especially not managed device resource (devres) APIs.
> > + */
> > +struct i2c_of_probe_ops {
> > +       /** @get_resources: Retrieve resources for components. */
> > +       int (*get_resources)(struct device *dev, struct device_node *bus_node, void *data);
> > +
> > +       /** @free_resources_early: Release exclusive resources prior to enabling component. */
> > +       void (*free_resources_early)(void *data);
>
> It would be good if the doc here mentioned what happened if no
> components were found and thus nothing was enabled. Is the function
> still called? It looks like "no" and "cleanup" is in charge of
> cleaning in this case. Feels like the docs need to be more explicit.

Ack.


Thanks
ChenYu


From Jason-JH.Lin at mediatek.com  Sun Sep 15 07:56:02 2024
From: Jason-JH.Lin at mediatek.com (=?utf-8?B?SmFzb24tSkggTGluICjmnpfnnb/npaUp?=)
Date: Sun, 15 Sep 2024 14:56:02 +0000
Subject: [PATCH] drm/mediatek: ovl: Add fmt_support_man for MT8192 and
 MT8195
In-Reply-To: <c8f8d556-77bf-4b60-abd9-bfcf7ac40ac5@gmail.com>
References: <20240914201819.3357-1-jason-jh.lin@mediatek.com>
	 <c8f8d556-77bf-4b60-abd9-bfcf7ac40ac5@gmail.com>
Message-ID: <dfe83cde23f263f4d791da093c5655f10d56577a.camel@mediatek.com>

Hi Alper,

On Sun, 2024-09-15 at 13:54 +0300, Alper Nebi Yasak wrote:
>  	 
> External email : Please do not click links or open attachments until
> you have verified the sender or the content.
>  Hi,
> 
> On 2024-09-14 23:18 +03:00, Jason-JH.Lin wrote:
> > OVL_CON_CLRFMT_MAN is an configuration for extending color format
> > settings of DISP_REG_OVL_CON(n).
> > It will change some of the original color format settings.
> > 
> > Take the settings of (3 << 12) for example.
> > - If OVL_CON_CLRFMT_MAN = 0 means OVL_CON_CLRFMT_RGBA8888.
> > - If OVL_CON_CLRFMT_MAN = 1 means OVL_CON_CLRFMT_PARGB8888.
> > 
> > Since OVL_CON_CLRFMT_MAN is not supported on previous SoCs,
> > It breaks the OVL color format setting of MT8173.
> > So add fmt_support_man to the driver data of MT8192 and MT8195
> > to solve the downgrade problem.
> > 
> > Fixes: a3f7f7ef4bfe ("drm/mediatek: Support "Pre-multiplied"
> blending in OVL")
> > Signed-off-by: Jason-JH.Lin <jason-jh.lin at mediatek.com>
> > ---
> >  drivers/gpu/drm/mediatek/mtk_disp_ovl.c | 28 ++++++++++++++++++---
> ----
> >  1 file changed, 20 insertions(+), 8 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
> b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
> > index 89b439dcf3a6..aa575569f996 100644
> > --- a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
> > +++ b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
> > @@ -70,10 +70,18 @@
> >  #define OVL_CON_CLRFMT_UYVY(4 << 12)
> >  #define OVL_CON_CLRFMT_YUYV(5 << 12)
> >  #define OVL_CON_MTX_YUV_TO_RGB(6 << 16)
> > -#define OVL_CON_CLRFMT_PARGB8888 ((3 << 12) | OVL_CON_CLRFMT_MAN)
> > -#define OVL_CON_CLRFMT_PABGR8888 (OVL_CON_CLRFMT_PARGB8888 |
> OVL_CON_RGB_SWAP)
> > -#define OVL_CON_CLRFMT_PBGRA8888 (OVL_CON_CLRFMT_PARGB8888 |
> OVL_CON_BYTE_SWAP)
> > -#define OVL_CON_CLRFMT_PRGBA8888 (OVL_CON_CLRFMT_PABGR8888 |
> OVL_CON_BYTE_SWAP)
> > +#define OVL_CON_CLRFMT_PARGB8888(ovl)((ovl)->data->fmt_support_man 
> ? \
> > +((3 << 12) | OVL_CON_CLRFMT_MAN) : \
> > +OVL_CON_CLRFMT_ABGR8888)
> 
> Should be OVL_CON_CLRFMT_ARGB8888 (*RGB* vs *BGR*)?
> 
> Otherwise I still see broken colors, but in blue instead of red.
> 

Yes, that was a typo. It should be original settings (ARGB8888).

> > +#define OVL_CON_CLRFMT_PABGR8888(ovl)((ovl)->data->fmt_support_man 
> ? \
> > +(OVL_CON_CLRFMT_PARGB8888 | OVL_CON_RGB_SWAP) : \
> 
> Compile error, likely (OVL_CON_CLRFMT_PARGB8888(ovl) | ...)?
> 

Yes, my mistake...

> > +OVL_CON_CLRFMT_ABGR8888)
> > +#define OVL_CON_CLRFMT_PBGRA8888(ovl)((ovl)->data->fmt_support_man 
> ? \
> > +(OVL_CON_CLRFMT_PARGB8888 | OVL_CON_BYTE_SWAP) : \
> 
> Same as above, OVL_CON_CLRFMT_PARGB8888(ovl)
> 
> > +OVL_CON_CLRFMT_BGRA8888)
> > +#define OVL_CON_CLRFMT_PRGBA8888(ovl)((ovl)->data->fmt_support_man 
> ? \
> > +(OVL_CON_CLRFMT_PABGR8888 | OVL_CON_BYTE_SWAP) : \
> 
> Same as above, OVL_CON_CLRFMT_PABGR8888(ovl)
> 
> > +OVL_CON_CLRFMT_RGBA8888)
> >  #define OVL_CON_CLRFMT_RGB565(ovl)((ovl)->data->fmt_rgb565_is_0 ?
> \
> >  0 : OVL_CON_CLRFMT_RGB)
> >  #define OVL_CON_CLRFMT_RGB888(ovl)((ovl)->data->fmt_rgb565_is_0 ?
> \
> 
> With those changes, colors are fine on my MT8173, MT8183, MT8186 
> Chromebooks.

Thanks for your verification.
I'll fix them and send v2 soon.

Regards,
Jason-JH.Lin


From jason-jh.lin at mediatek.com  Sun Sep 15 09:12:45 2024
From: jason-jh.lin at mediatek.com (Jason-JH.Lin)
Date: Mon, 16 Sep 2024 00:12:45 +0800
Subject: [PATCH v2] drm/mediatek: ovl: Add fmt_support_man for MT8192 and MT8195
Message-ID: <20240915161245.30296-1-jason-jh.lin@mediatek.com>

OVL_CON_CLRFMT_MAN is an configuration for extending color format
settings of DISP_REG_OVL_CON(n).
It will change some of the original color format settings.

Take the settings of (3 << 12) for example.
- If OVL_CON_CLRFMT_MAN = 0 means OVL_CON_CLRFMT_RGBA8888.
- If OVL_CON_CLRFMT_MAN = 1 means OVL_CON_CLRFMT_PARGB8888.

Since OVL_CON_CLRFMT_MAN is not supported on previous SoCs,
It breaks the OVL color format setting of MT8173.
So add fmt_support_man to the driver data of MT8192 and MT8195
to solve the downgrade problem.

Fixes: a3f7f7ef4bfe ("drm/mediatek: Support "Pre-multiplied" blending in OVL")
Signed-off-by: Jason-JH.Lin <jason-jh.lin at mediatek.com>
---
 drivers/gpu/drm/mediatek/mtk_disp_ovl.c | 43 ++++++++++++++++++++-----
 1 file changed, 35 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
index 89b439dcf3a6..7b053ca25b10 100644
--- a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
+++ b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
@@ -70,10 +70,33 @@
 #define OVL_CON_CLRFMT_UYVY	(4 << 12)
 #define OVL_CON_CLRFMT_YUYV	(5 << 12)
 #define OVL_CON_MTX_YUV_TO_RGB	(6 << 16)
-#define OVL_CON_CLRFMT_PARGB8888 ((3 << 12) | OVL_CON_CLRFMT_MAN)
-#define OVL_CON_CLRFMT_PABGR8888 (OVL_CON_CLRFMT_PARGB8888 | OVL_CON_RGB_SWAP)
-#define OVL_CON_CLRFMT_PBGRA8888 (OVL_CON_CLRFMT_PARGB8888 | OVL_CON_BYTE_SWAP)
-#define OVL_CON_CLRFMT_PRGBA8888 (OVL_CON_CLRFMT_PABGR8888 | OVL_CON_BYTE_SWAP)
+
+#define OVL_CON_CLRFMT_PARGB8888(ovl)  ({ \
+	struct mtk_disp_ovl *_ovl = (ovl); \
+	(_ovl->data->fmt_support_man ? \
+	((3 << 12) | OVL_CON_CLRFMT_MAN) : OVL_CON_CLRFMT_ARGB8888); \
+})
+
+#define OVL_CON_CLRFMT_PABGR8888(ovl)  ({ \
+	struct mtk_disp_ovl *_ovl = (ovl); \
+	(_ovl->data->fmt_support_man ? \
+	(OVL_CON_CLRFMT_PARGB8888(_ovl) | OVL_CON_RGB_SWAP) : OVL_CON_CLRFMT_ABGR8888); \
+})
+
+#define OVL_CON_CLRFMT_PBGRA8888(ovl)  ({ \
+	struct mtk_disp_ovl *_ovl = (ovl); \
+	(_ovl->data->fmt_support_man ? \
+	(OVL_CON_CLRFMT_PARGB8888(_ovl) | OVL_CON_BYTE_SWAP) : \
+	 OVL_CON_CLRFMT_BGRA8888); \
+})
+
+#define OVL_CON_CLRFMT_PRGBA8888(ovl)  ({ \
+	struct mtk_disp_ovl *_ovl = (ovl); \
+	(_ovl->data->fmt_support_man ? \
+	(OVL_CON_CLRFMT_PABGR8888(_ovl) | OVL_CON_BYTE_SWAP) : \
+	OVL_CON_CLRFMT_RGBA8888); \
+})
+
 #define OVL_CON_CLRFMT_RGB565(ovl)	((ovl)->data->fmt_rgb565_is_0 ? \
 					0 : OVL_CON_CLRFMT_RGB)
 #define OVL_CON_CLRFMT_RGB888(ovl)	((ovl)->data->fmt_rgb565_is_0 ? \
@@ -144,6 +167,7 @@ struct mtk_disp_ovl_data {
 	unsigned int gmc_bits;
 	unsigned int layer_nr;
 	bool fmt_rgb565_is_0;
+	bool fmt_support_man;
 	bool smi_id_en;
 	bool supports_afbc;
 	const u32 *formats;
@@ -410,28 +434,28 @@ static unsigned int ovl_fmt_convert(struct mtk_disp_ovl *ovl, unsigned int fmt,
 	case DRM_FORMAT_RGBA1010102:
 		return blend_mode == DRM_MODE_BLEND_COVERAGE ?
 		       OVL_CON_CLRFMT_RGBA8888 :
-		       OVL_CON_CLRFMT_PRGBA8888;
+		       OVL_CON_CLRFMT_PRGBA8888(ovl);
 	case DRM_FORMAT_BGRX8888:
 	case DRM_FORMAT_BGRA8888:
 	case DRM_FORMAT_BGRX1010102:
 	case DRM_FORMAT_BGRA1010102:
 		return blend_mode == DRM_MODE_BLEND_COVERAGE ?
 		       OVL_CON_CLRFMT_BGRA8888 :
-		       OVL_CON_CLRFMT_PBGRA8888;
+		       OVL_CON_CLRFMT_PBGRA8888(ovl);
 	case DRM_FORMAT_XRGB8888:
 	case DRM_FORMAT_ARGB8888:
 	case DRM_FORMAT_XRGB2101010:
 	case DRM_FORMAT_ARGB2101010:
 		return blend_mode == DRM_MODE_BLEND_COVERAGE ?
 		       OVL_CON_CLRFMT_ARGB8888 :
-		       OVL_CON_CLRFMT_PARGB8888;
+		       OVL_CON_CLRFMT_PARGB8888(ovl);
 	case DRM_FORMAT_XBGR8888:
 	case DRM_FORMAT_ABGR8888:
 	case DRM_FORMAT_XBGR2101010:
 	case DRM_FORMAT_ABGR2101010:
 		return blend_mode == DRM_MODE_BLEND_COVERAGE ?
 		       OVL_CON_CLRFMT_ABGR8888 :
-		       OVL_CON_CLRFMT_PABGR8888;
+		       OVL_CON_CLRFMT_PABGR8888(ovl);
 	case DRM_FORMAT_UYVY:
 		return OVL_CON_CLRFMT_UYVY | OVL_CON_MTX_YUV_TO_RGB;
 	case DRM_FORMAT_YUYV:
@@ -662,6 +686,7 @@ static const struct mtk_disp_ovl_data mt8192_ovl_driver_data = {
 	.gmc_bits = 10,
 	.layer_nr = 4,
 	.fmt_rgb565_is_0 = true,
+	.fmt_support_man = true,
 	.smi_id_en = true,
 	.formats = mt8173_formats,
 	.num_formats = ARRAY_SIZE(mt8173_formats),
@@ -672,6 +697,7 @@ static const struct mtk_disp_ovl_data mt8192_ovl_2l_driver_data = {
 	.gmc_bits = 10,
 	.layer_nr = 2,
 	.fmt_rgb565_is_0 = true,
+	.fmt_support_man = true,
 	.smi_id_en = true,
 	.formats = mt8173_formats,
 	.num_formats = ARRAY_SIZE(mt8173_formats),
@@ -682,6 +708,7 @@ static const struct mtk_disp_ovl_data mt8195_ovl_driver_data = {
 	.gmc_bits = 10,
 	.layer_nr = 4,
 	.fmt_rgb565_is_0 = true,
+	.fmt_support_man = true,
 	.smi_id_en = true,
 	.supports_afbc = true,
 	.formats = mt8195_formats,
-- 
2.43.0



From martin.blumenstingl at googlemail.com  Sun Sep 15 12:34:33 2024
From: martin.blumenstingl at googlemail.com (Martin Blumenstingl)
Date: Sun, 15 Sep 2024 21:34:33 +0200
Subject: [PATCH 1/5] drm/meson: drop unused staitc dw_hdmi_dwc_write_bits
In-Reply-To: <20240908-regmap-config-const-v1-1-28f349004811@linaro.org>
References: <20240908-regmap-config-const-v1-0-28f349004811@linaro.org> <20240908-regmap-config-const-v1-1-28f349004811@linaro.org>
Message-ID: <CAFBinCB=4MtDSc94N-ijgjd0T6-O9pe26Wg+B44miX=iY1vmow@mail.gmail.com>

On Sun, Sep 8, 2024 at 4:21?PM Krzysztof Kozlowski
<krzysztof.kozlowski at linaro.org> wrote:
>
> static inline dw_hdmi_dwc_write_bits() function is not used at all:
>
>   drivers/gpu/drm/meson/meson_dw_hdmi.c:276:20: error: unused function 'dw_hdmi_dwc_write_bits' [-Werror,-Wunused-function]
>
> Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski at linaro.org>
Reviewed-by: Martin Blumenstingl <martin.blumenstingl at googlemail.com>

maybe s/staitc/static/ can be applied to $SUBJECT when applying this patch


Best regards,
Martin


From jiande.lu at mediatek.com  Sun Sep 15 20:22:28 2024
From: jiande.lu at mediatek.com (Jiande Lu)
Date: Mon, 16 Sep 2024 11:22:28 +0800
Subject: [PATCH] Bluetooth: btusb: Add USB HW IDs for MT7920/MT7925
Message-ID: <20240916032228.6601-1-jiande.lu@mediatek.com>

Add HW IDs for wireless module. These HW IDs are extracted from
Windows driver inf file and the test for card bring up successful.

Signed-off-by: Jiande Lu <jiande.lu at mediatek.com>
---
 drivers/bluetooth/btusb.c | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
index 6c9c761d5b93..8946aafae640 100644
--- a/drivers/bluetooth/btusb.c
+++ b/drivers/bluetooth/btusb.c
@@ -563,6 +563,16 @@ static const struct usb_device_id quirks_table[] = {
 	{ USB_DEVICE(0x043e, 0x3109), .driver_info = BTUSB_MEDIATEK |
 						     BTUSB_WIDEBAND_SPEECH },
 
+	/* Additional MediaTek MT7920 Bluetooth devices */
+	{ USB_DEVICE(0x0489, 0xe134), .driver_info = BTUSB_MEDIATEK |
+						     BTUSB_WIDEBAND_SPEECH },
+	{ USB_DEVICE(0x13d3, 0x3620), .driver_info = BTUSB_MEDIATEK |
+						     BTUSB_WIDEBAND_SPEECH },
+	{ USB_DEVICE(0x13d3, 0x3621), .driver_info = BTUSB_MEDIATEK |
+						     BTUSB_WIDEBAND_SPEECH },
+	{ USB_DEVICE(0x13d3, 0x3622), .driver_info = BTUSB_MEDIATEK |
+						     BTUSB_WIDEBAND_SPEECH },
+
 	/* Additional MediaTek MT7921 Bluetooth devices */
 	{ USB_DEVICE(0x0489, 0xe0c8), .driver_info = BTUSB_MEDIATEK |
 						     BTUSB_WIDEBAND_SPEECH },
@@ -636,6 +646,8 @@ static const struct usb_device_id quirks_table[] = {
 						     BTUSB_WIDEBAND_SPEECH },
 	{ USB_DEVICE(0x0489, 0xe11e), .driver_info = BTUSB_MEDIATEK |
 						     BTUSB_WIDEBAND_SPEECH },
+	{ USB_DEVICE(0x0489, 0xe139), .driver_info = BTUSB_MEDIATEK |
+						     BTUSB_WIDEBAND_SPEECH },
 	{ USB_DEVICE(0x13d3, 0x3602), .driver_info = BTUSB_MEDIATEK |
 						     BTUSB_WIDEBAND_SPEECH },
 	{ USB_DEVICE(0x13d3, 0x3603), .driver_info = BTUSB_MEDIATEK |
-- 
2.45.2



From mingyen.hsieh at mediatek.com  Sun Sep 15 23:01:57 2024
From: mingyen.hsieh at mediatek.com (Mingyen Hsieh)
Date: Mon, 16 Sep 2024 14:01:57 +0800
Subject: [PATCH] wifi: mt76: mt7921s: fix a potential firmware freeze during startup
Message-ID: <20240916060157.10157-1-mingyen.hsieh@mediatek.com>

From: Leon Yen <leon.yen at mediatek.com>

The maximum command quota of the firmware may be exceeded because the
command to retrieve the quota setting has not been taken into account.

This patch considers not only the quota usage of the command retrieving
quota settings but also limits the total quota usage.

Signed-off-by: Leon Yen <leon.yen at mediatek.com>
Signed-off-by: Ming Yen Hsieh <mingyen.hsieh at mediatek.com>
---
 drivers/net/wireless/mediatek/mt76/mt76.h       | 1 +
 drivers/net/wireless/mediatek/mt76/mt7921/mcu.c | 5 ++++-
 drivers/net/wireless/mediatek/mt76/sdio_txrx.c  | 4 ++++
 3 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/mediatek/mt76/mt76.h b/drivers/net/wireless/mediatek/mt76/mt76.h
index 0b75a45ad2e8..4432020b7f7d 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76.h
+++ b/drivers/net/wireless/mediatek/mt76/mt76.h
@@ -636,6 +636,7 @@ struct mt76_sdio {
 	u8 hw_ver;
 	wait_queue_head_t wait;
 
+	int pse_mcu_quota_max;
 	struct {
 		int pse_data_quota;
 		int ple_data_quota;
diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7921/mcu.c
index 02c1de8620a7..ddc5986086d9 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7921/mcu.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7921/mcu.c
@@ -507,7 +507,10 @@ static void mt7921_mcu_parse_tx_resource(struct mt76_dev *dev,
 
 	tx_res = (struct mt7921_tx_resource *)skb->data;
 	sdio->sched.pse_data_quota = le32_to_cpu(tx_res->pse_data_quota);
-	sdio->sched.pse_mcu_quota = le32_to_cpu(tx_res->pse_mcu_quota);
+	sdio->pse_mcu_quota_max = le32_to_cpu(tx_res->pse_mcu_quota);
+	/* The mcu quota usage of this function itself must be taken into consideration */
+	sdio->sched.pse_mcu_quota =
+		sdio->sched.pse_mcu_quota ? sdio->pse_mcu_quota_max : sdio->pse_mcu_quota_max - 1;
 	sdio->sched.ple_data_quota = le32_to_cpu(tx_res->ple_data_quota);
 	sdio->sched.pse_page_size = le16_to_cpu(tx_res->pse_page_size);
 	sdio->sched.deficit = tx_res->pp_padding;
diff --git a/drivers/net/wireless/mediatek/mt76/sdio_txrx.c b/drivers/net/wireless/mediatek/mt76/sdio_txrx.c
index ddd8c0cc744d..0a927a7313a6 100644
--- a/drivers/net/wireless/mediatek/mt76/sdio_txrx.c
+++ b/drivers/net/wireless/mediatek/mt76/sdio_txrx.c
@@ -46,6 +46,10 @@ static int mt76s_refill_sched_quota(struct mt76_dev *dev, u32 *data)
 		return 0;
 
 	sdio->sched.pse_mcu_quota += pse_mcu_quota;
+	if (sdio->pse_mcu_quota_max &&
+	    sdio->sched.pse_mcu_quota > sdio->pse_mcu_quota_max) {
+		sdio->sched.pse_mcu_quota = sdio->pse_mcu_quota_max;
+	}
 	sdio->sched.pse_data_quota += pse_data_quota;
 	sdio->sched.ple_data_quota += ple_data_quota;
 
-- 
2.45.2



From krzk at kernel.org  Mon Sep 16 01:38:46 2024
From: krzk at kernel.org (Krzysztof Kozlowski)
Date: Mon, 16 Sep 2024 10:38:46 +0200
Subject: [PATCH v4 2/3] dt-bindings: mfd: mediatek: mt6397: Convert to DT
 schema format
In-Reply-To: <20240914132811.9637-1-macpaul.lin@mediatek.com>
References: <20240914132811.9637-1-macpaul.lin@mediatek.com>
Message-ID: <a6ufiqp4g7cbryggha3q5fnfr4deuf6abvxy24ttjoigadcgvm@h4xnbuxsv2hi>

On Sat, Sep 14, 2024 at 09:28:11PM +0800, Macpaul Lin wrote:
> Convert the mfd: mediatek: mt6397 binding to DT schema format.
> 
> MT6323, MT6358, and MT6397 are PMIC devices with multiple function
> subdevices. They share a common PMIC design but have variations in
> subdevice combinations.
> 
> Key updates in this conversion:
> 
> 1. RTC:
>    - Convert rtc-mt6397.txt and merge into parent MT6397 PMIC DT schema.
> 
> 2. Regulators:
>    - Align to generic name "regulators".
>    - Update references from .txt to .yaml for mt6323, mt6358, and mt6397
>      regulators.
>    - Simplify regulator name labels in device tree examples.
> 
> 3. Audio Codec:
>    - Convert sound/mt6358.txt and merge into parent MT6397 PMIC DT schema.
>    - Align to generic name "audio-codec" for codec and sound subdevices.
>    - Add "mediatek,dmic-mode" and "Avdd-supply" properties.
> 
> 4. Clocks:
>    - Align to generic name "clocks" for clockbuffer subdevices.
> 
> 5. LEDs:
>    - Convert leds-mt6323.txt and merge into parent MT6397 PMIC DT schema.
>    - Update LED binding.
> 
> 6. Keys:
>    - Add detailed descriptions for power and home keys.
>    - Add compatible: mediatek,mt6358-keys.
> 
> 7. Power Controller:
>    - Convert mt6323-poweroff.txt and merge into parent MT6397 PMIC DT
>      schema.
>    - Add #power-domain-cells property to fix dt-binding check error.
>    - Clarify "BBPU" as "Baseband power up".
> 
> 8. Pinctrl:
>    - Align to generic name "pinctrl" instead of "pin-controller".
> 
> 9. Compatible:
>    - Drop "mediatek,mt6357" since there is a separated DT Schema
>      for PMIC MT6357.
> 
> Additional updates:
> - MAINTAINERS: Add co-maintainers and reference to
>   mfd/mediatek,mt6397.yaml for LED and power-controller drivers.
> - input/mediatek,pmic-keys.yaml: Update reference to
>   mfd/mediatek,mt6397.yaml.
> 
> Signed-off-by: Sen Chu <sen.chu at mediatek.com>
> Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>


Limited review since this fails tests.

> ---
>  .../bindings/input/mediatek,pmic-keys.yaml    |    2 +-
>  .../devicetree/bindings/leds/leds-mt6323.txt  |   63 -
>  .../bindings/mfd/mediatek,mt6397.yaml         | 1077 +++++++++++++++++
>  .../devicetree/bindings/mfd/mt6397.txt        |  110 --
>  .../bindings/power/reset/mt6323-poweroff.txt  |   20 -
>  .../devicetree/bindings/rtc/rtc-mt6397.txt    |   31 -
>  .../devicetree/bindings/sound/mt6358.txt      |   26 -
>  MAINTAINERS                                   |    8 +-
>  8 files changed, 1084 insertions(+), 253 deletions(-)
>  delete mode 100644 Documentation/devicetree/bindings/leds/leds-mt6323.txt
>  create mode 100644 Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml
>  delete mode 100644 Documentation/devicetree/bindings/mfd/mt6397.txt
>  delete mode 100644 Documentation/devicetree/bindings/power/reset/mt6323-poweroff.txt
>  delete mode 100644 Documentation/devicetree/bindings/rtc/rtc-mt6397.txt
>  delete mode 100644 Documentation/devicetree/bindings/sound/mt6358.txt
> 
> Changes for v1:
>  - This patch depends on conversion of mediatek,mt6397-regulator.yaml
>    [1] https://lore.kernel.org/lkml/20240807091738.18387-1-macpaul.lin at mediatek.com/T/
> 
> Changes for v2:
>  - This patch has been made base on linux-next/master git repo.
>  - Keep the parent and child relationship with mediatek,pwrap in description.
>    [2] https://lore.kernel.org/all/20240826-slurp-earphone-0d5173923ae8 at spud/
>  - Keep the $ref for regulators since dt_binding_check didn't report any issue
>    based on linux-next/master repo.
>  - Fix description of mt6397/mt6323 devices, use "power management chip"
>    instead of "multifunction device"
>  - Drop unnecessary comments or description according to the review.
>  - Convert sub-modules to DT Schema:
>   - RTC, LEDs, power-controllers, regulators
>  - Drop duplicate sub node name and description for sub-modules
>   - RTC, Keys
>  - examples:
>   - drop parent pwrap node
>   - Add examples from mediatek,mt6323-regulator.yaml
>   - Add examples from mediatek,mt6358-regulator.yaml
>   - Add examples from mediatek,mt6397-regulator.yaml
>   - Complete the examples as could as possible.
> 
> Changes for v3:
>  - Rebased on linux-next/master git repo near next-20240906.
>  - Revise commit message.
>  - Regulators:
>   - Use "additionalProperties: true" and add "contains" for matching
>     $ref DT bindings.
>   - Simplify regulator name labels in device tree examples.
>  - LEDs:
>   - Use LED bindings.
>  - Squash following patches in v2 for removing old text format DT bindings
>    into this patch, includes:
>   - leds-mt6323.txt, mt6323-poweroff.txt, rtc-mt6397.txt, sound/mt6358.txt.
>  - Fix file format of DT schemas, add blank between properties.
>  - Fix 'make checkrefdoc' errors, update reference in mediatek,pmic-keys.yaml.
> 
> Changes for v4:
>  - Remove "mediatek,mt6357" from PMIC's compatible string since there is a
>    seperated DT schema for PMIC mt6357.
> 

...

> +$id: http://devicetree.org/schemas/mfd/mediatek,mt6397.yaml#
> +$schema: http://devicetree.org/meta-schemas/core.yaml#
> +
> +title: MediaTek MT6397/MT6323 Multifunction Device (PMIC)

s/Multifunction Device/PMIC/

> +
> +maintainers:
> +  - Sen Chu <sen.chu at mediatek.com>
> +  - Macpaul Lin <macpaul.lin at mediatek.com>
> +
> +description: |
> +  MT6397/MT6323 is a power management system chip.
> +  Please see the sub-modules below for supported features.
> +
> +  MT6397/MT6323 is a multifunction device with the following sub modules:
> +  - Regulators
> +  - RTC
> +  - Audio codec
> +  - GPIO
> +  - Clock
> +  - LED
> +  - Keys
> +  - Power controller
> +
> +  It is interfaced to host controller using SPI interface by a proprietary hardware
> +  called PMIC wrapper or pwrap. MT6397/MT6323 PMIC is a child device of pwrap.
> +  See the following for pwrap node definitions:
> +  Documentation/devicetree/bindings/soc/mediatek/mediatek,pwrap.yaml
> +
> +properties:
> +  compatible:
> +    oneOf:
> +      - enum:
> +          - mediatek,mt6323
> +          - mediatek,mt6331 # "mediatek,mt6331" for PMIC MT6331 and MT6332.
> +          - mediatek,mt6358
> +          - mediatek,mt6359
> +          - mediatek,mt6397
> +      - items:
> +          - enum:
> +              - mediatek,mt6366
> +          - const: mediatek,mt6358
> +
> +  interrupts:
> +    maxItems: 1
> +
> +  interrupt-controller: true
> +
> +  "#interrupt-cells":
> +    const: 2
> +
> +  rtc:
> +    type: object
> +    $ref: /schemas/rtc/rtc.yaml#
> +    unevaluatedProperties: false
> +    description:
> +      MT6397 Real Time Clock.
> +
> +    properties:
> +      compatible:
> +        oneOf:
> +          - enum:
> +              - mediatek,mt6323-rtc
> +              - mediatek,mt6331-rtc
> +              - mediatek,mt6358-rtc
> +              - mediatek,mt6397-rtc
> +          - items:
> +              - enum:
> +                  - mediatek,mt6366-rtc
> +              - const: mediatek,mt6358-rtc
> +
> +      start-year: true

Drop

> +
> +    required:
> +      - compatible
> +
> +  regulators:
> +    type: object
> +    description:
> +      List of child nodes that specify the regulators.
> +    additionalProperties: true


> +    properties:
> +      compatible:
> +        oneOf:
> +          - enum:
> +              - mediatek,mt6323-regulator
> +              - mediatek,mt6358-regulator
> +              - mediatek,mt6397-regulator
> +          - items:
> +              - enum:
> +                  - mediatek,mt6366-regulator
> +              - const: mediatek,mt6358-regulator
> +
> +    required:
> +      - compatible
> +
> +    allOf:
> +      - if:
> +          properties:
> +            compatible:
> +              contains:
> +                const: mediatek,mt6323-regulator
> +
> +        then:
> +          $ref: /schemas/regulator/mediatek,mt6323-regulator.yaml
> +
> +      - if:
> +          properties:
> +            compatible:
> +              contains:
> +                const: mediatek,mt6358-regulator
> +
> +        then:
> +          $ref: /schemas/regulator/mediatek,mt6358-regulator.yaml
> +
> +      - if:
> +          properties:
> +            compatible:
> +              contains:
> +                const: mediatek,mt6397-regulator
> +
> +        then:
> +          $ref: /schemas/regulator/mediatek,mt6397-regulator.yaml

Drop this entire allOf. Not really needed.

> +
> +  audio-codec:
> +    type: object
> +    additionalProperties: false
> +    description:
> +      Audio codec support with MT6397 and MT6358.
> +    properties:
> +      compatible:
> +        oneOf:
> +          - enum:
> +              - mediatek,mt6397-codec
> +              - mediatek,mt6358-sound
> +          - items:
> +              - enum:
> +                  - mediatek,mt6366-sound
> +              - const: mediatek,mt6358-sound
> +
> +      mediatek,dmic-mode:
> +        description: |
> +          Indicates how many data pins are used to transmit two channels of PDM
> +          signal.
> +          0 - two wires;
> +          1 - one wire;
> +          Default value is 0.
> +        enum: [0, 1]
> +        default: 0
> +
> +      Avdd-supply:
> +        description: Power source of AVDD.
> +
> +    required:
> +      - compatible
> +
> +  clocks:
> +    type: object
> +    additionalProperties: false
> +    description: |

Do not need '|' unless you need to preserve formatting.

> +      This is a clock buffer node for mt6397. However, there are no sub nodes
> +      or any public document exposed in public.

Blank line

> +    properties:
> +      compatible:
> +        const: mediatek,mt6397-clk
> +      '#clock-cells':
> +        const: 1

Blank line

> +    required:
> +      - compatible
> +
> +  leds:
> +    type: object
> +    additionalProperties: false
> +    description: |
> +      MT6323 LED controller is subfunction provided by MT6323 PMIC, so the LED
> +      controllers are defined as the subnode of the function node provided by MT6323
> +      PMIC controller that is being defined as one kind of Muti-Function Device (MFD)
> +      using shared bus called PMIC wrapper for each subfunction to access remote
> +      MT6323 PMIC hardware.
> +
> +      Each led is represented as a child node of the mediatek,mt6323-led that
> +      describes the initial behavior for each LED physically and currently only four
> +      LED child nodes can be supported.
> +
> +    properties:
> +      compatible:
> +        enum:
> +          - mediatek,mt6323-led
> +          - mediatek,mt6331-led
> +          - mediatek,mt6332-led
> +
> +      reg:
> +        maxItems: 1
> +
> +      "#address-cells":
> +        const: 1
> +
> +      "#size-cells":
> +        const: 0
> +
> +    patternProperties:
> +      "^led@[0-3]$":
> +        type: object
> +        $ref: /schemas/leds/common.yaml#
> +        unevaluatedProperties: false
> +
> +        properties:
> +          reg:
> +            description:
> +              LED channel number (0..3)
> +            minimum: 0
> +            maximum: 3
> +
> +        required:
> +          - reg
> +
> +    required:
> +      - compatible
> +      - '#address-cells'
> +      - '#size-cells'
> +
> +  keys:
> +    type: object
> +    $ref: /schemas/input/mediatek,pmic-keys.yaml
> +    unevaluatedProperties: false
> +    description:
> +      Power and Home keys.
> +    properties:
> +      compatible:
> +        enum:
> +          - mediatek,mt6323-keys
> +          - mediatek,mt6331-keys
> +          - mediatek,mt6358-keys
> +          - mediatek,mt6397-keys

You have $ref so lisitng properties is confusing. What do you want to
achieve here?

> +
> +  power-controller:
> +    type: object
> +    additionalProperties: false
> +    description:
> +      The power controller which could be found on PMIC is responsible for
> +      externally powering off or on the remote MediaTek SoC through the
> +      circuit BBPU (baseband power up).
> +    properties:
> +      compatible:
> +        const: mediatek,mt6323-pwrc
> +
> +      '#power-domain-cells':
> +        const: 0
> +
> +  pinctrl:
> +    type: object
> +    $ref: /schemas/pinctrl/mediatek,mt65xx-pinctrl.yaml
> +    unevaluatedProperties: false
> +    description:
> +      Pin controller
> +    properties:
> +      compatible:
> +        const: mediatek,mt6397-pinctrl

Also confusing. I don't think you got my point from previous review.

> +
> +required:
> +  - compatible
> +  - regulators
> +
> +additionalProperties: false
> +
> +examples:
> +  - |
> +    #include <dt-bindings/interrupt-controller/arm-gic.h>
> +    #include <dt-bindings/leds/common.h>
> +
> +    pmic {
> +        compatible = "mediatek,mt6323";
> +        interrupt-parent = <&pio>;
> +        interrupts = <150 IRQ_TYPE_LEVEL_HIGH>;
> +        interrupt-controller;
> +        #interrupt-cells = <2>;
> +
> +        leds {
> +                compatible = "mediatek,mt6323-led";
> +                #address-cells = <1>;
> +                #size-cells = <0>;

Messed indentation.

> +        };

Best regards,
Krzysztof



From krzk at kernel.org  Mon Sep 16 02:25:11 2024
From: krzk at kernel.org (Krzysztof Kozlowski)
Date: Mon, 16 Sep 2024 11:25:11 +0200
Subject: [PATCH v4 1/3] regulator: dt-bindings: mt6323: Convert to DT
 schema
In-Reply-To: <20240914132731.9211-1-macpaul.lin@mediatek.com>
References: <20240914132731.9211-1-macpaul.lin@mediatek.com>
Message-ID: <iv2v4ywijimac7l336sgqqm4rfxpx73tgmsil63z7l2xilpivz@vmpff3oitslw>

On Sat, Sep 14, 2024 at 09:27:31PM +0800, Macpaul Lin wrote:
> Convert the MT6323 regulator binding from the old text-based format to
> the new DT schema style. The property "regulator-name" has been added
> as required property to reflect current usage in mt6323.dtsi.
> 
> Examples have been streamlined and relocated to the parent schema file:
>   mfd/mediatek,mt6397.yaml.
> 
> Update maintainer and submitter information with new entries from MediaTek.
> 
> The reference document cited in "mediatek,mt7530.yaml" has been updated
> to point to this new DT schema file
> 
> Signed-off-by: Sen Chu <sen.chu at mediatek.com>
> Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>

Reviewed-by: Krzysztof Kozlowski <krzk at kernel.org>

Best regards,
Krzysztof



From krzk at kernel.org  Mon Sep 16 02:39:53 2024
From: krzk at kernel.org (Krzysztof Kozlowski)
Date: Mon, 16 Sep 2024 11:39:53 +0200
Subject: [PATCH v4 3/3] regulator: dt-bindings: mt6397: move examples to
 parent PMIC mt6397
In-Reply-To: <20240914132833.9882-1-macpaul.lin@mediatek.com>
References: <20240914132833.9882-1-macpaul.lin@mediatek.com>
Message-ID: <1d880cca-e847-4b8c-b517-bac36e5ec54a@kernel.org>

On 14/09/2024 15:28, Macpaul Lin wrote:
> Since the DT schema of multiple function PMIC mt6397 has been converted,
> move the examples in "mediatek,mt6397-regulator.yaml" to the parent schema
> "mediatek,mt6397.yaml".
> 
> Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
> ---
>  .../regulator/mediatek,mt6397-regulator.yaml  | 173 ------------------
>  1 file changed, 173 deletions(-)

Your threading is completely broken. I don't understand where this
belongs. There were several patchsets from you.

Best regards,
Krzysztof



From krzk at kernel.org  Mon Sep 16 03:02:46 2024
From: krzk at kernel.org (Krzysztof Kozlowski)
Date: Mon, 16 Sep 2024 12:02:46 +0200
Subject: [PATCH 06/13] arm64: dts: mediatek: mt8188: Update VPPSYS node
 name and compatible
In-Reply-To: <CAC=S1ni+pJJZhbjvVqhba5u1JqGv=dZTv8+KH4xburea2AG4Qg@mail.gmail.com>
References: <20240909111535.528624-1-fshao@chromium.org>
 <20240909111535.528624-7-fshao@chromium.org>
 <11bc2522-bc10-4dcf-8142-708b57d181cf@kernel.org>
 <CAC=S1nhiJ=7yAucJsaYKUUBrwrxOVBMB2CF=bFwyLa2o-5RmWw@mail.gmail.com>
 <64cc35c8-30df-4882-a933-f42119270f48@kernel.org>
 <CAC=S1ni+pJJZhbjvVqhba5u1JqGv=dZTv8+KH4xburea2AG4Qg@mail.gmail.com>
Message-ID: <a9a7038c-4478-4366-831a-81dca8fa5afc@kernel.org>

On 10/09/2024 13:06, Fei Shao wrote:
> On Tue, Sep 10, 2024 at 3:19?PM Krzysztof Kozlowski <krzk at kernel.org> wrote:
>>
>> On 10/09/2024 07:12, Fei Shao wrote:
>>> On Mon, Sep 9, 2024 at 7:41?PM Krzysztof Kozlowski <krzk at kernel.org> wrote:
>>>>
>>>> On 09/09/2024 13:14, Fei Shao wrote:
>>>>> Use and add "syscon" in VPPSYS node names and compatible to fix errors
>>>>> from `make CHECK_DTBS=y mediatek/mt8188-evb.dtb`.
>>>>>
>>>>> Signed-off-by: Fei Shao <fshao at chromium.org>
>>>>> ---
>>>>>
>>>>>  arch/arm64/boot/dts/mediatek/mt8188.dtsi | 8 ++++----
>>>>>  1 file changed, 4 insertions(+), 4 deletions(-)
>>>>>
>>>>> diff --git a/arch/arm64/boot/dts/mediatek/mt8188.dtsi b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
>>>>> index 2900d78b7ceb..14e51a11f688 100644
>>>>> --- a/arch/arm64/boot/dts/mediatek/mt8188.dtsi
>>>>> +++ b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
>>>>> @@ -1799,8 +1799,8 @@ mfgcfg: clock-controller at 13fbf000 {
>>>>>                       #clock-cells = <1>;
>>>>>               };
>>>>>
>>>>> -             vppsys0: clock-controller at 14000000 {
>>>>> -                     compatible = "mediatek,mt8188-vppsys0";
>>>>> +             vppsys0: syscon at 14000000 {
>>>>> +                     compatible = "mediatek,mt8188-vppsys0", "syscon";
>>>>
>>>> If this was working before, it looks like this is not a syscon and
>>>> bindings need to be fixed.
>>>
>>> I guess it's because the binding was later updated in commit
>>> 26bcd8a53098 ("dt-bindings: arm: mediatek: mmsys: Add VPPSYS
>>> compatible for MT8188"), and the corresponding DT update was unnoticed
>>> at the time.
>>> If that makes sense then this should be a valid fix.
>>
>> Not necessarily. Why not fixing bindings? Prove that bindings are
>> correct, not DTS, first.
> 
> MediaTek's mmsys doesn't merely control clocks, it also provides
> display pipeline routing control and other misc control registers, so
> it's appropriate to categorize it as a system controller over a clock
> controller.
> As for vdosys and vppsys, they are likely variants or aliases of mmsys
> introduced in their newer SoCs.

Nothing like that was in the commit msg...

> 
> That description was updated in commit 1a680aa888d6 ("dt-bindings:
> mediatek: Update mmsys binding to reflect it is a system controller"),
> so I just assumed it's correct without thinking much...


Best regards,
Krzysztof



From andriy.shevchenko at linux.intel.com  Mon Sep 16 03:13:30 2024
From: andriy.shevchenko at linux.intel.com (Andy Shevchenko)
Date: Mon, 16 Sep 2024 13:13:30 +0300
Subject: [PATCH v7 06/10] i2c: Introduce OF component probe function
In-Reply-To: <CAD=FV=Udc9aP7bSzTWP82zsaztRD2YnVNpSDA54FC0dKQ-Nz2A@mail.gmail.com>
References: <20240911072751.365361-1-wenst@chromium.org>
 <20240911072751.365361-7-wenst@chromium.org>
 <CAD=FV=Udc9aP7bSzTWP82zsaztRD2YnVNpSDA54FC0dKQ-Nz2A@mail.gmail.com>
Message-ID: <ZugEyqg-2ZL2VVEd@smile.fi.intel.com>

On Fri, Sep 13, 2024 at 04:43:04PM -0700, Doug Anderson wrote:
> On Wed, Sep 11, 2024 at 12:28?AM Chen-Yu Tsai <wenst at chromium.org> wrote:

...

> > +static int i2c_of_probe_enable_node(struct device *dev, struct device_node *node)
> > +{
> > +       int ret;
> > +
> > +       dev_info(dev, "Enabling %pOF\n", node);
> > +
> > +       struct of_changeset *ocs __free(kfree) = kzalloc(sizeof(*ocs), GFP_KERNEL);
> > +       if (!ocs)
> > +               return -ENOMEM;
> 
> I guess the kernel lets you mix code and declarations now? I'm still
> used to all declarations being together but maybe I'm old school... I
> would have put the "dev_info" below the allocation...

In general yes, but we don't allow it everywhere for everything,
we have two exceptions:
1) for-loops;
2) __free() RAII.


-- 
With Best Regards,
Andy Shevchenko




From andriy.shevchenko at linux.intel.com  Mon Sep 16 03:36:14 2024
From: andriy.shevchenko at linux.intel.com (Andy Shevchenko)
Date: Mon, 16 Sep 2024 13:36:14 +0300
Subject: [PATCH v7 06/10] i2c: Introduce OF component probe function
In-Reply-To: <CAGXv+5HgkCZ=vdHGgvCW1U-nid=cQrVaxC+V+H2Gknf2pnTbYA@mail.gmail.com>
References: <20240911072751.365361-1-wenst@chromium.org>
 <20240911072751.365361-7-wenst@chromium.org>
 <ZuQTFTNTBLCziD05@smile.fi.intel.com>
 <CAGXv+5HgkCZ=vdHGgvCW1U-nid=cQrVaxC+V+H2Gknf2pnTbYA@mail.gmail.com>
Message-ID: <ZugKHrzs5BWoDr1c@smile.fi.intel.com>

On Sun, Sep 15, 2024 at 12:44:13PM +0200, Chen-Yu Tsai wrote:
> On Fri, Sep 13, 2024 at 12:25?PM Andy Shevchenko
> <andriy.shevchenko at linux.intel.com> wrote:
> > On Wed, Sep 11, 2024 at 03:27:44PM +0800, Chen-Yu Tsai wrote:

...

> > > +int i2c_of_probe_component(struct device *dev, const struct i2c_of_probe_cfg *cfg, void *ctx)
> > > +{
> > > +     const struct i2c_of_probe_ops *ops;
> > > +     const char *type;
> > > +     struct device_node *i2c_node;
> > > +     struct i2c_adapter *i2c;
> > > +     int ret;
> > > +
> > > +     if (!cfg)
> > > +             return -EINVAL;
> > > +
> > > +     ops = cfg->ops ?: &i2c_of_probe_dummy_ops;
> > > +     type = cfg->type;
> > > +
> > > +     i2c_node = i2c_of_probe_get_i2c_node(dev, type);
> >
> >
> >         struct device_node *i2c_node __free(of_node_put) =
> >                 i2c_...;
> 
> cleanup.h says to not mix the two styles (scoped vs goto). I was trying
> to follow that, though I realize now that with the scoped loops it
> probably doesn't help.
> 
> I'll revert back to having __free().
> 
> > > +     if (IS_ERR(i2c_node))
> > > +             return PTR_ERR(i2c_node);
> > > +
> > > +     for_each_child_of_node_with_prefix(i2c_node, node, type) {
> > > +             if (!of_device_is_available(node))
> > > +                     continue;
> > > +
> > > +             /*
> > > +              * Device tree has component already enabled. Either the
> > > +              * device tree isn't supported or we already probed once.
> > > +              */
> > > +             ret = 0;
> >
> > Shouldn't you drop reference count for "node"? (See also below)
> 
> This for-each loop the "scoped". It just doesn't have the prefix anymore.
> I believe you asked if the prefix could be dropped and then Rob agreed.

Hmm... I have looked into the implementation and I haven't found the evidence
that this is anyhow scoped. Can you point out what I have missed?

> > > +             goto out_put_i2c_node;
> > > +     }
> > > +
> > > +     i2c = of_get_i2c_adapter_by_node(i2c_node);
> > > +     if (!i2c) {
> > > +             ret = dev_err_probe(dev, -EPROBE_DEFER, "Couldn't get I2C adapter\n");
> > > +             goto out_put_i2c_node;
> > > +     }
> > > +
> > > +     /* Grab resources */
> > > +     ret = 0;
> > > +     if (ops->get_resources)
> > > +             ret = ops->get_resources(dev, i2c_node, ctx);
> > > +     if (ret)
> > > +             goto out_put_i2c_adapter;
> > > +
> > > +     /* Enable resources */
> > > +     if (ops->enable)
> > > +             ret = ops->enable(dev, ctx);
> > > +     if (ret)
> > > +             goto out_release_resources;
> > > +
> > > +     ret = 0;
> > > +     for_each_child_of_node_with_prefix(i2c_node, node, type) {
> > > +             union i2c_smbus_data data;
> > > +             u32 addr;
> > > +
> > > +             if (of_property_read_u32(node, "reg", &addr))
> > > +                     continue;
> > > +             if (i2c_smbus_xfer(i2c, addr, 0, I2C_SMBUS_READ, 0, I2C_SMBUS_BYTE, &data) < 0)
> > > +                     continue;
> > > +
> > > +             /* Found a device that is responding */
> > > +             if (ops->free_resources_early)
> > > +                     ops->free_resources_early(ctx);
> > > +             ret = i2c_of_probe_enable_node(dev, node);
> >
> > Hmm... Is "node" reference count left bumped up for a reason?
> 
> Same as above.

Same as above.

> > > +             break;
> > > +     }
> > > +
> > > +     if (ops->cleanup)
> > > +             ops->cleanup(dev, ctx);
> > > +out_release_resources:
> > > +     if (ops->free_resources_late)
> > > +             ops->free_resources_late(ctx);
> > > +out_put_i2c_adapter:
> > > +     i2c_put_adapter(i2c);
> > > +out_put_i2c_node:
> > > +     of_node_put(i2c_node);
> > > +
> > > +     return ret;
> > > +}

-- 
With Best Regards,
Andy Shevchenko




From Jonathan.Cameron at Huawei.com  Mon Sep 16 03:55:25 2024
From: Jonathan.Cameron at Huawei.com (Jonathan Cameron)
Date: Mon, 16 Sep 2024 11:55:25 +0100
Subject: [PATCH v7 06/10] i2c: Introduce OF component probe function
In-Reply-To: <ZugKHrzs5BWoDr1c@smile.fi.intel.com>
References: <20240911072751.365361-1-wenst@chromium.org>
	<20240911072751.365361-7-wenst@chromium.org>
	<ZuQTFTNTBLCziD05@smile.fi.intel.com>
	<CAGXv+5HgkCZ=vdHGgvCW1U-nid=cQrVaxC+V+H2Gknf2pnTbYA@mail.gmail.com>
	<ZugKHrzs5BWoDr1c@smile.fi.intel.com>
Message-ID: <20240916115525.000078a3@Huawei.com>

On Mon, 16 Sep 2024 13:36:14 +0300
Andy Shevchenko <andriy.shevchenko at linux.intel.com> wrote:

> On Sun, Sep 15, 2024 at 12:44:13PM +0200, Chen-Yu Tsai wrote:
> > On Fri, Sep 13, 2024 at 12:25?PM Andy Shevchenko
> > <andriy.shevchenko at linux.intel.com> wrote:  
> > > On Wed, Sep 11, 2024 at 03:27:44PM +0800, Chen-Yu Tsai wrote:  
> 
> ...
> 
> > > > +int i2c_of_probe_component(struct device *dev, const struct i2c_of_probe_cfg *cfg, void *ctx)
> > > > +{
> > > > +     const struct i2c_of_probe_ops *ops;
> > > > +     const char *type;
> > > > +     struct device_node *i2c_node;
> > > > +     struct i2c_adapter *i2c;
> > > > +     int ret;
> > > > +
> > > > +     if (!cfg)
> > > > +             return -EINVAL;
> > > > +
> > > > +     ops = cfg->ops ?: &i2c_of_probe_dummy_ops;
> > > > +     type = cfg->type;
> > > > +
> > > > +     i2c_node = i2c_of_probe_get_i2c_node(dev, type);  
> > >
> > >
> > >         struct device_node *i2c_node __free(of_node_put) =
> > >                 i2c_...;  
> > 
> > cleanup.h says to not mix the two styles (scoped vs goto). I was trying
> > to follow that, though I realize now that with the scoped loops it
> > probably doesn't help.

The problem pattern is (IIUC)

	if (x)
		goto bob;

	struct device_node *i2c_node __free(of_node_put) = i2c_....


bob:
	return ret;


So a goto that jumps over registration of a cleanup function.

Jonathan

> > 
> > I'll revert back to having __free().
> >   
> > > > +     if (IS_ERR(i2c_node))
> > > > +             return PTR_ERR(i2c_node);
> > > > +
> > > > +     for_each_child_of_node_with_prefix(i2c_node, node, type) {
> > > > +             if (!of_device_is_available(node))
> > > > +                     continue;
> > > > +
> > > > +             /*
> > > > +              * Device tree has component already enabled. Either the
> > > > +              * device tree isn't supported or we already probed once.
> > > > +              */
> > > > +             ret = 0;  
> > >
> > > Shouldn't you drop reference count for "node"? (See also below)  
> > 
> > This for-each loop the "scoped". It just doesn't have the prefix anymore.
> > I believe you asked if the prefix could be dropped and then Rob agreed.  
> 
> Hmm... I have looked into the implementation and I haven't found the evidence
> that this is anyhow scoped. Can you point out what I have missed?
> 
> > > > +             goto out_put_i2c_node;
> > > > +     }
> > > > +
> > > > +     i2c = of_get_i2c_adapter_by_node(i2c_node);
> > > > +     if (!i2c) {
> > > > +             ret = dev_err_probe(dev, -EPROBE_DEFER, "Couldn't get I2C adapter\n");
> > > > +             goto out_put_i2c_node;
> > > > +     }
> > > > +
> > > > +     /* Grab resources */
> > > > +     ret = 0;
> > > > +     if (ops->get_resources)
> > > > +             ret = ops->get_resources(dev, i2c_node, ctx);
> > > > +     if (ret)
> > > > +             goto out_put_i2c_adapter;
> > > > +
> > > > +     /* Enable resources */
> > > > +     if (ops->enable)
> > > > +             ret = ops->enable(dev, ctx);
> > > > +     if (ret)
> > > > +             goto out_release_resources;
> > > > +
> > > > +     ret = 0;
> > > > +     for_each_child_of_node_with_prefix(i2c_node, node, type) {
> > > > +             union i2c_smbus_data data;
> > > > +             u32 addr;
> > > > +
> > > > +             if (of_property_read_u32(node, "reg", &addr))
> > > > +                     continue;
> > > > +             if (i2c_smbus_xfer(i2c, addr, 0, I2C_SMBUS_READ, 0, I2C_SMBUS_BYTE, &data) < 0)
> > > > +                     continue;
> > > > +
> > > > +             /* Found a device that is responding */
> > > > +             if (ops->free_resources_early)
> > > > +                     ops->free_resources_early(ctx);
> > > > +             ret = i2c_of_probe_enable_node(dev, node);  
> > >
> > > Hmm... Is "node" reference count left bumped up for a reason?  
> > 
> > Same as above.  
> 
> Same as above.
> 
> > > > +             break;
> > > > +     }
> > > > +
> > > > +     if (ops->cleanup)
> > > > +             ops->cleanup(dev, ctx);
> > > > +out_release_resources:
> > > > +     if (ops->free_resources_late)
> > > > +             ops->free_resources_late(ctx);
> > > > +out_put_i2c_adapter:
> > > > +     i2c_put_adapter(i2c);
> > > > +out_put_i2c_node:
> > > > +     of_node_put(i2c_node);
> > > > +
> > > > +     return ret;
> > > > +}  
> 



From angelogioacchino.delregno at collabora.com  Mon Sep 16 04:25:22 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Mon, 16 Sep 2024 11:25:22 +0000
Subject: [PATCH v2] drm/mediatek: ovl: Add fmt_support_man for MT8192 and
 MT8195
In-Reply-To: <20240915161245.30296-1-jason-jh.lin@mediatek.com>
References: <20240915161245.30296-1-jason-jh.lin@mediatek.com>
Message-ID: <01020191fa9480c6-b4e6cdff-4134-4713-b255-1c65e0a97f87-000000@eu-west-1.amazonses.com>

Il 15/09/24 18:12, Jason-JH.Lin ha scritto:
> OVL_CON_CLRFMT_MAN is an configuration for extending color format
> settings of DISP_REG_OVL_CON(n).
> It will change some of the original color format settings.
> 
> Take the settings of (3 << 12) for example.
> - If OVL_CON_CLRFMT_MAN = 0 means OVL_CON_CLRFMT_RGBA8888.
> - If OVL_CON_CLRFMT_MAN = 1 means OVL_CON_CLRFMT_PARGB8888.
> 
> Since OVL_CON_CLRFMT_MAN is not supported on previous SoCs,
> It breaks the OVL color format setting of MT8173.
> So add fmt_support_man to the driver data of MT8192 and MT8195
> to solve the downgrade problem.
> 
> Fixes: a3f7f7ef4bfe ("drm/mediatek: Support "Pre-multiplied" blending in OVL")
> Signed-off-by: Jason-JH.Lin <jason-jh.lin at mediatek.com>
> ---
>   drivers/gpu/drm/mediatek/mtk_disp_ovl.c | 43 ++++++++++++++++++++-----
>   1 file changed, 35 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
> index 89b439dcf3a6..7b053ca25b10 100644
> --- a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
> +++ b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
> @@ -70,10 +70,33 @@
>   #define OVL_CON_CLRFMT_UYVY	(4 << 12)
>   #define OVL_CON_CLRFMT_YUYV	(5 << 12)
>   #define OVL_CON_MTX_YUV_TO_RGB	(6 << 16)
> -#define OVL_CON_CLRFMT_PARGB8888 ((3 << 12) | OVL_CON_CLRFMT_MAN)
> -#define OVL_CON_CLRFMT_PABGR8888 (OVL_CON_CLRFMT_PARGB8888 | OVL_CON_RGB_SWAP)
> -#define OVL_CON_CLRFMT_PBGRA8888 (OVL_CON_CLRFMT_PARGB8888 | OVL_CON_BYTE_SWAP)
> -#define OVL_CON_CLRFMT_PRGBA8888 (OVL_CON_CLRFMT_PABGR8888 | OVL_CON_BYTE_SWAP)
> +
> +#define OVL_CON_CLRFMT_PARGB8888(ovl)  ({ \
> +	struct mtk_disp_ovl *_ovl = (ovl); \
> +	(_ovl->data->fmt_support_man ? \
> +	((3 << 12) | OVL_CON_CLRFMT_MAN) : OVL_CON_CLRFMT_ARGB8888); \
> +})

Isn't it just simpler to pass an "extended input format selection" flag to
these macros, instead of the entire mtk_disp_ovl structure?

Something like...

#define OVL_CON_CLRFMT_PARGB8888(fmt_support_man)

...or alternatively, it's probably simply more straightforward to assign
function pointers to struct mtk_disp_ovl_data:

`.fmt_convert = ovl_fmt_convert_mt8173` for MT8173-style controllers and
`.fmt_convert = ovl_fmt_convert_mt8195` for MT8195-style controllers,

so that you can simply call `con = ovl->data->fmt_convert(ovl, fmt, blend_mode)`
in mtk_ovl_layer_config().

The thing is - those macros seem to be unnecessarily complicated, and it's at
least impacting on readability... :-)

Cheers,
Angelo

> +
> +#define OVL_CON_CLRFMT_PABGR8888(ovl)  ({ \
> +	struct mtk_disp_ovl *_ovl = (ovl); \
> +	(_ovl->data->fmt_support_man ? \
> +	(OVL_CON_CLRFMT_PARGB8888(_ovl) | OVL_CON_RGB_SWAP) : OVL_CON_CLRFMT_ABGR8888); \
> +})
> +
> +#define OVL_CON_CLRFMT_PBGRA8888(ovl)  ({ \
> +	struct mtk_disp_ovl *_ovl = (ovl); \
> +	(_ovl->data->fmt_support_man ? \
> +	(OVL_CON_CLRFMT_PARGB8888(_ovl) | OVL_CON_BYTE_SWAP) : \
> +	 OVL_CON_CLRFMT_BGRA8888); \
> +})
> +
> +#define OVL_CON_CLRFMT_PRGBA8888(ovl)  ({ \
> +	struct mtk_disp_ovl *_ovl = (ovl); \
> +	(_ovl->data->fmt_support_man ? \
> +	(OVL_CON_CLRFMT_PABGR8888(_ovl) | OVL_CON_BYTE_SWAP) : \
> +	OVL_CON_CLRFMT_RGBA8888); \
> +})
> +
>   #define OVL_CON_CLRFMT_RGB565(ovl)	((ovl)->data->fmt_rgb565_is_0 ? \
>   					0 : OVL_CON_CLRFMT_RGB)
>   #define OVL_CON_CLRFMT_RGB888(ovl)	((ovl)->data->fmt_rgb565_is_0 ? \
> @@ -144,6 +167,7 @@ struct mtk_disp_ovl_data {
>   	unsigned int gmc_bits;
>   	unsigned int layer_nr;
>   	bool fmt_rgb565_is_0;
> +	bool fmt_support_man;
>   	bool smi_id_en;
>   	bool supports_afbc;
>   	const u32 *formats;
> @@ -410,28 +434,28 @@ static unsigned int ovl_fmt_convert(struct mtk_disp_ovl *ovl, unsigned int fmt,
>   	case DRM_FORMAT_RGBA1010102:
>   		return blend_mode == DRM_MODE_BLEND_COVERAGE ?
>   		       OVL_CON_CLRFMT_RGBA8888 :
> -		       OVL_CON_CLRFMT_PRGBA8888;
> +		       OVL_CON_CLRFMT_PRGBA8888(ovl);
>   	case DRM_FORMAT_BGRX8888:
>   	case DRM_FORMAT_BGRA8888:
>   	case DRM_FORMAT_BGRX1010102:
>   	case DRM_FORMAT_BGRA1010102:
>   		return blend_mode == DRM_MODE_BLEND_COVERAGE ?
>   		       OVL_CON_CLRFMT_BGRA8888 :
> -		       OVL_CON_CLRFMT_PBGRA8888;
> +		       OVL_CON_CLRFMT_PBGRA8888(ovl);
>   	case DRM_FORMAT_XRGB8888:
>   	case DRM_FORMAT_ARGB8888:
>   	case DRM_FORMAT_XRGB2101010:
>   	case DRM_FORMAT_ARGB2101010:
>   		return blend_mode == DRM_MODE_BLEND_COVERAGE ?
>   		       OVL_CON_CLRFMT_ARGB8888 :
> -		       OVL_CON_CLRFMT_PARGB8888;
> +		       OVL_CON_CLRFMT_PARGB8888(ovl);
>   	case DRM_FORMAT_XBGR8888:
>   	case DRM_FORMAT_ABGR8888:
>   	case DRM_FORMAT_XBGR2101010:
>   	case DRM_FORMAT_ABGR2101010:
>   		return blend_mode == DRM_MODE_BLEND_COVERAGE ?
>   		       OVL_CON_CLRFMT_ABGR8888 :
> -		       OVL_CON_CLRFMT_PABGR8888;
> +		       OVL_CON_CLRFMT_PABGR8888(ovl);
>   	case DRM_FORMAT_UYVY:
>   		return OVL_CON_CLRFMT_UYVY | OVL_CON_MTX_YUV_TO_RGB;
>   	case DRM_FORMAT_YUYV:
> @@ -662,6 +686,7 @@ static const struct mtk_disp_ovl_data mt8192_ovl_driver_data = {
>   	.gmc_bits = 10,
>   	.layer_nr = 4,
>   	.fmt_rgb565_is_0 = true,
> +	.fmt_support_man = true,
>   	.smi_id_en = true,
>   	.formats = mt8173_formats,
>   	.num_formats = ARRAY_SIZE(mt8173_formats),
> @@ -672,6 +697,7 @@ static const struct mtk_disp_ovl_data mt8192_ovl_2l_driver_data = {
>   	.gmc_bits = 10,
>   	.layer_nr = 2,
>   	.fmt_rgb565_is_0 = true,
> +	.fmt_support_man = true,
>   	.smi_id_en = true,
>   	.formats = mt8173_formats,
>   	.num_formats = ARRAY_SIZE(mt8173_formats),
> @@ -682,6 +708,7 @@ static const struct mtk_disp_ovl_data mt8195_ovl_driver_data = {
>   	.gmc_bits = 10,
>   	.layer_nr = 4,
>   	.fmt_rgb565_is_0 = true,
> +	.fmt_support_man = true,
>   	.smi_id_en = true,
>   	.supports_afbc = true,
>   	.formats = mt8195_formats,




From chris.lu at mediatek.com  Mon Sep 16 04:39:34 2024
From: chris.lu at mediatek.com (Chris Lu)
Date: Mon, 16 Sep 2024 19:39:34 +0800
Subject: [PATCH 0/4] Bluetooth: btusb: Mediatek ISO interface cliam/release adjustment
Message-ID: <20240916113938.30285-1-chris.lu@mediatek.com>

MediaTek performs some test on the platform which can support LE audio and
ISO data transmission with kernel driver. We found the additional interface
claim and release flow issue need some adjustment.

These patches mainly add a callback function within the usb_disconnect function
to prevent a kernel panic caused by interfaces not being released when the BT USB
dongle is physically removed. Additionally, the condition for claiming/releasing
ISO usb interface have also been adjusted to make driver works as expected.

Chris Lu (4):
  Bluetooth: btusb: mediatek: move Bluetooth power off in
    btusb_mtk_shutdown
  Bluetooth: btusb: add callback function in btusb_disconnect
  Bluetooth: btusb: mediatek: add intf release flow in usb disconnect
  Bluetooth: btusb: mediatek: change the conditions for
    claiming/releasing iso interface

 drivers/bluetooth/btusb.c | 32 +++++++++++++++++++++-----------
 1 file changed, 21 insertions(+), 11 deletions(-)

-- 
2.18.0



From chris.lu at mediatek.com  Mon Sep 16 04:39:35 2024
From: chris.lu at mediatek.com (Chris Lu)
Date: Mon, 16 Sep 2024 19:39:35 +0800
Subject: [PATCH 1/4] Bluetooth: btusb: mediatek: move Bluetooth power off in btusb_mtk_shutdown
In-Reply-To: <20240916113938.30285-1-chris.lu@mediatek.com>
References: <20240916113938.30285-1-chris.lu@mediatek.com>
Message-ID: <20240916113938.30285-2-chris.lu@mediatek.com>

Move MediaTek Bluetooth power off command before releasing usb ISO interface.

Signed-off-by: Chris Lu <chris.lu at mediatek.com>
---
 drivers/bluetooth/btusb.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
index 6c9c761d5b93..6cf1729a8225 100644
--- a/drivers/bluetooth/btusb.c
+++ b/drivers/bluetooth/btusb.c
@@ -2704,11 +2704,14 @@ static int btusb_mtk_shutdown(struct hci_dev *hdev)
 {
 	struct btusb_data *data = hci_get_drvdata(hdev);
 	struct btmtk_data *btmtk_data = hci_get_priv(hdev);
+	int ret;
+
+	ret = btmtk_usb_shutdown(hdev);
 
 	if (test_bit(BTMTK_ISOPKT_RUNNING, &btmtk_data->flags))
 		btusb_mtk_release_iso_intf(data);
 
-	return btmtk_usb_shutdown(hdev);
+	return ret;
 }
 
 #ifdef CONFIG_PM
-- 
2.18.0



From chris.lu at mediatek.com  Mon Sep 16 04:39:36 2024
From: chris.lu at mediatek.com (Chris Lu)
Date: Mon, 16 Sep 2024 19:39:36 +0800
Subject: [PATCH 2/4] Bluetooth: btusb: add callback function in btusb_disconnect
In-Reply-To: <20240916113938.30285-1-chris.lu@mediatek.com>
References: <20240916113938.30285-1-chris.lu@mediatek.com>
Message-ID: <20240916113938.30285-3-chris.lu@mediatek.com>

Add disconnect callback function in btusb_disconnect which is reserved
for vendor specific usage before deregister hci in btusb_disconnect.

Signed-off-by: Chris Lu <chris.lu at mediatek.com>
---
 drivers/bluetooth/btusb.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
index 6cf1729a8225..dfc42bdc8aaf 100644
--- a/drivers/bluetooth/btusb.c
+++ b/drivers/bluetooth/btusb.c
@@ -846,6 +846,7 @@ struct btusb_data {
 
 	int (*suspend)(struct hci_dev *hdev);
 	int (*resume)(struct hci_dev *hdev);
+	int (*disconnect)(struct hci_dev *hdev);
 
 	int oob_wake_irq;   /* irq for out-of-band wake-on-bt */
 	unsigned cmd_timeout_cnt;
@@ -4011,6 +4012,9 @@ static void btusb_disconnect(struct usb_interface *intf)
 	if (data->diag)
 		usb_set_intfdata(data->diag, NULL);
 
+	if (data->disconnect)
+		data->disconnect(hdev);
+
 	hci_unregister_dev(hdev);
 
 	if (intf == data->intf) {
-- 
2.18.0



From chris.lu at mediatek.com  Mon Sep 16 04:39:37 2024
From: chris.lu at mediatek.com (Chris Lu)
Date: Mon, 16 Sep 2024 19:39:37 +0800
Subject: [PATCH 3/4] Bluetooth: btusb: mediatek: add intf release flow in usb disconnect
In-Reply-To: <20240916113938.30285-1-chris.lu@mediatek.com>
References: <20240916113938.30285-1-chris.lu@mediatek.com>
Message-ID: <20240916113938.30285-4-chris.lu@mediatek.com>

MediaTek claim an special usb intr interface for ISO data transmission.
The interface need to be released before unregistering hci device when
usb disconnect. Removing BT usb dongle without properly releasing the
interface may cause Kernel panic while unregister hci device.

Signed-off-by: Chris Lu <chris.lu at mediatek.com>
---
 drivers/bluetooth/btusb.c | 12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)

diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
index dfc42bdc8aaf..37e67b451b34 100644
--- a/drivers/bluetooth/btusb.c
+++ b/drivers/bluetooth/btusb.c
@@ -2614,9 +2614,9 @@ static void btusb_mtk_claim_iso_intf(struct btusb_data *data)
 	set_bit(BTMTK_ISOPKT_OVER_INTR, &btmtk_data->flags);
 }
 
-static void btusb_mtk_release_iso_intf(struct btusb_data *data)
+static int btusb_mtk_release_iso_intf(struct hci_dev *hdev)
 {
-	struct btmtk_data *btmtk_data = hci_get_priv(data->hdev);
+	struct btmtk_data *btmtk_data = hci_get_priv(hdev);
 
 	if (btmtk_data->isopkt_intf) {
 		usb_kill_anchored_urbs(&btmtk_data->isopkt_anchor);
@@ -2630,6 +2630,8 @@ static void btusb_mtk_release_iso_intf(struct btusb_data *data)
 	}
 
 	clear_bit(BTMTK_ISOPKT_OVER_INTR, &btmtk_data->flags);
+
+	return 0;
 }
 
 static int btusb_mtk_reset(struct hci_dev *hdev, void *rst_data)
@@ -2649,7 +2651,7 @@ static int btusb_mtk_reset(struct hci_dev *hdev, void *rst_data)
 		return err;
 
 	if (test_bit(BTMTK_ISOPKT_RUNNING, &btmtk_data->flags))
-		btusb_mtk_release_iso_intf(data);
+		btusb_mtk_release_iso_intf(hdev);
 
 	btusb_stop_traffic(data);
 	usb_kill_anchored_urbs(&data->tx_anchor);
@@ -2703,14 +2705,13 @@ static int btusb_mtk_setup(struct hci_dev *hdev)
 
 static int btusb_mtk_shutdown(struct hci_dev *hdev)
 {
-	struct btusb_data *data = hci_get_drvdata(hdev);
 	struct btmtk_data *btmtk_data = hci_get_priv(hdev);
 	int ret;
 
 	ret = btmtk_usb_shutdown(hdev);
 
 	if (test_bit(BTMTK_ISOPKT_RUNNING, &btmtk_data->flags))
-		btusb_mtk_release_iso_intf(data);
+		btusb_mtk_release_iso_intf(hdev);
 
 	return ret;
 }
@@ -3824,6 +3825,7 @@ static int btusb_probe(struct usb_interface *intf,
 		data->recv_acl = btmtk_usb_recv_acl;
 		data->suspend = btmtk_usb_suspend;
 		data->resume = btmtk_usb_resume;
+		data->disconnect = btusb_mtk_release_iso_intf;
 	}
 
 	if (id->driver_info & BTUSB_SWAVE) {
-- 
2.18.0



From chris.lu at mediatek.com  Mon Sep 16 04:39:38 2024
From: chris.lu at mediatek.com (Chris Lu)
Date: Mon, 16 Sep 2024 19:39:38 +0800
Subject: [PATCH 4/4] Bluetooth: btusb: mediatek: change the conditions for claiming/releasing ISO interface
In-Reply-To: <20240916113938.30285-1-chris.lu@mediatek.com>
References: <20240916113938.30285-1-chris.lu@mediatek.com>
Message-ID: <20240916113938.30285-5-chris.lu@mediatek.com>

Change conditions for Bluetooth driver claiming and releasing usb
ISO interface for MediaTek ISO data transmission.

Signed-off-by: Chris Lu <chris.lu at mediatek.com>
---
 drivers/bluetooth/btusb.c | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
index 37e67b451b34..bb28a9b2dc11 100644
--- a/drivers/bluetooth/btusb.c
+++ b/drivers/bluetooth/btusb.c
@@ -2618,7 +2618,7 @@ static int btusb_mtk_release_iso_intf(struct hci_dev *hdev)
 {
 	struct btmtk_data *btmtk_data = hci_get_priv(hdev);
 
-	if (btmtk_data->isopkt_intf) {
+	if (test_bit(BTMTK_ISOPKT_OVER_INTR, &btmtk_data->flags)) {
 		usb_kill_anchored_urbs(&btmtk_data->isopkt_anchor);
 		clear_bit(BTMTK_ISOPKT_RUNNING, &btmtk_data->flags);
 
@@ -2650,7 +2650,7 @@ static int btusb_mtk_reset(struct hci_dev *hdev, void *rst_data)
 	if (err < 0)
 		return err;
 
-	if (test_bit(BTMTK_ISOPKT_RUNNING, &btmtk_data->flags))
+	if (test_bit(BTMTK_ISOPKT_OVER_INTR, &btmtk_data->flags))
 		btusb_mtk_release_iso_intf(hdev);
 
 	btusb_stop_traffic(data);
@@ -2696,9 +2696,10 @@ static int btusb_mtk_setup(struct hci_dev *hdev)
 	btmtk_data->reset_sync = btusb_mtk_reset;
 
 	/* Claim ISO data interface and endpoint */
-	btmtk_data->isopkt_intf = usb_ifnum_to_if(data->udev, MTK_ISO_IFNUM);
-	if (btmtk_data->isopkt_intf)
+	if (!test_bit(BTMTK_ISOPKT_OVER_INTR, &btmtk_data->flags)) {
+		btmtk_data->isopkt_intf = usb_ifnum_to_if(data->udev, MTK_ISO_IFNUM);
 		btusb_mtk_claim_iso_intf(data);
+	}
 
 	return btmtk_usb_setup(hdev);
 }
@@ -2710,7 +2711,7 @@ static int btusb_mtk_shutdown(struct hci_dev *hdev)
 
 	ret = btmtk_usb_shutdown(hdev);
 
-	if (test_bit(BTMTK_ISOPKT_RUNNING, &btmtk_data->flags))
+	if (test_bit(BTMTK_ISOPKT_OVER_INTR, &btmtk_data->flags))
 		btusb_mtk_release_iso_intf(hdev);
 
 	return ret;
-- 
2.18.0



From angelogioacchino.delregno at collabora.com  Mon Sep 16 05:08:24 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Mon, 16 Sep 2024 12:08:24 +0000
Subject: [PATCH 4/4] clk: Drop obsolete devm_clk_bulk_get_all_enable()
 helper
In-Reply-To: <20240914-clk_bulk_ena_fix-v1-4-ce3537585c06@collabora.com>
References: <20240914-clk_bulk_ena_fix-v1-0-ce3537585c06@collabora.com>
 <20240914-clk_bulk_ena_fix-v1-4-ce3537585c06@collabora.com>
Message-ID: <01020191fabbea05-14368d2a-b504-4fad-b1a1-48435821d7f1-000000@eu-west-1.amazonses.com>

Il 14/09/24 20:04, Cristian Ciocaltea ha scritto:
> Commit 265b07df758a ("clk: Provide managed helper to get and enable bulk
> clocks") added devm_clk_bulk_get_all_enable() function, but missed to
> return the number of clocks stored in the clk_bulk_data table referenced
> by the clks argument.  Without knowing the number, it's not possible to
> iterate these clocks when needed, hence the argument is useless and
> could have been simply removed.
> 
> A new helper devm_clk_bulk_get_all_enabled() has been introduced, which
> is consistent with devm_clk_bulk_get_all() in terms of the returned
> value.
> 
> Drop the obsolete function since all users switched to the new helper.
> 
> Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea at collabora.com>

This should probably be done in two (three?) cycles if we want to avoid
immutable branches... but anyway, for the commit itself:

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>

> ---
>   drivers/clk/clk-devres.c | 32 --------------------------------
>   include/linux/clk.h      | 22 ----------------------
>   2 files changed, 54 deletions(-)
> 
> diff --git a/drivers/clk/clk-devres.c b/drivers/clk/clk-devres.c
> index 4203aaaa7544..14a657f336fe 100644
> --- a/drivers/clk/clk-devres.c
> +++ b/drivers/clk/clk-devres.c
> @@ -218,38 +218,6 @@ static void devm_clk_bulk_release_all_enable(struct device *dev, void *res)
>   	clk_bulk_put_all(devres->num_clks, devres->clks);
>   }
>   
> -int __must_check devm_clk_bulk_get_all_enable(struct device *dev,
> -					      struct clk_bulk_data **clks)
> -{
> -	struct clk_bulk_devres *devres;
> -	int ret;
> -
> -	devres = devres_alloc(devm_clk_bulk_release_all_enable,
> -			      sizeof(*devres), GFP_KERNEL);
> -	if (!devres)
> -		return -ENOMEM;
> -
> -	ret = clk_bulk_get_all(dev, &devres->clks);
> -	if (ret > 0) {
> -		*clks = devres->clks;
> -		devres->num_clks = ret;
> -	} else {
> -		devres_free(devres);
> -		return ret;
> -	}
> -
> -	ret = clk_bulk_prepare_enable(devres->num_clks, *clks);
> -	if (!ret) {
> -		devres_add(dev, devres);
> -	} else {
> -		clk_bulk_put_all(devres->num_clks, devres->clks);
> -		devres_free(devres);
> -	}
> -
> -	return ret;
> -}
> -EXPORT_SYMBOL_GPL(devm_clk_bulk_get_all_enable);
> -
>   int __must_check devm_clk_bulk_get_all_enabled(struct device *dev,
>   					       struct clk_bulk_data **clks)
>   {
> diff --git a/include/linux/clk.h b/include/linux/clk.h
> index 158c5072852e..b607482ca77e 100644
> --- a/include/linux/clk.h
> +++ b/include/linux/clk.h
> @@ -495,22 +495,6 @@ int __must_check devm_clk_bulk_get_optional(struct device *dev, int num_clks,
>   int __must_check devm_clk_bulk_get_all(struct device *dev,
>   				       struct clk_bulk_data **clks);
>   
> -/**
> - * devm_clk_bulk_get_all_enable - Get and enable all clocks of the consumer (managed)
> - * @dev: device for clock "consumer"
> - * @clks: pointer to the clk_bulk_data table of consumer
> - *
> - * Returns success (0) or negative errno.
> - *
> - * This helper function allows drivers to get all clocks of the
> - * consumer and enables them in one operation with management.
> - * The clks will automatically be disabled and freed when the device
> - * is unbound.
> - */
> -
> -int __must_check devm_clk_bulk_get_all_enable(struct device *dev,
> -					      struct clk_bulk_data **clks);
> -
>   /**
>    * devm_clk_bulk_get_all_enabled - Get and enable all clocks of the consumer (managed)
>    * @dev: device for clock "consumer"
> @@ -1052,12 +1036,6 @@ static inline int __must_check devm_clk_bulk_get_all(struct device *dev,
>   	return 0;
>   }
>   
> -static inline int __must_check devm_clk_bulk_get_all_enable(struct device *dev,
> -						struct clk_bulk_data **clks)
> -{
> -	return 0;
> -}
> -
>   static inline int __must_check devm_clk_bulk_get_all_enabled(struct device *dev,
>   						struct clk_bulk_data **clks)
>   {


From angelogioacchino.delregno at collabora.com  Mon Sep 16 05:08:26 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Mon, 16 Sep 2024 12:08:26 +0000
Subject: [PATCH 2/4] soc: mediatek: pwrap: Switch to
 devm_clk_bulk_get_all_enabled()
In-Reply-To: <20240914-clk_bulk_ena_fix-v1-2-ce3537585c06@collabora.com>
References: <20240914-clk_bulk_ena_fix-v1-0-ce3537585c06@collabora.com>
 <20240914-clk_bulk_ena_fix-v1-2-ce3537585c06@collabora.com>
Message-ID: <01020191fabbefa3-de7a1f68-ce29-4daf-83e4-846e8b80896e-000000@eu-west-1.amazonses.com>

Il 14/09/24 20:04, Cristian Ciocaltea ha scritto:
> The helper devm_clk_bulk_get_all_enable() is partially broken and will
> be dropped since it missed to return the number of clocks stored in the
> clk_bulk_data table referenced by the clks argument.
> 
> Use the newly introduced devm_clk_bulk_get_all_enabled() variant
> instead, which is consistent with devm_clk_bulk_get_all() in terms of
> the returned value:
> 
>   > 0 if one or more clocks have been stored
>   = 0 if there are no clocks
>   < 0 if an error occurred
> 
> Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea at collabora.com>

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>

> ---
>   drivers/soc/mediatek/mtk-pmic-wrap.c | 4 ++--
>   1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/soc/mediatek/mtk-pmic-wrap.c b/drivers/soc/mediatek/mtk-pmic-wrap.c
> index 9fdc0ef79202..0bcd85826375 100644
> --- a/drivers/soc/mediatek/mtk-pmic-wrap.c
> +++ b/drivers/soc/mediatek/mtk-pmic-wrap.c
> @@ -2518,8 +2518,8 @@ static int pwrap_probe(struct platform_device *pdev)
>   		}
>   	}
>   
> -	ret = devm_clk_bulk_get_all_enable(wrp->dev, &clk);
> -	if (ret)
> +	ret = devm_clk_bulk_get_all_enabled(wrp->dev, &clk);
> +	if (ret < 0)
>   		return dev_err_probe(wrp->dev, ret,
>   				     "failed to get clocks\n");
>   
> 



From angelogioacchino.delregno at collabora.com  Mon Sep 16 05:08:31 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Mon, 16 Sep 2024 12:08:31 +0000
Subject: [PATCH 1/4] clk: Provide devm_clk_bulk_get_all_enabled() helper
In-Reply-To: <20240914-clk_bulk_ena_fix-v1-1-ce3537585c06@collabora.com>
References: <20240914-clk_bulk_ena_fix-v1-0-ce3537585c06@collabora.com>
 <20240914-clk_bulk_ena_fix-v1-1-ce3537585c06@collabora.com>
Message-ID: <01020191fabc03c6-26136e10-99af-4efb-97cc-46532280e694-000000@eu-west-1.amazonses.com>

Il 14/09/24 20:04, Cristian Ciocaltea ha scritto:
> Commit 265b07df758a ("clk: Provide managed helper to get and enable bulk
> clocks") added devm_clk_bulk_get_all_enable() function, but missed to
> return the number of clocks stored in the clk_bulk_data table referenced
> by the clks argument.  Without knowing the number, it's not possible to
> iterate these clocks when needed, hence the argument is useless and
> could have been simply removed.
> 
> Introduce devm_clk_bulk_get_all_enabled() variant, which is consistent
> with devm_clk_bulk_get_all() in terms of the returned value:
> 
>   > 0 if one or more clocks have been stored
>   = 0 if there are no clocks
>   < 0 if an error occurred
> 
> Moreover, the naming is consistent with devm_clk_get_enabled(), i.e. use
> the past form of 'enable'.
> 
> Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea at collabora.com>

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>


> ---
>   drivers/clk/clk-devres.c | 34 ++++++++++++++++++++++++++++++++++
>   include/linux/clk.h      | 24 ++++++++++++++++++++++++
>   2 files changed, 58 insertions(+)
> 
> diff --git a/drivers/clk/clk-devres.c b/drivers/clk/clk-devres.c
> index 82ae1f26e634..4203aaaa7544 100644
> --- a/drivers/clk/clk-devres.c
> +++ b/drivers/clk/clk-devres.c
> @@ -250,6 +250,40 @@ int __must_check devm_clk_bulk_get_all_enable(struct device *dev,
>   }
>   EXPORT_SYMBOL_GPL(devm_clk_bulk_get_all_enable);
>   
> +int __must_check devm_clk_bulk_get_all_enabled(struct device *dev,
> +					       struct clk_bulk_data **clks)
> +{
> +	struct clk_bulk_devres *devres;
> +	int ret;
> +
> +	devres = devres_alloc(devm_clk_bulk_release_all_enable,
> +			      sizeof(*devres), GFP_KERNEL);
> +	if (!devres)
> +		return -ENOMEM;
> +
> +	ret = clk_bulk_get_all(dev, &devres->clks);
> +	if (ret <= 0)
> +		goto err_free_devres;
> +
> +	*clks = devres->clks;
> +	devres->num_clks = ret;
> +
> +	ret = clk_bulk_prepare_enable(devres->num_clks, *clks);
> +	if (ret) {
> +		clk_bulk_put_all(devres->num_clks, devres->clks);
> +		goto err_free_devres;
> +	}
> +
> +	devres_add(dev, devres);
> +
> +	return devres->num_clks;
> +
> +err_free_devres:
> +	devres_free(devres);
> +	return ret;
> +}
> +EXPORT_SYMBOL_GPL(devm_clk_bulk_get_all_enabled);
> +
>   static int devm_clk_match(struct device *dev, void *res, void *data)
>   {
>   	struct clk **c = res;
> diff --git a/include/linux/clk.h b/include/linux/clk.h
> index 851a0f2cf42c..158c5072852e 100644
> --- a/include/linux/clk.h
> +++ b/include/linux/clk.h
> @@ -511,6 +511,24 @@ int __must_check devm_clk_bulk_get_all(struct device *dev,
>   int __must_check devm_clk_bulk_get_all_enable(struct device *dev,
>   					      struct clk_bulk_data **clks);
>   
> +/**
> + * devm_clk_bulk_get_all_enabled - Get and enable all clocks of the consumer (managed)
> + * @dev: device for clock "consumer"
> + * @clks: pointer to the clk_bulk_data table of consumer
> + *
> + * Returns a positive value for the number of clocks obtained while the
> + * clock references are stored in the clk_bulk_data table in @clks field.
> + * Returns 0 if there're none and a negative value if something failed.
> + *
> + * This helper function allows drivers to get all clocks of the
> + * consumer and enables them in one operation with management.
> + * The clks will automatically be disabled and freed when the device
> + * is unbound.
> + */
> +
> +int __must_check devm_clk_bulk_get_all_enabled(struct device *dev,
> +					       struct clk_bulk_data **clks);
> +
>   /**
>    * devm_clk_get - lookup and obtain a managed reference to a clock producer.
>    * @dev: device for clock "consumer"
> @@ -1040,6 +1058,12 @@ static inline int __must_check devm_clk_bulk_get_all_enable(struct device *dev,
>   	return 0;
>   }
>   
> +static inline int __must_check devm_clk_bulk_get_all_enabled(struct device *dev,
> +						struct clk_bulk_data **clks)
> +{
> +	return 0;
> +}
> +
>   static inline struct clk *devm_get_clk_from_child(struct device *dev,
>   				struct device_node *np, const char *con_id)
>   {
> 


From dianders at chromium.org  Mon Sep 16 07:15:45 2024
From: dianders at chromium.org (Doug Anderson)
Date: Mon, 16 Sep 2024 07:15:45 -0700
Subject: [PATCH v7 06/10] i2c: Introduce OF component probe function
In-Reply-To: <CAGXv+5FRoiv+TPyeFTcuRanRuSh2-xUo6ttVPkW6o3tktUmcFA@mail.gmail.com>
References: <20240911072751.365361-1-wenst@chromium.org> <20240911072751.365361-7-wenst@chromium.org>
 <CAD=FV=Udc9aP7bSzTWP82zsaztRD2YnVNpSDA54FC0dKQ-Nz2A@mail.gmail.com> <CAGXv+5FRoiv+TPyeFTcuRanRuSh2-xUo6ttVPkW6o3tktUmcFA@mail.gmail.com>
Message-ID: <CAD=FV=UDoaBN4OLZhEB4uvs6vDRVS0ZAsce2=3rJOn5sKEu-hw@mail.gmail.com>

Hi,

On Sun, Sep 15, 2024 at 4:32?AM Chen-Yu Tsai <wenst at chromium.org> wrote:
>
> > > + * Assumes that across the entire device tree the only instances of nodes
> > > + * prefixed with "type" are the ones that need handling for second source
> > > + * components. In other words, if "type" is "touchscreen", then all device
> > > + * nodes named "touchscreen*" are the ones that need probing. There cannot
> >
> > "touchscreen*" implies that it can have an arbitrary suffix. Can it?
>
> That is the idea. The use case is for components that have conflicting
> addresses and need special probing. Such device nodes obviously can't
> have the same node name. This is planned but not implemented in this
> series.

Maybe "touchscreen@*" instead of "touchscreen*" if I'm understanding correctly.


> > > + * be another "touchscreen" node that is already enabled.
> > > + *
> > > + * Assumes that for each "type" of component, only one actually exists. In
> > > + * other words, only one matching and existing device will be enabled.
> > > + *
> > > + * Context: Process context only. Does non-atomic I2C transfers.
> > > + *          Should only be used from a driver probe function, as the function
> > > + *          can return -EPROBE_DEFER if the I2C adapter or other resources
> > > + *          are unavailable.
> > > + * Return: 0 on success or no-op, error code otherwise.
> > > + *         A no-op can happen when it seems like the device tree already
> > > + *         has components of the type to be probed already enabled. This
> > > + *         can happen when the device tree had not been updated to mark
> > > + *         the status of the to-be-probed components as "fail". Or this
> > > + *         function was already run with the same parameters and succeeded
> > > + *         in enabling a component. The latter could happen if the user
> >
> > s/latter/later
>
> Are you sure?

No. latter looked weird to me and I searched quickly and thought I was
right. With a more full search looks like you're right.


> > > +int i2c_of_probe_component(struct device *dev, const struct i2c_of_probe_cfg *cfg, void *ctx)
> > > +{
> > > +       const struct i2c_of_probe_ops *ops;
> > > +       const char *type;
> > > +       struct device_node *i2c_node;
> > > +       struct i2c_adapter *i2c;
> > > +       int ret;
> > > +
> > > +       if (!cfg)
> > > +               return -EINVAL;
> >
> > Drop extra check of "!cfg". In general kernel conventions don't check
> > for NULL pointers passed by caller unless it's an expected case. You
> > don't check for a NULL "dev" and you shouldn't need to check for a
> > NULL "cfg". They are both simply required parameters.
>
> "dev" is only passed to dev_printk(), and that can handle "dev" being
> NULL. Same can't be said for "cfg".
>
> I don't know what the preference is though. Crashing is probably not the
> nicest thing, even if it only happens to developers.

Honestly as a developer I'd prefer the crash. It points out the exact
line where I had an invalid NULL. Returning an error code means I've
got to compile/boot several more times to track down where the error
code is coming from.

I'm fairly certain that the kernel convention is to only check things
for NULL if it's part of the API to accept NULL or if the value can be
NULL due to untrusted data. If the only way it can be NULL is due to
buggy code elsewhere in the kernel then you should omit the error
checks.

> > > +               if (!of_device_is_available(node))
> > > +                       continue;
> > > +
> > > +               /*
> > > +                * Device tree has component already enabled. Either the
> > > +                * device tree isn't supported or we already probed once.
> > > +                */
> > > +               ret = 0;
> > > +               goto out_put_i2c_node;
> > > +       }
> > > +
> > > +       i2c = of_get_i2c_adapter_by_node(i2c_node);
> > > +       if (!i2c) {
> > > +               ret = dev_err_probe(dev, -EPROBE_DEFER, "Couldn't get I2C adapter\n");
> > > +               goto out_put_i2c_node;
> > > +       }
> > > +
> > > +       /* Grab resources */
> > > +       ret = 0;
> > > +       if (ops->get_resources)
> > > +               ret = ops->get_resources(dev, i2c_node, ctx);
> > > +       if (ret)
> > > +               goto out_put_i2c_adapter;
> > > +
> > > +       /* Enable resources */
> > > +       if (ops->enable)
> > > +               ret = ops->enable(dev, ctx);
> > > +       if (ret)
> > > +               goto out_release_resources;
> >
> > I won't insist, but a part of me wonders whether we should just
> > combine "get_resources" and "enable" and then combine "cleanup" and
> > "free_resources_late". They are always paired one after another and
> > I'm having a hard time seeing why they need to be separate. It's not
> > like you'll ever get the resources and then enable/disable multiple
> > times.
>
> Maybe. The structure was carried over from the original non-callback
> version. I think it's easier to reason about if they are kept separate,
> especially since the outgoing path is slightly different when no working
> component is found and one of the callbacks ends up not getting called.

Actually, both of the outgoing callbacks are always called. It's only
the 3rd callback (the "early" one) that's called sometimes.

I won't insist on combining them, but I still feel like combining them
would be better. I'd be interested in other opinions, though.


-Doug


From wenst at chromium.org  Mon Sep 16 07:31:09 2024
From: wenst at chromium.org (Chen-Yu Tsai)
Date: Mon, 16 Sep 2024 16:31:09 +0200
Subject: [PATCH v7 06/10] i2c: Introduce OF component probe function
In-Reply-To: <CAD=FV=UDoaBN4OLZhEB4uvs6vDRVS0ZAsce2=3rJOn5sKEu-hw@mail.gmail.com>
References: <20240911072751.365361-1-wenst@chromium.org> <20240911072751.365361-7-wenst@chromium.org>
 <CAD=FV=Udc9aP7bSzTWP82zsaztRD2YnVNpSDA54FC0dKQ-Nz2A@mail.gmail.com>
 <CAGXv+5FRoiv+TPyeFTcuRanRuSh2-xUo6ttVPkW6o3tktUmcFA@mail.gmail.com> <CAD=FV=UDoaBN4OLZhEB4uvs6vDRVS0ZAsce2=3rJOn5sKEu-hw@mail.gmail.com>
Message-ID: <CAGXv+5Eo3r6WPDnHwEZPFz7PBd5v48n32iXXWy=Vr-v1H2zEoQ@mail.gmail.com>

On Mon, Sep 16, 2024 at 4:16?PM Doug Anderson <dianders at chromium.org> wrote:
>
> Hi,
>
> On Sun, Sep 15, 2024 at 4:32?AM Chen-Yu Tsai <wenst at chromium.org> wrote:
> >
> > > > + * Assumes that across the entire device tree the only instances of nodes
> > > > + * prefixed with "type" are the ones that need handling for second source
> > > > + * components. In other words, if "type" is "touchscreen", then all device
> > > > + * nodes named "touchscreen*" are the ones that need probing. There cannot
> > >
> > > "touchscreen*" implies that it can have an arbitrary suffix. Can it?
> >
> > That is the idea. The use case is for components that have conflicting
> > addresses and need special probing. Such device nodes obviously can't
> > have the same node name. This is planned but not implemented in this
> > series.
>
> Maybe "touchscreen@*" instead of "touchscreen*" if I'm understanding correctly.

Then it would be "touchscreen*@*".

> > > > + * be another "touchscreen" node that is already enabled.
> > > > + *
> > > > + * Assumes that for each "type" of component, only one actually exists. In
> > > > + * other words, only one matching and existing device will be enabled.
> > > > + *
> > > > + * Context: Process context only. Does non-atomic I2C transfers.
> > > > + *          Should only be used from a driver probe function, as the function
> > > > + *          can return -EPROBE_DEFER if the I2C adapter or other resources
> > > > + *          are unavailable.
> > > > + * Return: 0 on success or no-op, error code otherwise.
> > > > + *         A no-op can happen when it seems like the device tree already
> > > > + *         has components of the type to be probed already enabled. This
> > > > + *         can happen when the device tree had not been updated to mark
> > > > + *         the status of the to-be-probed components as "fail". Or this
> > > > + *         function was already run with the same parameters and succeeded
> > > > + *         in enabling a component. The latter could happen if the user
> > >
> > > s/latter/later
> >
> > Are you sure?
>
> No. latter looked weird to me and I searched quickly and thought I was
> right. With a more full search looks like you're right.
>
>
> > > > +int i2c_of_probe_component(struct device *dev, const struct i2c_of_probe_cfg *cfg, void *ctx)
> > > > +{
> > > > +       const struct i2c_of_probe_ops *ops;
> > > > +       const char *type;
> > > > +       struct device_node *i2c_node;
> > > > +       struct i2c_adapter *i2c;
> > > > +       int ret;
> > > > +
> > > > +       if (!cfg)
> > > > +               return -EINVAL;
> > >
> > > Drop extra check of "!cfg". In general kernel conventions don't check
> > > for NULL pointers passed by caller unless it's an expected case. You
> > > don't check for a NULL "dev" and you shouldn't need to check for a
> > > NULL "cfg". They are both simply required parameters.
> >
> > "dev" is only passed to dev_printk(), and that can handle "dev" being
> > NULL. Same can't be said for "cfg".
> >
> > I don't know what the preference is though. Crashing is probably not the
> > nicest thing, even if it only happens to developers.
>
> Honestly as a developer I'd prefer the crash. It points out the exact
> line where I had an invalid NULL. Returning an error code means I've
> got to compile/boot several more times to track down where the error
> code is coming from.
>
> I'm fairly certain that the kernel convention is to only check things
> for NULL if it's part of the API to accept NULL or if the value can be
> NULL due to untrusted data. If the only way it can be NULL is due to
> buggy code elsewhere in the kernel then you should omit the error
> checks.

Make sense.

> > > > +               if (!of_device_is_available(node))
> > > > +                       continue;
> > > > +
> > > > +               /*
> > > > +                * Device tree has component already enabled. Either the
> > > > +                * device tree isn't supported or we already probed once.
> > > > +                */
> > > > +               ret = 0;
> > > > +               goto out_put_i2c_node;
> > > > +       }
> > > > +
> > > > +       i2c = of_get_i2c_adapter_by_node(i2c_node);
> > > > +       if (!i2c) {
> > > > +               ret = dev_err_probe(dev, -EPROBE_DEFER, "Couldn't get I2C adapter\n");
> > > > +               goto out_put_i2c_node;
> > > > +       }
> > > > +
> > > > +       /* Grab resources */
> > > > +       ret = 0;
> > > > +       if (ops->get_resources)
> > > > +               ret = ops->get_resources(dev, i2c_node, ctx);
> > > > +       if (ret)
> > > > +               goto out_put_i2c_adapter;
> > > > +
> > > > +       /* Enable resources */
> > > > +       if (ops->enable)
> > > > +               ret = ops->enable(dev, ctx);
> > > > +       if (ret)
> > > > +               goto out_release_resources;
> > >
> > > I won't insist, but a part of me wonders whether we should just
> > > combine "get_resources" and "enable" and then combine "cleanup" and
> > > "free_resources_late". They are always paired one after another and
> > > I'm having a hard time seeing why they need to be separate. It's not
> > > like you'll ever get the resources and then enable/disable multiple
> > > times.
> >
> > Maybe. The structure was carried over from the original non-callback
> > version. I think it's easier to reason about if they are kept separate,
> > especially since the outgoing path is slightly different when no working
> > component is found and one of the callbacks ends up not getting called.
>
> Actually, both of the outgoing callbacks are always called. It's only
> the 3rd callback (the "early" one) that's called sometimes.

So IIRC do "get + enable" and "cleanup + release_late", and leave
"release_early" alone?

ChenYu

> I won't insist on combining them, but I still feel like combining them
> would be better. I'd be interested in other opinions, though.
>
>
> -Doug
>


From wenst at chromium.org  Mon Sep 16 07:58:51 2024
From: wenst at chromium.org (Chen-Yu Tsai)
Date: Mon, 16 Sep 2024 16:58:51 +0200
Subject: [PATCH v7 09/10] platform/chrome: Introduce device tree hardware prober
In-Reply-To: <CAD=FV=WtVSQ5GX6H5CtxNPTdOAJVMj_xNRvG9siZB6_ePZr7CQ@mail.gmail.com>
References: <20240911072751.365361-1-wenst@chromium.org> <20240911072751.365361-10-wenst@chromium.org>
 <CAD=FV=WtVSQ5GX6H5CtxNPTdOAJVMj_xNRvG9siZB6_ePZr7CQ@mail.gmail.com>
Message-ID: <CAGXv+5HRLHV2tDZxiqFRhz1p+_bhMzMXoJMBnhy-R=8C4hBjnQ@mail.gmail.com>

On Sat, Sep 14, 2024 at 1:43?AM Doug Anderson <dianders at chromium.org> wrote:
>
> Hi,
>
> On Wed, Sep 11, 2024 at 12:29?AM Chen-Yu Tsai <wenst at chromium.org> wrote:
> >
> > @@ -8,6 +8,7 @@ obj-$(CONFIG_CHROMEOS_ACPI)             += chromeos_acpi.o
> >  obj-$(CONFIG_CHROMEOS_LAPTOP)          += chromeos_laptop.o
> >  obj-$(CONFIG_CHROMEOS_PRIVACY_SCREEN)  += chromeos_privacy_screen.o
> >  obj-$(CONFIG_CHROMEOS_PSTORE)          += chromeos_pstore.o
> > +obj-$(CONFIG_CHROMEOS_OF_HW_PROBER)    += chromeos_of_hw_prober.o
>
> "o" sorts before "p" so "of" should sort before "privacy"?
>
> I guess it's not exactly all sorted, but this small section is. Since
> it's arbitrary you could preserve the existing sorting. :-P

To me it seemed more like they are just sorted in the order they were
added.

> > +static const struct hw_prober_entry hw_prober_platforms[] = {
> > +       { .compatible = "google,hana", .prober = chromeos_i2c_component_prober, .data = &chromeos_i2c_probe_dumb_touchscreen },
> > +       { .compatible = "google,hana", .prober = chromeos_i2c_component_prober, .data = &chromeos_i2c_probe_dumb_trackpad },
>
> The fact that the example is only using "dumb" probers doesn't make it
> quite as a compelling proof that the code will scale up. Any chance
> you could add something that requires a bit more oomph? ;-)

I only have a hacked up thing right now.

This is the one I'm using to test things:
http://git.kernel.org/wens/c/5c2c920429167a15b990a7cf8427705eec321134

About this one, it seems we can at least merge the device trees of
each product into just one. The touchscreen or trackpad (or lack thereof)
is probed by the kernel.


This one I only started looking into:
http://git.kernel.org/wens/c/42c21929aeb3c7ca7b0ce9cacb1d0ff915d3c783

About the second one, AFAIK the device tree descriptions are incomplete.
Only one of the trackpad options has the regulator supply described.
The regulator itself is marked as always on, so things currently work.
Some work will need to be put in to research the schematics and test
whether things do work correctly.

> > +static int chromeos_of_hw_prober_driver_init(void)
> > +{
> > +       size_t i;
> > +       int ret;
> > +
> > +       for (i = 0; i < ARRAY_SIZE(hw_prober_platforms); i++)
> > +               if (of_machine_is_compatible(hw_prober_platforms[i].compatible))
> > +                       break;
> > +       if (i == ARRAY_SIZE(hw_prober_platforms))
> > +               return -ENODEV;
> > +
> > +       ret = platform_driver_register(&chromeos_of_hw_prober_driver);
> > +       if (ret)
> > +               return ret;
> > +
> > +       chromeos_of_hw_prober_pdev =
> > +                       platform_device_register_simple(DRV_NAME, PLATFORM_DEVID_NONE, NULL, 0);
> > +       if (IS_ERR(chromeos_of_hw_prober_pdev))
> > +               goto err;
>
> FWIW if you didn't want to see your prober called over and over again
> if one of the devices deferred you could just register one device per
> type, right? Then each device would be able to defer separately. Dunno
> if it's worth it but figured I'd mention it...

I think that adds some unnecessary complexity, and more lingering devices
in the system. These platform devices are not removed.

> Also: as a high level comment, this all looks much nicer to me now
> that it's parameterized. :-)

Thanks!

ChenYu


From wenst at chromium.org  Mon Sep 16 07:59:59 2024
From: wenst at chromium.org (Chen-Yu Tsai)
Date: Mon, 16 Sep 2024 16:59:59 +0200
Subject: [PATCH v7 06/10] i2c: Introduce OF component probe function
In-Reply-To: <ZugKHrzs5BWoDr1c@smile.fi.intel.com>
References: <20240911072751.365361-1-wenst@chromium.org> <20240911072751.365361-7-wenst@chromium.org>
 <ZuQTFTNTBLCziD05@smile.fi.intel.com> <CAGXv+5HgkCZ=vdHGgvCW1U-nid=cQrVaxC+V+H2Gknf2pnTbYA@mail.gmail.com>
 <ZugKHrzs5BWoDr1c@smile.fi.intel.com>
Message-ID: <CAGXv+5E09LH5UKXh0wHrsqAp-ps8xaGfSZ37GWZ6sbyoaOczfQ@mail.gmail.com>

On Mon, Sep 16, 2024 at 12:36?PM Andy Shevchenko
<andriy.shevchenko at linux.intel.com> wrote:
>
> On Sun, Sep 15, 2024 at 12:44:13PM +0200, Chen-Yu Tsai wrote:
> > On Fri, Sep 13, 2024 at 12:25?PM Andy Shevchenko
> > <andriy.shevchenko at linux.intel.com> wrote:
> > > On Wed, Sep 11, 2024 at 03:27:44PM +0800, Chen-Yu Tsai wrote:
>
> ...
>
> > > > +int i2c_of_probe_component(struct device *dev, const struct i2c_of_probe_cfg *cfg, void *ctx)
> > > > +{
> > > > +     const struct i2c_of_probe_ops *ops;
> > > > +     const char *type;
> > > > +     struct device_node *i2c_node;
> > > > +     struct i2c_adapter *i2c;
> > > > +     int ret;
> > > > +
> > > > +     if (!cfg)
> > > > +             return -EINVAL;
> > > > +
> > > > +     ops = cfg->ops ?: &i2c_of_probe_dummy_ops;
> > > > +     type = cfg->type;
> > > > +
> > > > +     i2c_node = i2c_of_probe_get_i2c_node(dev, type);
> > >
> > >
> > >         struct device_node *i2c_node __free(of_node_put) =
> > >                 i2c_...;
> >
> > cleanup.h says to not mix the two styles (scoped vs goto). I was trying
> > to follow that, though I realize now that with the scoped loops it
> > probably doesn't help.
> >
> > I'll revert back to having __free().
> >
> > > > +     if (IS_ERR(i2c_node))
> > > > +             return PTR_ERR(i2c_node);
> > > > +
> > > > +     for_each_child_of_node_with_prefix(i2c_node, node, type) {
> > > > +             if (!of_device_is_available(node))
> > > > +                     continue;
> > > > +
> > > > +             /*
> > > > +              * Device tree has component already enabled. Either the
> > > > +              * device tree isn't supported or we already probed once.
> > > > +              */
> > > > +             ret = 0;
> > >
> > > Shouldn't you drop reference count for "node"? (See also below)
> >
> > This for-each loop the "scoped". It just doesn't have the prefix anymore.
> > I believe you asked if the prefix could be dropped and then Rob agreed.
>
> Hmm... I have looked into the implementation and I haven't found the evidence
> that this is anyhow scoped. Can you point out what I have missed?

>From patch 2:

+#define for_each_child_of_node_with_prefix(parent, child, prefix)      \
+       for (struct device_node *child __free(device_node) =            \

                                 ^^^^^^^^^^^^^^^^^^^^^^^^^ scoped here

+            of_get_next_child_with_prefix(parent, NULL, prefix);       \
+            child != NULL;                                             \
+            child = of_get_next_child_with_prefix(parent, child, prefix))
+

"node", or "child" in this snippet is scoped within the for loop.


ChenYu

> > > > +             goto out_put_i2c_node;
> > > > +     }
> > > > +
> > > > +     i2c = of_get_i2c_adapter_by_node(i2c_node);
> > > > +     if (!i2c) {
> > > > +             ret = dev_err_probe(dev, -EPROBE_DEFER, "Couldn't get I2C adapter\n");
> > > > +             goto out_put_i2c_node;
> > > > +     }
> > > > +
> > > > +     /* Grab resources */
> > > > +     ret = 0;
> > > > +     if (ops->get_resources)
> > > > +             ret = ops->get_resources(dev, i2c_node, ctx);
> > > > +     if (ret)
> > > > +             goto out_put_i2c_adapter;
> > > > +
> > > > +     /* Enable resources */
> > > > +     if (ops->enable)
> > > > +             ret = ops->enable(dev, ctx);
> > > > +     if (ret)
> > > > +             goto out_release_resources;
> > > > +
> > > > +     ret = 0;
> > > > +     for_each_child_of_node_with_prefix(i2c_node, node, type) {
> > > > +             union i2c_smbus_data data;
> > > > +             u32 addr;
> > > > +
> > > > +             if (of_property_read_u32(node, "reg", &addr))
> > > > +                     continue;
> > > > +             if (i2c_smbus_xfer(i2c, addr, 0, I2C_SMBUS_READ, 0, I2C_SMBUS_BYTE, &data) < 0)
> > > > +                     continue;
> > > > +
> > > > +             /* Found a device that is responding */
> > > > +             if (ops->free_resources_early)
> > > > +                     ops->free_resources_early(ctx);
> > > > +             ret = i2c_of_probe_enable_node(dev, node);
> > >
> > > Hmm... Is "node" reference count left bumped up for a reason?
> >
> > Same as above.
>
> Same as above.
>
> > > > +             break;
> > > > +     }
> > > > +
> > > > +     if (ops->cleanup)
> > > > +             ops->cleanup(dev, ctx);
> > > > +out_release_resources:
> > > > +     if (ops->free_resources_late)
> > > > +             ops->free_resources_late(ctx);
> > > > +out_put_i2c_adapter:
> > > > +     i2c_put_adapter(i2c);
> > > > +out_put_i2c_node:
> > > > +     of_node_put(i2c_node);
> > > > +
> > > > +     return ret;
> > > > +}
>
> --
> With Best Regards,
> Andy Shevchenko
>
>


From macpaul.lin at mediatek.com  Mon Sep 16 08:11:30 2024
From: macpaul.lin at mediatek.com (Macpaul Lin)
Date: Mon, 16 Sep 2024 23:11:30 +0800
Subject: [PATCH v5 1/3] regulator: dt-bindings: mt6323: Convert to DT schema
Message-ID: <20240916151132.32321-1-macpaul.lin@mediatek.com>

Convert the MT6323 regulator binding from the old text-based format to
the new DT schema style. The property "regulator-name" has been added
as required property to reflect current usage in mt6323.dtsi.

Examples have been streamlined and relocated to the parent schema file:
  mfd/mediatek,mt6397.yaml.

Update maintainer and submitter information with new entries from MediaTek.

The reference document cited in "mediatek,mt7530.yaml" has been updated
to point to this new DT schema file

Signed-off-by: Sen Chu <sen.chu at mediatek.com>
Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
Reviewed-by: Krzysztof Kozlowski <krzk at kernel.org>
---
 .../bindings/net/dsa/mediatek,mt7530.yaml     |   4 +-
 .../regulator/mediatek,mt6323-regulator.yaml  | 119 +++++++++
 .../bindings/regulator/mt6323-regulator.txt   | 237 ------------------
 3 files changed, 121 insertions(+), 239 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/regulator/mediatek,mt6323-regulator.yaml
 delete mode 100644 Documentation/devicetree/bindings/regulator/mt6323-regulator.txt

Changes for v1 and v2:
 - This is the first version of converting mt6323-regulator.
   This is because converting mt6323-regulator together
   with mfd/mediatek,mt6397.yaml, so we've create a patch set
   instead of single patch for each skydives.
 - This patch has been made base on linux-next/master git repo.

Changes for v3:
 - Rebased on linux-next/master git repo near next-20240906.
 - Added 'regulator-name' to 'requried' property to reflect current usage.
 - replace ^(buck_)? and ^(ldo_)? to ^buck_ and ^ldo_ prefix.
 - Update file name of 'mediatek,mt6323-regulator.yaml' in
   'mediatek,mt7530.yaml'

Changes for v4:
 - No change.

Changes for v5:
 - Add "Reviewed-by" in commit message. Thanks for the review!
 - Remove a blank line at EOF whcih causes whitespace warning
   when 'git am' the patch.

diff --git a/Documentation/devicetree/bindings/net/dsa/mediatek,mt7530.yaml b/Documentation/devicetree/bindings/net/dsa/mediatek,mt7530.yaml
index ea979bc..413db38 100644
--- a/Documentation/devicetree/bindings/net/dsa/mediatek,mt7530.yaml
+++ b/Documentation/devicetree/bindings/net/dsa/mediatek,mt7530.yaml
@@ -129,8 +129,8 @@ properties:
   io-supply:
     description: |
       Phandle to the regulator node necessary for the I/O power.
-      See Documentation/devicetree/bindings/regulator/mt6323-regulator.txt for
-      details for the regulator setup on these boards.
+      See Documentation/devicetree/bindings/regulator/mediatek,mt6323-regulator.yaml
+      for details for the regulator setup on these boards.
 
   mediatek,mcm:
     type: boolean
diff --git a/Documentation/devicetree/bindings/regulator/mediatek,mt6323-regulator.yaml b/Documentation/devicetree/bindings/regulator/mediatek,mt6323-regulator.yaml
new file mode 100644
index 0000000..9bc9aa9a
--- /dev/null
+++ b/Documentation/devicetree/bindings/regulator/mediatek,mt6323-regulator.yaml
@@ -0,0 +1,119 @@
+# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/regulator/mediatek,mt6323-regulator.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: MediaTek MT6323 Regulator
+
+maintainers:
+  - John Crispin <john at phrozen.org>
+  - Sen Chu <sen.chu at mediatek.com>
+  - Macpaul Lin <macpaul.lin at mediatek.com>
+
+description: |
+  Regulator node of the PMIC. This node should under the PMIC's device node.
+  All voltage regulators provided by the PMIC are described as sub-nodes of
+  this node.
+
+properties:
+  compatible:
+    items:
+      - const: mediatek,mt6323-regulator
+
+patternProperties:
+  "^buck_v(pa|proc|sys)$":
+    description: Buck regulators
+    type: object
+    $ref: regulator.yaml#
+
+    properties:
+      regulator-allowed-modes: false
+
+    unevaluatedProperties: false
+
+    required:
+      - regulator-name
+
+  "^ldo_v(camio|cn18)$":
+    description: LDO with fixed 1.8V output and 0~100/10mV tuning
+    type: object
+    $ref: regulator.yaml#
+
+    properties:
+      regulator-allowed-modes: false
+
+    unevaluatedProperties: false
+
+    required:
+      - regulator-name
+
+  "^ldo_v((io|rf)18)$":
+    description: LDOs with fixed 1.825V output and 0~100/10mV tuning
+    type: object
+    $ref: regulator.yaml#
+
+    properties:
+      regulator-allowed-modes: false
+
+    unevaluatedProperties: false
+
+    required:
+      - regulator-name
+
+  "^ldo_v(a|rtc|tcxo|(cn|io)28)$":
+    description: LDOs with fixed 2.8V output and 0~100/10mV tuning
+    type: object
+    $ref: regulator.yaml#
+
+    properties:
+      regulator-allowed-modes: false
+
+    unevaluatedProperties: false
+
+    required:
+      - regulator-name
+
+  "^ldo_v(usb)$":
+    description: LDOs with fixed 3.3V output and 0~100/10mV tuning
+    type: object
+    $ref: regulator.yaml#
+
+    properties:
+      regulator-allowed-modes: false
+
+    unevaluatedProperties: false
+
+    required:
+      - regulator-name
+
+  "^ldo_v(cn33_(bt|wifi))$":
+    description: LDOs with variable 3.3V output and 0~100/10mV tuning
+    type: object
+    $ref: regulator.yaml#
+
+    properties:
+      regulator-allowed-modes: false
+
+    unevaluatedProperties: false
+
+    required:
+      - regulator-name
+
+  "^ldo_v(cama|camaf|camd|emc3v3|gp[123]|ibr|m|mc|mch|sim[12])$":
+    description: LDOs with variable output and 0~100/10mV tuning
+    type: object
+    $ref: regulator.yaml#
+
+    properties:
+      regulator-allowed-modes: false
+
+    unevaluatedProperties: false
+
+    required:
+      - regulator-name
+
+required:
+  - compatible
+
+additionalProperties: false
diff --git a/Documentation/devicetree/bindings/regulator/mt6323-regulator.txt b/Documentation/devicetree/bindings/regulator/mt6323-regulator.txt
deleted file mode 100644
index a48749d..0000000
--- a/Documentation/devicetree/bindings/regulator/mt6323-regulator.txt
+++ /dev/null
@@ -1,237 +0,0 @@
-Mediatek MT6323 Regulator
-
-All voltage regulators are defined as subnodes of the regulators node. A list
-of regulators provided by this controller are defined as subnodes of the
-PMIC's node. Each regulator is named according to its regulator type,
-buck_<name> and ldo_<name>. The definition for each of these nodes is defined
-using the standard binding for regulators at
-Documentation/devicetree/bindings/regulator/regulator.txt.
-
-The valid names for regulators are::
-BUCK:
-  buck_vproc, buck_vsys, buck_vpa
-LDO:
-  ldo_vtcxo, ldo_vcn28, ldo_vcn33_bt, ldo_vcn33_wifi, ldo_va, ldo_vcama,
-  ldo_vio28, ldo_vusb, ldo_vmc, ldo_vmch, ldo_vemc3v3, ldo_vgp1, ldo_vgp2,
-  ldo_vgp3, ldo_vcn18, ldo_vsim1, ldo_vsim2, ldo_vrtc, ldo_vcamaf, ldo_vibr,
-  ldo_vrf18, ldo_vm, ldo_vio18, ldo_vcamd, ldo_vcamio
-
-Example:
-
-	pmic: mt6323 {
-		mt6323regulator: regulators {
-			mt6323_vproc_reg: buck_vproc{
-				regulator-name = "vproc";
-				regulator-min-microvolt = < 700000>;
-				regulator-max-microvolt = <1350000>;
-				regulator-ramp-delay = <12500>;
-				regulator-always-on;
-				regulator-boot-on;
-			};
-
-			mt6323_vsys_reg: buck_vsys{
-				regulator-name = "vsys";
-				regulator-min-microvolt = <1400000>;
-				regulator-max-microvolt = <2987500>;
-				regulator-ramp-delay = <25000>;
-				regulator-always-on;
-				regulator-boot-on;
-			};
-
-			mt6323_vpa_reg: buck_vpa{
-				regulator-name = "vpa";
-				regulator-min-microvolt = < 500000>;
-				regulator-max-microvolt = <3650000>;
-			};
-
-			mt6323_vtcxo_reg: ldo_vtcxo{
-				regulator-name = "vtcxo";
-				regulator-min-microvolt = <2800000>;
-				regulator-max-microvolt = <2800000>;
-				regulator-enable-ramp-delay = <90>;
-				regulator-always-on;
-				regulator-boot-on;
-			};
-
-			mt6323_vcn28_reg: ldo_vcn28{
-				regulator-name = "vcn28";
-				regulator-min-microvolt = <2800000>;
-				regulator-max-microvolt = <2800000>;
-				regulator-enable-ramp-delay = <185>;
-			};
-
-			mt6323_vcn33_bt_reg: ldo_vcn33_bt{
-				regulator-name = "vcn33_bt";
-				regulator-min-microvolt = <3300000>;
-				regulator-max-microvolt = <3600000>;
-				regulator-enable-ramp-delay = <185>;
-			};
-
-			mt6323_vcn33_wifi_reg: ldo_vcn33_wifi{
-				regulator-name = "vcn33_wifi";
-				regulator-min-microvolt = <3300000>;
-				regulator-max-microvolt = <3600000>;
-				regulator-enable-ramp-delay = <185>;
-			};
-
-			mt6323_va_reg: ldo_va{
-				regulator-name = "va";
-				regulator-min-microvolt = <2800000>;
-				regulator-max-microvolt = <2800000>;
-				regulator-enable-ramp-delay = <216>;
-				regulator-always-on;
-				regulator-boot-on;
-			};
-
-			mt6323_vcama_reg: ldo_vcama{
-				regulator-name = "vcama";
-				regulator-min-microvolt = <1500000>;
-				regulator-max-microvolt = <2800000>;
-				regulator-enable-ramp-delay = <216>;
-			};
-
-			mt6323_vio28_reg: ldo_vio28{
-				regulator-name = "vio28";
-				regulator-min-microvolt = <2800000>;
-				regulator-max-microvolt = <2800000>;
-				regulator-enable-ramp-delay = <216>;
-				regulator-always-on;
-				regulator-boot-on;
-			};
-
-			mt6323_vusb_reg: ldo_vusb{
-				regulator-name = "vusb";
-				regulator-min-microvolt = <3300000>;
-				regulator-max-microvolt = <3300000>;
-				regulator-enable-ramp-delay = <216>;
-				regulator-boot-on;
-			};
-
-			mt6323_vmc_reg: ldo_vmc{
-				regulator-name = "vmc";
-				regulator-min-microvolt = <1800000>;
-				regulator-max-microvolt = <3300000>;
-				regulator-enable-ramp-delay = <36>;
-				regulator-boot-on;
-			};
-
-			mt6323_vmch_reg: ldo_vmch{
-				regulator-name = "vmch";
-				regulator-min-microvolt = <3000000>;
-				regulator-max-microvolt = <3300000>;
-				regulator-enable-ramp-delay = <36>;
-				regulator-boot-on;
-			};
-
-			mt6323_vemc3v3_reg: ldo_vemc3v3{
-				regulator-name = "vemc3v3";
-				regulator-min-microvolt = <3000000>;
-				regulator-max-microvolt = <3300000>;
-				regulator-enable-ramp-delay = <36>;
-				regulator-boot-on;
-			};
-
-			mt6323_vgp1_reg: ldo_vgp1{
-				regulator-name = "vgp1";
-				regulator-min-microvolt = <1200000>;
-				regulator-max-microvolt = <3300000>;
-				regulator-enable-ramp-delay = <216>;
-			};
-
-			mt6323_vgp2_reg: ldo_vgp2{
-				regulator-name = "vgp2";
-				regulator-min-microvolt = <1200000>;
-				regulator-max-microvolt = <3000000>;
-				regulator-enable-ramp-delay = <216>;
-			};
-
-			mt6323_vgp3_reg: ldo_vgp3{
-				regulator-name = "vgp3";
-				regulator-min-microvolt = <1200000>;
-				regulator-max-microvolt = <1800000>;
-				regulator-enable-ramp-delay = <216>;
-			};
-
-			mt6323_vcn18_reg: ldo_vcn18{
-				regulator-name = "vcn18";
-				regulator-min-microvolt = <1800000>;
-				regulator-max-microvolt = <1800000>;
-				regulator-enable-ramp-delay = <216>;
-			};
-
-			mt6323_vsim1_reg: ldo_vsim1{
-				regulator-name = "vsim1";
-				regulator-min-microvolt = <1800000>;
-				regulator-max-microvolt = <3000000>;
-				regulator-enable-ramp-delay = <216>;
-			};
-
-			mt6323_vsim2_reg: ldo_vsim2{
-				regulator-name = "vsim2";
-				regulator-min-microvolt = <1800000>;
-				regulator-max-microvolt = <3000000>;
-				regulator-enable-ramp-delay = <216>;
-			};
-
-			mt6323_vrtc_reg: ldo_vrtc{
-				regulator-name = "vrtc";
-				regulator-min-microvolt = <2800000>;
-				regulator-max-microvolt = <2800000>;
-				regulator-always-on;
-				regulator-boot-on;
-			};
-
-			mt6323_vcamaf_reg: ldo_vcamaf{
-				regulator-name = "vcamaf";
-				regulator-min-microvolt = <1200000>;
-				regulator-max-microvolt = <3300000>;
-				regulator-enable-ramp-delay = <216>;
-			};
-
-			mt6323_vibr_reg: ldo_vibr{
-				regulator-name = "vibr";
-				regulator-min-microvolt = <1200000>;
-				regulator-max-microvolt = <3300000>;
-				regulator-enable-ramp-delay = <36>;
-			};
-
-			mt6323_vrf18_reg: ldo_vrf18{
-				regulator-name = "vrf18";
-				regulator-min-microvolt = <1825000>;
-				regulator-max-microvolt = <1825000>;
-				regulator-enable-ramp-delay = <187>;
-			};
-
-			mt6323_vm_reg: ldo_vm{
-				regulator-name = "vm";
-				regulator-min-microvolt = <1200000>;
-				regulator-max-microvolt = <1800000>;
-				regulator-enable-ramp-delay = <216>;
-				regulator-always-on;
-				regulator-boot-on;
-			};
-
-			mt6323_vio18_reg: ldo_vio18{
-				regulator-name = "vio18";
-				regulator-min-microvolt = <1800000>;
-				regulator-max-microvolt = <1800000>;
-				regulator-enable-ramp-delay = <216>;
-				regulator-always-on;
-				regulator-boot-on;
-			};
-
-			mt6323_vcamd_reg: ldo_vcamd{
-				regulator-name = "vcamd";
-				regulator-min-microvolt = <1200000>;
-				regulator-max-microvolt = <1800000>;
-				regulator-enable-ramp-delay = <216>;
-			};
-
-			mt6323_vcamio_reg: ldo_vcamio{
-				regulator-name = "vcamio";
-				regulator-min-microvolt = <1800000>;
-				regulator-max-microvolt = <1800000>;
-				regulator-enable-ramp-delay = <216>;
-			};
-		};
-	};
-- 
2.45.2



From macpaul.lin at mediatek.com  Mon Sep 16 08:11:32 2024
From: macpaul.lin at mediatek.com (Macpaul Lin)
Date: Mon, 16 Sep 2024 23:11:32 +0800
Subject: [PATCH v5 3/3] regulator: dt-bindings: mt6397: move examples to parent PMIC mt6397
In-Reply-To: <20240916151132.32321-1-macpaul.lin@mediatek.com>
References: <20240916151132.32321-1-macpaul.lin@mediatek.com>
Message-ID: <20240916151132.32321-3-macpaul.lin@mediatek.com>

Since the DT schema of multiple function PMIC mt6397 has been converted,
move the examples in "mediatek,mt6397-regulator.yaml" to the parent schema
"mediatek,mt6397.yaml".

Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
---
 .../regulator/mediatek,mt6397-regulator.yaml  | 173 ------------------
 1 file changed, 173 deletions(-)

Changes for v1 and v2:
 - This is the first version of converting rtc-mt6397.txt.
   This is because converting rtc-mt6397 together
   with mfd/mediatek,mt6397.yaml, so we've create a patch set
   instead of submitting single patch for each subdevice.
 - This patch has been made base on linux-next/master git repo.

Changes for v3:
 - Re-order this patch since other patches for removing text DT bindings
   in v2 qill be squash into MFD patch.

Changes for v4:
 - No change.

Changes for v5:
 - No change. Fix the belonging to the same patch set.

diff --git a/Documentation/devicetree/bindings/regulator/mediatek,mt6397-regulator.yaml b/Documentation/devicetree/bindings/regulator/mediatek,mt6397-regulator.yaml
index 50db678..337ac58 100644
--- a/Documentation/devicetree/bindings/regulator/mediatek,mt6397-regulator.yaml
+++ b/Documentation/devicetree/bindings/regulator/mediatek,mt6397-regulator.yaml
@@ -63,176 +63,3 @@ required:
 
 additionalProperties: false
 
-examples:
-  - |
-    #include <dt-bindings/interrupt-controller/arm-gic.h>
-
-    mt6397_regulators: regulators {
-        compatible = "mediatek,mt6397-regulator";
-
-        mt6397_vpca15_reg: buck_vpca15 {
-            regulator-name = "vpca15";
-            regulator-min-microvolt = < 850000>;
-            regulator-max-microvolt = <1350000>;
-            regulator-ramp-delay = <12500>;
-            regulator-enable-ramp-delay = <200>;
-        };
-
-        mt6397_vpca7_reg: buck_vpca7 {
-            regulator-name = "vpca7";
-            regulator-min-microvolt = < 850000>;
-            regulator-max-microvolt = <1350000>;
-            regulator-ramp-delay = <12500>;
-            regulator-enable-ramp-delay = <115>;
-        };
-
-        mt6397_vsramca15_reg: buck_vsramca15 {
-            regulator-name = "vsramca15";
-            regulator-min-microvolt = < 850000>;
-            regulator-max-microvolt = <1350000>;
-            regulator-ramp-delay = <12500>;
-            regulator-enable-ramp-delay = <115>;
-        };
-
-        mt6397_vsramca7_reg: buck_vsramca7 {
-            regulator-name = "vsramca7";
-            regulator-min-microvolt = < 850000>;
-            regulator-max-microvolt = <1350000>;
-            regulator-ramp-delay = <12500>;
-            regulator-enable-ramp-delay = <115>;
-        };
-
-        mt6397_vcore_reg: buck_vcore {
-            regulator-name = "vcore";
-            regulator-min-microvolt = < 850000>;
-            regulator-max-microvolt = <1350000>;
-            regulator-ramp-delay = <12500>;
-            regulator-enable-ramp-delay = <115>;
-        };
-
-        mt6397_vgpu_reg: buck_vgpu {
-            regulator-name = "vgpu";
-            regulator-min-microvolt = < 700000>;
-            regulator-max-microvolt = <1350000>;
-            regulator-ramp-delay = <12500>;
-            regulator-enable-ramp-delay = <115>;
-        };
-
-        mt6397_vdrm_reg: buck_vdrm {
-            regulator-name = "vdrm";
-            regulator-min-microvolt = < 800000>;
-            regulator-max-microvolt = <1400000>;
-            regulator-ramp-delay = <12500>;
-            regulator-enable-ramp-delay = <500>;
-        };
-
-        mt6397_vio18_reg: buck_vio18 {
-            regulator-name = "vio18";
-            regulator-min-microvolt = <1500000>;
-            regulator-max-microvolt = <2120000>;
-            regulator-ramp-delay = <12500>;
-            regulator-enable-ramp-delay = <500>;
-        };
-
-        mt6397_vtcxo_reg: ldo_vtcxo {
-            regulator-name = "vtcxo";
-            regulator-min-microvolt = <2800000>;
-            regulator-max-microvolt = <2800000>;
-            regulator-enable-ramp-delay = <90>;
-        };
-
-        mt6397_va28_reg: ldo_va28 {
-            regulator-name = "va28";
-            /* fixed output 2.8 V */
-            regulator-enable-ramp-delay = <218>;
-        };
-
-        mt6397_vcama_reg: ldo_vcama {
-            regulator-name = "vcama";
-            regulator-min-microvolt = <1500000>;
-            regulator-max-microvolt = <2800000>;
-            regulator-enable-ramp-delay = <218>;
-        };
-
-        mt6397_vio28_reg: ldo_vio28 {
-            regulator-name = "vio28";
-            /* fixed output 2.8 V */
-            regulator-enable-ramp-delay = <240>;
-        };
-
-        mt6397_usb_reg: ldo_vusb {
-            regulator-name = "vusb";
-            /* fixed output 3.3 V */
-            regulator-enable-ramp-delay = <218>;
-        };
-
-        mt6397_vmc_reg: ldo_vmc {
-            regulator-name = "vmc";
-            regulator-min-microvolt = <1800000>;
-            regulator-max-microvolt = <3300000>;
-            regulator-enable-ramp-delay = <218>;
-        };
-
-        mt6397_vmch_reg: ldo_vmch {
-            regulator-name = "vmch";
-            regulator-min-microvolt = <3000000>;
-            regulator-max-microvolt = <3300000>;
-            regulator-enable-ramp-delay = <218>;
-        };
-
-        mt6397_vemc_3v3_reg: ldo_vemc3v3 {
-            regulator-name = "vemc_3v3";
-            regulator-min-microvolt = <3000000>;
-            regulator-max-microvolt = <3300000>;
-            regulator-enable-ramp-delay = <218>;
-        };
-
-        mt6397_vgp1_reg: ldo_vgp1 {
-            regulator-name = "vcamd";
-            regulator-min-microvolt = <1220000>;
-            regulator-max-microvolt = <3300000>;
-            regulator-enable-ramp-delay = <240>;
-        };
-
-        mt6397_vgp2_reg: ldo_vgp2 {
-            regulator-name = "vcamio";
-            regulator-min-microvolt = <1000000>;
-            regulator-max-microvolt = <3300000>;
-            regulator-enable-ramp-delay = <218>;
-        };
-
-        mt6397_vgp3_reg: ldo_vgp3 {
-            regulator-name = "vcamaf";
-            regulator-min-microvolt = <1200000>;
-            regulator-max-microvolt = <3300000>;
-            regulator-enable-ramp-delay = <218>;
-        };
-
-        mt6397_vgp4_reg: ldo_vgp4 {
-            regulator-name = "vgp4";
-            regulator-min-microvolt = <1200000>;
-            regulator-max-microvolt = <3300000>;
-            regulator-enable-ramp-delay = <218>;
-        };
-
-        mt6397_vgp5_reg: ldo_vgp5 {
-            regulator-name = "vgp5";
-            regulator-min-microvolt = <1200000>;
-            regulator-max-microvolt = <3000000>;
-            regulator-enable-ramp-delay = <218>;
-        };
-
-        mt6397_vgp6_reg: ldo_vgp6 {
-            regulator-name = "vgp6";
-            regulator-min-microvolt = <1200000>;
-            regulator-max-microvolt = <3300000>;
-            regulator-enable-ramp-delay = <218>;
-        };
-
-        mt6397_vibr_reg: ldo_vibr {
-            regulator-name = "vibr";
-            regulator-min-microvolt = <1200000>;
-            regulator-max-microvolt = <3300000>;
-            regulator-enable-ramp-delay = <218>;
-        };
-    };
-- 
2.45.2



From macpaul.lin at mediatek.com  Mon Sep 16 08:11:31 2024
From: macpaul.lin at mediatek.com (Macpaul Lin)
Date: Mon, 16 Sep 2024 23:11:31 +0800
Subject: [PATCH v5 2/3] dt-bindings: mfd: mediatek: mt6397: Convert to DT schema format
In-Reply-To: <20240916151132.32321-1-macpaul.lin@mediatek.com>
References: <20240916151132.32321-1-macpaul.lin@mediatek.com>
Message-ID: <20240916151132.32321-2-macpaul.lin@mediatek.com>

Convert the mfd: mediatek: mt6397 binding to DT schema format.

MT6323, MT6358, and MT6397 are PMIC devices with multiple function
subdevices. They share a common PMIC design but have variations in
subdevice combinations.

Key updates in this conversion:

1. RTC:
   - Convert rtc-mt6397.txt and merge into parent MT6397 PMIC DT schema.

2. Regulators:
   - Align to generic name "regulators".
   - Update references from .txt to .yaml for mt6323, mt6358, and mt6397
     regulators.
   - Simplify regulator name labels in device tree examples.

3. Audio Codec:
   - Convert sound/mt6358.txt and merge into parent MT6397 PMIC DT schema.
   - Align to generic name "audio-codec" for codec and sound subdevices.
   - Add "mediatek,dmic-mode" and "Avdd-supply" properties.

4. Clocks:
   - Align to generic name "clocks" for clockbuffer subdevices.

5. LEDs:
   - Convert leds-mt6323.txt and merge into parent MT6397 PMIC DT schema.
   - Update LED binding.

6. Keys:
   - Add detailed descriptions for power and home keys.
   - Add compatible: mediatek,mt6358-keys.

7. Power Controller:
   - Convert mt6323-poweroff.txt and merge into parent MT6397 PMIC DT
     schema.
   - Add #power-domain-cells property to fix dt-binding check error.
   - Clarify "BBPU" as "Baseband power up".

8. Pinctrl:
   - Align to generic name "pinctrl" instead of "pin-controller".

9. Compatible:
   - Drop "mediatek,mt6357" since there is a separated DT Schema
     for PMIC MT6357.

Additional updates:
- MAINTAINERS: Add co-maintainers and reference to
  mfd/mediatek,mt6397.yaml for LED and power-controller drivers.
- input/mediatek,pmic-keys.yaml: Update reference to
  mfd/mediatek,mt6397.yaml.

Signed-off-by: Sen Chu <sen.chu at mediatek.com>
Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
---
 .../bindings/input/mediatek,pmic-keys.yaml    |    2 +-
 .../devicetree/bindings/leds/leds-mt6323.txt  |   63 -
 .../bindings/mfd/mediatek,mt6397.yaml         | 1045 +++++++++++++++++
 .../devicetree/bindings/mfd/mt6397.txt        |  110 --
 .../bindings/power/reset/mt6323-poweroff.txt  |   20 -
 .../devicetree/bindings/rtc/rtc-mt6397.txt    |   31 -
 .../devicetree/bindings/sound/mt6358.txt      |   26 -
 MAINTAINERS                                   |    8 +-
 8 files changed, 1052 insertions(+), 253 deletions(-)
 delete mode 100644 Documentation/devicetree/bindings/leds/leds-mt6323.txt
 create mode 100644 Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml
 delete mode 100644 Documentation/devicetree/bindings/mfd/mt6397.txt
 delete mode 100644 Documentation/devicetree/bindings/power/reset/mt6323-poweroff.txt
 delete mode 100644 Documentation/devicetree/bindings/rtc/rtc-mt6397.txt
 delete mode 100644 Documentation/devicetree/bindings/sound/mt6358.txt

Changes for v1:
 - This patch depends on conversion of mediatek,mt6397-regulator.yaml
   [1] https://lore.kernel.org/lkml/20240807091738.18387-1-macpaul.lin at mediatek.com/T/

Changes for v2:
 - This patch has been made base on linux-next/master git repo.
 - Keep the parent and child relationship with mediatek,pwrap in description.
   [2] https://lore.kernel.org/all/20240826-slurp-earphone-0d5173923ae8 at spud/
 - Keep the $ref for regulators since dt_binding_check didn't report any issue
   based on linux-next/master repo.
 - Fix description of mt6397/mt6323 devices, use "power management chip"
   instead of "multifunction device"
 - Drop unnecessary comments or description according to the review.
 - Convert sub-modules to DT Schema:
  - RTC, LEDs, power-controllers, regulators
 - Drop duplicate sub node name and description for sub-modules
  - RTC, Keys
 - examples:
  - drop parent pwrap node
  - Add examples from mediatek,mt6323-regulator.yaml
  - Add examples from mediatek,mt6358-regulator.yaml
  - Add examples from mediatek,mt6397-regulator.yaml
  - Complete the examples as could as possible.

Changes for v3:
 - Rebased on linux-next/master git repo near next-20240906.
 - Revise commit message.
 - Regulators:
  - Use "additionalProperties: true" and add "contains" for matching
    $ref DT bindings.
  - Simplify regulator name labels in device tree examples.
 - LEDs:
  - Use LED bindings.
 - Squash following patches in v2 for removing old text format DT bindings
   into this patch, includes:
  - leds-mt6323.txt, mt6323-poweroff.txt, rtc-mt6397.txt, sound/mt6358.txt.
 - Fix file format of DT schemas, add blank between properties.
 - Fix 'make checkrefdoc' errors, update reference in mediatek,pmic-keys.yaml.

Changes for v4:
 - Remove "mediatek,mt6357" from PMIC's compatible string since there is a
   seperated DT schema for PMIC mt6357.

Changes for v5:
 - Rebase to next-20240913 (linux-next/master).
  - Run dt_binding_check (2024.10.dev3+gdc4787b) and refcheckdocs
 - Fix the "title" (device type) of mfd/mediatek,mt6397.yaml to "PMIC".
 - RTC:
  - Drop "start-year"
 - Regulators:
  - Add blank lines between description and properties.
  - Drop allOf for the $ref section on property.
 - clocks:
  - Fix no need '|' in descriptoin.
  - Add blank lines between description and properties.
 - Keys:
  - Drop compatible since these enums are already in $ref.
 - pinctrl:
  - Drop compatible since it is already in $ref.
 - examples:
  - Fix indentations for leds and keys.

diff --git a/Documentation/devicetree/bindings/input/mediatek,pmic-keys.yaml b/Documentation/devicetree/bindings/input/mediatek,pmic-keys.yaml
index 70567d9..466566a 100644
--- a/Documentation/devicetree/bindings/input/mediatek,pmic-keys.yaml
+++ b/Documentation/devicetree/bindings/input/mediatek,pmic-keys.yaml
@@ -19,7 +19,7 @@ description: |
   by the PMIC that is defined as a Multi-Function Device (MFD).
 
   For MediaTek MT6323/MT6397 PMIC bindings see
-  Documentation/devicetree/bindings/mfd/mt6397.txt
+  Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml
 
 properties:
   compatible:
diff --git a/Documentation/devicetree/bindings/leds/leds-mt6323.txt b/Documentation/devicetree/bindings/leds/leds-mt6323.txt
deleted file mode 100644
index 052dccb8..0000000
--- a/Documentation/devicetree/bindings/leds/leds-mt6323.txt
+++ /dev/null
@@ -1,63 +0,0 @@
-Device Tree Bindings for LED support on MT6323 PMIC
-
-MT6323 LED controller is subfunction provided by MT6323 PMIC, so the LED
-controllers are defined as the subnode of the function node provided by MT6323
-PMIC controller that is being defined as one kind of Muti-Function Device (MFD)
-using shared bus called PMIC wrapper for each subfunction to access remote
-MT6323 PMIC hardware.
-
-For MT6323 MFD bindings see:
-Documentation/devicetree/bindings/mfd/mt6397.txt
-For MediaTek PMIC wrapper bindings see:
-Documentation/devicetree/bindings/soc/mediatek/mediatek,pwrap.yaml
-
-Required properties:
-- compatible : Must be one of
-  - "mediatek,mt6323-led"
-  - "mediatek,mt6331-led"
-  - "mediatek,mt6332-led"
-- address-cells : Must be 1
-- size-cells : Must be 0
-
-Each led is represented as a child node of the mediatek,mt6323-led that
-describes the initial behavior for each LED physically and currently only four
-LED child nodes can be supported.
-
-Required properties for the LED child node:
-- reg : LED channel number (0..3)
-
-Optional properties for the LED child node:
-- label : See Documentation/devicetree/bindings/leds/common.txt
-- linux,default-trigger : See Documentation/devicetree/bindings/leds/common.txt
-- default-state: See Documentation/devicetree/bindings/leds/common.txt
-
-Example:
-
-	mt6323: pmic {
-		compatible = "mediatek,mt6323";
-
-		...
-
-		mt6323led: leds {
-			compatible = "mediatek,mt6323-led";
-			#address-cells = <1>;
-			#size-cells = <0>;
-
-			led at 0 {
-				reg = <0>;
-				label = "LED0";
-				linux,default-trigger = "timer";
-				default-state = "on";
-			};
-			led at 1 {
-				reg = <1>;
-				label = "LED1";
-				default-state = "off";
-			};
-			led at 2 {
-				reg = <2>;
-				label = "LED2";
-				default-state = "on";
-			};
-		};
-	};
diff --git a/Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml b/Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml
new file mode 100644
index 0000000..5666c50
--- /dev/null
+++ b/Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml
@@ -0,0 +1,1045 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/mfd/mediatek,mt6397.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: MediaTek MT6397/MT6323 PMIC
+
+maintainers:
+  - Sen Chu <sen.chu at mediatek.com>
+  - Macpaul Lin <macpaul.lin at mediatek.com>
+
+description: |
+  MT6397/MT6323 is a power management system chip.
+  Please see the sub-modules below for supported features.
+
+  MT6397/MT6323 is a multifunction device with the following sub modules:
+  - Regulators
+  - RTC
+  - Audio codec
+  - GPIO
+  - Clock
+  - LED
+  - Keys
+  - Power controller
+
+  It is interfaced to host controller using SPI interface by a proprietary hardware
+  called PMIC wrapper or pwrap. MT6397/MT6323 PMIC is a child device of pwrap.
+  See the following for pwrap node definitions:
+  Documentation/devicetree/bindings/soc/mediatek/mediatek,pwrap.yaml
+
+properties:
+  compatible:
+    oneOf:
+      - enum:
+          - mediatek,mt6323
+          - mediatek,mt6331 # "mediatek,mt6331" for PMIC MT6331 and MT6332.
+          - mediatek,mt6358
+          - mediatek,mt6359
+          - mediatek,mt6397
+      - items:
+          - enum:
+              - mediatek,mt6366
+          - const: mediatek,mt6358
+
+  interrupts:
+    maxItems: 1
+
+  interrupt-controller: true
+
+  "#interrupt-cells":
+    const: 2
+
+  rtc:
+    type: object
+    $ref: /schemas/rtc/rtc.yaml#
+    unevaluatedProperties: false
+    description:
+      MT6397 Real Time Clock.
+
+    properties:
+      compatible:
+        oneOf:
+          - enum:
+              - mediatek,mt6323-rtc
+              - mediatek,mt6331-rtc
+              - mediatek,mt6358-rtc
+              - mediatek,mt6397-rtc
+          - items:
+              - enum:
+                  - mediatek,mt6366-rtc
+              - const: mediatek,mt6358-rtc
+
+    required:
+      - compatible
+
+  regulators:
+    type: object
+    description:
+      List of child nodes that specify the regulators.
+    additionalProperties: true
+
+    properties:
+      compatible:
+        oneOf:
+          - enum:
+              - mediatek,mt6323-regulator
+              - mediatek,mt6358-regulator
+              - mediatek,mt6397-regulator
+          - items:
+              - enum:
+                  - mediatek,mt6366-regulator
+              - const: mediatek,mt6358-regulator
+
+    required:
+      - compatible
+
+  audio-codec:
+    type: object
+    additionalProperties: false
+    description:
+      Audio codec support with MT6397 and MT6358.
+
+    properties:
+      compatible:
+        oneOf:
+          - enum:
+              - mediatek,mt6397-codec
+              - mediatek,mt6358-sound
+          - items:
+              - enum:
+                  - mediatek,mt6366-sound
+              - const: mediatek,mt6358-sound
+
+      mediatek,dmic-mode:
+        description: |
+          Indicates how many data pins are used to transmit two channels of PDM
+          signal.
+          0 - two wires;
+          1 - one wire;
+          Default value is 0.
+        enum: [0, 1]
+        default: 0
+
+      Avdd-supply:
+        description: Power source of AVDD.
+
+    required:
+      - compatible
+
+  clocks:
+    type: object
+    additionalProperties: false
+    description:
+      This is a clock buffer node for mt6397. However, there are no sub nodes
+      or any public document exposed in public.
+
+    properties:
+      compatible:
+        const: mediatek,mt6397-clk
+
+      '#clock-cells':
+        const: 1
+
+    required:
+      - compatible
+
+  leds:
+    type: object
+    additionalProperties: false
+    description: |
+      MT6323 LED controller is subfunction provided by MT6323 PMIC, so the LED
+      controllers are defined as the subnode of the function node provided by MT6323
+      PMIC controller that is being defined as one kind of Muti-Function Device (MFD)
+      using shared bus called PMIC wrapper for each subfunction to access remote
+      MT6323 PMIC hardware.
+
+      Each led is represented as a child node of the mediatek,mt6323-led that
+      describes the initial behavior for each LED physically and currently only four
+      LED child nodes can be supported.
+
+    properties:
+      compatible:
+        enum:
+          - mediatek,mt6323-led
+          - mediatek,mt6331-led
+          - mediatek,mt6332-led
+
+      reg:
+        maxItems: 1
+
+      "#address-cells":
+        const: 1
+
+      "#size-cells":
+        const: 0
+
+    patternProperties:
+      "^led@[0-3]$":
+        type: object
+        $ref: /schemas/leds/common.yaml#
+        unevaluatedProperties: false
+
+        properties:
+          reg:
+            description:
+              LED channel number (0..3)
+            minimum: 0
+            maximum: 3
+
+        required:
+          - reg
+
+    required:
+      - compatible
+      - "#address-cells"
+      - "#size-cells"
+
+  keys:
+    type: object
+    $ref: /schemas/input/mediatek,pmic-keys.yaml
+    unevaluatedProperties: false
+    description:
+      Power and Home keys.
+
+  power-controller:
+    type: object
+    additionalProperties: false
+    description:
+      The power controller which could be found on PMIC is responsible for
+      externally powering off or on the remote MediaTek SoC through the
+      circuit BBPU (baseband power up).
+
+    properties:
+      compatible:
+        const: mediatek,mt6323-pwrc
+
+      '#power-domain-cells':
+        const: 0
+
+  pinctrl:
+    type: object
+    $ref: /schemas/pinctrl/mediatek,mt65xx-pinctrl.yaml
+    unevaluatedProperties: false
+    description:
+      Pin controller
+
+required:
+  - compatible
+  - regulators
+
+additionalProperties: false
+
+examples:
+  - |
+    #include <dt-bindings/interrupt-controller/arm-gic.h>
+    #include <dt-bindings/leds/common.h>
+
+    pmic {
+        compatible = "mediatek,mt6323";
+        interrupt-parent = <&pio>;
+        interrupts = <150 IRQ_TYPE_LEVEL_HIGH>;
+        interrupt-controller;
+        #interrupt-cells = <2>;
+
+        leds {
+            compatible = "mediatek,mt6323-led";
+            #address-cells = <1>;
+            #size-cells = <0>;
+        };
+
+        regulators {
+            compatible = "mediatek,mt6323-regulator";
+
+            buck_vproc {
+                regulator-name = "vproc";
+                regulator-min-microvolt = < 700000>;
+                regulator-max-microvolt = <1350000>;
+                regulator-ramp-delay = <12500>;
+                regulator-always-on;
+                regulator-boot-on;
+            };
+
+            buck_vsys {
+                regulator-name = "vsys";
+                regulator-min-microvolt = <1400000>;
+                regulator-max-microvolt = <2987500>;
+                regulator-ramp-delay = <25000>;
+                regulator-always-on;
+                regulator-boot-on;
+            };
+
+            buck_vpa {
+                regulator-name = "vpa";
+                regulator-min-microvolt = < 500000>;
+                regulator-max-microvolt = <3650000>;
+            };
+
+            ldo_vtcxo {
+                regulator-name = "vtcxo";
+                regulator-min-microvolt = <2800000>;
+                regulator-max-microvolt = <2800000>;
+                regulator-enable-ramp-delay = <90>;
+                regulator-always-on;
+                regulator-boot-on;
+            };
+
+            ldo_vcn28 {
+                regulator-name = "vcn28";
+                regulator-min-microvolt = <2800000>;
+                regulator-max-microvolt = <2800000>;
+                regulator-enable-ramp-delay = <185>;
+            };
+
+            ldo_vcn33_bt {
+                regulator-name = "vcn33_bt";
+                regulator-min-microvolt = <3300000>;
+                regulator-max-microvolt = <3600000>;
+                regulator-enable-ramp-delay = <185>;
+            };
+
+            ldo_vcn33_wifi {
+                regulator-name = "vcn33_wifi";
+                regulator-min-microvolt = <3300000>;
+                regulator-max-microvolt = <3600000>;
+                regulator-enable-ramp-delay = <185>;
+            };
+
+            ldo_va {
+                regulator-name = "va";
+                regulator-min-microvolt = <2800000>;
+                regulator-max-microvolt = <2800000>;
+                regulator-enable-ramp-delay = <216>;
+                regulator-always-on;
+                regulator-boot-on;
+            };
+
+            ldo_vcama {
+                regulator-name = "vcama";
+                regulator-min-microvolt = <1500000>;
+                regulator-max-microvolt = <2800000>;
+                regulator-enable-ramp-delay = <216>;
+            };
+
+            ldo_vio28 {
+                regulator-name = "vio28";
+                regulator-min-microvolt = <2800000>;
+                regulator-max-microvolt = <2800000>;
+                regulator-enable-ramp-delay = <216>;
+                regulator-always-on;
+                regulator-boot-on;
+            };
+
+            ldo_vusb {
+                regulator-name = "vusb";
+                regulator-min-microvolt = <3300000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <216>;
+                regulator-boot-on;
+            };
+
+            ldo_vmc {
+                regulator-name = "vmc";
+                regulator-min-microvolt = <1800000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <36>;
+                regulator-boot-on;
+            };
+
+            ldo_vmch {
+                regulator-name = "vmch";
+                regulator-min-microvolt = <3000000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <36>;
+                regulator-boot-on;
+            };
+
+            ldo_vemc3v3 {
+                regulator-name = "vemc3v3";
+                regulator-min-microvolt = <3000000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <36>;
+                regulator-boot-on;
+            };
+
+            ldo_vgp1 {
+                regulator-name = "vgp1";
+                regulator-min-microvolt = <1200000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <216>;
+            };
+
+            ldo_vgp2 {
+                regulator-name = "vgp2";
+                regulator-min-microvolt = <1200000>;
+                regulator-max-microvolt = <3000000>;
+                regulator-enable-ramp-delay = <216>;
+            };
+
+            ldo_vgp3 {
+                regulator-name = "vgp3";
+                regulator-min-microvolt = <1200000>;
+                regulator-max-microvolt = <1800000>;
+                regulator-enable-ramp-delay = <216>;
+            };
+
+            ldo_vcn18 {
+                regulator-name = "vcn18";
+                regulator-min-microvolt = <1800000>;
+                regulator-max-microvolt = <1800000>;
+                regulator-enable-ramp-delay = <216>;
+            };
+
+            ldo_vsim1 {
+                regulator-name = "vsim1";
+                regulator-min-microvolt = <1800000>;
+                regulator-max-microvolt = <3000000>;
+                regulator-enable-ramp-delay = <216>;
+            };
+
+            ldo_vsim2 {
+                regulator-name = "vsim2";
+                regulator-min-microvolt = <1800000>;
+                regulator-max-microvolt = <3000000>;
+                regulator-enable-ramp-delay = <216>;
+            };
+
+            ldo_vrtc {
+                regulator-name = "vrtc";
+                regulator-min-microvolt = <2800000>;
+                regulator-max-microvolt = <2800000>;
+                regulator-always-on;
+                regulator-boot-on;
+            };
+
+            ldo_vcamaf {
+                regulator-name = "vcamaf";
+                regulator-min-microvolt = <1200000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <216>;
+            };
+
+            ldo_vibr {
+                regulator-name = "vibr";
+                regulator-min-microvolt = <1200000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <36>;
+            };
+
+            ldo_vrf18 {
+                regulator-name = "vrf18";
+                regulator-min-microvolt = <1825000>;
+                regulator-max-microvolt = <1825000>;
+                regulator-enable-ramp-delay = <187>;
+            };
+
+            ldo_vm {
+                regulator-name = "vm";
+                regulator-min-microvolt = <1200000>;
+                regulator-max-microvolt = <1800000>;
+                regulator-enable-ramp-delay = <216>;
+                regulator-always-on;
+                regulator-boot-on;
+            };
+
+            ldo_vio18 {
+                regulator-name = "vio18";
+                regulator-min-microvolt = <1800000>;
+                regulator-max-microvolt = <1800000>;
+                regulator-enable-ramp-delay = <216>;
+                regulator-always-on;
+                regulator-boot-on;
+            };
+
+           ldo_vcamd {
+                regulator-name = "vcamd";
+                regulator-min-microvolt = <1200000>;
+                regulator-max-microvolt = <1800000>;
+                regulator-enable-ramp-delay = <216>;
+            };
+
+            ldo_vcamio {
+                regulator-name = "vcamio";
+                regulator-min-microvolt = <1800000>;
+                regulator-max-microvolt = <1800000>;
+                regulator-enable-ramp-delay = <216>;
+            };
+        };
+
+        keys {
+            compatible = "mediatek,mt6323-keys";
+            mediatek,long-press-mode = <1>;
+            power-off-time-sec = <0>;
+
+            power {
+                    linux,keycodes = <116>;
+                    wakeup-source;
+            };
+
+            home {
+                    linux,keycodes = <114>;
+            };
+        };
+
+        power-controller {
+            compatible = "mediatek,mt6323-pwrc";
+            #power-domain-cells = <0>;
+        };
+
+        rtc {
+            compatible = "mediatek,mt6323-rtc";
+        };
+    };
+
+  - |
+    #include <dt-bindings/input/input.h>
+    #include <dt-bindings/interrupt-controller/arm-gic.h>
+
+    pmic {
+        compatible = "mediatek,mt6358";
+        interrupt-controller;
+        #interrupt-cells = <2>;
+
+        audio-codec {
+            compatible = "mediatek,mt6358-sound";
+            Avdd-supply = <&mt6358_vaud28_reg>;
+            mediatek,dmic-mode = <0>;
+        };
+
+        regulators {
+            compatible = "mediatek,mt6358-regulator";
+
+            buck_vdram1 {
+                regulator-name = "vdram1";
+                regulator-min-microvolt = <500000>;
+                regulator-max-microvolt = <2087500>;
+                regulator-ramp-delay = <12500>;
+                regulator-enable-ramp-delay = <0>;
+                regulator-always-on;
+                regulator-allowed-modes = <0 1>;
+            };
+
+            buck_vcore {
+                regulator-name = "vcore";
+                regulator-min-microvolt = <500000>;
+                regulator-max-microvolt = <1293750>;
+                regulator-ramp-delay = <6250>;
+                regulator-enable-ramp-delay = <200>;
+                regulator-always-on;
+                regulator-allowed-modes = <0 1>;
+            };
+
+            buck_vpa {
+                regulator-name = "vpa";
+                regulator-min-microvolt = <500000>;
+                regulator-max-microvolt = <3650000>;
+                regulator-ramp-delay = <50000>;
+                regulator-enable-ramp-delay = <250>;
+                regulator-allowed-modes = <0 1>;
+            };
+
+            buck_vproc11 {
+                regulator-name = "vproc11";
+                regulator-min-microvolt = <500000>;
+                regulator-max-microvolt = <1293750>;
+                regulator-ramp-delay = <6250>;
+                regulator-enable-ramp-delay = <200>;
+                regulator-always-on;
+                regulator-allowed-modes = <0 1>;
+            };
+
+            buck_vproc12 {
+                regulator-name = "vproc12";
+                regulator-min-microvolt = <500000>;
+                regulator-max-microvolt = <1293750>;
+                regulator-ramp-delay = <6250>;
+                regulator-enable-ramp-delay = <200>;
+                regulator-always-on;
+                regulator-allowed-modes = <0 1>;
+            };
+
+            buck_vgpu {
+                regulator-name = "vgpu";
+                regulator-min-microvolt = <500000>;
+                regulator-max-microvolt = <1293750>;
+                regulator-ramp-delay = <6250>;
+                regulator-enable-ramp-delay = <200>;
+                regulator-allowed-modes = <0 1>;
+            };
+
+            buck_vs2 {
+                regulator-name = "vs2";
+                regulator-min-microvolt = <500000>;
+                regulator-max-microvolt = <2087500>;
+                regulator-ramp-delay = <12500>;
+                regulator-enable-ramp-delay = <0>;
+                regulator-always-on;
+            };
+
+            buck_vmodem {
+                regulator-name = "vmodem";
+                regulator-min-microvolt = <500000>;
+                regulator-max-microvolt = <1293750>;
+                regulator-ramp-delay = <6250>;
+                regulator-enable-ramp-delay = <900>;
+                regulator-always-on;
+                regulator-allowed-modes = <0 1>;
+            };
+
+            buck_vs1 {
+                regulator-name = "vs1";
+                regulator-min-microvolt = <1000000>;
+                regulator-max-microvolt = <2587500>;
+                regulator-ramp-delay = <12500>;
+                regulator-enable-ramp-delay = <0>;
+                regulator-always-on;
+            };
+
+            ldo_vdram2 {
+                regulator-name = "vdram2";
+                regulator-min-microvolt = <600000>;
+                regulator-max-microvolt = <1800000>;
+                regulator-enable-ramp-delay = <3300>;
+            };
+
+            ldo_vsim1 {
+                regulator-name = "vsim1";
+                regulator-min-microvolt = <1700000>;
+                regulator-max-microvolt = <3100000>;
+                regulator-enable-ramp-delay = <540>;
+            };
+
+            ldo_vibr {
+                regulator-name = "vibr";
+                regulator-min-microvolt = <1200000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <60>;
+            };
+
+            ldo_vrf12 {
+                regulator-name = "vrf12";
+                regulator-min-microvolt = <1200000>;
+                regulator-max-microvolt = <1200000>;
+                regulator-enable-ramp-delay = <120>;
+            };
+
+            ldo_vio18 {
+                regulator-name = "vio18";
+                regulator-min-microvolt = <1800000>;
+                regulator-max-microvolt = <1800000>;
+                regulator-enable-ramp-delay = <2700>;
+                regulator-always-on;
+            };
+
+            ldo_vusb {
+                regulator-name = "vusb";
+                regulator-min-microvolt = <3000000>;
+                regulator-max-microvolt = <3100000>;
+                regulator-enable-ramp-delay = <270>;
+                regulator-always-on;
+            };
+
+            ldo_vcamio {
+                regulator-name = "vcamio";
+                regulator-min-microvolt = <1800000>;
+                regulator-max-microvolt = <1800000>;
+                regulator-enable-ramp-delay = <325>;
+            };
+
+            ldo_vcamd {
+                regulator-name = "vcamd";
+                regulator-min-microvolt = <900000>;
+                regulator-max-microvolt = <1800000>;
+                regulator-enable-ramp-delay = <325>;
+            };
+
+            ldo_vcn18 {
+                regulator-name = "vcn18";
+                regulator-min-microvolt = <1800000>;
+                regulator-max-microvolt = <1800000>;
+                regulator-enable-ramp-delay = <270>;
+            };
+
+            ldo_vfe28 {
+                regulator-name = "vfe28";
+                regulator-min-microvolt = <2800000>;
+                regulator-max-microvolt = <2800000>;
+                regulator-enable-ramp-delay = <270>;
+            };
+
+            ldo_vsram_proc11 {
+                regulator-name = "vsram_proc11";
+                regulator-min-microvolt = <500000>;
+                regulator-max-microvolt = <1293750>;
+                regulator-ramp-delay = <6250>;
+                regulator-enable-ramp-delay = <240>;
+                regulator-always-on;
+            };
+
+            ldo_vcn28 {
+                regulator-name = "vcn28";
+                regulator-min-microvolt = <2800000>;
+                regulator-max-microvolt = <2800000>;
+                regulator-enable-ramp-delay = <270>;
+            };
+
+            ldo_vsram_others {
+                regulator-name = "vsram_others";
+                regulator-min-microvolt = <500000>;
+                regulator-max-microvolt = <1293750>;
+                regulator-ramp-delay = <6250>;
+                regulator-enable-ramp-delay = <240>;
+                regulator-always-on;
+            };
+
+            ldo_vsram_gpu {
+                regulator-name = "vsram_gpu";
+                regulator-min-microvolt = <500000>;
+                regulator-max-microvolt = <1293750>;
+                regulator-ramp-delay = <6250>;
+                regulator-enable-ramp-delay = <240>;
+            };
+
+            ldo_vxo22 {
+                regulator-name = "vxo22";
+                regulator-min-microvolt = <2200000>;
+                regulator-max-microvolt = <2200000>;
+                regulator-enable-ramp-delay = <120>;
+                regulator-always-on;
+            };
+
+            ldo_vefuse {
+                regulator-name = "vefuse";
+                regulator-min-microvolt = <1700000>;
+                regulator-max-microvolt = <1900000>;
+                regulator-enable-ramp-delay = <270>;
+            };
+
+            ldo_vaux18 {
+                regulator-name = "vaux18";
+                regulator-min-microvolt = <1800000>;
+                regulator-max-microvolt = <1800000>;
+                regulator-enable-ramp-delay = <270>;
+            };
+
+            ldo_vmch {
+                regulator-name = "vmch";
+                regulator-min-microvolt = <2900000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <60>;
+            };
+
+            ldo_vbif28 {
+                regulator-name = "vbif28";
+                regulator-min-microvolt = <2800000>;
+                regulator-max-microvolt = <2800000>;
+                regulator-enable-ramp-delay = <270>;
+            };
+
+            ldo_vsram_proc12 {
+                regulator-name = "vsram_proc12";
+                regulator-min-microvolt = <500000>;
+                regulator-max-microvolt = <1293750>;
+                regulator-ramp-delay = <6250>;
+                regulator-enable-ramp-delay = <240>;
+                regulator-always-on;
+            };
+
+            ldo_vcama1 {
+                regulator-name = "vcama1";
+                regulator-min-microvolt = <1800000>;
+                regulator-max-microvolt = <3000000>;
+                regulator-enable-ramp-delay = <325>;
+            };
+
+            ldo_vemc {
+                regulator-name = "vemc";
+                regulator-min-microvolt = <2900000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <60>;
+            };
+
+            ldo_vio28 {
+                regulator-name = "vio28";
+                regulator-min-microvolt = <2800000>;
+                regulator-max-microvolt = <2800000>;
+                regulator-enable-ramp-delay = <270>;
+            };
+
+            ldo_va12 {
+                regulator-name = "va12";
+                regulator-min-microvolt = <1200000>;
+                regulator-max-microvolt = <1200000>;
+                regulator-enable-ramp-delay = <270>;
+                regulator-always-on;
+            };
+
+            ldo_vrf18 {
+                regulator-name = "vrf18";
+                regulator-min-microvolt = <1800000>;
+                regulator-max-microvolt = <1800000>;
+                regulator-enable-ramp-delay = <120>;
+            };
+
+            ldo_vcn33 {
+                regulator-name = "vcn33";
+                regulator-min-microvolt = <3300000>;
+                regulator-max-microvolt = <3500000>;
+                regulator-enable-ramp-delay = <270>;
+            };
+
+            ldo_vcama2 {
+                regulator-name = "vcama2";
+                regulator-min-microvolt = <1800000>;
+                regulator-max-microvolt = <3000000>;
+                regulator-enable-ramp-delay = <325>;
+            };
+
+            ldo_vmc {
+                regulator-name = "vmc";
+                regulator-min-microvolt = <1800000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <60>;
+            };
+
+            ldo_vldo28 {
+                regulator-name = "vldo28";
+                regulator-min-microvolt = <2800000>;
+                regulator-max-microvolt = <3000000>;
+                regulator-enable-ramp-delay = <270>;
+            };
+
+            ldo_vaud28 {
+                regulator-name = "vaud28";
+                regulator-min-microvolt = <2800000>;
+                regulator-max-microvolt = <2800000>;
+                regulator-enable-ramp-delay = <270>;
+            };
+
+            ldo_vsim2 {
+                regulator-name = "vsim2";
+                regulator-min-microvolt = <1700000>;
+                regulator-max-microvolt = <3100000>;
+                regulator-enable-ramp-delay = <540>;
+            };
+        };
+
+        rtc {
+            compatible = "mediatek,mt6358-rtc";
+        };
+
+        keys {
+            compatible = "mediatek,mt6358-keys";
+
+            power {
+                linux,keycodes = <KEY_POWER>;
+                wakeup-source;
+            };
+
+            home {
+                linux,keycodes = <KEY_HOME>;
+            };
+        };
+    };
+
+  - |
+    #include <dt-bindings/interrupt-controller/arm-gic.h>
+
+    pmic {
+        compatible = "mediatek,mt6397";
+
+        interrupt-parent = <&pio>;
+        interrupts-extended = <&pio 222 IRQ_TYPE_LEVEL_HIGH>;
+        interrupt-controller;
+        #interrupt-cells = <2>;
+
+        audio-codec {
+            compatible = "mediatek,mt6397-codec";
+        };
+
+        clocks {
+            compatible = "mediatek,mt6397-clk";
+            #clock-cells = <1>;
+        };
+
+        pinctrl {
+            compatible = "mediatek,mt6397-pinctrl";
+            gpio-controller;
+            #gpio-cells = <2>;
+        };
+
+        regulators {
+            compatible = "mediatek,mt6397-regulator";
+
+            buck_vpca15 {
+                regulator-name = "vpca15";
+                regulator-min-microvolt = < 850000>;
+                regulator-max-microvolt = <1350000>;
+                regulator-ramp-delay = <12500>;
+                regulator-enable-ramp-delay = <200>;
+            };
+
+            buck_vpca7 {
+                regulator-name = "vpca7";
+                regulator-min-microvolt = < 850000>;
+                regulator-max-microvolt = <1350000>;
+                regulator-ramp-delay = <12500>;
+                regulator-enable-ramp-delay = <115>;
+            };
+
+            buck_vsramca15 {
+                regulator-name = "vsramca15";
+                regulator-min-microvolt = < 850000>;
+                regulator-max-microvolt = <1350000>;
+                regulator-ramp-delay = <12500>;
+                regulator-enable-ramp-delay = <115>;
+            };
+
+            buck_vsramca7 {
+                regulator-name = "vsramca7";
+                regulator-min-microvolt = < 850000>;
+                regulator-max-microvolt = <1350000>;
+                regulator-ramp-delay = <12500>;
+                regulator-enable-ramp-delay = <115>;
+            };
+
+            buck_vcore {
+                regulator-name = "vcore";
+                regulator-min-microvolt = < 850000>;
+                regulator-max-microvolt = <1350000>;
+                regulator-ramp-delay = <12500>;
+                regulator-enable-ramp-delay = <115>;
+            };
+
+            buck_vgpu {
+                regulator-name = "vgpu";
+                regulator-min-microvolt = < 700000>;
+                regulator-max-microvolt = <1350000>;
+                regulator-ramp-delay = <12500>;
+                regulator-enable-ramp-delay = <115>;
+            };
+
+            buck_vdrm {
+                regulator-name = "vdrm";
+                regulator-min-microvolt = < 800000>;
+                regulator-max-microvolt = <1400000>;
+                regulator-ramp-delay = <12500>;
+                regulator-enable-ramp-delay = <500>;
+            };
+
+            buck_vio18 {
+                regulator-name = "vio18";
+                regulator-min-microvolt = <1500000>;
+                regulator-max-microvolt = <2120000>;
+                regulator-ramp-delay = <12500>;
+                regulator-enable-ramp-delay = <500>;
+            };
+
+            ldo_vtcxo {
+                regulator-name = "vtcxo";
+                regulator-min-microvolt = <2800000>;
+                regulator-max-microvolt = <2800000>;
+                regulator-enable-ramp-delay = <90>;
+            };
+
+            ldo_va28 {
+                regulator-name = "va28";
+                /* fixed output 2.8 V */
+                regulator-enable-ramp-delay = <218>;
+            };
+
+            ldo_vcama {
+                regulator-name = "vcama";
+                regulator-min-microvolt = <1500000>;
+                regulator-max-microvolt = <2800000>;
+                regulator-enable-ramp-delay = <218>;
+            };
+
+            ldo_vio28 {
+                regulator-name = "vio28";
+                /* fixed output 2.8 V */
+                regulator-enable-ramp-delay = <240>;
+            };
+
+            ldo_vusb {
+                regulator-name = "vusb";
+                /* fixed output 3.3 V */
+                regulator-enable-ramp-delay = <218>;
+            };
+
+            ldo_vmc {
+                regulator-name = "vmc";
+                regulator-min-microvolt = <1800000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <218>;
+            };
+
+            ldo_vmch {
+                regulator-name = "vmch";
+                regulator-min-microvolt = <3000000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <218>;
+            };
+
+            ldo_vemc3v3 {
+                regulator-name = "vemc_3v3";
+                regulator-min-microvolt = <3000000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <218>;
+            };
+
+            ldo_vgp1 {
+                regulator-name = "vcamd";
+                regulator-min-microvolt = <1220000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <240>;
+            };
+
+            ldo_vgp2 {
+                regulator-name = "vcamio";
+                regulator-min-microvolt = <1000000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <218>;
+            };
+
+            ldo_vgp3 {
+                regulator-name = "vcamaf";
+                regulator-min-microvolt = <1200000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <218>;
+            };
+
+            ldo_vgp4 {
+                regulator-name = "vgp4";
+                regulator-min-microvolt = <1200000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <218>;
+            };
+
+            ldo_vgp5 {
+                regulator-name = "vgp5";
+                regulator-min-microvolt = <1200000>;
+                regulator-max-microvolt = <3000000>;
+                regulator-enable-ramp-delay = <218>;
+            };
+
+            ldo_vgp6 {
+                regulator-name = "vgp6";
+                regulator-min-microvolt = <1200000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <218>;
+            };
+
+            ldo_vibr {
+                regulator-name = "vibr";
+                regulator-min-microvolt = <1200000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <218>;
+            };
+        };
+
+        rtc {
+            compatible = "mediatek,mt6397-rtc";
+        };
+    };
diff --git a/Documentation/devicetree/bindings/mfd/mt6397.txt b/Documentation/devicetree/bindings/mfd/mt6397.txt
deleted file mode 100644
index 10540aa..0000000
--- a/Documentation/devicetree/bindings/mfd/mt6397.txt
+++ /dev/null
@@ -1,110 +0,0 @@
-MediaTek MT6397/MT6323 Multifunction Device Driver
-
-MT6397/MT6323 is a multifunction device with the following sub modules:
-- Regulator
-- RTC
-- Audio codec
-- GPIO
-- Clock
-- LED
-- Keys
-- Power controller
-
-It is interfaced to host controller using SPI interface by a proprietary hardware
-called PMIC wrapper or pwrap. MT6397/MT6323 MFD is a child device of pwrap.
-See the following for pwarp node definitions:
-../soc/mediatek/mediatek,pwrap.yaml
-
-This document describes the binding for MFD device and its sub module.
-
-Required properties:
-compatible:
-	"mediatek,mt6323" for PMIC MT6323
-	"mediatek,mt6331" for PMIC MT6331 and MT6332
-	"mediatek,mt6357" for PMIC MT6357
-	"mediatek,mt6358" for PMIC MT6358
-	"mediatek,mt6359" for PMIC MT6359
-	"mediatek,mt6366", "mediatek,mt6358" for PMIC MT6366
-	"mediatek,mt6397" for PMIC MT6397
-
-Optional subnodes:
-
-- rtc
-	Required properties: Should be one of follows
-		- compatible: "mediatek,mt6323-rtc"
-		- compatible: "mediatek,mt6331-rtc"
-		- compatible: "mediatek,mt6358-rtc"
-		- compatible: "mediatek,mt6397-rtc"
-	For details, see ../rtc/rtc-mt6397.txt
-- regulators
-	Required properties:
-		- compatible: "mediatek,mt6323-regulator"
-	see ../regulator/mt6323-regulator.txt
-		- compatible: "mediatek,mt6358-regulator"
-		- compatible: "mediatek,mt6366-regulator", "mediatek-mt6358-regulator"
-	see ../regulator/mt6358-regulator.txt
-		- compatible: "mediatek,mt6397-regulator"
-	see ../regulator/mt6397-regulator.txt
-- codec
-	Required properties:
-		- compatible: "mediatek,mt6397-codec" or "mediatek,mt6358-sound"
-- clk
-	Required properties:
-		- compatible: "mediatek,mt6397-clk"
-- led
-	Required properties:
-		- compatible: "mediatek,mt6323-led"
-	see ../leds/leds-mt6323.txt
-
-- keys
-	Required properties: Should be one of the following
-		- compatible: "mediatek,mt6323-keys"
-		- compatible: "mediatek,mt6331-keys"
-		- compatible: "mediatek,mt6397-keys"
-	see ../input/mtk-pmic-keys.txt
-
-- power-controller
-	Required properties:
-		- compatible: "mediatek,mt6323-pwrc"
-	For details, see ../power/reset/mt6323-poweroff.txt
-
-- pin-controller
-	Required properties:
-		- compatible: "mediatek,mt6397-pinctrl"
-	For details, see ../pinctrl/pinctrl-mt65xx.txt
-
-Example:
-	pwrap: pwrap at 1000f000 {
-		compatible = "mediatek,mt8135-pwrap";
-
-		...
-
-		pmic {
-			compatible = "mediatek,mt6397";
-
-			codec: mt6397codec {
-				compatible = "mediatek,mt6397-codec";
-			};
-
-			regulators {
-				compatible = "mediatek,mt6397-regulator";
-
-				mt6397_vpca15_reg: buck_vpca15 {
-					regulator-compatible = "buck_vpca15";
-					regulator-name = "vpca15";
-					regulator-min-microvolt = <850000>;
-					regulator-max-microvolt = <1400000>;
-					regulator-ramp-delay = <12500>;
-					regulator-always-on;
-				};
-
-				mt6397_vgp4_reg: ldo_vgp4 {
-					regulator-compatible = "ldo_vgp4";
-					regulator-name = "vgp4";
-					regulator-min-microvolt = <1200000>;
-					regulator-max-microvolt = <3300000>;
-					regulator-enable-ramp-delay = <218>;
-				};
-			};
-		};
-	};
diff --git a/Documentation/devicetree/bindings/power/reset/mt6323-poweroff.txt b/Documentation/devicetree/bindings/power/reset/mt6323-poweroff.txt
deleted file mode 100644
index 933f0c4..0000000
--- a/Documentation/devicetree/bindings/power/reset/mt6323-poweroff.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-Device Tree Bindings for Power Controller on MediaTek PMIC
-
-The power controller which could be found on PMIC is responsible for externally
-powering off or on the remote MediaTek SoC through the circuit BBPU.
-
-Required properties:
-- compatible: Should be one of follows
-       "mediatek,mt6323-pwrc": for MT6323 PMIC
-
-Example:
-
-       pmic {
-               compatible = "mediatek,mt6323";
-
-               ...
-
-               power-controller {
-                       compatible = "mediatek,mt6323-pwrc";
-               };
-       }
diff --git a/Documentation/devicetree/bindings/rtc/rtc-mt6397.txt b/Documentation/devicetree/bindings/rtc/rtc-mt6397.txt
deleted file mode 100644
index 7212076..0000000
--- a/Documentation/devicetree/bindings/rtc/rtc-mt6397.txt
+++ /dev/null
@@ -1,31 +0,0 @@
-Device-Tree bindings for MediaTek PMIC based RTC
-
-MediaTek PMIC based RTC is an independent function of MediaTek PMIC that works
-as a type of multi-function device (MFD). The RTC can be configured and set up
-with PMIC wrapper bus which is a common resource shared with the other
-functions found on the same PMIC.
-
-For MediaTek PMIC MFD bindings, see:
-../mfd/mt6397.txt
-
-For MediaTek PMIC wrapper bus bindings, see:
-../soc/mediatek/pwrap.txt
-
-Required properties:
-- compatible: Should be one of follows
-       "mediatek,mt6323-rtc": for MT6323 PMIC
-       "mediatek,mt6358-rtc": for MT6358 PMIC
-       "mediatek,mt6366-rtc", "mediatek,mt6358-rtc": for MT6366 PMIC
-       "mediatek,mt6397-rtc": for MT6397 PMIC
-
-Example:
-
-       pmic {
-               compatible = "mediatek,mt6323";
-
-               ...
-
-               rtc {
-                       compatible = "mediatek,mt6323-rtc";
-               };
-       };
diff --git a/Documentation/devicetree/bindings/sound/mt6358.txt b/Documentation/devicetree/bindings/sound/mt6358.txt
deleted file mode 100644
index fbe9e55..0000000
--- a/Documentation/devicetree/bindings/sound/mt6358.txt
+++ /dev/null
@@ -1,26 +0,0 @@
-Mediatek MT6358 Audio Codec
-
-The communication between MT6358 and SoC is through Mediatek PMIC wrapper.
-For more detail, please visit Mediatek PMIC wrapper documentation.
-
-Must be a child node of PMIC wrapper.
-
-Required properties:
-
-- compatible - "string" - One of:
-    "mediatek,mt6358-sound"
-    "mediatek,mt6366-sound"
-- Avdd-supply : power source of AVDD
-
-Optional properties:
-- mediatek,dmic-mode : Indicates how many data pins are used to transmit two
-	channels of PDM signal. 0 means two wires, 1 means one wire. Default
-	value is 0.
-
-Example:
-
-mt6358_snd {
-	compatible = "mediatek,mt6358-sound";
-	Avdd-supply = <&mt6358_vaud28_reg>;
-	mediatek,dmic-mode = <0>;
-};
diff --git a/MAINTAINERS b/MAINTAINERS
index 52b72d2..b85f433 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -14419,10 +14419,12 @@ F:	Documentation/devicetree/bindings/net/bluetooth/mediatek,mt7921s-bluetooth.ya
 F:	drivers/bluetooth/btmtkuart.c
 
 MEDIATEK BOARD LEVEL SHUTDOWN DRIVERS
+M:	Sen Chu <sen.chu at mediatek.com>
 M:	Sean Wang <sean.wang at mediatek.com>
+M:	Macpaul Lin <macpaul.lin at mediatek.com>
 L:	linux-pm at vger.kernel.org
 S:	Maintained
-F:	Documentation/devicetree/bindings/power/reset/mt6323-poweroff.txt
+F:	Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml
 F:	drivers/power/reset/mt6323-poweroff.c
 
 MEDIATEK CIR DRIVER
@@ -14583,9 +14585,11 @@ F:	Documentation/devicetree/bindings/mtd/mediatek,mtk-nfc.yaml
 F:	drivers/mtd/nand/raw/mtk_*
 
 MEDIATEK PMIC LED DRIVER
+M:	Sen Chu <sen.chu at mediatek.com>
 M:	Sean Wang <sean.wang at mediatek.com>
+M:	Macpaul Lin <macpaul.lin at mediatek.com>
 S:	Maintained
-F:	Documentation/devicetree/bindings/leds/leds-mt6323.txt
+F:	Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml
 F:	drivers/leds/leds-mt6323.c
 
 MEDIATEK RANDOM NUMBER GENERATOR SUPPORT
-- 
2.45.2



From andriy.shevchenko at linux.intel.com  Mon Sep 16 08:22:22 2024
From: andriy.shevchenko at linux.intel.com (Andy Shevchenko)
Date: Mon, 16 Sep 2024 18:22:22 +0300
Subject: [PATCH v7 06/10] i2c: Introduce OF component probe function
In-Reply-To: <CAGXv+5E09LH5UKXh0wHrsqAp-ps8xaGfSZ37GWZ6sbyoaOczfQ@mail.gmail.com>
References: <20240911072751.365361-1-wenst@chromium.org>
 <20240911072751.365361-7-wenst@chromium.org>
 <ZuQTFTNTBLCziD05@smile.fi.intel.com>
 <CAGXv+5HgkCZ=vdHGgvCW1U-nid=cQrVaxC+V+H2Gknf2pnTbYA@mail.gmail.com>
 <ZugKHrzs5BWoDr1c@smile.fi.intel.com>
 <CAGXv+5E09LH5UKXh0wHrsqAp-ps8xaGfSZ37GWZ6sbyoaOczfQ@mail.gmail.com>
Message-ID: <ZuhNLuNvwXWjqRqT@smile.fi.intel.com>

On Mon, Sep 16, 2024 at 04:59:59PM +0200, Chen-Yu Tsai wrote:
> On Mon, Sep 16, 2024 at 12:36?PM Andy Shevchenko
> <andriy.shevchenko at linux.intel.com> wrote:
> > On Sun, Sep 15, 2024 at 12:44:13PM +0200, Chen-Yu Tsai wrote:

...

> > Hmm... I have looked into the implementation and I haven't found the evidence
> > that this is anyhow scoped. Can you point out what I have missed?
> 
> From patch 2:
> 
> +#define for_each_child_of_node_with_prefix(parent, child, prefix)      \
> +       for (struct device_node *child __free(device_node) =            \
> 
>                                  ^^^^^^^^^^^^^^^^^^^^^^^^^ scoped here
> 
> +            of_get_next_child_with_prefix(parent, NULL, prefix);       \
> +            child != NULL;                                             \
> +            child = of_get_next_child_with_prefix(parent, child, prefix))
> +
> 
> "node", or "child" in this snippet is scoped within the for loop.

Ah, nice, that's what I missed, thanks!

-- 
With Best Regards,
Andy Shevchenko




From andriy.shevchenko at linux.intel.com  Mon Sep 16 08:23:56 2024
From: andriy.shevchenko at linux.intel.com (Andy Shevchenko)
Date: Mon, 16 Sep 2024 18:23:56 +0300
Subject: [PATCH v7 09/10] platform/chrome: Introduce device tree hardware
 prober
In-Reply-To: <CAGXv+5HRLHV2tDZxiqFRhz1p+_bhMzMXoJMBnhy-R=8C4hBjnQ@mail.gmail.com>
References: <20240911072751.365361-1-wenst@chromium.org>
 <20240911072751.365361-10-wenst@chromium.org>
 <CAD=FV=WtVSQ5GX6H5CtxNPTdOAJVMj_xNRvG9siZB6_ePZr7CQ@mail.gmail.com>
 <CAGXv+5HRLHV2tDZxiqFRhz1p+_bhMzMXoJMBnhy-R=8C4hBjnQ@mail.gmail.com>
Message-ID: <ZuhNjHwwluF2wfoU@smile.fi.intel.com>

On Mon, Sep 16, 2024 at 04:58:51PM +0200, Chen-Yu Tsai wrote:
> On Sat, Sep 14, 2024 at 1:43?AM Doug Anderson <dianders at chromium.org> wrote:
> > On Wed, Sep 11, 2024 at 12:29?AM Chen-Yu Tsai <wenst at chromium.org> wrote:

...

> > >  obj-$(CONFIG_CHROMEOS_LAPTOP)          += chromeos_laptop.o
> > >  obj-$(CONFIG_CHROMEOS_PRIVACY_SCREEN)  += chromeos_privacy_screen.o
> > >  obj-$(CONFIG_CHROMEOS_PSTORE)          += chromeos_pstore.o
> > > +obj-$(CONFIG_CHROMEOS_OF_HW_PROBER)    += chromeos_of_hw_prober.o
> >
> > "o" sorts before "p" so "of" should sort before "privacy"?
> >
> > I guess it's not exactly all sorted, but this small section is. Since
> > it's arbitrary you could preserve the existing sorting. :-P
> 
> To me it seemed more like they are just sorted in the order they were
> added.

If we can make it more ordered I'm for it.

Just my 2c.

-- 
With Best Regards,
Andy Shevchenko




From alpernebiyasak at gmail.com  Mon Sep 16 09:25:56 2024
From: alpernebiyasak at gmail.com (Alper Nebi Yasak)
Date: Mon, 16 Sep 2024 19:25:56 +0300
Subject: [PATCH v2] drm/mediatek: ovl: Add fmt_support_man for MT8192 and
 MT8195
In-Reply-To: <20240915161245.30296-1-jason-jh.lin@mediatek.com>
References: <20240915161245.30296-1-jason-jh.lin@mediatek.com>
Message-ID: <63ca91a9-f2f4-483e-b7bf-11febcd49f1d@gmail.com>

Hi,

On 2024-09-15 19:12 +03:00, Jason-JH.Lin wrote:
> OVL_CON_CLRFMT_MAN is an configuration for extending color format
> settings of DISP_REG_OVL_CON(n).
> It will change some of the original color format settings.
> 
> Take the settings of (3 << 12) for example.
> - If OVL_CON_CLRFMT_MAN = 0 means OVL_CON_CLRFMT_RGBA8888.
> - If OVL_CON_CLRFMT_MAN = 1 means OVL_CON_CLRFMT_PARGB8888.
> 
> Since OVL_CON_CLRFMT_MAN is not supported on previous SoCs,
> It breaks the OVL color format setting of MT8173.
> So add fmt_support_man to the driver data of MT8192 and MT8195
> to solve the downgrade problem.
> 
> Fixes: a3f7f7ef4bfe ("drm/mediatek: Support "Pre-multiplied" blending in OVL")
> Signed-off-by: Jason-JH.Lin <jason-jh.lin at mediatek.com>
> ---
>  drivers/gpu/drm/mediatek/mtk_disp_ovl.c | 43 ++++++++++++++++++++-----
>  1 file changed, 35 insertions(+), 8 deletions(-)

Tested-by: Alper Nebi Yasak <alpernebiyasak at gmail.com>

Thanks!


From alpernebiyasak at gmail.com  Mon Sep 16 09:29:32 2024
From: alpernebiyasak at gmail.com (Alper Nebi Yasak)
Date: Mon, 16 Sep 2024 19:29:32 +0300
Subject: [PATCH] arm64: dts: mediatek: mt8183-kukui: Disable DPI display interface
Message-ID: <20240916162956.267340-1-alpernebiyasak@gmail.com>

Commit 009d855a26fd ("arm64: dts: mt8183: add dpi node to mt8183") adds
a device-tree node for the DPI display interface that feeds the external
display pipeline, to enable HDMI support on the Pumpkin board.

However, the external display is not fully described on Chrome devices,
blocked by further work on DP / USB-C muxing graph bindings. This
incomplete description currently breaks internal display at least on the
Cozmo board. The same issue was found and fixed on MT8186 devices with
commit 3079fb09ddac ("arm64: dts: mediatek: mt8186-corsola: Disable DPI
display interface"), but the MT8183 change wasn't merged until then.

Disable the external display interface for the Kukui device family until
the necessary work is done, like in the MT8186 Corsola case.

Fixes: 009d855a26fd ("arm64: dts: mt8183: add dpi node to mt8183")
Link: https://lore.kernel.org/linux-mediatek/20240821042836.2631815-1-wenst at chromium.org/
Signed-off-by: Alper Nebi Yasak <alpernebiyasak at gmail.com>
---

 arch/arm64/boot/dts/mediatek/mt8183-kukui.dtsi | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/arch/arm64/boot/dts/mediatek/mt8183-kukui.dtsi b/arch/arm64/boot/dts/mediatek/mt8183-kukui.dtsi
index 22924f61ec9e..07ae3c8e897b 100644
--- a/arch/arm64/boot/dts/mediatek/mt8183-kukui.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8183-kukui.dtsi
@@ -290,6 +290,11 @@ dsi_out: endpoint {
 	};
 };
 
+&dpi0 {
+	/* TODO Re-enable after DP to Type-C port muxing can be described */
+	status = "disabled";
+};
+
 &gic {
 	mediatek,broken-save-restore-fw;
 };

base-commit: 7083504315d64199a329de322fce989e1e10f4f7
-- 
2.45.2



From robh at kernel.org  Mon Sep 16 10:11:07 2024
From: robh at kernel.org (Rob Herring)
Date: Mon, 16 Sep 2024 12:11:07 -0500
Subject: [PATCH] dt-bindings: display: mediatek: dpi: Add power domain
 for MT8195 DP_INTF
In-Reply-To: <20240911071722.558960-1-rohiagar@chromium.org>
References: <20240911071722.558960-1-rohiagar@chromium.org>
Message-ID: <20240916171107.GA605353-robh@kernel.org>

On Wed, Sep 11, 2024 at 07:17:21AM +0000, Rohit Agarwal wrote:
> Add power domain binding for MT8195 DP_INTF that resolves the following
> error and many more similar ones:
> 
> arch/arm64/boot/dts/mediatek/mt8195-cherry-dojo-r1.dtb: dp-intf at 1c113000:
> power-domains: False schema does not allow [[55, 18]]
> 
> Reported-by: kernel test robot <lkp at intel.com>
> Closes: https://lore.kernel.org/oe-kbuild-all/202409102119.AYvaTjUi-lkp at intel.com/

Fixes?

> Signed-off-by: Rohit Agarwal <rohiagar at chromium.org>
> ---
>  .../devicetree/bindings/display/mediatek/mediatek,dpi.yaml       | 1 +
>  1 file changed, 1 insertion(+)
> 
> diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml b/Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml
> index 3a82aec9021c..07acc8a76bfc 100644
> --- a/Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml
> +++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml
> @@ -89,6 +89,7 @@ allOf:
>                  - mediatek,mt6795-dpi
>                  - mediatek,mt8173-dpi
>                  - mediatek,mt8186-dpi
> +                - mediatek,mt8195-dp-intf

mt8183 is also missing. There's a patch[1] to fix it, but it's wrong 
given the recent changes. It would be best to fix both in one 
patch/series as 2 separate patches will have conflicts.

Rob


[1] https://lore.kernel.org/all/20240912144430.3161717-2-treapking at chromium.org/


From robh at kernel.org  Mon Sep 16 10:19:59 2024
From: robh at kernel.org (Rob Herring (Arm))
Date: Mon, 16 Sep 2024 12:19:59 -0500
Subject: [PATCH v8 0/2] arm64: dts: mediatek: Add MT8186 Ponyta
In-Reply-To: <20240914063122.1622196-1-cengjianeng@huaqin.corp-partner.google.com>
References: <20240914063122.1622196-1-cengjianeng@huaqin.corp-partner.google.com>
Message-ID: <172650686036.806282.435049873625711480.robh@kernel.org>


On Sat, 14 Sep 2024 14:31:20 +0800, Jianeng Ceng wrote:
> This is v8 of the MT8186 Chromebook device tree series.
> ---
> Changes in v8:
> - PATCH 1/2: Remove custom label.
> - PATCH 2/2: Change the commit about ponyta.
> - Link to v7:https://lore.kernel.org/all/20240913031505.372868-1-cengjianeng at huaqin.corp-partner.google.com/
> 
> Changes in v7:
> - PATCH 2/2: Remove prototype sku.
> - PATCH 2/2: Disable the other trackpad to enable one of them.
> - Link to v5:https://lore.kernel.org/all/20240913015503.4192806-1-cengjianeng at huaqin.corp-partner.google.com/
> 
> Changes in v6:
> - No change.
> 
> Changes in v5:
> - PATCH 1/2: Remove sku2147483647.
> - PATCH 2/2: Remove sku2147483647.
> - Link to v4:https://lore.kernel.org/all/20240906085739.1322676-1-cengjianeng at huaqin.corp-partner.google.com/
> 
> Changes in v4:
> - PATCH 1/2: Add more info for Ponyta custom label in commit.
> - Link to v3:https://lore.kernel.org/all/20240904081501.2060933-1-cengjianeng at huaqin.corp-partner.google.com/
> 
> Changes in v3:
> - PATCH 0/2: Add the modify records.
> - PATCH 1/2: Modify lable to label.
> - Link to v2:https://lore.kernel.org/all/20240903061603.3007289-1-cengjianeng at huaqin.corp-partner.google.com/
> 
> Changes in v2:
> - PATCH 2/2: Modify the dtb name without rev2.
> - Link to v1:https://lore.kernel.org/all/20240902125502.1844374-1-cengjianeng at huaqin.corp-partner.google.com/
> 
> Jianeng Ceng (2):
>   dt-bindings: arm: mediatek: Add MT8186 Ponyta Chromebook
>   arm64: dts: mediatek: Add MT8186 Ponyta Chromebooks
> 
>  .../devicetree/bindings/arm/mediatek.yaml     | 10 +++++
>  arch/arm64/boot/dts/mediatek/Makefile         |  2 +
>  .../mediatek/mt8186-corsola-ponyta-sku0.dts   | 18 ++++++++
>  .../mediatek/mt8186-corsola-ponyta-sku1.dts   | 22 ++++++++++
>  .../dts/mediatek/mt8186-corsola-ponyta.dtsi   | 44 +++++++++++++++++++
>  5 files changed, 96 insertions(+)
>  create mode 100644 arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku0.dts
>  create mode 100644 arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku1.dts
>  create mode 100644 arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta.dtsi
> 
> --
> 2.34.1
> 
> 
> 


My bot found new DTB warnings on the .dts files added or changed in this
series.

Some warnings may be from an existing SoC .dtsi. Or perhaps the warnings
are fixed by another series. Ultimately, it is up to the platform
maintainer whether these warnings are acceptable or not. No need to reply
unless the platform maintainer has comments.

If you already ran DT checks and didn't see these error(s), then
make sure dt-schema is up to date:

  pip3 install dtschema --upgrade


New warnings running 'make CHECK_DTBS=y mediatek/mt8186-corsola-ponyta-sku0.dtb mediatek/mt8186-corsola-ponyta-sku1.dtb' for 20240914063122.1622196-1-cengjianeng at huaqin.corp-partner.google.com:

arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku0.dtb: /soc/pwrap at 1000d000/pmic: failed to match any schema with compatible: ['mediatek,mt6366', 'mediatek,mt6358']
arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku0.dtb: /soc/pwrap at 1000d000/pmic: failed to match any schema with compatible: ['mediatek,mt6366', 'mediatek,mt6358']
arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku0.dtb: /soc/pwrap at 1000d000/pmic/codec: failed to match any schema with compatible: ['mediatek,mt6366-sound', 'mediatek,mt6358-sound']
arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku0.dtb: /soc/pwrap at 1000d000/pmic/codec: failed to match any schema with compatible: ['mediatek,mt6366-sound', 'mediatek,mt6358-sound']
arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku1.dtb: /soc/pwrap at 1000d000/pmic: failed to match any schema with compatible: ['mediatek,mt6366', 'mediatek,mt6358']
arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku1.dtb: /soc/pwrap at 1000d000/pmic: failed to match any schema with compatible: ['mediatek,mt6366', 'mediatek,mt6358']
arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku1.dtb: /soc/pwrap at 1000d000/pmic/codec: failed to match any schema with compatible: ['mediatek,mt6366-sound', 'mediatek,mt6358-sound']
arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku1.dtb: /soc/pwrap at 1000d000/pmic/codec: failed to match any schema with compatible: ['mediatek,mt6366-sound', 'mediatek,mt6358-sound']
arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku0.dtb: /soc/pwrap at 1000d000/pmic/rtc: failed to match any schema with compatible: ['mediatek,mt6366-rtc', 'mediatek,mt6358-rtc']
arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku0.dtb: /soc/pwrap at 1000d000/pmic/rtc: failed to match any schema with compatible: ['mediatek,mt6366-rtc', 'mediatek,mt6358-rtc']
arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku1.dtb: /soc/pwrap at 1000d000/pmic/rtc: failed to match any schema with compatible: ['mediatek,mt6366-rtc', 'mediatek,mt6358-rtc']
arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku1.dtb: /soc/pwrap at 1000d000/pmic/rtc: failed to match any schema with compatible: ['mediatek,mt6366-rtc', 'mediatek,mt6358-rtc']
arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku0.dtb: dp-bridge at 5c: 'extcon' is a required property
	from schema $id: http://devicetree.org/schemas/display/bridge/ite,it6505.yaml#
arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku1.dtb: dp-bridge at 5c: 'extcon' is a required property
	from schema $id: http://devicetree.org/schemas/display/bridge/ite,it6505.yaml#
arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku0.dtb: sound: 'model' is a required property
	from schema $id: http://devicetree.org/schemas/sound/mt8186-mt6366-rt1019-rt5682s.yaml#
arch/arm64/boot/dts/mediatek/mt8186-corsola-ponyta-sku1.dtb: sound: 'model' is a required property
	from schema $id: http://devicetree.org/schemas/sound/mt8186-mt6366-rt1019-rt5682s.yaml#







From alpernebiyasak at gmail.com  Mon Sep 16 12:33:08 2024
From: alpernebiyasak at gmail.com (Alper Nebi Yasak)
Date: Mon, 16 Sep 2024 22:33:08 +0300
Subject: BUG and WARNINGs from mt7921s on next-20240916
Message-ID: <144fbf79-950c-4cd1-bc68-4e00b47b03e9@gmail.com>

Hi,

I ran into some bug messages while testing linux-next on a MT8186
Magneton Chromebook (mt8186-corsola-magneton-sku393218). It boots 
to the OS, but at least Wi-Fi and Bluetooth are unavailable.

As a start, I tried reverting commit abbd838c579e ("Merge tag 
'mt76-for-kvalo-2024-09-06' of https://github.com/nbd168/wireless")
and it works fine after that. Didn't have time to do a full bisect, 
but will try if nobody has any immediate opinions.

There are a few traces, here's some select lines to catch your attention,
not sure how informational they are:

[   16.040525] kernel BUG at net/core/skbuff.c:2268!
[   16.040531] Internal error: Oops - BUG: 00000000f2000800 [#1] SMP
[   16.040803] CPU: 3 UID: 0 PID: 526 Comm: mt76-sdio-txrx  Not tainted 6.11.0-next-20240916-deb-00002-g7b544e01c649 #1
[   16.040897] Call trace:
[   16.040899]  pskb_expand_head+0x2b0/0x3c0
[   16.040905]  mt76s_tx_run_queue+0x274/0x410 [mt76_sdio]
[   16.040909]  mt76s_txrx_worker+0xe4/0xac8 [mt76_sdio]
[   16.040914]  mt7921s_txrx_worker+0x98/0x1e0 [mt7921s]
[   16.040924]  __mt76_worker_fn+0x80/0x128 [mt76]
[   16.040934]  kthread+0xe8/0xf8
[   16.040940]  ret_from_fork+0x10/0x20

[   16.046045] note: mt76-sdio-txrx [526] exited with irqs disabled

[   16.805325] WARNING: CPU: 3 PID: 0 at kernel/context_tracking.c:128 ct_kernel_exit.isra.0+0xa0/0xa8
[   16.805630] Tainted: [D]=DIE

[   19.050110] mt7921s mmc1:0001:1: Message 00000010 (seq 1) timeout
[   19.062383] mt7921s mmc1:0001:1: Failed to get patch semaphore

[   24.171397] WARNING: CPU: 7 PID: 54 at kernel/kthread.c:76 kthread_park+0x8c/0xe0
[   24.623719] Tainted: [D]=DIE, [W]=WARN
[   24.641302] Workqueue: events mt7921_init_work [mt7921_common]
[   24.834560] Call trace:
[   24.839437]  kthread_park+0x8c/0xe0
[   24.846405]  mt7921s_init_reset+0x8c/0x248 [mt7921s]
[   24.856329]  mt7921_init_work+0xcc/0x228 [mt7921_common]
[   24.866950]  process_one_work+0x178/0x3d0
[   24.874962]  worker_thread+0x200/0x3f0
[   24.882452]  kthread+0xe8/0xf8
[   24.888550]  ret_from_fork+0x10/0x20

[   24.904974] Unable to handle kernel NULL pointer dereference at virtual address 0000000000000000
[   25.032335] Internal error: Oops: 0000000096000004 [#2] SMP

I'm pasting the full log below with some more data. (Though I get 
duplicate output from serial console, and had to sort -n | uniq, 
hoping it didn't mess up anything).

------ 8< ------

[    0.000000] Booting Linux on physical CPU 0x0000000000 [0x411fd050]
[    0.000000] Linux version 6.11.0-next-20240916-deb-00002-g7b544e01c649 (alpernebbi at ALPER-PC) (aarch64-linux-gnu-gcc (Debian 14.2.0-1) 14.2.0, GNU ld (GNU Binutils for Debian) 2.43.1) #1 SMP Mon Sep 16 17:42:49 +03 2024
[    0.000000] KASLR enabled
[    0.000000] random: crng init done
[    0.000000] Machine model: Google Magneton board
[    0.000000] printk: debug: skip boot console de-registration.
[    0.000000] efi: UEFI not found.
[    0.000000] Reserved memory: created DMA memory pool at 0x0000000050000000, size 16 MiB
[    0.000000] OF: reserved mem: initialized node memory at 50000000, compatible id shared-dma-pool
[    0.000000] OF: reserved mem: 0x0000000050000000..0x000000005109ffff (17024 KiB) nomap non-reusable memory at 50000000
[    0.000000] Reserved memory: created DMA memory pool at 0x0000000060000000, size 16 MiB
[    0.000000] OF: reserved mem: initialized node memory at 60000000, compatible id shared-dma-pool
[    0.000000] OF: reserved mem: 0x0000000060000000..0x0000000060ffffff (16384 KiB) nomap non-reusable memory at 60000000
[    0.000000] Reserved memory: created DMA memory pool at 0x0000000061000000, size 1 MiB
[    0.000000] OF: reserved mem: initialized node memory at 61000000, compatible id shared-dma-pool
[    0.000000] OF: reserved mem: 0x0000000061000000..0x00000000610fffff (1024 KiB) nomap non-reusable memory at 61000000
[    0.000000] OF: reserved mem: 0x00000000ffec5000..0x00000000fffc4fff (1024 KiB) map non-reusable ramoops
[    0.000000] earlycon: mtk8250 at MMIO32 0x0000000011002000 (options '115200n8')
[    0.000000] printk: legacy bootconsole [mtk8250] enabled
[    0.000000] NUMA: Faking a node at [mem 0x0000000040000000-0x000000013fffffff]
[    0.000000] NODE_DATA(0) allocated [mem 0x13f7a8ec0-0x13f7abc7f]
[    0.000000] Zone ranges:
[    0.000000]   DMA      [mem 0x0000000040000000-0x00000000ffffffff]
[    0.000000]   DMA32    empty
[    0.000000]   Normal   [mem 0x0000000100000000-0x000000013fffffff]
[    0.000000] Movable zone start for each node
[    0.000000] Early memory node ranges
[    0.000000]   node   0: [mem 0x0000000040000000-0x000000004fffffff]
[    0.000000]   node   0: [mem 0x0000000050000000-0x000000005109ffff]
[    0.000000]   node   0: [mem 0x00000000510a0000-0x00000000545fffff]
[    0.000000]   node   0: [mem 0x0000000054700000-0x000000005fffffff]
[    0.000000]   node   0: [mem 0x0000000060000000-0x00000000610fffff]
[    0.000000]   node   0: [mem 0x0000000061100000-0x0000000069ffffff]
[    0.000000]   node   0: [mem 0x000000006a100000-0x00000000ffdfffff]
[    0.000000]   node   0: [mem 0x0000000100000000-0x000000013fffffff]
[    0.000000] Initmem setup node 0 [mem 0x0000000040000000-0x000000013fffffff]
[    0.000000] On node 0, zone DMA: 256 pages in unavailable ranges
[    0.000000] On node 0, zone DMA: 256 pages in unavailable ranges
[    0.000000] On node 0, zone Normal: 512 pages in unavailable ranges
[    0.000000] cma: Reserved 64 MiB at 0x00000000fbe00000 on node -1
[    0.000000] psci: probing for conduit method from DT.
[    0.000000] psci: PSCIv1.1 detected in firmware.
[    0.000000] psci: Using standard PSCI v0.2 function IDs
[    0.000000] psci: MIGRATE_INFO_TYPE not supported.
[    0.000000] psci: SMC Calling Convention v1.2
[    0.000000] percpu: Embedded 34 pages/cpu s100568 r8192 d30504 u139264
[    0.000000] Detected VIPT I-cache on CPU0
[    0.000000] CPU features: detected: GIC system register CPU interface
[    0.000000] CPU features: detected: Virtualization Host Extensions
[    0.000000] CPU features: kernel page table isolation forced ON by KASLR
[    0.000000] CPU features: detected: Kernel page table isolation (KPTI)
[    0.000000] CPU features: detected: ARM errata 1165522, 1319367, or 1530923
[    0.000000] alternatives: applying boot alternatives
[    0.000000] Kernel command line: cros_secure kern_guid=882c31a2-0695-4426-94bd-abb0f691866e earlycon keep_bootcon splash plymouth.ignore-serial-consoles ipv6.disable=1 root=UUID=c16826e5-0b66-4648-87db-8a2601010f0a
[    0.000000] Unknown kernel command line parameters "cros_secure splash kern_guid=882c31a2-0695-4426-94bd-abb0f691866e", will be passed to user space.
[    0.000000] Dentry cache hash table entries: 524288 (order: 10, 4194304 bytes, linear)
[    0.000000] Inode-cache hash table entries: 262144 (order: 9, 2097152 bytes, linear)
[    0.000000] Fallback order for Node 0: 0
[    0.000000] Built 1 zonelists, mobility grouping on.  Total pages: 1047552
[    0.000000] Policy zone: Normal
[    0.000000] mem auto-init: stack:all(zero), heap alloc:on, heap free:off
[    0.000000] software IO TLB: area num 8.
[    0.000000] software IO TLB: mapped [mem 0x00000000f7e00000-0x00000000fbe00000] (64MB)
[    0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=8, Nodes=1
[    0.000000] ftrace: allocating 49524 entries in 194 pages
[    0.000000] ftrace: allocated 194 pages with 3 groups
[    0.000000] trace event string verifier disabled
[    0.000000] rcu: Hierarchical RCU implementation.
[    0.000000] rcu:     RCU restricting CPUs from NR_CPUS=512 to nr_cpu_ids=8.
[    0.000000]  Rude variant of Tasks RCU enabled.
[    0.000000]  Tracing variant of Tasks RCU enabled.
[    0.000000] rcu: RCU calculated value of scheduler-enlistment delay is 25 jiffies.
[    0.000000] rcu: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=8
[    0.000000] RCU Tasks Rude: Setting shift to 3 and lim to 1 rcu_task_cb_adjust=1 rcu_task_cpu_ids=8.
[    0.000000] RCU Tasks Trace: Setting shift to 3 and lim to 1 rcu_task_cb_adjust=1 rcu_task_cpu_ids=8.
[    0.000000] NR_IRQS: 64, nr_irqs: 64, preallocated irqs: 0
[    0.000000] GICv3: GIC: Using split EOI/Deactivate mode
[    0.000000] GICv3: 480 SPIs implemented
[    0.000000] GICv3: 0 Extended SPIs implemented
[    0.000000] Root IRQ handler: gic_handle_irq
[    0.000000] GICv3: GICv3 features: 16 PPIs
[    0.000000] GICv3: GICD_CTRL.DS=0, SCR_EL3.FIQ=0
[    0.000000] GICv3: CPU0: found redistributor 0 region 0:0x000000000c040000
[    0.000000] GICv3: GIC: PPI partition interrupt-partition-0[0] { /cpus/cpu at 0[0] /cpus/cpu at 100[1] /cpus/cpu at 200[2] /cpus/cpu at 300[3] /cpus/cpu at 400[4] /cpus/cpu at 500[5] }
[    0.000000] GICv3: GIC: PPI partition interrupt-partition-1[1] { /cpus/cpu at 600[6] /cpus/cpu at 700[7] }
[    0.000000] rcu: srcu_init: Setting srcu_struct sizes based on contention.
[    0.000000] arch_timer: cp15 timer(s) running at 13.00MHz (phys).
[    0.000000] clocksource: arch_sys_counter: mask: 0xffffffffffffff max_cycles: 0x2ff89eacb, max_idle_ns: 440795202429 ns
[    0.000000] sched_clock: 56 bits at 13MHz, resolution 76ns, wraps every 4398046511101ns
[    0.008965] Console: colour dummy device 80x25
[    0.013443] printk: legacy console [tty0] enabled
[    0.018257] Calibrating delay loop (skipped), value calculated using timer frequency.. 26.00 BogoMIPS (lpj=52000)
[    0.028601] pid_max: default: 32768 minimum: 301
[    0.033338] LSM: initializing lsm=lockdown,capability,landlock,yama,apparmor,tomoyo,bpf,ima,evm
[    0.042220] landlock: Up and running.
[    0.045902] Yama: becoming mindful.
[    0.049564] AppArmor: AppArmor initialized
[    0.053734] TOMOYO Linux initialized
[    0.057678] LSM support for eBPF active
[    0.061659] Mount-cache hash table entries: 8192 (order: 4, 65536 bytes, linear)
[    0.069119] Mountpoint-cache hash table entries: 8192 (order: 4, 65536 bytes, linear)
[    0.077902] psi: inconsistent task state! task=2:kthreadd cpu=0 psi_flags=4 clear=0 set=4
[    0.101305] rcu: Hierarchical SRCU implementation.
[    0.106134] rcu:     Max phase no-delay instances is 1000.
[    0.111537] Timer migration: 1 hierarchy levels; 8 children per group; 1 crossnode level
[    0.121373] EFI services will not be available.
[    0.126188] smp: Bringing up secondary CPUs ...
[    0.142890] Detected VIPT I-cache on CPU1
[    0.142948] GICv3: CPU1: found redistributor 100 region 0:0x000000000c060000
[    0.142981] CPU1: Booted secondary processor 0x0000000100 [0x411fd050]
[    0.158933] Detected VIPT I-cache on CPU2
[    0.158971] GICv3: CPU2: found redistributor 200 region 0:0x000000000c080000
[    0.158990] CPU2: Booted secondary processor 0x0000000200 [0x411fd050]
[    0.174900] Detected VIPT I-cache on CPU3
[    0.174934] GICv3: CPU3: found redistributor 300 region 0:0x000000000c0a0000
[    0.174949] CPU3: Booted secondary processor 0x0000000300 [0x411fd050]
[    0.186930] Detected VIPT I-cache on CPU4
[    0.186965] GICv3: CPU4: found redistributor 400 region 0:0x000000000c0c0000
[    0.186980] CPU4: Booted secondary processor 0x0000000400 [0x411fd050]
[    0.202962] Detected VIPT I-cache on CPU5
[    0.202997] GICv3: CPU5: found redistributor 500 region 0:0x000000000c0e0000
[    0.203013] CPU5: Booted secondary processor 0x0000000500 [0x411fd050]
[    0.215071] CPU features: detected: Spectre-v4
[    0.215076] CPU features: detected: Spectre-BHB
[    0.215078] CPU features: detected: ARM erratum 1418040
[    0.215080] CPU features: detected: ARM erratum 1463225
[    0.215083] CPU features: detected: SSBS not fully self-synchronizing
[    0.215086] Detected PIPT I-cache on CPU6
[    0.215122] GICv3: CPU6: found redistributor 600 region 0:0x000000000c100000
[    0.215129] arch_timer: Enabling local workaround for ARM erratum 1418040
[    0.215138] CPU6: Booted secondary processor 0x0000000600 [0x413fd0b0]
[    0.227031] Detected PIPT I-cache on CPU7
[    0.227072] GICv3: CPU7: found redistributor 700 region 0:0x000000000c120000
[    0.227079] arch_timer: Enabling local workaround for ARM erratum 1418040
[    0.227089] CPU7: Booted secondary processor 0x0000000700 [0x413fd0b0]
[    0.227165] smp: Brought up 1 node, 8 CPUs
[    0.394862] SMP: Total of 8 processors activated.
[    0.399598] CPU: All CPU(s) started at EL2
[    0.403721] CPU features: detected: 32-bit EL0 Support
[    0.408894] CPU features: detected: Data cache clean to the PoU not required for I/D coherence
[    0.417569] CPU features: detected: Common not Private translations
[    0.423880] CPU features: detected: CRC32 instructions
[    0.429053] CPU features: detected: Data cache clean to Point of Persistence
[    0.436154] CPU features: detected: RCpc load-acquire (LDAPR)
[    0.441939] CPU features: detected: LSE atomic instructions
[    0.447549] CPU features: detected: Privileged Access Never
[    0.453159] CPU features: detected: RAS Extension Support
[    0.458596] CPU features: detected: Speculative Store Bypassing Safe (SSBS)
[    0.465651] alternatives: applying system-wide alternatives
[    0.474307] CPU features: detected: Hardware dirty bit management on CPU6-7
[    0.483969] node 0 deferred pages initialised in 0ms
[    0.489026] Memory: 3885480K/4190208K available (15232K kernel code, 3446K rwdata, 6172K rodata, 2752K init, 828K bss, 233796K reserved, 65536K cma-reserved)
[    0.503982] devtmpfs: initialized
[    0.512758] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 7645041785100000 ns
[    0.522597] futex hash table entries: 2048 (order: 5, 131072 bytes, linear)
[    0.530137] 2G module region forced by RANDOMIZE_MODULE_REGION_FULL
[    0.536454] 0 pages in range for non-PLT usage
[    0.536456] 517120 pages in range for PLT usage
[    0.541048] pinctrl core: initialized pinctrl subsystem
[    0.551959] DMI not present or invalid.
[    0.557522] NET: Registered PF_NETLINK/PF_ROUTE protocol family
[    0.564171] DMA: preallocated 512 KiB GFP_KERNEL pool for atomic allocations
[    0.571392] DMA: preallocated 512 KiB GFP_KERNEL|GFP_DMA pool for atomic allocations
[    0.579376] DMA: preallocated 512 KiB GFP_KERNEL|GFP_DMA32 pool for atomic allocations
[    0.587374] audit: initializing netlink subsys (disabled)
[    0.592918] audit: type=2000 audit(0.456:1): state=initialized audit_enabled=0 res=1
[    0.593759] thermal_sys: Registered thermal governor 'fair_share'
[    0.600728] thermal_sys: Registered thermal governor 'bang_bang'
[    0.606868] thermal_sys: Registered thermal governor 'step_wise'
[    0.612915] thermal_sys: Registered thermal governor 'user_space'
[    0.618962] thermal_sys: Registered thermal governor 'power_allocator'
[    0.625120] cpuidle: using governor ladder
[    0.635828] cpuidle: using governor menu
[    0.639853] hw-breakpoint: found 6 breakpoint and 4 watchpoint registers.
[    0.646795] ASID allocator initialised with 32768 entries
[    0.652534] Serial: AMBA PL011 UART driver
[    0.669191] platform 14013000.dsi: Fixed dependency cycle(s) with /soc/i2c at 11007000/anx7625 at 58
[    0.683157] HugeTLB: registered 1.00 GiB page size, pre-allocated 0 pages
[    0.690008] HugeTLB: 0 KiB vmemmap can be freed for a 1.00 GiB page
[    0.696320] HugeTLB: registered 32.0 MiB page size, pre-allocated 0 pages
[    0.703155] HugeTLB: 0 KiB vmemmap can be freed for a 32.0 MiB page
[    0.709465] HugeTLB: registered 2.00 MiB page size, pre-allocated 0 pages
[    0.716300] HugeTLB: 0 KiB vmemmap can be freed for a 2.00 MiB page
[    0.722610] HugeTLB: registered 64.0 KiB page size, pre-allocated 0 pages
[    0.729444] HugeTLB: 0 KiB vmemmap can be freed for a 64.0 KiB page
[    0.736952] ACPI: Interpreter disabled.
[    0.741402] iommu: Default domain type: Translated
[    0.746234] iommu: DMA domain TLB invalidation policy: strict mode
[    0.752768] pps_core: LinuxPPS API ver. 1 registered
[    0.757772] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <giometti at linux.it>
[    0.766979] PTP clock support registered
[    0.770935] EDAC MC: Ver: 3.0.0
[    0.774223] scmi_core: SCMI protocol bus registered
[    0.779959] NetLabel: Initializing
[    0.783386] NetLabel:  domain hash size = 128
[    0.787769] NetLabel:  protocols = UNLABELED CIPSOv4 CALIPSO
[    0.793494] NetLabel:  unlabeled traffic allowed by default
[    0.799193] vgaarb: loaded
[    0.802085] clocksource: Switched to clocksource arch_sys_counter
[    0.808449] VFS: Disk quotas dquot_6.6.0
[    0.812426] VFS: Dquot-cache hash table entries: 512 (order 0, 4096 bytes)
[    0.819644] AppArmor: AppArmor Filesystem Enabled
[    0.824418] pnp: PnP ACPI: disabled
[    0.831557] NET: Registered PF_INET protocol family
[    0.836577] IP idents hash table entries: 65536 (order: 7, 524288 bytes, linear)
[    0.845917] tcp_listen_portaddr_hash hash table entries: 2048 (order: 3, 32768 bytes, linear)
[    0.854563] Table-perturb hash table entries: 65536 (order: 6, 262144 bytes, linear)
[    0.862445] TCP established hash table entries: 32768 (order: 6, 262144 bytes, linear)
[    0.870701] TCP bind hash table entries: 32768 (order: 8, 1048576 bytes, linear)
[    0.878864] TCP: Hash tables configured (established 32768 bind 32768)
[    0.885579] MPTCP token hash table entries: 4096 (order: 4, 98304 bytes, linear)
[    0.893082] UDP hash table entries: 2048 (order: 4, 65536 bytes, linear)
[    0.899906] UDP-Lite hash table entries: 2048 (order: 4, 65536 bytes, linear)
[    0.907234] NET: Registered PF_UNIX/PF_LOCAL protocol family
[    0.912951] NET: Registered PF_XDP protocol family
[    0.917781] PCI: CLS 0 bytes, default 64
[    0.921833] Trying to unpack rootfs image as initramfs...
[    0.928838] kvm [1]: nv: 554 coarse grained trap handlers
[    0.934554] kvm [1]: IPA Size Limit: 40 bits
[    0.938885] kvm [1]: GICv3: no GICV resource entry
[    0.943713] kvm [1]: disabling GICv2 emulation
[    0.948200] kvm [1]: GIC system register CPU interface enabled
[    0.954090] kvm [1]: vgic interrupt IRQ18
[    0.958142] kvm [1]: VHE mode initialized successfully
[    0.964122] Initialise system trusted keyrings
[    0.968623] Key type blacklist registered
[    0.972741] workingset: timestamp_bits=42 max_order=20 bucket_order=0
[    0.979253] zbud: loaded
[    0.981973] fuse: init (API version 7.41)
[    0.986202] integrity: Platform Keyring initialized
[    0.991123] integrity: Machine keyring initialized
[    0.995953] Key type asymmetric registered
[    1.000075] Asymmetric key parser 'x509' registered
[    5.868941] Freeing initrd memory: 22892K
[    5.886908] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 246)
[    5.894458] io scheduler mq-deadline registered
[    5.906144] ledtrig-cpu: registered to indicate activity on CPUs
[    5.912257] shpchp: Standard Hot Plug PCI Controller Driver version: 0.4
[    5.926713] Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled
[    5.934445] Serial: AMBA driver
[    5.937939] msm_serial: driver initialized
[    5.942129] SuperH (H)SCI(F) driver initialized
[    5.948887] mousedev: PS/2 mouse device common for all mice
[    5.957484] SMCCC: SOC_ID: ID = jep106:0426:8186 Revision = 0x00000000
[    5.965218] hw perfevents: enabled with armv8_cortex_a55 PMU driver, 7 (0,8000003f) counters available
[    5.975405] hw perfevents: enabled with armv8_cortex_a76 PMU driver, 7 (0,8000003f) counters available
[    5.986187] IPv6: Loaded, but administratively disabled, reboot required to enable
[    5.993823] mip6: Mobile IPv6
[    5.996810] mip6: mip6_init: can't add xfrm type(destopt)
[    6.002257] NET: Registered PF_PACKET protocol family
[    6.007546] mpls_gso: MPLS GSO support
[    6.014053] registered taskstats version 1
[    6.018316] Loading compiled-in X.509 certificates
[    6.062196] Loaded X.509 cert 'Build time autogenerated kernel key: 8dc7145aaa7e9aab3b86e5537f1c2bfa59509cbe'
[    6.076029] Demotion targets for Node 0: null
[    6.080663] Key type .fscrypt registered
[    6.084615] Key type fscrypt-provisioning registered
[    6.144310] Key type encrypted registered
[    6.148368] AppArmor: AppArmor sha256 policy hashing enabled
[    6.154093] ima: No TPM chip found, activating TPM-bypass!
[    6.159618] ima: Allocated hash algorithm: sha256
[    6.164369] ima: No architecture policies found
[    6.168957] evm: Initialising EVM extended attributes:
[    6.174129] evm: security.selinux
[    6.177460] evm: security.SMACK64 (disabled)
[    6.181755] evm: security.SMACK64EXEC (disabled)
[    6.186401] evm: security.SMACK64TRANSMUTE (disabled)
[    6.191484] evm: security.SMACK64MMAP (disabled)
[    6.196130] evm: security.apparmor
[    6.199550] evm: security.ima
[    6.202532] evm: security.capability
[    6.206127] evm: HMAC attrs: 0x1
[    6.212930] clk: Disabling unused clocks
[    6.216900] PM: genpd: Disabling unused power domains
[    6.224857] Freeing unused kernel memory: 2752K
[    6.250486] Checked W+X mappings: passed, no W+X pages found
[    6.256198] Run /init as init process
[    6.597646] cannot find "mediatek,mt8186-fhctl"
[    6.641486] mediatek-mipi-tx 11cc0000.dsi-phy: can't get nvmem_cell_get, ignore it
[    6.655464] mtk-spi-nor 11000000.spi: spi frequency: 39000000 Hz
[    6.700074] 11002000.serial: ttyS0 at MMIO 0x11002000 (irq = 244, base_baud = 1625000) is a ST16650V2
[    6.701297] input: wifi-wakeup as /devices/platform/wifi-wakeup/input/input0
[    6.716630] printk: legacy console [ttyS0] enabled
[    6.726739] spi_master spi0: will run message pump with realtime priority
[    6.727457] mt6359-auxadc: Failed to locate of_node [id: -1]
[    6.728788] platform 14013000.dsi: Fixed dependency cycle(s) with /soc/i2c at 11007000/anx7625 at 58
[    6.728829] i2c 0-0058: Fixed dependency cycle(s) with /soc/i2c at 11007000/anx7625 at 58/aux-bus/panel
[    6.728842] i2c 0-0058: Fixed dependency cycle(s) with /soc/dsi at 14013000
[    6.732990] mediatek-drm mediatek-drm.2.auto: Adding component match for /soc/ovl at 14005000
[    6.733033] mediatek-drm mediatek-drm.2.auto: Adding component match for /soc/ovl at 14006000
[    6.733056] mediatek-drm mediatek-drm.2.auto: Adding component match for /soc/rdma at 14007000
[    6.733079] mediatek-drm mediatek-drm.2.auto: Adding component match for /soc/color at 14009000
[    6.733111] mediatek-drm mediatek-drm.2.auto: Adding component match for /soc/ccorr at 1400b000
[    6.733133] mediatek-drm mediatek-drm.2.auto: Adding component match for /soc/aal at 1400c000
[    6.733155] mediatek-drm mediatek-drm.2.auto: Adding component match for /soc/gamma at 1400d000
[    6.740972] mediatek-drm mediatek-drm.2.auto: Adding component match for /soc/ovl at 14005000
[    6.746522] platform mt6358-regulator: Fixed dependency cycle(s) with /soc/pwrap at 1000d000/pmic/regulators/vs2
[    6.754777] mediatek-drm mediatek-drm.2.auto: Adding component match for /soc/ovl at 14006000
[    6.763570] platform mt6358-regulator: Fixed dependency cycle(s) with /soc/pwrap at 1000d000/pmic/regulators/vdram1
[    6.770299] mediatek-drm mediatek-drm.2.auto: Adding component match for /soc/rdma at 14007000
[    6.778510] platform mt6358-regulator: Fixed dependency cycle(s) with /soc/pwrap at 1000d000/pmic/regulators/vs1
[    6.779281] hid: raw HID events driver (C) Jiri Kosina
[    6.780813] mt6358-keys: Failed to locate of_node [id: -1]
[    6.786870] mediatek-drm mediatek-drm.2.auto: Adding component match for /soc/color at 14009000
[    6.789011] cros-ec-spi spi0.0: Chrome EC device registered
[    6.796282] pp3300_vcn33_x: Bringing 3500000uV into 3300000-3300000uV
[    6.803630] mediatek-drm mediatek-drm.2.auto: Adding component match for /soc/ccorr at 1400b000
[    6.812756] pp2760_vsim2_x: Bringing 1860000uV into 2700000-2700000uV
[    6.820252] mediatek-drm mediatek-drm.2.auto: Adding component match for /soc/aal at 1400c000
[    6.862956] mt6397-rtc mt6358-rtc: registered as rtc0
[    6.869440] mediatek-drm mediatek-drm.2.auto: Adding component match for /soc/gamma at 1400d000
[    6.879777] mt6397-rtc mt6358-rtc: setting system clock to 2024-09-16T15:25:24 UTC (1726500324)
[    6.880155] i2c_hid_of 2-002c: supply vddl not found, using dummy regulator
[    6.888029] mediatek-drm mediatek-drm.2.auto: Adding component match for /soc/dsi at 14013000
[    6.888446] input: cros_ec as /devices/platform/soc/11010000.spi/spi_master/spi0/spi0.0/11010000.spi:ec at 0:keyboard-controller/input/input1
[    6.893245] input: cros_ec_buttons as /devices/platform/soc/11010000.spi/spi_master/spi0/spi0.0/11010000.spi:ec at 0:keyboard-controller/input/input2
[    7.261651] mediatek-drm mediatek-drm.2.auto: Adding component match for /soc/rdma at 1401f000
[    7.272416] mtk-msdc 11240000.mmc: allocated mmc-pwrseq
[    7.289318] mmc0: CQHCI version 5.10
[    7.375371] mtk-msdc 11240000.mmc: msdc_track_cmd_data: cmd=52 arg=00000C00; host->error=0x00000002
[    7.394096] mtk-msdc 11240000.mmc: msdc_track_cmd_data: cmd=52 arg=80000C08; host->error=0x00000002
[    7.425798] mtk-msdc 11230000.mmc: Final PAD_DS_TUNE: 0x11c14
[    7.440743] mmc0: Command Queue Engine enabled
[    7.441017] mmc1: new ultra high speed SDR104 SDIO card at address 0001
[    7.445185] mmc0: new HS400 MMC card at address 0001
[    7.463150] panel-simple-dp-aux aux-0-0058: Detected BOE NT140FHM-N45 (0x09ae)
[    7.468349] mmcblk0: mmc0:0001 DV4064 58.2 GiB
[    7.476036] mtu3 11201000.usb: supply vusb33 not found, using dummy regulator
[    7.486077]  mmcblk0: p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12
[    7.486908] mtu3 11201000.usb: dr_mode: 3, drd: auto
[    7.493193] mmcblk0boot0: mmc0:0001 DV4064 4.00 MiB
[    7.497239] mtu3 11201000.usb: u2p_dis_msk: 0, u3p_dis_msk: 0
[    7.497416] mtu3 11201000.usb: usb3-drd: 0
[    7.502735] mmcblk0boot1: mmc0:0001 DV4064 4.00 MiB
[    7.508621] mtu3 11201000.usb: irq 266
[    7.513681] mmcblk0rpmb: mmc0:0001 DV4064 16.0 MiB, chardev (240:0)
[    7.516885] mtu3 11201000.usb: IP version 0x1006(U2 IP)
[    7.601450] mtu3 11201000.usb: max_speed: high-speed
[    7.611384] mtu3 11201000.usb: fifosz/epnum: Tx=0x2000/8, Rx=0x2000/8
[    7.624289] mtu3 11201000.usb: dma mask: 36 bits
[    7.634671] mtu3 11201000.usb: xHCI platform device register success...
[    7.648493] mtu3 11281000.usb: supply vusb33 not found, using dummy regulator
[    7.663069] mtu3 11281000.usb: dr_mode: 3, drd: auto
[    7.665375] usbcore: registered new interface driver usbfs
[    7.668033] mtu3 11281000.usb: u2p_dis_msk: 0, u3p_dis_msk: 0
[    7.668173] mtu3 11281000.usb: usb3-drd: 1
[    7.673555] usbcore: registered new interface driver hub
[    7.679313] mtu3 11281000.usb: irq 267
[    7.683395] usbcore: registered new device driver usb
[    7.688671] mtu3 11281000.usb: IP version 0x1006(U3 IP)
[    7.742379] mtu3 11281000.usb: max_speed: super-speed-plus
[    7.743003] xhci-mtk 11200000.usb: supply vusb33 not found, using dummy regulator
[    7.747860] mtu3 11281000.usb: fifosz/epnum: Tx=0x4000/8, Rx=0x4000/8
[    7.755481] xhci-mtk 11200000.usb: uwk - reg:0x420, version:2
[    7.761766] mtu3 11281000.usb: dma mask: 36 bits
[    7.767732] xhci-mtk 11200000.usb: xHCI Host Controller
[    7.773275] xhci-mtk 11280000.usb: supply vusb33 not found, using dummy regulator
[    7.777332] xhci-mtk 11200000.usb: new USB bus registered, assigned bus number 1
[    7.777393] xhci-mtk 11200000.usb: USB3 root hub has no ports
[    7.784937] xhci-mtk 11280000.usb: uwk - reg:0x424, version:2
[    7.792194] xhci-mtk 11200000.usb: hcc params 0x01400f99 hci version 0x110 quirks 0x0000000000200010
[    7.798089] xhci-mtk 11280000.usb: xHCI Host Controller
[    7.803684] xhci-mtk 11200000.usb: irq 268, io mem 0x11200000
[    7.812785] xhci-mtk 11280000.usb: new USB bus registered, assigned bus number 2
[    7.818129] usb usb1: New USB device found, idVendor=1d6b, idProduct=0002, bcdDevice= 6.11
[    7.825232] xhci-mtk 11280000.usb: hcc params 0x01400f99 hci version 0x110 quirks 0x0000000000200010
[    7.831112] usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[    7.831116] usb usb1: Product: xHCI Host Controller
[    7.839384] xhci-mtk 11280000.usb: irq 269, io mem 0x11280000
[    7.848491] usb usb1: Manufacturer: Linux 6.11.0-next-20240916-deb-00002-g7b544e01c649 xhci-hcd
[    7.855748] xhci-mtk 11280000.usb: xHCI Host Controller
[    7.860563] usb usb1: SerialNumber: 11200000.usb
[    8.028253] hub 1-0:1.0: USB hub found
[    8.035778] hub 1-0:1.0: 1 port detected
[    8.043872] xhci-mtk 11280000.usb: new USB bus registered, assigned bus number 3
[    8.058701] xhci-mtk 11280000.usb: Host supports USB 3.2 Enhanced SuperSpeed
[    8.072879] usb usb2: New USB device found, idVendor=1d6b, idProduct=0002, bcdDevice= 6.11
[    8.089429] usb usb2: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[    8.103892] usb usb2: Product: xHCI Host Controller
[    8.113647] usb usb2: Manufacturer: Linux 6.11.0-next-20240916-deb-00002-g7b544e01c649 xhci-hcd
[    8.131056] usb usb2: SerialNumber: 11280000.usb
[    8.140632] hub 2-0:1.0: USB hub found
[    8.148147] hub 2-0:1.0: 1 port detected
[    8.156170] usb usb3: We don't know the algorithms for LPM for this host, disabling LPM.
[    8.172409] usb usb3: New USB device found, idVendor=1d6b, idProduct=0003, bcdDevice= 6.11
[    8.188956] usb usb3: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[    8.203409] usb usb3: Product: xHCI Host Controller
[    8.213166] usb usb3: Manufacturer: Linux 6.11.0-next-20240916-deb-00002-g7b544e01c649 xhci-hcd
[    8.230576] usb usb3: SerialNumber: 11280000.usb
[    8.240157] hub 3-0:1.0: USB hub found
[    8.247671] hub 3-0:1.0: 1 port detected
[    8.255703] mtu3 11281000.usb: xHCI platform device register success...
[    8.276133] mtk-iommu 14016000.iommu: bound 14003000.smi (ops mtk_smi_exit [mtk_smi])
[    8.291907] mtk-iommu 14016000.iommu: bound 14004000.smi (ops mtk_smi_exit [mtk_smi])
[    8.307634] mtk-iommu 14016000.iommu: bound 1b002000.smi (ops mtk_smi_exit [mtk_smi])
[    8.323361] mtk-iommu 14016000.iommu: bound 1602e000.smi (ops mtk_smi_exit [mtk_smi])
[    8.339061] mtk-iommu 14016000.iommu: bound 17010000.smi (ops mtk_smi_exit [mtk_smi])
[    8.354737] mtk-iommu 14016000.iommu: bound 14023000.smi (ops mtk_smi_exit [mtk_smi])
[    8.370451] mtk-iommu 14016000.iommu: bound 1502e000.smi (ops mtk_smi_exit [mtk_smi])
[    8.386126] mtk-iommu 14016000.iommu: bound 1582e000.smi (ops mtk_smi_exit [mtk_smi])
[    8.401797] mtk-iommu 14016000.iommu: bound 1a001000.smi (ops mtk_smi_exit [mtk_smi])
[    8.417468] mtk-iommu 14016000.iommu: bound 1a002000.smi (ops mtk_smi_exit [mtk_smi])
[    8.433139] mtk-iommu 14016000.iommu: bound 1a00f000.smi (ops mtk_smi_exit [mtk_smi])
[    8.448836] mtk-iommu 14016000.iommu: bound 1a010000.smi (ops mtk_smi_exit [mtk_smi])
[    8.448890] usb 1-1: new high-speed USB device number 2 using xhci-mtk
[    8.456752] mtk-iommu 14016000.iommu: bound 1c10f000.smi (ops mtk_smi_exit [mtk_smi])
[    8.493277] mtk-iommu 14016000.iommu: bound 1c00f000.smi (ops mtk_smi_exit [mtk_smi])
[    8.509481] mediatek-disp-ovl 14005000.ovl: Adding to iommu group 0
[    8.522904] mediatek-disp-ovl 14006000.ovl: Adding to iommu group 0
[    8.536023] mediatek-disp-rdma 14007000.rdma: Adding to iommu group 0
[    8.549490] mediatek-disp-rdma 1401f000.rdma: Adding to iommu group 0
[    8.562842] mediatek-drm mediatek-drm.2.auto: bound 14005000.ovl (ops mtk_drm_exit [mediatek_drm])
[    8.580822] usb 2-1: new high-speed USB device number 2 using xhci-mtk
[    8.582140] mediatek-drm mediatek-drm.2.auto: bound 14006000.ovl (ops mtk_drm_exit [mediatek_drm])
[    8.603451] usb 1-1: New USB device found, idVendor=30c9, idProduct=0093, bcdDevice= 0.09
[    8.611862] mediatek-drm mediatek-drm.2.auto: bound 14007000.rdma (ops mtk_drm_exit [mediatek_drm])
[    8.620000] usb 1-1: New USB device strings: Mfr=3, Product=1, SerialNumber=2
[    8.620004] usb 1-1: Product: Integrated Camera
[    8.620007] usb 1-1: Manufacturer: Lenovo
[    8.620009] usb 1-1: SerialNumber: 8SSC21J75356V1SR34D04F6
[    8.688748] mediatek-drm mediatek-drm.2.auto: bound 14009000.color (ops mtk_drm_exit [mediatek_drm])
[    8.707061] mediatek-drm mediatek-drm.2.auto: bound 1400b000.ccorr (ops mtk_drm_exit [mediatek_drm])
[    8.725355] mediatek-drm mediatek-drm.2.auto: bound 1400c000.aal (ops mtk_drm_exit [mediatek_drm])
[    8.742261] usb 2-1: New USB device found, idVendor=0bda, idProduct=5411, bcdDevice= 1.16
[    8.743292] mediatek-drm mediatek-drm.2.auto: bound 1400d000.gamma (ops mtk_drm_exit [mediatek_drm])
[    8.751459] usb 2-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[    8.792208] usb 2-1: Product: USB2.1 Hub
[    8.800054] usb 2-1: Manufacturer: Generic
[    8.809431] hub 2-1:1.0: USB hub found
[    8.817941] hub 2-1:1.0: 3 ports detected
[    8.818842] mediatek-drm mediatek-drm.2.auto: bound 14013000.dsi (ops mtk_drm_exit [mediatek_drm])
[    8.843895] mediatek-drm mediatek-drm.2.auto: bound 1401f000.rdma (ops mtk_drm_exit [mediatek_drm])
[    8.862076] mediatek-drm mediatek-drm.2.auto: Not creating crtc 1 because component 10 is disabled or missing
[    8.866810] usb 3-1: new SuperSpeed USB device number 2 using xhci-mtk
[    8.872572] [drm] Initialized mediatek 1.0.0 for mediatek-drm.2.auto on minor 0
[    9.217339] Console: switching to colour frame buffer device 240x67
[    9.229914] mediatek-drm mediatek-drm.2.auto: [drm] fb0: mediatekdrmfb frame buffer device
[    9.304875] usb 3-1: New USB device found, idVendor=0bda, idProduct=0411, bcdDevice= 1.16
[    9.321261] usb 3-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[    9.328846] usbcore: registered new device driver onboard-usb-dev
[    9.335540] usb 3-1: Product: USB3.2 Hub
[    9.335544] usb 3-1: Manufacturer: Generic
[    9.337112] hub 3-1:1.0: USB hub found
[    9.372670] hub 3-1:1.0: 3 ports detected
[   10.590334] usb 3-1.2: new SuperSpeed USB device number 3 using xhci-mtk
[   10.626980] usb 3-1.2: New USB device found, idVendor=04e8, idProduct=61f5, bcdDevice= 1.00
[   10.643747] usb 3-1.2: New USB device strings: Mfr=2, Product=3, SerialNumber=1
[   10.643752] usb 3-1.2: Product: Portable SSD T5
[   10.643755] usb 3-1.2: Manufacturer: Samsung
[   10.643758] usb 3-1.2: SerialNumber: 1234567E4FF2
[   10.687566] SCSI subsystem initialized
[   10.700350] usb 3-1.2: USB controller 11280000.usb does not support streams, which are required by the UAS driver.
[   10.721087] usb 3-1.2: Please try an other USB controller if you wish to use UAS.
[   10.721091] usb-storage 3-1.2:1.0: USB Mass Storage device detected
[   10.721702] scsi host0: usb-storage 3-1.2:1.0
[   10.757586] usbcore: registered new interface driver usb-storage
[   10.772605] usbcore: registered new interface driver uas
[   11.778827] scsi 0:0:0:0: Direct-Access     Samsung  Portable SSD T5  0    PQ: 0 ANSI: 6
[   11.801877] sd 0:0:0:0: [sda] 1953525168 512-byte logical blocks: (1.00 TB/932 GiB)
[   11.817671] sd 0:0:0:0: [sda] Write Protect is off
[   11.827706] sd 0:0:0:0: [sda] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
[   11.866684]  sda: sda1 sda2 sda3 sda4 sda5 sda6 sda7 sda8 sda9 sda10
[   11.880716] sd 0:0:0:0: [sda] Attached SCSI disk
[   12.239413] EXT4-fs (sda4): mounted filesystem c16826e5-0b66-4648-87db-8a2601010f0a ro with ordered data mode. Quota mode: none.
[   12.372682] Not activating Mandatory Access Control as /sbin/tomoyo-init does not exist.
[   12.497038] systemd[1]: Inserted module 'autofs4'
[   12.538640] systemd[1]: systemd 256.5-1 running in system mode (+PAM +AUDIT +SELINUX +APPARMOR +IMA +SMACK +SECCOMP +GCRYPT -GNUTLS +OPENSSL +ACL +BLKID +CURL +ELFUTILS +FIDO2 +IDN2 -IDN +IPTC +KMOD +LIBCRYPTSETUP +LIBCRYPTSETUP_PLUGINS +LIBFDISK +PCRE2 +PWQUALITY +P11KIT +QRENCO)
[   12.604118] systemd[1]: Detected architecture arm64.
[   12.615377] systemd[1]: Hostname set to <DEBIAN-T5-ARM64>.
[   12.768629] systemd[1]: bpf-restrict-fs: Failed to load BPF object: No such process
[   13.158668] systemd[1]: Queued start job for default target graphical.target.
[   13.225238] systemd[1]: Created slice system-getty.slice - Slice /system/getty.
[   13.241008] systemd[1]: Created slice system-modprobe.slice - Slice /system/modprobe.
[   13.257669] systemd[1]: Created slice system-serial\x2dgetty.slice - Slice /system/serial-getty.
[   13.276331] systemd[1]: Created slice system-systemd\x2dfsck.slice - Slice /system/systemd-fsck.
[   13.294675] systemd[1]: Created slice user.slice - User and Session Slice.
[   13.308737] systemd[1]: Started systemd-ask-password-wall.path - Forward Password Requests to Wall Directory Watch.
[   13.330219] systemd[1]: Set up automount proc-sys-fs-binfmt_misc.automount - Arbitrary Executable File Formats File System Automount Point.
[   13.355624] systemd[1]: Expecting device dev-disk-by\x2duuid-605450ef\x2d43fc\x2d41e4\x2d83d7\x2d9c204d5c1c03.device - /dev/disk/by-uuid/605450ef-43fc-41e4-83d7-9c204d5c1c03...
[   13.387323] systemd[1]: Expecting device dev-disk-by\x2duuid-92da49dd\x2d921b\x2d4e87\x2d9b65\x2d3ecbd9905707.device - /dev/disk/by-uuid/92da49dd-921b-4e87-9b65-3ecbd9905707...
[   13.419163] systemd[1]: Expecting device dev-disk-by\x2duuid-9409\x2dDA15.device - /dev/disk/by-uuid/9409-DA15...
[   13.439874] systemd[1]: Expecting device dev-ttyAMA0.device - /dev/ttyAMA0...
[   13.454255] systemd[1]: Expecting device dev-ttyS0.device - /dev/ttyS0...
[   13.468013] systemd[1]: Reached target integritysetup.target - Local Integrity Protected Volumes.
[   13.485923] systemd[1]: Reached target nss-user-lookup.target - User and Group Name Lookups.
[   13.502964] systemd[1]: Reached target remote-fs.target - Remote File Systems.
[   13.517523] systemd[1]: Reached target slices.target - Slice Units.
[   13.530251] systemd[1]: Reached target veritysetup.target - Local Verity Protected Volumes.
[   13.549165] systemd[1]: Listening on systemd-creds.socket - Credential Encryption/Decryption.
[   13.566592] systemd[1]: Listening on systemd-initctl.socket - initctl Compatibility Named Pipe.
[   13.584391] systemd[1]: Listening on systemd-journald-dev-log.socket - Journal Socket (/dev/log).
[   13.602557] systemd[1]: Listening on systemd-journald.socket - Journal Sockets.
[   13.617375] systemd[1]: systemd-pcrextend.socket - TPM PCR Measurements was skipped because of an unmet condition check (ConditionSecurity=measured-uki).
[   13.644924] systemd[1]: systemd-pcrlock.socket - Make TPM PCR Policy was skipped because of an unmet condition check (ConditionSecurity=measured-uki).
[   13.672180] systemd[1]: Listening on systemd-udevd-control.socket - udev Control Socket.
[   13.688660] systemd[1]: Listening on systemd-udevd-kernel.socket - udev Kernel Socket.
[   13.707450] systemd[1]: Mounting dev-hugepages.mount - Huge Pages File System...
[   13.766877] systemd[1]: Mounting dev-mqueue.mount - POSIX Message Queue File System...
[   13.785218] systemd[1]: Mounting run-lock.mount - Legacy Locks Directory /run/lock...
[   13.803022] systemd[1]: Mounting sys-kernel-debug.mount - Kernel Debug File System...
[   13.820759] systemd[1]: Mounting sys-kernel-tracing.mount - Kernel Trace File System...
[   13.839689] systemd[1]: Starting keyboard-setup.service - Set the console keyboard layout...
[   13.858991] systemd[1]: Starting kmod-static-nodes.service - Create List of Static Device Nodes...
[   13.879740] systemd[1]: Starting modprobe at configfs.service - Load Kernel Module configfs...
[   13.899336] systemd[1]: Starting modprobe at drm.service - Load Kernel Module drm...
[   13.916671] systemd[1]: Starting modprobe at efi_pstore.service - Load Kernel Module efi_pstore...
[   13.936398] systemd[1]: Starting modprobe at fuse.service - Load Kernel Module fuse...
[   13.952172] systemd[1]: systemd-fsck-root.service - File System Check on Root Device was skipped because of an unmet condition check (ConditionPathExists=!/run/initramfs/fsck-root).
[   13.984688] systemd[1]: systemd-hibernate-clear.service - Clear Stale Hibernate Storage Info was skipped because of an unmet condition check (ConditionPathExists=/sys/firmware/efi/efivars/HibernateLocation-8cf2644b-4b0b-428f-9387-6d876050dc67).
[   14.031876] systemd[1]: Starting systemd-journald.service - Journal Service...
[   14.049441] systemd[1]: Starting systemd-modules-load.service - Load Kernel Modules...
[   14.065554] systemd[1]: systemd-pcrmachine.service - TPM PCR Machine ID Measurement was skipped because of an unmet condition check (ConditionSecurity=measured-uki).
[   14.097177] systemd[1]: Starting systemd-remount-fs.service - Remount Root and Kernel File Systems...
[   14.115997] systemd[1]: systemd-tpm2-setup-early.service - Early TPM SRK Setup was skipped because of an unmet condition check (ConditionSecurity=measured-uki).
[   14.146783] systemd[1]: Starting systemd-udev-load-credentials.service - Load udev Rules from Credentials...
[   14.168717] systemd[1]: Starting systemd-udev-trigger.service - Coldplug All udev Devices...
[   14.179524] systemd-journald[331]: Collecting audit messages is disabled.
[   14.195155] EXT4-fs (sda4): re-mounted c16826e5-0b66-4648-87db-8a2601010f0a r/w. Quota mode: none.
[   14.223272] systemd[1]: Mounted dev-hugepages.mount - Huge Pages File System.
[   14.238037] systemd[1]: Mounted dev-mqueue.mount - POSIX Message Queue File System.
[   14.253788] systemd[1]: Mounted run-lock.mount - Legacy Locks Directory /run/lock.
[   14.269440] systemd[1]: Started systemd-journald.service - Journal Service.
[   14.374947] systemd-journald[331]: Received client request to flush runtime journal.
[   14.935868] sd 0:0:0:0: Attached scsi generic sg0 type 0
[   15.022815] pstore: Using crash dump compression: deflate
[   15.035525] pstore: Registered ramoops as persistent store backend
[   15.047996] ramoops: using 0x100000 at 0xffec5000, ecc: 0
[   15.109992] mtk-wdt 10007000.watchdog: Watchdog enabled (timeout=31 sec, nowayout=0)
[   15.128526] mtk-ccifreq cci: failed to add devfreq device: -517
[   15.146800] mtk-lvts-thermal 1100b000.thermal-sensor: fake golden temp=50
[   15.166664] mtk-scp 10500000.scp: assigned reserved memory node memory at 50000000
[   15.182768] mtk-ccifreq cci: failed to add devfreq device: -517
[   15.195654] remoteproc remoteproc0: scp is available
[   15.217946] remoteproc remoteproc0: powering up scp
[   15.228152] ACPI: battery: new extension: cros-charge-control.6.auto
[   15.231899] remoteproc remoteproc0: Booting fw image mediatek/mt8186/scp.img, size 419488
[   15.231909] mtk-scp 10500000.scp: IPI buf addr 0x0003bdb0
[   15.232218] mtk-ccifreq cci: failed to add devfreq device: -517
[   15.290597] mtk-ccifreq cci: failed to add devfreq device: -517
[   15.307523] mtk-ccifreq cci: failed to add devfreq device: -517
[   15.320997] rt5682s 5-001a: Using default DAI clk names: rt5682-dai-wclk, rt5682-dai-bclk
[   15.326877] mtk-scp 10500000.scp: SCP is ready. FW version corsola_scp_v2.0.18944-70c8f752
[   15.326893] mtk-scp 10500000.scp: creating channel cros-ec-rpmsg addr 0xd
[   15.328463] sbs-battery 6-000b: sbs-battery: battery gas gauge device registered
[   15.337709] mtk-ccifreq cci: failed to add devfreq device: -517
[   15.341465] elan_i2c 2-0015: Elan Touchpad: Module ID: 0x010a, Firmware: 0x0002, Sample: 0x0002, IAP: 0x0002
[   15.341977] input: Elan Touchpad as /devices/platform/soc/11009000.i2c/i2c-2/2-0015/input/input3
[   15.345657] remoteproc remoteproc0: remote processor scp is now up
[   15.430929] mc: Linux media interface: v0.10
[   15.452901] mtk-ccifreq cci: failed to add devfreq device: -517
[   15.490708] videodev: Linux video capture interface: v2.00
[   15.506411] Fallback method does not support PEC.
[   15.506411] sbs-battery 6-000b: I2C adapter does not support I2C_FUNC_SMBUS_READ_BLOCK_DATA.
[   15.533600] mt6358-sound mt6358-sound: mt6358_platform_driver_probe(), dev name mt6358-sound
[   15.536533] mtk-ccifreq cci: failed to add devfreq device: -517
[   15.565442] mtk-ccifreq cci: failed to add devfreq device: -517
[   15.582003] tpm_tis_spi spi1.0: TPM ready IRQ confirmed on attempt 2
[   15.594865] mtk-ccifreq cci: failed to add devfreq device: -517
[   15.598915] mt8186-audio 11210000.audio-controller: mtk_afe_combine_sub_dai(), num of dai 41
[   15.607141] tpm_tis_spi spi1.0: 2.0 TPM (device-id 0x504A, rev-id 83)
[   15.609526] mt8186-audio 11210000.audio-controller: No cache defaults, reading back from HW
[   15.620913] mtk-ccifreq cci: failed to add devfreq device: -517
[   15.646657] cfg80211: Loading compiled-in X.509 certificates for regulatory database
[   15.681016] mtk-ccifreq cci: failed to add devfreq device: -517
[   15.681413] Loaded X.509 cert 'sforshee: 00b28ddf47aef9cea7'
[   15.704906] Loaded X.509 cert 'wens: 61c038651aabdcf94bd0ac7ff06c7248db18c600'
[   15.717988] cros-ec-led cros-ec-led.9.auto: probe with driver cros-ec-led failed with error -22
[   15.737735] cros-ec-dev cros-ec-dev.15.auto: CrOS System Control Processor MCU detected
[   15.757040] cros-ec-rpmsg 10500000.scp.cros-ec-rpmsg.13.-1: Chrome EC device registered
[   15.759051] mtk-ccifreq cci: failed to add devfreq device: -517
[   15.761583] tpm_tis_spi spi1.0: Cr50 firmware version: Ti50/D3C1 RO_B:0.0.56/- RW_A:0.23.90/ti50_common_mp-15224.B:v0.0
[   15.772981] cfg80211: loaded regulatory.db is malformed or signature is missing/invalid
[   15.789991] mtk-ccifreq cci: failed to add devfreq device: -517
[   15.806773] panfrost 13040000.gpu: clock rate = 249999863
[   15.851522] panfrost 13040000.gpu: EM: created perf domain
[   15.871976] mtk-ccifreq cci: failed to add devfreq device: -517
[   15.892576] panfrost 13040000.gpu: mali-g52 id 0x7402 major 0x1 minor 0x0 status 0x0
[   15.908188] panfrost 13040000.gpu: features: 00000000,00000cf7, issues: 00000000,00000400
[   15.908195] panfrost 13040000.gpu: Features: L2:0x07120206 Shader:0x00000002 Tiler:0x00000209 Mem:0x1 MMU:0x00002823 AS:0xff JS:0x7
[   15.908202] panfrost 13040000.gpu: shader_present=0x3 l2_present=0x1
[   15.922602] Adding 31457276k swap on /dev/sda6.  Priority:-2 extents:1 across:31457276k
[   15.922886] usb 1-1: Found UVC 1.50 device Integrated Camera (30c9:0093)
[   15.984927] [drm] Initialized panfrost 1.2.0 for 13040000.gpu on minor 1
[   16.000891] usbcore: registered new interface driver uvcvideo
[   16.031262] ------------[ cut here ]------------
[   16.040525] kernel BUG at net/core/skbuff.c:2268!
[   16.040531] Internal error: Oops - BUG: 00000000f2000800 [#1] SMP
[   16.040537] Modules linked in: mtk_jpeg(+) mtk_adsp_common v4l2_vp9 mt7921s(+) mtk_vcodec_enc(+) mt76_sdio v4l2_h264 aes_ce_blk mtk_adsp_ipc mtk_vcodec_dbgfs mt7921_common mtk_vcodec_common mtk_jpeg_enc_hw aes_ce_cipher mt792x_lib snd_sof_xtensa_dsp crct10dif_ce mt76_connac_lib pp
[   16.040655]  snd_compress mt6577_auxadc snd_pcm_dmaengine industrialio lvts_thermal snd_pcm mtk_rpmsg mtk_svs mtk_scp_ipi mtk_adsp_mailbox rpmsg_core memconsole_coreboot mtk_wdt governor_passive snd_timer memconsole vpd_sysfs snd ramoops mtk_cci_devfreq soundcore reed_solomon sg n
[   16.040782]  clk_mt8186_apmixedsys mtk_cmdq_mailbox mtk_pmic_wrap spi_mtk_nor i2c_mt65xx clk_mt8186_imp_iic_wrap spi_mt65xx clk_mt8186_topckgen clk_mt8186_infra_ao fixed pwm_bl
[   16.040803] CPU: 3 UID: 0 PID: 526 Comm: mt76-sdio-txrx  Not tainted 6.11.0-next-20240916-deb-00002-g7b544e01c649 #1
[   16.040809] Hardware name: Google Magneton board (DT)
[   16.040811] pstate: 20400009 (nzCv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=--)
[   16.040816] pc : pskb_expand_head+0x2b0/0x3c0
[   16.040827] lr : mt76s_tx_run_queue+0x274/0x410 [mt76_sdio]
[   16.040837] sp : ffff800082413c20
[   16.040839] x29: ffff800082413c30 x28: ffff030783514080 x27: ffff030783114f80
[   16.040846] x26: 0000000000000000 x25: 0000000000000000 x24: 0000000000000200
[   16.040852] x23: 0000000000000140 x22: 0000000000000028 x21: ffff0307897b2020
[   16.040858] x20: ffff030783514080 x19: ffff030783111200 x18: 0000000000000000
[   16.040863] x17: ffff568eeefd6000 x16: ffffac78cfc10ee8 x15: 0000000000000000
[   16.040869] x14: 0000000000000000 x13: 00000000000001a0 x12: 00000000000001a0
[   16.040875] x11: 0000000000000000 x10: 0000000000000bd0 x9 : ffffac78bc9dedac
[   16.040880] x8 : ffff0307849f68b0 x7 : 0000000000000000 x6 : 0000000005d995fa
[   16.040886] x5 : 0000000000000000 x4 : ffff0307849f5c80 x3 : 0000000000000820
[   16.040891] x2 : 0000000000000200 x1 : 0000000000000002 x0 : ffff030783111200
[   16.040897] Call trace:
[   16.040899]  pskb_expand_head+0x2b0/0x3c0
[   16.040905]  mt76s_tx_run_queue+0x274/0x410 [mt76_sdio]
[   16.040909]  mt76s_txrx_worker+0xe4/0xac8 [mt76_sdio]
[   16.040914]  mt7921s_txrx_worker+0x98/0x1e0 [mt7921s]
[   16.040924]  __mt76_worker_fn+0x80/0x128 [mt76]
[   16.040934]  kthread+0xe8/0xf8
[   16.040940]  ret_from_fork+0x10/0x20
[   16.040949] Code: 52800021 97fffed9 17ffffbc d4210000 (d4210000)
[   16.040953] ---[ end trace 0000000000000000 ]---
[   16.046045] note: mt76-sdio-txrx [526] exited with irqs disabled
[   16.048248] mtk-vcodec-enc 17020000.video-encoder: Adding to iommu group 1
[   16.050772] mtk-ccifreq cci: failed to add devfreq device: -517
[   16.051568] ------------[ cut here ]------------
[   16.805325] WARNING: CPU: 3 PID: 0 at kernel/context_tracking.c:128 ct_kernel_exit.isra.0+0xa0/0xa8
[   16.805341] Modules linked in: snd_sof_mt8186(+) mtk_vcodec_dec(+) joydev(+) mtk_jpeg(+) mtk_adsp_common v4l2_vp9 mt7921s mtk_vcodec_enc(+) mt76_sdio v4l2_h264 aes_ce_blk mtk_adsp_ipc mtk_vcodec_dbgfs mt7921_common mtk_vcodec_common mtk_jpeg_enc_hw aes_ce_cipher mt792x_lib snd_soc
[   16.805462]  cros_charge_control elan_i2c snd_soc_core mtk_scp snd_compress mt6577_auxadc snd_pcm_dmaengine industrialio lvts_thermal snd_pcm mtk_rpmsg mtk_svs mtk_scp_ipi mtk_adsp_mailbox rpmsg_core memconsole_coreboot mtk_wdt governor_passive snd_timer memconsole vpd_sysfs snd r
[   16.805596]  cqhci udc_core pwm_mtk_disp usb_common clk_mt8186_apmixedsys mtk_cmdq_mailbox mtk_pmic_wrap spi_mtk_nor i2c_mt65xx clk_mt8186_imp_iic_wrap spi_mt65xx clk_mt8186_topckgen clk_mt8186_infra_ao fixed pwm_bl
[   16.805624] CPU: 3 UID: 0 PID: 0 Comm: swapper/3 Tainted: G      D            6.11.0-next-20240916-deb-00002-g7b544e01c649 #1
[   16.805630] Tainted: [D]=DIE
[   16.805632] Hardware name: Google Magneton board (DT)
[   16.805635] pstate: 204000c9 (nzCv daIF +PAN -UAO -TCO -DIT -SSBS BTYPE=--)
[   16.805640] pc : ct_kernel_exit.isra.0+0xa0/0xa8
[   16.805645] lr : ct_idle_enter+0x14/0x20
[   16.805649] sp : ffff800080133d60
[   16.805651] x29: ffff800080133d60 x28: 0000000000000000 x27: 0000000000000000
[   16.805658] x26: 0000000000000000 x25: 0000000000000000 x24: 00000003bcbf47dc
[   16.805663] x23: 0000000000000000 x22: ffff030780b1c880 x21: ffff0307bf6ee478
[   16.805669] x20: 0000000000000005 x19: ffff0307bf6eb700 x18: ffff800084ec3c98
[   16.805675] x17: ffff03078080fb00 x16: 0000000000001059 x15: 000000000000089d
[   16.805681] x14: 0000000000000002 x13: 0000000000000000 x12: 0000000000000113
[   16.805687] x11: 071c71c71c71c71c x10: 000000000000003b x9 : ffffac78cfeca660
[   16.805693] x8 : 0000000000000018 x7 : 000000000000006d x6 : 0000000005d995fa
[   16.805698] x5 : 4000000000000002 x4 : ffff568eeefd6000 x3 : ffff800080133d60
[   16.805704] x2 : ffffac78d0715700 x1 : ffffac78d0715700 x0 : 4000000000000000
[   16.805710] Call trace:
[   16.805712]  ct_kernel_exit.isra.0+0xa0/0xa8
[   16.805717]  ct_idle_enter+0x14/0x20
[   16.805722]  cpuidle_enter_state+0x1a4/0x460
[   16.805726]  cpuidle_enter+0x40/0x60
[   16.805733]  do_idle+0x1fc/0x280
[   16.805740]  cpu_startup_entry+0x40/0x50
[   16.805745]  secondary_start_kernel+0x128/0x158
[   16.805752]  __secondary_switched+0xb8/0xc0
[   16.805758] ---[ end trace 0000000000000000 ]---
[   16.836198] mtk-jpeg 17030000.jpeg-encoder: Adding to iommu group 1
[   17.529676] sof-audio-of-mt8186 10680000.adsp: DT DSP detected
[   17.529817] mtk-vcodec-dec 16000000.video-decoder: Adding to iommu group 1
[   17.530091] mtk-jpeg 17030000.jpeg-encoder: mtk-jpeg-enc device registered as /dev/video3 (81,3)
[   17.535691] sof-audio-of-mt8186 10680000.adsp: assigned reserved memory node memory at 61000000
[   17.546482] mtk-ccifreq cci: failed to add devfreq device: -517
[   17.603968] sof-audio-of-mt8186 10680000.adsp: Firmware paths/files for ipc type 0:
[   17.605029] mtk-vdec-comp 16025000.video-codec: Adding to iommu group 1
[   17.611648] sof-audio-of-mt8186 10680000.adsp:  Firmware file:     mediatek/sof/sof-mt8186.ri
[   17.611653] sof-audio-of-mt8186 10680000.adsp:  Topology file:     mediatek/sof-tplg/sof-mt8186.tplg
[   17.612004] sof-audio-of-mt8186 10680000.adsp: Firmware info: version 2:0:0-475be
[   17.620780] mtk-ccifreq cci: failed to add devfreq device: -517
[   17.626828] sof-audio-of-mt8186 10680000.adsp: Firmware: ABI 3:22:1 Kernel ABI 3:23:1
[   17.626855] sof-audio-of-mt8186 10680000.adsp: unknown sof_ext_man header type 3 size 0x30
[   17.631797] sof-audio-of-mt8186 10680000.adsp: Firmware info: version 2:0:0-475be
[   17.742162] sof-audio-of-mt8186 10680000.adsp: Firmware: ABI 3:22:1 Kernel ABI 3:23:1
[   17.744509] mtk-ccifreq cci: failed to add devfreq device: -517
[   17.875626] EXT4-fs (sda2): mounted filesystem 605450ef-43fc-41e4-83d7-9c204d5c1c03 r/w with ordered data mode. Quota mode: none.
[   18.093680] audit: type=1400 audit(1726500335.708:2): apparmor="STATUS" operation="profile_load" profile="unconfined" name="libreoffice-senddoc" pid=590 comm="apparmor_parser"
[   18.125082] audit: type=1400 audit(1726500335.712:3): apparmor="STATUS" operation="profile_load" profile="unconfined" name="nvidia_modprobe" pid=585 comm="apparmor_parser"
[   18.125091] audit: type=1400 audit(1726500335.712:4): apparmor="STATUS" operation="profile_load" profile="unconfined" name="nvidia_modprobe//kmod" pid=585 comm="apparmor_parser"
[   18.125096] audit: type=1400 audit(1726500335.712:5): apparmor="STATUS" operation="profile_load" profile="unconfined" name="lsb_release" pid=584 comm="apparmor_parser"
[   18.125101] audit: type=1400 audit(1726500335.712:6): apparmor="STATUS" operation="profile_load" profile="unconfined" name="/usr/bin/man" pid=588 comm="apparmor_parser"
[   18.125106] audit: type=1400 audit(1726500335.712:7): apparmor="STATUS" operation="profile_load" profile="unconfined" name="man_filter" pid=588 comm="apparmor_parser"
[   18.125111] audit: type=1400 audit(1726500335.712:8): apparmor="STATUS" operation="profile_load" profile="unconfined" name="man_groff" pid=588 comm="apparmor_parser"
[   18.306790] audit: type=1400 audit(1726500335.712:9): apparmor="STATUS" operation="profile_load" profile="unconfined" name="libreoffice-oosplash" pid=589 comm="apparmor_parser"
[   18.306797] audit: type=1400 audit(1726500335.720:10): apparmor="STATUS" operation="profile_load" profile="unconfined" name="libreoffice-xpdfimport" pid=595 comm="apparmor_parser"
[   18.306802] audit: type=1400 audit(1726500335.724:11): apparmor="STATUS" operation="profile_load" profile="unconfined" name="/usr/sbin/cups-browsed" pid=596 comm="apparmor_parser"
[   19.050110] mt7921s mmc1:0001:1: Message 00000010 (seq 1) timeout
[   19.062383] mt7921s mmc1:0001:1: Failed to get patch semaphore
[   19.252928] NET: Registered PF_QIPCRTR protocol family
[   24.162158] ------------[ cut here ]------------
[   24.171397] WARNING: CPU: 7 PID: 54 at kernel/kthread.c:76 kthread_park+0x8c/0xe0
[   24.186377] Modules linked in: snd_seq_dummy snd_hrtimer snd_seq snd_seq_device qrtr binfmt_misc nls_ascii nls_cp437 vfat fat mtk_vcodec_dec_hw snd_sof_mt8186 mtk_vcodec_dec joydev mtk_jpeg mtk_adsp_common v4l2_vp9 mt7921s mtk_vcodec_enc mt76_sdio v4l2_h264 aes_ce_blk mtk_adsp_ipn
[   24.186521]  cros_ec_sysfs cros_usbpd_logger led_class_multicolor cros_usbpd_notify mtd tpm_tis_core typec cros_charge_control elan_i2c snd_soc_core mtk_scp snd_compress mt6577_auxadc snd_pcm_dmaengine industrialio lvts_thermal snd_pcm mtk_rpmsg mtk_svs mtk_scp_ipi mtk_adsp_mailb3
[   24.365336]  mtk_cmdq_helper mtk_sd clk_mt8186_mfg phy_mtk_mipi_dsi_drv drm nvmem_mtk_efuse mt6358_regulator cqhci udc_core pwm_mtk_disp usb_common clk_mt8186_apmixedsys mtk_cmdq_mailbox mtk_pmic_wrap spi_mtk_nor i2c_mt65xx clk_mt8186_imp_iic_wrap spi_mt65xx clk_mt8186_topckgen cl
[   24.600571] CPU: 7 UID: 0 PID: 54 Comm: kworker/7:0 Tainted: G      D W          6.11.0-next-20240916-deb-00002-g7b544e01c649 #1
[   24.623719] Tainted: [D]=DIE, [W]=WARN
[   24.631206] Hardware name: Google Magneton board (DT)
[   24.641302] Workqueue: events mt7921_init_work [mt7921_common]
[   24.652972] pstate: 60400009 (nZCv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=--)
[   24.666899] pc : kthread_park+0x8c/0xe0
[   24.674563] lr : mt7921s_init_reset+0x8c/0x248 [mt7921s]
[   24.685186] sp : ffff800080473ce0
[   24.691804] x29: ffff800080473ce0 x28: ffff0307803cef00 x27: ffff0307bf777c68
[   24.706080] x26: ffffac78d07f18c0 x25: ffff0307803cef80 x24: ffff0307897b20c8
[   24.720356] x23: ffff0307897be8c8 x22: ffff0307897b7768 x21: ffff800080473d00
[   24.734631] x20: ffff0307897b7820 x19: ffff0307849f5c80 x18: 0000000000000008
[   24.748908] x17: ffff568eef05e000 x16: ffffac78cf0dd428 x15: 0000000000000040
[   24.763183] x14: ffffffffffffffff x13: 0000000000000339 x12: 0000000000000001
[   24.777459] x11: ffffac78d07cee70 x10: 0000000000000bd0 x9 : ffffac78bc3cf054
[   24.791734] x8 : ffff0307808ae8b0 x7 : 0000000000000004 x6 : 0000000000000000
[   24.806009] x5 : ffff0307bf764348 x4 : ffff0307897b2080 x3 : ffff0307897b7770
[   24.820285] x2 : ffff800080473d18 x1 : 0000000000005800 x0 : 0000000000400040
[   24.834560] Call trace:
[   24.839437]  kthread_park+0x8c/0xe0
[   24.846405]  mt7921s_init_reset+0x8c/0x248 [mt7921s]
[   24.856329]  mt7921_init_work+0xcc/0x228 [mt7921_common]
[   24.866950]  process_one_work+0x178/0x3d0
[   24.874962]  worker_thread+0x200/0x3f0
[   24.882452]  kthread+0xe8/0xf8
[   24.888550]  ret_from_fork+0x10/0x20
[   24.895693] ---[ end trace 0000000000000000 ]---
[   24.904974] Unable to handle kernel NULL pointer dereference at virtual address 0000000000000000
[   24.922563] Mem abort info:
[   24.928143]   ESR = 0x0000000096000004
[   24.935638]   EC = 0x25: DABT (current EL), IL = 32 bits
[   24.946265]   SET = 0, FnV = 0
[   24.952365]   EA = 0, S1PTW = 0
[   24.958641]   FSC = 0x04: level 0 translation fault
[   24.968399] Data abort info:
[   24.974153]   ISV = 0, ISS = 0x00000004, ISS2 = 0x00000000
[   24.985126]   CM = 0, WnR = 0, TnD = 0, TagAccess = 0
[   24.995231]   GCS = 0, Overlay = 0, DirtyBit = 0, Xs = 0
[   25.005858] user pgtable: 4k pages, 48-bit VAs, pgdp=00000001012eb000
[   25.018746] [0000000000000000] pgd=0000000000000000, p4d=0000000000000000
[   25.032335] Internal error: Oops: 0000000096000004 [#2] SMP
[   25.043480] Modules linked in: snd_seq_dummy snd_hrtimer snd_seq snd_seq_device qrtr binfmt_misc nls_ascii nls_cp437 vfat fat mtk_vcodec_dec_hw snd_sof_mt8186 mtk_vcodec_dec joydev mtk_jpeg mtk_adsp_common v4l2_vp9 mt7921s mtk_vcodec_enc mt76_sdio v4l2_h264 aes_ce_blk mtk_adsp_ipn
[   25.043612]  cros_ec_sysfs cros_usbpd_logger led_class_multicolor cros_usbpd_notify mtd tpm_tis_core typec cros_charge_control elan_i2c snd_soc_core mtk_scp snd_compress mt6577_auxadc snd_pcm_dmaengine industrialio lvts_thermal snd_pcm mtk_rpmsg mtk_svs mtk_scp_ipi mtk_adsp_mailb3
[   25.222435]  mtk_cmdq_helper mtk_sd clk_mt8186_mfg phy_mtk_mipi_dsi_drv drm nvmem_mtk_efuse mt6358_regulator cqhci udc_core pwm_mtk_disp usb_common clk_mt8186_apmixedsys mtk_cmdq_mailbox mtk_pmic_wrap spi_mtk_nor i2c_mt65xx clk_mt8186_imp_iic_wrap spi_mt65xx clk_mt8186_topckgen cl
[   25.457674] CPU: 7 UID: 0 PID: 54 Comm: kworker/7:0 Tainted: G      D W          6.11.0-next-20240916-deb-00002-g7b544e01c649 #1
[   25.480825] Tainted: [D]=DIE, [W]=WARN
[   25.488312] Hardware name: Google Magneton board (DT)
[   25.498411] Workqueue: events mt7921_init_work [mt7921_common]
[   25.510083] pstate: 60400009 (nZCv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=--)
[   25.524015] pc : kthread_park+0x2c/0xe0
[   25.531685] lr : mt7921s_init_reset+0x8c/0x248 [mt7921s]
[   25.542318] sp : ffff800080473ce0
[   25.548939] x29: ffff800080473ce0 x28: ffff0307803cef00 x27: ffff0307bf777c68
[   25.563216] x26: ffffac78d07f18c0 x25: ffff0307803cef80 x24: ffff0307897b20c8
[   25.577492] x23: ffff0307897be8c8 x22: ffff0307897b7768 x21: ffff800080473d00
[   25.591769] x20: 0000000000000000 x19: ffff0307849f5c80 x18: 0000000000000008
[   25.606044] x17: ffff568eef05e000 x16: ffffac78cf0dd428 x15: 0000000000000040
[   25.620320] x14: ffffffffffffffff x13: 0000000000000339 x12: 0000000000000001
[   25.634595] x11: ffffac78d07cee70 x10: 0000000000000bd0 x9 : ffffac78bc3cf054
[   25.648869] x8 : ffff0307808ae8b0 x7 : 0000000000000004 x6 : 0000000000000000
[   25.663145] x5 : ffff0307bf764348 x4 : ffff0307897b2080 x3 : ffff0307897b7770
[   25.677420] x2 : ffff800080473d18 x1 : 0000000000005800 x0 : 0000000000400040
[   25.691696] Call trace:
[   25.696574]  kthread_park+0x2c/0xe0
[   25.703541]  mt7921s_init_reset+0x8c/0x248 [mt7921s]
[   25.713466]  mt7921_init_work+0xcc/0x228 [mt7921_common]
[   25.724089]  process_one_work+0x178/0x3d0
[   25.732102]  worker_thread+0x200/0x3f0
[   25.739592]  kthread+0xe8/0xf8
[   25.745689]  ret_from_fork+0x10/0x20
[   25.752832] Code: b9402c00 36a80360 f9431e74 371003a0 (f9400280)
[   25.765018] ---[ end trace 0000000000000000 ]---
[   26.133052] rfkill: input handler disabled
[   27.756379] mtk-ccifreq cci: failed to add devfreq device: -517
[   27.771837] platform cci: deferred probe pending: mtk-ccifreq: devfreq_add_device: Unable to start governor for the device
[   27.794010] platform 1100bc00.svs: deferred probe pending: mtk-svs: failed to get OPP device for bank 3
[   27.812847] platform sound: deferred probe pending: mt8186_mt6366: I2S3: codec dai not found
[   32.523939]  mmcblk0: p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12
[   37.986383] pp1840_vaux18: disabling
[   37.993715] pp2800_vaud28: disabling

Debian GNU/Linux trixie/sid DEBIAN-T5-ARM64 ttyS0

DEBIAN-T5-ARM64 login: alpernebbi
Password:
Linux DEBIAN-T5-ARM64 6.11.0-next-20240916-deb-00002-g7b544e01c649 #1 SMP Mon Sep 16 17:42:49 +03 2024 aarch64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
You have new mail.

[   76.908268] PDLOG 2024/09/16 15:25:11.783 P0 SNK Charger ??? 5025mV max 5000mV / 500mA
[   76.908268] PDLOG 2024/09/16 15:25:11.783 P0 SNK Charger ??? 5025mV max 5000mV / 500mA

$ sudo mount -t debugfs none /sys/kernel/debug
[sudo] password for alpernebbi:

alpernebbi at DEBIAN-T5-ARM64 ~
$ sudo cat /sys/kernel/debug/devices_deferred
cci     mtk-ccifreq: devfreq_add_device: Unable to start governor for the device
1100bc00.svs    mtk-svs: failed to get OPP device for bank 3
sound   mt8186_mt6366: I2S3: codec dai not found

alpernebbi at DEBIAN-T5-ARM64 ~
$ lsmod
Module                  Size  Used by
snd_seq_dummy          12288  0
snd_hrtimer            12288  1
snd_seq                81920  7 snd_seq_dummy
snd_seq_device         12288  1 snd_seq
qrtr                   36864  2
binfmt_misc            20480  1
nls_ascii              12288  1
nls_cp437              16384  1
vfat                   20480  1
fat                    73728  1 vfat
mtk_vcodec_dec_hw      16384  0
snd_sof_mt8186         24576  0
mtk_vcodec_dec        163840  1 mtk_vcodec_dec_hw
joydev                 28672  0
mtk_jpeg               32768  0
mtk_adsp_common        12288  1 snd_sof_mt8186
v4l2_vp9               20480  1 mtk_vcodec_dec
mt7921s                20480  0
mtk_vcodec_enc         61440  0
mt76_sdio              24576  1 mt7921s
v4l2_h264              16384  1 mtk_vcodec_dec
aes_ce_blk             32768  0
mtk_adsp_ipc           16384  1 snd_sof_mt8186
mtk_vcodec_dbgfs       12288  2 mtk_vcodec_enc,mtk_vcodec_dec
mt7921_common          65536  1 mt7921s
mtk_vcodec_common      20480  4 mtk_vcodec_enc,mtk_vcodec_dbgfs,mtk_vcodec_dec,mtk_vcodec_dec_hw
mtk_jpeg_enc_hw        12288  1 mtk_jpeg
aes_ce_cipher          12288  1 aes_ce_blk
mt792x_lib             45056  2 mt7921s,mt7921_common
snd_sof_xtensa_dsp     12288  1 snd_sof_mt8186
crct10dif_ce           12288  1
mt76_connac_lib        53248  3 mt792x_lib,mt7921s,mt7921_common
polyval_ce             12288  0
mtk_jpeg_dec_hw        16384  1 mtk_jpeg
mtk_vpu                20480  1 mtk_vcodec_common
uvcvideo              110592  0
polyval_generic        12288  1 polyval_ce
mt76                   94208  5 mt792x_lib,mt7921s,mt7921_common,mt76_sdio,mt76_connac_lib
ghash_ce               16384  0
videobuf2_vmalloc      16384  1 uvcvideo
videobuf2_dma_contig    20480  3 mtk_jpeg,mtk_vcodec_enc,mtk_vcodec_dec
snd_sof_of             12288  1 snd_sof_mt8186
mac80211              946176  4 mt792x_lib,mt76,mt7921_common,mt76_connac_lib
v4l2_mem2mem           28672  5 mtk_jpeg,mtk_vcodec_enc,mtk_jpeg_dec_hw,mtk_jpeg_enc_hw,mtk_vcodec_dec
uvc                    12288  1 uvcvideo
gf128mul               12288  2 polyval_generic,ghash_ce
panfrost               77824  3
snd_sof               172032  3 snd_sof_mt8186,mtk_adsp_common,snd_sof_of
mt8186_mt6366          49152  0
sha2_ce                12288  0
libarc4                12288  1 mac80211
videobuf2_memops       16384  2 videobuf2_vmalloc,videobuf2_dma_contig
cros_ec_rpmsg          16384  0
cfg80211              856064  4 mt76,mac80211,mt7921_common,mt76_connac_lib
ofpart                 16384  0
sha256_arm64           24576  1 sha2_ce
snd_soc_mt8186_afe    241664  30 mt8186_mt6366
cros_usbpd_charger     20480  0
snd_sof_utils          16384  1 snd_sof
spi_nor               106496  0
cros_ec_typec          24576  0
leds_cros_ec           12288  0
gpu_sched              49152  1 panfrost
snd_soc_dmic           12288  0
tpm_tis_spi            16384  0
videobuf2_v4l2         20480  5 mtk_jpeg,mtk_vcodec_enc,uvcvideo,mtk_vcodec_dec,v4l2_mem2mem
snd_soc_bt_sco         12288  0
sha1_ce                12288  0
snd_soc_rt1015p        16384  0
snd_soc_mt6358         61440  1 snd_soc_mt8186_afe
videodev              253952  6 mtk_jpeg,mtk_vcodec_enc,videobuf2_v4l2,uvcvideo,mtk_vcodec_dec,v4l2_mem2mem
rfkill                 28672  4 cfg80211
videobuf2_common       53248  11 mtk_jpeg,mtk_vcodec_enc,videobuf2_vmalloc,videobuf2_dma_contig,mtk_jpeg_dec_hw,videobuf2_v4l2,mtk_jpeg_enc_hw,uvcvideo,mtk_vcodec_dec,v4l2_mem2mem,videobuf2_memops
drm_shmem_helper       24576  1 panfrost
mc                     61440  6 videodev,videobuf2_v4l2,uvcvideo,videobuf2_common,mtk_vcodec_dec,v4l2_mem2mem
snd_soc_mtk_common     28672  2 snd_soc_mt8186_afe,mt8186_mt6366
snd_soc_rt5682s        81920  0
sbs_battery            20480  0
cros_ec_debugfs        12288  0
cros_ec_chardev        12288  0
cros_ec_hwmon          12288  0
cros_ec_sysfs          12288  0
cros_usbpd_logger      16384  0
led_class_multicolor    12288  1 leds_cros_ec
cros_usbpd_notify      16384  2 cros_ec_typec,cros_usbpd_charger
mtd                    69632  3 spi_nor,ofpart
tpm_tis_core           24576  1 tpm_tis_spi
typec                  61440  1 cros_ec_typec
cros_charge_control    16384  0
elan_i2c               36864  0
snd_soc_core          245760  9 snd_soc_mt8186_afe,mt8186_mt6366,snd_soc_mt6358,snd_sof,snd_soc_bt_sco,snd_soc_mtk_common,snd_soc_rt1015p,snd_soc_dmic,snd_soc_rt5682s
mtk_scp                36864  1 mtk_vcodec_common
snd_compress           24576  2 snd_sof,snd_soc_core
mt6577_auxadc          16384  0
snd_pcm_dmaengine      12288  1 snd_soc_core
industrialio           90112  1 mt6577_auxadc
lvts_thermal           24576  0
snd_pcm               122880  9 snd_soc_mt8186_afe,mt8186_mt6366,snd_sof,snd_soc_mtk_common,snd_compress,snd_soc_core,snd_sof_utils,snd_soc_rt5682s,snd_pcm_dmaengine
mtk_rpmsg              12288  1 mtk_scp
mtk_svs                49152  0
mtk_scp_ipi            12288  2 mtk_vcodec_common,mtk_scp
mtk_adsp_mailbox       12288  2
rpmsg_core             16384  2 mtk_rpmsg,cros_ec_rpmsg
memconsole_coreboot    12288  0
mtk_wdt                12288  1
governor_passive       12288  0
snd_timer              40960  3 snd_seq,snd_hrtimer,snd_pcm
memconsole             12288  1 memconsole_coreboot
vpd_sysfs              12288  0
snd                    94208  12 snd_soc_mt8186_afe,snd_seq,snd_seq_device,mt8186_mt6366,snd_soc_mt6358,snd_sof,snd_timer,snd_compress,snd_soc_core,snd_pcm
ramoops                24576  0
mtk_cci_devfreq        12288  0
soundcore              12288  1 snd
reed_solomon           16384  1 ramoops
sg                     32768  0
evdev                  20480  7
efi_pstore             12288  0
configfs               49152  1
nfnetlink              16384  1
ip_tables              24576  0
x_tables               32768  1 ip_tables
autofs4                49152  2
ext4                  786432  2
crc32c_generic         12288  4
crc16                  12288  1 ext4
mbcache                16384  1 ext4
jbd2                  135168  1 ext4
sd_mod                 61440  4
uas                    24576  0
usb_storage            73728  5 uas
scsi_mod              233472  4 sd_mod,usb_storage,uas,sg
scsi_common            12288  5 scsi_mod,sd_mod,usb_storage,uas,sg
onboard_usb_dev        16384  0
xhci_mtk_hcd           28672  0
xhci_hcd              253952  1 xhci_mtk_hcd
usbcore               278528  6 xhci_hcd,onboard_usb_dev,usb_storage,uvcvideo,xhci_mtk_hcd,uas
panel_edp              32768  0
cros_ec_keyb           16384  0
i2c_hid_of             12288  0
i2c_cros_ec_tunnel     12288  0
matrix_keymap          12288  1 cros_ec_keyb
rtc_mt6397             12288  1
cros_ec_dev            12288  0
anx7625                49152  0
i2c_hid                36864  1 i2c_hid_of
hid                   229376  1 i2c_hid
clk_mt8186_mm          12288  26
drm_dp_aux_bus         12288  2 anx7625,panel_edp
mt6397                 24576  0
cros_ec_spi            20480  0
cros_ec                16384  2 cros_ec_spi,cros_ec_rpmsg
gpio_keys              16384  0
clk_mt8186_ipe         12288  8
mediatek_drm          139264  4
clk_mt8186_mdp         12288  2
drm_display_helper    143360  3 anx7625,panel_edp,mediatek_drm
phy_mtk_tphy           28672  3
clk_mt8186_mcu         12288  0
clk_mt8186_cam         12288  9
mtk_iommu              32768  8
drm_dma_helper         16384  2 mediatek_drm
clk_mt8186_vdec        12288  5
clk_mt8186_venc        12288  5
mtk_smi                20480  0
clk_mt8186_wpe         12288  4
drm_kms_helper        139264  5 anx7625,drm_dma_helper,drm_shmem_helper,drm_display_helper,mediatek_drm
mtk_mutex              20480  1 mediatek_drm
mtk_mmsys              24576  1 mediatek_drm
clk_mt8186_img         12288  5
mtu3                  106496  0
mtk_cmdq_helper        16384  3 mtk_mmsys,mtk_mutex,mediatek_drm
mtk_sd                 49152  0
clk_mt8186_mfg         12288  2
phy_mtk_mipi_dsi_drv    20480  2
drm                   479232  15 gpu_sched,i2c_hid,anx7625,drm_kms_helper,drm_dma_helper,panel_edp,drm_shmem_helper,drm_display_helper,mediatek_drm,panfrost
nvmem_mtk_efuse        12288  0
mt6358_regulator       45056  25
cqhci                  24576  1 mtk_sd
udc_core               53248  1 mtu3
pwm_mtk_disp           12288  1
usb_common             12288  6 xhci_hcd,usbcore,uvcvideo,xhci_mtk_hcd,mtu3,udc_core
clk_mt8186_apmixedsys    12288  0
mtk_cmdq_mailbox       20480  2 mtk_cmdq_helper
mtk_pmic_wrap          36864  0
spi_mtk_nor            20480  0
i2c_mt65xx             28672  0
clk_mt8186_imp_iic_wrap    12288  5
spi_mt65xx             24576  0
clk_mt8186_topckgen    20480  47
clk_mt8186_infra_ao    20480  43
fixed                  16384  45
pwm_bl                 16384  0

alpernebbi at DEBIAN-T5-ARM64 ~
$ cat /etc/modprobe.d/mtk.conf
softdep mtk_smi pre: mtk-pmic-wrap mt6358-regulator
softdep mtk_iommu pre: mtk_smi
softdep mtk-sd pre: mt6358-regulator
softdep mtu3 pre: mt6358-regulator
softdep mediatek-drm pre: mt6358-regulator mtk_iommu

alpernebbi at DEBIAN-T5-ARM64 ~
$ sudo systemctl poweroff

[  348.928608] rfkill: input handler enabled
[  349.278237] coredump: 2541(plymouthd): over coredump resource limit, skipping core dump
[  349.294278] coredump: 2541(plymouthd): coredump has not been created, error -7
[  349.550635] detected fb_set_par error, error code: -16
[  OK  ] Stopped session-1.scope - Session 1 of User alpernebbi.
         Stopping user at 1000.service - User Manager for UID 1000...
[  OK  ] Stopped user at 1000.service - User Manager for UID 1000.
         Stopping systemd-user-sessions.service - Permit User Sessions...
         Stopping user-runtime-dir at 1000.ser?Runtime Directory /run/user/1000...
[  OK  ] Stopped systemd-user-sessions.service - Permit User Sessions.
[  OK  ] Unmounted run-user-1000.mount - /run/user/1000.
[  OK  ] Stopped user-runtime-dir at 1000.serv?r Runtime Directory /run/user/1000.
[  OK  ] Removed slice user-1000.slice - User Slice of UID 1000.
[  OK  ] Stopped target network.target - Network.
[  OK  ] Stopped target remote-fs.target - Remote File Systems.
         Stopping NetworkManager.service - Network Manager...
         Stopping networking.service - Raise network interfaces...
         Stopping systemd-logind.service - User Login Management...
         Stopping wpa_supplicant.service - WPA supplicant...
[  OK  ] Stopped NetworkManager.service - Network Manager.
[  OK  ] Stopped wpa_supplicant.service - WPA supplicant.
[  OK  ] Stopped systemd-logind.service - User Login Management.
[  OK  ] Stopped target nss-user-lookup.target - User and Group Name Lookups.
         Stopping dbus.service - D-Bus System Message Bus...
[  OK  ] Stopped dbus.service - D-Bus System Message Bus.
[  OK  ] Stopped networking.service - Raise network interfaces.
[  OK  ] Stopped target basic.target - Basic System.
[  OK  ] Stopped systemd-ask-password-plymo?quests to Plymouth Directory Watch.
[  OK  ] Stopped target paths.target - Path Units.
[  OK  ] Stopped cups.path - CUPS Scheduler.
[  OK  ] Stopped target slices.target - Slice Units.
[  OK  ] Removed slice user.slice - User and Session Slice.
[  OK  ] Stopped target sockets.target - Socket Units.
[  OK  ] Closed avahi-daemon.socket - Avahi?DNS/DNS-SD Stack Activation Socket.
[  OK  ] Closed cups.socket - CUPS Scheduler.
[  OK  ] Closed dbus.socket - D-Bus System Message Bus Socket.
[  OK  ] Closed sshd-unix-local.socket - Op?temd-ssh-generator, AF_UNIX Local).
[  OK  ] Closed systemd-hostnamed.socket - Hostname Service Socket.
[  OK  ] Stopped target sysinit.target - System Initialization.
[  OK  ] Stopped target cryptsetup.target - Local Encrypted Volumes.
[  OK  ] Stopped systemd-ask-password-wall.?d Requests to Wall Directory Watch.
[  OK  ] Stopped target integritysetup.targ? Local Integrity Protected Volumes.
[  OK  ] Stopped target veritysetup.target - Local Verity Protected Volumes.
         Stopping systemd-backlight at backlig?ness of backlight:backlight-lcd0...
         Stopping systemd-binfmt.service - Set Up Additional Binary Formats...
[  OK  ] Stopped systemd-sysctl.service - Apply Kernel Variables.
[  OK  ] Stopped systemd-modules-load.service - Load Kernel Modules.
         Stopping systemd-timesyncd.service - Network Time Synchronization...
         Stopping systemd-update-utmp.servi?ord System Boot/Shutdown in UTMP...
[  OK  ] Stopped systemd-backlight at backligh?htness of backlight:backlight-lcd0.
[  OK  ] Stopped systemd-timesyncd.service - Network Time Synchronization.
[  OK  ] Stopped systemd-binfmt.service - Set Up Additional Binary Formats.
[  OK  ] Removed slice system-systemd\x2dba? - Slice /system/systemd-backlight.
[  OK  ] Unset automount proc-sys-fs-binfmt?ormats File System Automount Point.
[  OK  ] Stopped systemd-update-utmp.servic?ecord System Boot/Shutdown in UTMP.
[  OK  ] Stopped systemd-tmpfiles-setup.ser?reate System Files and Directories.
[  OK  ] Stopped target local-fs.target - Local File Systems.
         Unmounting boot-efi.mount - /boot/efi...
         Unmounting home.mount - /home...
         Unmounting run-lock.mount - Legacy Locks Directory /run/lock...
         Unmounting tmp.mount - Temporary Directory /tmp...
[  OK  ] Unmounted run-lock.mount - Legacy Locks Directory /run/lock.
[  OK  ] Unmounted tmp.mount - Temporary Directory /tmp.
[  OK  ] Stopped target swap.target - Swaps.
         Deactivating swap dev-disk-by\x2dd?p - /dev/disk/by-diskseq/4-part6...
[  OK  ] Unmounted boot-efi.mount - /boot/efi.
[  OK  ] Stopped systemd-fsck at dev-disk-by\x?eck on /dev/disk/by-uuid/9409-DA15.
[  OK  ] Deactivated swap dev-disk-by\x2dpa?8079f9-9be3-4040-b0c6-135b958b076c.
[  OK  ] Deactivated swap dev-disk-by\x2did?able_SSD_T5_1234567E4FF2-0:0-part6.
[  OK  ] Deactivated swap dev-disk-by\x2dpa?8079f9-9be3-4040-b0c6-135b958b076c.
[  OK  ] Deactivated swap dev-disk-by\x2dpa?da49dd-921b-4e87-9b65-3ecbd9905707.
[  OK  ] Deactivated swap dev-disk-by\x2ddi?wap - /dev/disk/by-diskseq/4-part6.
[  OK  ] Deactivated swap dev-disk-by\x2did?table_SSD_T5_S46UNV0M200584Z-part6.
[  OK    351.791891] EXT4-fs (sda2): unmounting filesystem 605450ef-43fc-41e4-83d7-9c204d5c1c03.
0m] Deactivated [swap dev-disk-by\x2did?by-id/wwn-0x5002538e00000000-part6.
  351.791891] EXT4-fs (sda2): unmounting filesystem 605450ef-43fc-41e4-83d7-9c204d5c1c03.
[  OK  ] Deactivated swap dev-disk-by\x2dpa?1.0-scsi-0:0:0:0-part/by-partnum/6.
[  OK  ] Deactivated swap dev-disk-by\x2dpa?b-usb-0:1.2:1.0-scsi-0:0:0:0-part6.
[  OK  ] Deactivated swap dev-disk-by\x2dpa?-0:0:0:0-part/by-partlabel/SWAP-T5.
[  OK  ] Deactivated swap dev-disk-by\x2dpa?usbv3-0:1.2:1.0-scsi-0:0:0:0-part6.
[  OK  ] Deactivated swap dev-disk-by\x2dpa?p - /dev/disk/by-partlabel/SWAP-T5.
[  OK  ] Deactivated swap dev-sda6.swap - /dev/sda6.
[  OK  ] Unmounted home.mount - /home.
[  OK  ] Deactivated swap dev-disk-by\x2duu?da49dd-921b-4e87-9b65-3ecbd9905707.
[  OK  ] Reached target umount.target - Unmount All Filesystems.
[  OK  ] Stopped systemd-fsck at dev-disk-by\x?5450ef-43fc-41e4-83d7-9c204d5c1c03.
[  OK  ] Removed slice system-systemd\x2dfs?slice - Slice /system/systemd-fsck.
[  OK  ] Stopped target local-fs-pre.target?Preparation for Local File Systems.
[  OK  ] Stopped systemd-remount-fs.service?mount Root and Kernel File Systems.
[  OK  ] Stopped systemd-tmpfiles-setup-dev?Create Static Device Nodes in /dev.
[  OK  ] Stopped systemd-tmpfiles-setup-dev?ic Device Nodes in /dev gracefully.
[  OK  ] Reached target shutdown.target - System Shutdown.
[  OK  ] Reached target final.target - Late Shutdown Services.
[  OK  ] Finished systemd-poweroff.service - System Power Off.


From lorenzo at kernel.org  Mon Sep 16 16:44:02 2024
From: lorenzo at kernel.org (Lorenzo Bianconi)
Date: Tue, 17 Sep 2024 01:44:02 +0200
Subject: BUG and WARNINGs from mt7921s on next-20240916
In-Reply-To: <144fbf79-950c-4cd1-bc68-4e00b47b03e9@gmail.com>
References: <144fbf79-950c-4cd1-bc68-4e00b47b03e9@gmail.com>
Message-ID: <ZujCwvd4XiwljDyv@lore-desk>

> Hi,
> 
> I ran into some bug messages while testing linux-next on a MT8186
> Magneton Chromebook (mt8186-corsola-magneton-sku393218). It boots 
> to the OS, but at least Wi-Fi and Bluetooth are unavailable.
> 
> As a start, I tried reverting commit abbd838c579e ("Merge tag 
> 'mt76-for-kvalo-2024-09-06' of https://github.com/nbd168/wireless")
> and it works fine after that. Didn't have time to do a full bisect, 
> but will try if nobody has any immediate opinions.
> 
> There are a few traces, here's some select lines to catch your attention,
> not sure how informational they are:
> 
> [   16.040525] kernel BUG at net/core/skbuff.c:2268!
> [   16.040531] Internal error: Oops - BUG: 00000000f2000800 [#1] SMP
> [   16.040803] CPU: 3 UID: 0 PID: 526 Comm: mt76-sdio-txrx  Not tainted 6.11.0-next-20240916-deb-00002-g7b544e01c649 #1
> [   16.040897] Call trace:
> [   16.040899]  pskb_expand_head+0x2b0/0x3c0
> [   16.040905]  mt76s_tx_run_queue+0x274/0x410 [mt76_sdio]
> [   16.040909]  mt76s_txrx_worker+0xe4/0xac8 [mt76_sdio]
> [   16.040914]  mt7921s_txrx_worker+0x98/0x1e0 [mt7921s]
> [   16.040924]  __mt76_worker_fn+0x80/0x128 [mt76]
> [   16.040934]  kthread+0xe8/0xf8
> [   16.040940]  ret_from_fork+0x10/0x20

Hi,

I guess this issue has been introduced by the following commit:

commit 3688c18b65aeb2a1f2fde108400afbab129a8cc1
Author: Felix Fietkau <nbd at nbd.name>
Date:   Tue Aug 27 11:30:01 2024 +0200                  

    wifi: mt76: mt7915: retry mcu messages                                            
                        
    In some cases MCU messages can get lost. Instead of failing completely,
    attempt to recover by re-sending them.
     
    Link: https://patch.msgid.link/20240827093011.18621-14-nbd at nbd.name
    Signed-off-by: Felix Fietkau <nbd at nbd.name>


In particular, skb_get() in mt76_mcu_skb_send_and_get_msg() is bumping skb users
refcount (making the skb shared) and pskb_expand_head() (run by __skb_grow() in
mt76s_tx_run_queue()) does not like shared skbs.

@Felix: any input on it?

Regards,
Lorenzo

> 
> [   16.046045] note: mt76-sdio-txrx [526] exited with irqs disabled
> 
> [   16.805325] WARNING: CPU: 3 PID: 0 at kernel/context_tracking.c:128 ct_kernel_exit.isra.0+0xa0/0xa8
> [   16.805630] Tainted: [D]=DIE
> 
> [   19.050110] mt7921s mmc1:0001:1: Message 00000010 (seq 1) timeout
> [   19.062383] mt7921s mmc1:0001:1: Failed to get patch semaphore
> 
> [   24.171397] WARNING: CPU: 7 PID: 54 at kernel/kthread.c:76 kthread_park+0x8c/0xe0
> [   24.623719] Tainted: [D]=DIE, [W]=WARN
> [   24.641302] Workqueue: events mt7921_init_work [mt7921_common]
> [   24.834560] Call trace:
> [   24.839437]  kthread_park+0x8c/0xe0
> [   24.846405]  mt7921s_init_reset+0x8c/0x248 [mt7921s]
> [   24.856329]  mt7921_init_work+0xcc/0x228 [mt7921_common]
> [   24.866950]  process_one_work+0x178/0x3d0
> [   24.874962]  worker_thread+0x200/0x3f0
> [   24.882452]  kthread+0xe8/0xf8
> [   24.888550]  ret_from_fork+0x10/0x20
> 
> [   24.904974] Unable to handle kernel NULL pointer dereference at virtual address 0000000000000000
> [   25.032335] Internal error: Oops: 0000000096000004 [#2] SMP
> 
> I'm pasting the full log below with some more data. (Though I get 
> duplicate output from serial console, and had to sort -n | uniq, 
> hoping it didn't mess up anything).
> 
> ------ 8< ------
> 
> [    0.000000] Booting Linux on physical CPU 0x0000000000 [0x411fd050]
> [    0.000000] Linux version 6.11.0-next-20240916-deb-00002-g7b544e01c649 (alpernebbi at ALPER-PC) (aarch64-linux-gnu-gcc (Debian 14.2.0-1) 14.2.0, GNU ld (GNU Binutils for Debian) 2.43.1) #1 SMP Mon Sep 16 17:42:49 +03 2024
> [    0.000000] KASLR enabled
> [    0.000000] random: crng init done
> [    0.000000] Machine model: Google Magneton board
> [    0.000000] printk: debug: skip boot console de-registration.
> [    0.000000] efi: UEFI not found.
> [    0.000000] Reserved memory: created DMA memory pool at 0x0000000050000000, size 16 MiB
> [    0.000000] OF: reserved mem: initialized node memory at 50000000, compatible id shared-dma-pool
> [    0.000000] OF: reserved mem: 0x0000000050000000..0x000000005109ffff (17024 KiB) nomap non-reusable memory at 50000000
> [    0.000000] Reserved memory: created DMA memory pool at 0x0000000060000000, size 16 MiB
> [    0.000000] OF: reserved mem: initialized node memory at 60000000, compatible id shared-dma-pool
> [    0.000000] OF: reserved mem: 0x0000000060000000..0x0000000060ffffff (16384 KiB) nomap non-reusable memory at 60000000
> [    0.000000] Reserved memory: created DMA memory pool at 0x0000000061000000, size 1 MiB
> [    0.000000] OF: reserved mem: initialized node memory at 61000000, compatible id shared-dma-pool
> [    0.000000] OF: reserved mem: 0x0000000061000000..0x00000000610fffff (1024 KiB) nomap non-reusable memory at 61000000
> [    0.000000] OF: reserved mem: 0x00000000ffec5000..0x00000000fffc4fff (1024 KiB) map non-reusable ramoops
> [    0.000000] earlycon: mtk8250 at MMIO32 0x0000000011002000 (options '115200n8')
> [    0.000000] printk: legacy bootconsole [mtk8250] enabled
> [    0.000000] NUMA: Faking a node at [mem 0x0000000040000000-0x000000013fffffff]
> [    0.000000] NODE_DATA(0) allocated [mem 0x13f7a8ec0-0x13f7abc7f]
> [    0.000000] Zone ranges:
> [    0.000000]   DMA      [mem 0x0000000040000000-0x00000000ffffffff]
> [    0.000000]   DMA32    empty
> [    0.000000]   Normal   [mem 0x0000000100000000-0x000000013fffffff]
> [    0.000000] Movable zone start for each node
> [    0.000000] Early memory node ranges
> [    0.000000]   node   0: [mem 0x0000000040000000-0x000000004fffffff]
> [    0.000000]   node   0: [mem 0x0000000050000000-0x000000005109ffff]
> [    0.000000]   node   0: [mem 0x00000000510a0000-0x00000000545fffff]
> [    0.000000]   node   0: [mem 0x0000000054700000-0x000000005fffffff]
> [    0.000000]   node   0: [mem 0x0000000060000000-0x00000000610fffff]
> [    0.000000]   node   0: [mem 0x0000000061100000-0x0000000069ffffff]
> [    0.000000]   node   0: [mem 0x000000006a100000-0x00000000ffdfffff]
> [    0.000000]   node   0: [mem 0x0000000100000000-0x000000013fffffff]
> [    0.000000] Initmem setup node 0 [mem 0x0000000040000000-0x000000013fffffff]
> [    0.000000] On node 0, zone DMA: 256 pages in unavailable ranges
> [    0.000000] On node 0, zone DMA: 256 pages in unavailable ranges
> [    0.000000] On node 0, zone Normal: 512 pages in unavailable ranges
> [    0.000000] cma: Reserved 64 MiB at 0x00000000fbe00000 on node -1
> [    0.000000] psci: probing for conduit method from DT.
> [    0.000000] psci: PSCIv1.1 detected in firmware.
> [    0.000000] psci: Using standard PSCI v0.2 function IDs
> [    0.000000] psci: MIGRATE_INFO_TYPE not supported.
> [    0.000000] psci: SMC Calling Convention v1.2
> [    0.000000] percpu: Embedded 34 pages/cpu s100568 r8192 d30504 u139264
> [    0.000000] Detected VIPT I-cache on CPU0
> [    0.000000] CPU features: detected: GIC system register CPU interface
> [    0.000000] CPU features: detected: Virtualization Host Extensions
> [    0.000000] CPU features: kernel page table isolation forced ON by KASLR
> [    0.000000] CPU features: detected: Kernel page table isolation (KPTI)
> [    0.000000] CPU features: detected: ARM errata 1165522, 1319367, or 1530923
> [    0.000000] alternatives: applying boot alternatives
> [    0.000000] Kernel command line: cros_secure kern_guid=882c31a2-0695-4426-94bd-abb0f691866e earlycon keep_bootcon splash plymouth.ignore-serial-consoles ipv6.disable=1 root=UUID=c16826e5-0b66-4648-87db-8a2601010f0a
> [    0.000000] Unknown kernel command line parameters "cros_secure splash kern_guid=882c31a2-0695-4426-94bd-abb0f691866e", will be passed to user space.
> [    0.000000] Dentry cache hash table entries: 524288 (order: 10, 4194304 bytes, linear)
> [    0.000000] Inode-cache hash table entries: 262144 (order: 9, 2097152 bytes, linear)
> [    0.000000] Fallback order for Node 0: 0
> [    0.000000] Built 1 zonelists, mobility grouping on.  Total pages: 1047552
> [    0.000000] Policy zone: Normal
> [    0.000000] mem auto-init: stack:all(zero), heap alloc:on, heap free:off
> [    0.000000] software IO TLB: area num 8.
> [    0.000000] software IO TLB: mapped [mem 0x00000000f7e00000-0x00000000fbe00000] (64MB)
> [    0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=8, Nodes=1
> [    0.000000] ftrace: allocating 49524 entries in 194 pages
> [    0.000000] ftrace: allocated 194 pages with 3 groups
> [    0.000000] trace event string verifier disabled
> [    0.000000] rcu: Hierarchical RCU implementation.
> [    0.000000] rcu:     RCU restricting CPUs from NR_CPUS=512 to nr_cpu_ids=8.
> [    0.000000]  Rude variant of Tasks RCU enabled.
> [    0.000000]  Tracing variant of Tasks RCU enabled.
> [    0.000000] rcu: RCU calculated value of scheduler-enlistment delay is 25 jiffies.
> [    0.000000] rcu: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=8
> [    0.000000] RCU Tasks Rude: Setting shift to 3 and lim to 1 rcu_task_cb_adjust=1 rcu_task_cpu_ids=8.
> [    0.000000] RCU Tasks Trace: Setting shift to 3 and lim to 1 rcu_task_cb_adjust=1 rcu_task_cpu_ids=8.
> [    0.000000] NR_IRQS: 64, nr_irqs: 64, preallocated irqs: 0
> [    0.000000] GICv3: GIC: Using split EOI/Deactivate mode
> [    0.000000] GICv3: 480 SPIs implemented
> [    0.000000] GICv3: 0 Extended SPIs implemented
> [    0.000000] Root IRQ handler: gic_handle_irq
> [    0.000000] GICv3: GICv3 features: 16 PPIs
> [    0.000000] GICv3: GICD_CTRL.DS=0, SCR_EL3.FIQ=0
> [    0.000000] GICv3: CPU0: found redistributor 0 region 0:0x000000000c040000
> [    0.000000] GICv3: GIC: PPI partition interrupt-partition-0[0] { /cpus/cpu at 0[0] /cpus/cpu at 100[1] /cpus/cpu at 200[2] /cpus/cpu at 300[3] /cpus/cpu at 400[4] /cpus/cpu at 500[5] }
> [    0.000000] GICv3: GIC: PPI partition interrupt-partition-1[1] { /cpus/cpu at 600[6] /cpus/cpu at 700[7] }
> [    0.000000] rcu: srcu_init: Setting srcu_struct sizes based on contention.
> [    0.000000] arch_timer: cp15 timer(s) running at 13.00MHz (phys).
> [    0.000000] clocksource: arch_sys_counter: mask: 0xffffffffffffff max_cycles: 0x2ff89eacb, max_idle_ns: 440795202429 ns
> [    0.000000] sched_clock: 56 bits at 13MHz, resolution 76ns, wraps every 4398046511101ns
> [    0.008965] Console: colour dummy device 80x25
> [    0.013443] printk: legacy console [tty0] enabled
> [    0.018257] Calibrating delay loop (skipped), value calculated using timer frequency.. 26.00 BogoMIPS (lpj=52000)
> [    0.028601] pid_max: default: 32768 minimum: 301
> [    0.033338] LSM: initializing lsm=lockdown,capability,landlock,yama,apparmor,tomoyo,bpf,ima,evm
> [    0.042220] landlock: Up and running.
> [    0.045902] Yama: becoming mindful.
> [    0.049564] AppArmor: AppArmor initialized
> [    0.053734] TOMOYO Linux initialized
> [    0.057678] LSM support for eBPF active
> [    0.061659] Mount-cache hash table entries: 8192 (order: 4, 65536 bytes, linear)
> [    0.069119] Mountpoint-cache hash table entries: 8192 (order: 4, 65536 bytes, linear)
> [    0.077902] psi: inconsistent task state! task=2:kthreadd cpu=0 psi_flags=4 clear=0 set=4
> [    0.101305] rcu: Hierarchical SRCU implementation.
> [    0.106134] rcu:     Max phase no-delay instances is 1000.
> [    0.111537] Timer migration: 1 hierarchy levels; 8 children per group; 1 crossnode level
> [    0.121373] EFI services will not be available.
> [    0.126188] smp: Bringing up secondary CPUs ...
> [    0.142890] Detected VIPT I-cache on CPU1
> [    0.142948] GICv3: CPU1: found redistributor 100 region 0:0x000000000c060000
> [    0.142981] CPU1: Booted secondary processor 0x0000000100 [0x411fd050]
> [    0.158933] Detected VIPT I-cache on CPU2
> [    0.158971] GICv3: CPU2: found redistributor 200 region 0:0x000000000c080000
> [    0.158990] CPU2: Booted secondary processor 0x0000000200 [0x411fd050]
> [    0.174900] Detected VIPT I-cache on CPU3
> [    0.174934] GICv3: CPU3: found redistributor 300 region 0:0x000000000c0a0000
> [    0.174949] CPU3: Booted secondary processor 0x0000000300 [0x411fd050]
> [    0.186930] Detected VIPT I-cache on CPU4
> [    0.186965] GICv3: CPU4: found redistributor 400 region 0:0x000000000c0c0000
> [    0.186980] CPU4: Booted secondary processor 0x0000000400 [0x411fd050]
> [    0.202962] Detected VIPT I-cache on CPU5
> [    0.202997] GICv3: CPU5: found redistributor 500 region 0:0x000000000c0e0000
> [    0.203013] CPU5: Booted secondary processor 0x0000000500 [0x411fd050]
> [    0.215071] CPU features: detected: Spectre-v4
> [    0.215076] CPU features: detected: Spectre-BHB
> [    0.215078] CPU features: detected: ARM erratum 1418040
> [    0.215080] CPU features: detected: ARM erratum 1463225
> [    0.215083] CPU features: detected: SSBS not fully self-synchronizing
> [    0.215086] Detected PIPT I-cache on CPU6
> [    0.215122] GICv3: CPU6: found redistributor 600 region 0:0x000000000c100000
> [    0.215129] arch_timer: Enabling local workaround for ARM erratum 1418040
> [    0.215138] CPU6: Booted secondary processor 0x0000000600 [0x413fd0b0]
> [    0.227031] Detected PIPT I-cache on CPU7
> [    0.227072] GICv3: CPU7: found redistributor 700 region 0:0x000000000c120000
> [    0.227079] arch_timer: Enabling local workaround for ARM erratum 1418040
> [    0.227089] CPU7: Booted secondary processor 0x0000000700 [0x413fd0b0]
> [    0.227165] smp: Brought up 1 node, 8 CPUs
> [    0.394862] SMP: Total of 8 processors activated.
> [    0.399598] CPU: All CPU(s) started at EL2
> [    0.403721] CPU features: detected: 32-bit EL0 Support
> [    0.408894] CPU features: detected: Data cache clean to the PoU not required for I/D coherence
> [    0.417569] CPU features: detected: Common not Private translations
> [    0.423880] CPU features: detected: CRC32 instructions
> [    0.429053] CPU features: detected: Data cache clean to Point of Persistence
> [    0.436154] CPU features: detected: RCpc load-acquire (LDAPR)
> [    0.441939] CPU features: detected: LSE atomic instructions
> [    0.447549] CPU features: detected: Privileged Access Never
> [    0.453159] CPU features: detected: RAS Extension Support
> [    0.458596] CPU features: detected: Speculative Store Bypassing Safe (SSBS)
> [    0.465651] alternatives: applying system-wide alternatives
> [    0.474307] CPU features: detected: Hardware dirty bit management on CPU6-7
> [    0.483969] node 0 deferred pages initialised in 0ms
> [    0.489026] Memory: 3885480K/4190208K available (15232K kernel code, 3446K rwdata, 6172K rodata, 2752K init, 828K bss, 233796K reserved, 65536K cma-reserved)
> [    0.503982] devtmpfs: initialized
> [    0.512758] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 7645041785100000 ns
> [    0.522597] futex hash table entries: 2048 (order: 5, 131072 bytes, linear)
> [    0.530137] 2G module region forced by RANDOMIZE_MODULE_REGION_FULL
> [    0.536454] 0 pages in range for non-PLT usage
> [    0.536456] 517120 pages in range for PLT usage
> [    0.541048] pinctrl core: initialized pinctrl subsystem
> [    0.551959] DMI not present or invalid.
> [    0.557522] NET: Registered PF_NETLINK/PF_ROUTE protocol family
> [    0.564171] DMA: preallocated 512 KiB GFP_KERNEL pool for atomic allocations
> [    0.571392] DMA: preallocated 512 KiB GFP_KERNEL|GFP_DMA pool for atomic allocations
> [    0.579376] DMA: preallocated 512 KiB GFP_KERNEL|GFP_DMA32 pool for atomic allocations
> [    0.587374] audit: initializing netlink subsys (disabled)
> [    0.592918] audit: type=2000 audit(0.456:1): state=initialized audit_enabled=0 res=1
> [    0.593759] thermal_sys: Registered thermal governor 'fair_share'
> [    0.600728] thermal_sys: Registered thermal governor 'bang_bang'
> [    0.606868] thermal_sys: Registered thermal governor 'step_wise'
> [    0.612915] thermal_sys: Registered thermal governor 'user_space'
> [    0.618962] thermal_sys: Registered thermal governor 'power_allocator'
> [    0.625120] cpuidle: using governor ladder
> [    0.635828] cpuidle: using governor menu
> [    0.639853] hw-breakpoint: found 6 breakpoint and 4 watchpoint registers.
> [    0.646795] ASID allocator initialised with 32768 entries
> [    0.652534] Serial: AMBA PL011 UART driver
> [    0.669191] platform 14013000.dsi: Fixed dependency cycle(s) with /soc/i2c at 11007000/anx7625 at 58
> [    0.683157] HugeTLB: registered 1.00 GiB page size, pre-allocated 0 pages
> [    0.690008] HugeTLB: 0 KiB vmemmap can be freed for a 1.00 GiB page
> [    0.696320] HugeTLB: registered 32.0 MiB page size, pre-allocated 0 pages
> [    0.703155] HugeTLB: 0 KiB vmemmap can be freed for a 32.0 MiB page
> [    0.709465] HugeTLB: registered 2.00 MiB page size, pre-allocated 0 pages
> [    0.716300] HugeTLB: 0 KiB vmemmap can be freed for a 2.00 MiB page
> [    0.722610] HugeTLB: registered 64.0 KiB page size, pre-allocated 0 pages
> [    0.729444] HugeTLB: 0 KiB vmemmap can be freed for a 64.0 KiB page
> [    0.736952] ACPI: Interpreter disabled.
> [    0.741402] iommu: Default domain type: Translated
> [    0.746234] iommu: DMA domain TLB invalidation policy: strict mode
> [    0.752768] pps_core: LinuxPPS API ver. 1 registered
> [    0.757772] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <giometti at linux.it>
> [    0.766979] PTP clock support registered
> [    0.770935] EDAC MC: Ver: 3.0.0
> [    0.774223] scmi_core: SCMI protocol bus registered
> [    0.779959] NetLabel: Initializing
> [    0.783386] NetLabel:  domain hash size = 128
> [    0.787769] NetLabel:  protocols = UNLABELED CIPSOv4 CALIPSO
> [    0.793494] NetLabel:  unlabeled traffic allowed by default
> [    0.799193] vgaarb: loaded
> [    0.802085] clocksource: Switched to clocksource arch_sys_counter
> [    0.808449] VFS: Disk quotas dquot_6.6.0
> [    0.812426] VFS: Dquot-cache hash table entries: 512 (order 0, 4096 bytes)
> [    0.819644] AppArmor: AppArmor Filesystem Enabled
> [    0.824418] pnp: PnP ACPI: disabled
> [    0.831557] NET: Registered PF_INET protocol family
> [    0.836577] IP idents hash table entries: 65536 (order: 7, 524288 bytes, linear)
> [    0.845917] tcp_listen_portaddr_hash hash table entries: 2048 (order: 3, 32768 bytes, linear)
> [    0.854563] Table-perturb hash table entries: 65536 (order: 6, 262144 bytes, linear)
> [    0.862445] TCP established hash table entries: 32768 (order: 6, 262144 bytes, linear)
> [    0.870701] TCP bind hash table entries: 32768 (order: 8, 1048576 bytes, linear)
> [    0.878864] TCP: Hash tables configured (established 32768 bind 32768)
> [    0.885579] MPTCP token hash table entries: 4096 (order: 4, 98304 bytes, linear)
> [    0.893082] UDP hash table entries: 2048 (order: 4, 65536 bytes, linear)
> [    0.899906] UDP-Lite hash table entries: 2048 (order: 4, 65536 bytes, linear)
> [    0.907234] NET: Registered PF_UNIX/PF_LOCAL protocol family
> [    0.912951] NET: Registered PF_XDP protocol family
> [    0.917781] PCI: CLS 0 bytes, default 64
> [    0.921833] Trying to unpack rootfs image as initramfs...
> [    0.928838] kvm [1]: nv: 554 coarse grained trap handlers
> [    0.934554] kvm [1]: IPA Size Limit: 40 bits
> [    0.938885] kvm [1]: GICv3: no GICV resource entry
> [    0.943713] kvm [1]: disabling GICv2 emulation
> [    0.948200] kvm [1]: GIC system register CPU interface enabled
> [    0.954090] kvm [1]: vgic interrupt IRQ18
> [    0.958142] kvm [1]: VHE mode initialized successfully
> [    0.964122] Initialise system trusted keyrings
> [    0.968623] Key type blacklist registered
> [    0.972741] workingset: timestamp_bits=42 max_order=20 bucket_order=0
> [    0.979253] zbud: loaded
> [    0.981973] fuse: init (API version 7.41)
> [    0.986202] integrity: Platform Keyring initialized
> [    0.991123] integrity: Machine keyring initialized
> [    0.995953] Key type asymmetric registered
> [    1.000075] Asymmetric key parser 'x509' registered
> [    5.868941] Freeing initrd memory: 22892K
> [    5.886908] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 246)
> [    5.894458] io scheduler mq-deadline registered
> [    5.906144] ledtrig-cpu: registered to indicate activity on CPUs
> [    5.912257] shpchp: Standard Hot Plug PCI Controller Driver version: 0.4
> [    5.926713] Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled
> [    5.934445] Serial: AMBA driver
> [    5.937939] msm_serial: driver initialized
> [    5.942129] SuperH (H)SCI(F) driver initialized
> [    5.948887] mousedev: PS/2 mouse device common for all mice
> [    5.957484] SMCCC: SOC_ID: ID = jep106:0426:8186 Revision = 0x00000000
> [    5.965218] hw perfevents: enabled with armv8_cortex_a55 PMU driver, 7 (0,8000003f) counters available
> [    5.975405] hw perfevents: enabled with armv8_cortex_a76 PMU driver, 7 (0,8000003f) counters available
> [    5.986187] IPv6: Loaded, but administratively disabled, reboot required to enable
> [    5.993823] mip6: Mobile IPv6
> [    5.996810] mip6: mip6_init: can't add xfrm type(destopt)
> [    6.002257] NET: Registered PF_PACKET protocol family
> [    6.007546] mpls_gso: MPLS GSO support
> [    6.014053] registered taskstats version 1
> [    6.018316] Loading compiled-in X.509 certificates
> [    6.062196] Loaded X.509 cert 'Build time autogenerated kernel key: 8dc7145aaa7e9aab3b86e5537f1c2bfa59509cbe'
> [    6.076029] Demotion targets for Node 0: null
> [    6.080663] Key type .fscrypt registered
> [    6.084615] Key type fscrypt-provisioning registered
> [    6.144310] Key type encrypted registered
> [    6.148368] AppArmor: AppArmor sha256 policy hashing enabled
> [    6.154093] ima: No TPM chip found, activating TPM-bypass!
> [    6.159618] ima: Allocated hash algorithm: sha256
> [    6.164369] ima: No architecture policies found
> [    6.168957] evm: Initialising EVM extended attributes:
> [    6.174129] evm: security.selinux
> [    6.177460] evm: security.SMACK64 (disabled)
> [    6.181755] evm: security.SMACK64EXEC (disabled)
> [    6.186401] evm: security.SMACK64TRANSMUTE (disabled)
> [    6.191484] evm: security.SMACK64MMAP (disabled)
> [    6.196130] evm: security.apparmor
> [    6.199550] evm: security.ima
> [    6.202532] evm: security.capability
> [    6.206127] evm: HMAC attrs: 0x1
> [    6.212930] clk: Disabling unused clocks
> [    6.216900] PM: genpd: Disabling unused power domains
> [    6.224857] Freeing unused kernel memory: 2752K
> [    6.250486] Checked W+X mappings: passed, no W+X pages found
> [    6.256198] Run /init as init process
> [    6.597646] cannot find "mediatek,mt8186-fhctl"
> [    6.641486] mediatek-mipi-tx 11cc0000.dsi-phy: can't get nvmem_cell_get, ignore it
> [    6.655464] mtk-spi-nor 11000000.spi: spi frequency: 39000000 Hz
> [    6.700074] 11002000.serial: ttyS0 at MMIO 0x11002000 (irq = 244, base_baud = 1625000) is a ST16650V2
> [    6.701297] input: wifi-wakeup as /devices/platform/wifi-wakeup/input/input0
> [    6.716630] printk: legacy console [ttyS0] enabled
> [    6.726739] spi_master spi0: will run message pump with realtime priority
> [    6.727457] mt6359-auxadc: Failed to locate of_node [id: -1]
> [    6.728788] platform 14013000.dsi: Fixed dependency cycle(s) with /soc/i2c at 11007000/anx7625 at 58
> [    6.728829] i2c 0-0058: Fixed dependency cycle(s) with /soc/i2c at 11007000/anx7625 at 58/aux-bus/panel
> [    6.728842] i2c 0-0058: Fixed dependency cycle(s) with /soc/dsi at 14013000
> [    6.732990] mediatek-drm mediatek-drm.2.auto: Adding component match for /soc/ovl at 14005000
> [    6.733033] mediatek-drm mediatek-drm.2.auto: Adding component match for /soc/ovl at 14006000
> [    6.733056] mediatek-drm mediatek-drm.2.auto: Adding component match for /soc/rdma at 14007000
> [    6.733079] mediatek-drm mediatek-drm.2.auto: Adding component match for /soc/color at 14009000
> [    6.733111] mediatek-drm mediatek-drm.2.auto: Adding component match for /soc/ccorr at 1400b000
> [    6.733133] mediatek-drm mediatek-drm.2.auto: Adding component match for /soc/aal at 1400c000
> [    6.733155] mediatek-drm mediatek-drm.2.auto: Adding component match for /soc/gamma at 1400d000
> [    6.740972] mediatek-drm mediatek-drm.2.auto: Adding component match for /soc/ovl at 14005000
> [    6.746522] platform mt6358-regulator: Fixed dependency cycle(s) with /soc/pwrap at 1000d000/pmic/regulators/vs2
> [    6.754777] mediatek-drm mediatek-drm.2.auto: Adding component match for /soc/ovl at 14006000
> [    6.763570] platform mt6358-regulator: Fixed dependency cycle(s) with /soc/pwrap at 1000d000/pmic/regulators/vdram1
> [    6.770299] mediatek-drm mediatek-drm.2.auto: Adding component match for /soc/rdma at 14007000
> [    6.778510] platform mt6358-regulator: Fixed dependency cycle(s) with /soc/pwrap at 1000d000/pmic/regulators/vs1
> [    6.779281] hid: raw HID events driver (C) Jiri Kosina
> [    6.780813] mt6358-keys: Failed to locate of_node [id: -1]
> [    6.786870] mediatek-drm mediatek-drm.2.auto: Adding component match for /soc/color at 14009000
> [    6.789011] cros-ec-spi spi0.0: Chrome EC device registered
> [    6.796282] pp3300_vcn33_x: Bringing 3500000uV into 3300000-3300000uV
> [    6.803630] mediatek-drm mediatek-drm.2.auto: Adding component match for /soc/ccorr at 1400b000
> [    6.812756] pp2760_vsim2_x: Bringing 1860000uV into 2700000-2700000uV
> [    6.820252] mediatek-drm mediatek-drm.2.auto: Adding component match for /soc/aal at 1400c000
> [    6.862956] mt6397-rtc mt6358-rtc: registered as rtc0
> [    6.869440] mediatek-drm mediatek-drm.2.auto: Adding component match for /soc/gamma at 1400d000
> [    6.879777] mt6397-rtc mt6358-rtc: setting system clock to 2024-09-16T15:25:24 UTC (1726500324)
> [    6.880155] i2c_hid_of 2-002c: supply vddl not found, using dummy regulator
> [    6.888029] mediatek-drm mediatek-drm.2.auto: Adding component match for /soc/dsi at 14013000
> [    6.888446] input: cros_ec as /devices/platform/soc/11010000.spi/spi_master/spi0/spi0.0/11010000.spi:ec at 0:keyboard-controller/input/input1
> [    6.893245] input: cros_ec_buttons as /devices/platform/soc/11010000.spi/spi_master/spi0/spi0.0/11010000.spi:ec at 0:keyboard-controller/input/input2
> [    7.261651] mediatek-drm mediatek-drm.2.auto: Adding component match for /soc/rdma at 1401f000
> [    7.272416] mtk-msdc 11240000.mmc: allocated mmc-pwrseq
> [    7.289318] mmc0: CQHCI version 5.10
> [    7.375371] mtk-msdc 11240000.mmc: msdc_track_cmd_data: cmd=52 arg=00000C00; host->error=0x00000002
> [    7.394096] mtk-msdc 11240000.mmc: msdc_track_cmd_data: cmd=52 arg=80000C08; host->error=0x00000002
> [    7.425798] mtk-msdc 11230000.mmc: Final PAD_DS_TUNE: 0x11c14
> [    7.440743] mmc0: Command Queue Engine enabled
> [    7.441017] mmc1: new ultra high speed SDR104 SDIO card at address 0001
> [    7.445185] mmc0: new HS400 MMC card at address 0001
> [    7.463150] panel-simple-dp-aux aux-0-0058: Detected BOE NT140FHM-N45 (0x09ae)
> [    7.468349] mmcblk0: mmc0:0001 DV4064 58.2 GiB
> [    7.476036] mtu3 11201000.usb: supply vusb33 not found, using dummy regulator
> [    7.486077]  mmcblk0: p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12
> [    7.486908] mtu3 11201000.usb: dr_mode: 3, drd: auto
> [    7.493193] mmcblk0boot0: mmc0:0001 DV4064 4.00 MiB
> [    7.497239] mtu3 11201000.usb: u2p_dis_msk: 0, u3p_dis_msk: 0
> [    7.497416] mtu3 11201000.usb: usb3-drd: 0
> [    7.502735] mmcblk0boot1: mmc0:0001 DV4064 4.00 MiB
> [    7.508621] mtu3 11201000.usb: irq 266
> [    7.513681] mmcblk0rpmb: mmc0:0001 DV4064 16.0 MiB, chardev (240:0)
> [    7.516885] mtu3 11201000.usb: IP version 0x1006(U2 IP)
> [    7.601450] mtu3 11201000.usb: max_speed: high-speed
> [    7.611384] mtu3 11201000.usb: fifosz/epnum: Tx=0x2000/8, Rx=0x2000/8
> [    7.624289] mtu3 11201000.usb: dma mask: 36 bits
> [    7.634671] mtu3 11201000.usb: xHCI platform device register success...
> [    7.648493] mtu3 11281000.usb: supply vusb33 not found, using dummy regulator
> [    7.663069] mtu3 11281000.usb: dr_mode: 3, drd: auto
> [    7.665375] usbcore: registered new interface driver usbfs
> [    7.668033] mtu3 11281000.usb: u2p_dis_msk: 0, u3p_dis_msk: 0
> [    7.668173] mtu3 11281000.usb: usb3-drd: 1
> [    7.673555] usbcore: registered new interface driver hub
> [    7.679313] mtu3 11281000.usb: irq 267
> [    7.683395] usbcore: registered new device driver usb
> [    7.688671] mtu3 11281000.usb: IP version 0x1006(U3 IP)
> [    7.742379] mtu3 11281000.usb: max_speed: super-speed-plus
> [    7.743003] xhci-mtk 11200000.usb: supply vusb33 not found, using dummy regulator
> [    7.747860] mtu3 11281000.usb: fifosz/epnum: Tx=0x4000/8, Rx=0x4000/8
> [    7.755481] xhci-mtk 11200000.usb: uwk - reg:0x420, version:2
> [    7.761766] mtu3 11281000.usb: dma mask: 36 bits
> [    7.767732] xhci-mtk 11200000.usb: xHCI Host Controller
> [    7.773275] xhci-mtk 11280000.usb: supply vusb33 not found, using dummy regulator
> [    7.777332] xhci-mtk 11200000.usb: new USB bus registered, assigned bus number 1
> [    7.777393] xhci-mtk 11200000.usb: USB3 root hub has no ports
> [    7.784937] xhci-mtk 11280000.usb: uwk - reg:0x424, version:2
> [    7.792194] xhci-mtk 11200000.usb: hcc params 0x01400f99 hci version 0x110 quirks 0x0000000000200010
> [    7.798089] xhci-mtk 11280000.usb: xHCI Host Controller
> [    7.803684] xhci-mtk 11200000.usb: irq 268, io mem 0x11200000
> [    7.812785] xhci-mtk 11280000.usb: new USB bus registered, assigned bus number 2
> [    7.818129] usb usb1: New USB device found, idVendor=1d6b, idProduct=0002, bcdDevice= 6.11
> [    7.825232] xhci-mtk 11280000.usb: hcc params 0x01400f99 hci version 0x110 quirks 0x0000000000200010
> [    7.831112] usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
> [    7.831116] usb usb1: Product: xHCI Host Controller
> [    7.839384] xhci-mtk 11280000.usb: irq 269, io mem 0x11280000
> [    7.848491] usb usb1: Manufacturer: Linux 6.11.0-next-20240916-deb-00002-g7b544e01c649 xhci-hcd
> [    7.855748] xhci-mtk 11280000.usb: xHCI Host Controller
> [    7.860563] usb usb1: SerialNumber: 11200000.usb
> [    8.028253] hub 1-0:1.0: USB hub found
> [    8.035778] hub 1-0:1.0: 1 port detected
> [    8.043872] xhci-mtk 11280000.usb: new USB bus registered, assigned bus number 3
> [    8.058701] xhci-mtk 11280000.usb: Host supports USB 3.2 Enhanced SuperSpeed
> [    8.072879] usb usb2: New USB device found, idVendor=1d6b, idProduct=0002, bcdDevice= 6.11
> [    8.089429] usb usb2: New USB device strings: Mfr=3, Product=2, SerialNumber=1
> [    8.103892] usb usb2: Product: xHCI Host Controller
> [    8.113647] usb usb2: Manufacturer: Linux 6.11.0-next-20240916-deb-00002-g7b544e01c649 xhci-hcd
> [    8.131056] usb usb2: SerialNumber: 11280000.usb
> [    8.140632] hub 2-0:1.0: USB hub found
> [    8.148147] hub 2-0:1.0: 1 port detected
> [    8.156170] usb usb3: We don't know the algorithms for LPM for this host, disabling LPM.
> [    8.172409] usb usb3: New USB device found, idVendor=1d6b, idProduct=0003, bcdDevice= 6.11
> [    8.188956] usb usb3: New USB device strings: Mfr=3, Product=2, SerialNumber=1
> [    8.203409] usb usb3: Product: xHCI Host Controller
> [    8.213166] usb usb3: Manufacturer: Linux 6.11.0-next-20240916-deb-00002-g7b544e01c649 xhci-hcd
> [    8.230576] usb usb3: SerialNumber: 11280000.usb
> [    8.240157] hub 3-0:1.0: USB hub found
> [    8.247671] hub 3-0:1.0: 1 port detected
> [    8.255703] mtu3 11281000.usb: xHCI platform device register success...
> [    8.276133] mtk-iommu 14016000.iommu: bound 14003000.smi (ops mtk_smi_exit [mtk_smi])
> [    8.291907] mtk-iommu 14016000.iommu: bound 14004000.smi (ops mtk_smi_exit [mtk_smi])
> [    8.307634] mtk-iommu 14016000.iommu: bound 1b002000.smi (ops mtk_smi_exit [mtk_smi])
> [    8.323361] mtk-iommu 14016000.iommu: bound 1602e000.smi (ops mtk_smi_exit [mtk_smi])
> [    8.339061] mtk-iommu 14016000.iommu: bound 17010000.smi (ops mtk_smi_exit [mtk_smi])
> [    8.354737] mtk-iommu 14016000.iommu: bound 14023000.smi (ops mtk_smi_exit [mtk_smi])
> [    8.370451] mtk-iommu 14016000.iommu: bound 1502e000.smi (ops mtk_smi_exit [mtk_smi])
> [    8.386126] mtk-iommu 14016000.iommu: bound 1582e000.smi (ops mtk_smi_exit [mtk_smi])
> [    8.401797] mtk-iommu 14016000.iommu: bound 1a001000.smi (ops mtk_smi_exit [mtk_smi])
> [    8.417468] mtk-iommu 14016000.iommu: bound 1a002000.smi (ops mtk_smi_exit [mtk_smi])
> [    8.433139] mtk-iommu 14016000.iommu: bound 1a00f000.smi (ops mtk_smi_exit [mtk_smi])
> [    8.448836] mtk-iommu 14016000.iommu: bound 1a010000.smi (ops mtk_smi_exit [mtk_smi])
> [    8.448890] usb 1-1: new high-speed USB device number 2 using xhci-mtk
> [    8.456752] mtk-iommu 14016000.iommu: bound 1c10f000.smi (ops mtk_smi_exit [mtk_smi])
> [    8.493277] mtk-iommu 14016000.iommu: bound 1c00f000.smi (ops mtk_smi_exit [mtk_smi])
> [    8.509481] mediatek-disp-ovl 14005000.ovl: Adding to iommu group 0
> [    8.522904] mediatek-disp-ovl 14006000.ovl: Adding to iommu group 0
> [    8.536023] mediatek-disp-rdma 14007000.rdma: Adding to iommu group 0
> [    8.549490] mediatek-disp-rdma 1401f000.rdma: Adding to iommu group 0
> [    8.562842] mediatek-drm mediatek-drm.2.auto: bound 14005000.ovl (ops mtk_drm_exit [mediatek_drm])
> [    8.580822] usb 2-1: new high-speed USB device number 2 using xhci-mtk
> [    8.582140] mediatek-drm mediatek-drm.2.auto: bound 14006000.ovl (ops mtk_drm_exit [mediatek_drm])
> [    8.603451] usb 1-1: New USB device found, idVendor=30c9, idProduct=0093, bcdDevice= 0.09
> [    8.611862] mediatek-drm mediatek-drm.2.auto: bound 14007000.rdma (ops mtk_drm_exit [mediatek_drm])
> [    8.620000] usb 1-1: New USB device strings: Mfr=3, Product=1, SerialNumber=2
> [    8.620004] usb 1-1: Product: Integrated Camera
> [    8.620007] usb 1-1: Manufacturer: Lenovo
> [    8.620009] usb 1-1: SerialNumber: 8SSC21J75356V1SR34D04F6
> [    8.688748] mediatek-drm mediatek-drm.2.auto: bound 14009000.color (ops mtk_drm_exit [mediatek_drm])
> [    8.707061] mediatek-drm mediatek-drm.2.auto: bound 1400b000.ccorr (ops mtk_drm_exit [mediatek_drm])
> [    8.725355] mediatek-drm mediatek-drm.2.auto: bound 1400c000.aal (ops mtk_drm_exit [mediatek_drm])
> [    8.742261] usb 2-1: New USB device found, idVendor=0bda, idProduct=5411, bcdDevice= 1.16
> [    8.743292] mediatek-drm mediatek-drm.2.auto: bound 1400d000.gamma (ops mtk_drm_exit [mediatek_drm])
> [    8.751459] usb 2-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
> [    8.792208] usb 2-1: Product: USB2.1 Hub
> [    8.800054] usb 2-1: Manufacturer: Generic
> [    8.809431] hub 2-1:1.0: USB hub found
> [    8.817941] hub 2-1:1.0: 3 ports detected
> [    8.818842] mediatek-drm mediatek-drm.2.auto: bound 14013000.dsi (ops mtk_drm_exit [mediatek_drm])
> [    8.843895] mediatek-drm mediatek-drm.2.auto: bound 1401f000.rdma (ops mtk_drm_exit [mediatek_drm])
> [    8.862076] mediatek-drm mediatek-drm.2.auto: Not creating crtc 1 because component 10 is disabled or missing
> [    8.866810] usb 3-1: new SuperSpeed USB device number 2 using xhci-mtk
> [    8.872572] [drm] Initialized mediatek 1.0.0 for mediatek-drm.2.auto on minor 0
> [    9.217339] Console: switching to colour frame buffer device 240x67
> [    9.229914] mediatek-drm mediatek-drm.2.auto: [drm] fb0: mediatekdrmfb frame buffer device
> [    9.304875] usb 3-1: New USB device found, idVendor=0bda, idProduct=0411, bcdDevice= 1.16
> [    9.321261] usb 3-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
> [    9.328846] usbcore: registered new device driver onboard-usb-dev
> [    9.335540] usb 3-1: Product: USB3.2 Hub
> [    9.335544] usb 3-1: Manufacturer: Generic
> [    9.337112] hub 3-1:1.0: USB hub found
> [    9.372670] hub 3-1:1.0: 3 ports detected
> [   10.590334] usb 3-1.2: new SuperSpeed USB device number 3 using xhci-mtk
> [   10.626980] usb 3-1.2: New USB device found, idVendor=04e8, idProduct=61f5, bcdDevice= 1.00
> [   10.643747] usb 3-1.2: New USB device strings: Mfr=2, Product=3, SerialNumber=1
> [   10.643752] usb 3-1.2: Product: Portable SSD T5
> [   10.643755] usb 3-1.2: Manufacturer: Samsung
> [   10.643758] usb 3-1.2: SerialNumber: 1234567E4FF2
> [   10.687566] SCSI subsystem initialized
> [   10.700350] usb 3-1.2: USB controller 11280000.usb does not support streams, which are required by the UAS driver.
> [   10.721087] usb 3-1.2: Please try an other USB controller if you wish to use UAS.
> [   10.721091] usb-storage 3-1.2:1.0: USB Mass Storage device detected
> [   10.721702] scsi host0: usb-storage 3-1.2:1.0
> [   10.757586] usbcore: registered new interface driver usb-storage
> [   10.772605] usbcore: registered new interface driver uas
> [   11.778827] scsi 0:0:0:0: Direct-Access     Samsung  Portable SSD T5  0    PQ: 0 ANSI: 6
> [   11.801877] sd 0:0:0:0: [sda] 1953525168 512-byte logical blocks: (1.00 TB/932 GiB)
> [   11.817671] sd 0:0:0:0: [sda] Write Protect is off
> [   11.827706] sd 0:0:0:0: [sda] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
> [   11.866684]  sda: sda1 sda2 sda3 sda4 sda5 sda6 sda7 sda8 sda9 sda10
> [   11.880716] sd 0:0:0:0: [sda] Attached SCSI disk
> [   12.239413] EXT4-fs (sda4): mounted filesystem c16826e5-0b66-4648-87db-8a2601010f0a ro with ordered data mode. Quota mode: none.
> [   12.372682] Not activating Mandatory Access Control as /sbin/tomoyo-init does not exist.
> [   12.497038] systemd[1]: Inserted module 'autofs4'
> [   12.538640] systemd[1]: systemd 256.5-1 running in system mode (+PAM +AUDIT +SELINUX +APPARMOR +IMA +SMACK +SECCOMP +GCRYPT -GNUTLS +OPENSSL +ACL +BLKID +CURL +ELFUTILS +FIDO2 +IDN2 -IDN +IPTC +KMOD +LIBCRYPTSETUP +LIBCRYPTSETUP_PLUGINS +LIBFDISK +PCRE2 +PWQUALITY +P11KIT +QRENCO)
> [   12.604118] systemd[1]: Detected architecture arm64.
> [   12.615377] systemd[1]: Hostname set to <DEBIAN-T5-ARM64>.
> [   12.768629] systemd[1]: bpf-restrict-fs: Failed to load BPF object: No such process
> [   13.158668] systemd[1]: Queued start job for default target graphical.target.
> [   13.225238] systemd[1]: Created slice system-getty.slice - Slice /system/getty.
> [   13.241008] systemd[1]: Created slice system-modprobe.slice - Slice /system/modprobe.
> [   13.257669] systemd[1]: Created slice system-serial\x2dgetty.slice - Slice /system/serial-getty.
> [   13.276331] systemd[1]: Created slice system-systemd\x2dfsck.slice - Slice /system/systemd-fsck.
> [   13.294675] systemd[1]: Created slice user.slice - User and Session Slice.
> [   13.308737] systemd[1]: Started systemd-ask-password-wall.path - Forward Password Requests to Wall Directory Watch.
> [   13.330219] systemd[1]: Set up automount proc-sys-fs-binfmt_misc.automount - Arbitrary Executable File Formats File System Automount Point.
> [   13.355624] systemd[1]: Expecting device dev-disk-by\x2duuid-605450ef\x2d43fc\x2d41e4\x2d83d7\x2d9c204d5c1c03.device - /dev/disk/by-uuid/605450ef-43fc-41e4-83d7-9c204d5c1c03...
> [   13.387323] systemd[1]: Expecting device dev-disk-by\x2duuid-92da49dd\x2d921b\x2d4e87\x2d9b65\x2d3ecbd9905707.device - /dev/disk/by-uuid/92da49dd-921b-4e87-9b65-3ecbd9905707...
> [   13.419163] systemd[1]: Expecting device dev-disk-by\x2duuid-9409\x2dDA15.device - /dev/disk/by-uuid/9409-DA15...
> [   13.439874] systemd[1]: Expecting device dev-ttyAMA0.device - /dev/ttyAMA0...
> [   13.454255] systemd[1]: Expecting device dev-ttyS0.device - /dev/ttyS0...
> [   13.468013] systemd[1]: Reached target integritysetup.target - Local Integrity Protected Volumes.
> [   13.485923] systemd[1]: Reached target nss-user-lookup.target - User and Group Name Lookups.
> [   13.502964] systemd[1]: Reached target remote-fs.target - Remote File Systems.
> [   13.517523] systemd[1]: Reached target slices.target - Slice Units.
> [   13.530251] systemd[1]: Reached target veritysetup.target - Local Verity Protected Volumes.
> [   13.549165] systemd[1]: Listening on systemd-creds.socket - Credential Encryption/Decryption.
> [   13.566592] systemd[1]: Listening on systemd-initctl.socket - initctl Compatibility Named Pipe.
> [   13.584391] systemd[1]: Listening on systemd-journald-dev-log.socket - Journal Socket (/dev/log).
> [   13.602557] systemd[1]: Listening on systemd-journald.socket - Journal Sockets.
> [   13.617375] systemd[1]: systemd-pcrextend.socket - TPM PCR Measurements was skipped because of an unmet condition check (ConditionSecurity=measured-uki).
> [   13.644924] systemd[1]: systemd-pcrlock.socket - Make TPM PCR Policy was skipped because of an unmet condition check (ConditionSecurity=measured-uki).
> [   13.672180] systemd[1]: Listening on systemd-udevd-control.socket - udev Control Socket.
> [   13.688660] systemd[1]: Listening on systemd-udevd-kernel.socket - udev Kernel Socket.
> [   13.707450] systemd[1]: Mounting dev-hugepages.mount - Huge Pages File System...
> [   13.766877] systemd[1]: Mounting dev-mqueue.mount - POSIX Message Queue File System...
> [   13.785218] systemd[1]: Mounting run-lock.mount - Legacy Locks Directory /run/lock...
> [   13.803022] systemd[1]: Mounting sys-kernel-debug.mount - Kernel Debug File System...
> [   13.820759] systemd[1]: Mounting sys-kernel-tracing.mount - Kernel Trace File System...
> [   13.839689] systemd[1]: Starting keyboard-setup.service - Set the console keyboard layout...
> [   13.858991] systemd[1]: Starting kmod-static-nodes.service - Create List of Static Device Nodes...
> [   13.879740] systemd[1]: Starting modprobe at configfs.service - Load Kernel Module configfs...
> [   13.899336] systemd[1]: Starting modprobe at drm.service - Load Kernel Module drm...
> [   13.916671] systemd[1]: Starting modprobe at efi_pstore.service - Load Kernel Module efi_pstore...
> [   13.936398] systemd[1]: Starting modprobe at fuse.service - Load Kernel Module fuse...
> [   13.952172] systemd[1]: systemd-fsck-root.service - File System Check on Root Device was skipped because of an unmet condition check (ConditionPathExists=!/run/initramfs/fsck-root).
> [   13.984688] systemd[1]: systemd-hibernate-clear.service - Clear Stale Hibernate Storage Info was skipped because of an unmet condition check (ConditionPathExists=/sys/firmware/efi/efivars/HibernateLocation-8cf2644b-4b0b-428f-9387-6d876050dc67).
> [   14.031876] systemd[1]: Starting systemd-journald.service - Journal Service...
> [   14.049441] systemd[1]: Starting systemd-modules-load.service - Load Kernel Modules...
> [   14.065554] systemd[1]: systemd-pcrmachine.service - TPM PCR Machine ID Measurement was skipped because of an unmet condition check (ConditionSecurity=measured-uki).
> [   14.097177] systemd[1]: Starting systemd-remount-fs.service - Remount Root and Kernel File Systems...
> [   14.115997] systemd[1]: systemd-tpm2-setup-early.service - Early TPM SRK Setup was skipped because of an unmet condition check (ConditionSecurity=measured-uki).
> [   14.146783] systemd[1]: Starting systemd-udev-load-credentials.service - Load udev Rules from Credentials...
> [   14.168717] systemd[1]: Starting systemd-udev-trigger.service - Coldplug All udev Devices...
> [   14.179524] systemd-journald[331]: Collecting audit messages is disabled.
> [   14.195155] EXT4-fs (sda4): re-mounted c16826e5-0b66-4648-87db-8a2601010f0a r/w. Quota mode: none.
> [   14.223272] systemd[1]: Mounted dev-hugepages.mount - Huge Pages File System.
> [   14.238037] systemd[1]: Mounted dev-mqueue.mount - POSIX Message Queue File System.
> [   14.253788] systemd[1]: Mounted run-lock.mount - Legacy Locks Directory /run/lock.
> [   14.269440] systemd[1]: Started systemd-journald.service - Journal Service.
> [   14.374947] systemd-journald[331]: Received client request to flush runtime journal.
> [   14.935868] sd 0:0:0:0: Attached scsi generic sg0 type 0
> [   15.022815] pstore: Using crash dump compression: deflate
> [   15.035525] pstore: Registered ramoops as persistent store backend
> [   15.047996] ramoops: using 0x100000 at 0xffec5000, ecc: 0
> [   15.109992] mtk-wdt 10007000.watchdog: Watchdog enabled (timeout=31 sec, nowayout=0)
> [   15.128526] mtk-ccifreq cci: failed to add devfreq device: -517
> [   15.146800] mtk-lvts-thermal 1100b000.thermal-sensor: fake golden temp=50
> [   15.166664] mtk-scp 10500000.scp: assigned reserved memory node memory at 50000000
> [   15.182768] mtk-ccifreq cci: failed to add devfreq device: -517
> [   15.195654] remoteproc remoteproc0: scp is available
> [   15.217946] remoteproc remoteproc0: powering up scp
> [   15.228152] ACPI: battery: new extension: cros-charge-control.6.auto
> [   15.231899] remoteproc remoteproc0: Booting fw image mediatek/mt8186/scp.img, size 419488
> [   15.231909] mtk-scp 10500000.scp: IPI buf addr 0x0003bdb0
> [   15.232218] mtk-ccifreq cci: failed to add devfreq device: -517
> [   15.290597] mtk-ccifreq cci: failed to add devfreq device: -517
> [   15.307523] mtk-ccifreq cci: failed to add devfreq device: -517
> [   15.320997] rt5682s 5-001a: Using default DAI clk names: rt5682-dai-wclk, rt5682-dai-bclk
> [   15.326877] mtk-scp 10500000.scp: SCP is ready. FW version corsola_scp_v2.0.18944-70c8f752
> [   15.326893] mtk-scp 10500000.scp: creating channel cros-ec-rpmsg addr 0xd
> [   15.328463] sbs-battery 6-000b: sbs-battery: battery gas gauge device registered
> [   15.337709] mtk-ccifreq cci: failed to add devfreq device: -517
> [   15.341465] elan_i2c 2-0015: Elan Touchpad: Module ID: 0x010a, Firmware: 0x0002, Sample: 0x0002, IAP: 0x0002
> [   15.341977] input: Elan Touchpad as /devices/platform/soc/11009000.i2c/i2c-2/2-0015/input/input3
> [   15.345657] remoteproc remoteproc0: remote processor scp is now up
> [   15.430929] mc: Linux media interface: v0.10
> [   15.452901] mtk-ccifreq cci: failed to add devfreq device: -517
> [   15.490708] videodev: Linux video capture interface: v2.00
> [   15.506411] Fallback method does not support PEC.
> [   15.506411] sbs-battery 6-000b: I2C adapter does not support I2C_FUNC_SMBUS_READ_BLOCK_DATA.
> [   15.533600] mt6358-sound mt6358-sound: mt6358_platform_driver_probe(), dev name mt6358-sound
> [   15.536533] mtk-ccifreq cci: failed to add devfreq device: -517
> [   15.565442] mtk-ccifreq cci: failed to add devfreq device: -517
> [   15.582003] tpm_tis_spi spi1.0: TPM ready IRQ confirmed on attempt 2
> [   15.594865] mtk-ccifreq cci: failed to add devfreq device: -517
> [   15.598915] mt8186-audio 11210000.audio-controller: mtk_afe_combine_sub_dai(), num of dai 41
> [   15.607141] tpm_tis_spi spi1.0: 2.0 TPM (device-id 0x504A, rev-id 83)
> [   15.609526] mt8186-audio 11210000.audio-controller: No cache defaults, reading back from HW
> [   15.620913] mtk-ccifreq cci: failed to add devfreq device: -517
> [   15.646657] cfg80211: Loading compiled-in X.509 certificates for regulatory database
> [   15.681016] mtk-ccifreq cci: failed to add devfreq device: -517
> [   15.681413] Loaded X.509 cert 'sforshee: 00b28ddf47aef9cea7'
> [   15.704906] Loaded X.509 cert 'wens: 61c038651aabdcf94bd0ac7ff06c7248db18c600'
> [   15.717988] cros-ec-led cros-ec-led.9.auto: probe with driver cros-ec-led failed with error -22
> [   15.737735] cros-ec-dev cros-ec-dev.15.auto: CrOS System Control Processor MCU detected
> [   15.757040] cros-ec-rpmsg 10500000.scp.cros-ec-rpmsg.13.-1: Chrome EC device registered
> [   15.759051] mtk-ccifreq cci: failed to add devfreq device: -517
> [   15.761583] tpm_tis_spi spi1.0: Cr50 firmware version: Ti50/D3C1 RO_B:0.0.56/- RW_A:0.23.90/ti50_common_mp-15224.B:v0.0
> [   15.772981] cfg80211: loaded regulatory.db is malformed or signature is missing/invalid
> [   15.789991] mtk-ccifreq cci: failed to add devfreq device: -517
> [   15.806773] panfrost 13040000.gpu: clock rate = 249999863
> [   15.851522] panfrost 13040000.gpu: EM: created perf domain
> [   15.871976] mtk-ccifreq cci: failed to add devfreq device: -517
> [   15.892576] panfrost 13040000.gpu: mali-g52 id 0x7402 major 0x1 minor 0x0 status 0x0
> [   15.908188] panfrost 13040000.gpu: features: 00000000,00000cf7, issues: 00000000,00000400
> [   15.908195] panfrost 13040000.gpu: Features: L2:0x07120206 Shader:0x00000002 Tiler:0x00000209 Mem:0x1 MMU:0x00002823 AS:0xff JS:0x7
> [   15.908202] panfrost 13040000.gpu: shader_present=0x3 l2_present=0x1
> [   15.922602] Adding 31457276k swap on /dev/sda6.  Priority:-2 extents:1 across:31457276k
> [   15.922886] usb 1-1: Found UVC 1.50 device Integrated Camera (30c9:0093)
> [   15.984927] [drm] Initialized panfrost 1.2.0 for 13040000.gpu on minor 1
> [   16.000891] usbcore: registered new interface driver uvcvideo
> [   16.031262] ------------[ cut here ]------------
> [   16.040525] kernel BUG at net/core/skbuff.c:2268!
> [   16.040531] Internal error: Oops - BUG: 00000000f2000800 [#1] SMP
> [   16.040537] Modules linked in: mtk_jpeg(+) mtk_adsp_common v4l2_vp9 mt7921s(+) mtk_vcodec_enc(+) mt76_sdio v4l2_h264 aes_ce_blk mtk_adsp_ipc mtk_vcodec_dbgfs mt7921_common mtk_vcodec_common mtk_jpeg_enc_hw aes_ce_cipher mt792x_lib snd_sof_xtensa_dsp crct10dif_ce mt76_connac_lib pp
> [   16.040655]  snd_compress mt6577_auxadc snd_pcm_dmaengine industrialio lvts_thermal snd_pcm mtk_rpmsg mtk_svs mtk_scp_ipi mtk_adsp_mailbox rpmsg_core memconsole_coreboot mtk_wdt governor_passive snd_timer memconsole vpd_sysfs snd ramoops mtk_cci_devfreq soundcore reed_solomon sg n
> [   16.040782]  clk_mt8186_apmixedsys mtk_cmdq_mailbox mtk_pmic_wrap spi_mtk_nor i2c_mt65xx clk_mt8186_imp_iic_wrap spi_mt65xx clk_mt8186_topckgen clk_mt8186_infra_ao fixed pwm_bl
> [   16.040803] CPU: 3 UID: 0 PID: 526 Comm: mt76-sdio-txrx  Not tainted 6.11.0-next-20240916-deb-00002-g7b544e01c649 #1
> [   16.040809] Hardware name: Google Magneton board (DT)
> [   16.040811] pstate: 20400009 (nzCv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=--)
> [   16.040816] pc : pskb_expand_head+0x2b0/0x3c0
> [   16.040827] lr : mt76s_tx_run_queue+0x274/0x410 [mt76_sdio]
> [   16.040837] sp : ffff800082413c20
> [   16.040839] x29: ffff800082413c30 x28: ffff030783514080 x27: ffff030783114f80
> [   16.040846] x26: 0000000000000000 x25: 0000000000000000 x24: 0000000000000200
> [   16.040852] x23: 0000000000000140 x22: 0000000000000028 x21: ffff0307897b2020
> [   16.040858] x20: ffff030783514080 x19: ffff030783111200 x18: 0000000000000000
> [   16.040863] x17: ffff568eeefd6000 x16: ffffac78cfc10ee8 x15: 0000000000000000
> [   16.040869] x14: 0000000000000000 x13: 00000000000001a0 x12: 00000000000001a0
> [   16.040875] x11: 0000000000000000 x10: 0000000000000bd0 x9 : ffffac78bc9dedac
> [   16.040880] x8 : ffff0307849f68b0 x7 : 0000000000000000 x6 : 0000000005d995fa
> [   16.040886] x5 : 0000000000000000 x4 : ffff0307849f5c80 x3 : 0000000000000820
> [   16.040891] x2 : 0000000000000200 x1 : 0000000000000002 x0 : ffff030783111200
> [   16.040897] Call trace:
> [   16.040899]  pskb_expand_head+0x2b0/0x3c0
> [   16.040905]  mt76s_tx_run_queue+0x274/0x410 [mt76_sdio]
> [   16.040909]  mt76s_txrx_worker+0xe4/0xac8 [mt76_sdio]
> [   16.040914]  mt7921s_txrx_worker+0x98/0x1e0 [mt7921s]
> [   16.040924]  __mt76_worker_fn+0x80/0x128 [mt76]
> [   16.040934]  kthread+0xe8/0xf8
> [   16.040940]  ret_from_fork+0x10/0x20
> [   16.040949] Code: 52800021 97fffed9 17ffffbc d4210000 (d4210000)
> [   16.040953] ---[ end trace 0000000000000000 ]---
> [   16.046045] note: mt76-sdio-txrx [526] exited with irqs disabled
> [   16.048248] mtk-vcodec-enc 17020000.video-encoder: Adding to iommu group 1
> [   16.050772] mtk-ccifreq cci: failed to add devfreq device: -517
> [   16.051568] ------------[ cut here ]------------
> [   16.805325] WARNING: CPU: 3 PID: 0 at kernel/context_tracking.c:128 ct_kernel_exit.isra.0+0xa0/0xa8
> [   16.805341] Modules linked in: snd_sof_mt8186(+) mtk_vcodec_dec(+) joydev(+) mtk_jpeg(+) mtk_adsp_common v4l2_vp9 mt7921s mtk_vcodec_enc(+) mt76_sdio v4l2_h264 aes_ce_blk mtk_adsp_ipc mtk_vcodec_dbgfs mt7921_common mtk_vcodec_common mtk_jpeg_enc_hw aes_ce_cipher mt792x_lib snd_soc
> [   16.805462]  cros_charge_control elan_i2c snd_soc_core mtk_scp snd_compress mt6577_auxadc snd_pcm_dmaengine industrialio lvts_thermal snd_pcm mtk_rpmsg mtk_svs mtk_scp_ipi mtk_adsp_mailbox rpmsg_core memconsole_coreboot mtk_wdt governor_passive snd_timer memconsole vpd_sysfs snd r
> [   16.805596]  cqhci udc_core pwm_mtk_disp usb_common clk_mt8186_apmixedsys mtk_cmdq_mailbox mtk_pmic_wrap spi_mtk_nor i2c_mt65xx clk_mt8186_imp_iic_wrap spi_mt65xx clk_mt8186_topckgen clk_mt8186_infra_ao fixed pwm_bl
> [   16.805624] CPU: 3 UID: 0 PID: 0 Comm: swapper/3 Tainted: G      D            6.11.0-next-20240916-deb-00002-g7b544e01c649 #1
> [   16.805630] Tainted: [D]=DIE
> [   16.805632] Hardware name: Google Magneton board (DT)
> [   16.805635] pstate: 204000c9 (nzCv daIF +PAN -UAO -TCO -DIT -SSBS BTYPE=--)
> [   16.805640] pc : ct_kernel_exit.isra.0+0xa0/0xa8
> [   16.805645] lr : ct_idle_enter+0x14/0x20
> [   16.805649] sp : ffff800080133d60
> [   16.805651] x29: ffff800080133d60 x28: 0000000000000000 x27: 0000000000000000
> [   16.805658] x26: 0000000000000000 x25: 0000000000000000 x24: 00000003bcbf47dc
> [   16.805663] x23: 0000000000000000 x22: ffff030780b1c880 x21: ffff0307bf6ee478
> [   16.805669] x20: 0000000000000005 x19: ffff0307bf6eb700 x18: ffff800084ec3c98
> [   16.805675] x17: ffff03078080fb00 x16: 0000000000001059 x15: 000000000000089d
> [   16.805681] x14: 0000000000000002 x13: 0000000000000000 x12: 0000000000000113
> [   16.805687] x11: 071c71c71c71c71c x10: 000000000000003b x9 : ffffac78cfeca660
> [   16.805693] x8 : 0000000000000018 x7 : 000000000000006d x6 : 0000000005d995fa
> [   16.805698] x5 : 4000000000000002 x4 : ffff568eeefd6000 x3 : ffff800080133d60
> [   16.805704] x2 : ffffac78d0715700 x1 : ffffac78d0715700 x0 : 4000000000000000
> [   16.805710] Call trace:
> [   16.805712]  ct_kernel_exit.isra.0+0xa0/0xa8
> [   16.805717]  ct_idle_enter+0x14/0x20
> [   16.805722]  cpuidle_enter_state+0x1a4/0x460
> [   16.805726]  cpuidle_enter+0x40/0x60
> [   16.805733]  do_idle+0x1fc/0x280
> [   16.805740]  cpu_startup_entry+0x40/0x50
> [   16.805745]  secondary_start_kernel+0x128/0x158
> [   16.805752]  __secondary_switched+0xb8/0xc0
> [   16.805758] ---[ end trace 0000000000000000 ]---
> [   16.836198] mtk-jpeg 17030000.jpeg-encoder: Adding to iommu group 1
> [   17.529676] sof-audio-of-mt8186 10680000.adsp: DT DSP detected
> [   17.529817] mtk-vcodec-dec 16000000.video-decoder: Adding to iommu group 1
> [   17.530091] mtk-jpeg 17030000.jpeg-encoder: mtk-jpeg-enc device registered as /dev/video3 (81,3)
> [   17.535691] sof-audio-of-mt8186 10680000.adsp: assigned reserved memory node memory at 61000000
> [   17.546482] mtk-ccifreq cci: failed to add devfreq device: -517
> [   17.603968] sof-audio-of-mt8186 10680000.adsp: Firmware paths/files for ipc type 0:
> [   17.605029] mtk-vdec-comp 16025000.video-codec: Adding to iommu group 1
> [   17.611648] sof-audio-of-mt8186 10680000.adsp:  Firmware file:     mediatek/sof/sof-mt8186.ri
> [   17.611653] sof-audio-of-mt8186 10680000.adsp:  Topology file:     mediatek/sof-tplg/sof-mt8186.tplg
> [   17.612004] sof-audio-of-mt8186 10680000.adsp: Firmware info: version 2:0:0-475be
> [   17.620780] mtk-ccifreq cci: failed to add devfreq device: -517
> [   17.626828] sof-audio-of-mt8186 10680000.adsp: Firmware: ABI 3:22:1 Kernel ABI 3:23:1
> [   17.626855] sof-audio-of-mt8186 10680000.adsp: unknown sof_ext_man header type 3 size 0x30
> [   17.631797] sof-audio-of-mt8186 10680000.adsp: Firmware info: version 2:0:0-475be
> [   17.742162] sof-audio-of-mt8186 10680000.adsp: Firmware: ABI 3:22:1 Kernel ABI 3:23:1
> [   17.744509] mtk-ccifreq cci: failed to add devfreq device: -517
> [   17.875626] EXT4-fs (sda2): mounted filesystem 605450ef-43fc-41e4-83d7-9c204d5c1c03 r/w with ordered data mode. Quota mode: none.
> [   18.093680] audit: type=1400 audit(1726500335.708:2): apparmor="STATUS" operation="profile_load" profile="unconfined" name="libreoffice-senddoc" pid=590 comm="apparmor_parser"
> [   18.125082] audit: type=1400 audit(1726500335.712:3): apparmor="STATUS" operation="profile_load" profile="unconfined" name="nvidia_modprobe" pid=585 comm="apparmor_parser"
> [   18.125091] audit: type=1400 audit(1726500335.712:4): apparmor="STATUS" operation="profile_load" profile="unconfined" name="nvidia_modprobe//kmod" pid=585 comm="apparmor_parser"
> [   18.125096] audit: type=1400 audit(1726500335.712:5): apparmor="STATUS" operation="profile_load" profile="unconfined" name="lsb_release" pid=584 comm="apparmor_parser"
> [   18.125101] audit: type=1400 audit(1726500335.712:6): apparmor="STATUS" operation="profile_load" profile="unconfined" name="/usr/bin/man" pid=588 comm="apparmor_parser"
> [   18.125106] audit: type=1400 audit(1726500335.712:7): apparmor="STATUS" operation="profile_load" profile="unconfined" name="man_filter" pid=588 comm="apparmor_parser"
> [   18.125111] audit: type=1400 audit(1726500335.712:8): apparmor="STATUS" operation="profile_load" profile="unconfined" name="man_groff" pid=588 comm="apparmor_parser"
> [   18.306790] audit: type=1400 audit(1726500335.712:9): apparmor="STATUS" operation="profile_load" profile="unconfined" name="libreoffice-oosplash" pid=589 comm="apparmor_parser"
> [   18.306797] audit: type=1400 audit(1726500335.720:10): apparmor="STATUS" operation="profile_load" profile="unconfined" name="libreoffice-xpdfimport" pid=595 comm="apparmor_parser"
> [   18.306802] audit: type=1400 audit(1726500335.724:11): apparmor="STATUS" operation="profile_load" profile="unconfined" name="/usr/sbin/cups-browsed" pid=596 comm="apparmor_parser"
> [   19.050110] mt7921s mmc1:0001:1: Message 00000010 (seq 1) timeout
> [   19.062383] mt7921s mmc1:0001:1: Failed to get patch semaphore
> [   19.252928] NET: Registered PF_QIPCRTR protocol family
> [   24.162158] ------------[ cut here ]------------
> [   24.171397] WARNING: CPU: 7 PID: 54 at kernel/kthread.c:76 kthread_park+0x8c/0xe0
> [   24.186377] Modules linked in: snd_seq_dummy snd_hrtimer snd_seq snd_seq_device qrtr binfmt_misc nls_ascii nls_cp437 vfat fat mtk_vcodec_dec_hw snd_sof_mt8186 mtk_vcodec_dec joydev mtk_jpeg mtk_adsp_common v4l2_vp9 mt7921s mtk_vcodec_enc mt76_sdio v4l2_h264 aes_ce_blk mtk_adsp_ipn
> [   24.186521]  cros_ec_sysfs cros_usbpd_logger led_class_multicolor cros_usbpd_notify mtd tpm_tis_core typec cros_charge_control elan_i2c snd_soc_core mtk_scp snd_compress mt6577_auxadc snd_pcm_dmaengine industrialio lvts_thermal snd_pcm mtk_rpmsg mtk_svs mtk_scp_ipi mtk_adsp_mailb3
> [   24.365336]  mtk_cmdq_helper mtk_sd clk_mt8186_mfg phy_mtk_mipi_dsi_drv drm nvmem_mtk_efuse mt6358_regulator cqhci udc_core pwm_mtk_disp usb_common clk_mt8186_apmixedsys mtk_cmdq_mailbox mtk_pmic_wrap spi_mtk_nor i2c_mt65xx clk_mt8186_imp_iic_wrap spi_mt65xx clk_mt8186_topckgen cl
> [   24.600571] CPU: 7 UID: 0 PID: 54 Comm: kworker/7:0 Tainted: G      D W          6.11.0-next-20240916-deb-00002-g7b544e01c649 #1
> [   24.623719] Tainted: [D]=DIE, [W]=WARN
> [   24.631206] Hardware name: Google Magneton board (DT)
> [   24.641302] Workqueue: events mt7921_init_work [mt7921_common]
> [   24.652972] pstate: 60400009 (nZCv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=--)
> [   24.666899] pc : kthread_park+0x8c/0xe0
> [   24.674563] lr : mt7921s_init_reset+0x8c/0x248 [mt7921s]
> [   24.685186] sp : ffff800080473ce0
> [   24.691804] x29: ffff800080473ce0 x28: ffff0307803cef00 x27: ffff0307bf777c68
> [   24.706080] x26: ffffac78d07f18c0 x25: ffff0307803cef80 x24: ffff0307897b20c8
> [   24.720356] x23: ffff0307897be8c8 x22: ffff0307897b7768 x21: ffff800080473d00
> [   24.734631] x20: ffff0307897b7820 x19: ffff0307849f5c80 x18: 0000000000000008
> [   24.748908] x17: ffff568eef05e000 x16: ffffac78cf0dd428 x15: 0000000000000040
> [   24.763183] x14: ffffffffffffffff x13: 0000000000000339 x12: 0000000000000001
> [   24.777459] x11: ffffac78d07cee70 x10: 0000000000000bd0 x9 : ffffac78bc3cf054
> [   24.791734] x8 : ffff0307808ae8b0 x7 : 0000000000000004 x6 : 0000000000000000
> [   24.806009] x5 : ffff0307bf764348 x4 : ffff0307897b2080 x3 : ffff0307897b7770
> [   24.820285] x2 : ffff800080473d18 x1 : 0000000000005800 x0 : 0000000000400040
> [   24.834560] Call trace:
> [   24.839437]  kthread_park+0x8c/0xe0
> [   24.846405]  mt7921s_init_reset+0x8c/0x248 [mt7921s]
> [   24.856329]  mt7921_init_work+0xcc/0x228 [mt7921_common]
> [   24.866950]  process_one_work+0x178/0x3d0
> [   24.874962]  worker_thread+0x200/0x3f0
> [   24.882452]  kthread+0xe8/0xf8
> [   24.888550]  ret_from_fork+0x10/0x20
> [   24.895693] ---[ end trace 0000000000000000 ]---
> [   24.904974] Unable to handle kernel NULL pointer dereference at virtual address 0000000000000000
> [   24.922563] Mem abort info:
> [   24.928143]   ESR = 0x0000000096000004
> [   24.935638]   EC = 0x25: DABT (current EL), IL = 32 bits
> [   24.946265]   SET = 0, FnV = 0
> [   24.952365]   EA = 0, S1PTW = 0
> [   24.958641]   FSC = 0x04: level 0 translation fault
> [   24.968399] Data abort info:
> [   24.974153]   ISV = 0, ISS = 0x00000004, ISS2 = 0x00000000
> [   24.985126]   CM = 0, WnR = 0, TnD = 0, TagAccess = 0
> [   24.995231]   GCS = 0, Overlay = 0, DirtyBit = 0, Xs = 0
> [   25.005858] user pgtable: 4k pages, 48-bit VAs, pgdp=00000001012eb000
> [   25.018746] [0000000000000000] pgd=0000000000000000, p4d=0000000000000000
> [   25.032335] Internal error: Oops: 0000000096000004 [#2] SMP
> [   25.043480] Modules linked in: snd_seq_dummy snd_hrtimer snd_seq snd_seq_device qrtr binfmt_misc nls_ascii nls_cp437 vfat fat mtk_vcodec_dec_hw snd_sof_mt8186 mtk_vcodec_dec joydev mtk_jpeg mtk_adsp_common v4l2_vp9 mt7921s mtk_vcodec_enc mt76_sdio v4l2_h264 aes_ce_blk mtk_adsp_ipn
> [   25.043612]  cros_ec_sysfs cros_usbpd_logger led_class_multicolor cros_usbpd_notify mtd tpm_tis_core typec cros_charge_control elan_i2c snd_soc_core mtk_scp snd_compress mt6577_auxadc snd_pcm_dmaengine industrialio lvts_thermal snd_pcm mtk_rpmsg mtk_svs mtk_scp_ipi mtk_adsp_mailb3
> [   25.222435]  mtk_cmdq_helper mtk_sd clk_mt8186_mfg phy_mtk_mipi_dsi_drv drm nvmem_mtk_efuse mt6358_regulator cqhci udc_core pwm_mtk_disp usb_common clk_mt8186_apmixedsys mtk_cmdq_mailbox mtk_pmic_wrap spi_mtk_nor i2c_mt65xx clk_mt8186_imp_iic_wrap spi_mt65xx clk_mt8186_topckgen cl
> [   25.457674] CPU: 7 UID: 0 PID: 54 Comm: kworker/7:0 Tainted: G      D W          6.11.0-next-20240916-deb-00002-g7b544e01c649 #1
> [   25.480825] Tainted: [D]=DIE, [W]=WARN
> [   25.488312] Hardware name: Google Magneton board (DT)
> [   25.498411] Workqueue: events mt7921_init_work [mt7921_common]
> [   25.510083] pstate: 60400009 (nZCv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=--)
> [   25.524015] pc : kthread_park+0x2c/0xe0
> [   25.531685] lr : mt7921s_init_reset+0x8c/0x248 [mt7921s]
> [   25.542318] sp : ffff800080473ce0
> [   25.548939] x29: ffff800080473ce0 x28: ffff0307803cef00 x27: ffff0307bf777c68
> [   25.563216] x26: ffffac78d07f18c0 x25: ffff0307803cef80 x24: ffff0307897b20c8
> [   25.577492] x23: ffff0307897be8c8 x22: ffff0307897b7768 x21: ffff800080473d00
> [   25.591769] x20: 0000000000000000 x19: ffff0307849f5c80 x18: 0000000000000008
> [   25.606044] x17: ffff568eef05e000 x16: ffffac78cf0dd428 x15: 0000000000000040
> [   25.620320] x14: ffffffffffffffff x13: 0000000000000339 x12: 0000000000000001
> [   25.634595] x11: ffffac78d07cee70 x10: 0000000000000bd0 x9 : ffffac78bc3cf054
> [   25.648869] x8 : ffff0307808ae8b0 x7 : 0000000000000004 x6 : 0000000000000000
> [   25.663145] x5 : ffff0307bf764348 x4 : ffff0307897b2080 x3 : ffff0307897b7770
> [   25.677420] x2 : ffff800080473d18 x1 : 0000000000005800 x0 : 0000000000400040
> [   25.691696] Call trace:
> [   25.696574]  kthread_park+0x2c/0xe0
> [   25.703541]  mt7921s_init_reset+0x8c/0x248 [mt7921s]
> [   25.713466]  mt7921_init_work+0xcc/0x228 [mt7921_common]
> [   25.724089]  process_one_work+0x178/0x3d0
> [   25.732102]  worker_thread+0x200/0x3f0
> [   25.739592]  kthread+0xe8/0xf8
> [   25.745689]  ret_from_fork+0x10/0x20
> [   25.752832] Code: b9402c00 36a80360 f9431e74 371003a0 (f9400280)
> [   25.765018] ---[ end trace 0000000000000000 ]---
> [   26.133052] rfkill: input handler disabled
> [   27.756379] mtk-ccifreq cci: failed to add devfreq device: -517
> [   27.771837] platform cci: deferred probe pending: mtk-ccifreq: devfreq_add_device: Unable to start governor for the device
> [   27.794010] platform 1100bc00.svs: deferred probe pending: mtk-svs: failed to get OPP device for bank 3
> [   27.812847] platform sound: deferred probe pending: mt8186_mt6366: I2S3: codec dai not found
> [   32.523939]  mmcblk0: p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12
> [   37.986383] pp1840_vaux18: disabling
> [   37.993715] pp2800_vaud28: disabling
> 
> Debian GNU/Linux trixie/sid DEBIAN-T5-ARM64 ttyS0
> 
> DEBIAN-T5-ARM64 login: alpernebbi
> Password:
> Linux DEBIAN-T5-ARM64 6.11.0-next-20240916-deb-00002-g7b544e01c649 #1 SMP Mon Sep 16 17:42:49 +03 2024 aarch64
> 
> The programs included with the Debian GNU/Linux system are free software;
> the exact distribution terms for each program are described in the
> individual files in /usr/share/doc/*/copyright.
> 
> Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
> permitted by applicable law.
> You have new mail.
> 
> [   76.908268] PDLOG 2024/09/16 15:25:11.783 P0 SNK Charger ??? 5025mV max 5000mV / 500mA
> [   76.908268] PDLOG 2024/09/16 15:25:11.783 P0 SNK Charger ??? 5025mV max 5000mV / 500mA
> 
> $ sudo mount -t debugfs none /sys/kernel/debug
> [sudo] password for alpernebbi:
> 
> alpernebbi at DEBIAN-T5-ARM64 ~
> $ sudo cat /sys/kernel/debug/devices_deferred
> cci     mtk-ccifreq: devfreq_add_device: Unable to start governor for the device
> 1100bc00.svs    mtk-svs: failed to get OPP device for bank 3
> sound   mt8186_mt6366: I2S3: codec dai not found
> 
> alpernebbi at DEBIAN-T5-ARM64 ~
> $ lsmod
> Module                  Size  Used by
> snd_seq_dummy          12288  0
> snd_hrtimer            12288  1
> snd_seq                81920  7 snd_seq_dummy
> snd_seq_device         12288  1 snd_seq
> qrtr                   36864  2
> binfmt_misc            20480  1
> nls_ascii              12288  1
> nls_cp437              16384  1
> vfat                   20480  1
> fat                    73728  1 vfat
> mtk_vcodec_dec_hw      16384  0
> snd_sof_mt8186         24576  0
> mtk_vcodec_dec        163840  1 mtk_vcodec_dec_hw
> joydev                 28672  0
> mtk_jpeg               32768  0
> mtk_adsp_common        12288  1 snd_sof_mt8186
> v4l2_vp9               20480  1 mtk_vcodec_dec
> mt7921s                20480  0
> mtk_vcodec_enc         61440  0
> mt76_sdio              24576  1 mt7921s
> v4l2_h264              16384  1 mtk_vcodec_dec
> aes_ce_blk             32768  0
> mtk_adsp_ipc           16384  1 snd_sof_mt8186
> mtk_vcodec_dbgfs       12288  2 mtk_vcodec_enc,mtk_vcodec_dec
> mt7921_common          65536  1 mt7921s
> mtk_vcodec_common      20480  4 mtk_vcodec_enc,mtk_vcodec_dbgfs,mtk_vcodec_dec,mtk_vcodec_dec_hw
> mtk_jpeg_enc_hw        12288  1 mtk_jpeg
> aes_ce_cipher          12288  1 aes_ce_blk
> mt792x_lib             45056  2 mt7921s,mt7921_common
> snd_sof_xtensa_dsp     12288  1 snd_sof_mt8186
> crct10dif_ce           12288  1
> mt76_connac_lib        53248  3 mt792x_lib,mt7921s,mt7921_common
> polyval_ce             12288  0
> mtk_jpeg_dec_hw        16384  1 mtk_jpeg
> mtk_vpu                20480  1 mtk_vcodec_common
> uvcvideo              110592  0
> polyval_generic        12288  1 polyval_ce
> mt76                   94208  5 mt792x_lib,mt7921s,mt7921_common,mt76_sdio,mt76_connac_lib
> ghash_ce               16384  0
> videobuf2_vmalloc      16384  1 uvcvideo
> videobuf2_dma_contig    20480  3 mtk_jpeg,mtk_vcodec_enc,mtk_vcodec_dec
> snd_sof_of             12288  1 snd_sof_mt8186
> mac80211              946176  4 mt792x_lib,mt76,mt7921_common,mt76_connac_lib
> v4l2_mem2mem           28672  5 mtk_jpeg,mtk_vcodec_enc,mtk_jpeg_dec_hw,mtk_jpeg_enc_hw,mtk_vcodec_dec
> uvc                    12288  1 uvcvideo
> gf128mul               12288  2 polyval_generic,ghash_ce
> panfrost               77824  3
> snd_sof               172032  3 snd_sof_mt8186,mtk_adsp_common,snd_sof_of
> mt8186_mt6366          49152  0
> sha2_ce                12288  0
> libarc4                12288  1 mac80211
> videobuf2_memops       16384  2 videobuf2_vmalloc,videobuf2_dma_contig
> cros_ec_rpmsg          16384  0
> cfg80211              856064  4 mt76,mac80211,mt7921_common,mt76_connac_lib
> ofpart                 16384  0
> sha256_arm64           24576  1 sha2_ce
> snd_soc_mt8186_afe    241664  30 mt8186_mt6366
> cros_usbpd_charger     20480  0
> snd_sof_utils          16384  1 snd_sof
> spi_nor               106496  0
> cros_ec_typec          24576  0
> leds_cros_ec           12288  0
> gpu_sched              49152  1 panfrost
> snd_soc_dmic           12288  0
> tpm_tis_spi            16384  0
> videobuf2_v4l2         20480  5 mtk_jpeg,mtk_vcodec_enc,uvcvideo,mtk_vcodec_dec,v4l2_mem2mem
> snd_soc_bt_sco         12288  0
> sha1_ce                12288  0
> snd_soc_rt1015p        16384  0
> snd_soc_mt6358         61440  1 snd_soc_mt8186_afe
> videodev              253952  6 mtk_jpeg,mtk_vcodec_enc,videobuf2_v4l2,uvcvideo,mtk_vcodec_dec,v4l2_mem2mem
> rfkill                 28672  4 cfg80211
> videobuf2_common       53248  11 mtk_jpeg,mtk_vcodec_enc,videobuf2_vmalloc,videobuf2_dma_contig,mtk_jpeg_dec_hw,videobuf2_v4l2,mtk_jpeg_enc_hw,uvcvideo,mtk_vcodec_dec,v4l2_mem2mem,videobuf2_memops
> drm_shmem_helper       24576  1 panfrost
> mc                     61440  6 videodev,videobuf2_v4l2,uvcvideo,videobuf2_common,mtk_vcodec_dec,v4l2_mem2mem
> snd_soc_mtk_common     28672  2 snd_soc_mt8186_afe,mt8186_mt6366
> snd_soc_rt5682s        81920  0
> sbs_battery            20480  0
> cros_ec_debugfs        12288  0
> cros_ec_chardev        12288  0
> cros_ec_hwmon          12288  0
> cros_ec_sysfs          12288  0
> cros_usbpd_logger      16384  0
> led_class_multicolor    12288  1 leds_cros_ec
> cros_usbpd_notify      16384  2 cros_ec_typec,cros_usbpd_charger
> mtd                    69632  3 spi_nor,ofpart
> tpm_tis_core           24576  1 tpm_tis_spi
> typec                  61440  1 cros_ec_typec
> cros_charge_control    16384  0
> elan_i2c               36864  0
> snd_soc_core          245760  9 snd_soc_mt8186_afe,mt8186_mt6366,snd_soc_mt6358,snd_sof,snd_soc_bt_sco,snd_soc_mtk_common,snd_soc_rt1015p,snd_soc_dmic,snd_soc_rt5682s
> mtk_scp                36864  1 mtk_vcodec_common
> snd_compress           24576  2 snd_sof,snd_soc_core
> mt6577_auxadc          16384  0
> snd_pcm_dmaengine      12288  1 snd_soc_core
> industrialio           90112  1 mt6577_auxadc
> lvts_thermal           24576  0
> snd_pcm               122880  9 snd_soc_mt8186_afe,mt8186_mt6366,snd_sof,snd_soc_mtk_common,snd_compress,snd_soc_core,snd_sof_utils,snd_soc_rt5682s,snd_pcm_dmaengine
> mtk_rpmsg              12288  1 mtk_scp
> mtk_svs                49152  0
> mtk_scp_ipi            12288  2 mtk_vcodec_common,mtk_scp
> mtk_adsp_mailbox       12288  2
> rpmsg_core             16384  2 mtk_rpmsg,cros_ec_rpmsg
> memconsole_coreboot    12288  0
> mtk_wdt                12288  1
> governor_passive       12288  0
> snd_timer              40960  3 snd_seq,snd_hrtimer,snd_pcm
> memconsole             12288  1 memconsole_coreboot
> vpd_sysfs              12288  0
> snd                    94208  12 snd_soc_mt8186_afe,snd_seq,snd_seq_device,mt8186_mt6366,snd_soc_mt6358,snd_sof,snd_timer,snd_compress,snd_soc_core,snd_pcm
> ramoops                24576  0
> mtk_cci_devfreq        12288  0
> soundcore              12288  1 snd
> reed_solomon           16384  1 ramoops
> sg                     32768  0
> evdev                  20480  7
> efi_pstore             12288  0
> configfs               49152  1
> nfnetlink              16384  1
> ip_tables              24576  0
> x_tables               32768  1 ip_tables
> autofs4                49152  2
> ext4                  786432  2
> crc32c_generic         12288  4
> crc16                  12288  1 ext4
> mbcache                16384  1 ext4
> jbd2                  135168  1 ext4
> sd_mod                 61440  4
> uas                    24576  0
> usb_storage            73728  5 uas
> scsi_mod              233472  4 sd_mod,usb_storage,uas,sg
> scsi_common            12288  5 scsi_mod,sd_mod,usb_storage,uas,sg
> onboard_usb_dev        16384  0
> xhci_mtk_hcd           28672  0
> xhci_hcd              253952  1 xhci_mtk_hcd
> usbcore               278528  6 xhci_hcd,onboard_usb_dev,usb_storage,uvcvideo,xhci_mtk_hcd,uas
> panel_edp              32768  0
> cros_ec_keyb           16384  0
> i2c_hid_of             12288  0
> i2c_cros_ec_tunnel     12288  0
> matrix_keymap          12288  1 cros_ec_keyb
> rtc_mt6397             12288  1
> cros_ec_dev            12288  0
> anx7625                49152  0
> i2c_hid                36864  1 i2c_hid_of
> hid                   229376  1 i2c_hid
> clk_mt8186_mm          12288  26
> drm_dp_aux_bus         12288  2 anx7625,panel_edp
> mt6397                 24576  0
> cros_ec_spi            20480  0
> cros_ec                16384  2 cros_ec_spi,cros_ec_rpmsg
> gpio_keys              16384  0
> clk_mt8186_ipe         12288  8
> mediatek_drm          139264  4
> clk_mt8186_mdp         12288  2
> drm_display_helper    143360  3 anx7625,panel_edp,mediatek_drm
> phy_mtk_tphy           28672  3
> clk_mt8186_mcu         12288  0
> clk_mt8186_cam         12288  9
> mtk_iommu              32768  8
> drm_dma_helper         16384  2 mediatek_drm
> clk_mt8186_vdec        12288  5
> clk_mt8186_venc        12288  5
> mtk_smi                20480  0
> clk_mt8186_wpe         12288  4
> drm_kms_helper        139264  5 anx7625,drm_dma_helper,drm_shmem_helper,drm_display_helper,mediatek_drm
> mtk_mutex              20480  1 mediatek_drm
> mtk_mmsys              24576  1 mediatek_drm
> clk_mt8186_img         12288  5
> mtu3                  106496  0
> mtk_cmdq_helper        16384  3 mtk_mmsys,mtk_mutex,mediatek_drm
> mtk_sd                 49152  0
> clk_mt8186_mfg         12288  2
> phy_mtk_mipi_dsi_drv    20480  2
> drm                   479232  15 gpu_sched,i2c_hid,anx7625,drm_kms_helper,drm_dma_helper,panel_edp,drm_shmem_helper,drm_display_helper,mediatek_drm,panfrost
> nvmem_mtk_efuse        12288  0
> mt6358_regulator       45056  25
> cqhci                  24576  1 mtk_sd
> udc_core               53248  1 mtu3
> pwm_mtk_disp           12288  1
> usb_common             12288  6 xhci_hcd,usbcore,uvcvideo,xhci_mtk_hcd,mtu3,udc_core
> clk_mt8186_apmixedsys    12288  0
> mtk_cmdq_mailbox       20480  2 mtk_cmdq_helper
> mtk_pmic_wrap          36864  0
> spi_mtk_nor            20480  0
> i2c_mt65xx             28672  0
> clk_mt8186_imp_iic_wrap    12288  5
> spi_mt65xx             24576  0
> clk_mt8186_topckgen    20480  47
> clk_mt8186_infra_ao    20480  43
> fixed                  16384  45
> pwm_bl                 16384  0
> 
> alpernebbi at DEBIAN-T5-ARM64 ~
> $ cat /etc/modprobe.d/mtk.conf
> softdep mtk_smi pre: mtk-pmic-wrap mt6358-regulator
> softdep mtk_iommu pre: mtk_smi
> softdep mtk-sd pre: mt6358-regulator
> softdep mtu3 pre: mt6358-regulator
> softdep mediatek-drm pre: mt6358-regulator mtk_iommu
> 
> alpernebbi at DEBIAN-T5-ARM64 ~
> $ sudo systemctl poweroff
> 
> [  348.928608] rfkill: input handler enabled
> [  349.278237] coredump: 2541(plymouthd): over coredump resource limit, skipping core dump
> [  349.294278] coredump: 2541(plymouthd): coredump has not been created, error -7
> [  349.550635] detected fb_set_par error, error code: -16
> [  OK  ] Stopped session-1.scope - Session 1 of User alpernebbi.
>          Stopping user at 1000.service - User Manager for UID 1000...
> [  OK  ] Stopped user at 1000.service - User Manager for UID 1000.
>          Stopping systemd-user-sessions.service - Permit User Sessions...
>          Stopping user-runtime-dir at 1000.ser?Runtime Directory /run/user/1000...
> [  OK  ] Stopped systemd-user-sessions.service - Permit User Sessions.
> [  OK  ] Unmounted run-user-1000.mount - /run/user/1000.
> [  OK  ] Stopped user-runtime-dir at 1000.serv?r Runtime Directory /run/user/1000.
> [  OK  ] Removed slice user-1000.slice - User Slice of UID 1000.
> [  OK  ] Stopped target network.target - Network.
> [  OK  ] Stopped target remote-fs.target - Remote File Systems.
>          Stopping NetworkManager.service - Network Manager...
>          Stopping networking.service - Raise network interfaces...
>          Stopping systemd-logind.service - User Login Management...
>          Stopping wpa_supplicant.service - WPA supplicant...
> [  OK  ] Stopped NetworkManager.service - Network Manager.
> [  OK  ] Stopped wpa_supplicant.service - WPA supplicant.
> [  OK  ] Stopped systemd-logind.service - User Login Management.
> [  OK  ] Stopped target nss-user-lookup.target - User and Group Name Lookups.
>          Stopping dbus.service - D-Bus System Message Bus...
> [  OK  ] Stopped dbus.service - D-Bus System Message Bus.
> [  OK  ] Stopped networking.service - Raise network interfaces.
> [  OK  ] Stopped target basic.target - Basic System.
> [  OK  ] Stopped systemd-ask-password-plymo?quests to Plymouth Directory Watch.
> [  OK  ] Stopped target paths.target - Path Units.
> [  OK  ] Stopped cups.path - CUPS Scheduler.
> [  OK  ] Stopped target slices.target - Slice Units.
> [  OK  ] Removed slice user.slice - User and Session Slice.
> [  OK  ] Stopped target sockets.target - Socket Units.
> [  OK  ] Closed avahi-daemon.socket - Avahi?DNS/DNS-SD Stack Activation Socket.
> [  OK  ] Closed cups.socket - CUPS Scheduler.
> [  OK  ] Closed dbus.socket - D-Bus System Message Bus Socket.
> [  OK  ] Closed sshd-unix-local.socket - Op?temd-ssh-generator, AF_UNIX Local).
> [  OK  ] Closed systemd-hostnamed.socket - Hostname Service Socket.
> [  OK  ] Stopped target sysinit.target - System Initialization.
> [  OK  ] Stopped target cryptsetup.target - Local Encrypted Volumes.
> [  OK  ] Stopped systemd-ask-password-wall.?d Requests to Wall Directory Watch.
> [  OK  ] Stopped target integritysetup.targ? Local Integrity Protected Volumes.
> [  OK  ] Stopped target veritysetup.target - Local Verity Protected Volumes.
>          Stopping systemd-backlight at backlig?ness of backlight:backlight-lcd0...
>          Stopping systemd-binfmt.service - Set Up Additional Binary Formats...
> [  OK  ] Stopped systemd-sysctl.service - Apply Kernel Variables.
> [  OK  ] Stopped systemd-modules-load.service - Load Kernel Modules.
>          Stopping systemd-timesyncd.service - Network Time Synchronization...
>          Stopping systemd-update-utmp.servi?ord System Boot/Shutdown in UTMP...
> [  OK  ] Stopped systemd-backlight at backligh?htness of backlight:backlight-lcd0.
> [  OK  ] Stopped systemd-timesyncd.service - Network Time Synchronization.
> [  OK  ] Stopped systemd-binfmt.service - Set Up Additional Binary Formats.
> [  OK  ] Removed slice system-systemd\x2dba? - Slice /system/systemd-backlight.
> [  OK  ] Unset automount proc-sys-fs-binfmt?ormats File System Automount Point.
> [  OK  ] Stopped systemd-update-utmp.servic?ecord System Boot/Shutdown in UTMP.
> [  OK  ] Stopped systemd-tmpfiles-setup.ser?reate System Files and Directories.
> [  OK  ] Stopped target local-fs.target - Local File Systems.
>          Unmounting boot-efi.mount - /boot/efi...
>          Unmounting home.mount - /home...
>          Unmounting run-lock.mount - Legacy Locks Directory /run/lock...
>          Unmounting tmp.mount - Temporary Directory /tmp...
> [  OK  ] Unmounted run-lock.mount - Legacy Locks Directory /run/lock.
> [  OK  ] Unmounted tmp.mount - Temporary Directory /tmp.
> [  OK  ] Stopped target swap.target - Swaps.
>          Deactivating swap dev-disk-by\x2dd?p - /dev/disk/by-diskseq/4-part6...
> [  OK  ] Unmounted boot-efi.mount - /boot/efi.
> [  OK  ] Stopped systemd-fsck at dev-disk-by\x?eck on /dev/disk/by-uuid/9409-DA15.
> [  OK  ] Deactivated swap dev-disk-by\x2dpa?8079f9-9be3-4040-b0c6-135b958b076c.
> [  OK  ] Deactivated swap dev-disk-by\x2did?able_SSD_T5_1234567E4FF2-0:0-part6.
> [  OK  ] Deactivated swap dev-disk-by\x2dpa?8079f9-9be3-4040-b0c6-135b958b076c.
> [  OK  ] Deactivated swap dev-disk-by\x2dpa?da49dd-921b-4e87-9b65-3ecbd9905707.
> [  OK  ] Deactivated swap dev-disk-by\x2ddi?wap - /dev/disk/by-diskseq/4-part6.
> [  OK  ] Deactivated swap dev-disk-by\x2did?table_SSD_T5_S46UNV0M200584Z-part6.
> [  OK    351.791891] EXT4-fs (sda2): unmounting filesystem 605450ef-43fc-41e4-83d7-9c204d5c1c03.
> 0m] Deactivated [swap dev-disk-by\x2did?by-id/wwn-0x5002538e00000000-part6.
>   351.791891] EXT4-fs (sda2): unmounting filesystem 605450ef-43fc-41e4-83d7-9c204d5c1c03.
> [  OK  ] Deactivated swap dev-disk-by\x2dpa?1.0-scsi-0:0:0:0-part/by-partnum/6.
> [  OK  ] Deactivated swap dev-disk-by\x2dpa?b-usb-0:1.2:1.0-scsi-0:0:0:0-part6.
> [  OK  ] Deactivated swap dev-disk-by\x2dpa?-0:0:0:0-part/by-partlabel/SWAP-T5.
> [  OK  ] Deactivated swap dev-disk-by\x2dpa?usbv3-0:1.2:1.0-scsi-0:0:0:0-part6.
> [  OK  ] Deactivated swap dev-disk-by\x2dpa?p - /dev/disk/by-partlabel/SWAP-T5.
> [  OK  ] Deactivated swap dev-sda6.swap - /dev/sda6.
> [  OK  ] Unmounted home.mount - /home.
> [  OK  ] Deactivated swap dev-disk-by\x2duu?da49dd-921b-4e87-9b65-3ecbd9905707.
> [  OK  ] Reached target umount.target - Unmount All Filesystems.
> [  OK  ] Stopped systemd-fsck at dev-disk-by\x?5450ef-43fc-41e4-83d7-9c204d5c1c03.
> [  OK  ] Removed slice system-systemd\x2dfs?slice - Slice /system/systemd-fsck.
> [  OK  ] Stopped target local-fs-pre.target?Preparation for Local File Systems.
> [  OK  ] Stopped systemd-remount-fs.service?mount Root and Kernel File Systems.
> [  OK  ] Stopped systemd-tmpfiles-setup-dev?Create Static Device Nodes in /dev.
> [  OK  ] Stopped systemd-tmpfiles-setup-dev?ic Device Nodes in /dev gracefully.
> [  OK  ] Reached target shutdown.target - System Shutdown.
> [  OK  ] Reached target final.target - Late Shutdown Services.
> [  OK  ] Finished systemd-poweroff.service - System Power Off.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 228 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-mediatek/attachments/20240917/45811cc0/attachment-0001.sig>

From wangyuli at uniontech.com  Mon Sep 16 20:55:45 2024
From: wangyuli at uniontech.com (WangYuli)
Date: Tue, 17 Sep 2024 11:55:45 +0800
Subject: [PATCH] Bluetooth: btusb: Add MT7925 support for ID 0x13d3:0x3608
Message-ID: <C2837417C967D014+20240917035545.21209-1-wangyuli@uniontech.com>

From: F?lix Jara <hello at felixjara.me>

Add compatibility Bluetooth device MT7925 for Asus UM5606 with
ID 13d3:3608.

The device info from /sys/kernel/debug/usb/devices as below.

T:  Bus=03 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#=  2 Spd=480  MxCh= 0
D:  Ver= 2.10 Cls=ef(misc ) Sub=02 Prot=01 MxPS=64 #Cfgs=  1
P:  Vendor=13d3 ProdID=3608 Rev= 1.00
S:  Manufacturer=MediaTek Inc.
S:  Product=Wireless_Device
S:  SerialNumber=000000000
C:* #Ifs= 3 Cfg#= 1 Atr=e0 MxPwr=100mA
A:  FirstIf#= 0 IfCount= 3 Cls=e0(wlcon) Sub=01 Prot=01
I:* If#= 0 Alt= 0 #EPs= 3 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
E:  Ad=81(I) Atr=03(Int.) MxPS=  16 Ivl=125us
E:  Ad=82(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
I:* If#= 1 Alt= 0 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
E:  Ad=83(I) Atr=01(Isoc) MxPS=   0 Ivl=1ms
E:  Ad=03(O) Atr=01(Isoc) MxPS=   0 Ivl=1ms
I:  If#= 1 Alt= 1 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
E:  Ad=83(I) Atr=01(Isoc) MxPS=   9 Ivl=1ms
E:  Ad=03(O) Atr=01(Isoc) MxPS=   9 Ivl=1ms
I:  If#= 1 Alt= 2 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
E:  Ad=83(I) Atr=01(Isoc) MxPS=  17 Ivl=1ms
E:  Ad=03(O) Atr=01(Isoc) MxPS=  17 Ivl=1ms
I:  If#= 1 Alt= 3 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
E:  Ad=83(I) Atr=01(Isoc) MxPS=  25 Ivl=1ms
E:  Ad=03(O) Atr=01(Isoc) MxPS=  25 Ivl=1ms
I:  If#= 1 Alt= 4 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
E:  Ad=83(I) Atr=01(Isoc) MxPS=  33 Ivl=1ms
E:  Ad=03(O) Atr=01(Isoc) MxPS=  33 Ivl=1ms
I:  If#= 1 Alt= 5 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
E:  Ad=83(I) Atr=01(Isoc) MxPS=  49 Ivl=1ms
E:  Ad=03(O) Atr=01(Isoc) MxPS=  49 Ivl=1ms
I:  If#= 1 Alt= 6 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
E:  Ad=83(I) Atr=01(Isoc) MxPS=  63 Ivl=1ms
E:  Ad=03(O) Atr=01(Isoc) MxPS=  63 Ivl=1ms
I:* If#= 2 Alt= 0 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=(none)
E:  Ad=8a(I) Atr=03(Int.) MxPS=  64 Ivl=125us
E:  Ad=0a(O) Atr=03(Int.) MxPS=  64 Ivl=125us
I:  If#= 2 Alt= 1 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=(none)
E:  Ad=8a(I) Atr=03(Int.) MxPS= 512 Ivl=125us
E:  Ad=0a(O) Atr=03(Int.) MxPS= 512 Ivl=125us

Tested in Asus Zenbook S 16 UM5606XA

Signed-off-by: F?lix Jara <hello at felixjara.me>
Tested-by: F?lix Jara <hello at felixjara.me>
Link: https://github.com/openSUSE/kernel/pull/10
Signed-off-by: WangYuli <wangyuli at uniontech.com>
---
 drivers/bluetooth/btusb.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
index cd22b34542d5..ff804a2b6c94 100644
--- a/drivers/bluetooth/btusb.c
+++ b/drivers/bluetooth/btusb.c
@@ -508,6 +508,9 @@ static const struct usb_device_id blacklist_table[] = {
 	{ USB_DEVICE(0x13d3, 0x3568), .driver_info = BTUSB_MEDIATEK |
 						     BTUSB_WIDEBAND_SPEECH |
 						     BTUSB_VALID_LE_STATES },
+	{ USB_DEVICE(0x13d3, 0x3608), .driver_info = BTUSB_MEDIATEK |
+						     BTUSB_WIDEBAND_SPEECH |
+						     BTUSB_VALID_LE_STATES },
 	{ USB_DEVICE(0x0489, 0xe0e2), .driver_info = BTUSB_MEDIATEK |
 						     BTUSB_WIDEBAND_SPEECH |
 						     BTUSB_VALID_LE_STATES },
-- 
2.43.0



From kvalo at kernel.org  Mon Sep 16 23:17:20 2024
From: kvalo at kernel.org (Kalle Valo)
Date: Tue, 17 Sep 2024 09:17:20 +0300
Subject: BUG and WARNINGs from mt7921s on next-20240916
In-Reply-To: <ZujCwvd4XiwljDyv@lore-desk> (Lorenzo Bianconi's message of "Tue,
	17 Sep 2024 01:44:02 +0200")
References: <144fbf79-950c-4cd1-bc68-4e00b47b03e9@gmail.com>
	<ZujCwvd4XiwljDyv@lore-desk>
Message-ID: <87ldzqdcsv.fsf@kernel.org>

Lorenzo Bianconi <lorenzo at kernel.org> writes:

>> Hi,
>> 
>> I ran into some bug messages while testing linux-next on a MT8186
>> Magneton Chromebook (mt8186-corsola-magneton-sku393218). It boots 
>> to the OS, but at least Wi-Fi and Bluetooth are unavailable.
>> 
>> As a start, I tried reverting commit abbd838c579e ("Merge tag 
>> 'mt76-for-kvalo-2024-09-06' of https://github.com/nbd168/wireless")
>> and it works fine after that. Didn't have time to do a full bisect, 
>> but will try if nobody has any immediate opinions.
>> 
>> There are a few traces, here's some select lines to catch your attention,
>> not sure how informational they are:
>> 
>> [   16.040525] kernel BUG at net/core/skbuff.c:2268!
>> [   16.040531] Internal error: Oops - BUG: 00000000f2000800 [#1] SMP
>> [ 16.040803] CPU: 3 UID: 0 PID: 526 Comm: mt76-sdio-txrx Not tainted
>> 6.11.0-next-20240916-deb-00002-g7b544e01c649 #1
>> [   16.040897] Call trace:
>> [   16.040899]  pskb_expand_head+0x2b0/0x3c0
>> [   16.040905]  mt76s_tx_run_queue+0x274/0x410 [mt76_sdio]
>> [   16.040909]  mt76s_txrx_worker+0xe4/0xac8 [mt76_sdio]
>> [   16.040914]  mt7921s_txrx_worker+0x98/0x1e0 [mt7921s]
>> [   16.040924]  __mt76_worker_fn+0x80/0x128 [mt76]
>> [   16.040934]  kthread+0xe8/0xf8
>> [   16.040940]  ret_from_fork+0x10/0x20
>
> Hi,
>
> I guess this issue has been introduced by the following commit:
>
> commit 3688c18b65aeb2a1f2fde108400afbab129a8cc1
> Author: Felix Fietkau <nbd at nbd.name>
> Date:   Tue Aug 27 11:30:01 2024 +0200                  
>
>     wifi: mt76: mt7915: retry mcu messages                                            
>                         
>     In some cases MCU messages can get lost. Instead of failing completely,
>     attempt to recover by re-sending them.
>      
>     Link: https://patch.msgid.link/20240827093011.18621-14-nbd at nbd.name
>     Signed-off-by: Felix Fietkau <nbd at nbd.name>
>
>
> In particular, skb_get() in mt76_mcu_skb_send_and_get_msg() is bumping skb users
> refcount (making the skb shared) and pskb_expand_head() (run by __skb_grow() in
> mt76s_tx_run_queue()) does not like shared skbs.
>
> @Felix: any input on it?

Adding regressions list to Cc.

-- 
https://patchwork.kernel.org/project/linux-wireless/list/

https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches


From krzk at kernel.org  Tue Sep 17 00:00:23 2024
From: krzk at kernel.org (Krzysztof Kozlowski)
Date: Tue, 17 Sep 2024 09:00:23 +0200
Subject: [PATCH v5 2/3] dt-bindings: mfd: mediatek: mt6397: Convert to DT
 schema format
In-Reply-To: <20240916151132.32321-2-macpaul.lin@mediatek.com>
References: <20240916151132.32321-1-macpaul.lin@mediatek.com>
 <20240916151132.32321-2-macpaul.lin@mediatek.com>
Message-ID: <iudkiamza3lsl33tsby3sghfy66rj2tgg3kqjjwzeba46oxtpi@yrri5m5skjld>

On Mon, Sep 16, 2024 at 11:11:31PM +0800, Macpaul Lin wrote:
> Convert the mfd: mediatek: mt6397 binding to DT schema format.
> 
> MT6323, MT6358, and MT6397 are PMIC devices with multiple function
> subdevices. They share a common PMIC design but have variations in
> subdevice combinations.
> 
> Key updates in this conversion:

...

> +                regulator-name = "vproc";
> +                regulator-min-microvolt = < 700000>;
> +                regulator-max-microvolt = <1350000>;
> +                regulator-ramp-delay = <12500>;
> +                regulator-always-on;
> +                regulator-boot-on;
> +            };
> +
> +            buck_vsys {
> +                regulator-name = "vsys";
> +                regulator-min-microvolt = <1400000>;
> +                regulator-max-microvolt = <2987500>;
> +                regulator-ramp-delay = <25000>;
> +                regulator-always-on;
> +                regulator-boot-on;
> +            };
> +
> +            buck_vpa {
> +                regulator-name = "vpa";
> +                regulator-min-microvolt = < 500000>;
> +                regulator-max-microvolt = <3650000>;
> +            };
> +
> +            ldo_vtcxo {
> +                regulator-name = "vtcxo";
> +                regulator-min-microvolt = <2800000>;
> +                regulator-max-microvolt = <2800000>;
> +                regulator-enable-ramp-delay = <90>;
> +                regulator-always-on;
> +                regulator-boot-on;
> +            };
> +
> +            ldo_vcn28 {
> +                regulator-name = "vcn28";
> +                regulator-min-microvolt = <2800000>;
> +                regulator-max-microvolt = <2800000>;
> +                regulator-enable-ramp-delay = <185>;
> +            };
> +
> +            ldo_vcn33_bt {
> +                regulator-name = "vcn33_bt";
> +                regulator-min-microvolt = <3300000>;
> +                regulator-max-microvolt = <3600000>;
> +                regulator-enable-ramp-delay = <185>;
> +            };
> +
> +            ldo_vcn33_wifi {
> +                regulator-name = "vcn33_wifi";
> +                regulator-min-microvolt = <3300000>;
> +                regulator-max-microvolt = <3600000>;
> +                regulator-enable-ramp-delay = <185>;
> +            };
> +
> +            ldo_va {
> +                regulator-name = "va";
> +                regulator-min-microvolt = <2800000>;
> +                regulator-max-microvolt = <2800000>;
> +                regulator-enable-ramp-delay = <216>;
> +                regulator-always-on;
> +                regulator-boot-on;
> +            };
> +
> +            ldo_vcama {
> +                regulator-name = "vcama";
> +                regulator-min-microvolt = <1500000>;
> +                regulator-max-microvolt = <2800000>;
> +                regulator-enable-ramp-delay = <216>;
> +            };
> +
> +            ldo_vio28 {
> +                regulator-name = "vio28";
> +                regulator-min-microvolt = <2800000>;
> +                regulator-max-microvolt = <2800000>;
> +                regulator-enable-ramp-delay = <216>;
> +                regulator-always-on;
> +                regulator-boot-on;
> +            };
> +
> +            ldo_vusb {
> +                regulator-name = "vusb";
> +                regulator-min-microvolt = <3300000>;
> +                regulator-max-microvolt = <3300000>;
> +                regulator-enable-ramp-delay = <216>;
> +                regulator-boot-on;
> +            };
> +
> +            ldo_vmc {
> +                regulator-name = "vmc";
> +                regulator-min-microvolt = <1800000>;
> +                regulator-max-microvolt = <3300000>;
> +                regulator-enable-ramp-delay = <36>;
> +                regulator-boot-on;
> +            };
> +
> +            ldo_vmch {
> +                regulator-name = "vmch";
> +                regulator-min-microvolt = <3000000>;
> +                regulator-max-microvolt = <3300000>;
> +                regulator-enable-ramp-delay = <36>;
> +                regulator-boot-on;
> +            };
> +
> +            ldo_vemc3v3 {
> +                regulator-name = "vemc3v3";
> +                regulator-min-microvolt = <3000000>;
> +                regulator-max-microvolt = <3300000>;
> +                regulator-enable-ramp-delay = <36>;
> +                regulator-boot-on;
> +            };
> +
> +            ldo_vgp1 {
> +                regulator-name = "vgp1";
> +                regulator-min-microvolt = <1200000>;
> +                regulator-max-microvolt = <3300000>;
> +                regulator-enable-ramp-delay = <216>;
> +            };
> +
> +            ldo_vgp2 {
> +                regulator-name = "vgp2";
> +                regulator-min-microvolt = <1200000>;
> +                regulator-max-microvolt = <3000000>;
> +                regulator-enable-ramp-delay = <216>;
> +            };
> +
> +            ldo_vgp3 {
> +                regulator-name = "vgp3";
> +                regulator-min-microvolt = <1200000>;
> +                regulator-max-microvolt = <1800000>;
> +                regulator-enable-ramp-delay = <216>;
> +            };
> +
> +            ldo_vcn18 {
> +                regulator-name = "vcn18";
> +                regulator-min-microvolt = <1800000>;
> +                regulator-max-microvolt = <1800000>;
> +                regulator-enable-ramp-delay = <216>;
> +            };
> +
> +            ldo_vsim1 {
> +                regulator-name = "vsim1";
> +                regulator-min-microvolt = <1800000>;
> +                regulator-max-microvolt = <3000000>;
> +                regulator-enable-ramp-delay = <216>;
> +            };
> +
> +            ldo_vsim2 {
> +                regulator-name = "vsim2";
> +                regulator-min-microvolt = <1800000>;
> +                regulator-max-microvolt = <3000000>;
> +                regulator-enable-ramp-delay = <216>;
> +            };
> +
> +            ldo_vrtc {
> +                regulator-name = "vrtc";
> +                regulator-min-microvolt = <2800000>;
> +                regulator-max-microvolt = <2800000>;
> +                regulator-always-on;
> +                regulator-boot-on;
> +            };
> +
> +            ldo_vcamaf {
> +                regulator-name = "vcamaf";
> +                regulator-min-microvolt = <1200000>;
> +                regulator-max-microvolt = <3300000>;
> +                regulator-enable-ramp-delay = <216>;
> +            };
> +
> +            ldo_vibr {
> +                regulator-name = "vibr";
> +                regulator-min-microvolt = <1200000>;
> +                regulator-max-microvolt = <3300000>;
> +                regulator-enable-ramp-delay = <36>;
> +            };
> +
> +            ldo_vrf18 {
> +                regulator-name = "vrf18";
> +                regulator-min-microvolt = <1825000>;
> +                regulator-max-microvolt = <1825000>;
> +                regulator-enable-ramp-delay = <187>;
> +            };
> +
> +            ldo_vm {
> +                regulator-name = "vm";
> +                regulator-min-microvolt = <1200000>;
> +                regulator-max-microvolt = <1800000>;
> +                regulator-enable-ramp-delay = <216>;
> +                regulator-always-on;
> +                regulator-boot-on;
> +            };
> +
> +            ldo_vio18 {
> +                regulator-name = "vio18";
> +                regulator-min-microvolt = <1800000>;
> +                regulator-max-microvolt = <1800000>;
> +                regulator-enable-ramp-delay = <216>;
> +                regulator-always-on;
> +                regulator-boot-on;
> +            };
> +
> +           ldo_vcamd {
> +                regulator-name = "vcamd";
> +                regulator-min-microvolt = <1200000>;
> +                regulator-max-microvolt = <1800000>;
> +                regulator-enable-ramp-delay = <216>;
> +            };
> +
> +            ldo_vcamio {
> +                regulator-name = "vcamio";
> +                regulator-min-microvolt = <1800000>;
> +                regulator-max-microvolt = <1800000>;
> +                regulator-enable-ramp-delay = <216>;
> +            };
> +        };
> +
> +        keys {
> +            compatible = "mediatek,mt6323-keys";
> +            mediatek,long-press-mode = <1>;
> +            power-off-time-sec = <0>;
> +
> +            power {
> +                    linux,keycodes = <116>;

Messed indentation.

> +                    wakeup-source;
> +            };
> +
> +            home {
> +                    linux,keycodes = <114>;
> +            };
> +        };
> +
> +        power-controller {
> +            compatible = "mediatek,mt6323-pwrc";
> +            #power-domain-cells = <0>;
> +        };
> +
> +        rtc {
> +            compatible = "mediatek,mt6323-rtc";
> +        };
> +    };

Keep one complete example. Maybye two if they are significantly
different, but I don't see these differences.


> +
> +  - |
> +    #include <dt-bindings/input/input.h>
> +    #include <dt-bindings/interrupt-controller/arm-gic.h>
> +
> +    pmic {
> +        compatible = "mediatek,mt6358">


....

> -	Required properties:
> -		- compatible: "mediatek,mt6397-pinctrl"
> -	For details, see ../pinctrl/pinctrl-mt65xx.txt

Best regards,
Krzysztof



From krzk at kernel.org  Tue Sep 17 00:01:10 2024
From: krzk at kernel.org (Krzysztof Kozlowski)
Date: Tue, 17 Sep 2024 09:01:10 +0200
Subject: [PATCH v5 3/3] regulator: dt-bindings: mt6397: move examples to
 parent PMIC mt6397
In-Reply-To: <20240916151132.32321-3-macpaul.lin@mediatek.com>
References: <20240916151132.32321-1-macpaul.lin@mediatek.com>
 <20240916151132.32321-3-macpaul.lin@mediatek.com>
Message-ID: <ev4kqtbjwglrti3mk2cnayilj4muy7ll7ux2uwlekcwu73dy5e@h4wvpucmyepw>

On Mon, Sep 16, 2024 at 11:11:32PM +0800, Macpaul Lin wrote:
> Since the DT schema of multiple function PMIC mt6397 has been converted,
> move the examples in "mediatek,mt6397-regulator.yaml" to the parent schema
> "mediatek,mt6397.yaml".

Is there any error otherwise? Why this cannot stay here, since it is
already there?

Best regards,
Krzysztof



From gur.stavi at huawei.com  Tue Sep 17 01:10:56 2024
From: gur.stavi at huawei.com (Gur Stavi)
Date: Tue, 17 Sep 2024 11:10:56 +0300
Subject: [PATCH 1/2] net: dsa: RCU-protect dsa_ptr in struct net_device
In-Reply-To: <20240910130321.337154-2-alexander.sverdlin@siemens.com>
References: <20240910130321.337154-2-alexander.sverdlin@siemens.com>
Message-ID: <20240917081056.1644806-1-gur.stavi@huawei.com>

> @@ -1594,10 +1592,11 @@ void dsa_switch_shutdown(struct dsa_switch *ds)
>  	}
>
>  	/* Disconnect from further netdevice notifiers on the conduit,
> -	 * since netdev_uses_dsa() will now return false.
> +	 * from now on, netdev_uses_dsa_currently() will return false.
>  	 */
>  	dsa_switch_for_each_cpu_port(dp, ds)
> -		dp->conduit->dsa_ptr = NULL;
> +		rcu_assign_pointer(dp->conduit->dsa_ptr, NULL);
> +	synchronize_rcu();
>
>  	rtnl_unlock();
>  out:

Hi, I am a newbie here. Thanks for the opportunity for learning more
about rcu.
Wouldn't it make more sense to call synchronize_rcu after rtnl_unlock?


From alexander.sverdlin at siemens.com  Tue Sep 17 01:25:19 2024
From: alexander.sverdlin at siemens.com (Sverdlin, Alexander)
Date: Tue, 17 Sep 2024 08:25:19 +0000
Subject: [PATCH 1/2] net: dsa: RCU-protect dsa_ptr in struct net_device
In-Reply-To: <20240917081056.1644806-1-gur.stavi@huawei.com>
References: <20240910130321.337154-2-alexander.sverdlin@siemens.com>
	 <20240917081056.1644806-1-gur.stavi@huawei.com>
Message-ID: <c7a52a818c1ae49ad7e44bb82fcea53d7f53d6e0.camel@siemens.com>

Hello Gur!

On Tue, 2024-09-17 at 11:10 +0300, Gur Stavi wrote:
> > @@ -1594,10 +1592,11 @@ void dsa_switch_shutdown(struct dsa_switch *ds)
> > ??	}
> > 
> > ??	/* Disconnect from further netdevice notifiers on the conduit,
> > -	 * since netdev_uses_dsa() will now return false.
> > +	 * from now on, netdev_uses_dsa_currently() will return false.
> > ??	 */
> > ??	dsa_switch_for_each_cpu_port(dp, ds)
> > -		dp->conduit->dsa_ptr = NULL;
> > +		rcu_assign_pointer(dp->conduit->dsa_ptr, NULL);
> > +	synchronize_rcu();
> > 
> > ??	rtnl_unlock();
> > ? out:
> 
> Hi, I am a newbie here. Thanks for the opportunity for learning more
> about rcu.
> Wouldn't it make more sense to call synchronize_rcu after rtnl_unlock?

This is indeed a question which is usually resolved other way around
(making locked section shorter), but in this particular case I thought that:
- we actually don't need giving rtnl lock sooner, which would potentially
  make synchronize_rcu() call longer (if another thread manages to wake up
  and claim the rtnl lock before synchronize_rcu())
- we are in shutdown phase, we don't need to minimize lock contention, we
  need to minimize the overall shutdown time

-- 
Alexander Sverdlin
Siemens AG
www.siemens.com

From angelogioacchino.delregno at collabora.com  Tue Sep 17 02:04:33 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Tue, 17 Sep 2024 11:04:33 +0200
Subject: [PATCH v5 3/3] regulator: dt-bindings: mt6397: move examples to
 parent PMIC mt6397
In-Reply-To: <20240916151132.32321-3-macpaul.lin@mediatek.com>
References: <20240916151132.32321-1-macpaul.lin@mediatek.com>
 <20240916151132.32321-3-macpaul.lin@mediatek.com>
Message-ID: <08bdcc19-023b-4c7d-9e01-2b04cac00a08@collabora.com>

Il 16/09/24 17:11, Macpaul Lin ha scritto:
> Since the DT schema of multiple function PMIC mt6397 has been converted,
> move the examples in "mediatek,mt6397-regulator.yaml" to the parent schema
> "mediatek,mt6397.yaml".
> 

You can instead just keep a reference to mediatek,mt6397-regulator.yaml in the
"MFD" (pmic) schema instead.

It's true that for MT6397 you can possibly have only MT6397's regulator and not
others, but still, the logic is to:
  - Say that MT6397 supports regulator subnode(s) in mediatek,mt6397.yaml
    - Refer to the regulator schema (mediatek,mt6397-regulator.yaml)
  - Keep the regulator schema (providing only regulator HW specific info)
    in the regulator folder.

Besides that, this also makes the main mediatek,mt6397.yaml schema a bit more
human readable... :-)

Cheers,
Angelo




From alpernebiyasak at gmail.com  Tue Sep 17 02:05:15 2024
From: alpernebiyasak at gmail.com (Alper Nebi Yasak)
Date: Tue, 17 Sep 2024 12:05:15 +0300
Subject: BUG and WARNINGs from mt7921s on next-20240916
In-Reply-To: <87ldzqdcsv.fsf@kernel.org>
References: <144fbf79-950c-4cd1-bc68-4e00b47b03e9@gmail.com>
 <ZujCwvd4XiwljDyv@lore-desk> <87ldzqdcsv.fsf@kernel.org>
Message-ID: <5a0a8892-c88e-4cac-a53c-a31385217235@gmail.com>

Hi,

On 2024-09-17 09:17 +03:00, Kalle Valo wrote:
> Lorenzo Bianconi <lorenzo at kernel.org> writes:
> 
>>> Hi,
>>>
>>> I ran into some bug messages while testing linux-next on a MT8186
>>> Magneton Chromebook (mt8186-corsola-magneton-sku393218). It boots 
>>> to the OS, but at least Wi-Fi and Bluetooth are unavailable.
>>>
>>> As a start, I tried reverting commit abbd838c579e ("Merge tag 
>>> 'mt76-for-kvalo-2024-09-06' of https://github.com/nbd168/wireless")
>>> and it works fine after that. Didn't have time to do a full bisect, 
>>> but will try if nobody has any immediate opinions.
>>>
>>> There are a few traces, here's some select lines to catch your attention,
>>> not sure how informational they are:
>>>
>>> [   16.040525] kernel BUG at net/core/skbuff.c:2268!
>>> [   16.040531] Internal error: Oops - BUG: 00000000f2000800 [#1] SMP
>>> [ 16.040803] CPU: 3 UID: 0 PID: 526 Comm: mt76-sdio-txrx Not tainted
>>> 6.11.0-next-20240916-deb-00002-g7b544e01c649 #1
>>> [   16.040897] Call trace:
>>> [   16.040899]  pskb_expand_head+0x2b0/0x3c0
>>> [   16.040905]  mt76s_tx_run_queue+0x274/0x410 [mt76_sdio]
>>> [   16.040909]  mt76s_txrx_worker+0xe4/0xac8 [mt76_sdio]
>>> [   16.040914]  mt7921s_txrx_worker+0x98/0x1e0 [mt7921s]
>>> [   16.040924]  __mt76_worker_fn+0x80/0x128 [mt76]
>>> [   16.040934]  kthread+0xe8/0xf8
>>> [   16.040940]  ret_from_fork+0x10/0x20
>>
>> Hi,
>>
>> I guess this issue has been introduced by the following commit:
>>
>> commit 3688c18b65aeb2a1f2fde108400afbab129a8cc1
>> Author: Felix Fietkau <nbd at nbd.name>
>> Date:   Tue Aug 27 11:30:01 2024 +0200                  
>>
>>     wifi: mt76: mt7915: retry mcu messages                                            
>>                         
>>     In some cases MCU messages can get lost. Instead of failing completely,
>>     attempt to recover by re-sending them.
>>      
>>     Link: https://patch.msgid.link/20240827093011.18621-14-nbd at nbd.name
>>     Signed-off-by: Felix Fietkau <nbd at nbd.name>
>>
>>
>> In particular, skb_get() in mt76_mcu_skb_send_and_get_msg() is bumping skb users
>> refcount (making the skb shared) and pskb_expand_head() (run by __skb_grow() in
>> mt76s_tx_run_queue()) does not like shared skbs.
>>
>> @Felix: any input on it?
> 
> Adding regressions list to Cc.

Reverting just that commit fixes my issue. Looks like it's the same
issue recently reported by kernelci as a reply to that patch [1].

[1] https://lore.kernel.org/all/d907b13a-f8be-4cb8-a0bb-560a21278041 at notapiano/

Adding Cc: N?colas F. R. A. Prado <nfraprado at collabora.com> per above.


From angelogioacchino.delregno at collabora.com  Tue Sep 17 02:11:30 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Tue, 17 Sep 2024 11:11:30 +0200
Subject: [PATCH v2 0/2] PCI: mediatek-gen3: Support limiting link speed and width
Message-ID: <20240917091132.286582-1-angelogioacchino.delregno@collabora.com>

Changes in v2:
 - Rebased on next-20240917

This series adds support for limiting the PCI-Express link speed
(or PCIe gen restriction) and link width (number of lanes) in the
pcie-mediatek-gen3 driver.

The maximum supported pcie gen is read from the controller itself,
so defining a max gen through platform data for each SoC is avoided.

Both are done by adding support for the standard devicetree properties
`max-link-speed` and `num-lanes`.

Please note that changing the bindings is not required, as those do
already allow specifying those properties for this controller.



AngeloGioacchino Del Regno (2):
  PCI: mediatek-gen3: Add support for setting max-link-speed limit
  PCI: mediatek-gen3: Add support for restricting link width

 drivers/pci/controller/pcie-mediatek-gen3.c | 75 ++++++++++++++++++++-
 1 file changed, 73 insertions(+), 2 deletions(-)

-- 
2.46.0



From angelogioacchino.delregno at collabora.com  Tue Sep 17 02:11:31 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Tue, 17 Sep 2024 11:11:31 +0200
Subject: [PATCH v2 1/2] PCI: mediatek-gen3: Add support for setting max-link-speed limit
In-Reply-To: <20240917091132.286582-1-angelogioacchino.delregno@collabora.com>
References: <20240917091132.286582-1-angelogioacchino.delregno@collabora.com>
Message-ID: <20240917091132.286582-2-angelogioacchino.delregno@collabora.com>

Add support for respecting the max-link-speed devicetree property,
forcing a maximum speed (Gen) for a PCI-Express port.

Since the MediaTek PCIe Gen3 controllers also expose the maximum
supported link speed in the PCIE_BASE_CFG register, if property
max-link-speed is specified in devicetree, validate it against the
controller capabilities and proceed setting the limitations only
if the wanted Gen is lower than the maximum one that is supported
by the controller itself (otherwise it makes no sense!).

Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
---
 drivers/pci/controller/pcie-mediatek-gen3.c | 55 ++++++++++++++++++++-
 1 file changed, 53 insertions(+), 2 deletions(-)

diff --git a/drivers/pci/controller/pcie-mediatek-gen3.c b/drivers/pci/controller/pcie-mediatek-gen3.c
index 66ce4b5d309b..e1d1fb39d5c6 100644
--- a/drivers/pci/controller/pcie-mediatek-gen3.c
+++ b/drivers/pci/controller/pcie-mediatek-gen3.c
@@ -28,7 +28,11 @@
 
 #include "../pci.h"
 
+#define PCIE_BASE_CFG_REG		0x14
+#define PCIE_BASE_CFG_SPEED_MASK	GENMASK(15, 8)
+
 #define PCIE_SETTING_REG		0x80
+#define PCIE_SETTING_GEN_SUPPORT_MASK	GENMASK(14, 12)
 #define PCIE_PCI_IDS_1			0x9c
 #define PCI_CLASS(class)		(class << 8)
 #define PCIE_RC_MODE			BIT(0)
@@ -125,6 +129,9 @@
 
 struct mtk_gen3_pcie;
 
+#define PCIE_CONF_LINK2_CTL_STS		0x10b0
+#define PCIE_CONF_LINK2_LCR2_LINK_SPEED	GENMASK(3, 0)
+
 /**
  * struct mtk_gen3_pcie_pdata - differentiate between host generations
  * @power_up: pcie power_up callback
@@ -160,6 +167,7 @@ struct mtk_msi_set {
  * @phy: PHY controller block
  * @clks: PCIe clocks
  * @num_clks: PCIe clocks count for this port
+ * @max_link_speed: Maximum link speed (PCIe Gen) for this port
  * @irq: PCIe controller interrupt number
  * @saved_irq_state: IRQ enable state saved at suspend time
  * @irq_lock: lock protecting IRQ register access
@@ -180,6 +188,7 @@ struct mtk_gen3_pcie {
 	struct phy *phy;
 	struct clk_bulk_data *clks;
 	int num_clks;
+	u8 max_link_speed;
 
 	int irq;
 	u32 saved_irq_state;
@@ -381,11 +390,27 @@ static int mtk_pcie_startup_port(struct mtk_gen3_pcie *pcie)
 	int err;
 	u32 val;
 
-	/* Set as RC mode */
+	/* Set as RC mode and set controller PCIe Gen speed restriction, if any*/
 	val = readl_relaxed(pcie->base + PCIE_SETTING_REG);
 	val |= PCIE_RC_MODE;
+	if (pcie->max_link_speed) {
+		val &= ~PCIE_SETTING_GEN_SUPPORT_MASK;
+
+		/* Can enable link speed support only from Gen2 onwards */
+		if (pcie->max_link_speed >= 2)
+			val |= FIELD_PREP(PCIE_SETTING_GEN_SUPPORT_MASK,
+					  GENMASK(pcie->max_link_speed - 2, 0));
+	}
 	writel_relaxed(val, pcie->base + PCIE_SETTING_REG);
 
+	/* Set Link Control 2 (LNKCTL2) speed restriction, if any */
+	if (pcie->max_link_speed) {
+		val = readl_relaxed(pcie->base + PCIE_CONF_LINK2_CTL_STS);
+		val &= PCIE_CONF_LINK2_LCR2_LINK_SPEED;
+		val |= FIELD_PREP(PCIE_CONF_LINK2_LCR2_LINK_SPEED, pcie->max_link_speed);
+		writel_relaxed(val, pcie->base + PCIE_CONF_LINK2_CTL_STS);
+	}
+
 	/* Set class code */
 	val = readl_relaxed(pcie->base + PCIE_PCI_IDS_1);
 	val &= ~GENMASK(31, 8);
@@ -1004,9 +1029,21 @@ static void mtk_pcie_power_down(struct mtk_gen3_pcie *pcie)
 	reset_control_bulk_assert(pcie->soc->phy_resets.num_resets, pcie->phy_resets);
 }
 
+static int mtk_pcie_get_controller_max_link_speed(struct mtk_gen3_pcie *pcie)
+{
+	u32 val;
+	int ret;
+
+	val = readl_relaxed(pcie->base + PCIE_BASE_CFG_REG);
+	val = FIELD_GET(PCIE_BASE_CFG_SPEED_MASK, val);
+	ret = fls(val);
+
+	return ret > 0 ? ret : -EINVAL;
+}
+
 static int mtk_pcie_setup(struct mtk_gen3_pcie *pcie)
 {
-	int err;
+	int max_speed, err;
 
 	err = mtk_pcie_parse_port(pcie);
 	if (err)
@@ -1031,6 +1068,20 @@ static int mtk_pcie_setup(struct mtk_gen3_pcie *pcie)
 	if (err)
 		return err;
 
+	err = of_pci_get_max_link_speed(pcie->dev->of_node);
+	if (err > 0) {
+		/* Get the maximum speed supported by the controller */
+		max_speed = mtk_pcie_get_controller_max_link_speed(pcie);
+
+		/* Set max_link_speed only if the controller supports it */
+		if (max_speed >= 0 && max_speed <= err) {
+			pcie->max_link_speed = err;
+			dev_dbg(pcie->dev,
+				"Max controller link speed Gen%u, override to Gen%u",
+				max_speed, pcie->max_link_speed);
+		}
+	}
+
 	/* Try link up */
 	err = mtk_pcie_startup_port(pcie);
 	if (err)
-- 
2.46.0



From angelogioacchino.delregno at collabora.com  Tue Sep 17 02:11:32 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Tue, 17 Sep 2024 11:11:32 +0200
Subject: [PATCH v2 2/2] PCI: mediatek-gen3: Add support for restricting link width
In-Reply-To: <20240917091132.286582-1-angelogioacchino.delregno@collabora.com>
References: <20240917091132.286582-1-angelogioacchino.delregno@collabora.com>
Message-ID: <20240917091132.286582-3-angelogioacchino.delregno@collabora.com>

Add support for restricting the port's link width by specifying
the num-lanes devicetree property in the PCIe node.

The setting is done in the GEN_SETTINGS register (in the driver
named as PCIE_SETTING_REG), where each set bit in [11:8] activates
a set of lanes (from bits 11 to 8 respectively, x16/x8/x4/x2).

Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
---
 drivers/pci/controller/pcie-mediatek-gen3.c | 22 ++++++++++++++++++++-
 1 file changed, 21 insertions(+), 1 deletion(-)

diff --git a/drivers/pci/controller/pcie-mediatek-gen3.c b/drivers/pci/controller/pcie-mediatek-gen3.c
index e1d1fb39d5c6..e2c9802a230c 100644
--- a/drivers/pci/controller/pcie-mediatek-gen3.c
+++ b/drivers/pci/controller/pcie-mediatek-gen3.c
@@ -32,6 +32,7 @@
 #define PCIE_BASE_CFG_SPEED_MASK	GENMASK(15, 8)
 
 #define PCIE_SETTING_REG		0x80
+#define PCIE_SETTING_LINK_WIDTH		GENMASK(11, 8)
 #define PCIE_SETTING_GEN_SUPPORT_MASK	GENMASK(14, 12)
 #define PCIE_PCI_IDS_1			0x9c
 #define PCI_CLASS(class)		(class << 8)
@@ -168,6 +169,7 @@ struct mtk_msi_set {
  * @clks: PCIe clocks
  * @num_clks: PCIe clocks count for this port
  * @max_link_speed: Maximum link speed (PCIe Gen) for this port
+ * @num_lanes: Number of PCIe lanes for this port
  * @irq: PCIe controller interrupt number
  * @saved_irq_state: IRQ enable state saved at suspend time
  * @irq_lock: lock protecting IRQ register access
@@ -189,6 +191,7 @@ struct mtk_gen3_pcie {
 	struct clk_bulk_data *clks;
 	int num_clks;
 	u8 max_link_speed;
+	u8 num_lanes;
 
 	int irq;
 	u32 saved_irq_state;
@@ -390,7 +393,7 @@ static int mtk_pcie_startup_port(struct mtk_gen3_pcie *pcie)
 	int err;
 	u32 val;
 
-	/* Set as RC mode and set controller PCIe Gen speed restriction, if any*/
+	/* Set as RC mode and set controller PCIe Gen speed/lanes restriction, if any */
 	val = readl_relaxed(pcie->base + PCIE_SETTING_REG);
 	val |= PCIE_RC_MODE;
 	if (pcie->max_link_speed) {
@@ -401,6 +404,14 @@ static int mtk_pcie_startup_port(struct mtk_gen3_pcie *pcie)
 			val |= FIELD_PREP(PCIE_SETTING_GEN_SUPPORT_MASK,
 					  GENMASK(pcie->max_link_speed - 2, 0));
 	}
+	if (pcie->num_lanes) {
+		val &= ~PCIE_SETTING_LINK_WIDTH;
+
+		/* Zero means one lane, each bit activates x2/x4/x8/x16 */
+		if (pcie->num_lanes > 1)
+			val |= FIELD_PREP(PCIE_SETTING_LINK_WIDTH,
+					  GENMASK(pcie->num_lanes >> 1, 0));
+	};
 	writel_relaxed(val, pcie->base + PCIE_SETTING_REG);
 
 	/* Set Link Control 2 (LNKCTL2) speed restriction, if any */
@@ -838,6 +849,7 @@ static int mtk_pcie_parse_port(struct mtk_gen3_pcie *pcie)
 	struct device *dev = pcie->dev;
 	struct platform_device *pdev = to_platform_device(dev);
 	struct resource *regs;
+	u32 num_lanes;
 
 	regs = platform_get_resource_byname(pdev, IORESOURCE_MEM, "pcie-mac");
 	if (!regs)
@@ -883,6 +895,14 @@ static int mtk_pcie_parse_port(struct mtk_gen3_pcie *pcie)
 		return pcie->num_clks;
 	}
 
+	ret = of_property_read_u32(dev->of_node, "num-lanes", &num_lanes);
+	if (ret == 0) {
+		if (num_lanes == 0 || num_lanes > 16 || (num_lanes != 1 && num_lanes % 2))
+			dev_warn(dev, "Invalid num-lanes, using controller defaults\n");
+		else
+			pcie->num_lanes = num_lanes;
+	}
+
 	return 0;
 }
 
-- 
2.46.0



From nbd at nbd.name  Tue Sep 17 02:15:38 2024
From: nbd at nbd.name (Felix Fietkau)
Date: Tue, 17 Sep 2024 11:15:38 +0200
Subject: BUG and WARNINGs from mt7921s on next-20240916
In-Reply-To: <87ldzqdcsv.fsf@kernel.org>
References: <144fbf79-950c-4cd1-bc68-4e00b47b03e9@gmail.com>
 <ZujCwvd4XiwljDyv@lore-desk> <87ldzqdcsv.fsf@kernel.org>
Message-ID: <b8e11bbc-c718-4acf-acc0-6b31f25fae27@nbd.name>

On 17.09.24 08:17, Kalle Valo wrote:
> Lorenzo Bianconi <lorenzo at kernel.org> writes:
> 
>>> Hi,
>>> 
>>> I ran into some bug messages while testing linux-next on a MT8186
>>> Magneton Chromebook (mt8186-corsola-magneton-sku393218). It boots 
>>> to the OS, but at least Wi-Fi and Bluetooth are unavailable.
>>> 
>>> As a start, I tried reverting commit abbd838c579e ("Merge tag 
>>> 'mt76-for-kvalo-2024-09-06' of https://github.com/nbd168/wireless")
>>> and it works fine after that. Didn't have time to do a full bisect, 
>>> but will try if nobody has any immediate opinions.
>>> 
>>> There are a few traces, here's some select lines to catch your attention,
>>> not sure how informational they are:
>>> 
>>> [   16.040525] kernel BUG at net/core/skbuff.c:2268!
>>> [   16.040531] Internal error: Oops - BUG: 00000000f2000800 [#1] SMP
>>> [ 16.040803] CPU: 3 UID: 0 PID: 526 Comm: mt76-sdio-txrx Not tainted
>>> 6.11.0-next-20240916-deb-00002-g7b544e01c649 #1
>>> [   16.040897] Call trace:
>>> [   16.040899]  pskb_expand_head+0x2b0/0x3c0
>>> [   16.040905]  mt76s_tx_run_queue+0x274/0x410 [mt76_sdio]
>>> [   16.040909]  mt76s_txrx_worker+0xe4/0xac8 [mt76_sdio]
>>> [   16.040914]  mt7921s_txrx_worker+0x98/0x1e0 [mt7921s]
>>> [   16.040924]  __mt76_worker_fn+0x80/0x128 [mt76]
>>> [   16.040934]  kthread+0xe8/0xf8
>>> [   16.040940]  ret_from_fork+0x10/0x20
>>
>> Hi,
>>
>> I guess this issue has been introduced by the following commit:
>>
>> commit 3688c18b65aeb2a1f2fde108400afbab129a8cc1
>> Author: Felix Fietkau <nbd at nbd.name>
>> Date:   Tue Aug 27 11:30:01 2024 +0200                  
>>
>>     wifi: mt76: mt7915: retry mcu messages                                            
>>                         
>>     In some cases MCU messages can get lost. Instead of failing completely,
>>     attempt to recover by re-sending them.
>>      
>>     Link: https://patch.msgid.link/20240827093011.18621-14-nbd at nbd.name
>>     Signed-off-by: Felix Fietkau <nbd at nbd.name>
>>
>>
>> In particular, skb_get() in mt76_mcu_skb_send_and_get_msg() is bumping skb users
>> refcount (making the skb shared) and pskb_expand_head() (run by __skb_grow() in
>> mt76s_tx_run_queue()) does not like shared skbs.
>>
>> @Felix: any input on it?

Sorry about that. Please try this patch, it should probably resolve this issue:

---
--- a/drivers/net/wireless/mediatek/mt76/mcu.c
+++ b/drivers/net/wireless/mediatek/mt76/mcu.c
@@ -84,13 +84,15 @@ int mt76_mcu_skb_send_and_get_msg(struct mt76_dev *dev, struct sk_buff *skb,
  	mutex_lock(&dev->mcu.mutex);
  
  	if (dev->mcu_ops->mcu_skb_prepare_msg) {
+		orig_skb = skb;
  		ret = dev->mcu_ops->mcu_skb_prepare_msg(dev, skb, cmd, &seq);
  		if (ret < 0)
  			goto out;
  	}
  
  retry:
-	orig_skb = skb_get(skb);
+	if (orig_skb)
+		skb_get(orig_skb);
  	ret = dev->mcu_ops->mcu_skb_send_msg(dev, skb, cmd, &seq);
  	if (ret < 0)
  		goto out;
@@ -105,7 +107,7 @@ int mt76_mcu_skb_send_and_get_msg(struct mt76_dev *dev, struct sk_buff *skb,
  	do {
  		skb = mt76_mcu_get_response(dev, expires);
  		if (!skb && !test_bit(MT76_MCU_RESET, &dev->phy.state) &&
-		    retry++ < dev->mcu_ops->max_retry) {
+		    orig_skb && retry++ < dev->mcu_ops->max_retry) {
  			dev_err(dev->dev, "Retry message %08x (seq %d)\n",
  				cmd, seq);
  			skb = orig_skb;



From alpernebiyasak at gmail.com  Tue Sep 17 03:08:08 2024
From: alpernebiyasak at gmail.com (Alper Nebi Yasak)
Date: Tue, 17 Sep 2024 13:08:08 +0300
Subject: BUG and WARNINGs from mt7921s on next-20240916
In-Reply-To: <b8e11bbc-c718-4acf-acc0-6b31f25fae27@nbd.name>
References: <144fbf79-950c-4cd1-bc68-4e00b47b03e9@gmail.com>
 <ZujCwvd4XiwljDyv@lore-desk> <87ldzqdcsv.fsf@kernel.org>
 <b8e11bbc-c718-4acf-acc0-6b31f25fae27@nbd.name>
Message-ID: <5823a50e-c607-4e1c-ba4d-d88b38c734cb@gmail.com>

Hi,

On 2024-09-17 12:15 +03:00, Felix Fietkau wrote:
> On 17.09.24 08:17, Kalle Valo wrote:
>> Lorenzo Bianconi <lorenzo at kernel.org> writes:
>>
>>>> Hi,
>>>>
>>>> I ran into some bug messages while testing linux-next on a MT8186
>>>> Magneton Chromebook (mt8186-corsola-magneton-sku393218). It boots 
>>>> to the OS, but at least Wi-Fi and Bluetooth are unavailable.
>>>>
>>>> As a start, I tried reverting commit abbd838c579e ("Merge tag 
>>>> 'mt76-for-kvalo-2024-09-06' of https://github.com/nbd168/wireless")
>>>> and it works fine after that. Didn't have time to do a full bisect, 
>>>> but will try if nobody has any immediate opinions.
>>>>
>>>> There are a few traces, here's some select lines to catch your attention,
>>>> not sure how informational they are:
>>>>
>>>> [   16.040525] kernel BUG at net/core/skbuff.c:2268!
>>>> [   16.040531] Internal error: Oops - BUG: 00000000f2000800 [#1] SMP
>>>> [ 16.040803] CPU: 3 UID: 0 PID: 526 Comm: mt76-sdio-txrx Not tainted
>>>> 6.11.0-next-20240916-deb-00002-g7b544e01c649 #1
>>>> [   16.040897] Call trace:
>>>> [   16.040899]  pskb_expand_head+0x2b0/0x3c0
>>>> [   16.040905]  mt76s_tx_run_queue+0x274/0x410 [mt76_sdio]
>>>> [   16.040909]  mt76s_txrx_worker+0xe4/0xac8 [mt76_sdio]
>>>> [   16.040914]  mt7921s_txrx_worker+0x98/0x1e0 [mt7921s]
>>>> [   16.040924]  __mt76_worker_fn+0x80/0x128 [mt76]
>>>> [   16.040934]  kthread+0xe8/0xf8
>>>> [   16.040940]  ret_from_fork+0x10/0x20
>>>
>>> Hi,
>>>
>>> I guess this issue has been introduced by the following commit:
>>>
>>> commit 3688c18b65aeb2a1f2fde108400afbab129a8cc1
>>> Author: Felix Fietkau <nbd at nbd.name>
>>> Date:   Tue Aug 27 11:30:01 2024 +0200                  
>>>
>>>     wifi: mt76: mt7915: retry mcu messages                                            
>>>                         
>>>     In some cases MCU messages can get lost. Instead of failing completely,
>>>     attempt to recover by re-sending them.
>>>      
>>>     Link: https://patch.msgid.link/20240827093011.18621-14-nbd at nbd.name
>>>     Signed-off-by: Felix Fietkau <nbd at nbd.name>
>>>
>>>
>>> In particular, skb_get() in mt76_mcu_skb_send_and_get_msg() is bumping skb users
>>> refcount (making the skb shared) and pskb_expand_head() (run by __skb_grow() in
>>> mt76s_tx_run_queue()) does not like shared skbs.
>>>
>>> @Felix: any input on it?
> 
> Sorry about that. Please try this patch, it should probably resolve this issue:
> 
> ---
> --- a/drivers/net/wireless/mediatek/mt76/mcu.c
> +++ b/drivers/net/wireless/mediatek/mt76/mcu.c
> @@ -84,13 +84,15 @@ int mt76_mcu_skb_send_and_get_msg(struct mt76_dev *dev, struct sk_buff *skb,
>   	mutex_lock(&dev->mcu.mutex);
>   
>   	if (dev->mcu_ops->mcu_skb_prepare_msg) {
> +		orig_skb = skb;
>   		ret = dev->mcu_ops->mcu_skb_prepare_msg(dev, skb, cmd, &seq);
>   		if (ret < 0)
>   			goto out;
>   	}
>   
>   retry:
> -	orig_skb = skb_get(skb);
> +	if (orig_skb)
> +		skb_get(orig_skb);
>   	ret = dev->mcu_ops->mcu_skb_send_msg(dev, skb, cmd, &seq);
>   	if (ret < 0)
>   		goto out;
> @@ -105,7 +107,7 @@ int mt76_mcu_skb_send_and_get_msg(struct mt76_dev *dev, struct sk_buff *skb,
>   	do {
>   		skb = mt76_mcu_get_response(dev, expires);
>   		if (!skb && !test_bit(MT76_MCU_RESET, &dev->phy.state) &&
> -		    retry++ < dev->mcu_ops->max_retry) {
> +		    orig_skb && retry++ < dev->mcu_ops->max_retry) {
>   			dev_err(dev->dev, "Retry message %08x (seq %d)\n",
>   				cmd, seq);
>   			skb = orig_skb;
> 

Tested-by: Alper Nebi Yasak <alpernebiyasak at gmail.com>

Thanks!


From gur.stavi at huawei.com  Tue Sep 17 03:30:41 2024
From: gur.stavi at huawei.com (Gur Stavi)
Date: Tue, 17 Sep 2024 13:30:41 +0300
Subject: [PATCH 1/2] net: dsa: RCU-protect dsa_ptr in struct net_device
In-Reply-To: <c7a52a818c1ae49ad7e44bb82fcea53d7f53d6e0.camel@siemens.com>
References: <c7a52a818c1ae49ad7e44bb82fcea53d7f53d6e0.camel@siemens.com>
Message-ID: <20240917103041.1645536-1-gur.stavi@huawei.com>

> Hello Gur!
>
> On Tue, 2024-09-17 at 11:10 +0300, Gur Stavi wrote:
> > > @@ -1594,10 +1592,11 @@ void dsa_switch_shutdown(struct dsa_switch *ds)
> > >   	}
> > >
> > >   	/* Disconnect from further netdevice notifiers on the conduit,
> > > -	 * since netdev_uses_dsa() will now return false.
> > > +	 * from now on, netdev_uses_dsa_currently() will return false.
> > >   	 */
> > >   	dsa_switch_for_each_cpu_port(dp, ds)
> > > -		dp->conduit->dsa_ptr = NULL;
> > > +		rcu_assign_pointer(dp->conduit->dsa_ptr, NULL);
> > > +	synchronize_rcu();
> > >
> > >   	rtnl_unlock();
> > >   out:
> >
> > Hi, I am a newbie here. Thanks for the opportunity for learning more
> > about rcu.
> > Wouldn't it make more sense to call synchronize_rcu after rtnl_unlock?
>
> This is indeed a question which is usually resolved other way around
> (making locked section shorter), but in this particular case I thought that:
> - we actually don't need giving rtnl lock sooner, which would potentially
>   make synchronize_rcu() call longer (if another thread manages to wake up
>   and claim the rtnl lock before synchronize_rcu())
> - we are in shutdown phase, we don't need to minimize lock contention, we
>   need to minimize the overall shutdown time

But isn't shutdown still multithreaded?
10 threads may have similar shutdown task: remove objects from different
rcu protected data structures while holding rtnl. Then synchronize RCU
and release the objects.
Synchronizing RCU from within the lock will completely serialize all
threads and postpone shutdown whereas outside the lock multiple
synchronize_rcu could run in parallel.


From alexander.sverdlin at siemens.com  Tue Sep 17 04:08:09 2024
From: alexander.sverdlin at siemens.com (Sverdlin, Alexander)
Date: Tue, 17 Sep 2024 11:08:09 +0000
Subject: [PATCH 1/2] net: dsa: RCU-protect dsa_ptr in struct net_device
In-Reply-To: <20240917103041.1645536-1-gur.stavi@huawei.com>
References: <c7a52a818c1ae49ad7e44bb82fcea53d7f53d6e0.camel@siemens.com>
	 <20240917103041.1645536-1-gur.stavi@huawei.com>
Message-ID: <36b492b1d880e8956f9ff63431e713f290e5526d.camel@siemens.com>

Hi Gur,

On Tue, 2024-09-17 at 13:30 +0300, Gur Stavi wrote:
> > > > @@ -1594,10 +1592,11 @@ void dsa_switch_shutdown(struct dsa_switch *ds)
> > > > ???	}
> > > > 
> > > > ???	/* Disconnect from further netdevice notifiers on the conduit,
> > > > -	 * since netdev_uses_dsa() will now return false.
> > > > +	 * from now on, netdev_uses_dsa_currently() will return false.
> > > > ???	 */
> > > > ???	dsa_switch_for_each_cpu_port(dp, ds)
> > > > -		dp->conduit->dsa_ptr = NULL;
> > > > +		rcu_assign_pointer(dp->conduit->dsa_ptr, NULL);
> > > > +	synchronize_rcu();
> > > > 
> > > > ???	rtnl_unlock();
> > > > ?? out:
> > > 
> > > Hi, I am a newbie here. Thanks for the opportunity for learning more
> > > about rcu.
> > > Wouldn't it make more sense to call synchronize_rcu after rtnl_unlock?
> > 
> > This is indeed a question which is usually resolved other way around
> > (making locked section shorter), but in this particular case I thought that:
> > - we actually don't need giving rtnl lock sooner, which would potentially
> > ?? make synchronize_rcu() call longer (if another thread manages to wake up
> > ?? and claim the rtnl lock before synchronize_rcu())
> > - we are in shutdown phase, we don't need to minimize lock contention, we
> > ?? need to minimize the overall shutdown time
> 
> But isn't shutdown still multithreaded?
> 10 threads may have similar shutdown task: remove objects from different
> rcu protected data structures while holding rtnl. Then synchronize RCU
> and release the objects.
> Synchronizing RCU from within the lock will completely serialize all
> threads and postpone shutdown whereas outside the lock multiple
> synchronize_rcu could run in parallel.

my understanding is that all other RTNL-protected readers of dsa_ptr are
actually only unnecessary overhead after shutdown callback has been called
once (eventual network configuration running in parallel at the time of
shutdown).

All of them can be ignored (or lower-prioritized) after shutdown, we
need to synchronize_rcu() and free/close what we have to do afterwards
and just poweroff/reboot.

So the only effect switching synchronize_rcu() and rtnl_unlock() around
would be that
- it looks more logical
- it requires longer to reboot/shutdown

-- 
Alexander Sverdlin
Siemens AG
www.siemens.com

From wenst at chromium.org  Tue Sep 17 05:41:26 2024
From: wenst at chromium.org (Chen-Yu Tsai)
Date: Tue, 17 Sep 2024 14:41:26 +0200
Subject: [PATCH v7 08/10] i2c: of-prober: Add GPIO support to simple helpers
In-Reply-To: <CAD=FV=XvPA0UC87fQ+RvFzPv9qRSEP6eQhT79JOx9Arj87i9Mg@mail.gmail.com>
References: <20240911072751.365361-1-wenst@chromium.org> <20240911072751.365361-9-wenst@chromium.org>
 <CAD=FV=XvPA0UC87fQ+RvFzPv9qRSEP6eQhT79JOx9Arj87i9Mg@mail.gmail.com>
Message-ID: <CAGXv+5EcxGfdzvarg8hmk1zR9X0s8KUzayQdxfWTrasEGpj=1g@mail.gmail.com>

On Sat, Sep 14, 2024 at 1:49?AM Doug Anderson <dianders at chromium.org> wrote:
>
> Hi,
>
> On Wed, Sep 11, 2024 at 12:29?AM Chen-Yu Tsai <wenst at chromium.org> wrote:
> >
> > +static int i2c_of_probe_simple_set_gpio(struct device *dev, struct i2c_of_probe_simple_ctx *ctx)
> > +{
> > +       int ret;
> > +
> > +       if (!ctx->gpiod)
> > +               return 0;
> > +
> > +       dev_dbg(dev, "Setting GPIO\n");
> > +
> > +       ret = gpiod_direction_output_raw(ctx->gpiod, ctx->opts->gpio_high_to_enable ? 1 : 0);
> > +       if (ret)
> > +               return ret;
> > +
> > +       msleep(ctx->opts->post_reset_deassert_delay_ms);
>
> Like in the previous patch, you need an "if
> (ctx->opts->post_reset_deassert_delay_ms)" before the msleep().

Ack.

> > +static void i2c_of_probe_simple_disable_gpio(struct device *dev, struct i2c_of_probe_simple_ctx *ctx)
> > +{
> > +       if (!ctx->gpiod)
> > +               return;
> > +
> > +       dev_dbg(dev, "Setting GPIO to input\n");
> > +
> > +       gpiod_direction_input(ctx->gpiod);
>
> This is weird. Why set it to input?

It seemed to me this would be more like the initial state, without knowing
the actual initial state.

> > @@ -347,6 +438,7 @@ int i2c_of_probe_simple_cleanup(struct device *dev, void *data)
> >  {
> >         struct i2c_of_probe_simple_ctx *ctx = data;
> >
> > +       i2c_of_probe_simple_disable_gpio(dev, ctx);
>
> Maybe add a comment before the GPIO call that it's a noop if we found
> something and i2c_of_probe_simple_free_res_early() was already called?
> Otherwise you need to read into the function to understand why this
> doesn't crash if the early call was made. To me, that makes the
> abstraction add confusion instead of simplifying things.

Ack.

> > @@ -92,24 +93,33 @@ int i2c_of_probe_component(struct device *dev, const struct i2c_of_probe_cfg *cf
> >   * struct i2c_of_probe_simple_opts - Options for simple I2C component prober callbacks
> >   * @res_node_compatible: Compatible string of device node to retrieve resources from.
> >   * @supply_name: Name of regulator supply.
> > + * @gpio_name: Name of GPIO.
>
> Talk about the fact that gpio_name can be NULL or an empty string and
> that they mean different things.

Ack.

> >   * @post_power_on_delay_ms: Delay in ms after regulators are powered on. Passed to msleep().
> > + * @post_reset_deassert_delay_ms: Delay in ms after GPIOs are set. Passed to msleep().
> > + * @gpio_high_to_enable: %true if GPIO should be set to electrical high to enable component.
>
> Now that you've added the GPIOs and more delays, the description of
> this structure needs to list exactly what the power sequence your
> simple functions assume.

Ack.

> I would also say: given that you're providing a parameter anyway and
> you're giving the GPIO name, can you please move away from the "raw"
> values and move to "logical" values?

I disagree. When hardware engineers design for swappable components, they
likely look at the electrical compatibility of them. In this case, an
active-high "enable" pin is electrically compatible with an active-low
"reset" pin. If we use the logical value here, then we would need more
logic to know when the logical polarity has to be reversed.

Note that this doesn't work for components that are electrically
incompatible. But in that case a lot more board dependent code would be
needed anyway.


ChenYu


From fshao at chromium.org  Tue Sep 17 09:15:26 2024
From: fshao at chromium.org (Fei Shao)
Date: Wed, 18 Sep 2024 00:15:26 +0800
Subject: [PATCH v2 1/2] PCI: mediatek-gen3: Add support for setting
 max-link-speed limit
In-Reply-To: <20240917091132.286582-2-angelogioacchino.delregno@collabora.com>
References: <20240917091132.286582-1-angelogioacchino.delregno@collabora.com> <20240917091132.286582-2-angelogioacchino.delregno@collabora.com>
Message-ID: <CAC=S1nhp_3EfG7g7GyLHQGPk_2mrfzj3Kqgi4u_gsA7-Wq8Zgg@mail.gmail.com>

On Tue, Sep 17, 2024 at 5:13?PM AngeloGioacchino Del Regno
<angelogioacchino.delregno at collabora.com> wrote:
>
> Add support for respecting the max-link-speed devicetree property,
> forcing a maximum speed (Gen) for a PCI-Express port.
>
> Since the MediaTek PCIe Gen3 controllers also expose the maximum
> supported link speed in the PCIE_BASE_CFG register, if property
> max-link-speed is specified in devicetree, validate it against the
> controller capabilities and proceed setting the limitations only
> if the wanted Gen is lower than the maximum one that is supported
> by the controller itself (otherwise it makes no sense!).
>
> Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
> ---
>  drivers/pci/controller/pcie-mediatek-gen3.c | 55 ++++++++++++++++++++-
>  1 file changed, 53 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/pci/controller/pcie-mediatek-gen3.c b/drivers/pci/controller/pcie-mediatek-gen3.c
> index 66ce4b5d309b..e1d1fb39d5c6 100644
> --- a/drivers/pci/controller/pcie-mediatek-gen3.c
> +++ b/drivers/pci/controller/pcie-mediatek-gen3.c
> @@ -28,7 +28,11 @@
>
>  #include "../pci.h"
>
> +#define PCIE_BASE_CFG_REG              0x14
> +#define PCIE_BASE_CFG_SPEED_MASK       GENMASK(15, 8)
> +
>  #define PCIE_SETTING_REG               0x80
> +#define PCIE_SETTING_GEN_SUPPORT_MASK  GENMASK(14, 12)
>  #define PCIE_PCI_IDS_1                 0x9c
>  #define PCI_CLASS(class)               (class << 8)
>  #define PCIE_RC_MODE                   BIT(0)
> @@ -125,6 +129,9 @@
>
>  struct mtk_gen3_pcie;
>
> +#define PCIE_CONF_LINK2_CTL_STS                0x10b0
> +#define PCIE_CONF_LINK2_LCR2_LINK_SPEED        GENMASK(3, 0)
> +
>  /**
>   * struct mtk_gen3_pcie_pdata - differentiate between host generations
>   * @power_up: pcie power_up callback
> @@ -160,6 +167,7 @@ struct mtk_msi_set {
>   * @phy: PHY controller block
>   * @clks: PCIe clocks
>   * @num_clks: PCIe clocks count for this port
> + * @max_link_speed: Maximum link speed (PCIe Gen) for this port
>   * @irq: PCIe controller interrupt number
>   * @saved_irq_state: IRQ enable state saved at suspend time
>   * @irq_lock: lock protecting IRQ register access
> @@ -180,6 +188,7 @@ struct mtk_gen3_pcie {
>         struct phy *phy;
>         struct clk_bulk_data *clks;
>         int num_clks;
> +       u8 max_link_speed;
>
>         int irq;
>         u32 saved_irq_state;
> @@ -381,11 +390,27 @@ static int mtk_pcie_startup_port(struct mtk_gen3_pcie *pcie)
>         int err;
>         u32 val;
>
> -       /* Set as RC mode */
> +       /* Set as RC mode and set controller PCIe Gen speed restriction, if any*/

NIt: one space before ending the comment.

>         val = readl_relaxed(pcie->base + PCIE_SETTING_REG);
>         val |= PCIE_RC_MODE;
> +       if (pcie->max_link_speed) {
> +               val &= ~PCIE_SETTING_GEN_SUPPORT_MASK;
> +
> +               /* Can enable link speed support only from Gen2 onwards */
> +               if (pcie->max_link_speed >= 2)
> +                       val |= FIELD_PREP(PCIE_SETTING_GEN_SUPPORT_MASK,
> +                                         GENMASK(pcie->max_link_speed - 2, 0));
> +       }
>         writel_relaxed(val, pcie->base + PCIE_SETTING_REG);
>
> +       /* Set Link Control 2 (LNKCTL2) speed restriction, if any */
> +       if (pcie->max_link_speed) {
> +               val = readl_relaxed(pcie->base + PCIE_CONF_LINK2_CTL_STS);
> +               val &= PCIE_CONF_LINK2_LCR2_LINK_SPEED;

I guess it needs a bitwise NOT operator over the mask.
    val &= ~PCIE_CONF_LINK2_LCR2_LINK_SPEED;

Apart from that, I think appending _MASK to the name makes its usage
clearer and consistent with other masks.
(although the name gets even more lengthy...)

> +               val |= FIELD_PREP(PCIE_CONF_LINK2_LCR2_LINK_SPEED, pcie->max_link_speed);
> +               writel_relaxed(val, pcie->base + PCIE_CONF_LINK2_CTL_STS);
> +       }
> +
>         /* Set class code */
>         val = readl_relaxed(pcie->base + PCIE_PCI_IDS_1);
>         val &= ~GENMASK(31, 8);
> @@ -1004,9 +1029,21 @@ static void mtk_pcie_power_down(struct mtk_gen3_pcie *pcie)
>         reset_control_bulk_assert(pcie->soc->phy_resets.num_resets, pcie->phy_resets);
>  }
>
> +static int mtk_pcie_get_controller_max_link_speed(struct mtk_gen3_pcie *pcie)
> +{
> +       u32 val;
> +       int ret;
> +
> +       val = readl_relaxed(pcie->base + PCIE_BASE_CFG_REG);
> +       val = FIELD_GET(PCIE_BASE_CFG_SPEED_MASK, val);
> +       ret = fls(val);
> +
> +       return ret > 0 ? ret : -EINVAL;
> +}
> +
>  static int mtk_pcie_setup(struct mtk_gen3_pcie *pcie)
>  {
> -       int err;
> +       int max_speed, err;
>
>         err = mtk_pcie_parse_port(pcie);
>         if (err)
> @@ -1031,6 +1068,20 @@ static int mtk_pcie_setup(struct mtk_gen3_pcie *pcie)
>         if (err)
>                 return err;
>
> +       err = of_pci_get_max_link_speed(pcie->dev->of_node);
> +       if (err > 0) {
> +               /* Get the maximum speed supported by the controller */
> +               max_speed = mtk_pcie_get_controller_max_link_speed(pcie);
> +
> +               /* Set max_link_speed only if the controller supports it */
> +               if (max_speed >= 0 && max_speed <= err) {
> +                       pcie->max_link_speed = err;
> +                       dev_dbg(pcie->dev,
> +                               "Max controller link speed Gen%u, override to Gen%u",
> +                               max_speed, pcie->max_link_speed);

Convert max_speed to an unsigned type to avoid potential typecheck warnings?

Regards,
Fei


> +               }
> +       }
> +
>         /* Try link up */
>         err = mtk_pcie_startup_port(pcie);
>         if (err)
> --
> 2.46.0
>
>


From Jason-JH.Lin at mediatek.com  Tue Sep 17 09:44:14 2024
From: Jason-JH.Lin at mediatek.com (=?utf-8?B?SmFzb24tSkggTGluICjmnpfnnb/npaUp?=)
Date: Tue, 17 Sep 2024 16:44:14 +0000
Subject: [PATCH v2] drm/mediatek: ovl: Add fmt_support_man for MT8192 and
 MT8195
In-Reply-To: <01020191fa9480c6-b4e6cdff-4134-4713-b255-1c65e0a97f87-000000@eu-west-1.amazonses.com>
References: <20240915161245.30296-1-jason-jh.lin@mediatek.com>
	 <01020191fa9480c6-b4e6cdff-4134-4713-b255-1c65e0a97f87-000000@eu-west-1.amazonses.com>
Message-ID: <8b5ca1f048565e8826c826716c4e8c515ca0de81.camel@mediatek.com>

> > +
> > +#define OVL_CON_CLRFMT_PARGB8888(ovl)  ({ \
> > +	struct mtk_disp_ovl *_ovl = (ovl); \
> > +	(_ovl->data->fmt_support_man ? \
> > +	((3 << 12) | OVL_CON_CLRFMT_MAN) : OVL_CON_CLRFMT_ARGB8888); \
> > +})
> 
> Isn't it just simpler to pass an "extended input format selection"
> flag to
> these macros, instead of the entire mtk_disp_ovl structure?
> 
> Something like...
> 
> #define OVL_CON_CLRFMT_PARGB8888(fmt_support_man)
> 
> ...or alternatively, it's probably simply more straightforward to
> assign
> function pointers to struct mtk_disp_ovl_data:
> 
> `.fmt_convert = ovl_fmt_convert_mt8173` for MT8173-style controllers
> and
> `.fmt_convert = ovl_fmt_convert_mt8195` for MT8195-style controllers,
> 
> so that you can simply call `con = ovl->data->fmt_convert(ovl, fmt,
> blend_mode)`
> in mtk_ovl_layer_config().
> 
> The thing is - those macros seem to be unnecessarily complicated, and
> it's at
> least impacting on readability... :-)

OK, I'll add
`.fmt_convert = mtk_ovl_fmt_convert_with_blend` to the driver data for
MT8192 and MT8195
and add
`.fmt_convert = mtk_ovl_fmt_convert` to the driver data for other SoCs.

Regards,
Jason-JH.Lin

> 
> Cheers,
> Angelo
> 
> > 

From jason-jh.lin at mediatek.com  Tue Sep 17 09:44:34 2024
From: jason-jh.lin at mediatek.com (Jason-JH.Lin)
Date: Wed, 18 Sep 2024 00:44:34 +0800
Subject: [PATCH v3] drm/mediatek: ovl: Add fmt_convert function pointer to driver data
Message-ID: <20240917164434.17794-1-jason-jh.lin@mediatek.com>

OVL_CON_CLRFMT_MAN is a configuration for extending color format
settings of DISP_REG_OVL_CON(n).
It will change some of the original color format settings.

Take the settings of (3 << 12) for example.
- If OVL_CON_CLRFMT_MAN = 0 means OVL_CON_CLRFMT_RGBA8888.
- If OVL_CON_CLRFMT_MAN = 1 means OVL_CON_CLRFMT_PARGB8888.

Since OVL_CON_CLRFMT_MAN is not supported on previous SoCs,
It breaks the OVL color format setting of MT8173.

Therefore, the fmt_convert function pointer is added to the driver data
and mtk_ovl_fmt_convert_with_blend is implemented for MT8192 and MT8195
that support OVL_CON_CLRFMT_MAN, and mtk_ovl_fmt_convert is implemented
for other SoCs that do not support it to solve the degradation problem.

Fixes: a3f7f7ef4bfe ("drm/mediatek: Support "Pre-multiplied" blending in OVL")
Signed-off-by: Jason-JH.Lin <jason-jh.lin at mediatek.com>
Tested-by: Alper Nebi Yasak <alpernebiyasak at gmail.com>
---
 drivers/gpu/drm/mediatek/mtk_disp_ovl.c | 63 ++++++++++++++++++++++---
 1 file changed, 56 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
index 89b439dcf3a6..4948f269fb81 100644
--- a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
+++ b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
@@ -143,6 +143,7 @@ struct mtk_disp_ovl_data {
 	unsigned int addr;
 	unsigned int gmc_bits;
 	unsigned int layer_nr;
+	unsigned int (*fmt_convert)(struct device *dev, struct mtk_plane_state *state);
 	bool fmt_rgb565_is_0;
 	bool smi_id_en;
 	bool supports_afbc;
@@ -386,13 +387,54 @@ void mtk_ovl_layer_off(struct device *dev, unsigned int idx,
 		      DISP_REG_OVL_RDMA_CTRL(idx));
 }
 
-static unsigned int ovl_fmt_convert(struct mtk_disp_ovl *ovl, unsigned int fmt,
-				    unsigned int blend_mode)
+static unsigned int mtk_ovl_fmt_convert(struct device *dev, struct mtk_plane_state *state)
 {
-	/* The return value in switch "MEM_MODE_INPUT_FORMAT_XXX"
-	 * is defined in mediatek HW data sheet.
-	 * The alphabet order in XXX is no relation to data
-	 * arrangement in memory.
+	struct mtk_disp_ovl *ovl = dev_get_drvdata(dev);
+	unsigned int fmt = state->pending.format;
+
+	switch (fmt) {
+	default:
+	case DRM_FORMAT_RGB565:
+		return OVL_CON_CLRFMT_RGB565(ovl);
+	case DRM_FORMAT_BGR565:
+		return OVL_CON_CLRFMT_RGB565(ovl) | OVL_CON_BYTE_SWAP;
+	case DRM_FORMAT_RGB888:
+		return OVL_CON_CLRFMT_RGB888(ovl);
+	case DRM_FORMAT_BGR888:
+		return OVL_CON_CLRFMT_RGB888(ovl) | OVL_CON_BYTE_SWAP;
+	case DRM_FORMAT_RGBX8888:
+	case DRM_FORMAT_RGBA8888:
+	case DRM_FORMAT_RGBX1010102:
+	case DRM_FORMAT_RGBA1010102:
+		return OVL_CON_CLRFMT_RGBA8888;
+	case DRM_FORMAT_XRGB8888:
+	case DRM_FORMAT_ARGB8888:
+	case DRM_FORMAT_XRGB2101010:
+	case DRM_FORMAT_ARGB2101010:
+		return OVL_CON_CLRFMT_ARGB8888;
+	case DRM_FORMAT_XBGR8888:
+	case DRM_FORMAT_ABGR8888:
+	case DRM_FORMAT_XBGR2101010:
+	case DRM_FORMAT_ABGR2101010:
+		return OVL_CON_CLRFMT_ABGR8888;
+	case DRM_FORMAT_UYVY:
+		return OVL_CON_CLRFMT_UYVY | OVL_CON_MTX_YUV_TO_RGB;
+	case DRM_FORMAT_YUYV:
+		return OVL_CON_CLRFMT_YUYV | OVL_CON_MTX_YUV_TO_RGB;
+	}
+}
+
+static unsigned int mtk_ovl_fmt_convert_with_blend(struct device *dev,
+						   struct mtk_plane_state *state)
+{
+	struct mtk_disp_ovl *ovl = dev_get_drvdata(dev);
+	unsigned int fmt = state->pending.format;
+	unsigned int blend_mode = state->base.pixel_blend_mode;
+
+	/*
+	 * For the platforms where OVL_CON_CLRFMT_MAN is defined in the
+	 * hardware data sheet and supports premultiplied color formats
+	 * such as OVL_CON_CLRFMT_PRGB8888.
 	 */
 	switch (fmt) {
 	default:
@@ -471,7 +513,7 @@ void mtk_ovl_layer_config(struct device *dev, unsigned int idx,
 		return;
 	}
 
-	con = ovl_fmt_convert(ovl, fmt, blend_mode);
+	con = ovl->data->fmt_convert(dev, state);
 	if (state->base.fb) {
 		con |= OVL_CON_AEN;
 		con |= state->base.alpha & OVL_CON_ALPHA;
@@ -625,6 +667,7 @@ static const struct mtk_disp_ovl_data mt2701_ovl_driver_data = {
 	.addr = DISP_REG_OVL_ADDR_MT2701,
 	.gmc_bits = 8,
 	.layer_nr = 4,
+	.fmt_convert = mtk_ovl_fmt_convert,
 	.fmt_rgb565_is_0 = false,
 	.formats = mt8173_formats,
 	.num_formats = ARRAY_SIZE(mt8173_formats),
@@ -634,6 +677,7 @@ static const struct mtk_disp_ovl_data mt8173_ovl_driver_data = {
 	.addr = DISP_REG_OVL_ADDR_MT8173,
 	.gmc_bits = 8,
 	.layer_nr = 4,
+	.fmt_convert = mtk_ovl_fmt_convert,
 	.fmt_rgb565_is_0 = true,
 	.formats = mt8173_formats,
 	.num_formats = ARRAY_SIZE(mt8173_formats),
@@ -643,6 +687,7 @@ static const struct mtk_disp_ovl_data mt8183_ovl_driver_data = {
 	.addr = DISP_REG_OVL_ADDR_MT8173,
 	.gmc_bits = 10,
 	.layer_nr = 4,
+	.fmt_convert = mtk_ovl_fmt_convert,
 	.fmt_rgb565_is_0 = true,
 	.formats = mt8173_formats,
 	.num_formats = ARRAY_SIZE(mt8173_formats),
@@ -652,6 +697,7 @@ static const struct mtk_disp_ovl_data mt8183_ovl_2l_driver_data = {
 	.addr = DISP_REG_OVL_ADDR_MT8173,
 	.gmc_bits = 10,
 	.layer_nr = 2,
+	.fmt_convert = mtk_ovl_fmt_convert,
 	.fmt_rgb565_is_0 = true,
 	.formats = mt8173_formats,
 	.num_formats = ARRAY_SIZE(mt8173_formats),
@@ -661,6 +707,7 @@ static const struct mtk_disp_ovl_data mt8192_ovl_driver_data = {
 	.addr = DISP_REG_OVL_ADDR_MT8173,
 	.gmc_bits = 10,
 	.layer_nr = 4,
+	.fmt_convert = mtk_ovl_fmt_convert_with_blend,
 	.fmt_rgb565_is_0 = true,
 	.smi_id_en = true,
 	.formats = mt8173_formats,
@@ -671,6 +718,7 @@ static const struct mtk_disp_ovl_data mt8192_ovl_2l_driver_data = {
 	.addr = DISP_REG_OVL_ADDR_MT8173,
 	.gmc_bits = 10,
 	.layer_nr = 2,
+	.fmt_convert = mtk_ovl_fmt_convert_with_blend,
 	.fmt_rgb565_is_0 = true,
 	.smi_id_en = true,
 	.formats = mt8173_formats,
@@ -681,6 +729,7 @@ static const struct mtk_disp_ovl_data mt8195_ovl_driver_data = {
 	.addr = DISP_REG_OVL_ADDR_MT8173,
 	.gmc_bits = 10,
 	.layer_nr = 4,
+	.fmt_convert = mtk_ovl_fmt_convert_with_blend,
 	.fmt_rgb565_is_0 = true,
 	.smi_id_en = true,
 	.supports_afbc = true,
-- 
2.43.0



From Markus.Elfring at web.de  Tue Sep 17 10:34:03 2024
From: Markus.Elfring at web.de (Markus Elfring)
Date: Tue, 17 Sep 2024 19:34:03 +0200
Subject: [PATCH 0/2] drm/mediatek: Adjustments for mtk_gem_prime_vmap()
Message-ID: <254d16d9-d56a-4f26-9914-db75e7aa4287@web.de>

From: Markus Elfring <elfring at users.sourceforge.net>
Date: Tue, 17 Sep 2024 19:16:45 +0200

A few update suggestions were taken into account
from static source code analysis.

Markus Elfring (2):
  Avoid duplicate sg_free_table(sgt) call
  Use common error handling code

 drivers/gpu/drm/mediatek/mtk_gem.c | 14 ++++++++------
 1 file changed, 8 insertions(+), 6 deletions(-)

--
2.46.0



From Markus.Elfring at web.de  Tue Sep 17 10:36:43 2024
From: Markus.Elfring at web.de (Markus Elfring)
Date: Tue, 17 Sep 2024 19:36:43 +0200
Subject: [PATCH 1/2] drm/mediatek: Avoid duplicate sg_free_table(sgt) call in
 mtk_gem_prime_vmap()
In-Reply-To: <254d16d9-d56a-4f26-9914-db75e7aa4287@web.de>
References: <254d16d9-d56a-4f26-9914-db75e7aa4287@web.de>
Message-ID: <02507a9b-87e2-45a6-9410-d4dfb0e4b1a2@web.de>

From: Markus Elfring <elfring at users.sourceforge.net>
Date: Tue, 17 Sep 2024 18:50:37 +0200

A sg_free_table(sgt) call was immediately used after a null pointer check
for the data structure member ?kvaddr? in this function implementation.
Thus use such a function call only once instead directly before the check.

This issue was transformed by using the Coccinelle software.

Signed-off-by: Markus Elfring <elfring at users.sourceforge.net>
---
 drivers/gpu/drm/mediatek/mtk_gem.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/mediatek/mtk_gem.c b/drivers/gpu/drm/mediatek/mtk_gem.c
index a172456d1d7b..9c7b7d0a3ffc 100644
--- a/drivers/gpu/drm/mediatek/mtk_gem.c
+++ b/drivers/gpu/drm/mediatek/mtk_gem.c
@@ -259,13 +259,13 @@ int mtk_gem_prime_vmap(struct drm_gem_object *obj, struct iosys_map *map)

 	mtk_gem->kvaddr = vmap(mtk_gem->pages, npages, VM_MAP,
 			       pgprot_writecombine(PAGE_KERNEL));
+	sg_free_table(sgt);
 	if (!mtk_gem->kvaddr) {
-		sg_free_table(sgt);
 		kfree(sgt);
 		kfree(mtk_gem->pages);
 		return -ENOMEM;
 	}
-	sg_free_table(sgt);
+
 	kfree(sgt);

 out:
--
2.46.0



From Markus.Elfring at web.de  Tue Sep 17 10:42:30 2024
From: Markus.Elfring at web.de (Markus Elfring)
Date: Tue, 17 Sep 2024 19:42:30 +0200
Subject: [PATCH 2/2] drm/mediatek: Use common error handling code in
 mtk_gem_prime_vmap()
In-Reply-To: <254d16d9-d56a-4f26-9914-db75e7aa4287@web.de>
References: <254d16d9-d56a-4f26-9914-db75e7aa4287@web.de>
Message-ID: <aa103a36-8cb3-4232-b4b7-3ffd117e303b@web.de>

From: Markus Elfring <elfring at users.sourceforge.net>
Date: Tue, 17 Sep 2024 19:06:23 +0200

Add a jump target so that a bit of exception handling can be better reused
at the end of this function implementation.

Signed-off-by: Markus Elfring <elfring at users.sourceforge.net>
---
 drivers/gpu/drm/mediatek/mtk_gem.c | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/mediatek/mtk_gem.c b/drivers/gpu/drm/mediatek/mtk_gem.c
index 9c7b7d0a3ffc..5713156efb4e 100644
--- a/drivers/gpu/drm/mediatek/mtk_gem.c
+++ b/drivers/gpu/drm/mediatek/mtk_gem.c
@@ -251,8 +251,7 @@ int mtk_gem_prime_vmap(struct drm_gem_object *obj, struct iosys_map *map)
 	mtk_gem->pages = kcalloc(npages, sizeof(*mtk_gem->pages), GFP_KERNEL);
 	if (!mtk_gem->pages) {
 		sg_free_table(sgt);
-		kfree(sgt);
-		return -ENOMEM;
+		goto free_sgt;
 	}

 	drm_prime_sg_to_page_array(sgt, mtk_gem->pages, npages);
@@ -261,9 +260,8 @@ int mtk_gem_prime_vmap(struct drm_gem_object *obj, struct iosys_map *map)
 			       pgprot_writecombine(PAGE_KERNEL));
 	sg_free_table(sgt);
 	if (!mtk_gem->kvaddr) {
-		kfree(sgt);
 		kfree(mtk_gem->pages);
-		return -ENOMEM;
+		goto free_sgt;
 	}

 	kfree(sgt);
@@ -272,6 +270,10 @@ int mtk_gem_prime_vmap(struct drm_gem_object *obj, struct iosys_map *map)
 	iosys_map_set_vaddr(map, mtk_gem->kvaddr);

 	return 0;
+
+free_sgt:
+	kfree(sgt);
+	return -ENOMEM;
 }

 void mtk_gem_prime_vunmap(struct drm_gem_object *obj, struct iosys_map *map)
--
2.46.0



From marc.payne at mdpsys.co.uk  Tue Sep 17 12:53:44 2024
From: marc.payne at mdpsys.co.uk (marc.payne at mdpsys.co.uk)
Date: Tue, 17 Sep 2024 20:53:44 +0100
Subject: [PATCH] Bluetooth: btmtk: Remove resetting mt7921 before
 downloading the fw
In-Reply-To: <790e542aa9d08c7efeee6ef298fce2a87d8035e4.camel@mediatek.com>
References: <20240822052310.25220-1-hao.qin@mediatek.com>
 <ZuB3omUkdUHLggYu@mdpsys.co.uk>
 <790e542aa9d08c7efeee6ef298fce2a87d8035e4.camel@mediatek.com>
Message-ID: <ZuneSM4SvyUFX86j@mdpsys.co.uk>

The 12/09/2024 07:09, Chris Lu (???) wrote:
> On Tue, 2024-09-10 at 18:09 +0100, Marc Payne wrote:
> 
> Hi Marc,

Hi,

> 
> Is it possible to provide entire kernel log for further debugging?
> (From boot up to issue heppen)
> 
> We suspect that the issue occurred event earilier and our controller is
> not able to recover itself. Therfore, we need to check if Bluetooth
> works as expected in the booting stage.

Happy to help. Below is the log for a cold boot of Linux 6.11-rc7 (with
the additional patch to avoid the controller reset before fw load). The
MT7921AUN is directly connected to one of the computer's USB ports. The
system has an Intel AX211 fitted so I have disabled it's bluetooth
functionality in the UEFI setup.

Hope this helps.

> 
> BRs,
> Chris Lu

Regards,

Marc


[    0.000000] Linux version 6.11.0-rc7-00001-g0e2ad6528188-dirty (marcp at mdp-archnuc) (gcc (GCC) 14.2.1 20240805, GNU ld (GNU Binutils) 2.43.0) #71 SMP PREEMPT_DYNAMIC Mon Sep  9 23:22:56 BST 2024
[    0.000000] Command line: root=UUID=0420afc7-4947-4e2e-a096-b607b8b7fd93 rw quiet initrd=boot\intel-ucode.img initrd=boot\initramfs-linux611.img resume=UUID=0420afc7-4947-4e2e-a096-b607b8b7fd93 resume_offset=106496
[    0.000000] x86/split lock detection: #AC: crashing the kernel on kernel split_locks and warning on user-space split_locks
[    0.000000] BIOS-provided physical RAM map:
[    0.000000] BIOS-e820: [mem 0x0000000000000000-0x000000000009dfff] usable
[    0.000000] BIOS-e820: [mem 0x000000000009e000-0x000000000009efff] reserved
[    0.000000] BIOS-e820: [mem 0x000000000009f000-0x000000000009ffff] usable
[    0.000000] BIOS-e820: [mem 0x00000000000a0000-0x00000000000fffff] reserved
[    0.000000] BIOS-e820: [mem 0x0000000000100000-0x000000004dd45fff] usable
[    0.000000] BIOS-e820: [mem 0x000000004dd46000-0x0000000056c70fff] reserved
[    0.000000] BIOS-e820: [mem 0x0000000056c71000-0x0000000056d48fff] ACPI data
[    0.000000] BIOS-e820: [mem 0x0000000056d49000-0x0000000056ecefff] ACPI NVS
[    0.000000] BIOS-e820: [mem 0x0000000056ecf000-0x000000005a7fefff] reserved
[    0.000000] BIOS-e820: [mem 0x000000005a7ff000-0x000000005a7fffff] usable
[    0.000000] BIOS-e820: [mem 0x000000005a800000-0x00000000611fffff] reserved
[    0.000000] BIOS-e820: [mem 0x0000000061e00000-0x00000000687fffff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000c0000000-0x00000000cfffffff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000fe000000-0x00000000fe010fff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000fec00000-0x00000000fec00fff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000fed00000-0x00000000fed00fff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000fed20000-0x00000000fed7ffff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000fee00000-0x00000000fee00fff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000ff000000-0x00000000ffffffff] reserved
[    0.000000] BIOS-e820: [mem 0x0000000100000000-0x00000010977fffff] usable
[    0.000000] NX (Execute Disable) protection: active
[    0.000000] APIC: Static calls initialized
[    0.000000] efi: EFI v2.8 by American Megatrends
[    0.000000] efi: ACPI=0x56e48000 ACPI 2.0=0x56e48014 TPMFinalLog=0x56db4000 SMBIOS=0x5a483000 SMBIOS 3.0=0x5a482000 MEMATTR=0x4485d118 ESRT=0x43ea7e98 INITRD=0x41e12e98 RNG=0x56c9b018 TPMEventLog=0x41dd5018 
[    0.000000] random: crng init done
[    0.000000] efi: Remove mem115: MMIO range=[0xc0000000-0xcfffffff] (256MB) from e820 map
[    0.000000] e820: remove [mem 0xc0000000-0xcfffffff] reserved
[    0.000000] efi: Not removing mem116: MMIO range=[0xfe000000-0xfe010fff] (68KB) from e820 map
[    0.000000] efi: Not removing mem117: MMIO range=[0xfec00000-0xfec00fff] (4KB) from e820 map
[    0.000000] efi: Not removing mem118: MMIO range=[0xfed00000-0xfed00fff] (4KB) from e820 map
[    0.000000] efi: Not removing mem120: MMIO range=[0xfee00000-0xfee00fff] (4KB) from e820 map
[    0.000000] efi: Remove mem121: MMIO range=[0xff000000-0xffffffff] (16MB) from e820 map
[    0.000000] e820: remove [mem 0xff000000-0xffffffff] reserved
[    0.000000] SMBIOS 3.5.0 present.
[    0.000000] DMI: Intel(R) Client Systems NUC12WSHi7/NUC12WSBi7, BIOS WSADL357.0088.2023.0505.1623 05/05/2023
[    0.000000] DMI: Memory slots populated: 2/2
[    0.000000] tsc: Detected 2500.000 MHz processor
[    0.000000] tsc: Detected 2496.000 MHz TSC
[    0.000549] e820: update [mem 0x00000000-0x00000fff] usable ==> reserved
[    0.000550] e820: remove [mem 0x000a0000-0x000fffff] usable
[    0.000555] last_pfn = 0x1097800 max_arch_pfn = 0x400000000
[    0.000558] MTRR map: 5 entries (3 fixed + 2 variable; max 23), built from 10 variable MTRRs
[    0.000559] x86/PAT: Configuration [0-7]: WB  WC  UC- UC  WB  WP  UC- WT  
[    0.000935] last_pfn = 0x5a800 max_arch_pfn = 0x400000000
[    0.014044] esrt: Reserving ESRT space from 0x0000000043ea7e98 to 0x0000000043ea7f98.
[    0.014049] e820: update [mem 0x43ea7000-0x43ea7fff] usable ==> reserved
[    0.014062] Using GB pages for direct mapping
[    0.014063] Incomplete global flushes, disabling PCID
[    0.014285] Secure boot disabled
[    0.014285] RAMDISK: [mem 0x39be8000-0x4039cfff]
[    0.014312] ACPI: Early table checksum verification disabled
[    0.014315] ACPI: RSDP 0x0000000056E48014 000024 (v02 INTEL )
[    0.014318] ACPI: XSDT 0x0000000056DE4728 000114 (v01 INTEL  NUCxi7A5 00000058 AMI  01000013)
[    0.014322] ACPI: FACP 0x0000000056D46000 000114 (v06 INTEL  NUCxi7A5 00000058 AMI  01000013)
[    0.014326] ACPI: DSDT 0x0000000056CD9000 06CECF (v02 INTEL  NUCxi7A5 00000058 INTL 20200717)
[    0.014328] ACPI: FACS 0x0000000056ECC000 000040
[    0.014329] ACPI: FIDT 0x0000000056CD8000 00009C (v01 INTEL  NUCxi7A5 00000058 AMI  00010013)
[    0.014331] ACPI: SSDT 0x0000000056D48000 00038C (v02 INTEL  NUCxi7A5 00000058 INTL 20200717)
[    0.014333] ACPI: SSDT 0x0000000056CD2000 005D2C (v02 INTEL  NUCxi7A5 00000058 INTL 20200717)
[    0.014335] ACPI: SSDT 0x0000000056CCF000 002AA1 (v02 INTEL  NUCxi7A5 00000058 INTL 20200717)
[    0.014337] ACPI: SSDT 0x0000000056CCB000 0033D3 (v02 INTEL  NUCxi7A5 00000058 INTL 20200717)
[    0.014339] ACPI: SSDT 0x0000000056CBD000 00D39F (v02 INTEL  NUCxi7A5 00001000 INTL 20200717)
[    0.014341] ACPI: HPET 0x0000000056D47000 000038 (v01 INTEL  NUCxi7A5 00000058 AMI  01000013)
[    0.014343] ACPI: APIC 0x0000000056CBC000 0001DC (v05 INTEL  NUCxi7A5 00000058 AMI  01000013)
[    0.014344] ACPI: MCFG 0x0000000056CBB000 00003C (v01 INTEL  NUCxi7A5 00000058 AMI  01000013)
[    0.014346] ACPI: SSDT 0x0000000056CB9000 001F04 (v02 INTEL  NUCxi7A5 00000058 INTL 20200717)
[    0.014348] ACPI: SSDT 0x0000000056CB7000 001DFD (v02 INTEL  NUCxi7A5 00000058 INTL 20200717)
[    0.014350] ACPI: UEFI 0x0000000056D9B000 000048 (v01 INTEL  NUCxi7A5 00000058 AMI  01000013)
[    0.014352] ACPI: NHLT 0x0000000056CB6000 0002F1 (v00 INTEL  NUCxi7A5 00000058 AMI  01000013)
[    0.014353] ACPI: LPIT 0x0000000056CB5000 0000CC (v01 INTEL  NUCxi7A5 00000058 AMI  01000013)
[    0.014355] ACPI: WDAT 0x0000000056CB3000 000134 (v01 INTEL  NUCxi7A5 00000058 AMI  01000013)
[    0.014357] ACPI: SSDT 0x0000000056CB0000 002A83 (v02 INTEL  NUCxi7A5 00000058 INTL 20200717)
[    0.014359] ACPI: SSDT 0x0000000056CAD000 002357 (v02 INTEL  NUCxi7A5 00000058 INTL 20200717)
[    0.014361] ACPI: DBGP 0x0000000056CAC000 000034 (v01 INTEL  NUCxi7A5 00000058 AMI  01000013)
[    0.014363] ACPI: DBG2 0x0000000056CAB000 000054 (v00 INTEL  NUCxi7A5 00000058 AMI  01000013)
[    0.014364] ACPI: DMAR 0x0000000056CAA000 000088 (v02 INTEL  NUCxi7A5 00000058      01000013)
[    0.014366] ACPI: FPDT 0x0000000056CA9000 000044 (v01 INTEL  NUCxi7A5 00000058 AMI  01000013)
[    0.014368] ACPI: SSDT 0x0000000056CA8000 000D56 (v02 INTEL  NUCxi7A5 00000058 INTL 20200717)
[    0.014370] ACPI: SSDT 0x0000000056CA4000 003AEA (v02 INTEL  NUCxi7A5 00000058 INTL 20200717)
[    0.014372] ACPI: SSDT 0x0000000056CA0000 0035A2 (v02 INTEL  NUCxi7A5 00000058 INTL 20200717)
[    0.014374] ACPI: SSDT 0x0000000056C9F000 000144 (v02 INTEL  NUCxi7A5 00000058 INTL 20200717)
[    0.014376] ACPI: BGRT 0x0000000056C9E000 000038 (v01 INTEL  NUCxi7A5 00000058 AMI  00010013)
[    0.014377] ACPI: TPM2 0x0000000056C9D000 00004C (v04 INTEL  NUCxi7A5 00000058 AMI  00000000)
[    0.014379] ACPI: PHAT 0x0000000056C9C000 00062D (v01 INTEL  NUCxi7A5 00000058 MSFT 0100000D)
[    0.014381] ACPI: WSMT 0x0000000056CB4000 000028 (v01 INTEL  NUCxi7A5 00000058 AMI  00010013)
[    0.014383] ACPI: Reserving FACP table memory at [mem 0x56d46000-0x56d46113]
[    0.014384] ACPI: Reserving DSDT table memory at [mem 0x56cd9000-0x56d45ece]
[    0.014384] ACPI: Reserving FACS table memory at [mem 0x56ecc000-0x56ecc03f]
[    0.014385] ACPI: Reserving FIDT table memory at [mem 0x56cd8000-0x56cd809b]
[    0.014386] ACPI: Reserving SSDT table memory at [mem 0x56d48000-0x56d4838b]
[    0.014386] ACPI: Reserving SSDT table memory at [mem 0x56cd2000-0x56cd7d2b]
[    0.014387] ACPI: Reserving SSDT table memory at [mem 0x56ccf000-0x56cd1aa0]
[    0.014387] ACPI: Reserving SSDT table memory at [mem 0x56ccb000-0x56cce3d2]
[    0.014388] ACPI: Reserving SSDT table memory at [mem 0x56cbd000-0x56cca39e]
[    0.014388] ACPI: Reserving HPET table memory at [mem 0x56d47000-0x56d47037]
[    0.014389] ACPI: Reserving APIC table memory at [mem 0x56cbc000-0x56cbc1db]
[    0.014389] ACPI: Reserving MCFG table memory at [mem 0x56cbb000-0x56cbb03b]
[    0.014390] ACPI: Reserving SSDT table memory at [mem 0x56cb9000-0x56cbaf03]
[    0.014390] ACPI: Reserving SSDT table memory at [mem 0x56cb7000-0x56cb8dfc]
[    0.014391] ACPI: Reserving UEFI table memory at [mem 0x56d9b000-0x56d9b047]
[    0.014391] ACPI: Reserving NHLT table memory at [mem 0x56cb6000-0x56cb62f0]
[    0.014392] ACPI: Reserving LPIT table memory at [mem 0x56cb5000-0x56cb50cb]
[    0.014392] ACPI: Reserving WDAT table memory at [mem 0x56cb3000-0x56cb3133]
[    0.014393] ACPI: Reserving SSDT table memory at [mem 0x56cb0000-0x56cb2a82]
[    0.014393] ACPI: Reserving SSDT table memory at [mem 0x56cad000-0x56caf356]
[    0.014394] ACPI: Reserving DBGP table memory at [mem 0x56cac000-0x56cac033]
[    0.014394] ACPI: Reserving DBG2 table memory at [mem 0x56cab000-0x56cab053]
[    0.014395] ACPI: Reserving DMAR table memory at [mem 0x56caa000-0x56caa087]
[    0.014395] ACPI: Reserving FPDT table memory at [mem 0x56ca9000-0x56ca9043]
[    0.014396] ACPI: Reserving SSDT table memory at [mem 0x56ca8000-0x56ca8d55]
[    0.014396] ACPI: Reserving SSDT table memory at [mem 0x56ca4000-0x56ca7ae9]
[    0.014397] ACPI: Reserving SSDT table memory at [mem 0x56ca0000-0x56ca35a1]
[    0.014397] ACPI: Reserving SSDT table memory at [mem 0x56c9f000-0x56c9f143]
[    0.014398] ACPI: Reserving BGRT table memory at [mem 0x56c9e000-0x56c9e037]
[    0.014398] ACPI: Reserving TPM2 table memory at [mem 0x56c9d000-0x56c9d04b]
[    0.014399] ACPI: Reserving PHAT table memory at [mem 0x56c9c000-0x56c9c62c]
[    0.014400] ACPI: Reserving WSMT table memory at [mem 0x56cb4000-0x56cb4027]
[    0.014743] No NUMA configuration found
[    0.014744] Faking a node at [mem 0x0000000000000000-0x00000010977fffff]
[    0.014746] NODE_DATA(0) allocated [mem 0x10977fb000-0x10977fffff]
[    0.014795] Zone ranges:
[    0.014796]   DMA      [mem 0x0000000000001000-0x0000000000ffffff]
[    0.014797]   DMA32    [mem 0x0000000001000000-0x00000000ffffffff]
[    0.014798]   Normal   [mem 0x0000000100000000-0x00000010977fffff]
[    0.014799]   Device   empty
[    0.014799] Movable zone start for each node
[    0.014800] Early memory node ranges
[    0.014800]   node   0: [mem 0x0000000000001000-0x000000000009dfff]
[    0.014801]   node   0: [mem 0x000000000009f000-0x000000000009ffff]
[    0.014801]   node   0: [mem 0x0000000000100000-0x000000004dd45fff]
[    0.014802]   node   0: [mem 0x000000005a7ff000-0x000000005a7fffff]
[    0.014802]   node   0: [mem 0x0000000100000000-0x00000010977fffff]
[    0.014805] Initmem setup node 0 [mem 0x0000000000001000-0x00000010977fffff]
[    0.014808] On node 0, zone DMA: 1 pages in unavailable ranges
[    0.014809] On node 0, zone DMA: 1 pages in unavailable ranges
[    0.014821] On node 0, zone DMA: 96 pages in unavailable ranges
[    0.015998] On node 0, zone DMA32: 19129 pages in unavailable ranges
[    0.078525] On node 0, zone Normal: 22528 pages in unavailable ranges
[    0.078536] On node 0, zone Normal: 2048 pages in unavailable ranges
[    0.078567] Reserving Intel graphics memory at [mem 0x64800000-0x687fffff]
[    0.080194] ACPI: PM-Timer IO Port: 0x1808
[    0.080199] ACPI: LAPIC_NMI (acpi_id[0x01] high edge lint[0x1])
[    0.080200] ACPI: LAPIC_NMI (acpi_id[0x02] high edge lint[0x1])
[    0.080200] ACPI: LAPIC_NMI (acpi_id[0x03] high edge lint[0x1])
[    0.080201] ACPI: LAPIC_NMI (acpi_id[0x04] high edge lint[0x1])
[    0.080201] ACPI: LAPIC_NMI (acpi_id[0x05] high edge lint[0x1])
[    0.080201] ACPI: LAPIC_NMI (acpi_id[0x06] high edge lint[0x1])
[    0.080202] ACPI: LAPIC_NMI (acpi_id[0x07] high edge lint[0x1])
[    0.080202] ACPI: LAPIC_NMI (acpi_id[0x08] high edge lint[0x1])
[    0.080203] ACPI: LAPIC_NMI (acpi_id[0x09] high edge lint[0x1])
[    0.080203] ACPI: LAPIC_NMI (acpi_id[0x0a] high edge lint[0x1])
[    0.080203] ACPI: LAPIC_NMI (acpi_id[0x0b] high edge lint[0x1])
[    0.080204] ACPI: LAPIC_NMI (acpi_id[0x0c] high edge lint[0x1])
[    0.080204] ACPI: LAPIC_NMI (acpi_id[0x0d] high edge lint[0x1])
[    0.080205] ACPI: LAPIC_NMI (acpi_id[0x0e] high edge lint[0x1])
[    0.080205] ACPI: LAPIC_NMI (acpi_id[0x0f] high edge lint[0x1])
[    0.080205] ACPI: LAPIC_NMI (acpi_id[0x10] high edge lint[0x1])
[    0.080206] ACPI: LAPIC_NMI (acpi_id[0x11] high edge lint[0x1])
[    0.080206] ACPI: LAPIC_NMI (acpi_id[0x12] high edge lint[0x1])
[    0.080207] ACPI: LAPIC_NMI (acpi_id[0x13] high edge lint[0x1])
[    0.080207] ACPI: LAPIC_NMI (acpi_id[0x14] high edge lint[0x1])
[    0.080207] ACPI: LAPIC_NMI (acpi_id[0x15] high edge lint[0x1])
[    0.080208] ACPI: LAPIC_NMI (acpi_id[0x16] high edge lint[0x1])
[    0.080208] ACPI: LAPIC_NMI (acpi_id[0x17] high edge lint[0x1])
[    0.080209] ACPI: LAPIC_NMI (acpi_id[0x00] high edge lint[0x1])
[    0.080291] IOAPIC[0]: apic_id 2, version 32, address 0xfec00000, GSI 0-119
[    0.080293] ACPI: INT_SRC_OVR (bus 0 bus_irq 0 global_irq 2 dfl dfl)
[    0.080294] ACPI: INT_SRC_OVR (bus 0 bus_irq 9 global_irq 9 high level)
[    0.080296] ACPI: Using ACPI (MADT) for SMP configuration information
[    0.080297] ACPI: HPET id: 0x8086a201 base: 0xfed00000
[    0.080302] e820: update [mem 0x444e6000-0x44584fff] usable ==> reserved
[    0.080309] TSC deadline timer available
[    0.080311] CPU topo: Max. logical packages:   1
[    0.080311] CPU topo: Max. logical dies:       1
[    0.080312] CPU topo: Max. dies per package:   1
[    0.080313] CPU topo: Max. threads per core:   2
[    0.080314] CPU topo: Num. cores per package:    12
[    0.080314] CPU topo: Num. threads per package:  16
[    0.080314] CPU topo: Allowing 16 present CPUs plus 0 hotplug CPUs
[    0.080325] PM: hibernation: Registered nosave memory: [mem 0x00000000-0x00000fff]
[    0.080326] PM: hibernation: Registered nosave memory: [mem 0x0009e000-0x0009efff]
[    0.080327] PM: hibernation: Registered nosave memory: [mem 0x000a0000-0x000fffff]
[    0.080328] PM: hibernation: Registered nosave memory: [mem 0x43ea7000-0x43ea7fff]
[    0.080329] PM: hibernation: Registered nosave memory: [mem 0x444e6000-0x44584fff]
[    0.080330] PM: hibernation: Registered nosave memory: [mem 0x4dd46000-0x56c70fff]
[    0.080330] PM: hibernation: Registered nosave memory: [mem 0x56c71000-0x56d48fff]
[    0.080331] PM: hibernation: Registered nosave memory: [mem 0x56d49000-0x56ecefff]
[    0.080331] PM: hibernation: Registered nosave memory: [mem 0x56ecf000-0x5a7fefff]
[    0.080332] PM: hibernation: Registered nosave memory: [mem 0x5a800000-0x611fffff]
[    0.080332] PM: hibernation: Registered nosave memory: [mem 0x61200000-0x61dfffff]
[    0.080333] PM: hibernation: Registered nosave memory: [mem 0x61e00000-0x687fffff]
[    0.080333] PM: hibernation: Registered nosave memory: [mem 0x68800000-0xfdffffff]
[    0.080333] PM: hibernation: Registered nosave memory: [mem 0xfe000000-0xfe010fff]
[    0.080334] PM: hibernation: Registered nosave memory: [mem 0xfe011000-0xfebfffff]
[    0.080334] PM: hibernation: Registered nosave memory: [mem 0xfec00000-0xfec00fff]
[    0.080334] PM: hibernation: Registered nosave memory: [mem 0xfec01000-0xfecfffff]
[    0.080335] PM: hibernation: Registered nosave memory: [mem 0xfed00000-0xfed00fff]
[    0.080335] PM: hibernation: Registered nosave memory: [mem 0xfed01000-0xfed1ffff]
[    0.080336] PM: hibernation: Registered nosave memory: [mem 0xfed20000-0xfed7ffff]
[    0.080336] PM: hibernation: Registered nosave memory: [mem 0xfed80000-0xfedfffff]
[    0.080336] PM: hibernation: Registered nosave memory: [mem 0xfee00000-0xfee00fff]
[    0.080337] PM: hibernation: Registered nosave memory: [mem 0xfee01000-0xffffffff]
[    0.080338] [mem 0x68800000-0xfdffffff] available for PCI devices
[    0.080339] Booting paravirtualized kernel on bare hardware
[    0.080340] clocksource: refined-jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 6370452778343963 ns
[    0.084163] setup_percpu: NR_CPUS:320 nr_cpumask_bits:16 nr_cpu_ids:16 nr_node_ids:1
[    0.084800] percpu: Embedded 66 pages/cpu s233472 r8192 d28672 u524288
[    0.084804] pcpu-alloc: s233472 r8192 d28672 u524288 alloc=1*2097152
[    0.084806] pcpu-alloc: [0] 00 01 02 03 [0] 04 05 06 07 
[    0.084809] pcpu-alloc: [0] 08 09 10 11 [0] 12 13 14 15 
[    0.084820] Kernel command line: root=UUID=0420afc7-4947-4e2e-a096-b607b8b7fd93 rw quiet initrd=boot\intel-ucode.img initrd=boot\initramfs-linux611.img resume=UUID=0420afc7-4947-4e2e-a096-b607b8b7fd93 resume_offset=106496
[    0.088825] Dentry cache hash table entries: 8388608 (order: 14, 67108864 bytes, linear)
[    0.090830] Inode-cache hash table entries: 4194304 (order: 13, 33554432 bytes, linear)
[    0.090938] Fallback order for Node 0: 0 
[    0.090940] Built 1 zonelists, mobility grouping on.  Total pages: 16667877
[    0.090941] Policy zone: Normal
[    0.091110] mem auto-init: stack:all(zero), heap alloc:on, heap free:off
[    0.091117] software IO TLB: area num 16.
[    0.174200] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=16, Nodes=1
[    0.174233] ftrace: allocating 50629 entries in 198 pages
[    0.178623] ftrace: allocated 198 pages with 4 groups
[    0.178673] Dynamic Preempt: full
[    0.178715] rcu: Preemptible hierarchical RCU implementation.
[    0.178716] rcu: 	RCU restricting CPUs from NR_CPUS=320 to nr_cpu_ids=16.
[    0.178716] rcu: 	RCU priority boosting: priority 1 delay 500 ms.
[    0.178717] 	Trampoline variant of Tasks RCU enabled.
[    0.178718] 	Rude variant of Tasks RCU enabled.
[    0.178718] 	Tracing variant of Tasks RCU enabled.
[    0.178718] rcu: RCU calculated value of scheduler-enlistment delay is 30 jiffies.
[    0.178719] rcu: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=16
[    0.178727] RCU Tasks: Setting shift to 4 and lim to 1 rcu_task_cb_adjust=1.
[    0.178728] RCU Tasks Rude: Setting shift to 4 and lim to 1 rcu_task_cb_adjust=1.
[    0.178729] RCU Tasks Trace: Setting shift to 4 and lim to 1 rcu_task_cb_adjust=1.
[    0.181066] NR_IRQS: 20736, nr_irqs: 2184, preallocated irqs: 16
[    0.181413] rcu: srcu_init: Setting srcu_struct sizes based on contention.
[    0.181851] kfence: initialized - using 2097152 bytes for 255 objects at 0x(____ptrval____)-0x(____ptrval____)
[    0.181876] Console: colour dummy device 80x25
[    0.181878] printk: legacy console [tty0] enabled
[    0.181906] ACPI: Core revision 20240322
[    0.182096] hpet: HPET dysfunctional in PC10. Force disabled.
[    0.182097] APIC: Switch to symmetric I/O mode setup
[    0.182099] DMAR: Host address width 39
[    0.182099] DMAR: DRHD base: 0x000000fed90000 flags: 0x0
[    0.182103] DMAR: dmar0: reg_base_addr fed90000 ver 4:0 cap 1c0000c40660462 ecap 29a00f0505e
[    0.182104] DMAR: DRHD base: 0x000000fed91000 flags: 0x1
[    0.182107] DMAR: dmar1: reg_base_addr fed91000 ver 5:0 cap d2008c40660462 ecap f050da
[    0.182109] DMAR: RMRR base: 0x00000064000000 end: 0x000000687fffff
[    0.182111] DMAR-IR: IOAPIC id 2 under DRHD base  0xfed91000 IOMMU 1
[    0.182112] DMAR-IR: HPET id 0 under DRHD base 0xfed91000
[    0.182112] DMAR-IR: Queued invalidation will be enabled to support x2apic and Intr-remapping.
[    0.186032] DMAR-IR: Enabled IRQ remapping in x2apic mode
[    0.186034] x2apic enabled
[    0.186100] APIC: Switched APIC routing to: cluster x2apic
[    0.197380] clocksource: tsc-early: mask: 0xffffffffffffffff max_cycles: 0x23fa772cf26, max_idle_ns: 440795269835 ns
[    0.197384] Calibrating delay loop (skipped), value calculated using timer frequency.. 4993.00 BogoMIPS (lpj=8320000)
[    0.197430] CPU0: Thermal monitoring enabled (TM1)
[    0.197431] x86/cpu: User Mode Instruction Prevention (UMIP) activated
[    0.197530] CET detected: Indirect Branch Tracking enabled
[    0.197532] Last level iTLB entries: 4KB 0, 2MB 0, 4MB 0
[    0.197532] Last level dTLB entries: 4KB 0, 2MB 0, 4MB 0, 1GB 0
[    0.197534] process: using mwait in idle threads
[    0.197536] Spectre V1 : Mitigation: usercopy/swapgs barriers and __user pointer sanitization
[    0.197537] Spectre V2 : Mitigation: Enhanced / Automatic IBRS
[    0.197538] Spectre V2 : Spectre v2 / SpectreRSB mitigation: Filling RSB on context switch
[    0.197538] Spectre V2 : Spectre v2 / PBRSB-eIBRS: Retire a single CALL on VMEXIT
[    0.197539] Spectre V2 : mitigation: Enabling conditional Indirect Branch Prediction Barrier
[    0.197540] Speculative Store Bypass: Mitigation: Speculative Store Bypass disabled via prctl
[    0.197541] Register File Data Sampling: Mitigation: Clear Register File
[    0.197547] x86/fpu: Supporting XSAVE feature 0x001: 'x87 floating point registers'
[    0.197548] x86/fpu: Supporting XSAVE feature 0x002: 'SSE registers'
[    0.197548] x86/fpu: Supporting XSAVE feature 0x004: 'AVX registers'
[    0.197549] x86/fpu: Supporting XSAVE feature 0x200: 'Protection Keys User registers'
[    0.197549] x86/fpu: Supporting XSAVE feature 0x800: 'Control-flow User registers'
[    0.197550] x86/fpu: xstate_offset[2]:  576, xstate_sizes[2]:  256
[    0.197551] x86/fpu: xstate_offset[9]:  832, xstate_sizes[9]:    8
[    0.197551] x86/fpu: xstate_offset[11]:  840, xstate_sizes[11]:   16
[    0.197552] x86/fpu: Enabled xstate features 0xa07, context size is 856 bytes, using 'compacted' format.
[    0.200716] Freeing SMP alternatives memory: 40K
[    0.200716] pid_max: default: 32768 minimum: 301
[    0.200716] LSM: initializing lsm=capability,landlock,lockdown,yama,bpf
[    0.200716] landlock: Up and running.
[    0.200716] Yama: becoming mindful.
[    0.200716] LSM support for eBPF active
[    0.200716] Mount-cache hash table entries: 131072 (order: 8, 1048576 bytes, linear)
[    0.200716] Mountpoint-cache hash table entries: 131072 (order: 8, 1048576 bytes, linear)
[    0.200716] smpboot: CPU0: 12th Gen Intel(R) Core(TM) i7-1260P (family: 0x6, model: 0x9a, stepping: 0x3)
[    0.200716] Performance Events: XSAVE Architectural LBR, PEBS fmt4+-baseline,  AnyThread deprecated, Alderlake Hybrid events, 32-deep LBR, full-width counters, Intel PMU driver.
[    0.200716] core: cpu_core PMU driver: 
[    0.200716] ... version:                5
[    0.200716] ... bit width:              48
[    0.200716] ... generic registers:      8
[    0.200716] ... value mask:             0000ffffffffffff
[    0.200716] ... max period:             00007fffffffffff
[    0.200716] ... fixed-purpose events:   4
[    0.200716] ... event mask:             0001000f000000ff
[    0.200716] signal: max sigframe size: 3632
[    0.200716] Estimated ratio of average max frequency by base frequency (times 1024): 1556
[    0.200716] rcu: Hierarchical SRCU implementation.
[    0.200716] rcu: 	Max phase no-delay instances is 1000.
[    0.200716] Timer migration: 2 hierarchy levels; 8 children per group; 2 crossnode level
[    0.200716] NMI watchdog: Enabled. Permanently consumes one hw-PMU counter.
[    0.200716] smp: Bringing up secondary CPUs ...
[    0.200716] smpboot: x86: Booting SMP configuration:
[    0.200716] .... node  #0, CPUs:        #2  #4  #6  #8  #9 #10 #11 #12 #13 #14 #15
[    0.018930] core: cpu_atom PMU driver: PEBS-via-PT 
[    0.018930] ... version:                5
[    0.018930] ... bit width:              48
[    0.018930] ... generic registers:      6
[    0.018930] ... value mask:             0000ffffffffffff
[    0.018930] ... max period:             00007fffffffffff
[    0.018930] ... fixed-purpose events:   3
[    0.018930] ... event mask:             000000070000003f
[    0.210777]   #1  #3  #5  #7
[    0.215011] smp: Brought up 1 node, 16 CPUs
[    0.215011] smpboot: Total of 16 processors activated (79903.00 BogoMIPS)
[    0.217482] Memory: 65276284K/66671508K available (18432K kernel code, 2185K rwdata, 13516K rodata, 3452K init, 3432K bss, 1370520K reserved, 0K cma-reserved)
[    0.218690] devtmpfs: initialized
[    0.218690] x86/mm: Memory block size: 2048MB
[    0.218690] ACPI: PM: Registering ACPI NVS region [mem 0x56d49000-0x56ecefff] (1597440 bytes)
[    0.218690] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 6370867519511994 ns
[    0.218690] futex hash table entries: 4096 (order: 6, 262144 bytes, linear)
[    0.218690] pinctrl core: initialized pinctrl subsystem
[    0.218690] PM: RTC time: 15:43:42, date: 2024-09-17
[    0.218690] NET: Registered PF_NETLINK/PF_ROUTE protocol family
[    0.218690] DMA: preallocated 4096 KiB GFP_KERNEL pool for atomic allocations
[    0.218815] DMA: preallocated 4096 KiB GFP_KERNEL|GFP_DMA pool for atomic allocations
[    0.220935] DMA: preallocated 4096 KiB GFP_KERNEL|GFP_DMA32 pool for atomic allocations
[    0.220946] audit: initializing netlink subsys (disabled)
[    0.220955] audit: type=2000 audit(1726587822.023:1): state=initialized audit_enabled=0 res=1
[    0.220955] thermal_sys: Registered thermal governor 'fair_share'
[    0.220955] thermal_sys: Registered thermal governor 'bang_bang'
[    0.220955] thermal_sys: Registered thermal governor 'step_wise'
[    0.220955] thermal_sys: Registered thermal governor 'user_space'
[    0.220955] thermal_sys: Registered thermal governor 'power_allocator'
[    0.220955] cpuidle: using governor ladder
[    0.220955] cpuidle: using governor menu
[    0.220955] acpiphp: ACPI Hot Plug PCI Controller Driver version: 0.5
[    0.220955] PCI: ECAM [mem 0xc0000000-0xcfffffff] (base 0xc0000000) for domain 0000 [bus 00-ff]
[    0.220955] PCI: Using configuration type 1 for base access
[    0.220955] kprobes: kprobe jump-optimization is enabled. All kprobes are optimized if possible.
[    0.224191] HugeTLB: registered 1.00 GiB page size, pre-allocated 0 pages
[    0.224191] HugeTLB: 16380 KiB vmemmap can be freed for a 1.00 GiB page
[    0.224191] HugeTLB: registered 2.00 MiB page size, pre-allocated 0 pages
[    0.224191] HugeTLB: 28 KiB vmemmap can be freed for a 2.00 MiB page
[    0.224500] ACPI: Added _OSI(Module Device)
[    0.224500] ACPI: Added _OSI(Processor Device)
[    0.224500] ACPI: Added _OSI(3.0 _SCP Extensions)
[    0.224500] ACPI: Added _OSI(Processor Aggregator Device)
[    0.312844] ACPI: 14 ACPI AML tables successfully acquired and loaded
[    0.336673] ACPI: USB4 _OSC: OS supports USB3+ DisplayPort+ PCIe+ XDomain+
[    0.336675] ACPI: USB4 _OSC: OS controls USB3+ DisplayPort+ PCIe+ XDomain+
[    0.338150] ACPI: Dynamic OEM Table Load:
[    0.338158] ACPI: SSDT 0xFFFF9118C178D400 000394 (v02 PmRef  Cpu0Cst  00003001 INTL 20200717)
[    0.339255] ACPI: Dynamic OEM Table Load:
[    0.339260] ACPI: SSDT 0xFFFF9118C1798000 0005E4 (v02 PmRef  Cpu0Ist  00003000 INTL 20200717)
[    0.340384] ACPI: Dynamic OEM Table Load:
[    0.340388] ACPI: SSDT 0xFFFF9118C2101200 0001AB (v02 PmRef  Cpu0Psd  00003000 INTL 20200717)
[    0.341453] ACPI: Dynamic OEM Table Load:
[    0.341457] ACPI: SSDT 0xFFFF9118C179B000 0004BA (v02 PmRef  Cpu0Hwp  00003000 INTL 20200717)
[    0.342940] ACPI: Dynamic OEM Table Load:
[    0.342947] ACPI: SSDT 0xFFFF9118C1784000 001BAF (v02 PmRef  ApIst    00003000 INTL 20200717)
[    0.344827] ACPI: Dynamic OEM Table Load:
[    0.344833] ACPI: SSDT 0xFFFF9118C1780000 001038 (v02 PmRef  ApHwp    00003000 INTL 20200717)
[    0.346435] ACPI: Dynamic OEM Table Load:
[    0.346441] ACPI: SSDT 0xFFFF9118C21C6000 001349 (v02 PmRef  ApPsd    00003000 INTL 20200717)
[    0.347383] ACPI: Dynamic OEM Table Load:
[    0.347383] ACPI: SSDT 0xFFFF9118C1797000 000FBB (v02 PmRef  ApCst    00003000 INTL 20200717)
[    0.351835] ACPI: EC: EC started
[    0.351836] ACPI: EC: interrupt blocked
[    0.352497] ACPI: EC: EC_CMD/EC_SC=0x66, EC_DATA=0x62
[    0.352499] ACPI: \_SB_.PC00.LPCB.EC0_: Boot DSDT EC used to handle transactions
[    0.352501] ACPI: Interpreter enabled
[    0.352548] ACPI: PM: (supports S0 S3 S4 S5)
[    0.352549] ACPI: Using IOAPIC for interrupt routing
[    0.353800] PCI: Using host bridge windows from ACPI; if necessary, use "pci=nocrs" and report a bug
[    0.353801] PCI: Ignoring E820 reservations for host bridge windows
[    0.355184] ACPI: Enabled 7 GPEs in block 00 to 7F
[    0.357600] ACPI: \_SB_.PC00.PEG0.PXP_: New power resource
[    0.373986] ACPI: \_SB_.PC00.XHCI.RHUB.HS10.BTRT: New power resource
[    0.374768] ACPI: \_SB_.PC00.PAUD: New power resource
[    0.383767] ACPI: \_SB_.PC00.CNVW.WRST: New power resource
[    0.392041] ACPI: \_SB_.PC00.TBT0: New power resource
[    0.392349] ACPI: \_SB_.PC00.TBT1: New power resource
[    0.392651] ACPI: \_SB_.PC00.D3C_: New power resource
[    0.683890] ACPI: \_TZ_.FN00: New power resource
[    0.683946] ACPI: \_TZ_.FN01: New power resource
[    0.684000] ACPI: \_TZ_.FN02: New power resource
[    0.684056] ACPI: \_TZ_.FN03: New power resource
[    0.684110] ACPI: \_TZ_.FN04: New power resource
[    0.684638] ACPI: \PIN_: New power resource
[    0.685242] ACPI: PCI Root Bridge [PC00] (domain 0000 [bus 00-fe])
[    0.685248] acpi PNP0A08:00: _OSC: OS supports [ExtendedConfig ASPM ClockPM Segments MSI EDR HPX-Type3]
[    0.686937] acpi PNP0A08:00: _OSC: platform does not support [AER]
[    0.690313] acpi PNP0A08:00: _OSC: OS now controls [PCIeHotplug SHPCHotplug PME PCIeCapability LTR DPC]
[    0.692570] PCI host bridge to bus 0000:00
[    0.692573] pci_bus 0000:00: root bus resource [io  0x0000-0x0cf7 window]
[    0.692575] pci_bus 0000:00: root bus resource [io  0x0d00-0xffff window]
[    0.692576] pci_bus 0000:00: root bus resource [mem 0x000a0000-0x000bffff window]
[    0.692578] pci_bus 0000:00: root bus resource [mem 0x000e0000-0x000fffff window]
[    0.692579] pci_bus 0000:00: root bus resource [mem 0x68800000-0xbfffffff window]
[    0.692580] pci_bus 0000:00: root bus resource [mem 0x4000000000-0x7fffffffff window]
[    0.692581] pci_bus 0000:00: root bus resource [bus 00-fe]
[    0.692868] pci 0000:00:00.0: [8086:4621] type 00 class 0x060000 conventional PCI endpoint
[    0.693054] pci 0000:00:02.0: [8086:46a6] type 00 class 0x030000 PCIe Root Complex Integrated Endpoint
[    0.693062] pci 0000:00:02.0: BAR 0 [mem 0x603c000000-0x603cffffff 64bit]
[    0.693067] pci 0000:00:02.0: BAR 2 [mem 0x4000000000-0x400fffffff 64bit pref]
[    0.693070] pci 0000:00:02.0: BAR 4 [io  0x3000-0x303f]
[    0.693084] pci 0000:00:02.0: DMAR: Skip IOMMU disabling for graphics
[    0.693086] pci 0000:00:02.0: Video device with shadowed ROM at [mem 0x000c0000-0x000dffff]
[    0.693109] pci 0000:00:02.0: VF BAR 0 [mem 0x00000000-0x00ffffff 64bit]
[    0.693110] pci 0000:00:02.0: VF BAR 0 [mem 0x00000000-0x06ffffff 64bit]: contains BAR 0 for 7 VFs
[    0.693114] pci 0000:00:02.0: VF BAR 2 [mem 0x00000000-0x1fffffff 64bit pref]
[    0.693115] pci 0000:00:02.0: VF BAR 2 [mem 0x00000000-0xdfffffff 64bit pref]: contains BAR 2 for 7 VFs
[    0.693336] pci 0000:00:06.0: [8086:464d] type 01 class 0x060400 PCIe Root Port
[    0.693379] pci 0000:00:06.0: PCI bridge to [bus 01]
[    0.693412] pci 0000:00:06.0:   bridge window [mem 0x84600000-0x846fffff]
[    0.693547] pci 0000:00:06.0: PME# supported from D0 D3hot D3cold
[    0.693596] pci 0000:00:06.0: PTM enabled (root), 4ns granularity
[    0.694331] pci 0000:00:07.0: [8086:466e] type 01 class 0x060400 PCIe Root Port
[    0.694351] pci 0000:00:07.0: PCI bridge to [bus 02-39]
[    0.694355] pci 0000:00:07.0:   bridge window [mem 0x78000000-0x841fffff]
[    0.694361] pci 0000:00:07.0:   bridge window [mem 0x6020000000-0x603bffffff 64bit pref]
[    0.694383] pci 0000:00:07.0: Overriding RP PIO Log Size to 4
[    0.694445] pci 0000:00:07.0: PME# supported from D0 D3hot D3cold
[    0.694469] pci 0000:00:07.0: PTM enabled (root), 4ns granularity
[    0.696553] pci 0000:00:07.2: [8086:462f] type 01 class 0x060400 PCIe Root Port
[    0.696570] pci 0000:00:07.2: PCI bridge to [bus 3a-63]
[    0.696574] pci 0000:00:07.2:   bridge window [mem 0x6a000000-0x761fffff]
[    0.696580] pci 0000:00:07.2:   bridge window [mem 0x6000000000-0x601bffffff 64bit pref]
[    0.696602] pci 0000:00:07.2: Overriding RP PIO Log Size to 4
[    0.696664] pci 0000:00:07.2: PME# supported from D0 D3hot D3cold
[    0.696688] pci 0000:00:07.2: PTM enabled (root), 4ns granularity
[    0.698832] pci 0000:00:08.0: [8086:464f] type 00 class 0x088000 conventional PCI endpoint
[    0.698840] pci 0000:00:08.0: BAR 0 [mem 0x603d1bb000-0x603d1bbfff 64bit]
[    0.698934] pci 0000:00:0a.0: [8086:467d] type 00 class 0x118000 PCIe Root Complex Integrated Endpoint
[    0.698941] pci 0000:00:0a.0: BAR 0 [mem 0x603d1a0000-0x603d1a7fff 64bit]
[    0.698958] pci 0000:00:0a.0: enabling Extended Tags
[    0.699060] pci 0000:00:0d.0: [8086:461e] type 00 class 0x0c0330 conventional PCI endpoint
[    0.699069] pci 0000:00:0d.0: BAR 0 [mem 0x603d190000-0x603d19ffff 64bit]
[    0.699109] pci 0000:00:0d.0: PME# supported from D3hot D3cold
[    0.701032] pci 0000:00:0d.2: [8086:463e] type 00 class 0x0c0340 conventional PCI endpoint
[    0.701045] pci 0000:00:0d.2: BAR 0 [mem 0x603d140000-0x603d17ffff 64bit]
[    0.701051] pci 0000:00:0d.2: BAR 2 [mem 0x603d1ba000-0x603d1bafff 64bit]
[    0.701083] pci 0000:00:0d.2: supports D1 D2
[    0.701084] pci 0000:00:0d.2: PME# supported from D0 D1 D2 D3hot D3cold
[    0.701215] pci 0000:00:0d.3: [8086:466d] type 00 class 0x0c0340 conventional PCI endpoint
[    0.701225] pci 0000:00:0d.3: BAR 0 [mem 0x603d100000-0x603d13ffff 64bit]
[    0.701231] pci 0000:00:0d.3: BAR 2 [mem 0x603d1b9000-0x603d1b9fff 64bit]
[    0.701260] pci 0000:00:0d.3: supports D1 D2
[    0.701261] pci 0000:00:0d.3: PME# supported from D0 D1 D2 D3hot D3cold
[    0.701532] pci 0000:00:14.0: [8086:51ed] type 00 class 0x0c0330 conventional PCI endpoint
[    0.701555] pci 0000:00:14.0: BAR 0 [mem 0x603d180000-0x603d18ffff 64bit]
[    0.701655] pci 0000:00:14.0: PME# supported from D3hot D3cold
[    0.703595] pci 0000:00:14.2: [8086:51ef] type 00 class 0x050000 conventional PCI endpoint
[    0.703617] pci 0000:00:14.2: BAR 0 [mem 0x603d1b0000-0x603d1b3fff 64bit]
[    0.703631] pci 0000:00:14.2: BAR 2 [mem 0x603d1b8000-0x603d1b8fff 64bit]
[    0.703850] pci 0000:00:14.3: [8086:51f0] type 00 class 0x028000 PCIe Root Complex Integrated Endpoint
[    0.703912] pci 0000:00:14.3: BAR 0 [mem 0x603d1ac000-0x603d1affff 64bit]
[    0.707442] pci 0000:00:14.3: PME# supported from D0 D3hot D3cold
[    0.708349] pci 0000:00:15.0: [8086:51e8] type 00 class 0x0c8000 conventional PCI endpoint
[    0.709079] pci 0000:00:15.0: BAR 0 [mem 0x00000000-0x00000fff 64bit]
[    0.712769] pci 0000:00:15.1: [8086:51e9] type 00 class 0x0c8000 conventional PCI endpoint
[    0.713499] pci 0000:00:15.1: BAR 0 [mem 0x00000000-0x00000fff 64bit]
[    0.716748] pci 0000:00:16.0: [8086:51e0] type 00 class 0x078000 conventional PCI endpoint
[    0.716773] pci 0000:00:16.0: BAR 0 [mem 0x603d1b5000-0x603d1b5fff 64bit]
[    0.716868] pci 0000:00:16.0: PME# supported from D3hot
[    0.717491] pci 0000:00:17.0: [8086:51d3] type 00 class 0x010601 conventional PCI endpoint
[    0.717511] pci 0000:00:17.0: BAR 0 [mem 0x84700000-0x84701fff]
[    0.717522] pci 0000:00:17.0: BAR 1 [mem 0x84703000-0x847030ff]
[    0.717533] pci 0000:00:17.0: BAR 2 [io  0x3090-0x3097]
[    0.717543] pci 0000:00:17.0: BAR 3 [io  0x3080-0x3083]
[    0.717554] pci 0000:00:17.0: BAR 4 [io  0x3060-0x307f]
[    0.717564] pci 0000:00:17.0: BAR 5 [mem 0x84702000-0x847027ff]
[    0.717645] pci 0000:00:17.0: PME# supported from D3hot
[    0.718046] pci 0000:00:1d.0: [8086:51b0] type 01 class 0x060400 PCIe Root Port
[    0.718078] pci 0000:00:1d.0: PCI bridge to [bus 64]
[    0.718084] pci 0000:00:1d.0:   bridge window [mem 0x84400000-0x845fffff]
[    0.718173] pci 0000:00:1d.0: PME# supported from D0 D3hot D3cold
[    0.718212] pci 0000:00:1d.0: PTM enabled (root), 4ns granularity
[    0.718877] pci 0000:00:1d.2: [8086:51b2] type 01 class 0x060400 PCIe Root Port
[    0.718909] pci 0000:00:1d.2: PCI bridge to [bus 65]
[    0.718915] pci 0000:00:1d.2:   bridge window [mem 0x84200000-0x843fffff]
[    0.719004] pci 0000:00:1d.2: PME# supported from D0 D3hot D3cold
[    0.719043] pci 0000:00:1d.2: PTM enabled (root), 4ns granularity
[    0.719752] pci 0000:00:1f.0: [8086:5182] type 00 class 0x060100 conventional PCI endpoint
[    0.720154] pci 0000:00:1f.3: [8086:51c8] type 00 class 0x040100 conventional PCI endpoint
[    0.720216] pci 0000:00:1f.3: BAR 0 [mem 0x603d1a8000-0x603d1abfff 64bit]
[    0.720290] pci 0000:00:1f.3: BAR 4 [mem 0x603d000000-0x603d0fffff 64bit]
[    0.720451] pci 0000:00:1f.3: PME# supported from D3hot D3cold
[    0.721057] pci 0000:00:1f.4: [8086:51a3] type 00 class 0x0c0500 conventional PCI endpoint
[    0.721086] pci 0000:00:1f.4: BAR 0 [mem 0x603d1b4000-0x603d1b40ff 64bit]
[    0.721112] pci 0000:00:1f.4: BAR 4 [io  0xefa0-0xefbf]
[    0.721397] pci 0000:00:1f.5: [8086:51a4] type 00 class 0x0c8000 conventional PCI endpoint
[    0.721419] pci 0000:00:1f.5: BAR 0 [mem 0xfe010000-0xfe010fff]
[    0.722353] pci 0000:01:00.0: [15b7:5030] type 00 class 0x010802 PCIe Endpoint
[    0.722365] pci 0000:01:00.0: BAR 0 [mem 0x84600000-0x84603fff 64bit]
[    0.722554] pci 0000:00:06.0: PCI bridge to [bus 01]
[    0.722587] pci 0000:00:07.0: PCI bridge to [bus 02-39]
[    0.722619] pci 0000:00:07.2: PCI bridge to [bus 3a-63]
[    0.722800] pci 0000:64:00.0: [8086:15f3] type 00 class 0x020000 PCIe Endpoint
[    0.722819] pci 0000:64:00.0: BAR 0 [mem 0x84400000-0x844fffff]
[    0.722844] pci 0000:64:00.0: BAR 3 [mem 0x84500000-0x84503fff]
[    0.722977] pci 0000:64:00.0: PME# supported from D0 D3hot D3cold
[    0.723313] pci 0000:00:1d.0: PCI bridge to [bus 64]
[    0.723788] pci 0000:65:00.0: [8086:125c] type 00 class 0x020000 PCIe Endpoint
[    0.723806] pci 0000:65:00.0: BAR 0 [mem 0x84200000-0x842fffff]
[    0.723831] pci 0000:65:00.0: BAR 3 [mem 0x84300000-0x84303fff]
[    0.723963] pci 0000:65:00.0: PME# supported from D0 D3hot D3cold
[    0.724773] pci 0000:00:1d.2: PCI bridge to [bus 65]
[    0.731129] ACPI: PCI: Interrupt link LNKA configured for IRQ 0
[    0.731229] ACPI: PCI: Interrupt link LNKB configured for IRQ 1
[    0.731327] ACPI: PCI: Interrupt link LNKC configured for IRQ 0
[    0.731425] ACPI: PCI: Interrupt link LNKD configured for IRQ 0
[    0.731523] ACPI: PCI: Interrupt link LNKE configured for IRQ 0
[    0.731621] ACPI: PCI: Interrupt link LNKF configured for IRQ 0
[    0.731719] ACPI: PCI: Interrupt link LNKG configured for IRQ 0
[    0.731816] ACPI: PCI: Interrupt link LNKH configured for IRQ 0
[    1.109516] Low-power S0 idle used by default for system suspend
[    1.116947] ACPI: EC: interrupt unblocked
[    1.116948] ACPI: EC: event unblocked
[    1.116974] ACPI: EC: EC_CMD/EC_SC=0x66, EC_DATA=0x62
[    1.116975] ACPI: EC: GPE=0x6e
[    1.116977] ACPI: \_SB_.PC00.LPCB.EC0_: Boot DSDT EC initialization complete
[    1.116978] ACPI: \_SB_.PC00.LPCB.EC0_: EC: Used to handle transactions and events
[    1.117430] iommu: Default domain type: Translated
[    1.117430] iommu: DMA domain TLB invalidation policy: lazy mode
[    1.117501] SCSI subsystem initialized
[    1.117507] libata version 3.00 loaded.
[    1.117507] ACPI: bus type USB registered
[    1.117507] usbcore: registered new interface driver usbfs
[    1.117507] usbcore: registered new interface driver hub
[    1.117507] usbcore: registered new device driver usb
[    1.117507] EDAC MC: Ver: 3.0.0
[    1.120822] efivars: Registered efivars operations
[    1.120945] NetLabel: Initializing
[    1.120946] NetLabel:  domain hash size = 128
[    1.120947] NetLabel:  protocols = UNLABELED CIPSOv4 CALIPSO
[    1.120965] NetLabel:  unlabeled traffic allowed by default
[    1.120970] mctp: management component transport protocol core
[    1.120971] NET: Registered PF_MCTP protocol family
[    1.120974] PCI: Using ACPI for IRQ routing
[    1.188171] PCI: pci_cache_line_size set to 64 bytes
[    1.189575] pci 0000:00:1f.5: BAR 0 [mem 0xfe010000-0xfe010fff]: can't claim; no compatible bridge window
[    1.190227] e820: reserve RAM buffer [mem 0x0009e000-0x0009ffff]
[    1.190229] e820: reserve RAM buffer [mem 0x43ea7000-0x43ffffff]
[    1.190230] e820: reserve RAM buffer [mem 0x444e6000-0x47ffffff]
[    1.190231] e820: reserve RAM buffer [mem 0x4dd46000-0x4fffffff]
[    1.190232] e820: reserve RAM buffer [mem 0x5a800000-0x5bffffff]
[    1.190233] e820: reserve RAM buffer [mem 0x1097800000-0x1097ffffff]
[    1.190766] pci 0000:00:02.0: vgaarb: setting as boot VGA device
[    1.190766] pci 0000:00:02.0: vgaarb: bridge control possible
[    1.190766] pci 0000:00:02.0: vgaarb: VGA device added: decodes=io+mem,owns=io+mem,locks=none
[    1.190766] vgaarb: loaded
[    1.190802] clocksource: Switched to clocksource tsc-early
[    1.191172] VFS: Disk quotas dquot_6.6.0
[    1.191181] VFS: Dquot-cache hash table entries: 512 (order 0, 4096 bytes)
[    1.191242] pnp: PnP ACPI init
[    1.191703] system 00:00: [io  0x0a00-0x0a0f] has been reserved
[    1.191706] system 00:00: [io  0x0a10-0x0a2f] has been reserved
[    1.191707] system 00:00: [io  0x0a30-0x0a4f] has been reserved
[    1.191708] system 00:00: [io  0x0a50-0x0a6f] has been reserved
[    1.191709] system 00:00: [io  0x0a70-0x0a7f] has been reserved
[    1.191710] system 00:00: [io  0x0a80-0x0a8f] has been reserved
[    1.191832] system 00:01: [io  0x0680-0x069f] has been reserved
[    1.191834] system 00:01: [io  0x164e-0x164f] has been reserved
[    1.191943] system 00:02: [io  0x1854-0x1857] has been reserved
[    1.192669] pnp 00:03: disabling [mem 0xc0000000-0xcfffffff] because it overlaps 0000:00:02.0 BAR 9 [mem 0x00000000-0xdfffffff 64bit pref]
[    1.192693] system 00:03: [mem 0xfedc0000-0xfedc7fff] has been reserved
[    1.192694] system 00:03: [mem 0xfeda0000-0xfeda0fff] has been reserved
[    1.192696] system 00:03: [mem 0xfeda1000-0xfeda1fff] has been reserved
[    1.192697] system 00:03: [mem 0xfed20000-0xfed7ffff] could not be reserved
[    1.192698] system 00:03: [mem 0xfed90000-0xfed93fff] could not be reserved
[    1.192699] system 00:03: [mem 0xfed45000-0xfed8ffff] could not be reserved
[    1.192700] system 00:03: [mem 0xfee00000-0xfeefffff] could not be reserved
[    1.195625] system 00:04: [io  0x2000-0x20fe] has been reserved
[    1.196381] pnp: PnP ACPI: found 6 devices
[    1.201970] clocksource: acpi_pm: mask: 0xffffff max_cycles: 0xffffff, max_idle_ns: 2085701024 ns
[    1.202017] NET: Registered PF_INET protocol family
[    1.202177] IP idents hash table entries: 262144 (order: 9, 2097152 bytes, linear)
[    1.215397] tcp_listen_portaddr_hash hash table entries: 32768 (order: 7, 524288 bytes, linear)
[    1.215446] Table-perturb hash table entries: 65536 (order: 6, 262144 bytes, linear)
[    1.215777] TCP established hash table entries: 524288 (order: 10, 4194304 bytes, linear)
[    1.216299] TCP bind hash table entries: 65536 (order: 9, 2097152 bytes, linear)
[    1.216406] TCP: Hash tables configured (established 524288 bind 65536)
[    1.216608] MPTCP token hash table entries: 65536 (order: 8, 1572864 bytes, linear)
[    1.216758] UDP hash table entries: 32768 (order: 8, 1048576 bytes, linear)
[    1.216899] UDP-Lite hash table entries: 32768 (order: 8, 1048576 bytes, linear)
[    1.217011] NET: Registered PF_UNIX/PF_LOCAL protocol family
[    1.217017] NET: Registered PF_XDP protocol family
[    1.217024] pci 0000:00:07.0: bridge window [io  0x1000-0x0fff] to [bus 02-39] add_size 1000
[    1.217028] pci 0000:00:07.2: bridge window [io  0x1000-0x0fff] to [bus 3a-63] add_size 1000
[    1.217038] pci 0000:00:02.0: VF BAR 2 [mem 0x4020000000-0x40ffffffff 64bit pref]: assigned
[    1.217042] pci 0000:00:02.0: VF BAR 0 [mem 0x4010000000-0x4016ffffff 64bit]: assigned
[    1.217045] pci 0000:00:07.0: bridge window [io  0x4000-0x4fff]: assigned
[    1.217047] pci 0000:00:07.2: bridge window [io  0x5000-0x5fff]: assigned
[    1.217049] pci 0000:00:15.0: BAR 0 [mem 0x4017000000-0x4017000fff 64bit]: assigned
[    1.217395] pci 0000:00:15.1: BAR 0 [mem 0x4017001000-0x4017001fff 64bit]: assigned
[    1.217735] pci 0000:00:1f.5: BAR 0 [mem 0x68800000-0x68800fff]: assigned
[    1.217752] pci 0000:00:06.0: PCI bridge to [bus 01]
[    1.217777] pci 0000:00:06.0:   bridge window [mem 0x84600000-0x846fffff]
[    1.217810] pci 0000:00:07.0: PCI bridge to [bus 02-39]
[    1.217812] pci 0000:00:07.0:   bridge window [io  0x4000-0x4fff]
[    1.217814] pci 0000:00:07.0:   bridge window [mem 0x78000000-0x841fffff]
[    1.217817] pci 0000:00:07.0:   bridge window [mem 0x6020000000-0x603bffffff 64bit pref]
[    1.217820] pci 0000:00:07.2: PCI bridge to [bus 3a-63]
[    1.217821] pci 0000:00:07.2:   bridge window [io  0x5000-0x5fff]
[    1.217824] pci 0000:00:07.2:   bridge window [mem 0x6a000000-0x761fffff]
[    1.217826] pci 0000:00:07.2:   bridge window [mem 0x6000000000-0x601bffffff 64bit pref]
[    1.217830] pci 0000:00:1d.0: PCI bridge to [bus 64]
[    1.217848] pci 0000:00:1d.0:   bridge window [mem 0x84400000-0x845fffff]
[    1.217855] pci 0000:00:1d.2: PCI bridge to [bus 65]
[    1.217859] pci 0000:00:1d.2:   bridge window [mem 0x84200000-0x843fffff]
[    1.217867] pci_bus 0000:00: resource 4 [io  0x0000-0x0cf7 window]
[    1.217868] pci_bus 0000:00: resource 5 [io  0x0d00-0xffff window]
[    1.217869] pci_bus 0000:00: resource 6 [mem 0x000a0000-0x000bffff window]
[    1.217871] pci_bus 0000:00: resource 7 [mem 0x000e0000-0x000fffff window]
[    1.217872] pci_bus 0000:00: resource 8 [mem 0x68800000-0xbfffffff window]
[    1.217873] pci_bus 0000:00: resource 9 [mem 0x4000000000-0x7fffffffff window]
[    1.217874] pci_bus 0000:01: resource 1 [mem 0x84600000-0x846fffff]
[    1.217875] pci_bus 0000:02: resource 0 [io  0x4000-0x4fff]
[    1.217876] pci_bus 0000:02: resource 1 [mem 0x78000000-0x841fffff]
[    1.217877] pci_bus 0000:02: resource 2 [mem 0x6020000000-0x603bffffff 64bit pref]
[    1.217878] pci_bus 0000:3a: resource 0 [io  0x5000-0x5fff]
[    1.217879] pci_bus 0000:3a: resource 1 [mem 0x6a000000-0x761fffff]
[    1.217880] pci_bus 0000:3a: resource 2 [mem 0x6000000000-0x601bffffff 64bit pref]
[    1.217881] pci_bus 0000:64: resource 1 [mem 0x84400000-0x845fffff]
[    1.217883] pci_bus 0000:65: resource 1 [mem 0x84200000-0x843fffff]
[    1.219810] PCI: CLS 64 bytes, default 64
[    1.219841] DMAR: Intel-IOMMU force enabled due to platform opt in
[    1.219847] DMAR: No ATSR found
[    1.219848] DMAR: No SATC found
[    1.219849] DMAR: IOMMU feature fl1gp_support inconsistent
[    1.219850] DMAR: IOMMU feature pgsel_inv inconsistent
[    1.219851] DMAR: IOMMU feature nwfs inconsistent
[    1.219851] DMAR: IOMMU feature dit inconsistent
[    1.219852] DMAR: IOMMU feature sc_support inconsistent
[    1.219853] DMAR: IOMMU feature dev_iotlb_support inconsistent
[    1.219854] DMAR: dmar0: Using Queued invalidation
[    1.219857] DMAR: dmar1: Using Queued invalidation
[    1.219962] Trying to unpack rootfs image as initramfs...
[    1.220076] pci 0000:00:02.0: Adding to iommu group 0
[    1.220106] pci 0000:00:00.0: Adding to iommu group 1
[    1.220117] pci 0000:00:06.0: Adding to iommu group 2
[    1.220125] pci 0000:00:07.0: Adding to iommu group 3
[    1.220133] pci 0000:00:07.2: Adding to iommu group 4
[    1.220142] pci 0000:00:08.0: Adding to iommu group 5
[    1.220150] pci 0000:00:0a.0: Adding to iommu group 6
[    1.220165] pci 0000:00:0d.0: Adding to iommu group 7
[    1.220172] pci 0000:00:0d.2: Adding to iommu group 7
[    1.220178] pci 0000:00:0d.3: Adding to iommu group 7
[    1.220192] pci 0000:00:14.0: Adding to iommu group 8
[    1.220199] pci 0000:00:14.2: Adding to iommu group 8
[    1.220206] pci 0000:00:14.3: Adding to iommu group 9
[    1.220218] pci 0000:00:15.0: Adding to iommu group 10
[    1.220226] pci 0000:00:15.1: Adding to iommu group 10
[    1.220236] pci 0000:00:16.0: Adding to iommu group 11
[    1.220243] pci 0000:00:17.0: Adding to iommu group 12
[    1.220266] pci 0000:00:1d.0: Adding to iommu group 13
[    1.220282] pci 0000:00:1d.2: Adding to iommu group 14
[    1.220300] pci 0000:00:1f.0: Adding to iommu group 15
[    1.220308] pci 0000:00:1f.3: Adding to iommu group 15
[    1.220316] pci 0000:00:1f.4: Adding to iommu group 15
[    1.220323] pci 0000:00:1f.5: Adding to iommu group 15
[    1.220331] pci 0000:01:00.0: Adding to iommu group 16
[    1.220354] pci 0000:64:00.0: Adding to iommu group 17
[    1.220381] pci 0000:65:00.0: Adding to iommu group 18
[    1.220523] DMAR: Intel(R) Virtualization Technology for Directed I/O
[    1.220524] PCI-DMA: Using software bounce buffering for IO (SWIOTLB)
[    1.220525] software IO TLB: mapped [mem 0x00000000359f8000-0x00000000399f8000] (64MB)
[    1.220564] clocksource: tsc: mask: 0xffffffffffffffff max_cycles: 0x23fa772cf26, max_idle_ns: 440795269835 ns
[    1.220616] clocksource: Switched to clocksource tsc
[    1.220637] platform rtc_cmos: registered platform RTC device (no PNP device found)
[    1.227245] Initialise system trusted keyrings
[    1.227255] Key type blacklist registered
[    1.227295] workingset: timestamp_bits=41 max_order=24 bucket_order=0
[    1.227305] zbud: loaded
[    1.227417] fuse: init (API version 7.40)
[    1.227488] integrity: Platform Keyring initialized
[    1.227490] integrity: Machine keyring initialized
[    1.236155] Key type asymmetric registered
[    1.236158] Asymmetric key parser 'x509' registered
[    1.236181] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 246)
[    1.236262] io scheduler mq-deadline registered
[    1.236263] io scheduler kyber registered
[    1.236272] io scheduler bfq registered
[    1.236870] pcieport 0000:00:06.0: PME: Signaling with IRQ 122
[    1.237101] pcieport 0000:00:07.0: PME: Signaling with IRQ 123
[    1.237117] pcieport 0000:00:07.0: pciehp: Slot #3 AttnBtn- PwrCtrl- MRL- AttnInd- PwrInd- HotPlug+ Surprise+ Interlock- NoCompl+ IbPresDis- LLActRep+
[    1.237433] pcieport 0000:00:07.2: PME: Signaling with IRQ 124
[    1.237449] pcieport 0000:00:07.2: pciehp: Slot #5 AttnBtn- PwrCtrl- MRL- AttnInd- PwrInd- HotPlug+ Surprise+ Interlock- NoCompl+ IbPresDis- LLActRep+
[    1.237758] pcieport 0000:00:1d.0: PME: Signaling with IRQ 125
[    1.238027] pcieport 0000:00:1d.2: PME: Signaling with IRQ 126
[    1.238133] shpchp: Standard Hot Plug PCI Controller Driver version: 0.4
[    1.238900] input: Sleep Button as /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0E:00/input/input0
[    1.238922] ACPI: button: Sleep Button [SLPB]
[    1.238952] input: Power Button as /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0C:00/input/input1
[    1.238963] ACPI: button: Power Button [PWRB]
[    1.238982] input: Power Button as /devices/LNXSYSTM:00/LNXPWRBN:00/input/input2
[    1.239063] ACPI: button: Power Button [PWRF]
[    1.243545] thermal LNXTHERM:00: registered as thermal_zone0
[    1.243547] ACPI: thermal: Thermal Zone [TZ00] (54 C)
[    1.243835] Serial: 8250/16550 driver, 32 ports, IRQ sharing enabled
[    1.245729] hpet_acpi_add: no address or irqs in _CRS
[    1.245765] Non-volatile memory driver v1.3
[    1.245766] Linux agpgart interface v0.103
[    1.282118] ACPI: bus type drm_connector registered
[    1.283317] Freeing initrd memory: 106196K
[    1.284291] ahci 0000:00:17.0: version 3.0
[    1.284668] ahci 0000:00:17.0: AHCI vers 0001.0301, 32 command slots, 6 Gbps, SATA mode
[    1.284672] ahci 0000:00:17.0: 1/1 ports implemented (port mask 0x2)
[    1.284673] ahci 0000:00:17.0: flags: 64bit ncq sntf pm clo only pio slum part deso sadm sds 
[    1.285087] scsi host0: ahci
[    1.285169] scsi host1: ahci
[    1.285197] ata1: DUMMY
[    1.285212] ata2: SATA max UDMA/133 abar m2048 at 0x84702000 port 0x84702180 irq 127 lpm-pol 4
[    1.285284] usbcore: registered new interface driver usbserial_generic
[    1.285288] usbserial: USB Serial support registered for generic
[    1.285358] rtc_cmos rtc_cmos: RTC can wake from S4
[    1.287193] rtc_cmos rtc_cmos: registered as rtc0
[    1.287570] rtc_cmos rtc_cmos: setting system clock to 2024-09-17T15:43:43 UTC (1726587823)
[    1.287610] rtc_cmos rtc_cmos: alarms up to one month, y3k, 114 bytes nvram
[    1.288735] intel_pstate: Intel P-state driver initializing
[    1.290872] intel_pstate: HWP enabled
[    1.291430] ledtrig-cpu: registered to indicate activity on CPUs
[    1.291876] [drm] Initialized simpledrm 1.0.0 for simple-framebuffer.0 on minor 0
[    1.292353] fbcon: Deferring console take-over
[    1.292358] simple-framebuffer simple-framebuffer.0: [drm] fb0: simpledrmdrmfb frame buffer device
[    1.292419] hid: raw HID events driver (C) Jiri Kosina
[    1.292473] drop_monitor: Initializing network drop monitor service
[    1.292567] NET: Registered PF_INET6 protocol family
[    1.296692] Segment Routing with IPv6
[    1.296693] RPL Segment Routing with IPv6
[    1.296704] In-situ OAM (IOAM) with IPv6
[    1.296720] NET: Registered PF_PACKET protocol family
[    1.299178] ENERGY_PERF_BIAS: Set to 'normal', was 'performance'
[    1.299835] microcode: Current revision: 0x00000434
[    1.299839] microcode: Updated early from: 0x0000042a
[    1.300531] IPI shorthand broadcast: enabled
[    1.301773] sched_clock: Marking stable (1284914767, 15597475)->(1326242945, -25730703)
[    1.302178] registered taskstats version 1
[    1.303378] Loading compiled-in X.509 certificates
[    1.306147] Loaded X.509 cert 'Build time autogenerated kernel key: cb8a38269e411cf2cea941e3c19d1521412bd34d'
[    1.308962] zswap: loaded using pool zstd/zsmalloc
[    1.309007] Demotion targets for Node 0: null
[    1.309121] Key type .fscrypt registered
[    1.309121] Key type fscrypt-provisioning registered
[    1.309500] integrity: Loading X.509 certificate: UEFI:db
[    1.309544] integrity: Loaded X.509 cert 'Microsoft Corporation UEFI CA 2011: 13adbf4309bd82709c8cd54f316ed522988a1bd4'
[    1.309544] integrity: Loading X.509 certificate: UEFI:db
[    1.309551] integrity: Loaded X.509 cert 'Microsoft Windows Production PCA 2011: a92902398e16c49778cd90f99e4f9ae17c55af53'
[    1.309972] PM:   Magic number: 8:571:740
[    1.311885] RAS: Correctable Errors collector initialized.
[    1.599328] ata2: SATA link down (SStatus 4 SControl 300)
[    1.601308] clk: Disabling unused clocks
[    1.601325] PM: genpd: Disabling unused power domains
[    1.609973] Freeing unused decrypted memory: 2028K
[    1.610569] Freeing unused kernel image (initmem) memory: 3452K
[    1.610578] Write protecting the kernel read-only data: 32768k
[    1.611494] Freeing unused kernel image (rodata/data gap) memory: 820K
[    1.616342] x86/mm: Checked W+X mappings: passed, no W+X pages found.
[    1.616345] rodata_test: all tests were successful
[    1.616356] Run /init as init process
[    1.616357]   with arguments:
[    1.616357]     /init
[    1.616358]   with environment:
[    1.616358]     HOME=/
[    1.616359]     TERM=linux
[    1.738727] xhci_hcd 0000:00:0d.0: xHCI Host Controller
[    1.738738] xhci_hcd 0000:00:0d.0: new USB bus registered, assigned bus number 1
[    1.739793] xhci_hcd 0000:00:0d.0: hcc params 0x20007fc1 hci version 0x120 quirks 0x0000000200009810
[    1.740087] xhci_hcd 0000:00:0d.0: xHCI Host Controller
[    1.740090] xhci_hcd 0000:00:0d.0: new USB bus registered, assigned bus number 2
[    1.740093] xhci_hcd 0000:00:0d.0: Host supports USB 3.2 Enhanced SuperSpeed
[    1.740135] usb usb1: New USB device found, idVendor=1d6b, idProduct=0002, bcdDevice= 6.11
[    1.740139] usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[    1.740141] usb usb1: Product: xHCI Host Controller
[    1.740142] usb usb1: Manufacturer: Linux 6.11.0-rc7-00001-g0e2ad6528188-dirty xhci-hcd
[    1.740144] usb usb1: SerialNumber: 0000:00:0d.0
[    1.740282] hub 1-0:1.0: USB hub found
[    1.740289] hub 1-0:1.0: 1 port detected
[    1.740533] usb usb2: New USB device found, idVendor=1d6b, idProduct=0003, bcdDevice= 6.11
[    1.740535] usb usb2: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[    1.740537] usb usb2: Product: xHCI Host Controller
[    1.740538] usb usb2: Manufacturer: Linux 6.11.0-rc7-00001-g0e2ad6528188-dirty xhci-hcd
[    1.740539] usb usb2: SerialNumber: 0000:00:0d.0
[    1.740628] hub 2-0:1.0: USB hub found
[    1.740635] hub 2-0:1.0: 3 ports detected
[    1.741581] xhci_hcd 0000:00:14.0: xHCI Host Controller
[    1.741586] xhci_hcd 0000:00:14.0: new USB bus registered, assigned bus number 3
[    1.742720] xhci_hcd 0000:00:14.0: hcc params 0x20007fc1 hci version 0x120 quirks 0x0000100200009810
[    1.743083] xhci_hcd 0000:00:14.0: xHCI Host Controller
[    1.743087] xhci_hcd 0000:00:14.0: new USB bus registered, assigned bus number 4
[    1.743089] xhci_hcd 0000:00:14.0: Host supports USB 3.1 Enhanced SuperSpeed
[    1.743129] usb usb3: New USB device found, idVendor=1d6b, idProduct=0002, bcdDevice= 6.11
[    1.743131] usb usb3: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[    1.743132] usb usb3: Product: xHCI Host Controller
[    1.743133] usb usb3: Manufacturer: Linux 6.11.0-rc7-00001-g0e2ad6528188-dirty xhci-hcd
[    1.743134] usb usb3: SerialNumber: 0000:00:14.0
[    1.743239] hub 3-0:1.0: USB hub found
[    1.743267] hub 3-0:1.0: 12 ports detected
[    1.745297] usb usb4: New USB device found, idVendor=1d6b, idProduct=0003, bcdDevice= 6.11
[    1.745299] usb usb4: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[    1.745301] usb usb4: Product: xHCI Host Controller
[    1.745302] usb usb4: Manufacturer: Linux 6.11.0-rc7-00001-g0e2ad6528188-dirty xhci-hcd
[    1.745302] usb usb4: SerialNumber: 0000:00:14.0
[    1.745388] hub 4-0:1.0: USB hub found
[    1.745410] hub 4-0:1.0: 4 ports detected
[    1.761523] nvme 0000:01:00.0: platform quirk: setting simple suspend
[    1.761605] nvme nvme0: pci function 0000:01:00.0
[    1.791467] nvme nvme0: 16/0/0 default/read/poll queues
[    1.796102]  nvme0n1: p1 p2 p3
[    1.992401] usb 3-4: new high-speed USB device number 2 using xhci_hcd
[    2.134739] usb 3-4: New USB device found, idVendor=05e3, idProduct=0608, bcdDevice=88.32
[    2.134746] usb 3-4: New USB device strings: Mfr=0, Product=1, SerialNumber=0
[    2.134748] usb 3-4: Product: USB2.0 Hub
[    2.136254] hub 3-4:1.0: USB hub found
[    2.136751] hub 3-4:1.0: 4 ports detected
[    2.137612] usb: port power management may be unreliable
[    2.203731] usb 2-1: new SuperSpeed USB device number 2 using xhci_hcd
[    2.237657] usb 2-1: New USB device found, idVendor=045e, idProduct=0955, bcdDevice= 1.41
[    2.237662] usb 2-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[    2.237664] usb 2-1: Product: 4-Port USB 3.0 Hub
[    2.237665] usb 2-1: Manufacturer: Generic
[    2.245834] hub 2-1:1.0: USB hub found
[    2.247480] hub 2-1:1.0: 2 ports detected
[    2.255872] usb 4-1: new SuperSpeed USB device number 2 using xhci_hcd
[    2.275009] usb 4-1: New USB device found, idVendor=0e8d, idProduct=7961, bcdDevice= 1.00
[    2.275014] usb 4-1: New USB device strings: Mfr=6, Product=7, SerialNumber=8
[    2.275015] usb 4-1: Product: Wireless_Device
[    2.275017] usb 4-1: Manufacturer: MediaTek Inc.
[    2.275018] usb 4-1: SerialNumber: 000000000
[    2.395819] usb 3-6: new high-speed USB device number 3 using xhci_hcd
[    2.469827] i915 0000:00:02.0: [drm] Found ALDERLAKE_P (device ID 46a6) display version 13.00
[    2.470484] i915 0000:00:02.0: [drm] VT-d active for gfx access
[    2.526904] i915 0000:00:02.0: vgaarb: deactivate vga console
[    2.527166] i915 0000:00:02.0: [drm] Using Transparent Hugepages
[    2.529267] i915 0000:00:02.0: vgaarb: VGA decodes changed: olddecodes=io+mem,decodes=io+mem:owns=io+mem
[    2.534856] i915 0000:00:02.0: [drm] Finished loading DMC firmware i915/adlp_dmc.bin (v2.20)
[    2.535899] usb 2-1.1: new SuperSpeed USB device number 3 using xhci_hcd
[    2.557014] usb 3-6: New USB device found, idVendor=045e, idProduct=0957, bcdDevice= 1.41
[    2.557029] usb 3-6: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[    2.557035] usb 3-6: Product: 4-Port USB 2.0 Hub
[    2.557039] usb 3-6: Manufacturer: Generic
[    2.557797] usb 2-1.1: New USB device found, idVendor=045e, idProduct=0927, bcdDevice=31.00
[    2.557814] usb 2-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=6
[    2.557819] usb 2-1.1: Product: Ethernet Adapter
[    2.557823] usb 2-1.1: Manufacturer: Microsoft
[    2.557826] usb 2-1.1: SerialNumber: 0013DF804
[    2.561404] hub 3-6:1.0: USB hub found
[    2.563028] hub 3-6:1.0: 2 ports detected
[    2.645045] i915 0000:00:02.0: [drm] GT0: GuC firmware i915/adlp_guc_70.bin version 70.29.2
[    2.645051] i915 0000:00:02.0: [drm] GT0: HuC firmware i915/tgl_huc.bin version 7.9.3
[    2.659283] i915 0000:00:02.0: [drm] GT0: HuC: authenticated for all workloads
[    2.660460] i915 0000:00:02.0: [drm] GT0: GUC: submission enabled
[    2.660462] i915 0000:00:02.0: [drm] GT0: GUC: SLPC enabled
[    2.661015] i915 0000:00:02.0: [drm] GT0: GUC: RC enabled
[    2.662137] i915 0000:00:02.0: [drm] Protected Xe Path (PXP) protected content support initialized
[    2.689226] usb 3-7: new full-speed USB device number 4 using xhci_hcd
[    2.695739] [drm] Initialized i915 1.6.0 for 0000:00:02.0 on minor 1
[    2.698285] ACPI: video: Video Device [GFX0] (multi-head: yes  rom: no  post: no)
[    2.699207] input: Video Bus as /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/LNXVIDEO:00/input/input3
[    2.737465] fbcon: i915drmfb (fb0) is primary device
[    2.737467] fbcon: Deferring console take-over
[    2.737468] i915 0000:00:02.0: [drm] fb0: i915drmfb frame buffer device
[    2.835767] usb 3-7: New USB device found, idVendor=045e, idProduct=0800, bcdDevice= 9.34
[    2.835772] usb 3-7: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[    2.835773] usb 3-7: Product: Microsoft? Nano Transceiver v2.0
[    2.835775] usb 3-7: Manufacturer: Microsoft
[    2.857652] usbcore: registered new interface driver usbhid
[    2.857654] usbhid: USB HID core driver
[    2.862052] input: Microsoft Microsoft? Nano Transceiver v2.0 as /devices/pci0000:00/0000:00:14.0/usb3/3-7/3-7:1.0/0003:045E:0800.0001/input/input4
[    2.965962] hid-generic 0003:045E:0800.0001: input,hidraw0: USB HID v1.11 Keyboard [Microsoft Microsoft? Nano Transceiver v2.0] on usb-0000:00:14.0-7/input0
[    2.968229] input: Microsoft Microsoft? Nano Transceiver v2.0 Mouse as /devices/pci0000:00/0000:00:14.0/usb3/3-7/3-7:1.1/0003:045E:0800.0002/input/input5
[    2.968393] input: Microsoft Microsoft? Nano Transceiver v2.0 Consumer Control as /devices/pci0000:00/0000:00:14.0/usb3/3-7/3-7:1.1/0003:045E:0800.0002/input/input6
[    2.968554] hid-generic 0003:045E:0800.0002: input,hidraw1: USB HID v1.11 Mouse [Microsoft Microsoft? Nano Transceiver v2.0] on usb-0000:00:14.0-7/input1
[    2.968700] input: Microsoft Microsoft? Nano Transceiver v2.0 Consumer Control as /devices/pci0000:00/0000:00:14.0/usb3/3-7/3-7:1.2/0003:045E:0800.0003/input/input7
[    3.022596] input: Microsoft Microsoft? Nano Transceiver v2.0 System Control as /devices/pci0000:00/0000:00:14.0/usb3/3-7/3-7:1.2/0003:045E:0800.0003/input/input9
[    3.022920] hid-generic 0003:045E:0800.0003: input,hiddev96,hidraw2: USB HID v1.11 Device [Microsoft Microsoft? Nano Transceiver v2.0] on usb-0000:00:14.0-7/input2
[    3.175304] PM: Image not found (code -22)
[    3.196942] fbcon: Taking over console
[    3.209556] Console: switching to colour frame buffer device 240x67
[    3.308676] EXT4-fs (nvme0n1p2): mounted filesystem 0420afc7-4947-4e2e-a096-b607b8b7fd93 r/w with ordered data mode. Quota mode: none.
[    3.367761] systemd[1]: systemd 256.6-1-arch running in system mode (+PAM +AUDIT -SELINUX -APPARMOR -IMA +SMACK +SECCOMP +GCRYPT +GNUTLS +OPENSSL +ACL +BLKID +CURL +ELFUTILS +FIDO2 +IDN2 -IDN +IPTC +KMOD +LIBCRYPTSETUP +LIBCRYPTSETUP_PLUGINS +LIBFDISK +PCRE2 +PWQUALITY +P11KIT +QRENCODE +TPM2 +BZIP2 +LZ4 +XZ +ZLIB +ZSTD +BPF_FRAMEWORK +XKBCOMMON +UTMP -SYSVINIT +LIBARCHIVE)
[    3.367765] systemd[1]: Detected architecture x86-64.
[    3.368553] systemd[1]: Hostname set to <mdp-archnuc>.
[    3.611164] systemd[1]: bpf-restrict-fs: LSM BPF program attached
[    3.699797] systemd[1]: Queued start job for default target Graphical Interface.
[    3.753107] systemd[1]: Created slice Slice /system/dirmngr.
[    3.753888] systemd[1]: Created slice Slice /system/getty.
[    3.754461] systemd[1]: Created slice Slice /system/gpg-agent.
[    3.755011] systemd[1]: Created slice Slice /system/gpg-agent-browser.
[    3.755524] systemd[1]: Created slice Slice /system/gpg-agent-extra.
[    3.755998] systemd[1]: Created slice Slice /system/gpg-agent-ssh.
[    3.756450] systemd[1]: Created slice Slice /system/keyboxd.
[    3.756684] systemd[1]: Created slice Slice /system/modprobe.
[    3.756803] systemd[1]: Created slice Slice /system/systemd-fsck.
[    3.756872] systemd[1]: Created slice User and Session Slice.
[    3.756893] systemd[1]: Started Dispatch Password Requests to Console Directory Watch.
[    3.756908] systemd[1]: Started Forward Password Requests to Wall Directory Watch.
[    3.756982] systemd[1]: Set up automount Arbitrary Executable File Formats File System Automount Point.
[    3.756989] systemd[1]: Expecting device /dev/disk/by-uuid/EF7B-A70B...
[    3.756993] systemd[1]: Expecting device /dev/disk/by-uuid/efa73f2d-495d-448d-a0f0-dd425258b7e5...
[    3.756999] systemd[1]: Reached target Local Encrypted Volumes.
[    3.757005] systemd[1]: Reached target Login Prompts.
[    3.757011] systemd[1]: Reached target Local Integrity Protected Volumes.
[    3.757020] systemd[1]: Reached target Path Units.
[    3.757027] systemd[1]: Reached target Remote File Systems.
[    3.757031] systemd[1]: Reached target Slice Units.
[    3.757043] systemd[1]: Reached target Local Verity Protected Volumes.
[    3.757076] systemd[1]: Listening on Device-mapper event daemon FIFOs.
[    3.760193] systemd[1]: Listening on Process Core Dump Socket.
[    3.760919] systemd[1]: Listening on Credential Encryption/Decryption.
[    3.761003] systemd[1]: Listening on Journal Socket (/dev/log).
[    3.761058] systemd[1]: Listening on Journal Sockets.
[    3.761093] systemd[1]: TPM PCR Measurements was skipped because of an unmet condition check (ConditionSecurity=measured-uki).
[    3.761109] systemd[1]: Make TPM PCR Policy was skipped because of an unmet condition check (ConditionSecurity=measured-uki).
[    3.761165] systemd[1]: Listening on udev Control Socket.
[    3.761202] systemd[1]: Listening on udev Kernel Socket.
[    3.762311] systemd[1]: Mounting Huge Pages File System...
[    3.763074] systemd[1]: Mounting POSIX Message Queue File System...
[    3.763792] systemd[1]: Mounting Kernel Debug File System...
[    3.764350] systemd[1]: Mounting Kernel Trace File System...
[    3.765317] systemd[1]: Starting Create List of Static Device Nodes...
[    3.766158] systemd[1]: Starting Load Kernel Module configfs...
[    3.766682] systemd[1]: Starting Load Kernel Module dm_mod...
[    3.767934] systemd[1]: Starting Load Kernel Module drm...
[    3.769088] systemd[1]: Starting Load Kernel Module fuse...
[    3.770335] systemd[1]: Starting Load Kernel Module loop...
[    3.770384] systemd[1]: File System Check on Root Device was skipped because of an unmet condition check (ConditionPathIsReadWrite=!/).
[    3.770425] systemd[1]: Clear Stale Hibernate Storage Info was skipped because of an unmet condition check (ConditionPathExists=/sys/firmware/efi/efivars/HibernateLocation-8cf2644b-4b0b-428f-9387-6d876050dc67).
[    3.772057] systemd[1]: Starting Journal Service...
[    3.772971] systemd[1]: Starting Load Kernel Modules...
[    3.772986] systemd[1]: TPM PCR Machine ID Measurement was skipped because of an unmet condition check (ConditionSecurity=measured-uki).
[    3.773641] systemd[1]: Starting Remount Root and Kernel File Systems...
[    3.773677] systemd[1]: Early TPM SRK Setup was skipped because of an unmet condition check (ConditionSecurity=measured-uki).
[    3.774224] systemd[1]: Starting Load udev Rules from Credentials...
[    3.774948] systemd[1]: Starting Coldplug All udev Devices...
[    3.777379] systemd[1]: Mounted Huge Pages File System.
[    3.777453] systemd[1]: Mounted POSIX Message Queue File System.
[    3.777510] systemd[1]: Mounted Kernel Debug File System.
[    3.777561] systemd[1]: Mounted Kernel Trace File System.
[    3.777759] systemd[1]: Finished Create List of Static Device Nodes.
[    3.777978] systemd[1]: modprobe at configfs.service: Deactivated successfully.
[    3.778112] systemd[1]: Finished Load Kernel Module configfs.
[    3.778286] systemd[1]: modprobe at drm.service: Deactivated successfully.
[    3.778411] systemd[1]: Finished Load Kernel Module drm.
[    3.778575] systemd[1]: modprobe at fuse.service: Deactivated successfully.
[    3.778688] systemd[1]: Finished Load Kernel Module fuse.
[    3.779305] systemd[1]: Mounting FUSE Control File System...
[    3.780063] systemd[1]: Mounting Kernel Configuration File System...
[    3.780929] systemd[1]: Starting Create Static Device Nodes in /dev gracefully...
[    3.782976] systemd[1]: Finished Load udev Rules from Credentials.
[    3.783391] loop: module loaded
[    3.784044] systemd[1]: modprobe at loop.service: Deactivated successfully.
[    3.784330] systemd[1]: Finished Load Kernel Module loop.
[    3.785492] systemd[1]: Mounted FUSE Control File System.
[    3.785629] systemd[1]: Mounted Kernel Configuration File System.
[    3.785810] systemd-journald[395]: Collecting audit messages is disabled.
[    3.798212] i2c_dev: i2c /dev entries driver
[    3.799115] systemd[1]: Finished Load Kernel Modules.
[    3.799850] systemd[1]: Starting Apply Kernel Variables...
[    3.799991] device-mapper: uevent: version 1.0.3
[    3.800058] device-mapper: ioctl: 4.48.0-ioctl (2023-03-01) initialised: dm-devel at lists.linux.dev
[    3.800371] systemd[1]: modprobe at dm_mod.service: Deactivated successfully.
[    3.800462] systemd[1]: Finished Load Kernel Module dm_mod.
[    3.800633] systemd[1]: Repartition Root Disk was skipped because no trigger condition checks were met.
[    3.805467] systemd[1]: Finished Create Static Device Nodes in /dev gracefully.
[    3.806389] systemd[1]: Finished Apply Kernel Variables.
[    3.806887] systemd[1]: Started Journal Service.
[    3.832625] EXT4-fs (nvme0n1p2): re-mounted 0420afc7-4947-4e2e-a096-b607b8b7fd93 r/w. Quota mode: none.
[    3.840126] systemd-journald[395]: Received client request to flush runtime journal.
[    3.843896] Adding 67108860k swap on /swapfile.  Priority:-2 extents:86 across:334987260k SS
[    3.946711] mc: Linux media interface: v0.10
[    3.950655] mousedev: PS/2 mouse device common for all mice
[    3.971833] resource: resource sanity check: requesting [mem 0x00000000fedc0000-0x00000000fedcffff], which spans more than pnp 00:03 [mem 0xfedc0000-0xfedc7fff]
[    3.971839] caller igen6_probe+0x15e/0x7c0 [igen6_edac] mapping multiple BARs
[    3.975353] EDAC MC0: Giving out device to module igen6_edac controller Intel_client_SoC MC#0: DEV 0000:00:00.0 (INTERRUPT)
[    3.975402] EDAC MC1: Giving out device to module igen6_edac controller Intel_client_SoC MC#1: DEV 0000:00:00.0 (INTERRUPT)
[    3.975427] EDAC igen6 MC0: HANDLING IBECC MEMORY ERROR
[    3.975428] EDAC igen6 MC0: ADDR 0x7fffffffe0 
[    3.975454] intel_pmc_core INT33A1:00:  initialized
[    3.975552] EDAC igen6 MC1: HANDLING IBECC MEMORY ERROR
[    3.975556] EDAC igen6 MC1: ADDR 0x7fffffffe0 
[    3.976644] EDAC igen6: v2.5.1
[    3.985687] videodev: Linux video capture interface: v2.00
[    3.985762] pps_core: LinuxPPS API ver. 1 registered
[    3.985765] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <giometti at linux.it>
[    3.988981] input: PC Speaker as /devices/platform/pcspkr/input/input10
[    3.996243] PTP clock support registered
[    3.999181] mei_me 0000:00:16.0: enabling device (0000 -> 0002)
[    4.000730] i801_smbus 0000:00:1f.4: enabling device (0000 -> 0003)
[    4.001128] i801_smbus 0000:00:1f.4: SPD Write Disable is set
[    4.001184] i801_smbus 0000:00:1f.4: SMBus using PCI interrupt
[    4.004969] i2c i2c-13: Successfully instantiated SPD at 0x50
[    4.008414] intel-lpss 0000:00:15.0: enabling device (0004 -> 0006)
[    4.008861] idma64 idma64.0: Found Intel integrated DMA 64-bit
[    4.027139] Serial bus multi instantiate pseudo device driver INT3515:00: error -ENXIO: IRQ index 1 not found
[    4.027145] Serial bus multi instantiate pseudo device driver INT3515:00: error -ENXIO: Error requesting irq at index 1
[    4.029512] ACPI: bus type thunderbolt registered
[    4.032631] Intel(R) 2.5G Ethernet Linux Driver
[    4.032634] Copyright(c) 2018 Intel Corporation.
[    4.032751] igc 0000:64:00.0: enabling device (0000 -> 0002)
[    4.033014] igc 0000:64:00.0: PTM enabled, 4ns granularity
[    4.038479] intel-lpss 0000:00:15.1: enabling device (0004 -> 0006)
[    4.038818] idma64 idma64.1: Found Intel integrated DMA 64-bit
[    4.047090] Creating 1 MTD partitions on "0000:00:1f.5":
[    4.047094] 0x000000000000-0x000002000000 : "BIOS"
[    4.079742] pps pps0: new PPS source ptp0
[    4.079786] igc 0000:64:00.0 (unnamed net_device) (uninitialized): PHC added
[    4.082583] RAPL PMU: API unit is 2^-32 Joules, 4 fixed counters, 655360 ms ovfl timer
[    4.082586] RAPL PMU: hw unit of domain pp0-core 2^-14 Joules
[    4.082588] RAPL PMU: hw unit of domain package 2^-14 Joules
[    4.082588] RAPL PMU: hw unit of domain pp1-gpu 2^-14 Joules
[    4.082589] RAPL PMU: hw unit of domain psys 2^-14 Joules
[    4.083350] usbcore: registered new device driver r8152-cfgselector
[    4.107228] cryptd: max_cpu_qlen set to 1000
[    4.107196] mei_hdcp 0000:00:16.0-b638ab7e-94e2-4ea2-a552-d1c54b627f04: bound 0000:00:02.0 (ops i915_hdcp_ops [i915])
[    4.107949] mei_pxp 0000:00:16.0-fbf6fcf1-96cf-4e2e-a6a6-1bab8cbe36b1: bound 0000:00:02.0 (ops i915_pxp_tee_component_ops [i915])
[    4.109214] ee1004 13-0050: 512 byte EE1004-compliant SPD EEPROM, read-only
[    4.172477] r8152-cfgselector 2-1.1: reset SuperSpeed USB device number 3 using xhci_hcd
[    4.187010] Bluetooth: Core ver 2.22
[    4.187025] NET: Registered PF_BLUETOOTH protocol family
[    4.187026] Bluetooth: HCI device and connection manager initialized
[    4.187032] Bluetooth: HCI socket layer initialized
[    4.187034] Bluetooth: L2CAP socket layer initialized
[    4.187036] Bluetooth: SCO socket layer initialized
[    4.191558] igc 0000:64:00.0: 4.000 Gb/s available PCIe bandwidth (5.0 GT/s PCIe x1 link)
[    4.191562] igc 0000:64:00.0 eth0: MAC: XX:XX:XX:XX:XX:XX
[    4.191837] cfg80211: Loading compiled-in X.509 certificates for regulatory database
[    4.191998] igc 0000:65:00.0: enabling device (0000 -> 0002)
[    4.192549] igc 0000:65:00.0: PTM enabled, 4ns granularity
[    4.193238] AES CTR mode by8 optimization enabled
[    4.194837] Loaded X.509 cert 'sforshee: 00b28ddf47aef9cea7'
[    4.195017] Loaded X.509 cert 'wens: 61c038651aabdcf94bd0ac7ff06c7248db18c600'
[    4.214394] snd_hda_intel 0000:00:1f.3: enabling device (0000 -> 0002)
[    4.214598] snd_hda_intel 0000:00:1f.3: bound 0000:00:02.0 (ops i915_audio_component_bind_ops [i915])
[    4.223182] usbcore: registered new interface driver btusb
[    4.224896] Bluetooth: hci0: HW/SW Version: 0x008a008a, Build Time: 20240826151221
[    4.243090] pps pps1: new PPS source ptp1
[    4.243291] igc 0000:65:00.0 (unnamed net_device) (uninitialized): PHC added
[    4.245647] r8152 2-1.1:1.0 eth1: v1.12.13
[    4.245683] usbcore: registered new interface driver r8152
[    4.261881] usbcore: registered new interface driver cdc_ether
[    4.272727] snd_hda_codec_realtek hdaudioC0D0: autoconfig for ALC269VB: line_outs=1 (0x21/0x0/0x0/0x0/0x0) type:hp
[    4.272733] snd_hda_codec_realtek hdaudioC0D0:    speaker_outs=0 (0x0/0x0/0x0/0x0/0x0)
[    4.272735] snd_hda_codec_realtek hdaudioC0D0:    hp_outs=0 (0x0/0x0/0x0/0x0/0x0)
[    4.272737] snd_hda_codec_realtek hdaudioC0D0:    mono: mono_out=0x0
[    4.272738] snd_hda_codec_realtek hdaudioC0D0:    inputs:
[    4.272739] snd_hda_codec_realtek hdaudioC0D0:      Mic=0x18
[    4.283158] igc 0000:65:00.0: 4.000 Gb/s available PCIe bandwidth (5.0 GT/s PCIe x1 link)
[    4.283163] igc 0000:65:00.0 eth2: MAC: XX:XX:XX:XX:XX:XX
[    4.285711] igc 0000:64:00.0 enp100s0: renamed from eth0
[    4.303471] Intel(R) Wireless WiFi driver for Linux
[    4.303618] iwlwifi 0000:00:14.3: enabling device (0000 -> 0002)
[    4.306032] iwlwifi 0000:00:14.3: Detected crf-id 0x400410, cnv-id 0x80400 wfpm id 0x80000020
[    4.306074] iwlwifi 0000:00:14.3: PCI dev 51f0/0094, rev=0x370, rfid=0x2010d000
[    4.306077] iwlwifi 0000:00:14.3: Detected Intel(R) Wi-Fi 6E AX211 160MHz
[    4.310525] iwlwifi 0000:00:14.3: TLV_FW_FSEQ_VERSION: FSEQ Version: 0.0.2.42
[    4.310859] iwlwifi 0000:00:14.3: loaded firmware version 89.202a2f7b.0 so-a0-gf-a0-89.ucode op_mode iwlmvm
[    4.317505] r8152 2-1.1:1.0 enp0s13f0u1u1: renamed from eth1
[    4.317848] igc 0000:65:00.0 enp101s0: renamed from eth2
[    4.326705] input: HDA Intel PCH Mic as /devices/pci0000:00/0000:00:1f.3/sound/card0/input11
[    4.326777] input: HDA Intel PCH Headphone as /devices/pci0000:00/0000:00:1f.3/sound/card0/input12
[    4.326832] input: HDA Intel PCH HDMI/DP,pcm=3 as /devices/pci0000:00/0000:00:1f.3/sound/card0/input13
[    4.326873] input: HDA Intel PCH HDMI/DP,pcm=7 as /devices/pci0000:00/0000:00:1f.3/sound/card0/input14
[    4.326939] input: HDA Intel PCH HDMI/DP,pcm=8 as /devices/pci0000:00/0000:00:1f.3/sound/card0/input15
[    4.326994] input: HDA Intel PCH HDMI/DP,pcm=9 as /devices/pci0000:00/0000:00:1f.3/sound/card0/input16
[    4.430414] intel_tcc_cooling: TCC Offset locked
[    4.555399] intel_rapl_msr: PL4 support detected.
[    4.555425] intel_rapl_common: Found RAPL domain package
[    4.555428] intel_rapl_common: Found RAPL domain core
[    4.555429] intel_rapl_common: Found RAPL domain uncore
[    4.555431] intel_rapl_common: Found RAPL domain psys
[    4.613360] iwlwifi 0000:00:14.3: WFPM_UMAC_PD_NOTIFICATION: 0x20
[    4.613411] iwlwifi 0000:00:14.3: WFPM_LMAC2_PD_NOTIFICATION: 0x1f
[    4.613418] iwlwifi 0000:00:14.3: WFPM_AUTH_KEY_0: 0x90
[    4.613426] iwlwifi 0000:00:14.3: CNVI_SCU_SEQ_DATA_DW9: 0x0
[    4.613723] iwlwifi 0000:00:14.3: loaded PNVM version 35148b80
[    4.614836] iwlwifi 0000:00:14.3: RFIm is deactivated, reason = 4
[    4.630016] iwlwifi 0000:00:14.3: Detected RF GF, rfid=0x2010d000
[    4.700769] iwlwifi 0000:00:14.3: base HW address: XX:XX:XX:XX:XX:XX
[    4.833421] iwlwifi 0000:00:14.3 wlo1: renamed from wlan0
[    5.452456] EXT4-fs (nvme0n1p3): mounted filesystem efa73f2d-495d-448d-a0f0-dd425258b7e5 r/w with ordered data mode. Quota mode: none.
[    5.661641] Bluetooth: BNEP (Ethernet Emulation) ver 1.3
[    5.661644] Bluetooth: BNEP filters: protocol multicast
[    5.661647] Bluetooth: BNEP socket layer initialized
[    5.925867] iwlwifi 0000:00:14.3: WFPM_UMAC_PD_NOTIFICATION: 0x20
[    5.925877] iwlwifi 0000:00:14.3: WFPM_LMAC2_PD_NOTIFICATION: 0x1f
[    5.925885] iwlwifi 0000:00:14.3: WFPM_AUTH_KEY_0: 0x90
[    5.925893] iwlwifi 0000:00:14.3: CNVI_SCU_SEQ_DATA_DW9: 0x0
[    5.927244] iwlwifi 0000:00:14.3: RFIm is deactivated, reason = 4
[    6.019702] iwlwifi 0000:00:14.3: Registered PHC clock: iwlwifi-PTP, with index: 2
[    6.248772] iwlwifi 0000:00:14.3: WFPM_UMAC_PD_NOTIFICATION: 0x20
[    6.248782] iwlwifi 0000:00:14.3: WFPM_LMAC2_PD_NOTIFICATION: 0x1f
[    6.248790] iwlwifi 0000:00:14.3: WFPM_AUTH_KEY_0: 0x90
[    6.248798] iwlwifi 0000:00:14.3: CNVI_SCU_SEQ_DATA_DW9: 0x0
[    6.250128] iwlwifi 0000:00:14.3: RFIm is deactivated, reason = 4
[    7.025262] Bluetooth: hci0: Device setup in 2736415 usecs
[    7.025270] Bluetooth: hci0: HCI Enhanced Setup Synchronous Connection command is advertised, but not supported.
[    7.466021] usbcore: registered new interface driver option
[    7.466030] usbserial: USB Serial support registered for GSM modem (1-port)
[    8.318933] Bluetooth: hci0: Mediatek coredump end
[    8.566804] igc 0000:64:00.0 enp100s0: NIC Link is Up 1000 Mbps Full Duplex, Flow Control: RX
[    9.199113] Bluetooth: hci0: Mediatek coredump end
[    9.209081] Bluetooth: hci0: Opcode 0x0c03 failed: -110
[   11.342488] Bluetooth: hci0: Failed to read MSFT supported features (-110)
[   13.455279] block nvme0n1: No UUID available providing old NGUID
[   13.478988] Bluetooth: hci0: AOSP get vendor capabilities (-110)
[   16.117052] wlo1: regulatory prevented using AP config, downgraded
[   16.123049] wlo1: authenticate with XX:XX:XX:XX:XX:XX (local address=XX:XX:XX:XX:XX:XX)
[   16.124244] wlo1: send auth to XX:XX:XX:XX:XX:XX (try 1/3)
[   16.166021] wlo1: authenticated
[   16.172421] wlo1: associate with XX:XX:XX:XX:XX:XX (try 1/3)
[   16.174455] wlo1: RX AssocResp from XX:XX:XX:XX:XX:XX (capab=0x111 status=0 aid=1)
[   16.184782] wlo1: associated
[   16.246848] wlo1: Limiting TX power to 23 (26 - 3) dBm as advertised by XX:XX:XX:XX:XX:XX
[   17.488650] warning: `ThreadPoolForeg' uses wireless extensions which will stop working for Wi-Fi 7 hardware; use nl80211
[   17.531765] platform INT3515:01: deferred probe pending: Serial bus multi instantiate pseudo device driver: Error creating i2c-client, idx 0
[   17.531769] platform INT3515:02: deferred probe pending: Serial bus multi instantiate pseudo device driver: Error creating i2c-client, idx 0
[   18.595698] usb 4-1: Disable of device-initiated U1 failed.
[   23.715878] usb 4-1: Disable of device-initiated U2 failed.
[   33.956071] Bluetooth: hci0: Failed to write uhw reg(-110)
[   33.956138] usb 4-1: Disable of device-initiated U2 failed.
[   39.293677] xhci_hcd 0000:00:14.0: Timeout while waiting for setup device command
[   44.634497] xhci_hcd 0000:00:14.0: Timeout while waiting for setup device command
[   44.841067] usb 4-1: device not accepting address 2, error -62
[   50.186371] xhci_hcd 0000:00:14.0: Timeout while waiting for setup device command
[   55.523585] xhci_hcd 0000:00:14.0: Timeout while waiting for setup device command
[   55.729841] usb 4-1: device not accepting address 2, error -62
[   61.072634] xhci_hcd 0000:00:14.0: Timeout while waiting for setup device command
[   66.407700] xhci_hcd 0000:00:14.0: Timeout while waiting for setup device command
[   66.614207] usb 4-1: device not accepting address 2, error -62
[   71.955541] xhci_hcd 0000:00:14.0: Timeout while waiting for setup device command
[   77.289925] xhci_hcd 0000:00:14.0: Timeout while waiting for setup device command
[   77.496512] usb 4-1: device not accepting address 2, error -62
[   77.513500] usb 4-1: USB disconnect, device number 2
[   82.837128] xhci_hcd 0000:00:14.0: Timeout while waiting for setup device command
[   88.171049] xhci_hcd 0000:00:14.0: Timeout while waiting for setup device command
[   88.377554] usb 4-1: device not accepting address 3, error -62
[   93.718045] xhci_hcd 0000:00:14.0: Timeout while waiting for setup device command
[   99.051387] xhci_hcd 0000:00:14.0: Timeout while waiting for setup device command
[   99.258078] usb 4-1: device not accepting address 4, error -62
[   99.266739] usb usb4-port1: attempt power cycle
[  106.518206] xhci_hcd 0000:00:14.0: Timeout while waiting for setup device command
[  111.851387] xhci_hcd 0000:00:14.0: Timeout while waiting for setup device command
[  112.057840] usb 4-1: device not accepting address 5, error -62
[  117.397862] xhci_hcd 0000:00:14.0: Timeout while waiting for setup device command
[  122.732729] xhci_hcd 0000:00:14.0: Timeout while waiting for setup device command
[  122.937708] usb 4-1: device not accepting address 6, error -62
[  122.944587] usb usb4-port1: unable to enumerate USB device



> 
> >  	 
> > External email : Please do not click links or open attachments until
> > you have verified the sender or the content.
> >  Hi,
> > 
> > The 22/08/2024 13:23, Hao Qin wrote:
> > > Remove resetting mt7921 before downloading the fw, as it may cause
> > > command timeout when performing the reset.
> > > 
> > > Signed-off-by: Hao Qin <hao.qin at mediatek.com>
> > > ---
> > >  drivers/bluetooth/btmtk.c | 4 ++--
> > >  1 file changed, 2 insertions(+), 2 deletions(-)
> > > 
> > > diff --git a/drivers/bluetooth/btmtk.c b/drivers/bluetooth/btmtk.c
> > > index 2b7c80043aa2..a46f70135cbd 100644
> > > --- a/drivers/bluetooth/btmtk.c
> > > +++ b/drivers/bluetooth/btmtk.c
> > > @@ -1326,7 +1326,6 @@ int btmtk_usb_setup(struct hci_dev *hdev)
> > >  fwname = FIRMWARE_MT7668;
> > >  break;
> > >  case 0x7922:
> > > -case 0x7961:
> > >  case 0x7925:
> > >  /* Reset the device to ensure it's in the initial state before
> > >   * downloading the firmware to ensure.
> > > @@ -1334,7 +1333,8 @@ int btmtk_usb_setup(struct hci_dev *hdev)
> > >  
> > >  if (!test_bit(BTMTK_FIRMWARE_LOADED, &btmtk_data->flags))
> > >  btmtk_usb_subsys_reset(hdev, dev_id);
> > > -
> > > +fallthrough;
> > > +case 0x7961:
> > >  btmtk_fw_get_filename(fw_bin_name, sizeof(fw_bin_name), dev_id,
> > >        fw_version, fw_flavor);
> > >  
> > > -- 
> > > 2.18.0
> > > 
> > 
> > [Original regression report
> > 
> https://lore.kernel.org/linux-bluetooth/ZsTh7Jyug7MbZsLE at mdpsys.co.uk/
> > ]
> > 
> > Thanks for the patch, I have tested it on top of v6.11-rc7 and can
> > confirm
> > that it resolves the initial command timeout issue.
> > 
> > Unfortunately, when using the latest firmware version 20240826151221
> > from the
> > linux-firmware repo I'm still seeing "Mediatek coredump end" errors
> > followed by MSFT and AOSP errors. The device then appears
> > unresponsive
> > and the kernel eventually gives up attempting to enumerate:
> > 
> > [  230.042936] usb 4-3.2: new SuperSpeed USB device number 4 using
> > xhci_hcd
> > [  230.065228] usb 4-3.2: New USB device found, idVendor=0e8d,
> > idProduct=7961, bcdDevice= 1.00
> > [  230.065237] usb 4-3.2: New USB device strings: Mfr=6, Product=7,
> > SerialNumber=8
> > [  230.065240] usb 4-3.2: Product: Wireless_Device
> > [  230.065242] usb 4-3.2: Manufacturer: MediaTek Inc.
> > [  230.065245] usb 4-3.2: SerialNumber: 000000000
> > [  230.101915] Bluetooth: hci2: HW/SW Version: 0x008a008a, Build
> > Time: 20240826151221
> > [  233.005938] Bluetooth: hci2: Device setup in 2862056 usecs
> > [  233.005983] Bluetooth: hci2: HCI Enhanced Setup Synchronous
> > Connection command is advertised, but not supported.
> > [  234.306071] Bluetooth: hci2: Mediatek coredump end
> > [  235.092729] Bluetooth: hci2: Opcode 0x0c03 failed: -110
> > [  235.192772] Bluetooth: hci2: Mediatek coredump end
> > [  237.226157] Bluetooth: hci2: Failed to read MSFT supported
> > features (-110)
> > [  239.359435] Bluetooth: hci2: AOSP get vendor capabilities (-110)
> > [  244.479726] usb 4-3.2: Disable of device-initiated U1 failed.
> > [  249.599598] usb 4-3.2: Disable of device-initiated U2 failed.
> > [  259.839215] Bluetooth: hci2: Failed to write uhw reg(-110)
> > [  259.839240] usb 4-3.2: Disable of device-initiated U1 failed.
> > [  264.959343] usb 4-3.2: Disable of device-initiated U2 failed.
> > [  270.079038] xhci_hcd 0000:00:14.0: Timeout while waiting for setup
> > device command
> > [  275.412299] xhci_hcd 0000:00:14.0: Timeout while waiting for setup
> > device command
> > [  275.618812] usb 4-3.2: device not accepting address 4, error -62
> > [  280.958852] xhci_hcd 0000:00:14.0: Timeout while waiting for setup
> > device command
> > [  286.292034] xhci_hcd 0000:00:14.0: Timeout while waiting for setup
> > device command
> > [  286.498618] usb 4-3.2: device not accepting address 4, error -62
> > [  291.838759] xhci_hcd 0000:00:14.0: Timeout while waiting for setup
> > device command
> > [  297.172018] xhci_hcd 0000:00:14.0: Timeout while waiting for setup
> > device command
> > [  297.378477] usb 4-3.2: device not accepting address 4, error -62
> > [  302.718497] xhci_hcd 0000:00:14.0: Timeout while waiting for setup
> > device command
> > [  308.051867] xhci_hcd 0000:00:14.0: Timeout while waiting for setup
> > device command
> > [  308.258345] usb 4-3.2: device not accepting address 4, error -62
> > [  308.260253] usb 4-3.2: USB disconnect, device number 4
> > [  313.598307] xhci_hcd 0000:00:14.0: Timeout while waiting for setup
> > device command
> > [  318.931586] xhci_hcd 0000:00:14.0: Timeout while waiting for setup
> > device command
> > [  319.138278] usb 4-3.2: device not accepting address 5, error -62
> > [  324.478224] xhci_hcd 0000:00:14.0: Timeout while waiting for setup
> > device command
> > [  329.811444] xhci_hcd 0000:00:14.0: Timeout while waiting for setup
> > device command
> > [  330.018032] usb 4-3.2: device not accepting address 6, error -62
> > [  330.018489] usb 4-3-port2: attempt power cycle
> > [  336.211505] xhci_hcd 0000:00:14.0: Timeout while waiting for setup
> > device command
> > [  341.544640] xhci_hcd 0000:00:14.0: Timeout while waiting for setup
> > device command
> > [  341.751239] usb 4-3.2: device not accepting address 7, error -62
> > [  347.091375] xhci_hcd 0000:00:14.0: Timeout while waiting for setup
> > device command
> > [  352.424563] xhci_hcd 0000:00:14.0: Timeout while waiting for setup
> > device command
> > [  352.631136] usb 4-3.2: device not accepting address 8, error -62
> > [  352.631538] usb 4-3-port2: unable to enumerate USB device
> > 
> > 
> > Interestingly, if I revert back to an known-good firmware version
> > 20231025113744 along with your patch, the device enumerates and works
> > fine:
> > 
> > [ 4001.366725] usb 4-1: new SuperSpeed USB device number 4 using
> > xhci_hcd
> > [ 4001.385840] usb 4-1: New USB device found, idVendor=0e8d,
> > idProduct=7961, bcdDevice= 1.00
> > [ 4001.385855] usb 4-1: New USB device strings: Mfr=6, Product=7,
> > SerialNumber=8
> > [ 4001.385860] usb 4-1: Product: Wireless_Device
> > [ 4001.385863] usb 4-1: Manufacturer: MediaTek Inc.
> > [ 4001.385867] usb 4-1: SerialNumber: 000000000
> > [ 4001.398010] Bluetooth: hci1: HW/SW Version: 0x008a008a, Build
> > Time: 20231025113744
> > [ 4004.275656] Bluetooth: hci1: Device setup in 2812288 usecs
> > [ 4004.275661] Bluetooth: hci1: HCI Enhanced Setup Synchronous
> > Connection command is advertised, but not supported.
> > [ 4004.355137] Bluetooth: hci1: AOSP extensions version v0.96
> > [ 4004.355156] Bluetooth: hci1: AOSP quality report is not supported
> > [ 4004.355698] Bluetooth: MGMT ver 1.23
> > 
> > But if I then disconnect it, I get the Oops that I shared in my
> > original
> > regression report:
> > 
> > [ 4043.436215] usb 4-1: USB disconnect, device number 4
> > [ 4043.437308] Oops: general protection fault, probably for non-
> > canonical address 0xdead000000000122: 0000 [#1] PREEMPT SMP NOPTI
> > [ 4043.437332] CPU: 2 UID: 0 PID: 3698 Comm: kworker/2:0 Not tainted
> > 6.11.0-rc7-00001-g0e2ad6528188-dirty #71
> > d90fb9085e2a0686ac48ebcc408d97b104c6fbf1
> > [ 4043.437352] Hardware name: Intel(R) Client Systems
> > NUC12WSHi7/NUC12WSBi7, BIOS WSADL357.0088.2023.0505.1623 05/05/2023
> > [ 4043.437361] Workqueue: usb_hub_wq hub_event
> > [ 4043.437386] RIP: 0010:hci_unregister_dev+0x45/0x1f0 [bluetooth]
> > [ 4043.437548] Code: 89 ef e8 ae d4 5c c1 f0 80 8b e9 0e 00 00 08 48
> > 89 ef e8 0e c2 5c c1 48 c7 c7 68 60 52 c1 e8 22 23 5d c1 48 8b 43 08
> > 48 8b 13 <48> 3b 18 0f 85 f5 c7 06 00 48 3b 5a 08 0f 85 eb c7 06 00
> > 48 89 42
> > [ 4043.437560] RSP: 0018:ffffa10f4ae43b98 EFLAGS: 00010246
> > [ 4043.437574] RAX: dead000000000122 RBX: ffff8cf86c160000 RCX:
> > 0000000000000000
> > [ 4043.437585] RDX: dead000000000100 RSI: ffff8cf7b7d16c50 RDI:
> > ffffffffc1526068
> > [ 4043.437594] RBP: ffff8cf86c1604d0 R08: 0000000000000000 R09:
> > ffff8cf7401d8e10
> > [ 4043.437602] R10: ffffa10f4ae43ba0 R11: ffffa10f4ae43ba8 R12:
> > ffff8cf86c160000
> > [ 4043.437610] R13: ffffffffc1416278 R14: ffffffffc1416278 R15:
> > ffff8cf7f8d73850
> > [ 4043.437620] FS:  0000000000000000(0000) GS:ffff8d0697300000(0000)
> > knlGS:0000000000000000
> > [ 4043.437632] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
> > [ 4043.437641] CR2: 00007f98d66dc000 CR3: 0000000131124000 CR4:
> > 0000000000f50ef0
> > [ 4043.437651] PKRU: 55555554
> > [ 4043.437658] Call Trace:
> > [ 4043.437670]  <TASK>
> > [ 4043.437680]  ? __die_body.cold+0x19/0x27
> > [ 4043.437700]  ? die_addr+0x3c/0x60
> > [ 4043.437716]  ? exc_general_protection+0x17d/0x400
> > [ 4043.437738]  ? asm_exc_general_protection+0x26/0x30
> > [ 4043.437760]  ? hci_unregister_dev+0x45/0x1f0 [bluetooth
> > 6dca047d1088401e195d97746b2b4936e5756d61]
> > [ 4043.437930]  ? hci_unregister_dev+0x3e/0x1f0 [bluetooth
> > 6dca047d1088401e195d97746b2b4936e5756d61]
> > [ 4043.438080]  btusb_disconnect+0x67/0x170 [btusb
> > 5bf8186d9cab4c5be1762247dadb6753a7c72a7f]
> > [ 4043.438108]  usb_unbind_interface+0x90/0x290
> > [ 4043.438130]  device_release_driver_internal+0x19c/0x200
> > [ 4043.438150]  bus_remove_device+0xc6/0x130
> > [ 4043.438166]  device_del+0x161/0x3e0
> > [ 4043.438182]  ? kobject_put+0xa0/0x1d0
> > [ 4043.438196]  usb_disable_device+0x104/0x220
> > [ 4043.438213]  usb_disconnect+0xe6/0x2e0
> > [ 4043.438231]  hub_event+0x7f9/0x19d0
> > [ 4043.438250]  ? __pm_runtime_suspend+0x47/0xc0
> > [ 4043.438269]  process_one_work+0x17b/0x330
> > [ 4043.438287]  worker_thread+0x2c6/0x3f0
> > [ 4043.438304]  ? __pfx_worker_thread+0x10/0x10
> > [ 4043.438318]  kthread+0xcf/0x100
> > [ 4043.438337]  ? __pfx_kthread+0x10/0x10
> > [ 4043.438354]  ret_from_fork+0x31/0x50
> > [ 4043.438367]  ? __pfx_kthread+0x10/0x10
> > [ 4043.438382]  ret_from_fork_asm+0x1a/0x30
> > [ 4043.438403]  </TASK>
> > [ 4043.438408] Modules linked in: uhid mt792x_usb mt7921_common
> > mt792x_lib mt76_connac_lib mt76_usb mt76 ccm option usb_wwan cmac
> > algif_hash algif_skcipher af_alg sr_mod cdrom bnep mousedev joydev
> > vfat fat snd_sof_pci_intel_tgl snd_sof_pci_intel_cnl intel_rapl_msr
> > snd_sof_intel_hda_generic intel_rapl_common soundwire_intel
> > intel_uncore_frequency soundwire_cadence
> > intel_uncore_frequency_common snd_sof_intel_hda_common
> > snd_sof_intel_hda_mlink snd_sof_intel_hda snd_sof_pci
> > snd_sof_xtensa_dsp snd_sof iwlmvm snd_sof_utils snd_soc_hdac_hda
> > snd_soc_acpi_intel_match soundwire_generic_allocation snd_soc_acpi
> > soundwire_bus snd_soc_avs r8152 x86_pkg_temp_thermal intel_powerclamp
> > libphy snd_soc_hda_codec coretemp mac80211 snd_hda_ext_core kvm_intel
> > snd_soc_core snd_hda_codec_hdmi cdc_ether hid_generic uas usbnet
> > snd_hda_codec_realtek snd_compress kvm usb_storage mii usbhid
> > snd_hda_codec_generic ac97_bus snd_pcm_dmaengine
> > snd_hda_scodec_component snd_hda_intel libarc4 snd_intel_dspcfg btusb
> > crct10dif_pclmul snd_intel_sdw_acpi
> > [ 4043.438617]  crc32_pclmul iwlwifi btrtl snd_hda_codec
> > polyval_clmulni btintel polyval_generic btbcm ghash_clmulni_intel
> > sha512_ssse3 btmtk tps6598x sha256_ssse3 snd_hda_core typec
> > sha1_ssse3 cfg80211 bluetooth aesni_intel snd_hwdep roles gf128mul
> > crypto_simd snd_pcm cryptd mei_hdcp mei_pxp rapl ee1004 ov13858
> > snd_timer intel_cstate igc spi_nor intel_uncore i2c_i801 thunderbolt
> > snd v4l2_fwnode mei_me v4l2_async ptp wdat_wdt i2c_smbus mtd pcspkr
> > wmi_bmof intel_lpss_pci videodev mei pps_core soundcore
> > intel_pmc_core i2c_mux intel_lpss rfkill idma64 igen6_edac intel_vsec
> > serial_multi_instantiate mc pmt_telemetry pinctrl_tigerlake pmt_class
> > acpi_pad acpi_tad mac_hid i2c_dev dm_mod sg crypto_user loop
> > nfnetlink ip_tables x_tables ext4 crc32c_generic crc16 mbcache jbd2
> > xe drm_ttm_helper gpu_sched drm_suballoc_helper drm_gpuvm drm_exec
> > i915 i2c_algo_bit drm_buddy ttm nvme intel_gtt drm_display_helper
> > nvme_core spi_intel_pci cec xhci_pci crc32c_intel spi_intel nvme_auth
> > xhci_pci_renesas video wmi
> > [ 4043.438898] ---[ end trace 0000000000000000 ]---
> > [ 4043.438905] RIP: 0010:hci_unregister_dev+0x45/0x1f0 [bluetooth]
> > [ 4043.439039] Code: 89 ef e8 ae d4 5c c1 f0 80 8b e9 0e 00 00 08 48
> > 89 ef e8 0e c2 5c c1 48 c7 c7 68 60 52 c1 e8 22 23 5d c1 48 8b 43 08
> > 48 8b 13 <48> 3b 18 0f 85 f5 c7 06 00 48 3b 5a 08 0f 85 eb c7 06 00
> > 48 89 42
> > [ 4043.439048] RSP: 0018:ffffa10f4ae43b98 EFLAGS: 00010246
> > [ 4043.439058] RAX: dead000000000122 RBX: ffff8cf86c160000 RCX:
> > 0000000000000000
> > [ 4043.439065] RDX: dead000000000100 RSI: ffff8cf7b7d16c50 RDI:
> > ffffffffc1526068
> > [ 4043.439072] RBP: ffff8cf86c1604d0 R08: 0000000000000000 R09:
> > ffff8cf7401d8e10
> > [ 4043.439078] R10: ffffa10f4ae43ba0 R11: ffffa10f4ae43ba8 R12:
> > ffff8cf86c160000
> > [ 4043.439085] R13: ffffffffc1416278 R14: ffffffffc1416278 R15:
> > ffff8cf7f8d73850
> > [ 4043.439091] FS:  0000000000000000(0000) GS:ffff8d0697300000(0000)
> > knlGS:0000000000000000
> > [ 4043.439100] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
> > [ 4043.439108] CR2: 00007f98d66dc000 CR3: 0000000131124000 CR4:
> > 0000000000f50ef0
> > [ 4043.439116] PKRU: 55555554
> > [ 4043.439122] note: kworker/2:0[3698] exited with preempt_count 1
> > 
> > So, in summary, it looks as though there are two issues here:
> > 
> > 1. The latest firmware does not seem to work well with this chipset,
> >    perhaps it is crashing after loading?
> > 2. The Oops in the hci_unregister_dev function suggests some HCI
> >    registration bug.
> > 
> > Let me know if I can provide any further assistance.
> > 
> > Regards,
> > 
> > Marc
> > 



From macpaul.lin at mediatek.com  Tue Sep 17 19:44:10 2024
From: macpaul.lin at mediatek.com (Macpaul Lin)
Date: Wed, 18 Sep 2024 10:44:10 +0800
Subject: [PATCH v5 3/3] regulator: dt-bindings: mt6397: move examples to
 parent PMIC mt6397
In-Reply-To: <ev4kqtbjwglrti3mk2cnayilj4muy7ll7ux2uwlekcwu73dy5e@h4wvpucmyepw>
References: <20240916151132.32321-1-macpaul.lin@mediatek.com>
 <20240916151132.32321-3-macpaul.lin@mediatek.com>
 <ev4kqtbjwglrti3mk2cnayilj4muy7ll7ux2uwlekcwu73dy5e@h4wvpucmyepw>
Message-ID: <9caff3d5-22af-3481-d2af-6afb4abd49d7@mediatek.com>


On 9/17/24 15:01, Krzysztof Kozlowski wrote:
> 	
> 
> External email : Please do not click links or open attachments until you 
> have verified the sender or the content.
> 
> On Mon, Sep 16, 2024 at 11:11:32PM +0800, Macpaul Lin wrote:
>> Since the DT schema of multiple function PMIC mt6397 has been converted,
>> move the examples in "mediatek,mt6397-regulator.yaml" to the parent schema
>> "mediatek,mt6397.yaml".
> 
> Is there any error otherwise? Why this cannot stay here, since it is
> already there?
> 
> Best regards,
> Krzysztof
> 

I previously thought that all regulator examples needed to have a 
complete version placed centrally in the main MFD. In that case, this 
patch 3/3 should not need to be required. This will be dropped in the 
next version.

Best regards,
Macpaul Lin




From macpaul.lin at mediatek.com  Tue Sep 17 23:45:19 2024
From: macpaul.lin at mediatek.com (Macpaul Lin)
Date: Wed, 18 Sep 2024 14:45:19 +0800
Subject: [PATCH v5 2/3] dt-bindings: mfd: mediatek: mt6397: Convert to DT
 schema format
In-Reply-To: <iudkiamza3lsl33tsby3sghfy66rj2tgg3kqjjwzeba46oxtpi@yrri5m5skjld>
References: <20240916151132.32321-1-macpaul.lin@mediatek.com>
 <20240916151132.32321-2-macpaul.lin@mediatek.com>
 <iudkiamza3lsl33tsby3sghfy66rj2tgg3kqjjwzeba46oxtpi@yrri5m5skjld>
Message-ID: <a0a16c7a-0469-d880-532a-2bb69f5ea347@mediatek.com>


On 9/17/24 15:00, Krzysztof Kozlowski wrote:

...

> 
> On Mon, Sep 16, 2024 at 11:11:31PM +0800, Macpaul Lin wrote:
>> Convert the mfd: mediatek: mt6397 binding to DT schema format.
>> 
>> MT6323, MT6358, and MT6397 are PMIC devices with multiple function
>> subdevices. They share a common PMIC design but have variations in
>> subdevice combinations.
>> 
>> Key updates in this conversion:
> 
> ...

[snip]

>> +
>> +            ldo_vcamio {
>> +                regulator-name = "vcamio";
>> +                regulator-min-microvolt = <1800000>;
>> +                regulator-max-microvolt = <1800000>;
>> +                regulator-enable-ramp-delay = <216>;
>> +            };
>> +        };
>> +
>> +        keys {
>> +            compatible = "mediatek,mt6323-keys";
>> +            mediatek,long-press-mode = <1>;
>> +            power-off-time-sec = <0>;
>> +
>> +            power {
>> +                    linux,keycodes = <116>;
> 
> Messed indentation.

OOPS, I didn't find this during editing.
Will fix it in next version.

>> +
>> +        power-controller {
>> +            compatible = "mediatek,mt6323-pwrc";
>> +            #power-domain-cells = <0>;
>> +        };
>> +
>> +        rtc {
>> +            compatible = "mediatek,mt6323-rtc";
>> +        };
>> +    };
> 
> Keep one complete example. Maybye two if they are significantly
> different, but I don't see these differences.
> 

Okay, will keep complete example for mt6323.
Trimmed most similar part of mt6358 and mt6397.
Since there are some typical usage in other nodes.
Just keep these smaller nodes for mt6358 and mt6397.
Will also add a note of this in commit message.

>> +
>> +  - |
>> +    #include <dt-bindings/input/input.h>
>> +    #include <dt-bindings/interrupt-controller/arm-gic.h>
>> +
>> +    pmic {
>> +        compatible = "mediatek,mt6358">
> 
> 
> ....
> 
>> -Required properties:
>> -- compatible: "mediatek,mt6397-pinctrl"
>> -For details, see ../pinctrl/pinctrl-mt65xx.txt
> 
> Best regards,
> Krzysztof
> 
>

Thanks!

Best regardsMacpaul Lin


From macpaul.lin at mediatek.com  Tue Sep 17 23:49:54 2024
From: macpaul.lin at mediatek.com (Macpaul Lin)
Date: Wed, 18 Sep 2024 14:49:54 +0800
Subject: [PATCH v6 1/2] regulator: dt-bindings: mt6323: Convert to DT schema
Message-ID: <20240918064955.6518-1-macpaul.lin@mediatek.com>

Convert the MT6323 regulator binding from the old text-based format to
the new DT schema style. The property "regulator-name" has been added
as required property to reflect current usage in mt6323.dtsi.

Examples have been streamlined and relocated to the parent schema file:
  mfd/mediatek,mt6397.yaml.

Update maintainer and submitter information with new entries from MediaTek.

The reference document cited in "mediatek,mt7530.yaml" has been updated
to point to this new DT schema file

Signed-off-by: Sen Chu <sen.chu at mediatek.com>
Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
Reviewed-by: Krzysztof Kozlowski <krzk at kernel.org>
---
 .../bindings/net/dsa/mediatek,mt7530.yaml     |   4 +-
 .../regulator/mediatek,mt6323-regulator.yaml  | 119 +++++++++
 .../bindings/regulator/mt6323-regulator.txt   | 237 ------------------
 3 files changed, 121 insertions(+), 239 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/regulator/mediatek,mt6323-regulator.yaml
 delete mode 100644 Documentation/devicetree/bindings/regulator/mt6323-regulator.txt

Changes for v1 and v2:
 - This is the first version of converting mt6323-regulator.
   This is because converting mt6323-regulator together
   with mfd/mediatek,mt6397.yaml, so we've create a patch set
   instead of single patch for each skydives.
 - This patch has been made base on linux-next/master git repo.

Changes for v3:
 - Rebased on linux-next/master git repo near next-20240906.
 - Added 'regulator-name' to 'requried' property to reflect current usage.
 - replace ^(buck_)? and ^(ldo_)? to ^buck_ and ^ldo_ prefix.
 - Update file name of 'mediatek,mt6323-regulator.yaml' in
   'mediatek,mt7530.yaml'

Changes for v4:
 - No change.

Changes for v5:
 - Add "Reviewed-by" in commit message. Thanks for the review!
 - Remove a blank line at EOF whcih causes whitespace warning
   when 'git am' the patch.

Changes for v6:
 - No change.

diff --git a/Documentation/devicetree/bindings/net/dsa/mediatek,mt7530.yaml b/Documentation/devicetree/bindings/net/dsa/mediatek,mt7530.yaml
index ea979bc..413db38 100644
--- a/Documentation/devicetree/bindings/net/dsa/mediatek,mt7530.yaml
+++ b/Documentation/devicetree/bindings/net/dsa/mediatek,mt7530.yaml
@@ -129,8 +129,8 @@ properties:
   io-supply:
     description: |
       Phandle to the regulator node necessary for the I/O power.
-      See Documentation/devicetree/bindings/regulator/mt6323-regulator.txt for
-      details for the regulator setup on these boards.
+      See Documentation/devicetree/bindings/regulator/mediatek,mt6323-regulator.yaml
+      for details for the regulator setup on these boards.
 
   mediatek,mcm:
     type: boolean
diff --git a/Documentation/devicetree/bindings/regulator/mediatek,mt6323-regulator.yaml b/Documentation/devicetree/bindings/regulator/mediatek,mt6323-regulator.yaml
new file mode 100644
index 0000000..9bc9aa9a
--- /dev/null
+++ b/Documentation/devicetree/bindings/regulator/mediatek,mt6323-regulator.yaml
@@ -0,0 +1,119 @@
+# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/regulator/mediatek,mt6323-regulator.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: MediaTek MT6323 Regulator
+
+maintainers:
+  - John Crispin <john at phrozen.org>
+  - Sen Chu <sen.chu at mediatek.com>
+  - Macpaul Lin <macpaul.lin at mediatek.com>
+
+description: |
+  Regulator node of the PMIC. This node should under the PMIC's device node.
+  All voltage regulators provided by the PMIC are described as sub-nodes of
+  this node.
+
+properties:
+  compatible:
+    items:
+      - const: mediatek,mt6323-regulator
+
+patternProperties:
+  "^buck_v(pa|proc|sys)$":
+    description: Buck regulators
+    type: object
+    $ref: regulator.yaml#
+
+    properties:
+      regulator-allowed-modes: false
+
+    unevaluatedProperties: false
+
+    required:
+      - regulator-name
+
+  "^ldo_v(camio|cn18)$":
+    description: LDO with fixed 1.8V output and 0~100/10mV tuning
+    type: object
+    $ref: regulator.yaml#
+
+    properties:
+      regulator-allowed-modes: false
+
+    unevaluatedProperties: false
+
+    required:
+      - regulator-name
+
+  "^ldo_v((io|rf)18)$":
+    description: LDOs with fixed 1.825V output and 0~100/10mV tuning
+    type: object
+    $ref: regulator.yaml#
+
+    properties:
+      regulator-allowed-modes: false
+
+    unevaluatedProperties: false
+
+    required:
+      - regulator-name
+
+  "^ldo_v(a|rtc|tcxo|(cn|io)28)$":
+    description: LDOs with fixed 2.8V output and 0~100/10mV tuning
+    type: object
+    $ref: regulator.yaml#
+
+    properties:
+      regulator-allowed-modes: false
+
+    unevaluatedProperties: false
+
+    required:
+      - regulator-name
+
+  "^ldo_v(usb)$":
+    description: LDOs with fixed 3.3V output and 0~100/10mV tuning
+    type: object
+    $ref: regulator.yaml#
+
+    properties:
+      regulator-allowed-modes: false
+
+    unevaluatedProperties: false
+
+    required:
+      - regulator-name
+
+  "^ldo_v(cn33_(bt|wifi))$":
+    description: LDOs with variable 3.3V output and 0~100/10mV tuning
+    type: object
+    $ref: regulator.yaml#
+
+    properties:
+      regulator-allowed-modes: false
+
+    unevaluatedProperties: false
+
+    required:
+      - regulator-name
+
+  "^ldo_v(cama|camaf|camd|emc3v3|gp[123]|ibr|m|mc|mch|sim[12])$":
+    description: LDOs with variable output and 0~100/10mV tuning
+    type: object
+    $ref: regulator.yaml#
+
+    properties:
+      regulator-allowed-modes: false
+
+    unevaluatedProperties: false
+
+    required:
+      - regulator-name
+
+required:
+  - compatible
+
+additionalProperties: false
diff --git a/Documentation/devicetree/bindings/regulator/mt6323-regulator.txt b/Documentation/devicetree/bindings/regulator/mt6323-regulator.txt
deleted file mode 100644
index a48749d..0000000
--- a/Documentation/devicetree/bindings/regulator/mt6323-regulator.txt
+++ /dev/null
@@ -1,237 +0,0 @@
-Mediatek MT6323 Regulator
-
-All voltage regulators are defined as subnodes of the regulators node. A list
-of regulators provided by this controller are defined as subnodes of the
-PMIC's node. Each regulator is named according to its regulator type,
-buck_<name> and ldo_<name>. The definition for each of these nodes is defined
-using the standard binding for regulators at
-Documentation/devicetree/bindings/regulator/regulator.txt.
-
-The valid names for regulators are::
-BUCK:
-  buck_vproc, buck_vsys, buck_vpa
-LDO:
-  ldo_vtcxo, ldo_vcn28, ldo_vcn33_bt, ldo_vcn33_wifi, ldo_va, ldo_vcama,
-  ldo_vio28, ldo_vusb, ldo_vmc, ldo_vmch, ldo_vemc3v3, ldo_vgp1, ldo_vgp2,
-  ldo_vgp3, ldo_vcn18, ldo_vsim1, ldo_vsim2, ldo_vrtc, ldo_vcamaf, ldo_vibr,
-  ldo_vrf18, ldo_vm, ldo_vio18, ldo_vcamd, ldo_vcamio
-
-Example:
-
-	pmic: mt6323 {
-		mt6323regulator: regulators {
-			mt6323_vproc_reg: buck_vproc{
-				regulator-name = "vproc";
-				regulator-min-microvolt = < 700000>;
-				regulator-max-microvolt = <1350000>;
-				regulator-ramp-delay = <12500>;
-				regulator-always-on;
-				regulator-boot-on;
-			};
-
-			mt6323_vsys_reg: buck_vsys{
-				regulator-name = "vsys";
-				regulator-min-microvolt = <1400000>;
-				regulator-max-microvolt = <2987500>;
-				regulator-ramp-delay = <25000>;
-				regulator-always-on;
-				regulator-boot-on;
-			};
-
-			mt6323_vpa_reg: buck_vpa{
-				regulator-name = "vpa";
-				regulator-min-microvolt = < 500000>;
-				regulator-max-microvolt = <3650000>;
-			};
-
-			mt6323_vtcxo_reg: ldo_vtcxo{
-				regulator-name = "vtcxo";
-				regulator-min-microvolt = <2800000>;
-				regulator-max-microvolt = <2800000>;
-				regulator-enable-ramp-delay = <90>;
-				regulator-always-on;
-				regulator-boot-on;
-			};
-
-			mt6323_vcn28_reg: ldo_vcn28{
-				regulator-name = "vcn28";
-				regulator-min-microvolt = <2800000>;
-				regulator-max-microvolt = <2800000>;
-				regulator-enable-ramp-delay = <185>;
-			};
-
-			mt6323_vcn33_bt_reg: ldo_vcn33_bt{
-				regulator-name = "vcn33_bt";
-				regulator-min-microvolt = <3300000>;
-				regulator-max-microvolt = <3600000>;
-				regulator-enable-ramp-delay = <185>;
-			};
-
-			mt6323_vcn33_wifi_reg: ldo_vcn33_wifi{
-				regulator-name = "vcn33_wifi";
-				regulator-min-microvolt = <3300000>;
-				regulator-max-microvolt = <3600000>;
-				regulator-enable-ramp-delay = <185>;
-			};
-
-			mt6323_va_reg: ldo_va{
-				regulator-name = "va";
-				regulator-min-microvolt = <2800000>;
-				regulator-max-microvolt = <2800000>;
-				regulator-enable-ramp-delay = <216>;
-				regulator-always-on;
-				regulator-boot-on;
-			};
-
-			mt6323_vcama_reg: ldo_vcama{
-				regulator-name = "vcama";
-				regulator-min-microvolt = <1500000>;
-				regulator-max-microvolt = <2800000>;
-				regulator-enable-ramp-delay = <216>;
-			};
-
-			mt6323_vio28_reg: ldo_vio28{
-				regulator-name = "vio28";
-				regulator-min-microvolt = <2800000>;
-				regulator-max-microvolt = <2800000>;
-				regulator-enable-ramp-delay = <216>;
-				regulator-always-on;
-				regulator-boot-on;
-			};
-
-			mt6323_vusb_reg: ldo_vusb{
-				regulator-name = "vusb";
-				regulator-min-microvolt = <3300000>;
-				regulator-max-microvolt = <3300000>;
-				regulator-enable-ramp-delay = <216>;
-				regulator-boot-on;
-			};
-
-			mt6323_vmc_reg: ldo_vmc{
-				regulator-name = "vmc";
-				regulator-min-microvolt = <1800000>;
-				regulator-max-microvolt = <3300000>;
-				regulator-enable-ramp-delay = <36>;
-				regulator-boot-on;
-			};
-
-			mt6323_vmch_reg: ldo_vmch{
-				regulator-name = "vmch";
-				regulator-min-microvolt = <3000000>;
-				regulator-max-microvolt = <3300000>;
-				regulator-enable-ramp-delay = <36>;
-				regulator-boot-on;
-			};
-
-			mt6323_vemc3v3_reg: ldo_vemc3v3{
-				regulator-name = "vemc3v3";
-				regulator-min-microvolt = <3000000>;
-				regulator-max-microvolt = <3300000>;
-				regulator-enable-ramp-delay = <36>;
-				regulator-boot-on;
-			};
-
-			mt6323_vgp1_reg: ldo_vgp1{
-				regulator-name = "vgp1";
-				regulator-min-microvolt = <1200000>;
-				regulator-max-microvolt = <3300000>;
-				regulator-enable-ramp-delay = <216>;
-			};
-
-			mt6323_vgp2_reg: ldo_vgp2{
-				regulator-name = "vgp2";
-				regulator-min-microvolt = <1200000>;
-				regulator-max-microvolt = <3000000>;
-				regulator-enable-ramp-delay = <216>;
-			};
-
-			mt6323_vgp3_reg: ldo_vgp3{
-				regulator-name = "vgp3";
-				regulator-min-microvolt = <1200000>;
-				regulator-max-microvolt = <1800000>;
-				regulator-enable-ramp-delay = <216>;
-			};
-
-			mt6323_vcn18_reg: ldo_vcn18{
-				regulator-name = "vcn18";
-				regulator-min-microvolt = <1800000>;
-				regulator-max-microvolt = <1800000>;
-				regulator-enable-ramp-delay = <216>;
-			};
-
-			mt6323_vsim1_reg: ldo_vsim1{
-				regulator-name = "vsim1";
-				regulator-min-microvolt = <1800000>;
-				regulator-max-microvolt = <3000000>;
-				regulator-enable-ramp-delay = <216>;
-			};
-
-			mt6323_vsim2_reg: ldo_vsim2{
-				regulator-name = "vsim2";
-				regulator-min-microvolt = <1800000>;
-				regulator-max-microvolt = <3000000>;
-				regulator-enable-ramp-delay = <216>;
-			};
-
-			mt6323_vrtc_reg: ldo_vrtc{
-				regulator-name = "vrtc";
-				regulator-min-microvolt = <2800000>;
-				regulator-max-microvolt = <2800000>;
-				regulator-always-on;
-				regulator-boot-on;
-			};
-
-			mt6323_vcamaf_reg: ldo_vcamaf{
-				regulator-name = "vcamaf";
-				regulator-min-microvolt = <1200000>;
-				regulator-max-microvolt = <3300000>;
-				regulator-enable-ramp-delay = <216>;
-			};
-
-			mt6323_vibr_reg: ldo_vibr{
-				regulator-name = "vibr";
-				regulator-min-microvolt = <1200000>;
-				regulator-max-microvolt = <3300000>;
-				regulator-enable-ramp-delay = <36>;
-			};
-
-			mt6323_vrf18_reg: ldo_vrf18{
-				regulator-name = "vrf18";
-				regulator-min-microvolt = <1825000>;
-				regulator-max-microvolt = <1825000>;
-				regulator-enable-ramp-delay = <187>;
-			};
-
-			mt6323_vm_reg: ldo_vm{
-				regulator-name = "vm";
-				regulator-min-microvolt = <1200000>;
-				regulator-max-microvolt = <1800000>;
-				regulator-enable-ramp-delay = <216>;
-				regulator-always-on;
-				regulator-boot-on;
-			};
-
-			mt6323_vio18_reg: ldo_vio18{
-				regulator-name = "vio18";
-				regulator-min-microvolt = <1800000>;
-				regulator-max-microvolt = <1800000>;
-				regulator-enable-ramp-delay = <216>;
-				regulator-always-on;
-				regulator-boot-on;
-			};
-
-			mt6323_vcamd_reg: ldo_vcamd{
-				regulator-name = "vcamd";
-				regulator-min-microvolt = <1200000>;
-				regulator-max-microvolt = <1800000>;
-				regulator-enable-ramp-delay = <216>;
-			};
-
-			mt6323_vcamio_reg: ldo_vcamio{
-				regulator-name = "vcamio";
-				regulator-min-microvolt = <1800000>;
-				regulator-max-microvolt = <1800000>;
-				regulator-enable-ramp-delay = <216>;
-			};
-		};
-	};
-- 
2.45.2



From macpaul.lin at mediatek.com  Tue Sep 17 23:49:55 2024
From: macpaul.lin at mediatek.com (Macpaul Lin)
Date: Wed, 18 Sep 2024 14:49:55 +0800
Subject: [PATCH v6 2/2] dt-bindings: mfd: mediatek: mt6397: Convert to DT schema format
In-Reply-To: <20240918064955.6518-1-macpaul.lin@mediatek.com>
References: <20240918064955.6518-1-macpaul.lin@mediatek.com>
Message-ID: <20240918064955.6518-2-macpaul.lin@mediatek.com>

Convert the mfd: mediatek: mt6397 binding to DT schema format.

MT6323, MT6358, and MT6397 are PMIC devices with multiple function
subdevices. They share a common PMIC design but have variations in
subdevice combinations.

Key updates in this conversion:

1. RTC:
   - Convert rtc-mt6397.txt and merge into parent MT6397 PMIC DT schema.

2. Regulators:
   - Align to generic name "regulators".
   - Update references from .txt to .yaml for mt6323, mt6358, and mt6397
     regulators.
   - Simplify regulator name labels in device tree examples.

3. Audio Codec:
   - Convert sound/mt6358.txt and merge into parent MT6397 PMIC DT schema.
   - Align to generic name "audio-codec" for codec and sound subdevices.
   - Add "mediatek,dmic-mode" and "Avdd-supply" properties.

4. Clocks:
   - Align to generic name "clocks" for clockbuffer subdevices.

5. LEDs:
   - Convert leds-mt6323.txt and merge into parent MT6397 PMIC DT schema.
   - Update LED binding.

6. Keys:
   - Add detailed descriptions for power and home keys.
   - Add compatible: mediatek,mt6358-keys.

7. Power Controller:
   - Convert mt6323-poweroff.txt and merge into parent MT6397 PMIC DT
     schema.
   - Add #power-domain-cells property to fix dt-binding check error.
   - Clarify "BBPU" as "Baseband power up".

8. Pinctrl:
   - Align to generic name "pinctrl" instead of "pin-controller".

9. Compatible:
   - Drop "mediatek,mt6357" since there is a separated DT Schema
     for PMIC MT6357.

10. Examples:
   - MT6323: Retain complete examples for this PMIC.
   - MT6358 and MT6397: simplify settings in regulators.
    - Preserve "audio-codec", "clocks", "pinctrl", "rtc", and "keys"
      sections as they contain typical settings for different PMICs.

Additional updates:
- MAINTAINERS: Add co-maintainers and reference to
  mfd/mediatek,mt6397.yaml for LED and power-controller drivers.
- input/mediatek,pmic-keys.yaml: Update reference to
  mfd/mediatek,mt6397.yaml.

Signed-off-by: Sen Chu <sen.chu at mediatek.com>
Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
---
 .../bindings/input/mediatek,pmic-keys.yaml    |   2 +-
 .../devicetree/bindings/leds/leds-mt6323.txt  |  63 --
 .../bindings/mfd/mediatek,mt6397.yaml         | 601 ++++++++++++++++++
 .../devicetree/bindings/mfd/mt6397.txt        | 110 ----
 .../bindings/power/reset/mt6323-poweroff.txt  |  20 -
 .../devicetree/bindings/rtc/rtc-mt6397.txt    |  31 -
 .../devicetree/bindings/sound/mt6358.txt      |  26 -
 MAINTAINERS                                   |   8 +-
 8 files changed, 608 insertions(+), 253 deletions(-)
 delete mode 100644 Documentation/devicetree/bindings/leds/leds-mt6323.txt
 create mode 100644 Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml
 delete mode 100644 Documentation/devicetree/bindings/mfd/mt6397.txt
 delete mode 100644 Documentation/devicetree/bindings/power/reset/mt6323-poweroff.txt
 delete mode 100644 Documentation/devicetree/bindings/rtc/rtc-mt6397.txt
 delete mode 100644 Documentation/devicetree/bindings/sound/mt6358.txt

Changes for v1:
 - This patch depends on conversion of mediatek,mt6397-regulator.yaml
   [1] https://lore.kernel.org/lkml/20240807091738.18387-1-macpaul.lin at mediatek.com/T/

Changes for v2:
 - This patch has been made base on linux-next/master git repo.
 - Keep the parent and child relationship with mediatek,pwrap in description.
   [2] https://lore.kernel.org/all/20240826-slurp-earphone-0d5173923ae8 at spud/
 - Keep the $ref for regulators since dt_binding_check didn't report any issue
   based on linux-next/master repo.
 - Fix description of mt6397/mt6323 devices, use "power management chip"
   instead of "multifunction device"
 - Drop unnecessary comments or description according to the review.
 - Convert sub-modules to DT Schema:
  - RTC, LEDs, power-controllers, regulators
 - Drop duplicate sub node name and description for sub-modules
  - RTC, Keys
 - examples:
  - drop parent pwrap node
  - Add examples from mediatek,mt6323-regulator.yaml
  - Add examples from mediatek,mt6358-regulator.yaml
  - Add examples from mediatek,mt6397-regulator.yaml
  - Complete the examples as could as possible.

Changes for v3:
 - Rebased on linux-next/master git repo near next-20240906.
 - Revise commit message.
 - Regulators:
  - Use "additionalProperties: true" and add "contains" for matching
    $ref DT bindings.
  - Simplify regulator name labels in device tree examples.
 - LEDs:
  - Use LED bindings.
 - Squash following patches in v2 for removing old text format DT bindings
   into this patch, includes:
  - leds-mt6323.txt, mt6323-poweroff.txt, rtc-mt6397.txt, sound/mt6358.txt.
 - Fix file format of DT schemas, add blank between properties.
 - Fix 'make checkrefdoc' errors, update reference in mediatek,pmic-keys.yaml.

Changes for v4:
 - Remove "mediatek,mt6357" from PMIC's compatible string since there is a
   seperated DT schema for PMIC mt6357.

Changes for v5:
 - Rebase to next-20240913 (linux-next/master).
 - Fix the "title" (device type) of mfd/mediatek,mt6397.yaml to "PMIC".
 - RTC:
  - Drop "start-year"
 - Regulators:
  - Add blank lines between description and properties.
  - Drop allOf for the $ref section on property.
 - clocks:
  - Fix no need '|' in descriptoin.
  - Add blank lines between description and properties.
 - Keys:
  - Drop compatible since these enums are already in $ref.
 - pinctrl:
  - Drop compatible since it is already in $ref.
 - examples:
  - Fix indentations for leds and keys.

Changes for v6:
 - Commit message:
  - Add note for simplifying examples of mt6358 and mt6397.
 - examples:
  - Fix indentations for mt6323-keys.
  - MT6358 and MT6397: simplify settings in regulators.
   - Preserve "audio-codec", "clocks", "pinctrl", "rtc", and "keys"
     sections as they contain typical settings for different PMICs.

diff --git a/Documentation/devicetree/bindings/input/mediatek,pmic-keys.yaml b/Documentation/devicetree/bindings/input/mediatek,pmic-keys.yaml
index 70567d9..466566a 100644
--- a/Documentation/devicetree/bindings/input/mediatek,pmic-keys.yaml
+++ b/Documentation/devicetree/bindings/input/mediatek,pmic-keys.yaml
@@ -19,7 +19,7 @@ description: |
   by the PMIC that is defined as a Multi-Function Device (MFD).
 
   For MediaTek MT6323/MT6397 PMIC bindings see
-  Documentation/devicetree/bindings/mfd/mt6397.txt
+  Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml
 
 properties:
   compatible:
diff --git a/Documentation/devicetree/bindings/leds/leds-mt6323.txt b/Documentation/devicetree/bindings/leds/leds-mt6323.txt
deleted file mode 100644
index 052dccb8..0000000
--- a/Documentation/devicetree/bindings/leds/leds-mt6323.txt
+++ /dev/null
@@ -1,63 +0,0 @@
-Device Tree Bindings for LED support on MT6323 PMIC
-
-MT6323 LED controller is subfunction provided by MT6323 PMIC, so the LED
-controllers are defined as the subnode of the function node provided by MT6323
-PMIC controller that is being defined as one kind of Muti-Function Device (MFD)
-using shared bus called PMIC wrapper for each subfunction to access remote
-MT6323 PMIC hardware.
-
-For MT6323 MFD bindings see:
-Documentation/devicetree/bindings/mfd/mt6397.txt
-For MediaTek PMIC wrapper bindings see:
-Documentation/devicetree/bindings/soc/mediatek/mediatek,pwrap.yaml
-
-Required properties:
-- compatible : Must be one of
-  - "mediatek,mt6323-led"
-  - "mediatek,mt6331-led"
-  - "mediatek,mt6332-led"
-- address-cells : Must be 1
-- size-cells : Must be 0
-
-Each led is represented as a child node of the mediatek,mt6323-led that
-describes the initial behavior for each LED physically and currently only four
-LED child nodes can be supported.
-
-Required properties for the LED child node:
-- reg : LED channel number (0..3)
-
-Optional properties for the LED child node:
-- label : See Documentation/devicetree/bindings/leds/common.txt
-- linux,default-trigger : See Documentation/devicetree/bindings/leds/common.txt
-- default-state: See Documentation/devicetree/bindings/leds/common.txt
-
-Example:
-
-	mt6323: pmic {
-		compatible = "mediatek,mt6323";
-
-		...
-
-		mt6323led: leds {
-			compatible = "mediatek,mt6323-led";
-			#address-cells = <1>;
-			#size-cells = <0>;
-
-			led at 0 {
-				reg = <0>;
-				label = "LED0";
-				linux,default-trigger = "timer";
-				default-state = "on";
-			};
-			led at 1 {
-				reg = <1>;
-				label = "LED1";
-				default-state = "off";
-			};
-			led at 2 {
-				reg = <2>;
-				label = "LED2";
-				default-state = "on";
-			};
-		};
-	};
diff --git a/Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml b/Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml
new file mode 100644
index 0000000..953358b
--- /dev/null
+++ b/Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml
@@ -0,0 +1,601 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/mfd/mediatek,mt6397.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: MediaTek MT6397/MT6323 PMIC
+
+maintainers:
+  - Sen Chu <sen.chu at mediatek.com>
+  - Macpaul Lin <macpaul.lin at mediatek.com>
+
+description: |
+  MT6397/MT6323 is a power management system chip.
+  Please see the sub-modules below for supported features.
+
+  MT6397/MT6323 is a multifunction device with the following sub modules:
+  - Regulators
+  - RTC
+  - Audio codec
+  - GPIO
+  - Clock
+  - LED
+  - Keys
+  - Power controller
+
+  It is interfaced to host controller using SPI interface by a proprietary hardware
+  called PMIC wrapper or pwrap. MT6397/MT6323 PMIC is a child device of pwrap.
+  See the following for pwrap node definitions:
+  Documentation/devicetree/bindings/soc/mediatek/mediatek,pwrap.yaml
+
+properties:
+  compatible:
+    oneOf:
+      - enum:
+          - mediatek,mt6323
+          - mediatek,mt6331 # "mediatek,mt6331" for PMIC MT6331 and MT6332.
+          - mediatek,mt6358
+          - mediatek,mt6359
+          - mediatek,mt6397
+      - items:
+          - enum:
+              - mediatek,mt6366
+          - const: mediatek,mt6358
+
+  interrupts:
+    maxItems: 1
+
+  interrupt-controller: true
+
+  "#interrupt-cells":
+    const: 2
+
+  rtc:
+    type: object
+    $ref: /schemas/rtc/rtc.yaml#
+    unevaluatedProperties: false
+    description:
+      MT6397 Real Time Clock.
+
+    properties:
+      compatible:
+        oneOf:
+          - enum:
+              - mediatek,mt6323-rtc
+              - mediatek,mt6331-rtc
+              - mediatek,mt6358-rtc
+              - mediatek,mt6397-rtc
+          - items:
+              - enum:
+                  - mediatek,mt6366-rtc
+              - const: mediatek,mt6358-rtc
+
+    required:
+      - compatible
+
+  regulators:
+    type: object
+    description:
+      List of child nodes that specify the regulators.
+    additionalProperties: true
+
+    properties:
+      compatible:
+        oneOf:
+          - enum:
+              - mediatek,mt6323-regulator
+              - mediatek,mt6358-regulator
+              - mediatek,mt6397-regulator
+          - items:
+              - enum:
+                  - mediatek,mt6366-regulator
+              - const: mediatek,mt6358-regulator
+
+    required:
+      - compatible
+
+  audio-codec:
+    type: object
+    additionalProperties: false
+    description:
+      Audio codec support with MT6397 and MT6358.
+
+    properties:
+      compatible:
+        oneOf:
+          - enum:
+              - mediatek,mt6397-codec
+              - mediatek,mt6358-sound
+          - items:
+              - enum:
+                  - mediatek,mt6366-sound
+              - const: mediatek,mt6358-sound
+
+      mediatek,dmic-mode:
+        description: |
+          Indicates how many data pins are used to transmit two channels of PDM
+          signal.
+          0 - two wires;
+          1 - one wire;
+          Default value is 0.
+        enum: [0, 1]
+        default: 0
+
+      Avdd-supply:
+        description: Power source of AVDD.
+
+    required:
+      - compatible
+
+  clocks:
+    type: object
+    additionalProperties: false
+    description:
+      This is a clock buffer node for mt6397. However, there are no sub nodes
+      or any public document exposed in public.
+
+    properties:
+      compatible:
+        const: mediatek,mt6397-clk
+
+      '#clock-cells':
+        const: 1
+
+    required:
+      - compatible
+
+  leds:
+    type: object
+    additionalProperties: false
+    description: |
+      MT6323 LED controller is subfunction provided by MT6323 PMIC, so the LED
+      controllers are defined as the subnode of the function node provided by MT6323
+      PMIC controller that is being defined as one kind of Muti-Function Device (MFD)
+      using shared bus called PMIC wrapper for each subfunction to access remote
+      MT6323 PMIC hardware.
+
+      Each led is represented as a child node of the mediatek,mt6323-led that
+      describes the initial behavior for each LED physically and currently only four
+      LED child nodes can be supported.
+
+    properties:
+      compatible:
+        enum:
+          - mediatek,mt6323-led
+          - mediatek,mt6331-led
+          - mediatek,mt6332-led
+
+      reg:
+        maxItems: 1
+
+      "#address-cells":
+        const: 1
+
+      "#size-cells":
+        const: 0
+
+    patternProperties:
+      "^led@[0-3]$":
+        type: object
+        $ref: /schemas/leds/common.yaml#
+        unevaluatedProperties: false
+
+        properties:
+          reg:
+            description:
+              LED channel number (0..3)
+            minimum: 0
+            maximum: 3
+
+        required:
+          - reg
+
+    required:
+      - compatible
+      - "#address-cells"
+      - "#size-cells"
+
+  keys:
+    type: object
+    $ref: /schemas/input/mediatek,pmic-keys.yaml
+    unevaluatedProperties: false
+    description:
+      Power and Home keys.
+
+  power-controller:
+    type: object
+    additionalProperties: false
+    description:
+      The power controller which could be found on PMIC is responsible for
+      externally powering off or on the remote MediaTek SoC through the
+      circuit BBPU (baseband power up).
+
+    properties:
+      compatible:
+        const: mediatek,mt6323-pwrc
+
+      '#power-domain-cells':
+        const: 0
+
+  pinctrl:
+    type: object
+    $ref: /schemas/pinctrl/mediatek,mt65xx-pinctrl.yaml
+    unevaluatedProperties: false
+    description:
+      Pin controller
+
+required:
+  - compatible
+  - regulators
+
+additionalProperties: false
+
+examples:
+  - |
+    #include <dt-bindings/interrupt-controller/arm-gic.h>
+    #include <dt-bindings/leds/common.h>
+
+    pmic {
+        compatible = "mediatek,mt6323";
+        interrupt-parent = <&pio>;
+        interrupts = <150 IRQ_TYPE_LEVEL_HIGH>;
+        interrupt-controller;
+        #interrupt-cells = <2>;
+
+        leds {
+            compatible = "mediatek,mt6323-led";
+            #address-cells = <1>;
+            #size-cells = <0>;
+        };
+
+        regulators {
+            compatible = "mediatek,mt6323-regulator";
+
+            buck_vproc {
+                regulator-name = "vproc";
+                regulator-min-microvolt = < 700000>;
+                regulator-max-microvolt = <1350000>;
+                regulator-ramp-delay = <12500>;
+                regulator-always-on;
+                regulator-boot-on;
+            };
+
+            buck_vsys {
+                regulator-name = "vsys";
+                regulator-min-microvolt = <1400000>;
+                regulator-max-microvolt = <2987500>;
+                regulator-ramp-delay = <25000>;
+                regulator-always-on;
+                regulator-boot-on;
+            };
+
+            buck_vpa {
+                regulator-name = "vpa";
+                regulator-min-microvolt = < 500000>;
+                regulator-max-microvolt = <3650000>;
+            };
+
+            ldo_vtcxo {
+                regulator-name = "vtcxo";
+                regulator-min-microvolt = <2800000>;
+                regulator-max-microvolt = <2800000>;
+                regulator-enable-ramp-delay = <90>;
+                regulator-always-on;
+                regulator-boot-on;
+            };
+
+            ldo_vcn28 {
+                regulator-name = "vcn28";
+                regulator-min-microvolt = <2800000>;
+                regulator-max-microvolt = <2800000>;
+                regulator-enable-ramp-delay = <185>;
+            };
+
+            ldo_vcn33_bt {
+                regulator-name = "vcn33_bt";
+                regulator-min-microvolt = <3300000>;
+                regulator-max-microvolt = <3600000>;
+                regulator-enable-ramp-delay = <185>;
+            };
+
+            ldo_vcn33_wifi {
+                regulator-name = "vcn33_wifi";
+                regulator-min-microvolt = <3300000>;
+                regulator-max-microvolt = <3600000>;
+                regulator-enable-ramp-delay = <185>;
+            };
+
+            ldo_va {
+                regulator-name = "va";
+                regulator-min-microvolt = <2800000>;
+                regulator-max-microvolt = <2800000>;
+                regulator-enable-ramp-delay = <216>;
+                regulator-always-on;
+                regulator-boot-on;
+            };
+
+            ldo_vcama {
+                regulator-name = "vcama";
+                regulator-min-microvolt = <1500000>;
+                regulator-max-microvolt = <2800000>;
+                regulator-enable-ramp-delay = <216>;
+            };
+
+            ldo_vio28 {
+                regulator-name = "vio28";
+                regulator-min-microvolt = <2800000>;
+                regulator-max-microvolt = <2800000>;
+                regulator-enable-ramp-delay = <216>;
+                regulator-always-on;
+                regulator-boot-on;
+            };
+
+            ldo_vusb {
+                regulator-name = "vusb";
+                regulator-min-microvolt = <3300000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <216>;
+                regulator-boot-on;
+            };
+
+            ldo_vmc {
+                regulator-name = "vmc";
+                regulator-min-microvolt = <1800000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <36>;
+                regulator-boot-on;
+            };
+
+            ldo_vmch {
+                regulator-name = "vmch";
+                regulator-min-microvolt = <3000000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <36>;
+                regulator-boot-on;
+            };
+
+            ldo_vemc3v3 {
+                regulator-name = "vemc3v3";
+                regulator-min-microvolt = <3000000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <36>;
+                regulator-boot-on;
+            };
+
+            ldo_vgp1 {
+                regulator-name = "vgp1";
+                regulator-min-microvolt = <1200000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <216>;
+            };
+
+            ldo_vgp2 {
+                regulator-name = "vgp2";
+                regulator-min-microvolt = <1200000>;
+                regulator-max-microvolt = <3000000>;
+                regulator-enable-ramp-delay = <216>;
+            };
+
+            ldo_vgp3 {
+                regulator-name = "vgp3";
+                regulator-min-microvolt = <1200000>;
+                regulator-max-microvolt = <1800000>;
+                regulator-enable-ramp-delay = <216>;
+            };
+
+            ldo_vcn18 {
+                regulator-name = "vcn18";
+                regulator-min-microvolt = <1800000>;
+                regulator-max-microvolt = <1800000>;
+                regulator-enable-ramp-delay = <216>;
+            };
+
+            ldo_vsim1 {
+                regulator-name = "vsim1";
+                regulator-min-microvolt = <1800000>;
+                regulator-max-microvolt = <3000000>;
+                regulator-enable-ramp-delay = <216>;
+            };
+
+            ldo_vsim2 {
+                regulator-name = "vsim2";
+                regulator-min-microvolt = <1800000>;
+                regulator-max-microvolt = <3000000>;
+                regulator-enable-ramp-delay = <216>;
+            };
+
+            ldo_vrtc {
+                regulator-name = "vrtc";
+                regulator-min-microvolt = <2800000>;
+                regulator-max-microvolt = <2800000>;
+                regulator-always-on;
+                regulator-boot-on;
+            };
+
+            ldo_vcamaf {
+                regulator-name = "vcamaf";
+                regulator-min-microvolt = <1200000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <216>;
+            };
+
+            ldo_vibr {
+                regulator-name = "vibr";
+                regulator-min-microvolt = <1200000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <36>;
+            };
+
+            ldo_vrf18 {
+                regulator-name = "vrf18";
+                regulator-min-microvolt = <1825000>;
+                regulator-max-microvolt = <1825000>;
+                regulator-enable-ramp-delay = <187>;
+            };
+
+            ldo_vm {
+                regulator-name = "vm";
+                regulator-min-microvolt = <1200000>;
+                regulator-max-microvolt = <1800000>;
+                regulator-enable-ramp-delay = <216>;
+                regulator-always-on;
+                regulator-boot-on;
+            };
+
+            ldo_vio18 {
+                regulator-name = "vio18";
+                regulator-min-microvolt = <1800000>;
+                regulator-max-microvolt = <1800000>;
+                regulator-enable-ramp-delay = <216>;
+                regulator-always-on;
+                regulator-boot-on;
+            };
+
+           ldo_vcamd {
+                regulator-name = "vcamd";
+                regulator-min-microvolt = <1200000>;
+                regulator-max-microvolt = <1800000>;
+                regulator-enable-ramp-delay = <216>;
+            };
+
+            ldo_vcamio {
+                regulator-name = "vcamio";
+                regulator-min-microvolt = <1800000>;
+                regulator-max-microvolt = <1800000>;
+                regulator-enable-ramp-delay = <216>;
+            };
+        };
+
+        keys {
+            compatible = "mediatek,mt6323-keys";
+            mediatek,long-press-mode = <1>;
+            power-off-time-sec = <0>;
+
+            power {
+                linux,keycodes = <116>;
+                wakeup-source;
+            };
+
+            home {
+                linux,keycodes = <114>;
+            };
+        };
+
+        power-controller {
+            compatible = "mediatek,mt6323-pwrc";
+            #power-domain-cells = <0>;
+        };
+
+        rtc {
+            compatible = "mediatek,mt6323-rtc";
+        };
+    };
+
+  - |
+    #include <dt-bindings/input/input.h>
+    #include <dt-bindings/interrupt-controller/arm-gic.h>
+
+    pmic {
+        compatible = "mediatek,mt6358";
+        interrupt-controller;
+        #interrupt-cells = <2>;
+
+        audio-codec {
+            compatible = "mediatek,mt6358-sound";
+            Avdd-supply = <&mt6358_vaud28_reg>;
+            mediatek,dmic-mode = <0>;
+        };
+
+        regulators {
+            compatible = "mediatek,mt6358-regulator";
+
+            buck_vdram1 {
+                regulator-name = "vdram1";
+                regulator-min-microvolt = <500000>;
+                regulator-max-microvolt = <2087500>;
+                regulator-ramp-delay = <12500>;
+                regulator-enable-ramp-delay = <0>;
+                regulator-always-on;
+                regulator-allowed-modes = <0 1>;
+            };
+
+            // ...
+
+            ldo_vsim2 {
+                regulator-name = "vsim2";
+                regulator-min-microvolt = <1700000>;
+                regulator-max-microvolt = <3100000>;
+                regulator-enable-ramp-delay = <540>;
+            };
+        };
+
+        rtc {
+            compatible = "mediatek,mt6358-rtc";
+        };
+
+        keys {
+            compatible = "mediatek,mt6358-keys";
+
+            power {
+                linux,keycodes = <KEY_POWER>;
+                wakeup-source;
+            };
+
+            home {
+                linux,keycodes = <KEY_HOME>;
+            };
+        };
+    };
+
+  - |
+    #include <dt-bindings/interrupt-controller/arm-gic.h>
+
+    pmic {
+        compatible = "mediatek,mt6397";
+
+        interrupt-parent = <&pio>;
+        interrupts-extended = <&pio 222 IRQ_TYPE_LEVEL_HIGH>;
+        interrupt-controller;
+        #interrupt-cells = <2>;
+
+        audio-codec {
+            compatible = "mediatek,mt6397-codec";
+        };
+
+        clocks {
+            compatible = "mediatek,mt6397-clk";
+            #clock-cells = <1>;
+        };
+
+        pinctrl {
+            compatible = "mediatek,mt6397-pinctrl";
+            gpio-controller;
+            #gpio-cells = <2>;
+        };
+
+        regulators {
+            compatible = "mediatek,mt6397-regulator";
+
+            buck_vpca15 {
+                regulator-name = "vpca15";
+                regulator-min-microvolt = < 850000>;
+                regulator-max-microvolt = <1350000>;
+                regulator-ramp-delay = <12500>;
+                regulator-enable-ramp-delay = <200>;
+            };
+
+            // ...
+
+            ldo_vibr {
+                regulator-name = "vibr";
+                regulator-min-microvolt = <1200000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <218>;
+            };
+        };
+
+        rtc {
+            compatible = "mediatek,mt6397-rtc";
+        };
+    };
diff --git a/Documentation/devicetree/bindings/mfd/mt6397.txt b/Documentation/devicetree/bindings/mfd/mt6397.txt
deleted file mode 100644
index 10540aa..0000000
--- a/Documentation/devicetree/bindings/mfd/mt6397.txt
+++ /dev/null
@@ -1,110 +0,0 @@
-MediaTek MT6397/MT6323 Multifunction Device Driver
-
-MT6397/MT6323 is a multifunction device with the following sub modules:
-- Regulator
-- RTC
-- Audio codec
-- GPIO
-- Clock
-- LED
-- Keys
-- Power controller
-
-It is interfaced to host controller using SPI interface by a proprietary hardware
-called PMIC wrapper or pwrap. MT6397/MT6323 MFD is a child device of pwrap.
-See the following for pwarp node definitions:
-../soc/mediatek/mediatek,pwrap.yaml
-
-This document describes the binding for MFD device and its sub module.
-
-Required properties:
-compatible:
-	"mediatek,mt6323" for PMIC MT6323
-	"mediatek,mt6331" for PMIC MT6331 and MT6332
-	"mediatek,mt6357" for PMIC MT6357
-	"mediatek,mt6358" for PMIC MT6358
-	"mediatek,mt6359" for PMIC MT6359
-	"mediatek,mt6366", "mediatek,mt6358" for PMIC MT6366
-	"mediatek,mt6397" for PMIC MT6397
-
-Optional subnodes:
-
-- rtc
-	Required properties: Should be one of follows
-		- compatible: "mediatek,mt6323-rtc"
-		- compatible: "mediatek,mt6331-rtc"
-		- compatible: "mediatek,mt6358-rtc"
-		- compatible: "mediatek,mt6397-rtc"
-	For details, see ../rtc/rtc-mt6397.txt
-- regulators
-	Required properties:
-		- compatible: "mediatek,mt6323-regulator"
-	see ../regulator/mt6323-regulator.txt
-		- compatible: "mediatek,mt6358-regulator"
-		- compatible: "mediatek,mt6366-regulator", "mediatek-mt6358-regulator"
-	see ../regulator/mt6358-regulator.txt
-		- compatible: "mediatek,mt6397-regulator"
-	see ../regulator/mt6397-regulator.txt
-- codec
-	Required properties:
-		- compatible: "mediatek,mt6397-codec" or "mediatek,mt6358-sound"
-- clk
-	Required properties:
-		- compatible: "mediatek,mt6397-clk"
-- led
-	Required properties:
-		- compatible: "mediatek,mt6323-led"
-	see ../leds/leds-mt6323.txt
-
-- keys
-	Required properties: Should be one of the following
-		- compatible: "mediatek,mt6323-keys"
-		- compatible: "mediatek,mt6331-keys"
-		- compatible: "mediatek,mt6397-keys"
-	see ../input/mtk-pmic-keys.txt
-
-- power-controller
-	Required properties:
-		- compatible: "mediatek,mt6323-pwrc"
-	For details, see ../power/reset/mt6323-poweroff.txt
-
-- pin-controller
-	Required properties:
-		- compatible: "mediatek,mt6397-pinctrl"
-	For details, see ../pinctrl/pinctrl-mt65xx.txt
-
-Example:
-	pwrap: pwrap at 1000f000 {
-		compatible = "mediatek,mt8135-pwrap";
-
-		...
-
-		pmic {
-			compatible = "mediatek,mt6397";
-
-			codec: mt6397codec {
-				compatible = "mediatek,mt6397-codec";
-			};
-
-			regulators {
-				compatible = "mediatek,mt6397-regulator";
-
-				mt6397_vpca15_reg: buck_vpca15 {
-					regulator-compatible = "buck_vpca15";
-					regulator-name = "vpca15";
-					regulator-min-microvolt = <850000>;
-					regulator-max-microvolt = <1400000>;
-					regulator-ramp-delay = <12500>;
-					regulator-always-on;
-				};
-
-				mt6397_vgp4_reg: ldo_vgp4 {
-					regulator-compatible = "ldo_vgp4";
-					regulator-name = "vgp4";
-					regulator-min-microvolt = <1200000>;
-					regulator-max-microvolt = <3300000>;
-					regulator-enable-ramp-delay = <218>;
-				};
-			};
-		};
-	};
diff --git a/Documentation/devicetree/bindings/power/reset/mt6323-poweroff.txt b/Documentation/devicetree/bindings/power/reset/mt6323-poweroff.txt
deleted file mode 100644
index 933f0c4..0000000
--- a/Documentation/devicetree/bindings/power/reset/mt6323-poweroff.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-Device Tree Bindings for Power Controller on MediaTek PMIC
-
-The power controller which could be found on PMIC is responsible for externally
-powering off or on the remote MediaTek SoC through the circuit BBPU.
-
-Required properties:
-- compatible: Should be one of follows
-       "mediatek,mt6323-pwrc": for MT6323 PMIC
-
-Example:
-
-       pmic {
-               compatible = "mediatek,mt6323";
-
-               ...
-
-               power-controller {
-                       compatible = "mediatek,mt6323-pwrc";
-               };
-       }
diff --git a/Documentation/devicetree/bindings/rtc/rtc-mt6397.txt b/Documentation/devicetree/bindings/rtc/rtc-mt6397.txt
deleted file mode 100644
index 7212076..0000000
--- a/Documentation/devicetree/bindings/rtc/rtc-mt6397.txt
+++ /dev/null
@@ -1,31 +0,0 @@
-Device-Tree bindings for MediaTek PMIC based RTC
-
-MediaTek PMIC based RTC is an independent function of MediaTek PMIC that works
-as a type of multi-function device (MFD). The RTC can be configured and set up
-with PMIC wrapper bus which is a common resource shared with the other
-functions found on the same PMIC.
-
-For MediaTek PMIC MFD bindings, see:
-../mfd/mt6397.txt
-
-For MediaTek PMIC wrapper bus bindings, see:
-../soc/mediatek/pwrap.txt
-
-Required properties:
-- compatible: Should be one of follows
-       "mediatek,mt6323-rtc": for MT6323 PMIC
-       "mediatek,mt6358-rtc": for MT6358 PMIC
-       "mediatek,mt6366-rtc", "mediatek,mt6358-rtc": for MT6366 PMIC
-       "mediatek,mt6397-rtc": for MT6397 PMIC
-
-Example:
-
-       pmic {
-               compatible = "mediatek,mt6323";
-
-               ...
-
-               rtc {
-                       compatible = "mediatek,mt6323-rtc";
-               };
-       };
diff --git a/Documentation/devicetree/bindings/sound/mt6358.txt b/Documentation/devicetree/bindings/sound/mt6358.txt
deleted file mode 100644
index fbe9e55..0000000
--- a/Documentation/devicetree/bindings/sound/mt6358.txt
+++ /dev/null
@@ -1,26 +0,0 @@
-Mediatek MT6358 Audio Codec
-
-The communication between MT6358 and SoC is through Mediatek PMIC wrapper.
-For more detail, please visit Mediatek PMIC wrapper documentation.
-
-Must be a child node of PMIC wrapper.
-
-Required properties:
-
-- compatible - "string" - One of:
-    "mediatek,mt6358-sound"
-    "mediatek,mt6366-sound"
-- Avdd-supply : power source of AVDD
-
-Optional properties:
-- mediatek,dmic-mode : Indicates how many data pins are used to transmit two
-	channels of PDM signal. 0 means two wires, 1 means one wire. Default
-	value is 0.
-
-Example:
-
-mt6358_snd {
-	compatible = "mediatek,mt6358-sound";
-	Avdd-supply = <&mt6358_vaud28_reg>;
-	mediatek,dmic-mode = <0>;
-};
diff --git a/MAINTAINERS b/MAINTAINERS
index 2cdd7ca..e97b5ae 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -14418,10 +14418,12 @@ F:	Documentation/devicetree/bindings/net/bluetooth/mediatek,mt7921s-bluetooth.ya
 F:	drivers/bluetooth/btmtkuart.c
 
 MEDIATEK BOARD LEVEL SHUTDOWN DRIVERS
+M:	Sen Chu <sen.chu at mediatek.com>
 M:	Sean Wang <sean.wang at mediatek.com>
+M:	Macpaul Lin <macpaul.lin at mediatek.com>
 L:	linux-pm at vger.kernel.org
 S:	Maintained
-F:	Documentation/devicetree/bindings/power/reset/mt6323-poweroff.txt
+F:	Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml
 F:	drivers/power/reset/mt6323-poweroff.c
 
 MEDIATEK CIR DRIVER
@@ -14582,9 +14584,11 @@ F:	Documentation/devicetree/bindings/mtd/mediatek,mtk-nfc.yaml
 F:	drivers/mtd/nand/raw/mtk_*
 
 MEDIATEK PMIC LED DRIVER
+M:	Sen Chu <sen.chu at mediatek.com>
 M:	Sean Wang <sean.wang at mediatek.com>
+M:	Macpaul Lin <macpaul.lin at mediatek.com>
 S:	Maintained
-F:	Documentation/devicetree/bindings/leds/leds-mt6323.txt
+F:	Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml
 F:	drivers/leds/leds-mt6323.c
 
 MEDIATEK RANDOM NUMBER GENERATOR SUPPORT
-- 
2.45.2



From treapking at chromium.org  Tue Sep 17 23:59:57 2024
From: treapking at chromium.org (Pin-yen Lin)
Date: Wed, 18 Sep 2024 14:59:57 +0800
Subject: [PATCH] arm64: dts: mediatek: mt8183-kukui: Disable DPI display interface
In-Reply-To: <20240916162956.267340-1-alpernebiyasak@gmail.com>
References: <20240916162956.267340-1-alpernebiyasak@gmail.com>
Message-ID: <CAEXTbpc=ZgF_V9AwxgTTJ8Ki1pb5M7bJ=se2fPE7Qg7s9H7XdA@mail.gmail.com>

On Tue, Sep 17, 2024 at 12:30?AM Alper Nebi Yasak
<alpernebiyasak at gmail.com> wrote:
>
> Commit 009d855a26fd ("arm64: dts: mt8183: add dpi node to mt8183") adds
> a device-tree node for the DPI display interface that feeds the external
> display pipeline, to enable HDMI support on the Pumpkin board.
>
> However, the external display is not fully described on Chrome devices,
> blocked by further work on DP / USB-C muxing graph bindings. This
> incomplete description currently breaks internal display at least on the
> Cozmo board. The same issue was found and fixed on MT8186 devices with
> commit 3079fb09ddac ("arm64: dts: mediatek: mt8186-corsola: Disable DPI
> display interface"), but the MT8183 change wasn't merged until then.
>
> Disable the external display interface for the Kukui device family until
> the necessary work is done, like in the MT8186 Corsola case.
>
> Fixes: 009d855a26fd ("arm64: dts: mt8183: add dpi node to mt8183")
> Link: https://lore.kernel.org/linux-mediatek/20240821042836.2631815-1-wenst at chromium.org/
> Signed-off-by: Alper Nebi Yasak <alpernebiyasak at gmail.com>
> ---
>
>  arch/arm64/boot/dts/mediatek/mt8183-kukui.dtsi | 5 +++++
>  1 file changed, 5 insertions(+)
>
> diff --git a/arch/arm64/boot/dts/mediatek/mt8183-kukui.dtsi b/arch/arm64/boot/dts/mediatek/mt8183-kukui.dtsi
> index 22924f61ec9e..07ae3c8e897b 100644
> --- a/arch/arm64/boot/dts/mediatek/mt8183-kukui.dtsi
> +++ b/arch/arm64/boot/dts/mediatek/mt8183-kukui.dtsi
> @@ -290,6 +290,11 @@ dsi_out: endpoint {
>         };
>  };
>
> +&dpi0 {
> +       /* TODO Re-enable after DP to Type-C port muxing can be described */
> +       status = "disabled";
> +};
> +
>  &gic {
>         mediatek,broken-save-restore-fw;
>  };
>
> base-commit: 7083504315d64199a329de322fce989e1e10f4f7
> --
> 2.45.2
>
Reviewed-by: Pin-yen Lin <treapking at chromium.org>

Thanks for fixing this!


From angelogioacchino.delregno at collabora.com  Wed Sep 18 01:08:02 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Wed, 18 Sep 2024 10:08:02 +0200
Subject: [PATCH v2 1/2] PCI: mediatek-gen3: Add support for setting
 max-link-speed limit
In-Reply-To: <CAC=S1nhp_3EfG7g7GyLHQGPk_2mrfzj3Kqgi4u_gsA7-Wq8Zgg@mail.gmail.com>
References: <20240917091132.286582-1-angelogioacchino.delregno@collabora.com>
 <20240917091132.286582-2-angelogioacchino.delregno@collabora.com>
 <CAC=S1nhp_3EfG7g7GyLHQGPk_2mrfzj3Kqgi4u_gsA7-Wq8Zgg@mail.gmail.com>
Message-ID: <8186d78e-2aa8-436e-be76-412860a3105a@collabora.com>

Il 17/09/24 18:15, Fei Shao ha scritto:
> On Tue, Sep 17, 2024 at 5:13?PM AngeloGioacchino Del Regno
> <angelogioacchino.delregno at collabora.com> wrote:
>>
>> Add support for respecting the max-link-speed devicetree property,
>> forcing a maximum speed (Gen) for a PCI-Express port.
>>
>> Since the MediaTek PCIe Gen3 controllers also expose the maximum
>> supported link speed in the PCIE_BASE_CFG register, if property
>> max-link-speed is specified in devicetree, validate it against the
>> controller capabilities and proceed setting the limitations only
>> if the wanted Gen is lower than the maximum one that is supported
>> by the controller itself (otherwise it makes no sense!).
>>
>> Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
>> ---
>>   drivers/pci/controller/pcie-mediatek-gen3.c | 55 ++++++++++++++++++++-
>>   1 file changed, 53 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/pci/controller/pcie-mediatek-gen3.c b/drivers/pci/controller/pcie-mediatek-gen3.c
>> index 66ce4b5d309b..e1d1fb39d5c6 100644
>> --- a/drivers/pci/controller/pcie-mediatek-gen3.c
>> +++ b/drivers/pci/controller/pcie-mediatek-gen3.c
>> @@ -28,7 +28,11 @@
>>
>>   #include "../pci.h"
>>
>> +#define PCIE_BASE_CFG_REG              0x14
>> +#define PCIE_BASE_CFG_SPEED_MASK       GENMASK(15, 8)
>> +
>>   #define PCIE_SETTING_REG               0x80
>> +#define PCIE_SETTING_GEN_SUPPORT_MASK  GENMASK(14, 12)
>>   #define PCIE_PCI_IDS_1                 0x9c
>>   #define PCI_CLASS(class)               (class << 8)
>>   #define PCIE_RC_MODE                   BIT(0)
>> @@ -125,6 +129,9 @@
>>
>>   struct mtk_gen3_pcie;
>>
>> +#define PCIE_CONF_LINK2_CTL_STS                0x10b0
>> +#define PCIE_CONF_LINK2_LCR2_LINK_SPEED        GENMASK(3, 0)
>> +
>>   /**
>>    * struct mtk_gen3_pcie_pdata - differentiate between host generations
>>    * @power_up: pcie power_up callback
>> @@ -160,6 +167,7 @@ struct mtk_msi_set {
>>    * @phy: PHY controller block
>>    * @clks: PCIe clocks
>>    * @num_clks: PCIe clocks count for this port
>> + * @max_link_speed: Maximum link speed (PCIe Gen) for this port
>>    * @irq: PCIe controller interrupt number
>>    * @saved_irq_state: IRQ enable state saved at suspend time
>>    * @irq_lock: lock protecting IRQ register access
>> @@ -180,6 +188,7 @@ struct mtk_gen3_pcie {
>>          struct phy *phy;
>>          struct clk_bulk_data *clks;
>>          int num_clks;
>> +       u8 max_link_speed;
>>
>>          int irq;
>>          u32 saved_irq_state;
>> @@ -381,11 +390,27 @@ static int mtk_pcie_startup_port(struct mtk_gen3_pcie *pcie)
>>          int err;
>>          u32 val;
>>
>> -       /* Set as RC mode */
>> +       /* Set as RC mode and set controller PCIe Gen speed restriction, if any*/
> 
> NIt: one space before ending the comment.
> 

Yep. :-)

>>          val = readl_relaxed(pcie->base + PCIE_SETTING_REG);
>>          val |= PCIE_RC_MODE;
>> +       if (pcie->max_link_speed) {
>> +               val &= ~PCIE_SETTING_GEN_SUPPORT_MASK;
>> +
>> +               /* Can enable link speed support only from Gen2 onwards */
>> +               if (pcie->max_link_speed >= 2)
>> +                       val |= FIELD_PREP(PCIE_SETTING_GEN_SUPPORT_MASK,
>> +                                         GENMASK(pcie->max_link_speed - 2, 0));
>> +       }
>>          writel_relaxed(val, pcie->base + PCIE_SETTING_REG);
>>
>> +       /* Set Link Control 2 (LNKCTL2) speed restriction, if any */
>> +       if (pcie->max_link_speed) {
>> +               val = readl_relaxed(pcie->base + PCIE_CONF_LINK2_CTL_STS);
>> +               val &= PCIE_CONF_LINK2_LCR2_LINK_SPEED;
> 
> I guess it needs a bitwise NOT operator over the mask.
>      val &= ~PCIE_CONF_LINK2_LCR2_LINK_SPEED;
> 

I have no idea how the NOT disappeared from this line :o
Nice catch.

> Apart from that, I think appending _MASK to the name makes its usage
> clearer and consistent with other masks.
> (although the name gets even more lengthy...)

Actually, the only other ones that say _MASK are the ones that I am introducing
in this commit, other than PCIE_LTSSM_STATE_MASK... all of the others do *not*
have the _MASK suffix.

At this point, for consistency, I should rather drop the _MASK suffix from the
PCIE_BASE_CFG_SPEED and PCIE_SETTING_GEN_SUPPORT definitions that I introduce
here, so I'll do exactly that for v3.

> 
>> +               val |= FIELD_PREP(PCIE_CONF_LINK2_LCR2_LINK_SPEED, pcie->max_link_speed);
>> +               writel_relaxed(val, pcie->base + PCIE_CONF_LINK2_CTL_STS);
>> +       }
>> +
>>          /* Set class code */
>>          val = readl_relaxed(pcie->base + PCIE_PCI_IDS_1);
>>          val &= ~GENMASK(31, 8);
>> @@ -1004,9 +1029,21 @@ static void mtk_pcie_power_down(struct mtk_gen3_pcie *pcie)
>>          reset_control_bulk_assert(pcie->soc->phy_resets.num_resets, pcie->phy_resets);
>>   }
>>
>> +static int mtk_pcie_get_controller_max_link_speed(struct mtk_gen3_pcie *pcie)
>> +{
>> +       u32 val;
>> +       int ret;
>> +
>> +       val = readl_relaxed(pcie->base + PCIE_BASE_CFG_REG);
>> +       val = FIELD_GET(PCIE_BASE_CFG_SPEED_MASK, val);
>> +       ret = fls(val);
>> +
>> +       return ret > 0 ? ret : -EINVAL;
>> +}
>> +
>>   static int mtk_pcie_setup(struct mtk_gen3_pcie *pcie)
>>   {
>> -       int err;
>> +       int max_speed, err;

Self-review: reorder this, e comes before m. Oops!

>>
>>          err = mtk_pcie_parse_port(pcie);
>>          if (err)
>> @@ -1031,6 +1068,20 @@ static int mtk_pcie_setup(struct mtk_gen3_pcie *pcie)
>>          if (err)
>>                  return err;
>>
>> +       err = of_pci_get_max_link_speed(pcie->dev->of_node);
>> +       if (err > 0) {
>> +               /* Get the maximum speed supported by the controller */
>> +               max_speed = mtk_pcie_get_controller_max_link_speed(pcie);
>> +
>> +               /* Set max_link_speed only if the controller supports it */
>> +               if (max_speed >= 0 && max_speed <= err) {
>> +                       pcie->max_link_speed = err;
>> +                       dev_dbg(pcie->dev,
>> +                               "Max controller link speed Gen%u, override to Gen%u",
>> +                               max_speed, pcie->max_link_speed);
> 
> Convert max_speed to an unsigned type to avoid potential typecheck warnings?
> 

I'll just change that to "[...] Gen%d, override to Gen%u", looks simply
cleaner, in the end...

Thanks!
Angelo

> Regards,
> Fei
> 
> 
>> +               }
>> +       }
>> +
>>          /* Try link up */
>>          err = mtk_pcie_startup_port(pcie);
>>          if (err)
>> --
>> 2.46.0
>>
>>




From angelogioacchino.delregno at collabora.com  Wed Sep 18 01:13:05 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Wed, 18 Sep 2024 10:13:05 +0200
Subject: [PATCH v3 0/2] PCI: mediatek-gen3: Support limiting link speed and width
Message-ID: <20240918081307.51264-1-angelogioacchino.delregno@collabora.com>

Changes in v3:
 - Addressed comments from Fei Shao's review on v2

Changes in v2:
 - Rebased on next-20240917

This series adds support for limiting the PCI-Express link speed
(or PCIe gen restriction) and link width (number of lanes) in the
pcie-mediatek-gen3 driver.

The maximum supported pcie gen is read from the controller itself,
so defining a max gen through platform data for each SoC is avoided.

Both are done by adding support for the standard devicetree properties
`max-link-speed` and `num-lanes`.

Please note that changing the bindings is not required, as those do
already allow specifying those properties for this controller.

AngeloGioacchino Del Regno (2):
  PCI: mediatek-gen3: Add support for setting max-link-speed limit
  PCI: mediatek-gen3: Add support for restricting link width

 drivers/pci/controller/pcie-mediatek-gen3.c | 75 ++++++++++++++++++++-
 1 file changed, 73 insertions(+), 2 deletions(-)

-- 
2.46.0



From angelogioacchino.delregno at collabora.com  Wed Sep 18 01:13:06 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Wed, 18 Sep 2024 10:13:06 +0200
Subject: [PATCH v3 1/2] PCI: mediatek-gen3: Add support for setting max-link-speed limit
In-Reply-To: <20240918081307.51264-1-angelogioacchino.delregno@collabora.com>
References: <20240918081307.51264-1-angelogioacchino.delregno@collabora.com>
Message-ID: <20240918081307.51264-2-angelogioacchino.delregno@collabora.com>

Add support for respecting the max-link-speed devicetree property,
forcing a maximum speed (Gen) for a PCI-Express port.

Since the MediaTek PCIe Gen3 controllers also expose the maximum
supported link speed in the PCIE_BASE_CFG register, if property
max-link-speed is specified in devicetree, validate it against the
controller capabilities and proceed setting the limitations only
if the wanted Gen is lower than the maximum one that is supported
by the controller itself (otherwise it makes no sense!).

Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
---
 drivers/pci/controller/pcie-mediatek-gen3.c | 55 ++++++++++++++++++++-
 1 file changed, 53 insertions(+), 2 deletions(-)

diff --git a/drivers/pci/controller/pcie-mediatek-gen3.c b/drivers/pci/controller/pcie-mediatek-gen3.c
index 66ce4b5d309b..8d4b045633da 100644
--- a/drivers/pci/controller/pcie-mediatek-gen3.c
+++ b/drivers/pci/controller/pcie-mediatek-gen3.c
@@ -28,7 +28,11 @@
 
 #include "../pci.h"
 
+#define PCIE_BASE_CFG_REG		0x14
+#define PCIE_BASE_CFG_SPEED		GENMASK(15, 8)
+
 #define PCIE_SETTING_REG		0x80
+#define PCIE_SETTING_GEN_SUPPORT	GENMASK(14, 12)
 #define PCIE_PCI_IDS_1			0x9c
 #define PCI_CLASS(class)		(class << 8)
 #define PCIE_RC_MODE			BIT(0)
@@ -125,6 +129,9 @@
 
 struct mtk_gen3_pcie;
 
+#define PCIE_CONF_LINK2_CTL_STS		0x10b0
+#define PCIE_CONF_LINK2_LCR2_LINK_SPEED	GENMASK(3, 0)
+
 /**
  * struct mtk_gen3_pcie_pdata - differentiate between host generations
  * @power_up: pcie power_up callback
@@ -160,6 +167,7 @@ struct mtk_msi_set {
  * @phy: PHY controller block
  * @clks: PCIe clocks
  * @num_clks: PCIe clocks count for this port
+ * @max_link_speed: Maximum link speed (PCIe Gen) for this port
  * @irq: PCIe controller interrupt number
  * @saved_irq_state: IRQ enable state saved at suspend time
  * @irq_lock: lock protecting IRQ register access
@@ -180,6 +188,7 @@ struct mtk_gen3_pcie {
 	struct phy *phy;
 	struct clk_bulk_data *clks;
 	int num_clks;
+	u8 max_link_speed;
 
 	int irq;
 	u32 saved_irq_state;
@@ -381,11 +390,27 @@ static int mtk_pcie_startup_port(struct mtk_gen3_pcie *pcie)
 	int err;
 	u32 val;
 
-	/* Set as RC mode */
+	/* Set as RC mode and set controller PCIe Gen speed restriction, if any */
 	val = readl_relaxed(pcie->base + PCIE_SETTING_REG);
 	val |= PCIE_RC_MODE;
+	if (pcie->max_link_speed) {
+		val &= ~PCIE_SETTING_GEN_SUPPORT;
+
+		/* Can enable link speed support only from Gen2 onwards */
+		if (pcie->max_link_speed >= 2)
+			val |= FIELD_PREP(PCIE_SETTING_GEN_SUPPORT,
+					  GENMASK(pcie->max_link_speed - 2, 0));
+	}
 	writel_relaxed(val, pcie->base + PCIE_SETTING_REG);
 
+	/* Set Link Control 2 (LNKCTL2) speed restriction, if any */
+	if (pcie->max_link_speed) {
+		val = readl_relaxed(pcie->base + PCIE_CONF_LINK2_CTL_STS);
+		val &= ~PCIE_CONF_LINK2_LCR2_LINK_SPEED;
+		val |= FIELD_PREP(PCIE_CONF_LINK2_LCR2_LINK_SPEED, pcie->max_link_speed);
+		writel_relaxed(val, pcie->base + PCIE_CONF_LINK2_CTL_STS);
+	}
+
 	/* Set class code */
 	val = readl_relaxed(pcie->base + PCIE_PCI_IDS_1);
 	val &= ~GENMASK(31, 8);
@@ -1004,9 +1029,21 @@ static void mtk_pcie_power_down(struct mtk_gen3_pcie *pcie)
 	reset_control_bulk_assert(pcie->soc->phy_resets.num_resets, pcie->phy_resets);
 }
 
+static int mtk_pcie_get_controller_max_link_speed(struct mtk_gen3_pcie *pcie)
+{
+	u32 val;
+	int ret;
+
+	val = readl_relaxed(pcie->base + PCIE_BASE_CFG_REG);
+	val = FIELD_GET(PCIE_BASE_CFG_SPEED, val);
+	ret = fls(val);
+
+	return ret > 0 ? ret : -EINVAL;
+}
+
 static int mtk_pcie_setup(struct mtk_gen3_pcie *pcie)
 {
-	int err;
+	int err, max_speed;
 
 	err = mtk_pcie_parse_port(pcie);
 	if (err)
@@ -1031,6 +1068,20 @@ static int mtk_pcie_setup(struct mtk_gen3_pcie *pcie)
 	if (err)
 		return err;
 
+	err = of_pci_get_max_link_speed(pcie->dev->of_node);
+	if (err > 0) {
+		/* Get the maximum speed supported by the controller */
+		max_speed = mtk_pcie_get_controller_max_link_speed(pcie);
+
+		/* Set max_link_speed only if the controller supports it */
+		if (max_speed >= 0 && max_speed <= err) {
+			pcie->max_link_speed = err;
+			dev_dbg(pcie->dev,
+				"Max controller link speed Gen%d, override to Gen%u",
+				max_speed, pcie->max_link_speed);
+		}
+	}
+
 	/* Try link up */
 	err = mtk_pcie_startup_port(pcie);
 	if (err)
-- 
2.46.0



From angelogioacchino.delregno at collabora.com  Wed Sep 18 01:13:07 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Wed, 18 Sep 2024 10:13:07 +0200
Subject: [PATCH v3 2/2] PCI: mediatek-gen3: Add support for restricting link width
In-Reply-To: <20240918081307.51264-1-angelogioacchino.delregno@collabora.com>
References: <20240918081307.51264-1-angelogioacchino.delregno@collabora.com>
Message-ID: <20240918081307.51264-3-angelogioacchino.delregno@collabora.com>

Add support for restricting the port's link width by specifying
the num-lanes devicetree property in the PCIe node.

The setting is done in the GEN_SETTINGS register (in the driver
named as PCIE_SETTING_REG), where each set bit in [11:8] activates
a set of lanes (from bits 11 to 8 respectively, x16/x8/x4/x2).

Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
---
 drivers/pci/controller/pcie-mediatek-gen3.c | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/drivers/pci/controller/pcie-mediatek-gen3.c b/drivers/pci/controller/pcie-mediatek-gen3.c
index 8d4b045633da..8dd2e5135b01 100644
--- a/drivers/pci/controller/pcie-mediatek-gen3.c
+++ b/drivers/pci/controller/pcie-mediatek-gen3.c
@@ -32,6 +32,7 @@
 #define PCIE_BASE_CFG_SPEED		GENMASK(15, 8)
 
 #define PCIE_SETTING_REG		0x80
+#define PCIE_SETTING_LINK_WIDTH		GENMASK(11, 8)
 #define PCIE_SETTING_GEN_SUPPORT	GENMASK(14, 12)
 #define PCIE_PCI_IDS_1			0x9c
 #define PCI_CLASS(class)		(class << 8)
@@ -168,6 +169,7 @@ struct mtk_msi_set {
  * @clks: PCIe clocks
  * @num_clks: PCIe clocks count for this port
  * @max_link_speed: Maximum link speed (PCIe Gen) for this port
+ * @num_lanes: Number of PCIe lanes for this port
  * @irq: PCIe controller interrupt number
  * @saved_irq_state: IRQ enable state saved at suspend time
  * @irq_lock: lock protecting IRQ register access
@@ -189,6 +191,7 @@ struct mtk_gen3_pcie {
 	struct clk_bulk_data *clks;
 	int num_clks;
 	u8 max_link_speed;
+	u8 num_lanes;
 
 	int irq;
 	u32 saved_irq_state;
@@ -401,6 +404,14 @@ static int mtk_pcie_startup_port(struct mtk_gen3_pcie *pcie)
 			val |= FIELD_PREP(PCIE_SETTING_GEN_SUPPORT,
 					  GENMASK(pcie->max_link_speed - 2, 0));
 	}
+	if (pcie->num_lanes) {
+		val &= ~PCIE_SETTING_LINK_WIDTH;
+
+		/* Zero means one lane, each bit activates x2/x4/x8/x16 */
+		if (pcie->num_lanes > 1)
+			val |= FIELD_PREP(PCIE_SETTING_LINK_WIDTH,
+					  GENMASK(pcie->num_lanes >> 1, 0));
+	};
 	writel_relaxed(val, pcie->base + PCIE_SETTING_REG);
 
 	/* Set Link Control 2 (LNKCTL2) speed restriction, if any */
@@ -838,6 +849,7 @@ static int mtk_pcie_parse_port(struct mtk_gen3_pcie *pcie)
 	struct device *dev = pcie->dev;
 	struct platform_device *pdev = to_platform_device(dev);
 	struct resource *regs;
+	u32 num_lanes;
 
 	regs = platform_get_resource_byname(pdev, IORESOURCE_MEM, "pcie-mac");
 	if (!regs)
@@ -883,6 +895,14 @@ static int mtk_pcie_parse_port(struct mtk_gen3_pcie *pcie)
 		return pcie->num_clks;
 	}
 
+	ret = of_property_read_u32(dev->of_node, "num-lanes", &num_lanes);
+	if (ret == 0) {
+		if (num_lanes == 0 || num_lanes > 16 || (num_lanes != 1 && num_lanes % 2))
+			dev_warn(dev, "Invalid num-lanes, using controller defaults\n");
+		else
+			pcie->num_lanes = num_lanes;
+	}
+
 	return 0;
 }
 
-- 
2.46.0



From angelogioacchino.delregno at collabora.com  Wed Sep 18 03:06:18 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Wed, 18 Sep 2024 12:06:18 +0200
Subject: [PATCH v1 1/3] soc: mediatek: mtk-cmdq: Move mask build and append to function
In-Reply-To: <20240918100620.103536-1-angelogioacchino.delregno@collabora.com>
References: <20240918100620.103536-1-angelogioacchino.delregno@collabora.com>
Message-ID: <20240918100620.103536-2-angelogioacchino.delregno@collabora.com>

Move the CMDQ_CODE_MASK packet build and append logic to a new
cmdq_pkt_mask() function; this reduces code duplication by 4x.

Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
---
 drivers/soc/mediatek/mtk-cmdq-helper.c | 31 ++++++++++++--------------
 1 file changed, 14 insertions(+), 17 deletions(-)

diff --git a/drivers/soc/mediatek/mtk-cmdq-helper.c b/drivers/soc/mediatek/mtk-cmdq-helper.c
index a8fccedba83f..620c371fd1fc 100644
--- a/drivers/soc/mediatek/mtk-cmdq-helper.c
+++ b/drivers/soc/mediatek/mtk-cmdq-helper.c
@@ -180,6 +180,15 @@ static int cmdq_pkt_append_command(struct cmdq_pkt *pkt,
 	return 0;
 }
 
+static int cmdq_pkt_mask(struct cmdq_pkt *pkt, u32 mask)
+{
+	struct cmdq_instruction inst = {
+		.op = CMDQ_CODE_MASK,
+		.mask = ~mask
+	};
+	return cmdq_pkt_append_command(pkt, inst);
+}
+
 int cmdq_pkt_write(struct cmdq_pkt *pkt, u8 subsys, u16 offset, u32 value)
 {
 	struct cmdq_instruction inst;
@@ -196,14 +205,11 @@ EXPORT_SYMBOL(cmdq_pkt_write);
 int cmdq_pkt_write_mask(struct cmdq_pkt *pkt, u8 subsys,
 			u16 offset, u32 value, u32 mask)
 {
-	struct cmdq_instruction inst = { {0} };
 	u16 offset_mask = offset;
 	int err;
 
 	if (mask != 0xffffffff) {
-		inst.op = CMDQ_CODE_MASK;
-		inst.mask = ~mask;
-		err = cmdq_pkt_append_command(pkt, inst);
+		err = cmdq_pkt_mask(pkt, mask);
 		if (err < 0)
 			return err;
 
@@ -251,9 +257,7 @@ int cmdq_pkt_write_s_mask(struct cmdq_pkt *pkt, u16 high_addr_reg_idx,
 	struct cmdq_instruction inst = {};
 	int err;
 
-	inst.op = CMDQ_CODE_MASK;
-	inst.mask = ~mask;
-	err = cmdq_pkt_append_command(pkt, inst);
+	err = cmdq_pkt_mask(pkt, mask);
 	if (err < 0)
 		return err;
 
@@ -288,9 +292,7 @@ int cmdq_pkt_write_s_mask_value(struct cmdq_pkt *pkt, u8 high_addr_reg_idx,
 	struct cmdq_instruction inst = {};
 	int err;
 
-	inst.op = CMDQ_CODE_MASK;
-	inst.mask = ~mask;
-	err = cmdq_pkt_append_command(pkt, inst);
+	err = cmdq_pkt_mask(pkt, mask);
 	if (err < 0)
 		return err;
 
@@ -409,12 +411,9 @@ EXPORT_SYMBOL(cmdq_pkt_poll);
 int cmdq_pkt_poll_mask(struct cmdq_pkt *pkt, u8 subsys,
 		       u16 offset, u32 value, u32 mask)
 {
-	struct cmdq_instruction inst = { {0} };
 	int err;
 
-	inst.op = CMDQ_CODE_MASK;
-	inst.mask = ~mask;
-	err = cmdq_pkt_append_command(pkt, inst);
+	err = cmdq_pkt_mask(pkt, mask);
 	if (err < 0)
 		return err;
 
@@ -436,9 +435,7 @@ int cmdq_pkt_poll_addr(struct cmdq_pkt *pkt, dma_addr_t addr, u32 value, u32 mas
 	 * which enables use_mask bit.
 	 */
 	if (mask != GENMASK(31, 0)) {
-		inst.op = CMDQ_CODE_MASK;
-		inst.mask = ~mask;
-		ret = cmdq_pkt_append_command(pkt, inst);
+		ret = cmdq_pkt_mask(pkt, mask);
 		if (ret < 0)
 			return ret;
 		use_mask = CMDQ_POLL_ENABLE_MASK;
-- 
2.46.0



From angelogioacchino.delregno at collabora.com  Wed Sep 18 03:06:17 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Wed, 18 Sep 2024 12:06:17 +0200
Subject: [PATCH v1 0/3] soc: mediatek: mtk-cmdq-helper: Various cleanups
Message-ID: <20240918100620.103536-1-angelogioacchino.delregno@collabora.com>

This series performs various cleanups to the MediaTek CMDQ Helper lib,
reducing code duplication and enhancing human readability.

This also avoids double initialization struct cmdq_instruction as,
in some cases, it was stack-initialized to zero and then overwritten
completely anyway a bit later.
I'd expect compilers to be somehow smart about that, but still, while
at it ... why not :-)

Tested on MT8192 Asurada, MT8195 Tomato Chromebooks.

AngeloGioacchino Del Regno (3):
  soc: mediatek: mtk-cmdq: Move mask build and append to function
  soc: mediatek: mtk-cmdq: Mark very unlikely branches as such
  soc: mediatek: mtk-cmdq: Move cmdq_instruction init to declaration

 drivers/soc/mediatek/mtk-cmdq-helper.c | 241 ++++++++++++-------------
 1 file changed, 112 insertions(+), 129 deletions(-)

-- 
2.46.0



From angelogioacchino.delregno at collabora.com  Wed Sep 18 03:06:19 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Wed, 18 Sep 2024 12:06:19 +0200
Subject: [PATCH v1 2/3] soc: mediatek: mtk-cmdq: Mark very unlikely branches as such
In-Reply-To: <20240918100620.103536-1-angelogioacchino.delregno@collabora.com>
References: <20240918100620.103536-1-angelogioacchino.delregno@collabora.com>
Message-ID: <20240918100620.103536-3-angelogioacchino.delregno@collabora.com>

Calling cmdq packet builders with an unsupported event number,
or without left/right operands (in the case of logic commands)
means that the caller (another driver) wants to perform an
unsupported operation, so this means that the caller must be
fixed instead.

Anyway, such checks are here for safety and, unless any driver
bug or any kind of misconfiguration is present, will always be
false so add a very unlikely hint for those.

Knowing that CPUs' branch predictors (and compilers, anyway) are
indeed smart about these cases, this is done mainly for human
readability purposes.

Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
---
 drivers/soc/mediatek/mtk-cmdq-helper.c | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/drivers/soc/mediatek/mtk-cmdq-helper.c b/drivers/soc/mediatek/mtk-cmdq-helper.c
index 620c371fd1fc..4ffd1a35df87 100644
--- a/drivers/soc/mediatek/mtk-cmdq-helper.c
+++ b/drivers/soc/mediatek/mtk-cmdq-helper.c
@@ -336,7 +336,7 @@ int cmdq_pkt_wfe(struct cmdq_pkt *pkt, u16 event, bool clear)
 	struct cmdq_instruction inst = { {0} };
 	u32 clear_option = clear ? CMDQ_WFE_UPDATE : 0;
 
-	if (event >= CMDQ_MAX_EVENT)
+	if (unlikely(event >= CMDQ_MAX_EVENT))
 		return -EINVAL;
 
 	inst.op = CMDQ_CODE_WFE;
@@ -351,7 +351,7 @@ int cmdq_pkt_acquire_event(struct cmdq_pkt *pkt, u16 event)
 {
 	struct cmdq_instruction inst = {};
 
-	if (event >= CMDQ_MAX_EVENT)
+	if (unlikely(event >= CMDQ_MAX_EVENT))
 		return -EINVAL;
 
 	inst.op = CMDQ_CODE_WFE;
@@ -366,7 +366,7 @@ int cmdq_pkt_clear_event(struct cmdq_pkt *pkt, u16 event)
 {
 	struct cmdq_instruction inst = { {0} };
 
-	if (event >= CMDQ_MAX_EVENT)
+	if (unlikely(event >= CMDQ_MAX_EVENT))
 		return -EINVAL;
 
 	inst.op = CMDQ_CODE_WFE;
@@ -381,7 +381,7 @@ int cmdq_pkt_set_event(struct cmdq_pkt *pkt, u16 event)
 {
 	struct cmdq_instruction inst = {};
 
-	if (event >= CMDQ_MAX_EVENT)
+	if (unlikely(event >= CMDQ_MAX_EVENT))
 		return -EINVAL;
 
 	inst.op = CMDQ_CODE_WFE;
@@ -476,7 +476,7 @@ int cmdq_pkt_logic_command(struct cmdq_pkt *pkt, u16 result_reg_idx,
 {
 	struct cmdq_instruction inst = { {0} };
 
-	if (!left_operand || !right_operand || s_op >= CMDQ_LOGIC_MAX)
+	if (unlikely(!left_operand || !right_operand || s_op >= CMDQ_LOGIC_MAX))
 		return -EINVAL;
 
 	inst.op = CMDQ_CODE_LOGIC;
-- 
2.46.0



From angelogioacchino.delregno at collabora.com  Wed Sep 18 03:06:20 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Wed, 18 Sep 2024 12:06:20 +0200
Subject: [PATCH v1 3/3] soc: mediatek: mtk-cmdq: Move cmdq_instruction init to declaration
In-Reply-To: <20240918100620.103536-1-angelogioacchino.delregno@collabora.com>
References: <20240918100620.103536-1-angelogioacchino.delregno@collabora.com>
Message-ID: <20240918100620.103536-4-angelogioacchino.delregno@collabora.com>

Move, where possible, the initialization of struct cmdq_instruction
variables to their declaration to compress the code.

While at it, also change an instance of open-coded mask to use the
GENMASK() macro instead, and instances of `ret = func(); return ret;`
to the equivalent (but shorter) `return func()`.

Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
---
 drivers/soc/mediatek/mtk-cmdq-helper.c | 200 ++++++++++++-------------
 1 file changed, 93 insertions(+), 107 deletions(-)

diff --git a/drivers/soc/mediatek/mtk-cmdq-helper.c b/drivers/soc/mediatek/mtk-cmdq-helper.c
index 4ffd1a35df87..0b274b0fb44f 100644
--- a/drivers/soc/mediatek/mtk-cmdq-helper.c
+++ b/drivers/soc/mediatek/mtk-cmdq-helper.c
@@ -191,13 +191,12 @@ static int cmdq_pkt_mask(struct cmdq_pkt *pkt, u32 mask)
 
 int cmdq_pkt_write(struct cmdq_pkt *pkt, u8 subsys, u16 offset, u32 value)
 {
-	struct cmdq_instruction inst;
-
-	inst.op = CMDQ_CODE_WRITE;
-	inst.value = value;
-	inst.offset = offset;
-	inst.subsys = subsys;
-
+	struct cmdq_instruction inst = {
+		.op = CMDQ_CODE_WRITE,
+		.value = value,
+		.offset = offset,
+		.subsys = subsys
+	};
 	return cmdq_pkt_append_command(pkt, inst);
 }
 EXPORT_SYMBOL(cmdq_pkt_write);
@@ -208,30 +207,27 @@ int cmdq_pkt_write_mask(struct cmdq_pkt *pkt, u8 subsys,
 	u16 offset_mask = offset;
 	int err;
 
-	if (mask != 0xffffffff) {
+	if (mask != GENMASK(31, 0)) {
 		err = cmdq_pkt_mask(pkt, mask);
 		if (err < 0)
 			return err;
 
 		offset_mask |= CMDQ_WRITE_ENABLE_MASK;
 	}
-	err = cmdq_pkt_write(pkt, subsys, offset_mask, value);
-
-	return err;
+	return cmdq_pkt_write(pkt, subsys, offset_mask, value);
 }
 EXPORT_SYMBOL(cmdq_pkt_write_mask);
 
 int cmdq_pkt_read_s(struct cmdq_pkt *pkt, u16 high_addr_reg_idx, u16 addr_low,
 		    u16 reg_idx)
 {
-	struct cmdq_instruction inst = {};
-
-	inst.op = CMDQ_CODE_READ_S;
-	inst.dst_t = CMDQ_REG_TYPE;
-	inst.sop = high_addr_reg_idx;
-	inst.reg_dst = reg_idx;
-	inst.src_reg = addr_low;
-
+	struct cmdq_instruction inst = {
+		.op = CMDQ_CODE_READ_S,
+		.dst_t = CMDQ_REG_TYPE,
+		.sop = high_addr_reg_idx,
+		.reg_dst = reg_idx,
+		.src_reg = addr_low
+	};
 	return cmdq_pkt_append_command(pkt, inst);
 }
 EXPORT_SYMBOL(cmdq_pkt_read_s);
@@ -239,14 +235,14 @@ EXPORT_SYMBOL(cmdq_pkt_read_s);
 int cmdq_pkt_write_s(struct cmdq_pkt *pkt, u16 high_addr_reg_idx,
 		     u16 addr_low, u16 src_reg_idx)
 {
-	struct cmdq_instruction inst = {};
-
-	inst.op = CMDQ_CODE_WRITE_S;
-	inst.src_t = CMDQ_REG_TYPE;
-	inst.sop = high_addr_reg_idx;
-	inst.offset = addr_low;
-	inst.src_reg = src_reg_idx;
-
+	struct cmdq_instruction inst = {
+		.op = CMDQ_CODE_WRITE_S,
+		.mask = 0,
+		.src_t = CMDQ_REG_TYPE,
+		.sop = high_addr_reg_idx,
+		.offset = addr_low,
+		.src_reg = src_reg_idx
+	};
 	return cmdq_pkt_append_command(pkt, inst);
 }
 EXPORT_SYMBOL(cmdq_pkt_write_s);
@@ -254,20 +250,19 @@ EXPORT_SYMBOL(cmdq_pkt_write_s);
 int cmdq_pkt_write_s_mask(struct cmdq_pkt *pkt, u16 high_addr_reg_idx,
 			  u16 addr_low, u16 src_reg_idx, u32 mask)
 {
-	struct cmdq_instruction inst = {};
+	struct cmdq_instruction inst = {
+		.op = CMDQ_CODE_WRITE_S_MASK,
+		.src_t = CMDQ_REG_TYPE,
+		.sop = high_addr_reg_idx,
+		.offset = addr_low,
+		.src_reg = src_reg_idx,
+	};
 	int err;
 
 	err = cmdq_pkt_mask(pkt, mask);
 	if (err < 0)
 		return err;
 
-	inst.mask = 0;
-	inst.op = CMDQ_CODE_WRITE_S_MASK;
-	inst.src_t = CMDQ_REG_TYPE;
-	inst.sop = high_addr_reg_idx;
-	inst.offset = addr_low;
-	inst.src_reg = src_reg_idx;
-
 	return cmdq_pkt_append_command(pkt, inst);
 }
 EXPORT_SYMBOL(cmdq_pkt_write_s_mask);
@@ -275,13 +270,12 @@ EXPORT_SYMBOL(cmdq_pkt_write_s_mask);
 int cmdq_pkt_write_s_value(struct cmdq_pkt *pkt, u8 high_addr_reg_idx,
 			   u16 addr_low, u32 value)
 {
-	struct cmdq_instruction inst = {};
-
-	inst.op = CMDQ_CODE_WRITE_S;
-	inst.sop = high_addr_reg_idx;
-	inst.offset = addr_low;
-	inst.value = value;
-
+	struct cmdq_instruction inst = {
+		.op = CMDQ_CODE_WRITE_S,
+		.sop = high_addr_reg_idx,
+		.offset = addr_low,
+		.value = value
+	};
 	return cmdq_pkt_append_command(pkt, inst);
 }
 EXPORT_SYMBOL(cmdq_pkt_write_s_value);
@@ -289,18 +283,18 @@ EXPORT_SYMBOL(cmdq_pkt_write_s_value);
 int cmdq_pkt_write_s_mask_value(struct cmdq_pkt *pkt, u8 high_addr_reg_idx,
 				u16 addr_low, u32 value, u32 mask)
 {
-	struct cmdq_instruction inst = {};
+	struct cmdq_instruction inst = {
+		.op = CMDQ_CODE_WRITE_S_MASK,
+		.sop = high_addr_reg_idx,
+		.offset = addr_low,
+		.value = value
+	};
 	int err;
 
 	err = cmdq_pkt_mask(pkt, mask);
 	if (err < 0)
 		return err;
 
-	inst.op = CMDQ_CODE_WRITE_S_MASK;
-	inst.sop = high_addr_reg_idx;
-	inst.offset = addr_low;
-	inst.value = value;
-
 	return cmdq_pkt_append_command(pkt, inst);
 }
 EXPORT_SYMBOL(cmdq_pkt_write_s_mask_value);
@@ -333,61 +327,61 @@ EXPORT_SYMBOL(cmdq_pkt_mem_move);
 
 int cmdq_pkt_wfe(struct cmdq_pkt *pkt, u16 event, bool clear)
 {
-	struct cmdq_instruction inst = { {0} };
 	u32 clear_option = clear ? CMDQ_WFE_UPDATE : 0;
+	struct cmdq_instruction inst = {
+		.op = CMDQ_CODE_WFE,
+		.value = CMDQ_WFE_OPTION | clear_option,
+		.event = event
+	};
 
 	if (unlikely(event >= CMDQ_MAX_EVENT))
 		return -EINVAL;
 
-	inst.op = CMDQ_CODE_WFE;
-	inst.value = CMDQ_WFE_OPTION | clear_option;
-	inst.event = event;
-
 	return cmdq_pkt_append_command(pkt, inst);
 }
 EXPORT_SYMBOL(cmdq_pkt_wfe);
 
 int cmdq_pkt_acquire_event(struct cmdq_pkt *pkt, u16 event)
 {
-	struct cmdq_instruction inst = {};
+	struct cmdq_instruction inst = {
+		.op = CMDQ_CODE_WFE,
+		.value = CMDQ_WFE_UPDATE | CMDQ_WFE_UPDATE_VALUE | CMDQ_WFE_WAIT,
+		.event = event
+	};
 
 	if (unlikely(event >= CMDQ_MAX_EVENT))
 		return -EINVAL;
 
-	inst.op = CMDQ_CODE_WFE;
-	inst.value = CMDQ_WFE_UPDATE | CMDQ_WFE_UPDATE_VALUE | CMDQ_WFE_WAIT;
-	inst.event = event;
-
 	return cmdq_pkt_append_command(pkt, inst);
 }
 EXPORT_SYMBOL(cmdq_pkt_acquire_event);
 
 int cmdq_pkt_clear_event(struct cmdq_pkt *pkt, u16 event)
 {
-	struct cmdq_instruction inst = { {0} };
+	struct cmdq_instruction inst = {
+		.op = CMDQ_CODE_WFE,
+		.value = CMDQ_WFE_UPDATE,
+		.event = event
+	};
 
 	if (unlikely(event >= CMDQ_MAX_EVENT))
 		return -EINVAL;
 
-	inst.op = CMDQ_CODE_WFE;
-	inst.value = CMDQ_WFE_UPDATE;
-	inst.event = event;
-
 	return cmdq_pkt_append_command(pkt, inst);
 }
 EXPORT_SYMBOL(cmdq_pkt_clear_event);
 
 int cmdq_pkt_set_event(struct cmdq_pkt *pkt, u16 event)
 {
-	struct cmdq_instruction inst = {};
+	struct cmdq_instruction inst = {
+		.op = CMDQ_CODE_WFE,
+		.value = CMDQ_WFE_UPDATE | CMDQ_WFE_UPDATE_VALUE,
+		.event = event
+	};
 
 	if (unlikely(event >= CMDQ_MAX_EVENT))
 		return -EINVAL;
 
-	inst.op = CMDQ_CODE_WFE;
-	inst.value = CMDQ_WFE_UPDATE | CMDQ_WFE_UPDATE_VALUE;
-	inst.event = event;
-
 	return cmdq_pkt_append_command(pkt, inst);
 }
 EXPORT_SYMBOL(cmdq_pkt_set_event);
@@ -395,16 +389,13 @@ EXPORT_SYMBOL(cmdq_pkt_set_event);
 int cmdq_pkt_poll(struct cmdq_pkt *pkt, u8 subsys,
 		  u16 offset, u32 value)
 {
-	struct cmdq_instruction inst = { {0} };
-	int err;
-
-	inst.op = CMDQ_CODE_POLL;
-	inst.value = value;
-	inst.offset = offset;
-	inst.subsys = subsys;
-	err = cmdq_pkt_append_command(pkt, inst);
-
-	return err;
+	struct cmdq_instruction inst = {
+		.op = CMDQ_CODE_POLL,
+		.value = value,
+		.offset = offset,
+		.subsys = subsys
+	};
+	return cmdq_pkt_append_command(pkt, inst);
 }
 EXPORT_SYMBOL(cmdq_pkt_poll);
 
@@ -418,9 +409,7 @@ int cmdq_pkt_poll_mask(struct cmdq_pkt *pkt, u8 subsys,
 		return err;
 
 	offset = offset | CMDQ_POLL_ENABLE_MASK;
-	err = cmdq_pkt_poll(pkt, subsys, offset, value);
-
-	return err;
+	return cmdq_pkt_poll(pkt, subsys, offset, value);
 }
 EXPORT_SYMBOL(cmdq_pkt_poll_mask);
 
@@ -474,11 +463,12 @@ int cmdq_pkt_logic_command(struct cmdq_pkt *pkt, u16 result_reg_idx,
 			   enum cmdq_logic_op s_op,
 			   struct cmdq_operand *right_operand)
 {
-	struct cmdq_instruction inst = { {0} };
+	struct cmdq_instruction inst;
 
 	if (unlikely(!left_operand || !right_operand || s_op >= CMDQ_LOGIC_MAX))
 		return -EINVAL;
 
+	inst.value = 0;
 	inst.op = CMDQ_CODE_LOGIC;
 	inst.dst_t = CMDQ_REG_TYPE;
 	inst.src_t = cmdq_operand_get_type(left_operand);
@@ -494,43 +484,43 @@ EXPORT_SYMBOL(cmdq_pkt_logic_command);
 
 int cmdq_pkt_assign(struct cmdq_pkt *pkt, u16 reg_idx, u32 value)
 {
-	struct cmdq_instruction inst = {};
-
-	inst.op = CMDQ_CODE_LOGIC;
-	inst.dst_t = CMDQ_REG_TYPE;
-	inst.reg_dst = reg_idx;
-	inst.value = value;
+	struct cmdq_instruction inst = {
+		.op = CMDQ_CODE_LOGIC,
+		.dst_t = CMDQ_REG_TYPE,
+		.reg_dst = reg_idx,
+		.value = value
+	};
 	return cmdq_pkt_append_command(pkt, inst);
 }
 EXPORT_SYMBOL(cmdq_pkt_assign);
 
 int cmdq_pkt_jump_abs(struct cmdq_pkt *pkt, dma_addr_t addr, u8 shift_pa)
 {
-	struct cmdq_instruction inst = {};
-
-	inst.op = CMDQ_CODE_JUMP;
-	inst.offset = CMDQ_JUMP_ABSOLUTE;
-	inst.value = addr >> shift_pa;
+	struct cmdq_instruction inst = {
+		.op = CMDQ_CODE_JUMP,
+		.offset = CMDQ_JUMP_ABSOLUTE,
+		.value = addr >> shift_pa
+	};
 	return cmdq_pkt_append_command(pkt, inst);
 }
 EXPORT_SYMBOL(cmdq_pkt_jump_abs);
 
 int cmdq_pkt_jump_rel(struct cmdq_pkt *pkt, s32 offset, u8 shift_pa)
 {
-	struct cmdq_instruction inst = { {0} };
-
-	inst.op = CMDQ_CODE_JUMP;
-	inst.value = (u32)offset >> shift_pa;
+	struct cmdq_instruction inst = {
+		.op = CMDQ_CODE_JUMP,
+		.value = (u32)offset >> shift_pa
+	};
 	return cmdq_pkt_append_command(pkt, inst);
 }
 EXPORT_SYMBOL(cmdq_pkt_jump_rel);
 
 int cmdq_pkt_eoc(struct cmdq_pkt *pkt)
 {
-	struct cmdq_instruction inst = { {0} };
-
-	inst.op = CMDQ_CODE_EOC;
-	inst.value = CMDQ_EOC_IRQ_EN;
+	struct cmdq_instruction inst = {
+		.op = CMDQ_CODE_EOC,
+		.value = CMDQ_EOC_IRQ_EN
+	};
 	return cmdq_pkt_append_command(pkt, inst);
 }
 EXPORT_SYMBOL(cmdq_pkt_eoc);
@@ -541,9 +531,7 @@ int cmdq_pkt_finalize(struct cmdq_pkt *pkt)
 	int err;
 
 	/* insert EOC and generate IRQ for each command iteration */
-	inst.op = CMDQ_CODE_EOC;
-	inst.value = CMDQ_EOC_IRQ_EN;
-	err = cmdq_pkt_append_command(pkt, inst);
+	err = cmdq_pkt_eoc(pkt);
 	if (err < 0)
 		return err;
 
@@ -551,9 +539,7 @@ int cmdq_pkt_finalize(struct cmdq_pkt *pkt)
 	inst.op = CMDQ_CODE_JUMP;
 	inst.value = CMDQ_JUMP_PASS >>
 		cmdq_get_shift_pa(((struct cmdq_client *)pkt->cl)->chan);
-	err = cmdq_pkt_append_command(pkt, inst);
-
-	return err;
+	return cmdq_pkt_append_command(pkt, inst);
 }
 EXPORT_SYMBOL(cmdq_pkt_finalize);
 
-- 
2.46.0



From angelogioacchino.delregno at collabora.com  Wed Sep 18 03:15:20 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Wed, 18 Sep 2024 12:15:20 +0200
Subject: [PATCH v3] drm/mediatek: ovl: Add fmt_convert function pointer to
 driver data
In-Reply-To: <20240917164434.17794-1-jason-jh.lin@mediatek.com>
References: <20240917164434.17794-1-jason-jh.lin@mediatek.com>
Message-ID: <92a8d48f-e109-461b-bb6a-29da98a444ad@collabora.com>

Il 17/09/24 18:44, Jason-JH.Lin ha scritto:
> OVL_CON_CLRFMT_MAN is a configuration for extending color format
> settings of DISP_REG_OVL_CON(n).
> It will change some of the original color format settings.
> 
> Take the settings of (3 << 12) for example.
> - If OVL_CON_CLRFMT_MAN = 0 means OVL_CON_CLRFMT_RGBA8888.
> - If OVL_CON_CLRFMT_MAN = 1 means OVL_CON_CLRFMT_PARGB8888.
> 
> Since OVL_CON_CLRFMT_MAN is not supported on previous SoCs,
> It breaks the OVL color format setting of MT8173.
> 
> Therefore, the fmt_convert function pointer is added to the driver data
> and mtk_ovl_fmt_convert_with_blend is implemented for MT8192 and MT8195
> that support OVL_CON_CLRFMT_MAN, and mtk_ovl_fmt_convert is implemented
> for other SoCs that do not support it to solve the degradation problem.
> 
> Fixes: a3f7f7ef4bfe ("drm/mediatek: Support "Pre-multiplied" blending in OVL")
> Signed-off-by: Jason-JH.Lin <jason-jh.lin at mediatek.com>
> Tested-by: Alper Nebi Yasak <alpernebiyasak at gmail.com>

Awesome.

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>




From krzk at kernel.org  Wed Sep 18 03:37:33 2024
From: krzk at kernel.org (Krzysztof Kozlowski)
Date: Wed, 18 Sep 2024 12:37:33 +0200
Subject: [PATCH v5 3/3] regulator: dt-bindings: mt6397: move examples to
 parent PMIC mt6397
In-Reply-To: <9caff3d5-22af-3481-d2af-6afb4abd49d7@mediatek.com>
References: <20240916151132.32321-1-macpaul.lin@mediatek.com>
 <20240916151132.32321-3-macpaul.lin@mediatek.com>
 <ev4kqtbjwglrti3mk2cnayilj4muy7ll7ux2uwlekcwu73dy5e@h4wvpucmyepw>
 <9caff3d5-22af-3481-d2af-6afb4abd49d7@mediatek.com>
Message-ID: <c50905e4-1f99-4b17-b932-f28aa6d1a7c3@kernel.org>

On 18/09/2024 04:44, Macpaul Lin wrote:
> 
> On 9/17/24 15:01, Krzysztof Kozlowski wrote:
>> 	
>>
>> External email : Please do not click links or open attachments until you 
>> have verified the sender or the content.
>>
>> On Mon, Sep 16, 2024 at 11:11:32PM +0800, Macpaul Lin wrote:
>>> Since the DT schema of multiple function PMIC mt6397 has been converted,
>>> move the examples in "mediatek,mt6397-regulator.yaml" to the parent schema
>>> "mediatek,mt6397.yaml".
>>
>> Is there any error otherwise? Why this cannot stay here, since it is
>> already there?
>>
>> Best regards,
>> Krzysztof
>>
> 
> I previously thought that all regulator examples needed to have a 
> complete version placed centrally in the main MFD. In that case, this 
> patch 3/3 should not need to be required. This will be dropped in the 
> next version.

That's the preference for new bindings, but there is no harm if existing
and functional example stays, even if it is partial.

Best regards,
Krzysztof



From rohiagar at chromium.org  Wed Sep 18 03:56:10 2024
From: rohiagar at chromium.org (Rohit Agarwal)
Date: Wed, 18 Sep 2024 16:26:10 +0530
Subject: [PATCH] dt-bindings: display: mediatek: dpi: Add power domain for
 MT8195 DP_INTF
In-Reply-To: <20240916171107.GA605353-robh@kernel.org>
References: <20240911071722.558960-1-rohiagar@chromium.org>
 <20240916171107.GA605353-robh@kernel.org>
Message-ID: <110f6583-f76d-4c7c-bd77-cdeb21b78704@chromium.org>


On 16/09/24 10:41 PM, Rob Herring wrote:
> On Wed, Sep 11, 2024 at 07:17:21AM +0000, Rohit Agarwal wrote:
>> Add power domain binding for MT8195 DP_INTF that resolves the following
>> error and many more similar ones:
>>
>> arch/arm64/boot/dts/mediatek/mt8195-cherry-dojo-r1.dtb: dp-intf at 1c113000:
>> power-domains: False schema does not allow [[55, 18]]
>>
>> Reported-by: kernel test robot <lkp at intel.com>
>> Closes: https://lore.kernel.org/oe-kbuild-all/202409102119.AYvaTjUi-lkp at intel.com/
> Fixes?
Will add in the next version.
>
>> Signed-off-by: Rohit Agarwal <rohiagar at chromium.org>
>> ---
>>   .../devicetree/bindings/display/mediatek/mediatek,dpi.yaml       | 1 +
>>   1 file changed, 1 insertion(+)
>>
>> diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml b/Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml
>> index 3a82aec9021c..07acc8a76bfc 100644
>> --- a/Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml
>> +++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml
>> @@ -89,6 +89,7 @@ allOf:
>>                   - mediatek,mt6795-dpi
>>                   - mediatek,mt8173-dpi
>>                   - mediatek,mt8186-dpi
>> +                - mediatek,mt8195-dp-intf
> mt8183 is also missing. There's a patch[1] to fix it, but it's wrong
> given the recent changes. It would be best to fix both in one
> patch/series as 2 separate patches will have conflicts.
>
> Rob
>
>
> [1] https://lore.kernel.org/all/20240912144430.3161717-2-treapking at chromium.org/

Ok, Sure will have a new (separate) patch added here to include the 
compatible strings. Thanks for pointing out.

Thanks,
Rohit.




From linyunsheng at huawei.com  Wed Sep 18 04:18:23 2024
From: linyunsheng at huawei.com (Yunsheng Lin)
Date: Wed, 18 Sep 2024 19:18:23 +0800
Subject: [PATCH net 0/2] fix two bugs related to page_pool
Message-ID: <20240918111826.863596-1-linyunsheng@huawei.com>

Patch 1 fix a possible time window problem for page_pool.
Patch 2 fix the kernel crash problem at iommu_get_dma_domain
reported in [1].

When page_pool_put_unrefed_netmem() is called with allow_direct
being true, there is added checking overhead introduced in patch
1, which seem to be no noticeable performance impact.

When page_pool_put_unrefed_netmem() is called with allow_direct
being false, there is a rcu read lock overhead introduced in
patch 1, and the overhead is about 13ns using the below test code,
but 'time_bench_page_pool02_ptr_ring' only show about 2ns overhead,
which is about 2% degradation.

+static int time_bench_rcu(
+       struct time_bench_record *rec, void *data)
+{
+       uint64_t loops_cnt = 0;
+       int i;
+
+       time_bench_start(rec);
+       /** Loop to measure **/
+       for (i = 0; i < rec->loops; i++) {
+               rcu_read_lock();
+               loops_cnt++;
+               barrier(); /* avoid compiler to optimize this loop */
+               rcu_read_unlock();
+       }
+       time_bench_stop(rec, loops_cnt);
+       return loops_cnt;
+}

When page_pool need to be refilled from or flushed to the page allocator,
the added overhead is the page_pool_item_add() and page_pool_item_del()
calling overhead, using below patch to enable Jesper's testing running in
arm64, the overhead is 0~20ns, which is quite variable 

Before this patchset:
root@(none)$ taskset -c 1 insmod bench_page_pool_simple.ko
[  136.641453] bench_page_pool_simple: Loaded
[  136.722560] time_bench: Type:for_loop Per elem: 0 cycles(tsc) 0.769 ns (step:0) - (measurement period time:0.076968720 sec time_interval:76968720) - (invoke count:100000000 tsc_interval:7696855)
[  137.317006] time_bench: Type:atomic_inc Per elem: 0 cycles(tsc) 5.771 ns (step:0) - (measurement period time:0.577164350 sec time_interval:577164350) - (invoke count:100000000 tsc_interval:57716429)
[  137.480852] time_bench: Type:lock Per elem: 1 cycles(tsc) 14.621 ns (step:0) - (measurement period time:0.146218730 sec time_interval:146218730) - (invoke count:10000000 tsc_interval:14621868)
[  138.842377] time_bench: Type:rcu Per elem: 1 cycles(tsc) 13.444 ns (step:0) - (measurement period time:1.344419820 sec time_interval:1344419820) - (invoke count:100000000 tsc_interval:134441975)
[  138.859656] bench_page_pool_simple: time_bench_page_pool01_fast_path(): Cannot use page_pool fast-path
[  139.132102] time_bench: Type:no-softirq-page_pool01 Per elem: 2 cycles(tsc) 26.315 ns (step:0) - (measurement period time:0.263151430 sec time_interval:263151430) - (invoke count:10000000 tsc_interval:26315135)
[  139.150769] bench_page_pool_simple: time_bench_page_pool02_ptr_ring(): Cannot use page_pool fast-path
[  139.910642] time_bench: Type:no-softirq-page_pool02 Per elem: 7 cycles(tsc) 75.066 ns (step:0) - (measurement period time:0.750663200 sec time_interval:750663200) - (invoke count:10000000 tsc_interval:75066312)
[  139.929312] bench_page_pool_simple: time_bench_page_pool03_slow(): Cannot use page_pool fast-path
[  141.673951] time_bench: Type:no-softirq-page_pool03 Per elem: 17 cycles(tsc) 173.578 ns (step:0) - (measurement period time:1.735781610 sec time_interval:1735781610) - (invoke count:10000000 tsc_interval:173578155)
[  141.692970] bench_page_pool_simple: pp_tasklet_handler(): in_serving_softirq fast-path
[  141.700874] bench_page_pool_simple: time_bench_page_pool01_fast_path(): in_serving_softirq fast-path
[  141.973638] time_bench: Type:tasklet_page_pool01_fast_path Per elem: 2 cycles(tsc) 26.364 ns (step:0) - (measurement period time:0.263645150 sec time_interval:263645150) - (invoke count:10000000 tsc_interval:26364508)
[  141.992912] bench_page_pool_simple: time_bench_page_pool02_ptr_ring(): in_serving_softirq fast-path
[  142.531745] time_bench: Type:tasklet_page_pool02_ptr_ring Per elem: 5 cycles(tsc) 52.980 ns (step:0) - (measurement period time:0.529801250 sec time_interval:529801250) - (invoke count:10000000 tsc_interval:52980119)
[  142.550933] bench_page_pool_simple: time_bench_page_pool03_slow(): in_serving_softirq fast-path
[  144.297646] time_bench: Type:tasklet_page_pool03_slow Per elem: 17 cycles(tsc) 173.802 ns (step:0) - (measurement period time:1.738029000 sec time_interval:1738029000) - (invoke count:10000000 tsc_interval:173802894)

After this patchset:
root@(none)$ taskset -c 1 insmod bench_page_pool_simple.ko
[  149.865799] bench_page_pool_simple: Loaded
[  149.946907] time_bench: Type:for_loop Per elem: 0 cycles(tsc) 0.769 ns (step:0) - (measurement period time:0.076965620 sec time_interval:76965620) - (invoke count:100000000 tsc_interval:7696556)
[  150.722282] time_bench: Type:atomic_inc Per elem: 0 cycles(tsc) 7.580 ns (step:0) - (measurement period time:0.758094660 sec time_interval:758094660) - (invoke count:100000000 tsc_interval:75809459)
[  150.886335] time_bench: Type:lock Per elem: 1 cycles(tsc) 14.640 ns (step:0) - (measurement period time:0.146405830 sec time_interval:146405830) - (invoke count:10000000 tsc_interval:14640578)
[  152.249454] time_bench: Type:rcu Per elem: 1 cycles(tsc) 13.460 ns (step:0) - (measurement period time:1.346009570 sec time_interval:1346009570) - (invoke count:100000000 tsc_interval:134600951)
[  152.266734] bench_page_pool_simple: time_bench_page_pool01_fast_path(): Cannot use page_pool fast-path
[  152.537046] time_bench: Type:no-softirq-page_pool01 Per elem: 2 cycles(tsc) 26.100 ns (step:0) - (measurement period time:0.261007670 sec time_interval:261007670) - (invoke count:10000000 tsc_interval:26100761)
[  152.555714] bench_page_pool_simple: time_bench_page_pool02_ptr_ring(): Cannot use page_pool fast-path
[  153.342212] time_bench: Type:no-softirq-page_pool02 Per elem: 7 cycles(tsc) 77.729 ns (step:0) - (measurement period time:0.777293380 sec time_interval:777293380) - (invoke count:10000000 tsc_interval:77729331)
[  153.360881] bench_page_pool_simple: time_bench_page_pool03_slow(): Cannot use page_pool fast-path
[  155.287747] time_bench: Type:no-softirq-page_pool03 Per elem: 19 cycles(tsc) 191.800 ns (step:0) - (measurement period time:1.918007990 sec time_interval:1918007990) - (invoke count:10000000 tsc_interval:191800791)
[  155.306766] bench_page_pool_simple: pp_tasklet_handler(): in_serving_softirq fast-path
[  155.314670] bench_page_pool_simple: time_bench_page_pool01_fast_path(): in_serving_softirq fast-path
[  155.584313] time_bench: Type:tasklet_page_pool01_fast_path Per elem: 2 cycles(tsc) 26.052 ns (step:0) - (measurement period time:0.260524810 sec time_interval:260524810) - (invoke count:10000000 tsc_interval:26052476)
[  155.603588] bench_page_pool_simple: time_bench_page_pool02_ptr_ring(): in_serving_softirq fast-path
[  156.183214] time_bench: Type:tasklet_page_pool02_ptr_ring Per elem: 5 cycles(tsc) 57.059 ns (step:0) - (measurement period time:0.570594850 sec time_interval:570594850) - (invoke count:10000000 tsc_interval:57059478)
[  156.202402] bench_page_pool_simple: time_bench_page_pool03_slow(): in_serving_softirq fast-path
[  158.045594] time_bench: Type:tasklet_page_pool03_slow Per elem: 18 cycles(tsc) 183.450 ns (step:0) - (measurement period time:1.834507700 sec time_interval:1834507700) - (invoke count:10000000 tsc_interval:183450764)

Patch for time_bench.h enable the out of tree testing on arm64 system:
@@ -101,6 +101,7 @@ struct time_bench_cpu {
  *  CPUID clears the high 32-bits of all (rax/rbx/rcx/rdx)
  */
 static __always_inline uint64_t tsc_start_clock(void) {
+#if defined(__i386__) || defined(__x86_64__)
        /* See: Intel Doc #324264 */
        unsigned hi, lo;
        asm volatile (
@@ -111,9 +112,13 @@ static __always_inline uint64_t tsc_start_clock(void) {
                "%rax", "%rbx", "%rcx", "%rdx");
        //FIXME: on 32bit use clobbered %eax + %edx
        return ((uint64_t)lo) | (((uint64_t)hi) << 32);
+#else
+       return get_cycles();
+#endif
 }

 static __always_inline uint64_t tsc_stop_clock(void) {
+#if defined(__i386__) || defined(__x86_64__)
        /* See: Intel Doc #324264 */
        unsigned hi, lo;
        asm volatile(
@@ -123,6 +128,9 @@ static __always_inline uint64_t tsc_stop_clock(void) {
                "CPUID\n\t": "=r" (hi), "=r" (lo)::
                "%rax", "%rbx", "%rcx", "%rdx");
        return ((uint64_t)lo) | (((uint64_t)hi) << 32);
+#else
+       return get_cycles();
+#endif
 }

 /* Notes for RDTSC and RDTSCP
@@ -186,10 +194,14 @@ enum {

 static __always_inline unsigned long long p_rdpmc(unsigned in)
 {
+#if defined(__i386__) || defined(__x86_64__)
        unsigned d, a;

        asm volatile("rdpmc" : "=d" (d), "=a" (a) : "c" (in) : "memory");
        return ((unsigned long long)d << 32) | a;
+#else
+       return 0;
+#endif
 }

 /* These PMU counter needs to be enabled, but I don't have the
@@ -216,7 +228,11 @@ static __always_inline unsigned long long pmc_clk(void)
 #define MSR_IA32_PCM2 0x400000C3
 inline uint64_t msr_inst(unsigned long long *msr_result)
 {
+#if defined(__i386__) || defined(__x86_64__)
        return rdmsrl_safe(MSR_IA32_PCM0, msr_result);
+#else
+       return 0;
+#endif
 }

1. https://lore.kernel.org/lkml/8067f204-1380-4d37-8ffd-007fc6f26738 at kernel.org/T/

CC: Alexander Lobakin <aleksander.lobakin at intel.com>
CC: Robin Murphy <robin.murphy at arm.com>
CC: Alexander Duyck <alexander.duyck at gmail.com>
CC: IOMMU <iommu at lists.linux.dev>

Yunsheng Lin (2):
  page_pool: fix timing for checking and disabling napi_local
  page_pool: fix IOMMU crash when driver has already unbound

 drivers/net/ethernet/freescale/fec_main.c     |   8 +-
 drivers/net/ethernet/intel/iavf/iavf_txrx.c   |   6 +-
 drivers/net/ethernet/intel/idpf/idpf_txrx.c   |  14 +-
 drivers/net/ethernet/intel/libeth/rx.c        |   2 +-
 .../net/ethernet/mellanox/mlx5/core/en/xdp.c  |   3 +-
 drivers/net/netdevsim/netdev.c                |   6 +-
 drivers/net/wireless/mediatek/mt76/mt76.h     |   2 +-
 include/linux/mm_types.h                      |   2 +-
 include/linux/skbuff.h                        |   1 +
 include/net/libeth/rx.h                       |   3 +-
 include/net/netmem.h                          |  10 +-
 include/net/page_pool/helpers.h               |  11 +
 include/net/page_pool/types.h                 |  15 +-
 net/core/devmem.c                             |   4 +-
 net/core/netmem_priv.h                        |   5 +-
 net/core/page_pool.c                          | 188 +++++++++++++++---
 net/core/page_pool_priv.h                     |  10 +-
 net/core/skbuff.c                             |   3 +-
 net/core/xdp.c                                |   3 +-
 19 files changed, 238 insertions(+), 58 deletions(-)

-- 
2.33.0



From linyunsheng at huawei.com  Wed Sep 18 04:18:25 2024
From: linyunsheng at huawei.com (Yunsheng Lin)
Date: Wed, 18 Sep 2024 19:18:25 +0800
Subject: [PATCH net 2/2] page_pool: fix IOMMU crash when driver has already unbound
In-Reply-To: <20240918111826.863596-1-linyunsheng@huawei.com>
References: <20240918111826.863596-1-linyunsheng@huawei.com>
Message-ID: <20240918111826.863596-3-linyunsheng@huawei.com>

Networking driver with page_pool support may hand over page
still with dma mapping to network stack and try to reuse that
page after network stack is done with it and passes it back
to page_pool to avoid the penalty of dma mapping/unmapping.
With all the caching in the network stack, some pages may be
held in the network stack without returning to the page_pool
soon enough, and with VF disable causing the driver unbound,
the page_pool does not stop the driver from doing it's
unbounding work, instead page_pool uses workqueue to check
if there is some pages coming back from the network stack
periodically, if there is any, it will do the dma unmmapping
related cleanup work.

As mentioned in [1], attempting DMA unmaps after the driver
has already unbound may leak resources or at worst corrupt
memory. Fundamentally, the page pool code cannot allow DMA
mappings to outlive the driver they belong to.

Currently it seems there are at least two cases that the page
is not released fast enough causing dma unmmapping done after
driver has already unbound:
1. ipv4 packet defragmentation timeout: this seems to cause
   delay up to 30 secs:

2. skb_defer_free_flush(): this may cause infinite delay if
   there is no triggering for net_rx_action().

In order not to do the dma unmmapping after driver has already
unbound and stall the unloading of the networking driver, add
the pool->items array to record all the pages including the ones
which are handed over to network stack, so the page_pool can
do the dma unmmapping for those pages when page_pool_destroy()
is called.

Note, the devmem patchset seems to make the bug harder to fix,
and may make backporting harder too. As there is no actual user
for the devmem and the fixing for devmem is unclear for now,
this patch does not consider fixing the case for devmem yet.

1. https://lore.kernel.org/lkml/8067f204-1380-4d37-8ffd-007fc6f26738 at kernel.org/T/

Fixes: f71fec47c2df ("page_pool: make sure struct device is stable")
Signed-off-by: Yunsheng Lin <linyunsheng at huawei.com>
CC: Robin Murphy <robin.murphy at arm.com>
CC: Alexander Duyck <alexander.duyck at gmail.com>
CC: IOMMU <iommu at lists.linux.dev>
---
 drivers/net/ethernet/freescale/fec_main.c     |   8 +-
 drivers/net/ethernet/intel/iavf/iavf_txrx.c   |   6 +-
 drivers/net/ethernet/intel/idpf/idpf_txrx.c   |  14 +-
 drivers/net/ethernet/intel/libeth/rx.c        |   2 +-
 .../net/ethernet/mellanox/mlx5/core/en/xdp.c  |   3 +-
 drivers/net/netdevsim/netdev.c                |   6 +-
 drivers/net/wireless/mediatek/mt76/mt76.h     |   2 +-
 include/linux/mm_types.h                      |   2 +-
 include/linux/skbuff.h                        |   1 +
 include/net/libeth/rx.h                       |   3 +-
 include/net/netmem.h                          |  10 +-
 include/net/page_pool/helpers.h               |  11 ++
 include/net/page_pool/types.h                 |  15 +-
 net/core/devmem.c                             |   4 +-
 net/core/netmem_priv.h                        |   5 +-
 net/core/page_pool.c                          | 161 +++++++++++++++---
 net/core/page_pool_priv.h                     |  10 +-
 net/core/skbuff.c                             |   3 +-
 net/core/xdp.c                                |   3 +-
 19 files changed, 212 insertions(+), 57 deletions(-)

diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c
index acbb627d51bf..c00f8c460759 100644
--- a/drivers/net/ethernet/freescale/fec_main.c
+++ b/drivers/net/ethernet/freescale/fec_main.c
@@ -1009,7 +1009,8 @@ static void fec_enet_bd_init(struct net_device *dev)
 				struct page *page = txq->tx_buf[i].buf_p;
 
 				if (page)
-					page_pool_put_page(page->pp, page, 0, false);
+					page_pool_put_page(page_pool_to_pp(page),
+							   page, 0, false);
 			}
 
 			txq->tx_buf[i].buf_p = NULL;
@@ -1538,7 +1539,7 @@ fec_enet_tx_queue(struct net_device *ndev, u16 queue_id, int budget)
 			xdp_return_frame_rx_napi(xdpf);
 		} else { /* recycle pages of XDP_TX frames */
 			/* The dma_sync_size = 0 as XDP_TX has already synced DMA for_device */
-			page_pool_put_page(page->pp, page, 0, true);
+			page_pool_put_page(page_pool_to_pp(page), page, 0, true);
 		}
 
 		txq->tx_buf[index].buf_p = NULL;
@@ -3300,7 +3301,8 @@ static void fec_enet_free_buffers(struct net_device *ndev)
 			} else {
 				struct page *page = txq->tx_buf[i].buf_p;
 
-				page_pool_put_page(page->pp, page, 0, false);
+				page_pool_put_page(page_pool_to_pp(page),
+						   page, 0, false);
 			}
 
 			txq->tx_buf[i].buf_p = NULL;
diff --git a/drivers/net/ethernet/intel/iavf/iavf_txrx.c b/drivers/net/ethernet/intel/iavf/iavf_txrx.c
index 26b424fd6718..658d8f9a6abb 100644
--- a/drivers/net/ethernet/intel/iavf/iavf_txrx.c
+++ b/drivers/net/ethernet/intel/iavf/iavf_txrx.c
@@ -1050,7 +1050,8 @@ static void iavf_add_rx_frag(struct sk_buff *skb,
 			     const struct libeth_fqe *rx_buffer,
 			     unsigned int size)
 {
-	u32 hr = rx_buffer->page->pp->p.offset;
+	struct page_pool *pool = page_pool_to_pp(rx_buffer->page);
+	u32 hr = pool->p.offset;
 
 	skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags, rx_buffer->page,
 			rx_buffer->offset + hr, size, rx_buffer->truesize);
@@ -1067,7 +1068,8 @@ static void iavf_add_rx_frag(struct sk_buff *skb,
 static struct sk_buff *iavf_build_skb(const struct libeth_fqe *rx_buffer,
 				      unsigned int size)
 {
-	u32 hr = rx_buffer->page->pp->p.offset;
+	struct page_pool *pool = page_pool_to_pp(rx_buffer->page);
+	u32 hr = pool->p.offset;
 	struct sk_buff *skb;
 	void *va;
 
diff --git a/drivers/net/ethernet/intel/idpf/idpf_txrx.c b/drivers/net/ethernet/intel/idpf/idpf_txrx.c
index d4e6f0e10487..e3389f1a215f 100644
--- a/drivers/net/ethernet/intel/idpf/idpf_txrx.c
+++ b/drivers/net/ethernet/intel/idpf/idpf_txrx.c
@@ -385,7 +385,8 @@ static void idpf_rx_page_rel(struct libeth_fqe *rx_buf)
 	if (unlikely(!rx_buf->page))
 		return;
 
-	page_pool_put_full_page(rx_buf->page->pp, rx_buf->page, false);
+	page_pool_put_full_page(page_pool_to_pp(rx_buf->page), rx_buf->page,
+				false);
 
 	rx_buf->page = NULL;
 	rx_buf->offset = 0;
@@ -3097,7 +3098,8 @@ idpf_rx_process_skb_fields(struct idpf_rx_queue *rxq, struct sk_buff *skb,
 void idpf_rx_add_frag(struct idpf_rx_buf *rx_buf, struct sk_buff *skb,
 		      unsigned int size)
 {
-	u32 hr = rx_buf->page->pp->p.offset;
+	struct page_pool *pool = page_pool_to_pp(rx_buf->page);
+	u32 hr = pool->p.offset;
 
 	skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags, rx_buf->page,
 			rx_buf->offset + hr, size, rx_buf->truesize);
@@ -3129,8 +3131,10 @@ static u32 idpf_rx_hsplit_wa(const struct libeth_fqe *hdr,
 	if (!libeth_rx_sync_for_cpu(buf, copy))
 		return 0;
 
-	dst = page_address(hdr->page) + hdr->offset + hdr->page->pp->p.offset;
-	src = page_address(buf->page) + buf->offset + buf->page->pp->p.offset;
+	dst = page_address(hdr->page) + hdr->offset +
+		page_pool_to_pp(hdr->page)->p.offset;
+	src = page_address(buf->page) + buf->offset +
+		page_pool_to_pp(buf->page)->p.offset;
 	memcpy(dst, src, LARGEST_ALIGN(copy));
 
 	buf->offset += copy;
@@ -3148,7 +3152,7 @@ static u32 idpf_rx_hsplit_wa(const struct libeth_fqe *hdr,
  */
 struct sk_buff *idpf_rx_build_skb(const struct libeth_fqe *buf, u32 size)
 {
-	u32 hr = buf->page->pp->p.offset;
+	u32 hr = page_pool_to_pp(buf->page)->p.offset;
 	struct sk_buff *skb;
 	void *va;
 
diff --git a/drivers/net/ethernet/intel/libeth/rx.c b/drivers/net/ethernet/intel/libeth/rx.c
index f20926669318..385afca0e61d 100644
--- a/drivers/net/ethernet/intel/libeth/rx.c
+++ b/drivers/net/ethernet/intel/libeth/rx.c
@@ -207,7 +207,7 @@ EXPORT_SYMBOL_NS_GPL(libeth_rx_fq_destroy, LIBETH);
  */
 void libeth_rx_recycle_slow(struct page *page)
 {
-	page_pool_recycle_direct(page->pp, page);
+	page_pool_recycle_direct(page_pool_to_pp(page), page);
 }
 EXPORT_SYMBOL_NS_GPL(libeth_rx_recycle_slow, LIBETH);
 
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c b/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c
index 4610621a340e..83511a45a6dc 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c
@@ -716,7 +716,8 @@ static void mlx5e_free_xdpsq_desc(struct mlx5e_xdpsq *sq,
 				/* No need to check ((page->pp_magic & ~0x3UL) == PP_SIGNATURE)
 				 * as we know this is a page_pool page.
 				 */
-				page_pool_recycle_direct(page->pp, page);
+				page_pool_recycle_direct(page_pool_to_pp(page),
+							 page);
 			} while (++n < num);
 
 			break;
diff --git a/drivers/net/netdevsim/netdev.c b/drivers/net/netdevsim/netdev.c
index 017a6102be0a..9bfa593cd5dd 100644
--- a/drivers/net/netdevsim/netdev.c
+++ b/drivers/net/netdevsim/netdev.c
@@ -593,7 +593,8 @@ nsim_pp_hold_write(struct file *file, const char __user *data,
 		if (!ns->page)
 			ret = -ENOMEM;
 	} else {
-		page_pool_put_full_page(ns->page->pp, ns->page, false);
+		page_pool_put_full_page(page_pool_to_pp(ns->page), ns->page,
+					false);
 		ns->page = NULL;
 	}
 	rtnl_unlock();
@@ -788,7 +789,8 @@ void nsim_destroy(struct netdevsim *ns)
 
 	/* Put this intentionally late to exercise the orphaning path */
 	if (ns->page) {
-		page_pool_put_full_page(ns->page->pp, ns->page, false);
+		page_pool_put_full_page(page_pool_to_pp(ns->page), ns->page,
+					false);
 		ns->page = NULL;
 	}
 
diff --git a/drivers/net/wireless/mediatek/mt76/mt76.h b/drivers/net/wireless/mediatek/mt76/mt76.h
index 0b75a45ad2e8..94a277290909 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76.h
+++ b/drivers/net/wireless/mediatek/mt76/mt76.h
@@ -1688,7 +1688,7 @@ static inline void mt76_put_page_pool_buf(void *buf, bool allow_direct)
 {
 	struct page *page = virt_to_head_page(buf);
 
-	page_pool_put_full_page(page->pp, page, allow_direct);
+	page_pool_put_full_page(page_pool_to_pp(page), page, allow_direct);
 }
 
 static inline void *
diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h
index 485424979254..410187133d27 100644
--- a/include/linux/mm_types.h
+++ b/include/linux/mm_types.h
@@ -120,7 +120,7 @@ struct page {
 			 * page_pool allocated pages.
 			 */
 			unsigned long pp_magic;
-			struct page_pool *pp;
+			struct page_pool_item *pp_item;
 			unsigned long _pp_mapping_pad;
 			unsigned long dma_addr;
 			atomic_long_t pp_ref_count;
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
index 39f1d16f3628..64d1ecb7a7fc 100644
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
@@ -38,6 +38,7 @@
 #include <net/net_debug.h>
 #include <net/dropreason-core.h>
 #include <net/netmem.h>
+#include <net/page_pool/types.h>
 
 /**
  * DOC: skb checksums
diff --git a/include/net/libeth/rx.h b/include/net/libeth/rx.h
index 43574bd6612f..beee7ddd77a5 100644
--- a/include/net/libeth/rx.h
+++ b/include/net/libeth/rx.h
@@ -137,7 +137,8 @@ static inline bool libeth_rx_sync_for_cpu(const struct libeth_fqe *fqe,
 		return false;
 	}
 
-	page_pool_dma_sync_for_cpu(page->pp, page, fqe->offset, len);
+	page_pool_dma_sync_for_cpu(page_pool_to_pp(page), page, fqe->offset,
+				   len);
 
 	return true;
 }
diff --git a/include/net/netmem.h b/include/net/netmem.h
index 8a6e20be4b9d..27f5d284285e 100644
--- a/include/net/netmem.h
+++ b/include/net/netmem.h
@@ -23,7 +23,7 @@ DECLARE_STATIC_KEY_FALSE(page_pool_mem_providers);
 struct net_iov {
 	unsigned long __unused_padding;
 	unsigned long pp_magic;
-	struct page_pool *pp;
+	struct page_pool_item *pp_item;
 	struct dmabuf_genpool_chunk_owner *owner;
 	unsigned long dma_addr;
 	atomic_long_t pp_ref_count;
@@ -33,7 +33,7 @@ struct net_iov {
  *
  *        struct {
  *                unsigned long pp_magic;
- *                struct page_pool *pp;
+ *                struct page_pool *pp_item;
  *                unsigned long _pp_mapping_pad;
  *                unsigned long dma_addr;
  *                atomic_long_t pp_ref_count;
@@ -49,7 +49,7 @@ struct net_iov {
 	static_assert(offsetof(struct page, pg) == \
 		      offsetof(struct net_iov, iov))
 NET_IOV_ASSERT_OFFSET(pp_magic, pp_magic);
-NET_IOV_ASSERT_OFFSET(pp, pp);
+NET_IOV_ASSERT_OFFSET(pp_item, pp_item);
 NET_IOV_ASSERT_OFFSET(dma_addr, dma_addr);
 NET_IOV_ASSERT_OFFSET(pp_ref_count, pp_ref_count);
 #undef NET_IOV_ASSERT_OFFSET
@@ -127,9 +127,9 @@ static inline struct net_iov *__netmem_clear_lsb(netmem_ref netmem)
 	return (struct net_iov *)((__force unsigned long)netmem & ~NET_IOV);
 }
 
-static inline struct page_pool *netmem_get_pp(netmem_ref netmem)
+static inline struct page_pool_item *netmem_get_pp_item(netmem_ref netmem)
 {
-	return __netmem_clear_lsb(netmem)->pp;
+	return __netmem_clear_lsb(netmem)->pp_item;
 }
 
 static inline atomic_long_t *netmem_get_pp_ref_count_ref(netmem_ref netmem)
diff --git a/include/net/page_pool/helpers.h b/include/net/page_pool/helpers.h
index 793e6fd78bc5..ed068b3cee3b 100644
--- a/include/net/page_pool/helpers.h
+++ b/include/net/page_pool/helpers.h
@@ -83,6 +83,17 @@ static inline u64 *page_pool_ethtool_stats_get(u64 *data, const void *stats)
 }
 #endif
 
+static inline struct page_pool *page_pool_to_pp(struct page *page)
+{
+	struct page_pool_item *item = page->pp_item;
+	struct page_pool *pool;
+
+	item -= item->pp_idx;
+	pool = (struct page_pool *)item;
+
+	return --pool;
+}
+
 /**
  * page_pool_dev_alloc_pages() - allocate a page.
  * @pool:	pool from which to allocate
diff --git a/include/net/page_pool/types.h b/include/net/page_pool/types.h
index c022c410abe3..526250ed812a 100644
--- a/include/net/page_pool/types.h
+++ b/include/net/page_pool/types.h
@@ -142,6 +142,11 @@ struct page_pool_stats {
 };
 #endif
 
+struct page_pool_item {
+	netmem_ref pp_netmem;
+	unsigned int pp_idx;
+};
+
 /* The whole frag API block must stay within one cacheline. On 32-bit systems,
  * sizeof(long) == sizeof(int), so that the block size is ``3 * sizeof(long)``.
  * On 64-bit systems, the actual size is ``2 * sizeof(long) + sizeof(int)``.
@@ -161,6 +166,8 @@ struct page_pool {
 
 	int cpuid;
 	u32 pages_state_hold_cnt;
+	unsigned int item_mask;
+	unsigned int item_idx;
 
 	bool has_init_callback:1;	/* slow::init_callback is set */
 	bool dma_map:1;			/* Perform DMA mapping */
@@ -228,7 +235,11 @@ struct page_pool {
 	 */
 	refcount_t user_cnt;
 
-	u64 destroy_cnt;
+	/* Lock to avoid doing dma unmapping concurrently when
+	 * destroy_cnt > 0.
+	 */
+	spinlock_t destroy_lock;
+	unsigned int destroy_cnt;
 
 	/* Slow/Control-path information follows */
 	struct page_pool_params_slow slow;
@@ -239,6 +250,8 @@ struct page_pool {
 		u32 napi_id;
 		u32 id;
 	} user;
+
+	struct page_pool_item items[] ____cacheline_aligned_in_smp;
 };
 
 struct page *page_pool_alloc_pages(struct page_pool *pool, gfp_t gfp);
diff --git a/net/core/devmem.c b/net/core/devmem.c
index 11b91c12ee11..09c5aa83f12a 100644
--- a/net/core/devmem.c
+++ b/net/core/devmem.c
@@ -85,7 +85,7 @@ net_devmem_alloc_dmabuf(struct net_devmem_dmabuf_binding *binding)
 	niov = &owner->niovs[index];
 
 	niov->pp_magic = 0;
-	niov->pp = NULL;
+	niov->pp_item = NULL;
 	atomic_long_set(&niov->pp_ref_count, 0);
 
 	return niov;
@@ -380,7 +380,7 @@ bool mp_dmabuf_devmem_release_page(struct page_pool *pool, netmem_ref netmem)
 	if (WARN_ON_ONCE(refcount != 1))
 		return false;
 
-	page_pool_clear_pp_info(netmem);
+	page_pool_clear_pp_info(pool, netmem);
 
 	net_devmem_free_dmabuf(netmem_to_net_iov(netmem));
 
diff --git a/net/core/netmem_priv.h b/net/core/netmem_priv.h
index 7eadb8393e00..3173f6070cf7 100644
--- a/net/core/netmem_priv.h
+++ b/net/core/netmem_priv.h
@@ -18,9 +18,10 @@ static inline void netmem_clear_pp_magic(netmem_ref netmem)
 	__netmem_clear_lsb(netmem)->pp_magic = 0;
 }
 
-static inline void netmem_set_pp(netmem_ref netmem, struct page_pool *pool)
+static inline void netmem_set_pp_item(netmem_ref netmem,
+				      struct page_pool_item *item)
 {
-	__netmem_clear_lsb(netmem)->pp = pool;
+	__netmem_clear_lsb(netmem)->pp_item = item;
 }
 
 static inline void netmem_set_dma_addr(netmem_ref netmem,
diff --git a/net/core/page_pool.c b/net/core/page_pool.c
index bec6e717cd22..1f3017a2e0a0 100644
--- a/net/core/page_pool.c
+++ b/net/core/page_pool.c
@@ -267,14 +267,12 @@ static int page_pool_init(struct page_pool *pool,
 		return -ENOMEM;
 	}
 
+	spin_lock_init(&pool->destroy_lock);
 	atomic_set(&pool->pages_state_release_cnt, 0);
 
 	/* Driver calling page_pool_create() also call page_pool_destroy() */
 	refcount_set(&pool->user_cnt, 1);
 
-	if (pool->dma_map)
-		get_device(pool->p.dev);
-
 	if (pool->slow.flags & PP_FLAG_ALLOW_UNREADABLE_NETMEM) {
 		/* We rely on rtnl_lock()ing to make sure netdev_rx_queue
 		 * configuration doesn't change while we're initializing
@@ -312,15 +310,93 @@ static void page_pool_uninit(struct page_pool *pool)
 {
 	ptr_ring_cleanup(&pool->ring, NULL);
 
-	if (pool->dma_map)
-		put_device(pool->p.dev);
-
 #ifdef CONFIG_PAGE_POOL_STATS
 	if (!pool->system)
 		free_percpu(pool->recycle_stats);
 #endif
 }
 
+static void page_pool_item_init(struct page_pool *pool, unsigned int item_cnt)
+{
+	struct page_pool_item *items = pool->items;
+	unsigned int i;
+
+	WARN_ON_ONCE(!is_power_of_2(item_cnt));
+
+	for (i = 0; i < item_cnt; i++)
+		items[i].pp_idx = i;
+
+	pool->item_mask = item_cnt - 1;
+}
+
+static void page_pool_item_uninit(struct page_pool *pool)
+{
+	struct page_pool_item *items = pool->items;
+	unsigned int mask = pool->item_mask;
+	unsigned int i;
+
+	if (!pool->dma_map || pool->mp_priv)
+		return;
+
+	spin_lock_bh(&pool->destroy_lock);
+
+	for (i = 0; i <= mask; i++) {
+		struct page *page;
+
+		page = netmem_to_page(READ_ONCE(items[i].pp_netmem));
+		if (!page)
+			continue;
+
+		WARN_ONCE(1, "dma unmapping in %s: %p for %p\n", __func__, page,
+			  pool);
+
+		dma_unmap_page_attrs(pool->p.dev, page_pool_get_dma_addr(page),
+				     PAGE_SIZE << pool->p.order,
+				     pool->p.dma_dir, DMA_ATTR_SKIP_CPU_SYNC |
+				     DMA_ATTR_WEAK_ORDERING);
+		page_pool_set_dma_addr(page, 0);
+	}
+
+	pool->dma_map = false;
+	spin_unlock_bh(&pool->destroy_lock);
+}
+
+static bool page_pool_item_add(struct page_pool *pool, netmem_ref netmem)
+{
+	struct page_pool_item *items = pool->items;
+	unsigned int mask = pool->item_mask;
+	unsigned int idx = pool->item_idx;
+	unsigned int i;
+
+	for (i = 0; i <= mask; i++) {
+		unsigned int mask_idx = idx++ & mask;
+
+		if (!READ_ONCE(items[mask_idx].pp_netmem)) {
+			WRITE_ONCE(items[mask_idx].pp_netmem, netmem);
+			netmem_set_pp_item(netmem, &items[mask_idx]);
+			pool->item_idx = idx;
+			return true;
+		}
+	}
+
+	pool->item_idx = idx;
+	DEBUG_NET_WARN_ON_ONCE(true);
+	return false;
+}
+
+static void page_pool_item_del(struct page_pool *pool, netmem_ref netmem)
+{
+	struct page_pool_item *item = netmem_to_page(netmem)->pp_item;
+	struct page_pool_item *items = pool->items;
+	unsigned int idx = item->pp_idx;
+
+	DEBUG_NET_WARN_ON_ONCE(items[idx].pp_netmem != netmem);
+	WRITE_ONCE(items[idx].pp_netmem, (unsigned long __bitwise)NULL);
+	netmem_set_pp_item(netmem, NULL);
+}
+
+#define PAGE_POOL_MIN_ITEM_CNT	512
+
 /**
  * page_pool_create_percpu() - create a page pool for a given cpu.
  * @params: parameters, see struct page_pool_params
@@ -329,10 +405,14 @@ static void page_pool_uninit(struct page_pool *pool)
 struct page_pool *
 page_pool_create_percpu(const struct page_pool_params *params, int cpuid)
 {
+	unsigned int item_cnt = (params->pool_size ? : 1024) +
+				PP_ALLOC_CACHE_SIZE + PAGE_POOL_MIN_ITEM_CNT;
 	struct page_pool *pool;
 	int err;
 
-	pool = kzalloc_node(sizeof(*pool), GFP_KERNEL, params->nid);
+	item_cnt = roundup_pow_of_two(item_cnt);
+	pool = kvzalloc_node(struct_size(pool, items, item_cnt), GFP_KERNEL,
+			     params->nid);
 	if (!pool)
 		return ERR_PTR(-ENOMEM);
 
@@ -340,6 +420,8 @@ page_pool_create_percpu(const struct page_pool_params *params, int cpuid)
 	if (err < 0)
 		goto err_free;
 
+	page_pool_item_init(pool, item_cnt);
+
 	err = page_pool_list(pool);
 	if (err)
 		goto err_uninit;
@@ -350,7 +432,7 @@ page_pool_create_percpu(const struct page_pool_params *params, int cpuid)
 	page_pool_uninit(pool);
 err_free:
 	pr_warn("%s() gave up with errno %d\n", __func__, err);
-	kfree(pool);
+	kvfree(pool);
 	return ERR_PTR(err);
 }
 EXPORT_SYMBOL(page_pool_create_percpu);
@@ -499,19 +581,24 @@ static struct page *__page_pool_alloc_page_order(struct page_pool *pool,
 	if (unlikely(!page))
 		return NULL;
 
-	if (pool->dma_map && unlikely(!page_pool_dma_map(pool, page_to_netmem(page)))) {
-		put_page(page);
-		return NULL;
-	}
+	if (unlikely(!page_pool_set_pp_info(pool, page_to_netmem(page))))
+		goto err_alloc;
+
+	if (pool->dma_map && unlikely(!page_pool_dma_map(pool, page_to_netmem(page))))
+		goto err_set_info;
 
 	alloc_stat_inc(pool, slow_high_order);
-	page_pool_set_pp_info(pool, page_to_netmem(page));
 
 	/* Track how many pages are held 'in-flight' */
 	pool->pages_state_hold_cnt++;
 	trace_page_pool_state_hold(pool, page_to_netmem(page),
 				   pool->pages_state_hold_cnt);
 	return page;
+err_set_info:
+	page_pool_clear_pp_info(pool, page_to_netmem(page));
+err_alloc:
+	put_page(page);
+	return NULL;
 }
 
 /* slow path */
@@ -546,12 +633,18 @@ static noinline netmem_ref __page_pool_alloc_pages_slow(struct page_pool *pool,
 	 */
 	for (i = 0; i < nr_pages; i++) {
 		netmem = pool->alloc.cache[i];
+
+		if (unlikely(!page_pool_set_pp_info(pool, netmem))) {
+			put_page(netmem_to_page(netmem));
+			continue;
+		}
+
 		if (dma_map && unlikely(!page_pool_dma_map(pool, netmem))) {
+			page_pool_clear_pp_info(pool, netmem);
 			put_page(netmem_to_page(netmem));
 			continue;
 		}
 
-		page_pool_set_pp_info(pool, netmem);
 		pool->alloc.cache[pool->alloc.count++] = netmem;
 		/* Track how many pages are held 'in-flight' */
 		pool->pages_state_hold_cnt++;
@@ -623,9 +716,13 @@ s32 page_pool_inflight(const struct page_pool *pool, bool strict)
 	return inflight;
 }
 
-void page_pool_set_pp_info(struct page_pool *pool, netmem_ref netmem)
+bool page_pool_set_pp_info(struct page_pool *pool, netmem_ref netmem)
 {
-	netmem_set_pp(netmem, pool);
+	if (unlikely(!page_pool_item_add(pool, netmem)))
+		return false;
+
+	DEBUG_NET_WARN_ON_ONCE(page_pool_to_pp(netmem_to_page(netmem)) != pool);
+
 	netmem_or_pp_magic(netmem, PP_SIGNATURE);
 
 	/* Ensuring all pages have been split into one fragment initially:
@@ -637,12 +734,14 @@ void page_pool_set_pp_info(struct page_pool *pool, netmem_ref netmem)
 	page_pool_fragment_netmem(netmem, 1);
 	if (pool->has_init_callback)
 		pool->slow.init_callback(netmem, pool->slow.init_arg);
+
+	return true;
 }
 
-void page_pool_clear_pp_info(netmem_ref netmem)
+void page_pool_clear_pp_info(struct page_pool *pool, netmem_ref netmem)
 {
 	netmem_clear_pp_magic(netmem);
-	netmem_set_pp(netmem, NULL);
+	page_pool_item_del(pool, netmem);
 }
 
 static __always_inline void __page_pool_release_page_dma(struct page_pool *pool,
@@ -672,9 +771,13 @@ static __always_inline void __page_pool_release_page_dma(struct page_pool *pool,
  */
 void page_pool_return_page(struct page_pool *pool, netmem_ref netmem)
 {
+	unsigned int destroy_cnt = READ_ONCE(pool->destroy_cnt);
 	int count;
 	bool put;
 
+	if (unlikely(destroy_cnt))
+		spin_lock_bh(&pool->destroy_lock);
+
 	put = true;
 	if (static_branch_unlikely(&page_pool_mem_providers) && pool->mp_priv)
 		put = mp_dmabuf_devmem_release_page(pool, netmem);
@@ -688,9 +791,13 @@ void page_pool_return_page(struct page_pool *pool, netmem_ref netmem)
 	trace_page_pool_state_release(pool, netmem, count);
 
 	if (put) {
-		page_pool_clear_pp_info(netmem);
+		page_pool_clear_pp_info(pool, netmem);
 		put_page(netmem_to_page(netmem));
 	}
+
+	if (unlikely(destroy_cnt))
+		spin_unlock_bh(&pool->destroy_lock);
+
 	/* An optimization would be to call __free_pages(page, pool->p.order)
 	 * knowing page is not part of page-cache (thus avoiding a
 	 * __page_cache_release() call).
@@ -1034,14 +1141,14 @@ static void __page_pool_destroy(struct page_pool *pool)
 		static_branch_dec(&page_pool_mem_providers);
 	}
 
-	kfree(pool);
+	kvfree(pool);
 }
 
 static void page_pool_empty_alloc_cache_once(struct page_pool *pool)
 {
 	netmem_ref netmem;
 
-	if (pool->destroy_cnt)
+	if (pool->destroy_cnt > 1)
 		return;
 
 	/* Empty alloc cache, assume caller made sure this is
@@ -1057,7 +1164,7 @@ static void page_pool_empty_alloc_cache_once(struct page_pool *pool)
 static void page_pool_scrub(struct page_pool *pool)
 {
 	page_pool_empty_alloc_cache_once(pool);
-	pool->destroy_cnt++;
+	WRITE_ONCE(pool->destroy_cnt, pool->destroy_cnt + 1);
 
 	/* No more consumers should exist, but producers could still
 	 * be in-flight.
@@ -1139,10 +1246,14 @@ void page_pool_destroy(struct page_pool *pool)
 	if (!page_pool_put(pool))
 		return;
 
+	/* disable dma_sync_for_device */
+	pool->dma_sync = false;
+
 	page_pool_disable_direct_recycling(pool);
+	WRITE_ONCE(pool->destroy_cnt, 1);
 
-	/* Wait for the freeing side see the disabling direct recycling setting
-	 * to avoid the concurrent access to the pool->alloc cache.
+	/* Wait for the freeing side to see the new pool->dma_sync,
+	 * disable_direct and pool->destroy_cnt in page_pool_put_page.
 	 */
 	synchronize_rcu();
 
@@ -1151,6 +1262,8 @@ void page_pool_destroy(struct page_pool *pool)
 	if (!page_pool_release(pool))
 		return;
 
+	page_pool_item_uninit(pool);
+
 	page_pool_detached(pool);
 	pool->defer_start = jiffies;
 	pool->defer_warn  = jiffies + DEFER_WARN_INTERVAL;
diff --git a/net/core/page_pool_priv.h b/net/core/page_pool_priv.h
index 57439787b9c2..5d85f862a30a 100644
--- a/net/core/page_pool_priv.h
+++ b/net/core/page_pool_priv.h
@@ -36,16 +36,18 @@ static inline bool page_pool_set_dma_addr(struct page *page, dma_addr_t addr)
 }
 
 #if defined(CONFIG_PAGE_POOL)
-void page_pool_set_pp_info(struct page_pool *pool, netmem_ref netmem);
-void page_pool_clear_pp_info(netmem_ref netmem);
+bool page_pool_set_pp_info(struct page_pool *pool, netmem_ref netmem);
+void page_pool_clear_pp_info(struct page_pool *pool, netmem_ref netmem);
 int page_pool_check_memory_provider(struct net_device *dev,
 				    struct netdev_rx_queue *rxq);
 #else
-static inline void page_pool_set_pp_info(struct page_pool *pool,
+static inline bool page_pool_set_pp_info(struct page_pool *pool,
 					 netmem_ref netmem)
 {
+	return true;
 }
-static inline void page_pool_clear_pp_info(netmem_ref netmem)
+static inline void page_pool_clear_pp_info(struct page_pool *pool,
+					   netmem_ref netmem)
 {
 }
 static inline int page_pool_check_memory_provider(struct net_device *dev,
diff --git a/net/core/skbuff.c b/net/core/skbuff.c
index 74149dc4ee31..d4295353ca6e 100644
--- a/net/core/skbuff.c
+++ b/net/core/skbuff.c
@@ -1033,7 +1033,8 @@ bool napi_pp_put_page(netmem_ref netmem)
 	if (unlikely(!is_pp_netmem(netmem)))
 		return false;
 
-	page_pool_put_full_netmem(netmem_get_pp(netmem), netmem, false);
+	page_pool_put_full_netmem(page_pool_to_pp(netmem_to_page(netmem)),
+				  netmem, false);
 
 	return true;
 }
diff --git a/net/core/xdp.c b/net/core/xdp.c
index bcc5551c6424..e8582036b411 100644
--- a/net/core/xdp.c
+++ b/net/core/xdp.c
@@ -384,7 +384,8 @@ void __xdp_return(void *data, struct xdp_mem_info *mem, bool napi_direct,
 		/* No need to check ((page->pp_magic & ~0x3UL) == PP_SIGNATURE)
 		 * as mem->type knows this a page_pool page
 		 */
-		page_pool_put_full_page(page->pp, page, napi_direct);
+		page_pool_put_full_page(page_pool_to_pp(page), page,
+					napi_direct);
 		break;
 	case MEM_TYPE_PAGE_SHARED:
 		page_frag_free(data);
-- 
2.33.0



From alexandre.belloni at bootlin.com  Wed Sep 18 04:51:51 2024
From: alexandre.belloni at bootlin.com (Alexandre Belloni)
Date: Wed, 18 Sep 2024 13:51:51 +0200
Subject: [PATCH v6 2/2] dt-bindings: mfd: mediatek: mt6397: Convert to DT
 schema format
In-Reply-To: <20240918064955.6518-2-macpaul.lin@mediatek.com>
References: <20240918064955.6518-1-macpaul.lin@mediatek.com>
 <20240918064955.6518-2-macpaul.lin@mediatek.com>
Message-ID: <20240918115151c896f33f@mail.local>

On 18/09/2024 14:49:55+0800, Macpaul Lin wrote:
> Convert the mfd: mediatek: mt6397 binding to DT schema format.
> 
> MT6323, MT6358, and MT6397 are PMIC devices with multiple function
> subdevices. They share a common PMIC design but have variations in
> subdevice combinations.
> 
> Key updates in this conversion:
> 
> 1. RTC:
>    - Convert rtc-mt6397.txt and merge into parent MT6397 PMIC DT schema.
> 
> 2. Regulators:
>    - Align to generic name "regulators".
>    - Update references from .txt to .yaml for mt6323, mt6358, and mt6397
>      regulators.
>    - Simplify regulator name labels in device tree examples.
> 
> 3. Audio Codec:
>    - Convert sound/mt6358.txt and merge into parent MT6397 PMIC DT schema.
>    - Align to generic name "audio-codec" for codec and sound subdevices.
>    - Add "mediatek,dmic-mode" and "Avdd-supply" properties.
> 
> 4. Clocks:
>    - Align to generic name "clocks" for clockbuffer subdevices.
> 
> 5. LEDs:
>    - Convert leds-mt6323.txt and merge into parent MT6397 PMIC DT schema.
>    - Update LED binding.
> 
> 6. Keys:
>    - Add detailed descriptions for power and home keys.
>    - Add compatible: mediatek,mt6358-keys.
> 
> 7. Power Controller:
>    - Convert mt6323-poweroff.txt and merge into parent MT6397 PMIC DT
>      schema.
>    - Add #power-domain-cells property to fix dt-binding check error.
>    - Clarify "BBPU" as "Baseband power up".
> 
> 8. Pinctrl:
>    - Align to generic name "pinctrl" instead of "pin-controller".
> 
> 9. Compatible:
>    - Drop "mediatek,mt6357" since there is a separated DT Schema
>      for PMIC MT6357.
> 
> 10. Examples:
>    - MT6323: Retain complete examples for this PMIC.
>    - MT6358 and MT6397: simplify settings in regulators.
>     - Preserve "audio-codec", "clocks", "pinctrl", "rtc", and "keys"
>       sections as they contain typical settings for different PMICs.
> 
> Additional updates:
> - MAINTAINERS: Add co-maintainers and reference to
>   mfd/mediatek,mt6397.yaml for LED and power-controller drivers.
> - input/mediatek,pmic-keys.yaml: Update reference to
>   mfd/mediatek,mt6397.yaml.
> 
> Signed-off-by: Sen Chu <sen.chu at mediatek.com>
> Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
> ---
>  .../bindings/input/mediatek,pmic-keys.yaml    |   2 +-
>  .../devicetree/bindings/leds/leds-mt6323.txt  |  63 --
>  .../bindings/mfd/mediatek,mt6397.yaml         | 601 ++++++++++++++++++
>  .../devicetree/bindings/mfd/mt6397.txt        | 110 ----
>  .../bindings/power/reset/mt6323-poweroff.txt  |  20 -
>  .../devicetree/bindings/rtc/rtc-mt6397.txt    |  31 -
>  .../devicetree/bindings/sound/mt6358.txt      |  26 -
>  MAINTAINERS                                   |   8 +-
>  8 files changed, 608 insertions(+), 253 deletions(-)
>  delete mode 100644 Documentation/devicetree/bindings/leds/leds-mt6323.txt
>  create mode 100644 Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml
>  delete mode 100644 Documentation/devicetree/bindings/mfd/mt6397.txt
>  delete mode 100644 Documentation/devicetree/bindings/power/reset/mt6323-poweroff.txt
>  delete mode 100644 Documentation/devicetree/bindings/rtc/rtc-mt6397.txt
>  delete mode 100644 Documentation/devicetree/bindings/sound/mt6358.txt
> 
> Changes for v1:
>  - This patch depends on conversion of mediatek,mt6397-regulator.yaml
>    [1] https://lore.kernel.org/lkml/20240807091738.18387-1-macpaul.lin at mediatek.com/T/
> 
> Changes for v2:
>  - This patch has been made base on linux-next/master git repo.
>  - Keep the parent and child relationship with mediatek,pwrap in description.
>    [2] https://lore.kernel.org/all/20240826-slurp-earphone-0d5173923ae8 at spud/
>  - Keep the $ref for regulators since dt_binding_check didn't report any issue
>    based on linux-next/master repo.
>  - Fix description of mt6397/mt6323 devices, use "power management chip"
>    instead of "multifunction device"
>  - Drop unnecessary comments or description according to the review.
>  - Convert sub-modules to DT Schema:
>   - RTC, LEDs, power-controllers, regulators
>  - Drop duplicate sub node name and description for sub-modules
>   - RTC, Keys
>  - examples:
>   - drop parent pwrap node
>   - Add examples from mediatek,mt6323-regulator.yaml
>   - Add examples from mediatek,mt6358-regulator.yaml
>   - Add examples from mediatek,mt6397-regulator.yaml
>   - Complete the examples as could as possible.
> 
> Changes for v3:
>  - Rebased on linux-next/master git repo near next-20240906.
>  - Revise commit message.
>  - Regulators:
>   - Use "additionalProperties: true" and add "contains" for matching
>     $ref DT bindings.
>   - Simplify regulator name labels in device tree examples.
>  - LEDs:
>   - Use LED bindings.
>  - Squash following patches in v2 for removing old text format DT bindings
>    into this patch, includes:
>   - leds-mt6323.txt, mt6323-poweroff.txt, rtc-mt6397.txt, sound/mt6358.txt.
>  - Fix file format of DT schemas, add blank between properties.
>  - Fix 'make checkrefdoc' errors, update reference in mediatek,pmic-keys.yaml.
> 
> Changes for v4:
>  - Remove "mediatek,mt6357" from PMIC's compatible string since there is a
>    seperated DT schema for PMIC mt6357.
> 
> Changes for v5:
>  - Rebase to next-20240913 (linux-next/master).
>  - Fix the "title" (device type) of mfd/mediatek,mt6397.yaml to "PMIC".
>  - RTC:
>   - Drop "start-year"

Maybe, instead of dropping the property, you should add support in the
driver by setting range_min and range_max.

>  - Regulators:
>   - Add blank lines between description and properties.
>   - Drop allOf for the $ref section on property.
>  - clocks:
>   - Fix no need '|' in descriptoin.
>   - Add blank lines between description and properties.
>  - Keys:
>   - Drop compatible since these enums are already in $ref.
>  - pinctrl:
>   - Drop compatible since it is already in $ref.
>  - examples:
>   - Fix indentations for leds and keys.
> 
> Changes for v6:
>  - Commit message:
>   - Add note for simplifying examples of mt6358 and mt6397.
>  - examples:
>   - Fix indentations for mt6323-keys.
>   - MT6358 and MT6397: simplify settings in regulators.
>    - Preserve "audio-codec", "clocks", "pinctrl", "rtc", and "keys"
>      sections as they contain typical settings for different PMICs.
> 
> diff --git a/Documentation/devicetree/bindings/input/mediatek,pmic-keys.yaml b/Documentation/devicetree/bindings/input/mediatek,pmic-keys.yaml
> index 70567d9..466566a 100644
> --- a/Documentation/devicetree/bindings/input/mediatek,pmic-keys.yaml
> +++ b/Documentation/devicetree/bindings/input/mediatek,pmic-keys.yaml
> @@ -19,7 +19,7 @@ description: |
>    by the PMIC that is defined as a Multi-Function Device (MFD).
>  
>    For MediaTek MT6323/MT6397 PMIC bindings see
> -  Documentation/devicetree/bindings/mfd/mt6397.txt
> +  Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml
>  
>  properties:
>    compatible:
> diff --git a/Documentation/devicetree/bindings/leds/leds-mt6323.txt b/Documentation/devicetree/bindings/leds/leds-mt6323.txt
> deleted file mode 100644
> index 052dccb8..0000000
> --- a/Documentation/devicetree/bindings/leds/leds-mt6323.txt
> +++ /dev/null
> @@ -1,63 +0,0 @@
> -Device Tree Bindings for LED support on MT6323 PMIC
> -
> -MT6323 LED controller is subfunction provided by MT6323 PMIC, so the LED
> -controllers are defined as the subnode of the function node provided by MT6323
> -PMIC controller that is being defined as one kind of Muti-Function Device (MFD)
> -using shared bus called PMIC wrapper for each subfunction to access remote
> -MT6323 PMIC hardware.
> -
> -For MT6323 MFD bindings see:
> -Documentation/devicetree/bindings/mfd/mt6397.txt
> -For MediaTek PMIC wrapper bindings see:
> -Documentation/devicetree/bindings/soc/mediatek/mediatek,pwrap.yaml
> -
> -Required properties:
> -- compatible : Must be one of
> -  - "mediatek,mt6323-led"
> -  - "mediatek,mt6331-led"
> -  - "mediatek,mt6332-led"
> -- address-cells : Must be 1
> -- size-cells : Must be 0
> -
> -Each led is represented as a child node of the mediatek,mt6323-led that
> -describes the initial behavior for each LED physically and currently only four
> -LED child nodes can be supported.
> -
> -Required properties for the LED child node:
> -- reg : LED channel number (0..3)
> -
> -Optional properties for the LED child node:
> -- label : See Documentation/devicetree/bindings/leds/common.txt
> -- linux,default-trigger : See Documentation/devicetree/bindings/leds/common.txt
> -- default-state: See Documentation/devicetree/bindings/leds/common.txt
> -
> -Example:
> -
> -	mt6323: pmic {
> -		compatible = "mediatek,mt6323";
> -
> -		...
> -
> -		mt6323led: leds {
> -			compatible = "mediatek,mt6323-led";
> -			#address-cells = <1>;
> -			#size-cells = <0>;
> -
> -			led at 0 {
> -				reg = <0>;
> -				label = "LED0";
> -				linux,default-trigger = "timer";
> -				default-state = "on";
> -			};
> -			led at 1 {
> -				reg = <1>;
> -				label = "LED1";
> -				default-state = "off";
> -			};
> -			led at 2 {
> -				reg = <2>;
> -				label = "LED2";
> -				default-state = "on";
> -			};
> -		};
> -	};
> diff --git a/Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml b/Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml
> new file mode 100644
> index 0000000..953358b
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml
> @@ -0,0 +1,601 @@
> +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
> +%YAML 1.2
> +---
> +$id: http://devicetree.org/schemas/mfd/mediatek,mt6397.yaml#
> +$schema: http://devicetree.org/meta-schemas/core.yaml#
> +
> +title: MediaTek MT6397/MT6323 PMIC
> +
> +maintainers:
> +  - Sen Chu <sen.chu at mediatek.com>
> +  - Macpaul Lin <macpaul.lin at mediatek.com>
> +
> +description: |
> +  MT6397/MT6323 is a power management system chip.
> +  Please see the sub-modules below for supported features.
> +
> +  MT6397/MT6323 is a multifunction device with the following sub modules:
> +  - Regulators
> +  - RTC
> +  - Audio codec
> +  - GPIO
> +  - Clock
> +  - LED
> +  - Keys
> +  - Power controller
> +
> +  It is interfaced to host controller using SPI interface by a proprietary hardware
> +  called PMIC wrapper or pwrap. MT6397/MT6323 PMIC is a child device of pwrap.
> +  See the following for pwrap node definitions:
> +  Documentation/devicetree/bindings/soc/mediatek/mediatek,pwrap.yaml
> +
> +properties:
> +  compatible:
> +    oneOf:
> +      - enum:
> +          - mediatek,mt6323
> +          - mediatek,mt6331 # "mediatek,mt6331" for PMIC MT6331 and MT6332.
> +          - mediatek,mt6358
> +          - mediatek,mt6359
> +          - mediatek,mt6397
> +      - items:
> +          - enum:
> +              - mediatek,mt6366
> +          - const: mediatek,mt6358
> +
> +  interrupts:
> +    maxItems: 1
> +
> +  interrupt-controller: true
> +
> +  "#interrupt-cells":
> +    const: 2
> +
> +  rtc:
> +    type: object
> +    $ref: /schemas/rtc/rtc.yaml#
> +    unevaluatedProperties: false
> +    description:
> +      MT6397 Real Time Clock.
> +
> +    properties:
> +      compatible:
> +        oneOf:
> +          - enum:
> +              - mediatek,mt6323-rtc
> +              - mediatek,mt6331-rtc
> +              - mediatek,mt6358-rtc
> +              - mediatek,mt6397-rtc
> +          - items:
> +              - enum:
> +                  - mediatek,mt6366-rtc
> +              - const: mediatek,mt6358-rtc
> +
> +    required:
> +      - compatible
> +
> +  regulators:
> +    type: object
> +    description:
> +      List of child nodes that specify the regulators.
> +    additionalProperties: true
> +
> +    properties:
> +      compatible:
> +        oneOf:
> +          - enum:
> +              - mediatek,mt6323-regulator
> +              - mediatek,mt6358-regulator
> +              - mediatek,mt6397-regulator
> +          - items:
> +              - enum:
> +                  - mediatek,mt6366-regulator
> +              - const: mediatek,mt6358-regulator
> +
> +    required:
> +      - compatible
> +
> +  audio-codec:
> +    type: object
> +    additionalProperties: false
> +    description:
> +      Audio codec support with MT6397 and MT6358.
> +
> +    properties:
> +      compatible:
> +        oneOf:
> +          - enum:
> +              - mediatek,mt6397-codec
> +              - mediatek,mt6358-sound
> +          - items:
> +              - enum:
> +                  - mediatek,mt6366-sound
> +              - const: mediatek,mt6358-sound
> +
> +      mediatek,dmic-mode:
> +        description: |
> +          Indicates how many data pins are used to transmit two channels of PDM
> +          signal.
> +          0 - two wires;
> +          1 - one wire;
> +          Default value is 0.
> +        enum: [0, 1]
> +        default: 0
> +
> +      Avdd-supply:
> +        description: Power source of AVDD.
> +
> +    required:
> +      - compatible
> +
> +  clocks:
> +    type: object
> +    additionalProperties: false
> +    description:
> +      This is a clock buffer node for mt6397. However, there are no sub nodes
> +      or any public document exposed in public.
> +
> +    properties:
> +      compatible:
> +        const: mediatek,mt6397-clk
> +
> +      '#clock-cells':
> +        const: 1
> +
> +    required:
> +      - compatible
> +
> +  leds:
> +    type: object
> +    additionalProperties: false
> +    description: |
> +      MT6323 LED controller is subfunction provided by MT6323 PMIC, so the LED
> +      controllers are defined as the subnode of the function node provided by MT6323
> +      PMIC controller that is being defined as one kind of Muti-Function Device (MFD)
> +      using shared bus called PMIC wrapper for each subfunction to access remote
> +      MT6323 PMIC hardware.
> +
> +      Each led is represented as a child node of the mediatek,mt6323-led that
> +      describes the initial behavior for each LED physically and currently only four
> +      LED child nodes can be supported.
> +
> +    properties:
> +      compatible:
> +        enum:
> +          - mediatek,mt6323-led
> +          - mediatek,mt6331-led
> +          - mediatek,mt6332-led
> +
> +      reg:
> +        maxItems: 1
> +
> +      "#address-cells":
> +        const: 1
> +
> +      "#size-cells":
> +        const: 0
> +
> +    patternProperties:
> +      "^led@[0-3]$":
> +        type: object
> +        $ref: /schemas/leds/common.yaml#
> +        unevaluatedProperties: false
> +
> +        properties:
> +          reg:
> +            description:
> +              LED channel number (0..3)
> +            minimum: 0
> +            maximum: 3
> +
> +        required:
> +          - reg
> +
> +    required:
> +      - compatible
> +      - "#address-cells"
> +      - "#size-cells"
> +
> +  keys:
> +    type: object
> +    $ref: /schemas/input/mediatek,pmic-keys.yaml
> +    unevaluatedProperties: false
> +    description:
> +      Power and Home keys.
> +
> +  power-controller:
> +    type: object
> +    additionalProperties: false
> +    description:
> +      The power controller which could be found on PMIC is responsible for
> +      externally powering off or on the remote MediaTek SoC through the
> +      circuit BBPU (baseband power up).
> +
> +    properties:
> +      compatible:
> +        const: mediatek,mt6323-pwrc
> +
> +      '#power-domain-cells':
> +        const: 0
> +
> +  pinctrl:
> +    type: object
> +    $ref: /schemas/pinctrl/mediatek,mt65xx-pinctrl.yaml
> +    unevaluatedProperties: false
> +    description:
> +      Pin controller
> +
> +required:
> +  - compatible
> +  - regulators
> +
> +additionalProperties: false
> +
> +examples:
> +  - |
> +    #include <dt-bindings/interrupt-controller/arm-gic.h>
> +    #include <dt-bindings/leds/common.h>
> +
> +    pmic {
> +        compatible = "mediatek,mt6323";
> +        interrupt-parent = <&pio>;
> +        interrupts = <150 IRQ_TYPE_LEVEL_HIGH>;
> +        interrupt-controller;
> +        #interrupt-cells = <2>;
> +
> +        leds {
> +            compatible = "mediatek,mt6323-led";
> +            #address-cells = <1>;
> +            #size-cells = <0>;
> +        };
> +
> +        regulators {
> +            compatible = "mediatek,mt6323-regulator";
> +
> +            buck_vproc {
> +                regulator-name = "vproc";
> +                regulator-min-microvolt = < 700000>;
> +                regulator-max-microvolt = <1350000>;
> +                regulator-ramp-delay = <12500>;
> +                regulator-always-on;
> +                regulator-boot-on;
> +            };
> +
> +            buck_vsys {
> +                regulator-name = "vsys";
> +                regulator-min-microvolt = <1400000>;
> +                regulator-max-microvolt = <2987500>;
> +                regulator-ramp-delay = <25000>;
> +                regulator-always-on;
> +                regulator-boot-on;
> +            };
> +
> +            buck_vpa {
> +                regulator-name = "vpa";
> +                regulator-min-microvolt = < 500000>;
> +                regulator-max-microvolt = <3650000>;
> +            };
> +
> +            ldo_vtcxo {
> +                regulator-name = "vtcxo";
> +                regulator-min-microvolt = <2800000>;
> +                regulator-max-microvolt = <2800000>;
> +                regulator-enable-ramp-delay = <90>;
> +                regulator-always-on;
> +                regulator-boot-on;
> +            };
> +
> +            ldo_vcn28 {
> +                regulator-name = "vcn28";
> +                regulator-min-microvolt = <2800000>;
> +                regulator-max-microvolt = <2800000>;
> +                regulator-enable-ramp-delay = <185>;
> +            };
> +
> +            ldo_vcn33_bt {
> +                regulator-name = "vcn33_bt";
> +                regulator-min-microvolt = <3300000>;
> +                regulator-max-microvolt = <3600000>;
> +                regulator-enable-ramp-delay = <185>;
> +            };
> +
> +            ldo_vcn33_wifi {
> +                regulator-name = "vcn33_wifi";
> +                regulator-min-microvolt = <3300000>;
> +                regulator-max-microvolt = <3600000>;
> +                regulator-enable-ramp-delay = <185>;
> +            };
> +
> +            ldo_va {
> +                regulator-name = "va";
> +                regulator-min-microvolt = <2800000>;
> +                regulator-max-microvolt = <2800000>;
> +                regulator-enable-ramp-delay = <216>;
> +                regulator-always-on;
> +                regulator-boot-on;
> +            };
> +
> +            ldo_vcama {
> +                regulator-name = "vcama";
> +                regulator-min-microvolt = <1500000>;
> +                regulator-max-microvolt = <2800000>;
> +                regulator-enable-ramp-delay = <216>;
> +            };
> +
> +            ldo_vio28 {
> +                regulator-name = "vio28";
> +                regulator-min-microvolt = <2800000>;
> +                regulator-max-microvolt = <2800000>;
> +                regulator-enable-ramp-delay = <216>;
> +                regulator-always-on;
> +                regulator-boot-on;
> +            };
> +
> +            ldo_vusb {
> +                regulator-name = "vusb";
> +                regulator-min-microvolt = <3300000>;
> +                regulator-max-microvolt = <3300000>;
> +                regulator-enable-ramp-delay = <216>;
> +                regulator-boot-on;
> +            };
> +
> +            ldo_vmc {
> +                regulator-name = "vmc";
> +                regulator-min-microvolt = <1800000>;
> +                regulator-max-microvolt = <3300000>;
> +                regulator-enable-ramp-delay = <36>;
> +                regulator-boot-on;
> +            };
> +
> +            ldo_vmch {
> +                regulator-name = "vmch";
> +                regulator-min-microvolt = <3000000>;
> +                regulator-max-microvolt = <3300000>;
> +                regulator-enable-ramp-delay = <36>;
> +                regulator-boot-on;
> +            };
> +
> +            ldo_vemc3v3 {
> +                regulator-name = "vemc3v3";
> +                regulator-min-microvolt = <3000000>;
> +                regulator-max-microvolt = <3300000>;
> +                regulator-enable-ramp-delay = <36>;
> +                regulator-boot-on;
> +            };
> +
> +            ldo_vgp1 {
> +                regulator-name = "vgp1";
> +                regulator-min-microvolt = <1200000>;
> +                regulator-max-microvolt = <3300000>;
> +                regulator-enable-ramp-delay = <216>;
> +            };
> +
> +            ldo_vgp2 {
> +                regulator-name = "vgp2";
> +                regulator-min-microvolt = <1200000>;
> +                regulator-max-microvolt = <3000000>;
> +                regulator-enable-ramp-delay = <216>;
> +            };
> +
> +            ldo_vgp3 {
> +                regulator-name = "vgp3";
> +                regulator-min-microvolt = <1200000>;
> +                regulator-max-microvolt = <1800000>;
> +                regulator-enable-ramp-delay = <216>;
> +            };
> +
> +            ldo_vcn18 {
> +                regulator-name = "vcn18";
> +                regulator-min-microvolt = <1800000>;
> +                regulator-max-microvolt = <1800000>;
> +                regulator-enable-ramp-delay = <216>;
> +            };
> +
> +            ldo_vsim1 {
> +                regulator-name = "vsim1";
> +                regulator-min-microvolt = <1800000>;
> +                regulator-max-microvolt = <3000000>;
> +                regulator-enable-ramp-delay = <216>;
> +            };
> +
> +            ldo_vsim2 {
> +                regulator-name = "vsim2";
> +                regulator-min-microvolt = <1800000>;
> +                regulator-max-microvolt = <3000000>;
> +                regulator-enable-ramp-delay = <216>;
> +            };
> +
> +            ldo_vrtc {
> +                regulator-name = "vrtc";
> +                regulator-min-microvolt = <2800000>;
> +                regulator-max-microvolt = <2800000>;
> +                regulator-always-on;
> +                regulator-boot-on;
> +            };
> +
> +            ldo_vcamaf {
> +                regulator-name = "vcamaf";
> +                regulator-min-microvolt = <1200000>;
> +                regulator-max-microvolt = <3300000>;
> +                regulator-enable-ramp-delay = <216>;
> +            };
> +
> +            ldo_vibr {
> +                regulator-name = "vibr";
> +                regulator-min-microvolt = <1200000>;
> +                regulator-max-microvolt = <3300000>;
> +                regulator-enable-ramp-delay = <36>;
> +            };
> +
> +            ldo_vrf18 {
> +                regulator-name = "vrf18";
> +                regulator-min-microvolt = <1825000>;
> +                regulator-max-microvolt = <1825000>;
> +                regulator-enable-ramp-delay = <187>;
> +            };
> +
> +            ldo_vm {
> +                regulator-name = "vm";
> +                regulator-min-microvolt = <1200000>;
> +                regulator-max-microvolt = <1800000>;
> +                regulator-enable-ramp-delay = <216>;
> +                regulator-always-on;
> +                regulator-boot-on;
> +            };
> +
> +            ldo_vio18 {
> +                regulator-name = "vio18";
> +                regulator-min-microvolt = <1800000>;
> +                regulator-max-microvolt = <1800000>;
> +                regulator-enable-ramp-delay = <216>;
> +                regulator-always-on;
> +                regulator-boot-on;
> +            };
> +
> +           ldo_vcamd {
> +                regulator-name = "vcamd";
> +                regulator-min-microvolt = <1200000>;
> +                regulator-max-microvolt = <1800000>;
> +                regulator-enable-ramp-delay = <216>;
> +            };
> +
> +            ldo_vcamio {
> +                regulator-name = "vcamio";
> +                regulator-min-microvolt = <1800000>;
> +                regulator-max-microvolt = <1800000>;
> +                regulator-enable-ramp-delay = <216>;
> +            };
> +        };
> +
> +        keys {
> +            compatible = "mediatek,mt6323-keys";
> +            mediatek,long-press-mode = <1>;
> +            power-off-time-sec = <0>;
> +
> +            power {
> +                linux,keycodes = <116>;
> +                wakeup-source;
> +            };
> +
> +            home {
> +                linux,keycodes = <114>;
> +            };
> +        };
> +
> +        power-controller {
> +            compatible = "mediatek,mt6323-pwrc";
> +            #power-domain-cells = <0>;
> +        };
> +
> +        rtc {
> +            compatible = "mediatek,mt6323-rtc";
> +        };
> +    };
> +
> +  - |
> +    #include <dt-bindings/input/input.h>
> +    #include <dt-bindings/interrupt-controller/arm-gic.h>
> +
> +    pmic {
> +        compatible = "mediatek,mt6358";
> +        interrupt-controller;
> +        #interrupt-cells = <2>;
> +
> +        audio-codec {
> +            compatible = "mediatek,mt6358-sound";
> +            Avdd-supply = <&mt6358_vaud28_reg>;
> +            mediatek,dmic-mode = <0>;
> +        };
> +
> +        regulators {
> +            compatible = "mediatek,mt6358-regulator";
> +
> +            buck_vdram1 {
> +                regulator-name = "vdram1";
> +                regulator-min-microvolt = <500000>;
> +                regulator-max-microvolt = <2087500>;
> +                regulator-ramp-delay = <12500>;
> +                regulator-enable-ramp-delay = <0>;
> +                regulator-always-on;
> +                regulator-allowed-modes = <0 1>;
> +            };
> +
> +            // ...
> +
> +            ldo_vsim2 {
> +                regulator-name = "vsim2";
> +                regulator-min-microvolt = <1700000>;
> +                regulator-max-microvolt = <3100000>;
> +                regulator-enable-ramp-delay = <540>;
> +            };
> +        };
> +
> +        rtc {
> +            compatible = "mediatek,mt6358-rtc";
> +        };
> +
> +        keys {
> +            compatible = "mediatek,mt6358-keys";
> +
> +            power {
> +                linux,keycodes = <KEY_POWER>;
> +                wakeup-source;
> +            };
> +
> +            home {
> +                linux,keycodes = <KEY_HOME>;
> +            };
> +        };
> +    };
> +
> +  - |
> +    #include <dt-bindings/interrupt-controller/arm-gic.h>
> +
> +    pmic {
> +        compatible = "mediatek,mt6397";
> +
> +        interrupt-parent = <&pio>;
> +        interrupts-extended = <&pio 222 IRQ_TYPE_LEVEL_HIGH>;
> +        interrupt-controller;
> +        #interrupt-cells = <2>;
> +
> +        audio-codec {
> +            compatible = "mediatek,mt6397-codec";
> +        };
> +
> +        clocks {
> +            compatible = "mediatek,mt6397-clk";
> +            #clock-cells = <1>;
> +        };
> +
> +        pinctrl {
> +            compatible = "mediatek,mt6397-pinctrl";
> +            gpio-controller;
> +            #gpio-cells = <2>;
> +        };
> +
> +        regulators {
> +            compatible = "mediatek,mt6397-regulator";
> +
> +            buck_vpca15 {
> +                regulator-name = "vpca15";
> +                regulator-min-microvolt = < 850000>;
> +                regulator-max-microvolt = <1350000>;
> +                regulator-ramp-delay = <12500>;
> +                regulator-enable-ramp-delay = <200>;
> +            };
> +
> +            // ...
> +
> +            ldo_vibr {
> +                regulator-name = "vibr";
> +                regulator-min-microvolt = <1200000>;
> +                regulator-max-microvolt = <3300000>;
> +                regulator-enable-ramp-delay = <218>;
> +            };
> +        };
> +
> +        rtc {
> +            compatible = "mediatek,mt6397-rtc";
> +        };
> +    };
> diff --git a/Documentation/devicetree/bindings/mfd/mt6397.txt b/Documentation/devicetree/bindings/mfd/mt6397.txt
> deleted file mode 100644
> index 10540aa..0000000
> --- a/Documentation/devicetree/bindings/mfd/mt6397.txt
> +++ /dev/null
> @@ -1,110 +0,0 @@
> -MediaTek MT6397/MT6323 Multifunction Device Driver
> -
> -MT6397/MT6323 is a multifunction device with the following sub modules:
> -- Regulator
> -- RTC
> -- Audio codec
> -- GPIO
> -- Clock
> -- LED
> -- Keys
> -- Power controller
> -
> -It is interfaced to host controller using SPI interface by a proprietary hardware
> -called PMIC wrapper or pwrap. MT6397/MT6323 MFD is a child device of pwrap.
> -See the following for pwarp node definitions:
> -../soc/mediatek/mediatek,pwrap.yaml
> -
> -This document describes the binding for MFD device and its sub module.
> -
> -Required properties:
> -compatible:
> -	"mediatek,mt6323" for PMIC MT6323
> -	"mediatek,mt6331" for PMIC MT6331 and MT6332
> -	"mediatek,mt6357" for PMIC MT6357
> -	"mediatek,mt6358" for PMIC MT6358
> -	"mediatek,mt6359" for PMIC MT6359
> -	"mediatek,mt6366", "mediatek,mt6358" for PMIC MT6366
> -	"mediatek,mt6397" for PMIC MT6397
> -
> -Optional subnodes:
> -
> -- rtc
> -	Required properties: Should be one of follows
> -		- compatible: "mediatek,mt6323-rtc"
> -		- compatible: "mediatek,mt6331-rtc"
> -		- compatible: "mediatek,mt6358-rtc"
> -		- compatible: "mediatek,mt6397-rtc"
> -	For details, see ../rtc/rtc-mt6397.txt
> -- regulators
> -	Required properties:
> -		- compatible: "mediatek,mt6323-regulator"
> -	see ../regulator/mt6323-regulator.txt
> -		- compatible: "mediatek,mt6358-regulator"
> -		- compatible: "mediatek,mt6366-regulator", "mediatek-mt6358-regulator"
> -	see ../regulator/mt6358-regulator.txt
> -		- compatible: "mediatek,mt6397-regulator"
> -	see ../regulator/mt6397-regulator.txt
> -- codec
> -	Required properties:
> -		- compatible: "mediatek,mt6397-codec" or "mediatek,mt6358-sound"
> -- clk
> -	Required properties:
> -		- compatible: "mediatek,mt6397-clk"
> -- led
> -	Required properties:
> -		- compatible: "mediatek,mt6323-led"
> -	see ../leds/leds-mt6323.txt
> -
> -- keys
> -	Required properties: Should be one of the following
> -		- compatible: "mediatek,mt6323-keys"
> -		- compatible: "mediatek,mt6331-keys"
> -		- compatible: "mediatek,mt6397-keys"
> -	see ../input/mtk-pmic-keys.txt
> -
> -- power-controller
> -	Required properties:
> -		- compatible: "mediatek,mt6323-pwrc"
> -	For details, see ../power/reset/mt6323-poweroff.txt
> -
> -- pin-controller
> -	Required properties:
> -		- compatible: "mediatek,mt6397-pinctrl"
> -	For details, see ../pinctrl/pinctrl-mt65xx.txt
> -
> -Example:
> -	pwrap: pwrap at 1000f000 {
> -		compatible = "mediatek,mt8135-pwrap";
> -
> -		...
> -
> -		pmic {
> -			compatible = "mediatek,mt6397";
> -
> -			codec: mt6397codec {
> -				compatible = "mediatek,mt6397-codec";
> -			};
> -
> -			regulators {
> -				compatible = "mediatek,mt6397-regulator";
> -
> -				mt6397_vpca15_reg: buck_vpca15 {
> -					regulator-compatible = "buck_vpca15";
> -					regulator-name = "vpca15";
> -					regulator-min-microvolt = <850000>;
> -					regulator-max-microvolt = <1400000>;
> -					regulator-ramp-delay = <12500>;
> -					regulator-always-on;
> -				};
> -
> -				mt6397_vgp4_reg: ldo_vgp4 {
> -					regulator-compatible = "ldo_vgp4";
> -					regulator-name = "vgp4";
> -					regulator-min-microvolt = <1200000>;
> -					regulator-max-microvolt = <3300000>;
> -					regulator-enable-ramp-delay = <218>;
> -				};
> -			};
> -		};
> -	};
> diff --git a/Documentation/devicetree/bindings/power/reset/mt6323-poweroff.txt b/Documentation/devicetree/bindings/power/reset/mt6323-poweroff.txt
> deleted file mode 100644
> index 933f0c4..0000000
> --- a/Documentation/devicetree/bindings/power/reset/mt6323-poweroff.txt
> +++ /dev/null
> @@ -1,20 +0,0 @@
> -Device Tree Bindings for Power Controller on MediaTek PMIC
> -
> -The power controller which could be found on PMIC is responsible for externally
> -powering off or on the remote MediaTek SoC through the circuit BBPU.
> -
> -Required properties:
> -- compatible: Should be one of follows
> -       "mediatek,mt6323-pwrc": for MT6323 PMIC
> -
> -Example:
> -
> -       pmic {
> -               compatible = "mediatek,mt6323";
> -
> -               ...
> -
> -               power-controller {
> -                       compatible = "mediatek,mt6323-pwrc";
> -               };
> -       }
> diff --git a/Documentation/devicetree/bindings/rtc/rtc-mt6397.txt b/Documentation/devicetree/bindings/rtc/rtc-mt6397.txt
> deleted file mode 100644
> index 7212076..0000000
> --- a/Documentation/devicetree/bindings/rtc/rtc-mt6397.txt
> +++ /dev/null
> @@ -1,31 +0,0 @@
> -Device-Tree bindings for MediaTek PMIC based RTC
> -
> -MediaTek PMIC based RTC is an independent function of MediaTek PMIC that works
> -as a type of multi-function device (MFD). The RTC can be configured and set up
> -with PMIC wrapper bus which is a common resource shared with the other
> -functions found on the same PMIC.
> -
> -For MediaTek PMIC MFD bindings, see:
> -../mfd/mt6397.txt
> -
> -For MediaTek PMIC wrapper bus bindings, see:
> -../soc/mediatek/pwrap.txt
> -
> -Required properties:
> -- compatible: Should be one of follows
> -       "mediatek,mt6323-rtc": for MT6323 PMIC
> -       "mediatek,mt6358-rtc": for MT6358 PMIC
> -       "mediatek,mt6366-rtc", "mediatek,mt6358-rtc": for MT6366 PMIC
> -       "mediatek,mt6397-rtc": for MT6397 PMIC
> -
> -Example:
> -
> -       pmic {
> -               compatible = "mediatek,mt6323";
> -
> -               ...
> -
> -               rtc {
> -                       compatible = "mediatek,mt6323-rtc";
> -               };
> -       };
> diff --git a/Documentation/devicetree/bindings/sound/mt6358.txt b/Documentation/devicetree/bindings/sound/mt6358.txt
> deleted file mode 100644
> index fbe9e55..0000000
> --- a/Documentation/devicetree/bindings/sound/mt6358.txt
> +++ /dev/null
> @@ -1,26 +0,0 @@
> -Mediatek MT6358 Audio Codec
> -
> -The communication between MT6358 and SoC is through Mediatek PMIC wrapper.
> -For more detail, please visit Mediatek PMIC wrapper documentation.
> -
> -Must be a child node of PMIC wrapper.
> -
> -Required properties:
> -
> -- compatible - "string" - One of:
> -    "mediatek,mt6358-sound"
> -    "mediatek,mt6366-sound"
> -- Avdd-supply : power source of AVDD
> -
> -Optional properties:
> -- mediatek,dmic-mode : Indicates how many data pins are used to transmit two
> -	channels of PDM signal. 0 means two wires, 1 means one wire. Default
> -	value is 0.
> -
> -Example:
> -
> -mt6358_snd {
> -	compatible = "mediatek,mt6358-sound";
> -	Avdd-supply = <&mt6358_vaud28_reg>;
> -	mediatek,dmic-mode = <0>;
> -};
> diff --git a/MAINTAINERS b/MAINTAINERS
> index 2cdd7ca..e97b5ae 100644
> --- a/MAINTAINERS
> +++ b/MAINTAINERS
> @@ -14418,10 +14418,12 @@ F:	Documentation/devicetree/bindings/net/bluetooth/mediatek,mt7921s-bluetooth.ya
>  F:	drivers/bluetooth/btmtkuart.c
>  
>  MEDIATEK BOARD LEVEL SHUTDOWN DRIVERS
> +M:	Sen Chu <sen.chu at mediatek.com>
>  M:	Sean Wang <sean.wang at mediatek.com>
> +M:	Macpaul Lin <macpaul.lin at mediatek.com>
>  L:	linux-pm at vger.kernel.org
>  S:	Maintained
> -F:	Documentation/devicetree/bindings/power/reset/mt6323-poweroff.txt
> +F:	Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml
>  F:	drivers/power/reset/mt6323-poweroff.c
>  
>  MEDIATEK CIR DRIVER
> @@ -14582,9 +14584,11 @@ F:	Documentation/devicetree/bindings/mtd/mediatek,mtk-nfc.yaml
>  F:	drivers/mtd/nand/raw/mtk_*
>  
>  MEDIATEK PMIC LED DRIVER
> +M:	Sen Chu <sen.chu at mediatek.com>
>  M:	Sean Wang <sean.wang at mediatek.com>
> +M:	Macpaul Lin <macpaul.lin at mediatek.com>
>  S:	Maintained
> -F:	Documentation/devicetree/bindings/leds/leds-mt6323.txt
> +F:	Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml
>  F:	drivers/leds/leds-mt6323.c
>  
>  MEDIATEK RANDOM NUMBER GENERATOR SUPPORT
> -- 
> 2.45.2
> 
> 

-- 
Alexandre Belloni, co-owner and COO, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com


From alexandre.belloni at bootlin.com  Wed Sep 18 04:56:51 2024
From: alexandre.belloni at bootlin.com (Alexandre Belloni)
Date: Wed, 18 Sep 2024 13:56:51 +0200
Subject: [PATCH v6 2/2] dt-bindings: mfd: mediatek: mt6397: Convert to DT
 schema format
In-Reply-To: <20240918115151c896f33f@mail.local>
References: <20240918064955.6518-1-macpaul.lin@mediatek.com>
 <20240918064955.6518-2-macpaul.lin@mediatek.com>
 <20240918115151c896f33f@mail.local>
Message-ID: <20240918115651c1475d36@mail.local>

On 18/09/2024 13:51:51+0200, Alexandre Belloni wrote:
> > Changes for v4:
> >  - Remove "mediatek,mt6357" from PMIC's compatible string since there is a
> >    seperated DT schema for PMIC mt6357.
> > 
> > Changes for v5:
> >  - Rebase to next-20240913 (linux-next/master).
> >  - Fix the "title" (device type) of mfd/mediatek,mt6397.yaml to "PMIC".
> >  - RTC:
> >   - Drop "start-year"
> 
> Maybe, instead of dropping the property, you should add support in the
> driver by setting range_min and range_max.

Looking at this even more, the driver can probably be simplified by
setting start_year in probe and dropping RTC_MIN_YEAR_OFFSET.

> 
> >  - Regulators:
> >   - Add blank lines between description and properties.
> >   - Drop allOf for the $ref section on property.
> >  - clocks:
> >   - Fix no need '|' in descriptoin.
> >   - Add blank lines between description and properties.
> >  - Keys:
> >   - Drop compatible since these enums are already in $ref.
> >  - pinctrl:
> >   - Drop compatible since it is already in $ref.
> >  - examples:
> >   - Fix indentations for leds and keys.
> > 
> > Changes for v6:
> >  - Commit message:
> >   - Add note for simplifying examples of mt6358 and mt6397.
> >  - examples:
> >   - Fix indentations for mt6323-keys.
> >   - MT6358 and MT6397: simplify settings in regulators.
> >    - Preserve "audio-codec", "clocks", "pinctrl", "rtc", and "keys"
> >      sections as they contain typical settings for different PMICs.
> > 
> > diff --git a/Documentation/devicetree/bindings/input/mediatek,pmic-keys.yaml b/Documentation/devicetree/bindings/input/mediatek,pmic-keys.yaml
> > index 70567d9..466566a 100644
> > --- a/Documentation/devicetree/bindings/input/mediatek,pmic-keys.yaml
> > +++ b/Documentation/devicetree/bindings/input/mediatek,pmic-keys.yaml
> > @@ -19,7 +19,7 @@ description: |
> >    by the PMIC that is defined as a Multi-Function Device (MFD).
> >  
> >    For MediaTek MT6323/MT6397 PMIC bindings see
> > -  Documentation/devicetree/bindings/mfd/mt6397.txt
> > +  Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml
> >  
> >  properties:
> >    compatible:
> > diff --git a/Documentation/devicetree/bindings/leds/leds-mt6323.txt b/Documentation/devicetree/bindings/leds/leds-mt6323.txt
> > deleted file mode 100644
> > index 052dccb8..0000000
> > --- a/Documentation/devicetree/bindings/leds/leds-mt6323.txt
> > +++ /dev/null
> > @@ -1,63 +0,0 @@
> > -Device Tree Bindings for LED support on MT6323 PMIC
> > -
> > -MT6323 LED controller is subfunction provided by MT6323 PMIC, so the LED
> > -controllers are defined as the subnode of the function node provided by MT6323
> > -PMIC controller that is being defined as one kind of Muti-Function Device (MFD)
> > -using shared bus called PMIC wrapper for each subfunction to access remote
> > -MT6323 PMIC hardware.
> > -
> > -For MT6323 MFD bindings see:
> > -Documentation/devicetree/bindings/mfd/mt6397.txt
> > -For MediaTek PMIC wrapper bindings see:
> > -Documentation/devicetree/bindings/soc/mediatek/mediatek,pwrap.yaml
> > -
> > -Required properties:
> > -- compatible : Must be one of
> > -  - "mediatek,mt6323-led"
> > -  - "mediatek,mt6331-led"
> > -  - "mediatek,mt6332-led"
> > -- address-cells : Must be 1
> > -- size-cells : Must be 0
> > -
> > -Each led is represented as a child node of the mediatek,mt6323-led that
> > -describes the initial behavior for each LED physically and currently only four
> > -LED child nodes can be supported.
> > -
> > -Required properties for the LED child node:
> > -- reg : LED channel number (0..3)
> > -
> > -Optional properties for the LED child node:
> > -- label : See Documentation/devicetree/bindings/leds/common.txt
> > -- linux,default-trigger : See Documentation/devicetree/bindings/leds/common.txt
> > -- default-state: See Documentation/devicetree/bindings/leds/common.txt
> > -
> > -Example:
> > -
> > -	mt6323: pmic {
> > -		compatible = "mediatek,mt6323";
> > -
> > -		...
> > -
> > -		mt6323led: leds {
> > -			compatible = "mediatek,mt6323-led";
> > -			#address-cells = <1>;
> > -			#size-cells = <0>;
> > -
> > -			led at 0 {
> > -				reg = <0>;
> > -				label = "LED0";
> > -				linux,default-trigger = "timer";
> > -				default-state = "on";
> > -			};
> > -			led at 1 {
> > -				reg = <1>;
> > -				label = "LED1";
> > -				default-state = "off";
> > -			};
> > -			led at 2 {
> > -				reg = <2>;
> > -				label = "LED2";
> > -				default-state = "on";
> > -			};
> > -		};
> > -	};
> > diff --git a/Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml b/Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml
> > new file mode 100644
> > index 0000000..953358b
> > --- /dev/null
> > +++ b/Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml
> > @@ -0,0 +1,601 @@
> > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
> > +%YAML 1.2
> > +---
> > +$id: http://devicetree.org/schemas/mfd/mediatek,mt6397.yaml#
> > +$schema: http://devicetree.org/meta-schemas/core.yaml#
> > +
> > +title: MediaTek MT6397/MT6323 PMIC
> > +
> > +maintainers:
> > +  - Sen Chu <sen.chu at mediatek.com>
> > +  - Macpaul Lin <macpaul.lin at mediatek.com>
> > +
> > +description: |
> > +  MT6397/MT6323 is a power management system chip.
> > +  Please see the sub-modules below for supported features.
> > +
> > +  MT6397/MT6323 is a multifunction device with the following sub modules:
> > +  - Regulators
> > +  - RTC
> > +  - Audio codec
> > +  - GPIO
> > +  - Clock
> > +  - LED
> > +  - Keys
> > +  - Power controller
> > +
> > +  It is interfaced to host controller using SPI interface by a proprietary hardware
> > +  called PMIC wrapper or pwrap. MT6397/MT6323 PMIC is a child device of pwrap.
> > +  See the following for pwrap node definitions:
> > +  Documentation/devicetree/bindings/soc/mediatek/mediatek,pwrap.yaml
> > +
> > +properties:
> > +  compatible:
> > +    oneOf:
> > +      - enum:
> > +          - mediatek,mt6323
> > +          - mediatek,mt6331 # "mediatek,mt6331" for PMIC MT6331 and MT6332.
> > +          - mediatek,mt6358
> > +          - mediatek,mt6359
> > +          - mediatek,mt6397
> > +      - items:
> > +          - enum:
> > +              - mediatek,mt6366
> > +          - const: mediatek,mt6358
> > +
> > +  interrupts:
> > +    maxItems: 1
> > +
> > +  interrupt-controller: true
> > +
> > +  "#interrupt-cells":
> > +    const: 2
> > +
> > +  rtc:
> > +    type: object
> > +    $ref: /schemas/rtc/rtc.yaml#
> > +    unevaluatedProperties: false
> > +    description:
> > +      MT6397 Real Time Clock.
> > +
> > +    properties:
> > +      compatible:
> > +        oneOf:
> > +          - enum:
> > +              - mediatek,mt6323-rtc
> > +              - mediatek,mt6331-rtc
> > +              - mediatek,mt6358-rtc
> > +              - mediatek,mt6397-rtc
> > +          - items:
> > +              - enum:
> > +                  - mediatek,mt6366-rtc
> > +              - const: mediatek,mt6358-rtc
> > +
> > +    required:
> > +      - compatible
> > +
> > +  regulators:
> > +    type: object
> > +    description:
> > +      List of child nodes that specify the regulators.
> > +    additionalProperties: true
> > +
> > +    properties:
> > +      compatible:
> > +        oneOf:
> > +          - enum:
> > +              - mediatek,mt6323-regulator
> > +              - mediatek,mt6358-regulator
> > +              - mediatek,mt6397-regulator
> > +          - items:
> > +              - enum:
> > +                  - mediatek,mt6366-regulator
> > +              - const: mediatek,mt6358-regulator
> > +
> > +    required:
> > +      - compatible
> > +
> > +  audio-codec:
> > +    type: object
> > +    additionalProperties: false
> > +    description:
> > +      Audio codec support with MT6397 and MT6358.
> > +
> > +    properties:
> > +      compatible:
> > +        oneOf:
> > +          - enum:
> > +              - mediatek,mt6397-codec
> > +              - mediatek,mt6358-sound
> > +          - items:
> > +              - enum:
> > +                  - mediatek,mt6366-sound
> > +              - const: mediatek,mt6358-sound
> > +
> > +      mediatek,dmic-mode:
> > +        description: |
> > +          Indicates how many data pins are used to transmit two channels of PDM
> > +          signal.
> > +          0 - two wires;
> > +          1 - one wire;
> > +          Default value is 0.
> > +        enum: [0, 1]
> > +        default: 0
> > +
> > +      Avdd-supply:
> > +        description: Power source of AVDD.
> > +
> > +    required:
> > +      - compatible
> > +
> > +  clocks:
> > +    type: object
> > +    additionalProperties: false
> > +    description:
> > +      This is a clock buffer node for mt6397. However, there are no sub nodes
> > +      or any public document exposed in public.
> > +
> > +    properties:
> > +      compatible:
> > +        const: mediatek,mt6397-clk
> > +
> > +      '#clock-cells':
> > +        const: 1
> > +
> > +    required:
> > +      - compatible
> > +
> > +  leds:
> > +    type: object
> > +    additionalProperties: false
> > +    description: |
> > +      MT6323 LED controller is subfunction provided by MT6323 PMIC, so the LED
> > +      controllers are defined as the subnode of the function node provided by MT6323
> > +      PMIC controller that is being defined as one kind of Muti-Function Device (MFD)
> > +      using shared bus called PMIC wrapper for each subfunction to access remote
> > +      MT6323 PMIC hardware.
> > +
> > +      Each led is represented as a child node of the mediatek,mt6323-led that
> > +      describes the initial behavior for each LED physically and currently only four
> > +      LED child nodes can be supported.
> > +
> > +    properties:
> > +      compatible:
> > +        enum:
> > +          - mediatek,mt6323-led
> > +          - mediatek,mt6331-led
> > +          - mediatek,mt6332-led
> > +
> > +      reg:
> > +        maxItems: 1
> > +
> > +      "#address-cells":
> > +        const: 1
> > +
> > +      "#size-cells":
> > +        const: 0
> > +
> > +    patternProperties:
> > +      "^led@[0-3]$":
> > +        type: object
> > +        $ref: /schemas/leds/common.yaml#
> > +        unevaluatedProperties: false
> > +
> > +        properties:
> > +          reg:
> > +            description:
> > +              LED channel number (0..3)
> > +            minimum: 0
> > +            maximum: 3
> > +
> > +        required:
> > +          - reg
> > +
> > +    required:
> > +      - compatible
> > +      - "#address-cells"
> > +      - "#size-cells"
> > +
> > +  keys:
> > +    type: object
> > +    $ref: /schemas/input/mediatek,pmic-keys.yaml
> > +    unevaluatedProperties: false
> > +    description:
> > +      Power and Home keys.
> > +
> > +  power-controller:
> > +    type: object
> > +    additionalProperties: false
> > +    description:
> > +      The power controller which could be found on PMIC is responsible for
> > +      externally powering off or on the remote MediaTek SoC through the
> > +      circuit BBPU (baseband power up).
> > +
> > +    properties:
> > +      compatible:
> > +        const: mediatek,mt6323-pwrc
> > +
> > +      '#power-domain-cells':
> > +        const: 0
> > +
> > +  pinctrl:
> > +    type: object
> > +    $ref: /schemas/pinctrl/mediatek,mt65xx-pinctrl.yaml
> > +    unevaluatedProperties: false
> > +    description:
> > +      Pin controller
> > +
> > +required:
> > +  - compatible
> > +  - regulators
> > +
> > +additionalProperties: false
> > +
> > +examples:
> > +  - |
> > +    #include <dt-bindings/interrupt-controller/arm-gic.h>
> > +    #include <dt-bindings/leds/common.h>
> > +
> > +    pmic {
> > +        compatible = "mediatek,mt6323";
> > +        interrupt-parent = <&pio>;
> > +        interrupts = <150 IRQ_TYPE_LEVEL_HIGH>;
> > +        interrupt-controller;
> > +        #interrupt-cells = <2>;
> > +
> > +        leds {
> > +            compatible = "mediatek,mt6323-led";
> > +            #address-cells = <1>;
> > +            #size-cells = <0>;
> > +        };
> > +
> > +        regulators {
> > +            compatible = "mediatek,mt6323-regulator";
> > +
> > +            buck_vproc {
> > +                regulator-name = "vproc";
> > +                regulator-min-microvolt = < 700000>;
> > +                regulator-max-microvolt = <1350000>;
> > +                regulator-ramp-delay = <12500>;
> > +                regulator-always-on;
> > +                regulator-boot-on;
> > +            };
> > +
> > +            buck_vsys {
> > +                regulator-name = "vsys";
> > +                regulator-min-microvolt = <1400000>;
> > +                regulator-max-microvolt = <2987500>;
> > +                regulator-ramp-delay = <25000>;
> > +                regulator-always-on;
> > +                regulator-boot-on;
> > +            };
> > +
> > +            buck_vpa {
> > +                regulator-name = "vpa";
> > +                regulator-min-microvolt = < 500000>;
> > +                regulator-max-microvolt = <3650000>;
> > +            };
> > +
> > +            ldo_vtcxo {
> > +                regulator-name = "vtcxo";
> > +                regulator-min-microvolt = <2800000>;
> > +                regulator-max-microvolt = <2800000>;
> > +                regulator-enable-ramp-delay = <90>;
> > +                regulator-always-on;
> > +                regulator-boot-on;
> > +            };
> > +
> > +            ldo_vcn28 {
> > +                regulator-name = "vcn28";
> > +                regulator-min-microvolt = <2800000>;
> > +                regulator-max-microvolt = <2800000>;
> > +                regulator-enable-ramp-delay = <185>;
> > +            };
> > +
> > +            ldo_vcn33_bt {
> > +                regulator-name = "vcn33_bt";
> > +                regulator-min-microvolt = <3300000>;
> > +                regulator-max-microvolt = <3600000>;
> > +                regulator-enable-ramp-delay = <185>;
> > +            };
> > +
> > +            ldo_vcn33_wifi {
> > +                regulator-name = "vcn33_wifi";
> > +                regulator-min-microvolt = <3300000>;
> > +                regulator-max-microvolt = <3600000>;
> > +                regulator-enable-ramp-delay = <185>;
> > +            };
> > +
> > +            ldo_va {
> > +                regulator-name = "va";
> > +                regulator-min-microvolt = <2800000>;
> > +                regulator-max-microvolt = <2800000>;
> > +                regulator-enable-ramp-delay = <216>;
> > +                regulator-always-on;
> > +                regulator-boot-on;
> > +            };
> > +
> > +            ldo_vcama {
> > +                regulator-name = "vcama";
> > +                regulator-min-microvolt = <1500000>;
> > +                regulator-max-microvolt = <2800000>;
> > +                regulator-enable-ramp-delay = <216>;
> > +            };
> > +
> > +            ldo_vio28 {
> > +                regulator-name = "vio28";
> > +                regulator-min-microvolt = <2800000>;
> > +                regulator-max-microvolt = <2800000>;
> > +                regulator-enable-ramp-delay = <216>;
> > +                regulator-always-on;
> > +                regulator-boot-on;
> > +            };
> > +
> > +            ldo_vusb {
> > +                regulator-name = "vusb";
> > +                regulator-min-microvolt = <3300000>;
> > +                regulator-max-microvolt = <3300000>;
> > +                regulator-enable-ramp-delay = <216>;
> > +                regulator-boot-on;
> > +            };
> > +
> > +            ldo_vmc {
> > +                regulator-name = "vmc";
> > +                regulator-min-microvolt = <1800000>;
> > +                regulator-max-microvolt = <3300000>;
> > +                regulator-enable-ramp-delay = <36>;
> > +                regulator-boot-on;
> > +            };
> > +
> > +            ldo_vmch {
> > +                regulator-name = "vmch";
> > +                regulator-min-microvolt = <3000000>;
> > +                regulator-max-microvolt = <3300000>;
> > +                regulator-enable-ramp-delay = <36>;
> > +                regulator-boot-on;
> > +            };
> > +
> > +            ldo_vemc3v3 {
> > +                regulator-name = "vemc3v3";
> > +                regulator-min-microvolt = <3000000>;
> > +                regulator-max-microvolt = <3300000>;
> > +                regulator-enable-ramp-delay = <36>;
> > +                regulator-boot-on;
> > +            };
> > +
> > +            ldo_vgp1 {
> > +                regulator-name = "vgp1";
> > +                regulator-min-microvolt = <1200000>;
> > +                regulator-max-microvolt = <3300000>;
> > +                regulator-enable-ramp-delay = <216>;
> > +            };
> > +
> > +            ldo_vgp2 {
> > +                regulator-name = "vgp2";
> > +                regulator-min-microvolt = <1200000>;
> > +                regulator-max-microvolt = <3000000>;
> > +                regulator-enable-ramp-delay = <216>;
> > +            };
> > +
> > +            ldo_vgp3 {
> > +                regulator-name = "vgp3";
> > +                regulator-min-microvolt = <1200000>;
> > +                regulator-max-microvolt = <1800000>;
> > +                regulator-enable-ramp-delay = <216>;
> > +            };
> > +
> > +            ldo_vcn18 {
> > +                regulator-name = "vcn18";
> > +                regulator-min-microvolt = <1800000>;
> > +                regulator-max-microvolt = <1800000>;
> > +                regulator-enable-ramp-delay = <216>;
> > +            };
> > +
> > +            ldo_vsim1 {
> > +                regulator-name = "vsim1";
> > +                regulator-min-microvolt = <1800000>;
> > +                regulator-max-microvolt = <3000000>;
> > +                regulator-enable-ramp-delay = <216>;
> > +            };
> > +
> > +            ldo_vsim2 {
> > +                regulator-name = "vsim2";
> > +                regulator-min-microvolt = <1800000>;
> > +                regulator-max-microvolt = <3000000>;
> > +                regulator-enable-ramp-delay = <216>;
> > +            };
> > +
> > +            ldo_vrtc {
> > +                regulator-name = "vrtc";
> > +                regulator-min-microvolt = <2800000>;
> > +                regulator-max-microvolt = <2800000>;
> > +                regulator-always-on;
> > +                regulator-boot-on;
> > +            };
> > +
> > +            ldo_vcamaf {
> > +                regulator-name = "vcamaf";
> > +                regulator-min-microvolt = <1200000>;
> > +                regulator-max-microvolt = <3300000>;
> > +                regulator-enable-ramp-delay = <216>;
> > +            };
> > +
> > +            ldo_vibr {
> > +                regulator-name = "vibr";
> > +                regulator-min-microvolt = <1200000>;
> > +                regulator-max-microvolt = <3300000>;
> > +                regulator-enable-ramp-delay = <36>;
> > +            };
> > +
> > +            ldo_vrf18 {
> > +                regulator-name = "vrf18";
> > +                regulator-min-microvolt = <1825000>;
> > +                regulator-max-microvolt = <1825000>;
> > +                regulator-enable-ramp-delay = <187>;
> > +            };
> > +
> > +            ldo_vm {
> > +                regulator-name = "vm";
> > +                regulator-min-microvolt = <1200000>;
> > +                regulator-max-microvolt = <1800000>;
> > +                regulator-enable-ramp-delay = <216>;
> > +                regulator-always-on;
> > +                regulator-boot-on;
> > +            };
> > +
> > +            ldo_vio18 {
> > +                regulator-name = "vio18";
> > +                regulator-min-microvolt = <1800000>;
> > +                regulator-max-microvolt = <1800000>;
> > +                regulator-enable-ramp-delay = <216>;
> > +                regulator-always-on;
> > +                regulator-boot-on;
> > +            };
> > +
> > +           ldo_vcamd {
> > +                regulator-name = "vcamd";
> > +                regulator-min-microvolt = <1200000>;
> > +                regulator-max-microvolt = <1800000>;
> > +                regulator-enable-ramp-delay = <216>;
> > +            };
> > +
> > +            ldo_vcamio {
> > +                regulator-name = "vcamio";
> > +                regulator-min-microvolt = <1800000>;
> > +                regulator-max-microvolt = <1800000>;
> > +                regulator-enable-ramp-delay = <216>;
> > +            };
> > +        };
> > +
> > +        keys {
> > +            compatible = "mediatek,mt6323-keys";
> > +            mediatek,long-press-mode = <1>;
> > +            power-off-time-sec = <0>;
> > +
> > +            power {
> > +                linux,keycodes = <116>;
> > +                wakeup-source;
> > +            };
> > +
> > +            home {
> > +                linux,keycodes = <114>;
> > +            };
> > +        };
> > +
> > +        power-controller {
> > +            compatible = "mediatek,mt6323-pwrc";
> > +            #power-domain-cells = <0>;
> > +        };
> > +
> > +        rtc {
> > +            compatible = "mediatek,mt6323-rtc";
> > +        };
> > +    };
> > +
> > +  - |
> > +    #include <dt-bindings/input/input.h>
> > +    #include <dt-bindings/interrupt-controller/arm-gic.h>
> > +
> > +    pmic {
> > +        compatible = "mediatek,mt6358";
> > +        interrupt-controller;
> > +        #interrupt-cells = <2>;
> > +
> > +        audio-codec {
> > +            compatible = "mediatek,mt6358-sound";
> > +            Avdd-supply = <&mt6358_vaud28_reg>;
> > +            mediatek,dmic-mode = <0>;
> > +        };
> > +
> > +        regulators {
> > +            compatible = "mediatek,mt6358-regulator";
> > +
> > +            buck_vdram1 {
> > +                regulator-name = "vdram1";
> > +                regulator-min-microvolt = <500000>;
> > +                regulator-max-microvolt = <2087500>;
> > +                regulator-ramp-delay = <12500>;
> > +                regulator-enable-ramp-delay = <0>;
> > +                regulator-always-on;
> > +                regulator-allowed-modes = <0 1>;
> > +            };
> > +
> > +            // ...
> > +
> > +            ldo_vsim2 {
> > +                regulator-name = "vsim2";
> > +                regulator-min-microvolt = <1700000>;
> > +                regulator-max-microvolt = <3100000>;
> > +                regulator-enable-ramp-delay = <540>;
> > +            };
> > +        };
> > +
> > +        rtc {
> > +            compatible = "mediatek,mt6358-rtc";
> > +        };
> > +
> > +        keys {
> > +            compatible = "mediatek,mt6358-keys";
> > +
> > +            power {
> > +                linux,keycodes = <KEY_POWER>;
> > +                wakeup-source;
> > +            };
> > +
> > +            home {
> > +                linux,keycodes = <KEY_HOME>;
> > +            };
> > +        };
> > +    };
> > +
> > +  - |
> > +    #include <dt-bindings/interrupt-controller/arm-gic.h>
> > +
> > +    pmic {
> > +        compatible = "mediatek,mt6397";
> > +
> > +        interrupt-parent = <&pio>;
> > +        interrupts-extended = <&pio 222 IRQ_TYPE_LEVEL_HIGH>;
> > +        interrupt-controller;
> > +        #interrupt-cells = <2>;
> > +
> > +        audio-codec {
> > +            compatible = "mediatek,mt6397-codec";
> > +        };
> > +
> > +        clocks {
> > +            compatible = "mediatek,mt6397-clk";
> > +            #clock-cells = <1>;
> > +        };
> > +
> > +        pinctrl {
> > +            compatible = "mediatek,mt6397-pinctrl";
> > +            gpio-controller;
> > +            #gpio-cells = <2>;
> > +        };
> > +
> > +        regulators {
> > +            compatible = "mediatek,mt6397-regulator";
> > +
> > +            buck_vpca15 {
> > +                regulator-name = "vpca15";
> > +                regulator-min-microvolt = < 850000>;
> > +                regulator-max-microvolt = <1350000>;
> > +                regulator-ramp-delay = <12500>;
> > +                regulator-enable-ramp-delay = <200>;
> > +            };
> > +
> > +            // ...
> > +
> > +            ldo_vibr {
> > +                regulator-name = "vibr";
> > +                regulator-min-microvolt = <1200000>;
> > +                regulator-max-microvolt = <3300000>;
> > +                regulator-enable-ramp-delay = <218>;
> > +            };
> > +        };
> > +
> > +        rtc {
> > +            compatible = "mediatek,mt6397-rtc";
> > +        };
> > +    };
> > diff --git a/Documentation/devicetree/bindings/mfd/mt6397.txt b/Documentation/devicetree/bindings/mfd/mt6397.txt
> > deleted file mode 100644
> > index 10540aa..0000000
> > --- a/Documentation/devicetree/bindings/mfd/mt6397.txt
> > +++ /dev/null
> > @@ -1,110 +0,0 @@
> > -MediaTek MT6397/MT6323 Multifunction Device Driver
> > -
> > -MT6397/MT6323 is a multifunction device with the following sub modules:
> > -- Regulator
> > -- RTC
> > -- Audio codec
> > -- GPIO
> > -- Clock
> > -- LED
> > -- Keys
> > -- Power controller
> > -
> > -It is interfaced to host controller using SPI interface by a proprietary hardware
> > -called PMIC wrapper or pwrap. MT6397/MT6323 MFD is a child device of pwrap.
> > -See the following for pwarp node definitions:
> > -../soc/mediatek/mediatek,pwrap.yaml
> > -
> > -This document describes the binding for MFD device and its sub module.
> > -
> > -Required properties:
> > -compatible:
> > -	"mediatek,mt6323" for PMIC MT6323
> > -	"mediatek,mt6331" for PMIC MT6331 and MT6332
> > -	"mediatek,mt6357" for PMIC MT6357
> > -	"mediatek,mt6358" for PMIC MT6358
> > -	"mediatek,mt6359" for PMIC MT6359
> > -	"mediatek,mt6366", "mediatek,mt6358" for PMIC MT6366
> > -	"mediatek,mt6397" for PMIC MT6397
> > -
> > -Optional subnodes:
> > -
> > -- rtc
> > -	Required properties: Should be one of follows
> > -		- compatible: "mediatek,mt6323-rtc"
> > -		- compatible: "mediatek,mt6331-rtc"
> > -		- compatible: "mediatek,mt6358-rtc"
> > -		- compatible: "mediatek,mt6397-rtc"
> > -	For details, see ../rtc/rtc-mt6397.txt
> > -- regulators
> > -	Required properties:
> > -		- compatible: "mediatek,mt6323-regulator"
> > -	see ../regulator/mt6323-regulator.txt
> > -		- compatible: "mediatek,mt6358-regulator"
> > -		- compatible: "mediatek,mt6366-regulator", "mediatek-mt6358-regulator"
> > -	see ../regulator/mt6358-regulator.txt
> > -		- compatible: "mediatek,mt6397-regulator"
> > -	see ../regulator/mt6397-regulator.txt
> > -- codec
> > -	Required properties:
> > -		- compatible: "mediatek,mt6397-codec" or "mediatek,mt6358-sound"
> > -- clk
> > -	Required properties:
> > -		- compatible: "mediatek,mt6397-clk"
> > -- led
> > -	Required properties:
> > -		- compatible: "mediatek,mt6323-led"
> > -	see ../leds/leds-mt6323.txt
> > -
> > -- keys
> > -	Required properties: Should be one of the following
> > -		- compatible: "mediatek,mt6323-keys"
> > -		- compatible: "mediatek,mt6331-keys"
> > -		- compatible: "mediatek,mt6397-keys"
> > -	see ../input/mtk-pmic-keys.txt
> > -
> > -- power-controller
> > -	Required properties:
> > -		- compatible: "mediatek,mt6323-pwrc"
> > -	For details, see ../power/reset/mt6323-poweroff.txt
> > -
> > -- pin-controller
> > -	Required properties:
> > -		- compatible: "mediatek,mt6397-pinctrl"
> > -	For details, see ../pinctrl/pinctrl-mt65xx.txt
> > -
> > -Example:
> > -	pwrap: pwrap at 1000f000 {
> > -		compatible = "mediatek,mt8135-pwrap";
> > -
> > -		...
> > -
> > -		pmic {
> > -			compatible = "mediatek,mt6397";
> > -
> > -			codec: mt6397codec {
> > -				compatible = "mediatek,mt6397-codec";
> > -			};
> > -
> > -			regulators {
> > -				compatible = "mediatek,mt6397-regulator";
> > -
> > -				mt6397_vpca15_reg: buck_vpca15 {
> > -					regulator-compatible = "buck_vpca15";
> > -					regulator-name = "vpca15";
> > -					regulator-min-microvolt = <850000>;
> > -					regulator-max-microvolt = <1400000>;
> > -					regulator-ramp-delay = <12500>;
> > -					regulator-always-on;
> > -				};
> > -
> > -				mt6397_vgp4_reg: ldo_vgp4 {
> > -					regulator-compatible = "ldo_vgp4";
> > -					regulator-name = "vgp4";
> > -					regulator-min-microvolt = <1200000>;
> > -					regulator-max-microvolt = <3300000>;
> > -					regulator-enable-ramp-delay = <218>;
> > -				};
> > -			};
> > -		};
> > -	};
> > diff --git a/Documentation/devicetree/bindings/power/reset/mt6323-poweroff.txt b/Documentation/devicetree/bindings/power/reset/mt6323-poweroff.txt
> > deleted file mode 100644
> > index 933f0c4..0000000
> > --- a/Documentation/devicetree/bindings/power/reset/mt6323-poweroff.txt
> > +++ /dev/null
> > @@ -1,20 +0,0 @@
> > -Device Tree Bindings for Power Controller on MediaTek PMIC
> > -
> > -The power controller which could be found on PMIC is responsible for externally
> > -powering off or on the remote MediaTek SoC through the circuit BBPU.
> > -
> > -Required properties:
> > -- compatible: Should be one of follows
> > -       "mediatek,mt6323-pwrc": for MT6323 PMIC
> > -
> > -Example:
> > -
> > -       pmic {
> > -               compatible = "mediatek,mt6323";
> > -
> > -               ...
> > -
> > -               power-controller {
> > -                       compatible = "mediatek,mt6323-pwrc";
> > -               };
> > -       }
> > diff --git a/Documentation/devicetree/bindings/rtc/rtc-mt6397.txt b/Documentation/devicetree/bindings/rtc/rtc-mt6397.txt
> > deleted file mode 100644
> > index 7212076..0000000
> > --- a/Documentation/devicetree/bindings/rtc/rtc-mt6397.txt
> > +++ /dev/null
> > @@ -1,31 +0,0 @@
> > -Device-Tree bindings for MediaTek PMIC based RTC
> > -
> > -MediaTek PMIC based RTC is an independent function of MediaTek PMIC that works
> > -as a type of multi-function device (MFD). The RTC can be configured and set up
> > -with PMIC wrapper bus which is a common resource shared with the other
> > -functions found on the same PMIC.
> > -
> > -For MediaTek PMIC MFD bindings, see:
> > -../mfd/mt6397.txt
> > -
> > -For MediaTek PMIC wrapper bus bindings, see:
> > -../soc/mediatek/pwrap.txt
> > -
> > -Required properties:
> > -- compatible: Should be one of follows
> > -       "mediatek,mt6323-rtc": for MT6323 PMIC
> > -       "mediatek,mt6358-rtc": for MT6358 PMIC
> > -       "mediatek,mt6366-rtc", "mediatek,mt6358-rtc": for MT6366 PMIC
> > -       "mediatek,mt6397-rtc": for MT6397 PMIC
> > -
> > -Example:
> > -
> > -       pmic {
> > -               compatible = "mediatek,mt6323";
> > -
> > -               ...
> > -
> > -               rtc {
> > -                       compatible = "mediatek,mt6323-rtc";
> > -               };
> > -       };
> > diff --git a/Documentation/devicetree/bindings/sound/mt6358.txt b/Documentation/devicetree/bindings/sound/mt6358.txt
> > deleted file mode 100644
> > index fbe9e55..0000000
> > --- a/Documentation/devicetree/bindings/sound/mt6358.txt
> > +++ /dev/null
> > @@ -1,26 +0,0 @@
> > -Mediatek MT6358 Audio Codec
> > -
> > -The communication between MT6358 and SoC is through Mediatek PMIC wrapper.
> > -For more detail, please visit Mediatek PMIC wrapper documentation.
> > -
> > -Must be a child node of PMIC wrapper.
> > -
> > -Required properties:
> > -
> > -- compatible - "string" - One of:
> > -    "mediatek,mt6358-sound"
> > -    "mediatek,mt6366-sound"
> > -- Avdd-supply : power source of AVDD
> > -
> > -Optional properties:
> > -- mediatek,dmic-mode : Indicates how many data pins are used to transmit two
> > -	channels of PDM signal. 0 means two wires, 1 means one wire. Default
> > -	value is 0.
> > -
> > -Example:
> > -
> > -mt6358_snd {
> > -	compatible = "mediatek,mt6358-sound";
> > -	Avdd-supply = <&mt6358_vaud28_reg>;
> > -	mediatek,dmic-mode = <0>;
> > -};
> > diff --git a/MAINTAINERS b/MAINTAINERS
> > index 2cdd7ca..e97b5ae 100644
> > --- a/MAINTAINERS
> > +++ b/MAINTAINERS
> > @@ -14418,10 +14418,12 @@ F:	Documentation/devicetree/bindings/net/bluetooth/mediatek,mt7921s-bluetooth.ya
> >  F:	drivers/bluetooth/btmtkuart.c
> >  
> >  MEDIATEK BOARD LEVEL SHUTDOWN DRIVERS
> > +M:	Sen Chu <sen.chu at mediatek.com>
> >  M:	Sean Wang <sean.wang at mediatek.com>
> > +M:	Macpaul Lin <macpaul.lin at mediatek.com>
> >  L:	linux-pm at vger.kernel.org
> >  S:	Maintained
> > -F:	Documentation/devicetree/bindings/power/reset/mt6323-poweroff.txt
> > +F:	Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml
> >  F:	drivers/power/reset/mt6323-poweroff.c
> >  
> >  MEDIATEK CIR DRIVER
> > @@ -14582,9 +14584,11 @@ F:	Documentation/devicetree/bindings/mtd/mediatek,mtk-nfc.yaml
> >  F:	drivers/mtd/nand/raw/mtk_*
> >  
> >  MEDIATEK PMIC LED DRIVER
> > +M:	Sen Chu <sen.chu at mediatek.com>
> >  M:	Sean Wang <sean.wang at mediatek.com>
> > +M:	Macpaul Lin <macpaul.lin at mediatek.com>
> >  S:	Maintained
> > -F:	Documentation/devicetree/bindings/leds/leds-mt6323.txt
> > +F:	Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml
> >  F:	drivers/leds/leds-mt6323.c
> >  
> >  MEDIATEK RANDOM NUMBER GENERATOR SUPPORT
> > -- 
> > 2.45.2
> > 
> > 
> 
> -- 
> Alexandre Belloni, co-owner and COO, Bootlin
> Embedded Linux and Kernel engineering
> https://bootlin.com
> 

-- 
Alexandre Belloni, co-owner and COO, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com


From angelogioacchino.delregno at collabora.com  Wed Sep 18 05:20:50 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Wed, 18 Sep 2024 14:20:50 +0200
Subject: [PATCH v6 1/2] regulator: dt-bindings: mt6323: Convert to DT
 schema
In-Reply-To: <20240918064955.6518-1-macpaul.lin@mediatek.com>
References: <20240918064955.6518-1-macpaul.lin@mediatek.com>
Message-ID: <bb82f7df-daf3-4162-a85d-0255b0f1cd0d@collabora.com>

Il 18/09/24 08:49, Macpaul Lin ha scritto:
> Convert the MT6323 regulator binding from the old text-based format to
> the new DT schema style. The property "regulator-name" has been added
> as required property to reflect current usage in mt6323.dtsi.
> 
> Examples have been streamlined and relocated to the parent schema file:
>    mfd/mediatek,mt6397.yaml.
> 
> Update maintainer and submitter information with new entries from MediaTek.
> 
> The reference document cited in "mediatek,mt7530.yaml" has been updated
> to point to this new DT schema file
> 
> Signed-off-by: Sen Chu <sen.chu at mediatek.com>
> Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
> Reviewed-by: Krzysztof Kozlowski <krzk at kernel.org>

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>




From peter.wang at mediatek.com  Wed Sep 18 06:29:58 2024
From: peter.wang at mediatek.com (=?utf-8?B?UGV0ZXIgV2FuZyAo546L5L+h5Y+LKQ==?=)
Date: Wed, 18 Sep 2024 13:29:58 +0000
Subject: [PATCH v4 2/2] ufs: core: requeue aborted request
In-Reply-To: <46d8be04-10db-4de1-8a59-6cd402bcecb1@acm.org>
References: <20240910073035.25974-1-peter.wang@mediatek.com>
	 <20240910073035.25974-3-peter.wang@mediatek.com>
	 <e42abf07-ba6b-4301-8717-8d5b01d56640@acm.org>
	 <04e392c00986ac798e881dcd347ff5045cf61708.camel@mediatek.com>
	 <858c4b6b-fcbc-4d51-8641-051aeda387c5@acm.org>
	 <524e9da9196cc0acf497ff87eba3a8043b780332.camel@mediatek.com>
	 <6203d7c9-b33c-4bf1-aca3-5fc8ba5636b9@acm.org>
	 <6fc025d7ffb9d702a117381fb5da318b40a24246.camel@mediatek.com>
	 <46d8be04-10db-4de1-8a59-6cd402bcecb1@acm.org>
Message-ID: <61a1678cad16dcb15f1e215ff1c47476666f0ee8.camel@mediatek.com>

On Fri, 2024-09-13 at 10:41 -0700, Bart Van Assche wrote:
>  	 
> External email : Please do not click links or open attachments until
> you have verified the sender or the content.
>  On 9/13/24 12:10 AM, Peter Wang (???) wrote:
> > Because the MediaTek UFS controller uses UTRLCLR to clear
> > commands and fills OCS with ABORTED.
> > 
> > Regarding the specification of UTRCS:
> > This bit is set to '1' by the host controller upon one of the
> > following:
> > Overall command Status (OCS) of the completed command is not
> > equal to 'SUCCESS' even if its UTRD Interrupt bit set to '0'
> > 
> > So, MediaTek host controller will send interrupt in this case.
> 
> Hi Peter,
> 
> Thank you for having shared this information. Please consider
> introducing a quirk for ignoring completions triggered by clearing
> a command, e.g. as follows (there may be better approaches):
> * In ufshcd_clear_cmd(), before a command is cleared, initialize
>    the completion that will be used for waiting for the completion
>    interrupt. After a command has been cleared, call
>    wait_for_completion_timeout().
> * In ufshcd_compl_one_cqe(), check whether the completion is the
>    result of a command being cleared. If so, call complete() instead
>    of executing the regular completion code.
> 
> Thanks,
> 
> Bart.


Hi Bart,

Sorry for the lack of response over the past few days due to the 
Mid-Autumn Festival in Taiwan. I think this would make the abort 
flow more complicated and difficult to understand.

Basically, this patch currently only needs to handle requeueing 
for the error handler abort.
The approach for DBR mode and MCQ mode should be consistent.
If receive an interrupt response (OCS:ABORTED or INVALID_OCS_VALUE), 
then set DID_REQUEUE. If there is no interrupt, it will also set 
SCSI DID_REQUEUE in ufshcd_err_handler through
ufshcd_complete_requests 
with force_compl = true.

As for the SCSI abort (30s) situation, in DBR mode, if there is an 
interrupt with OCS:ABORTED or INVALID_OCS_VALUE, then set DID_REQUEUE; 
if not, ufshcd_abort will also return SUCCESS, allowing SCSI to decide 
whether to retry the command. This part is less problematic, 
and we can keep the original approach.

The more problematic part is with MCQ mode. To imitate the DBR 
approach, we just need to set DID_REQUEUE upon receiving an interrupt. 
Everything else remains the same. This would make things simpler. 

Moving forward, if we want to simplify things and we have also 
taken stock of the two or three scenarios where OCS: ABORTED occurs, 
do we even need a flag? Couldn't we just set DID_REQUEUE directly 
for OCS: ABORTED?
What do you think?

Thanks.
Peter

From peter.wang at mediatek.com  Wed Sep 18 06:30:37 2024
From: peter.wang at mediatek.com (=?utf-8?B?UGV0ZXIgV2FuZyAo546L5L+h5Y+LKQ==?=)
Date: Wed, 18 Sep 2024 13:30:37 +0000
Subject: [PATCH v4 2/2] ufs: core: requeue aborted request
In-Reply-To: <9ed20622-c228-499f-80d9-23760e79af1c@acm.org>
References: <20240910073035.25974-1-peter.wang@mediatek.com>
	 <20240910073035.25974-3-peter.wang@mediatek.com>
	 <e42abf07-ba6b-4301-8717-8d5b01d56640@acm.org>
	 <04e392c00986ac798e881dcd347ff5045cf61708.camel@mediatek.com>
	 <9ed20622-c228-499f-80d9-23760e79af1c@acm.org>
Message-ID: <0fc1ef86ec25f413cc9a0d229417b5888d4237e1.camel@mediatek.com>

On Sat, 2024-09-14 at 09:13 -0700, Bart Van Assche wrote:
>  	 
> External email : Please do not click links or open attachments until
> you have verified the sender or the content.
>  On 9/10/24 11:03 PM, Peter Wang (???) wrote:
> > This statement is not quite accurate becasue in UFSHIC2.1, SDB mode
> > specification already have OCS: ABORTED (0x6) define.
> 
> I think I found why that status code is defined in the UFSHCI 2.1
> standard. From the UFS 2.0 standard: "TASK ABORTED - This status
> shall
> be returned when a command is aborted by a command or task management
> function on another I_T nexus and the Control mode page TAS bit is
> set
> to one. Since in UFS there is only one I_T nexus and TAS bit is zero
> TASK ABORTED status codes will never occur."
> 
> Bart.
> 


Hi Bart,

Okay, I think this is a very good reason that explains 
why UFSHCI2.1 has defined OCS: ABORTED. Thank you for sharing 
this information.

Thanks.
Peter

From luiz.dentz at gmail.com  Wed Sep 18 06:37:29 2024
From: luiz.dentz at gmail.com (Luiz Augusto von Dentz)
Date: Wed, 18 Sep 2024 09:37:29 -0400
Subject: [PATCH] Bluetooth: btmtk: Remove resetting mt7921 before
 downloading the fw
In-Reply-To: <9bfbbf24ac2480d94d3455f7e33e4b5502b38ced.camel@mediatek.com>
References: <20240822052310.25220-1-hao.qin@mediatek.com> <ZuB3omUkdUHLggYu@mdpsys.co.uk>
 <790e542aa9d08c7efeee6ef298fce2a87d8035e4.camel@mediatek.com>
 <ZuneSM4SvyUFX86j@mdpsys.co.uk> <9bfbbf24ac2480d94d3455f7e33e4b5502b38ced.camel@mediatek.com>
Message-ID: <CABBYNZKYsL9jcF2n9TsA1BjU-CjXOdXu7MDLP9Sz_Ly8hBAf1w@mail.gmail.com>

Hi Chris,

On Tue, Sep 17, 2024 at 11:37?PM Chris Lu (???) <Chris.Lu at mediatek.com> wrote:
>
> On Tue, 2024-09-17 at 20:53 +0100, marc.payne at mdpsys.co.uk wrote:
>
> Hi Marc,
>
> Thank you for providing the logs for us to debug.
>
>
> External email : Please do not click links or open attachments until you have verified the sender or the content.
>  The 12/09/2024 07:09, Chris Lu (???) wrote:
> > On Tue, 2024-09-10 at 18:09 +0100, Marc Payne wrote:
> >
> > Hi Marc,
>
> Hi,
>
> >
> > Is it possible to provide entire kernel log for further debugging?
> > (From boot up to issue heppen)
> >
> > We suspect that the issue occurred event earilier and our controller is
> > not able to recover itself. Therfore, we need to check if Bluetooth
> > works as expected in the booting stage.
>
> Happy to help. Below is the log for a cold boot of Linux 6.11-rc7 (with
> the additional patch to avoid the controller reset before fw load). The
> MT7921AUN is directly connected to one of the computer's USB ports. The
>
>
> Is "MT7921AUN" an external Bluetooth/WiFi usb dongle?
> From the information in the kernel log you provided, the MT7921AUN IC used on
> the dongle is not for Linux PC project. Since the firmware we push to Kernel is not
> for "MT7921AUN", software, firmware and hardware may not match. Using that
> dongle with Linux-Based Notebook may lead to some unexpected errors such as
> Bluetooth can't setup successfully.

Then something is not right with our code, either the driver shall not
be probed for such models or not attempt to load the wrong firmware,
sounds like the patch tries to address the later but given your
explanation perhaps we should consider not even attempting to probe
for such models?

> Do you have an M.2 MT7921 module? (Typically existed in the Notebook product with
> MediaTek Connectivity solution). The M.2 module is the correct one expected to be used.
> I've setup an environment locally with Kernel v6.11, With Hao Qin's solustion
> ("[PATCH] Bluetooth: btmtk: Remove resetting mt7921 before downloading the fw"),
> I'm albe to successfully setup Bluetooth and works normally.

Shall I consider this a Tested-by?

> BRs,
> Chris
>
> system has an Intel AX211 fitted so I have disabled it's bluetooth
> functionality in the UEFI setup.
>
> Hope this helps.
>
> >
> > BRs,
> > Chris Lu
>
> Regards,
>
> Marc
>
>
> [    0.000000] Linux version 6.11.0-rc7-00001-g0e2ad6528188-dirty (marcp at mdp-archnuc) (gcc (GCC) 14.2.1 20240805, GNU ld (GNU Binutils) 2.43.0) #71 SMP PREEMPT_DYNAMIC Mon Sep  9 23:22:56 BST 2024
> [    0.000000] Command line: root=UUID=0420afc7-4947-4e2e-a096-b607b8b7fd93 rw quiet initrd=boot\intel-ucode.img initrd=boot\initramfs-linux611.img resume=UUID=0420afc7-4947-4e2e-a096-b607b8b7fd93 resume_offset=106496
> [    0.000000] x86/split lock detection: #AC: crashing the kernel on kernel split_locks and warning on user-space split_locks
> [    0.000000] BIOS-provided physical RAM map:
> [    0.000000] BIOS-e820: [mem 0x0000000000000000-0x000000000009dfff] usable
> [    0.000000] BIOS-e820: [mem 0x000000000009e000-0x000000000009efff] reserved
> [    0.000000] BIOS-e820: [mem 0x000000000009f000-0x000000000009ffff] usable
> [    0.000000] BIOS-e820: [mem 0x00000000000a0000-0x00000000000fffff] reserved
> [    0.000000] BIOS-e820: [mem 0x0000000000100000-0x000000004dd45fff] usable
> [    0.000000] BIOS-e820: [mem 0x000000004dd46000-0x0000000056c70fff] reserved
> [    0.000000] BIOS-e820: [mem 0x0000000056c71000-0x0000000056d48fff] ACPI data
> [    0.000000] BIOS-e820: [mem 0x0000000056d49000-0x0000000056ecefff] ACPI NVS
> [    0.000000] BIOS-e820: [mem 0x0000000056ecf000-0x000000005a7fefff] reserved
> [    0.000000] BIOS-e820: [mem 0x000000005a7ff000-0x000000005a7fffff] usable
> [    0.000000] BIOS-e820: [mem 0x000000005a800000-0x00000000611fffff] reserved
> [    0.000000] BIOS-e820: [mem 0x0000000061e00000-0x00000000687fffff] reserved
> [    0.000000] BIOS-e820: [mem 0x00000000c0000000-0x00000000cfffffff] reserved
> [    0.000000] BIOS-e820: [mem 0x00000000fe000000-0x00000000fe010fff] reserved
> [    0.000000] BIOS-e820: [mem 0x00000000fec00000-0x00000000fec00fff] reserved
> [    0.000000] BIOS-e820: [mem 0x00000000fed00000-0x00000000fed00fff] reserved
> [    0.000000] BIOS-e820: [mem 0x00000000fed20000-0x00000000fed7ffff] reserved
> [    0.000000] BIOS-e820: [mem 0x00000000fee00000-0x00000000fee00fff] reserved
> [    0.000000] BIOS-e820: [mem 0x00000000ff000000-0x00000000ffffffff] reserved
> [    0.000000] BIOS-e820: [mem 0x0000000100000000-0x00000010977fffff] usable
> [    0.000000] NX (Execute Disable) protection: active
> [    0.000000] APIC: Static calls initialized
> [    0.000000] efi: EFI v2.8 by American Megatrends
> [    0.000000] efi: ACPI=0x56e48000 ACPI 2.0=0x56e48014 TPMFinalLog=0x56db4000 SMBIOS=0x5a483000 SMBIOS 3.0=0x5a482000 MEMATTR=0x4485d118 ESRT=0x43ea7e98 INITRD=0x41e12e98 RNG=0x56c9b018 TPMEventLog=0x41dd5018
> [    0.000000] random: crng init done
> [    0.000000] efi: Remove mem115: MMIO range=[0xc0000000-0xcfffffff] (256MB) from e820 map
> [    0.000000] e820: remove [mem 0xc0000000-0xcfffffff] reserved
> [    0.000000] efi: Not removing mem116: MMIO range=[0xfe000000-0xfe010fff] (68KB) from e820 map
> [    0.000000] efi: Not removing mem117: MMIO range=[0xfec00000-0xfec00fff] (4KB) from e820 map
> [    0.000000] efi: Not removing mem118: MMIO range=[0xfed00000-0xfed00fff] (4KB) from e820 map
> [    0.000000] efi: Not removing mem120: MMIO range=[0xfee00000-0xfee00fff] (4KB) from e820 map
> [    0.000000] efi: Remove mem121: MMIO range=[0xff000000-0xffffffff] (16MB) from e820 map
> [    0.000000] e820: remove [mem 0xff000000-0xffffffff] reserved
> [    0.000000] SMBIOS 3.5.0 present.
> [    0.000000] DMI: Intel(R) Client Systems NUC12WSHi7/NUC12WSBi7, BIOS WSADL357.0088.2023.0505.1623 05/05/2023
> [    0.000000] DMI: Memory slots populated: 2/2
> [    0.000000] tsc: Detected 2500.000 MHz processor
> [    0.000000] tsc: Detected 2496.000 MHz TSC
> [    0.000549] e820: update [mem 0x00000000-0x00000fff] usable ==> reserved
> [    0.000550] e820: remove [mem 0x000a0000-0x000fffff] usable
> [    0.000555] last_pfn = 0x1097800 max_arch_pfn = 0x400000000
> [    0.000558] MTRR map: 5 entries (3 fixed + 2 variable; max 23), built from 10 variable MTRRs
> [    0.000559] x86/PAT: Configuration [0-7]: WB  WC  UC- UC  WB  WP  UC- WT
> [    0.000935] last_pfn = 0x5a800 max_arch_pfn = 0x400000000
> [    0.014044] esrt: Reserving ESRT space from 0x0000000043ea7e98 to 0x0000000043ea7f98.
> [    0.014049] e820: update [mem 0x43ea7000-0x43ea7fff] usable ==> reserved
> [    0.014062] Using GB pages for direct mapping
> [    0.014063] Incomplete global flushes, disabling PCID
> [    0.014285] Secure boot disabled
> [    0.014285] RAMDISK: [mem 0x39be8000-0x4039cfff]
> [    0.014312] ACPI: Early table checksum verification disabled
> [    0.014315] ACPI: RSDP 0x0000000056E48014 000024 (v02 INTEL )
> [    0.014318] ACPI: XSDT 0x0000000056DE4728 000114 (v01 INTEL  NUCxi7A5 00000058 AMI  01000013)
> [    0.014322] ACPI: FACP 0x0000000056D46000 000114 (v06 INTEL  NUCxi7A5 00000058 AMI  01000013)
> [    0.014326] ACPI: DSDT 0x0000000056CD9000 06CECF (v02 INTEL  NUCxi7A5 00000058 INTL 20200717)
> [    0.014328] ACPI: FACS 0x0000000056ECC000 000040
> [    0.014329] ACPI: FIDT 0x0000000056CD8000 00009C (v01 INTEL  NUCxi7A5 00000058 AMI  00010013)
> [    0.014331] ACPI: SSDT 0x0000000056D48000 00038C (v02 INTEL  NUCxi7A5 00000058 INTL 20200717)
> [    0.014333] ACPI: SSDT 0x0000000056CD2000 005D2C (v02 INTEL  NUCxi7A5 00000058 INTL 20200717)
> [    0.014335] ACPI: SSDT 0x0000000056CCF000 002AA1 (v02 INTEL  NUCxi7A5 00000058 INTL 20200717)
> [    0.014337] ACPI: SSDT 0x0000000056CCB000 0033D3 (v02 INTEL  NUCxi7A5 00000058 INTL 20200717)
> [    0.014339] ACPI: SSDT 0x0000000056CBD000 00D39F (v02 INTEL  NUCxi7A5 00001000 INTL 20200717)
> [    0.014341] ACPI: HPET 0x0000000056D47000 000038 (v01 INTEL  NUCxi7A5 00000058 AMI  01000013)
> [    0.014343] ACPI: APIC 0x0000000056CBC000 0001DC (v05 INTEL  NUCxi7A5 00000058 AMI  01000013)
> [    0.014344] ACPI: MCFG 0x0000000056CBB000 00003C (v01 INTEL  NUCxi7A5 00000058 AMI  01000013)
> [    0.014346] ACPI: SSDT 0x0000000056CB9000 001F04 (v02 INTEL  NUCxi7A5 00000058 INTL 20200717)
> [    0.014348] ACPI: SSDT 0x0000000056CB7000 001DFD (v02 INTEL  NUCxi7A5 00000058 INTL 20200717)
> [    0.014350] ACPI: UEFI 0x0000000056D9B000 000048 (v01 INTEL  NUCxi7A5 00000058 AMI  01000013)
> [    0.014352] ACPI: NHLT 0x0000000056CB6000 0002F1 (v00 INTEL  NUCxi7A5 00000058 AMI  01000013)
> [    0.014353] ACPI: LPIT 0x0000000056CB5000 0000CC (v01 INTEL  NUCxi7A5 00000058 AMI  01000013)
> [    0.014355] ACPI: WDAT 0x0000000056CB3000 000134 (v01 INTEL  NUCxi7A5 00000058 AMI  01000013)
> [    0.014357] ACPI: SSDT 0x0000000056CB0000 002A83 (v02 INTEL  NUCxi7A5 00000058 INTL 20200717)
> [    0.014359] ACPI: SSDT 0x0000000056CAD000 002357 (v02 INTEL  NUCxi7A5 00000058 INTL 20200717)
> [    0.014361] ACPI: DBGP 0x0000000056CAC000 000034 (v01 INTEL  NUCxi7A5 00000058 AMI  01000013)
> [    0.014363] ACPI: DBG2 0x0000000056CAB000 000054 (v00 INTEL  NUCxi7A5 00000058 AMI  01000013)
> [    0.014364] ACPI: DMAR 0x0000000056CAA000 000088 (v02 INTEL  NUCxi7A5 00000058      01000013)
> [    0.014366] ACPI: FPDT 0x0000000056CA9000 000044 (v01 INTEL  NUCxi7A5 00000058 AMI  01000013)
> [    0.014368] ACPI: SSDT 0x0000000056CA8000 000D56 (v02 INTEL  NUCxi7A5 00000058 INTL 20200717)
> [    0.014370] ACPI: SSDT 0x0000000056CA4000 003AEA (v02 INTEL  NUCxi7A5 00000058 INTL 20200717)
> [    0.014372] ACPI: SSDT 0x0000000056CA0000 0035A2 (v02 INTEL  NUCxi7A5 00000058 INTL 20200717)
> [    0.014374] ACPI: SSDT 0x0000000056C9F000 000144 (v02 INTEL  NUCxi7A5 00000058 INTL 20200717)
> [    0.014376] ACPI: BGRT 0x0000000056C9E000 000038 (v01 INTEL  NUCxi7A5 00000058 AMI  00010013)
> [    0.014377] ACPI: TPM2 0x0000000056C9D000 00004C (v04 INTEL  NUCxi7A5 00000058 AMI  00000000)
> [    0.014379] ACPI: PHAT 0x0000000056C9C000 00062D (v01 INTEL  NUCxi7A5 00000058 MSFT 0100000D)
> [    0.014381] ACPI: WSMT 0x0000000056CB4000 000028 (v01 INTEL  NUCxi7A5 00000058 AMI  00010013)
> [    0.014383] ACPI: Reserving FACP table memory at [mem 0x56d46000-0x56d46113]
> [    0.014384] ACPI: Reserving DSDT table memory at [mem 0x56cd9000-0x56d45ece]
> [    0.014384] ACPI: Reserving FACS table memory at [mem 0x56ecc000-0x56ecc03f]
> [    0.014385] ACPI: Reserving FIDT table memory at [mem 0x56cd8000-0x56cd809b]
> [    0.014386] ACPI: Reserving SSDT table memory at [mem 0x56d48000-0x56d4838b]
> [    0.014386] ACPI: Reserving SSDT table memory at [mem 0x56cd2000-0x56cd7d2b]
> [    0.014387] ACPI: Reserving SSDT table memory at [mem 0x56ccf000-0x56cd1aa0]
> [    0.014387] ACPI: Reserving SSDT table memory at [mem 0x56ccb000-0x56cce3d2]
> [    0.014388] ACPI: Reserving SSDT table memory at [mem 0x56cbd000-0x56cca39e]
> [    0.014388] ACPI: Reserving HPET table memory at [mem 0x56d47000-0x56d47037]
> [    0.014389] ACPI: Reserving APIC table memory at [mem 0x56cbc000-0x56cbc1db]
> [    0.014389] ACPI: Reserving MCFG table memory at [mem 0x56cbb000-0x56cbb03b]
> [    0.014390] ACPI: Reserving SSDT table memory at [mem 0x56cb9000-0x56cbaf03]
> [    0.014390] ACPI: Reserving SSDT table memory at [mem 0x56cb7000-0x56cb8dfc]
> [    0.014391] ACPI: Reserving UEFI table memory at [mem 0x56d9b000-0x56d9b047]
> [    0.014391] ACPI: Reserving NHLT table memory at [mem 0x56cb6000-0x56cb62f0]
> [    0.014392] ACPI: Reserving LPIT table memory at [mem 0x56cb5000-0x56cb50cb]
> [    0.014392] ACPI: Reserving WDAT table memory at [mem 0x56cb3000-0x56cb3133]
> [    0.014393] ACPI: Reserving SSDT table memory at [mem 0x56cb0000-0x56cb2a82]
> [    0.014393] ACPI: Reserving SSDT table memory at [mem 0x56cad000-0x56caf356]
> [    0.014394] ACPI: Reserving DBGP table memory at [mem 0x56cac000-0x56cac033]
> [    0.014394] ACPI: Reserving DBG2 table memory at [mem 0x56cab000-0x56cab053]
> [    0.014395] ACPI: Reserving DMAR table memory at [mem 0x56caa000-0x56caa087]
> [    0.014395] ACPI: Reserving FPDT table memory at [mem 0x56ca9000-0x56ca9043]
> [    0.014396] ACPI: Reserving SSDT table memory at [mem 0x56ca8000-0x56ca8d55]
> [    0.014396] ACPI: Reserving SSDT table memory at [mem 0x56ca4000-0x56ca7ae9]
> [    0.014397] ACPI: Reserving SSDT table memory at [mem 0x56ca0000-0x56ca35a1]
> [    0.014397] ACPI: Reserving SSDT table memory at [mem 0x56c9f000-0x56c9f143]
> [    0.014398] ACPI: Reserving BGRT table memory at [mem 0x56c9e000-0x56c9e037]
> [    0.014398] ACPI: Reserving TPM2 table memory at [mem 0x56c9d000-0x56c9d04b]
> [    0.014399] ACPI: Reserving PHAT table memory at [mem 0x56c9c000-0x56c9c62c]
> [    0.014400] ACPI: Reserving WSMT table memory at [mem 0x56cb4000-0x56cb4027]
> [    0.014743] No NUMA configuration found
> [    0.014744] Faking a node at [mem 0x0000000000000000-0x00000010977fffff]
> [    0.014746] NODE_DATA(0) allocated [mem 0x10977fb000-0x10977fffff]
> [    0.014795] Zone ranges:
> [    0.014796]   DMA      [mem 0x0000000000001000-0x0000000000ffffff]
> [    0.014797]   DMA32    [mem 0x0000000001000000-0x00000000ffffffff]
> [    0.014798]   Normal   [mem 0x0000000100000000-0x00000010977fffff]
> [    0.014799]   Device   empty
> [    0.014799] Movable zone start for each node
> [    0.014800] Early memory node ranges
> [    0.014800]   node   0: [mem 0x0000000000001000-0x000000000009dfff]
> [    0.014801]   node   0: [mem 0x000000000009f000-0x000000000009ffff]
> [    0.014801]   node   0: [mem 0x0000000000100000-0x000000004dd45fff]
> [    0.014802]   node   0: [mem 0x000000005a7ff000-0x000000005a7fffff]
> [    0.014802]   node   0: [mem 0x0000000100000000-0x00000010977fffff]
> [    0.014805] Initmem setup node 0 [mem 0x0000000000001000-0x00000010977fffff]
> [    0.014808] On node 0, zone DMA: 1 pages in unavailable ranges
> [    0.014809] On node 0, zone DMA: 1 pages in unavailable ranges
> [    0.014821] On node 0, zone DMA: 96 pages in unavailable ranges
> [    0.015998] On node 0, zone DMA32: 19129 pages in unavailable ranges
> [    0.078525] On node 0, zone Normal: 22528 pages in unavailable ranges
> [    0.078536] On node 0, zone Normal: 2048 pages in unavailable ranges
> [    0.078567] Reserving Intel graphics memory at [mem 0x64800000-0x687fffff]
> [    0.080194] ACPI: PM-Timer IO Port: 0x1808
> [    0.080199] ACPI: LAPIC_NMI (acpi_id[0x01] high edge lint[0x1])
> [    0.080200] ACPI: LAPIC_NMI (acpi_id[0x02] high edge lint[0x1])
> [    0.080200] ACPI: LAPIC_NMI (acpi_id[0x03] high edge lint[0x1])
> [    0.080201] ACPI: LAPIC_NMI (acpi_id[0x04] high edge lint[0x1])
> [    0.080201] ACPI: LAPIC_NMI (acpi_id[0x05] high edge lint[0x1])
> [    0.080201] ACPI: LAPIC_NMI (acpi_id[0x06] high edge lint[0x1])
> [    0.080202] ACPI: LAPIC_NMI (acpi_id[0x07] high edge lint[0x1])
> [    0.080202] ACPI: LAPIC_NMI (acpi_id[0x08] high edge lint[0x1])
> [    0.080203] ACPI: LAPIC_NMI (acpi_id[0x09] high edge lint[0x1])
> [    0.080203] ACPI: LAPIC_NMI (acpi_id[0x0a] high edge lint[0x1])
> [    0.080203] ACPI: LAPIC_NMI (acpi_id[0x0b] high edge lint[0x1])
> [    0.080204] ACPI: LAPIC_NMI (acpi_id[0x0c] high edge lint[0x1])
> [    0.080204] ACPI: LAPIC_NMI (acpi_id[0x0d] high edge lint[0x1])
> [    0.080205] ACPI: LAPIC_NMI (acpi_id[0x0e] high edge lint[0x1])
> [    0.080205] ACPI: LAPIC_NMI (acpi_id[0x0f] high edge lint[0x1])
> [    0.080205] ACPI: LAPIC_NMI (acpi_id[0x10] high edge lint[0x1])
> [    0.080206] ACPI: LAPIC_NMI (acpi_id[0x11] high edge lint[0x1])
> [    0.080206] ACPI: LAPIC_NMI (acpi_id[0x12] high edge lint[0x1])
> [    0.080207] ACPI: LAPIC_NMI (acpi_id[0x13] high edge lint[0x1])
> [    0.080207] ACPI: LAPIC_NMI (acpi_id[0x14] high edge lint[0x1])
> [    0.080207] ACPI: LAPIC_NMI (acpi_id[0x15] high edge lint[0x1])
> [    0.080208] ACPI: LAPIC_NMI (acpi_id[0x16] high edge lint[0x1])
> [    0.080208] ACPI: LAPIC_NMI (acpi_id[0x17] high edge lint[0x1])
> [    0.080209] ACPI: LAPIC_NMI (acpi_id[0x00] high edge lint[0x1])
> [    0.080291] IOAPIC[0]: apic_id 2, version 32, address 0xfec00000, GSI 0-119
> [    0.080293] ACPI: INT_SRC_OVR (bus 0 bus_irq 0 global_irq 2 dfl dfl)
> [    0.080294] ACPI: INT_SRC_OVR (bus 0 bus_irq 9 global_irq 9 high level)
> [    0.080296] ACPI: Using ACPI (MADT) for SMP configuration information
> [    0.080297] ACPI: HPET id: 0x8086a201 base: 0xfed00000
> [    0.080302] e820: update [mem 0x444e6000-0x44584fff] usable ==> reserved
> [    0.080309] TSC deadline timer available
> [    0.080311] CPU topo: Max. logical packages:   1
> [    0.080311] CPU topo: Max. logical dies:       1
> [    0.080312] CPU topo: Max. dies per package:   1
> [    0.080313] CPU topo: Max. threads per core:   2
> [    0.080314] CPU topo: Num. cores per package:    12
> [    0.080314] CPU topo: Num. threads per package:  16
> [    0.080314] CPU topo: Allowing 16 present CPUs plus 0 hotplug CPUs
> [    0.080325] PM: hibernation: Registered nosave memory: [mem 0x00000000-0x00000fff]
> [    0.080326] PM: hibernation: Registered nosave memory: [mem 0x0009e000-0x0009efff]
> [    0.080327] PM: hibernation: Registered nosave memory: [mem 0x000a0000-0x000fffff]
> [    0.080328] PM: hibernation: Registered nosave memory: [mem 0x43ea7000-0x43ea7fff]
> [    0.080329] PM: hibernation: Registered nosave memory: [mem 0x444e6000-0x44584fff]
> [    0.080330] PM: hibernation: Registered nosave memory: [mem 0x4dd46000-0x56c70fff]
> [    0.080330] PM: hibernation: Registered nosave memory: [mem 0x56c71000-0x56d48fff]
> [    0.080331] PM: hibernation: Registered nosave memory: [mem 0x56d49000-0x56ecefff]
> [    0.080331] PM: hibernation: Registered nosave memory: [mem 0x56ecf000-0x5a7fefff]
> [    0.080332] PM: hibernation: Registered nosave memory: [mem 0x5a800000-0x611fffff]
> [    0.080332] PM: hibernation: Registered nosave memory: [mem 0x61200000-0x61dfffff]
> [    0.080333] PM: hibernation: Registered nosave memory: [mem 0x61e00000-0x687fffff]
> [    0.080333] PM: hibernation: Registered nosave memory: [mem 0x68800000-0xfdffffff]
> [    0.080333] PM: hibernation: Registered nosave memory: [mem 0xfe000000-0xfe010fff]
> [    0.080334] PM: hibernation: Registered nosave memory: [mem 0xfe011000-0xfebfffff]
> [    0.080334] PM: hibernation: Registered nosave memory: [mem 0xfec00000-0xfec00fff]
> [    0.080334] PM: hibernation: Registered nosave memory: [mem 0xfec01000-0xfecfffff]
> [    0.080335] PM: hibernation: Registered nosave memory: [mem 0xfed00000-0xfed00fff]
> [    0.080335] PM: hibernation: Registered nosave memory: [mem 0xfed01000-0xfed1ffff]
> [    0.080336] PM: hibernation: Registered nosave memory: [mem 0xfed20000-0xfed7ffff]
> [    0.080336] PM: hibernation: Registered nosave memory: [mem 0xfed80000-0xfedfffff]
> [    0.080336] PM: hibernation: Registered nosave memory: [mem 0xfee00000-0xfee00fff]
> [    0.080337] PM: hibernation: Registered nosave memory: [mem 0xfee01000-0xffffffff]
> [    0.080338] [mem 0x68800000-0xfdffffff] available for PCI devices
> [    0.080339] Booting paravirtualized kernel on bare hardware
> [    0.080340] clocksource: refined-jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 6370452778343963 ns
> [    0.084163] setup_percpu: NR_CPUS:320 nr_cpumask_bits:16 nr_cpu_ids:16 nr_node_ids:1
> [    0.084800] percpu: Embedded 66 pages/cpu s233472 r8192 d28672 u524288
> [    0.084804] pcpu-alloc: s233472 r8192 d28672 u524288 alloc=1*2097152
> [    0.084806] pcpu-alloc: [0] 00 01 02 03 [0] 04 05 06 07
> [    0.084809] pcpu-alloc: [0] 08 09 10 11 [0] 12 13 14 15
> [    0.084820] Kernel command line: root=UUID=0420afc7-4947-4e2e-a096-b607b8b7fd93 rw quiet initrd=boot\intel-ucode.img initrd=boot\initramfs-linux611.img resume=UUID=0420afc7-4947-4e2e-a096-b607b8b7fd93 resume_offset=106496
> [    0.088825] Dentry cache hash table entries: 8388608 (order: 14, 67108864 bytes, linear)
> [    0.090830] Inode-cache hash table entries: 4194304 (order: 13, 33554432 bytes, linear)
> [    0.090938] Fallback order for Node 0: 0
> [    0.090940] Built 1 zonelists, mobility grouping on.  Total pages: 16667877
> [    0.090941] Policy zone: Normal
> [    0.091110] mem auto-init: stack:all(zero), heap alloc:on, heap free:off
> [    0.091117] software IO TLB: area num 16.
> [    0.174200] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=16, Nodes=1
> [    0.174233] ftrace: allocating 50629 entries in 198 pages
> [    0.178623] ftrace: allocated 198 pages with 4 groups
> [    0.178673] Dynamic Preempt: full
> [    0.178715] rcu: Preemptible hierarchical RCU implementation.
> [    0.178716] rcu: RCU restricting CPUs from NR_CPUS=320 to nr_cpu_ids=16.
> [    0.178716] rcu: RCU priority boosting: priority 1 delay 500 ms.
> [    0.178717] Trampoline variant of Tasks RCU enabled.
> [    0.178718] Rude variant of Tasks RCU enabled.
> [    0.178718] Tracing variant of Tasks RCU enabled.
> [    0.178718] rcu: RCU calculated value of scheduler-enlistment delay is 30 jiffies.
> [    0.178719] rcu: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=16
> [    0.178727] RCU Tasks: Setting shift to 4 and lim to 1 rcu_task_cb_adjust=1.
> [    0.178728] RCU Tasks Rude: Setting shift to 4 and lim to 1 rcu_task_cb_adjust=1.
> [    0.178729] RCU Tasks Trace: Setting shift to 4 and lim to 1 rcu_task_cb_adjust=1.
> [    0.181066] NR_IRQS: 20736, nr_irqs: 2184, preallocated irqs: 16
> [    0.181413] rcu: srcu_init: Setting srcu_struct sizes based on contention.
> [    0.181851] kfence: initialized - using 2097152 bytes for 255 objects at 0x(____ptrval____)-0x(____ptrval____)
> [    0.181876] Console: colour dummy device 80x25
> [    0.181878] printk: legacy console [tty0] enabled
> [    0.181906] ACPI: Core revision 20240322
> [    0.182096] hpet: HPET dysfunctional in PC10. Force disabled.
> [    0.182097] APIC: Switch to symmetric I/O mode setup
> [    0.182099] DMAR: Host address width 39
> [    0.182099] DMAR: DRHD base: 0x000000fed90000 flags: 0x0
> [    0.182103] DMAR: dmar0: reg_base_addr fed90000 ver 4:0 cap 1c0000c40660462 ecap 29a00f0505e
> [    0.182104] DMAR: DRHD base: 0x000000fed91000 flags: 0x1
> [    0.182107] DMAR: dmar1: reg_base_addr fed91000 ver 5:0 cap d2008c40660462 ecap f050da
> [    0.182109] DMAR: RMRR base: 0x00000064000000 end: 0x000000687fffff
> [    0.182111] DMAR-IR: IOAPIC id 2 under DRHD base  0xfed91000 IOMMU 1
> [    0.182112] DMAR-IR: HPET id 0 under DRHD base 0xfed91000
> [    0.182112] DMAR-IR: Queued invalidation will be enabled to support x2apic and Intr-remapping.
> [    0.186032] DMAR-IR: Enabled IRQ remapping in x2apic mode
> [    0.186034] x2apic enabled
> [    0.186100] APIC: Switched APIC routing to: cluster x2apic
> [    0.197380] clocksource: tsc-early: mask: 0xffffffffffffffff max_cycles: 0x23fa772cf26, max_idle_ns: 440795269835 ns
> [    0.197384] Calibrating delay loop (skipped), value calculated using timer frequency.. 4993.00 BogoMIPS (lpj=8320000)
> [    0.197430] CPU0: Thermal monitoring enabled (TM1)
> [    0.197431] x86/cpu: User Mode Instruction Prevention (UMIP) activated
> [    0.197530] CET detected: Indirect Branch Tracking enabled
> [    0.197532] Last level iTLB entries: 4KB 0, 2MB 0, 4MB 0
> [    0.197532] Last level dTLB entries: 4KB 0, 2MB 0, 4MB 0, 1GB 0
> [    0.197534] process: using mwait in idle threads
> [    0.197536] Spectre V1 : Mitigation: usercopy/swapgs barriers and __user pointer sanitization
> [    0.197537] Spectre V2 : Mitigation: Enhanced / Automatic IBRS
> [    0.197538] Spectre V2 : Spectre v2 / SpectreRSB mitigation: Filling RSB on context switch
> [    0.197538] Spectre V2 : Spectre v2 / PBRSB-eIBRS: Retire a single CALL on VMEXIT
> [    0.197539] Spectre V2 : mitigation: Enabling conditional Indirect Branch Prediction Barrier
> [    0.197540] Speculative Store Bypass: Mitigation: Speculative Store Bypass disabled via prctl
> [    0.197541] Register File Data Sampling: Mitigation: Clear Register File
> [    0.197547] x86/fpu: Supporting XSAVE feature 0x001: 'x87 floating point registers'
> [    0.197548] x86/fpu: Supporting XSAVE feature 0x002: 'SSE registers'
> [    0.197548] x86/fpu: Supporting XSAVE feature 0x004: 'AVX registers'
> [    0.197549] x86/fpu: Supporting XSAVE feature 0x200: 'Protection Keys User registers'
> [    0.197549] x86/fpu: Supporting XSAVE feature 0x800: 'Control-flow User registers'
> [    0.197550] x86/fpu: xstate_offset[2]:  576, xstate_sizes[2]:  256
> [    0.197551] x86/fpu: xstate_offset[9]:  832, xstate_sizes[9]:    8
> [    0.197551] x86/fpu: xstate_offset[11]:  840, xstate_sizes[11]:   16
> [    0.197552] x86/fpu: Enabled xstate features 0xa07, context size is 856 bytes, using 'compacted' format.
> [    0.200716] Freeing SMP alternatives memory: 40K
> [    0.200716] pid_max: default: 32768 minimum: 301
> [    0.200716] LSM: initializing lsm=capability,landlock,lockdown,yama,bpf
> [    0.200716] landlock: Up and running.
> [    0.200716] Yama: becoming mindful.
> [    0.200716] LSM support for eBPF active
> [    0.200716] Mount-cache hash table entries: 131072 (order: 8, 1048576 bytes, linear)
> [    0.200716] Mountpoint-cache hash table entries: 131072 (order: 8, 1048576 bytes, linear)
> [    0.200716] smpboot: CPU0: 12th Gen Intel(R) Core(TM) i7-1260P (family: 0x6, model: 0x9a, stepping: 0x3)
> [    0.200716] Performance Events: XSAVE Architectural LBR, PEBS fmt4+-baseline,  AnyThread deprecated, Alderlake Hybrid events, 32-deep LBR, full-width counters, Intel PMU driver.
> [    0.200716] core: cpu_core PMU driver:
> [    0.200716] ... version:                5
> [    0.200716] ... bit width:              48
> [    0.200716] ... generic registers:      8
> [    0.200716] ... value mask:             0000ffffffffffff
> [    0.200716] ... max period:             00007fffffffffff
> [    0.200716] ... fixed-purpose events:   4
> [    0.200716] ... event mask:             0001000f000000ff
> [    0.200716] signal: max sigframe size: 3632
> [    0.200716] Estimated ratio of average max frequency by base frequency (times 1024): 1556
> [    0.200716] rcu: Hierarchical SRCU implementation.
> [    0.200716] rcu: Max phase no-delay instances is 1000.
> [    0.200716] Timer migration: 2 hierarchy levels; 8 children per group; 2 crossnode level
> [    0.200716] NMI watchdog: Enabled. Permanently consumes one hw-PMU counter.
> [    0.200716] smp: Bringing up secondary CPUs ...
> [    0.200716] smpboot: x86: Booting SMP configuration:
> [    0.200716] .... node  #0, CPUs:        #2  #4  #6  #8  #9 #10 #11 #12 #13 #14 #15
> [    0.018930] core: cpu_atom PMU driver: PEBS-via-PT
> [    0.018930] ... version:                5
> [    0.018930] ... bit width:              48
> [    0.018930] ... generic registers:      6
> [    0.018930] ... value mask:             0000ffffffffffff
> [    0.018930] ... max period:             00007fffffffffff
> [    0.018930] ... fixed-purpose events:   3
> [    0.018930] ... event mask:             000000070000003f
> [    0.210777]   #1  #3  #5  #7
> [    0.215011] smp: Brought up 1 node, 16 CPUs
> [    0.215011] smpboot: Total of 16 processors activated (79903.00 BogoMIPS)
> [    0.217482] Memory: 65276284K/66671508K available (18432K kernel code, 2185K rwdata, 13516K rodata, 3452K init, 3432K bss, 1370520K reserved, 0K cma-reserved)
> [    0.218690] devtmpfs: initialized
> [    0.218690] x86/mm: Memory block size: 2048MB
> [    0.218690] ACPI: PM: Registering ACPI NVS region [mem 0x56d49000-0x56ecefff] (1597440 bytes)
> [    0.218690] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 6370867519511994 ns
> [    0.218690] futex hash table entries: 4096 (order: 6, 262144 bytes, linear)
> [    0.218690] pinctrl core: initialized pinctrl subsystem
> [    0.218690] PM: RTC time: 15:43:42, date: 2024-09-17
> [    0.218690] NET: Registered PF_NETLINK/PF_ROUTE protocol family
> [    0.218690] DMA: preallocated 4096 KiB GFP_KERNEL pool for atomic allocations
> [    0.218815] DMA: preallocated 4096 KiB GFP_KERNEL|GFP_DMA pool for atomic allocations
> [    0.220935] DMA: preallocated 4096 KiB GFP_KERNEL|GFP_DMA32 pool for atomic allocations
> [    0.220946] audit: initializing netlink subsys (disabled)
> [    0.220955] audit: type=2000 audit(1726587822.023:1): state=initialized audit_enabled=0 res=1
> [    0.220955] thermal_sys: Registered thermal governor 'fair_share'
> [    0.220955] thermal_sys: Registered thermal governor 'bang_bang'
> [    0.220955] thermal_sys: Registered thermal governor 'step_wise'
> [    0.220955] thermal_sys: Registered thermal governor 'user_space'
> [    0.220955] thermal_sys: Registered thermal governor 'power_allocator'
> [    0.220955] cpuidle: using governor ladder
> [    0.220955] cpuidle: using governor menu
> [    0.220955] acpiphp: ACPI Hot Plug PCI Controller Driver version: 0.5
> [    0.220955] PCI: ECAM [mem 0xc0000000-0xcfffffff] (base 0xc0000000) for domain 0000 [bus 00-ff]
> [    0.220955] PCI: Using configuration type 1 for base access
> [    0.220955] kprobes: kprobe jump-optimization is enabled. All kprobes are optimized if possible.
> [    0.224191] HugeTLB: registered 1.00 GiB page size, pre-allocated 0 pages
> [    0.224191] HugeTLB: 16380 KiB vmemmap can be freed for a 1.00 GiB page
> [    0.224191] HugeTLB: registered 2.00 MiB page size, pre-allocated 0 pages
> [    0.224191] HugeTLB: 28 KiB vmemmap can be freed for a 2.00 MiB page
> [    0.224500] ACPI: Added _OSI(Module Device)
> [    0.224500] ACPI: Added _OSI(Processor Device)
> [    0.224500] ACPI: Added _OSI(3.0 _SCP Extensions)
> [    0.224500] ACPI: Added _OSI(Processor Aggregator Device)
> [    0.312844] ACPI: 14 ACPI AML tables successfully acquired and loaded
> [    0.336673] ACPI: USB4 _OSC: OS supports USB3+ DisplayPort+ PCIe+ XDomain+
> [    0.336675] ACPI: USB4 _OSC: OS controls USB3+ DisplayPort+ PCIe+ XDomain+
> [    0.338150] ACPI: Dynamic OEM Table Load:
> [    0.338158] ACPI: SSDT 0xFFFF9118C178D400 000394 (v02 PmRef  Cpu0Cst  00003001 INTL 20200717)
> [    0.339255] ACPI: Dynamic OEM Table Load:
> [    0.339260] ACPI: SSDT 0xFFFF9118C1798000 0005E4 (v02 PmRef  Cpu0Ist  00003000 INTL 20200717)
> [    0.340384] ACPI: Dynamic OEM Table Load:
> [    0.340388] ACPI: SSDT 0xFFFF9118C2101200 0001AB (v02 PmRef  Cpu0Psd  00003000 INTL 20200717)
> [    0.341453] ACPI: Dynamic OEM Table Load:
> [    0.341457] ACPI: SSDT 0xFFFF9118C179B000 0004BA (v02 PmRef  Cpu0Hwp  00003000 INTL 20200717)
> [    0.342940] ACPI: Dynamic OEM Table Load:
> [    0.342947] ACPI: SSDT 0xFFFF9118C1784000 001BAF (v02 PmRef  ApIst    00003000 INTL 20200717)
> [    0.344827] ACPI: Dynamic OEM Table Load:
> [    0.344833] ACPI: SSDT 0xFFFF9118C1780000 001038 (v02 PmRef  ApHwp    00003000 INTL 20200717)
> [    0.346435] ACPI: Dynamic OEM Table Load:
> [    0.346441] ACPI: SSDT 0xFFFF9118C21C6000 001349 (v02 PmRef  ApPsd    00003000 INTL 20200717)
> [    0.347383] ACPI: Dynamic OEM Table Load:
> [    0.347383] ACPI: SSDT 0xFFFF9118C1797000 000FBB (v02 PmRef  ApCst    00003000 INTL 20200717)
> [    0.351835] ACPI: EC: EC started
> [    0.351836] ACPI: EC: interrupt blocked
> [    0.352497] ACPI: EC: EC_CMD/EC_SC=0x66, EC_DATA=0x62
> [    0.352499] ACPI: \_SB_.PC00.LPCB.EC0_: Boot DSDT EC used to handle transactions
> [    0.352501] ACPI: Interpreter enabled
> [    0.352548] ACPI: PM: (supports S0 S3 S4 S5)
> [    0.352549] ACPI: Using IOAPIC for interrupt routing
> [    0.353800] PCI: Using host bridge windows from ACPI; if necessary, use "pci=nocrs" and report a bug
> [    0.353801] PCI: Ignoring E820 reservations for host bridge windows
> [    0.355184] ACPI: Enabled 7 GPEs in block 00 to 7F
> [    0.357600] ACPI: \_SB_.PC00.PEG0.PXP_: New power resource
> [    0.373986] ACPI: \_SB_.PC00.XHCI.RHUB.HS10.BTRT: New power resource
> [    0.374768] ACPI: \_SB_.PC00.PAUD: New power resource
> [    0.383767] ACPI: \_SB_.PC00.CNVW.WRST: New power resource
> [    0.392041] ACPI: \_SB_.PC00.TBT0: New power resource
> [    0.392349] ACPI: \_SB_.PC00.TBT1: New power resource
> [    0.392651] ACPI: \_SB_.PC00.D3C_: New power resource
> [    0.683890] ACPI: \_TZ_.FN00: New power resource
> [    0.683946] ACPI: \_TZ_.FN01: New power resource
> [    0.684000] ACPI: \_TZ_.FN02: New power resource
> [    0.684056] ACPI: \_TZ_.FN03: New power resource
> [    0.684110] ACPI: \_TZ_.FN04: New power resource
> [    0.684638] ACPI: \PIN_: New power resource
> [    0.685242] ACPI: PCI Root Bridge [PC00] (domain 0000 [bus 00-fe])
> [    0.685248] acpi PNP0A08:00: _OSC: OS supports [ExtendedConfig ASPM ClockPM Segments MSI EDR HPX-Type3]
> [    0.686937] acpi PNP0A08:00: _OSC: platform does not support [AER]
> [    0.690313] acpi PNP0A08:00: _OSC: OS now controls [PCIeHotplug SHPCHotplug PME PCIeCapability LTR DPC]
> [    0.692570] PCI host bridge to bus 0000:00
> [    0.692573] pci_bus 0000:00: root bus resource [io  0x0000-0x0cf7 window]
> [    0.692575] pci_bus 0000:00: root bus resource [io  0x0d00-0xffff window]
> [    0.692576] pci_bus 0000:00: root bus resource [mem 0x000a0000-0x000bffff window]
> [    0.692578] pci_bus 0000:00: root bus resource [mem 0x000e0000-0x000fffff window]
> [    0.692579] pci_bus 0000:00: root bus resource [mem 0x68800000-0xbfffffff window]
> [    0.692580] pci_bus 0000:00: root bus resource [mem 0x4000000000-0x7fffffffff window]
> [    0.692581] pci_bus 0000:00: root bus resource [bus 00-fe]
> [    0.692868] pci 0000:00:00.0: [8086:4621] type 00 class 0x060000 conventional PCI endpoint
> [    0.693054] pci 0000:00:02.0: [8086:46a6] type 00 class 0x030000 PCIe Root Complex Integrated Endpoint
> [    0.693062] pci 0000:00:02.0: BAR 0 [mem 0x603c000000-0x603cffffff 64bit]
> [    0.693067] pci 0000:00:02.0: BAR 2 [mem 0x4000000000-0x400fffffff 64bit pref]
> [    0.693070] pci 0000:00:02.0: BAR 4 [io  0x3000-0x303f]
> [    0.693084] pci 0000:00:02.0: DMAR: Skip IOMMU disabling for graphics
> [    0.693086] pci 0000:00:02.0: Video device with shadowed ROM at [mem 0x000c0000-0x000dffff]
> [    0.693109] pci 0000:00:02.0: VF BAR 0 [mem 0x00000000-0x00ffffff 64bit]
> [    0.693110] pci 0000:00:02.0: VF BAR 0 [mem 0x00000000-0x06ffffff 64bit]: contains BAR 0 for 7 VFs
> [    0.693114] pci 0000:00:02.0: VF BAR 2 [mem 0x00000000-0x1fffffff 64bit pref]
> [    0.693115] pci 0000:00:02.0: VF BAR 2 [mem 0x00000000-0xdfffffff 64bit pref]: contains BAR 2 for 7 VFs
> [    0.693336] pci 0000:00:06.0: [8086:464d] type 01 class 0x060400 PCIe Root Port
> [    0.693379] pci 0000:00:06.0: PCI bridge to [bus 01]
> [    0.693412] pci 0000:00:06.0:   bridge window [mem 0x84600000-0x846fffff]
> [    0.693547] pci 0000:00:06.0: PME# supported from D0 D3hot D3cold
> [    0.693596] pci 0000:00:06.0: PTM enabled (root), 4ns granularity
> [    0.694331] pci 0000:00:07.0: [8086:466e] type 01 class 0x060400 PCIe Root Port
> [    0.694351] pci 0000:00:07.0: PCI bridge to [bus 02-39]
> [    0.694355] pci 0000:00:07.0:   bridge window [mem 0x78000000-0x841fffff]
> [    0.694361] pci 0000:00:07.0:   bridge window [mem 0x6020000000-0x603bffffff 64bit pref]
> [    0.694383] pci 0000:00:07.0: Overriding RP PIO Log Size to 4
> [    0.694445] pci 0000:00:07.0: PME# supported from D0 D3hot D3cold
> [    0.694469] pci 0000:00:07.0: PTM enabled (root), 4ns granularity
> [    0.696553] pci 0000:00:07.2: [8086:462f] type 01 class 0x060400 PCIe Root Port
> [    0.696570] pci 0000:00:07.2: PCI bridge to [bus 3a-63]
> [    0.696574] pci 0000:00:07.2:   bridge window [mem 0x6a000000-0x761fffff]
> [    0.696580] pci 0000:00:07.2:   bridge window [mem 0x6000000000-0x601bffffff 64bit pref]
> [    0.696602] pci 0000:00:07.2: Overriding RP PIO Log Size to 4
> [    0.696664] pci 0000:00:07.2: PME# supported from D0 D3hot D3cold
> [    0.696688] pci 0000:00:07.2: PTM enabled (root), 4ns granularity
> [    0.698832] pci 0000:00:08.0: [8086:464f] type 00 class 0x088000 conventional PCI endpoint
> [    0.698840] pci 0000:00:08.0: BAR 0 [mem 0x603d1bb000-0x603d1bbfff 64bit]
> [    0.698934] pci 0000:00:0a.0: [8086:467d] type 00 class 0x118000 PCIe Root Complex Integrated Endpoint
> [    0.698941] pci 0000:00:0a.0: BAR 0 [mem 0x603d1a0000-0x603d1a7fff 64bit]
> [    0.698958] pci 0000:00:0a.0: enabling Extended Tags
> [    0.699060] pci 0000:00:0d.0: [8086:461e] type 00 class 0x0c0330 conventional PCI endpoint
> [    0.699069] pci 0000:00:0d.0: BAR 0 [mem 0x603d190000-0x603d19ffff 64bit]
> [    0.699109] pci 0000:00:0d.0: PME# supported from D3hot D3cold
> [    0.701032] pci 0000:00:0d.2: [8086:463e] type 00 class 0x0c0340 conventional PCI endpoint
> [    0.701045] pci 0000:00:0d.2: BAR 0 [mem 0x603d140000-0x603d17ffff 64bit]
> [    0.701051] pci 0000:00:0d.2: BAR 2 [mem 0x603d1ba000-0x603d1bafff 64bit]
> [    0.701083] pci 0000:00:0d.2: supports D1 D2
> [    0.701084] pci 0000:00:0d.2: PME# supported from D0 D1 D2 D3hot D3cold
> [    0.701215] pci 0000:00:0d.3: [8086:466d] type 00 class 0x0c0340 conventional PCI endpoint
> [    0.701225] pci 0000:00:0d.3: BAR 0 [mem 0x603d100000-0x603d13ffff 64bit]
> [    0.701231] pci 0000:00:0d.3: BAR 2 [mem 0x603d1b9000-0x603d1b9fff 64bit]
> [    0.701260] pci 0000:00:0d.3: supports D1 D2
> [    0.701261] pci 0000:00:0d.3: PME# supported from D0 D1 D2 D3hot D3cold
> [    0.701532] pci 0000:00:14.0: [8086:51ed] type 00 class 0x0c0330 conventional PCI endpoint
> [    0.701555] pci 0000:00:14.0: BAR 0 [mem 0x603d180000-0x603d18ffff 64bit]
> [    0.701655] pci 0000:00:14.0: PME# supported from D3hot D3cold
> [    0.703595] pci 0000:00:14.2: [8086:51ef] type 00 class 0x050000 conventional PCI endpoint
> [    0.703617] pci 0000:00:14.2: BAR 0 [mem 0x603d1b0000-0x603d1b3fff 64bit]
> [    0.703631] pci 0000:00:14.2: BAR 2 [mem 0x603d1b8000-0x603d1b8fff 64bit]
> [    0.703850] pci 0000:00:14.3: [8086:51f0] type 00 class 0x028000 PCIe Root Complex Integrated Endpoint
> [    0.703912] pci 0000:00:14.3: BAR 0 [mem 0x603d1ac000-0x603d1affff 64bit]
> [    0.707442] pci 0000:00:14.3: PME# supported from D0 D3hot D3cold
> [    0.708349] pci 0000:00:15.0: [8086:51e8] type 00 class 0x0c8000 conventional PCI endpoint
> [    0.709079] pci 0000:00:15.0: BAR 0 [mem 0x00000000-0x00000fff 64bit]
> [    0.712769] pci 0000:00:15.1: [8086:51e9] type 00 class 0x0c8000 conventional PCI endpoint
> [    0.713499] pci 0000:00:15.1: BAR 0 [mem 0x00000000-0x00000fff 64bit]
> [    0.716748] pci 0000:00:16.0: [8086:51e0] type 00 class 0x078000 conventional PCI endpoint
> [    0.716773] pci 0000:00:16.0: BAR 0 [mem 0x603d1b5000-0x603d1b5fff 64bit]
> [    0.716868] pci 0000:00:16.0: PME# supported from D3hot
> [    0.717491] pci 0000:00:17.0: [8086:51d3] type 00 class 0x010601 conventional PCI endpoint
> [    0.717511] pci 0000:00:17.0: BAR 0 [mem 0x84700000-0x84701fff]
> [    0.717522] pci 0000:00:17.0: BAR 1 [mem 0x84703000-0x847030ff]
> [    0.717533] pci 0000:00:17.0: BAR 2 [io  0x3090-0x3097]
> [    0.717543] pci 0000:00:17.0: BAR 3 [io  0x3080-0x3083]
> [    0.717554] pci 0000:00:17.0: BAR 4 [io  0x3060-0x307f]
> [    0.717564] pci 0000:00:17.0: BAR 5 [mem 0x84702000-0x847027ff]
> [    0.717645] pci 0000:00:17.0: PME# supported from D3hot
> [    0.718046] pci 0000:00:1d.0: [8086:51b0] type 01 class 0x060400 PCIe Root Port
> [    0.718078] pci 0000:00:1d.0: PCI bridge to [bus 64]
> [    0.718084] pci 0000:00:1d.0:   bridge window [mem 0x84400000-0x845fffff]
> [    0.718173] pci 0000:00:1d.0: PME# supported from D0 D3hot D3cold
> [    0.718212] pci 0000:00:1d.0: PTM enabled (root), 4ns granularity
> [    0.718877] pci 0000:00:1d.2: [8086:51b2] type 01 class 0x060400 PCIe Root Port
> [    0.718909] pci 0000:00:1d.2: PCI bridge to [bus 65]
> [    0.718915] pci 0000:00:1d.2:   bridge window [mem 0x84200000-0x843fffff]
> [    0.719004] pci 0000:00:1d.2: PME# supported from D0 D3hot D3cold
> [    0.719043] pci 0000:00:1d.2: PTM enabled (root), 4ns granularity
> [    0.719752] pci 0000:00:1f.0: [8086:5182] type 00 class 0x060100 conventional PCI endpoint
> [    0.720154] pci 0000:00:1f.3: [8086:51c8] type 00 class 0x040100 conventional PCI endpoint
> [    0.720216] pci 0000:00:1f.3: BAR 0 [mem 0x603d1a8000-0x603d1abfff 64bit]
> [    0.720290] pci 0000:00:1f.3: BAR 4 [mem 0x603d000000-0x603d0fffff 64bit]
> [    0.720451] pci 0000:00:1f.3: PME# supported from D3hot D3cold
> [    0.721057] pci 0000:00:1f.4: [8086:51a3] type 00 class 0x0c0500 conventional PCI endpoint
> [    0.721086] pci 0000:00:1f.4: BAR 0 [mem 0x603d1b4000-0x603d1b40ff 64bit]
> [    0.721112] pci 0000:00:1f.4: BAR 4 [io  0xefa0-0xefbf]
> [    0.721397] pci 0000:00:1f.5: [8086:51a4] type 00 class 0x0c8000 conventional PCI endpoint
> [    0.721419] pci 0000:00:1f.5: BAR 0 [mem 0xfe010000-0xfe010fff]
> [    0.722353] pci 0000:01:00.0: [15b7:5030] type 00 class 0x010802 PCIe Endpoint
> [    0.722365] pci 0000:01:00.0: BAR 0 [mem 0x84600000-0x84603fff 64bit]
> [    0.722554] pci 0000:00:06.0: PCI bridge to [bus 01]
> [    0.722587] pci 0000:00:07.0: PCI bridge to [bus 02-39]
> [    0.722619] pci 0000:00:07.2: PCI bridge to [bus 3a-63]
> [    0.722800] pci 0000:64:00.0: [8086:15f3] type 00 class 0x020000 PCIe Endpoint
> [    0.722819] pci 0000:64:00.0: BAR 0 [mem 0x84400000-0x844fffff]
> [    0.722844] pci 0000:64:00.0: BAR 3 [mem 0x84500000-0x84503fff]
> [    0.722977] pci 0000:64:00.0: PME# supported from D0 D3hot D3cold
> [    0.723313] pci 0000:00:1d.0: PCI bridge to [bus 64]
> [    0.723788] pci 0000:65:00.0: [8086:125c] type 00 class 0x020000 PCIe Endpoint
> [    0.723806] pci 0000:65:00.0: BAR 0 [mem 0x84200000-0x842fffff]
> [    0.723831] pci 0000:65:00.0: BAR 3 [mem 0x84300000-0x84303fff]
> [    0.723963] pci 0000:65:00.0: PME# supported from D0 D3hot D3cold
> [    0.724773] pci 0000:00:1d.2: PCI bridge to [bus 65]
> [    0.731129] ACPI: PCI: Interrupt link LNKA configured for IRQ 0
> [    0.731229] ACPI: PCI: Interrupt link LNKB configured for IRQ 1
> [    0.731327] ACPI: PCI: Interrupt link LNKC configured for IRQ 0
> [    0.731425] ACPI: PCI: Interrupt link LNKD configured for IRQ 0
> [    0.731523] ACPI: PCI: Interrupt link LNKE configured for IRQ 0
> [    0.731621] ACPI: PCI: Interrupt link LNKF configured for IRQ 0
> [    0.731719] ACPI: PCI: Interrupt link LNKG configured for IRQ 0
> [    0.731816] ACPI: PCI: Interrupt link LNKH configured for IRQ 0
> [    1.109516] Low-power S0 idle used by default for system suspend
> [    1.116947] ACPI: EC: interrupt unblocked
> [    1.116948] ACPI: EC: event unblocked
> [    1.116974] ACPI: EC: EC_CMD/EC_SC=0x66, EC_DATA=0x62
> [    1.116975] ACPI: EC: GPE=0x6e
> [    1.116977] ACPI: \_SB_.PC00.LPCB.EC0_: Boot DSDT EC initialization complete
> [    1.116978] ACPI: \_SB_.PC00.LPCB.EC0_: EC: Used to handle transactions and events
> [    1.117430] iommu: Default domain type: Translated
> [    1.117430] iommu: DMA domain TLB invalidation policy: lazy mode
> [    1.117501] SCSI subsystem initialized
> [    1.117507] libata version 3.00 loaded.
> [    1.117507] ACPI: bus type USB registered
> [    1.117507] usbcore: registered new interface driver usbfs
> [    1.117507] usbcore: registered new interface driver hub
> [    1.117507] usbcore: registered new device driver usb
> [    1.117507] EDAC MC: Ver: 3.0.0
> [    1.120822] efivars: Registered efivars operations
> [    1.120945] NetLabel: Initializing
> [    1.120946] NetLabel:  domain hash size = 128
> [    1.120947] NetLabel:  protocols = UNLABELED CIPSOv4 CALIPSO
> [    1.120965] NetLabel:  unlabeled traffic allowed by default
> [    1.120970] mctp: management component transport protocol core
> [    1.120971] NET: Registered PF_MCTP protocol family
> [    1.120974] PCI: Using ACPI for IRQ routing
> [    1.188171] PCI: pci_cache_line_size set to 64 bytes
> [    1.189575] pci 0000:00:1f.5: BAR 0 [mem 0xfe010000-0xfe010fff]: can't claim; no compatible bridge window
> [    1.190227] e820: reserve RAM buffer [mem 0x0009e000-0x0009ffff]
> [    1.190229] e820: reserve RAM buffer [mem 0x43ea7000-0x43ffffff]
> [    1.190230] e820: reserve RAM buffer [mem 0x444e6000-0x47ffffff]
> [    1.190231] e820: reserve RAM buffer [mem 0x4dd46000-0x4fffffff]
> [    1.190232] e820: reserve RAM buffer [mem 0x5a800000-0x5bffffff]
> [    1.190233] e820: reserve RAM buffer [mem 0x1097800000-0x1097ffffff]
> [    1.190766] pci 0000:00:02.0: vgaarb: setting as boot VGA device
> [    1.190766] pci 0000:00:02.0: vgaarb: bridge control possible
> [    1.190766] pci 0000:00:02.0: vgaarb: VGA device added: decodes=io+mem,owns=io+mem,locks=none
> [    1.190766] vgaarb: loaded
> [    1.190802] clocksource: Switched to clocksource tsc-early
> [    1.191172] VFS: Disk quotas dquot_6.6.0
> [    1.191181] VFS: Dquot-cache hash table entries: 512 (order 0, 4096 bytes)
> [    1.191242] pnp: PnP ACPI init
> [    1.191703] system 00:00: [io  0x0a00-0x0a0f] has been reserved
> [    1.191706] system 00:00: [io  0x0a10-0x0a2f] has been reserved
> [    1.191707] system 00:00: [io  0x0a30-0x0a4f] has been reserved
> [    1.191708] system 00:00: [io  0x0a50-0x0a6f] has been reserved
> [    1.191709] system 00:00: [io  0x0a70-0x0a7f] has been reserved
> [    1.191710] system 00:00: [io  0x0a80-0x0a8f] has been reserved
> [    1.191832] system 00:01: [io  0x0680-0x069f] has been reserved
> [    1.191834] system 00:01: [io  0x164e-0x164f] has been reserved
> [    1.191943] system 00:02: [io  0x1854-0x1857] has been reserved
> [    1.192669] pnp 00:03: disabling [mem 0xc0000000-0xcfffffff] because it overlaps 0000:00:02.0 BAR 9 [mem 0x00000000-0xdfffffff 64bit pref]
> [    1.192693] system 00:03: [mem 0xfedc0000-0xfedc7fff] has been reserved
> [    1.192694] system 00:03: [mem 0xfeda0000-0xfeda0fff] has been reserved
> [    1.192696] system 00:03: [mem 0xfeda1000-0xfeda1fff] has been reserved
> [    1.192697] system 00:03: [mem 0xfed20000-0xfed7ffff] could not be reserved
> [    1.192698] system 00:03: [mem 0xfed90000-0xfed93fff] could not be reserved
> [    1.192699] system 00:03: [mem 0xfed45000-0xfed8ffff] could not be reserved
> [    1.192700] system 00:03: [mem 0xfee00000-0xfeefffff] could not be reserved
> [    1.195625] system 00:04: [io  0x2000-0x20fe] has been reserved
> [    1.196381] pnp: PnP ACPI: found 6 devices
> [    1.201970] clocksource: acpi_pm: mask: 0xffffff max_cycles: 0xffffff, max_idle_ns: 2085701024 ns
> [    1.202017] NET: Registered PF_INET protocol family
> [    1.202177] IP idents hash table entries: 262144 (order: 9, 2097152 bytes, linear)
> [    1.215397] tcp_listen_portaddr_hash hash table entries: 32768 (order: 7, 524288 bytes, linear)
> [    1.215446] Table-perturb hash table entries: 65536 (order: 6, 262144 bytes, linear)
> [    1.215777] TCP established hash table entries: 524288 (order: 10, 4194304 bytes, linear)
> [    1.216299] TCP bind hash table entries: 65536 (order: 9, 2097152 bytes, linear)
> [    1.216406] TCP: Hash tables configured (established 524288 bind 65536)
> [    1.216608] MPTCP token hash table entries: 65536 (order: 8, 1572864 bytes, linear)
> [    1.216758] UDP hash table entries: 32768 (order: 8, 1048576 bytes, linear)
> [    1.216899] UDP-Lite hash table entries: 32768 (order: 8, 1048576 bytes, linear)
> [    1.217011] NET: Registered PF_UNIX/PF_LOCAL protocol family
> [    1.217017] NET: Registered PF_XDP protocol family
> [    1.217024] pci 0000:00:07.0: bridge window [io  0x1000-0x0fff] to [bus 02-39] add_size 1000
> [    1.217028] pci 0000:00:07.2: bridge window [io  0x1000-0x0fff] to [bus 3a-63] add_size 1000
> [    1.217038] pci 0000:00:02.0: VF BAR 2 [mem 0x4020000000-0x40ffffffff 64bit pref]: assigned
> [    1.217042] pci 0000:00:02.0: VF BAR 0 [mem 0x4010000000-0x4016ffffff 64bit]: assigned
> [    1.217045] pci 0000:00:07.0: bridge window [io  0x4000-0x4fff]: assigned
> [    1.217047] pci 0000:00:07.2: bridge window [io  0x5000-0x5fff]: assigned
> [    1.217049] pci 0000:00:15.0: BAR 0 [mem 0x4017000000-0x4017000fff 64bit]: assigned
> [    1.217395] pci 0000:00:15.1: BAR 0 [mem 0x4017001000-0x4017001fff 64bit]: assigned
> [    1.217735] pci 0000:00:1f.5: BAR 0 [mem 0x68800000-0x68800fff]: assigned
> [    1.217752] pci 0000:00:06.0: PCI bridge to [bus 01]
> [    1.217777] pci 0000:00:06.0:   bridge window [mem 0x84600000-0x846fffff]
> [    1.217810] pci 0000:00:07.0: PCI bridge to [bus 02-39]
> [    1.217812] pci 0000:00:07.0:   bridge window [io  0x4000-0x4fff]
> [    1.217814] pci 0000:00:07.0:   bridge window [mem 0x78000000-0x841fffff]
> [    1.217817] pci 0000:00:07.0:   bridge window [mem 0x6020000000-0x603bffffff 64bit pref]
> [    1.217820] pci 0000:00:07.2: PCI bridge to [bus 3a-63]
> [    1.217821] pci 0000:00:07.2:   bridge window [io  0x5000-0x5fff]
> [    1.217824] pci 0000:00:07.2:   bridge window [mem 0x6a000000-0x761fffff]
> [    1.217826] pci 0000:00:07.2:   bridge window [mem 0x6000000000-0x601bffffff 64bit pref]
> [    1.217830] pci 0000:00:1d.0: PCI bridge to [bus 64]
> [    1.217848] pci 0000:00:1d.0:   bridge window [mem 0x84400000-0x845fffff]
> [    1.217855] pci 0000:00:1d.2: PCI bridge to [bus 65]
> [    1.217859] pci 0000:00:1d.2:   bridge window [mem 0x84200000-0x843fffff]
> [    1.217867] pci_bus 0000:00: resource 4 [io  0x0000-0x0cf7 window]
> [    1.217868] pci_bus 0000:00: resource 5 [io  0x0d00-0xffff window]
> [    1.217869] pci_bus 0000:00: resource 6 [mem 0x000a0000-0x000bffff window]
> [    1.217871] pci_bus 0000:00: resource 7 [mem 0x000e0000-0x000fffff window]
> [    1.217872] pci_bus 0000:00: resource 8 [mem 0x68800000-0xbfffffff window]
> [    1.217873] pci_bus 0000:00: resource 9 [mem 0x4000000000-0x7fffffffff window]
> [    1.217874] pci_bus 0000:01: resource 1 [mem 0x84600000-0x846fffff]
> [    1.217875] pci_bus 0000:02: resource 0 [io  0x4000-0x4fff]
> [    1.217876] pci_bus 0000:02: resource 1 [mem 0x78000000-0x841fffff]
> [    1.217877] pci_bus 0000:02: resource 2 [mem 0x6020000000-0x603bffffff 64bit pref]
> [    1.217878] pci_bus 0000:3a: resource 0 [io  0x5000-0x5fff]
> [    1.217879] pci_bus 0000:3a: resource 1 [mem 0x6a000000-0x761fffff]
> [    1.217880] pci_bus 0000:3a: resource 2 [mem 0x6000000000-0x601bffffff 64bit pref]
> [    1.217881] pci_bus 0000:64: resource 1 [mem 0x84400000-0x845fffff]
> [    1.217883] pci_bus 0000:65: resource 1 [mem 0x84200000-0x843fffff]
> [    1.219810] PCI: CLS 64 bytes, default 64
> [    1.219841] DMAR: Intel-IOMMU force enabled due to platform opt in
> [    1.219847] DMAR: No ATSR found
> [    1.219848] DMAR: No SATC found
> [    1.219849] DMAR: IOMMU feature fl1gp_support inconsistent
> [    1.219850] DMAR: IOMMU feature pgsel_inv inconsistent
> [    1.219851] DMAR: IOMMU feature nwfs inconsistent
> [    1.219851] DMAR: IOMMU feature dit inconsistent
> [    1.219852] DMAR: IOMMU feature sc_support inconsistent
> [    1.219853] DMAR: IOMMU feature dev_iotlb_support inconsistent
> [    1.219854] DMAR: dmar0: Using Queued invalidation
> [    1.219857] DMAR: dmar1: Using Queued invalidation
> [    1.219962] Trying to unpack rootfs image as initramfs...
> [    1.220076] pci 0000:00:02.0: Adding to iommu group 0
> [    1.220106] pci 0000:00:00.0: Adding to iommu group 1
> [    1.220117] pci 0000:00:06.0: Adding to iommu group 2
> [    1.220125] pci 0000:00:07.0: Adding to iommu group 3
> [    1.220133] pci 0000:00:07.2: Adding to iommu group 4
> [    1.220142] pci 0000:00:08.0: Adding to iommu group 5
> [    1.220150] pci 0000:00:0a.0: Adding to iommu group 6
> [    1.220165] pci 0000:00:0d.0: Adding to iommu group 7
> [    1.220172] pci 0000:00:0d.2: Adding to iommu group 7
> [    1.220178] pci 0000:00:0d.3: Adding to iommu group 7
> [    1.220192] pci 0000:00:14.0: Adding to iommu group 8
> [    1.220199] pci 0000:00:14.2: Adding to iommu group 8
> [    1.220206] pci 0000:00:14.3: Adding to iommu group 9
> [    1.220218] pci 0000:00:15.0: Adding to iommu group 10
> [    1.220226] pci 0000:00:15.1: Adding to iommu group 10
> [    1.220236] pci 0000:00:16.0: Adding to iommu group 11
> [    1.220243] pci 0000:00:17.0: Adding to iommu group 12
> [    1.220266] pci 0000:00:1d.0: Adding to iommu group 13
> [    1.220282] pci 0000:00:1d.2: Adding to iommu group 14
> [    1.220300] pci 0000:00:1f.0: Adding to iommu group 15
> [    1.220308] pci 0000:00:1f.3: Adding to iommu group 15
> [    1.220316] pci 0000:00:1f.4: Adding to iommu group 15
> [    1.220323] pci 0000:00:1f.5: Adding to iommu group 15
> [    1.220331] pci 0000:01:00.0: Adding to iommu group 16
> [    1.220354] pci 0000:64:00.0: Adding to iommu group 17
> [    1.220381] pci 0000:65:00.0: Adding to iommu group 18
> [    1.220523] DMAR: Intel(R) Virtualization Technology for Directed I/O
> [    1.220524] PCI-DMA: Using software bounce buffering for IO (SWIOTLB)
> [    1.220525] software IO TLB: mapped [mem 0x00000000359f8000-0x00000000399f8000] (64MB)
> [    1.220564] clocksource: tsc: mask: 0xffffffffffffffff max_cycles: 0x23fa772cf26, max_idle_ns: 440795269835 ns
> [    1.220616] clocksource: Switched to clocksource tsc
> [    1.220637] platform rtc_cmos: registered platform RTC device (no PNP device found)
> [    1.227245] Initialise system trusted keyrings
> [    1.227255] Key type blacklist registered
> [    1.227295] workingset: timestamp_bits=41 max_order=24 bucket_order=0
> [    1.227305] zbud: loaded
> [    1.227417] fuse: init (API version 7.40)
> [    1.227488] integrity: Platform Keyring initialized
> [    1.227490] integrity: Machine keyring initialized
> [    1.236155] Key type asymmetric registered
> [    1.236158] Asymmetric key parser 'x509' registered
> [    1.236181] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 246)
> [    1.236262] io scheduler mq-deadline registered
> [    1.236263] io scheduler kyber registered
> [    1.236272] io scheduler bfq registered
> [    1.236870] pcieport 0000:00:06.0: PME: Signaling with IRQ 122
> [    1.237101] pcieport 0000:00:07.0: PME: Signaling with IRQ 123
> [    1.237117] pcieport 0000:00:07.0: pciehp: Slot #3 AttnBtn- PwrCtrl- MRL- AttnInd- PwrInd- HotPlug+ Surprise+ Interlock- NoCompl+ IbPresDis- LLActRep+
> [    1.237433] pcieport 0000:00:07.2: PME: Signaling with IRQ 124
> [    1.237449] pcieport 0000:00:07.2: pciehp: Slot #5 AttnBtn- PwrCtrl- MRL- AttnInd- PwrInd- HotPlug+ Surprise+ Interlock- NoCompl+ IbPresDis- LLActRep+
> [    1.237758] pcieport 0000:00:1d.0: PME: Signaling with IRQ 125
> [    1.238027] pcieport 0000:00:1d.2: PME: Signaling with IRQ 126
> [    1.238133] shpchp: Standard Hot Plug PCI Controller Driver version: 0.4
> [    1.238900] input: Sleep Button as /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0E:00/input/input0
> [    1.238922] ACPI: button: Sleep Button [SLPB]
> [    1.238952] input: Power Button as /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0C:00/input/input1
> [    1.238963] ACPI: button: Power Button [PWRB]
> [    1.238982] input: Power Button as /devices/LNXSYSTM:00/LNXPWRBN:00/input/input2
> [    1.239063] ACPI: button: Power Button [PWRF]
> [    1.243545] thermal LNXTHERM:00: registered as thermal_zone0
> [    1.243547] ACPI: thermal: Thermal Zone [TZ00] (54 C)
> [    1.243835] Serial: 8250/16550 driver, 32 ports, IRQ sharing enabled
> [    1.245729] hpet_acpi_add: no address or irqs in _CRS
> [    1.245765] Non-volatile memory driver v1.3
> [    1.245766] Linux agpgart interface v0.103
> [    1.282118] ACPI: bus type drm_connector registered
> [    1.283317] Freeing initrd memory: 106196K
> [    1.284291] ahci 0000:00:17.0: version 3.0
> [    1.284668] ahci 0000:00:17.0: AHCI vers 0001.0301, 32 command slots, 6 Gbps, SATA mode
> [    1.284672] ahci 0000:00:17.0: 1/1 ports implemented (port mask 0x2)
> [    1.284673] ahci 0000:00:17.0: flags: 64bit ncq sntf pm clo only pio slum part deso sadm sds
> [    1.285087] scsi host0: ahci
> [    1.285169] scsi host1: ahci
> [    1.285197] ata1: DUMMY
> [    1.285212] ata2: SATA max UDMA/133 abar m2048 at 0x84702000 port 0x84702180 irq 127 lpm-pol 4
> [    1.285284] usbcore: registered new interface driver usbserial_generic
> [    1.285288] usbserial: USB Serial support registered for generic
> [    1.285358] rtc_cmos rtc_cmos: RTC can wake from S4
> [    1.287193] rtc_cmos rtc_cmos: registered as rtc0
> [    1.287570] rtc_cmos rtc_cmos: setting system clock to 2024-09-17T15:43:43 UTC (1726587823)
> [    1.287610] rtc_cmos rtc_cmos: alarms up to one month, y3k, 114 bytes nvram
> [    1.288735] intel_pstate: Intel P-state driver initializing
> [    1.290872] intel_pstate: HWP enabled
> [    1.291430] ledtrig-cpu: registered to indicate activity on CPUs
> [    1.291876] [drm] Initialized simpledrm 1.0.0 for simple-framebuffer.0 on minor 0
> [    1.292353] fbcon: Deferring console take-over
> [    1.292358] simple-framebuffer simple-framebuffer.0: [drm] fb0: simpledrmdrmfb frame buffer device
> [    1.292419] hid: raw HID events driver (C) Jiri Kosina
> [    1.292473] drop_monitor: Initializing network drop monitor service
> [    1.292567] NET: Registered PF_INET6 protocol family
> [    1.296692] Segment Routing with IPv6
> [    1.296693] RPL Segment Routing with IPv6
> [    1.296704] In-situ OAM (IOAM) with IPv6
> [    1.296720] NET: Registered PF_PACKET protocol family
> [    1.299178] ENERGY_PERF_BIAS: Set to 'normal', was 'performance'
> [    1.299835] microcode: Current revision: 0x00000434
> [    1.299839] microcode: Updated early from: 0x0000042a
> [    1.300531] IPI shorthand broadcast: enabled
> [    1.301773] sched_clock: Marking stable (1284914767, 15597475)->(1326242945, -25730703)
> [    1.302178] registered taskstats version 1
> [    1.303378] Loading compiled-in X.509 certificates
> [    1.306147] Loaded X.509 cert 'Build time autogenerated kernel key: cb8a38269e411cf2cea941e3c19d1521412bd34d'
> [    1.308962] zswap: loaded using pool zstd/zsmalloc
> [    1.309007] Demotion targets for Node 0: null
> [    1.309121] Key type .fscrypt registered
> [    1.309121] Key type fscrypt-provisioning registered
> [    1.309500] integrity: Loading X.509 certificate: UEFI:db
> [    1.309544] integrity: Loaded X.509 cert 'Microsoft Corporation UEFI CA 2011: 13adbf4309bd82709c8cd54f316ed522988a1bd4'
> [    1.309544] integrity: Loading X.509 certificate: UEFI:db
> [    1.309551] integrity: Loaded X.509 cert 'Microsoft Windows Production PCA 2011: a92902398e16c49778cd90f99e4f9ae17c55af53'
> [    1.309972] PM:   Magic number: 8:571:740
> [    1.311885] RAS: Correctable Errors collector initialized.
> [    1.599328] ata2: SATA link down (SStatus 4 SControl 300)
> [    1.601308] clk: Disabling unused clocks
> [    1.601325] PM: genpd: Disabling unused power domains
> [    1.609973] Freeing unused decrypted memory: 2028K
> [    1.610569] Freeing unused kernel image (initmem) memory: 3452K
> [    1.610578] Write protecting the kernel read-only data: 32768k
> [    1.611494] Freeing unused kernel image (rodata/data gap) memory: 820K
> [    1.616342] x86/mm: Checked W+X mappings: passed, no W+X pages found.
> [    1.616345] rodata_test: all tests were successful
> [    1.616356] Run /init as init process
> [    1.616357]   with arguments:
> [    1.616357]     /init
> [    1.616358]   with environment:
> [    1.616358]     HOME=/
> [    1.616359]     TERM=linux
> [    1.738727] xhci_hcd 0000:00:0d.0: xHCI Host Controller
> [    1.738738] xhci_hcd 0000:00:0d.0: new USB bus registered, assigned bus number 1
> [    1.739793] xhci_hcd 0000:00:0d.0: hcc params 0x20007fc1 hci version 0x120 quirks 0x0000000200009810
> [    1.740087] xhci_hcd 0000:00:0d.0: xHCI Host Controller
> [    1.740090] xhci_hcd 0000:00:0d.0: new USB bus registered, assigned bus number 2
> [    1.740093] xhci_hcd 0000:00:0d.0: Host supports USB 3.2 Enhanced SuperSpeed
> [    1.740135] usb usb1: New USB device found, idVendor=1d6b, idProduct=0002, bcdDevice= 6.11
> [    1.740139] usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
> [    1.740141] usb usb1: Product: xHCI Host Controller
> [    1.740142] usb usb1: Manufacturer: Linux 6.11.0-rc7-00001-g0e2ad6528188-dirty xhci-hcd
> [    1.740144] usb usb1: SerialNumber: 0000:00:0d.0
> [    1.740282] hub 1-0:1.0: USB hub found
> [    1.740289] hub 1-0:1.0: 1 port detected
> [    1.740533] usb usb2: New USB device found, idVendor=1d6b, idProduct=0003, bcdDevice= 6.11
> [    1.740535] usb usb2: New USB device strings: Mfr=3, Product=2, SerialNumber=1
> [    1.740537] usb usb2: Product: xHCI Host Controller
> [    1.740538] usb usb2: Manufacturer: Linux 6.11.0-rc7-00001-g0e2ad6528188-dirty xhci-hcd
> [    1.740539] usb usb2: SerialNumber: 0000:00:0d.0
> [    1.740628] hub 2-0:1.0: USB hub found
> [    1.740635] hub 2-0:1.0: 3 ports detected
> [    1.741581] xhci_hcd 0000:00:14.0: xHCI Host Controller
> [    1.741586] xhci_hcd 0000:00:14.0: new USB bus registered, assigned bus number 3
> [    1.742720] xhci_hcd 0000:00:14.0: hcc params 0x20007fc1 hci version 0x120 quirks 0x0000100200009810
> [    1.743083] xhci_hcd 0000:00:14.0: xHCI Host Controller
> [    1.743087] xhci_hcd 0000:00:14.0: new USB bus registered, assigned bus number 4
> [    1.743089] xhci_hcd 0000:00:14.0: Host supports USB 3.1 Enhanced SuperSpeed
> [    1.743129] usb usb3: New USB device found, idVendor=1d6b, idProduct=0002, bcdDevice= 6.11
> [    1.743131] usb usb3: New USB device strings: Mfr=3, Product=2, SerialNumber=1
> [    1.743132] usb usb3: Product: xHCI Host Controller
> [    1.743133] usb usb3: Manufacturer: Linux 6.11.0-rc7-00001-g0e2ad6528188-dirty xhci-hcd
> [    1.743134] usb usb3: SerialNumber: 0000:00:14.0
> [    1.743239] hub 3-0:1.0: USB hub found
> [    1.743267] hub 3-0:1.0: 12 ports detected
> [    1.745297] usb usb4: New USB device found, idVendor=1d6b, idProduct=0003, bcdDevice= 6.11
> [    1.745299] usb usb4: New USB device strings: Mfr=3, Product=2, SerialNumber=1
> [    1.745301] usb usb4: Product: xHCI Host Controller
> [    1.745302] usb usb4: Manufacturer: Linux 6.11.0-rc7-00001-g0e2ad6528188-dirty xhci-hcd
> [    1.745302] usb usb4: SerialNumber: 0000:00:14.0
> [    1.745388] hub 4-0:1.0: USB hub found
> [    1.745410] hub 4-0:1.0: 4 ports detected
> [    1.761523] nvme 0000:01:00.0: platform quirk: setting simple suspend
> [    1.761605] nvme nvme0: pci function 0000:01:00.0
> [    1.791467] nvme nvme0: 16/0/0 default/read/poll queues
> [    1.796102]  nvme0n1: p1 p2 p3
> [    1.992401] usb 3-4: new high-speed USB device number 2 using xhci_hcd
> [    2.134739] usb 3-4: New USB device found, idVendor=05e3, idProduct=0608, bcdDevice=88.32
> [    2.134746] usb 3-4: New USB device strings: Mfr=0, Product=1, SerialNumber=0
> [    2.134748] usb 3-4: Product: USB2.0 Hub
> [    2.136254] hub 3-4:1.0: USB hub found
> [    2.136751] hub 3-4:1.0: 4 ports detected
> [    2.137612] usb: port power management may be unreliable
> [    2.203731] usb 2-1: new SuperSpeed USB device number 2 using xhci_hcd
> [    2.237657] usb 2-1: New USB device found, idVendor=045e, idProduct=0955, bcdDevice= 1.41
> [    2.237662] usb 2-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
> [    2.237664] usb 2-1: Product: 4-Port USB 3.0 Hub
> [    2.237665] usb 2-1: Manufacturer: Generic
> [    2.245834] hub 2-1:1.0: USB hub found
> [    2.247480] hub 2-1:1.0: 2 ports detected
> [    2.255872] usb 4-1: new SuperSpeed USB device number 2 using xhci_hcd
> [    2.275009] usb 4-1: New USB device found, idVendor=0e8d, idProduct=7961, bcdDevice= 1.00
> [    2.275014] usb 4-1: New USB device strings: Mfr=6, Product=7, SerialNumber=8
> [    2.275015] usb 4-1: Product: Wireless_Device
> [    2.275017] usb 4-1: Manufacturer: MediaTek Inc.
> [    2.275018] usb 4-1: SerialNumber: 000000000
> [    2.395819] usb 3-6: new high-speed USB device number 3 using xhci_hcd
> [    2.469827] i915 0000:00:02.0: [drm] Found ALDERLAKE_P (device ID 46a6) display version 13.00
> [    2.470484] i915 0000:00:02.0: [drm] VT-d active for gfx access
> [    2.526904] i915 0000:00:02.0: vgaarb: deactivate vga console
> [    2.527166] i915 0000:00:02.0: [drm] Using Transparent Hugepages
> [    2.529267] i915 0000:00:02.0: vgaarb: VGA decodes changed: olddecodes=io+mem,decodes=io+mem:owns=io+mem
> [    2.534856] i915 0000:00:02.0: [drm] Finished loading DMC firmware i915/adlp_dmc.bin (v2.20)
> [    2.535899] usb 2-1.1: new SuperSpeed USB device number 3 using xhci_hcd
> [    2.557014] usb 3-6: New USB device found, idVendor=045e, idProduct=0957, bcdDevice= 1.41
> [    2.557029] usb 3-6: New USB device strings: Mfr=1, Product=2, SerialNumber=0
> [    2.557035] usb 3-6: Product: 4-Port USB 2.0 Hub
> [    2.557039] usb 3-6: Manufacturer: Generic
> [    2.557797] usb 2-1.1: New USB device found, idVendor=045e, idProduct=0927, bcdDevice=31.00
> [    2.557814] usb 2-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=6
> [    2.557819] usb 2-1.1: Product: Ethernet Adapter
> [    2.557823] usb 2-1.1: Manufacturer: Microsoft
> [    2.557826] usb 2-1.1: SerialNumber: 0013DF804
> [    2.561404] hub 3-6:1.0: USB hub found
> [    2.563028] hub 3-6:1.0: 2 ports detected
> [    2.645045] i915 0000:00:02.0: [drm] GT0: GuC firmware i915/adlp_guc_70.bin version 70.29.2
> [    2.645051] i915 0000:00:02.0: [drm] GT0: HuC firmware i915/tgl_huc.bin version 7.9.3
> [    2.659283] i915 0000:00:02.0: [drm] GT0: HuC: authenticated for all workloads
> [    2.660460] i915 0000:00:02.0: [drm] GT0: GUC: submission enabled
> [    2.660462] i915 0000:00:02.0: [drm] GT0: GUC: SLPC enabled
> [    2.661015] i915 0000:00:02.0: [drm] GT0: GUC: RC enabled
> [    2.662137] i915 0000:00:02.0: [drm] Protected Xe Path (PXP) protected content support initialized
> [    2.689226] usb 3-7: new full-speed USB device number 4 using xhci_hcd
> [    2.695739] [drm] Initialized i915 1.6.0 for 0000:00:02.0 on minor 1
> [    2.698285] ACPI: video: Video Device [GFX0] (multi-head: yes  rom: no  post: no)
> [    2.699207] input: Video Bus as /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/LNXVIDEO:00/input/input3
> [    2.737465] fbcon: i915drmfb (fb0) is primary device
> [    2.737467] fbcon: Deferring console take-over
> [    2.737468] i915 0000:00:02.0: [drm] fb0: i915drmfb frame buffer device
> [    2.835767] usb 3-7: New USB device found, idVendor=045e, idProduct=0800, bcdDevice= 9.34
> [    2.835772] usb 3-7: New USB device strings: Mfr=1, Product=2, SerialNumber=0
> [    2.835773] usb 3-7: Product: Microsoft? Nano Transceiver v2.0
> [    2.835775] usb 3-7: Manufacturer: Microsoft
> [    2.857652] usbcore: registered new interface driver usbhid
> [    2.857654] usbhid: USB HID core driver
> [    2.862052] input: Microsoft Microsoft? Nano Transceiver v2.0 as /devices/pci0000:00/0000:00:14.0/usb3/3-7/3-7:1.0/0003:045E:0800.0001/input/input4
> [    2.965962] hid-generic 0003:045E:0800.0001: input,hidraw0: USB HID v1.11 Keyboard [Microsoft Microsoft? Nano Transceiver v2.0] on usb-0000:00:14.0-7/input0
> [    2.968229] input: Microsoft Microsoft? Nano Transceiver v2.0 Mouse as /devices/pci0000:00/0000:00:14.0/usb3/3-7/3-7:1.1/0003:045E:0800.0002/input/input5
> [    2.968393] input: Microsoft Microsoft? Nano Transceiver v2.0 Consumer Control as /devices/pci0000:00/0000:00:14.0/usb3/3-7/3-7:1.1/0003:045E:0800.0002/input/input6
> [    2.968554] hid-generic 0003:045E:0800.0002: input,hidraw1: USB HID v1.11 Mouse [Microsoft Microsoft? Nano Transceiver v2.0] on usb-0000:00:14.0-7/input1
> [    2.968700] input: Microsoft Microsoft? Nano Transceiver v2.0 Consumer Control as /devices/pci0000:00/0000:00:14.0/usb3/3-7/3-7:1.2/0003:045E:0800.0003/input/input7
> [    3.022596] input: Microsoft Microsoft? Nano Transceiver v2.0 System Control as /devices/pci0000:00/0000:00:14.0/usb3/3-7/3-7:1.2/0003:045E:0800.0003/input/input9
> [    3.022920] hid-generic 0003:045E:0800.0003: input,hiddev96,hidraw2: USB HID v1.11 Device [Microsoft Microsoft? Nano Transceiver v2.0] on usb-0000:00:14.0-7/input2
> [    3.175304] PM: Image not found (code -22)
> [    3.196942] fbcon: Taking over console
> [    3.209556] Console: switching to colour frame buffer device 240x67
> [    3.308676] EXT4-fs (nvme0n1p2): mounted filesystem 0420afc7-4947-4e2e-a096-b607b8b7fd93 r/w with ordered data mode. Quota mode: none.
> [    3.367761] systemd[1]: systemd 256.6-1-arch running in system mode (+PAM +AUDIT -SELINUX -APPARMOR -IMA +SMACK +SECCOMP +GCRYPT +GNUTLS +OPENSSL +ACL +BLKID +CURL +ELFUTILS +FIDO2 +IDN2 -IDN +IPTC +KMOD +LIBCRYPTSETUP +LIBCRYPTSETUP_PLUGINS +LIBFDISK +PCRE2 +PWQUALITY +P11KIT +QRENCODE +TPM2 +BZIP2 +LZ4 +XZ +ZLIB +ZSTD +BPF_FRAMEWORK +XKBCOMMON +UTMP -SYSVINIT +LIBARCHIVE)
> [    3.367765] systemd[1]: Detected architecture x86-64.
> [    3.368553] systemd[1]: Hostname set to <mdp-archnuc>.
> [    3.611164] systemd[1]: bpf-restrict-fs: LSM BPF program attached
> [    3.699797] systemd[1]: Queued start job for default target Graphical Interface.
> [    3.753107] systemd[1]: Created slice Slice /system/dirmngr.
> [    3.753888] systemd[1]: Created slice Slice /system/getty.
> [    3.754461] systemd[1]: Created slice Slice /system/gpg-agent.
> [    3.755011] systemd[1]: Created slice Slice /system/gpg-agent-browser.
> [    3.755524] systemd[1]: Created slice Slice /system/gpg-agent-extra.
> [    3.755998] systemd[1]: Created slice Slice /system/gpg-agent-ssh.
> [    3.756450] systemd[1]: Created slice Slice /system/keyboxd.
> [    3.756684] systemd[1]: Created slice Slice /system/modprobe.
> [    3.756803] systemd[1]: Created slice Slice /system/systemd-fsck.
> [    3.756872] systemd[1]: Created slice User and Session Slice.
> [    3.756893] systemd[1]: Started Dispatch Password Requests to Console Directory Watch.
> [    3.756908] systemd[1]: Started Forward Password Requests to Wall Directory Watch.
> [    3.756982] systemd[1]: Set up automount Arbitrary Executable File Formats File System Automount Point.
> [    3.756989] systemd[1]: Expecting device /dev/disk/by-uuid/EF7B-A70B...
> [    3.756993] systemd[1]: Expecting device /dev/disk/by-uuid/efa73f2d-495d-448d-a0f0-dd425258b7e5...
> [    3.756999] systemd[1]: Reached target Local Encrypted Volumes.
> [    3.757005] systemd[1]: Reached target Login Prompts.
> [    3.757011] systemd[1]: Reached target Local Integrity Protected Volumes.
> [    3.757020] systemd[1]: Reached target Path Units.
> [    3.757027] systemd[1]: Reached target Remote File Systems.
> [    3.757031] systemd[1]: Reached target Slice Units.
> [    3.757043] systemd[1]: Reached target Local Verity Protected Volumes.
> [    3.757076] systemd[1]: Listening on Device-mapper event daemon FIFOs.
> [    3.760193] systemd[1]: Listening on Process Core Dump Socket.
> [    3.760919] systemd[1]: Listening on Credential Encryption/Decryption.
> [    3.761003] systemd[1]: Listening on Journal Socket (/dev/log).
> [    3.761058] systemd[1]: Listening on Journal Sockets.
> [    3.761093] systemd[1]: TPM PCR Measurements was skipped because of an unmet condition check (ConditionSecurity=measured-uki).
> [    3.761109] systemd[1]: Make TPM PCR Policy was skipped because of an unmet condition check (ConditionSecurity=measured-uki).
> [    3.761165] systemd[1]: Listening on udev Control Socket.
> [    3.761202] systemd[1]: Listening on udev Kernel Socket.
> [    3.762311] systemd[1]: Mounting Huge Pages File System...
> [    3.763074] systemd[1]: Mounting POSIX Message Queue File System...
> [    3.763792] systemd[1]: Mounting Kernel Debug File System...
> [    3.764350] systemd[1]: Mounting Kernel Trace File System...
> [    3.765317] systemd[1]: Starting Create List of Static Device Nodes...
> [    3.766158] systemd[1]: Starting Load Kernel Module configfs...
> [    3.766682] systemd[1]: Starting Load Kernel Module dm_mod...
> [    3.767934] systemd[1]: Starting Load Kernel Module drm...
> [    3.769088] systemd[1]: Starting Load Kernel Module fuse...
> [    3.770335] systemd[1]: Starting Load Kernel Module loop...
> [    3.770384] systemd[1]: File System Check on Root Device was skipped because of an unmet condition check (ConditionPathIsReadWrite=!/).
> [    3.770425] systemd[1]: Clear Stale Hibernate Storage Info was skipped because of an unmet condition check (ConditionPathExists=/sys/firmware/efi/efivars/HibernateLocation-8cf2644b-4b0b-428f-9387-6d876050dc67).
> [    3.772057] systemd[1]: Starting Journal Service...
> [    3.772971] systemd[1]: Starting Load Kernel Modules...
> [    3.772986] systemd[1]: TPM PCR Machine ID Measurement was skipped because of an unmet condition check (ConditionSecurity=measured-uki).
> [    3.773641] systemd[1]: Starting Remount Root and Kernel File Systems...
> [    3.773677] systemd[1]: Early TPM SRK Setup was skipped because of an unmet condition check (ConditionSecurity=measured-uki).
> [    3.774224] systemd[1]: Starting Load udev Rules from Credentials...
> [    3.774948] systemd[1]: Starting Coldplug All udev Devices...
> [    3.777379] systemd[1]: Mounted Huge Pages File System.
> [    3.777453] systemd[1]: Mounted POSIX Message Queue File System.
> [    3.777510] systemd[1]: Mounted Kernel Debug File System.
> [    3.777561] systemd[1]: Mounted Kernel Trace File System.
> [    3.777759] systemd[1]: Finished Create List of Static Device Nodes.
> [    3.777978] systemd[1]: modprobe at configfs.service: Deactivated successfully.
> [    3.778112] systemd[1]: Finished Load Kernel Module configfs.
> [    3.778286] systemd[1]: modprobe at drm.service: Deactivated successfully.
> [    3.778411] systemd[1]: Finished Load Kernel Module drm.
> [    3.778575] systemd[1]: modprobe at fuse.service: Deactivated successfully.
> [    3.778688] systemd[1]: Finished Load Kernel Module fuse.
> [    3.779305] systemd[1]: Mounting FUSE Control File System...
> [    3.780063] systemd[1]: Mounting Kernel Configuration File System...
> [    3.780929] systemd[1]: Starting Create Static Device Nodes in /dev gracefully...
> [    3.782976] systemd[1]: Finished Load udev Rules from Credentials.
> [    3.783391] loop: module loaded
> [    3.784044] systemd[1]: modprobe at loop.service: Deactivated successfully.
> [    3.784330] systemd[1]: Finished Load Kernel Module loop.
> [    3.785492] systemd[1]: Mounted FUSE Control File System.
> [    3.785629] systemd[1]: Mounted Kernel Configuration File System.
> [    3.785810] systemd-journald[395]: Collecting audit messages is disabled.
> [    3.798212] i2c_dev: i2c /dev entries driver
> [    3.799115] systemd[1]: Finished Load Kernel Modules.
> [    3.799850] systemd[1]: Starting Apply Kernel Variables...
> [    3.799991] device-mapper: uevent: version 1.0.3
> [    3.800058] device-mapper: ioctl: 4.48.0-ioctl (2023-03-01) initialised: dm-devel at lists.linux.dev
> [    3.800371] systemd[1]: modprobe at dm_mod.service: Deactivated successfully.
> [    3.800462] systemd[1]: Finished Load Kernel Module dm_mod.
> [    3.800633] systemd[1]: Repartition Root Disk was skipped because no trigger condition checks were met.
> [    3.805467] systemd[1]: Finished Create Static Device Nodes in /dev gracefully.
> [    3.806389] systemd[1]: Finished Apply Kernel Variables.
> [    3.806887] systemd[1]: Started Journal Service.
> [    3.832625] EXT4-fs (nvme0n1p2): re-mounted 0420afc7-4947-4e2e-a096-b607b8b7fd93 r/w. Quota mode: none.
> [    3.840126] systemd-journald[395]: Received client request to flush runtime journal.
> [    3.843896] Adding 67108860k swap on /swapfile.  Priority:-2 extents:86 across:334987260k SS
> [    3.946711] mc: Linux media interface: v0.10
> [    3.950655] mousedev: PS/2 mouse device common for all mice
> [    3.971833] resource: resource sanity check: requesting [mem 0x00000000fedc0000-0x00000000fedcffff], which spans more than pnp 00:03 [mem 0xfedc0000-0xfedc7fff]
> [    3.971839] caller igen6_probe+0x15e/0x7c0 [igen6_edac] mapping multiple BARs
> [    3.975353] EDAC MC0: Giving out device to module igen6_edac controller Intel_client_SoC MC#0: DEV 0000:00:00.0 (INTERRUPT)
> [    3.975402] EDAC MC1: Giving out device to module igen6_edac controller Intel_client_SoC MC#1: DEV 0000:00:00.0 (INTERRUPT)
> [    3.975427] EDAC igen6 MC0: HANDLING IBECC MEMORY ERROR
> [    3.975428] EDAC igen6 MC0: ADDR 0x7fffffffe0
> [    3.975454] intel_pmc_core INT33A1:00:  initialized
> [    3.975552] EDAC igen6 MC1: HANDLING IBECC MEMORY ERROR
> [    3.975556] EDAC igen6 MC1: ADDR 0x7fffffffe0
> [    3.976644] EDAC igen6: v2.5.1
> [    3.985687] videodev: Linux video capture interface: v2.00
> [    3.985762] pps_core: LinuxPPS API ver. 1 registered
> [    3.985765] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <giometti at linux.it>
> [    3.988981] input: PC Speaker as /devices/platform/pcspkr/input/input10
> [    3.996243] PTP clock support registered
> [    3.999181] mei_me 0000:00:16.0: enabling device (0000 -> 0002)
> [    4.000730] i801_smbus 0000:00:1f.4: enabling device (0000 -> 0003)
> [    4.001128] i801_smbus 0000:00:1f.4: SPD Write Disable is set
> [    4.001184] i801_smbus 0000:00:1f.4: SMBus using PCI interrupt
> [    4.004969] i2c i2c-13: Successfully instantiated SPD at 0x50
> [    4.008414] intel-lpss 0000:00:15.0: enabling device (0004 -> 0006)
> [    4.008861] idma64 idma64.0: Found Intel integrated DMA 64-bit
> [    4.027139] Serial bus multi instantiate pseudo device driver INT3515:00: error -ENXIO: IRQ index 1 not found
> [    4.027145] Serial bus multi instantiate pseudo device driver INT3515:00: error -ENXIO: Error requesting irq at index 1
> [    4.029512] ACPI: bus type thunderbolt registered
> [    4.032631] Intel(R) 2.5G Ethernet Linux Driver
> [    4.032634] Copyright(c) 2018 Intel Corporation.
> [    4.032751] igc 0000:64:00.0: enabling device (0000 -> 0002)
> [    4.033014] igc 0000:64:00.0: PTM enabled, 4ns granularity
> [    4.038479] intel-lpss 0000:00:15.1: enabling device (0004 -> 0006)
> [    4.038818] idma64 idma64.1: Found Intel integrated DMA 64-bit
> [    4.047090] Creating 1 MTD partitions on "0000:00:1f.5":
> [    4.047094] 0x000000000000-0x000002000000 : "BIOS"
> [    4.079742] pps pps0: new PPS source ptp0
> [    4.079786] igc 0000:64:00.0 (unnamed net_device) (uninitialized): PHC added
> [    4.082583] RAPL PMU: API unit is 2^-32 Joules, 4 fixed counters, 655360 ms ovfl timer
> [    4.082586] RAPL PMU: hw unit of domain pp0-core 2^-14 Joules
> [    4.082588] RAPL PMU: hw unit of domain package 2^-14 Joules
> [    4.082588] RAPL PMU: hw unit of domain pp1-gpu 2^-14 Joules
> [    4.082589] RAPL PMU: hw unit of domain psys 2^-14 Joules
> [    4.083350] usbcore: registered new device driver r8152-cfgselector
> [    4.107228] cryptd: max_cpu_qlen set to 1000
> [    4.107196] mei_hdcp 0000:00:16.0-b638ab7e-94e2-4ea2-a552-d1c54b627f04: bound 0000:00:02.0 (ops i915_hdcp_ops [i915])
> [    4.107949] mei_pxp 0000:00:16.0-fbf6fcf1-96cf-4e2e-a6a6-1bab8cbe36b1: bound 0000:00:02.0 (ops i915_pxp_tee_component_ops [i915])
> [    4.109214] ee1004 13-0050: 512 byte EE1004-compliant SPD EEPROM, read-only
> [    4.172477] r8152-cfgselector 2-1.1: reset SuperSpeed USB device number 3 using xhci_hcd
> [    4.187010] Bluetooth: Core ver 2.22
> [    4.187025] NET: Registered PF_BLUETOOTH protocol family
> [    4.187026] Bluetooth: HCI device and connection manager initialized
> [    4.187032] Bluetooth: HCI socket layer initialized
> [    4.187034] Bluetooth: L2CAP socket layer initialized
> [    4.187036] Bluetooth: SCO socket layer initialized
> [    4.191558] igc 0000:64:00.0: 4.000 Gb/s available PCIe bandwidth (5.0 GT/s PCIe x1 link)
> [    4.191562] igc 0000:64:00.0 eth0: MAC: XX:XX:XX:XX:XX:XX
> [    4.191837] cfg80211: Loading compiled-in X.509 certificates for regulatory database
> [    4.191998] igc 0000:65:00.0: enabling device (0000 -> 0002)
> [    4.192549] igc 0000:65:00.0: PTM enabled, 4ns granularity
> [    4.193238] AES CTR mode by8 optimization enabled
> [    4.194837] Loaded X.509 cert 'sforshee: 00b28ddf47aef9cea7'
> [    4.195017] Loaded X.509 cert 'wens: 61c038651aabdcf94bd0ac7ff06c7248db18c600'
> [    4.214394] snd_hda_intel 0000:00:1f.3: enabling device (0000 -> 0002)
> [    4.214598] snd_hda_intel 0000:00:1f.3: bound 0000:00:02.0 (ops i915_audio_component_bind_ops [i915])
> [    4.223182] usbcore: registered new interface driver btusb
> [    4.224896] Bluetooth: hci0: HW/SW Version: 0x008a008a, Build Time: 20240826151221
> [    4.243090] pps pps1: new PPS source ptp1
> [    4.243291] igc 0000:65:00.0 (unnamed net_device) (uninitialized): PHC added
> [    4.245647] r8152 2-1.1:1.0 eth1: v1.12.13
> [    4.245683] usbcore: registered new interface driver r8152
> [    4.261881] usbcore: registered new interface driver cdc_ether
> [    4.272727] snd_hda_codec_realtek hdaudioC0D0: autoconfig for ALC269VB: line_outs=1 (0x21/0x0/0x0/0x0/0x0) type:hp
> [    4.272733] snd_hda_codec_realtek hdaudioC0D0:    speaker_outs=0 (0x0/0x0/0x0/0x0/0x0)
> [    4.272735] snd_hda_codec_realtek hdaudioC0D0:    hp_outs=0 (0x0/0x0/0x0/0x0/0x0)
> [    4.272737] snd_hda_codec_realtek hdaudioC0D0:    mono: mono_out=0x0
> [    4.272738] snd_hda_codec_realtek hdaudioC0D0:    inputs:
> [    4.272739] snd_hda_codec_realtek hdaudioC0D0:      Mic=0x18
> [    4.283158] igc 0000:65:00.0: 4.000 Gb/s available PCIe bandwidth (5.0 GT/s PCIe x1 link)
> [    4.283163] igc 0000:65:00.0 eth2: MAC: XX:XX:XX:XX:XX:XX
> [    4.285711] igc 0000:64:00.0 enp100s0: renamed from eth0
> [    4.303471] Intel(R) Wireless WiFi driver for Linux
> [    4.303618] iwlwifi 0000:00:14.3: enabling device (0000 -> 0002)
> [    4.306032] iwlwifi 0000:00:14.3: Detected crf-id 0x400410, cnv-id 0x80400 wfpm id 0x80000020
> [    4.306074] iwlwifi 0000:00:14.3: PCI dev 51f0/0094, rev=0x370, rfid=0x2010d000
> [    4.306077] iwlwifi 0000:00:14.3: Detected Intel(R) Wi-Fi 6E AX211 160MHz
> [    4.310525] iwlwifi 0000:00:14.3: TLV_FW_FSEQ_VERSION: FSEQ Version: 0.0.2.42
> [    4.310859] iwlwifi 0000:00:14.3: loaded firmware version 89.202a2f7b.0 so-a0-gf-a0-89.ucode op_mode iwlmvm
> [    4.317505] r8152 2-1.1:1.0 enp0s13f0u1u1: renamed from eth1
> [    4.317848] igc 0000:65:00.0 enp101s0: renamed from eth2
> [    4.326705] input: HDA Intel PCH Mic as /devices/pci0000:00/0000:00:1f.3/sound/card0/input11
> [    4.326777] input: HDA Intel PCH Headphone as /devices/pci0000:00/0000:00:1f.3/sound/card0/input12
> [    4.326832] input: HDA Intel PCH HDMI/DP,pcm=3 as /devices/pci0000:00/0000:00:1f.3/sound/card0/input13
> [    4.326873] input: HDA Intel PCH HDMI/DP,pcm=7 as /devices/pci0000:00/0000:00:1f.3/sound/card0/input14
> [    4.326939] input: HDA Intel PCH HDMI/DP,pcm=8 as /devices/pci0000:00/0000:00:1f.3/sound/card0/input15
> [    4.326994] input: HDA Intel PCH HDMI/DP,pcm=9 as /devices/pci0000:00/0000:00:1f.3/sound/card0/input16
> [    4.430414] intel_tcc_cooling: TCC Offset locked
> [    4.555399] intel_rapl_msr: PL4 support detected.
> [    4.555425] intel_rapl_common: Found RAPL domain package
> [    4.555428] intel_rapl_common: Found RAPL domain core
> [    4.555429] intel_rapl_common: Found RAPL domain uncore
> [    4.555431] intel_rapl_common: Found RAPL domain psys
> [    4.613360] iwlwifi 0000:00:14.3: WFPM_UMAC_PD_NOTIFICATION: 0x20
> [    4.613411] iwlwifi 0000:00:14.3: WFPM_LMAC2_PD_NOTIFICATION: 0x1f
> [    4.613418] iwlwifi 0000:00:14.3: WFPM_AUTH_KEY_0: 0x90
> [    4.613426] iwlwifi 0000:00:14.3: CNVI_SCU_SEQ_DATA_DW9: 0x0
> [    4.613723] iwlwifi 0000:00:14.3: loaded PNVM version 35148b80
> [    4.614836] iwlwifi 0000:00:14.3: RFIm is deactivated, reason = 4
> [    4.630016] iwlwifi 0000:00:14.3: Detected RF GF, rfid=0x2010d000
> [    4.700769] iwlwifi 0000:00:14.3: base HW address: XX:XX:XX:XX:XX:XX
> [    4.833421] iwlwifi 0000:00:14.3 wlo1: renamed from wlan0
> [    5.452456] EXT4-fs (nvme0n1p3): mounted filesystem efa73f2d-495d-448d-a0f0-dd425258b7e5 r/w with ordered data mode. Quota mode: none.
> [    5.661641] Bluetooth: BNEP (Ethernet Emulation) ver 1.3
> [    5.661644] Bluetooth: BNEP filters: protocol multicast
> [    5.661647] Bluetooth: BNEP socket layer initialized
> [    5.925867] iwlwifi 0000:00:14.3: WFPM_UMAC_PD_NOTIFICATION: 0x20
> [    5.925877] iwlwifi 0000:00:14.3: WFPM_LMAC2_PD_NOTIFICATION: 0x1f
> [    5.925885] iwlwifi 0000:00:14.3: WFPM_AUTH_KEY_0: 0x90
> [    5.925893] iwlwifi 0000:00:14.3: CNVI_SCU_SEQ_DATA_DW9: 0x0
> [    5.927244] iwlwifi 0000:00:14.3: RFIm is deactivated, reason = 4
> [    6.019702] iwlwifi 0000:00:14.3: Registered PHC clock: iwlwifi-PTP, with index: 2
> [    6.248772] iwlwifi 0000:00:14.3: WFPM_UMAC_PD_NOTIFICATION: 0x20
> [    6.248782] iwlwifi 0000:00:14.3: WFPM_LMAC2_PD_NOTIFICATION: 0x1f
> [    6.248790] iwlwifi 0000:00:14.3: WFPM_AUTH_KEY_0: 0x90
> [    6.248798] iwlwifi 0000:00:14.3: CNVI_SCU_SEQ_DATA_DW9: 0x0
> [    6.250128] iwlwifi 0000:00:14.3: RFIm is deactivated, reason = 4
> [    7.025262] Bluetooth: hci0: Device setup in 2736415 usecs
> [    7.025270] Bluetooth: hci0: HCI Enhanced Setup Synchronous Connection command is advertised, but not supported.
> [    7.466021] usbcore: registered new interface driver option
> [    7.466030] usbserial: USB Serial support registered for GSM modem (1-port)
> [    8.318933] Bluetooth: hci0: Mediatek coredump end
> [    8.566804] igc 0000:64:00.0 enp100s0: NIC Link is Up 1000 Mbps Full Duplex, Flow Control: RX
> [    9.199113] Bluetooth: hci0: Mediatek coredump end
> [    9.209081] Bluetooth: hci0: Opcode 0x0c03 failed: -110
> [   11.342488] Bluetooth: hci0: Failed to read MSFT supported features (-110)
> [   13.455279] block nvme0n1: No UUID available providing old NGUID
> [   13.478988] Bluetooth: hci0: AOSP get vendor capabilities (-110)
> [   16.117052] wlo1: regulatory prevented using AP config, downgraded
> [   16.123049] wlo1: authenticate with XX:XX:XX:XX:XX:XX (local address=XX:XX:XX:XX:XX:XX)
> [   16.124244] wlo1: send auth to XX:XX:XX:XX:XX:XX (try 1/3)
> [   16.166021] wlo1: authenticated
> [   16.172421] wlo1: associate with XX:XX:XX:XX:XX:XX (try 1/3)
> [   16.174455] wlo1: RX AssocResp from XX:XX:XX:XX:XX:XX (capab=0x111 status=0 aid=1)
> [   16.184782] wlo1: associated
> [   16.246848] wlo1: Limiting TX power to 23 (26 - 3) dBm as advertised by XX:XX:XX:XX:XX:XX
> [   17.488650] warning: `ThreadPoolForeg' uses wireless extensions which will stop working for Wi-Fi 7 hardware; use nl80211
> [   17.531765] platform INT3515:01: deferred probe pending: Serial bus multi instantiate pseudo device driver: Error creating i2c-client, idx 0
> [   17.531769] platform INT3515:02: deferred probe pending: Serial bus multi instantiate pseudo device driver: Error creating i2c-client, idx 0
> [   18.595698] usb 4-1: Disable of device-initiated U1 failed.
> [   23.715878] usb 4-1: Disable of device-initiated U2 failed.
> [   33.956071] Bluetooth: hci0: Failed to write uhw reg(-110)
> [   33.956138] usb 4-1: Disable of device-initiated U2 failed.
> [   39.293677] xhci_hcd 0000:00:14.0: Timeout while waiting for setup device command
> [   44.634497] xhci_hcd 0000:00:14.0: Timeout while waiting for setup device command
> [   44.841067] usb 4-1: device not accepting address 2, error -62
> [   50.186371] xhci_hcd 0000:00:14.0: Timeout while waiting for setup device command
> [   55.523585] xhci_hcd 0000:00:14.0: Timeout while waiting for setup device command
> [   55.729841] usb 4-1: device not accepting address 2, error -62
> [   61.072634] xhci_hcd 0000:00:14.0: Timeout while waiting for setup device command
> [   66.407700] xhci_hcd 0000:00:14.0: Timeout while waiting for setup device command
> [   66.614207] usb 4-1: device not accepting address 2, error -62
> [   71.955541] xhci_hcd 0000:00:14.0: Timeout while waiting for setup device command
> [   77.289925] xhci_hcd 0000:00:14.0: Timeout while waiting for setup device command
> [   77.496512] usb 4-1: device not accepting address 2, error -62
> [   77.513500] usb 4-1: USB disconnect, device number 2
> [   82.837128] xhci_hcd 0000:00:14.0: Timeout while waiting for setup device command
> [   88.171049] xhci_hcd 0000:00:14.0: Timeout while waiting for setup device command
> [   88.377554] usb 4-1: device not accepting address 3, error -62
> [   93.718045] xhci_hcd 0000:00:14.0: Timeout while waiting for setup device command
> [   99.051387] xhci_hcd 0000:00:14.0: Timeout while waiting for setup device command
> [   99.258078] usb 4-1: device not accepting address 4, error -62
> [   99.266739] usb usb4-port1: attempt power cycle
> [  106.518206] xhci_hcd 0000:00:14.0: Timeout while waiting for setup device command
> [  111.851387] xhci_hcd 0000:00:14.0: Timeout while waiting for setup device command
> [  112.057840] usb 4-1: device not accepting address 5, error -62
> [  117.397862] xhci_hcd 0000:00:14.0: Timeout while waiting for setup device command
> [  122.732729] xhci_hcd 0000:00:14.0: Timeout while waiting for setup device command
> [  122.937708] usb 4-1: device not accepting address 6, error -62
> [  122.944587] usb usb4-port1: unable to enumerate USB device
>
>
>
> >
> > >
> > > External email : Please do not click links or open attachments until
> > > you have verified the sender or the content.
> > >  Hi,
> > >
> > > The 22/08/2024 13:23, Hao Qin wrote:
> > > > Remove resetting mt7921 before downloading the fw, as it may cause
> > > > command timeout when performing the reset.
> > > >
> > > > Signed-off-by: Hao Qin <hao.qin at mediatek.com>
> > > > ---
> > > >  drivers/bluetooth/btmtk.c | 4 ++--
> > > >  1 file changed, 2 insertions(+), 2 deletions(-)
> > > >
> > > > diff --git a/drivers/bluetooth/btmtk.c b/drivers/bluetooth/btmtk.c
> > > > index 2b7c80043aa2..a46f70135cbd 100644
> > > > --- a/drivers/bluetooth/btmtk.c
> > > > +++ b/drivers/bluetooth/btmtk.c
> > > > @@ -1326,7 +1326,6 @@ int btmtk_usb_setup(struct hci_dev *hdev)
> > > >  fwname = FIRMWARE_MT7668;
> > > >  break;
> > > >  case 0x7922:
> > > > -case 0x7961:
> > > >  case 0x7925:
> > > >  /* Reset the device to ensure it's in the initial state before
> > > >   * downloading the firmware to ensure.
> > > > @@ -1334,7 +1333,8 @@ int btmtk_usb_setup(struct hci_dev *hdev)
> > > >
> > > >  if (!test_bit(BTMTK_FIRMWARE_LOADED, &btmtk_data->flags))
> > > >  btmtk_usb_subsys_reset(hdev, dev_id);
> > > > -
> > > > +fallthrough;
> > > > +case 0x7961:
> > > >  btmtk_fw_get_filename(fw_bin_name, sizeof(fw_bin_name), dev_id,
> > > >        fw_version, fw_flavor);
> > > >
> > > > --
> > > > 2.18.0
> > > >
> > >
> > > [Original regression report
> > >
> > https://lore.kernel.org/linux-bluetooth/ZsTh7Jyug7MbZsLE at mdpsys.co.uk/
> > > ]
> > >
> > > Thanks for the patch, I have tested it on top of v6.11-rc7 and can
> > > confirm
> > > that it resolves the initial command timeout issue.
> > >
> > > Unfortunately, when using the latest firmware version 20240826151221
> > > from the
> > > linux-firmware repo I'm still seeing "Mediatek coredump end" errors
> > > followed by MSFT and AOSP errors. The device then appears
> > > unresponsive
> > > and the kernel eventually gives up attempting to enumerate:
> > >
> > > [  230.042936] usb 4-3.2: new SuperSpeed USB device number 4 using
> > > xhci_hcd
> > > [  230.065228] usb 4-3.2: New USB device found, idVendor=0e8d,
> > > idProduct=7961, bcdDevice= 1.00
> > > [  230.065237] usb 4-3.2: New USB device strings: Mfr=6, Product=7,
> > > SerialNumber=8
> > > [  230.065240] usb 4-3.2: Product: Wireless_Device
> > > [  230.065242] usb 4-3.2: Manufacturer: MediaTek Inc.
> > > [  230.065245] usb 4-3.2: SerialNumber: 000000000
> > > [  230.101915] Bluetooth: hci2: HW/SW Version: 0x008a008a, Build
> > > Time: 20240826151221
> > > [  233.005938] Bluetooth: hci2: Device setup in 2862056 usecs
> > > [  233.005983] Bluetooth: hci2: HCI Enhanced Setup Synchronous
> > > Connection command is advertised, but not supported.
> > > [  234.306071] Bluetooth: hci2: Mediatek coredump end
> > > [  235.092729] Bluetooth: hci2: Opcode 0x0c03 failed: -110
> > > [  235.192772] Bluetooth: hci2: Mediatek coredump end
> > > [  237.226157] Bluetooth: hci2: Failed to read MSFT supported
> > > features (-110)
> > > [  239.359435] Bluetooth: hci2: AOSP get vendor capabilities (-110)
> > > [  244.479726] usb 4-3.2: Disable of device-initiated U1 failed.
> > > [  249.599598] usb 4-3.2: Disable of device-initiated U2 failed.
> > > [  259.839215] Bluetooth: hci2: Failed to write uhw reg(-110)
> > > [  259.839240] usb 4-3.2: Disable of device-initiated U1 failed.
> > > [  264.959343] usb 4-3.2: Disable of device-initiated U2 failed.
> > > [  270.079038] xhci_hcd 0000:00:14.0: Timeout while waiting for setup
> > > device command
> > > [  275.412299] xhci_hcd 0000:00:14.0: Timeout while waiting for setup
> > > device command
> > > [  275.618812] usb 4-3.2: device not accepting address 4, error -62
> > > [  280.958852] xhci_hcd 0000:00:14.0: Timeout while waiting for setup
> > > device command
> > > [  286.292034] xhci_hcd 0000:00:14.0: Timeout while waiting for setup
> > > device command
> > > [  286.498618] usb 4-3.2: device not accepting address 4, error -62
> > > [  291.838759] xhci_hcd 0000:00:14.0: Timeout while waiting for setup
> > > device command
> > > [  297.172018] xhci_hcd 0000:00:14.0: Timeout while waiting for setup
> > > device command
> > > [  297.378477] usb 4-3.2: device not accepting address 4, error -62
> > > [  302.718497] xhci_hcd 0000:00:14.0: Timeout while waiting for setup
> > > device command
> > > [  308.051867] xhci_hcd 0000:00:14.0: Timeout while waiting for setup
> > > device command
> > > [  308.258345] usb 4-3.2: device not accepting address 4, error -62
> > > [  308.260253] usb 4-3.2: USB disconnect, device number 4
> > > [  313.598307] xhci_hcd 0000:00:14.0: Timeout while waiting for setup
> > > device command
> > > [  318.931586] xhci_hcd 0000:00:14.0: Timeout while waiting for setup
> > > device command
> > > [  319.138278] usb 4-3.2: device not accepting address 5, error -62
> > > [  324.478224] xhci_hcd 0000:00:14.0: Timeout while waiting for setup
> > > device command
> > > [  329.811444] xhci_hcd 0000:00:14.0: Timeout while waiting for setup
> > > device command
> > > [  330.018032] usb 4-3.2: device not accepting address 6, error -62
> > > [  330.018489] usb 4-3-port2: attempt power cycle
> > > [  336.211505] xhci_hcd 0000:00:14.0: Timeout while waiting for setup
> > > device command
> > > [  341.544640] xhci_hcd 0000:00:14.0: Timeout while waiting for setup
> > > device command
> > > [  341.751239] usb 4-3.2: device not accepting address 7, error -62
> > > [  347.091375] xhci_hcd 0000:00:14.0: Timeout while waiting for setup
> > > device command
> > > [  352.424563] xhci_hcd 0000:00:14.0: Timeout while waiting for setup
> > > device command
> > > [  352.631136] usb 4-3.2: device not accepting address 8, error -62
> > > [  352.631538] usb 4-3-port2: unable to enumerate USB device
> > >
> > >
> > > Interestingly, if I revert back to an known-good firmware version
> > > 20231025113744 along with your patch, the device enumerates and works
> > > fine:
> > >
> > > [ 4001.366725] usb 4-1: new SuperSpeed USB device number 4 using
> > > xhci_hcd
> > > [ 4001.385840] usb 4-1: New USB device found, idVendor=0e8d,
> > > idProduct=7961, bcdDevice= 1.00
> > > [ 4001.385855] usb 4-1: New USB device strings: Mfr=6, Product=7,
> > > SerialNumber=8
> > > [ 4001.385860] usb 4-1: Product: Wireless_Device
> > > [ 4001.385863] usb 4-1: Manufacturer: MediaTek Inc.
> > > [ 4001.385867] usb 4-1: SerialNumber: 000000000
> > > [ 4001.398010] Bluetooth: hci1: HW/SW Version: 0x008a008a, Build
> > > Time: 20231025113744
> > > [ 4004.275656] Bluetooth: hci1: Device setup in 2812288 usecs
> > > [ 4004.275661] Bluetooth: hci1: HCI Enhanced Setup Synchronous
> > > Connection command is advertised, but not supported.
> > > [ 4004.355137] Bluetooth: hci1: AOSP extensions version v0.96
> > > [ 4004.355156] Bluetooth: hci1: AOSP quality report is not supported
> > > [ 4004.355698] Bluetooth: MGMT ver 1.23
> > >
> > > But if I then disconnect it, I get the Oops that I shared in my
> > > original
> > > regression report:
> > >
> > > [ 4043.436215] usb 4-1: USB disconnect, device number 4
> > > [ 4043.437308] Oops: general protection fault, probably for non-
> > > canonical address 0xdead000000000122: 0000 [#1] PREEMPT SMP NOPTI
> > > [ 4043.437332] CPU: 2 UID: 0 PID: 3698 Comm: kworker/2:0 Not tainted
> > > 6.11.0-rc7-00001-g0e2ad6528188-dirty #71
> > > d90fb9085e2a0686ac48ebcc408d97b104c6fbf1
> > > [ 4043.437352] Hardware name: Intel(R) Client Systems
> > > NUC12WSHi7/NUC12WSBi7, BIOS WSADL357.0088.2023.0505.1623 05/05/2023
> > > [ 4043.437361] Workqueue: usb_hub_wq hub_event
> > > [ 4043.437386] RIP: 0010:hci_unregister_dev+0x45/0x1f0 [bluetooth]
> > > [ 4043.437548] Code: 89 ef e8 ae d4 5c c1 f0 80 8b e9 0e 00 00 08 48
> > > 89 ef e8 0e c2 5c c1 48 c7 c7 68 60 52 c1 e8 22 23 5d c1 48 8b 43 08
> > > 48 8b 13 <48> 3b 18 0f 85 f5 c7 06 00 48 3b 5a 08 0f 85 eb c7 06 00
> > > 48 89 42
> > > [ 4043.437560] RSP: 0018:ffffa10f4ae43b98 EFLAGS: 00010246
> > > [ 4043.437574] RAX: dead000000000122 RBX: ffff8cf86c160000 RCX:
> > > 0000000000000000
> > > [ 4043.437585] RDX: dead000000000100 RSI: ffff8cf7b7d16c50 RDI:
> > > ffffffffc1526068
> > > [ 4043.437594] RBP: ffff8cf86c1604d0 R08: 0000000000000000 R09:
> > > ffff8cf7401d8e10
> > > [ 4043.437602] R10: ffffa10f4ae43ba0 R11: ffffa10f4ae43ba8 R12:
> > > ffff8cf86c160000
> > > [ 4043.437610] R13: ffffffffc1416278 R14: ffffffffc1416278 R15:
> > > ffff8cf7f8d73850
> > > [ 4043.437620] FS:  0000000000000000(0000) GS:ffff8d0697300000(0000)
> > > knlGS:0000000000000000
> > > [ 4043.437632] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
> > > [ 4043.437641] CR2: 00007f98d66dc000 CR3: 0000000131124000 CR4:
> > > 0000000000f50ef0
> > > [ 4043.437651] PKRU: 55555554
> > > [ 4043.437658] Call Trace:
> > > [ 4043.437670]  <TASK>
> > > [ 4043.437680]  ? __die_body.cold+0x19/0x27
> > > [ 4043.437700]  ? die_addr+0x3c/0x60
> > > [ 4043.437716]  ? exc_general_protection+0x17d/0x400
> > > [ 4043.437738]  ? asm_exc_general_protection+0x26/0x30
> > > [ 4043.437760]  ? hci_unregister_dev+0x45/0x1f0 [bluetooth
> > > 6dca047d1088401e195d97746b2b4936e5756d61]
> > > [ 4043.437930]  ? hci_unregister_dev+0x3e/0x1f0 [bluetooth
> > > 6dca047d1088401e195d97746b2b4936e5756d61]
> > > [ 4043.438080]  btusb_disconnect+0x67/0x170 [btusb
> > > 5bf8186d9cab4c5be1762247dadb6753a7c72a7f]
> > > [ 4043.438108]  usb_unbind_interface+0x90/0x290
> > > [ 4043.438130]  device_release_driver_internal+0x19c/0x200
> > > [ 4043.438150]  bus_remove_device+0xc6/0x130
> > > [ 4043.438166]  device_del+0x161/0x3e0
> > > [ 4043.438182]  ? kobject_put+0xa0/0x1d0
> > > [ 4043.438196]  usb_disable_device+0x104/0x220
> > > [ 4043.438213]  usb_disconnect+0xe6/0x2e0
> > > [ 4043.438231]  hub_event+0x7f9/0x19d0
> > > [ 4043.438250]  ? __pm_runtime_suspend+0x47/0xc0
> > > [ 4043.438269]  process_one_work+0x17b/0x330
> > > [ 4043.438287]  worker_thread+0x2c6/0x3f0
> > > [ 4043.438304]  ? __pfx_worker_thread+0x10/0x10
> > > [ 4043.438318]  kthread+0xcf/0x100
> > > [ 4043.438337]  ? __pfx_kthread+0x10/0x10
> > > [ 4043.438354]  ret_from_fork+0x31/0x50
> > > [ 4043.438367]  ? __pfx_kthread+0x10/0x10
> > > [ 4043.438382]  ret_from_fork_asm+0x1a/0x30
> > > [ 4043.438403]  </TASK>
> > > [ 4043.438408] Modules linked in: uhid mt792x_usb mt7921_common
> > > mt792x_lib mt76_connac_lib mt76_usb mt76 ccm option usb_wwan cmac
> > > algif_hash algif_skcipher af_alg sr_mod cdrom bnep mousedev joydev
> > > vfat fat snd_sof_pci_intel_tgl snd_sof_pci_intel_cnl intel_rapl_msr
> > > snd_sof_intel_hda_generic intel_rapl_common soundwire_intel
> > > intel_uncore_frequency soundwire_cadence
> > > intel_uncore_frequency_common snd_sof_intel_hda_common
> > > snd_sof_intel_hda_mlink snd_sof_intel_hda snd_sof_pci
> > > snd_sof_xtensa_dsp snd_sof iwlmvm snd_sof_utils snd_soc_hdac_hda
> > > snd_soc_acpi_intel_match soundwire_generic_allocation snd_soc_acpi
> > > soundwire_bus snd_soc_avs r8152 x86_pkg_temp_thermal intel_powerclamp
> > > libphy snd_soc_hda_codec coretemp mac80211 snd_hda_ext_core kvm_intel
> > > snd_soc_core snd_hda_codec_hdmi cdc_ether hid_generic uas usbnet
> > > snd_hda_codec_realtek snd_compress kvm usb_storage mii usbhid
> > > snd_hda_codec_generic ac97_bus snd_pcm_dmaengine
> > > snd_hda_scodec_component snd_hda_intel libarc4 snd_intel_dspcfg btusb
> > > crct10dif_pclmul snd_intel_sdw_acpi
> > > [ 4043.438617]  crc32_pclmul iwlwifi btrtl snd_hda_codec
> > > polyval_clmulni btintel polyval_generic btbcm ghash_clmulni_intel
> > > sha512_ssse3 btmtk tps6598x sha256_ssse3 snd_hda_core typec
> > > sha1_ssse3 cfg80211 bluetooth aesni_intel snd_hwdep roles gf128mul
> > > crypto_simd snd_pcm cryptd mei_hdcp mei_pxp rapl ee1004 ov13858
> > > snd_timer intel_cstate igc spi_nor intel_uncore i2c_i801 thunderbolt
> > > snd v4l2_fwnode mei_me v4l2_async ptp wdat_wdt i2c_smbus mtd pcspkr
> > > wmi_bmof intel_lpss_pci videodev mei pps_core soundcore
> > > intel_pmc_core i2c_mux intel_lpss rfkill idma64 igen6_edac intel_vsec
> > > serial_multi_instantiate mc pmt_telemetry pinctrl_tigerlake pmt_class
> > > acpi_pad acpi_tad mac_hid i2c_dev dm_mod sg crypto_user loop
> > > nfnetlink ip_tables x_tables ext4 crc32c_generic crc16 mbcache jbd2
> > > xe drm_ttm_helper gpu_sched drm_suballoc_helper drm_gpuvm drm_exec
> > > i915 i2c_algo_bit drm_buddy ttm nvme intel_gtt drm_display_helper
> > > nvme_core spi_intel_pci cec xhci_pci crc32c_intel spi_intel nvme_auth
> > > xhci_pci_renesas video wmi
> > > [ 4043.438898] ---[ end trace 0000000000000000 ]---
> > > [ 4043.438905] RIP: 0010:hci_unregister_dev+0x45/0x1f0 [bluetooth]
> > > [ 4043.439039] Code: 89 ef e8 ae d4 5c c1 f0 80 8b e9 0e 00 00 08 48
> > > 89 ef e8 0e c2 5c c1 48 c7 c7 68 60 52 c1 e8 22 23 5d c1 48 8b 43 08
> > > 48 8b 13 <48> 3b 18 0f 85 f5 c7 06 00 48 3b 5a 08 0f 85 eb c7 06 00
> > > 48 89 42
> > > [ 4043.439048] RSP: 0018:ffffa10f4ae43b98 EFLAGS: 00010246
> > > [ 4043.439058] RAX: dead000000000122 RBX: ffff8cf86c160000 RCX:
> > > 0000000000000000
> > > [ 4043.439065] RDX: dead000000000100 RSI: ffff8cf7b7d16c50 RDI:
> > > ffffffffc1526068
> > > [ 4043.439072] RBP: ffff8cf86c1604d0 R08: 0000000000000000 R09:
> > > ffff8cf7401d8e10
> > > [ 4043.439078] R10: ffffa10f4ae43ba0 R11: ffffa10f4ae43ba8 R12:
> > > ffff8cf86c160000
> > > [ 4043.439085] R13: ffffffffc1416278 R14: ffffffffc1416278 R15:
> > > ffff8cf7f8d73850
> > > [ 4043.439091] FS:  0000000000000000(0000) GS:ffff8d0697300000(0000)
> > > knlGS:0000000000000000
> > > [ 4043.439100] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
> > > [ 4043.439108] CR2: 00007f98d66dc000 CR3: 0000000131124000 CR4:
> > > 0000000000f50ef0
> > > [ 4043.439116] PKRU: 55555554
> > > [ 4043.439122] note: kworker/2:0[3698] exited with preempt_count 1
> > >
> > > So, in summary, it looks as though there are two issues here:
> > >
> > > 1. The latest firmware does not seem to work well with this chipset,
> > >    perhaps it is crashing after loading?
> > > 2. The Oops in the hci_unregister_dev function suggests some HCI
> > >    registration bug.
> > >
> > > Let me know if I can provide any further assistance.
> > >
> > > Regards,
> > >
> > > Marc
> > >
>
> *********** MEDIATEK Confidentiality Notice
>  ***********
> The information contained in this e-mail message (including any
> attachments) may be confidential, proprietary, privileged, or
> otherwise exempt from disclosure under applicable laws. It is
> intended to be conveyed only to the designated recipient(s). Any
> use, dissemination, distribution, printing, retaining or copying
> of this e-mail (including its attachments) by unintended recipient(s)
> is strictly prohibited and may be unlawful. If you are not an
> intended recipient of this e-mail, or believe that you have received
> this e-mail in error, please notify the sender immediately
> (by replying to this e-mail), delete any and all copies of this
> e-mail (including any attachments) from your system, and do not
> disclose the content of this e-mail to any other person. Thank you!



-- 
Luiz Augusto von Dentz


From macpaul.lin at mediatek.com  Wed Sep 18 07:18:49 2024
From: macpaul.lin at mediatek.com (Macpaul Lin)
Date: Wed, 18 Sep 2024 22:18:49 +0800
Subject: [PATCH v6 2/2] dt-bindings: mfd: mediatek: mt6397: Convert to DT
 schema format
In-Reply-To: <20240918115651c1475d36@mail.local>
References: <20240918064955.6518-1-macpaul.lin@mediatek.com>
 <20240918064955.6518-2-macpaul.lin@mediatek.com>
 <20240918115151c896f33f@mail.local> <20240918115651c1475d36@mail.local>
Message-ID: <2af0621d-14ac-b7f3-b28d-2df698931121@mediatek.com>


On 9/18/24 19:56, Alexandre Belloni wrote:
> 
> On 18/09/2024 13:51:51+0200, Alexandre Belloni wrote:
>> > Changes for v4:
>> >  - Remove "mediatek,mt6357" from PMIC's compatible string since there is a
>> >    seperated DT schema for PMIC mt6357.
>> > 
>> > Changes for v5:
>> >  - Rebase to next-20240913 (linux-next/master).
>> >  - Fix the "title" (device type) of mfd/mediatek,mt6397.yaml to "PMIC".
>> >  - RTC:
>> >   - Drop "start-year"
>> 
>> Maybe, instead of dropping the property, you should add support in the
>> driver by setting range_min and range_max.
> 
> Looking at this even more, the driver can probably be simplified by
> setting start_year in probe and dropping RTC_MIN_YEAR_OFFSET.

Thank you for pointing out where and how the driver should be changed.
However, I'm wondering if this should be a fix with a separated
patchset (bindings and the driver)? The board or SoC's device trees
should be reviewed as well. I'll need to get someone's help (permission) 
inside MediaTek to check those dts and construct the patch for RTC driver.
That will take sometime.

[snip]

Thanks.
Best Regards,
Macpaul Lin


From lorenzo at kernel.org  Wed Sep 18 07:37:30 2024
From: lorenzo at kernel.org (Lorenzo Bianconi)
Date: Wed, 18 Sep 2024 16:37:30 +0200
Subject: [PATCH net] net: airoha: fix PSE memory configuration in
 airoha_fe_pse_ports_init()
Message-ID: <20240918-airoha-eth-pse-fix-v1-1-7b61f26cd2fd@kernel.org>

Align PSE memory configuration to vendor SDK. In particular, increase
initial value of PSE reserved memory in airoha_fe_pse_ports_init()
routine by the value used for the second Packet Processor Engine (PPE2)
and do not overwrite the default value.
Moreover, store the initial value for PSE reserved memory in orig_val
before running airoha_fe_set_pse_queue_rsv_pages() in
airoha_fe_set_pse_oq_rsv routine.

Fixes: 23020f049327 ("net: airoha: Introduce ethernet support for EN7581 SoC")
Tested-by: Sayantan Nandy <sayantan.nandy at airoha.com>
Signed-off-by: Lorenzo Bianconi <lorenzo at kernel.org>
---
 drivers/net/ethernet/mediatek/airoha_eth.c | 20 ++++++++++++++------
 1 file changed, 14 insertions(+), 6 deletions(-)

diff --git a/drivers/net/ethernet/mediatek/airoha_eth.c b/drivers/net/ethernet/mediatek/airoha_eth.c
index 930f180688e5..2e01abc70c17 100644
--- a/drivers/net/ethernet/mediatek/airoha_eth.c
+++ b/drivers/net/ethernet/mediatek/airoha_eth.c
@@ -1116,17 +1116,23 @@ static void airoha_fe_set_pse_queue_rsv_pages(struct airoha_eth *eth,
 		      PSE_CFG_WR_EN_MASK | PSE_CFG_OQRSV_SEL_MASK);
 }
 
+static u32 airoha_fe_get_pse_all_rsv(struct airoha_eth *eth)
+{
+	u32 val = airoha_fe_rr(eth, REG_FE_PSE_BUF_SET);
+
+	return FIELD_GET(PSE_ALLRSV_MASK, val);
+}
+
 static int airoha_fe_set_pse_oq_rsv(struct airoha_eth *eth,
 				    u32 port, u32 queue, u32 val)
 {
-	u32 orig_val, tmp, all_rsv, fq_limit;
+	u32 orig_val = airoha_fe_get_pse_queue_rsv_pages(eth, port, queue);
+	u32 tmp, all_rsv, fq_limit;
 
 	airoha_fe_set_pse_queue_rsv_pages(eth, port, queue, val);
 
 	/* modify all rsv */
-	orig_val = airoha_fe_get_pse_queue_rsv_pages(eth, port, queue);
-	tmp = airoha_fe_rr(eth, REG_FE_PSE_BUF_SET);
-	all_rsv = FIELD_GET(PSE_ALLRSV_MASK, tmp);
+	all_rsv = airoha_fe_get_pse_all_rsv(eth);
 	all_rsv += (val - orig_val);
 	airoha_fe_rmw(eth, REG_FE_PSE_BUF_SET, PSE_ALLRSV_MASK,
 		      FIELD_PREP(PSE_ALLRSV_MASK, all_rsv));
@@ -1166,11 +1172,13 @@ static void airoha_fe_pse_ports_init(struct airoha_eth *eth)
 		[FE_PSE_PORT_GDM4] = 2,
 		[FE_PSE_PORT_CDM5] = 2,
 	};
+	u32 all_rsv;
 	int q;
 
+	all_rsv = airoha_fe_get_pse_all_rsv(eth);
 	/* hw misses PPE2 oq rsv */
-	airoha_fe_set(eth, REG_FE_PSE_BUF_SET,
-		      PSE_RSV_PAGES * pse_port_num_queues[FE_PSE_PORT_PPE2]);
+	all_rsv += PSE_RSV_PAGES * pse_port_num_queues[FE_PSE_PORT_PPE2];
+	airoha_fe_set(eth, REG_FE_PSE_BUF_SET, all_rsv);
 
 	/* CMD1 */
 	for (q = 0; q < pse_port_num_queues[FE_PSE_PORT_CDM1]; q++)

---
base-commit: 9410645520e9b820069761f3450ef6661418e279
change-id: 20240918-airoha-eth-pse-fix-641d0cf686c0

Best regards,
-- 
Lorenzo Bianconi <lorenzo at kernel.org>



From marc.payne at mdpsys.co.uk  Wed Sep 18 09:02:37 2024
From: marc.payne at mdpsys.co.uk (marc.payne at mdpsys.co.uk)
Date: Wed, 18 Sep 2024 17:02:37 +0100
Subject: [PATCH] Bluetooth: btmtk: Remove resetting mt7921 before
 downloading the fw
In-Reply-To: <9bfbbf24ac2480d94d3455f7e33e4b5502b38ced.camel@mediatek.com>
References: <20240822052310.25220-1-hao.qin@mediatek.com>
 <ZuB3omUkdUHLggYu@mdpsys.co.uk>
 <790e542aa9d08c7efeee6ef298fce2a87d8035e4.camel@mediatek.com>
 <ZuneSM4SvyUFX86j@mdpsys.co.uk>
 <9bfbbf24ac2480d94d3455f7e33e4b5502b38ced.camel@mediatek.com>
Message-ID: <Zur5ne9c81-HbyZZ@mdpsys.co.uk>

Hi Chris,

The 18/09/2024 03:36, Chris Lu (???) wrote:
> On Tue, 2024-09-17 at 20:53 +0100, marc.payne at mdpsys.co.uk<mailto:marc.payne at mdpsys.co.uk> wrote:
> 
> Hi Marc,
> 
> Thank you for providing the logs for us to debug.
> 
> 
> External email : Please do not click links or open attachments until you have verified the sender or the content.
>  The 12/09/2024 07:09, Chris Lu (???) wrote:
> > On Tue, 2024-09-10 at 18:09 +0100, Marc Payne wrote:
> >
> > Hi Marc,
> 
> Hi,
> 
> >
> > Is it possible to provide entire kernel log for further debugging?
> > (From boot up to issue heppen)
> >
> > We suspect that the issue occurred event earilier and our controller is
> > not able to recover itself. Therfore, we need to check if Bluetooth
> > works as expected in the booting stage.
> 
> Happy to help. Below is the log for a cold boot of Linux 6.11-rc7 (with
> the additional patch to avoid the controller reset before fw load). The
> MT7921AUN is directly connected to one of the computer's USB ports. The
> 
> Is "MT7921AUN" an external Bluetooth/WiFi usb dongle?
> From the information in the kernel log you provided, the MT7921AUN IC used on
> the dongle is not for Linux PC project. Since the firmware we push to Kernel is not
> for "MT7921AUN", software, firmware and hardware may not match. Using that
> dongle with Linux-Based Notebook may lead to some unexpected errors such as
> Bluetooth can't setup successfully.

Yes it is a USB3-based device, the Alfa Networks AWUS036AXML [1] and is
advertised as being Linux compatible. It is often recommended specifically for
use with Linux [2]. The idea that the hardware may be considered 'Windows-only'
is not a pleasant one...

The WiFi functionality works with the in-kernel mt7921u driver, the
device IDs present since the driver was added to the kernel. Is it not
reasonable to expect the Bluetooth function to work too? I don't work in
IC design but it seems to me that the internals of a MT7921K (which
appears to be the PCIe/USB equivalent) and a MT7921AUN would be very
similar given they share the same name and device IDs. The BT function
will be USB-based on both would it not? There is obviously something
different given that you aren't seeing the same errors in your test
enviroment. Can any of your colleagues provide any insight?

Since I bought the device earlier this year, I have suspected that the
BT firmware had a compatibility issue. I emailed you with my findings at
the beginning of June [3]. At the time, the loading of the BT firmware
was causing the device to become unresponsive which meant the WiFi
function was unavailable. I worked around the issue by deleting the BT
fw file. I then went back through previous fw versions in the linux-firmware
repo and discovered that version 20230526131214 was the latest working
version. Something must have changed in the firmware code after version
20230526131214 that broke compatibility. Perhaps you can review the
changelog?

In my original regression report [4] I included a log showing failures
but then a successful init of the BT after a (double) USB reset:

[   77.765047] usb 4-3.1.2: new SuperSpeed USB device number 4 using xhci_hcd
[   77.785044] usb 4-3.1.2: New USB device found, idVendor=0e8d, idProduct=7961, bcdDevice= 1.00
[   77.785063] usb 4-3.1.2: New USB device strings: Mfr=6, Product=7, SerialNumber=8
[   77.785069] usb 4-3.1.2: Product: Wireless_Device
[   77.785073] usb 4-3.1.2: Manufacturer: MediaTek Inc.
[   77.785077] usb 4-3.1.2: SerialNumber: 000000000
[   77.807685] Bluetooth: hci1: HW/SW Version: 0x008a008a, Build Time: 20240716151445
[   80.570163] Bluetooth: hci1: Device setup in 2710186 usecs
[   80.570173] Bluetooth: hci1: HCI Enhanced Setup Synchronous Connection command is advertised, but not supported.
[   81.871516] Bluetooth: hci1: Mediatek coredump end
[   82.734805] Bluetooth: hci1: Opcode 0x0c03 failed: -110
[   82.754807] Bluetooth: hci1: Mediatek coredump end
[   84.868215] Bluetooth: hci1: Failed to read MSFT supported features (-110)
[   87.001566] Bluetooth: hci1: AOSP get vendor capabilities (-110)
[   92.292375] usb 4-3.1.2: reset SuperSpeed USB device number 4 using xhci_hcd
[   92.385619] usb 4-3.1.2: reset SuperSpeed USB device number 4 using xhci_hcd
[   92.406786] Bluetooth: hci2: HW/SW Version: 0x008a008a, Build Time: 20240716151445
[   94.920337] Bluetooth: hci2: Device setup in 2455839 usecs
[   94.920343] Bluetooth: hci2: HCI Enhanced Setup Synchronous Connection command is advertised, but not supported.
[   94.994480] Bluetooth: hci2: AOSP extensions version v1.00
[   94.994494] Bluetooth: hci2: AOSP quality report is supported
[   94.995001] Bluetooth: MGMT ver 1.23

I don't know why those resets occurred, they do not happen consistently.
Based on the above I did some further experimenting with the latest fw
and the usbreset command 'usbreset 004/003':

[ 1541.974533] usb 4-1: new SuperSpeed USB device number 3 using xhci_hcd
[ 1541.997054] usb 4-1: New USB device found, idVendor=0e8d, idProduct=7961, bcdDevice= 1.00
[ 1541.997063] usb 4-1: New USB device strings: Mfr=6, Product=7, SerialNumber=8
[ 1541.997066] usb 4-1: Product: Wireless_Device
[ 1541.997068] usb 4-1: Manufacturer: MediaTek Inc.
[ 1541.997070] usb 4-1: SerialNumber: 000000000
[ 1542.005773] Bluetooth: hci0: HW/SW Version: 0x008a008a, Build Time: 20240826151221
[ 1544.870609] Bluetooth: hci0: Device setup in 2799269 usecs
[ 1544.870614] Bluetooth: hci0: HCI Enhanced Setup Synchronous Connection command is advertised, but not supported.
[ 1546.164252] Bluetooth: hci0: Mediatek coredump end
[ 1547.010929] Bluetooth: hci0: Opcode 0x0c03 failed: -110
[ 1547.044247] Bluetooth: hci0: Mediatek coredump end
[ 1549.144294] Bluetooth: hci0: Failed to read MSFT supported features (-110)
[ 1551.277666] Bluetooth: hci0: AOSP get vendor capabilities (-110)
[ 1552.131148] usb 4-1: Disable of device-initiated U1 failed.
[ 1557.251111] usb 4-1: Disable of device-initiated U2 failed.
[ 1562.591824] usb 4-1: reset SuperSpeed USB device number 3 using xhci_hcd
[ 1562.614686] Bluetooth: hci1: HW/SW Version: 0x008a008a, Build Time: 20240826151221
[ 1565.200311] Bluetooth: hci1: Device setup in 2526663 usecs
[ 1565.200317] Bluetooth: hci1: HCI Enhanced Setup Synchronous Connection command is advertised, but not supported.
[ 1565.275182] Bluetooth: hci1: AOSP extensions version v1.00
[ 1565.275194] Bluetooth: hci1: AOSP quality report is supported
[ 1565.275479] Bluetooth: MGMT ver 1.23
[ 1579.304623] hid-generic 0005:046D:B014.0005: unknown main item tag 0x0
[ 1579.304840] input: Bluetooth Mouse M336/M337/M535 Mouse as /devices/virtual/misc/uhid/0005:046D:B014.0005/input/input22
[ 1579.305358] input: Bluetooth Mouse M336/M337/M535 Consumer Control as /devices/virtual/misc/uhid/0005:046D:B014.0005/input/input23
[ 1579.305629] input: Bluetooth Mouse M336/M337/M535 Keyboard as /devices/virtual/misc/uhid/0005:046D:B014.0005/input/input26
[ 1579.437733] hid-generic 0005:046D:B014.0005: input,hidraw3: BLUETOOTH HID v12.00 Mouse [Bluetooth Mouse M336/M337/M535] on XX:XX:XX:XX:XX:XX


It seems that a well-timed USB reset allows the device to initiialize
correctly and a BT mouse can pair. Perhaps this gives a clue as to what
may be wrong in the firmware? Why is the device setup time faster the
second time? Perhaps the buggy code is not being run?

> 
> Do you have an M.2 MT7921 module? (Typically existed in the Notebook product with
> MediaTek Connectivity solution). The M.2 module is the correct one expected to be used.
> I've setup an environment locally with Kernel v6.11, With Hao Qin's solustion
> ("[PATCH] Bluetooth: btmtk: Remove resetting mt7921 before downloading the fw"),
> I'm albe to successfully setup Bluetooth and works normally.

I don't have an M.2 MT7921 module at present by should have a
MT7921K-based PCIe card in a few days. I'll test all the patches with
that.

[1] https://alfa-network.eu/wi-fi/wi-fi-adapters/alfa-usb-adapter-awus036axml
[2] https://github.com/morrownr/USB-WiFi/blob/main/home/USB_WiFi_Adapters_that_are_supported_with_Linux_in-kernel_drivers.md
[3] https://lore.kernel.org/linux-bluetooth/ZlsfLwqWRUYV25Lz at mdpsys.co.uk/
[4] https://lore.kernel.org/linux-bluetooth/ZsTh7Jyug7MbZsLE at mdpsys.co.uk/

Regards,

Marc

> 
> BRs,
> Chris
> 
> system has an Intel AX211 fitted so I have disabled it's bluetooth
> functionality in the UEFI setup.
> 
> Hope this helps.
> 
> >
> > BRs,
> > Chris Lu
> 
> Regards,
> 
> Marc
> 
> 
> [    0.000000] Linux version 6.11.0-rc7-00001-g0e2ad6528188-dirty (marcp at mdp-archnuc<mailto:marcp at mdp-archnuc>) (gcc (GCC) 14.2.1 20240805, GNU ld (GNU Binutils) 2.43.0) #71 SMP PREEMPT_DYNAMIC Mon Sep  9 23:22:56 BST 2024
> [    0.000000] Command line: root=UUID=0420afc7-4947-4e2e-a096-b607b8b7fd93 rw quiet initrd=boot\intel-ucode.img initrd=boot\initramfs-linux611.img resume=UUID=0420afc7-4947-4e2e-a096-b607b8b7fd93 resume_offset=106496
> [    0.000000] x86/split lock detection: #AC: crashing the kernel on kernel split_locks and warning on user-space split_locks
> [    0.000000] BIOS-provided physical RAM map:
> [    0.000000] BIOS-e820: [mem 0x0000000000000000-0x000000000009dfff] usable
> [    0.000000] BIOS-e820: [mem 0x000000000009e000-0x000000000009efff] reserved
> [    0.000000] BIOS-e820: [mem 0x000000000009f000-0x000000000009ffff] usable
> [    0.000000] BIOS-e820: [mem 0x00000000000a0000-0x00000000000fffff] reserved
> [    0.000000] BIOS-e820: [mem 0x0000000000100000-0x000000004dd45fff] usable
> [    0.000000] BIOS-e820: [mem 0x000000004dd46000-0x0000000056c70fff] reserved
> [    0.000000] BIOS-e820: [mem 0x0000000056c71000-0x0000000056d48fff] ACPI data
> [    0.000000] BIOS-e820: [mem 0x0000000056d49000-0x0000000056ecefff] ACPI NVS
> [    0.000000] BIOS-e820: [mem 0x0000000056ecf000-0x000000005a7fefff] reserved
> [    0.000000] BIOS-e820: [mem 0x000000005a7ff000-0x000000005a7fffff] usable
> [    0.000000] BIOS-e820: [mem 0x000000005a800000-0x00000000611fffff] reserved
> [    0.000000] BIOS-e820: [mem 0x0000000061e00000-0x00000000687fffff] reserved
> [    0.000000] BIOS-e820: [mem 0x00000000c0000000-0x00000000cfffffff] reserved
> [    0.000000] BIOS-e820: [mem 0x00000000fe000000-0x00000000fe010fff] reserved
> [    0.000000] BIOS-e820: [mem 0x00000000fec00000-0x00000000fec00fff] reserved
> [    0.000000] BIOS-e820: [mem 0x00000000fed00000-0x00000000fed00fff] reserved
> [    0.000000] BIOS-e820: [mem 0x00000000fed20000-0x00000000fed7ffff] reserved
> [    0.000000] BIOS-e820: [mem 0x00000000fee00000-0x00000000fee00fff] reserved
> [    0.000000] BIOS-e820: [mem 0x00000000ff000000-0x00000000ffffffff] reserved
> [    0.000000] BIOS-e820: [mem 0x0000000100000000-0x00000010977fffff] usable
> [    0.000000] NX (Execute Disable) protection: active
> [    0.000000] APIC: Static calls initialized
> [    0.000000] efi: EFI v2.8 by American Megatrends
> [    0.000000] efi: ACPI=0x56e48000 ACPI 2.0=0x56e48014 TPMFinalLog=0x56db4000 SMBIOS=0x5a483000 SMBIOS 3.0=0x5a482000 MEMATTR=0x4485d118 ESRT=0x43ea7e98 INITRD=0x41e12e98 RNG=0x56c9b018 TPMEventLog=0x41dd5018
> [    0.000000] random: crng init done
> [    0.000000] efi: Remove mem115: MMIO range=[0xc0000000-0xcfffffff] (256MB) from e820 map
> [    0.000000] e820: remove [mem 0xc0000000-0xcfffffff] reserved
> [    0.000000] efi: Not removing mem116: MMIO range=[0xfe000000-0xfe010fff] (68KB) from e820 map
> [    0.000000] efi: Not removing mem117: MMIO range=[0xfec00000-0xfec00fff] (4KB) from e820 map
> [    0.000000] efi: Not removing mem118: MMIO range=[0xfed00000-0xfed00fff] (4KB) from e820 map
> [    0.000000] efi: Not removing mem120: MMIO range=[0xfee00000-0xfee00fff] (4KB) from e820 map
> [    0.000000] efi: Remove mem121: MMIO range=[0xff000000-0xffffffff] (16MB) from e820 map
> [    0.000000] e820: remove [mem 0xff000000-0xffffffff] reserved
> [    0.000000] SMBIOS 3.5.0 present.
> [    0.000000] DMI: Intel(R) Client Systems NUC12WSHi7/NUC12WSBi7, BIOS WSADL357.0088.2023.0505.1623 05/05/2023
> [    0.000000] DMI: Memory slots populated: 2/2
> [    0.000000] tsc: Detected 2500.000 MHz processor
> [    0.000000] tsc: Detected 2496.000 MHz TSC
> [    0.000549] e820: update [mem 0x00000000-0x00000fff] usable ==> reserved
> [    0.000550] e820: remove [mem 0x000a0000-0x000fffff] usable
> [    0.000555] last_pfn = 0x1097800 max_arch_pfn = 0x400000000
> [    0.000558] MTRR map: 5 entries (3 fixed + 2 variable; max 23), built from 10 variable MTRRs
> [    0.000559] x86/PAT: Configuration [0-7]: WB  WC  UC- UC  WB  WP  UC- WT
> [    0.000935] last_pfn = 0x5a800 max_arch_pfn = 0x400000000
> [    0.014044] esrt: Reserving ESRT space from 0x0000000043ea7e98 to 0x0000000043ea7f98.
> [    0.014049] e820: update [mem 0x43ea7000-0x43ea7fff] usable ==> reserved
> [    0.014062] Using GB pages for direct mapping
> [    0.014063] Incomplete global flushes, disabling PCID
> [    0.014285] Secure boot disabled
> [    0.014285] RAMDISK: [mem 0x39be8000-0x4039cfff]
> [    0.014312] ACPI: Early table checksum verification disabled
> [    0.014315] ACPI: RSDP 0x0000000056E48014 000024 (v02 INTEL )
> [    0.014318] ACPI: XSDT 0x0000000056DE4728 000114 (v01 INTEL  NUCxi7A5 00000058 AMI  01000013)
> [    0.014322] ACPI: FACP 0x0000000056D46000 000114 (v06 INTEL  NUCxi7A5 00000058 AMI  01000013)
> [    0.014326] ACPI: DSDT 0x0000000056CD9000 06CECF (v02 INTEL  NUCxi7A5 00000058 INTL 20200717)
> [    0.014328] ACPI: FACS 0x0000000056ECC000 000040
> [    0.014329] ACPI: FIDT 0x0000000056CD8000 00009C (v01 INTEL  NUCxi7A5 00000058 AMI  00010013)
> [    0.014331] ACPI: SSDT 0x0000000056D48000 00038C (v02 INTEL  NUCxi7A5 00000058 INTL 20200717)
> [    0.014333] ACPI: SSDT 0x0000000056CD2000 005D2C (v02 INTEL  NUCxi7A5 00000058 INTL 20200717)
> [    0.014335] ACPI: SSDT 0x0000000056CCF000 002AA1 (v02 INTEL  NUCxi7A5 00000058 INTL 20200717)
> [    0.014337] ACPI: SSDT 0x0000000056CCB000 0033D3 (v02 INTEL  NUCxi7A5 00000058 INTL 20200717)
> [    0.014339] ACPI: SSDT 0x0000000056CBD000 00D39F (v02 INTEL  NUCxi7A5 00001000 INTL 20200717)
> [    0.014341] ACPI: HPET 0x0000000056D47000 000038 (v01 INTEL  NUCxi7A5 00000058 AMI  01000013)
> [    0.014343] ACPI: APIC 0x0000000056CBC000 0001DC (v05 INTEL  NUCxi7A5 00000058 AMI  01000013)
> [    0.014344] ACPI: MCFG 0x0000000056CBB000 00003C (v01 INTEL  NUCxi7A5 00000058 AMI  01000013)
> [    0.014346] ACPI: SSDT 0x0000000056CB9000 001F04 (v02 INTEL  NUCxi7A5 00000058 INTL 20200717)
> [    0.014348] ACPI: SSDT 0x0000000056CB7000 001DFD (v02 INTEL  NUCxi7A5 00000058 INTL 20200717)
> [    0.014350] ACPI: UEFI 0x0000000056D9B000 000048 (v01 INTEL  NUCxi7A5 00000058 AMI  01000013)
> [    0.014352] ACPI: NHLT 0x0000000056CB6000 0002F1 (v00 INTEL  NUCxi7A5 00000058 AMI  01000013)
> [    0.014353] ACPI: LPIT 0x0000000056CB5000 0000CC (v01 INTEL  NUCxi7A5 00000058 AMI  01000013)
> [    0.014355] ACPI: WDAT 0x0000000056CB3000 000134 (v01 INTEL  NUCxi7A5 00000058 AMI  01000013)
> [    0.014357] ACPI: SSDT 0x0000000056CB0000 002A83 (v02 INTEL  NUCxi7A5 00000058 INTL 20200717)
> [    0.014359] ACPI: SSDT 0x0000000056CAD000 002357 (v02 INTEL  NUCxi7A5 00000058 INTL 20200717)
> [    0.014361] ACPI: DBGP 0x0000000056CAC000 000034 (v01 INTEL  NUCxi7A5 00000058 AMI  01000013)
> [    0.014363] ACPI: DBG2 0x0000000056CAB000 000054 (v00 INTEL  NUCxi7A5 00000058 AMI  01000013)
> [    0.014364] ACPI: DMAR 0x0000000056CAA000 000088 (v02 INTEL  NUCxi7A5 00000058      01000013)
> [    0.014366] ACPI: FPDT 0x0000000056CA9000 000044 (v01 INTEL  NUCxi7A5 00000058 AMI  01000013)
> [    0.014368] ACPI: SSDT 0x0000000056CA8000 000D56 (v02 INTEL  NUCxi7A5 00000058 INTL 20200717)
> [    0.014370] ACPI: SSDT 0x0000000056CA4000 003AEA (v02 INTEL  NUCxi7A5 00000058 INTL 20200717)
> [    0.014372] ACPI: SSDT 0x0000000056CA0000 0035A2 (v02 INTEL  NUCxi7A5 00000058 INTL 20200717)
> [    0.014374] ACPI: SSDT 0x0000000056C9F000 000144 (v02 INTEL  NUCxi7A5 00000058 INTL 20200717)
> [    0.014376] ACPI: BGRT 0x0000000056C9E000 000038 (v01 INTEL  NUCxi7A5 00000058 AMI  00010013)
> [    0.014377] ACPI: TPM2 0x0000000056C9D000 00004C (v04 INTEL  NUCxi7A5 00000058 AMI  00000000)
> [    0.014379] ACPI: PHAT 0x0000000056C9C000 00062D (v01 INTEL  NUCxi7A5 00000058 MSFT 0100000D)
> [    0.014381] ACPI: WSMT 0x0000000056CB4000 000028 (v01 INTEL  NUCxi7A5 00000058 AMI  00010013)
> [    0.014383] ACPI: Reserving FACP table memory at [mem 0x56d46000-0x56d46113]
> [    0.014384] ACPI: Reserving DSDT table memory at [mem 0x56cd9000-0x56d45ece]
> [    0.014384] ACPI: Reserving FACS table memory at [mem 0x56ecc000-0x56ecc03f]
> [    0.014385] ACPI: Reserving FIDT table memory at [mem 0x56cd8000-0x56cd809b]
> [    0.014386] ACPI: Reserving SSDT table memory at [mem 0x56d48000-0x56d4838b]
> [    0.014386] ACPI: Reserving SSDT table memory at [mem 0x56cd2000-0x56cd7d2b]
> [    0.014387] ACPI: Reserving SSDT table memory at [mem 0x56ccf000-0x56cd1aa0]
> [    0.014387] ACPI: Reserving SSDT table memory at [mem 0x56ccb000-0x56cce3d2]
> [    0.014388] ACPI: Reserving SSDT table memory at [mem 0x56cbd000-0x56cca39e]
> [    0.014388] ACPI: Reserving HPET table memory at [mem 0x56d47000-0x56d47037]
> [    0.014389] ACPI: Reserving APIC table memory at [mem 0x56cbc000-0x56cbc1db]
> [    0.014389] ACPI: Reserving MCFG table memory at [mem 0x56cbb000-0x56cbb03b]
> [    0.014390] ACPI: Reserving SSDT table memory at [mem 0x56cb9000-0x56cbaf03]
> [    0.014390] ACPI: Reserving SSDT table memory at [mem 0x56cb7000-0x56cb8dfc]
> [    0.014391] ACPI: Reserving UEFI table memory at [mem 0x56d9b000-0x56d9b047]
> [    0.014391] ACPI: Reserving NHLT table memory at [mem 0x56cb6000-0x56cb62f0]
> [    0.014392] ACPI: Reserving LPIT table memory at [mem 0x56cb5000-0x56cb50cb]
> [    0.014392] ACPI: Reserving WDAT table memory at [mem 0x56cb3000-0x56cb3133]
> [    0.014393] ACPI: Reserving SSDT table memory at [mem 0x56cb0000-0x56cb2a82]
> [    0.014393] ACPI: Reserving SSDT table memory at [mem 0x56cad000-0x56caf356]
> [    0.014394] ACPI: Reserving DBGP table memory at [mem 0x56cac000-0x56cac033]
> [    0.014394] ACPI: Reserving DBG2 table memory at [mem 0x56cab000-0x56cab053]
> [    0.014395] ACPI: Reserving DMAR table memory at [mem 0x56caa000-0x56caa087]
> [    0.014395] ACPI: Reserving FPDT table memory at [mem 0x56ca9000-0x56ca9043]
> [    0.014396] ACPI: Reserving SSDT table memory at [mem 0x56ca8000-0x56ca8d55]
> [    0.014396] ACPI: Reserving SSDT table memory at [mem 0x56ca4000-0x56ca7ae9]
> [    0.014397] ACPI: Reserving SSDT table memory at [mem 0x56ca0000-0x56ca35a1]
> [    0.014397] ACPI: Reserving SSDT table memory at [mem 0x56c9f000-0x56c9f143]
> [    0.014398] ACPI: Reserving BGRT table memory at [mem 0x56c9e000-0x56c9e037]
> [    0.014398] ACPI: Reserving TPM2 table memory at [mem 0x56c9d000-0x56c9d04b]
> [    0.014399] ACPI: Reserving PHAT table memory at [mem 0x56c9c000-0x56c9c62c]
> [    0.014400] ACPI: Reserving WSMT table memory at [mem 0x56cb4000-0x56cb4027]
> [    0.014743] No NUMA configuration found
> [    0.014744] Faking a node at [mem 0x0000000000000000-0x00000010977fffff]
> [    0.014746] NODE_DATA(0) allocated [mem 0x10977fb000-0x10977fffff]
> [    0.014795] Zone ranges:
> [    0.014796]   DMA      [mem 0x0000000000001000-0x0000000000ffffff]
> [    0.014797]   DMA32    [mem 0x0000000001000000-0x00000000ffffffff]
> [    0.014798]   Normal   [mem 0x0000000100000000-0x00000010977fffff]
> [    0.014799]   Device   empty
> [    0.014799] Movable zone start for each node
> [    0.014800] Early memory node ranges
> [    0.014800]   node   0: [mem 0x0000000000001000-0x000000000009dfff]
> [    0.014801]   node   0: [mem 0x000000000009f000-0x000000000009ffff]
> [    0.014801]   node   0: [mem 0x0000000000100000-0x000000004dd45fff]
> [    0.014802]   node   0: [mem 0x000000005a7ff000-0x000000005a7fffff]
> [    0.014802]   node   0: [mem 0x0000000100000000-0x00000010977fffff]
> [    0.014805] Initmem setup node 0 [mem 0x0000000000001000-0x00000010977fffff]
> [    0.014808] On node 0, zone DMA: 1 pages in unavailable ranges
> [    0.014809] On node 0, zone DMA: 1 pages in unavailable ranges
> [    0.014821] On node 0, zone DMA: 96 pages in unavailable ranges
> [    0.015998] On node 0, zone DMA32: 19129 pages in unavailable ranges
> [    0.078525] On node 0, zone Normal: 22528 pages in unavailable ranges
> [    0.078536] On node 0, zone Normal: 2048 pages in unavailable ranges
> [    0.078567] Reserving Intel graphics memory at [mem 0x64800000-0x687fffff]
> [    0.080194] ACPI: PM-Timer IO Port: 0x1808
> [    0.080199] ACPI: LAPIC_NMI (acpi_id[0x01] high edge lint[0x1])
> [    0.080200] ACPI: LAPIC_NMI (acpi_id[0x02] high edge lint[0x1])
> [    0.080200] ACPI: LAPIC_NMI (acpi_id[0x03] high edge lint[0x1])
> [    0.080201] ACPI: LAPIC_NMI (acpi_id[0x04] high edge lint[0x1])
> [    0.080201] ACPI: LAPIC_NMI (acpi_id[0x05] high edge lint[0x1])
> [    0.080201] ACPI: LAPIC_NMI (acpi_id[0x06] high edge lint[0x1])
> [    0.080202] ACPI: LAPIC_NMI (acpi_id[0x07] high edge lint[0x1])
> [    0.080202] ACPI: LAPIC_NMI (acpi_id[0x08] high edge lint[0x1])
> [    0.080203] ACPI: LAPIC_NMI (acpi_id[0x09] high edge lint[0x1])
> [    0.080203] ACPI: LAPIC_NMI (acpi_id[0x0a] high edge lint[0x1])
> [    0.080203] ACPI: LAPIC_NMI (acpi_id[0x0b] high edge lint[0x1])
> [    0.080204] ACPI: LAPIC_NMI (acpi_id[0x0c] high edge lint[0x1])
> [    0.080204] ACPI: LAPIC_NMI (acpi_id[0x0d] high edge lint[0x1])
> [    0.080205] ACPI: LAPIC_NMI (acpi_id[0x0e] high edge lint[0x1])
> [    0.080205] ACPI: LAPIC_NMI (acpi_id[0x0f] high edge lint[0x1])
> [    0.080205] ACPI: LAPIC_NMI (acpi_id[0x10] high edge lint[0x1])
> [    0.080206] ACPI: LAPIC_NMI (acpi_id[0x11] high edge lint[0x1])
> [    0.080206] ACPI: LAPIC_NMI (acpi_id[0x12] high edge lint[0x1])
> [    0.080207] ACPI: LAPIC_NMI (acpi_id[0x13] high edge lint[0x1])
> [    0.080207] ACPI: LAPIC_NMI (acpi_id[0x14] high edge lint[0x1])
> [    0.080207] ACPI: LAPIC_NMI (acpi_id[0x15] high edge lint[0x1])
> [    0.080208] ACPI: LAPIC_NMI (acpi_id[0x16] high edge lint[0x1])
> [    0.080208] ACPI: LAPIC_NMI (acpi_id[0x17] high edge lint[0x1])
> [    0.080209] ACPI: LAPIC_NMI (acpi_id[0x00] high edge lint[0x1])
> [    0.080291] IOAPIC[0]: apic_id 2, version 32, address 0xfec00000, GSI 0-119
> [    0.080293] ACPI: INT_SRC_OVR (bus 0 bus_irq 0 global_irq 2 dfl dfl)
> [    0.080294] ACPI: INT_SRC_OVR (bus 0 bus_irq 9 global_irq 9 high level)
> [    0.080296] ACPI: Using ACPI (MADT) for SMP configuration information
> [    0.080297] ACPI: HPET id: 0x8086a201 base: 0xfed00000
> [    0.080302] e820: update [mem 0x444e6000-0x44584fff] usable ==> reserved
> [    0.080309] TSC deadline timer available
> [    0.080311] CPU topo: Max. logical packages:   1
> [    0.080311] CPU topo: Max. logical dies:       1
> [    0.080312] CPU topo: Max. dies per package:   1
> [    0.080313] CPU topo: Max. threads per core:   2
> [    0.080314] CPU topo: Num. cores per package:    12
> [    0.080314] CPU topo: Num. threads per package:  16
> [    0.080314] CPU topo: Allowing 16 present CPUs plus 0 hotplug CPUs
> [    0.080325] PM: hibernation: Registered nosave memory: [mem 0x00000000-0x00000fff]
> [    0.080326] PM: hibernation: Registered nosave memory: [mem 0x0009e000-0x0009efff]
> [    0.080327] PM: hibernation: Registered nosave memory: [mem 0x000a0000-0x000fffff]
> [    0.080328] PM: hibernation: Registered nosave memory: [mem 0x43ea7000-0x43ea7fff]
> [    0.080329] PM: hibernation: Registered nosave memory: [mem 0x444e6000-0x44584fff]
> [    0.080330] PM: hibernation: Registered nosave memory: [mem 0x4dd46000-0x56c70fff]
> [    0.080330] PM: hibernation: Registered nosave memory: [mem 0x56c71000-0x56d48fff]
> [    0.080331] PM: hibernation: Registered nosave memory: [mem 0x56d49000-0x56ecefff]
> [    0.080331] PM: hibernation: Registered nosave memory: [mem 0x56ecf000-0x5a7fefff]
> [    0.080332] PM: hibernation: Registered nosave memory: [mem 0x5a800000-0x611fffff]
> [    0.080332] PM: hibernation: Registered nosave memory: [mem 0x61200000-0x61dfffff]
> [    0.080333] PM: hibernation: Registered nosave memory: [mem 0x61e00000-0x687fffff]
> [    0.080333] PM: hibernation: Registered nosave memory: [mem 0x68800000-0xfdffffff]
> [    0.080333] PM: hibernation: Registered nosave memory: [mem 0xfe000000-0xfe010fff]
> [    0.080334] PM: hibernation: Registered nosave memory: [mem 0xfe011000-0xfebfffff]
> [    0.080334] PM: hibernation: Registered nosave memory: [mem 0xfec00000-0xfec00fff]
> [    0.080334] PM: hibernation: Registered nosave memory: [mem 0xfec01000-0xfecfffff]
> [    0.080335] PM: hibernation: Registered nosave memory: [mem 0xfed00000-0xfed00fff]
> [    0.080335] PM: hibernation: Registered nosave memory: [mem 0xfed01000-0xfed1ffff]
> [    0.080336] PM: hibernation: Registered nosave memory: [mem 0xfed20000-0xfed7ffff]
> [    0.080336] PM: hibernation: Registered nosave memory: [mem 0xfed80000-0xfedfffff]
> [    0.080336] PM: hibernation: Registered nosave memory: [mem 0xfee00000-0xfee00fff]
> [    0.080337] PM: hibernation: Registered nosave memory: [mem 0xfee01000-0xffffffff]
> [    0.080338] [mem 0x68800000-0xfdffffff] available for PCI devices
> [    0.080339] Booting paravirtualized kernel on bare hardware
> [    0.080340] clocksource: refined-jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 6370452778343963 ns
> [    0.084163] setup_percpu: NR_CPUS:320 nr_cpumask_bits:16 nr_cpu_ids:16 nr_node_ids:1
> [    0.084800] percpu: Embedded 66 pages/cpu s233472 r8192 d28672 u524288
> [    0.084804] pcpu-alloc: s233472 r8192 d28672 u524288 alloc=1*2097152
> [    0.084806] pcpu-alloc: [0] 00 01 02 03 [0] 04 05 06 07
> [    0.084809] pcpu-alloc: [0] 08 09 10 11 [0] 12 13 14 15
> [    0.084820] Kernel command line: root=UUID=0420afc7-4947-4e2e-a096-b607b8b7fd93 rw quiet initrd=boot\intel-ucode.img initrd=boot\initramfs-linux611.img resume=UUID=0420afc7-4947-4e2e-a096-b607b8b7fd93 resume_offset=106496
> [    0.088825] Dentry cache hash table entries: 8388608 (order: 14, 67108864 bytes, linear)
> [    0.090830] Inode-cache hash table entries: 4194304 (order: 13, 33554432 bytes, linear)
> [    0.090938] Fallback order for Node 0: 0
> [    0.090940] Built 1 zonelists, mobility grouping on.  Total pages: 16667877
> [    0.090941] Policy zone: Normal
> [    0.091110] mem auto-init: stack:all(zero), heap alloc:on, heap free:off
> [    0.091117] software IO TLB: area num 16.
> [    0.174200] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=16, Nodes=1
> [    0.174233] ftrace: allocating 50629 entries in 198 pages
> [    0.178623] ftrace: allocated 198 pages with 4 groups
> [    0.178673] Dynamic Preempt: full
> [    0.178715] rcu: Preemptible hierarchical RCU implementation.
> [    0.178716] rcu: RCU restricting CPUs from NR_CPUS=320 to nr_cpu_ids=16.
> [    0.178716] rcu: RCU priority boosting: priority 1 delay 500 ms.
> [    0.178717] Trampoline variant of Tasks RCU enabled.
> [    0.178718] Rude variant of Tasks RCU enabled.
> [    0.178718] Tracing variant of Tasks RCU enabled.
> [    0.178718] rcu: RCU calculated value of scheduler-enlistment delay is 30 jiffies.
> [    0.178719] rcu: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=16
> [    0.178727] RCU Tasks: Setting shift to 4 and lim to 1 rcu_task_cb_adjust=1.
> [    0.178728] RCU Tasks Rude: Setting shift to 4 and lim to 1 rcu_task_cb_adjust=1.
> [    0.178729] RCU Tasks Trace: Setting shift to 4 and lim to 1 rcu_task_cb_adjust=1.
> [    0.181066] NR_IRQS: 20736, nr_irqs: 2184, preallocated irqs: 16
> [    0.181413] rcu: srcu_init: Setting srcu_struct sizes based on contention.
> [    0.181851] kfence: initialized - using 2097152 bytes for 255 objects at 0x(____ptrval____)-0x(____ptrval____)
> [    0.181876] Console: colour dummy device 80x25
> [    0.181878] printk: legacy console [tty0] enabled
> [    0.181906] ACPI: Core revision 20240322
> [    0.182096] hpet: HPET dysfunctional in PC10. Force disabled.
> [    0.182097] APIC: Switch to symmetric I/O mode setup
> [    0.182099] DMAR: Host address width 39
> [    0.182099] DMAR: DRHD base: 0x000000fed90000 flags: 0x0
> [    0.182103] DMAR: dmar0: reg_base_addr fed90000 ver 4:0 cap 1c0000c40660462 ecap 29a00f0505e
> [    0.182104] DMAR: DRHD base: 0x000000fed91000 flags: 0x1
> [    0.182107] DMAR: dmar1: reg_base_addr fed91000 ver 5:0 cap d2008c40660462 ecap f050da
> [    0.182109] DMAR: RMRR base: 0x00000064000000 end: 0x000000687fffff
> [    0.182111] DMAR-IR: IOAPIC id 2 under DRHD base  0xfed91000 IOMMU 1
> [    0.182112] DMAR-IR: HPET id 0 under DRHD base 0xfed91000
> [    0.182112] DMAR-IR: Queued invalidation will be enabled to support x2apic and Intr-remapping.
> [    0.186032] DMAR-IR: Enabled IRQ remapping in x2apic mode
> [    0.186034] x2apic enabled
> [    0.186100] APIC: Switched APIC routing to: cluster x2apic
> [    0.197380] clocksource: tsc-early: mask: 0xffffffffffffffff max_cycles: 0x23fa772cf26, max_idle_ns: 440795269835 ns
> [    0.197384] Calibrating delay loop (skipped), value calculated using timer frequency.. 4993.00 BogoMIPS (lpj=8320000)
> [    0.197430] CPU0: Thermal monitoring enabled (TM1)
> [    0.197431] x86/cpu: User Mode Instruction Prevention (UMIP) activated
> [    0.197530] CET detected: Indirect Branch Tracking enabled
> [    0.197532] Last level iTLB entries: 4KB 0, 2MB 0, 4MB 0
> [    0.197532] Last level dTLB entries: 4KB 0, 2MB 0, 4MB 0, 1GB 0
> [    0.197534] process: using mwait in idle threads
> [    0.197536] Spectre V1 : Mitigation: usercopy/swapgs barriers and __user pointer sanitization
> [    0.197537] Spectre V2 : Mitigation: Enhanced / Automatic IBRS
> [    0.197538] Spectre V2 : Spectre v2 / SpectreRSB mitigation: Filling RSB on context switch
> [    0.197538] Spectre V2 : Spectre v2 / PBRSB-eIBRS: Retire a single CALL on VMEXIT
> [    0.197539] Spectre V2 : mitigation: Enabling conditional Indirect Branch Prediction Barrier
> [    0.197540] Speculative Store Bypass: Mitigation: Speculative Store Bypass disabled via prctl
> [    0.197541] Register File Data Sampling: Mitigation: Clear Register File
> [    0.197547] x86/fpu: Supporting XSAVE feature 0x001: 'x87 floating point registers'
> [    0.197548] x86/fpu: Supporting XSAVE feature 0x002: 'SSE registers'
> [    0.197548] x86/fpu: Supporting XSAVE feature 0x004: 'AVX registers'
> [    0.197549] x86/fpu: Supporting XSAVE feature 0x200: 'Protection Keys User registers'
> [    0.197549] x86/fpu: Supporting XSAVE feature 0x800: 'Control-flow User registers'
> [    0.197550] x86/fpu: xstate_offset[2]:  576, xstate_sizes[2]:  256
> [    0.197551] x86/fpu: xstate_offset[9]:  832, xstate_sizes[9]:    8
> [    0.197551] x86/fpu: xstate_offset[11]:  840, xstate_sizes[11]:   16
> [    0.197552] x86/fpu: Enabled xstate features 0xa07, context size is 856 bytes, using 'compacted' format.
> [    0.200716] Freeing SMP alternatives memory: 40K
> [    0.200716] pid_max: default: 32768 minimum: 301
> [    0.200716] LSM: initializing lsm=capability,landlock,lockdown,yama,bpf
> [    0.200716] landlock: Up and running.
> [    0.200716] Yama: becoming mindful.
> [    0.200716] LSM support for eBPF active
> [    0.200716] Mount-cache hash table entries: 131072 (order: 8, 1048576 bytes, linear)
> [    0.200716] Mountpoint-cache hash table entries: 131072 (order: 8, 1048576 bytes, linear)
> [    0.200716] smpboot: CPU0: 12th Gen Intel(R) Core(TM) i7-1260P (family: 0x6, model: 0x9a, stepping: 0x3)
> [    0.200716] Performance Events: XSAVE Architectural LBR, PEBS fmt4+-baseline,  AnyThread deprecated, Alderlake Hybrid events, 32-deep LBR, full-width counters, Intel PMU driver.
> [    0.200716] core: cpu_core PMU driver:
> [    0.200716] ... version:                5
> [    0.200716] ... bit width:              48
> [    0.200716] ... generic registers:      8
> [    0.200716] ... value mask:             0000ffffffffffff
> [    0.200716] ... max period:             00007fffffffffff
> [    0.200716] ... fixed-purpose events:   4
> [    0.200716] ... event mask:             0001000f000000ff
> [    0.200716] signal: max sigframe size: 3632
> [    0.200716] Estimated ratio of average max frequency by base frequency (times 1024): 1556
> [    0.200716] rcu: Hierarchical SRCU implementation.
> [    0.200716] rcu: Max phase no-delay instances is 1000.
> [    0.200716] Timer migration: 2 hierarchy levels; 8 children per group; 2 crossnode level
> [    0.200716] NMI watchdog: Enabled. Permanently consumes one hw-PMU counter.
> [    0.200716] smp: Bringing up secondary CPUs ...
> [    0.200716] smpboot: x86: Booting SMP configuration:
> [    0.200716] .... node  #0, CPUs:        #2  #4  #6  #8  #9 #10 #11 #12 #13 #14 #15
> [    0.018930] core: cpu_atom PMU driver: PEBS-via-PT
> [    0.018930] ... version:                5
> [    0.018930] ... bit width:              48
> [    0.018930] ... generic registers:      6
> [    0.018930] ... value mask:             0000ffffffffffff
> [    0.018930] ... max period:             00007fffffffffff
> [    0.018930] ... fixed-purpose events:   3
> [    0.018930] ... event mask:             000000070000003f
> [    0.210777]   #1  #3  #5  #7
> [    0.215011] smp: Brought up 1 node, 16 CPUs
> [    0.215011] smpboot: Total of 16 processors activated (79903.00 BogoMIPS)
> [    0.217482] Memory: 65276284K/66671508K available (18432K kernel code, 2185K rwdata, 13516K rodata, 3452K init, 3432K bss, 1370520K reserved, 0K cma-reserved)
> [    0.218690] devtmpfs: initialized
> [    0.218690] x86/mm: Memory block size: 2048MB
> [    0.218690] ACPI: PM: Registering ACPI NVS region [mem 0x56d49000-0x56ecefff] (1597440 bytes)
> [    0.218690] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 6370867519511994 ns
> [    0.218690] futex hash table entries: 4096 (order: 6, 262144 bytes, linear)
> [    0.218690] pinctrl core: initialized pinctrl subsystem
> [    0.218690] PM: RTC time: 15:43:42, date: 2024-09-17
> [    0.218690] NET: Registered PF_NETLINK/PF_ROUTE protocol family
> [    0.218690] DMA: preallocated 4096 KiB GFP_KERNEL pool for atomic allocations
> [    0.218815] DMA: preallocated 4096 KiB GFP_KERNEL|GFP_DMA pool for atomic allocations
> [    0.220935] DMA: preallocated 4096 KiB GFP_KERNEL|GFP_DMA32 pool for atomic allocations
> [    0.220946] audit: initializing netlink subsys (disabled)
> [    0.220955] audit: type=2000 audit(1726587822.023:1): state=initialized audit_enabled=0 res=1
> [    0.220955] thermal_sys: Registered thermal governor 'fair_share'
> [    0.220955] thermal_sys: Registered thermal governor 'bang_bang'
> [    0.220955] thermal_sys: Registered thermal governor 'step_wise'
> [    0.220955] thermal_sys: Registered thermal governor 'user_space'
> [    0.220955] thermal_sys: Registered thermal governor 'power_allocator'
> [    0.220955] cpuidle: using governor ladder
> [    0.220955] cpuidle: using governor menu
> [    0.220955] acpiphp: ACPI Hot Plug PCI Controller Driver version: 0.5
> [    0.220955] PCI: ECAM [mem 0xc0000000-0xcfffffff] (base 0xc0000000) for domain 0000 [bus 00-ff]
> [    0.220955] PCI: Using configuration type 1 for base access
> [    0.220955] kprobes: kprobe jump-optimization is enabled. All kprobes are optimized if possible.
> [    0.224191] HugeTLB: registered 1.00 GiB page size, pre-allocated 0 pages
> [    0.224191] HugeTLB: 16380 KiB vmemmap can be freed for a 1.00 GiB page
> [    0.224191] HugeTLB: registered 2.00 MiB page size, pre-allocated 0 pages
> [    0.224191] HugeTLB: 28 KiB vmemmap can be freed for a 2.00 MiB page
> [    0.224500] ACPI: Added _OSI(Module Device)
> [    0.224500] ACPI: Added _OSI(Processor Device)
> [    0.224500] ACPI: Added _OSI(3.0 _SCP Extensions)
> [    0.224500] ACPI: Added _OSI(Processor Aggregator Device)
> [    0.312844] ACPI: 14 ACPI AML tables successfully acquired and loaded
> [    0.336673] ACPI: USB4 _OSC: OS supports USB3+ DisplayPort+ PCIe+ XDomain+
> [    0.336675] ACPI: USB4 _OSC: OS controls USB3+ DisplayPort+ PCIe+ XDomain+
> [    0.338150] ACPI: Dynamic OEM Table Load:
> [    0.338158] ACPI: SSDT 0xFFFF9118C178D400 000394 (v02 PmRef  Cpu0Cst  00003001 INTL 20200717)
> [    0.339255] ACPI: Dynamic OEM Table Load:
> [    0.339260] ACPI: SSDT 0xFFFF9118C1798000 0005E4 (v02 PmRef  Cpu0Ist  00003000 INTL 20200717)
> [    0.340384] ACPI: Dynamic OEM Table Load:
> [    0.340388] ACPI: SSDT 0xFFFF9118C2101200 0001AB (v02 PmRef  Cpu0Psd  00003000 INTL 20200717)
> [    0.341453] ACPI: Dynamic OEM Table Load:
> [    0.341457] ACPI: SSDT 0xFFFF9118C179B000 0004BA (v02 PmRef  Cpu0Hwp  00003000 INTL 20200717)
> [    0.342940] ACPI: Dynamic OEM Table Load:
> [    0.342947] ACPI: SSDT 0xFFFF9118C1784000 001BAF (v02 PmRef  ApIst    00003000 INTL 20200717)
> [    0.344827] ACPI: Dynamic OEM Table Load:
> [    0.344833] ACPI: SSDT 0xFFFF9118C1780000 001038 (v02 PmRef  ApHwp    00003000 INTL 20200717)
> [    0.346435] ACPI: Dynamic OEM Table Load:
> [    0.346441] ACPI: SSDT 0xFFFF9118C21C6000 001349 (v02 PmRef  ApPsd    00003000 INTL 20200717)
> [    0.347383] ACPI: Dynamic OEM Table Load:
> [    0.347383] ACPI: SSDT 0xFFFF9118C1797000 000FBB (v02 PmRef  ApCst    00003000 INTL 20200717)
> [    0.351835] ACPI: EC: EC started
> [    0.351836] ACPI: EC: interrupt blocked
> [    0.352497] ACPI: EC: EC_CMD/EC_SC=0x66, EC_DATA=0x62
> [    0.352499] ACPI: \_SB_.PC00.LPCB.EC0_: Boot DSDT EC used to handle transactions
> [    0.352501] ACPI: Interpreter enabled
> [    0.352548] ACPI: PM: (supports S0 S3 S4 S5)
> [    0.352549] ACPI: Using IOAPIC for interrupt routing
> [    0.353800] PCI: Using host bridge windows from ACPI; if necessary, use "pci=nocrs" and report a bug
> [    0.353801] PCI: Ignoring E820 reservations for host bridge windows
> [    0.355184] ACPI: Enabled 7 GPEs in block 00 to 7F
> [    0.357600] ACPI: \_SB_.PC00.PEG0.PXP_: New power resource
> [    0.373986] ACPI: \_SB_.PC00.XHCI.RHUB.HS10.BTRT: New power resource
> [    0.374768] ACPI: \_SB_.PC00.PAUD: New power resource
> [    0.383767] ACPI: \_SB_.PC00.CNVW.WRST: New power resource
> [    0.392041] ACPI: \_SB_.PC00.TBT0: New power resource
> [    0.392349] ACPI: \_SB_.PC00.TBT1: New power resource
> [    0.392651] ACPI: \_SB_.PC00.D3C_: New power resource
> [    0.683890] ACPI: \_TZ_.FN00: New power resource
> [    0.683946] ACPI: \_TZ_.FN01: New power resource
> [    0.684000] ACPI: \_TZ_.FN02: New power resource
> [    0.684056] ACPI: \_TZ_.FN03: New power resource
> [    0.684110] ACPI: \_TZ_.FN04: New power resource
> [    0.684638] ACPI: \PIN_: New power resource
> [    0.685242] ACPI: PCI Root Bridge [PC00] (domain 0000 [bus 00-fe])
> [    0.685248] acpi PNP0A08:00: _OSC: OS supports [ExtendedConfig ASPM ClockPM Segments MSI EDR HPX-Type3]
> [    0.686937] acpi PNP0A08:00: _OSC: platform does not support [AER]
> [    0.690313] acpi PNP0A08:00: _OSC: OS now controls [PCIeHotplug SHPCHotplug PME PCIeCapability LTR DPC]
> [    0.692570] PCI host bridge to bus 0000:00
> [    0.692573] pci_bus 0000:00: root bus resource [io  0x0000-0x0cf7 window]
> [    0.692575] pci_bus 0000:00: root bus resource [io  0x0d00-0xffff window]
> [    0.692576] pci_bus 0000:00: root bus resource [mem 0x000a0000-0x000bffff window]
> [    0.692578] pci_bus 0000:00: root bus resource [mem 0x000e0000-0x000fffff window]
> [    0.692579] pci_bus 0000:00: root bus resource [mem 0x68800000-0xbfffffff window]
> [    0.692580] pci_bus 0000:00: root bus resource [mem 0x4000000000-0x7fffffffff window]
> [    0.692581] pci_bus 0000:00: root bus resource [bus 00-fe]
> [    0.692868] pci 0000:00:00.0: [8086:4621] type 00 class 0x060000 conventional PCI endpoint
> [    0.693054] pci 0000:00:02.0: [8086:46a6] type 00 class 0x030000 PCIe Root Complex Integrated Endpoint
> [    0.693062] pci 0000:00:02.0: BAR 0 [mem 0x603c000000-0x603cffffff 64bit]
> [    0.693067] pci 0000:00:02.0: BAR 2 [mem 0x4000000000-0x400fffffff 64bit pref]
> [    0.693070] pci 0000:00:02.0: BAR 4 [io  0x3000-0x303f]
> [    0.693084] pci 0000:00:02.0: DMAR: Skip IOMMU disabling for graphics
> [    0.693086] pci 0000:00:02.0: Video device with shadowed ROM at [mem 0x000c0000-0x000dffff]
> [    0.693109] pci 0000:00:02.0: VF BAR 0 [mem 0x00000000-0x00ffffff 64bit]
> [    0.693110] pci 0000:00:02.0: VF BAR 0 [mem 0x00000000-0x06ffffff 64bit]: contains BAR 0 for 7 VFs
> [    0.693114] pci 0000:00:02.0: VF BAR 2 [mem 0x00000000-0x1fffffff 64bit pref]
> [    0.693115] pci 0000:00:02.0: VF BAR 2 [mem 0x00000000-0xdfffffff 64bit pref]: contains BAR 2 for 7 VFs
> [    0.693336] pci 0000:00:06.0: [8086:464d] type 01 class 0x060400 PCIe Root Port
> [    0.693379] pci 0000:00:06.0: PCI bridge to [bus 01]
> [    0.693412] pci 0000:00:06.0:   bridge window [mem 0x84600000-0x846fffff]
> [    0.693547] pci 0000:00:06.0: PME# supported from D0 D3hot D3cold
> [    0.693596] pci 0000:00:06.0: PTM enabled (root), 4ns granularity
> [    0.694331] pci 0000:00:07.0: [8086:466e] type 01 class 0x060400 PCIe Root Port
> [    0.694351] pci 0000:00:07.0: PCI bridge to [bus 02-39]
> [    0.694355] pci 0000:00:07.0:   bridge window [mem 0x78000000-0x841fffff]
> [    0.694361] pci 0000:00:07.0:   bridge window [mem 0x6020000000-0x603bffffff 64bit pref]
> [    0.694383] pci 0000:00:07.0: Overriding RP PIO Log Size to 4
> [    0.694445] pci 0000:00:07.0: PME# supported from D0 D3hot D3cold
> [    0.694469] pci 0000:00:07.0: PTM enabled (root), 4ns granularity
> [    0.696553] pci 0000:00:07.2: [8086:462f] type 01 class 0x060400 PCIe Root Port
> [    0.696570] pci 0000:00:07.2: PCI bridge to [bus 3a-63]
> [    0.696574] pci 0000:00:07.2:   bridge window [mem 0x6a000000-0x761fffff]
> [    0.696580] pci 0000:00:07.2:   bridge window [mem 0x6000000000-0x601bffffff 64bit pref]
> [    0.696602] pci 0000:00:07.2: Overriding RP PIO Log Size to 4
> [    0.696664] pci 0000:00:07.2: PME# supported from D0 D3hot D3cold
> [    0.696688] pci 0000:00:07.2: PTM enabled (root), 4ns granularity
> [    0.698832] pci 0000:00:08.0: [8086:464f] type 00 class 0x088000 conventional PCI endpoint
> [    0.698840] pci 0000:00:08.0: BAR 0 [mem 0x603d1bb000-0x603d1bbfff 64bit]
> [    0.698934] pci 0000:00:0a.0: [8086:467d] type 00 class 0x118000 PCIe Root Complex Integrated Endpoint
> [    0.698941] pci 0000:00:0a.0: BAR 0 [mem 0x603d1a0000-0x603d1a7fff 64bit]
> [    0.698958] pci 0000:00:0a.0: enabling Extended Tags
> [    0.699060] pci 0000:00:0d.0: [8086:461e] type 00 class 0x0c0330 conventional PCI endpoint
> [    0.699069] pci 0000:00:0d.0: BAR 0 [mem 0x603d190000-0x603d19ffff 64bit]
> [    0.699109] pci 0000:00:0d.0: PME# supported from D3hot D3cold
> [    0.701032] pci 0000:00:0d.2: [8086:463e] type 00 class 0x0c0340 conventional PCI endpoint
> [    0.701045] pci 0000:00:0d.2: BAR 0 [mem 0x603d140000-0x603d17ffff 64bit]
> [    0.701051] pci 0000:00:0d.2: BAR 2 [mem 0x603d1ba000-0x603d1bafff 64bit]
> [    0.701083] pci 0000:00:0d.2: supports D1 D2
> [    0.701084] pci 0000:00:0d.2: PME# supported from D0 D1 D2 D3hot D3cold
> [    0.701215] pci 0000:00:0d.3: [8086:466d] type 00 class 0x0c0340 conventional PCI endpoint
> [    0.701225] pci 0000:00:0d.3: BAR 0 [mem 0x603d100000-0x603d13ffff 64bit]
> [    0.701231] pci 0000:00:0d.3: BAR 2 [mem 0x603d1b9000-0x603d1b9fff 64bit]
> [    0.701260] pci 0000:00:0d.3: supports D1 D2
> [    0.701261] pci 0000:00:0d.3: PME# supported from D0 D1 D2 D3hot D3cold
> [    0.701532] pci 0000:00:14.0: [8086:51ed] type 00 class 0x0c0330 conventional PCI endpoint
> [    0.701555] pci 0000:00:14.0: BAR 0 [mem 0x603d180000-0x603d18ffff 64bit]
> [    0.701655] pci 0000:00:14.0: PME# supported from D3hot D3cold
> [    0.703595] pci 0000:00:14.2: [8086:51ef] type 00 class 0x050000 conventional PCI endpoint
> [    0.703617] pci 0000:00:14.2: BAR 0 [mem 0x603d1b0000-0x603d1b3fff 64bit]
> [    0.703631] pci 0000:00:14.2: BAR 2 [mem 0x603d1b8000-0x603d1b8fff 64bit]
> [    0.703850] pci 0000:00:14.3: [8086:51f0] type 00 class 0x028000 PCIe Root Complex Integrated Endpoint
> [    0.703912] pci 0000:00:14.3: BAR 0 [mem 0x603d1ac000-0x603d1affff 64bit]
> [    0.707442] pci 0000:00:14.3: PME# supported from D0 D3hot D3cold
> [    0.708349] pci 0000:00:15.0: [8086:51e8] type 00 class 0x0c8000 conventional PCI endpoint
> [    0.709079] pci 0000:00:15.0: BAR 0 [mem 0x00000000-0x00000fff 64bit]
> [    0.712769] pci 0000:00:15.1: [8086:51e9] type 00 class 0x0c8000 conventional PCI endpoint
> [    0.713499] pci 0000:00:15.1: BAR 0 [mem 0x00000000-0x00000fff 64bit]
> [    0.716748] pci 0000:00:16.0: [8086:51e0] type 00 class 0x078000 conventional PCI endpoint
> [    0.716773] pci 0000:00:16.0: BAR 0 [mem 0x603d1b5000-0x603d1b5fff 64bit]
> [    0.716868] pci 0000:00:16.0: PME# supported from D3hot
> [    0.717491] pci 0000:00:17.0: [8086:51d3] type 00 class 0x010601 conventional PCI endpoint
> [    0.717511] pci 0000:00:17.0: BAR 0 [mem 0x84700000-0x84701fff]
> [    0.717522] pci 0000:00:17.0: BAR 1 [mem 0x84703000-0x847030ff]
> [    0.717533] pci 0000:00:17.0: BAR 2 [io  0x3090-0x3097]
> [    0.717543] pci 0000:00:17.0: BAR 3 [io  0x3080-0x3083]
> [    0.717554] pci 0000:00:17.0: BAR 4 [io  0x3060-0x307f]
> [    0.717564] pci 0000:00:17.0: BAR 5 [mem 0x84702000-0x847027ff]
> [    0.717645] pci 0000:00:17.0: PME# supported from D3hot
> [    0.718046] pci 0000:00:1d.0: [8086:51b0] type 01 class 0x060400 PCIe Root Port
> [    0.718078] pci 0000:00:1d.0: PCI bridge to [bus 64]
> [    0.718084] pci 0000:00:1d.0:   bridge window [mem 0x84400000-0x845fffff]
> [    0.718173] pci 0000:00:1d.0: PME# supported from D0 D3hot D3cold
> [    0.718212] pci 0000:00:1d.0: PTM enabled (root), 4ns granularity
> [    0.718877] pci 0000:00:1d.2: [8086:51b2] type 01 class 0x060400 PCIe Root Port
> [    0.718909] pci 0000:00:1d.2: PCI bridge to [bus 65]
> [    0.718915] pci 0000:00:1d.2:   bridge window [mem 0x84200000-0x843fffff]
> [    0.719004] pci 0000:00:1d.2: PME# supported from D0 D3hot D3cold
> [    0.719043] pci 0000:00:1d.2: PTM enabled (root), 4ns granularity
> [    0.719752] pci 0000:00:1f.0: [8086:5182] type 00 class 0x060100 conventional PCI endpoint
> [    0.720154] pci 0000:00:1f.3: [8086:51c8] type 00 class 0x040100 conventional PCI endpoint
> [    0.720216] pci 0000:00:1f.3: BAR 0 [mem 0x603d1a8000-0x603d1abfff 64bit]
> [    0.720290] pci 0000:00:1f.3: BAR 4 [mem 0x603d000000-0x603d0fffff 64bit]
> [    0.720451] pci 0000:00:1f.3: PME# supported from D3hot D3cold
> [    0.721057] pci 0000:00:1f.4: [8086:51a3] type 00 class 0x0c0500 conventional PCI endpoint
> [    0.721086] pci 0000:00:1f.4: BAR 0 [mem 0x603d1b4000-0x603d1b40ff 64bit]
> [    0.721112] pci 0000:00:1f.4: BAR 4 [io  0xefa0-0xefbf]
> [    0.721397] pci 0000:00:1f.5: [8086:51a4] type 00 class 0x0c8000 conventional PCI endpoint
> [    0.721419] pci 0000:00:1f.5: BAR 0 [mem 0xfe010000-0xfe010fff]
> [    0.722353] pci 0000:01:00.0: [15b7:5030] type 00 class 0x010802 PCIe Endpoint
> [    0.722365] pci 0000:01:00.0: BAR 0 [mem 0x84600000-0x84603fff 64bit]
> [    0.722554] pci 0000:00:06.0: PCI bridge to [bus 01]
> [    0.722587] pci 0000:00:07.0: PCI bridge to [bus 02-39]
> [    0.722619] pci 0000:00:07.2: PCI bridge to [bus 3a-63]
> [    0.722800] pci 0000:64:00.0: [8086:15f3] type 00 class 0x020000 PCIe Endpoint
> [    0.722819] pci 0000:64:00.0: BAR 0 [mem 0x84400000-0x844fffff]
> [    0.722844] pci 0000:64:00.0: BAR 3 [mem 0x84500000-0x84503fff]
> [    0.722977] pci 0000:64:00.0: PME# supported from D0 D3hot D3cold
> [    0.723313] pci 0000:00:1d.0: PCI bridge to [bus 64]
> [    0.723788] pci 0000:65:00.0: [8086:125c] type 00 class 0x020000 PCIe Endpoint
> [    0.723806] pci 0000:65:00.0: BAR 0 [mem 0x84200000-0x842fffff]
> [    0.723831] pci 0000:65:00.0: BAR 3 [mem 0x84300000-0x84303fff]
> [    0.723963] pci 0000:65:00.0: PME# supported from D0 D3hot D3cold
> [    0.724773] pci 0000:00:1d.2: PCI bridge to [bus 65]
> [    0.731129] ACPI: PCI: Interrupt link LNKA configured for IRQ 0
> [    0.731229] ACPI: PCI: Interrupt link LNKB configured for IRQ 1
> [    0.731327] ACPI: PCI: Interrupt link LNKC configured for IRQ 0
> [    0.731425] ACPI: PCI: Interrupt link LNKD configured for IRQ 0
> [    0.731523] ACPI: PCI: Interrupt link LNKE configured for IRQ 0
> [    0.731621] ACPI: PCI: Interrupt link LNKF configured for IRQ 0
> [    0.731719] ACPI: PCI: Interrupt link LNKG configured for IRQ 0
> [    0.731816] ACPI: PCI: Interrupt link LNKH configured for IRQ 0
> [    1.109516] Low-power S0 idle used by default for system suspend
> [    1.116947] ACPI: EC: interrupt unblocked
> [    1.116948] ACPI: EC: event unblocked
> [    1.116974] ACPI: EC: EC_CMD/EC_SC=0x66, EC_DATA=0x62
> [    1.116975] ACPI: EC: GPE=0x6e
> [    1.116977] ACPI: \_SB_.PC00.LPCB.EC0_: Boot DSDT EC initialization complete
> [    1.116978] ACPI: \_SB_.PC00.LPCB.EC0_: EC: Used to handle transactions and events
> [    1.117430] iommu: Default domain type: Translated
> [    1.117430] iommu: DMA domain TLB invalidation policy: lazy mode
> [    1.117501] SCSI subsystem initialized
> [    1.117507] libata version 3.00 loaded.
> [    1.117507] ACPI: bus type USB registered
> [    1.117507] usbcore: registered new interface driver usbfs
> [    1.117507] usbcore: registered new interface driver hub
> [    1.117507] usbcore: registered new device driver usb
> [    1.117507] EDAC MC: Ver: 3.0.0
> [    1.120822] efivars: Registered efivars operations
> [    1.120945] NetLabel: Initializing
> [    1.120946] NetLabel:  domain hash size = 128
> [    1.120947] NetLabel:  protocols = UNLABELED CIPSOv4 CALIPSO
> [    1.120965] NetLabel:  unlabeled traffic allowed by default
> [    1.120970] mctp: management component transport protocol core
> [    1.120971] NET: Registered PF_MCTP protocol family
> [    1.120974] PCI: Using ACPI for IRQ routing
> [    1.188171] PCI: pci_cache_line_size set to 64 bytes
> [    1.189575] pci 0000:00:1f.5: BAR 0 [mem 0xfe010000-0xfe010fff]: can't claim; no compatible bridge window
> [    1.190227] e820: reserve RAM buffer [mem 0x0009e000-0x0009ffff]
> [    1.190229] e820: reserve RAM buffer [mem 0x43ea7000-0x43ffffff]
> [    1.190230] e820: reserve RAM buffer [mem 0x444e6000-0x47ffffff]
> [    1.190231] e820: reserve RAM buffer [mem 0x4dd46000-0x4fffffff]
> [    1.190232] e820: reserve RAM buffer [mem 0x5a800000-0x5bffffff]
> [    1.190233] e820: reserve RAM buffer [mem 0x1097800000-0x1097ffffff]
> [    1.190766] pci 0000:00:02.0: vgaarb: setting as boot VGA device
> [    1.190766] pci 0000:00:02.0: vgaarb: bridge control possible
> [    1.190766] pci 0000:00:02.0: vgaarb: VGA device added: decodes=io+mem,owns=io+mem,locks=none
> [    1.190766] vgaarb: loaded
> [    1.190802] clocksource: Switched to clocksource tsc-early
> [    1.191172] VFS: Disk quotas dquot_6.6.0
> [    1.191181] VFS: Dquot-cache hash table entries: 512 (order 0, 4096 bytes)
> [    1.191242] pnp: PnP ACPI init
> [    1.191703] system 00:00: [io  0x0a00-0x0a0f] has been reserved
> [    1.191706] system 00:00: [io  0x0a10-0x0a2f] has been reserved
> [    1.191707] system 00:00: [io  0x0a30-0x0a4f] has been reserved
> [    1.191708] system 00:00: [io  0x0a50-0x0a6f] has been reserved
> [    1.191709] system 00:00: [io  0x0a70-0x0a7f] has been reserved
> [    1.191710] system 00:00: [io  0x0a80-0x0a8f] has been reserved
> [    1.191832] system 00:01: [io  0x0680-0x069f] has been reserved
> [    1.191834] system 00:01: [io  0x164e-0x164f] has been reserved
> [    1.191943] system 00:02: [io  0x1854-0x1857] has been reserved
> [    1.192669] pnp 00:03: disabling [mem 0xc0000000-0xcfffffff] because it overlaps 0000:00:02.0 BAR 9 [mem 0x00000000-0xdfffffff 64bit pref]
> [    1.192693] system 00:03: [mem 0xfedc0000-0xfedc7fff] has been reserved
> [    1.192694] system 00:03: [mem 0xfeda0000-0xfeda0fff] has been reserved
> [    1.192696] system 00:03: [mem 0xfeda1000-0xfeda1fff] has been reserved
> [    1.192697] system 00:03: [mem 0xfed20000-0xfed7ffff] could not be reserved
> [    1.192698] system 00:03: [mem 0xfed90000-0xfed93fff] could not be reserved
> [    1.192699] system 00:03: [mem 0xfed45000-0xfed8ffff] could not be reserved
> [    1.192700] system 00:03: [mem 0xfee00000-0xfeefffff] could not be reserved
> [    1.195625] system 00:04: [io  0x2000-0x20fe] has been reserved
> [    1.196381] pnp: PnP ACPI: found 6 devices
> [    1.201970] clocksource: acpi_pm: mask: 0xffffff max_cycles: 0xffffff, max_idle_ns: 2085701024 ns
> [    1.202017] NET: Registered PF_INET protocol family
> [    1.202177] IP idents hash table entries: 262144 (order: 9, 2097152 bytes, linear)
> [    1.215397] tcp_listen_portaddr_hash hash table entries: 32768 (order: 7, 524288 bytes, linear)
> [    1.215446] Table-perturb hash table entries: 65536 (order: 6, 262144 bytes, linear)
> [    1.215777] TCP established hash table entries: 524288 (order: 10, 4194304 bytes, linear)
> [    1.216299] TCP bind hash table entries: 65536 (order: 9, 2097152 bytes, linear)
> [    1.216406] TCP: Hash tables configured (established 524288 bind 65536)
> [    1.216608] MPTCP token hash table entries: 65536 (order: 8, 1572864 bytes, linear)
> [    1.216758] UDP hash table entries: 32768 (order: 8, 1048576 bytes, linear)
> [    1.216899] UDP-Lite hash table entries: 32768 (order: 8, 1048576 bytes, linear)
> [    1.217011] NET: Registered PF_UNIX/PF_LOCAL protocol family
> [    1.217017] NET: Registered PF_XDP protocol family
> [    1.217024] pci 0000:00:07.0: bridge window [io  0x1000-0x0fff] to [bus 02-39] add_size 1000
> [    1.217028] pci 0000:00:07.2: bridge window [io  0x1000-0x0fff] to [bus 3a-63] add_size 1000
> [    1.217038] pci 0000:00:02.0: VF BAR 2 [mem 0x4020000000-0x40ffffffff 64bit pref]: assigned
> [    1.217042] pci 0000:00:02.0: VF BAR 0 [mem 0x4010000000-0x4016ffffff 64bit]: assigned
> [    1.217045] pci 0000:00:07.0: bridge window [io  0x4000-0x4fff]: assigned
> [    1.217047] pci 0000:00:07.2: bridge window [io  0x5000-0x5fff]: assigned
> [    1.217049] pci 0000:00:15.0: BAR 0 [mem 0x4017000000-0x4017000fff 64bit]: assigned
> [    1.217395] pci 0000:00:15.1: BAR 0 [mem 0x4017001000-0x4017001fff 64bit]: assigned
> [    1.217735] pci 0000:00:1f.5: BAR 0 [mem 0x68800000-0x68800fff]: assigned
> [    1.217752] pci 0000:00:06.0: PCI bridge to [bus 01]
> [    1.217777] pci 0000:00:06.0:   bridge window [mem 0x84600000-0x846fffff]
> [    1.217810] pci 0000:00:07.0: PCI bridge to [bus 02-39]
> [    1.217812] pci 0000:00:07.0:   bridge window [io  0x4000-0x4fff]
> [    1.217814] pci 0000:00:07.0:   bridge window [mem 0x78000000-0x841fffff]
> [    1.217817] pci 0000:00:07.0:   bridge window [mem 0x6020000000-0x603bffffff 64bit pref]
> [    1.217820] pci 0000:00:07.2: PCI bridge to [bus 3a-63]
> [    1.217821] pci 0000:00:07.2:   bridge window [io  0x5000-0x5fff]
> [    1.217824] pci 0000:00:07.2:   bridge window [mem 0x6a000000-0x761fffff]
> [    1.217826] pci 0000:00:07.2:   bridge window [mem 0x6000000000-0x601bffffff 64bit pref]
> [    1.217830] pci 0000:00:1d.0: PCI bridge to [bus 64]
> [    1.217848] pci 0000:00:1d.0:   bridge window [mem 0x84400000-0x845fffff]
> [    1.217855] pci 0000:00:1d.2: PCI bridge to [bus 65]
> [    1.217859] pci 0000:00:1d.2:   bridge window [mem 0x84200000-0x843fffff]
> [    1.217867] pci_bus 0000:00: resource 4 [io  0x0000-0x0cf7 window]
> [    1.217868] pci_bus 0000:00: resource 5 [io  0x0d00-0xffff window]
> [    1.217869] pci_bus 0000:00: resource 6 [mem 0x000a0000-0x000bffff window]
> [    1.217871] pci_bus 0000:00: resource 7 [mem 0x000e0000-0x000fffff window]
> [    1.217872] pci_bus 0000:00: resource 8 [mem 0x68800000-0xbfffffff window]
> [    1.217873] pci_bus 0000:00: resource 9 [mem 0x4000000000-0x7fffffffff window]
> [    1.217874] pci_bus 0000:01: resource 1 [mem 0x84600000-0x846fffff]
> [    1.217875] pci_bus 0000:02: resource 0 [io  0x4000-0x4fff]
> [    1.217876] pci_bus 0000:02: resource 1 [mem 0x78000000-0x841fffff]
> [    1.217877] pci_bus 0000:02: resource 2 [mem 0x6020000000-0x603bffffff 64bit pref]
> [    1.217878] pci_bus 0000:3a: resource 0 [io  0x5000-0x5fff]
> [    1.217879] pci_bus 0000:3a: resource 1 [mem 0x6a000000-0x761fffff]
> [    1.217880] pci_bus 0000:3a: resource 2 [mem 0x6000000000-0x601bffffff 64bit pref]
> [    1.217881] pci_bus 0000:64: resource 1 [mem 0x84400000-0x845fffff]
> [    1.217883] pci_bus 0000:65: resource 1 [mem 0x84200000-0x843fffff]
> [    1.219810] PCI: CLS 64 bytes, default 64
> [    1.219841] DMAR: Intel-IOMMU force enabled due to platform opt in
> [    1.219847] DMAR: No ATSR found
> [    1.219848] DMAR: No SATC found
> [    1.219849] DMAR: IOMMU feature fl1gp_support inconsistent
> [    1.219850] DMAR: IOMMU feature pgsel_inv inconsistent
> [    1.219851] DMAR: IOMMU feature nwfs inconsistent
> [    1.219851] DMAR: IOMMU feature dit inconsistent
> [    1.219852] DMAR: IOMMU feature sc_support inconsistent
> [    1.219853] DMAR: IOMMU feature dev_iotlb_support inconsistent
> [    1.219854] DMAR: dmar0: Using Queued invalidation
> [    1.219857] DMAR: dmar1: Using Queued invalidation
> [    1.219962] Trying to unpack rootfs image as initramfs...
> [    1.220076] pci 0000:00:02.0: Adding to iommu group 0
> [    1.220106] pci 0000:00:00.0: Adding to iommu group 1
> [    1.220117] pci 0000:00:06.0: Adding to iommu group 2
> [    1.220125] pci 0000:00:07.0: Adding to iommu group 3
> [    1.220133] pci 0000:00:07.2: Adding to iommu group 4
> [    1.220142] pci 0000:00:08.0: Adding to iommu group 5
> [    1.220150] pci 0000:00:0a.0: Adding to iommu group 6
> [    1.220165] pci 0000:00:0d.0: Adding to iommu group 7
> [    1.220172] pci 0000:00:0d.2: Adding to iommu group 7
> [    1.220178] pci 0000:00:0d.3: Adding to iommu group 7
> [    1.220192] pci 0000:00:14.0: Adding to iommu group 8
> [    1.220199] pci 0000:00:14.2: Adding to iommu group 8
> [    1.220206] pci 0000:00:14.3: Adding to iommu group 9
> [    1.220218] pci 0000:00:15.0: Adding to iommu group 10
> [    1.220226] pci 0000:00:15.1: Adding to iommu group 10
> [    1.220236] pci 0000:00:16.0: Adding to iommu group 11
> [    1.220243] pci 0000:00:17.0: Adding to iommu group 12
> [    1.220266] pci 0000:00:1d.0: Adding to iommu group 13
> [    1.220282] pci 0000:00:1d.2: Adding to iommu group 14
> [    1.220300] pci 0000:00:1f.0: Adding to iommu group 15
> [    1.220308] pci 0000:00:1f.3: Adding to iommu group 15
> [    1.220316] pci 0000:00:1f.4: Adding to iommu group 15
> [    1.220323] pci 0000:00:1f.5: Adding to iommu group 15
> [    1.220331] pci 0000:01:00.0: Adding to iommu group 16
> [    1.220354] pci 0000:64:00.0: Adding to iommu group 17
> [    1.220381] pci 0000:65:00.0: Adding to iommu group 18
> [    1.220523] DMAR: Intel(R) Virtualization Technology for Directed I/O
> [    1.220524] PCI-DMA: Using software bounce buffering for IO (SWIOTLB)
> [    1.220525] software IO TLB: mapped [mem 0x00000000359f8000-0x00000000399f8000] (64MB)
> [    1.220564] clocksource: tsc: mask: 0xffffffffffffffff max_cycles: 0x23fa772cf26, max_idle_ns: 440795269835 ns
> [    1.220616] clocksource: Switched to clocksource tsc
> [    1.220637] platform rtc_cmos: registered platform RTC device (no PNP device found)
> [    1.227245] Initialise system trusted keyrings
> [    1.227255] Key type blacklist registered
> [    1.227295] workingset: timestamp_bits=41 max_order=24 bucket_order=0
> [    1.227305] zbud: loaded
> [    1.227417] fuse: init (API version 7.40)
> [    1.227488] integrity: Platform Keyring initialized
> [    1.227490] integrity: Machine keyring initialized
> [    1.236155] Key type asymmetric registered
> [    1.236158] Asymmetric key parser 'x509' registered
> [    1.236181] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 246)
> [    1.236262] io scheduler mq-deadline registered
> [    1.236263] io scheduler kyber registered
> [    1.236272] io scheduler bfq registered
> [    1.236870] pcieport 0000:00:06.0: PME: Signaling with IRQ 122
> [    1.237101] pcieport 0000:00:07.0: PME: Signaling with IRQ 123
> [    1.237117] pcieport 0000:00:07.0: pciehp: Slot #3 AttnBtn- PwrCtrl- MRL- AttnInd- PwrInd- HotPlug+ Surprise+ Interlock- NoCompl+ IbPresDis- LLActRep+
> [    1.237433] pcieport 0000:00:07.2: PME: Signaling with IRQ 124
> [    1.237449] pcieport 0000:00:07.2: pciehp: Slot #5 AttnBtn- PwrCtrl- MRL- AttnInd- PwrInd- HotPlug+ Surprise+ Interlock- NoCompl+ IbPresDis- LLActRep+
> [    1.237758] pcieport 0000:00:1d.0: PME: Signaling with IRQ 125
> [    1.238027] pcieport 0000:00:1d.2: PME: Signaling with IRQ 126
> [    1.238133] shpchp: Standard Hot Plug PCI Controller Driver version: 0.4
> [    1.238900] input: Sleep Button as /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0E:00/input/input0
> [    1.238922] ACPI: button: Sleep Button [SLPB]
> [    1.238952] input: Power Button as /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0C:00/input/input1
> [    1.238963] ACPI: button: Power Button [PWRB]
> [    1.238982] input: Power Button as /devices/LNXSYSTM:00/LNXPWRBN:00/input/input2
> [    1.239063] ACPI: button: Power Button [PWRF]
> [    1.243545] thermal LNXTHERM:00: registered as thermal_zone0
> [    1.243547] ACPI: thermal: Thermal Zone [TZ00] (54 C)
> [    1.243835] Serial: 8250/16550 driver, 32 ports, IRQ sharing enabled
> [    1.245729] hpet_acpi_add: no address or irqs in _CRS
> [    1.245765] Non-volatile memory driver v1.3
> [    1.245766] Linux agpgart interface v0.103
> [    1.282118] ACPI: bus type drm_connector registered
> [    1.283317] Freeing initrd memory: 106196K
> [    1.284291] ahci 0000:00:17.0: version 3.0
> [    1.284668] ahci 0000:00:17.0: AHCI vers 0001.0301, 32 command slots, 6 Gbps, SATA mode
> [    1.284672] ahci 0000:00:17.0: 1/1 ports implemented (port mask 0x2)
> [    1.284673] ahci 0000:00:17.0: flags: 64bit ncq sntf pm clo only pio slum part deso sadm sds
> [    1.285087] scsi host0: ahci
> [    1.285169] scsi host1: ahci
> [    1.285197] ata1: DUMMY
> [    1.285212] ata2: SATA max UDMA/133 abar m2048 at 0x84702000<mailto:m2048 at 0x84702000> port 0x84702180 irq 127 lpm-pol 4
> [    1.285284] usbcore: registered new interface driver usbserial_generic
> [    1.285288] usbserial: USB Serial support registered for generic
> [    1.285358] rtc_cmos rtc_cmos: RTC can wake from S4
> [    1.287193] rtc_cmos rtc_cmos: registered as rtc0
> [    1.287570] rtc_cmos rtc_cmos: setting system clock to 2024-09-17T15:43:43 UTC (1726587823)
> [    1.287610] rtc_cmos rtc_cmos: alarms up to one month, y3k, 114 bytes nvram
> [    1.288735] intel_pstate: Intel P-state driver initializing
> [    1.290872] intel_pstate: HWP enabled
> [    1.291430] ledtrig-cpu: registered to indicate activity on CPUs
> [    1.291876] [drm] Initialized simpledrm 1.0.0 for simple-framebuffer.0 on minor 0
> [    1.292353] fbcon: Deferring console take-over
> [    1.292358] simple-framebuffer simple-framebuffer.0: [drm] fb0: simpledrmdrmfb frame buffer device
> [    1.292419] hid: raw HID events driver (C) Jiri Kosina
> [    1.292473] drop_monitor: Initializing network drop monitor service
> [    1.292567] NET: Registered PF_INET6 protocol family
> [    1.296692] Segment Routing with IPv6
> [    1.296693] RPL Segment Routing with IPv6
> [    1.296704] In-situ OAM (IOAM) with IPv6
> [    1.296720] NET: Registered PF_PACKET protocol family
> [    1.299178] ENERGY_PERF_BIAS: Set to 'normal', was 'performance'
> [    1.299835] microcode: Current revision: 0x00000434
> [    1.299839] microcode: Updated early from: 0x0000042a
> [    1.300531] IPI shorthand broadcast: enabled
> [    1.301773] sched_clock: Marking stable (1284914767, 15597475)->(1326242945, -25730703)
> [    1.302178] registered taskstats version 1
> [    1.303378] Loading compiled-in X.509 certificates
> [    1.306147] Loaded X.509 cert 'Build time autogenerated kernel key: cb8a38269e411cf2cea941e3c19d1521412bd34d'
> [    1.308962] zswap: loaded using pool zstd/zsmalloc
> [    1.309007] Demotion targets for Node 0: null
> [    1.309121] Key type .fscrypt registered
> [    1.309121] Key type fscrypt-provisioning registered
> [    1.309500] integrity: Loading X.509 certificate: UEFI:db
> [    1.309544] integrity: Loaded X.509 cert 'Microsoft Corporation UEFI CA 2011: 13adbf4309bd82709c8cd54f316ed522988a1bd4'
> [    1.309544] integrity: Loading X.509 certificate: UEFI:db
> [    1.309551] integrity: Loaded X.509 cert 'Microsoft Windows Production PCA 2011: a92902398e16c49778cd90f99e4f9ae17c55af53'
> [    1.309972] PM:   Magic number: 8:571:740
> [    1.311885] RAS: Correctable Errors collector initialized.
> [    1.599328] ata2: SATA link down (SStatus 4 SControl 300)
> [    1.601308] clk: Disabling unused clocks
> [    1.601325] PM: genpd: Disabling unused power domains
> [    1.609973] Freeing unused decrypted memory: 2028K
> [    1.610569] Freeing unused kernel image (initmem) memory: 3452K
> [    1.610578] Write protecting the kernel read-only data: 32768k
> [    1.611494] Freeing unused kernel image (rodata/data gap) memory: 820K
> [    1.616342] x86/mm: Checked W+X mappings: passed, no W+X pages found.
> [    1.616345] rodata_test: all tests were successful
> [    1.616356] Run /init as init process
> [    1.616357]   with arguments:
> [    1.616357]     /init
> [    1.616358]   with environment:
> [    1.616358]     HOME=/
> [    1.616359]     TERM=linux
> [    1.738727] xhci_hcd 0000:00:0d.0: xHCI Host Controller
> [    1.738738] xhci_hcd 0000:00:0d.0: new USB bus registered, assigned bus number 1
> [    1.739793] xhci_hcd 0000:00:0d.0: hcc params 0x20007fc1 hci version 0x120 quirks 0x0000000200009810
> [    1.740087] xhci_hcd 0000:00:0d.0: xHCI Host Controller
> [    1.740090] xhci_hcd 0000:00:0d.0: new USB bus registered, assigned bus number 2
> [    1.740093] xhci_hcd 0000:00:0d.0: Host supports USB 3.2 Enhanced SuperSpeed
> [    1.740135] usb usb1: New USB device found, idVendor=1d6b, idProduct=0002, bcdDevice= 6.11
> [    1.740139] usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
> [    1.740141] usb usb1: Product: xHCI Host Controller
> [    1.740142] usb usb1: Manufacturer: Linux 6.11.0-rc7-00001-g0e2ad6528188-dirty xhci-hcd
> [    1.740144] usb usb1: SerialNumber: 0000:00:0d.0
> [    1.740282] hub 1-0:1.0: USB hub found
> [    1.740289] hub 1-0:1.0: 1 port detected
> [    1.740533] usb usb2: New USB device found, idVendor=1d6b, idProduct=0003, bcdDevice= 6.11
> [    1.740535] usb usb2: New USB device strings: Mfr=3, Product=2, SerialNumber=1
> [    1.740537] usb usb2: Product: xHCI Host Controller
> [    1.740538] usb usb2: Manufacturer: Linux 6.11.0-rc7-00001-g0e2ad6528188-dirty xhci-hcd
> [    1.740539] usb usb2: SerialNumber: 0000:00:0d.0
> [    1.740628] hub 2-0:1.0: USB hub found
> [    1.740635] hub 2-0:1.0: 3 ports detected
> [    1.741581] xhci_hcd 0000:00:14.0: xHCI Host Controller
> [    1.741586] xhci_hcd 0000:00:14.0: new USB bus registered, assigned bus number 3
> [    1.742720] xhci_hcd 0000:00:14.0: hcc params 0x20007fc1 hci version 0x120 quirks 0x0000100200009810
> [    1.743083] xhci_hcd 0000:00:14.0: xHCI Host Controller
> [    1.743087] xhci_hcd 0000:00:14.0: new USB bus registered, assigned bus number 4
> [    1.743089] xhci_hcd 0000:00:14.0: Host supports USB 3.1 Enhanced SuperSpeed
> [    1.743129] usb usb3: New USB device found, idVendor=1d6b, idProduct=0002, bcdDevice= 6.11
> [    1.743131] usb usb3: New USB device strings: Mfr=3, Product=2, SerialNumber=1
> [    1.743132] usb usb3: Product: xHCI Host Controller
> [    1.743133] usb usb3: Manufacturer: Linux 6.11.0-rc7-00001-g0e2ad6528188-dirty xhci-hcd
> [    1.743134] usb usb3: SerialNumber: 0000:00:14.0
> [    1.743239] hub 3-0:1.0: USB hub found
> [    1.743267] hub 3-0:1.0: 12 ports detected
> [    1.745297] usb usb4: New USB device found, idVendor=1d6b, idProduct=0003, bcdDevice= 6.11
> [    1.745299] usb usb4: New USB device strings: Mfr=3, Product=2, SerialNumber=1
> [    1.745301] usb usb4: Product: xHCI Host Controller
> [    1.745302] usb usb4: Manufacturer: Linux 6.11.0-rc7-00001-g0e2ad6528188-dirty xhci-hcd
> [    1.745302] usb usb4: SerialNumber: 0000:00:14.0
> [    1.745388] hub 4-0:1.0: USB hub found
> [    1.745410] hub 4-0:1.0: 4 ports detected
> [    1.761523] nvme 0000:01:00.0: platform quirk: setting simple suspend
> [    1.761605] nvme nvme0: pci function 0000:01:00.0
> [    1.791467] nvme nvme0: 16/0/0 default/read/poll queues
> [    1.796102]  nvme0n1: p1 p2 p3
> [    1.992401] usb 3-4: new high-speed USB device number 2 using xhci_hcd
> [    2.134739] usb 3-4: New USB device found, idVendor=05e3, idProduct=0608, bcdDevice=88.32
> [    2.134746] usb 3-4: New USB device strings: Mfr=0, Product=1, SerialNumber=0
> [    2.134748] usb 3-4: Product: USB2.0 Hub
> [    2.136254] hub 3-4:1.0: USB hub found
> [    2.136751] hub 3-4:1.0: 4 ports detected
> [    2.137612] usb: port power management may be unreliable
> [    2.203731] usb 2-1: new SuperSpeed USB device number 2 using xhci_hcd
> [    2.237657] usb 2-1: New USB device found, idVendor=045e, idProduct=0955, bcdDevice= 1.41
> [    2.237662] usb 2-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
> [    2.237664] usb 2-1: Product: 4-Port USB 3.0 Hub
> [    2.237665] usb 2-1: Manufacturer: Generic
> [    2.245834] hub 2-1:1.0: USB hub found
> [    2.247480] hub 2-1:1.0: 2 ports detected
> [    2.255872] usb 4-1: new SuperSpeed USB device number 2 using xhci_hcd
> [    2.275009] usb 4-1: New USB device found, idVendor=0e8d, idProduct=7961, bcdDevice= 1.00
> [    2.275014] usb 4-1: New USB device strings: Mfr=6, Product=7, SerialNumber=8
> [    2.275015] usb 4-1: Product: Wireless_Device
> [    2.275017] usb 4-1: Manufacturer: MediaTek Inc.
> [    2.275018] usb 4-1: SerialNumber: 000000000
> [    2.395819] usb 3-6: new high-speed USB device number 3 using xhci_hcd
> [    2.469827] i915 0000:00:02.0: [drm] Found ALDERLAKE_P (device ID 46a6) display version 13.00
> [    2.470484] i915 0000:00:02.0: [drm] VT-d active for gfx access
> [    2.526904] i915 0000:00:02.0: vgaarb: deactivate vga console
> [    2.527166] i915 0000:00:02.0: [drm] Using Transparent Hugepages
> [    2.529267] i915 0000:00:02.0: vgaarb: VGA decodes changed: olddecodes=io+mem,decodes=io+mem:owns=io+mem
> [    2.534856] i915 0000:00:02.0: [drm] Finished loading DMC firmware i915/adlp_dmc.bin (v2.20)
> [    2.535899] usb 2-1.1: new SuperSpeed USB device number 3 using xhci_hcd
> [    2.557014] usb 3-6: New USB device found, idVendor=045e, idProduct=0957, bcdDevice= 1.41
> [    2.557029] usb 3-6: New USB device strings: Mfr=1, Product=2, SerialNumber=0
> [    2.557035] usb 3-6: Product: 4-Port USB 2.0 Hub
> [    2.557039] usb 3-6: Manufacturer: Generic
> [    2.557797] usb 2-1.1: New USB device found, idVendor=045e, idProduct=0927, bcdDevice=31.00
> [    2.557814] usb 2-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=6
> [    2.557819] usb 2-1.1: Product: Ethernet Adapter
> [    2.557823] usb 2-1.1: Manufacturer: Microsoft
> [    2.557826] usb 2-1.1: SerialNumber: 0013DF804
> [    2.561404] hub 3-6:1.0: USB hub found
> [    2.563028] hub 3-6:1.0: 2 ports detected
> [    2.645045] i915 0000:00:02.0: [drm] GT0: GuC firmware i915/adlp_guc_70.bin version 70.29.2
> [    2.645051] i915 0000:00:02.0: [drm] GT0: HuC firmware i915/tgl_huc.bin version 7.9.3
> [    2.659283] i915 0000:00:02.0: [drm] GT0: HuC: authenticated for all workloads
> [    2.660460] i915 0000:00:02.0: [drm] GT0: GUC: submission enabled
> [    2.660462] i915 0000:00:02.0: [drm] GT0: GUC: SLPC enabled
> [    2.661015] i915 0000:00:02.0: [drm] GT0: GUC: RC enabled
> [    2.662137] i915 0000:00:02.0: [drm] Protected Xe Path (PXP) protected content support initialized
> [    2.689226] usb 3-7: new full-speed USB device number 4 using xhci_hcd
> [    2.695739] [drm] Initialized i915 1.6.0 for 0000:00:02.0 on minor 1
> [    2.698285] ACPI: video: Video Device [GFX0] (multi-head: yes  rom: no  post: no)
> [    2.699207] input: Video Bus as /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/LNXVIDEO:00/input/input3
> [    2.737465] fbcon: i915drmfb (fb0) is primary device
> [    2.737467] fbcon: Deferring console take-over
> [    2.737468] i915 0000:00:02.0: [drm] fb0: i915drmfb frame buffer device
> [    2.835767] usb 3-7: New USB device found, idVendor=045e, idProduct=0800, bcdDevice= 9.34
> [    2.835772] usb 3-7: New USB device strings: Mfr=1, Product=2, SerialNumber=0
> [    2.835773] usb 3-7: Product: Microsoft? Nano Transceiver v2.0
> [    2.835775] usb 3-7: Manufacturer: Microsoft
> [    2.857652] usbcore: registered new interface driver usbhid
> [    2.857654] usbhid: USB HID core driver
> [    2.862052] input: Microsoft Microsoft? Nano Transceiver v2.0 as /devices/pci0000:00/0000:00:14.0/usb3/3-7/3-7:1.0/0003:045E:0800.0001/input/input4
> [    2.965962] hid-generic 0003:045E:0800.0001: input,hidraw0: USB HID v1.11 Keyboard [Microsoft Microsoft? Nano Transceiver v2.0] on usb-0000:00:14.0-7/input0
> [    2.968229] input: Microsoft Microsoft? Nano Transceiver v2.0 Mouse as /devices/pci0000:00/0000:00:14.0/usb3/3-7/3-7:1.1/0003:045E:0800.0002/input/input5
> [    2.968393] input: Microsoft Microsoft? Nano Transceiver v2.0 Consumer Control as /devices/pci0000:00/0000:00:14.0/usb3/3-7/3-7:1.1/0003:045E:0800.0002/input/input6
> [    2.968554] hid-generic 0003:045E:0800.0002: input,hidraw1: USB HID v1.11 Mouse [Microsoft Microsoft? Nano Transceiver v2.0] on usb-0000:00:14.0-7/input1
> [    2.968700] input: Microsoft Microsoft? Nano Transceiver v2.0 Consumer Control as /devices/pci0000:00/0000:00:14.0/usb3/3-7/3-7:1.2/0003:045E:0800.0003/input/input7
> [    3.022596] input: Microsoft Microsoft? Nano Transceiver v2.0 System Control as /devices/pci0000:00/0000:00:14.0/usb3/3-7/3-7:1.2/0003:045E:0800.0003/input/input9
> [    3.022920] hid-generic 0003:045E:0800.0003: input,hiddev96,hidraw2: USB HID v1.11 Device [Microsoft Microsoft? Nano Transceiver v2.0] on usb-0000:00:14.0-7/input2
> [    3.175304] PM: Image not found (code -22)
> [    3.196942] fbcon: Taking over console
> [    3.209556] Console: switching to colour frame buffer device 240x67
> [    3.308676] EXT4-fs (nvme0n1p2): mounted filesystem 0420afc7-4947-4e2e-a096-b607b8b7fd93 r/w with ordered data mode. Quota mode: none.
> [    3.367761] systemd[1]: systemd 256.6-1-arch running in system mode (+PAM +AUDIT -SELINUX -APPARMOR -IMA +SMACK +SECCOMP +GCRYPT +GNUTLS +OPENSSL +ACL +BLKID +CURL +ELFUTILS +FIDO2 +IDN2 -IDN +IPTC +KMOD +LIBCRYPTSETUP +LIBCRYPTSETUP_PLUGINS +LIBFDISK +PCRE2 +PWQUALITY +P11KIT +QRENCODE +TPM2 +BZIP2 +LZ4 +XZ +ZLIB +ZSTD +BPF_FRAMEWORK +XKBCOMMON +UTMP -SYSVINIT +LIBARCHIVE)
> [    3.367765] systemd[1]: Detected architecture x86-64.
> [    3.368553] systemd[1]: Hostname set to <mdp-archnuc>.
> [    3.611164] systemd[1]: bpf-restrict-fs: LSM BPF program attached
> [    3.699797] systemd[1]: Queued start job for default target Graphical Interface.
> [    3.753107] systemd[1]: Created slice Slice /system/dirmngr.
> [    3.753888] systemd[1]: Created slice Slice /system/getty.
> [    3.754461] systemd[1]: Created slice Slice /system/gpg-agent.
> [    3.755011] systemd[1]: Created slice Slice /system/gpg-agent-browser.
> [    3.755524] systemd[1]: Created slice Slice /system/gpg-agent-extra.
> [    3.755998] systemd[1]: Created slice Slice /system/gpg-agent-ssh.
> [    3.756450] systemd[1]: Created slice Slice /system/keyboxd.
> [    3.756684] systemd[1]: Created slice Slice /system/modprobe.
> [    3.756803] systemd[1]: Created slice Slice /system/systemd-fsck.
> [    3.756872] systemd[1]: Created slice User and Session Slice.
> [    3.756893] systemd[1]: Started Dispatch Password Requests to Console Directory Watch.
> [    3.756908] systemd[1]: Started Forward Password Requests to Wall Directory Watch.
> [    3.756982] systemd[1]: Set up automount Arbitrary Executable File Formats File System Automount Point.
> [    3.756989] systemd[1]: Expecting device /dev/disk/by-uuid/EF7B-A70B...
> [    3.756993] systemd[1]: Expecting device /dev/disk/by-uuid/efa73f2d-495d-448d-a0f0-dd425258b7e5...
> [    3.756999] systemd[1]: Reached target Local Encrypted Volumes.
> [    3.757005] systemd[1]: Reached target Login Prompts.
> [    3.757011] systemd[1]: Reached target Local Integrity Protected Volumes.
> [    3.757020] systemd[1]: Reached target Path Units.
> [    3.757027] systemd[1]: Reached target Remote File Systems.
> [    3.757031] systemd[1]: Reached target Slice Units.
> [    3.757043] systemd[1]: Reached target Local Verity Protected Volumes.
> [    3.757076] systemd[1]: Listening on Device-mapper event daemon FIFOs.
> [    3.760193] systemd[1]: Listening on Process Core Dump Socket.
> [    3.760919] systemd[1]: Listening on Credential Encryption/Decryption.
> [    3.761003] systemd[1]: Listening on Journal Socket (/dev/log).
> [    3.761058] systemd[1]: Listening on Journal Sockets.
> [    3.761093] systemd[1]: TPM PCR Measurements was skipped because of an unmet condition check (ConditionSecurity=measured-uki).
> [    3.761109] systemd[1]: Make TPM PCR Policy was skipped because of an unmet condition check (ConditionSecurity=measured-uki).
> [    3.761165] systemd[1]: Listening on udev Control Socket.
> [    3.761202] systemd[1]: Listening on udev Kernel Socket.
> [    3.762311] systemd[1]: Mounting Huge Pages File System...
> [    3.763074] systemd[1]: Mounting POSIX Message Queue File System...
> [    3.763792] systemd[1]: Mounting Kernel Debug File System...
> [    3.764350] systemd[1]: Mounting Kernel Trace File System...
> [    3.765317] systemd[1]: Starting Create List of Static Device Nodes...
> [    3.766158] systemd[1]: Starting Load Kernel Module configfs...
> [    3.766682] systemd[1]: Starting Load Kernel Module dm_mod...
> [    3.767934] systemd[1]: Starting Load Kernel Module drm...
> [    3.769088] systemd[1]: Starting Load Kernel Module fuse...
> [    3.770335] systemd[1]: Starting Load Kernel Module loop...
> [    3.770384] systemd[1]: File System Check on Root Device was skipped because of an unmet condition check (ConditionPathIsReadWrite=!/).
> [    3.770425] systemd[1]: Clear Stale Hibernate Storage Info was skipped because of an unmet condition check (ConditionPathExists=/sys/firmware/efi/efivars/HibernateLocation-8cf2644b-4b0b-428f-9387-6d876050dc67).
> [    3.772057] systemd[1]: Starting Journal Service...
> [    3.772971] systemd[1]: Starting Load Kernel Modules...
> [    3.772986] systemd[1]: TPM PCR Machine ID Measurement was skipped because of an unmet condition check (ConditionSecurity=measured-uki).
> [    3.773641] systemd[1]: Starting Remount Root and Kernel File Systems...
> [    3.773677] systemd[1]: Early TPM SRK Setup was skipped because of an unmet condition check (ConditionSecurity=measured-uki).
> [    3.774224] systemd[1]: Starting Load udev Rules from Credentials...
> [    3.774948] systemd[1]: Starting Coldplug All udev Devices...
> [    3.777379] systemd[1]: Mounted Huge Pages File System.
> [    3.777453] systemd[1]: Mounted POSIX Message Queue File System.
> [    3.777510] systemd[1]: Mounted Kernel Debug File System.
> [    3.777561] systemd[1]: Mounted Kernel Trace File System.
> [    3.777759] systemd[1]: Finished Create List of Static Device Nodes.
> [    3.777978] systemd[1]: modprobe at configfs.service<mailto:modprobe at configfs.service>: Deactivated successfully.
> [    3.778112] systemd[1]: Finished Load Kernel Module configfs.
> [    3.778286] systemd[1]: modprobe at drm.service<mailto:modprobe at drm.service>: Deactivated successfully.
> [    3.778411] systemd[1]: Finished Load Kernel Module drm.
> [    3.778575] systemd[1]: modprobe at fuse.service<mailto:modprobe at fuse.service>: Deactivated successfully.
> [    3.778688] systemd[1]: Finished Load Kernel Module fuse.
> [    3.779305] systemd[1]: Mounting FUSE Control File System...
> [    3.780063] systemd[1]: Mounting Kernel Configuration File System...
> [    3.780929] systemd[1]: Starting Create Static Device Nodes in /dev gracefully...
> [    3.782976] systemd[1]: Finished Load udev Rules from Credentials.
> [    3.783391] loop: module loaded
> [    3.784044] systemd[1]: modprobe at loop.service<mailto:modprobe at loop.service>: Deactivated successfully.
> [    3.784330] systemd[1]: Finished Load Kernel Module loop.
> [    3.785492] systemd[1]: Mounted FUSE Control File System.
> [    3.785629] systemd[1]: Mounted Kernel Configuration File System.
> [    3.785810] systemd-journald[395]: Collecting audit messages is disabled.
> [    3.798212] i2c_dev: i2c /dev entries driver
> [    3.799115] systemd[1]: Finished Load Kernel Modules.
> [    3.799850] systemd[1]: Starting Apply Kernel Variables...
> [    3.799991] device-mapper: uevent: version 1.0.3
> [    3.800058] device-mapper: ioctl: 4.48.0-ioctl (2023-03-01) initialised: dm-devel at lists.linux.dev<mailto:dm-devel at lists.linux.dev>
> [    3.800371] systemd[1]: modprobe at dm<mailto:modprobe at dm>_mod.service: Deactivated successfully.
> [    3.800462] systemd[1]: Finished Load Kernel Module dm_mod.
> [    3.800633] systemd[1]: Repartition Root Disk was skipped because no trigger condition checks were met.
> [    3.805467] systemd[1]: Finished Create Static Device Nodes in /dev gracefully.
> [    3.806389] systemd[1]: Finished Apply Kernel Variables.
> [    3.806887] systemd[1]: Started Journal Service.
> [    3.832625] EXT4-fs (nvme0n1p2): re-mounted 0420afc7-4947-4e2e-a096-b607b8b7fd93 r/w. Quota mode: none.
> [    3.840126] systemd-journald[395]: Received client request to flush runtime journal.
> [    3.843896] Adding 67108860k swap on /swapfile.  Priority:-2 extents:86 across:334987260k SS
> [    3.946711] mc: Linux media interface: v0.10
> [    3.950655] mousedev: PS/2 mouse device common for all mice
> [    3.971833] resource: resource sanity check: requesting [mem 0x00000000fedc0000-0x00000000fedcffff], which spans more than pnp 00:03 [mem 0xfedc0000-0xfedc7fff]
> [    3.971839] caller igen6_probe+0x15e/0x7c0 [igen6_edac] mapping multiple BARs
> [    3.975353] EDAC MC0: Giving out device to module igen6_edac controller Intel_client_SoC MC#0: DEV 0000:00:00.0 (INTERRUPT)
> [    3.975402] EDAC MC1: Giving out device to module igen6_edac controller Intel_client_SoC MC#1: DEV 0000:00:00.0 (INTERRUPT)
> [    3.975427] EDAC igen6 MC0: HANDLING IBECC MEMORY ERROR
> [    3.975428] EDAC igen6 MC0: ADDR 0x7fffffffe0
> [    3.975454] intel_pmc_core INT33A1:00:  initialized
> [    3.975552] EDAC igen6 MC1: HANDLING IBECC MEMORY ERROR
> [    3.975556] EDAC igen6 MC1: ADDR 0x7fffffffe0
> [    3.976644] EDAC igen6: v2.5.1
> [    3.985687] videodev: Linux video capture interface: v2.00
> [    3.985762] pps_core: LinuxPPS API ver. 1 registered
> [    3.985765] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <giometti at linux.it<mailto:giometti at linux.it>>
> [    3.988981] input: PC Speaker as /devices/platform/pcspkr/input/input10
> [    3.996243] PTP clock support registered
> [    3.999181] mei_me 0000:00:16.0: enabling device (0000 -> 0002)
> [    4.000730] i801_smbus 0000:00:1f.4: enabling device (0000 -> 0003)
> [    4.001128] i801_smbus 0000:00:1f.4: SPD Write Disable is set
> [    4.001184] i801_smbus 0000:00:1f.4: SMBus using PCI interrupt
> [    4.004969] i2c i2c-13: Successfully instantiated SPD at 0x50
> [    4.008414] intel-lpss 0000:00:15.0: enabling device (0004 -> 0006)
> [    4.008861] idma64 idma64.0: Found Intel integrated DMA 64-bit
> [    4.027139] Serial bus multi instantiate pseudo device driver INT3515:00: error -ENXIO: IRQ index 1 not found
> [    4.027145] Serial bus multi instantiate pseudo device driver INT3515:00: error -ENXIO: Error requesting irq at index 1
> [    4.029512] ACPI: bus type thunderbolt registered
> [    4.032631] Intel(R) 2.5G Ethernet Linux Driver
> [    4.032634] Copyright(c) 2018 Intel Corporation.
> [    4.032751] igc 0000:64:00.0: enabling device (0000 -> 0002)
> [    4.033014] igc 0000:64:00.0: PTM enabled, 4ns granularity
> [    4.038479] intel-lpss 0000:00:15.1: enabling device (0004 -> 0006)
> [    4.038818] idma64 idma64.1: Found Intel integrated DMA 64-bit
> [    4.047090] Creating 1 MTD partitions on "0000:00:1f.5":
> [    4.047094] 0x000000000000-0x000002000000 : "BIOS"
> [    4.079742] pps pps0: new PPS source ptp0
> [    4.079786] igc 0000:64:00.0 (unnamed net_device) (uninitialized): PHC added
> [    4.082583] RAPL PMU: API unit is 2^-32 Joules, 4 fixed counters, 655360 ms ovfl timer
> [    4.082586] RAPL PMU: hw unit of domain pp0-core 2^-14 Joules
> [    4.082588] RAPL PMU: hw unit of domain package 2^-14 Joules
> [    4.082588] RAPL PMU: hw unit of domain pp1-gpu 2^-14 Joules
> [    4.082589] RAPL PMU: hw unit of domain psys 2^-14 Joules
> [    4.083350] usbcore: registered new device driver r8152-cfgselector
> [    4.107228] cryptd: max_cpu_qlen set to 1000
> [    4.107196] mei_hdcp 0000:00:16.0-b638ab7e-94e2-4ea2-a552-d1c54b627f04: bound 0000:00:02.0 (ops i915_hdcp_ops [i915])
> [    4.107949] mei_pxp 0000:00:16.0-fbf6fcf1-96cf-4e2e-a6a6-1bab8cbe36b1: bound 0000:00:02.0 (ops i915_pxp_tee_component_ops [i915])
> [    4.109214] ee1004 13-0050: 512 byte EE1004-compliant SPD EEPROM, read-only
> [    4.172477] r8152-cfgselector 2-1.1: reset SuperSpeed USB device number 3 using xhci_hcd
> [    4.187010] Bluetooth: Core ver 2.22
> [    4.187025] NET: Registered PF_BLUETOOTH protocol family
> [    4.187026] Bluetooth: HCI device and connection manager initialized
> [    4.187032] Bluetooth: HCI socket layer initialized
> [    4.187034] Bluetooth: L2CAP socket layer initialized
> [    4.187036] Bluetooth: SCO socket layer initialized
> [    4.191558] igc 0000:64:00.0: 4.000 Gb/s available PCIe bandwidth (5.0 GT/s PCIe x1 link)
> [    4.191562] igc 0000:64:00.0 eth0: MAC: XX:XX:XX:XX:XX:XX
> [    4.191837] cfg80211: Loading compiled-in X.509 certificates for regulatory database
> [    4.191998] igc 0000:65:00.0: enabling device (0000 -> 0002)
> [    4.192549] igc 0000:65:00.0: PTM enabled, 4ns granularity
> [    4.193238] AES CTR mode by8 optimization enabled
> [    4.194837] Loaded X.509 cert 'sforshee: 00b28ddf47aef9cea7'
> [    4.195017] Loaded X.509 cert 'wens: 61c038651aabdcf94bd0ac7ff06c7248db18c600'
> [    4.214394] snd_hda_intel 0000:00:1f.3: enabling device (0000 -> 0002)
> [    4.214598] snd_hda_intel 0000:00:1f.3: bound 0000:00:02.0 (ops i915_audio_component_bind_ops [i915])
> [    4.223182] usbcore: registered new interface driver btusb
> [    4.224896] Bluetooth: hci0: HW/SW Version: 0x008a008a, Build Time: 20240826151221
> [    4.243090] pps pps1: new PPS source ptp1
> [    4.243291] igc 0000:65:00.0 (unnamed net_device) (uninitialized): PHC added
> [    4.245647] r8152 2-1.1:1.0 eth1: v1.12.13
> [    4.245683] usbcore: registered new interface driver r8152
> [    4.261881] usbcore: registered new interface driver cdc_ether
> [    4.272727] snd_hda_codec_realtek hdaudioC0D0: autoconfig for ALC269VB: line_outs=1 (0x21/0x0/0x0/0x0/0x0) type:hp
> [    4.272733] snd_hda_codec_realtek hdaudioC0D0:    speaker_outs=0 (0x0/0x0/0x0/0x0/0x0)
> [    4.272735] snd_hda_codec_realtek hdaudioC0D0:    hp_outs=0 (0x0/0x0/0x0/0x0/0x0)
> [    4.272737] snd_hda_codec_realtek hdaudioC0D0:    mono: mono_out=0x0
> [    4.272738] snd_hda_codec_realtek hdaudioC0D0:    inputs:
> [    4.272739] snd_hda_codec_realtek hdaudioC0D0:      Mic=0x18
> [    4.283158] igc 0000:65:00.0: 4.000 Gb/s available PCIe bandwidth (5.0 GT/s PCIe x1 link)
> [    4.283163] igc 0000:65:00.0 eth2: MAC: XX:XX:XX:XX:XX:XX
> [    4.285711] igc 0000:64:00.0 enp100s0: renamed from eth0
> [    4.303471] Intel(R) Wireless WiFi driver for Linux
> [    4.303618] iwlwifi 0000:00:14.3: enabling device (0000 -> 0002)
> [    4.306032] iwlwifi 0000:00:14.3: Detected crf-id 0x400410, cnv-id 0x80400 wfpm id 0x80000020
> [    4.306074] iwlwifi 0000:00:14.3: PCI dev 51f0/0094, rev=0x370, rfid=0x2010d000
> [    4.306077] iwlwifi 0000:00:14.3: Detected Intel(R) Wi-Fi 6E AX211 160MHz
> [    4.310525] iwlwifi 0000:00:14.3: TLV_FW_FSEQ_VERSION: FSEQ Version: 0.0.2.42
> [    4.310859] iwlwifi 0000:00:14.3: loaded firmware version 89.202a2f7b.0 so-a0-gf-a0-89.ucode op_mode iwlmvm
> [    4.317505] r8152 2-1.1:1.0 enp0s13f0u1u1: renamed from eth1
> [    4.317848] igc 0000:65:00.0 enp101s0: renamed from eth2
> [    4.326705] input: HDA Intel PCH Mic as /devices/pci0000:00/0000:00:1f.3/sound/card0/input11
> [    4.326777] input: HDA Intel PCH Headphone as /devices/pci0000:00/0000:00:1f.3/sound/card0/input12
> [    4.326832] input: HDA Intel PCH HDMI/DP,pcm=3 as /devices/pci0000:00/0000:00:1f.3/sound/card0/input13
> [    4.326873] input: HDA Intel PCH HDMI/DP,pcm=7 as /devices/pci0000:00/0000:00:1f.3/sound/card0/input14
> [    4.326939] input: HDA Intel PCH HDMI/DP,pcm=8 as /devices/pci0000:00/0000:00:1f.3/sound/card0/input15
> [    4.326994] input: HDA Intel PCH HDMI/DP,pcm=9 as /devices/pci0000:00/0000:00:1f.3/sound/card0/input16
> [    4.430414] intel_tcc_cooling: TCC Offset locked
> [    4.555399] intel_rapl_msr: PL4 support detected.
> [    4.555425] intel_rapl_common: Found RAPL domain package
> [    4.555428] intel_rapl_common: Found RAPL domain core
> [    4.555429] intel_rapl_common: Found RAPL domain uncore
> [    4.555431] intel_rapl_common: Found RAPL domain psys
> [    4.613360] iwlwifi 0000:00:14.3: WFPM_UMAC_PD_NOTIFICATION: 0x20
> [    4.613411] iwlwifi 0000:00:14.3: WFPM_LMAC2_PD_NOTIFICATION: 0x1f
> [    4.613418] iwlwifi 0000:00:14.3: WFPM_AUTH_KEY_0: 0x90
> [    4.613426] iwlwifi 0000:00:14.3: CNVI_SCU_SEQ_DATA_DW9: 0x0
> [    4.613723] iwlwifi 0000:00:14.3: loaded PNVM version 35148b80
> [    4.614836] iwlwifi 0000:00:14.3: RFIm is deactivated, reason = 4
> [    4.630016] iwlwifi 0000:00:14.3: Detected RF GF, rfid=0x2010d000
> [    4.700769] iwlwifi 0000:00:14.3: base HW address: XX:XX:XX:XX:XX:XX
> [    4.833421] iwlwifi 0000:00:14.3 wlo1: renamed from wlan0
> [    5.452456] EXT4-fs (nvme0n1p3): mounted filesystem efa73f2d-495d-448d-a0f0-dd425258b7e5 r/w with ordered data mode. Quota mode: none.
> [    5.661641] Bluetooth: BNEP (Ethernet Emulation) ver 1.3
> [    5.661644] Bluetooth: BNEP filters: protocol multicast
> [    5.661647] Bluetooth: BNEP socket layer initialized
> [    5.925867] iwlwifi 0000:00:14.3: WFPM_UMAC_PD_NOTIFICATION: 0x20
> [    5.925877] iwlwifi 0000:00:14.3: WFPM_LMAC2_PD_NOTIFICATION: 0x1f
> [    5.925885] iwlwifi 0000:00:14.3: WFPM_AUTH_KEY_0: 0x90
> [    5.925893] iwlwifi 0000:00:14.3: CNVI_SCU_SEQ_DATA_DW9: 0x0
> [    5.927244] iwlwifi 0000:00:14.3: RFIm is deactivated, reason = 4
> [    6.019702] iwlwifi 0000:00:14.3: Registered PHC clock: iwlwifi-PTP, with index: 2
> [    6.248772] iwlwifi 0000:00:14.3: WFPM_UMAC_PD_NOTIFICATION: 0x20
> [    6.248782] iwlwifi 0000:00:14.3: WFPM_LMAC2_PD_NOTIFICATION: 0x1f
> [    6.248790] iwlwifi 0000:00:14.3: WFPM_AUTH_KEY_0: 0x90
> [    6.248798] iwlwifi 0000:00:14.3: CNVI_SCU_SEQ_DATA_DW9: 0x0
> [    6.250128] iwlwifi 0000:00:14.3: RFIm is deactivated, reason = 4
> [    7.025262] Bluetooth: hci0: Device setup in 2736415 usecs
> [    7.025270] Bluetooth: hci0: HCI Enhanced Setup Synchronous Connection command is advertised, but not supported.
> [    7.466021] usbcore: registered new interface driver option
> [    7.466030] usbserial: USB Serial support registered for GSM modem (1-port)
> [    8.318933] Bluetooth: hci0: Mediatek coredump end
> [    8.566804] igc 0000:64:00.0 enp100s0: NIC Link is Up 1000 Mbps Full Duplex, Flow Control: RX
> [    9.199113] Bluetooth: hci0: Mediatek coredump end
> [    9.209081] Bluetooth: hci0: Opcode 0x0c03 failed: -110
> [   11.342488] Bluetooth: hci0: Failed to read MSFT supported features (-110)
> [   13.455279] block nvme0n1: No UUID available providing old NGUID
> [   13.478988] Bluetooth: hci0: AOSP get vendor capabilities (-110)
> [   16.117052] wlo1: regulatory prevented using AP config, downgraded
> [   16.123049] wlo1: authenticate with XX:XX:XX:XX:XX:XX (local address=XX:XX:XX:XX:XX:XX)
> [   16.124244] wlo1: send auth to XX:XX:XX:XX:XX:XX (try 1/3)
> [   16.166021] wlo1: authenticated
> [   16.172421] wlo1: associate with XX:XX:XX:XX:XX:XX (try 1/3)
> [   16.174455] wlo1: RX AssocResp from XX:XX:XX:XX:XX:XX (capab=0x111 status=0 aid=1)
> [   16.184782] wlo1: associated
> [   16.246848] wlo1: Limiting TX power to 23 (26 - 3) dBm as advertised by XX:XX:XX:XX:XX:XX
> [   17.488650] warning: `ThreadPoolForeg' uses wireless extensions which will stop working for Wi-Fi 7 hardware; use nl80211
> [   17.531765] platform INT3515:01: deferred probe pending: Serial bus multi instantiate pseudo device driver: Error creating i2c-client, idx 0
> [   17.531769] platform INT3515:02: deferred probe pending: Serial bus multi instantiate pseudo device driver: Error creating i2c-client, idx 0
> [   18.595698] usb 4-1: Disable of device-initiated U1 failed.
> [   23.715878] usb 4-1: Disable of device-initiated U2 failed.
> [   33.956071] Bluetooth: hci0: Failed to write uhw reg(-110)
> [   33.956138] usb 4-1: Disable of device-initiated U2 failed.
> [   39.293677] xhci_hcd 0000:00:14.0: Timeout while waiting for setup device command
> [   44.634497] xhci_hcd 0000:00:14.0: Timeout while waiting for setup device command
> [   44.841067] usb 4-1: device not accepting address 2, error -62
> [   50.186371] xhci_hcd 0000:00:14.0: Timeout while waiting for setup device command
> [   55.523585] xhci_hcd 0000:00:14.0: Timeout while waiting for setup device command
> [   55.729841] usb 4-1: device not accepting address 2, error -62
> [   61.072634] xhci_hcd 0000:00:14.0: Timeout while waiting for setup device command
> [   66.407700] xhci_hcd 0000:00:14.0: Timeout while waiting for setup device command
> [   66.614207] usb 4-1: device not accepting address 2, error -62
> [   71.955541] xhci_hcd 0000:00:14.0: Timeout while waiting for setup device command
> [   77.289925] xhci_hcd 0000:00:14.0: Timeout while waiting for setup device command
> [   77.496512] usb 4-1: device not accepting address 2, error -62
> [   77.513500] usb 4-1: USB disconnect, device number 2
> [   82.837128] xhci_hcd 0000:00:14.0: Timeout while waiting for setup device command
> [   88.171049] xhci_hcd 0000:00:14.0: Timeout while waiting for setup device command
> [   88.377554] usb 4-1: device not accepting address 3, error -62
> [   93.718045] xhci_hcd 0000:00:14.0: Timeout while waiting for setup device command
> [   99.051387] xhci_hcd 0000:00:14.0: Timeout while waiting for setup device command
> [   99.258078] usb 4-1: device not accepting address 4, error -62
> [   99.266739] usb usb4-port1: attempt power cycle
> [  106.518206] xhci_hcd 0000:00:14.0: Timeout while waiting for setup device command
> [  111.851387] xhci_hcd 0000:00:14.0: Timeout while waiting for setup device command
> [  112.057840] usb 4-1: device not accepting address 5, error -62
> [  117.397862] xhci_hcd 0000:00:14.0: Timeout while waiting for setup device command
> [  122.732729] xhci_hcd 0000:00:14.0: Timeout while waiting for setup device command
> [  122.937708] usb 4-1: device not accepting address 6, error -62
> [  122.944587] usb usb4-port1: unable to enumerate USB device
> 
> 
> 
> >
> > >
> > > External email : Please do not click links or open attachments until
> > > you have verified the sender or the content.
> > >  Hi,
> > >
> > > The 22/08/2024 13:23, Hao Qin wrote:
> > > > Remove resetting mt7921 before downloading the fw, as it may cause
> > > > command timeout when performing the reset.
> > > >
> > > > Signed-off-by: Hao Qin <hao.qin at mediatek.com<mailto:hao.qin at mediatek.com>>
> > > > ---
> > > >  drivers/bluetooth/btmtk.c | 4 ++--
> > > >  1 file changed, 2 insertions(+), 2 deletions(-)
> > > >
> > > > diff --git a/drivers/bluetooth/btmtk.c b/drivers/bluetooth/btmtk.c
> > > > index 2b7c80043aa2..a46f70135cbd 100644
> > > > --- a/drivers/bluetooth/btmtk.c
> > > > +++ b/drivers/bluetooth/btmtk.c
> > > > @@ -1326,7 +1326,6 @@ int btmtk_usb_setup(struct hci_dev *hdev)
> > > >  fwname = FIRMWARE_MT7668;
> > > >  break;
> > > >  case 0x7922:
> > > > -case 0x7961:
> > > >  case 0x7925:
> > > >  /* Reset the device to ensure it's in the initial state before
> > > >   * downloading the firmware to ensure.
> > > > @@ -1334,7 +1333,8 @@ int btmtk_usb_setup(struct hci_dev *hdev)
> > > >
> > > >  if (!test_bit(BTMTK_FIRMWARE_LOADED, &btmtk_data->flags))
> > > >  btmtk_usb_subsys_reset(hdev, dev_id);
> > > > -
> > > > +fallthrough;
> > > > +case 0x7961:
> > > >  btmtk_fw_get_filename(fw_bin_name, sizeof(fw_bin_name), dev_id,
> > > >        fw_version, fw_flavor);
> > > >
> > > > --
> > > > 2.18.0
> > > >
> > >
> > > [Original regression report
> > >
> > https://lore.kernel.org/linux-bluetooth/ZsTh7Jyug7MbZsLE at mdpsys.co.uk/
> > > ]
> > >
> > > Thanks for the patch, I have tested it on top of v6.11-rc7 and can
> > > confirm
> > > that it resolves the initial command timeout issue.
> > >
> > > Unfortunately, when using the latest firmware version 20240826151221
> > > from the
> > > linux-firmware repo I'm still seeing "Mediatek coredump end" errors
> > > followed by MSFT and AOSP errors. The device then appears
> > > unresponsive
> > > and the kernel eventually gives up attempting to enumerate:
> > >
> > > [  230.042936] usb 4-3.2: new SuperSpeed USB device number 4 using
> > > xhci_hcd
> > > [  230.065228] usb 4-3.2: New USB device found, idVendor=0e8d,
> > > idProduct=7961, bcdDevice= 1.00
> > > [  230.065237] usb 4-3.2: New USB device strings: Mfr=6, Product=7,
> > > SerialNumber=8
> > > [  230.065240] usb 4-3.2: Product: Wireless_Device
> > > [  230.065242] usb 4-3.2: Manufacturer: MediaTek Inc.
> > > [  230.065245] usb 4-3.2: SerialNumber: 000000000
> > > [  230.101915] Bluetooth: hci2: HW/SW Version: 0x008a008a, Build
> > > Time: 20240826151221
> > > [  233.005938] Bluetooth: hci2: Device setup in 2862056 usecs
> > > [  233.005983] Bluetooth: hci2: HCI Enhanced Setup Synchronous
> > > Connection command is advertised, but not supported.
> > > [  234.306071] Bluetooth: hci2: Mediatek coredump end
> > > [  235.092729] Bluetooth: hci2: Opcode 0x0c03 failed: -110
> > > [  235.192772] Bluetooth: hci2: Mediatek coredump end
> > > [  237.226157] Bluetooth: hci2: Failed to read MSFT supported
> > > features (-110)
> > > [  239.359435] Bluetooth: hci2: AOSP get vendor capabilities (-110)
> > > [  244.479726] usb 4-3.2: Disable of device-initiated U1 failed.
> > > [  249.599598] usb 4-3.2: Disable of device-initiated U2 failed.
> > > [  259.839215] Bluetooth: hci2: Failed to write uhw reg(-110)
> > > [  259.839240] usb 4-3.2: Disable of device-initiated U1 failed.
> > > [  264.959343] usb 4-3.2: Disable of device-initiated U2 failed.
> > > [  270.079038] xhci_hcd 0000:00:14.0: Timeout while waiting for setup
> > > device command
> > > [  275.412299] xhci_hcd 0000:00:14.0: Timeout while waiting for setup
> > > device command
> > > [  275.618812] usb 4-3.2: device not accepting address 4, error -62
> > > [  280.958852] xhci_hcd 0000:00:14.0: Timeout while waiting for setup
> > > device command
> > > [  286.292034] xhci_hcd 0000:00:14.0: Timeout while waiting for setup
> > > device command
> > > [  286.498618] usb 4-3.2: device not accepting address 4, error -62
> > > [  291.838759] xhci_hcd 0000:00:14.0: Timeout while waiting for setup
> > > device command
> > > [  297.172018] xhci_hcd 0000:00:14.0: Timeout while waiting for setup
> > > device command
> > > [  297.378477] usb 4-3.2: device not accepting address 4, error -62
> > > [  302.718497] xhci_hcd 0000:00:14.0: Timeout while waiting for setup
> > > device command
> > > [  308.051867] xhci_hcd 0000:00:14.0: Timeout while waiting for setup
> > > device command
> > > [  308.258345] usb 4-3.2: device not accepting address 4, error -62
> > > [  308.260253] usb 4-3.2: USB disconnect, device number 4
> > > [  313.598307] xhci_hcd 0000:00:14.0: Timeout while waiting for setup
> > > device command
> > > [  318.931586] xhci_hcd 0000:00:14.0: Timeout while waiting for setup
> > > device command
> > > [  319.138278] usb 4-3.2: device not accepting address 5, error -62
> > > [  324.478224] xhci_hcd 0000:00:14.0: Timeout while waiting for setup
> > > device command
> > > [  329.811444] xhci_hcd 0000:00:14.0: Timeout while waiting for setup
> > > device command
> > > [  330.018032] usb 4-3.2: device not accepting address 6, error -62
> > > [  330.018489] usb 4-3-port2: attempt power cycle
> > > [  336.211505] xhci_hcd 0000:00:14.0: Timeout while waiting for setup
> > > device command
> > > [  341.544640] xhci_hcd 0000:00:14.0: Timeout while waiting for setup
> > > device command
> > > [  341.751239] usb 4-3.2: device not accepting address 7, error -62
> > > [  347.091375] xhci_hcd 0000:00:14.0: Timeout while waiting for setup
> > > device command
> > > [  352.424563] xhci_hcd 0000:00:14.0: Timeout while waiting for setup
> > > device command
> > > [  352.631136] usb 4-3.2: device not accepting address 8, error -62
> > > [  352.631538] usb 4-3-port2: unable to enumerate USB device
> > >
> > >
> > > Interestingly, if I revert back to an known-good firmware version
> > > 20231025113744 along with your patch, the device enumerates and works
> > > fine:
> > >
> > > [ 4001.366725] usb 4-1: new SuperSpeed USB device number 4 using
> > > xhci_hcd
> > > [ 4001.385840] usb 4-1: New USB device found, idVendor=0e8d,
> > > idProduct=7961, bcdDevice= 1.00
> > > [ 4001.385855] usb 4-1: New USB device strings: Mfr=6, Product=7,
> > > SerialNumber=8
> > > [ 4001.385860] usb 4-1: Product: Wireless_Device
> > > [ 4001.385863] usb 4-1: Manufacturer: MediaTek Inc.
> > > [ 4001.385867] usb 4-1: SerialNumber: 000000000
> > > [ 4001.398010] Bluetooth: hci1: HW/SW Version: 0x008a008a, Build
> > > Time: 20231025113744
> > > [ 4004.275656] Bluetooth: hci1: Device setup in 2812288 usecs
> > > [ 4004.275661] Bluetooth: hci1: HCI Enhanced Setup Synchronous
> > > Connection command is advertised, but not supported.
> > > [ 4004.355137] Bluetooth: hci1: AOSP extensions version v0.96
> > > [ 4004.355156] Bluetooth: hci1: AOSP quality report is not supported
> > > [ 4004.355698] Bluetooth: MGMT ver 1.23
> > >
> > > But if I then disconnect it, I get the Oops that I shared in my
> > > original
> > > regression report:
> > >
> > > [ 4043.436215] usb 4-1: USB disconnect, device number 4
> > > [ 4043.437308] Oops: general protection fault, probably for non-
> > > canonical address 0xdead000000000122: 0000 [#1] PREEMPT SMP NOPTI
> > > [ 4043.437332] CPU: 2 UID: 0 PID: 3698 Comm: kworker/2:0 Not tainted
> > > 6.11.0-rc7-00001-g0e2ad6528188-dirty #71
> > > d90fb9085e2a0686ac48ebcc408d97b104c6fbf1
> > > [ 4043.437352] Hardware name: Intel(R) Client Systems
> > > NUC12WSHi7/NUC12WSBi7, BIOS WSADL357.0088.2023.0505.1623 05/05/2023
> > > [ 4043.437361] Workqueue: usb_hub_wq hub_event
> > > [ 4043.437386] RIP: 0010:hci_unregister_dev+0x45/0x1f0 [bluetooth]
> > > [ 4043.437548] Code: 89 ef e8 ae d4 5c c1 f0 80 8b e9 0e 00 00 08 48
> > > 89 ef e8 0e c2 5c c1 48 c7 c7 68 60 52 c1 e8 22 23 5d c1 48 8b 43 08
> > > 48 8b 13 <48> 3b 18 0f 85 f5 c7 06 00 48 3b 5a 08 0f 85 eb c7 06 00
> > > 48 89 42
> > > [ 4043.437560] RSP: 0018:ffffa10f4ae43b98 EFLAGS: 00010246
> > > [ 4043.437574] RAX: dead000000000122 RBX: ffff8cf86c160000 RCX:
> > > 0000000000000000
> > > [ 4043.437585] RDX: dead000000000100 RSI: ffff8cf7b7d16c50 RDI:
> > > ffffffffc1526068
> > > [ 4043.437594] RBP: ffff8cf86c1604d0 R08: 0000000000000000 R09:
> > > ffff8cf7401d8e10
> > > [ 4043.437602] R10: ffffa10f4ae43ba0 R11: ffffa10f4ae43ba8 R12:
> > > ffff8cf86c160000
> > > [ 4043.437610] R13: ffffffffc1416278 R14: ffffffffc1416278 R15:
> > > ffff8cf7f8d73850
> > > [ 4043.437620] FS:  0000000000000000(0000) GS:ffff8d0697300000(0000)
> > > knlGS:0000000000000000
> > > [ 4043.437632] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
> > > [ 4043.437641] CR2: 00007f98d66dc000 CR3: 0000000131124000 CR4:
> > > 0000000000f50ef0
> > > [ 4043.437651] PKRU: 55555554
> > > [ 4043.437658] Call Trace:
> > > [ 4043.437670]  <TASK>
> > > [ 4043.437680]  ? __die_body.cold+0x19/0x27
> > > [ 4043.437700]  ? die_addr+0x3c/0x60
> > > [ 4043.437716]  ? exc_general_protection+0x17d/0x400
> > > [ 4043.437738]  ? asm_exc_general_protection+0x26/0x30
> > > [ 4043.437760]  ? hci_unregister_dev+0x45/0x1f0 [bluetooth
> > > 6dca047d1088401e195d97746b2b4936e5756d61]
> > > [ 4043.437930]  ? hci_unregister_dev+0x3e/0x1f0 [bluetooth
> > > 6dca047d1088401e195d97746b2b4936e5756d61]
> > > [ 4043.438080]  btusb_disconnect+0x67/0x170 [btusb
> > > 5bf8186d9cab4c5be1762247dadb6753a7c72a7f]
> > > [ 4043.438108]  usb_unbind_interface+0x90/0x290
> > > [ 4043.438130]  device_release_driver_internal+0x19c/0x200
> > > [ 4043.438150]  bus_remove_device+0xc6/0x130
> > > [ 4043.438166]  device_del+0x161/0x3e0
> > > [ 4043.438182]  ? kobject_put+0xa0/0x1d0
> > > [ 4043.438196]  usb_disable_device+0x104/0x220
> > > [ 4043.438213]  usb_disconnect+0xe6/0x2e0
> > > [ 4043.438231]  hub_event+0x7f9/0x19d0
> > > [ 4043.438250]  ? __pm_runtime_suspend+0x47/0xc0
> > > [ 4043.438269]  process_one_work+0x17b/0x330
> > > [ 4043.438287]  worker_thread+0x2c6/0x3f0
> > > [ 4043.438304]  ? __pfx_worker_thread+0x10/0x10
> > > [ 4043.438318]  kthread+0xcf/0x100
> > > [ 4043.438337]  ? __pfx_kthread+0x10/0x10
> > > [ 4043.438354]  ret_from_fork+0x31/0x50
> > > [ 4043.438367]  ? __pfx_kthread+0x10/0x10
> > > [ 4043.438382]  ret_from_fork_asm+0x1a/0x30
> > > [ 4043.438403]  </TASK>
> > > [ 4043.438408] Modules linked in: uhid mt792x_usb mt7921_common
> > > mt792x_lib mt76_connac_lib mt76_usb mt76 ccm option usb_wwan cmac
> > > algif_hash algif_skcipher af_alg sr_mod cdrom bnep mousedev joydev
> > > vfat fat snd_sof_pci_intel_tgl snd_sof_pci_intel_cnl intel_rapl_msr
> > > snd_sof_intel_hda_generic intel_rapl_common soundwire_intel
> > > intel_uncore_frequency soundwire_cadence
> > > intel_uncore_frequency_common snd_sof_intel_hda_common
> > > snd_sof_intel_hda_mlink snd_sof_intel_hda snd_sof_pci
> > > snd_sof_xtensa_dsp snd_sof iwlmvm snd_sof_utils snd_soc_hdac_hda
> > > snd_soc_acpi_intel_match soundwire_generic_allocation snd_soc_acpi
> > > soundwire_bus snd_soc_avs r8152 x86_pkg_temp_thermal intel_powerclamp
> > > libphy snd_soc_hda_codec coretemp mac80211 snd_hda_ext_core kvm_intel
> > > snd_soc_core snd_hda_codec_hdmi cdc_ether hid_generic uas usbnet
> > > snd_hda_codec_realtek snd_compress kvm usb_storage mii usbhid
> > > snd_hda_codec_generic ac97_bus snd_pcm_dmaengine
> > > snd_hda_scodec_component snd_hda_intel libarc4 snd_intel_dspcfg btusb
> > > crct10dif_pclmul snd_intel_sdw_acpi
> > > [ 4043.438617]  crc32_pclmul iwlwifi btrtl snd_hda_codec
> > > polyval_clmulni btintel polyval_generic btbcm ghash_clmulni_intel
> > > sha512_ssse3 btmtk tps6598x sha256_ssse3 snd_hda_core typec
> > > sha1_ssse3 cfg80211 bluetooth aesni_intel snd_hwdep roles gf128mul
> > > crypto_simd snd_pcm cryptd mei_hdcp mei_pxp rapl ee1004 ov13858
> > > snd_timer intel_cstate igc spi_nor intel_uncore i2c_i801 thunderbolt
> > > snd v4l2_fwnode mei_me v4l2_async ptp wdat_wdt i2c_smbus mtd pcspkr
> > > wmi_bmof intel_lpss_pci videodev mei pps_core soundcore
> > > intel_pmc_core i2c_mux intel_lpss rfkill idma64 igen6_edac intel_vsec
> > > serial_multi_instantiate mc pmt_telemetry pinctrl_tigerlake pmt_class
> > > acpi_pad acpi_tad mac_hid i2c_dev dm_mod sg crypto_user loop
> > > nfnetlink ip_tables x_tables ext4 crc32c_generic crc16 mbcache jbd2
> > > xe drm_ttm_helper gpu_sched drm_suballoc_helper drm_gpuvm drm_exec
> > > i915 i2c_algo_bit drm_buddy ttm nvme intel_gtt drm_display_helper
> > > nvme_core spi_intel_pci cec xhci_pci crc32c_intel spi_intel nvme_auth
> > > xhci_pci_renesas video wmi
> > > [ 4043.438898] ---[ end trace 0000000000000000 ]---
> > > [ 4043.438905] RIP: 0010:hci_unregister_dev+0x45/0x1f0 [bluetooth]
> > > [ 4043.439039] Code: 89 ef e8 ae d4 5c c1 f0 80 8b e9 0e 00 00 08 48
> > > 89 ef e8 0e c2 5c c1 48 c7 c7 68 60 52 c1 e8 22 23 5d c1 48 8b 43 08
> > > 48 8b 13 <48> 3b 18 0f 85 f5 c7 06 00 48 3b 5a 08 0f 85 eb c7 06 00
> > > 48 89 42
> > > [ 4043.439048] RSP: 0018:ffffa10f4ae43b98 EFLAGS: 00010246
> > > [ 4043.439058] RAX: dead000000000122 RBX: ffff8cf86c160000 RCX:
> > > 0000000000000000
> > > [ 4043.439065] RDX: dead000000000100 RSI: ffff8cf7b7d16c50 RDI:
> > > ffffffffc1526068
> > > [ 4043.439072] RBP: ffff8cf86c1604d0 R08: 0000000000000000 R09:
> > > ffff8cf7401d8e10
> > > [ 4043.439078] R10: ffffa10f4ae43ba0 R11: ffffa10f4ae43ba8 R12:
> > > ffff8cf86c160000
> > > [ 4043.439085] R13: ffffffffc1416278 R14: ffffffffc1416278 R15:
> > > ffff8cf7f8d73850
> > > [ 4043.439091] FS:  0000000000000000(0000) GS:ffff8d0697300000(0000)
> > > knlGS:0000000000000000
> > > [ 4043.439100] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
> > > [ 4043.439108] CR2: 00007f98d66dc000 CR3: 0000000131124000 CR4:
> > > 0000000000f50ef0
> > > [ 4043.439116] PKRU: 55555554
> > > [ 4043.439122] note: kworker/2:0[3698] exited with preempt_count 1
> > >
> > > So, in summary, it looks as though there are two issues here:
> > >
> > > 1. The latest firmware does not seem to work well with this chipset,
> > >    perhaps it is crashing after loading?
> > > 2. The Oops in the hci_unregister_dev function suggests some HCI
> > >    registration bug.
> > >
> > > Let me know if I can provide any further assistance.
> > >
> > > Regards,
> > >
> > > Marc
> > >
> 

-- 
Marc Payne


From ilias.apalodimas at linaro.org  Wed Sep 18 10:06:34 2024
From: ilias.apalodimas at linaro.org (Ilias Apalodimas)
Date: Wed, 18 Sep 2024 20:06:34 +0300
Subject: [PATCH net 2/2] page_pool: fix IOMMU crash when driver has
 already unbound
In-Reply-To: <20240918111826.863596-3-linyunsheng@huawei.com>
References: <20240918111826.863596-1-linyunsheng@huawei.com> <20240918111826.863596-3-linyunsheng@huawei.com>
Message-ID: <CAC_iWjK=G7Oo5=pN2QunhasgDC6NyC1L+96jigX7u9ad+PbYng@mail.gmail.com>

Hi Yunsheng,

Thanks for looking into this!

On Wed, 18 Sept 2024 at 14:24, Yunsheng Lin <linyunsheng at huawei.com> wrote:
>
> Networking driver with page_pool support may hand over page
> still with dma mapping to network stack and try to reuse that
> page after network stack is done with it and passes it back
> to page_pool to avoid the penalty of dma mapping/unmapping.

I think you can shorten this to "If recycling and DMA mapping are
enabled during the pool creation"

> With all the caching in the network stack, some pages may be
> held in the network stack without returning to the page_pool
> soon enough, and with VF disable causing the driver unbound,
> the page_pool does not stop the driver from doing it's
> unbounding work, instead page_pool uses workqueue to check
> if there is some pages coming back from the network stack
> periodically, if there is any, it will do the dma unmmapping
> related cleanup work.
>
> As mentioned in [1], attempting DMA unmaps after the driver
> has already unbound may leak resources or at worst corrupt
> memory. Fundamentally, the page pool code cannot allow DMA
> mappings to outlive the driver they belong to.
>
> Currently it seems there are at least two cases that the page
> is not released fast enough causing dma unmmapping done after
> driver has already unbound:
> 1. ipv4 packet defragmentation timeout: this seems to cause
>    delay up to 30 secs:
>
> 2. skb_defer_free_flush(): this may cause infinite delay if
>    there is no triggering for net_rx_action().
>
> In order not to do the dma unmmapping after driver has already
> unbound and stall the unloading of the networking driver, add
> the pool->items array to record all the pages including the ones
> which are handed over to network stack, so the page_pool can
> do the dma unmmapping for those pages when page_pool_destroy()
> is called.

So, I was thinking of a very similar idea. But what do you mean by
"all"? The pages that are still in caches (slow or fast) of the pool
will be unmapped during page_pool_destroy().
Don't we 'just' need a list of the inflight packets and their pages or
fragments? What we could do is go through that list and unmap these
pages during page_pool_destroy().

I'll have a closer look at the patch tomorrow

Thanks!
/Ilias



> Note, the devmem patchset seems to make the bug harder to fix,
> and may make backporting harder too. As there is no actual user
> for the devmem and the fixing for devmem is unclear for now,
> this patch does not consider fixing the case for devmem yet.
>
> 1. https://lore.kernel.org/lkml/8067f204-1380-4d37-8ffd-007fc6f26738 at kernel.org/T/
>
> Fixes: f71fec47c2df ("page_pool: make sure struct device is stable")
> Signed-off-by: Yunsheng Lin <linyunsheng at huawei.com>
> CC: Robin Murphy <robin.murphy at arm.com>
> CC: Alexander Duyck <alexander.duyck at gmail.com>
> CC: IOMMU <iommu at lists.linux.dev>
> ---
>  drivers/net/ethernet/freescale/fec_main.c     |   8 +-
>  drivers/net/ethernet/intel/iavf/iavf_txrx.c   |   6 +-
>  drivers/net/ethernet/intel/idpf/idpf_txrx.c   |  14 +-
>  drivers/net/ethernet/intel/libeth/rx.c        |   2 +-
>  .../net/ethernet/mellanox/mlx5/core/en/xdp.c  |   3 +-
>  drivers/net/netdevsim/netdev.c                |   6 +-
>  drivers/net/wireless/mediatek/mt76/mt76.h     |   2 +-
>  include/linux/mm_types.h                      |   2 +-
>  include/linux/skbuff.h                        |   1 +
>  include/net/libeth/rx.h                       |   3 +-
>  include/net/netmem.h                          |  10 +-
>  include/net/page_pool/helpers.h               |  11 ++
>  include/net/page_pool/types.h                 |  15 +-
>  net/core/devmem.c                             |   4 +-
>  net/core/netmem_priv.h                        |   5 +-
>  net/core/page_pool.c                          | 161 +++++++++++++++---
>  net/core/page_pool_priv.h                     |  10 +-
>  net/core/skbuff.c                             |   3 +-
>  net/core/xdp.c                                |   3 +-
>  19 files changed, 212 insertions(+), 57 deletions(-)
>
> diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c
> index acbb627d51bf..c00f8c460759 100644
> --- a/drivers/net/ethernet/freescale/fec_main.c
> +++ b/drivers/net/ethernet/freescale/fec_main.c
> @@ -1009,7 +1009,8 @@ static void fec_enet_bd_init(struct net_device *dev)
>                                 struct page *page = txq->tx_buf[i].buf_p;
>
>                                 if (page)
> -                                       page_pool_put_page(page->pp, page, 0, false);
> +                                       page_pool_put_page(page_pool_to_pp(page),
> +                                                          page, 0, false);
>                         }
>
>                         txq->tx_buf[i].buf_p = NULL;
> @@ -1538,7 +1539,7 @@ fec_enet_tx_queue(struct net_device *ndev, u16 queue_id, int budget)
>                         xdp_return_frame_rx_napi(xdpf);
>                 } else { /* recycle pages of XDP_TX frames */
>                         /* The dma_sync_size = 0 as XDP_TX has already synced DMA for_device */
> -                       page_pool_put_page(page->pp, page, 0, true);
> +                       page_pool_put_page(page_pool_to_pp(page), page, 0, true);
>                 }
>
>                 txq->tx_buf[index].buf_p = NULL;
> @@ -3300,7 +3301,8 @@ static void fec_enet_free_buffers(struct net_device *ndev)
>                         } else {
>                                 struct page *page = txq->tx_buf[i].buf_p;
>
> -                               page_pool_put_page(page->pp, page, 0, false);
> +                               page_pool_put_page(page_pool_to_pp(page),
> +                                                  page, 0, false);
>                         }
>
>                         txq->tx_buf[i].buf_p = NULL;
> diff --git a/drivers/net/ethernet/intel/iavf/iavf_txrx.c b/drivers/net/ethernet/intel/iavf/iavf_txrx.c
> index 26b424fd6718..658d8f9a6abb 100644
> --- a/drivers/net/ethernet/intel/iavf/iavf_txrx.c
> +++ b/drivers/net/ethernet/intel/iavf/iavf_txrx.c
> @@ -1050,7 +1050,8 @@ static void iavf_add_rx_frag(struct sk_buff *skb,
>                              const struct libeth_fqe *rx_buffer,
>                              unsigned int size)
>  {
> -       u32 hr = rx_buffer->page->pp->p.offset;
> +       struct page_pool *pool = page_pool_to_pp(rx_buffer->page);
> +       u32 hr = pool->p.offset;
>
>         skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags, rx_buffer->page,
>                         rx_buffer->offset + hr, size, rx_buffer->truesize);
> @@ -1067,7 +1068,8 @@ static void iavf_add_rx_frag(struct sk_buff *skb,
>  static struct sk_buff *iavf_build_skb(const struct libeth_fqe *rx_buffer,
>                                       unsigned int size)
>  {
> -       u32 hr = rx_buffer->page->pp->p.offset;
> +       struct page_pool *pool = page_pool_to_pp(rx_buffer->page);
> +       u32 hr = pool->p.offset;
>         struct sk_buff *skb;
>         void *va;
>
> diff --git a/drivers/net/ethernet/intel/idpf/idpf_txrx.c b/drivers/net/ethernet/intel/idpf/idpf_txrx.c
> index d4e6f0e10487..e3389f1a215f 100644
> --- a/drivers/net/ethernet/intel/idpf/idpf_txrx.c
> +++ b/drivers/net/ethernet/intel/idpf/idpf_txrx.c
> @@ -385,7 +385,8 @@ static void idpf_rx_page_rel(struct libeth_fqe *rx_buf)
>         if (unlikely(!rx_buf->page))
>                 return;
>
> -       page_pool_put_full_page(rx_buf->page->pp, rx_buf->page, false);
> +       page_pool_put_full_page(page_pool_to_pp(rx_buf->page), rx_buf->page,
> +                               false);
>
>         rx_buf->page = NULL;
>         rx_buf->offset = 0;
> @@ -3097,7 +3098,8 @@ idpf_rx_process_skb_fields(struct idpf_rx_queue *rxq, struct sk_buff *skb,
>  void idpf_rx_add_frag(struct idpf_rx_buf *rx_buf, struct sk_buff *skb,
>                       unsigned int size)
>  {
> -       u32 hr = rx_buf->page->pp->p.offset;
> +       struct page_pool *pool = page_pool_to_pp(rx_buf->page);
> +       u32 hr = pool->p.offset;
>
>         skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags, rx_buf->page,
>                         rx_buf->offset + hr, size, rx_buf->truesize);
> @@ -3129,8 +3131,10 @@ static u32 idpf_rx_hsplit_wa(const struct libeth_fqe *hdr,
>         if (!libeth_rx_sync_for_cpu(buf, copy))
>                 return 0;
>
> -       dst = page_address(hdr->page) + hdr->offset + hdr->page->pp->p.offset;
> -       src = page_address(buf->page) + buf->offset + buf->page->pp->p.offset;
> +       dst = page_address(hdr->page) + hdr->offset +
> +               page_pool_to_pp(hdr->page)->p.offset;
> +       src = page_address(buf->page) + buf->offset +
> +               page_pool_to_pp(buf->page)->p.offset;
>         memcpy(dst, src, LARGEST_ALIGN(copy));
>
>         buf->offset += copy;
> @@ -3148,7 +3152,7 @@ static u32 idpf_rx_hsplit_wa(const struct libeth_fqe *hdr,
>   */
>  struct sk_buff *idpf_rx_build_skb(const struct libeth_fqe *buf, u32 size)
>  {
> -       u32 hr = buf->page->pp->p.offset;
> +       u32 hr = page_pool_to_pp(buf->page)->p.offset;
>         struct sk_buff *skb;
>         void *va;
>
> diff --git a/drivers/net/ethernet/intel/libeth/rx.c b/drivers/net/ethernet/intel/libeth/rx.c
> index f20926669318..385afca0e61d 100644
> --- a/drivers/net/ethernet/intel/libeth/rx.c
> +++ b/drivers/net/ethernet/intel/libeth/rx.c
> @@ -207,7 +207,7 @@ EXPORT_SYMBOL_NS_GPL(libeth_rx_fq_destroy, LIBETH);
>   */
>  void libeth_rx_recycle_slow(struct page *page)
>  {
> -       page_pool_recycle_direct(page->pp, page);
> +       page_pool_recycle_direct(page_pool_to_pp(page), page);
>  }
>  EXPORT_SYMBOL_NS_GPL(libeth_rx_recycle_slow, LIBETH);
>
> diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c b/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c
> index 4610621a340e..83511a45a6dc 100644
> --- a/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c
> +++ b/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c
> @@ -716,7 +716,8 @@ static void mlx5e_free_xdpsq_desc(struct mlx5e_xdpsq *sq,
>                                 /* No need to check ((page->pp_magic & ~0x3UL) == PP_SIGNATURE)
>                                  * as we know this is a page_pool page.
>                                  */
> -                               page_pool_recycle_direct(page->pp, page);
> +                               page_pool_recycle_direct(page_pool_to_pp(page),
> +                                                        page);
>                         } while (++n < num);
>
>                         break;
> diff --git a/drivers/net/netdevsim/netdev.c b/drivers/net/netdevsim/netdev.c
> index 017a6102be0a..9bfa593cd5dd 100644
> --- a/drivers/net/netdevsim/netdev.c
> +++ b/drivers/net/netdevsim/netdev.c
> @@ -593,7 +593,8 @@ nsim_pp_hold_write(struct file *file, const char __user *data,
>                 if (!ns->page)
>                         ret = -ENOMEM;
>         } else {
> -               page_pool_put_full_page(ns->page->pp, ns->page, false);
> +               page_pool_put_full_page(page_pool_to_pp(ns->page), ns->page,
> +                                       false);
>                 ns->page = NULL;
>         }
>         rtnl_unlock();
> @@ -788,7 +789,8 @@ void nsim_destroy(struct netdevsim *ns)
>
>         /* Put this intentionally late to exercise the orphaning path */
>         if (ns->page) {
> -               page_pool_put_full_page(ns->page->pp, ns->page, false);
> +               page_pool_put_full_page(page_pool_to_pp(ns->page), ns->page,
> +                                       false);
>                 ns->page = NULL;
>         }
>
> diff --git a/drivers/net/wireless/mediatek/mt76/mt76.h b/drivers/net/wireless/mediatek/mt76/mt76.h
> index 0b75a45ad2e8..94a277290909 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt76.h
> +++ b/drivers/net/wireless/mediatek/mt76/mt76.h
> @@ -1688,7 +1688,7 @@ static inline void mt76_put_page_pool_buf(void *buf, bool allow_direct)
>  {
>         struct page *page = virt_to_head_page(buf);
>
> -       page_pool_put_full_page(page->pp, page, allow_direct);
> +       page_pool_put_full_page(page_pool_to_pp(page), page, allow_direct);
>  }
>
>  static inline void *
> diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h
> index 485424979254..410187133d27 100644
> --- a/include/linux/mm_types.h
> +++ b/include/linux/mm_types.h
> @@ -120,7 +120,7 @@ struct page {
>                          * page_pool allocated pages.
>                          */
>                         unsigned long pp_magic;
> -                       struct page_pool *pp;
> +                       struct page_pool_item *pp_item;
>                         unsigned long _pp_mapping_pad;
>                         unsigned long dma_addr;
>                         atomic_long_t pp_ref_count;
> diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
> index 39f1d16f3628..64d1ecb7a7fc 100644
> --- a/include/linux/skbuff.h
> +++ b/include/linux/skbuff.h
> @@ -38,6 +38,7 @@
>  #include <net/net_debug.h>
>  #include <net/dropreason-core.h>
>  #include <net/netmem.h>
> +#include <net/page_pool/types.h>
>
>  /**
>   * DOC: skb checksums
> diff --git a/include/net/libeth/rx.h b/include/net/libeth/rx.h
> index 43574bd6612f..beee7ddd77a5 100644
> --- a/include/net/libeth/rx.h
> +++ b/include/net/libeth/rx.h
> @@ -137,7 +137,8 @@ static inline bool libeth_rx_sync_for_cpu(const struct libeth_fqe *fqe,
>                 return false;
>         }
>
> -       page_pool_dma_sync_for_cpu(page->pp, page, fqe->offset, len);
> +       page_pool_dma_sync_for_cpu(page_pool_to_pp(page), page, fqe->offset,
> +                                  len);
>
>         return true;
>  }
> diff --git a/include/net/netmem.h b/include/net/netmem.h
> index 8a6e20be4b9d..27f5d284285e 100644
> --- a/include/net/netmem.h
> +++ b/include/net/netmem.h
> @@ -23,7 +23,7 @@ DECLARE_STATIC_KEY_FALSE(page_pool_mem_providers);
>  struct net_iov {
>         unsigned long __unused_padding;
>         unsigned long pp_magic;
> -       struct page_pool *pp;
> +       struct page_pool_item *pp_item;
>         struct dmabuf_genpool_chunk_owner *owner;
>         unsigned long dma_addr;
>         atomic_long_t pp_ref_count;
> @@ -33,7 +33,7 @@ struct net_iov {
>   *
>   *        struct {
>   *                unsigned long pp_magic;
> - *                struct page_pool *pp;
> + *                struct page_pool *pp_item;
>   *                unsigned long _pp_mapping_pad;
>   *                unsigned long dma_addr;
>   *                atomic_long_t pp_ref_count;
> @@ -49,7 +49,7 @@ struct net_iov {
>         static_assert(offsetof(struct page, pg) == \
>                       offsetof(struct net_iov, iov))
>  NET_IOV_ASSERT_OFFSET(pp_magic, pp_magic);
> -NET_IOV_ASSERT_OFFSET(pp, pp);
> +NET_IOV_ASSERT_OFFSET(pp_item, pp_item);
>  NET_IOV_ASSERT_OFFSET(dma_addr, dma_addr);
>  NET_IOV_ASSERT_OFFSET(pp_ref_count, pp_ref_count);
>  #undef NET_IOV_ASSERT_OFFSET
> @@ -127,9 +127,9 @@ static inline struct net_iov *__netmem_clear_lsb(netmem_ref netmem)
>         return (struct net_iov *)((__force unsigned long)netmem & ~NET_IOV);
>  }
>
> -static inline struct page_pool *netmem_get_pp(netmem_ref netmem)
> +static inline struct page_pool_item *netmem_get_pp_item(netmem_ref netmem)
>  {
> -       return __netmem_clear_lsb(netmem)->pp;
> +       return __netmem_clear_lsb(netmem)->pp_item;
>  }
>
>  static inline atomic_long_t *netmem_get_pp_ref_count_ref(netmem_ref netmem)
> diff --git a/include/net/page_pool/helpers.h b/include/net/page_pool/helpers.h
> index 793e6fd78bc5..ed068b3cee3b 100644
> --- a/include/net/page_pool/helpers.h
> +++ b/include/net/page_pool/helpers.h
> @@ -83,6 +83,17 @@ static inline u64 *page_pool_ethtool_stats_get(u64 *data, const void *stats)
>  }
>  #endif
>
> +static inline struct page_pool *page_pool_to_pp(struct page *page)
> +{
> +       struct page_pool_item *item = page->pp_item;
> +       struct page_pool *pool;
> +
> +       item -= item->pp_idx;
> +       pool = (struct page_pool *)item;
> +
> +       return --pool;
> +}
> +
>  /**
>   * page_pool_dev_alloc_pages() - allocate a page.
>   * @pool:      pool from which to allocate
> diff --git a/include/net/page_pool/types.h b/include/net/page_pool/types.h
> index c022c410abe3..526250ed812a 100644
> --- a/include/net/page_pool/types.h
> +++ b/include/net/page_pool/types.h
> @@ -142,6 +142,11 @@ struct page_pool_stats {
>  };
>  #endif
>
> +struct page_pool_item {
> +       netmem_ref pp_netmem;
> +       unsigned int pp_idx;
> +};
> +
>  /* The whole frag API block must stay within one cacheline. On 32-bit systems,
>   * sizeof(long) == sizeof(int), so that the block size is ``3 * sizeof(long)``.
>   * On 64-bit systems, the actual size is ``2 * sizeof(long) + sizeof(int)``.
> @@ -161,6 +166,8 @@ struct page_pool {
>
>         int cpuid;
>         u32 pages_state_hold_cnt;
> +       unsigned int item_mask;
> +       unsigned int item_idx;
>
>         bool has_init_callback:1;       /* slow::init_callback is set */
>         bool dma_map:1;                 /* Perform DMA mapping */
> @@ -228,7 +235,11 @@ struct page_pool {
>          */
>         refcount_t user_cnt;
>
> -       u64 destroy_cnt;
> +       /* Lock to avoid doing dma unmapping concurrently when
> +        * destroy_cnt > 0.
> +        */
> +       spinlock_t destroy_lock;
> +       unsigned int destroy_cnt;
>
>         /* Slow/Control-path information follows */
>         struct page_pool_params_slow slow;
> @@ -239,6 +250,8 @@ struct page_pool {
>                 u32 napi_id;
>                 u32 id;
>         } user;
> +
> +       struct page_pool_item items[] ____cacheline_aligned_in_smp;
>  };
>
>  struct page *page_pool_alloc_pages(struct page_pool *pool, gfp_t gfp);
> diff --git a/net/core/devmem.c b/net/core/devmem.c
> index 11b91c12ee11..09c5aa83f12a 100644
> --- a/net/core/devmem.c
> +++ b/net/core/devmem.c
> @@ -85,7 +85,7 @@ net_devmem_alloc_dmabuf(struct net_devmem_dmabuf_binding *binding)
>         niov = &owner->niovs[index];
>
>         niov->pp_magic = 0;
> -       niov->pp = NULL;
> +       niov->pp_item = NULL;
>         atomic_long_set(&niov->pp_ref_count, 0);
>
>         return niov;
> @@ -380,7 +380,7 @@ bool mp_dmabuf_devmem_release_page(struct page_pool *pool, netmem_ref netmem)
>         if (WARN_ON_ONCE(refcount != 1))
>                 return false;
>
> -       page_pool_clear_pp_info(netmem);
> +       page_pool_clear_pp_info(pool, netmem);
>
>         net_devmem_free_dmabuf(netmem_to_net_iov(netmem));
>
> diff --git a/net/core/netmem_priv.h b/net/core/netmem_priv.h
> index 7eadb8393e00..3173f6070cf7 100644
> --- a/net/core/netmem_priv.h
> +++ b/net/core/netmem_priv.h
> @@ -18,9 +18,10 @@ static inline void netmem_clear_pp_magic(netmem_ref netmem)
>         __netmem_clear_lsb(netmem)->pp_magic = 0;
>  }
>
> -static inline void netmem_set_pp(netmem_ref netmem, struct page_pool *pool)
> +static inline void netmem_set_pp_item(netmem_ref netmem,
> +                                     struct page_pool_item *item)
>  {
> -       __netmem_clear_lsb(netmem)->pp = pool;
> +       __netmem_clear_lsb(netmem)->pp_item = item;
>  }
>
>  static inline void netmem_set_dma_addr(netmem_ref netmem,
> diff --git a/net/core/page_pool.c b/net/core/page_pool.c
> index bec6e717cd22..1f3017a2e0a0 100644
> --- a/net/core/page_pool.c
> +++ b/net/core/page_pool.c
> @@ -267,14 +267,12 @@ static int page_pool_init(struct page_pool *pool,
>                 return -ENOMEM;
>         }
>
> +       spin_lock_init(&pool->destroy_lock);
>         atomic_set(&pool->pages_state_release_cnt, 0);
>
>         /* Driver calling page_pool_create() also call page_pool_destroy() */
>         refcount_set(&pool->user_cnt, 1);
>
> -       if (pool->dma_map)
> -               get_device(pool->p.dev);
> -
>         if (pool->slow.flags & PP_FLAG_ALLOW_UNREADABLE_NETMEM) {
>                 /* We rely on rtnl_lock()ing to make sure netdev_rx_queue
>                  * configuration doesn't change while we're initializing
> @@ -312,15 +310,93 @@ static void page_pool_uninit(struct page_pool *pool)
>  {
>         ptr_ring_cleanup(&pool->ring, NULL);
>
> -       if (pool->dma_map)
> -               put_device(pool->p.dev);
> -
>  #ifdef CONFIG_PAGE_POOL_STATS
>         if (!pool->system)
>                 free_percpu(pool->recycle_stats);
>  #endif
>  }
>
> +static void page_pool_item_init(struct page_pool *pool, unsigned int item_cnt)
> +{
> +       struct page_pool_item *items = pool->items;
> +       unsigned int i;
> +
> +       WARN_ON_ONCE(!is_power_of_2(item_cnt));
> +
> +       for (i = 0; i < item_cnt; i++)
> +               items[i].pp_idx = i;
> +
> +       pool->item_mask = item_cnt - 1;
> +}
> +
> +static void page_pool_item_uninit(struct page_pool *pool)
> +{
> +       struct page_pool_item *items = pool->items;
> +       unsigned int mask = pool->item_mask;
> +       unsigned int i;
> +
> +       if (!pool->dma_map || pool->mp_priv)
> +               return;
> +
> +       spin_lock_bh(&pool->destroy_lock);
> +
> +       for (i = 0; i <= mask; i++) {
> +               struct page *page;
> +
> +               page = netmem_to_page(READ_ONCE(items[i].pp_netmem));
> +               if (!page)
> +                       continue;
> +
> +               WARN_ONCE(1, "dma unmapping in %s: %p for %p\n", __func__, page,
> +                         pool);
> +
> +               dma_unmap_page_attrs(pool->p.dev, page_pool_get_dma_addr(page),
> +                                    PAGE_SIZE << pool->p.order,
> +                                    pool->p.dma_dir, DMA_ATTR_SKIP_CPU_SYNC |
> +                                    DMA_ATTR_WEAK_ORDERING);
> +               page_pool_set_dma_addr(page, 0);
> +       }
> +
> +       pool->dma_map = false;
> +       spin_unlock_bh(&pool->destroy_lock);
> +}
> +
> +static bool page_pool_item_add(struct page_pool *pool, netmem_ref netmem)
> +{
> +       struct page_pool_item *items = pool->items;
> +       unsigned int mask = pool->item_mask;
> +       unsigned int idx = pool->item_idx;
> +       unsigned int i;
> +
> +       for (i = 0; i <= mask; i++) {
> +               unsigned int mask_idx = idx++ & mask;
> +
> +               if (!READ_ONCE(items[mask_idx].pp_netmem)) {
> +                       WRITE_ONCE(items[mask_idx].pp_netmem, netmem);
> +                       netmem_set_pp_item(netmem, &items[mask_idx]);
> +                       pool->item_idx = idx;
> +                       return true;
> +               }
> +       }
> +
> +       pool->item_idx = idx;
> +       DEBUG_NET_WARN_ON_ONCE(true);
> +       return false;
> +}
> +
> +static void page_pool_item_del(struct page_pool *pool, netmem_ref netmem)
> +{
> +       struct page_pool_item *item = netmem_to_page(netmem)->pp_item;
> +       struct page_pool_item *items = pool->items;
> +       unsigned int idx = item->pp_idx;
> +
> +       DEBUG_NET_WARN_ON_ONCE(items[idx].pp_netmem != netmem);
> +       WRITE_ONCE(items[idx].pp_netmem, (unsigned long __bitwise)NULL);
> +       netmem_set_pp_item(netmem, NULL);
> +}
> +
> +#define PAGE_POOL_MIN_ITEM_CNT 512
> +
>  /**
>   * page_pool_create_percpu() - create a page pool for a given cpu.
>   * @params: parameters, see struct page_pool_params
> @@ -329,10 +405,14 @@ static void page_pool_uninit(struct page_pool *pool)
>  struct page_pool *
>  page_pool_create_percpu(const struct page_pool_params *params, int cpuid)
>  {
> +       unsigned int item_cnt = (params->pool_size ? : 1024) +
> +                               PP_ALLOC_CACHE_SIZE + PAGE_POOL_MIN_ITEM_CNT;
>         struct page_pool *pool;
>         int err;
>
> -       pool = kzalloc_node(sizeof(*pool), GFP_KERNEL, params->nid);
> +       item_cnt = roundup_pow_of_two(item_cnt);
> +       pool = kvzalloc_node(struct_size(pool, items, item_cnt), GFP_KERNEL,
> +                            params->nid);
>         if (!pool)
>                 return ERR_PTR(-ENOMEM);
>
> @@ -340,6 +420,8 @@ page_pool_create_percpu(const struct page_pool_params *params, int cpuid)
>         if (err < 0)
>                 goto err_free;
>
> +       page_pool_item_init(pool, item_cnt);
> +
>         err = page_pool_list(pool);
>         if (err)
>                 goto err_uninit;
> @@ -350,7 +432,7 @@ page_pool_create_percpu(const struct page_pool_params *params, int cpuid)
>         page_pool_uninit(pool);
>  err_free:
>         pr_warn("%s() gave up with errno %d\n", __func__, err);
> -       kfree(pool);
> +       kvfree(pool);
>         return ERR_PTR(err);
>  }
>  EXPORT_SYMBOL(page_pool_create_percpu);
> @@ -499,19 +581,24 @@ static struct page *__page_pool_alloc_page_order(struct page_pool *pool,
>         if (unlikely(!page))
>                 return NULL;
>
> -       if (pool->dma_map && unlikely(!page_pool_dma_map(pool, page_to_netmem(page)))) {
> -               put_page(page);
> -               return NULL;
> -       }
> +       if (unlikely(!page_pool_set_pp_info(pool, page_to_netmem(page))))
> +               goto err_alloc;
> +
> +       if (pool->dma_map && unlikely(!page_pool_dma_map(pool, page_to_netmem(page))))
> +               goto err_set_info;
>
>         alloc_stat_inc(pool, slow_high_order);
> -       page_pool_set_pp_info(pool, page_to_netmem(page));
>
>         /* Track how many pages are held 'in-flight' */
>         pool->pages_state_hold_cnt++;
>         trace_page_pool_state_hold(pool, page_to_netmem(page),
>                                    pool->pages_state_hold_cnt);
>         return page;
> +err_set_info:
> +       page_pool_clear_pp_info(pool, page_to_netmem(page));
> +err_alloc:
> +       put_page(page);
> +       return NULL;
>  }
>
>  /* slow path */
> @@ -546,12 +633,18 @@ static noinline netmem_ref __page_pool_alloc_pages_slow(struct page_pool *pool,
>          */
>         for (i = 0; i < nr_pages; i++) {
>                 netmem = pool->alloc.cache[i];
> +
> +               if (unlikely(!page_pool_set_pp_info(pool, netmem))) {
> +                       put_page(netmem_to_page(netmem));
> +                       continue;
> +               }
> +
>                 if (dma_map && unlikely(!page_pool_dma_map(pool, netmem))) {
> +                       page_pool_clear_pp_info(pool, netmem);
>                         put_page(netmem_to_page(netmem));
>                         continue;
>                 }
>
> -               page_pool_set_pp_info(pool, netmem);
>                 pool->alloc.cache[pool->alloc.count++] = netmem;
>                 /* Track how many pages are held 'in-flight' */
>                 pool->pages_state_hold_cnt++;
> @@ -623,9 +716,13 @@ s32 page_pool_inflight(const struct page_pool *pool, bool strict)
>         return inflight;
>  }
>
> -void page_pool_set_pp_info(struct page_pool *pool, netmem_ref netmem)
> +bool page_pool_set_pp_info(struct page_pool *pool, netmem_ref netmem)
>  {
> -       netmem_set_pp(netmem, pool);
> +       if (unlikely(!page_pool_item_add(pool, netmem)))
> +               return false;
> +
> +       DEBUG_NET_WARN_ON_ONCE(page_pool_to_pp(netmem_to_page(netmem)) != pool);
> +
>         netmem_or_pp_magic(netmem, PP_SIGNATURE);
>
>         /* Ensuring all pages have been split into one fragment initially:
> @@ -637,12 +734,14 @@ void page_pool_set_pp_info(struct page_pool *pool, netmem_ref netmem)
>         page_pool_fragment_netmem(netmem, 1);
>         if (pool->has_init_callback)
>                 pool->slow.init_callback(netmem, pool->slow.init_arg);
> +
> +       return true;
>  }
>
> -void page_pool_clear_pp_info(netmem_ref netmem)
> +void page_pool_clear_pp_info(struct page_pool *pool, netmem_ref netmem)
>  {
>         netmem_clear_pp_magic(netmem);
> -       netmem_set_pp(netmem, NULL);
> +       page_pool_item_del(pool, netmem);
>  }
>
>  static __always_inline void __page_pool_release_page_dma(struct page_pool *pool,
> @@ -672,9 +771,13 @@ static __always_inline void __page_pool_release_page_dma(struct page_pool *pool,
>   */
>  void page_pool_return_page(struct page_pool *pool, netmem_ref netmem)
>  {
> +       unsigned int destroy_cnt = READ_ONCE(pool->destroy_cnt);
>         int count;
>         bool put;
>
> +       if (unlikely(destroy_cnt))
> +               spin_lock_bh(&pool->destroy_lock);
> +
>         put = true;
>         if (static_branch_unlikely(&page_pool_mem_providers) && pool->mp_priv)
>                 put = mp_dmabuf_devmem_release_page(pool, netmem);
> @@ -688,9 +791,13 @@ void page_pool_return_page(struct page_pool *pool, netmem_ref netmem)
>         trace_page_pool_state_release(pool, netmem, count);
>
>         if (put) {
> -               page_pool_clear_pp_info(netmem);
> +               page_pool_clear_pp_info(pool, netmem);
>                 put_page(netmem_to_page(netmem));
>         }
> +
> +       if (unlikely(destroy_cnt))
> +               spin_unlock_bh(&pool->destroy_lock);
> +
>         /* An optimization would be to call __free_pages(page, pool->p.order)
>          * knowing page is not part of page-cache (thus avoiding a
>          * __page_cache_release() call).
> @@ -1034,14 +1141,14 @@ static void __page_pool_destroy(struct page_pool *pool)
>                 static_branch_dec(&page_pool_mem_providers);
>         }
>
> -       kfree(pool);
> +       kvfree(pool);
>  }
>
>  static void page_pool_empty_alloc_cache_once(struct page_pool *pool)
>  {
>         netmem_ref netmem;
>
> -       if (pool->destroy_cnt)
> +       if (pool->destroy_cnt > 1)
>                 return;
>
>         /* Empty alloc cache, assume caller made sure this is
> @@ -1057,7 +1164,7 @@ static void page_pool_empty_alloc_cache_once(struct page_pool *pool)
>  static void page_pool_scrub(struct page_pool *pool)
>  {
>         page_pool_empty_alloc_cache_once(pool);
> -       pool->destroy_cnt++;
> +       WRITE_ONCE(pool->destroy_cnt, pool->destroy_cnt + 1);
>
>         /* No more consumers should exist, but producers could still
>          * be in-flight.
> @@ -1139,10 +1246,14 @@ void page_pool_destroy(struct page_pool *pool)
>         if (!page_pool_put(pool))
>                 return;
>
> +       /* disable dma_sync_for_device */
> +       pool->dma_sync = false;
> +
>         page_pool_disable_direct_recycling(pool);
> +       WRITE_ONCE(pool->destroy_cnt, 1);
>
> -       /* Wait for the freeing side see the disabling direct recycling setting
> -        * to avoid the concurrent access to the pool->alloc cache.
> +       /* Wait for the freeing side to see the new pool->dma_sync,
> +        * disable_direct and pool->destroy_cnt in page_pool_put_page.
>          */
>         synchronize_rcu();
>
> @@ -1151,6 +1262,8 @@ void page_pool_destroy(struct page_pool *pool)
>         if (!page_pool_release(pool))
>                 return;
>
> +       page_pool_item_uninit(pool);
> +
>         page_pool_detached(pool);
>         pool->defer_start = jiffies;
>         pool->defer_warn  = jiffies + DEFER_WARN_INTERVAL;
> diff --git a/net/core/page_pool_priv.h b/net/core/page_pool_priv.h
> index 57439787b9c2..5d85f862a30a 100644
> --- a/net/core/page_pool_priv.h
> +++ b/net/core/page_pool_priv.h
> @@ -36,16 +36,18 @@ static inline bool page_pool_set_dma_addr(struct page *page, dma_addr_t addr)
>  }
>
>  #if defined(CONFIG_PAGE_POOL)
> -void page_pool_set_pp_info(struct page_pool *pool, netmem_ref netmem);
> -void page_pool_clear_pp_info(netmem_ref netmem);
> +bool page_pool_set_pp_info(struct page_pool *pool, netmem_ref netmem);
> +void page_pool_clear_pp_info(struct page_pool *pool, netmem_ref netmem);
>  int page_pool_check_memory_provider(struct net_device *dev,
>                                     struct netdev_rx_queue *rxq);
>  #else
> -static inline void page_pool_set_pp_info(struct page_pool *pool,
> +static inline bool page_pool_set_pp_info(struct page_pool *pool,
>                                          netmem_ref netmem)
>  {
> +       return true;
>  }
> -static inline void page_pool_clear_pp_info(netmem_ref netmem)
> +static inline void page_pool_clear_pp_info(struct page_pool *pool,
> +                                          netmem_ref netmem)
>  {
>  }
>  static inline int page_pool_check_memory_provider(struct net_device *dev,
> diff --git a/net/core/skbuff.c b/net/core/skbuff.c
> index 74149dc4ee31..d4295353ca6e 100644
> --- a/net/core/skbuff.c
> +++ b/net/core/skbuff.c
> @@ -1033,7 +1033,8 @@ bool napi_pp_put_page(netmem_ref netmem)
>         if (unlikely(!is_pp_netmem(netmem)))
>                 return false;
>
> -       page_pool_put_full_netmem(netmem_get_pp(netmem), netmem, false);
> +       page_pool_put_full_netmem(page_pool_to_pp(netmem_to_page(netmem)),
> +                                 netmem, false);
>
>         return true;
>  }
> diff --git a/net/core/xdp.c b/net/core/xdp.c
> index bcc5551c6424..e8582036b411 100644
> --- a/net/core/xdp.c
> +++ b/net/core/xdp.c
> @@ -384,7 +384,8 @@ void __xdp_return(void *data, struct xdp_mem_info *mem, bool napi_direct,
>                 /* No need to check ((page->pp_magic & ~0x3UL) == PP_SIGNATURE)
>                  * as mem->type knows this a page_pool page
>                  */
> -               page_pool_put_full_page(page->pp, page, napi_direct);
> +               page_pool_put_full_page(page_pool_to_pp(page), page,
> +                                       napi_direct);
>                 break;
>         case MEM_TYPE_PAGE_SHARED:
>                 page_frag_free(data);
> --
> 2.33.0
>


From bvanassche at acm.org  Wed Sep 18 11:29:03 2024
From: bvanassche at acm.org (Bart Van Assche)
Date: Wed, 18 Sep 2024 11:29:03 -0700
Subject: [PATCH v4 2/2] ufs: core: requeue aborted request
In-Reply-To: <61a1678cad16dcb15f1e215ff1c47476666f0ee8.camel@mediatek.com>
References: <20240910073035.25974-1-peter.wang@mediatek.com>
 <20240910073035.25974-3-peter.wang@mediatek.com>
 <e42abf07-ba6b-4301-8717-8d5b01d56640@acm.org>
 <04e392c00986ac798e881dcd347ff5045cf61708.camel@mediatek.com>
 <858c4b6b-fcbc-4d51-8641-051aeda387c5@acm.org>
 <524e9da9196cc0acf497ff87eba3a8043b780332.camel@mediatek.com>
 <6203d7c9-b33c-4bf1-aca3-5fc8ba5636b9@acm.org>
 <6fc025d7ffb9d702a117381fb5da318b40a24246.camel@mediatek.com>
 <46d8be04-10db-4de1-8a59-6cd402bcecb1@acm.org>
 <61a1678cad16dcb15f1e215ff1c47476666f0ee8.camel@mediatek.com>
Message-ID: <78c7fc74-81c2-40e4-b050-1d65dec96d0a@acm.org>

On 9/18/24 6:29 AM, Peter Wang (???) wrote:
> Basically, this patch currently only needs to handle requeueing
> for the error handler abort.
> The approach for DBR mode and MCQ mode should be consistent.
> If receive an interrupt response (OCS:ABORTED or INVALID_OCS_VALUE),
> then set DID_REQUEUE. If there is no interrupt, it will also set
> SCSI DID_REQUEUE in ufshcd_err_handler through
> ufshcd_complete_requests
> with force_compl = true.

Reporting a completion for commands cleared by writing into the legacy
UTRLCLR register is not compliant with any version of the UFSHCI
standard. Reporting a completion for commands cleared by writing into
that register is problematic because it causes ufshcd_release_scsi_cmd()
to be called as follows:

ufshcd_sl_intr()
   ufshcd_transfer_req_compl()
     ufshcd_poll()
       __ufshcd_transfer_req_compl()
         ufshcd_compl_one_cqe()
           cmd->result = ...
           ufshcd_release_scsi_cmd()
           scsi_done()

Calling ufshcd_release_scsi_cmd() if a command has been cleared is
problematic because the SCSI core does not expect this. If 
ufshcd_try_to_abort_task() clears a SCSI command, 
ufshcd_release_scsi_cmd() must not be called until the SCSI core
decides to release the command. This is why I wrote in a previous mail
that I think that a quirk should be introduced to suppress the
completions generated by clearing a SCSI command.

> The more problematic part is with MCQ mode. To imitate the DBR
> approach, we just need to set DID_REQUEUE upon receiving an interrupt.
> Everything else remains the same. This would make things simpler.
> 
> Moving forward, if we want to simplify things and we have also
> taken stock of the two or three scenarios where OCS: ABORTED occurs,
> do we even need a flag? Couldn't we just set DID_REQUEUE directly
> for OCS: ABORTED?
> What do you think?

How about making ufshcd_compl_one_cqe() skip entries with status
OCS_ABORTED? That would make ufshcd_compl_one_cqe() behave as the
SCSI core expects, namely not freeing any command resources if a
SCSI command is aborted successfully.

This approach may require further changes to ufshcd_abort_all().
In that function there are separate code paths for legacy and MCQ
mode. This is less than ideal. Would it be possible to combine
these code paths by removing the ufshcd_complete_requests() call
from ufshcd_abort_all() and by handling completions from inside
ufshcd_abort_one()?

Thanks,

Bart.


From Chris.Lu at mediatek.com  Wed Sep 18 20:26:48 2024
From: Chris.Lu at mediatek.com (=?utf-8?B?Q2hyaXMgTHUgKOmZuOeomuazkyk=?=)
Date: Thu, 19 Sep 2024 03:26:48 +0000
Subject: [PATCH] Bluetooth: btmtk: Remove resetting mt7921 before
 downloading the fw
In-Reply-To: <CABBYNZKYsL9jcF2n9TsA1BjU-CjXOdXu7MDLP9Sz_Ly8hBAf1w@mail.gmail.com>
References: <20240822052310.25220-1-hao.qin@mediatek.com>
	 <ZuB3omUkdUHLggYu@mdpsys.co.uk>
	 <790e542aa9d08c7efeee6ef298fce2a87d8035e4.camel@mediatek.com>
	 <ZuneSM4SvyUFX86j@mdpsys.co.uk>
	 <9bfbbf24ac2480d94d3455f7e33e4b5502b38ced.camel@mediatek.com>
	 <CABBYNZKYsL9jcF2n9TsA1BjU-CjXOdXu7MDLP9Sz_Ly8hBAf1w@mail.gmail.com>
Message-ID: <c01e6dfa730dd10a7d4dba60fe31e82b9c296b37.camel@mediatek.com>

Hi Luiz,

On Wed, 2024-09-18 at 09:37 -0400, Luiz Augusto von Dentz wrote:
>  	 
> External email : Please do not click links or open attachments until
> you have verified the sender or the content.
>  Hi Chris,
> 
> On Tue, Sep 17, 2024 at 11:37?PM Chris Lu (???) <
> Chris.Lu at mediatek.com> wrote:
> >
> > On Tue, 2024-09-17 at 20:53 +0100, marc.payne at mdpsys.co.uk wrote:
> >
> > Hi Marc,
> >
> > Thank you for providing the logs for us to debug.
> >
> >
> > External email : Please do not click links or open attachments
> until you have verified the sender or the content.
> >  The 12/09/2024 07:09, Chris Lu (???) wrote:
> > > On Tue, 2024-09-10 at 18:09 +0100, Marc Payne wrote:
> > >
> > > Hi Marc,
> >
> > Hi,
> >
> > >
> > > Is it possible to provide entire kernel log for further
> debugging?
> > > (From boot up to issue heppen)
> > >
> > > We suspect that the issue occurred event earilier and our
> controller is
> > > not able to recover itself. Therfore, we need to check if
> Bluetooth
> > > works as expected in the booting stage.
> >
> > Happy to help. Below is the log for a cold boot of Linux 6.11-rc7
> (with
> > the additional patch to avoid the controller reset before fw load).
> The
> > MT7921AUN is directly connected to one of the computer's USB ports.
> The
> >
> >
> > Is "MT7921AUN" an external Bluetooth/WiFi usb dongle?
> > From the information in the kernel log you provided, the MT7921AUN
> IC used on
> > the dongle is not for Linux PC project. Since the firmware we push
> to Kernel is not
> > for "MT7921AUN", software, firmware and hardware may not match.
> Using that
> > dongle with Linux-Based Notebook may lead to some unexpected errors
> such as
> > Bluetooth can't setup successfully.
> 
> Then something is not right with our code, either the driver shall
> not
> be probed for such models or not attempt to load the wrong firmware,
> sounds like the patch tries to address the later but given your
> explanation perhaps we should consider not even attempting to probe
> for such models?

After internal investigation, that MT7921AUN connectivity dongle was
made by a module maker which MediaTek didn't participate in the
development and verification. We only ensure the modules on Notebook
product can work normally. MT7921AUN has never been used in the
Notebook product line. Acutally, the coredump is one of the protection
mechanism to make invalid module doesn't work on Notebook.

Currently, we only use PID/VID to control whether "probe" is triggered
or not. However, that module use MediaTek's common PID/VID  which is
hard to be excluded. I agree with your opinion. We'll dicuss another
method to prevent unexpected module type from being recongized in
driver layer in the near future.

> 
> > Do you have an M.2 MT7921 module? (Typically existed in the
> Notebook product with
> > MediaTek Connectivity solution). The M.2 module is the correct one
> expected to be used.
> > I've setup an environment locally with Kernel v6.11, With Hao Qin's
> solustion
> > ("[PATCH] Bluetooth: btmtk: Remove resetting mt7921 before
> downloading the fw"),
> > I'm albe to successfully setup Bluetooth and works normally.
> 
> Shall I consider this a Tested-by?

Yes, I've verified with this change. MT7921e/MT7922e/MT7925e M.2 (all
of their Bluetooth use USB interface) are able to setup and work
normally.

BRs,
Chris

> 
> > BRs,
> > Chris
> >
> > system has an Intel AX211 fitted so I have disabled it's bluetooth
> > functionality in the UEFI setup.
> >
> > Hope this helps.
> >
> > >
> > > BRs,
> > > Chris Lu
> >
> > Regards,
> >
> > Marc
> >
> >
> > [    0.000000] Linux version 6.11.0-rc7-00001-g0e2ad6528188-dirty (
> marcp at mdp-archnuc) (gcc (GCC) 14.2.1 20240805, GNU ld (GNU Binutils)
> 2.43.0) #71 SMP PREEMPT_DYNAMIC Mon Sep  9 23:22:56 BST 2024
> > [    0.000000] Command line: root=UUID=0420afc7-4947-4e2e-a096-
> b607b8b7fd93 rw quiet initrd=boot\intel-ucode.img
> initrd=boot\initramfs-linux611.img resume=UUID=0420afc7-4947-4e2e-
> a096-b607b8b7fd93 resume_offset=106496
> > [    0.000000] x86/split lock detection: #AC: crashing the kernel
> on kernel split_locks and warning on user-space split_locks
> > [    0.000000] BIOS-provided physical RAM map:
> > [    0.000000] BIOS-e820: [mem 0x0000000000000000-
> 0x000000000009dfff] usable
> > [    0.000000] BIOS-e820: [mem 0x000000000009e000-
> 0x000000000009efff] reserved
> > [    0.000000] BIOS-e820: [mem 0x000000000009f000-
> 0x000000000009ffff] usable
> > [    0.000000] BIOS-e820: [mem 0x00000000000a0000-
> 0x00000000000fffff] reserved
> > [    0.000000] BIOS-e820: [mem 0x0000000000100000-
> 0x000000004dd45fff] usable
> > [    0.000000] BIOS-e820: [mem 0x000000004dd46000-
> 0x0000000056c70fff] reserved
> > [    0.000000] BIOS-e820: [mem 0x0000000056c71000-
> 0x0000000056d48fff] ACPI data
> > [    0.000000] BIOS-e820: [mem 0x0000000056d49000-
> 0x0000000056ecefff] ACPI NVS
> > [    0.000000] BIOS-e820: [mem 0x0000000056ecf000-
> 0x000000005a7fefff] reserved
> > [    0.000000] BIOS-e820: [mem 0x000000005a7ff000-
> 0x000000005a7fffff] usable
> > [    0.000000] BIOS-e820: [mem 0x000000005a800000-
> 0x00000000611fffff] reserved
> > [    0.000000] BIOS-e820: [mem 0x0000000061e00000-
> 0x00000000687fffff] reserved
> > [    0.000000] BIOS-e820: [mem 0x00000000c0000000-
> 0x00000000cfffffff] reserved
> > [    0.000000] BIOS-e820: [mem 0x00000000fe000000-
> 0x00000000fe010fff] reserved
> > [    0.000000] BIOS-e820: [mem 0x00000000fec00000-
> 0x00000000fec00fff] reserved
> > [    0.000000] BIOS-e820: [mem 0x00000000fed00000-
> 0x00000000fed00fff] reserved
> > [    0.000000] BIOS-e820: [mem 0x00000000fed20000-
> 0x00000000fed7ffff] reserved
> > [    0.000000] BIOS-e820: [mem 0x00000000fee00000-
> 0x00000000fee00fff] reserved
> > [    0.000000] BIOS-e820: [mem 0x00000000ff000000-
> 0x00000000ffffffff] reserved
> > [    0.000000] BIOS-e820: [mem 0x0000000100000000-
> 0x00000010977fffff] usable
> > [    0.000000] NX (Execute Disable) protection: active
> > [    0.000000] APIC: Static calls initialized
> > [    0.000000] efi: EFI v2.8 by American Megatrends
> > [    0.000000] efi: ACPI=0x56e48000 ACPI 2.0=0x56e48014
> TPMFinalLog=0x56db4000 SMBIOS=0x5a483000 SMBIOS 3.0=0x5a482000
> MEMATTR=0x4485d118 ESRT=0x43ea7e98 INITRD=0x41e12e98 RNG=0x56c9b018
> TPMEventLog=0x41dd5018
> > [    0.000000] random: crng init done
> > [    0.000000] efi: Remove mem115: MMIO range=[0xc0000000-
> 0xcfffffff] (256MB) from e820 map
> > [    0.000000] e820: remove [mem 0xc0000000-0xcfffffff] reserved
> > [    0.000000] efi: Not removing mem116: MMIO range=[0xfe000000-
> 0xfe010fff] (68KB) from e820 map
> > [    0.000000] efi: Not removing mem117: MMIO range=[0xfec00000-
> 0xfec00fff] (4KB) from e820 map
> > [    0.000000] efi: Not removing mem118: MMIO range=[0xfed00000-
> 0xfed00fff] (4KB) from e820 map
> > [    0.000000] efi: Not removing mem120: MMIO range=[0xfee00000-
> 0xfee00fff] (4KB) from e820 map
> > [    0.000000] efi: Remove mem121: MMIO range=[0xff000000-
> 0xffffffff] (16MB) from e820 map
> > [    0.000000] e820: remove [mem 0xff000000-0xffffffff] reserved
> > [    0.000000] SMBIOS 3.5.0 present.
> > [    0.000000] DMI: Intel(R) Client Systems NUC12WSHi7/NUC12WSBi7,
> BIOS WSADL357.0088.2023.0505.1623 05/05/2023
> > [    0.000000] DMI: Memory slots populated: 2/2
> > [    0.000000] tsc: Detected 2500.000 MHz processor
> > [    0.000000] tsc: Detected 2496.000 MHz TSC
> > [    0.000549] e820: update [mem 0x00000000-0x00000fff] usable ==>
> reserved
> > [    0.000550] e820: remove [mem 0x000a0000-0x000fffff] usable
> > [    0.000555] last_pfn = 0x1097800 max_arch_pfn = 0x400000000
> > [    0.000558] MTRR map: 5 entries (3 fixed + 2 variable; max 23),
> built from 10 variable MTRRs
> > [    0.000559] x86/PAT: Configuration [0-7]: WB  WC  UC-
> UC  WB  WP  UC- WT
> > [    0.000935] last_pfn = 0x5a800 max_arch_pfn = 0x400000000
> > [    0.014044] esrt: Reserving ESRT space from 0x0000000043ea7e98
> to 0x0000000043ea7f98.
> > [    0.014049] e820: update [mem 0x43ea7000-0x43ea7fff] usable ==>
> reserved
> > [    0.014062] Using GB pages for direct mapping
> > [    0.014063] Incomplete global flushes, disabling PCID
> > [    0.014285] Secure boot disabled
> > [    0.014285] RAMDISK: [mem 0x39be8000-0x4039cfff]
> > [    0.014312] ACPI: Early table checksum verification disabled
> > [    0.014315] ACPI: RSDP 0x0000000056E48014 000024 (v02 INTEL )
> > [    0.014318] ACPI: XSDT 0x0000000056DE4728 000114 (v01
> INTEL  NUCxi7A5 00000058 AMI  01000013)
> > [    0.014322] ACPI: FACP 0x0000000056D46000 000114 (v06
> INTEL  NUCxi7A5 00000058 AMI  01000013)
> > [    0.014326] ACPI: DSDT 0x0000000056CD9000 06CECF (v02
> INTEL  NUCxi7A5 00000058 INTL 20200717)
> > [    0.014328] ACPI: FACS 0x0000000056ECC000 000040
> > [    0.014329] ACPI: FIDT 0x0000000056CD8000 00009C (v01
> INTEL  NUCxi7A5 00000058 AMI  00010013)
> > [    0.014331] ACPI: SSDT 0x0000000056D48000 00038C (v02
> INTEL  NUCxi7A5 00000058 INTL 20200717)
> > [    0.014333] ACPI: SSDT 0x0000000056CD2000 005D2C (v02
> INTEL  NUCxi7A5 00000058 INTL 20200717)
> > [    0.014335] ACPI: SSDT 0x0000000056CCF000 002AA1 (v02
> INTEL  NUCxi7A5 00000058 INTL 20200717)
> > [    0.014337] ACPI: SSDT 0x0000000056CCB000 0033D3 (v02
> INTEL  NUCxi7A5 00000058 INTL 20200717)
> > [    0.014339] ACPI: SSDT 0x0000000056CBD000 00D39F (v02
> INTEL  NUCxi7A5 00001000 INTL 20200717)
> > [    0.014341] ACPI: HPET 0x0000000056D47000 000038 (v01
> INTEL  NUCxi7A5 00000058 AMI  01000013)
> > [    0.014343] ACPI: APIC 0x0000000056CBC000 0001DC (v05
> INTEL  NUCxi7A5 00000058 AMI  01000013)
> > [    0.014344] ACPI: MCFG 0x0000000056CBB000 00003C (v01
> INTEL  NUCxi7A5 00000058 AMI  01000013)
> > [    0.014346] ACPI: SSDT 0x0000000056CB9000 001F04 (v02
> INTEL  NUCxi7A5 00000058 INTL 20200717)
> > [    0.014348] ACPI: SSDT 0x0000000056CB7000 001DFD (v02
> INTEL  NUCxi7A5 00000058 INTL 20200717)
> > [    0.014350] ACPI: UEFI 0x0000000056D9B000 000048 (v01
> INTEL  NUCxi7A5 00000058 AMI  01000013)
> > [    0.014352] ACPI: NHLT 0x0000000056CB6000 0002F1 (v00
> INTEL  NUCxi7A5 00000058 AMI  01000013)
> > [    0.014353] ACPI: LPIT 0x0000000056CB5000 0000CC (v01
> INTEL  NUCxi7A5 00000058 AMI  01000013)
> > [    0.014355] ACPI: WDAT 0x0000000056CB3000 000134 (v01
> INTEL  NUCxi7A5 00000058 AMI  01000013)
> > [    0.014357] ACPI: SSDT 0x0000000056CB0000 002A83 (v02
> INTEL  NUCxi7A5 00000058 INTL 20200717)
> > [    0.014359] ACPI: SSDT 0x0000000056CAD000 002357 (v02
> INTEL  NUCxi7A5 00000058 INTL 20200717)
> > [    0.014361] ACPI: DBGP 0x0000000056CAC000 000034 (v01
> INTEL  NUCxi7A5 00000058 AMI  01000013)
> > [    0.014363] ACPI: DBG2 0x0000000056CAB000 000054 (v00
> INTEL  NUCxi7A5 00000058 AMI  01000013)
> > [    0.014364] ACPI: DMAR 0x0000000056CAA000 000088 (v02
> INTEL  NUCxi7A5 00000058      01000013)
> > [    0.014366] ACPI: FPDT 0x0000000056CA9000 000044 (v01
> INTEL  NUCxi7A5 00000058 AMI  01000013)
> > [    0.014368] ACPI: SSDT 0x0000000056CA8000 000D56 (v02
> INTEL  NUCxi7A5 00000058 INTL 20200717)
> > [    0.014370] ACPI: SSDT 0x0000000056CA4000 003AEA (v02
> INTEL  NUCxi7A5 00000058 INTL 20200717)
> > [    0.014372] ACPI: SSDT 0x0000000056CA0000 0035A2 (v02
> INTEL  NUCxi7A5 00000058 INTL 20200717)
> > [    0.014374] ACPI: SSDT 0x0000000056C9F000 000144 (v02
> INTEL  NUCxi7A5 00000058 INTL 20200717)
> > [    0.014376] ACPI: BGRT 0x0000000056C9E000 000038 (v01
> INTEL  NUCxi7A5 00000058 AMI  00010013)
> > [    0.014377] ACPI: TPM2 0x0000000056C9D000 00004C (v04
> INTEL  NUCxi7A5 00000058 AMI  00000000)
> > [    0.014379] ACPI: PHAT 0x0000000056C9C000 00062D (v01
> INTEL  NUCxi7A5 00000058 MSFT 0100000D)
> > [    0.014381] ACPI: WSMT 0x0000000056CB4000 000028 (v01
> INTEL  NUCxi7A5 00000058 AMI  00010013)
> > [    0.014383] ACPI: Reserving FACP table memory at [mem
> 0x56d46000-0x56d46113]
> > [    0.014384] ACPI: Reserving DSDT table memory at [mem
> 0x56cd9000-0x56d45ece]
> > [    0.014384] ACPI: Reserving FACS table memory at [mem
> 0x56ecc000-0x56ecc03f]
> > [    0.014385] ACPI: Reserving FIDT table memory at [mem
> 0x56cd8000-0x56cd809b]
> > [    0.014386] ACPI: Reserving SSDT table memory at [mem
> 0x56d48000-0x56d4838b]
> > [    0.014386] ACPI: Reserving SSDT table memory at [mem
> 0x56cd2000-0x56cd7d2b]
> > [    0.014387] ACPI: Reserving SSDT table memory at [mem
> 0x56ccf000-0x56cd1aa0]
> > [    0.014387] ACPI: Reserving SSDT table memory at [mem
> 0x56ccb000-0x56cce3d2]
> > [    0.014388] ACPI: Reserving SSDT table memory at [mem
> 0x56cbd000-0x56cca39e]
> > [    0.014388] ACPI: Reserving HPET table memory at [mem
> 0x56d47000-0x56d47037]
> > [    0.014389] ACPI: Reserving APIC table memory at [mem
> 0x56cbc000-0x56cbc1db]
> > [    0.014389] ACPI: Reserving MCFG table memory at [mem
> 0x56cbb000-0x56cbb03b]
> > [    0.014390] ACPI: Reserving SSDT table memory at [mem
> 0x56cb9000-0x56cbaf03]
> > [    0.014390] ACPI: Reserving SSDT table memory at [mem
> 0x56cb7000-0x56cb8dfc]
> > [    0.014391] ACPI: Reserving UEFI table memory at [mem
> 0x56d9b000-0x56d9b047]
> > [    0.014391] ACPI: Reserving NHLT table memory at [mem
> 0x56cb6000-0x56cb62f0]
> > [    0.014392] ACPI: Reserving LPIT table memory at [mem
> 0x56cb5000-0x56cb50cb]
> > [    0.014392] ACPI: Reserving WDAT table memory at [mem
> 0x56cb3000-0x56cb3133]
> > [    0.014393] ACPI: Reserving SSDT table memory at [mem
> 0x56cb0000-0x56cb2a82]
> > [    0.014393] ACPI: Reserving SSDT table memory at [mem
> 0x56cad000-0x56caf356]
> > [    0.014394] ACPI: Reserving DBGP table memory at [mem
> 0x56cac000-0x56cac033]
> > [    0.014394] ACPI: Reserving DBG2 table memory at [mem
> 0x56cab000-0x56cab053]
> > [    0.014395] ACPI: Reserving DMAR table memory at [mem
> 0x56caa000-0x56caa087]
> > [    0.014395] ACPI: Reserving FPDT table memory at [mem
> 0x56ca9000-0x56ca9043]
> > [    0.014396] ACPI: Reserving SSDT table memory at [mem
> 0x56ca8000-0x56ca8d55]
> > [    0.014396] ACPI: Reserving SSDT table memory at [mem
> 0x56ca4000-0x56ca7ae9]
> > [    0.014397] ACPI: Reserving SSDT table memory at [mem
> 0x56ca0000-0x56ca35a1]
> > [    0.014397] ACPI: Reserving SSDT table memory at [mem
> 0x56c9f000-0x56c9f143]
> > [    0.014398] ACPI: Reserving BGRT table memory at [mem
> 0x56c9e000-0x56c9e037]
> > [    0.014398] ACPI: Reserving TPM2 table memory at [mem
> 0x56c9d000-0x56c9d04b]
> > [    0.014399] ACPI: Reserving PHAT table memory at [mem
> 0x56c9c000-0x56c9c62c]
> > [    0.014400] ACPI: Reserving WSMT table memory at [mem
> 0x56cb4000-0x56cb4027]
> > [    0.014743] No NUMA configuration found
> > [    0.014744] Faking a node at [mem 0x0000000000000000-
> 0x00000010977fffff]
> > [    0.014746] NODE_DATA(0) allocated [mem 0x10977fb000-
> 0x10977fffff]
> > [    0.014795] Zone ranges:
> > [    0.014796]   DMA      [mem 0x0000000000001000-
> 0x0000000000ffffff]
> > [    0.014797]   DMA32    [mem 0x0000000001000000-
> 0x00000000ffffffff]
> > [    0.014798]   Normal   [mem 0x0000000100000000-
> 0x00000010977fffff]
> > [    0.014799]   Device   empty
> > [    0.014799] Movable zone start for each node
> > [    0.014800] Early memory node ranges
> > [    0.014800]   node   0: [mem 0x0000000000001000-
> 0x000000000009dfff]
> > [    0.014801]   node   0: [mem 0x000000000009f000-
> 0x000000000009ffff]
> > [    0.014801]   node   0: [mem 0x0000000000100000-
> 0x000000004dd45fff]
> > [    0.014802]   node   0: [mem 0x000000005a7ff000-
> 0x000000005a7fffff]
> > [    0.014802]   node   0: [mem 0x0000000100000000-
> 0x00000010977fffff]
> > [    0.014805] Initmem setup node 0 [mem 0x0000000000001000-
> 0x00000010977fffff]
> > [    0.014808] On node 0, zone DMA: 1 pages in unavailable ranges
> > [    0.014809] On node 0, zone DMA: 1 pages in unavailable ranges
> > [    0.014821] On node 0, zone DMA: 96 pages in unavailable ranges
> > [    0.015998] On node 0, zone DMA32: 19129 pages in unavailable
> ranges
> > [    0.078525] On node 0, zone Normal: 22528 pages in unavailable
> ranges
> > [    0.078536] On node 0, zone Normal: 2048 pages in unavailable
> ranges
> > [    0.078567] Reserving Intel graphics memory at [mem 0x64800000-
> 0x687fffff]
> > [    0.080194] ACPI: PM-Timer IO Port: 0x1808
> > [    0.080199] ACPI: LAPIC_NMI (acpi_id[0x01] high edge lint[0x1])
> > [    0.080200] ACPI: LAPIC_NMI (acpi_id[0x02] high edge lint[0x1])
> > [    0.080200] ACPI: LAPIC_NMI (acpi_id[0x03] high edge lint[0x1])
> > [    0.080201] ACPI: LAPIC_NMI (acpi_id[0x04] high edge lint[0x1])
> > [    0.080201] ACPI: LAPIC_NMI (acpi_id[0x05] high edge lint[0x1])
> > [    0.080201] ACPI: LAPIC_NMI (acpi_id[0x06] high edge lint[0x1])
> > [    0.080202] ACPI: LAPIC_NMI (acpi_id[0x07] high edge lint[0x1])
> > [    0.080202] ACPI: LAPIC_NMI (acpi_id[0x08] high edge lint[0x1])
> > [    0.080203] ACPI: LAPIC_NMI (acpi_id[0x09] high edge lint[0x1])
> > [    0.080203] ACPI: LAPIC_NMI (acpi_id[0x0a] high edge lint[0x1])
> > [    0.080203] ACPI: LAPIC_NMI (acpi_id[0x0b] high edge lint[0x1])
> > [    0.080204] ACPI: LAPIC_NMI (acpi_id[0x0c] high edge lint[0x1])
> > [    0.080204] ACPI: LAPIC_NMI (acpi_id[0x0d] high edge lint[0x1])
> > [    0.080205] ACPI: LAPIC_NMI (acpi_id[0x0e] high edge lint[0x1])
> > [    0.080205] ACPI: LAPIC_NMI (acpi_id[0x0f] high edge lint[0x1])
> > [    0.080205] ACPI: LAPIC_NMI (acpi_id[0x10] high edge lint[0x1])
> > [    0.080206] ACPI: LAPIC_NMI (acpi_id[0x11] high edge lint[0x1])
> > [    0.080206] ACPI: LAPIC_NMI (acpi_id[0x12] high edge lint[0x1])
> > [    0.080207] ACPI: LAPIC_NMI (acpi_id[0x13] high edge lint[0x1])
> > [    0.080207] ACPI: LAPIC_NMI (acpi_id[0x14] high edge lint[0x1])
> > [    0.080207] ACPI: LAPIC_NMI (acpi_id[0x15] high edge lint[0x1])
> > [    0.080208] ACPI: LAPIC_NMI (acpi_id[0x16] high edge lint[0x1])
> > [    0.080208] ACPI: LAPIC_NMI (acpi_id[0x17] high edge lint[0x1])
> > [    0.080209] ACPI: LAPIC_NMI (acpi_id[0x00] high edge lint[0x1])
> > [    0.080291] IOAPIC[0]: apic_id 2, version 32, address
> 0xfec00000, GSI 0-119
> > [    0.080293] ACPI: INT_SRC_OVR (bus 0 bus_irq 0 global_irq 2 dfl
> dfl)
> > [    0.080294] ACPI: INT_SRC_OVR (bus 0 bus_irq 9 global_irq 9 high
> level)
> > [    0.080296] ACPI: Using ACPI (MADT) for SMP configuration
> information
> > [    0.080297] ACPI: HPET id: 0x8086a201 base: 0xfed00000
> > [    0.080302] e820: update [mem 0x444e6000-0x44584fff] usable ==>
> reserved
> > [    0.080309] TSC deadline timer available
> > [    0.080311] CPU topo: Max. logical packages:   1
> > [    0.080311] CPU topo: Max. logical dies:       1
> > [    0.080312] CPU topo: Max. dies per package:   1
> > [    0.080313] CPU topo: Max. threads per core:   2
> > [    0.080314] CPU topo: Num. cores per package:    12
> > [    0.080314] CPU topo: Num. threads per package:  16
> > [    0.080314] CPU topo: Allowing 16 present CPUs plus 0 hotplug
> CPUs
> > [    0.080325] PM: hibernation: Registered nosave memory: [mem
> 0x00000000-0x00000fff]
> > [    0.080326] PM: hibernation: Registered nosave memory: [mem
> 0x0009e000-0x0009efff]
> > [    0.080327] PM: hibernation: Registered nosave memory: [mem
> 0x000a0000-0x000fffff]
> > [    0.080328] PM: hibernation: Registered nosave memory: [mem
> 0x43ea7000-0x43ea7fff]
> > [    0.080329] PM: hibernation: Registered nosave memory: [mem
> 0x444e6000-0x44584fff]
> > [    0.080330] PM: hibernation: Registered nosave memory: [mem
> 0x4dd46000-0x56c70fff]
> > [    0.080330] PM: hibernation: Registered nosave memory: [mem
> 0x56c71000-0x56d48fff]
> > [    0.080331] PM: hibernation: Registered nosave memory: [mem
> 0x56d49000-0x56ecefff]
> > [    0.080331] PM: hibernation: Registered nosave memory: [mem
> 0x56ecf000-0x5a7fefff]
> > [    0.080332] PM: hibernation: Registered nosave memory: [mem
> 0x5a800000-0x611fffff]
> > [    0.080332] PM: hibernation: Registered nosave memory: [mem
> 0x61200000-0x61dfffff]
> > [    0.080333] PM: hibernation: Registered nosave memory: [mem
> 0x61e00000-0x687fffff]
> > [    0.080333] PM: hibernation: Registered nosave memory: [mem
> 0x68800000-0xfdffffff]
> > [    0.080333] PM: hibernation: Registered nosave memory: [mem
> 0xfe000000-0xfe010fff]
> > [    0.080334] PM: hibernation: Registered nosave memory: [mem
> 0xfe011000-0xfebfffff]
> > [    0.080334] PM: hibernation: Registered nosave memory: [mem
> 0xfec00000-0xfec00fff]
> > [    0.080334] PM: hibernation: Registered nosave memory: [mem
> 0xfec01000-0xfecfffff]
> > [    0.080335] PM: hibernation: Registered nosave memory: [mem
> 0xfed00000-0xfed00fff]
> > [    0.080335] PM: hibernation: Registered nosave memory: [mem
> 0xfed01000-0xfed1ffff]
> > [    0.080336] PM: hibernation: Registered nosave memory: [mem
> 0xfed20000-0xfed7ffff]
> > [    0.080336] PM: hibernation: Registered nosave memory: [mem
> 0xfed80000-0xfedfffff]
> > [    0.080336] PM: hibernation: Registered nosave memory: [mem
> 0xfee00000-0xfee00fff]
> > [    0.080337] PM: hibernation: Registered nosave memory: [mem
> 0xfee01000-0xffffffff]
> > [    0.080338] [mem 0x68800000-0xfdffffff] available for PCI
> devices
> > [    0.080339] Booting paravirtualized kernel on bare hardware
> > [    0.080340] clocksource: refined-jiffies: mask: 0xffffffff
> max_cycles: 0xffffffff, max_idle_ns: 6370452778343963 ns
> > [    0.084163] setup_percpu: NR_CPUS:320 nr_cpumask_bits:16
> nr_cpu_ids:16 nr_node_ids:1
> > [    0.084800] percpu: Embedded 66 pages/cpu s233472 r8192 d28672
> u524288
> > [    0.084804] pcpu-alloc: s233472 r8192 d28672 u524288
> alloc=1*2097152
> > [    0.084806] pcpu-alloc: [0] 00 01 02 03 [0] 04 05 06 07
> > [    0.084809] pcpu-alloc: [0] 08 09 10 11 [0] 12 13 14 15
> > [    0.084820] Kernel command line: root=UUID=0420afc7-4947-4e2e-
> a096-b607b8b7fd93 rw quiet initrd=boot\intel-ucode.img
> initrd=boot\initramfs-linux611.img resume=UUID=0420afc7-4947-4e2e-
> a096-b607b8b7fd93 resume_offset=106496
> > [    0.088825] Dentry cache hash table entries: 8388608 (order: 14,
> 67108864 bytes, linear)
> > [    0.090830] Inode-cache hash table entries: 4194304 (order: 13,
> 33554432 bytes, linear)
> > [    0.090938] Fallback order for Node 0: 0
> > [    0.090940] Built 1 zonelists, mobility grouping on.  Total
> pages: 16667877
> > [    0.090941] Policy zone: Normal
> > [    0.091110] mem auto-init: stack:all(zero), heap alloc:on, heap
> free:off
> > [    0.091117] software IO TLB: area num 16.
> > [    0.174200] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=16,
> Nodes=1
> > [    0.174233] ftrace: allocating 50629 entries in 198 pages
> > [    0.178623] ftrace: allocated 198 pages with 4 groups
> > [    0.178673] Dynamic Preempt: full
> > [    0.178715] rcu: Preemptible hierarchical RCU implementation.
> > [    0.178716] rcu: RCU restricting CPUs from NR_CPUS=320 to
> nr_cpu_ids=16.
> > [    0.178716] rcu: RCU priority boosting: priority 1 delay 500 ms.
> > [    0.178717] Trampoline variant of Tasks RCU enabled.
> > [    0.178718] Rude variant of Tasks RCU enabled.
> > [    0.178718] Tracing variant of Tasks RCU enabled.
> > [    0.178718] rcu: RCU calculated value of scheduler-enlistment
> delay is 30 jiffies.
> > [    0.178719] rcu: Adjusting geometry for rcu_fanout_leaf=16,
> nr_cpu_ids=16
> > [    0.178727] RCU Tasks: Setting shift to 4 and lim to 1
> rcu_task_cb_adjust=1.
> > [    0.178728] RCU Tasks Rude: Setting shift to 4 and lim to 1
> rcu_task_cb_adjust=1.
> > [    0.178729] RCU Tasks Trace: Setting shift to 4 and lim to 1
> rcu_task_cb_adjust=1.
> > [    0.181066] NR_IRQS: 20736, nr_irqs: 2184, preallocated irqs: 16
> > [    0.181413] rcu: srcu_init: Setting srcu_struct sizes based on
> contention.
> > [    0.181851] kfence: initialized - using 2097152 bytes for 255
> objects at 0x(____ptrval____)-0x(____ptrval____)
> > [    0.181876] Console: colour dummy device 80x25
> > [    0.181878] printk: legacy console [tty0] enabled
> > [    0.181906] ACPI: Core revision 20240322
> > [    0.182096] hpet: HPET dysfunctional in PC10. Force disabled.
> > [    0.182097] APIC: Switch to symmetric I/O mode setup
> > [    0.182099] DMAR: Host address width 39
> > [    0.182099] DMAR: DRHD base: 0x000000fed90000 flags: 0x0
> > [    0.182103] DMAR: dmar0: reg_base_addr fed90000 ver 4:0 cap
> 1c0000c40660462 ecap 29a00f0505e
> > [    0.182104] DMAR: DRHD base: 0x000000fed91000 flags: 0x1
> > [    0.182107] DMAR: dmar1: reg_base_addr fed91000 ver 5:0 cap
> d2008c40660462 ecap f050da
> > [    0.182109] DMAR: RMRR base: 0x00000064000000 end:
> 0x000000687fffff
> > [    0.182111] DMAR-IR: IOAPIC id 2 under DRHD base  0xfed91000
> IOMMU 1
> > [    0.182112] DMAR-IR: HPET id 0 under DRHD base 0xfed91000
> > [    0.182112] DMAR-IR: Queued invalidation will be enabled to
> support x2apic and Intr-remapping.
> > [    0.186032] DMAR-IR: Enabled IRQ remapping in x2apic mode
> > [    0.186034] x2apic enabled
> > [    0.186100] APIC: Switched APIC routing to: cluster x2apic
> > [    0.197380] clocksource: tsc-early: mask: 0xffffffffffffffff
> max_cycles: 0x23fa772cf26, max_idle_ns: 440795269835 ns
> > [    0.197384] Calibrating delay loop (skipped), value calculated
> using timer frequency.. 4993.00 BogoMIPS (lpj=8320000)
> > [    0.197430] CPU0: Thermal monitoring enabled (TM1)
> > [    0.197431] x86/cpu: User Mode Instruction Prevention (UMIP)
> activated
> > [    0.197530] CET detected: Indirect Branch Tracking enabled
> > [    0.197532] Last level iTLB entries: 4KB 0, 2MB 0, 4MB 0
> > [    0.197532] Last level dTLB entries: 4KB 0, 2MB 0, 4MB 0, 1GB 0
> > [    0.197534] process: using mwait in idle threads
> > [    0.197536] Spectre V1 : Mitigation: usercopy/swapgs barriers
> and __user pointer sanitization
> > [    0.197537] Spectre V2 : Mitigation: Enhanced / Automatic IBRS
> > [    0.197538] Spectre V2 : Spectre v2 / SpectreRSB mitigation:
> Filling RSB on context switch
> > [    0.197538] Spectre V2 : Spectre v2 / PBRSB-eIBRS: Retire a
> single CALL on VMEXIT
> > [    0.197539] Spectre V2 : mitigation: Enabling conditional
> Indirect Branch Prediction Barrier
> > [    0.197540] Speculative Store Bypass: Mitigation: Speculative
> Store Bypass disabled via prctl
> > [    0.197541] Register File Data Sampling: Mitigation: Clear
> Register File
> > [    0.197547] x86/fpu: Supporting XSAVE feature 0x001: 'x87
> floating point registers'
> > [    0.197548] x86/fpu: Supporting XSAVE feature 0x002: 'SSE
> registers'
> > [    0.197548] x86/fpu: Supporting XSAVE feature 0x004: 'AVX
> registers'
> > [    0.197549] x86/fpu: Supporting XSAVE feature 0x200: 'Protection
> Keys User registers'
> > [    0.197549] x86/fpu: Supporting XSAVE feature 0x800: 'Control-
> flow User registers'
> > [    0.197550] x86/fpu: xstate_offset[2]:  576,
> xstate_sizes[2]:  256
> > [    0.197551] x86/fpu: xstate_offset[9]:  832,
> xstate_sizes[9]:    8
> > [    0.197551] x86/fpu: xstate_offset[11]:  840,
> xstate_sizes[11]:   16
> > [    0.197552] x86/fpu: Enabled xstate features 0xa07, context size
> is 856 bytes, using 'compacted' format.
> > [    0.200716] Freeing SMP alternatives memory: 40K
> > [    0.200716] pid_max: default: 32768 minimum: 301
> > [    0.200716] LSM: initializing
> lsm=capability,landlock,lockdown,yama,bpf
> > [    0.200716] landlock: Up and running.
> > [    0.200716] Yama: becoming mindful.
> > [    0.200716] LSM support for eBPF active
> > [    0.200716] Mount-cache hash table entries: 131072 (order: 8,
> 1048576 bytes, linear)
> > [    0.200716] Mountpoint-cache hash table entries: 131072 (order:
> 8, 1048576 bytes, linear)
> > [    0.200716] smpboot: CPU0: 12th Gen Intel(R) Core(TM) i7-1260P
> (family: 0x6, model: 0x9a, stepping: 0x3)
> > [    0.200716] Performance Events: XSAVE Architectural LBR, PEBS
> fmt4+-baseline,  AnyThread deprecated, Alderlake Hybrid events, 32-
> deep LBR, full-width counters, Intel PMU driver.
> > [    0.200716] core: cpu_core PMU driver:
> > [    0.200716] ... version:                5
> > [    0.200716] ... bit width:              48
> > [    0.200716] ... generic registers:      8
> > [    0.200716] ... value mask:             0000ffffffffffff
> > [    0.200716] ... max period:             00007fffffffffff
> > [    0.200716] ... fixed-purpose events:   4
> > [    0.200716] ... event mask:             0001000f000000ff
> > [    0.200716] signal: max sigframe size: 3632
> > [    0.200716] Estimated ratio of average max frequency by base
> frequency (times 1024): 1556
> > [    0.200716] rcu: Hierarchical SRCU implementation.
> > [    0.200716] rcu: Max phase no-delay instances is 1000.
> > [    0.200716] Timer migration: 2 hierarchy levels; 8 children per
> group; 2 crossnode level
> > [    0.200716] NMI watchdog: Enabled. Permanently consumes one hw-
> PMU counter.
> > [    0.200716] smp: Bringing up secondary CPUs ...
> > [    0.200716] smpboot: x86: Booting SMP configuration:
> > [    0.200716] .... node  #0, CPUs:        #2  #4  #6  #8  #9 #10
> #11 #12 #13 #14 #15
> > [    0.018930] core: cpu_atom PMU driver: PEBS-via-PT
> > [    0.018930] ... version:                5
> > [    0.018930] ... bit width:              48
> > [    0.018930] ... generic registers:      6
> > [    0.018930] ... value mask:             0000ffffffffffff
> > [    0.018930] ... max period:             00007fffffffffff
> > [    0.018930] ... fixed-purpose events:   3
> > [    0.018930] ... event mask:             000000070000003f
> > [    0.210777]   #1  #3  #5  #7
> > [    0.215011] smp: Brought up 1 node, 16 CPUs
> > [    0.215011] smpboot: Total of 16 processors activated (79903.00
> BogoMIPS)
> > [    0.217482] Memory: 65276284K/66671508K available (18432K kernel
> code, 2185K rwdata, 13516K rodata, 3452K init, 3432K bss, 1370520K
> reserved, 0K cma-reserved)
> > [    0.218690] devtmpfs: initialized
> > [    0.218690] x86/mm: Memory block size: 2048MB
> > [    0.218690] ACPI: PM: Registering ACPI NVS region [mem
> 0x56d49000-0x56ecefff] (1597440 bytes)
> > [    0.218690] clocksource: jiffies: mask: 0xffffffff max_cycles:
> 0xffffffff, max_idle_ns: 6370867519511994 ns
> > [    0.218690] futex hash table entries: 4096 (order: 6, 262144
> bytes, linear)
> > [    0.218690] pinctrl core: initialized pinctrl subsystem
> > [    0.218690] PM: RTC time: 15:43:42, date: 2024-09-17
> > [    0.218690] NET: Registered PF_NETLINK/PF_ROUTE protocol family
> > [    0.218690] DMA: preallocated 4096 KiB GFP_KERNEL pool for
> atomic allocations
> > [    0.218815] DMA: preallocated 4096 KiB GFP_KERNEL|GFP_DMA pool
> for atomic allocations
> > [    0.220935] DMA: preallocated 4096 KiB GFP_KERNEL|GFP_DMA32 pool
> for atomic allocations
> > [    0.220946] audit: initializing netlink subsys (disabled)
> > [    0.220955] audit: type=2000 audit(1726587822.023:1):
> state=initialized audit_enabled=0 res=1
> > [    0.220955] thermal_sys: Registered thermal governor
> 'fair_share'
> > [    0.220955] thermal_sys: Registered thermal governor 'bang_bang'
> > [    0.220955] thermal_sys: Registered thermal governor 'step_wise'
> > [    0.220955] thermal_sys: Registered thermal governor
> 'user_space'
> > [    0.220955] thermal_sys: Registered thermal governor
> 'power_allocator'
> > [    0.220955] cpuidle: using governor ladder
> > [    0.220955] cpuidle: using governor menu
> > [    0.220955] acpiphp: ACPI Hot Plug PCI Controller Driver
> version: 0.5
> > [    0.220955] PCI: ECAM [mem 0xc0000000-0xcfffffff] (base
> 0xc0000000) for domain 0000 [bus 00-ff]
> > [    0.220955] PCI: Using configuration type 1 for base access
> > [    0.220955] kprobes: kprobe jump-optimization is enabled. All
> kprobes are optimized if possible.
> > [    0.224191] HugeTLB: registered 1.00 GiB page size, pre-
> allocated 0 pages
> > [    0.224191] HugeTLB: 16380 KiB vmemmap can be freed for a 1.00
> GiB page
> > [    0.224191] HugeTLB: registered 2.00 MiB page size, pre-
> allocated 0 pages
> > [    0.224191] HugeTLB: 28 KiB vmemmap can be freed for a 2.00 MiB
> page
> > [    0.224500] ACPI: Added _OSI(Module Device)
> > [    0.224500] ACPI: Added _OSI(Processor Device)
> > [    0.224500] ACPI: Added _OSI(3.0 _SCP Extensions)
> > [    0.224500] ACPI: Added _OSI(Processor Aggregator Device)
> > [    0.312844] ACPI: 14 ACPI AML tables successfully acquired and
> loaded
> > [    0.336673] ACPI: USB4 _OSC: OS supports USB3+ DisplayPort+
> PCIe+ XDomain+
> > [    0.336675] ACPI: USB4 _OSC: OS controls USB3+ DisplayPort+
> PCIe+ XDomain+
> > [    0.338150] ACPI: Dynamic OEM Table Load:
> > [    0.338158] ACPI: SSDT 0xFFFF9118C178D400 000394 (v02
> PmRef  Cpu0Cst  00003001 INTL 20200717)
> > [    0.339255] ACPI: Dynamic OEM Table Load:
> > [    0.339260] ACPI: SSDT 0xFFFF9118C1798000 0005E4 (v02
> PmRef  Cpu0Ist  00003000 INTL 20200717)
> > [    0.340384] ACPI: Dynamic OEM Table Load:
> > [    0.340388] ACPI: SSDT 0xFFFF9118C2101200 0001AB (v02
> PmRef  Cpu0Psd  00003000 INTL 20200717)
> > [    0.341453] ACPI: Dynamic OEM Table Load:
> > [    0.341457] ACPI: SSDT 0xFFFF9118C179B000 0004BA (v02
> PmRef  Cpu0Hwp  00003000 INTL 20200717)
> > [    0.342940] ACPI: Dynamic OEM Table Load:
> > [    0.342947] ACPI: SSDT 0xFFFF9118C1784000 001BAF (v02
> PmRef  ApIst    00003000 INTL 20200717)
> > [    0.344827] ACPI: Dynamic OEM Table Load:
> > [    0.344833] ACPI: SSDT 0xFFFF9118C1780000 001038 (v02
> PmRef  ApHwp    00003000 INTL 20200717)
> > [    0.346435] ACPI: Dynamic OEM Table Load:
> > [    0.346441] ACPI: SSDT 0xFFFF9118C21C6000 001349 (v02
> PmRef  ApPsd    00003000 INTL 20200717)
> > [    0.347383] ACPI: Dynamic OEM Table Load:
> > [    0.347383] ACPI: SSDT 0xFFFF9118C1797000 000FBB (v02
> PmRef  ApCst    00003000 INTL 20200717)
> > [    0.351835] ACPI: EC: EC started
> > [    0.351836] ACPI: EC: interrupt blocked
> > [    0.352497] ACPI: EC: EC_CMD/EC_SC=0x66, EC_DATA=0x62
> > [    0.352499] ACPI: \_SB_.PC00.LPCB.EC0_: Boot DSDT EC used to
> handle transactions
> > [    0.352501] ACPI: Interpreter enabled
> > [    0.352548] ACPI: PM: (supports S0 S3 S4 S5)
> > [    0.352549] ACPI: Using IOAPIC for interrupt routing
> > [    0.353800] PCI: Using host bridge windows from ACPI; if
> necessary, use "pci=nocrs" and report a bug
> > [    0.353801] PCI: Ignoring E820 reservations for host bridge
> windows
> > [    0.355184] ACPI: Enabled 7 GPEs in block 00 to 7F
> > [    0.357600] ACPI: \_SB_.PC00.PEG0.PXP_: New power resource
> > [    0.373986] ACPI: \_SB_.PC00.XHCI.RHUB.HS10.BTRT: New power
> resource
> > [    0.374768] ACPI: \_SB_.PC00.PAUD: New power resource
> > [    0.383767] ACPI: \_SB_.PC00.CNVW.WRST: New power resource
> > [    0.392041] ACPI: \_SB_.PC00.TBT0: New power resource
> > [    0.392349] ACPI: \_SB_.PC00.TBT1: New power resource
> > [    0.392651] ACPI: \_SB_.PC00.D3C_: New power resource
> > [    0.683890] ACPI: \_TZ_.FN00: New power resource
> > [    0.683946] ACPI: \_TZ_.FN01: New power resource
> > [    0.684000] ACPI: \_TZ_.FN02: New power resource
> > [    0.684056] ACPI: \_TZ_.FN03: New power resource
> > [    0.684110] ACPI: \_TZ_.FN04: New power resource
> > [    0.684638] ACPI: \PIN_: New power resource
> > [    0.685242] ACPI: PCI Root Bridge [PC00] (domain 0000 [bus 00-
> fe])
> > [    0.685248] acpi PNP0A08:00: _OSC: OS supports [ExtendedConfig
> ASPM ClockPM Segments MSI EDR HPX-Type3]
> > [    0.686937] acpi PNP0A08:00: _OSC: platform does not support
> [AER]
> > [    0.690313] acpi PNP0A08:00: _OSC: OS now controls [PCIeHotplug
> SHPCHotplug PME PCIeCapability LTR DPC]
> > [    0.692570] PCI host bridge to bus 0000:00
> > [    0.692573] pci_bus 0000:00: root bus resource [io  0x0000-
> 0x0cf7 window]
> > [    0.692575] pci_bus 0000:00: root bus resource [io  0x0d00-
> 0xffff window]
> > [    0.692576] pci_bus 0000:00: root bus resource [mem 0x000a0000-
> 0x000bffff window]
> > [    0.692578] pci_bus 0000:00: root bus resource [mem 0x000e0000-
> 0x000fffff window]
> > [    0.692579] pci_bus 0000:00: root bus resource [mem 0x68800000-
> 0xbfffffff window]
> > [    0.692580] pci_bus 0000:00: root bus resource [mem
> 0x4000000000-0x7fffffffff window]
> > [    0.692581] pci_bus 0000:00: root bus resource [bus 00-fe]
> > [    0.692868] pci 0000:00:00.0: [8086:4621] type 00 class 0x060000
> conventional PCI endpoint
> > [    0.693054] pci 0000:00:02.0: [8086:46a6] type 00 class 0x030000
> PCIe Root Complex Integrated Endpoint
> > [    0.693062] pci 0000:00:02.0: BAR 0 [mem 0x603c000000-
> 0x603cffffff 64bit]
> > [    0.693067] pci 0000:00:02.0: BAR 2 [mem 0x4000000000-
> 0x400fffffff 64bit pref]
> > [    0.693070] pci 0000:00:02.0: BAR 4 [io  0x3000-0x303f]
> > [    0.693084] pci 0000:00:02.0: DMAR: Skip IOMMU disabling for
> graphics
> > [    0.693086] pci 0000:00:02.0: Video device with shadowed ROM at
> [mem 0x000c0000-0x000dffff]
> > [    0.693109] pci 0000:00:02.0: VF BAR 0 [mem 0x00000000-
> 0x00ffffff 64bit]
> > [    0.693110] pci 0000:00:02.0: VF BAR 0 [mem 0x00000000-
> 0x06ffffff 64bit]: contains BAR 0 for 7 VFs
> > [    0.693114] pci 0000:00:02.0: VF BAR 2 [mem 0x00000000-
> 0x1fffffff 64bit pref]
> > [    0.693115] pci 0000:00:02.0: VF BAR 2 [mem 0x00000000-
> 0xdfffffff 64bit pref]: contains BAR 2 for 7 VFs
> > [    0.693336] pci 0000:00:06.0: [8086:464d] type 01 class 0x060400
> PCIe Root Port
> > [    0.693379] pci 0000:00:06.0: PCI bridge to [bus 01]
> > [    0.693412] pci 0000:00:06.0:   bridge window [mem 0x84600000-
> 0x846fffff]
> > [    0.693547] pci 0000:00:06.0: PME# supported from D0 D3hot
> D3cold
> > [    0.693596] pci 0000:00:06.0: PTM enabled (root), 4ns
> granularity
> > [    0.694331] pci 0000:00:07.0: [8086:466e] type 01 class 0x060400
> PCIe Root Port
> > [    0.694351] pci 0000:00:07.0: PCI bridge to [bus 02-39]
> > [    0.694355] pci 0000:00:07.0:   bridge window [mem 0x78000000-
> 0x841fffff]
> > [    0.694361] pci 0000:00:07.0:   bridge window [mem 0x6020000000-
> 0x603bffffff 64bit pref]
> > [    0.694383] pci 0000:00:07.0: Overriding RP PIO Log Size to 4
> > [    0.694445] pci 0000:00:07.0: PME# supported from D0 D3hot
> D3cold
> > [    0.694469] pci 0000:00:07.0: PTM enabled (root), 4ns
> granularity
> > [    0.696553] pci 0000:00:07.2: [8086:462f] type 01 class 0x060400
> PCIe Root Port
> > [    0.696570] pci 0000:00:07.2: PCI bridge to [bus 3a-63]
> > [    0.696574] pci 0000:00:07.2:   bridge window [mem 0x6a000000-
> 0x761fffff]
> > [    0.696580] pci 0000:00:07.2:   bridge window [mem 0x6000000000-
> 0x601bffffff 64bit pref]
> > [    0.696602] pci 0000:00:07.2: Overriding RP PIO Log Size to 4
> > [    0.696664] pci 0000:00:07.2: PME# supported from D0 D3hot
> D3cold
> > [    0.696688] pci 0000:00:07.2: PTM enabled (root), 4ns
> granularity
> > [    0.698832] pci 0000:00:08.0: [8086:464f] type 00 class 0x088000
> conventional PCI endpoint
> > [    0.698840] pci 0000:00:08.0: BAR 0 [mem 0x603d1bb000-
> 0x603d1bbfff 64bit]
> > [    0.698934] pci 0000:00:0a.0: [8086:467d] type 00 class 0x118000
> PCIe Root Complex Integrated Endpoint
> > [    0.698941] pci 0000:00:0a.0: BAR 0 [mem 0x603d1a0000-
> 0x603d1a7fff 64bit]
> > [    0.698958] pci 0000:00:0a.0: enabling Extended Tags
> > [    0.699060] pci 0000:00:0d.0: [8086:461e] type 00 class 0x0c0330
> conventional PCI endpoint
> > [    0.699069] pci 0000:00:0d.0: BAR 0 [mem 0x603d190000-
> 0x603d19ffff 64bit]
> > [    0.699109] pci 0000:00:0d.0: PME# supported from D3hot D3cold
> > [    0.701032] pci 0000:00:0d.2: [8086:463e] type 00 class 0x0c0340
> conventional PCI endpoint
> > [    0.701045] pci 0000:00:0d.2: BAR 0 [mem 0x603d140000-
> 0x603d17ffff 64bit]
> > [    0.701051] pci 0000:00:0d.2: BAR 2 [mem 0x603d1ba000-
> 0x603d1bafff 64bit]
> > [    0.701083] pci 0000:00:0d.2: supports D1 D2
> > [    0.701084] pci 0000:00:0d.2: PME# supported from D0 D1 D2 D3hot
> D3cold
> > [    0.701215] pci 0000:00:0d.3: [8086:466d] type 00 class 0x0c0340
> conventional PCI endpoint
> > [    0.701225] pci 0000:00:0d.3: BAR 0 [mem 0x603d100000-
> 0x603d13ffff 64bit]
> > [    0.701231] pci 0000:00:0d.3: BAR 2 [mem 0x603d1b9000-
> 0x603d1b9fff 64bit]
> > [    0.701260] pci 0000:00:0d.3: supports D1 D2
> > [    0.701261] pci 0000:00:0d.3: PME# supported from D0 D1 D2 D3hot
> D3cold
> > [    0.701532] pci 0000:00:14.0: [8086:51ed] type 00 class 0x0c0330
> conventional PCI endpoint
> > [    0.701555] pci 0000:00:14.0: BAR 0 [mem 0x603d180000-
> 0x603d18ffff 64bit]
> > [    0.701655] pci 0000:00:14.0: PME# supported from D3hot D3cold
> > [    0.703595] pci 0000:00:14.2: [8086:51ef] type 00 class 0x050000
> conventional PCI endpoint
> > [    0.703617] pci 0000:00:14.2: BAR 0 [mem 0x603d1b0000-
> 0x603d1b3fff 64bit]
> > [    0.703631] pci 0000:00:14.2: BAR 2 [mem 0x603d1b8000-
> 0x603d1b8fff 64bit]
> > [    0.703850] pci 0000:00:14.3: [8086:51f0] type 00 class 0x028000
> PCIe Root Complex Integrated Endpoint
> > [    0.703912] pci 0000:00:14.3: BAR 0 [mem 0x603d1ac000-
> 0x603d1affff 64bit]
> > [    0.707442] pci 0000:00:14.3: PME# supported from D0 D3hot
> D3cold
> > [    0.708349] pci 0000:00:15.0: [8086:51e8] type 00 class 0x0c8000
> conventional PCI endpoint
> > [    0.709079] pci 0000:00:15.0: BAR 0 [mem 0x00000000-0x00000fff
> 64bit]
> > [    0.712769] pci 0000:00:15.1: [8086:51e9] type 00 class 0x0c8000
> conventional PCI endpoint
> > [    0.713499] pci 0000:00:15.1: BAR 0 [mem 0x00000000-0x00000fff
> 64bit]
> > [    0.716748] pci 0000:00:16.0: [8086:51e0] type 00 class 0x078000
> conventional PCI endpoint
> > [    0.716773] pci 0000:00:16.0: BAR 0 [mem 0x603d1b5000-
> 0x603d1b5fff 64bit]
> > [    0.716868] pci 0000:00:16.0: PME# supported from D3hot
> > [    0.717491] pci 0000:00:17.0: [8086:51d3] type 00 class 0x010601
> conventional PCI endpoint
> > [    0.717511] pci 0000:00:17.0: BAR 0 [mem 0x84700000-0x84701fff]
> > [    0.717522] pci 0000:00:17.0: BAR 1 [mem 0x84703000-0x847030ff]
> > [    0.717533] pci 0000:00:17.0: BAR 2 [io  0x3090-0x3097]
> > [    0.717543] pci 0000:00:17.0: BAR 3 [io  0x3080-0x3083]
> > [    0.717554] pci 0000:00:17.0: BAR 4 [io  0x3060-0x307f]
> > [    0.717564] pci 0000:00:17.0: BAR 5 [mem 0x84702000-0x847027ff]
> > [    0.717645] pci 0000:00:17.0: PME# supported from D3hot
> > [    0.718046] pci 0000:00:1d.0: [8086:51b0] type 01 class 0x060400
> PCIe Root Port
> > [    0.718078] pci 0000:00:1d.0: PCI bridge to [bus 64]
> > [    0.718084] pci 0000:00:1d.0:   bridge window [mem 0x84400000-
> 0x845fffff]
> > [    0.718173] pci 0000:00:1d.0: PME# supported from D0 D3hot
> D3cold
> > [    0.718212] pci 0000:00:1d.0: PTM enabled (root), 4ns
> granularity
> > [    0.718877] pci 0000:00:1d.2: [8086:51b2] type 01 class 0x060400
> PCIe Root Port
> > [    0.718909] pci 0000:00:1d.2: PCI bridge to [bus 65]
> > [    0.718915] pci 0000:00:1d.2:   bridge window [mem 0x84200000-
> 0x843fffff]
> > [    0.719004] pci 0000:00:1d.2: PME# supported from D0 D3hot
> D3cold
> > [    0.719043] pci 0000:00:1d.2: PTM enabled (root), 4ns
> granularity
> > [    0.719752] pci 0000:00:1f.0: [8086:5182] type 00 class 0x060100
> conventional PCI endpoint
> > [    0.720154] pci 0000:00:1f.3: [8086:51c8] type 00 class 0x040100
> conventional PCI endpoint
> > [    0.720216] pci 0000:00:1f.3: BAR 0 [mem 0x603d1a8000-
> 0x603d1abfff 64bit]
> > [    0.720290] pci 0000:00:1f.3: BAR 4 [mem 0x603d000000-
> 0x603d0fffff 64bit]
> > [    0.720451] pci 0000:00:1f.3: PME# supported from D3hot D3cold
> > [    0.721057] pci 0000:00:1f.4: [8086:51a3] type 00 class 0x0c0500
> conventional PCI endpoint
> > [    0.721086] pci 0000:00:1f.4: BAR 0 [mem 0x603d1b4000-
> 0x603d1b40ff 64bit]
> > [    0.721112] pci 0000:00:1f.4: BAR 4 [io  0xefa0-0xefbf]
> > [    0.721397] pci 0000:00:1f.5: [8086:51a4] type 00 class 0x0c8000
> conventional PCI endpoint
> > [    0.721419] pci 0000:00:1f.5: BAR 0 [mem 0xfe010000-0xfe010fff]
> > [    0.722353] pci 0000:01:00.0: [15b7:5030] type 00 class 0x010802
> PCIe Endpoint
> > [    0.722365] pci 0000:01:00.0: BAR 0 [mem 0x84600000-0x84603fff
> 64bit]
> > [    0.722554] pci 0000:00:06.0: PCI bridge to [bus 01]
> > [    0.722587] pci 0000:00:07.0: PCI bridge to [bus 02-39]
> > [    0.722619] pci 0000:00:07.2: PCI bridge to [bus 3a-63]
> > [    0.722800] pci 0000:64:00.0: [8086:15f3] type 00 class 0x020000
> PCIe Endpoint
> > [    0.722819] pci 0000:64:00.0: BAR 0 [mem 0x84400000-0x844fffff]
> > [    0.722844] pci 0000:64:00.0: BAR 3 [mem 0x84500000-0x84503fff]
> > [    0.722977] pci 0000:64:00.0: PME# supported from D0 D3hot
> D3cold
> > [    0.723313] pci 0000:00:1d.0: PCI bridge to [bus 64]
> > [    0.723788] pci 0000:65:00.0: [8086:125c] type 00 class 0x020000
> PCIe Endpoint
> > [    0.723806] pci 0000:65:00.0: BAR 0 [mem 0x84200000-0x842fffff]
> > [    0.723831] pci 0000:65:00.0: BAR 3 [mem 0x84300000-0x84303fff]
> > [    0.723963] pci 0000:65:00.0: PME# supported from D0 D3hot
> D3cold
> > [    0.724773] pci 0000:00:1d.2: PCI bridge to [bus 65]
> > [    0.731129] ACPI: PCI: Interrupt link LNKA configured for IRQ 0
> > [    0.731229] ACPI: PCI: Interrupt link LNKB configured for IRQ 1
> > [    0.731327] ACPI: PCI: Interrupt link LNKC configured for IRQ 0
> > [    0.731425] ACPI: PCI: Interrupt link LNKD configured for IRQ 0
> > [    0.731523] ACPI: PCI: Interrupt link LNKE configured for IRQ 0
> > [    0.731621] ACPI: PCI: Interrupt link LNKF configured for IRQ 0
> > [    0.731719] ACPI: PCI: Interrupt link LNKG configured for IRQ 0
> > [    0.731816] ACPI: PCI: Interrupt link LNKH configured for IRQ 0
> > [    1.109516] Low-power S0 idle used by default for system suspend
> > [    1.116947] ACPI: EC: interrupt unblocked
> > [    1.116948] ACPI: EC: event unblocked
> > [    1.116974] ACPI: EC: EC_CMD/EC_SC=0x66, EC_DATA=0x62
> > [    1.116975] ACPI: EC: GPE=0x6e
> > [    1.116977] ACPI: \_SB_.PC00.LPCB.EC0_: Boot DSDT EC
> initialization complete
> > [    1.116978] ACPI: \_SB_.PC00.LPCB.EC0_: EC: Used to handle
> transactions and events
> > [    1.117430] iommu: Default domain type: Translated
> > [    1.117430] iommu: DMA domain TLB invalidation policy: lazy mode
> > [    1.117501] SCSI subsystem initialized
> > [    1.117507] libata version 3.00 loaded.
> > [    1.117507] ACPI: bus type USB registered
> > [    1.117507] usbcore: registered new interface driver usbfs
> > [    1.117507] usbcore: registered new interface driver hub
> > [    1.117507] usbcore: registered new device driver usb
> > [    1.117507] EDAC MC: Ver: 3.0.0
> > [    1.120822] efivars: Registered efivars operations
> > [    1.120945] NetLabel: Initializing
> > [    1.120946] NetLabel:  domain hash size = 128
> > [    1.120947] NetLabel:  protocols = UNLABELED CIPSOv4 CALIPSO
> > [    1.120965] NetLabel:  unlabeled traffic allowed by default
> > [    1.120970] mctp: management component transport protocol core
> > [    1.120971] NET: Registered PF_MCTP protocol family
> > [    1.120974] PCI: Using ACPI for IRQ routing
> > [    1.188171] PCI: pci_cache_line_size set to 64 bytes
> > [    1.189575] pci 0000:00:1f.5: BAR 0 [mem 0xfe010000-0xfe010fff]: 
> can't claim; no compatible bridge window
> > [    1.190227] e820: reserve RAM buffer [mem 0x0009e000-0x0009ffff]
> > [    1.190229] e820: reserve RAM buffer [mem 0x43ea7000-0x43ffffff]
> > [    1.190230] e820: reserve RAM buffer [mem 0x444e6000-0x47ffffff]
> > [    1.190231] e820: reserve RAM buffer [mem 0x4dd46000-0x4fffffff]
> > [    1.190232] e820: reserve RAM buffer [mem 0x5a800000-0x5bffffff]
> > [    1.190233] e820: reserve RAM buffer [mem 0x1097800000-
> 0x1097ffffff]
> > [    1.190766] pci 0000:00:02.0: vgaarb: setting as boot VGA device
> > [    1.190766] pci 0000:00:02.0: vgaarb: bridge control possible
> > [    1.190766] pci 0000:00:02.0: vgaarb: VGA device added:
> decodes=io+mem,owns=io+mem,locks=none
> > [    1.190766] vgaarb: loaded
> > [    1.190802] clocksource: Switched to clocksource tsc-early
> > [    1.191172] VFS: Disk quotas dquot_6.6.0
> > [    1.191181] VFS: Dquot-cache hash table entries: 512 (order 0,
> 4096 bytes)
> > [    1.191242] pnp: PnP ACPI init
> > [    1.191703] system 00:00: [io  0x0a00-0x0a0f] has been reserved
> > [    1.191706] system 00:00: [io  0x0a10-0x0a2f] has been reserved
> > [    1.191707] system 00:00: [io  0x0a30-0x0a4f] has been reserved
> > [    1.191708] system 00:00: [io  0x0a50-0x0a6f] has been reserved
> > [    1.191709] system 00:00: [io  0x0a70-0x0a7f] has been reserved
> > [    1.191710] system 00:00: [io  0x0a80-0x0a8f] has been reserved
> > [    1.191832] system 00:01: [io  0x0680-0x069f] has been reserved
> > [    1.191834] system 00:01: [io  0x164e-0x164f] has been reserved
> > [    1.191943] system 00:02: [io  0x1854-0x1857] has been reserved
> > [    1.192669] pnp 00:03: disabling [mem 0xc0000000-0xcfffffff]
> because it overlaps 0000:00:02.0 BAR 9 [mem 0x00000000-0xdfffffff
> 64bit pref]
> > [    1.192693] system 00:03: [mem 0xfedc0000-0xfedc7fff] has been
> reserved
> > [    1.192694] system 00:03: [mem 0xfeda0000-0xfeda0fff] has been
> reserved
> > [    1.192696] system 00:03: [mem 0xfeda1000-0xfeda1fff] has been
> reserved
> > [    1.192697] system 00:03: [mem 0xfed20000-0xfed7ffff] could not
> be reserved
> > [    1.192698] system 00:03: [mem 0xfed90000-0xfed93fff] could not
> be reserved
> > [    1.192699] system 00:03: [mem 0xfed45000-0xfed8ffff] could not
> be reserved
> > [    1.192700] system 00:03: [mem 0xfee00000-0xfeefffff] could not
> be reserved
> > [    1.195625] system 00:04: [io  0x2000-0x20fe] has been reserved
> > [    1.196381] pnp: PnP ACPI: found 6 devices
> > [    1.201970] clocksource: acpi_pm: mask: 0xffffff max_cycles:
> 0xffffff, max_idle_ns: 2085701024 ns
> > [    1.202017] NET: Registered PF_INET protocol family
> > [    1.202177] IP idents hash table entries: 262144 (order: 9,
> 2097152 bytes, linear)
> > [    1.215397] tcp_listen_portaddr_hash hash table entries: 32768
> (order: 7, 524288 bytes, linear)
> > [    1.215446] Table-perturb hash table entries: 65536 (order: 6,
> 262144 bytes, linear)
> > [    1.215777] TCP established hash table entries: 524288 (order:
> 10, 4194304 bytes, linear)
> > [    1.216299] TCP bind hash table entries: 65536 (order: 9,
> 2097152 bytes, linear)
> > [    1.216406] TCP: Hash tables configured (established 524288 bind
> 65536)
> > [    1.216608] MPTCP token hash table entries: 65536 (order: 8,
> 1572864 bytes, linear)
> > [    1.216758] UDP hash table entries: 32768 (order: 8, 1048576
> bytes, linear)
> > [    1.216899] UDP-Lite hash table entries: 32768 (order: 8,
> 1048576 bytes, linear)
> > [    1.217011] NET: Registered PF_UNIX/PF_LOCAL protocol family
> > [    1.217017] NET: Registered PF_XDP protocol family
> > [    1.217024] pci 0000:00:07.0: bridge window [io  0x1000-0x0fff]
> to [bus 02-39] add_size 1000
> > [    1.217028] pci 0000:00:07.2: bridge window [io  0x1000-0x0fff]
> to [bus 3a-63] add_size 1000
> > [    1.217038] pci 0000:00:02.0: VF BAR 2 [mem 0x4020000000-
> 0x40ffffffff 64bit pref]: assigned
> > [    1.217042] pci 0000:00:02.0: VF BAR 0 [mem 0x4010000000-
> 0x4016ffffff 64bit]: assigned
> > [    1.217045] pci 0000:00:07.0: bridge window [io  0x4000-0x4fff]: 
> assigned
> > [    1.217047] pci 0000:00:07.2: bridge window [io  0x5000-0x5fff]: 
> assigned
> > [    1.217049] pci 0000:00:15.0: BAR 0 [mem 0x4017000000-
> 0x4017000fff 64bit]: assigned
> > [    1.217395] pci 0000:00:15.1: BAR 0 [mem 0x4017001000-
> 0x4017001fff 64bit]: assigned
> > [    1.217735] pci 0000:00:1f.5: BAR 0 [mem 0x68800000-0x68800fff]: 
> assigned
> > [    1.217752] pci 0000:00:06.0: PCI bridge to [bus 01]
> > [    1.217777] pci 0000:00:06.0:   bridge window [mem 0x84600000-
> 0x846fffff]
> > [    1.217810] pci 0000:00:07.0: PCI bridge to [bus 02-39]
> > [    1.217812] pci 0000:00:07.0:   bridge window [io  0x4000-
> 0x4fff]
> > [    1.217814] pci 0000:00:07.0:   bridge window [mem 0x78000000-
> 0x841fffff]
> > [    1.217817] pci 0000:00:07.0:   bridge window [mem 0x6020000000-
> 0x603bffffff 64bit pref]
> > [    1.217820] pci 0000:00:07.2: PCI bridge to [bus 3a-63]
> > [    1.217821] pci 0000:00:07.2:   bridge window [io  0x5000-
> 0x5fff]
> > [    1.217824] pci 0000:00:07.2:   bridge window [mem 0x6a000000-
> 0x761fffff]
> > [    1.217826] pci 0000:00:07.2:   bridge window [mem 0x6000000000-
> 0x601bffffff 64bit pref]
> > [    1.217830] pci 0000:00:1d.0: PCI bridge to [bus 64]
> > [    1.217848] pci 0000:00:1d.0:   bridge window [mem 0x84400000-
> 0x845fffff]
> > [    1.217855] pci 0000:00:1d.2: PCI bridge to [bus 65]
> > [    1.217859] pci 0000:00:1d.2:   bridge window [mem 0x84200000-
> 0x843fffff]
> > [    1.217867] pci_bus 0000:00: resource 4 [io  0x0000-0x0cf7
> window]
> > [    1.217868] pci_bus 0000:00: resource 5 [io  0x0d00-0xffff
> window]
> > [    1.217869] pci_bus 0000:00: resource 6 [mem 0x000a0000-
> 0x000bffff window]
> > [    1.217871] pci_bus 0000:00: resource 7 [mem 0x000e0000-
> 0x000fffff window]
> > [    1.217872] pci_bus 0000:00: resource 8 [mem 0x68800000-
> 0xbfffffff window]
> > [    1.217873] pci_bus 0000:00: resource 9 [mem 0x4000000000-
> 0x7fffffffff window]
> > [    1.217874] pci_bus 0000:01: resource 1 [mem 0x84600000-
> 0x846fffff]
> > [    1.217875] pci_bus 0000:02: resource 0 [io  0x4000-0x4fff]
> > [    1.217876] pci_bus 0000:02: resource 1 [mem 0x78000000-
> 0x841fffff]
> > [    1.217877] pci_bus 0000:02: resource 2 [mem 0x6020000000-
> 0x603bffffff 64bit pref]
> > [    1.217878] pci_bus 0000:3a: resource 0 [io  0x5000-0x5fff]
> > [    1.217879] pci_bus 0000:3a: resource 1 [mem 0x6a000000-
> 0x761fffff]
> > [    1.217880] pci_bus 0000:3a: resource 2 [mem 0x6000000000-
> 0x601bffffff 64bit pref]
> > [    1.217881] pci_bus 0000:64: resource 1 [mem 0x84400000-
> 0x845fffff]
> > [    1.217883] pci_bus 0000:65: resource 1 [mem 0x84200000-
> 0x843fffff]
> > [    1.219810] PCI: CLS 64 bytes, default 64
> > [    1.219841] DMAR: Intel-IOMMU force enabled due to platform opt
> in
> > [    1.219847] DMAR: No ATSR found
> > [    1.219848] DMAR: No SATC found
> > [    1.219849] DMAR: IOMMU feature fl1gp_support inconsistent
> > [    1.219850] DMAR: IOMMU feature pgsel_inv inconsistent
> > [    1.219851] DMAR: IOMMU feature nwfs inconsistent
> > [    1.219851] DMAR: IOMMU feature dit inconsistent
> > [    1.219852] DMAR: IOMMU feature sc_support inconsistent
> > [    1.219853] DMAR: IOMMU feature dev_iotlb_support inconsistent
> > [    1.219854] DMAR: dmar0: Using Queued invalidation
> > [    1.219857] DMAR: dmar1: Using Queued invalidation
> > [    1.219962] Trying to unpack rootfs image as initramfs...
> > [    1.220076] pci 0000:00:02.0: Adding to iommu group 0
> > [    1.220106] pci 0000:00:00.0: Adding to iommu group 1
> > [    1.220117] pci 0000:00:06.0: Adding to iommu group 2
> > [    1.220125] pci 0000:00:07.0: Adding to iommu group 3
> > [    1.220133] pci 0000:00:07.2: Adding to iommu group 4
> > [    1.220142] pci 0000:00:08.0: Adding to iommu group 5
> > [    1.220150] pci 0000:00:0a.0: Adding to iommu group 6
> > [    1.220165] pci 0000:00:0d.0: Adding to iommu group 7
> > [    1.220172] pci 0000:00:0d.2: Adding to iommu group 7
> > [    1.220178] pci 0000:00:0d.3: Adding to iommu group 7
> > [    1.220192] pci 0000:00:14.0: Adding to iommu group 8
> > [    1.220199] pci 0000:00:14.2: Adding to iommu group 8
> > [    1.220206] pci 0000:00:14.3: Adding to iommu group 9
> > [    1.220218] pci 0000:00:15.0: Adding to iommu group 10
> > [    1.220226] pci 0000:00:15.1: Adding to iommu group 10
> > [    1.220236] pci 0000:00:16.0: Adding to iommu group 11
> > [    1.220243] pci 0000:00:17.0: Adding to iommu group 12
> > [    1.220266] pci 0000:00:1d.0: Adding to iommu group 13
> > [    1.220282] pci 0000:00:1d.2: Adding to iommu group 14
> > [    1.220300] pci 0000:00:1f.0: Adding to iommu group 15
> > [    1.220308] pci 0000:00:1f.3: Adding to iommu group 15
> > [    1.220316] pci 0000:00:1f.4: Adding to iommu group 15
> > [    1.220323] pci 0000:00:1f.5: Adding to iommu group 15
> > [    1.220331] pci 0000:01:00.0: Adding to iommu group 16
> > [    1.220354] pci 0000:64:00.0: Adding to iommu group 17
> > [    1.220381] pci 0000:65:00.0: Adding to iommu group 18
> > [    1.220523] DMAR: Intel(R) Virtualization Technology for
> Directed I/O
> > [    1.220524] PCI-DMA: Using software bounce buffering for IO
> (SWIOTLB)
> > [    1.220525] software IO TLB: mapped [mem 0x00000000359f8000-
> 0x00000000399f8000] (64MB)
> > [    1.220564] clocksource: tsc: mask: 0xffffffffffffffff
> max_cycles: 0x23fa772cf26, max_idle_ns: 440795269835 ns
> > [    1.220616] clocksource: Switched to clocksource tsc
> > [    1.220637] platform rtc_cmos: registered platform RTC device
> (no PNP device found)
> > [    1.227245] Initialise system trusted keyrings
> > [    1.227255] Key type blacklist registered
> > [    1.227295] workingset: timestamp_bits=41 max_order=24
> bucket_order=0
> > [    1.227305] zbud: loaded
> > [    1.227417] fuse: init (API version 7.40)
> > [    1.227488] integrity: Platform Keyring initialized
> > [    1.227490] integrity: Machine keyring initialized
> > [    1.236155] Key type asymmetric registered
> > [    1.236158] Asymmetric key parser 'x509' registered
> > [    1.236181] Block layer SCSI generic (bsg) driver version 0.4
> loaded (major 246)
> > [    1.236262] io scheduler mq-deadline registered
> > [    1.236263] io scheduler kyber registered
> > [    1.236272] io scheduler bfq registered
> > [    1.236870] pcieport 0000:00:06.0: PME: Signaling with IRQ 122
> > [    1.237101] pcieport 0000:00:07.0: PME: Signaling with IRQ 123
> > [    1.237117] pcieport 0000:00:07.0: pciehp: Slot #3 AttnBtn-
> PwrCtrl- MRL- AttnInd- PwrInd- HotPlug+ Surprise+ Interlock- NoCompl+
> IbPresDis- LLActRep+
> > [    1.237433] pcieport 0000:00:07.2: PME: Signaling with IRQ 124
> > [    1.237449] pcieport 0000:00:07.2: pciehp: Slot #5 AttnBtn-
> PwrCtrl- MRL- AttnInd- PwrInd- HotPlug+ Surprise+ Interlock- NoCompl+
> IbPresDis- LLActRep+
> > [    1.237758] pcieport 0000:00:1d.0: PME: Signaling with IRQ 125
> > [    1.238027] pcieport 0000:00:1d.2: PME: Signaling with IRQ 126
> > [    1.238133] shpchp: Standard Hot Plug PCI Controller Driver
> version: 0.4
> > [    1.238900] input: Sleep Button as
> /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0E:00/input/input0
> > [    1.238922] ACPI: button: Sleep Button [SLPB]
> > [    1.238952] input: Power Button as
> /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0C:00/input/input1
> > [    1.238963] ACPI: button: Power Button [PWRB]
> > [    1.238982] input: Power Button as
> /devices/LNXSYSTM:00/LNXPWRBN:00/input/input2
> > [    1.239063] ACPI: button: Power Button [PWRF]
> > [    1.243545] thermal LNXTHERM:00: registered as thermal_zone0
> > [    1.243547] ACPI: thermal: Thermal Zone [TZ00] (54 C)
> > [    1.243835] Serial: 8250/16550 driver, 32 ports, IRQ sharing
> enabled
> > [    1.245729] hpet_acpi_add: no address or irqs in _CRS
> > [    1.245765] Non-volatile memory driver v1.3
> > [    1.245766] Linux agpgart interface v0.103
> > [    1.282118] ACPI: bus type drm_connector registered
> > [    1.283317] Freeing initrd memory: 106196K
> > [    1.284291] ahci 0000:00:17.0: version 3.0
> > [    1.284668] ahci 0000:00:17.0: AHCI vers 0001.0301, 32 command
> slots, 6 Gbps, SATA mode
> > [    1.284672] ahci 0000:00:17.0: 1/1 ports implemented (port mask
> 0x2)
> > [    1.284673] ahci 0000:00:17.0: flags: 64bit ncq sntf pm clo only
> pio slum part deso sadm sds
> > [    1.285087] scsi host0: ahci
> > [    1.285169] scsi host1: ahci
> > [    1.285197] ata1: DUMMY
> > [    1.285212] ata2: SATA max UDMA/133 abar m2048 at 0x84702000 port
> 0x84702180 irq 127 lpm-pol 4
> > [    1.285284] usbcore: registered new interface driver
> usbserial_generic
> > [    1.285288] usbserial: USB Serial support registered for generic
> > [    1.285358] rtc_cmos rtc_cmos: RTC can wake from S4
> > [    1.287193] rtc_cmos rtc_cmos: registered as rtc0
> > [    1.287570] rtc_cmos rtc_cmos: setting system clock to 2024-09-
> 17T15:43:43 UTC (1726587823)
> > [    1.287610] rtc_cmos rtc_cmos: alarms up to one month, y3k, 114
> bytes nvram
> > [    1.288735] intel_pstate: Intel P-state driver initializing
> > [    1.290872] intel_pstate: HWP enabled
> > [    1.291430] ledtrig-cpu: registered to indicate activity on CPUs
> > [    1.291876] [drm] Initialized simpledrm 1.0.0 for simple-
> framebuffer.0 on minor 0
> > [    1.292353] fbcon: Deferring console take-over
> > [    1.292358] simple-framebuffer simple-framebuffer.0: [drm] fb0:
> simpledrmdrmfb frame buffer device
> > [    1.292419] hid: raw HID events driver (C) Jiri Kosina
> > [    1.292473] drop_monitor: Initializing network drop monitor
> service
> > [    1.292567] NET: Registered PF_INET6 protocol family
> > [    1.296692] Segment Routing with IPv6
> > [    1.296693] RPL Segment Routing with IPv6
> > [    1.296704] In-situ OAM (IOAM) with IPv6
> > [    1.296720] NET: Registered PF_PACKET protocol family
> > [    1.299178] ENERGY_PERF_BIAS: Set to 'normal', was 'performance'
> > [    1.299835] microcode: Current revision: 0x00000434
> > [    1.299839] microcode: Updated early from: 0x0000042a
> > [    1.300531] IPI shorthand broadcast: enabled
> > [    1.301773] sched_clock: Marking stable (1284914767, 15597475)-
> >(1326242945, -25730703)
> > [    1.302178] registered taskstats version 1
> > [    1.303378] Loading compiled-in X.509 certificates
> > [    1.306147] Loaded X.509 cert 'Build time autogenerated kernel
> key: cb8a38269e411cf2cea941e3c19d1521412bd34d'
> > [    1.308962] zswap: loaded using pool zstd/zsmalloc
> > [    1.309007] Demotion targets for Node 0: null
> > [    1.309121] Key type .fscrypt registered
> > [    1.309121] Key type fscrypt-provisioning registered
> > [    1.309500] integrity: Loading X.509 certificate: UEFI:db
> > [    1.309544] integrity: Loaded X.509 cert 'Microsoft Corporation
> UEFI CA 2011: 13adbf4309bd82709c8cd54f316ed522988a1bd4'
> > [    1.309544] integrity: Loading X.509 certificate: UEFI:db
> > [    1.309551] integrity: Loaded X.509 cert 'Microsoft Windows
> Production PCA 2011: a92902398e16c49778cd90f99e4f9ae17c55af53'
> > [    1.309972] PM:   Magic number: 8:571:740
> > [    1.311885] RAS: Correctable Errors collector initialized.
> > [    1.599328] ata2: SATA link down (SStatus 4 SControl 300)
> > [    1.601308] clk: Disabling unused clocks
> > [    1.601325] PM: genpd: Disabling unused power domains
> > [    1.609973] Freeing unused decrypted memory: 2028K
> > [    1.610569] Freeing unused kernel image (initmem) memory: 3452K
> > [    1.610578] Write protecting the kernel read-only data: 32768k
> > [    1.611494] Freeing unused kernel image (rodata/data gap)
> memory: 820K
> > [    1.616342] x86/mm: Checked W+X mappings: passed, no W+X pages
> found.
> > [    1.616345] rodata_test: all tests were successful
> > [    1.616356] Run /init as init process
> > [    1.616357]   with arguments:
> > [    1.616357]     /init
> > [    1.616358]   with environment:
> > [    1.616358]     HOME=/
> > [    1.616359]     TERM=linux
> > [    1.738727] xhci_hcd 0000:00:0d.0: xHCI Host Controller
> > [    1.738738] xhci_hcd 0000:00:0d.0: new USB bus registered,
> assigned bus number 1
> > [    1.739793] xhci_hcd 0000:00:0d.0: hcc params 0x20007fc1 hci
> version 0x120 quirks 0x0000000200009810
> > [    1.740087] xhci_hcd 0000:00:0d.0: xHCI Host Controller
> > [    1.740090] xhci_hcd 0000:00:0d.0: new USB bus registered,
> assigned bus number 2
> > [    1.740093] xhci_hcd 0000:00:0d.0: Host supports USB 3.2
> Enhanced SuperSpeed
> > [    1.740135] usb usb1: New USB device found, idVendor=1d6b,
> idProduct=0002, bcdDevice= 6.11
> > [    1.740139] usb usb1: New USB device strings: Mfr=3, Product=2,
> SerialNumber=1
> > [    1.740141] usb usb1: Product: xHCI Host Controller
> > [    1.740142] usb usb1: Manufacturer: Linux 6.11.0-rc7-00001-
> g0e2ad6528188-dirty xhci-hcd
> > [    1.740144] usb usb1: SerialNumber: 0000:00:0d.0
> > [    1.740282] hub 1-0:1.0: USB hub found
> > [    1.740289] hub 1-0:1.0: 1 port detected
> > [    1.740533] usb usb2: New USB device found, idVendor=1d6b,
> idProduct=0003, bcdDevice= 6.11
> > [    1.740535] usb usb2: New USB device strings: Mfr=3, Product=2,
> SerialNumber=1
> > [    1.740537] usb usb2: Product: xHCI Host Controller
> > [    1.740538] usb usb2: Manufacturer: Linux 6.11.0-rc7-00001-
> g0e2ad6528188-dirty xhci-hcd
> > [    1.740539] usb usb2: SerialNumber: 0000:00:0d.0
> > [    1.740628] hub 2-0:1.0: USB hub found
> > [    1.740635] hub 2-0:1.0: 3 ports detected
> > [    1.741581] xhci_hcd 0000:00:14.0: xHCI Host Controller
> > [    1.741586] xhci_hcd 0000:00:14.0: new USB bus registered,
> assigned bus number 3
> > [    1.742720] xhci_hcd 0000:00:14.0: hcc params 0x20007fc1 hci
> version 0x120 quirks 0x0000100200009810
> > [    1.743083] xhci_hcd 0000:00:14.0: xHCI Host Controller
> > [    1.743087] xhci_hcd 0000:00:14.0: new USB bus registered,
> assigned bus number 4
> > [    1.743089] xhci_hcd 0000:00:14.0: Host supports USB 3.1
> Enhanced SuperSpeed
> > [    1.743129] usb usb3: New USB device found, idVendor=1d6b,
> idProduct=0002, bcdDevice= 6.11
> > [    1.743131] usb usb3: New USB device strings: Mfr=3, Product=2,
> SerialNumber=1
> > [    1.743132] usb usb3: Product: xHCI Host Controller
> > [    1.743133] usb usb3: Manufacturer: Linux 6.11.0-rc7-00001-
> g0e2ad6528188-dirty xhci-hcd
> > [    1.743134] usb usb3: SerialNumber: 0000:00:14.0
> > [    1.743239] hub 3-0:1.0: USB hub found
> > [    1.743267] hub 3-0:1.0: 12 ports detected
> > [    1.745297] usb usb4: New USB device found, idVendor=1d6b,
> idProduct=0003, bcdDevice= 6.11
> > [    1.745299] usb usb4: New USB device strings: Mfr=3, Product=2,
> SerialNumber=1
> > [    1.745301] usb usb4: Product: xHCI Host Controller
> > [    1.745302] usb usb4: Manufacturer: Linux 6.11.0-rc7-00001-
> g0e2ad6528188-dirty xhci-hcd
> > [    1.745302] usb usb4: SerialNumber: 0000:00:14.0
> > [    1.745388] hub 4-0:1.0: USB hub found
> > [    1.745410] hub 4-0:1.0: 4 ports detected
> > [    1.761523] nvme 0000:01:00.0: platform quirk: setting simple
> suspend
> > [    1.761605] nvme nvme0: pci function 0000:01:00.0
> > [    1.791467] nvme nvme0: 16/0/0 default/read/poll queues
> > [    1.796102]  nvme0n1: p1 p2 p3
> > [    1.992401] usb 3-4: new high-speed USB device number 2 using
> xhci_hcd
> > [    2.134739] usb 3-4: New USB device found, idVendor=05e3,
> idProduct=0608, bcdDevice=88.32
> > [    2.134746] usb 3-4: New USB device strings: Mfr=0, Product=1,
> SerialNumber=0
> > [    2.134748] usb 3-4: Product: USB2.0 Hub
> > [    2.136254] hub 3-4:1.0: USB hub found
> > [    2.136751] hub 3-4:1.0: 4 ports detected
> > [    2.137612] usb: port power management may be unreliable
> > [    2.203731] usb 2-1: new SuperSpeed USB device number 2 using
> xhci_hcd
> > [    2.237657] usb 2-1: New USB device found, idVendor=045e,
> idProduct=0955, bcdDevice= 1.41
> > [    2.237662] usb 2-1: New USB device strings: Mfr=1, Product=2,
> SerialNumber=0
> > [    2.237664] usb 2-1: Product: 4-Port USB 3.0 Hub
> > [    2.237665] usb 2-1: Manufacturer: Generic
> > [    2.245834] hub 2-1:1.0: USB hub found
> > [    2.247480] hub 2-1:1.0: 2 ports detected
> > [    2.255872] usb 4-1: new SuperSpeed USB device number 2 using
> xhci_hcd
> > [    2.275009] usb 4-1: New USB device found, idVendor=0e8d,
> idProduct=7961, bcdDevice= 1.00
> > [    2.275014] usb 4-1: New USB device strings: Mfr=6, Product=7,
> SerialNumber=8
> > [    2.275015] usb 4-1: Product: Wireless_Device
> > [    2.275017] usb 4-1: Manufacturer: MediaTek Inc.
> > [    2.275018] usb 4-1: SerialNumber: 000000000
> > [    2.395819] usb 3-6: new high-speed USB device number 3 using
> xhci_hcd
> > [    2.469827] i915 0000:00:02.0: [drm] Found ALDERLAKE_P (device
> ID 46a6) display version 13.00
> > [    2.470484] i915 0000:00:02.0: [drm] VT-d active for gfx access
> > [    2.526904] i915 0000:00:02.0: vgaarb: deactivate vga console
> > [    2.527166] i915 0000:00:02.0: [drm] Using Transparent Hugepages
> > [    2.529267] i915 0000:00:02.0: vgaarb: VGA decodes changed:
> olddecodes=io+mem,decodes=io+mem:owns=io+mem
> > [    2.534856] i915 0000:00:02.0: [drm] Finished loading DMC
> firmware i915/adlp_dmc.bin (v2.20)
> > [    2.535899] usb 2-1.1: new SuperSpeed USB device number 3 using
> xhci_hcd
> > [    2.557014] usb 3-6: New USB device found, idVendor=045e,
> idProduct=0957, bcdDevice= 1.41
> > [    2.557029] usb 3-6: New USB device strings: Mfr=1, Product=2,
> SerialNumber=0
> > [    2.557035] usb 3-6: Product: 4-Port USB 2.0 Hub
> > [    2.557039] usb 3-6: Manufacturer: Generic
> > [    2.557797] usb 2-1.1: New USB device found, idVendor=045e,
> idProduct=0927, bcdDevice=31.00
> > [    2.557814] usb 2-1.1: New USB device strings: Mfr=1, Product=2,
> SerialNumber=6
> > [    2.557819] usb 2-1.1: Product: Ethernet Adapter
> > [    2.557823] usb 2-1.1: Manufacturer: Microsoft
> > [    2.557826] usb 2-1.1: SerialNumber: 0013DF804
> > [    2.561404] hub 3-6:1.0: USB hub found
> > [    2.563028] hub 3-6:1.0: 2 ports detected
> > [    2.645045] i915 0000:00:02.0: [drm] GT0: GuC firmware
> i915/adlp_guc_70.bin version 70.29.2
> > [    2.645051] i915 0000:00:02.0: [drm] GT0: HuC firmware
> i915/tgl_huc.bin version 7.9.3
> > [    2.659283] i915 0000:00:02.0: [drm] GT0: HuC: authenticated for
> all workloads
> > [    2.660460] i915 0000:00:02.0: [drm] GT0: GUC: submission
> enabled
> > [    2.660462] i915 0000:00:02.0: [drm] GT0: GUC: SLPC enabled
> > [    2.661015] i915 0000:00:02.0: [drm] GT0: GUC: RC enabled
> > [    2.662137] i915 0000:00:02.0: [drm] Protected Xe Path (PXP)
> protected content support initialized
> > [    2.689226] usb 3-7: new full-speed USB device number 4 using
> xhci_hcd
> > [    2.695739] [drm] Initialized i915 1.6.0 for 0000:00:02.0 on
> minor 1
> > [    2.698285] ACPI: video: Video Device [GFX0] (multi-head:
> yes  rom: no  post: no)
> > [    2.699207] input: Video Bus as
> /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/LNXVIDEO:00/input/input3
> > [    2.737465] fbcon: i915drmfb (fb0) is primary device
> > [    2.737467] fbcon: Deferring console take-over
> > [    2.737468] i915 0000:00:02.0: [drm] fb0: i915drmfb frame buffer
> device
> > [    2.835767] usb 3-7: New USB device found, idVendor=045e,
> idProduct=0800, bcdDevice= 9.34
> > [    2.835772] usb 3-7: New USB device strings: Mfr=1, Product=2,
> SerialNumber=0
> > [    2.835773] usb 3-7: Product: Microsoft? Nano Transceiver v2.0
> > [    2.835775] usb 3-7: Manufacturer: Microsoft
> > [    2.857652] usbcore: registered new interface driver usbhid
> > [    2.857654] usbhid: USB HID core driver
> > [    2.862052] input: Microsoft Microsoft? Nano Transceiver v2.0 as
> /devices/pci0000:00/0000:00:14.0/usb3/3-7/3-
> 7:1.0/0003:045E:0800.0001/input/input4
> > [    2.965962] hid-generic 0003:045E:0800.0001: input,hidraw0: USB
> HID v1.11 Keyboard [Microsoft Microsoft? Nano Transceiver v2.0] on
> usb-0000:00:14.0-7/input0
> > [    2.968229] input: Microsoft Microsoft? Nano Transceiver v2.0
> Mouse as /devices/pci0000:00/0000:00:14.0/usb3/3-7/3-
> 7:1.1/0003:045E:0800.0002/input/input5
> > [    2.968393] input: Microsoft Microsoft? Nano Transceiver v2.0
> Consumer Control as /devices/pci0000:00/0000:00:14.0/usb3/3-7/3-
> 7:1.1/0003:045E:0800.0002/input/input6
> > [    2.968554] hid-generic 0003:045E:0800.0002: input,hidraw1: USB
> HID v1.11 Mouse [Microsoft Microsoft? Nano Transceiver v2.0] on usb-
> 0000:00:14.0-7/input1
> > [    2.968700] input: Microsoft Microsoft? Nano Transceiver v2.0
> Consumer Control as /devices/pci0000:00/0000:00:14.0/usb3/3-7/3-
> 7:1.2/0003:045E:0800.0003/input/input7
> > [    3.022596] input: Microsoft Microsoft? Nano Transceiver v2.0
> System Control as /devices/pci0000:00/0000:00:14.0/usb3/3-7/3-
> 7:1.2/0003:045E:0800.0003/input/input9
> > [    3.022920] hid-generic 0003:045E:0800.0003:
> input,hiddev96,hidraw2: USB HID v1.11 Device [Microsoft Microsoft?
> Nano Transceiver v2.0] on usb-0000:00:14.0-7/input2
> > [    3.175304] PM: Image not found (code -22)
> > [    3.196942] fbcon: Taking over console
> > [    3.209556] Console: switching to colour frame buffer device
> 240x67
> > [    3.308676] EXT4-fs (nvme0n1p2): mounted filesystem 0420afc7-
> 4947-4e2e-a096-b607b8b7fd93 r/w with ordered data mode. Quota mode:
> none.
> > [    3.367761] systemd[1]: systemd 256.6-1-arch running in system
> mode (+PAM +AUDIT -SELINUX -APPARMOR -IMA +SMACK +SECCOMP +GCRYPT
> +GNUTLS +OPENSSL +ACL +BLKID +CURL +ELFUTILS +FIDO2 +IDN2 -IDN +IPTC
> +KMOD +LIBCRYPTSETUP +LIBCRYPTSETUP_PLUGINS +LIBFDISK +PCRE2
> +PWQUALITY +P11KIT +QRENCODE +TPM2 +BZIP2 +LZ4 +XZ +ZLIB +ZSTD
> +BPF_FRAMEWORK +XKBCOMMON +UTMP -SYSVINIT +LIBARCHIVE)
> > [    3.367765] systemd[1]: Detected architecture x86-64.
> > [    3.368553] systemd[1]: Hostname set to <mdp-archnuc>.
> > [    3.611164] systemd[1]: bpf-restrict-fs: LSM BPF program
> attached
> > [    3.699797] systemd[1]: Queued start job for default target
> Graphical Interface.
> > [    3.753107] systemd[1]: Created slice Slice /system/dirmngr.
> > [    3.753888] systemd[1]: Created slice Slice /system/getty.
> > [    3.754461] systemd[1]: Created slice Slice /system/gpg-agent.
> > [    3.755011] systemd[1]: Created slice Slice /system/gpg-agent-
> browser.
> > [    3.755524] systemd[1]: Created slice Slice /system/gpg-agent-
> extra.
> > [    3.755998] systemd[1]: Created slice Slice /system/gpg-agent-
> ssh.
> > [    3.756450] systemd[1]: Created slice Slice /system/keyboxd.
> > [    3.756684] systemd[1]: Created slice Slice /system/modprobe.
> > [    3.756803] systemd[1]: Created slice Slice /system/systemd-
> fsck.
> > [    3.756872] systemd[1]: Created slice User and Session Slice.
> > [    3.756893] systemd[1]: Started Dispatch Password Requests to
> Console Directory Watch.
> > [    3.756908] systemd[1]: Started Forward Password Requests to
> Wall Directory Watch.
> > [    3.756982] systemd[1]: Set up automount Arbitrary Executable
> File Formats File System Automount Point.
> > [    3.756989] systemd[1]: Expecting device /dev/disk/by-uuid/EF7B-
> A70B...
> > [    3.756993] systemd[1]: Expecting device /dev/disk/by-
> uuid/efa73f2d-495d-448d-a0f0-dd425258b7e5...
> > [    3.756999] systemd[1]: Reached target Local Encrypted Volumes.
> > [    3.757005] systemd[1]: Reached target Login Prompts.
> > [    3.757011] systemd[1]: Reached target Local Integrity Protected
> Volumes.
> > [    3.757020] systemd[1]: Reached target Path Units.
> > [    3.757027] systemd[1]: Reached target Remote File Systems.
> > [    3.757031] systemd[1]: Reached target Slice Units.
> > [    3.757043] systemd[1]: Reached target Local Verity Protected
> Volumes.
> > [    3.757076] systemd[1]: Listening on Device-mapper event daemon
> FIFOs.
> > [    3.760193] systemd[1]: Listening on Process Core Dump Socket.
> > [    3.760919] systemd[1]: Listening on Credential
> Encryption/Decryption.
> > [    3.761003] systemd[1]: Listening on Journal Socket (/dev/log).
> > [    3.761058] systemd[1]: Listening on Journal Sockets.
> > [    3.761093] systemd[1]: TPM PCR Measurements was skipped because
> of an unmet condition check (ConditionSecurity=measured-uki).
> > [    3.761109] systemd[1]: Make TPM PCR Policy was skipped because
> of an unmet condition check (ConditionSecurity=measured-uki).
> > [    3.761165] systemd[1]: Listening on udev Control Socket.
> > [    3.761202] systemd[1]: Listening on udev Kernel Socket.
> > [    3.762311] systemd[1]: Mounting Huge Pages File System...
> > [    3.763074] systemd[1]: Mounting POSIX Message Queue File
> System...
> > [    3.763792] systemd[1]: Mounting Kernel Debug File System...
> > [    3.764350] systemd[1]: Mounting Kernel Trace File System...
> > [    3.765317] systemd[1]: Starting Create List of Static Device
> Nodes...
> > [    3.766158] systemd[1]: Starting Load Kernel Module configfs...
> > [    3.766682] systemd[1]: Starting Load Kernel Module dm_mod...
> > [    3.767934] systemd[1]: Starting Load Kernel Module drm...
> > [    3.769088] systemd[1]: Starting Load Kernel Module fuse...
> > [    3.770335] systemd[1]: Starting Load Kernel Module loop...
> > [    3.770384] systemd[1]: File System Check on Root Device was
> skipped because of an unmet condition check
> (ConditionPathIsReadWrite=!/).
> > [    3.770425] systemd[1]: Clear Stale Hibernate Storage Info was
> skipped because of an unmet condition check
> (ConditionPathExists=/sys/firmware/efi/efivars/HibernateLocation-
> 8cf2644b-4b0b-428f-9387-6d876050dc67).
> > [    3.772057] systemd[1]: Starting Journal Service...
> > [    3.772971] systemd[1]: Starting Load Kernel Modules...
> > [    3.772986] systemd[1]: TPM PCR Machine ID Measurement was
> skipped because of an unmet condition check
> (ConditionSecurity=measured-uki).
> > [    3.773641] systemd[1]: Starting Remount Root and Kernel File
> Systems...
> > [    3.773677] systemd[1]: Early TPM SRK Setup was skipped because
> of an unmet condition check (ConditionSecurity=measured-uki).
> > [    3.774224] systemd[1]: Starting Load udev Rules from
> Credentials...
> > [    3.774948] systemd[1]: Starting Coldplug All udev Devices...
> > [    3.777379] systemd[1]: Mounted Huge Pages File System.
> > [    3.777453] systemd[1]: Mounted POSIX Message Queue File System.
> > [    3.777510] systemd[1]: Mounted Kernel Debug File System.
> > [    3.777561] systemd[1]: Mounted Kernel Trace File System.
> > [    3.777759] systemd[1]: Finished Create List of Static Device
> Nodes.
> > [    3.777978] systemd[1]: modprobe at configfs.service: Deactivated
> successfully.
> > [    3.778112] systemd[1]: Finished Load Kernel Module configfs.
> > [    3.778286] systemd[1]: modprobe at drm.service: Deactivated
> successfully.
> > [    3.778411] systemd[1]: Finished Load Kernel Module drm.
> > [    3.778575] systemd[1]: modprobe at fuse.service: Deactivated
> successfully.
> > [    3.778688] systemd[1]: Finished Load Kernel Module fuse.
> > [    3.779305] systemd[1]: Mounting FUSE Control File System...
> > [    3.780063] systemd[1]: Mounting Kernel Configuration File
> System...
> > [    3.780929] systemd[1]: Starting Create Static Device Nodes in
> /dev gracefully...
> > [    3.782976] systemd[1]: Finished Load udev Rules from
> Credentials.
> > [    3.783391] loop: module loaded
> > [    3.784044] systemd[1]: modprobe at loop.service: Deactivated
> successfully.
> > [    3.784330] systemd[1]: Finished Load Kernel Module loop.
> > [    3.785492] systemd[1]: Mounted FUSE Control File System.
> > [    3.785629] systemd[1]: Mounted Kernel Configuration File
> System.
> > [    3.785810] systemd-journald[395]: Collecting audit messages is
> disabled.
> > [    3.798212] i2c_dev: i2c /dev entries driver
> > [    3.799115] systemd[1]: Finished Load Kernel Modules.
> > [    3.799850] systemd[1]: Starting Apply Kernel Variables...
> > [    3.799991] device-mapper: uevent: version 1.0.3
> > [    3.800058] device-mapper: ioctl: 4.48.0-ioctl (2023-03-01)
> initialised: dm-devel at lists.linux.dev
> > [    3.800371] systemd[1]: modprobe at dm_mod.service: Deactivated
> successfully.
> > [    3.800462] systemd[1]: Finished Load Kernel Module dm_mod.
> > [    3.800633] systemd[1]: Repartition Root Disk was skipped
> because no trigger condition checks were met.
> > [    3.805467] systemd[1]: Finished Create Static Device Nodes in
> /dev gracefully.
> > [    3.806389] systemd[1]: Finished Apply Kernel Variables.
> > [    3.806887] systemd[1]: Started Journal Service.
> > [    3.832625] EXT4-fs (nvme0n1p2): re-mounted 0420afc7-4947-4e2e-
> a096-b607b8b7fd93 r/w. Quota mode: none.
> > [    3.840126] systemd-journald[395]: Received client request to
> flush runtime journal.
> > [    3.843896] Adding 67108860k swap on /swapfile.  Priority:-2
> extents:86 across:334987260k SS
> > [    3.946711] mc: Linux media interface: v0.10
> > [    3.950655] mousedev: PS/2 mouse device common for all mice
> > [    3.971833] resource: resource sanity check: requesting [mem
> 0x00000000fedc0000-0x00000000fedcffff], which spans more than pnp
> 00:03 [mem 0xfedc0000-0xfedc7fff]
> > [    3.971839] caller igen6_probe+0x15e/0x7c0 [igen6_edac] mapping
> multiple BARs
> > [    3.975353] EDAC MC0: Giving out device to module igen6_edac
> controller Intel_client_SoC MC#0: DEV 0000:00:00.0 (INTERRUPT)
> > [    3.975402] EDAC MC1: Giving out device to module igen6_edac
> controller Intel_client_SoC MC#1: DEV 0000:00:00.0 (INTERRUPT)
> > [    3.975427] EDAC igen6 MC0: HANDLING IBECC MEMORY ERROR
> > [    3.975428] EDAC igen6 MC0: ADDR 0x7fffffffe0
> > [    3.975454] intel_pmc_core INT33A1:00:  initialized
> > [    3.975552] EDAC igen6 MC1: HANDLING IBECC MEMORY ERROR
> > [    3.975556] EDAC igen6 MC1: ADDR 0x7fffffffe0
> > [    3.976644] EDAC igen6: v2.5.1
> > [    3.985687] videodev: Linux video capture interface: v2.00
> > [    3.985762] pps_core: LinuxPPS API ver. 1 registered
> > [    3.985765] pps_core: Software ver. 5.3.6 - Copyright 2005-2007
> Rodolfo Giometti <giometti at linux.it>
> > [    3.988981] input: PC Speaker as
> /devices/platform/pcspkr/input/input10
> > [    3.996243] PTP clock support registered
> > [    3.999181] mei_me 0000:00:16.0: enabling device (0000 -> 0002)
> > [    4.000730] i801_smbus 0000:00:1f.4: enabling device (0000 ->
> 0003)
> > [    4.001128] i801_smbus 0000:00:1f.4: SPD Write Disable is set
> > [    4.001184] i801_smbus 0000:00:1f.4: SMBus using PCI interrupt
> > [    4.004969] i2c i2c-13: Successfully instantiated SPD at 0x50
> > [    4.008414] intel-lpss 0000:00:15.0: enabling device (0004 ->
> 0006)
> > [    4.008861] idma64 idma64.0: Found Intel integrated DMA 64-bit
> > [    4.027139] Serial bus multi instantiate pseudo device driver
> INT3515:00: error -ENXIO: IRQ index 1 not found
> > [    4.027145] Serial bus multi instantiate pseudo device driver
> INT3515:00: error -ENXIO: Error requesting irq at index 1
> > [    4.029512] ACPI: bus type thunderbolt registered
> > [    4.032631] Intel(R) 2.5G Ethernet Linux Driver
> > [    4.032634] Copyright(c) 2018 Intel Corporation.
> > [    4.032751] igc 0000:64:00.0: enabling device (0000 -> 0002)
> > [    4.033014] igc 0000:64:00.0: PTM enabled, 4ns granularity
> > [    4.038479] intel-lpss 0000:00:15.1: enabling device (0004 ->
> 0006)
> > [    4.038818] idma64 idma64.1: Found Intel integrated DMA 64-bit
> > [    4.047090] Creating 1 MTD partitions on "0000:00:1f.5":
> > [    4.047094] 0x000000000000-0x000002000000 : "BIOS"
> > [    4.079742] pps pps0: new PPS source ptp0
> > [    4.079786] igc 0000:64:00.0 (unnamed net_device)
> (uninitialized): PHC added
> > [    4.082583] RAPL PMU: API unit is 2^-32 Joules, 4 fixed
> counters, 655360 ms ovfl timer
> > [    4.082586] RAPL PMU: hw unit of domain pp0-core 2^-14 Joules
> > [    4.082588] RAPL PMU: hw unit of domain package 2^-14 Joules
> > [    4.082588] RAPL PMU: hw unit of domain pp1-gpu 2^-14 Joules
> > [    4.082589] RAPL PMU: hw unit of domain psys 2^-14 Joules
> > [    4.083350] usbcore: registered new device driver r8152-
> cfgselector
> > [    4.107228] cryptd: max_cpu_qlen set to 1000
> > [    4.107196] mei_hdcp 0000:00:16.0-b638ab7e-94e2-4ea2-a552-
> d1c54b627f04: bound 0000:00:02.0 (ops i915_hdcp_ops [i915])
> > [    4.107949] mei_pxp 0000:00:16.0-fbf6fcf1-96cf-4e2e-a6a6-
> 1bab8cbe36b1: bound 0000:00:02.0 (ops i915_pxp_tee_component_ops
> [i915])
> > [    4.109214] ee1004 13-0050: 512 byte EE1004-compliant SPD
> EEPROM, read-only
> > [    4.172477] r8152-cfgselector 2-1.1: reset SuperSpeed USB device
> number 3 using xhci_hcd
> > [    4.187010] Bluetooth: Core ver 2.22
> > [    4.187025] NET: Registered PF_BLUETOOTH protocol family
> > [    4.187026] Bluetooth: HCI device and connection manager
> initialized
> > [    4.187032] Bluetooth: HCI socket layer initialized
> > [    4.187034] Bluetooth: L2CAP socket layer initialized
> > [    4.187036] Bluetooth: SCO socket layer initialized
> > [    4.191558] igc 0000:64:00.0: 4.000 Gb/s available PCIe
> bandwidth (5.0 GT/s PCIe x1 link)
> > [    4.191562] igc 0000:64:00.0 eth0: MAC: XX:XX:XX:XX:XX:XX
> > [    4.191837] cfg80211: Loading compiled-in X.509 certificates for
> regulatory database
> > [    4.191998] igc 0000:65:00.0: enabling device (0000 -> 0002)
> > [    4.192549] igc 0000:65:00.0: PTM enabled, 4ns granularity
> > [    4.193238] AES CTR mode by8 optimization enabled
> > [    4.194837] Loaded X.509 cert 'sforshee: 00b28ddf47aef9cea7'
> > [    4.195017] Loaded X.509 cert 'wens:
> 61c038651aabdcf94bd0ac7ff06c7248db18c600'
> > [    4.214394] snd_hda_intel 0000:00:1f.3: enabling device (0000 ->
> 0002)
> > [    4.214598] snd_hda_intel 0000:00:1f.3: bound 0000:00:02.0 (ops
> i915_audio_component_bind_ops [i915])
> > [    4.223182] usbcore: registered new interface driver btusb
> > [    4.224896] Bluetooth: hci0: HW/SW Version: 0x008a008a, Build
> Time: 20240826151221
> > [    4.243090] pps pps1: new PPS source ptp1
> > [    4.243291] igc 0000:65:00.0 (unnamed net_device)
> (uninitialized): PHC added
> > [    4.245647] r8152 2-1.1:1.0 eth1: v1.12.13
> > [    4.245683] usbcore: registered new interface driver r8152
> > [    4.261881] usbcore: registered new interface driver cdc_ether
> > [    4.272727] snd_hda_codec_realtek hdaudioC0D0: autoconfig for
> ALC269VB: line_outs=1 (0x21/0x0/0x0/0x0/0x0) type:hp
> > [    4.272733] snd_hda_codec_realtek hdaudioC0D0:    speaker_outs=0
> (0x0/0x0/0x0/0x0/0x0)
> > [    4.272735] snd_hda_codec_realtek hdaudioC0D0:    hp_outs=0
> (0x0/0x0/0x0/0x0/0x0)
> > [    4.272737] snd_hda_codec_realtek hdaudioC0D0:    mono:
> mono_out=0x0
> > [    4.272738] snd_hda_codec_realtek hdaudioC0D0:    inputs:
> > [    4.272739] snd_hda_codec_realtek hdaudioC0D0:      Mic=0x18
> > [    4.283158] igc 0000:65:00.0: 4.000 Gb/s available PCIe
> bandwidth (5.0 GT/s PCIe x1 link)
> > [    4.283163] igc 0000:65:00.0 eth2: MAC: XX:XX:XX:XX:XX:XX
> > [    4.285711] igc 0000:64:00.0 enp100s0: renamed from eth0
> > [    4.303471] Intel(R) Wireless WiFi driver for Linux
> > [    4.303618] iwlwifi 0000:00:14.3: enabling device (0000 -> 0002)
> > [    4.306032] iwlwifi 0000:00:14.3: Detected crf-id 0x400410, cnv-
> id 0x80400 wfpm id 0x80000020
> > [    4.306074] iwlwifi 0000:00:14.3: PCI dev 51f0/0094, rev=0x370,
> rfid=0x2010d000
> > [    4.306077] iwlwifi 0000:00:14.3: Detected Intel(R) Wi-Fi 6E
> AX211 160MHz
> > [    4.310525] iwlwifi 0000:00:14.3: TLV_FW_FSEQ_VERSION: FSEQ
> Version: 0.0.2.42
> > [    4.310859] iwlwifi 0000:00:14.3: loaded firmware version
> 89.202a2f7b.0 so-a0-gf-a0-89.ucode op_mode iwlmvm
> > [    4.317505] r8152 2-1.1:1.0 enp0s13f0u1u1: renamed from eth1
> > [    4.317848] igc 0000:65:00.0 enp101s0: renamed from eth2
> > [    4.326705] input: HDA Intel PCH Mic as
> /devices/pci0000:00/0000:00:1f.3/sound/card0/input11
> > [    4.326777] input: HDA Intel PCH Headphone as
> /devices/pci0000:00/0000:00:1f.3/sound/card0/input12
> > [    4.326832] input: HDA Intel PCH HDMI/DP,pcm=3 as
> /devices/pci0000:00/0000:00:1f.3/sound/card0/input13
> > [    4.326873] input: HDA Intel PCH HDMI/DP,pcm=7 as
> /devices/pci0000:00/0000:00:1f.3/sound/card0/input14
> > [    4.326939] input: HDA Intel PCH HDMI/DP,pcm=8 as
> /devices/pci0000:00/0000:00:1f.3/sound/card0/input15
> > [    4.326994] input: HDA Intel PCH HDMI/DP,pcm=9 as
> /devices/pci0000:00/0000:00:1f.3/sound/card0/input16
> > [    4.430414] intel_tcc_cooling: TCC Offset locked
> > [    4.555399] intel_rapl_msr: PL4 support detected.
> > [    4.555425] intel_rapl_common: Found RAPL domain package
> > [    4.555428] intel_rapl_common: Found RAPL domain core
> > [    4.555429] intel_rapl_common: Found RAPL domain uncore
> > [    4.555431] intel_rapl_common: Found RAPL domain psys
> > [    4.613360] iwlwifi 0000:00:14.3: WFPM_UMAC_PD_NOTIFICATION:
> 0x20
> > [    4.613411] iwlwifi 0000:00:14.3: WFPM_LMAC2_PD_NOTIFICATION:
> 0x1f
> > [    4.613418] iwlwifi 0000:00:14.3: WFPM_AUTH_KEY_0: 0x90
> > [    4.613426] iwlwifi 0000:00:14.3: CNVI_SCU_SEQ_DATA_DW9: 0x0
> > [    4.613723] iwlwifi 0000:00:14.3: loaded PNVM version 35148b80
> > [    4.614836] iwlwifi 0000:00:14.3: RFIm is deactivated, reason =
> 4
> > [    4.630016] iwlwifi 0000:00:14.3: Detected RF GF,
> rfid=0x2010d000
> > [    4.700769] iwlwifi 0000:00:14.3: base HW address:
> XX:XX:XX:XX:XX:XX
> > [    4.833421] iwlwifi 0000:00:14.3 wlo1: renamed from wlan0
> > [    5.452456] EXT4-fs (nvme0n1p3): mounted filesystem efa73f2d-
> 495d-448d-a0f0-dd425258b7e5 r/w with ordered data mode. Quota mode:
> none.
> > [    5.661641] Bluetooth: BNEP (Ethernet Emulation) ver 1.3
> > [    5.661644] Bluetooth: BNEP filters: protocol multicast
> > [    5.661647] Bluetooth: BNEP socket layer initialized
> > [    5.925867] iwlwifi 0000:00:14.3: WFPM_UMAC_PD_NOTIFICATION:
> 0x20
> > [    5.925877] iwlwifi 0000:00:14.3: WFPM_LMAC2_PD_NOTIFICATION:
> 0x1f
> > [    5.925885] iwlwifi 0000:00:14.3: WFPM_AUTH_KEY_0: 0x90
> > [    5.925893] iwlwifi 0000:00:14.3: CNVI_SCU_SEQ_DATA_DW9: 0x0
> > [    5.927244] iwlwifi 0000:00:14.3: RFIm is deactivated, reason =
> 4
> > [    6.019702] iwlwifi 0000:00:14.3: Registered PHC clock: iwlwifi-
> PTP, with index: 2
> > [    6.248772] iwlwifi 0000:00:14.3: WFPM_UMAC_PD_NOTIFICATION:
> 0x20
> > [    6.248782] iwlwifi 0000:00:14.3: WFPM_LMAC2_PD_NOTIFICATION:
> 0x1f
> > [    6.248790] iwlwifi 0000:00:14.3: WFPM_AUTH_KEY_0: 0x90
> > [    6.248798] iwlwifi 0000:00:14.3: CNVI_SCU_SEQ_DATA_DW9: 0x0
> > [    6.250128] iwlwifi 0000:00:14.3: RFIm is deactivated, reason =
> 4
> > [    7.025262] Bluetooth: hci0: Device setup in 2736415 usecs
> > [    7.025270] Bluetooth: hci0: HCI Enhanced Setup Synchronous
> Connection command is advertised, but not supported.
> > [    7.466021] usbcore: registered new interface driver option
> > [    7.466030] usbserial: USB Serial support registered for GSM
> modem (1-port)
> > [    8.318933] Bluetooth: hci0: Mediatek coredump end
> > [    8.566804] igc 0000:64:00.0 enp100s0: NIC Link is Up 1000 Mbps
> Full Duplex, Flow Control: RX
> > [    9.199113] Bluetooth: hci0: Mediatek coredump end
> > [    9.209081] Bluetooth: hci0: Opcode 0x0c03 failed: -110
> > [   11.342488] Bluetooth: hci0: Failed to read MSFT supported
> features (-110)
> > [   13.455279] block nvme0n1: No UUID available providing old NGUID
> > [   13.478988] Bluetooth: hci0: AOSP get vendor capabilities (-110)
> > [   16.117052] wlo1: regulatory prevented using AP config,
> downgraded
> > [   16.123049] wlo1: authenticate with XX:XX:XX:XX:XX:XX (local
> address=XX:XX:XX:XX:XX:XX)
> > [   16.124244] wlo1: send auth to XX:XX:XX:XX:XX:XX (try 1/3)
> > [   16.166021] wlo1: authenticated
> > [   16.172421] wlo1: associate with XX:XX:XX:XX:XX:XX (try 1/3)
> > [   16.174455] wlo1: RX AssocResp from XX:XX:XX:XX:XX:XX
> (capab=0x111 status=0 aid=1)
> > [   16.184782] wlo1: associated
> > [   16.246848] wlo1: Limiting TX power to 23 (26 - 3) dBm as
> advertised by XX:XX:XX:XX:XX:XX
> > [   17.488650] warning: `ThreadPoolForeg' uses wireless extensions
> which will stop working for Wi-Fi 7 hardware; use nl80211
> > [   17.531765] platform INT3515:01: deferred probe pending: Serial
> bus multi instantiate pseudo device driver: Error creating i2c-
> client, idx 0
> > [   17.531769] platform INT3515:02: deferred probe pending: Serial
> bus multi instantiate pseudo device driver: Error creating i2c-
> client, idx 0
> > [   18.595698] usb 4-1: Disable of device-initiated U1 failed.
> > [   23.715878] usb 4-1: Disable of device-initiated U2 failed.
> > [   33.956071] Bluetooth: hci0: Failed to write uhw reg(-110)
> > [   33.956138] usb 4-1: Disable of device-initiated U2 failed.
> > [   39.293677] xhci_hcd 0000:00:14.0: Timeout while waiting for
> setup device command
> > [   44.634497] xhci_hcd 0000:00:14.0: Timeout while waiting for
> setup device command
> > [   44.841067] usb 4-1: device not accepting address 2, error -62
> > [   50.186371] xhci_hcd 0000:00:14.0: Timeout while waiting for
> setup device command
> > [   55.523585] xhci_hcd 0000:00:14.0: Timeout while waiting for
> setup device command
> > [   55.729841] usb 4-1: device not accepting address 2, error -62
> > [   61.072634] xhci_hcd 0000:00:14.0: Timeout while waiting for
> setup device command
> > [   66.407700] xhci_hcd 0000:00:14.0: Timeout while waiting for
> setup device command
> > [   66.614207] usb 4-1: device not accepting address 2, error -62
> > [   71.955541] xhci_hcd 0000:00:14.0: Timeout while waiting for
> setup device command
> > [   77.289925] xhci_hcd 0000:00:14.0: Timeout while waiting for
> setup device command
> > [   77.496512] usb 4-1: device not accepting address 2, error -62
> > [   77.513500] usb 4-1: USB disconnect, device number 2
> > [   82.837128] xhci_hcd 0000:00:14.0: Timeout while waiting for
> setup device command
> > [   88.171049] xhci_hcd 0000:00:14.0: Timeout while waiting for
> setup device command
> > [   88.377554] usb 4-1: device not accepting address 3, error -62
> > [   93.718045] xhci_hcd 0000:00:14.0: Timeout while waiting for
> setup device command
> > [   99.051387] xhci_hcd 0000:00:14.0: Timeout while waiting for
> setup device command
> > [   99.258078] usb 4-1: device not accepting address 4, error -62
> > [   99.266739] usb usb4-port1: attempt power cycle
> > [  106.518206] xhci_hcd 0000:00:14.0: Timeout while waiting for
> setup device command
> > [  111.851387] xhci_hcd 0000:00:14.0: Timeout while waiting for
> setup device command
> > [  112.057840] usb 4-1: device not accepting address 5, error -62
> > [  117.397862] xhci_hcd 0000:00:14.0: Timeout while waiting for
> setup device command
> > [  122.732729] xhci_hcd 0000:00:14.0: Timeout while waiting for
> setup device command
> > [  122.937708] usb 4-1: device not accepting address 6, error -62
> > [  122.944587] usb usb4-port1: unable to enumerate USB device
> >
> >
> >
> > >
> > > >
> > > > External email : Please do not click links or open attachments
> until
> > > > you have verified the sender or the content.
> > > >  Hi,
> > > >
> > > > The 22/08/2024 13:23, Hao Qin wrote:
> > > > > Remove resetting mt7921 before downloading the fw, as it may
> cause
> > > > > command timeout when performing the reset.
> > > > >
> > > > > Signed-off-by: Hao Qin <hao.qin at mediatek.com>
> > > > > ---
> > > > >  drivers/bluetooth/btmtk.c | 4 ++--
> > > > >  1 file changed, 2 insertions(+), 2 deletions(-)
> > > > >
> > > > > diff --git a/drivers/bluetooth/btmtk.c
> b/drivers/bluetooth/btmtk.c
> > > > > index 2b7c80043aa2..a46f70135cbd 100644
> > > > > --- a/drivers/bluetooth/btmtk.c
> > > > > +++ b/drivers/bluetooth/btmtk.c
> > > > > @@ -1326,7 +1326,6 @@ int btmtk_usb_setup(struct hci_dev
> *hdev)
> > > > >  fwname = FIRMWARE_MT7668;
> > > > >  break;
> > > > >  case 0x7922:
> > > > > -case 0x7961:
> > > > >  case 0x7925:
> > > > >  /* Reset the device to ensure it's in the initial state
> before
> > > > >   * downloading the firmware to ensure.
> > > > > @@ -1334,7 +1333,8 @@ int btmtk_usb_setup(struct hci_dev
> *hdev)
> > > > >
> > > > >  if (!test_bit(BTMTK_FIRMWARE_LOADED, &btmtk_data->flags))
> > > > >  btmtk_usb_subsys_reset(hdev, dev_id);
> > > > > -
> > > > > +fallthrough;
> > > > > +case 0x7961:
> > > > >  btmtk_fw_get_filename(fw_bin_name, sizeof(fw_bin_name),
> dev_id,
> > > > >        fw_version, fw_flavor);
> > > > >
> > > > > --
> > > > > 2.18.0
> > > > >
> > > >
> > > > [Original regression report
> > > >
> > > 
> https://lore.kernel.org/linux-bluetooth/ZsTh7Jyug7MbZsLE at mdpsys.co.uk/
> > > > ]
> > > >
> > > > Thanks for the patch, I have tested it on top of v6.11-rc7 and
> can
> > > > confirm
> > > > that it resolves the initial command timeout issue.
> > > >
> > > > Unfortunately, when using the latest firmware version
> 20240826151221
> > > > from the
> > > > linux-firmware repo I'm still seeing "Mediatek coredump end"
> errors
> > > > followed by MSFT and AOSP errors. The device then appears
> > > > unresponsive
> > > > and the kernel eventually gives up attempting to enumerate:
> > > >
> > > > [  230.042936] usb 4-3.2: new SuperSpeed USB device number 4
> using
> > > > xhci_hcd
> > > > [  230.065228] usb 4-3.2: New USB device found, idVendor=0e8d,
> > > > idProduct=7961, bcdDevice= 1.00
> > > > [  230.065237] usb 4-3.2: New USB device strings: Mfr=6,
> Product=7,
> > > > SerialNumber=8
> > > > [  230.065240] usb 4-3.2: Product: Wireless_Device
> > > > [  230.065242] usb 4-3.2: Manufacturer: MediaTek Inc.
> > > > [  230.065245] usb 4-3.2: SerialNumber: 000000000
> > > > [  230.101915] Bluetooth: hci2: HW/SW Version: 0x008a008a,
> Build
> > > > Time: 20240826151221
> > > > [  233.005938] Bluetooth: hci2: Device setup in 2862056 usecs
> > > > [  233.005983] Bluetooth: hci2: HCI Enhanced Setup Synchronous
> > > > Connection command is advertised, but not supported.
> > > > [  234.306071] Bluetooth: hci2: Mediatek coredump end
> > > > [  235.092729] Bluetooth: hci2: Opcode 0x0c03 failed: -110
> > > > [  235.192772] Bluetooth: hci2: Mediatek coredump end
> > > > [  237.226157] Bluetooth: hci2: Failed to read MSFT supported
> > > > features (-110)
> > > > [  239.359435] Bluetooth: hci2: AOSP get vendor capabilities (-
> 110)
> > > > [  244.479726] usb 4-3.2: Disable of device-initiated U1
> failed.
> > > > [  249.599598] usb 4-3.2: Disable of device-initiated U2
> failed.
> > > > [  259.839215] Bluetooth: hci2: Failed to write uhw reg(-110)
> > > > [  259.839240] usb 4-3.2: Disable of device-initiated U1
> failed.
> > > > [  264.959343] usb 4-3.2: Disable of device-initiated U2
> failed.
> > > > [  270.079038] xhci_hcd 0000:00:14.0: Timeout while waiting for
> setup
> > > > device command
> > > > [  275.412299] xhci_hcd 0000:00:14.0: Timeout while waiting for
> setup
> > > > device command
> > > > [  275.618812] usb 4-3.2: device not accepting address 4, error
> -62
> > > > [  280.958852] xhci_hcd 0000:00:14.0: Timeout while waiting for
> setup
> > > > device command
> > > > [  286.292034] xhci_hcd 0000:00:14.0: Timeout while waiting for
> setup
> > > > device command
> > > > [  286.498618] usb 4-3.2: device not accepting address 4, error
> -62
> > > > [  291.838759] xhci_hcd 0000:00:14.0: Timeout while waiting for
> setup
> > > > device command
> > > > [  297.172018] xhci_hcd 0000:00:14.0: Timeout while waiting for
> setup
> > > > device command
> > > > [  297.378477] usb 4-3.2: device not accepting address 4, error
> -62
> > > > [  302.718497] xhci_hcd 0000:00:14.0: Timeout while waiting for
> setup
> > > > device command
> > > > [  308.051867] xhci_hcd 0000:00:14.0: Timeout while waiting for
> setup
> > > > device command
> > > > [  308.258345] usb 4-3.2: device not accepting address 4, error
> -62
> > > > [  308.260253] usb 4-3.2: USB disconnect, device number 4
> > > > [  313.598307] xhci_hcd 0000:00:14.0: Timeout while waiting for
> setup
> > > > device command
> > > > [  318.931586] xhci_hcd 0000:00:14.0: Timeout while waiting for
> setup
> > > > device command
> > > > [  319.138278] usb 4-3.2: device not accepting address 5, error
> -62
> > > > [  324.478224] xhci_hcd 0000:00:14.0: Timeout while waiting for
> setup
> > > > device command
> > > > [  329.811444] xhci_hcd 0000:00:14.0: Timeout while waiting for
> setup
> > > > device command
> > > > [  330.018032] usb 4-3.2: device not accepting address 6, error
> -62
> > > > [  330.018489] usb 4-3-port2: attempt power cycle
> > > > [  336.211505] xhci_hcd 0000:00:14.0: Timeout while waiting for
> setup
> > > > device command
> > > > [  341.544640] xhci_hcd 0000:00:14.0: Timeout while waiting for
> setup
> > > > device command
> > > > [  341.751239] usb 4-3.2: device not accepting address 7, error
> -62
> > > > [  347.091375] xhci_hcd 0000:00:14.0: Timeout while waiting for
> setup
> > > > device command
> > > > [  352.424563] xhci_hcd 0000:00:14.0: Timeout while waiting for
> setup
> > > > device command
> > > > [  352.631136] usb 4-3.2: device not accepting address 8, error
> -62
> > > > [  352.631538] usb 4-3-port2: unable to enumerate USB device
> > > >
> > > >
> > > > Interestingly, if I revert back to an known-good firmware
> version
> > > > 20231025113744 along with your patch, the device enumerates and
> works
> > > > fine:
> > > >
> > > > [ 4001.366725] usb 4-1: new SuperSpeed USB device number 4
> using
> > > > xhci_hcd
> > > > [ 4001.385840] usb 4-1: New USB device found, idVendor=0e8d,
> > > > idProduct=7961, bcdDevice= 1.00
> > > > [ 4001.385855] usb 4-1: New USB device strings: Mfr=6,
> Product=7,
> > > > SerialNumber=8
> > > > [ 4001.385860] usb 4-1: Product: Wireless_Device
> > > > [ 4001.385863] usb 4-1: Manufacturer: MediaTek Inc.
> > > > [ 4001.385867] usb 4-1: SerialNumber: 000000000
> > > > [ 4001.398010] Bluetooth: hci1: HW/SW Version: 0x008a008a,
> Build
> > > > Time: 20231025113744
> > > > [ 4004.275656] Bluetooth: hci1: Device setup in 2812288 usecs
> > > > [ 4004.275661] Bluetooth: hci1: HCI Enhanced Setup Synchronous
> > > > Connection command is advertised, but not supported.
> > > > [ 4004.355137] Bluetooth: hci1: AOSP extensions version v0.96
> > > > [ 4004.355156] Bluetooth: hci1: AOSP quality report is not
> supported
> > > > [ 4004.355698] Bluetooth: MGMT ver 1.23
> > > >
> > > > But if I then disconnect it, I get the Oops that I shared in my
> > > > original
> > > > regression report:
> > > >
> > > > [ 4043.436215] usb 4-1: USB disconnect, device number 4
> > > > [ 4043.437308] Oops: general protection fault, probably for
> non-
> > > > canonical address 0xdead000000000122: 0000 [#1] PREEMPT SMP
> NOPTI
> > > > [ 4043.437332] CPU: 2 UID: 0 PID: 3698 Comm: kworker/2:0 Not
> tainted
> > > > 6.11.0-rc7-00001-g0e2ad6528188-dirty #71
> > > > d90fb9085e2a0686ac48ebcc408d97b104c6fbf1
> > > > [ 4043.437352] Hardware name: Intel(R) Client Systems
> > > > NUC12WSHi7/NUC12WSBi7, BIOS WSADL357.0088.2023.0505.1623
> 05/05/2023
> > > > [ 4043.437361] Workqueue: usb_hub_wq hub_event
> > > > [ 4043.437386] RIP: 0010:hci_unregister_dev+0x45/0x1f0
> [bluetooth]
> > > > [ 4043.437548] Code: 89 ef e8 ae d4 5c c1 f0 80 8b e9 0e 00 00
> 08 48
> > > > 89 ef e8 0e c2 5c c1 48 c7 c7 68 60 52 c1 e8 22 23 5d c1 48 8b
> 43 08
> > > > 48 8b 13 <48> 3b 18 0f 85 f5 c7 06 00 48 3b 5a 08 0f 85 eb c7
> 06 00
> > > > 48 89 42
> > > > [ 4043.437560] RSP: 0018:ffffa10f4ae43b98 EFLAGS: 00010246
> > > > [ 4043.437574] RAX: dead000000000122 RBX: ffff8cf86c160000 RCX:
> > > > 0000000000000000
> > > > [ 4043.437585] RDX: dead000000000100 RSI: ffff8cf7b7d16c50 RDI:
> > > > ffffffffc1526068
> > > > [ 4043.437594] RBP: ffff8cf86c1604d0 R08: 0000000000000000 R09:
> > > > ffff8cf7401d8e10
> > > > [ 4043.437602] R10: ffffa10f4ae43ba0 R11: ffffa10f4ae43ba8 R12:
> > > > ffff8cf86c160000
> > > > [ 4043.437610] R13: ffffffffc1416278 R14: ffffffffc1416278 R15:
> > > > ffff8cf7f8d73850
> > > > [ 4043.437620] FS:  0000000000000000(0000)
> GS:ffff8d0697300000(0000)
> > > > knlGS:0000000000000000
> > > > [ 4043.437632] CS:  0010 DS: 0000 ES: 0000 CR0:
> 0000000080050033
> > > > [ 4043.437641] CR2: 00007f98d66dc000 CR3: 0000000131124000 CR4:
> > > > 0000000000f50ef0
> > > > [ 4043.437651] PKRU: 55555554
> > > > [ 4043.437658] Call Trace:
> > > > [ 4043.437670]  <TASK>
> > > > [ 4043.437680]  ? __die_body.cold+0x19/0x27
> > > > [ 4043.437700]  ? die_addr+0x3c/0x60
> > > > [ 4043.437716]  ? exc_general_protection+0x17d/0x400
> > > > [ 4043.437738]  ? asm_exc_general_protection+0x26/0x30
> > > > [ 4043.437760]  ? hci_unregister_dev+0x45/0x1f0 [bluetooth
> > > > 6dca047d1088401e195d97746b2b4936e5756d61]
> > > > [ 4043.437930]  ? hci_unregister_dev+0x3e/0x1f0 [bluetooth
> > > > 6dca047d1088401e195d97746b2b4936e5756d61]
> > > > [ 4043.438080]  btusb_disconnect+0x67/0x170 [btusb
> > > > 5bf8186d9cab4c5be1762247dadb6753a7c72a7f]
> > > > [ 4043.438108]  usb_unbind_interface+0x90/0x290
> > > > [ 4043.438130]  device_release_driver_internal+0x19c/0x200
> > > > [ 4043.438150]  bus_remove_device+0xc6/0x130
> > > > [ 4043.438166]  device_del+0x161/0x3e0
> > > > [ 4043.438182]  ? kobject_put+0xa0/0x1d0
> > > > [ 4043.438196]  usb_disable_device+0x104/0x220
> > > > [ 4043.438213]  usb_disconnect+0xe6/0x2e0
> > > > [ 4043.438231]  hub_event+0x7f9/0x19d0
> > > > [ 4043.438250]  ? __pm_runtime_suspend+0x47/0xc0
> > > > [ 4043.438269]  process_one_work+0x17b/0x330
> > > > [ 4043.438287]  worker_thread+0x2c6/0x3f0
> > > > [ 4043.438304]  ? __pfx_worker_thread+0x10/0x10
> > > > [ 4043.438318]  kthread+0xcf/0x100
> > > > [ 4043.438337]  ? __pfx_kthread+0x10/0x10
> > > > [ 4043.438354]  ret_from_fork+0x31/0x50
> > > > [ 4043.438367]  ? __pfx_kthread+0x10/0x10
> > > > [ 4043.438382]  ret_from_fork_asm+0x1a/0x30
> > > > [ 4043.438403]  </TASK>
> > > > [ 4043.438408] Modules linked in: uhid mt792x_usb mt7921_common
> > > > mt792x_lib mt76_connac_lib mt76_usb mt76 ccm option usb_wwan
> cmac
> > > > algif_hash algif_skcipher af_alg sr_mod cdrom bnep mousedev
> joydev
> > > > vfat fat snd_sof_pci_intel_tgl snd_sof_pci_intel_cnl
> intel_rapl_msr
> > > > snd_sof_intel_hda_generic intel_rapl_common soundwire_intel
> > > > intel_uncore_frequency soundwire_cadence
> > > > intel_uncore_frequency_common snd_sof_intel_hda_common
> > > > snd_sof_intel_hda_mlink snd_sof_intel_hda snd_sof_pci
> > > > snd_sof_xtensa_dsp snd_sof iwlmvm snd_sof_utils
> snd_soc_hdac_hda
> > > > snd_soc_acpi_intel_match soundwire_generic_allocation
> snd_soc_acpi
> > > > soundwire_bus snd_soc_avs r8152 x86_pkg_temp_thermal
> intel_powerclamp
> > > > libphy snd_soc_hda_codec coretemp mac80211 snd_hda_ext_core
> kvm_intel
> > > > snd_soc_core snd_hda_codec_hdmi cdc_ether hid_generic uas
> usbnet
> > > > snd_hda_codec_realtek snd_compress kvm usb_storage mii usbhid
> > > > snd_hda_codec_generic ac97_bus snd_pcm_dmaengine
> > > > snd_hda_scodec_component snd_hda_intel libarc4 snd_intel_dspcfg
> btusb
> > > > crct10dif_pclmul snd_intel_sdw_acpi
> > > > [ 4043.438617]  crc32_pclmul iwlwifi btrtl snd_hda_codec
> > > > polyval_clmulni btintel polyval_generic btbcm
> ghash_clmulni_intel
> > > > sha512_ssse3 btmtk tps6598x sha256_ssse3 snd_hda_core typec
> > > > sha1_ssse3 cfg80211 bluetooth aesni_intel snd_hwdep roles
> gf128mul
> > > > crypto_simd snd_pcm cryptd mei_hdcp mei_pxp rapl ee1004 ov13858
> > > > snd_timer intel_cstate igc spi_nor intel_uncore i2c_i801
> thunderbolt
> > > > snd v4l2_fwnode mei_me v4l2_async ptp wdat_wdt i2c_smbus mtd
> pcspkr
> > > > wmi_bmof intel_lpss_pci videodev mei pps_core soundcore
> > > > intel_pmc_core i2c_mux intel_lpss rfkill idma64 igen6_edac
> intel_vsec
> > > > serial_multi_instantiate mc pmt_telemetry pinctrl_tigerlake
> pmt_class
> > > > acpi_pad acpi_tad mac_hid i2c_dev dm_mod sg crypto_user loop
> > > > nfnetlink ip_tables x_tables ext4 crc32c_generic crc16 mbcache
> jbd2
> > > > xe drm_ttm_helper gpu_sched drm_suballoc_helper drm_gpuvm
> drm_exec
> > > > i915 i2c_algo_bit drm_buddy ttm nvme intel_gtt
> drm_display_helper
> > > > nvme_core spi_intel_pci cec xhci_pci crc32c_intel spi_intel
> nvme_auth
> > > > xhci_pci_renesas video wmi
> > > > [ 4043.438898] ---[ end trace 0000000000000000 ]---
> > > > [ 4043.438905] RIP: 0010:hci_unregister_dev+0x45/0x1f0
> [bluetooth]
> > > > [ 4043.439039] Code: 89 ef e8 ae d4 5c c1 f0 80 8b e9 0e 00 00
> 08 48
> > > > 89 ef e8 0e c2 5c c1 48 c7 c7 68 60 52 c1 e8 22 23 5d c1 48 8b
> 43 08
> > > > 48 8b 13 <48> 3b 18 0f 85 f5 c7 06 00 48 3b 5a 08 0f 85 eb c7
> 06 00
> > > > 48 89 42
> > > > [ 4043.439048] RSP: 0018:ffffa10f4ae43b98 EFLAGS: 00010246
> > > > [ 4043.439058] RAX: dead000000000122 RBX: ffff8cf86c160000 RCX:
> > > > 0000000000000000
> > > > [ 4043.439065] RDX: dead000000000100 RSI: ffff8cf7b7d16c50 RDI:
> > > > ffffffffc1526068
> > > > [ 4043.439072] RBP: ffff8cf86c1604d0 R08: 0000000000000000 R09:
> > > > ffff8cf7401d8e10
> > > > [ 4043.439078] R10: ffffa10f4ae43ba0 R11: ffffa10f4ae43ba8 R12:
> > > > ffff8cf86c160000
> > > > [ 4043.439085] R13: ffffffffc1416278 R14: ffffffffc1416278 R15:
> > > > ffff8cf7f8d73850
> > > > [ 4043.439091] FS:  0000000000000000(0000)
> GS:ffff8d0697300000(0000)
> > > > knlGS:0000000000000000
> > > > [ 4043.439100] CS:  0010 DS: 0000 ES: 0000 CR0:
> 0000000080050033
> > > > [ 4043.439108] CR2: 00007f98d66dc000 CR3: 0000000131124000 CR4:
> > > > 0000000000f50ef0
> > > > [ 4043.439116] PKRU: 55555554
> > > > [ 4043.439122] note: kworker/2:0[3698] exited with
> preempt_count 1
> > > >
> > > > So, in summary, it looks as though there are two issues here:
> > > >
> > > > 1. The latest firmware does not seem to work well with this
> chipset,
> > > >    perhaps it is crashing after loading?
> > > > 2. The Oops in the hci_unregister_dev function suggests some
> HCI
> > > >    registration bug.
> > > >
> > > > Let me know if I can provide any further assistance.
> > > >
> > > > Regards,
> > > >
> > > > Marc
> > > >
> >
> > *********** MEDIATEK Confidentiality Notice
> >  ***********
> > The information contained in this e-mail message (including any
> > attachments) may be confidential, proprietary, privileged, or
> > otherwise exempt from disclosure under applicable laws. It is
> > intended to be conveyed only to the designated recipient(s). Any
> > use, dissemination, distribution, printing, retaining or copying
> > of this e-mail (including its attachments) by unintended
> recipient(s)
> > is strictly prohibited and may be unlawful. If you are not an
> > intended recipient of this e-mail, or believe that you have
> received
> > this e-mail in error, please notify the sender immediately
> > (by replying to this e-mail), delete any and all copies of this
> > e-mail (including any attachments) from your system, and do not
> > disclose the content of this e-mail to any other person. Thank you!
> 
> 
> 
> -- 
> Luiz Augusto von Dentz

From patryk.wysocki at geniusthrive.pl  Thu Sep 19 00:36:00 2024
From: patryk.wysocki at geniusthrive.pl (Patryk Wysocki)
Date: Thu, 19 Sep 2024 07:36:00 GMT
Subject: Zapytanie ofertowe 
Message-ID: <20240919084500-0.1.9r.16cq5.0.st6rna0hau@geniusthrive.pl>

Dzie? dobry,

Pozwoli?em sobie na kontakt, poniewa? jestem zainteresowany weryfikacj? mo?liwo?ci nawi?zania wsp??pracy.

Wspieramy firmy w pozyskiwaniu nowych klient?w biznesowych.

Czy mo?emy porozmawia? w celu przedstawienia szczeg??owych informacji?


Pozdrawiam
Patryk Wysocki


From horms at kernel.org  Thu Sep 19 00:42:10 2024
From: horms at kernel.org (Simon Horman)
Date: Thu, 19 Sep 2024 08:42:10 +0100
Subject: [PATCH net] net: airoha: fix PSE memory configuration in
 airoha_fe_pse_ports_init()
In-Reply-To: <20240918-airoha-eth-pse-fix-v1-1-7b61f26cd2fd@kernel.org>
References: <20240918-airoha-eth-pse-fix-v1-1-7b61f26cd2fd@kernel.org>
Message-ID: <20240919074210.GE1044577@kernel.org>

On Wed, Sep 18, 2024 at 04:37:30PM +0200, Lorenzo Bianconi wrote:
> Align PSE memory configuration to vendor SDK. In particular, increase
> initial value of PSE reserved memory in airoha_fe_pse_ports_init()
> routine by the value used for the second Packet Processor Engine (PPE2)
> and do not overwrite the default value.
> Moreover, store the initial value for PSE reserved memory in orig_val
> before running airoha_fe_set_pse_queue_rsv_pages() in
> airoha_fe_set_pse_oq_rsv routine.

Hi Lorenzo,

This patch seems to be addressing two issues, perhaps it would be best
to split it into two patches?

And as a fix (or fixes) I think it would be best to describe the
problem, typically a user-visible bug, that is being addressed.

> Fixes: 23020f049327 ("net: airoha: Introduce ethernet support for EN7581 SoC")
> Tested-by: Sayantan Nandy <sayantan.nandy at airoha.com>
> Signed-off-by: Lorenzo Bianconi <lorenzo at kernel.org>

...


From chris.lu at mediatek.com  Thu Sep 19 00:49:22 2024
From: chris.lu at mediatek.com (Chris Lu)
Date: Thu, 19 Sep 2024 15:49:22 +0800
Subject: [PATCH v2 1/4] Bluetooth: btusb: mediatek: move Bluetooth power off command position
In-Reply-To: <20240919074925.22860-1-chris.lu@mediatek.com>
References: <20240919074925.22860-1-chris.lu@mediatek.com>
Message-ID: <20240919074925.22860-2-chris.lu@mediatek.com>

Move MediaTek Bluetooth power off command before releasing
usb ISO interface.

Signed-off-by: Chris Lu <chris.lu at mediatek.com>
---
 drivers/bluetooth/btusb.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
index 6c9c761d5b93..6cf1729a8225 100644
--- a/drivers/bluetooth/btusb.c
+++ b/drivers/bluetooth/btusb.c
@@ -2704,11 +2704,14 @@ static int btusb_mtk_shutdown(struct hci_dev *hdev)
 {
 	struct btusb_data *data = hci_get_drvdata(hdev);
 	struct btmtk_data *btmtk_data = hci_get_priv(hdev);
+	int ret;
+
+	ret = btmtk_usb_shutdown(hdev);
 
 	if (test_bit(BTMTK_ISOPKT_RUNNING, &btmtk_data->flags))
 		btusb_mtk_release_iso_intf(data);
 
-	return btmtk_usb_shutdown(hdev);
+	return ret;
 }
 
 #ifdef CONFIG_PM
-- 
2.18.0



From chris.lu at mediatek.com  Thu Sep 19 00:49:25 2024
From: chris.lu at mediatek.com (Chris Lu)
Date: Thu, 19 Sep 2024 15:49:25 +0800
Subject: [PATCH v2 4/4] Bluetooth: btusb: mediatek: change the conditions for ISO interface
In-Reply-To: <20240919074925.22860-1-chris.lu@mediatek.com>
References: <20240919074925.22860-1-chris.lu@mediatek.com>
Message-ID: <20240919074925.22860-5-chris.lu@mediatek.com>

Change conditions for Bluetooth driver claiming and releasing usb
ISO interface for MediaTek ISO data transmission.

Signed-off-by: Chris Lu <chris.lu at mediatek.com>
---
 drivers/bluetooth/btusb.c | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
index 37e67b451b34..bb28a9b2dc11 100644
--- a/drivers/bluetooth/btusb.c
+++ b/drivers/bluetooth/btusb.c
@@ -2618,7 +2618,7 @@ static int btusb_mtk_release_iso_intf(struct hci_dev *hdev)
 {
 	struct btmtk_data *btmtk_data = hci_get_priv(hdev);
 
-	if (btmtk_data->isopkt_intf) {
+	if (test_bit(BTMTK_ISOPKT_OVER_INTR, &btmtk_data->flags)) {
 		usb_kill_anchored_urbs(&btmtk_data->isopkt_anchor);
 		clear_bit(BTMTK_ISOPKT_RUNNING, &btmtk_data->flags);
 
@@ -2650,7 +2650,7 @@ static int btusb_mtk_reset(struct hci_dev *hdev, void *rst_data)
 	if (err < 0)
 		return err;
 
-	if (test_bit(BTMTK_ISOPKT_RUNNING, &btmtk_data->flags))
+	if (test_bit(BTMTK_ISOPKT_OVER_INTR, &btmtk_data->flags))
 		btusb_mtk_release_iso_intf(hdev);
 
 	btusb_stop_traffic(data);
@@ -2696,9 +2696,10 @@ static int btusb_mtk_setup(struct hci_dev *hdev)
 	btmtk_data->reset_sync = btusb_mtk_reset;
 
 	/* Claim ISO data interface and endpoint */
-	btmtk_data->isopkt_intf = usb_ifnum_to_if(data->udev, MTK_ISO_IFNUM);
-	if (btmtk_data->isopkt_intf)
+	if (!test_bit(BTMTK_ISOPKT_OVER_INTR, &btmtk_data->flags)) {
+		btmtk_data->isopkt_intf = usb_ifnum_to_if(data->udev, MTK_ISO_IFNUM);
 		btusb_mtk_claim_iso_intf(data);
+	}
 
 	return btmtk_usb_setup(hdev);
 }
@@ -2710,7 +2711,7 @@ static int btusb_mtk_shutdown(struct hci_dev *hdev)
 
 	ret = btmtk_usb_shutdown(hdev);
 
-	if (test_bit(BTMTK_ISOPKT_RUNNING, &btmtk_data->flags))
+	if (test_bit(BTMTK_ISOPKT_OVER_INTR, &btmtk_data->flags))
 		btusb_mtk_release_iso_intf(hdev);
 
 	return ret;
-- 
2.18.0



From chris.lu at mediatek.com  Thu Sep 19 00:49:24 2024
From: chris.lu at mediatek.com (Chris Lu)
Date: Thu, 19 Sep 2024 15:49:24 +0800
Subject: [PATCH v2 3/4] Bluetooth: btusb: mediatek: add intf release flow when usb disconnect
In-Reply-To: <20240919074925.22860-1-chris.lu@mediatek.com>
References: <20240919074925.22860-1-chris.lu@mediatek.com>
Message-ID: <20240919074925.22860-4-chris.lu@mediatek.com>

MediaTek claim an special usb intr interface for ISO data transmission.
The interface need to be released before unregistering hci device when
usb disconnect. Removing BT usb dongle without properly releasing the
interface may cause Kernel panic while unregister hci device.

Signed-off-by: Chris Lu <chris.lu at mediatek.com>
---
 drivers/bluetooth/btusb.c | 12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)

diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
index dfc42bdc8aaf..37e67b451b34 100644
--- a/drivers/bluetooth/btusb.c
+++ b/drivers/bluetooth/btusb.c
@@ -2614,9 +2614,9 @@ static void btusb_mtk_claim_iso_intf(struct btusb_data *data)
 	set_bit(BTMTK_ISOPKT_OVER_INTR, &btmtk_data->flags);
 }
 
-static void btusb_mtk_release_iso_intf(struct btusb_data *data)
+static int btusb_mtk_release_iso_intf(struct hci_dev *hdev)
 {
-	struct btmtk_data *btmtk_data = hci_get_priv(data->hdev);
+	struct btmtk_data *btmtk_data = hci_get_priv(hdev);
 
 	if (btmtk_data->isopkt_intf) {
 		usb_kill_anchored_urbs(&btmtk_data->isopkt_anchor);
@@ -2630,6 +2630,8 @@ static void btusb_mtk_release_iso_intf(struct btusb_data *data)
 	}
 
 	clear_bit(BTMTK_ISOPKT_OVER_INTR, &btmtk_data->flags);
+
+	return 0;
 }
 
 static int btusb_mtk_reset(struct hci_dev *hdev, void *rst_data)
@@ -2649,7 +2651,7 @@ static int btusb_mtk_reset(struct hci_dev *hdev, void *rst_data)
 		return err;
 
 	if (test_bit(BTMTK_ISOPKT_RUNNING, &btmtk_data->flags))
-		btusb_mtk_release_iso_intf(data);
+		btusb_mtk_release_iso_intf(hdev);
 
 	btusb_stop_traffic(data);
 	usb_kill_anchored_urbs(&data->tx_anchor);
@@ -2703,14 +2705,13 @@ static int btusb_mtk_setup(struct hci_dev *hdev)
 
 static int btusb_mtk_shutdown(struct hci_dev *hdev)
 {
-	struct btusb_data *data = hci_get_drvdata(hdev);
 	struct btmtk_data *btmtk_data = hci_get_priv(hdev);
 	int ret;
 
 	ret = btmtk_usb_shutdown(hdev);
 
 	if (test_bit(BTMTK_ISOPKT_RUNNING, &btmtk_data->flags))
-		btusb_mtk_release_iso_intf(data);
+		btusb_mtk_release_iso_intf(hdev);
 
 	return ret;
 }
@@ -3824,6 +3825,7 @@ static int btusb_probe(struct usb_interface *intf,
 		data->recv_acl = btmtk_usb_recv_acl;
 		data->suspend = btmtk_usb_suspend;
 		data->resume = btmtk_usb_resume;
+		data->disconnect = btusb_mtk_release_iso_intf;
 	}
 
 	if (id->driver_info & BTUSB_SWAVE) {
-- 
2.18.0



From chris.lu at mediatek.com  Thu Sep 19 00:49:21 2024
From: chris.lu at mediatek.com (Chris Lu)
Date: Thu, 19 Sep 2024 15:49:21 +0800
Subject: [PATCH v2 0/4] Bluetooth: btusb: Mediatek ISO interface claim/release adjustment
Message-ID: <20240919074925.22860-1-chris.lu@mediatek.com>

MediaTek performs some test on the platform which can support LE audio and
ISO data transmission with kernel driver. We found the additional interface
claim and release flow issue need some adjustment.

These patches mainly add a callback function within the usb_disconnect
function to prevent a kernel panic caused by interfaces not being released
when the BT USB dongle is physically removed. Additionally, the condition
for claiming/releasing ISO usb interface have also been adjusted to make
driver works as expected.

---
v2: fix commit message typo and over maximum chars per line warning.
---

Chris Lu (4):
  Bluetooth: btusb: mediatek: move Bluetooth power off command position
  Bluetooth: btusb: mediatek: add callback function in btusb_disconnect
  Bluetooth: btusb: mediatek: add intf release flow when usb disconnect
  Bluetooth: btusb: mediatek: change the conditions for ISO interface

 drivers/bluetooth/btusb.c | 32 +++++++++++++++++++++-----------
 1 file changed, 21 insertions(+), 11 deletions(-)

-- 
2.18.0



From chris.lu at mediatek.com  Thu Sep 19 00:49:23 2024
From: chris.lu at mediatek.com (Chris Lu)
Date: Thu, 19 Sep 2024 15:49:23 +0800
Subject: [PATCH v2 2/4] Bluetooth: btusb: mediatek: add callback function in btusb_disconnect
In-Reply-To: <20240919074925.22860-1-chris.lu@mediatek.com>
References: <20240919074925.22860-1-chris.lu@mediatek.com>
Message-ID: <20240919074925.22860-3-chris.lu@mediatek.com>

Add disconnect callback function in btusb_disconnect which is reserved
for vendor specific usage before deregister hci in btusb_disconnect.

Signed-off-by: Chris Lu <chris.lu at mediatek.com>
---
 drivers/bluetooth/btusb.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
index 6cf1729a8225..dfc42bdc8aaf 100644
--- a/drivers/bluetooth/btusb.c
+++ b/drivers/bluetooth/btusb.c
@@ -846,6 +846,7 @@ struct btusb_data {
 
 	int (*suspend)(struct hci_dev *hdev);
 	int (*resume)(struct hci_dev *hdev);
+	int (*disconnect)(struct hci_dev *hdev);
 
 	int oob_wake_irq;   /* irq for out-of-band wake-on-bt */
 	unsigned cmd_timeout_cnt;
@@ -4011,6 +4012,9 @@ static void btusb_disconnect(struct usb_interface *intf)
 	if (data->diag)
 		usb_set_intfdata(data->diag, NULL);
 
+	if (data->disconnect)
+		data->disconnect(hdev);
+
 	hci_unregister_dev(hdev);
 
 	if (intf == data->intf) {
-- 
2.18.0



From zhi.mao at mediatek.com  Thu Sep 19 01:10:22 2024
From: zhi.mao at mediatek.com (=?utf-8?B?WmhpIE1hbyAo5q+b5pm6KQ==?=)
Date: Thu, 19 Sep 2024 08:10:22 +0000
Subject: [PATCH] media: i2c: improve suspend/resume switch performance for
 GT9769 VCM driver
In-Reply-To: <20240831055328.22482-1-zhi.mao@mediatek.com>
References: <20240831055328.22482-1-zhi.mao@mediatek.com>
Message-ID: <40de250a3a516110119e451251bf7b5e9a76818d.camel@mediatek.com>

ping...

On Sat, 2024-08-31 at 13:52 +0800, Zhi Mao wrote:
> Chromebook camera AP can switch between video and photo mode,
> the behavior corresponding to VCM is suspend and resume,
> it will cause camera preview is not smooth during switching
> operation.
> We use autosuspend function can fix this issue.
> 
> Signed-off-by: Zhi Mao <zhi.mao at mediatek.com>
> ---
>  drivers/media/i2c/dw9768.c | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/media/i2c/dw9768.c b/drivers/media/i2c/dw9768.c
> index 18ef2b35c9aa..7449d29df901 100644
> --- a/drivers/media/i2c/dw9768.c
> +++ b/drivers/media/i2c/dw9768.c
> @@ -374,7 +374,7 @@ static int dw9768_open(struct v4l2_subdev *sd,
> struct v4l2_subdev_fh *fh)
>  
>  static int dw9768_close(struct v4l2_subdev *sd, struct
> v4l2_subdev_fh *fh)
>  {
> -	pm_runtime_put(sd->dev);
> +	pm_runtime_put_sync_autosuspend(sd->dev);
>  
>  	return 0;
>  }
> @@ -490,6 +490,7 @@ static int dw9768_probe(struct i2c_client
> *client)
>  		goto err_power_off;
>  	}
>  
> +	pm_runtime_use_autosuspend(dev);
>  	pm_runtime_idle(dev);
>  
>  	return 0;

From mingyen.hsieh at mediatek.com  Thu Sep 19 01:17:13 2024
From: mingyen.hsieh at mediatek.com (Mingyen Hsieh)
Date: Thu, 19 Sep 2024 16:17:13 +0800
Subject: [PATCH] wifi: mt76: mt792x: add P2P_DEVICE support
Message-ID: <20240919081713.23787-1-mingyen.hsieh@mediatek.com>

From: Hao Zhang <hao.zhang.mediatek at gmail.com>

Regist the NL80211_IFTYPE_P2P_DEVICE to support p2p device
for mt792x chips

Signed-off-by: Hao Zhang <hao.zhang.mediatek at gmail.com>
Signed-off-by: allan.wang <allan.wang at mediatek.com>
Signed-off-by: Ming Yen Hsieh <MingYen.Hsieh at mediatek.com>
---
 drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c | 3 +++
 drivers/net/wireless/mediatek/mt76/mt792x_core.c     | 9 +++++++--
 2 files changed, 10 insertions(+), 2 deletions(-)

diff --git a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c
index 864246f94088..77f3e92d581a 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c
+++ b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c
@@ -1202,6 +1202,9 @@ int mt76_connac_mcu_uni_add_dev(struct mt76_phy *phy,
 	case NL80211_IFTYPE_STATION:
 		basic_req.basic.conn_type = cpu_to_le32(CONNECTION_INFRA_STA);
 		break;
+	case NL80211_IFTYPE_P2P_DEVICE:
+		basic_req.basic.conn_type = cpu_to_le32(CONNECTION_P2P_GO);
+		break;
 	case NL80211_IFTYPE_ADHOC:
 		basic_req.basic.conn_type = cpu_to_le32(CONNECTION_IBSS_ADHOC);
 		break;
diff --git a/drivers/net/wireless/mediatek/mt76/mt792x_core.c b/drivers/net/wireless/mediatek/mt76/mt792x_core.c
index 78fe37c2e07b..042aa8d1b6e7 100644
--- a/drivers/net/wireless/mediatek/mt76/mt792x_core.c
+++ b/drivers/net/wireless/mediatek/mt76/mt792x_core.c
@@ -38,6 +38,10 @@ static const struct ieee80211_iface_limit if_limits_chanctx[] = {
 		.max = 1,
 		.types = BIT(NL80211_IFTYPE_AP) |
 			 BIT(NL80211_IFTYPE_P2P_GO)
+	},
+	{
+		.max = 1,
+		.types = BIT(NL80211_IFTYPE_P2P_DEVICE)
 	}
 };
 
@@ -45,7 +49,7 @@ static const struct ieee80211_iface_combination if_comb_chanctx[] = {
 	{
 		.limits = if_limits_chanctx,
 		.n_limits = ARRAY_SIZE(if_limits_chanctx),
-		.max_interfaces = 2,
+		.max_interfaces = 3,
 		.num_different_channels = 2,
 		.beacon_int_infra_match = false,
 	}
@@ -614,7 +618,8 @@ int mt792x_init_wiphy(struct ieee80211_hw *hw)
 	wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
 				 BIT(NL80211_IFTYPE_AP) |
 				 BIT(NL80211_IFTYPE_P2P_CLIENT) |
-				 BIT(NL80211_IFTYPE_P2P_GO);
+				 BIT(NL80211_IFTYPE_P2P_GO) |
+				 BIT(NL80211_IFTYPE_P2P_DEVICE);
 	wiphy->max_remain_on_channel_duration = 5000;
 	wiphy->max_scan_ie_len = MT76_CONNAC_SCAN_IE_LEN;
 	wiphy->max_scan_ssids = 4;
-- 
2.45.2



From treapking at chromium.org  Thu Sep 19 02:41:49 2024
From: treapking at chromium.org (Pin-yen Lin)
Date: Thu, 19 Sep 2024 17:41:49 +0800
Subject: [PATCH v3] arm64: dts: mediatek: mt8183-pumpkin: add HDMI support
Message-ID: <20240919094212.1902073-1-treapking@chromium.org>

From: Fabien Parent <fparent at baylibre.com>

The MT8183 Pumpkin board has a micro-HDMI connector. HDMI support is
provided by an IT66121 DPI <-> HDMI bridge.

Enable the DPI and add the node for the IT66121 bridge.

Signed-off-by: Fabien Parent <fparent at baylibre.com>
Co-developed-by: Pin-yen Lin <treapking at chromium.org>
Signed-off-by: Pin-yen Lin <treapking at chromium.org>
Reviewed-by: N?colas F. R. A. Prado <nfraprado at collabora.com>

---

Changes in v3:
- Update commit message and fix formatting issues
- Fix the label name of vcn33 regulator

 .../boot/dts/mediatek/mt8183-pumpkin.dts      | 123 ++++++++++++++++++
 1 file changed, 123 insertions(+)

diff --git a/arch/arm64/boot/dts/mediatek/mt8183-pumpkin.dts b/arch/arm64/boot/dts/mediatek/mt8183-pumpkin.dts
index 1aa668c3ccf9..61a6f66914b8 100644
--- a/arch/arm64/boot/dts/mediatek/mt8183-pumpkin.dts
+++ b/arch/arm64/boot/dts/mediatek/mt8183-pumpkin.dts
@@ -63,6 +63,18 @@ thermistor {
 		pulldown-ohm = <0>;
 		io-channels = <&auxadc 0>;
 	};
+
+	connector {
+		compatible = "hdmi-connector";
+		label = "hdmi";
+		type = "d";
+
+		port {
+			hdmi_connector_in: endpoint {
+				remote-endpoint = <&hdmi_connector_out>;
+			};
+		};
+	};
 };
 
 &auxadc {
@@ -120,6 +132,43 @@ &i2c6 {
 	pinctrl-0 = <&i2c6_pins>;
 	status = "okay";
 	clock-frequency = <100000>;
+	#address-cells = <1>;
+	#size-cells = <0>;
+
+	it66121hdmitx: hdmitx at 4c {
+		compatible = "ite,it66121";
+		reg = <0x4c>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&ite_pins>;
+		reset-gpios = <&pio 160 GPIO_ACTIVE_LOW>;
+		interrupt-parent = <&pio>;
+		interrupts = <4 IRQ_TYPE_LEVEL_LOW>;
+		vcn33-supply = <&mt6358_vcn33_reg>;
+		vcn18-supply = <&mt6358_vcn18_reg>;
+		vrf12-supply = <&mt6358_vrf12_reg>;
+
+		ports {
+			#address-cells = <1>;
+			#size-cells = <0>;
+
+			port at 0 {
+				reg = <0>;
+
+				it66121_in: endpoint {
+					bus-width = <12>;
+					remote-endpoint = <&dpi_out>;
+				};
+			};
+
+			port at 1 {
+				reg = <1>;
+
+				hdmi_connector_out: endpoint {
+					remote-endpoint = <&hdmi_connector_in>;
+				};
+			};
+		};
+	};
 };
 
 &keyboard {
@@ -362,6 +411,67 @@ pins_clk {
 			input-enable;
 		};
 	};
+
+	ite_pins: ite-pins {
+		pins-irq {
+			pinmux = <PINMUX_GPIO4__FUNC_GPIO4>;
+			input-enable;
+			bias-pull-up;
+		};
+
+		pins-rst {
+			pinmux = <PINMUX_GPIO160__FUNC_GPIO160>;
+			output-high;
+		};
+	};
+
+	dpi_func_pins: dpi-func-pins {
+		pins-dpi {
+			pinmux = <PINMUX_GPIO12__FUNC_I2S5_BCK>,
+				 <PINMUX_GPIO46__FUNC_I2S5_LRCK>,
+				 <PINMUX_GPIO47__FUNC_I2S5_DO>,
+				 <PINMUX_GPIO13__FUNC_DBPI_D0>,
+				 <PINMUX_GPIO14__FUNC_DBPI_D1>,
+				 <PINMUX_GPIO15__FUNC_DBPI_D2>,
+				 <PINMUX_GPIO16__FUNC_DBPI_D3>,
+				 <PINMUX_GPIO17__FUNC_DBPI_D4>,
+				 <PINMUX_GPIO18__FUNC_DBPI_D5>,
+				 <PINMUX_GPIO19__FUNC_DBPI_D6>,
+				 <PINMUX_GPIO20__FUNC_DBPI_D7>,
+				 <PINMUX_GPIO21__FUNC_DBPI_D8>,
+				 <PINMUX_GPIO22__FUNC_DBPI_D9>,
+				 <PINMUX_GPIO23__FUNC_DBPI_D10>,
+				 <PINMUX_GPIO24__FUNC_DBPI_D11>,
+				 <PINMUX_GPIO25__FUNC_DBPI_HSYNC>,
+				 <PINMUX_GPIO26__FUNC_DBPI_VSYNC>,
+				 <PINMUX_GPIO27__FUNC_DBPI_DE>,
+				 <PINMUX_GPIO28__FUNC_DBPI_CK>;
+		};
+	};
+
+	dpi_idle_pins: dpi-idle-pins {
+		pins-idle {
+			pinmux = <PINMUX_GPIO12__FUNC_GPIO12>,
+				 <PINMUX_GPIO46__FUNC_GPIO46>,
+				 <PINMUX_GPIO47__FUNC_GPIO47>,
+				 <PINMUX_GPIO13__FUNC_GPIO13>,
+				 <PINMUX_GPIO14__FUNC_GPIO14>,
+				 <PINMUX_GPIO15__FUNC_GPIO15>,
+				 <PINMUX_GPIO16__FUNC_GPIO16>,
+				 <PINMUX_GPIO17__FUNC_GPIO17>,
+				 <PINMUX_GPIO18__FUNC_GPIO18>,
+				 <PINMUX_GPIO19__FUNC_GPIO19>,
+				 <PINMUX_GPIO20__FUNC_GPIO20>,
+				 <PINMUX_GPIO21__FUNC_GPIO21>,
+				 <PINMUX_GPIO22__FUNC_GPIO22>,
+				 <PINMUX_GPIO23__FUNC_GPIO23>,
+				 <PINMUX_GPIO24__FUNC_GPIO24>,
+				 <PINMUX_GPIO25__FUNC_GPIO25>,
+				 <PINMUX_GPIO26__FUNC_GPIO26>,
+				 <PINMUX_GPIO27__FUNC_GPIO27>,
+				 <PINMUX_GPIO28__FUNC_GPIO28>;
+		};
+	};
 };
 
 &pmic {
@@ -415,3 +525,16 @@ &scp {
 &dsi0 {
 	status = "disabled";
 };
+
+&dpi0 {
+	pinctrl-names = "default", "sleep";
+	pinctrl-0 = <&dpi_func_pins>;
+	pinctrl-1 = <&dpi_idle_pins>;
+	status = "okay";
+
+	port {
+		dpi_out: endpoint {
+			remote-endpoint = <&it66121_in>;
+		};
+	};
+};
-- 
2.46.0.662.g92d0881bb0-goog



From hawk at kernel.org  Thu Sep 19 02:42:40 2024
From: hawk at kernel.org (Jesper Dangaard Brouer)
Date: Thu, 19 Sep 2024 11:42:40 +0200
Subject: [PATCH net 2/2] page_pool: fix IOMMU crash when driver has
 already unbound
In-Reply-To: <CAC_iWjK=G7Oo5=pN2QunhasgDC6NyC1L+96jigX7u9ad+PbYng@mail.gmail.com>
References: <20240918111826.863596-1-linyunsheng@huawei.com>
 <20240918111826.863596-3-linyunsheng@huawei.com>
 <CAC_iWjK=G7Oo5=pN2QunhasgDC6NyC1L+96jigX7u9ad+PbYng@mail.gmail.com>
Message-ID: <894a3c2c-22f9-45b9-a82b-de7320066b42@kernel.org>


On 18/09/2024 19.06, Ilias Apalodimas wrote:
>> In order not to do the dma unmmapping after driver has already
>> unbound and stall the unloading of the networking driver, add
>> the pool->items array to record all the pages including the ones
>> which are handed over to network stack, so the page_pool can
>> do the dma unmmapping for those pages when page_pool_destroy()
>> is called.
>
> So, I was thinking of a very similar idea. But what do you mean by
> "all"? The pages that are still in caches (slow or fast) of the pool
> will be unmapped during page_pool_destroy().

I really dislike this idea of having to keep track of all outstanding pages.

I liked Jakub's idea of keeping the netdev around for longer.

This is all related to destroying the struct device that have points to
the DMA engine, right?

Why don't we add an API that allow netdev to "give" struct device to
page_pool.  And then the page_poll will take over when we can safely
free the stuct device?

--Jesper


From linyunsheng at huawei.com  Thu Sep 19 03:54:26 2024
From: linyunsheng at huawei.com (Yunsheng Lin)
Date: Thu, 19 Sep 2024 18:54:26 +0800
Subject: [PATCH net 2/2] page_pool: fix IOMMU crash when driver has
 already unbound
In-Reply-To: <CAC_iWjK=G7Oo5=pN2QunhasgDC6NyC1L+96jigX7u9ad+PbYng@mail.gmail.com>
References: <20240918111826.863596-1-linyunsheng@huawei.com>
 <20240918111826.863596-3-linyunsheng@huawei.com>
 <CAC_iWjK=G7Oo5=pN2QunhasgDC6NyC1L+96jigX7u9ad+PbYng@mail.gmail.com>
Message-ID: <50a463d5-a5a1-422f-a4f7-d3587b12c265@huawei.com>

On 2024/9/19 1:06, Ilias Apalodimas wrote:
> Hi Yunsheng,
> 
> Thanks for looking into this!
> 
> On Wed, 18 Sept 2024 at 14:24, Yunsheng Lin <linyunsheng at huawei.com> wrote:
>>
>> Networking driver with page_pool support may hand over page
>> still with dma mapping to network stack and try to reuse that
>> page after network stack is done with it and passes it back
>> to page_pool to avoid the penalty of dma mapping/unmapping.
> 
> I think you can shorten this to "If recycling and DMA mapping are
> enabled during the pool creation"

I am not sure if I understand the 'recycling' part here. Is the
'recycling' part referring to whether skb_mark_for_recycle() is
called to enable recycling for the skb? Is there still any driver
with page_pool support but doesn't call skb_mark_for_recycle()
when handing over page to network stack?

For the 'DMA mapping' part, as there is no space in 'struct
page' to track the inflight pages, so 'pp' in 'struct page'
is renamed to 'pp_item' to enable the tracking of inflight
page. I tried shortening this for 'pool->dma_map being false'
when coding, but it seems differentiating the same field in
'struct page' doesn't make much sense according to 'pool->dma_map'
as it means we might need to add an union in 'struct page' for
that to work and add additional checking to decide if it is 'pp'
or 'pp_item'.

> 
>> With all the caching in the network stack, some pages may be
>> held in the network stack without returning to the page_pool
>> soon enough, and with VF disable causing the driver unbound,
>> the page_pool does not stop the driver from doing it's
>> unbounding work, instead page_pool uses workqueue to check
>> if there is some pages coming back from the network stack
>> periodically, if there is any, it will do the dma unmmapping
>> related cleanup work.
>>
>> As mentioned in [1], attempting DMA unmaps after the driver
>> has already unbound may leak resources or at worst corrupt
>> memory. Fundamentally, the page pool code cannot allow DMA
>> mappings to outlive the driver they belong to.
>>
>> Currently it seems there are at least two cases that the page
>> is not released fast enough causing dma unmmapping done after
>> driver has already unbound:
>> 1. ipv4 packet defragmentation timeout: this seems to cause
>>    delay up to 30 secs:
>>
>> 2. skb_defer_free_flush(): this may cause infinite delay if
>>    there is no triggering for net_rx_action().
>>
>> In order not to do the dma unmmapping after driver has already
>> unbound and stall the unloading of the networking driver, add
>> the pool->items array to record all the pages including the ones
>> which are handed over to network stack, so the page_pool can
>> do the dma unmmapping for those pages when page_pool_destroy()
>> is called.
> 
> So, I was thinking of a very similar idea. But what do you mean by
> "all"? The pages that are still in caches (slow or fast) of the pool
> will be unmapped during page_pool_destroy().

Yes, it includes the one in pool->alloc and pool->ring.

> Don't we 'just' need a list of the inflight packets and their pages or
> fragments? What we could do is go through that list and unmap these
> pages during page_pool_destroy().

The main reason for that is to avoid the overhead of page_pool_item_del()
and page_pool_item_add() when allocing/freeing page from/to pool->alloc
and pool->ring.

Yes, including the pages in pool->ring seems to make the pool->ring
somewhat duplicated, maybe we can remove pool->ring if we can make
and prove 'pool->items' is performing better than pool->ring in the
future?

> 
> I'll have a closer look at the patch tomorrow

Thanks for the reviewing.

> 
> Thanks!
> /Ilias
> 


From linyunsheng at huawei.com  Thu Sep 19 04:15:11 2024
From: linyunsheng at huawei.com (Yunsheng Lin)
Date: Thu, 19 Sep 2024 19:15:11 +0800
Subject: [PATCH net 2/2] page_pool: fix IOMMU crash when driver has
 already unbound
In-Reply-To: <894a3c2c-22f9-45b9-a82b-de7320066b42@kernel.org>
References: <20240918111826.863596-1-linyunsheng@huawei.com>
 <20240918111826.863596-3-linyunsheng@huawei.com>
 <CAC_iWjK=G7Oo5=pN2QunhasgDC6NyC1L+96jigX7u9ad+PbYng@mail.gmail.com>
 <894a3c2c-22f9-45b9-a82b-de7320066b42@kernel.org>
Message-ID: <cdfecd37-31d7-42d2-a8d8-92008285b42e@huawei.com>

On 2024/9/19 17:42, Jesper Dangaard Brouer wrote:
> 
> On 18/09/2024 19.06, Ilias Apalodimas wrote:
>>> In order not to do the dma unmmapping after driver has already
>>> unbound and stall the unloading of the networking driver, add
>>> the pool->items array to record all the pages including the ones
>>> which are handed over to network stack, so the page_pool can
>>> do the dma unmmapping for those pages when page_pool_destroy()
>>> is called.
>>
>> So, I was thinking of a very similar idea. But what do you mean by
>> "all"? The pages that are still in caches (slow or fast) of the pool
>> will be unmapped during page_pool_destroy().
> 
> I really dislike this idea of having to keep track of all outstanding pages.
> 
> I liked Jakub's idea of keeping the netdev around for longer.
> 
> This is all related to destroying the struct device that have points to
> the DMA engine, right?

Yes, the problem seems to be that when device_del() is called, there is
no guarantee hw behind the 'struct device ' will be usable even if we
call get_device() on it.

> 
> Why don't we add an API that allow netdev to "give" struct device to
> page_pool.? And then the page_poll will take over when we can safely
> free the stuct device?

By 'allow netdev to "give" struct device to page_pool', does it mean
page_pool become the driver for the device?
If yes, it seems that is similar to jakub's idea, as both seems to stall
the calling of device_del() by not returning when the driver unloading.
If no, it seems that the problem is still existed when the driver for
the device has unbound after device_del() is called.

> 
> --Jesper


From rohiagar at chromium.org  Thu Sep 19 04:21:50 2024
From: rohiagar at chromium.org (Rohit Agarwal)
Date: Thu, 19 Sep 2024 11:21:50 +0000
Subject: [PATCH v2 0/2] Add power domain bindings for MT8183 and MT8195
Message-ID: <20240919112152.2829765-1-rohiagar@chromium.org>

Hi,

Changes in v2:
 - Added a Fixes tag in the patch 2/2
 - Also added the missing compatible string of MT8183
 - Link to v1: https://lore.kernel.org/all/20240911071722.558960-1-rohiagar at chromium.org/

Some of the compatible strings were missed to document in the dpi
controller bindings. This series adds those missing compatible strings
of MT8183 and MT8195 DP_INTF.

Thanks,
Rohit.

Rohit Agarwal (2):
  dt-bindings: display: mediatek: dpi: Add power domain for MT8183
  dt-bindings: display: mediatek: dpi: Add power domain for MT8195
    DP_INTF

 .../devicetree/bindings/display/mediatek/mediatek,dpi.yaml      | 2 ++
 1 file changed, 2 insertions(+)

-- 


From rohiagar at chromium.org  Thu Sep 19 04:21:51 2024
From: rohiagar at chromium.org (Rohit Agarwal)
Date: Thu, 19 Sep 2024 11:21:51 +0000
Subject: [PATCH v2 1/2] dt-bindings: display: mediatek: dpi: Add power domain for MT8183
In-Reply-To: <20240919112152.2829765-1-rohiagar@chromium.org>
References: <20240919112152.2829765-1-rohiagar@chromium.org>
Message-ID: <20240919112152.2829765-2-rohiagar@chromium.org>

Add power domain binding to the mediatek DPI controller
for MT8183 that already had the property in DT.

Signed-off-by: Rohit Agarwal <rohiagar at chromium.org>
---
 .../devicetree/bindings/display/mediatek/mediatek,dpi.yaml       | 1 +
 1 file changed, 1 insertion(+)

diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml b/Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml
index 3a82aec9021c..1e748ee23fc7 100644
--- a/Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml
+++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml
@@ -88,6 +88,7 @@ allOf:
               enum:
                 - mediatek,mt6795-dpi
                 - mediatek,mt8173-dpi
+                - mediatek,mt8183-dpi
                 - mediatek,mt8186-dpi
     then:
       properties:
-- 



From rohiagar at chromium.org  Thu Sep 19 04:21:52 2024
From: rohiagar at chromium.org (Rohit Agarwal)
Date: Thu, 19 Sep 2024 11:21:52 +0000
Subject: [PATCH v2 2/2] dt-bindings: display: mediatek: dpi: Add power domain for MT8195 DP_INTF
In-Reply-To: <20240919112152.2829765-1-rohiagar@chromium.org>
References: <20240919112152.2829765-1-rohiagar@chromium.org>
Message-ID: <20240919112152.2829765-3-rohiagar@chromium.org>

Add power domain binding for MT8195 DP_INTF that resolves the following
error and many more similar ones:

arch/arm64/boot/dts/mediatek/mt8195-cherry-dojo-r1.dtb: dp-intf at 1c113000:
power-domains: False schema does not allow [[55, 18]]

Reported-by: kernel test robot <lkp at intel.com>
Closes: https://lore.kernel.org/oe-kbuild-all/202409102119.AYvaTjUi-lkp at intel.com/
Fixes: 5474d49b2f79 ("dt-bindings: display: mediatek: dpi: Add power domains")
Signed-off-by: Rohit Agarwal <rohiagar at chromium.org>
---
 .../devicetree/bindings/display/mediatek/mediatek,dpi.yaml       | 1 +
 1 file changed, 1 insertion(+)

diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml b/Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml
index 1e748ee23fc7..201f1696854f 100644
--- a/Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml
+++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml
@@ -90,6 +90,7 @@ allOf:
                 - mediatek,mt8173-dpi
                 - mediatek,mt8183-dpi
                 - mediatek,mt8186-dpi
+                - mediatek,mt8195-dp-intf
     then:
       properties:
         power-domains: false
-- 



From qun-wei.lin at mediatek.com  Thu Sep 19 04:29:51 2024
From: qun-wei.lin at mediatek.com (Qun-Wei Lin)
Date: Thu, 19 Sep 2024 19:29:51 +0800
Subject: [PATCH 1/2] block: add BLK_FEAT_READ_SYNCHRONOUS feature for synchronous read
In-Reply-To: <20240919112952.981-1-qun-wei.lin@mediatek.com>
References: <20240919112952.981-1-qun-wei.lin@mediatek.com>
Message-ID: <20240919112952.981-2-qun-wei.lin@mediatek.com>

This commit introduces a new feature flag, BLK_FEAT_READ_SYNCHRONOUS,
which ensures that read operations always complete in the submit context.
This is useful for scenarios where synchronous read operations are required
while allowing write operations to remain asynchronous.

This patch is preparation for optimizing of the operation of the swap
device with next patch.

Signed-off-by: Qun-Wei Lin <qun-wei.lin at mediatek.com>
---
 include/linux/blkdev.h | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h
index 643c9020a35a..a697db11d91c 100644
--- a/include/linux/blkdev.h
+++ b/include/linux/blkdev.h
@@ -332,6 +332,9 @@ typedef unsigned int __bitwise blk_features_t;
 #define BLK_FEAT_RAID_PARTIAL_STRIPES_EXPENSIVE \
 	((__force blk_features_t)(1u << 15))
 
+/* read operations always completes in submit context */
+#define BLK_FEAT_READ_SYNCHRONOUS	((__force blk_features_t)(1u << 16))
+
 /*
  * Flags automatically inherited when stacking limits.
  */
@@ -1310,6 +1313,11 @@ static inline bool bdev_synchronous(struct block_device *bdev)
 	return bdev->bd_disk->queue->limits.features & BLK_FEAT_SYNCHRONOUS;
 }
 
+static inline bool bdev_read_synchronous(struct block_device *bdev)
+{
+	return bdev->bd_disk->queue->limits.features & BLK_FEAT_READ_SYNCHRONOUS;
+}
+
 static inline bool bdev_stable_writes(struct block_device *bdev)
 {
 	struct request_queue *q = bdev_get_queue(bdev);
-- 
2.45.2



From qun-wei.lin at mediatek.com  Thu Sep 19 04:29:50 2024
From: qun-wei.lin at mediatek.com (Qun-Wei Lin)
Date: Thu, 19 Sep 2024 19:29:50 +0800
Subject: [PATCH 0/2] Add BLK_FEAT_READ_SYNCHRONOUS and SWP_READ_SYNCHRONOUS_IO
Message-ID: <20240919112952.981-1-qun-wei.lin@mediatek.com>

This patchset introduces 2 new feature flags, BLK_FEAT_READ_SYNCHRONOUS and
SWP_READ_SYNCHRONOUS_IO.

These changes are motivated by the need to better accommodate certain swap
devices that support synchronous read operations but asynchronous write
operations.

The existing BLK_FEAT_SYNCHRONOUS and SWP_SYNCHRONOUS_IO flags are not
sufficient for these devices, as they enforce synchronous behavior for both
read and write operations.

Patch 1:
- introduce BLK_FEAT_READ_SYNCHRONOUS

Patch 2:
- introduce SWP_READ_SYNCHRONOUS_IO

Qun-Wei Lin (2):
  block: add BLK_FEAT_READ_SYNCHRONOUS feature for synchronous read
  mm, swap: introduce SWP_READ_SYNCHRONOUS_IO

 include/linux/blkdev.h |  8 ++++++++
 include/linux/swap.h   | 31 ++++++++++++++++---------------
 mm/memory.c            |  3 ++-
 mm/page_io.c           |  2 +-
 mm/swapfile.c          |  3 +++
 5 files changed, 30 insertions(+), 17 deletions(-)

-- 
2.45.2



From qun-wei.lin at mediatek.com  Thu Sep 19 04:29:52 2024
From: qun-wei.lin at mediatek.com (Qun-Wei Lin)
Date: Thu, 19 Sep 2024 19:29:52 +0800
Subject: [PATCH 2/2] mm, swap: introduce SWP_READ_SYNCHRONOUS_IO
In-Reply-To: <20240919112952.981-1-qun-wei.lin@mediatek.com>
References: <20240919112952.981-1-qun-wei.lin@mediatek.com>
Message-ID: <20240919112952.981-3-qun-wei.lin@mediatek.com>

The existing SWP_SYNCHRONOUS_IO flag is not enough for certain swap
devices that support synchronous read operations but asynchronous write
operations, so we need to introduce a new flag SWP_READ_SYNCHRONOUS_IO.

Signed-off-by: Qun-Wei Lin <qun-wei.lin at mediatek.com>
---
 include/linux/swap.h | 31 ++++++++++++++++---------------
 mm/memory.c          |  3 ++-
 mm/page_io.c         |  2 +-
 mm/swapfile.c        |  3 +++
 4 files changed, 22 insertions(+), 17 deletions(-)

diff --git a/include/linux/swap.h b/include/linux/swap.h
index ba7ea95d1c57..f595050f431b 100644
--- a/include/linux/swap.h
+++ b/include/linux/swap.h
@@ -205,21 +205,22 @@ struct swap_extent {
 	  offsetof(union swap_header, info.badpages)) / sizeof(int))
 
 enum {
-	SWP_USED	= (1 << 0),	/* is slot in swap_info[] used? */
-	SWP_WRITEOK	= (1 << 1),	/* ok to write to this swap?	*/
-	SWP_DISCARDABLE = (1 << 2),	/* blkdev support discard */
-	SWP_DISCARDING	= (1 << 3),	/* now discarding a free cluster */
-	SWP_SOLIDSTATE	= (1 << 4),	/* blkdev seeks are cheap */
-	SWP_CONTINUED	= (1 << 5),	/* swap_map has count continuation */
-	SWP_BLKDEV	= (1 << 6),	/* its a block device */
-	SWP_ACTIVATED	= (1 << 7),	/* set after swap_activate success */
-	SWP_FS_OPS	= (1 << 8),	/* swapfile operations go through fs */
-	SWP_AREA_DISCARD = (1 << 9),	/* single-time swap area discards */
-	SWP_PAGE_DISCARD = (1 << 10),	/* freed swap page-cluster discards */
-	SWP_STABLE_WRITES = (1 << 11),	/* no overwrite PG_writeback pages */
-	SWP_SYNCHRONOUS_IO = (1 << 12),	/* synchronous IO is efficient */
-					/* add others here before... */
-	SWP_SCANNING	= (1 << 14),	/* refcount in scan_swap_map */
+	SWP_USED	= (1 << 0),		/* is slot in swap_info[] used? */
+	SWP_WRITEOK	= (1 << 1),		/* ok to write to this swap?	*/
+	SWP_DISCARDABLE = (1 << 2),		/* blkdev support discard */
+	SWP_DISCARDING	= (1 << 3),		/* now discarding a free cluster */
+	SWP_SOLIDSTATE	= (1 << 4),		/* blkdev seeks are cheap */
+	SWP_CONTINUED	= (1 << 5),		/* swap_map has count continuation */
+	SWP_BLKDEV	= (1 << 6),		/* its a block device */
+	SWP_ACTIVATED	= (1 << 7),		/* set after swap_activate success */
+	SWP_FS_OPS	= (1 << 8),		/* swapfile operations go through fs */
+	SWP_AREA_DISCARD = (1 << 9),		/* single-time swap area discards */
+	SWP_PAGE_DISCARD = (1 << 10),		/* freed swap page-cluster discards */
+	SWP_STABLE_WRITES = (1 << 11),		/* no overwrite PG_writeback pages */
+	SWP_SYNCHRONOUS_IO = (1 << 12),		/* synchronous IO is efficient */
+	SWP_READ_SYNCHRONOUS_IO = (1 << 13),	/* synchronous IO is efficient */
+						/* add others here before... */
+	SWP_SCANNING	= (1 << 14),		/* refcount in scan_swap_map */
 };
 
 #define SWAP_CLUSTER_MAX 32UL
diff --git a/mm/memory.c b/mm/memory.c
index ebfc9768f801..f531a6bfea5b 100644
--- a/mm/memory.c
+++ b/mm/memory.c
@@ -4089,7 +4089,8 @@ vm_fault_t do_swap_page(struct vm_fault *vmf)
 	swapcache = folio;
 
 	if (!folio) {
-		if (data_race(si->flags & SWP_SYNCHRONOUS_IO) &&
+		if ((data_race(si->flags & (SWP_SYNCHRONOUS_IO |
+		    SWP_READ_SYNCHRONOUS_IO))) &&
 		    __swap_count(entry) == 1) {
 			/*
 			 * Prevent parallel swapin from proceeding with
diff --git a/mm/page_io.c b/mm/page_io.c
index ff8c99ee3af7..98a00709e98c 100644
--- a/mm/page_io.c
+++ b/mm/page_io.c
@@ -499,7 +499,7 @@ static void swap_read_folio_bdev_async(struct folio *folio,
 void swap_read_folio(struct folio *folio, struct swap_iocb **plug)
 {
 	struct swap_info_struct *sis = swp_swap_info(folio->swap);
-	bool synchronous = sis->flags & SWP_SYNCHRONOUS_IO;
+	bool synchronous = sis->flags & (SWP_SYNCHRONOUS_IO | SWP_READ_SYNCHRONOUS_IO);
 	bool workingset = folio_test_workingset(folio);
 	unsigned long pflags;
 	bool in_thrashing;
diff --git a/mm/swapfile.c b/mm/swapfile.c
index 38bdc439651a..7b8feb235aab 100644
--- a/mm/swapfile.c
+++ b/mm/swapfile.c
@@ -3177,6 +3177,9 @@ SYSCALL_DEFINE2(swapon, const char __user *, specialfile, int, swap_flags)
 	if (p->bdev && bdev_synchronous(p->bdev))
 		p->flags |= SWP_SYNCHRONOUS_IO;
 
+	if (p->bdev && bdev_read_synchronous(p->bdev))
+		p->flags |= SWP_READ_SYNCHRONOUS_IO;
+
 	if (p->bdev && bdev_nonrot(p->bdev)) {
 		int cpu, i;
 		unsigned long ci, nr_cluster;
-- 
2.45.2



From hch at infradead.org  Thu Sep 19 04:37:29 2024
From: hch at infradead.org (Christoph Hellwig)
Date: Thu, 19 Sep 2024 04:37:29 -0700
Subject: [PATCH 0/2] Add BLK_FEAT_READ_SYNCHRONOUS and
 SWP_READ_SYNCHRONOUS_IO
In-Reply-To: <20240919112952.981-1-qun-wei.lin@mediatek.com>
References: <20240919112952.981-1-qun-wei.lin@mediatek.com>
Message-ID: <ZuwM-aEEo7DE-qXw@infradead.org>

Well, you're not actually setting your new flags anywhere, which -
as you might know - is an reson for an insta-NAK.



From angelogioacchino.delregno at collabora.com  Thu Sep 19 05:02:08 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Thu, 19 Sep 2024 14:02:08 +0200
Subject: [PATCH] firmware: mtk-adsp-ipc: Switch to using dev_err_probe()
Message-ID: <20240919120208.152987-1-angelogioacchino.delregno@collabora.com>

There is an error path that checks whether the return value is
-EPROBE_DEFER to decide whether to print the error message: that
is exactly open-coding dev_err_probe(), so, switch to that.

Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
---
 drivers/firmware/mtk-adsp-ipc.c | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

diff --git a/drivers/firmware/mtk-adsp-ipc.c b/drivers/firmware/mtk-adsp-ipc.c
index a762302978de..fdb083f42ebf 100644
--- a/drivers/firmware/mtk-adsp-ipc.c
+++ b/drivers/firmware/mtk-adsp-ipc.c
@@ -95,10 +95,9 @@ static int mtk_adsp_ipc_probe(struct platform_device *pdev)
 		adsp_chan->idx = i;
 		adsp_chan->ch = mbox_request_channel_byname(cl, adsp_mbox_ch_names[i]);
 		if (IS_ERR(adsp_chan->ch)) {
-			ret = PTR_ERR(adsp_chan->ch);
-			if (ret != -EPROBE_DEFER)
-				dev_err(dev, "Failed to request mbox chan %s ret %d\n",
-					adsp_mbox_ch_names[i], ret);
+			ret = dev_err_probe(dev, PTR_ERR(adsp_chan->ch),
+					    "Failed to request mbox channel %s\n",
+					    adsp_mbox_ch_names[i]);
 
 			for (j = 0; j < i; j++) {
 				adsp_chan = &adsp_ipc->chans[j];
-- 
2.46.0



From peter.wang at mediatek.com  Thu Sep 19 05:16:16 2024
From: peter.wang at mediatek.com (=?utf-8?B?UGV0ZXIgV2FuZyAo546L5L+h5Y+LKQ==?=)
Date: Thu, 19 Sep 2024 12:16:16 +0000
Subject: [PATCH v4 2/2] ufs: core: requeue aborted request
In-Reply-To: <78c7fc74-81c2-40e4-b050-1d65dec96d0a@acm.org>
References: <20240910073035.25974-1-peter.wang@mediatek.com>
	 <20240910073035.25974-3-peter.wang@mediatek.com>
	 <e42abf07-ba6b-4301-8717-8d5b01d56640@acm.org>
	 <04e392c00986ac798e881dcd347ff5045cf61708.camel@mediatek.com>
	 <858c4b6b-fcbc-4d51-8641-051aeda387c5@acm.org>
	 <524e9da9196cc0acf497ff87eba3a8043b780332.camel@mediatek.com>
	 <6203d7c9-b33c-4bf1-aca3-5fc8ba5636b9@acm.org>
	 <6fc025d7ffb9d702a117381fb5da318b40a24246.camel@mediatek.com>
	 <46d8be04-10db-4de1-8a59-6cd402bcecb1@acm.org>
	 <61a1678cad16dcb15f1e215ff1c47476666f0ee8.camel@mediatek.com>
	 <78c7fc74-81c2-40e4-b050-1d65dec96d0a@acm.org>
Message-ID: <f350a1dee5a03347b5e88b9d7249223ce7b72c08.camel@mediatek.com>

On Wed, 2024-09-18 at 11:29 -0700, Bart Van Assche wrote:
>  	 
> External email : Please do not click links or open attachments until
> you have verified the sender or the content.
>  On 9/18/24 6:29 AM, Peter Wang (???) wrote:
> > Basically, this patch currently only needs to handle requeueing
> > for the error handler abort.
> > The approach for DBR mode and MCQ mode should be consistent.
> > If receive an interrupt response (OCS:ABORTED or
> INVALID_OCS_VALUE),
> > then set DID_REQUEUE. If there is no interrupt, it will also set
> > SCSI DID_REQUEUE in ufshcd_err_handler through
> > ufshcd_complete_requests
> > with force_compl = true.
> 
> Reporting a completion for commands cleared by writing into the
> legacy
> UTRLCLR register is not compliant with any version of the UFSHCI
> standard. Reporting a completion for commands cleared by writing into
> that register is problematic because it causes
> ufshcd_release_scsi_cmd()
> to be called as follows:
> 
> ufshcd_sl_intr()
>    ufshcd_transfer_req_compl()
>      ufshcd_poll()
>        __ufshcd_transfer_req_compl()
>          ufshcd_compl_one_cqe()
>            cmd->result = ...
>            ufshcd_release_scsi_cmd()
>            scsi_done()
> 
> Calling ufshcd_release_scsi_cmd() if a command has been cleared is
> problematic because the SCSI core does not expect this. If 
> ufshcd_try_to_abort_task() clears a SCSI command, 
> ufshcd_release_scsi_cmd() must not be called until the SCSI core
> decides to release the command. This is why I wrote in a previous
> mail
> that I think that a quirk should be introduced to suppress the
> completions generated by clearing a SCSI command.
> 

Hi Bart,

I'm not sure if I'm misunderstanding your point, but I feel that
ufshcd_release_scsi_cmd should always be called. It's scsi_done 
that shouldn't be called, as it should be left to the SCSI layer 
to decide how to handle this command. 
Because ufshcd_release_scsi_cmd is just about releasing resources 
related to ufshcd_map_sg and the clock at the UFS driver level. 
scsi_done is what notifies the SCSI layer that the cmd has finished, 
asking it to look at the result to decide how to proceed.


> > The more problematic part is with MCQ mode. To imitate the DBR
> > approach, we just need to set DID_REQUEUE upon receiving an
> interrupt.
> > Everything else remains the same. This would make things simpler.
> > 
> > Moving forward, if we want to simplify things and we have also
> > taken stock of the two or three scenarios where OCS: ABORTED
> occurs,
> > do we even need a flag? Couldn't we just set DID_REQUEUE directly
> > for OCS: ABORTED?
> > What do you think?
> 
> How about making ufshcd_compl_one_cqe() skip entries with status
> OCS_ABORTED? That would make ufshcd_compl_one_cqe() behave as the
> SCSI core expects, namely not freeing any command resources if a
> SCSI command is aborted successfully.
> 
> This approach may require further changes to ufshcd_abort_all().
> In that function there are separate code paths for legacy and MCQ
> mode. This is less than ideal. Would it be possible to combine
> these code paths by removing the ufshcd_complete_requests() call
> from ufshcd_abort_all() and by handling completions from inside
> ufshcd_abort_one()?
> 
> Thanks,
> 
> Bart.

The four case flows for abort are as follows:
----------------------------------------------------------------

Case1: DBR ufshcd_abort

In this case, you can see that ufshcd_release_scsi_cmd will 
definitely be called.

ufshcd_abort()
  ufshcd_try_to_abort_task()		// It should trigger an
interrupt, but the tensor might not
  get outstanding_lock
  clear outstanding_reqs tag
  ufshcd_release_scsi_cmd()
  release outstanding_lock

ufshcd_intr()
  ufshcd_sl_intr()
    ufshcd_transfer_req_compl()
      ufshcd_poll()
        get outstanding_lock
        clear outstanding_reqs tag
        release outstanding_lock			
        __ufshcd_transfer_req_compl()
          ufshcd_compl_one_cqe()
          cmd->result = DID_REQUEUE	// mediatek may need quirk
change DID_ABORT to DID_REQUEUE
          ufshcd_release_scsi_cmd()
          scsi_done();

In most cases, ufshcd_intr will not reach scsi_done because the 
outstanding_reqs tag is cleared by the original thread. 
Therefore, whether there is an interrupt or not doesn't affect 
the result because the ISR will do nothing in most cases. 

In a very low chance, the ISR will reach scsi_done and notify 
SCSI to requeue, and the original thread will not 
call ufshcd_release_scsi_cmd.
MediaTek may need to change DID_ABORT to DID_REQUEUE in this 
situation, or perhaps not handle this ISR at all.

----------------------------------------------------------------

Case2: MCQ ufshcd_abort

In the case of MCQ ufshcd_abort, you can also see that 
ufshcd_release_scsi_cmd will definitely be called too. 
However, there seems to be a problem here, as 
ufshcd_release_scsi_cmd might be called twice. 
This is because cmd is not null in ufshcd_release_scsi_cmd, 
which the previous version would set cmd to null. 
Skipping OCS: ABORTED in ufshcd_compl_one_cqe indeed 
can avoid this problem. This part needs further 
consideration on how to handle it.

ufshcd_abort()
  ufshcd_mcq_abort()
    ufshcd_try_to_abort_task()	// will trigger ISR 
    ufshcd_release_scsi_cmd()

ufs_mtk_mcq_intr()
  ufshcd_mcq_poll_cqe_lock()
    ufshcd_mcq_process_cqe()
      ufshcd_compl_one_cqe()
        cmd->result = DID_ABORT
        ufshcd_release_scsi_cmd() // will release twice
        scsi_done()

----------------------------------------------------------------

Case3: DBR ufshcd_err_handler

In the case of the DBR mode error handler, it's the same; 
ufshcd_release_scsi_cmd will also be executed, and scsi_done 
will definitely be used to notify SCSI to requeue.

ufshcd_err_handler()
  ufshcd_abort_all()
    ufshcd_abort_one()
      ufshcd_try_to_abort_task()	// It should trigger an
interrupt, but the tensor might not
    ufshcd_complete_requests()
      ufshcd_transfer_req_compl()
        ufshcd_poll()
          get outstanding_lock
          clear outstanding_reqs tag
          release outstanding_lock	
          __ufshcd_transfer_req_compl()
            ufshcd_compl_one_cqe()
              cmd->result = DID_REQUEUE // mediatek may need quirk
change DID_ABORT to DID_REQUEUE
              ufshcd_release_scsi_cmd()
              scsi_done()

ufshcd_intr()
  ufshcd_sl_intr()
    ufshcd_transfer_req_compl()
      ufshcd_poll()
        get outstanding_lock
        clear outstanding_reqs tag
        release outstanding_lock			
        __ufshcd_transfer_req_compl()
          ufshcd_compl_one_cqe()
          cmd->result = DID_REQUEUE // mediatek may need quirk change
DID_ABORT to DID_REQUEUE
          ufshcd_release_scsi_cmd()
          scsi_done();

At this time, the same actions are taken regardless of whether 
there is an ISR, and with the protection of outstanding_lock, 
only one thread will execute ufshcd_release_scsi_cmd and scsi_done.

----------------------------------------------------------------

Case4: MCQ ufshcd_err_handler

It's the same with MCQ mode; there is protection from the cqe lock, 
so only one thread will execute. What my patch 2 aims to do is to 
change DID_ABORT to DID_REQUEUE in this situation.

ufshcd_err_handler()
  ufshcd_abort_all()
    ufshcd_abort_one()
      ufshcd_try_to_abort_task()	// will trigger irq thread
    ufshcd_complete_requests()
      ufshcd_mcq_compl_pending_transfer()
        ufshcd_mcq_poll_cqe_lock()
          ufshcd_mcq_process_cqe()
            ufshcd_compl_one_cqe()
              cmd->result = DID_ABORT // should change to DID_REQUEUE
              ufshcd_release_scsi_cmd()
              scsi_done()

ufs_mtk_mcq_intr()
  ufshcd_mcq_poll_cqe_lock()
    ufshcd_mcq_process_cqe()
      ufshcd_compl_one_cqe()
        cmd->result = DID_ABORT  // should change to DID_REQUEUE
        ufshcd_release_scsi_cmd()
        scsi_done()

Thanks
Peter



From lorenzo at kernel.org  Thu Sep 19 05:58:15 2024
From: lorenzo at kernel.org (Lorenzo Bianconi)
Date: Thu, 19 Sep 2024 14:58:15 +0200
Subject: [PATCH net] net: airoha: fix PSE memory configuration in
 airoha_fe_pse_ports_init()
In-Reply-To: <20240919074210.GE1044577@kernel.org>
References: <20240918-airoha-eth-pse-fix-v1-1-7b61f26cd2fd@kernel.org>
 <20240919074210.GE1044577@kernel.org>
Message-ID: <Zuwf57d09WBYKtSS@lore-desk>

> On Wed, Sep 18, 2024 at 04:37:30PM +0200, Lorenzo Bianconi wrote:
> > Align PSE memory configuration to vendor SDK. In particular, increase
> > initial value of PSE reserved memory in airoha_fe_pse_ports_init()
> > routine by the value used for the second Packet Processor Engine (PPE2)
> > and do not overwrite the default value.
> > Moreover, store the initial value for PSE reserved memory in orig_val
> > before running airoha_fe_set_pse_queue_rsv_pages() in
> > airoha_fe_set_pse_oq_rsv routine.
> 
> Hi Lorenzo,

Hi Simon,

> 
> This patch seems to be addressing two issues, perhaps it would be best
> to split it into two patches?

ack, I will do.

> 
> And as a fix (or fixes) I think it would be best to describe the
> problem, typically a user-visible bug, that is being addressed.

This is not a user-visible bug, do you think it is better to post it to
net-next (when it is open)?

Regards,
Lorenzo

> 
> > Fixes: 23020f049327 ("net: airoha: Introduce ethernet support for EN7581 SoC")
> > Tested-by: Sayantan Nandy <sayantan.nandy at airoha.com>
> > Signed-off-by: Lorenzo Bianconi <lorenzo at kernel.org>
> 
> ...
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 228 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-mediatek/attachments/20240919/27a1d073/attachment.sig>

From angelogioacchino.delregno at collabora.com  Thu Sep 19 06:12:33 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Thu, 19 Sep 2024 15:12:33 +0200
Subject: [PATCH 0/2] drm/mediatek: Adjustments for mtk_gem_prime_vmap()
In-Reply-To: <254d16d9-d56a-4f26-9914-db75e7aa4287@web.de>
References: <254d16d9-d56a-4f26-9914-db75e7aa4287@web.de>
Message-ID: <ff80024a-90b2-4a19-b827-23be69352f78@collabora.com>

Il 17/09/24 19:34, Markus Elfring ha scritto:
> From: Markus Elfring <elfring at users.sourceforge.net>
> Date: Tue, 17 Sep 2024 19:16:45 +0200
> 
> A few update suggestions were taken into account
> from static source code analysis.

Hello Markus,

In my opinion, the suggested changes aren't bringing any improvement, not
in readability nor performance ... nor anything else, really.

For how I see it, the code is fine as it is, but then, that all boils down
to code style preferences and nothing else.

Cheers,
angelo

> 
> Markus Elfring (2):
>    Avoid duplicate sg_free_table(sgt) call
>    Use common error handling code
> 
>   drivers/gpu/drm/mediatek/mtk_gem.c | 14 ++++++++------
>   1 file changed, 8 insertions(+), 6 deletions(-)
> 
> --
> 2.46.0
> 




From angelogioacchino.delregno at collabora.com  Thu Sep 19 06:14:04 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Thu, 19 Sep 2024 15:14:04 +0200
Subject: [PATCH] arm64: dts: mediatek: mt8183-kukui: Disable DPI display
 interface
In-Reply-To: <20240916162956.267340-1-alpernebiyasak@gmail.com>
References: <20240916162956.267340-1-alpernebiyasak@gmail.com>
Message-ID: <0a78959a-2d72-47a0-83f1-89065ff48d0a@collabora.com>

Il 16/09/24 18:29, Alper Nebi Yasak ha scritto:
> Commit 009d855a26fd ("arm64: dts: mt8183: add dpi node to mt8183") adds
> a device-tree node for the DPI display interface that feeds the external
> display pipeline, to enable HDMI support on the Pumpkin board.
> 
> However, the external display is not fully described on Chrome devices,
> blocked by further work on DP / USB-C muxing graph bindings. This
> incomplete description currently breaks internal display at least on the
> Cozmo board. The same issue was found and fixed on MT8186 devices with
> commit 3079fb09ddac ("arm64: dts: mediatek: mt8186-corsola: Disable DPI
> display interface"), but the MT8183 change wasn't merged until then.
> 
> Disable the external display interface for the Kukui device family until
> the necessary work is done, like in the MT8186 Corsola case.
> 
> Fixes: 009d855a26fd ("arm64: dts: mt8183: add dpi node to mt8183")
> Link: https://lore.kernel.org/linux-mediatek/20240821042836.2631815-1-wenst at chromium.org/
> Signed-off-by: Alper Nebi Yasak <alpernebiyasak at gmail.com>

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>




From u.kleine-koenig at baylibre.com  Thu Sep 19 06:26:21 2024
From: u.kleine-koenig at baylibre.com (Uwe =?utf-8?Q?Kleine-K=C3=B6nig?=)
Date: Thu, 19 Sep 2024 15:26:21 +0200
Subject: [PATCH] firmware: mtk-adsp-ipc: Switch to using dev_err_probe()
In-Reply-To: <20240919120208.152987-1-angelogioacchino.delregno@collabora.com>
References: <20240919120208.152987-1-angelogioacchino.delregno@collabora.com>
Message-ID: <4426qubj6oy3kwrxtzjyc5imhxhmgapjibbv55gig22pxfrjrm@qhk7larn3qnk>

Hello

On Thu, Sep 19, 2024 at 02:02:08PM +0200, AngeloGioacchino Del Regno wrote:
> There is an error path that checks whether the return value is
> -EPROBE_DEFER to decide whether to print the error message: that
> is exactly open-coding dev_err_probe(), so, switch to that.
> 
> Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
> ---
>  drivers/firmware/mtk-adsp-ipc.c | 7 +++----
>  1 file changed, 3 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/firmware/mtk-adsp-ipc.c b/drivers/firmware/mtk-adsp-ipc.c
> index a762302978de..fdb083f42ebf 100644
> --- a/drivers/firmware/mtk-adsp-ipc.c
> +++ b/drivers/firmware/mtk-adsp-ipc.c
> @@ -95,10 +95,9 @@ static int mtk_adsp_ipc_probe(struct platform_device *pdev)
>  		adsp_chan->idx = i;
>  		adsp_chan->ch = mbox_request_channel_byname(cl, adsp_mbox_ch_names[i]);
>  		if (IS_ERR(adsp_chan->ch)) {
> -			ret = PTR_ERR(adsp_chan->ch);
> -			if (ret != -EPROBE_DEFER)
> -				dev_err(dev, "Failed to request mbox chan %s ret %d\n",
> -					adsp_mbox_ch_names[i], ret);
> +			ret = dev_err_probe(dev, PTR_ERR(adsp_chan->ch),
> +					    "Failed to request mbox channel %s\n",
> +					    adsp_mbox_ch_names[i]);
>  

Looks good to me:

Acked-by: Uwe Kleine-K?nig <u.kleine-koenig at baylibre.com>

Best regards
Uwe
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-mediatek/attachments/20240919/7486b539/attachment.sig>

From horms at kernel.org  Thu Sep 19 06:52:22 2024
From: horms at kernel.org (Simon Horman)
Date: Thu, 19 Sep 2024 14:52:22 +0100
Subject: [PATCH net] net: airoha: fix PSE memory configuration in
 airoha_fe_pse_ports_init()
In-Reply-To: <Zuwf57d09WBYKtSS@lore-desk>
References: <20240918-airoha-eth-pse-fix-v1-1-7b61f26cd2fd@kernel.org>
 <20240919074210.GE1044577@kernel.org>
 <Zuwf57d09WBYKtSS@lore-desk>
Message-ID: <20240919135222.GC1571683@kernel.org>

On Thu, Sep 19, 2024 at 02:58:15PM +0200, Lorenzo Bianconi wrote:
> > On Wed, Sep 18, 2024 at 04:37:30PM +0200, Lorenzo Bianconi wrote:
> > > Align PSE memory configuration to vendor SDK. In particular, increase
> > > initial value of PSE reserved memory in airoha_fe_pse_ports_init()
> > > routine by the value used for the second Packet Processor Engine (PPE2)
> > > and do not overwrite the default value.
> > > Moreover, store the initial value for PSE reserved memory in orig_val
> > > before running airoha_fe_set_pse_queue_rsv_pages() in
> > > airoha_fe_set_pse_oq_rsv routine.
> > 
> > Hi Lorenzo,
> 
> Hi Simon,

Hi Lorenzo,

> > 
> > This patch seems to be addressing two issues, perhaps it would be best
> > to split it into two patches?
> 
> ack, I will do.

Thanks.

> > And as a fix (or fixes) I think it would be best to describe the
> > problem, typically a user-visible bug, that is being addressed.
> 
> This is not a user-visible bug, do you think it is better to post it to
> net-next (when it is open)?

Yes, I think that would be best.

If you do so please don't included any Fixes tags.
Instead, if you want to refer to a patch, use the
following syntax within the patch description.
AFAIK, unlike Fixes tags, it may be line wrapped as appropriate.

commit 23020f049327 ("net: airoha: Introduce ethernet support for EN7581 SoC")

> 
> Regards,
> Lorenzo
> 
> > 
> > > Fixes: 23020f049327 ("net: airoha: Introduce ethernet support for EN7581 SoC")
> > > Tested-by: Sayantan Nandy <sayantan.nandy at airoha.com>
> > > Signed-off-by: Lorenzo Bianconi <lorenzo at kernel.org>
> > 
> > ...




From lorenzo at kernel.org  Thu Sep 19 07:40:46 2024
From: lorenzo at kernel.org (Lorenzo Bianconi)
Date: Thu, 19 Sep 2024 16:40:46 +0200
Subject: [PATCH net] net: airoha: fix PSE memory configuration in
 airoha_fe_pse_ports_init()
In-Reply-To: <20240919135222.GC1571683@kernel.org>
References: <20240918-airoha-eth-pse-fix-v1-1-7b61f26cd2fd@kernel.org>
 <20240919074210.GE1044577@kernel.org>
 <Zuwf57d09WBYKtSS@lore-desk>
 <20240919135222.GC1571683@kernel.org>
Message-ID: <Zuw37gJFhnVdfSuV@lore-desk>

> On Thu, Sep 19, 2024 at 02:58:15PM +0200, Lorenzo Bianconi wrote:
> > > On Wed, Sep 18, 2024 at 04:37:30PM +0200, Lorenzo Bianconi wrote:
> > > > Align PSE memory configuration to vendor SDK. In particular, increase
> > > > initial value of PSE reserved memory in airoha_fe_pse_ports_init()
> > > > routine by the value used for the second Packet Processor Engine (PPE2)
> > > > and do not overwrite the default value.
> > > > Moreover, store the initial value for PSE reserved memory in orig_val
> > > > before running airoha_fe_set_pse_queue_rsv_pages() in
> > > > airoha_fe_set_pse_oq_rsv routine.
> > > 
> > > Hi Lorenzo,
> > 
> > Hi Simon,
> 
> Hi Lorenzo,
> 
> > > 
> > > This patch seems to be addressing two issues, perhaps it would be best
> > > to split it into two patches?
> > 
> > ack, I will do.
> 
> Thanks.
> 
> > > And as a fix (or fixes) I think it would be best to describe the
> > > problem, typically a user-visible bug, that is being addressed.
> > 
> > This is not a user-visible bug, do you think it is better to post it to
> > net-next (when it is open)?
> 
> Yes, I think that would be best.

ack, fine to me.

> 
> If you do so please don't included any Fixes tags.
> Instead, if you want to refer to a patch, use the
> following syntax within the patch description.
> AFAIK, unlike Fixes tags, it may be line wrapped as appropriate.
> 
> commit 23020f049327 ("net: airoha: Introduce ethernet support for EN7581 SoC")

ack, fine. I was not aware of it :)

Regards,
Lorenzo

> 
> > 
> > Regards,
> > Lorenzo
> > 
> > > 
> > > > Fixes: 23020f049327 ("net: airoha: Introduce ethernet support for EN7581 SoC")
> > > > Tested-by: Sayantan Nandy <sayantan.nandy at airoha.com>
> > > > Signed-off-by: Lorenzo Bianconi <lorenzo at kernel.org>
> > > 
> > > ...
> 
> 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 228 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-mediatek/attachments/20240919/2d044e54/attachment.sig>

From robh at kernel.org  Thu Sep 19 11:18:34 2024
From: robh at kernel.org (Rob Herring (Arm))
Date: Thu, 19 Sep 2024 13:18:34 -0500
Subject: [PATCH v3] arm64: dts: mediatek: mt8183-pumpkin: add HDMI
 support
In-Reply-To: <20240919094212.1902073-1-treapking@chromium.org>
References: <20240919094212.1902073-1-treapking@chromium.org>
Message-ID: <172676985046.765320.3471835988677145017.robh@kernel.org>


On Thu, 19 Sep 2024 17:41:49 +0800, Pin-yen Lin wrote:
> From: Fabien Parent <fparent at baylibre.com>
> 
> The MT8183 Pumpkin board has a micro-HDMI connector. HDMI support is
> provided by an IT66121 DPI <-> HDMI bridge.
> 
> Enable the DPI and add the node for the IT66121 bridge.
> 
> Signed-off-by: Fabien Parent <fparent at baylibre.com>
> Co-developed-by: Pin-yen Lin <treapking at chromium.org>
> Signed-off-by: Pin-yen Lin <treapking at chromium.org>
> Reviewed-by: N?colas F. R. A. Prado <nfraprado at collabora.com>
> 
> ---
> 
> Changes in v3:
> - Update commit message and fix formatting issues
> - Fix the label name of vcn33 regulator
> 
>  .../boot/dts/mediatek/mt8183-pumpkin.dts      | 123 ++++++++++++++++++
>  1 file changed, 123 insertions(+)
> 


My bot found new DTB warnings on the .dts files added or changed in this
series.

Some warnings may be from an existing SoC .dtsi. Or perhaps the warnings
are fixed by another series. Ultimately, it is up to the platform
maintainer whether these warnings are acceptable or not. No need to reply
unless the platform maintainer has comments.

If you already ran DT checks and didn't see these error(s), then
make sure dt-schema is up to date:

  pip3 install dtschema --upgrade


New warnings running 'make CHECK_DTBS=y mediatek/mt8183-pumpkin.dtb' for 20240919094212.1902073-1-treapking at chromium.org:

arch/arm64/boot/dts/mediatek/mt8183-pumpkin.dtb: dpi at 14015000: power-domains: False schema does not allow [[76, 7]]
	from schema $id: http://devicetree.org/schemas/display/mediatek/mediatek,dpi.yaml#







From bvanassche at acm.org  Thu Sep 19 11:49:35 2024
From: bvanassche at acm.org (Bart Van Assche)
Date: Thu, 19 Sep 2024 11:49:35 -0700
Subject: [PATCH v4 2/2] ufs: core: requeue aborted request
In-Reply-To: <f350a1dee5a03347b5e88b9d7249223ce7b72c08.camel@mediatek.com>
References: <20240910073035.25974-1-peter.wang@mediatek.com>
 <20240910073035.25974-3-peter.wang@mediatek.com>
 <e42abf07-ba6b-4301-8717-8d5b01d56640@acm.org>
 <04e392c00986ac798e881dcd347ff5045cf61708.camel@mediatek.com>
 <858c4b6b-fcbc-4d51-8641-051aeda387c5@acm.org>
 <524e9da9196cc0acf497ff87eba3a8043b780332.camel@mediatek.com>
 <6203d7c9-b33c-4bf1-aca3-5fc8ba5636b9@acm.org>
 <6fc025d7ffb9d702a117381fb5da318b40a24246.camel@mediatek.com>
 <46d8be04-10db-4de1-8a59-6cd402bcecb1@acm.org>
 <61a1678cad16dcb15f1e215ff1c47476666f0ee8.camel@mediatek.com>
 <78c7fc74-81c2-40e4-b050-1d65dec96d0a@acm.org>
 <f350a1dee5a03347b5e88b9d7249223ce7b72c08.camel@mediatek.com>
Message-ID: <beeec868-b4ac-4025-859b-35a828cd2f8e@acm.org>

On 9/19/24 5:16 AM, Peter Wang (???) wrote:
> The four case flows for abort are as follows:
> ----------------------------------------------------------------
> 
> Case1: DBR ufshcd_abort

Please follow the terminology from the UFSHCI 4.0 standard and use the
word "legacy" instead of "DBR".

> In this case, you can see that ufshcd_release_scsi_cmd will
> definitely be called.
> 
> ufshcd_abort()
>    ufshcd_try_to_abort_task()		// It should trigger an
> interrupt, but the tensor might not
>    get outstanding_lock
>    clear outstanding_reqs tag
>    ufshcd_release_scsi_cmd()
>    release outstanding_lock
> 
> ufshcd_intr()
>    ufshcd_sl_intr()
>      ufshcd_transfer_req_compl()
>        ufshcd_poll()
>          get outstanding_lock
>          clear outstanding_reqs tag
>          release outstanding_lock			
>          __ufshcd_transfer_req_compl()
>            ufshcd_compl_one_cqe()
>            cmd->result = DID_REQUEUE	// mediatek may need quirk
> change DID_ABORT to DID_REQUEUE
>            ufshcd_release_scsi_cmd()
>            scsi_done();
> 
> In most cases, ufshcd_intr will not reach scsi_done because the
> outstanding_reqs tag is cleared by the original thread.
> Therefore, whether there is an interrupt or not doesn't affect
> the result because the ISR will do nothing in most cases.
> 
> In a very low chance, the ISR will reach scsi_done and notify
> SCSI to requeue, and the original thread will not
> call ufshcd_release_scsi_cmd.
> MediaTek may need to change DID_ABORT to DID_REQUEUE in this
> situation, or perhaps not handle this ISR at all.

Please modify ufshcd_compl_one_cqe() such that it ignores commands
with status OCS_ABORTED. This will make the UFSHCI driver behave in
the same way for all UFSHCI controllers, whether or not clearing a
command triggers a completion interrupt.

> ----------------------------------------------------------------
> 
> Case2: MCQ ufshcd_abort
> 
> In the case of MCQ ufshcd_abort, you can also see that
> ufshcd_release_scsi_cmd will definitely be called too.
> However, there seems to be a problem here, as
> ufshcd_release_scsi_cmd might be called twice.
> This is because cmd is not null in ufshcd_release_scsi_cmd,
> which the previous version would set cmd to null.
> Skipping OCS: ABORTED in ufshcd_compl_one_cqe indeed
> can avoid this problem. This part needs further
> consideration on how to handle it.
> 
> ufshcd_abort()
>    ufshcd_mcq_abort()
>      ufshcd_try_to_abort_task()	// will trigger ISR
>      ufshcd_release_scsi_cmd()
> 
> ufs_mtk_mcq_intr()
>    ufshcd_mcq_poll_cqe_lock()
>      ufshcd_mcq_process_cqe()
>        ufshcd_compl_one_cqe()
>          cmd->result = DID_ABORT
>          ufshcd_release_scsi_cmd() // will release twice
>          scsi_done()

Do you agree that this case can be addressed with the
ufshcd_compl_one_cqe() change proposed above?

> ----------------------------------------------------------------
> 
> Case3: DBR ufshcd_err_handler
> 
> In the case of the DBR mode error handler, it's the same;
> ufshcd_release_scsi_cmd will also be executed, and scsi_done
> will definitely be used to notify SCSI to requeue.
> 
> ufshcd_err_handler()
>    ufshcd_abort_all()
>      ufshcd_abort_one()
>        ufshcd_try_to_abort_task()	// It should trigger an
> interrupt, but the tensor might not
>      ufshcd_complete_requests()
>        ufshcd_transfer_req_compl()
>          ufshcd_poll()
>            get outstanding_lock
>            clear outstanding_reqs tag
>            release outstanding_lock	
>            __ufshcd_transfer_req_compl()
>              ufshcd_compl_one_cqe()
>                cmd->result = DID_REQUEUE // mediatek may need quirk
> change DID_ABORT to DID_REQUEUE
>                ufshcd_release_scsi_cmd()
>                scsi_done()
> 
> ufshcd_intr()
>    ufshcd_sl_intr()
>      ufshcd_transfer_req_compl()
>        ufshcd_poll()
>          get outstanding_lock
>          clear outstanding_reqs tag
>          release outstanding_lock			
>          __ufshcd_transfer_req_compl()
>            ufshcd_compl_one_cqe()
>            cmd->result = DID_REQUEUE // mediatek may need quirk change
> DID_ABORT to DID_REQUEUE
>            ufshcd_release_scsi_cmd()
>            scsi_done();
> 
> At this time, the same actions are taken regardless of whether
> there is an ISR, and with the protection of outstanding_lock,
> only one thread will execute ufshcd_release_scsi_cmd and scsi_done.
> ----------------------------------------------------------------
> 
> Case4: MCQ ufshcd_err_handler
> 
> It's the same with MCQ mode; there is protection from the cqe lock,
> so only one thread will execute. What my patch 2 aims to do is to
> change DID_ABORT to DID_REQUEUE in this situation.
> 
> ufshcd_err_handler()
>    ufshcd_abort_all()
>      ufshcd_abort_one()
>        ufshcd_try_to_abort_task()	// will trigger irq thread
>      ufshcd_complete_requests()
>        ufshcd_mcq_compl_pending_transfer()
>          ufshcd_mcq_poll_cqe_lock()
>            ufshcd_mcq_process_cqe()
>              ufshcd_compl_one_cqe()
>                cmd->result = DID_ABORT // should change to DID_REQUEUE
>                ufshcd_release_scsi_cmd()
>                scsi_done()
> 
> ufs_mtk_mcq_intr()
>    ufshcd_mcq_poll_cqe_lock()
>      ufshcd_mcq_process_cqe()
>        ufshcd_compl_one_cqe()
>          cmd->result = DID_ABORT  // should change to DID_REQUEUE
>          ufshcd_release_scsi_cmd()
>          scsi_done()

For legacy and MCQ mode, I prefer the following behavior for
ufshcd_abort_all():
* ufshcd_compl_one_cqe() ignores commands with status OCS_ABORTED.
* ufshcd_release_scsi_cmd() is called either by ufshcd_abort_one() or
   by ufshcd_abort_all().

Do you agree with making the changes proposed above?

Thank you,

Bart.


From hawk at kernel.org  Thu Sep 19 14:04:43 2024
From: hawk at kernel.org (Jesper Dangaard Brouer)
Date: Thu, 19 Sep 2024 23:04:43 +0200
Subject: [PATCH net 2/2] page_pool: fix IOMMU crash when driver has
 already unbound
In-Reply-To: <cdfecd37-31d7-42d2-a8d8-92008285b42e@huawei.com>
References: <20240918111826.863596-1-linyunsheng@huawei.com>
 <20240918111826.863596-3-linyunsheng@huawei.com>
 <CAC_iWjK=G7Oo5=pN2QunhasgDC6NyC1L+96jigX7u9ad+PbYng@mail.gmail.com>
 <894a3c2c-22f9-45b9-a82b-de7320066b42@kernel.org>
 <cdfecd37-31d7-42d2-a8d8-92008285b42e@huawei.com>
Message-ID: <0e8c7a7a-0e2a-42ec-adbc-b29f6a514517@kernel.org>



On 19/09/2024 13.15, Yunsheng Lin wrote:
> On 2024/9/19 17:42, Jesper Dangaard Brouer wrote:
>>
>> On 18/09/2024 19.06, Ilias Apalodimas wrote:
>>>> In order not to do the dma unmmapping after driver has already
>>>> unbound and stall the unloading of the networking driver, add
>>>> the pool->items array to record all the pages including the ones
>>>> which are handed over to network stack, so the page_pool can
>>>> do the dma unmmapping for those pages when page_pool_destroy()
>>>> is called.
>>>
>>> So, I was thinking of a very similar idea. But what do you mean by
>>> "all"? The pages that are still in caches (slow or fast) of the pool
>>> will be unmapped during page_pool_destroy().
>>
>> I really dislike this idea of having to keep track of all outstanding pages.
>>
>> I liked Jakub's idea of keeping the netdev around for longer.
>>
>> This is all related to destroying the struct device that have points to
>> the DMA engine, right?
> 
> Yes, the problem seems to be that when device_del() is called, there is
> no guarantee hw behind the 'struct device ' will be usable even if we
> call get_device() on it.
> 
>>
>> Why don't we add an API that allow netdev to "give" struct device to
>> page_pool.? And then the page_poll will take over when we can safely
>> free the stuct device?
> 
> By 'allow netdev to "give" struct device to page_pool', does it mean
> page_pool become the driver for the device?
> If yes, it seems that is similar to jakub's idea, as both seems to stall
> the calling of device_del() by not returning when the driver unloading.

Yes, this is what I mean. (That is why I mentioned Jakub's idea).


> If no, it seems that the problem is still existed when the driver for
> the device has unbound after device_del() is called.


From marc.payne at mdpsys.co.uk  Thu Sep 19 15:25:25 2024
From: marc.payne at mdpsys.co.uk (marc.payne at mdpsys.co.uk)
Date: Thu, 19 Sep 2024 23:25:25 +0100
Subject: [PATCH] Bluetooth: btmtk: Remove resetting mt7921 before
 downloading the fw
In-Reply-To: <c01e6dfa730dd10a7d4dba60fe31e82b9c296b37.camel@mediatek.com>
References: <20240822052310.25220-1-hao.qin@mediatek.com>
 <ZuB3omUkdUHLggYu@mdpsys.co.uk>
 <790e542aa9d08c7efeee6ef298fce2a87d8035e4.camel@mediatek.com>
 <ZuneSM4SvyUFX86j@mdpsys.co.uk>
 <9bfbbf24ac2480d94d3455f7e33e4b5502b38ced.camel@mediatek.com>
 <CABBYNZKYsL9jcF2n9TsA1BjU-CjXOdXu7MDLP9Sz_Ly8hBAf1w@mail.gmail.com>
 <c01e6dfa730dd10a7d4dba60fe31e82b9c296b37.camel@mediatek.com>
Message-ID: <Zuyk1c6Gkxx3G0PB@mdpsys.co.uk>

Hi Chris and Luiz,

What were your thoughts on the findings in my email dated 18th
September?

The 19/09/2024 03:26, Chris Lu (???) wrote:
> Hi Luiz,
> 
> On Wed, 2024-09-18 at 09:37 -0400, Luiz Augusto von Dentz wrote:
> >  	 
> > External email : Please do not click links or open attachments until
> > you have verified the sender or the content.
> >  Hi Chris,
> > 
> > On Tue, Sep 17, 2024 at 11:37?PM Chris Lu (???) <
> > Chris.Lu at mediatek.com> wrote:
> > >
> > > On Tue, 2024-09-17 at 20:53 +0100, marc.payne at mdpsys.co.uk wrote:
> > >
> > > Hi Marc,
> > >
> > > Thank you for providing the logs for us to debug.
> > >
> > >
> > > External email : Please do not click links or open attachments
> > until you have verified the sender or the content.
> > >  The 12/09/2024 07:09, Chris Lu (???) wrote:
> > > > On Tue, 2024-09-10 at 18:09 +0100, Marc Payne wrote:
> > > >
> > > > Hi Marc,
> > >
> > > Hi,
> > >
> > > >
> > > > Is it possible to provide entire kernel log for further
> > debugging?
> > > > (From boot up to issue heppen)
> > > >
> > > > We suspect that the issue occurred event earilier and our
> > controller is
> > > > not able to recover itself. Therfore, we need to check if
> > Bluetooth
> > > > works as expected in the booting stage.
> > >
> > > Happy to help. Below is the log for a cold boot of Linux 6.11-rc7
> > (with
> > > the additional patch to avoid the controller reset before fw load).
> > The
> > > MT7921AUN is directly connected to one of the computer's USB ports.
> > The
> > >
> > >
> > > Is "MT7921AUN" an external Bluetooth/WiFi usb dongle?
> > > From the information in the kernel log you provided, the MT7921AUN
> > IC used on
> > > the dongle is not for Linux PC project. Since the firmware we push
> > to Kernel is not
> > > for "MT7921AUN", software, firmware and hardware may not match.
> > Using that
> > > dongle with Linux-Based Notebook may lead to some unexpected errors
> > such as
> > > Bluetooth can't setup successfully.
> > 

If the AUN is really so different from other MT7921 variants, why has
MediaTek reused the VID:PID 0e8d:7961? Why is it even using the MT7921 name
at all?

> > Then something is not right with our code, either the driver shall
> > not
> > be probed for such models or not attempt to load the wrong firmware,
> > sounds like the patch tries to address the later but given your
> > explanation perhaps we should consider not even attempting to probe
> > for such models?
> 
> After internal investigation, that MT7921AUN connectivity dongle was
> made by a module maker which MediaTek didn't participate in the
> development and verification. We only ensure the modules on Notebook
> product can work normally. MT7921AUN has never been used in the
> Notebook product line. Acutally, the coredump is one of the protection
> mechanism to make invalid module doesn't work on Notebook.

The MT7921AU(N) is a USB3 connected WiFi 6E/BT IC. I agree, it won't be
used in a Notebook, a PCIe WiFi (USB BT) version in a M.2 socket will be
preferred, something like the MT7921K. 

MediaTek has released Windows drivers for the AU(N) variant and the
mt7921u driver has been added to Linux more than two years ago specifically
to support USB-based variants of the MT7921 family of ICs, Tested-by
Sean Wang and Deren Wu from MediaTek. Clearly there is an intent to
support the use of these ICs on the PC platform, Notebook or otherwise.

I understand that MediaTek may have had issues with poor quality
implementations from third-party manufacturers that may have caused
the ICs to glitch in the past. I don't think that's what is happening
here because my device works perfectly with old BT firmware
and also works with latest firmware with the USB reset workaround
detailed in my previous email.

> 
> Currently, we only use PID/VID to control whether "probe" is triggered
> or not. However, that module use MediaTek's common PID/VID  which is
> hard to be excluded. I agree with your opinion. We'll dicuss another
> method to prevent unexpected module type from being recongized in
> driver layer in the near future.

Please don't break/block working hardware on Linux! There is already
enough hardware that doesn't play nice with it, we really don't need
any more.

To make a point, I have typed this email on a Bluetooth keyboard paired with
the AWUS036AXML (MT7921AUN) running the latest firmware 20240826151221.
I have used the workaround detailed in my email sent to Chris (CC'd to
Luiz) on 18th September.

This is working hardware, let's fix the bugs in the driver and the firmware.

Regards,

Marc

> 
> > 
> > > Do you have an M.2 MT7921 module? (Typically existed in the
> > Notebook product with
> > > MediaTek Connectivity solution). The M.2 module is the correct one
> > expected to be used.
> > > I've setup an environment locally with Kernel v6.11, With Hao Qin's
> > solustion
> > > ("[PATCH] Bluetooth: btmtk: Remove resetting mt7921 before
> > downloading the fw"),
> > > I'm albe to successfully setup Bluetooth and works normally.
> > 
> > Shall I consider this a Tested-by?
> 
> Yes, I've verified with this change. MT7921e/MT7922e/MT7925e M.2 (all
> of their Bluetooth use USB interface) are able to setup and work
> normally.
> 
> BRs,
> Chris
> 
> > 
> > > BRs,
> > > Chris
> > >
> > > system has an Intel AX211 fitted so I have disabled it's bluetooth
> > > functionality in the UEFI setup.
> > >
> > > Hope this helps.
> > >
> > > >
> > > > BRs,
> > > > Chris Lu
> > >
> > > Regards,
> > >
> > > Marc
> > >
> > >
> > > [    0.000000] Linux version 6.11.0-rc7-00001-g0e2ad6528188-dirty (
> > marcp at mdp-archnuc) (gcc (GCC) 14.2.1 20240805, GNU ld (GNU Binutils)
> > 2.43.0) #71 SMP PREEMPT_DYNAMIC Mon Sep  9 23:22:56 BST 2024
> > > [    0.000000] Command line: root=UUID=0420afc7-4947-4e2e-a096-
> > b607b8b7fd93 rw quiet initrd=boot\intel-ucode.img
> > initrd=boot\initramfs-linux611.img resume=UUID=0420afc7-4947-4e2e-
> > a096-b607b8b7fd93 resume_offset=106496
> > > [    0.000000] x86/split lock detection: #AC: crashing the kernel
> > on kernel split_locks and warning on user-space split_locks
> > > [    0.000000] BIOS-provided physical RAM map:
> > > [    0.000000] BIOS-e820: [mem 0x0000000000000000-
> > 0x000000000009dfff] usable
> > > [    0.000000] BIOS-e820: [mem 0x000000000009e000-
> > 0x000000000009efff] reserved
> > > [    0.000000] BIOS-e820: [mem 0x000000000009f000-
> > 0x000000000009ffff] usable
> > > [    0.000000] BIOS-e820: [mem 0x00000000000a0000-
> > 0x00000000000fffff] reserved
> > > [    0.000000] BIOS-e820: [mem 0x0000000000100000-
> > 0x000000004dd45fff] usable
> > > [    0.000000] BIOS-e820: [mem 0x000000004dd46000-
> > 0x0000000056c70fff] reserved
> > > [    0.000000] BIOS-e820: [mem 0x0000000056c71000-
> > 0x0000000056d48fff] ACPI data
> > > [    0.000000] BIOS-e820: [mem 0x0000000056d49000-
> > 0x0000000056ecefff] ACPI NVS
> > > [    0.000000] BIOS-e820: [mem 0x0000000056ecf000-
> > 0x000000005a7fefff] reserved
> > > [    0.000000] BIOS-e820: [mem 0x000000005a7ff000-
> > 0x000000005a7fffff] usable
> > > [    0.000000] BIOS-e820: [mem 0x000000005a800000-
> > 0x00000000611fffff] reserved
> > > [    0.000000] BIOS-e820: [mem 0x0000000061e00000-
> > 0x00000000687fffff] reserved
> > > [    0.000000] BIOS-e820: [mem 0x00000000c0000000-
> > 0x00000000cfffffff] reserved
> > > [    0.000000] BIOS-e820: [mem 0x00000000fe000000-
> > 0x00000000fe010fff] reserved
> > > [    0.000000] BIOS-e820: [mem 0x00000000fec00000-
> > 0x00000000fec00fff] reserved
> > > [    0.000000] BIOS-e820: [mem 0x00000000fed00000-
> > 0x00000000fed00fff] reserved
> > > [    0.000000] BIOS-e820: [mem 0x00000000fed20000-
> > 0x00000000fed7ffff] reserved
> > > [    0.000000] BIOS-e820: [mem 0x00000000fee00000-
> > 0x00000000fee00fff] reserved
> > > [    0.000000] BIOS-e820: [mem 0x00000000ff000000-
> > 0x00000000ffffffff] reserved
> > > [    0.000000] BIOS-e820: [mem 0x0000000100000000-
> > 0x00000010977fffff] usable
> > > [    0.000000] NX (Execute Disable) protection: active
> > > [    0.000000] APIC: Static calls initialized
> > > [    0.000000] efi: EFI v2.8 by American Megatrends
> > > [    0.000000] efi: ACPI=0x56e48000 ACPI 2.0=0x56e48014
> > TPMFinalLog=0x56db4000 SMBIOS=0x5a483000 SMBIOS 3.0=0x5a482000
> > MEMATTR=0x4485d118 ESRT=0x43ea7e98 INITRD=0x41e12e98 RNG=0x56c9b018
> > TPMEventLog=0x41dd5018
> > > [    0.000000] random: crng init done
> > > [    0.000000] efi: Remove mem115: MMIO range=[0xc0000000-
> > 0xcfffffff] (256MB) from e820 map
> > > [    0.000000] e820: remove [mem 0xc0000000-0xcfffffff] reserved
> > > [    0.000000] efi: Not removing mem116: MMIO range=[0xfe000000-
> > 0xfe010fff] (68KB) from e820 map
> > > [    0.000000] efi: Not removing mem117: MMIO range=[0xfec00000-
> > 0xfec00fff] (4KB) from e820 map
> > > [    0.000000] efi: Not removing mem118: MMIO range=[0xfed00000-
> > 0xfed00fff] (4KB) from e820 map
> > > [    0.000000] efi: Not removing mem120: MMIO range=[0xfee00000-
> > 0xfee00fff] (4KB) from e820 map
> > > [    0.000000] efi: Remove mem121: MMIO range=[0xff000000-
> > 0xffffffff] (16MB) from e820 map
> > > [    0.000000] e820: remove [mem 0xff000000-0xffffffff] reserved
> > > [    0.000000] SMBIOS 3.5.0 present.
> > > [    0.000000] DMI: Intel(R) Client Systems NUC12WSHi7/NUC12WSBi7,
> > BIOS WSADL357.0088.2023.0505.1623 05/05/2023
> > > [    0.000000] DMI: Memory slots populated: 2/2
> > > [    0.000000] tsc: Detected 2500.000 MHz processor
> > > [    0.000000] tsc: Detected 2496.000 MHz TSC
> > > [    0.000549] e820: update [mem 0x00000000-0x00000fff] usable ==>
> > reserved
> > > [    0.000550] e820: remove [mem 0x000a0000-0x000fffff] usable
> > > [    0.000555] last_pfn = 0x1097800 max_arch_pfn = 0x400000000
> > > [    0.000558] MTRR map: 5 entries (3 fixed + 2 variable; max 23),
> > built from 10 variable MTRRs
> > > [    0.000559] x86/PAT: Configuration [0-7]: WB  WC  UC-
> > UC  WB  WP  UC- WT
> > > [    0.000935] last_pfn = 0x5a800 max_arch_pfn = 0x400000000
> > > [    0.014044] esrt: Reserving ESRT space from 0x0000000043ea7e98
> > to 0x0000000043ea7f98.
> > > [    0.014049] e820: update [mem 0x43ea7000-0x43ea7fff] usable ==>
> > reserved
> > > [    0.014062] Using GB pages for direct mapping
> > > [    0.014063] Incomplete global flushes, disabling PCID
> > > [    0.014285] Secure boot disabled
> > > [    0.014285] RAMDISK: [mem 0x39be8000-0x4039cfff]
> > > [    0.014312] ACPI: Early table checksum verification disabled
> > > [    0.014315] ACPI: RSDP 0x0000000056E48014 000024 (v02 INTEL )
> > > [    0.014318] ACPI: XSDT 0x0000000056DE4728 000114 (v01
> > INTEL  NUCxi7A5 00000058 AMI  01000013)
> > > [    0.014322] ACPI: FACP 0x0000000056D46000 000114 (v06
> > INTEL  NUCxi7A5 00000058 AMI  01000013)
> > > [    0.014326] ACPI: DSDT 0x0000000056CD9000 06CECF (v02
> > INTEL  NUCxi7A5 00000058 INTL 20200717)
> > > [    0.014328] ACPI: FACS 0x0000000056ECC000 000040
> > > [    0.014329] ACPI: FIDT 0x0000000056CD8000 00009C (v01
> > INTEL  NUCxi7A5 00000058 AMI  00010013)
> > > [    0.014331] ACPI: SSDT 0x0000000056D48000 00038C (v02
> > INTEL  NUCxi7A5 00000058 INTL 20200717)
> > > [    0.014333] ACPI: SSDT 0x0000000056CD2000 005D2C (v02
> > INTEL  NUCxi7A5 00000058 INTL 20200717)
> > > [    0.014335] ACPI: SSDT 0x0000000056CCF000 002AA1 (v02
> > INTEL  NUCxi7A5 00000058 INTL 20200717)
> > > [    0.014337] ACPI: SSDT 0x0000000056CCB000 0033D3 (v02
> > INTEL  NUCxi7A5 00000058 INTL 20200717)
> > > [    0.014339] ACPI: SSDT 0x0000000056CBD000 00D39F (v02
> > INTEL  NUCxi7A5 00001000 INTL 20200717)
> > > [    0.014341] ACPI: HPET 0x0000000056D47000 000038 (v01
> > INTEL  NUCxi7A5 00000058 AMI  01000013)
> > > [    0.014343] ACPI: APIC 0x0000000056CBC000 0001DC (v05
> > INTEL  NUCxi7A5 00000058 AMI  01000013)
> > > [    0.014344] ACPI: MCFG 0x0000000056CBB000 00003C (v01
> > INTEL  NUCxi7A5 00000058 AMI  01000013)
> > > [    0.014346] ACPI: SSDT 0x0000000056CB9000 001F04 (v02
> > INTEL  NUCxi7A5 00000058 INTL 20200717)
> > > [    0.014348] ACPI: SSDT 0x0000000056CB7000 001DFD (v02
> > INTEL  NUCxi7A5 00000058 INTL 20200717)
> > > [    0.014350] ACPI: UEFI 0x0000000056D9B000 000048 (v01
> > INTEL  NUCxi7A5 00000058 AMI  01000013)
> > > [    0.014352] ACPI: NHLT 0x0000000056CB6000 0002F1 (v00
> > INTEL  NUCxi7A5 00000058 AMI  01000013)
> > > [    0.014353] ACPI: LPIT 0x0000000056CB5000 0000CC (v01
> > INTEL  NUCxi7A5 00000058 AMI  01000013)
> > > [    0.014355] ACPI: WDAT 0x0000000056CB3000 000134 (v01
> > INTEL  NUCxi7A5 00000058 AMI  01000013)
> > > [    0.014357] ACPI: SSDT 0x0000000056CB0000 002A83 (v02
> > INTEL  NUCxi7A5 00000058 INTL 20200717)
> > > [    0.014359] ACPI: SSDT 0x0000000056CAD000 002357 (v02
> > INTEL  NUCxi7A5 00000058 INTL 20200717)
> > > [    0.014361] ACPI: DBGP 0x0000000056CAC000 000034 (v01
> > INTEL  NUCxi7A5 00000058 AMI  01000013)
> > > [    0.014363] ACPI: DBG2 0x0000000056CAB000 000054 (v00
> > INTEL  NUCxi7A5 00000058 AMI  01000013)
> > > [    0.014364] ACPI: DMAR 0x0000000056CAA000 000088 (v02
> > INTEL  NUCxi7A5 00000058      01000013)
> > > [    0.014366] ACPI: FPDT 0x0000000056CA9000 000044 (v01
> > INTEL  NUCxi7A5 00000058 AMI  01000013)
> > > [    0.014368] ACPI: SSDT 0x0000000056CA8000 000D56 (v02
> > INTEL  NUCxi7A5 00000058 INTL 20200717)
> > > [    0.014370] ACPI: SSDT 0x0000000056CA4000 003AEA (v02
> > INTEL  NUCxi7A5 00000058 INTL 20200717)
> > > [    0.014372] ACPI: SSDT 0x0000000056CA0000 0035A2 (v02
> > INTEL  NUCxi7A5 00000058 INTL 20200717)
> > > [    0.014374] ACPI: SSDT 0x0000000056C9F000 000144 (v02
> > INTEL  NUCxi7A5 00000058 INTL 20200717)
> > > [    0.014376] ACPI: BGRT 0x0000000056C9E000 000038 (v01
> > INTEL  NUCxi7A5 00000058 AMI  00010013)
> > > [    0.014377] ACPI: TPM2 0x0000000056C9D000 00004C (v04
> > INTEL  NUCxi7A5 00000058 AMI  00000000)
> > > [    0.014379] ACPI: PHAT 0x0000000056C9C000 00062D (v01
> > INTEL  NUCxi7A5 00000058 MSFT 0100000D)
> > > [    0.014381] ACPI: WSMT 0x0000000056CB4000 000028 (v01
> > INTEL  NUCxi7A5 00000058 AMI  00010013)
> > > [    0.014383] ACPI: Reserving FACP table memory at [mem
> > 0x56d46000-0x56d46113]
> > > [    0.014384] ACPI: Reserving DSDT table memory at [mem
> > 0x56cd9000-0x56d45ece]
> > > [    0.014384] ACPI: Reserving FACS table memory at [mem
> > 0x56ecc000-0x56ecc03f]
> > > [    0.014385] ACPI: Reserving FIDT table memory at [mem
> > 0x56cd8000-0x56cd809b]
> > > [    0.014386] ACPI: Reserving SSDT table memory at [mem
> > 0x56d48000-0x56d4838b]
> > > [    0.014386] ACPI: Reserving SSDT table memory at [mem
> > 0x56cd2000-0x56cd7d2b]
> > > [    0.014387] ACPI: Reserving SSDT table memory at [mem
> > 0x56ccf000-0x56cd1aa0]
> > > [    0.014387] ACPI: Reserving SSDT table memory at [mem
> > 0x56ccb000-0x56cce3d2]
> > > [    0.014388] ACPI: Reserving SSDT table memory at [mem
> > 0x56cbd000-0x56cca39e]
> > > [    0.014388] ACPI: Reserving HPET table memory at [mem
> > 0x56d47000-0x56d47037]
> > > [    0.014389] ACPI: Reserving APIC table memory at [mem
> > 0x56cbc000-0x56cbc1db]
> > > [    0.014389] ACPI: Reserving MCFG table memory at [mem
> > 0x56cbb000-0x56cbb03b]
> > > [    0.014390] ACPI: Reserving SSDT table memory at [mem
> > 0x56cb9000-0x56cbaf03]
> > > [    0.014390] ACPI: Reserving SSDT table memory at [mem
> > 0x56cb7000-0x56cb8dfc]
> > > [    0.014391] ACPI: Reserving UEFI table memory at [mem
> > 0x56d9b000-0x56d9b047]
> > > [    0.014391] ACPI: Reserving NHLT table memory at [mem
> > 0x56cb6000-0x56cb62f0]
> > > [    0.014392] ACPI: Reserving LPIT table memory at [mem
> > 0x56cb5000-0x56cb50cb]
> > > [    0.014392] ACPI: Reserving WDAT table memory at [mem
> > 0x56cb3000-0x56cb3133]
> > > [    0.014393] ACPI: Reserving SSDT table memory at [mem
> > 0x56cb0000-0x56cb2a82]
> > > [    0.014393] ACPI: Reserving SSDT table memory at [mem
> > 0x56cad000-0x56caf356]
> > > [    0.014394] ACPI: Reserving DBGP table memory at [mem
> > 0x56cac000-0x56cac033]
> > > [    0.014394] ACPI: Reserving DBG2 table memory at [mem
> > 0x56cab000-0x56cab053]
> > > [    0.014395] ACPI: Reserving DMAR table memory at [mem
> > 0x56caa000-0x56caa087]
> > > [    0.014395] ACPI: Reserving FPDT table memory at [mem
> > 0x56ca9000-0x56ca9043]
> > > [    0.014396] ACPI: Reserving SSDT table memory at [mem
> > 0x56ca8000-0x56ca8d55]
> > > [    0.014396] ACPI: Reserving SSDT table memory at [mem
> > 0x56ca4000-0x56ca7ae9]
> > > [    0.014397] ACPI: Reserving SSDT table memory at [mem
> > 0x56ca0000-0x56ca35a1]
> > > [    0.014397] ACPI: Reserving SSDT table memory at [mem
> > 0x56c9f000-0x56c9f143]
> > > [    0.014398] ACPI: Reserving BGRT table memory at [mem
> > 0x56c9e000-0x56c9e037]
> > > [    0.014398] ACPI: Reserving TPM2 table memory at [mem
> > 0x56c9d000-0x56c9d04b]
> > > [    0.014399] ACPI: Reserving PHAT table memory at [mem
> > 0x56c9c000-0x56c9c62c]
> > > [    0.014400] ACPI: Reserving WSMT table memory at [mem
> > 0x56cb4000-0x56cb4027]
> > > [    0.014743] No NUMA configuration found
> > > [    0.014744] Faking a node at [mem 0x0000000000000000-
> > 0x00000010977fffff]
> > > [    0.014746] NODE_DATA(0) allocated [mem 0x10977fb000-
> > 0x10977fffff]
> > > [    0.014795] Zone ranges:
> > > [    0.014796]   DMA      [mem 0x0000000000001000-
> > 0x0000000000ffffff]
> > > [    0.014797]   DMA32    [mem 0x0000000001000000-
> > 0x00000000ffffffff]
> > > [    0.014798]   Normal   [mem 0x0000000100000000-
> > 0x00000010977fffff]
> > > [    0.014799]   Device   empty
> > > [    0.014799] Movable zone start for each node
> > > [    0.014800] Early memory node ranges
> > > [    0.014800]   node   0: [mem 0x0000000000001000-
> > 0x000000000009dfff]
> > > [    0.014801]   node   0: [mem 0x000000000009f000-
> > 0x000000000009ffff]
> > > [    0.014801]   node   0: [mem 0x0000000000100000-
> > 0x000000004dd45fff]
> > > [    0.014802]   node   0: [mem 0x000000005a7ff000-
> > 0x000000005a7fffff]
> > > [    0.014802]   node   0: [mem 0x0000000100000000-
> > 0x00000010977fffff]
> > > [    0.014805] Initmem setup node 0 [mem 0x0000000000001000-
> > 0x00000010977fffff]
> > > [    0.014808] On node 0, zone DMA: 1 pages in unavailable ranges
> > > [    0.014809] On node 0, zone DMA: 1 pages in unavailable ranges
> > > [    0.014821] On node 0, zone DMA: 96 pages in unavailable ranges
> > > [    0.015998] On node 0, zone DMA32: 19129 pages in unavailable
> > ranges
> > > [    0.078525] On node 0, zone Normal: 22528 pages in unavailable
> > ranges
> > > [    0.078536] On node 0, zone Normal: 2048 pages in unavailable
> > ranges
> > > [    0.078567] Reserving Intel graphics memory at [mem 0x64800000-
> > 0x687fffff]
> > > [    0.080194] ACPI: PM-Timer IO Port: 0x1808
> > > [    0.080199] ACPI: LAPIC_NMI (acpi_id[0x01] high edge lint[0x1])
> > > [    0.080200] ACPI: LAPIC_NMI (acpi_id[0x02] high edge lint[0x1])
> > > [    0.080200] ACPI: LAPIC_NMI (acpi_id[0x03] high edge lint[0x1])
> > > [    0.080201] ACPI: LAPIC_NMI (acpi_id[0x04] high edge lint[0x1])
> > > [    0.080201] ACPI: LAPIC_NMI (acpi_id[0x05] high edge lint[0x1])
> > > [    0.080201] ACPI: LAPIC_NMI (acpi_id[0x06] high edge lint[0x1])
> > > [    0.080202] ACPI: LAPIC_NMI (acpi_id[0x07] high edge lint[0x1])
> > > [    0.080202] ACPI: LAPIC_NMI (acpi_id[0x08] high edge lint[0x1])
> > > [    0.080203] ACPI: LAPIC_NMI (acpi_id[0x09] high edge lint[0x1])
> > > [    0.080203] ACPI: LAPIC_NMI (acpi_id[0x0a] high edge lint[0x1])
> > > [    0.080203] ACPI: LAPIC_NMI (acpi_id[0x0b] high edge lint[0x1])
> > > [    0.080204] ACPI: LAPIC_NMI (acpi_id[0x0c] high edge lint[0x1])
> > > [    0.080204] ACPI: LAPIC_NMI (acpi_id[0x0d] high edge lint[0x1])
> > > [    0.080205] ACPI: LAPIC_NMI (acpi_id[0x0e] high edge lint[0x1])
> > > [    0.080205] ACPI: LAPIC_NMI (acpi_id[0x0f] high edge lint[0x1])
> > > [    0.080205] ACPI: LAPIC_NMI (acpi_id[0x10] high edge lint[0x1])
> > > [    0.080206] ACPI: LAPIC_NMI (acpi_id[0x11] high edge lint[0x1])
> > > [    0.080206] ACPI: LAPIC_NMI (acpi_id[0x12] high edge lint[0x1])
> > > [    0.080207] ACPI: LAPIC_NMI (acpi_id[0x13] high edge lint[0x1])
> > > [    0.080207] ACPI: LAPIC_NMI (acpi_id[0x14] high edge lint[0x1])
> > > [    0.080207] ACPI: LAPIC_NMI (acpi_id[0x15] high edge lint[0x1])
> > > [    0.080208] ACPI: LAPIC_NMI (acpi_id[0x16] high edge lint[0x1])
> > > [    0.080208] ACPI: LAPIC_NMI (acpi_id[0x17] high edge lint[0x1])
> > > [    0.080209] ACPI: LAPIC_NMI (acpi_id[0x00] high edge lint[0x1])
> > > [    0.080291] IOAPIC[0]: apic_id 2, version 32, address
> > 0xfec00000, GSI 0-119
> > > [    0.080293] ACPI: INT_SRC_OVR (bus 0 bus_irq 0 global_irq 2 dfl
> > dfl)
> > > [    0.080294] ACPI: INT_SRC_OVR (bus 0 bus_irq 9 global_irq 9 high
> > level)
> > > [    0.080296] ACPI: Using ACPI (MADT) for SMP configuration
> > information
> > > [    0.080297] ACPI: HPET id: 0x8086a201 base: 0xfed00000
> > > [    0.080302] e820: update [mem 0x444e6000-0x44584fff] usable ==>
> > reserved
> > > [    0.080309] TSC deadline timer available
> > > [    0.080311] CPU topo: Max. logical packages:   1
> > > [    0.080311] CPU topo: Max. logical dies:       1
> > > [    0.080312] CPU topo: Max. dies per package:   1
> > > [    0.080313] CPU topo: Max. threads per core:   2
> > > [    0.080314] CPU topo: Num. cores per package:    12
> > > [    0.080314] CPU topo: Num. threads per package:  16
> > > [    0.080314] CPU topo: Allowing 16 present CPUs plus 0 hotplug
> > CPUs
> > > [    0.080325] PM: hibernation: Registered nosave memory: [mem
> > 0x00000000-0x00000fff]
> > > [    0.080326] PM: hibernation: Registered nosave memory: [mem
> > 0x0009e000-0x0009efff]
> > > [    0.080327] PM: hibernation: Registered nosave memory: [mem
> > 0x000a0000-0x000fffff]
> > > [    0.080328] PM: hibernation: Registered nosave memory: [mem
> > 0x43ea7000-0x43ea7fff]
> > > [    0.080329] PM: hibernation: Registered nosave memory: [mem
> > 0x444e6000-0x44584fff]
> > > [    0.080330] PM: hibernation: Registered nosave memory: [mem
> > 0x4dd46000-0x56c70fff]
> > > [    0.080330] PM: hibernation: Registered nosave memory: [mem
> > 0x56c71000-0x56d48fff]
> > > [    0.080331] PM: hibernation: Registered nosave memory: [mem
> > 0x56d49000-0x56ecefff]
> > > [    0.080331] PM: hibernation: Registered nosave memory: [mem
> > 0x56ecf000-0x5a7fefff]
> > > [    0.080332] PM: hibernation: Registered nosave memory: [mem
> > 0x5a800000-0x611fffff]
> > > [    0.080332] PM: hibernation: Registered nosave memory: [mem
> > 0x61200000-0x61dfffff]
> > > [    0.080333] PM: hibernation: Registered nosave memory: [mem
> > 0x61e00000-0x687fffff]
> > > [    0.080333] PM: hibernation: Registered nosave memory: [mem
> > 0x68800000-0xfdffffff]
> > > [    0.080333] PM: hibernation: Registered nosave memory: [mem
> > 0xfe000000-0xfe010fff]
> > > [    0.080334] PM: hibernation: Registered nosave memory: [mem
> > 0xfe011000-0xfebfffff]
> > > [    0.080334] PM: hibernation: Registered nosave memory: [mem
> > 0xfec00000-0xfec00fff]
> > > [    0.080334] PM: hibernation: Registered nosave memory: [mem
> > 0xfec01000-0xfecfffff]
> > > [    0.080335] PM: hibernation: Registered nosave memory: [mem
> > 0xfed00000-0xfed00fff]
> > > [    0.080335] PM: hibernation: Registered nosave memory: [mem
> > 0xfed01000-0xfed1ffff]
> > > [    0.080336] PM: hibernation: Registered nosave memory: [mem
> > 0xfed20000-0xfed7ffff]
> > > [    0.080336] PM: hibernation: Registered nosave memory: [mem
> > 0xfed80000-0xfedfffff]
> > > [    0.080336] PM: hibernation: Registered nosave memory: [mem
> > 0xfee00000-0xfee00fff]
> > > [    0.080337] PM: hibernation: Registered nosave memory: [mem
> > 0xfee01000-0xffffffff]
> > > [    0.080338] [mem 0x68800000-0xfdffffff] available for PCI
> > devices
> > > [    0.080339] Booting paravirtualized kernel on bare hardware
> > > [    0.080340] clocksource: refined-jiffies: mask: 0xffffffff
> > max_cycles: 0xffffffff, max_idle_ns: 6370452778343963 ns
> > > [    0.084163] setup_percpu: NR_CPUS:320 nr_cpumask_bits:16
> > nr_cpu_ids:16 nr_node_ids:1
> > > [    0.084800] percpu: Embedded 66 pages/cpu s233472 r8192 d28672
> > u524288
> > > [    0.084804] pcpu-alloc: s233472 r8192 d28672 u524288
> > alloc=1*2097152
> > > [    0.084806] pcpu-alloc: [0] 00 01 02 03 [0] 04 05 06 07
> > > [    0.084809] pcpu-alloc: [0] 08 09 10 11 [0] 12 13 14 15
> > > [    0.084820] Kernel command line: root=UUID=0420afc7-4947-4e2e-
> > a096-b607b8b7fd93 rw quiet initrd=boot\intel-ucode.img
> > initrd=boot\initramfs-linux611.img resume=UUID=0420afc7-4947-4e2e-
> > a096-b607b8b7fd93 resume_offset=106496
> > > [    0.088825] Dentry cache hash table entries: 8388608 (order: 14,
> > 67108864 bytes, linear)
> > > [    0.090830] Inode-cache hash table entries: 4194304 (order: 13,
> > 33554432 bytes, linear)
> > > [    0.090938] Fallback order for Node 0: 0
> > > [    0.090940] Built 1 zonelists, mobility grouping on.  Total
> > pages: 16667877
> > > [    0.090941] Policy zone: Normal
> > > [    0.091110] mem auto-init: stack:all(zero), heap alloc:on, heap
> > free:off
> > > [    0.091117] software IO TLB: area num 16.
> > > [    0.174200] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=16,
> > Nodes=1
> > > [    0.174233] ftrace: allocating 50629 entries in 198 pages
> > > [    0.178623] ftrace: allocated 198 pages with 4 groups
> > > [    0.178673] Dynamic Preempt: full
> > > [    0.178715] rcu: Preemptible hierarchical RCU implementation.
> > > [    0.178716] rcu: RCU restricting CPUs from NR_CPUS=320 to
> > nr_cpu_ids=16.
> > > [    0.178716] rcu: RCU priority boosting: priority 1 delay 500 ms.
> > > [    0.178717] Trampoline variant of Tasks RCU enabled.
> > > [    0.178718] Rude variant of Tasks RCU enabled.
> > > [    0.178718] Tracing variant of Tasks RCU enabled.
> > > [    0.178718] rcu: RCU calculated value of scheduler-enlistment
> > delay is 30 jiffies.
> > > [    0.178719] rcu: Adjusting geometry for rcu_fanout_leaf=16,
> > nr_cpu_ids=16
> > > [    0.178727] RCU Tasks: Setting shift to 4 and lim to 1
> > rcu_task_cb_adjust=1.
> > > [    0.178728] RCU Tasks Rude: Setting shift to 4 and lim to 1
> > rcu_task_cb_adjust=1.
> > > [    0.178729] RCU Tasks Trace: Setting shift to 4 and lim to 1
> > rcu_task_cb_adjust=1.
> > > [    0.181066] NR_IRQS: 20736, nr_irqs: 2184, preallocated irqs: 16
> > > [    0.181413] rcu: srcu_init: Setting srcu_struct sizes based on
> > contention.
> > > [    0.181851] kfence: initialized - using 2097152 bytes for 255
> > objects at 0x(____ptrval____)-0x(____ptrval____)
> > > [    0.181876] Console: colour dummy device 80x25
> > > [    0.181878] printk: legacy console [tty0] enabled
> > > [    0.181906] ACPI: Core revision 20240322
> > > [    0.182096] hpet: HPET dysfunctional in PC10. Force disabled.
> > > [    0.182097] APIC: Switch to symmetric I/O mode setup
> > > [    0.182099] DMAR: Host address width 39
> > > [    0.182099] DMAR: DRHD base: 0x000000fed90000 flags: 0x0
> > > [    0.182103] DMAR: dmar0: reg_base_addr fed90000 ver 4:0 cap
> > 1c0000c40660462 ecap 29a00f0505e
> > > [    0.182104] DMAR: DRHD base: 0x000000fed91000 flags: 0x1
> > > [    0.182107] DMAR: dmar1: reg_base_addr fed91000 ver 5:0 cap
> > d2008c40660462 ecap f050da
> > > [    0.182109] DMAR: RMRR base: 0x00000064000000 end:
> > 0x000000687fffff
> > > [    0.182111] DMAR-IR: IOAPIC id 2 under DRHD base  0xfed91000
> > IOMMU 1
> > > [    0.182112] DMAR-IR: HPET id 0 under DRHD base 0xfed91000
> > > [    0.182112] DMAR-IR: Queued invalidation will be enabled to
> > support x2apic and Intr-remapping.
> > > [    0.186032] DMAR-IR: Enabled IRQ remapping in x2apic mode
> > > [    0.186034] x2apic enabled
> > > [    0.186100] APIC: Switched APIC routing to: cluster x2apic
> > > [    0.197380] clocksource: tsc-early: mask: 0xffffffffffffffff
> > max_cycles: 0x23fa772cf26, max_idle_ns: 440795269835 ns
> > > [    0.197384] Calibrating delay loop (skipped), value calculated
> > using timer frequency.. 4993.00 BogoMIPS (lpj=8320000)
> > > [    0.197430] CPU0: Thermal monitoring enabled (TM1)
> > > [    0.197431] x86/cpu: User Mode Instruction Prevention (UMIP)
> > activated
> > > [    0.197530] CET detected: Indirect Branch Tracking enabled
> > > [    0.197532] Last level iTLB entries: 4KB 0, 2MB 0, 4MB 0
> > > [    0.197532] Last level dTLB entries: 4KB 0, 2MB 0, 4MB 0, 1GB 0
> > > [    0.197534] process: using mwait in idle threads
> > > [    0.197536] Spectre V1 : Mitigation: usercopy/swapgs barriers
> > and __user pointer sanitization
> > > [    0.197537] Spectre V2 : Mitigation: Enhanced / Automatic IBRS
> > > [    0.197538] Spectre V2 : Spectre v2 / SpectreRSB mitigation:
> > Filling RSB on context switch
> > > [    0.197538] Spectre V2 : Spectre v2 / PBRSB-eIBRS: Retire a
> > single CALL on VMEXIT
> > > [    0.197539] Spectre V2 : mitigation: Enabling conditional
> > Indirect Branch Prediction Barrier
> > > [    0.197540] Speculative Store Bypass: Mitigation: Speculative
> > Store Bypass disabled via prctl
> > > [    0.197541] Register File Data Sampling: Mitigation: Clear
> > Register File
> > > [    0.197547] x86/fpu: Supporting XSAVE feature 0x001: 'x87
> > floating point registers'
> > > [    0.197548] x86/fpu: Supporting XSAVE feature 0x002: 'SSE
> > registers'
> > > [    0.197548] x86/fpu: Supporting XSAVE feature 0x004: 'AVX
> > registers'
> > > [    0.197549] x86/fpu: Supporting XSAVE feature 0x200: 'Protection
> > Keys User registers'
> > > [    0.197549] x86/fpu: Supporting XSAVE feature 0x800: 'Control-
> > flow User registers'
> > > [    0.197550] x86/fpu: xstate_offset[2]:  576,
> > xstate_sizes[2]:  256
> > > [    0.197551] x86/fpu: xstate_offset[9]:  832,
> > xstate_sizes[9]:    8
> > > [    0.197551] x86/fpu: xstate_offset[11]:  840,
> > xstate_sizes[11]:   16
> > > [    0.197552] x86/fpu: Enabled xstate features 0xa07, context size
> > is 856 bytes, using 'compacted' format.
> > > [    0.200716] Freeing SMP alternatives memory: 40K
> > > [    0.200716] pid_max: default: 32768 minimum: 301
> > > [    0.200716] LSM: initializing
> > lsm=capability,landlock,lockdown,yama,bpf
> > > [    0.200716] landlock: Up and running.
> > > [    0.200716] Yama: becoming mindful.
> > > [    0.200716] LSM support for eBPF active
> > > [    0.200716] Mount-cache hash table entries: 131072 (order: 8,
> > 1048576 bytes, linear)
> > > [    0.200716] Mountpoint-cache hash table entries: 131072 (order:
> > 8, 1048576 bytes, linear)
> > > [    0.200716] smpboot: CPU0: 12th Gen Intel(R) Core(TM) i7-1260P
> > (family: 0x6, model: 0x9a, stepping: 0x3)
> > > [    0.200716] Performance Events: XSAVE Architectural LBR, PEBS
> > fmt4+-baseline,  AnyThread deprecated, Alderlake Hybrid events, 32-
> > deep LBR, full-width counters, Intel PMU driver.
> > > [    0.200716] core: cpu_core PMU driver:
> > > [    0.200716] ... version:                5
> > > [    0.200716] ... bit width:              48
> > > [    0.200716] ... generic registers:      8
> > > [    0.200716] ... value mask:             0000ffffffffffff
> > > [    0.200716] ... max period:             00007fffffffffff
> > > [    0.200716] ... fixed-purpose events:   4
> > > [    0.200716] ... event mask:             0001000f000000ff
> > > [    0.200716] signal: max sigframe size: 3632
> > > [    0.200716] Estimated ratio of average max frequency by base
> > frequency (times 1024): 1556
> > > [    0.200716] rcu: Hierarchical SRCU implementation.
> > > [    0.200716] rcu: Max phase no-delay instances is 1000.
> > > [    0.200716] Timer migration: 2 hierarchy levels; 8 children per
> > group; 2 crossnode level
> > > [    0.200716] NMI watchdog: Enabled. Permanently consumes one hw-
> > PMU counter.
> > > [    0.200716] smp: Bringing up secondary CPUs ...
> > > [    0.200716] smpboot: x86: Booting SMP configuration:
> > > [    0.200716] .... node  #0, CPUs:        #2  #4  #6  #8  #9 #10
> > #11 #12 #13 #14 #15
> > > [    0.018930] core: cpu_atom PMU driver: PEBS-via-PT
> > > [    0.018930] ... version:                5
> > > [    0.018930] ... bit width:              48
> > > [    0.018930] ... generic registers:      6
> > > [    0.018930] ... value mask:             0000ffffffffffff
> > > [    0.018930] ... max period:             00007fffffffffff
> > > [    0.018930] ... fixed-purpose events:   3
> > > [    0.018930] ... event mask:             000000070000003f
> > > [    0.210777]   #1  #3  #5  #7
> > > [    0.215011] smp: Brought up 1 node, 16 CPUs
> > > [    0.215011] smpboot: Total of 16 processors activated (79903.00
> > BogoMIPS)
> > > [    0.217482] Memory: 65276284K/66671508K available (18432K kernel
> > code, 2185K rwdata, 13516K rodata, 3452K init, 3432K bss, 1370520K
> > reserved, 0K cma-reserved)
> > > [    0.218690] devtmpfs: initialized
> > > [    0.218690] x86/mm: Memory block size: 2048MB
> > > [    0.218690] ACPI: PM: Registering ACPI NVS region [mem
> > 0x56d49000-0x56ecefff] (1597440 bytes)
> > > [    0.218690] clocksource: jiffies: mask: 0xffffffff max_cycles:
> > 0xffffffff, max_idle_ns: 6370867519511994 ns
> > > [    0.218690] futex hash table entries: 4096 (order: 6, 262144
> > bytes, linear)
> > > [    0.218690] pinctrl core: initialized pinctrl subsystem
> > > [    0.218690] PM: RTC time: 15:43:42, date: 2024-09-17
> > > [    0.218690] NET: Registered PF_NETLINK/PF_ROUTE protocol family
> > > [    0.218690] DMA: preallocated 4096 KiB GFP_KERNEL pool for
> > atomic allocations
> > > [    0.218815] DMA: preallocated 4096 KiB GFP_KERNEL|GFP_DMA pool
> > for atomic allocations
> > > [    0.220935] DMA: preallocated 4096 KiB GFP_KERNEL|GFP_DMA32 pool
> > for atomic allocations
> > > [    0.220946] audit: initializing netlink subsys (disabled)
> > > [    0.220955] audit: type=2000 audit(1726587822.023:1):
> > state=initialized audit_enabled=0 res=1
> > > [    0.220955] thermal_sys: Registered thermal governor
> > 'fair_share'
> > > [    0.220955] thermal_sys: Registered thermal governor 'bang_bang'
> > > [    0.220955] thermal_sys: Registered thermal governor 'step_wise'
> > > [    0.220955] thermal_sys: Registered thermal governor
> > 'user_space'
> > > [    0.220955] thermal_sys: Registered thermal governor
> > 'power_allocator'
> > > [    0.220955] cpuidle: using governor ladder
> > > [    0.220955] cpuidle: using governor menu
> > > [    0.220955] acpiphp: ACPI Hot Plug PCI Controller Driver
> > version: 0.5
> > > [    0.220955] PCI: ECAM [mem 0xc0000000-0xcfffffff] (base
> > 0xc0000000) for domain 0000 [bus 00-ff]
> > > [    0.220955] PCI: Using configuration type 1 for base access
> > > [    0.220955] kprobes: kprobe jump-optimization is enabled. All
> > kprobes are optimized if possible.
> > > [    0.224191] HugeTLB: registered 1.00 GiB page size, pre-
> > allocated 0 pages
> > > [    0.224191] HugeTLB: 16380 KiB vmemmap can be freed for a 1.00
> > GiB page
> > > [    0.224191] HugeTLB: registered 2.00 MiB page size, pre-
> > allocated 0 pages
> > > [    0.224191] HugeTLB: 28 KiB vmemmap can be freed for a 2.00 MiB
> > page
> > > [    0.224500] ACPI: Added _OSI(Module Device)
> > > [    0.224500] ACPI: Added _OSI(Processor Device)
> > > [    0.224500] ACPI: Added _OSI(3.0 _SCP Extensions)
> > > [    0.224500] ACPI: Added _OSI(Processor Aggregator Device)
> > > [    0.312844] ACPI: 14 ACPI AML tables successfully acquired and
> > loaded
> > > [    0.336673] ACPI: USB4 _OSC: OS supports USB3+ DisplayPort+
> > PCIe+ XDomain+
> > > [    0.336675] ACPI: USB4 _OSC: OS controls USB3+ DisplayPort+
> > PCIe+ XDomain+
> > > [    0.338150] ACPI: Dynamic OEM Table Load:
> > > [    0.338158] ACPI: SSDT 0xFFFF9118C178D400 000394 (v02
> > PmRef  Cpu0Cst  00003001 INTL 20200717)
> > > [    0.339255] ACPI: Dynamic OEM Table Load:
> > > [    0.339260] ACPI: SSDT 0xFFFF9118C1798000 0005E4 (v02
> > PmRef  Cpu0Ist  00003000 INTL 20200717)
> > > [    0.340384] ACPI: Dynamic OEM Table Load:
> > > [    0.340388] ACPI: SSDT 0xFFFF9118C2101200 0001AB (v02
> > PmRef  Cpu0Psd  00003000 INTL 20200717)
> > > [    0.341453] ACPI: Dynamic OEM Table Load:
> > > [    0.341457] ACPI: SSDT 0xFFFF9118C179B000 0004BA (v02
> > PmRef  Cpu0Hwp  00003000 INTL 20200717)
> > > [    0.342940] ACPI: Dynamic OEM Table Load:
> > > [    0.342947] ACPI: SSDT 0xFFFF9118C1784000 001BAF (v02
> > PmRef  ApIst    00003000 INTL 20200717)
> > > [    0.344827] ACPI: Dynamic OEM Table Load:
> > > [    0.344833] ACPI: SSDT 0xFFFF9118C1780000 001038 (v02
> > PmRef  ApHwp    00003000 INTL 20200717)
> > > [    0.346435] ACPI: Dynamic OEM Table Load:
> > > [    0.346441] ACPI: SSDT 0xFFFF9118C21C6000 001349 (v02
> > PmRef  ApPsd    00003000 INTL 20200717)
> > > [    0.347383] ACPI: Dynamic OEM Table Load:
> > > [    0.347383] ACPI: SSDT 0xFFFF9118C1797000 000FBB (v02
> > PmRef  ApCst    00003000 INTL 20200717)
> > > [    0.351835] ACPI: EC: EC started
> > > [    0.351836] ACPI: EC: interrupt blocked
> > > [    0.352497] ACPI: EC: EC_CMD/EC_SC=0x66, EC_DATA=0x62
> > > [    0.352499] ACPI: \_SB_.PC00.LPCB.EC0_: Boot DSDT EC used to
> > handle transactions
> > > [    0.352501] ACPI: Interpreter enabled
> > > [    0.352548] ACPI: PM: (supports S0 S3 S4 S5)
> > > [    0.352549] ACPI: Using IOAPIC for interrupt routing
> > > [    0.353800] PCI: Using host bridge windows from ACPI; if
> > necessary, use "pci=nocrs" and report a bug
> > > [    0.353801] PCI: Ignoring E820 reservations for host bridge
> > windows
> > > [    0.355184] ACPI: Enabled 7 GPEs in block 00 to 7F
> > > [    0.357600] ACPI: \_SB_.PC00.PEG0.PXP_: New power resource
> > > [    0.373986] ACPI: \_SB_.PC00.XHCI.RHUB.HS10.BTRT: New power
> > resource
> > > [    0.374768] ACPI: \_SB_.PC00.PAUD: New power resource
> > > [    0.383767] ACPI: \_SB_.PC00.CNVW.WRST: New power resource
> > > [    0.392041] ACPI: \_SB_.PC00.TBT0: New power resource
> > > [    0.392349] ACPI: \_SB_.PC00.TBT1: New power resource
> > > [    0.392651] ACPI: \_SB_.PC00.D3C_: New power resource
> > > [    0.683890] ACPI: \_TZ_.FN00: New power resource
> > > [    0.683946] ACPI: \_TZ_.FN01: New power resource
> > > [    0.684000] ACPI: \_TZ_.FN02: New power resource
> > > [    0.684056] ACPI: \_TZ_.FN03: New power resource
> > > [    0.684110] ACPI: \_TZ_.FN04: New power resource
> > > [    0.684638] ACPI: \PIN_: New power resource
> > > [    0.685242] ACPI: PCI Root Bridge [PC00] (domain 0000 [bus 00-
> > fe])
> > > [    0.685248] acpi PNP0A08:00: _OSC: OS supports [ExtendedConfig
> > ASPM ClockPM Segments MSI EDR HPX-Type3]
> > > [    0.686937] acpi PNP0A08:00: _OSC: platform does not support
> > [AER]
> > > [    0.690313] acpi PNP0A08:00: _OSC: OS now controls [PCIeHotplug
> > SHPCHotplug PME PCIeCapability LTR DPC]
> > > [    0.692570] PCI host bridge to bus 0000:00
> > > [    0.692573] pci_bus 0000:00: root bus resource [io  0x0000-
> > 0x0cf7 window]
> > > [    0.692575] pci_bus 0000:00: root bus resource [io  0x0d00-
> > 0xffff window]
> > > [    0.692576] pci_bus 0000:00: root bus resource [mem 0x000a0000-
> > 0x000bffff window]
> > > [    0.692578] pci_bus 0000:00: root bus resource [mem 0x000e0000-
> > 0x000fffff window]
> > > [    0.692579] pci_bus 0000:00: root bus resource [mem 0x68800000-
> > 0xbfffffff window]
> > > [    0.692580] pci_bus 0000:00: root bus resource [mem
> > 0x4000000000-0x7fffffffff window]
> > > [    0.692581] pci_bus 0000:00: root bus resource [bus 00-fe]
> > > [    0.692868] pci 0000:00:00.0: [8086:4621] type 00 class 0x060000
> > conventional PCI endpoint
> > > [    0.693054] pci 0000:00:02.0: [8086:46a6] type 00 class 0x030000
> > PCIe Root Complex Integrated Endpoint
> > > [    0.693062] pci 0000:00:02.0: BAR 0 [mem 0x603c000000-
> > 0x603cffffff 64bit]
> > > [    0.693067] pci 0000:00:02.0: BAR 2 [mem 0x4000000000-
> > 0x400fffffff 64bit pref]
> > > [    0.693070] pci 0000:00:02.0: BAR 4 [io  0x3000-0x303f]
> > > [    0.693084] pci 0000:00:02.0: DMAR: Skip IOMMU disabling for
> > graphics
> > > [    0.693086] pci 0000:00:02.0: Video device with shadowed ROM at
> > [mem 0x000c0000-0x000dffff]
> > > [    0.693109] pci 0000:00:02.0: VF BAR 0 [mem 0x00000000-
> > 0x00ffffff 64bit]
> > > [    0.693110] pci 0000:00:02.0: VF BAR 0 [mem 0x00000000-
> > 0x06ffffff 64bit]: contains BAR 0 for 7 VFs
> > > [    0.693114] pci 0000:00:02.0: VF BAR 2 [mem 0x00000000-
> > 0x1fffffff 64bit pref]
> > > [    0.693115] pci 0000:00:02.0: VF BAR 2 [mem 0x00000000-
> > 0xdfffffff 64bit pref]: contains BAR 2 for 7 VFs
> > > [    0.693336] pci 0000:00:06.0: [8086:464d] type 01 class 0x060400
> > PCIe Root Port
> > > [    0.693379] pci 0000:00:06.0: PCI bridge to [bus 01]
> > > [    0.693412] pci 0000:00:06.0:   bridge window [mem 0x84600000-
> > 0x846fffff]
> > > [    0.693547] pci 0000:00:06.0: PME# supported from D0 D3hot
> > D3cold
> > > [    0.693596] pci 0000:00:06.0: PTM enabled (root), 4ns
> > granularity
> > > [    0.694331] pci 0000:00:07.0: [8086:466e] type 01 class 0x060400
> > PCIe Root Port
> > > [    0.694351] pci 0000:00:07.0: PCI bridge to [bus 02-39]
> > > [    0.694355] pci 0000:00:07.0:   bridge window [mem 0x78000000-
> > 0x841fffff]
> > > [    0.694361] pci 0000:00:07.0:   bridge window [mem 0x6020000000-
> > 0x603bffffff 64bit pref]
> > > [    0.694383] pci 0000:00:07.0: Overriding RP PIO Log Size to 4
> > > [    0.694445] pci 0000:00:07.0: PME# supported from D0 D3hot
> > D3cold
> > > [    0.694469] pci 0000:00:07.0: PTM enabled (root), 4ns
> > granularity
> > > [    0.696553] pci 0000:00:07.2: [8086:462f] type 01 class 0x060400
> > PCIe Root Port
> > > [    0.696570] pci 0000:00:07.2: PCI bridge to [bus 3a-63]
> > > [    0.696574] pci 0000:00:07.2:   bridge window [mem 0x6a000000-
> > 0x761fffff]
> > > [    0.696580] pci 0000:00:07.2:   bridge window [mem 0x6000000000-
> > 0x601bffffff 64bit pref]
> > > [    0.696602] pci 0000:00:07.2: Overriding RP PIO Log Size to 4
> > > [    0.696664] pci 0000:00:07.2: PME# supported from D0 D3hot
> > D3cold
> > > [    0.696688] pci 0000:00:07.2: PTM enabled (root), 4ns
> > granularity
> > > [    0.698832] pci 0000:00:08.0: [8086:464f] type 00 class 0x088000
> > conventional PCI endpoint
> > > [    0.698840] pci 0000:00:08.0: BAR 0 [mem 0x603d1bb000-
> > 0x603d1bbfff 64bit]
> > > [    0.698934] pci 0000:00:0a.0: [8086:467d] type 00 class 0x118000
> > PCIe Root Complex Integrated Endpoint
> > > [    0.698941] pci 0000:00:0a.0: BAR 0 [mem 0x603d1a0000-
> > 0x603d1a7fff 64bit]
> > > [    0.698958] pci 0000:00:0a.0: enabling Extended Tags
> > > [    0.699060] pci 0000:00:0d.0: [8086:461e] type 00 class 0x0c0330
> > conventional PCI endpoint
> > > [    0.699069] pci 0000:00:0d.0: BAR 0 [mem 0x603d190000-
> > 0x603d19ffff 64bit]
> > > [    0.699109] pci 0000:00:0d.0: PME# supported from D3hot D3cold
> > > [    0.701032] pci 0000:00:0d.2: [8086:463e] type 00 class 0x0c0340
> > conventional PCI endpoint
> > > [    0.701045] pci 0000:00:0d.2: BAR 0 [mem 0x603d140000-
> > 0x603d17ffff 64bit]
> > > [    0.701051] pci 0000:00:0d.2: BAR 2 [mem 0x603d1ba000-
> > 0x603d1bafff 64bit]
> > > [    0.701083] pci 0000:00:0d.2: supports D1 D2
> > > [    0.701084] pci 0000:00:0d.2: PME# supported from D0 D1 D2 D3hot
> > D3cold
> > > [    0.701215] pci 0000:00:0d.3: [8086:466d] type 00 class 0x0c0340
> > conventional PCI endpoint
> > > [    0.701225] pci 0000:00:0d.3: BAR 0 [mem 0x603d100000-
> > 0x603d13ffff 64bit]
> > > [    0.701231] pci 0000:00:0d.3: BAR 2 [mem 0x603d1b9000-
> > 0x603d1b9fff 64bit]
> > > [    0.701260] pci 0000:00:0d.3: supports D1 D2
> > > [    0.701261] pci 0000:00:0d.3: PME# supported from D0 D1 D2 D3hot
> > D3cold
> > > [    0.701532] pci 0000:00:14.0: [8086:51ed] type 00 class 0x0c0330
> > conventional PCI endpoint
> > > [    0.701555] pci 0000:00:14.0: BAR 0 [mem 0x603d180000-
> > 0x603d18ffff 64bit]
> > > [    0.701655] pci 0000:00:14.0: PME# supported from D3hot D3cold
> > > [    0.703595] pci 0000:00:14.2: [8086:51ef] type 00 class 0x050000
> > conventional PCI endpoint
> > > [    0.703617] pci 0000:00:14.2: BAR 0 [mem 0x603d1b0000-
> > 0x603d1b3fff 64bit]
> > > [    0.703631] pci 0000:00:14.2: BAR 2 [mem 0x603d1b8000-
> > 0x603d1b8fff 64bit]
> > > [    0.703850] pci 0000:00:14.3: [8086:51f0] type 00 class 0x028000
> > PCIe Root Complex Integrated Endpoint
> > > [    0.703912] pci 0000:00:14.3: BAR 0 [mem 0x603d1ac000-
> > 0x603d1affff 64bit]
> > > [    0.707442] pci 0000:00:14.3: PME# supported from D0 D3hot
> > D3cold
> > > [    0.708349] pci 0000:00:15.0: [8086:51e8] type 00 class 0x0c8000
> > conventional PCI endpoint
> > > [    0.709079] pci 0000:00:15.0: BAR 0 [mem 0x00000000-0x00000fff
> > 64bit]
> > > [    0.712769] pci 0000:00:15.1: [8086:51e9] type 00 class 0x0c8000
> > conventional PCI endpoint
> > > [    0.713499] pci 0000:00:15.1: BAR 0 [mem 0x00000000-0x00000fff
> > 64bit]
> > > [    0.716748] pci 0000:00:16.0: [8086:51e0] type 00 class 0x078000
> > conventional PCI endpoint
> > > [    0.716773] pci 0000:00:16.0: BAR 0 [mem 0x603d1b5000-
> > 0x603d1b5fff 64bit]
> > > [    0.716868] pci 0000:00:16.0: PME# supported from D3hot
> > > [    0.717491] pci 0000:00:17.0: [8086:51d3] type 00 class 0x010601
> > conventional PCI endpoint
> > > [    0.717511] pci 0000:00:17.0: BAR 0 [mem 0x84700000-0x84701fff]
> > > [    0.717522] pci 0000:00:17.0: BAR 1 [mem 0x84703000-0x847030ff]
> > > [    0.717533] pci 0000:00:17.0: BAR 2 [io  0x3090-0x3097]
> > > [    0.717543] pci 0000:00:17.0: BAR 3 [io  0x3080-0x3083]
> > > [    0.717554] pci 0000:00:17.0: BAR 4 [io  0x3060-0x307f]
> > > [    0.717564] pci 0000:00:17.0: BAR 5 [mem 0x84702000-0x847027ff]
> > > [    0.717645] pci 0000:00:17.0: PME# supported from D3hot
> > > [    0.718046] pci 0000:00:1d.0: [8086:51b0] type 01 class 0x060400
> > PCIe Root Port
> > > [    0.718078] pci 0000:00:1d.0: PCI bridge to [bus 64]
> > > [    0.718084] pci 0000:00:1d.0:   bridge window [mem 0x84400000-
> > 0x845fffff]
> > > [    0.718173] pci 0000:00:1d.0: PME# supported from D0 D3hot
> > D3cold
> > > [    0.718212] pci 0000:00:1d.0: PTM enabled (root), 4ns
> > granularity
> > > [    0.718877] pci 0000:00:1d.2: [8086:51b2] type 01 class 0x060400
> > PCIe Root Port
> > > [    0.718909] pci 0000:00:1d.2: PCI bridge to [bus 65]
> > > [    0.718915] pci 0000:00:1d.2:   bridge window [mem 0x84200000-
> > 0x843fffff]
> > > [    0.719004] pci 0000:00:1d.2: PME# supported from D0 D3hot
> > D3cold
> > > [    0.719043] pci 0000:00:1d.2: PTM enabled (root), 4ns
> > granularity
> > > [    0.719752] pci 0000:00:1f.0: [8086:5182] type 00 class 0x060100
> > conventional PCI endpoint
> > > [    0.720154] pci 0000:00:1f.3: [8086:51c8] type 00 class 0x040100
> > conventional PCI endpoint
> > > [    0.720216] pci 0000:00:1f.3: BAR 0 [mem 0x603d1a8000-
> > 0x603d1abfff 64bit]
> > > [    0.720290] pci 0000:00:1f.3: BAR 4 [mem 0x603d000000-
> > 0x603d0fffff 64bit]
> > > [    0.720451] pci 0000:00:1f.3: PME# supported from D3hot D3cold
> > > [    0.721057] pci 0000:00:1f.4: [8086:51a3] type 00 class 0x0c0500
> > conventional PCI endpoint
> > > [    0.721086] pci 0000:00:1f.4: BAR 0 [mem 0x603d1b4000-
> > 0x603d1b40ff 64bit]
> > > [    0.721112] pci 0000:00:1f.4: BAR 4 [io  0xefa0-0xefbf]
> > > [    0.721397] pci 0000:00:1f.5: [8086:51a4] type 00 class 0x0c8000
> > conventional PCI endpoint
> > > [    0.721419] pci 0000:00:1f.5: BAR 0 [mem 0xfe010000-0xfe010fff]
> > > [    0.722353] pci 0000:01:00.0: [15b7:5030] type 00 class 0x010802
> > PCIe Endpoint
> > > [    0.722365] pci 0000:01:00.0: BAR 0 [mem 0x84600000-0x84603fff
> > 64bit]
> > > [    0.722554] pci 0000:00:06.0: PCI bridge to [bus 01]
> > > [    0.722587] pci 0000:00:07.0: PCI bridge to [bus 02-39]
> > > [    0.722619] pci 0000:00:07.2: PCI bridge to [bus 3a-63]
> > > [    0.722800] pci 0000:64:00.0: [8086:15f3] type 00 class 0x020000
> > PCIe Endpoint
> > > [    0.722819] pci 0000:64:00.0: BAR 0 [mem 0x84400000-0x844fffff]
> > > [    0.722844] pci 0000:64:00.0: BAR 3 [mem 0x84500000-0x84503fff]
> > > [    0.722977] pci 0000:64:00.0: PME# supported from D0 D3hot
> > D3cold
> > > [    0.723313] pci 0000:00:1d.0: PCI bridge to [bus 64]
> > > [    0.723788] pci 0000:65:00.0: [8086:125c] type 00 class 0x020000
> > PCIe Endpoint
> > > [    0.723806] pci 0000:65:00.0: BAR 0 [mem 0x84200000-0x842fffff]
> > > [    0.723831] pci 0000:65:00.0: BAR 3 [mem 0x84300000-0x84303fff]
> > > [    0.723963] pci 0000:65:00.0: PME# supported from D0 D3hot
> > D3cold
> > > [    0.724773] pci 0000:00:1d.2: PCI bridge to [bus 65]
> > > [    0.731129] ACPI: PCI: Interrupt link LNKA configured for IRQ 0
> > > [    0.731229] ACPI: PCI: Interrupt link LNKB configured for IRQ 1
> > > [    0.731327] ACPI: PCI: Interrupt link LNKC configured for IRQ 0
> > > [    0.731425] ACPI: PCI: Interrupt link LNKD configured for IRQ 0
> > > [    0.731523] ACPI: PCI: Interrupt link LNKE configured for IRQ 0
> > > [    0.731621] ACPI: PCI: Interrupt link LNKF configured for IRQ 0
> > > [    0.731719] ACPI: PCI: Interrupt link LNKG configured for IRQ 0
> > > [    0.731816] ACPI: PCI: Interrupt link LNKH configured for IRQ 0
> > > [    1.109516] Low-power S0 idle used by default for system suspend
> > > [    1.116947] ACPI: EC: interrupt unblocked
> > > [    1.116948] ACPI: EC: event unblocked
> > > [    1.116974] ACPI: EC: EC_CMD/EC_SC=0x66, EC_DATA=0x62
> > > [    1.116975] ACPI: EC: GPE=0x6e
> > > [    1.116977] ACPI: \_SB_.PC00.LPCB.EC0_: Boot DSDT EC
> > initialization complete
> > > [    1.116978] ACPI: \_SB_.PC00.LPCB.EC0_: EC: Used to handle
> > transactions and events
> > > [    1.117430] iommu: Default domain type: Translated
> > > [    1.117430] iommu: DMA domain TLB invalidation policy: lazy mode
> > > [    1.117501] SCSI subsystem initialized
> > > [    1.117507] libata version 3.00 loaded.
> > > [    1.117507] ACPI: bus type USB registered
> > > [    1.117507] usbcore: registered new interface driver usbfs
> > > [    1.117507] usbcore: registered new interface driver hub
> > > [    1.117507] usbcore: registered new device driver usb
> > > [    1.117507] EDAC MC: Ver: 3.0.0
> > > [    1.120822] efivars: Registered efivars operations
> > > [    1.120945] NetLabel: Initializing
> > > [    1.120946] NetLabel:  domain hash size = 128
> > > [    1.120947] NetLabel:  protocols = UNLABELED CIPSOv4 CALIPSO
> > > [    1.120965] NetLabel:  unlabeled traffic allowed by default
> > > [    1.120970] mctp: management component transport protocol core
> > > [    1.120971] NET: Registered PF_MCTP protocol family
> > > [    1.120974] PCI: Using ACPI for IRQ routing
> > > [    1.188171] PCI: pci_cache_line_size set to 64 bytes
> > > [    1.189575] pci 0000:00:1f.5: BAR 0 [mem 0xfe010000-0xfe010fff]: 
> > can't claim; no compatible bridge window
> > > [    1.190227] e820: reserve RAM buffer [mem 0x0009e000-0x0009ffff]
> > > [    1.190229] e820: reserve RAM buffer [mem 0x43ea7000-0x43ffffff]
> > > [    1.190230] e820: reserve RAM buffer [mem 0x444e6000-0x47ffffff]
> > > [    1.190231] e820: reserve RAM buffer [mem 0x4dd46000-0x4fffffff]
> > > [    1.190232] e820: reserve RAM buffer [mem 0x5a800000-0x5bffffff]
> > > [    1.190233] e820: reserve RAM buffer [mem 0x1097800000-
> > 0x1097ffffff]
> > > [    1.190766] pci 0000:00:02.0: vgaarb: setting as boot VGA device
> > > [    1.190766] pci 0000:00:02.0: vgaarb: bridge control possible
> > > [    1.190766] pci 0000:00:02.0: vgaarb: VGA device added:
> > decodes=io+mem,owns=io+mem,locks=none
> > > [    1.190766] vgaarb: loaded
> > > [    1.190802] clocksource: Switched to clocksource tsc-early
> > > [    1.191172] VFS: Disk quotas dquot_6.6.0
> > > [    1.191181] VFS: Dquot-cache hash table entries: 512 (order 0,
> > 4096 bytes)
> > > [    1.191242] pnp: PnP ACPI init
> > > [    1.191703] system 00:00: [io  0x0a00-0x0a0f] has been reserved
> > > [    1.191706] system 00:00: [io  0x0a10-0x0a2f] has been reserved
> > > [    1.191707] system 00:00: [io  0x0a30-0x0a4f] has been reserved
> > > [    1.191708] system 00:00: [io  0x0a50-0x0a6f] has been reserved
> > > [    1.191709] system 00:00: [io  0x0a70-0x0a7f] has been reserved
> > > [    1.191710] system 00:00: [io  0x0a80-0x0a8f] has been reserved
> > > [    1.191832] system 00:01: [io  0x0680-0x069f] has been reserved
> > > [    1.191834] system 00:01: [io  0x164e-0x164f] has been reserved
> > > [    1.191943] system 00:02: [io  0x1854-0x1857] has been reserved
> > > [    1.192669] pnp 00:03: disabling [mem 0xc0000000-0xcfffffff]
> > because it overlaps 0000:00:02.0 BAR 9 [mem 0x00000000-0xdfffffff
> > 64bit pref]
> > > [    1.192693] system 00:03: [mem 0xfedc0000-0xfedc7fff] has been
> > reserved
> > > [    1.192694] system 00:03: [mem 0xfeda0000-0xfeda0fff] has been
> > reserved
> > > [    1.192696] system 00:03: [mem 0xfeda1000-0xfeda1fff] has been
> > reserved
> > > [    1.192697] system 00:03: [mem 0xfed20000-0xfed7ffff] could not
> > be reserved
> > > [    1.192698] system 00:03: [mem 0xfed90000-0xfed93fff] could not
> > be reserved
> > > [    1.192699] system 00:03: [mem 0xfed45000-0xfed8ffff] could not
> > be reserved
> > > [    1.192700] system 00:03: [mem 0xfee00000-0xfeefffff] could not
> > be reserved
> > > [    1.195625] system 00:04: [io  0x2000-0x20fe] has been reserved
> > > [    1.196381] pnp: PnP ACPI: found 6 devices
> > > [    1.201970] clocksource: acpi_pm: mask: 0xffffff max_cycles:
> > 0xffffff, max_idle_ns: 2085701024 ns
> > > [    1.202017] NET: Registered PF_INET protocol family
> > > [    1.202177] IP idents hash table entries: 262144 (order: 9,
> > 2097152 bytes, linear)
> > > [    1.215397] tcp_listen_portaddr_hash hash table entries: 32768
> > (order: 7, 524288 bytes, linear)
> > > [    1.215446] Table-perturb hash table entries: 65536 (order: 6,
> > 262144 bytes, linear)
> > > [    1.215777] TCP established hash table entries: 524288 (order:
> > 10, 4194304 bytes, linear)
> > > [    1.216299] TCP bind hash table entries: 65536 (order: 9,
> > 2097152 bytes, linear)
> > > [    1.216406] TCP: Hash tables configured (established 524288 bind
> > 65536)
> > > [    1.216608] MPTCP token hash table entries: 65536 (order: 8,
> > 1572864 bytes, linear)
> > > [    1.216758] UDP hash table entries: 32768 (order: 8, 1048576
> > bytes, linear)
> > > [    1.216899] UDP-Lite hash table entries: 32768 (order: 8,
> > 1048576 bytes, linear)
> > > [    1.217011] NET: Registered PF_UNIX/PF_LOCAL protocol family
> > > [    1.217017] NET: Registered PF_XDP protocol family
> > > [    1.217024] pci 0000:00:07.0: bridge window [io  0x1000-0x0fff]
> > to [bus 02-39] add_size 1000
> > > [    1.217028] pci 0000:00:07.2: bridge window [io  0x1000-0x0fff]
> > to [bus 3a-63] add_size 1000
> > > [    1.217038] pci 0000:00:02.0: VF BAR 2 [mem 0x4020000000-
> > 0x40ffffffff 64bit pref]: assigned
> > > [    1.217042] pci 0000:00:02.0: VF BAR 0 [mem 0x4010000000-
> > 0x4016ffffff 64bit]: assigned
> > > [    1.217045] pci 0000:00:07.0: bridge window [io  0x4000-0x4fff]: 
> > assigned
> > > [    1.217047] pci 0000:00:07.2: bridge window [io  0x5000-0x5fff]: 
> > assigned
> > > [    1.217049] pci 0000:00:15.0: BAR 0 [mem 0x4017000000-
> > 0x4017000fff 64bit]: assigned
> > > [    1.217395] pci 0000:00:15.1: BAR 0 [mem 0x4017001000-
> > 0x4017001fff 64bit]: assigned
> > > [    1.217735] pci 0000:00:1f.5: BAR 0 [mem 0x68800000-0x68800fff]: 
> > assigned
> > > [    1.217752] pci 0000:00:06.0: PCI bridge to [bus 01]
> > > [    1.217777] pci 0000:00:06.0:   bridge window [mem 0x84600000-
> > 0x846fffff]
> > > [    1.217810] pci 0000:00:07.0: PCI bridge to [bus 02-39]
> > > [    1.217812] pci 0000:00:07.0:   bridge window [io  0x4000-
> > 0x4fff]
> > > [    1.217814] pci 0000:00:07.0:   bridge window [mem 0x78000000-
> > 0x841fffff]
> > > [    1.217817] pci 0000:00:07.0:   bridge window [mem 0x6020000000-
> > 0x603bffffff 64bit pref]
> > > [    1.217820] pci 0000:00:07.2: PCI bridge to [bus 3a-63]
> > > [    1.217821] pci 0000:00:07.2:   bridge window [io  0x5000-
> > 0x5fff]
> > > [    1.217824] pci 0000:00:07.2:   bridge window [mem 0x6a000000-
> > 0x761fffff]
> > > [    1.217826] pci 0000:00:07.2:   bridge window [mem 0x6000000000-
> > 0x601bffffff 64bit pref]
> > > [    1.217830] pci 0000:00:1d.0: PCI bridge to [bus 64]
> > > [    1.217848] pci 0000:00:1d.0:   bridge window [mem 0x84400000-
> > 0x845fffff]
> > > [    1.217855] pci 0000:00:1d.2: PCI bridge to [bus 65]
> > > [    1.217859] pci 0000:00:1d.2:   bridge window [mem 0x84200000-
> > 0x843fffff]
> > > [    1.217867] pci_bus 0000:00: resource 4 [io  0x0000-0x0cf7
> > window]
> > > [    1.217868] pci_bus 0000:00: resource 5 [io  0x0d00-0xffff
> > window]
> > > [    1.217869] pci_bus 0000:00: resource 6 [mem 0x000a0000-
> > 0x000bffff window]
> > > [    1.217871] pci_bus 0000:00: resource 7 [mem 0x000e0000-
> > 0x000fffff window]
> > > [    1.217872] pci_bus 0000:00: resource 8 [mem 0x68800000-
> > 0xbfffffff window]
> > > [    1.217873] pci_bus 0000:00: resource 9 [mem 0x4000000000-
> > 0x7fffffffff window]
> > > [    1.217874] pci_bus 0000:01: resource 1 [mem 0x84600000-
> > 0x846fffff]
> > > [    1.217875] pci_bus 0000:02: resource 0 [io  0x4000-0x4fff]
> > > [    1.217876] pci_bus 0000:02: resource 1 [mem 0x78000000-
> > 0x841fffff]
> > > [    1.217877] pci_bus 0000:02: resource 2 [mem 0x6020000000-
> > 0x603bffffff 64bit pref]
> > > [    1.217878] pci_bus 0000:3a: resource 0 [io  0x5000-0x5fff]
> > > [    1.217879] pci_bus 0000:3a: resource 1 [mem 0x6a000000-
> > 0x761fffff]
> > > [    1.217880] pci_bus 0000:3a: resource 2 [mem 0x6000000000-
> > 0x601bffffff 64bit pref]
> > > [    1.217881] pci_bus 0000:64: resource 1 [mem 0x84400000-
> > 0x845fffff]
> > > [    1.217883] pci_bus 0000:65: resource 1 [mem 0x84200000-
> > 0x843fffff]
> > > [    1.219810] PCI: CLS 64 bytes, default 64
> > > [    1.219841] DMAR: Intel-IOMMU force enabled due to platform opt
> > in
> > > [    1.219847] DMAR: No ATSR found
> > > [    1.219848] DMAR: No SATC found
> > > [    1.219849] DMAR: IOMMU feature fl1gp_support inconsistent
> > > [    1.219850] DMAR: IOMMU feature pgsel_inv inconsistent
> > > [    1.219851] DMAR: IOMMU feature nwfs inconsistent
> > > [    1.219851] DMAR: IOMMU feature dit inconsistent
> > > [    1.219852] DMAR: IOMMU feature sc_support inconsistent
> > > [    1.219853] DMAR: IOMMU feature dev_iotlb_support inconsistent
> > > [    1.219854] DMAR: dmar0: Using Queued invalidation
> > > [    1.219857] DMAR: dmar1: Using Queued invalidation
> > > [    1.219962] Trying to unpack rootfs image as initramfs...
> > > [    1.220076] pci 0000:00:02.0: Adding to iommu group 0
> > > [    1.220106] pci 0000:00:00.0: Adding to iommu group 1
> > > [    1.220117] pci 0000:00:06.0: Adding to iommu group 2
> > > [    1.220125] pci 0000:00:07.0: Adding to iommu group 3
> > > [    1.220133] pci 0000:00:07.2: Adding to iommu group 4
> > > [    1.220142] pci 0000:00:08.0: Adding to iommu group 5
> > > [    1.220150] pci 0000:00:0a.0: Adding to iommu group 6
> > > [    1.220165] pci 0000:00:0d.0: Adding to iommu group 7
> > > [    1.220172] pci 0000:00:0d.2: Adding to iommu group 7
> > > [    1.220178] pci 0000:00:0d.3: Adding to iommu group 7
> > > [    1.220192] pci 0000:00:14.0: Adding to iommu group 8
> > > [    1.220199] pci 0000:00:14.2: Adding to iommu group 8
> > > [    1.220206] pci 0000:00:14.3: Adding to iommu group 9
> > > [    1.220218] pci 0000:00:15.0: Adding to iommu group 10
> > > [    1.220226] pci 0000:00:15.1: Adding to iommu group 10
> > > [    1.220236] pci 0000:00:16.0: Adding to iommu group 11
> > > [    1.220243] pci 0000:00:17.0: Adding to iommu group 12
> > > [    1.220266] pci 0000:00:1d.0: Adding to iommu group 13
> > > [    1.220282] pci 0000:00:1d.2: Adding to iommu group 14
> > > [    1.220300] pci 0000:00:1f.0: Adding to iommu group 15
> > > [    1.220308] pci 0000:00:1f.3: Adding to iommu group 15
> > > [    1.220316] pci 0000:00:1f.4: Adding to iommu group 15
> > > [    1.220323] pci 0000:00:1f.5: Adding to iommu group 15
> > > [    1.220331] pci 0000:01:00.0: Adding to iommu group 16
> > > [    1.220354] pci 0000:64:00.0: Adding to iommu group 17
> > > [    1.220381] pci 0000:65:00.0: Adding to iommu group 18
> > > [    1.220523] DMAR: Intel(R) Virtualization Technology for
> > Directed I/O
> > > [    1.220524] PCI-DMA: Using software bounce buffering for IO
> > (SWIOTLB)
> > > [    1.220525] software IO TLB: mapped [mem 0x00000000359f8000-
> > 0x00000000399f8000] (64MB)
> > > [    1.220564] clocksource: tsc: mask: 0xffffffffffffffff
> > max_cycles: 0x23fa772cf26, max_idle_ns: 440795269835 ns
> > > [    1.220616] clocksource: Switched to clocksource tsc
> > > [    1.220637] platform rtc_cmos: registered platform RTC device
> > (no PNP device found)
> > > [    1.227245] Initialise system trusted keyrings
> > > [    1.227255] Key type blacklist registered
> > > [    1.227295] workingset: timestamp_bits=41 max_order=24
> > bucket_order=0
> > > [    1.227305] zbud: loaded
> > > [    1.227417] fuse: init (API version 7.40)
> > > [    1.227488] integrity: Platform Keyring initialized
> > > [    1.227490] integrity: Machine keyring initialized
> > > [    1.236155] Key type asymmetric registered
> > > [    1.236158] Asymmetric key parser 'x509' registered
> > > [    1.236181] Block layer SCSI generic (bsg) driver version 0.4
> > loaded (major 246)
> > > [    1.236262] io scheduler mq-deadline registered
> > > [    1.236263] io scheduler kyber registered
> > > [    1.236272] io scheduler bfq registered
> > > [    1.236870] pcieport 0000:00:06.0: PME: Signaling with IRQ 122
> > > [    1.237101] pcieport 0000:00:07.0: PME: Signaling with IRQ 123
> > > [    1.237117] pcieport 0000:00:07.0: pciehp: Slot #3 AttnBtn-
> > PwrCtrl- MRL- AttnInd- PwrInd- HotPlug+ Surprise+ Interlock- NoCompl+
> > IbPresDis- LLActRep+
> > > [    1.237433] pcieport 0000:00:07.2: PME: Signaling with IRQ 124
> > > [    1.237449] pcieport 0000:00:07.2: pciehp: Slot #5 AttnBtn-
> > PwrCtrl- MRL- AttnInd- PwrInd- HotPlug+ Surprise+ Interlock- NoCompl+
> > IbPresDis- LLActRep+
> > > [    1.237758] pcieport 0000:00:1d.0: PME: Signaling with IRQ 125
> > > [    1.238027] pcieport 0000:00:1d.2: PME: Signaling with IRQ 126
> > > [    1.238133] shpchp: Standard Hot Plug PCI Controller Driver
> > version: 0.4
> > > [    1.238900] input: Sleep Button as
> > /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0E:00/input/input0
> > > [    1.238922] ACPI: button: Sleep Button [SLPB]
> > > [    1.238952] input: Power Button as
> > /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0C:00/input/input1
> > > [    1.238963] ACPI: button: Power Button [PWRB]
> > > [    1.238982] input: Power Button as
> > /devices/LNXSYSTM:00/LNXPWRBN:00/input/input2
> > > [    1.239063] ACPI: button: Power Button [PWRF]
> > > [    1.243545] thermal LNXTHERM:00: registered as thermal_zone0
> > > [    1.243547] ACPI: thermal: Thermal Zone [TZ00] (54 C)
> > > [    1.243835] Serial: 8250/16550 driver, 32 ports, IRQ sharing
> > enabled
> > > [    1.245729] hpet_acpi_add: no address or irqs in _CRS
> > > [    1.245765] Non-volatile memory driver v1.3
> > > [    1.245766] Linux agpgart interface v0.103
> > > [    1.282118] ACPI: bus type drm_connector registered
> > > [    1.283317] Freeing initrd memory: 106196K
> > > [    1.284291] ahci 0000:00:17.0: version 3.0
> > > [    1.284668] ahci 0000:00:17.0: AHCI vers 0001.0301, 32 command
> > slots, 6 Gbps, SATA mode
> > > [    1.284672] ahci 0000:00:17.0: 1/1 ports implemented (port mask
> > 0x2)
> > > [    1.284673] ahci 0000:00:17.0: flags: 64bit ncq sntf pm clo only
> > pio slum part deso sadm sds
> > > [    1.285087] scsi host0: ahci
> > > [    1.285169] scsi host1: ahci
> > > [    1.285197] ata1: DUMMY
> > > [    1.285212] ata2: SATA max UDMA/133 abar m2048 at 0x84702000 port
> > 0x84702180 irq 127 lpm-pol 4
> > > [    1.285284] usbcore: registered new interface driver
> > usbserial_generic
> > > [    1.285288] usbserial: USB Serial support registered for generic
> > > [    1.285358] rtc_cmos rtc_cmos: RTC can wake from S4
> > > [    1.287193] rtc_cmos rtc_cmos: registered as rtc0
> > > [    1.287570] rtc_cmos rtc_cmos: setting system clock to 2024-09-
> > 17T15:43:43 UTC (1726587823)
> > > [    1.287610] rtc_cmos rtc_cmos: alarms up to one month, y3k, 114
> > bytes nvram
> > > [    1.288735] intel_pstate: Intel P-state driver initializing
> > > [    1.290872] intel_pstate: HWP enabled
> > > [    1.291430] ledtrig-cpu: registered to indicate activity on CPUs
> > > [    1.291876] [drm] Initialized simpledrm 1.0.0 for simple-
> > framebuffer.0 on minor 0
> > > [    1.292353] fbcon: Deferring console take-over
> > > [    1.292358] simple-framebuffer simple-framebuffer.0: [drm] fb0:
> > simpledrmdrmfb frame buffer device
> > > [    1.292419] hid: raw HID events driver (C) Jiri Kosina
> > > [    1.292473] drop_monitor: Initializing network drop monitor
> > service
> > > [    1.292567] NET: Registered PF_INET6 protocol family
> > > [    1.296692] Segment Routing with IPv6
> > > [    1.296693] RPL Segment Routing with IPv6
> > > [    1.296704] In-situ OAM (IOAM) with IPv6
> > > [    1.296720] NET: Registered PF_PACKET protocol family
> > > [    1.299178] ENERGY_PERF_BIAS: Set to 'normal', was 'performance'
> > > [    1.299835] microcode: Current revision: 0x00000434
> > > [    1.299839] microcode: Updated early from: 0x0000042a
> > > [    1.300531] IPI shorthand broadcast: enabled
> > > [    1.301773] sched_clock: Marking stable (1284914767, 15597475)-
> > >(1326242945, -25730703)
> > > [    1.302178] registered taskstats version 1
> > > [    1.303378] Loading compiled-in X.509 certificates
> > > [    1.306147] Loaded X.509 cert 'Build time autogenerated kernel
> > key: cb8a38269e411cf2cea941e3c19d1521412bd34d'
> > > [    1.308962] zswap: loaded using pool zstd/zsmalloc
> > > [    1.309007] Demotion targets for Node 0: null
> > > [    1.309121] Key type .fscrypt registered
> > > [    1.309121] Key type fscrypt-provisioning registered
> > > [    1.309500] integrity: Loading X.509 certificate: UEFI:db
> > > [    1.309544] integrity: Loaded X.509 cert 'Microsoft Corporation
> > UEFI CA 2011: 13adbf4309bd82709c8cd54f316ed522988a1bd4'
> > > [    1.309544] integrity: Loading X.509 certificate: UEFI:db
> > > [    1.309551] integrity: Loaded X.509 cert 'Microsoft Windows
> > Production PCA 2011: a92902398e16c49778cd90f99e4f9ae17c55af53'
> > > [    1.309972] PM:   Magic number: 8:571:740
> > > [    1.311885] RAS: Correctable Errors collector initialized.
> > > [    1.599328] ata2: SATA link down (SStatus 4 SControl 300)
> > > [    1.601308] clk: Disabling unused clocks
> > > [    1.601325] PM: genpd: Disabling unused power domains
> > > [    1.609973] Freeing unused decrypted memory: 2028K
> > > [    1.610569] Freeing unused kernel image (initmem) memory: 3452K
> > > [    1.610578] Write protecting the kernel read-only data: 32768k
> > > [    1.611494] Freeing unused kernel image (rodata/data gap)
> > memory: 820K
> > > [    1.616342] x86/mm: Checked W+X mappings: passed, no W+X pages
> > found.
> > > [    1.616345] rodata_test: all tests were successful
> > > [    1.616356] Run /init as init process
> > > [    1.616357]   with arguments:
> > > [    1.616357]     /init
> > > [    1.616358]   with environment:
> > > [    1.616358]     HOME=/
> > > [    1.616359]     TERM=linux
> > > [    1.738727] xhci_hcd 0000:00:0d.0: xHCI Host Controller
> > > [    1.738738] xhci_hcd 0000:00:0d.0: new USB bus registered,
> > assigned bus number 1
> > > [    1.739793] xhci_hcd 0000:00:0d.0: hcc params 0x20007fc1 hci
> > version 0x120 quirks 0x0000000200009810
> > > [    1.740087] xhci_hcd 0000:00:0d.0: xHCI Host Controller
> > > [    1.740090] xhci_hcd 0000:00:0d.0: new USB bus registered,
> > assigned bus number 2
> > > [    1.740093] xhci_hcd 0000:00:0d.0: Host supports USB 3.2
> > Enhanced SuperSpeed
> > > [    1.740135] usb usb1: New USB device found, idVendor=1d6b,
> > idProduct=0002, bcdDevice= 6.11
> > > [    1.740139] usb usb1: New USB device strings: Mfr=3, Product=2,
> > SerialNumber=1
> > > [    1.740141] usb usb1: Product: xHCI Host Controller
> > > [    1.740142] usb usb1: Manufacturer: Linux 6.11.0-rc7-00001-
> > g0e2ad6528188-dirty xhci-hcd
> > > [    1.740144] usb usb1: SerialNumber: 0000:00:0d.0
> > > [    1.740282] hub 1-0:1.0: USB hub found
> > > [    1.740289] hub 1-0:1.0: 1 port detected
> > > [    1.740533] usb usb2: New USB device found, idVendor=1d6b,
> > idProduct=0003, bcdDevice= 6.11
> > > [    1.740535] usb usb2: New USB device strings: Mfr=3, Product=2,
> > SerialNumber=1
> > > [    1.740537] usb usb2: Product: xHCI Host Controller
> > > [    1.740538] usb usb2: Manufacturer: Linux 6.11.0-rc7-00001-
> > g0e2ad6528188-dirty xhci-hcd
> > > [    1.740539] usb usb2: SerialNumber: 0000:00:0d.0
> > > [    1.740628] hub 2-0:1.0: USB hub found
> > > [    1.740635] hub 2-0:1.0: 3 ports detected
> > > [    1.741581] xhci_hcd 0000:00:14.0: xHCI Host Controller
> > > [    1.741586] xhci_hcd 0000:00:14.0: new USB bus registered,
> > assigned bus number 3
> > > [    1.742720] xhci_hcd 0000:00:14.0: hcc params 0x20007fc1 hci
> > version 0x120 quirks 0x0000100200009810
> > > [    1.743083] xhci_hcd 0000:00:14.0: xHCI Host Controller
> > > [    1.743087] xhci_hcd 0000:00:14.0: new USB bus registered,
> > assigned bus number 4
> > > [    1.743089] xhci_hcd 0000:00:14.0: Host supports USB 3.1
> > Enhanced SuperSpeed
> > > [    1.743129] usb usb3: New USB device found, idVendor=1d6b,
> > idProduct=0002, bcdDevice= 6.11
> > > [    1.743131] usb usb3: New USB device strings: Mfr=3, Product=2,
> > SerialNumber=1
> > > [    1.743132] usb usb3: Product: xHCI Host Controller
> > > [    1.743133] usb usb3: Manufacturer: Linux 6.11.0-rc7-00001-
> > g0e2ad6528188-dirty xhci-hcd
> > > [    1.743134] usb usb3: SerialNumber: 0000:00:14.0
> > > [    1.743239] hub 3-0:1.0: USB hub found
> > > [    1.743267] hub 3-0:1.0: 12 ports detected
> > > [    1.745297] usb usb4: New USB device found, idVendor=1d6b,
> > idProduct=0003, bcdDevice= 6.11
> > > [    1.745299] usb usb4: New USB device strings: Mfr=3, Product=2,
> > SerialNumber=1
> > > [    1.745301] usb usb4: Product: xHCI Host Controller
> > > [    1.745302] usb usb4: Manufacturer: Linux 6.11.0-rc7-00001-
> > g0e2ad6528188-dirty xhci-hcd
> > > [    1.745302] usb usb4: SerialNumber: 0000:00:14.0
> > > [    1.745388] hub 4-0:1.0: USB hub found
> > > [    1.745410] hub 4-0:1.0: 4 ports detected
> > > [    1.761523] nvme 0000:01:00.0: platform quirk: setting simple
> > suspend
> > > [    1.761605] nvme nvme0: pci function 0000:01:00.0
> > > [    1.791467] nvme nvme0: 16/0/0 default/read/poll queues
> > > [    1.796102]  nvme0n1: p1 p2 p3
> > > [    1.992401] usb 3-4: new high-speed USB device number 2 using
> > xhci_hcd
> > > [    2.134739] usb 3-4: New USB device found, idVendor=05e3,
> > idProduct=0608, bcdDevice=88.32
> > > [    2.134746] usb 3-4: New USB device strings: Mfr=0, Product=1,
> > SerialNumber=0
> > > [    2.134748] usb 3-4: Product: USB2.0 Hub
> > > [    2.136254] hub 3-4:1.0: USB hub found
> > > [    2.136751] hub 3-4:1.0: 4 ports detected
> > > [    2.137612] usb: port power management may be unreliable
> > > [    2.203731] usb 2-1: new SuperSpeed USB device number 2 using
> > xhci_hcd
> > > [    2.237657] usb 2-1: New USB device found, idVendor=045e,
> > idProduct=0955, bcdDevice= 1.41
> > > [    2.237662] usb 2-1: New USB device strings: Mfr=1, Product=2,
> > SerialNumber=0
> > > [    2.237664] usb 2-1: Product: 4-Port USB 3.0 Hub
> > > [    2.237665] usb 2-1: Manufacturer: Generic
> > > [    2.245834] hub 2-1:1.0: USB hub found
> > > [    2.247480] hub 2-1:1.0: 2 ports detected
> > > [    2.255872] usb 4-1: new SuperSpeed USB device number 2 using
> > xhci_hcd
> > > [    2.275009] usb 4-1: New USB device found, idVendor=0e8d,
> > idProduct=7961, bcdDevice= 1.00
> > > [    2.275014] usb 4-1: New USB device strings: Mfr=6, Product=7,
> > SerialNumber=8
> > > [    2.275015] usb 4-1: Product: Wireless_Device
> > > [    2.275017] usb 4-1: Manufacturer: MediaTek Inc.
> > > [    2.275018] usb 4-1: SerialNumber: 000000000
> > > [    2.395819] usb 3-6: new high-speed USB device number 3 using
> > xhci_hcd
> > > [    2.469827] i915 0000:00:02.0: [drm] Found ALDERLAKE_P (device
> > ID 46a6) display version 13.00
> > > [    2.470484] i915 0000:00:02.0: [drm] VT-d active for gfx access
> > > [    2.526904] i915 0000:00:02.0: vgaarb: deactivate vga console
> > > [    2.527166] i915 0000:00:02.0: [drm] Using Transparent Hugepages
> > > [    2.529267] i915 0000:00:02.0: vgaarb: VGA decodes changed:
> > olddecodes=io+mem,decodes=io+mem:owns=io+mem
> > > [    2.534856] i915 0000:00:02.0: [drm] Finished loading DMC
> > firmware i915/adlp_dmc.bin (v2.20)
> > > [    2.535899] usb 2-1.1: new SuperSpeed USB device number 3 using
> > xhci_hcd
> > > [    2.557014] usb 3-6: New USB device found, idVendor=045e,
> > idProduct=0957, bcdDevice= 1.41
> > > [    2.557029] usb 3-6: New USB device strings: Mfr=1, Product=2,
> > SerialNumber=0
> > > [    2.557035] usb 3-6: Product: 4-Port USB 2.0 Hub
> > > [    2.557039] usb 3-6: Manufacturer: Generic
> > > [    2.557797] usb 2-1.1: New USB device found, idVendor=045e,
> > idProduct=0927, bcdDevice=31.00
> > > [    2.557814] usb 2-1.1: New USB device strings: Mfr=1, Product=2,
> > SerialNumber=6
> > > [    2.557819] usb 2-1.1: Product: Ethernet Adapter
> > > [    2.557823] usb 2-1.1: Manufacturer: Microsoft
> > > [    2.557826] usb 2-1.1: SerialNumber: 0013DF804
> > > [    2.561404] hub 3-6:1.0: USB hub found
> > > [    2.563028] hub 3-6:1.0: 2 ports detected
> > > [    2.645045] i915 0000:00:02.0: [drm] GT0: GuC firmware
> > i915/adlp_guc_70.bin version 70.29.2
> > > [    2.645051] i915 0000:00:02.0: [drm] GT0: HuC firmware
> > i915/tgl_huc.bin version 7.9.3
> > > [    2.659283] i915 0000:00:02.0: [drm] GT0: HuC: authenticated for
> > all workloads
> > > [    2.660460] i915 0000:00:02.0: [drm] GT0: GUC: submission
> > enabled
> > > [    2.660462] i915 0000:00:02.0: [drm] GT0: GUC: SLPC enabled
> > > [    2.661015] i915 0000:00:02.0: [drm] GT0: GUC: RC enabled
> > > [    2.662137] i915 0000:00:02.0: [drm] Protected Xe Path (PXP)
> > protected content support initialized
> > > [    2.689226] usb 3-7: new full-speed USB device number 4 using
> > xhci_hcd
> > > [    2.695739] [drm] Initialized i915 1.6.0 for 0000:00:02.0 on
> > minor 1
> > > [    2.698285] ACPI: video: Video Device [GFX0] (multi-head:
> > yes  rom: no  post: no)
> > > [    2.699207] input: Video Bus as
> > /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/LNXVIDEO:00/input/input3
> > > [    2.737465] fbcon: i915drmfb (fb0) is primary device
> > > [    2.737467] fbcon: Deferring console take-over
> > > [    2.737468] i915 0000:00:02.0: [drm] fb0: i915drmfb frame buffer
> > device
> > > [    2.835767] usb 3-7: New USB device found, idVendor=045e,
> > idProduct=0800, bcdDevice= 9.34
> > > [    2.835772] usb 3-7: New USB device strings: Mfr=1, Product=2,
> > SerialNumber=0
> > > [    2.835773] usb 3-7: Product: Microsoft? Nano Transceiver v2.0
> > > [    2.835775] usb 3-7: Manufacturer: Microsoft
> > > [    2.857652] usbcore: registered new interface driver usbhid
> > > [    2.857654] usbhid: USB HID core driver
> > > [    2.862052] input: Microsoft Microsoft? Nano Transceiver v2.0 as
> > /devices/pci0000:00/0000:00:14.0/usb3/3-7/3-
> > 7:1.0/0003:045E:0800.0001/input/input4
> > > [    2.965962] hid-generic 0003:045E:0800.0001: input,hidraw0: USB
> > HID v1.11 Keyboard [Microsoft Microsoft? Nano Transceiver v2.0] on
> > usb-0000:00:14.0-7/input0
> > > [    2.968229] input: Microsoft Microsoft? Nano Transceiver v2.0
> > Mouse as /devices/pci0000:00/0000:00:14.0/usb3/3-7/3-
> > 7:1.1/0003:045E:0800.0002/input/input5
> > > [    2.968393] input: Microsoft Microsoft? Nano Transceiver v2.0
> > Consumer Control as /devices/pci0000:00/0000:00:14.0/usb3/3-7/3-
> > 7:1.1/0003:045E:0800.0002/input/input6
> > > [    2.968554] hid-generic 0003:045E:0800.0002: input,hidraw1: USB
> > HID v1.11 Mouse [Microsoft Microsoft? Nano Transceiver v2.0] on usb-
> > 0000:00:14.0-7/input1
> > > [    2.968700] input: Microsoft Microsoft? Nano Transceiver v2.0
> > Consumer Control as /devices/pci0000:00/0000:00:14.0/usb3/3-7/3-
> > 7:1.2/0003:045E:0800.0003/input/input7
> > > [    3.022596] input: Microsoft Microsoft? Nano Transceiver v2.0
> > System Control as /devices/pci0000:00/0000:00:14.0/usb3/3-7/3-
> > 7:1.2/0003:045E:0800.0003/input/input9
> > > [    3.022920] hid-generic 0003:045E:0800.0003:
> > input,hiddev96,hidraw2: USB HID v1.11 Device [Microsoft Microsoft?
> > Nano Transceiver v2.0] on usb-0000:00:14.0-7/input2
> > > [    3.175304] PM: Image not found (code -22)
> > > [    3.196942] fbcon: Taking over console
> > > [    3.209556] Console: switching to colour frame buffer device
> > 240x67
> > > [    3.308676] EXT4-fs (nvme0n1p2): mounted filesystem 0420afc7-
> > 4947-4e2e-a096-b607b8b7fd93 r/w with ordered data mode. Quota mode:
> > none.
> > > [    3.367761] systemd[1]: systemd 256.6-1-arch running in system
> > mode (+PAM +AUDIT -SELINUX -APPARMOR -IMA +SMACK +SECCOMP +GCRYPT
> > +GNUTLS +OPENSSL +ACL +BLKID +CURL +ELFUTILS +FIDO2 +IDN2 -IDN +IPTC
> > +KMOD +LIBCRYPTSETUP +LIBCRYPTSETUP_PLUGINS +LIBFDISK +PCRE2
> > +PWQUALITY +P11KIT +QRENCODE +TPM2 +BZIP2 +LZ4 +XZ +ZLIB +ZSTD
> > +BPF_FRAMEWORK +XKBCOMMON +UTMP -SYSVINIT +LIBARCHIVE)
> > > [    3.367765] systemd[1]: Detected architecture x86-64.
> > > [    3.368553] systemd[1]: Hostname set to <mdp-archnuc>.
> > > [    3.611164] systemd[1]: bpf-restrict-fs: LSM BPF program
> > attached
> > > [    3.699797] systemd[1]: Queued start job for default target
> > Graphical Interface.
> > > [    3.753107] systemd[1]: Created slice Slice /system/dirmngr.
> > > [    3.753888] systemd[1]: Created slice Slice /system/getty.
> > > [    3.754461] systemd[1]: Created slice Slice /system/gpg-agent.
> > > [    3.755011] systemd[1]: Created slice Slice /system/gpg-agent-
> > browser.
> > > [    3.755524] systemd[1]: Created slice Slice /system/gpg-agent-
> > extra.
> > > [    3.755998] systemd[1]: Created slice Slice /system/gpg-agent-
> > ssh.
> > > [    3.756450] systemd[1]: Created slice Slice /system/keyboxd.
> > > [    3.756684] systemd[1]: Created slice Slice /system/modprobe.
> > > [    3.756803] systemd[1]: Created slice Slice /system/systemd-
> > fsck.
> > > [    3.756872] systemd[1]: Created slice User and Session Slice.
> > > [    3.756893] systemd[1]: Started Dispatch Password Requests to
> > Console Directory Watch.
> > > [    3.756908] systemd[1]: Started Forward Password Requests to
> > Wall Directory Watch.
> > > [    3.756982] systemd[1]: Set up automount Arbitrary Executable
> > File Formats File System Automount Point.
> > > [    3.756989] systemd[1]: Expecting device /dev/disk/by-uuid/EF7B-
> > A70B...
> > > [    3.756993] systemd[1]: Expecting device /dev/disk/by-
> > uuid/efa73f2d-495d-448d-a0f0-dd425258b7e5...
> > > [    3.756999] systemd[1]: Reached target Local Encrypted Volumes.
> > > [    3.757005] systemd[1]: Reached target Login Prompts.
> > > [    3.757011] systemd[1]: Reached target Local Integrity Protected
> > Volumes.
> > > [    3.757020] systemd[1]: Reached target Path Units.
> > > [    3.757027] systemd[1]: Reached target Remote File Systems.
> > > [    3.757031] systemd[1]: Reached target Slice Units.
> > > [    3.757043] systemd[1]: Reached target Local Verity Protected
> > Volumes.
> > > [    3.757076] systemd[1]: Listening on Device-mapper event daemon
> > FIFOs.
> > > [    3.760193] systemd[1]: Listening on Process Core Dump Socket.
> > > [    3.760919] systemd[1]: Listening on Credential
> > Encryption/Decryption.
> > > [    3.761003] systemd[1]: Listening on Journal Socket (/dev/log).
> > > [    3.761058] systemd[1]: Listening on Journal Sockets.
> > > [    3.761093] systemd[1]: TPM PCR Measurements was skipped because
> > of an unmet condition check (ConditionSecurity=measured-uki).
> > > [    3.761109] systemd[1]: Make TPM PCR Policy was skipped because
> > of an unmet condition check (ConditionSecurity=measured-uki).
> > > [    3.761165] systemd[1]: Listening on udev Control Socket.
> > > [    3.761202] systemd[1]: Listening on udev Kernel Socket.
> > > [    3.762311] systemd[1]: Mounting Huge Pages File System...
> > > [    3.763074] systemd[1]: Mounting POSIX Message Queue File
> > System...
> > > [    3.763792] systemd[1]: Mounting Kernel Debug File System...
> > > [    3.764350] systemd[1]: Mounting Kernel Trace File System...
> > > [    3.765317] systemd[1]: Starting Create List of Static Device
> > Nodes...
> > > [    3.766158] systemd[1]: Starting Load Kernel Module configfs...
> > > [    3.766682] systemd[1]: Starting Load Kernel Module dm_mod...
> > > [    3.767934] systemd[1]: Starting Load Kernel Module drm...
> > > [    3.769088] systemd[1]: Starting Load Kernel Module fuse...
> > > [    3.770335] systemd[1]: Starting Load Kernel Module loop...
> > > [    3.770384] systemd[1]: File System Check on Root Device was
> > skipped because of an unmet condition check
> > (ConditionPathIsReadWrite=!/).
> > > [    3.770425] systemd[1]: Clear Stale Hibernate Storage Info was
> > skipped because of an unmet condition check
> > (ConditionPathExists=/sys/firmware/efi/efivars/HibernateLocation-
> > 8cf2644b-4b0b-428f-9387-6d876050dc67).
> > > [    3.772057] systemd[1]: Starting Journal Service...
> > > [    3.772971] systemd[1]: Starting Load Kernel Modules...
> > > [    3.772986] systemd[1]: TPM PCR Machine ID Measurement was
> > skipped because of an unmet condition check
> > (ConditionSecurity=measured-uki).
> > > [    3.773641] systemd[1]: Starting Remount Root and Kernel File
> > Systems...
> > > [    3.773677] systemd[1]: Early TPM SRK Setup was skipped because
> > of an unmet condition check (ConditionSecurity=measured-uki).
> > > [    3.774224] systemd[1]: Starting Load udev Rules from
> > Credentials...
> > > [    3.774948] systemd[1]: Starting Coldplug All udev Devices...
> > > [    3.777379] systemd[1]: Mounted Huge Pages File System.
> > > [    3.777453] systemd[1]: Mounted POSIX Message Queue File System.
> > > [    3.777510] systemd[1]: Mounted Kernel Debug File System.
> > > [    3.777561] systemd[1]: Mounted Kernel Trace File System.
> > > [    3.777759] systemd[1]: Finished Create List of Static Device
> > Nodes.
> > > [    3.777978] systemd[1]: modprobe at configfs.service: Deactivated
> > successfully.
> > > [    3.778112] systemd[1]: Finished Load Kernel Module configfs.
> > > [    3.778286] systemd[1]: modprobe at drm.service: Deactivated
> > successfully.
> > > [    3.778411] systemd[1]: Finished Load Kernel Module drm.
> > > [    3.778575] systemd[1]: modprobe at fuse.service: Deactivated
> > successfully.
> > > [    3.778688] systemd[1]: Finished Load Kernel Module fuse.
> > > [    3.779305] systemd[1]: Mounting FUSE Control File System...
> > > [    3.780063] systemd[1]: Mounting Kernel Configuration File
> > System...
> > > [    3.780929] systemd[1]: Starting Create Static Device Nodes in
> > /dev gracefully...
> > > [    3.782976] systemd[1]: Finished Load udev Rules from
> > Credentials.
> > > [    3.783391] loop: module loaded
> > > [    3.784044] systemd[1]: modprobe at loop.service: Deactivated
> > successfully.
> > > [    3.784330] systemd[1]: Finished Load Kernel Module loop.
> > > [    3.785492] systemd[1]: Mounted FUSE Control File System.
> > > [    3.785629] systemd[1]: Mounted Kernel Configuration File
> > System.
> > > [    3.785810] systemd-journald[395]: Collecting audit messages is
> > disabled.
> > > [    3.798212] i2c_dev: i2c /dev entries driver
> > > [    3.799115] systemd[1]: Finished Load Kernel Modules.
> > > [    3.799850] systemd[1]: Starting Apply Kernel Variables...
> > > [    3.799991] device-mapper: uevent: version 1.0.3
> > > [    3.800058] device-mapper: ioctl: 4.48.0-ioctl (2023-03-01)
> > initialised: dm-devel at lists.linux.dev
> > > [    3.800371] systemd[1]: modprobe at dm_mod.service: Deactivated
> > successfully.
> > > [    3.800462] systemd[1]: Finished Load Kernel Module dm_mod.
> > > [    3.800633] systemd[1]: Repartition Root Disk was skipped
> > because no trigger condition checks were met.
> > > [    3.805467] systemd[1]: Finished Create Static Device Nodes in
> > /dev gracefully.
> > > [    3.806389] systemd[1]: Finished Apply Kernel Variables.
> > > [    3.806887] systemd[1]: Started Journal Service.
> > > [    3.832625] EXT4-fs (nvme0n1p2): re-mounted 0420afc7-4947-4e2e-
> > a096-b607b8b7fd93 r/w. Quota mode: none.
> > > [    3.840126] systemd-journald[395]: Received client request to
> > flush runtime journal.
> > > [    3.843896] Adding 67108860k swap on /swapfile.  Priority:-2
> > extents:86 across:334987260k SS
> > > [    3.946711] mc: Linux media interface: v0.10
> > > [    3.950655] mousedev: PS/2 mouse device common for all mice
> > > [    3.971833] resource: resource sanity check: requesting [mem
> > 0x00000000fedc0000-0x00000000fedcffff], which spans more than pnp
> > 00:03 [mem 0xfedc0000-0xfedc7fff]
> > > [    3.971839] caller igen6_probe+0x15e/0x7c0 [igen6_edac] mapping
> > multiple BARs
> > > [    3.975353] EDAC MC0: Giving out device to module igen6_edac
> > controller Intel_client_SoC MC#0: DEV 0000:00:00.0 (INTERRUPT)
> > > [    3.975402] EDAC MC1: Giving out device to module igen6_edac
> > controller Intel_client_SoC MC#1: DEV 0000:00:00.0 (INTERRUPT)
> > > [    3.975427] EDAC igen6 MC0: HANDLING IBECC MEMORY ERROR
> > > [    3.975428] EDAC igen6 MC0: ADDR 0x7fffffffe0
> > > [    3.975454] intel_pmc_core INT33A1:00:  initialized
> > > [    3.975552] EDAC igen6 MC1: HANDLING IBECC MEMORY ERROR
> > > [    3.975556] EDAC igen6 MC1: ADDR 0x7fffffffe0
> > > [    3.976644] EDAC igen6: v2.5.1
> > > [    3.985687] videodev: Linux video capture interface: v2.00
> > > [    3.985762] pps_core: LinuxPPS API ver. 1 registered
> > > [    3.985765] pps_core: Software ver. 5.3.6 - Copyright 2005-2007
> > Rodolfo Giometti <giometti at linux.it>
> > > [    3.988981] input: PC Speaker as
> > /devices/platform/pcspkr/input/input10
> > > [    3.996243] PTP clock support registered
> > > [    3.999181] mei_me 0000:00:16.0: enabling device (0000 -> 0002)
> > > [    4.000730] i801_smbus 0000:00:1f.4: enabling device (0000 ->
> > 0003)
> > > [    4.001128] i801_smbus 0000:00:1f.4: SPD Write Disable is set
> > > [    4.001184] i801_smbus 0000:00:1f.4: SMBus using PCI interrupt
> > > [    4.004969] i2c i2c-13: Successfully instantiated SPD at 0x50
> > > [    4.008414] intel-lpss 0000:00:15.0: enabling device (0004 ->
> > 0006)
> > > [    4.008861] idma64 idma64.0: Found Intel integrated DMA 64-bit
> > > [    4.027139] Serial bus multi instantiate pseudo device driver
> > INT3515:00: error -ENXIO: IRQ index 1 not found
> > > [    4.027145] Serial bus multi instantiate pseudo device driver
> > INT3515:00: error -ENXIO: Error requesting irq at index 1
> > > [    4.029512] ACPI: bus type thunderbolt registered
> > > [    4.032631] Intel(R) 2.5G Ethernet Linux Driver
> > > [    4.032634] Copyright(c) 2018 Intel Corporation.
> > > [    4.032751] igc 0000:64:00.0: enabling device (0000 -> 0002)
> > > [    4.033014] igc 0000:64:00.0: PTM enabled, 4ns granularity
> > > [    4.038479] intel-lpss 0000:00:15.1: enabling device (0004 ->
> > 0006)
> > > [    4.038818] idma64 idma64.1: Found Intel integrated DMA 64-bit
> > > [    4.047090] Creating 1 MTD partitions on "0000:00:1f.5":
> > > [    4.047094] 0x000000000000-0x000002000000 : "BIOS"
> > > [    4.079742] pps pps0: new PPS source ptp0
> > > [    4.079786] igc 0000:64:00.0 (unnamed net_device)
> > (uninitialized): PHC added
> > > [    4.082583] RAPL PMU: API unit is 2^-32 Joules, 4 fixed
> > counters, 655360 ms ovfl timer
> > > [    4.082586] RAPL PMU: hw unit of domain pp0-core 2^-14 Joules
> > > [    4.082588] RAPL PMU: hw unit of domain package 2^-14 Joules
> > > [    4.082588] RAPL PMU: hw unit of domain pp1-gpu 2^-14 Joules
> > > [    4.082589] RAPL PMU: hw unit of domain psys 2^-14 Joules
> > > [    4.083350] usbcore: registered new device driver r8152-
> > cfgselector
> > > [    4.107228] cryptd: max_cpu_qlen set to 1000
> > > [    4.107196] mei_hdcp 0000:00:16.0-b638ab7e-94e2-4ea2-a552-
> > d1c54b627f04: bound 0000:00:02.0 (ops i915_hdcp_ops [i915])
> > > [    4.107949] mei_pxp 0000:00:16.0-fbf6fcf1-96cf-4e2e-a6a6-
> > 1bab8cbe36b1: bound 0000:00:02.0 (ops i915_pxp_tee_component_ops
> > [i915])
> > > [    4.109214] ee1004 13-0050: 512 byte EE1004-compliant SPD
> > EEPROM, read-only
> > > [    4.172477] r8152-cfgselector 2-1.1: reset SuperSpeed USB device
> > number 3 using xhci_hcd
> > > [    4.187010] Bluetooth: Core ver 2.22
> > > [    4.187025] NET: Registered PF_BLUETOOTH protocol family
> > > [    4.187026] Bluetooth: HCI device and connection manager
> > initialized
> > > [    4.187032] Bluetooth: HCI socket layer initialized
> > > [    4.187034] Bluetooth: L2CAP socket layer initialized
> > > [    4.187036] Bluetooth: SCO socket layer initialized
> > > [    4.191558] igc 0000:64:00.0: 4.000 Gb/s available PCIe
> > bandwidth (5.0 GT/s PCIe x1 link)
> > > [    4.191562] igc 0000:64:00.0 eth0: MAC: XX:XX:XX:XX:XX:XX
> > > [    4.191837] cfg80211: Loading compiled-in X.509 certificates for
> > regulatory database
> > > [    4.191998] igc 0000:65:00.0: enabling device (0000 -> 0002)
> > > [    4.192549] igc 0000:65:00.0: PTM enabled, 4ns granularity
> > > [    4.193238] AES CTR mode by8 optimization enabled
> > > [    4.194837] Loaded X.509 cert 'sforshee: 00b28ddf47aef9cea7'
> > > [    4.195017] Loaded X.509 cert 'wens:
> > 61c038651aabdcf94bd0ac7ff06c7248db18c600'
> > > [    4.214394] snd_hda_intel 0000:00:1f.3: enabling device (0000 ->
> > 0002)
> > > [    4.214598] snd_hda_intel 0000:00:1f.3: bound 0000:00:02.0 (ops
> > i915_audio_component_bind_ops [i915])
> > > [    4.223182] usbcore: registered new interface driver btusb
> > > [    4.224896] Bluetooth: hci0: HW/SW Version: 0x008a008a, Build
> > Time: 20240826151221
> > > [    4.243090] pps pps1: new PPS source ptp1
> > > [    4.243291] igc 0000:65:00.0 (unnamed net_device)
> > (uninitialized): PHC added
> > > [    4.245647] r8152 2-1.1:1.0 eth1: v1.12.13
> > > [    4.245683] usbcore: registered new interface driver r8152
> > > [    4.261881] usbcore: registered new interface driver cdc_ether
> > > [    4.272727] snd_hda_codec_realtek hdaudioC0D0: autoconfig for
> > ALC269VB: line_outs=1 (0x21/0x0/0x0/0x0/0x0) type:hp
> > > [    4.272733] snd_hda_codec_realtek hdaudioC0D0:    speaker_outs=0
> > (0x0/0x0/0x0/0x0/0x0)
> > > [    4.272735] snd_hda_codec_realtek hdaudioC0D0:    hp_outs=0
> > (0x0/0x0/0x0/0x0/0x0)
> > > [    4.272737] snd_hda_codec_realtek hdaudioC0D0:    mono:
> > mono_out=0x0
> > > [    4.272738] snd_hda_codec_realtek hdaudioC0D0:    inputs:
> > > [    4.272739] snd_hda_codec_realtek hdaudioC0D0:      Mic=0x18
> > > [    4.283158] igc 0000:65:00.0: 4.000 Gb/s available PCIe
> > bandwidth (5.0 GT/s PCIe x1 link)
> > > [    4.283163] igc 0000:65:00.0 eth2: MAC: XX:XX:XX:XX:XX:XX
> > > [    4.285711] igc 0000:64:00.0 enp100s0: renamed from eth0
> > > [    4.303471] Intel(R) Wireless WiFi driver for Linux
> > > [    4.303618] iwlwifi 0000:00:14.3: enabling device (0000 -> 0002)
> > > [    4.306032] iwlwifi 0000:00:14.3: Detected crf-id 0x400410, cnv-
> > id 0x80400 wfpm id 0x80000020
> > > [    4.306074] iwlwifi 0000:00:14.3: PCI dev 51f0/0094, rev=0x370,
> > rfid=0x2010d000
> > > [    4.306077] iwlwifi 0000:00:14.3: Detected Intel(R) Wi-Fi 6E
> > AX211 160MHz
> > > [    4.310525] iwlwifi 0000:00:14.3: TLV_FW_FSEQ_VERSION: FSEQ
> > Version: 0.0.2.42
> > > [    4.310859] iwlwifi 0000:00:14.3: loaded firmware version
> > 89.202a2f7b.0 so-a0-gf-a0-89.ucode op_mode iwlmvm
> > > [    4.317505] r8152 2-1.1:1.0 enp0s13f0u1u1: renamed from eth1
> > > [    4.317848] igc 0000:65:00.0 enp101s0: renamed from eth2
> > > [    4.326705] input: HDA Intel PCH Mic as
> > /devices/pci0000:00/0000:00:1f.3/sound/card0/input11
> > > [    4.326777] input: HDA Intel PCH Headphone as
> > /devices/pci0000:00/0000:00:1f.3/sound/card0/input12
> > > [    4.326832] input: HDA Intel PCH HDMI/DP,pcm=3 as
> > /devices/pci0000:00/0000:00:1f.3/sound/card0/input13
> > > [    4.326873] input: HDA Intel PCH HDMI/DP,pcm=7 as
> > /devices/pci0000:00/0000:00:1f.3/sound/card0/input14
> > > [    4.326939] input: HDA Intel PCH HDMI/DP,pcm=8 as
> > /devices/pci0000:00/0000:00:1f.3/sound/card0/input15
> > > [    4.326994] input: HDA Intel PCH HDMI/DP,pcm=9 as
> > /devices/pci0000:00/0000:00:1f.3/sound/card0/input16
> > > [    4.430414] intel_tcc_cooling: TCC Offset locked
> > > [    4.555399] intel_rapl_msr: PL4 support detected.
> > > [    4.555425] intel_rapl_common: Found RAPL domain package
> > > [    4.555428] intel_rapl_common: Found RAPL domain core
> > > [    4.555429] intel_rapl_common: Found RAPL domain uncore
> > > [    4.555431] intel_rapl_common: Found RAPL domain psys
> > > [    4.613360] iwlwifi 0000:00:14.3: WFPM_UMAC_PD_NOTIFICATION:
> > 0x20
> > > [    4.613411] iwlwifi 0000:00:14.3: WFPM_LMAC2_PD_NOTIFICATION:
> > 0x1f
> > > [    4.613418] iwlwifi 0000:00:14.3: WFPM_AUTH_KEY_0: 0x90
> > > [    4.613426] iwlwifi 0000:00:14.3: CNVI_SCU_SEQ_DATA_DW9: 0x0
> > > [    4.613723] iwlwifi 0000:00:14.3: loaded PNVM version 35148b80
> > > [    4.614836] iwlwifi 0000:00:14.3: RFIm is deactivated, reason =
> > 4
> > > [    4.630016] iwlwifi 0000:00:14.3: Detected RF GF,
> > rfid=0x2010d000
> > > [    4.700769] iwlwifi 0000:00:14.3: base HW address:
> > XX:XX:XX:XX:XX:XX
> > > [    4.833421] iwlwifi 0000:00:14.3 wlo1: renamed from wlan0
> > > [    5.452456] EXT4-fs (nvme0n1p3): mounted filesystem efa73f2d-
> > 495d-448d-a0f0-dd425258b7e5 r/w with ordered data mode. Quota mode:
> > none.
> > > [    5.661641] Bluetooth: BNEP (Ethernet Emulation) ver 1.3
> > > [    5.661644] Bluetooth: BNEP filters: protocol multicast
> > > [    5.661647] Bluetooth: BNEP socket layer initialized
> > > [    5.925867] iwlwifi 0000:00:14.3: WFPM_UMAC_PD_NOTIFICATION:
> > 0x20
> > > [    5.925877] iwlwifi 0000:00:14.3: WFPM_LMAC2_PD_NOTIFICATION:
> > 0x1f
> > > [    5.925885] iwlwifi 0000:00:14.3: WFPM_AUTH_KEY_0: 0x90
> > > [    5.925893] iwlwifi 0000:00:14.3: CNVI_SCU_SEQ_DATA_DW9: 0x0
> > > [    5.927244] iwlwifi 0000:00:14.3: RFIm is deactivated, reason =
> > 4
> > > [    6.019702] iwlwifi 0000:00:14.3: Registered PHC clock: iwlwifi-
> > PTP, with index: 2
> > > [    6.248772] iwlwifi 0000:00:14.3: WFPM_UMAC_PD_NOTIFICATION:
> > 0x20
> > > [    6.248782] iwlwifi 0000:00:14.3: WFPM_LMAC2_PD_NOTIFICATION:
> > 0x1f
> > > [    6.248790] iwlwifi 0000:00:14.3: WFPM_AUTH_KEY_0: 0x90
> > > [    6.248798] iwlwifi 0000:00:14.3: CNVI_SCU_SEQ_DATA_DW9: 0x0
> > > [    6.250128] iwlwifi 0000:00:14.3: RFIm is deactivated, reason =
> > 4
> > > [    7.025262] Bluetooth: hci0: Device setup in 2736415 usecs
> > > [    7.025270] Bluetooth: hci0: HCI Enhanced Setup Synchronous
> > Connection command is advertised, but not supported.
> > > [    7.466021] usbcore: registered new interface driver option
> > > [    7.466030] usbserial: USB Serial support registered for GSM
> > modem (1-port)
> > > [    8.318933] Bluetooth: hci0: Mediatek coredump end
> > > [    8.566804] igc 0000:64:00.0 enp100s0: NIC Link is Up 1000 Mbps
> > Full Duplex, Flow Control: RX
> > > [    9.199113] Bluetooth: hci0: Mediatek coredump end
> > > [    9.209081] Bluetooth: hci0: Opcode 0x0c03 failed: -110
> > > [   11.342488] Bluetooth: hci0: Failed to read MSFT supported
> > features (-110)
> > > [   13.455279] block nvme0n1: No UUID available providing old NGUID
> > > [   13.478988] Bluetooth: hci0: AOSP get vendor capabilities (-110)
> > > [   16.117052] wlo1: regulatory prevented using AP config,
> > downgraded
> > > [   16.123049] wlo1: authenticate with XX:XX:XX:XX:XX:XX (local
> > address=XX:XX:XX:XX:XX:XX)
> > > [   16.124244] wlo1: send auth to XX:XX:XX:XX:XX:XX (try 1/3)
> > > [   16.166021] wlo1: authenticated
> > > [   16.172421] wlo1: associate with XX:XX:XX:XX:XX:XX (try 1/3)
> > > [   16.174455] wlo1: RX AssocResp from XX:XX:XX:XX:XX:XX
> > (capab=0x111 status=0 aid=1)
> > > [   16.184782] wlo1: associated
> > > [   16.246848] wlo1: Limiting TX power to 23 (26 - 3) dBm as
> > advertised by XX:XX:XX:XX:XX:XX
> > > [   17.488650] warning: `ThreadPoolForeg' uses wireless extensions
> > which will stop working for Wi-Fi 7 hardware; use nl80211
> > > [   17.531765] platform INT3515:01: deferred probe pending: Serial
> > bus multi instantiate pseudo device driver: Error creating i2c-
> > client, idx 0
> > > [   17.531769] platform INT3515:02: deferred probe pending: Serial
> > bus multi instantiate pseudo device driver: Error creating i2c-
> > client, idx 0
> > > [   18.595698] usb 4-1: Disable of device-initiated U1 failed.
> > > [   23.715878] usb 4-1: Disable of device-initiated U2 failed.
> > > [   33.956071] Bluetooth: hci0: Failed to write uhw reg(-110)
> > > [   33.956138] usb 4-1: Disable of device-initiated U2 failed.
> > > [   39.293677] xhci_hcd 0000:00:14.0: Timeout while waiting for
> > setup device command
> > > [   44.634497] xhci_hcd 0000:00:14.0: Timeout while waiting for
> > setup device command
> > > [   44.841067] usb 4-1: device not accepting address 2, error -62
> > > [   50.186371] xhci_hcd 0000:00:14.0: Timeout while waiting for
> > setup device command
> > > [   55.523585] xhci_hcd 0000:00:14.0: Timeout while waiting for
> > setup device command
> > > [   55.729841] usb 4-1: device not accepting address 2, error -62
> > > [   61.072634] xhci_hcd 0000:00:14.0: Timeout while waiting for
> > setup device command
> > > [   66.407700] xhci_hcd 0000:00:14.0: Timeout while waiting for
> > setup device command
> > > [   66.614207] usb 4-1: device not accepting address 2, error -62
> > > [   71.955541] xhci_hcd 0000:00:14.0: Timeout while waiting for
> > setup device command
> > > [   77.289925] xhci_hcd 0000:00:14.0: Timeout while waiting for
> > setup device command
> > > [   77.496512] usb 4-1: device not accepting address 2, error -62
> > > [   77.513500] usb 4-1: USB disconnect, device number 2
> > > [   82.837128] xhci_hcd 0000:00:14.0: Timeout while waiting for
> > setup device command
> > > [   88.171049] xhci_hcd 0000:00:14.0: Timeout while waiting for
> > setup device command
> > > [   88.377554] usb 4-1: device not accepting address 3, error -62
> > > [   93.718045] xhci_hcd 0000:00:14.0: Timeout while waiting for
> > setup device command
> > > [   99.051387] xhci_hcd 0000:00:14.0: Timeout while waiting for
> > setup device command
> > > [   99.258078] usb 4-1: device not accepting address 4, error -62
> > > [   99.266739] usb usb4-port1: attempt power cycle
> > > [  106.518206] xhci_hcd 0000:00:14.0: Timeout while waiting for
> > setup device command
> > > [  111.851387] xhci_hcd 0000:00:14.0: Timeout while waiting for
> > setup device command
> > > [  112.057840] usb 4-1: device not accepting address 5, error -62
> > > [  117.397862] xhci_hcd 0000:00:14.0: Timeout while waiting for
> > setup device command
> > > [  122.732729] xhci_hcd 0000:00:14.0: Timeout while waiting for
> > setup device command
> > > [  122.937708] usb 4-1: device not accepting address 6, error -62
> > > [  122.944587] usb usb4-port1: unable to enumerate USB device
> > >
> > >
> > >
> > > >
> > > > >
> > > > > External email : Please do not click links or open attachments
> > until
> > > > > you have verified the sender or the content.
> > > > >  Hi,
> > > > >
> > > > > The 22/08/2024 13:23, Hao Qin wrote:
> > > > > > Remove resetting mt7921 before downloading the fw, as it may
> > cause
> > > > > > command timeout when performing the reset.
> > > > > >
> > > > > > Signed-off-by: Hao Qin <hao.qin at mediatek.com>
> > > > > > ---
> > > > > >  drivers/bluetooth/btmtk.c | 4 ++--
> > > > > >  1 file changed, 2 insertions(+), 2 deletions(-)
> > > > > >
> > > > > > diff --git a/drivers/bluetooth/btmtk.c
> > b/drivers/bluetooth/btmtk.c
> > > > > > index 2b7c80043aa2..a46f70135cbd 100644
> > > > > > --- a/drivers/bluetooth/btmtk.c
> > > > > > +++ b/drivers/bluetooth/btmtk.c
> > > > > > @@ -1326,7 +1326,6 @@ int btmtk_usb_setup(struct hci_dev
> > *hdev)
> > > > > >  fwname = FIRMWARE_MT7668;
> > > > > >  break;
> > > > > >  case 0x7922:
> > > > > > -case 0x7961:
> > > > > >  case 0x7925:
> > > > > >  /* Reset the device to ensure it's in the initial state
> > before
> > > > > >   * downloading the firmware to ensure.
> > > > > > @@ -1334,7 +1333,8 @@ int btmtk_usb_setup(struct hci_dev
> > *hdev)
> > > > > >
> > > > > >  if (!test_bit(BTMTK_FIRMWARE_LOADED, &btmtk_data->flags))
> > > > > >  btmtk_usb_subsys_reset(hdev, dev_id);
> > > > > > -
> > > > > > +fallthrough;
> > > > > > +case 0x7961:
> > > > > >  btmtk_fw_get_filename(fw_bin_name, sizeof(fw_bin_name),
> > dev_id,
> > > > > >        fw_version, fw_flavor);
> > > > > >
> > > > > > --
> > > > > > 2.18.0
> > > > > >
> > > > >
> > > > > [Original regression report
> > > > >
> > > > 
> > https://lore.kernel.org/linux-bluetooth/ZsTh7Jyug7MbZsLE at mdpsys.co.uk/
> > > > > ]
> > > > >
> > > > > Thanks for the patch, I have tested it on top of v6.11-rc7 and
> > can
> > > > > confirm
> > > > > that it resolves the initial command timeout issue.
> > > > >
> > > > > Unfortunately, when using the latest firmware version
> > 20240826151221
> > > > > from the
> > > > > linux-firmware repo I'm still seeing "Mediatek coredump end"
> > errors
> > > > > followed by MSFT and AOSP errors. The device then appears
> > > > > unresponsive
> > > > > and the kernel eventually gives up attempting to enumerate:
> > > > >
> > > > > [  230.042936] usb 4-3.2: new SuperSpeed USB device number 4
> > using
> > > > > xhci_hcd
> > > > > [  230.065228] usb 4-3.2: New USB device found, idVendor=0e8d,
> > > > > idProduct=7961, bcdDevice= 1.00
> > > > > [  230.065237] usb 4-3.2: New USB device strings: Mfr=6,
> > Product=7,
> > > > > SerialNumber=8
> > > > > [  230.065240] usb 4-3.2: Product: Wireless_Device
> > > > > [  230.065242] usb 4-3.2: Manufacturer: MediaTek Inc.
> > > > > [  230.065245] usb 4-3.2: SerialNumber: 000000000
> > > > > [  230.101915] Bluetooth: hci2: HW/SW Version: 0x008a008a,
> > Build
> > > > > Time: 20240826151221
> > > > > [  233.005938] Bluetooth: hci2: Device setup in 2862056 usecs
> > > > > [  233.005983] Bluetooth: hci2: HCI Enhanced Setup Synchronous
> > > > > Connection command is advertised, but not supported.
> > > > > [  234.306071] Bluetooth: hci2: Mediatek coredump end
> > > > > [  235.092729] Bluetooth: hci2: Opcode 0x0c03 failed: -110
> > > > > [  235.192772] Bluetooth: hci2: Mediatek coredump end
> > > > > [  237.226157] Bluetooth: hci2: Failed to read MSFT supported
> > > > > features (-110)
> > > > > [  239.359435] Bluetooth: hci2: AOSP get vendor capabilities (-
> > 110)
> > > > > [  244.479726] usb 4-3.2: Disable of device-initiated U1
> > failed.
> > > > > [  249.599598] usb 4-3.2: Disable of device-initiated U2
> > failed.
> > > > > [  259.839215] Bluetooth: hci2: Failed to write uhw reg(-110)
> > > > > [  259.839240] usb 4-3.2: Disable of device-initiated U1
> > failed.
> > > > > [  264.959343] usb 4-3.2: Disable of device-initiated U2
> > failed.
> > > > > [  270.079038] xhci_hcd 0000:00:14.0: Timeout while waiting for
> > setup
> > > > > device command
> > > > > [  275.412299] xhci_hcd 0000:00:14.0: Timeout while waiting for
> > setup
> > > > > device command
> > > > > [  275.618812] usb 4-3.2: device not accepting address 4, error
> > -62
> > > > > [  280.958852] xhci_hcd 0000:00:14.0: Timeout while waiting for
> > setup
> > > > > device command
> > > > > [  286.292034] xhci_hcd 0000:00:14.0: Timeout while waiting for
> > setup
> > > > > device command
> > > > > [  286.498618] usb 4-3.2: device not accepting address 4, error
> > -62
> > > > > [  291.838759] xhci_hcd 0000:00:14.0: Timeout while waiting for
> > setup
> > > > > device command
> > > > > [  297.172018] xhci_hcd 0000:00:14.0: Timeout while waiting for
> > setup
> > > > > device command
> > > > > [  297.378477] usb 4-3.2: device not accepting address 4, error
> > -62
> > > > > [  302.718497] xhci_hcd 0000:00:14.0: Timeout while waiting for
> > setup
> > > > > device command
> > > > > [  308.051867] xhci_hcd 0000:00:14.0: Timeout while waiting for
> > setup
> > > > > device command
> > > > > [  308.258345] usb 4-3.2: device not accepting address 4, error
> > -62
> > > > > [  308.260253] usb 4-3.2: USB disconnect, device number 4
> > > > > [  313.598307] xhci_hcd 0000:00:14.0: Timeout while waiting for
> > setup
> > > > > device command
> > > > > [  318.931586] xhci_hcd 0000:00:14.0: Timeout while waiting for
> > setup
> > > > > device command
> > > > > [  319.138278] usb 4-3.2: device not accepting address 5, error
> > -62
> > > > > [  324.478224] xhci_hcd 0000:00:14.0: Timeout while waiting for
> > setup
> > > > > device command
> > > > > [  329.811444] xhci_hcd 0000:00:14.0: Timeout while waiting for
> > setup
> > > > > device command
> > > > > [  330.018032] usb 4-3.2: device not accepting address 6, error
> > -62
> > > > > [  330.018489] usb 4-3-port2: attempt power cycle
> > > > > [  336.211505] xhci_hcd 0000:00:14.0: Timeout while waiting for
> > setup
> > > > > device command
> > > > > [  341.544640] xhci_hcd 0000:00:14.0: Timeout while waiting for
> > setup
> > > > > device command
> > > > > [  341.751239] usb 4-3.2: device not accepting address 7, error
> > -62
> > > > > [  347.091375] xhci_hcd 0000:00:14.0: Timeout while waiting for
> > setup
> > > > > device command
> > > > > [  352.424563] xhci_hcd 0000:00:14.0: Timeout while waiting for
> > setup
> > > > > device command
> > > > > [  352.631136] usb 4-3.2: device not accepting address 8, error
> > -62
> > > > > [  352.631538] usb 4-3-port2: unable to enumerate USB device
> > > > >
> > > > >
> > > > > Interestingly, if I revert back to an known-good firmware
> > version
> > > > > 20231025113744 along with your patch, the device enumerates and
> > works
> > > > > fine:
> > > > >
> > > > > [ 4001.366725] usb 4-1: new SuperSpeed USB device number 4
> > using
> > > > > xhci_hcd
> > > > > [ 4001.385840] usb 4-1: New USB device found, idVendor=0e8d,
> > > > > idProduct=7961, bcdDevice= 1.00
> > > > > [ 4001.385855] usb 4-1: New USB device strings: Mfr=6,
> > Product=7,
> > > > > SerialNumber=8
> > > > > [ 4001.385860] usb 4-1: Product: Wireless_Device
> > > > > [ 4001.385863] usb 4-1: Manufacturer: MediaTek Inc.
> > > > > [ 4001.385867] usb 4-1: SerialNumber: 000000000
> > > > > [ 4001.398010] Bluetooth: hci1: HW/SW Version: 0x008a008a,
> > Build
> > > > > Time: 20231025113744
> > > > > [ 4004.275656] Bluetooth: hci1: Device setup in 2812288 usecs
> > > > > [ 4004.275661] Bluetooth: hci1: HCI Enhanced Setup Synchronous
> > > > > Connection command is advertised, but not supported.
> > > > > [ 4004.355137] Bluetooth: hci1: AOSP extensions version v0.96
> > > > > [ 4004.355156] Bluetooth: hci1: AOSP quality report is not
> > supported
> > > > > [ 4004.355698] Bluetooth: MGMT ver 1.23
> > > > >
> > > > > But if I then disconnect it, I get the Oops that I shared in my
> > > > > original
> > > > > regression report:
> > > > >
> > > > > [ 4043.436215] usb 4-1: USB disconnect, device number 4
> > > > > [ 4043.437308] Oops: general protection fault, probably for
> > non-
> > > > > canonical address 0xdead000000000122: 0000 [#1] PREEMPT SMP
> > NOPTI
> > > > > [ 4043.437332] CPU: 2 UID: 0 PID: 3698 Comm: kworker/2:0 Not
> > tainted
> > > > > 6.11.0-rc7-00001-g0e2ad6528188-dirty #71
> > > > > d90fb9085e2a0686ac48ebcc408d97b104c6fbf1
> > > > > [ 4043.437352] Hardware name: Intel(R) Client Systems
> > > > > NUC12WSHi7/NUC12WSBi7, BIOS WSADL357.0088.2023.0505.1623
> > 05/05/2023
> > > > > [ 4043.437361] Workqueue: usb_hub_wq hub_event
> > > > > [ 4043.437386] RIP: 0010:hci_unregister_dev+0x45/0x1f0
> > [bluetooth]
> > > > > [ 4043.437548] Code: 89 ef e8 ae d4 5c c1 f0 80 8b e9 0e 00 00
> > 08 48
> > > > > 89 ef e8 0e c2 5c c1 48 c7 c7 68 60 52 c1 e8 22 23 5d c1 48 8b
> > 43 08
> > > > > 48 8b 13 <48> 3b 18 0f 85 f5 c7 06 00 48 3b 5a 08 0f 85 eb c7
> > 06 00
> > > > > 48 89 42
> > > > > [ 4043.437560] RSP: 0018:ffffa10f4ae43b98 EFLAGS: 00010246
> > > > > [ 4043.437574] RAX: dead000000000122 RBX: ffff8cf86c160000 RCX:
> > > > > 0000000000000000
> > > > > [ 4043.437585] RDX: dead000000000100 RSI: ffff8cf7b7d16c50 RDI:
> > > > > ffffffffc1526068
> > > > > [ 4043.437594] RBP: ffff8cf86c1604d0 R08: 0000000000000000 R09:
> > > > > ffff8cf7401d8e10
> > > > > [ 4043.437602] R10: ffffa10f4ae43ba0 R11: ffffa10f4ae43ba8 R12:
> > > > > ffff8cf86c160000
> > > > > [ 4043.437610] R13: ffffffffc1416278 R14: ffffffffc1416278 R15:
> > > > > ffff8cf7f8d73850
> > > > > [ 4043.437620] FS:  0000000000000000(0000)
> > GS:ffff8d0697300000(0000)
> > > > > knlGS:0000000000000000
> > > > > [ 4043.437632] CS:  0010 DS: 0000 ES: 0000 CR0:
> > 0000000080050033
> > > > > [ 4043.437641] CR2: 00007f98d66dc000 CR3: 0000000131124000 CR4:
> > > > > 0000000000f50ef0
> > > > > [ 4043.437651] PKRU: 55555554
> > > > > [ 4043.437658] Call Trace:
> > > > > [ 4043.437670]  <TASK>
> > > > > [ 4043.437680]  ? __die_body.cold+0x19/0x27
> > > > > [ 4043.437700]  ? die_addr+0x3c/0x60
> > > > > [ 4043.437716]  ? exc_general_protection+0x17d/0x400
> > > > > [ 4043.437738]  ? asm_exc_general_protection+0x26/0x30
> > > > > [ 4043.437760]  ? hci_unregister_dev+0x45/0x1f0 [bluetooth
> > > > > 6dca047d1088401e195d97746b2b4936e5756d61]
> > > > > [ 4043.437930]  ? hci_unregister_dev+0x3e/0x1f0 [bluetooth
> > > > > 6dca047d1088401e195d97746b2b4936e5756d61]
> > > > > [ 4043.438080]  btusb_disconnect+0x67/0x170 [btusb
> > > > > 5bf8186d9cab4c5be1762247dadb6753a7c72a7f]
> > > > > [ 4043.438108]  usb_unbind_interface+0x90/0x290
> > > > > [ 4043.438130]  device_release_driver_internal+0x19c/0x200
> > > > > [ 4043.438150]  bus_remove_device+0xc6/0x130
> > > > > [ 4043.438166]  device_del+0x161/0x3e0
> > > > > [ 4043.438182]  ? kobject_put+0xa0/0x1d0
> > > > > [ 4043.438196]  usb_disable_device+0x104/0x220
> > > > > [ 4043.438213]  usb_disconnect+0xe6/0x2e0
> > > > > [ 4043.438231]  hub_event+0x7f9/0x19d0
> > > > > [ 4043.438250]  ? __pm_runtime_suspend+0x47/0xc0
> > > > > [ 4043.438269]  process_one_work+0x17b/0x330
> > > > > [ 4043.438287]  worker_thread+0x2c6/0x3f0
> > > > > [ 4043.438304]  ? __pfx_worker_thread+0x10/0x10
> > > > > [ 4043.438318]  kthread+0xcf/0x100
> > > > > [ 4043.438337]  ? __pfx_kthread+0x10/0x10
> > > > > [ 4043.438354]  ret_from_fork+0x31/0x50
> > > > > [ 4043.438367]  ? __pfx_kthread+0x10/0x10
> > > > > [ 4043.438382]  ret_from_fork_asm+0x1a/0x30
> > > > > [ 4043.438403]  </TASK>
> > > > > [ 4043.438408] Modules linked in: uhid mt792x_usb mt7921_common
> > > > > mt792x_lib mt76_connac_lib mt76_usb mt76 ccm option usb_wwan
> > cmac
> > > > > algif_hash algif_skcipher af_alg sr_mod cdrom bnep mousedev
> > joydev
> > > > > vfat fat snd_sof_pci_intel_tgl snd_sof_pci_intel_cnl
> > intel_rapl_msr
> > > > > snd_sof_intel_hda_generic intel_rapl_common soundwire_intel
> > > > > intel_uncore_frequency soundwire_cadence
> > > > > intel_uncore_frequency_common snd_sof_intel_hda_common
> > > > > snd_sof_intel_hda_mlink snd_sof_intel_hda snd_sof_pci
> > > > > snd_sof_xtensa_dsp snd_sof iwlmvm snd_sof_utils
> > snd_soc_hdac_hda
> > > > > snd_soc_acpi_intel_match soundwire_generic_allocation
> > snd_soc_acpi
> > > > > soundwire_bus snd_soc_avs r8152 x86_pkg_temp_thermal
> > intel_powerclamp
> > > > > libphy snd_soc_hda_codec coretemp mac80211 snd_hda_ext_core
> > kvm_intel
> > > > > snd_soc_core snd_hda_codec_hdmi cdc_ether hid_generic uas
> > usbnet
> > > > > snd_hda_codec_realtek snd_compress kvm usb_storage mii usbhid
> > > > > snd_hda_codec_generic ac97_bus snd_pcm_dmaengine
> > > > > snd_hda_scodec_component snd_hda_intel libarc4 snd_intel_dspcfg
> > btusb
> > > > > crct10dif_pclmul snd_intel_sdw_acpi
> > > > > [ 4043.438617]  crc32_pclmul iwlwifi btrtl snd_hda_codec
> > > > > polyval_clmulni btintel polyval_generic btbcm
> > ghash_clmulni_intel
> > > > > sha512_ssse3 btmtk tps6598x sha256_ssse3 snd_hda_core typec
> > > > > sha1_ssse3 cfg80211 bluetooth aesni_intel snd_hwdep roles
> > gf128mul
> > > > > crypto_simd snd_pcm cryptd mei_hdcp mei_pxp rapl ee1004 ov13858
> > > > > snd_timer intel_cstate igc spi_nor intel_uncore i2c_i801
> > thunderbolt
> > > > > snd v4l2_fwnode mei_me v4l2_async ptp wdat_wdt i2c_smbus mtd
> > pcspkr
> > > > > wmi_bmof intel_lpss_pci videodev mei pps_core soundcore
> > > > > intel_pmc_core i2c_mux intel_lpss rfkill idma64 igen6_edac
> > intel_vsec
> > > > > serial_multi_instantiate mc pmt_telemetry pinctrl_tigerlake
> > pmt_class
> > > > > acpi_pad acpi_tad mac_hid i2c_dev dm_mod sg crypto_user loop
> > > > > nfnetlink ip_tables x_tables ext4 crc32c_generic crc16 mbcache
> > jbd2
> > > > > xe drm_ttm_helper gpu_sched drm_suballoc_helper drm_gpuvm
> > drm_exec
> > > > > i915 i2c_algo_bit drm_buddy ttm nvme intel_gtt
> > drm_display_helper
> > > > > nvme_core spi_intel_pci cec xhci_pci crc32c_intel spi_intel
> > nvme_auth
> > > > > xhci_pci_renesas video wmi
> > > > > [ 4043.438898] ---[ end trace 0000000000000000 ]---
> > > > > [ 4043.438905] RIP: 0010:hci_unregister_dev+0x45/0x1f0
> > [bluetooth]
> > > > > [ 4043.439039] Code: 89 ef e8 ae d4 5c c1 f0 80 8b e9 0e 00 00
> > 08 48
> > > > > 89 ef e8 0e c2 5c c1 48 c7 c7 68 60 52 c1 e8 22 23 5d c1 48 8b
> > 43 08
> > > > > 48 8b 13 <48> 3b 18 0f 85 f5 c7 06 00 48 3b 5a 08 0f 85 eb c7
> > 06 00
> > > > > 48 89 42
> > > > > [ 4043.439048] RSP: 0018:ffffa10f4ae43b98 EFLAGS: 00010246
> > > > > [ 4043.439058] RAX: dead000000000122 RBX: ffff8cf86c160000 RCX:
> > > > > 0000000000000000
> > > > > [ 4043.439065] RDX: dead000000000100 RSI: ffff8cf7b7d16c50 RDI:
> > > > > ffffffffc1526068
> > > > > [ 4043.439072] RBP: ffff8cf86c1604d0 R08: 0000000000000000 R09:
> > > > > ffff8cf7401d8e10
> > > > > [ 4043.439078] R10: ffffa10f4ae43ba0 R11: ffffa10f4ae43ba8 R12:
> > > > > ffff8cf86c160000
> > > > > [ 4043.439085] R13: ffffffffc1416278 R14: ffffffffc1416278 R15:
> > > > > ffff8cf7f8d73850
> > > > > [ 4043.439091] FS:  0000000000000000(0000)
> > GS:ffff8d0697300000(0000)
> > > > > knlGS:0000000000000000
> > > > > [ 4043.439100] CS:  0010 DS: 0000 ES: 0000 CR0:
> > 0000000080050033
> > > > > [ 4043.439108] CR2: 00007f98d66dc000 CR3: 0000000131124000 CR4:
> > > > > 0000000000f50ef0
> > > > > [ 4043.439116] PKRU: 55555554
> > > > > [ 4043.439122] note: kworker/2:0[3698] exited with
> > preempt_count 1
> > > > >
> > > > > So, in summary, it looks as though there are two issues here:
> > > > >
> > > > > 1. The latest firmware does not seem to work well with this
> > chipset,
> > > > >    perhaps it is crashing after loading?
> > > > > 2. The Oops in the hci_unregister_dev function suggests some
> > HCI
> > > > >    registration bug.
> > > > >
> > > > > Let me know if I can provide any further assistance.
> > > > >
> > > > > Regards,
> > > > >
> > > > > Marc
> > > > >
> > >
> > > *********** MEDIATEK Confidentiality Notice
> > >  ***********
> > > The information contained in this e-mail message (including any
> > > attachments) may be confidential, proprietary, privileged, or
> > > otherwise exempt from disclosure under applicable laws. It is
> > > intended to be conveyed only to the designated recipient(s). Any
> > > use, dissemination, distribution, printing, retaining or copying
> > > of this e-mail (including its attachments) by unintended
> > recipient(s)
> > > is strictly prohibited and may be unlawful. If you are not an
> > > intended recipient of this e-mail, or believe that you have
> > received
> > > this e-mail in error, please notify the sender immediately
> > > (by replying to this e-mail), delete any and all copies of this
> > > e-mail (including any attachments) from your system, and do not
> > > disclose the content of this e-mail to any other person. Thank you!
> > 
> > 
> > 
> > -- 
> > Luiz Augusto von Dentz

-- 
Marc Payne


From lkp at intel.com  Thu Sep 19 15:43:24 2024
From: lkp at intel.com (kernel test robot)
Date: Fri, 20 Sep 2024 06:43:24 +0800
Subject: [PATCH v1 3/3] soc: mediatek: mtk-cmdq: Move cmdq_instruction
 init to declaration
In-Reply-To: <20240918100620.103536-4-angelogioacchino.delregno@collabora.com>
References: <20240918100620.103536-4-angelogioacchino.delregno@collabora.com>
Message-ID: <202409200659.IVYRJ33l-lkp@intel.com>

Hi AngeloGioacchino,

kernel test robot noticed the following build warnings:

[auto build test WARNING on clk/clk-next]
[also build test WARNING on soc/for-next linus/master v6.11 next-20240919]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/AngeloGioacchino-Del-Regno/soc-mediatek-mtk-cmdq-Move-mask-build-and-append-to-function/20240918-180757
base:   https://git.kernel.org/pub/scm/linux/kernel/git/clk/linux.git clk-next
patch link:    https://lore.kernel.org/r/20240918100620.103536-4-angelogioacchino.delregno%40collabora.com
patch subject: [PATCH v1 3/3] soc: mediatek: mtk-cmdq: Move cmdq_instruction init to declaration
config: parisc-randconfig-r123-20240920 (https://download.01.org/0day-ci/archive/20240920/202409200659.IVYRJ33l-lkp at intel.com/config)
compiler: hppa-linux-gcc (GCC) 14.1.0
reproduce: (https://download.01.org/0day-ci/archive/20240920/202409200659.IVYRJ33l-lkp at intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp at intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202409200659.IVYRJ33l-lkp at intel.com/

sparse warnings: (new ones prefixed by >>)
>> drivers/soc/mediatek/mtk-cmdq-helper.c:240:18: sparse: sparse: Initializer entry defined twice
   drivers/soc/mediatek/mtk-cmdq-helper.c:244:18: sparse:   also defined here

vim +240 drivers/soc/mediatek/mtk-cmdq-helper.c

   234	
   235	int cmdq_pkt_write_s(struct cmdq_pkt *pkt, u16 high_addr_reg_idx,
   236			     u16 addr_low, u16 src_reg_idx)
   237	{
   238		struct cmdq_instruction inst = {
   239			.op = CMDQ_CODE_WRITE_S,
 > 240			.mask = 0,
   241			.src_t = CMDQ_REG_TYPE,
   242			.sop = high_addr_reg_idx,
   243			.offset = addr_low,
   244			.src_reg = src_reg_idx
   245		};
   246		return cmdq_pkt_append_command(pkt, inst);
   247	}
   248	EXPORT_SYMBOL(cmdq_pkt_write_s);
   249	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki


From peter.wang at mediatek.com  Thu Sep 19 19:02:03 2024
From: peter.wang at mediatek.com (=?utf-8?B?UGV0ZXIgV2FuZyAo546L5L+h5Y+LKQ==?=)
Date: Fri, 20 Sep 2024 02:02:03 +0000
Subject: [PATCH v4 2/2] ufs: core: requeue aborted request
In-Reply-To: <beeec868-b4ac-4025-859b-35a828cd2f8e@acm.org>
References: <20240910073035.25974-1-peter.wang@mediatek.com>
	 <20240910073035.25974-3-peter.wang@mediatek.com>
	 <e42abf07-ba6b-4301-8717-8d5b01d56640@acm.org>
	 <04e392c00986ac798e881dcd347ff5045cf61708.camel@mediatek.com>
	 <858c4b6b-fcbc-4d51-8641-051aeda387c5@acm.org>
	 <524e9da9196cc0acf497ff87eba3a8043b780332.camel@mediatek.com>
	 <6203d7c9-b33c-4bf1-aca3-5fc8ba5636b9@acm.org>
	 <6fc025d7ffb9d702a117381fb5da318b40a24246.camel@mediatek.com>
	 <46d8be04-10db-4de1-8a59-6cd402bcecb1@acm.org>
	 <61a1678cad16dcb15f1e215ff1c47476666f0ee8.camel@mediatek.com>
	 <78c7fc74-81c2-40e4-b050-1d65dec96d0a@acm.org>
	 <f350a1dee5a03347b5e88b9d7249223ce7b72c08.camel@mediatek.com>
	 <beeec868-b4ac-4025-859b-35a828cd2f8e@acm.org>
Message-ID: <4f9e2ac99bcb981b11dc6454165818c5de6fd4d6.camel@mediatek.com>

On Thu, 2024-09-19 at 11:49 -0700, Bart Van Assche wrote:
>  	 
> External email : Please do not click links or open attachments until
> you have verified the sender or the content.
>  On 9/19/24 5:16 AM, Peter Wang (???) wrote:
> > The four case flows for abort are as follows:
> > ----------------------------------------------------------------
> > 
> > Case1: DBR ufshcd_abort
> 
> Please follow the terminology from the UFSHCI 4.0 standard and use
> the
> word "legacy" instead of "DBR".
> 

Hi Bart,

Okay, but the current code comments all use 'SDB mode'. 
Should we just stick with that term?


> > In this case, you can see that ufshcd_release_scsi_cmd will
> > definitely be called.
> > 
> > ufshcd_abort()
> >    ufshcd_try_to_abort_task()// It should trigger an
> > interrupt, but the tensor might not
> >    get outstanding_lock
> >    clear outstanding_reqs tag
> >    ufshcd_release_scsi_cmd()
> >    release outstanding_lock
> > 
> > ufshcd_intr()
> >    ufshcd_sl_intr()
> >      ufshcd_transfer_req_compl()
> >        ufshcd_poll()
> >          get outstanding_lock
> >          clear outstanding_reqs tag
> >          release outstanding_lock
> >          __ufshcd_transfer_req_compl()
> >            ufshcd_compl_one_cqe()
> >            cmd->result = DID_REQUEUE// mediatek may need quirk
> > change DID_ABORT to DID_REQUEUE
> >            ufshcd_release_scsi_cmd()
> >            scsi_done();
> > 
> > In most cases, ufshcd_intr will not reach scsi_done because the
> > outstanding_reqs tag is cleared by the original thread.
> > Therefore, whether there is an interrupt or not doesn't affect
> > the result because the ISR will do nothing in most cases.
> > 
> > In a very low chance, the ISR will reach scsi_done and notify
> > SCSI to requeue, and the original thread will not
> > call ufshcd_release_scsi_cmd.
> > MediaTek may need to change DID_ABORT to DID_REQUEUE in this
> > situation, or perhaps not handle this ISR at all.
> 
> Please modify ufshcd_compl_one_cqe() such that it ignores commands
> with status OCS_ABORTED. This will make the UFSHCI driver behave in
> the same way for all UFSHCI controllers, whether or not clearing a
> command triggers a completion interrupt.
> 

Yes, I am considering how to modify the code here.

> > ----------------------------------------------------------------
> > 
> > Case2: MCQ ufshcd_abort
> > 
> > In the case of MCQ ufshcd_abort, you can also see that
> > ufshcd_release_scsi_cmd will definitely be called too.
> > However, there seems to be a problem here, as
> > ufshcd_release_scsi_cmd might be called twice.
> > This is because cmd is not null in ufshcd_release_scsi_cmd,
> > which the previous version would set cmd to null.
> > Skipping OCS: ABORTED in ufshcd_compl_one_cqe indeed
> > can avoid this problem. This part needs further
> > consideration on how to handle it.
> > 
> > ufshcd_abort()
> >    ufshcd_mcq_abort()
> >      ufshcd_try_to_abort_task()// will trigger ISR
> >      ufshcd_release_scsi_cmd()
> > 
> > ufs_mtk_mcq_intr()
> >    ufshcd_mcq_poll_cqe_lock()
> >      ufshcd_mcq_process_cqe()
> >        ufshcd_compl_one_cqe()
> >          cmd->result = DID_ABORT
> >          ufshcd_release_scsi_cmd() // will release twice
> >          scsi_done()
> 
> Do you agree that this case can be addressed with the
> ufshcd_compl_one_cqe() change proposed above?
> 

Agree.

> > ----------------------------------------------------------------
> > 
> > Case3: DBR ufshcd_err_handler
> > 
> > In the case of the DBR mode error handler, it's the same;
> > ufshcd_release_scsi_cmd will also be executed, and scsi_done
> > will definitely be used to notify SCSI to requeue.
> > 
> > ufshcd_err_handler()
> >    ufshcd_abort_all()
> >      ufshcd_abort_one()
> >        ufshcd_try_to_abort_task()// It should trigger an
> > interrupt, but the tensor might not
> >      ufshcd_complete_requests()
> >        ufshcd_transfer_req_compl()
> >          ufshcd_poll()
> >            get outstanding_lock
> >            clear outstanding_reqs tag
> >            release outstanding_lock
> >            __ufshcd_transfer_req_compl()
> >              ufshcd_compl_one_cqe()
> >                cmd->result = DID_REQUEUE // mediatek may need quirk
> > change DID_ABORT to DID_REQUEUE
> >                ufshcd_release_scsi_cmd()
> >                scsi_done()
> > 
> > ufshcd_intr()
> >    ufshcd_sl_intr()
> >      ufshcd_transfer_req_compl()
> >        ufshcd_poll()
> >          get outstanding_lock
> >          clear outstanding_reqs tag
> >          release outstanding_lock
> >          __ufshcd_transfer_req_compl()
> >            ufshcd_compl_one_cqe()
> >            cmd->result = DID_REQUEUE // mediatek may need quirk
> change
> > DID_ABORT to DID_REQUEUE
> >            ufshcd_release_scsi_cmd()
> >            scsi_done();
> > 
> > At this time, the same actions are taken regardless of whether
> > there is an ISR, and with the protection of outstanding_lock,
> > only one thread will execute ufshcd_release_scsi_cmd and scsi_done.
> > ----------------------------------------------------------------
> > 
> > Case4: MCQ ufshcd_err_handler
> > 
> > It's the same with MCQ mode; there is protection from the cqe lock,
> > so only one thread will execute. What my patch 2 aims to do is to
> > change DID_ABORT to DID_REQUEUE in this situation.
> > 
> > ufshcd_err_handler()
> >    ufshcd_abort_all()
> >      ufshcd_abort_one()
> >        ufshcd_try_to_abort_task()// will trigger irq thread
> >      ufshcd_complete_requests()
> >        ufshcd_mcq_compl_pending_transfer()
> >          ufshcd_mcq_poll_cqe_lock()
> >            ufshcd_mcq_process_cqe()
> >              ufshcd_compl_one_cqe()
> >                cmd->result = DID_ABORT // should change to
> DID_REQUEUE
> >                ufshcd_release_scsi_cmd()
> >                scsi_done()
> > 
> > ufs_mtk_mcq_intr()
> >    ufshcd_mcq_poll_cqe_lock()
> >      ufshcd_mcq_process_cqe()
> >        ufshcd_compl_one_cqe()
> >          cmd->result = DID_ABORT  // should change to DID_REQUEUE
> >          ufshcd_release_scsi_cmd()
> >          scsi_done()
> 
> For legacy and MCQ mode, I prefer the following behavior for
> ufshcd_abort_all():
> * ufshcd_compl_one_cqe() ignores commands with status OCS_ABORTED.
> * ufshcd_release_scsi_cmd() is called either by ufshcd_abort_one() or
>    by ufshcd_abort_all().
> 
> Do you agree with making the changes proposed above?
> 
> Thank you,

This might not work, as SDB mode doesn't ignore 
OCS: INVALID_OCS_VALUE but rather notifies SCSI to requeue. 
So what we need to correct is to notify SCSI to requeue 
when MCQ mode receives OCS: ABORTED as well.

Furthermore, ufshcd_compl_one_cqe, whether it comes from 
ufshcd_abort_all or ISR, does the same thing and is protected 
by a lock. Therefore, there is no need for special handling 
specifically for ufshcd_abort_all.

After discussing with you, I realized that there are indeed many 
deficiencies and inconsistencies here that need to be addressed. 
I will submit a new patch for the content discussed above.

Thanks.
Peter



> 
> Bar

From ilias.apalodimas at linaro.org  Thu Sep 19 22:29:18 2024
From: ilias.apalodimas at linaro.org (Ilias Apalodimas)
Date: Fri, 20 Sep 2024 08:29:18 +0300
Subject: [PATCH net 2/2] page_pool: fix IOMMU crash when driver has
 already unbound
In-Reply-To: <0e8c7a7a-0e2a-42ec-adbc-b29f6a514517@kernel.org>
References: <20240918111826.863596-1-linyunsheng@huawei.com>
 <20240918111826.863596-3-linyunsheng@huawei.com> <CAC_iWjK=G7Oo5=pN2QunhasgDC6NyC1L+96jigX7u9ad+PbYng@mail.gmail.com>
 <894a3c2c-22f9-45b9-a82b-de7320066b42@kernel.org> <cdfecd37-31d7-42d2-a8d8-92008285b42e@huawei.com>
 <0e8c7a7a-0e2a-42ec-adbc-b29f6a514517@kernel.org>
Message-ID: <CAC_iWj+3JvPY2oqVOdu0T1Wt6-ukoy=dLc72u1f55yY23uOTbA@mail.gmail.com>

Hi Jesper,

On Fri, 20 Sept 2024 at 00:04, Jesper Dangaard Brouer <hawk at kernel.org> wrote:
>
>
>
> On 19/09/2024 13.15, Yunsheng Lin wrote:
> > On 2024/9/19 17:42, Jesper Dangaard Brouer wrote:
> >>
> >> On 18/09/2024 19.06, Ilias Apalodimas wrote:
> >>>> In order not to do the dma unmmapping after driver has already
> >>>> unbound and stall the unloading of the networking driver, add
> >>>> the pool->items array to record all the pages including the ones
> >>>> which are handed over to network stack, so the page_pool can
> >>>> do the dma unmmapping for those pages when page_pool_destroy()
> >>>> is called.
> >>>
> >>> So, I was thinking of a very similar idea. But what do you mean by
> >>> "all"? The pages that are still in caches (slow or fast) of the pool
> >>> will be unmapped during page_pool_destroy().
> >>
> >> I really dislike this idea of having to keep track of all outstanding pages.
> >>
> >> I liked Jakub's idea of keeping the netdev around for longer.
> >>
> >> This is all related to destroying the struct device that have points to
> >> the DMA engine, right?
> >
> > Yes, the problem seems to be that when device_del() is called, there is
> > no guarantee hw behind the 'struct device ' will be usable even if we
> > call get_device() on it.
> >
> >>
> >> Why don't we add an API that allow netdev to "give" struct device to
> >> page_pool.  And then the page_poll will take over when we can safely
> >> free the stuct device?
> >
> > By 'allow netdev to "give" struct device to page_pool', does it mean
> > page_pool become the driver for the device?
> > If yes, it seems that is similar to jakub's idea, as both seems to stall
> > the calling of device_del() by not returning when the driver unloading.
>
> Yes, this is what I mean. (That is why I mentioned Jakub's idea).

Keeping track of inflight packets that need to be unmapped is
certainly more complex. Delaying the netdevice destruction certainly
solves the problem but there's a huge cost IMHO. Those devices might
stay there forever and we have zero guarantees that the network stack
will eventually release (and unmap) those packets. What happens in
that case? The user basically has to reboot the entire machine, just
because he tries to bring an interface down and up again.

Thanks
/Ilias
>
>
> > If no, it seems that the problem is still existed when the driver for
> > the device has unbound after device_del() is called.


From linyunsheng at huawei.com  Thu Sep 19 23:14:02 2024
From: linyunsheng at huawei.com (Yunsheng Lin)
Date: Fri, 20 Sep 2024 14:14:02 +0800
Subject: [PATCH net 2/2] page_pool: fix IOMMU crash when driver has
 already unbound
In-Reply-To: <CAC_iWj+3JvPY2oqVOdu0T1Wt6-ukoy=dLc72u1f55yY23uOTbA@mail.gmail.com>
References: <20240918111826.863596-1-linyunsheng@huawei.com>
 <20240918111826.863596-3-linyunsheng@huawei.com>
 <CAC_iWjK=G7Oo5=pN2QunhasgDC6NyC1L+96jigX7u9ad+PbYng@mail.gmail.com>
 <894a3c2c-22f9-45b9-a82b-de7320066b42@kernel.org>
 <cdfecd37-31d7-42d2-a8d8-92008285b42e@huawei.com>
 <0e8c7a7a-0e2a-42ec-adbc-b29f6a514517@kernel.org>
 <CAC_iWj+3JvPY2oqVOdu0T1Wt6-ukoy=dLc72u1f55yY23uOTbA@mail.gmail.com>
Message-ID: <2c5ccfff-6ab4-4aea-bff6-3679ff72cc9a@huawei.com>

On 2024/9/20 13:29, Ilias Apalodimas wrote:
> Hi Jesper,
> 
> On Fri, 20 Sept 2024 at 00:04, Jesper Dangaard Brouer <hawk at kernel.org> wrote:
>>
>>
>>
>> On 19/09/2024 13.15, Yunsheng Lin wrote:
>>> On 2024/9/19 17:42, Jesper Dangaard Brouer wrote:
>>>>
>>>> On 18/09/2024 19.06, Ilias Apalodimas wrote:
>>>>>> In order not to do the dma unmmapping after driver has already
>>>>>> unbound and stall the unloading of the networking driver, add
>>>>>> the pool->items array to record all the pages including the ones
>>>>>> which are handed over to network stack, so the page_pool can
>>>>>> do the dma unmmapping for those pages when page_pool_destroy()
>>>>>> is called.
>>>>>
>>>>> So, I was thinking of a very similar idea. But what do you mean by
>>>>> "all"? The pages that are still in caches (slow or fast) of the pool
>>>>> will be unmapped during page_pool_destroy().
>>>>
>>>> I really dislike this idea of having to keep track of all outstanding pages.
>>>>
>>>> I liked Jakub's idea of keeping the netdev around for longer.
>>>>
>>>> This is all related to destroying the struct device that have points to
>>>> the DMA engine, right?
>>>
>>> Yes, the problem seems to be that when device_del() is called, there is
>>> no guarantee hw behind the 'struct device ' will be usable even if we
>>> call get_device() on it.
>>>
>>>>
>>>> Why don't we add an API that allow netdev to "give" struct device to
>>>> page_pool.  And then the page_poll will take over when we can safely
>>>> free the stuct device?
>>>
>>> By 'allow netdev to "give" struct device to page_pool', does it mean
>>> page_pool become the driver for the device?
>>> If yes, it seems that is similar to jakub's idea, as both seems to stall
>>> the calling of device_del() by not returning when the driver unloading.
>>
>> Yes, this is what I mean. (That is why I mentioned Jakub's idea).

I am not sure what dose the API that allows netdev to "give" struct device
to page_pool look like or how to implement the API yet, but the obvious way
to stall the calling of device_del() is to wait for the inflight page to
come back in page_pool_destroy(), which seems the same as the jakub's
way from the viewpoint of user, and jakub's way seems more elegant than
waiting in page_pool_destroy().

> 
> Keeping track of inflight packets that need to be unmapped is
> certainly more complex. Delaying the netdevice destruction certainly
> solves the problem but there's a huge cost IMHO. Those devices might
> stay there forever and we have zero guarantees that the network stack
> will eventually release (and unmap) those packets. What happens in
> that case? The user basically has to reboot the entire machine, just
> because he tries to bring an interface down and up again.

Yes.
The problem seems to be how long page_pool is allowed to stall the driver
unloading? Does the driver unload stalling affect some feature like device
hotplug?
As the problem in [1], the stall might be forever due to caching in the
network stack as discussed in [2], and there might be some other caching
we don't know yet.

The stalling log in [1] is caused by the caching in skb_attempt_defer_free(),
we may argue that a timeout is needed for those kind of caching, but Eric
seemed to think otherwise in commit log of [3]:
"As Eric pointed out/predicted there's no guarantee that
applications will read / close their sockets so a page pool page
may be stuck in a socket (but not leaked) forever."

1. https://lore.kernel.org/netdev/20240814075603.05f8b0f5 at kernel.org/T/#me2f2c89fbeb7f92a27d54a85aab5527efedfe260
2. https://lore.kernel.org/netdev/20240814075603.05f8b0f5 at kernel.org/T/#m2687f25537395401cd6a810ac14e0e0d9addf97e
3. https://lore.kernel.org/netdev/ZWfuyc13oEkp583C at makrotopia.org/T/

> 
> Thanks
> /Ilias
>>
>>
>>> If no, it seems that the problem is still existed when the driver for
>>> the device has unbound after device_del() is called.


From Chris.Lu at mediatek.com  Thu Sep 19 23:27:13 2024
From: Chris.Lu at mediatek.com (=?utf-8?B?Q2hyaXMgTHUgKOmZuOeomuazkyk=?=)
Date: Fri, 20 Sep 2024 06:27:13 +0000
Subject: [PATCH] Bluetooth: btmtk: Remove resetting mt7921 before
 downloading the fw
In-Reply-To: <Zuyk1c6Gkxx3G0PB@mdpsys.co.uk>
References: <20240822052310.25220-1-hao.qin@mediatek.com>
	 <ZuB3omUkdUHLggYu@mdpsys.co.uk>
	 <790e542aa9d08c7efeee6ef298fce2a87d8035e4.camel@mediatek.com>
	 <ZuneSM4SvyUFX86j@mdpsys.co.uk>
	 <9bfbbf24ac2480d94d3455f7e33e4b5502b38ced.camel@mediatek.com>
	 <CABBYNZKYsL9jcF2n9TsA1BjU-CjXOdXu7MDLP9Sz_Ly8hBAf1w@mail.gmail.com>
	 <c01e6dfa730dd10a7d4dba60fe31e82b9c296b37.camel@mediatek.com>
	 <Zuyk1c6Gkxx3G0PB@mdpsys.co.uk>
Message-ID: <f9e8688ebe559e10c019d0cbab4e8b1f5a7d2339.camel@mediatek.com>

Hi Marc,

Sorry for late reply,

On Thu, 2024-09-19 at 23:25 +0100, marc.payne at mdpsys.co.uk wrote:
>  	 
> External email : Please do not click links or open attachments until
> you have verified the sender or the content.
>  Hi Chris and Luiz,
> 
> What were your thoughts on the findings in my email dated 18th
> September?
> 

Thanks for your suggestion.

I've prepared the same environment (Kernel v6.11 + MT7921AUN dongle) to
reproduce the issue, collected necessary logs locally and also
initiated an internal discussion to clarify the root cause of this
symptom. We'll review the changes between two firmware
(20230526/20231109) if it's a bug or not.

It may take some time to investigate. I'll let you know if there is any
progress.

BRs,
Chris

> The 19/09/2024 03:26, Chris Lu (???) wrote:
> > Hi Luiz,
> > 
> > On Wed, 2024-09-18 at 09:37 -0400, Luiz Augusto von Dentz wrote:
> > >   
> > > External email : Please do not click links or open attachments
> until
> > > you have verified the sender or the content.
> > >  Hi Chris,
> > > 
> > > On Tue, Sep 17, 2024 at 11:37?PM Chris Lu (???) <
> > > Chris.Lu at mediatek.com> wrote:
> > > >
> > > > On Tue, 2024-09-17 at 20:53 +0100, marc.payne at mdpsys.co.uk
> wrote:
> > > >
> > > > Hi Marc,
> > > >
> > > > Thank you for providing the logs for us to debug.
> > > >
> > > >
> > > > External email : Please do not click links or open attachments
> > > until you have verified the sender or the content.
> > > >  The 12/09/2024 07:09, Chris Lu (???) wrote:
> > > > > On Tue, 2024-09-10 at 18:09 +0100, Marc Payne wrote:
> > > > >
> > > > > Hi Marc,
> > > >
> > > > Hi,
> > > >
> > > > >
> > > > > Is it possible to provide entire kernel log for further
> > > debugging?
> > > > > (From boot up to issue heppen)
> > > > >
> > > > > We suspect that the issue occurred event earilier and our
> > > controller is
> > > > > not able to recover itself. Therfore, we need to check if
> > > Bluetooth
> > > > > works as expected in the booting stage.
> > > >
> > > > Happy to help. Below is the log for a cold boot of Linux 6.11-
> rc7
> > > (with
> > > > the additional patch to avoid the controller reset before fw
> load).
> > > The
> > > > MT7921AUN is directly connected to one of the computer's USB
> ports.
> > > The
> > > >
> > > >
> > > > Is "MT7921AUN" an external Bluetooth/WiFi usb dongle?
> > > > From the information in the kernel log you provided, the
> MT7921AUN
> > > IC used on
> > > > the dongle is not for Linux PC project. Since the firmware we
> push
> > > to Kernel is not
> > > > for "MT7921AUN", software, firmware and hardware may not match.
> > > Using that
> > > > dongle with Linux-Based Notebook may lead to some unexpected
> errors
> > > such as
> > > > Bluetooth can't setup successfully.
> > > 
> 
> If the AUN is really so different from other MT7921 variants, why has
> MediaTek reused the VID:PID 0e8d:7961? Why is it even using the
> MT7921 name
> at all?
> 
> > > Then something is not right with our code, either the driver
> shall
> > > not
> > > be probed for such models or not attempt to load the wrong
> firmware,
> > > sounds like the patch tries to address the later but given your
> > > explanation perhaps we should consider not even attempting to
> probe
> > > for such models?
> > 
> > After internal investigation, that MT7921AUN connectivity dongle
> was
> > made by a module maker which MediaTek didn't participate in the
> > development and verification. We only ensure the modules on
> Notebook
> > product can work normally. MT7921AUN has never been used in the
> > Notebook product line. Acutally, the coredump is one of the
> protection
> > mechanism to make invalid module doesn't work on Notebook.
> 
> The MT7921AU(N) is a USB3 connected WiFi 6E/BT IC. I agree, it won't
> be
> used in a Notebook, a PCIe WiFi (USB BT) version in a M.2 socket will
> be
> preferred, something like the MT7921K. 
> 
> MediaTek has released Windows drivers for the AU(N) variant and the
> mt7921u driver has been added to Linux more than two years ago
> specifically
> to support USB-based variants of the MT7921 family of ICs, Tested-by
> Sean Wang and Deren Wu from MediaTek. Clearly there is an intent to
> support the use of these ICs on the PC platform, Notebook or
> otherwise.
> 
> I understand that MediaTek may have had issues with poor quality
> implementations from third-party manufacturers that may have caused
> the ICs to glitch in the past. I don't think that's what is happening
> here because my device works perfectly with old BT firmware
> and also works with latest firmware with the USB reset workaround
> detailed in my previous email.
> 
> > 
> > Currently, we only use PID/VID to control whether "probe" is
> triggered
> > or not. However, that module use MediaTek's common PID/VID  which
> is
> > hard to be excluded. I agree with your opinion. We'll dicuss
> another
> > method to prevent unexpected module type from being recongized in
> > driver layer in the near future.
> 
> Please don't break/block working hardware on Linux! There is already
> enough hardware that doesn't play nice with it, we really don't need
> any more.
> 
> To make a point, I have typed this email on a Bluetooth keyboard
> paired with
> the AWUS036AXML (MT7921AUN) running the latest firmware
> 20240826151221.
> I have used the workaround detailed in my email sent to Chris (CC'd
> to
> Luiz) on 18th September.
> 
> This is working hardware, let's fix the bugs in the driver and the
> firmware.
> 
> Regards,
> 
> Marc
> 
> > 
> > > 
> > > > Do you have an M.2 MT7921 module? (Typically existed in the
> > > Notebook product with
> > > > MediaTek Connectivity solution). The M.2 module is the correct
> one
> > > expected to be used.
> > > > I've setup an environment locally with Kernel v6.11, With Hao
> Qin's
> > > solustion
> > > > ("[PATCH] Bluetooth: btmtk: Remove resetting mt7921 before
> > > downloading the fw"),
> > > > I'm albe to successfully setup Bluetooth and works normally.
> > > 
> > > Shall I consider this a Tested-by?
> > 
> > Yes, I've verified with this change. MT7921e/MT7922e/MT7925e M.2
> (all
> > of their Bluetooth use USB interface) are able to setup and work
> > normally.
> > 
> > BRs,
> > Chris
> > 
> > > 
> > > > BRs,
> > > > Chris
> > > >
> > > > system has an Intel AX211 fitted so I have disabled it's
> bluetooth
> > > > functionality in the UEFI setup.
> > > >
> > > > Hope this helps.
> > > >
> > > > >
> > > > > BRs,
> > > > > Chris Lu
> > > >
> > > > Regards,
> > > >
> > > > Marc
> > > >
> > > >
> > > > [    0.000000] Linux version 6.11.0-rc7-00001-g0e2ad6528188-
> dirty (
> > > marcp at mdp-archnuc) (gcc (GCC) 14.2.1 20240805, GNU ld (GNU
> Binutils)
> > > 2.43.0) #71 SMP PREEMPT_DYNAMIC Mon Sep  9 23:22:56 BST 2024
> > > > [    0.000000] Command line: root=UUID=0420afc7-4947-4e2e-a096-
> > > b607b8b7fd93 rw quiet initrd=boot\intel-ucode.img
> > > initrd=boot\initramfs-linux611.img resume=UUID=0420afc7-4947-
> 4e2e-
> > > a096-b607b8b7fd93 resume_offset=106496
> > > > [    0.000000] x86/split lock detection: #AC: crashing the
> kernel
> > > on kernel split_locks and warning on user-space split_locks
> > > > [    0.000000] BIOS-provided physical RAM map:
> > > > [    0.000000] BIOS-e820: [mem 0x0000000000000000-
> > > 0x000000000009dfff] usable
> > > > [    0.000000] BIOS-e820: [mem 0x000000000009e000-
> > > 0x000000000009efff] reserved
> > > > [    0.000000] BIOS-e820: [mem 0x000000000009f000-
> > > 0x000000000009ffff] usable
> > > > [    0.000000] BIOS-e820: [mem 0x00000000000a0000-
> > > 0x00000000000fffff] reserved
> > > > [    0.000000] BIOS-e820: [mem 0x0000000000100000-
> > > 0x000000004dd45fff] usable
> > > > [    0.000000] BIOS-e820: [mem 0x000000004dd46000-
> > > 0x0000000056c70fff] reserved
> > > > [    0.000000] BIOS-e820: [mem 0x0000000056c71000-
> > > 0x0000000056d48fff] ACPI data
> > > > [    0.000000] BIOS-e820: [mem 0x0000000056d49000-
> > > 0x0000000056ecefff] ACPI NVS
> > > > [    0.000000] BIOS-e820: [mem 0x0000000056ecf000-
> > > 0x000000005a7fefff] reserved
> > > > [    0.000000] BIOS-e820: [mem 0x000000005a7ff000-
> > > 0x000000005a7fffff] usable
> > > > [    0.000000] BIOS-e820: [mem 0x000000005a800000-
> > > 0x00000000611fffff] reserved
> > > > [    0.000000] BIOS-e820: [mem 0x0000000061e00000-
> > > 0x00000000687fffff] reserved
> > > > [    0.000000] BIOS-e820: [mem 0x00000000c0000000-
> > > 0x00000000cfffffff] reserved
> > > > [    0.000000] BIOS-e820: [mem 0x00000000fe000000-
> > > 0x00000000fe010fff] reserved
> > > > [    0.000000] BIOS-e820: [mem 0x00000000fec00000-
> > > 0x00000000fec00fff] reserved
> > > > [    0.000000] BIOS-e820: [mem 0x00000000fed00000-
> > > 0x00000000fed00fff] reserved
> > > > [    0.000000] BIOS-e820: [mem 0x00000000fed20000-
> > > 0x00000000fed7ffff] reserved
> > > > [    0.000000] BIOS-e820: [mem 0x00000000fee00000-
> > > 0x00000000fee00fff] reserved
> > > > [    0.000000] BIOS-e820: [mem 0x00000000ff000000-
> > > 0x00000000ffffffff] reserved
> > > > [    0.000000] BIOS-e820: [mem 0x0000000100000000-
> > > 0x00000010977fffff] usable
> > > > [    0.000000] NX (Execute Disable) protection: active
> > > > [    0.000000] APIC: Static calls initialized
> > > > [    0.000000] efi: EFI v2.8 by American Megatrends
> > > > [    0.000000] efi: ACPI=0x56e48000 ACPI 2.0=0x56e48014
> > > TPMFinalLog=0x56db4000 SMBIOS=0x5a483000 SMBIOS 3.0=0x5a482000
> > > MEMATTR=0x4485d118 ESRT=0x43ea7e98 INITRD=0x41e12e98
> RNG=0x56c9b018
> > > TPMEventLog=0x41dd5018
> > > > [    0.000000] random: crng init done
> > > > [    0.000000] efi: Remove mem115: MMIO range=[0xc0000000-
> > > 0xcfffffff] (256MB) from e820 map
> > > > [    0.000000] e820: remove [mem 0xc0000000-0xcfffffff]
> reserved
> > > > [    0.000000] efi: Not removing mem116: MMIO
> range=[0xfe000000-
> > > 0xfe010fff] (68KB) from e820 map
> > > > [    0.000000] efi: Not removing mem117: MMIO
> range=[0xfec00000-
> > > 0xfec00fff] (4KB) from e820 map
> > > > [    0.000000] efi: Not removing mem118: MMIO
> range=[0xfed00000-
> > > 0xfed00fff] (4KB) from e820 map
> > > > [    0.000000] efi: Not removing mem120: MMIO
> range=[0xfee00000-
> > > 0xfee00fff] (4KB) from e820 map
> > > > [    0.000000] efi: Remove mem121: MMIO range=[0xff000000-
> > > 0xffffffff] (16MB) from e820 map
> > > > [    0.000000] e820: remove [mem 0xff000000-0xffffffff]
> reserved
> > > > [    0.000000] SMBIOS 3.5.0 present.
> > > > [    0.000000] DMI: Intel(R) Client Systems
> NUC12WSHi7/NUC12WSBi7,
> > > BIOS WSADL357.0088.2023.0505.1623 05/05/2023
> > > > [    0.000000] DMI: Memory slots populated: 2/2
> > > > [    0.000000] tsc: Detected 2500.000 MHz processor
> > > > [    0.000000] tsc: Detected 2496.000 MHz TSC
> > > > [    0.000549] e820: update [mem 0x00000000-0x00000fff] usable
> ==>
> > > reserved
> > > > [    0.000550] e820: remove [mem 0x000a0000-0x000fffff] usable
> > > > [    0.000555] last_pfn = 0x1097800 max_arch_pfn = 0x400000000
> > > > [    0.000558] MTRR map: 5 entries (3 fixed + 2 variable; max
> 23),
> > > built from 10 variable MTRRs
> > > > [    0.000559] x86/PAT: Configuration [0-7]: WB  WC  UC-
> > > UC  WB  WP  UC- WT
> > > > [    0.000935] last_pfn = 0x5a800 max_arch_pfn = 0x400000000
> > > > [    0.014044] esrt: Reserving ESRT space from
> 0x0000000043ea7e98
> > > to 0x0000000043ea7f98.
> > > > [    0.014049] e820: update [mem 0x43ea7000-0x43ea7fff] usable
> ==>
> > > reserved
> > > > [    0.014062] Using GB pages for direct mapping
> > > > [    0.014063] Incomplete global flushes, disabling PCID
> > > > [    0.014285] Secure boot disabled
> > > > [    0.014285] RAMDISK: [mem 0x39be8000-0x4039cfff]
> > > > [    0.014312] ACPI: Early table checksum verification disabled
> > > > [    0.014315] ACPI: RSDP 0x0000000056E48014 000024 (v02 INTEL
> )
> > > > [    0.014318] ACPI: XSDT 0x0000000056DE4728 000114 (v01
> > > INTEL  NUCxi7A5 00000058 AMI  01000013)
> > > > [    0.014322] ACPI: FACP 0x0000000056D46000 000114 (v06
> > > INTEL  NUCxi7A5 00000058 AMI  01000013)
> > > > [    0.014326] ACPI: DSDT 0x0000000056CD9000 06CECF (v02
> > > INTEL  NUCxi7A5 00000058 INTL 20200717)
> > > > [    0.014328] ACPI: FACS 0x0000000056ECC000 000040
> > > > [    0.014329] ACPI: FIDT 0x0000000056CD8000 00009C (v01
> > > INTEL  NUCxi7A5 00000058 AMI  00010013)
> > > > [    0.014331] ACPI: SSDT 0x0000000056D48000 00038C (v02
> > > INTEL  NUCxi7A5 00000058 INTL 20200717)
> > > > [    0.014333] ACPI: SSDT 0x0000000056CD2000 005D2C (v02
> > > INTEL  NUCxi7A5 00000058 INTL 20200717)
> > > > [    0.014335] ACPI: SSDT 0x0000000056CCF000 002AA1 (v02
> > > INTEL  NUCxi7A5 00000058 INTL 20200717)
> > > > [    0.014337] ACPI: SSDT 0x0000000056CCB000 0033D3 (v02
> > > INTEL  NUCxi7A5 00000058 INTL 20200717)
> > > > [    0.014339] ACPI: SSDT 0x0000000056CBD000 00D39F (v02
> > > INTEL  NUCxi7A5 00001000 INTL 20200717)
> > > > [    0.014341] ACPI: HPET 0x0000000056D47000 000038 (v01
> > > INTEL  NUCxi7A5 00000058 AMI  01000013)
> > > > [    0.014343] ACPI: APIC 0x0000000056CBC000 0001DC (v05
> > > INTEL  NUCxi7A5 00000058 AMI  01000013)
> > > > [    0.014344] ACPI: MCFG 0x0000000056CBB000 00003C (v01
> > > INTEL  NUCxi7A5 00000058 AMI  01000013)
> > > > [    0.014346] ACPI: SSDT 0x0000000056CB9000 001F04 (v02
> > > INTEL  NUCxi7A5 00000058 INTL 20200717)
> > > > [    0.014348] ACPI: SSDT 0x0000000056CB7000 001DFD (v02
> > > INTEL  NUCxi7A5 00000058 INTL 20200717)
> > > > [    0.014350] ACPI: UEFI 0x0000000056D9B000 000048 (v01
> > > INTEL  NUCxi7A5 00000058 AMI  01000013)
> > > > [    0.014352] ACPI: NHLT 0x0000000056CB6000 0002F1 (v00
> > > INTEL  NUCxi7A5 00000058 AMI  01000013)
> > > > [    0.014353] ACPI: LPIT 0x0000000056CB5000 0000CC (v01
> > > INTEL  NUCxi7A5 00000058 AMI  01000013)
> > > > [    0.014355] ACPI: WDAT 0x0000000056CB3000 000134 (v01
> > > INTEL  NUCxi7A5 00000058 AMI  01000013)
> > > > [    0.014357] ACPI: SSDT 0x0000000056CB0000 002A83 (v02
> > > INTEL  NUCxi7A5 00000058 INTL 20200717)
> > > > [    0.014359] ACPI: SSDT 0x0000000056CAD000 002357 (v02
> > > INTEL  NUCxi7A5 00000058 INTL 20200717)
> > > > [    0.014361] ACPI: DBGP 0x0000000056CAC000 000034 (v01
> > > INTEL  NUCxi7A5 00000058 AMI  01000013)
> > > > [    0.014363] ACPI: DBG2 0x0000000056CAB000 000054 (v00
> > > INTEL  NUCxi7A5 00000058 AMI  01000013)
> > > > [    0.014364] ACPI: DMAR 0x0000000056CAA000 000088 (v02
> > > INTEL  NUCxi7A5 00000058      01000013)
> > > > [    0.014366] ACPI: FPDT 0x0000000056CA9000 000044 (v01
> > > INTEL  NUCxi7A5 00000058 AMI  01000013)
> > > > [    0.014368] ACPI: SSDT 0x0000000056CA8000 000D56 (v02
> > > INTEL  NUCxi7A5 00000058 INTL 20200717)
> > > > [    0.014370] ACPI: SSDT 0x0000000056CA4000 003AEA (v02
> > > INTEL  NUCxi7A5 00000058 INTL 20200717)
> > > > [    0.014372] ACPI: SSDT 0x0000000056CA0000 0035A2 (v02
> > > INTEL  NUCxi7A5 00000058 INTL 20200717)
> > > > [    0.014374] ACPI: SSDT 0x0000000056C9F000 000144 (v02
> > > INTEL  NUCxi7A5 00000058 INTL 20200717)
> > > > [    0.014376] ACPI: BGRT 0x0000000056C9E000 000038 (v01
> > > INTEL  NUCxi7A5 00000058 AMI  00010013)
> > > > [    0.014377] ACPI: TPM2 0x0000000056C9D000 00004C (v04
> > > INTEL  NUCxi7A5 00000058 AMI  00000000)
> > > > [    0.014379] ACPI: PHAT 0x0000000056C9C000 00062D (v01
> > > INTEL  NUCxi7A5 00000058 MSFT 0100000D)
> > > > [    0.014381] ACPI: WSMT 0x0000000056CB4000 000028 (v01
> > > INTEL  NUCxi7A5 00000058 AMI  00010013)
> > > > [    0.014383] ACPI: Reserving FACP table memory at [mem
> > > 0x56d46000-0x56d46113]
> > > > [    0.014384] ACPI: Reserving DSDT table memory at [mem
> > > 0x56cd9000-0x56d45ece]
> > > > [    0.014384] ACPI: Reserving FACS table memory at [mem
> > > 0x56ecc000-0x56ecc03f]
> > > > [    0.014385] ACPI: Reserving FIDT table memory at [mem
> > > 0x56cd8000-0x56cd809b]
> > > > [    0.014386] ACPI: Reserving SSDT table memory at [mem
> > > 0x56d48000-0x56d4838b]
> > > > [    0.014386] ACPI: Reserving SSDT table memory at [mem
> > > 0x56cd2000-0x56cd7d2b]
> > > > [    0.014387] ACPI: Reserving SSDT table memory at [mem
> > > 0x56ccf000-0x56cd1aa0]
> > > > [    0.014387] ACPI: Reserving SSDT table memory at [mem
> > > 0x56ccb000-0x56cce3d2]
> > > > [    0.014388] ACPI: Reserving SSDT table memory at [mem
> > > 0x56cbd000-0x56cca39e]
> > > > [    0.014388] ACPI: Reserving HPET table memory at [mem
> > > 0x56d47000-0x56d47037]
> > > > [    0.014389] ACPI: Reserving APIC table memory at [mem
> > > 0x56cbc000-0x56cbc1db]
> > > > [    0.014389] ACPI: Reserving MCFG table memory at [mem
> > > 0x56cbb000-0x56cbb03b]
> > > > [    0.014390] ACPI: Reserving SSDT table memory at [mem
> > > 0x56cb9000-0x56cbaf03]
> > > > [    0.014390] ACPI: Reserving SSDT table memory at [mem
> > > 0x56cb7000-0x56cb8dfc]
> > > > [    0.014391] ACPI: Reserving UEFI table memory at [mem
> > > 0x56d9b000-0x56d9b047]
> > > > [    0.014391] ACPI: Reserving NHLT table memory at [mem
> > > 0x56cb6000-0x56cb62f0]
> > > > [    0.014392] ACPI: Reserving LPIT table memory at [mem
> > > 0x56cb5000-0x56cb50cb]
> > > > [    0.014392] ACPI: Reserving WDAT table memory at [mem
> > > 0x56cb3000-0x56cb3133]
> > > > [    0.014393] ACPI: Reserving SSDT table memory at [mem
> > > 0x56cb0000-0x56cb2a82]
> > > > [    0.014393] ACPI: Reserving SSDT table memory at [mem
> > > 0x56cad000-0x56caf356]
> > > > [    0.014394] ACPI: Reserving DBGP table memory at [mem
> > > 0x56cac000-0x56cac033]
> > > > [    0.014394] ACPI: Reserving DBG2 table memory at [mem
> > > 0x56cab000-0x56cab053]
> > > > [    0.014395] ACPI: Reserving DMAR table memory at [mem
> > > 0x56caa000-0x56caa087]
> > > > [    0.014395] ACPI: Reserving FPDT table memory at [mem
> > > 0x56ca9000-0x56ca9043]
> > > > [    0.014396] ACPI: Reserving SSDT table memory at [mem
> > > 0x56ca8000-0x56ca8d55]
> > > > [    0.014396] ACPI: Reserving SSDT table memory at [mem
> > > 0x56ca4000-0x56ca7ae9]
> > > > [    0.014397] ACPI: Reserving SSDT table memory at [mem
> > > 0x56ca0000-0x56ca35a1]
> > > > [    0.014397] ACPI: Reserving SSDT table memory at [mem
> > > 0x56c9f000-0x56c9f143]
> > > > [    0.014398] ACPI: Reserving BGRT table memory at [mem
> > > 0x56c9e000-0x56c9e037]
> > > > [    0.014398] ACPI: Reserving TPM2 table memory at [mem
> > > 0x56c9d000-0x56c9d04b]
> > > > [    0.014399] ACPI: Reserving PHAT table memory at [mem
> > > 0x56c9c000-0x56c9c62c]
> > > > [    0.014400] ACPI: Reserving WSMT table memory at [mem
> > > 0x56cb4000-0x56cb4027]
> > > > [    0.014743] No NUMA configuration found
> > > > [    0.014744] Faking a node at [mem 0x0000000000000000-
> > > 0x00000010977fffff]
> > > > [    0.014746] NODE_DATA(0) allocated [mem 0x10977fb000-
> > > 0x10977fffff]
> > > > [    0.014795] Zone ranges:
> > > > [    0.014796]   DMA      [mem 0x0000000000001000-
> > > 0x0000000000ffffff]
> > > > [    0.014797]   DMA32    [mem 0x0000000001000000-
> > > 0x00000000ffffffff]
> > > > [    0.014798]   Normal   [mem 0x0000000100000000-
> > > 0x00000010977fffff]
> > > > [    0.014799]   Device   empty
> > > > [    0.014799] Movable zone start for each node
> > > > [    0.014800] Early memory node ranges
> > > > [    0.014800]   node   0: [mem 0x0000000000001000-
> > > 0x000000000009dfff]
> > > > [    0.014801]   node   0: [mem 0x000000000009f000-
> > > 0x000000000009ffff]
> > > > [    0.014801]   node   0: [mem 0x0000000000100000-
> > > 0x000000004dd45fff]
> > > > [    0.014802]   node   0: [mem 0x000000005a7ff000-
> > > 0x000000005a7fffff]
> > > > [    0.014802]   node   0: [mem 0x0000000100000000-
> > > 0x00000010977fffff]
> > > > [    0.014805] Initmem setup node 0 [mem 0x0000000000001000-
> > > 0x00000010977fffff]
> > > > [    0.014808] On node 0, zone DMA: 1 pages in unavailable
> ranges
> > > > [    0.014809] On node 0, zone DMA: 1 pages in unavailable
> ranges
> > > > [    0.014821] On node 0, zone DMA: 96 pages in unavailable
> ranges
> > > > [    0.015998] On node 0, zone DMA32: 19129 pages in
> unavailable
> > > ranges
> > > > [    0.078525] On node 0, zone Normal: 22528 pages in
> unavailable
> > > ranges
> > > > [    0.078536] On node 0, zone Normal: 2048 pages in
> unavailable
> > > ranges
> > > > [    0.078567] Reserving Intel graphics memory at [mem
> 0x64800000-
> > > 0x687fffff]
> > > > [    0.080194] ACPI: PM-Timer IO Port: 0x1808
> > > > [    0.080199] ACPI: LAPIC_NMI (acpi_id[0x01] high edge
> lint[0x1])
> > > > [    0.080200] ACPI: LAPIC_NMI (acpi_id[0x02] high edge
> lint[0x1])
> > > > [    0.080200] ACPI: LAPIC_NMI (acpi_id[0x03] high edge
> lint[0x1])
> > > > [    0.080201] ACPI: LAPIC_NMI (acpi_id[0x04] high edge
> lint[0x1])
> > > > [    0.080201] ACPI: LAPIC_NMI (acpi_id[0x05] high edge
> lint[0x1])
> > > > [    0.080201] ACPI: LAPIC_NMI (acpi_id[0x06] high edge
> lint[0x1])
> > > > [    0.080202] ACPI: LAPIC_NMI (acpi_id[0x07] high edge
> lint[0x1])
> > > > [    0.080202] ACPI: LAPIC_NMI (acpi_id[0x08] high edge
> lint[0x1])
> > > > [    0.080203] ACPI: LAPIC_NMI (acpi_id[0x09] high edge
> lint[0x1])
> > > > [    0.080203] ACPI: LAPIC_NMI (acpi_id[0x0a] high edge
> lint[0x1])
> > > > [    0.080203] ACPI: LAPIC_NMI (acpi_id[0x0b] high edge
> lint[0x1])
> > > > [    0.080204] ACPI: LAPIC_NMI (acpi_id[0x0c] high edge
> lint[0x1])
> > > > [    0.080204] ACPI: LAPIC_NMI (acpi_id[0x0d] high edge
> lint[0x1])
> > > > [    0.080205] ACPI: LAPIC_NMI (acpi_id[0x0e] high edge
> lint[0x1])
> > > > [    0.080205] ACPI: LAPIC_NMI (acpi_id[0x0f] high edge
> lint[0x1])
> > > > [    0.080205] ACPI: LAPIC_NMI (acpi_id[0x10] high edge
> lint[0x1])
> > > > [    0.080206] ACPI: LAPIC_NMI (acpi_id[0x11] high edge
> lint[0x1])
> > > > [    0.080206] ACPI: LAPIC_NMI (acpi_id[0x12] high edge
> lint[0x1])
> > > > [    0.080207] ACPI: LAPIC_NMI (acpi_id[0x13] high edge
> lint[0x1])
> > > > [    0.080207] ACPI: LAPIC_NMI (acpi_id[0x14] high edge
> lint[0x1])
> > > > [    0.080207] ACPI: LAPIC_NMI (acpi_id[0x15] high edge
> lint[0x1])
> > > > [    0.080208] ACPI: LAPIC_NMI (acpi_id[0x16] high edge
> lint[0x1])
> > > > [    0.080208] ACPI: LAPIC_NMI (acpi_id[0x17] high edge
> lint[0x1])
> > > > [    0.080209] ACPI: LAPIC_NMI (acpi_id[0x00] high edge
> lint[0x1])
> > > > [    0.080291] IOAPIC[0]: apic_id 2, version 32, address
> > > 0xfec00000, GSI 0-119
> > > > [    0.080293] ACPI: INT_SRC_OVR (bus 0 bus_irq 0 global_irq 2
> dfl
> > > dfl)
> > > > [    0.080294] ACPI: INT_SRC_OVR (bus 0 bus_irq 9 global_irq 9
> high
> > > level)
> > > > [    0.080296] ACPI: Using ACPI (MADT) for SMP configuration
> > > information
> > > > [    0.080297] ACPI: HPET id: 0x8086a201 base: 0xfed00000
> > > > [    0.080302] e820: update [mem 0x444e6000-0x44584fff] usable
> ==>
> > > reserved
> > > > [    0.080309] TSC deadline timer available
> > > > [    0.080311] CPU topo: Max. logical packages:   1
> > > > [    0.080311] CPU topo: Max. logical dies:       1
> > > > [    0.080312] CPU topo: Max. dies per package:   1
> > > > [    0.080313] CPU topo: Max. threads per core:   2
> > > > [    0.080314] CPU topo: Num. cores per package:    12
> > > > [    0.080314] CPU topo: Num. threads per package:  16
> > > > [    0.080314] CPU topo: Allowing 16 present CPUs plus 0
> hotplug
> > > CPUs
> > > > [    0.080325] PM: hibernation: Registered nosave memory: [mem
> > > 0x00000000-0x00000fff]
> > > > [    0.080326] PM: hibernation: Registered nosave memory: [mem
> > > 0x0009e000-0x0009efff]
> > > > [    0.080327] PM: hibernation: Registered nosave memory: [mem
> > > 0x000a0000-0x000fffff]
> > > > [    0.080328] PM: hibernation: Registered nosave memory: [mem
> > > 0x43ea7000-0x43ea7fff]
> > > > [    0.080329] PM: hibernation: Registered nosave memory: [mem
> > > 0x444e6000-0x44584fff]
> > > > [    0.080330] PM: hibernation: Registered nosave memory: [mem
> > > 0x4dd46000-0x56c70fff]
> > > > [    0.080330] PM: hibernation: Registered nosave memory: [mem
> > > 0x56c71000-0x56d48fff]
> > > > [    0.080331] PM: hibernation: Registered nosave memory: [mem
> > > 0x56d49000-0x56ecefff]
> > > > [    0.080331] PM: hibernation: Registered nosave memory: [mem
> > > 0x56ecf000-0x5a7fefff]
> > > > [    0.080332] PM: hibernation: Registered nosave memory: [mem
> > > 0x5a800000-0x611fffff]
> > > > [    0.080332] PM: hibernation: Registered nosave memory: [mem
> > > 0x61200000-0x61dfffff]
> > > > [    0.080333] PM: hibernation: Registered nosave memory: [mem
> > > 0x61e00000-0x687fffff]
> > > > [    0.080333] PM: hibernation: Registered nosave memory: [mem
> > > 0x68800000-0xfdffffff]
> > > > [    0.080333] PM: hibernation: Registered nosave memory: [mem
> > > 0xfe000000-0xfe010fff]
> > > > [    0.080334] PM: hibernation: Registered nosave memory: [mem
> > > 0xfe011000-0xfebfffff]
> > > > [    0.080334] PM: hibernation: Registered nosave memory: [mem
> > > 0xfec00000-0xfec00fff]
> > > > [    0.080334] PM: hibernation: Registered nosave memory: [mem
> > > 0xfec01000-0xfecfffff]
> > > > [    0.080335] PM: hibernation: Registered nosave memory: [mem
> > > 0xfed00000-0xfed00fff]
> > > > [    0.080335] PM: hibernation: Registered nosave memory: [mem
> > > 0xfed01000-0xfed1ffff]
> > > > [    0.080336] PM: hibernation: Registered nosave memory: [mem
> > > 0xfed20000-0xfed7ffff]
> > > > [    0.080336] PM: hibernation: Registered nosave memory: [mem
> > > 0xfed80000-0xfedfffff]
> > > > [    0.080336] PM: hibernation: Registered nosave memory: [mem
> > > 0xfee00000-0xfee00fff]
> > > > [    0.080337] PM: hibernation: Registered nosave memory: [mem
> > > 0xfee01000-0xffffffff]
> > > > [    0.080338] [mem 0x68800000-0xfdffffff] available for PCI
> > > devices
> > > > [    0.080339] Booting paravirtualized kernel on bare hardware
> > > > [    0.080340] clocksource: refined-jiffies: mask: 0xffffffff
> > > max_cycles: 0xffffffff, max_idle_ns: 6370452778343963 ns
> > > > [    0.084163] setup_percpu: NR_CPUS:320 nr_cpumask_bits:16
> > > nr_cpu_ids:16 nr_node_ids:1
> > > > [    0.084800] percpu: Embedded 66 pages/cpu s233472 r8192
> d28672
> > > u524288
> > > > [    0.084804] pcpu-alloc: s233472 r8192 d28672 u524288
> > > alloc=1*2097152
> > > > [    0.084806] pcpu-alloc: [0] 00 01 02 03 [0] 04 05 06 07
> > > > [    0.084809] pcpu-alloc: [0] 08 09 10 11 [0] 12 13 14 15
> > > > [    0.084820] Kernel command line: root=UUID=0420afc7-4947-
> 4e2e-
> > > a096-b607b8b7fd93 rw quiet initrd=boot\intel-ucode.img
> > > initrd=boot\initramfs-linux611.img resume=UUID=0420afc7-4947-
> 4e2e-
> > > a096-b607b8b7fd93 resume_offset=106496
> > > > [    0.088825] Dentry cache hash table entries: 8388608 (order:
> 14,
> > > 67108864 bytes, linear)
> > > > [    0.090830] Inode-cache hash table entries: 4194304 (order:
> 13,
> > > 33554432 bytes, linear)
> > > > [    0.090938] Fallback order for Node 0: 0
> > > > [    0.090940] Built 1 zonelists, mobility grouping on.  Total
> > > pages: 16667877
> > > > [    0.090941] Policy zone: Normal
> > > > [    0.091110] mem auto-init: stack:all(zero), heap alloc:on,
> heap
> > > free:off
> > > > [    0.091117] software IO TLB: area num 16.
> > > > [    0.174200] SLUB: HWalign=64, Order=0-3, MinObjects=0,
> CPUs=16,
> > > Nodes=1
> > > > [    0.174233] ftrace: allocating 50629 entries in 198 pages
> > > > [    0.178623] ftrace: allocated 198 pages with 4 groups
> > > > [    0.178673] Dynamic Preempt: full
> > > > [    0.178715] rcu: Preemptible hierarchical RCU
> implementation.
> > > > [    0.178716] rcu: RCU restricting CPUs from NR_CPUS=320 to
> > > nr_cpu_ids=16.
> > > > [    0.178716] rcu: RCU priority boosting: priority 1 delay 500
> ms.
> > > > [    0.178717] Trampoline variant of Tasks RCU enabled.
> > > > [    0.178718] Rude variant of Tasks RCU enabled.
> > > > [    0.178718] Tracing variant of Tasks RCU enabled.
> > > > [    0.178718] rcu: RCU calculated value of scheduler-
> enlistment
> > > delay is 30 jiffies.
> > > > [    0.178719] rcu: Adjusting geometry for rcu_fanout_leaf=16,
> > > nr_cpu_ids=16
> > > > [    0.178727] RCU Tasks: Setting shift to 4 and lim to 1
> > > rcu_task_cb_adjust=1.
> > > > [    0.178728] RCU Tasks Rude: Setting shift to 4 and lim to 1
> > > rcu_task_cb_adjust=1.
> > > > [    0.178729] RCU Tasks Trace: Setting shift to 4 and lim to 1
> > > rcu_task_cb_adjust=1.
> > > > [    0.181066] NR_IRQS: 20736, nr_irqs: 2184, preallocated
> irqs: 16
> > > > [    0.181413] rcu: srcu_init: Setting srcu_struct sizes based
> on
> > > contention.
> > > > [    0.181851] kfence: initialized - using 2097152 bytes for
> 255
> > > objects at 0x(____ptrval____)-0x(____ptrval____)
> > > > [    0.181876] Console: colour dummy device 80x25
> > > > [    0.181878] printk: legacy console [tty0] enabled
> > > > [    0.181906] ACPI: Core revision 20240322
> > > > [    0.182096] hpet: HPET dysfunctional in PC10. Force
> disabled.
> > > > [    0.182097] APIC: Switch to symmetric I/O mode setup
> > > > [    0.182099] DMAR: Host address width 39
> > > > [    0.182099] DMAR: DRHD base: 0x000000fed90000 flags: 0x0
> > > > [    0.182103] DMAR: dmar0: reg_base_addr fed90000 ver 4:0 cap
> > > 1c0000c40660462 ecap 29a00f0505e
> > > > [    0.182104] DMAR: DRHD base: 0x000000fed91000 flags: 0x1
> > > > [    0.182107] DMAR: dmar1: reg_base_addr fed91000 ver 5:0 cap
> > > d2008c40660462 ecap f050da
> > > > [    0.182109] DMAR: RMRR base: 0x00000064000000 end:
> > > 0x000000687fffff
> > > > [    0.182111] DMAR-IR: IOAPIC id 2 under DRHD base  0xfed91000
> > > IOMMU 1
> > > > [    0.182112] DMAR-IR: HPET id 0 under DRHD base 0xfed91000
> > > > [    0.182112] DMAR-IR: Queued invalidation will be enabled to
> > > support x2apic and Intr-remapping.
> > > > [    0.186032] DMAR-IR: Enabled IRQ remapping in x2apic mode
> > > > [    0.186034] x2apic enabled
> > > > [    0.186100] APIC: Switched APIC routing to: cluster x2apic
> > > > [    0.197380] clocksource: tsc-early: mask: 0xffffffffffffffff
> > > max_cycles: 0x23fa772cf26, max_idle_ns: 440795269835 ns
> > > > [    0.197384] Calibrating delay loop (skipped), value
> calculated
> > > using timer frequency.. 4993.00 BogoMIPS (lpj=8320000)
> > > > [    0.197430] CPU0: Thermal monitoring enabled (TM1)
> > > > [    0.197431] x86/cpu: User Mode Instruction Prevention (UMIP)
> > > activated
> > > > [    0.197530] CET detected: Indirect Branch Tracking enabled
> > > > [    0.197532] Last level iTLB entries: 4KB 0, 2MB 0, 4MB 0
> > > > [    0.197532] Last level dTLB entries: 4KB 0, 2MB 0, 4MB 0,
> 1GB 0
> > > > [    0.197534] process: using mwait in idle threads
> > > > [    0.197536] Spectre V1 : Mitigation: usercopy/swapgs
> barriers
> > > and __user pointer sanitization
> > > > [    0.197537] Spectre V2 : Mitigation: Enhanced / Automatic
> IBRS
> > > > [    0.197538] Spectre V2 : Spectre v2 / SpectreRSB mitigation:
> > > Filling RSB on context switch
> > > > [    0.197538] Spectre V2 : Spectre v2 / PBRSB-eIBRS: Retire a
> > > single CALL on VMEXIT
> > > > [    0.197539] Spectre V2 : mitigation: Enabling conditional
> > > Indirect Branch Prediction Barrier
> > > > [    0.197540] Speculative Store Bypass: Mitigation:
> Speculative
> > > Store Bypass disabled via prctl
> > > > [    0.197541] Register File Data Sampling: Mitigation: Clear
> > > Register File
> > > > [    0.197547] x86/fpu: Supporting XSAVE feature 0x001: 'x87
> > > floating point registers'
> > > > [    0.197548] x86/fpu: Supporting XSAVE feature 0x002: 'SSE
> > > registers'
> > > > [    0.197548] x86/fpu: Supporting XSAVE feature 0x004: 'AVX
> > > registers'
> > > > [    0.197549] x86/fpu: Supporting XSAVE feature 0x200:
> 'Protection
> > > Keys User registers'
> > > > [    0.197549] x86/fpu: Supporting XSAVE feature 0x800:
> 'Control-
> > > flow User registers'
> > > > [    0.197550] x86/fpu: xstate_offset[2]:  576,
> > > xstate_sizes[2]:  256
> > > > [    0.197551] x86/fpu: xstate_offset[9]:  832,
> > > xstate_sizes[9]:    8
> > > > [    0.197551] x86/fpu: xstate_offset[11]:  840,
> > > xstate_sizes[11]:   16
> > > > [    0.197552] x86/fpu: Enabled xstate features 0xa07, context
> size
> > > is 856 bytes, using 'compacted' format.
> > > > [    0.200716] Freeing SMP alternatives memory: 40K
> > > > [    0.200716] pid_max: default: 32768 minimum: 301
> > > > [    0.200716] LSM: initializing
> > > lsm=capability,landlock,lockdown,yama,bpf
> > > > [    0.200716] landlock: Up and running.
> > > > [    0.200716] Yama: becoming mindful.
> > > > [    0.200716] LSM support for eBPF active
> > > > [    0.200716] Mount-cache hash table entries: 131072 (order:
> 8,
> > > 1048576 bytes, linear)
> > > > [    0.200716] Mountpoint-cache hash table entries: 131072
> (order:
> > > 8, 1048576 bytes, linear)
> > > > [    0.200716] smpboot: CPU0: 12th Gen Intel(R) Core(TM) i7-
> 1260P
> > > (family: 0x6, model: 0x9a, stepping: 0x3)
> > > > [    0.200716] Performance Events: XSAVE Architectural LBR,
> PEBS
> > > fmt4+-baseline,  AnyThread deprecated, Alderlake Hybrid events,
> 32-
> > > deep LBR, full-width counters, Intel PMU driver.
> > > > [    0.200716] core: cpu_core PMU driver:
> > > > [    0.200716] ... version:                5
> > > > [    0.200716] ... bit width:              48
> > > > [    0.200716] ... generic registers:      8
> > > > [    0.200716] ... value mask:             0000ffffffffffff
> > > > [    0.200716] ... max period:             00007fffffffffff
> > > > [    0.200716] ... fixed-purpose events:   4
> > > > [    0.200716] ... event mask:             0001000f000000ff
> > > > [    0.200716] signal: max sigframe size: 3632
> > > > [    0.200716] Estimated ratio of average max frequency by base
> > > frequency (times 1024): 1556
> > > > [    0.200716] rcu: Hierarchical SRCU implementation.
> > > > [    0.200716] rcu: Max phase no-delay instances is 1000.
> > > > [    0.200716] Timer migration: 2 hierarchy levels; 8 children
> per
> > > group; 2 crossnode level
> > > > [    0.200716] NMI watchdog: Enabled. Permanently consumes one
> hw-
> > > PMU counter.
> > > > [    0.200716] smp: Bringing up secondary CPUs ...
> > > > [    0.200716] smpboot: x86: Booting SMP configuration:
> > > > [    0.200716] .... node  #0, CPUs:        #2  #4  #6  #8  #9
> #10
> > > #11 #12 #13 #14 #15
> > > > [    0.018930] core: cpu_atom PMU driver: PEBS-via-PT
> > > > [    0.018930] ... version:                5
> > > > [    0.018930] ... bit width:              48
> > > > [    0.018930] ... generic registers:      6
> > > > [    0.018930] ... value mask:             0000ffffffffffff
> > > > [    0.018930] ... max period:             00007fffffffffff
> > > > [    0.018930] ... fixed-purpose events:   3
> > > > [    0.018930] ... event mask:             000000070000003f
> > > > [    0.210777]   #1  #3  #5  #7
> > > > [    0.215011] smp: Brought up 1 node, 16 CPUs
> > > > [    0.215011] smpboot: Total of 16 processors activated
> (79903.00
> > > BogoMIPS)
> > > > [    0.217482] Memory: 65276284K/66671508K available (18432K
> kernel
> > > code, 2185K rwdata, 13516K rodata, 3452K init, 3432K bss,
> 1370520K
> > > reserved, 0K cma-reserved)
> > > > [    0.218690] devtmpfs: initialized
> > > > [    0.218690] x86/mm: Memory block size: 2048MB
> > > > [    0.218690] ACPI: PM: Registering ACPI NVS region [mem
> > > 0x56d49000-0x56ecefff] (1597440 bytes)
> > > > [    0.218690] clocksource: jiffies: mask: 0xffffffff
> max_cycles:
> > > 0xffffffff, max_idle_ns: 6370867519511994 ns
> > > > [    0.218690] futex hash table entries: 4096 (order: 6, 262144
> > > bytes, linear)
> > > > [    0.218690] pinctrl core: initialized pinctrl subsystem
> > > > [    0.218690] PM: RTC time: 15:43:42, date: 2024-09-17
> > > > [    0.218690] NET: Registered PF_NETLINK/PF_ROUTE protocol
> family
> > > > [    0.218690] DMA: preallocated 4096 KiB GFP_KERNEL pool for
> > > atomic allocations
> > > > [    0.218815] DMA: preallocated 4096 KiB GFP_KERNEL|GFP_DMA
> pool
> > > for atomic allocations
> > > > [    0.220935] DMA: preallocated 4096 KiB GFP_KERNEL|GFP_DMA32
> pool
> > > for atomic allocations
> > > > [    0.220946] audit: initializing netlink subsys (disabled)
> > > > [    0.220955] audit: type=2000 audit(1726587822.023:1):
> > > state=initialized audit_enabled=0 res=1
> > > > [    0.220955] thermal_sys: Registered thermal governor
> > > 'fair_share'
> > > > [    0.220955] thermal_sys: Registered thermal governor
> 'bang_bang'
> > > > [    0.220955] thermal_sys: Registered thermal governor
> 'step_wise'
> > > > [    0.220955] thermal_sys: Registered thermal governor
> > > 'user_space'
> > > > [    0.220955] thermal_sys: Registered thermal governor
> > > 'power_allocator'
> > > > [    0.220955] cpuidle: using governor ladder
> > > > [    0.220955] cpuidle: using governor menu
> > > > [    0.220955] acpiphp: ACPI Hot Plug PCI Controller Driver
> > > version: 0.5
> > > > [    0.220955] PCI: ECAM [mem 0xc0000000-0xcfffffff] (base
> > > 0xc0000000) for domain 0000 [bus 00-ff]
> > > > [    0.220955] PCI: Using configuration type 1 for base access
> > > > [    0.220955] kprobes: kprobe jump-optimization is enabled.
> All
> > > kprobes are optimized if possible.
> > > > [    0.224191] HugeTLB: registered 1.00 GiB page size, pre-
> > > allocated 0 pages
> > > > [    0.224191] HugeTLB: 16380 KiB vmemmap can be freed for a
> 1.00
> > > GiB page
> > > > [    0.224191] HugeTLB: registered 2.00 MiB page size, pre-
> > > allocated 0 pages
> > > > [    0.224191] HugeTLB: 28 KiB vmemmap can be freed for a 2.00
> MiB
> > > page
> > > > [    0.224500] ACPI: Added _OSI(Module Device)
> > > > [    0.224500] ACPI: Added _OSI(Processor Device)
> > > > [    0.224500] ACPI: Added _OSI(3.0 _SCP Extensions)
> > > > [    0.224500] ACPI: Added _OSI(Processor Aggregator Device)
> > > > [    0.312844] ACPI: 14 ACPI AML tables successfully acquired
> and
> > > loaded
> > > > [    0.336673] ACPI: USB4 _OSC: OS supports USB3+ DisplayPort+
> > > PCIe+ XDomain+
> > > > [    0.336675] ACPI: USB4 _OSC: OS controls USB3+ DisplayPort+
> > > PCIe+ XDomain+
> > > > [    0.338150] ACPI: Dynamic OEM Table Load:
> > > > [    0.338158] ACPI: SSDT 0xFFFF9118C178D400 000394 (v02
> > > PmRef  Cpu0Cst  00003001 INTL 20200717)
> > > > [    0.339255] ACPI: Dynamic OEM Table Load:
> > > > [    0.339260] ACPI: SSDT 0xFFFF9118C1798000 0005E4 (v02
> > > PmRef  Cpu0Ist  00003000 INTL 20200717)
> > > > [    0.340384] ACPI: Dynamic OEM Table Load:
> > > > [    0.340388] ACPI: SSDT 0xFFFF9118C2101200 0001AB (v02
> > > PmRef  Cpu0Psd  00003000 INTL 20200717)
> > > > [    0.341453] ACPI: Dynamic OEM Table Load:
> > > > [    0.341457] ACPI: SSDT 0xFFFF9118C179B000 0004BA (v02
> > > PmRef  Cpu0Hwp  00003000 INTL 20200717)
> > > > [    0.342940] ACPI: Dynamic OEM Table Load:
> > > > [    0.342947] ACPI: SSDT 0xFFFF9118C1784000 001BAF (v02
> > > PmRef  ApIst    00003000 INTL 20200717)
> > > > [    0.344827] ACPI: Dynamic OEM Table Load:
> > > > [    0.344833] ACPI: SSDT 0xFFFF9118C1780000 001038 (v02
> > > PmRef  ApHwp    00003000 INTL 20200717)
> > > > [    0.346435] ACPI: Dynamic OEM Table Load:
> > > > [    0.346441] ACPI: SSDT 0xFFFF9118C21C6000 001349 (v02
> > > PmRef  ApPsd    00003000 INTL 20200717)
> > > > [    0.347383] ACPI: Dynamic OEM Table Load:
> > > > [    0.347383] ACPI: SSDT 0xFFFF9118C1797000 000FBB (v02
> > > PmRef  ApCst    00003000 INTL 20200717)
> > > > [    0.351835] ACPI: EC: EC started
> > > > [    0.351836] ACPI: EC: interrupt blocked
> > > > [    0.352497] ACPI: EC: EC_CMD/EC_SC=0x66, EC_DATA=0x62
> > > > [    0.352499] ACPI: \_SB_.PC00.LPCB.EC0_: Boot DSDT EC used to
> > > handle transactions
> > > > [    0.352501] ACPI: Interpreter enabled
> > > > [    0.352548] ACPI: PM: (supports S0 S3 S4 S5)
> > > > [    0.352549] ACPI: Using IOAPIC for interrupt routing
> > > > [    0.353800] PCI: Using host bridge windows from ACPI; if
> > > necessary, use "pci=nocrs" and report a bug
> > > > [    0.353801] PCI: Ignoring E820 reservations for host bridge
> > > windows
> > > > [    0.355184] ACPI: Enabled 7 GPEs in block 00 to 7F
> > > > [    0.357600] ACPI: \_SB_.PC00.PEG0.PXP_: New power resource
> > > > [    0.373986] ACPI: \_SB_.PC00.XHCI.RHUB.HS10.BTRT: New power
> > > resource
> > > > [    0.374768] ACPI: \_SB_.PC00.PAUD: New power resource
> > > > [    0.383767] ACPI: \_SB_.PC00.CNVW.WRST: New power resource
> > > > [    0.392041] ACPI: \_SB_.PC00.TBT0: New power resource
> > > > [    0.392349] ACPI: \_SB_.PC00.TBT1: New power resource
> > > > [    0.392651] ACPI: \_SB_.PC00.D3C_: New power resource
> > > > [    0.683890] ACPI: \_TZ_.FN00: New power resource
> > > > [    0.683946] ACPI: \_TZ_.FN01: New power resource
> > > > [    0.684000] ACPI: \_TZ_.FN02: New power resource
> > > > [    0.684056] ACPI: \_TZ_.FN03: New power resource
> > > > [    0.684110] ACPI: \_TZ_.FN04: New power resource
> > > > [    0.684638] ACPI: \PIN_: New power resource
> > > > [    0.685242] ACPI: PCI Root Bridge [PC00] (domain 0000 [bus
> 00-
> > > fe])
> > > > [    0.685248] acpi PNP0A08:00: _OSC: OS supports
> [ExtendedConfig
> > > ASPM ClockPM Segments MSI EDR HPX-Type3]
> > > > [    0.686937] acpi PNP0A08:00: _OSC: platform does not support
> > > [AER]
> > > > [    0.690313] acpi PNP0A08:00: _OSC: OS now controls
> [PCIeHotplug
> > > SHPCHotplug PME PCIeCapability LTR DPC]
> > > > [    0.692570] PCI host bridge to bus 0000:00
> > > > [    0.692573] pci_bus 0000:00: root bus resource [io  0x0000-
> > > 0x0cf7 window]
> > > > [    0.692575] pci_bus 0000:00: root bus resource [io  0x0d00-
> > > 0xffff window]
> > > > [    0.692576] pci_bus 0000:00: root bus resource [mem
> 0x000a0000-
> > > 0x000bffff window]
> > > > [    0.692578] pci_bus 0000:00: root bus resource [mem
> 0x000e0000-
> > > 0x000fffff window]
> > > > [    0.692579] pci_bus 0000:00: root bus resource [mem
> 0x68800000-
> > > 0xbfffffff window]
> > > > [    0.692580] pci_bus 0000:00: root bus resource [mem
> > > 0x4000000000-0x7fffffffff window]
> > > > [    0.692581] pci_bus 0000:00: root bus resource [bus 00-fe]
> > > > [    0.692868] pci 0000:00:00.0: [8086:4621] type 00 class
> 0x060000
> > > conventional PCI endpoint
> > > > [    0.693054] pci 0000:00:02.0: [8086:46a6] type 00 class
> 0x030000
> > > PCIe Root Complex Integrated Endpoint
> > > > [    0.693062] pci 0000:00:02.0: BAR 0 [mem 0x603c000000-
> > > 0x603cffffff 64bit]
> > > > [    0.693067] pci 0000:00:02.0: BAR 2 [mem 0x4000000000-
> > > 0x400fffffff 64bit pref]
> > > > [    0.693070] pci 0000:00:02.0: BAR 4 [io  0x3000-0x303f]
> > > > [    0.693084] pci 0000:00:02.0: DMAR: Skip IOMMU disabling for
> > > graphics
> > > > [    0.693086] pci 0000:00:02.0: Video device with shadowed ROM
> at
> > > [mem 0x000c0000-0x000dffff]
> > > > [    0.693109] pci 0000:00:02.0: VF BAR 0 [mem 0x00000000-
> > > 0x00ffffff 64bit]
> > > > [    0.693110] pci 0000:00:02.0: VF BAR 0 [mem 0x00000000-
> > > 0x06ffffff 64bit]: contains BAR 0 for 7 VFs
> > > > [    0.693114] pci 0000:00:02.0: VF BAR 2 [mem 0x00000000-
> > > 0x1fffffff 64bit pref]
> > > > [    0.693115] pci 0000:00:02.0: VF BAR 2 [mem 0x00000000-
> > > 0xdfffffff 64bit pref]: contains BAR 2 for 7 VFs
> > > > [    0.693336] pci 0000:00:06.0: [8086:464d] type 01 class
> 0x060400
> > > PCIe Root Port
> > > > [    0.693379] pci 0000:00:06.0: PCI bridge to [bus 01]
> > > > [    0.693412] pci 0000:00:06.0:   bridge window [mem
> 0x84600000-
> > > 0x846fffff]
> > > > [    0.693547] pci 0000:00:06.0: PME# supported from D0 D3hot
> > > D3cold
> > > > [    0.693596] pci 0000:00:06.0: PTM enabled (root), 4ns
> > > granularity
> > > > [    0.694331] pci 0000:00:07.0: [8086:466e] type 01 class
> 0x060400
> > > PCIe Root Port
> > > > [    0.694351] pci 0000:00:07.0: PCI bridge to [bus 02-39]
> > > > [    0.694355] pci 0000:00:07.0:   bridge window [mem
> 0x78000000-
> > > 0x841fffff]
> > > > [    0.694361] pci 0000:00:07.0:   bridge window [mem
> 0x6020000000-
> > > 0x603bffffff 64bit pref]
> > > > [    0.694383] pci 0000:00:07.0: Overriding RP PIO Log Size to
> 4
> > > > [    0.694445] pci 0000:00:07.0: PME# supported from D0 D3hot
> > > D3cold
> > > > [    0.694469] pci 0000:00:07.0: PTM enabled (root), 4ns
> > > granularity
> > > > [    0.696553] pci 0000:00:07.2: [8086:462f] type 01 class
> 0x060400
> > > PCIe Root Port
> > > > [    0.696570] pci 0000:00:07.2: PCI bridge to [bus 3a-63]
> > > > [    0.696574] pci 0000:00:07.2:   bridge window [mem
> 0x6a000000-
> > > 0x761fffff]
> > > > [    0.696580] pci 0000:00:07.2:   bridge window [mem
> 0x6000000000-
> > > 0x601bffffff 64bit pref]
> > > > [    0.696602] pci 0000:00:07.2: Overriding RP PIO Log Size to
> 4
> > > > [    0.696664] pci 0000:00:07.2: PME# supported from D0 D3hot
> > > D3cold
> > > > [    0.696688] pci 0000:00:07.2: PTM enabled (root), 4ns
> > > granularity
> > > > [    0.698832] pci 0000:00:08.0: [8086:464f] type 00 class
> 0x088000
> > > conventional PCI endpoint
> > > > [    0.698840] pci 0000:00:08.0: BAR 0 [mem 0x603d1bb000-
> > > 0x603d1bbfff 64bit]
> > > > [    0.698934] pci 0000:00:0a.0: [8086:467d] type 00 class
> 0x118000
> > > PCIe Root Complex Integrated Endpoint
> > > > [    0.698941] pci 0000:00:0a.0: BAR 0 [mem 0x603d1a0000-
> > > 0x603d1a7fff 64bit]
> > > > [    0.698958] pci 0000:00:0a.0: enabling Extended Tags
> > > > [    0.699060] pci 0000:00:0d.0: [8086:461e] type 00 class
> 0x0c0330
> > > conventional PCI endpoint
> > > > [    0.699069] pci 0000:00:0d.0: BAR 0 [mem 0x603d190000-
> > > 0x603d19ffff 64bit]
> > > > [    0.699109] pci 0000:00:0d.0: PME# supported from D3hot
> D3cold
> > > > [    0.701032] pci 0000:00:0d.2: [8086:463e] type 00 class
> 0x0c0340
> > > conventional PCI endpoint
> > > > [    0.701045] pci 0000:00:0d.2: BAR 0 [mem 0x603d140000-
> > > 0x603d17ffff 64bit]
> > > > [    0.701051] pci 0000:00:0d.2: BAR 2 [mem 0x603d1ba000-
> > > 0x603d1bafff 64bit]
> > > > [    0.701083] pci 0000:00:0d.2: supports D1 D2
> > > > [    0.701084] pci 0000:00:0d.2: PME# supported from D0 D1 D2
> D3hot
> > > D3cold
> > > > [    0.701215] pci 0000:00:0d.3: [8086:466d] type 00 class
> 0x0c0340
> > > conventional PCI endpoint
> > > > [    0.701225] pci 0000:00:0d.3: BAR 0 [mem 0x603d100000-
> > > 0x603d13ffff 64bit]
> > > > [    0.701231] pci 0000:00:0d.3: BAR 2 [mem 0x603d1b9000-
> > > 0x603d1b9fff 64bit]
> > > > [    0.701260] pci 0000:00:0d.3: supports D1 D2
> > > > [    0.701261] pci 0000:00:0d.3: PME# supported from D0 D1 D2
> D3hot
> > > D3cold
> > > > [    0.701532] pci 0000:00:14.0: [8086:51ed] type 00 class
> 0x0c0330
> > > conventional PCI endpoint
> > > > [    0.701555] pci 0000:00:14.0: BAR 0 [mem 0x603d180000-
> > > 0x603d18ffff 64bit]
> > > > [    0.701655] pci 0000:00:14.0: PME# supported from D3hot
> D3cold
> > > > [    0.703595] pci 0000:00:14.2: [8086:51ef] type 00 class
> 0x050000
> > > conventional PCI endpoint
> > > > [    0.703617] pci 0000:00:14.2: BAR 0 [mem 0x603d1b0000-
> > > 0x603d1b3fff 64bit]
> > > > [    0.703631] pci 0000:00:14.2: BAR 2 [mem 0x603d1b8000-
> > > 0x603d1b8fff 64bit]
> > > > [    0.703850] pci 0000:00:14.3: [8086:51f0] type 00 class
> 0x028000
> > > PCIe Root Complex Integrated Endpoint
> > > > [    0.703912] pci 0000:00:14.3: BAR 0 [mem 0x603d1ac000-
> > > 0x603d1affff 64bit]
> > > > [    0.707442] pci 0000:00:14.3: PME# supported from D0 D3hot
> > > D3cold
> > > > [    0.708349] pci 0000:00:15.0: [8086:51e8] type 00 class
> 0x0c8000
> > > conventional PCI endpoint
> > > > [    0.709079] pci 0000:00:15.0: BAR 0 [mem 0x00000000-
> 0x00000fff
> > > 64bit]
> > > > [    0.712769] pci 0000:00:15.1: [8086:51e9] type 00 class
> 0x0c8000
> > > conventional PCI endpoint
> > > > [    0.713499] pci 0000:00:15.1: BAR 0 [mem 0x00000000-
> 0x00000fff
> > > 64bit]
> > > > [    0.716748] pci 0000:00:16.0: [8086:51e0] type 00 class
> 0x078000
> > > conventional PCI endpoint
> > > > [    0.716773] pci 0000:00:16.0: BAR 0 [mem 0x603d1b5000-
> > > 0x603d1b5fff 64bit]
> > > > [    0.716868] pci 0000:00:16.0: PME# supported from D3hot
> > > > [    0.717491] pci 0000:00:17.0: [8086:51d3] type 00 class
> 0x010601
> > > conventional PCI endpoint
> > > > [    0.717511] pci 0000:00:17.0: BAR 0 [mem 0x84700000-
> 0x84701fff]
> > > > [    0.717522] pci 0000:00:17.0: BAR 1 [mem 0x84703000-
> 0x847030ff]
> > > > [    0.717533] pci 0000:00:17.0: BAR 2 [io  0x3090-0x3097]
> > > > [    0.717543] pci 0000:00:17.0: BAR 3 [io  0x3080-0x3083]
> > > > [    0.717554] pci 0000:00:17.0: BAR 4 [io  0x3060-0x307f]
> > > > [    0.717564] pci 0000:00:17.0: BAR 5 [mem 0x84702000-
> 0x847027ff]
> > > > [    0.717645] pci 0000:00:17.0: PME# supported from D3hot
> > > > [    0.718046] pci 0000:00:1d.0: [8086:51b0] type 01 class
> 0x060400
> > > PCIe Root Port
> > > > [    0.718078] pci 0000:00:1d.0: PCI bridge to [bus 64]
> > > > [    0.718084] pci 0000:00:1d.0:   bridge window [mem
> 0x84400000-
> > > 0x845fffff]
> > > > [    0.718173] pci 0000:00:1d.0: PME# supported from D0 D3hot
> > > D3cold
> > > > [    0.718212] pci 0000:00:1d.0: PTM enabled (root), 4ns
> > > granularity
> > > > [    0.718877] pci 0000:00:1d.2: [8086:51b2] type 01 class
> 0x060400
> > > PCIe Root Port
> > > > [    0.718909] pci 0000:00:1d.2: PCI bridge to [bus 65]
> > > > [    0.718915] pci 0000:00:1d.2:   bridge window [mem
> 0x84200000-
> > > 0x843fffff]
> > > > [    0.719004] pci 0000:00:1d.2: PME# supported from D0 D3hot
> > > D3cold
> > > > [    0.719043] pci 0000:00:1d.2: PTM enabled (root), 4ns
> > > granularity
> > > > [    0.719752] pci 0000:00:1f.0: [8086:5182] type 00 class
> 0x060100
> > > conventional PCI endpoint
> > > > [    0.720154] pci 0000:00:1f.3: [8086:51c8] type 00 class
> 0x040100
> > > conventional PCI endpoint
> > > > [    0.720216] pci 0000:00:1f.3: BAR 0 [mem 0x603d1a8000-
> > > 0x603d1abfff 64bit]
> > > > [    0.720290] pci 0000:00:1f.3: BAR 4 [mem 0x603d000000-
> > > 0x603d0fffff 64bit]
> > > > [    0.720451] pci 0000:00:1f.3: PME# supported from D3hot
> D3cold
> > > > [    0.721057] pci 0000:00:1f.4: [8086:51a3] type 00 class
> 0x0c0500
> > > conventional PCI endpoint
> > > > [    0.721086] pci 0000:00:1f.4: BAR 0 [mem 0x603d1b4000-
> > > 0x603d1b40ff 64bit]
> > > > [    0.721112] pci 0000:00:1f.4: BAR 4 [io  0xefa0-0xefbf]
> > > > [    0.721397] pci 0000:00:1f.5: [8086:51a4] type 00 class
> 0x0c8000
> > > conventional PCI endpoint
> > > > [    0.721419] pci 0000:00:1f.5: BAR 0 [mem 0xfe010000-
> 0xfe010fff]
> > > > [    0.722353] pci 0000:01:00.0: [15b7:5030] type 00 class
> 0x010802
> > > PCIe Endpoint
> > > > [    0.722365] pci 0000:01:00.0: BAR 0 [mem 0x84600000-
> 0x84603fff
> > > 64bit]
> > > > [    0.722554] pci 0000:00:06.0: PCI bridge to [bus 01]
> > > > [    0.722587] pci 0000:00:07.0: PCI bridge to [bus 02-39]
> > > > [    0.722619] pci 0000:00:07.2: PCI bridge to [bus 3a-63]
> > > > [    0.722800] pci 0000:64:00.0: [8086:15f3] type 00 class
> 0x020000
> > > PCIe Endpoint
> > > > [    0.722819] pci 0000:64:00.0: BAR 0 [mem 0x84400000-
> 0x844fffff]
> > > > [    0.722844] pci 0000:64:00.0: BAR 3 [mem 0x84500000-
> 0x84503fff]
> > > > [    0.722977] pci 0000:64:00.0: PME# supported from D0 D3hot
> > > D3cold
> > > > [    0.723313] pci 0000:00:1d.0: PCI bridge to [bus 64]
> > > > [    0.723788] pci 0000:65:00.0: [8086:125c] type 00 class
> 0x020000
> > > PCIe Endpoint
> > > > [    0.723806] pci 0000:65:00.0: BAR 0 [mem 0x84200000-
> 0x842fffff]
> > > > [    0.723831] pci 0000:65:00.0: BAR 3 [mem 0x84300000-
> 0x84303fff]
> > > > [    0.723963] pci 0000:65:00.0: PME# supported from D0 D3hot
> > > D3cold
> > > > [    0.724773] pci 0000:00:1d.2: PCI bridge to [bus 65]
> > > > [    0.731129] ACPI: PCI: Interrupt link LNKA configured for
> IRQ 0
> > > > [    0.731229] ACPI: PCI: Interrupt link LNKB configured for
> IRQ 1
> > > > [    0.731327] ACPI: PCI: Interrupt link LNKC configured for
> IRQ 0
> > > > [    0.731425] ACPI: PCI: Interrupt link LNKD configured for
> IRQ 0
> > > > [    0.731523] ACPI: PCI: Interrupt link LNKE configured for
> IRQ 0
> > > > [    0.731621] ACPI: PCI: Interrupt link LNKF configured for
> IRQ 0
> > > > [    0.731719] ACPI: PCI: Interrupt link LNKG configured for
> IRQ 0
> > > > [    0.731816] ACPI: PCI: Interrupt link LNKH configured for
> IRQ 0
> > > > [    1.109516] Low-power S0 idle used by default for system
> suspend
> > > > [    1.116947] ACPI: EC: interrupt unblocked
> > > > [    1.116948] ACPI: EC: event unblocked
> > > > [    1.116974] ACPI: EC: EC_CMD/EC_SC=0x66, EC_DATA=0x62
> > > > [    1.116975] ACPI: EC: GPE=0x6e
> > > > [    1.116977] ACPI: \_SB_.PC00.LPCB.EC0_: Boot DSDT EC
> > > initialization complete
> > > > [    1.116978] ACPI: \_SB_.PC00.LPCB.EC0_: EC: Used to handle
> > > transactions and events
> > > > [    1.117430] iommu: Default domain type: Translated
> > > > [    1.117430] iommu: DMA domain TLB invalidation policy: lazy
> mode
> > > > [    1.117501] SCSI subsystem initialized
> > > > [    1.117507] libata version 3.00 loaded.
> > > > [    1.117507] ACPI: bus type USB registered
> > > > [    1.117507] usbcore: registered new interface driver usbfs
> > > > [    1.117507] usbcore: registered new interface driver hub
> > > > [    1.117507] usbcore: registered new device driver usb
> > > > [    1.117507] EDAC MC: Ver: 3.0.0
> > > > [    1.120822] efivars: Registered efivars operations
> > > > [    1.120945] NetLabel: Initializing
> > > > [    1.120946] NetLabel:  domain hash size = 128
> > > > [    1.120947] NetLabel:  protocols = UNLABELED CIPSOv4 CALIPSO
> > > > [    1.120965] NetLabel:  unlabeled traffic allowed by default
> > > > [    1.120970] mctp: management component transport protocol
> core
> > > > [    1.120971] NET: Registered PF_MCTP protocol family
> > > > [    1.120974] PCI: Using ACPI for IRQ routing
> > > > [    1.188171] PCI: pci_cache_line_size set to 64 bytes
> > > > [    1.189575] pci 0000:00:1f.5: BAR 0 [mem 0xfe010000-
> 0xfe010fff]: 
> > > can't claim; no compatible bridge window
> > > > [    1.190227] e820: reserve RAM buffer [mem 0x0009e000-
> 0x0009ffff]
> > > > [    1.190229] e820: reserve RAM buffer [mem 0x43ea7000-
> 0x43ffffff]
> > > > [    1.190230] e820: reserve RAM buffer [mem 0x444e6000-
> 0x47ffffff]
> > > > [    1.190231] e820: reserve RAM buffer [mem 0x4dd46000-
> 0x4fffffff]
> > > > [    1.190232] e820: reserve RAM buffer [mem 0x5a800000-
> 0x5bffffff]
> > > > [    1.190233] e820: reserve RAM buffer [mem 0x1097800000-
> > > 0x1097ffffff]
> > > > [    1.190766] pci 0000:00:02.0: vgaarb: setting as boot VGA
> device
> > > > [    1.190766] pci 0000:00:02.0: vgaarb: bridge control
> possible
> > > > [    1.190766] pci 0000:00:02.0: vgaarb: VGA device added:
> > > decodes=io+mem,owns=io+mem,locks=none
> > > > [    1.190766] vgaarb: loaded
> > > > [    1.190802] clocksource: Switched to clocksource tsc-early
> > > > [    1.191172] VFS: Disk quotas dquot_6.6.0
> > > > [    1.191181] VFS: Dquot-cache hash table entries: 512 (order
> 0,
> > > 4096 bytes)
> > > > [    1.191242] pnp: PnP ACPI init
> > > > [    1.191703] system 00:00: [io  0x0a00-0x0a0f] has been
> reserved
> > > > [    1.191706] system 00:00: [io  0x0a10-0x0a2f] has been
> reserved
> > > > [    1.191707] system 00:00: [io  0x0a30-0x0a4f] has been
> reserved
> > > > [    1.191708] system 00:00: [io  0x0a50-0x0a6f] has been
> reserved
> > > > [    1.191709] system 00:00: [io  0x0a70-0x0a7f] has been
> reserved
> > > > [    1.191710] system 00:00: [io  0x0a80-0x0a8f] has been
> reserved
> > > > [    1.191832] system 00:01: [io  0x0680-0x069f] has been
> reserved
> > > > [    1.191834] system 00:01: [io  0x164e-0x164f] has been
> reserved
> > > > [    1.191943] system 00:02: [io  0x1854-0x1857] has been
> reserved
> > > > [    1.192669] pnp 00:03: disabling [mem 0xc0000000-0xcfffffff]
> > > because it overlaps 0000:00:02.0 BAR 9 [mem 0x00000000-0xdfffffff
> > > 64bit pref]
> > > > [    1.192693] system 00:03: [mem 0xfedc0000-0xfedc7fff] has
> been
> > > reserved
> > > > [    1.192694] system 00:03: [mem 0xfeda0000-0xfeda0fff] has
> been
> > > reserved
> > > > [    1.192696] system 00:03: [mem 0xfeda1000-0xfeda1fff] has
> been
> > > reserved
> > > > [    1.192697] system 00:03: [mem 0xfed20000-0xfed7ffff] could
> not
> > > be reserved
> > > > [    1.192698] system 00:03: [mem 0xfed90000-0xfed93fff] could
> not
> > > be reserved
> > > > [    1.192699] system 00:03: [mem 0xfed45000-0xfed8ffff] could
> not
> > > be reserved
> > > > [    1.192700] system 00:03: [mem 0xfee00000-0xfeefffff] could
> not
> > > be reserved
> > > > [    1.195625] system 00:04: [io  0x2000-0x20fe] has been
> reserved
> > > > [    1.196381] pnp: PnP ACPI: found 6 devices
> > > > [    1.201970] clocksource: acpi_pm: mask: 0xffffff max_cycles:
> > > 0xffffff, max_idle_ns: 2085701024 ns
> > > > [    1.202017] NET: Registered PF_INET protocol family
> > > > [    1.202177] IP idents hash table entries: 262144 (order: 9,
> > > 2097152 bytes, linear)
> > > > [    1.215397] tcp_listen_portaddr_hash hash table entries:
> 32768
> > > (order: 7, 524288 bytes, linear)
> > > > [    1.215446] Table-perturb hash table entries: 65536 (order:
> 6,
> > > 262144 bytes, linear)
> > > > [    1.215777] TCP established hash table entries: 524288
> (order:
> > > 10, 4194304 bytes, linear)
> > > > [    1.216299] TCP bind hash table entries: 65536 (order: 9,
> > > 2097152 bytes, linear)
> > > > [    1.216406] TCP: Hash tables configured (established 524288
> bind
> > > 65536)
> > > > [    1.216608] MPTCP token hash table entries: 65536 (order: 8,
> > > 1572864 bytes, linear)
> > > > [    1.216758] UDP hash table entries: 32768 (order: 8, 1048576
> > > bytes, linear)
> > > > [    1.216899] UDP-Lite hash table entries: 32768 (order: 8,
> > > 1048576 bytes, linear)
> > > > [    1.217011] NET: Registered PF_UNIX/PF_LOCAL protocol family
> > > > [    1.217017] NET: Registered PF_XDP protocol family
> > > > [    1.217024] pci 0000:00:07.0: bridge window [io  0x1000-
> 0x0fff]
> > > to [bus 02-39] add_size 1000
> > > > [    1.217028] pci 0000:00:07.2: bridge window [io  0x1000-
> 0x0fff]
> > > to [bus 3a-63] add_size 1000
> > > > [    1.217038] pci 0000:00:02.0: VF BAR 2 [mem 0x4020000000-
> > > 0x40ffffffff 64bit pref]: assigned
> > > > [    1.217042] pci 0000:00:02.0: VF BAR 0 [mem 0x4010000000-
> > > 0x4016ffffff 64bit]: assigned
> > > > [    1.217045] pci 0000:00:07.0: bridge window [io  0x4000-
> 0x4fff]: 
> > > assigned
> > > > [    1.217047] pci 0000:00:07.2: bridge window [io  0x5000-
> 0x5fff]: 
> > > assigned
> > > > [    1.217049] pci 0000:00:15.0: BAR 0 [mem 0x4017000000-
> > > 0x4017000fff 64bit]: assigned
> > > > [    1.217395] pci 0000:00:15.1: BAR 0 [mem 0x4017001000-
> > > 0x4017001fff 64bit]: assigned
> > > > [    1.217735] pci 0000:00:1f.5: BAR 0 [mem 0x68800000-
> 0x68800fff]: 
> > > assigned
> > > > [    1.217752] pci 0000:00:06.0: PCI bridge to [bus 01]
> > > > [    1.217777] pci 0000:00:06.0:   bridge window [mem
> 0x84600000-
> > > 0x846fffff]
> > > > [    1.217810] pci 0000:00:07.0: PCI bridge to [bus 02-39]
> > > > [    1.217812] pci 0000:00:07.0:   bridge window [io  0x4000-
> > > 0x4fff]
> > > > [    1.217814] pci 0000:00:07.0:   bridge window [mem
> 0x78000000-
> > > 0x841fffff]
> > > > [    1.217817] pci 0000:00:07.0:   bridge window [mem
> 0x6020000000-
> > > 0x603bffffff 64bit pref]
> > > > [    1.217820] pci 0000:00:07.2: PCI bridge to [bus 3a-63]
> > > > [    1.217821] pci 0000:00:07.2:   bridge window [io  0x5000-
> > > 0x5fff]
> > > > [    1.217824] pci 0000:00:07.2:   bridge window [mem
> 0x6a000000-
> > > 0x761fffff]
> > > > [    1.217826] pci 0000:00:07.2:   bridge window [mem
> 0x6000000000-
> > > 0x601bffffff 64bit pref]
> > > > [    1.217830] pci 0000:00:1d.0: PCI bridge to [bus 64]
> > > > [    1.217848] pci 0000:00:1d.0:   bridge window [mem
> 0x84400000-
> > > 0x845fffff]
> > > > [    1.217855] pci 0000:00:1d.2: PCI bridge to [bus 65]
> > > > [    1.217859] pci 0000:00:1d.2:   bridge window [mem
> 0x84200000-
> > > 0x843fffff]
> > > > [    1.217867] pci_bus 0000:00: resource 4 [io  0x0000-0x0cf7
> > > window]
> > > > [    1.217868] pci_bus 0000:00: resource 5 [io  0x0d00-0xffff
> > > window]
> > > > [    1.217869] pci_bus 0000:00: resource 6 [mem 0x000a0000-
> > > 0x000bffff window]
> > > > [    1.217871] pci_bus 0000:00: resource 7 [mem 0x000e0000-
> > > 0x000fffff window]
> > > > [    1.217872] pci_bus 0000:00: resource 8 [mem 0x68800000-
> > > 0xbfffffff window]
> > > > [    1.217873] pci_bus 0000:00: resource 9 [mem 0x4000000000-
> > > 0x7fffffffff window]
> > > > [    1.217874] pci_bus 0000:01: resource 1 [mem 0x84600000-
> > > 0x846fffff]
> > > > [    1.217875] pci_bus 0000:02: resource 0 [io  0x4000-0x4fff]
> > > > [    1.217876] pci_bus 0000:02: resource 1 [mem 0x78000000-
> > > 0x841fffff]
> > > > [    1.217877] pci_bus 0000:02: resource 2 [mem 0x6020000000-
> > > 0x603bffffff 64bit pref]
> > > > [    1.217878] pci_bus 0000:3a: resource 0 [io  0x5000-0x5fff]
> > > > [    1.217879] pci_bus 0000:3a: resource 1 [mem 0x6a000000-
> > > 0x761fffff]
> > > > [    1.217880] pci_bus 0000:3a: resource 2 [mem 0x6000000000-
> > > 0x601bffffff 64bit pref]
> > > > [    1.217881] pci_bus 0000:64: resource 1 [mem 0x84400000-
> > > 0x845fffff]
> > > > [    1.217883] pci_bus 0000:65: resource 1 [mem 0x84200000-
> > > 0x843fffff]
> > > > [    1.219810] PCI: CLS 64 bytes, default 64
> > > > [    1.219841] DMAR: Intel-IOMMU force enabled due to platform
> opt
> > > in
> > > > [    1.219847] DMAR: No ATSR found
> > > > [    1.219848] DMAR: No SATC found
> > > > [    1.219849] DMAR: IOMMU feature fl1gp_support inconsistent
> > > > [    1.219850] DMAR: IOMMU feature pgsel_inv inconsistent
> > > > [    1.219851] DMAR: IOMMU feature nwfs inconsistent
> > > > [    1.219851] DMAR: IOMMU feature dit inconsistent
> > > > [    1.219852] DMAR: IOMMU feature sc_support inconsistent
> > > > [    1.219853] DMAR: IOMMU feature dev_iotlb_support
> inconsistent
> > > > [    1.219854] DMAR: dmar0: Using Queued invalidation
> > > > [    1.219857] DMAR: dmar1: Using Queued invalidation
> > > > [    1.219962] Trying to unpack rootfs image as initramfs...
> > > > [    1.220076] pci 0000:00:02.0: Adding to iommu group 0
> > > > [    1.220106] pci 0000:00:00.0: Adding to iommu group 1
> > > > [    1.220117] pci 0000:00:06.0: Adding to iommu group 2
> > > > [    1.220125] pci 0000:00:07.0: Adding to iommu group 3
> > > > [    1.220133] pci 0000:00:07.2: Adding to iommu group 4
> > > > [    1.220142] pci 0000:00:08.0: Adding to iommu group 5
> > > > [    1.220150] pci 0000:00:0a.0: Adding to iommu group 6
> > > > [    1.220165] pci 0000:00:0d.0: Adding to iommu group 7
> > > > [    1.220172] pci 0000:00:0d.2: Adding to iommu group 7
> > > > [    1.220178] pci 0000:00:0d.3: Adding to iommu group 7
> > > > [    1.220192] pci 0000:00:14.0: Adding to iommu group 8
> > > > [    1.220199] pci 0000:00:14.2: Adding to iommu group 8
> > > > [    1.220206] pci 0000:00:14.3: Adding to iommu group 9
> > > > [    1.220218] pci 0000:00:15.0: Adding to iommu group 10
> > > > [    1.220226] pci 0000:00:15.1: Adding to iommu group 10
> > > > [    1.220236] pci 0000:00:16.0: Adding to iommu group 11
> > > > [    1.220243] pci 0000:00:17.0: Adding to iommu group 12
> > > > [    1.220266] pci 0000:00:1d.0: Adding to iommu group 13
> > > > [    1.220282] pci 0000:00:1d.2: Adding to iommu group 14
> > > > [    1.220300] pci 0000:00:1f.0: Adding to iommu group 15
> > > > [    1.220308] pci 0000:00:1f.3: Adding to iommu group 15
> > > > [    1.220316] pci 0000:00:1f.4: Adding to iommu group 15
> > > > [    1.220323] pci 0000:00:1f.5: Adding to iommu group 15
> > > > [    1.220331] pci 0000:01:00.0: Adding to iommu group 16
> > > > [    1.220354] pci 0000:64:00.0: Adding to iommu group 17
> > > > [    1.220381] pci 0000:65:00.0: Adding to iommu group 18
> > > > [    1.220523] DMAR: Intel(R) Virtualization Technology for
> > > Directed I/O
> > > > [    1.220524] PCI-DMA: Using software bounce buffering for IO
> > > (SWIOTLB)
> > > > [    1.220525] software IO TLB: mapped [mem 0x00000000359f8000-
> > > 0x00000000399f8000] (64MB)
> > > > [    1.220564] clocksource: tsc: mask: 0xffffffffffffffff
> > > max_cycles: 0x23fa772cf26, max_idle_ns: 440795269835 ns
> > > > [    1.220616] clocksource: Switched to clocksource tsc
> > > > [    1.220637] platform rtc_cmos: registered platform RTC
> device
> > > (no PNP device found)
> > > > [    1.227245] Initialise system trusted keyrings
> > > > [    1.227255] Key type blacklist registered
> > > > [    1.227295] workingset: timestamp_bits=41 max_order=24
> > > bucket_order=0
> > > > [    1.227305] zbud: loaded
> > > > [    1.227417] fuse: init (API version 7.40)
> > > > [    1.227488] integrity: Platform Keyring initialized
> > > > [    1.227490] integrity: Machine keyring initialized
> > > > [    1.236155] Key type asymmetric registered
> > > > [    1.236158] Asymmetric key parser 'x509' registered
> > > > [    1.236181] Block layer SCSI generic (bsg) driver version
> 0.4
> > > loaded (major 246)
> > > > [    1.236262] io scheduler mq-deadline registered
> > > > [    1.236263] io scheduler kyber registered
> > > > [    1.236272] io scheduler bfq registered
> > > > [    1.236870] pcieport 0000:00:06.0: PME: Signaling with IRQ
> 122
> > > > [    1.237101] pcieport 0000:00:07.0: PME: Signaling with IRQ
> 123
> > > > [    1.237117] pcieport 0000:00:07.0: pciehp: Slot #3 AttnBtn-
> > > PwrCtrl- MRL- AttnInd- PwrInd- HotPlug+ Surprise+ Interlock-
> NoCompl+
> > > IbPresDis- LLActRep+
> > > > [    1.237433] pcieport 0000:00:07.2: PME: Signaling with IRQ
> 124
> > > > [    1.237449] pcieport 0000:00:07.2: pciehp: Slot #5 AttnBtn-
> > > PwrCtrl- MRL- AttnInd- PwrInd- HotPlug+ Surprise+ Interlock-
> NoCompl+
> > > IbPresDis- LLActRep+
> > > > [    1.237758] pcieport 0000:00:1d.0: PME: Signaling with IRQ
> 125
> > > > [    1.238027] pcieport 0000:00:1d.2: PME: Signaling with IRQ
> 126
> > > > [    1.238133] shpchp: Standard Hot Plug PCI Controller Driver
> > > version: 0.4
> > > > [    1.238900] input: Sleep Button as
> > > /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0E:00/input/input0
> > > > [    1.238922] ACPI: button: Sleep Button [SLPB]
> > > > [    1.238952] input: Power Button as
> > > /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0C:00/input/input1
> > > > [    1.238963] ACPI: button: Power Button [PWRB]
> > > > [    1.238982] input: Power Button as
> > > /devices/LNXSYSTM:00/LNXPWRBN:00/input/input2
> > > > [    1.239063] ACPI: button: Power Button [PWRF]
> > > > [    1.243545] thermal LNXTHERM:00: registered as thermal_zone0
> > > > [    1.243547] ACPI: thermal: Thermal Zone [TZ00] (54 C)
> > > > [    1.243835] Serial: 8250/16550 driver, 32 ports, IRQ sharing
> > > enabled
> > > > [    1.245729] hpet_acpi_add: no address or irqs in _CRS
> > > > [    1.245765] Non-volatile memory driver v1.3
> > > > [    1.245766] Linux agpgart interface v0.103
> > > > [    1.282118] ACPI: bus type drm_connector registered
> > > > [    1.283317] Freeing initrd memory: 106196K
> > > > [    1.284291] ahci 0000:00:17.0: version 3.0
> > > > [    1.284668] ahci 0000:00:17.0: AHCI vers 0001.0301, 32
> command
> > > slots, 6 Gbps, SATA mode
> > > > [    1.284672] ahci 0000:00:17.0: 1/1 ports implemented (port
> mask
> > > 0x2)
> > > > [    1.284673] ahci 0000:00:17.0: flags: 64bit ncq sntf pm clo
> only
> > > pio slum part deso sadm sds
> > > > [    1.285087] scsi host0: ahci
> > > > [    1.285169] scsi host1: ahci
> > > > [    1.285197] ata1: DUMMY
> > > > [    1.285212] ata2: SATA max UDMA/133 abar m2048 at 0x84702000
> port
> > > 0x84702180 irq 127 lpm-pol 4
> > > > [    1.285284] usbcore: registered new interface driver
> > > usbserial_generic
> > > > [    1.285288] usbserial: USB Serial support registered for
> generic
> > > > [    1.285358] rtc_cmos rtc_cmos: RTC can wake from S4
> > > > [    1.287193] rtc_cmos rtc_cmos: registered as rtc0
> > > > [    1.287570] rtc_cmos rtc_cmos: setting system clock to 2024-
> 09-
> > > 17T15:43:43 UTC (1726587823)
> > > > [    1.287610] rtc_cmos rtc_cmos: alarms up to one month, y3k,
> 114
> > > bytes nvram
> > > > [    1.288735] intel_pstate: Intel P-state driver initializing
> > > > [    1.290872] intel_pstate: HWP enabled
> > > > [    1.291430] ledtrig-cpu: registered to indicate activity on
> CPUs
> > > > [    1.291876] [drm] Initialized simpledrm 1.0.0 for simple-
> > > framebuffer.0 on minor 0
> > > > [    1.292353] fbcon: Deferring console take-over
> > > > [    1.292358] simple-framebuffer simple-framebuffer.0: [drm]
> fb0:
> > > simpledrmdrmfb frame buffer device
> > > > [    1.292419] hid: raw HID events driver (C) Jiri Kosina
> > > > [    1.292473] drop_monitor: Initializing network drop monitor
> > > service
> > > > [    1.292567] NET: Registered PF_INET6 protocol family
> > > > [    1.296692] Segment Routing with IPv6
> > > > [    1.296693] RPL Segment Routing with IPv6
> > > > [    1.296704] In-situ OAM (IOAM) with IPv6
> > > > [    1.296720] NET: Registered PF_PACKET protocol family
> > > > [    1.299178] ENERGY_PERF_BIAS: Set to 'normal', was
> 'performance'
> > > > [    1.299835] microcode: Current revision: 0x00000434
> > > > [    1.299839] microcode: Updated early from: 0x0000042a
> > > > [    1.300531] IPI shorthand broadcast: enabled
> > > > [    1.301773] sched_clock: Marking stable (1284914767,
> 15597475)-
> > > >(1326242945, -25730703)
> > > > [    1.302178] registered taskstats version 1
> > > > [    1.303378] Loading compiled-in X.509 certificates
> > > > [    1.306147] Loaded X.509 cert 'Build time autogenerated
> kernel
> > > key: cb8a38269e411cf2cea941e3c19d1521412bd34d'
> > > > [    1.308962] zswap: loaded using pool zstd/zsmalloc
> > > > [    1.309007] Demotion targets for Node 0: null
> > > > [    1.309121] Key type .fscrypt registered
> > > > [    1.309121] Key type fscrypt-provisioning registered
> > > > [    1.309500] integrity: Loading X.509 certificate: UEFI:db
> > > > [    1.309544] integrity: Loaded X.509 cert 'Microsoft
> Corporation
> > > UEFI CA 2011: 13adbf4309bd82709c8cd54f316ed522988a1bd4'
> > > > [    1.309544] integrity: Loading X.509 certificate: UEFI:db
> > > > [    1.309551] integrity: Loaded X.509 cert 'Microsoft Windows
> > > Production PCA 2011: a92902398e16c49778cd90f99e4f9ae17c55af53'
> > > > [    1.309972] PM:   Magic number: 8:571:740
> > > > [    1.311885] RAS: Correctable Errors collector initialized.
> > > > [    1.599328] ata2: SATA link down (SStatus 4 SControl 300)
> > > > [    1.601308] clk: Disabling unused clocks
> > > > [    1.601325] PM: genpd: Disabling unused power domains
> > > > [    1.609973] Freeing unused decrypted memory: 2028K
> > > > [    1.610569] Freeing unused kernel image (initmem) memory:
> 3452K
> > > > [    1.610578] Write protecting the kernel read-only data:
> 32768k
> > > > [    1.611494] Freeing unused kernel image (rodata/data gap)
> > > memory: 820K
> > > > [    1.616342] x86/mm: Checked W+X mappings: passed, no W+X
> pages
> > > found.
> > > > [    1.616345] rodata_test: all tests were successful
> > > > [    1.616356] Run /init as init process
> > > > [    1.616357]   with arguments:
> > > > [    1.616357]     /init
> > > > [    1.616358]   with environment:
> > > > [    1.616358]     HOME=/
> > > > [    1.616359]     TERM=linux
> > > > [    1.738727] xhci_hcd 0000:00:0d.0: xHCI Host Controller
> > > > [    1.738738] xhci_hcd 0000:00:0d.0: new USB bus registered,
> > > assigned bus number 1
> > > > [    1.739793] xhci_hcd 0000:00:0d.0: hcc params 0x20007fc1 hci
> > > version 0x120 quirks 0x0000000200009810
> > > > [    1.740087] xhci_hcd 0000:00:0d.0: xHCI Host Controller
> > > > [    1.740090] xhci_hcd 0000:00:0d.0: new USB bus registered,
> > > assigned bus number 2
> > > > [    1.740093] xhci_hcd 0000:00:0d.0: Host supports USB 3.2
> > > Enhanced SuperSpeed
> > > > [    1.740135] usb usb1: New USB device found, idVendor=1d6b,
> > > idProduct=0002, bcdDevice= 6.11
> > > > [    1.740139] usb usb1: New USB device strings: Mfr=3,
> Product=2,
> > > SerialNumber=1
> > > > [    1.740141] usb usb1: Product: xHCI Host Controller
> > > > [    1.740142] usb usb1: Manufacturer: Linux 6.11.0-rc7-00001-
> > > g0e2ad6528188-dirty xhci-hcd
> > > > [    1.740144] usb usb1: SerialNumber: 0000:00:0d.0
> > > > [    1.740282] hub 1-0:1.0: USB hub found
> > > > [    1.740289] hub 1-0:1.0: 1 port detected
> > > > [    1.740533] usb usb2: New USB device found, idVendor=1d6b,
> > > idProduct=0003, bcdDevice= 6.11
> > > > [    1.740535] usb usb2: New USB device strings: Mfr=3,
> Product=2,
> > > SerialNumber=1
> > > > [    1.740537] usb usb2: Product: xHCI Host Controller
> > > > [    1.740538] usb usb2: Manufacturer: Linux 6.11.0-rc7-00001-
> > > g0e2ad6528188-dirty xhci-hcd
> > > > [    1.740539] usb usb2: SerialNumber: 0000:00:0d.0
> > > > [    1.740628] hub 2-0:1.0: USB hub found
> > > > [    1.740635] hub 2-0:1.0: 3 ports detected
> > > > [    1.741581] xhci_hcd 0000:00:14.0: xHCI Host Controller
> > > > [    1.741586] xhci_hcd 0000:00:14.0: new USB bus registered,
> > > assigned bus number 3
> > > > [    1.742720] xhci_hcd 0000:00:14.0: hcc params 0x20007fc1 hci
> > > version 0x120 quirks 0x0000100200009810
> > > > [    1.743083] xhci_hcd 0000:00:14.0: xHCI Host Controller
> > > > [    1.743087] xhci_hcd 0000:00:14.0: new USB bus registered,
> > > assigned bus number 4
> > > > [    1.743089] xhci_hcd 0000:00:14.0: Host supports USB 3.1
> > > Enhanced SuperSpeed
> > > > [    1.743129] usb usb3: New USB device found, idVendor=1d6b,
> > > idProduct=0002, bcdDevice= 6.11
> > > > [    1.743131] usb usb3: New USB device strings: Mfr=3,
> Product=2,
> > > SerialNumber=1
> > > > [    1.743132] usb usb3: Product: xHCI Host Controller
> > > > [    1.743133] usb usb3: Manufacturer: Linux 6.11.0-rc7-00001-
> > > g0e2ad6528188-dirty xhci-hcd
> > > > [    1.743134] usb usb3: SerialNumber: 0000:00:14.0
> > > > [    1.743239] hub 3-0:1.0: USB hub found
> > > > [    1.743267] hub 3-0:1.0: 12 ports detected
> > > > [    1.745297] usb usb4: New USB device found, idVendor=1d6b,
> > > idProduct=0003, bcdDevice= 6.11
> > > > [    1.745299] usb usb4: New USB device strings: Mfr=3,
> Product=2,
> > > SerialNumber=1
> > > > [    1.745301] usb usb4: Product: xHCI Host Controller
> > > > [    1.745302] usb usb4: Manufacturer: Linux 6.11.0-rc7-00001-
> > > g0e2ad6528188-dirty xhci-hcd
> > > > [    1.745302] usb usb4: SerialNumber: 0000:00:14.0
> > > > [    1.745388] hub 4-0:1.0: USB hub found
> > > > [    1.745410] hub 4-0:1.0: 4 ports detected
> > > > [    1.761523] nvme 0000:01:00.0: platform quirk: setting
> simple
> > > suspend
> > > > [    1.761605] nvme nvme0: pci function 0000:01:00.0
> > > > [    1.791467] nvme nvme0: 16/0/0 default/read/poll queues
> > > > [    1.796102]  nvme0n1: p1 p2 p3
> > > > [    1.992401] usb 3-4: new high-speed USB device number 2
> using
> > > xhci_hcd
> > > > [    2.134739] usb 3-4: New USB device found, idVendor=05e3,
> > > idProduct=0608, bcdDevice=88.32
> > > > [    2.134746] usb 3-4: New USB device strings: Mfr=0,
> Product=1,
> > > SerialNumber=0
> > > > [    2.134748] usb 3-4: Product: USB2.0 Hub
> > > > [    2.136254] hub 3-4:1.0: USB hub found
> > > > [    2.136751] hub 3-4:1.0: 4 ports detected
> > > > [    2.137612] usb: port power management may be unreliable
> > > > [    2.203731] usb 2-1: new SuperSpeed USB device number 2
> using
> > > xhci_hcd
> > > > [    2.237657] usb 2-1: New USB device found, idVendor=045e,
> > > idProduct=0955, bcdDevice= 1.41
> > > > [    2.237662] usb 2-1: New USB device strings: Mfr=1,
> Product=2,
> > > SerialNumber=0
> > > > [    2.237664] usb 2-1: Product: 4-Port USB 3.0 Hub
> > > > [    2.237665] usb 2-1: Manufacturer: Generic
> > > > [    2.245834] hub 2-1:1.0: USB hub found
> > > > [    2.247480] hub 2-1:1.0: 2 ports detected
> > > > [    2.255872] usb 4-1: new SuperSpeed USB device number 2
> using
> > > xhci_hcd
> > > > [    2.275009] usb 4-1: New USB device found, idVendor=0e8d,
> > > idProduct=7961, bcdDevice= 1.00
> > > > [    2.275014] usb 4-1: New USB device strings: Mfr=6,
> Product=7,
> > > SerialNumber=8
> > > > [    2.275015] usb 4-1: Product: Wireless_Device
> > > > [    2.275017] usb 4-1: Manufacturer: MediaTek Inc.
> > > > [    2.275018] usb 4-1: SerialNumber: 000000000
> > > > [    2.395819] usb 3-6: new high-speed USB device number 3
> using
> > > xhci_hcd
> > > > [    2.469827] i915 0000:00:02.0: [drm] Found ALDERLAKE_P
> (device
> > > ID 46a6) display version 13.00
> > > > [    2.470484] i915 0000:00:02.0: [drm] VT-d active for gfx
> access
> > > > [    2.526904] i915 0000:00:02.0: vgaarb: deactivate vga
> console
> > > > [    2.527166] i915 0000:00:02.0: [drm] Using Transparent
> Hugepages
> > > > [    2.529267] i915 0000:00:02.0: vgaarb: VGA decodes changed:
> > > olddecodes=io+mem,decodes=io+mem:owns=io+mem
> > > > [    2.534856] i915 0000:00:02.0: [drm] Finished loading DMC
> > > firmware i915/adlp_dmc.bin (v2.20)
> > > > [    2.535899] usb 2-1.1: new SuperSpeed USB device number 3
> using
> > > xhci_hcd
> > > > [    2.557014] usb 3-6: New USB device found, idVendor=045e,
> > > idProduct=0957, bcdDevice= 1.41
> > > > [    2.557029] usb 3-6: New USB device strings: Mfr=1,
> Product=2,
> > > SerialNumber=0
> > > > [    2.557035] usb 3-6: Product: 4-Port USB 2.0 Hub
> > > > [    2.557039] usb 3-6: Manufacturer: Generic
> > > > [    2.557797] usb 2-1.1: New USB device found, idVendor=045e,
> > > idProduct=0927, bcdDevice=31.00
> > > > [    2.557814] usb 2-1.1: New USB device strings: Mfr=1,
> Product=2,
> > > SerialNumber=6
> > > > [    2.557819] usb 2-1.1: Product: Ethernet Adapter
> > > > [    2.557823] usb 2-1.1: Manufacturer: Microsoft
> > > > [    2.557826] usb 2-1.1: SerialNumber: 0013DF804
> > > > [    2.561404] hub 3-6:1.0: USB hub found
> > > > [    2.563028] hub 3-6:1.0: 2 ports detected
> > > > [    2.645045] i915 0000:00:02.0: [drm] GT0: GuC firmware
> > > i915/adlp_guc_70.bin version 70.29.2
> > > > [    2.645051] i915 0000:00:02.0: [drm] GT0: HuC firmware
> > > i915/tgl_huc.bin version 7.9.3
> > > > [    2.659283] i915 0000:00:02.0: [drm] GT0: HuC: authenticated
> for
> > > all workloads
> > > > [    2.660460] i915 0000:00:02.0: [drm] GT0: GUC: submission
> > > enabled
> > > > [    2.660462] i915 0000:00:02.0: [drm] GT0: GUC: SLPC enabled
> > > > [    2.661015] i915 0000:00:02.0: [drm] GT0: GUC: RC enabled
> > > > [    2.662137] i915 0000:00:02.0: [drm] Protected Xe Path (PXP)
> > > protected content support initialized
> > > > [    2.689226] usb 3-7: new full-speed USB device number 4
> using
> > > xhci_hcd
> > > > [    2.695739] [drm] Initialized i915 1.6.0 for 0000:00:02.0 on
> > > minor 1
> > > > [    2.698285] ACPI: video: Video Device [GFX0] (multi-head:
> > > yes  rom: no  post: no)
> > > > [    2.699207] input: Video Bus as
> > >
> /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/LNXVIDEO:00/input/input3
> > > > [    2.737465] fbcon: i915drmfb (fb0) is primary device
> > > > [    2.737467] fbcon: Deferring console take-over
> > > > [    2.737468] i915 0000:00:02.0: [drm] fb0: i915drmfb frame
> buffer
> > > device
> > > > [    2.835767] usb 3-7: New USB device found, idVendor=045e,
> > > idProduct=0800, bcdDevice= 9.34
> > > > [    2.835772] usb 3-7: New USB device strings: Mfr=1,
> Product=2,
> > > SerialNumber=0
> > > > [    2.835773] usb 3-7: Product: Microsoft? Nano Transceiver
> v2.0
> > > > [    2.835775] usb 3-7: Manufacturer: Microsoft
> > > > [    2.857652] usbcore: registered new interface driver usbhid
> > > > [    2.857654] usbhid: USB HID core driver
> > > > [    2.862052] input: Microsoft Microsoft? Nano Transceiver
> v2.0 as
> > > /devices/pci0000:00/0000:00:14.0/usb3/3-7/3-
> > > 7:1.0/0003:045E:0800.0001/input/input4
> > > > [    2.965962] hid-generic 0003:045E:0800.0001: input,hidraw0:
> USB
> > > HID v1.11 Keyboard [Microsoft Microsoft? Nano Transceiver v2.0]
> on
> > > usb-0000:00:14.0-7/input0
> > > > [    2.968229] input: Microsoft Microsoft? Nano Transceiver
> v2.0
> > > Mouse as /devices/pci0000:00/0000:00:14.0/usb3/3-7/3-
> > > 7:1.1/0003:045E:0800.0002/input/input5
> > > > [    2.968393] input: Microsoft Microsoft? Nano Transceiver
> v2.0
> > > Consumer Control as /devices/pci0000:00/0000:00:14.0/usb3/3-7/3-
> > > 7:1.1/0003:045E:0800.0002/input/input6
> > > > [    2.968554] hid-generic 0003:045E:0800.0002: input,hidraw1:
> USB
> > > HID v1.11 Mouse [Microsoft Microsoft? Nano Transceiver v2.0] on
> usb-
> > > 0000:00:14.0-7/input1
> > > > [    2.968700] input: Microsoft Microsoft? Nano Transceiver
> v2.0
> > > Consumer Control as /devices/pci0000:00/0000:00:14.0/usb3/3-7/3-
> > > 7:1.2/0003:045E:0800.0003/input/input7
> > > > [    3.022596] input: Microsoft Microsoft? Nano Transceiver
> v2.0
> > > System Control as /devices/pci0000:00/0000:00:14.0/usb3/3-7/3-
> > > 7:1.2/0003:045E:0800.0003/input/input9
> > > > [    3.022920] hid-generic 0003:045E:0800.0003:
> > > input,hiddev96,hidraw2: USB HID v1.11 Device [Microsoft
> Microsoft?
> > > Nano Transceiver v2.0] on usb-0000:00:14.0-7/input2
> > > > [    3.175304] PM: Image not found (code -22)
> > > > [    3.196942] fbcon: Taking over console
> > > > [    3.209556] Console: switching to colour frame buffer device
> > > 240x67
> > > > [    3.308676] EXT4-fs (nvme0n1p2): mounted filesystem
> 0420afc7-
> > > 4947-4e2e-a096-b607b8b7fd93 r/w with ordered data mode. Quota
> mode:
> > > none.
> > > > [    3.367761] systemd[1]: systemd 256.6-1-arch running in
> system
> > > mode (+PAM +AUDIT -SELINUX -APPARMOR -IMA +SMACK +SECCOMP +GCRYPT
> > > +GNUTLS +OPENSSL +ACL +BLKID +CURL +ELFUTILS +FIDO2 +IDN2 -IDN
> +IPTC
> > > +KMOD +LIBCRYPTSETUP +LIBCRYPTSETUP_PLUGINS +LIBFDISK +PCRE2
> > > +PWQUALITY +P11KIT +QRENCODE +TPM2 +BZIP2 +LZ4 +XZ +ZLIB +ZSTD
> > > +BPF_FRAMEWORK +XKBCOMMON +UTMP -SYSVINIT +LIBARCHIVE)
> > > > [    3.367765] systemd[1]: Detected architecture x86-64.
> > > > [    3.368553] systemd[1]: Hostname set to <mdp-archnuc>.
> > > > [    3.611164] systemd[1]: bpf-restrict-fs: LSM BPF program
> > > attached
> > > > [    3.699797] systemd[1]: Queued start job for default target
> > > Graphical Interface.
> > > > [    3.753107] systemd[1]: Created slice Slice /system/dirmngr.
> > > > [    3.753888] systemd[1]: Created slice Slice /system/getty.
> > > > [    3.754461] systemd[1]: Created slice Slice /system/gpg-
> agent.
> > > > [    3.755011] systemd[1]: Created slice Slice /system/gpg-
> agent-
> > > browser.
> > > > [    3.755524] systemd[1]: Created slice Slice /system/gpg-
> agent-
> > > extra.
> > > > [    3.755998] systemd[1]: Created slice Slice /system/gpg-
> agent-
> > > ssh.
> > > > [    3.756450] systemd[1]: Created slice Slice /system/keyboxd.
> > > > [    3.756684] systemd[1]: Created slice Slice
> /system/modprobe.
> > > > [    3.756803] systemd[1]: Created slice Slice /system/systemd-
> > > fsck.
> > > > [    3.756872] systemd[1]: Created slice User and Session
> Slice.
> > > > [    3.756893] systemd[1]: Started Dispatch Password Requests
> to
> > > Console Directory Watch.
> > > > [    3.756908] systemd[1]: Started Forward Password Requests to
> > > Wall Directory Watch.
> > > > [    3.756982] systemd[1]: Set up automount Arbitrary
> Executable
> > > File Formats File System Automount Point.
> > > > [    3.756989] systemd[1]: Expecting device /dev/disk/by-
> uuid/EF7B-
> > > A70B...
> > > > [    3.756993] systemd[1]: Expecting device /dev/disk/by-
> > > uuid/efa73f2d-495d-448d-a0f0-dd425258b7e5...
> > > > [    3.756999] systemd[1]: Reached target Local Encrypted
> Volumes.
> > > > [    3.757005] systemd[1]: Reached target Login Prompts.
> > > > [    3.757011] systemd[1]: Reached target Local Integrity
> Protected
> > > Volumes.
> > > > [    3.757020] systemd[1]: Reached target Path Units.
> > > > [    3.757027] systemd[1]: Reached target Remote File Systems.
> > > > [    3.757031] systemd[1]: Reached target Slice Units.
> > > > [    3.757043] systemd[1]: Reached target Local Verity
> Protected
> > > Volumes.
> > > > [    3.757076] systemd[1]: Listening on Device-mapper event
> daemon
> > > FIFOs.
> > > > [    3.760193] systemd[1]: Listening on Process Core Dump
> Socket.
> > > > [    3.760919] systemd[1]: Listening on Credential
> > > Encryption/Decryption.
> > > > [    3.761003] systemd[1]: Listening on Journal Socket
> (/dev/log).
> > > > [    3.761058] systemd[1]: Listening on Journal Sockets.
> > > > [    3.761093] systemd[1]: TPM PCR Measurements was skipped
> because
> > > of an unmet condition check (ConditionSecurity=measured-uki).
> > > > [    3.761109] systemd[1]: Make TPM PCR Policy was skipped
> because
> > > of an unmet condition check (ConditionSecurity=measured-uki).
> > > > [    3.761165] systemd[1]: Listening on udev Control Socket.
> > > > [    3.761202] systemd[1]: Listening on udev Kernel Socket.
> > > > [    3.762311] systemd[1]: Mounting Huge Pages File System...
> > > > [    3.763074] systemd[1]: Mounting POSIX Message Queue File
> > > System...
> > > > [    3.763792] systemd[1]: Mounting Kernel Debug File System...
> > > > [    3.764350] systemd[1]: Mounting Kernel Trace File System...
> > > > [    3.765317] systemd[1]: Starting Create List of Static
> Device
> > > Nodes...
> > > > [    3.766158] systemd[1]: Starting Load Kernel Module
> configfs...
> > > > [    3.766682] systemd[1]: Starting Load Kernel Module
> dm_mod...
> > > > [    3.767934] systemd[1]: Starting Load Kernel Module drm...
> > > > [    3.769088] systemd[1]: Starting Load Kernel Module fuse...
> > > > [    3.770335] systemd[1]: Starting Load Kernel Module loop...
> > > > [    3.770384] systemd[1]: File System Check on Root Device was
> > > skipped because of an unmet condition check
> > > (ConditionPathIsReadWrite=!/).
> > > > [    3.770425] systemd[1]: Clear Stale Hibernate Storage Info
> was
> > > skipped because of an unmet condition check
> > > (ConditionPathExists=/sys/firmware/efi/efivars/HibernateLocation-
> > > 8cf2644b-4b0b-428f-9387-6d876050dc67).
> > > > [    3.772057] systemd[1]: Starting Journal Service...
> > > > [    3.772971] systemd[1]: Starting Load Kernel Modules...
> > > > [    3.772986] systemd[1]: TPM PCR Machine ID Measurement was
> > > skipped because of an unmet condition check
> > > (ConditionSecurity=measured-uki).
> > > > [    3.773641] systemd[1]: Starting Remount Root and Kernel
> File
> > > Systems...
> > > > [    3.773677] systemd[1]: Early TPM SRK Setup was skipped
> because
> > > of an unmet condition check (ConditionSecurity=measured-uki).
> > > > [    3.774224] systemd[1]: Starting Load udev Rules from
> > > Credentials...
> > > > [    3.774948] systemd[1]: Starting Coldplug All udev
> Devices...
> > > > [    3.777379] systemd[1]: Mounted Huge Pages File System.
> > > > [    3.777453] systemd[1]: Mounted POSIX Message Queue File
> System.
> > > > [    3.777510] systemd[1]: Mounted Kernel Debug File System.
> > > > [    3.777561] systemd[1]: Mounted Kernel Trace File System.
> > > > [    3.777759] systemd[1]: Finished Create List of Static
> Device
> > > Nodes.
> > > > [    3.777978] systemd[1]: modprobe at configfs.service:
> Deactivated
> > > successfully.
> > > > [    3.778112] systemd[1]: Finished Load Kernel Module
> configfs.
> > > > [    3.778286] systemd[1]: modprobe at drm.service: Deactivated
> > > successfully.
> > > > [    3.778411] systemd[1]: Finished Load Kernel Module drm.
> > > > [    3.778575] systemd[1]: modprobe at fuse.service: Deactivated
> > > successfully.
> > > > [    3.778688] systemd[1]: Finished Load Kernel Module fuse.
> > > > [    3.779305] systemd[1]: Mounting FUSE Control File System...
> > > > [    3.780063] systemd[1]: Mounting Kernel Configuration File
> > > System...
> > > > [    3.780929] systemd[1]: Starting Create Static Device Nodes
> in
> > > /dev gracefully...
> > > > [    3.782976] systemd[1]: Finished Load udev Rules from
> > > Credentials.
> > > > [    3.783391] loop: module loaded
> > > > [    3.784044] systemd[1]: modprobe at loop.service: Deactivated
> > > successfully.
> > > > [    3.784330] systemd[1]: Finished Load Kernel Module loop.
> > > > [    3.785492] systemd[1]: Mounted FUSE Control File System.
> > > > [    3.785629] systemd[1]: Mounted Kernel Configuration File
> > > System.
> > > > [    3.785810] systemd-journald[395]: Collecting audit messages
> is
> > > disabled.
> > > > [    3.798212] i2c_dev: i2c /dev entries driver
> > > > [    3.799115] systemd[1]: Finished Load Kernel Modules.
> > > > [    3.799850] systemd[1]: Starting Apply Kernel Variables...
> > > > [    3.799991] device-mapper: uevent: version 1.0.3
> > > > [    3.800058] device-mapper: ioctl: 4.48.0-ioctl (2023-03-01)
> > > initialised: dm-devel at lists.linux.dev
> > > > [    3.800371] systemd[1]: modprobe at dm_mod.service: Deactivated
> > > successfully.
> > > > [    3.800462] systemd[1]: Finished Load Kernel Module dm_mod.
> > > > [    3.800633] systemd[1]: Repartition Root Disk was skipped
> > > because no trigger condition checks were met.
> > > > [    3.805467] systemd[1]: Finished Create Static Device Nodes
> in
> > > /dev gracefully.
> > > > [    3.806389] systemd[1]: Finished Apply Kernel Variables.
> > > > [    3.806887] systemd[1]: Started Journal Service.
> > > > [    3.832625] EXT4-fs (nvme0n1p2): re-mounted 0420afc7-4947-
> 4e2e-
> > > a096-b607b8b7fd93 r/w. Quota mode: none.
> > > > [    3.840126] systemd-journald[395]: Received client request
> to
> > > flush runtime journal.
> > > > [    3.843896] Adding 67108860k swap on /swapfile.  Priority:-2
> > > extents:86 across:334987260k SS
> > > > [    3.946711] mc: Linux media interface: v0.10
> > > > [    3.950655] mousedev: PS/2 mouse device common for all mice
> > > > [    3.971833] resource: resource sanity check: requesting [mem
> > > 0x00000000fedc0000-0x00000000fedcffff], which spans more than pnp
> > > 00:03 [mem 0xfedc0000-0xfedc7fff]
> > > > [    3.971839] caller igen6_probe+0x15e/0x7c0 [igen6_edac]
> mapping
> > > multiple BARs
> > > > [    3.975353] EDAC MC0: Giving out device to module igen6_edac
> > > controller Intel_client_SoC MC#0: DEV 0000:00:00.0 (INTERRUPT)
> > > > [    3.975402] EDAC MC1: Giving out device to module igen6_edac
> > > controller Intel_client_SoC MC#1: DEV 0000:00:00.0 (INTERRUPT)
> > > > [    3.975427] EDAC igen6 MC0: HANDLING IBECC MEMORY ERROR
> > > > [    3.975428] EDAC igen6 MC0: ADDR 0x7fffffffe0
> > > > [    3.975454] intel_pmc_core INT33A1:00:  initialized
> > > > [    3.975552] EDAC igen6 MC1: HANDLING IBECC MEMORY ERROR
> > > > [    3.975556] EDAC igen6 MC1: ADDR 0x7fffffffe0
> > > > [    3.976644] EDAC igen6: v2.5.1
> > > > [    3.985687] videodev: Linux video capture interface: v2.00
> > > > [    3.985762] pps_core: LinuxPPS API ver. 1 registered
> > > > [    3.985765] pps_core: Software ver. 5.3.6 - Copyright 2005-
> 2007
> > > Rodolfo Giometti <giometti at linux.it>
> > > > [    3.988981] input: PC Speaker as
> > > /devices/platform/pcspkr/input/input10
> > > > [    3.996243] PTP clock support registered
> > > > [    3.999181] mei_me 0000:00:16.0: enabling device (0000 ->
> 0002)
> > > > [    4.000730] i801_smbus 0000:00:1f.4: enabling device (0000
> ->
> > > 0003)
> > > > [    4.001128] i801_smbus 0000:00:1f.4: SPD Write Disable is
> set
> > > > [    4.001184] i801_smbus 0000:00:1f.4: SMBus using PCI
> interrupt
> > > > [    4.004969] i2c i2c-13: Successfully instantiated SPD at
> 0x50
> > > > [    4.008414] intel-lpss 0000:00:15.0: enabling device (0004
> ->
> > > 0006)
> > > > [    4.008861] idma64 idma64.0: Found Intel integrated DMA 64-
> bit
> > > > [    4.027139] Serial bus multi instantiate pseudo device
> driver
> > > INT3515:00: error -ENXIO: IRQ index 1 not found
> > > > [    4.027145] Serial bus multi instantiate pseudo device
> driver
> > > INT3515:00: error -ENXIO: Error requesting irq at index 1
> > > > [    4.029512] ACPI: bus type thunderbolt registered
> > > > [    4.032631] Intel(R) 2.5G Ethernet Linux Driver
> > > > [    4.032634] Copyright(c) 2018 Intel Corporation.
> > > > [    4.032751] igc 0000:64:00.0: enabling device (0000 -> 0002)
> > > > [    4.033014] igc 0000:64:00.0: PTM enabled, 4ns granularity
> > > > [    4.038479] intel-lpss 0000:00:15.1: enabling device (0004
> ->
> > > 0006)
> > > > [    4.038818] idma64 idma64.1: Found Intel integrated DMA 64-
> bit
> > > > [    4.047090] Creating 1 MTD partitions on "0000:00:1f.5":
> > > > [    4.047094] 0x000000000000-0x000002000000 : "BIOS"
> > > > [    4.079742] pps pps0: new PPS source ptp0
> > > > [    4.079786] igc 0000:64:00.0 (unnamed net_device)
> > > (uninitialized): PHC added
> > > > [    4.082583] RAPL PMU: API unit is 2^-32 Joules, 4 fixed
> > > counters, 655360 ms ovfl timer
> > > > [    4.082586] RAPL PMU: hw unit of domain pp0-core 2^-14
> Joules
> > > > [    4.082588] RAPL PMU: hw unit of domain package 2^-14 Joules
> > > > [    4.082588] RAPL PMU: hw unit of domain pp1-gpu 2^-14 Joules
> > > > [    4.082589] RAPL PMU: hw unit of domain psys 2^-14 Joules
> > > > [    4.083350] usbcore: registered new device driver r8152-
> > > cfgselector
> > > > [    4.107228] cryptd: max_cpu_qlen set to 1000
> > > > [    4.107196] mei_hdcp 0000:00:16.0-b638ab7e-94e2-4ea2-a552-
> > > d1c54b627f04: bound 0000:00:02.0 (ops i915_hdcp_ops [i915])
> > > > [    4.107949] mei_pxp 0000:00:16.0-fbf6fcf1-96cf-4e2e-a6a6-
> > > 1bab8cbe36b1: bound 0000:00:02.0 (ops i915_pxp_tee_component_ops
> > > [i915])
> > > > [    4.109214] ee1004 13-0050: 512 byte EE1004-compliant SPD
> > > EEPROM, read-only
> > > > [    4.172477] r8152-cfgselector 2-1.1: reset SuperSpeed USB
> device
> > > number 3 using xhci_hcd
> > > > [    4.187010] Bluetooth: Core ver 2.22
> > > > [    4.187025] NET: Registered PF_BLUETOOTH protocol family
> > > > [    4.187026] Bluetooth: HCI device and connection manager
> > > initialized
> > > > [    4.187032] Bluetooth: HCI socket layer initialized
> > > > [    4.187034] Bluetooth: L2CAP socket layer initialized
> > > > [    4.187036] Bluetooth: SCO socket layer initialized
> > > > [    4.191558] igc 0000:64:00.0: 4.000 Gb/s available PCIe
> > > bandwidth (5.0 GT/s PCIe x1 link)
> > > > [    4.191562] igc 0000:64:00.0 eth0: MAC: XX:XX:XX:XX:XX:XX
> > > > [    4.191837] cfg80211: Loading compiled-in X.509 certificates
> for
> > > regulatory database
> > > > [    4.191998] igc 0000:65:00.0: enabling device (0000 -> 0002)
> > > > [    4.192549] igc 0000:65:00.0: PTM enabled, 4ns granularity
> > > > [    4.193238] AES CTR mode by8 optimization enabled
> > > > [    4.194837] Loaded X.509 cert 'sforshee: 00b28ddf47aef9cea7'
> > > > [    4.195017] Loaded X.509 cert 'wens:
> > > 61c038651aabdcf94bd0ac7ff06c7248db18c600'
> > > > [    4.214394] snd_hda_intel 0000:00:1f.3: enabling device
> (0000 ->
> > > 0002)
> > > > [    4.214598] snd_hda_intel 0000:00:1f.3: bound 0000:00:02.0
> (ops
> > > i915_audio_component_bind_ops [i915])
> > > > [    4.223182] usbcore: registered new interface driver btusb
> > > > [    4.224896] Bluetooth: hci0: HW/SW Version: 0x008a008a,
> Build
> > > Time: 20240826151221
> > > > [    4.243090] pps pps1: new PPS source ptp1
> > > > [    4.243291] igc 0000:65:00.0 (unnamed net_device)
> > > (uninitialized): PHC added
> > > > [    4.245647] r8152 2-1.1:1.0 eth1: v1.12.13
> > > > [    4.245683] usbcore: registered new interface driver r8152
> > > > [    4.261881] usbcore: registered new interface driver
> cdc_ether
> > > > [    4.272727] snd_hda_codec_realtek hdaudioC0D0: autoconfig
> for
> > > ALC269VB: line_outs=1 (0x21/0x0/0x0/0x0/0x0) type:hp
> > > > [    4.272733] snd_hda_codec_realtek
> hdaudioC0D0:    speaker_outs=0
> > > (0x0/0x0/0x0/0x0/0x0)
> > > > [    4.272735] snd_hda_codec_realtek hdaudioC0D0:    hp_outs=0
> > > (0x0/0x0/0x0/0x0/0x0)
> > > > [    4.272737] snd_hda_codec_realtek hdaudioC0D0:    mono:
> > > mono_out=0x0
> > > > [    4.272738] snd_hda_codec_realtek hdaudioC0D0:    inputs:
> > > > [    4.272739] snd_hda_codec_realtek hdaudioC0D0:      Mic=0x18
> > > > [    4.283158] igc 0000:65:00.0: 4.000 Gb/s available PCIe
> > > bandwidth (5.0 GT/s PCIe x1 link)
> > > > [    4.283163] igc 0000:65:00.0 eth2: MAC: XX:XX:XX:XX:XX:XX
> > > > [    4.285711] igc 0000:64:00.0 enp100s0: renamed from eth0
> > > > [    4.303471] Intel(R) Wireless WiFi driver for Linux
> > > > [    4.303618] iwlwifi 0000:00:14.3: enabling device (0000 ->
> 0002)
> > > > [    4.306032] iwlwifi 0000:00:14.3: Detected crf-id 0x400410,
> cnv-
> > > id 0x80400 wfpm id 0x80000020
> > > > [    4.306074] iwlwifi 0000:00:14.3: PCI dev 51f0/0094,
> rev=0x370,
> > > rfid=0x2010d000
> > > > [    4.306077] iwlwifi 0000:00:14.3: Detected Intel(R) Wi-Fi 6E
> > > AX211 160MHz
> > > > [    4.310525] iwlwifi 0000:00:14.3: TLV_FW_FSEQ_VERSION: FSEQ
> > > Version: 0.0.2.42
> > > > [    4.310859] iwlwifi 0000:00:14.3: loaded firmware version
> > > 89.202a2f7b.0 so-a0-gf-a0-89.ucode op_mode iwlmvm
> > > > [    4.317505] r8152 2-1.1:1.0 enp0s13f0u1u1: renamed from eth1
> > > > [    4.317848] igc 0000:65:00.0 enp101s0: renamed from eth2
> > > > [    4.326705] input: HDA Intel PCH Mic as
> > > /devices/pci0000:00/0000:00:1f.3/sound/card0/input11
> > > > [    4.326777] input: HDA Intel PCH Headphone as
> > > /devices/pci0000:00/0000:00:1f.3/sound/card0/input12
> > > > [    4.326832] input: HDA Intel PCH HDMI/DP,pcm=3 as
> > > /devices/pci0000:00/0000:00:1f.3/sound/card0/input13
> > > > [    4.326873] input: HDA Intel PCH HDMI/DP,pcm=7 as
> > > /devices/pci0000:00/0000:00:1f.3/sound/card0/input14
> > > > [    4.326939] input: HDA Intel PCH HDMI/DP,pcm=8 as
> > > /devices/pci0000:00/0000:00:1f.3/sound/card0/input15
> > > > [    4.326994] input: HDA Intel PCH HDMI/DP,pcm=9 as
> > > /devices/pci0000:00/0000:00:1f.3/sound/card0/input16
> > > > [    4.430414] intel_tcc_cooling: TCC Offset locked
> > > > [    4.555399] intel_rapl_msr: PL4 support detected.
> > > > [    4.555425] intel_rapl_common: Found RAPL domain package
> > > > [    4.555428] intel_rapl_common: Found RAPL domain core
> > > > [    4.555429] intel_rapl_common: Found RAPL domain uncore
> > > > [    4.555431] intel_rapl_common: Found RAPL domain psys
> > > > [    4.613360] iwlwifi 0000:00:14.3: WFPM_UMAC_PD_NOTIFICATION:
> > > 0x20
> > > > [    4.613411] iwlwifi 0000:00:14.3:
> WFPM_LMAC2_PD_NOTIFICATION:
> > > 0x1f
> > > > [    4.613418] iwlwifi 0000:00:14.3: WFPM_AUTH_KEY_0: 0x90
> > > > [    4.613426] iwlwifi 0000:00:14.3: CNVI_SCU_SEQ_DATA_DW9: 0x0
> > > > [    4.613723] iwlwifi 0000:00:14.3: loaded PNVM version
> 35148b80
> > > > [    4.614836] iwlwifi 0000:00:14.3: RFIm is deactivated,
> reason =
> > > 4
> > > > [    4.630016] iwlwifi 0000:00:14.3: Detected RF GF,
> > > rfid=0x2010d000
> > > > [    4.700769] iwlwifi 0000:00:14.3: base HW address:
> > > XX:XX:XX:XX:XX:XX
> > > > [    4.833421] iwlwifi 0000:00:14.3 wlo1: renamed from wlan0
> > > > [    5.452456] EXT4-fs (nvme0n1p3): mounted filesystem
> efa73f2d-
> > > 495d-448d-a0f0-dd425258b7e5 r/w with ordered data mode. Quota
> mode:
> > > none.
> > > > [    5.661641] Bluetooth: BNEP (Ethernet Emulation) ver 1.3
> > > > [    5.661644] Bluetooth: BNEP filters: protocol multicast
> > > > [    5.661647] Bluetooth: BNEP socket layer initialized
> > > > [    5.925867] iwlwifi 0000:00:14.3: WFPM_UMAC_PD_NOTIFICATION:
> > > 0x20
> > > > [    5.925877] iwlwifi 0000:00:14.3:
> WFPM_LMAC2_PD_NOTIFICATION:
> > > 0x1f
> > > > [    5.925885] iwlwifi 0000:00:14.3: WFPM_AUTH_KEY_0: 0x90
> > > > [    5.925893] iwlwifi 0000:00:14.3: CNVI_SCU_SEQ_DATA_DW9: 0x0
> > > > [    5.927244] iwlwifi 0000:00:14.3: RFIm is deactivated,
> reason =
> > > 4
> > > > [    6.019702] iwlwifi 0000:00:14.3: Registered PHC clock:
> iwlwifi-
> > > PTP, with index: 2
> > > > [    6.248772] iwlwifi 0000:00:14.3: WFPM_UMAC_PD_NOTIFICATION:
> > > 0x20
> > > > [    6.248782] iwlwifi 0000:00:14.3:
> WFPM_LMAC2_PD_NOTIFICATION:
> > > 0x1f
> > > > [    6.248790] iwlwifi 0000:00:14.3: WFPM_AUTH_KEY_0: 0x90
> > > > [    6.248798] iwlwifi 0000:00:14.3: CNVI_SCU_SEQ_DATA_DW9: 0x0
> > > > [    6.250128] iwlwifi 0000:00:14.3: RFIm is deactivated,
> reason =
> > > 4
> > > > [    7.025262] Bluetooth: hci0: Device setup in 2736415 usecs
> > > > [    7.025270] Bluetooth: hci0: HCI Enhanced Setup Synchronous
> > > Connection command is advertised, but not supported.
> > > > [    7.466021] usbcore: registered new interface driver option
> > > > [    7.466030] usbserial: USB Serial support registered for GSM
> > > modem (1-port)
> > > > [    8.318933] Bluetooth: hci0: Mediatek coredump end
> > > > [    8.566804] igc 0000:64:00.0 enp100s0: NIC Link is Up 1000
> Mbps
> > > Full Duplex, Flow Control: RX
> > > > [    9.199113] Bluetooth: hci0: Mediatek coredump end
> > > > [    9.209081] Bluetooth: hci0: Opcode 0x0c03 failed: -110
> > > > [   11.342488] Bluetooth: hci0: Failed to read MSFT supported
> > > features (-110)
> > > > [   13.455279] block nvme0n1: No UUID available providing old
> NGUID
> > > > [   13.478988] Bluetooth: hci0: AOSP get vendor capabilities (-
> 110)
> > > > [   16.117052] wlo1: regulatory prevented using AP config,
> > > downgraded
> > > > [   16.123049] wlo1: authenticate with XX:XX:XX:XX:XX:XX (local
> > > address=XX:XX:XX:XX:XX:XX)
> > > > [   16.124244] wlo1: send auth to XX:XX:XX:XX:XX:XX (try 1/3)
> > > > [   16.166021] wlo1: authenticated
> > > > [   16.172421] wlo1: associate with XX:XX:XX:XX:XX:XX (try 1/3)
> > > > [   16.174455] wlo1: RX AssocResp from XX:XX:XX:XX:XX:XX
> > > (capab=0x111 status=0 aid=1)
> > > > [   16.184782] wlo1: associated
> > > > [   16.246848] wlo1: Limiting TX power to 23 (26 - 3) dBm as
> > > advertised by XX:XX:XX:XX:XX:XX
> > > > [   17.488650] warning: `ThreadPoolForeg' uses wireless
> extensions
> > > which will stop working for Wi-Fi 7 hardware; use nl80211
> > > > [   17.531765] platform INT3515:01: deferred probe pending:
> Serial
> > > bus multi instantiate pseudo device driver: Error creating i2c-
> > > client, idx 0
> > > > [   17.531769] platform INT3515:02: deferred probe pending:
> Serial
> > > bus multi instantiate pseudo device driver: Error creating i2c-
> > > client, idx 0
> > > > [   18.595698] usb 4-1: Disable of device-initiated U1 failed.
> > > > [   23.715878] usb 4-1: Disable of device-initiated U2 failed.
> > > > [   33.956071] Bluetooth: hci0: Failed to write uhw reg(-110)
> > > > [   33.956138] usb 4-1: Disable of device-initiated U2 failed.
> > > > [   39.293677] xhci_hcd 0000:00:14.0: Timeout while waiting for
> > > setup device command
> > > > [   44.634497] xhci_hcd 0000:00:14.0: Timeout while waiting for
> > > setup device command
> > > > [   44.841067] usb 4-1: device not accepting address 2, error
> -62
> > > > [   50.186371] xhci_hcd 0000:00:14.0: Timeout while waiting for
> > > setup device command
> > > > [   55.523585] xhci_hcd 0000:00:14.0: Timeout while waiting for
> > > setup device command
> > > > [   55.729841] usb 4-1: device not accepting address 2, error
> -62
> > > > [   61.072634] xhci_hcd 0000:00:14.0: Timeout while waiting for
> > > setup device command
> > > > [   66.407700] xhci_hcd 0000:00:14.0: Timeout while waiting for
> > > setup device command
> > > > [   66.614207] usb 4-1: device not accepting address 2, error
> -62
> > > > [   71.955541] xhci_hcd 0000:00:14.0: Timeout while waiting for
> > > setup device command
> > > > [   77.289925] xhci_hcd 0000:00:14.0: Timeout while waiting for
> > > setup device command
> > > > [   77.496512] usb 4-1: device not accepting address 2, error
> -62
> > > > [   77.513500] usb 4-1: USB disconnect, device number 2
> > > > [   82.837128] xhci_hcd 0000:00:14.0: Timeout while waiting for
> > > setup device command
> > > > [   88.171049] xhci_hcd 0000:00:14.0: Timeout while waiting for
> > > setup device command
> > > > [   88.377554] usb 4-1: device not accepting address 3, error
> -62
> > > > [   93.718045] xhci_hcd 0000:00:14.0: Timeout while waiting for
> > > setup device command
> > > > [   99.051387] xhci_hcd 0000:00:14.0: Timeout while waiting for
> > > setup device command
> > > > [   99.258078] usb 4-1: device not accepting address 4, error
> -62
> > > > [   99.266739] usb usb4-port1: attempt power cycle
> > > > [  106.518206] xhci_hcd 0000:00:14.0: Timeout while waiting for
> > > setup device command
> > > > [  111.851387] xhci_hcd 0000:00:14.0: Timeout while waiting for
> > > setup device command
> > > > [  112.057840] usb 4-1: device not accepting address 5, error
> -62
> > > > [  117.397862] xhci_hcd 0000:00:14.0: Timeout while waiting for
> > > setup device command
> > > > [  122.732729] xhci_hcd 0000:00:14.0: Timeout while waiting for
> > > setup device command
> > > > [  122.937708] usb 4-1: device not accepting address 6, error
> -62
> > > > [  122.944587] usb usb4-port1: unable to enumerate USB device
> > > >
> > > >
> > > >
> > > > >
> > > > > >
> > > > > > External email : Please do not click links or open
> attachments
> > > until
> > > > > > you have verified the sender or the content.
> > > > > >  Hi,
> > > > > >
> > > > > > The 22/08/2024 13:23, Hao Qin wrote:
> > > > > > > Remove resetting mt7921 before downloading the fw, as it
> may
> > > cause
> > > > > > > command timeout when performing the reset.
> > > > > > >
> > > > > > > Signed-off-by: Hao Qin <hao.qin at mediatek.com>
> > > > > > > ---
> > > > > > >  drivers/bluetooth/btmtk.c | 4 ++--
> > > > > > >  1 file changed, 2 insertions(+), 2 deletions(-)
> > > > > > >
> > > > > > > diff --git a/drivers/bluetooth/btmtk.c
> > > b/drivers/bluetooth/btmtk.c
> > > > > > > index 2b7c80043aa2..a46f70135cbd 100644
> > > > > > > --- a/drivers/bluetooth/btmtk.c
> > > > > > > +++ b/drivers/bluetooth/btmtk.c
> > > > > > > @@ -1326,7 +1326,6 @@ int btmtk_usb_setup(struct hci_dev
> > > *hdev)
> > > > > > >  fwname = FIRMWARE_MT7668;
> > > > > > >  break;
> > > > > > >  case 0x7922:
> > > > > > > -case 0x7961:
> > > > > > >  case 0x7925:
> > > > > > >  /* Reset the device to ensure it's in the initial state
> > > before
> > > > > > >   * downloading the firmware to ensure.
> > > > > > > @@ -1334,7 +1333,8 @@ int btmtk_usb_setup(struct hci_dev
> > > *hdev)
> > > > > > >
> > > > > > >  if (!test_bit(BTMTK_FIRMWARE_LOADED, &btmtk_data-
> >flags))
> > > > > > >  btmtk_usb_subsys_reset(hdev, dev_id);
> > > > > > > -
> > > > > > > +fallthrough;
> > > > > > > +case 0x7961:
> > > > > > >  btmtk_fw_get_filename(fw_bin_name, sizeof(fw_bin_name),
> > > dev_id,
> > > > > > >        fw_version, fw_flavor);
> > > > > > >
> > > > > > > --
> > > > > > > 2.18.0
> > > > > > >
> > > > > >
> > > > > > [Original regression report
> > > > > >
> > > > > 
> > > 
> https://lore.kernel.org/linux-bluetooth/ZsTh7Jyug7MbZsLE at mdpsys.co.uk/
> > > > > > ]
> > > > > >
> > > > > > Thanks for the patch, I have tested it on top of v6.11-rc7
> and
> > > can
> > > > > > confirm
> > > > > > that it resolves the initial command timeout issue.
> > > > > >
> > > > > > Unfortunately, when using the latest firmware version
> > > 20240826151221
> > > > > > from the
> > > > > > linux-firmware repo I'm still seeing "Mediatek coredump
> end"
> > > errors
> > > > > > followed by MSFT and AOSP errors. The device then appears
> > > > > > unresponsive
> > > > > > and the kernel eventually gives up attempting to enumerate:
> > > > > >
> > > > > > [  230.042936] usb 4-3.2: new SuperSpeed USB device number
> 4
> > > using
> > > > > > xhci_hcd
> > > > > > [  230.065228] usb 4-3.2: New USB device found,
> idVendor=0e8d,
> > > > > > idProduct=7961, bcdDevice= 1.00
> > > > > > [  230.065237] usb 4-3.2: New USB device strings: Mfr=6,
> > > Product=7,
> > > > > > SerialNumber=8
> > > > > > [  230.065240] usb 4-3.2: Product: Wireless_Device
> > > > > > [  230.065242] usb 4-3.2: Manufacturer: MediaTek Inc.
> > > > > > [  230.065245] usb 4-3.2: SerialNumber: 000000000
> > > > > > [  230.101915] Bluetooth: hci2: HW/SW Version: 0x008a008a,
> > > Build
> > > > > > Time: 20240826151221
> > > > > > [  233.005938] Bluetooth: hci2: Device setup in 2862056
> usecs
> > > > > > [  233.005983] Bluetooth: hci2: HCI Enhanced Setup
> Synchronous
> > > > > > Connection command is advertised, but not supported.
> > > > > > [  234.306071] Bluetooth: hci2: Mediatek coredump end
> > > > > > [  235.092729] Bluetooth: hci2: Opcode 0x0c03 failed: -110
> > > > > > [  235.192772] Bluetooth: hci2: Mediatek coredump end
> > > > > > [  237.226157] Bluetooth: hci2: Failed to read MSFT
> supported
> > > > > > features (-110)
> > > > > > [  239.359435] Bluetooth: hci2: AOSP get vendor
> capabilities (-
> > > 110)
> > > > > > [  244.479726] usb 4-3.2: Disable of device-initiated U1
> > > failed.
> > > > > > [  249.599598] usb 4-3.2: Disable of device-initiated U2
> > > failed.
> > > > > > [  259.839215] Bluetooth: hci2: Failed to write uhw reg(-
> 110)
> > > > > > [  259.839240] usb 4-3.2: Disable of device-initiated U1
> > > failed.
> > > > > > [  264.959343] usb 4-3.2: Disable of device-initiated U2
> > > failed.
> > > > > > [  270.079038] xhci_hcd 0000:00:14.0: Timeout while waiting
> for
> > > setup
> > > > > > device command
> > > > > > [  275.412299] xhci_hcd 0000:00:14.0: Timeout while waiting
> for
> > > setup
> > > > > > device command
> > > > > > [  275.618812] usb 4-3.2: device not accepting address 4,
> error
> > > -62
> > > > > > [  280.958852] xhci_hcd 0000:00:14.0: Timeout while waiting
> for
> > > setup
> > > > > > device command
> > > > > > [  286.292034] xhci_hcd 0000:00:14.0: Timeout while waiting
> for
> > > setup
> > > > > > device command
> > > > > > [  286.498618] usb 4-3.2: device not accepting address 4,
> error
> > > -62
> > > > > > [  291.838759] xhci_hcd 0000:00:14.0: Timeout while waiting
> for
> > > setup
> > > > > > device command
> > > > > > [  297.172018] xhci_hcd 0000:00:14.0: Timeout while waiting
> for
> > > setup
> > > > > > device command
> > > > > > [  297.378477] usb 4-3.2: device not accepting address 4,
> error
> > > -62
> > > > > > [  302.718497] xhci_hcd 0000:00:14.0: Timeout while waiting
> for
> > > setup
> > > > > > device command
> > > > > > [  308.051867] xhci_hcd 0000:00:14.0: Timeout while waiting
> for
> > > setup
> > > > > > device command
> > > > > > [  308.258345] usb 4-3.2: device not accepting address 4,
> error
> > > -62
> > > > > > [  308.260253] usb 4-3.2: USB disconnect, device number 4
> > > > > > [  313.598307] xhci_hcd 0000:00:14.0: Timeout while waiting
> for
> > > setup
> > > > > > device command
> > > > > > [  318.931586] xhci_hcd 0000:00:14.0: Timeout while waiting
> for
> > > setup
> > > > > > device command
> > > > > > [  319.138278] usb 4-3.2: device not accepting address 5,
> error
> > > -62
> > > > > > [  324.478224] xhci_hcd 0000:00:14.0: Timeout while waiting
> for
> > > setup
> > > > > > device command
> > > > > > [  329.811444] xhci_hcd 0000:00:14.0: Timeout while waiting
> for
> > > setup
> > > > > > device command
> > > > > > [  330.018032] usb 4-3.2: device not accepting address 6,
> error
> > > -62
> > > > > > [  330.018489] usb 4-3-port2: attempt power cycle
> > > > > > [  336.211505] xhci_hcd 0000:00:14.0: Timeout while waiting
> for
> > > setup
> > > > > > device command
> > > > > > [  341.544640] xhci_hcd 0000:00:14.0: Timeout while waiting
> for
> > > setup
> > > > > > device command
> > > > > > [  341.751239] usb 4-3.2: device not accepting address 7,
> error
> > > -62
> > > > > > [  347.091375] xhci_hcd 0000:00:14.0: Timeout while waiting
> for
> > > setup
> > > > > > device command
> > > > > > [  352.424563] xhci_hcd 0000:00:14.0: Timeout while waiting
> for
> > > setup
> > > > > > device command
> > > > > > [  352.631136] usb 4-3.2: device not accepting address 8,
> error
> > > -62
> > > > > > [  352.631538] usb 4-3-port2: unable to enumerate USB
> device
> > > > > >
> > > > > >
> > > > > > Interestingly, if I revert back to an known-good firmware
> > > version
> > > > > > 20231025113744 along with your patch, the device enumerates
> and
> > > works
> > > > > > fine:
> > > > > >
> > > > > > [ 4001.366725] usb 4-1: new SuperSpeed USB device number 4
> > > using
> > > > > > xhci_hcd
> > > > > > [ 4001.385840] usb 4-1: New USB device found,
> idVendor=0e8d,
> > > > > > idProduct=7961, bcdDevice= 1.00
> > > > > > [ 4001.385855] usb 4-1: New USB device strings: Mfr=6,
> > > Product=7,
> > > > > > SerialNumber=8
> > > > > > [ 4001.385860] usb 4-1: Product: Wireless_Device
> > > > > > [ 4001.385863] usb 4-1: Manufacturer: MediaTek Inc.
> > > > > > [ 4001.385867] usb 4-1: SerialNumber: 000000000
> > > > > > [ 4001.398010] Bluetooth: hci1: HW/SW Version: 0x008a008a,
> > > Build
> > > > > > Time: 20231025113744
> > > > > > [ 4004.275656] Bluetooth: hci1: Device setup in 2812288
> usecs
> > > > > > [ 4004.275661] Bluetooth: hci1: HCI Enhanced Setup
> Synchronous
> > > > > > Connection command is advertised, but not supported.
> > > > > > [ 4004.355137] Bluetooth: hci1: AOSP extensions version
> v0.96
> > > > > > [ 4004.355156] Bluetooth: hci1: AOSP quality report is not
> > > supported
> > > > > > [ 4004.355698] Bluetooth: MGMT ver 1.23
> > > > > >
> > > > > > But if I then disconnect it, I get the Oops that I shared
> in my
> > > > > > original
> > > > > > regression report:
> > > > > >
> > > > > > [ 4043.436215] usb 4-1: USB disconnect, device number 4
> > > > > > [ 4043.437308] Oops: general protection fault, probably for
> > > non-
> > > > > > canonical address 0xdead000000000122: 0000 [#1] PREEMPT SMP
> > > NOPTI
> > > > > > [ 4043.437332] CPU: 2 UID: 0 PID: 3698 Comm: kworker/2:0
> Not
> > > tainted
> > > > > > 6.11.0-rc7-00001-g0e2ad6528188-dirty #71
> > > > > > d90fb9085e2a0686ac48ebcc408d97b104c6fbf1
> > > > > > [ 4043.437352] Hardware name: Intel(R) Client Systems
> > > > > > NUC12WSHi7/NUC12WSBi7, BIOS WSADL357.0088.2023.0505.1623
> > > 05/05/2023
> > > > > > [ 4043.437361] Workqueue: usb_hub_wq hub_event
> > > > > > [ 4043.437386] RIP: 0010:hci_unregister_dev+0x45/0x1f0
> > > [bluetooth]
> > > > > > [ 4043.437548] Code: 89 ef e8 ae d4 5c c1 f0 80 8b e9 0e 00
> 00
> > > 08 48
> > > > > > 89 ef e8 0e c2 5c c1 48 c7 c7 68 60 52 c1 e8 22 23 5d c1 48
> 8b
> > > 43 08
> > > > > > 48 8b 13 <48> 3b 18 0f 85 f5 c7 06 00 48 3b 5a 08 0f 85 eb
> c7
> > > 06 00
> > > > > > 48 89 42
> > > > > > [ 4043.437560] RSP: 0018:ffffa10f4ae43b98 EFLAGS: 00010246
> > > > > > [ 4043.437574] RAX: dead000000000122 RBX: ffff8cf86c160000
> RCX:
> > > > > > 0000000000000000
> > > > > > [ 4043.437585] RDX: dead000000000100 RSI: ffff8cf7b7d16c50
> RDI:
> > > > > > ffffffffc1526068
> > > > > > [ 4043.437594] RBP: ffff8cf86c1604d0 R08: 0000000000000000
> R09:
> > > > > > ffff8cf7401d8e10
> > > > > > [ 4043.437602] R10: ffffa10f4ae43ba0 R11: ffffa10f4ae43ba8
> R12:
> > > > > > ffff8cf86c160000
> > > > > > [ 4043.437610] R13: ffffffffc1416278 R14: ffffffffc1416278
> R15:
> > > > > > ffff8cf7f8d73850
> > > > > > [ 4043.437620] FS:  0000000000000000(0000)
> > > GS:ffff8d0697300000(0000)
> > > > > > knlGS:0000000000000000
> > > > > > [ 4043.437632] CS:  0010 DS: 0000 ES: 0000 CR0:
> > > 0000000080050033
> > > > > > [ 4043.437641] CR2: 00007f98d66dc000 CR3: 0000000131124000
> CR4:
> > > > > > 0000000000f50ef0
> > > > > > [ 4043.437651] PKRU: 55555554
> > > > > > [ 4043.437658] Call Trace:
> > > > > > [ 4043.437670]  <TASK>
> > > > > > [ 4043.437680]  ? __die_body.cold+0x19/0x27
> > > > > > [ 4043.437700]  ? die_addr+0x3c/0x60
> > > > > > [ 4043.437716]  ? exc_general_protection+0x17d/0x400
> > > > > > [ 4043.437738]  ? asm_exc_general_protection+0x26/0x30
> > > > > > [ 4043.437760]  ? hci_unregister_dev+0x45/0x1f0 [bluetooth
> > > > > > 6dca047d1088401e195d97746b2b4936e5756d61]
> > > > > > [ 4043.437930]  ? hci_unregister_dev+0x3e/0x1f0 [bluetooth
> > > > > > 6dca047d1088401e195d97746b2b4936e5756d61]
> > > > > > [ 4043.438080]  btusb_disconnect+0x67/0x170 [btusb
> > > > > > 5bf8186d9cab4c5be1762247dadb6753a7c72a7f]
> > > > > > [ 4043.438108]  usb_unbind_interface+0x90/0x290
> > > > > > [ 4043.438130]  device_release_driver_internal+0x19c/0x200
> > > > > > [ 4043.438150]  bus_remove_device+0xc6/0x130
> > > > > > [ 4043.438166]  device_del+0x161/0x3e0
> > > > > > [ 4043.438182]  ? kobject_put+0xa0/0x1d0
> > > > > > [ 4043.438196]  usb_disable_device+0x104/0x220
> > > > > > [ 4043.438213]  usb_disconnect+0xe6/0x2e0
> > > > > > [ 4043.438231]  hub_event+0x7f9/0x19d0
> > > > > > [ 4043.438250]  ? __pm_runtime_suspend+0x47/0xc0
> > > > > > [ 4043.438269]  process_one_work+0x17b/0x330
> > > > > > [ 4043.438287]  worker_thread+0x2c6/0x3f0
> > > > > > [ 4043.438304]  ? __pfx_worker_thread+0x10/0x10
> > > > > > [ 4043.438318]  kthread+0xcf/0x100
> > > > > > [ 4043.438337]  ? __pfx_kthread+0x10/0x10
> > > > > > [ 4043.438354]  ret_from_fork+0x31/0x50
> > > > > > [ 4043.438367]  ? __pfx_kthread+0x10/0x10
> > > > > > [ 4043.438382]  ret_from_fork_asm+0x1a/0x30
> > > > > > [ 4043.438403]  </TASK>
> > > > > > [ 4043.438408] Modules linked in: uhid mt792x_usb
> mt7921_common
> > > > > > mt792x_lib mt76_connac_lib mt76_usb mt76 ccm option
> usb_wwan
> > > cmac
> > > > > > algif_hash algif_skcipher af_alg sr_mod cdrom bnep mousedev
> > > joydev
> > > > > > vfat fat snd_sof_pci_intel_tgl snd_sof_pci_intel_cnl
> > > intel_rapl_msr
> > > > > > snd_sof_intel_hda_generic intel_rapl_common soundwire_intel
> > > > > > intel_uncore_frequency soundwire_cadence
> > > > > > intel_uncore_frequency_common snd_sof_intel_hda_common
> > > > > > snd_sof_intel_hda_mlink snd_sof_intel_hda snd_sof_pci
> > > > > > snd_sof_xtensa_dsp snd_sof iwlmvm snd_sof_utils
> > > snd_soc_hdac_hda
> > > > > > snd_soc_acpi_intel_match soundwire_generic_allocation
> > > snd_soc_acpi
> > > > > > soundwire_bus snd_soc_avs r8152 x86_pkg_temp_thermal
> > > intel_powerclamp
> > > > > > libphy snd_soc_hda_codec coretemp mac80211 snd_hda_ext_core
> > > kvm_intel
> > > > > > snd_soc_core snd_hda_codec_hdmi cdc_ether hid_generic uas
> > > usbnet
> > > > > > snd_hda_codec_realtek snd_compress kvm usb_storage mii
> usbhid
> > > > > > snd_hda_codec_generic ac97_bus snd_pcm_dmaengine
> > > > > > snd_hda_scodec_component snd_hda_intel libarc4
> snd_intel_dspcfg
> > > btusb
> > > > > > crct10dif_pclmul snd_intel_sdw_acpi
> > > > > > [ 4043.438617]  crc32_pclmul iwlwifi btrtl snd_hda_codec
> > > > > > polyval_clmulni btintel polyval_generic btbcm
> > > ghash_clmulni_intel
> > > > > > sha512_ssse3 btmtk tps6598x sha256_ssse3 snd_hda_core typec
> > > > > > sha1_ssse3 cfg80211 bluetooth aesni_intel snd_hwdep roles
> > > gf128mul
> > > > > > crypto_simd snd_pcm cryptd mei_hdcp mei_pxp rapl ee1004
> ov13858
> > > > > > snd_timer intel_cstate igc spi_nor intel_uncore i2c_i801
> > > thunderbolt
> > > > > > snd v4l2_fwnode mei_me v4l2_async ptp wdat_wdt i2c_smbus
> mtd
> > > pcspkr
> > > > > > wmi_bmof intel_lpss_pci videodev mei pps_core soundcore
> > > > > > intel_pmc_core i2c_mux intel_lpss rfkill idma64 igen6_edac
> > > intel_vsec
> > > > > > serial_multi_instantiate mc pmt_telemetry pinctrl_tigerlake
> > > pmt_class
> > > > > > acpi_pad acpi_tad mac_hid i2c_dev dm_mod sg crypto_user
> loop
> > > > > > nfnetlink ip_tables x_tables ext4 crc32c_generic crc16
> mbcache
> > > jbd2
> > > > > > xe drm_ttm_helper gpu_sched drm_suballoc_helper drm_gpuvm
> > > drm_exec
> > > > > > i915 i2c_algo_bit drm_buddy ttm nvme intel_gtt
> > > drm_display_helper
> > > > > > nvme_core spi_intel_pci cec xhci_pci crc32c_intel spi_intel
> > > nvme_auth
> > > > > > xhci_pci_renesas video wmi
> > > > > > [ 4043.438898] ---[ end trace 0000000000000000 ]---
> > > > > > [ 4043.438905] RIP: 0010:hci_unregister_dev+0x45/0x1f0
> > > [bluetooth]
> > > > > > [ 4043.439039] Code: 89 ef e8 ae d4 5c c1 f0 80 8b e9 0e 00
> 00
> > > 08 48
> > > > > > 89 ef e8 0e c2 5c c1 48 c7 c7 68 60 52 c1 e8 22 23 5d c1 48
> 8b
> > > 43 08
> > > > > > 48 8b 13 <48> 3b 18 0f 85 f5 c7 06 00 48 3b 5a 08 0f 85 eb
> c7
> > > 06 00
> > > > > > 48 89 42
> > > > > > [ 4043.439048] RSP: 0018:ffffa10f4ae43b98 EFLAGS: 00010246
> > > > > > [ 4043.439058] RAX: dead000000000122 RBX: ffff8cf86c160000
> RCX:
> > > > > > 0000000000000000
> > > > > > [ 4043.439065] RDX: dead000000000100 RSI: ffff8cf7b7d16c50
> RDI:
> > > > > > ffffffffc1526068
> > > > > > [ 4043.439072] RBP: ffff8cf86c1604d0 R08: 0000000000000000
> R09:
> > > > > > ffff8cf7401d8e10
> > > > > > [ 4043.439078] R10: ffffa10f4ae43ba0 R11: ffffa10f4ae43ba8
> R12:
> > > > > > ffff8cf86c160000
> > > > > > [ 4043.439085] R13: ffffffffc1416278 R14: ffffffffc1416278
> R15:
> > > > > > ffff8cf7f8d73850
> > > > > > [ 4043.439091] FS:  0000000000000000(0000)
> > > GS:ffff8d0697300000(0000)
> > > > > > knlGS:0000000000000000
> > > > > > [ 4043.439100] CS:  0010 DS: 0000 ES: 0000 CR0:
> > > 0000000080050033
> > > > > > [ 4043.439108] CR2: 00007f98d66dc000 CR3: 0000000131124000
> CR4:
> > > > > > 0000000000f50ef0
> > > > > > [ 4043.439116] PKRU: 55555554
> > > > > > [ 4043.439122] note: kworker/2:0[3698] exited with
> > > preempt_count 1
> > > > > >
> > > > > > So, in summary, it looks as though there are two issues
> here:
> > > > > >
> > > > > > 1. The latest firmware does not seem to work well with this
> > > chipset,
> > > > > >    perhaps it is crashing after loading?
> > > > > > 2. The Oops in the hci_unregister_dev function suggests
> some
> > > HCI
> > > > > >    registration bug.
> > > > > >
> > > > > > Let me know if I can provide any further assistance.
> > > > > >
> > > > > > Regards,
> > > > > >
> > > > > > Marc
> > > > > >
> > > >
> > > > *********** MEDIATEK Confidentiality Notice
> > > >  ***********
> > > > The information contained in this e-mail message (including any
> > > > attachments) may be confidential, proprietary, privileged, or
> > > > otherwise exempt from disclosure under applicable laws. It is
> > > > intended to be conveyed only to the designated recipient(s).
> Any
> > > > use, dissemination, distribution, printing, retaining or
> copying
> > > > of this e-mail (including its attachments) by unintended
> > > recipient(s)
> > > > is strictly prohibited and may be unlawful. If you are not an
> > > > intended recipient of this e-mail, or believe that you have
> > > received
> > > > this e-mail in error, please notify the sender immediately
> > > > (by replying to this e-mail), delete any and all copies of this
> > > > e-mail (including any attachments) from your system, and do not
> > > > disclose the content of this e-mail to any other person. Thank
> you!
> > > 
> > > 
> > > 
> > > -- 
> > > Luiz Augusto von Dentz
> 
> -- 
> Marc Payne

From angelogioacchino.delregno at collabora.com  Fri Sep 20 00:31:24 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Fri, 20 Sep 2024 09:31:24 +0200
Subject: [PATCH v6 2/2] dt-bindings: mfd: mediatek: mt6397: Convert to DT
 schema format
In-Reply-To: <2af0621d-14ac-b7f3-b28d-2df698931121@mediatek.com>
References: <20240918064955.6518-1-macpaul.lin@mediatek.com>
 <20240918064955.6518-2-macpaul.lin@mediatek.com>
 <20240918115151c896f33f@mail.local> <20240918115651c1475d36@mail.local>
 <2af0621d-14ac-b7f3-b28d-2df698931121@mediatek.com>
Message-ID: <d8b90ddf-efbc-4434-9ad0-4be6942d51a5@collabora.com>

Il 18/09/24 16:18, Macpaul Lin ha scritto:
> 
> On 9/18/24 19:56, Alexandre Belloni wrote:
>>
>> On 18/09/2024 13:51:51+0200, Alexandre Belloni wrote:
>>> > Changes for v4:
>>> >? - Remove "mediatek,mt6357" from PMIC's compatible string since there is a
>>> >??? seperated DT schema for PMIC mt6357.
>>> > > Changes for v5:
>>> >? - Rebase to next-20240913 (linux-next/master).
>>> >? - Fix the "title" (device type) of mfd/mediatek,mt6397.yaml to "PMIC".
>>> >? - RTC:
>>> >?? - Drop "start-year"
>>>
>>> Maybe, instead of dropping the property, you should add support in the
>>> driver by setting range_min and range_max.
>>
>> Looking at this even more, the driver can probably be simplified by
>> setting start_year in probe and dropping RTC_MIN_YEAR_OFFSET.
> 
> Thank you for pointing out where and how the driver should be changed.
> However, I'm wondering if this should be a fix with a separated
> patchset (bindings and the driver)? The board or SoC's device trees
> should be reviewed as well. I'll need to get someone's help (permission) inside 
> MediaTek to check those dts and construct the patch for RTC driver.
> That will take sometime.
> 

Alexandre, I definitely agree with you on the fact that the MTK PMIC RTC driver
can (and needs to) be improved, and that it can make use of some nice cleanup...

... but!

This series performs a conversion to schema, and the previous txt file didn't
say anything about the start-year property - which was not mandatory to support
at that time (nor now, afaik?), so adding support for that is out of scope for
this series.

Eventually, that can come as a series on top, adding support for that in the
binding (and, of course, in the driver).

I should be able to tackle that... most probably next week - but still, the
improvements would come as a series on top of this one.

Cheers,
Angelo


From lorenzo at kernel.org  Fri Sep 20 01:26:28 2024
From: lorenzo at kernel.org (Lorenzo Bianconi)
Date: Fri, 20 Sep 2024 10:26:28 +0200
Subject: [PATCH] PCI: mediatek-gen3: Avoid PCIe resetting for Airoha EN7581
 SoC
Message-ID: <20240920-pcie-en7581-rst-fix-v1-1-1043fb63ffc9@kernel.org>

The PCIe controller available on the EN7581 SoC does not support reset
via the following lines:
- PCIE_MAC_RSTB
- PCIE_PHY_RSTB
- PCIE_BRG_RSTB
- PCIE_PE_RSTB

Introduce the reset callback in order to avoid resetting the PCIe port
for Airoha EN7581 SoC.

Tested-by: Hui Ma <hui.ma at airoha.com>
Signed-off-by: Lorenzo Bianconi <lorenzo at kernel.org>
---
 drivers/pci/controller/pcie-mediatek-gen3.c | 44 ++++++++++++++++++-----------
 1 file changed, 28 insertions(+), 16 deletions(-)

diff --git a/drivers/pci/controller/pcie-mediatek-gen3.c b/drivers/pci/controller/pcie-mediatek-gen3.c
index 5c19abac74e8..9cea67e92d98 100644
--- a/drivers/pci/controller/pcie-mediatek-gen3.c
+++ b/drivers/pci/controller/pcie-mediatek-gen3.c
@@ -128,10 +128,12 @@ struct mtk_gen3_pcie;
 /**
  * struct mtk_gen3_pcie_pdata - differentiate between host generations
  * @power_up: pcie power_up callback
+ * @reset: pcie reset callback
  * @phy_resets: phy reset lines SoC data.
  */
 struct mtk_gen3_pcie_pdata {
 	int (*power_up)(struct mtk_gen3_pcie *pcie);
+	void (*reset)(struct mtk_gen3_pcie *pcie);
 	struct {
 		const char *id[MAX_NUM_PHY_RESETS];
 		int num_resets;
@@ -373,6 +375,28 @@ static void mtk_pcie_enable_msi(struct mtk_gen3_pcie *pcie)
 	writel_relaxed(val, pcie->base + PCIE_INT_ENABLE_REG);
 }
 
+static void mtk_pcie_reset(struct mtk_gen3_pcie *pcie)
+{
+	u32 val;
+
+	/* Assert all reset signals */
+	val = readl_relaxed(pcie->base + PCIE_RST_CTRL_REG);
+	val |= PCIE_MAC_RSTB | PCIE_PHY_RSTB | PCIE_BRG_RSTB | PCIE_PE_RSTB;
+	writel_relaxed(val, pcie->base + PCIE_RST_CTRL_REG);
+
+	/*
+	 * Described in PCIe CEM specification sections 2.2 (PERST# Signal)
+	 * and 2.2.1 (Initial Power-Up (G3 to S0)).
+	 * The deassertion of PERST# should be delayed 100ms (TPVPERL)
+	 * for the power and clock to become stable.
+	 */
+	msleep(100);
+
+	/* De-assert reset signals */
+	val &= ~(PCIE_MAC_RSTB | PCIE_PHY_RSTB | PCIE_BRG_RSTB | PCIE_PE_RSTB);
+	writel_relaxed(val, pcie->base + PCIE_RST_CTRL_REG);
+}
+
 static int mtk_pcie_startup_port(struct mtk_gen3_pcie *pcie)
 {
 	struct resource_entry *entry;
@@ -402,22 +426,9 @@ static int mtk_pcie_startup_port(struct mtk_gen3_pcie *pcie)
 	val |= PCIE_DISABLE_DVFSRC_VLT_REQ;
 	writel_relaxed(val, pcie->base + PCIE_MISC_CTRL_REG);
 
-	/* Assert all reset signals */
-	val = readl_relaxed(pcie->base + PCIE_RST_CTRL_REG);
-	val |= PCIE_MAC_RSTB | PCIE_PHY_RSTB | PCIE_BRG_RSTB | PCIE_PE_RSTB;
-	writel_relaxed(val, pcie->base + PCIE_RST_CTRL_REG);
-
-	/*
-	 * Described in PCIe CEM specification sections 2.2 (PERST# Signal)
-	 * and 2.2.1 (Initial Power-Up (G3 to S0)).
-	 * The deassertion of PERST# should be delayed 100ms (TPVPERL)
-	 * for the power and clock to become stable.
-	 */
-	msleep(100);
-
-	/* De-assert reset signals */
-	val &= ~(PCIE_MAC_RSTB | PCIE_PHY_RSTB | PCIE_BRG_RSTB | PCIE_PE_RSTB);
-	writel_relaxed(val, pcie->base + PCIE_RST_CTRL_REG);
+	/* Reset the PCIe port if requested by the hw */
+	if (pcie->soc->reset)
+		pcie->soc->reset(pcie);
 
 	/* Check if the link is up or not */
 	err = readl_poll_timeout(pcie->base + PCIE_LINK_STATUS_REG, val,
@@ -1207,6 +1218,7 @@ static const struct dev_pm_ops mtk_pcie_pm_ops = {
 
 static const struct mtk_gen3_pcie_pdata mtk_pcie_soc_mt8192 = {
 	.power_up = mtk_pcie_power_up,
+	.reset = mtk_pcie_reset,
 	.phy_resets = {
 		.id[0] = "phy",
 		.num_resets = 1,

---
base-commit: f2024903cb387971abdbc6398a430e735a9b394c
change-id: 20240920-pcie-en7581-rst-fix-8161658c13c4

Best regards,
-- 
Lorenzo Bianconi <lorenzo at kernel.org>



From peter.wang at mediatek.com  Fri Sep 20 02:06:39 2024
From: peter.wang at mediatek.com (peter.wang at mediatek.com)
Date: Fri, 20 Sep 2024 17:06:39 +0800
Subject: [PATCH v7 0/4] fix abort defect
Message-ID: <20240920090643.3566-1-peter.wang@mediatek.com>

From: Peter Wang <peter.wang at mediatek.com>

This series fixes MCQ and SDB abort defect.

V7:
 - Use a variable instead of a flag.
 - Add a check for MCQ mode when setting this variable to UFS_ERR_HANDLER.
 - Print OCS information for OCS_ABORTED and OCS_INVALID_COMMAND_STATUS.
 - Add a MediaTek quirk for handling OCS_ABORTED in SDB mode.
 - Skip notifying SCSI from ISR during SCSI abort (ufshcd_abort()).

V6:
 - Add err handler check before set flag true.

V5:
 - Change flag name.
 - Amend comment and patch description.

V4:
 - Remove nullify SQ entry abort requeue.
 - Add more comment for flag usage and set description.
 - Fix build warning.

V3:
 - Change comment and use variable(rtc) for error print
 - Change flag name and move flag set before ufshcd_clear_cmd
 - Add SDB mode clear UTRLCLR tag receive OCS_ABORTED requeue

V2:
 - Fix mcq_enabled build error.

Peter Wang (4):
  ufs: core: fix the issue of ICU failure
  ufs: core: requeue aborted request
  ufs: core: add a quirk for MediaTek SDB mode aborted
  ufs: core: skip ISR notifying scsi when ufshcd_abort

 drivers/ufs/core/ufs-mcq.c      | 21 ++++++----
 drivers/ufs/core/ufshcd.c       | 68 +++++++++++++++++++++++++--------
 drivers/ufs/host/ufs-mediatek.c |  1 +
 include/ufs/ufshcd.h            | 15 ++++++++
 4 files changed, 83 insertions(+), 22 deletions(-)

-- 
2.45.2



From peter.wang at mediatek.com  Fri Sep 20 02:06:41 2024
From: peter.wang at mediatek.com (peter.wang at mediatek.com)
Date: Fri, 20 Sep 2024 17:06:41 +0800
Subject: [PATCH v7 2/4] ufs: core: requeue aborted request
In-Reply-To: <20240920090643.3566-1-peter.wang@mediatek.com>
References: <20240920090643.3566-1-peter.wang@mediatek.com>
Message-ID: <20240920090643.3566-3-peter.wang@mediatek.com>

From: Peter Wang <peter.wang at mediatek.com>

Regarding the specification of MCQ:
Aborts a command using SQ cleanup, The host controller
will post a Completion Queue entry with OCS = ABORTED.

ufshcd_abort_all forcibly aborts all on-going commands.
In MCQ mode, set a variable to notify SCSI to requeue the
command after receiving response with OCS_ABORTED.
This approach would then be consistent with legacy SDB mode.

Below is ufshcd_err_handler legacy SDB flow:
ufshcd_err_handler()
  ufshcd_abort_all()
    ufshcd_abort_one()
      ufshcd_try_to_abort_task()
    ufshcd_complete_requests()
      ufshcd_transfer_req_compl()
        ufshcd_poll()
          get outstanding_lock
          clear outstanding_reqs tag
          release outstanding_lock
          __ufshcd_transfer_req_compl()
            ufshcd_compl_one_cqe()
              cmd->result = DID_REQUEUE
              ufshcd_release_scsi_cmd()
              scsi_done()

ufshcd_intr()
  ufshcd_sl_intr()
    ufshcd_transfer_req_compl()
      ufshcd_poll()
        get outstanding_lock
        clear outstanding_reqs tag
        release outstanding_lock
        __ufshcd_transfer_req_compl()
          ufshcd_compl_one_cqe()
          cmd->result = DID_REQUEUE
          ufshcd_release_scsi_cmd()
          scsi_done();

Below is ufshcd_err_handler MCQ flow:

ufshcd_err_handler()
  ufshcd_abort_all()
    ufshcd_abort_one()
      ufshcd_try_to_abort_task()
    ufshcd_complete_requests()
      ufshcd_mcq_compl_pending_transfer()
        ufshcd_mcq_poll_cqe_lock()
          ufshcd_mcq_process_cqe()
            ufshcd_compl_one_cqe()
              cmd->result = DID_ABORT // should change to DID_REQUEUE
              ufshcd_release_scsi_cmd()
              scsi_done()

ufs_mtk_mcq_intr()
  ufshcd_mcq_poll_cqe_lock()
    ufshcd_mcq_process_cqe()
      ufshcd_compl_one_cqe()
        cmd->result = DID_ABORT  // should change to DID_REQUEUE
        ufshcd_release_scsi_cmd()
        scsi_done()

So what we need to correct is to notify SCSI to requeue
when MCQ mode receives OCS: ABORTED.

Fixes: ab248643d3d6 ("scsi: ufs: core: Add error handling for MCQ mode")
Cc: stable at vger.kernel.org
Signed-off-by: Peter Wang <peter.wang at mediatek.com>
---
 drivers/ufs/core/ufshcd.c | 40 ++++++++++++++++++++++++---------------
 include/ufs/ufshcd.h      |  8 ++++++++
 2 files changed, 33 insertions(+), 15 deletions(-)

diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
index a6f818cdef0e..4f9c7a632465 100644
--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -3006,6 +3006,7 @@ static int ufshcd_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd)
 	ufshcd_prepare_lrbp_crypto(scsi_cmd_to_rq(cmd), lrbp);
 
 	lrbp->req_abort_skip = false;
+	lrbp->abort_initiated_by = UFS_NO_ABORT;
 
 	ufshcd_comp_scsi_upiu(hba, lrbp);
 
@@ -5404,10 +5405,19 @@ ufshcd_transfer_rsp_status(struct ufs_hba *hba, struct ufshcd_lrb *lrbp,
 		}
 		break;
 	case OCS_ABORTED:
-		result |= DID_ABORT << 16;
+		if (lrbp->abort_initiated_by == UFS_ERR_HANDLER)
+			result |= DID_REQUEUE << 16;
+		else
+			result |= DID_ABORT << 16;
+		dev_warn(hba->dev,
+				"OCS aborted from controller = %x for tag %d\n",
+				ocs, lrbp->task_tag);
 		break;
 	case OCS_INVALID_COMMAND_STATUS:
 		result |= DID_REQUEUE << 16;
+		dev_warn(hba->dev,
+				"OCS invaild from controller = %x for tag %d\n",
+				ocs, lrbp->task_tag);
 		break;
 	case OCS_INVALID_CMD_TABLE_ATTR:
 	case OCS_INVALID_PRDT_ATTR:
@@ -6471,26 +6481,12 @@ static bool ufshcd_abort_one(struct request *rq, void *priv)
 	struct scsi_device *sdev = cmd->device;
 	struct Scsi_Host *shost = sdev->host;
 	struct ufs_hba *hba = shost_priv(shost);
-	struct ufshcd_lrb *lrbp = &hba->lrb[tag];
-	struct ufs_hw_queue *hwq;
-	unsigned long flags;
 
 	*ret = ufshcd_try_to_abort_task(hba, tag);
 	dev_err(hba->dev, "Aborting tag %d / CDB %#02x %s\n", tag,
 		hba->lrb[tag].cmd ? hba->lrb[tag].cmd->cmnd[0] : -1,
 		*ret ? "failed" : "succeeded");
 
-	/* Release cmd in MCQ mode if abort succeeds */
-	if (hba->mcq_enabled && (*ret == 0)) {
-		hwq = ufshcd_mcq_req_to_hwq(hba, scsi_cmd_to_rq(lrbp->cmd));
-		if (!hwq)
-			return 0;
-		spin_lock_irqsave(&hwq->cq_lock, flags);
-		if (ufshcd_cmd_inflight(lrbp->cmd))
-			ufshcd_release_scsi_cmd(hba, lrbp);
-		spin_unlock_irqrestore(&hwq->cq_lock, flags);
-	}
-
 	return *ret == 0;
 }
 
@@ -7561,6 +7557,20 @@ int ufshcd_try_to_abort_task(struct ufs_hba *hba, int tag)
 		goto out;
 	}
 
+	/*
+	 * When the host software receives a "FUNCTION COMPLETE", set this
+	 * variable to requeue command after receive response with OCS_ABORTED
+	 *
+	 * MCQ mode: Host will post to CQ with OCS_ABORTED after SQ cleanup
+	 *
+	 * This variable is set because error handler ufshcd_abort_all forcibly
+	 * aborts all commands, and the host controller will automatically
+	 * fill in the OCS field of the corresponding response with OCS_ABORTED.
+	 * Therefore, upon receiving this response, it needs to be requeued.
+	 */
+	if (!err && hba->mcq_enabled && ufshcd_eh_in_progress(hba))
+		lrbp->abort_initiated_by = UFS_ERR_HANDLER;
+
 	err = ufshcd_clear_cmd(hba, tag);
 	if (err)
 		dev_err(hba->dev, "%s: Failed clearing cmd at tag %d, err %d\n",
diff --git a/include/ufs/ufshcd.h b/include/ufs/ufshcd.h
index 0fd2aebac728..61a7dc489511 100644
--- a/include/ufs/ufshcd.h
+++ b/include/ufs/ufshcd.h
@@ -145,6 +145,11 @@ enum ufs_pm_level {
 	UFS_PM_LVL_MAX
 };
 
+enum ufs_abort_by {
+	UFS_NO_ABORT,
+	UFS_ERR_HANDLER,
+};
+
 struct ufs_pm_lvl_states {
 	enum ufs_dev_pwr_mode dev_state;
 	enum uic_link_state link_state;
@@ -173,6 +178,8 @@ struct ufs_pm_lvl_states {
  * @crypto_key_slot: the key slot to use for inline crypto (-1 if none)
  * @data_unit_num: the data unit number for the first block for inline crypto
  * @req_abort_skip: skip request abort task flag
+ * @abort_initiated_by: This variable is used to store the scenario in
+ *                      which the abort occurs
  */
 struct ufshcd_lrb {
 	struct utp_transfer_req_desc *utr_descriptor_ptr;
@@ -202,6 +209,7 @@ struct ufshcd_lrb {
 #endif
 
 	bool req_abort_skip;
+	int abort_initiated_by;
 };
 
 /**
-- 
2.45.2



From peter.wang at mediatek.com  Fri Sep 20 02:06:42 2024
From: peter.wang at mediatek.com (peter.wang at mediatek.com)
Date: Fri, 20 Sep 2024 17:06:42 +0800
Subject: [PATCH v7 3/4] ufs: core: add a quirk for MediaTek SDB mode aborted
In-Reply-To: <20240920090643.3566-1-peter.wang@mediatek.com>
References: <20240920090643.3566-1-peter.wang@mediatek.com>
Message-ID: <20240920090643.3566-4-peter.wang@mediatek.com>

From: Peter Wang <peter.wang at mediatek.com>

Because the MediaTek UFS controller uses UTRLCLR to clear commands
and fills the OCS with ABORTED, this patch introduces a quirk to
treat ABORTED as INVALID_OCS_VALUE.

Signed-off-by: Peter Wang <peter.wang at mediatek.com>
---
 drivers/ufs/core/ufshcd.c       | 3 ++-
 drivers/ufs/host/ufs-mediatek.c | 1 +
 include/ufs/ufshcd.h            | 6 ++++++
 3 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
index 4f9c7a632465..b34125238a70 100644
--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -5405,7 +5405,8 @@ ufshcd_transfer_rsp_status(struct ufs_hba *hba, struct ufshcd_lrb *lrbp,
 		}
 		break;
 	case OCS_ABORTED:
-		if (lrbp->abort_initiated_by == UFS_ERR_HANDLER)
+		if ((lrbp->abort_initiated_by == UFS_ERR_HANDLER) ||
+		    (!hba->mcq_enabled && (hba->quirks & UFSHCD_QUIRK_OCS_ABORTED)))
 			result |= DID_REQUEUE << 16;
 		else
 			result |= DID_ABORT << 16;
diff --git a/drivers/ufs/host/ufs-mediatek.c b/drivers/ufs/host/ufs-mediatek.c
index 02c9064284e1..8a4c1b8f5a26 100644
--- a/drivers/ufs/host/ufs-mediatek.c
+++ b/drivers/ufs/host/ufs-mediatek.c
@@ -1021,6 +1021,7 @@ static int ufs_mtk_init(struct ufs_hba *hba)
 	hba->quirks |= UFSHCI_QUIRK_SKIP_MANUAL_WB_FLUSH_CTRL;
 	hba->quirks |= UFSHCD_QUIRK_MCQ_BROKEN_INTR;
 	hba->quirks |= UFSHCD_QUIRK_MCQ_BROKEN_RTC;
+	hba->quirks |= UFSHCD_QUIRK_OCS_ABORTED;
 	hba->vps->wb_flush_threshold = UFS_WB_BUF_REMAIN_PERCENT(80);
 
 	if (host->caps & UFS_MTK_CAP_DISABLE_AH8)
diff --git a/include/ufs/ufshcd.h b/include/ufs/ufshcd.h
index 61a7dc489511..4d17a13ac558 100644
--- a/include/ufs/ufshcd.h
+++ b/include/ufs/ufshcd.h
@@ -692,6 +692,12 @@ enum ufshcd_quirks {
 	 * single doorbell mode.
 	 */
 	UFSHCD_QUIRK_BROKEN_LSDBS_CAP			= 1 << 25,
+
+	/*
+	 * Some host controllers set OCS_ABORTED after UTRLCLR (SDB mode),
+	 * this quirk is set to treat OCS: ABORTED as INVALID_OCS_VALUE
+	 */
+	UFSHCD_QUIRK_OCS_ABORTED			= 1 << 26,
 };
 
 enum ufshcd_caps {
-- 
2.45.2



From peter.wang at mediatek.com  Fri Sep 20 02:06:40 2024
From: peter.wang at mediatek.com (peter.wang at mediatek.com)
Date: Fri, 20 Sep 2024 17:06:40 +0800
Subject: [PATCH v7 1/4] ufs: core: fix the issue of ICU failure
In-Reply-To: <20240920090643.3566-1-peter.wang@mediatek.com>
References: <20240920090643.3566-1-peter.wang@mediatek.com>
Message-ID: <20240920090643.3566-2-peter.wang@mediatek.com>

From: Peter Wang <peter.wang at mediatek.com>

When setting the ICU bit without using read-modify-write,
SQRTCy will restart SQ again and receive an RTC return
error code 2 (Failure - SQ not stopped).

Additionally, the error log has been modified so that
this type of error can be observed.

Fixes: ab248643d3d6 ("scsi: ufs: core: Add error handling for MCQ mode")
Cc: stable at vger.kernel.org
Signed-off-by: Peter Wang <peter.wang at mediatek.com>
Reviewed-by: Bao D. Nguyen <quic_nguyenb at quicinc.com>
Reviewed-by: Bart Van Assche <bvanassche at acm.org>
---
 drivers/ufs/core/ufs-mcq.c | 15 ++++++++-------
 1 file changed, 8 insertions(+), 7 deletions(-)

diff --git a/drivers/ufs/core/ufs-mcq.c b/drivers/ufs/core/ufs-mcq.c
index 5891cdacd0b3..3903947dbed1 100644
--- a/drivers/ufs/core/ufs-mcq.c
+++ b/drivers/ufs/core/ufs-mcq.c
@@ -539,7 +539,7 @@ int ufshcd_mcq_sq_cleanup(struct ufs_hba *hba, int task_tag)
 	struct scsi_cmnd *cmd = lrbp->cmd;
 	struct ufs_hw_queue *hwq;
 	void __iomem *reg, *opr_sqd_base;
-	u32 nexus, id, val;
+	u32 nexus, id, val, rtc;
 	int err;
 
 	if (hba->quirks & UFSHCD_QUIRK_MCQ_BROKEN_RTC)
@@ -569,17 +569,18 @@ int ufshcd_mcq_sq_cleanup(struct ufs_hba *hba, int task_tag)
 	opr_sqd_base = mcq_opr_base(hba, OPR_SQD, id);
 	writel(nexus, opr_sqd_base + REG_SQCTI);
 
-	/* SQRTCy.ICU = 1 */
-	writel(SQ_ICU, opr_sqd_base + REG_SQRTC);
+	/* Initiate Cleanup */
+	writel(readl(opr_sqd_base + REG_SQRTC) | SQ_ICU,
+		opr_sqd_base + REG_SQRTC);
 
 	/* Poll SQRTSy.CUS = 1. Return result from SQRTSy.RTC */
 	reg = opr_sqd_base + REG_SQRTS;
 	err = read_poll_timeout(readl, val, val & SQ_CUS, 20,
 				MCQ_POLL_US, false, reg);
-	if (err)
-		dev_err(hba->dev, "%s: failed. hwq=%d, tag=%d err=%ld\n",
-			__func__, id, task_tag,
-			FIELD_GET(SQ_ICU_ERR_CODE_MASK, readl(reg)));
+	rtc = FIELD_GET(SQ_ICU_ERR_CODE_MASK, readl(reg));
+	if (err || rtc)
+		dev_err(hba->dev, "%s: failed. hwq=%d, tag=%d err=%d RTC=%d\n",
+			__func__, id, task_tag, err, rtc);
 
 	if (ufshcd_mcq_sq_start(hba, hwq))
 		err = -ETIMEDOUT;
-- 
2.45.2



From peter.wang at mediatek.com  Fri Sep 20 02:06:43 2024
From: peter.wang at mediatek.com (peter.wang at mediatek.com)
Date: Fri, 20 Sep 2024 17:06:43 +0800
Subject: [PATCH v7 4/4] ufs: core: skip ISR notifying scsi when ufshcd_abort
In-Reply-To: <20240920090643.3566-1-peter.wang@mediatek.com>
References: <20240920090643.3566-1-peter.wang@mediatek.com>
Message-ID: <20240920090643.3566-5-peter.wang@mediatek.com>

From: Peter Wang <peter.wang at mediatek.com>

When a SCSI abort occurs, ufshcd_try_to_abort_task may trigger
the ISR, and the ISR may release the command and notify SCSI
via scsi_done. This patch prevents the ISR from notifying
SCSI to requeue, allowing SCSI to decide whether to requeue.

Below is ufshcd_abort legacy SDB flow:

ufshcd_abort()
  ufshcd_try_to_abort_task() // will trigger ISR
  get outstanding_lock
  clear outstanding_reqs tag
  ufshcd_release_scsi_cmd()
  release outstanding_lock

ufshcd_intr()
  ufshcd_sl_intr()
    ufshcd_transfer_req_compl()
      ufshcd_poll()
        get outstanding_lock
        clear outstanding_reqs tag
        release outstanding_lock
        __ufshcd_transfer_req_compl()
          ufshcd_compl_one_cqe()
          cmd->result = DID_REQUEUE
          ufshcd_release_scsi_cmd()
          scsi_done();

In most cases, ufshcd_intr will not reach scsi_done because the
outstanding_reqs tag is cleared by the original thread.
Therefore, whether there is an interrupt or not doesn't affect
the result because the ISR will do nothing in most cases.

In a very low chance, the ISR will reach scsi_done and notify
SCSI to requeue, and the original thread will not
call ufshcd_release_scsi_cmd. So should release because
outstanding_reqs is clear by ISR.

Below is ufshcd_abort MCQ flow:

ufshcd_abort()
  ufshcd_mcq_abort()
    ufshcd_try_to_abort_task()	// will trigger ISR
    ufshcd_release_scsi_cmd()

ufs_mtk_mcq_intr()
  ufshcd_mcq_poll_cqe_lock()
    ufshcd_mcq_process_cqe()
      ufshcd_compl_one_cqe()
        cmd->result = DID_ABORT
        ufshcd_release_scsi_cmd() // will release twice
        scsi_done()

In the case of MCQ ufshcd_abort, there is an issue where
ufshcd_release_scsi_cmd might be called twice. We could simply
skip the ISR release and scsi_done.

Signed-off-by: Peter Wang <peter.wang at mediatek.com>
---
 drivers/ufs/core/ufs-mcq.c |  6 ++++++
 drivers/ufs/core/ufshcd.c  | 27 +++++++++++++++++++++++++++
 include/ufs/ufshcd.h       |  1 +
 3 files changed, 34 insertions(+)

diff --git a/drivers/ufs/core/ufs-mcq.c b/drivers/ufs/core/ufs-mcq.c
index 3903947dbed1..73d7cf337e2f 100644
--- a/drivers/ufs/core/ufs-mcq.c
+++ b/drivers/ufs/core/ufs-mcq.c
@@ -699,6 +699,12 @@ int ufshcd_mcq_abort(struct scsi_cmnd *cmd)
 		return FAILED;
 	}
 
+	/*
+	 * In MCQ mode, set this variable so that the ISR posted by
+	 * the host controller can be skipped.
+	 */
+	lrbp->abort_initiated_by = UFS_SCSI_ABORT;
+
 	/*
 	 * The command is not in the submission queue, and it is not
 	 * in the completion queue either. Query the device to see if
diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
index b34125238a70..21091b11b4ba 100644
--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -5537,6 +5537,27 @@ void ufshcd_compl_one_cqe(struct ufs_hba *hba, int task_tag,
 			ufshcd_update_monitor(hba, lrbp);
 		ufshcd_add_command_trace(hba, task_tag, UFS_CMD_COMP);
 		cmd->result = ufshcd_transfer_rsp_status(hba, lrbp, cqe);
+
+		/*
+		 * Let the SCSI layer decide how to handle the ufshcd_abort
+		 * situation, neither releasing nor notifying scsi_done in MCQ
+		 * mode. SDB mode should release because outstanding_reqs is
+		 * clear by ISR.
+		 */
+		if (lrbp->abort_initiated_by == UFS_SCSI_ABORT) {
+			ocs = ufshcd_get_tr_ocs(lrbp, cqe);
+			if ((hba->mcq_enabled) && (ocs == OCS_ABORTED))
+				 return;
+
+			if ((!hba->mcq_enabled) &&
+			    ((ocs == OCS_INVALID_COMMAND_STATUS) ||
+			     ((hba->quirks & UFSHCD_QUIRK_OCS_ABORTED) &&
+			      (ocs == OCS_ABORTED)))) {
+				ufshcd_release_scsi_cmd(hba, lrbp);
+				return;
+			}
+		}
+
 		ufshcd_release_scsi_cmd(hba, lrbp);
 		/* Do not touch lrbp after scsi done */
 		scsi_done(cmd);
@@ -7673,6 +7694,12 @@ static int ufshcd_abort(struct scsi_cmnd *cmd)
 		goto release;
 	}
 
+	/*
+	 * In SDB mode, set this variable so that the ISR posted by
+	 * the host controller clear UTRLCLR can be skipped.
+	 */
+	lrbp->abort_initiated_by = UFS_SCSI_ABORT;
+
 	err = ufshcd_try_to_abort_task(hba, tag);
 	if (err) {
 		dev_err(hba->dev, "%s: failed with err %d\n", __func__, err);
diff --git a/include/ufs/ufshcd.h b/include/ufs/ufshcd.h
index 4d17a13ac558..4785a45040eb 100644
--- a/include/ufs/ufshcd.h
+++ b/include/ufs/ufshcd.h
@@ -148,6 +148,7 @@ enum ufs_pm_level {
 enum ufs_abort_by {
 	UFS_NO_ABORT,
 	UFS_ERR_HANDLER,
+	UFS_SCSI_ABORT
 };
 
 struct ufs_pm_lvl_states {
-- 
2.45.2



From mark-pk.tsai at mediatek.com  Fri Sep 20 02:16:51 2024
From: mark-pk.tsai at mediatek.com (Mark-PK Tsai)
Date: Fri, 20 Sep 2024 17:16:51 +0800
Subject: [PATCH] remoteproc: virtio: Add synchronize_cbs to remoteproc_virtio
Message-ID: <20240920091659.3933-1-mark-pk.tsai@mediatek.com>

Add synchornize_cbs to rproc_virtio_config_ops and a
synchronize_vqs callback to the rproc_ops to ensure vqs'
state changes are visible in vring_interrupts when the vq is
broken or removed.

And when VIRTIO_HARDEN_NOTIFICATION is not set, call
rproc_virtio_synchronize_cbs directly in __rproc_virtio_del_vqs
before virtqueue is free to ensure that rproc_vq_interrupt is
aware of the virtqueue removal.

The synchronized_vqs is expected to be implemented in rproc
driver to ensure that all previous vring_interrupts are handled
before the vqs are marked as broken or removed.

Signed-off-by: Mark-PK Tsai <mark-pk.tsai at mediatek.com>
---
 drivers/remoteproc/remoteproc_virtio.c | 12 ++++++++++++
 include/linux/remoteproc.h             |  4 ++++
 2 files changed, 16 insertions(+)

diff --git a/drivers/remoteproc/remoteproc_virtio.c b/drivers/remoteproc/remoteproc_virtio.c
index d3f39009b28e..e18258b69851 100644
--- a/drivers/remoteproc/remoteproc_virtio.c
+++ b/drivers/remoteproc/remoteproc_virtio.c
@@ -74,6 +74,14 @@ static bool rproc_virtio_notify(struct virtqueue *vq)
 	return true;
 }
 
+static void rproc_virtio_synchronize_cbs(struct virtio_device *vdev)
+{
+	struct rproc *rproc = vdev_to_rproc(vdev);
+
+	if (rproc->ops->synchronize_vqs)
+		rproc->ops->synchronize_vqs(rproc);
+}
+
 /**
  * rproc_vq_interrupt() - tell remoteproc that a virtqueue is interrupted
  * @rproc: handle to the remote processor
@@ -171,6 +179,9 @@ static void __rproc_virtio_del_vqs(struct virtio_device *vdev)
 	list_for_each_entry_safe(vq, n, &vdev->vqs, list) {
 		rvring = vq->priv;
 		rvring->vq = NULL;
+#ifndef CONFIG_VIRTIO_HARDEN_NOTIFICATION
+		rproc_virtio_synchronize_cbs(vdev);
+#endif
 		vring_del_virtqueue(vq);
 	}
 }
@@ -334,6 +345,7 @@ static const struct virtio_config_ops rproc_virtio_config_ops = {
 	.get_status	= rproc_virtio_get_status,
 	.get		= rproc_virtio_get,
 	.set		= rproc_virtio_set,
+	.synchronize_cbs = rproc_virtio_synchronize_cbs,
 };
 
 /*
diff --git a/include/linux/remoteproc.h b/include/linux/remoteproc.h
index b4795698d8c2..73901678ac7d 100644
--- a/include/linux/remoteproc.h
+++ b/include/linux/remoteproc.h
@@ -381,6 +381,9 @@ enum rsc_handling_status {
  * @panic:	optional callback to react to system panic, core will delay
  *		panic at least the returned number of milliseconds
  * @coredump:	  collect firmware dump after the subsystem is shutdown
+ * @synchronize_vqs:	optional callback to guarantee all memory operations
+ *			on the virtqueue before it are visible to the
+ *			rproc_vq_interrupt().
  */
 struct rproc_ops {
 	int (*prepare)(struct rproc *rproc);
@@ -403,6 +406,7 @@ struct rproc_ops {
 	u64 (*get_boot_addr)(struct rproc *rproc, const struct firmware *fw);
 	unsigned long (*panic)(struct rproc *rproc);
 	void (*coredump)(struct rproc *rproc);
+	void (*synchronize_vqs)(struct rproc *rproc);
 };
 
 /**
-- 
2.45.2



From mosekitumisang2 at gmail.com  Fri Sep 20 04:50:27 2024
From: mosekitumisang2 at gmail.com (Michelle Fangman)
Date: Fri, 20 Sep 2024 07:50:27 -0400
Subject: Baby Grand Piano  09/20
Message-ID: <abe50e1102d87b4ea45843792d836c0ed4dd7789c369c5589dcf1e6be5b17f70@mx.google.com>

Hello,

I'm offering my late husband's Yamaha Piano to any music enthusiast who may appreciate it. If you or someone you know might be interested in receiving this instrument for free, please feel free to reach out to me.

Warm regards,
Michelle 


From broonie at kernel.org  Fri Sep 20 05:08:53 2024
From: broonie at kernel.org (Mark Brown)
Date: Fri, 20 Sep 2024 14:08:53 +0200
Subject: [PATCH v6 1/2] regulator: dt-bindings: mt6323: Convert to DT
 schema
In-Reply-To: <20240918064955.6518-1-macpaul.lin@mediatek.com>
References: <20240918064955.6518-1-macpaul.lin@mediatek.com>
Message-ID: <Zu1l1Tx7OeJ_Sw9z@finisterre.sirena.org.uk>

On Wed, Sep 18, 2024 at 02:49:54PM +0800, Macpaul Lin wrote:
> Convert the MT6323 regulator binding from the old text-based format to
> the new DT schema style. The property "regulator-name" has been added
> as required property to reflect current usage in mt6323.dtsi.

Acked-by: Mark Brown <broonie at kernel.org>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-mediatek/attachments/20240920/1bb87a39/attachment.sig>

From krzk at kernel.org  Fri Sep 20 06:07:49 2024
From: krzk at kernel.org (Krzysztof Kozlowski)
Date: Fri, 20 Sep 2024 15:07:49 +0200
Subject: [PATCH v6 2/2] dt-bindings: mfd: mediatek: mt6397: Convert to DT
 schema format
In-Reply-To: <20240918064955.6518-2-macpaul.lin@mediatek.com>
References: <20240918064955.6518-1-macpaul.lin@mediatek.com>
 <20240918064955.6518-2-macpaul.lin@mediatek.com>
Message-ID: <0b6c3217-5156-4c4f-8aaa-0b1cecce1818@kernel.org>

On 18/09/2024 08:49, Macpaul Lin wrote:
> Convert the mfd: mediatek: mt6397 binding to DT schema format.
> 
> MT6323, MT6358, and MT6397 are PMIC devices with multiple function
> subdevices. They share a common PMIC design but have variations in
> subdevice combinations.
> 
> Key updates in this conversion:


Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski at linaro.org>

Best regards,
Krzysztof



From alexandre.belloni at bootlin.com  Fri Sep 20 06:37:50 2024
From: alexandre.belloni at bootlin.com (Alexandre Belloni)
Date: Fri, 20 Sep 2024 15:37:50 +0200
Subject: [PATCH v6 2/2] dt-bindings: mfd: mediatek: mt6397: Convert to DT
 schema format
In-Reply-To: <d8b90ddf-efbc-4434-9ad0-4be6942d51a5@collabora.com>
References: <20240918064955.6518-1-macpaul.lin@mediatek.com>
 <20240918064955.6518-2-macpaul.lin@mediatek.com>
 <20240918115151c896f33f@mail.local>
 <20240918115651c1475d36@mail.local>
 <2af0621d-14ac-b7f3-b28d-2df698931121@mediatek.com>
 <d8b90ddf-efbc-4434-9ad0-4be6942d51a5@collabora.com>
Message-ID: <202409201337500284902d@mail.local>

On 20/09/2024 09:31:24+0200, AngeloGioacchino Del Regno wrote:
> Il 18/09/24 16:18, Macpaul Lin ha scritto:
> > 
> > On 9/18/24 19:56, Alexandre Belloni wrote:
> > > 
> > > On 18/09/2024 13:51:51+0200, Alexandre Belloni wrote:
> > > > > Changes for v4:
> > > > >? - Remove "mediatek,mt6357" from PMIC's compatible string since there is a
> > > > >??? seperated DT schema for PMIC mt6357.
> > > > > > Changes for v5:
> > > > >? - Rebase to next-20240913 (linux-next/master).
> > > > >? - Fix the "title" (device type) of mfd/mediatek,mt6397.yaml to "PMIC".
> > > > >? - RTC:
> > > > >?? - Drop "start-year"
> > > > 
> > > > Maybe, instead of dropping the property, you should add support in the
> > > > driver by setting range_min and range_max.
> > > 
> > > Looking at this even more, the driver can probably be simplified by
> > > setting start_year in probe and dropping RTC_MIN_YEAR_OFFSET.
> > 
> > Thank you for pointing out where and how the driver should be changed.
> > However, I'm wondering if this should be a fix with a separated
> > patchset (bindings and the driver)? The board or SoC's device trees
> > should be reviewed as well. I'll need to get someone's help (permission)
> > inside MediaTek to check those dts and construct the patch for RTC
> > driver.
> > That will take sometime.
> > 
> 
> Alexandre, I definitely agree with you on the fact that the MTK PMIC RTC driver
> can (and needs to) be improved, and that it can make use of some nice cleanup...
> 
> ... but!
> 
> This series performs a conversion to schema, and the previous txt file didn't
> say anything about the start-year property - which was not mandatory to support
> at that time (nor now, afaik?), so adding support for that is out of scope for
> this series.

It is mandatory now. I agree this can be done in a subsequent series.

> 
> Eventually, that can come as a series on top, adding support for that in the
> binding (and, of course, in the driver).
> 
> I should be able to tackle that... most probably next week - but still, the
> improvements would come as a series on top of this one.
> 
> Cheers,
> Angelo

-- 
Alexandre Belloni, co-owner and COO, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com


From pablo.sun at mediatek.com  Fri Sep 20 06:41:06 2024
From: pablo.sun at mediatek.com (Pablo Sun)
Date: Fri, 20 Sep 2024 21:41:06 +0800
Subject: [PATCH 0/5] Enable Mali GPU on MediaTek Genio 700 EVK
Message-ID: <20240920134111.19744-1-pablo.sun@mediatek.com>

This series is based on linux-next, tag: next-20240920

Update efuse and clock settings for mt8188, and enable the GPU
on mt8390-genio-700-evk.dts. The panfrost driver probed with dmesg:

panfrost 13000000.gpu: clock rate = 390000000
panfrost 13000000.gpu: mali-g57 id 0x9093 major 0x0 minor 0x0 status 0x0
panfrost 13000000.gpu: features: 00000000,000019f7,
	 issues: 00000003,80000400
panfrost 13000000.gpu: Features: L2:0x08130206 Shader:0x00000000
         Tiler:0x00000809 Mem:0x1 MMU:0x00002830 AS:0xff JS:0x7
panfrost 13000000.gpu: shader_present=0x10005 l2_present=0x1
[drm] Initialized panfrost 1.2.0 for 13000000.gpu on minor 0

Pablo Sun (5):
  arm64: dts: mediatek: mt8188: Fix wrong clock provider in MFG1 power
    domain
  clk: mediatek: clk-mt8188-topckgen: Remove univpll from parents of
    mfg_core_tmp
  nvmem: mtk-efuse: Enable postprocess for mt8188 GPU speed binning
  arm64: dts: mediatek: mt8188: Add efuse for GPU speed binning
  arm64: dts: mediatek: mt8390-genio-700-evk: Enable Mali GPU

 arch/arm64/boot/dts/mediatek/mt8188.dtsi      | 11 +++++++--
 .../dts/mediatek/mt8390-genio-700-evk.dts     | 24 +++++++++++++++++++
 drivers/clk/mediatek/clk-mt8188-topckgen.c    |  7 ++++--
 drivers/nvmem/mtk-efuse.c                     |  5 ++++
 4 files changed, 43 insertions(+), 4 deletions(-)

-- 
2.45.2



From pablo.sun at mediatek.com  Fri Sep 20 06:41:08 2024
From: pablo.sun at mediatek.com (Pablo Sun)
Date: Fri, 20 Sep 2024 21:41:08 +0800
Subject: [PATCH 2/5] clk: mediatek: clk-mt8188-topckgen: Remove univpll from parents of mfg_core_tmp
In-Reply-To: <20240920134111.19744-1-pablo.sun@mediatek.com>
References: <20240920134111.19744-1-pablo.sun@mediatek.com>
Message-ID: <20240920134111.19744-3-pablo.sun@mediatek.com>

Same as MT8195, MT8188 GPU clock is primarly supplied by the dedicated
mfgpll. The clock "mfg_core_tmp" is only used as an alt clock when
setting mfgpll clock rate.

If we keep the univpll parents from mfg_core_tmp, when setting
GPU frequency to 390000000, the common clock framework would switch
the parent to univpll, instead of setting mfgpll to 390000000:

    mfgpll                            0        0        0   949999756
    univpll                           2        2        0  2340000000
       univpll_d6                     1        1        0   390000000
          top_mfg_core_tmp            1        1        0   390000000
             mfg_ck_fast_ref          1        1        0   390000000
                mfgcfg_bg3d           1        1        0   390000000

This results in failures when subsequent devfreq operations need to
switch to other frequencies. So remove univpll from the parent list.

This solution is taken from commit 72d38ed720e9 ("clk: mediatek:
clk-mt8195-topckgen: Drop univplls from mfg mux parents")

Signed-off-by: Pablo Sun <pablo.sun at mediatek.com>
---
 drivers/clk/mediatek/clk-mt8188-topckgen.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/drivers/clk/mediatek/clk-mt8188-topckgen.c b/drivers/clk/mediatek/clk-mt8188-topckgen.c
index 2ccc8a1c98f9..74ee692ac613 100644
--- a/drivers/clk/mediatek/clk-mt8188-topckgen.c
+++ b/drivers/clk/mediatek/clk-mt8188-topckgen.c
@@ -342,11 +342,14 @@ static const char * const dsp7_parents[] = {
 	"univpll_d3"
 };
 
+/*
+ * MFG can be also parented to "univpll_d6" and "univpll_d7":
+ * these have been removed from the parents list to let us
+ * achieve GPU DVFS without any special clock handlers.
+ */
 static const char * const mfg_core_tmp_parents[] = {
 	"clk26m",
 	"mainpll_d5_d2",
-	"univpll_d6",
-	"univpll_d7"
 };
 
 static const char * const camtg_parents[] = {
-- 
2.45.2



From pablo.sun at mediatek.com  Fri Sep 20 06:41:07 2024
From: pablo.sun at mediatek.com (Pablo Sun)
Date: Fri, 20 Sep 2024 21:41:07 +0800
Subject: [PATCH 1/5] arm64: dts: mediatek: mt8188: Fix wrong clock provider in MFG1 power domain
In-Reply-To: <20240920134111.19744-1-pablo.sun@mediatek.com>
References: <20240920134111.19744-1-pablo.sun@mediatek.com>
Message-ID: <20240920134111.19744-2-pablo.sun@mediatek.com>

The clock index "CLK_APMIXED_MFGPLL" belongs to the "apmixedsys" provider,
so fix the index.

In addition, add a "mfg1" label so following commits could set
domain-supply for MFG1 power domain.

Fixes: b8369604050b ("UPSTREAM: arm64: dts: mediatek: mt8188: Add support for SoC power domains")
Signed-off-by: Pablo Sun <pablo.sun at mediatek.com>
---
 arch/arm64/boot/dts/mediatek/mt8188.dtsi | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/arch/arm64/boot/dts/mediatek/mt8188.dtsi b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
index cd27966d2e3c..02a5bb4dbd1f 100644
--- a/arch/arm64/boot/dts/mediatek/mt8188.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
@@ -956,9 +956,9 @@ mfg0: power-domain at MT8188_POWER_DOMAIN_MFG0 {
 					#size-cells = <0>;
 					#power-domain-cells = <1>;
 
-					power-domain at MT8188_POWER_DOMAIN_MFG1 {
+					mfg1: power-domain at MT8188_POWER_DOMAIN_MFG1 {
 						reg = <MT8188_POWER_DOMAIN_MFG1>;
-						clocks = <&topckgen CLK_APMIXED_MFGPLL>,
+						clocks = <&apmixedsys CLK_APMIXED_MFGPLL>,
 							 <&topckgen CLK_TOP_MFG_CORE_TMP>;
 						clock-names = "mfg", "alt";
 						mediatek,infracfg = <&infracfg_ao>;
-- 
2.45.2



From pablo.sun at mediatek.com  Fri Sep 20 06:41:10 2024
From: pablo.sun at mediatek.com (Pablo Sun)
Date: Fri, 20 Sep 2024 21:41:10 +0800
Subject: [PATCH 4/5] arm64: dts: mediatek: mt8188: Add efuse for GPU speed binning
In-Reply-To: <20240920134111.19744-1-pablo.sun@mediatek.com>
References: <20240920134111.19744-1-pablo.sun@mediatek.com>
Message-ID: <20240920134111.19744-5-pablo.sun@mediatek.com>

The OPP table of mt8188 GPU contains duplicated frequencies
for different speed bins.

In order to support OPP table, we need to provide the speed bin info
in the efuse data so the GPU driver could properly set the
supported hardware speed bin.

Signed-off-by: Pablo Sun <pablo.sun at mediatek.com>
---
 arch/arm64/boot/dts/mediatek/mt8188.dtsi | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/arch/arm64/boot/dts/mediatek/mt8188.dtsi b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
index 02a5bb4dbd1f..129edaf33704 100644
--- a/arch/arm64/boot/dts/mediatek/mt8188.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
@@ -1752,6 +1752,11 @@ efuse: efuse at 11f20000 {
 			lvts_efuse_data1: lvts1-calib at 1ac {
 				reg = <0x1ac 0x40>;
 			};
+
+			gpu_speedbin: gpu-speedbin at 580 {
+				reg = <0x581 0x1>;
+				bits = <0 3>;
+			};
 		};
 
 		gpu: gpu at 13000000 {
@@ -1763,6 +1768,8 @@ gpu: gpu at 13000000 {
 				     <GIC_SPI 382 IRQ_TYPE_LEVEL_HIGH 0>,
 				     <GIC_SPI 381 IRQ_TYPE_LEVEL_HIGH 0>;
 			interrupt-names = "job", "mmu", "gpu";
+			nvmem-cells = <&gpu_speedbin>;
+			nvmem-cell-names = "speed-bin";
 			operating-points-v2 = <&gpu_opp_table>;
 			power-domains = <&spm MT8188_POWER_DOMAIN_MFG2>,
 					<&spm MT8188_POWER_DOMAIN_MFG3>,
-- 
2.45.2



From pablo.sun at mediatek.com  Fri Sep 20 06:41:09 2024
From: pablo.sun at mediatek.com (Pablo Sun)
Date: Fri, 20 Sep 2024 21:41:09 +0800
Subject: [PATCH 3/5] nvmem: mtk-efuse: Enable postprocess for mt8188 GPU speed binning
In-Reply-To: <20240920134111.19744-1-pablo.sun@mediatek.com>
References: <20240920134111.19744-1-pablo.sun@mediatek.com>
Message-ID: <20240920134111.19744-4-pablo.sun@mediatek.com>

Similar to mt8186, the efuse data for mt8188's GPU speed binning
requires post-process to convert the bit field format expected
by the OPP table.

Since mt8188 efuse is not compatible to mt8186, add a new compatible
entry for mt8188 and enable postprocess.

Signed-off-by: Pablo Sun <pablo.sun at mediatek.com>
---
 drivers/nvmem/mtk-efuse.c | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/drivers/nvmem/mtk-efuse.c b/drivers/nvmem/mtk-efuse.c
index 9caf04667341..4984145025bb 100644
--- a/drivers/nvmem/mtk-efuse.c
+++ b/drivers/nvmem/mtk-efuse.c
@@ -105,6 +105,10 @@ static const struct mtk_efuse_pdata mtk_mt8186_efuse_pdata = {
 	.uses_post_processing = true,
 };
 
+static const struct mtk_efuse_pdata mtk_mt8188_efuse_pdata = {
+	.uses_post_processing = true,
+};
+
 static const struct mtk_efuse_pdata mtk_efuse_pdata = {
 	.uses_post_processing = false,
 };
@@ -112,6 +116,7 @@ static const struct mtk_efuse_pdata mtk_efuse_pdata = {
 static const struct of_device_id mtk_efuse_of_match[] = {
 	{ .compatible = "mediatek,mt8173-efuse", .data = &mtk_efuse_pdata },
 	{ .compatible = "mediatek,mt8186-efuse", .data = &mtk_mt8186_efuse_pdata },
+	{ .compatible = "mediatek,mt8188-efuse", .data = &mtk_mt8188_efuse_pdata },
 	{ .compatible = "mediatek,efuse", .data = &mtk_efuse_pdata },
 	{/* sentinel */},
 };
-- 
2.45.2



From pablo.sun at mediatek.com  Fri Sep 20 06:41:11 2024
From: pablo.sun at mediatek.com (Pablo Sun)
Date: Fri, 20 Sep 2024 21:41:11 +0800
Subject: [PATCH 5/5] arm64: dts: mediatek: mt8390-genio-700-evk: Enable Mali GPU
In-Reply-To: <20240920134111.19744-1-pablo.sun@mediatek.com>
References: <20240920134111.19744-1-pablo.sun@mediatek.com>
Message-ID: <20240920134111.19744-6-pablo.sun@mediatek.com>

Configure GPU regulator supplies and enable GPU for GENIO 700 EVK.

The GPU in MT8390 & MT8188 has two power inputs: "DVDD_GPU" and
"DVDD_SRAM_GPU". In Genio 700 EVK, DVDD_GPU is supplied by
mt6359_vproc2_buck_reg, and DVDD_SRAM_GPU is supplied by
mt6359_vsram_others_ldo_reg.

According to section 5.2 "Recommended Operating Conditions" in
MT8390 IoT Application Processor Datasheet v1.9, The recommended
operating voltage ranges are:

- DVDD_GPU: min 0.55V, max 0.86V, typical 0.75V
- DVDD_SRAM_GPU: min 0.71V, max 0.92V, typical 0.85V

In this commit, we set DVDD_SRAM_GPU to typical 0.85V. It is possbile
to couple it to the DVDD_GPU in future patches.

Signed-off-by: Pablo Sun <pablo.sun at mediatek.com>
---
 .../dts/mediatek/mt8390-genio-700-evk.dts     | 24 +++++++++++++++++++
 1 file changed, 24 insertions(+)

diff --git a/arch/arm64/boot/dts/mediatek/mt8390-genio-700-evk.dts b/arch/arm64/boot/dts/mediatek/mt8390-genio-700-evk.dts
index 1474bef7e754..a1d6f4cd4e5f 100644
--- a/arch/arm64/boot/dts/mediatek/mt8390-genio-700-evk.dts
+++ b/arch/arm64/boot/dts/mediatek/mt8390-genio-700-evk.dts
@@ -190,6 +190,11 @@ usb_p2_vbus: regulator-10 {
 	};
 };
 
+&gpu {
+	mali-supply = <&mt6359_vproc2_buck_reg>;
+	status = "okay";
+};
+
 &i2c0 {
 	pinctrl-names = "default";
 	pinctrl-0 = <&i2c0_pins>;
@@ -253,6 +258,14 @@ &i2c6 {
 	status = "okay";
 };
 
+&mfg0 {
+	domain-supply = <&mt6359_vproc2_buck_reg>;
+};
+
+&mfg1 {
+	domain-supply = <&mt6359_vsram_others_ldo_reg>;
+};
+
 &mmc0 {
 	status = "okay";
 	pinctrl-names = "default", "state_uhs";
@@ -314,6 +327,11 @@ &mt6359_vpa_buck_reg {
 	regulator-max-microvolt = <3100000>;
 };
 
+&mt6359_vproc2_buck_reg {
+	regulator-min-microvolt = <550000>;
+	regulator-max-microvolt = <860000>;
+};
+
 &mt6359_vpu_buck_reg {
 	regulator-always-on;
 };
@@ -326,6 +344,12 @@ &mt6359_vsim1_ldo_reg {
 	regulator-enable-ramp-delay = <480>;
 };
 
+/* for GPU SRAM */
+&mt6359_vsram_others_ldo_reg {
+	regulator-min-microvolt = <850000>;
+	regulator-max-microvolt = <850000>;
+};
+
 &mt6359_vufs_ldo_reg {
 	regulator-always-on;
 };
-- 
2.45.2



From zoie.lin at mediatek.com  Fri Sep 20 07:36:26 2024
From: zoie.lin at mediatek.com (zoie.lin)
Date: Fri, 20 Sep 2024 22:36:26 +0800
Subject: [v1,0/1] i2c: mediatek: add runtime PM operations and bus regulator control
Message-ID: <20240920143627.23811-1-zoie.lin@mediatek.com>

This series is based on linux-next, tag: next-20240919

This series adds support for runtime PM operations and bus regulator control 
in the MediaTek i2c driver. The changes include the implementation of runtime 
PM operations and the integration of bus regulator control to manage bus power.

zoie.lin (1):
  i2c: mediatek: add runtime PM operations and bus regulator control

 drivers/i2c/busses/i2c-mt65xx.c | 72 ++++++++++++++++++++++++++++-----
 1 file changed, 61 insertions(+), 11 deletions(-)

-- 
2.45.2



From zoie.lin at mediatek.com  Fri Sep 20 07:36:27 2024
From: zoie.lin at mediatek.com (zoie.lin)
Date: Fri, 20 Sep 2024 22:36:27 +0800
Subject: [v1,1/1] i2c: mediatek: add runtime PM operations and bus regulator control
In-Reply-To: <20240920143627.23811-1-zoie.lin@mediatek.com>
References: <20240920143627.23811-1-zoie.lin@mediatek.com>
Message-ID: <20240920143627.23811-2-zoie.lin@mediatek.com>

This commit introduces support for runtime PM operations in
the I2C driver, enabling runtime suspend and resume functionality.

Although in the most platforms, the bus power of i2c are always
on, some platforms disable the i2c bus power in order to meet
low power request.

This implementation includes bus regulator control to facilitate
proper handling of the bus power based on platform requirements.

Signed-off-by: zoie.lin <zoie.lin at mediatek.com>
---
 drivers/i2c/busses/i2c-mt65xx.c | 72 ++++++++++++++++++++++++++++-----
 1 file changed, 61 insertions(+), 11 deletions(-)

diff --git a/drivers/i2c/busses/i2c-mt65xx.c b/drivers/i2c/busses/i2c-mt65xx.c
index e0ba653dec2d..aae0189ba210 100644
--- a/drivers/i2c/busses/i2c-mt65xx.c
+++ b/drivers/i2c/busses/i2c-mt65xx.c
@@ -21,6 +21,7 @@
 #include <linux/module.h>
 #include <linux/of.h>
 #include <linux/platform_device.h>
+#include <linux/pm_runtime.h>
 #include <linux/scatterlist.h>
 #include <linux/sched.h>
 #include <linux/slab.h>
@@ -1245,8 +1246,8 @@ static int mtk_i2c_transfer(struct i2c_adapter *adap,
 	int left_num = num;
 	struct mtk_i2c *i2c = i2c_get_adapdata(adap);
 
-	ret = clk_bulk_enable(I2C_MT65XX_CLK_MAX, i2c->clocks);
-	if (ret)
+	ret = pm_runtime_get_sync(i2c->dev);
+	if (ret < 0)
 		return ret;
 
 	i2c->auto_restart = i2c->dev_comp->auto_restart;
@@ -1299,7 +1300,9 @@ static int mtk_i2c_transfer(struct i2c_adapter *adap,
 	ret = num;
 
 err_exit:
-	clk_bulk_disable(I2C_MT65XX_CLK_MAX, i2c->clocks);
+	pm_runtime_mark_last_busy(i2c->dev);
+	pm_runtime_put_autosuspend(i2c->dev);
+
 	return ret;
 }
 
@@ -1370,6 +1373,41 @@ static int mtk_i2c_parse_dt(struct device_node *np, struct mtk_i2c *i2c)
 	return 0;
 }
 
+static int mtk_i2c_runtime_suspend(struct device *dev)
+{
+	struct mtk_i2c *i2c = dev_get_drvdata(dev);
+
+	clk_bulk_disable(I2C_MT65XX_CLK_MAX, i2c->clocks);
+	if (i2c->adap.bus_regulator)
+		regulator_disable(i2c->adap.bus_regulator);
+
+	return 0;
+}
+
+static int mtk_i2c_runtime_resume(struct device *dev)
+{
+	int ret = 0;
+	struct mtk_i2c *i2c = dev_get_drvdata(dev);
+
+	if (i2c->adap.bus_regulator) {
+		ret = regulator_enable(i2c->adap.bus_regulator);
+		if (ret < 0) {
+			dev_err(dev, "enable regulator failed!\n");
+			return ret;
+		}
+	}
+
+	ret = clk_bulk_enable(I2C_MT65XX_CLK_MAX, i2c->clocks);
+	if (ret < 0) {
+		dev_err(dev, "clock enable failed!\n");
+		if (i2c->adap.bus_regulator)
+			regulator_disable(i2c->adap.bus_regulator);
+		return ret;
+	}
+
+	return ret;
+}
+
 static int mtk_i2c_probe(struct platform_device *pdev)
 {
 	int ret = 0;
@@ -1472,13 +1510,19 @@ static int mtk_i2c_probe(struct platform_device *pdev)
 		}
 	}
 
-	ret = clk_bulk_prepare_enable(I2C_MT65XX_CLK_MAX, i2c->clocks);
+	ret = clk_bulk_prepare(I2C_MT65XX_CLK_MAX, i2c->clocks);
 	if (ret) {
-		dev_err(&pdev->dev, "clock enable failed!\n");
+		dev_err(&pdev->dev, "clk_bulk_prepare failed\n");
 		return ret;
 	}
+
+	platform_set_drvdata(pdev, i2c);
+
+	ret = mtk_i2c_runtime_resume(i2c->dev);
+	if (ret < 0)
+		goto err_clk_bulk_unprepare;
 	mtk_i2c_init_hw(i2c);
-	clk_bulk_disable(I2C_MT65XX_CLK_MAX, i2c->clocks);
+	mtk_i2c_runtime_suspend(i2c->dev);
 
 	ret = devm_request_irq(&pdev->dev, irq, mtk_i2c_irq,
 			       IRQF_NO_SUSPEND | IRQF_TRIGGER_NONE,
@@ -1486,19 +1530,22 @@ static int mtk_i2c_probe(struct platform_device *pdev)
 	if (ret < 0) {
 		dev_err(&pdev->dev,
 			"Request I2C IRQ %d fail\n", irq);
-		goto err_bulk_unprepare;
+		goto err_clk_bulk_unprepare;
 	}
+	pm_runtime_set_autosuspend_delay(&pdev->dev, 1000);
+	pm_runtime_use_autosuspend(&pdev->dev);
+	pm_runtime_enable(&pdev->dev);
 
 	i2c_set_adapdata(&i2c->adap, i2c);
 	ret = i2c_add_adapter(&i2c->adap);
 	if (ret)
-		goto err_bulk_unprepare;
-
-	platform_set_drvdata(pdev, i2c);
+		goto err_pm_runtime_disable;
 
 	return 0;
 
-err_bulk_unprepare:
+err_pm_runtime_disable:
+	pm_runtime_disable(&pdev->dev);
+err_clk_bulk_unprepare:
 	clk_bulk_unprepare(I2C_MT65XX_CLK_MAX, i2c->clocks);
 
 	return ret;
@@ -1510,6 +1557,7 @@ static void mtk_i2c_remove(struct platform_device *pdev)
 
 	i2c_del_adapter(&i2c->adap);
 
+	pm_runtime_disable(&pdev->dev);
 	clk_bulk_unprepare(I2C_MT65XX_CLK_MAX, i2c->clocks);
 }
 
@@ -1546,6 +1594,8 @@ static int mtk_i2c_resume_noirq(struct device *dev)
 static const struct dev_pm_ops mtk_i2c_pm = {
 	NOIRQ_SYSTEM_SLEEP_PM_OPS(mtk_i2c_suspend_noirq,
 				  mtk_i2c_resume_noirq)
+	SET_RUNTIME_PM_OPS(mtk_i2c_runtime_suspend, mtk_i2c_runtime_resume,
+			   NULL)
 };
 
 static struct platform_driver mtk_i2c_driver = {
-- 
2.45.2



From luiz.dentz at gmail.com  Fri Sep 20 07:54:52 2024
From: luiz.dentz at gmail.com (Luiz Augusto von Dentz)
Date: Fri, 20 Sep 2024 10:54:52 -0400
Subject: [PATCH v2 3/4] Bluetooth: btusb: mediatek: add intf release flow
 when usb disconnect
In-Reply-To: <20240919074925.22860-4-chris.lu@mediatek.com>
References: <20240919074925.22860-1-chris.lu@mediatek.com> <20240919074925.22860-4-chris.lu@mediatek.com>
Message-ID: <CABBYNZJ62dw0JHTrNK7xe9_kO61_gH9+XGPm+UEWw4CGRVCnnQ@mail.gmail.com>

Hi Chris,

On Thu, Sep 19, 2024 at 3:49?AM Chris Lu <chris.lu at mediatek.com> wrote:
>
> MediaTek claim an special usb intr interface for ISO data transmission.
> The interface need to be released before unregistering hci device when
> usb disconnect. Removing BT usb dongle without properly releasing the
> interface may cause Kernel panic while unregister hci device.
>
> Signed-off-by: Chris Lu <chris.lu at mediatek.com>
> ---
>  drivers/bluetooth/btusb.c | 12 +++++++-----
>  1 file changed, 7 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
> index dfc42bdc8aaf..37e67b451b34 100644
> --- a/drivers/bluetooth/btusb.c
> +++ b/drivers/bluetooth/btusb.c
> @@ -2614,9 +2614,9 @@ static void btusb_mtk_claim_iso_intf(struct btusb_data *data)
>         set_bit(BTMTK_ISOPKT_OVER_INTR, &btmtk_data->flags);
>  }
>
> -static void btusb_mtk_release_iso_intf(struct btusb_data *data)
> +static int btusb_mtk_release_iso_intf(struct hci_dev *hdev)
>  {
> -       struct btmtk_data *btmtk_data = hci_get_priv(data->hdev);
> +       struct btmtk_data *btmtk_data = hci_get_priv(hdev);
>
>         if (btmtk_data->isopkt_intf) {
>                 usb_kill_anchored_urbs(&btmtk_data->isopkt_anchor);
> @@ -2630,6 +2630,8 @@ static void btusb_mtk_release_iso_intf(struct btusb_data *data)
>         }
>
>         clear_bit(BTMTK_ISOPKT_OVER_INTR, &btmtk_data->flags);
> +
> +       return 0;
>  }
>
>  static int btusb_mtk_reset(struct hci_dev *hdev, void *rst_data)
> @@ -2649,7 +2651,7 @@ static int btusb_mtk_reset(struct hci_dev *hdev, void *rst_data)
>                 return err;
>
>         if (test_bit(BTMTK_ISOPKT_RUNNING, &btmtk_data->flags))
> -               btusb_mtk_release_iso_intf(data);
> +               btusb_mtk_release_iso_intf(hdev);

We can probably move the check for BTMTK_ISOPKT_RUNNING into
btusb_mtk_release_iso_intf to avoid having to duplicate it whenever
calling btusb_mtk_release_iso_intf.

>
>         btusb_stop_traffic(data);
>         usb_kill_anchored_urbs(&data->tx_anchor);
> @@ -2703,14 +2705,13 @@ static int btusb_mtk_setup(struct hci_dev *hdev)
>
>  static int btusb_mtk_shutdown(struct hci_dev *hdev)
>  {
> -       struct btusb_data *data = hci_get_drvdata(hdev);
>         struct btmtk_data *btmtk_data = hci_get_priv(hdev);
>         int ret;
>
>         ret = btmtk_usb_shutdown(hdev);
>
>         if (test_bit(BTMTK_ISOPKT_RUNNING, &btmtk_data->flags))
> -               btusb_mtk_release_iso_intf(data);
> +               btusb_mtk_release_iso_intf(hdev);

Ditto.

>         return ret;
>  }
> @@ -3824,6 +3825,7 @@ static int btusb_probe(struct usb_interface *intf,
>                 data->recv_acl = btmtk_usb_recv_acl;
>                 data->suspend = btmtk_usb_suspend;
>                 data->resume = btmtk_usb_resume;
> +               data->disconnect = btusb_mtk_release_iso_intf;

I'd wrap (e.g. btmtk_usb_disconnect) the call to
btusb_mtk_release_iso_intf since that is only meant to release the ISO
endpoint.

>         }
>
>         if (id->driver_info & BTUSB_SWAVE) {
> --
> 2.18.0
>


-- 
Luiz Augusto von Dentz


From bvanassche at acm.org  Fri Sep 20 11:39:09 2024
From: bvanassche at acm.org (Bart Van Assche)
Date: Fri, 20 Sep 2024 11:39:09 -0700
Subject: [PATCH v4 2/2] ufs: core: requeue aborted request
In-Reply-To: <4f9e2ac99bcb981b11dc6454165818c5de6fd4d6.camel@mediatek.com>
References: <20240910073035.25974-1-peter.wang@mediatek.com>
 <20240910073035.25974-3-peter.wang@mediatek.com>
 <e42abf07-ba6b-4301-8717-8d5b01d56640@acm.org>
 <04e392c00986ac798e881dcd347ff5045cf61708.camel@mediatek.com>
 <858c4b6b-fcbc-4d51-8641-051aeda387c5@acm.org>
 <524e9da9196cc0acf497ff87eba3a8043b780332.camel@mediatek.com>
 <6203d7c9-b33c-4bf1-aca3-5fc8ba5636b9@acm.org>
 <6fc025d7ffb9d702a117381fb5da318b40a24246.camel@mediatek.com>
 <46d8be04-10db-4de1-8a59-6cd402bcecb1@acm.org>
 <61a1678cad16dcb15f1e215ff1c47476666f0ee8.camel@mediatek.com>
 <78c7fc74-81c2-40e4-b050-1d65dec96d0a@acm.org>
 <f350a1dee5a03347b5e88b9d7249223ce7b72c08.camel@mediatek.com>
 <beeec868-b4ac-4025-859b-35a828cd2f8e@acm.org>
 <4f9e2ac99bcb981b11dc6454165818c5de6fd4d6.camel@mediatek.com>
Message-ID: <ec301d5f-cfee-41ce-ae1a-5679b2da2cce@acm.org>

On 9/19/24 7:02 PM, Peter Wang (???) wrote:
> On Thu, 2024-09-19 at 11:49 -0700, Bart Van Assche wrote:
>> For legacy and MCQ mode, I prefer the following behavior for
>> ufshcd_abort_all():
>> * ufshcd_compl_one_cqe() ignores commands with status OCS_ABORTED.
>> * ufshcd_release_scsi_cmd() is called either by ufshcd_abort_one() or
>>     by ufshcd_abort_all().
>>
>> Do you agree with making the changes proposed above?
> 
> This might not work, as SDB mode doesn't ignore
> OCS: INVALID_OCS_VALUE but rather notifies SCSI to requeue.

cmd->result should be ignored for aborted commands. Hence,
how OCS_INVALID_COMMAND_STATUS is translated by
ufshcd_transfer_rsp_status() is not relevant for aborted commands.

> So what we need to correct is to notify SCSI to requeue
> when MCQ mode receives OCS: ABORTED as well.

Unless the host controller violates the UFSHCI specification, the
command status is not set for aborted commands in legacy mode. Let's
keep the code uniform for legacy mode, MCQ mode, compliant and non-
ompliant controllers and not rely on the command status for aborted
commands.

Thanks,

Bart.



From bvanassche at acm.org  Fri Sep 20 12:36:09 2024
From: bvanassche at acm.org (Bart Van Assche)
Date: Fri, 20 Sep 2024 12:36:09 -0700
Subject: [PATCH v7 0/4] fix abort defect
In-Reply-To: <20240920090643.3566-1-peter.wang@mediatek.com>
References: <20240920090643.3566-1-peter.wang@mediatek.com>
Message-ID: <56d48010-13d8-4bfe-8b71-85699c1b45ef@acm.org>

On 9/20/24 2:06 AM, peter.wang at mediatek.com wrote:
> This series fixes MCQ and SDB abort defect.

Hi Peter,

Patches 2, 3 and 4 in this series introduce a significant amount of
complexity. Additionally, code paths are introduced that can only be
triggered by UFS controllers that (incorrectly) generate a completion
interrupt for aborted commands. I'm concerned that these patches will
make the UFS host controller driver harder to maintain than necessary.
Please take another look at the approach I proposed, namely making
ufshcd_compl_one_cqe() ignore commands with completion status
OCS_ABORTED. I think this approach will result in a simpler
implementation, does not require a new quirk and minimizes the code
paths that are only triggered by UFS host controllers that trigger a
completion interrupt for aborted commands.

Thanks,

Bart.


From chrisl at kernel.org  Fri Sep 20 17:04:51 2024
From: chrisl at kernel.org (Chris Li)
Date: Fri, 20 Sep 2024 17:04:51 -0700
Subject: [PATCH 0/2] Add BLK_FEAT_READ_SYNCHRONOUS and SWP_READ_SYNCHRONOUS_IO
In-Reply-To: <ZuwM-aEEo7DE-qXw@infradead.org>
References: <20240919112952.981-1-qun-wei.lin@mediatek.com> <ZuwM-aEEo7DE-qXw@infradead.org>
Message-ID: <CACePvbUCNxy3sf6+7hk9HPGTNtTMbA2=Entu0xbV7TbwX4M2WQ@mail.gmail.com>

Hi Qun-Wei,

Agree with Christoph that BLK_FEAT_READ_SYNCHRONOUS is not set
anywhere. That needs to be fixed.

Having a flag for BLK_FEAT_READ_SYNCHRONOUS and another flag for
BLK_FEAT_SYNCHRONOUS is just confusing.
for example, read path need to test two bits: "sis->flags &
(SWP_SYNCHRONOUS_IO | SWP_READ_SYNCHRONOUS_IO)"

There is only one caller of the bdev_synchronous(), which is in swapfile.c.

I suggest if you have  BLK_FEAT_READ_SYNCHRONOUS, you should have a
BLK_FEAT_WRITE_SYNCHRONOUS for writing.
The previous path that test the SWP_SYNCHRONOUS_IO should convert into
one of tests of SWP_READ_SYNCHRONOUS_IO or  SWP_WRITE_SYNCHRONOUS_IO
depend on the read or write path (never both).

"sis->flags & (SWP_SYNCHRONOUS_IO | SWP_READ_SYNCHRONOUS_IO)" will
change into "sis->flags & SWP_READ_SYNCHRONOUS_IO"

Then you can have  bdev_synchronous() just return the
SWP_READ_SYNCHRONOUS_IO | SWP_WRITE_SYNCHRONOUS_IO if both are set.
You don't need to have just bdev_synchronous() and
bdev_read_synchronous(). That is more boilerplate code which is
unnecessary.

I also suggest you squish your two patches into one because there is
no user of bdev_read_synchronous() in the first patch.
You should introduce the function with the code that uses it. Yes,
yes, I know you want to have a seperate patch for define vs another
patch for using it. In this case there is no good reason for that.

Best regards,

Chris


On Thu, Sep 19, 2024 at 4:37?AM Christoph Hellwig <hch at infradead.org> wrote:
>
> Well, you're not actually setting your new flags anywhere, which -
> as you might know - is an reson for an insta-NAK.
>


From sboyd at kernel.org  Sat Sep 21 14:12:34 2024
From: sboyd at kernel.org (Stephen Boyd)
Date: Sat, 21 Sep 2024 14:12:34 -0700
Subject: [PATCH] clk: Switch back to struct platform_driver::remove()
In-Reply-To: <20240909144026.870565-2-u.kleine-koenig@baylibre.com>
References: <20240909144026.870565-2-u.kleine-koenig@baylibre.com>
Message-ID: <1a96db1609b5b3b26584d8f823d85b7f.sboyd@kernel.org>

Quoting Uwe Kleine-K?nig (2024-09-09 07:40:25)
> After commit 0edb555a65d1 ("platform: Make platform_driver::remove()
> return void") .remove() is (again) the right callback to implement for
> platform drivers.
> 
> Convert all clk drivers to use .remove(), with the eventual goal to drop
> struct platform_driver::remove_new(). As .remove() and .remove_new() have
> the same prototypes, conversion is done by just changing the structure
> member name in the driver initializer.
> 
> Signed-off-by: Uwe Kleine-K?nig <u.kleine-koenig at baylibre.com>
> ---

Applied to clk-next


From amitsinght at marvell.com  Sun Sep 22 14:09:15 2024
From: amitsinght at marvell.com (Amit Singh Tomar)
Date: Mon, 23 Sep 2024 02:39:15 +0530
Subject: [PATCH 2/5] clk: mediatek: clk-mt8188-topckgen: Remove univpll from
 parents of mfg_core_tmp
In-Reply-To: <20240920134111.19744-3-pablo.sun@mediatek.com>
References: <20240920134111.19744-1-pablo.sun@mediatek.com>
 <20240920134111.19744-3-pablo.sun@mediatek.com>
Message-ID: <9f8d4e5e-963e-4717-9a28-9181ea662024@marvell.com>

Hi,

> Same as MT8195, MT8188 GPU clock is primarly supplied by the dedicated
> mfgpll. The clock "mfg_core_tmp" is only used as an alt clock when
> setting mfgpll clock rate.
> 
> If we keep the univpll parents from mfg_core_tmp, when setting
> GPU frequency to 390000000, the common clock framework would switch
> the parent to univpll, instead of setting mfgpll to 390000000:
> 
>       mfgpll                            0        0        0   949999756
>       univpll                           2        2        0  2340000000
>          univpll_d6                     1        1        0   390000000
>             top_mfg_core_tmp            1        1        0   390000000
>                mfg_ck_fast_ref          1        1        0   390000000
>                   mfgcfg_bg3d           1        1        0   390000000
> 
> This results in failures when subsequent devfreq operations need to
> switch to other frequencies. So remove univpll from the parent list.
> 
> This solution is taken from commit 72d38ed720e9 ("clk: mediatek:
> clk-mt8195-topckgen: Drop univplls from mfg mux parents")
> 
> Signed-off-by: Pablo Sun <pablo.sun at mediatek.com>
> ---
>    drivers/clk/mediatek/clk-mt8188-topckgen.c | 7 +++++--
>    1 file changed, 5 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/clk/mediatek/clk-mt8188-topckgen.c b/drivers/clk/mediatek/clk-mt8188-topckgen.c
> index 2ccc8a1c98f9..74ee692ac613 100644
> --- a/drivers/clk/mediatek/clk-mt8188-topckgen.c
> +++ b/drivers/clk/mediatek/clk-mt8188-topckgen.c
> @@ -342,11 +342,14 @@ static const char * const dsp7_parents[] = {
>    	"univpll_d3"
>    };
>    
> +/*
> + * MFG can be also parented to "univpll_d6" and "univpll_d7":
> + * these have been removed from the parents list to let us
> + * achieve GPU DVFS without any special clock handlers.
> + */
>    static const char * const mfg_core_tmp_parents[] = {
>    	"clk26m",
>    	"mainpll_d5_d2",
nit: Comma at the end of mainpll_d5_d2 is unnecessary.
> -	"univpll_d6",
> -	"univpll_d7"
>    };
>    
>    static const char * const camtg_parents[] = {
> -- 
> 2.45.2
> 
> 



From ck.hu at mediatek.com  Sun Sep 22 20:51:26 2024
From: ck.hu at mediatek.com (=?utf-8?B?Q0sgSHUgKOiDoeS/iuWFiSk=?=)
Date: Mon, 23 Sep 2024 03:51:26 +0000
Subject: [PATCH v3] drm/mediatek: ovl: Add fmt_convert function pointer to
 driver data
In-Reply-To: <20240917164434.17794-1-jason-jh.lin@mediatek.com>
References: <20240917164434.17794-1-jason-jh.lin@mediatek.com>
Message-ID: <d59c3b6a965daf22750be79b0f74703c216ec44a.camel@mediatek.com>

Hi, Jason:

On Wed, 2024-09-18 at 00:44 +0800, Jason-JH.Lin wrote:
> OVL_CON_CLRFMT_MAN is a configuration for extending color format
> settings of DISP_REG_OVL_CON(n).
> It will change some of the original color format settings.
> 
> Take the settings of (3 << 12) for example.
> - If OVL_CON_CLRFMT_MAN = 0 means OVL_CON_CLRFMT_RGBA8888.
> - If OVL_CON_CLRFMT_MAN = 1 means OVL_CON_CLRFMT_PARGB8888.
> 
> Since OVL_CON_CLRFMT_MAN is not supported on previous SoCs,
> It breaks the OVL color format setting of MT8173.
> 
> Therefore, the fmt_convert function pointer is added to the driver data
> and mtk_ovl_fmt_convert_with_blend is implemented for MT8192 and MT8195
> that support OVL_CON_CLRFMT_MAN, and mtk_ovl_fmt_convert is implemented
> for other SoCs that do not support it to solve the degradation problem.
> 
> Fixes: a3f7f7ef4bfe ("drm/mediatek: Support "Pre-multiplied" blending in OVL")
> Signed-off-by: Jason-JH.Lin <jason-jh.lin at mediatek.com>
> Tested-by: Alper Nebi Yasak <alpernebiyasak at gmail.com>
> ---
>  drivers/gpu/drm/mediatek/mtk_disp_ovl.c | 63 ++++++++++++++++++++++---
>  1 file changed, 56 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
> index 89b439dcf3a6..4948f269fb81 100644
> --- a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
> +++ b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
> @@ -143,6 +143,7 @@ struct mtk_disp_ovl_data {
>  	unsigned int addr;
>  	unsigned int gmc_bits;
>  	unsigned int layer_nr;
> +	unsigned int (*fmt_convert)(struct device *dev, struct mtk_plane_state *state);
>  	bool fmt_rgb565_is_0;
>  	bool smi_id_en;
>  	bool supports_afbc;
> @@ -386,13 +387,54 @@ void mtk_ovl_layer_off(struct device *dev, unsigned int idx,
>  		      DISP_REG_OVL_RDMA_CTRL(idx));
>  }
>  
> -static unsigned int ovl_fmt_convert(struct mtk_disp_ovl *ovl, unsigned int fmt,
> -				    unsigned int blend_mode)
> +static unsigned int mtk_ovl_fmt_convert(struct device *dev, struct mtk_plane_state *state)
>  {
> -	/* The return value in switch "MEM_MODE_INPUT_FORMAT_XXX"
> -	 * is defined in mediatek HW data sheet.
> -	 * The alphabet order in XXX is no relation to data
> -	 * arrangement in memory.
> +	struct mtk_disp_ovl *ovl = dev_get_drvdata(dev);
> +	unsigned int fmt = state->pending.format;
> +
> +	switch (fmt) {
> +	default:
> +	case DRM_FORMAT_RGB565:
> +		return OVL_CON_CLRFMT_RGB565(ovl);
> +	case DRM_FORMAT_BGR565:
> +		return OVL_CON_CLRFMT_RGB565(ovl) | OVL_CON_BYTE_SWAP;
> +	case DRM_FORMAT_RGB888:
> +		return OVL_CON_CLRFMT_RGB888(ovl);
> +	case DRM_FORMAT_BGR888:
> +		return OVL_CON_CLRFMT_RGB888(ovl) | OVL_CON_BYTE_SWAP;
> +	case DRM_FORMAT_RGBX8888:
> +	case DRM_FORMAT_RGBA8888:
> +	case DRM_FORMAT_RGBX1010102:
> +	case DRM_FORMAT_RGBA1010102:
> +		return OVL_CON_CLRFMT_RGBA8888;

Comparing mtk_ovl_fmt_convert() with mtk_ovl_fmt_convert_with_blend(), some pixel formats are supported, such as BGRA8888.
But in kernel v6.10, these formats are supported.
Is the code wrong in v6.10?

Regards,
CK

> +	case DRM_FORMAT_XRGB8888:
> +	case DRM_FORMAT_ARGB8888:
> +	case DRM_FORMAT_XRGB2101010:
> +	case DRM_FORMAT_ARGB2101010:
> +		return OVL_CON_CLRFMT_ARGB8888;
> +	case DRM_FORMAT_XBGR8888:
> +	case DRM_FORMAT_ABGR8888:
> +	case DRM_FORMAT_XBGR2101010:
> +	case DRM_FORMAT_ABGR2101010:
> +		return OVL_CON_CLRFMT_ABGR8888;
> +	case DRM_FORMAT_UYVY:
> +		return OVL_CON_CLRFMT_UYVY | OVL_CON_MTX_YUV_TO_RGB;
> +	case DRM_FORMAT_YUYV:
> +		return OVL_CON_CLRFMT_YUYV | OVL_CON_MTX_YUV_TO_RGB;
> +	}
> +}
> +
> +static unsigned int mtk_ovl_fmt_convert_with_blend(struct device *dev,
> +						   struct mtk_plane_state *state)
> +{
> +	struct mtk_disp_ovl *ovl = dev_get_drvdata(dev);
> +	unsigned int fmt = state->pending.format;
> +	unsigned int blend_mode = state->base.pixel_blend_mode;
> +
> +	/*
> +	 * For the platforms where OVL_CON_CLRFMT_MAN is defined in the
> +	 * hardware data sheet and supports premultiplied color formats
> +	 * such as OVL_CON_CLRFMT_PRGB8888.
>  	 */
>  	switch (fmt) {
>  	default:
> @@ -471,7 +513,7 @@ void mtk_ovl_layer_config(struct device *dev, unsigned int idx,
>  		return;
>  	}
>  
> -	con = ovl_fmt_convert(ovl, fmt, blend_mode);
> +	con = ovl->data->fmt_convert(dev, state);
>  	if (state->base.fb) {
>  		con |= OVL_CON_AEN;
>  		con |= state->base.alpha & OVL_CON_ALPHA;
> @@ -625,6 +667,7 @@ static const struct mtk_disp_ovl_data mt2701_ovl_driver_data = {
>  	.addr = DISP_REG_OVL_ADDR_MT2701,
>  	.gmc_bits = 8,
>  	.layer_nr = 4,
> +	.fmt_convert = mtk_ovl_fmt_convert,
>  	.fmt_rgb565_is_0 = false,
>  	.formats = mt8173_formats,
>  	.num_formats = ARRAY_SIZE(mt8173_formats),
> @@ -634,6 +677,7 @@ static const struct mtk_disp_ovl_data mt8173_ovl_driver_data = {
>  	.addr = DISP_REG_OVL_ADDR_MT8173,
>  	.gmc_bits = 8,
>  	.layer_nr = 4,
> +	.fmt_convert = mtk_ovl_fmt_convert,
>  	.fmt_rgb565_is_0 = true,
>  	.formats = mt8173_formats,
>  	.num_formats = ARRAY_SIZE(mt8173_formats),
> @@ -643,6 +687,7 @@ static const struct mtk_disp_ovl_data mt8183_ovl_driver_data = {
>  	.addr = DISP_REG_OVL_ADDR_MT8173,
>  	.gmc_bits = 10,
>  	.layer_nr = 4,
> +	.fmt_convert = mtk_ovl_fmt_convert,
>  	.fmt_rgb565_is_0 = true,
>  	.formats = mt8173_formats,
>  	.num_formats = ARRAY_SIZE(mt8173_formats),
> @@ -652,6 +697,7 @@ static const struct mtk_disp_ovl_data mt8183_ovl_2l_driver_data = {
>  	.addr = DISP_REG_OVL_ADDR_MT8173,
>  	.gmc_bits = 10,
>  	.layer_nr = 2,
> +	.fmt_convert = mtk_ovl_fmt_convert,
>  	.fmt_rgb565_is_0 = true,
>  	.formats = mt8173_formats,
>  	.num_formats = ARRAY_SIZE(mt8173_formats),
> @@ -661,6 +707,7 @@ static const struct mtk_disp_ovl_data mt8192_ovl_driver_data = {
>  	.addr = DISP_REG_OVL_ADDR_MT8173,
>  	.gmc_bits = 10,
>  	.layer_nr = 4,
> +	.fmt_convert = mtk_ovl_fmt_convert_with_blend,
>  	.fmt_rgb565_is_0 = true,
>  	.smi_id_en = true,
>  	.formats = mt8173_formats,
> @@ -671,6 +718,7 @@ static const struct mtk_disp_ovl_data mt8192_ovl_2l_driver_data = {
>  	.addr = DISP_REG_OVL_ADDR_MT8173,
>  	.gmc_bits = 10,
>  	.layer_nr = 2,
> +	.fmt_convert = mtk_ovl_fmt_convert_with_blend,
>  	.fmt_rgb565_is_0 = true,
>  	.smi_id_en = true,
>  	.formats = mt8173_formats,
> @@ -681,6 +729,7 @@ static const struct mtk_disp_ovl_data mt8195_ovl_driver_data = {
>  	.addr = DISP_REG_OVL_ADDR_MT8173,
>  	.gmc_bits = 10,
>  	.layer_nr = 4,
> +	.fmt_convert = mtk_ovl_fmt_convert_with_blend,
>  	.fmt_rgb565_is_0 = true,
>  	.smi_id_en = true,
>  	.supports_afbc = true,

From dmitry.baryshkov at linaro.org  Sun Sep 22 23:33:29 2024
From: dmitry.baryshkov at linaro.org (Dmitry Baryshkov)
Date: Mon, 23 Sep 2024 09:33:29 +0300
Subject: [RFC PATCH 0/4] Linaro restricted heap
In-Reply-To: <20240830070351.2855919-1-jens.wiklander@linaro.org>
References: <20240830070351.2855919-1-jens.wiklander@linaro.org>
Message-ID: <dhxvyshwi4qmcmwceokhqey2ww4azjcs6qrpnkgivdj7tv5cke@r36srvvbof6q>

Hi,

On Fri, Aug 30, 2024 at 09:03:47AM GMT, Jens Wiklander wrote:
> Hi,
> 
> This patch set is based on top of Yong Wu's restricted heap patch set [1].
> It's also a continuation on Olivier's Add dma-buf secure-heap patch set [2].
> 
> The Linaro restricted heap uses genalloc in the kernel to manage the heap
> carvout. This is a difference from the Mediatek restricted heap which
> relies on the secure world to manage the carveout.
> 
> I've tried to adress the comments on [2], but [1] introduces changes so I'm
> afraid I've had to skip some comments.

I know I have raised the same question during LPC (in connection to
Qualcomm's dma-heap implementation). Is there any reason why we are
using generic heaps instead of allocating the dma-bufs on the device
side?

In your case you already have TEE device, you can use it to allocate and
export dma-bufs, which then get imported by the V4L and DRM drivers.

I have a feeling (I might be completely wrong here) that by using
generic dma-buf heaps we can easily end up in a situation when the
userspace depends heavily on the actual platform being used (to map the
platform to heap names). I think we should instead depend on the
existing devices (e.g. if there is a TEE device, use an IOCTL to
allocate secured DMA BUF from it, otherwise check for QTEE device,
otherwise check for some other vendor device).

The mental experiment to check if the API is correct is really simple:
Can you use exactly the same rootfs on several devices without
any additional tuning (e.g. your QEMU, HiKey, a Mediatek board, Qualcomm
laptop, etc)?

> 
> This can be tested on QEMU with the following steps:
> repo init -u https://github.com/jenswi-linaro/manifest.git -m qemu_v8.xml \
>         -b prototype/sdp-v1
> repo sync -j8
> cd build
> make toolchains -j4
> make all -j$(nproc)
> make run-only
> # login and at the prompt:
> xtest --sdp-basic
> 
> https://optee.readthedocs.io/en/latest/building/prerequisites.html
> list dependencies needed to build the above.
> 
> The tests are pretty basic, mostly checking that a Trusted Application in
> the secure world can access and manipulate the memory.

- Can we test that the system doesn't crash badly if user provides
  non-secured memory to the users which expect a secure buffer?

- At the same time corresponding entities shouldn't decode data to the
  buffers accessible to the rest of the sytem.

> 
> Cheers,
> Jens
> 
> [1] https://lore.kernel.org/dri-devel/20240515112308.10171-1-yong.wu at mediatek.com/
> [2] https://lore.kernel.org/lkml/20220805135330.970-1-olivier.masse at nxp.com/
> 
> Changes since Olivier's post [2]:
> * Based on Yong Wu's post [1] where much of dma-buf handling is done in
>   the generic restricted heap
> * Simplifications and cleanup
> * New commit message for "dma-buf: heaps: add Linaro restricted dmabuf heap
>   support"
> * Replaced the word "secure" with "restricted" where applicable
> 
> Etienne Carriere (1):
>   tee: new ioctl to a register tee_shm from a dmabuf file descriptor
> 
> Jens Wiklander (2):
>   dma-buf: heaps: restricted_heap: add no_map attribute
>   dma-buf: heaps: add Linaro restricted dmabuf heap support
> 
> Olivier Masse (1):
>   dt-bindings: reserved-memory: add linaro,restricted-heap
> 
>  .../linaro,restricted-heap.yaml               |  56 ++++++
>  drivers/dma-buf/heaps/Kconfig                 |  10 ++
>  drivers/dma-buf/heaps/Makefile                |   1 +
>  drivers/dma-buf/heaps/restricted_heap.c       |  17 +-
>  drivers/dma-buf/heaps/restricted_heap.h       |   2 +
>  .../dma-buf/heaps/restricted_heap_linaro.c    | 165 ++++++++++++++++++
>  drivers/tee/tee_core.c                        |  38 ++++
>  drivers/tee/tee_shm.c                         | 104 ++++++++++-
>  include/linux/tee_drv.h                       |  11 ++
>  include/uapi/linux/tee.h                      |  29 +++
>  10 files changed, 426 insertions(+), 7 deletions(-)
>  create mode 100644 Documentation/devicetree/bindings/reserved-memory/linaro,restricted-heap.yaml
>  create mode 100644 drivers/dma-buf/heaps/restricted_heap_linaro.c
> 
> -- 
> 2.34.1
> 

-- 
With best wishes
Dmitry


From linyunsheng at huawei.com  Mon Sep 23 00:01:12 2024
From: linyunsheng at huawei.com (Yunsheng Lin)
Date: Mon, 23 Sep 2024 15:01:12 +0800
Subject: [PATCH net 2/2] page_pool: fix IOMMU crash when driver has
 already unbound
In-Reply-To: <50a463d5-a5a1-422f-a4f7-d3587b12c265@huawei.com>
References: <20240918111826.863596-1-linyunsheng@huawei.com>
 <20240918111826.863596-3-linyunsheng@huawei.com>
 <CAC_iWjK=G7Oo5=pN2QunhasgDC6NyC1L+96jigX7u9ad+PbYng@mail.gmail.com>
 <50a463d5-a5a1-422f-a4f7-d3587b12c265@huawei.com>
Message-ID: <2fb8d278-62e0-4a81-a537-8f601f61e81d@huawei.com>

On 2024/9/19 18:54, Yunsheng Lin wrote:
> On 2024/9/19 1:06, Ilias Apalodimas wrote:
>> Hi Yunsheng,
>>
>> Thanks for looking into this!
>>
>> On Wed, 18 Sept 2024 at 14:24, Yunsheng Lin <linyunsheng at huawei.com> wrote:
>>>
>>> Networking driver with page_pool support may hand over page
>>> still with dma mapping to network stack and try to reuse that
>>> page after network stack is done with it and passes it back
>>> to page_pool to avoid the penalty of dma mapping/unmapping.
>>
>> I think you can shorten this to "If recycling and DMA mapping are
>> enabled during the pool creation"
> 
> I am not sure if I understand the 'recycling' part here. Is the
> 'recycling' part referring to whether skb_mark_for_recycle() is
> called to enable recycling for the skb? Is there still any driver
> with page_pool support but doesn't call skb_mark_for_recycle()
> when handing over page to network stack?
> 
> For the 'DMA mapping' part, as there is no space in 'struct
> page' to track the inflight pages, so 'pp' in 'struct page'
> is renamed to 'pp_item' to enable the tracking of inflight
> page. I tried shortening this for 'pool->dma_map being false'
> when coding, but it seems differentiating the same field in
> 'struct page' doesn't make much sense according to 'pool->dma_map'
> as it means we might need to add an union in 'struct page' for
> that to work and add additional checking to decide if it is 'pp'
> or 'pp_item'.
> 
>>
>>> With all the caching in the network stack, some pages may be
>>> held in the network stack without returning to the page_pool
>>> soon enough, and with VF disable causing the driver unbound,
>>> the page_pool does not stop the driver from doing it's
>>> unbounding work, instead page_pool uses workqueue to check
>>> if there is some pages coming back from the network stack
>>> periodically, if there is any, it will do the dma unmmapping
>>> related cleanup work.
>>>
>>> As mentioned in [1], attempting DMA unmaps after the driver
>>> has already unbound may leak resources or at worst corrupt
>>> memory. Fundamentally, the page pool code cannot allow DMA
>>> mappings to outlive the driver they belong to.
>>>
>>> Currently it seems there are at least two cases that the page
>>> is not released fast enough causing dma unmmapping done after
>>> driver has already unbound:
>>> 1. ipv4 packet defragmentation timeout: this seems to cause
>>>    delay up to 30 secs:
>>>
>>> 2. skb_defer_free_flush(): this may cause infinite delay if
>>>    there is no triggering for net_rx_action().
>>>
>>> In order not to do the dma unmmapping after driver has already
>>> unbound and stall the unloading of the networking driver, add
>>> the pool->items array to record all the pages including the ones
>>> which are handed over to network stack, so the page_pool can
>>> do the dma unmmapping for those pages when page_pool_destroy()
>>> is called.
>>
>> So, I was thinking of a very similar idea. But what do you mean by
>> "all"? The pages that are still in caches (slow or fast) of the pool
>> will be unmapped during page_pool_destroy().
> 
> Yes, it includes the one in pool->alloc and pool->ring.

It worths mentioning that there is a semantics changing here:
Before this patch, there can be almost unlimited inflight pages used by
driver and network stack, as page_pool doesn't really track those pages.
After this patch, as we use a fixed-size pool->items array to track the
inflight pages, the inflight pages is limited by the pool->items, currently
the size of pool->items array is calculated as below in this patch:

+#define PAGE_POOL_MIN_ITEM_CNT	512
+	unsigned int item_cnt = (params->pool_size ? : 1024) +
+				PP_ALLOC_CACHE_SIZE + PAGE_POOL_MIN_ITEM_CNT;

Personally I would consider it is an advantage to limit how many pages which
are used by the driver and network stack, the problem seems to how to decide
the limited number of page used by network stack so that performance is not
impacted.

> 
>> Don't we 'just' need a list of the inflight packets and their pages or
>> fragments? What we could do is go through that list and unmap these
>> pages during page_pool_destroy().
> 
> The main reason for that is to avoid the overhead of page_pool_item_del()
> and page_pool_item_add() when allocing/freeing page from/to pool->alloc
> and pool->ring.
> 
> Yes, including the pages in pool->ring seems to make the pool->ring
> somewhat duplicated, maybe we can remove pool->ring if we can make
> and prove 'pool->items' is performing better than pool->ring in the
> future?
> 
>>
>> I'll have a closer look at the patch tomorrow
> 
> Thanks for the reviewing.
> 
>>
>> Thanks!
>> /Ilias
>>
> 


From peter.wang at mediatek.com  Mon Sep 23 00:06:38 2024
From: peter.wang at mediatek.com (=?utf-8?B?UGV0ZXIgV2FuZyAo546L5L+h5Y+LKQ==?=)
Date: Mon, 23 Sep 2024 07:06:38 +0000
Subject: [PATCH v4 2/2] ufs: core: requeue aborted request
In-Reply-To: <ec301d5f-cfee-41ce-ae1a-5679b2da2cce@acm.org>
References: <20240910073035.25974-1-peter.wang@mediatek.com>
	 <20240910073035.25974-3-peter.wang@mediatek.com>
	 <e42abf07-ba6b-4301-8717-8d5b01d56640@acm.org>
	 <04e392c00986ac798e881dcd347ff5045cf61708.camel@mediatek.com>
	 <858c4b6b-fcbc-4d51-8641-051aeda387c5@acm.org>
	 <524e9da9196cc0acf497ff87eba3a8043b780332.camel@mediatek.com>
	 <6203d7c9-b33c-4bf1-aca3-5fc8ba5636b9@acm.org>
	 <6fc025d7ffb9d702a117381fb5da318b40a24246.camel@mediatek.com>
	 <46d8be04-10db-4de1-8a59-6cd402bcecb1@acm.org>
	 <61a1678cad16dcb15f1e215ff1c47476666f0ee8.camel@mediatek.com>
	 <78c7fc74-81c2-40e4-b050-1d65dec96d0a@acm.org>
	 <f350a1dee5a03347b5e88b9d7249223ce7b72c08.camel@mediatek.com>
	 <beeec868-b4ac-4025-859b-35a828cd2f8e@acm.org>
	 <4f9e2ac99bcb981b11dc6454165818c5de6fd4d6.camel@mediatek.com>
	 <ec301d5f-cfee-41ce-ae1a-5679b2da2cce@acm.org>
Message-ID: <bf4ae4a400365d14c4194f2f6ffb318cb04184a2.camel@mediatek.com>

On Fri, 2024-09-20 at 11:39 -0700, Bart Van Assche wrote:
>  	 
> External email : Please do not click links or open attachments until
> you have verified the sender or the content.
>  On 9/19/24 7:02 PM, Peter Wang (???) wrote:
> > On Thu, 2024-09-19 at 11:49 -0700, Bart Van Assche wrote:
> >> For legacy and MCQ mode, I prefer the following behavior for
> >> ufshcd_abort_all():
> >> * ufshcd_compl_one_cqe() ignores commands with status OCS_ABORTED.
> >> * ufshcd_release_scsi_cmd() is called either by ufshcd_abort_one()
> or
> >>     by ufshcd_abort_all().
> >>
> >> Do you agree with making the changes proposed above?
> > 
> > This might not work, as SDB mode doesn't ignore
> > OCS: INVALID_OCS_VALUE but rather notifies SCSI to requeue.
> 
> cmd->result should be ignored for aborted commands. Hence,
> how OCS_INVALID_COMMAND_STATUS is translated by
> ufshcd_transfer_rsp_status() is not relevant for aborted commands.
> 

Hi Bart,

Okay, I will not handle it and let it remain as it is.


> > So what we need to correct is to notify SCSI to requeue
> > when MCQ mode receives OCS: ABORTED as well.
> 
> Unless the host controller violates the UFSHCI specification, the
> command status is not set for aborted commands in legacy mode. Let's
> keep the code uniform for legacy mode, MCQ mode, compliant and non-
> ompliant controllers and not rely on the command status for aborted
> commands.
> 
> Thanks,
> 
> Bart.
> 

Okay, but under SDB mode, MediaTek might still need a quirk 
to keep the behavior of OCS_ABORTED consistent with 
OCS_INVALID_COMMAND_STATUS.

Thanks.
Peter



From Jason-JH.Lin at mediatek.com  Mon Sep 23 00:07:21 2024
From: Jason-JH.Lin at mediatek.com (=?utf-8?B?SmFzb24tSkggTGluICjmnpfnnb/npaUp?=)
Date: Mon, 23 Sep 2024 07:07:21 +0000
Subject: [PATCH v3] drm/mediatek: ovl: Add fmt_convert function pointer to
 driver data
In-Reply-To: <d59c3b6a965daf22750be79b0f74703c216ec44a.camel@mediatek.com>
References: <20240917164434.17794-1-jason-jh.lin@mediatek.com>
	 <d59c3b6a965daf22750be79b0f74703c216ec44a.camel@mediatek.com>
Message-ID: <09a9180341b0d4898dd8185038aecdea4b147522.camel@mediatek.com>

On Mon, 2024-09-23 at 03:51 +0000, CK Hu (???) wrote:
> Hi, Jason:
> 
> On Wed, 2024-09-18 at 00:44 +0800, Jason-JH.Lin wrote:
> > OVL_CON_CLRFMT_MAN is a configuration for extending color format
> > settings of DISP_REG_OVL_CON(n).
> > It will change some of the original color format settings.
> > 
> > Take the settings of (3 << 12) for example.
> > - If OVL_CON_CLRFMT_MAN = 0 means OVL_CON_CLRFMT_RGBA8888.
> > - If OVL_CON_CLRFMT_MAN = 1 means OVL_CON_CLRFMT_PARGB8888.
> > 
> > Since OVL_CON_CLRFMT_MAN is not supported on previous SoCs,
> > It breaks the OVL color format setting of MT8173.
> > 
> > Therefore, the fmt_convert function pointer is added to the driver
> > data
> > and mtk_ovl_fmt_convert_with_blend is implemented for MT8192 and
> > MT8195
> > that support OVL_CON_CLRFMT_MAN, and mtk_ovl_fmt_convert is
> > implemented
> > for other SoCs that do not support it to solve the degradation
> > problem.
> > 
> > Fixes: a3f7f7ef4bfe ("drm/mediatek: Support "Pre-multiplied"
> > blending in OVL")
> > Signed-off-by: Jason-JH.Lin <jason-jh.lin at mediatek.com>
> > Tested-by: Alper Nebi Yasak <alpernebiyasak at gmail.com>
> > ---
> >  drivers/gpu/drm/mediatek/mtk_disp_ovl.c | 63
> > ++++++++++++++++++++++---
> >  1 file changed, 56 insertions(+), 7 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
> > b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
> > index 89b439dcf3a6..4948f269fb81 100644
> > --- a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
> > +++ b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
> > @@ -143,6 +143,7 @@ struct mtk_disp_ovl_data {
> >  	unsigned int addr;
> >  	unsigned int gmc_bits;
> >  	unsigned int layer_nr;
> > +	unsigned int (*fmt_convert)(struct device *dev, struct
> > mtk_plane_state *state);
> >  	bool fmt_rgb565_is_0;
> >  	bool smi_id_en;
> >  	bool supports_afbc;
> > @@ -386,13 +387,54 @@ void mtk_ovl_layer_off(struct device *dev,
> > unsigned int idx,
> >  		      DISP_REG_OVL_RDMA_CTRL(idx));
> >  }
> >  
> > -static unsigned int ovl_fmt_convert(struct mtk_disp_ovl *ovl,
> > unsigned int fmt,
> > -				    unsigned int blend_mode)
> > +static unsigned int mtk_ovl_fmt_convert(struct device *dev, struct
> > mtk_plane_state *state)
> >  {
> > -	/* The return value in switch "MEM_MODE_INPUT_FORMAT_XXX"
> > -	 * is defined in mediatek HW data sheet.
> > -	 * The alphabet order in XXX is no relation to data
> > -	 * arrangement in memory.
> > +	struct mtk_disp_ovl *ovl = dev_get_drvdata(dev);
> > +	unsigned int fmt = state->pending.format;
> > +
> > +	switch (fmt) {
> > +	default:
> > +	case DRM_FORMAT_RGB565:
> > +		return OVL_CON_CLRFMT_RGB565(ovl);
> > +	case DRM_FORMAT_BGR565:
> > +		return OVL_CON_CLRFMT_RGB565(ovl) | OVL_CON_BYTE_SWAP;
> > +	case DRM_FORMAT_RGB888:
> > +		return OVL_CON_CLRFMT_RGB888(ovl);
> > +	case DRM_FORMAT_BGR888:
> > +		return OVL_CON_CLRFMT_RGB888(ovl) | OVL_CON_BYTE_SWAP;
> > +	case DRM_FORMAT_RGBX8888:
> > +	case DRM_FORMAT_RGBA8888:
> > +	case DRM_FORMAT_RGBX1010102:
> > +	case DRM_FORMAT_RGBA1010102:
> > +		return OVL_CON_CLRFMT_RGBA8888;
> 
> Comparing mtk_ovl_fmt_convert() with
> mtk_ovl_fmt_convert_with_blend(), some pixel formats are supported,
> such as BGRA8888.
> But in kernel v6.10, these formats are supported.
> Is the code wrong in v6.10?
> 

Yes, I lost those parts...

I'll add the cases:

case BGRX8888:
case BGRA8888:
case BGRX1010102:
case BGRA1010102:
    return OVL_CON_CLRFMT_BGRA8888;

and send the v4 soon.

Regards,
Jason-JH.Lin

> Regards,
> CK

From peter.wang at mediatek.com  Mon Sep 23 00:07:25 2024
From: peter.wang at mediatek.com (=?utf-8?B?UGV0ZXIgV2FuZyAo546L5L+h5Y+LKQ==?=)
Date: Mon, 23 Sep 2024 07:07:25 +0000
Subject: [PATCH v7 0/4] fix abort defect
In-Reply-To: <56d48010-13d8-4bfe-8b71-85699c1b45ef@acm.org>
References: <20240920090643.3566-1-peter.wang@mediatek.com>
	 <56d48010-13d8-4bfe-8b71-85699c1b45ef@acm.org>
Message-ID: <5cf7513b18e36522f3de38c6acb44b09c9e369da.camel@mediatek.com>

On Fri, 2024-09-20 at 12:36 -0700, Bart Van Assche wrote:
>  	 
> External email : Please do not click links or open attachments until
> you have verified the sender or the content.
>  On 9/20/24 2:06 AM, peter.wang at mediatek.com wrote:
> > This series fixes MCQ and SDB abort defect.
> 
> Hi Peter,
> 
> Patches 2, 3 and 4 in this series introduce a significant amount of
> complexity. Additionally, code paths are introduced that can only be
> triggered by UFS controllers that (incorrectly) generate a completion
> interrupt for aborted commands. I'm concerned that these patches will
> make the UFS host controller driver harder to maintain than
> necessary.
> Please take another look at the approach I proposed, namely making
> ufshcd_compl_one_cqe() ignore commands with completion status
> OCS_ABORTED. I think this approach will result in a simpler
> implementation, does not require a new quirk and minimizes the code
> paths that are only triggered by UFS host controllers that trigger a
> completion interrupt for aborted commands.
> 
> Thanks,
> 
> Bart.

Hi Bart,

Because I feel it's a bit weird to intentionally ignore a CQ 
slot in MCQ mode and directly requeue, but I will try to make 
changes according to your idea.

Thanks.
Peter


From peter.wang at mediatek.com  Mon Sep 23 01:03:41 2024
From: peter.wang at mediatek.com (peter.wang at mediatek.com)
Date: Mon, 23 Sep 2024 16:03:41 +0800
Subject: [PATCH v8 0/3] fix abort defect
Message-ID: <20240923080344.19084-1-peter.wang@mediatek.com>

From: Peter Wang <peter.wang at mediatek.com>

V8:
 - Remove the abort variable to simplify the abort process.
 - Correct error handler successfully aborts release flow.
 - Ingore MCQ OCS: ABORTED.

V7:
 - Use a variable instead of a flag.
 - Add a check for MCQ mode when setting this variable to UFS_ERR_HANDLER.
 - Print OCS information for OCS_ABORTED and OCS_INVALID_COMMAND_STATUS.
 - Add a MediaTek quirk for handling OCS_ABORTED in SDB mode.
 - Skip notifying SCSI from ISR during SCSI abort (ufshcd_abort()).

V6:
 - Add err handler check before set flag true.

V5:
 - Change flag name.
 - Amend comment and patch description.

V4:
 - Remove nullify SQ entry abort requeue.
 - Add more comment for flag usage and set description.
 - Fix build warning.

V3:
 - Change comment and use variable(rtc) for error print
 - Change flag name and move flag set before ufshcd_clear_cmd
 - Add SDB mode clear UTRLCLR tag receive OCS_ABORTED requeue

V2:
 - Fix mcq_enabled build error.

Peter Wang (3):
  ufs: core: fix the issue of ICU failure
  ufs: core: fix error handler process for MCQ abort
  ufs: core: add a quirk for MediaTek SDB mode aborted

 drivers/ufs/core/ufs-mcq.c      | 15 ++++++++-------
 drivers/ufs/core/ufshcd.c       | 28 ++++++++++++++++++++++++++--
 drivers/ufs/host/ufs-mediatek.c |  1 +
 include/ufs/ufshcd.h            |  6 ++++++
 4 files changed, 41 insertions(+), 9 deletions(-)

-- 
2.45.2



From peter.wang at mediatek.com  Mon Sep 23 01:03:43 2024
From: peter.wang at mediatek.com (peter.wang at mediatek.com)
Date: Mon, 23 Sep 2024 16:03:43 +0800
Subject: [PATCH v8 2/3] ufs: core: fix error handler process for MCQ abort
In-Reply-To: <20240923080344.19084-1-peter.wang@mediatek.com>
References: <20240923080344.19084-1-peter.wang@mediatek.com>
Message-ID: <20240923080344.19084-3-peter.wang@mediatek.com>

From: Peter Wang <peter.wang at mediatek.com>

When the error handler successfully aborts a MCQ request,
it only releases the command and does not notify the SCSI layer.
This may cause another abort after 30 seconds timeout.
This patch notifies the SCSI layer to requeue the request.

Additionally, ignore the OCS: ABORTED CQ slot after MCQ mode
SQ cleanup. This makes the behavior of MCQ mode consistent with
that of legacy SDB mode.

Also, print logs for OCS: ABORTED and OCS_INVALID_COMMAND_STATUS
for debugging purposes.

Signed-off-by: Peter Wang <peter.wang at mediatek.com>
---
 drivers/ufs/core/ufshcd.c | 23 ++++++++++++++++++++++-
 1 file changed, 22 insertions(+), 1 deletion(-)

diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
index a6f818cdef0e..b5c7bc50a27e 100644
--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -5405,9 +5405,15 @@ ufshcd_transfer_rsp_status(struct ufs_hba *hba, struct ufshcd_lrb *lrbp,
 		break;
 	case OCS_ABORTED:
 		result |= DID_ABORT << 16;
+		dev_warn(hba->dev,
+				"OCS aborted from controller = %x for tag %d\n",
+				ocs, lrbp->task_tag);
 		break;
 	case OCS_INVALID_COMMAND_STATUS:
 		result |= DID_REQUEUE << 16;
+		dev_warn(hba->dev,
+				"OCS invaild from controller = %x for tag %d\n",
+				ocs, lrbp->task_tag);
 		break;
 	case OCS_INVALID_CMD_TABLE_ATTR:
 	case OCS_INVALID_PRDT_ATTR:
@@ -5526,6 +5532,18 @@ void ufshcd_compl_one_cqe(struct ufs_hba *hba, int task_tag,
 			ufshcd_update_monitor(hba, lrbp);
 		ufshcd_add_command_trace(hba, task_tag, UFS_CMD_COMP);
 		cmd->result = ufshcd_transfer_rsp_status(hba, lrbp, cqe);
+
+		/*
+		 * Ignore MCQ OCS: ABORTED posted by the host controller.
+		 * This makes the behavior of MCQ mode consistent with that
+		 * of legacy SDB mode.
+		 */
+		if (hba->mcq_enabled) {
+			ocs = ufshcd_get_tr_ocs(lrbp, cqe);
+			if (ocs == OCS_ABORTED)
+				return;
+		}
+
 		ufshcd_release_scsi_cmd(hba, lrbp);
 		/* Do not touch lrbp after scsi done */
 		scsi_done(cmd);
@@ -6486,8 +6504,11 @@ static bool ufshcd_abort_one(struct request *rq, void *priv)
 		if (!hwq)
 			return 0;
 		spin_lock_irqsave(&hwq->cq_lock, flags);
-		if (ufshcd_cmd_inflight(lrbp->cmd))
+		if (ufshcd_cmd_inflight(lrbp->cmd)) {
+			set_host_byte(lrbp->cmd, DID_REQUEUE);
 			ufshcd_release_scsi_cmd(hba, lrbp);
+			scsi_done(lrbp->cmd);
+		}
 		spin_unlock_irqrestore(&hwq->cq_lock, flags);
 	}
 
-- 
2.45.2



From peter.wang at mediatek.com  Mon Sep 23 01:03:42 2024
From: peter.wang at mediatek.com (peter.wang at mediatek.com)
Date: Mon, 23 Sep 2024 16:03:42 +0800
Subject: [PATCH v8 1/3] ufs: core: fix the issue of ICU failure
In-Reply-To: <20240923080344.19084-1-peter.wang@mediatek.com>
References: <20240923080344.19084-1-peter.wang@mediatek.com>
Message-ID: <20240923080344.19084-2-peter.wang@mediatek.com>

From: Peter Wang <peter.wang at mediatek.com>

When setting the ICU bit without using read-modify-write,
SQRTCy will restart SQ again and receive an RTC return
error code 2 (Failure - SQ not stopped).

Additionally, the error log has been modified so that
this type of error can be observed.

Fixes: ab248643d3d6 ("scsi: ufs: core: Add error handling for MCQ mode")
Cc: stable at vger.kernel.org
Signed-off-by: Peter Wang <peter.wang at mediatek.com>
Reviewed-by: Bao D. Nguyen <quic_nguyenb at quicinc.com>
Reviewed-by: Bart Van Assche <bvanassche at acm.org>
---
 drivers/ufs/core/ufs-mcq.c | 15 ++++++++-------
 1 file changed, 8 insertions(+), 7 deletions(-)

diff --git a/drivers/ufs/core/ufs-mcq.c b/drivers/ufs/core/ufs-mcq.c
index 5891cdacd0b3..3903947dbed1 100644
--- a/drivers/ufs/core/ufs-mcq.c
+++ b/drivers/ufs/core/ufs-mcq.c
@@ -539,7 +539,7 @@ int ufshcd_mcq_sq_cleanup(struct ufs_hba *hba, int task_tag)
 	struct scsi_cmnd *cmd = lrbp->cmd;
 	struct ufs_hw_queue *hwq;
 	void __iomem *reg, *opr_sqd_base;
-	u32 nexus, id, val;
+	u32 nexus, id, val, rtc;
 	int err;
 
 	if (hba->quirks & UFSHCD_QUIRK_MCQ_BROKEN_RTC)
@@ -569,17 +569,18 @@ int ufshcd_mcq_sq_cleanup(struct ufs_hba *hba, int task_tag)
 	opr_sqd_base = mcq_opr_base(hba, OPR_SQD, id);
 	writel(nexus, opr_sqd_base + REG_SQCTI);
 
-	/* SQRTCy.ICU = 1 */
-	writel(SQ_ICU, opr_sqd_base + REG_SQRTC);
+	/* Initiate Cleanup */
+	writel(readl(opr_sqd_base + REG_SQRTC) | SQ_ICU,
+		opr_sqd_base + REG_SQRTC);
 
 	/* Poll SQRTSy.CUS = 1. Return result from SQRTSy.RTC */
 	reg = opr_sqd_base + REG_SQRTS;
 	err = read_poll_timeout(readl, val, val & SQ_CUS, 20,
 				MCQ_POLL_US, false, reg);
-	if (err)
-		dev_err(hba->dev, "%s: failed. hwq=%d, tag=%d err=%ld\n",
-			__func__, id, task_tag,
-			FIELD_GET(SQ_ICU_ERR_CODE_MASK, readl(reg)));
+	rtc = FIELD_GET(SQ_ICU_ERR_CODE_MASK, readl(reg));
+	if (err || rtc)
+		dev_err(hba->dev, "%s: failed. hwq=%d, tag=%d err=%d RTC=%d\n",
+			__func__, id, task_tag, err, rtc);
 
 	if (ufshcd_mcq_sq_start(hba, hwq))
 		err = -ETIMEDOUT;
-- 
2.45.2



From peter.wang at mediatek.com  Mon Sep 23 01:03:44 2024
From: peter.wang at mediatek.com (peter.wang at mediatek.com)
Date: Mon, 23 Sep 2024 16:03:44 +0800
Subject: [PATCH v8 3/3] ufs: core: add a quirk for MediaTek SDB mode aborted
In-Reply-To: <20240923080344.19084-1-peter.wang@mediatek.com>
References: <20240923080344.19084-1-peter.wang@mediatek.com>
Message-ID: <20240923080344.19084-4-peter.wang@mediatek.com>

From: Peter Wang <peter.wang at mediatek.com>

Because the MediaTek UFS controller uses UTRLCLR to clear commands
and fills the OCS with ABORTED, this patch introduces a quirk to
treat ABORTED as INVALID_OCS_VALUE.

Signed-off-by: Peter Wang <peter.wang at mediatek.com>
---
 drivers/ufs/core/ufshcd.c       | 5 ++++-
 drivers/ufs/host/ufs-mediatek.c | 1 +
 include/ufs/ufshcd.h            | 6 ++++++
 3 files changed, 11 insertions(+), 1 deletion(-)

diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
index b5c7bc50a27e..b42079c3d634 100644
--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -5404,7 +5404,10 @@ ufshcd_transfer_rsp_status(struct ufs_hba *hba, struct ufshcd_lrb *lrbp,
 		}
 		break;
 	case OCS_ABORTED:
-		result |= DID_ABORT << 16;
+		if (hba->quirks & UFSHCD_QUIRK_OCS_ABORTED)
+			result |= DID_REQUEUE << 16;
+		else
+			result |= DID_ABORT << 16;
 		dev_warn(hba->dev,
 				"OCS aborted from controller = %x for tag %d\n",
 				ocs, lrbp->task_tag);
diff --git a/drivers/ufs/host/ufs-mediatek.c b/drivers/ufs/host/ufs-mediatek.c
index 02c9064284e1..8a4c1b8f5a26 100644
--- a/drivers/ufs/host/ufs-mediatek.c
+++ b/drivers/ufs/host/ufs-mediatek.c
@@ -1021,6 +1021,7 @@ static int ufs_mtk_init(struct ufs_hba *hba)
 	hba->quirks |= UFSHCI_QUIRK_SKIP_MANUAL_WB_FLUSH_CTRL;
 	hba->quirks |= UFSHCD_QUIRK_MCQ_BROKEN_INTR;
 	hba->quirks |= UFSHCD_QUIRK_MCQ_BROKEN_RTC;
+	hba->quirks |= UFSHCD_QUIRK_OCS_ABORTED;
 	hba->vps->wb_flush_threshold = UFS_WB_BUF_REMAIN_PERCENT(80);
 
 	if (host->caps & UFS_MTK_CAP_DISABLE_AH8)
diff --git a/include/ufs/ufshcd.h b/include/ufs/ufshcd.h
index 0fd2aebac728..8f156803d703 100644
--- a/include/ufs/ufshcd.h
+++ b/include/ufs/ufshcd.h
@@ -684,6 +684,12 @@ enum ufshcd_quirks {
 	 * single doorbell mode.
 	 */
 	UFSHCD_QUIRK_BROKEN_LSDBS_CAP			= 1 << 25,
+
+	/*
+	 * Some host controllers set OCS_ABORTED after UTRLCLR (SDB mode),
+	 * this quirk is set to treat OCS: ABORTED as INVALID_OCS_VALUE
+	 */
+	UFSHCD_QUIRK_OCS_ABORTED			= 1 << 26,
 };
 
 enum ufshcd_caps {
-- 
2.45.2



From max_weng at compal.corp-partner.google.com  Mon Sep 23 01:13:40 2024
From: max_weng at compal.corp-partner.google.com (Max Weng)
Date: Mon, 23 Sep 2024 16:13:40 +0800
Subject: [PATCH v1] arm64: dts: mediatek: mt8186: add FHCTL node
Message-ID: <20240923081340.860715-1-max_weng@compal.corp-partner.google.com>

From: max_weng <max_weng at compal.corp-partner.google.com>

add fhctl device node.

Signed-off-by: max_weng <max_weng at compal.corp-partner.google.com>
---
 arch/arm64/boot/dts/mediatek/mt8186.dtsi | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/arch/arm64/boot/dts/mediatek/mt8186.dtsi b/arch/arm64/boot/dts/mediatek/mt8186.dtsi
index 148c332018b0..d3c3c2a40adc 100644
--- a/arch/arm64/boot/dts/mediatek/mt8186.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8186.dtsi
@@ -29,6 +29,13 @@ aliases {
 		rdma1 = &rdma1;
 	};
 
+	fhctl: fhctl at 1000ce00 {
+		compatible = "mediatek,mt8186-fhctl";
+		clocks = <&apmixedsys CLK_APMIXED_TVDPLL>;
+		reg = <0 0x1000ce00 0 0x200>;
+		status = "disabled";
+	};
+
 	cci: cci {
 		compatible = "mediatek,mt8186-cci";
 		clocks = <&mcusys CLK_MCU_ARMPLL_BUS_SEL>,
-- 
2.34.1



From angelogioacchino.delregno at collabora.com  Mon Sep 23 01:35:44 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Mon, 23 Sep 2024 10:35:44 +0200
Subject: [PATCH v1] arm64: dts: mediatek: mt8186: add FHCTL node
In-Reply-To: <20240923081340.860715-1-max_weng@compal.corp-partner.google.com>
References: <20240923081340.860715-1-max_weng@compal.corp-partner.google.com>
Message-ID: <b05d0543-b4f4-463d-a56a-28f7fa99a3f0@collabora.com>

Il 23/09/24 10:13, Max Weng ha scritto:
> From: max_weng <max_weng at compal.corp-partner.google.com>
> 
> add fhctl device node.

Please clarify the commit description, like so:

Add FHCTL device node for Frequency Hopping and Spread Spectrum
clocking function.

After which,
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>


> 
> Signed-off-by: max_weng <max_weng at compal.corp-partner.google.com>
> ---
>   arch/arm64/boot/dts/mediatek/mt8186.dtsi | 7 +++++++
>   1 file changed, 7 insertions(+)
> 
> diff --git a/arch/arm64/boot/dts/mediatek/mt8186.dtsi b/arch/arm64/boot/dts/mediatek/mt8186.dtsi
> index 148c332018b0..d3c3c2a40adc 100644
> --- a/arch/arm64/boot/dts/mediatek/mt8186.dtsi
> +++ b/arch/arm64/boot/dts/mediatek/mt8186.dtsi
> @@ -29,6 +29,13 @@ aliases {
>   		rdma1 = &rdma1;
>   	};
>   
> +	fhctl: fhctl at 1000ce00 {
> +		compatible = "mediatek,mt8186-fhctl";
> +		clocks = <&apmixedsys CLK_APMIXED_TVDPLL>;
> +		reg = <0 0x1000ce00 0 0x200>;
> +		status = "disabled";
> +	};
> +
>   	cci: cci {
>   		compatible = "mediatek,mt8186-cci";
>   		clocks = <&mcusys CLK_MCU_ARMPLL_BUS_SEL>,



From angelogioacchino.delregno at collabora.com  Mon Sep 23 01:37:49 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Mon, 23 Sep 2024 10:37:49 +0200
Subject: [PATCH 3/5] nvmem: mtk-efuse: Enable postprocess for mt8188 GPU
 speed binning
In-Reply-To: <20240920134111.19744-4-pablo.sun@mediatek.com>
References: <20240920134111.19744-1-pablo.sun@mediatek.com>
 <20240920134111.19744-4-pablo.sun@mediatek.com>
Message-ID: <866d7cd8-856b-431a-9408-527cdc021922@collabora.com>

Il 20/09/24 15:41, Pablo Sun ha scritto:
> Similar to mt8186, the efuse data for mt8188's GPU speed binning
> requires post-process to convert the bit field format expected
> by the OPP table.
> 
> Since mt8188 efuse is not compatible to mt8186, add a new compatible
> entry for mt8188 and enable postprocess.
> 
> Signed-off-by: Pablo Sun <pablo.sun at mediatek.com>
> ---
>   drivers/nvmem/mtk-efuse.c | 5 +++++
>   1 file changed, 5 insertions(+)
> 
> diff --git a/drivers/nvmem/mtk-efuse.c b/drivers/nvmem/mtk-efuse.c
> index 9caf04667341..4984145025bb 100644
> --- a/drivers/nvmem/mtk-efuse.c
> +++ b/drivers/nvmem/mtk-efuse.c
> @@ -105,6 +105,10 @@ static const struct mtk_efuse_pdata mtk_mt8186_efuse_pdata = {
>   	.uses_post_processing = true,
>   };
>   
> +static const struct mtk_efuse_pdata mtk_mt8188_efuse_pdata = {
> +	.uses_post_processing = true,
> +};
> +
>   static const struct mtk_efuse_pdata mtk_efuse_pdata = {
>   	.uses_post_processing = false,
>   };
> @@ -112,6 +116,7 @@ static const struct mtk_efuse_pdata mtk_efuse_pdata = {
>   static const struct of_device_id mtk_efuse_of_match[] = {
>   	{ .compatible = "mediatek,mt8173-efuse", .data = &mtk_efuse_pdata },
>   	{ .compatible = "mediatek,mt8186-efuse", .data = &mtk_mt8186_efuse_pdata },
> +	{ .compatible = "mediatek,mt8188-efuse", .data = &mtk_mt8188_efuse_pdata },

Please reuse mtk_mt8186_efuse_pdata. There's no need to add a duplicate.

{ .compatible = "mediatek,mt8188-efuse", .data = &mtk_mt8186_efuse_pdata },

Cheers,
Angelo

>   	{ .compatible = "mediatek,efuse", .data = &mtk_efuse_pdata },
>   	{/* sentinel */},
>   };




From angelogioacchino.delregno at collabora.com  Mon Sep 23 01:38:19 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Mon, 23 Sep 2024 10:38:19 +0200
Subject: [PATCH 2/5] clk: mediatek: clk-mt8188-topckgen: Remove univpll
 from parents of mfg_core_tmp
In-Reply-To: <20240920134111.19744-3-pablo.sun@mediatek.com>
References: <20240920134111.19744-1-pablo.sun@mediatek.com>
 <20240920134111.19744-3-pablo.sun@mediatek.com>
Message-ID: <3f5055ad-924b-423e-88a6-9e5d46cd8c13@collabora.com>

Il 20/09/24 15:41, Pablo Sun ha scritto:
> Same as MT8195, MT8188 GPU clock is primarly supplied by the dedicated
> mfgpll. The clock "mfg_core_tmp" is only used as an alt clock when
> setting mfgpll clock rate.
> 
> If we keep the univpll parents from mfg_core_tmp, when setting
> GPU frequency to 390000000, the common clock framework would switch
> the parent to univpll, instead of setting mfgpll to 390000000:
> 
>      mfgpll                            0        0        0   949999756
>      univpll                           2        2        0  2340000000
>         univpll_d6                     1        1        0   390000000
>            top_mfg_core_tmp            1        1        0   390000000
>               mfg_ck_fast_ref          1        1        0   390000000
>                  mfgcfg_bg3d           1        1        0   390000000
> 
> This results in failures when subsequent devfreq operations need to
> switch to other frequencies. So remove univpll from the parent list.
> 
> This solution is taken from commit 72d38ed720e9 ("clk: mediatek:
> clk-mt8195-topckgen: Drop univplls from mfg mux parents")
> 
> Signed-off-by: Pablo Sun <pablo.sun at mediatek.com>

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>




From angelogioacchino.delregno at collabora.com  Mon Sep 23 01:39:43 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Mon, 23 Sep 2024 10:39:43 +0200
Subject: [PATCH 4/5] arm64: dts: mediatek: mt8188: Add efuse for GPU speed
 binning
In-Reply-To: <20240920134111.19744-5-pablo.sun@mediatek.com>
References: <20240920134111.19744-1-pablo.sun@mediatek.com>
 <20240920134111.19744-5-pablo.sun@mediatek.com>
Message-ID: <ae69d0f6-97ff-478f-8e58-662fe4a923f4@collabora.com>

Il 20/09/24 15:41, Pablo Sun ha scritto:
> The OPP table of mt8188 GPU contains duplicated frequencies
> for different speed bins.
> 
> In order to support OPP table, we need to provide the speed bin info
> in the efuse data so the GPU driver could properly set the
> supported hardware speed bin.
> 
> Signed-off-by: Pablo Sun <pablo.sun at mediatek.com>

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>




From angelogioacchino.delregno at collabora.com  Mon Sep 23 01:39:45 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Mon, 23 Sep 2024 10:39:45 +0200
Subject: [PATCH 1/5] arm64: dts: mediatek: mt8188: Fix wrong clock
 provider in MFG1 power domain
In-Reply-To: <20240920134111.19744-2-pablo.sun@mediatek.com>
References: <20240920134111.19744-1-pablo.sun@mediatek.com>
 <20240920134111.19744-2-pablo.sun@mediatek.com>
Message-ID: <57460379-f227-4032-b353-c0400e582dff@collabora.com>

Il 20/09/24 15:41, Pablo Sun ha scritto:
> The clock index "CLK_APMIXED_MFGPLL" belongs to the "apmixedsys" provider,
> so fix the index.
> 
> In addition, add a "mfg1" label so following commits could set
> domain-supply for MFG1 power domain.
> 
> Fixes: b8369604050b ("UPSTREAM: arm64: dts: mediatek: mt8188: Add support for SoC power domains")
> Signed-off-by: Pablo Sun <pablo.sun at mediatek.com>

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>




From angelogioacchino.delregno at collabora.com  Mon Sep 23 01:45:51 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Mon, 23 Sep 2024 10:45:51 +0200
Subject: [PATCH 5/5] arm64: dts: mediatek: mt8390-genio-700-evk: Enable
 Mali GPU
In-Reply-To: <20240920134111.19744-6-pablo.sun@mediatek.com>
References: <20240920134111.19744-1-pablo.sun@mediatek.com>
 <20240920134111.19744-6-pablo.sun@mediatek.com>
Message-ID: <eb17085d-78ff-4833-a4de-17b9327d776c@collabora.com>

Il 20/09/24 15:41, Pablo Sun ha scritto:
> Configure GPU regulator supplies and enable GPU for GENIO 700 EVK.
> 
> The GPU in MT8390 & MT8188 has two power inputs: "DVDD_GPU" and
> "DVDD_SRAM_GPU". In Genio 700 EVK, DVDD_GPU is supplied by
> mt6359_vproc2_buck_reg, and DVDD_SRAM_GPU is supplied by
> mt6359_vsram_others_ldo_reg.
> 
> According to section 5.2 "Recommended Operating Conditions" in
> MT8390 IoT Application Processor Datasheet v1.9, The recommended
> operating voltage ranges are:
> 
> - DVDD_GPU: min 0.55V, max 0.86V, typical 0.75V
> - DVDD_SRAM_GPU: min 0.71V, max 0.92V, typical 0.85V
> 
> In this commit, we set DVDD_SRAM_GPU to typical 0.85V. It is possbile
> to couple it to the DVDD_GPU in future patches.
> 
> Signed-off-by: Pablo Sun <pablo.sun at mediatek.com>

Is there any real difference between MT8390 and MT8188 in terms of the GPU OPPs?

I see that on MT8188, frequencies up to 880MHz want a DVDD_SRAM_GPU of 0.750V,
then 0.775/0.762/0.750 (bin1-4/5/6) on 915MHz, and 0.800/0.775/0.750 (bin1-4/5/6)
on 950MHz.

Those never call for 0.850V...! So is MT8188 (Chromebooks) wrong, or is MT8390
different in that?

Cheers,
Angelo

> ---
>   .../dts/mediatek/mt8390-genio-700-evk.dts     | 24 +++++++++++++++++++
>   1 file changed, 24 insertions(+)
> 
> diff --git a/arch/arm64/boot/dts/mediatek/mt8390-genio-700-evk.dts b/arch/arm64/boot/dts/mediatek/mt8390-genio-700-evk.dts
> index 1474bef7e754..a1d6f4cd4e5f 100644
> --- a/arch/arm64/boot/dts/mediatek/mt8390-genio-700-evk.dts
> +++ b/arch/arm64/boot/dts/mediatek/mt8390-genio-700-evk.dts
> @@ -190,6 +190,11 @@ usb_p2_vbus: regulator-10 {
>   	};
>   };
>   
> +&gpu {
> +	mali-supply = <&mt6359_vproc2_buck_reg>;
> +	status = "okay";
> +};
> +
>   &i2c0 {
>   	pinctrl-names = "default";
>   	pinctrl-0 = <&i2c0_pins>;
> @@ -253,6 +258,14 @@ &i2c6 {
>   	status = "okay";
>   };
>   
> +&mfg0 {
> +	domain-supply = <&mt6359_vproc2_buck_reg>;
> +};
> +
> +&mfg1 {
> +	domain-supply = <&mt6359_vsram_others_ldo_reg>;
> +};
> +
>   &mmc0 {
>   	status = "okay";
>   	pinctrl-names = "default", "state_uhs";
> @@ -314,6 +327,11 @@ &mt6359_vpa_buck_reg {
>   	regulator-max-microvolt = <3100000>;
>   };
>   
> +&mt6359_vproc2_buck_reg {
> +	regulator-min-microvolt = <550000>;
> +	regulator-max-microvolt = <860000>;
> +};
> +
>   &mt6359_vpu_buck_reg {
>   	regulator-always-on;
>   };
> @@ -326,6 +344,12 @@ &mt6359_vsim1_ldo_reg {
>   	regulator-enable-ramp-delay = <480>;
>   };
>   
> +/* for GPU SRAM */
> +&mt6359_vsram_others_ldo_reg {
> +	regulator-min-microvolt = <850000>;
> +	regulator-max-microvolt = <850000>;
> +};
> +
>   &mt6359_vufs_ldo_reg {
>   	regulator-always-on;
>   };



From Chris.Lu at mediatek.com  Mon Sep 23 01:46:47 2024
From: Chris.Lu at mediatek.com (=?utf-8?B?Q2hyaXMgTHUgKOmZuOeomuazkyk=?=)
Date: Mon, 23 Sep 2024 08:46:47 +0000
Subject: [PATCH v2 3/4] Bluetooth: btusb: mediatek: add intf release flow
 when usb disconnect
In-Reply-To: <CABBYNZJ62dw0JHTrNK7xe9_kO61_gH9+XGPm+UEWw4CGRVCnnQ@mail.gmail.com>
References: <20240919074925.22860-1-chris.lu@mediatek.com>
	 <20240919074925.22860-4-chris.lu@mediatek.com>
	 <CABBYNZJ62dw0JHTrNK7xe9_kO61_gH9+XGPm+UEWw4CGRVCnnQ@mail.gmail.com>
Message-ID: <24753c7a74fad98d6a7a0f6a032add50f829493f.camel@mediatek.com>

Hi Luiz,

On Fri, 2024-09-20 at 10:54 -0400, Luiz Augusto von Dentz wrote:
>  	 
> External email : Please do not click links or open attachments until
> you have verified the sender or the content.
>  Hi Chris,
> 
> On Thu, Sep 19, 2024 at 3:49?AM Chris Lu <chris.lu at mediatek.com>
> wrote:
> >
> > MediaTek claim an special usb intr interface for ISO data
> transmission.
> > The interface need to be released before unregistering hci device
> when
> > usb disconnect. Removing BT usb dongle without properly releasing
> the
> > interface may cause Kernel panic while unregister hci device.
> >
> > Signed-off-by: Chris Lu <chris.lu at mediatek.com>
> > ---
> >  drivers/bluetooth/btusb.c | 12 +++++++-----
> >  1 file changed, 7 insertions(+), 5 deletions(-)
> >
> > diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
> > index dfc42bdc8aaf..37e67b451b34 100644
> > --- a/drivers/bluetooth/btusb.c
> > +++ b/drivers/bluetooth/btusb.c
> > @@ -2614,9 +2614,9 @@ static void btusb_mtk_claim_iso_intf(struct
> btusb_data *data)
> >         set_bit(BTMTK_ISOPKT_OVER_INTR, &btmtk_data->flags);
> >  }
> >
> > -static void btusb_mtk_release_iso_intf(struct btusb_data *data)
> > +static int btusb_mtk_release_iso_intf(struct hci_dev *hdev)
> >  {
> > -       struct btmtk_data *btmtk_data = hci_get_priv(data->hdev);
> > +       struct btmtk_data *btmtk_data = hci_get_priv(hdev);
> >
> >         if (btmtk_data->isopkt_intf) {
> >                 usb_kill_anchored_urbs(&btmtk_data->isopkt_anchor);
> > @@ -2630,6 +2630,8 @@ static void btusb_mtk_release_iso_intf(struct
> btusb_data *data)
> >         }
> >
> >         clear_bit(BTMTK_ISOPKT_OVER_INTR, &btmtk_data->flags);
> > +
> > +       return 0;
> >  }
> >
> >  static int btusb_mtk_reset(struct hci_dev *hdev, void *rst_data)
> > @@ -2649,7 +2651,7 @@ static int btusb_mtk_reset(struct hci_dev
> *hdev, void *rst_data)
> >                 return err;
> >
> >         if (test_bit(BTMTK_ISOPKT_RUNNING, &btmtk_data->flags))
> > -               btusb_mtk_release_iso_intf(data);
> > +               btusb_mtk_release_iso_intf(hdev);
> 
> We can probably move the check for BTMTK_ISOPKT_RUNNING into
> btusb_mtk_release_iso_intf to avoid having to duplicate it whenever
> calling btusb_mtk_release_iso_intf.
> 

Yes, condition check here is redundant, Keep the check in
btusb_mtk_release_iso_intf is better.

> >
> >         btusb_stop_traffic(data);
> >         usb_kill_anchored_urbs(&data->tx_anchor);
> > @@ -2703,14 +2705,13 @@ static int btusb_mtk_setup(struct hci_dev
> *hdev)
> >
> >  static int btusb_mtk_shutdown(struct hci_dev *hdev)
> >  {
> > -       struct btusb_data *data = hci_get_drvdata(hdev);
> >         struct btmtk_data *btmtk_data = hci_get_priv(hdev);
> >         int ret;
> >
> >         ret = btmtk_usb_shutdown(hdev);
> >
> >         if (test_bit(BTMTK_ISOPKT_RUNNING, &btmtk_data->flags))
> > -               btusb_mtk_release_iso_intf(data);
> > +               btusb_mtk_release_iso_intf(hdev);
> 
> Ditto.
> 
remove redundant check.

> >         return ret;
> >  }
> > @@ -3824,6 +3825,7 @@ static int btusb_probe(struct usb_interface
> *intf,
> >                 data->recv_acl = btmtk_usb_recv_acl;
> >                 data->suspend = btmtk_usb_suspend;
> >                 data->resume = btmtk_usb_resume;
> > +               data->disconnect = btusb_mtk_release_iso_intf;
> 
> I'd wrap (e.g. btmtk_usb_disconnect) the call to
> btusb_mtk_release_iso_intf since that is only meant to release the
> ISO
> endpoint.
> 
Add a new function "btusb_mtk_disconnect". Since this function will use
btusb_data which is defined in btusb.c only, I'll also define this
function in btusb.c.

Thanks for your advice. I'll submit v3 later.

Best regards,
Chris Lu

> >         }
> >
> >         if (id->driver_info & BTUSB_SWAVE) {
> > --
> > 2.18.0
> >
> 
> 
> -- 
> Luiz Augusto von Dentz

From chris.lu at mediatek.com  Mon Sep 23 01:47:05 2024
From: chris.lu at mediatek.com (Chris Lu)
Date: Mon, 23 Sep 2024 16:47:05 +0800
Subject: [PATCH v3 4/4] Bluetooth: btusb: mediatek: change the conditions for ISO interface
In-Reply-To: <20240923084705.14123-1-chris.lu@mediatek.com>
References: <20240923084705.14123-1-chris.lu@mediatek.com>
Message-ID: <20240923084705.14123-5-chris.lu@mediatek.com>

Change conditions for Bluetooth driver claiming and releasing usb
ISO interface for MediaTek ISO data transmission.

Signed-off-by: Chris Lu <chris.lu at mediatek.com>
---
 drivers/bluetooth/btusb.c | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
index a434aefe68f2..9affe4f81294 100644
--- a/drivers/bluetooth/btusb.c
+++ b/drivers/bluetooth/btusb.c
@@ -2618,7 +2618,7 @@ static void btusb_mtk_release_iso_intf(struct hci_dev *hdev)
 {
 	struct btmtk_data *btmtk_data = hci_get_priv(hdev);
 
-	if (btmtk_data->isopkt_intf) {
+	if (test_bit(BTMTK_ISOPKT_OVER_INTR, &btmtk_data->flags)) {
 		usb_kill_anchored_urbs(&btmtk_data->isopkt_anchor);
 		clear_bit(BTMTK_ISOPKT_RUNNING, &btmtk_data->flags);
 
@@ -2658,8 +2658,8 @@ static int btusb_mtk_reset(struct hci_dev *hdev, void *rst_data)
 	if (err < 0)
 		return err;
 
-	if (test_bit(BTMTK_ISOPKT_RUNNING, &btmtk_data->flags))
-		btusb_mtk_release_iso_intf(hdev);
+	/* Release MediaTek ISO data interface */
+	btusb_mtk_release_iso_intf(hdev);
 
 	btusb_stop_traffic(data);
 	usb_kill_anchored_urbs(&data->tx_anchor);
@@ -2704,22 +2704,22 @@ static int btusb_mtk_setup(struct hci_dev *hdev)
 	btmtk_data->reset_sync = btusb_mtk_reset;
 
 	/* Claim ISO data interface and endpoint */
-	btmtk_data->isopkt_intf = usb_ifnum_to_if(data->udev, MTK_ISO_IFNUM);
-	if (btmtk_data->isopkt_intf)
+	if (!test_bit(BTMTK_ISOPKT_OVER_INTR, &btmtk_data->flags)) {
+		btmtk_data->isopkt_intf = usb_ifnum_to_if(data->udev, MTK_ISO_IFNUM);
 		btusb_mtk_claim_iso_intf(data);
+	}
 
 	return btmtk_usb_setup(hdev);
 }
 
 static int btusb_mtk_shutdown(struct hci_dev *hdev)
 {
-	struct btmtk_data *btmtk_data = hci_get_priv(hdev);
 	int ret;
 
 	ret = btmtk_usb_shutdown(hdev);
 
-	if (test_bit(BTMTK_ISOPKT_RUNNING, &btmtk_data->flags))
-		btusb_mtk_release_iso_intf(hdev);
+	/* Release MediaTek iso interface after shutdown */
+	btusb_mtk_release_iso_intf(hdev);
 
 	return ret;
 }
-- 
2.18.0



From chris.lu at mediatek.com  Mon Sep 23 01:47:01 2024
From: chris.lu at mediatek.com (Chris Lu)
Date: Mon, 23 Sep 2024 16:47:01 +0800
Subject: [PATCH v3 0/4] Bluetooth: btusb: Mediatek ISO interface claim/release adjustment
Message-ID: <20240923084705.14123-1-chris.lu@mediatek.com>

MediaTek performs some test on the platform which can support LE audio and
ISO data transmission with kernel driver. We found the additional interface
claim and release flow issue need some adjustment.

These patches mainly add a callback function within the usb_disconnect
function to prevent a kernel panic caused by interfaces not being released
when the BT USB dongle is physically removed. Additionally, the condition
for claiming/releasing ISO usb interface have also been adjusted to make
driver works as expected.

---
v2: fix commit message typo and over maximum chars per line warning.
v3: [patch 3/4] add new function btusb_mtk_disconnect for releasing MediaTek
                ISO interface
    [patch 4/4] remove redundant condition statements
---

Chris Lu (4):
  Bluetooth: btusb: mediatek: move Bluetooth power off command position
  Bluetooth: btusb: mediatek: add callback function in btusb_disconnect
  Bluetooth: btusb: mediatek: add intf release flow when usb disconnect
  Bluetooth: btusb: mediatek: change the conditions for ISO interface

 drivers/bluetooth/btusb.c | 41 +++++++++++++++++++++++++++------------
 1 file changed, 29 insertions(+), 12 deletions(-)

-- 
2.18.0



From chris.lu at mediatek.com  Mon Sep 23 01:47:02 2024
From: chris.lu at mediatek.com (Chris Lu)
Date: Mon, 23 Sep 2024 16:47:02 +0800
Subject: [PATCH v3 1/4] Bluetooth: btusb: mediatek: move Bluetooth power off command position
In-Reply-To: <20240923084705.14123-1-chris.lu@mediatek.com>
References: <20240923084705.14123-1-chris.lu@mediatek.com>
Message-ID: <20240923084705.14123-2-chris.lu@mediatek.com>

Move MediaTek Bluetooth power off command before releasing
usb ISO interface.

Signed-off-by: Chris Lu <chris.lu at mediatek.com>
---
 drivers/bluetooth/btusb.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
index 6c9c761d5b93..6cf1729a8225 100644
--- a/drivers/bluetooth/btusb.c
+++ b/drivers/bluetooth/btusb.c
@@ -2704,11 +2704,14 @@ static int btusb_mtk_shutdown(struct hci_dev *hdev)
 {
 	struct btusb_data *data = hci_get_drvdata(hdev);
 	struct btmtk_data *btmtk_data = hci_get_priv(hdev);
+	int ret;
+
+	ret = btmtk_usb_shutdown(hdev);
 
 	if (test_bit(BTMTK_ISOPKT_RUNNING, &btmtk_data->flags))
 		btusb_mtk_release_iso_intf(data);
 
-	return btmtk_usb_shutdown(hdev);
+	return ret;
 }
 
 #ifdef CONFIG_PM
-- 
2.18.0



From chris.lu at mediatek.com  Mon Sep 23 01:47:03 2024
From: chris.lu at mediatek.com (Chris Lu)
Date: Mon, 23 Sep 2024 16:47:03 +0800
Subject: [PATCH v3 2/4] Bluetooth: btusb: mediatek: add callback function in btusb_disconnect
In-Reply-To: <20240923084705.14123-1-chris.lu@mediatek.com>
References: <20240923084705.14123-1-chris.lu@mediatek.com>
Message-ID: <20240923084705.14123-3-chris.lu@mediatek.com>

Add disconnect callback function in btusb_disconnect which is reserved
for vendor specific usage before deregister hci in btusb_disconnect.

Signed-off-by: Chris Lu <chris.lu at mediatek.com>
---
 drivers/bluetooth/btusb.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
index 6cf1729a8225..dfc42bdc8aaf 100644
--- a/drivers/bluetooth/btusb.c
+++ b/drivers/bluetooth/btusb.c
@@ -846,6 +846,7 @@ struct btusb_data {
 
 	int (*suspend)(struct hci_dev *hdev);
 	int (*resume)(struct hci_dev *hdev);
+	int (*disconnect)(struct hci_dev *hdev);
 
 	int oob_wake_irq;   /* irq for out-of-band wake-on-bt */
 	unsigned cmd_timeout_cnt;
@@ -4011,6 +4012,9 @@ static void btusb_disconnect(struct usb_interface *intf)
 	if (data->diag)
 		usb_set_intfdata(data->diag, NULL);
 
+	if (data->disconnect)
+		data->disconnect(hdev);
+
 	hci_unregister_dev(hdev);
 
 	if (intf == data->intf) {
-- 
2.18.0



From chris.lu at mediatek.com  Mon Sep 23 01:47:04 2024
From: chris.lu at mediatek.com (Chris Lu)
Date: Mon, 23 Sep 2024 16:47:04 +0800
Subject: [PATCH v3 3/4] Bluetooth: btusb: mediatek: add intf release flow when usb disconnect
In-Reply-To: <20240923084705.14123-1-chris.lu@mediatek.com>
References: <20240923084705.14123-1-chris.lu@mediatek.com>
Message-ID: <20240923084705.14123-4-chris.lu@mediatek.com>

MediaTek claim an special usb intr interface for ISO data transmission.
The interface need to be released before unregistering hci device when
usb disconnect. Removing BT usb dongle without properly releasing the
interface may cause Kernel panic while unregister hci device.

Signed-off-by: Chris Lu <chris.lu at mediatek.com>
---
 drivers/bluetooth/btusb.c | 20 +++++++++++++++-----
 1 file changed, 15 insertions(+), 5 deletions(-)

diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
index dfc42bdc8aaf..a434aefe68f2 100644
--- a/drivers/bluetooth/btusb.c
+++ b/drivers/bluetooth/btusb.c
@@ -2614,9 +2614,9 @@ static void btusb_mtk_claim_iso_intf(struct btusb_data *data)
 	set_bit(BTMTK_ISOPKT_OVER_INTR, &btmtk_data->flags);
 }
 
-static void btusb_mtk_release_iso_intf(struct btusb_data *data)
+static void btusb_mtk_release_iso_intf(struct hci_dev *hdev)
 {
-	struct btmtk_data *btmtk_data = hci_get_priv(data->hdev);
+	struct btmtk_data *btmtk_data = hci_get_priv(hdev);
 
 	if (btmtk_data->isopkt_intf) {
 		usb_kill_anchored_urbs(&btmtk_data->isopkt_anchor);
@@ -2632,6 +2632,16 @@ static void btusb_mtk_release_iso_intf(struct btusb_data *data)
 	clear_bit(BTMTK_ISOPKT_OVER_INTR, &btmtk_data->flags);
 }
 
+static int btusb_mtk_disconnect(struct hci_dev *hdev)
+{
+	/* This function describes the specific additional steps taken by MediaTek
+	 * when Bluetooth usb driver's resume function is called.
+	 */
+	btusb_mtk_release_iso_intf(hdev);
+
+	return 0;
+}
+
 static int btusb_mtk_reset(struct hci_dev *hdev, void *rst_data)
 {
 	struct btusb_data *data = hci_get_drvdata(hdev);
@@ -2649,7 +2659,7 @@ static int btusb_mtk_reset(struct hci_dev *hdev, void *rst_data)
 		return err;
 
 	if (test_bit(BTMTK_ISOPKT_RUNNING, &btmtk_data->flags))
-		btusb_mtk_release_iso_intf(data);
+		btusb_mtk_release_iso_intf(hdev);
 
 	btusb_stop_traffic(data);
 	usb_kill_anchored_urbs(&data->tx_anchor);
@@ -2703,14 +2713,13 @@ static int btusb_mtk_setup(struct hci_dev *hdev)
 
 static int btusb_mtk_shutdown(struct hci_dev *hdev)
 {
-	struct btusb_data *data = hci_get_drvdata(hdev);
 	struct btmtk_data *btmtk_data = hci_get_priv(hdev);
 	int ret;
 
 	ret = btmtk_usb_shutdown(hdev);
 
 	if (test_bit(BTMTK_ISOPKT_RUNNING, &btmtk_data->flags))
-		btusb_mtk_release_iso_intf(data);
+		btusb_mtk_release_iso_intf(hdev);
 
 	return ret;
 }
@@ -3824,6 +3833,7 @@ static int btusb_probe(struct usb_interface *intf,
 		data->recv_acl = btmtk_usb_recv_acl;
 		data->suspend = btmtk_usb_suspend;
 		data->resume = btmtk_usb_resume;
+		data->disconnect = btusb_mtk_disconnect;
 	}
 
 	if (id->driver_info & BTUSB_SWAVE) {
-- 
2.18.0



From fshao at chromium.org  Mon Sep 23 02:07:40 2024
From: fshao at chromium.org (Fei Shao)
Date: Mon, 23 Sep 2024 17:07:40 +0800
Subject: [PATCH] media: i2c: improve suspend/resume switch performance for
 GT9769 VCM driver
In-Reply-To: <20240831055328.22482-1-zhi.mao@mediatek.com>
References: <20240831055328.22482-1-zhi.mao@mediatek.com>
Message-ID: <CAC=S1nh76iKhMV4roBe4mLTrq-eHqz-3-fYWzNcWAETvj-JETA@mail.gmail.com>

Hi Zhi,

On Sat, Aug 31, 2024 at 1:54?PM Zhi Mao <zhi.mao at mediatek.com> wrote:

Suggestion for the new patch title:
  media: i2c: dw9768: Use runtime PM autosuspend

to better describe "what" this patch does to the DW9768 driver, not "why".
Also there's nothing to do with GT9769 in this patch.

>
> Chromebook camera AP can switch between video and photo mode,
> the behavior corresponding to VCM is suspend and resume,
> it will cause camera preview is not smooth during switching operation.
> We use autosuspend function can fix this issue.
>
> Signed-off-by: Zhi Mao <zhi.mao at mediatek.com>
> ---
>  drivers/media/i2c/dw9768.c | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/media/i2c/dw9768.c b/drivers/media/i2c/dw9768.c
> index 18ef2b35c9aa..7449d29df901 100644
> --- a/drivers/media/i2c/dw9768.c
> +++ b/drivers/media/i2c/dw9768.c
> @@ -374,7 +374,7 @@ static int dw9768_open(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh)
>
>  static int dw9768_close(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh)
>  {
> -       pm_runtime_put(sd->dev);

Call pm_runtime_mark_last_busy() to update the power.last_busy field
for autosuspend to work properly.

> +       pm_runtime_put_sync_autosuspend(sd->dev);

Use pm_runtime_put_autosuspend().
Don't switch to the synchronized variant without reasons.

>
>         return 0;
>  }
> @@ -490,6 +490,7 @@ static int dw9768_probe(struct i2c_client *client)
>                 goto err_power_off;
>         }
>
> +       pm_runtime_use_autosuspend(dev);

Add pm_runtime_set_autosuspend_delay() before calling
pm_runtime_use_autosuspend() to avoid rapid power state bouncing.

Regards,
Fei



>         pm_runtime_idle(dev);
>
>         return 0;
> --
> 2.46.0
>
>


From pablo.sun at mediatek.com  Mon Sep 23 02:20:51 2024
From: pablo.sun at mediatek.com (Pablo Sun)
Date: Mon, 23 Sep 2024 17:20:51 +0800
Subject: [PATCH 3/5] nvmem: mtk-efuse: Enable postprocess for mt8188 GPU
 speed binning
In-Reply-To: <866d7cd8-856b-431a-9408-527cdc021922@collabora.com>
References: <20240920134111.19744-1-pablo.sun@mediatek.com>
 <20240920134111.19744-4-pablo.sun@mediatek.com>
 <866d7cd8-856b-431a-9408-527cdc021922@collabora.com>
Message-ID: <2914fee8-c94a-fecb-a69c-0d58a40caded@mediatek.com>

Hi Angelo,

On 9/23/24 16:37, AngeloGioacchino Del Regno wrote:
[snipped]
> 
> Please reuse mtk_mt8186_efuse_pdata. There's no need to add a duplicate.
> 
> { .compatible = "mediatek,mt8188-efuse", .data = &mtk_mt8186_efuse_pdata },

Thanks, will fix in v2.

Best regards,
Pablo





From angelogioacchino.delregno at collabora.com  Mon Sep 23 02:41:41 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Mon, 23 Sep 2024 11:41:41 +0200
Subject: [PATCH] PCI: mediatek-gen3: Avoid PCIe resetting for Airoha
 EN7581 SoC
In-Reply-To: <20240920-pcie-en7581-rst-fix-v1-1-1043fb63ffc9@kernel.org>
References: <20240920-pcie-en7581-rst-fix-v1-1-1043fb63ffc9@kernel.org>
Message-ID: <d8941149-9125-4fe2-a1c0-ab29223a0c87@collabora.com>

Il 20/09/24 10:26, Lorenzo Bianconi ha scritto:
> The PCIe controller available on the EN7581 SoC does not support reset
> via the following lines:
> - PCIE_MAC_RSTB
> - PCIE_PHY_RSTB
> - PCIE_BRG_RSTB
> - PCIE_PE_RSTB
> 
> Introduce the reset callback in order to avoid resetting the PCIe port
> for Airoha EN7581 SoC.
> 

EN7581 doesn't support pulling up/down PERST#?!
That looks definitely odd, as that signal is part of the PCI-Express CEM spec.

Besides, there's another PERST# assertion at mtk_pcie_suspend_noirq()...

Cheers,
Angelo

> Tested-by: Hui Ma <hui.ma at airoha.com>
> Signed-off-by: Lorenzo Bianconi <lorenzo at kernel.org>
> ---
>   drivers/pci/controller/pcie-mediatek-gen3.c | 44 ++++++++++++++++++-----------
>   1 file changed, 28 insertions(+), 16 deletions(-)
> 
> diff --git a/drivers/pci/controller/pcie-mediatek-gen3.c b/drivers/pci/controller/pcie-mediatek-gen3.c
> index 5c19abac74e8..9cea67e92d98 100644
> --- a/drivers/pci/controller/pcie-mediatek-gen3.c
> +++ b/drivers/pci/controller/pcie-mediatek-gen3.c
> @@ -128,10 +128,12 @@ struct mtk_gen3_pcie;
>   /**
>    * struct mtk_gen3_pcie_pdata - differentiate between host generations
>    * @power_up: pcie power_up callback
> + * @reset: pcie reset callback
>    * @phy_resets: phy reset lines SoC data.
>    */
>   struct mtk_gen3_pcie_pdata {
>   	int (*power_up)(struct mtk_gen3_pcie *pcie);
> +	void (*reset)(struct mtk_gen3_pcie *pcie);
>   	struct {
>   		const char *id[MAX_NUM_PHY_RESETS];
>   		int num_resets;
> @@ -373,6 +375,28 @@ static void mtk_pcie_enable_msi(struct mtk_gen3_pcie *pcie)
>   	writel_relaxed(val, pcie->base + PCIE_INT_ENABLE_REG);
>   }
>   
> +static void mtk_pcie_reset(struct mtk_gen3_pcie *pcie)
> +{
> +	u32 val;
> +
> +	/* Assert all reset signals */
> +	val = readl_relaxed(pcie->base + PCIE_RST_CTRL_REG);
> +	val |= PCIE_MAC_RSTB | PCIE_PHY_RSTB | PCIE_BRG_RSTB | PCIE_PE_RSTB;
> +	writel_relaxed(val, pcie->base + PCIE_RST_CTRL_REG);
> +
> +	/*
> +	 * Described in PCIe CEM specification sections 2.2 (PERST# Signal)
> +	 * and 2.2.1 (Initial Power-Up (G3 to S0)).
> +	 * The deassertion of PERST# should be delayed 100ms (TPVPERL)
> +	 * for the power and clock to become stable.
> +	 */
> +	msleep(100);
> +
> +	/* De-assert reset signals */
> +	val &= ~(PCIE_MAC_RSTB | PCIE_PHY_RSTB | PCIE_BRG_RSTB | PCIE_PE_RSTB);
> +	writel_relaxed(val, pcie->base + PCIE_RST_CTRL_REG);
> +}
> +
>   static int mtk_pcie_startup_port(struct mtk_gen3_pcie *pcie)
>   {
>   	struct resource_entry *entry;
> @@ -402,22 +426,9 @@ static int mtk_pcie_startup_port(struct mtk_gen3_pcie *pcie)
>   	val |= PCIE_DISABLE_DVFSRC_VLT_REQ;
>   	writel_relaxed(val, pcie->base + PCIE_MISC_CTRL_REG);
>   
> -	/* Assert all reset signals */
> -	val = readl_relaxed(pcie->base + PCIE_RST_CTRL_REG);
> -	val |= PCIE_MAC_RSTB | PCIE_PHY_RSTB | PCIE_BRG_RSTB | PCIE_PE_RSTB;
> -	writel_relaxed(val, pcie->base + PCIE_RST_CTRL_REG);
> -
> -	/*
> -	 * Described in PCIe CEM specification sections 2.2 (PERST# Signal)
> -	 * and 2.2.1 (Initial Power-Up (G3 to S0)).
> -	 * The deassertion of PERST# should be delayed 100ms (TPVPERL)
> -	 * for the power and clock to become stable.
> -	 */
> -	msleep(100);
> -
> -	/* De-assert reset signals */
> -	val &= ~(PCIE_MAC_RSTB | PCIE_PHY_RSTB | PCIE_BRG_RSTB | PCIE_PE_RSTB);
> -	writel_relaxed(val, pcie->base + PCIE_RST_CTRL_REG);
> +	/* Reset the PCIe port if requested by the hw */
> +	if (pcie->soc->reset)
> +		pcie->soc->reset(pcie);
>   
>   	/* Check if the link is up or not */
>   	err = readl_poll_timeout(pcie->base + PCIE_LINK_STATUS_REG, val,
> @@ -1207,6 +1218,7 @@ static const struct dev_pm_ops mtk_pcie_pm_ops = {
>   
>   static const struct mtk_gen3_pcie_pdata mtk_pcie_soc_mt8192 = {
>   	.power_up = mtk_pcie_power_up,
> +	.reset = mtk_pcie_reset,
>   	.phy_resets = {
>   		.id[0] = "phy",
>   		.num_resets = 1,
> 
> ---
> base-commit: f2024903cb387971abdbc6398a430e735a9b394c
> change-id: 20240920-pcie-en7581-rst-fix-8161658c13c4
> 
> Best regards,



From angelogioacchino.delregno at collabora.com  Mon Sep 23 02:53:06 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Mon, 23 Sep 2024 11:53:06 +0200
Subject: [PATCH v6 2/2] dt-bindings: mfd: mediatek: mt6397: Convert to DT
 schema format
In-Reply-To: <20240918064955.6518-2-macpaul.lin@mediatek.com>
References: <20240918064955.6518-1-macpaul.lin@mediatek.com>
 <20240918064955.6518-2-macpaul.lin@mediatek.com>
Message-ID: <122e5099-4f0b-41cc-93c9-7ccdfc0207ad@collabora.com>

Il 18/09/24 08:49, Macpaul Lin ha scritto:
> Convert the mfd: mediatek: mt6397 binding to DT schema format.
> 
> MT6323, MT6358, and MT6397 are PMIC devices with multiple function
> subdevices. They share a common PMIC design but have variations in
> subdevice combinations.
> 
> Key updates in this conversion:
> 
> 1. RTC:
>     - Convert rtc-mt6397.txt and merge into parent MT6397 PMIC DT schema.
> 
> 2. Regulators:
>     - Align to generic name "regulators".
>     - Update references from .txt to .yaml for mt6323, mt6358, and mt6397
>       regulators.
>     - Simplify regulator name labels in device tree examples.
> 
> 3. Audio Codec:
>     - Convert sound/mt6358.txt and merge into parent MT6397 PMIC DT schema.
>     - Align to generic name "audio-codec" for codec and sound subdevices.
>     - Add "mediatek,dmic-mode" and "Avdd-supply" properties.
> 
> 4. Clocks:
>     - Align to generic name "clocks" for clockbuffer subdevices.
> 
> 5. LEDs:
>     - Convert leds-mt6323.txt and merge into parent MT6397 PMIC DT schema.
>     - Update LED binding.
> 
> 6. Keys:
>     - Add detailed descriptions for power and home keys.
>     - Add compatible: mediatek,mt6358-keys.
> 
> 7. Power Controller:
>     - Convert mt6323-poweroff.txt and merge into parent MT6397 PMIC DT
>       schema.
>     - Add #power-domain-cells property to fix dt-binding check error.
>     - Clarify "BBPU" as "Baseband power up".
> 
> 8. Pinctrl:
>     - Align to generic name "pinctrl" instead of "pin-controller".
> 
> 9. Compatible:
>     - Drop "mediatek,mt6357" since there is a separated DT Schema
>       for PMIC MT6357.
> 
> 10. Examples:
>     - MT6323: Retain complete examples for this PMIC.
>     - MT6358 and MT6397: simplify settings in regulators.
>      - Preserve "audio-codec", "clocks", "pinctrl", "rtc", and "keys"
>        sections as they contain typical settings for different PMICs.
> 
> Additional updates:
> - MAINTAINERS: Add co-maintainers and reference to
>    mfd/mediatek,mt6397.yaml for LED and power-controller drivers.
> - input/mediatek,pmic-keys.yaml: Update reference to
>    mfd/mediatek,mt6397.yaml.
> 
> Signed-off-by: Sen Chu <sen.chu at mediatek.com>
> Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>




From ansuelsmth at gmail.com  Mon Sep 23 02:53:50 2024
From: ansuelsmth at gmail.com (Christian Marangi)
Date: Mon, 23 Sep 2024 11:53:50 +0200
Subject: [PATCH v4 0/5] Add mfd, pinctrl and pwm support to EN7581 SoC
In-Reply-To: <20240911-en7581-pinctrl-v4-0-60ac93d760bb@kernel.org>
References: <20240911-en7581-pinctrl-v4-0-60ac93d760bb@kernel.org>
Message-ID: <66f13ab0.5d0a0220.b0c27.b441@mx.google.com>

On Wed, Sep 11, 2024 at 09:50:00PM +0200, Lorenzo Bianconi wrote:
> Introduce airoha-mfd driver in order to load pinctrl and pwm drivers for
> EN7581 SoC. airoha-mfd is needed since both pinctrl and pwm drivers
> needs to access the same memory block (gpio memory region) to configure
> {gio,irq}_chip and pwm functionalities respectively, so model them as
> childs of a parent mfd driver.
> Current EN7581 pinctrl driver supports the following functionalities:
> - pin multiplexing via chip_scu syscon
> - pin pull-up, pull-down, open-drain, current strength,
>   {input,output}_enable, output_{low,high} via chip_scu syscon
> - gpio controller
> - irq controller
> 
> ---
> Changes in v4:
> - add 'Limitation' description in pwm driver
> - fix comments in pwm driver
> - rely on mfd->base __iomem pointer in pwm driver, modify register
>   offsets according to it and get rid of sgpio_cfg, flash_cfg and
>   cycle_cfg pointers
> - simplify register utility routines in pwm driver
> - use 'generator' instead of 'waveform' suffix for pwm routines
> - fix possible overflow calculating duty cycle in pwm driver
> - do not modify pwm state in free callback in pwm driver
> - cap the maximum period in pwm driver
> - do not allow inverse polarity in pwm driver
> - do not set of_xlate callback in the pwm driver and allow the stack to
>   do it
> - fix MAINTAINERS file for airoha pinctrl driver
> - fix undefined reference to __ffsdi2 in pinctrl driver
> - simplify airoha,en7581-gpio-sysctl.yam binding
> - Link to v3: https://lore.kernel.org/r/20240831-en7581-pinctrl-v3-0-98eebfb4da66 at kernel.org
> 
> Changes in v3:
> - introduce airoha-mfd driver
> - add pwm driver to the same series
> - model pinctrl and pwm drivers as childs of a parent mfd driver.
> - access chip-scu memory region in pinctrl driver via syscon
> - introduce a single airoha,en7581-gpio-sysctl.yaml binding and get rid
>   of dedicated bindings for pinctrl and pwm
> - add airoha,en7581-chip-scu.yaml binding do the series
> - Link to v2: https://lore.kernel.org/r/20240822-en7581-pinctrl-v2-0-ba1559173a7f at kernel.org
> 
> Changes in v2:
> - Fix compilation errors
> - Collapse some register mappings for gpio and irq controllers
> - update dt-bindings according to new register mapping
> - fix some dt-bindings errors
> - Link to v1: https://lore.kernel.org/all/cover.1723392444.git.lorenzo at kernel.org/
> 
> ---
> Benjamin Larsson (1):
>       pwm: airoha: Add support for EN7581 SoC
> 
> Christian Marangi (2):
>       dt-bindings: mfd: Add support for Airoha EN7581 GPIO System Controller
>       mfd: airoha: Add support for Airoha EN7581 MFD
> 
> Lorenzo Bianconi (2):
>       dt-bindings: arm: airoha: Add the chip-scu node for EN7581 SoC
>       pinctrl: airoha: Add support for EN7581 SoC
> 
>  .../bindings/arm/airoha,en7581-chip-scu.yaml       |   42 +
>  .../bindings/mfd/airoha,en7581-gpio-sysctl.yaml    |  433 +++
>  MAINTAINERS                                        |    7 +
>  drivers/mfd/Kconfig                                |    8 +
>  drivers/mfd/Makefile                               |    2 +
>  drivers/mfd/airoha-en7581-gpio-mfd.c               |   72 +
>  drivers/pinctrl/mediatek/Kconfig                   |   16 +-
>  drivers/pinctrl/mediatek/Makefile                  |    1 +
>  drivers/pinctrl/mediatek/pinctrl-airoha.c          | 2964 ++++++++++++++++++++
>  drivers/pwm/Kconfig                                |   10 +
>  drivers/pwm/Makefile                               |    1 +
>  drivers/pwm/pwm-airoha.c                           |  414 +++
>  include/linux/mfd/airoha-en7581-mfd.h              |    9 +
>  13 files changed, 3978 insertions(+), 1 deletion(-)
> ---
> base-commit: 264c13114bd71ddfd7b25c7b94f6cda4587eca25
> change-id: 20240818-en7581-pinctrl-1bf120154be0
> prerequisite-change-id: 20240705-for-6-11-bpf-a349efc08df8:v2
> 
>

Hi,

any news with this? Rob reviewed the DT schemas and he is ok with them.

Any other comments for the MFD driver and/or the pinctrl or PWM driver?

-- 
	Ansuel


From angelogioacchino.delregno at collabora.com  Mon Sep 23 03:00:07 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Mon, 23 Sep 2024 12:00:07 +0200
Subject: [PATCH v1 0/3] rtc: mt6359: Cleanup and support start-year property
Message-ID: <20240923100010.97470-1-angelogioacchino.delregno@collabora.com>

This series adds support for the start-year property and removes the
custom handling of the RTC_MIN_YEAR_OFFSET (which is, effectively, doing
the exact same).

The start_secs timestamp was set to match the previous one from the
custom behavior so that there is no time drift on any device after
applying this.

While at it, a cleanup to use the Day-of-Week HW register instead of
manually calculating tm_wday was also performed.

For the bindings commit, this series goes on top of the MT6397 schema
conversion from Macpaul Lin [1].

This series was tested on a MT8195 Cherry Tomato Chromebook.

[1]: https://lore.kernel.org/all/20240918064955.6518-1-macpaul.lin at mediatek.com/

AngeloGioacchino Del Regno (3):
  dt-bindings: mfd: mediatek: mt6397: Add start-year property to RTC
  rtc: mt6359: Add RTC hardware range and add support for start-year
  rtc: mt6359: Use RTC_TC_DOW hardware register for wday

 .../bindings/mfd/mediatek,mt6397.yaml         |  2 ++
 drivers/rtc/rtc-mt6397.c                      | 29 +++++++------------
 2 files changed, 12 insertions(+), 19 deletions(-)

-- 
2.46.0



From angelogioacchino.delregno at collabora.com  Mon Sep 23 03:00:08 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Mon, 23 Sep 2024 12:00:08 +0200
Subject: [PATCH v1 1/3] dt-bindings: mfd: mediatek: mt6397: Add start-year property to RTC
In-Reply-To: <20240923100010.97470-1-angelogioacchino.delregno@collabora.com>
References: <20240923100010.97470-1-angelogioacchino.delregno@collabora.com>
Message-ID: <20240923100010.97470-2-angelogioacchino.delregno@collabora.com>

Enable evaluating the start-year property to allow shifting the
RTC's HW range.

Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
---
 Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml b/Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml
index 953358bc997a..a83cc35f51f1 100644
--- a/Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml
+++ b/Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml
@@ -71,6 +71,8 @@ properties:
                   - mediatek,mt6366-rtc
               - const: mediatek,mt6358-rtc
 
+      start-year: true
+
     required:
       - compatible
 
-- 
2.46.0



From angelogioacchino.delregno at collabora.com  Mon Sep 23 03:00:09 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Mon, 23 Sep 2024 12:00:09 +0200
Subject: [PATCH v1 2/3] rtc: mt6359: Add RTC hardware range and add support for start-year
In-Reply-To: <20240923100010.97470-1-angelogioacchino.delregno@collabora.com>
References: <20240923100010.97470-1-angelogioacchino.delregno@collabora.com>
Message-ID: <20240923100010.97470-3-angelogioacchino.delregno@collabora.com>

Add the RTC hardware range parameters to enable the possibility
of using the `start-year` devicetree property which, if present,
will set the start_secs parameter by overriding the defaults
that this driver is setting;

To keep compatibility with (hence have the same date/time reading
as) the old behavior, set:
 - range_min to 1900-01-01 00:00:00
 - range_max to 2027-12-31 23:59:59 (HW year max range is 0-127)
 - start_secs defaulting to 1968-01-02 00:00:00

Please note that the oddness of starting from January 2nd is not
a hardware quirk and it's done only to get the same date/time
reading as an RTC which time was set before this commit.

Also remove the RTC_MIN_YEAR_OFFSET addition and subtraction in
callbacks set_time() and read_time() respectively, as now this
is already done by the API.

Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
---
 drivers/rtc/rtc-mt6397.c | 13 ++++---------
 1 file changed, 4 insertions(+), 9 deletions(-)

diff --git a/drivers/rtc/rtc-mt6397.c b/drivers/rtc/rtc-mt6397.c
index 1617063669cc..4785af123a7f 100644
--- a/drivers/rtc/rtc-mt6397.c
+++ b/drivers/rtc/rtc-mt6397.c
@@ -96,12 +96,6 @@ static int mtk_rtc_read_time(struct device *dev, struct rtc_time *tm)
 			goto exit;
 	} while (sec < tm->tm_sec);
 
-	/* HW register use 7 bits to store year data, minus
-	 * RTC_MIN_YEAR_OFFSET before write year data to register, and plus
-	 * RTC_MIN_YEAR_OFFSET back after read year from register
-	 */
-	tm->tm_year += RTC_MIN_YEAR_OFFSET;
-
 	/* HW register start mon from one, but tm_mon start from zero. */
 	tm->tm_mon--;
 	time = rtc_tm_to_time64(tm);
@@ -122,7 +116,6 @@ static int mtk_rtc_set_time(struct device *dev, struct rtc_time *tm)
 	int ret;
 	u16 data[RTC_OFFSET_COUNT];
 
-	tm->tm_year -= RTC_MIN_YEAR_OFFSET;
 	tm->tm_mon++;
 
 	data[RTC_OFFSET_SEC] = tm->tm_sec;
@@ -178,7 +171,6 @@ static int mtk_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alm)
 	tm->tm_mon = data[RTC_OFFSET_MTH] & RTC_AL_MTH_MASK;
 	tm->tm_year = data[RTC_OFFSET_YEAR] & RTC_AL_YEA_MASK;
 
-	tm->tm_year += RTC_MIN_YEAR_OFFSET;
 	tm->tm_mon--;
 
 	return 0;
@@ -194,7 +186,6 @@ static int mtk_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alm)
 	int ret;
 	u16 data[RTC_OFFSET_COUNT];
 
-	tm->tm_year -= RTC_MIN_YEAR_OFFSET;
 	tm->tm_mon++;
 
 	mutex_lock(&rtc->lock);
@@ -302,6 +293,10 @@ static int mtk_rtc_probe(struct platform_device *pdev)
 	device_init_wakeup(&pdev->dev, 1);
 
 	rtc->rtc_dev->ops = &mtk_rtc_ops;
+	rtc->rtc_dev->range_min = RTC_TIMESTAMP_BEGIN_1900;
+	rtc->rtc_dev->range_max = mktime64(2027, 12, 31, 23, 59, 59);
+	rtc->rtc_dev->start_secs = mktime64(1968, 1, 2, 0, 0, 0);
+	rtc->rtc_dev->set_start_time = true;
 
 	return devm_rtc_register_device(rtc->rtc_dev);
 }
-- 
2.46.0



From angelogioacchino.delregno at collabora.com  Mon Sep 23 03:00:10 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Mon, 23 Sep 2024 12:00:10 +0200
Subject: [PATCH v1 3/3] rtc: mt6359: Use RTC_TC_DOW hardware register for wday
In-Reply-To: <20240923100010.97470-1-angelogioacchino.delregno@collabora.com>
References: <20240923100010.97470-1-angelogioacchino.delregno@collabora.com>
Message-ID: <20240923100010.97470-4-angelogioacchino.delregno@collabora.com>

Instead of calculating the number of full days since Sunday with
(days + 4) % 7, read (and write) that to the RTC Day-of-week Time
Counter register (RTC_TC_DOW).

Some transformation (addition and subtraction for set/get) is
still done, as this register's range is [1..7], while the tm_wday
in struct tm's range is [0..6].

Please note that this was added only to set_time() and read_time()
callbacks because set_alarm() and read_alarm() are setting a bit
in RTC_AL_MASK to ignore DOW for RTC HW alarms for unknown reasons.

Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
---
 drivers/rtc/rtc-mt6397.c | 16 ++++++----------
 1 file changed, 6 insertions(+), 10 deletions(-)

diff --git a/drivers/rtc/rtc-mt6397.c b/drivers/rtc/rtc-mt6397.c
index 4785af123a7f..152699219a2b 100644
--- a/drivers/rtc/rtc-mt6397.c
+++ b/drivers/rtc/rtc-mt6397.c
@@ -75,6 +75,7 @@ static int __mtk_rtc_read_time(struct mt6397_rtc *rtc,
 	tm->tm_min = data[RTC_OFFSET_MIN];
 	tm->tm_hour = data[RTC_OFFSET_HOUR];
 	tm->tm_mday = data[RTC_OFFSET_DOM];
+	tm->tm_wday = data[RTC_OFFSET_DOW];
 	tm->tm_mon = data[RTC_OFFSET_MTH] & RTC_TC_MTH_MASK;
 	tm->tm_year = data[RTC_OFFSET_YEAR];
 
@@ -86,9 +87,8 @@ static int __mtk_rtc_read_time(struct mt6397_rtc *rtc,
 
 static int mtk_rtc_read_time(struct device *dev, struct rtc_time *tm)
 {
-	time64_t time;
 	struct mt6397_rtc *rtc = dev_get_drvdata(dev);
-	int days, sec, ret;
+	int sec, ret;
 
 	do {
 		ret = __mtk_rtc_read_time(rtc, tm, &sec);
@@ -96,15 +96,9 @@ static int mtk_rtc_read_time(struct device *dev, struct rtc_time *tm)
 			goto exit;
 	} while (sec < tm->tm_sec);
 
-	/* HW register start mon from one, but tm_mon start from zero. */
+	/* HW register start mon/wday from one, but tm_mon/tm_wday start from zero. */
 	tm->tm_mon--;
-	time = rtc_tm_to_time64(tm);
-
-	/* rtc_tm_to_time64 covert Gregorian date to seconds since
-	 * 01-01-1970 00:00:00, and this date is Thursday.
-	 */
-	days = div_s64(time, 86400);
-	tm->tm_wday = (days + 4) % 7;
+	tm->tm_wday--;
 
 exit:
 	return ret;
@@ -117,11 +111,13 @@ static int mtk_rtc_set_time(struct device *dev, struct rtc_time *tm)
 	u16 data[RTC_OFFSET_COUNT];
 
 	tm->tm_mon++;
+	tm->tm_wday++;
 
 	data[RTC_OFFSET_SEC] = tm->tm_sec;
 	data[RTC_OFFSET_MIN] = tm->tm_min;
 	data[RTC_OFFSET_HOUR] = tm->tm_hour;
 	data[RTC_OFFSET_DOM] = tm->tm_mday;
+	data[RTC_OFFSET_DOW] = tm->tm_wday;
 	data[RTC_OFFSET_MTH] = tm->tm_mon;
 	data[RTC_OFFSET_YEAR] = tm->tm_year;
 
-- 
2.46.0



From fshao at chromium.org  Mon Sep 23 03:05:10 2024
From: fshao at chromium.org (Fei Shao)
Date: Mon, 23 Sep 2024 18:05:10 +0800
Subject: [PATCH v3 1/2] PCI: mediatek-gen3: Add support for setting
 max-link-speed limit
In-Reply-To: <20240918081307.51264-2-angelogioacchino.delregno@collabora.com>
References: <20240918081307.51264-1-angelogioacchino.delregno@collabora.com> <20240918081307.51264-2-angelogioacchino.delregno@collabora.com>
Message-ID: <CAC=S1nj6AdVHoBUJsduHiGfpRRijTx+zJ5e=a30+pYENqO-GOw@mail.gmail.com>

Hi Angelo,

On Wed, Sep 18, 2024 at 4:13?PM AngeloGioacchino Del Regno
<angelogioacchino.delregno at collabora.com> wrote:
>
> Add support for respecting the max-link-speed devicetree property,
> forcing a maximum speed (Gen) for a PCI-Express port.
>
> Since the MediaTek PCIe Gen3 controllers also expose the maximum
> supported link speed in the PCIE_BASE_CFG register, if property
> max-link-speed is specified in devicetree, validate it against the
> controller capabilities and proceed setting the limitations only
> if the wanted Gen is lower than the maximum one that is supported
> by the controller itself (otherwise it makes no sense!).
>
> Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>

I confirmed that v3 addressed all my comments in v2 (with some in a
more sensible approach), so
Reviewed-by: Fei Shao <fshao at chromium.org>

Regards,
Fei


From fshao at chromium.org  Mon Sep 23 03:08:14 2024
From: fshao at chromium.org (Fei Shao)
Date: Mon, 23 Sep 2024 18:08:14 +0800
Subject: [PATCH v3 2/2] PCI: mediatek-gen3: Add support for restricting
 link width
In-Reply-To: <20240918081307.51264-3-angelogioacchino.delregno@collabora.com>
References: <20240918081307.51264-1-angelogioacchino.delregno@collabora.com> <20240918081307.51264-3-angelogioacchino.delregno@collabora.com>
Message-ID: <CAC=S1niSEG_9kFDBGL+i=MjqvfiuQBmAhv+7He9A3_7PXUi8Gg@mail.gmail.com>

On Wed, Sep 18, 2024 at 4:13?PM AngeloGioacchino Del Regno
<angelogioacchino.delregno at collabora.com> wrote:
>
> Add support for restricting the port's link width by specifying
> the num-lanes devicetree property in the PCIe node.
>
> The setting is done in the GEN_SETTINGS register (in the driver
> named as PCIE_SETTING_REG), where each set bit in [11:8] activates
> a set of lanes (from bits 11 to 8 respectively, x16/x8/x4/x2).
>
> Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>

Reviewed-by: Fei Shao <fshao at chromium.org>


From pablo.sun at mediatek.com  Mon Sep 23 03:14:38 2024
From: pablo.sun at mediatek.com (Pablo Sun)
Date: Mon, 23 Sep 2024 18:14:38 +0800
Subject: [PATCH 5/5] arm64: dts: mediatek: mt8390-genio-700-evk: Enable
 Mali GPU
In-Reply-To: <eb17085d-78ff-4833-a4de-17b9327d776c@collabora.com>
References: <20240920134111.19744-1-pablo.sun@mediatek.com>
 <20240920134111.19744-6-pablo.sun@mediatek.com>
 <eb17085d-78ff-4833-a4de-17b9327d776c@collabora.com>
Message-ID: <bf45531a-eacf-22a9-65f1-f6474a2ca843@mediatek.com>

Hi Angelo,

On 9/23/24 16:45, AngeloGioacchino Del Regno wrote:
[snipped]
> 
> Is there any real difference between MT8390 and MT8188 in terms of the 
> GPU OPPs?
> 
> I see that on MT8188, frequencies up to 880MHz want a DVDD_SRAM_GPU of 
> 0.750V,
> then 0.775/0.762/0.750 (bin1-4/5/6) on 915MHz, and 0.800/0.775/0.750 
> (bin1-4/5/6)
> on 950MHz.
> 
> Those never call for 0.850V...! So is MT8188 (Chromebooks) wrong, or is 
> MT8390
> different in that?

To the best of my knowledge, MT8390 and MT8188 has identical GPU
subsystem. Thus, the OPP table should have no difference.

To be specific, I list the link to the OPP table of Genio 700 EVK
(MT8390) in reference in [1]. It should match the setting in Chromebook
kernel branches.

The "typical" voltage in the datasheet is the voltage that would work
for all frequency settings. As long as it is smaller than the maximum
operating voltage, setting voltages higher than the ones specified in
the OPP table does not damage the hardware.

But this 0.85V setting is indeed not optimal. We should follow the
voltages described in the OPP table, if we want power savings.

I also considered model the regulator setting with 
'regulator-coupled-with' and 'regulator-coupled-max-spread', but I am 
not entirely sure how to describe the relation that "DVDD_GPU_SRAM 
should follow DVDD_GPU
if and only if DVDD_GPU is higher than 0.75V" - should I simply
set min-voltage to 0.75V and set 'regulator-coupled-with' ?

[1]: 
https://gitlab.com/mediatek/aiot/rity/meta-mediatek-bsp/-/blob/kirkstone/recipes-kernel/dtbo/mt8390/gpu-mali.dts

Many thanks,
Pablo



From macpaul.lin at mediatek.com  Mon Sep 23 03:43:23 2024
From: macpaul.lin at mediatek.com (Macpaul Lin)
Date: Mon, 23 Sep 2024 18:43:23 +0800
Subject: [PATCH v6 2/2] dt-bindings: mfd: mediatek: mt6397: Convert to DT
 schema format
In-Reply-To: <202409201337500284902d@mail.local>
References: <20240918064955.6518-1-macpaul.lin@mediatek.com>
 <20240918064955.6518-2-macpaul.lin@mediatek.com>
 <20240918115151c896f33f@mail.local> <20240918115651c1475d36@mail.local>
 <2af0621d-14ac-b7f3-b28d-2df698931121@mediatek.com>
 <d8b90ddf-efbc-4434-9ad0-4be6942d51a5@collabora.com>
 <202409201337500284902d@mail.local>
Message-ID: <637aca9a-5d1e-6726-4b97-4d5db0ee30a3@mediatek.com>


On 9/20/24 21:37, Alexandre Belloni wrote:

[snip]

>> > > > >? - RTC:
>> > > > >?? - Drop "start-year"
>> > > > 

[snip]

>> > 
>> 
>> Alexandre, I definitely agree with you on the fact that the MTK PMIC RTC driver
>> can (and needs to) be improved, and that it can make use of some nice cleanup...
>> 
>> ... but!
>> 
>> This series performs a conversion to schema, and the previous txt file didn't
>> say anything about the start-year property - which was not mandatory to support
>> at that time (nor now, afaik?), so adding support for that is out of scope for
>> this series.
> 
> It is mandatory now. I agree this can be done in a subsequent series.
> 

Thanks you all for helping with the review and kindly understanding the
situation. I see that Angelo has already submitted the RTC patch set.
I'll check it with the internal driver owner. It seems okay with a quick 
glance.

>> 
>> Eventually, that can come as a series on top, adding support for that in the
>> binding (and, of course, in the driver).
>> 
>> I should be able to tackle that... most probably next week - but still, the
>> improvements would come as a series on top of this one.
>> 
>> Cheers,
>> Angelo
> 

Thanks
Macpaul Lin


From angelogioacchino.delregno at collabora.com  Mon Sep 23 04:28:10 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Mon, 23 Sep 2024 13:28:10 +0200
Subject: =?UTF-8?B?UmU6IOWbnuWkjTogW1BBVENIXSBQQ0k6IG1lZGlhdGVrLWdlbjM6IEF2?=
 =?UTF-8?Q?oid_PCIe_resetting_for_Airoha_EN7581_SoC?=
In-Reply-To: <SG2PR03MB6341D9B41B5742BD45E09B46FF6F2@SG2PR03MB6341.apcprd03.prod.outlook.com>
References: <20240920-pcie-en7581-rst-fix-v1-1-1043fb63ffc9@kernel.org>
 <d8941149-9125-4fe2-a1c0-ab29223a0c87@collabora.com>
 <SG2PR03MB6341D9B41B5742BD45E09B46FF6F2@SG2PR03MB6341.apcprd03.prod.outlook.com>
Message-ID: <05ec0016-09e8-4e84-92d1-698b3c195ec8@collabora.com>

Il 23/09/24 12:06, Hui Ma (??) ha scritto:
> Hi Angelo?
> 
>           EN7581 doesn't support pulling up/down PERST by bit3 of PCIe MAC register 0x148(PCIE_RST_CTRL_REG).
> 
>           EN7581 toggle PERST in clk_bulk_enable function called by mtk_pcie_en7581_power_up function.
> 

Hello Hui,
please don't top post.

Anyway, are those bits unexistant on EN7581, or are those used for different
functions?

If those do not exist, and setting those bits will not produce adverse effects,
it'd be possible to avoid creating a different codepath and just add a comment
saying that the setting has no effect on Airoha EN7581.

Regards,
Angelo

> 
> 
> 
> 
> 
> 
> 
> -----????-----
> ???: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
> ????: 2024?9?23? 17:42
> ???: Lorenzo Bianconi <lorenzo at kernel.org>; Ryder Lee <Ryder.Lee at mediatek.com>; Jianjun Wang (???) <Jianjun.Wang at mediatek.com>; Lorenzo Pieralisi <lpieralisi at kernel.org>; Krzysztof Wilczy?ski <kw at linux.com>; Rob Herring <robh at kernel.org>; Bjorn Helgaas <bhelgaas at google.com>; Matthias Brugger <matthias.bgg at gmail.com>
> ??: Christian Marangi <ansuelsmth at gmail.com>; linux-pci at vger.kernel.org; linux-mediatek at lists.infradead.org; linux-arm-kernel at lists.infradead.org; upstream <upstream at airoha.com>; Hui Ma (??) <Hui.Ma at airoha.com>
> ??: Re: [PATCH] PCI: mediatek-gen3: Avoid PCIe resetting for Airoha EN7581 SoC
> 
> 
> 
> Il 20/09/24 10:26, Lorenzo Bianconi ha scritto:
> 
>> The PCIe controller available on the EN7581 SoC does not support reset
> 
>> via the following lines:
> 
>> - PCIE_MAC_RSTB
> 
>> - PCIE_PHY_RSTB
> 
>> - PCIE_BRG_RSTB
> 
>> - PCIE_PE_RSTB
> 
>>
> 
>> Introduce the reset callback in order to avoid resetting the PCIe port
> 
>> for Airoha EN7581 SoC.
> 
>>
> 
> 
> 
> EN7581 doesn't support pulling up/down PERST#?!
> 
> That looks definitely odd, as that signal is part of the PCI-Express CEM spec.
> 
> 
> 
> Besides, there's another PERST# assertion at mtk_pcie_suspend_noirq()...
> 
> 
> 
> Cheers,
> 
> Angelo
> 
> 
> 
>> Tested-by: Hui Ma <hui.ma at airoha.com<mailto:hui.ma at airoha.com>>
> 
>> Signed-off-by: Lorenzo Bianconi <lorenzo at kernel.org<mailto:lorenzo at kernel.org>>
> 
>> ---
> 
>>    drivers/pci/controller/pcie-mediatek-gen3.c | 44 ++++++++++++++++++-----------
> 
>>    1 file changed, 28 insertions(+), 16 deletions(-)
> 
>>
> 
>> diff --git a/drivers/pci/controller/pcie-mediatek-gen3.c
> 
>> b/drivers/pci/controller/pcie-mediatek-gen3.c
> 
>> index 5c19abac74e8..9cea67e92d98 100644
> 
>> --- a/drivers/pci/controller/pcie-mediatek-gen3.c
> 
>> +++ b/drivers/pci/controller/pcie-mediatek-gen3.c
> 
>> @@ -128,10 +128,12 @@ struct mtk_gen3_pcie;
> 
>>    /**
> 
>>     * struct mtk_gen3_pcie_pdata - differentiate between host generations
> 
>>     * @power_up: pcie power_up callback
> 
>> + * @reset: pcie reset callback
> 
>>     * @phy_resets: phy reset lines SoC data.
> 
>>     */
> 
>>    struct mtk_gen3_pcie_pdata {
> 
>>             int (*power_up)(struct mtk_gen3_pcie *pcie);
> 
>> +    void (*reset)(struct mtk_gen3_pcie *pcie);
> 
>>             struct {
> 
>>                       const char *id[MAX_NUM_PHY_RESETS];
> 
>>                       int num_resets;
> 
>> @@ -373,6 +375,28 @@ static void mtk_pcie_enable_msi(struct mtk_gen3_pcie *pcie)
> 
>>             writel_relaxed(val, pcie->base + PCIE_INT_ENABLE_REG);
> 
>>    }
> 
>>
> 
>> +static void mtk_pcie_reset(struct mtk_gen3_pcie *pcie) {
> 
>> +    u32 val;
> 
>> +
> 
>> +    /* Assert all reset signals */
> 
>> +    val = readl_relaxed(pcie->base + PCIE_RST_CTRL_REG);
> 
>> +    val |= PCIE_MAC_RSTB | PCIE_PHY_RSTB | PCIE_BRG_RSTB | PCIE_PE_RSTB;
> 
>> +    writel_relaxed(val, pcie->base + PCIE_RST_CTRL_REG);
> 
>> +
> 
>> +    /*
> 
>> +    * Described in PCIe CEM specification sections 2.2 (PERST# Signal)
> 
>> +    * and 2.2.1 (Initial Power-Up (G3 to S0)).
> 
>> +    * The deassertion of PERST# should be delayed 100ms (TPVPERL)
> 
>> +    * for the power and clock to become stable.
> 
>> +    */
> 
>> +    msleep(100);
> 
>> +
> 
>> +    /* De-assert reset signals */
> 
>> +    val &= ~(PCIE_MAC_RSTB | PCIE_PHY_RSTB | PCIE_BRG_RSTB | PCIE_PE_RSTB);
> 
>> +    writel_relaxed(val, pcie->base + PCIE_RST_CTRL_REG); }
> 
>> +
> 
>>    static int mtk_pcie_startup_port(struct mtk_gen3_pcie *pcie)
> 
>>    {
> 
>>             struct resource_entry *entry;
> 
>> @@ -402,22 +426,9 @@ static int mtk_pcie_startup_port(struct mtk_gen3_pcie *pcie)
> 
>>             val |= PCIE_DISABLE_DVFSRC_VLT_REQ;
> 
>>             writel_relaxed(val, pcie->base + PCIE_MISC_CTRL_REG);
> 
>>
> 
>> -     /* Assert all reset signals */
> 
>> -     val = readl_relaxed(pcie->base + PCIE_RST_CTRL_REG);
> 
>> -     val |= PCIE_MAC_RSTB | PCIE_PHY_RSTB | PCIE_BRG_RSTB | PCIE_PE_RSTB;
> 
>> -     writel_relaxed(val, pcie->base + PCIE_RST_CTRL_REG);
> 
>> -
> 
>> -     /*
> 
>> -     * Described in PCIe CEM specification sections 2.2 (PERST# Signal)
> 
>> -     * and 2.2.1 (Initial Power-Up (G3 to S0)).
> 
>> -     * The deassertion of PERST# should be delayed 100ms (TPVPERL)
> 
>> -     * for the power and clock to become stable.
> 
>> -     */
> 
>> -     msleep(100);
> 
>> -
> 
>> -     /* De-assert reset signals */
> 
>> -     val &= ~(PCIE_MAC_RSTB | PCIE_PHY_RSTB | PCIE_BRG_RSTB | PCIE_PE_RSTB);
> 
>> -     writel_relaxed(val, pcie->base + PCIE_RST_CTRL_REG);
> 
>> +    /* Reset the PCIe port if requested by the hw */
> 
>> +    if (pcie->soc->reset)
> 
>> +             pcie->soc->reset(pcie);
> 
>>
> 
>>             /* Check if the link is up or not */
> 
>>             err = readl_poll_timeout(pcie->base + PCIE_LINK_STATUS_REG, val, @@
> 
>> -1207,6 +1218,7 @@ static const struct dev_pm_ops mtk_pcie_pm_ops = {
> 
>>
> 
>>    static const struct mtk_gen3_pcie_pdata mtk_pcie_soc_mt8192 = {
> 
>>             .power_up = mtk_pcie_power_up,
> 
>> +    .reset = mtk_pcie_reset,
> 
>>             .phy_resets = {
> 
>>                       .id[0] = "phy",
> 
>>                       .num_resets = 1,
> 
>>
> 
>> ---
> 
>> base-commit: f2024903cb387971abdbc6398a430e735a9b394c
> 
>> change-id: 20240920-pcie-en7581-rst-fix-8161658c13c4
> 
>>
> 
>> Best regards,
> 
> 



From angelogioacchino.delregno at collabora.com  Mon Sep 23 05:25:09 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Mon, 23 Sep 2024 14:25:09 +0200
Subject: [PATCH 5/5] arm64: dts: mediatek: mt8390-genio-700-evk: Enable
 Mali GPU
In-Reply-To: <bf45531a-eacf-22a9-65f1-f6474a2ca843@mediatek.com>
References: <20240920134111.19744-1-pablo.sun@mediatek.com>
 <20240920134111.19744-6-pablo.sun@mediatek.com>
 <eb17085d-78ff-4833-a4de-17b9327d776c@collabora.com>
 <bf45531a-eacf-22a9-65f1-f6474a2ca843@mediatek.com>
Message-ID: <228c9508-76c3-4772-bf0a-56e85a47af78@collabora.com>

Il 23/09/24 12:14, Pablo Sun ha scritto:
> Hi Angelo,
> 
> On 9/23/24 16:45, AngeloGioacchino Del Regno wrote:
> [snipped]
>>
>> Is there any real difference between MT8390 and MT8188 in terms of the GPU OPPs?
>>
>> I see that on MT8188, frequencies up to 880MHz want a DVDD_SRAM_GPU of 0.750V,
>> then 0.775/0.762/0.750 (bin1-4/5/6) on 915MHz, and 0.800/0.775/0.750 (bin1-4/5/6)
>> on 950MHz.
>>
>> Those never call for 0.850V...! So is MT8188 (Chromebooks) wrong, or is MT8390
>> different in that?
> 
> To the best of my knowledge, MT8390 and MT8188 has identical GPU
> subsystem. Thus, the OPP table should have no difference.
> 
> To be specific, I list the link to the OPP table of Genio 700 EVK
> (MT8390) in reference in [1]. It should match the setting in Chromebook
> kernel branches.
> 
> The "typical" voltage in the datasheet is the voltage that would work
> for all frequency settings. As long as it is smaller than the maximum
> operating voltage, setting voltages higher than the ones specified in
> the OPP table does not damage the hardware.
> 
> But this 0.85V setting is indeed not optimal. We should follow the
> voltages described in the OPP table, if we want power savings.
> 
> I also considered model the regulator setting with 'regulator-coupled-with' and 
> 'regulator-coupled-max-spread', but I am not entirely sure how to describe the 
> relation that "DVDD_GPU_SRAM should follow DVDD_GPU
> if and only if DVDD_GPU is higher than 0.75V" - should I simply
> set min-voltage to 0.75V and set 'regulator-coupled-with' ?
> 

VSRAM_GPU regulator:

	regulator-min-microvolt = <750000>;
	regulator-max-microvolt = <800000>;
	regulator-coupled-with = <&(vgpu regulator)>;
	regulator-coupled-max-spread = <1000>;

VGPU regulator:
	regulator-min-microvolt = <400000>;
	regulator-max-microvolt = <800000>;
	regulator-coupled-with = <&(vsram_gpu regulator)>;
	regulator-coupled-max-spread = <1000>;

Cheers,
Angelo

> [1]: 
> https://gitlab.com/mediatek/aiot/rity/meta-mediatek-bsp/-/blob/kirkstone/recipes-kernel/dtbo/mt8390/gpu-mali.dts
> 
> Many thanks,
> Pablo
> 





From liankun.yang at mediatek.com  Mon Sep 23 06:24:15 2024
From: liankun.yang at mediatek.com (Liankun Yang)
Date: Mon, 23 Sep 2024 21:24:15 +0800
Subject: [PATCH v5 1/1] drm/mediatek: Fix get efuse issue for MT8188 DPTX
Message-ID: <20240923132521.22785-1-liankun.yang@mediatek.com>

Update efuse data for MT8188 displayport.

The DP monitor can not display when DUT connected to USB-c to DP dongle.
Analysis view is invalid DP efuse data.

Fixes: 350c3fe907fb ("drm/mediatek: dp: Add support MT8188 dp/edp function")
Reviewed-by: Matthias Brugger <matthias.bgg at gmail.com>
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
Signed-off-by: Liankun Yang <liankun.yang at mediatek.com>
---
Changes in V5:
- No change.
Per suggestion from the previous thread:
https://patchwork.kernel.org/project/linux-mediatek/patch/20240905124041.3658-1-liankun.yang at mediatek.com/

Changes in V4:
- Remove excess newlines.
Per suggestion from the previous thread:
https://patchwork.kernel.org/project/linux-mediatek/patch/20240903121028.20689-1-liankun.yang at mediatek.com/

Changes in V3
- Update change log position in commit message.
Per suggestion from the previous thread:
https://patchwork.kernel.org/project/linux-mediatek/patch/20240902133736.16461-1-liankun.yang at mediatek.com/

Changes in V2
- Add Fixes tag.
- Update the commit title.
- Update the commit description.
Per suggestion from the previous thread:
https://patchwork.kernel.org/project/linux-mediatek/patch/20240510061716.31103-1-liankun.yang at mediatek.com/
---
 drivers/gpu/drm/mediatek/mtk_dp.c | 85 ++++++++++++++++++++++++++++++-
 1 file changed, 84 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/mediatek/mtk_dp.c b/drivers/gpu/drm/mediatek/mtk_dp.c
index d8796a904eca..f2bee617f063 100644
--- a/drivers/gpu/drm/mediatek/mtk_dp.c
+++ b/drivers/gpu/drm/mediatek/mtk_dp.c
@@ -145,6 +145,89 @@ struct mtk_dp_data {
 	u16 audio_m_div2_bit;
 };
 
+static const struct mtk_dp_efuse_fmt mt8188_dp_efuse_fmt[MTK_DP_CAL_MAX] = {
+	[MTK_DP_CAL_GLB_BIAS_TRIM] = {
+		.idx = 0,
+		.shift = 10,
+		.mask = 0x1f,
+		.min_val = 1,
+		.max_val = 0x1e,
+		.default_val = 0xf,
+	},
+	[MTK_DP_CAL_CLKTX_IMPSE] = {
+		.idx = 0,
+		.shift = 15,
+		.mask = 0xf,
+		.min_val = 1,
+		.max_val = 0xe,
+		.default_val = 0x8,
+	},
+	[MTK_DP_CAL_LN_TX_IMPSEL_PMOS_0] = {
+		.idx = 1,
+		.shift = 0,
+		.mask = 0xf,
+		.min_val = 1,
+		.max_val = 0xe,
+		.default_val = 0x8,
+	},
+	[MTK_DP_CAL_LN_TX_IMPSEL_PMOS_1] = {
+		.idx = 1,
+		.shift = 8,
+		.mask = 0xf,
+		.min_val = 1,
+		.max_val = 0xe,
+		.default_val = 0x8,
+	},
+	[MTK_DP_CAL_LN_TX_IMPSEL_PMOS_2] = {
+		.idx = 1,
+		.shift = 16,
+		.mask = 0xf,
+		.min_val = 1,
+		.max_val = 0xe,
+		.default_val = 0x8,
+	},
+	[MTK_DP_CAL_LN_TX_IMPSEL_PMOS_3] = {
+		.idx = 1,
+		.shift = 24,
+		.mask = 0xf,
+		.min_val = 1,
+		.max_val = 0xe,
+		.default_val = 0x8,
+	},
+	[MTK_DP_CAL_LN_TX_IMPSEL_NMOS_0] = {
+		.idx = 1,
+		.shift = 4,
+		.mask = 0xf,
+		.min_val = 1,
+		.max_val = 0xe,
+		.default_val = 0x8,
+	},
+	[MTK_DP_CAL_LN_TX_IMPSEL_NMOS_1] = {
+		.idx = 1,
+		.shift = 12,
+		.mask = 0xf,
+		.min_val = 1,
+		.max_val = 0xe,
+		.default_val = 0x8,
+	},
+	[MTK_DP_CAL_LN_TX_IMPSEL_NMOS_2] = {
+		.idx = 1,
+		.shift = 20,
+		.mask = 0xf,
+		.min_val = 1,
+		.max_val = 0xe,
+		.default_val = 0x8,
+	},
+	[MTK_DP_CAL_LN_TX_IMPSEL_NMOS_3] = {
+		.idx = 1,
+		.shift = 28,
+		.mask = 0xf,
+		.min_val = 1,
+		.max_val = 0xe,
+		.default_val = 0x8,
+	},
+};
+
 static const struct mtk_dp_efuse_fmt mt8195_edp_efuse_fmt[MTK_DP_CAL_MAX] = {
 	[MTK_DP_CAL_GLB_BIAS_TRIM] = {
 		.idx = 3,
@@ -2771,7 +2854,7 @@ static SIMPLE_DEV_PM_OPS(mtk_dp_pm_ops, mtk_dp_suspend, mtk_dp_resume);
 static const struct mtk_dp_data mt8188_dp_data = {
 	.bridge_type = DRM_MODE_CONNECTOR_DisplayPort,
 	.smc_cmd = MTK_DP_SIP_ATF_VIDEO_UNMUTE,
-	.efuse_fmt = mt8195_dp_efuse_fmt,
+	.efuse_fmt = mt8188_dp_efuse_fmt,
 	.audio_supported = true,
 	.audio_pkt_in_hblank_area = true,
 	.audio_m_div2_bit = MT8188_AUDIO_M_CODE_MULT_DIV_SEL_DP_ENC0_P0_DIV_2,
-- 
2.45.2



From liankun.yang at mediatek.com  Mon Sep 23 06:35:44 2024
From: liankun.yang at mediatek.com (Liankun Yang)
Date: Mon, 23 Sep 2024 21:35:44 +0800
Subject: [PATCH v1 1/1] drm/mediatek: dp: Add sdp path reset
Message-ID: <20240923133610.23728-1-liankun.yang@mediatek.com>

When using type-c to type-c to connect to the monitor,
the sound plays normally. If you unplug the type-c and
connect the type-c to hdmi dongle to the monitor, there will be noise.

By capturing the audio data, it is found that
the data position is messy, and there is no error in the data.

Through experiments, it can be restored by resetting the SDP path
when unplugging it.

Signed-off-by: Liankun Yang <liankun.yang at mediatek.com>
---
 drivers/gpu/drm/mediatek/mtk_dp.c | 15 +++++++++++++++
 1 file changed, 15 insertions(+)

diff --git a/drivers/gpu/drm/mediatek/mtk_dp.c b/drivers/gpu/drm/mediatek/mtk_dp.c
index d8796a904eca..4003bd83f64e 100644
--- a/drivers/gpu/drm/mediatek/mtk_dp.c
+++ b/drivers/gpu/drm/mediatek/mtk_dp.c
@@ -1052,6 +1052,18 @@ static void mtk_dp_digital_sw_reset(struct mtk_dp *mtk_dp)
 			   0, DP_TX_TRANSMITTER_4P_RESET_SW_DP_TRANS_P0);
 }
 
+static void mtk_dp_sdp_path_reset(struct mtk_dp *mtk_dp)
+{
+	mtk_dp_update_bits(mtk_dp, MTK_DP_ENC0_P0_3004,
+				SDP_RESET_SW_DP_ENC0_P0,
+				SDP_RESET_SW_DP_ENC0_P0);
+
+	/* Wait for sdp path reset to complete */
+	usleep_range(1000, 5000);
+	mtk_dp_update_bits(mtk_dp, MTK_DP_ENC0_P0_3004,
+				0, SDP_RESET_SW_DP_ENC0_P0);
+}
+
 static void mtk_dp_set_lanes(struct mtk_dp *mtk_dp, int lanes)
 {
 	mtk_dp_update_bits(mtk_dp, MTK_DP_TRANS_P0_35F0,
@@ -2314,6 +2326,9 @@ static void mtk_dp_bridge_atomic_disable(struct drm_bridge *bridge,
 			   DP_PWR_STATE_BANDGAP_TPLL,
 			   DP_PWR_STATE_MASK);
 
+	/* SDP path reset sw*/
+	mtk_dp_sdp_path_reset(mtk_dp);
+
 	/* Ensure the sink is muted */
 	msleep(20);
 }
-- 
2.45.2



From max_weng at compal.corp-partner.google.com  Mon Sep 23 07:47:28 2024
From: max_weng at compal.corp-partner.google.com (Max Weng)
Date: Mon, 23 Sep 2024 22:47:28 +0800
Subject: [PATCH v2] arm64: dts: mediatek: mt8186: add FHCTL node
Message-ID: <20240923144728.870285-1-max_weng@compal.corp-partner.google.com>

From: max_weng <max_weng at compal.corp-partner.google.com>

add FHCTL device node for Frequency Hopping and Spread Spectrum clock function.

Change-Id: I7f9f2991978df7d5d3a6a8bc78f6f443f2f0460d
Signed-off-by: Max Weng <max_weng at compal.corp-partner.google.com>
---
 Change frome v1 to v2
 * Modify the commit description
 arch/arm64/boot/dts/mediatek/mt8186.dtsi | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/arch/arm64/boot/dts/mediatek/mt8186.dtsi b/arch/arm64/boot/dts/mediatek/mt8186.dtsi
index 148c332018b0..d3c3c2a40adc 100644
--- a/arch/arm64/boot/dts/mediatek/mt8186.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8186.dtsi
@@ -29,6 +29,13 @@ aliases {
 		rdma1 = &rdma1;
 	};
 
+	fhctl: fhctl at 1000ce00 {
+		compatible = "mediatek,mt8186-fhctl";
+		clocks = <&apmixedsys CLK_APMIXED_TVDPLL>;
+		reg = <0 0x1000ce00 0 0x200>;
+		status = "disabled";
+	};
+
 	cci: cci {
 		compatible = "mediatek,mt8186-cci";
 		clocks = <&mcusys CLK_MCU_ARMPLL_BUS_SEL>,
-- 
2.34.1



From patchwork-bot+bluetooth at kernel.org  Mon Sep 23 10:00:31 2024
From: patchwork-bot+bluetooth at kernel.org (patchwork-bot+bluetooth at kernel.org)
Date: Mon, 23 Sep 2024 17:00:31 +0000
Subject: [PATCH v3 0/4] Bluetooth: btusb: Mediatek ISO interface claim/release
 adjustment
In-Reply-To: <20240923084705.14123-1-chris.lu@mediatek.com>
References: <20240923084705.14123-1-chris.lu@mediatek.com>
Message-ID: <172711083101.3420231.13056956178938775510.git-patchwork-notify@kernel.org>

Hello:

This series was applied to bluetooth/bluetooth-next.git (master)
by Luiz Augusto von Dentz <luiz.von.dentz at intel.com>:

On Mon, 23 Sep 2024 16:47:01 +0800 you wrote:
> MediaTek performs some test on the platform which can support LE audio and
> ISO data transmission with kernel driver. We found the additional interface
> claim and release flow issue need some adjustment.
> 
> These patches mainly add a callback function within the usb_disconnect
> function to prevent a kernel panic caused by interfaces not being released
> when the BT USB dongle is physically removed. Additionally, the condition
> for claiming/releasing ISO usb interface have also been adjusted to make
> driver works as expected.
> 
> [...]

Here is the summary with links:
  - [v3,1/4] Bluetooth: btusb: mediatek: move Bluetooth power off command position
    https://git.kernel.org/bluetooth/bluetooth-next/c/65e9c1bf2076
  - [v3,2/4] Bluetooth: btusb: mediatek: add callback function in btusb_disconnect
    https://git.kernel.org/bluetooth/bluetooth-next/c/bcfc09e8a15d
  - [v3,3/4] Bluetooth: btusb: mediatek: add intf release flow when usb disconnect
    https://git.kernel.org/bluetooth/bluetooth-next/c/6f3f7e941483
  - [v3,4/4] Bluetooth: btusb: mediatek: change the conditions for ISO interface
    https://git.kernel.org/bluetooth/bluetooth-next/c/667e8026261d

You are awesome, thank you!
-- 
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html




From patchwork-bot+bluetooth at kernel.org  Mon Sep 23 10:00:32 2024
From: patchwork-bot+bluetooth at kernel.org (patchwork-bot+bluetooth at kernel.org)
Date: Mon, 23 Sep 2024 17:00:32 +0000
Subject: [PATCH 0/4] Bluetooth: btusb: Mediatek ISO interface cliam/release
 adjustment
In-Reply-To: <20240916113938.30285-1-chris.lu@mediatek.com>
References: <20240916113938.30285-1-chris.lu@mediatek.com>
Message-ID: <172711083224.3420231.16302017182425598923.git-patchwork-notify@kernel.org>

Hello:

This series was applied to bluetooth/bluetooth-next.git (master)
by Luiz Augusto von Dentz <luiz.von.dentz at intel.com>:

On Mon, 16 Sep 2024 19:39:34 +0800 you wrote:
> MediaTek performs some test on the platform which can support LE audio and
> ISO data transmission with kernel driver. We found the additional interface
> claim and release flow issue need some adjustment.
> 
> These patches mainly add a callback function within the usb_disconnect function
> to prevent a kernel panic caused by interfaces not being released when the BT USB
> dongle is physically removed. Additionally, the condition for claiming/releasing
> ISO usb interface have also been adjusted to make driver works as expected.
> 
> [...]

Here is the summary with links:
  - [1/4] Bluetooth: btusb: mediatek: move Bluetooth power off in btusb_mtk_shutdown
    https://git.kernel.org/bluetooth/bluetooth-next/c/65e9c1bf2076
  - [2/4] Bluetooth: btusb: add callback function in btusb_disconnect
    https://git.kernel.org/bluetooth/bluetooth-next/c/bcfc09e8a15d
  - [3/4] Bluetooth: btusb: mediatek: add intf release flow in usb disconnect
    (no matching commit)
  - [4/4] Bluetooth: btusb: mediatek: change the conditions for claiming/releasing ISO interface
    (no matching commit)

You are awesome, thank you!
-- 
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html




From helgaas at kernel.org  Mon Sep 23 10:10:41 2024
From: helgaas at kernel.org (Bjorn Helgaas)
Date: Mon, 23 Sep 2024 12:10:41 -0500
Subject: [PATCH] PCI: mediatek-gen3: Avoid PCIe resetting for Airoha
 EN7581 SoC
In-Reply-To: <20240920-pcie-en7581-rst-fix-v1-1-1043fb63ffc9@kernel.org>
Message-ID: <20240923171041.GA1158802@bhelgaas>

On Fri, Sep 20, 2024 at 10:26:28AM +0200, Lorenzo Bianconi wrote:
> The PCIe controller available on the EN7581 SoC does not support reset
> via the following lines:
> - PCIE_MAC_RSTB
> - PCIE_PHY_RSTB
> - PCIE_BRG_RSTB
> - PCIE_PE_RSTB
> 
> Introduce the reset callback in order to avoid resetting the PCIe port
> for Airoha EN7581 SoC.
> 
> Tested-by: Hui Ma <hui.ma at airoha.com>
> Signed-off-by: Lorenzo Bianconi <lorenzo at kernel.org>
> ---
>  drivers/pci/controller/pcie-mediatek-gen3.c | 44 ++++++++++++++++++-----------
>  1 file changed, 28 insertions(+), 16 deletions(-)
> 
> diff --git a/drivers/pci/controller/pcie-mediatek-gen3.c b/drivers/pci/controller/pcie-mediatek-gen3.c
> index 5c19abac74e8..9cea67e92d98 100644
> --- a/drivers/pci/controller/pcie-mediatek-gen3.c
> +++ b/drivers/pci/controller/pcie-mediatek-gen3.c
> @@ -128,10 +128,12 @@ struct mtk_gen3_pcie;
>  /**
>   * struct mtk_gen3_pcie_pdata - differentiate between host generations
>   * @power_up: pcie power_up callback
> + * @reset: pcie reset callback
>   * @phy_resets: phy reset lines SoC data.
>   */
>  struct mtk_gen3_pcie_pdata {
>  	int (*power_up)(struct mtk_gen3_pcie *pcie);
> +	void (*reset)(struct mtk_gen3_pcie *pcie);
>  	struct {
>  		const char *id[MAX_NUM_PHY_RESETS];
>  		int num_resets;
> @@ -373,6 +375,28 @@ static void mtk_pcie_enable_msi(struct mtk_gen3_pcie *pcie)
>  	writel_relaxed(val, pcie->base + PCIE_INT_ENABLE_REG);
>  }
>  
> +static void mtk_pcie_reset(struct mtk_gen3_pcie *pcie)
> +{
> +	u32 val;
> +
> +	/* Assert all reset signals */
> +	val = readl_relaxed(pcie->base + PCIE_RST_CTRL_REG);
> +	val |= PCIE_MAC_RSTB | PCIE_PHY_RSTB | PCIE_BRG_RSTB | PCIE_PE_RSTB;
> +	writel_relaxed(val, pcie->base + PCIE_RST_CTRL_REG);
> +
> +	/*
> +	 * Described in PCIe CEM specification sections 2.2 (PERST# Signal)
> +	 * and 2.2.1 (Initial Power-Up (G3 to S0)).
> +	 * The deassertion of PERST# should be delayed 100ms (TPVPERL)
> +	 * for the power and clock to become stable.
> +	 */
> +	msleep(100);

I see you're just moving this, but it's a good chance to use
PCIE_T_PVPERL_MS.

> +
> +	/* De-assert reset signals */
> +	val &= ~(PCIE_MAC_RSTB | PCIE_PHY_RSTB | PCIE_BRG_RSTB | PCIE_PE_RSTB);
> +	writel_relaxed(val, pcie->base + PCIE_RST_CTRL_REG);
> +}
> +
>  static int mtk_pcie_startup_port(struct mtk_gen3_pcie *pcie)
>  {
>  	struct resource_entry *entry;
> @@ -402,22 +426,9 @@ static int mtk_pcie_startup_port(struct mtk_gen3_pcie *pcie)
>  	val |= PCIE_DISABLE_DVFSRC_VLT_REQ;
>  	writel_relaxed(val, pcie->base + PCIE_MISC_CTRL_REG);
>  
> -	/* Assert all reset signals */
> -	val = readl_relaxed(pcie->base + PCIE_RST_CTRL_REG);
> -	val |= PCIE_MAC_RSTB | PCIE_PHY_RSTB | PCIE_BRG_RSTB | PCIE_PE_RSTB;
> -	writel_relaxed(val, pcie->base + PCIE_RST_CTRL_REG);
> -
> -	/*
> -	 * Described in PCIe CEM specification sections 2.2 (PERST# Signal)
> -	 * and 2.2.1 (Initial Power-Up (G3 to S0)).
> -	 * The deassertion of PERST# should be delayed 100ms (TPVPERL)
> -	 * for the power and clock to become stable.
> -	 */
> -	msleep(100);
> -
> -	/* De-assert reset signals */
> -	val &= ~(PCIE_MAC_RSTB | PCIE_PHY_RSTB | PCIE_BRG_RSTB | PCIE_PE_RSTB);
> -	writel_relaxed(val, pcie->base + PCIE_RST_CTRL_REG);
> +	/* Reset the PCIe port if requested by the hw */

I don't see any real "request" from the hardware.  IIUC, this is more
like "assert reset if this hardware supports it".

> +	if (pcie->soc->reset)
> +		pcie->soc->reset(pcie);
>  
>  	/* Check if the link is up or not */
>  	err = readl_poll_timeout(pcie->base + PCIE_LINK_STATUS_REG, val,
> @@ -1207,6 +1218,7 @@ static const struct dev_pm_ops mtk_pcie_pm_ops = {
>  
>  static const struct mtk_gen3_pcie_pdata mtk_pcie_soc_mt8192 = {
>  	.power_up = mtk_pcie_power_up,
> +	.reset = mtk_pcie_reset,
>  	.phy_resets = {
>  		.id[0] = "phy",
>  		.num_resets = 1,
> 
> ---
> base-commit: f2024903cb387971abdbc6398a430e735a9b394c
> change-id: 20240920-pcie-en7581-rst-fix-8161658c13c4
> 
> Best regards,
> -- 
> Lorenzo Bianconi <lorenzo at kernel.org>
> 


From jgg at ziepe.ca  Mon Sep 23 10:52:26 2024
From: jgg at ziepe.ca (Jason Gunthorpe)
Date: Mon, 23 Sep 2024 14:52:26 -0300
Subject: [PATCH net 2/2] page_pool: fix IOMMU crash when driver has
 already unbound
In-Reply-To: <2c5ccfff-6ab4-4aea-bff6-3679ff72cc9a@huawei.com>
References: <20240918111826.863596-1-linyunsheng@huawei.com>
 <20240918111826.863596-3-linyunsheng@huawei.com>
 <CAC_iWjK=G7Oo5=pN2QunhasgDC6NyC1L+96jigX7u9ad+PbYng@mail.gmail.com>
 <894a3c2c-22f9-45b9-a82b-de7320066b42@kernel.org>
 <cdfecd37-31d7-42d2-a8d8-92008285b42e@huawei.com>
 <0e8c7a7a-0e2a-42ec-adbc-b29f6a514517@kernel.org>
 <CAC_iWj+3JvPY2oqVOdu0T1Wt6-ukoy=dLc72u1f55yY23uOTbA@mail.gmail.com>
 <2c5ccfff-6ab4-4aea-bff6-3679ff72cc9a@huawei.com>
Message-ID: <20240923175226.GC9634@ziepe.ca>

On Fri, Sep 20, 2024 at 02:14:02PM +0800, Yunsheng Lin wrote:

> I am not sure what dose the API that allows netdev to "give" struct device
> to page_pool look like or how to implement the API yet, but the obvious way
> to stall the calling of device_del() is to wait for the inflight
> page to

It is not device_del() you need to stall, but the remove() function of
the device driver.

Once all drivers have been unbound the DMA API can be reconfigured and
all existing DMA mappings must be concluded before this happens,
otherwise there will be problems.

So, stalling something like unregister_netdevice() would be a better
target - though stalling forever on driver unbind would not be
acceptable.

Jason


From bvanassche at acm.org  Mon Sep 23 11:15:28 2024
From: bvanassche at acm.org (Bart Van Assche)
Date: Mon, 23 Sep 2024 11:15:28 -0700
Subject: [PATCH v8 3/3] ufs: core: add a quirk for MediaTek SDB mode
 aborted
In-Reply-To: <20240923080344.19084-4-peter.wang@mediatek.com>
References: <20240923080344.19084-1-peter.wang@mediatek.com>
 <20240923080344.19084-4-peter.wang@mediatek.com>
Message-ID: <ce42d310-2a23-453f-bd14-71eeaf9f5664@acm.org>

On 9/23/24 1:03 AM, peter.wang at mediatek.com wrote:
> diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
> index b5c7bc50a27e..b42079c3d634 100644
> --- a/drivers/ufs/core/ufshcd.c
> +++ b/drivers/ufs/core/ufshcd.c
> @@ -5404,7 +5404,10 @@ ufshcd_transfer_rsp_status(struct ufs_hba *hba, struct ufshcd_lrb *lrbp,
>   		}
>   		break;
>   	case OCS_ABORTED:
> -		result |= DID_ABORT << 16;
> +		if (hba->quirks & UFSHCD_QUIRK_OCS_ABORTED)
> +			result |= DID_REQUEUE << 16;
> +		else
> +			result |= DID_ABORT << 16;
>   		dev_warn(hba->dev,
>   				"OCS aborted from controller = %x for tag %d\n",
>   				ocs, lrbp->task_tag);

I think the approach of this patch is racy: the cmd->result assignment
by ufshcd_transfer_rsp_status() races with the cmd->result assignment by
ufshcd_abort_one(). How about addressing this race as follows?
* In ufshcd_compl_one_cqe(), if the OCS_ABORTED status is encountered,
   set a completion.
* In the code that aborts SCSI commands, for MediaTek controllers only,
   wait for that completion (based on a quirk).
* Instead of introducing an if-statement in
   ufshcd_transfer_rsp_status(), rely on the cmd->result value assigned
   by ufshcd_abort_one().

Thanks,

Bart.



From bvanassche at acm.org  Mon Sep 23 11:19:28 2024
From: bvanassche at acm.org (Bart Van Assche)
Date: Mon, 23 Sep 2024 11:19:28 -0700
Subject: [PATCH v8 2/3] ufs: core: fix error handler process for MCQ abort
In-Reply-To: <20240923080344.19084-3-peter.wang@mediatek.com>
References: <20240923080344.19084-1-peter.wang@mediatek.com>
 <20240923080344.19084-3-peter.wang@mediatek.com>
Message-ID: <f08fbc51-22a7-4c13-b9d4-ee7f4920bcfa@acm.org>

On 9/23/24 1:03 AM, peter.wang at mediatek.com wrote:
> When the error handler successfully aborts a MCQ request,
> it only releases the command and does not notify the SCSI layer.
> This may cause another abort after 30 seconds timeout.
> This patch notifies the SCSI layer to requeue the request.
> 
> Additionally, ignore the OCS: ABORTED CQ slot after MCQ mode
> SQ cleanup. This makes the behavior of MCQ mode consistent with
> that of legacy SDB mode.
> 
> Also, print logs for OCS: ABORTED and OCS_INVALID_COMMAND_STATUS
> for debugging purposes.

Although I like the approach of this patch, two comments below.

> diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
> index a6f818cdef0e..b5c7bc50a27e 100644
> --- a/drivers/ufs/core/ufshcd.c
> +++ b/drivers/ufs/core/ufshcd.c
> @@ -5405,9 +5405,15 @@ ufshcd_transfer_rsp_status(struct ufs_hba *hba, struct ufshcd_lrb *lrbp,
>   		break;
>   	case OCS_ABORTED:
>   		result |= DID_ABORT << 16;
> +		dev_warn(hba->dev,
> +				"OCS aborted from controller = %x for tag %d\n",
> +				ocs, lrbp->task_tag);
>   		break;

Including the OCS status in this message seems redundant to me.

>   	case OCS_INVALID_COMMAND_STATUS:
>   		result |= DID_REQUEUE << 16;
> +		dev_warn(hba->dev,
> +				"OCS invaild from controller = %x for tag %d\n",
> +				ocs, lrbp->task_tag);

Also here, including the OCS status in this message seems redundant to me.

Please change "invaild" into "invalid".

> @@ -5526,6 +5532,18 @@ void ufshcd_compl_one_cqe(struct ufs_hba *hba, int task_tag,
>   			ufshcd_update_monitor(hba, lrbp);
>   		ufshcd_add_command_trace(hba, task_tag, UFS_CMD_COMP);
>   		cmd->result = ufshcd_transfer_rsp_status(hba, lrbp, cqe);
> +
> +		/*
> +		 * Ignore MCQ OCS: ABORTED posted by the host controller.
> +		 * This makes the behavior of MCQ mode consistent with that
> +		 * of legacy SDB mode.
> +		 */
> +		if (hba->mcq_enabled) {
> +			ocs = ufshcd_get_tr_ocs(lrbp, cqe);
> +			if (ocs == OCS_ABORTED)
> +				return;
> +		}

Why only ignore the OCS_ABORTED status in MCQ mode? Is my understanding
correct that MediaTek controllers can also report this status in legacy 
mode?

Thanks,

Bart.


From dianders at chromium.org  Mon Sep 23 12:11:49 2024
From: dianders at chromium.org (Doug Anderson)
Date: Mon, 23 Sep 2024 12:11:49 -0700
Subject: [PATCH v7 08/10] i2c: of-prober: Add GPIO support to simple helpers
In-Reply-To: <CAGXv+5EcxGfdzvarg8hmk1zR9X0s8KUzayQdxfWTrasEGpj=1g@mail.gmail.com>
References: <20240911072751.365361-1-wenst@chromium.org> <20240911072751.365361-9-wenst@chromium.org>
 <CAD=FV=XvPA0UC87fQ+RvFzPv9qRSEP6eQhT79JOx9Arj87i9Mg@mail.gmail.com> <CAGXv+5EcxGfdzvarg8hmk1zR9X0s8KUzayQdxfWTrasEGpj=1g@mail.gmail.com>
Message-ID: <CAD=FV=Wv1uFmxFsaxT9tY=-fwnPsXDjnabNxQ-cK3hm2a9Wo7A@mail.gmail.com>

Hi,

On Tue, Sep 17, 2024 at 5:41?AM Chen-Yu Tsai <wenst at chromium.org> wrote:
>
> > > +static void i2c_of_probe_simple_disable_gpio(struct device *dev, struct i2c_of_probe_simple_ctx *ctx)
> > > +{
> > > +       if (!ctx->gpiod)
> > > +               return;
> > > +
> > > +       dev_dbg(dev, "Setting GPIO to input\n");
> > > +
> > > +       gpiod_direction_input(ctx->gpiod);
> >
> > This is weird. Why set it to input?
>
> It seemed to me this would be more like the initial state, without knowing
> the actual initial state.

In this case, though, you're trying to turn off the resource, not
trying to get back to the initial state. IMO deasserting the GPIO is
the way to do this. If the output needs to make it an input in this
case then it can use some type of open drain mode.


> > I would also say: given that you're providing a parameter anyway and
> > you're giving the GPIO name, can you please move away from the "raw"
> > values and move to "logical" values?
>
> I disagree. When hardware engineers design for swappable components, they
> likely look at the electrical compatibility of them. In this case, an
> active-high "enable" pin is electrically compatible with an active-low
> "reset" pin. If we use the logical value here, then we would need more
> logic to know when the logical polarity has to be reversed.
>
> Note that this doesn't work for components that are electrically
> incompatible. But in that case a lot more board dependent code would be
> needed anyway.

As we talked about in person, that made sense in the previous version
of the patch where you were looking for all GPIOs willy-nilly. Now
you'll be specifically asking for a GPIO by name and we should honor
the "active high" or "active low" nature of it.

-Doug


From dianders at chromium.org  Mon Sep 23 12:11:49 2024
From: dianders at chromium.org (Doug Anderson)
Date: Mon, 23 Sep 2024 12:11:49 -0700
Subject: [PATCH v7 08/10] i2c: of-prober: Add GPIO support to simple helpers
In-Reply-To: <CAGXv+5EcxGfdzvarg8hmk1zR9X0s8KUzayQdxfWTrasEGpj=1g@mail.gmail.com>
References: <20240911072751.365361-1-wenst@chromium.org> <20240911072751.365361-9-wenst@chromium.org>
 <CAD=FV=XvPA0UC87fQ+RvFzPv9qRSEP6eQhT79JOx9Arj87i9Mg@mail.gmail.com> <CAGXv+5EcxGfdzvarg8hmk1zR9X0s8KUzayQdxfWTrasEGpj=1g@mail.gmail.com>
Message-ID: <CAD=FV=Wv1uFmxFsaxT9tY=-fwnPsXDjnabNxQ-cK3hm2a9Wo7A@mail.gmail.com>

Hi,

On Tue, Sep 17, 2024 at 5:41?AM Chen-Yu Tsai <wenst at chromium.org> wrote:
>
> > > +static void i2c_of_probe_simple_disable_gpio(struct device *dev, struct i2c_of_probe_simple_ctx *ctx)
> > > +{
> > > +       if (!ctx->gpiod)
> > > +               return;
> > > +
> > > +       dev_dbg(dev, "Setting GPIO to input\n");
> > > +
> > > +       gpiod_direction_input(ctx->gpiod);
> >
> > This is weird. Why set it to input?
>
> It seemed to me this would be more like the initial state, without knowing
> the actual initial state.

In this case, though, you're trying to turn off the resource, not
trying to get back to the initial state. IMO deasserting the GPIO is
the way to do this. If the output needs to make it an input in this
case then it can use some type of open drain mode.


> > I would also say: given that you're providing a parameter anyway and
> > you're giving the GPIO name, can you please move away from the "raw"
> > values and move to "logical" values?
>
> I disagree. When hardware engineers design for swappable components, they
> likely look at the electrical compatibility of them. In this case, an
> active-high "enable" pin is electrically compatible with an active-low
> "reset" pin. If we use the logical value here, then we would need more
> logic to know when the logical polarity has to be reversed.
>
> Note that this doesn't work for components that are electrically
> incompatible. But in that case a lot more board dependent code would be
> needed anyway.

As we talked about in person, that made sense in the previous version
of the patch where you were looking for all GPIOs willy-nilly. Now
you'll be specifically asking for a GPIO by name and we should honor
the "active high" or "active low" nature of it.

-Doug


From dianders at chromium.org  Mon Sep 23 12:11:49 2024
From: dianders at chromium.org (Doug Anderson)
Date: Mon, 23 Sep 2024 12:11:49 -0700
Subject: [PATCH v7 08/10] i2c: of-prober: Add GPIO support to simple helpers
In-Reply-To: <CAGXv+5EcxGfdzvarg8hmk1zR9X0s8KUzayQdxfWTrasEGpj=1g@mail.gmail.com>
References: <20240911072751.365361-1-wenst@chromium.org> <20240911072751.365361-9-wenst@chromium.org>
 <CAD=FV=XvPA0UC87fQ+RvFzPv9qRSEP6eQhT79JOx9Arj87i9Mg@mail.gmail.com> <CAGXv+5EcxGfdzvarg8hmk1zR9X0s8KUzayQdxfWTrasEGpj=1g@mail.gmail.com>
Message-ID: <CAD=FV=Wv1uFmxFsaxT9tY=-fwnPsXDjnabNxQ-cK3hm2a9Wo7A@mail.gmail.com>

Hi,

On Tue, Sep 17, 2024 at 5:41?AM Chen-Yu Tsai <wenst at chromium.org> wrote:
>
> > > +static void i2c_of_probe_simple_disable_gpio(struct device *dev, struct i2c_of_probe_simple_ctx *ctx)
> > > +{
> > > +       if (!ctx->gpiod)
> > > +               return;
> > > +
> > > +       dev_dbg(dev, "Setting GPIO to input\n");
> > > +
> > > +       gpiod_direction_input(ctx->gpiod);
> >
> > This is weird. Why set it to input?
>
> It seemed to me this would be more like the initial state, without knowing
> the actual initial state.

In this case, though, you're trying to turn off the resource, not
trying to get back to the initial state. IMO deasserting the GPIO is
the way to do this. If the output needs to make it an input in this
case then it can use some type of open drain mode.


> > I would also say: given that you're providing a parameter anyway and
> > you're giving the GPIO name, can you please move away from the "raw"
> > values and move to "logical" values?
>
> I disagree. When hardware engineers design for swappable components, they
> likely look at the electrical compatibility of them. In this case, an
> active-high "enable" pin is electrically compatible with an active-low
> "reset" pin. If we use the logical value here, then we would need more
> logic to know when the logical polarity has to be reversed.
>
> Note that this doesn't work for components that are electrically
> incompatible. But in that case a lot more board dependent code would be
> needed anyway.

As we talked about in person, that made sense in the previous version
of the patch where you were looking for all GPIOs willy-nilly. Now
you'll be specifically asking for a GPIO by name and we should honor
the "active high" or "active low" nature of it.

-Doug


From mailinglists at kuhnchris.eu  Mon Sep 23 12:14:51 2024
From: mailinglists at kuhnchris.eu (mailinglists at kuhnchris.eu)
Date: Mon, 23 Sep 2024 19:14:51 +0000
Subject: mt8186_mt6366 rt1015p/speaker-codec issue
Message-ID: <D4DWJAHZPHZW.17PDZNBT0R6SG@services>

Dear linux-mediatek community!

First of all, if this is the wrong channel or way to ask question(s) like this, please let me know where to go/redirect me as required, this was the closest to a mediatek-arm based community I could find after a cursory google search - thanks in advance!

To the issue on hand: this is an audio related issue with the mt8186-audio / mt8186_mt6366 via the rt1015p driver.

In kernel 5.15 the sound card driver load via rt1015p as rt1019p seems to succeed just fine:
[    0.202316] mt6358-sound mt6358-sound: mt6358_platform_driver_probe(), dev name mt6358-sound
[    0.202486] rt1015p rt1019p: GPIO lookup for consumer sdb
[    0.202489] rt1015p rt1019p: using device tree for GPIO lookup
[    0.202497] of_get_named_gpiod_flags: parsed 'sdb-gpios' property of node '/rt1019p[0]' - status (0)
...
[    5.503843] mt8186_mt6366_rt1019_rt5682s sound: there is not valid maps for state aud_gpio_tdm_off
[    5.503876] mt8186_mt6366_rt1019_rt5682s sound: there is not valid maps for state aud_gpio_tdm_on
[    5.505701] mt8186_mt6366_rt1019_rt5682s sound: GPIO lookup for consumer dmic
[    5.505710] mt8186_mt6366_rt1019_rt5682s sound: using device tree for GPIO lookup
[    5.505716] of_get_named_gpiod_flags: can't parse 'dmic-gpios' property of node '/sound[0]'
[    5.505725] of_get_named_gpiod_flags: can't parse 'dmic-gpio' property of node '/sound[0]'
[    5.505730] mt8186_mt6366_rt1019_rt5682s sound: using lookup tables for GPIO lookup
[    5.505732] mt8186_mt6366_rt1019_rt5682s sound: No GPIO consumer dmic found
[    5.612768] mt8186_mt6366_rt1019_rt5682s sound: there is not valid maps for state aud_gpio_tdm_off
[    5.612783] mt8186_mt6366_rt1019_rt5682s sound: there is not valid maps for state aud_gpio_tdm_on
[    5.614221] mt8186_mt6366_rt1019_rt5682s sound: GPIO lookup for consumer dmic
[    5.614239] mt8186_mt6366_rt1019_rt5682s sound: using device tree for GPIO lookup
[    5.614251] of_get_named_gpiod_flags: can't parse 'dmic-gpios' property of node '/sound[0]'
[    5.614268] of_get_named_gpiod_flags: can't parse 'dmic-gpio' property of node '/sound[0]'
[    5.614277] mt8186_mt6366_rt1019_rt5682s sound: using lookup tables for GPIO lookup
[    5.614281] mt8186_mt6366_rt1019_rt5682s sound: No GPIO consumer dmic found
[    5.614565] mt8186_mt6366_rt1019_rt5682s sound: there is not valid maps for state aud_gpio_tdm_off
[    5.614589] mt8186_mt6366_rt1019_rt5682s sound: there is not valid maps for state aud_gpio_tdm_on
[    5.721382] mt8186-audio 11210000.audio-controller: ASoC: error at soc_component_read_no_lock on 11210000.audio-controller for register: [0x00000e40] -16
[    5.726771] dmic-codec dmic-codec: GPIO lookup for consumer dmicen
[    5.726788] dmic-codec dmic-codec: using device tree for GPIO lookup
[    5.726799] of_get_named_gpiod_flags: can't parse 'dmicen-gpios' property of node '/dmic-codec[0]'
[    5.726815] of_get_named_gpiod_flags: can't parse 'dmicen-gpio' property of node '/dmic-codec[0]'
[    5.726824] dmic-codec dmic-codec: using lookup tables for GPIO lookup
[    5.726828] dmic-codec dmic-codec: No GPIO consumer dmicen found
[    5.727188] rt1015p rt1019p: ASoC: sink widget SDB overwritten
[    5.773576] debugfs: File 'Mt8186 bt Playback' in directory 'dapm' already present!
[    5.773605] debugfs: File 'Mt8186 bt Capture' in directory 'dapm' already present!
[    5.778985] cros-ec-dev cros-ec-dev.14.auto: CrOS System Control Processor MCU detected
[    5.797209] input: sof-mt8186_rt1019_rt5682s HDMI Jack as /devices/platform/sound/sound/card0/input5
[    5.797563] input: sof-mt8186_rt1019_rt5682s Headset Jack as /devices/platform/sound/sound/card0/input6


But with kernel 6.11-rc7, the sof loads properly like in 5.15, but the I2S3 which links to speaker-codecs, which links to the rt1015p seems to... not work? I sadly have no idea how I could help cooperate trying to get this fixed, I tried disabling the I2S3, but that made the driver very upset that it's missing - trying to re-alias the headphone codec (the rt5682s one) failed due to not getting a lock (makes sense since it's using the same i2s i assume). Also I do not really know if there is any difference between rt1015p and rt1019p, both seem to use the same driver and have a alias/compatible with, so I assume those should be fine... (the rt1019p in the output of the 5.15 kernel is due to the node in the DT being called 'rt1019p', so maybe this is just a fluke)

(Just one thing i noticed, right before sending: comparing the rt1015p output it looks like the 5.15 kernel parses the sdb-gpio but the 6.11 doesn't provide any additional output for rt1015p in the logs... )


[   13.424741] rt1015p speaker-codec: no init pinctrl state
[   13.424760] rt1015p speaker-codec: no sleep pinctrl state
[   13.424765] rt1015p speaker-codec: no idle pinctrl state
[   13.424835] rt1015p speaker-codec: driver: 'rt1015p': driver_bound: bound to device
[   13.424901] rt1015p speaker-codec: bus: 'platform': really_probe: bound device to driver rt1015p
[   13.815913] mt8186-audio 11210000.audio-controller: no pinctrl handle
[   13.816975] mt8186-audio 11210000.audio-controller: mtk_afe_combine_sub_dai(), num of dai 41
[   13.825542] mt8186-audio 11210000.audio-controller: No cache defaults, reading back from HW
[   13.834376] mt8186-audio 11210000.audio-controller: driver: 'mt8186-audio': driver_bound: bound to device
[   13.834417] mt8186-audio 11210000.audio-controller: bus: 'platform': really_probe: bound device to driver mt8186-audio
[   14.545104] mt8186_mt6366 sound: no default pinctrl state
[   14.545186] mt8186_mt6366 sound: error -ENOENT: I2S3: codec dai not found
[   14.551998] mt8186_mt6366 sound: probe with driver mt8186_mt6366 failed with error -2

The device in question is a Asus Chromebook CM1402CM2a/CL1402CM2A - a Mediatek Kompanio 520 (MT8186) using the mt8186-corosla-tentacruel-sku262144 device tree from the kernel - everything is working just fine (after patching out the DP-USBC port mux thing via [PATCH] arm64: dts: mediatek: mt8186-corsola: Disable DPI display interface ) - just the audio refusing to work is bothering me - I would even ignore the on-board speaker and just use headphones, but apparently both run via the same driver? Not really sure what the function of the rt5682s would be then (maybe HDMI audio?) - but sadly I cannot debug this any further as I am pretty much with the back to the wall - the rt1015p seems to load, so I am not even sure if this is a mediatek or a realtek (assuming the rt in rt1015p stands for realtek of course...) issue to begin with.

If there are any more infos I should provide (full dmesg logs, some other commands?) please let me know.


Sorry for all the rant and thanks for reading!


Chris

From conor at kernel.org  Mon Sep 23 14:21:28 2024
From: conor at kernel.org (Conor Dooley)
Date: Mon, 23 Sep 2024 22:21:28 +0100
Subject: [PATCH v1 1/3] dt-bindings: mfd: mediatek: mt6397: Add
 start-year property to RTC
In-Reply-To: <20240923100010.97470-2-angelogioacchino.delregno@collabora.com>
References: <20240923100010.97470-1-angelogioacchino.delregno@collabora.com>
 <20240923100010.97470-2-angelogioacchino.delregno@collabora.com>
Message-ID: <20240923-breeching-trusting-6dc59af2dba0@spud>

On Mon, Sep 23, 2024 at 12:00:08PM +0200, AngeloGioacchino Del Regno wrote:
> Enable evaluating the start-year property to allow shifting the
> RTC's HW range.
> 
> Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>

Acked-by: Conor Dooley <conor.dooley at microchip.com>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 228 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-mediatek/attachments/20240923/a40e66e3/attachment.sig>

From lorenzo at kernel.org  Mon Sep 23 14:29:18 2024
From: lorenzo at kernel.org (Lorenzo Bianconi)
Date: Mon, 23 Sep 2024 23:29:18 +0200
Subject: [PATCH] PCI: mediatek-gen3: Avoid PCIe resetting for Airoha
 EN7581 SoC
In-Reply-To: <20240923171041.GA1158802@bhelgaas>
References: <20240920-pcie-en7581-rst-fix-v1-1-1043fb63ffc9@kernel.org>
 <20240923171041.GA1158802@bhelgaas>
Message-ID: <ZvHdrsx0PZhKWU_6@lore-desk>

> On Fri, Sep 20, 2024 at 10:26:28AM +0200, Lorenzo Bianconi wrote:
> > The PCIe controller available on the EN7581 SoC does not support reset
> > via the following lines:
> > - PCIE_MAC_RSTB
> > - PCIE_PHY_RSTB
> > - PCIE_BRG_RSTB
> > - PCIE_PE_RSTB
> > 
> > Introduce the reset callback in order to avoid resetting the PCIe port
> > for Airoha EN7581 SoC.
> > 
> > Tested-by: Hui Ma <hui.ma at airoha.com>
> > Signed-off-by: Lorenzo Bianconi <lorenzo at kernel.org>
> > ---
> >  drivers/pci/controller/pcie-mediatek-gen3.c | 44 ++++++++++++++++++-----------
> >  1 file changed, 28 insertions(+), 16 deletions(-)
> > 
> > diff --git a/drivers/pci/controller/pcie-mediatek-gen3.c b/drivers/pci/controller/pcie-mediatek-gen3.c
> > index 5c19abac74e8..9cea67e92d98 100644
> > --- a/drivers/pci/controller/pcie-mediatek-gen3.c
> > +++ b/drivers/pci/controller/pcie-mediatek-gen3.c
> > @@ -128,10 +128,12 @@ struct mtk_gen3_pcie;
> >  /**
> >   * struct mtk_gen3_pcie_pdata - differentiate between host generations
> >   * @power_up: pcie power_up callback
> > + * @reset: pcie reset callback
> >   * @phy_resets: phy reset lines SoC data.
> >   */
> >  struct mtk_gen3_pcie_pdata {
> >  	int (*power_up)(struct mtk_gen3_pcie *pcie);
> > +	void (*reset)(struct mtk_gen3_pcie *pcie);
> >  	struct {
> >  		const char *id[MAX_NUM_PHY_RESETS];
> >  		int num_resets;
> > @@ -373,6 +375,28 @@ static void mtk_pcie_enable_msi(struct mtk_gen3_pcie *pcie)
> >  	writel_relaxed(val, pcie->base + PCIE_INT_ENABLE_REG);
> >  }
> >  
> > +static void mtk_pcie_reset(struct mtk_gen3_pcie *pcie)
> > +{
> > +	u32 val;
> > +
> > +	/* Assert all reset signals */
> > +	val = readl_relaxed(pcie->base + PCIE_RST_CTRL_REG);
> > +	val |= PCIE_MAC_RSTB | PCIE_PHY_RSTB | PCIE_BRG_RSTB | PCIE_PE_RSTB;
> > +	writel_relaxed(val, pcie->base + PCIE_RST_CTRL_REG);
> > +
> > +	/*
> > +	 * Described in PCIe CEM specification sections 2.2 (PERST# Signal)
> > +	 * and 2.2.1 (Initial Power-Up (G3 to S0)).
> > +	 * The deassertion of PERST# should be delayed 100ms (TPVPERL)
> > +	 * for the power and clock to become stable.
> > +	 */
> > +	msleep(100);
> 
> I see you're just moving this, but it's a good chance to use
> PCIE_T_PVPERL_MS.

ack, I will add it.

> 
> > +
> > +	/* De-assert reset signals */
> > +	val &= ~(PCIE_MAC_RSTB | PCIE_PHY_RSTB | PCIE_BRG_RSTB | PCIE_PE_RSTB);
> > +	writel_relaxed(val, pcie->base + PCIE_RST_CTRL_REG);
> > +}
> > +
> >  static int mtk_pcie_startup_port(struct mtk_gen3_pcie *pcie)
> >  {
> >  	struct resource_entry *entry;
> > @@ -402,22 +426,9 @@ static int mtk_pcie_startup_port(struct mtk_gen3_pcie *pcie)
> >  	val |= PCIE_DISABLE_DVFSRC_VLT_REQ;
> >  	writel_relaxed(val, pcie->base + PCIE_MISC_CTRL_REG);
> >  
> > -	/* Assert all reset signals */
> > -	val = readl_relaxed(pcie->base + PCIE_RST_CTRL_REG);
> > -	val |= PCIE_MAC_RSTB | PCIE_PHY_RSTB | PCIE_BRG_RSTB | PCIE_PE_RSTB;
> > -	writel_relaxed(val, pcie->base + PCIE_RST_CTRL_REG);
> > -
> > -	/*
> > -	 * Described in PCIe CEM specification sections 2.2 (PERST# Signal)
> > -	 * and 2.2.1 (Initial Power-Up (G3 to S0)).
> > -	 * The deassertion of PERST# should be delayed 100ms (TPVPERL)
> > -	 * for the power and clock to become stable.
> > -	 */
> > -	msleep(100);
> > -
> > -	/* De-assert reset signals */
> > -	val &= ~(PCIE_MAC_RSTB | PCIE_PHY_RSTB | PCIE_BRG_RSTB | PCIE_PE_RSTB);
> > -	writel_relaxed(val, pcie->base + PCIE_RST_CTRL_REG);
> > +	/* Reset the PCIe port if requested by the hw */
> 
> I don't see any real "request" from the hardware.  IIUC, this is more
> like "assert reset if this hardware supports it".

ack, %s/requested/supported. I will fix it.

Regards,
Lorenzo

> 
> > +	if (pcie->soc->reset)
> > +		pcie->soc->reset(pcie);
> >  
> >  	/* Check if the link is up or not */
> >  	err = readl_poll_timeout(pcie->base + PCIE_LINK_STATUS_REG, val,
> > @@ -1207,6 +1218,7 @@ static const struct dev_pm_ops mtk_pcie_pm_ops = {
> >  
> >  static const struct mtk_gen3_pcie_pdata mtk_pcie_soc_mt8192 = {
> >  	.power_up = mtk_pcie_power_up,
> > +	.reset = mtk_pcie_reset,
> >  	.phy_resets = {
> >  		.id[0] = "phy",
> >  		.num_resets = 1,
> > 
> > ---
> > base-commit: f2024903cb387971abdbc6398a430e735a9b394c
> > change-id: 20240920-pcie-en7581-rst-fix-8161658c13c4
> > 
> > Best regards,
> > -- 
> > Lorenzo Bianconi <lorenzo at kernel.org>
> > 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 228 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-mediatek/attachments/20240923/374774f2/attachment.sig>

From lkp at intel.com  Mon Sep 23 16:44:06 2024
From: lkp at intel.com (kernel test robot)
Date: Tue, 24 Sep 2024 07:44:06 +0800
Subject: [PATCH v1 1/1] drm/mediatek: dp: Add sdp path reset
In-Reply-To: <20240923133610.23728-1-liankun.yang@mediatek.com>
References: <20240923133610.23728-1-liankun.yang@mediatek.com>
Message-ID: <202409240700.ARp9pDUk-lkp@intel.com>

Hi Liankun,

kernel test robot noticed the following build errors:

[auto build test ERROR on pza/reset/next]
[also build test ERROR on linus/master v6.11 next-20240923]
[cannot apply to pza/imx-drm/next]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Liankun-Yang/drm-mediatek-dp-Add-sdp-path-reset/20240923-213747
base:   https://git.pengutronix.de/git/pza/linux reset/next
patch link:    https://lore.kernel.org/r/20240923133610.23728-1-liankun.yang%40mediatek.com
patch subject: [PATCH v1 1/1] drm/mediatek: dp: Add sdp path reset
config: arm-allmodconfig (https://download.01.org/0day-ci/archive/20240924/202409240700.ARp9pDUk-lkp at intel.com/config)
compiler: arm-linux-gnueabi-gcc (GCC) 14.1.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240924/202409240700.ARp9pDUk-lkp at intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp at intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202409240700.ARp9pDUk-lkp at intel.com/

All errors (new ones prefixed by >>):

   drivers/gpu/drm/mediatek/mtk_dp.c: In function 'mtk_dp_sdp_path_reset':
>> drivers/gpu/drm/mediatek/mtk_dp.c:1058:33: error: 'SDP_RESET_SW_DP_ENC0_P0' undeclared (first use in this function); did you mean 'SDP_PACKET_W_DP_ENC1_P0'?
    1058 |                                 SDP_RESET_SW_DP_ENC0_P0,
         |                                 ^~~~~~~~~~~~~~~~~~~~~~~
         |                                 SDP_PACKET_W_DP_ENC1_P0
   drivers/gpu/drm/mediatek/mtk_dp.c:1058:33: note: each undeclared identifier is reported only once for each function it appears in


vim +1058 drivers/gpu/drm/mediatek/mtk_dp.c

  1054	
  1055	static void mtk_dp_sdp_path_reset(struct mtk_dp *mtk_dp)
  1056	{
  1057		mtk_dp_update_bits(mtk_dp, MTK_DP_ENC0_P0_3004,
> 1058					SDP_RESET_SW_DP_ENC0_P0,
  1059					SDP_RESET_SW_DP_ENC0_P0);
  1060	
  1061		/* Wait for sdp path reset to complete */
  1062		usleep_range(1000, 5000);
  1063		mtk_dp_update_bits(mtk_dp, MTK_DP_ENC0_P0_3004,
  1064					0, SDP_RESET_SW_DP_ENC0_P0);
  1065	}
  1066	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki


From lkp at intel.com  Mon Sep 23 18:09:08 2024
From: lkp at intel.com (kernel test robot)
Date: Tue, 24 Sep 2024 09:09:08 +0800
Subject: [PATCH v1 1/1] drm/mediatek: dp: Add sdp path reset
In-Reply-To: <20240923133610.23728-1-liankun.yang@mediatek.com>
References: <20240923133610.23728-1-liankun.yang@mediatek.com>
Message-ID: <202409240818.3cqdkw5o-lkp@intel.com>

Hi Liankun,

kernel test robot noticed the following build errors:

[auto build test ERROR on pza/reset/next]
[also build test ERROR on linus/master v6.11 next-20240923]
[cannot apply to pza/imx-drm/next]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Liankun-Yang/drm-mediatek-dp-Add-sdp-path-reset/20240923-213747
base:   https://git.pengutronix.de/git/pza/linux reset/next
patch link:    https://lore.kernel.org/r/20240923133610.23728-1-liankun.yang%40mediatek.com
patch subject: [PATCH v1 1/1] drm/mediatek: dp: Add sdp path reset
config: arm64-allmodconfig (https://download.01.org/0day-ci/archive/20240924/202409240818.3cqdkw5o-lkp at intel.com/config)
compiler: clang version 20.0.0git (https://github.com/llvm/llvm-project 8663a75fa2f31299ab8d1d90288d9df92aadee88)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240924/202409240818.3cqdkw5o-lkp at intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp at intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202409240818.3cqdkw5o-lkp at intel.com/

All errors (new ones prefixed by >>):

   In file included from drivers/gpu/drm/mediatek/mtk_dp.c:9:
   In file included from include/drm/display/drm_dp_helper.h:27:
   In file included from include/linux/i2c.h:13:
   In file included from include/linux/acpi.h:39:
   In file included from include/acpi/acpi_io.h:7:
   In file included from arch/arm64/include/asm/acpi.h:14:
   In file included from include/linux/memblock.h:12:
   In file included from include/linux/mm.h:2228:
   include/linux/vmstat.h:503:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
     503 |         return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
         |                            ~~~~~~~~~~~~~~~~~~~~~ ^
     504 |                            item];
         |                            ~~~~
   include/linux/vmstat.h:510:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
     510 |         return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
         |                            ~~~~~~~~~~~~~~~~~~~~~ ^
     511 |                            NR_VM_NUMA_EVENT_ITEMS +
         |                            ~~~~~~~~~~~~~~~~~~~~~~
   include/linux/vmstat.h:517:36: warning: arithmetic between different enumeration types ('enum node_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
     517 |         return node_stat_name(NR_LRU_BASE + lru) + 3; // skip "nr_"
         |                               ~~~~~~~~~~~ ^ ~~~
   include/linux/vmstat.h:523:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
     523 |         return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
         |                            ~~~~~~~~~~~~~~~~~~~~~ ^
     524 |                            NR_VM_NUMA_EVENT_ITEMS +
         |                            ~~~~~~~~~~~~~~~~~~~~~~
>> drivers/gpu/drm/mediatek/mtk_dp.c:1058:5: error: use of undeclared identifier 'SDP_RESET_SW_DP_ENC0_P0'
    1058 |                                 SDP_RESET_SW_DP_ENC0_P0,
         |                                 ^
   drivers/gpu/drm/mediatek/mtk_dp.c:1059:5: error: use of undeclared identifier 'SDP_RESET_SW_DP_ENC0_P0'
    1059 |                                 SDP_RESET_SW_DP_ENC0_P0);
         |                                 ^
   drivers/gpu/drm/mediatek/mtk_dp.c:1064:8: error: use of undeclared identifier 'SDP_RESET_SW_DP_ENC0_P0'
    1064 |                                 0, SDP_RESET_SW_DP_ENC0_P0);
         |                                    ^
   4 warnings and 3 errors generated.


vim +/SDP_RESET_SW_DP_ENC0_P0 +1058 drivers/gpu/drm/mediatek/mtk_dp.c

  1054	
  1055	static void mtk_dp_sdp_path_reset(struct mtk_dp *mtk_dp)
  1056	{
  1057		mtk_dp_update_bits(mtk_dp, MTK_DP_ENC0_P0_3004,
> 1058					SDP_RESET_SW_DP_ENC0_P0,
  1059					SDP_RESET_SW_DP_ENC0_P0);
  1060	
  1061		/* Wait for sdp path reset to complete */
  1062		usleep_range(1000, 5000);
  1063		mtk_dp_update_bits(mtk_dp, MTK_DP_ENC0_P0_3004,
  1064					0, SDP_RESET_SW_DP_ENC0_P0);
  1065	}
  1066	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki


From jason-jh.lin at mediatek.com  Mon Sep 23 18:49:35 2024
From: jason-jh.lin at mediatek.com (Jason-JH.Lin)
Date: Tue, 24 Sep 2024 09:49:35 +0800
Subject: [PATCH v4] drm/mediatek: ovl: Add fmt_convert function pointer to driver data
Message-ID: <20240924014935.23677-1-jason-jh.lin@mediatek.com>

OVL_CON_CLRFMT_MAN is a configuration for extending color format
settings of DISP_REG_OVL_CON(n).
It will change some of the original color format settings.

Take the settings of (3 << 12) for example.
- If OVL_CON_CLRFMT_MAN = 0 means OVL_CON_CLRFMT_RGBA8888.
- If OVL_CON_CLRFMT_MAN = 1 means OVL_CON_CLRFMT_PARGB8888.

Since OVL_CON_CLRFMT_MAN is not supported on previous SoCs,
It breaks the OVL color format setting of MT8173.

Therefore, the fmt_convert function pointer is added to the driver data
and mtk_ovl_fmt_convert_with_blend is implemented for MT8192 and MT8195
that support OVL_CON_CLRFMT_MAN, and mtk_ovl_fmt_convert is implemented
for other SoCs that do not support it to solve the degradation problem.

Fixes: a3f7f7ef4bfe ("drm/mediatek: Support "Pre-multiplied" blending in OVL")
Signed-off-by: Jason-JH.Lin <jason-jh.lin at mediatek.com>
Tested-by: Alper Nebi Yasak <alpernebiyasak at gmail.com>
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
---
 drivers/gpu/drm/mediatek/mtk_disp_ovl.c | 68 ++++++++++++++++++++++---
 1 file changed, 61 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
index 89b439dcf3a6..8f7b7e07aeb1 100644
--- a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
+++ b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
@@ -143,6 +143,7 @@ struct mtk_disp_ovl_data {
 	unsigned int addr;
 	unsigned int gmc_bits;
 	unsigned int layer_nr;
+	unsigned int (*fmt_convert)(struct device *dev, struct mtk_plane_state *state);
 	bool fmt_rgb565_is_0;
 	bool smi_id_en;
 	bool supports_afbc;
@@ -386,13 +387,59 @@ void mtk_ovl_layer_off(struct device *dev, unsigned int idx,
 		      DISP_REG_OVL_RDMA_CTRL(idx));
 }
 
-static unsigned int ovl_fmt_convert(struct mtk_disp_ovl *ovl, unsigned int fmt,
-				    unsigned int blend_mode)
+static unsigned int mtk_ovl_fmt_convert(struct device *dev, struct mtk_plane_state *state)
 {
-	/* The return value in switch "MEM_MODE_INPUT_FORMAT_XXX"
-	 * is defined in mediatek HW data sheet.
-	 * The alphabet order in XXX is no relation to data
-	 * arrangement in memory.
+	struct mtk_disp_ovl *ovl = dev_get_drvdata(dev);
+	unsigned int fmt = state->pending.format;
+
+	switch (fmt) {
+	default:
+	case DRM_FORMAT_RGB565:
+		return OVL_CON_CLRFMT_RGB565(ovl);
+	case DRM_FORMAT_BGR565:
+		return OVL_CON_CLRFMT_RGB565(ovl) | OVL_CON_BYTE_SWAP;
+	case DRM_FORMAT_RGB888:
+		return OVL_CON_CLRFMT_RGB888(ovl);
+	case DRM_FORMAT_BGR888:
+		return OVL_CON_CLRFMT_RGB888(ovl) | OVL_CON_BYTE_SWAP;
+	case DRM_FORMAT_RGBX8888:
+	case DRM_FORMAT_RGBA8888:
+	case DRM_FORMAT_RGBX1010102:
+	case DRM_FORMAT_RGBA1010102:
+		return OVL_CON_CLRFMT_RGBA8888;
+	case DRM_FORMAT_BGRX8888:
+	case DRM_FORMAT_BGRA8888:
+	case DRM_FORMAT_BGRX1010102:
+	case DRM_FORMAT_BGRA1010102:
+		return OVL_CON_CLRFMT_BGRA8888;
+	case DRM_FORMAT_XRGB8888:
+	case DRM_FORMAT_ARGB8888:
+	case DRM_FORMAT_XRGB2101010:
+	case DRM_FORMAT_ARGB2101010:
+		return OVL_CON_CLRFMT_ARGB8888;
+	case DRM_FORMAT_XBGR8888:
+	case DRM_FORMAT_ABGR8888:
+	case DRM_FORMAT_XBGR2101010:
+	case DRM_FORMAT_ABGR2101010:
+		return OVL_CON_CLRFMT_ABGR8888;
+	case DRM_FORMAT_UYVY:
+		return OVL_CON_CLRFMT_UYVY | OVL_CON_MTX_YUV_TO_RGB;
+	case DRM_FORMAT_YUYV:
+		return OVL_CON_CLRFMT_YUYV | OVL_CON_MTX_YUV_TO_RGB;
+	}
+}
+
+static unsigned int mtk_ovl_fmt_convert_with_blend(struct device *dev,
+						   struct mtk_plane_state *state)
+{
+	struct mtk_disp_ovl *ovl = dev_get_drvdata(dev);
+	unsigned int fmt = state->pending.format;
+	unsigned int blend_mode = state->base.pixel_blend_mode;
+
+	/*
+	 * For the platforms where OVL_CON_CLRFMT_MAN is defined in the
+	 * hardware data sheet and supports premultiplied color formats
+	 * such as OVL_CON_CLRFMT_PARGB8888.
 	 */
 	switch (fmt) {
 	default:
@@ -471,7 +518,7 @@ void mtk_ovl_layer_config(struct device *dev, unsigned int idx,
 		return;
 	}
 
-	con = ovl_fmt_convert(ovl, fmt, blend_mode);
+	con = ovl->data->fmt_convert(dev, state);
 	if (state->base.fb) {
 		con |= OVL_CON_AEN;
 		con |= state->base.alpha & OVL_CON_ALPHA;
@@ -625,6 +672,7 @@ static const struct mtk_disp_ovl_data mt2701_ovl_driver_data = {
 	.addr = DISP_REG_OVL_ADDR_MT2701,
 	.gmc_bits = 8,
 	.layer_nr = 4,
+	.fmt_convert = mtk_ovl_fmt_convert,
 	.fmt_rgb565_is_0 = false,
 	.formats = mt8173_formats,
 	.num_formats = ARRAY_SIZE(mt8173_formats),
@@ -634,6 +682,7 @@ static const struct mtk_disp_ovl_data mt8173_ovl_driver_data = {
 	.addr = DISP_REG_OVL_ADDR_MT8173,
 	.gmc_bits = 8,
 	.layer_nr = 4,
+	.fmt_convert = mtk_ovl_fmt_convert,
 	.fmt_rgb565_is_0 = true,
 	.formats = mt8173_formats,
 	.num_formats = ARRAY_SIZE(mt8173_formats),
@@ -643,6 +692,7 @@ static const struct mtk_disp_ovl_data mt8183_ovl_driver_data = {
 	.addr = DISP_REG_OVL_ADDR_MT8173,
 	.gmc_bits = 10,
 	.layer_nr = 4,
+	.fmt_convert = mtk_ovl_fmt_convert,
 	.fmt_rgb565_is_0 = true,
 	.formats = mt8173_formats,
 	.num_formats = ARRAY_SIZE(mt8173_formats),
@@ -652,6 +702,7 @@ static const struct mtk_disp_ovl_data mt8183_ovl_2l_driver_data = {
 	.addr = DISP_REG_OVL_ADDR_MT8173,
 	.gmc_bits = 10,
 	.layer_nr = 2,
+	.fmt_convert = mtk_ovl_fmt_convert,
 	.fmt_rgb565_is_0 = true,
 	.formats = mt8173_formats,
 	.num_formats = ARRAY_SIZE(mt8173_formats),
@@ -661,6 +712,7 @@ static const struct mtk_disp_ovl_data mt8192_ovl_driver_data = {
 	.addr = DISP_REG_OVL_ADDR_MT8173,
 	.gmc_bits = 10,
 	.layer_nr = 4,
+	.fmt_convert = mtk_ovl_fmt_convert_with_blend,
 	.fmt_rgb565_is_0 = true,
 	.smi_id_en = true,
 	.formats = mt8173_formats,
@@ -671,6 +723,7 @@ static const struct mtk_disp_ovl_data mt8192_ovl_2l_driver_data = {
 	.addr = DISP_REG_OVL_ADDR_MT8173,
 	.gmc_bits = 10,
 	.layer_nr = 2,
+	.fmt_convert = mtk_ovl_fmt_convert_with_blend,
 	.fmt_rgb565_is_0 = true,
 	.smi_id_en = true,
 	.formats = mt8173_formats,
@@ -681,6 +734,7 @@ static const struct mtk_disp_ovl_data mt8195_ovl_driver_data = {
 	.addr = DISP_REG_OVL_ADDR_MT8173,
 	.gmc_bits = 10,
 	.layer_nr = 4,
+	.fmt_convert = mtk_ovl_fmt_convert_with_blend,
 	.fmt_rgb565_is_0 = true,
 	.smi_id_en = true,
 	.supports_afbc = true,
-- 
2.43.0



From vignesh.raman at collabora.com  Mon Sep 23 19:25:58 2024
From: vignesh.raman at collabora.com (Vignesh Raman)
Date: Tue, 24 Sep 2024 07:55:58 +0530
Subject: [PATCH v1] docs/gpu: ci: update flake tests requirements
Message-ID: <20240924022600.1441969-1-vignesh.raman@collabora.com>

Update the documentation to require linking to a relevant GitLab
issue for each new flake entry instead of an email report. Added
specific GitLab issue URLs for i915, xe and other drivers.

Signed-off-by: Vignesh Raman <vignesh.raman at collabora.com>
---
 Documentation/gpu/automated_testing.rst | 15 ++++++++++-----
 1 file changed, 10 insertions(+), 5 deletions(-)

diff --git a/Documentation/gpu/automated_testing.rst b/Documentation/gpu/automated_testing.rst
index 2d5a28866afe..f73b8939dc3a 100644
--- a/Documentation/gpu/automated_testing.rst
+++ b/Documentation/gpu/automated_testing.rst
@@ -67,20 +67,25 @@ Lists the tests that for a given driver on a specific hardware revision are
 known to behave unreliably. These tests won't cause a job to fail regardless of
 the result. They will still be run.
 
-Each new flake entry must be associated with a link to the email reporting the
-bug to the author of the affected driver, the board name or Device Tree name of
-the board, the first kernel version affected, the IGT version used for tests,
-and an approximation of the failure rate.
+Each new flake entry must include a link to the relevant GitLab issue, the board
+name or Device Tree name, the first kernel version affected, the IGT version used
+for tests and an approximation of the failure rate.
 
 They should be provided under the following format::
 
-  # Bug Report: $LORE_OR_PATCHWORK_URL
+  # Bug Report: $GITLAB_ISSUE
   # Board Name: broken-board.dtb
   # Linux Version: 6.6-rc1
   # IGT Version: 1.28-gd2af13d9f
   # Failure Rate: 100
   flaky-test
 
+The GitLab issue must include the logs and the pipeline link. Use the appropriate
+link below to create an issue.
+https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/ for i915 drivers
+https://gitlab.freedesktop.org/drm/xe/kernel/-/issues/ for xe drivers
+https://gitlab.freedesktop.org/drm/misc/kernel/-/issues for other drivers
+
 drivers/gpu/drm/ci/${DRIVER_NAME}-${HW_REVISION}-skips.txt
 -----------------------------------------------------------
 
-- 
2.43.0



From macpaul.lin at mediatek.com  Mon Sep 23 21:08:04 2024
From: macpaul.lin at mediatek.com (Macpaul Lin)
Date: Tue, 24 Sep 2024 12:08:04 +0800
Subject: [PATCH v1 2/3] rtc: mt6359: Add RTC hardware range and add
 support for start-year
In-Reply-To: <20240923100010.97470-3-angelogioacchino.delregno@collabora.com>
References: <20240923100010.97470-1-angelogioacchino.delregno@collabora.com>
 <20240923100010.97470-3-angelogioacchino.delregno@collabora.com>
Message-ID: <0748868d-4789-fcaa-e70f-6a4508411b36@mediatek.com>


On 9/23/24 18:00, AngeloGioacchino Del Regno wrote:
> Add the RTC hardware range parameters to enable the possibility
> of using the `start-year` devicetree property which, if present,
> will set the start_secs parameter by overriding the defaults
> that this driver is setting;
> 
> To keep compatibility with (hence have the same date/time reading
> as) the old behavior, set:
>   - range_min to 1900-01-01 00:00:00
>   - range_max to 2027-12-31 23:59:59 (HW year max range is 0-127)
>   - start_secs defaulting to 1968-01-02 00:00:00
> 
> Please note that the oddness of starting from January 2nd is not
> a hardware quirk and it's done only to get the same date/time
> reading as an RTC which time was set before this commit.
> 
> Also remove the RTC_MIN_YEAR_OFFSET addition and subtraction in
> callbacks set_time() and read_time() respectively, as now this
> is already done by the API.
> 
> Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
> ---
>   drivers/rtc/rtc-mt6397.c | 13 ++++---------
>   1 file changed, 4 insertions(+), 9 deletions(-)

[snip]

Thanks for helping add new patch fix for RTC.

> @@ -302,6 +293,10 @@ static int mtk_rtc_probe(struct platform_device *pdev)
>   	device_init_wakeup(&pdev->dev, 1);
>   
>   	rtc->rtc_dev->ops = &mtk_rtc_ops;
> +	rtc->rtc_dev->range_min = RTC_TIMESTAMP_BEGIN_1900;
> +	rtc->rtc_dev->range_max = mktime64(2027, 12, 31, 23, 59, 59);
> +	rtc->rtc_dev->start_secs = mktime64(1968, 1, 2, 0, 0, 0);
> +	rtc->rtc_dev->set_start_time = true;
>   
>   	return devm_rtc_register_device(rtc->rtc_dev);
>   }

Dear @Zhanhan, Please help to leave comment if you think there is 
something need to be clarify. For example, I've found some relate origin 
defines
in "include/linux/mfd/mt6397/rtc.h"
#define RTC_MIN_YEAR	1968
#define RTC_BASE_YEAR	1900
#define RTC_NUM_YEAR	128
#define RTC_MIN_YEAR_OFFSET	(RTC_MIN_YEAR - RTC_BASE_YEAR)

Should MediaTek remove RTC_MIN_YEAR and RTC_BASE_YEAR in next patch?
And since there may not exist any smartphone/tablet/TV using mt6397
RTC earlier than 2010? Is it possible to change
RTC_TIMESTAMP_BEGIN_1900 to RTC_TIMESTAMP_BEGIN_2000 without breaking
compatibility for these devices?

Thanks
Macpaul Lin


From dmitry.baryshkov at linaro.org  Mon Sep 23 23:16:04 2024
From: dmitry.baryshkov at linaro.org (Dmitry Baryshkov)
Date: Tue, 24 Sep 2024 08:16:04 +0200
Subject: [PATCH v1] docs/gpu: ci: update flake tests requirements
In-Reply-To: <20240924022600.1441969-1-vignesh.raman@collabora.com>
References: <20240924022600.1441969-1-vignesh.raman@collabora.com>
Message-ID: <CAA8EJprUUUc0iDph-HPrW1anrdnzYju7+JERQdHbwxvznq=H4w@mail.gmail.com>

On Tue, 24 Sept 2024 at 04:26, Vignesh Raman
<vignesh.raman at collabora.com> wrote:
>
> Update the documentation to require linking to a relevant GitLab
> issue for each new flake entry instead of an email report. Added
> specific GitLab issue URLs for i915, xe and other drivers.
>
> Signed-off-by: Vignesh Raman <vignesh.raman at collabora.com>
> ---
>  Documentation/gpu/automated_testing.rst | 15 ++++++++++-----
>  1 file changed, 10 insertions(+), 5 deletions(-)
>
> diff --git a/Documentation/gpu/automated_testing.rst b/Documentation/gpu/automated_testing.rst
> index 2d5a28866afe..f73b8939dc3a 100644
> --- a/Documentation/gpu/automated_testing.rst
> +++ b/Documentation/gpu/automated_testing.rst
> @@ -67,20 +67,25 @@ Lists the tests that for a given driver on a specific hardware revision are
>  known to behave unreliably. These tests won't cause a job to fail regardless of
>  the result. They will still be run.
>
> -Each new flake entry must be associated with a link to the email reporting the
> -bug to the author of the affected driver, the board name or Device Tree name of
> -the board, the first kernel version affected, the IGT version used for tests,
> -and an approximation of the failure rate.
> +Each new flake entry must include a link to the relevant GitLab issue, the board
> +name or Device Tree name, the first kernel version affected, the IGT version used
> +for tests and an approximation of the failure rate.
>
>  They should be provided under the following format::
>
> -  # Bug Report: $LORE_OR_PATCHWORK_URL
> +  # Bug Report: $GITLAB_ISSUE
>    # Board Name: broken-board.dtb
>    # Linux Version: 6.6-rc1
>    # IGT Version: 1.28-gd2af13d9f
>    # Failure Rate: 100
>    flaky-test
>
> +The GitLab issue must include the logs and the pipeline link. Use the appropriate
> +link below to create an issue.
> +https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/ for i915 drivers
> +https://gitlab.freedesktop.org/drm/xe/kernel/-/issues/ for xe drivers

drm/msm for msm driver, please. Otherwise we can easily miss such issues.

> +https://gitlab.freedesktop.org/drm/misc/kernel/-/issues for other drivers
> +
>  drivers/gpu/drm/ci/${DRIVER_NAME}-${HW_REVISION}-skips.txt
>  -----------------------------------------------------------
>
> --
> 2.43.0
>


-- 
With best wishes
Dmitry


From ilias.apalodimas at linaro.org  Mon Sep 23 23:27:07 2024
From: ilias.apalodimas at linaro.org (Ilias Apalodimas)
Date: Tue, 24 Sep 2024 09:27:07 +0300
Subject: [PATCH net 2/2] page_pool: fix IOMMU crash when driver has
 already unbound
In-Reply-To: <20240923175226.GC9634@ziepe.ca>
References: <20240918111826.863596-1-linyunsheng@huawei.com>
 <20240918111826.863596-3-linyunsheng@huawei.com> <CAC_iWjK=G7Oo5=pN2QunhasgDC6NyC1L+96jigX7u9ad+PbYng@mail.gmail.com>
 <894a3c2c-22f9-45b9-a82b-de7320066b42@kernel.org> <cdfecd37-31d7-42d2-a8d8-92008285b42e@huawei.com>
 <0e8c7a7a-0e2a-42ec-adbc-b29f6a514517@kernel.org> <CAC_iWj+3JvPY2oqVOdu0T1Wt6-ukoy=dLc72u1f55yY23uOTbA@mail.gmail.com>
 <2c5ccfff-6ab4-4aea-bff6-3679ff72cc9a@huawei.com> <20240923175226.GC9634@ziepe.ca>
Message-ID: <CAC_iWjLmWtN51eLnnuPtL5vzTBQF2v43zyoV1+AZqUmuSD1DGg@mail.gmail.com>

Hi Jason,

On Mon, 23 Sept 2024 at 20:52, Jason Gunthorpe <jgg at ziepe.ca> wrote:
>
> On Fri, Sep 20, 2024 at 02:14:02PM +0800, Yunsheng Lin wrote:
>
> > I am not sure what dose the API that allows netdev to "give" struct device
> > to page_pool look like or how to implement the API yet, but the obvious way
> > to stall the calling of device_del() is to wait for the inflight
> > page to
>
> It is not device_del() you need to stall, but the remove() function of
> the device driver.
>
> Once all drivers have been unbound the DMA API can be reconfigured and
> all existing DMA mappings must be concluded before this happens,
> otherwise there will be problems.
>
> So, stalling something like unregister_netdevice() would be a better
> target - though stalling forever on driver unbind would not be
> acceptable.

TBH, I have doubts that even stalling it for small amounts of time is
going to disrupt userspace and people are going to yell at us.
I am gonna repeat myself here, but I think keeping a list of the
inflight SKBs that we need to unmap when the interface goes down, is
the most complex, but less disruptive solution

Thanks
/Ilias
>
> Jason


From gur.stavi at huawei.com  Mon Sep 23 23:45:59 2024
From: gur.stavi at huawei.com (Gur Stavi)
Date: Tue, 24 Sep 2024 09:45:59 +0300
Subject: [PATCH net 2/2] page_pool: fix IOMMU crash when driver has already unbound
In-Reply-To: <2fb8d278-62e0-4a81-a537-8f601f61e81d@huawei.com>
References: <2fb8d278-62e0-4a81-a537-8f601f61e81d@huawei.com>
Message-ID: <20240924064559.1681488-1-gur.stavi@huawei.com>

>>>> With all the caching in the network stack, some pages may be
>>>> held in the network stack without returning to the page_pool
>>>> soon enough, and with VF disable causing the driver unbound,
>>>> the page_pool does not stop the driver from doing it's
>>>> unbounding work, instead page_pool uses workqueue to check
>>>> if there is some pages coming back from the network stack
>>>> periodically, if there is any, it will do the dma unmmapping
>>>> related cleanup work.
>>>>
>>>> As mentioned in [1], attempting DMA unmaps after the driver
>>>> has already unbound may leak resources or at worst corrupt
>>>> memory. Fundamentally, the page pool code cannot allow DMA
>>>> mappings to outlive the driver they belong to.
>>>>
>>>> Currently it seems there are at least two cases that the page
>>>> is not released fast enough causing dma unmmapping done after
>>>> driver has already unbound:
>>>> 1. ipv4 packet defragmentation timeout: this seems to cause
>>>>    delay up to 30 secs:
>>>>
>>>> 2. skb_defer_free_flush(): this may cause infinite delay if
>>>>    there is no triggering for net_rx_action().
>>>>
>>>> In order not to do the dma unmmapping after driver has already
>>>> unbound and stall the unloading of the networking driver, add
>>>> the pool->items array to record all the pages including the ones
>>>> which are handed over to network stack, so the page_pool can
>>>> do the dma unmmapping for those pages when page_pool_destroy()
>>>> is called.
>>>
>>> So, I was thinking of a very similar idea. But what do you mean by
>>> "all"? The pages that are still in caches (slow or fast) of the pool
>>> will be unmapped during page_pool_destroy().
>>
>> Yes, it includes the one in pool->alloc and pool->ring.
>
> It worths mentioning that there is a semantics changing here:
> Before this patch, there can be almost unlimited inflight pages used by
> driver and network stack, as page_pool doesn't really track those pages.
> After this patch, as we use a fixed-size pool->items array to track the
> inflight pages, the inflight pages is limited by the pool->items, currently
> the size of pool->items array is calculated as below in this patch:
>
> +#define PAGE_POOL_MIN_ITEM_CNT	512
> +	unsigned int item_cnt = (params->pool_size ? : 1024) +
> +				PP_ALLOC_CACHE_SIZE + PAGE_POOL_MIN_ITEM_CNT;
>
> Personally I would consider it is an advantage to limit how many pages which
> are used by the driver and network stack, the problem seems to how to decide
> the limited number of page used by network stack so that performance is not
> impacted.

In theory, with respect to the specific problem at hand, you only have
a limit on the number of mapped pages inflight. Once you reach this
limit you can unmap these old pages, forget about them and remember
new ones.


From Hui.Ma at airoha.com  Mon Sep 23 23:53:42 2024
From: Hui.Ma at airoha.com (=?utf-8?B?SHVpIE1hICjpqazmhacp?=)
Date: Tue, 24 Sep 2024 06:53:42 +0000
Subject: =?utf-8?B?5Zue5aSNOiDlm57lpI06IFtQQVRDSF0gUENJOiBtZWRpYXRlay1nZW4zOiBB?=
 =?utf-8?Q?void_PCIe_resetting_for_Airoha_EN7581_SoC?=
In-Reply-To: <05ec0016-09e8-4e84-92d1-698b3c195ec8@collabora.com>
References: <20240920-pcie-en7581-rst-fix-v1-1-1043fb63ffc9@kernel.org>
 <d8941149-9125-4fe2-a1c0-ab29223a0c87@collabora.com>
 <SG2PR03MB6341D9B41B5742BD45E09B46FF6F2@SG2PR03MB6341.apcprd03.prod.outlook.com>
 <05ec0016-09e8-4e84-92d1-698b3c195ec8@collabora.com>
Message-ID: <SG2PR03MB63415DB5791C58C7EA69FF01FF682@SG2PR03MB6341.apcprd03.prod.outlook.com>


> Il 23/09/24 12:06, Hui Ma (??) ha scritto:
> > Hi Angelo?
> > 
> >           EN7581 doesn't support pulling up/down PERST by bit3 of PCIe MAC register 0x148(PCIE_RST_CTRL_REG).
> > 
> >           EN7581 toggle PERST in clk_bulk_enable function called by mtk_pcie_en7581_power_up function.
> > 
>
> Hello Hui,
> please don't top post.

> Anyway, are those bits unexistant on EN7581, or are those used for different functions?

> If those do not exist, and setting those bits will not produce adverse effects, it'd be possible to avoid creating a different codepath and just add a comment saying that the setting has no effect on Airoha EN7581.

> Regards,
> Angelo

> > 


Hi Angelo,
	Sorry for reply late reply.

	Bit3 of the register doesn't work on EN7581 because of the hardware issue.
	We have already completed PCIe RC/EP reset action before setting PCIe MAC register 0x148.
	At this moment?the device is in release status?if we toggle PCIe MAC register 0x148?PCIe will link down occasionally.

	In order to avoid creating a different codepath, we are trying another solution.



Regards,
Hui










> > 
> > 
> > 
> > 
> > 
> -----????-----
> ???: AngeloGioacchino Del Regno 
> <angelogioacchino.delregno at collabora.com>
> ????: 2024?9?23? 17:42
> ???: Lorenzo Bianconi <lorenzo at kernel.org>; Ryder Lee 
> <Ryder.Lee at mediatek.com>; Jianjun Wang (???) 
> <Jianjun.Wang at mediatek.com>; Lorenzo Pieralisi 
> <lpieralisi at kernel.org>; Krzysztof Wilczy?ski <kw at linux.com>; Rob 
> Herring <robh at kernel.org>; Bjorn Helgaas <bhelgaas at google.com>; 
> Matthias Brugger <matthias.bgg at gmail.com>
> ??: Christian Marangi <ansuelsmth at gmail.com>; 
> linux-pci at vger.kernel.org; linux-mediatek at lists.infradead.org; 
> linux-arm-kernel at lists.infradead.org; upstream <upstream at airoha.com>; 
> Hui Ma (??) <Hui.Ma at airoha.com>
> ??: Re: [PATCH] PCI: mediatek-gen3: Avoid PCIe resetting for Airoha 
> EN7581 SoC
> 
> 
> 
> Il 20/09/24 10:26, Lorenzo Bianconi ha scritto:
> 
>> The PCIe controller available on the EN7581 SoC does not support 
>> reset
> 
>> via the following lines:
> 
>> - PCIE_MAC_RSTB
> 
>> - PCIE_PHY_RSTB
> 
>> - PCIE_BRG_RSTB
> 
>> - PCIE_PE_RSTB
> 
>>
> 
>> Introduce the reset callback in order to avoid resetting the PCIe 
>> port
> 
>> for Airoha EN7581 SoC.
> 
>>
> 
> 
> 
> EN7581 doesn't support pulling up/down PERST#?!
> 
> That looks definitely odd, as that signal is part of the PCI-Express CEM spec.
> 
> 
> 
> Besides, there's another PERST# assertion at mtk_pcie_suspend_noirq()...
> 
> 
> 
> Cheers,
> 
> Angelo
> 
> 
> 
>> Tested-by: Hui Ma <hui.ma at airoha.com<mailto:hui.ma at airoha.com>>
> 
>> Signed-off-by: Lorenzo Bianconi 
>> <lorenzo at kernel.org<mailto:lorenzo at kernel.org>>
> 
>> ---
> 
>>    drivers/pci/controller/pcie-mediatek-gen3.c | 44 
>> ++++++++++++++++++-----------
> 
>>    1 file changed, 28 insertions(+), 16 deletions(-)
> 
>>
> 
>> diff --git a/drivers/pci/controller/pcie-mediatek-gen3.c
> 
>> b/drivers/pci/controller/pcie-mediatek-gen3.c
> 
>> index 5c19abac74e8..9cea67e92d98 100644
> 
>> --- a/drivers/pci/controller/pcie-mediatek-gen3.c
> 
>> +++ b/drivers/pci/controller/pcie-mediatek-gen3.c
> 
>> @@ -128,10 +128,12 @@ struct mtk_gen3_pcie;
> 
>>    /**
> 
>>     * struct mtk_gen3_pcie_pdata - differentiate between host 
>> generations
> 
>>     * @power_up: pcie power_up callback
> 
>> + * @reset: pcie reset callback
> 
>>     * @phy_resets: phy reset lines SoC data.
> 
>>     */
> 
>>    struct mtk_gen3_pcie_pdata {
> 
>>             int (*power_up)(struct mtk_gen3_pcie *pcie);
> 
>> +    void (*reset)(struct mtk_gen3_pcie *pcie);
> 
>>             struct {
> 
>>                       const char *id[MAX_NUM_PHY_RESETS];
> 
>>                       int num_resets;
> 
>> @@ -373,6 +375,28 @@ static void mtk_pcie_enable_msi(struct 
>> mtk_gen3_pcie *pcie)
> 
>>             writel_relaxed(val, pcie->base + PCIE_INT_ENABLE_REG);
> 
>>    }
> 
>>
> 
>> +static void mtk_pcie_reset(struct mtk_gen3_pcie *pcie) {
> 
>> +    u32 val;
> 
>> +
> 
>> +    /* Assert all reset signals */
> 
>> +    val = readl_relaxed(pcie->base + PCIE_RST_CTRL_REG);
> 
>> +    val |= PCIE_MAC_RSTB | PCIE_PHY_RSTB | PCIE_BRG_RSTB | 
>> + PCIE_PE_RSTB;
> 
>> +    writel_relaxed(val, pcie->base + PCIE_RST_CTRL_REG);
> 
>> +
> 
>> +    /*
> 
>> +    * Described in PCIe CEM specification sections 2.2 (PERST# 
>> + Signal)
> 
>> +    * and 2.2.1 (Initial Power-Up (G3 to S0)).
> 
>> +    * The deassertion of PERST# should be delayed 100ms (TPVPERL)
> 
>> +    * for the power and clock to become stable.
> 
>> +    */
> 
>> +    msleep(100);
> 
>> +
> 
>> +    /* De-assert reset signals */
> 
>> +    val &= ~(PCIE_MAC_RSTB | PCIE_PHY_RSTB | PCIE_BRG_RSTB | 
>> + PCIE_PE_RSTB);
> 
>> +    writel_relaxed(val, pcie->base + PCIE_RST_CTRL_REG); }
> 
>> +
> 
>>    static int mtk_pcie_startup_port(struct mtk_gen3_pcie *pcie)
> 
>>    {
> 
>>             struct resource_entry *entry;
> 
>> @@ -402,22 +426,9 @@ static int mtk_pcie_startup_port(struct 
>> mtk_gen3_pcie *pcie)
> 
>>             val |= PCIE_DISABLE_DVFSRC_VLT_REQ;
> 
>>             writel_relaxed(val, pcie->base + PCIE_MISC_CTRL_REG);
> 
>>
> 
>> -     /* Assert all reset signals */
> 
>> -     val = readl_relaxed(pcie->base + PCIE_RST_CTRL_REG);
> 
>> -     val |= PCIE_MAC_RSTB | PCIE_PHY_RSTB | PCIE_BRG_RSTB | PCIE_PE_RSTB;
> 
>> -     writel_relaxed(val, pcie->base + PCIE_RST_CTRL_REG);
> 
>> -
> 
>> -     /*
> 
>> -     * Described in PCIe CEM specification sections 2.2 (PERST# Signal)
> 
>> -     * and 2.2.1 (Initial Power-Up (G3 to S0)).
> 
>> -     * The deassertion of PERST# should be delayed 100ms (TPVPERL)
> 
>> -     * for the power and clock to become stable.
> 
>> -     */
> 
>> -     msleep(100);
> 
>> -
> 
>> -     /* De-assert reset signals */
> 
>> -     val &= ~(PCIE_MAC_RSTB | PCIE_PHY_RSTB | PCIE_BRG_RSTB | PCIE_PE_RSTB);
> 
>> -     writel_relaxed(val, pcie->base + PCIE_RST_CTRL_REG);
> 
>> +    /* Reset the PCIe port if requested by the hw */
> 
>> +    if (pcie->soc->reset)
> 
>> +             pcie->soc->reset(pcie);
> 
>>
> 
>>             /* Check if the link is up or not */
> 
>>             err = readl_poll_timeout(pcie->base + 
>> PCIE_LINK_STATUS_REG, val, @@
> 
>> -1207,6 +1218,7 @@ static const struct dev_pm_ops mtk_pcie_pm_ops = {
> 
>>
> 
>>    static const struct mtk_gen3_pcie_pdata mtk_pcie_soc_mt8192 = {
> 
>>             .power_up = mtk_pcie_power_up,
> 
>> +    .reset = mtk_pcie_reset,
> 
>>             .phy_resets = {
> 
>>                       .id[0] = "phy",
> 
>>                       .num_resets = 1,
> 
>>
> 
>> ---
> 
>> base-commit: f2024903cb387971abdbc6398a430e735a9b394c
> 
>> change-id: 20240920-pcie-en7581-rst-fix-8161658c13c4
> 
>>
> 
>> Best regards,
> 
> 


From macpaul.lin at mediatek.com  Tue Sep 24 00:05:36 2024
From: macpaul.lin at mediatek.com (Macpaul Lin)
Date: Tue, 24 Sep 2024 15:05:36 +0800
Subject: [PATCH v1 2/3] rtc: mt6359: Add RTC hardware range and add
 support for start-year
In-Reply-To: <0748868d-4789-fcaa-e70f-6a4508411b36@mediatek.com>
References: <20240923100010.97470-1-angelogioacchino.delregno@collabora.com>
 <20240923100010.97470-3-angelogioacchino.delregno@collabora.com>
 <0748868d-4789-fcaa-e70f-6a4508411b36@mediatek.com>
Message-ID: <247abc15-d82f-3e8f-5202-edc6099707df@mediatek.com>


On 9/24/24 12:08, Macpaul Lin wrote:
> 
> On 9/23/24 18:00, AngeloGioacchino Del Regno wrote:
>> Add the RTC hardware range parameters to enable the possibility
>> of using the `start-year` devicetree property which, if present,
>> will set the start_secs parameter by overriding the defaults
>> that this driver is setting;
>>
>> To keep compatibility with (hence have the same date/time reading
>> as) the old behavior, set:
>> ? - range_min to 1900-01-01 00:00:00
>> ? - range_max to 2027-12-31 23:59:59 (HW year max range is 0-127)
>> ? - start_secs defaulting to 1968-01-02 00:00:00
>>
>> Please note that the oddness of starting from January 2nd is not
>> a hardware quirk and it's done only to get the same date/time
>> reading as an RTC which time was set before this commit.
>>
>> Also remove the RTC_MIN_YEAR_OFFSET addition and subtraction in
>> callbacks set_time() and read_time() respectively, as now this
>> is already done by the API.
>>
>> Signed-off-by: AngeloGioacchino Del Regno 
>> <angelogioacchino.delregno at collabora.com>
>> ---
>> ? drivers/rtc/rtc-mt6397.c | 13 ++++---------
>> ? 1 file changed, 4 insertions(+), 9 deletions(-)
> 
> [snip]
> 
> Thanks for helping add new patch fix for RTC.
> 
>> @@ -302,6 +293,10 @@ static int mtk_rtc_probe(struct platform_device 
>> *pdev)
>> ????? device_init_wakeup(&pdev->dev, 1);
>> ????? rtc->rtc_dev->ops = &mtk_rtc_ops;
>> +??? rtc->rtc_dev->range_min = RTC_TIMESTAMP_BEGIN_1900;
>> +??? rtc->rtc_dev->range_max = mktime64(2027, 12, 31, 23, 59, 59);
>> +??? rtc->rtc_dev->start_secs = mktime64(1968, 1, 2, 0, 0, 0);
>> +??? rtc->rtc_dev->set_start_time = true;
>> ????? return devm_rtc_register_device(rtc->rtc_dev);
>> ? }
> 
> Dear @Zhanhan, Please help to leave comment if you think there is 
> something need to be clarify. For example, I've found some relate origin 
> defines
> in "include/linux/mfd/mt6397/rtc.h"
> #define RTC_MIN_YEAR??? 1968
> #define RTC_BASE_YEAR??? 1900
> #define RTC_NUM_YEAR??? 128
> #define RTC_MIN_YEAR_OFFSET??? (RTC_MIN_YEAR - RTC_BASE_YEAR)
> 
> Should MediaTek remove RTC_MIN_YEAR and RTC_BASE_YEAR in next patch?
> And since there may not exist any smartphone/tablet/TV using mt6397
> RTC earlier than 2010? Is it possible to change
> RTC_TIMESTAMP_BEGIN_1900 to RTC_TIMESTAMP_BEGIN_2000 without breaking
> compatibility for these devices?
> 
> Thanks
> Macpaul Lin
> 

After discussing these change with ZhanZhan, MediaTek think use 
RTC_TIMESTAMP_BEGIN_1900 and the other changes are okay.

Reviewed-by: Macpaul Lin <macpaul.lin at mediatek.com>
Reviewed-by: ZhanZhan Ge <zhanzhan.ge at mediatek.com>

Thanks!
Macpaul Lin


From linus.walleij at linaro.org  Tue Sep 24 00:34:57 2024
From: linus.walleij at linaro.org (Linus Walleij)
Date: Tue, 24 Sep 2024 09:34:57 +0200
Subject: [PATCH v4 4/5] pinctrl: airoha: Add support for EN7581 SoC
In-Reply-To: <20240911-en7581-pinctrl-v4-4-60ac93d760bb@kernel.org>
References: <20240911-en7581-pinctrl-v4-0-60ac93d760bb@kernel.org> <20240911-en7581-pinctrl-v4-4-60ac93d760bb@kernel.org>
Message-ID: <CACRpkdZbyQ5bk8oR+Q4UmQCdM5h1mF1ztBc26YzqNsze_B=ehA@mail.gmail.com>

Hi Lorenzo / Benjamin,

thanks for your patch!

This is a real nice driver, I like the design of the pin database to support
this pretty complex pin controller.

Some comments and nits:

On Wed, Sep 11, 2024 at 9:51?PM Lorenzo Bianconi <lorenzo at kernel.org> wrote:

> Introduce pinctrl driver for EN7581 SoC. Current EN7581 pinctrl driver
> supports the following functionalities:
> - pin multiplexing
> - pin pull-up, pull-down, open-drain, current strength,
>   {input,output}_enable, output_{low,high}
> - gpio controller
> - irq controller
>
> Tested-by: Benjamin Larsson <benjamin.larsson at genexis.eu>
> Co-developed-by: Benjamin Larsson <benjamin.larsson at genexis.eu>
> Signed-off-by: Benjamin Larsson <benjamin.larsson at genexis.eu>
> Signed-off-by: Lorenzo Bianconi <lorenzo at kernel.org>

(...)

> +#include <dt-bindings/pinctrl/mt65xx.h>
> +#include <linux/bitfield.h>

Isn't just <linux/bits.h> enough for what you're using?

> +#include <linux/gpio/driver.h>
> +#include <linux/interrupt.h>
> +#include <linux/io.h>
> +#include <linux/irq.h>
> +#include <linux/irqdomain.h>
> +#include <linux/kernel.h>

What do you use from kernel.h? We usually use more fingrained
headers these days.

(...)

> +#include <linux/mfd/airoha-en7581-mfd.h>
> +#include <linux/mfd/syscon.h>
> +#include <linux/of.h>
> +#include <linux/of_irq.h>
> +#include <linux/of_platform.h>
> +#include <linux/pinctrl/consumer.h>

Why do you need the consumer header?

(...)

> +static u32 airoha_pinctrl_rmw_unlock(void __iomem *addr, u32 mask, u32 val)
> +{
> +       val |= (readl(addr) & ~mask);
> +       writel(val, addr);
> +
> +       return val;
> +}
> +
> +#define airoha_pinctrl_set_unlock(addr, val)                                   \
> +       airoha_pinctrl_rmw_unlock((addr), 0, (val))
> +#define airoha_pinctrl_clear_unlock(addr, mask)                                        \
> +       airoha_pinctrl_rmw_unlock((addr), (mask), (0))
> +
> +static u32 airoha_pinctrl_rmw(struct airoha_pinctrl *pinctrl,
> +                             void __iomem *addr, u32 mask, u32 val)
> +{
> +       mutex_lock(&pinctrl->mutex);
> +       val = airoha_pinctrl_rmw_unlock(addr, mask, val);
> +       mutex_unlock(&pinctrl->mutex);
> +
> +       return val;
> +}

Thus looks like a reimplementation of regmap-mmio, can't you just use
regmap MMIO? You use it for the SCU access already...

If you persist with this solution, please use a guard:

#include <linux/cleanup.h>

guard(mutex)(&pinctrl->mutex);

And the lock will be released when you exit the function.

> +static int airoha_pinctrl_get_gpio_from_pin(struct pinctrl_dev *pctrl_dev,
> +                                           int pin)
> +{
> +       struct pinctrl_gpio_range *range;
> +       int gpio;
> +
> +       range = pinctrl_find_gpio_range_from_pin_nolock(pctrl_dev, pin);
> +       if (!range)
> +               return -EINVAL;
> +
> +       gpio = pin - range->pin_base;
> +       if (gpio < 0)
> +               return -EINVAL;
> +
> +       return gpio;
> +}

This function is just used here:

> +static int airoha_pinconf_get(struct pinctrl_dev *pctrl_dev,
> +                             unsigned int pin, unsigned long *config)
> +{
> +       struct airoha_pinctrl *pinctrl = pinctrl_dev_get_drvdata(pctrl_dev);
> +       enum pin_config_param param = pinconf_to_config_param(*config);
> +       u32 arg;
> +
> +       switch (param) {
> +       case PIN_CONFIG_BIAS_PULL_DOWN:
> +       case PIN_CONFIG_BIAS_DISABLE:
> +       case PIN_CONFIG_BIAS_PULL_UP: {
> +               u32 pull_up, pull_down;
> +
> +               if (airoha_pinctrl_get_pullup_conf(pinctrl, pin, &pull_up) ||
> +                   airoha_pinctrl_get_pulldown_conf(pinctrl, pin, &pull_down))
> +                       return -EINVAL;
> +
> +               if (param == PIN_CONFIG_BIAS_PULL_UP &&
> +                   !(pull_up && !pull_down))
> +                       return -EINVAL;
> +               else if (param == PIN_CONFIG_BIAS_PULL_DOWN &&
> +                        !(pull_down && !pull_up))
> +                       return -EINVAL;
> +               else if (pull_up || pull_down)
> +                       return -EINVAL;
> +
> +               arg = 1;
> +               break;
> +       }
> +       case PIN_CONFIG_DRIVE_STRENGTH: {
> +               u32 e2, e4;
> +
> +               if (airoha_pinctrl_get_drive_e2_conf(pinctrl, pin, &e2) ||
> +                   airoha_pinctrl_get_drive_e4_conf(pinctrl, pin, &e4))
> +                       return -EINVAL;
> +
> +               arg = e4 << 1 | e2;
> +               break;
> +       }
> +       case PIN_CONFIG_DRIVE_OPEN_DRAIN:
> +               if (airoha_pinctrl_get_pcie_rst_od_conf(pinctrl, pin, &arg))
> +                       return -EINVAL;
> +               break;
> +       case PIN_CONFIG_OUTPUT_ENABLE:
> +       case PIN_CONFIG_INPUT_ENABLE: {
> +               int gpio = airoha_pinctrl_get_gpio_from_pin(pctrl_dev, pin);
> +
> +               if (gpio < 0)
> +                       return gpio;
> +
> +               arg = airoha_pinctrl_gpio_get_direction(pinctrl, gpio);

I don't see why a pin would have to exist in a GPIO range in order to
be set as output or input?

Can't you just set up the pin as requested and not care whether
it has a corresponding GPIO range?

Is it over-reuse of the GPIO code? I'd say just set up the pin instead.

> +static int airoha_pinconf_set(struct pinctrl_dev *pctrl_dev,
> +                             unsigned int pin, unsigned long *configs,
> +                             unsigned int num_configs)
> +{
> +       struct airoha_pinctrl *pinctrl = pinctrl_dev_get_drvdata(pctrl_dev);
> +       int i;
> +
> +       for (i = 0; i < num_configs; i++) {
> +               u32 param = pinconf_to_config_param(configs[i]);
> +               u32 arg = pinconf_to_config_argument(configs[i]);
> +
> +               switch (param) {
> +               case PIN_CONFIG_BIAS_DISABLE:
> +                       airoha_pinctrl_set_pulldown_conf(pinctrl, pin, 0);
> +                       airoha_pinctrl_set_pullup_conf(pinctrl, pin, 0);
> +                       break;
> +               case PIN_CONFIG_BIAS_PULL_UP:
> +                       airoha_pinctrl_set_pulldown_conf(pinctrl, pin, 0);
> +                       airoha_pinctrl_set_pullup_conf(pinctrl, pin, 1);
> +                       break;
> +               case PIN_CONFIG_BIAS_PULL_DOWN:
> +                       airoha_pinctrl_set_pulldown_conf(pinctrl, pin, 1);
> +                       airoha_pinctrl_set_pullup_conf(pinctrl, pin, 0);
> +                       break;
> +               case PIN_CONFIG_DRIVE_STRENGTH: {
> +                       u32 e2 = 0, e4 = 0;
> +
> +                       switch (arg) {
> +                       case MTK_DRIVE_2mA:
> +                               break;
> +                       case MTK_DRIVE_4mA:
> +                               e2 = 1;
> +                               break;
> +                       case MTK_DRIVE_6mA:
> +                               e4 = 1;
> +                               break;
> +                       case MTK_DRIVE_8mA:
> +                               e2 = 1;
> +                               e4 = 1;
> +                               break;
> +                       default:
> +                               return -EINVAL;
> +                       }
> +
> +                       airoha_pinctrl_set_drive_e2_conf(pinctrl, pin, e2);
> +                       airoha_pinctrl_set_drive_e4_conf(pinctrl, pin, e4);
> +                       break;
> +               }
> +               case PIN_CONFIG_DRIVE_OPEN_DRAIN:
> +                       airoha_pinctrl_set_pcie_rst_od_conf(pinctrl, pin, !!arg);
> +                       break;
> +               case PIN_CONFIG_OUTPUT_ENABLE:
> +               case PIN_CONFIG_INPUT_ENABLE:
> +               case PIN_CONFIG_OUTPUT: {
> +                       int gpio = airoha_pinctrl_get_gpio_from_pin(pctrl_dev, pin);
> +                       bool input = param == PIN_CONFIG_INPUT_ENABLE;
> +
> +                       if (gpio < 0)
> +                               return gpio;
> +
> +                       airoha_pinctrl_gpio_set_direction(pinctrl, gpio, input);
> +                       if (param == PIN_CONFIG_OUTPUT)
> +                               airoha_pinctrl_gpio_set_value(pinctrl, gpio, !!arg);
> +                       break;

Dito. No need to reuse the GPIO set direction function. Make a helper
that just work on the pin instead, and perhaps the GPIO set direction
can use that instead.

> +static int airoha_pinctrl_gpio_direction_output(struct gpio_chip *chip,
> +                                               unsigned int gpio, int value)
> +{
> +       int err;
> +
> +       err = pinctrl_gpio_direction_output(chip, gpio);
> +       if (err)
> +               return err;
> +
> +       airoha_pinctrl_gpio_set(chip, gpio, value);

Hm I get a bit confused by the similarly named helpers I guess...

> +static void airoha_pinctrl_gpio_irq_unmask(struct irq_data *data)
> +{
> +       u8 offset = data->hwirq % AIROHA_REG_GPIOCTRL_NUM_GPIO;
> +       u8 index = data->hwirq / AIROHA_REG_GPIOCTRL_NUM_GPIO;
> +       u32 mask = GENMASK(2 * offset + 1, 2 * offset);
> +       struct airoha_pinctrl_gpiochip *gpiochip;
> +       u32 val = BIT(2 * offset);
> +       unsigned long flags;
> +
> +       gpiochip = irq_data_get_irq_chip_data(data);
> +       if (WARN_ON_ONCE(data->hwirq >= ARRAY_SIZE(gpiochip->irq_type)))
> +               return;
> +
> +       spin_lock_irqsave(&gpiochip->lock, flags);

Use a scoped guard here

guard(spinlock_irqsave)(&gpiochip->lock);

> +static void airoha_pinctrl_gpio_irq_mask(struct irq_data *data)
> +{
> +       u8 offset = data->hwirq % AIROHA_REG_GPIOCTRL_NUM_GPIO;
> +       u8 index = data->hwirq / AIROHA_REG_GPIOCTRL_NUM_GPIO;
> +       u32 mask = GENMASK(2 * offset + 1, 2 * offset);
> +       struct airoha_pinctrl_gpiochip *gpiochip;
> +       unsigned long flags;
> +
> +       gpiochip = irq_data_get_irq_chip_data(data);
> +
> +       spin_lock_irqsave(&gpiochip->lock, flags);

Dito

> +static int airoha_pinctrl_gpio_irq_type(struct irq_data *data,
> +                                       unsigned int type)
> +{
> +       struct airoha_pinctrl_gpiochip *gpiochip;
> +       unsigned long flags;
> +
> +       gpiochip = irq_data_get_irq_chip_data(data);
> +       if (data->hwirq >= ARRAY_SIZE(gpiochip->irq_type))
> +               return -EINVAL;
> +
> +       spin_lock_irqsave(&gpiochip->lock, flags);

Dito

> +       girq->chip = devm_kzalloc(dev, sizeof(*girq->chip), GFP_KERNEL);
> +       if (!girq->chip)
> +               return -ENOMEM;
> +
> +       girq->chip->name = dev_name(dev);
> +       girq->chip->irq_unmask = airoha_pinctrl_gpio_irq_unmask;
> +       girq->chip->irq_mask = airoha_pinctrl_gpio_irq_mask;
> +       girq->chip->irq_mask_ack = airoha_pinctrl_gpio_irq_mask;
> +       girq->chip->irq_set_type = airoha_pinctrl_gpio_irq_type;
> +       girq->chip->flags = IRQCHIP_SET_TYPE_MASKED | IRQCHIP_IMMUTABLE;
> +       girq->default_type = IRQ_TYPE_NONE;
> +       girq->handler = handle_simple_irq;

If the irqchip is immutable it is const and there is no point to malloc it.

Just

static const struct irq_chip airoha_gpio_irq_chip = {...

And assign it:

girq = &g->gc.irq;
gpio_irq_chip_set_chip(girq, &airoha_gpio_irq_chip);

Yours,
Linus Walleij


From linyunsheng at huawei.com  Tue Sep 24 00:48:16 2024
From: linyunsheng at huawei.com (Yunsheng Lin)
Date: Tue, 24 Sep 2024 15:48:16 +0800
Subject: [PATCH net 2/2] page_pool: fix IOMMU crash when driver has
 already unbound
In-Reply-To: <20240924064559.1681488-1-gur.stavi@huawei.com>
References: <2fb8d278-62e0-4a81-a537-8f601f61e81d@huawei.com>
 <20240924064559.1681488-1-gur.stavi@huawei.com>
Message-ID: <64730d70-e5b7-4117-9ee8-43f23543eafd@huawei.com>

On 2024/9/24 14:45, Gur Stavi wrote:
>>>>> With all the caching in the network stack, some pages may be
>>>>> held in the network stack without returning to the page_pool
>>>>> soon enough, and with VF disable causing the driver unbound,
>>>>> the page_pool does not stop the driver from doing it's
>>>>> unbounding work, instead page_pool uses workqueue to check
>>>>> if there is some pages coming back from the network stack
>>>>> periodically, if there is any, it will do the dma unmmapping
>>>>> related cleanup work.
>>>>>
>>>>> As mentioned in [1], attempting DMA unmaps after the driver
>>>>> has already unbound may leak resources or at worst corrupt
>>>>> memory. Fundamentally, the page pool code cannot allow DMA
>>>>> mappings to outlive the driver they belong to.
>>>>>
>>>>> Currently it seems there are at least two cases that the page
>>>>> is not released fast enough causing dma unmmapping done after
>>>>> driver has already unbound:
>>>>> 1. ipv4 packet defragmentation timeout: this seems to cause
>>>>>    delay up to 30 secs:
>>>>>
>>>>> 2. skb_defer_free_flush(): this may cause infinite delay if
>>>>>    there is no triggering for net_rx_action().
>>>>>
>>>>> In order not to do the dma unmmapping after driver has already
>>>>> unbound and stall the unloading of the networking driver, add
>>>>> the pool->items array to record all the pages including the ones
>>>>> which are handed over to network stack, so the page_pool can
>>>>> do the dma unmmapping for those pages when page_pool_destroy()
>>>>> is called.
>>>>
>>>> So, I was thinking of a very similar idea. But what do you mean by
>>>> "all"? The pages that are still in caches (slow or fast) of the pool
>>>> will be unmapped during page_pool_destroy().
>>>
>>> Yes, it includes the one in pool->alloc and pool->ring.
>>
>> It worths mentioning that there is a semantics changing here:
>> Before this patch, there can be almost unlimited inflight pages used by
>> driver and network stack, as page_pool doesn't really track those pages.
>> After this patch, as we use a fixed-size pool->items array to track the
>> inflight pages, the inflight pages is limited by the pool->items, currently
>> the size of pool->items array is calculated as below in this patch:
>>
>> +#define PAGE_POOL_MIN_ITEM_CNT	512
>> +	unsigned int item_cnt = (params->pool_size ? : 1024) +
>> +				PP_ALLOC_CACHE_SIZE + PAGE_POOL_MIN_ITEM_CNT;
>>
>> Personally I would consider it is an advantage to limit how many pages which
>> are used by the driver and network stack, the problem seems to how to decide
>> the limited number of page used by network stack so that performance is not
>> impacted.
> 
> In theory, with respect to the specific problem at hand, you only have
> a limit on the number of mapped pages inflight. Once you reach this
> limit you can unmap these old pages, forget about them and remember
> new ones.

Yes, it can be done theoretically.
The tricky part seems to be how to handle the concurrency problem when
we evict the old pages and the old pages are also returned back to the
page_pool concurrently without any locking or lockless operation.

For now each item has only one producer and one consumer, so we don't
really have to worry about the concurrency problem before calling
page_pool_item_uninit() in page_pool_destroy() to do the unmapping
for the inflight pages by using a newly added 'destroy_lock' lock.


From vignesh.raman at collabora.com  Tue Sep 24 01:05:00 2024
From: vignesh.raman at collabora.com (Vignesh Raman)
Date: Tue, 24 Sep 2024 13:35:00 +0530
Subject: [PATCH v1] docs/gpu: ci: update flake tests requirements
In-Reply-To: <CAA8EJprUUUc0iDph-HPrW1anrdnzYju7+JERQdHbwxvznq=H4w@mail.gmail.com>
References: <20240924022600.1441969-1-vignesh.raman@collabora.com>
 <CAA8EJprUUUc0iDph-HPrW1anrdnzYju7+JERQdHbwxvznq=H4w@mail.gmail.com>
Message-ID: <58a9334d-26eb-4106-806a-59e5e728aed5@collabora.com>

Hi Dmitry,

On 24/09/24 11:46, Dmitry Baryshkov wrote:
> On Tue, 24 Sept 2024 at 04:26, Vignesh Raman
> <vignesh.raman at collabora.com> wrote:
>>
>> Update the documentation to require linking to a relevant GitLab
>> issue for each new flake entry instead of an email report. Added
>> specific GitLab issue URLs for i915, xe and other drivers.
>>
>> Signed-off-by: Vignesh Raman <vignesh.raman at collabora.com>
>> ---
>>   Documentation/gpu/automated_testing.rst | 15 ++++++++++-----
>>   1 file changed, 10 insertions(+), 5 deletions(-)
>>
>> diff --git a/Documentation/gpu/automated_testing.rst b/Documentation/gpu/automated_testing.rst
>> index 2d5a28866afe..f73b8939dc3a 100644
>> --- a/Documentation/gpu/automated_testing.rst
>> +++ b/Documentation/gpu/automated_testing.rst
>> @@ -67,20 +67,25 @@ Lists the tests that for a given driver on a specific hardware revision are
>>   known to behave unreliably. These tests won't cause a job to fail regardless of
>>   the result. They will still be run.
>>
>> -Each new flake entry must be associated with a link to the email reporting the
>> -bug to the author of the affected driver, the board name or Device Tree name of
>> -the board, the first kernel version affected, the IGT version used for tests,
>> -and an approximation of the failure rate.
>> +Each new flake entry must include a link to the relevant GitLab issue, the board
>> +name or Device Tree name, the first kernel version affected, the IGT version used
>> +for tests and an approximation of the failure rate.
>>
>>   They should be provided under the following format::
>>
>> -  # Bug Report: $LORE_OR_PATCHWORK_URL
>> +  # Bug Report: $GITLAB_ISSUE
>>     # Board Name: broken-board.dtb
>>     # Linux Version: 6.6-rc1
>>     # IGT Version: 1.28-gd2af13d9f
>>     # Failure Rate: 100
>>     flaky-test
>>
>> +The GitLab issue must include the logs and the pipeline link. Use the appropriate
>> +link below to create an issue.
>> +https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/ for i915 drivers
>> +https://gitlab.freedesktop.org/drm/xe/kernel/-/issues/ for xe drivers
> 
> drm/msm for msm driver, please. Otherwise we can easily miss such issues.

Sure, will add it in v2. Thanks.

> 
>> +https://gitlab.freedesktop.org/drm/misc/kernel/-/issues for other drivers
>> +
>>   drivers/gpu/drm/ci/${DRIVER_NAME}-${HW_REVISION}-skips.txt
>>   -----------------------------------------------------------
>>
>> --
>> 2.43.0
>>
> 
> 

Regards,
Vignesh


From angelogioacchino.delregno at collabora.com  Tue Sep 24 01:39:03 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Tue, 24 Sep 2024 10:39:03 +0200
Subject: [v1,1/1] i2c: mediatek: add runtime PM operations and bus
 regulator control
In-Reply-To: <20240920143627.23811-2-zoie.lin@mediatek.com>
References: <20240920143627.23811-1-zoie.lin@mediatek.com>
 <20240920143627.23811-2-zoie.lin@mediatek.com>
Message-ID: <33dc7f60-4364-4d7a-a66b-4bd881b41675@collabora.com>

Il 20/09/24 16:36, zoie.lin ha scritto:
> This commit introduces support for runtime PM operations in
> the I2C driver, enabling runtime suspend and resume functionality.
> 
> Although in the most platforms, the bus power of i2c are always
> on, some platforms disable the i2c bus power in order to meet
> low power request.
> 
> This implementation includes bus regulator control to facilitate
> proper handling of the bus power based on platform requirements.
> 
> Signed-off-by: zoie.lin <zoie.lin at mediatek.com>

Hello Zoie,

Your name does not technically have any "." inside, so please fix it
so that it reads `Zoie Lin <zoie.lin at mediatek.com>`.

Moreover, this implementation can be improved. Check below:

You missed pm_runtime_status_suspended() checks in suspend/resume callbacks
and, if the bus wasn't already runtime suspended when reaching suspend(), that
will not get the bus regulators powered off when suspending; analogously, if
the device was runtime suspended, the regulators and clocks will stay on when
resuming from system sleep until first usage.

So add the checks:

static int mtk_i2c_suspend_noirq(struct device *dev)
{
	struct mtk_i2c *i2c = dev_get_drvdata(dev);

	i2c_mark_adapter_suspended(&i2c->adap);

	if (!pm_runtime_status_suspended(dev))
		mtk_i2c_runtime_suspend(dev);

	clk_bulk_unprepare(I2C_MT65XX_CLK_MAX, i2c->clocks);
	return 0;
}

static int mtk_i2c_resume_noirq(struct device *dev)
{
	int ret;
	struct mtk_i2c *i2c = dev_get_drvdata(dev);

	ret = clk_bulk_prepare_enable(I2C_MT65XX_CLK_MAX, i2c->clocks);
	if (ret) {
		dev_err(dev, "clock enable failed!\n");
		return ret;
	}

	mtk_i2c_init_hw(i2c);

	if (pm_runtime_status_suspended(dev))
		ret = mtk_i2c_runtime_suspend(dev);

	i2c_mark_adapter_resumed(&i2c->adap);

	return 0;
}

> ---
>   drivers/i2c/busses/i2c-mt65xx.c | 72 ++++++++++++++++++++++++++++-----
>   1 file changed, 61 insertions(+), 11 deletions(-)
> 
> diff --git a/drivers/i2c/busses/i2c-mt65xx.c b/drivers/i2c/busses/i2c-mt65xx.c
> index e0ba653dec2d..aae0189ba210 100644
> --- a/drivers/i2c/busses/i2c-mt65xx.c
> +++ b/drivers/i2c/busses/i2c-mt65xx.c
> @@ -21,6 +21,7 @@
>   #include <linux/module.h>
>   #include <linux/of.h>
>   #include <linux/platform_device.h>
> +#include <linux/pm_runtime.h>
>   #include <linux/scatterlist.h>
>   #include <linux/sched.h>
>   #include <linux/slab.h>
> @@ -1245,8 +1246,8 @@ static int mtk_i2c_transfer(struct i2c_adapter *adap,
>   	int left_num = num;
>   	struct mtk_i2c *i2c = i2c_get_adapdata(adap);
>   
> -	ret = clk_bulk_enable(I2C_MT65XX_CLK_MAX, i2c->clocks);
> -	if (ret)
> +	ret = pm_runtime_get_sync(i2c->dev);

ret = pm_runtime_resume_and_get(i2c->dev);

> +	if (ret < 0)
>   		return ret;
>   
>   	i2c->auto_restart = i2c->dev_comp->auto_restart;
> @@ -1299,7 +1300,9 @@ static int mtk_i2c_transfer(struct i2c_adapter *adap,
>   	ret = num;
>   
>   err_exit:
> -	clk_bulk_disable(I2C_MT65XX_CLK_MAX, i2c->clocks);
> +	pm_runtime_mark_last_busy(i2c->dev);
> +	pm_runtime_put_autosuspend(i2c->dev);
> +
>   	return ret;
>   }
>   
> @@ -1370,6 +1373,41 @@ static int mtk_i2c_parse_dt(struct device_node *np, struct mtk_i2c *i2c)
>   	return 0;
>   }
>   
> +static int mtk_i2c_runtime_suspend(struct device *dev)
> +{
> +	struct mtk_i2c *i2c = dev_get_drvdata(dev);
> +
> +	clk_bulk_disable(I2C_MT65XX_CLK_MAX, i2c->clocks);
> +	if (i2c->adap.bus_regulator)
> +		regulator_disable(i2c->adap.bus_regulator);
> +
> +	return 0;
> +}
> +
> +static int mtk_i2c_runtime_resume(struct device *dev)
> +{
> +	int ret = 0;
> +	struct mtk_i2c *i2c = dev_get_drvdata(dev);

struct mtk_i2c *i2c = dev_get_drvdata(dev);
int ret;

> +
> +	if (i2c->adap.bus_regulator) {
> +		ret = regulator_enable(i2c->adap.bus_regulator);
> +		if (ret < 0) {

`ret` can't be > 0. `if (ret) {` is enough.

> +			dev_err(dev, "enable regulator failed!\n");
> +			return ret;
> +		}
> +	}
> +
> +	ret = clk_bulk_enable(I2C_MT65XX_CLK_MAX, i2c->clocks);
> +	if (ret < 0) {

if (ret) {

> +		dev_err(dev, "clock enable failed!\n");

This print is unnecessary.

> +		if (i2c->adap.bus_regulator)
> +			regulator_disable(i2c->adap.bus_regulator);
> +		return ret;
> +	}
> +
> +	return ret;

return 0;

> +}
> +
>   static int mtk_i2c_probe(struct platform_device *pdev)
>   {
>   	int ret = 0;
> @@ -1472,13 +1510,19 @@ static int mtk_i2c_probe(struct platform_device *pdev)
>   		}
>   	}
>   
> -	ret = clk_bulk_prepare_enable(I2C_MT65XX_CLK_MAX, i2c->clocks);
> +	ret = clk_bulk_prepare(I2C_MT65XX_CLK_MAX, i2c->clocks);
>   	if (ret) {
> -		dev_err(&pdev->dev, "clock enable failed!\n");
> +		dev_err(&pdev->dev, "clk_bulk_prepare failed\n");

This print is anyway redundant, as clk_bulk_prepare() already prints upon failures,
so you can as well simply remove it instead of changing it.

>   		return ret;
>   	}
> +
> +	platform_set_drvdata(pdev, i2c);
> +
> +	ret = mtk_i2c_runtime_resume(i2c->dev);
> +	if (ret < 0)
> +		goto err_clk_bulk_unprepare;
>   	mtk_i2c_init_hw(i2c);
> -	clk_bulk_disable(I2C_MT65XX_CLK_MAX, i2c->clocks);
> +	mtk_i2c_runtime_suspend(i2c->dev);
>   
>   	ret = devm_request_irq(&pdev->dev, irq, mtk_i2c_irq,
>   			       IRQF_NO_SUSPEND | IRQF_TRIGGER_NONE,
> @@ -1486,19 +1530,22 @@ static int mtk_i2c_probe(struct platform_device *pdev)
>   	if (ret < 0) {
>   		dev_err(&pdev->dev,
>   			"Request I2C IRQ %d fail\n", irq);
> -		goto err_bulk_unprepare;
> +		goto err_clk_bulk_unprepare;
>   	}
> +	pm_runtime_set_autosuspend_delay(&pdev->dev, 1000);

One full second as autosuspend delay? Can this be shortened to 500? 250?

How was the one second wait chosen?

How much time does mtk_i2c_runtime_resume() take to resume the bus?

> +	pm_runtime_use_autosuspend(&pdev->dev);
> +	pm_runtime_enable(&pdev->dev);
>   
>   	i2c_set_adapdata(&i2c->adap, i2c);
>   	ret = i2c_add_adapter(&i2c->adap);
>   	if (ret)
> -		goto err_bulk_unprepare;
> -
> -	platform_set_drvdata(pdev, i2c);
> +		goto err_pm_runtime_disable;
>   
>   	return 0;
>   
> -err_bulk_unprepare:
> +err_pm_runtime_disable:
> +	pm_runtime_disable(&pdev->dev);
> +err_clk_bulk_unprepare:
>   	clk_bulk_unprepare(I2C_MT65XX_CLK_MAX, i2c->clocks);
>   
>   	return ret;
> @@ -1510,6 +1557,7 @@ static void mtk_i2c_remove(struct platform_device *pdev)
>   
>   	i2c_del_adapter(&i2c->adap);
>   
> +	pm_runtime_disable(&pdev->dev);

pm_runtime_set_suspended(&pdev->dev);

>   	clk_bulk_unprepare(I2C_MT65XX_CLK_MAX, i2c->clocks);
>   }
>   

Regards,
Angelo




From angelogioacchino.delregno at collabora.com  Tue Sep 24 01:46:10 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Tue, 24 Sep 2024 10:46:10 +0200
Subject: [PATCH v2] arm64: dts: mediatek: mt8186: add FHCTL node
In-Reply-To: <20240923144728.870285-1-max_weng@compal.corp-partner.google.com>
References: <20240923144728.870285-1-max_weng@compal.corp-partner.google.com>
Message-ID: <69fcaf74-ddf5-4bd8-8f0b-3d1a1793c0f7@collabora.com>

Il 23/09/24 16:47, Max Weng ha scritto:
> From: max_weng <max_weng at compal.corp-partner.google.com>
> 
> add FHCTL device node for Frequency Hopping and Spread Spectrum clock function.
> 
> Change-Id: I7f9f2991978df7d5d3a6a8bc78f6f443f2f0460d

Please remove the useless Change-Id tag, this means nothing upstream, after which,
on V3:

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>

> Signed-off-by: Max Weng <max_weng at compal.corp-partner.google.com>
> ---
>   Change frome v1 to v2
>   * Modify the commit description
>   arch/arm64/boot/dts/mediatek/mt8186.dtsi | 7 +++++++
>   1 file changed, 7 insertions(+)
> 
> diff --git a/arch/arm64/boot/dts/mediatek/mt8186.dtsi b/arch/arm64/boot/dts/mediatek/mt8186.dtsi
> index 148c332018b0..d3c3c2a40adc 100644
> --- a/arch/arm64/boot/dts/mediatek/mt8186.dtsi
> +++ b/arch/arm64/boot/dts/mediatek/mt8186.dtsi
> @@ -29,6 +29,13 @@ aliases {
>   		rdma1 = &rdma1;
>   	};
>   
> +	fhctl: fhctl at 1000ce00 {
> +		compatible = "mediatek,mt8186-fhctl";
> +		clocks = <&apmixedsys CLK_APMIXED_TVDPLL>;
> +		reg = <0 0x1000ce00 0 0x200>;
> +		status = "disabled";
> +	};
> +
>   	cci: cci {
>   		compatible = "mediatek,mt8186-cci";
>   		clocks = <&mcusys CLK_MCU_ARMPLL_BUS_SEL>,



From peter.wang at mediatek.com  Tue Sep 24 01:48:33 2024
From: peter.wang at mediatek.com (=?utf-8?B?UGV0ZXIgV2FuZyAo546L5L+h5Y+LKQ==?=)
Date: Tue, 24 Sep 2024 08:48:33 +0000
Subject: [PATCH v8 2/3] ufs: core: fix error handler process for MCQ abort
In-Reply-To: <f08fbc51-22a7-4c13-b9d4-ee7f4920bcfa@acm.org>
References: <20240923080344.19084-1-peter.wang@mediatek.com>
	 <20240923080344.19084-3-peter.wang@mediatek.com>
	 <f08fbc51-22a7-4c13-b9d4-ee7f4920bcfa@acm.org>
Message-ID: <d78ea5470b2b91a8a3162639202ac48bdb27a5ef.camel@mediatek.com>

On Mon, 2024-09-23 at 11:19 -0700, Bart Van Assche wrote:
>  	 
> External email : Please do not click links or open attachments until
> you have verified the sender or the content.
>  On 9/23/24 1:03 AM, peter.wang at mediatek.com wrote:
> > When the error handler successfully aborts a MCQ request,
> > it only releases the command and does not notify the SCSI layer.
> > This may cause another abort after 30 seconds timeout.
> > This patch notifies the SCSI layer to requeue the request.
> > 
> > Additionally, ignore the OCS: ABORTED CQ slot after MCQ mode
> > SQ cleanup. This makes the behavior of MCQ mode consistent with
> > that of legacy SDB mode.
> > 
> > Also, print logs for OCS: ABORTED and OCS_INVALID_COMMAND_STATUS
> > for debugging purposes.
> 
> Although I like the approach of this patch, two comments below.
> 
> > diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
> > index a6f818cdef0e..b5c7bc50a27e 100644
> > --- a/drivers/ufs/core/ufshcd.c
> > +++ b/drivers/ufs/core/ufshcd.c
> > @@ -5405,9 +5405,15 @@ ufshcd_transfer_rsp_status(struct ufs_hba
> *hba, struct ufshcd_lrb *lrbp,
> >   break;
> >   case OCS_ABORTED:
> >   result |= DID_ABORT << 16;
> > +dev_warn(hba->dev,
> > +"OCS aborted from controller = %x for tag %d\n",
> > +ocs, lrbp->task_tag);
> >   break;
> 
> Including the OCS status in this message seems redundant to me.
> 
> >   case OCS_INVALID_COMMAND_STATUS:
> >   result |= DID_REQUEUE << 16;
> > +dev_warn(hba->dev,
> > +"OCS invaild from controller = %x for tag %d\n",
> > +ocs, lrbp->task_tag);
> 
> Also here, including the OCS status in this message seems redundant
> to me.
> 
> Please change "invaild" into "invalid".

Hi Bart,

Okay, I will revise the content printed here.


> 
> > @@ -5526,6 +5532,18 @@ void ufshcd_compl_one_cqe(struct ufs_hba
> *hba, int task_tag,
> >   ufshcd_update_monitor(hba, lrbp);
> >   ufshcd_add_command_trace(hba, task_tag, UFS_CMD_COMP);
> >   cmd->result = ufshcd_transfer_rsp_status(hba, lrbp, cqe);
> > +
> > +/*
> > + * Ignore MCQ OCS: ABORTED posted by the host controller.
> > + * This makes the behavior of MCQ mode consistent with that
> > + * of legacy SDB mode.
> > + */
> > +if (hba->mcq_enabled) {
> > +ocs = ufshcd_get_tr_ocs(lrbp, cqe);
> > +if (ocs == OCS_ABORTED)
> > +return;
> > +}
> 
> Why only ignore the OCS_ABORTED status in MCQ mode? Is my
> understanding
> correct that MediaTek controllers can also report this status in
> legacy 
> mode?
> 
> Thanks,

Because according to the specification, only MCQ will have 
OCS: ABORTED. MediaTek, even with a quirk handling SDB OCS ABORTED,
cannot simply ignore it here and not deal with it. 
Otherwise, it would need to release directly like MCQ ufshcd_abort_one.

Thanks
Peter


> 
> Bart.

From peter.wang at mediatek.com  Tue Sep 24 01:51:10 2024
From: peter.wang at mediatek.com (=?utf-8?B?UGV0ZXIgV2FuZyAo546L5L+h5Y+LKQ==?=)
Date: Tue, 24 Sep 2024 08:51:10 +0000
Subject: [PATCH v8 3/3] ufs: core: add a quirk for MediaTek SDB mode
 aborted
In-Reply-To: <ce42d310-2a23-453f-bd14-71eeaf9f5664@acm.org>
References: <20240923080344.19084-1-peter.wang@mediatek.com>
	 <20240923080344.19084-4-peter.wang@mediatek.com>
	 <ce42d310-2a23-453f-bd14-71eeaf9f5664@acm.org>
Message-ID: <e0cb5defb8894ea8fb058c617e9de3d3cfa9763f.camel@mediatek.com>

On Mon, 2024-09-23 at 11:15 -0700, Bart Van Assche wrote:
>  	 
> External email : Please do not click links or open attachments until
> you have verified the sender or the content.
>  On 9/23/24 1:03 AM, peter.wang at mediatek.com wrote:
> > diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
> > index b5c7bc50a27e..b42079c3d634 100644
> > --- a/drivers/ufs/core/ufshcd.c
> > +++ b/drivers/ufs/core/ufshcd.c
> > @@ -5404,7 +5404,10 @@ ufshcd_transfer_rsp_status(struct ufs_hba
> *hba, struct ufshcd_lrb *lrbp,
> >   }
> >   break;
> >   case OCS_ABORTED:
> > -result |= DID_ABORT << 16;
> > +if (hba->quirks & UFSHCD_QUIRK_OCS_ABORTED)
> > +result |= DID_REQUEUE << 16;
> > +else
> > +result |= DID_ABORT << 16;
> >   dev_warn(hba->dev,
> >   "OCS aborted from controller = %x for tag %d\n",
> >   ocs, lrbp->task_tag);
> 
> I think the approach of this patch is racy: the cmd->result
> assignment
> by ufshcd_transfer_rsp_status() races with the cmd->result assignment
> by
> ufshcd_abort_one(). How about addressing this race as follows?
> * In ufshcd_compl_one_cqe(), if the OCS_ABORTED status is
> encountered,
>    set a completion.
> * In the code that aborts SCSI commands, for MediaTek controllers
> only,
>    wait for that completion (based on a quirk).
> * Instead of introducing an if-statement in
>    ufshcd_transfer_rsp_status(), rely on the cmd->result value
> assigned
>    by ufshcd_abort_one().
> 
> Thanks,
> 
> Bart.

Hi Bart,

Sorry, I might not have understood the potential racing issue here.

The SCSI abort command doesn't need to wait for completion because 
SCSI doesn't care about cmd->result, right?

The error handler abort also doesn't need to wait for completion, 
because it should have a guaranteed order?
Firstly, ufshcd_abort_one is only likely to be filled 
back with OCS: ABORTED by MediaTek UFS controller after 
ufshcd_try_to_abort_task, and the sequence is as follows.

ufshcd_err_handler()
  ufshcd_abort_all()
    ufshcd_abort_one()
      ufshcd_try_to_abort_task()	// trigger mediatek controller
fill OCS: ABORTED
    ufshcd_complete_requests()
      ufshcd_transfer_req_compl()
        ufshcd_poll()
          get outstanding_lock
          clear outstanding_reqs tag
          release outstanding_lock	
          __ufshcd_transfer_req_compl()
            ufshcd_compl_one_cqe()
              cmd->result = DID_REQUEUE // mediatek may need quirk
change DID_ABORT to DID_REQUEUE


In addition, the ISR will use the outstanding_lock with 
ufshcd_err_handler to provide protection, so there won't be any 
racing that causes the command to be released repeatedly. 
The only possible issue might be that after ufshcd_abort_one, 
the MediaTek UFS controller has not yet filled in OCS: ABORTED 
and has entered ufshcd_transfer_rsp_status for checking. 
But this doesn't matter, because it will just be treated 
as OCS_INVALID_COMMAND_STATUS.

Is there any corner case that I might have overlooked?


Thanks.
Peter



> 

From liankun.yang at mediatek.com  Tue Sep 24 01:36:54 2024
From: liankun.yang at mediatek.com (Liankun Yang)
Date: Tue, 24 Sep 2024 16:36:54 +0800
Subject: [PATCH v2 1/1] drm/mediatek: dp: Add sdp path reset
Message-ID: <20240924083715.18620-1-liankun.yang@mediatek.com>

When using type-c to type-c to connect to the monitor,
the sound plays normally. If you unplug the type-c and
connect the type-c to hdmi dongle to the monitor, there will be noise.

By capturing the audio data, it is found that
the data position is messy, and there is no error in the data.

Through experiments, it can be restored by resetting the SDP path
when unplugging it.

Signed-off-by: Liankun Yang <liankun.yang at mediatek.com>
---
Changes in V2:
- Fix build error.
Per suggestion from the previous thread:
https://patchwork.kernel.org/project/linux-mediatek/patch/20240923133610.23728-1-liankun.yang at mediatek.com/
---
 drivers/gpu/drm/mediatek/mtk_dp.c     | 15 +++++++++++++++
 drivers/gpu/drm/mediatek/mtk_dp_reg.h |  1 +
 2 files changed, 16 insertions(+)

diff --git a/drivers/gpu/drm/mediatek/mtk_dp.c b/drivers/gpu/drm/mediatek/mtk_dp.c
index d8796a904eca..4003bd83f64e 100644
--- a/drivers/gpu/drm/mediatek/mtk_dp.c
+++ b/drivers/gpu/drm/mediatek/mtk_dp.c
@@ -1052,6 +1052,18 @@ static void mtk_dp_digital_sw_reset(struct mtk_dp *mtk_dp)
 			   0, DP_TX_TRANSMITTER_4P_RESET_SW_DP_TRANS_P0);
 }
 
+static void mtk_dp_sdp_path_reset(struct mtk_dp *mtk_dp)
+{
+	mtk_dp_update_bits(mtk_dp, MTK_DP_ENC0_P0_3004,
+				SDP_RESET_SW_DP_ENC0_P0,
+				SDP_RESET_SW_DP_ENC0_P0);
+
+	/* Wait for sdp path reset to complete */
+	usleep_range(1000, 5000);
+	mtk_dp_update_bits(mtk_dp, MTK_DP_ENC0_P0_3004,
+				0, SDP_RESET_SW_DP_ENC0_P0);
+}
+
 static void mtk_dp_set_lanes(struct mtk_dp *mtk_dp, int lanes)
 {
 	mtk_dp_update_bits(mtk_dp, MTK_DP_TRANS_P0_35F0,
@@ -2314,6 +2326,9 @@ static void mtk_dp_bridge_atomic_disable(struct drm_bridge *bridge,
 			   DP_PWR_STATE_BANDGAP_TPLL,
 			   DP_PWR_STATE_MASK);
 
+	/* SDP path reset sw*/
+	mtk_dp_sdp_path_reset(mtk_dp);
+
 	/* Ensure the sink is muted */
 	msleep(20);
 }
diff --git a/drivers/gpu/drm/mediatek/mtk_dp_reg.h b/drivers/gpu/drm/mediatek/mtk_dp_reg.h
index 709b79480693..47b283fcb341 100644
--- a/drivers/gpu/drm/mediatek/mtk_dp_reg.h
+++ b/drivers/gpu/drm/mediatek/mtk_dp_reg.h
@@ -86,6 +86,7 @@
 #define MTK_DP_ENC0_P0_3004			0x3004
 #define VIDEO_M_CODE_SEL_DP_ENC0_P0_MASK		BIT(8)
 #define DP_TX_ENCODER_4P_RESET_SW_DP_ENC0_P0		BIT(9)
+#define SDP_RESET_SW_DP_ENC0_P0			BIT(13)
 #define MTK_DP_ENC0_P0_3010			0x3010
 #define HTOTAL_SW_DP_ENC0_P0_MASK			GENMASK(15, 0)
 #define MTK_DP_ENC0_P0_3014			0x3014
-- 
2.45.2



From krzk at kernel.org  Tue Sep 24 02:10:56 2024
From: krzk at kernel.org (Krzysztof Kozlowski)
Date: Tue, 24 Sep 2024 11:10:56 +0200
Subject: [PATCH v2 2/2] dt-bindings: display: mediatek: dpi: Add power
 domain for MT8195 DP_INTF
In-Reply-To: <20240919112152.2829765-3-rohiagar@chromium.org>
References: <20240919112152.2829765-1-rohiagar@chromium.org>
 <20240919112152.2829765-3-rohiagar@chromium.org>
Message-ID: <xtugchpbl6ad73v4cthrgv4brn7ochy5rp2iipmkguhwdjo4d7@aognbiq4wcet>

On Thu, Sep 19, 2024 at 11:21:52AM +0000, Rohit Agarwal wrote:
> Add power domain binding for MT8195 DP_INTF that resolves the following
> error and many more similar ones:

Binding is already there. You do not add anything new here. Please
describe what exactly you are doing in terms of hardware? Do you have
power domains or not?

> 
> arch/arm64/boot/dts/mediatek/mt8195-cherry-dojo-r1.dtb: dp-intf at 1c113000:
> power-domains: False schema does not allow [[55, 18]]

Best regards,
Krzysztof



From krzk at kernel.org  Tue Sep 24 02:11:23 2024
From: krzk at kernel.org (Krzysztof Kozlowski)
Date: Tue, 24 Sep 2024 11:11:23 +0200
Subject: [PATCH v2 1/2] dt-bindings: display: mediatek: dpi: Add power
 domain for MT8183
In-Reply-To: <20240919112152.2829765-2-rohiagar@chromium.org>
References: <20240919112152.2829765-1-rohiagar@chromium.org>
 <20240919112152.2829765-2-rohiagar@chromium.org>
Message-ID: <4djlcabqjkq7thbxadjbbi6oumybnyzv7biwawke46ctjccwye@rmqougrj6pl2>

On Thu, Sep 19, 2024 at 11:21:51AM +0000, Rohit Agarwal wrote:
> Add power domain binding to the mediatek DPI controller

That's DPI controller, how can you add here power domain binding?

> for MT8183 that already had the property in DT.

Best regards,
Krzysztof



From angelogioacchino.delregno at collabora.com  Tue Sep 24 02:28:13 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Tue, 24 Sep 2024 11:28:13 +0200
Subject: [PATCH v1 2/3] rtc: mt6359: Add RTC hardware range and add
 support for start-year
In-Reply-To: <0748868d-4789-fcaa-e70f-6a4508411b36@mediatek.com>
References: <20240923100010.97470-1-angelogioacchino.delregno@collabora.com>
 <20240923100010.97470-3-angelogioacchino.delregno@collabora.com>
 <0748868d-4789-fcaa-e70f-6a4508411b36@mediatek.com>
Message-ID: <0188d8cc-faad-4ef1-99fe-d1586f97d65f@collabora.com>

Il 24/09/24 06:08, Macpaul Lin ha scritto:
> 
> On 9/23/24 18:00, AngeloGioacchino Del Regno wrote:
>> Add the RTC hardware range parameters to enable the possibility
>> of using the `start-year` devicetree property which, if present,
>> will set the start_secs parameter by overriding the defaults
>> that this driver is setting;
>>
>> To keep compatibility with (hence have the same date/time reading
>> as) the old behavior, set:
>> ? - range_min to 1900-01-01 00:00:00
>> ? - range_max to 2027-12-31 23:59:59 (HW year max range is 0-127)
>> ? - start_secs defaulting to 1968-01-02 00:00:00
>>
>> Please note that the oddness of starting from January 2nd is not
>> a hardware quirk and it's done only to get the same date/time
>> reading as an RTC which time was set before this commit.
>>
>> Also remove the RTC_MIN_YEAR_OFFSET addition and subtraction in
>> callbacks set_time() and read_time() respectively, as now this
>> is already done by the API.
>>
>> Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
>> ---
>> ? drivers/rtc/rtc-mt6397.c | 13 ++++---------
>> ? 1 file changed, 4 insertions(+), 9 deletions(-)
> 
> [snip]
> 
> Thanks for helping add new patch fix for RTC.
> 
>> @@ -302,6 +293,10 @@ static int mtk_rtc_probe(struct platform_device *pdev)
>> ????? device_init_wakeup(&pdev->dev, 1);
>> ????? rtc->rtc_dev->ops = &mtk_rtc_ops;
>> +??? rtc->rtc_dev->range_min = RTC_TIMESTAMP_BEGIN_1900;
>> +??? rtc->rtc_dev->range_max = mktime64(2027, 12, 31, 23, 59, 59);
>> +??? rtc->rtc_dev->start_secs = mktime64(1968, 1, 2, 0, 0, 0);
>> +??? rtc->rtc_dev->set_start_time = true;
>> ????? return devm_rtc_register_device(rtc->rtc_dev);
>> ? }
> 
> Dear @Zhanhan, Please help to leave comment if you think there is something need to 
> be clarify. For example, I've found some relate origin defines
> in "include/linux/mfd/mt6397/rtc.h"
> #define RTC_MIN_YEAR??? 1968
> #define RTC_BASE_YEAR??? 1900
> #define RTC_NUM_YEAR??? 128
> #define RTC_MIN_YEAR_OFFSET??? (RTC_MIN_YEAR - RTC_BASE_YEAR)
> 
> Should MediaTek remove RTC_MIN_YEAR and RTC_BASE_YEAR in next patch?
> And since there may not exist any smartphone/tablet/TV using mt6397
> RTC earlier than 2010? Is it possible to change
> RTC_TIMESTAMP_BEGIN_1900 to RTC_TIMESTAMP_BEGIN_2000 without breaking
> compatibility for these devices?

Adding some context:

Being clear, the RTC timestamp starting at year 1900 doesn't mean that the
last achievable date is 2027, as the time is anyway shifted by 68 years in
this case - so, by default, the year range goes from 1968 to 2095 (unless
overridden by the start-year property, of course).

This means that setting the RTC to start at a different year doesn't really
give any measurable improvement, as that would avoid just one addition and
one subtraction operation at read and write respectively, which is something
that happens "rarely in a boot life" (RTC usually gets read once at kernel
boot, and written every time you change the date/time, which normally happens
once per day, if not even less...!).

Cheers,
Angelo



From angelogioacchino.delregno at collabora.com  Tue Sep 24 02:30:25 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Tue, 24 Sep 2024 11:30:25 +0200
Subject: [PATCH v1 2/3] rtc: mt6359: Add RTC hardware range and add
 support for start-year
In-Reply-To: <247abc15-d82f-3e8f-5202-edc6099707df@mediatek.com>
References: <20240923100010.97470-1-angelogioacchino.delregno@collabora.com>
 <20240923100010.97470-3-angelogioacchino.delregno@collabora.com>
 <0748868d-4789-fcaa-e70f-6a4508411b36@mediatek.com>
 <247abc15-d82f-3e8f-5202-edc6099707df@mediatek.com>
Message-ID: <72ce817e-63de-40a7-b7e9-a5b44b67e207@collabora.com>

Il 24/09/24 09:05, Macpaul Lin ha scritto:
> 
> On 9/24/24 12:08, Macpaul Lin wrote:
>>
>> On 9/23/24 18:00, AngeloGioacchino Del Regno wrote:
>>> Add the RTC hardware range parameters to enable the possibility
>>> of using the `start-year` devicetree property which, if present,
>>> will set the start_secs parameter by overriding the defaults
>>> that this driver is setting;
>>>
>>> To keep compatibility with (hence have the same date/time reading
>>> as) the old behavior, set:
>>> ? - range_min to 1900-01-01 00:00:00
>>> ? - range_max to 2027-12-31 23:59:59 (HW year max range is 0-127)
>>> ? - start_secs defaulting to 1968-01-02 00:00:00
>>>
>>> Please note that the oddness of starting from January 2nd is not
>>> a hardware quirk and it's done only to get the same date/time
>>> reading as an RTC which time was set before this commit.
>>>
>>> Also remove the RTC_MIN_YEAR_OFFSET addition and subtraction in
>>> callbacks set_time() and read_time() respectively, as now this
>>> is already done by the API.
>>>
>>> Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
>>> ---
>>> ? drivers/rtc/rtc-mt6397.c | 13 ++++---------
>>> ? 1 file changed, 4 insertions(+), 9 deletions(-)
>>
>> [snip]
>>
>> Thanks for helping add new patch fix for RTC.
>>
>>> @@ -302,6 +293,10 @@ static int mtk_rtc_probe(struct platform_device *pdev)
>>> ????? device_init_wakeup(&pdev->dev, 1);
>>> ????? rtc->rtc_dev->ops = &mtk_rtc_ops;
>>> +??? rtc->rtc_dev->range_min = RTC_TIMESTAMP_BEGIN_1900;
>>> +??? rtc->rtc_dev->range_max = mktime64(2027, 12, 31, 23, 59, 59);
>>> +??? rtc->rtc_dev->start_secs = mktime64(1968, 1, 2, 0, 0, 0);
>>> +??? rtc->rtc_dev->set_start_time = true;
>>> ????? return devm_rtc_register_device(rtc->rtc_dev);
>>> ? }
>>
>> Dear @Zhanhan, Please help to leave comment if you think there is something need 
>> to be clarify. For example, I've found some relate origin defines
>> in "include/linux/mfd/mt6397/rtc.h"
>> #define RTC_MIN_YEAR??? 1968
>> #define RTC_BASE_YEAR??? 1900
>> #define RTC_NUM_YEAR??? 128
>> #define RTC_MIN_YEAR_OFFSET??? (RTC_MIN_YEAR - RTC_BASE_YEAR)
>>
>> Should MediaTek remove RTC_MIN_YEAR and RTC_BASE_YEAR in next patch?
>> And since there may not exist any smartphone/tablet/TV using mt6397
>> RTC earlier than 2010? Is it possible to change
>> RTC_TIMESTAMP_BEGIN_1900 to RTC_TIMESTAMP_BEGIN_2000 without breaking
>> compatibility for these devices?
>>
>> Thanks
>> Macpaul Lin
>>
> 
> After discussing these change with ZhanZhan, MediaTek think use 
> RTC_TIMESTAMP_BEGIN_1900 and the other changes are okay.
> 
> Reviewed-by: Macpaul Lin <macpaul.lin at mediatek.com>
> Reviewed-by: ZhanZhan Ge <zhanzhan.ge at mediatek.com>
> 

Thank you Macpaul, ZhanZhan :-)

Cheers,
Angelo


From angelogioacchino.delregno at collabora.com  Tue Sep 24 02:32:19 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Tue, 24 Sep 2024 11:32:19 +0200
Subject: [PATCH v2 1/1] drm/mediatek: dp: Add sdp path reset
In-Reply-To: <20240924083715.18620-1-liankun.yang@mediatek.com>
References: <20240924083715.18620-1-liankun.yang@mediatek.com>
Message-ID: <f6f40eb2-83e0-4588-baa7-eaf8c41bebb8@collabora.com>

Il 24/09/24 10:36, Liankun Yang ha scritto:
> When using type-c to type-c to connect to the monitor,
> the sound plays normally. If you unplug the type-c and
> connect the type-c to hdmi dongle to the monitor, there will be noise.
> 
> By capturing the audio data, it is found that
> the data position is messy, and there is no error in the data.
> 
> Through experiments, it can be restored by resetting the SDP path
> when unplugging it.
> 
> Signed-off-by: Liankun Yang <liankun.yang at mediatek.com>

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>



From lorenzo at kernel.org  Tue Sep 24 03:12:11 2024
From: lorenzo at kernel.org (Lorenzo Bianconi)
Date: Tue, 24 Sep 2024 12:12:11 +0200
Subject: [PATCH v4 4/5] pinctrl: airoha: Add support for EN7581 SoC
In-Reply-To: <CACRpkdZbyQ5bk8oR+Q4UmQCdM5h1mF1ztBc26YzqNsze_B=ehA@mail.gmail.com>
References: <20240911-en7581-pinctrl-v4-0-60ac93d760bb@kernel.org>
 <20240911-en7581-pinctrl-v4-4-60ac93d760bb@kernel.org>
 <CACRpkdZbyQ5bk8oR+Q4UmQCdM5h1mF1ztBc26YzqNsze_B=ehA@mail.gmail.com>
Message-ID: <ZvKQe73ZKIFy4fny@lore-desk>

> Hi Lorenzo / Benjamin,
> 
> thanks for your patch!
> 
> This is a real nice driver, I like the design of the pin database to support
> this pretty complex pin controller.

Hi Linus,

thx for the review, some questions inline.

Regards,
Lorenzo

> 
> Some comments and nits:
> 
> On Wed, Sep 11, 2024 at 9:51?PM Lorenzo Bianconi <lorenzo at kernel.org> wrote:
> 
> > Introduce pinctrl driver for EN7581 SoC. Current EN7581 pinctrl driver
> > supports the following functionalities:
> > - pin multiplexing
> > - pin pull-up, pull-down, open-drain, current strength,
> >   {input,output}_enable, output_{low,high}
> > - gpio controller
> > - irq controller
> >
> > Tested-by: Benjamin Larsson <benjamin.larsson at genexis.eu>
> > Co-developed-by: Benjamin Larsson <benjamin.larsson at genexis.eu>
> > Signed-off-by: Benjamin Larsson <benjamin.larsson at genexis.eu>
> > Signed-off-by: Lorenzo Bianconi <lorenzo at kernel.org>
> 
> (...)
> 
> > +#include <dt-bindings/pinctrl/mt65xx.h>
> > +#include <linux/bitfield.h>
> 
> Isn't just <linux/bits.h> enough for what you're using?

ack, I will fix it in v5

> 
> > +#include <linux/gpio/driver.h>
> > +#include <linux/interrupt.h>
> > +#include <linux/io.h>
> > +#include <linux/irq.h>
> > +#include <linux/irqdomain.h>
> > +#include <linux/kernel.h>
> 
> What do you use from kernel.h? We usually use more fingrained
> headers these days.

ack, I will remove it in v5

> 
> (...)
> 
> > +#include <linux/mfd/airoha-en7581-mfd.h>
> > +#include <linux/mfd/syscon.h>
> > +#include <linux/of.h>
> > +#include <linux/of_irq.h>
> > +#include <linux/of_platform.h>
> > +#include <linux/pinctrl/consumer.h>
> 
> Why do you need the consumer header?

we need it for pinctrl_gpio_direction_output() and
pinctrl_gpio_direction_input() for direction_input and direction_output
callbacks.

> 
> (...)
> 
> > +static u32 airoha_pinctrl_rmw_unlock(void __iomem *addr, u32 mask, u32 val)
> > +{
> > +       val |= (readl(addr) & ~mask);
> > +       writel(val, addr);
> > +
> > +       return val;
> > +}
> > +
> > +#define airoha_pinctrl_set_unlock(addr, val)                                   \
> > +       airoha_pinctrl_rmw_unlock((addr), 0, (val))
> > +#define airoha_pinctrl_clear_unlock(addr, mask)                                        \
> > +       airoha_pinctrl_rmw_unlock((addr), (mask), (0))
> > +
> > +static u32 airoha_pinctrl_rmw(struct airoha_pinctrl *pinctrl,
> > +                             void __iomem *addr, u32 mask, u32 val)
> > +{
> > +       mutex_lock(&pinctrl->mutex);
> > +       val = airoha_pinctrl_rmw_unlock(addr, mask, val);
> > +       mutex_unlock(&pinctrl->mutex);
> > +
> > +       return val;
> > +}
> 
> Thus looks like a reimplementation of regmap-mmio, can't you just use
> regmap MMIO? You use it for the SCU access already...
> 
> If you persist with this solution, please use a guard:
> 
> #include <linux/cleanup.h>
> 
> guard(mutex)(&pinctrl->mutex);
> 
> And the lock will be released when you exit the function.

I am fine to switch to regmap but I guess we need to enable fast_io
since it can run even in interrupt context. Btw, I figured out even
airoha_pinctrl_rmw needs to grab a spin_lock since we can exec a led
trigger (like timer) where we run airoha_pinctrl_rmw in interrupt context
(so it should be fine to use a single regmap for it).
However, I guess we need to keep the spin_lock in airoha_pinctrl_gpiochip
since we need to grab it in airoha_pinctrl_gpio_irq_unmask() and
airoha_pinctrl_gpio_irq_type() (we access irq_type array there).
A possible solution would be to keep the local spin_lock and set
disable_locking. What do you think? Do you prefer to switch to regmap or
keep the current implementation using 'guard(spinlock_irqsave)' instead?

> 
> > +static int airoha_pinctrl_get_gpio_from_pin(struct pinctrl_dev *pctrl_dev,
> > +                                           int pin)
> > +{
> > +       struct pinctrl_gpio_range *range;
> > +       int gpio;
> > +
> > +       range = pinctrl_find_gpio_range_from_pin_nolock(pctrl_dev, pin);
> > +       if (!range)
> > +               return -EINVAL;
> > +
> > +       gpio = pin - range->pin_base;
> > +       if (gpio < 0)
> > +               return -EINVAL;
> > +
> > +       return gpio;
> > +}
> 
> This function is just used here:

it is used in airoha_pinconf_get()/airoha_pinconf_set()

> 
> > +static int airoha_pinconf_get(struct pinctrl_dev *pctrl_dev,
> > +                             unsigned int pin, unsigned long *config)
> > +{
> > +       struct airoha_pinctrl *pinctrl = pinctrl_dev_get_drvdata(pctrl_dev);
> > +       enum pin_config_param param = pinconf_to_config_param(*config);
> > +       u32 arg;
> > +
> > +       switch (param) {
> > +       case PIN_CONFIG_BIAS_PULL_DOWN:
> > +       case PIN_CONFIG_BIAS_DISABLE:
> > +       case PIN_CONFIG_BIAS_PULL_UP: {
> > +               u32 pull_up, pull_down;
> > +
> > +               if (airoha_pinctrl_get_pullup_conf(pinctrl, pin, &pull_up) ||
> > +                   airoha_pinctrl_get_pulldown_conf(pinctrl, pin, &pull_down))
> > +                       return -EINVAL;
> > +
> > +               if (param == PIN_CONFIG_BIAS_PULL_UP &&
> > +                   !(pull_up && !pull_down))
> > +                       return -EINVAL;
> > +               else if (param == PIN_CONFIG_BIAS_PULL_DOWN &&
> > +                        !(pull_down && !pull_up))
> > +                       return -EINVAL;
> > +               else if (pull_up || pull_down)
> > +                       return -EINVAL;
> > +
> > +               arg = 1;
> > +               break;
> > +       }
> > +       case PIN_CONFIG_DRIVE_STRENGTH: {
> > +               u32 e2, e4;
> > +
> > +               if (airoha_pinctrl_get_drive_e2_conf(pinctrl, pin, &e2) ||
> > +                   airoha_pinctrl_get_drive_e4_conf(pinctrl, pin, &e4))
> > +                       return -EINVAL;
> > +
> > +               arg = e4 << 1 | e2;
> > +               break;
> > +       }
> > +       case PIN_CONFIG_DRIVE_OPEN_DRAIN:
> > +               if (airoha_pinctrl_get_pcie_rst_od_conf(pinctrl, pin, &arg))
> > +                       return -EINVAL;
> > +               break;
> > +       case PIN_CONFIG_OUTPUT_ENABLE:
> > +       case PIN_CONFIG_INPUT_ENABLE: {
> > +               int gpio = airoha_pinctrl_get_gpio_from_pin(pctrl_dev, pin);
> > +
> > +               if (gpio < 0)
> > +                       return gpio;
> > +
> > +               arg = airoha_pinctrl_gpio_get_direction(pinctrl, gpio);
> 
> I don't see why a pin would have to exist in a GPIO range in order to
> be set as output or input?
> 
> Can't you just set up the pin as requested and not care whether
> it has a corresponding GPIO range?
> 
> Is it over-reuse of the GPIO code? I'd say just set up the pin instead.

Do you mean to get rid of PIN_CONFIG_OUTPUT_ENABLE, PIN_CONFIG_INPUT_ENABLE
(and even PIN_CONFIG_OUTPUT in airoha_pinconf_set()) here?
E.g. we need PIN_CONFIG_OUTPUT_ENABLE to enable pwm for pwm-leds:

&mfd {
	...
	pio: pinctrl {
		...
		pwm_gpio18_idx10_pins: pwm-gpio18-idx10-pins {
			function = "pwm";
			pins = "gpio18";
			output-enable;
		};
	};
};

> 
> > +static int airoha_pinconf_set(struct pinctrl_dev *pctrl_dev,
> > +                             unsigned int pin, unsigned long *configs,
> > +                             unsigned int num_configs)
> > +{
> > +       struct airoha_pinctrl *pinctrl = pinctrl_dev_get_drvdata(pctrl_dev);
> > +       int i;
> > +
> > +       for (i = 0; i < num_configs; i++) {
> > +               u32 param = pinconf_to_config_param(configs[i]);
> > +               u32 arg = pinconf_to_config_argument(configs[i]);
> > +
> > +               switch (param) {
> > +               case PIN_CONFIG_BIAS_DISABLE:
> > +                       airoha_pinctrl_set_pulldown_conf(pinctrl, pin, 0);
> > +                       airoha_pinctrl_set_pullup_conf(pinctrl, pin, 0);
> > +                       break;
> > +               case PIN_CONFIG_BIAS_PULL_UP:
> > +                       airoha_pinctrl_set_pulldown_conf(pinctrl, pin, 0);
> > +                       airoha_pinctrl_set_pullup_conf(pinctrl, pin, 1);
> > +                       break;
> > +               case PIN_CONFIG_BIAS_PULL_DOWN:
> > +                       airoha_pinctrl_set_pulldown_conf(pinctrl, pin, 1);
> > +                       airoha_pinctrl_set_pullup_conf(pinctrl, pin, 0);
> > +                       break;
> > +               case PIN_CONFIG_DRIVE_STRENGTH: {
> > +                       u32 e2 = 0, e4 = 0;
> > +
> > +                       switch (arg) {
> > +                       case MTK_DRIVE_2mA:
> > +                               break;
> > +                       case MTK_DRIVE_4mA:
> > +                               e2 = 1;
> > +                               break;
> > +                       case MTK_DRIVE_6mA:
> > +                               e4 = 1;
> > +                               break;
> > +                       case MTK_DRIVE_8mA:
> > +                               e2 = 1;
> > +                               e4 = 1;
> > +                               break;
> > +                       default:
> > +                               return -EINVAL;
> > +                       }
> > +
> > +                       airoha_pinctrl_set_drive_e2_conf(pinctrl, pin, e2);
> > +                       airoha_pinctrl_set_drive_e4_conf(pinctrl, pin, e4);
> > +                       break;
> > +               }
> > +               case PIN_CONFIG_DRIVE_OPEN_DRAIN:
> > +                       airoha_pinctrl_set_pcie_rst_od_conf(pinctrl, pin, !!arg);
> > +                       break;
> > +               case PIN_CONFIG_OUTPUT_ENABLE:
> > +               case PIN_CONFIG_INPUT_ENABLE:
> > +               case PIN_CONFIG_OUTPUT: {
> > +                       int gpio = airoha_pinctrl_get_gpio_from_pin(pctrl_dev, pin);
> > +                       bool input = param == PIN_CONFIG_INPUT_ENABLE;
> > +
> > +                       if (gpio < 0)
> > +                               return gpio;
> > +
> > +                       airoha_pinctrl_gpio_set_direction(pinctrl, gpio, input);
> > +                       if (param == PIN_CONFIG_OUTPUT)
> > +                               airoha_pinctrl_gpio_set_value(pinctrl, gpio, !!arg);
> > +                       break;
> 
> Dito. No need to reuse the GPIO set direction function. Make a helper
> that just work on the pin instead, and perhaps the GPIO set direction
> can use that instead.

ack, I will fix it in v5.

> 
> > +static int airoha_pinctrl_gpio_direction_output(struct gpio_chip *chip,
> > +                                               unsigned int gpio, int value)
> > +{
> > +       int err;
> > +
> > +       err = pinctrl_gpio_direction_output(chip, gpio);
> > +       if (err)
> > +               return err;
> > +
> > +       airoha_pinctrl_gpio_set(chip, gpio, value);
> 
> Hm I get a bit confused by the similarly named helpers I guess...

Naming is always hard, I will try to improve :)

> 
> > +static void airoha_pinctrl_gpio_irq_unmask(struct irq_data *data)
> > +{
> > +       u8 offset = data->hwirq % AIROHA_REG_GPIOCTRL_NUM_GPIO;
> > +       u8 index = data->hwirq / AIROHA_REG_GPIOCTRL_NUM_GPIO;
> > +       u32 mask = GENMASK(2 * offset + 1, 2 * offset);
> > +       struct airoha_pinctrl_gpiochip *gpiochip;
> > +       u32 val = BIT(2 * offset);
> > +       unsigned long flags;
> > +
> > +       gpiochip = irq_data_get_irq_chip_data(data);
> > +       if (WARN_ON_ONCE(data->hwirq >= ARRAY_SIZE(gpiochip->irq_type)))
> > +               return;
> > +
> > +       spin_lock_irqsave(&gpiochip->lock, flags);
> 
> Use a scoped guard here
> 
> guard(spinlock_irqsave)(&gpiochip->lock);
> 
> > +static void airoha_pinctrl_gpio_irq_mask(struct irq_data *data)
> > +{
> > +       u8 offset = data->hwirq % AIROHA_REG_GPIOCTRL_NUM_GPIO;
> > +       u8 index = data->hwirq / AIROHA_REG_GPIOCTRL_NUM_GPIO;
> > +       u32 mask = GENMASK(2 * offset + 1, 2 * offset);
> > +       struct airoha_pinctrl_gpiochip *gpiochip;
> > +       unsigned long flags;
> > +
> > +       gpiochip = irq_data_get_irq_chip_data(data);
> > +
> > +       spin_lock_irqsave(&gpiochip->lock, flags);
> 
> Dito
> 
> > +static int airoha_pinctrl_gpio_irq_type(struct irq_data *data,
> > +                                       unsigned int type)
> > +{
> > +       struct airoha_pinctrl_gpiochip *gpiochip;
> > +       unsigned long flags;
> > +
> > +       gpiochip = irq_data_get_irq_chip_data(data);
> > +       if (data->hwirq >= ARRAY_SIZE(gpiochip->irq_type))
> > +               return -EINVAL;
> > +
> > +       spin_lock_irqsave(&gpiochip->lock, flags);
> 
> Dito
> 
> > +       girq->chip = devm_kzalloc(dev, sizeof(*girq->chip), GFP_KERNEL);
> > +       if (!girq->chip)
> > +               return -ENOMEM;
> > +
> > +       girq->chip->name = dev_name(dev);
> > +       girq->chip->irq_unmask = airoha_pinctrl_gpio_irq_unmask;
> > +       girq->chip->irq_mask = airoha_pinctrl_gpio_irq_mask;
> > +       girq->chip->irq_mask_ack = airoha_pinctrl_gpio_irq_mask;
> > +       girq->chip->irq_set_type = airoha_pinctrl_gpio_irq_type;
> > +       girq->chip->flags = IRQCHIP_SET_TYPE_MASKED | IRQCHIP_IMMUTABLE;
> > +       girq->default_type = IRQ_TYPE_NONE;
> > +       girq->handler = handle_simple_irq;
> 
> If the irqchip is immutable it is const and there is no point to malloc it.
> 
> Just
> 
> static const struct irq_chip airoha_gpio_irq_chip = {...
> 
> And assign it:
> 
> girq = &g->gc.irq;
> gpio_irq_chip_set_chip(girq, &airoha_gpio_irq_chip);

ack, I will fix it in v5.

Regards,
Lorenzo

> 
> Yours,
> Linus Walleij
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 228 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-mediatek/attachments/20240924/1734befd/attachment-0001.sig>

From max_weng at compal.corp-partner.google.com  Tue Sep 24 03:15:59 2024
From: max_weng at compal.corp-partner.google.com (Max Weng)
Date: Tue, 24 Sep 2024 18:15:59 +0800
Subject: [PATCH v3] arm64: dts: mediatek: mt8186: add FHCTL node
Message-ID: <20240924101559.879167-1-max_weng@compal.corp-partner.google.com>

From: max_weng <max_weng at compal.corp-partner.google.com>

add FHCTL device node for Frequency Hopping and Spread Spectrum clock function.

Signed-off-by: Max Weng <max_weng at compal.corp-partner.google.com>
---
 Change from v2 to v3
 * Remove the Change-Id tag. 
 arch/arm64/boot/dts/mediatek/mt8186.dtsi | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/arch/arm64/boot/dts/mediatek/mt8186.dtsi b/arch/arm64/boot/dts/mediatek/mt8186.dtsi
index 148c332018b0..d3c3c2a40adc 100644
--- a/arch/arm64/boot/dts/mediatek/mt8186.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8186.dtsi
@@ -29,6 +29,13 @@ aliases {
 		rdma1 = &rdma1;
 	};
 
+	fhctl: fhctl at 1000ce00 {
+		compatible = "mediatek,mt8186-fhctl";
+		clocks = <&apmixedsys CLK_APMIXED_TVDPLL>;
+		reg = <0 0x1000ce00 0 0x200>;
+		status = "disabled";
+	};
+
 	cci: cci {
 		compatible = "mediatek,mt8186-cci";
 		clocks = <&mcusys CLK_MCU_ARMPLL_BUS_SEL>,
-- 
2.34.1



From macpaul.lin at mediatek.com  Tue Sep 24 03:31:53 2024
From: macpaul.lin at mediatek.com (Macpaul Lin)
Date: Tue, 24 Sep 2024 18:31:53 +0800
Subject: [PATCH 3/6] dt-bindings: display: mediatek: Fix clocks count constraint for new SoCs
In-Reply-To: <20240924103156.13119-1-macpaul.lin@mediatek.com>
References: <20240924103156.13119-1-macpaul.lin@mediatek.com>
Message-ID: <20240924103156.13119-3-macpaul.lin@mediatek.com>

The display node in mt8195.dtsi was triggering a CHECK_DTBS error due
to an excessively long 'clocks' property:
  display at 14f06000: clocks: [[31, 14], [31, 43], [31, 44]] is too long

To resolve this issue, add "maxItems: 3" to the 'clocks' property in
the DT schema.

Fixes: 4ed545e7d100 ("dt-bindings: display: mediatek: disp: split each block to individual yaml")
Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
---
 .../devicetree/bindings/display/mediatek/mediatek,split.yaml     | 1 +
 1 file changed, 1 insertion(+)

diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,split.yaml b/Documentation/devicetree/bindings/display/mediatek/mediatek,split.yaml
index e4affc854f3d..42d2d483cc29 100644
--- a/Documentation/devicetree/bindings/display/mediatek/mediatek,split.yaml
+++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,split.yaml
@@ -57,6 +57,7 @@ properties:
   clocks:
     items:
       - description: SPLIT Clock
+    maxItems: 3
 
 required:
   - compatible
-- 
2.45.2



From macpaul.lin at mediatek.com  Tue Sep 24 03:31:55 2024
From: macpaul.lin at mediatek.com (Macpaul Lin)
Date: Tue, 24 Sep 2024 18:31:55 +0800
Subject: [PATCH 5/6] arm64: dts: mt8195: Fix dtbs_check error for mutex node
In-Reply-To: <20240924103156.13119-1-macpaul.lin@mediatek.com>
References: <20240924103156.13119-1-macpaul.lin@mediatek.com>
Message-ID: <20240924103156.13119-5-macpaul.lin@mediatek.com>

The mutex node in mt8195.dtsi was triggering a dtbs_check error:
  mutex at 1c101000: 'clock-names', 'reg-names' do not match any of the
                  regexes: 'pinctrl-[0-9]+'

This seems no need by inspecting the DT schemas and other reference boards,
so drop 'clock-names' and 'reg-names' in mt8195.dtsi.

Fixes: 92d2c23dc269 ("arm64: dts: mt8195: add display node for vdosys1")
Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
---
 arch/arm64/boot/dts/mediatek/mt8195.dtsi | 2 --
 1 file changed, 2 deletions(-)

diff --git a/arch/arm64/boot/dts/mediatek/mt8195.dtsi b/arch/arm64/boot/dts/mediatek/mt8195.dtsi
index 2e1b41359b43..ade685ed2190 100644
--- a/arch/arm64/boot/dts/mediatek/mt8195.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8195.dtsi
@@ -3331,11 +3331,9 @@ &larb19 &larb21 &larb24 &larb25
 		mutex1: mutex at 1c101000 {
 			compatible = "mediatek,mt8195-disp-mutex";
 			reg = <0 0x1c101000 0 0x1000>;
-			reg-names = "vdo1_mutex";
 			interrupts = <GIC_SPI 494 IRQ_TYPE_LEVEL_HIGH 0>;
 			power-domains = <&spm MT8195_POWER_DOMAIN_VDOSYS1>;
 			clocks = <&vdosys1 CLK_VDO1_DISP_MUTEX>;
-			clock-names = "vdo1_mutex";
 			mediatek,gce-client-reg = <&gce0 SUBSYS_1c10XXXX 0x1000 0x1000>;
 			mediatek,gce-events = <CMDQ_EVENT_VDO1_STREAM_DONE_ENG_0>;
 		};
-- 
2.45.2



From macpaul.lin at mediatek.com  Tue Sep 24 03:31:52 2024
From: macpaul.lin at mediatek.com (Macpaul Lin)
Date: Tue, 24 Sep 2024 18:31:52 +0800
Subject: [PATCH 2/6] dt-bindings: iommu: mediatek: Fix interrupt count constraint for new SoCs
In-Reply-To: <20240924103156.13119-1-macpaul.lin@mediatek.com>
References: <20240924103156.13119-1-macpaul.lin@mediatek.com>
Message-ID: <20240924103156.13119-2-macpaul.lin@mediatek.com>

The infra-iommu node in mt8195.dtsi was triggering a CHECK_DTBS error due
to an excessively long 'interrupts' property. The error message was:

  infra-iommu at 10315000: interrupts: [[0, 795, 4, 0], [0, 796, 4, 0],
                     [0, 797, 4, 0], [0, 798, 4, 0], [0, 799, 4, 0]]
                     is too long

To address this issue, add "minItems: 1" and "maxItems: 5" constraints to
the 'interrupts' property in the DT binding schema. This change allows for
flexibility in the number of interrupts for new SoCs

Fixes: bca28426805d ("dt-bindings: iommu: mediatek: Convert IOMMU to DT schema")

Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
---
 Documentation/devicetree/bindings/iommu/mediatek,iommu.yaml | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/Documentation/devicetree/bindings/iommu/mediatek,iommu.yaml b/Documentation/devicetree/bindings/iommu/mediatek,iommu.yaml
index ea6b0f5f24de..a00f1f0045b1 100644
--- a/Documentation/devicetree/bindings/iommu/mediatek,iommu.yaml
+++ b/Documentation/devicetree/bindings/iommu/mediatek,iommu.yaml
@@ -96,7 +96,8 @@ properties:
     maxItems: 1
 
   interrupts:
-    maxItems: 1
+    minItems: 1
+    maxItems: 5
 
   clocks:
     items:
-- 
2.45.2



From macpaul.lin at mediatek.com  Tue Sep 24 03:31:56 2024
From: macpaul.lin at mediatek.com (Macpaul Lin)
Date: Tue, 24 Sep 2024 18:31:56 +0800
Subject: [PATCH 6/6] dt-bindings: display: mediatek: dpi: Add mt8195 support in power domains
In-Reply-To: <20240924103156.13119-1-macpaul.lin@mediatek.com>
References: <20240924103156.13119-1-macpaul.lin@mediatek.com>
Message-ID: <20240924103156.13119-6-macpaul.lin@mediatek.com>

Add power domain binding to the mediatek DPI controller for MT8185.

The dpi node in mt8195.dtsi was triggering a dtbs_check error:
  dp-intf at 1c113000: power-domains: False schema does not allow [[44, 18]]

Fixes: 5474d49b2f79 ("dt-bindings: display: mediatek: dpi: Add power domains")
Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
---
 .../devicetree/bindings/display/mediatek/mediatek,dpi.yaml       | 1 +
 1 file changed, 1 insertion(+)

diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml b/Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml
index 3a82aec9021c..07acc8a76bfc 100644
--- a/Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml
+++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml
@@ -89,6 +89,7 @@ allOf:
                 - mediatek,mt6795-dpi
                 - mediatek,mt8173-dpi
                 - mediatek,mt8186-dpi
+                - mediatek,mt8195-dp-intf
     then:
       properties:
         power-domains: false
-- 
2.45.2



From macpaul.lin at mediatek.com  Tue Sep 24 03:31:54 2024
From: macpaul.lin at mediatek.com (Macpaul Lin)
Date: Tue, 24 Sep 2024 18:31:54 +0800
Subject: [PATCH 4/6] arm64: dts: mediatek: mt8395-genio-1200-evk: Fix dtbs_check error for phy
In-Reply-To: <20240924103156.13119-1-macpaul.lin@mediatek.com>
References: <20240924103156.13119-1-macpaul.lin@mediatek.com>
Message-ID: <20240924103156.13119-4-macpaul.lin@mediatek.com>

The ethernet-phy node in mt8395-genio-1200-evk.dts was triggering a
dtbs_check error. The error message was:
  eth-phy0 at 1: $nodename:0: 'eth-phy0 at 1' does not match
              '^ethernet-phy(@[a-f0-9]+)?$'
Fix this issue by replacing 'eth-phy' node to generic 'ethernet-phy'.

Fixes: f2b543a191b6 ("arm64: dts: mediatek: add device-tree for Genio 1200 EVK board")
Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
---
 arch/arm64/boot/dts/mediatek/mt8395-genio-1200-evk.dts | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/arm64/boot/dts/mediatek/mt8395-genio-1200-evk.dts b/arch/arm64/boot/dts/mediatek/mt8395-genio-1200-evk.dts
index 1ef6262b65c9..b4b48eb93f3c 100644
--- a/arch/arm64/boot/dts/mediatek/mt8395-genio-1200-evk.dts
+++ b/arch/arm64/boot/dts/mediatek/mt8395-genio-1200-evk.dts
@@ -187,7 +187,7 @@ mdio {
 		compatible = "snps,dwmac-mdio";
 		#address-cells = <1>;
 		#size-cells = <0>;
-		eth_phy0: eth-phy0 at 1 {
+		eth_phy0: ethernet-phy at 1 {
 			compatible = "ethernet-phy-id001c.c916";
 			reg = <0x1>;
 		};
-- 
2.45.2



From macpaul.lin at mediatek.com  Tue Sep 24 03:31:51 2024
From: macpaul.lin at mediatek.com (Macpaul Lin)
Date: Tue, 24 Sep 2024 18:31:51 +0800
Subject: [PATCH 1/6] arm64: dts: mt8195: Fix dtbs_check error for infracfg_ao node
Message-ID: <20240924103156.13119-1-macpaul.lin@mediatek.com>

The infracfg_ao node in mt8195.dtsi was causing a dtbs_check error.
The error message was:

syscon at 10001000: compatible: ['mediatek,mt8195-infracfg_ao', 'syscon',
                 'simple-mfd'] is too long

To resolve this, remove 'simple-mfd' from the 'compatible' property of the
infracfg_ao node.

Fixes: 37f2582883be ("arm64: dts: Add mediatek SoC mt8195 and evaluation board")
Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
---
 arch/arm64/boot/dts/mediatek/mt8195.dtsi | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/arm64/boot/dts/mediatek/mt8195.dtsi b/arch/arm64/boot/dts/mediatek/mt8195.dtsi
index e89ba384c4aa..2e1b41359b43 100644
--- a/arch/arm64/boot/dts/mediatek/mt8195.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8195.dtsi
@@ -487,7 +487,7 @@ topckgen: syscon at 10000000 {
 		};
 
 		infracfg_ao: syscon at 10001000 {
-			compatible = "mediatek,mt8195-infracfg_ao", "syscon", "simple-mfd";
+			compatible = "mediatek,mt8195-infracfg_ao", "syscon";
 			reg = <0 0x10001000 0 0x1000>;
 			#clock-cells = <1>;
 			#reset-cells = <1>;
-- 
2.45.2



From angelogioacchino.delregno at collabora.com  Tue Sep 24 04:37:32 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Tue, 24 Sep 2024 13:37:32 +0200
Subject: [PATCH 1/6] arm64: dts: mt8195: Fix dtbs_check error for
 infracfg_ao node
In-Reply-To: <20240924103156.13119-1-macpaul.lin@mediatek.com>
References: <20240924103156.13119-1-macpaul.lin@mediatek.com>
Message-ID: <459b17d4-439d-4f09-aa0e-f18f9cc184b3@collabora.com>

Il 24/09/24 12:31, Macpaul Lin ha scritto:
> The infracfg_ao node in mt8195.dtsi was causing a dtbs_check error.
> The error message was:
> 
> syscon at 10001000: compatible: ['mediatek,mt8195-infracfg_ao', 'syscon',
>                   'simple-mfd'] is too long
> 
> To resolve this, remove 'simple-mfd' from the 'compatible' property of the
> infracfg_ao node.
> 
> Fixes: 37f2582883be ("arm64: dts: Add mediatek SoC mt8195 and evaluation board")
> Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>




From angelogioacchino.delregno at collabora.com  Tue Sep 24 04:37:53 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Tue, 24 Sep 2024 13:37:53 +0200
Subject: [PATCH v3] arm64: dts: mediatek: mt8186: add FHCTL node
In-Reply-To: <20240924101559.879167-1-max_weng@compal.corp-partner.google.com>
References: <20240924101559.879167-1-max_weng@compal.corp-partner.google.com>
Message-ID: <2a74df47-c393-4a3c-bbc0-332c716c9a81@collabora.com>

Il 24/09/24 12:15, Max Weng ha scritto:
> From: max_weng <max_weng at compal.corp-partner.google.com>
> 
> add FHCTL device node for Frequency Hopping and Spread Spectrum clock function.
> 
> Signed-off-by: Max Weng <max_weng at compal.corp-partner.google.com>

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>




From angelogioacchino.delregno at collabora.com  Tue Sep 24 04:42:01 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Tue, 24 Sep 2024 13:42:01 +0200
Subject: [PATCH 3/6] dt-bindings: display: mediatek: Fix clocks count
 constraint for new SoCs
In-Reply-To: <20240924103156.13119-3-macpaul.lin@mediatek.com>
References: <20240924103156.13119-1-macpaul.lin@mediatek.com>
 <20240924103156.13119-3-macpaul.lin@mediatek.com>
Message-ID: <ffc1900b-3921-48ca-a2b2-1b798c57e572@collabora.com>

Il 24/09/24 12:31, Macpaul Lin ha scritto:
> The display node in mt8195.dtsi was triggering a CHECK_DTBS error due
> to an excessively long 'clocks' property:
>    display at 14f06000: clocks: [[31, 14], [31, 43], [31, 44]] is too long
> 
> To resolve this issue, add "maxItems: 3" to the 'clocks' property in
> the DT schema.
> 
> Fixes: 4ed545e7d100 ("dt-bindings: display: mediatek: disp: split each block to individual yaml")
> Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
> ---
>   .../devicetree/bindings/display/mediatek/mediatek,split.yaml     | 1 +
>   1 file changed, 1 insertion(+)
> 
> diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,split.yaml b/Documentation/devicetree/bindings/display/mediatek/mediatek,split.yaml
> index e4affc854f3d..42d2d483cc29 100644
> --- a/Documentation/devicetree/bindings/display/mediatek/mediatek,split.yaml
> +++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,split.yaml
> @@ -57,6 +57,7 @@ properties:
>     clocks:
>       items:
>         - description: SPLIT Clock

That's at least confusing (granted that it works) - either add a description for
each clock and then set `minItems: 1` (preferred), or remove this "SPLIT Clock"
description and allow a maximum of 3 clocks.

Removing the description can be done - IMO - because "SPLIT Clock" is, well,
saying that the SPLIT block gets a SPLIT clock ... stating the obvious, anyway.

Cheers,
Angelo

> +    maxItems: 3
>   
>   required:
>     - compatible



From angelogioacchino.delregno at collabora.com  Tue Sep 24 04:42:27 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Tue, 24 Sep 2024 13:42:27 +0200
Subject: [PATCH 4/6] arm64: dts: mediatek: mt8395-genio-1200-evk: Fix
 dtbs_check error for phy
In-Reply-To: <20240924103156.13119-4-macpaul.lin@mediatek.com>
References: <20240924103156.13119-1-macpaul.lin@mediatek.com>
 <20240924103156.13119-4-macpaul.lin@mediatek.com>
Message-ID: <04280899-ceec-4083-8f94-0fe8535961d1@collabora.com>

Il 24/09/24 12:31, Macpaul Lin ha scritto:
> The ethernet-phy node in mt8395-genio-1200-evk.dts was triggering a
> dtbs_check error. The error message was:
>    eth-phy0 at 1: $nodename:0: 'eth-phy0 at 1' does not match
>                '^ethernet-phy(@[a-f0-9]+)?$'
> Fix this issue by replacing 'eth-phy' node to generic 'ethernet-phy'.
> 
> Fixes: f2b543a191b6 ("arm64: dts: mediatek: add device-tree for Genio 1200 EVK board")
> Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>




From angelogioacchino.delregno at collabora.com  Tue Sep 24 04:43:13 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Tue, 24 Sep 2024 13:43:13 +0200
Subject: [PATCH 5/6] arm64: dts: mt8195: Fix dtbs_check error for mutex
 node
In-Reply-To: <20240924103156.13119-5-macpaul.lin@mediatek.com>
References: <20240924103156.13119-1-macpaul.lin@mediatek.com>
 <20240924103156.13119-5-macpaul.lin@mediatek.com>
Message-ID: <0b573e20-e08b-42e3-bc45-7db07fc6cf57@collabora.com>

Il 24/09/24 12:31, Macpaul Lin ha scritto:
> The mutex node in mt8195.dtsi was triggering a dtbs_check error:
>    mutex at 1c101000: 'clock-names', 'reg-names' do not match any of the
>                    regexes: 'pinctrl-[0-9]+'
> 
> This seems no need by inspecting the DT schemas and other reference boards,
> so drop 'clock-names' and 'reg-names' in mt8195.dtsi.
> 
> Fixes: 92d2c23dc269 ("arm64: dts: mt8195: add display node for vdosys1")
> Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>




From geert at linux-m68k.org  Tue Sep 24 04:44:05 2024
From: geert at linux-m68k.org (Geert Uytterhoeven)
Date: Tue, 24 Sep 2024 13:44:05 +0200
Subject: [PATCH v8 1/5] ASoC: codecs: add MT6357 support
In-Reply-To: <20240226-audio-i350-v8-1-e80a57d026ce@baylibre.com>
References: <20240226-audio-i350-v8-0-e80a57d026ce@baylibre.com> <20240226-audio-i350-v8-1-e80a57d026ce@baylibre.com>
Message-ID: <CAMuHMdXtm+jGbbLXnCjPZZu_ZwpR-tCRuwbz0iQxUPkXG=g09A@mail.gmail.com>

Hi Alexandre,

On Thu, Sep 5, 2024 at 11:08?AM <amergnat at baylibre.com> wrote:
> From: Nicolas Belin <nbelin at baylibre.com>
>
> Add the support of MT6357 PMIC audio codec.
>
> Signed-off-by: Nicolas Belin <nbelin at baylibre.com>
> Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
> Signed-off-by: Alexandre Mergnat <amergnat at baylibre.com>

Thanks for your patch, which is now commit 5e2404493f9f6028 ("ASoC:
codecs: add MT6357 support").

> --- a/sound/soc/codecs/Kconfig
> +++ b/sound/soc/codecs/Kconfig
> @@ -2501,6 +2502,12 @@ config SND_SOC_ML26124
>  config SND_SOC_MT6351
>         tristate "MediaTek MT6351 Codec"
>
> +config SND_SOC_MT6357
> +       tristate "MediaTek MT6357 Codec"

Does this need dependencies?  The driver uses regmap, but it's not
immediately clear to me what is the backend (SPI?).

SND_SOC_MT6357 is selected by SND_SOC_MT8365_MT6357 in the next patch,
but I guess there can be other users, so making the SND_SOC_MT6357
symbol invisible ("tristate ... if COMPILE_TEST") is not an option?

Similar comments for the pre-existing SND_SOC_MT635[189] symbols,
but at least SND_SOC_MT6359 depends on MTK_PMIC_WRAP.

> +       help
> +         Enable support for the platform which uses MT6357 as
> +         external codec device.
> +
>  config SND_SOC_MT6358
>         tristate "MediaTek MT6358 Codec"
>         help

Gr{oetje,eeting}s,

                        Geert

-- 
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert at linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
                                -- Linus Torvalds


From angelogioacchino.delregno at collabora.com  Tue Sep 24 04:48:18 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Tue, 24 Sep 2024 13:48:18 +0200
Subject: [PATCH 6/6] dt-bindings: display: mediatek: dpi: Add mt8195
 support in power domains
In-Reply-To: <20240924103156.13119-6-macpaul.lin@mediatek.com>
References: <20240924103156.13119-1-macpaul.lin@mediatek.com>
 <20240924103156.13119-6-macpaul.lin@mediatek.com>
Message-ID: <ed0c25ba-2816-4d4b-9023-2e07976f4341@collabora.com>

Il 24/09/24 12:31, Macpaul Lin ha scritto:
> Add power domain binding to the mediatek DPI controller for MT8185.
> 
> The dpi node in mt8195.dtsi was triggering a dtbs_check error:
>    dp-intf at 1c113000: power-domains: False schema does not allow [[44, 18]]
> 
> Fixes: 5474d49b2f79 ("dt-bindings: display: mediatek: dpi: Add power domains")
> Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
> ---
>   .../devicetree/bindings/display/mediatek/mediatek,dpi.yaml       | 1 +
>   1 file changed, 1 insertion(+)
> 
> diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml b/Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml
> index 3a82aec9021c..07acc8a76bfc 100644
> --- a/Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml
> +++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml
> @@ -89,6 +89,7 @@ allOf:
>                   - mediatek,mt6795-dpi
>                   - mediatek,mt8173-dpi
>                   - mediatek,mt8186-dpi
> +                - mediatek,mt8195-dp-intf

The dp_intf1 block has a power domain (VDOSYS1)... so that will break the check
for the other one.

Besides, I'm fairly sure that the right fix is to actually add the missing VDOSYS0
power domain to dp_intf0 instead, as that block is indeed in VDO0.

So.. for this patch: nak.

Cheers,
Angelo

>       then:
>         properties:
>           power-domains: false




From broonie at kernel.org  Tue Sep 24 05:05:59 2024
From: broonie at kernel.org (Mark Brown)
Date: Tue, 24 Sep 2024 14:05:59 +0200
Subject: [PATCH v8 1/5] ASoC: codecs: add MT6357 support
In-Reply-To: <CAMuHMdXtm+jGbbLXnCjPZZu_ZwpR-tCRuwbz0iQxUPkXG=g09A@mail.gmail.com>
References: <20240226-audio-i350-v8-0-e80a57d026ce@baylibre.com>
 <20240226-audio-i350-v8-1-e80a57d026ce@baylibre.com>
 <CAMuHMdXtm+jGbbLXnCjPZZu_ZwpR-tCRuwbz0iQxUPkXG=g09A@mail.gmail.com>
Message-ID: <ZvKrJx0sMXIxCfBZ@finisterre.sirena.org.uk>

On Tue, Sep 24, 2024 at 01:44:05PM +0200, Geert Uytterhoeven wrote:
> On Thu, Sep 5, 2024 at 11:08?AM <amergnat at baylibre.com> wrote:

> > +config SND_SOC_MT6357
> > +       tristate "MediaTek MT6357 Codec"

> Does this need dependencies?  The driver uses regmap, but it's not
> immediately clear to me what is the backend (SPI?).

It's a MFD so it'll be whatever the MFD for the device is.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-mediatek/attachments/20240924/994dd301/attachment.sig>

From manivannan.sadhasivam at linaro.org  Tue Sep 24 07:36:34 2024
From: manivannan.sadhasivam at linaro.org (Manivannan Sadhasivam)
Date: Tue, 24 Sep 2024 16:36:34 +0200
Subject: [PATCH 0/4] Provide devm_clk_bulk_get_all_enabled() helper
In-Reply-To: <20240914-clk_bulk_ena_fix-v1-0-ce3537585c06@collabora.com>
References: <20240914-clk_bulk_ena_fix-v1-0-ce3537585c06@collabora.com>
Message-ID: <20240924143634.pqpdsewoqxn3liqi@thinkpad>

On Sat, Sep 14, 2024 at 09:04:53PM +0300, Cristian Ciocaltea wrote:
> Commit 265b07df758a ("clk: Provide managed helper to get and enable bulk
> clocks") added devm_clk_bulk_get_all_enable() function, but missed to
> return the number of clocks stored in the clk_bulk_data table referenced
> by the clks argument.
> 
> That is required in case there is a need to iterate these clocks later,
> therefore I couldn't see any use case of this parameter and should have
> been simply removed from the function declaration.
> 

Is there an user that currerntly does this?

- Mani

> The first patch in the series provides devm_clk_bulk_get_all_enabled()
> variant, which is consistent with devm_clk_bulk_get_all() in terms of
> the returned value:
> 
>  > 0 if one or more clocks have been stored
>  = 0 if there are no clocks
>  < 0 if an error occurred
> 
> Moreover, the naming is consistent with devm_clk_get_enabled(), i.e. use
> the past form of 'enable'.
> 
> The next two patches switch existing users of devm_clk_get_enable() to
> the new helper - there were only two, as of next-20240913.
> 
> The last patch drops the now obsolete devm_clk_bulk_get_all_enable()
> helper.
> 
> Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea at collabora.com>
> ---
> Cristian Ciocaltea (4):
>       clk: Provide devm_clk_bulk_get_all_enabled() helper
>       soc: mediatek: pwrap: Switch to devm_clk_bulk_get_all_enabled()
>       PCI: exynos: Switch to devm_clk_bulk_get_all_enabled()
>       clk: Drop obsolete devm_clk_bulk_get_all_enable() helper
> 
>  drivers/clk/clk-devres.c                | 30 ++++++++++++++++--------------
>  drivers/pci/controller/dwc/pci-exynos.c |  2 +-
>  drivers/soc/mediatek/mtk-pmic-wrap.c    |  4 ++--
>  include/linux/clk.h                     | 12 +++++++-----
>  4 files changed, 26 insertions(+), 22 deletions(-)
> ---
> base-commit: 5acd9952f95fb4b7da6d09a3be39195a80845eb6
> change-id: 20240912-clk_bulk_ena_fix-16ba77358ddf
> 

-- 
????????? ????????


From conor at kernel.org  Tue Sep 24 09:00:34 2024
From: conor at kernel.org (Conor Dooley)
Date: Tue, 24 Sep 2024 17:00:34 +0100
Subject: [PATCH 3/6] dt-bindings: display: mediatek: Fix clocks count
 constraint for new SoCs
In-Reply-To: <ffc1900b-3921-48ca-a2b2-1b798c57e572@collabora.com>
References: <20240924103156.13119-1-macpaul.lin@mediatek.com>
 <20240924103156.13119-3-macpaul.lin@mediatek.com>
 <ffc1900b-3921-48ca-a2b2-1b798c57e572@collabora.com>
Message-ID: <20240924-commute-collision-13ad39717d31@spud>

On Tue, Sep 24, 2024 at 01:42:01PM +0200, AngeloGioacchino Del Regno wrote:
> Il 24/09/24 12:31, Macpaul Lin ha scritto:
> > The display node in mt8195.dtsi was triggering a CHECK_DTBS error due
> > to an excessively long 'clocks' property:
> >    display at 14f06000: clocks: [[31, 14], [31, 43], [31, 44]] is too long
> > 
> > To resolve this issue, add "maxItems: 3" to the 'clocks' property in
> > the DT schema.
> > 
> > Fixes: 4ed545e7d100 ("dt-bindings: display: mediatek: disp: split each block to individual yaml")
> > Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
> > ---
> >   .../devicetree/bindings/display/mediatek/mediatek,split.yaml     | 1 +
> >   1 file changed, 1 insertion(+)
> > 
> > diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,split.yaml b/Documentation/devicetree/bindings/display/mediatek/mediatek,split.yaml
> > index e4affc854f3d..42d2d483cc29 100644
> > --- a/Documentation/devicetree/bindings/display/mediatek/mediatek,split.yaml
> > +++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,split.yaml
> > @@ -57,6 +57,7 @@ properties:
> >     clocks:
> >       items:
> >         - description: SPLIT Clock
> 
> That's at least confusing (granted that it works) - either add a description for
> each clock and then set `minItems: 1` (preferred), or remove this "SPLIT Clock"
> description and allow a maximum of 3 clocks.
> 
> Removing the description can be done - IMO - because "SPLIT Clock" is, well,
> saying that the SPLIT block gets a SPLIT clock ... stating the obvious, anyway.

Right, but what are the other two new clocks? Are they as obvious?
There's no clock-names here to give any more information as to what the
other clocks are supposed to be.

Kinda unrelated, but I think that "SPLIT Clock" probably isn't what the
name of the clock in the IP block is anyway, sounds more like the name
for it on the provider end..
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 228 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-mediatek/attachments/20240924/042423d7/attachment-0001.sig>

From conor at kernel.org  Tue Sep 24 09:02:53 2024
From: conor at kernel.org (Conor Dooley)
Date: Tue, 24 Sep 2024 17:02:53 +0100
Subject: [PATCH 2/6] dt-bindings: iommu: mediatek: Fix interrupt count
 constraint for new SoCs
In-Reply-To: <20240924103156.13119-2-macpaul.lin@mediatek.com>
References: <20240924103156.13119-1-macpaul.lin@mediatek.com>
 <20240924103156.13119-2-macpaul.lin@mediatek.com>
Message-ID: <20240924-haiku-drudge-79e5824d4b6f@spud>

On Tue, Sep 24, 2024 at 06:31:52PM +0800, Macpaul Lin wrote:
> The infra-iommu node in mt8195.dtsi was triggering a CHECK_DTBS error due
> to an excessively long 'interrupts' property. The error message was:
> 
>   infra-iommu at 10315000: interrupts: [[0, 795, 4, 0], [0, 796, 4, 0],
>                      [0, 797, 4, 0], [0, 798, 4, 0], [0, 799, 4, 0]]
>                      is too long
> 
> To address this issue, add "minItems: 1" and "maxItems: 5" constraints to
> the 'interrupts' property in the DT binding schema. This change allows for
> flexibility in the number of interrupts for new SoCs
> 
> Fixes: bca28426805d ("dt-bindings: iommu: mediatek: Convert IOMMU to DT schema")
> 

This space should be removed.

> Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
> ---
>  Documentation/devicetree/bindings/iommu/mediatek,iommu.yaml | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
> 
> diff --git a/Documentation/devicetree/bindings/iommu/mediatek,iommu.yaml b/Documentation/devicetree/bindings/iommu/mediatek,iommu.yaml
> index ea6b0f5f24de..a00f1f0045b1 100644
> --- a/Documentation/devicetree/bindings/iommu/mediatek,iommu.yaml
> +++ b/Documentation/devicetree/bindings/iommu/mediatek,iommu.yaml
> @@ -96,7 +96,8 @@ properties:
>      maxItems: 1
>  
>    interrupts:
> -    maxItems: 1
> +    minItems: 1
> +    maxItems: 5

You need to add an items list here, and probably some per compatible
constraints. What are each of the itnerrupts for?

>  
>    clocks:
>      items:
> -- 
> 2.45.2
> 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 228 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-mediatek/attachments/20240924/46dc88d8/attachment.sig>

From Markus.Elfring at web.de  Tue Sep 24 11:08:15 2024
From: Markus.Elfring at web.de (Markus Elfring)
Date: Tue, 24 Sep 2024 20:08:15 +0200
Subject: [PATCH] soc: mediatek: mtk-svs: Call of_node_put(np) only once in
 svs_get_subsys_device()
Message-ID: <884f0a5d-e6d3-47dc-8a9e-201bb86b271f@web.de>

From: Markus Elfring <elfring at users.sourceforge.net>
Date: Tue, 24 Sep 2024 20:00:09 +0200

An of_node_put(np) call was immediately used after a pointer check
for a of_find_device_by_node() call in this function implementation.
Thus call such a function only once instead directly before the check.

This issue was transformed by using the Coccinelle software.

Signed-off-by: Markus Elfring <elfring at users.sourceforge.net>
---
 drivers/soc/mediatek/mtk-svs.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/drivers/soc/mediatek/mtk-svs.c b/drivers/soc/mediatek/mtk-svs.c
index 9a91298c1253..7c349a94b45c 100644
--- a/drivers/soc/mediatek/mtk-svs.c
+++ b/drivers/soc/mediatek/mtk-svs.c
@@ -2133,14 +2133,12 @@ static struct device *svs_get_subsys_device(struct svs_platform *svsp,
 	}

 	pdev = of_find_device_by_node(np);
+	of_node_put(np);
 	if (!pdev) {
-		of_node_put(np);
 		dev_err(svsp->dev, "cannot find pdev by %s\n", node_name);
 		return ERR_PTR(-ENXIO);
 	}

-	of_node_put(np);
-
 	return &pdev->dev;
 }

--
2.46.1



From afd at ti.com  Tue Sep 24 11:13:18 2024
From: afd at ti.com (Andrew Davis)
Date: Tue, 24 Sep 2024 13:13:18 -0500
Subject: [RFC PATCH 0/4] Linaro restricted heap
In-Reply-To: <dhxvyshwi4qmcmwceokhqey2ww4azjcs6qrpnkgivdj7tv5cke@r36srvvbof6q>
References: <20240830070351.2855919-1-jens.wiklander@linaro.org>
 <dhxvyshwi4qmcmwceokhqey2ww4azjcs6qrpnkgivdj7tv5cke@r36srvvbof6q>
Message-ID: <d8e0cb78-7cfb-42bf-b3a5-f765592e8dd4@ti.com>

On 9/23/24 1:33 AM, Dmitry Baryshkov wrote:
> Hi,
> 
> On Fri, Aug 30, 2024 at 09:03:47AM GMT, Jens Wiklander wrote:
>> Hi,
>>
>> This patch set is based on top of Yong Wu's restricted heap patch set [1].
>> It's also a continuation on Olivier's Add dma-buf secure-heap patch set [2].
>>
>> The Linaro restricted heap uses genalloc in the kernel to manage the heap
>> carvout. This is a difference from the Mediatek restricted heap which
>> relies on the secure world to manage the carveout.
>>
>> I've tried to adress the comments on [2], but [1] introduces changes so I'm
>> afraid I've had to skip some comments.
> 
> I know I have raised the same question during LPC (in connection to
> Qualcomm's dma-heap implementation). Is there any reason why we are
> using generic heaps instead of allocating the dma-bufs on the device
> side?
> 
> In your case you already have TEE device, you can use it to allocate and
> export dma-bufs, which then get imported by the V4L and DRM drivers.
> 

This goes to the heart of why we have dma-heaps in the first place.
We don't want to burden userspace with having to figure out the right
place to get a dma-buf for a given use-case on a given hardware.
That would be very non-portable, and fail at the core purpose of
a kernel: to abstract hardware specifics away.

Worse, the actual interface for dma-buf exporting changes from
framework to framework (getting a dma-buf from DRM is different
than V4L, and there would be yet another API for TEE, etc..)

Most subsystem don't need an allocator, they work just fine
simply being only dma-bufs importers. Recent example being the
IIO subsystem[0], for which some early posting included an
allocator, but in the end, all that was needed was to consume
buffers.

For devices that don't actually contain memory there is no
reason to be an exporter. What most want is just to consume
normal system memory. Or system memory with some constraints
(e.g. contiguous, coherent, restricted, etc..).

> I have a feeling (I might be completely wrong here) that by using
> generic dma-buf heaps we can easily end up in a situation when the
> userspace depends heavily on the actual platform being used (to map the
> platform to heap names). I think we should instead depend on the
> existing devices (e.g. if there is a TEE device, use an IOCTL to
> allocate secured DMA BUF from it, otherwise check for QTEE device,
> otherwise check for some other vendor device).
> 
> The mental experiment to check if the API is correct is really simple:
> Can you use exactly the same rootfs on several devices without
> any additional tuning (e.g. your QEMU, HiKey, a Mediatek board, Qualcomm
> laptop, etc)?
> 

This is a great north star to follow. And exactly the reason we should
*not* be exposing device specific constraints to userspace. The constrains
change based on the platform. So a userspace would have to also pick
a different set of constraints based on each platform.

Userspace knows which subsystems it will attach a buffer, and the
kernel knows what constraints those devices have on a given platform.
Ideal case is then allocate from the one exporter, attach to various
devices, and have the constraints solved at map time by the exporter
based on the set of attached devices.

For example, on one platform the display needs contiguous buffers,
but on a different platform the display can scatter-gather. So
what heap should our generic application allocate from when it
wants a buffer consumable by the display, CMA or System?
Answer *should* be always use the generic exporter, and that
exporter then picks the right backing type based on the platform.

Userspace shouldn't be dealing with any of these constraints
(looking back, adding the CMA heap was probably incorrect,
and the System heap should have been the only one. Idea back
then was a userspace helper would show up to do the constraint
solving and pick the right heap. That has yet to materialize and
folks are still just hardcoding which heap to use..).

Same for this restricted heap, I'd like to explore if we can
enhance the System heap such that when attached to the TEE framework,
the backing memory is either made restricted by fire-walling,
or allocating from a TEE carveout (based on platform).

This will mean more inter-subsystem coordination, but we can
iterate on these in kernel interfaces. We cannot iterate on
userspace interfaces, those have to be correct the first time.

Andrew

[0] https://www.kernel.org/doc/html/next/iio/iio_dmabuf_api.html

>>
>> This can be tested on QEMU with the following steps:
>> repo init -u https://github.com/jenswi-linaro/manifest.git -m qemu_v8.xml \
>>          -b prototype/sdp-v1
>> repo sync -j8
>> cd build
>> make toolchains -j4
>> make all -j$(nproc)
>> make run-only
>> # login and at the prompt:
>> xtest --sdp-basic
>>
>> https://optee.readthedocs.io/en/latest/building/prerequisites.html
>> list dependencies needed to build the above.
>>
>> The tests are pretty basic, mostly checking that a Trusted Application in
>> the secure world can access and manipulate the memory.
> 
> - Can we test that the system doesn't crash badly if user provides
>    non-secured memory to the users which expect a secure buffer?
> 
> - At the same time corresponding entities shouldn't decode data to the
>    buffers accessible to the rest of the sytem.
> 
>>
>> Cheers,
>> Jens
>>
>> [1] https://lore.kernel.org/dri-devel/20240515112308.10171-1-yong.wu at mediatek.com/
>> [2] https://lore.kernel.org/lkml/20220805135330.970-1-olivier.masse at nxp.com/
>>
>> Changes since Olivier's post [2]:
>> * Based on Yong Wu's post [1] where much of dma-buf handling is done in
>>    the generic restricted heap
>> * Simplifications and cleanup
>> * New commit message for "dma-buf: heaps: add Linaro restricted dmabuf heap
>>    support"
>> * Replaced the word "secure" with "restricted" where applicable
>>
>> Etienne Carriere (1):
>>    tee: new ioctl to a register tee_shm from a dmabuf file descriptor
>>
>> Jens Wiklander (2):
>>    dma-buf: heaps: restricted_heap: add no_map attribute
>>    dma-buf: heaps: add Linaro restricted dmabuf heap support
>>
>> Olivier Masse (1):
>>    dt-bindings: reserved-memory: add linaro,restricted-heap
>>
>>   .../linaro,restricted-heap.yaml               |  56 ++++++
>>   drivers/dma-buf/heaps/Kconfig                 |  10 ++
>>   drivers/dma-buf/heaps/Makefile                |   1 +
>>   drivers/dma-buf/heaps/restricted_heap.c       |  17 +-
>>   drivers/dma-buf/heaps/restricted_heap.h       |   2 +
>>   .../dma-buf/heaps/restricted_heap_linaro.c    | 165 ++++++++++++++++++
>>   drivers/tee/tee_core.c                        |  38 ++++
>>   drivers/tee/tee_shm.c                         | 104 ++++++++++-
>>   include/linux/tee_drv.h                       |  11 ++
>>   include/uapi/linux/tee.h                      |  29 +++
>>   10 files changed, 426 insertions(+), 7 deletions(-)
>>   create mode 100644 Documentation/devicetree/bindings/reserved-memory/linaro,restricted-heap.yaml
>>   create mode 100644 drivers/dma-buf/heaps/restricted_heap_linaro.c
>>
>> -- 
>> 2.34.1
>>
> 


From Markus.Elfring at web.de  Tue Sep 24 11:56:08 2024
From: Markus.Elfring at web.de (Markus Elfring)
Date: Tue, 24 Sep 2024 20:56:08 +0200
Subject: [PATCH] spi: slave-mt27xx: Call clk_disable_unprepare() only once in
 mtk_spi_slave_probe()
Message-ID: <9e736d33-b07f-40a0-8fb6-8c3212593b77@web.de>

From: Markus Elfring <elfring at users.sourceforge.net>
Date: Tue, 24 Sep 2024 20:47:29 +0200

A clk_disable_unprepare(mdata->spi_clk) call was immediately used
after a return value check for a devm_spi_register_controller() call
in this function implementation.
Thus call such a function only once instead directly before the check.

This issue was transformed by using the Coccinelle software.

Signed-off-by: Markus Elfring <elfring at users.sourceforge.net>
---
 drivers/spi/spi-slave-mt27xx.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/drivers/spi/spi-slave-mt27xx.c b/drivers/spi/spi-slave-mt27xx.c
index 4a91b7bae3c6..40e1e7de0742 100644
--- a/drivers/spi/spi-slave-mt27xx.c
+++ b/drivers/spi/spi-slave-mt27xx.c
@@ -455,15 +455,13 @@ static int mtk_spi_slave_probe(struct platform_device *pdev)
 	pm_runtime_enable(&pdev->dev);

 	ret = devm_spi_register_controller(&pdev->dev, ctlr);
+	clk_disable_unprepare(mdata->spi_clk);
 	if (ret) {
 		dev_err(&pdev->dev,
 			"failed to register slave controller(%d)\n", ret);
-		clk_disable_unprepare(mdata->spi_clk);
 		goto err_disable_runtime_pm;
 	}

-	clk_disable_unprepare(mdata->spi_clk);
-
 	return 0;

 err_disable_runtime_pm:
--
2.46.1



From bvanassche at acm.org  Tue Sep 24 12:36:45 2024
From: bvanassche at acm.org (Bart Van Assche)
Date: Tue, 24 Sep 2024 12:36:45 -0700
Subject: [PATCH v8 3/3] ufs: core: add a quirk for MediaTek SDB mode
 aborted
In-Reply-To: <e0cb5defb8894ea8fb058c617e9de3d3cfa9763f.camel@mediatek.com>
References: <20240923080344.19084-1-peter.wang@mediatek.com>
 <20240923080344.19084-4-peter.wang@mediatek.com>
 <ce42d310-2a23-453f-bd14-71eeaf9f5664@acm.org>
 <e0cb5defb8894ea8fb058c617e9de3d3cfa9763f.camel@mediatek.com>
Message-ID: <fb02d4c2-bb0b-4d26-8d6c-f76f309679a1@acm.org>

On 9/24/24 1:51 AM, Peter Wang (???) wrote:
> Is there any corner case that I might have overlooked?

Maybe I misunderstood how MediaTek controllers work. Anyway, if a
MediaTek controller reports the completion status OCS_ABORTED, is
there any chance that this status will be reported after
ufshcd_release_scsi_cmd() has been called? Is there any chance that
the controller writing OCS_ABORTED into the status field will race
with the host software overwriting that status field while submitting
a new command?

Thanks,

Bart.



From lorenzo at kernel.org  Tue Sep 24 14:22:28 2024
From: lorenzo at kernel.org (Lorenzo Bianconi)
Date: Tue, 24 Sep 2024 23:22:28 +0200
Subject: [PATCH v4 4/5] pinctrl: airoha: Add support for EN7581 SoC
In-Reply-To: <ZvKQe73ZKIFy4fny@lore-desk>
References: <20240911-en7581-pinctrl-v4-0-60ac93d760bb@kernel.org>
 <20240911-en7581-pinctrl-v4-4-60ac93d760bb@kernel.org>
 <CACRpkdZbyQ5bk8oR+Q4UmQCdM5h1mF1ztBc26YzqNsze_B=ehA@mail.gmail.com>
 <ZvKQe73ZKIFy4fny@lore-desk>
Message-ID: <ZvMtlJN1xAMHoW-E@lore-desk>

[...]
> 
> I am fine to switch to regmap but I guess we need to enable fast_io
> since it can run even in interrupt context. Btw, I figured out even
> airoha_pinctrl_rmw needs to grab a spin_lock since we can exec a led
> trigger (like timer) where we run airoha_pinctrl_rmw in interrupt context
> (so it should be fine to use a single regmap for it).
> However, I guess we need to keep the spin_lock in airoha_pinctrl_gpiochip
> since we need to grab it in airoha_pinctrl_gpio_irq_unmask() and
> airoha_pinctrl_gpio_irq_type() (we access irq_type array there).
> A possible solution would be to keep the local spin_lock and set
> disable_locking. What do you think? Do you prefer to switch to regmap or
> keep the current implementation using 'guard(spinlock_irqsave)' instead?

I reworked the code using regmap APIs and setting disable_locking flag
in order to keep the spinlock local (I switch to guard(spinlock) as
well). Thx for pointing this out, the code is simpler and more readable,
I will add it in v5.

> 
> > 
> > > +static int airoha_pinctrl_get_gpio_from_pin(struct pinctrl_dev *pctrl_dev,
> > > +                                           int pin)
> > > +{
> > > +       struct pinctrl_gpio_range *range;
> > > +       int gpio;
> > > +
> > > +       range = pinctrl_find_gpio_range_from_pin_nolock(pctrl_dev, pin);
> > > +       if (!range)
> > > +               return -EINVAL;
> > > +
> > > +       gpio = pin - range->pin_base;
> > > +       if (gpio < 0)
> > > +               return -EINVAL;
> > > +
> > > +       return gpio;
> > > +}
> > 
> > This function is just used here:
> 
> it is used in airoha_pinconf_get()/airoha_pinconf_set()
> 
> > 

[...]

> > > +       case PIN_CONFIG_OUTPUT_ENABLE:
> > > +       case PIN_CONFIG_INPUT_ENABLE: {
> > > +               int gpio = airoha_pinctrl_get_gpio_from_pin(pctrl_dev, pin);
> > > +
> > > +               if (gpio < 0)
> > > +                       return gpio;
> > > +
> > > +               arg = airoha_pinctrl_gpio_get_direction(pinctrl, gpio);
> > 
> > I don't see why a pin would have to exist in a GPIO range in order to
> > be set as output or input?
> > 
> > Can't you just set up the pin as requested and not care whether
> > it has a corresponding GPIO range?
> > 
> > Is it over-reuse of the GPIO code? I'd say just set up the pin instead.
> 
> Do you mean to get rid of PIN_CONFIG_OUTPUT_ENABLE, PIN_CONFIG_INPUT_ENABLE
> (and even PIN_CONFIG_OUTPUT in airoha_pinconf_set()) here?
> E.g. we need PIN_CONFIG_OUTPUT_ENABLE to enable pwm for pwm-leds:
> 
> &mfd {
> 	...
> 	pio: pinctrl {
> 		...
> 		pwm_gpio18_idx10_pins: pwm-gpio18-idx10-pins {
> 			function = "pwm";
> 			pins = "gpio18";
> 			output-enable;
> 		};
> 	};
> };

I reworked the code here in order to not explicitly use gpio value in
airoha_pinconf_get/airoha_pinconf_set routines. However, we need to switch
from pin to gpio configuring data/direction/out hw registers since:
- not all pins can be used as gpio (actually we can configure just pins in the
  range [13, 59])
- data, dir and out hw register are indexed using gpio id and not pin one.
  (e.g BIT(0) in data[0] refers to GPIO0 and not to PIN0).

Regards,
Lorenzo

> 
> > 
> > > +static int airoha_pinconf_set(struct pinctrl_dev *pctrl_dev,
> > > +                             unsigned int pin, unsigned long *configs,
> > > +                             unsigned int num_configs)
> > > +{
> > > +       struct airoha_pinctrl *pinctrl = pinctrl_dev_get_drvdata(pctrl_dev);
> > > +       int i;
> > > +
> > > +       for (i = 0; i < num_configs; i++) {
> > > +               u32 param = pinconf_to_config_param(configs[i]);
> > > +               u32 arg = pinconf_to_config_argument(configs[i]);
> > > +
> > > +               switch (param) {
> > > +               case PIN_CONFIG_BIAS_DISABLE:
> > > +                       airoha_pinctrl_set_pulldown_conf(pinctrl, pin, 0);
> > > +                       airoha_pinctrl_set_pullup_conf(pinctrl, pin, 0);
> > > +                       break;
> > > +               case PIN_CONFIG_BIAS_PULL_UP:
> > > +                       airoha_pinctrl_set_pulldown_conf(pinctrl, pin, 0);
> > > +                       airoha_pinctrl_set_pullup_conf(pinctrl, pin, 1);
> > > +                       break;
> > > +               case PIN_CONFIG_BIAS_PULL_DOWN:
> > > +                       airoha_pinctrl_set_pulldown_conf(pinctrl, pin, 1);
> > > +                       airoha_pinctrl_set_pullup_conf(pinctrl, pin, 0);
> > > +                       break;
> > > +               case PIN_CONFIG_DRIVE_STRENGTH: {
> > > +                       u32 e2 = 0, e4 = 0;
> > > +
> > > +                       switch (arg) {
> > > +                       case MTK_DRIVE_2mA:
> > > +                               break;
> > > +                       case MTK_DRIVE_4mA:
> > > +                               e2 = 1;
> > > +                               break;
> > > +                       case MTK_DRIVE_6mA:
> > > +                               e4 = 1;
> > > +                               break;
> > > +                       case MTK_DRIVE_8mA:
> > > +                               e2 = 1;
> > > +                               e4 = 1;
> > > +                               break;
> > > +                       default:
> > > +                               return -EINVAL;
> > > +                       }
> > > +
> > > +                       airoha_pinctrl_set_drive_e2_conf(pinctrl, pin, e2);
> > > +                       airoha_pinctrl_set_drive_e4_conf(pinctrl, pin, e4);
> > > +                       break;
> > > +               }
> > > +               case PIN_CONFIG_DRIVE_OPEN_DRAIN:
> > > +                       airoha_pinctrl_set_pcie_rst_od_conf(pinctrl, pin, !!arg);
> > > +                       break;
> > > +               case PIN_CONFIG_OUTPUT_ENABLE:
> > > +               case PIN_CONFIG_INPUT_ENABLE:
> > > +               case PIN_CONFIG_OUTPUT: {
> > > +                       int gpio = airoha_pinctrl_get_gpio_from_pin(pctrl_dev, pin);
> > > +                       bool input = param == PIN_CONFIG_INPUT_ENABLE;
> > > +
> > > +                       if (gpio < 0)
> > > +                               return gpio;
> > > +
> > > +                       airoha_pinctrl_gpio_set_direction(pinctrl, gpio, input);
> > > +                       if (param == PIN_CONFIG_OUTPUT)
> > > +                               airoha_pinctrl_gpio_set_value(pinctrl, gpio, !!arg);
> > > +                       break;
> > 
> > Dito. No need to reuse the GPIO set direction function. Make a helper
> > that just work on the pin instead, and perhaps the GPIO set direction
> > can use that instead.
> 
> ack, I will fix it in v5.
> 
> > 
> > > +static int airoha_pinctrl_gpio_direction_output(struct gpio_chip *chip,
> > > +                                               unsigned int gpio, int value)
> > > +{
> > > +       int err;
> > > +
> > > +       err = pinctrl_gpio_direction_output(chip, gpio);
> > > +       if (err)
> > > +               return err;
> > > +
> > > +       airoha_pinctrl_gpio_set(chip, gpio, value);
> > 
> > Hm I get a bit confused by the similarly named helpers I guess...
> 
> Naming is always hard, I will try to improve :)
> 
> > 
> > > +static void airoha_pinctrl_gpio_irq_unmask(struct irq_data *data)
> > > +{
> > > +       u8 offset = data->hwirq % AIROHA_REG_GPIOCTRL_NUM_GPIO;
> > > +       u8 index = data->hwirq / AIROHA_REG_GPIOCTRL_NUM_GPIO;
> > > +       u32 mask = GENMASK(2 * offset + 1, 2 * offset);
> > > +       struct airoha_pinctrl_gpiochip *gpiochip;
> > > +       u32 val = BIT(2 * offset);
> > > +       unsigned long flags;
> > > +
> > > +       gpiochip = irq_data_get_irq_chip_data(data);
> > > +       if (WARN_ON_ONCE(data->hwirq >= ARRAY_SIZE(gpiochip->irq_type)))
> > > +               return;
> > > +
> > > +       spin_lock_irqsave(&gpiochip->lock, flags);
> > 
> > Use a scoped guard here
> > 
> > guard(spinlock_irqsave)(&gpiochip->lock);
> > 
> > > +static void airoha_pinctrl_gpio_irq_mask(struct irq_data *data)
> > > +{
> > > +       u8 offset = data->hwirq % AIROHA_REG_GPIOCTRL_NUM_GPIO;
> > > +       u8 index = data->hwirq / AIROHA_REG_GPIOCTRL_NUM_GPIO;
> > > +       u32 mask = GENMASK(2 * offset + 1, 2 * offset);
> > > +       struct airoha_pinctrl_gpiochip *gpiochip;
> > > +       unsigned long flags;
> > > +
> > > +       gpiochip = irq_data_get_irq_chip_data(data);
> > > +
> > > +       spin_lock_irqsave(&gpiochip->lock, flags);
> > 
> > Dito
> > 
> > > +static int airoha_pinctrl_gpio_irq_type(struct irq_data *data,
> > > +                                       unsigned int type)
> > > +{
> > > +       struct airoha_pinctrl_gpiochip *gpiochip;
> > > +       unsigned long flags;
> > > +
> > > +       gpiochip = irq_data_get_irq_chip_data(data);
> > > +       if (data->hwirq >= ARRAY_SIZE(gpiochip->irq_type))
> > > +               return -EINVAL;
> > > +
> > > +       spin_lock_irqsave(&gpiochip->lock, flags);
> > 
> > Dito
> > 
> > > +       girq->chip = devm_kzalloc(dev, sizeof(*girq->chip), GFP_KERNEL);
> > > +       if (!girq->chip)
> > > +               return -ENOMEM;
> > > +
> > > +       girq->chip->name = dev_name(dev);
> > > +       girq->chip->irq_unmask = airoha_pinctrl_gpio_irq_unmask;
> > > +       girq->chip->irq_mask = airoha_pinctrl_gpio_irq_mask;
> > > +       girq->chip->irq_mask_ack = airoha_pinctrl_gpio_irq_mask;
> > > +       girq->chip->irq_set_type = airoha_pinctrl_gpio_irq_type;
> > > +       girq->chip->flags = IRQCHIP_SET_TYPE_MASKED | IRQCHIP_IMMUTABLE;
> > > +       girq->default_type = IRQ_TYPE_NONE;
> > > +       girq->handler = handle_simple_irq;
> > 
> > If the irqchip is immutable it is const and there is no point to malloc it.
> > 
> > Just
> > 
> > static const struct irq_chip airoha_gpio_irq_chip = {...
> > 
> > And assign it:
> > 
> > girq = &g->gc.irq;
> > gpio_irq_chip_set_chip(girq, &airoha_gpio_irq_chip);
> 
> ack, I will fix it in v5.
> 
> Regards,
> Lorenzo
> 
> > 
> > Yours,
> > Linus Walleij


-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 228 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-mediatek/attachments/20240924/17608e8f/attachment.sig>

From daniel at fooishbar.org  Tue Sep 24 15:02:54 2024
From: daniel at fooishbar.org (Daniel Stone)
Date: Tue, 24 Sep 2024 23:02:54 +0100
Subject: [RFC PATCH 0/4] Linaro restricted heap
In-Reply-To: <20240830070351.2855919-1-jens.wiklander@linaro.org>
References: <20240830070351.2855919-1-jens.wiklander@linaro.org>
Message-ID: <CAPj87rM5LSBEdMECyh0WTkjWWySDv2_eyqj7ew_qU7xQ5LEdgA@mail.gmail.com>

Hi Jens,

On Fri, 30 Aug 2024 at 08:04, Jens Wiklander <jens.wiklander at linaro.org> wrote:
> This patch set is based on top of Yong Wu's restricted heap patch set [1].
> It's also a continuation on Olivier's Add dma-buf secure-heap patch set [2].
>
> The Linaro restricted heap uses genalloc in the kernel to manage the heap
> carvout. This is a difference from the Mediatek restricted heap which
> relies on the secure world to manage the carveout.

Calling this the 'genalloc heap' would be much more clear.

Cheers,
Daniel


From dmitry.baryshkov at linaro.org  Tue Sep 24 16:05:42 2024
From: dmitry.baryshkov at linaro.org (Dmitry Baryshkov)
Date: Wed, 25 Sep 2024 02:05:42 +0300
Subject: [RFC PATCH 0/4] Linaro restricted heap
In-Reply-To: <d8e0cb78-7cfb-42bf-b3a5-f765592e8dd4@ti.com>
References: <20240830070351.2855919-1-jens.wiklander@linaro.org>
 <dhxvyshwi4qmcmwceokhqey2ww4azjcs6qrpnkgivdj7tv5cke@r36srvvbof6q>
 <d8e0cb78-7cfb-42bf-b3a5-f765592e8dd4@ti.com>
Message-ID: <mzur3odofwwrdqnystozjgf3qtvb73wqjm6g2vf5dfsqiehaxk@u67fcarhm6ge>

On Tue, Sep 24, 2024 at 01:13:18PM GMT, Andrew Davis wrote:
> On 9/23/24 1:33 AM, Dmitry Baryshkov wrote:
> > Hi,
> > 
> > On Fri, Aug 30, 2024 at 09:03:47AM GMT, Jens Wiklander wrote:
> > > Hi,
> > > 
> > > This patch set is based on top of Yong Wu's restricted heap patch set [1].
> > > It's also a continuation on Olivier's Add dma-buf secure-heap patch set [2].
> > > 
> > > The Linaro restricted heap uses genalloc in the kernel to manage the heap
> > > carvout. This is a difference from the Mediatek restricted heap which
> > > relies on the secure world to manage the carveout.
> > > 
> > > I've tried to adress the comments on [2], but [1] introduces changes so I'm
> > > afraid I've had to skip some comments.
> > 
> > I know I have raised the same question during LPC (in connection to
> > Qualcomm's dma-heap implementation). Is there any reason why we are
> > using generic heaps instead of allocating the dma-bufs on the device
> > side?
> > 
> > In your case you already have TEE device, you can use it to allocate and
> > export dma-bufs, which then get imported by the V4L and DRM drivers.
> > 
> 
> This goes to the heart of why we have dma-heaps in the first place.
> We don't want to burden userspace with having to figure out the right
> place to get a dma-buf for a given use-case on a given hardware.
> That would be very non-portable, and fail at the core purpose of
> a kernel: to abstract hardware specifics away.

Unfortunately all proposals to use dma-buf heaps were moving in the
described direction: let app select (somehow) from a platform- and
vendor- specific list of dma-buf heaps. In the kernel we at least know
the platform on which the system is running. Userspace generally doesn't
(and shouldn't). As such, it seems better to me to keep the knowledge in
the kernel and allow userspace do its job by calling into existing
device drivers.

> 
> Worse, the actual interface for dma-buf exporting changes from
> framework to framework (getting a dma-buf from DRM is different
> than V4L, and there would be yet another API for TEE, etc..)

But if the app is working with the particular subsystem, then it already
talks its language. Allocating a dma-buf is just another part of the
interface, which the app already has to support.

> Most subsystem don't need an allocator, they work just fine
> simply being only dma-bufs importers. Recent example being the
> IIO subsystem[0], for which some early posting included an
> allocator, but in the end, all that was needed was to consume
> buffers.
> 
> For devices that don't actually contain memory there is no
> reason to be an exporter. What most want is just to consume
> normal system memory. Or system memory with some constraints
> (e.g. contiguous, coherent, restricted, etc..).

... secure, accessible only to the camera and video encoder, ... or
accessible only to the video decoder and the display unit. Who specifies
those restrictions? Can we express them in a platform-neutral way?

> 
> > I have a feeling (I might be completely wrong here) that by using
> > generic dma-buf heaps we can easily end up in a situation when the
> > userspace depends heavily on the actual platform being used (to map the
> > platform to heap names). I think we should instead depend on the
> > existing devices (e.g. if there is a TEE device, use an IOCTL to
> > allocate secured DMA BUF from it, otherwise check for QTEE device,
> > otherwise check for some other vendor device).
> > 
> > The mental experiment to check if the API is correct is really simple:
> > Can you use exactly the same rootfs on several devices without
> > any additional tuning (e.g. your QEMU, HiKey, a Mediatek board, Qualcomm
> > laptop, etc)?
> > 
> 
> This is a great north star to follow. And exactly the reason we should
> *not* be exposing device specific constraints to userspace. The constrains
> change based on the platform. So a userspace would have to also pick
> a different set of constraints based on each platform.

Great, I totally agree here.

> Userspace knows which subsystems it will attach a buffer, and the
> kernel knows what constraints those devices have on a given platform.
> Ideal case is then allocate from the one exporter, attach to various
> devices, and have the constraints solved at map time by the exporter
> based on the set of attached devices.
> 
> For example, on one platform the display needs contiguous buffers,
> but on a different platform the display can scatter-gather. So
> what heap should our generic application allocate from when it
> wants a buffer consumable by the display, CMA or System?
> Answer *should* be always use the generic exporter, and that
> exporter then picks the right backing type based on the platform.

The display can support scather-gather, the GPU needs bigger stride for
this particular format and the video encoder decoder can not support SG.
Which set of constraints and which buffer size should generic exporter
select?

> Userspace shouldn't be dealing with any of these constraints
> (looking back, adding the CMA heap was probably incorrect,
> and the System heap should have been the only one. Idea back
> then was a userspace helper would show up to do the constraint
> solving and pick the right heap. That has yet to materialize and
> folks are still just hardcoding which heap to use..).
> 
> Same for this restricted heap, I'd like to explore if we can
> enhance the System heap such that when attached to the TEE framework,
> the backing memory is either made restricted by fire-walling,
> or allocating from a TEE carveout (based on platform).

Firewalling from which devices? Or rather allowing access from which
devices? Is it possible to specify that somehow?

> This will mean more inter-subsystem coordination, but we can
> iterate on these in kernel interfaces. We cannot iterate on
> userspace interfaces, those have to be correct the first time.
> 
> Andrew
> 
> [0] https://www.kernel.org/doc/html/next/iio/iio_dmabuf_api.html
> 
> > > 
> > > This can be tested on QEMU with the following steps:
> > > repo init -u https://github.com/jenswi-linaro/manifest.git -m qemu_v8.xml \
> > >          -b prototype/sdp-v1
> > > repo sync -j8
> > > cd build
> > > make toolchains -j4
> > > make all -j$(nproc)
> > > make run-only
> > > # login and at the prompt:
> > > xtest --sdp-basic
> > > 
> > > https://optee.readthedocs.io/en/latest/building/prerequisites.html
> > > list dependencies needed to build the above.
> > > 
> > > The tests are pretty basic, mostly checking that a Trusted Application in
> > > the secure world can access and manipulate the memory.
> > 
> > - Can we test that the system doesn't crash badly if user provides
> >    non-secured memory to the users which expect a secure buffer?
> > 
> > - At the same time corresponding entities shouldn't decode data to the
> >    buffers accessible to the rest of the sytem.
> > 
> > > 
> > > Cheers,
> > > Jens
> > > 
> > > [1] https://lore.kernel.org/dri-devel/20240515112308.10171-1-yong.wu at mediatek.com/
> > > [2] https://lore.kernel.org/lkml/20220805135330.970-1-olivier.masse at nxp.com/
> > > 
> > > Changes since Olivier's post [2]:
> > > * Based on Yong Wu's post [1] where much of dma-buf handling is done in
> > >    the generic restricted heap
> > > * Simplifications and cleanup
> > > * New commit message for "dma-buf: heaps: add Linaro restricted dmabuf heap
> > >    support"
> > > * Replaced the word "secure" with "restricted" where applicable
> > > 
> > > Etienne Carriere (1):
> > >    tee: new ioctl to a register tee_shm from a dmabuf file descriptor
> > > 
> > > Jens Wiklander (2):
> > >    dma-buf: heaps: restricted_heap: add no_map attribute
> > >    dma-buf: heaps: add Linaro restricted dmabuf heap support
> > > 
> > > Olivier Masse (1):
> > >    dt-bindings: reserved-memory: add linaro,restricted-heap
> > > 
> > >   .../linaro,restricted-heap.yaml               |  56 ++++++
> > >   drivers/dma-buf/heaps/Kconfig                 |  10 ++
> > >   drivers/dma-buf/heaps/Makefile                |   1 +
> > >   drivers/dma-buf/heaps/restricted_heap.c       |  17 +-
> > >   drivers/dma-buf/heaps/restricted_heap.h       |   2 +
> > >   .../dma-buf/heaps/restricted_heap_linaro.c    | 165 ++++++++++++++++++
> > >   drivers/tee/tee_core.c                        |  38 ++++
> > >   drivers/tee/tee_shm.c                         | 104 ++++++++++-
> > >   include/linux/tee_drv.h                       |  11 ++
> > >   include/uapi/linux/tee.h                      |  29 +++
> > >   10 files changed, 426 insertions(+), 7 deletions(-)
> > >   create mode 100644 Documentation/devicetree/bindings/reserved-memory/linaro,restricted-heap.yaml
> > >   create mode 100644 drivers/dma-buf/heaps/restricted_heap_linaro.c
> > > 
> > > -- 
> > > 2.34.1
> > > 
> > 

-- 
With best wishes
Dmitry


From macpaul.lin at mediatek.com  Tue Sep 24 21:02:01 2024
From: macpaul.lin at mediatek.com (Macpaul Lin)
Date: Wed, 25 Sep 2024 12:02:01 +0800
Subject: [PATCH 6/6] dt-bindings: display: mediatek: dpi: Add mt8195
 support in power domains
In-Reply-To: <ed0c25ba-2816-4d4b-9023-2e07976f4341@collabora.com>
References: <20240924103156.13119-1-macpaul.lin@mediatek.com>
 <20240924103156.13119-6-macpaul.lin@mediatek.com>
 <ed0c25ba-2816-4d4b-9023-2e07976f4341@collabora.com>
Message-ID: <216a2a51-7fcb-54df-7287-de504f6dc510@mediatek.com>



On 9/24/24 19:48, AngeloGioacchino Del Regno wrote:

> Il 24/09/24 12:31, Macpaul Lin ha scritto:
>> Add power domain binding to the mediatek DPI controller for MT8185.
>> 
>> The dpi node in mt8195.dtsi was triggering a dtbs_check error:
>>    dp-intf at 1c113000: power-domains: False schema does not allow [[44, 18]]
>> 
>> Fixes: 5474d49b2f79 ("dt-bindings: display: mediatek: dpi: Add power domains")
>> Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
>> ---
>>   .../devicetree/bindings/display/mediatek/mediatek,dpi.yaml       | 1 +
>>   1 file changed, 1 insertion(+)
>> 
>> diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml b/Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml
>> index 3a82aec9021c..07acc8a76bfc 100644
>> --- a/Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml
>> +++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml
>> @@ -89,6 +89,7 @@ allOf:
>>                   - mediatek,mt6795-dpi
>>                   - mediatek,mt8173-dpi
>>                   - mediatek,mt8186-dpi
>> +                - mediatek,mt8195-dp-intf
> 
> The dp_intf1 block has a power domain (VDOSYS1)... so that will break the check
> for the other one.
> 
> Besides, I'm fairly sure that the right fix is to actually add the missing VDOSYS0
> power domain to dp_intf0 instead, as that block is indeed in VDO0.
> 
> So.. for this patch: nak.
> 
> Cheers,
> Angelo

Tommy and I was wondering why DP-INTF0 will work without power domain.
After lookup others node in the mt8195.dtsi, I guess this is because the 
power domain VDOSYS0 has been enabled by other modules.

However this patch is still required after adding power domain to DP-INTF0.
Otherwise the dpi errors will become two. :~
  dp-intf at 1c015000: power-domains: False schema does not allow [[44, 16]]
  dp-intf at 1c113000: power-domains: False schema does not allow [[44, 18]]

I'll send a separate patch to add VDOSYS0 for DP-INTF0.

Thanks
Macpaul Lin


From peter.wang at mediatek.com  Tue Sep 24 22:19:06 2024
From: peter.wang at mediatek.com (=?utf-8?B?UGV0ZXIgV2FuZyAo546L5L+h5Y+LKQ==?=)
Date: Wed, 25 Sep 2024 05:19:06 +0000
Subject: [PATCH v8 3/3] ufs: core: add a quirk for MediaTek SDB mode
 aborted
In-Reply-To: <fb02d4c2-bb0b-4d26-8d6c-f76f309679a1@acm.org>
References: <20240923080344.19084-1-peter.wang@mediatek.com>
	 <20240923080344.19084-4-peter.wang@mediatek.com>
	 <ce42d310-2a23-453f-bd14-71eeaf9f5664@acm.org>
	 <e0cb5defb8894ea8fb058c617e9de3d3cfa9763f.camel@mediatek.com>
	 <fb02d4c2-bb0b-4d26-8d6c-f76f309679a1@acm.org>
Message-ID: <cd94ff09e36c921f5725c6e7b36ea743a2f6b872.camel@mediatek.com>

On Tue, 2024-09-24 at 12:36 -0700, Bart Van Assche wrote:
>  	 
> External email : Please do not click links or open attachments until
> you have verified the sender or the content.
>  On 9/24/24 1:51 AM, Peter Wang (???) wrote:
> > Is there any corner case that I might have overlooked?
> 
> Maybe I misunderstood how MediaTek controllers work. Anyway, if a
> MediaTek controller reports the completion status OCS_ABORTED, is
> there any chance that this status will be reported after
> ufshcd_release_scsi_cmd() has been called? Is there any chance that
> the controller writing OCS_ABORTED into the status field will race
> with the host software overwriting that status field while submitting
> a new command?
> 
> Thanks,
> 
> Bart.
> 


Hi Bart,

Okay, I may not have clearly explained the behavior of the 
MediaTek UFS controller.

In the UFSHCI specification, under the description of UTRLCLR.
After writing to UTRLCLR, when UTRLDBR is cleared to 0,
the MediaTek UFS controller will simultaneously change the 
OCS to ABORTED. So, OCS: ABORTED is filled at the moment 
when ufshcd_clear_cmd successfully waits for DBR to clear. 
That's why I wrote it like this: 
ufshcd_try_to_abort_task() // triggers MediaTek controller to fill OCS:
ABORTED

Therefore, the status should already be ABORTED before 
ufshcd_release_scsi_cmd, so there shouldn't be a racing issue.

Thanks.
Peter

From macpaul.lin at mediatek.com  Tue Sep 24 23:18:12 2024
From: macpaul.lin at mediatek.com (Macpaul Lin)
Date: Wed, 25 Sep 2024 14:18:12 +0800
Subject: [PATCH 2/6] dt-bindings: iommu: mediatek: Fix interrupt count
 constraint for new SoCs
In-Reply-To: <20240924-haiku-drudge-79e5824d4b6f@spud>
References: <20240924103156.13119-1-macpaul.lin@mediatek.com>
 <20240924103156.13119-2-macpaul.lin@mediatek.com>
 <20240924-haiku-drudge-79e5824d4b6f@spud>
Message-ID: <aca569b8-6867-ae9f-0746-021696b801fe@mediatek.com>


On 9/25/24 00:02, Conor Dooley wrote:
> On Tue, Sep 24, 2024 at 06:31:52PM +0800, Macpaul Lin wrote:
>> The infra-iommu node in mt8195.dtsi was triggering a CHECK_DTBS error due
>> to an excessively long 'interrupts' property. The error message was:
>>
>>    infra-iommu at 10315000: interrupts: [[0, 795, 4, 0], [0, 796, 4, 0],
>>                       [0, 797, 4, 0], [0, 798, 4, 0], [0, 799, 4, 0]]
>>                       is too long
>>
>> To address this issue, add "minItems: 1" and "maxItems: 5" constraints to
>> the 'interrupts' property in the DT binding schema. This change allows for
>> flexibility in the number of interrupts for new SoCs
>>
>> Fixes: bca28426805d ("dt-bindings: iommu: mediatek: Convert IOMMU to DT schema")
>>
> 
> This space should be removed.

Thanks! Will fix it in the next version.

>> Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
>> ---
>>   Documentation/devicetree/bindings/iommu/mediatek,iommu.yaml | 3 ++-
>>   1 file changed, 2 insertions(+), 1 deletion(-)
>>
>> diff --git a/Documentation/devicetree/bindings/iommu/mediatek,iommu.yaml b/Documentation/devicetree/bindings/iommu/mediatek,iommu.yaml
>> index ea6b0f5f24de..a00f1f0045b1 100644
>> --- a/Documentation/devicetree/bindings/iommu/mediatek,iommu.yaml
>> +++ b/Documentation/devicetree/bindings/iommu/mediatek,iommu.yaml
>> @@ -96,7 +96,8 @@ properties:
>>       maxItems: 1
>>   
>>     interrupts:
>> -    maxItems: 1
>> +    minItems: 1
>> +    maxItems: 5
> 
> You need to add an items list here, and probably some per compatible
> constraints. What are each of the itnerrupts for?
> 

According to Friday Yang's comment,
The IOMMU of MT8195 has 5 banks: 0/1/2/3/4. Each bank has a set of APB 
registers
corresponding to the normal world, protected world 1/2/3,
and secure world, respectively.
Therefore, 5 interrupt numbers are needed.

>>   
>>     clocks:
>>       items:
>> -- 
>> 2.45.2
>>

Will try to fix it and add some description for MT8195.
I think this patch could be split as a separated patch from the origin
patch set. It'll take some time to refine the patch.

Thanks
Macpaul Lin


From rohiagar at chromium.org  Tue Sep 24 23:18:40 2024
From: rohiagar at chromium.org (Rohit Agarwal)
Date: Wed, 25 Sep 2024 11:48:40 +0530
Subject: [PATCH v2 1/2] dt-bindings: display: mediatek: dpi: Add power
 domain for MT8183
In-Reply-To: <4djlcabqjkq7thbxadjbbi6oumybnyzv7biwawke46ctjccwye@rmqougrj6pl2>
References: <20240919112152.2829765-1-rohiagar@chromium.org>
 <20240919112152.2829765-2-rohiagar@chromium.org>
 <4djlcabqjkq7thbxadjbbi6oumybnyzv7biwawke46ctjccwye@rmqougrj6pl2>
Message-ID: <c9f7042b-1e61-4289-9ef9-ea15bd7e9847@chromium.org>


On 24/09/24 2:41 PM, Krzysztof Kozlowski wrote:
> On Thu, Sep 19, 2024 at 11:21:51AM +0000, Rohit Agarwal wrote:
>> Add power domain binding to the mediatek DPI controller
> That's DPI controller, how can you add here power domain binding?
I think, I messed up in the commit message. I wanted to add a missing 
compatible string
in both the patches.
Will update the commit messages in both the patches.

Thanks,
Rohit.
>
>> for MT8183 that already had the property in DT.
> Best regards,
> Krzysztof
>


From liankun.yang at mediatek.com  Tue Sep 24 23:48:22 2024
From: liankun.yang at mediatek.com (Liankun Yang)
Date: Wed, 25 Sep 2024 14:48:22 +0800
Subject: [PATCH v3 1/1] drm/mediatek: dp: Add sdp path reset
Message-ID: <20240925064854.23065-1-liankun.yang@mediatek.com>

When using type-c to type-c to connect to the monitor,
the sound plays normally. If you unplug the type-c and
connect the type-c to hdmi dongle to the monitor, there will be noise.

By capturing the audio data, it is found that
the data position is messy, and there is no error in the data.

Through experiments, it can be restored by resetting the SDP path
when unplugging it.

Signed-off-by: Liankun Yang <liankun.yang at mediatek.com>
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
---
Changes in V3:
- No change.
Per suggestion from the previous thread:
https://patchwork.kernel.org/project/linux-mediatek/patch/20240923132521.22785-1-liankun.yang at mediatek.com/

Changes in V2:
- Fix build error.
Per suggestion from the previous thread:
https://patchwork.kernel.org/project/linux-mediatek/patch/20240923133610.23728-1-liankun.yang at mediatek.com/
---
 drivers/gpu/drm/mediatek/mtk_dp.c     | 15 +++++++++++++++
 drivers/gpu/drm/mediatek/mtk_dp_reg.h |  1 +
 2 files changed, 16 insertions(+)

diff --git a/drivers/gpu/drm/mediatek/mtk_dp.c b/drivers/gpu/drm/mediatek/mtk_dp.c
index d8796a904eca..4003bd83f64e 100644
--- a/drivers/gpu/drm/mediatek/mtk_dp.c
+++ b/drivers/gpu/drm/mediatek/mtk_dp.c
@@ -1052,6 +1052,18 @@ static void mtk_dp_digital_sw_reset(struct mtk_dp *mtk_dp)
 			   0, DP_TX_TRANSMITTER_4P_RESET_SW_DP_TRANS_P0);
 }
 
+static void mtk_dp_sdp_path_reset(struct mtk_dp *mtk_dp)
+{
+	mtk_dp_update_bits(mtk_dp, MTK_DP_ENC0_P0_3004,
+				SDP_RESET_SW_DP_ENC0_P0,
+				SDP_RESET_SW_DP_ENC0_P0);
+
+	/* Wait for sdp path reset to complete */
+	usleep_range(1000, 5000);
+	mtk_dp_update_bits(mtk_dp, MTK_DP_ENC0_P0_3004,
+				0, SDP_RESET_SW_DP_ENC0_P0);
+}
+
 static void mtk_dp_set_lanes(struct mtk_dp *mtk_dp, int lanes)
 {
 	mtk_dp_update_bits(mtk_dp, MTK_DP_TRANS_P0_35F0,
@@ -2314,6 +2326,9 @@ static void mtk_dp_bridge_atomic_disable(struct drm_bridge *bridge,
 			   DP_PWR_STATE_BANDGAP_TPLL,
 			   DP_PWR_STATE_MASK);
 
+	/* SDP path reset sw*/
+	mtk_dp_sdp_path_reset(mtk_dp);
+
 	/* Ensure the sink is muted */
 	msleep(20);
 }
diff --git a/drivers/gpu/drm/mediatek/mtk_dp_reg.h b/drivers/gpu/drm/mediatek/mtk_dp_reg.h
index 709b79480693..8ad7a9cc259e 100644
--- a/drivers/gpu/drm/mediatek/mtk_dp_reg.h
+++ b/drivers/gpu/drm/mediatek/mtk_dp_reg.h
@@ -86,6 +86,7 @@
 #define MTK_DP_ENC0_P0_3004			0x3004
 #define VIDEO_M_CODE_SEL_DP_ENC0_P0_MASK		BIT(8)
 #define DP_TX_ENCODER_4P_RESET_SW_DP_ENC0_P0		BIT(9)
+#define SDP_RESET_SW_DP_ENC0_P0				BIT(13)
 #define MTK_DP_ENC0_P0_3010			0x3010
 #define HTOTAL_SW_DP_ENC0_P0_MASK			GENMASK(15, 0)
 #define MTK_DP_ENC0_P0_3014			0x3014
-- 
2.45.2



From yujiaoliang at vivo.com  Wed Sep 25 00:09:13 2024
From: yujiaoliang at vivo.com (Yu Jiaoliang)
Date: Wed, 25 Sep 2024 15:09:13 +0800
Subject: [PATCH v1] media:tuners: Fix typos in comments across various files
Message-ID: <20240925070920.3304189-1-yujiaoliang@vivo.com>

This commit corrects spelling errors in comments within
the media/tuners directory found by codespell to enhance
clarity and maintainability of the code.
This change does not affect the functionality.

Signed-off-by: Yu Jiaoliang <yujiaoliang at vivo.com>
---
 drivers/media/tuners/mt2063.c   | 2 +-
 drivers/media/tuners/mxl301rf.c | 2 +-
 drivers/media/tuners/mxl5005s.c | 2 +-
 drivers/media/tuners/tea5761.c  | 4 ++--
 drivers/media/tuners/tea5767.c  | 4 ++--
 5 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/drivers/media/tuners/mt2063.c b/drivers/media/tuners/mt2063.c
index 6afef11a49cb..2c8ce74ddca4 100644
--- a/drivers/media/tuners/mt2063.c
+++ b/drivers/media/tuners/mt2063.c
@@ -1476,7 +1476,7 @@ static u32 MT2063_CalcLO2Mult(u32 *Div,
 }
 
 /*
- * FindClearTuneFilter() - Calculate the corrrect ClearTune filter to be
+ * FindClearTuneFilter() - Calculate the correct ClearTune filter to be
  *			   used for a given input frequency.
  *
  * @state:	ptr to tuner data structure
diff --git a/drivers/media/tuners/mxl301rf.c b/drivers/media/tuners/mxl301rf.c
index 7c03d4132763..3b61c3afed18 100644
--- a/drivers/media/tuners/mxl301rf.c
+++ b/drivers/media/tuners/mxl301rf.c
@@ -64,7 +64,7 @@ static int reg_read(struct mxl301rf_state *state, u8 reg, u8 *val)
 
 /* tuner_ops */
 
-/* get RSSI and update propery cache, set to *out in % */
+/* get RSSI and update property cache, set to *out in % */
 static int mxl301rf_get_rf_strength(struct dvb_frontend *fe, u16 *out)
 {
 	struct mxl301rf_state *state;
diff --git a/drivers/media/tuners/mxl5005s.c b/drivers/media/tuners/mxl5005s.c
index d9bfa257a005..0e811c5eae6c 100644
--- a/drivers/media/tuners/mxl5005s.c
+++ b/drivers/media/tuners/mxl5005s.c
@@ -2639,7 +2639,7 @@ static u16 MXL_TuneRF(struct dvb_frontend *fe, u32 RF_Freq)
 	E5A = (((Fmax - state->RF_LO)/1000)*4/((Fmax-Fmin)/1000)) + 1 ;
 	status += MXL_ControlWrite(fe, RFSYN_LPF_R, E5A);
 
-	/* Euqation E5B CHCAL_EN_INIT_RF */
+	/* Equation E5B CHCAL_EN_INIT_RF */
 	status += MXL_ControlWrite(fe, CHCAL_EN_INT_RF, ((E5 == 0) ? 1 : 0));
 	/*if (E5 == 0)
 	 *	status += MXL_ControlWrite(fe, CHCAL_EN_INT_RF, 1);
diff --git a/drivers/media/tuners/tea5761.c b/drivers/media/tuners/tea5761.c
index d78a2bdb3e36..425e9fd3f3d4 100644
--- a/drivers/media/tuners/tea5761.c
+++ b/drivers/media/tuners/tea5761.c
@@ -46,7 +46,7 @@ struct tea5761_priv {
 /* FRQSET - Read: bytes 2 and 3 / Write: byte 1 and 2 */
 
 	/* First byte */
-#define TEA5761_FRQSET_SEARCH_UP 0x80		/* 1=Station search from botton to up */
+#define TEA5761_FRQSET_SEARCH_UP 0x80		/* 1=Station search from bottom to up */
 #define TEA5761_FRQSET_SEARCH_MODE 0x40		/* 1=Search mode */
 
 	/* Bits 0-5 for divider MSB */
@@ -132,7 +132,7 @@ static void tea5761_status_dump(unsigned char *buffer)
 	       frq / 1000, frq % 1000, div);
 }
 
-/* Freq should be specifyed at 62.5 Hz */
+/* Freq should be specified at 62.5 Hz */
 static int __set_radio_freq(struct dvb_frontend *fe,
 			    unsigned int freq,
 			    bool mono)
diff --git a/drivers/media/tuners/tea5767.c b/drivers/media/tuners/tea5767.c
index 016d0d5ec50b..ef4acb1f1bfa 100644
--- a/drivers/media/tuners/tea5767.c
+++ b/drivers/media/tuners/tea5767.c
@@ -44,7 +44,7 @@ struct tea5767_priv {
 
 /* Third register */
 
-/* Station search from botton to up */
+/* Station search from bottom to up */
 #define TEA5767_SEARCH_UP	0x80
 
 /* Searches with ADC output = 10 */
@@ -183,7 +183,7 @@ static void tea5767_status_dump(struct tea5767_priv *priv,
 		   (buffer[4] & TEA5767_RESERVED_MASK));
 }
 
-/* Freq should be specifyed at 62.5 Hz */
+/* Freq should be specified at 62.5 Hz */
 static int set_radio_freq(struct dvb_frontend *fe,
 			  struct analog_parameters *params)
 {
-- 
2.34.1



From jens.wiklander at linaro.org  Wed Sep 25 00:15:04 2024
From: jens.wiklander at linaro.org (Jens Wiklander)
Date: Wed, 25 Sep 2024 09:15:04 +0200
Subject: [RFC PATCH 0/4] Linaro restricted heap
In-Reply-To: <dhxvyshwi4qmcmwceokhqey2ww4azjcs6qrpnkgivdj7tv5cke@r36srvvbof6q>
References: <20240830070351.2855919-1-jens.wiklander@linaro.org>
 <dhxvyshwi4qmcmwceokhqey2ww4azjcs6qrpnkgivdj7tv5cke@r36srvvbof6q>
Message-ID: <20240925071504.GA3519798@rayden>

On Mon, Sep 23, 2024 at 09:33:29AM +0300, Dmitry Baryshkov wrote:
> Hi,
> 
> On Fri, Aug 30, 2024 at 09:03:47AM GMT, Jens Wiklander wrote:
> > Hi,
> > 
> > This patch set is based on top of Yong Wu's restricted heap patch set [1].
> > It's also a continuation on Olivier's Add dma-buf secure-heap patch set [2].
> > 
> > The Linaro restricted heap uses genalloc in the kernel to manage the heap
> > carvout. This is a difference from the Mediatek restricted heap which
> > relies on the secure world to manage the carveout.
> > 
> > I've tried to adress the comments on [2], but [1] introduces changes so I'm
> > afraid I've had to skip some comments.
> 
> I know I have raised the same question during LPC (in connection to
> Qualcomm's dma-heap implementation). Is there any reason why we are
> using generic heaps instead of allocating the dma-bufs on the device
> side?
> 
> In your case you already have TEE device, you can use it to allocate and
> export dma-bufs, which then get imported by the V4L and DRM drivers.
> 
> I have a feeling (I might be completely wrong here) that by using
> generic dma-buf heaps we can easily end up in a situation when the
> userspace depends heavily on the actual platform being used (to map the
> platform to heap names). I think we should instead depend on the
> existing devices (e.g. if there is a TEE device, use an IOCTL to
> allocate secured DMA BUF from it, otherwise check for QTEE device,
> otherwise check for some other vendor device).

That makes sense, it's similar to what we do with TEE_IOC_SHM_ALLOC
where we allocate from a carveout reserverd for shared memory with the
secure world. It was even based on dma-buf until commit dfd0743f1d9e
("tee: handle lookup of shm with reference count 0").

We should use a new TEE_IOC_*_ALLOC for these new dma-bufs to avoid
confusion and to have more freedom when designing the interface.

> 
> The mental experiment to check if the API is correct is really simple:
> Can you use exactly the same rootfs on several devices without
> any additional tuning (e.g. your QEMU, HiKey, a Mediatek board, Qualcomm
> laptop, etc)?

No, I don't think so.

> 
> > 
> > This can be tested on QEMU with the following steps:
> > repo init -u https://github.com/jenswi-linaro/manifest.git -m qemu_v8.xml \
> >         -b prototype/sdp-v1
> > repo sync -j8
> > cd build
> > make toolchains -j4
> > make all -j$(nproc)
> > make run-only
> > # login and at the prompt:
> > xtest --sdp-basic
> > 
> > https://optee.readthedocs.io/en/latest/building/prerequisites.html
> > list dependencies needed to build the above.
> > 
> > The tests are pretty basic, mostly checking that a Trusted Application in
> > the secure world can access and manipulate the memory.
> 
> - Can we test that the system doesn't crash badly if user provides
>   non-secured memory to the users which expect a secure buffer?
> 
> - At the same time corresponding entities shouldn't decode data to the
>   buffers accessible to the rest of the sytem.

I'll a few tests along that.

Thanks,
Jens

> 
> > 
> > Cheers,
> > Jens
> > 
> > [1] https://lore.kernel.org/dri-devel/20240515112308.10171-1-yong.wu at mediatek.com/
> > [2] https://lore.kernel.org/lkml/20220805135330.970-1-olivier.masse at nxp.com/
> > 
> > Changes since Olivier's post [2]:
> > * Based on Yong Wu's post [1] where much of dma-buf handling is done in
> >   the generic restricted heap
> > * Simplifications and cleanup
> > * New commit message for "dma-buf: heaps: add Linaro restricted dmabuf heap
> >   support"
> > * Replaced the word "secure" with "restricted" where applicable
> > 
> > Etienne Carriere (1):
> >   tee: new ioctl to a register tee_shm from a dmabuf file descriptor
> > 
> > Jens Wiklander (2):
> >   dma-buf: heaps: restricted_heap: add no_map attribute
> >   dma-buf: heaps: add Linaro restricted dmabuf heap support
> > 
> > Olivier Masse (1):
> >   dt-bindings: reserved-memory: add linaro,restricted-heap
> > 
> >  .../linaro,restricted-heap.yaml               |  56 ++++++
> >  drivers/dma-buf/heaps/Kconfig                 |  10 ++
> >  drivers/dma-buf/heaps/Makefile                |   1 +
> >  drivers/dma-buf/heaps/restricted_heap.c       |  17 +-
> >  drivers/dma-buf/heaps/restricted_heap.h       |   2 +
> >  .../dma-buf/heaps/restricted_heap_linaro.c    | 165 ++++++++++++++++++
> >  drivers/tee/tee_core.c                        |  38 ++++
> >  drivers/tee/tee_shm.c                         | 104 ++++++++++-
> >  include/linux/tee_drv.h                       |  11 ++
> >  include/uapi/linux/tee.h                      |  29 +++
> >  10 files changed, 426 insertions(+), 7 deletions(-)
> >  create mode 100644 Documentation/devicetree/bindings/reserved-memory/linaro,restricted-heap.yaml
> >  create mode 100644 drivers/dma-buf/heaps/restricted_heap_linaro.c
> > 
> > -- 
> > 2.34.1
> > 
> 
> -- 
> With best wishes
> Dmitry


From macpaul.lin at mediatek.com  Wed Sep 25 00:15:14 2024
From: macpaul.lin at mediatek.com (Macpaul Lin)
Date: Wed, 25 Sep 2024 15:15:14 +0800
Subject: [PATCH] arm64: dts: mediatek: mt8195: Add power domain for dp_intf0
Message-ID: <20240925071514.17626-1-macpaul.lin@mediatek.com>

During inspecting dtbs_check errors, we found the power domain
setting of DPI node "dp_intf0" is missing. Add power domain setting
to "MT8195_POWER_DOMAIN_VDOSYS0" for "dp_intf0"

Signed-off-by: Tommy Chen <tommytl.chen at mediatek.com>
Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
---
 arch/arm64/boot/dts/mediatek/mt8195.dtsi | 1 +
 1 file changed, 1 insertion(+)

Changes for v1:
 - This patch is related to adding mt8195-dp-intf to DT schema fix for
  - http://devicetree.org/schemas/display/mediatek/mediatek,dpi.yaml 
  - patch: https://lore.kernel.org/all/20240924103156.13119-6-macpaul.lin at mediatek.com/

diff --git a/arch/arm64/boot/dts/mediatek/mt8195.dtsi b/arch/arm64/boot/dts/mediatek/mt8195.dtsi
index ade685ed2190..6218bd7abb05 100644
--- a/arch/arm64/boot/dts/mediatek/mt8195.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8195.dtsi
@@ -3252,6 +3252,7 @@ dp_intf0: dp-intf at 1c015000 {
 			compatible = "mediatek,mt8195-dp-intf";
 			reg = <0 0x1c015000 0 0x1000>;
 			interrupts = <GIC_SPI 657 IRQ_TYPE_LEVEL_HIGH 0>;
+			power-domains = <&spm MT8195_POWER_DOMAIN_VDOSYS0>;
 			clocks = <&vdosys0 CLK_VDO0_DP_INTF0_DP_INTF>,
 				 <&vdosys0  CLK_VDO0_DP_INTF0>,
 				 <&apmixedsys CLK_APMIXED_TVDPLL1>;
-- 
2.45.2



From macpaul.lin at mediatek.com  Wed Sep 25 00:18:07 2024
From: macpaul.lin at mediatek.com (Macpaul Lin)
Date: Wed, 25 Sep 2024 15:18:07 +0800
Subject: [PATCH v2] arm64: dts: mediatek: mt8195: Add power domain for dp_intf0
Message-ID: <20240925071807.19603-1-macpaul.lin@mediatek.com>

During inspecting dtbs_check errors, we found the power domain
setting of DPI node "dp_intf0" is missing. Add power domain setting
to "MT8195_POWER_DOMAIN_VDOSYS0" for "dp_intf0"

Signed-off-by: Tommy Chen <tommyyl.chen at mediatek.com>
Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
---
 arch/arm64/boot/dts/mediatek/mt8195.dtsi | 1 +
 1 file changed, 1 insertion(+)

Changes for v1:
 - This patch is related to adding mt8195-dp-intf to DT schema fix for
  - http://devicetree.org/schemas/display/mediatek/mediatek,dpi.yaml 
  - patch: https://lore.kernel.org/all/20240924103156.13119-6-macpaul.lin at mediatek.com/

Changes for v2:
 - Fix typo for Tommy's email address. Others remains no change.

diff --git a/arch/arm64/boot/dts/mediatek/mt8195.dtsi b/arch/arm64/boot/dts/mediatek/mt8195.dtsi
index ade685ed2190..6218bd7abb05 100644
--- a/arch/arm64/boot/dts/mediatek/mt8195.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8195.dtsi
@@ -3252,6 +3252,7 @@ dp_intf0: dp-intf at 1c015000 {
 			compatible = "mediatek,mt8195-dp-intf";
 			reg = <0 0x1c015000 0 0x1000>;
 			interrupts = <GIC_SPI 657 IRQ_TYPE_LEVEL_HIGH 0>;
+			power-domains = <&spm MT8195_POWER_DOMAIN_VDOSYS0>;
 			clocks = <&vdosys0 CLK_VDO0_DP_INTF0_DP_INTF>,
 				 <&vdosys0  CLK_VDO0_DP_INTF0>,
 				 <&apmixedsys CLK_APMIXED_TVDPLL1>;
-- 
2.45.2



From macpaul.lin at mediatek.com  Wed Sep 25 00:22:33 2024
From: macpaul.lin at mediatek.com (Macpaul Lin)
Date: Wed, 25 Sep 2024 15:22:33 +0800
Subject: [PATCH] arm64: dts: mediatek: mt8195: Add power domain for
 dp_intf0
In-Reply-To: <20240925071514.17626-1-macpaul.lin@mediatek.com>
References: <20240925071514.17626-1-macpaul.lin@mediatek.com>
Message-ID: <47c4b502-0c8d-126e-699f-b59a55d895c3@mediatek.com>


On 9/25/24 15:15, Macpaul Lin wrote:
> During inspecting dtbs_check errors, we found the power domain
> setting of DPI node "dp_intf0" is missing. Add power domain setting
> to "MT8195_POWER_DOMAIN_VDOSYS0" for "dp_intf0"
> 
> Signed-off-by: Tommy Chen <tommytl.chen at mediatek.com>
> Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>

[snip]

Sorry there is a typo in the Signed-off-by.
I'll send v2 to correct this.

Thanks
Macpaul Lin




From ying.huang at intel.com  Wed Sep 25 00:34:22 2024
From: ying.huang at intel.com (Huang, Ying)
Date: Wed, 25 Sep 2024 15:34:22 +0800
Subject: [PATCH 0/2] Add BLK_FEAT_READ_SYNCHRONOUS and
 SWP_READ_SYNCHRONOUS_IO
In-Reply-To: <20240919112952.981-1-qun-wei.lin@mediatek.com> (Qun-Wei Lin's
	message of "Thu, 19 Sep 2024 19:29:50 +0800")
References: <20240919112952.981-1-qun-wei.lin@mediatek.com>
Message-ID: <87frporxtt.fsf@yhuang6-desk2.ccr.corp.intel.com>

Qun-Wei Lin <qun-wei.lin at mediatek.com> writes:

> This patchset introduces 2 new feature flags, BLK_FEAT_READ_SYNCHRONOUS and
> SWP_READ_SYNCHRONOUS_IO.
>
> These changes are motivated by the need to better accommodate certain swap
> devices that support synchronous read operations but asynchronous write
> operations.
>
> The existing BLK_FEAT_SYNCHRONOUS and SWP_SYNCHRONOUS_IO flags are not
> sufficient for these devices, as they enforce synchronous behavior for both
> read and write operations.

Which kind of device needs this?  Read fast, but write slow?

--
Best Regards,
Huang, Ying


From ck.hu at mediatek.com  Wed Sep 25 00:45:57 2024
From: ck.hu at mediatek.com (=?utf-8?B?Q0sgSHUgKOiDoeS/iuWFiSk=?=)
Date: Wed, 25 Sep 2024 07:45:57 +0000
Subject: [PATCH v4] drm/mediatek: ovl: Add fmt_convert function pointer to
 driver data
In-Reply-To: <20240924014935.23677-1-jason-jh.lin@mediatek.com>
References: <20240924014935.23677-1-jason-jh.lin@mediatek.com>
Message-ID: <dbb2722698d3b36100f0ed2bfeec92441cd4ef45.camel@mediatek.com>

Hi, Jason:

On Tue, 2024-09-24 at 09:49 +0800, Jason-JH.Lin wrote:
> OVL_CON_CLRFMT_MAN is a configuration for extending color format
> settings of DISP_REG_OVL_CON(n).
> It will change some of the original color format settings.
> 
> Take the settings of (3 << 12) for example.
> - If OVL_CON_CLRFMT_MAN = 0 means OVL_CON_CLRFMT_RGBA8888.
> - If OVL_CON_CLRFMT_MAN = 1 means OVL_CON_CLRFMT_PARGB8888.
> 
> Since OVL_CON_CLRFMT_MAN is not supported on previous SoCs,
> It breaks the OVL color format setting of MT8173.
> 
> Therefore, the fmt_convert function pointer is added to the driver data
> and mtk_ovl_fmt_convert_with_blend is implemented for MT8192 and MT8195
> that support OVL_CON_CLRFMT_MAN, and mtk_ovl_fmt_convert is implemented
> for other SoCs that do not support it to solve the degradation problem.

This patch looks good to me, so

Reviewed-by: CK Hu <ck.hu at mediatek.com>

By this patch, only some SoC support pre-multiplied pixel format.
In [1], it declare that all SoC support pre-multiplied pixel format, so I think need another patch to let only some SoC support pre-multiplied.

[1] https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/commit/drivers/gpu/drm/mediatek?h=next-20240925&id=4225d5d5e779b859a6661130a3444eb4c5db77e5

> 
> Fixes: a3f7f7ef4bfe ("drm/mediatek: Support "Pre-multiplied" blending in OVL")
> Signed-off-by: Jason-JH.Lin <jason-jh.lin at mediatek.com>
> Tested-by: Alper Nebi Yasak <alpernebiyasak at gmail.com>
> Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
> ---
>  drivers/gpu/drm/mediatek/mtk_disp_ovl.c | 68 ++++++++++++++++++++++---
>  1 file changed, 61 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
> index 89b439dcf3a6..8f7b7e07aeb1 100644
> --- a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
> +++ b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
> @@ -143,6 +143,7 @@ struct mtk_disp_ovl_data {
>  	unsigned int addr;
>  	unsigned int gmc_bits;
>  	unsigned int layer_nr;
> +	unsigned int (*fmt_convert)(struct device *dev, struct mtk_plane_state *state);
>  	bool fmt_rgb565_is_0;
>  	bool smi_id_en;
>  	bool supports_afbc;
> @@ -386,13 +387,59 @@ void mtk_ovl_layer_off(struct device *dev, unsigned int idx,
>  		      DISP_REG_OVL_RDMA_CTRL(idx));
>  }
>  
> -static unsigned int ovl_fmt_convert(struct mtk_disp_ovl *ovl, unsigned int fmt,
> -				    unsigned int blend_mode)
> +static unsigned int mtk_ovl_fmt_convert(struct device *dev, struct mtk_plane_state *state)
>  {
> -	/* The return value in switch "MEM_MODE_INPUT_FORMAT_XXX"
> -	 * is defined in mediatek HW data sheet.
> -	 * The alphabet order in XXX is no relation to data
> -	 * arrangement in memory.
> +	struct mtk_disp_ovl *ovl = dev_get_drvdata(dev);
> +	unsigned int fmt = state->pending.format;
> +
> +	switch (fmt) {
> +	default:
> +	case DRM_FORMAT_RGB565:
> +		return OVL_CON_CLRFMT_RGB565(ovl);
> +	case DRM_FORMAT_BGR565:
> +		return OVL_CON_CLRFMT_RGB565(ovl) | OVL_CON_BYTE_SWAP;
> +	case DRM_FORMAT_RGB888:
> +		return OVL_CON_CLRFMT_RGB888(ovl);
> +	case DRM_FORMAT_BGR888:
> +		return OVL_CON_CLRFMT_RGB888(ovl) | OVL_CON_BYTE_SWAP;
> +	case DRM_FORMAT_RGBX8888:
> +	case DRM_FORMAT_RGBA8888:
> +	case DRM_FORMAT_RGBX1010102:
> +	case DRM_FORMAT_RGBA1010102:
> +		return OVL_CON_CLRFMT_RGBA8888;
> +	case DRM_FORMAT_BGRX8888:
> +	case DRM_FORMAT_BGRA8888:
> +	case DRM_FORMAT_BGRX1010102:
> +	case DRM_FORMAT_BGRA1010102:
> +		return OVL_CON_CLRFMT_BGRA8888;
> +	case DRM_FORMAT_XRGB8888:
> +	case DRM_FORMAT_ARGB8888:
> +	case DRM_FORMAT_XRGB2101010:
> +	case DRM_FORMAT_ARGB2101010:
> +		return OVL_CON_CLRFMT_ARGB8888;
> +	case DRM_FORMAT_XBGR8888:
> +	case DRM_FORMAT_ABGR8888:
> +	case DRM_FORMAT_XBGR2101010:
> +	case DRM_FORMAT_ABGR2101010:
> +		return OVL_CON_CLRFMT_ABGR8888;
> +	case DRM_FORMAT_UYVY:
> +		return OVL_CON_CLRFMT_UYVY | OVL_CON_MTX_YUV_TO_RGB;
> +	case DRM_FORMAT_YUYV:
> +		return OVL_CON_CLRFMT_YUYV | OVL_CON_MTX_YUV_TO_RGB;
> +	}
> +}
> +
> +static unsigned int mtk_ovl_fmt_convert_with_blend(struct device *dev,
> +						   struct mtk_plane_state *state)
> +{
> +	struct mtk_disp_ovl *ovl = dev_get_drvdata(dev);
> +	unsigned int fmt = state->pending.format;
> +	unsigned int blend_mode = state->base.pixel_blend_mode;
> +
> +	/*
> +	 * For the platforms where OVL_CON_CLRFMT_MAN is defined in the
> +	 * hardware data sheet and supports premultiplied color formats
> +	 * such as OVL_CON_CLRFMT_PARGB8888.
>  	 */
>  	switch (fmt) {
>  	default:
> @@ -471,7 +518,7 @@ void mtk_ovl_layer_config(struct device *dev, unsigned int idx,
>  		return;
>  	}
>  
> -	con = ovl_fmt_convert(ovl, fmt, blend_mode);
> +	con = ovl->data->fmt_convert(dev, state);
>  	if (state->base.fb) {
>  		con |= OVL_CON_AEN;
>  		con |= state->base.alpha & OVL_CON_ALPHA;
> @@ -625,6 +672,7 @@ static const struct mtk_disp_ovl_data mt2701_ovl_driver_data = {
>  	.addr = DISP_REG_OVL_ADDR_MT2701,
>  	.gmc_bits = 8,
>  	.layer_nr = 4,
> +	.fmt_convert = mtk_ovl_fmt_convert,
>  	.fmt_rgb565_is_0 = false,
>  	.formats = mt8173_formats,
>  	.num_formats = ARRAY_SIZE(mt8173_formats),
> @@ -634,6 +682,7 @@ static const struct mtk_disp_ovl_data mt8173_ovl_driver_data = {
>  	.addr = DISP_REG_OVL_ADDR_MT8173,
>  	.gmc_bits = 8,
>  	.layer_nr = 4,
> +	.fmt_convert = mtk_ovl_fmt_convert,
>  	.fmt_rgb565_is_0 = true,
>  	.formats = mt8173_formats,
>  	.num_formats = ARRAY_SIZE(mt8173_formats),
> @@ -643,6 +692,7 @@ static const struct mtk_disp_ovl_data mt8183_ovl_driver_data = {
>  	.addr = DISP_REG_OVL_ADDR_MT8173,
>  	.gmc_bits = 10,
>  	.layer_nr = 4,
> +	.fmt_convert = mtk_ovl_fmt_convert,
>  	.fmt_rgb565_is_0 = true,
>  	.formats = mt8173_formats,
>  	.num_formats = ARRAY_SIZE(mt8173_formats),
> @@ -652,6 +702,7 @@ static const struct mtk_disp_ovl_data mt8183_ovl_2l_driver_data = {
>  	.addr = DISP_REG_OVL_ADDR_MT8173,
>  	.gmc_bits = 10,
>  	.layer_nr = 2,
> +	.fmt_convert = mtk_ovl_fmt_convert,
>  	.fmt_rgb565_is_0 = true,
>  	.formats = mt8173_formats,
>  	.num_formats = ARRAY_SIZE(mt8173_formats),
> @@ -661,6 +712,7 @@ static const struct mtk_disp_ovl_data mt8192_ovl_driver_data = {
>  	.addr = DISP_REG_OVL_ADDR_MT8173,
>  	.gmc_bits = 10,
>  	.layer_nr = 4,
> +	.fmt_convert = mtk_ovl_fmt_convert_with_blend,
>  	.fmt_rgb565_is_0 = true,
>  	.smi_id_en = true,
>  	.formats = mt8173_formats,
> @@ -671,6 +723,7 @@ static const struct mtk_disp_ovl_data mt8192_ovl_2l_driver_data = {
>  	.addr = DISP_REG_OVL_ADDR_MT8173,
>  	.gmc_bits = 10,
>  	.layer_nr = 2,
> +	.fmt_convert = mtk_ovl_fmt_convert_with_blend,
>  	.fmt_rgb565_is_0 = true,
>  	.smi_id_en = true,
>  	.formats = mt8173_formats,
> @@ -681,6 +734,7 @@ static const struct mtk_disp_ovl_data mt8195_ovl_driver_data = {
>  	.addr = DISP_REG_OVL_ADDR_MT8173,
>  	.gmc_bits = 10,
>  	.layer_nr = 4,
> +	.fmt_convert = mtk_ovl_fmt_convert_with_blend,
>  	.fmt_rgb565_is_0 = true,
>  	.smi_id_en = true,
>  	.supports_afbc = true,

From angelogioacchino.delregno at collabora.com  Wed Sep 25 00:46:35 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Wed, 25 Sep 2024 09:46:35 +0200
Subject: [PATCH] soc: mediatek: mtk-svs: Call of_node_put(np) only once in
 svs_get_subsys_device()
In-Reply-To: <884f0a5d-e6d3-47dc-8a9e-201bb86b271f@web.de>
References: <884f0a5d-e6d3-47dc-8a9e-201bb86b271f@web.de>
Message-ID: <32e9ec0e-5ba6-4653-adf7-ccd0af7d58a9@collabora.com>

Il 24/09/24 20:08, Markus Elfring ha scritto:
> From: Markus Elfring <elfring at users.sourceforge.net>
> Date: Tue, 24 Sep 2024 20:00:09 +0200
> 
> An of_node_put(np) call was immediately used after a pointer check
> for a of_find_device_by_node() call in this function implementation.
> Thus call such a function only once instead directly before the check.
> 
> This issue was transformed by using the Coccinelle software.
> 
> Signed-off-by: Markus Elfring <elfring at users.sourceforge.net>

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>

> ---
>   drivers/soc/mediatek/mtk-svs.c | 4 +---
>   1 file changed, 1 insertion(+), 3 deletions(-)
> 
> diff --git a/drivers/soc/mediatek/mtk-svs.c b/drivers/soc/mediatek/mtk-svs.c
> index 9a91298c1253..7c349a94b45c 100644
> --- a/drivers/soc/mediatek/mtk-svs.c
> +++ b/drivers/soc/mediatek/mtk-svs.c
> @@ -2133,14 +2133,12 @@ static struct device *svs_get_subsys_device(struct svs_platform *svsp,
>   	}
> 
>   	pdev = of_find_device_by_node(np);
> +	of_node_put(np);
>   	if (!pdev) {
> -		of_node_put(np);
>   		dev_err(svsp->dev, "cannot find pdev by %s\n", node_name);
>   		return ERR_PTR(-ENXIO);
>   	}
> 
> -	of_node_put(np);
> -
>   	return &pdev->dev;
>   }
> 
> --
> 2.46.1
> 



From angelogioacchino.delregno at collabora.com  Wed Sep 25 00:52:44 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Wed, 25 Sep 2024 09:52:44 +0200
Subject: [PATCH 0/4] Provide devm_clk_bulk_get_all_enabled() helper
In-Reply-To: <20240924143634.pqpdsewoqxn3liqi@thinkpad>
References: <20240914-clk_bulk_ena_fix-v1-0-ce3537585c06@collabora.com>
 <20240924143634.pqpdsewoqxn3liqi@thinkpad>
Message-ID: <70a24964-990b-4606-bdc8-4dd42c44785a@collabora.com>

Il 24/09/24 16:36, Manivannan Sadhasivam ha scritto:
> On Sat, Sep 14, 2024 at 09:04:53PM +0300, Cristian Ciocaltea wrote:
>> Commit 265b07df758a ("clk: Provide managed helper to get and enable bulk
>> clocks") added devm_clk_bulk_get_all_enable() function, but missed to
>> return the number of clocks stored in the clk_bulk_data table referenced
>> by the clks argument.
>>
>> That is required in case there is a need to iterate these clocks later,
>> therefore I couldn't see any use case of this parameter and should have
>> been simply removed from the function declaration.
>>
> 
> Is there an user that currerntly does this?
> 

Yes and the patch wasn't sent upstream yet, but anyway, regardless of that,
this series is fixing inconsistency with both naming and usage between the
clock (bulk) API functions, with that being the only function acting
different from the others, at best confusing people.

Cheers,
Angelo

> - Mani
> 
>> The first patch in the series provides devm_clk_bulk_get_all_enabled()
>> variant, which is consistent with devm_clk_bulk_get_all() in terms of
>> the returned value:
>>
>>   > 0 if one or more clocks have been stored
>>   = 0 if there are no clocks
>>   < 0 if an error occurred
>>
>> Moreover, the naming is consistent with devm_clk_get_enabled(), i.e. use
>> the past form of 'enable'.
>>
>> The next two patches switch existing users of devm_clk_get_enable() to
>> the new helper - there were only two, as of next-20240913.
>>
>> The last patch drops the now obsolete devm_clk_bulk_get_all_enable()
>> helper.
>>
>> Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea at collabora.com>
>> ---
>> Cristian Ciocaltea (4):
>>        clk: Provide devm_clk_bulk_get_all_enabled() helper
>>        soc: mediatek: pwrap: Switch to devm_clk_bulk_get_all_enabled()
>>        PCI: exynos: Switch to devm_clk_bulk_get_all_enabled()
>>        clk: Drop obsolete devm_clk_bulk_get_all_enable() helper
>>
>>   drivers/clk/clk-devres.c                | 30 ++++++++++++++++--------------
>>   drivers/pci/controller/dwc/pci-exynos.c |  2 +-
>>   drivers/soc/mediatek/mtk-pmic-wrap.c    |  4 ++--
>>   include/linux/clk.h                     | 12 +++++++-----
>>   4 files changed, 26 insertions(+), 22 deletions(-)
>> ---
>> base-commit: 5acd9952f95fb4b7da6d09a3be39195a80845eb6
>> change-id: 20240912-clk_bulk_ena_fix-16ba77358ddf
>>
> 




From angelogioacchino.delregno at collabora.com  Wed Sep 25 00:54:13 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Wed, 25 Sep 2024 09:54:13 +0200
Subject: [PATCH] arm64: dts: mediatek: mt8195: Add power domain for
 dp_intf0
In-Reply-To: <20240925071514.17626-1-macpaul.lin@mediatek.com>
References: <20240925071514.17626-1-macpaul.lin@mediatek.com>
Message-ID: <7e57ea01-f881-4c6a-95e7-96ab56dbc455@collabora.com>

Il 25/09/24 09:15, Macpaul Lin ha scritto:
> During inspecting dtbs_check errors, we found the power domain
> setting of DPI node "dp_intf0" is missing. Add power domain setting
> to "MT8195_POWER_DOMAIN_VDOSYS0" for "dp_intf0"
> 
> Signed-off-by: Tommy Chen <tommytl.chen at mediatek.com>
> Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>

You missed a Suggested-by tag here :-)

after which,

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>




From macpaul.lin at mediatek.com  Wed Sep 25 00:56:42 2024
From: macpaul.lin at mediatek.com (Macpaul Lin)
Date: Wed, 25 Sep 2024 15:56:42 +0800
Subject: [PATCH] arm64: dts: mediatek: mt8195: Add power domain for
 dp_intf0
In-Reply-To: <7e57ea01-f881-4c6a-95e7-96ab56dbc455@collabora.com>
References: <20240925071514.17626-1-macpaul.lin@mediatek.com>
 <7e57ea01-f881-4c6a-95e7-96ab56dbc455@collabora.com>
Message-ID: <9e51fdad-382c-5889-7986-7e0373eb0918@mediatek.com>



On 9/25/24 15:54, AngeloGioacchino Del Regno wrote:
> Il 25/09/24 09:15, Macpaul Lin ha scritto:
>> During inspecting dtbs_check errors, we found the power domain
>> setting of DPI node "dp_intf0" is missing. Add power domain setting
>> to "MT8195_POWER_DOMAIN_VDOSYS0" for "dp_intf0"
>>
>> Signed-off-by: Tommy Chen <tommytl.chen at mediatek.com>
>> Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
> 
> You missed a Suggested-by tag here :-)
> 
> after which,
> 
> Reviewed-by: AngeloGioacchino Del Regno 
> <angelogioacchino.delregno at collabora.com>
> 

Got it! I'll send v3 update later.

Thanks
Macpaul Lin


From manivannan.sadhasivam at linaro.org  Wed Sep 25 00:56:54 2024
From: manivannan.sadhasivam at linaro.org (Manivannan Sadhasivam)
Date: Wed, 25 Sep 2024 09:56:54 +0200
Subject: [PATCH 0/4] Provide devm_clk_bulk_get_all_enabled() helper
In-Reply-To: <70a24964-990b-4606-bdc8-4dd42c44785a@collabora.com>
References: <20240914-clk_bulk_ena_fix-v1-0-ce3537585c06@collabora.com>
 <20240924143634.pqpdsewoqxn3liqi@thinkpad>
 <70a24964-990b-4606-bdc8-4dd42c44785a@collabora.com>
Message-ID: <20240925075654.f2pefosdspqiakvj@thinkpad>

On Wed, Sep 25, 2024 at 09:52:44AM +0200, AngeloGioacchino Del Regno wrote:
> Il 24/09/24 16:36, Manivannan Sadhasivam ha scritto:
> > On Sat, Sep 14, 2024 at 09:04:53PM +0300, Cristian Ciocaltea wrote:
> > > Commit 265b07df758a ("clk: Provide managed helper to get and enable bulk
> > > clocks") added devm_clk_bulk_get_all_enable() function, but missed to
> > > return the number of clocks stored in the clk_bulk_data table referenced
> > > by the clks argument.
> > > 
> > > That is required in case there is a need to iterate these clocks later,
> > > therefore I couldn't see any use case of this parameter and should have
> > > been simply removed from the function declaration.
> > > 
> > 
> > Is there an user that currerntly does this?
> > 
> 
> Yes and the patch wasn't sent upstream yet, but anyway, regardless of that,
> this series is fixing inconsistency with both naming and usage between the
> clock (bulk) API functions, with that being the only function acting
> different from the others, at best confusing people.
> 

I agree with the 'inconsistency' part of the API, but I wouldn't call it as
*broken* as this series does. Please fix that and you can have my:

Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam at linaro.org>

- Mani

> Cheers,
> Angelo
> 
> > - Mani
> > 
> > > The first patch in the series provides devm_clk_bulk_get_all_enabled()
> > > variant, which is consistent with devm_clk_bulk_get_all() in terms of
> > > the returned value:
> > > 
> > >   > 0 if one or more clocks have been stored
> > >   = 0 if there are no clocks
> > >   < 0 if an error occurred
> > > 
> > > Moreover, the naming is consistent with devm_clk_get_enabled(), i.e. use
> > > the past form of 'enable'.
> > > 
> > > The next two patches switch existing users of devm_clk_get_enable() to
> > > the new helper - there were only two, as of next-20240913.
> > > 
> > > The last patch drops the now obsolete devm_clk_bulk_get_all_enable()
> > > helper.
> > > 
> > > Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea at collabora.com>
> > > ---
> > > Cristian Ciocaltea (4):
> > >        clk: Provide devm_clk_bulk_get_all_enabled() helper
> > >        soc: mediatek: pwrap: Switch to devm_clk_bulk_get_all_enabled()
> > >        PCI: exynos: Switch to devm_clk_bulk_get_all_enabled()
> > >        clk: Drop obsolete devm_clk_bulk_get_all_enable() helper
> > > 
> > >   drivers/clk/clk-devres.c                | 30 ++++++++++++++++--------------
> > >   drivers/pci/controller/dwc/pci-exynos.c |  2 +-
> > >   drivers/soc/mediatek/mtk-pmic-wrap.c    |  4 ++--
> > >   include/linux/clk.h                     | 12 +++++++-----
> > >   4 files changed, 26 insertions(+), 22 deletions(-)
> > > ---
> > > base-commit: 5acd9952f95fb4b7da6d09a3be39195a80845eb6
> > > change-id: 20240912-clk_bulk_ena_fix-16ba77358ddf
> > > 
> > 
> 
> 

-- 
????????? ????????


From jens.wiklander at linaro.org  Wed Sep 25 00:58:17 2024
From: jens.wiklander at linaro.org (Jens Wiklander)
Date: Wed, 25 Sep 2024 09:58:17 +0200
Subject: [RFC PATCH 0/4] Linaro restricted heap
In-Reply-To: <d8e0cb78-7cfb-42bf-b3a5-f765592e8dd4@ti.com>
References: <20240830070351.2855919-1-jens.wiklander@linaro.org>
 <dhxvyshwi4qmcmwceokhqey2ww4azjcs6qrpnkgivdj7tv5cke@r36srvvbof6q>
 <d8e0cb78-7cfb-42bf-b3a5-f765592e8dd4@ti.com>
Message-ID: <20240925075817.GB3519798@rayden>

Hi,

On Tue, Sep 24, 2024 at 01:13:18PM -0500, Andrew Davis wrote:
> On 9/23/24 1:33 AM, Dmitry Baryshkov wrote:
> > Hi,
> > 
> > On Fri, Aug 30, 2024 at 09:03:47AM GMT, Jens Wiklander wrote:
> > > Hi,
> > > 
> > > This patch set is based on top of Yong Wu's restricted heap patch set [1].
> > > It's also a continuation on Olivier's Add dma-buf secure-heap patch set [2].
> > > 
> > > The Linaro restricted heap uses genalloc in the kernel to manage the heap
> > > carvout. This is a difference from the Mediatek restricted heap which
> > > relies on the secure world to manage the carveout.
> > > 
> > > I've tried to adress the comments on [2], but [1] introduces changes so I'm
> > > afraid I've had to skip some comments.
> > 
> > I know I have raised the same question during LPC (in connection to
> > Qualcomm's dma-heap implementation). Is there any reason why we are
> > using generic heaps instead of allocating the dma-bufs on the device
> > side?
> > 
> > In your case you already have TEE device, you can use it to allocate and
> > export dma-bufs, which then get imported by the V4L and DRM drivers.
> > 
> 
> This goes to the heart of why we have dma-heaps in the first place.
> We don't want to burden userspace with having to figure out the right
> place to get a dma-buf for a given use-case on a given hardware.
> That would be very non-portable, and fail at the core purpose of
> a kernel: to abstract hardware specifics away.
> 
> Worse, the actual interface for dma-buf exporting changes from
> framework to framework (getting a dma-buf from DRM is different
> than V4L, and there would be yet another API for TEE, etc..)
> 
> Most subsystem don't need an allocator, they work just fine
> simply being only dma-bufs importers. Recent example being the
> IIO subsystem[0], for which some early posting included an
> allocator, but in the end, all that was needed was to consume
> buffers.
> 
> For devices that don't actually contain memory there is no
> reason to be an exporter. What most want is just to consume
> normal system memory. Or system memory with some constraints
> (e.g. contiguous, coherent, restricted, etc..).
> 
> > I have a feeling (I might be completely wrong here) that by using
> > generic dma-buf heaps we can easily end up in a situation when the
> > userspace depends heavily on the actual platform being used (to map the
> > platform to heap names). I think we should instead depend on the
> > existing devices (e.g. if there is a TEE device, use an IOCTL to
> > allocate secured DMA BUF from it, otherwise check for QTEE device,
> > otherwise check for some other vendor device).
> > 
> > The mental experiment to check if the API is correct is really simple:
> > Can you use exactly the same rootfs on several devices without
> > any additional tuning (e.g. your QEMU, HiKey, a Mediatek board, Qualcomm
> > laptop, etc)?
> > 
> 
> This is a great north star to follow. And exactly the reason we should
> *not* be exposing device specific constraints to userspace. The constrains
> change based on the platform. So a userspace would have to also pick
> a different set of constraints based on each platform.
> 
> Userspace knows which subsystems it will attach a buffer, and the
> kernel knows what constraints those devices have on a given platform.
> Ideal case is then allocate from the one exporter, attach to various
> devices, and have the constraints solved at map time by the exporter
> based on the set of attached devices.
> 
> For example, on one platform the display needs contiguous buffers,
> but on a different platform the display can scatter-gather. So
> what heap should our generic application allocate from when it
> wants a buffer consumable by the display, CMA or System?
> Answer *should* be always use the generic exporter, and that
> exporter then picks the right backing type based on the platform.
> 
> Userspace shouldn't be dealing with any of these constraints
> (looking back, adding the CMA heap was probably incorrect,
> and the System heap should have been the only one. Idea back
> then was a userspace helper would show up to do the constraint
> solving and pick the right heap. That has yet to materialize and
> folks are still just hardcoding which heap to use..).
> 
> Same for this restricted heap, I'd like to explore if we can
> enhance the System heap such that when attached to the TEE framework,
> the backing memory is either made restricted by fire-walling,
> or allocating from a TEE carveout (based on platform).

So the exporter (you mentioned System heap) will somehow know how to
interact with the TEE subsystem to allocate suitable memory?

I suppose the memory could be from a static carveout, dynamic restricted
memory allocation, or how to turn normal memory into restricted memory
(fire-walling), depending on the platform.

> 
> This will mean more inter-subsystem coordination, but we can
> iterate on these in kernel interfaces. We cannot iterate on
> userspace interfaces, those have to be correct the first time.

Good point, this approach should make it easier for userspace.

Thanks,
Jens

> 
> Andrew
> 
> [0] https://www.kernel.org/doc/html/next/iio/iio_dmabuf_api.html
> 
> > > 
> > > This can be tested on QEMU with the following steps:
> > > repo init -u https://github.com/jenswi-linaro/manifest.git -m qemu_v8.xml \
> > >          -b prototype/sdp-v1
> > > repo sync -j8
> > > cd build
> > > make toolchains -j4
> > > make all -j$(nproc)
> > > make run-only
> > > # login and at the prompt:
> > > xtest --sdp-basic
> > > 
> > > https://optee.readthedocs.io/en/latest/building/prerequisites.html
> > > list dependencies needed to build the above.
> > > 
> > > The tests are pretty basic, mostly checking that a Trusted Application in
> > > the secure world can access and manipulate the memory.
> > 
> > - Can we test that the system doesn't crash badly if user provides
> >    non-secured memory to the users which expect a secure buffer?
> > 
> > - At the same time corresponding entities shouldn't decode data to the
> >    buffers accessible to the rest of the sytem.
> > 
> > > 
> > > Cheers,
> > > Jens
> > > 
> > > [1] https://lore.kernel.org/dri-devel/20240515112308.10171-1-yong.wu at mediatek.com/
> > > [2] https://lore.kernel.org/lkml/20220805135330.970-1-olivier.masse at nxp.com/
> > > 
> > > Changes since Olivier's post [2]:
> > > * Based on Yong Wu's post [1] where much of dma-buf handling is done in
> > >    the generic restricted heap
> > > * Simplifications and cleanup
> > > * New commit message for "dma-buf: heaps: add Linaro restricted dmabuf heap
> > >    support"
> > > * Replaced the word "secure" with "restricted" where applicable
> > > 
> > > Etienne Carriere (1):
> > >    tee: new ioctl to a register tee_shm from a dmabuf file descriptor
> > > 
> > > Jens Wiklander (2):
> > >    dma-buf: heaps: restricted_heap: add no_map attribute
> > >    dma-buf: heaps: add Linaro restricted dmabuf heap support
> > > 
> > > Olivier Masse (1):
> > >    dt-bindings: reserved-memory: add linaro,restricted-heap
> > > 
> > >   .../linaro,restricted-heap.yaml               |  56 ++++++
> > >   drivers/dma-buf/heaps/Kconfig                 |  10 ++
> > >   drivers/dma-buf/heaps/Makefile                |   1 +
> > >   drivers/dma-buf/heaps/restricted_heap.c       |  17 +-
> > >   drivers/dma-buf/heaps/restricted_heap.h       |   2 +
> > >   .../dma-buf/heaps/restricted_heap_linaro.c    | 165 ++++++++++++++++++
> > >   drivers/tee/tee_core.c                        |  38 ++++
> > >   drivers/tee/tee_shm.c                         | 104 ++++++++++-
> > >   include/linux/tee_drv.h                       |  11 ++
> > >   include/uapi/linux/tee.h                      |  29 +++
> > >   10 files changed, 426 insertions(+), 7 deletions(-)
> > >   create mode 100644 Documentation/devicetree/bindings/reserved-memory/linaro,restricted-heap.yaml
> > >   create mode 100644 drivers/dma-buf/heaps/restricted_heap_linaro.c
> > > 
> > > -- 
> > > 2.34.1
> > > 
> > 


From helen.koike at collabora.com  Wed Sep 25 00:59:46 2024
From: helen.koike at collabora.com (Helen Mae Koike Fornazier)
Date: Wed, 25 Sep 2024 04:59:46 -0300
Subject: [PATCH v2] drm/ci: uprev mesa, IGT and deqp-runner
In-Reply-To: <20240910131927.161883-1-vignesh.raman@collabora.com>
References: <20240910131927.161883-1-vignesh.raman@collabora.com>
Message-ID: <19228318469.adfeb096209317.6744453569978518355@collabora.com>






---- On Tue, 10 Sep 2024 10:19:24 -0300 Vignesh Raman  wrote ---

 > Uprev mesa, IGT to the latest version and deqp-runner 
 > to v0.20.0. Also update expectation files. 
 >  
 > Acked-by: Helen Koike helen.koike at collabora.com> 
 > Reviewed-by: Daniel Stone daniels at collabora.com> 
 > Signed-off-by: Vignesh Raman vignesh.raman at collabora.com> 

Applied to drm-misc-next.

Thanks!
Helen

 > --- 
 >  
 > v1: 
 > - Flaky test report will be sent to maintainers after this 
 >  patch series is reviewed. 
 >  
 > v2: 
 > - Uprev mesa and rerun with latest drm-misc-next. 
 >  Updated flaky tests bug report link. 
 >  
 > --- 
 >  drivers/gpu/drm/ci/gitlab-ci.yml              | 14 +++-- 
 >  drivers/gpu/drm/ci/image-tags.yml             |  2 +- 
 >  .../gpu/drm/ci/xfails/amdgpu-stoney-fails.txt |  2 +- 
 >  .../drm/ci/xfails/amdgpu-stoney-flakes.txt    |  7 +++ 
 >  drivers/gpu/drm/ci/xfails/i915-amly-fails.txt |  2 +- 
 >  .../gpu/drm/ci/xfails/i915-amly-flakes.txt    |  7 +++ 
 >  drivers/gpu/drm/ci/xfails/i915-apl-fails.txt  |  1 - 
 >  drivers/gpu/drm/ci/xfails/i915-apl-flakes.txt |  7 +++ 
 >  drivers/gpu/drm/ci/xfails/i915-cml-fails.txt  | 10 ++-- 
 >  drivers/gpu/drm/ci/xfails/i915-cml-flakes.txt | 14 +++++ 
 >  drivers/gpu/drm/ci/xfails/i915-glk-fails.txt  |  1 + 
 >  drivers/gpu/drm/ci/xfails/i915-kbl-fails.txt  |  2 - 
 >  drivers/gpu/drm/ci/xfails/i915-tgl-fails.txt  | 34 ++++++++++-- 
 >  drivers/gpu/drm/ci/xfails/i915-whl-fails.txt  |  9 ++-- 
 >  .../drm/ci/xfails/mediatek-mt8173-fails.txt   | 11 +--- 
 >  .../drm/ci/xfails/mediatek-mt8183-fails.txt   |  6 --- 
 >  .../gpu/drm/ci/xfails/meson-g12b-fails.txt    |  1 - 
 >  .../gpu/drm/ci/xfails/msm-apq8016-fails.txt   |  5 -- 
 >  .../gpu/drm/ci/xfails/msm-apq8096-fails.txt   |  5 -- 
 >  .../msm-sc7180-trogdor-kingoftown-fails.txt   | 27 ---------- 
 >  ...sm-sc7180-trogdor-lazor-limozeen-fails.txt | 27 ---------- 
 >  .../gpu/drm/ci/xfails/msm-sdm845-fails.txt    |  6 +-- 
 >  .../gpu/drm/ci/xfails/msm-sdm845-flakes.txt   | 14 +++++ 
 >  .../gpu/drm/ci/xfails/msm-sdm845-skips.txt    |  5 ++ 
 >  .../gpu/drm/ci/xfails/panfrost-g12b-fails.txt |  1 + 
 >  .../drm/ci/xfails/panfrost-mt8183-fails.txt   |  1 + 
 >  .../drm/ci/xfails/panfrost-rk3288-fails.txt   |  1 + 
 >  .../drm/ci/xfails/panfrost-rk3399-fails.txt   |  1 + 
 >  .../drm/ci/xfails/rockchip-rk3288-fails.txt   | 22 +++++--- 
 >  .../drm/ci/xfails/rockchip-rk3288-flakes.txt  | 28 ++++++++++ 
 >  .../drm/ci/xfails/rockchip-rk3399-fails.txt   |  7 --- 
 >  .../drm/ci/xfails/rockchip-rk3399-flakes.txt  | 28 ++++++++++ 
 >  drivers/gpu/drm/ci/xfails/vkms-none-fails.txt | 21 -------- 
 >  drivers/gpu/drm/ci/xfails/vkms-none-skips.txt | 53 +++++++++++++++++++ 
 >  34 files changed, 234 insertions(+), 148 deletions(-) 
 >  
 > diff --git a/drivers/gpu/drm/ci/gitlab-ci.yml b/drivers/gpu/drm/ci/gitlab-ci.yml 
 > index eca47d4f816f..90bde9f00cc3 100644 
 > --- a/drivers/gpu/drm/ci/gitlab-ci.yml 
 > +++ b/drivers/gpu/drm/ci/gitlab-ci.yml 
 > @@ -1,14 +1,14 @@ 
 >  variables: 
 >  DRM_CI_PROJECT_PATH: &drm-ci-project-path mesa/mesa 
 > -  DRM_CI_COMMIT_SHA: &drm-ci-commit-sha d9849ac46623797a9f56fb9d46dc52460ac477de 
 > +  DRM_CI_COMMIT_SHA: &drm-ci-commit-sha c6a9a9c3bce90923f7700219354e0b6e5a3c9ba6 
 >  
 >  UPSTREAM_REPO: https://gitlab.freedesktop.org/drm/kernel.git 
 >  TARGET_BRANCH: drm-next 
 >  
 > -  IGT_VERSION: f13702b8e4e847c56da3ef6f0969065d686049c5 
 > +  IGT_VERSION: a73311079a5d8ac99eb25336a8369a2c3c6b519b 
 >  
 >  DEQP_RUNNER_GIT_URL: https://gitlab.freedesktop.org/mesa/deqp-runner.git 
 > -  DEQP_RUNNER_GIT_TAG: v0.15.0 
 > +  DEQP_RUNNER_GIT_TAG: v0.20.0 
 >  
 >  FDO_UPSTREAM_REPO: helen.fornazier/linux   # The repo where the git-archive daily runs 
 >  MESA_TEMPLATES_COMMIT: &ci-templates-commit d5aa3941aa03c2f716595116354fb81eb8012acb 
 > @@ -153,6 +153,14 @@ stages: 
 >  # Pre-merge pipeline for Marge Bot 
 >  - if: &is-pre-merge-for-marge '$GITLAB_USER_LOGIN == "marge-bot" && $CI_PIPELINE_SOURCE == "merge_request_event"' 
 >  when: on_success 
 > +    # Push to a branch on a fork 
 > +    - &is-fork-push '$CI_PROJECT_NAMESPACE != "mesa" && $CI_PIPELINE_SOURCE == "push"' 
 > + 
 > +# Rules applied to every job in the pipeline 
 > +.common-rules: 
 > +  rules: 
 > +    - if: *is-fork-push 
 > +      when: manual 
 >  
 >  .never-post-merge-rules: 
 >  rules: 
 > diff --git a/drivers/gpu/drm/ci/image-tags.yml b/drivers/gpu/drm/ci/image-tags.yml 
 > index 2c340d063a96..8d8b9e71852e 100644 
 > --- a/drivers/gpu/drm/ci/image-tags.yml 
 > +++ b/drivers/gpu/drm/ci/image-tags.yml 
 > @@ -1,5 +1,5 @@ 
 >  variables: 
 > -   CONTAINER_TAG: "2024-08-07-mesa-uprev" 
 > +   CONTAINER_TAG: "2024-09-09-uprevs" 
 >  DEBIAN_X86_64_BUILD_BASE_IMAGE: "debian/x86_64_build-base" 
 >  DEBIAN_BASE_TAG: "${CONTAINER_TAG}" 
 >  
 > diff --git a/drivers/gpu/drm/ci/xfails/amdgpu-stoney-fails.txt b/drivers/gpu/drm/ci/xfails/amdgpu-stoney-fails.txt 
 > index 8e2fed6d76a3..f44dbce3151a 100644 
 > --- a/drivers/gpu/drm/ci/xfails/amdgpu-stoney-fails.txt 
 > +++ b/drivers/gpu/drm/ci/xfails/amdgpu-stoney-fails.txt 
 > @@ -2,6 +2,7 @@ amdgpu/amd_abm at abm_enabled,Fail 
 >  amdgpu/amd_abm at abm_gradual,Fail 
 >  amdgpu/amd_abm at backlight_monotonic_abm,Fail 
 >  amdgpu/amd_abm at backlight_monotonic_basic,Fail 
 > +amdgpu/amd_abm at dpms_cycle,Fail 
 >  amdgpu/amd_assr at assr-links,Fail 
 >  amdgpu/amd_assr at assr-links-dpms,Fail 
 >  amdgpu/amd_mall at static-screen,Crash 
 > @@ -14,7 +15,6 @@ amdgpu/amd_plane at mpo-scale-p010,Fail 
 >  amdgpu/amd_plane at mpo-scale-rgb,Crash 
 >  amdgpu/amd_plane at mpo-swizzle-toggle,Fail 
 >  amdgpu/amd_uvd_dec at amdgpu_uvd_decode,Fail 
 > -dumb_buffer at invalid-bpp,Fail 
 >  kms_addfb_basic at bad-pitch-65536,Fail 
 >  kms_addfb_basic at bo-too-small,Fail 
 >  kms_addfb_basic at too-high,Fail 
 > diff --git a/drivers/gpu/drm/ci/xfails/amdgpu-stoney-flakes.txt b/drivers/gpu/drm/ci/xfails/amdgpu-stoney-flakes.txt 
 > index e4faa96fa000..e70bd9d447ca 100644 
 > --- a/drivers/gpu/drm/ci/xfails/amdgpu-stoney-flakes.txt 
 > +++ b/drivers/gpu/drm/ci/xfails/amdgpu-stoney-flakes.txt 
 > @@ -18,3 +18,10 @@ kms_async_flips at crc 
 >  # IGT Version: 1.28-g0df7b9b97 
 >  # Linux Version: 6.9.0-rc7 
 >  kms_plane at pixel-format-source-clamping 
 > + 
 > +# Board Name: hp-11A-G6-EE-grunt 
 > +# Bug Report: https://lore.kernel.org/amd-gfx/09ee1862-3a0e-4085-ac1b-262601b1122b at collabora.com/T/#t 
 > +# Failure Rate: 100 
 > +# IGT Version: 1.28-ga73311079 
 > +# Linux Version: 6.11.0-rc2 
 > +kms_async_flips at async-flip-with-page-flip-events 
 > diff --git a/drivers/gpu/drm/ci/xfails/i915-amly-fails.txt b/drivers/gpu/drm/ci/xfails/i915-amly-fails.txt 
 > index 9b84f68a5122..0907cb0f6d9e 100644 
 > --- a/drivers/gpu/drm/ci/xfails/i915-amly-fails.txt 
 > +++ b/drivers/gpu/drm/ci/xfails/i915-amly-fails.txt 
 > @@ -1,3 +1,4 @@ 
 > +core_setmaster at master-drop-set-shared-fd,Fail 
 >  core_setmaster at master-drop-set-user,Fail 
 >  core_setmaster_vs_auth,Fail 
 >  i915_module_load at load,Fail 
 > @@ -6,7 +7,6 @@ i915_module_load at reload-no-display,Fail 
 >  i915_module_load at resize-bar,Fail 
 >  i915_pm_rpm at gem-execbuf-stress,Timeout 
 >  i915_pm_rpm at module-reload,Fail 
 > -kms_ccs at crc-primary-rotation-180-yf-tiled-ccs,Timeout 
 >  kms_cursor_legacy at short-flip-before-cursor-atomic-transitions,Timeout 
 >  kms_fb_coherency at memset-crc,Crash 
 >  kms_flip at busy-flip,Timeout 
 > diff --git a/drivers/gpu/drm/ci/xfails/i915-amly-flakes.txt b/drivers/gpu/drm/ci/xfails/i915-amly-flakes.txt 
 > index 581f0da4d0f2..0207c9807bee 100644 
 > --- a/drivers/gpu/drm/ci/xfails/i915-amly-flakes.txt 
 > +++ b/drivers/gpu/drm/ci/xfails/i915-amly-flakes.txt 
 > @@ -46,3 +46,10 @@ i915_hangman at engine-engine-hang 
 >  # IGT Version: 1.28-gf13702b8e 
 >  # Linux Version: 6.10.0-rc5 
 >  kms_pm_rpm at modeset-lpsp-stress 
 > + 
 > +# Board Name: asus-C433TA-AJ0005-rammus 
 > +# Bug Report: https://lore.kernel.org/intel-gfx/61f62c86-3e82-4eff-bd3c-8123fa0ca332 at collabora.com/T/#t 
 > +# Failure Rate: 50 
 > +# IGT Version: 1.28-ga73311079 
 > +# Linux Version: 6.11.0-rc2 
 > +kms_pm_rpm at drm-resources-equal 
 > diff --git a/drivers/gpu/drm/ci/xfails/i915-apl-fails.txt b/drivers/gpu/drm/ci/xfails/i915-apl-fails.txt 
 > index e612281149aa..64772fedaed5 100644 
 > --- a/drivers/gpu/drm/ci/xfails/i915-apl-fails.txt 
 > +++ b/drivers/gpu/drm/ci/xfails/i915-apl-fails.txt 
 > @@ -8,7 +8,6 @@ kms_flip_scaled_crc at flip-32bpp-xtile-to-64bpp-xtile-downscaling,Fail 
 >  kms_flip_scaled_crc at flip-32bpp-xtile-to-64bpp-xtile-upscaling,Fail 
 >  kms_flip_scaled_crc at flip-32bpp-ytile-to-64bpp-ytile-downscaling,Fail 
 >  kms_flip_scaled_crc at flip-32bpp-ytile-to-64bpp-ytile-upscaling,Fail 
 > -kms_flip_scaled_crc at flip-32bpp-ytileccs-to-64bpp-ytile-downscaling,Fail 
 >  kms_flip_scaled_crc at flip-32bpp-ytileccs-to-64bpp-ytile-upscaling,Fail 
 >  kms_flip_scaled_crc at flip-64bpp-linear-to-16bpp-linear-downscaling,Fail 
 >  kms_flip_scaled_crc at flip-64bpp-linear-to-16bpp-linear-upscaling,Fail 
 > diff --git a/drivers/gpu/drm/ci/xfails/i915-apl-flakes.txt b/drivers/gpu/drm/ci/xfails/i915-apl-flakes.txt 
 > index 4663d4d13f35..e8bddda56737 100644 
 > --- a/drivers/gpu/drm/ci/xfails/i915-apl-flakes.txt 
 > +++ b/drivers/gpu/drm/ci/xfails/i915-apl-flakes.txt 
 > @@ -4,3 +4,10 @@ 
 >  # IGT Version: 1.28-g0df7b9b97 
 >  # Linux Version: 6.9.0-rc7 
 >  kms_fb_coherency at memset-crc 
 > + 
 > +# Board Name: asus-C523NA-A20057-coral 
 > +# Bug Report: https://lore.kernel.org/intel-gfx/61f62c86-3e82-4eff-bd3c-8123fa0ca332 at collabora.com/T/#t 
 > +# Failure Rate: 100 
 > +# IGT Version: 1.28-ga73311079 
 > +# Linux Version: 6.11.0-rc2 
 > +kms_universal_plane at cursor-fb-leak 
 > diff --git a/drivers/gpu/drm/ci/xfails/i915-cml-fails.txt b/drivers/gpu/drm/ci/xfails/i915-cml-fails.txt 
 > index 2723e2832797..f352b719cf7d 100644 
 > --- a/drivers/gpu/drm/ci/xfails/i915-cml-fails.txt 
 > +++ b/drivers/gpu/drm/ci/xfails/i915-cml-fails.txt 
 > @@ -1,5 +1,5 @@ 
 > +core_setmaster at master-drop-set-shared-fd,Fail 
 >  core_setmaster at master-drop-set-user,Fail 
 > -core_setmaster_vs_auth,Fail 
 >  i915_module_load at load,Fail 
 >  i915_module_load at reload,Fail 
 >  i915_module_load at reload-no-display,Fail 
 > @@ -9,10 +9,10 @@ i915_pipe_stress at stress-xrgb8888-ytiled,Fail 
 >  i915_pm_rpm at gem-execbuf-stress,Timeout 
 >  i915_pm_rpm at module-reload,Fail 
 >  i915_pm_rpm at system-suspend-execbuf,Timeout 
 > -kms_ccs at crc-primary-rotation-180-yf-tiled-ccs,Timeout 
 > +i915_pm_rps at engine-order,Fail 
 > +kms_big_fb at linear-16bpp-rotate-180,Timeout 
 >  kms_fb_coherency at memset-crc,Crash 
 >  kms_flip at busy-flip,Timeout 
 > -kms_flip at single-buffer-flip-vs-dpms-off-vs-modeset-interruptible,Fail 
 >  kms_flip_scaled_crc at flip-32bpp-linear-to-64bpp-linear-downscaling,Fail 
 >  kms_flip_scaled_crc at flip-32bpp-linear-to-64bpp-linear-upscaling,Fail 
 >  kms_flip_scaled_crc at flip-32bpp-xtile-to-64bpp-xtile-downscaling,Fail 
 > @@ -40,14 +40,11 @@ kms_plane_alpha_blend at alpha-basic,Fail 
 >  kms_plane_alpha_blend at alpha-opaque-fb,Fail 
 >  kms_plane_alpha_blend at alpha-transparent-fb,Fail 
 >  kms_plane_alpha_blend at constant-alpha-max,Fail 
 > -kms_plane_scaling at plane-scaler-with-clipping-clamping-rotation,Timeout 
 >  kms_plane_scaling at planes-upscale-factor-0-25-downscale-factor-0-5,Timeout 
 >  kms_pm_rpm at modeset-stress-extra-wait,Timeout 
 >  kms_pm_rpm at universal-planes,Timeout 
 >  kms_pm_rpm at universal-planes-dpms,Timeout 
 > -kms_prop_blob at invalid-set-prop,Fail 
 >  kms_psr2_sf at cursor-plane-update-sf,Fail 
 > -kms_psr2_sf at fbc-plane-move-sf-dmg-area,Timeout 
 >  kms_psr2_sf at overlay-plane-update-continuous-sf,Fail 
 >  kms_psr2_sf at overlay-plane-update-sf-dmg-area,Fail 
 >  kms_psr2_sf at overlay-primary-update-sf-dmg-area,Fail 
 > @@ -55,7 +52,6 @@ kms_psr2_sf at plane-move-sf-dmg-area,Fail 
 >  kms_psr2_sf at primary-plane-update-sf-dmg-area,Fail 
 >  kms_psr2_sf at primary-plane-update-sf-dmg-area-big-fb,Fail 
 >  kms_psr2_su at page_flip-NV12,Fail 
 > -kms_psr2_su at page_flip-P010,Fail 
 >  kms_rotation_crc at primary-rotation-180,Timeout 
 >  kms_setmode at basic,Fail 
 >  kms_vblank at query-forked-hang,Timeout 
 > diff --git a/drivers/gpu/drm/ci/xfails/i915-cml-flakes.txt b/drivers/gpu/drm/ci/xfails/i915-cml-flakes.txt 
 > index 58a6001abb28..d8401251e5f4 100644 
 > --- a/drivers/gpu/drm/ci/xfails/i915-cml-flakes.txt 
 > +++ b/drivers/gpu/drm/ci/xfails/i915-cml-flakes.txt 
 > @@ -11,3 +11,17 @@ kms_plane_alpha_blend at constant-alpha-min 
 >  # IGT Version: 1.28-gf13702b8e 
 >  # Linux Version: 6.10.0-rc5 
 >  kms_atomic_transition at plane-all-modeset-transition-internal-panels 
 > + 
 > +# Board Name: asus-C436FA-Flip-hatch 
 > +# Bug Report: https://lore.kernel.org/intel-gfx/61f62c86-3e82-4eff-bd3c-8123fa0ca332 at collabora.com/T/#t 
 > +# Failure Rate: 100 
 > +# IGT Version: 1.28-ga73311079 
 > +# Linux Version: 6.11.0-rc2 
 > +kms_plane_alpha_blend at constant-alpha-min 
 > + 
 > +# Board Name: asus-C436FA-Flip-hatch 
 > +# Bug Report: https://lore.kernel.org/intel-gfx/61f62c86-3e82-4eff-bd3c-8123fa0ca332 at collabora.com/T/#t 
 > +# Failure Rate: 50 
 > +# IGT Version: 1.28-ga73311079 
 > +# Linux Version: 6.11.0-rc2 
 > +kms_async_flips at crc 
 > diff --git a/drivers/gpu/drm/ci/xfails/i915-glk-fails.txt b/drivers/gpu/drm/ci/xfails/i915-glk-fails.txt 
 > index 4821c9adefd1..6eb64c672f7d 100644 
 > --- a/drivers/gpu/drm/ci/xfails/i915-glk-fails.txt 
 > +++ b/drivers/gpu/drm/ci/xfails/i915-glk-fails.txt 
 > @@ -63,3 +63,4 @@ xe_module_load at load,Fail 
 >  xe_module_load at many-reload,Fail 
 >  xe_module_load at reload,Fail 
 >  xe_module_load at reload-no-display,Fail 
 > +core_setmaster at master-drop-set-shared-fd,Fail 
 > diff --git a/drivers/gpu/drm/ci/xfails/i915-kbl-fails.txt b/drivers/gpu/drm/ci/xfails/i915-kbl-fails.txt 
 > index 1de04a3308c4..d4fba4f55ec1 100644 
 > --- a/drivers/gpu/drm/ci/xfails/i915-kbl-fails.txt 
 > +++ b/drivers/gpu/drm/ci/xfails/i915-kbl-fails.txt 
 > @@ -17,12 +17,10 @@ perf at i915-ref-count,Fail 
 >  perf_pmu at busy-accuracy-50,Fail 
 >  perf_pmu at module-unload,Fail 
 >  perf_pmu at rc6,Crash 
 > -prime_busy at after,Fail 
 >  sysfs_heartbeat_interval at long,Timeout 
 >  sysfs_heartbeat_interval at off,Timeout 
 >  sysfs_preempt_timeout at off,Timeout 
 >  sysfs_timeslice_duration at off,Timeout 
 > -testdisplay,Timeout 
 >  xe_module_load at force-load,Fail 
 >  xe_module_load at load,Fail 
 >  xe_module_load at many-reload,Fail 
 > diff --git a/drivers/gpu/drm/ci/xfails/i915-tgl-fails.txt b/drivers/gpu/drm/ci/xfails/i915-tgl-fails.txt 
 > index e728ccc62326..461ef69ef08a 100644 
 > --- a/drivers/gpu/drm/ci/xfails/i915-tgl-fails.txt 
 > +++ b/drivers/gpu/drm/ci/xfails/i915-tgl-fails.txt 
 > @@ -1,40 +1,64 @@ 
 > +api_intel_allocator at fork-simple-stress-signal,Timeout 
 > +api_intel_allocator at open-vm,Timeout 
 >  api_intel_allocator at simple-allocator,Timeout 
 > +api_intel_bb at lot-of-buffers,Timeout 
 >  api_intel_bb at object-reloc-keep-cache,Timeout 
 >  api_intel_bb at offset-control,Timeout 
 > -core_auth at getclient-simple,Timeout 
 > -core_hotunplug at hotunbind-rebind,Timeout 
 > +api_intel_bb at render-ccs,Timeout 
 > +api_intel_bb at reset-bb,Timeout 
 > +core_auth at basic-auth,Timeout 
 > +core_hotunplug at hotrebind,Timeout 
 > +core_setmaster at master-drop-set-user,Fail 
 >  debugfs_test at read_all_entries_display_on,Timeout 
 > -drm_read at invalid-buffer,Timeout 
 > -drm_read at short-buffer-nonblock,Timeout 
 > +drm_read at empty-block,Timeout 
 > +dumb_buffer at create-clear,Timeout 
 > +dumb_buffer at invalid-bpp,Timeout 
 >  gen3_render_tiledx_blits,Timeout 
 >  gen7_exec_parse at basic-allocation,Timeout 
 > -gen7_exec_parse at batch-without-end,Timeout 
 >  gen9_exec_parse at batch-invalid-length,Timeout 
 >  gen9_exec_parse at bb-secure,Timeout 
 >  gen9_exec_parse at secure-batches,Timeout 
 >  gen9_exec_parse at shadow-peek,Timeout 
 >  gen9_exec_parse at unaligned-jump,Timeout 
 > +i915_getparams_basic at basic-subslice-total,Timeout 
 > +i915_hangman at gt-engine-hang,Timeout 
 >  i915_module_load at load,Fail 
 >  i915_module_load at reload,Fail 
 >  i915_module_load at reload-no-display,Fail 
 >  i915_module_load at resize-bar,Fail 
 > +i915_pciid,Timeout 
 > +i915_pipe_stress at stress-xrgb8888-ytiled,Timeout 
 > +i915_pm_rpm at gem-execbuf-stress,Timeout 
 > +i915_pm_rps at engine-order,Timeout 
 > +i915_pm_rps at thresholds-idle-park,Timeout 
 >  i915_query at engine-info,Timeout 
 >  i915_query at query-topology-kernel-writes,Timeout 
 >  i915_query at test-query-geometry-subslices,Timeout 
 >  kms_lease at lease-uevent,Fail 
 >  kms_rotation_crc at multiplane-rotation,Fail 
 >  perf at i915-ref-count,Fail 
 > +perf_pmu at busy,Timeout 
 >  perf_pmu at enable-race,Timeout 
 >  perf_pmu at event-wait,Timeout 
 > +perf_pmu at faulting-read,Timeout 
 >  perf_pmu at gt-awake,Timeout 
 >  perf_pmu at interrupts,Timeout 
 >  perf_pmu at module-unload,Fail 
 > +perf_pmu at most-busy-idle-check-all,Timeout 
 >  perf_pmu at rc6,Crash 
 > +perf_pmu at render-node-busy-idle,Fail 
 > +perf_pmu at semaphore-wait-idle,Timeout 
 > +prime_busy at after,Timeout 
 > +prime_mmap at test_aperture_limit,Timeout 
 >  prime_mmap at test_map_unmap,Timeout 
 >  prime_mmap at test_refcounting,Timeout 
 >  prime_self_import at basic-with_one_bo,Timeout 
 > +sriov_basic at enable-vfs-autoprobe-off,Timeout 
 > +syncobj_basic at bad-destroy,Timeout 
 >  syncobj_basic at bad-flags-fd-to-handle,Timeout 
 > +syncobj_basic at create-signaled,Timeout 
 >  syncobj_eventfd at invalid-bad-pad,Timeout 
 > +syncobj_eventfd at timeline-wait-before-signal,Timeout 
 >  syncobj_wait at invalid-multi-wait-unsubmitted-signaled,Timeout 
 >  syncobj_wait at invalid-signal-illegal-handle,Timeout 
 >  syncobj_wait at invalid-single-wait-all-unsubmitted,Timeout 
 > diff --git a/drivers/gpu/drm/ci/xfails/i915-whl-fails.txt b/drivers/gpu/drm/ci/xfails/i915-whl-fails.txt 
 > index 2adae2175501..0ce240e3aa07 100644 
 > --- a/drivers/gpu/drm/ci/xfails/i915-whl-fails.txt 
 > +++ b/drivers/gpu/drm/ci/xfails/i915-whl-fails.txt 
 > @@ -1,5 +1,5 @@ 
 > +core_setmaster at master-drop-set-shared-fd,Fail 
 >  core_setmaster at master-drop-set-user,Fail 
 > -core_setmaster_vs_auth,Fail 
 >  i915_module_load at load,Fail 
 >  i915_module_load at reload,Fail 
 >  i915_module_load at reload-no-display,Fail 
 > @@ -7,7 +7,8 @@ i915_module_load at resize-bar,Fail 
 >  i915_pm_rpm at gem-execbuf-stress,Timeout 
 >  i915_pm_rpm at module-reload,Fail 
 >  i915_pm_rpm at system-suspend-execbuf,Timeout 
 > -kms_ccs at crc-primary-rotation-180-yf-tiled-ccs,Timeout 
 > +i915_pm_rps at engine-order,Fail 
 > +kms_big_fb at linear-16bpp-rotate-180,Timeout 
 >  kms_cursor_legacy at short-flip-before-cursor-atomic-transitions,Timeout 
 >  kms_dirtyfb at default-dirtyfb-ioctl,Fail 
 >  kms_dirtyfb at fbc-dirtyfb-ioctl,Fail 
 > @@ -32,19 +33,17 @@ kms_flip_scaled_crc at flip-64bpp-ytile-to-32bpp-ytile-downscaling,Fail 
 >  kms_flip_scaled_crc at flip-64bpp-ytile-to-32bpp-ytile-upscaling,Fail 
 >  kms_flip_scaled_crc at flip-64bpp-ytile-to-32bpp-ytilegen12rcccs-upscaling,Fail 
 >  kms_flip_scaled_crc at flip-64bpp-ytile-to-32bpp-ytilercccs-downscaling,Fail 
 > -kms_frontbuffer_tracking at fbc-rgb565-draw-mmap-cpu,Timeout 
 >  kms_frontbuffer_tracking at fbc-tiling-linear,Fail 
 > +kms_frontbuffer_tracking at fbc-1p-indfb-fliptrack-mmap-gtt,Timeout 
 >  kms_lease at lease-uevent,Fail 
 >  kms_plane_alpha_blend at alpha-basic,Fail 
 >  kms_plane_alpha_blend at alpha-opaque-fb,Fail 
 >  kms_plane_alpha_blend at alpha-transparent-fb,Fail 
 >  kms_plane_alpha_blend at constant-alpha-max,Fail 
 > -kms_plane_scaling at plane-scaler-with-clipping-clamping-rotation,Timeout 
 >  kms_plane_scaling at planes-upscale-factor-0-25-downscale-factor-0-5,Timeout 
 >  kms_pm_rpm at modeset-stress-extra-wait,Timeout 
 >  kms_pm_rpm at universal-planes,Timeout 
 >  kms_pm_rpm at universal-planes-dpms,Timeout 
 > -kms_prop_blob at invalid-set-prop,Fail 
 >  kms_rotation_crc at primary-rotation-180,Timeout 
 >  kms_vblank at query-forked-hang,Timeout 
 >  perf at i915-ref-count,Fail 
 > diff --git a/drivers/gpu/drm/ci/xfails/mediatek-mt8173-fails.txt b/drivers/gpu/drm/ci/xfails/mediatek-mt8173-fails.txt 
 > index a14349a1967f..8e0efc80d510 100644 
 > --- a/drivers/gpu/drm/ci/xfails/mediatek-mt8173-fails.txt 
 > +++ b/drivers/gpu/drm/ci/xfails/mediatek-mt8173-fails.txt 
 > @@ -1,8 +1,3 @@ 
 > -device_reset at cold-reset-bound,Fail 
 > -device_reset at reset-bound,Fail 
 > -device_reset at unbind-cold-reset-rebind,Fail 
 > -device_reset at unbind-reset-rebind,Fail 
 > -dumb_buffer at invalid-bpp,Fail 
 >  fbdev at eof,Fail 
 >  fbdev at read,Fail 
 >  kms_3d,Fail 
 > @@ -27,10 +22,6 @@ kms_cursor_legacy at cursor-vs-flip-atomic,Fail 
 >  kms_cursor_legacy at cursor-vs-flip-legacy,Fail 
 >  kms_flip at flip-vs-modeset-vs-hang,Fail 
 >  kms_flip at flip-vs-panning-vs-hang,Fail 
 > -kms_flip at flip-vs-suspend,Fail 
 > -kms_flip at flip-vs-suspend-interruptible,Fail 
 >  kms_lease at lease-uevent,Fail 
 > -kms_properties at get_properties-sanity-atomic,Fail 
 > -kms_properties at plane-properties-atomic,Fail 
 > -kms_properties at plane-properties-legacy,Fail 
 >  kms_rmfb at close-fd,Fail 
 > +kms_flip at flip-vs-suspend-interruptible,Fail 
 > diff --git a/drivers/gpu/drm/ci/xfails/mediatek-mt8183-fails.txt b/drivers/gpu/drm/ci/xfails/mediatek-mt8183-fails.txt 
 > index 8cb2cb67853d..845f852bb4a0 100644 
 > --- a/drivers/gpu/drm/ci/xfails/mediatek-mt8183-fails.txt 
 > +++ b/drivers/gpu/drm/ci/xfails/mediatek-mt8183-fails.txt 
 > @@ -1,10 +1,5 @@ 
 >  core_setmaster at master-drop-set-shared-fd,Fail 
 > -device_reset at cold-reset-bound,Fail 
 > -device_reset at reset-bound,Fail 
 > -device_reset at unbind-cold-reset-rebind,Fail 
 > -device_reset at unbind-reset-rebind,Fail 
 >  dumb_buffer at create-clear,Crash 
 > -dumb_buffer at invalid-bpp,Fail 
 >  fbdev at eof,Fail 
 >  fbdev at pan,Fail 
 >  fbdev at read,Fail 
 > @@ -18,5 +13,4 @@ kms_color at invalid-gamma-lut-sizes,Fail 
 >  kms_flip at flip-vs-panning-vs-hang,Fail 
 >  kms_flip at flip-vs-suspend,Fail 
 >  kms_lease at lease-uevent,Fail 
 > -kms_properties at plane-properties-atomic,Fail 
 >  kms_rmfb at close-fd,Fail 
 > diff --git a/drivers/gpu/drm/ci/xfails/meson-g12b-fails.txt b/drivers/gpu/drm/ci/xfails/meson-g12b-fails.txt 
 > index 328967d3e23d..fc3745180683 100644 
 > --- a/drivers/gpu/drm/ci/xfails/meson-g12b-fails.txt 
 > +++ b/drivers/gpu/drm/ci/xfails/meson-g12b-fails.txt 
 > @@ -1,4 +1,3 @@ 
 > -dumb_buffer at invalid-bpp,Fail 
 >  kms_3d,Fail 
 >  kms_cursor_legacy at forked-bo,Fail 
 >  kms_cursor_legacy at forked-move,Fail 
 > diff --git a/drivers/gpu/drm/ci/xfails/msm-apq8016-fails.txt b/drivers/gpu/drm/ci/xfails/msm-apq8016-fails.txt 
 > index 4ac46168eff3..066d24ee3e08 100644 
 > --- a/drivers/gpu/drm/ci/xfails/msm-apq8016-fails.txt 
 > +++ b/drivers/gpu/drm/ci/xfails/msm-apq8016-fails.txt 
 > @@ -1,8 +1,3 @@ 
 > -device_reset at cold-reset-bound,Fail 
 > -device_reset at reset-bound,Fail 
 > -device_reset at unbind-cold-reset-rebind,Fail 
 > -device_reset at unbind-reset-rebind,Fail 
 > -dumb_buffer at invalid-bpp,Fail 
 >  kms_3d,Fail 
 >  kms_cursor_legacy at torture-bo,Fail 
 >  kms_force_connector_basic at force-edid,Fail 
 > diff --git a/drivers/gpu/drm/ci/xfails/msm-apq8096-fails.txt b/drivers/gpu/drm/ci/xfails/msm-apq8096-fails.txt 
 > index bd0653caf7a0..2893f98a6b97 100644 
 > --- a/drivers/gpu/drm/ci/xfails/msm-apq8096-fails.txt 
 > +++ b/drivers/gpu/drm/ci/xfails/msm-apq8096-fails.txt 
 > @@ -1,7 +1,2 @@ 
 > -device_reset at cold-reset-bound,Fail 
 > -device_reset at reset-bound,Fail 
 > -device_reset at unbind-cold-reset-rebind,Fail 
 > -device_reset at unbind-reset-rebind,Fail 
 > -dumb_buffer at invalid-bpp,Fail 
 >  kms_3d,Fail 
 >  kms_lease at lease-uevent,Fail 
 > diff --git a/drivers/gpu/drm/ci/xfails/msm-sc7180-trogdor-kingoftown-fails.txt b/drivers/gpu/drm/ci/xfails/msm-sc7180-trogdor-kingoftown-fails.txt 
 > index d42004cd6977..6dbc2080347d 100644 
 > --- a/drivers/gpu/drm/ci/xfails/msm-sc7180-trogdor-kingoftown-fails.txt 
 > +++ b/drivers/gpu/drm/ci/xfails/msm-sc7180-trogdor-kingoftown-fails.txt 
 > @@ -1,8 +1,3 @@ 
 > -device_reset at cold-reset-bound,Fail 
 > -device_reset at reset-bound,Fail 
 > -device_reset at unbind-cold-reset-rebind,Fail 
 > -device_reset at unbind-reset-rebind,Fail 
 > -dumb_buffer at invalid-bpp,Fail 
 >  kms_color at ctm-0-25,Fail 
 >  kms_color at ctm-0-50,Fail 
 >  kms_color at ctm-0-75,Fail 
 > @@ -11,35 +6,13 @@ kms_color at ctm-green-to-red,Fail 
 >  kms_color at ctm-negative,Fail 
 >  kms_color at ctm-red-to-blue,Fail 
 >  kms_color at ctm-signed,Fail 
 > -kms_content_protection at atomic,Crash 
 > -kms_content_protection at atomic-dpms,Crash 
 > -kms_content_protection at content-type-change,Crash 
 > -kms_content_protection at lic-type-0,Crash 
 > -kms_content_protection at lic-type-1,Crash 
 > -kms_content_protection at srm,Crash 
 > -kms_content_protection at type1,Crash 
 > -kms_content_protection at uevent,Crash 
 > -kms_cursor_legacy at 2x-cursor-vs-flip-atomic,Fail 
 > -kms_cursor_legacy at 2x-cursor-vs-flip-legacy,Fail 
 > -kms_cursor_legacy at 2x-flip-vs-cursor-atomic,Fail 
 > -kms_cursor_legacy at 2x-flip-vs-cursor-legacy,Fail 
 > -kms_cursor_legacy at 2x-long-cursor-vs-flip-atomic,Fail 
 > -kms_cursor_legacy at 2x-long-cursor-vs-flip-legacy,Fail 
 > -kms_cursor_legacy at 2x-long-flip-vs-cursor-atomic,Fail 
 > -kms_cursor_legacy at 2x-long-flip-vs-cursor-legacy,Fail 
 >  kms_cursor_legacy at cursor-vs-flip-toggle,Fail 
 >  kms_cursor_legacy at cursor-vs-flip-varying-size,Fail 
 > -kms_display_modes at extended-mode-basic,Fail 
 > -kms_flip at 2x-flip-vs-modeset-vs-hang,Fail 
 > -kms_flip at 2x-flip-vs-panning-vs-hang,Fail 
 >  kms_flip at flip-vs-modeset-vs-hang,Fail 
 >  kms_flip at flip-vs-panning-vs-hang,Fail 
 >  kms_lease at lease-uevent,Fail 
 > -kms_multipipe_modeset at basic-max-pipe-crc-check,Fail 
 >  kms_pipe_crc_basic at compare-crc-sanitycheck-nv12,Fail 
 >  kms_plane_alpha_blend at alpha-7efc,Fail 
 >  kms_plane_alpha_blend at coverage-7efc,Fail 
 >  kms_plane_alpha_blend at coverage-vs-premult-vs-constant,Fail 
 > -kms_plane_lowres at tiling-none,Fail 
 >  kms_rmfb at close-fd,Fail 
 > -kms_vblank at ts-continuation-dpms-rpm,Fail 
 > diff --git a/drivers/gpu/drm/ci/xfails/msm-sc7180-trogdor-lazor-limozeen-fails.txt b/drivers/gpu/drm/ci/xfails/msm-sc7180-trogdor-lazor-limozeen-fails.txt 
 > index d42004cd6977..6dbc2080347d 100644 
 > --- a/drivers/gpu/drm/ci/xfails/msm-sc7180-trogdor-lazor-limozeen-fails.txt 
 > +++ b/drivers/gpu/drm/ci/xfails/msm-sc7180-trogdor-lazor-limozeen-fails.txt 
 > @@ -1,8 +1,3 @@ 
 > -device_reset at cold-reset-bound,Fail 
 > -device_reset at reset-bound,Fail 
 > -device_reset at unbind-cold-reset-rebind,Fail 
 > -device_reset at unbind-reset-rebind,Fail 
 > -dumb_buffer at invalid-bpp,Fail 
 >  kms_color at ctm-0-25,Fail 
 >  kms_color at ctm-0-50,Fail 
 >  kms_color at ctm-0-75,Fail 
 > @@ -11,35 +6,13 @@ kms_color at ctm-green-to-red,Fail 
 >  kms_color at ctm-negative,Fail 
 >  kms_color at ctm-red-to-blue,Fail 
 >  kms_color at ctm-signed,Fail 
 > -kms_content_protection at atomic,Crash 
 > -kms_content_protection at atomic-dpms,Crash 
 > -kms_content_protection at content-type-change,Crash 
 > -kms_content_protection at lic-type-0,Crash 
 > -kms_content_protection at lic-type-1,Crash 
 > -kms_content_protection at srm,Crash 
 > -kms_content_protection at type1,Crash 
 > -kms_content_protection at uevent,Crash 
 > -kms_cursor_legacy at 2x-cursor-vs-flip-atomic,Fail 
 > -kms_cursor_legacy at 2x-cursor-vs-flip-legacy,Fail 
 > -kms_cursor_legacy at 2x-flip-vs-cursor-atomic,Fail 
 > -kms_cursor_legacy at 2x-flip-vs-cursor-legacy,Fail 
 > -kms_cursor_legacy at 2x-long-cursor-vs-flip-atomic,Fail 
 > -kms_cursor_legacy at 2x-long-cursor-vs-flip-legacy,Fail 
 > -kms_cursor_legacy at 2x-long-flip-vs-cursor-atomic,Fail 
 > -kms_cursor_legacy at 2x-long-flip-vs-cursor-legacy,Fail 
 >  kms_cursor_legacy at cursor-vs-flip-toggle,Fail 
 >  kms_cursor_legacy at cursor-vs-flip-varying-size,Fail 
 > -kms_display_modes at extended-mode-basic,Fail 
 > -kms_flip at 2x-flip-vs-modeset-vs-hang,Fail 
 > -kms_flip at 2x-flip-vs-panning-vs-hang,Fail 
 >  kms_flip at flip-vs-modeset-vs-hang,Fail 
 >  kms_flip at flip-vs-panning-vs-hang,Fail 
 >  kms_lease at lease-uevent,Fail 
 > -kms_multipipe_modeset at basic-max-pipe-crc-check,Fail 
 >  kms_pipe_crc_basic at compare-crc-sanitycheck-nv12,Fail 
 >  kms_plane_alpha_blend at alpha-7efc,Fail 
 >  kms_plane_alpha_blend at coverage-7efc,Fail 
 >  kms_plane_alpha_blend at coverage-vs-premult-vs-constant,Fail 
 > -kms_plane_lowres at tiling-none,Fail 
 >  kms_rmfb at close-fd,Fail 
 > -kms_vblank at ts-continuation-dpms-rpm,Fail 
 > diff --git a/drivers/gpu/drm/ci/xfails/msm-sdm845-fails.txt b/drivers/gpu/drm/ci/xfails/msm-sdm845-fails.txt 
 > index 770a1c685fde..fa8c7e663858 100644 
 > --- a/drivers/gpu/drm/ci/xfails/msm-sdm845-fails.txt 
 > +++ b/drivers/gpu/drm/ci/xfails/msm-sdm845-fails.txt 
 > @@ -1,8 +1,4 @@ 
 > -device_reset at cold-reset-bound,Fail 
 > -device_reset at reset-bound,Fail 
 > -device_reset at unbind-cold-reset-rebind,Fail 
 > -device_reset at unbind-reset-rebind,Fail 
 > -dumb_buffer at invalid-bpp,Fail 
 > +drm_read at invalid-buffer,Fail 
 >  kms_color at ctm-0-25,Fail 
 >  kms_color at ctm-0-50,Fail 
 >  kms_color at ctm-0-75,Fail 
 > diff --git a/drivers/gpu/drm/ci/xfails/msm-sdm845-flakes.txt b/drivers/gpu/drm/ci/xfails/msm-sdm845-flakes.txt 
 > index 2aa96b1241c3..38ec0305c1f4 100644 
 > --- a/drivers/gpu/drm/ci/xfails/msm-sdm845-flakes.txt 
 > +++ b/drivers/gpu/drm/ci/xfails/msm-sdm845-flakes.txt 
 > @@ -116,3 +116,17 @@ kms_cursor_legacy at flip-vs-cursor-toggle 
 >  # IGT Version: 1.28-gf13702b8e 
 >  # Linux Version: 6.10.0-rc5 
 >  msm/msm_shrink at copy-mmap-oom-8 
 > + 
 > +# Board Name: sdm845-cheza-r3 
 > +# Bug Report: https://lore.kernel.org/linux-arm-msm/64bc4bcf-de51-4e60-a9f7-1295a1e64c65 at collabora.com/T/#t 
 > +# Failure Rate: 50 
 > +# IGT Version: 1.28-ga73311079 
 > +# Linux Version: 6.11.0-rc2 
 > +kms_lease at page-flip-implicit-plane 
 > + 
 > +# Board Name: sdm845-cheza-r3 
 > +# Bug Report: https://lore.kernel.org/linux-arm-msm/64bc4bcf-de51-4e60-a9f7-1295a1e64c65 at collabora.com/T/#t 
 > +# Failure Rate: 50 
 > +# IGT Version: 1.28-ga73311079 
 > +# Linux Version: 6.11.0-rc5 
 > +kms_flip at flip-vs-expired-vblank 
 > diff --git a/drivers/gpu/drm/ci/xfails/msm-sdm845-skips.txt b/drivers/gpu/drm/ci/xfails/msm-sdm845-skips.txt 
 > index 90651048ab61..94783cafc21a 100644 
 > --- a/drivers/gpu/drm/ci/xfails/msm-sdm845-skips.txt 
 > +++ b/drivers/gpu/drm/ci/xfails/msm-sdm845-skips.txt 
 > @@ -25,3 +25,8 @@ core_hotunplug.* 
 >  
 >  # Whole machine hangs 
 >  kms_cursor_crc.* 
 > + 
 > +# IGT test crash 
 > +# IGT Version: 1.28-ga73311079 
 > +# Linux Version: 6.11.0-rc2 
 > +kms_content_protection at uevent 
 > diff --git a/drivers/gpu/drm/ci/xfails/panfrost-g12b-fails.txt b/drivers/gpu/drm/ci/xfails/panfrost-g12b-fails.txt 
 > index fe8ce2ce33e6..abd1ccb71561 100644 
 > --- a/drivers/gpu/drm/ci/xfails/panfrost-g12b-fails.txt 
 > +++ b/drivers/gpu/drm/ci/xfails/panfrost-g12b-fails.txt 
 > @@ -1 +1,2 @@ 
 >  panfrost/panfrost_prime at gem-prime-import,Fail 
 > +panfrost/panfrost_submit at pan-submit-error-bad-requirements,Fail 
 > diff --git a/drivers/gpu/drm/ci/xfails/panfrost-mt8183-fails.txt b/drivers/gpu/drm/ci/xfails/panfrost-mt8183-fails.txt 
 > index fe8ce2ce33e6..abd1ccb71561 100644 
 > --- a/drivers/gpu/drm/ci/xfails/panfrost-mt8183-fails.txt 
 > +++ b/drivers/gpu/drm/ci/xfails/panfrost-mt8183-fails.txt 
 > @@ -1 +1,2 @@ 
 >  panfrost/panfrost_prime at gem-prime-import,Fail 
 > +panfrost/panfrost_submit at pan-submit-error-bad-requirements,Fail 
 > diff --git a/drivers/gpu/drm/ci/xfails/panfrost-rk3288-fails.txt b/drivers/gpu/drm/ci/xfails/panfrost-rk3288-fails.txt 
 > index 4a2f4b6b14c1..8330b934602a 100644 
 > --- a/drivers/gpu/drm/ci/xfails/panfrost-rk3288-fails.txt 
 > +++ b/drivers/gpu/drm/ci/xfails/panfrost-rk3288-fails.txt 
 > @@ -1 +1,2 @@ 
 >  panfrost/panfrost_prime at gem-prime-import,Crash 
 > +panfrost/panfrost_submit at pan-submit-error-bad-requirements,Crash 
 > diff --git a/drivers/gpu/drm/ci/xfails/panfrost-rk3399-fails.txt b/drivers/gpu/drm/ci/xfails/panfrost-rk3399-fails.txt 
 > index fe8ce2ce33e6..abd1ccb71561 100644 
 > --- a/drivers/gpu/drm/ci/xfails/panfrost-rk3399-fails.txt 
 > +++ b/drivers/gpu/drm/ci/xfails/panfrost-rk3399-fails.txt 
 > @@ -1 +1,2 @@ 
 >  panfrost/panfrost_prime at gem-prime-import,Fail 
 > +panfrost/panfrost_submit at pan-submit-error-bad-requirements,Fail 
 > diff --git a/drivers/gpu/drm/ci/xfails/rockchip-rk3288-fails.txt b/drivers/gpu/drm/ci/xfails/rockchip-rk3288-fails.txt 
 > index ea7b2ceb95b9..90282dfa19f4 100644 
 > --- a/drivers/gpu/drm/ci/xfails/rockchip-rk3288-fails.txt 
 > +++ b/drivers/gpu/drm/ci/xfails/rockchip-rk3288-fails.txt 
 > @@ -1,18 +1,24 @@ 
 > -core_setmaster at master-drop-set-root,Crash 
 >  core_setmaster at master-drop-set-user,Crash 
 > -core_setmaster_vs_auth,Crash 
 > -device_reset at cold-reset-bound,Crash 
 > -device_reset at reset-bound,Crash 
 > -device_reset at unbind-cold-reset-rebind,Crash 
 > -device_reset at unbind-reset-rebind,Crash 
 >  dumb_buffer at create-clear,Crash 
 > -dumb_buffer at invalid-bpp,Crash 
 >  fbdev at pan,Crash 
 > +kms_bw at linear-tiling-2-displays-1920x1080p,Fail 
 >  kms_cursor_crc at cursor-onscreen-32x10,Crash 
 >  kms_cursor_crc at cursor-onscreen-32x32,Crash 
 > +kms_cursor_crc at cursor-onscreen-64x64,Crash 
 >  kms_cursor_crc at cursor-random-32x10,Crash 
 > +kms_cursor_crc at cursor-sliding-32x10,Crash 
 >  kms_cursor_crc at cursor-sliding-32x32,Crash 
 > +kms_cursor_crc at cursor-sliding-64x21,Crash 
 >  kms_cursor_legacy at basic-flip-before-cursor-atomic,Fail 
 >  kms_cursor_legacy at cursor-vs-flip-legacy,Fail 
 > +kms_cursor_legacy at flip-vs-cursor-crc-atomic,Crash 
 > +kms_flip at flip-vs-panning-vs-hang,Crash 
 > +kms_invalid_mode at int-max-clock,Crash 
 > +kms_lease at invalid-create-leases,Fail 
 > +kms_pipe_crc_basic at read-crc-frame-sequence,Crash 
 > +kms_plane at pixel-format,Crash 
 > +kms_plane at pixel-format-source-clamping,Crash 
 >  kms_prop_blob at invalid-set-prop,Crash 
 > -kms_prop_blob at invalid-set-prop-any,Crash 
 > +kms_properties at get_properties-sanity-atomic,Crash 
 > +kms_properties at get_properties-sanity-non-atomic,Crash 
 > +kms_rmfb at close-fd,Crash 
 > diff --git a/drivers/gpu/drm/ci/xfails/rockchip-rk3288-flakes.txt b/drivers/gpu/drm/ci/xfails/rockchip-rk3288-flakes.txt 
 > index 7ede273aab20..cd0b27d8b636 100644 
 > --- a/drivers/gpu/drm/ci/xfails/rockchip-rk3288-flakes.txt 
 > +++ b/drivers/gpu/drm/ci/xfails/rockchip-rk3288-flakes.txt 
 > @@ -4,3 +4,31 @@ 
 >  # IGT Version: 1.28-gf13702b8e 
 >  # Linux Version: 6.10.0-rc5 
 >  kms_cursor_legacy at flip-vs-cursor-atomic 
 > + 
 > +# Board Name: rk3288-veyron-jaq 
 > +# Bug Report: https://lore.kernel.org/linux-rockchip/7505ac00-29ef-4ad9-8904-94b4c024c02b at collabora.com/T/#t 
 > +# Failure Rate: 100 
 > +# IGT Version: 1.28-ga73311079 
 > +# Linux Version: 6.11.0-rc2 
 > +kms_cursor_crc at cursor-offscreen-32x10 
 > + 
 > +# Board Name: rk3288-veyron-jaq 
 > +# Bug Report: https://lore.kernel.org/linux-rockchip/7505ac00-29ef-4ad9-8904-94b4c024c02b at collabora.com/T/#t 
 > +# Failure Rate: 100 
 > +# IGT Version: 1.28-ga73311079 
 > +# Linux Version: 6.11.0-rc2 
 > +kms_cursor_edge_walk at 64x64-left-edge 
 > + 
 > +# Board Name: rk3288-veyron-jaq 
 > +# Bug Report: https://lore.kernel.org/linux-rockchip/7505ac00-29ef-4ad9-8904-94b4c024c02b at collabora.com/T/#t 
 > +# Failure Rate: 100 
 > +# IGT Version: 1.28-ga73311079 
 > +# Linux Version: 6.11.0-rc2 
 > +kms_flip at plain-flip-ts-check 
 > + 
 > +# Board Name: rk3288-veyron-jaq 
 > +# Bug Report: https://lore.kernel.org/linux-rockchip/7505ac00-29ef-4ad9-8904-94b4c024c02b at collabora.com/T/#t 
 > +# Failure Rate: 100 
 > +# IGT Version: 1.28-ga73311079 
 > +# Linux Version: 6.11.0-rc2 
 > +kms_cursor_crc at cursor-alpha-opaque 
 > diff --git a/drivers/gpu/drm/ci/xfails/rockchip-rk3399-fails.txt b/drivers/gpu/drm/ci/xfails/rockchip-rk3399-fails.txt 
 > index 9309ff15e23a..83a38853b4af 100644 
 > --- a/drivers/gpu/drm/ci/xfails/rockchip-rk3399-fails.txt 
 > +++ b/drivers/gpu/drm/ci/xfails/rockchip-rk3399-fails.txt 
 > @@ -1,9 +1,4 @@ 
 > -device_reset at cold-reset-bound,Fail 
 > -device_reset at reset-bound,Fail 
 > -device_reset at unbind-cold-reset-rebind,Fail 
 > -device_reset at unbind-reset-rebind,Fail 
 >  dumb_buffer at create-clear,Crash 
 > -dumb_buffer at invalid-bpp,Fail 
 >  kms_atomic_transition at modeset-transition,Fail 
 >  kms_atomic_transition at modeset-transition-fencing,Fail 
 >  kms_atomic_transition at plane-toggle-modeset-transition,Fail 
 > @@ -46,7 +41,6 @@ kms_cursor_legacy at flip-vs-cursor-legacy,Fail 
 >  kms_cursor_legacy at long-nonblocking-modeset-vs-cursor-atomic,Fail 
 >  kms_flip at basic-flip-vs-wf_vblank,Fail 
 >  kms_flip at blocking-wf_vblank,Fail 
 > -kms_flip at dpms-vs-vblank-race,Fail 
 >  kms_flip at flip-vs-absolute-wf_vblank,Fail 
 >  kms_flip at flip-vs-blocking-wf-vblank,Fail 
 >  kms_flip at flip-vs-modeset-vs-hang,Fail 
 > @@ -59,7 +53,6 @@ kms_flip at plain-flip-fb-recreate,Fail 
 >  kms_flip at plain-flip-fb-recreate-interruptible,Fail 
 >  kms_flip at plain-flip-ts-check,Fail 
 >  kms_flip at plain-flip-ts-check-interruptible,Fail 
 > -kms_flip at wf_vblank-ts-check,Fail 
 >  kms_flip at wf_vblank-ts-check-interruptible,Fail 
 >  kms_invalid_mode at int-max-clock,Fail 
 >  kms_lease at lease-uevent,Fail 
 > diff --git a/drivers/gpu/drm/ci/xfails/rockchip-rk3399-flakes.txt b/drivers/gpu/drm/ci/xfails/rockchip-rk3399-flakes.txt 
 > index d98f6a17343c..56f7d4f1ed15 100644 
 > --- a/drivers/gpu/drm/ci/xfails/rockchip-rk3399-flakes.txt 
 > +++ b/drivers/gpu/drm/ci/xfails/rockchip-rk3399-flakes.txt 
 > @@ -46,3 +46,31 @@ kms_setmode at basic 
 >  # IGT Version: 1.28-gf13702b8e 
 >  # Linux Version: 6.10.0-rc5 
 >  kms_bw at connected-linear-tiling-1-displays-2560x1440p 
 > + 
 > +# Board Name: rk3399-gru-kevin 
 > +# Bug Report: https://lore.kernel.org/linux-rockchip/7505ac00-29ef-4ad9-8904-94b4c024c02b at collabora.com/T/#t 
 > +# Failure Rate: 50 
 > +# IGT Version: 1.28-ga73311079 
 > +# Linux Version: 6.11.0-rc2 
 > +kms_flip at wf_vblank-ts-check 
 > + 
 > +# Board Name: rk3399-gru-kevin 
 > +# Bug Report: https://lore.kernel.org/linux-rockchip/7505ac00-29ef-4ad9-8904-94b4c024c02b at collabora.com/T/#t 
 > +# Failure Rate: 50 
 > +# IGT Version: 1.28-ga73311079 
 > +# Linux Version: 6.11.0-rc5 
 > +kms_flip at dpms-vs-vblank-race 
 > + 
 > +# Board Name: rk3399-gru-kevin 
 > +# Bug Report: https://lore.kernel.org/linux-rockchip/7505ac00-29ef-4ad9-8904-94b4c024c02b at collabora.com/T/#t 
 > +# Failure Rate: 50 
 > +# IGT Version: 1.28-ga73311079 
 > +# Linux Version: 6.11.0-rc5 
 > +kms_bw at linear-tiling-2-displays-2160x1440p 
 > + 
 > +# Board Name: rk3399-gru-kevin 
 > +# Bug Report: https://lore.kernel.org/linux-rockchip/7505ac00-29ef-4ad9-8904-94b4c024c02b at collabora.com/T/#t 
 > +# Failure Rate: 50 
 > +# IGT Version: 1.28-ga73311079 
 > +# Linux Version: 6.11.0-rc5 
 > +kms_flip at flip-vs-expired-vblank 
 > diff --git a/drivers/gpu/drm/ci/xfails/vkms-none-fails.txt b/drivers/gpu/drm/ci/xfails/vkms-none-fails.txt 
 > index 5408110f4c60..71c02104a683 100644 
 > --- a/drivers/gpu/drm/ci/xfails/vkms-none-fails.txt 
 > +++ b/drivers/gpu/drm/ci/xfails/vkms-none-fails.txt 
 > @@ -1,24 +1,3 @@ 
 > -core_hotunplug at hotrebind,Fail 
 > -core_hotunplug at hotrebind-lateclose,Fail 
 > -core_hotunplug at hotreplug,Fail 
 > -core_hotunplug at hotreplug-lateclose,Fail 
 > -core_hotunplug at hotunbind-rebind,Fail 
 > -core_hotunplug at hotunplug-rescan,Fail 
 > -core_hotunplug at unbind-rebind,Fail 
 > -core_hotunplug at unplug-rescan,Fail 
 > -device_reset at cold-reset-bound,Fail 
 > -device_reset at reset-bound,Fail 
 > -device_reset at unbind-cold-reset-rebind,Fail 
 > -device_reset at unbind-reset-rebind,Fail 
 > -dumb_buffer at invalid-bpp,Fail 
 > -kms_content_protection at atomic,Crash 
 > -kms_content_protection at atomic-dpms,Crash 
 > -kms_content_protection at content-type-change,Crash 
 > -kms_content_protection at lic-type-0,Crash 
 > -kms_content_protection at lic-type-1,Crash 
 > -kms_content_protection at srm,Crash 
 > -kms_content_protection at type1,Crash 
 > -kms_content_protection at uevent,Crash 
 >  kms_cursor_crc at cursor-rapid-movement-128x128,Fail 
 >  kms_cursor_crc at cursor-rapid-movement-128x42,Fail 
 >  kms_cursor_crc at cursor-rapid-movement-256x256,Fail 
 > diff --git a/drivers/gpu/drm/ci/xfails/vkms-none-skips.txt b/drivers/gpu/drm/ci/xfails/vkms-none-skips.txt 
 > index 5ccc771fbb36..b3d16e82e9a2 100644 
 > --- a/drivers/gpu/drm/ci/xfails/vkms-none-skips.txt 
 > +++ b/drivers/gpu/drm/ci/xfails/vkms-none-skips.txt 
 > @@ -205,6 +205,59 @@ kms_cursor_edge_walk at 128x128-right-edge 
 >  # R10: ffffa2c181790000 R11: 0000000000000000 R12: ffffa2c1814fa810 
 >  # R13: 0000000000000031 R14: 0000000000000031 R15: 000000000000 
 >  
 > +kms_cursor_edge_walk at 128x128-left-edge 
 > +# DEBUG - Begin test kms_cursor_edge_walk at 128x128-left-edge 
 > +# Oops: Oops: 0000 [#1] PREEMPT SMP NOPTI 
 > +# CPU: 0 UID: 0 PID: 27 Comm: kworker/u8:1 Not tainted 6.11.0-rc5-g5d3429a7e9aa #1 
 > +# Hardware name: ChromiumOS crosvm, BIOS 0 
 > +# Workqueue: vkms_composer vkms_composer_worker [vkms] 
 > +# RIP: 0010:compose_active_planes+0x344/0x4e0 [vkms] 
 > +# Code: 6a 34 0f 8e 91 fe ff ff 44 89 ea 48 8d 7c 24 48 e8 71 f0 ff ff 4b 8b 04 fc 48 8b 4c 24 50 48 8b 7c 24 40 48 8b 80 48 01 00 00  63 70 18 8b 40 20 48 89 f2 48 c1 e6 03 29 d0 48 8b 54 24 48 48 
 > +# RSP: 0018:ffffa437800ebd58 EFLAGS: 00010282 
 > +# RAX: 0000000000000000 RBX: 0000000000000002 RCX: ffffa0e841904000 
 > +# RDX: 00000000000000ff RSI: ffffa0e841905ff8 RDI: ffffa0e841902000 
 > +# RBP: 0000000000000000 R08: ffffa0e84158a600 R09: 00000000000003ff 
 > +# R10: 0000000078b2bcd2 R11: 00000000278b2bcd R12: ffffa0e84870fc60 
 > +# R13: 0000000000000000 R14: 0000000000000000 R15: 0000000000000000 
 > +# FS:  0000000000000000(0000) GS:ffffa0e86bc00000(0000) knlGS:0000000000000000 
 > +# CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033 
 > +# CR2: 0000000000000018 CR3: 0000000101710000 CR4: 0000000000350ef0 
 > +# Call Trace: 
 > +#   
 > +#  ? __die+0x1e/0x60 
 > +#  ? page_fault_oops+0x17b/0x4a0 
 > +#  ? exc_page_fault+0x6d/0x230 
 > +#  ? asm_exc_page_fault+0x26/0x30 
 > +#  ? compose_active_planes+0x344/0x4e0 [vkms] 
 > +#  ? compose_active_planes+0x32f/0x4e0 [vkms] 
 > +#  ? srso_return_thunk+0x5/0x5f 
 > +#  vkms_composer_worker+0x205/0x240 [vkms] 
 > +#  process_one_work+0x201/0x6c0 
 > +#  ? lock_is_held_type+0x9e/0x110 
 > +#  worker_thread+0x17e/0x310 
 > +#  ? __pfx_worker_thread+0x10/0x10 
 > +#  kthread+0xce/0x100 
 > +#  ? __pfx_kthread+0x10/0x10 
 > +#  ret_from_fork+0x2f/0x50 
 > +#  ? __pfx_kthread+0x10/0x10 
 > +#  ret_from_fork_asm+0x1a/0x30 
 > +#   
 > +# Modules linked in: vkms 
 > +# CR2: 0000000000000018 
 > +# ---[ end trace 0000000000000000 ]--- 
 > +# RIP: 0010:compose_active_planes+0x344/0x4e0 [vkms] 
 > +# Code: 6a 34 0f 8e 91 fe ff ff 44 89 ea 48 8d 7c 24 48 e8 71 f0 ff ff 4b 8b 04 fc 48 8b 4c 24 50 48 8b 7c 24 40 48 8b 80 48 01 00 00  63 70 18 8b 40 20 48 89 f2 48 c1 e6 03 29 d0 48 8b 54 24 48 48 
 > +# RSP: 0018:ffffa437800ebd58 EFLAGS: 00010282 
 > +# RAX: 0000000000000000 RBX: 0000000000000002 RCX: ffffa0e841904000 
 > +# RDX: 00000000000000ff RSI: ffffa0e841905ff8 RDI: ffffa0e841902000 
 > +# RBP: 0000000000000000 R08: ffffa0e84158a600 R09: 00000000000003ff 
 > +# R10: 0000000078b2bcd2 R11: 00000000278b2bcd R12: ffffa0e84870fc60 
 > +# R13: 0000000000000000 R14: 0000000000000000 R15: 0000000000000000 
 > +# FS:  0000000000000000(0000) GS:ffffa0e86bc00000(0000) knlGS:0000000000000000 
 > +# CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033 
 > +# CR2: 0000000000000018 CR3: 0000000101710000 CR4: 0000000000350ef0 
 > +# vkms_vblank_simulate: vblank timer overrun 
 > + 
 >  # Skip driver specific tests 
 >  ^amdgpu.* 
 >  ^msm.* 
 > -- 
 > 2.43.0 
 >  
 > 


From linyunsheng at huawei.com  Wed Sep 25 00:57:05 2024
From: linyunsheng at huawei.com (Yunsheng Lin)
Date: Wed, 25 Sep 2024 15:57:05 +0800
Subject: [PATCH net v2 0/2] fix two bugs related to page_pool
Message-ID: <20240925075707.3970187-1-linyunsheng@huawei.com>

Patch 1 fix a possible time window problem for page_pool.
Patch 2 fix the kernel crash problem at iommu_get_dma_domain
reported in [1].

When page_pool_put_unrefed_netmem() is called with allow_direct
being true, there is only a newly added checking overhead
introduced in patch 1, which seem to be no noticeable performance
impact.

When page_pool_put_unrefed_netmem() is called with allow_direct
being false, there is an added rcu read lock overhead introduced in
patch 1, and the overhead is about 13ns using the below test code,
but 'time_bench_page_pool02_ptr_ring' only show about 2ns overhead,
which is about 2% degradation.

+static int time_bench_rcu(
+       struct time_bench_record *rec, void *data)
+{
+       uint64_t loops_cnt = 0;
+       int i;
+
+       time_bench_start(rec);
+       /** Loop to measure **/
+       for (i = 0; i < rec->loops; i++) {
+               rcu_read_lock();
+               loops_cnt++;
+               barrier(); /* avoid compiler to optimize this loop */
+               rcu_read_unlock();
+       }
+       time_bench_stop(rec, loops_cnt);
+       return loops_cnt;
+}

When page_pool need to be refilled from or flushed to the page allocator,
the added overhead is the page_pool_item_add() and page_pool_item_del()
calling overhead, using below patch to enable Jesper's testing running in
arm64, the overhead is 0~20ns, which is quite variable 

Before this patchset:
root@(none)$ taskset -c 1 insmod bench_page_pool_simple.ko
[  136.641453] bench_page_pool_simple: Loaded
[  136.722560] time_bench: Type:for_loop Per elem: 0 cycles(tsc) 0.769 ns (step:0) - (measurement period time:0.076968720 sec time_interval:76968720) - (invoke count:100000000 tsc_interval:7696855)
[  137.317006] time_bench: Type:atomic_inc Per elem: 0 cycles(tsc) 5.771 ns (step:0) - (measurement period time:0.577164350 sec time_interval:577164350) - (invoke count:100000000 tsc_interval:57716429)
[  137.480852] time_bench: Type:lock Per elem: 1 cycles(tsc) 14.621 ns (step:0) - (measurement period time:0.146218730 sec time_interval:146218730) - (invoke count:10000000 tsc_interval:14621868)
[  138.842377] time_bench: Type:rcu Per elem: 1 cycles(tsc) 13.444 ns (step:0) - (measurement period time:1.344419820 sec time_interval:1344419820) - (invoke count:100000000 tsc_interval:134441975)
[  138.859656] bench_page_pool_simple: time_bench_page_pool01_fast_path(): Cannot use page_pool fast-path
[  139.132102] time_bench: Type:no-softirq-page_pool01 Per elem: 2 cycles(tsc) 26.315 ns (step:0) - (measurement period time:0.263151430 sec time_interval:263151430) - (invoke count:10000000 tsc_interval:26315135)
[  139.150769] bench_page_pool_simple: time_bench_page_pool02_ptr_ring(): Cannot use page_pool fast-path
[  139.910642] time_bench: Type:no-softirq-page_pool02 Per elem: 7 cycles(tsc) 75.066 ns (step:0) - (measurement period time:0.750663200 sec time_interval:750663200) - (invoke count:10000000 tsc_interval:75066312)
[  139.929312] bench_page_pool_simple: time_bench_page_pool03_slow(): Cannot use page_pool fast-path
[  141.673951] time_bench: Type:no-softirq-page_pool03 Per elem: 17 cycles(tsc) 173.578 ns (step:0) - (measurement period time:1.735781610 sec time_interval:1735781610) - (invoke count:10000000 tsc_interval:173578155)
[  141.692970] bench_page_pool_simple: pp_tasklet_handler(): in_serving_softirq fast-path
[  141.700874] bench_page_pool_simple: time_bench_page_pool01_fast_path(): in_serving_softirq fast-path
[  141.973638] time_bench: Type:tasklet_page_pool01_fast_path Per elem: 2 cycles(tsc) 26.364 ns (step:0) - (measurement period time:0.263645150 sec time_interval:263645150) - (invoke count:10000000 tsc_interval:26364508)
[  141.992912] bench_page_pool_simple: time_bench_page_pool02_ptr_ring(): in_serving_softirq fast-path
[  142.531745] time_bench: Type:tasklet_page_pool02_ptr_ring Per elem: 5 cycles(tsc) 52.980 ns (step:0) - (measurement period time:0.529801250 sec time_interval:529801250) - (invoke count:10000000 tsc_interval:52980119)
[  142.550933] bench_page_pool_simple: time_bench_page_pool03_slow(): in_serving_softirq fast-path
[  144.297646] time_bench: Type:tasklet_page_pool03_slow Per elem: 17 cycles(tsc) 173.802 ns (step:0) - (measurement period time:1.738029000 sec time_interval:1738029000) - (invoke count:10000000 tsc_interval:173802894)

After this patchset:
root@(none)$ taskset -c 1 insmod bench_page_pool_simple.ko
[  149.865799] bench_page_pool_simple: Loaded
[  149.946907] time_bench: Type:for_loop Per elem: 0 cycles(tsc) 0.769 ns (step:0) - (measurement period time:0.076965620 sec time_interval:76965620) - (invoke count:100000000 tsc_interval:7696556)
[  150.722282] time_bench: Type:atomic_inc Per elem: 0 cycles(tsc) 7.580 ns (step:0) - (measurement period time:0.758094660 sec time_interval:758094660) - (invoke count:100000000 tsc_interval:75809459)
[  150.886335] time_bench: Type:lock Per elem: 1 cycles(tsc) 14.640 ns (step:0) - (measurement period time:0.146405830 sec time_interval:146405830) - (invoke count:10000000 tsc_interval:14640578)
[  152.249454] time_bench: Type:rcu Per elem: 1 cycles(tsc) 13.460 ns (step:0) - (measurement period time:1.346009570 sec time_interval:1346009570) - (invoke count:100000000 tsc_interval:134600951)
[  152.266734] bench_page_pool_simple: time_bench_page_pool01_fast_path(): Cannot use page_pool fast-path
[  152.537046] time_bench: Type:no-softirq-page_pool01 Per elem: 2 cycles(tsc) 26.100 ns (step:0) - (measurement period time:0.261007670 sec time_interval:261007670) - (invoke count:10000000 tsc_interval:26100761)
[  152.555714] bench_page_pool_simple: time_bench_page_pool02_ptr_ring(): Cannot use page_pool fast-path
[  153.342212] time_bench: Type:no-softirq-page_pool02 Per elem: 7 cycles(tsc) 77.729 ns (step:0) - (measurement period time:0.777293380 sec time_interval:777293380) - (invoke count:10000000 tsc_interval:77729331)
[  153.360881] bench_page_pool_simple: time_bench_page_pool03_slow(): Cannot use page_pool fast-path
[  155.287747] time_bench: Type:no-softirq-page_pool03 Per elem: 19 cycles(tsc) 191.800 ns (step:0) - (measurement period time:1.918007990 sec time_interval:1918007990) - (invoke count:10000000 tsc_interval:191800791)
[  155.306766] bench_page_pool_simple: pp_tasklet_handler(): in_serving_softirq fast-path
[  155.314670] bench_page_pool_simple: time_bench_page_pool01_fast_path(): in_serving_softirq fast-path
[  155.584313] time_bench: Type:tasklet_page_pool01_fast_path Per elem: 2 cycles(tsc) 26.052 ns (step:0) - (measurement period time:0.260524810 sec time_interval:260524810) - (invoke count:10000000 tsc_interval:26052476)
[  155.603588] bench_page_pool_simple: time_bench_page_pool02_ptr_ring(): in_serving_softirq fast-path
[  156.183214] time_bench: Type:tasklet_page_pool02_ptr_ring Per elem: 5 cycles(tsc) 57.059 ns (step:0) - (measurement period time:0.570594850 sec time_interval:570594850) - (invoke count:10000000 tsc_interval:57059478)
[  156.202402] bench_page_pool_simple: time_bench_page_pool03_slow(): in_serving_softirq fast-path
[  158.045594] time_bench: Type:tasklet_page_pool03_slow Per elem: 18 cycles(tsc) 183.450 ns (step:0) - (measurement period time:1.834507700 sec time_interval:1834507700) - (invoke count:10000000 tsc_interval:183450764)

Patch for time_bench.h enable the out of tree testing on arm64 system:
@@ -101,6 +101,7 @@ struct time_bench_cpu {
  *  CPUID clears the high 32-bits of all (rax/rbx/rcx/rdx)
  */
 static __always_inline uint64_t tsc_start_clock(void) {
+#if defined(__i386__) || defined(__x86_64__)
        /* See: Intel Doc #324264 */
        unsigned hi, lo;
        asm volatile (
@@ -111,9 +112,13 @@ static __always_inline uint64_t tsc_start_clock(void) {
                "%rax", "%rbx", "%rcx", "%rdx");
        //FIXME: on 32bit use clobbered %eax + %edx
        return ((uint64_t)lo) | (((uint64_t)hi) << 32);
+#else
+       return get_cycles();
+#endif
 }

 static __always_inline uint64_t tsc_stop_clock(void) {
+#if defined(__i386__) || defined(__x86_64__)
        /* See: Intel Doc #324264 */
        unsigned hi, lo;
        asm volatile(
@@ -123,6 +128,9 @@ static __always_inline uint64_t tsc_stop_clock(void) {
                "CPUID\n\t": "=r" (hi), "=r" (lo)::
                "%rax", "%rbx", "%rcx", "%rdx");
        return ((uint64_t)lo) | (((uint64_t)hi) << 32);
+#else
+       return get_cycles();
+#endif
 }

 /* Notes for RDTSC and RDTSCP
@@ -186,10 +194,14 @@ enum {

 static __always_inline unsigned long long p_rdpmc(unsigned in)
 {
+#if defined(__i386__) || defined(__x86_64__)
        unsigned d, a;

        asm volatile("rdpmc" : "=d" (d), "=a" (a) : "c" (in) : "memory");
        return ((unsigned long long)d << 32) | a;
+#else
+       return 0;
+#endif
 }

 /* These PMU counter needs to be enabled, but I don't have the
@@ -216,7 +228,11 @@ static __always_inline unsigned long long pmc_clk(void)
 #define MSR_IA32_PCM2 0x400000C3
 inline uint64_t msr_inst(unsigned long long *msr_result)
 {
+#if defined(__i386__) || defined(__x86_64__)
        return rdmsrl_safe(MSR_IA32_PCM0, msr_result);
+#else
+       return 0;
+#endif
 }

1. https://lore.kernel.org/lkml/8067f204-1380-4d37-8ffd-007fc6f26738 at kernel.org/T/

CC: Alexander Lobakin <aleksander.lobakin at intel.com>
CC: Robin Murphy <robin.murphy at arm.com>
CC: Alexander Duyck <alexander.duyck at gmail.com>
CC: IOMMU <iommu at lists.linux.dev>

Change log:
V2:
  1. Add a item_full stat.
  2. Use container_of() for page_pool_to_pp().

Yunsheng Lin (2):
  page_pool: fix timing for checking and disabling napi_local
  page_pool: fix IOMMU crash when driver has already unbound

 drivers/net/ethernet/freescale/fec_main.c     |   8 +-
 drivers/net/ethernet/intel/iavf/iavf_txrx.c   |   6 +-
 drivers/net/ethernet/intel/idpf/idpf_txrx.c   |  14 +-
 drivers/net/ethernet/intel/libeth/rx.c        |   2 +-
 .../net/ethernet/mellanox/mlx5/core/en/xdp.c  |   3 +-
 drivers/net/netdevsim/netdev.c                |   6 +-
 drivers/net/wireless/mediatek/mt76/mt76.h     |   2 +-
 include/linux/mm_types.h                      |   2 +-
 include/linux/skbuff.h                        |   1 +
 include/net/libeth/rx.h                       |   3 +-
 include/net/netmem.h                          |  10 +-
 include/net/page_pool/helpers.h               |   7 +
 include/net/page_pool/types.h                 |  17 +-
 net/core/devmem.c                             |   4 +-
 net/core/netmem_priv.h                        |   5 +-
 net/core/page_pool.c                          | 190 +++++++++++++++---
 net/core/page_pool_priv.h                     |  10 +-
 net/core/skbuff.c                             |   3 +-
 net/core/xdp.c                                |   3 +-
 19 files changed, 238 insertions(+), 58 deletions(-)

-- 
2.33.0



From linyunsheng at huawei.com  Wed Sep 25 00:57:07 2024
From: linyunsheng at huawei.com (Yunsheng Lin)
Date: Wed, 25 Sep 2024 15:57:07 +0800
Subject: [PATCH net v2 2/2] page_pool: fix IOMMU crash when driver has already unbound
In-Reply-To: <20240925075707.3970187-1-linyunsheng@huawei.com>
References: <20240925075707.3970187-1-linyunsheng@huawei.com>
Message-ID: <20240925075707.3970187-3-linyunsheng@huawei.com>

Networking driver with page_pool support may hand over page
still with dma mapping to network stack and try to reuse that
page after network stack is done with it and passes it back
to page_pool to avoid the penalty of dma mapping/unmapping.
With all the caching in the network stack, some pages may be
held in the network stack without returning to the page_pool
soon enough, and with VF disable causing the driver unbound,
the page_pool does not stop the driver from doing it's
unbounding work, instead page_pool uses workqueue to check
if there is some pages coming back from the network stack
periodically, if there is any, it will do the dma unmmapping
related cleanup work.

As mentioned in [1], attempting DMA unmaps after the driver
has already unbound may leak resources or at worst corrupt
memory. Fundamentally, the page pool code cannot allow DMA
mappings to outlive the driver they belong to.

Currently it seems there are at least two cases that the page
is not released fast enough causing dma unmmapping done after
driver has already unbound:
1. ipv4 packet defragmentation timeout: this seems to cause
   delay up to 30 secs.
2. skb_defer_free_flush(): this may cause infinite delay if
   there is no triggering for net_rx_action().

In order not to do the dma unmmapping after driver has already
unbound and stall the unloading of the networking driver, add
the pool->items array to record all the pages including the ones
which are handed over to network stack, so the page_pool can
do the dma unmmapping for those pages when page_pool_destroy()
is called. As the pool->items need to be large enough to avoid
performance degradation, add a 'item_full' stat to indicate the
allocation failure due to unavailability of pool->items.

Note, the devmem patchset seems to make the bug harder to fix,
and may make backporting harder too. As there is no actual user
for the devmem and the fixing for devmem is unclear for now,
this patch does not consider fixing the case for devmem yet.

1. https://lore.kernel.org/lkml/8067f204-1380-4d37-8ffd-007fc6f26738 at kernel.org/T/

Fixes: f71fec47c2df ("page_pool: make sure struct device is stable")
Signed-off-by: Yunsheng Lin <linyunsheng at huawei.com>
CC: Robin Murphy <robin.murphy at arm.com>
CC: Alexander Duyck <alexander.duyck at gmail.com>
CC: IOMMU <iommu at lists.linux.dev>
---
 drivers/net/ethernet/freescale/fec_main.c     |   8 +-
 drivers/net/ethernet/intel/iavf/iavf_txrx.c   |   6 +-
 drivers/net/ethernet/intel/idpf/idpf_txrx.c   |  14 +-
 drivers/net/ethernet/intel/libeth/rx.c        |   2 +-
 .../net/ethernet/mellanox/mlx5/core/en/xdp.c  |   3 +-
 drivers/net/netdevsim/netdev.c                |   6 +-
 drivers/net/wireless/mediatek/mt76/mt76.h     |   2 +-
 include/linux/mm_types.h                      |   2 +-
 include/linux/skbuff.h                        |   1 +
 include/net/libeth/rx.h                       |   3 +-
 include/net/netmem.h                          |  10 +-
 include/net/page_pool/helpers.h               |   7 +
 include/net/page_pool/types.h                 |  17 +-
 net/core/devmem.c                             |   4 +-
 net/core/netmem_priv.h                        |   5 +-
 net/core/page_pool.c                          | 163 +++++++++++++++---
 net/core/page_pool_priv.h                     |  10 +-
 net/core/skbuff.c                             |   3 +-
 net/core/xdp.c                                |   3 +-
 19 files changed, 212 insertions(+), 57 deletions(-)

diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c
index acbb627d51bf..c00f8c460759 100644
--- a/drivers/net/ethernet/freescale/fec_main.c
+++ b/drivers/net/ethernet/freescale/fec_main.c
@@ -1009,7 +1009,8 @@ static void fec_enet_bd_init(struct net_device *dev)
 				struct page *page = txq->tx_buf[i].buf_p;
 
 				if (page)
-					page_pool_put_page(page->pp, page, 0, false);
+					page_pool_put_page(page_pool_to_pp(page),
+							   page, 0, false);
 			}
 
 			txq->tx_buf[i].buf_p = NULL;
@@ -1538,7 +1539,7 @@ fec_enet_tx_queue(struct net_device *ndev, u16 queue_id, int budget)
 			xdp_return_frame_rx_napi(xdpf);
 		} else { /* recycle pages of XDP_TX frames */
 			/* The dma_sync_size = 0 as XDP_TX has already synced DMA for_device */
-			page_pool_put_page(page->pp, page, 0, true);
+			page_pool_put_page(page_pool_to_pp(page), page, 0, true);
 		}
 
 		txq->tx_buf[index].buf_p = NULL;
@@ -3300,7 +3301,8 @@ static void fec_enet_free_buffers(struct net_device *ndev)
 			} else {
 				struct page *page = txq->tx_buf[i].buf_p;
 
-				page_pool_put_page(page->pp, page, 0, false);
+				page_pool_put_page(page_pool_to_pp(page),
+						   page, 0, false);
 			}
 
 			txq->tx_buf[i].buf_p = NULL;
diff --git a/drivers/net/ethernet/intel/iavf/iavf_txrx.c b/drivers/net/ethernet/intel/iavf/iavf_txrx.c
index 26b424fd6718..658d8f9a6abb 100644
--- a/drivers/net/ethernet/intel/iavf/iavf_txrx.c
+++ b/drivers/net/ethernet/intel/iavf/iavf_txrx.c
@@ -1050,7 +1050,8 @@ static void iavf_add_rx_frag(struct sk_buff *skb,
 			     const struct libeth_fqe *rx_buffer,
 			     unsigned int size)
 {
-	u32 hr = rx_buffer->page->pp->p.offset;
+	struct page_pool *pool = page_pool_to_pp(rx_buffer->page);
+	u32 hr = pool->p.offset;
 
 	skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags, rx_buffer->page,
 			rx_buffer->offset + hr, size, rx_buffer->truesize);
@@ -1067,7 +1068,8 @@ static void iavf_add_rx_frag(struct sk_buff *skb,
 static struct sk_buff *iavf_build_skb(const struct libeth_fqe *rx_buffer,
 				      unsigned int size)
 {
-	u32 hr = rx_buffer->page->pp->p.offset;
+	struct page_pool *pool = page_pool_to_pp(rx_buffer->page);
+	u32 hr = pool->p.offset;
 	struct sk_buff *skb;
 	void *va;
 
diff --git a/drivers/net/ethernet/intel/idpf/idpf_txrx.c b/drivers/net/ethernet/intel/idpf/idpf_txrx.c
index d4e6f0e10487..e3389f1a215f 100644
--- a/drivers/net/ethernet/intel/idpf/idpf_txrx.c
+++ b/drivers/net/ethernet/intel/idpf/idpf_txrx.c
@@ -385,7 +385,8 @@ static void idpf_rx_page_rel(struct libeth_fqe *rx_buf)
 	if (unlikely(!rx_buf->page))
 		return;
 
-	page_pool_put_full_page(rx_buf->page->pp, rx_buf->page, false);
+	page_pool_put_full_page(page_pool_to_pp(rx_buf->page), rx_buf->page,
+				false);
 
 	rx_buf->page = NULL;
 	rx_buf->offset = 0;
@@ -3097,7 +3098,8 @@ idpf_rx_process_skb_fields(struct idpf_rx_queue *rxq, struct sk_buff *skb,
 void idpf_rx_add_frag(struct idpf_rx_buf *rx_buf, struct sk_buff *skb,
 		      unsigned int size)
 {
-	u32 hr = rx_buf->page->pp->p.offset;
+	struct page_pool *pool = page_pool_to_pp(rx_buf->page);
+	u32 hr = pool->p.offset;
 
 	skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags, rx_buf->page,
 			rx_buf->offset + hr, size, rx_buf->truesize);
@@ -3129,8 +3131,10 @@ static u32 idpf_rx_hsplit_wa(const struct libeth_fqe *hdr,
 	if (!libeth_rx_sync_for_cpu(buf, copy))
 		return 0;
 
-	dst = page_address(hdr->page) + hdr->offset + hdr->page->pp->p.offset;
-	src = page_address(buf->page) + buf->offset + buf->page->pp->p.offset;
+	dst = page_address(hdr->page) + hdr->offset +
+		page_pool_to_pp(hdr->page)->p.offset;
+	src = page_address(buf->page) + buf->offset +
+		page_pool_to_pp(buf->page)->p.offset;
 	memcpy(dst, src, LARGEST_ALIGN(copy));
 
 	buf->offset += copy;
@@ -3148,7 +3152,7 @@ static u32 idpf_rx_hsplit_wa(const struct libeth_fqe *hdr,
  */
 struct sk_buff *idpf_rx_build_skb(const struct libeth_fqe *buf, u32 size)
 {
-	u32 hr = buf->page->pp->p.offset;
+	u32 hr = page_pool_to_pp(buf->page)->p.offset;
 	struct sk_buff *skb;
 	void *va;
 
diff --git a/drivers/net/ethernet/intel/libeth/rx.c b/drivers/net/ethernet/intel/libeth/rx.c
index f20926669318..385afca0e61d 100644
--- a/drivers/net/ethernet/intel/libeth/rx.c
+++ b/drivers/net/ethernet/intel/libeth/rx.c
@@ -207,7 +207,7 @@ EXPORT_SYMBOL_NS_GPL(libeth_rx_fq_destroy, LIBETH);
  */
 void libeth_rx_recycle_slow(struct page *page)
 {
-	page_pool_recycle_direct(page->pp, page);
+	page_pool_recycle_direct(page_pool_to_pp(page), page);
 }
 EXPORT_SYMBOL_NS_GPL(libeth_rx_recycle_slow, LIBETH);
 
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c b/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c
index 4610621a340e..83511a45a6dc 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c
@@ -716,7 +716,8 @@ static void mlx5e_free_xdpsq_desc(struct mlx5e_xdpsq *sq,
 				/* No need to check ((page->pp_magic & ~0x3UL) == PP_SIGNATURE)
 				 * as we know this is a page_pool page.
 				 */
-				page_pool_recycle_direct(page->pp, page);
+				page_pool_recycle_direct(page_pool_to_pp(page),
+							 page);
 			} while (++n < num);
 
 			break;
diff --git a/drivers/net/netdevsim/netdev.c b/drivers/net/netdevsim/netdev.c
index 017a6102be0a..9bfa593cd5dd 100644
--- a/drivers/net/netdevsim/netdev.c
+++ b/drivers/net/netdevsim/netdev.c
@@ -593,7 +593,8 @@ nsim_pp_hold_write(struct file *file, const char __user *data,
 		if (!ns->page)
 			ret = -ENOMEM;
 	} else {
-		page_pool_put_full_page(ns->page->pp, ns->page, false);
+		page_pool_put_full_page(page_pool_to_pp(ns->page), ns->page,
+					false);
 		ns->page = NULL;
 	}
 	rtnl_unlock();
@@ -788,7 +789,8 @@ void nsim_destroy(struct netdevsim *ns)
 
 	/* Put this intentionally late to exercise the orphaning path */
 	if (ns->page) {
-		page_pool_put_full_page(ns->page->pp, ns->page, false);
+		page_pool_put_full_page(page_pool_to_pp(ns->page), ns->page,
+					false);
 		ns->page = NULL;
 	}
 
diff --git a/drivers/net/wireless/mediatek/mt76/mt76.h b/drivers/net/wireless/mediatek/mt76/mt76.h
index 0b75a45ad2e8..94a277290909 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76.h
+++ b/drivers/net/wireless/mediatek/mt76/mt76.h
@@ -1688,7 +1688,7 @@ static inline void mt76_put_page_pool_buf(void *buf, bool allow_direct)
 {
 	struct page *page = virt_to_head_page(buf);
 
-	page_pool_put_full_page(page->pp, page, allow_direct);
+	page_pool_put_full_page(page_pool_to_pp(page), page, allow_direct);
 }
 
 static inline void *
diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h
index 485424979254..410187133d27 100644
--- a/include/linux/mm_types.h
+++ b/include/linux/mm_types.h
@@ -120,7 +120,7 @@ struct page {
 			 * page_pool allocated pages.
 			 */
 			unsigned long pp_magic;
-			struct page_pool *pp;
+			struct page_pool_item *pp_item;
 			unsigned long _pp_mapping_pad;
 			unsigned long dma_addr;
 			atomic_long_t pp_ref_count;
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
index 39f1d16f3628..64d1ecb7a7fc 100644
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
@@ -38,6 +38,7 @@
 #include <net/net_debug.h>
 #include <net/dropreason-core.h>
 #include <net/netmem.h>
+#include <net/page_pool/types.h>
 
 /**
  * DOC: skb checksums
diff --git a/include/net/libeth/rx.h b/include/net/libeth/rx.h
index 43574bd6612f..beee7ddd77a5 100644
--- a/include/net/libeth/rx.h
+++ b/include/net/libeth/rx.h
@@ -137,7 +137,8 @@ static inline bool libeth_rx_sync_for_cpu(const struct libeth_fqe *fqe,
 		return false;
 	}
 
-	page_pool_dma_sync_for_cpu(page->pp, page, fqe->offset, len);
+	page_pool_dma_sync_for_cpu(page_pool_to_pp(page), page, fqe->offset,
+				   len);
 
 	return true;
 }
diff --git a/include/net/netmem.h b/include/net/netmem.h
index 8a6e20be4b9d..5e7b4d1c1c44 100644
--- a/include/net/netmem.h
+++ b/include/net/netmem.h
@@ -23,7 +23,7 @@ DECLARE_STATIC_KEY_FALSE(page_pool_mem_providers);
 struct net_iov {
 	unsigned long __unused_padding;
 	unsigned long pp_magic;
-	struct page_pool *pp;
+	struct page_pool_item *pp_item;
 	struct dmabuf_genpool_chunk_owner *owner;
 	unsigned long dma_addr;
 	atomic_long_t pp_ref_count;
@@ -33,7 +33,7 @@ struct net_iov {
  *
  *        struct {
  *                unsigned long pp_magic;
- *                struct page_pool *pp;
+ *                struct page_pool_item *pp_item;
  *                unsigned long _pp_mapping_pad;
  *                unsigned long dma_addr;
  *                atomic_long_t pp_ref_count;
@@ -49,7 +49,7 @@ struct net_iov {
 	static_assert(offsetof(struct page, pg) == \
 		      offsetof(struct net_iov, iov))
 NET_IOV_ASSERT_OFFSET(pp_magic, pp_magic);
-NET_IOV_ASSERT_OFFSET(pp, pp);
+NET_IOV_ASSERT_OFFSET(pp_item, pp_item);
 NET_IOV_ASSERT_OFFSET(dma_addr, dma_addr);
 NET_IOV_ASSERT_OFFSET(pp_ref_count, pp_ref_count);
 #undef NET_IOV_ASSERT_OFFSET
@@ -127,9 +127,9 @@ static inline struct net_iov *__netmem_clear_lsb(netmem_ref netmem)
 	return (struct net_iov *)((__force unsigned long)netmem & ~NET_IOV);
 }
 
-static inline struct page_pool *netmem_get_pp(netmem_ref netmem)
+static inline struct page_pool_item *netmem_get_pp_item(netmem_ref netmem)
 {
-	return __netmem_clear_lsb(netmem)->pp;
+	return __netmem_clear_lsb(netmem)->pp_item;
 }
 
 static inline atomic_long_t *netmem_get_pp_ref_count_ref(netmem_ref netmem)
diff --git a/include/net/page_pool/helpers.h b/include/net/page_pool/helpers.h
index 793e6fd78bc5..f781c81f8aa9 100644
--- a/include/net/page_pool/helpers.h
+++ b/include/net/page_pool/helpers.h
@@ -83,6 +83,13 @@ static inline u64 *page_pool_ethtool_stats_get(u64 *data, const void *stats)
 }
 #endif
 
+static inline struct page_pool *page_pool_to_pp(struct page *page)
+{
+	struct page_pool_item *item = page->pp_item;
+
+	return container_of(item, struct page_pool, items[item->pp_idx]);
+}
+
 /**
  * page_pool_dev_alloc_pages() - allocate a page.
  * @pool:	pool from which to allocate
diff --git a/include/net/page_pool/types.h b/include/net/page_pool/types.h
index c022c410abe3..194006d2930f 100644
--- a/include/net/page_pool/types.h
+++ b/include/net/page_pool/types.h
@@ -102,6 +102,7 @@ struct page_pool_params {
  * @refill:	an allocation which triggered a refill of the cache
  * @waive:	pages obtained from the ptr ring that cannot be added to
  *		the cache due to a NUMA mismatch
+ * @item_full	items array is full
  */
 struct page_pool_alloc_stats {
 	u64 fast;
@@ -110,6 +111,7 @@ struct page_pool_alloc_stats {
 	u64 empty;
 	u64 refill;
 	u64 waive;
+	u64 item_full;
 };
 
 /**
@@ -142,6 +144,11 @@ struct page_pool_stats {
 };
 #endif
 
+struct page_pool_item {
+	netmem_ref pp_netmem;
+	unsigned int pp_idx;
+};
+
 /* The whole frag API block must stay within one cacheline. On 32-bit systems,
  * sizeof(long) == sizeof(int), so that the block size is ``3 * sizeof(long)``.
  * On 64-bit systems, the actual size is ``2 * sizeof(long) + sizeof(int)``.
@@ -161,6 +168,8 @@ struct page_pool {
 
 	int cpuid;
 	u32 pages_state_hold_cnt;
+	unsigned int item_mask;
+	unsigned int item_idx;
 
 	bool has_init_callback:1;	/* slow::init_callback is set */
 	bool dma_map:1;			/* Perform DMA mapping */
@@ -228,7 +237,11 @@ struct page_pool {
 	 */
 	refcount_t user_cnt;
 
-	u64 destroy_cnt;
+	/* Lock to avoid doing dma unmapping concurrently when
+	 * destroy_cnt > 0.
+	 */
+	spinlock_t destroy_lock;
+	unsigned int destroy_cnt;
 
 	/* Slow/Control-path information follows */
 	struct page_pool_params_slow slow;
@@ -239,6 +252,8 @@ struct page_pool {
 		u32 napi_id;
 		u32 id;
 	} user;
+
+	struct page_pool_item items[] ____cacheline_aligned_in_smp;
 };
 
 struct page *page_pool_alloc_pages(struct page_pool *pool, gfp_t gfp);
diff --git a/net/core/devmem.c b/net/core/devmem.c
index 11b91c12ee11..09c5aa83f12a 100644
--- a/net/core/devmem.c
+++ b/net/core/devmem.c
@@ -85,7 +85,7 @@ net_devmem_alloc_dmabuf(struct net_devmem_dmabuf_binding *binding)
 	niov = &owner->niovs[index];
 
 	niov->pp_magic = 0;
-	niov->pp = NULL;
+	niov->pp_item = NULL;
 	atomic_long_set(&niov->pp_ref_count, 0);
 
 	return niov;
@@ -380,7 +380,7 @@ bool mp_dmabuf_devmem_release_page(struct page_pool *pool, netmem_ref netmem)
 	if (WARN_ON_ONCE(refcount != 1))
 		return false;
 
-	page_pool_clear_pp_info(netmem);
+	page_pool_clear_pp_info(pool, netmem);
 
 	net_devmem_free_dmabuf(netmem_to_net_iov(netmem));
 
diff --git a/net/core/netmem_priv.h b/net/core/netmem_priv.h
index 7eadb8393e00..3173f6070cf7 100644
--- a/net/core/netmem_priv.h
+++ b/net/core/netmem_priv.h
@@ -18,9 +18,10 @@ static inline void netmem_clear_pp_magic(netmem_ref netmem)
 	__netmem_clear_lsb(netmem)->pp_magic = 0;
 }
 
-static inline void netmem_set_pp(netmem_ref netmem, struct page_pool *pool)
+static inline void netmem_set_pp_item(netmem_ref netmem,
+				      struct page_pool_item *item)
 {
-	__netmem_clear_lsb(netmem)->pp = pool;
+	__netmem_clear_lsb(netmem)->pp_item = item;
 }
 
 static inline void netmem_set_dma_addr(netmem_ref netmem,
diff --git a/net/core/page_pool.c b/net/core/page_pool.c
index bec6e717cd22..3e041b80f62d 100644
--- a/net/core/page_pool.c
+++ b/net/core/page_pool.c
@@ -61,6 +61,7 @@ static const char pp_stats[][ETH_GSTRING_LEN] = {
 	"rx_pp_alloc_empty",
 	"rx_pp_alloc_refill",
 	"rx_pp_alloc_waive",
+	"rx_pp_alloc_item_full",
 	"rx_pp_recycle_cached",
 	"rx_pp_recycle_cache_full",
 	"rx_pp_recycle_ring",
@@ -94,6 +95,7 @@ bool page_pool_get_stats(const struct page_pool *pool,
 	stats->alloc_stats.empty += pool->alloc_stats.empty;
 	stats->alloc_stats.refill += pool->alloc_stats.refill;
 	stats->alloc_stats.waive += pool->alloc_stats.waive;
+	stats->alloc_stats.item_full += pool->alloc_stats.item_full;
 
 	for_each_possible_cpu(cpu) {
 		const struct page_pool_recycle_stats *pcpu =
@@ -139,6 +141,7 @@ u64 *page_pool_ethtool_stats_get(u64 *data, const void *stats)
 	*data++ = pool_stats->alloc_stats.empty;
 	*data++ = pool_stats->alloc_stats.refill;
 	*data++ = pool_stats->alloc_stats.waive;
+	*data++ = pool_stats->alloc_stats.item_full;
 	*data++ = pool_stats->recycle_stats.cached;
 	*data++ = pool_stats->recycle_stats.cache_full;
 	*data++ = pool_stats->recycle_stats.ring;
@@ -267,14 +270,12 @@ static int page_pool_init(struct page_pool *pool,
 		return -ENOMEM;
 	}
 
+	spin_lock_init(&pool->destroy_lock);
 	atomic_set(&pool->pages_state_release_cnt, 0);
 
 	/* Driver calling page_pool_create() also call page_pool_destroy() */
 	refcount_set(&pool->user_cnt, 1);
 
-	if (pool->dma_map)
-		get_device(pool->p.dev);
-
 	if (pool->slow.flags & PP_FLAG_ALLOW_UNREADABLE_NETMEM) {
 		/* We rely on rtnl_lock()ing to make sure netdev_rx_queue
 		 * configuration doesn't change while we're initializing
@@ -312,15 +313,91 @@ static void page_pool_uninit(struct page_pool *pool)
 {
 	ptr_ring_cleanup(&pool->ring, NULL);
 
-	if (pool->dma_map)
-		put_device(pool->p.dev);
-
 #ifdef CONFIG_PAGE_POOL_STATS
 	if (!pool->system)
 		free_percpu(pool->recycle_stats);
 #endif
 }
 
+static void page_pool_item_init(struct page_pool *pool, unsigned int item_cnt)
+{
+	struct page_pool_item *items = pool->items;
+	unsigned int i;
+
+	WARN_ON_ONCE(!is_power_of_2(item_cnt));
+
+	for (i = 0; i < item_cnt; i++)
+		items[i].pp_idx = i;
+
+	pool->item_mask = item_cnt - 1;
+}
+
+static void page_pool_item_uninit(struct page_pool *pool)
+{
+	struct page_pool_item *items = pool->items;
+	unsigned int mask = pool->item_mask;
+	unsigned int i;
+
+	if (!pool->dma_map || pool->mp_priv)
+		return;
+
+	spin_lock_bh(&pool->destroy_lock);
+
+	for (i = 0; i <= mask; i++) {
+		struct page *page;
+
+		page = netmem_to_page(READ_ONCE(items[i].pp_netmem));
+		if (!page)
+			continue;
+
+		WARN_ONCE(1, "page_pool(%u) has inflight page: %p\n",
+			  pool->user.id, page);
+
+		dma_unmap_page_attrs(pool->p.dev, page_pool_get_dma_addr(page),
+				     PAGE_SIZE << pool->p.order,
+				     pool->p.dma_dir, DMA_ATTR_SKIP_CPU_SYNC |
+				     DMA_ATTR_WEAK_ORDERING);
+		page_pool_set_dma_addr(page, 0);
+	}
+
+	pool->dma_map = false;
+	spin_unlock_bh(&pool->destroy_lock);
+}
+
+static bool page_pool_item_add(struct page_pool *pool, netmem_ref netmem)
+{
+	struct page_pool_item *items = pool->items;
+	unsigned int mask = pool->item_mask;
+	unsigned int idx = pool->item_idx;
+	unsigned int i;
+
+	for (i = 0; i <= mask; i++) {
+		unsigned int mask_idx = idx++ & mask;
+
+		if (!READ_ONCE(items[mask_idx].pp_netmem)) {
+			WRITE_ONCE(items[mask_idx].pp_netmem, netmem);
+			netmem_set_pp_item(netmem, &items[mask_idx]);
+			pool->item_idx = idx;
+			return true;
+		}
+	}
+
+	pool->item_idx = idx;
+	alloc_stat_inc(pool, item_full);
+	return false;
+}
+
+static void page_pool_item_del(struct page_pool *pool, netmem_ref netmem)
+{
+	struct page_pool_item *item = netmem_to_page(netmem)->pp_item;
+	struct page_pool_item *items = pool->items;
+	unsigned int idx = item->pp_idx;
+
+	DEBUG_NET_WARN_ON_ONCE(items[idx].pp_netmem != netmem);
+	WRITE_ONCE(items[idx].pp_netmem, (netmem_ref)NULL);
+	netmem_set_pp_item(netmem, NULL);
+}
+
 /**
  * page_pool_create_percpu() - create a page pool for a given cpu.
  * @params: parameters, see struct page_pool_params
@@ -329,10 +406,15 @@ static void page_pool_uninit(struct page_pool *pool)
 struct page_pool *
 page_pool_create_percpu(const struct page_pool_params *params, int cpuid)
 {
+#define PAGE_POOL_MIN_INFLIGHT_ITEMS		512
+	unsigned int item_cnt = (params->pool_size ? : 1024) +
+				PP_ALLOC_CACHE_SIZE + PAGE_POOL_MIN_INFLIGHT_ITEMS;
 	struct page_pool *pool;
 	int err;
 
-	pool = kzalloc_node(sizeof(*pool), GFP_KERNEL, params->nid);
+	item_cnt = roundup_pow_of_two(item_cnt);
+	pool = kvzalloc_node(struct_size(pool, items, item_cnt), GFP_KERNEL,
+			     params->nid);
 	if (!pool)
 		return ERR_PTR(-ENOMEM);
 
@@ -340,6 +422,8 @@ page_pool_create_percpu(const struct page_pool_params *params, int cpuid)
 	if (err < 0)
 		goto err_free;
 
+	page_pool_item_init(pool, item_cnt);
+
 	err = page_pool_list(pool);
 	if (err)
 		goto err_uninit;
@@ -350,7 +434,7 @@ page_pool_create_percpu(const struct page_pool_params *params, int cpuid)
 	page_pool_uninit(pool);
 err_free:
 	pr_warn("%s() gave up with errno %d\n", __func__, err);
-	kfree(pool);
+	kvfree(pool);
 	return ERR_PTR(err);
 }
 EXPORT_SYMBOL(page_pool_create_percpu);
@@ -499,19 +583,24 @@ static struct page *__page_pool_alloc_page_order(struct page_pool *pool,
 	if (unlikely(!page))
 		return NULL;
 
-	if (pool->dma_map && unlikely(!page_pool_dma_map(pool, page_to_netmem(page)))) {
-		put_page(page);
-		return NULL;
-	}
+	if (unlikely(!page_pool_set_pp_info(pool, page_to_netmem(page))))
+		goto err_alloc;
+
+	if (pool->dma_map && unlikely(!page_pool_dma_map(pool, page_to_netmem(page))))
+		goto err_set_info;
 
 	alloc_stat_inc(pool, slow_high_order);
-	page_pool_set_pp_info(pool, page_to_netmem(page));
 
 	/* Track how many pages are held 'in-flight' */
 	pool->pages_state_hold_cnt++;
 	trace_page_pool_state_hold(pool, page_to_netmem(page),
 				   pool->pages_state_hold_cnt);
 	return page;
+err_set_info:
+	page_pool_clear_pp_info(pool, page_to_netmem(page));
+err_alloc:
+	put_page(page);
+	return NULL;
 }
 
 /* slow path */
@@ -546,12 +635,18 @@ static noinline netmem_ref __page_pool_alloc_pages_slow(struct page_pool *pool,
 	 */
 	for (i = 0; i < nr_pages; i++) {
 		netmem = pool->alloc.cache[i];
+
+		if (unlikely(!page_pool_set_pp_info(pool, netmem))) {
+			put_page(netmem_to_page(netmem));
+			continue;
+		}
+
 		if (dma_map && unlikely(!page_pool_dma_map(pool, netmem))) {
+			page_pool_clear_pp_info(pool, netmem);
 			put_page(netmem_to_page(netmem));
 			continue;
 		}
 
-		page_pool_set_pp_info(pool, netmem);
 		pool->alloc.cache[pool->alloc.count++] = netmem;
 		/* Track how many pages are held 'in-flight' */
 		pool->pages_state_hold_cnt++;
@@ -623,9 +718,13 @@ s32 page_pool_inflight(const struct page_pool *pool, bool strict)
 	return inflight;
 }
 
-void page_pool_set_pp_info(struct page_pool *pool, netmem_ref netmem)
+bool page_pool_set_pp_info(struct page_pool *pool, netmem_ref netmem)
 {
-	netmem_set_pp(netmem, pool);
+	if (unlikely(!page_pool_item_add(pool, netmem)))
+		return false;
+
+	DEBUG_NET_WARN_ON_ONCE(page_pool_to_pp(netmem_to_page(netmem)) != pool);
+
 	netmem_or_pp_magic(netmem, PP_SIGNATURE);
 
 	/* Ensuring all pages have been split into one fragment initially:
@@ -637,12 +736,14 @@ void page_pool_set_pp_info(struct page_pool *pool, netmem_ref netmem)
 	page_pool_fragment_netmem(netmem, 1);
 	if (pool->has_init_callback)
 		pool->slow.init_callback(netmem, pool->slow.init_arg);
+
+	return true;
 }
 
-void page_pool_clear_pp_info(netmem_ref netmem)
+void page_pool_clear_pp_info(struct page_pool *pool, netmem_ref netmem)
 {
 	netmem_clear_pp_magic(netmem);
-	netmem_set_pp(netmem, NULL);
+	page_pool_item_del(pool, netmem);
 }
 
 static __always_inline void __page_pool_release_page_dma(struct page_pool *pool,
@@ -672,9 +773,13 @@ static __always_inline void __page_pool_release_page_dma(struct page_pool *pool,
  */
 void page_pool_return_page(struct page_pool *pool, netmem_ref netmem)
 {
+	unsigned int destroy_cnt = READ_ONCE(pool->destroy_cnt);
 	int count;
 	bool put;
 
+	if (unlikely(destroy_cnt))
+		spin_lock_bh(&pool->destroy_lock);
+
 	put = true;
 	if (static_branch_unlikely(&page_pool_mem_providers) && pool->mp_priv)
 		put = mp_dmabuf_devmem_release_page(pool, netmem);
@@ -688,9 +793,13 @@ void page_pool_return_page(struct page_pool *pool, netmem_ref netmem)
 	trace_page_pool_state_release(pool, netmem, count);
 
 	if (put) {
-		page_pool_clear_pp_info(netmem);
+		page_pool_clear_pp_info(pool, netmem);
 		put_page(netmem_to_page(netmem));
 	}
+
+	if (unlikely(destroy_cnt))
+		spin_unlock_bh(&pool->destroy_lock);
+
 	/* An optimization would be to call __free_pages(page, pool->p.order)
 	 * knowing page is not part of page-cache (thus avoiding a
 	 * __page_cache_release() call).
@@ -1034,14 +1143,14 @@ static void __page_pool_destroy(struct page_pool *pool)
 		static_branch_dec(&page_pool_mem_providers);
 	}
 
-	kfree(pool);
+	kvfree(pool);
 }
 
 static void page_pool_empty_alloc_cache_once(struct page_pool *pool)
 {
 	netmem_ref netmem;
 
-	if (pool->destroy_cnt)
+	if (pool->destroy_cnt > 1)
 		return;
 
 	/* Empty alloc cache, assume caller made sure this is
@@ -1057,7 +1166,7 @@ static void page_pool_empty_alloc_cache_once(struct page_pool *pool)
 static void page_pool_scrub(struct page_pool *pool)
 {
 	page_pool_empty_alloc_cache_once(pool);
-	pool->destroy_cnt++;
+	WRITE_ONCE(pool->destroy_cnt, pool->destroy_cnt + 1);
 
 	/* No more consumers should exist, but producers could still
 	 * be in-flight.
@@ -1139,10 +1248,14 @@ void page_pool_destroy(struct page_pool *pool)
 	if (!page_pool_put(pool))
 		return;
 
+	/* disable dma_sync_for_device */
+	pool->dma_sync = false;
+
 	page_pool_disable_direct_recycling(pool);
+	WRITE_ONCE(pool->destroy_cnt, 1);
 
-	/* Wait for the freeing side see the disabling direct recycling setting
-	 * to avoid the concurrent access to the pool->alloc cache.
+	/* Wait for the freeing side to see the new pool->dma_sync,
+	 * disable_direct and pool->destroy_cnt in page_pool_put_page.
 	 */
 	synchronize_rcu();
 
@@ -1151,6 +1264,8 @@ void page_pool_destroy(struct page_pool *pool)
 	if (!page_pool_release(pool))
 		return;
 
+	page_pool_item_uninit(pool);
+
 	page_pool_detached(pool);
 	pool->defer_start = jiffies;
 	pool->defer_warn  = jiffies + DEFER_WARN_INTERVAL;
diff --git a/net/core/page_pool_priv.h b/net/core/page_pool_priv.h
index 57439787b9c2..5d85f862a30a 100644
--- a/net/core/page_pool_priv.h
+++ b/net/core/page_pool_priv.h
@@ -36,16 +36,18 @@ static inline bool page_pool_set_dma_addr(struct page *page, dma_addr_t addr)
 }
 
 #if defined(CONFIG_PAGE_POOL)
-void page_pool_set_pp_info(struct page_pool *pool, netmem_ref netmem);
-void page_pool_clear_pp_info(netmem_ref netmem);
+bool page_pool_set_pp_info(struct page_pool *pool, netmem_ref netmem);
+void page_pool_clear_pp_info(struct page_pool *pool, netmem_ref netmem);
 int page_pool_check_memory_provider(struct net_device *dev,
 				    struct netdev_rx_queue *rxq);
 #else
-static inline void page_pool_set_pp_info(struct page_pool *pool,
+static inline bool page_pool_set_pp_info(struct page_pool *pool,
 					 netmem_ref netmem)
 {
+	return true;
 }
-static inline void page_pool_clear_pp_info(netmem_ref netmem)
+static inline void page_pool_clear_pp_info(struct page_pool *pool,
+					   netmem_ref netmem)
 {
 }
 static inline int page_pool_check_memory_provider(struct net_device *dev,
diff --git a/net/core/skbuff.c b/net/core/skbuff.c
index 74149dc4ee31..d4295353ca6e 100644
--- a/net/core/skbuff.c
+++ b/net/core/skbuff.c
@@ -1033,7 +1033,8 @@ bool napi_pp_put_page(netmem_ref netmem)
 	if (unlikely(!is_pp_netmem(netmem)))
 		return false;
 
-	page_pool_put_full_netmem(netmem_get_pp(netmem), netmem, false);
+	page_pool_put_full_netmem(page_pool_to_pp(netmem_to_page(netmem)),
+				  netmem, false);
 
 	return true;
 }
diff --git a/net/core/xdp.c b/net/core/xdp.c
index bcc5551c6424..e8582036b411 100644
--- a/net/core/xdp.c
+++ b/net/core/xdp.c
@@ -384,7 +384,8 @@ void __xdp_return(void *data, struct xdp_mem_info *mem, bool napi_direct,
 		/* No need to check ((page->pp_magic & ~0x3UL) == PP_SIGNATURE)
 		 * as mem->type knows this a page_pool page
 		 */
-		page_pool_put_full_page(page->pp, page, napi_direct);
+		page_pool_put_full_page(page_pool_to_pp(page), page,
+					napi_direct);
 		break;
 	case MEM_TYPE_PAGE_SHARED:
 		page_frag_free(data);
-- 
2.33.0



From jakiela at google.com  Wed Sep 25 01:03:52 2024
From: jakiela at google.com (=?UTF-8?q?Albert=20Jakie=C5=82a?=)
Date: Wed, 25 Sep 2024 08:03:52 +0000
Subject: [PATCH 1/2] dt-bindings: arm: mediatek: Add MT8186
 Chinchou/Chinchou360 Chromebooks
Message-ID: <20240925080353.2362879-1-jakiela@google.com>

Add entries for MT8186 based Chinchou/Chinchou360 Chromebooks.
These two are clamshell or convertible with touchscreen, stylus
and extra buttons.

Signed-off-by: Albert Jakie?a <jakiela at google.com>
---
 .../devicetree/bindings/arm/mediatek.yaml     | 23 +++++++++++++++++++
 1 file changed, 23 insertions(+)

diff --git a/Documentation/devicetree/bindings/arm/mediatek.yaml b/Documentation/devicetree/bindings/arm/mediatek.yaml
index 1d4bb50fcd8d..110149f5d748 100644
--- a/Documentation/devicetree/bindings/arm/mediatek.yaml
+++ b/Documentation/devicetree/bindings/arm/mediatek.yaml
@@ -239,6 +239,29 @@ properties:
           - enum:
               - mediatek,mt8183-pumpkin
           - const: mediatek,mt8183
+      - description: Google Chinchou360 (Asus Chromebook CZ11 Flip CZ1104F)
+        items:
+          - const: google,chinchou-sku16
+          - const: google,chinchou-sku18
+          - const: google,chinchou-sku19
+          - const: google,chinchou-sku21
+          - const: google,chinchou-sku2147483647
+          - const: mediatek,mt8186
+      - description: Google Chinchou (Asus Chromebook CZ12 Flip CZ1204C)
+        items:
+          - const: google,chinchou-sku0
+          - const: google,chinchou-sku1
+          - const: google,chinchou-sku2
+          - const: google,chinchou-sku3
+          - const: google,chinchou-sku4
+          - const: google,chinchou-sku5
+          - const: google,chinchou-sku6
+          - const: google,chinchou-sku7
+          - const: google,chinchou-sku17
+          - const: google,chinchou-sku22
+          - const: google,chinchou-sku23
+          - const: google,chinchou
+          - const: mediatek,mt8186
       - description: Google Magneton (Lenovo IdeaPad Slim 3 Chromebook (14M868))
         items:
           - const: google,steelix-sku393219
-- 
2.46.0.792.g87dc391469-goog



From jakiela at google.com  Wed Sep 25 01:03:53 2024
From: jakiela at google.com (=?UTF-8?q?Albert=20Jakie=C5=82a?=)
Date: Wed, 25 Sep 2024 08:03:53 +0000
Subject: [PATCH 2/2] arm64: dts: mediate: Introduce MT8186 Chinchou/Chinchou360
 Chromebooks
In-Reply-To: <20240925080353.2362879-1-jakiela@google.com>
References: <20240925080353.2362879-1-jakiela@google.com>
Message-ID: <20240925080353.2362879-2-jakiela@google.com>

The MT8186 Chinchou/Chinchou360, also known as the Asus Chromebook
CZ12/CZ11 Flip, is a clamshell or convertible device with touchscreen,
stylus and extra buttons.

Signed-off-by: Albert Jakie?a <jakiela at google.com>
---
 arch/arm64/boot/dts/mediatek/Makefile         |   3 +
 .../mediatek/mt8186-corsola-chinchou-sku0.dts |  18 +
 .../mediatek/mt8186-corsola-chinchou-sku1.dts |  34 ++
 .../mt8186-corsola-chinchou-sku16.dts         |  28 ++
 .../dts/mediatek/mt8186-corsola-chinchou.dtsi | 445 ++++++++++++++++++
 5 files changed, 528 insertions(+)
 create mode 100644 arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku0.dts
 create mode 100644 arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku1.dts
 create mode 100644 arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku16.dts
 create mode 100644 arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou.dtsi

diff --git a/arch/arm64/boot/dts/mediatek/Makefile b/arch/arm64/boot/dts/mediatek/Makefile
index 8fd7b2bb7a15..0db7770e8907 100644
--- a/arch/arm64/boot/dts/mediatek/Makefile
+++ b/arch/arm64/boot/dts/mediatek/Makefile
@@ -55,6 +55,9 @@ dtb-$(CONFIG_ARCH_MEDIATEK) += mt8183-kukui-kodama-sku32.dtb
 dtb-$(CONFIG_ARCH_MEDIATEK) += mt8183-kukui-krane-sku0.dtb
 dtb-$(CONFIG_ARCH_MEDIATEK) += mt8183-kukui-krane-sku176.dtb
 dtb-$(CONFIG_ARCH_MEDIATEK) += mt8183-pumpkin.dtb
+dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-chinchou-sku0.dtb
+dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-chinchou-sku1.dtb
+dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-chinchou-sku16.dtb
 dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-magneton-sku393216.dtb
 dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-magneton-sku393217.dtb
 dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-magneton-sku393218.dtb
diff --git a/arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku0.dts b/arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku0.dts
new file mode 100644
index 000000000000..29dd92318da1
--- /dev/null
+++ b/arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku0.dts
@@ -0,0 +1,18 @@
+// SPDX-License-Identifier: (GPL-2.0 OR MIT)
+/*
+ * Copyright 2023 Google LLC
+ */
+
+/dts-v1/;
+#include "mt8186-corsola-chinchou.dtsi"
+
+/ {
+	model = "Google chinchou sku0 board";
+	compatible = "google,chinchou-sku0", "google,chinchou-sku2",
+			"google,chinchou-sku4", "google,chinchou-sku5",
+			"google,chinchou", "mediatek,mt8186";
+};
+
+&gpio_keys {
+	status = "disabled";
+};
diff --git a/arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku1.dts b/arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku1.dts
new file mode 100644
index 000000000000..8ba31f81d9ad
--- /dev/null
+++ b/arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku1.dts
@@ -0,0 +1,34 @@
+// SPDX-License-Identifier: (GPL-2.0 OR MIT)
+/*
+ * Copyright 2023 Google LLC
+ */
+
+/dts-v1/;
+#include "mt8186-corsola-chinchou.dtsi"
+
+/ {
+	model = "Google chinchou sku1/sku17 board";
+	compatible = "google,chinchou-sku1", "google,chinchou-sku17",
+			"google,chinchou-sku3", "google,chinchou-sku6",
+			"google,chinchou-sku7", "google,chinchou-sku20",
+			"google,chinchou-sku22", "google,chinchou-sku23",
+			"mediatek,mt8186";
+};
+
+&i2c1 {
+	i2c-scl-internal-delay-ns = <10000>;
+
+	touchscreen: touchscreen at 41 {
+		compatible = "ilitek,ili2901";
+		reg = <0x41>;
+		interrupts-extended = <&pio 12 IRQ_TYPE_LEVEL_LOW>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&touchscreen_pins>;
+		reset-gpios = <&pio 60 GPIO_ACTIVE_LOW>;
+		vccio-supply = <&pp1800_tchscr_report_disable>;
+	};
+};
+
+&gpio_keys {
+	status = "disabled";
+};
diff --git a/arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku16.dts b/arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku16.dts
new file mode 100644
index 000000000000..d3378d7ad096
--- /dev/null
+++ b/arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku16.dts
@@ -0,0 +1,28 @@
+// SPDX-License-Identifier: (GPL-2.0 OR MIT)
+/*
+ * Copyright 2023 Google LLC
+ */
+
+/dts-v1/;
+#include "mt8186-corsola-chinchou.dtsi"
+
+/ {
+	model = "Google chinchou sku16/sku2147483647 board";
+	compatible = "google,chinchou-sku16", "google,chinchou-sku18",
+			"google,chinchou-sku19", "google,chinchou-sku21",
+			"google,chinchou-sku2147483647", "mediatek,mt8186";
+};
+
+&i2c1 {
+	i2c-scl-internal-delay-ns = <10000>;
+
+	touchscreen: touchscreen at 41 {
+		compatible = "ilitek,ili2901";
+		reg = <0x41>;
+		interrupts-extended = <&pio 12 IRQ_TYPE_LEVEL_LOW>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&touchscreen_pins>;
+		reset-gpios = <&pio 60 GPIO_ACTIVE_LOW>;
+		vccio-supply = <&pp1800_tchscr_report_disable>;
+	};
+};
diff --git a/arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou.dtsi b/arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou.dtsi
new file mode 100644
index 000000000000..c77cc43f8442
--- /dev/null
+++ b/arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou.dtsi
@@ -0,0 +1,445 @@
+// SPDX-License-Identifier: (GPL-2.0 OR MIT)
+/*
+ * Copyright 2023 Google LLC
+ */
+
+/dts-v1/;
+#include "mt8186-corsola.dtsi"
+
+/ {
+	tboard_thermistor1: thermal-sensor1 {
+		compatible = "generic-adc-thermal";
+		#thermal-sensor-cells = <0>;
+		io-channels = <&auxadc 0>;
+		io-channel-names = "sensor-channel";
+		temperature-lookup-table = <    (-5000) 1491
+						0 1413
+						5000 1324
+						10000 1225
+						15000 1120
+						20000 1012
+						25000 900
+						30000 797
+						35000 698
+						40000 607
+						45000 525
+						50000 451
+						55000 386
+						60000 330
+						65000 282
+						70000 241
+						75000 206
+						80000 176
+						85000 151
+						90000 129
+						95000 111
+						100000 96
+						105000 83
+						110000 72
+						115000 62
+						120000 54
+						125000 47>;
+	};
+
+	tboard_thermistor2: thermal-sensor2 {
+		compatible = "generic-adc-thermal";
+		#thermal-sensor-cells = <0>;
+		io-channels = <&auxadc 1>;
+		io-channel-names = "sensor-channel";
+		temperature-lookup-table = <    (-5000) 1491
+						0 1413
+						5000 1324
+						10000 1225
+						15000 1120
+						20000 1012
+						25000 900
+						30000 797
+						35000 698
+						40000 607
+						45000 525
+						50000 451
+						55000 386
+						60000 330
+						65000 282
+						70000 241
+						75000 206
+						80000 176
+						85000 151
+						90000 129
+						95000 111
+						100000 96
+						105000 83
+						110000 72
+						115000 62
+						120000 54
+						125000 47>;
+	};
+
+	pp1800_tchscr_report_disable: regulator-pp1800-tchscr-report-disable {
+		compatible = "regulator-fixed";
+		regulator-name = "pp1800_tchscr_report_disable";
+		pinctrl-names = "default";
+		enable-active-low;
+		regulator-boot-on;
+		pinctrl-0 = <&touch_pin_report>;
+		gpio = <&pio 37 GPIO_ACTIVE_LOW>;
+	};
+
+	pp1000_edpbrdg: regulator-pp1000-edpbrdg {
+		compatible = "regulator-fixed";
+		regulator-name = "pp1000_edpbrdg";
+		pinctrl-names = "default";
+		pinctrl-0 = <&en_pp1000_edpbrdg>;
+		enable-active-high;
+		regulator-boot-on;
+		gpio = <&pio 29 GPIO_ACTIVE_HIGH>;
+		vin-supply = <&pp3300_z2>;
+	};
+
+	pp1800_edpbrdg_dx: regulator-pp1800-edpbrdg-dx {
+		compatible = "regulator-fixed";
+		regulator-name = "pp1800_edpbrdg_dx";
+		pinctrl-names = "default";
+		pinctrl-0 = <&en_pp1800_edpbrdg>;
+		enable-active-high;
+		regulator-boot-on;
+		gpio = <&pio 30 GPIO_ACTIVE_HIGH>;
+		vin-supply = <&mt6366_vio18_reg>;
+	};
+
+	pp3300_edp_dx: regulator-pp3300-edp-dx {
+		compatible = "regulator-fixed";
+		regulator-name = "pp3300_edp_dx";
+		pinctrl-names = "default";
+		pinctrl-0 = <&en_pp3300_edpbrdg>;
+		enable-active-high;
+		regulator-boot-on;
+		gpio = <&pio 31 GPIO_ACTIVE_HIGH>;
+		vin-supply = <&pp3300_z2>;
+	};
+};
+
+&rt5682s {
+	status = "disabled";
+};
+
+&rt1019p {
+	status = "disabled";
+};
+
+&dsi_out {
+	remote-endpoint = <&anx7625_in>;
+};
+
+&i2c0 {
+	clock-frequency = <400000>;
+
+	anx_bridge: anx7625 at 58 {
+		compatible = "analogix,anx7625";
+		reg = <0x58>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&anx7625_pins>;
+		panel_flags = <1>;
+		enable-gpios = <&pio 96 GPIO_ACTIVE_HIGH>;
+		reset-gpios = <&pio 98 GPIO_ACTIVE_HIGH>;
+		vdd10-supply = <&pp1000_edpbrdg>;
+		vdd18-supply = <&pp1800_edpbrdg_dx>;
+		vdd33-supply = <&pp3300_edp_dx>;
+		#address-cells = <1>;
+		#size-cells = <0>;
+		analogix,lane0-swing = /bits/ 8 <0x70 0x30>;
+		analogix,lane1-swing = /bits/ 8 <0x70 0x30>;
+
+		port at 0 {
+			reg = <0>;
+
+			anx7625_in: endpoint {
+				remote-endpoint = <&dsi_out>;
+				data-lanes = <0 1 2 3>;
+			};
+		};
+
+		port at 1 {
+			reg = <1>;
+
+			anx7625_out: endpoint {
+				remote-endpoint = <&panel_in>;
+			};
+		};
+
+		aux-bus {
+			panel: panel {
+				compatible = "edp-panel";
+				power-supply = <&pp3300_disp_x>;
+				backlight = <&backlight_lcd0>;
+
+				port {
+					panel_in: endpoint {
+						remote-endpoint = <&anx7625_out>;
+					};
+				};
+			};
+		};
+	};
+};
+
+&i2c2 {
+	trackpad at 15 {
+		compatible = "hid-over-i2c";
+		post-power-on-delay-ms = <10>;
+		hid-descr-addr = <0x0001>;
+		vdd-supply = <&pp3300_s3>;
+	};
+};
+
+&i2c5 {
+	clock-frequency = <400000>;
+
+	rt5650: rt5650 at 1a {
+		compatible = "realtek,rt5650";
+		reg = <0x1a>;
+		avdd-supply = <&mt6366_vio18_reg>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&rt1019p_pins_default>;
+		cbj-sleeve-gpio = <&pio 150 GPIO_ACTIVE_HIGH>;
+		interrupt-parent = <&pio>;
+		interrupts = <17 IRQ_TYPE_EDGE_BOTH>;
+		#sound-dai-cells = <0>;
+		realtek,dmic1-data-pin = <2>;
+		realtek,jd-mode = <2>;
+	};
+};
+
+&mmc1_pins_default {
+	pins-clk {
+		drive-strength = <MTK_DRIVE_8mA>;
+	};
+
+	pins-cmd-dat {
+		drive-strength = <MTK_DRIVE_8mA>;
+	};
+};
+
+&mmc1_pins_uhs {
+	pins-clk {
+		drive-strength = <MTK_DRIVE_8mA>;
+	};
+
+	pins-cmd-dat {
+		drive-strength = <MTK_DRIVE_8mA>;
+	};
+};
+
+&sound {
+	status = "okay";
+
+	compatible = "mediatek,mt8186-mt6366-rt5650-sound";
+	mediatek,adsp = <&adsp>;
+
+	audio-routing =
+		"Headphone", "HPOL",
+		"Headphone", "HPOR",
+		"HDMI1", "TX";
+
+	hs-playback-dai-link {
+		codec {
+			sound-dai = <&rt5650>;
+		};
+	};
+
+	hs-capture-dai-link {
+		codec {
+			sound-dai = <&rt5650>;
+		};
+	};
+
+	spk-share-dai-link {
+	};
+
+	spk-hdmi-playback-dai-link {
+		codec {
+			sound-dai = <&it6505dptx>;
+		};
+	};
+};
+
+&wifi_enable_pin {
+	pins-wifi-enable {
+		pinmux = <PINMUX_GPIO51__FUNC_GPIO51>;
+	};
+};
+
+&wifi_pwrseq {
+	reset-gpios = <&pio 51 GPIO_ACTIVE_LOW>;
+};
+
+&keyboard_controller {
+	keypad,num-columns = <15>;
+
+	function-row-physmap = <
+		MATRIX_KEY(0x00, 0x02, 0)        /* T1 */
+		MATRIX_KEY(0x03, 0x02, 0)        /* T2 */
+		MATRIX_KEY(0x02, 0x02, 0)        /* T3 */
+		MATRIX_KEY(0x01, 0x02, 0)        /* T4 */
+		MATRIX_KEY(0x03, 0x04, 0)        /* T5 */
+		MATRIX_KEY(0x02, 0x04, 0)        /* T6 */
+		MATRIX_KEY(0x01, 0x04, 0)        /* T7 */
+		MATRIX_KEY(0x02, 0x09, 0)        /* T8 */
+		MATRIX_KEY(0x01, 0x09, 0)        /* T9 */
+		MATRIX_KEY(0x00, 0x04, 0)        /* T10 */
+		MATRIX_KEY(0x00, 0x01, 0)        /* T11 */
+		MATRIX_KEY(0x01, 0x05, 0)        /* T12 */
+	>;
+
+	linux,keymap = <
+		CROS_STD_MAIN_KEYMAP
+		MATRIX_KEY(0x00, 0x02, KEY_BACK)           /* T1 */
+		MATRIX_KEY(0x03, 0x02, KEY_REFRESH)        /* T2 */
+		MATRIX_KEY(0x02, 0x02, KEY_ZOOM)           /* T3 */
+		MATRIX_KEY(0x01, 0x02, KEY_SCALE)          /* T4 */
+		MATRIX_KEY(0x03, 0x04, KEY_SYSRQ)          /* T5 */
+		MATRIX_KEY(0x02, 0x04, KEY_BRIGHTNESSDOWN) /* T6 */
+		MATRIX_KEY(0x01, 0x04, KEY_BRIGHTNESSUP)   /* T7 */
+		MATRIX_KEY(0x02, 0x09, KEY_MUTE)           /* T8 */
+		MATRIX_KEY(0x01, 0x09, KEY_VOLUMEDOWN)	   /* T9 */
+		MATRIX_KEY(0x00, 0x04, KEY_VOLUMEUP)	   /* T10 */
+		MATRIX_KEY(0x00, 0x01, KEY_MICMUTE)        /* T11 */
+		MATRIX_KEY(0x01, 0x05, KEY_CONTROLPANEL)   /* T12 */
+		MATRIX_KEY(0x03, 0x05, KEY_PREVIOUSSONG)   /* T13 */
+		MATRIX_KEY(0x00, 0x09, KEY_PLAYPAUSE)	   /* T14 */
+		MATRIX_KEY(0x00, 0x0b, KEY_NEXTSONG)	   /* T15 */
+		MATRIX_KEY(0x03, 0x00, KEY_LEFTMETA)	   /* Search*/
+		MATRIX_KEY(0x01, 0x0e, KEY_LEFTCTRL)	   /* Left Control*/
+		MATRIX_KEY(0x06, 0x0d, KEY_LEFTALT)        /* Left ALT*/
+		MATRIX_KEY(0x03, 0x0e, KEY_RIGHTCTRL)      /* Right Control*/
+		MATRIX_KEY(0x06, 0x0a, KEY_BACKSLASH)      /* BACKSLASH*/
+	>;
+};
+
+&thermal_zones {
+	cpu-ntc {
+		polling-delay = <1000>; /* milliseconds */
+		polling-delay-passive = <0>; /* milliseconds */
+		thermal-sensors = <&tboard_thermistor1>;
+	};
+
+	pmic-ntc {
+		polling-delay = <1000>; /* milliseconds */
+		polling-delay-passive = <50>; /* milliseconds */
+		thermal-sensors = <&tboard_thermistor2>;
+		sustainable-power = <1500>;
+
+		trips {
+			pmic_temp_alert0: trip-point at 0 {
+				temperature = <50000>;
+				hysteresis = <2000>;
+				type = "passive";
+			};
+
+			pmic_temp_alert1: target at 1 {
+				temperature = <60000>;
+				hysteresis = <2000>;
+				type = "passive";
+			};
+
+			pmic_ntc_crit: pmic-ntc-crit at 0 {
+				temperature = <80000>;
+				hysteresis = <2000>;
+				type = "critical";
+			};
+		};
+
+		cooling-maps {
+			map0 {
+				trip = <&pmic_temp_alert1>;
+				cooling-device = <&cpu0
+					THERMAL_NO_LIMIT
+					THERMAL_NO_LIMIT>,
+						<&cpu1
+					THERMAL_NO_LIMIT
+					THERMAL_NO_LIMIT>,
+						<&cpu2
+					THERMAL_NO_LIMIT
+					THERMAL_NO_LIMIT>,
+						<&cpu3
+					THERMAL_NO_LIMIT
+					THERMAL_NO_LIMIT>,
+						<&cpu4
+					THERMAL_NO_LIMIT
+					THERMAL_NO_LIMIT>,
+						<&cpu5
+					THERMAL_NO_LIMIT
+					THERMAL_NO_LIMIT>;
+				contribution = <4096>;
+			};
+
+			map1 {
+				trip = <&pmic_temp_alert1>;
+				cooling-device = <&cpu6
+					THERMAL_NO_LIMIT
+					THERMAL_NO_LIMIT>,
+						<&cpu7
+					THERMAL_NO_LIMIT
+					THERMAL_NO_LIMIT>;
+				contribution = <1024>;
+			};
+		};
+	};
+};
+
+&pio {
+	touch_pin_report: pin-report {
+		pinmux = <PINMUX_GPIO37__FUNC_GPIO37>;
+		output-low;
+	};
+
+	anx7625_pins: anx7625-pins {
+		pins1 {
+			pinmux = <PINMUX_GPIO96__FUNC_GPIO96>,
+			<PINMUX_GPIO98__FUNC_GPIO98>;
+			output-low;
+		};
+
+		pins2 {
+			pinmux = <PINMUX_GPIO9__FUNC_GPIO9>;
+			input-enable;
+			bias-pull-up;
+		};
+	};
+
+	en_pp1000_edpbrdg: pp1000-edpbrdg-en-pins {
+		pins-vreg-en {
+			pinmux = <PINMUX_GPIO29__FUNC_GPIO29>;
+			output-low;
+		};
+	};
+
+	en_pp1800_edpbrdg: pp1800-edpbrdg-en-pins {
+		pins-vreg-en {
+			pinmux = <PINMUX_GPIO30__FUNC_GPIO30>;
+			output-low;
+		};
+	};
+
+	en_pp3300_edpbrdg: pp3300-edpbrdg-en-pins {
+		pins-vreg-en {
+			pinmux = <PINMUX_GPIO31__FUNC_GPIO31>;
+			output-low;
+		};
+	};
+};
+
+&i2c_tunnel {
+	/delete-node/ sbs-battery at b;
+
+	battery: sbs-battery at f {
+		compatible = "sbs,sbs-battery";
+		reg = <0xf>;
+		sbs,i2c-retry-count = <2>;
+		sbs,poll-retry-count = <1>;
+	};
+};
+
+&pen_insert {
+	wakeup-event-action = <EV_ACT_ANY>;
+};
-- 
2.46.0.792.g87dc391469-goog



From macpaul.lin at mediatek.com  Wed Sep 25 01:05:15 2024
From: macpaul.lin at mediatek.com (Macpaul Lin)
Date: Wed, 25 Sep 2024 16:05:15 +0800
Subject: [PATCH v3] arm64: dts: mediatek: mt8195: Add power domain for dp_intf0
Message-ID: <20240925080515.16377-1-macpaul.lin@mediatek.com>

During inspecting dtbs_check errors, we found the power domain
setting of DPI node "dp_intf0" is missing. Add power domain setting
to "MT8195_POWER_DOMAIN_VDOSYS0" for "dp_intf0"

Suggested-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
Signed-off-by: Tommy Chen <tommyyl.chen at mediatek.com>
Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
---
 arch/arm64/boot/dts/mediatek/mt8195.dtsi | 1 +
 1 file changed, 1 insertion(+)

Changes for v1:
 - This patch is related to adding mt8195-dp-intf to DT schema fix for
  - http://devicetree.org/schemas/display/mediatek/mediatek,dpi.yaml 
  - patch: https://lore.kernel.org/all/20240924103156.13119-6-macpaul.lin at mediatek.com/

Changes for v2:
 - Fix typo for Tommy's email address. Others remains no change.

Changes for v3:
 - Added Suggested-by: and Reviewed-by: tags. Thanks!

diff --git a/arch/arm64/boot/dts/mediatek/mt8195.dtsi b/arch/arm64/boot/dts/mediatek/mt8195.dtsi
index ade685ed2190..6218bd7abb05 100644
--- a/arch/arm64/boot/dts/mediatek/mt8195.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8195.dtsi
@@ -3252,6 +3252,7 @@ dp_intf0: dp-intf at 1c015000 {
 			compatible = "mediatek,mt8195-dp-intf";
 			reg = <0 0x1c015000 0 0x1000>;
 			interrupts = <GIC_SPI 657 IRQ_TYPE_LEVEL_HIGH 0>;
+			power-domains = <&spm MT8195_POWER_DOMAIN_VDOSYS0>;
 			clocks = <&vdosys0 CLK_VDO0_DP_INTF0_DP_INTF>,
 				 <&vdosys0  CLK_VDO0_DP_INTF0>,
 				 <&apmixedsys CLK_APMIXED_TVDPLL1>;
-- 
2.45.2



From andi.shyti at kernel.org  Wed Sep 25 01:18:24 2024
From: andi.shyti at kernel.org (Andi Shyti)
Date: Wed, 25 Sep 2024 10:18:24 +0200
Subject: [v1,1/1] i2c: mediatek: add runtime PM operations and bus
 regulator control
In-Reply-To: <33dc7f60-4364-4d7a-a66b-4bd881b41675@collabora.com>
References: <20240920143627.23811-1-zoie.lin@mediatek.com>
 <20240920143627.23811-2-zoie.lin@mediatek.com>
 <33dc7f60-4364-4d7a-a66b-4bd881b41675@collabora.com>
Message-ID: <duauce4b6hlugfo6yelviaflkktfaix6g2kd2yqgdv5o36nhh4@despelul5fq5>

Hi,

...

> > @@ -1486,19 +1530,22 @@ static int mtk_i2c_probe(struct platform_device *pdev)
> >   	if (ret < 0) {
> >   		dev_err(&pdev->dev,
> >   			"Request I2C IRQ %d fail\n", irq);
> > -		goto err_bulk_unprepare;
> > +		goto err_clk_bulk_unprepare;
> >   	}
> > +	pm_runtime_set_autosuspend_delay(&pdev->dev, 1000);
> 
> One full second as autosuspend delay? Can this be shortened to 500? 250?
> 
> How was the one second wait chosen?
> 
> How much time does mtk_i2c_runtime_resume() take to resume the bus?

Besides that, please add a comment to explain why you chose
1000/500/250. Arbitrary values are not much appreciated.

Thanks,
Andi


From dmitry.baryshkov at linaro.org  Wed Sep 25 01:36:47 2024
From: dmitry.baryshkov at linaro.org (Dmitry Baryshkov)
Date: Wed, 25 Sep 2024 11:36:47 +0300
Subject: [PATCH v3 1/1] drm/mediatek: dp: Add sdp path reset
In-Reply-To: <20240925064854.23065-1-liankun.yang@mediatek.com>
References: <20240925064854.23065-1-liankun.yang@mediatek.com>
Message-ID: <ybnnqysm2ptvclaal3kw26ttqkgbicn45cwxkkchl72vuzwtt2@el7c34zqxmjl>

On Wed, Sep 25, 2024 at 02:48:22PM GMT, Liankun Yang wrote:
> When using type-c to type-c to connect to the monitor,
> the sound plays normally. If you unplug the type-c and
> connect the type-c to hdmi dongle to the monitor, there will be noise.
> 
> By capturing the audio data, it is found that
> the data position is messy, and there is no error in the data.
> 
> Through experiments, it can be restored by resetting the SDP path
> when unplugging it.
> 
> Signed-off-by: Liankun Yang <liankun.yang at mediatek.com>
> Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
> ---
> Changes in V3:
> - No change.

If there are no changes, why did you increase the revision?

> Per suggestion from the previous thread:
> https://patchwork.kernel.org/project/linux-mediatek/patch/20240923132521.22785-1-liankun.yang at mediatek.com/

The link points to some other patch. Please consider using b4 tool, it
will manage changelogs and links for you.

> 
> Changes in V2:
> - Fix build error.
> Per suggestion from the previous thread:
> https://patchwork.kernel.org/project/linux-mediatek/patch/20240923133610.23728-1-liankun.yang at mediatek.com/
> ---
>  drivers/gpu/drm/mediatek/mtk_dp.c     | 15 +++++++++++++++
>  drivers/gpu/drm/mediatek/mtk_dp_reg.h |  1 +
>  2 files changed, 16 insertions(+)
> 

-- 
With best wishes
Dmitry


From liankun.yang at mediatek.com  Wed Sep 25 01:40:24 2024
From: liankun.yang at mediatek.com (Liankun Yang)
Date: Wed, 25 Sep 2024 16:40:24 +0800
Subject: [PATCH v1 1/1] drm/mediatek: Fix wrong check of nvmem_cell_read
Message-ID: <20240925084116.28848-1-liankun.yang@mediatek.com>

If the len is 0, kernel crash will occur when performing operations.
Add the len check conditions to prevent kernel crash.

Fixes: f70ac097a2cf ("drm/mediatek: Add MT8195 Embedded DisplayPort driver")

Signed-off-by: Liankun Yang <liankun.yang at mediatek.com>
---
 drivers/gpu/drm/mediatek/mtk_dp.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/mediatek/mtk_dp.c b/drivers/gpu/drm/mediatek/mtk_dp.c
index d8796a904eca..0cc75ba96b98 100644
--- a/drivers/gpu/drm/mediatek/mtk_dp.c
+++ b/drivers/gpu/drm/mediatek/mtk_dp.c
@@ -1082,7 +1082,7 @@ static void mtk_dp_get_calibration_data(struct mtk_dp *mtk_dp)
 	buf = (u32 *)nvmem_cell_read(cell, &len);
 	nvmem_cell_put(cell);
 
-	if (IS_ERR(buf) || ((len / sizeof(u32)) != 4)) {
+	if (IS_ERR(buf) || (len == 0) || ((len / sizeof(u32)) != 4)) {
 		dev_warn(dev, "Failed to read nvmem_cell_read\n");
 
 		if (!IS_ERR(buf))
-- 
2.45.2



From macpaul.lin at mediatek.com  Wed Sep 25 01:42:59 2024
From: macpaul.lin at mediatek.com (Macpaul Lin)
Date: Wed, 25 Sep 2024 16:42:59 +0800
Subject: [PATCH 3/6] dt-bindings: display: mediatek: Fix clocks count
 constraint for new SoCs
In-Reply-To: <20240924-commute-collision-13ad39717d31@spud>
References: <20240924103156.13119-1-macpaul.lin@mediatek.com>
 <20240924103156.13119-3-macpaul.lin@mediatek.com>
 <ffc1900b-3921-48ca-a2b2-1b798c57e572@collabora.com>
 <20240924-commute-collision-13ad39717d31@spud>
Message-ID: <2821ef09-1b32-082d-69d1-e09a3a302447@mediatek.com>


On 9/25/24 00:00, Conor Dooley wrote:
> On Tue, Sep 24, 2024 at 01:42:01PM +0200, AngeloGioacchino Del Regno wrote:
>> Il 24/09/24 12:31, Macpaul Lin ha scritto:
>>> The display node in mt8195.dtsi was triggering a CHECK_DTBS error due
>>> to an excessively long 'clocks' property:
>>>     display at 14f06000: clocks: [[31, 14], [31, 43], [31, 44]] is too long
>>>
>>> To resolve this issue, add "maxItems: 3" to the 'clocks' property in
>>> the DT schema.
>>>
>>> Fixes: 4ed545e7d100 ("dt-bindings: display: mediatek: disp: split each block to individual yaml")
>>> Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
>>> ---
>>>    .../devicetree/bindings/display/mediatek/mediatek,split.yaml     | 1 +
>>>    1 file changed, 1 insertion(+)
>>>
>>> diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,split.yaml b/Documentation/devicetree/bindings/display/mediatek/mediatek,split.yaml
>>> index e4affc854f3d..42d2d483cc29 100644
>>> --- a/Documentation/devicetree/bindings/display/mediatek/mediatek,split.yaml
>>> +++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,split.yaml
>>> @@ -57,6 +57,7 @@ properties:
>>>      clocks:
>>>        items:
>>>          - description: SPLIT Clock
>>
>> That's at least confusing (granted that it works) - either add a description for
>> each clock and then set `minItems: 1` (preferred), or remove this "SPLIT Clock"
>> description and allow a maximum of 3 clocks.
>>
>> Removing the description can be done - IMO - because "SPLIT Clock" is, well,
>> saying that the SPLIT block gets a SPLIT clock ... stating the obvious, anyway.
> 
> Right, but what are the other two new clocks? Are they as obvious?
> There's no clock-names here to give any more information as to what the
> other clocks are supposed to be.
> 
> Kinda unrelated, but I think that "SPLIT Clock" probably isn't what the
> name of the clock in the IP block is anyway, sounds more like the name
> for it on the provider end..

Thanks for the suggestions. I think Moudy could help on the new fixes
for both DT schem and mt8195.dtsi. This patch could be separated from
origin patch set.

Thanks
Macpaul Lin


From Jason-JH.Lin at mediatek.com  Wed Sep 25 02:35:52 2024
From: Jason-JH.Lin at mediatek.com (=?utf-8?B?SmFzb24tSkggTGluICjmnpfnnb/npaUp?=)
Date: Wed, 25 Sep 2024 09:35:52 +0000
Subject: [PATCH v4] drm/mediatek: ovl: Add fmt_convert function pointer to
 driver data
In-Reply-To: <dbb2722698d3b36100f0ed2bfeec92441cd4ef45.camel@mediatek.com>
References: <20240924014935.23677-1-jason-jh.lin@mediatek.com>
	 <dbb2722698d3b36100f0ed2bfeec92441cd4ef45.camel@mediatek.com>
Message-ID: <16fde40d5a4855488c58e6fef8509c18392b2cec.camel@mediatek.com>

On Wed, 2024-09-25 at 07:45 +0000, CK Hu (???) wrote:
> > 
> Hi, Jason:
> 
> On Tue, 2024-09-24 at 09:49 +0800, Jason-JH.Lin wrote:
> > OVL_CON_CLRFMT_MAN is a configuration for extending color format
> > settings of DISP_REG_OVL_CON(n).
> > It will change some of the original color format settings.
> > 
> > Take the settings of (3 << 12) for example.
> > - If OVL_CON_CLRFMT_MAN = 0 means OVL_CON_CLRFMT_RGBA8888.
> > - If OVL_CON_CLRFMT_MAN = 1 means OVL_CON_CLRFMT_PARGB8888.
> > 
> > Since OVL_CON_CLRFMT_MAN is not supported on previous SoCs,
> > It breaks the OVL color format setting of MT8173.
> > 
> > Therefore, the fmt_convert function pointer is added to the driver
> > data
> > and mtk_ovl_fmt_convert_with_blend is implemented for MT8192 and
> > MT8195
> > that support OVL_CON_CLRFMT_MAN, and mtk_ovl_fmt_convert is
> > implemented
> > for other SoCs that do not support it to solve the degradation
> > problem.
> 
> This patch looks good to me, so
> 
> Reviewed-by: CK Hu <ck.hu at mediatek.com>
> 
> By this patch, only some SoC support pre-multiplied pixel format.
> In [1], it declare that all SoC support pre-multiplied pixel format,
> so I think need another patch to let only some SoC support pre-
> multiplied.
> 
> [1] 
> https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/commit/drivers/gpu/drm/mediatek?h=next-20240925&id=4225d5d5e779b859a6661130a3444eb4c5db77e5
> 

No problem, I'll send another patch to fix [1] in v5 soon.

Regards,
Jason-JH.Lin


From wenst at chromium.org  Wed Sep 25 02:38:03 2024
From: wenst at chromium.org (Chen-Yu Tsai)
Date: Wed, 25 Sep 2024 17:38:03 +0800
Subject: [PATCH v8 0/3] Add of_regulator_get_optional() and Fix MTK Power Domain Driver
Message-ID: <20240925093807.1026949-1-wenst@chromium.org>

Hi folks,

This series is split off from my "DT hardware prober" series [1].

Changes since v7:
- Added stub versions for of_regulator_get_optional() for !CONFIG_OF
  and !CONFIG_REGULATOR
- Added new patches for devres version and converting MTK pmdomain
  driver

At ELCE, Sebastian told me about his recent work on adding regulator
supply support to the Rockchip power domain driver [2], how the MediaTek
driver has been using the existing devm_regulator_get() API and
reassigning different device nodes to the device doing the lookup, and
how the new of_regulator_get_optional() is the proper fit for this.

Patch 1 adds a new of_regulator_get_optional() function to look up
regulator supplies using device tree nodes.

Patch 2 adds a devres version of the aforementioned function at
Sebastian's request for the two power domain drivers.

Patch 3 converts the MediaTek power domain driver to use function.


Each of the latter two patches depend on the previous one at build time.
Mark, would it be possible for you to put the two regulator patches
on an immutable branch / tag? Otherwise we could have Ulf ack the
pmdomain patch and merge it through your tree. Sebastian was fine
with converting the rockchip pmdomain some time later.

Thanks
ChenYu


[1] https://lore.kernel.org/all/20240911072751.365361-1-wenst at chromium.org/
[2] https://lore.kernel.org/all/20240919091834.83572-1-sebastian.reichel at collabora.com/

Chen-Yu Tsai (3):
  regulator: Add of_regulator_get_optional() for pure DT regulator
    lookup
  regulator: Add devres version of of_regulator_get_optional()
  pmdomain: mediatek: Use OF-specific regulator API to get power domain
    supply

 drivers/pmdomain/mediatek/mtk-pm-domains.c | 12 +----
 drivers/regulator/core.c                   |  4 +-
 drivers/regulator/devres.c                 | 39 +++++++++++++++++
 drivers/regulator/internal.h               | 18 +++++---
 drivers/regulator/of_regulator.c           | 51 +++++++++++++++++++---
 include/linux/regulator/consumer.h         | 37 ++++++++++++++++
 6 files changed, 136 insertions(+), 25 deletions(-)


base-commit: 2b7275670032a98cba266bd1b8905f755b3e650f
-- 
2.46.0.792.g87dc391469-goog



From wenst at chromium.org  Wed Sep 25 02:38:04 2024
From: wenst at chromium.org (Chen-Yu Tsai)
Date: Wed, 25 Sep 2024 17:38:04 +0800
Subject: [PATCH v8 1/3] regulator: Add of_regulator_get_optional() for pure DT regulator lookup
In-Reply-To: <20240925093807.1026949-1-wenst@chromium.org>
References: <20240925093807.1026949-1-wenst@chromium.org>
Message-ID: <20240925093807.1026949-2-wenst@chromium.org>

The to-be-introduced I2C component prober needs to enable regulator
supplies (and toggle GPIO pins) for the various components it intends
to probe. To support this, a new "pure DT lookup" method for getting
regulator supplies is needed, since the device normally requesting
the supply won't get created until after the component is probed to
be available.

Add a new of_regulator_get_optional() function for this. This mirrors
the existing regulator_get_optional() function, but is OF-specific.
The underlying code that supports the existing regulator_get*()
functions has been reworked in previous patches to support this
specific case.

Also convert an existing usage of "dev && dev->of_node" to
"dev_of_node(dev)".

Link: https://lore.kernel.org/all/20231220203537.83479-2-jernej.skrabec at gmail.com/ [1]
Signed-off-by: Chen-Yu Tsai <wenst at chromium.org>
---
Changes since v7:
- Added stub version for !CONFIG_OF and !CONFIG_REGULATOR

Changes since v6:
- Changed reference [1] to Link: tag
- Rebased on top of commit 401d078eaf2e ("regulator: of: Refactor
  of_get_*regulator() to decrease indentation")
- Exported of_regulator_get_optional()
- Changed commit message to focus on "of_regulator_get_optional()"
- Dropped change to of_regulator_bulk_get_all()

Changes since v5:
- Used "dev_of_node(dev)" instead of "dev->of_node"
- Replaced "dev_printk" with "dev_printk()" in kerneldoc mentions
- Fixed kerneldoc "Return" section format for of_regulator_get_optional()
- Fix @np parameter name in of_regulator_dev_lookup() kerneldoc

Changes since v4:
- Restore platform-agnostic regulator consumer code to original state
- Move OF-specific regulator code to of_regulator.c (separate patch)
- Split _regulator_get() into three parts for reuse (separate patch)
- Add OF-specific _of_regulator_get() function
- Rename regulator_of_get_optional() to of_regulator_get_optional() for
  consistency
- Make of_regulator_get_optional static, as it is only used internally
- Convert of_regulator_bulk_get_all()

Changes since v3:
- New patch
---
 drivers/regulator/core.c           |  4 +--
 drivers/regulator/internal.h       |  2 ++
 drivers/regulator/of_regulator.c   | 51 ++++++++++++++++++++++++++----
 include/linux/regulator/consumer.h | 20 ++++++++++++
 4 files changed, 69 insertions(+), 8 deletions(-)

diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c
index 1179766811f5..d0b3879f2746 100644
--- a/drivers/regulator/core.c
+++ b/drivers/regulator/core.c
@@ -1959,8 +1959,8 @@ static struct regulator_dev *regulator_dev_lookup(struct device *dev,
 	regulator_supply_alias(&dev, &supply);
 
 	/* first do a dt based lookup */
-	if (dev && dev->of_node) {
-		r = of_regulator_dev_lookup(dev, supply);
+	if (dev_of_node(dev)) {
+		r = of_regulator_dev_lookup(dev, dev_of_node(dev), supply);
 		if (!IS_ERR(r))
 			return r;
 		if (PTR_ERR(r) == -EPROBE_DEFER)
diff --git a/drivers/regulator/internal.h b/drivers/regulator/internal.h
index 5b43f802468d..f62cacbbc729 100644
--- a/drivers/regulator/internal.h
+++ b/drivers/regulator/internal.h
@@ -67,6 +67,7 @@ static inline struct regulator_dev *dev_to_rdev(struct device *dev)
 
 #ifdef CONFIG_OF
 struct regulator_dev *of_regulator_dev_lookup(struct device *dev,
+					      struct device_node *np,
 					      const char *supply);
 struct regulator_init_data *regulator_of_get_init_data(struct device *dev,
 			         const struct regulator_desc *desc,
@@ -82,6 +83,7 @@ bool of_check_coupling_data(struct regulator_dev *rdev);
 
 #else
 static inline struct regulator_dev *of_regulator_dev_lookup(struct device *dev,
+							    struct device_node *np,
 							    const char *supply)
 {
 	return ERR_PTR(-ENODEV);
diff --git a/drivers/regulator/of_regulator.c b/drivers/regulator/of_regulator.c
index 3f490d81abc2..358c3ed791db 100644
--- a/drivers/regulator/of_regulator.c
+++ b/drivers/regulator/of_regulator.c
@@ -588,7 +588,8 @@ static struct device_node *of_get_child_regulator(struct device_node *parent,
 
 /**
  * of_get_regulator - get a regulator device node based on supply name
- * @dev: Device pointer for the consumer (of regulator) device
+ * @dev: Device pointer for dev_printk() messages
+ * @node: Device node pointer for supply property lookup
  * @supply: regulator supply name
  *
  * Extract the regulator device node corresponding to the supply name.
@@ -596,15 +597,16 @@ static struct device_node *of_get_child_regulator(struct device_node *parent,
  * Return: Pointer to the &struct device_node corresponding to the regulator
  *	   if found, or %NULL if not found.
  */
-static struct device_node *of_get_regulator(struct device *dev, const char *supply)
+static struct device_node *of_get_regulator(struct device *dev, struct device_node *node,
+					    const char *supply)
 {
 	struct device_node *regnode = NULL;
 	char prop_name[64]; /* 64 is max size of property name */
 
-	dev_dbg(dev, "Looking up %s-supply from device tree\n", supply);
+	dev_dbg(dev, "Looking up %s-supply from device node %pOF\n", supply, node);
 
 	snprintf(prop_name, 64, "%s-supply", supply);
-	regnode = of_parse_phandle(dev->of_node, prop_name, 0);
+	regnode = of_parse_phandle(node, prop_name, 0);
 	if (regnode)
 		return regnode;
 
@@ -628,6 +630,7 @@ static struct regulator_dev *of_find_regulator_by_node(struct device_node *np)
 /**
  * of_regulator_dev_lookup - lookup a regulator device with device tree only
  * @dev: Device pointer for regulator supply lookup.
+ * @np: Device node pointer for regulator supply lookup.
  * @supply: Supply name or regulator ID.
  *
  * Return: Pointer to the &struct regulator_dev on success, or ERR_PTR()
@@ -642,13 +645,13 @@ static struct regulator_dev *of_find_regulator_by_node(struct device_node *np)
  * * -%ENODEV if lookup fails permanently.
  * * -%EPROBE_DEFER if lookup could succeed in the future.
  */
-struct regulator_dev *of_regulator_dev_lookup(struct device *dev,
+struct regulator_dev *of_regulator_dev_lookup(struct device *dev, struct device_node *np,
 					      const char *supply)
 {
 	struct regulator_dev *r;
 	struct device_node *node;
 
-	node = of_get_regulator(dev, supply);
+	node = of_get_regulator(dev, np, supply);
 	if (node) {
 		r = of_find_regulator_by_node(node);
 		of_node_put(node);
@@ -665,6 +668,42 @@ struct regulator_dev *of_regulator_dev_lookup(struct device *dev,
 	return ERR_PTR(-ENODEV);
 }
 
+static struct regulator *_of_regulator_get(struct device *dev, struct device_node *node,
+					   const char *id, enum regulator_get_type get_type)
+{
+	struct regulator_dev *r;
+	int ret;
+
+	ret = _regulator_get_common_check(dev, id, get_type);
+	if (ret)
+		return ERR_PTR(ret);
+
+	r = of_regulator_dev_lookup(dev, node, id);
+	return _regulator_get_common(r, dev, id, get_type);
+}
+
+/**
+ * of_regulator_get_optional - get optional regulator via device tree lookup
+ * @dev: device used for dev_printk() messages
+ * @node: device node for regulator "consumer"
+ * @id: Supply name
+ *
+ * Return: pointer to struct regulator corresponding to the regulator producer,
+ *	   or PTR_ERR() encoded error number.
+ *
+ * This is intended for use by consumers that want to get a regulator
+ * supply directly from a device node, and can and want to deal with
+ * absence of such supplies. This will _not_ consider supply aliases.
+ * See regulator_dev_lookup().
+ */
+struct regulator *of_regulator_get_optional(struct device *dev,
+					    struct device_node *node,
+					    const char *id)
+{
+	return _of_regulator_get(dev, node, id, OPTIONAL_GET);
+}
+EXPORT_SYMBOL_GPL(of_regulator_get_optional);
+
 /*
  * Returns number of regulators coupled with rdev.
  */
diff --git a/include/linux/regulator/consumer.h b/include/linux/regulator/consumer.h
index b9ce521910a0..2b22f07e491c 100644
--- a/include/linux/regulator/consumer.h
+++ b/include/linux/regulator/consumer.h
@@ -168,6 +168,19 @@ int devm_regulator_get_enable_read_voltage(struct device *dev, const char *id);
 void regulator_put(struct regulator *regulator);
 void devm_regulator_put(struct regulator *regulator);
 
+#if IS_ENABLED(CONFIG_OF)
+struct regulator *__must_check of_regulator_get_optional(struct device *dev,
+							 struct device_node *node,
+							 const char *id);
+#else
+static inline struct regulator *__must_check of_regulator_get_optional(struct device *dev,
+								       struct device_node *node,
+								       const char *id)
+{
+	return ERR_PTR(-ENODEV);
+}
+#endif
+
 int regulator_register_supply_alias(struct device *dev, const char *id,
 				    struct device *alias_dev,
 				    const char *alias_id);
@@ -350,6 +363,13 @@ devm_regulator_get_optional(struct device *dev, const char *id)
 	return ERR_PTR(-ENODEV);
 }
 
+static inline struct regulator *__must_check of_regulator_get_optional(struct device *dev,
+								       struct device_node *node,
+								       const char *id)
+{
+	return ERR_PTR(-ENODEV);
+}
+
 static inline void regulator_put(struct regulator *regulator)
 {
 }
-- 
2.46.0.792.g87dc391469-goog



From wenst at chromium.org  Wed Sep 25 02:38:05 2024
From: wenst at chromium.org (Chen-Yu Tsai)
Date: Wed, 25 Sep 2024 17:38:05 +0800
Subject: [PATCH v8 2/3] regulator: Add devres version of of_regulator_get_optional()
In-Reply-To: <20240925093807.1026949-1-wenst@chromium.org>
References: <20240925093807.1026949-1-wenst@chromium.org>
Message-ID: <20240925093807.1026949-3-wenst@chromium.org>

There are existing uses for a devres version of of_regulator_get_optional()
in power domain drivers. On MediaTek platforms, power domains may have
regulator supplies tied to them. The driver currently tries to use
devm_regulator_get() to not have to manage the lifecycle, but ends up
doing it in a very hacky way by replacing the device node of the power
domain controller device to the device node of the power domain that is
currently being registered, getting the supply, and reverting the device
node.

Provide a better API so that the hack can be replaced.

Signed-off-by: Chen-Yu Tsai <wenst at chromium.org>
---
Changes since v7:
- New patch
---
 drivers/regulator/devres.c         | 39 ++++++++++++++++++++++++++++++
 drivers/regulator/internal.h       | 16 +++++++-----
 drivers/regulator/of_regulator.c   |  4 +--
 include/linux/regulator/consumer.h | 17 +++++++++++++
 4 files changed, 68 insertions(+), 8 deletions(-)

diff --git a/drivers/regulator/devres.c b/drivers/regulator/devres.c
index 1b893cdd1aad..36164aec30e8 100644
--- a/drivers/regulator/devres.c
+++ b/drivers/regulator/devres.c
@@ -749,3 +749,42 @@ void *devm_regulator_irq_helper(struct device *dev,
 	return ptr;
 }
 EXPORT_SYMBOL_GPL(devm_regulator_irq_helper);
+
+#if IS_ENABLED(CONFIG_OF)
+static struct regulator *_devm_of_regulator_get(struct device *dev, struct device_node *node,
+						const char *id, int get_type)
+{
+	struct regulator **ptr, *regulator;
+
+	ptr = devres_alloc(devm_regulator_release, sizeof(*ptr), GFP_KERNEL);
+	if (!ptr)
+		return ERR_PTR(-ENOMEM);
+
+	regulator = _of_regulator_get(dev, node, id, get_type);
+	if (!IS_ERR(regulator)) {
+		*ptr = regulator;
+		devres_add(dev, ptr);
+	} else {
+		devres_free(ptr);
+	}
+
+	return regulator;
+}
+
+/**
+ * devm_of_regulator_get_optional - Resource managed of_regulator_get_optional()
+ * @dev: device used for dev_printk() messages and resource lifetime management
+ * @node: device node for regulator "consumer"
+ * @id:  supply name or regulator ID.
+ *
+ * Managed regulator_get_optional(). Regulators returned from this
+ * function are automatically regulator_put() on driver detach. See
+ * of_regulator_get_optional() for more information.
+ */
+struct regulator *devm_of_regulator_get_optional(struct device *dev, struct device_node *node,
+						 const char *id)
+{
+	return _devm_of_regulator_get(dev, node, id, OPTIONAL_GET);
+}
+EXPORT_SYMBOL_GPL(devm_of_regulator_get_optional);
+#endif
diff --git a/drivers/regulator/internal.h b/drivers/regulator/internal.h
index f62cacbbc729..b3d48dc38bc4 100644
--- a/drivers/regulator/internal.h
+++ b/drivers/regulator/internal.h
@@ -65,6 +65,13 @@ static inline struct regulator_dev *dev_to_rdev(struct device *dev)
 	return container_of(dev, struct regulator_dev, dev);
 }
 
+enum regulator_get_type {
+	NORMAL_GET,
+	EXCLUSIVE_GET,
+	OPTIONAL_GET,
+	MAX_GET_TYPE
+};
+
 #ifdef CONFIG_OF
 struct regulator_dev *of_regulator_dev_lookup(struct device *dev,
 					      struct device_node *np,
@@ -74,6 +81,9 @@ struct regulator_init_data *regulator_of_get_init_data(struct device *dev,
 				 struct regulator_config *config,
 				 struct device_node **node);
 
+struct regulator *_of_regulator_get(struct device *dev, struct device_node *node,
+				    const char *id, enum regulator_get_type get_type);
+
 struct regulator_dev *of_parse_coupled_regulator(struct regulator_dev *rdev,
 						 int index);
 
@@ -116,12 +126,6 @@ static inline bool of_check_coupling_data(struct regulator_dev *rdev)
 }
 
 #endif
-enum regulator_get_type {
-	NORMAL_GET,
-	EXCLUSIVE_GET,
-	OPTIONAL_GET,
-	MAX_GET_TYPE
-};
 
 int _regulator_get_common_check(struct device *dev, const char *id,
 				enum regulator_get_type get_type);
diff --git a/drivers/regulator/of_regulator.c b/drivers/regulator/of_regulator.c
index 358c3ed791db..3d85762beda6 100644
--- a/drivers/regulator/of_regulator.c
+++ b/drivers/regulator/of_regulator.c
@@ -668,8 +668,8 @@ struct regulator_dev *of_regulator_dev_lookup(struct device *dev, struct device_
 	return ERR_PTR(-ENODEV);
 }
 
-static struct regulator *_of_regulator_get(struct device *dev, struct device_node *node,
-					   const char *id, enum regulator_get_type get_type)
+struct regulator *_of_regulator_get(struct device *dev, struct device_node *node,
+				    const char *id, enum regulator_get_type get_type)
 {
 	struct regulator_dev *r;
 	int ret;
diff --git a/include/linux/regulator/consumer.h b/include/linux/regulator/consumer.h
index 2b22f07e491c..8c3c372ad735 100644
--- a/include/linux/regulator/consumer.h
+++ b/include/linux/regulator/consumer.h
@@ -172,6 +172,9 @@ void devm_regulator_put(struct regulator *regulator);
 struct regulator *__must_check of_regulator_get_optional(struct device *dev,
 							 struct device_node *node,
 							 const char *id);
+struct regulator *__must_check devm_of_regulator_get_optional(struct device *dev,
+							      struct device_node *node,
+							      const char *id);
 #else
 static inline struct regulator *__must_check of_regulator_get_optional(struct device *dev,
 								       struct device_node *node,
@@ -179,6 +182,13 @@ static inline struct regulator *__must_check of_regulator_get_optional(struct de
 {
 	return ERR_PTR(-ENODEV);
 }
+
+static inline struct regulator *__must_check devm_of_regulator_get_optional(struct device *dev,
+									    struct device_node *node,
+									    const char *id)
+{
+	return ERR_PTR(-ENODEV);
+}
 #endif
 
 int regulator_register_supply_alias(struct device *dev, const char *id,
@@ -370,6 +380,13 @@ static inline struct regulator *__must_check of_regulator_get_optional(struct de
 	return ERR_PTR(-ENODEV);
 }
 
+static inline struct regulator *__must_check devm_of_regulator_get_optional(struct device *dev,
+									    struct device_node *node,
+									    const char *id)
+{
+	return ERR_PTR(-ENODEV);
+}
+
 static inline void regulator_put(struct regulator *regulator)
 {
 }
-- 
2.46.0.792.g87dc391469-goog



From wenst at chromium.org  Wed Sep 25 02:38:06 2024
From: wenst at chromium.org (Chen-Yu Tsai)
Date: Wed, 25 Sep 2024 17:38:06 +0800
Subject: [PATCH v8 3/3] pmdomain: mediatek: Use OF-specific regulator API to get power domain supply
In-Reply-To: <20240925093807.1026949-1-wenst@chromium.org>
References: <20240925093807.1026949-1-wenst@chromium.org>
Message-ID: <20240925093807.1026949-4-wenst@chromium.org>

The MediaTek power domain driver contains a hack that assigns the device
node of the power domain to the struct device of the power domain
controller in order to use the devres regulator API.

Now that there is a proper OF-specific regulator API, and even a devres
version, replace the hack with proper code.

This change is incompatible with incomplete device trees. Instead of
assigning the dummy regulator in cases where the power domain requires
a supply but the device tree does not provide one, the driver will just
error out. This will be seen on the MT8390 EVK, which is missing
supplies for the IMG_VCORE and CAM_VCORE domains. And likely all the
MediaTek EVBs, which have no power domain supplies specified. This is
however the correct behavior. If the power domain's supply is missing,
then it should not work. Relying on other parts of the system to keep
the unattached regulator enabled is likely to break in ways less easier
to understand.

Signed-off-by: Chen-Yu Tsai <wenst at chromium.org>
---
Changes since v7:
- New patch

The other option is to follow what Rockchip will be doing: getting the
regulator supply upon first use / enable [1]. This will result in less
breakage: only the power domain that is missing its supplies will fail
to be attached.

[1] https://lore.kernel.org/all/20240919091834.83572-6-sebastian.reichel at collabora.com/
---
 drivers/pmdomain/mediatek/mtk-pm-domains.c | 12 +-----------
 1 file changed, 1 insertion(+), 11 deletions(-)

diff --git a/drivers/pmdomain/mediatek/mtk-pm-domains.c b/drivers/pmdomain/mediatek/mtk-pm-domains.c
index 88406e9ac63c..3580913f25d3 100644
--- a/drivers/pmdomain/mediatek/mtk-pm-domains.c
+++ b/drivers/pmdomain/mediatek/mtk-pm-domains.c
@@ -353,7 +353,6 @@ generic_pm_domain *scpsys_add_one_domain(struct scpsys *scpsys, struct device_no
 {
 	const struct scpsys_domain_data *domain_data;
 	struct scpsys_domain *pd;
-	struct device_node *root_node = scpsys->dev->of_node;
 	struct device_node *smi_node;
 	struct property *prop;
 	const char *clk_name;
@@ -388,16 +387,7 @@ generic_pm_domain *scpsys_add_one_domain(struct scpsys *scpsys, struct device_no
 	pd->scpsys = scpsys;
 
 	if (MTK_SCPD_CAPS(pd, MTK_SCPD_DOMAIN_SUPPLY)) {
-		/*
-		 * Find regulator in current power domain node.
-		 * devm_regulator_get() finds regulator in a node and its child
-		 * node, so set of_node to current power domain node then change
-		 * back to original node after regulator is found for current
-		 * power domain node.
-		 */
-		scpsys->dev->of_node = node;
-		pd->supply = devm_regulator_get(scpsys->dev, "domain");
-		scpsys->dev->of_node = root_node;
+		pd->supply = devm_of_regulator_get_optional(scpsys->dev, node, "domain");
 		if (IS_ERR(pd->supply))
 			return dev_err_cast_probe(scpsys->dev, pd->supply,
 				      "%pOF: failed to get power supply.\n",
-- 
2.46.0.792.g87dc391469-goog



From lee at kernel.org  Wed Sep 25 02:47:38 2024
From: lee at kernel.org (Lee Jones)
Date: Wed, 25 Sep 2024 10:47:38 +0100
Subject: [PATCH v4 0/5] Add mfd, pinctrl and pwm support to EN7581 SoC
In-Reply-To: <66f13ab0.5d0a0220.b0c27.b441@mx.google.com>
References: <20240911-en7581-pinctrl-v4-0-60ac93d760bb@kernel.org>
 <66f13ab0.5d0a0220.b0c27.b441@mx.google.com>
Message-ID: <20240925094738.GD7545@google.com>

On Mon, 23 Sep 2024, Christian Marangi wrote:

> On Wed, Sep 11, 2024 at 09:50:00PM +0200, Lorenzo Bianconi wrote:
> > Introduce airoha-mfd driver in order to load pinctrl and pwm drivers for
> > EN7581 SoC. airoha-mfd is needed since both pinctrl and pwm drivers
> > needs to access the same memory block (gpio memory region) to configure
> > {gio,irq}_chip and pwm functionalities respectively, so model them as
> > childs of a parent mfd driver.
> > Current EN7581 pinctrl driver supports the following functionalities:
> > - pin multiplexing via chip_scu syscon
> > - pin pull-up, pull-down, open-drain, current strength,
> >   {input,output}_enable, output_{low,high} via chip_scu syscon
> > - gpio controller
> > - irq controller
> > 
> > ---
> > Changes in v4:
> > - add 'Limitation' description in pwm driver
> > - fix comments in pwm driver
> > - rely on mfd->base __iomem pointer in pwm driver, modify register
> >   offsets according to it and get rid of sgpio_cfg, flash_cfg and
> >   cycle_cfg pointers
> > - simplify register utility routines in pwm driver
> > - use 'generator' instead of 'waveform' suffix for pwm routines
> > - fix possible overflow calculating duty cycle in pwm driver
> > - do not modify pwm state in free callback in pwm driver
> > - cap the maximum period in pwm driver
> > - do not allow inverse polarity in pwm driver
> > - do not set of_xlate callback in the pwm driver and allow the stack to
> >   do it
> > - fix MAINTAINERS file for airoha pinctrl driver
> > - fix undefined reference to __ffsdi2 in pinctrl driver
> > - simplify airoha,en7581-gpio-sysctl.yam binding
> > - Link to v3: https://lore.kernel.org/r/20240831-en7581-pinctrl-v3-0-98eebfb4da66 at kernel.org
> > 
> > Changes in v3:
> > - introduce airoha-mfd driver
> > - add pwm driver to the same series
> > - model pinctrl and pwm drivers as childs of a parent mfd driver.
> > - access chip-scu memory region in pinctrl driver via syscon
> > - introduce a single airoha,en7581-gpio-sysctl.yaml binding and get rid
> >   of dedicated bindings for pinctrl and pwm
> > - add airoha,en7581-chip-scu.yaml binding do the series
> > - Link to v2: https://lore.kernel.org/r/20240822-en7581-pinctrl-v2-0-ba1559173a7f at kernel.org
> > 
> > Changes in v2:
> > - Fix compilation errors
> > - Collapse some register mappings for gpio and irq controllers
> > - update dt-bindings according to new register mapping
> > - fix some dt-bindings errors
> > - Link to v1: https://lore.kernel.org/all/cover.1723392444.git.lorenzo at kernel.org/
> > 
> > ---
> > Benjamin Larsson (1):
> >       pwm: airoha: Add support for EN7581 SoC
> > 
> > Christian Marangi (2):
> >       dt-bindings: mfd: Add support for Airoha EN7581 GPIO System Controller
> >       mfd: airoha: Add support for Airoha EN7581 MFD
> > 
> > Lorenzo Bianconi (2):
> >       dt-bindings: arm: airoha: Add the chip-scu node for EN7581 SoC
> >       pinctrl: airoha: Add support for EN7581 SoC
> > 
> >  .../bindings/arm/airoha,en7581-chip-scu.yaml       |   42 +
> >  .../bindings/mfd/airoha,en7581-gpio-sysctl.yaml    |  433 +++
> >  MAINTAINERS                                        |    7 +
> >  drivers/mfd/Kconfig                                |    8 +
> >  drivers/mfd/Makefile                               |    2 +
> >  drivers/mfd/airoha-en7581-gpio-mfd.c               |   72 +
> >  drivers/pinctrl/mediatek/Kconfig                   |   16 +-
> >  drivers/pinctrl/mediatek/Makefile                  |    1 +
> >  drivers/pinctrl/mediatek/pinctrl-airoha.c          | 2964 ++++++++++++++++++++
> >  drivers/pwm/Kconfig                                |   10 +
> >  drivers/pwm/Makefile                               |    1 +
> >  drivers/pwm/pwm-airoha.c                           |  414 +++
> >  include/linux/mfd/airoha-en7581-mfd.h              |    9 +
> >  13 files changed, 3978 insertions(+), 1 deletion(-)
> > ---
> > base-commit: 264c13114bd71ddfd7b25c7b94f6cda4587eca25
> > change-id: 20240818-en7581-pinctrl-1bf120154be0
> > prerequisite-change-id: 20240705-for-6-11-bpf-a349efc08df8:v2
> > 
> >
> 
> Hi,
> 
> any news with this? Rob reviewed the DT schemas and he is ok with them.
> 
> Any other comments for the MFD driver and/or the pinctrl or PWM driver?

Note that the merge-window is still open.  Some maintainers, myself
included, use this lull to prioritise other things.  This set is on my
list and will be dealt with shortly.

-- 
Lee Jones [???]


From ansuelsmth at gmail.com  Wed Sep 25 02:51:10 2024
From: ansuelsmth at gmail.com (Christian Marangi)
Date: Wed, 25 Sep 2024 11:51:10 +0200
Subject: [PATCH v4 0/5] Add mfd, pinctrl and pwm support to EN7581 SoC
In-Reply-To: <20240925094738.GD7545@google.com>
References: <20240911-en7581-pinctrl-v4-0-60ac93d760bb@kernel.org>
 <66f13ab0.5d0a0220.b0c27.b441@mx.google.com>
 <20240925094738.GD7545@google.com>
Message-ID: <66f3dd12.5d0a0220.8f8b6.af43@mx.google.com>

On Wed, Sep 25, 2024 at 10:47:38AM +0100, Lee Jones wrote:
> On Mon, 23 Sep 2024, Christian Marangi wrote:
> 
> > On Wed, Sep 11, 2024 at 09:50:00PM +0200, Lorenzo Bianconi wrote:
> > > Introduce airoha-mfd driver in order to load pinctrl and pwm drivers for
> > > EN7581 SoC. airoha-mfd is needed since both pinctrl and pwm drivers
> > > needs to access the same memory block (gpio memory region) to configure
> > > {gio,irq}_chip and pwm functionalities respectively, so model them as
> > > childs of a parent mfd driver.
> > > Current EN7581 pinctrl driver supports the following functionalities:
> > > - pin multiplexing via chip_scu syscon
> > > - pin pull-up, pull-down, open-drain, current strength,
> > >   {input,output}_enable, output_{low,high} via chip_scu syscon
> > > - gpio controller
> > > - irq controller
> > > 
> > > ---
> > > Changes in v4:
> > > - add 'Limitation' description in pwm driver
> > > - fix comments in pwm driver
> > > - rely on mfd->base __iomem pointer in pwm driver, modify register
> > >   offsets according to it and get rid of sgpio_cfg, flash_cfg and
> > >   cycle_cfg pointers
> > > - simplify register utility routines in pwm driver
> > > - use 'generator' instead of 'waveform' suffix for pwm routines
> > > - fix possible overflow calculating duty cycle in pwm driver
> > > - do not modify pwm state in free callback in pwm driver
> > > - cap the maximum period in pwm driver
> > > - do not allow inverse polarity in pwm driver
> > > - do not set of_xlate callback in the pwm driver and allow the stack to
> > >   do it
> > > - fix MAINTAINERS file for airoha pinctrl driver
> > > - fix undefined reference to __ffsdi2 in pinctrl driver
> > > - simplify airoha,en7581-gpio-sysctl.yam binding
> > > - Link to v3: https://lore.kernel.org/r/20240831-en7581-pinctrl-v3-0-98eebfb4da66 at kernel.org
> > > 
> > > Changes in v3:
> > > - introduce airoha-mfd driver
> > > - add pwm driver to the same series
> > > - model pinctrl and pwm drivers as childs of a parent mfd driver.
> > > - access chip-scu memory region in pinctrl driver via syscon
> > > - introduce a single airoha,en7581-gpio-sysctl.yaml binding and get rid
> > >   of dedicated bindings for pinctrl and pwm
> > > - add airoha,en7581-chip-scu.yaml binding do the series
> > > - Link to v2: https://lore.kernel.org/r/20240822-en7581-pinctrl-v2-0-ba1559173a7f at kernel.org
> > > 
> > > Changes in v2:
> > > - Fix compilation errors
> > > - Collapse some register mappings for gpio and irq controllers
> > > - update dt-bindings according to new register mapping
> > > - fix some dt-bindings errors
> > > - Link to v1: https://lore.kernel.org/all/cover.1723392444.git.lorenzo at kernel.org/
> > > 
> > > ---
> > > Benjamin Larsson (1):
> > >       pwm: airoha: Add support for EN7581 SoC
> > > 
> > > Christian Marangi (2):
> > >       dt-bindings: mfd: Add support for Airoha EN7581 GPIO System Controller
> > >       mfd: airoha: Add support for Airoha EN7581 MFD
> > > 
> > > Lorenzo Bianconi (2):
> > >       dt-bindings: arm: airoha: Add the chip-scu node for EN7581 SoC
> > >       pinctrl: airoha: Add support for EN7581 SoC
> > > 
> > >  .../bindings/arm/airoha,en7581-chip-scu.yaml       |   42 +
> > >  .../bindings/mfd/airoha,en7581-gpio-sysctl.yaml    |  433 +++
> > >  MAINTAINERS                                        |    7 +
> > >  drivers/mfd/Kconfig                                |    8 +
> > >  drivers/mfd/Makefile                               |    2 +
> > >  drivers/mfd/airoha-en7581-gpio-mfd.c               |   72 +
> > >  drivers/pinctrl/mediatek/Kconfig                   |   16 +-
> > >  drivers/pinctrl/mediatek/Makefile                  |    1 +
> > >  drivers/pinctrl/mediatek/pinctrl-airoha.c          | 2964 ++++++++++++++++++++
> > >  drivers/pwm/Kconfig                                |   10 +
> > >  drivers/pwm/Makefile                               |    1 +
> > >  drivers/pwm/pwm-airoha.c                           |  414 +++
> > >  include/linux/mfd/airoha-en7581-mfd.h              |    9 +
> > >  13 files changed, 3978 insertions(+), 1 deletion(-)
> > > ---
> > > base-commit: 264c13114bd71ddfd7b25c7b94f6cda4587eca25
> > > change-id: 20240818-en7581-pinctrl-1bf120154be0
> > > prerequisite-change-id: 20240705-for-6-11-bpf-a349efc08df8:v2
> > > 
> > >
> > 
> > Hi,
> > 
> > any news with this? Rob reviewed the DT schemas and he is ok with them.
> > 
> > Any other comments for the MFD driver and/or the pinctrl or PWM driver?
> 
> Note that the merge-window is still open.  Some maintainers, myself
> included, use this lull to prioritise other things.  This set is on my
> list and will be dealt with shortly.
> 

Wasn't aware the merge window was still open and sorry for the noise.
Thanks for the feedback!

-- 
	Ansuel


From peter.wang at mediatek.com  Wed Sep 25 02:55:46 2024
From: peter.wang at mediatek.com (peter.wang at mediatek.com)
Date: Wed, 25 Sep 2024 17:55:46 +0800
Subject: [PATCH v9 3/3] ufs: core: add a quirk for MediaTek SDB mode aborted
In-Reply-To: <20240925095546.19492-1-peter.wang@mediatek.com>
References: <20240925095546.19492-1-peter.wang@mediatek.com>
Message-ID: <20240925095546.19492-4-peter.wang@mediatek.com>

From: Peter Wang <peter.wang at mediatek.com>

Because the MediaTek UFS controller uses UTRLCLR to clear commands
and fills the OCS with ABORTED, this patch introduces a quirk to
treat ABORTED as INVALID_OCS_VALUE.

Signed-off-by: Peter Wang <peter.wang at mediatek.com>
---
 drivers/ufs/core/ufshcd.c       | 5 ++++-
 drivers/ufs/host/ufs-mediatek.c | 1 +
 include/ufs/ufshcd.h            | 6 ++++++
 3 files changed, 11 insertions(+), 1 deletion(-)

diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
index 4fff929b70d6..d429817fca94 100644
--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -5404,7 +5404,10 @@ ufshcd_transfer_rsp_status(struct ufs_hba *hba, struct ufshcd_lrb *lrbp,
 		}
 		break;
 	case OCS_ABORTED:
-		result |= DID_ABORT << 16;
+		if (hba->quirks & UFSHCD_QUIRK_OCS_ABORTED)
+			result |= DID_REQUEUE << 16;
+		else
+			result |= DID_ABORT << 16;
 		dev_warn(hba->dev,
 				"OCS aborted from controller for tag %d\n",
 				lrbp->task_tag);
diff --git a/drivers/ufs/host/ufs-mediatek.c b/drivers/ufs/host/ufs-mediatek.c
index 02c9064284e1..8a4c1b8f5a26 100644
--- a/drivers/ufs/host/ufs-mediatek.c
+++ b/drivers/ufs/host/ufs-mediatek.c
@@ -1021,6 +1021,7 @@ static int ufs_mtk_init(struct ufs_hba *hba)
 	hba->quirks |= UFSHCI_QUIRK_SKIP_MANUAL_WB_FLUSH_CTRL;
 	hba->quirks |= UFSHCD_QUIRK_MCQ_BROKEN_INTR;
 	hba->quirks |= UFSHCD_QUIRK_MCQ_BROKEN_RTC;
+	hba->quirks |= UFSHCD_QUIRK_OCS_ABORTED;
 	hba->vps->wb_flush_threshold = UFS_WB_BUF_REMAIN_PERCENT(80);
 
 	if (host->caps & UFS_MTK_CAP_DISABLE_AH8)
diff --git a/include/ufs/ufshcd.h b/include/ufs/ufshcd.h
index 0fd2aebac728..8f156803d703 100644
--- a/include/ufs/ufshcd.h
+++ b/include/ufs/ufshcd.h
@@ -684,6 +684,12 @@ enum ufshcd_quirks {
 	 * single doorbell mode.
 	 */
 	UFSHCD_QUIRK_BROKEN_LSDBS_CAP			= 1 << 25,
+
+	/*
+	 * Some host controllers set OCS_ABORTED after UTRLCLR (SDB mode),
+	 * this quirk is set to treat OCS: ABORTED as INVALID_OCS_VALUE
+	 */
+	UFSHCD_QUIRK_OCS_ABORTED			= 1 << 26,
 };
 
 enum ufshcd_caps {
-- 
2.45.2



From peter.wang at mediatek.com  Wed Sep 25 02:55:45 2024
From: peter.wang at mediatek.com (peter.wang at mediatek.com)
Date: Wed, 25 Sep 2024 17:55:45 +0800
Subject: [PATCH v9 2/3] ufs: core: fix error handler process for MCQ abort
In-Reply-To: <20240925095546.19492-1-peter.wang@mediatek.com>
References: <20240925095546.19492-1-peter.wang@mediatek.com>
Message-ID: <20240925095546.19492-3-peter.wang@mediatek.com>

From: Peter Wang <peter.wang at mediatek.com>

When the error handler successfully aborts a MCQ request,
it only releases the command and does not notify the SCSI layer.
This may cause another abort after 30 seconds timeout.
This patch notifies the SCSI layer to requeue the request.

Additionally, ignore the OCS: ABORTED CQ slot after MCQ mode
SQ cleanup. This makes the behavior of MCQ mode consistent with
that of legacy SDB mode.

Also, print logs for OCS: ABORTED and OCS_INVALID_COMMAND_STATUS
for debugging purposes.

Signed-off-by: Peter Wang <peter.wang at mediatek.com>
---
 drivers/ufs/core/ufshcd.c | 23 ++++++++++++++++++++++-
 1 file changed, 22 insertions(+), 1 deletion(-)

diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
index a6f818cdef0e..4fff929b70d6 100644
--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -5405,9 +5405,15 @@ ufshcd_transfer_rsp_status(struct ufs_hba *hba, struct ufshcd_lrb *lrbp,
 		break;
 	case OCS_ABORTED:
 		result |= DID_ABORT << 16;
+		dev_warn(hba->dev,
+				"OCS aborted from controller for tag %d\n",
+				lrbp->task_tag);
 		break;
 	case OCS_INVALID_COMMAND_STATUS:
 		result |= DID_REQUEUE << 16;
+		dev_warn(hba->dev,
+				"OCS invaild from controller for tag %d\n",
+				lrbp->task_tag);
 		break;
 	case OCS_INVALID_CMD_TABLE_ATTR:
 	case OCS_INVALID_PRDT_ATTR:
@@ -5526,6 +5532,18 @@ void ufshcd_compl_one_cqe(struct ufs_hba *hba, int task_tag,
 			ufshcd_update_monitor(hba, lrbp);
 		ufshcd_add_command_trace(hba, task_tag, UFS_CMD_COMP);
 		cmd->result = ufshcd_transfer_rsp_status(hba, lrbp, cqe);
+
+		/*
+		 * Ignore MCQ OCS: ABORTED posted by the host controller.
+		 * This makes the behavior of MCQ mode consistent with that
+		 * of legacy SDB mode.
+		 */
+		if (hba->mcq_enabled) {
+			ocs = ufshcd_get_tr_ocs(lrbp, cqe);
+			if (ocs == OCS_ABORTED)
+				return;
+		}
+
 		ufshcd_release_scsi_cmd(hba, lrbp);
 		/* Do not touch lrbp after scsi done */
 		scsi_done(cmd);
@@ -6486,8 +6504,11 @@ static bool ufshcd_abort_one(struct request *rq, void *priv)
 		if (!hwq)
 			return 0;
 		spin_lock_irqsave(&hwq->cq_lock, flags);
-		if (ufshcd_cmd_inflight(lrbp->cmd))
+		if (ufshcd_cmd_inflight(lrbp->cmd)) {
+			set_host_byte(lrbp->cmd, DID_REQUEUE);
 			ufshcd_release_scsi_cmd(hba, lrbp);
+			scsi_done(lrbp->cmd);
+		}
 		spin_unlock_irqrestore(&hwq->cq_lock, flags);
 	}
 
-- 
2.45.2



From peter.wang at mediatek.com  Wed Sep 25 02:55:43 2024
From: peter.wang at mediatek.com (peter.wang at mediatek.com)
Date: Wed, 25 Sep 2024 17:55:43 +0800
Subject: [PATCH v9 0/3] fix abort defect
Message-ID: <20240925095546.19492-1-peter.wang@mediatek.com>

From: Peter Wang <peter.wang at mediatek.com>

V9:
 - Revise the OCS content printed.
 
V8:
 - Remove the abort variable to simplify the abort process.
 - Correct error handler successfully aborts release flow.
 - Ingore MCQ OCS: ABORTED.

V7:
 - Use a variable instead of a flag.
 - Add a check for MCQ mode when setting this variable to UFS_ERR_HANDLER.
 - Print OCS information for OCS_ABORTED and OCS_INVALID_COMMAND_STATUS.
 - Add a MediaTek quirk for handling OCS_ABORTED in SDB mode.
 - Skip notifying SCSI from ISR during SCSI abort (ufshcd_abort()).

V6:
 - Add err handler check before set flag true.

V5:
 - Change flag name.
 - Amend comment and patch description.

V4:
 - Remove nullify SQ entry abort requeue.
 - Add more comment for flag usage and set description.
 - Fix build warning.

V3:
 - Change comment and use variable(rtc) for error print
 - Change flag name and move flag set before ufshcd_clear_cmd
 - Add SDB mode clear UTRLCLR tag receive OCS_ABORTED requeue

V2:
 - Fix mcq_enabled build error.

Peter Wang (3):
  ufs: core: fix the issue of ICU failure
  ufs: core: fix error handler process for MCQ abort
  ufs: core: add a quirk for MediaTek SDB mode aborted

 drivers/ufs/core/ufs-mcq.c      | 15 ++++++++-------
 drivers/ufs/core/ufshcd.c       | 28 ++++++++++++++++++++++++++--
 drivers/ufs/host/ufs-mediatek.c |  1 +
 include/ufs/ufshcd.h            |  6 ++++++
 4 files changed, 41 insertions(+), 9 deletions(-)

-- 
2.45.2



From peter.wang at mediatek.com  Wed Sep 25 02:55:44 2024
From: peter.wang at mediatek.com (peter.wang at mediatek.com)
Date: Wed, 25 Sep 2024 17:55:44 +0800
Subject: [PATCH v9 1/3] ufs: core: fix the issue of ICU failure
In-Reply-To: <20240925095546.19492-1-peter.wang@mediatek.com>
References: <20240925095546.19492-1-peter.wang@mediatek.com>
Message-ID: <20240925095546.19492-2-peter.wang@mediatek.com>

From: Peter Wang <peter.wang at mediatek.com>

When setting the ICU bit without using read-modify-write,
SQRTCy will restart SQ again and receive an RTC return
error code 2 (Failure - SQ not stopped).

Additionally, the error log has been modified so that
this type of error can be observed.

Fixes: ab248643d3d6 ("scsi: ufs: core: Add error handling for MCQ mode")
Cc: stable at vger.kernel.org
Signed-off-by: Peter Wang <peter.wang at mediatek.com>
Reviewed-by: Bao D. Nguyen <quic_nguyenb at quicinc.com>
Reviewed-by: Bart Van Assche <bvanassche at acm.org>
---
 drivers/ufs/core/ufs-mcq.c | 15 ++++++++-------
 1 file changed, 8 insertions(+), 7 deletions(-)

diff --git a/drivers/ufs/core/ufs-mcq.c b/drivers/ufs/core/ufs-mcq.c
index 5891cdacd0b3..3903947dbed1 100644
--- a/drivers/ufs/core/ufs-mcq.c
+++ b/drivers/ufs/core/ufs-mcq.c
@@ -539,7 +539,7 @@ int ufshcd_mcq_sq_cleanup(struct ufs_hba *hba, int task_tag)
 	struct scsi_cmnd *cmd = lrbp->cmd;
 	struct ufs_hw_queue *hwq;
 	void __iomem *reg, *opr_sqd_base;
-	u32 nexus, id, val;
+	u32 nexus, id, val, rtc;
 	int err;
 
 	if (hba->quirks & UFSHCD_QUIRK_MCQ_BROKEN_RTC)
@@ -569,17 +569,18 @@ int ufshcd_mcq_sq_cleanup(struct ufs_hba *hba, int task_tag)
 	opr_sqd_base = mcq_opr_base(hba, OPR_SQD, id);
 	writel(nexus, opr_sqd_base + REG_SQCTI);
 
-	/* SQRTCy.ICU = 1 */
-	writel(SQ_ICU, opr_sqd_base + REG_SQRTC);
+	/* Initiate Cleanup */
+	writel(readl(opr_sqd_base + REG_SQRTC) | SQ_ICU,
+		opr_sqd_base + REG_SQRTC);
 
 	/* Poll SQRTSy.CUS = 1. Return result from SQRTSy.RTC */
 	reg = opr_sqd_base + REG_SQRTS;
 	err = read_poll_timeout(readl, val, val & SQ_CUS, 20,
 				MCQ_POLL_US, false, reg);
-	if (err)
-		dev_err(hba->dev, "%s: failed. hwq=%d, tag=%d err=%ld\n",
-			__func__, id, task_tag,
-			FIELD_GET(SQ_ICU_ERR_CODE_MASK, readl(reg)));
+	rtc = FIELD_GET(SQ_ICU_ERR_CODE_MASK, readl(reg));
+	if (err || rtc)
+		dev_err(hba->dev, "%s: failed. hwq=%d, tag=%d err=%d RTC=%d\n",
+			__func__, id, task_tag, err, rtc);
 
 	if (ufshcd_mcq_sq_start(hba, hwq))
 		err = -ETIMEDOUT;
-- 
2.45.2



From jason-jh.lin at mediatek.com  Wed Sep 25 03:19:26 2024
From: jason-jh.lin at mediatek.com (Jason-JH.Lin)
Date: Wed, 25 Sep 2024 18:19:26 +0800
Subject: [PATCH v5 1/2] drm/mediatek: ovl: Add fmt_convert function pointer to driver data
In-Reply-To: <20240925101927.17042-1-jason-jh.lin@mediatek.com>
References: <20240925101927.17042-1-jason-jh.lin@mediatek.com>
Message-ID: <20240925101927.17042-2-jason-jh.lin@mediatek.com>

OVL_CON_CLRFMT_MAN is a configuration for extending color format
settings of DISP_REG_OVL_CON(n).
It will change some of the original color format settings.

Take the settings of (3 << 12) for example.
- If OVL_CON_CLRFMT_MAN = 0 means OVL_CON_CLRFMT_RGBA8888.
- If OVL_CON_CLRFMT_MAN = 1 means OVL_CON_CLRFMT_PARGB8888.

Since OVL_CON_CLRFMT_MAN is not supported on previous SoCs,
It breaks the OVL color format setting of MT8173.

Therefore, the fmt_convert function pointer is added to the driver data
and mtk_ovl_fmt_convert_with_blend is implemented for MT8192 and MT8195
that support OVL_CON_CLRFMT_MAN, and mtk_ovl_fmt_convert is implemented
for other SoCs that do not support it to solve the degradation problem.

Fixes: a3f7f7ef4bfe ("drm/mediatek: Support "Pre-multiplied" blending in OVL")
Signed-off-by: Jason-JH.Lin <jason-jh.lin at mediatek.com>
Tested-by: Alper Nebi Yasak <alpernebiyasak at gmail.com>
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
Reviewed-by: CK Hu <ck.hu at mediatek.com>
---
 drivers/gpu/drm/mediatek/mtk_disp_ovl.c | 68 ++++++++++++++++++++++---
 1 file changed, 61 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
index 89b439dcf3a6..8f7b7e07aeb1 100644
--- a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
+++ b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
@@ -143,6 +143,7 @@ struct mtk_disp_ovl_data {
 	unsigned int addr;
 	unsigned int gmc_bits;
 	unsigned int layer_nr;
+	unsigned int (*fmt_convert)(struct device *dev, struct mtk_plane_state *state);
 	bool fmt_rgb565_is_0;
 	bool smi_id_en;
 	bool supports_afbc;
@@ -386,13 +387,59 @@ void mtk_ovl_layer_off(struct device *dev, unsigned int idx,
 		      DISP_REG_OVL_RDMA_CTRL(idx));
 }
 
-static unsigned int ovl_fmt_convert(struct mtk_disp_ovl *ovl, unsigned int fmt,
-				    unsigned int blend_mode)
+static unsigned int mtk_ovl_fmt_convert(struct device *dev, struct mtk_plane_state *state)
 {
-	/* The return value in switch "MEM_MODE_INPUT_FORMAT_XXX"
-	 * is defined in mediatek HW data sheet.
-	 * The alphabet order in XXX is no relation to data
-	 * arrangement in memory.
+	struct mtk_disp_ovl *ovl = dev_get_drvdata(dev);
+	unsigned int fmt = state->pending.format;
+
+	switch (fmt) {
+	default:
+	case DRM_FORMAT_RGB565:
+		return OVL_CON_CLRFMT_RGB565(ovl);
+	case DRM_FORMAT_BGR565:
+		return OVL_CON_CLRFMT_RGB565(ovl) | OVL_CON_BYTE_SWAP;
+	case DRM_FORMAT_RGB888:
+		return OVL_CON_CLRFMT_RGB888(ovl);
+	case DRM_FORMAT_BGR888:
+		return OVL_CON_CLRFMT_RGB888(ovl) | OVL_CON_BYTE_SWAP;
+	case DRM_FORMAT_RGBX8888:
+	case DRM_FORMAT_RGBA8888:
+	case DRM_FORMAT_RGBX1010102:
+	case DRM_FORMAT_RGBA1010102:
+		return OVL_CON_CLRFMT_RGBA8888;
+	case DRM_FORMAT_BGRX8888:
+	case DRM_FORMAT_BGRA8888:
+	case DRM_FORMAT_BGRX1010102:
+	case DRM_FORMAT_BGRA1010102:
+		return OVL_CON_CLRFMT_BGRA8888;
+	case DRM_FORMAT_XRGB8888:
+	case DRM_FORMAT_ARGB8888:
+	case DRM_FORMAT_XRGB2101010:
+	case DRM_FORMAT_ARGB2101010:
+		return OVL_CON_CLRFMT_ARGB8888;
+	case DRM_FORMAT_XBGR8888:
+	case DRM_FORMAT_ABGR8888:
+	case DRM_FORMAT_XBGR2101010:
+	case DRM_FORMAT_ABGR2101010:
+		return OVL_CON_CLRFMT_ABGR8888;
+	case DRM_FORMAT_UYVY:
+		return OVL_CON_CLRFMT_UYVY | OVL_CON_MTX_YUV_TO_RGB;
+	case DRM_FORMAT_YUYV:
+		return OVL_CON_CLRFMT_YUYV | OVL_CON_MTX_YUV_TO_RGB;
+	}
+}
+
+static unsigned int mtk_ovl_fmt_convert_with_blend(struct device *dev,
+						   struct mtk_plane_state *state)
+{
+	struct mtk_disp_ovl *ovl = dev_get_drvdata(dev);
+	unsigned int fmt = state->pending.format;
+	unsigned int blend_mode = state->base.pixel_blend_mode;
+
+	/*
+	 * For the platforms where OVL_CON_CLRFMT_MAN is defined in the
+	 * hardware data sheet and supports premultiplied color formats
+	 * such as OVL_CON_CLRFMT_PARGB8888.
 	 */
 	switch (fmt) {
 	default:
@@ -471,7 +518,7 @@ void mtk_ovl_layer_config(struct device *dev, unsigned int idx,
 		return;
 	}
 
-	con = ovl_fmt_convert(ovl, fmt, blend_mode);
+	con = ovl->data->fmt_convert(dev, state);
 	if (state->base.fb) {
 		con |= OVL_CON_AEN;
 		con |= state->base.alpha & OVL_CON_ALPHA;
@@ -625,6 +672,7 @@ static const struct mtk_disp_ovl_data mt2701_ovl_driver_data = {
 	.addr = DISP_REG_OVL_ADDR_MT2701,
 	.gmc_bits = 8,
 	.layer_nr = 4,
+	.fmt_convert = mtk_ovl_fmt_convert,
 	.fmt_rgb565_is_0 = false,
 	.formats = mt8173_formats,
 	.num_formats = ARRAY_SIZE(mt8173_formats),
@@ -634,6 +682,7 @@ static const struct mtk_disp_ovl_data mt8173_ovl_driver_data = {
 	.addr = DISP_REG_OVL_ADDR_MT8173,
 	.gmc_bits = 8,
 	.layer_nr = 4,
+	.fmt_convert = mtk_ovl_fmt_convert,
 	.fmt_rgb565_is_0 = true,
 	.formats = mt8173_formats,
 	.num_formats = ARRAY_SIZE(mt8173_formats),
@@ -643,6 +692,7 @@ static const struct mtk_disp_ovl_data mt8183_ovl_driver_data = {
 	.addr = DISP_REG_OVL_ADDR_MT8173,
 	.gmc_bits = 10,
 	.layer_nr = 4,
+	.fmt_convert = mtk_ovl_fmt_convert,
 	.fmt_rgb565_is_0 = true,
 	.formats = mt8173_formats,
 	.num_formats = ARRAY_SIZE(mt8173_formats),
@@ -652,6 +702,7 @@ static const struct mtk_disp_ovl_data mt8183_ovl_2l_driver_data = {
 	.addr = DISP_REG_OVL_ADDR_MT8173,
 	.gmc_bits = 10,
 	.layer_nr = 2,
+	.fmt_convert = mtk_ovl_fmt_convert,
 	.fmt_rgb565_is_0 = true,
 	.formats = mt8173_formats,
 	.num_formats = ARRAY_SIZE(mt8173_formats),
@@ -661,6 +712,7 @@ static const struct mtk_disp_ovl_data mt8192_ovl_driver_data = {
 	.addr = DISP_REG_OVL_ADDR_MT8173,
 	.gmc_bits = 10,
 	.layer_nr = 4,
+	.fmt_convert = mtk_ovl_fmt_convert_with_blend,
 	.fmt_rgb565_is_0 = true,
 	.smi_id_en = true,
 	.formats = mt8173_formats,
@@ -671,6 +723,7 @@ static const struct mtk_disp_ovl_data mt8192_ovl_2l_driver_data = {
 	.addr = DISP_REG_OVL_ADDR_MT8173,
 	.gmc_bits = 10,
 	.layer_nr = 2,
+	.fmt_convert = mtk_ovl_fmt_convert_with_blend,
 	.fmt_rgb565_is_0 = true,
 	.smi_id_en = true,
 	.formats = mt8173_formats,
@@ -681,6 +734,7 @@ static const struct mtk_disp_ovl_data mt8195_ovl_driver_data = {
 	.addr = DISP_REG_OVL_ADDR_MT8173,
 	.gmc_bits = 10,
 	.layer_nr = 4,
+	.fmt_convert = mtk_ovl_fmt_convert_with_blend,
 	.fmt_rgb565_is_0 = true,
 	.smi_id_en = true,
 	.supports_afbc = true,
-- 
2.43.0



From jason-jh.lin at mediatek.com  Wed Sep 25 03:19:25 2024
From: jason-jh.lin at mediatek.com (Jason-JH.Lin)
Date: Wed, 25 Sep 2024 18:19:25 +0800
Subject: [PATCH v5 0/2] Fix degradation problem of alpha blending series
Message-ID: <20240925101927.17042-1-jason-jh.lin@mediatek.com>

From: Jason-jh Lin <jason-jh.lin at mediatek.corp-partner.google.com>

Some SoCs not support pre-multiplied pixel formats and extending
configuration of OVL pre-multiplied color formats, such as MT8173.

Fix the SoC degradation problem by this sreies.

---

Change in v5:
Add fix patch for mtk_plane

Change in v4:
Add lost cases of mtk_ovl_fmt_convert_with_blend

Change in v3:
Change MACRO approach to function pointer in driver data

Change in v2:
Fix build error and typo

Change in v1:
Add fix patch for OVL unsupport color format settings by driver data

---

Jason-JH.Lin (2):
  drm/mediatek: ovl: Add fmt_convert function pointer to driver data
  drm/mediatek: Add blend_modes to mtk_plane_init() for different SoCs

 drivers/gpu/drm/mediatek/mtk_crtc.c           |  1 +
 drivers/gpu/drm/mediatek/mtk_ddp_comp.c       |  2 +
 drivers/gpu/drm/mediatek/mtk_ddp_comp.h       | 10 ++
 drivers/gpu/drm/mediatek/mtk_disp_drv.h       |  3 +
 drivers/gpu/drm/mediatek/mtk_disp_ovl.c       | 93 +++++++++++++++++--
 .../gpu/drm/mediatek/mtk_disp_ovl_adaptor.c   |  7 ++
 drivers/gpu/drm/mediatek/mtk_mdp_rdma.c       |  8 ++
 drivers/gpu/drm/mediatek/mtk_plane.c          |  9 +-
 drivers/gpu/drm/mediatek/mtk_plane.h          |  4 +-
 9 files changed, 122 insertions(+), 15 deletions(-)

-- 
2.43.0



From jason-jh.lin at mediatek.com  Wed Sep 25 03:19:27 2024
From: jason-jh.lin at mediatek.com (Jason-JH.Lin)
Date: Wed, 25 Sep 2024 18:19:27 +0800
Subject: [PATCH v5 2/2] drm/mediatek: Add blend_modes to mtk_plane_init() for different SoCs
In-Reply-To: <20240925101927.17042-1-jason-jh.lin@mediatek.com>
References: <20240925101927.17042-1-jason-jh.lin@mediatek.com>
Message-ID: <20240925101927.17042-3-jason-jh.lin@mediatek.com>

Since some SoCs support premultiplied pixel formats but some do not,
the blend_modes parameter is added to mtk_plane_init(), which is
obtained from the mtk_ddp_comp_get_blend_modes function implemented
in different OVL components.

The OVL component can use driver data to set the blend mode
capabilities for different SoCs.

Fixes: 4225d5d5e779 ("drm/mediatek: Support alpha blending in display driver")
Signed-off-by: Jason-JH.Lin <jason-jh.lin at mediatek.com>
---
 drivers/gpu/drm/mediatek/mtk_crtc.c           |  1 +
 drivers/gpu/drm/mediatek/mtk_ddp_comp.c       |  2 ++
 drivers/gpu/drm/mediatek/mtk_ddp_comp.h       | 10 ++++++++
 drivers/gpu/drm/mediatek/mtk_disp_drv.h       |  3 +++
 drivers/gpu/drm/mediatek/mtk_disp_ovl.c       | 25 +++++++++++++++++++
 .../gpu/drm/mediatek/mtk_disp_ovl_adaptor.c   |  7 ++++++
 drivers/gpu/drm/mediatek/mtk_mdp_rdma.c       |  8 ++++++
 drivers/gpu/drm/mediatek/mtk_plane.c          |  9 +++----
 drivers/gpu/drm/mediatek/mtk_plane.h          |  4 +--
 9 files changed, 61 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/mediatek/mtk_crtc.c b/drivers/gpu/drm/mediatek/mtk_crtc.c
index 175b00e5a253..b65f196f2015 100644
--- a/drivers/gpu/drm/mediatek/mtk_crtc.c
+++ b/drivers/gpu/drm/mediatek/mtk_crtc.c
@@ -913,6 +913,7 @@ static int mtk_crtc_init_comp_planes(struct drm_device *drm_dev,
 				BIT(pipe),
 				mtk_crtc_plane_type(mtk_crtc->layer_nr, num_planes),
 				mtk_ddp_comp_supported_rotations(comp),
+				mtk_ddp_comp_get_blend_modes(comp),
 				mtk_ddp_comp_get_formats(comp),
 				mtk_ddp_comp_get_num_formats(comp), i);
 		if (ret)
diff --git a/drivers/gpu/drm/mediatek/mtk_ddp_comp.c b/drivers/gpu/drm/mediatek/mtk_ddp_comp.c
index be66d94be361..edc6417639e6 100644
--- a/drivers/gpu/drm/mediatek/mtk_ddp_comp.c
+++ b/drivers/gpu/drm/mediatek/mtk_ddp_comp.c
@@ -363,6 +363,7 @@ static const struct mtk_ddp_comp_funcs ddp_ovl = {
 	.layer_config = mtk_ovl_layer_config,
 	.bgclr_in_on = mtk_ovl_bgclr_in_on,
 	.bgclr_in_off = mtk_ovl_bgclr_in_off,
+	.get_blend_modes = mtk_ovl_get_blend_modes,
 	.get_formats = mtk_ovl_get_formats,
 	.get_num_formats = mtk_ovl_get_num_formats,
 };
@@ -416,6 +417,7 @@ static const struct mtk_ddp_comp_funcs ddp_ovl_adaptor = {
 	.disconnect = mtk_ovl_adaptor_disconnect,
 	.add = mtk_ovl_adaptor_add_comp,
 	.remove = mtk_ovl_adaptor_remove_comp,
+	.get_blend_modes = mtk_ovl_adaptor_get_blend_modes,
 	.get_formats = mtk_ovl_adaptor_get_formats,
 	.get_num_formats = mtk_ovl_adaptor_get_num_formats,
 	.mode_valid = mtk_ovl_adaptor_mode_valid,
diff --git a/drivers/gpu/drm/mediatek/mtk_ddp_comp.h b/drivers/gpu/drm/mediatek/mtk_ddp_comp.h
index ecf6dc283cd7..79562af1180f 100644
--- a/drivers/gpu/drm/mediatek/mtk_ddp_comp.h
+++ b/drivers/gpu/drm/mediatek/mtk_ddp_comp.h
@@ -80,6 +80,7 @@ struct mtk_ddp_comp_funcs {
 	void (*ctm_set)(struct device *dev,
 			struct drm_crtc_state *state);
 	struct device * (*dma_dev_get)(struct device *dev);
+	const u32 (*get_blend_modes)(struct device *dev);
 	const u32 *(*get_formats)(struct device *dev);
 	size_t (*get_num_formats)(struct device *dev);
 	void (*connect)(struct device *dev, struct device *mmsys_dev, unsigned int next);
@@ -266,6 +267,15 @@ static inline struct device *mtk_ddp_comp_dma_dev_get(struct mtk_ddp_comp *comp)
 	return comp->dev;
 }
 
+static inline
+const u32 mtk_ddp_comp_get_blend_modes(struct mtk_ddp_comp *comp)
+{
+	if (comp->funcs && comp->funcs->get_blend_modes)
+		return comp->funcs->get_blend_modes(comp->dev);
+
+	return 0;
+}
+
 static inline
 const u32 *mtk_ddp_comp_get_formats(struct mtk_ddp_comp *comp)
 {
diff --git a/drivers/gpu/drm/mediatek/mtk_disp_drv.h b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
index 082ac18fe04a..ea07b3b55b1c 100644
--- a/drivers/gpu/drm/mediatek/mtk_disp_drv.h
+++ b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
@@ -103,6 +103,7 @@ void mtk_ovl_register_vblank_cb(struct device *dev,
 void mtk_ovl_unregister_vblank_cb(struct device *dev);
 void mtk_ovl_enable_vblank(struct device *dev);
 void mtk_ovl_disable_vblank(struct device *dev);
+const u32 mtk_ovl_get_blend_modes(struct device *dev);
 const u32 *mtk_ovl_get_formats(struct device *dev);
 size_t mtk_ovl_get_num_formats(struct device *dev);
 
@@ -131,6 +132,7 @@ void mtk_ovl_adaptor_start(struct device *dev);
 void mtk_ovl_adaptor_stop(struct device *dev);
 unsigned int mtk_ovl_adaptor_layer_nr(struct device *dev);
 struct device *mtk_ovl_adaptor_dma_dev_get(struct device *dev);
+const u32 mtk_ovl_adaptor_get_blend_modes(struct device *dev);
 const u32 *mtk_ovl_adaptor_get_formats(struct device *dev);
 size_t mtk_ovl_adaptor_get_num_formats(struct device *dev);
 enum drm_mode_status mtk_ovl_adaptor_mode_valid(struct device *dev,
@@ -165,6 +167,7 @@ void mtk_mdp_rdma_start(struct device *dev, struct cmdq_pkt *cmdq_pkt);
 void mtk_mdp_rdma_stop(struct device *dev, struct cmdq_pkt *cmdq_pkt);
 void mtk_mdp_rdma_config(struct device *dev, struct mtk_mdp_rdma_cfg *cfg,
 			 struct cmdq_pkt *cmdq_pkt);
+const u32 mtk_mdp_rdma_get_blend_modes(struct device *dev);
 const u32 *mtk_mdp_rdma_get_formats(struct device *dev);
 size_t mtk_mdp_rdma_get_num_formats(struct device *dev);
 
diff --git a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
index 8f7b7e07aeb1..864dc96aad01 100644
--- a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
+++ b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
@@ -147,6 +147,7 @@ struct mtk_disp_ovl_data {
 	bool fmt_rgb565_is_0;
 	bool smi_id_en;
 	bool supports_afbc;
+	const u32 blend_modes;
 	const u32 *formats;
 	size_t num_formats;
 	bool supports_clrfmt_ext;
@@ -215,6 +216,13 @@ void mtk_ovl_disable_vblank(struct device *dev)
 	writel_relaxed(0x0, ovl->regs + DISP_REG_OVL_INTEN);
 }
 
+const u32 mtk_ovl_get_blend_modes(struct device *dev)
+{
+	struct mtk_disp_ovl *ovl = dev_get_drvdata(dev);
+
+	return ovl->data->blend_modes;
+}
+
 const u32 *mtk_ovl_get_formats(struct device *dev)
 {
 	struct mtk_disp_ovl *ovl = dev_get_drvdata(dev);
@@ -674,6 +682,8 @@ static const struct mtk_disp_ovl_data mt2701_ovl_driver_data = {
 	.layer_nr = 4,
 	.fmt_convert = mtk_ovl_fmt_convert,
 	.fmt_rgb565_is_0 = false,
+	.blend_modes = BIT(DRM_MODE_BLEND_COVERAGE) |
+		       BIT(DRM_MODE_BLEND_PIXEL_NONE),
 	.formats = mt8173_formats,
 	.num_formats = ARRAY_SIZE(mt8173_formats),
 };
@@ -684,6 +694,8 @@ static const struct mtk_disp_ovl_data mt8173_ovl_driver_data = {
 	.layer_nr = 4,
 	.fmt_convert = mtk_ovl_fmt_convert,
 	.fmt_rgb565_is_0 = true,
+	.blend_modes = BIT(DRM_MODE_BLEND_COVERAGE) |
+		       BIT(DRM_MODE_BLEND_PIXEL_NONE),
 	.formats = mt8173_formats,
 	.num_formats = ARRAY_SIZE(mt8173_formats),
 };
@@ -694,6 +706,8 @@ static const struct mtk_disp_ovl_data mt8183_ovl_driver_data = {
 	.layer_nr = 4,
 	.fmt_convert = mtk_ovl_fmt_convert,
 	.fmt_rgb565_is_0 = true,
+	.blend_modes = BIT(DRM_MODE_BLEND_COVERAGE) |
+		       BIT(DRM_MODE_BLEND_PIXEL_NONE),
 	.formats = mt8173_formats,
 	.num_formats = ARRAY_SIZE(mt8173_formats),
 };
@@ -704,6 +718,8 @@ static const struct mtk_disp_ovl_data mt8183_ovl_2l_driver_data = {
 	.layer_nr = 2,
 	.fmt_convert = mtk_ovl_fmt_convert,
 	.fmt_rgb565_is_0 = true,
+	.blend_modes = BIT(DRM_MODE_BLEND_COVERAGE) |
+		       BIT(DRM_MODE_BLEND_PIXEL_NONE),
 	.formats = mt8173_formats,
 	.num_formats = ARRAY_SIZE(mt8173_formats),
 };
@@ -715,6 +731,9 @@ static const struct mtk_disp_ovl_data mt8192_ovl_driver_data = {
 	.fmt_convert = mtk_ovl_fmt_convert_with_blend,
 	.fmt_rgb565_is_0 = true,
 	.smi_id_en = true,
+	.blend_modes = BIT(DRM_MODE_BLEND_PREMULTI) |
+		       BIT(DRM_MODE_BLEND_COVERAGE) |
+		       BIT(DRM_MODE_BLEND_PIXEL_NONE),
 	.formats = mt8173_formats,
 	.num_formats = ARRAY_SIZE(mt8173_formats),
 };
@@ -726,6 +745,9 @@ static const struct mtk_disp_ovl_data mt8192_ovl_2l_driver_data = {
 	.fmt_convert = mtk_ovl_fmt_convert_with_blend,
 	.fmt_rgb565_is_0 = true,
 	.smi_id_en = true,
+	.blend_modes = BIT(DRM_MODE_BLEND_PREMULTI) |
+		       BIT(DRM_MODE_BLEND_COVERAGE) |
+		       BIT(DRM_MODE_BLEND_PIXEL_NONE),
 	.formats = mt8173_formats,
 	.num_formats = ARRAY_SIZE(mt8173_formats),
 };
@@ -738,6 +760,9 @@ static const struct mtk_disp_ovl_data mt8195_ovl_driver_data = {
 	.fmt_rgb565_is_0 = true,
 	.smi_id_en = true,
 	.supports_afbc = true,
+	.blend_modes = BIT(DRM_MODE_BLEND_PREMULTI) |
+		       BIT(DRM_MODE_BLEND_COVERAGE) |
+		       BIT(DRM_MODE_BLEND_PIXEL_NONE),
 	.formats = mt8195_formats,
 	.num_formats = ARRAY_SIZE(mt8195_formats),
 	.supports_clrfmt_ext = true,
diff --git a/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c b/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c
index c6768210b08b..2d47b6eb4c19 100644
--- a/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c
+++ b/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c
@@ -400,6 +400,13 @@ void mtk_ovl_adaptor_disable_vblank(struct device *dev)
 	mtk_ethdr_disable_vblank(ovl_adaptor->ovl_adaptor_comp[OVL_ADAPTOR_ETHDR0]);
 }
 
+const u32 mtk_ovl_adaptor_get_blend_modes(struct device *dev)
+{
+	struct mtk_disp_ovl_adaptor *ovl_adaptor = dev_get_drvdata(dev);
+
+	return mtk_mdp_rdma_get_blend_modes(ovl_adaptor->ovl_adaptor_comp[OVL_ADAPTOR_MDP_RDMA0]);
+}
+
 const u32 *mtk_ovl_adaptor_get_formats(struct device *dev)
 {
 	struct mtk_disp_ovl_adaptor *ovl_adaptor = dev_get_drvdata(dev);
diff --git a/drivers/gpu/drm/mediatek/mtk_mdp_rdma.c b/drivers/gpu/drm/mediatek/mtk_mdp_rdma.c
index 7c1a8c796833..a011d2e664f4 100644
--- a/drivers/gpu/drm/mediatek/mtk_mdp_rdma.c
+++ b/drivers/gpu/drm/mediatek/mtk_mdp_rdma.c
@@ -3,6 +3,7 @@
  * Copyright (c) 2021 MediaTek Inc.
  */
 
+#include <drm/drm_blend.h>
 #include <drm/drm_fourcc.h>
 #include <linux/clk.h>
 #include <linux/component.h>
@@ -232,6 +233,13 @@ void mtk_mdp_rdma_config(struct device *dev, struct mtk_mdp_rdma_cfg *cfg,
 			   MDP_RDMA_MF_CLIP_SIZE, FLD_MF_CLIP_H);
 }
 
+const u32 mtk_mdp_rdma_get_blend_modes(struct device *dev)
+{
+	return BIT(DRM_MODE_BLEND_PREMULTI) |
+	       BIT(DRM_MODE_BLEND_COVERAGE) |
+	       BIT(DRM_MODE_BLEND_PIXEL_NONE);
+}
+
 const u32 *mtk_mdp_rdma_get_formats(struct device *dev)
 {
 	return formats;
diff --git a/drivers/gpu/drm/mediatek/mtk_plane.c b/drivers/gpu/drm/mediatek/mtk_plane.c
index 7d2cb4e0fafa..eb545b81bf2f 100644
--- a/drivers/gpu/drm/mediatek/mtk_plane.c
+++ b/drivers/gpu/drm/mediatek/mtk_plane.c
@@ -320,8 +320,8 @@ static const struct drm_plane_helper_funcs mtk_plane_helper_funcs = {
 
 int mtk_plane_init(struct drm_device *dev, struct drm_plane *plane,
 		   unsigned long possible_crtcs, enum drm_plane_type type,
-		   unsigned int supported_rotations, const u32 *formats,
-		   size_t num_formats, unsigned int plane_idx)
+		   unsigned int supported_rotations, const u32 blend_modes,
+		   const u32 *formats, size_t num_formats, unsigned int plane_idx)
 {
 	int err;
 
@@ -366,10 +366,7 @@ int mtk_plane_init(struct drm_device *dev, struct drm_plane *plane,
 	if (err)
 		DRM_ERROR("failed to create property: alpha\n");
 
-	err = drm_plane_create_blend_mode_property(plane,
-						   BIT(DRM_MODE_BLEND_PREMULTI) |
-						   BIT(DRM_MODE_BLEND_COVERAGE) |
-						   BIT(DRM_MODE_BLEND_PIXEL_NONE));
+	err = drm_plane_create_blend_mode_property(plane, blend_modes);
 	if (err)
 		DRM_ERROR("failed to create property: blend_mode\n");
 
diff --git a/drivers/gpu/drm/mediatek/mtk_plane.h b/drivers/gpu/drm/mediatek/mtk_plane.h
index 5b177eac67b7..3b13b89989c7 100644
--- a/drivers/gpu/drm/mediatek/mtk_plane.h
+++ b/drivers/gpu/drm/mediatek/mtk_plane.h
@@ -48,6 +48,6 @@ to_mtk_plane_state(struct drm_plane_state *state)
 
 int mtk_plane_init(struct drm_device *dev, struct drm_plane *plane,
 		   unsigned long possible_crtcs, enum drm_plane_type type,
-		   unsigned int supported_rotations, const u32 *formats,
-		   size_t num_formats, unsigned int plane_idx);
+		   unsigned int supported_rotations, const u32 blend_modes,
+		   const u32 *formats, size_t num_formats, unsigned int plane_idx);
 #endif
-- 
2.43.0



From treapking at chromium.org  Wed Sep 25 03:44:02 2024
From: treapking at chromium.org (Pin-yen Lin)
Date: Wed, 25 Sep 2024 18:44:02 +0800
Subject: [PATCH v3] arm64: dts: mediatek: mt8183-pumpkin: add HDMI support
In-Reply-To: <172676985046.765320.3471835988677145017.robh@kernel.org>
References: <20240919094212.1902073-1-treapking@chromium.org> <172676985046.765320.3471835988677145017.robh@kernel.org>
Message-ID: <CAEXTbpeATBYmHpCYAGhiecVeH=+R8=E0aLLscnKV4QyVbfrWJw@mail.gmail.com>

On Fri, Sep 20, 2024 at 2:18?AM Rob Herring (Arm) <robh at kernel.org> wrote:
>
>
> On Thu, 19 Sep 2024 17:41:49 +0800, Pin-yen Lin wrote:
> > From: Fabien Parent <fparent at baylibre.com>
> >
> > The MT8183 Pumpkin board has a micro-HDMI connector. HDMI support is
> > provided by an IT66121 DPI <-> HDMI bridge.
> >
> > Enable the DPI and add the node for the IT66121 bridge.
> >
> > Signed-off-by: Fabien Parent <fparent at baylibre.com>
> > Co-developed-by: Pin-yen Lin <treapking at chromium.org>
> > Signed-off-by: Pin-yen Lin <treapking at chromium.org>
> > Reviewed-by: N?colas F. R. A. Prado <nfraprado at collabora.com>
> >
> > ---
> >
> > Changes in v3:
> > - Update commit message and fix formatting issues
> > - Fix the label name of vcn33 regulator
> >
> >  .../boot/dts/mediatek/mt8183-pumpkin.dts      | 123 ++++++++++++++++++
> >  1 file changed, 123 insertions(+)
> >
>
>
> My bot found new DTB warnings on the .dts files added or changed in this
> series.
>
> Some warnings may be from an existing SoC .dtsi. Or perhaps the warnings
> are fixed by another series. Ultimately, it is up to the platform
> maintainer whether these warnings are acceptable or not. No need to reply
> unless the platform maintainer has comments.
>
> If you already ran DT checks and didn't see these error(s), then
> make sure dt-schema is up to date:
>
>   pip3 install dtschema --upgrade
>
>
> New warnings running 'make CHECK_DTBS=y mediatek/mt8183-pumpkin.dtb' for 20240919094212.1902073-1-treapking at chromium.org:
>
> arch/arm64/boot/dts/mediatek/mt8183-pumpkin.dtb: dpi at 14015000: power-domains: False schema does not allow [[76, 7]]
>         from schema $id: http://devicetree.org/schemas/display/mediatek/mediatek,dpi.yaml#

This warning will be addressed by
https://lore.kernel.org/all/20240919112152.2829765-2-rohiagar at chromium.org/,
and it comes from the dtsi file this patch includes.

Regards,
Pin-yen
>
>
>
>
>


From andriy.shevchenko at linux.intel.com  Wed Sep 25 03:53:12 2024
From: andriy.shevchenko at linux.intel.com (Andy Shevchenko)
Date: Wed, 25 Sep 2024 13:53:12 +0300
Subject: [PATCH v8 1/3] regulator: Add of_regulator_get_optional() for
 pure DT regulator lookup
In-Reply-To: <20240925093807.1026949-2-wenst@chromium.org>
References: <20240925093807.1026949-1-wenst@chromium.org>
 <20240925093807.1026949-2-wenst@chromium.org>
Message-ID: <ZvPrmJo5WWqAHrhb@smile.fi.intel.com>

On Wed, Sep 25, 2024 at 05:38:04PM +0800, Chen-Yu Tsai wrote:
> The to-be-introduced I2C component prober needs to enable regulator
> supplies (and toggle GPIO pins) for the various components it intends
> to probe. To support this, a new "pure DT lookup" method for getting
> regulator supplies is needed, since the device normally requesting
> the supply won't get created until after the component is probed to
> be available.
> 
> Add a new of_regulator_get_optional() function for this. This mirrors
> the existing regulator_get_optional() function, but is OF-specific.
> The underlying code that supports the existing regulator_get*()
> functions has been reworked in previous patches to support this
> specific case.
> 
> Also convert an existing usage of "dev && dev->of_node" to
> "dev_of_node(dev)".

I thought I gave a tag already...
Whatever, FWIW,
Reviewed-by: Andy Shevchenko <andriy.shevchenko at linux.intel.com>

-- 
With Best Regards,
Andy Shevchenko




From andriy.shevchenko at linux.intel.com  Wed Sep 25 03:56:49 2024
From: andriy.shevchenko at linux.intel.com (Andy Shevchenko)
Date: Wed, 25 Sep 2024 13:56:49 +0300
Subject: [PATCH v8 2/3] regulator: Add devres version of
 of_regulator_get_optional()
In-Reply-To: <20240925093807.1026949-3-wenst@chromium.org>
References: <20240925093807.1026949-1-wenst@chromium.org>
 <20240925093807.1026949-3-wenst@chromium.org>
Message-ID: <ZvPscRdWlFPmtCyR@smile.fi.intel.com>

On Wed, Sep 25, 2024 at 05:38:05PM +0800, Chen-Yu Tsai wrote:
> There are existing uses for a devres version of of_regulator_get_optional()
> in power domain drivers. On MediaTek platforms, power domains may have
> regulator supplies tied to them. The driver currently tries to use
> devm_regulator_get() to not have to manage the lifecycle, but ends up
> doing it in a very hacky way by replacing the device node of the power
> domain controller device to the device node of the power domain that is
> currently being registered, getting the supply, and reverting the device
> node.
> 
> Provide a better API so that the hack can be replaced.

...

> +#if IS_ENABLED(CONFIG_OF)

Do we really need this?

> +static struct regulator *_devm_of_regulator_get(struct device *dev, struct device_node *node,
> +						const char *id, int get_type)
> +{
> +	struct regulator **ptr, *regulator;
> +
> +	ptr = devres_alloc(devm_regulator_release, sizeof(*ptr), GFP_KERNEL);
> +	if (!ptr)
> +		return ERR_PTR(-ENOMEM);
> +
> +	regulator = _of_regulator_get(dev, node, id, get_type);
> +	if (!IS_ERR(regulator)) {
> +		*ptr = regulator;
> +		devres_add(dev, ptr);
> +	} else {
> +		devres_free(ptr);
> +	}
> +
> +	return regulator;

Why not using devm_add_action() / devm_add_action_or_reset()
(whichever suits better here)?

> +}

> +#endif

...

> +static inline struct regulator *__must_check devm_of_regulator_get_optional(struct device *dev,
> +									    struct device_node *node,
> +									    const char *id)

I don't know the conventions here, but I find better to have it as

static inline __must_check struct regulator *
devm_of_regulator_get_optional(struct device *dev, struct device_node *node, const char *id)

Similar to other stubs and declarations.

-- 
With Best Regards,
Andy Shevchenko




From fshao at chromium.org  Wed Sep 25 03:57:44 2024
From: fshao at chromium.org (Fei Shao)
Date: Wed, 25 Sep 2024 18:57:44 +0800
Subject: [PATCH 0/6] MT8188 DT and binding fixes
Message-ID: <20240925110044.3678055-1-fshao@chromium.org>

Hi all,

This series is split from a previous series[1] to focus on few fixes and
improvements around MediaTek MT8188 device tree and bindings, and also
addressed comments and carried tags from the mentioned series.

[1]:
https://lore.kernel.org/all/20240909111535.528624-1-fshao at chromium.org/

Regards,
Fei


Fei Shao (6):
  dt-bindings: power: mediatek: Add another nested power-domain layer
  dt-bindings: PCI: mediatek-gen3: Allow exact number of clocks only
  arm64: dts: mediatek: mt8188: Define CPU big core cluster
  arm64: dts: mediatek: mt8188: Add missing dma-ranges to soc node
  arm64: dts: mediatek: mt8188: Move vdec1 power domain under vdec0
  arm64: dts: mediatek: mt8188: Update vppsys node names to syscon

 .../bindings/pci/mediatek-pcie-gen3.yaml      |  5 ++-
 .../power/mediatek,power-controller.yaml      |  4 ++
 arch/arm64/boot/dts/mediatek/mt8188.dtsi      | 37 +++++++++++--------
 3 files changed, 28 insertions(+), 18 deletions(-)

-- 
2.46.0.792.g87dc391469-goog



From fshao at chromium.org  Wed Sep 25 03:57:45 2024
From: fshao at chromium.org (Fei Shao)
Date: Wed, 25 Sep 2024 18:57:45 +0800
Subject: [PATCH 1/6] dt-bindings: power: mediatek: Add another nested power-domain layer
In-Reply-To: <20240925110044.3678055-1-fshao@chromium.org>
References: <20240925110044.3678055-1-fshao@chromium.org>
Message-ID: <20240925110044.3678055-2-fshao@chromium.org>

The MT8188 SoC has a more in-depth power-domain tree, and the
CHECK_DTBS=y check could fail because the current MediaTek power
dt-binding is insufficient to cover its CAM_SUBA and CAM_SUBB
sub-domains.

Add one more nested power-domain layer to pass the check.

Acked-by: Rob Herring (Arm) <robh at kernel.org>
Signed-off-by: Fei Shao <fshao at chromium.org>
---

 .../devicetree/bindings/power/mediatek,power-controller.yaml  | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/Documentation/devicetree/bindings/power/mediatek,power-controller.yaml b/Documentation/devicetree/bindings/power/mediatek,power-controller.yaml
index 8985e2df8a56..a7df4041b745 100644
--- a/Documentation/devicetree/bindings/power/mediatek,power-controller.yaml
+++ b/Documentation/devicetree/bindings/power/mediatek,power-controller.yaml
@@ -54,6 +54,10 @@ patternProperties:
             patternProperties:
               "^power-domain@[0-9a-f]+$":
                 $ref: "#/$defs/power-domain-node"
+                patternProperties:
+                  "^power-domain@[0-9a-f]+$":
+                    $ref: "#/$defs/power-domain-node"
+                    unevaluatedProperties: false
                 unevaluatedProperties: false
             unevaluatedProperties: false
         unevaluatedProperties: false
-- 
2.46.0.792.g87dc391469-goog



From fshao at chromium.org  Wed Sep 25 03:57:46 2024
From: fshao at chromium.org (Fei Shao)
Date: Wed, 25 Sep 2024 18:57:46 +0800
Subject: [PATCH 2/6] dt-bindings: PCI: mediatek-gen3: Allow exact number of clocks only
In-Reply-To: <20240925110044.3678055-1-fshao@chromium.org>
References: <20240925110044.3678055-1-fshao@chromium.org>
Message-ID: <20240925110044.3678055-3-fshao@chromium.org>

In MediaTek PCIe gen3 bindings, "clocks" accepts a range of 1-6 clocks
across all SoCs. But in practice, each SoC requires a particular number
of clocks as defined in "clock-names", and the length of "clocks" and
"clock-names" can be inconsistent with current bindings.

For example:
- MT8188, MT8192 and MT8195 all require 6 clocks, while the bindings
  accept 4-6 clocks.
- MT7986 requires 4 clocks, while the bindings accept 4-6 clocks.

Update minItems and maxItems properties for individual SoCs as needed to
only accept the correct number of clocks.

Fixes: c6abd0eadec6 ("dt-bindings: PCI: mediatek-gen3: Add support for Airoha EN7581")
Signed-off-by: Fei Shao <fshao at chromium.org>
---

 .../devicetree/bindings/pci/mediatek-pcie-gen3.yaml          | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/Documentation/devicetree/bindings/pci/mediatek-pcie-gen3.yaml b/Documentation/devicetree/bindings/pci/mediatek-pcie-gen3.yaml
index 898c1be2d6a4..f05aab2b1add 100644
--- a/Documentation/devicetree/bindings/pci/mediatek-pcie-gen3.yaml
+++ b/Documentation/devicetree/bindings/pci/mediatek-pcie-gen3.yaml
@@ -149,7 +149,7 @@ allOf:
     then:
       properties:
         clocks:
-          minItems: 4
+          minItems: 6
 
         clock-names:
           items:
@@ -178,7 +178,7 @@ allOf:
     then:
       properties:
         clocks:
-          minItems: 4
+          minItems: 6
 
         clock-names:
           items:
@@ -207,6 +207,7 @@ allOf:
       properties:
         clocks:
           minItems: 4
+          maxItems: 4
 
         clock-names:
           items:
-- 
2.46.0.792.g87dc391469-goog



From fshao at chromium.org  Wed Sep 25 03:57:47 2024
From: fshao at chromium.org (Fei Shao)
Date: Wed, 25 Sep 2024 18:57:47 +0800
Subject: [PATCH 3/6] arm64: dts: mediatek: mt8188: Define CPU big core cluster
In-Reply-To: <20240925110044.3678055-1-fshao@chromium.org>
References: <20240925110044.3678055-1-fshao@chromium.org>
Message-ID: <20240925110044.3678055-4-fshao@chromium.org>

The MT8188 SoC features two CPU clusters: one with 6 little Cortex-A55
cores, and the other with 2 big Cortex-A78 cores.

Update the CPU topology to reflect the actual hardware configurations.

Signed-off-by: Fei Shao <fshao at chromium.org>
---

 arch/arm64/boot/dts/mediatek/mt8188.dtsi | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/arch/arm64/boot/dts/mediatek/mt8188.dtsi b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
index cd27966d2e3c..51bf08b2ff9b 100644
--- a/arch/arm64/boot/dts/mediatek/mt8188.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
@@ -195,12 +195,14 @@ core4 {
 				core5 {
 					cpu = <&cpu5>;
 				};
+			};
 
-				core6 {
+			cluster1 {
+				core0 {
 					cpu = <&cpu6>;
 				};
 
-				core7 {
+				core1 {
 					cpu = <&cpu7>;
 				};
 			};
-- 
2.46.0.792.g87dc391469-goog



From fshao at chromium.org  Wed Sep 25 03:57:48 2024
From: fshao at chromium.org (Fei Shao)
Date: Wed, 25 Sep 2024 18:57:48 +0800
Subject: [PATCH 4/6] arm64: dts: mediatek: mt8188: Add missing dma-ranges to soc node
In-Reply-To: <20240925110044.3678055-1-fshao@chromium.org>
References: <20240925110044.3678055-1-fshao@chromium.org>
Message-ID: <20240925110044.3678055-5-fshao@chromium.org>

Add the missing dma-ranges property to the soc node, similar to how it
was done for MT8195 and MT8192.

This allows the entire 16GB of iova range to be used and enables
multimedia processing usages, like vcodec and MIPI camera.

Signed-off-by: Fei Shao <fshao at chromium.org>
---

 arch/arm64/boot/dts/mediatek/mt8188.dtsi | 1 +
 1 file changed, 1 insertion(+)

diff --git a/arch/arm64/boot/dts/mediatek/mt8188.dtsi b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
index 51bf08b2ff9b..ff5c8e0597f9 100644
--- a/arch/arm64/boot/dts/mediatek/mt8188.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
@@ -880,6 +880,7 @@ soc {
 		#address-cells = <2>;
 		#size-cells = <2>;
 		compatible = "simple-bus";
+		dma-ranges = <0x0 0x0 0x0 0x0 0x4 0x0>;
 		ranges;
 
 		gic: interrupt-controller at c000000 {
-- 
2.46.0.792.g87dc391469-goog



From fshao at chromium.org  Wed Sep 25 03:57:49 2024
From: fshao at chromium.org (Fei Shao)
Date: Wed, 25 Sep 2024 18:57:49 +0800
Subject: [PATCH 5/6] arm64: dts: mediatek: mt8188: Move vdec1 power domain under vdec0
In-Reply-To: <20240925110044.3678055-1-fshao@chromium.org>
References: <20240925110044.3678055-1-fshao@chromium.org>
Message-ID: <20240925110044.3678055-6-fshao@chromium.org>

There are two hardware IP blocks in MT8188 video decoder pipeline:
vdec-lat and vdec-core, which are powered by vdec0 and vdec1 power
domains respectively.

We noticed that vdec-core needs to be powered down before vdec-lat
during suspend to prevent failures. It's unclear if it's an intended
hardware design or due to power isolation glitch. But in any case, we
observed a power-off sequence here, and it can be considered as an
indirect dependency implication between the vdec0 and vdec1 domains.

Given that, update vdec1 as a sub-domain of vdec0 to enforce the
sequence. Also, use more specific clock names for both power domains.

Signed-off-by: Fei Shao <fshao at chromium.org>
---

 arch/arm64/boot/dts/mediatek/mt8188.dtsi | 22 ++++++++++++----------
 1 file changed, 12 insertions(+), 10 deletions(-)

diff --git a/arch/arm64/boot/dts/mediatek/mt8188.dtsi b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
index ff5c8e0597f9..a6cd08ea74eb 100644
--- a/arch/arm64/boot/dts/mediatek/mt8188.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
@@ -1064,20 +1064,22 @@ power-domain at MT8188_POWER_DOMAIN_VPPSYS1 {
 							#power-domain-cells = <0>;
 						};
 
-						power-domain at MT8188_POWER_DOMAIN_VDEC1 {
-							reg = <MT8188_POWER_DOMAIN_VDEC1>;
-							clocks = <&vdecsys CLK_VDEC2_LARB1>;
-							clock-names = "ss-vdec";
-							mediatek,infracfg = <&infracfg_ao>;
-							#power-domain-cells = <0>;
-						};
-
 						power-domain at MT8188_POWER_DOMAIN_VDEC0 {
 							reg = <MT8188_POWER_DOMAIN_VDEC0>;
 							clocks = <&vdecsys_soc CLK_VDEC1_SOC_LARB1>;
-							clock-names = "ss-vdec";
+							clock-names = "ss-vdec1-soc-l1";
 							mediatek,infracfg = <&infracfg_ao>;
-							#power-domain-cells = <0>;
+							#address-cells = <1>;
+							#size-cells = <0>;
+							#power-domain-cells = <1>;
+
+							power-domain at MT8188_POWER_DOMAIN_VDEC1 {
+								reg = <MT8188_POWER_DOMAIN_VDEC1>;
+								clocks = <&vdecsys CLK_VDEC2_LARB1>;
+								clock-names = "ss-vdec2-l1";
+								mediatek,infracfg = <&infracfg_ao>;
+								#power-domain-cells = <0>;
+							};
 						};
 
 						cam_vcore: power-domain at MT8188_POWER_DOMAIN_CAM_VCORE {
-- 
2.46.0.792.g87dc391469-goog



From fshao at chromium.org  Wed Sep 25 03:57:50 2024
From: fshao at chromium.org (Fei Shao)
Date: Wed, 25 Sep 2024 18:57:50 +0800
Subject: [PATCH 6/6] arm64: dts: mediatek: mt8188: Update vppsys node names to syscon
In-Reply-To: <20240925110044.3678055-1-fshao@chromium.org>
References: <20240925110044.3678055-1-fshao@chromium.org>
Message-ID: <20240925110044.3678055-7-fshao@chromium.org>

The MediaTek mmsys is more than just a clock controller; it's a
system controller. In addition to clock controls, it provides display
pipeline routing controls and other miscellaneous control registers.

On the MT8188 and MT8195 SoCs, the mmsys blocks utilize the same mmsys
driver but have been aliased to "vdosys" and "vppsys", likely to better
represent their actual functionality.

Update the vppsys node names and compatibles in MT8188 DT to reflect
that and fix dtbs_check errors against mediatek/mt8188-evb.dtb.

Signed-off-by: Fei Shao <fshao at chromium.org>
---

 arch/arm64/boot/dts/mediatek/mt8188.dtsi | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/arch/arm64/boot/dts/mediatek/mt8188.dtsi b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
index a6cd08ea74eb..98ba3485a8bd 100644
--- a/arch/arm64/boot/dts/mediatek/mt8188.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
@@ -1783,8 +1783,8 @@ mfgcfg: clock-controller at 13fbf000 {
 			#clock-cells = <1>;
 		};
 
-		vppsys0: clock-controller at 14000000 {
-			compatible = "mediatek,mt8188-vppsys0";
+		vppsys0: syscon at 14000000 {
+			compatible = "mediatek,mt8188-vppsys0", "syscon";
 			reg = <0 0x14000000 0 0x1000>;
 			#clock-cells = <1>;
 		};
@@ -1801,8 +1801,8 @@ wpesys_vpp0: clock-controller at 14e02000 {
 			#clock-cells = <1>;
 		};
 
-		vppsys1: clock-controller at 14f00000 {
-			compatible = "mediatek,mt8188-vppsys1";
+		vppsys1: syscon at 14f00000 {
+			compatible = "mediatek,mt8188-vppsys1", "syscon";
 			reg = <0 0x14f00000 0 0x1000>;
 			#clock-cells = <1>;
 		};
-- 
2.46.0.792.g87dc391469-goog



From fshao at chromium.org  Wed Sep 25 04:06:08 2024
From: fshao at chromium.org (Fei Shao)
Date: Wed, 25 Sep 2024 19:06:08 +0800
Subject: [PATCH 06/13] arm64: dts: mediatek: mt8188: Update VPPSYS node
 name and compatible
In-Reply-To: <a9a7038c-4478-4366-831a-81dca8fa5afc@kernel.org>
References: <20240909111535.528624-1-fshao@chromium.org> <20240909111535.528624-7-fshao@chromium.org>
 <11bc2522-bc10-4dcf-8142-708b57d181cf@kernel.org> <CAC=S1nhiJ=7yAucJsaYKUUBrwrxOVBMB2CF=bFwyLa2o-5RmWw@mail.gmail.com>
 <64cc35c8-30df-4882-a933-f42119270f48@kernel.org> <CAC=S1ni+pJJZhbjvVqhba5u1JqGv=dZTv8+KH4xburea2AG4Qg@mail.gmail.com>
 <a9a7038c-4478-4366-831a-81dca8fa5afc@kernel.org>
Message-ID: <CAC=S1njoAwU+7aveWziJBD760k2LGD=D89Wwb9FmdaPp-sA5nw@mail.gmail.com>

On Mon, Sep 16, 2024 at 6:02?PM Krzysztof Kozlowski <krzk at kernel.org> wrote:
>
> On 10/09/2024 13:06, Fei Shao wrote:
> > On Tue, Sep 10, 2024 at 3:19?PM Krzysztof Kozlowski <krzk at kernel.org> wrote:
> >>
> >> On 10/09/2024 07:12, Fei Shao wrote:
> >>> On Mon, Sep 9, 2024 at 7:41?PM Krzysztof Kozlowski <krzk at kernel.org> wrote:
> >>>>
> >>>> On 09/09/2024 13:14, Fei Shao wrote:
> >>>>> Use and add "syscon" in VPPSYS node names and compatible to fix errors
> >>>>> from `make CHECK_DTBS=y mediatek/mt8188-evb.dtb`.
> >>>>>
> >>>>> Signed-off-by: Fei Shao <fshao at chromium.org>
> >>>>> ---
> >>>>>
> >>>>>  arch/arm64/boot/dts/mediatek/mt8188.dtsi | 8 ++++----
> >>>>>  1 file changed, 4 insertions(+), 4 deletions(-)
> >>>>>
> >>>>> diff --git a/arch/arm64/boot/dts/mediatek/mt8188.dtsi b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
> >>>>> index 2900d78b7ceb..14e51a11f688 100644
> >>>>> --- a/arch/arm64/boot/dts/mediatek/mt8188.dtsi
> >>>>> +++ b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
> >>>>> @@ -1799,8 +1799,8 @@ mfgcfg: clock-controller at 13fbf000 {
> >>>>>                       #clock-cells = <1>;
> >>>>>               };
> >>>>>
> >>>>> -             vppsys0: clock-controller at 14000000 {
> >>>>> -                     compatible = "mediatek,mt8188-vppsys0";
> >>>>> +             vppsys0: syscon at 14000000 {
> >>>>> +                     compatible = "mediatek,mt8188-vppsys0", "syscon";
> >>>>
> >>>> If this was working before, it looks like this is not a syscon and
> >>>> bindings need to be fixed.
> >>>
> >>> I guess it's because the binding was later updated in commit
> >>> 26bcd8a53098 ("dt-bindings: arm: mediatek: mmsys: Add VPPSYS
> >>> compatible for MT8188"), and the corresponding DT update was unnoticed
> >>> at the time.
> >>> If that makes sense then this should be a valid fix.
> >>
> >> Not necessarily. Why not fixing bindings? Prove that bindings are
> >> correct, not DTS, first.
> >
> > MediaTek's mmsys doesn't merely control clocks, it also provides
> > display pipeline routing control and other misc control registers, so
> > it's appropriate to categorize it as a system controller over a clock
> > controller.
> > As for vdosys and vppsys, they are likely variants or aliases of mmsys
> > introduced in their newer SoCs.
>
> Nothing like that was in the commit msg...

Just for a record, I've revised the commit message in the newer series:
https://lore.kernel.org/all/20240925110044.3678055-7-fshao at chromium.org/

Thanks,
Fei


From sashal at kernel.org  Wed Sep 25 04:24:05 2024
From: sashal at kernel.org (Sasha Levin)
Date: Wed, 25 Sep 2024 07:24:05 -0400
Subject: [PATCH AUTOSEL 6.11 024/244] wifi: mt76: mt7915: disable tx worker during tx BA session enable/disable
In-Reply-To: <20240925113641.1297102-1-sashal@kernel.org>
References: <20240925113641.1297102-1-sashal@kernel.org>
Message-ID: <20240925113641.1297102-24-sashal@kernel.org>

From: Felix Fietkau <nbd at nbd.name>

[ Upstream commit 256cbd26fbafb30ba3314339106e5c594e9bd5f9 ]

Avoids firmware race condition.

Link: https://patch.msgid.link/20240827093011.18621-7-nbd at nbd.name
Signed-off-by: Felix Fietkau <nbd at nbd.name>
Signed-off-by: Sasha Levin <sashal at kernel.org>
---
 drivers/net/wireless/mediatek/mt76/mt7915/mcu.c | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c
index 2185cd24e2e1c..2f4755820b3cd 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c
@@ -690,13 +690,17 @@ int mt7915_mcu_add_tx_ba(struct mt7915_dev *dev,
 {
 	struct mt7915_sta *msta = (struct mt7915_sta *)params->sta->drv_priv;
 	struct mt7915_vif *mvif = msta->vif;
+	int ret;
 
+	mt76_worker_disable(&dev->mt76.tx_worker);
 	if (enable && !params->amsdu)
 		msta->wcid.amsdu = false;
+	ret = mt76_connac_mcu_sta_ba(&dev->mt76, &mvif->mt76, params,
+				     MCU_EXT_CMD(STA_REC_UPDATE),
+				     enable, true);
+	mt76_worker_enable(&dev->mt76.tx_worker);
 
-	return mt76_connac_mcu_sta_ba(&dev->mt76, &mvif->mt76, params,
-				      MCU_EXT_CMD(STA_REC_UPDATE),
-				      enable, true);
+	return ret;
 }
 
 int mt7915_mcu_add_rx_ba(struct mt7915_dev *dev,
-- 
2.43.0



From angelogioacchino.delregno at collabora.com  Wed Sep 25 04:39:49 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Wed, 25 Sep 2024 13:39:49 +0200
Subject: [PATCH] mmc: mtk-sd: Implement Host Software Queue for eMMC and SD Card
Message-ID: <20240925113949.149655-1-angelogioacchino.delregno@collabora.com>

Add support for Host Software Queue (HSQ) and enable it when the
controller instance does not have Command Queue Engine HW support.

It was chosen to enable HSQ only for eMMC and SD/MicroSD cards
and not for SDIO as performance improvements are seen only for
the former.

Performance was measured with a SanDisk Extreme Ultra A2 MicroSD
card in a MediaTek MT8195T Acer Chromebook Spin 513 (CP513-2H),
by running FIO (bs=4k) on an ArchLinux userspace.

.... Summarizing ....
Random read:     +24.28% IOPS, +24.29% BW
Sequential read: +3.14%  IOPS, +3.49%  BW
Random RW (avg): +50.53% IOPS, +50.68% BW

Below, more data from the benchmarks.

Before:
 - Random read: IOPS=1643, BW=6574KiB/s
   bw (  KiB/s): min= 4578, max= 7440, per=99.95%, avg=6571.55, stdev=74.16, samples=953
   iops        : min= 1144, max= 1860, avg=1642.14, stdev=18.54, samples=953
   lat (msec)  : 100=0.01%, 250=0.12%, 500=0.38%, 750=97.89%, 1000=1.44%, 2000=0.16%
 - Sequential read: IOPS=19.1k, BW=74.4MiB/s
   bw (  KiB/s): min=12288, max=118483, per=100.00%, avg=76293.38, stdev=1971.42, samples=956
   iops        : min= 3072, max=29620, avg=19072.14, stdev=492.87, samples=956
   lat (msec)  : 4=0.01%, 10=0.01%, 20=0.21%, 50=23.95%, 100=75.67%, 250=0.05%, 500=0.03%, 750=0.08%
 - Random R/W: read: IOPS=282, BW=1129KiB/s (1156kB/s)  write: IOPS=284, BW=1136KiB/s
   read bw (  KiB/s): min=   31, max= 3496, per=100.00%, avg=1703.67, stdev=155.42, samples=630
   read iops        : min=    7, max=  873, avg=425.22, stdev=38.85, samples=630
   wri  bw (  KiB/s): min=   31, max= 3443, per=100.00%, avg=1674.27, stdev=164.23, samples=644
   wri  iops        : min=    7, max=  860, avg=417.87, stdev=41.03, samples=644
   lat (msec)   : 250=0.13%, 500=0.44%, 750=0.84%, 1000=22.29%, 2000=74.01%, >=2000=2.30%

After:
 - Random read: IOPS=2042, BW=8171KiB/s
   bw (  KiB/s): min= 4907, max= 9072, per=99.94%, avg=8166.80, stdev=93.77, samples=954
   iops        : min= 1226, max= 2268, avg=2040.78, stdev=23.41, samples=954
   lat (msec)   : 100=0.03%, 250=0.13%, 500=52.88%, 750=46.64%, 1000=0.32%
 - Sequential read: IOPS=19.7k, BW=77.0MiB/s
   bw (  KiB/s): min=67980, max=94248, per=100.00%, avg=78894.27, stdev=1475.07, samples=956
   iops        : min=16994, max=23562, avg=19722.45, stdev=368.76, samples=956
   lat (msec)   : 4=0.01%, 10=0.01%, 20=0.05%, 50=28.78%, 100=71.14%, 250=0.01%, 500=0.02%
 - Random R/W: read: IOPS=424, BW=1699KiB/s  write: IOPS=428, BW=1714KiB/s
   read bw (  KiB/s): min=  228, max= 2856, per=100.00%, avg=1796.60, stdev=112.59, samples=901
   read iops        : min=   54, max=  712, avg=447.81, stdev=28.21, samples=901
   wri  bw (  KiB/s): min=   28, max= 2904, per=100.00%, avg=1780.11, stdev=128.27, samples=916
   wri  iops        : min=    4, max=  724, avg=443.69, stdev=32.14, samples=916

Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
---
 drivers/mmc/host/mtk-sd.c | 49 +++++++++++++++++++++++++++++++++++++--
 1 file changed, 47 insertions(+), 2 deletions(-)

diff --git a/drivers/mmc/host/mtk-sd.c b/drivers/mmc/host/mtk-sd.c
index 5165a33bf74b..57ae5840696f 100644
--- a/drivers/mmc/host/mtk-sd.c
+++ b/drivers/mmc/host/mtk-sd.c
@@ -33,6 +33,7 @@
 #include <linux/mmc/slot-gpio.h>
 
 #include "cqhci.h"
+#include "mmc_hsq.h"
 
 #define MAX_BD_NUM          1024
 #define MSDC_NR_CLOCKS      3
@@ -473,6 +474,7 @@ struct msdc_host {
 	bool hs400_tuning;	/* hs400 mode online tuning */
 	bool internal_cd;	/* Use internal card-detect logic */
 	bool cqhci;		/* support eMMC hw cmdq */
+	bool hsq_en;		/* Host Software Queue is enabled */
 	struct msdc_save_para save_para; /* used when gate HCLK */
 	struct msdc_tune_para def_tune_para; /* default tune setting */
 	struct msdc_tune_para saved_tune_para; /* tune result of CMD21/CMD19 */
@@ -1170,7 +1172,9 @@ static void msdc_track_cmd_data(struct msdc_host *host, struct mmc_command *cmd)
 
 static void msdc_request_done(struct msdc_host *host, struct mmc_request *mrq)
 {
+	struct mmc_host *mmc = mmc_from_priv(host);
 	unsigned long flags;
+	bool hsq_req_done;
 
 	/*
 	 * No need check the return value of cancel_delayed_work, as only ONE
@@ -1178,6 +1182,27 @@ static void msdc_request_done(struct msdc_host *host, struct mmc_request *mrq)
 	 */
 	cancel_delayed_work(&host->req_timeout);
 
+	/*
+	 * If the request was handled from Host Software Queue, there's almost
+	 * nothing to do here, and we also don't need to reset mrq as any race
+	 * condition would not have any room to happen, since HSQ stores the
+	 * "scheduled" mrqs in an internal array of mrq slots anyway.
+	 * However, if the controller experienced an error, we still want to
+	 * reset it as soon as possible.
+	 *
+	 * Note that non-HSQ requests will still be happening at times, even
+	 * though it is enabled, and that's what is going to reset host->mrq.
+	 * Also, msdc_unprepare_data() is going to be called by HSQ when needed
+	 * as HSQ request finalization will eventually call the .post_req()
+	 * callback of this driver which, in turn, unprepares the data.
+	 */
+	hsq_req_done = host->hsq_en ? mmc_hsq_finalize_request(mmc, mrq) : false;
+	if (hsq_req_done) {
+		if (host->error)
+			msdc_reset_hw(host);
+		return;
+	}
+
 	spin_lock_irqsave(&host->lock, flags);
 	host->mrq = NULL;
 	spin_unlock_irqrestore(&host->lock, flags);
@@ -1187,7 +1212,7 @@ static void msdc_request_done(struct msdc_host *host, struct mmc_request *mrq)
 		msdc_unprepare_data(host, mrq->data);
 	if (host->error)
 		msdc_reset_hw(host);
-	mmc_request_done(mmc_from_priv(host), mrq);
+	mmc_request_done(mmc, mrq);
 	if (host->dev_comp->recheck_sdio_irq)
 		msdc_recheck_sdio_irq(host);
 }
@@ -1347,7 +1372,7 @@ static void msdc_ops_request(struct mmc_host *mmc, struct mmc_request *mrq)
 	struct msdc_host *host = mmc_priv(mmc);
 
 	host->error = 0;
-	WARN_ON(host->mrq);
+	WARN_ON(!host->hsq_en && host->mrq);
 	host->mrq = mrq;
 
 	if (mrq->data)
@@ -2916,6 +2941,19 @@ static int msdc_drv_probe(struct platform_device *pdev)
 		mmc->max_seg_size = 64 * 1024;
 		/* Reduce CIT to 0x40 that corresponds to 2.35us */
 		msdc_cqe_cit_cal(host, 2350);
+	} else if (mmc->caps2 & MMC_CAP2_NO_SDIO) {
+		/* Use HSQ on eMMC/SD (but not on SDIO) if HW CQE not supported */
+		struct mmc_hsq *hsq = devm_kzalloc(&pdev->dev, sizeof(*hsq), GFP_KERNEL);
+		if (!hsq) {
+			ret = -ENOMEM;
+			goto release;
+		}
+
+		ret = mmc_hsq_init(hsq, mmc);
+		if (ret)
+			goto release;
+
+		host->hsq_en = true;
 	}
 
 	ret = devm_request_irq(&pdev->dev, host->irq, msdc_irq,
@@ -3043,6 +3081,9 @@ static int __maybe_unused msdc_runtime_suspend(struct device *dev)
 	struct mmc_host *mmc = dev_get_drvdata(dev);
 	struct msdc_host *host = mmc_priv(mmc);
 
+	if (host->hsq_en)
+		mmc_hsq_suspend(mmc);
+
 	msdc_save_reg(host);
 
 	if (sdio_irq_claimed(mmc)) {
@@ -3073,6 +3114,10 @@ static int __maybe_unused msdc_runtime_resume(struct device *dev)
 		pinctrl_select_state(host->pinctrl, host->pins_uhs);
 		enable_irq(host->irq);
 	}
+
+	if (host->hsq_en)
+		mmc_hsq_resume(mmc);
+
 	return 0;
 }
 
-- 
2.46.1



From sashal at kernel.org  Wed Sep 25 04:25:03 2024
From: sashal at kernel.org (Sasha Levin)
Date: Wed, 25 Sep 2024 07:25:03 -0400
Subject: [PATCH AUTOSEL 6.11 082/244] wifi: mt76: mt7915: add dummy HW offload of IEEE 802.11 fragmentation
In-Reply-To: <20240925113641.1297102-1-sashal@kernel.org>
References: <20240925113641.1297102-1-sashal@kernel.org>
Message-ID: <20240925113641.1297102-82-sashal@kernel.org>

From: Benjamin Lin <benjamin-jw.lin at mediatek.com>

[ Upstream commit f2cc859149240d910fdc6405717673e0b84bfda8 ]

Currently, CONNAC2 series do not support encryption for fragmented Tx frames.
Therefore, add dummy function mt7915_set_frag_threshold() to prevent SW
IEEE 802.11 fragmentation.

Signed-off-by: Benjamin Lin <benjamin-jw.lin at mediatek.com>
Link: https://patch.msgid.link/20240827093011.18621-16-nbd at nbd.name
Signed-off-by: Felix Fietkau <nbd at nbd.name>
Signed-off-by: Sasha Levin <sashal at kernel.org>
---
 drivers/net/wireless/mediatek/mt76/mt7915/init.c | 1 +
 drivers/net/wireless/mediatek/mt76/mt7915/main.c | 7 +++++++
 2 files changed, 8 insertions(+)

diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/init.c b/drivers/net/wireless/mediatek/mt76/mt7915/init.c
index a978f434dc5e6..511e0d04eb955 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/init.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/init.c
@@ -398,6 +398,7 @@ mt7915_init_wiphy(struct mt7915_phy *phy)
 	ieee80211_hw_set(hw, SUPPORTS_RX_DECAP_OFFLOAD);
 	ieee80211_hw_set(hw, SUPPORTS_MULTI_BSSID);
 	ieee80211_hw_set(hw, WANT_MONITOR_VIF);
+	ieee80211_hw_set(hw, SUPPORTS_TX_FRAG);
 
 	hw->max_tx_fragments = 4;
 
diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/main.c b/drivers/net/wireless/mediatek/mt76/mt7915/main.c
index 049223df9beb1..0da1807ad8f7d 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/main.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/main.c
@@ -1578,6 +1578,12 @@ mt7915_twt_teardown_request(struct ieee80211_hw *hw,
 	mutex_unlock(&dev->mt76.mutex);
 }
 
+static int
+mt7915_set_frag_threshold(struct ieee80211_hw *hw, u32 val)
+{
+	return 0;
+}
+
 static int
 mt7915_set_radar_background(struct ieee80211_hw *hw,
 			    struct cfg80211_chan_def *chandef)
@@ -1708,6 +1714,7 @@ const struct ieee80211_ops mt7915_ops = {
 	.sta_set_decap_offload = mt7915_sta_set_decap_offload,
 	.add_twt_setup = mt7915_mac_add_twt_setup,
 	.twt_teardown_request = mt7915_twt_teardown_request,
+	.set_frag_threshold = mt7915_set_frag_threshold,
 	CFG80211_TESTMODE_CMD(mt76_testmode_cmd)
 	CFG80211_TESTMODE_DUMP(mt76_testmode_dump)
 #ifdef CONFIG_MAC80211_DEBUGFS
-- 
2.43.0



From sashal at kernel.org  Wed Sep 25 04:25:04 2024
From: sashal at kernel.org (Sasha Levin)
Date: Wed, 25 Sep 2024 07:25:04 -0400
Subject: [PATCH AUTOSEL 6.11 083/244] wifi: mt76: mt7915: hold dev->mt76.mutex while disabling tx worker
In-Reply-To: <20240925113641.1297102-1-sashal@kernel.org>
References: <20240925113641.1297102-1-sashal@kernel.org>
Message-ID: <20240925113641.1297102-83-sashal@kernel.org>

From: Felix Fietkau <nbd at nbd.name>

[ Upstream commit 8f7152f10cb434f954aeff85ca1be9cd4d01912b ]

Prevent racing against other functions disabling the same worker

Link: https://patch.msgid.link/20240827093011.18621-17-nbd at nbd.name
Signed-off-by: Felix Fietkau <nbd at nbd.name>
Signed-off-by: Sasha Levin <sashal at kernel.org>
---
 drivers/net/wireless/mediatek/mt76/mt7915/mac.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mac.c b/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
index 8008ce3fa6c7e..387d47e9fcd38 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
@@ -1537,12 +1537,14 @@ void mt7915_mac_reset_work(struct work_struct *work)
 		set_bit(MT76_RESET, &phy2->mt76->state);
 		cancel_delayed_work_sync(&phy2->mt76->mac_work);
 	}
+
+	mutex_lock(&dev->mt76.mutex);
+
 	mt76_worker_disable(&dev->mt76.tx_worker);
 	mt76_for_each_q_rx(&dev->mt76, i)
 		napi_disable(&dev->mt76.napi[i]);
 	napi_disable(&dev->mt76.tx_napi);
 
-	mutex_lock(&dev->mt76.mutex);
 
 	if (mtk_wed_device_active(&dev->mt76.mmio.wed))
 		mtk_wed_device_stop(&dev->mt76.mmio.wed);
-- 
2.43.0



From dmitry.baryshkov at linaro.org  Wed Sep 25 04:41:07 2024
From: dmitry.baryshkov at linaro.org (Dmitry Baryshkov)
Date: Wed, 25 Sep 2024 14:41:07 +0300
Subject: [RFC PATCH 0/4] Linaro restricted heap
In-Reply-To: <20240925071504.GA3519798@rayden>
References: <20240830070351.2855919-1-jens.wiklander@linaro.org>
 <dhxvyshwi4qmcmwceokhqey2ww4azjcs6qrpnkgivdj7tv5cke@r36srvvbof6q>
 <20240925071504.GA3519798@rayden>
Message-ID: <bktt4yanmfn4gjljy2wxmigj6mncpga237oxyf4g4h2vxu2a3q@asnsn7smi4u2>

On Wed, Sep 25, 2024 at 09:15:04AM GMT, Jens Wiklander wrote:
> On Mon, Sep 23, 2024 at 09:33:29AM +0300, Dmitry Baryshkov wrote:
> > Hi,
> > 
> > On Fri, Aug 30, 2024 at 09:03:47AM GMT, Jens Wiklander wrote:
> > > Hi,
> > > 
> > > This patch set is based on top of Yong Wu's restricted heap patch set [1].
> > > It's also a continuation on Olivier's Add dma-buf secure-heap patch set [2].
> > > 
> > > The Linaro restricted heap uses genalloc in the kernel to manage the heap
> > > carvout. This is a difference from the Mediatek restricted heap which
> > > relies on the secure world to manage the carveout.
> > > 
> > > I've tried to adress the comments on [2], but [1] introduces changes so I'm
> > > afraid I've had to skip some comments.
> > 
> > I know I have raised the same question during LPC (in connection to
> > Qualcomm's dma-heap implementation). Is there any reason why we are
> > using generic heaps instead of allocating the dma-bufs on the device
> > side?
> > 
> > In your case you already have TEE device, you can use it to allocate and
> > export dma-bufs, which then get imported by the V4L and DRM drivers.
> > 
> > I have a feeling (I might be completely wrong here) that by using
> > generic dma-buf heaps we can easily end up in a situation when the
> > userspace depends heavily on the actual platform being used (to map the
> > platform to heap names). I think we should instead depend on the
> > existing devices (e.g. if there is a TEE device, use an IOCTL to
> > allocate secured DMA BUF from it, otherwise check for QTEE device,
> > otherwise check for some other vendor device).
> 
> That makes sense, it's similar to what we do with TEE_IOC_SHM_ALLOC
> where we allocate from a carveout reserverd for shared memory with the
> secure world. It was even based on dma-buf until commit dfd0743f1d9e
> ("tee: handle lookup of shm with reference count 0").
> 
> We should use a new TEE_IOC_*_ALLOC for these new dma-bufs to avoid
> confusion and to have more freedom when designing the interface.
> 
> > 
> > The mental experiment to check if the API is correct is really simple:
> > Can you use exactly the same rootfs on several devices without
> > any additional tuning (e.g. your QEMU, HiKey, a Mediatek board, Qualcomm
> > laptop, etc)?
> 
> No, I don't think so.

Then the API needs to be modified.

Or the userspace needs to be modified in the way similar to Vulkan /
OpenCL / glvnd / VA / VDPU: platform-specific backends, coexisting on a
single rootfs.

It is more or less fine to have platform-specific rootfs when we are
talking about the embedded, resource-limited devices. But for the
end-user devices we must be able to install a generic distro with no
device-specific packages being selected.

> 
> > 
> > > 
> > > This can be tested on QEMU with the following steps:
> > > repo init -u https://github.com/jenswi-linaro/manifest.git -m qemu_v8.xml \
> > >         -b prototype/sdp-v1
> > > repo sync -j8
> > > cd build
> > > make toolchains -j4
> > > make all -j$(nproc)
> > > make run-only
> > > # login and at the prompt:
> > > xtest --sdp-basic
> > > 
> > > https://optee.readthedocs.io/en/latest/building/prerequisites.html
> > > list dependencies needed to build the above.
> > > 
> > > The tests are pretty basic, mostly checking that a Trusted Application in
> > > the secure world can access and manipulate the memory.
> > 
> > - Can we test that the system doesn't crash badly if user provides
> >   non-secured memory to the users which expect a secure buffer?
> > 
> > - At the same time corresponding entities shouldn't decode data to the
> >   buffers accessible to the rest of the sytem.
> 
> I'll a few tests along that.
> 
> Thanks,
> Jens
> 
> > 
> > > 
> > > Cheers,
> > > Jens
> > > 
> > > [1] https://lore.kernel.org/dri-devel/20240515112308.10171-1-yong.wu at mediatek.com/
> > > [2] https://lore.kernel.org/lkml/20220805135330.970-1-olivier.masse at nxp.com/
> > > 
> > > Changes since Olivier's post [2]:
> > > * Based on Yong Wu's post [1] where much of dma-buf handling is done in
> > >   the generic restricted heap
> > > * Simplifications and cleanup
> > > * New commit message for "dma-buf: heaps: add Linaro restricted dmabuf heap
> > >   support"
> > > * Replaced the word "secure" with "restricted" where applicable
> > > 
> > > Etienne Carriere (1):
> > >   tee: new ioctl to a register tee_shm from a dmabuf file descriptor
> > > 
> > > Jens Wiklander (2):
> > >   dma-buf: heaps: restricted_heap: add no_map attribute
> > >   dma-buf: heaps: add Linaro restricted dmabuf heap support
> > > 
> > > Olivier Masse (1):
> > >   dt-bindings: reserved-memory: add linaro,restricted-heap
> > > 
> > >  .../linaro,restricted-heap.yaml               |  56 ++++++
> > >  drivers/dma-buf/heaps/Kconfig                 |  10 ++
> > >  drivers/dma-buf/heaps/Makefile                |   1 +
> > >  drivers/dma-buf/heaps/restricted_heap.c       |  17 +-
> > >  drivers/dma-buf/heaps/restricted_heap.h       |   2 +
> > >  .../dma-buf/heaps/restricted_heap_linaro.c    | 165 ++++++++++++++++++
> > >  drivers/tee/tee_core.c                        |  38 ++++
> > >  drivers/tee/tee_shm.c                         | 104 ++++++++++-
> > >  include/linux/tee_drv.h                       |  11 ++
> > >  include/uapi/linux/tee.h                      |  29 +++
> > >  10 files changed, 426 insertions(+), 7 deletions(-)
> > >  create mode 100644 Documentation/devicetree/bindings/reserved-memory/linaro,restricted-heap.yaml
> > >  create mode 100644 drivers/dma-buf/heaps/restricted_heap_linaro.c
> > > 
> > > -- 
> > > 2.34.1
> > > 
> > 
> > -- 
> > With best wishes
> > Dmitry

-- 
With best wishes
Dmitry


From sashal at kernel.org  Wed Sep 25 04:50:40 2024
From: sashal at kernel.org (Sasha Levin)
Date: Wed, 25 Sep 2024 07:50:40 -0400
Subject: [PATCH AUTOSEL 6.10 021/197] wifi: mt76: mt7915: disable tx worker during tx BA session enable/disable
In-Reply-To: <20240925115823.1303019-1-sashal@kernel.org>
References: <20240925115823.1303019-1-sashal@kernel.org>
Message-ID: <20240925115823.1303019-21-sashal@kernel.org>

From: Felix Fietkau <nbd at nbd.name>

[ Upstream commit 256cbd26fbafb30ba3314339106e5c594e9bd5f9 ]

Avoids firmware race condition.

Link: https://patch.msgid.link/20240827093011.18621-7-nbd at nbd.name
Signed-off-by: Felix Fietkau <nbd at nbd.name>
Signed-off-by: Sasha Levin <sashal at kernel.org>
---
 drivers/net/wireless/mediatek/mt76/mt7915/mcu.c | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c
index 9599adf104b16..758249b20c222 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c
@@ -690,13 +690,17 @@ int mt7915_mcu_add_tx_ba(struct mt7915_dev *dev,
 {
 	struct mt7915_sta *msta = (struct mt7915_sta *)params->sta->drv_priv;
 	struct mt7915_vif *mvif = msta->vif;
+	int ret;
 
+	mt76_worker_disable(&dev->mt76.tx_worker);
 	if (enable && !params->amsdu)
 		msta->wcid.amsdu = false;
+	ret = mt76_connac_mcu_sta_ba(&dev->mt76, &mvif->mt76, params,
+				     MCU_EXT_CMD(STA_REC_UPDATE),
+				     enable, true);
+	mt76_worker_enable(&dev->mt76.tx_worker);
 
-	return mt76_connac_mcu_sta_ba(&dev->mt76, &mvif->mt76, params,
-				      MCU_EXT_CMD(STA_REC_UPDATE),
-				      enable, true);
+	return ret;
 }
 
 int mt7915_mcu_add_rx_ba(struct mt7915_dev *dev,
-- 
2.43.0



From sashal at kernel.org  Wed Sep 25 04:51:26 2024
From: sashal at kernel.org (Sasha Levin)
Date: Wed, 25 Sep 2024 07:51:26 -0400
Subject: [PATCH AUTOSEL 6.10 067/197] wifi: mt76: mt7915: add dummy HW offload of IEEE 802.11 fragmentation
In-Reply-To: <20240925115823.1303019-1-sashal@kernel.org>
References: <20240925115823.1303019-1-sashal@kernel.org>
Message-ID: <20240925115823.1303019-67-sashal@kernel.org>

From: Benjamin Lin <benjamin-jw.lin at mediatek.com>

[ Upstream commit f2cc859149240d910fdc6405717673e0b84bfda8 ]

Currently, CONNAC2 series do not support encryption for fragmented Tx frames.
Therefore, add dummy function mt7915_set_frag_threshold() to prevent SW
IEEE 802.11 fragmentation.

Signed-off-by: Benjamin Lin <benjamin-jw.lin at mediatek.com>
Link: https://patch.msgid.link/20240827093011.18621-16-nbd at nbd.name
Signed-off-by: Felix Fietkau <nbd at nbd.name>
Signed-off-by: Sasha Levin <sashal at kernel.org>
---
 drivers/net/wireless/mediatek/mt76/mt7915/init.c | 1 +
 drivers/net/wireless/mediatek/mt76/mt7915/main.c | 7 +++++++
 2 files changed, 8 insertions(+)

diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/init.c b/drivers/net/wireless/mediatek/mt76/mt7915/init.c
index a978f434dc5e6..511e0d04eb955 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/init.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/init.c
@@ -398,6 +398,7 @@ mt7915_init_wiphy(struct mt7915_phy *phy)
 	ieee80211_hw_set(hw, SUPPORTS_RX_DECAP_OFFLOAD);
 	ieee80211_hw_set(hw, SUPPORTS_MULTI_BSSID);
 	ieee80211_hw_set(hw, WANT_MONITOR_VIF);
+	ieee80211_hw_set(hw, SUPPORTS_TX_FRAG);
 
 	hw->max_tx_fragments = 4;
 
diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/main.c b/drivers/net/wireless/mediatek/mt76/mt7915/main.c
index 2624edbb59a1a..75f8854078ae6 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/main.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/main.c
@@ -1578,6 +1578,12 @@ mt7915_twt_teardown_request(struct ieee80211_hw *hw,
 	mutex_unlock(&dev->mt76.mutex);
 }
 
+static int
+mt7915_set_frag_threshold(struct ieee80211_hw *hw, u32 val)
+{
+	return 0;
+}
+
 static int
 mt7915_set_radar_background(struct ieee80211_hw *hw,
 			    struct cfg80211_chan_def *chandef)
@@ -1708,6 +1714,7 @@ const struct ieee80211_ops mt7915_ops = {
 	.sta_set_decap_offload = mt7915_sta_set_decap_offload,
 	.add_twt_setup = mt7915_mac_add_twt_setup,
 	.twt_teardown_request = mt7915_twt_teardown_request,
+	.set_frag_threshold = mt7915_set_frag_threshold,
 	CFG80211_TESTMODE_CMD(mt76_testmode_cmd)
 	CFG80211_TESTMODE_DUMP(mt76_testmode_dump)
 #ifdef CONFIG_MAC80211_DEBUGFS
-- 
2.43.0



From sashal at kernel.org  Wed Sep 25 04:51:27 2024
From: sashal at kernel.org (Sasha Levin)
Date: Wed, 25 Sep 2024 07:51:27 -0400
Subject: [PATCH AUTOSEL 6.10 068/197] wifi: mt76: mt7915: hold dev->mt76.mutex while disabling tx worker
In-Reply-To: <20240925115823.1303019-1-sashal@kernel.org>
References: <20240925115823.1303019-1-sashal@kernel.org>
Message-ID: <20240925115823.1303019-68-sashal@kernel.org>

From: Felix Fietkau <nbd at nbd.name>

[ Upstream commit 8f7152f10cb434f954aeff85ca1be9cd4d01912b ]

Prevent racing against other functions disabling the same worker

Link: https://patch.msgid.link/20240827093011.18621-17-nbd at nbd.name
Signed-off-by: Felix Fietkau <nbd at nbd.name>
Signed-off-by: Sasha Levin <sashal at kernel.org>
---
 drivers/net/wireless/mediatek/mt76/mt7915/mac.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mac.c b/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
index 8008ce3fa6c7e..387d47e9fcd38 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
@@ -1537,12 +1537,14 @@ void mt7915_mac_reset_work(struct work_struct *work)
 		set_bit(MT76_RESET, &phy2->mt76->state);
 		cancel_delayed_work_sync(&phy2->mt76->mac_work);
 	}
+
+	mutex_lock(&dev->mt76.mutex);
+
 	mt76_worker_disable(&dev->mt76.tx_worker);
 	mt76_for_each_q_rx(&dev->mt76, i)
 		napi_disable(&dev->mt76.napi[i]);
 	napi_disable(&dev->mt76.tx_napi);
 
-	mutex_lock(&dev->mt76.mutex);
 
 	if (mtk_wed_device_active(&dev->mt76.mmio.wed))
 		mtk_wed_device_stop(&dev->mt76.mmio.wed);
-- 
2.43.0



From sashal at kernel.org  Wed Sep 25 05:07:19 2024
From: sashal at kernel.org (Sasha Levin)
Date: Wed, 25 Sep 2024 08:07:19 -0400
Subject: [PATCH AUTOSEL 6.6 019/139] wifi: mt76: mt7915: disable tx worker during tx BA session enable/disable
In-Reply-To: <20240925121137.1307574-1-sashal@kernel.org>
References: <20240925121137.1307574-1-sashal@kernel.org>
Message-ID: <20240925121137.1307574-19-sashal@kernel.org>

From: Felix Fietkau <nbd at nbd.name>

[ Upstream commit 256cbd26fbafb30ba3314339106e5c594e9bd5f9 ]

Avoids firmware race condition.

Link: https://patch.msgid.link/20240827093011.18621-7-nbd at nbd.name
Signed-off-by: Felix Fietkau <nbd at nbd.name>
Signed-off-by: Sasha Levin <sashal at kernel.org>
---
 drivers/net/wireless/mediatek/mt76/mt7915/mcu.c | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c
index 272e55ef8e2d2..5fba103bfd65d 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c
@@ -688,13 +688,17 @@ int mt7915_mcu_add_tx_ba(struct mt7915_dev *dev,
 {
 	struct mt7915_sta *msta = (struct mt7915_sta *)params->sta->drv_priv;
 	struct mt7915_vif *mvif = msta->vif;
+	int ret;
 
+	mt76_worker_disable(&dev->mt76.tx_worker);
 	if (enable && !params->amsdu)
 		msta->wcid.amsdu = false;
+	ret = mt76_connac_mcu_sta_ba(&dev->mt76, &mvif->mt76, params,
+				     MCU_EXT_CMD(STA_REC_UPDATE),
+				     enable, true);
+	mt76_worker_enable(&dev->mt76.tx_worker);
 
-	return mt76_connac_mcu_sta_ba(&dev->mt76, &mvif->mt76, params,
-				      MCU_EXT_CMD(STA_REC_UPDATE),
-				      enable, true);
+	return ret;
 }
 
 int mt7915_mcu_add_rx_ba(struct mt7915_dev *dev,
-- 
2.43.0



From sashal at kernel.org  Wed Sep 25 05:07:52 2024
From: sashal at kernel.org (Sasha Levin)
Date: Wed, 25 Sep 2024 08:07:52 -0400
Subject: [PATCH AUTOSEL 6.6 052/139] wifi: mt76: mt7915: add dummy HW offload of IEEE 802.11 fragmentation
In-Reply-To: <20240925121137.1307574-1-sashal@kernel.org>
References: <20240925121137.1307574-1-sashal@kernel.org>
Message-ID: <20240925121137.1307574-52-sashal@kernel.org>

From: Benjamin Lin <benjamin-jw.lin at mediatek.com>

[ Upstream commit f2cc859149240d910fdc6405717673e0b84bfda8 ]

Currently, CONNAC2 series do not support encryption for fragmented Tx frames.
Therefore, add dummy function mt7915_set_frag_threshold() to prevent SW
IEEE 802.11 fragmentation.

Signed-off-by: Benjamin Lin <benjamin-jw.lin at mediatek.com>
Link: https://patch.msgid.link/20240827093011.18621-16-nbd at nbd.name
Signed-off-by: Felix Fietkau <nbd at nbd.name>
Signed-off-by: Sasha Levin <sashal at kernel.org>
---
 drivers/net/wireless/mediatek/mt76/mt7915/init.c | 1 +
 drivers/net/wireless/mediatek/mt76/mt7915/main.c | 7 +++++++
 2 files changed, 8 insertions(+)

diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/init.c b/drivers/net/wireless/mediatek/mt76/mt7915/init.c
index 35fdf4f98d80b..2fabef0ec42e5 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/init.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/init.c
@@ -386,6 +386,7 @@ mt7915_init_wiphy(struct mt7915_phy *phy)
 	ieee80211_hw_set(hw, SUPPORTS_RX_DECAP_OFFLOAD);
 	ieee80211_hw_set(hw, SUPPORTS_MULTI_BSSID);
 	ieee80211_hw_set(hw, WANT_MONITOR_VIF);
+	ieee80211_hw_set(hw, SUPPORTS_TX_FRAG);
 
 	hw->max_tx_fragments = 4;
 
diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/main.c b/drivers/net/wireless/mediatek/mt76/mt7915/main.c
index 260fe00d7dc6d..f0f4f7d1d600d 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/main.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/main.c
@@ -1562,6 +1562,12 @@ mt7915_twt_teardown_request(struct ieee80211_hw *hw,
 	mutex_unlock(&dev->mt76.mutex);
 }
 
+static int
+mt7915_set_frag_threshold(struct ieee80211_hw *hw, u32 val)
+{
+	return 0;
+}
+
 static int
 mt7915_set_radar_background(struct ieee80211_hw *hw,
 			    struct cfg80211_chan_def *chandef)
@@ -1688,6 +1694,7 @@ const struct ieee80211_ops mt7915_ops = {
 	.sta_set_decap_offload = mt7915_sta_set_decap_offload,
 	.add_twt_setup = mt7915_mac_add_twt_setup,
 	.twt_teardown_request = mt7915_twt_teardown_request,
+	.set_frag_threshold = mt7915_set_frag_threshold,
 	CFG80211_TESTMODE_CMD(mt76_testmode_cmd)
 	CFG80211_TESTMODE_DUMP(mt76_testmode_dump)
 #ifdef CONFIG_MAC80211_DEBUGFS
-- 
2.43.0



From sashal at kernel.org  Wed Sep 25 05:07:53 2024
From: sashal at kernel.org (Sasha Levin)
Date: Wed, 25 Sep 2024 08:07:53 -0400
Subject: [PATCH AUTOSEL 6.6 053/139] wifi: mt76: mt7915: hold dev->mt76.mutex while disabling tx worker
In-Reply-To: <20240925121137.1307574-1-sashal@kernel.org>
References: <20240925121137.1307574-1-sashal@kernel.org>
Message-ID: <20240925121137.1307574-53-sashal@kernel.org>

From: Felix Fietkau <nbd at nbd.name>

[ Upstream commit 8f7152f10cb434f954aeff85ca1be9cd4d01912b ]

Prevent racing against other functions disabling the same worker

Link: https://patch.msgid.link/20240827093011.18621-17-nbd at nbd.name
Signed-off-by: Felix Fietkau <nbd at nbd.name>
Signed-off-by: Sasha Levin <sashal at kernel.org>
---
 drivers/net/wireless/mediatek/mt76/mt7915/mac.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mac.c b/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
index 2222fb9aa103e..38d27f8721733 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
@@ -1538,12 +1538,14 @@ void mt7915_mac_reset_work(struct work_struct *work)
 		set_bit(MT76_RESET, &phy2->mt76->state);
 		cancel_delayed_work_sync(&phy2->mt76->mac_work);
 	}
+
+	mutex_lock(&dev->mt76.mutex);
+
 	mt76_worker_disable(&dev->mt76.tx_worker);
 	mt76_for_each_q_rx(&dev->mt76, i)
 		napi_disable(&dev->mt76.napi[i]);
 	napi_disable(&dev->mt76.tx_napi);
 
-	mutex_lock(&dev->mt76.mutex);
 
 	mt76_wr(dev, MT_MCU_INT_EVENT, MT_MCU_INT_EVENT_DMA_STOPPED);
 
-- 
2.43.0



From dmitry.baryshkov at linaro.org  Wed Sep 25 05:51:22 2024
From: dmitry.baryshkov at linaro.org (Dmitry Baryshkov)
Date: Wed, 25 Sep 2024 15:51:22 +0300
Subject: [Linaro-mm-sig] Re: [RFC PATCH 0/4] Linaro restricted heap
In-Reply-To: <e967e382-6cca-4dee-8333-39892d532f71@gmail.com>
References: <20240830070351.2855919-1-jens.wiklander@linaro.org>
 <dhxvyshwi4qmcmwceokhqey2ww4azjcs6qrpnkgivdj7tv5cke@r36srvvbof6q>
 <d8e0cb78-7cfb-42bf-b3a5-f765592e8dd4@ti.com>
 <mzur3odofwwrdqnystozjgf3qtvb73wqjm6g2vf5dfsqiehaxk@u67fcarhm6ge>
 <e967e382-6cca-4dee-8333-39892d532f71@gmail.com>
Message-ID: <lk7a2xuqrctyywuanjwseh5lkcz3soatc2zf3kn3uwc43pdyic@edm3hcd2koas>

On Wed, Sep 25, 2024 at 10:51:15AM GMT, Christian K?nig wrote:
> Am 25.09.24 um 01:05 schrieb Dmitry Baryshkov:
> > On Tue, Sep 24, 2024 at 01:13:18PM GMT, Andrew Davis wrote:
> > > On 9/23/24 1:33 AM, Dmitry Baryshkov wrote:
> > > > Hi,
> > > > 
> > > > On Fri, Aug 30, 2024 at 09:03:47AM GMT, Jens Wiklander wrote:
> > > > > Hi,
> > > > > 
> > > > > This patch set is based on top of Yong Wu's restricted heap patch set [1].
> > > > > It's also a continuation on Olivier's Add dma-buf secure-heap patch set [2].
> > > > > 
> > > > > The Linaro restricted heap uses genalloc in the kernel to manage the heap
> > > > > carvout. This is a difference from the Mediatek restricted heap which
> > > > > relies on the secure world to manage the carveout.
> > > > > 
> > > > > I've tried to adress the comments on [2], but [1] introduces changes so I'm
> > > > > afraid I've had to skip some comments.
> > > > I know I have raised the same question during LPC (in connection to
> > > > Qualcomm's dma-heap implementation). Is there any reason why we are
> > > > using generic heaps instead of allocating the dma-bufs on the device
> > > > side?
> > > > 
> > > > In your case you already have TEE device, you can use it to allocate and
> > > > export dma-bufs, which then get imported by the V4L and DRM drivers.
> > > > 
> > > This goes to the heart of why we have dma-heaps in the first place.
> > > We don't want to burden userspace with having to figure out the right
> > > place to get a dma-buf for a given use-case on a given hardware.
> > > That would be very non-portable, and fail at the core purpose of
> > > a kernel: to abstract hardware specifics away.
> > Unfortunately all proposals to use dma-buf heaps were moving in the
> > described direction: let app select (somehow) from a platform- and
> > vendor- specific list of dma-buf heaps. In the kernel we at least know
> > the platform on which the system is running. Userspace generally doesn't
> > (and shouldn't). As such, it seems better to me to keep the knowledge in
> > the kernel and allow userspace do its job by calling into existing
> > device drivers.
> 
> The idea of letting the kernel fully abstract away the complexity of inter
> device data exchange is a completely failed design. There has been plenty of
> evidence for that over the years.
> 
> Because of this in DMA-buf it's an intentional design decision that
> userspace and *not* the kernel decides where and what to allocate from.

Hmm, ok.

> 
> What the kernel should provide are the necessary information what type of
> memory a device can work with and if certain memory is accessible or not.
> This is the part which is unfortunately still not well defined nor
> implemented at the moment.
> 
> Apart from that there are a whole bunch of intentional design decision which
> should prevent developers to move allocation decision inside the kernel. For
> example DMA-buf doesn't know what the content of the buffer is (except for
> it's total size) and which use cases a buffer will be used with.
> 
> So the question if memory should be exposed through DMA-heaps or a driver
> specific allocator is not a question of abstraction, but rather one of the
> physical location and accessibility of the memory.
> 
> If the memory is attached to any physical device, e.g. local memory on a
> dGPU, FPGA PCIe BAR, RDMA, camera internal memory etc, then expose the
> memory as device specific allocator.

So, for embedded systems with unified memory all buffers (maybe except
PCIe BARs) should come from DMA-BUF heaps, correct?

> 
> If the memory is not physically attached to any device, but rather just
> memory attached to the CPU or a system wide memory controller then expose
> the memory as DMA-heap with specific requirements (e.g. certain sized pages,
> contiguous, restricted, encrypted, ...).

Is encrypted / protected a part of the allocation contract or should it
be enforced separately via a call to TEE / SCM / anything else?

-- 
With best wishes
Dmitry


From jens.wiklander at linaro.org  Wed Sep 25 05:53:34 2024
From: jens.wiklander at linaro.org (Jens Wiklander)
Date: Wed, 25 Sep 2024 14:53:34 +0200
Subject: [RFC PATCH 0/4] Linaro restricted heap
In-Reply-To: <bktt4yanmfn4gjljy2wxmigj6mncpga237oxyf4g4h2vxu2a3q@asnsn7smi4u2>
References: <20240830070351.2855919-1-jens.wiklander@linaro.org>
 <dhxvyshwi4qmcmwceokhqey2ww4azjcs6qrpnkgivdj7tv5cke@r36srvvbof6q>
 <20240925071504.GA3519798@rayden> <bktt4yanmfn4gjljy2wxmigj6mncpga237oxyf4g4h2vxu2a3q@asnsn7smi4u2>
Message-ID: <CAHUa44EvgcUg0QFvwsgU6BSs_BtZg6bO_5rx3CJbyCUPbiQZXQ@mail.gmail.com>

On Wed, Sep 25, 2024 at 1:41?PM Dmitry Baryshkov
<dmitry.baryshkov at linaro.org> wrote:
>
> On Wed, Sep 25, 2024 at 09:15:04AM GMT, Jens Wiklander wrote:
> > On Mon, Sep 23, 2024 at 09:33:29AM +0300, Dmitry Baryshkov wrote:
> > > Hi,
> > >
> > > On Fri, Aug 30, 2024 at 09:03:47AM GMT, Jens Wiklander wrote:
> > > > Hi,
> > > >
> > > > This patch set is based on top of Yong Wu's restricted heap patch set [1].
> > > > It's also a continuation on Olivier's Add dma-buf secure-heap patch set [2].
> > > >
> > > > The Linaro restricted heap uses genalloc in the kernel to manage the heap
> > > > carvout. This is a difference from the Mediatek restricted heap which
> > > > relies on the secure world to manage the carveout.
> > > >
> > > > I've tried to adress the comments on [2], but [1] introduces changes so I'm
> > > > afraid I've had to skip some comments.
> > >
> > > I know I have raised the same question during LPC (in connection to
> > > Qualcomm's dma-heap implementation). Is there any reason why we are
> > > using generic heaps instead of allocating the dma-bufs on the device
> > > side?
> > >
> > > In your case you already have TEE device, you can use it to allocate and
> > > export dma-bufs, which then get imported by the V4L and DRM drivers.
> > >
> > > I have a feeling (I might be completely wrong here) that by using
> > > generic dma-buf heaps we can easily end up in a situation when the
> > > userspace depends heavily on the actual platform being used (to map the
> > > platform to heap names). I think we should instead depend on the
> > > existing devices (e.g. if there is a TEE device, use an IOCTL to
> > > allocate secured DMA BUF from it, otherwise check for QTEE device,
> > > otherwise check for some other vendor device).
> >
> > That makes sense, it's similar to what we do with TEE_IOC_SHM_ALLOC
> > where we allocate from a carveout reserverd for shared memory with the
> > secure world. It was even based on dma-buf until commit dfd0743f1d9e
> > ("tee: handle lookup of shm with reference count 0").
> >
> > We should use a new TEE_IOC_*_ALLOC for these new dma-bufs to avoid
> > confusion and to have more freedom when designing the interface.
> >
> > >
> > > The mental experiment to check if the API is correct is really simple:
> > > Can you use exactly the same rootfs on several devices without
> > > any additional tuning (e.g. your QEMU, HiKey, a Mediatek board, Qualcomm
> > > laptop, etc)?
> >
> > No, I don't think so.
>
> Then the API needs to be modified.

I don't think that is enough. I would have answered no even without
the secure data path in mind. Communication with the secure world is
still too fragmented.

>
> Or the userspace needs to be modified in the way similar to Vulkan /
> OpenCL / glvnd / VA / VDPU: platform-specific backends, coexisting on a
> single rootfs.

Yes, that's likely a needed step. But the first step is to have
something to relate to upstream, without that there's only an
ever-changing downstream ABI.

>
> It is more or less fine to have platform-specific rootfs when we are
> talking about the embedded, resource-limited devices. But for the
> end-user devices we must be able to install a generic distro with no
> device-specific packages being selected.

I'm not sure we can solve that problem here. But we should of course
not make matters worse. In the restricted heap patch set which this
patchset builds on we define a way to allocate memory from a
restricted heap, but we leave the problem of finding the right heap to
userspace.

Thanks,
Jens

>
> >
> > >
> > > >
> > > > This can be tested on QEMU with the following steps:
> > > > repo init -u https://github.com/jenswi-linaro/manifest.git -m qemu_v8.xml \
> > > >         -b prototype/sdp-v1
> > > > repo sync -j8
> > > > cd build
> > > > make toolchains -j4
> > > > make all -j$(nproc)
> > > > make run-only
> > > > # login and at the prompt:
> > > > xtest --sdp-basic
> > > >
> > > > https://optee.readthedocs.io/en/latest/building/prerequisites.html
> > > > list dependencies needed to build the above.
> > > >
> > > > The tests are pretty basic, mostly checking that a Trusted Application in
> > > > the secure world can access and manipulate the memory.
> > >
> > > - Can we test that the system doesn't crash badly if user provides
> > >   non-secured memory to the users which expect a secure buffer?
> > >
> > > - At the same time corresponding entities shouldn't decode data to the
> > >   buffers accessible to the rest of the sytem.
> >
> > I'll a few tests along that.
> >
> > Thanks,
> > Jens
> >
> > >
> > > >
> > > > Cheers,
> > > > Jens
> > > >
> > > > [1] https://lore.kernel.org/dri-devel/20240515112308.10171-1-yong.wu at mediatek.com/
> > > > [2] https://lore.kernel.org/lkml/20220805135330.970-1-olivier.masse at nxp.com/
> > > >
> > > > Changes since Olivier's post [2]:
> > > > * Based on Yong Wu's post [1] where much of dma-buf handling is done in
> > > >   the generic restricted heap
> > > > * Simplifications and cleanup
> > > > * New commit message for "dma-buf: heaps: add Linaro restricted dmabuf heap
> > > >   support"
> > > > * Replaced the word "secure" with "restricted" where applicable
> > > >
> > > > Etienne Carriere (1):
> > > >   tee: new ioctl to a register tee_shm from a dmabuf file descriptor
> > > >
> > > > Jens Wiklander (2):
> > > >   dma-buf: heaps: restricted_heap: add no_map attribute
> > > >   dma-buf: heaps: add Linaro restricted dmabuf heap support
> > > >
> > > > Olivier Masse (1):
> > > >   dt-bindings: reserved-memory: add linaro,restricted-heap
> > > >
> > > >  .../linaro,restricted-heap.yaml               |  56 ++++++
> > > >  drivers/dma-buf/heaps/Kconfig                 |  10 ++
> > > >  drivers/dma-buf/heaps/Makefile                |   1 +
> > > >  drivers/dma-buf/heaps/restricted_heap.c       |  17 +-
> > > >  drivers/dma-buf/heaps/restricted_heap.h       |   2 +
> > > >  .../dma-buf/heaps/restricted_heap_linaro.c    | 165 ++++++++++++++++++
> > > >  drivers/tee/tee_core.c                        |  38 ++++
> > > >  drivers/tee/tee_shm.c                         | 104 ++++++++++-
> > > >  include/linux/tee_drv.h                       |  11 ++
> > > >  include/uapi/linux/tee.h                      |  29 +++
> > > >  10 files changed, 426 insertions(+), 7 deletions(-)
> > > >  create mode 100644 Documentation/devicetree/bindings/reserved-memory/linaro,restricted-heap.yaml
> > > >  create mode 100644 drivers/dma-buf/heaps/restricted_heap_linaro.c
> > > >
> > > > --
> > > > 2.34.1
> > > >
> > >
> > > --
> > > With best wishes
> > > Dmitry
>
> --
> With best wishes
> Dmitry


From liuyonglong at huawei.com  Wed Sep 25 06:31:58 2024
From: liuyonglong at huawei.com (Yonglong Liu)
Date: Wed, 25 Sep 2024 21:31:58 +0800
Subject: [PATCH net v2 0/2] fix two bugs related to page_pool
In-Reply-To: <20240925075707.3970187-1-linyunsheng@huawei.com>
References: <20240925075707.3970187-1-linyunsheng@huawei.com>
Message-ID: <282e3f4f-c3ef-4b42-bf9e-3a1ab25a8091@huawei.com>

Tested-by: Yonglong Liu <liuyonglong at huawei.com>

On 2024/9/25 15:57, Yunsheng Lin wrote:
> Patch 1 fix a possible time window problem for page_pool.
> Patch 2 fix the kernel crash problem at iommu_get_dma_domain
> reported in [1].
>
> When page_pool_put_unrefed_netmem() is called with allow_direct
> being true, there is only a newly added checking overhead
> introduced in patch 1, which seem to be no noticeable performance
> impact.
>
> When page_pool_put_unrefed_netmem() is called with allow_direct
> being false, there is an added rcu read lock overhead introduced in
> patch 1, and the overhead is about 13ns using the below test code,
> but 'time_bench_page_pool02_ptr_ring' only show about 2ns overhead,
> which is about 2% degradation.
>
> +static int time_bench_rcu(
> +       struct time_bench_record *rec, void *data)
> +{
> +       uint64_t loops_cnt = 0;
> +       int i;
> +
> +       time_bench_start(rec);
> +       /** Loop to measure **/
> +       for (i = 0; i < rec->loops; i++) {
> +               rcu_read_lock();
> +               loops_cnt++;
> +               barrier(); /* avoid compiler to optimize this loop */
> +               rcu_read_unlock();
> +       }
> +       time_bench_stop(rec, loops_cnt);
> +       return loops_cnt;
> +}
>
> When page_pool need to be refilled from or flushed to the page allocator,
> the added overhead is the page_pool_item_add() and page_pool_item_del()
> calling overhead, using below patch to enable Jesper's testing running in
> arm64, the overhead is 0~20ns, which is quite variable
>
> Before this patchset:
> root@(none)$ taskset -c 1 insmod bench_page_pool_simple.ko
> [  136.641453] bench_page_pool_simple: Loaded
> [  136.722560] time_bench: Type:for_loop Per elem: 0 cycles(tsc) 0.769 ns (step:0) - (measurement period time:0.076968720 sec time_interval:76968720) - (invoke count:100000000 tsc_interval:7696855)
> [  137.317006] time_bench: Type:atomic_inc Per elem: 0 cycles(tsc) 5.771 ns (step:0) - (measurement period time:0.577164350 sec time_interval:577164350) - (invoke count:100000000 tsc_interval:57716429)
> [  137.480852] time_bench: Type:lock Per elem: 1 cycles(tsc) 14.621 ns (step:0) - (measurement period time:0.146218730 sec time_interval:146218730) - (invoke count:10000000 tsc_interval:14621868)
> [  138.842377] time_bench: Type:rcu Per elem: 1 cycles(tsc) 13.444 ns (step:0) - (measurement period time:1.344419820 sec time_interval:1344419820) - (invoke count:100000000 tsc_interval:134441975)
> [  138.859656] bench_page_pool_simple: time_bench_page_pool01_fast_path(): Cannot use page_pool fast-path
> [  139.132102] time_bench: Type:no-softirq-page_pool01 Per elem: 2 cycles(tsc) 26.315 ns (step:0) - (measurement period time:0.263151430 sec time_interval:263151430) - (invoke count:10000000 tsc_interval:26315135)
> [  139.150769] bench_page_pool_simple: time_bench_page_pool02_ptr_ring(): Cannot use page_pool fast-path
> [  139.910642] time_bench: Type:no-softirq-page_pool02 Per elem: 7 cycles(tsc) 75.066 ns (step:0) - (measurement period time:0.750663200 sec time_interval:750663200) - (invoke count:10000000 tsc_interval:75066312)
> [  139.929312] bench_page_pool_simple: time_bench_page_pool03_slow(): Cannot use page_pool fast-path
> [  141.673951] time_bench: Type:no-softirq-page_pool03 Per elem: 17 cycles(tsc) 173.578 ns (step:0) - (measurement period time:1.735781610 sec time_interval:1735781610) - (invoke count:10000000 tsc_interval:173578155)
> [  141.692970] bench_page_pool_simple: pp_tasklet_handler(): in_serving_softirq fast-path
> [  141.700874] bench_page_pool_simple: time_bench_page_pool01_fast_path(): in_serving_softirq fast-path
> [  141.973638] time_bench: Type:tasklet_page_pool01_fast_path Per elem: 2 cycles(tsc) 26.364 ns (step:0) - (measurement period time:0.263645150 sec time_interval:263645150) - (invoke count:10000000 tsc_interval:26364508)
> [  141.992912] bench_page_pool_simple: time_bench_page_pool02_ptr_ring(): in_serving_softirq fast-path
> [  142.531745] time_bench: Type:tasklet_page_pool02_ptr_ring Per elem: 5 cycles(tsc) 52.980 ns (step:0) - (measurement period time:0.529801250 sec time_interval:529801250) - (invoke count:10000000 tsc_interval:52980119)
> [  142.550933] bench_page_pool_simple: time_bench_page_pool03_slow(): in_serving_softirq fast-path
> [  144.297646] time_bench: Type:tasklet_page_pool03_slow Per elem: 17 cycles(tsc) 173.802 ns (step:0) - (measurement period time:1.738029000 sec time_interval:1738029000) - (invoke count:10000000 tsc_interval:173802894)
>
> After this patchset:
> root@(none)$ taskset -c 1 insmod bench_page_pool_simple.ko
> [  149.865799] bench_page_pool_simple: Loaded
> [  149.946907] time_bench: Type:for_loop Per elem: 0 cycles(tsc) 0.769 ns (step:0) - (measurement period time:0.076965620 sec time_interval:76965620) - (invoke count:100000000 tsc_interval:7696556)
> [  150.722282] time_bench: Type:atomic_inc Per elem: 0 cycles(tsc) 7.580 ns (step:0) - (measurement period time:0.758094660 sec time_interval:758094660) - (invoke count:100000000 tsc_interval:75809459)
> [  150.886335] time_bench: Type:lock Per elem: 1 cycles(tsc) 14.640 ns (step:0) - (measurement period time:0.146405830 sec time_interval:146405830) - (invoke count:10000000 tsc_interval:14640578)
> [  152.249454] time_bench: Type:rcu Per elem: 1 cycles(tsc) 13.460 ns (step:0) - (measurement period time:1.346009570 sec time_interval:1346009570) - (invoke count:100000000 tsc_interval:134600951)
> [  152.266734] bench_page_pool_simple: time_bench_page_pool01_fast_path(): Cannot use page_pool fast-path
> [  152.537046] time_bench: Type:no-softirq-page_pool01 Per elem: 2 cycles(tsc) 26.100 ns (step:0) - (measurement period time:0.261007670 sec time_interval:261007670) - (invoke count:10000000 tsc_interval:26100761)
> [  152.555714] bench_page_pool_simple: time_bench_page_pool02_ptr_ring(): Cannot use page_pool fast-path
> [  153.342212] time_bench: Type:no-softirq-page_pool02 Per elem: 7 cycles(tsc) 77.729 ns (step:0) - (measurement period time:0.777293380 sec time_interval:777293380) - (invoke count:10000000 tsc_interval:77729331)
> [  153.360881] bench_page_pool_simple: time_bench_page_pool03_slow(): Cannot use page_pool fast-path
> [  155.287747] time_bench: Type:no-softirq-page_pool03 Per elem: 19 cycles(tsc) 191.800 ns (step:0) - (measurement period time:1.918007990 sec time_interval:1918007990) - (invoke count:10000000 tsc_interval:191800791)
> [  155.306766] bench_page_pool_simple: pp_tasklet_handler(): in_serving_softirq fast-path
> [  155.314670] bench_page_pool_simple: time_bench_page_pool01_fast_path(): in_serving_softirq fast-path
> [  155.584313] time_bench: Type:tasklet_page_pool01_fast_path Per elem: 2 cycles(tsc) 26.052 ns (step:0) - (measurement period time:0.260524810 sec time_interval:260524810) - (invoke count:10000000 tsc_interval:26052476)
> [  155.603588] bench_page_pool_simple: time_bench_page_pool02_ptr_ring(): in_serving_softirq fast-path
> [  156.183214] time_bench: Type:tasklet_page_pool02_ptr_ring Per elem: 5 cycles(tsc) 57.059 ns (step:0) - (measurement period time:0.570594850 sec time_interval:570594850) - (invoke count:10000000 tsc_interval:57059478)
> [  156.202402] bench_page_pool_simple: time_bench_page_pool03_slow(): in_serving_softirq fast-path
> [  158.045594] time_bench: Type:tasklet_page_pool03_slow Per elem: 18 cycles(tsc) 183.450 ns (step:0) - (measurement period time:1.834507700 sec time_interval:1834507700) - (invoke count:10000000 tsc_interval:183450764)
>
> Patch for time_bench.h enable the out of tree testing on arm64 system:
> @@ -101,6 +101,7 @@ struct time_bench_cpu {
>    *  CPUID clears the high 32-bits of all (rax/rbx/rcx/rdx)
>    */
>   static __always_inline uint64_t tsc_start_clock(void) {
> +#if defined(__i386__) || defined(__x86_64__)
>          /* See: Intel Doc #324264 */
>          unsigned hi, lo;
>          asm volatile (
> @@ -111,9 +112,13 @@ static __always_inline uint64_t tsc_start_clock(void) {
>                  "%rax", "%rbx", "%rcx", "%rdx");
>          //FIXME: on 32bit use clobbered %eax + %edx
>          return ((uint64_t)lo) | (((uint64_t)hi) << 32);
> +#else
> +       return get_cycles();
> +#endif
>   }
>
>   static __always_inline uint64_t tsc_stop_clock(void) {
> +#if defined(__i386__) || defined(__x86_64__)
>          /* See: Intel Doc #324264 */
>          unsigned hi, lo;
>          asm volatile(
> @@ -123,6 +128,9 @@ static __always_inline uint64_t tsc_stop_clock(void) {
>                  "CPUID\n\t": "=r" (hi), "=r" (lo)::
>                  "%rax", "%rbx", "%rcx", "%rdx");
>          return ((uint64_t)lo) | (((uint64_t)hi) << 32);
> +#else
> +       return get_cycles();
> +#endif
>   }
>
>   /* Notes for RDTSC and RDTSCP
> @@ -186,10 +194,14 @@ enum {
>
>   static __always_inline unsigned long long p_rdpmc(unsigned in)
>   {
> +#if defined(__i386__) || defined(__x86_64__)
>          unsigned d, a;
>
>          asm volatile("rdpmc" : "=d" (d), "=a" (a) : "c" (in) : "memory");
>          return ((unsigned long long)d << 32) | a;
> +#else
> +       return 0;
> +#endif
>   }
>
>   /* These PMU counter needs to be enabled, but I don't have the
> @@ -216,7 +228,11 @@ static __always_inline unsigned long long pmc_clk(void)
>   #define MSR_IA32_PCM2 0x400000C3
>   inline uint64_t msr_inst(unsigned long long *msr_result)
>   {
> +#if defined(__i386__) || defined(__x86_64__)
>          return rdmsrl_safe(MSR_IA32_PCM0, msr_result);
> +#else
> +       return 0;
> +#endif
>   }
>
> 1. https://lore.kernel.org/lkml/8067f204-1380-4d37-8ffd-007fc6f26738 at kernel.org/T/
>
> CC: Alexander Lobakin <aleksander.lobakin at intel.com>
> CC: Robin Murphy <robin.murphy at arm.com>
> CC: Alexander Duyck <alexander.duyck at gmail.com>
> CC: IOMMU <iommu at lists.linux.dev>
>
> Change log:
> V2:
>    1. Add a item_full stat.
>    2. Use container_of() for page_pool_to_pp().
>
> Yunsheng Lin (2):
>    page_pool: fix timing for checking and disabling napi_local
>    page_pool: fix IOMMU crash when driver has already unbound
>
>   drivers/net/ethernet/freescale/fec_main.c     |   8 +-
>   drivers/net/ethernet/intel/iavf/iavf_txrx.c   |   6 +-
>   drivers/net/ethernet/intel/idpf/idpf_txrx.c   |  14 +-
>   drivers/net/ethernet/intel/libeth/rx.c        |   2 +-
>   .../net/ethernet/mellanox/mlx5/core/en/xdp.c  |   3 +-
>   drivers/net/netdevsim/netdev.c                |   6 +-
>   drivers/net/wireless/mediatek/mt76/mt76.h     |   2 +-
>   include/linux/mm_types.h                      |   2 +-
>   include/linux/skbuff.h                        |   1 +
>   include/net/libeth/rx.h                       |   3 +-
>   include/net/netmem.h                          |  10 +-
>   include/net/page_pool/helpers.h               |   7 +
>   include/net/page_pool/types.h                 |  17 +-
>   net/core/devmem.c                             |   4 +-
>   net/core/netmem_priv.h                        |   5 +-
>   net/core/page_pool.c                          | 190 +++++++++++++++---
>   net/core/page_pool_priv.h                     |  10 +-
>   net/core/skbuff.c                             |   3 +-
>   net/core/xdp.c                                |   3 +-
>   19 files changed, 238 insertions(+), 58 deletions(-)
>


From krzk at kernel.org  Wed Sep 25 06:59:13 2024
From: krzk at kernel.org (Krzysztof Kozlowski)
Date: Wed, 25 Sep 2024 15:59:13 +0200
Subject: [PATCH 2/6] dt-bindings: PCI: mediatek-gen3: Allow exact number
 of clocks only
In-Reply-To: <20240925110044.3678055-3-fshao@chromium.org>
References: <20240925110044.3678055-1-fshao@chromium.org>
 <20240925110044.3678055-3-fshao@chromium.org>
Message-ID: <6b5b463a-cf01-4e02-bb4e-292f5bd8b7f2@kernel.org>

On 25/09/2024 12:57, Fei Shao wrote:
> In MediaTek PCIe gen3 bindings, "clocks" accepts a range of 1-6 clocks
> across all SoCs. But in practice, each SoC requires a particular number
> of clocks as defined in "clock-names", and the length of "clocks" and
> "clock-names" can be inconsistent with current bindings.
> 
> For example:
> - MT8188, MT8192 and MT8195 all require 6 clocks, while the bindings
>   accept 4-6 clocks.
> - MT7986 requires 4 clocks, while the bindings accept 4-6 clocks.
> 
> Update minItems and maxItems properties for individual SoCs as needed to
> only accept the correct number of clocks.
> 


Reviewed-by: Krzysztof Kozlowski <krzk at kernel.org>

Best regards,
Krzysztof



From krzk at kernel.org  Wed Sep 25 07:17:52 2024
From: krzk at kernel.org (Krzysztof Kozlowski)
Date: Wed, 25 Sep 2024 16:17:52 +0200
Subject: [PATCH 1/2] dt-bindings: arm: mediatek: Add MT8186
 Chinchou/Chinchou360 Chromebooks
In-Reply-To: <20240925080353.2362879-1-jakiela@google.com>
References: <20240925080353.2362879-1-jakiela@google.com>
Message-ID: <16ce3558-7733-4c38-b514-c89525faec06@kernel.org>

On 25/09/2024 10:03, Albert Jakie?a wrote:
> Add entries for MT8186 based Chinchou/Chinchou360 Chromebooks.
> These two are clamshell or convertible with touchscreen, stylus
> and extra buttons.
> 
> Signed-off-by: Albert Jakie?a <jakiela at google.com>
> ---
>  .../devicetree/bindings/arm/mediatek.yaml     | 23 +++++++++++++++++++
>  1 file changed, 23 insertions(+)
> 
> diff --git a/Documentation/devicetree/bindings/arm/mediatek.yaml b/Documentation/devicetree/bindings/arm/mediatek.yaml
> index 1d4bb50fcd8d..110149f5d748 100644
> --- a/Documentation/devicetree/bindings/arm/mediatek.yaml
> +++ b/Documentation/devicetree/bindings/arm/mediatek.yaml
> @@ -239,6 +239,29 @@ properties:
>            - enum:
>                - mediatek,mt8183-pumpkin
>            - const: mediatek,mt8183
> +      - description: Google Chinchou360 (Asus Chromebook CZ11 Flip CZ1104F)
> +        items:
> +          - const: google,chinchou-sku16
> +          - const: google,chinchou-sku18
> +          - const: google,chinchou-sku19
> +          - const: google,chinchou-sku21
> +          - const: google,chinchou-sku2147483647

Wasn't sku-maxint removed? I recall same discussion recently... If yes,
then please use same rules for all future Chromebook submissions.

Best regards,
Krzysztof



From conor at kernel.org  Wed Sep 25 07:34:42 2024
From: conor at kernel.org (Conor Dooley)
Date: Wed, 25 Sep 2024 15:34:42 +0100
Subject: [PATCH 3/6] dt-bindings: display: mediatek: Fix clocks count
 constraint for new SoCs
In-Reply-To: <2821ef09-1b32-082d-69d1-e09a3a302447@mediatek.com>
References: <20240924103156.13119-1-macpaul.lin@mediatek.com>
 <20240924103156.13119-3-macpaul.lin@mediatek.com>
 <ffc1900b-3921-48ca-a2b2-1b798c57e572@collabora.com>
 <20240924-commute-collision-13ad39717d31@spud>
 <2821ef09-1b32-082d-69d1-e09a3a302447@mediatek.com>
Message-ID: <20240925-satisfy-epidermal-bd414891479a@spud>

On Wed, Sep 25, 2024 at 04:42:59PM +0800, Macpaul Lin wrote:
> 
> On 9/25/24 00:00, Conor Dooley wrote:
> > On Tue, Sep 24, 2024 at 01:42:01PM +0200, AngeloGioacchino Del Regno wrote:
> > > Il 24/09/24 12:31, Macpaul Lin ha scritto:
> > > > The display node in mt8195.dtsi was triggering a CHECK_DTBS error due
> > > > to an excessively long 'clocks' property:
> > > >     display at 14f06000: clocks: [[31, 14], [31, 43], [31, 44]] is too long
> > > > 
> > > > To resolve this issue, add "maxItems: 3" to the 'clocks' property in
> > > > the DT schema.
> > > > 
> > > > Fixes: 4ed545e7d100 ("dt-bindings: display: mediatek: disp: split each block to individual yaml")
> > > > Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
> > > > ---
> > > >    .../devicetree/bindings/display/mediatek/mediatek,split.yaml     | 1 +
> > > >    1 file changed, 1 insertion(+)
> > > > 
> > > > diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,split.yaml b/Documentation/devicetree/bindings/display/mediatek/mediatek,split.yaml
> > > > index e4affc854f3d..42d2d483cc29 100644
> > > > --- a/Documentation/devicetree/bindings/display/mediatek/mediatek,split.yaml
> > > > +++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,split.yaml
> > > > @@ -57,6 +57,7 @@ properties:
> > > >      clocks:
> > > >        items:
> > > >          - description: SPLIT Clock
> > > 
> > > That's at least confusing (granted that it works) - either add a description for
> > > each clock and then set `minItems: 1` (preferred), or remove this "SPLIT Clock"
> > > description and allow a maximum of 3 clocks.
> > > 
> > > Removing the description can be done - IMO - because "SPLIT Clock" is, well,
> > > saying that the SPLIT block gets a SPLIT clock ... stating the obvious, anyway.
> > 
> > Right, but what are the other two new clocks? Are they as obvious?
> > There's no clock-names here to give any more information as to what the
> > other clocks are supposed to be.
> > 
> > Kinda unrelated, but I think that "SPLIT Clock" probably isn't what the
> > name of the clock in the IP block is anyway, sounds more like the name
> > for it on the provider end..
> 
> Thanks for the suggestions. I think Moudy could help on the new fixes
> for both DT schem and mt8195.dtsi. This patch could be separated from
> origin patch set.

Not sure what you mean about separating it, if you mean correcting the
description for the split clock sure. The other stuff I mentioned needs
to be resolved before I'm willing to ack this.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 228 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-mediatek/attachments/20240925/70dab3c1/attachment.sig>

From robh at kernel.org  Wed Sep 25 07:36:42 2024
From: robh at kernel.org (Rob Herring (Arm))
Date: Wed, 25 Sep 2024 09:36:42 -0500
Subject: [PATCH 1/2] dt-bindings: arm: mediatek: Add MT8186
 Chinchou/Chinchou360 Chromebooks
In-Reply-To: <20240925080353.2362879-1-jakiela@google.com>
References: <20240925080353.2362879-1-jakiela@google.com>
Message-ID: <172727480860.1214065.4384834635339213375.robh@kernel.org>


On Wed, 25 Sep 2024 08:03:52 +0000, Albert Jakie?a wrote:
> Add entries for MT8186 based Chinchou/Chinchou360 Chromebooks.
> These two are clamshell or convertible with touchscreen, stylus
> and extra buttons.
> 
> Signed-off-by: Albert Jakie?a <jakiela at google.com>
> ---
>  .../devicetree/bindings/arm/mediatek.yaml     | 23 +++++++++++++++++++
>  1 file changed, 23 insertions(+)
> 


My bot found new DTB warnings on the .dts files added or changed in this
series.

Some warnings may be from an existing SoC .dtsi. Or perhaps the warnings
are fixed by another series. Ultimately, it is up to the platform
maintainer whether these warnings are acceptable or not. No need to reply
unless the platform maintainer has comments.

If you already ran DT checks and didn't see these error(s), then
make sure dt-schema is up to date:

  pip3 install dtschema --upgrade


New warnings running 'make CHECK_DTBS=y mediatek/mt8186-corsola-chinchou-sku0.dtb mediatek/mt8186-corsola-chinchou-sku1.dtb mediatek/mt8186-corsola-chinchou-sku16.dtb' for 20240925080353.2362879-1-jakiela at google.com:

arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku0.dtb: /: compatible: 'oneOf' conditional failed, one must be fixed:
	['google,chinchou-sku0', 'google,chinchou-sku2', 'google,chinchou-sku4', 'google,chinchou-sku5', 'google,chinchou', 'mediatek,mt8186'] is too long
	['google,chinchou-sku0', 'google,chinchou-sku2', 'google,chinchou-sku4', 'google,chinchou-sku5', 'google,chinchou', 'mediatek,mt8186'] is too short
	'google,chinchou-sku0' is not one of ['mediatek,mt2701-evb']
	'google,chinchou-sku0' is not one of ['mediatek,mt2712-evb']
	'google,chinchou-sku0' is not one of ['mediatek,mt6580-evbp1']
	'google,chinchou-sku0' is not one of ['prestigio,pmt5008-3g']
	'google,chinchou-sku0' is not one of ['fairphone,fp1', 'mundoreader,bq-aquaris5']
	'google,chinchou-sku0' is not one of ['mediatek,mt6592-evb']
	'google,chinchou-sku0' is not one of ['mediatek,mt6755-evb']
	'google,chinchou-sku0' is not one of ['mediatek,mt6765-evb']
	'google,chinchou-sku0' is not one of ['mediatek,mt6779-evb']
	'google,chinchou-sku0' is not one of ['mediatek,mt6795-evb', 'sony,xperia-m5']
	'google,chinchou-sku0' is not one of ['archermind,mt6797-x20-dev', 'mediatek,mt6797-evb']
	'google,chinchou-sku0' is not one of ['bananapi,bpi-r64', 'mediatek,mt7622-rfb1']
	'google,chinchou-sku0' is not one of ['mediatek,mt7623a-rfb-emmc', 'mediatek,mt7623a-rfb-nand', 'mediatek,mt7623n-rfb-emmc', 'bananapi,bpi-r2']
	'google,chinchou-sku0' is not one of ['mediatek,mt7629-rfb']
	'google,chinchou-sku0' is not one of ['cudy,wr3000-v1', 'openwrt,one', 'xiaomi,ax3000t']
	'google,chinchou-sku0' is not one of ['acelink,ew-7886cax', 'bananapi,bpi-r3', 'bananapi,bpi-r3mini', 'mediatek,mt7986a-rfb']
	'google,chinchou-sku0' is not one of ['mediatek,mt7986b-rfb']
	'google,chinchou-sku0' is not one of ['bananapi,bpi-r4']
	'google,chinchou-sku0' is not one of ['mediatek,mt8127-moose']
	'google,chinchou-sku0' is not one of ['mediatek,mt8135-evbp1']
	'google,chinchou-sku0' is not one of ['mediatek,mt8167-pumpkin']
	'google,elm-rev8' was expected
	'google,hana-rev6' was expected
	'google,hana-rev7' was expected
	'google,chinchou-sku0' is not one of ['mediatek,mt8173-evb']
	'google,burnet' was expected
	'google,cozmo' was expected
	'google,damu' was expected
	'google,chinchou-sku0' is not one of ['google,fennel-sku0', 'google,fennel-sku1', 'google,fennel-sku2', 'google,fennel-sku6', 'google,fennel-sku7']
	'google,chinchou-sku0' is not one of ['google,juniper-sku16', 'google,juniper-sku17']
	'google,kakadu-rev3' was expected
	'google,kakadu-rev3-sku22' was expected
	'google,kappa' was expected
	'google,chinchou-sku0' is not one of ['google,katsu-sku32', 'google,katsu-sku38']
	'google,chinchou-sku0' is not one of ['google,kodama-sku16', 'google,kodama-sku272', 'google,kodama-sku288', 'google,kodama-sku32']
	'google,chinchou-sku0' is not one of ['google,krane-sku0', 'google,krane-sku176']
	'google,chinchou-sku0' is not one of ['google,makomo-sku0', 'google,makomo-sku1']
	'google,chinchou-sku0' is not one of ['google,pico-sku1', 'google,pico-sku2']
	'google,chinchou-sku0' is not one of ['google,willow-sku0', 'google,willow-sku1']
	'google,chinchou-sku0' is not one of ['mediatek,mt8183-evb']
	'google,chinchou-sku0' is not one of ['mediatek,mt8183-pumpkin']
	'google,chinchou-sku16' was expected
	'google,steelix-sku393219' was expected
	'google,steelix-sku393220' was expected
	'google,steelix-sku393221' was expected
	'google,steelix-sku196609' was expected
	'google,chinchou-sku0' is not one of ['google,steelix-sku131072', 'google,steelix-sku131073']
	'google,tentacruel-sku262147' was expected
	'google,tentacruel-sku262151' was expected
	'google,tentacruel-sku327681' was expected
	'google,tentacruel-sku327683' was expected
	'google,chinchou-sku0' is not one of ['google,voltorb-sku589824', 'google,voltorb-sku589825']
	'google,chinchou-sku0' is not one of ['mediatek,mt8186-evb']
	'google,chinchou-sku0' is not one of ['mediatek,mt8188-evb']
	'google,hayato-rev1' was expected
	'google,hayato-rev5-sku2' was expected
	'google,spherion-rev3' was expected
	'google,spherion-rev4' was expected
	'google,chinchou-sku0' is not one of ['mediatek,mt8192-evb']
	'google,chinchou-sku0' is not one of ['google,tomato-rev2', 'google,tomato-rev1']
	'google,tomato-rev4' was expected
	'google,dojo-sku7' was expected
	'google,chinchou-sku0' is not one of ['mediatek,mt8195-demo', 'mediatek,mt8195-evb']
	'google,chinchou-sku0' is not one of ['mediatek,mt8365-evk']
	'google,chinchou-sku0' is not one of ['mediatek,mt8390-evk']
	'google,chinchou-sku0' is not one of ['kontron,3-5-sbc-i1200', 'mediatek,mt8395-evk', 'radxa,nio-12l']
	'google,chinchou-sku0' is not one of ['mediatek,mt8516-pumpkin']
	'mediatek,mt2701' was expected
	'mediatek,mt2712' was expected
	'mediatek,mt6580' was expected
	'mediatek,mt6582' was expected
	'mediatek,mt6589' was expected
	'mediatek,mt6592' was expected
	'mediatek,mt6755' was expected
	'mediatek,mt6765' was expected
	'mediatek,mt6779' was expected
	'mediatek,mt6795' was expected
	'mediatek,mt6797' was expected
	'mediatek,mt7622' was expected
	'mediatek,mt7623' was expected
	'mediatek,mt7629' was expected
	'mediatek,mt7981b' was expected
	'mediatek,mt7986a' was expected
	'mediatek,mt7986b' was expected
	'mediatek,mt7988a' was expected
	'mediatek,mt8127' was expected
	'mediatek,mt8135' was expected
	'mediatek,mt8167' was expected
	'google,elm-rev7' was expected
	'google,hana-rev5' was expected
	'mediatek,mt8173' was expected
	'mediatek,mt8183' was expected
	'google,fennel' was expected
	'google,juniper' was expected
	'google,kakadu-rev2' was expected
	'google,kakadu-rev2-sku22' was expected
	'google,katsu' was expected
	'google,kodama' was expected
	'google,krane' was expected
	'google,makomo' was expected
	'google,pico' was expected
	'google,willow' was expected
	'google,chinchou-sku18' was expected
	'google,chinchou-sku1' was expected
	'google,steelix-sku393216' was expected
	'google,steelix-sku393217' was expected
	'google,steelix-sku393218' was expected
	'google,steelix-sku196608' was expected
	'google,steelix' was expected
	'google,tentacruel-sku262146' was expected
	'google,tentacruel-sku262150' was expected
	'google,tentacruel' was expected
	'google,voltorb' was expected
	'mediatek,mt8186' was expected
	'mediatek,mt8188' was expected
	'google,hayato' was expected
	'google,hayato-sku2' was expected
	'google,spherion-rev2' was expected
	'google,spherion' was expected
	'mediatek,mt8192' was expected
	'google,tomato' was expected
	'google,tomato-rev3' was expected
	'google,dojo-sku5' was expected
	'mediatek,mt8195' was expected
	'mediatek,mt8365' was expected
	'mediatek,mt8390' was expected
	'mediatek,mt8395' was expected
	'mediatek,mt8516' was expected
	'google,elm-rev6' was expected
	'google,hana-rev4' was expected
	'google,kakadu' was expected
	'google,chinchou-sku19' was expected
	'google,chinchou-sku2' was expected
	'google,tentacruel-sku262145' was expected
	'google,tentacruel-sku262149' was expected
	'google,spherion-rev1' was expected
	'google,dojo-sku3' was expected
	'google,elm-rev5' was expected
	'google,hana-rev3' was expected
	'google,chinchou-sku21' was expected
	'google,chinchou-sku3' was expected
	'google,tentacruel-sku262144' was expected
	'google,tentacruel-sku262148' was expected
	'google,spherion-rev0' was expected
	'google,dojo-sku1' was expected
	'google,elm-rev4' was expected
	'google,hana' was expected
	'google,chinchou-sku2147483647' was expected
	'google,chinchou-sku4' was expected
	'google,dojo' was expected
	'google,elm-rev3' was expected
	'google,chinchou-sku5' was expected
	from schema $id: http://devicetree.org/schemas/arm/mediatek.yaml#
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku1.dtb: /: compatible: 'oneOf' conditional failed, one must be fixed:
	['google,chinchou-sku1', 'google,chinchou-sku17', 'google,chinchou-sku3', 'google,chinchou-sku6', 'google,chinchou-sku7', 'google,chinchou-sku20', 'google,chinchou-sku22', 'google,chinchou-sku23', 'mediatek,mt8186'] is too long
	['google,chinchou-sku1', 'google,chinchou-sku17', 'google,chinchou-sku3', 'google,chinchou-sku6', 'google,chinchou-sku7', 'google,chinchou-sku20', 'google,chinchou-sku22', 'google,chinchou-sku23', 'mediatek,mt8186'] is too short
	'google,chinchou-sku1' is not one of ['mediatek,mt2701-evb']
	'google,chinchou-sku1' is not one of ['mediatek,mt2712-evb']
	'google,chinchou-sku1' is not one of ['mediatek,mt6580-evbp1']
	'google,chinchou-sku1' is not one of ['prestigio,pmt5008-3g']
	'google,chinchou-sku1' is not one of ['fairphone,fp1', 'mundoreader,bq-aquaris5']
	'google,chinchou-sku1' is not one of ['mediatek,mt6592-evb']
	'google,chinchou-sku1' is not one of ['mediatek,mt6755-evb']
	'google,chinchou-sku1' is not one of ['mediatek,mt6765-evb']
	'google,chinchou-sku1' is not one of ['mediatek,mt6779-evb']
	'google,chinchou-sku1' is not one of ['mediatek,mt6795-evb', 'sony,xperia-m5']
	'google,chinchou-sku1' is not one of ['archermind,mt6797-x20-dev', 'mediatek,mt6797-evb']
	'google,chinchou-sku1' is not one of ['bananapi,bpi-r64', 'mediatek,mt7622-rfb1']
	'google,chinchou-sku1' is not one of ['mediatek,mt7623a-rfb-emmc', 'mediatek,mt7623a-rfb-nand', 'mediatek,mt7623n-rfb-emmc', 'bananapi,bpi-r2']
	'google,chinchou-sku1' is not one of ['mediatek,mt7629-rfb']
	'google,chinchou-sku1' is not one of ['cudy,wr3000-v1', 'openwrt,one', 'xiaomi,ax3000t']
	'google,chinchou-sku1' is not one of ['acelink,ew-7886cax', 'bananapi,bpi-r3', 'bananapi,bpi-r3mini', 'mediatek,mt7986a-rfb']
	'google,chinchou-sku1' is not one of ['mediatek,mt7986b-rfb']
	'google,chinchou-sku1' is not one of ['bananapi,bpi-r4']
	'google,chinchou-sku1' is not one of ['mediatek,mt8127-moose']
	'google,chinchou-sku1' is not one of ['mediatek,mt8135-evbp1']
	'google,chinchou-sku1' is not one of ['mediatek,mt8167-pumpkin']
	'google,elm-rev8' was expected
	'google,hana-rev6' was expected
	'google,hana-rev7' was expected
	'google,chinchou-sku1' is not one of ['mediatek,mt8173-evb']
	'google,burnet' was expected
	'google,cozmo' was expected
	'google,damu' was expected
	'google,chinchou-sku1' is not one of ['google,fennel-sku0', 'google,fennel-sku1', 'google,fennel-sku2', 'google,fennel-sku6', 'google,fennel-sku7']
	'google,chinchou-sku1' is not one of ['google,juniper-sku16', 'google,juniper-sku17']
	'google,kakadu-rev3' was expected
	'google,kakadu-rev3-sku22' was expected
	'google,kappa' was expected
	'google,chinchou-sku1' is not one of ['google,katsu-sku32', 'google,katsu-sku38']
	'google,chinchou-sku1' is not one of ['google,kodama-sku16', 'google,kodama-sku272', 'google,kodama-sku288', 'google,kodama-sku32']
	'google,chinchou-sku1' is not one of ['google,krane-sku0', 'google,krane-sku176']
	'google,chinchou-sku1' is not one of ['google,makomo-sku0', 'google,makomo-sku1']
	'google,chinchou-sku1' is not one of ['google,pico-sku1', 'google,pico-sku2']
	'google,chinchou-sku1' is not one of ['google,willow-sku0', 'google,willow-sku1']
	'google,chinchou-sku1' is not one of ['mediatek,mt8183-evb']
	'google,chinchou-sku1' is not one of ['mediatek,mt8183-pumpkin']
	'google,chinchou-sku16' was expected
	'google,chinchou-sku0' was expected
	'google,steelix-sku393219' was expected
	'google,steelix-sku393220' was expected
	'google,steelix-sku393221' was expected
	'google,steelix-sku196609' was expected
	'google,chinchou-sku1' is not one of ['google,steelix-sku131072', 'google,steelix-sku131073']
	'google,tentacruel-sku262147' was expected
	'google,tentacruel-sku262151' was expected
	'google,tentacruel-sku327681' was expected
	'google,tentacruel-sku327683' was expected
	'google,chinchou-sku1' is not one of ['google,voltorb-sku589824', 'google,voltorb-sku589825']
	'google,chinchou-sku1' is not one of ['mediatek,mt8186-evb']
	'google,chinchou-sku1' is not one of ['mediatek,mt8188-evb']
	'google,hayato-rev1' was expected
	'google,hayato-rev5-sku2' was expected
	'google,spherion-rev3' was expected
	'google,spherion-rev4' was expected
	'google,chinchou-sku1' is not one of ['mediatek,mt8192-evb']
	'google,chinchou-sku1' is not one of ['google,tomato-rev2', 'google,tomato-rev1']
	'google,tomato-rev4' was expected
	'google,dojo-sku7' was expected
	'google,chinchou-sku1' is not one of ['mediatek,mt8195-demo', 'mediatek,mt8195-evb']
	'google,chinchou-sku1' is not one of ['mediatek,mt8365-evk']
	'google,chinchou-sku1' is not one of ['mediatek,mt8390-evk']
	'google,chinchou-sku1' is not one of ['kontron,3-5-sbc-i1200', 'mediatek,mt8395-evk', 'radxa,nio-12l']
	'google,chinchou-sku1' is not one of ['mediatek,mt8516-pumpkin']
	'mediatek,mt2701' was expected
	'mediatek,mt2712' was expected
	'mediatek,mt6580' was expected
	'mediatek,mt6582' was expected
	'mediatek,mt6589' was expected
	'mediatek,mt6592' was expected
	'mediatek,mt6755' was expected
	'mediatek,mt6765' was expected
	'mediatek,mt6779' was expected
	'mediatek,mt6795' was expected
	'mediatek,mt6797' was expected
	'mediatek,mt7622' was expected
	'mediatek,mt7623' was expected
	'mediatek,mt7629' was expected
	'mediatek,mt7981b' was expected
	'mediatek,mt7986a' was expected
	'mediatek,mt7986b' was expected
	'mediatek,mt7988a' was expected
	'mediatek,mt8127' was expected
	'mediatek,mt8135' was expected
	'mediatek,mt8167' was expected
	'google,elm-rev7' was expected
	'google,hana-rev5' was expected
	'mediatek,mt8173' was expected
	'mediatek,mt8183' was expected
	'google,fennel' was expected
	'google,juniper' was expected
	'google,kakadu-rev2' was expected
	'google,kakadu-rev2-sku22' was expected
	'google,katsu' was expected
	'google,kodama' was expected
	'google,krane' was expected
	'google,makomo' was expected
	'google,pico' was expected
	'google,willow' was expected
	'google,chinchou-sku18' was expected
	'google,chinchou-sku1' was expected
	'google,steelix-sku393216' was expected
	'google,steelix-sku393217' was expected
	'google,steelix-sku393218' was expected
	'google,steelix-sku196608' was expected
	'google,steelix' was expected
	'google,tentacruel-sku262146' was expected
	'google,tentacruel-sku262150' was expected
	'google,tentacruel' was expected
	'google,voltorb' was expected
	'mediatek,mt8186' was expected
	'mediatek,mt8188' was expected
	'google,hayato' was expected
	'google,hayato-sku2' was expected
	'google,spherion-rev2' was expected
	'google,spherion' was expected
	'mediatek,mt8192' was expected
	'google,tomato' was expected
	'google,tomato-rev3' was expected
	'google,dojo-sku5' was expected
	'mediatek,mt8195' was expected
	'mediatek,mt8365' was expected
	'mediatek,mt8390' was expected
	'mediatek,mt8395' was expected
	'mediatek,mt8516' was expected
	'google,elm-rev6' was expected
	'google,hana-rev4' was expected
	'google,kakadu' was expected
	'google,chinchou-sku19' was expected
	'google,chinchou-sku2' was expected
	'google,tentacruel-sku262145' was expected
	'google,tentacruel-sku262149' was expected
	'google,spherion-rev1' was expected
	'google,dojo-sku3' was expected
	'google,elm-rev5' was expected
	'google,hana-rev3' was expected
	'google,chinchou-sku21' was expected
	'google,chinchou-sku3' was expected
	'google,tentacruel-sku262144' was expected
	'google,tentacruel-sku262148' was expected
	'google,spherion-rev0' was expected
	'google,dojo-sku1' was expected
	'google,elm-rev4' was expected
	'google,hana' was expected
	'google,chinchou-sku2147483647' was expected
	'google,chinchou-sku4' was expected
	'google,dojo' was expected
	'google,elm-rev3' was expected
	'google,chinchou-sku5' was expected
	'google,elm' was expected
	'google,chinchou-sku6' was expected
	'google,chinchou-sku7' was expected
	'google,chinchou-sku17' was expected
	from schema $id: http://devicetree.org/schemas/arm/mediatek.yaml#
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku1.dtb: /: failed to match any schema with compatible: ['google,chinchou-sku1', 'google,chinchou-sku17', 'google,chinchou-sku3', 'google,chinchou-sku6', 'google,chinchou-sku7', 'google,chinchou-sku20', 'google,chinchou-sku22', 'google,chinchou-sku23', 'mediatek,mt8186']
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku0.dtb: pinctrl at 10005000: 'pin-report' does not match any of the regexes: '-pins$', 'pinctrl-[0-9]+'
	from schema $id: http://devicetree.org/schemas/pinctrl/mediatek,mt8186-pinctrl.yaml#
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku1.dtb: pinctrl at 10005000: 'pin-report' does not match any of the regexes: '-pins$', 'pinctrl-[0-9]+'
	from schema $id: http://devicetree.org/schemas/pinctrl/mediatek,mt8186-pinctrl.yaml#
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku16.dtb: pinctrl at 10005000: 'pin-report' does not match any of the regexes: '-pins$', 'pinctrl-[0-9]+'
	from schema $id: http://devicetree.org/schemas/pinctrl/mediatek,mt8186-pinctrl.yaml#
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku0.dtb: /soc/pwrap at 1000d000/pmic: failed to match any schema with compatible: ['mediatek,mt6366', 'mediatek,mt6358']
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku0.dtb: /soc/pwrap at 1000d000/pmic: failed to match any schema with compatible: ['mediatek,mt6366', 'mediatek,mt6358']
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku0.dtb: /soc/pwrap at 1000d000/pmic/codec: failed to match any schema with compatible: ['mediatek,mt6366-sound', 'mediatek,mt6358-sound']
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku0.dtb: /soc/pwrap at 1000d000/pmic/codec: failed to match any schema with compatible: ['mediatek,mt6366-sound', 'mediatek,mt6358-sound']
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku16.dtb: /soc/pwrap at 1000d000/pmic: failed to match any schema with compatible: ['mediatek,mt6366', 'mediatek,mt6358']
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku16.dtb: /soc/pwrap at 1000d000/pmic: failed to match any schema with compatible: ['mediatek,mt6366', 'mediatek,mt6358']
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku16.dtb: /soc/pwrap at 1000d000/pmic/codec: failed to match any schema with compatible: ['mediatek,mt6366-sound', 'mediatek,mt6358-sound']
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku16.dtb: /soc/pwrap at 1000d000/pmic/codec: failed to match any schema with compatible: ['mediatek,mt6366-sound', 'mediatek,mt6358-sound']
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku1.dtb: /soc/pwrap at 1000d000/pmic: failed to match any schema with compatible: ['mediatek,mt6366', 'mediatek,mt6358']
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku1.dtb: /soc/pwrap at 1000d000/pmic: failed to match any schema with compatible: ['mediatek,mt6366', 'mediatek,mt6358']
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku1.dtb: /soc/pwrap at 1000d000/pmic/codec: failed to match any schema with compatible: ['mediatek,mt6366-sound', 'mediatek,mt6358-sound']
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku1.dtb: /soc/pwrap at 1000d000/pmic/codec: failed to match any schema with compatible: ['mediatek,mt6366-sound', 'mediatek,mt6358-sound']
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku0.dtb: /soc/pwrap at 1000d000/pmic/rtc: failed to match any schema with compatible: ['mediatek,mt6366-rtc', 'mediatek,mt6358-rtc']
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku0.dtb: /soc/pwrap at 1000d000/pmic/rtc: failed to match any schema with compatible: ['mediatek,mt6366-rtc', 'mediatek,mt6358-rtc']
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku1.dtb: /soc/pwrap at 1000d000/pmic/rtc: failed to match any schema with compatible: ['mediatek,mt6366-rtc', 'mediatek,mt6358-rtc']
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku1.dtb: /soc/pwrap at 1000d000/pmic/rtc: failed to match any schema with compatible: ['mediatek,mt6366-rtc', 'mediatek,mt6358-rtc']
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku16.dtb: /soc/pwrap at 1000d000/pmic/rtc: failed to match any schema with compatible: ['mediatek,mt6366-rtc', 'mediatek,mt6358-rtc']
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku16.dtb: /soc/pwrap at 1000d000/pmic/rtc: failed to match any schema with compatible: ['mediatek,mt6366-rtc', 'mediatek,mt6358-rtc']
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku0.dtb: anx7625 at 58: 'ports' is a required property
	from schema $id: http://devicetree.org/schemas/display/bridge/analogix,anx7625.yaml#
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku0.dtb: anx7625 at 58: '#address-cells', '#size-cells', 'panel_flags', 'port at 0', 'port at 1' do not match any of the regexes: 'pinctrl-[0-9]+'
	from schema $id: http://devicetree.org/schemas/display/bridge/analogix,anx7625.yaml#
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku1.dtb: anx7625 at 58: 'ports' is a required property
	from schema $id: http://devicetree.org/schemas/display/bridge/analogix,anx7625.yaml#
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku1.dtb: anx7625 at 58: '#address-cells', '#size-cells', 'panel_flags', 'port at 0', 'port at 1' do not match any of the regexes: 'pinctrl-[0-9]+'
	from schema $id: http://devicetree.org/schemas/display/bridge/analogix,anx7625.yaml#
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku16.dtb: anx7625 at 58: 'ports' is a required property
	from schema $id: http://devicetree.org/schemas/display/bridge/analogix,anx7625.yaml#
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku16.dtb: anx7625 at 58: '#address-cells', '#size-cells', 'panel_flags', 'port at 0', 'port at 1' do not match any of the regexes: 'pinctrl-[0-9]+'
	from schema $id: http://devicetree.org/schemas/display/bridge/analogix,anx7625.yaml#
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku0.dtb: trackpad at 15: 'vcc-supply' does not match any of the regexes: 'pinctrl-[0-9]+'
	from schema $id: http://devicetree.org/schemas/input/hid-over-i2c.yaml#
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku0.dtb: dp-bridge at 5c: 'extcon' is a required property
	from schema $id: http://devicetree.org/schemas/display/bridge/ite,it6505.yaml#
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku1.dtb: touchscreen at 41: 'vcc33-supply' is a required property
	from schema $id: http://devicetree.org/schemas/input/ilitek,ili2901.yaml#
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku16.dtb: touchscreen at 41: 'vcc33-supply' is a required property
	from schema $id: http://devicetree.org/schemas/input/ilitek,ili2901.yaml#
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku1.dtb: trackpad at 15: 'vcc-supply' does not match any of the regexes: 'pinctrl-[0-9]+'
	from schema $id: http://devicetree.org/schemas/input/hid-over-i2c.yaml#
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku16.dtb: trackpad at 15: 'vcc-supply' does not match any of the regexes: 'pinctrl-[0-9]+'
	from schema $id: http://devicetree.org/schemas/input/hid-over-i2c.yaml#
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku1.dtb: dp-bridge at 5c: 'extcon' is a required property
	from schema $id: http://devicetree.org/schemas/display/bridge/ite,it6505.yaml#
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku0.dtb: rt5650 at 1a: 'cpvdd-supply' is a required property
	from schema $id: http://devicetree.org/schemas/sound/realtek,rt5645.yaml#
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku0.dtb: rt5650 at 1a: Unevaluated properties are not allowed ('cbj-sleeve-gpio' was unexpected)
	from schema $id: http://devicetree.org/schemas/sound/realtek,rt5645.yaml#
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku16.dtb: dp-bridge at 5c: 'extcon' is a required property
	from schema $id: http://devicetree.org/schemas/display/bridge/ite,it6505.yaml#
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku1.dtb: rt5650 at 1a: 'cpvdd-supply' is a required property
	from schema $id: http://devicetree.org/schemas/sound/realtek,rt5645.yaml#
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku1.dtb: rt5650 at 1a: Unevaluated properties are not allowed ('cbj-sleeve-gpio' was unexpected)
	from schema $id: http://devicetree.org/schemas/sound/realtek,rt5645.yaml#
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku16.dtb: rt5650 at 1a: 'cpvdd-supply' is a required property
	from schema $id: http://devicetree.org/schemas/sound/realtek,rt5645.yaml#
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku16.dtb: rt5650 at 1a: Unevaluated properties are not allowed ('cbj-sleeve-gpio' was unexpected)
	from schema $id: http://devicetree.org/schemas/sound/realtek,rt5645.yaml#
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku0.dtb: thermal-zones: 'cpu-ntc', 'pmic-ntc' do not match any of the regexes: '^[a-zA-Z][a-zA-Z0-9\-]{1,10}-thermal$', 'pinctrl-[0-9]+'
	from schema $id: http://devicetree.org/schemas/thermal/thermal-zones.yaml#
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku1.dtb: thermal-zones: 'cpu-ntc', 'pmic-ntc' do not match any of the regexes: '^[a-zA-Z][a-zA-Z0-9\-]{1,10}-thermal$', 'pinctrl-[0-9]+'
	from schema $id: http://devicetree.org/schemas/thermal/thermal-zones.yaml#
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku16.dtb: thermal-zones: 'cpu-ntc', 'pmic-ntc' do not match any of the regexes: '^[a-zA-Z][a-zA-Z0-9\-]{1,10}-thermal$', 'pinctrl-[0-9]+'
	from schema $id: http://devicetree.org/schemas/thermal/thermal-zones.yaml#
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku0.dtb: sound: 'model' is a required property
	from schema $id: http://devicetree.org/schemas/sound/mt8186-mt6366-rt1019-rt5682s.yaml#
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku1.dtb: sound: 'model' is a required property
	from schema $id: http://devicetree.org/schemas/sound/mt8186-mt6366-rt1019-rt5682s.yaml#
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku16.dtb: sound: 'model' is a required property
	from schema $id: http://devicetree.org/schemas/sound/mt8186-mt6366-rt1019-rt5682s.yaml#
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku0.dtb: regulator-pp1800-tchscr-report-disable: Unevaluated properties are not allowed ('enable-active-low' was unexpected)
	from schema $id: http://devicetree.org/schemas/regulator/fixed-regulator.yaml#
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku1.dtb: regulator-pp1800-tchscr-report-disable: Unevaluated properties are not allowed ('enable-active-low' was unexpected)
	from schema $id: http://devicetree.org/schemas/regulator/fixed-regulator.yaml#
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku16.dtb: regulator-pp1800-tchscr-report-disable: Unevaluated properties are not allowed ('enable-active-low' was unexpected)
	from schema $id: http://devicetree.org/schemas/regulator/fixed-regulator.yaml#







From luiz.dentz at gmail.com  Wed Sep 25 08:03:13 2024
From: luiz.dentz at gmail.com (Luiz Augusto von Dentz)
Date: Wed, 25 Sep 2024 11:03:13 -0400
Subject: [PATCH] Bluetooth: btusb: Add USB HW IDs for MT7920/MT7925
In-Reply-To: <20240916032228.6601-1-jiande.lu@mediatek.com>
References: <20240916032228.6601-1-jiande.lu@mediatek.com>
Message-ID: <CABBYNZJQ4WVAgTPpQBsPp+wBqymN_inisdFZXoMT_b9YdXf2Jw@mail.gmail.com>

Hi Jiande,

On Sun, Sep 15, 2024 at 11:22?PM Jiande Lu <jiande.lu at mediatek.com> wrote:
>
> Add HW IDs for wireless module. These HW IDs are extracted from
> Windows driver inf file and the test for card bring up successful.

Well this is not enough if we don't have firmware published for them,
or you have confirmed that firmware is available and it does load
properly? In that case please add the information about the firmware
as well and perhaps some logs that it can be loaded properly.

> Signed-off-by: Jiande Lu <jiande.lu at mediatek.com>
> ---
>  drivers/bluetooth/btusb.c | 12 ++++++++++++
>  1 file changed, 12 insertions(+)
>
> diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
> index 6c9c761d5b93..8946aafae640 100644
> --- a/drivers/bluetooth/btusb.c
> +++ b/drivers/bluetooth/btusb.c
> @@ -563,6 +563,16 @@ static const struct usb_device_id quirks_table[] = {
>         { USB_DEVICE(0x043e, 0x3109), .driver_info = BTUSB_MEDIATEK |
>                                                      BTUSB_WIDEBAND_SPEECH },
>
> +       /* Additional MediaTek MT7920 Bluetooth devices */
> +       { USB_DEVICE(0x0489, 0xe134), .driver_info = BTUSB_MEDIATEK |
> +                                                    BTUSB_WIDEBAND_SPEECH },
> +       { USB_DEVICE(0x13d3, 0x3620), .driver_info = BTUSB_MEDIATEK |
> +                                                    BTUSB_WIDEBAND_SPEECH },
> +       { USB_DEVICE(0x13d3, 0x3621), .driver_info = BTUSB_MEDIATEK |
> +                                                    BTUSB_WIDEBAND_SPEECH },
> +       { USB_DEVICE(0x13d3, 0x3622), .driver_info = BTUSB_MEDIATEK |
> +                                                    BTUSB_WIDEBAND_SPEECH },
> +
>         /* Additional MediaTek MT7921 Bluetooth devices */
>         { USB_DEVICE(0x0489, 0xe0c8), .driver_info = BTUSB_MEDIATEK |
>                                                      BTUSB_WIDEBAND_SPEECH },
> @@ -636,6 +646,8 @@ static const struct usb_device_id quirks_table[] = {
>                                                      BTUSB_WIDEBAND_SPEECH },
>         { USB_DEVICE(0x0489, 0xe11e), .driver_info = BTUSB_MEDIATEK |
>                                                      BTUSB_WIDEBAND_SPEECH },
> +       { USB_DEVICE(0x0489, 0xe139), .driver_info = BTUSB_MEDIATEK |
> +                                                    BTUSB_WIDEBAND_SPEECH },
>         { USB_DEVICE(0x13d3, 0x3602), .driver_info = BTUSB_MEDIATEK |
>                                                      BTUSB_WIDEBAND_SPEECH },
>         { USB_DEVICE(0x13d3, 0x3603), .driver_info = BTUSB_MEDIATEK |
> --
> 2.45.2
>


-- 
Luiz Augusto von Dentz


From javier.carrasco.cruz at gmail.com  Wed Sep 25 08:42:39 2024
From: javier.carrasco.cruz at gmail.com (Javier Carrasco)
Date: Wed, 25 Sep 2024 17:42:39 +0200
Subject: [PATCH 0/6] drm: constify read-only regmap structs
Message-ID: <20240925-drm-const-regmap-v1-0-e609d502401b@gmail.com>

This series adds the const modifier to the remaining regmap_bus and
regmap_config structs under drm/ that are effectively used as const
(i.e., only read after their declaration), but kept ad writtable data.

Signed-off-by: Javier Carrasco <javier.carrasco.cruz at gmail.com>
---
Javier Carrasco (6):
      drm/bridge: dpc3433: Constify struct regmap_config
      drm/fsl-dcu: Constify struct regmap_config
      drm/mediatek: dp: Constify struct regmap_config
      drm/meson: Constify struct regmap_config
      drm/panel: ili9322: Constify struct regmap_bus
      drm/sprd: Constify struct regmap_bus

 drivers/gpu/drm/bridge/ti-dlpc3433.c         | 2 +-
 drivers/gpu/drm/fsl-dcu/fsl_tcon.c           | 2 +-
 drivers/gpu/drm/mediatek/mtk_dp.c            | 2 +-
 drivers/gpu/drm/meson/meson_drv.c            | 2 +-
 drivers/gpu/drm/panel/panel-ilitek-ili9322.c | 2 +-
 drivers/gpu/drm/sprd/sprd_dsi.c              | 2 +-
 6 files changed, 6 insertions(+), 6 deletions(-)
---
base-commit: 2b7275670032a98cba266bd1b8905f755b3e650f
change-id: 20240925-drm-const-regmap-307f2c358d10

Best regards,
-- 
Javier Carrasco <javier.carrasco.cruz at gmail.com>



From javier.carrasco.cruz at gmail.com  Wed Sep 25 08:42:40 2024
From: javier.carrasco.cruz at gmail.com (Javier Carrasco)
Date: Wed, 25 Sep 2024 17:42:40 +0200
Subject: [PATCH 1/6] drm/bridge: dpc3433: Constify struct regmap_config
In-Reply-To: <20240925-drm-const-regmap-v1-0-e609d502401b@gmail.com>
References: <20240925-drm-const-regmap-v1-0-e609d502401b@gmail.com>
Message-ID: <20240925-drm-const-regmap-v1-1-e609d502401b@gmail.com>

`dlpc_regmap_config` is not modified and can be declared as const to
move its data to a read-only section.

Signed-off-by: Javier Carrasco <javier.carrasco.cruz at gmail.com>
---
 drivers/gpu/drm/bridge/ti-dlpc3433.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/bridge/ti-dlpc3433.c b/drivers/gpu/drm/bridge/ti-dlpc3433.c
index 6b559e071301..a0a1b5dd794e 100644
--- a/drivers/gpu/drm/bridge/ti-dlpc3433.c
+++ b/drivers/gpu/drm/bridge/ti-dlpc3433.c
@@ -94,7 +94,7 @@ static const struct regmap_access_table dlpc_volatile_table = {
 	.n_yes_ranges = ARRAY_SIZE(dlpc_volatile_ranges),
 };
 
-static struct regmap_config dlpc_regmap_config = {
+static const struct regmap_config dlpc_regmap_config = {
 	.reg_bits		= 8,
 	.val_bits		= 8,
 	.max_register		= WR_DSI_PORT_EN,

-- 
2.43.0



From javier.carrasco.cruz at gmail.com  Wed Sep 25 08:42:41 2024
From: javier.carrasco.cruz at gmail.com (Javier Carrasco)
Date: Wed, 25 Sep 2024 17:42:41 +0200
Subject: [PATCH 2/6] drm/fsl-dcu: Constify struct regmap_config
In-Reply-To: <20240925-drm-const-regmap-v1-0-e609d502401b@gmail.com>
References: <20240925-drm-const-regmap-v1-0-e609d502401b@gmail.com>
Message-ID: <20240925-drm-const-regmap-v1-2-e609d502401b@gmail.com>

`fsl_tcon_regmap_config` is not modified and can be declared as const to
move its data to a read-only section.

Signed-off-by: Javier Carrasco <javier.carrasco.cruz at gmail.com>
---
 drivers/gpu/drm/fsl-dcu/fsl_tcon.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/fsl-dcu/fsl_tcon.c b/drivers/gpu/drm/fsl-dcu/fsl_tcon.c
index 9eb5abaf7d66..49bbd00c77ae 100644
--- a/drivers/gpu/drm/fsl-dcu/fsl_tcon.c
+++ b/drivers/gpu/drm/fsl-dcu/fsl_tcon.c
@@ -29,7 +29,7 @@ void fsl_tcon_bypass_enable(struct fsl_tcon *tcon)
 			   FSL_TCON_CTRL1_TCON_BYPASS);
 }
 
-static struct regmap_config fsl_tcon_regmap_config = {
+static const struct regmap_config fsl_tcon_regmap_config = {
 	.reg_bits = 32,
 	.reg_stride = 4,
 	.val_bits = 32,

-- 
2.43.0



From javier.carrasco.cruz at gmail.com  Wed Sep 25 08:42:42 2024
From: javier.carrasco.cruz at gmail.com (Javier Carrasco)
Date: Wed, 25 Sep 2024 17:42:42 +0200
Subject: [PATCH 3/6] drm/mediatek: dp: Constify struct regmap_config
In-Reply-To: <20240925-drm-const-regmap-v1-0-e609d502401b@gmail.com>
References: <20240925-drm-const-regmap-v1-0-e609d502401b@gmail.com>
Message-ID: <20240925-drm-const-regmap-v1-3-e609d502401b@gmail.com>

`mtk_dp_regmap_config` is not modified and can be declared as const to
move its data to a read-only section.

Signed-off-by: Javier Carrasco <javier.carrasco.cruz at gmail.com>
---
 drivers/gpu/drm/mediatek/mtk_dp.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/mediatek/mtk_dp.c b/drivers/gpu/drm/mediatek/mtk_dp.c
index d8796a904eca..f0f6f402994a 100644
--- a/drivers/gpu/drm/mediatek/mtk_dp.c
+++ b/drivers/gpu/drm/mediatek/mtk_dp.c
@@ -311,7 +311,7 @@ static const struct mtk_dp_efuse_fmt mt8195_dp_efuse_fmt[MTK_DP_CAL_MAX] = {
 	},
 };
 
-static struct regmap_config mtk_dp_regmap_config = {
+static const struct regmap_config mtk_dp_regmap_config = {
 	.reg_bits = 32,
 	.val_bits = 32,
 	.reg_stride = 4,

-- 
2.43.0



From javier.carrasco.cruz at gmail.com  Wed Sep 25 08:42:43 2024
From: javier.carrasco.cruz at gmail.com (Javier Carrasco)
Date: Wed, 25 Sep 2024 17:42:43 +0200
Subject: [PATCH 4/6] drm/meson: Constify struct regmap_config
In-Reply-To: <20240925-drm-const-regmap-v1-0-e609d502401b@gmail.com>
References: <20240925-drm-const-regmap-v1-0-e609d502401b@gmail.com>
Message-ID: <20240925-drm-const-regmap-v1-4-e609d502401b@gmail.com>

`meson_regmap_config` is not modified and can be declared as const to
move its data to a read-only section.

Signed-off-by: Javier Carrasco <javier.carrasco.cruz at gmail.com>
---
 drivers/gpu/drm/meson/meson_drv.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/meson/meson_drv.c b/drivers/gpu/drm/meson/meson_drv.c
index 4bd0baa2a4f5..6c8677d1f562 100644
--- a/drivers/gpu/drm/meson/meson_drv.c
+++ b/drivers/gpu/drm/meson/meson_drv.c
@@ -126,7 +126,7 @@ static bool meson_vpu_has_available_connectors(struct device *dev)
 	return false;
 }
 
-static struct regmap_config meson_regmap_config = {
+static const struct regmap_config meson_regmap_config = {
 	.reg_bits       = 32,
 	.val_bits       = 32,
 	.reg_stride     = 4,

-- 
2.43.0



From javier.carrasco.cruz at gmail.com  Wed Sep 25 08:42:44 2024
From: javier.carrasco.cruz at gmail.com (Javier Carrasco)
Date: Wed, 25 Sep 2024 17:42:44 +0200
Subject: [PATCH 5/6] drm/panel: ili9322: Constify struct regmap_bus
In-Reply-To: <20240925-drm-const-regmap-v1-0-e609d502401b@gmail.com>
References: <20240925-drm-const-regmap-v1-0-e609d502401b@gmail.com>
Message-ID: <20240925-drm-const-regmap-v1-5-e609d502401b@gmail.com>

`ili9322_regmap_bus` is not modified and can be declared as const to
move its data to a read-only section.

Signed-off-by: Javier Carrasco <javier.carrasco.cruz at gmail.com>
---
 drivers/gpu/drm/panel/panel-ilitek-ili9322.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/panel/panel-ilitek-ili9322.c b/drivers/gpu/drm/panel/panel-ilitek-ili9322.c
index 4a6dcfd781e8..94b7dfef3b5e 100644
--- a/drivers/gpu/drm/panel/panel-ilitek-ili9322.c
+++ b/drivers/gpu/drm/panel/panel-ilitek-ili9322.c
@@ -318,7 +318,7 @@ static int ili9322_regmap_spi_read(void *context, const void *reg,
 	return spi_write_then_read(spi, buf, 1, val, 1);
 }
 
-static struct regmap_bus ili9322_regmap_bus = {
+static const struct regmap_bus ili9322_regmap_bus = {
 	.write = ili9322_regmap_spi_write,
 	.read = ili9322_regmap_spi_read,
 	.reg_format_endian_default = REGMAP_ENDIAN_BIG,

-- 
2.43.0



From javier.carrasco.cruz at gmail.com  Wed Sep 25 08:42:45 2024
From: javier.carrasco.cruz at gmail.com (Javier Carrasco)
Date: Wed, 25 Sep 2024 17:42:45 +0200
Subject: [PATCH 6/6] drm/sprd: Constify struct regmap_bus
In-Reply-To: <20240925-drm-const-regmap-v1-0-e609d502401b@gmail.com>
References: <20240925-drm-const-regmap-v1-0-e609d502401b@gmail.com>
Message-ID: <20240925-drm-const-regmap-v1-6-e609d502401b@gmail.com>

`regmap_txt_io` is not modified and can be declared as const to
move its data to a read-only section.

Signed-off-by: Javier Carrasco <javier.carrasco.cruz at gmail.com>
---
 drivers/gpu/drm/sprd/sprd_dsi.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/sprd/sprd_dsi.c b/drivers/gpu/drm/sprd/sprd_dsi.c
index 0b69c140eab3..44a7a579660f 100644
--- a/drivers/gpu/drm/sprd/sprd_dsi.c
+++ b/drivers/gpu/drm/sprd/sprd_dsi.c
@@ -209,7 +209,7 @@ static int regmap_tst_io_read(void *context, u32 reg, u32 *val)
 	return 0;
 }
 
-static struct regmap_bus regmap_tst_io = {
+static const struct regmap_bus regmap_tst_io = {
 	.reg_write = regmap_tst_io_write,
 	.reg_read = regmap_tst_io_read,
 };

-- 
2.43.0



From bvanassche at acm.org  Wed Sep 25 09:49:36 2024
From: bvanassche at acm.org (Bart Van Assche)
Date: Wed, 25 Sep 2024 09:49:36 -0700
Subject: [PATCH v9 2/3] ufs: core: fix error handler process for MCQ abort
In-Reply-To: <20240925095546.19492-3-peter.wang@mediatek.com>
References: <20240925095546.19492-1-peter.wang@mediatek.com>
 <20240925095546.19492-3-peter.wang@mediatek.com>
Message-ID: <949fb86d-6b61-4a1a-bc04-c05bb30522b9@acm.org>

On 9/25/24 2:55 AM, peter.wang at mediatek.com wrote:
>   	case OCS_INVALID_COMMAND_STATUS:
>   		result |= DID_REQUEUE << 16;
> +		dev_warn(hba->dev,
> +				"OCS invaild from controller for tag %d\n",
> +				lrbp->task_tag);

Please change "invaild" into "invalid". Once that change has been made,
feel free to add:

Reviewed-by: Bart Van Assche <bvanassche at acm.org>


From bvanassche at acm.org  Wed Sep 25 09:56:13 2024
From: bvanassche at acm.org (Bart Van Assche)
Date: Wed, 25 Sep 2024 09:56:13 -0700
Subject: [PATCH v9 3/3] ufs: core: add a quirk for MediaTek SDB mode
 aborted
In-Reply-To: <20240925095546.19492-4-peter.wang@mediatek.com>
References: <20240925095546.19492-1-peter.wang@mediatek.com>
 <20240925095546.19492-4-peter.wang@mediatek.com>
Message-ID: <03b34628-d70b-4ce6-ad87-3c2070105bfa@acm.org>

On 9/25/24 2:55 AM, peter.wang at mediatek.com wrote:
> From: Peter Wang <peter.wang at mediatek.com>
> 
> Because the MediaTek UFS controller uses UTRLCLR to clear commands
> and fills the OCS with ABORTED, this patch introduces a quirk to
> treat ABORTED as INVALID_OCS_VALUE.
> 
> Signed-off-by: Peter Wang <peter.wang at mediatek.com>
> ---
>   drivers/ufs/core/ufshcd.c       | 5 ++++-
>   drivers/ufs/host/ufs-mediatek.c | 1 +
>   include/ufs/ufshcd.h            | 6 ++++++
>   3 files changed, 11 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
> index 4fff929b70d6..d429817fca94 100644
> --- a/drivers/ufs/core/ufshcd.c
> +++ b/drivers/ufs/core/ufshcd.c
> @@ -5404,7 +5404,10 @@ ufshcd_transfer_rsp_status(struct ufs_hba *hba, struct ufshcd_lrb *lrbp,
>   		}
>   		break;
>   	case OCS_ABORTED:
> -		result |= DID_ABORT << 16;
> +		if (hba->quirks & UFSHCD_QUIRK_OCS_ABORTED)
> +			result |= DID_REQUEUE << 16;
> +		else
> +			result |= DID_ABORT << 16;
>   		dev_warn(hba->dev,
>   				"OCS aborted from controller for tag %d\n",
>   				lrbp->task_tag);
> diff --git a/drivers/ufs/host/ufs-mediatek.c b/drivers/ufs/host/ufs-mediatek.c
> index 02c9064284e1..8a4c1b8f5a26 100644
> --- a/drivers/ufs/host/ufs-mediatek.c
> +++ b/drivers/ufs/host/ufs-mediatek.c
> @@ -1021,6 +1021,7 @@ static int ufs_mtk_init(struct ufs_hba *hba)
>   	hba->quirks |= UFSHCI_QUIRK_SKIP_MANUAL_WB_FLUSH_CTRL;
>   	hba->quirks |= UFSHCD_QUIRK_MCQ_BROKEN_INTR;
>   	hba->quirks |= UFSHCD_QUIRK_MCQ_BROKEN_RTC;
> +	hba->quirks |= UFSHCD_QUIRK_OCS_ABORTED;
>   	hba->vps->wb_flush_threshold = UFS_WB_BUF_REMAIN_PERCENT(80);
>   
>   	if (host->caps & UFS_MTK_CAP_DISABLE_AH8)
> diff --git a/include/ufs/ufshcd.h b/include/ufs/ufshcd.h
> index 0fd2aebac728..8f156803d703 100644
> --- a/include/ufs/ufshcd.h
> +++ b/include/ufs/ufshcd.h
> @@ -684,6 +684,12 @@ enum ufshcd_quirks {
>   	 * single doorbell mode.
>   	 */
>   	UFSHCD_QUIRK_BROKEN_LSDBS_CAP			= 1 << 25,
> +
> +	/*
> +	 * Some host controllers set OCS_ABORTED after UTRLCLR (SDB mode),
> +	 * this quirk is set to treat OCS: ABORTED as INVALID_OCS_VALUE
> +	 */
> +	UFSHCD_QUIRK_OCS_ABORTED			= 1 << 26,
>   };
>   
>   enum ufshcd_caps {

ufshcd_transfer_rsp_status() only has one caller, namely 
ufshcd_compl_one_cqe(). The previous patch makes sure that that 
ufshcd_compl_one_cqe() is not called if a SCSI command is aborted. So
why does this patch modify how OCS_ABORTED is processed? Is this patch
necessary or can it perhaps be dropped?

Thanks,

Bart.


From macpaul.lin at mediatek.com  Wed Sep 25 10:11:55 2024
From: macpaul.lin at mediatek.com (Macpaul Lin)
Date: Thu, 26 Sep 2024 01:11:55 +0800
Subject: [PATCH 1/2] dt-bindings: mfd: mediatek: mt6397: add adc and regulators for mt6359
Message-ID: <20240925171156.9115-1-macpaul.lin@mediatek.com>

Since MT6359 PMIC has been added as one of the compatibles of
"mediatek,mt6397.yaml", the sub-device node of "MT6359 PMIC AUXADC" and
"MT6359 PMIC Regulators" should also be contained in this DT Schema as
well.

This patch includes:
 - add 'adc' property and $ref for 'mediatek,mt6359-auxadc'.
 - add 'mt6359-regulator' to the compatibles of regulators.

Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
---
 Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml b/Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml
index 953358bc997a..40cabaf60d0d 100644
--- a/Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml
+++ b/Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml
@@ -17,6 +17,7 @@ description: |
   MT6397/MT6323 is a multifunction device with the following sub modules:
   - Regulators
   - RTC
+  - ADC
   - Audio codec
   - GPIO
   - Clock
@@ -86,6 +87,7 @@ properties:
           - enum:
               - mediatek,mt6323-regulator
               - mediatek,mt6358-regulator
+              - mediatek,mt6359-regulator
               - mediatek,mt6397-regulator
           - items:
               - enum:
@@ -95,6 +97,11 @@ properties:
     required:
       - compatible
 
+  adc:
+    type: object
+    $ref: /schemas/iio/adc/mediatek,mt6359-auxadc.yaml#
+    unevaluatedProperties: false
+
   audio-codec:
     type: object
     additionalProperties: false
-- 
2.45.2



From macpaul.lin at mediatek.com  Wed Sep 25 10:11:56 2024
From: macpaul.lin at mediatek.com (Macpaul Lin)
Date: Thu, 26 Sep 2024 01:11:56 +0800
Subject: [PATCH 2/2] arm64: dts: mediatek: mt6359: fix dtbs_check error for RTC and regulators
In-Reply-To: <20240925171156.9115-1-macpaul.lin@mediatek.com>
References: <20240925171156.9115-1-macpaul.lin@mediatek.com>
Message-ID: <20240925171156.9115-2-macpaul.lin@mediatek.com>

This patch fixes the following dtbs_check errors:
1. 'mt6359rtc' do not match any of the regexes: 'pinctrl-[0-9]+'
 - Update 'mt6359rtc' in 'mt6359.dtsi' with a generic device name 'rtc'
2. 'pmic: regulators: 'compatible' is a required property'
 - Add 'mediatek,mt6359-regulator' to compatible property.

Fixes: 3b7d143be4b7 ("arm64: dts: mt6359: add PMIC MT6359 related nodes")
Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
---
 arch/arm64/boot/dts/mediatek/mt6359.dtsi | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/arch/arm64/boot/dts/mediatek/mt6359.dtsi b/arch/arm64/boot/dts/mediatek/mt6359.dtsi
index 8e1b8c85c6ed..dd732a820a7c 100644
--- a/arch/arm64/boot/dts/mediatek/mt6359.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt6359.dtsi
@@ -18,6 +18,8 @@ mt6359codec: mt6359codec {
 		};
 
 		regulators {
+			compatible = "mediatek,mt6359-regulator";
+
 			mt6359_vs1_buck_reg: buck_vs1 {
 				regulator-name = "vs1";
 				regulator-min-microvolt = <800000>;
@@ -296,7 +298,7 @@ mt6359_vsram_others_sshub_ldo: ldo_vsram_others_sshub {
 			};
 		};
 
-		mt6359rtc: mt6359rtc {
+		mt6359_rtc: rtc {
 			compatible = "mediatek,mt6358-rtc";
 		};
 	};
-- 
2.45.2



From ck.hu at mediatek.com  Wed Sep 25 19:34:40 2024
From: ck.hu at mediatek.com (=?utf-8?B?Q0sgSHUgKOiDoeS/iuWFiSk=?=)
Date: Thu, 26 Sep 2024 02:34:40 +0000
Subject: [PATCH v5 2/2] drm/mediatek: Add blend_modes to mtk_plane_init()
 for different SoCs
In-Reply-To: <20240925101927.17042-3-jason-jh.lin@mediatek.com>
References: <20240925101927.17042-1-jason-jh.lin@mediatek.com>
	 <20240925101927.17042-3-jason-jh.lin@mediatek.com>
Message-ID: <bcdabb15b002c47512358cfabdfb49bc12f42596.camel@mediatek.com>

Hi, Jason:

On Wed, 2024-09-25 at 18:19 +0800, Jason-JH.Lin wrote:
> Since some SoCs support premultiplied pixel formats but some do not,
> the blend_modes parameter is added to mtk_plane_init(), which is
> obtained from the mtk_ddp_comp_get_blend_modes function implemented
> in different OVL components.
> 
> The OVL component can use driver data to set the blend mode
> capabilities for different SoCs.
> 
> Fixes: 4225d5d5e779 ("drm/mediatek: Support alpha blending in display driver")
> Signed-off-by: Jason-JH.Lin <jason-jh.lin at mediatek.com>
> ---

[snip]

> +
>  const u32 *mtk_ovl_get_formats(struct device *dev)
>  {
>  	struct mtk_disp_ovl *ovl = dev_get_drvdata(dev);
> @@ -674,6 +682,8 @@ static const struct mtk_disp_ovl_data mt2701_ovl_driver_data = {
>  	.layer_nr = 4,
>  	.fmt_convert = mtk_ovl_fmt_convert,
>  	.fmt_rgb565_is_0 = false,
> +	.blend_modes = BIT(DRM_MODE_BLEND_COVERAGE) |
> +		       BIT(DRM_MODE_BLEND_PIXEL_NONE),

When blend_modes has no pre-multiplied, fmt_convert is mtk_ovl_fmt_convert().
When blend_modes pre-multiplied, fmt_convert is mtk_ovl_fmt_convert_with_blend().

I think we could keep blend_modes and drop fmt_convert.

if (data->blend_modes & BIT(DRM_MODE_BLEND_PREMULTI))
	mtk_ovl_fmt_convert_with_blend(fmt, blend_modes);
else
	mtk_ovl_fmt_convert(fmt);

In current patch, when SoC does not support pre-multiplied but user space set pre-multiplied buffer,
driver would keep going and treat it as coverage buffer.

I think the result is wrong but it's error handling.
If we accept this error, why not keep only mtk_ovl_fmt_convert_with_blend() and drop mtk_ovl_fmt_convert().

if (data->blend_modes & BIT(DRM_MODE_BLEND_PREMULTI))
	mtk_ovl_fmt_convert_with_blend(fmt, blend_modes);
else
	mtk_ovl_fmt_convert_with_blend(fmt, blend_modes);

and this would result in:

mtk_ovl_fmt_convert_with_blend(fmt, blend_modes);


>  	.formats = mt8173_formats,
>  	.num_formats = ARRAY_SIZE(mt8173_formats),
>  };

[snip]

> @@ -715,6 +731,9 @@ static const struct mtk_disp_ovl_data mt8192_ovl_driver_data = {
>  	.fmt_convert = mtk_ovl_fmt_convert_with_blend,
>  	.fmt_rgb565_is_0 = true,
>  	.smi_id_en = true,
> +	.blend_modes = BIT(DRM_MODE_BLEND_PREMULTI) |
> +		       BIT(DRM_MODE_BLEND_COVERAGE) |
> +		       BIT(DRM_MODE_BLEND_PIXEL_NONE),
>  	.formats = mt8173_formats,
>  	.num_formats = ARRAY_SIZE(mt8173_formats),
>  };

[snip]

> diff --git a/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c b/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c
> index c6768210b08b..2d47b6eb4c19 100644
> --- a/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c
> +++ b/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c
> @@ -400,6 +400,13 @@ void mtk_ovl_adaptor_disable_vblank(struct device *dev)
>  	mtk_ethdr_disable_vblank(ovl_adaptor->ovl_adaptor_comp[OVL_ADAPTOR_ETHDR0]);
>  }
>  
> +const u32 mtk_ovl_adaptor_get_blend_modes(struct device *dev)
> +{
> +	struct mtk_disp_ovl_adaptor *ovl_adaptor = dev_get_drvdata(dev);
> +
> +	return mtk_mdp_rdma_get_blend_modes(ovl_adaptor->ovl_adaptor_comp[OVL_ADAPTOR_MDP_RDMA0]);

RDMA has no alpha blending function.
Get blend mode from ethdr.

> +}
> +
>  

[snip]

>  
> @@ -366,10 +366,7 @@ int mtk_plane_init(struct drm_device *dev, struct drm_plane *plane,
>  	if (err)
>  		DRM_ERROR("failed to create property: alpha\n");
>  
> -	err = drm_plane_create_blend_mode_property(plane,
> -						   BIT(DRM_MODE_BLEND_PREMULTI) |
> -						   BIT(DRM_MODE_BLEND_COVERAGE) |
> -						   BIT(DRM_MODE_BLEND_PIXEL_NONE));
> +	err = drm_plane_create_blend_mode_property(plane, blend_modes);

For disp_rdma, blend_modes is 0, I this is not necessary to create blend mode property.

Regards,
CK

>  	if (err)
>  		DRM_ERROR("failed to create property: blend_mode\n");
>  
> diff --git a/drivers/gpu/drm/mediatek/mtk_plane.h b/drivers/gpu/drm/mediatek/mtk_plane.h
> index 5b177eac67b7..3b13b89989c7 100644
> --- a/drivers/gpu/drm/mediatek/mtk_plane.h
> +++ b/drivers/gpu/drm/mediatek/mtk_plane.h
> @@ -48,6 +48,6 @@ to_mtk_plane_state(struct drm_plane_state *state)
>  
>  int mtk_plane_init(struct drm_device *dev, struct drm_plane *plane,
>  		   unsigned long possible_crtcs, enum drm_plane_type type,
> -		   unsigned int supported_rotations, const u32 *formats,
> -		   size_t num_formats, unsigned int plane_idx);
> +		   unsigned int supported_rotations, const u32 blend_modes,
> +		   const u32 *formats, size_t num_formats, unsigned int plane_idx);
>  #endif

From robh at kernel.org  Wed Sep 25 19:47:17 2024
From: robh at kernel.org (Rob Herring (Arm))
Date: Wed, 25 Sep 2024 21:47:17 -0500
Subject: [PATCH 1/2] dt-bindings: mfd: mediatek: mt6397: add adc and
 regulators for mt6359
In-Reply-To: <20240925171156.9115-1-macpaul.lin@mediatek.com>
References: <20240925171156.9115-1-macpaul.lin@mediatek.com>
Message-ID: <172731883694.2430476.10157265874067724564.robh@kernel.org>


On Thu, 26 Sep 2024 01:11:55 +0800, Macpaul Lin wrote:
> Since MT6359 PMIC has been added as one of the compatibles of
> "mediatek,mt6397.yaml", the sub-device node of "MT6359 PMIC AUXADC" and
> "MT6359 PMIC Regulators" should also be contained in this DT Schema as
> well.
> 
> This patch includes:
>  - add 'adc' property and $ref for 'mediatek,mt6359-auxadc'.
>  - add 'mt6359-regulator' to the compatibles of regulators.
> 
> Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
> ---
>  Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml | 7 +++++++
>  1 file changed, 7 insertions(+)
> 

Reviewed-by: Rob Herring (Arm) <robh at kernel.org>



From shayne.chen at mediatek.com  Wed Sep 25 20:24:38 2024
From: shayne.chen at mediatek.com (Shayne Chen)
Date: Thu, 26 Sep 2024 11:24:38 +0800
Subject: [PATCH 1/3] wifi: mt76: mt7996: extend flexibility of mt7996_mcu_get_eeprom()
Message-ID: <20240926032440.15978-1-shayne.chen@mediatek.com>

Support passing customized buffer pointer and length to
mt7996_mcu_get_eeprom().

This is the preparation for adding more variants support which needs to
prefetch FEM module from efuse, and also fixes potential OOB issue when
reading the last efuse block.

Co-developed-by: StanleyYP Wang <StanleyYP.Wang at mediatek.com>
Signed-off-by: StanleyYP Wang <StanleyYP.Wang at mediatek.com>
Signed-off-by: Shayne Chen <shayne.chen at mediatek.com>
---
 drivers/net/wireless/mediatek/mt76/mt7996/eeprom.c |  9 +++++++--
 drivers/net/wireless/mediatek/mt76/mt7996/mcu.c    | 14 ++++++++++----
 drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h |  2 +-
 3 files changed, 18 insertions(+), 7 deletions(-)

diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/eeprom.c b/drivers/net/wireless/mediatek/mt76/mt7996/eeprom.c
index 4a8237118287..861aba68a725 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7996/eeprom.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7996/eeprom.c
@@ -86,8 +86,13 @@ static int mt7996_eeprom_load(struct mt7996_dev *dev)
 		/* read eeprom data from efuse */
 		block_num = DIV_ROUND_UP(MT7996_EEPROM_SIZE, eeprom_blk_size);
 		for (i = 0; i < block_num; i++) {
-			ret = mt7996_mcu_get_eeprom(dev, i * eeprom_blk_size);
-			if (ret < 0)
+			u32 len = eeprom_blk_size;
+
+			if (i == block_num - 1)
+				len = MT7996_EEPROM_SIZE % eeprom_blk_size;
+			ret = mt7996_mcu_get_eeprom(dev, i * eeprom_blk_size,
+						    NULL, len);
+			if (ret && ret != -EINVAL)
 				return ret;
 		}
 	}
diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c
index 327337b31279..fa7832f625d7 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c
@@ -3548,7 +3548,7 @@ int mt7996_mcu_set_eeprom(struct mt7996_dev *dev)
 				 &req, sizeof(req), true);
 }
 
-int mt7996_mcu_get_eeprom(struct mt7996_dev *dev, u32 offset)
+int mt7996_mcu_get_eeprom(struct mt7996_dev *dev, u32 offset, u8 *buf, u32 buf_len)
 {
 	struct {
 		u8 _rsv[4];
@@ -3577,15 +3577,21 @@ int mt7996_mcu_get_eeprom(struct mt7996_dev *dev, u32 offset)
 	valid = le32_to_cpu(*(__le32 *)(skb->data + 16));
 	if (valid) {
 		u32 addr = le32_to_cpu(*(__le32 *)(skb->data + 12));
-		u8 *buf = (u8 *)dev->mt76.eeprom.data + addr;
+
+		if (!buf)
+			buf = (u8 *)dev->mt76.eeprom.data + addr;
+		if (!buf_len || buf_len > MT7996_EEPROM_BLOCK_SIZE)
+			buf_len = MT7996_EEPROM_BLOCK_SIZE;
 
 		skb_pull(skb, 48);
-		memcpy(buf, skb->data, MT7996_EEPROM_BLOCK_SIZE);
+		memcpy(buf, skb->data, buf_len);
+	} else {
+		ret = -EINVAL;
 	}
 
 	dev_kfree_skb(skb);
 
-	return 0;
+	return ret;
 }
 
 int mt7996_mcu_get_eeprom_free_block(struct mt7996_dev *dev, u8 *block_num)
diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h b/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h
index ab8c9070630b..55aa5f6ab77d 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h
+++ b/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h
@@ -476,7 +476,7 @@ int mt7996_mcu_set_fixed_rate_ctrl(struct mt7996_dev *dev,
 int mt7996_mcu_set_fixed_field(struct mt7996_dev *dev, struct ieee80211_vif *vif,
 			       struct ieee80211_sta *sta, void *data, u32 field);
 int mt7996_mcu_set_eeprom(struct mt7996_dev *dev);
-int mt7996_mcu_get_eeprom(struct mt7996_dev *dev, u32 offset);
+int mt7996_mcu_get_eeprom(struct mt7996_dev *dev, u32 offset, u8 *buf, u32 buf_len);
 int mt7996_mcu_get_eeprom_free_block(struct mt7996_dev *dev, u8 *block_num);
 int mt7996_mcu_get_chip_config(struct mt7996_dev *dev, u32 *cap);
 int mt7996_mcu_set_ser(struct mt7996_dev *dev, u8 action, u8 set, u8 band);
-- 
2.39.2



From shayne.chen at mediatek.com  Wed Sep 25 20:24:39 2024
From: shayne.chen at mediatek.com (Shayne Chen)
Date: Thu, 26 Sep 2024 11:24:39 +0800
Subject: [PATCH 2/3] wifi: mt76: mt7996: add suuport for more variants
In-Reply-To: <20240926032440.15978-1-shayne.chen@mediatek.com>
References: <20240926032440.15978-1-shayne.chen@mediatek.com>
Message-ID: <20240926032440.15978-2-shayne.chen@mediatek.com>

Current varaints supported:
- mt7996 chipset: tri-band, 4+4+4 NSS, eFEM
- mt7992 chipset: dual-band, 4+4 NSS, eFEM

This patch adds support for the following variants:
- mt7996 chipset:
  - tri-band, 4+4+4 NSS, iFEM
  - tri-band, 2+3+3 NSS, eFEM
  - tri-band, 2+3+3 NSS, iFEM
- mt7992 chipset:
  - dual-band, 4+4 NSS, iFEM
  - dual-band, 4+4 NSS, with band0 iFEM and band1 eFEM
  - dual-band, 2+3 NSS, eFEM
  - dual-band, 2+3 NSS, iFEM

Co-developed-by: StanleyYP Wang <StanleyYP.Wang at mediatek.com>
Signed-off-by: StanleyYP Wang <StanleyYP.Wang at mediatek.com>
Signed-off-by: Shayne Chen <shayne.chen at mediatek.com>
---
 .../wireless/mediatek/mt76/mt7996/eeprom.c    | 206 +++++++++++++-----
 .../wireless/mediatek/mt76/mt7996/eeprom.h    |   2 +
 .../net/wireless/mediatek/mt76/mt7996/init.c  |  78 +++++++
 .../net/wireless/mediatek/mt76/mt7996/mcu.c   |  16 +-
 .../wireless/mediatek/mt76/mt7996/mt7996.h    |  46 +++-
 .../net/wireless/mediatek/mt76/mt7996/regs.h  |   9 +
 6 files changed, 289 insertions(+), 68 deletions(-)

diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/eeprom.c b/drivers/net/wireless/mediatek/mt76/mt7996/eeprom.c
index 861aba68a725..da94751df020 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7996/eeprom.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7996/eeprom.c
@@ -25,17 +25,108 @@ static int mt7996_check_eeprom(struct mt7996_dev *dev)
 static char *mt7996_eeprom_name(struct mt7996_dev *dev)
 {
 	switch (mt76_chip(&dev->mt76)) {
-	case 0x7990:
-		return MT7996_EEPROM_DEFAULT;
 	case 0x7992:
-		return MT7992_EEPROM_DEFAULT;
+		switch (dev->var.type) {
+		case MT7992_VAR_TYPE_23:
+			if (dev->var.fem == MT7996_FEM_INT)
+				return MT7992_EEPROM_DEFAULT_23_INT;
+			return MT7992_EEPROM_DEFAULT_23;
+		case MT7992_VAR_TYPE_44:
+		default:
+			if (dev->var.fem == MT7996_FEM_INT)
+				return MT7992_EEPROM_DEFAULT_INT;
+			if (dev->var.fem == MT7996_FEM_MIX)
+				return MT7992_EEPROM_DEFAULT_MIX;
+			return MT7992_EEPROM_DEFAULT;
+		}
+	case 0x7990:
+	default:
+		switch (dev->var.type) {
+		case MT7996_VAR_TYPE_233:
+			if (dev->var.fem == MT7996_FEM_INT)
+				return MT7996_EEPROM_DEFAULT_233_INT;
+			return MT7996_EEPROM_DEFAULT_233;
+		case MT7996_VAR_TYPE_444:
+		default:
+			if (dev->var.fem == MT7996_FEM_INT)
+				return MT7996_EEPROM_DEFAULT_INT;
+			return MT7996_EEPROM_DEFAULT;
+		}
+	}
+}
+
+static void
+mt7996_eeprom_parse_stream(const u8 *eeprom, u8 band_idx, u8 *path,
+			   u8 *rx_path, u8 *nss)
+{
+	switch (band_idx) {
+	case MT_BAND1:
+		*path = FIELD_GET(MT_EE_WIFI_CONF2_TX_PATH_BAND1,
+				  eeprom[MT_EE_WIFI_CONF + 2]);
+		*rx_path = FIELD_GET(MT_EE_WIFI_CONF3_RX_PATH_BAND1,
+				     eeprom[MT_EE_WIFI_CONF + 3]);
+		*nss = FIELD_GET(MT_EE_WIFI_CONF5_STREAM_NUM_BAND1,
+				 eeprom[MT_EE_WIFI_CONF + 5]);
+		break;
+	case MT_BAND2:
+		*path = FIELD_GET(MT_EE_WIFI_CONF2_TX_PATH_BAND2,
+				  eeprom[MT_EE_WIFI_CONF + 2]);
+		*rx_path = FIELD_GET(MT_EE_WIFI_CONF4_RX_PATH_BAND2,
+				     eeprom[MT_EE_WIFI_CONF + 4]);
+		*nss = FIELD_GET(MT_EE_WIFI_CONF5_STREAM_NUM_BAND2,
+				 eeprom[MT_EE_WIFI_CONF + 5]);
+		break;
 	default:
-		return MT7996_EEPROM_DEFAULT;
+		*path = FIELD_GET(MT_EE_WIFI_CONF1_TX_PATH_BAND0,
+				  eeprom[MT_EE_WIFI_CONF + 1]);
+		*rx_path = FIELD_GET(MT_EE_WIFI_CONF3_RX_PATH_BAND0,
+				     eeprom[MT_EE_WIFI_CONF + 3]);
+		*nss = FIELD_GET(MT_EE_WIFI_CONF4_STREAM_NUM_BAND0,
+				 eeprom[MT_EE_WIFI_CONF + 4]);
+		break;
 	}
 }
 
+static bool mt7996_eeprom_variant_valid(struct mt7996_dev *dev, const u8 *def)
+{
+#define FEM_INT	0
+#define FEM_EXT	3
+	u8 *eeprom = dev->mt76.eeprom.data, fem[2];
+	int i;
+
+	for (i = 0; i < 2; i++)
+		fem[i] = u8_get_bits(eeprom[MT_EE_WIFI_CONF + 6 + i],
+				     MT_EE_WIFI_PA_LNA_CONFIG);
+
+	if (dev->var.fem == MT7996_FEM_EXT &&
+	    !(fem[0] == FEM_EXT && fem[1] == FEM_EXT))
+		return false;
+	else if (dev->var.fem == MT7996_FEM_INT &&
+		 !(fem[0] == FEM_INT && fem[1] == FEM_INT))
+		return false;
+	else if (dev->var.fem == MT7996_FEM_MIX &&
+		 !(fem[0] == FEM_INT && fem[1] == FEM_EXT))
+		return false;
+
+	for (i = 0; i < __MT_MAX_BAND; i++) {
+		u8 path, rx_path, nss;
+		u8 def_path, def_rx_path, def_nss;
+
+		if (!dev->mt76.phys[i])
+			continue;
+
+		mt7996_eeprom_parse_stream(eeprom, i, &path, &rx_path, &nss);
+		mt7996_eeprom_parse_stream(def, i, &def_path, &def_rx_path,
+					   &def_nss);
+		if (path > def_path || rx_path > def_rx_path || nss > def_nss)
+			return false;
+	}
+
+	return true;
+}
+
 static int
-mt7996_eeprom_load_default(struct mt7996_dev *dev)
+mt7996_eeprom_check_or_use_default(struct mt7996_dev *dev, bool use_default)
 {
 	u8 *eeprom = dev->mt76.eeprom.data;
 	const struct firmware *fw = NULL;
@@ -51,6 +142,10 @@ mt7996_eeprom_load_default(struct mt7996_dev *dev)
 		goto out;
 	}
 
+	if (!use_default && mt7996_eeprom_variant_valid(dev, fw->data))
+		goto out;
+
+	dev_warn(dev->mt76.dev, "eeprom load fail, use default bin\n");
 	memcpy(eeprom, fw->data, MT7996_EEPROM_SIZE);
 	dev->flash_mode = true;
 
@@ -62,48 +157,68 @@ mt7996_eeprom_load_default(struct mt7996_dev *dev)
 
 static int mt7996_eeprom_load(struct mt7996_dev *dev)
 {
+	bool use_default = false;
 	int ret;
 
 	ret = mt76_eeprom_init(&dev->mt76, MT7996_EEPROM_SIZE);
 	if (ret < 0)
 		return ret;
 
-	if (ret) {
+	if (ret && !mt7996_check_eeprom(dev)) {
 		dev->flash_mode = true;
-	} else {
-		u8 free_block_num;
-		u32 block_num, i;
+		goto out;
+	}
+
+	if (!dev->flash_mode) {
 		u32 eeprom_blk_size = MT7996_EEPROM_BLOCK_SIZE;
+		u32 block_num = DIV_ROUND_UP(MT7996_EEPROM_SIZE, eeprom_blk_size);
+		u8 free_block_num;
+		int i;
 
+		memset(dev->mt76.eeprom.data, 0, MT7996_EEPROM_SIZE);
 		ret = mt7996_mcu_get_eeprom_free_block(dev, &free_block_num);
 		if (ret < 0)
 			return ret;
 
 		/* efuse info isn't enough */
-		if (free_block_num >= 59)
-			return -EINVAL;
+		if (free_block_num >= 59) {
+			use_default = true;
+			goto out;
+		}
+
+		/* check if eeprom data from fw is valid */
+		if (mt7996_mcu_get_eeprom(dev, 0, NULL, 0) ||
+		    mt7996_check_eeprom(dev)) {
+			use_default = true;
+			goto out;
+		}
 
-		/* read eeprom data from efuse */
-		block_num = DIV_ROUND_UP(MT7996_EEPROM_SIZE, eeprom_blk_size);
-		for (i = 0; i < block_num; i++) {
+		/* read eeprom data from fw */
+		for (i = 1; i < block_num; i++) {
 			u32 len = eeprom_blk_size;
 
 			if (i == block_num - 1)
 				len = MT7996_EEPROM_SIZE % eeprom_blk_size;
 			ret = mt7996_mcu_get_eeprom(dev, i * eeprom_blk_size,
 						    NULL, len);
-			if (ret && ret != -EINVAL)
-				return ret;
+			if (ret && ret != -EINVAL) {
+				use_default = true;
+				goto out;
+			}
 		}
 	}
 
-	return mt7996_check_eeprom(dev);
+out:
+	return mt7996_eeprom_check_or_use_default(dev, use_default);
 }
 
-static int mt7996_eeprom_parse_efuse_hw_cap(struct mt7996_dev *dev)
+static int mt7996_eeprom_parse_efuse_hw_cap(struct mt7996_phy *phy,
+					    u8 *path, u8 *rx_path, u8 *nss)
 {
 #define MODE_HE_ONLY		BIT(0)
 #define WTBL_SIZE_GROUP		GENMASK(31, 28)
+#define STREAM_CAP(_offs)	((cap & (0x7 << (_offs))) >> (_offs))
+	struct mt7996_dev *dev = phy->dev;
 	u32 cap = 0;
 	int ret;
 
@@ -112,13 +227,17 @@ static int mt7996_eeprom_parse_efuse_hw_cap(struct mt7996_dev *dev)
 		return ret;
 
 	if (cap) {
+		u8 band_offs = phy->mt76->band_idx * 3;
+
 		dev->has_eht = !(cap & MODE_HE_ONLY);
 		dev->wtbl_size_group = u32_get_bits(cap, WTBL_SIZE_GROUP);
+		*nss = min_t(u8, *nss, STREAM_CAP(1 + band_offs));
+		*path = min_t(u8, *path, STREAM_CAP(10 + band_offs));
+		*rx_path = min_t(u8, *rx_path, STREAM_CAP(19 + band_offs));
 	}
 
-	if (dev->wtbl_size_group < 2 || dev->wtbl_size_group > 4 ||
-	    is_mt7992(&dev->mt76))
-		dev->wtbl_size_group = 2; /* set default */
+	if (dev->wtbl_size_group < 2 || dev->wtbl_size_group > 4)
+		dev->wtbl_size_group = is_mt7996(&dev->mt76) ? 4 : 2;
 
 	return 0;
 }
@@ -168,32 +287,10 @@ int mt7996_eeprom_parse_hw_cap(struct mt7996_dev *dev, struct mt7996_phy *phy)
 	int max_path = 5, max_nss = 4;
 	int ret;
 
-	switch (band_idx) {
-	case MT_BAND1:
-		path = FIELD_GET(MT_EE_WIFI_CONF2_TX_PATH_BAND1,
-				 eeprom[MT_EE_WIFI_CONF + 2]);
-		rx_path = FIELD_GET(MT_EE_WIFI_CONF3_RX_PATH_BAND1,
-				    eeprom[MT_EE_WIFI_CONF + 3]);
-		nss = FIELD_GET(MT_EE_WIFI_CONF5_STREAM_NUM_BAND1,
-				eeprom[MT_EE_WIFI_CONF + 5]);
-		break;
-	case MT_BAND2:
-		path = FIELD_GET(MT_EE_WIFI_CONF2_TX_PATH_BAND2,
-				 eeprom[MT_EE_WIFI_CONF + 2]);
-		rx_path = FIELD_GET(MT_EE_WIFI_CONF4_RX_PATH_BAND2,
-				    eeprom[MT_EE_WIFI_CONF + 4]);
-		nss = FIELD_GET(MT_EE_WIFI_CONF5_STREAM_NUM_BAND2,
-				eeprom[MT_EE_WIFI_CONF + 5]);
-		break;
-	default:
-		path = FIELD_GET(MT_EE_WIFI_CONF1_TX_PATH_BAND0,
-				 eeprom[MT_EE_WIFI_CONF + 1]);
-		rx_path = FIELD_GET(MT_EE_WIFI_CONF3_RX_PATH_BAND0,
-				    eeprom[MT_EE_WIFI_CONF + 3]);
-		nss = FIELD_GET(MT_EE_WIFI_CONF4_STREAM_NUM_BAND0,
-				eeprom[MT_EE_WIFI_CONF + 4]);
-		break;
-	}
+	mt7996_eeprom_parse_stream(eeprom, band_idx, &path, &rx_path, &nss);
+	ret = mt7996_eeprom_parse_efuse_hw_cap(phy, &path, &rx_path, &nss);
+	if (ret)
+		return ret;
 
 	if (!path || path > max_path)
 		path = max_path;
@@ -213,10 +310,6 @@ int mt7996_eeprom_parse_hw_cap(struct mt7996_dev *dev, struct mt7996_phy *phy)
 		dev->chainshift[band_idx + 1] = dev->chainshift[band_idx] +
 						hweight16(mphy->chainmask);
 
-	ret = mt7996_eeprom_parse_efuse_hw_cap(dev);
-	if (ret)
-		return ret;
-
 	return mt7996_eeprom_parse_band_config(phy);
 }
 
@@ -225,15 +318,8 @@ int mt7996_eeprom_init(struct mt7996_dev *dev)
 	int ret;
 
 	ret = mt7996_eeprom_load(dev);
-	if (ret < 0) {
-		if (ret != -EINVAL)
-			return ret;
-
-		dev_warn(dev->mt76.dev, "eeprom load fail, use default bin\n");
-		ret = mt7996_eeprom_load_default(dev);
-		if (ret)
-			return ret;
-	}
+	if (ret < 0)
+		return ret;
 
 	ret = mt7996_eeprom_parse_hw_cap(dev, &dev->phy);
 	if (ret < 0)
diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/eeprom.h b/drivers/net/wireless/mediatek/mt76/mt7996/eeprom.h
index 412d6e2f8014..7a771ca2434c 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7996/eeprom.h
+++ b/drivers/net/wireless/mediatek/mt76/mt7996/eeprom.h
@@ -40,6 +40,8 @@ enum mt7996_eeprom_field {
 #define MT_EE_WIFI_CONF5_STREAM_NUM_BAND1	GENMASK(2, 0)
 #define MT_EE_WIFI_CONF5_STREAM_NUM_BAND2	GENMASK(5, 3)
 
+#define MT_EE_WIFI_PA_LNA_CONFIG		GENMASK(1, 0)
+
 #define MT_EE_RATE_DELTA_MASK			GENMASK(5, 0)
 #define MT_EE_RATE_DELTA_SIGN			BIT(6)
 #define MT_EE_RATE_DELTA_EN			BIT(7)
diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/init.c b/drivers/net/wireless/mediatek/mt76/mt7996/init.c
index 5e96973226bb..bf70799b4bc4 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7996/init.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7996/init.c
@@ -884,6 +884,76 @@ static void mt7996_wed_rro_work(struct work_struct *work)
 #endif
 }
 
+static int mt7996_variant_type_init(struct mt7996_dev *dev)
+{
+	u32 val = mt76_rr(dev, MT_PAD_GPIO);
+	u8 var_type;
+
+	switch (mt76_chip(&dev->mt76)) {
+	case 0x7990:
+		if (val & MT_PAD_GPIO_2ADIE_TBTC)
+			var_type = MT7996_VAR_TYPE_233;
+		else
+			var_type = MT7996_VAR_TYPE_444;
+		break;
+	case 0x7992:
+		if (val & MT_PAD_GPIO_ADIE_SINGLE)
+			var_type = MT7992_VAR_TYPE_23;
+		else if (u32_get_bits(val, MT_PAD_GPIO_ADIE_COMB_7992))
+			var_type = MT7992_VAR_TYPE_44;
+		else
+			return -EINVAL;
+		break;
+	default:
+		return -EINVAL;
+	}
+
+	dev->var.type = var_type;
+	return 0;
+}
+
+static int mt7996_variant_fem_init(struct mt7996_dev *dev)
+{
+#define MT7976C_EFUSE_OFFSET	0x470
+	u8 buf[MT7996_EEPROM_BLOCK_SIZE], idx, adie_idx, adie_comb;
+	u32 regval, val = mt76_rr(dev, MT_PAD_GPIO);
+	u16 adie_id, adie_ver;
+	bool is_7976c;
+	int ret;
+
+	if (is_mt7992(&dev->mt76)) {
+		adie_idx = (val & MT_PAD_GPIO_ADIE_SINGLE) ? 0 : 1;
+		adie_comb = u32_get_bits(val, MT_PAD_GPIO_ADIE_COMB_7992);
+	} else {
+		adie_idx = 0;
+		adie_comb = u32_get_bits(val, MT_PAD_GPIO_ADIE_COMB);
+	}
+
+	ret = mt7996_mcu_rf_regval(dev, MT_ADIE_CHIP_ID(adie_idx), &regval, false);
+	if (ret)
+		return ret;
+
+	ret = mt7996_mcu_get_eeprom(dev, MT7976C_EFUSE_OFFSET, buf, sizeof(buf));
+	if (ret && ret != -EINVAL)
+		return ret;
+
+	adie_ver = u32_get_bits(regval, MT_ADIE_VERSION_MASK);
+	idx = MT7976C_EFUSE_OFFSET % MT7996_EEPROM_BLOCK_SIZE;
+	is_7976c = adie_ver == 0x8a10 || adie_ver == 0x8b00 ||
+		   adie_ver == 0x8c10 || buf[idx] == 0xc;
+
+	adie_id = u32_get_bits(regval, MT_ADIE_CHIP_ID_MASK);
+	if (adie_id == 0x7975 || adie_id == 0x7979 ||
+	    (adie_id == 0x7976 && is_7976c))
+		dev->var.fem = MT7996_FEM_INT;
+	else if (adie_id == 0x7977 && adie_comb == 1)
+		dev->var.fem = MT7996_FEM_MIX;
+	else
+		dev->var.fem = MT7996_FEM_EXT;
+
+	return 0;
+}
+
 static int mt7996_init_hardware(struct mt7996_dev *dev)
 {
 	int ret, idx;
@@ -899,6 +969,10 @@ static int mt7996_init_hardware(struct mt7996_dev *dev)
 	INIT_LIST_HEAD(&dev->wed_rro.poll_list);
 	spin_lock_init(&dev->wed_rro.lock);
 
+	ret = mt7996_variant_type_init(dev);
+	if (ret)
+		return ret;
+
 	ret = mt7996_dma_init(dev);
 	if (ret)
 		return ret;
@@ -913,6 +987,10 @@ static int mt7996_init_hardware(struct mt7996_dev *dev)
 	if (ret)
 		return ret;
 
+	ret = mt7996_variant_fem_init(dev);
+	if (ret)
+		return ret;
+
 	ret = mt7996_eeprom_init(dev);
 	if (ret < 0)
 		return ret;
diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c
index fa7832f625d7..83bbdece45df 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c
@@ -14,11 +14,23 @@
 	char *_fw;						\
 	switch (mt76_chip(&(_dev)->mt76)) {			\
 	case 0x7992:						\
-		_fw = MT7992_##name;				\
+		switch ((_dev)->var.type) {			\
+		case MT7992_VAR_TYPE_23:			\
+			_fw = MT7992_##name##_23;		\
+			break;					\
+		default:					\
+			_fw = MT7992_##name;			\
+		}						\
 		break;						\
 	case 0x7990:						\
 	default:						\
-		_fw = MT7996_##name;				\
+		switch ((_dev)->var.type) {			\
+		case MT7996_VAR_TYPE_233:			\
+			_fw = MT7996_##name##_233;		\
+			break;					\
+		default:					\
+			_fw = MT7996_##name;			\
+		}						\
 		break;						\
 	}							\
 	_fw;							\
diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h b/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h
index 55aa5f6ab77d..3f3278f43c79 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h
+++ b/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h
@@ -34,13 +34,32 @@
 #define MT7996_FIRMWARE_DSP		"mediatek/mt7996/mt7996_dsp.bin"
 #define MT7996_ROM_PATCH		"mediatek/mt7996/mt7996_rom_patch.bin"
 
+#define MT7996_FIRMWARE_WA_233		"mediatek/mt7996/mt7996_wa_233.bin"
+#define MT7996_FIRMWARE_WM_233		"mediatek/mt7996/mt7996_wm_233.bin"
+#define MT7996_FIRMWARE_DSP_233		MT7996_FIRMWARE_DSP
+#define MT7996_ROM_PATCH_233		"mediatek/mt7996/mt7996_rom_patch_233.bin"
+
 #define MT7992_FIRMWARE_WA		"mediatek/mt7996/mt7992_wa.bin"
 #define MT7992_FIRMWARE_WM		"mediatek/mt7996/mt7992_wm.bin"
 #define MT7992_FIRMWARE_DSP		"mediatek/mt7996/mt7992_dsp.bin"
 #define MT7992_ROM_PATCH		"mediatek/mt7996/mt7992_rom_patch.bin"
 
+#define MT7992_FIRMWARE_WA_23		"mediatek/mt7996/mt7992_wa_23.bin"
+#define MT7992_FIRMWARE_WM_23		"mediatek/mt7996/mt7992_wm_23.bin"
+#define MT7992_FIRMWARE_DSP_23		"mediatek/mt7996/mt7992_dsp_23.bin"
+#define MT7992_ROM_PATCH_23		"mediatek/mt7996/mt7992_rom_patch_23.bin"
+
 #define MT7996_EEPROM_DEFAULT		"mediatek/mt7996/mt7996_eeprom.bin"
+#define MT7996_EEPROM_DEFAULT_INT	"mediatek/mt7996/mt7996_eeprom_2i5i6i.bin"
+#define MT7996_EEPROM_DEFAULT_233	"mediatek/mt7996/mt7996_eeprom_233.bin"
+#define MT7996_EEPROM_DEFAULT_233_INT	"mediatek/mt7996/mt7996_eeprom_233_2i5i6i.bin"
+
 #define MT7992_EEPROM_DEFAULT		"mediatek/mt7996/mt7992_eeprom.bin"
+#define MT7992_EEPROM_DEFAULT_INT	"mediatek/mt7996/mt7992_eeprom_2i5i.bin"
+#define MT7992_EEPROM_DEFAULT_MIX	"mediatek/mt7996/mt7992_eeprom_2i5e.bin"
+#define MT7992_EEPROM_DEFAULT_23	"mediatek/mt7996/mt7992_eeprom_23.bin"
+#define MT7992_EEPROM_DEFAULT_23_INT	"mediatek/mt7996/mt7992_eeprom_23_2i5i.bin"
+
 #define MT7996_EEPROM_SIZE		7680
 #define MT7996_EEPROM_BLOCK_SIZE	16
 #define MT7996_TOKEN_SIZE		16384
@@ -95,6 +114,22 @@ enum mt7996_ram_type {
 	MT7996_RAM_TYPE_DSP,
 };
 
+enum mt7996_var_type {
+	MT7996_VAR_TYPE_444,
+	MT7996_VAR_TYPE_233,
+};
+
+enum mt7992_var_type {
+	MT7992_VAR_TYPE_44,
+	MT7992_VAR_TYPE_23,
+};
+
+enum mt7996_fem_type {
+	MT7996_FEM_EXT,
+	MT7996_FEM_INT,
+	MT7996_FEM_MIX,
+};
+
 enum mt7996_txq_id {
 	MT7996_TXQ_FWDL = 16,
 	MT7996_TXQ_MCU_WM,
@@ -329,6 +364,10 @@ struct mt7996_dev {
 	spinlock_t reg_lock;
 
 	u8 wtbl_size_group;
+	struct {
+		u8 type:4;
+		u8 fem:4;
+	} var;
 };
 
 enum {
@@ -405,12 +444,7 @@ mt7996_band_valid(struct mt7996_dev *dev, u8 band)
 	if (is_mt7992(&dev->mt76))
 		return band <= MT_BAND1;
 
-	/* tri-band support */
-	if (band <= MT_BAND2 &&
-	    mt76_get_field(dev, MT_PAD_GPIO, MT_PAD_GPIO_ADIE_COMB) <= 1)
-		return true;
-
-	return band == MT_BAND0 || band == MT_BAND2;
+	return band <= MT_BAND2;
 }
 
 extern const struct ieee80211_ops mt7996_ops;
diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/regs.h b/drivers/net/wireless/mediatek/mt76/mt7996/regs.h
index 47b429d8bfbe..06e307b5b02e 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7996/regs.h
+++ b/drivers/net/wireless/mediatek/mt76/mt7996/regs.h
@@ -660,8 +660,17 @@ enum offs_rev {
 #define MT_TOP_MISC				MT_TOP(0xf0)
 #define MT_TOP_MISC_FW_STATE			GENMASK(2, 0)
 
+/* ADIE */
+#define MT_ADIE_CHIP_ID(_idx)			(0x0f00002c + ((_idx) << 28))
+#define MT_ADIE_VERSION_MASK			GENMASK(15, 0)
+#define MT_ADIE_CHIP_ID_MASK			GENMASK(31, 16)
+
 #define MT_PAD_GPIO				0x700056f0
 #define MT_PAD_GPIO_ADIE_COMB			GENMASK(16, 15)
+#define MT_PAD_GPIO_2ADIE_TBTC			BIT(19)
+/* for mt7992 */
+#define MT_PAD_GPIO_ADIE_COMB_7992		GENMASK(17, 16)
+#define MT_PAD_GPIO_ADIE_SINGLE			BIT(15)
 
 #define MT_HW_REV				0x70010204
 #define MT_HW_REV1				0x8a00
-- 
2.39.2



From shayne.chen at mediatek.com  Wed Sep 25 20:24:40 2024
From: shayne.chen at mediatek.com (Shayne Chen)
Date: Thu, 26 Sep 2024 11:24:40 +0800
Subject: [PATCH 3/3] wifi: mt76: mt7996: set correct background radar capability
In-Reply-To: <20240926032440.15978-1-shayne.chen@mediatek.com>
References: <20240926032440.15978-1-shayne.chen@mediatek.com>
Message-ID: <20240926032440.15978-3-shayne.chen@mediatek.com>

From: StanleyYP Wang <StanleyYP.Wang at mediatek.com>

Some of the variants do not support background radar, so add a helper
to report background radar capability.

Signed-off-by: StanleyYP Wang <StanleyYP.Wang at mediatek.com>
Signed-off-by: Shayne Chen <shayne.chen at mediatek.com>
---
 .../net/wireless/mediatek/mt76/mt7996/init.c  |  7 ++++---
 .../wireless/mediatek/mt76/mt7996/mt7996.h    | 19 +++++++++++++++++++
 2 files changed, 23 insertions(+), 3 deletions(-)

diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/init.c b/drivers/net/wireless/mediatek/mt76/mt7996/init.c
index bf70799b4bc4..f6a010b61a8a 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7996/init.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7996/init.c
@@ -390,9 +390,10 @@ mt7996_init_wiphy(struct ieee80211_hw *hw, struct mtk_wed_device *wed)
 	wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_CAN_REPLACE_PTK0);
 	wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_MU_MIMO_AIR_SNIFFER);
 
-	if (!mdev->dev->of_node ||
-	    !of_property_read_bool(mdev->dev->of_node,
-				   "mediatek,disable-radar-background"))
+	if (mt7996_has_background_radar(phy->dev) &&
+	    (!mdev->dev->of_node ||
+	     !of_property_read_bool(mdev->dev->of_node,
+				    "mediatek,disable-radar-background")))
 		wiphy_ext_feature_set(wiphy,
 				      NL80211_EXT_FEATURE_RADAR_BACKGROUND);
 
diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h b/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h
index 3f3278f43c79..9aec97dd81d9 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h
+++ b/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h
@@ -447,6 +447,25 @@ mt7996_band_valid(struct mt7996_dev *dev, u8 band)
 	return band <= MT_BAND2;
 }
 
+static inline bool
+mt7996_has_background_radar(struct mt7996_dev *dev)
+{
+	switch (mt76_chip(&dev->mt76)) {
+	case 0x7990:
+		if (dev->var.type == MT7996_VAR_TYPE_233)
+			return false;
+		break;
+	case 0x7992:
+		if (dev->var.type == MT7992_VAR_TYPE_23)
+			return false;
+		break;
+	default:
+		return false;
+	}
+
+	return true;
+}
+
 extern const struct ieee80211_ops mt7996_ops;
 extern struct pci_driver mt7996_pci_driver;
 extern struct pci_driver mt7996_hif_driver;
-- 
2.39.2



From peter.wang at mediatek.com  Wed Sep 25 20:42:32 2024
From: peter.wang at mediatek.com (=?utf-8?B?UGV0ZXIgV2FuZyAo546L5L+h5Y+LKQ==?=)
Date: Thu, 26 Sep 2024 03:42:32 +0000
Subject: [PATCH v9 3/3] ufs: core: add a quirk for MediaTek SDB mode
 aborted
In-Reply-To: <03b34628-d70b-4ce6-ad87-3c2070105bfa@acm.org>
References: <20240925095546.19492-1-peter.wang@mediatek.com>
	 <20240925095546.19492-4-peter.wang@mediatek.com>
	 <03b34628-d70b-4ce6-ad87-3c2070105bfa@acm.org>
Message-ID: <80c871dae894780c1d713ee9a093e1fc9d110ffd.camel@mediatek.com>

On Wed, 2024-09-25 at 09:56 -0700, Bart Van Assche wrote:
> 
> 
> ufshcd_transfer_rsp_status() only has one caller, namely 
> ufshcd_compl_one_cqe(). The previous patch makes sure that that 
> ufshcd_compl_one_cqe() is not called if a SCSI command is aborted. So
> why does this patch modify how OCS_ABORTED is processed? Is this
> patch
> necessary or can it perhaps be dropped?
> 
> Thanks,
> 
> Bart.

Hi Bart,

Because in Legacy SDB mode, the error handler still has the 
chance to call ufshcd_compl_one_cqe(); 
The call flow is as follows:

ufshcd_err_handler()
  ufshcd_abort_all()
    ufshcd_abort_one()
      ufshcd_try_to_abort_task()	// mediatek controller fill
OCS: ABORTED
    ufshcd_complete_requests()
      ufshcd_transfer_req_compl()
        ufshcd_poll()
          get outstanding_lock
          clear outstanding_reqs tag
          release outstanding_lock	
          __ufshcd_transfer_req_compl()
            ufshcd_compl_one_cqe()
              cmd->result = DID_REQUEUE // mediatek need quirk change
DID_ABORT to DID_REQUEUE
              ufshcd_release_scsi_cmd()
              scsi_done()

Thanks.
Peter

From peter.wang at mediatek.com  Wed Sep 25 20:45:00 2024
From: peter.wang at mediatek.com (=?utf-8?B?UGV0ZXIgV2FuZyAo546L5L+h5Y+LKQ==?=)
Date: Thu, 26 Sep 2024 03:45:00 +0000
Subject: [PATCH v9 2/3] ufs: core: fix error handler process for MCQ abort
In-Reply-To: <949fb86d-6b61-4a1a-bc04-c05bb30522b9@acm.org>
References: <20240925095546.19492-1-peter.wang@mediatek.com>
	 <20240925095546.19492-3-peter.wang@mediatek.com>
	 <949fb86d-6b61-4a1a-bc04-c05bb30522b9@acm.org>
Message-ID: <4bc08986190aecb394f07997b2ad31e301567496.camel@mediatek.com>

On Wed, 2024-09-25 at 09:49 -0700, Bart Van Assche wrote:
>  	 
> External email : Please do not click links or open attachments until
> you have verified the sender or the content.
>  On 9/25/24 2:55 AM, peter.wang at mediatek.com wrote:
> >   case OCS_INVALID_COMMAND_STATUS:
> >   result |= DID_REQUEUE << 16;
> > +dev_warn(hba->dev,
> > +"OCS invaild from controller for tag %d\n",
> > +lrbp->task_tag);
> 
> Please change "invaild" into "invalid". Once that change has been
> made,
> feel free to add:
> 
> Reviewed-by: Bart Van Assche <bvanassche at acm.org>


Hi Bart,

Sorry, this typo wasn't corrected.

However, I still feel that this patch is not quite reasonable.
The reason is that in the first patch,
"ufs: core: fix the issue of ICU failure"
we corrected the ICU problem, allowing the SQ to clean up 
correctly, while the CQ will have a corresponding response. 
But the second patch directly ignores the CQ's response and 
continues to use a workaround to release the command right 
after ufshcd_try_to_abort_task. 
The Legacy SDB mode's approach would not release the 
command after ufshcd_try_to_abort_task. 
Instead, it releases after the DBR is cleared.

Therefore, as I previously suggested, it would probably 
be more reasonable to directly requeue the ABORTED commands 
as shown in the patch below.

---------------------------------------------------------------------
---
diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
index 24a32e2fd75e..06aa4ed1a9e6 100644
--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -5417,10 +5417,12 @@ ufshcd_transfer_rsp_status(struct ufs_hba *hba,
struct ufshcd_lrb *lrbp,
 		}
 		break;
 	case OCS_ABORTED:
-		result |= DID_ABORT << 16;
-		break;
 	case OCS_INVALID_COMMAND_STATUS:
 		result |= DID_REQUEUE << 16;
+		dev_warn(hba->dev,
+				"OCS %s from controller for tag %d\n",
+				(ocs == OCS_ABORTED? "aborted" :
"invalid"),
+				lrbp->task_tag);
 		break;
 	case OCS_INVALID_CMD_TABLE_ATTR:
 	case OCS_INVALID_PRDT_ATTR:
@@ -6466,26 +6468,12 @@ static bool ufshcd_abort_one(struct request
*rq, void *priv)
 	struct scsi_device *sdev = cmd->device;
 	struct Scsi_Host *shost = sdev->host;
 	struct ufs_hba *hba = shost_priv(shost);
-	struct ufshcd_lrb *lrbp = &hba->lrb[tag];
-	struct ufs_hw_queue *hwq;
-	unsigned long flags;
 
 	*ret = ufshcd_try_to_abort_task(hba, tag);
 	dev_err(hba->dev, "Aborting tag %d / CDB %#02x %s\n", tag,
 		hba->lrb[tag].cmd ? hba->lrb[tag].cmd->cmnd[0] : -1,
 		*ret ? "failed" : "succeeded");
 
-	/* Release cmd in MCQ mode if abort succeeds */
-	if (hba->mcq_enabled && (*ret == 0)) {
-		hwq = ufshcd_mcq_req_to_hwq(hba, scsi_cmd_to_rq(lrbp-
>cmd));
-		if (!hwq)
-			return 0;
-		spin_lock_irqsave(&hwq->cq_lock, flags);
-		if (ufshcd_cmd_inflight(lrbp->cmd))
-			ufshcd_release_scsi_cmd(hba, lrbp);
-		spin_unlock_irqrestore(&hwq->cq_lock, flags);
-	}
-
 	return *ret == 0;
 }
 
---------------------------------------------------------------------
---


This patch has several advantages:

1. It makes the patch 'ufs: core: fix the issue of ICU failure' 
   seem valuable.
2. The patch is more concise.
3. There is no need to fetch OCS to determine OCS: ABORTED 
   on every CQ completion, which increases ISR time.
4. The err_handler flow for SDB and MCQ would be consistent.
5. There is no need for the MediaTek SDB quirk.


What do you think?"

From shayne.chen at mediatek.com  Wed Sep 25 20:48:02 2024
From: shayne.chen at mediatek.com (Shayne Chen)
Date: Thu, 26 Sep 2024 11:48:02 +0800
Subject: [PULL,linux-firmware] mt76 firmware 20240926
Message-ID: <20240926034802.28294-1-shayne.chen@mediatek.com>

Hi,

Here's a pull request for adding WiFi firmware files for mt7996 and
mt7992 chipset variants.

Please let me know if there are any problems.

Shayne

The following changes since commit 8306534b8a7265bee2f4323b45fd2a22a7c8b9b6:

  Merge branch '8922a' into 'main' (2024-09-23 12:36:21 +0000)

are available in the Git repository at:

  https://github.com/csyuanc/linux-firmware.git mt76-20240926

for you to fetch changes up to 85ce6f7afdd3b63398990e53f67c653fc66ad271:

  mt76: mt7996: add firmware files for mt7992 chipset (2024-09-26 00:59:54 +0800)

----------------------------------------------------------------
Shayne Chen (2):
      mt76: mt7996: add firmware files for mt7996 chipset variants
      mt76: mt7996: add firmware files for mt7992 chipset

 WHENCE                                       |  43 ++++++++++++++++++++++++++++++++++++++++++-
 mediatek/mt7996/mt7992_dsp.bin               | Bin 0 -> 63536 bytes
 mediatek/mt7996/mt7992_dsp_23.bin            | Bin 0 -> 63536 bytes
 mediatek/mt7996/mt7992_eeprom.bin            | Bin 0 -> 7680 bytes
 mediatek/mt7996/mt7992_eeprom_23.bin         | Bin 0 -> 7680 bytes
 mediatek/mt7996/mt7992_eeprom_23_2i5i.bin    | Bin 0 -> 7680 bytes
 mediatek/mt7996/mt7992_eeprom_2i5e.bin       | Bin 0 -> 7680 bytes
 mediatek/mt7996/mt7992_eeprom_2i5i.bin       | Bin 0 -> 7680 bytes
 mediatek/mt7996/mt7992_rom_patch.bin         | Bin 0 -> 20640 bytes
 mediatek/mt7996/mt7992_rom_patch_23.bin      | Bin 0 -> 20640 bytes
 mediatek/mt7996/mt7992_wa.bin                | Bin 0 -> 536240 bytes
 mediatek/mt7996/mt7992_wa_23.bin             | Bin 0 -> 536240 bytes
 mediatek/mt7996/mt7992_wm.bin                | Bin 0 -> 1712336 bytes
 mediatek/mt7996/mt7992_wm_23.bin             | Bin 0 -> 1672256 bytes
 mediatek/mt7996/mt7996_eeprom_233.bin        | Bin 0 -> 7680 bytes
 mediatek/mt7996/mt7996_eeprom_233_2i5i6i.bin | Bin 0 -> 7680 bytes
 mediatek/mt7996/mt7996_eeprom_2i5i6i.bin     | Bin 0 -> 7680 bytes
 mediatek/mt7996/mt7996_rom_patch_233.bin     | Bin 0 -> 23968 bytes
 mediatek/mt7996/mt7996_wa_233.bin            | Bin 0 -> 516272 bytes
 mediatek/mt7996/mt7996_wm_233.bin            | Bin 0 -> 2620960 bytes
 20 files changed, 42 insertions(+), 1 deletion(-)
 create mode 100644 mediatek/mt7996/mt7992_dsp.bin
 create mode 100644 mediatek/mt7996/mt7992_dsp_23.bin
 create mode 100644 mediatek/mt7996/mt7992_eeprom.bin
 create mode 100644 mediatek/mt7996/mt7992_eeprom_23.bin
 create mode 100644 mediatek/mt7996/mt7992_eeprom_23_2i5i.bin
 create mode 100644 mediatek/mt7996/mt7992_eeprom_2i5e.bin
 create mode 100644 mediatek/mt7996/mt7992_eeprom_2i5i.bin
 create mode 100644 mediatek/mt7996/mt7992_rom_patch.bin
 create mode 100644 mediatek/mt7996/mt7992_rom_patch_23.bin
 create mode 100644 mediatek/mt7996/mt7992_wa.bin
 create mode 100644 mediatek/mt7996/mt7992_wa_23.bin
 create mode 100644 mediatek/mt7996/mt7992_wm.bin
 create mode 100644 mediatek/mt7996/mt7992_wm_23.bin
 create mode 100644 mediatek/mt7996/mt7996_eeprom_233.bin
 create mode 100644 mediatek/mt7996/mt7996_eeprom_233_2i5i6i.bin
 create mode 100644 mediatek/mt7996/mt7996_eeprom_2i5i6i.bin
 create mode 100644 mediatek/mt7996/mt7996_rom_patch_233.bin
 create mode 100644 mediatek/mt7996/mt7996_wa_233.bin
 create mode 100644 mediatek/mt7996/mt7996_wm_233.bin


From andy-ld.lu at mediatek.com  Thu Sep 26 00:03:16 2024
From: andy-ld.lu at mediatek.com (Andy-ld Lu)
Date: Thu, 26 Sep 2024 15:03:16 +0800
Subject: [PATCH 0/2] Add mtk-sd support for MT8196
Message-ID: <20240926070405.20212-1-andy-ld.lu@mediatek.com>

There are some new features for Mediatek SoC MT8196, which include new
command/data transmitting and receiving path (abbreviated as tx/rx), and
a new bus design that prevents the CPU from accessing the IP registers
unless the source clock control gate is enabled. Furthermore, some register
settings are also modified.

The driver code has to be adapted to implement the above changes, and the
compatible 'mediatek,msdc-v2' is added to driver and devicetree bindings,
for MT8196 and future compatible SoCs that support new tx/rx.

Andy-ld Lu (2):
  mmc: mtk-sd: Add support for MT8196
  dt-bindings: mmc: mtk-sd: Add support for MT8196

 .../devicetree/bindings/mmc/mtk-sd.yaml       |  26 +++
 drivers/mmc/host/mtk-sd.c                     | 179 +++++++++++++++---
 2 files changed, 182 insertions(+), 23 deletions(-)

-- 
2.46.0



From andy-ld.lu at mediatek.com  Thu Sep 26 00:03:17 2024
From: andy-ld.lu at mediatek.com (Andy-ld Lu)
Date: Thu, 26 Sep 2024 15:03:17 +0800
Subject: [PATCH 1/2] mmc: mtk-sd: Add support for MT8196
In-Reply-To: <20240926070405.20212-1-andy-ld.lu@mediatek.com>
References: <20240926070405.20212-1-andy-ld.lu@mediatek.com>
Message-ID: <20240926070405.20212-2-andy-ld.lu@mediatek.com>

Mediatek SoC MT8196 features a new design for tx/rx path. The new tx
path incorporates register settings that are closely associated with
bus timing. And the difference between new rx path and older versions
is the usage of distinct register bits when setting the data sampling
edge as part of the tuning process. Add compatible 'mediatek,msdc-v2'
for future SoCs that support new tx/rx.

Compared to the previous SoC, MT8196 showcases a new bus design, which
prevents the CPU from accessing the IP registers when the source CG of
our IP is disabled. To address this, add a property named 'mediatek,
prohibit-gate-cg' in the device tree to ensure source CG is not gated
before writing to MSDC_CFG register.

Besides, there are modified register settings for STOP_DLY_SEL and
POP_EN_CNT, with two new properties added to the device tree to reflect
the modifications.

Signed-off-by: Andy-ld Lu <andy-ld.lu at mediatek.com>
---
 drivers/mmc/host/mtk-sd.c | 179 +++++++++++++++++++++++++++++++++-----
 1 file changed, 156 insertions(+), 23 deletions(-)

diff --git a/drivers/mmc/host/mtk-sd.c b/drivers/mmc/host/mtk-sd.c
index 89018b6c97b9..c265e56eec09 100644
--- a/drivers/mmc/host/mtk-sd.c
+++ b/drivers/mmc/host/mtk-sd.c
@@ -65,6 +65,7 @@
 #define SDC_RESP3        0x4c
 #define SDC_BLK_NUM      0x50
 #define SDC_ADV_CFG0     0x64
+#define MSDC_NEW_RX_CFG  0x68
 #define EMMC_IOCON       0x7c
 #define SDC_ACMD_RESP    0x80
 #define DMA_SA_H4BIT     0x8c
@@ -91,6 +92,7 @@
 #define EMMC_TOP_CONTROL	0x00
 #define EMMC_TOP_CMD		0x04
 #define EMMC50_PAD_DS_TUNE	0x0c
+#define LOOP_TEST_CONTROL	0x30
 
 /*--------------------------------------------------------------------------*/
 /* Register Mask                                                            */
@@ -202,9 +204,13 @@
 #define SDC_STS_CMDBUSY         BIT(1)	/* RW */
 #define SDC_STS_SWR_COMPL       BIT(31)	/* RW */
 
-#define SDC_DAT1_IRQ_TRIGGER	BIT(19)	/* RW */
 /* SDC_ADV_CFG0 mask */
+#define SDC_DAT1_IRQ_TRIGGER	BIT(19)	/* RW */
 #define SDC_RX_ENHANCE_EN	BIT(20)	/* RW */
+#define SDC_NEW_TX_EN		BIT(31)	/* RW */
+
+/* MSDC_NEW_RX_CFG mask */
+#define MSDC_NEW_RX_PATH_SEL	BIT(0)	/* RW */
 
 /* DMA_SA_H4BIT mask */
 #define DMA_ADDR_HIGH_4BIT      GENMASK(3, 0)	/* RW */
@@ -226,6 +232,7 @@
 
 /* MSDC_PATCH_BIT mask */
 #define MSDC_PATCH_BIT_ODDSUPP    BIT(1)	/* RW */
+#define MSDC_PATCH_BIT_RD_DAT_SEL BIT(3)	/* RW */
 #define MSDC_INT_DAT_LATCH_CK_SEL GENMASK(9, 7)
 #define MSDC_CKGEN_MSDC_DLY_SEL   GENMASK(14, 10)
 #define MSDC_PATCH_BIT_IODSSEL    BIT(16)	/* RW */
@@ -247,6 +254,8 @@
 #define MSDC_PB2_SUPPORT_64G      BIT(1)    /* RW */
 #define MSDC_PB2_RESPWAIT         GENMASK(3, 2)   /* RW */
 #define MSDC_PB2_RESPSTSENSEL     GENMASK(18, 16) /* RW */
+#define MSDC_PB2_POP_EN_CNT       GENMASK(23, 20) /* RW */
+#define MSDC_PB2_CFGCRCSTSEDGE    BIT(25)   /* RW */
 #define MSDC_PB2_CRCSTSENSEL      GENMASK(31, 29) /* RW */
 
 #define MSDC_PAD_TUNE_DATWRDLY	  GENMASK(4, 0)		/* RW */
@@ -311,6 +320,12 @@
 #define PAD_DS_DLY1		GENMASK(14, 10)	/* RW */
 #define PAD_DS_DLY3		GENMASK(4, 0)	/* RW */
 
+/* LOOP_TEST_CONTROL mask */
+#define TEST_LOOP_DSCLK_MUX_SEL        BIT(0)	/* RW */
+#define TEST_LOOP_LATCH_MUX_SEL        BIT(1)	/* RW */
+#define LOOP_EN_SEL_CLK                BIT(20)	/* RW */
+#define TEST_HS400_CMD_LOOP_MUX_SEL    BIT(31)	/* RW */
+
 #define REQ_CMD_EIO  BIT(0)
 #define REQ_CMD_TMO  BIT(1)
 #define REQ_DAT_ERR  BIT(2)
@@ -391,6 +406,7 @@ struct msdc_save_para {
 	u32 emmc_top_control;
 	u32 emmc_top_cmd;
 	u32 emmc50_pad_ds_tune;
+	u32 loop_test_control;
 };
 
 struct mtk_mmc_compatible {
@@ -405,6 +421,8 @@ struct mtk_mmc_compatible {
 	bool enhance_rx;
 	bool support_64g;
 	bool use_internal_cd;
+	bool support_new_tx;
+	bool support_new_rx;
 };
 
 struct msdc_tune_para {
@@ -462,6 +480,8 @@ struct msdc_host {
 	unsigned char timing;
 	bool vqmmc_enabled;
 	u32 latch_ck;
+	u32 stop_dly_sel;
+	u32 pop_en_cnt;
 	u32 hs400_ds_delay;
 	u32 hs400_ds_dly3;
 	u32 hs200_cmd_int_delay; /* cmd internal delay for HS200/SDR104 */
@@ -473,6 +493,7 @@ struct msdc_host {
 	bool hs400_tuning;	/* hs400 mode online tuning */
 	bool internal_cd;	/* Use internal card-detect logic */
 	bool cqhci;		/* support eMMC hw cmdq */
+	bool prohibit_gate_cg;	/* prohibit to gate source clock cg before access register */
 	struct msdc_save_para save_para; /* used when gate HCLK */
 	struct msdc_tune_para def_tune_para; /* default tune setting */
 	struct msdc_tune_para saved_tune_para; /* tune result of CMD21/CMD19 */
@@ -621,6 +642,21 @@ static const struct mtk_mmc_compatible mt8516_compat = {
 	.stop_clk_fix = true,
 };
 
+static const struct mtk_mmc_compatible msdc_v2_compat = {
+	.clk_div_bits = 12,
+	.recheck_sdio_irq = false,
+	.hs400_tune = false,
+	.pad_tune_reg = MSDC_PAD_TUNE0,
+	.async_fifo = true,
+	.data_tune = true,
+	.busy_check = true,
+	.stop_clk_fix = true,
+	.enhance_rx = true,
+	.support_64g = true,
+	.support_new_tx = true,
+	.support_new_rx = true,
+};
+
 static const struct of_device_id msdc_of_ids[] = {
 	{ .compatible = "mediatek,mt2701-mmc", .data = &mt2701_compat},
 	{ .compatible = "mediatek,mt2712-mmc", .data = &mt2712_compat},
@@ -633,6 +669,7 @@ static const struct of_device_id msdc_of_ids[] = {
 	{ .compatible = "mediatek,mt8173-mmc", .data = &mt8173_compat},
 	{ .compatible = "mediatek,mt8183-mmc", .data = &mt8183_compat},
 	{ .compatible = "mediatek,mt8516-mmc", .data = &mt8516_compat},
+	{ .compatible = "mediatek,msdc-v2", .data = &msdc_v2_compat},
 
 	{}
 };
@@ -872,6 +909,42 @@ static int msdc_ungate_clock(struct msdc_host *host)
 				  (val & MSDC_CFG_CKSTB), 1, 20000);
 }
 
+static void msdc_new_tx_setting(struct msdc_host *host)
+{
+	if (host->top_base) {
+		sdr_set_bits(host->top_base + LOOP_TEST_CONTROL,
+			     TEST_LOOP_DSCLK_MUX_SEL);
+		sdr_set_bits(host->top_base + LOOP_TEST_CONTROL,
+			     TEST_LOOP_LATCH_MUX_SEL);
+		sdr_clr_bits(host->top_base + LOOP_TEST_CONTROL,
+			     TEST_HS400_CMD_LOOP_MUX_SEL);
+	}
+
+	switch (host->timing) {
+	case MMC_TIMING_LEGACY:
+	case MMC_TIMING_MMC_HS:
+	case MMC_TIMING_SD_HS:
+	case MMC_TIMING_UHS_SDR12:
+	case MMC_TIMING_UHS_SDR25:
+	case MMC_TIMING_UHS_DDR50:
+	case MMC_TIMING_MMC_DDR52:
+		if (host->top_base)
+			sdr_clr_bits(host->top_base + LOOP_TEST_CONTROL,
+				     LOOP_EN_SEL_CLK);
+		break;
+	case MMC_TIMING_UHS_SDR50:
+	case MMC_TIMING_UHS_SDR104:
+	case MMC_TIMING_MMC_HS200:
+	case MMC_TIMING_MMC_HS400:
+		if (host->top_base)
+			sdr_set_bits(host->top_base + LOOP_TEST_CONTROL,
+				     LOOP_EN_SEL_CLK);
+		break;
+	default:
+		break;
+	}
+}
+
 static void msdc_set_mclk(struct msdc_host *host, unsigned char timing, u32 hz)
 {
 	struct mmc_host *mmc = mmc_from_priv(host);
@@ -881,6 +954,7 @@ static void msdc_set_mclk(struct msdc_host *host, unsigned char timing, u32 hz)
 	u32 sclk;
 	u32 tune_reg = host->dev_comp->pad_tune_reg;
 	u32 val;
+	bool timing_changed = false;
 
 	if (!hz) {
 		dev_dbg(host->dev, "set mclk to 0\n");
@@ -890,6 +964,9 @@ static void msdc_set_mclk(struct msdc_host *host, unsigned char timing, u32 hz)
 		return;
 	}
 
+	if (host->timing != timing)
+		timing_changed = true;
+
 	flags = readl(host->base + MSDC_INTEN);
 	sdr_clr_bits(host->base + MSDC_INTEN, flags);
 	if (host->dev_comp->clk_div_bits == 8)
@@ -941,7 +1018,8 @@ static void msdc_set_mclk(struct msdc_host *host, unsigned char timing, u32 hz)
 	}
 	sdr_clr_bits(host->base + MSDC_CFG, MSDC_CFG_CKPDN);
 
-	clk_disable_unprepare(host->src_clk_cg);
+	if (!host->prohibit_gate_cg)
+		clk_disable_unprepare(host->src_clk_cg);
 	if (host->dev_comp->clk_div_bits == 8)
 		sdr_set_field(host->base + MSDC_CFG,
 			      MSDC_CFG_CKMOD | MSDC_CFG_CKDIV,
@@ -951,7 +1029,8 @@ static void msdc_set_mclk(struct msdc_host *host, unsigned char timing, u32 hz)
 			      MSDC_CFG_CKMOD_EXTRA | MSDC_CFG_CKDIV_EXTRA,
 			      (mode << 12) | div);
 
-	clk_prepare_enable(host->src_clk_cg);
+	if (!host->prohibit_gate_cg)
+		clk_prepare_enable(host->src_clk_cg);
 	readl_poll_timeout(host->base + MSDC_CFG, val, (val & MSDC_CFG_CKSTB), 0, 0);
 	sdr_set_bits(host->base + MSDC_CFG, MSDC_CFG_CKPDN);
 	mmc->actual_clock = sclk;
@@ -996,6 +1075,9 @@ static void msdc_set_mclk(struct msdc_host *host, unsigned char timing, u32 hz)
 		sdr_set_field(host->base + tune_reg,
 			      MSDC_PAD_TUNE_CMDRRDLY,
 			      host->hs400_cmd_int_delay);
+	if (timing_changed && host->dev_comp->support_new_tx)
+		msdc_new_tx_setting(host);
+
 	dev_dbg(host->dev, "sclk: %d, timing: %d\n", mmc->actual_clock,
 		timing);
 }
@@ -1704,6 +1786,17 @@ static void msdc_init_hw(struct msdc_host *host)
 		reset_control_deassert(host->reset);
 	}
 
+	/* New tx/rx enable bit need to be 0->1 for hardware check */
+	if (host->dev_comp->support_new_tx) {
+		sdr_clr_bits(host->base + SDC_ADV_CFG0, SDC_NEW_TX_EN);
+		sdr_set_bits(host->base + SDC_ADV_CFG0, SDC_NEW_TX_EN);
+		msdc_new_tx_setting(host);
+	}
+	if (host->dev_comp->support_new_rx) {
+		sdr_clr_bits(host->base + MSDC_NEW_RX_CFG, MSDC_NEW_RX_PATH_SEL);
+		sdr_set_bits(host->base + MSDC_NEW_RX_CFG, MSDC_NEW_RX_PATH_SEL);
+	}
+
 	/* Configure to MMC/SD mode, clock free running */
 	sdr_set_bits(host->base + MSDC_CFG, MSDC_CFG_MODE | MSDC_CFG_CKPDN);
 
@@ -1742,8 +1835,19 @@ static void msdc_init_hw(struct msdc_host *host)
 	sdr_set_bits(host->base + EMMC50_CFG0, EMMC50_CFG_CFCSTS_SEL);
 
 	if (host->dev_comp->stop_clk_fix) {
-		sdr_set_field(host->base + MSDC_PATCH_BIT1,
-			      MSDC_PATCH_BIT1_STOP_DLY, 3);
+		if (host->stop_dly_sel)
+			sdr_set_field(host->base + MSDC_PATCH_BIT1,
+				      MSDC_PATCH_BIT1_STOP_DLY,
+				      host->stop_dly_sel & 0xf);
+		else
+			sdr_set_field(host->base + MSDC_PATCH_BIT1,
+				      MSDC_PATCH_BIT1_STOP_DLY, 3);
+
+		if (host->pop_en_cnt)
+			sdr_set_field(host->base + MSDC_PATCH_BIT2,
+				      MSDC_PB2_POP_EN_CNT,
+				      host->pop_en_cnt & 0xf);
+
 		sdr_clr_bits(host->base + SDC_FIFO_CFG,
 			     SDC_FIFO_CFG_WRVALIDSEL);
 		sdr_clr_bits(host->base + SDC_FIFO_CFG,
@@ -2055,6 +2159,19 @@ static inline void msdc_set_data_delay(struct msdc_host *host, u32 value)
 	}
 }
 
+static inline void msdc_set_data_sample_edge(struct msdc_host *host, bool rising)
+{
+	u32 value = rising ? 0 : 1;
+
+	if (host->dev_comp->support_new_rx) {
+		sdr_set_field(host->base + MSDC_PATCH_BIT, MSDC_PATCH_BIT_RD_DAT_SEL, value);
+		sdr_set_field(host->base + MSDC_PATCH_BIT2, MSDC_PB2_CFGCRCSTSEDGE, value);
+	} else {
+		sdr_set_field(host->base + MSDC_IOCON, MSDC_IOCON_DSPL, value);
+		sdr_set_field(host->base + MSDC_IOCON, MSDC_IOCON_W_DSPL, value);
+	}
+}
+
 static int msdc_tune_response(struct mmc_host *mmc, u32 opcode)
 {
 	struct msdc_host *host = mmc_priv(mmc);
@@ -2210,8 +2327,7 @@ static int msdc_tune_data(struct mmc_host *mmc, u32 opcode)
 
 	sdr_set_field(host->base + MSDC_PATCH_BIT, MSDC_INT_DAT_LATCH_CK_SEL,
 		      host->latch_ck);
-	sdr_clr_bits(host->base + MSDC_IOCON, MSDC_IOCON_DSPL);
-	sdr_clr_bits(host->base + MSDC_IOCON, MSDC_IOCON_W_DSPL);
+	msdc_set_data_sample_edge(host, true);
 	for (i = 0; i < host->tuning_step; i++) {
 		msdc_set_data_delay(host, i);
 		ret = mmc_send_tuning(mmc, opcode, NULL);
@@ -2224,8 +2340,7 @@ static int msdc_tune_data(struct mmc_host *mmc, u32 opcode)
 	    (final_rise_delay.start == 0 && final_rise_delay.maxlen >= 4))
 		goto skip_fall;
 
-	sdr_set_bits(host->base + MSDC_IOCON, MSDC_IOCON_DSPL);
-	sdr_set_bits(host->base + MSDC_IOCON, MSDC_IOCON_W_DSPL);
+	msdc_set_data_sample_edge(host, false);
 	for (i = 0; i < host->tuning_step; i++) {
 		msdc_set_data_delay(host, i);
 		ret = mmc_send_tuning(mmc, opcode, NULL);
@@ -2237,12 +2352,10 @@ static int msdc_tune_data(struct mmc_host *mmc, u32 opcode)
 skip_fall:
 	final_maxlen = max(final_rise_delay.maxlen, final_fall_delay.maxlen);
 	if (final_maxlen == final_rise_delay.maxlen) {
-		sdr_clr_bits(host->base + MSDC_IOCON, MSDC_IOCON_DSPL);
-		sdr_clr_bits(host->base + MSDC_IOCON, MSDC_IOCON_W_DSPL);
+		msdc_set_data_sample_edge(host, true);
 		final_delay = final_rise_delay.final_phase;
 	} else {
-		sdr_set_bits(host->base + MSDC_IOCON, MSDC_IOCON_DSPL);
-		sdr_set_bits(host->base + MSDC_IOCON, MSDC_IOCON_W_DSPL);
+		msdc_set_data_sample_edge(host, false);
 		final_delay = final_fall_delay.final_phase;
 	}
 	msdc_set_data_delay(host, final_delay);
@@ -2267,8 +2380,7 @@ static int msdc_tune_together(struct mmc_host *mmc, u32 opcode)
 		      host->latch_ck);
 
 	sdr_clr_bits(host->base + MSDC_IOCON, MSDC_IOCON_RSPL);
-	sdr_clr_bits(host->base + MSDC_IOCON,
-		     MSDC_IOCON_DSPL | MSDC_IOCON_W_DSPL);
+	msdc_set_data_sample_edge(host, true);
 	for (i = 0; i < host->tuning_step; i++) {
 		msdc_set_cmd_delay(host, i);
 		msdc_set_data_delay(host, i);
@@ -2283,8 +2395,7 @@ static int msdc_tune_together(struct mmc_host *mmc, u32 opcode)
 		goto skip_fall;
 
 	sdr_set_bits(host->base + MSDC_IOCON, MSDC_IOCON_RSPL);
-	sdr_set_bits(host->base + MSDC_IOCON,
-		     MSDC_IOCON_DSPL | MSDC_IOCON_W_DSPL);
+	msdc_set_data_sample_edge(host, false);
 	for (i = 0; i < host->tuning_step; i++) {
 		msdc_set_cmd_delay(host, i);
 		msdc_set_data_delay(host, i);
@@ -2298,13 +2409,11 @@ static int msdc_tune_together(struct mmc_host *mmc, u32 opcode)
 	final_maxlen = max(final_rise_delay.maxlen, final_fall_delay.maxlen);
 	if (final_maxlen == final_rise_delay.maxlen) {
 		sdr_clr_bits(host->base + MSDC_IOCON, MSDC_IOCON_RSPL);
-		sdr_clr_bits(host->base + MSDC_IOCON,
-			     MSDC_IOCON_DSPL | MSDC_IOCON_W_DSPL);
+		msdc_set_data_sample_edge(host, true);
 		final_delay = final_rise_delay.final_phase;
 	} else {
 		sdr_set_bits(host->base + MSDC_IOCON, MSDC_IOCON_RSPL);
-		sdr_set_bits(host->base + MSDC_IOCON,
-			     MSDC_IOCON_DSPL | MSDC_IOCON_W_DSPL);
+		msdc_set_data_sample_edge(host, false);
 		final_delay = final_fall_delay.final_phase;
 	}
 
@@ -2324,8 +2433,7 @@ static int msdc_execute_tuning(struct mmc_host *mmc, u32 opcode)
 	if (host->dev_comp->data_tune && host->dev_comp->async_fifo) {
 		ret = msdc_tune_together(mmc, opcode);
 		if (host->hs400_mode) {
-			sdr_clr_bits(host->base + MSDC_IOCON,
-				     MSDC_IOCON_DSPL | MSDC_IOCON_W_DSPL);
+			msdc_set_data_sample_edge(host, true);
 			msdc_set_data_delay(host, 0);
 		}
 		goto tune_done;
@@ -2649,12 +2757,24 @@ static void msdc_of_property_parse(struct platform_device *pdev,
 	of_property_read_u32(pdev->dev.of_node, "mediatek,hs400-cmd-int-delay",
 			     &host->hs400_cmd_int_delay);
 
+	of_property_read_u32(pdev->dev.of_node, "mediatek,stop-dly-sel",
+			     &host->stop_dly_sel);
+
+	of_property_read_u32(pdev->dev.of_node, "mediatek,pop-en-cnt",
+			     &host->pop_en_cnt);
+
 	if (of_property_read_bool(pdev->dev.of_node,
 				  "mediatek,hs400-cmd-resp-sel-rising"))
 		host->hs400_cmd_resp_sel_rising = true;
 	else
 		host->hs400_cmd_resp_sel_rising = false;
 
+	if (of_property_read_bool(pdev->dev.of_node,
+				  "mediatek,prohibit-gate-cg"))
+		host->prohibit_gate_cg = true;
+	else
+		host->prohibit_gate_cg = false;
+
 	if (of_property_read_u32(pdev->dev.of_node, "mediatek,tuning-step",
 				 &host->tuning_step)) {
 		if (mmc->caps2 & MMC_CAP2_NO_MMC)
@@ -2995,6 +3115,8 @@ static void msdc_save_reg(struct msdc_host *host)
 			readl(host->top_base + EMMC_TOP_CMD);
 		host->save_para.emmc50_pad_ds_tune =
 			readl(host->top_base + EMMC50_PAD_DS_TUNE);
+		host->save_para.loop_test_control =
+			readl(host->top_base + LOOP_TEST_CONTROL);
 	} else {
 		host->save_para.pad_tune = readl(host->base + tune_reg);
 	}
@@ -3005,6 +3127,15 @@ static void msdc_restore_reg(struct msdc_host *host)
 	struct mmc_host *mmc = mmc_from_priv(host);
 	u32 tune_reg = host->dev_comp->pad_tune_reg;
 
+	if (host->dev_comp->support_new_tx) {
+		sdr_clr_bits(host->base + SDC_ADV_CFG0, SDC_NEW_TX_EN);
+		sdr_set_bits(host->base + SDC_ADV_CFG0, SDC_NEW_TX_EN);
+	}
+	if (host->dev_comp->support_new_rx) {
+		sdr_clr_bits(host->base + MSDC_NEW_RX_CFG, MSDC_NEW_RX_PATH_SEL);
+		sdr_set_bits(host->base + MSDC_NEW_RX_CFG, MSDC_NEW_RX_PATH_SEL);
+	}
+
 	writel(host->save_para.msdc_cfg, host->base + MSDC_CFG);
 	writel(host->save_para.iocon, host->base + MSDC_IOCON);
 	writel(host->save_para.sdc_cfg, host->base + SDC_CFG);
@@ -3023,6 +3154,8 @@ static void msdc_restore_reg(struct msdc_host *host)
 		       host->top_base + EMMC_TOP_CMD);
 		writel(host->save_para.emmc50_pad_ds_tune,
 		       host->top_base + EMMC50_PAD_DS_TUNE);
+		writel(host->save_para.loop_test_control,
+		       host->top_base + LOOP_TEST_CONTROL);
 	} else {
 		writel(host->save_para.pad_tune, host->base + tune_reg);
 	}
-- 
2.46.0



From andy-ld.lu at mediatek.com  Thu Sep 26 00:03:18 2024
From: andy-ld.lu at mediatek.com (Andy-ld Lu)
Date: Thu, 26 Sep 2024 15:03:18 +0800
Subject: [PATCH 2/2] dt-bindings: mmc: mtk-sd: Add support for MT8196
In-Reply-To: <20240926070405.20212-1-andy-ld.lu@mediatek.com>
References: <20240926070405.20212-1-andy-ld.lu@mediatek.com>
Message-ID: <20240926070405.20212-3-andy-ld.lu@mediatek.com>

Extend the devicetree bindings to include the MT8196 mmc controller
by adding the compatible string 'mediatek,msdc-v2', which could be
also used for future compatible SoCs that support new tx/rx.

Add three properties for MT8196 settings:
- 'mediatek,prohibit-gate-cg', indicate if the source clock CG could
  be disabled when CPU access IP registers.

- 'mediatek,stop-dly-sel', configure read data clock stops at block gap.

- 'mediatek,pop-en-cnt', configure the margins of write and read
  pointers while begin to pop data transfer.

Signed-off-by: Andy-ld Lu <andy-ld.lu at mediatek.com>
---
 .../devicetree/bindings/mmc/mtk-sd.yaml       | 26 +++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/Documentation/devicetree/bindings/mmc/mtk-sd.yaml b/Documentation/devicetree/bindings/mmc/mtk-sd.yaml
index c532ec92d2d9..82d1a9fac67c 100644
--- a/Documentation/devicetree/bindings/mmc/mtk-sd.yaml
+++ b/Documentation/devicetree/bindings/mmc/mtk-sd.yaml
@@ -25,6 +25,7 @@ properties:
           - mediatek,mt8173-mmc
           - mediatek,mt8183-mmc
           - mediatek,mt8516-mmc
+          - mediatek,msdc-v2
       - items:
           - const: mediatek,mt7623-mmc
           - const: mediatek,mt2701-mmc
@@ -154,6 +155,30 @@ properties:
     enum: [32, 64]
     default: 32
 
+  mediatek,stop-dly-sel:
+    $ref: /schemas/types.yaml#/definitions/uint32
+    description:
+      Some SoCs need to set appropriate stop-dly-sel to configure read data clock
+      stops at block gap. The valid range is from 0 to 0xf.
+    minimum: 0
+    maximum: 0xf
+
+  mediatek,pop-en-cnt:
+    $ref: /schemas/types.yaml#/definitions/uint32
+    description:
+      Some SoCs need to set appropriate pop-en-cnt to configure the margins of write
+      and read pointers while begin to pop data transfer. The valid range is from 0
+      to 0xf.
+    minimum: 0
+    maximum: 0xf
+
+  mediatek,prohibit-gate-cg:
+    $ref: /schemas/types.yaml#/definitions/flag
+    description:
+      Decide if source clock CG could be disabled when CPU access IP registers.
+      If present, source clock CG could not be disabled.
+      If not present, source clock CG could be disabled.
+
   resets:
     maxItems: 1
 
@@ -191,6 +216,7 @@ allOf:
             - mediatek,mt8188-mmc
             - mediatek,mt8195-mmc
             - mediatek,mt8516-mmc
+            - mediatek,msdc-v2
     then:
       properties:
         clocks:
-- 
2.46.0



From vignesh.raman at collabora.com  Thu Sep 26 00:06:49 2024
From: vignesh.raman at collabora.com (Vignesh Raman)
Date: Thu, 26 Sep 2024 12:36:49 +0530
Subject: [PATCH v2] docs/gpu: ci: update flake tests requirements
Message-ID: <20240926070653.1773597-1-vignesh.raman@collabora.com>

Update the documentation to require linking to a relevant GitLab
issue for each new flake entry instead of an email report. Added
specific GitLab issue URLs for i915, xe and other drivers.

Signed-off-by: Vignesh Raman <vignesh.raman at collabora.com>
---

v2:
- Add gitlab issue link for msm driver.

---
 Documentation/gpu/automated_testing.rst | 16 +++++++++++-----
 1 file changed, 11 insertions(+), 5 deletions(-)

diff --git a/Documentation/gpu/automated_testing.rst b/Documentation/gpu/automated_testing.rst
index 2d5a28866afe..f918fe56f2b0 100644
--- a/Documentation/gpu/automated_testing.rst
+++ b/Documentation/gpu/automated_testing.rst
@@ -67,20 +67,26 @@ Lists the tests that for a given driver on a specific hardware revision are
 known to behave unreliably. These tests won't cause a job to fail regardless of
 the result. They will still be run.
 
-Each new flake entry must be associated with a link to the email reporting the
-bug to the author of the affected driver, the board name or Device Tree name of
-the board, the first kernel version affected, the IGT version used for tests,
-and an approximation of the failure rate.
+Each new flake entry must include a link to the relevant GitLab issue, the board
+name or Device Tree name, the first kernel version affected, the IGT version used
+for tests and an approximation of the failure rate.
 
 They should be provided under the following format::
 
-  # Bug Report: $LORE_OR_PATCHWORK_URL
+  # Bug Report: $GITLAB_ISSUE
   # Board Name: broken-board.dtb
   # Linux Version: 6.6-rc1
   # IGT Version: 1.28-gd2af13d9f
   # Failure Rate: 100
   flaky-test
 
+The GitLab issue must include the logs and the pipeline link. Use the appropriate
+link below to create an issue.
+https://gitlab.freedesktop.org/drm/i915/kernel/-/issues for i915 driver
+https://gitlab.freedesktop.org/drm/xe/kernel/-/issues for xe driver
+https://gitlab.freedesktop.org/drm/msm/-/issues for msm driver
+https://gitlab.freedesktop.org/drm/misc/kernel/-/issues for other drivers
+
 drivers/gpu/drm/ci/${DRIVER_NAME}-${HW_REVISION}-skips.txt
 -----------------------------------------------------------
 
-- 
2.43.0



From mripard at kernel.org  Thu Sep 26 00:26:27 2024
From: mripard at kernel.org (Maxime Ripard)
Date: Thu, 26 Sep 2024 09:26:27 +0200
Subject: [PATCH v2] docs/gpu: ci: update flake tests requirements
In-Reply-To: <20240926070653.1773597-1-vignesh.raman@collabora.com>
References: <20240926070653.1773597-1-vignesh.raman@collabora.com>
Message-ID: <20240926-athletic-gregarious-markhor-cc78ac@houat>

On Thu, Sep 26, 2024 at 12:36:49PM GMT, Vignesh Raman wrote:
> Update the documentation to require linking to a relevant GitLab
> issue for each new flake entry instead of an email report. Added
> specific GitLab issue URLs for i915, xe and other drivers.
> 
> Signed-off-by: Vignesh Raman <vignesh.raman at collabora.com>
> ---
> 
> v2:
> - Add gitlab issue link for msm driver.
> 
> ---
>  Documentation/gpu/automated_testing.rst | 16 +++++++++++-----
>  1 file changed, 11 insertions(+), 5 deletions(-)
> 
> diff --git a/Documentation/gpu/automated_testing.rst b/Documentation/gpu/automated_testing.rst
> index 2d5a28866afe..f918fe56f2b0 100644
> --- a/Documentation/gpu/automated_testing.rst
> +++ b/Documentation/gpu/automated_testing.rst
> @@ -67,20 +67,26 @@ Lists the tests that for a given driver on a specific hardware revision are
>  known to behave unreliably. These tests won't cause a job to fail regardless of
>  the result. They will still be run.
>  
> -Each new flake entry must be associated with a link to the email reporting the
> -bug to the author of the affected driver, the board name or Device Tree name of
> -the board, the first kernel version affected, the IGT version used for tests,
> -and an approximation of the failure rate.
> +Each new flake entry must include a link to the relevant GitLab issue, the board
> +name or Device Tree name, the first kernel version affected, the IGT version used
> +for tests and an approximation of the failure rate.
>  
>  They should be provided under the following format::
>  
> -  # Bug Report: $LORE_OR_PATCHWORK_URL
> +  # Bug Report: $GITLAB_ISSUE
>    # Board Name: broken-board.dtb
>    # Linux Version: 6.6-rc1
>    # IGT Version: 1.28-gd2af13d9f
>    # Failure Rate: 100
>    flaky-test
>  
> +The GitLab issue must include the logs and the pipeline link. Use the appropriate
> +link below to create an issue.
> +https://gitlab.freedesktop.org/drm/i915/kernel/-/issues for i915 driver
> +https://gitlab.freedesktop.org/drm/xe/kernel/-/issues for xe driver
> +https://gitlab.freedesktop.org/drm/msm/-/issues for msm driver
> +https://gitlab.freedesktop.org/drm/misc/kernel/-/issues for other drivers
> +

I can't comment for the others, but drm-misc at least still requires
reporting issues by mail, so, no, sorry, we can't switch to gitlab only
for now.

Maxime
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 273 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-mediatek/attachments/20240926/526bfc68/attachment-0001.sig>

From dmitry.baryshkov at linaro.org  Thu Sep 26 00:29:24 2024
From: dmitry.baryshkov at linaro.org (Dmitry Baryshkov)
Date: Thu, 26 Sep 2024 10:29:24 +0300
Subject: [PATCH v2] docs/gpu: ci: update flake tests requirements
In-Reply-To: <20240926070653.1773597-1-vignesh.raman@collabora.com>
References: <20240926070653.1773597-1-vignesh.raman@collabora.com>
Message-ID: <llzzzcfbb5gpdcldobqsl5yqgac6cpgcs4r5jh7sbbsuwhchua@avub3pj2by4z>

On Thu, Sep 26, 2024 at 12:36:49PM GMT, Vignesh Raman wrote:
> Update the documentation to require linking to a relevant GitLab
> issue for each new flake entry instead of an email report. Added
> specific GitLab issue URLs for i915, xe and other drivers.
> 
> Signed-off-by: Vignesh Raman <vignesh.raman at collabora.com>
> ---
> 
> v2:
> - Add gitlab issue link for msm driver.
> 
> ---
>  Documentation/gpu/automated_testing.rst | 16 +++++++++++-----
>  1 file changed, 11 insertions(+), 5 deletions(-)
> 
> diff --git a/Documentation/gpu/automated_testing.rst b/Documentation/gpu/automated_testing.rst
> index 2d5a28866afe..f918fe56f2b0 100644
> --- a/Documentation/gpu/automated_testing.rst
> +++ b/Documentation/gpu/automated_testing.rst
> @@ -67,20 +67,26 @@ Lists the tests that for a given driver on a specific hardware revision are
>  known to behave unreliably. These tests won't cause a job to fail regardless of
>  the result. They will still be run.
>  
> -Each new flake entry must be associated with a link to the email reporting the
> -bug to the author of the affected driver, the board name or Device Tree name of
> -the board, the first kernel version affected, the IGT version used for tests,
> -and an approximation of the failure rate.
> +Each new flake entry must include a link to the relevant GitLab issue, the board
> +name or Device Tree name, the first kernel version affected, the IGT version used
> +for tests and an approximation of the failure rate.
>  
>  They should be provided under the following format::
>  
> -  # Bug Report: $LORE_OR_PATCHWORK_URL
> +  # Bug Report: $GITLAB_ISSUE
>    # Board Name: broken-board.dtb
>    # Linux Version: 6.6-rc1
>    # IGT Version: 1.28-gd2af13d9f
>    # Failure Rate: 100
>    flaky-test
>  
> +The GitLab issue must include the logs and the pipeline link. Use the appropriate
> +link below to create an issue.
> +https://gitlab.freedesktop.org/drm/i915/kernel/-/issues for i915 driver
> +https://gitlab.freedesktop.org/drm/xe/kernel/-/issues for xe driver
> +https://gitlab.freedesktop.org/drm/msm/-/issues for msm driver

Ack for the MSM part.

> +https://gitlab.freedesktop.org/drm/misc/kernel/-/issues for other drivers

-- 
With best wishes
Dmitry


From dmitry.baryshkov at linaro.org  Thu Sep 26 00:32:41 2024
From: dmitry.baryshkov at linaro.org (Dmitry Baryshkov)
Date: Thu, 26 Sep 2024 10:32:41 +0300
Subject: [PATCH 0/6] drm: constify read-only regmap structs
In-Reply-To: <20240925-drm-const-regmap-v1-0-e609d502401b@gmail.com>
References: <20240925-drm-const-regmap-v1-0-e609d502401b@gmail.com>
Message-ID: <3i46wd7hqr5u3oxqlgyff4i27vxpg3spewkhby336hxmgbvmon@wijkq64pluzg>

On Wed, Sep 25, 2024 at 05:42:39PM GMT, Javier Carrasco wrote:
> This series adds the const modifier to the remaining regmap_bus and
> regmap_config structs under drm/ that are effectively used as const
> (i.e., only read after their declaration), but kept ad writtable data.
> 
> Signed-off-by: Javier Carrasco <javier.carrasco.cruz at gmail.com>
> ---
> Javier Carrasco (6):
>       drm/bridge: dpc3433: Constify struct regmap_config
>       drm/fsl-dcu: Constify struct regmap_config
>       drm/mediatek: dp: Constify struct regmap_config
>       drm/meson: Constify struct regmap_config
>       drm/panel: ili9322: Constify struct regmap_bus
>       drm/sprd: Constify struct regmap_bus
> 

For the series:


Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov at linaro.org>


-- 
With best wishes
Dmitry


From Jason-JH.Lin at mediatek.com  Thu Sep 26 01:28:19 2024
From: Jason-JH.Lin at mediatek.com (=?utf-8?B?SmFzb24tSkggTGluICjmnpfnnb/npaUp?=)
Date: Thu, 26 Sep 2024 08:28:19 +0000
Subject: [PATCH v5 2/2] drm/mediatek: Add blend_modes to mtk_plane_init()
 for different SoCs
In-Reply-To: <bcdabb15b002c47512358cfabdfb49bc12f42596.camel@mediatek.com>
References: <20240925101927.17042-1-jason-jh.lin@mediatek.com>
	 <20240925101927.17042-3-jason-jh.lin@mediatek.com>
	 <bcdabb15b002c47512358cfabdfb49bc12f42596.camel@mediatek.com>
Message-ID: <33b11e373bec29ea37e094fa131843e2a163de76.camel@mediatek.com>

On Thu, 2024-09-26 at 02:34 +0000, CK Hu (???) wrote:
> Hi, Jason:
> 
> On Wed, 2024-09-25 at 18:19 +0800, Jason-JH.Lin wrote:
> > Since some SoCs support premultiplied pixel formats but some do
> > not,
> > the blend_modes parameter is added to mtk_plane_init(), which is
> > obtained from the mtk_ddp_comp_get_blend_modes function implemented
> > in different OVL components.
> > 
> > The OVL component can use driver data to set the blend mode
> > capabilities for different SoCs.
> > 
> > Fixes: 4225d5d5e779 ("drm/mediatek: Support alpha blending in
> > display driver")
> > Signed-off-by: Jason-JH.Lin <jason-jh.lin at mediatek.com>
> > ---
> 
> [snip]
> 
> > +
> >  const u32 *mtk_ovl_get_formats(struct device *dev)
> >  {
> >  	struct mtk_disp_ovl *ovl = dev_get_drvdata(dev);
> > @@ -674,6 +682,8 @@ static const struct mtk_disp_ovl_data
> > mt2701_ovl_driver_data = {
> >  	.layer_nr = 4,
> >  	.fmt_convert = mtk_ovl_fmt_convert,
> >  	.fmt_rgb565_is_0 = false,
> > +	.blend_modes = BIT(DRM_MODE_BLEND_COVERAGE) |
> > +		       BIT(DRM_MODE_BLEND_PIXEL_NONE),
> 
> When blend_modes has no pre-multiplied, fmt_convert is
> mtk_ovl_fmt_convert().
> When blend_modes pre-multiplied, fmt_convert is
> mtk_ovl_fmt_convert_with_blend().
> 
> I think we could keep blend_modes and drop fmt_convert.
> 
> if (data->blend_modes & BIT(DRM_MODE_BLEND_PREMULTI))
> 	mtk_ovl_fmt_convert_with_blend(fmt, blend_modes);
> else
> 	mtk_ovl_fmt_convert(fmt);
> 
> In current patch, when SoC does not support pre-multiplied but user
> space set pre-multiplied buffer,
> driver would keep going and treat it as coverage buffer.
> 
> I think the result is wrong but it's error handling.

Yes, OVL in previous SoCs only support the color format with coverage
mode, even if user space set pre-multiplied buffer.
I'll write the comment in this part of code.

> If we accept this error, why not keep only
> mtk_ovl_fmt_convert_with_blend() and drop mtk_ovl_fmt_convert().
> 
> if (data->blend_modes & BIT(DRM_MODE_BLEND_PREMULTI))
> 	mtk_ovl_fmt_convert_with_blend(fmt, blend_modes);
> else
> 	mtk_ovl_fmt_convert_with_blend(fmt, blend_modes);
> 
> and this would result in:
> 
> mtk_ovl_fmt_convert_with_blend(fmt, blend_modes);

OK I'll drop the function pointer and use blend_modes to cope with
this.

> [snip]
> 
> > diff --git a/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c
> > b/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c
> > index c6768210b08b..2d47b6eb4c19 100644
> > --- a/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c
> > +++ b/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c
> > @@ -400,6 +400,13 @@ void mtk_ovl_adaptor_disable_vblank(struct
> > device *dev)
> >  	mtk_ethdr_disable_vblank(ovl_adaptor-
> > >ovl_adaptor_comp[OVL_ADAPTOR_ETHDR0]);
> >  }
> >  
> > +const u32 mtk_ovl_adaptor_get_blend_modes(struct device *dev)
> > +{
> > +	struct mtk_disp_ovl_adaptor *ovl_adaptor =
> > dev_get_drvdata(dev);
> > +
> > +	return mtk_mdp_rdma_get_blend_modes(ovl_adaptor-
> > >ovl_adaptor_comp[OVL_ADAPTOR_MDP_RDMA0]);
> 
> RDMA has no alpha blending function.
> Get blend mode from ethdr.

OK, I'll change it to ethdr.

> 
> > +}
> > +
> >  
> 
> [snip]
> 
> >  
> > @@ -366,10 +366,7 @@ int mtk_plane_init(struct drm_device *dev,
> > struct drm_plane *plane,
> >  	if (err)
> >  		DRM_ERROR("failed to create property: alpha\n");
> >  
> > -	err = drm_plane_create_blend_mode_property(plane,
> > -						   BIT(DRM_MODE_BLEND_P
> > REMULTI) |
> > -						   BIT(DRM_MODE_BLEND_C
> > OVERAGE) |
> > -						   BIT(DRM_MODE_BLEND_P
> > IXEL_NONE));
> > +	err = drm_plane_create_blend_mode_property(plane, blend_modes);
> 
> For disp_rdma, blend_modes is 0, I this is not necessary to create
> blend mode property.

OK, I'll add the 0 checking for this.

Regards,
Jason-JH.Lin

> 
> Regards,
> CK

From angelogioacchino.delregno at collabora.com  Thu Sep 26 01:33:32 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Thu, 26 Sep 2024 10:33:32 +0200
Subject: [PATCH 6/6] arm64: dts: mediatek: mt8188: Update vppsys node
 names to syscon
In-Reply-To: <20240925110044.3678055-7-fshao@chromium.org>
References: <20240925110044.3678055-1-fshao@chromium.org>
 <20240925110044.3678055-7-fshao@chromium.org>
Message-ID: <3191519f-0228-4d40-be38-8ab8a4970ad3@collabora.com>

Il 25/09/24 12:57, Fei Shao ha scritto:
> The MediaTek mmsys is more than just a clock controller; it's a
> system controller. In addition to clock controls, it provides display
> pipeline routing controls and other miscellaneous control registers.
> 
> On the MT8188 and MT8195 SoCs, the mmsys blocks utilize the same mmsys
> driver but have been aliased to "vdosys" and "vppsys", likely to better
> represent their actual functionality.
> 
> Update the vppsys node names and compatibles in MT8188 DT to reflect
> that and fix dtbs_check errors against mediatek/mt8188-evb.dtb.
> 
> Signed-off-by: Fei Shao <fshao at chromium.org>

Fair point.

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>




From angelogioacchino.delregno at collabora.com  Thu Sep 26 01:33:34 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Thu, 26 Sep 2024 10:33:34 +0200
Subject: [PATCH 4/6] arm64: dts: mediatek: mt8188: Add missing dma-ranges
 to soc node
In-Reply-To: <20240925110044.3678055-5-fshao@chromium.org>
References: <20240925110044.3678055-1-fshao@chromium.org>
 <20240925110044.3678055-5-fshao@chromium.org>
Message-ID: <e3315457-a969-4890-807b-50a4bd02a333@collabora.com>

Il 25/09/24 12:57, Fei Shao ha scritto:
> Add the missing dma-ranges property to the soc node, similar to how it
> was done for MT8195 and MT8192.
> 
> This allows the entire 16GB of iova range to be used and enables
> multimedia processing usages, like vcodec and MIPI camera.
> 
> Signed-off-by: Fei Shao <fshao at chromium.org>

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>




From angelogioacchino.delregno at collabora.com  Thu Sep 26 01:33:36 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Thu, 26 Sep 2024 10:33:36 +0200
Subject: [PATCH 5/6] arm64: dts: mediatek: mt8188: Move vdec1 power domain
 under vdec0
In-Reply-To: <20240925110044.3678055-6-fshao@chromium.org>
References: <20240925110044.3678055-1-fshao@chromium.org>
 <20240925110044.3678055-6-fshao@chromium.org>
Message-ID: <b3842173-7074-4bcb-80f4-1f6f8cb38a52@collabora.com>

Il 25/09/24 12:57, Fei Shao ha scritto:
> There are two hardware IP blocks in MT8188 video decoder pipeline:
> vdec-lat and vdec-core, which are powered by vdec0 and vdec1 power
> domains respectively.
> 
> We noticed that vdec-core needs to be powered down before vdec-lat
> during suspend to prevent failures. It's unclear if it's an intended
> hardware design or due to power isolation glitch. But in any case, we
> observed a power-off sequence here, and it can be considered as an
> indirect dependency implication between the vdec0 and vdec1 domains.
> 
> Given that, update vdec1 as a sub-domain of vdec0 to enforce the
> sequence. Also, use more specific clock names for both power domains.
> 

As far as I know, yes, there is a sequence:
  - Cores (mtk-vcodec-core) gets suspended first
  - Then the LATs gets suspended (mtk-vcodec-lat)
  - Finally, the LAT SoC gets suspended (mtk-vcodec-lat-soc)

...but you checked that downstream, and your downstream misses the lat-soc HW
instance, and only has the lat one.

Are you sure that this is not the reason why you're getting this issue? :-)

Otherwise, I feel like we must ask for some clarification from MediaTek, as
I'm mostly sure that the two cores are independent from each other (but I
might, of course, be wrong!).

Cheers,
Angelo

> Signed-off-by: Fei Shao <fshao at chromium.org>
> ---
> 
>   arch/arm64/boot/dts/mediatek/mt8188.dtsi | 22 ++++++++++++----------
>   1 file changed, 12 insertions(+), 10 deletions(-)
> 
> diff --git a/arch/arm64/boot/dts/mediatek/mt8188.dtsi b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
> index ff5c8e0597f9..a6cd08ea74eb 100644
> --- a/arch/arm64/boot/dts/mediatek/mt8188.dtsi
> +++ b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
> @@ -1064,20 +1064,22 @@ power-domain at MT8188_POWER_DOMAIN_VPPSYS1 {
>   							#power-domain-cells = <0>;
>   						};
>   
> -						power-domain at MT8188_POWER_DOMAIN_VDEC1 {
> -							reg = <MT8188_POWER_DOMAIN_VDEC1>;
> -							clocks = <&vdecsys CLK_VDEC2_LARB1>;
> -							clock-names = "ss-vdec";
> -							mediatek,infracfg = <&infracfg_ao>;
> -							#power-domain-cells = <0>;
> -						};
> -
>   						power-domain at MT8188_POWER_DOMAIN_VDEC0 {
>   							reg = <MT8188_POWER_DOMAIN_VDEC0>;
>   							clocks = <&vdecsys_soc CLK_VDEC1_SOC_LARB1>;
> -							clock-names = "ss-vdec";
> +							clock-names = "ss-vdec1-soc-l1";
>   							mediatek,infracfg = <&infracfg_ao>;
> -							#power-domain-cells = <0>;
> +							#address-cells = <1>;
> +							#size-cells = <0>;
> +							#power-domain-cells = <1>;
> +
> +							power-domain at MT8188_POWER_DOMAIN_VDEC1 {
> +								reg = <MT8188_POWER_DOMAIN_VDEC1>;
> +								clocks = <&vdecsys CLK_VDEC2_LARB1>;
> +								clock-names = "ss-vdec2-l1";
> +								mediatek,infracfg = <&infracfg_ao>;
> +								#power-domain-cells = <0>;
> +							};
>   						};
>   
>   						cam_vcore: power-domain at MT8188_POWER_DOMAIN_CAM_VCORE {




From angelogioacchino.delregno at collabora.com  Thu Sep 26 01:33:38 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Thu, 26 Sep 2024 10:33:38 +0200
Subject: [PATCH 3/6] arm64: dts: mediatek: mt8188: Define CPU big core
 cluster
In-Reply-To: <20240925110044.3678055-4-fshao@chromium.org>
References: <20240925110044.3678055-1-fshao@chromium.org>
 <20240925110044.3678055-4-fshao@chromium.org>
Message-ID: <fbdbe9ff-586a-429c-a987-b8ec39b485e8@collabora.com>

Il 25/09/24 12:57, Fei Shao ha scritto:
> The MT8188 SoC features two CPU clusters: one with 6 little Cortex-A55
> cores, and the other with 2 big Cortex-A78 cores.

No, it doesn't. It features only one cluster, so...

> 
> Update the CPU topology to reflect the actual hardware configurations.

...the actual hardware configuration is already reflected by the currently
declared CPU topology, so for this commit: NAK.

This SoC uses the ARM DynamIQ technology and embeds both LITTLE and big
cores in one single cluster.
Check the MT8188 datasheet for more information :-)

Cheers,
Angelo

> 
> Signed-off-by: Fei Shao <fshao at chromium.org>
> ---
> 
>   arch/arm64/boot/dts/mediatek/mt8188.dtsi | 6 ++++--
>   1 file changed, 4 insertions(+), 2 deletions(-)
> 
> diff --git a/arch/arm64/boot/dts/mediatek/mt8188.dtsi b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
> index cd27966d2e3c..51bf08b2ff9b 100644
> --- a/arch/arm64/boot/dts/mediatek/mt8188.dtsi
> +++ b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
> @@ -195,12 +195,14 @@ core4 {
>   				core5 {
>   					cpu = <&cpu5>;
>   				};
> +			};
>   
> -				core6 {
> +			cluster1 {
> +				core0 {
>   					cpu = <&cpu6>;
>   				};
>   
> -				core7 {
> +				core1 {
>   					cpu = <&cpu7>;
>   				};
>   			};




From jason-jh.lin at mediatek.com  Thu Sep 26 01:35:24 2024
From: jason-jh.lin at mediatek.com (Jason-JH.Lin)
Date: Thu, 26 Sep 2024 16:35:24 +0800
Subject: [PATCH v6 0/2] Fix degradation problem of alpha blending series
Message-ID: <20240926083526.24629-1-jason-jh.lin@mediatek.com>

Some SoCs not support pre-multiplied pixel formats and extending
configuration of OVL pre-multiplied color formats, such as MT8173.

Fix the SoC degradation problem by this sreies.

---

Chnage in v6:
1. Use blend_modes instead of function pointer in OVL
2. Use ethdr instead of mdp_rdma to get blend_modes
3. Add 0 checking for adding blend_mode property for mtk_plane

Change in v5:
Add fix patch for mtk_plane

Change in v4:
Add lost cases of mtk_ovl_fmt_convert_with_blend

Change in v3:
Change MACRO approach to function pointer in driver data

Change in v2:
Fix build error and typo

Change in v1:
Add fix patch for OVL unsupport color format settings by driver data

---

Jason-JH.Lin (2):
  drm/mediatek: ovl: Add blend_modes to driver data
  drm/mediatek: Add blend_modes to mtk_plane_init() for different SoCs

 drivers/gpu/drm/mediatek/mtk_crtc.c           |  1 +
 drivers/gpu/drm/mediatek/mtk_ddp_comp.c       |  2 +
 drivers/gpu/drm/mediatek/mtk_ddp_comp.h       | 10 ++++
 drivers/gpu/drm/mediatek/mtk_disp_drv.h       |  2 +
 drivers/gpu/drm/mediatek/mtk_disp_ovl.c       | 48 ++++++++++++++++---
 .../gpu/drm/mediatek/mtk_disp_ovl_adaptor.c   |  7 +++
 drivers/gpu/drm/mediatek/mtk_ethdr.c          |  7 +++
 drivers/gpu/drm/mediatek/mtk_ethdr.h          |  1 +
 drivers/gpu/drm/mediatek/mtk_plane.c          | 15 +++---
 drivers/gpu/drm/mediatek/mtk_plane.h          |  4 +-
 10 files changed, 80 insertions(+), 17 deletions(-)

-- 
2.43.0



From jason-jh.lin at mediatek.com  Thu Sep 26 01:35:26 2024
From: jason-jh.lin at mediatek.com (Jason-JH.Lin)
Date: Thu, 26 Sep 2024 16:35:26 +0800
Subject: [PATCH v6 2/2] drm/mediatek: Add blend_modes to mtk_plane_init() for different SoCs
In-Reply-To: <20240926083526.24629-1-jason-jh.lin@mediatek.com>
References: <20240926083526.24629-1-jason-jh.lin@mediatek.com>
Message-ID: <20240926083526.24629-3-jason-jh.lin@mediatek.com>

Since some SoCs support premultiplied pixel formats but some do not,
the blend_modes parameter is added to mtk_plane_init(), which is
obtained from the mtk_ddp_comp_get_blend_modes function implemented
in different blending supported components.

The blending supported components can use driver data to set the
blend mode capabilities for different SoCs.

Signed-off-by: Jason-JH.Lin <jason-jh.lin at mediatek.com>
---
 drivers/gpu/drm/mediatek/mtk_crtc.c             |  1 +
 drivers/gpu/drm/mediatek/mtk_ddp_comp.c         |  2 ++
 drivers/gpu/drm/mediatek/mtk_ddp_comp.h         | 10 ++++++++++
 drivers/gpu/drm/mediatek/mtk_disp_drv.h         |  2 ++
 drivers/gpu/drm/mediatek/mtk_disp_ovl.c         |  7 +++++++
 drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c |  7 +++++++
 drivers/gpu/drm/mediatek/mtk_ethdr.c            |  7 +++++++
 drivers/gpu/drm/mediatek/mtk_ethdr.h            |  1 +
 drivers/gpu/drm/mediatek/mtk_plane.c            | 15 +++++++--------
 drivers/gpu/drm/mediatek/mtk_plane.h            |  4 ++--
 10 files changed, 46 insertions(+), 10 deletions(-)

diff --git a/drivers/gpu/drm/mediatek/mtk_crtc.c b/drivers/gpu/drm/mediatek/mtk_crtc.c
index 175b00e5a253..b65f196f2015 100644
--- a/drivers/gpu/drm/mediatek/mtk_crtc.c
+++ b/drivers/gpu/drm/mediatek/mtk_crtc.c
@@ -913,6 +913,7 @@ static int mtk_crtc_init_comp_planes(struct drm_device *drm_dev,
 				BIT(pipe),
 				mtk_crtc_plane_type(mtk_crtc->layer_nr, num_planes),
 				mtk_ddp_comp_supported_rotations(comp),
+				mtk_ddp_comp_get_blend_modes(comp),
 				mtk_ddp_comp_get_formats(comp),
 				mtk_ddp_comp_get_num_formats(comp), i);
 		if (ret)
diff --git a/drivers/gpu/drm/mediatek/mtk_ddp_comp.c b/drivers/gpu/drm/mediatek/mtk_ddp_comp.c
index be66d94be361..edc6417639e6 100644
--- a/drivers/gpu/drm/mediatek/mtk_ddp_comp.c
+++ b/drivers/gpu/drm/mediatek/mtk_ddp_comp.c
@@ -363,6 +363,7 @@ static const struct mtk_ddp_comp_funcs ddp_ovl = {
 	.layer_config = mtk_ovl_layer_config,
 	.bgclr_in_on = mtk_ovl_bgclr_in_on,
 	.bgclr_in_off = mtk_ovl_bgclr_in_off,
+	.get_blend_modes = mtk_ovl_get_blend_modes,
 	.get_formats = mtk_ovl_get_formats,
 	.get_num_formats = mtk_ovl_get_num_formats,
 };
@@ -416,6 +417,7 @@ static const struct mtk_ddp_comp_funcs ddp_ovl_adaptor = {
 	.disconnect = mtk_ovl_adaptor_disconnect,
 	.add = mtk_ovl_adaptor_add_comp,
 	.remove = mtk_ovl_adaptor_remove_comp,
+	.get_blend_modes = mtk_ovl_adaptor_get_blend_modes,
 	.get_formats = mtk_ovl_adaptor_get_formats,
 	.get_num_formats = mtk_ovl_adaptor_get_num_formats,
 	.mode_valid = mtk_ovl_adaptor_mode_valid,
diff --git a/drivers/gpu/drm/mediatek/mtk_ddp_comp.h b/drivers/gpu/drm/mediatek/mtk_ddp_comp.h
index ecf6dc283cd7..79562af1180f 100644
--- a/drivers/gpu/drm/mediatek/mtk_ddp_comp.h
+++ b/drivers/gpu/drm/mediatek/mtk_ddp_comp.h
@@ -80,6 +80,7 @@ struct mtk_ddp_comp_funcs {
 	void (*ctm_set)(struct device *dev,
 			struct drm_crtc_state *state);
 	struct device * (*dma_dev_get)(struct device *dev);
+	const u32 (*get_blend_modes)(struct device *dev);
 	const u32 *(*get_formats)(struct device *dev);
 	size_t (*get_num_formats)(struct device *dev);
 	void (*connect)(struct device *dev, struct device *mmsys_dev, unsigned int next);
@@ -266,6 +267,15 @@ static inline struct device *mtk_ddp_comp_dma_dev_get(struct mtk_ddp_comp *comp)
 	return comp->dev;
 }
 
+static inline
+const u32 mtk_ddp_comp_get_blend_modes(struct mtk_ddp_comp *comp)
+{
+	if (comp->funcs && comp->funcs->get_blend_modes)
+		return comp->funcs->get_blend_modes(comp->dev);
+
+	return 0;
+}
+
 static inline
 const u32 *mtk_ddp_comp_get_formats(struct mtk_ddp_comp *comp)
 {
diff --git a/drivers/gpu/drm/mediatek/mtk_disp_drv.h b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
index 082ac18fe04a..defa500cd64f 100644
--- a/drivers/gpu/drm/mediatek/mtk_disp_drv.h
+++ b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
@@ -103,6 +103,7 @@ void mtk_ovl_register_vblank_cb(struct device *dev,
 void mtk_ovl_unregister_vblank_cb(struct device *dev);
 void mtk_ovl_enable_vblank(struct device *dev);
 void mtk_ovl_disable_vblank(struct device *dev);
+const u32 mtk_ovl_get_blend_modes(struct device *dev);
 const u32 *mtk_ovl_get_formats(struct device *dev);
 size_t mtk_ovl_get_num_formats(struct device *dev);
 
@@ -131,6 +132,7 @@ void mtk_ovl_adaptor_start(struct device *dev);
 void mtk_ovl_adaptor_stop(struct device *dev);
 unsigned int mtk_ovl_adaptor_layer_nr(struct device *dev);
 struct device *mtk_ovl_adaptor_dma_dev_get(struct device *dev);
+const u32 mtk_ovl_adaptor_get_blend_modes(struct device *dev);
 const u32 *mtk_ovl_adaptor_get_formats(struct device *dev);
 size_t mtk_ovl_adaptor_get_num_formats(struct device *dev);
 enum drm_mode_status mtk_ovl_adaptor_mode_valid(struct device *dev,
diff --git a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
index 0cf7b80f612e..8592c6078bb1 100644
--- a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
+++ b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
@@ -215,6 +215,13 @@ void mtk_ovl_disable_vblank(struct device *dev)
 	writel_relaxed(0x0, ovl->regs + DISP_REG_OVL_INTEN);
 }
 
+const u32 mtk_ovl_get_blend_modes(struct device *dev)
+{
+	struct mtk_disp_ovl *ovl = dev_get_drvdata(dev);
+
+	return ovl->data->blend_modes;
+}
+
 const u32 *mtk_ovl_get_formats(struct device *dev)
 {
 	struct mtk_disp_ovl *ovl = dev_get_drvdata(dev);
diff --git a/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c b/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c
index c6768210b08b..93dc9c200705 100644
--- a/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c
+++ b/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c
@@ -400,6 +400,13 @@ void mtk_ovl_adaptor_disable_vblank(struct device *dev)
 	mtk_ethdr_disable_vblank(ovl_adaptor->ovl_adaptor_comp[OVL_ADAPTOR_ETHDR0]);
 }
 
+const u32 mtk_ovl_adaptor_get_blend_modes(struct device *dev)
+{
+	struct mtk_disp_ovl_adaptor *ovl_adaptor = dev_get_drvdata(dev);
+
+	return mtk_ethdr_get_blend_modes(ovl_adaptor->ovl_adaptor_comp[OVL_ADAPTOR_ETHDR0]);
+}
+
 const u32 *mtk_ovl_adaptor_get_formats(struct device *dev)
 {
 	struct mtk_disp_ovl_adaptor *ovl_adaptor = dev_get_drvdata(dev);
diff --git a/drivers/gpu/drm/mediatek/mtk_ethdr.c b/drivers/gpu/drm/mediatek/mtk_ethdr.c
index d1d9cf8b10e1..5532740e17ba 100644
--- a/drivers/gpu/drm/mediatek/mtk_ethdr.c
+++ b/drivers/gpu/drm/mediatek/mtk_ethdr.c
@@ -145,6 +145,13 @@ static irqreturn_t mtk_ethdr_irq_handler(int irq, void *dev_id)
 	return IRQ_HANDLED;
 }
 
+const u32 mtk_ethdr_get_blend_modes(struct device *dev)
+{
+	return BIT(DRM_MODE_BLEND_PREMULTI) |
+	       BIT(DRM_MODE_BLEND_COVERAGE) |
+	       BIT(DRM_MODE_BLEND_PIXEL_NONE);
+}
+
 void mtk_ethdr_layer_config(struct device *dev, unsigned int idx,
 			    struct mtk_plane_state *state,
 			    struct cmdq_pkt *cmdq_pkt)
diff --git a/drivers/gpu/drm/mediatek/mtk_ethdr.h b/drivers/gpu/drm/mediatek/mtk_ethdr.h
index 81af9edea3f7..c2c7d56fb429 100644
--- a/drivers/gpu/drm/mediatek/mtk_ethdr.h
+++ b/drivers/gpu/drm/mediatek/mtk_ethdr.h
@@ -13,6 +13,7 @@ void mtk_ethdr_clk_disable(struct device *dev);
 void mtk_ethdr_config(struct device *dev, unsigned int w,
 		      unsigned int h, unsigned int vrefresh,
 		      unsigned int bpc, struct cmdq_pkt *cmdq_pkt);
+const u32 mtk_ethdr_get_blend_modes(struct device *dev);
 void mtk_ethdr_layer_config(struct device *dev, unsigned int idx,
 			    struct mtk_plane_state *state,
 			    struct cmdq_pkt *cmdq_pkt);
diff --git a/drivers/gpu/drm/mediatek/mtk_plane.c b/drivers/gpu/drm/mediatek/mtk_plane.c
index 7d2cb4e0fafa..8a48b3b0a956 100644
--- a/drivers/gpu/drm/mediatek/mtk_plane.c
+++ b/drivers/gpu/drm/mediatek/mtk_plane.c
@@ -320,8 +320,8 @@ static const struct drm_plane_helper_funcs mtk_plane_helper_funcs = {
 
 int mtk_plane_init(struct drm_device *dev, struct drm_plane *plane,
 		   unsigned long possible_crtcs, enum drm_plane_type type,
-		   unsigned int supported_rotations, const u32 *formats,
-		   size_t num_formats, unsigned int plane_idx)
+		   unsigned int supported_rotations, const u32 blend_modes,
+		   const u32 *formats, size_t num_formats, unsigned int plane_idx)
 {
 	int err;
 
@@ -366,12 +366,11 @@ int mtk_plane_init(struct drm_device *dev, struct drm_plane *plane,
 	if (err)
 		DRM_ERROR("failed to create property: alpha\n");
 
-	err = drm_plane_create_blend_mode_property(plane,
-						   BIT(DRM_MODE_BLEND_PREMULTI) |
-						   BIT(DRM_MODE_BLEND_COVERAGE) |
-						   BIT(DRM_MODE_BLEND_PIXEL_NONE));
-	if (err)
-		DRM_ERROR("failed to create property: blend_mode\n");
+	if (blend_modes) {
+		err = drm_plane_create_blend_mode_property(plane, blend_modes);
+		if (err)
+			DRM_ERROR("failed to create property: blend_mode\n");
+	}
 
 	drm_plane_helper_add(plane, &mtk_plane_helper_funcs);
 
diff --git a/drivers/gpu/drm/mediatek/mtk_plane.h b/drivers/gpu/drm/mediatek/mtk_plane.h
index 5b177eac67b7..3b13b89989c7 100644
--- a/drivers/gpu/drm/mediatek/mtk_plane.h
+++ b/drivers/gpu/drm/mediatek/mtk_plane.h
@@ -48,6 +48,6 @@ to_mtk_plane_state(struct drm_plane_state *state)
 
 int mtk_plane_init(struct drm_device *dev, struct drm_plane *plane,
 		   unsigned long possible_crtcs, enum drm_plane_type type,
-		   unsigned int supported_rotations, const u32 *formats,
-		   size_t num_formats, unsigned int plane_idx);
+		   unsigned int supported_rotations, const u32 blend_modes,
+		   const u32 *formats, size_t num_formats, unsigned int plane_idx);
 #endif
-- 
2.43.0



From jason-jh.lin at mediatek.com  Thu Sep 26 01:35:25 2024
From: jason-jh.lin at mediatek.com (Jason-JH.Lin)
Date: Thu, 26 Sep 2024 16:35:25 +0800
Subject: [PATCH v6 1/2] drm/mediatek: ovl: Add blend_modes to driver data
In-Reply-To: <20240926083526.24629-1-jason-jh.lin@mediatek.com>
References: <20240926083526.24629-1-jason-jh.lin@mediatek.com>
Message-ID: <20240926083526.24629-2-jason-jh.lin@mediatek.com>

OVL_CON_CLRFMT_MAN is a configuration for extending color format
settings of DISP_REG_OVL_CON(n).
It will change some of the original color format settings.

Take the settings of (3 << 12) for example.
- If OVL_CON_CLRFMT_MAN = 0 means OVL_CON_CLRFMT_RGBA8888.
- If OVL_CON_CLRFMT_MAN = 1 means OVL_CON_CLRFMT_PARGB8888.

Since previous SoCs did not support OVL_CON_CLRFMT_MAN, this means
that the SoC does not support the premultiplied color format.
It will break the original color format setting of MT8173.

Therefore, the blend_modes is added to the driver data and then
mtk_ovl_fmt_convert() will check the blend_modes to see if
premultiplied supported in current platform.
If it is not supported, use coverage mode to set it to the supported
color formats to solve the degradation problem.

Fixes: a3f7f7ef4bfe ("drm/mediatek: Support "Pre-multiplied" blending in OVL")
Signed-off-by: Jason-JH.Lin <jason-jh.lin at mediatek.com>
Tested-by: Alper Nebi Yasak <alpernebiyasak at gmail.com>
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
---
 drivers/gpu/drm/mediatek/mtk_disp_ovl.c | 41 ++++++++++++++++++++-----
 1 file changed, 34 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
index 89b439dcf3a6..0cf7b80f612e 100644
--- a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
+++ b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
@@ -146,6 +146,7 @@ struct mtk_disp_ovl_data {
 	bool fmt_rgb565_is_0;
 	bool smi_id_en;
 	bool supports_afbc;
+	const u32 blend_modes;
 	const u32 *formats;
 	size_t num_formats;
 	bool supports_clrfmt_ext;
@@ -386,14 +387,23 @@ void mtk_ovl_layer_off(struct device *dev, unsigned int idx,
 		      DISP_REG_OVL_RDMA_CTRL(idx));
 }
 
-static unsigned int ovl_fmt_convert(struct mtk_disp_ovl *ovl, unsigned int fmt,
-				    unsigned int blend_mode)
+static unsigned int mtk_ovl_fmt_convert(struct mtk_disp_ovl *ovl,
+					struct mtk_plane_state *state)
 {
-	/* The return value in switch "MEM_MODE_INPUT_FORMAT_XXX"
-	 * is defined in mediatek HW data sheet.
-	 * The alphabet order in XXX is no relation to data
-	 * arrangement in memory.
+	unsigned int fmt = state->pending.format;
+	unsigned int blend_mode = state->base.pixel_blend_mode;
+
+	/*
+	 * For the platforms where OVL_CON_CLRFMT_MAN is defined in the hardware data sheet
+	 * and supports premultiplied color formats, such as OVL_CON_CLRFMT_PARGB8888.
+	 *
+	 * Check blend_modes in the driver data to see if premultiplied mode is supported.
+	 * If not, use coverage mode instead to set it to the supported color formats.
 	 */
+	if (!(ovl->data->blend_modes & BIT(DRM_MODE_BLEND_PREMULTI)) &&
+	    blend_mode == DRM_MODE_BLEND_PREMULTI)
+		blend_mode = DRM_MODE_BLEND_COVERAGE;
+
 	switch (fmt) {
 	default:
 	case DRM_FORMAT_RGB565:
@@ -471,7 +481,7 @@ void mtk_ovl_layer_config(struct device *dev, unsigned int idx,
 		return;
 	}
 
-	con = ovl_fmt_convert(ovl, fmt, blend_mode);
+	con = mtk_ovl_fmt_convert(ovl, state);
 	if (state->base.fb) {
 		con |= OVL_CON_AEN;
 		con |= state->base.alpha & OVL_CON_ALPHA;
@@ -626,6 +636,8 @@ static const struct mtk_disp_ovl_data mt2701_ovl_driver_data = {
 	.gmc_bits = 8,
 	.layer_nr = 4,
 	.fmt_rgb565_is_0 = false,
+	.blend_modes = BIT(DRM_MODE_BLEND_COVERAGE) |
+		       BIT(DRM_MODE_BLEND_PIXEL_NONE),
 	.formats = mt8173_formats,
 	.num_formats = ARRAY_SIZE(mt8173_formats),
 };
@@ -635,6 +647,8 @@ static const struct mtk_disp_ovl_data mt8173_ovl_driver_data = {
 	.gmc_bits = 8,
 	.layer_nr = 4,
 	.fmt_rgb565_is_0 = true,
+	.blend_modes = BIT(DRM_MODE_BLEND_COVERAGE) |
+		       BIT(DRM_MODE_BLEND_PIXEL_NONE),
 	.formats = mt8173_formats,
 	.num_formats = ARRAY_SIZE(mt8173_formats),
 };
@@ -644,6 +658,8 @@ static const struct mtk_disp_ovl_data mt8183_ovl_driver_data = {
 	.gmc_bits = 10,
 	.layer_nr = 4,
 	.fmt_rgb565_is_0 = true,
+	.blend_modes = BIT(DRM_MODE_BLEND_COVERAGE) |
+		       BIT(DRM_MODE_BLEND_PIXEL_NONE),
 	.formats = mt8173_formats,
 	.num_formats = ARRAY_SIZE(mt8173_formats),
 };
@@ -653,6 +669,8 @@ static const struct mtk_disp_ovl_data mt8183_ovl_2l_driver_data = {
 	.gmc_bits = 10,
 	.layer_nr = 2,
 	.fmt_rgb565_is_0 = true,
+	.blend_modes = BIT(DRM_MODE_BLEND_COVERAGE) |
+		       BIT(DRM_MODE_BLEND_PIXEL_NONE),
 	.formats = mt8173_formats,
 	.num_formats = ARRAY_SIZE(mt8173_formats),
 };
@@ -663,6 +681,9 @@ static const struct mtk_disp_ovl_data mt8192_ovl_driver_data = {
 	.layer_nr = 4,
 	.fmt_rgb565_is_0 = true,
 	.smi_id_en = true,
+	.blend_modes = BIT(DRM_MODE_BLEND_PREMULTI) |
+		       BIT(DRM_MODE_BLEND_COVERAGE) |
+		       BIT(DRM_MODE_BLEND_PIXEL_NONE),
 	.formats = mt8173_formats,
 	.num_formats = ARRAY_SIZE(mt8173_formats),
 };
@@ -673,6 +694,9 @@ static const struct mtk_disp_ovl_data mt8192_ovl_2l_driver_data = {
 	.layer_nr = 2,
 	.fmt_rgb565_is_0 = true,
 	.smi_id_en = true,
+	.blend_modes = BIT(DRM_MODE_BLEND_PREMULTI) |
+		       BIT(DRM_MODE_BLEND_COVERAGE) |
+		       BIT(DRM_MODE_BLEND_PIXEL_NONE),
 	.formats = mt8173_formats,
 	.num_formats = ARRAY_SIZE(mt8173_formats),
 };
@@ -684,6 +708,9 @@ static const struct mtk_disp_ovl_data mt8195_ovl_driver_data = {
 	.fmt_rgb565_is_0 = true,
 	.smi_id_en = true,
 	.supports_afbc = true,
+	.blend_modes = BIT(DRM_MODE_BLEND_PREMULTI) |
+		       BIT(DRM_MODE_BLEND_COVERAGE) |
+		       BIT(DRM_MODE_BLEND_PIXEL_NONE),
 	.formats = mt8195_formats,
 	.num_formats = ARRAY_SIZE(mt8195_formats),
 	.supports_clrfmt_ext = true,
-- 
2.43.0



From angelogioacchino.delregno at collabora.com  Thu Sep 26 01:37:36 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Thu, 26 Sep 2024 10:37:36 +0200
Subject: [PATCH v5 2/2] drm/mediatek: Add blend_modes to mtk_plane_init()
 for different SoCs
In-Reply-To: <20240925101927.17042-3-jason-jh.lin@mediatek.com>
References: <20240925101927.17042-1-jason-jh.lin@mediatek.com>
 <20240925101927.17042-3-jason-jh.lin@mediatek.com>
Message-ID: <64b96ec0-1264-4a3c-a26d-f8a0c3375d79@collabora.com>

Il 25/09/24 12:19, Jason-JH.Lin ha scritto:
> Since some SoCs support premultiplied pixel formats but some do not,
> the blend_modes parameter is added to mtk_plane_init(), which is
> obtained from the mtk_ddp_comp_get_blend_modes function implemented
> in different OVL components.
> 
> The OVL component can use driver data to set the blend mode
> capabilities for different SoCs.
> 
> Fixes: 4225d5d5e779 ("drm/mediatek: Support alpha blending in display driver")
> Signed-off-by: Jason-JH.Lin <jason-jh.lin at mediatek.com>

Just perfect.

Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>



From wenst at chromium.org  Thu Sep 26 01:43:52 2024
From: wenst at chromium.org (Chen-Yu Tsai)
Date: Thu, 26 Sep 2024 16:43:52 +0800
Subject: [PATCH v8 2/3] regulator: Add devres version of of_regulator_get_optional()
In-Reply-To: <ZvPscRdWlFPmtCyR@smile.fi.intel.com>
References: <20240925093807.1026949-1-wenst@chromium.org> <20240925093807.1026949-3-wenst@chromium.org>
 <ZvPscRdWlFPmtCyR@smile.fi.intel.com>
Message-ID: <CAGXv+5Gf9+rc+vLcr-JFhO561G8dw38ksV3drat+DyCfWEVakQ@mail.gmail.com>

On Wed, Sep 25, 2024 at 6:56?PM Andy Shevchenko
<andriy.shevchenko at linux.intel.com> wrote:
>
> On Wed, Sep 25, 2024 at 05:38:05PM +0800, Chen-Yu Tsai wrote:
> > There are existing uses for a devres version of of_regulator_get_optional()
> > in power domain drivers. On MediaTek platforms, power domains may have
> > regulator supplies tied to them. The driver currently tries to use
> > devm_regulator_get() to not have to manage the lifecycle, but ends up
> > doing it in a very hacky way by replacing the device node of the power
> > domain controller device to the device node of the power domain that is
> > currently being registered, getting the supply, and reverting the device
> > node.
> >
> > Provide a better API so that the hack can be replaced.
>
> ...
>
> > +#if IS_ENABLED(CONFIG_OF)
>
> Do we really need this?

What's the point of going through devres_* stuff if we already know
_of_regulator_get() is going to fail anyway?

Also, _of_regulator_get() does not have a stub version for !CONFIG_OF.

> > +static struct regulator *_devm_of_regulator_get(struct device *dev, struct device_node *node,
> > +                                             const char *id, int get_type)
> > +{
> > +     struct regulator **ptr, *regulator;
> > +
> > +     ptr = devres_alloc(devm_regulator_release, sizeof(*ptr), GFP_KERNEL);
> > +     if (!ptr)
> > +             return ERR_PTR(-ENOMEM);
> > +
> > +     regulator = _of_regulator_get(dev, node, id, get_type);
> > +     if (!IS_ERR(regulator)) {
> > +             *ptr = regulator;
> > +             devres_add(dev, ptr);
> > +     } else {
> > +             devres_free(ptr);
> > +     }
> > +
> > +     return regulator;
>
> Why not using devm_add_action() / devm_add_action_or_reset()
> (whichever suits better here)?

Cargo cult from _devm_regulator_get() in this file. However since this is
meant to share the same release function, both functions need to use the
same mechanism.

I could also argue that this is not an action, but an allocation, and so
devres_alloc() seems to make more sense.


ChenYu

> > +}
>
> > +#endif
>
> ...
>
> > +static inline struct regulator *__must_check devm_of_regulator_get_optional(struct device *dev,
> > +                                                                         struct device_node *node,
> > +                                                                         const char *id)
>
> I don't know the conventions here, but I find better to have it as
>
> static inline __must_check struct regulator *
> devm_of_regulator_get_optional(struct device *dev, struct device_node *node, const char *id)
>
> Similar to other stubs and declarations.

I don't think there are any conventions. This file already has three types:

1. Wrap the line with the function name on the second line
2. Wrap the arguments; wrapped arguments aligned to the left parenthesis.
3. Wrap the arguments; wrapped arguments aligned with aribtrary number of
   tabs.

I prefer the way I have put them.


From vignesh.raman at collabora.com  Thu Sep 26 01:47:04 2024
From: vignesh.raman at collabora.com (Vignesh Raman)
Date: Thu, 26 Sep 2024 14:17:04 +0530
Subject: [PATCH v2] docs/gpu: ci: update flake tests requirements
In-Reply-To: <20240926-athletic-gregarious-markhor-cc78ac@houat>
References: <20240926070653.1773597-1-vignesh.raman@collabora.com>
 <20240926-athletic-gregarious-markhor-cc78ac@houat>
Message-ID: <9470f582-7873-42c6-b5a5-35f841e4f693@collabora.com>

Hi Maxime,

On 26/09/24 12:56, Maxime Ripard wrote:
> On Thu, Sep 26, 2024 at 12:36:49PM GMT, Vignesh Raman wrote:
>> Update the documentation to require linking to a relevant GitLab
>> issue for each new flake entry instead of an email report. Added
>> specific GitLab issue URLs for i915, xe and other drivers.
>>
>> Signed-off-by: Vignesh Raman <vignesh.raman at collabora.com>
>> ---
>>
>> v2:
>> - Add gitlab issue link for msm driver.
>>
>> ---
>>   Documentation/gpu/automated_testing.rst | 16 +++++++++++-----
>>   1 file changed, 11 insertions(+), 5 deletions(-)
>>
>> diff --git a/Documentation/gpu/automated_testing.rst b/Documentation/gpu/automated_testing.rst
>> index 2d5a28866afe..f918fe56f2b0 100644
>> --- a/Documentation/gpu/automated_testing.rst
>> +++ b/Documentation/gpu/automated_testing.rst
>> @@ -67,20 +67,26 @@ Lists the tests that for a given driver on a specific hardware revision are
>>   known to behave unreliably. These tests won't cause a job to fail regardless of
>>   the result. They will still be run.
>>   
>> -Each new flake entry must be associated with a link to the email reporting the
>> -bug to the author of the affected driver, the board name or Device Tree name of
>> -the board, the first kernel version affected, the IGT version used for tests,
>> -and an approximation of the failure rate.
>> +Each new flake entry must include a link to the relevant GitLab issue, the board
>> +name or Device Tree name, the first kernel version affected, the IGT version used
>> +for tests and an approximation of the failure rate.
>>   
>>   They should be provided under the following format::
>>   
>> -  # Bug Report: $LORE_OR_PATCHWORK_URL
>> +  # Bug Report: $GITLAB_ISSUE
>>     # Board Name: broken-board.dtb
>>     # Linux Version: 6.6-rc1
>>     # IGT Version: 1.28-gd2af13d9f
>>     # Failure Rate: 100
>>     flaky-test
>>   
>> +The GitLab issue must include the logs and the pipeline link. Use the appropriate
>> +link below to create an issue.
>> +https://gitlab.freedesktop.org/drm/i915/kernel/-/issues for i915 driver
>> +https://gitlab.freedesktop.org/drm/xe/kernel/-/issues for xe driver
>> +https://gitlab.freedesktop.org/drm/msm/-/issues for msm driver
>> +https://gitlab.freedesktop.org/drm/misc/kernel/-/issues for other drivers
>> +
> 
> I can't comment for the others, but drm-misc at least still requires
> reporting issues by mail, so, no, sorry, we can't switch to gitlab only
> for now.

In https://gitlab.freedesktop.org/drm/ we have xe, i915, msm, nouveau, 
and amd (only for issues). In drm-ci we test i915, msm and amd.
So I will add GitLab links for these and for other drivers use email 
reporting. I will reword this section. Thanks.

Regards,
Vignesh


From angelogioacchino.delregno at collabora.com  Thu Sep 26 01:48:56 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Thu, 26 Sep 2024 10:48:56 +0200
Subject: [PATCH v8 3/3] pmdomain: mediatek: Use OF-specific regulator API
 to get power domain supply
In-Reply-To: <20240925093807.1026949-4-wenst@chromium.org>
References: <20240925093807.1026949-1-wenst@chromium.org>
 <20240925093807.1026949-4-wenst@chromium.org>
Message-ID: <e3eabcc4-1174-4a58-a084-d37467f63ced@collabora.com>

Il 25/09/24 11:38, Chen-Yu Tsai ha scritto:
> The MediaTek power domain driver contains a hack that assigns the device
> node of the power domain to the struct device of the power domain
> controller in order to use the devres regulator API.
> 
> Now that there is a proper OF-specific regulator API, and even a devres
> version, replace the hack with proper code.
> 
> This change is incompatible with incomplete device trees. Instead of
> assigning the dummy regulator in cases where the power domain requires
> a supply but the device tree does not provide one, the driver will just
> error out. This will be seen on the MT8390 EVK, which is missing
> supplies for the IMG_VCORE and CAM_VCORE domains. And likely all the
> MediaTek EVBs, which have no power domain supplies specified. This is
> however the correct behavior. If the power domain's supply is missing,
> then it should not work. Relying on other parts of the system to keep
> the unattached regulator enabled is likely to break in ways less easier
> to understand.
> 

Breaking something that was "working" (not really working though) before is a
hard thing to justify, but I feel like this is one of the cases in which we
have to swallow the pill.

This is a hack that I've always been angry about, and causing all sorts of
random issues on MediaTek SoCs from time to time... that was fixed multiple
times by hacking the previous hack which was needed for this hack to still
work in a way or another.

I am tempted to give you a R-b right now, but let me carefully test this on
multiple devices before that.

Meanwhile, I just wanted to say that I agree with you about this commit and
wanted to give a bit more context to people reading "this breaks things" so
that they can understand what's going on (and that we're not crazy! ..or at
least, not *that* much :-P).

Cheers,
Angelo

> Signed-off-by: Chen-Yu Tsai <wenst at chromium.org>
> ---
> Changes since v7:
> - New patch
> 
> The other option is to follow what Rockchip will be doing: getting the
> regulator supply upon first use / enable [1]. This will result in less
> breakage: only the power domain that is missing its supplies will fail
> to be attached.
> 
> [1] https://lore.kernel.org/all/20240919091834.83572-6-sebastian.reichel at collabora.com/
> ---
>   drivers/pmdomain/mediatek/mtk-pm-domains.c | 12 +-----------
>   1 file changed, 1 insertion(+), 11 deletions(-)
> 
> diff --git a/drivers/pmdomain/mediatek/mtk-pm-domains.c b/drivers/pmdomain/mediatek/mtk-pm-domains.c
> index 88406e9ac63c..3580913f25d3 100644
> --- a/drivers/pmdomain/mediatek/mtk-pm-domains.c
> +++ b/drivers/pmdomain/mediatek/mtk-pm-domains.c
> @@ -353,7 +353,6 @@ generic_pm_domain *scpsys_add_one_domain(struct scpsys *scpsys, struct device_no
>   {
>   	const struct scpsys_domain_data *domain_data;
>   	struct scpsys_domain *pd;
> -	struct device_node *root_node = scpsys->dev->of_node;
>   	struct device_node *smi_node;
>   	struct property *prop;
>   	const char *clk_name;
> @@ -388,16 +387,7 @@ generic_pm_domain *scpsys_add_one_domain(struct scpsys *scpsys, struct device_no
>   	pd->scpsys = scpsys;
>   
>   	if (MTK_SCPD_CAPS(pd, MTK_SCPD_DOMAIN_SUPPLY)) {
> -		/*
> -		 * Find regulator in current power domain node.
> -		 * devm_regulator_get() finds regulator in a node and its child
> -		 * node, so set of_node to current power domain node then change
> -		 * back to original node after regulator is found for current
> -		 * power domain node.
> -		 */
> -		scpsys->dev->of_node = node;
> -		pd->supply = devm_regulator_get(scpsys->dev, "domain");
> -		scpsys->dev->of_node = root_node;
> +		pd->supply = devm_of_regulator_get_optional(scpsys->dev, node, "domain");
>   		if (IS_ERR(pd->supply))
>   			return dev_err_cast_probe(scpsys->dev, pd->supply,
>   				      "%pOF: failed to get power supply.\n",





From lkp at intel.com  Thu Sep 26 02:03:37 2024
From: lkp at intel.com (kernel test robot)
Date: Thu, 26 Sep 2024 17:03:37 +0800
Subject: [PATCH v5 2/2] drm/mediatek: Add blend_modes to mtk_plane_init()
 for different SoCs
In-Reply-To: <20240925101927.17042-3-jason-jh.lin@mediatek.com>
References: <20240925101927.17042-3-jason-jh.lin@mediatek.com>
Message-ID: <202409261653.FyqBL1w8-lkp@intel.com>

Hi Jason-JH.Lin,

kernel test robot noticed the following build warnings:

[auto build test WARNING on drm/drm-next]
[also build test WARNING on linus/master next-20240926]
[cannot apply to v6.11]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Jason-JH-Lin/drm-mediatek-ovl-Add-fmt_convert-function-pointer-to-driver-data/20240925-182056
base:   git://anongit.freedesktop.org/drm/drm drm-next
patch link:    https://lore.kernel.org/r/20240925101927.17042-3-jason-jh.lin%40mediatek.com
patch subject: [PATCH v5 2/2] drm/mediatek: Add blend_modes to mtk_plane_init() for different SoCs
config: arm64-allmodconfig (https://download.01.org/0day-ci/archive/20240926/202409261653.FyqBL1w8-lkp at intel.com/config)
compiler: clang version 20.0.0git (https://github.com/llvm/llvm-project 7773243d9916f98ba0ffce0c3a960e4aa9f03e81)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240926/202409261653.FyqBL1w8-lkp at intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp at intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202409261653.FyqBL1w8-lkp at intel.com/

All warnings (new ones prefixed by >>):

   In file included from drivers/gpu/drm/mediatek/mtk_crtc.c:7:
   In file included from include/linux/dma-mapping.h:11:
   In file included from include/linux/scatterlist.h:8:
   In file included from include/linux/mm.h:2232:
   include/linux/vmstat.h:503:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
     503 |         return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
         |                            ~~~~~~~~~~~~~~~~~~~~~ ^
     504 |                            item];
         |                            ~~~~
   include/linux/vmstat.h:510:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
     510 |         return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
         |                            ~~~~~~~~~~~~~~~~~~~~~ ^
     511 |                            NR_VM_NUMA_EVENT_ITEMS +
         |                            ~~~~~~~~~~~~~~~~~~~~~~
   include/linux/vmstat.h:517:36: warning: arithmetic between different enumeration types ('enum node_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
     517 |         return node_stat_name(NR_LRU_BASE + lru) + 3; // skip "nr_"
         |                               ~~~~~~~~~~~ ^ ~~~
   include/linux/vmstat.h:523:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
     523 |         return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
         |                            ~~~~~~~~~~~~~~~~~~~~~ ^
     524 |                            NR_VM_NUMA_EVENT_ITEMS +
         |                            ~~~~~~~~~~~~~~~~~~~~~~
   In file included from drivers/gpu/drm/mediatek/mtk_crtc.c:22:
   In file included from drivers/gpu/drm/mediatek/mtk_crtc.h:10:
>> drivers/gpu/drm/mediatek/mtk_ddp_comp.h:83:2: warning: 'const' type qualifier on return type has no effect [-Wignored-qualifiers]
      83 |         const u32 (*get_blend_modes)(struct device *dev);
         |         ^~~~~
   drivers/gpu/drm/mediatek/mtk_ddp_comp.h:271:1: warning: 'const' type qualifier on return type has no effect [-Wignored-qualifiers]
     271 | const u32 mtk_ddp_comp_get_blend_modes(struct mtk_ddp_comp *comp)
         | ^~~~~
   6 warnings generated.
--
   In file included from drivers/gpu/drm/mediatek/mtk_ddp_comp.c:17:
   In file included from drivers/gpu/drm/mediatek/mtk_crtc.h:9:
   In file included from include/drm/drm_crtc.h:32:
   In file included from include/drm/drm_modes.h:33:
   In file included from include/drm/drm_connector.h:32:
   In file included from include/drm/drm_util.h:36:
   In file included from include/linux/kgdb.h:19:
   In file included from include/linux/kprobes.h:28:
   In file included from include/linux/ftrace.h:13:
   In file included from include/linux/kallsyms.h:13:
   In file included from include/linux/mm.h:2232:
   include/linux/vmstat.h:503:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
     503 |         return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
         |                            ~~~~~~~~~~~~~~~~~~~~~ ^
     504 |                            item];
         |                            ~~~~
   include/linux/vmstat.h:510:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
     510 |         return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
         |                            ~~~~~~~~~~~~~~~~~~~~~ ^
     511 |                            NR_VM_NUMA_EVENT_ITEMS +
         |                            ~~~~~~~~~~~~~~~~~~~~~~
   include/linux/vmstat.h:517:36: warning: arithmetic between different enumeration types ('enum node_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
     517 |         return node_stat_name(NR_LRU_BASE + lru) + 3; // skip "nr_"
         |                               ~~~~~~~~~~~ ^ ~~~
   include/linux/vmstat.h:523:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
     523 |         return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
         |                            ~~~~~~~~~~~~~~~~~~~~~ ^
     524 |                            NR_VM_NUMA_EVENT_ITEMS +
         |                            ~~~~~~~~~~~~~~~~~~~~~~
   In file included from drivers/gpu/drm/mediatek/mtk_ddp_comp.c:17:
   In file included from drivers/gpu/drm/mediatek/mtk_crtc.h:10:
>> drivers/gpu/drm/mediatek/mtk_ddp_comp.h:83:2: warning: 'const' type qualifier on return type has no effect [-Wignored-qualifiers]
      83 |         const u32 (*get_blend_modes)(struct device *dev);
         |         ^~~~~
   drivers/gpu/drm/mediatek/mtk_ddp_comp.h:271:1: warning: 'const' type qualifier on return type has no effect [-Wignored-qualifiers]
     271 | const u32 mtk_ddp_comp_get_blend_modes(struct mtk_ddp_comp *comp)
         | ^~~~~
   In file included from drivers/gpu/drm/mediatek/mtk_ddp_comp.c:19:
>> drivers/gpu/drm/mediatek/mtk_disp_drv.h:106:1: warning: 'const' type qualifier on return type has no effect [-Wignored-qualifiers]
     106 | const u32 mtk_ovl_get_blend_modes(struct device *dev);
         | ^~~~~
   drivers/gpu/drm/mediatek/mtk_disp_drv.h:135:1: warning: 'const' type qualifier on return type has no effect [-Wignored-qualifiers]
     135 | const u32 mtk_ovl_adaptor_get_blend_modes(struct device *dev);
         | ^~~~~
   drivers/gpu/drm/mediatek/mtk_disp_drv.h:170:1: warning: 'const' type qualifier on return type has no effect [-Wignored-qualifiers]
     170 | const u32 mtk_mdp_rdma_get_blend_modes(struct device *dev);
         | ^~~~~
   9 warnings generated.
--
   In file included from drivers/gpu/drm/mediatek/mtk_disp_ovl.c:18:
   In file included from drivers/gpu/drm/mediatek/mtk_crtc.h:9:
   In file included from include/drm/drm_crtc.h:32:
   In file included from include/drm/drm_modes.h:33:
   In file included from include/drm/drm_connector.h:32:
   In file included from include/drm/drm_util.h:36:
   In file included from include/linux/kgdb.h:19:
   In file included from include/linux/kprobes.h:28:
   In file included from include/linux/ftrace.h:13:
   In file included from include/linux/kallsyms.h:13:
   In file included from include/linux/mm.h:2232:
   include/linux/vmstat.h:503:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
     503 |         return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
         |                            ~~~~~~~~~~~~~~~~~~~~~ ^
     504 |                            item];
         |                            ~~~~
   include/linux/vmstat.h:510:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
     510 |         return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
         |                            ~~~~~~~~~~~~~~~~~~~~~ ^
     511 |                            NR_VM_NUMA_EVENT_ITEMS +
         |                            ~~~~~~~~~~~~~~~~~~~~~~
   include/linux/vmstat.h:517:36: warning: arithmetic between different enumeration types ('enum node_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
     517 |         return node_stat_name(NR_LRU_BASE + lru) + 3; // skip "nr_"
         |                               ~~~~~~~~~~~ ^ ~~~
   include/linux/vmstat.h:523:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
     523 |         return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
         |                            ~~~~~~~~~~~~~~~~~~~~~ ^
     524 |                            NR_VM_NUMA_EVENT_ITEMS +
         |                            ~~~~~~~~~~~~~~~~~~~~~~
   In file included from drivers/gpu/drm/mediatek/mtk_disp_ovl.c:18:
   In file included from drivers/gpu/drm/mediatek/mtk_crtc.h:10:
>> drivers/gpu/drm/mediatek/mtk_ddp_comp.h:83:2: warning: 'const' type qualifier on return type has no effect [-Wignored-qualifiers]
      83 |         const u32 (*get_blend_modes)(struct device *dev);
         |         ^~~~~
   drivers/gpu/drm/mediatek/mtk_ddp_comp.h:271:1: warning: 'const' type qualifier on return type has no effect [-Wignored-qualifiers]
     271 | const u32 mtk_ddp_comp_get_blend_modes(struct mtk_ddp_comp *comp)
         | ^~~~~
   In file included from drivers/gpu/drm/mediatek/mtk_disp_ovl.c:20:
>> drivers/gpu/drm/mediatek/mtk_disp_drv.h:106:1: warning: 'const' type qualifier on return type has no effect [-Wignored-qualifiers]
     106 | const u32 mtk_ovl_get_blend_modes(struct device *dev);
         | ^~~~~
   drivers/gpu/drm/mediatek/mtk_disp_drv.h:135:1: warning: 'const' type qualifier on return type has no effect [-Wignored-qualifiers]
     135 | const u32 mtk_ovl_adaptor_get_blend_modes(struct device *dev);
         | ^~~~~
   drivers/gpu/drm/mediatek/mtk_disp_drv.h:170:1: warning: 'const' type qualifier on return type has no effect [-Wignored-qualifiers]
     170 | const u32 mtk_mdp_rdma_get_blend_modes(struct device *dev);
         | ^~~~~
>> drivers/gpu/drm/mediatek/mtk_disp_ovl.c:219:1: warning: 'const' type qualifier on return type has no effect [-Wignored-qualifiers]
     219 | const u32 mtk_ovl_get_blend_modes(struct device *dev)
         | ^~~~~
   10 warnings generated.
--
   In file included from drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c:7:
   In file included from include/drm/drm_of.h:8:
   In file included from include/drm/drm_bridge.h:30:
   In file included from include/drm/drm_atomic.h:31:
   In file included from include/drm/drm_crtc.h:32:
   In file included from include/drm/drm_modes.h:33:
   In file included from include/drm/drm_connector.h:32:
   In file included from include/drm/drm_util.h:36:
   In file included from include/linux/kgdb.h:19:
   In file included from include/linux/kprobes.h:28:
   In file included from include/linux/ftrace.h:13:
   In file included from include/linux/kallsyms.h:13:
   In file included from include/linux/mm.h:2232:
   include/linux/vmstat.h:503:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
     503 |         return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
         |                            ~~~~~~~~~~~~~~~~~~~~~ ^
     504 |                            item];
         |                            ~~~~
   include/linux/vmstat.h:510:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
     510 |         return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
         |                            ~~~~~~~~~~~~~~~~~~~~~ ^
     511 |                            NR_VM_NUMA_EVENT_ITEMS +
         |                            ~~~~~~~~~~~~~~~~~~~~~~
   include/linux/vmstat.h:517:36: warning: arithmetic between different enumeration types ('enum node_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
     517 |         return node_stat_name(NR_LRU_BASE + lru) + 3; // skip "nr_"
         |                               ~~~~~~~~~~~ ^ ~~~
   include/linux/vmstat.h:523:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
     523 |         return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
         |                            ~~~~~~~~~~~~~~~~~~~~~ ^
     524 |                            NR_VM_NUMA_EVENT_ITEMS +
         |                            ~~~~~~~~~~~~~~~~~~~~~~
   In file included from drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c:20:
>> drivers/gpu/drm/mediatek/mtk_ddp_comp.h:83:2: warning: 'const' type qualifier on return type has no effect [-Wignored-qualifiers]
      83 |         const u32 (*get_blend_modes)(struct device *dev);
         |         ^~~~~
   drivers/gpu/drm/mediatek/mtk_ddp_comp.h:271:1: warning: 'const' type qualifier on return type has no effect [-Wignored-qualifiers]
     271 | const u32 mtk_ddp_comp_get_blend_modes(struct mtk_ddp_comp *comp)
         | ^~~~~
   In file included from drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c:21:
>> drivers/gpu/drm/mediatek/mtk_disp_drv.h:106:1: warning: 'const' type qualifier on return type has no effect [-Wignored-qualifiers]
     106 | const u32 mtk_ovl_get_blend_modes(struct device *dev);
         | ^~~~~
   drivers/gpu/drm/mediatek/mtk_disp_drv.h:135:1: warning: 'const' type qualifier on return type has no effect [-Wignored-qualifiers]
     135 | const u32 mtk_ovl_adaptor_get_blend_modes(struct device *dev);
         | ^~~~~
   drivers/gpu/drm/mediatek/mtk_disp_drv.h:170:1: warning: 'const' type qualifier on return type has no effect [-Wignored-qualifiers]
     170 | const u32 mtk_mdp_rdma_get_blend_modes(struct device *dev);
         | ^~~~~
>> drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c:403:1: warning: 'const' type qualifier on return type has no effect [-Wignored-qualifiers]
     403 | const u32 mtk_ovl_adaptor_get_blend_modes(struct device *dev)
         | ^~~~~
   10 warnings generated.
--
   In file included from drivers/gpu/drm/mediatek/mtk_mdp_rdma.c:15:
   In file included from drivers/gpu/drm/mediatek/mtk_disp_drv.h:13:
   In file included from drivers/gpu/drm/mediatek/mtk_plane.h:10:
   In file included from include/drm/drm_crtc.h:32:
   In file included from include/drm/drm_modes.h:33:
   In file included from include/drm/drm_connector.h:32:
   In file included from include/drm/drm_util.h:36:
   In file included from include/linux/kgdb.h:19:
   In file included from include/linux/kprobes.h:28:
   In file included from include/linux/ftrace.h:13:
   In file included from include/linux/kallsyms.h:13:
   In file included from include/linux/mm.h:2232:
   include/linux/vmstat.h:503:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
     503 |         return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
         |                            ~~~~~~~~~~~~~~~~~~~~~ ^
     504 |                            item];
         |                            ~~~~
   include/linux/vmstat.h:510:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
     510 |         return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
         |                            ~~~~~~~~~~~~~~~~~~~~~ ^
     511 |                            NR_VM_NUMA_EVENT_ITEMS +
         |                            ~~~~~~~~~~~~~~~~~~~~~~
   include/linux/vmstat.h:517:36: warning: arithmetic between different enumeration types ('enum node_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
     517 |         return node_stat_name(NR_LRU_BASE + lru) + 3; // skip "nr_"
         |                               ~~~~~~~~~~~ ^ ~~~
   include/linux/vmstat.h:523:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
     523 |         return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
         |                            ~~~~~~~~~~~~~~~~~~~~~ ^
     524 |                            NR_VM_NUMA_EVENT_ITEMS +
         |                            ~~~~~~~~~~~~~~~~~~~~~~
   In file included from drivers/gpu/drm/mediatek/mtk_mdp_rdma.c:15:
>> drivers/gpu/drm/mediatek/mtk_disp_drv.h:106:1: warning: 'const' type qualifier on return type has no effect [-Wignored-qualifiers]
     106 | const u32 mtk_ovl_get_blend_modes(struct device *dev);
         | ^~~~~
   drivers/gpu/drm/mediatek/mtk_disp_drv.h:135:1: warning: 'const' type qualifier on return type has no effect [-Wignored-qualifiers]
     135 | const u32 mtk_ovl_adaptor_get_blend_modes(struct device *dev);
         | ^~~~~
   drivers/gpu/drm/mediatek/mtk_disp_drv.h:170:1: warning: 'const' type qualifier on return type has no effect [-Wignored-qualifiers]
     170 | const u32 mtk_mdp_rdma_get_blend_modes(struct device *dev);
         | ^~~~~
   In file included from drivers/gpu/drm/mediatek/mtk_mdp_rdma.c:16:
   In file included from drivers/gpu/drm/mediatek/mtk_drm_drv.h:10:
>> drivers/gpu/drm/mediatek/mtk_ddp_comp.h:83:2: warning: 'const' type qualifier on return type has no effect [-Wignored-qualifiers]
      83 |         const u32 (*get_blend_modes)(struct device *dev);
         |         ^~~~~
   drivers/gpu/drm/mediatek/mtk_ddp_comp.h:271:1: warning: 'const' type qualifier on return type has no effect [-Wignored-qualifiers]
     271 | const u32 mtk_ddp_comp_get_blend_modes(struct mtk_ddp_comp *comp)
         | ^~~~~
>> drivers/gpu/drm/mediatek/mtk_mdp_rdma.c:236:1: warning: 'const' type qualifier on return type has no effect [-Wignored-qualifiers]
     236 | const u32 mtk_mdp_rdma_get_blend_modes(struct device *dev)
         | ^~~~~
   10 warnings generated.


vim +/const +83 drivers/gpu/drm/mediatek/mtk_ddp_comp.h

    48	
    49	struct mtk_ddp_comp;
    50	struct cmdq_pkt;
    51	struct mtk_ddp_comp_funcs {
    52		int (*power_on)(struct device *dev);
    53		void (*power_off)(struct device *dev);
    54		int (*clk_enable)(struct device *dev);
    55		void (*clk_disable)(struct device *dev);
    56		void (*config)(struct device *dev, unsigned int w,
    57			       unsigned int h, unsigned int vrefresh,
    58			       unsigned int bpc, struct cmdq_pkt *cmdq_pkt);
    59		void (*start)(struct device *dev);
    60		void (*stop)(struct device *dev);
    61		void (*register_vblank_cb)(struct device *dev,
    62					   void (*vblank_cb)(void *),
    63					   void *vblank_cb_data);
    64		void (*unregister_vblank_cb)(struct device *dev);
    65		void (*enable_vblank)(struct device *dev);
    66		void (*disable_vblank)(struct device *dev);
    67		unsigned int (*supported_rotations)(struct device *dev);
    68		unsigned int (*layer_nr)(struct device *dev);
    69		int (*layer_check)(struct device *dev,
    70				   unsigned int idx,
    71				   struct mtk_plane_state *state);
    72		void (*layer_config)(struct device *dev, unsigned int idx,
    73				     struct mtk_plane_state *state,
    74				     struct cmdq_pkt *cmdq_pkt);
    75		unsigned int (*gamma_get_lut_size)(struct device *dev);
    76		void (*gamma_set)(struct device *dev,
    77				  struct drm_crtc_state *state);
    78		void (*bgclr_in_on)(struct device *dev);
    79		void (*bgclr_in_off)(struct device *dev);
    80		void (*ctm_set)(struct device *dev,
    81				struct drm_crtc_state *state);
    82		struct device * (*dma_dev_get)(struct device *dev);
  > 83		const u32 (*get_blend_modes)(struct device *dev);
    84		const u32 *(*get_formats)(struct device *dev);
    85		size_t (*get_num_formats)(struct device *dev);
    86		void (*connect)(struct device *dev, struct device *mmsys_dev, unsigned int next);
    87		void (*disconnect)(struct device *dev, struct device *mmsys_dev, unsigned int next);
    88		void (*add)(struct device *dev, struct mtk_mutex *mutex);
    89		void (*remove)(struct device *dev, struct mtk_mutex *mutex);
    90		unsigned int (*encoder_index)(struct device *dev);
    91		enum drm_mode_status (*mode_valid)(struct device *dev, const struct drm_display_mode *mode);
    92	};
    93	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki


From macpaul.lin at mediatek.com  Thu Sep 26 02:25:17 2024
From: macpaul.lin at mediatek.com (Macpaul Lin)
Date: Thu, 26 Sep 2024 17:25:17 +0800
Subject: [PATCH 1/3] ASoC: dt-bindings: mt6359: Update generic node name and dmic-mode
Message-ID: <20240926092519.6556-1-macpaul.lin@mediatek.com>

Some fix and updates in the following items:
1. examples:
   Update generic node name to 'audio-codec' to comply with the
   coming change in 'mt6359.dtsi'. This change is necessary to fix the
   dtbs_check error:
   pmic: 'mt6359codec' does not match any of the regexes: 'pinctrl-[0-9]+'

2. mediatek,dmic-mode:
   After inspecting the .dts and .dtsi files using 'mt6359-codec', it was
   discovered that the definitions of 'two wires' and 'one wire' are
   inverted compared to the DT schema.
   For example, the following boards using MT6359 PMIC:
    - mt8192-asurada.dtsi
    - mt8195-cherry.dtsi
   These boards use the same definitions of 'dmic-mode' as other boards
   using MT6358 PMIC. The meaning of '0' or '1' has been noted as comments
   in the device trees.

   Upon examining the code in [1] and [2], it was confirmed that the
   definitions of 'dmic-mode' are consistent between "MT6359 PMIC" and
   "MT6358 PMIC". Therefore, the DT Schema should be correct as is.

References:
[1] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/sound/soc/codecs/mt6358.c#n1875
[2] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/sound/soc/codecs/mt6359.c#L1515

Fixes: 539237d1c609 ("dt-bindings: mediatek: mt6359: add codec document")
Signed-off-by: Jiaxin Yu <jiaxin.yu at mediatek.com>
Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
---
 Documentation/devicetree/bindings/sound/mt6359.yaml | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/Documentation/devicetree/bindings/sound/mt6359.yaml b/Documentation/devicetree/bindings/sound/mt6359.yaml
index 23d411fc4200..128698630c86 100644
--- a/Documentation/devicetree/bindings/sound/mt6359.yaml
+++ b/Documentation/devicetree/bindings/sound/mt6359.yaml
@@ -23,8 +23,8 @@ properties:
       Indicates how many data pins are used to transmit two channels of PDM
       signal. 0 means two wires, 1 means one wire. Default value is 0.
     enum:
-      - 0 # one wire
-      - 1 # two wires
+      - 0 # two wires
+      - 1 # one wire
 
   mediatek,mic-type-0:
     $ref: /schemas/types.yaml#/definitions/uint32
@@ -53,9 +53,9 @@ additionalProperties: false
 
 examples:
   - |
-    mt6359codec: mt6359codec {
-      mediatek,dmic-mode = <0>;
-      mediatek,mic-type-0 = <2>;
+    mt6359codec: audio-codec {
+        mediatek,dmic-mode = <0>;
+        mediatek,mic-type-0 = <2>;
     };
 
 ...
-- 
2.45.2



From macpaul.lin at mediatek.com  Thu Sep 26 02:25:19 2024
From: macpaul.lin at mediatek.com (Macpaul Lin)
Date: Thu, 26 Sep 2024 17:25:19 +0800
Subject: [PATCH 3/3] arm64: dts: mediatek: mt6359: fix dtbs_check error for audio-codec
In-Reply-To: <20240926092519.6556-1-macpaul.lin@mediatek.com>
References: <20240926092519.6556-1-macpaul.lin@mediatek.com>
Message-ID: <20240926092519.6556-3-macpaul.lin@mediatek.com>

This change fixes these dtbs_check errors for audio-codec:
1. pmic: 'mt6359codec' does not match any of the regexes: 'pinctrl-[0-9]+'
 - Replace device node name to generic 'audio-codec'
2. pmic: regulators: 'compatible' is a required property
 - Add 'mediatek,mt6359-codec' to compatible.

Fixes: 3b7d143be4b7 ("arm64: dts: mt6359: add PMIC MT6359 related nodes")
Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
---
 arch/arm64/boot/dts/mediatek/mt6359.dtsi | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/arch/arm64/boot/dts/mediatek/mt6359.dtsi b/arch/arm64/boot/dts/mediatek/mt6359.dtsi
index dd732a820a7c..47bbd665a5a5 100644
--- a/arch/arm64/boot/dts/mediatek/mt6359.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt6359.dtsi
@@ -14,7 +14,8 @@ pmic_adc: adc {
 			#io-channel-cells = <1>;
 		};
 
-		mt6359codec: mt6359codec {
+		mt6359codec: audio-codec {
+			compatible = "mediatek,mt6359-codec";
 		};
 
 		regulators {
-- 
2.45.2



From macpaul.lin at mediatek.com  Thu Sep 26 02:25:18 2024
From: macpaul.lin at mediatek.com (Macpaul Lin)
Date: Thu, 26 Sep 2024 17:25:18 +0800
Subject: [PATCH 2/3] dt-bindings: mfd: mediatek: mt6397: add compatible for mt6359-codec
In-Reply-To: <20240926092519.6556-1-macpaul.lin@mediatek.com>
References: <20240926092519.6556-1-macpaul.lin@mediatek.com>
Message-ID: <20240926092519.6556-2-macpaul.lin@mediatek.com>

This patch updates the audio-codec properties includes:
 - compatible:
  - Re-order the supported device items.
  - Add 'mt6359-codec' to compatible since MT6359 PMIC has been included
    in this DT Schema.
  - Set 'additionalProperties: true' for 'mt6359-codec'.

Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
---
 Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml b/Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml
index 40cabaf60d0d..ffb5848a96d5 100644
--- a/Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml
+++ b/Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml
@@ -104,7 +104,7 @@ properties:
 
   audio-codec:
     type: object
-    additionalProperties: false
+    additionalProperties: true
     description:
       Audio codec support with MT6397 and MT6358.
 
@@ -112,8 +112,9 @@ properties:
       compatible:
         oneOf:
           - enum:
-              - mediatek,mt6397-codec
               - mediatek,mt6358-sound
+              - mediatek,mt6359-codec
+              - mediatek,mt6397-codec
           - items:
               - enum:
                   - mediatek,mt6366-sound
-- 
2.45.2



From angelogioacchino.delregno at collabora.com  Thu Sep 26 02:27:30 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Thu, 26 Sep 2024 11:27:30 +0200
Subject: [PATCH 2/2] arm64: dts: mediate: Introduce MT8186
 Chinchou/Chinchou360 Chromebooks
In-Reply-To: <20240925080353.2362879-2-jakiela@google.com>
References: <20240925080353.2362879-1-jakiela@google.com>
 <20240925080353.2362879-2-jakiela@google.com>
Message-ID: <bbf023c7-f08b-4f9d-8770-08e63074fb4c@collabora.com>

Il 25/09/24 10:03, Albert Jakie?a ha scritto:
> The MT8186 Chinchou/Chinchou360, also known as the Asus Chromebook
> CZ12/CZ11 Flip, is a clamshell or convertible device with touchscreen,
> stylus and extra buttons.
> 
> Signed-off-by: Albert Jakie?a <jakiela at google.com>
> ---
>   arch/arm64/boot/dts/mediatek/Makefile         |   3 +
>   .../mediatek/mt8186-corsola-chinchou-sku0.dts |  18 +
>   .../mediatek/mt8186-corsola-chinchou-sku1.dts |  34 ++
>   .../mt8186-corsola-chinchou-sku16.dts         |  28 ++
>   .../dts/mediatek/mt8186-corsola-chinchou.dtsi | 445 ++++++++++++++++++
>   5 files changed, 528 insertions(+)
>   create mode 100644 arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku0.dts
>   create mode 100644 arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku1.dts
>   create mode 100644 arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku16.dts
>   create mode 100644 arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou.dtsi
> 
> diff --git a/arch/arm64/boot/dts/mediatek/Makefile b/arch/arm64/boot/dts/mediatek/Makefile
> index 8fd7b2bb7a15..0db7770e8907 100644
> --- a/arch/arm64/boot/dts/mediatek/Makefile
> +++ b/arch/arm64/boot/dts/mediatek/Makefile
> @@ -55,6 +55,9 @@ dtb-$(CONFIG_ARCH_MEDIATEK) += mt8183-kukui-kodama-sku32.dtb
>   dtb-$(CONFIG_ARCH_MEDIATEK) += mt8183-kukui-krane-sku0.dtb
>   dtb-$(CONFIG_ARCH_MEDIATEK) += mt8183-kukui-krane-sku176.dtb
>   dtb-$(CONFIG_ARCH_MEDIATEK) += mt8183-pumpkin.dtb
> +dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-chinchou-sku0.dtb
> +dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-chinchou-sku1.dtb
> +dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-chinchou-sku16.dtb
>   dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-magneton-sku393216.dtb
>   dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-magneton-sku393217.dtb
>   dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-magneton-sku393218.dtb
> diff --git a/arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku0.dts b/arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku0.dts
> new file mode 100644
> index 000000000000..29dd92318da1
> --- /dev/null
> +++ b/arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku0.dts
> @@ -0,0 +1,18 @@
> +// SPDX-License-Identifier: (GPL-2.0 OR MIT)
> +/*
> + * Copyright 2023 Google LLC
> + */
> +
> +/dts-v1/;
> +#include "mt8186-corsola-chinchou.dtsi"
> +
> +/ {
> +	model = "Google chinchou sku0 board";
> +	compatible = "google,chinchou-sku0", "google,chinchou-sku2",
> +			"google,chinchou-sku4", "google,chinchou-sku5",
> +			"google,chinchou", "mediatek,mt8186";
> +};
> +
> +&gpio_keys {
> +	status = "disabled";
> +};
> diff --git a/arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku1.dts b/arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku1.dts
> new file mode 100644
> index 000000000000..8ba31f81d9ad
> --- /dev/null
> +++ b/arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku1.dts
> @@ -0,0 +1,34 @@
> +// SPDX-License-Identifier: (GPL-2.0 OR MIT)
> +/*
> + * Copyright 2023 Google LLC
> + */
> +
> +/dts-v1/;
> +#include "mt8186-corsola-chinchou.dtsi"
> +
> +/ {
> +	model = "Google chinchou sku1/sku17 board";
> +	compatible = "google,chinchou-sku1", "google,chinchou-sku17",
> +			"google,chinchou-sku3", "google,chinchou-sku6",
> +			"google,chinchou-sku7", "google,chinchou-sku20",
> +			"google,chinchou-sku22", "google,chinchou-sku23",
> +			"mediatek,mt8186";
> +};
> +
> +&i2c1 {
> +	i2c-scl-internal-delay-ns = <10000>;
> +
> +	touchscreen: touchscreen at 41 {
> +		compatible = "ilitek,ili2901";
> +		reg = <0x41>;
> +		interrupts-extended = <&pio 12 IRQ_TYPE_LEVEL_LOW>;
> +		pinctrl-names = "default";
> +		pinctrl-0 = <&touchscreen_pins>;
> +		reset-gpios = <&pio 60 GPIO_ACTIVE_LOW>;
> +		vccio-supply = <&pp1800_tchscr_report_disable>;
> +	};
> +};
> +
> +&gpio_keys {
> +	status = "disabled";
> +};
> diff --git a/arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku16.dts b/arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku16.dts
> new file mode 100644
> index 000000000000..d3378d7ad096
> --- /dev/null
> +++ b/arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku16.dts
> @@ -0,0 +1,28 @@
> +// SPDX-License-Identifier: (GPL-2.0 OR MIT)
> +/*
> + * Copyright 2023 Google LLC
> + */
> +
> +/dts-v1/;
> +#include "mt8186-corsola-chinchou.dtsi"
> +
> +/ {
> +	model = "Google chinchou sku16/sku2147483647 board";
> +	compatible = "google,chinchou-sku16", "google,chinchou-sku18",
> +			"google,chinchou-sku19", "google,chinchou-sku21",
> +			"google,chinchou-sku2147483647", "mediatek,mt8186";
> +};
> +
> +&i2c1 {
> +	i2c-scl-internal-delay-ns = <10000>;
> +
> +	touchscreen: touchscreen at 41 {
> +		compatible = "ilitek,ili2901";
> +		reg = <0x41>;
> +		interrupts-extended = <&pio 12 IRQ_TYPE_LEVEL_LOW>;
> +		pinctrl-names = "default";
> +		pinctrl-0 = <&touchscreen_pins>;
> +		reset-gpios = <&pio 60 GPIO_ACTIVE_LOW>;
> +		vccio-supply = <&pp1800_tchscr_report_disable>;
> +	};
> +};
> diff --git a/arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou.dtsi b/arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou.dtsi
> new file mode 100644
> index 000000000000..c77cc43f8442
> --- /dev/null
> +++ b/arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou.dtsi

..snip..

> +
> +&mmc1_pins_default {
> +	pins-clk {
> +		drive-strength = <MTK_DRIVE_8mA>;

Please stop using the meaningless MTK_DRIVE_(x)mA macro.

drive-strength = <8>; is enough :-)

Cheers,
Angelo

> +	};
> +
> +	pins-cmd-dat {
> +		drive-strength = <MTK_DRIVE_8mA>;
> +	};
> +};
> +
> +&mmc1_pins_uhs {
> +	pins-clk {
> +		drive-strength = <MTK_DRIVE_8mA>;
> +	};
> +
> +	pins-cmd-dat {
> +		drive-strength = <MTK_DRIVE_8mA>;
> +	};
> +};
> +
> +&sound {
> +	status = "okay";
> +
> +	compatible = "mediatek,mt8186-mt6366-rt5650-sound";

You don't need to change this compatible, as the only thing that changes in the
actual driver are the dapm_routes. I implemented support for that nice dai-link
(standard, kind of) graph so that we stop getting a thousand compatibles for no
reason other than routing :-)

This should work with (99.9% confident it will, but please test):

	model = "mt8186_rt5650";
	status = "okay";

> +	mediatek,adsp = <&adsp>;

This property is already set in the node that you're inheriting from
mt8186-corsola.dtsi, please drop.

> +
> +	audio-routing =
> +		"Headphone", "HPOL",
> +		"Headphone", "HPOR",
> +		"HDMI1", "TX";
> +
> +	hs-playback-dai-link {
> +		codec {
> +			sound-dai = <&rt5650>;
> +		};
> +	};
> +
> +	hs-capture-dai-link {
> +		codec {
> +			sound-dai = <&rt5650>;
> +		};
> +	};
> +
> +	spk-share-dai-link {
> +	};

Empty nodes are meaningless (and you're inheriting this dai link from
mt8186-corsola.dtsi as well). Drop.

> +
> +	spk-hdmi-playback-dai-link {
> +		codec {
> +			sound-dai = <&it6505dptx>;
> +		};
> +	};
> +};
> +
> +&wifi_enable_pin {
> +	pins-wifi-enable {
> +		pinmux = <PINMUX_GPIO51__FUNC_GPIO51>;
> +	};
> +};
> +
> +&wifi_pwrseq {
> +	reset-gpios = <&pio 51 GPIO_ACTIVE_LOW>;
> +};
> +

..snip..

> +
> +&pen_insert {
> +	wakeup-event-action = <EV_ACT_ANY>;

Why is this set to EV_ACT_ANY on Chinchou but not on the other Corsola devices?
Is there any specific reason?

Cheers,
Angelo



From ck.hu at mediatek.com  Thu Sep 26 02:30:27 2024
From: ck.hu at mediatek.com (=?utf-8?B?Q0sgSHUgKOiDoeS/iuWFiSk=?=)
Date: Thu, 26 Sep 2024 09:30:27 +0000
Subject: [PATCH v6 1/2] drm/mediatek: ovl: Add blend_modes to driver data
In-Reply-To: <20240926083526.24629-2-jason-jh.lin@mediatek.com>
References: <20240926083526.24629-1-jason-jh.lin@mediatek.com>
	 <20240926083526.24629-2-jason-jh.lin@mediatek.com>
Message-ID: <a3da0d24e6749b054f8a65656ec40d4aa0b9f2dc.camel@mediatek.com>

Hi, Jason:

On Thu, 2024-09-26 at 16:35 +0800, Jason-JH.Lin wrote:
> OVL_CON_CLRFMT_MAN is a configuration for extending color format
> settings of DISP_REG_OVL_CON(n).
> It will change some of the original color format settings.
> 
> Take the settings of (3 << 12) for example.
> - If OVL_CON_CLRFMT_MAN = 0 means OVL_CON_CLRFMT_RGBA8888.
> - If OVL_CON_CLRFMT_MAN = 1 means OVL_CON_CLRFMT_PARGB8888.
> 
> Since previous SoCs did not support OVL_CON_CLRFMT_MAN, this means
> that the SoC does not support the premultiplied color format.
> It will break the original color format setting of MT8173.
> 
> Therefore, the blend_modes is added to the driver data and then
> mtk_ovl_fmt_convert() will check the blend_modes to see if
> premultiplied supported in current platform.
> If it is not supported, use coverage mode to set it to the supported
> color formats to solve the degradation problem.
> 
> Fixes: a3f7f7ef4bfe ("drm/mediatek: Support "Pre-multiplied" blending in OVL")
> Signed-off-by: Jason-JH.Lin <jason-jh.lin at mediatek.com>
> Tested-by: Alper Nebi Yasak <alpernebiyasak at gmail.com>
> Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>

This version has difference over 50% with previous version.
It's better to drop these tested-by and reviewed-by tag.

> ---
>  drivers/gpu/drm/mediatek/mtk_disp_ovl.c | 41 ++++++++++++++++++++-----
>  1 file changed, 34 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
> index 89b439dcf3a6..0cf7b80f612e 100644
> --- a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
> +++ b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
> @@ -146,6 +146,7 @@ struct mtk_disp_ovl_data {
>  	bool fmt_rgb565_is_0;
>  	bool smi_id_en;
>  	bool supports_afbc;
> +	const u32 blend_modes;
>  	const u32 *formats;
>  	size_t num_formats;
>  	bool supports_clrfmt_ext;
> @@ -386,14 +387,23 @@ void mtk_ovl_layer_off(struct device *dev, unsigned int idx,
>  		      DISP_REG_OVL_RDMA_CTRL(idx));
>  }
>  
> -static unsigned int ovl_fmt_convert(struct mtk_disp_ovl *ovl, unsigned int fmt,
> -				    unsigned int blend_mode)
> +static unsigned int mtk_ovl_fmt_convert(struct mtk_disp_ovl *ovl,
> +					struct mtk_plane_state *state)
>  {
> -	/* The return value in switch "MEM_MODE_INPUT_FORMAT_XXX"
> -	 * is defined in mediatek HW data sheet.
> -	 * The alphabet order in XXX is no relation to data
> -	 * arrangement in memory.

I don't know why you drop these comment.
Without this modification,

Reviewed-by: CK Hu <ck.hu at mediatek.com>

> +	unsigned int fmt = state->pending.format;
> +	unsigned int blend_mode = state->base.pixel_blend_mode;
> +
> +	/*
> +	 * For the platforms where OVL_CON_CLRFMT_MAN is defined in the hardware data sheet
> +	 * and supports premultiplied color formats, such as OVL_CON_CLRFMT_PARGB8888.
> +	 *
> +	 * Check blend_modes in the driver data to see if premultiplied mode is supported.
> +	 * If not, use coverage mode instead to set it to the supported color formats.
>  	 */
> +	if (!(ovl->data->blend_modes & BIT(DRM_MODE_BLEND_PREMULTI)) &&
> +	    blend_mode == DRM_MODE_BLEND_PREMULTI)
> +		blend_mode = DRM_MODE_BLEND_COVERAGE;
> +
>  	switch (fmt) {
>  	default:
>  	case DRM_FORMAT_RGB565:
> @@ -471,7 +481,7 @@ void mtk_ovl_layer_config(struct device *dev, unsigned int idx,
>  		return;
>  	}
>  
> -	con = ovl_fmt_convert(ovl, fmt, blend_mode);
> +	con = mtk_ovl_fmt_convert(ovl, state);
>  	if (state->base.fb) {
>  		con |= OVL_CON_AEN;
>  		con |= state->base.alpha & OVL_CON_ALPHA;
> @@ -626,6 +636,8 @@ static const struct mtk_disp_ovl_data mt2701_ovl_driver_data = {
>  	.gmc_bits = 8,
>  	.layer_nr = 4,
>  	.fmt_rgb565_is_0 = false,
> +	.blend_modes = BIT(DRM_MODE_BLEND_COVERAGE) |
> +		       BIT(DRM_MODE_BLEND_PIXEL_NONE),
>  	.formats = mt8173_formats,
>  	.num_formats = ARRAY_SIZE(mt8173_formats),
>  };
> @@ -635,6 +647,8 @@ static const struct mtk_disp_ovl_data mt8173_ovl_driver_data = {
>  	.gmc_bits = 8,
>  	.layer_nr = 4,
>  	.fmt_rgb565_is_0 = true,
> +	.blend_modes = BIT(DRM_MODE_BLEND_COVERAGE) |
> +		       BIT(DRM_MODE_BLEND_PIXEL_NONE),
>  	.formats = mt8173_formats,
>  	.num_formats = ARRAY_SIZE(mt8173_formats),
>  };
> @@ -644,6 +658,8 @@ static const struct mtk_disp_ovl_data mt8183_ovl_driver_data = {
>  	.gmc_bits = 10,
>  	.layer_nr = 4,
>  	.fmt_rgb565_is_0 = true,
> +	.blend_modes = BIT(DRM_MODE_BLEND_COVERAGE) |
> +		       BIT(DRM_MODE_BLEND_PIXEL_NONE),
>  	.formats = mt8173_formats,
>  	.num_formats = ARRAY_SIZE(mt8173_formats),
>  };
> @@ -653,6 +669,8 @@ static const struct mtk_disp_ovl_data mt8183_ovl_2l_driver_data = {
>  	.gmc_bits = 10,
>  	.layer_nr = 2,
>  	.fmt_rgb565_is_0 = true,
> +	.blend_modes = BIT(DRM_MODE_BLEND_COVERAGE) |
> +		       BIT(DRM_MODE_BLEND_PIXEL_NONE),
>  	.formats = mt8173_formats,
>  	.num_formats = ARRAY_SIZE(mt8173_formats),
>  };
> @@ -663,6 +681,9 @@ static const struct mtk_disp_ovl_data mt8192_ovl_driver_data = {
>  	.layer_nr = 4,
>  	.fmt_rgb565_is_0 = true,
>  	.smi_id_en = true,
> +	.blend_modes = BIT(DRM_MODE_BLEND_PREMULTI) |
> +		       BIT(DRM_MODE_BLEND_COVERAGE) |
> +		       BIT(DRM_MODE_BLEND_PIXEL_NONE),
>  	.formats = mt8173_formats,
>  	.num_formats = ARRAY_SIZE(mt8173_formats),
>  };
> @@ -673,6 +694,9 @@ static const struct mtk_disp_ovl_data mt8192_ovl_2l_driver_data = {
>  	.layer_nr = 2,
>  	.fmt_rgb565_is_0 = true,
>  	.smi_id_en = true,
> +	.blend_modes = BIT(DRM_MODE_BLEND_PREMULTI) |
> +		       BIT(DRM_MODE_BLEND_COVERAGE) |
> +		       BIT(DRM_MODE_BLEND_PIXEL_NONE),
>  	.formats = mt8173_formats,
>  	.num_formats = ARRAY_SIZE(mt8173_formats),
>  };
> @@ -684,6 +708,9 @@ static const struct mtk_disp_ovl_data mt8195_ovl_driver_data = {
>  	.fmt_rgb565_is_0 = true,
>  	.smi_id_en = true,
>  	.supports_afbc = true,
> +	.blend_modes = BIT(DRM_MODE_BLEND_PREMULTI) |
> +		       BIT(DRM_MODE_BLEND_COVERAGE) |
> +		       BIT(DRM_MODE_BLEND_PIXEL_NONE),
>  	.formats = mt8195_formats,
>  	.num_formats = ARRAY_SIZE(mt8195_formats),
>  	.supports_clrfmt_ext = true,

From angelogioacchino.delregno at collabora.com  Thu Sep 26 02:33:59 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Thu, 26 Sep 2024 11:33:59 +0200
Subject: [PATCH v1 1/1] drm/mediatek: Fix wrong check of nvmem_cell_read
In-Reply-To: <20240925084116.28848-1-liankun.yang@mediatek.com>
References: <20240925084116.28848-1-liankun.yang@mediatek.com>
Message-ID: <d8f54575-6df8-4198-a078-70debc9f8e0b@collabora.com>

Il 25/09/24 10:40, Liankun Yang ha scritto:
> If the len is 0, kernel crash will occur when performing operations.
> Add the len check conditions to prevent kernel crash.
> 

Please fix the commit title:

drm/mediatek: mtk_dp: Fix potential KP on 0 bytes nvmem cell read

> Fixes: f70ac097a2cf ("drm/mediatek: Add MT8195 Embedded DisplayPort driver")
> 

Please remove this blank line between the Fixes tag and your S-o-b.

> Signed-off-by: Liankun Yang <liankun.yang at mediatek.com>
> ---
>   drivers/gpu/drm/mediatek/mtk_dp.c | 2 +-
>   1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/mediatek/mtk_dp.c b/drivers/gpu/drm/mediatek/mtk_dp.c
> index d8796a904eca..0cc75ba96b98 100644
> --- a/drivers/gpu/drm/mediatek/mtk_dp.c
> +++ b/drivers/gpu/drm/mediatek/mtk_dp.c
> @@ -1082,7 +1082,7 @@ static void mtk_dp_get_calibration_data(struct mtk_dp *mtk_dp)
>   	buf = (u32 *)nvmem_cell_read(cell, &len);
>   	nvmem_cell_put(cell);
>   
> -	if (IS_ERR(buf) || ((len / sizeof(u32)) != 4)) {
> +	if (IS_ERR(buf) || (len == 0) || ((len / sizeof(u32)) != 4)) {

if (IS_ERR(buf) || !len || ((len / sizeof(u32)) != 4)) {

Cheers,
Angelo



From ck.hu at mediatek.com  Thu Sep 26 02:34:13 2024
From: ck.hu at mediatek.com (=?utf-8?B?Q0sgSHUgKOiDoeS/iuWFiSk=?=)
Date: Thu, 26 Sep 2024 09:34:13 +0000
Subject: [PATCH v6 2/2] drm/mediatek: Add blend_modes to mtk_plane_init()
 for different SoCs
In-Reply-To: <20240926083526.24629-3-jason-jh.lin@mediatek.com>
References: <20240926083526.24629-1-jason-jh.lin@mediatek.com>
	 <20240926083526.24629-3-jason-jh.lin@mediatek.com>
Message-ID: <8653f4f97da4ec5033d93485339ac3d56b8bb3f1.camel@mediatek.com>

Hi, Jason:

On Thu, 2024-09-26 at 16:35 +0800, Jason-JH.Lin wrote:
> Since some SoCs support premultiplied pixel formats but some do not,
> the blend_modes parameter is added to mtk_plane_init(), which is
> obtained from the mtk_ddp_comp_get_blend_modes function implemented
> in different blending supported components.
> 
> The blending supported components can use driver data to set the
> blend mode capabilities for different SoCs.

Reviewed-by: CK Hu <ck.hu at mediatek.com>

> 
> Signed-off-by: Jason-JH.Lin <jason-jh.lin at mediatek.com>
> ---
>  drivers/gpu/drm/mediatek/mtk_crtc.c             |  1 +
>  drivers/gpu/drm/mediatek/mtk_ddp_comp.c         |  2 ++
>  drivers/gpu/drm/mediatek/mtk_ddp_comp.h         | 10 ++++++++++
>  drivers/gpu/drm/mediatek/mtk_disp_drv.h         |  2 ++
>  drivers/gpu/drm/mediatek/mtk_disp_ovl.c         |  7 +++++++
>  drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c |  7 +++++++
>  drivers/gpu/drm/mediatek/mtk_ethdr.c            |  7 +++++++
>  drivers/gpu/drm/mediatek/mtk_ethdr.h            |  1 +
>  drivers/gpu/drm/mediatek/mtk_plane.c            | 15 +++++++--------
>  drivers/gpu/drm/mediatek/mtk_plane.h            |  4 ++--
>  10 files changed, 46 insertions(+), 10 deletions(-)
> 
> diff --git a/drivers/gpu/drm/mediatek/mtk_crtc.c b/drivers/gpu/drm/mediatek/mtk_crtc.c
> index 175b00e5a253..b65f196f2015 100644
> --- a/drivers/gpu/drm/mediatek/mtk_crtc.c
> +++ b/drivers/gpu/drm/mediatek/mtk_crtc.c
> @@ -913,6 +913,7 @@ static int mtk_crtc_init_comp_planes(struct drm_device *drm_dev,
>  				BIT(pipe),
>  				mtk_crtc_plane_type(mtk_crtc->layer_nr, num_planes),
>  				mtk_ddp_comp_supported_rotations(comp),
> +				mtk_ddp_comp_get_blend_modes(comp),
>  				mtk_ddp_comp_get_formats(comp),
>  				mtk_ddp_comp_get_num_formats(comp), i);
>  		if (ret)
> diff --git a/drivers/gpu/drm/mediatek/mtk_ddp_comp.c b/drivers/gpu/drm/mediatek/mtk_ddp_comp.c
> index be66d94be361..edc6417639e6 100644
> --- a/drivers/gpu/drm/mediatek/mtk_ddp_comp.c
> +++ b/drivers/gpu/drm/mediatek/mtk_ddp_comp.c
> @@ -363,6 +363,7 @@ static const struct mtk_ddp_comp_funcs ddp_ovl = {
>  	.layer_config = mtk_ovl_layer_config,
>  	.bgclr_in_on = mtk_ovl_bgclr_in_on,
>  	.bgclr_in_off = mtk_ovl_bgclr_in_off,
> +	.get_blend_modes = mtk_ovl_get_blend_modes,
>  	.get_formats = mtk_ovl_get_formats,
>  	.get_num_formats = mtk_ovl_get_num_formats,
>  };
> @@ -416,6 +417,7 @@ static const struct mtk_ddp_comp_funcs ddp_ovl_adaptor = {
>  	.disconnect = mtk_ovl_adaptor_disconnect,
>  	.add = mtk_ovl_adaptor_add_comp,
>  	.remove = mtk_ovl_adaptor_remove_comp,
> +	.get_blend_modes = mtk_ovl_adaptor_get_blend_modes,
>  	.get_formats = mtk_ovl_adaptor_get_formats,
>  	.get_num_formats = mtk_ovl_adaptor_get_num_formats,
>  	.mode_valid = mtk_ovl_adaptor_mode_valid,
> diff --git a/drivers/gpu/drm/mediatek/mtk_ddp_comp.h b/drivers/gpu/drm/mediatek/mtk_ddp_comp.h
> index ecf6dc283cd7..79562af1180f 100644
> --- a/drivers/gpu/drm/mediatek/mtk_ddp_comp.h
> +++ b/drivers/gpu/drm/mediatek/mtk_ddp_comp.h
> @@ -80,6 +80,7 @@ struct mtk_ddp_comp_funcs {
>  	void (*ctm_set)(struct device *dev,
>  			struct drm_crtc_state *state);
>  	struct device * (*dma_dev_get)(struct device *dev);
> +	const u32 (*get_blend_modes)(struct device *dev);
>  	const u32 *(*get_formats)(struct device *dev);
>  	size_t (*get_num_formats)(struct device *dev);
>  	void (*connect)(struct device *dev, struct device *mmsys_dev, unsigned int next);
> @@ -266,6 +267,15 @@ static inline struct device *mtk_ddp_comp_dma_dev_get(struct mtk_ddp_comp *comp)
>  	return comp->dev;
>  }
>  
> +static inline
> +const u32 mtk_ddp_comp_get_blend_modes(struct mtk_ddp_comp *comp)
> +{
> +	if (comp->funcs && comp->funcs->get_blend_modes)
> +		return comp->funcs->get_blend_modes(comp->dev);
> +
> +	return 0;
> +}
> +
>  static inline
>  const u32 *mtk_ddp_comp_get_formats(struct mtk_ddp_comp *comp)
>  {
> diff --git a/drivers/gpu/drm/mediatek/mtk_disp_drv.h b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> index 082ac18fe04a..defa500cd64f 100644
> --- a/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> +++ b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> @@ -103,6 +103,7 @@ void mtk_ovl_register_vblank_cb(struct device *dev,
>  void mtk_ovl_unregister_vblank_cb(struct device *dev);
>  void mtk_ovl_enable_vblank(struct device *dev);
>  void mtk_ovl_disable_vblank(struct device *dev);
> +const u32 mtk_ovl_get_blend_modes(struct device *dev);
>  const u32 *mtk_ovl_get_formats(struct device *dev);
>  size_t mtk_ovl_get_num_formats(struct device *dev);
>  
> @@ -131,6 +132,7 @@ void mtk_ovl_adaptor_start(struct device *dev);
>  void mtk_ovl_adaptor_stop(struct device *dev);
>  unsigned int mtk_ovl_adaptor_layer_nr(struct device *dev);
>  struct device *mtk_ovl_adaptor_dma_dev_get(struct device *dev);
> +const u32 mtk_ovl_adaptor_get_blend_modes(struct device *dev);
>  const u32 *mtk_ovl_adaptor_get_formats(struct device *dev);
>  size_t mtk_ovl_adaptor_get_num_formats(struct device *dev);
>  enum drm_mode_status mtk_ovl_adaptor_mode_valid(struct device *dev,
> diff --git a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
> index 0cf7b80f612e..8592c6078bb1 100644
> --- a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
> +++ b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
> @@ -215,6 +215,13 @@ void mtk_ovl_disable_vblank(struct device *dev)
>  	writel_relaxed(0x0, ovl->regs + DISP_REG_OVL_INTEN);
>  }
>  
> +const u32 mtk_ovl_get_blend_modes(struct device *dev)
> +{
> +	struct mtk_disp_ovl *ovl = dev_get_drvdata(dev);
> +
> +	return ovl->data->blend_modes;
> +}
> +
>  const u32 *mtk_ovl_get_formats(struct device *dev)
>  {
>  	struct mtk_disp_ovl *ovl = dev_get_drvdata(dev);
> diff --git a/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c b/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c
> index c6768210b08b..93dc9c200705 100644
> --- a/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c
> +++ b/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c
> @@ -400,6 +400,13 @@ void mtk_ovl_adaptor_disable_vblank(struct device *dev)
>  	mtk_ethdr_disable_vblank(ovl_adaptor->ovl_adaptor_comp[OVL_ADAPTOR_ETHDR0]);
>  }
>  
> +const u32 mtk_ovl_adaptor_get_blend_modes(struct device *dev)
> +{
> +	struct mtk_disp_ovl_adaptor *ovl_adaptor = dev_get_drvdata(dev);
> +
> +	return mtk_ethdr_get_blend_modes(ovl_adaptor->ovl_adaptor_comp[OVL_ADAPTOR_ETHDR0]);
> +}
> +
>  const u32 *mtk_ovl_adaptor_get_formats(struct device *dev)
>  {
>  	struct mtk_disp_ovl_adaptor *ovl_adaptor = dev_get_drvdata(dev);
> diff --git a/drivers/gpu/drm/mediatek/mtk_ethdr.c b/drivers/gpu/drm/mediatek/mtk_ethdr.c
> index d1d9cf8b10e1..5532740e17ba 100644
> --- a/drivers/gpu/drm/mediatek/mtk_ethdr.c
> +++ b/drivers/gpu/drm/mediatek/mtk_ethdr.c
> @@ -145,6 +145,13 @@ static irqreturn_t mtk_ethdr_irq_handler(int irq, void *dev_id)
>  	return IRQ_HANDLED;
>  }
>  
> +const u32 mtk_ethdr_get_blend_modes(struct device *dev)
> +{
> +	return BIT(DRM_MODE_BLEND_PREMULTI) |
> +	       BIT(DRM_MODE_BLEND_COVERAGE) |
> +	       BIT(DRM_MODE_BLEND_PIXEL_NONE);
> +}
> +
>  void mtk_ethdr_layer_config(struct device *dev, unsigned int idx,
>  			    struct mtk_plane_state *state,
>  			    struct cmdq_pkt *cmdq_pkt)
> diff --git a/drivers/gpu/drm/mediatek/mtk_ethdr.h b/drivers/gpu/drm/mediatek/mtk_ethdr.h
> index 81af9edea3f7..c2c7d56fb429 100644
> --- a/drivers/gpu/drm/mediatek/mtk_ethdr.h
> +++ b/drivers/gpu/drm/mediatek/mtk_ethdr.h
> @@ -13,6 +13,7 @@ void mtk_ethdr_clk_disable(struct device *dev);
>  void mtk_ethdr_config(struct device *dev, unsigned int w,
>  		      unsigned int h, unsigned int vrefresh,
>  		      unsigned int bpc, struct cmdq_pkt *cmdq_pkt);
> +const u32 mtk_ethdr_get_blend_modes(struct device *dev);
>  void mtk_ethdr_layer_config(struct device *dev, unsigned int idx,
>  			    struct mtk_plane_state *state,
>  			    struct cmdq_pkt *cmdq_pkt);
> diff --git a/drivers/gpu/drm/mediatek/mtk_plane.c b/drivers/gpu/drm/mediatek/mtk_plane.c
> index 7d2cb4e0fafa..8a48b3b0a956 100644
> --- a/drivers/gpu/drm/mediatek/mtk_plane.c
> +++ b/drivers/gpu/drm/mediatek/mtk_plane.c
> @@ -320,8 +320,8 @@ static const struct drm_plane_helper_funcs mtk_plane_helper_funcs = {
>  
>  int mtk_plane_init(struct drm_device *dev, struct drm_plane *plane,
>  		   unsigned long possible_crtcs, enum drm_plane_type type,
> -		   unsigned int supported_rotations, const u32 *formats,
> -		   size_t num_formats, unsigned int plane_idx)
> +		   unsigned int supported_rotations, const u32 blend_modes,
> +		   const u32 *formats, size_t num_formats, unsigned int plane_idx)
>  {
>  	int err;
>  
> @@ -366,12 +366,11 @@ int mtk_plane_init(struct drm_device *dev, struct drm_plane *plane,
>  	if (err)
>  		DRM_ERROR("failed to create property: alpha\n");
>  
> -	err = drm_plane_create_blend_mode_property(plane,
> -						   BIT(DRM_MODE_BLEND_PREMULTI) |
> -						   BIT(DRM_MODE_BLEND_COVERAGE) |
> -						   BIT(DRM_MODE_BLEND_PIXEL_NONE));
> -	if (err)
> -		DRM_ERROR("failed to create property: blend_mode\n");
> +	if (blend_modes) {
> +		err = drm_plane_create_blend_mode_property(plane, blend_modes);
> +		if (err)
> +			DRM_ERROR("failed to create property: blend_mode\n");
> +	}
>  
>  	drm_plane_helper_add(plane, &mtk_plane_helper_funcs);
>  
> diff --git a/drivers/gpu/drm/mediatek/mtk_plane.h b/drivers/gpu/drm/mediatek/mtk_plane.h
> index 5b177eac67b7..3b13b89989c7 100644
> --- a/drivers/gpu/drm/mediatek/mtk_plane.h
> +++ b/drivers/gpu/drm/mediatek/mtk_plane.h
> @@ -48,6 +48,6 @@ to_mtk_plane_state(struct drm_plane_state *state)
>  
>  int mtk_plane_init(struct drm_device *dev, struct drm_plane *plane,
>  		   unsigned long possible_crtcs, enum drm_plane_type type,
> -		   unsigned int supported_rotations, const u32 *formats,
> -		   size_t num_formats, unsigned int plane_idx);
> +		   unsigned int supported_rotations, const u32 blend_modes,
> +		   const u32 *formats, size_t num_formats, unsigned int plane_idx);
>  #endif

From angelogioacchino.delregno at collabora.com  Thu Sep 26 02:38:21 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Thu, 26 Sep 2024 11:38:21 +0200
Subject: [PATCH 3/6] dt-bindings: display: mediatek: Fix clocks count
 constraint for new SoCs
In-Reply-To: <20240925-satisfy-epidermal-bd414891479a@spud>
References: <20240924103156.13119-1-macpaul.lin@mediatek.com>
 <20240924103156.13119-3-macpaul.lin@mediatek.com>
 <ffc1900b-3921-48ca-a2b2-1b798c57e572@collabora.com>
 <20240924-commute-collision-13ad39717d31@spud>
 <2821ef09-1b32-082d-69d1-e09a3a302447@mediatek.com>
 <20240925-satisfy-epidermal-bd414891479a@spud>
Message-ID: <7a1315ef-4be5-4528-858b-9f07c814636d@collabora.com>

Il 25/09/24 16:34, Conor Dooley ha scritto:
> On Wed, Sep 25, 2024 at 04:42:59PM +0800, Macpaul Lin wrote:
>>
>> On 9/25/24 00:00, Conor Dooley wrote:
>>> On Tue, Sep 24, 2024 at 01:42:01PM +0200, AngeloGioacchino Del Regno wrote:
>>>> Il 24/09/24 12:31, Macpaul Lin ha scritto:
>>>>> The display node in mt8195.dtsi was triggering a CHECK_DTBS error due
>>>>> to an excessively long 'clocks' property:
>>>>>      display at 14f06000: clocks: [[31, 14], [31, 43], [31, 44]] is too long
>>>>>
>>>>> To resolve this issue, add "maxItems: 3" to the 'clocks' property in
>>>>> the DT schema.
>>>>>
>>>>> Fixes: 4ed545e7d100 ("dt-bindings: display: mediatek: disp: split each block to individual yaml")
>>>>> Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
>>>>> ---
>>>>>     .../devicetree/bindings/display/mediatek/mediatek,split.yaml     | 1 +
>>>>>     1 file changed, 1 insertion(+)
>>>>>
>>>>> diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,split.yaml b/Documentation/devicetree/bindings/display/mediatek/mediatek,split.yaml
>>>>> index e4affc854f3d..42d2d483cc29 100644
>>>>> --- a/Documentation/devicetree/bindings/display/mediatek/mediatek,split.yaml
>>>>> +++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,split.yaml
>>>>> @@ -57,6 +57,7 @@ properties:
>>>>>       clocks:
>>>>>         items:
>>>>>           - description: SPLIT Clock
>>>>
>>>> That's at least confusing (granted that it works) - either add a description for
>>>> each clock and then set `minItems: 1` (preferred), or remove this "SPLIT Clock"
>>>> description and allow a maximum of 3 clocks.
>>>>
>>>> Removing the description can be done - IMO - because "SPLIT Clock" is, well,
>>>> saying that the SPLIT block gets a SPLIT clock ... stating the obvious, anyway.
>>>
>>> Right, but what are the other two new clocks? Are they as obvious?
>>> There's no clock-names here to give any more information as to what the
>>> other clocks are supposed to be.
>>>
>>> Kinda unrelated, but I think that "SPLIT Clock" probably isn't what the
>>> name of the clock in the IP block is anyway, sounds more like the name
>>> for it on the provider end..
>>
>> Thanks for the suggestions. I think Moudy could help on the new fixes
>> for both DT schem and mt8195.dtsi. This patch could be separated from
>> origin patch set.
> 
> Not sure what you mean about separating it, if you mean correcting the
> description for the split clock sure. The other stuff I mentioned needs
> to be resolved before I'm willing to ack this.

He means separating this patch from the rest of the series that he pushed - which
is okay, as it's a bit mixed anyway :-)

Besides ... Moudy, can you please help to clarify the description of those clocks?

Cheers,
Angelo


From angelogioacchino.delregno at collabora.com  Thu Sep 26 02:39:51 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Thu, 26 Sep 2024 11:39:51 +0200
Subject: [PATCH 0/6] drm: constify read-only regmap structs
In-Reply-To: <20240925-drm-const-regmap-v1-0-e609d502401b@gmail.com>
References: <20240925-drm-const-regmap-v1-0-e609d502401b@gmail.com>
Message-ID: <9f637af5-9836-487a-88b6-1d1ac46e6976@collabora.com>

Il 25/09/24 17:42, Javier Carrasco ha scritto:
> This series adds the const modifier to the remaining regmap_bus and
> regmap_config structs under drm/ that are effectively used as const
> (i.e., only read after their declaration), but kept ad writtable data.
> 
> Signed-off-by: Javier Carrasco <javier.carrasco.cruz at gmail.com>

For the entire series:

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>

> ---
> Javier Carrasco (6):
>        drm/bridge: dpc3433: Constify struct regmap_config
>        drm/fsl-dcu: Constify struct regmap_config
>        drm/mediatek: dp: Constify struct regmap_config
>        drm/meson: Constify struct regmap_config
>        drm/panel: ili9322: Constify struct regmap_bus
>        drm/sprd: Constify struct regmap_bus
> 
>   drivers/gpu/drm/bridge/ti-dlpc3433.c         | 2 +-
>   drivers/gpu/drm/fsl-dcu/fsl_tcon.c           | 2 +-
>   drivers/gpu/drm/mediatek/mtk_dp.c            | 2 +-
>   drivers/gpu/drm/meson/meson_drv.c            | 2 +-
>   drivers/gpu/drm/panel/panel-ilitek-ili9322.c | 2 +-
>   drivers/gpu/drm/sprd/sprd_dsi.c              | 2 +-
>   6 files changed, 6 insertions(+), 6 deletions(-)
> ---
> base-commit: 2b7275670032a98cba266bd1b8905f755b3e650f
> change-id: 20240925-drm-const-regmap-307f2c358d10
> 
> Best regards,




From Jason-JH.Lin at mediatek.com  Thu Sep 26 02:42:22 2024
From: Jason-JH.Lin at mediatek.com (=?utf-8?B?SmFzb24tSkggTGluICjmnpfnnb/npaUp?=)
Date: Thu, 26 Sep 2024 09:42:22 +0000
Subject: [PATCH v5 2/2] drm/mediatek: Add blend_modes to mtk_plane_init()
 for different SoCs
In-Reply-To: <64b96ec0-1264-4a3c-a26d-f8a0c3375d79@collabora.com>
References: <20240925101927.17042-1-jason-jh.lin@mediatek.com>
	 <20240925101927.17042-3-jason-jh.lin@mediatek.com>
	 <64b96ec0-1264-4a3c-a26d-f8a0c3375d79@collabora.com>
Message-ID: <2c05e5d9684aac50dea22c2c0dfbf0f679e29434.camel@mediatek.com>

On Thu, 2024-09-26 at 10:37 +0200, AngeloGioacchino Del Regno wrote:
> Il 25/09/24 12:19, Jason-JH.Lin ha scritto:
> > Since some SoCs support premultiplied pixel formats but some do
> > not,
> > the blend_modes parameter is added to mtk_plane_init(), which is
> > obtained from the mtk_ddp_comp_get_blend_modes function implemented
> > in different OVL components.
> > 
> > The OVL component can use driver data to set the blend mode
> > capabilities for different SoCs.
> > 
> > Fixes: 4225d5d5e779 ("drm/mediatek: Support alpha blending in
> > display driver")
> > Signed-off-by: Jason-JH.Lin <jason-jh.lin at mediatek.com>
> 
> Just perfect.
> 
> Signed-off-by: AngeloGioacchino Del Regno <
> angelogioacchino.delregno at collabora.com>
> 

Just to confirm. Do you mean reviewed-by? :)

Regards,
Jason-JH.Lin

From angelogioacchino.delregno at collabora.com  Thu Sep 26 02:42:51 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Thu, 26 Sep 2024 11:42:51 +0200
Subject: [PATCH v6 2/2] drm/mediatek: Add blend_modes to mtk_plane_init()
 for different SoCs
In-Reply-To: <20240926083526.24629-3-jason-jh.lin@mediatek.com>
References: <20240926083526.24629-1-jason-jh.lin@mediatek.com>
 <20240926083526.24629-3-jason-jh.lin@mediatek.com>
Message-ID: <e44cafc1-b350-4058-976e-13d6fe4fd4b2@collabora.com>

Il 26/09/24 10:35, Jason-JH.Lin ha scritto:
> Since some SoCs support premultiplied pixel formats but some do not,
> the blend_modes parameter is added to mtk_plane_init(), which is
> obtained from the mtk_ddp_comp_get_blend_modes function implemented
> in different blending supported components.
> 
> The blending supported components can use driver data to set the
> blend mode capabilities for different SoCs.
> 
> Signed-off-by: Jason-JH.Lin <jason-jh.lin at mediatek.com>


Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>




From angelogioacchino.delregno at collabora.com  Thu Sep 26 02:43:39 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Thu, 26 Sep 2024 11:43:39 +0200
Subject: [PATCH v5 2/2] drm/mediatek: Add blend_modes to mtk_plane_init()
 for different SoCs
In-Reply-To: <2c05e5d9684aac50dea22c2c0dfbf0f679e29434.camel@mediatek.com>
References: <20240925101927.17042-1-jason-jh.lin@mediatek.com>
 <20240925101927.17042-3-jason-jh.lin@mediatek.com>
 <64b96ec0-1264-4a3c-a26d-f8a0c3375d79@collabora.com>
 <2c05e5d9684aac50dea22c2c0dfbf0f679e29434.camel@mediatek.com>
Message-ID: <2ad8c375-84b9-45ea-a27c-076021970d28@collabora.com>

Il 26/09/24 11:42, Jason-JH Lin (???) ha scritto:
> On Thu, 2024-09-26 at 10:37 +0200, AngeloGioacchino Del Regno wrote:
>> Il 25/09/24 12:19, Jason-JH.Lin ha scritto:
>>> Since some SoCs support premultiplied pixel formats but some do
>>> not,
>>> the blend_modes parameter is added to mtk_plane_init(), which is
>>> obtained from the mtk_ddp_comp_get_blend_modes function implemented
>>> in different OVL components.
>>>
>>> The OVL component can use driver data to set the blend mode
>>> capabilities for different SoCs.
>>>
>>> Fixes: 4225d5d5e779 ("drm/mediatek: Support alpha blending in
>>> display driver")
>>> Signed-off-by: Jason-JH.Lin <jason-jh.lin at mediatek.com>
>>
>> Just perfect.
>>
>> Signed-off-by: AngeloGioacchino Del Regno <
>> angelogioacchino.delregno at collabora.com>
>>
> 
> Just to confirm. Do you mean reviewed-by? :)
> 

Oh, my brain needs coffee. Sorry about that, yes, I was meaning R-b.

Anyway, gave you the right tag on v6, so ignore that.... :-)

Cheers,
Angelo



From Jason-JH.Lin at mediatek.com  Thu Sep 26 02:49:03 2024
From: Jason-JH.Lin at mediatek.com (=?utf-8?B?SmFzb24tSkggTGluICjmnpfnnb/npaUp?=)
Date: Thu, 26 Sep 2024 09:49:03 +0000
Subject: [PATCH v6 1/2] drm/mediatek: ovl: Add blend_modes to driver data
In-Reply-To: <a3da0d24e6749b054f8a65656ec40d4aa0b9f2dc.camel@mediatek.com>
References: <20240926083526.24629-1-jason-jh.lin@mediatek.com>
	 <20240926083526.24629-2-jason-jh.lin@mediatek.com>
	 <a3da0d24e6749b054f8a65656ec40d4aa0b9f2dc.camel@mediatek.com>
Message-ID: <a704c8ad4e9d6e1644baf338cbb98de4aa2ccf6e.camel@mediatek.com>

On Thu, 2024-09-26 at 09:30 +0000, CK Hu (???) wrote:
> Hi, Jason:
> 
> On Thu, 2024-09-26 at 16:35 +0800, Jason-JH.Lin wrote:
> > OVL_CON_CLRFMT_MAN is a configuration for extending color format
> > settings of DISP_REG_OVL_CON(n).
> > It will change some of the original color format settings.
> > 
> > Take the settings of (3 << 12) for example.
> > - If OVL_CON_CLRFMT_MAN = 0 means OVL_CON_CLRFMT_RGBA8888.
> > - If OVL_CON_CLRFMT_MAN = 1 means OVL_CON_CLRFMT_PARGB8888.
> > 
> > Since previous SoCs did not support OVL_CON_CLRFMT_MAN, this means
> > that the SoC does not support the premultiplied color format.
> > It will break the original color format setting of MT8173.
> > 
> > Therefore, the blend_modes is added to the driver data and then
> > mtk_ovl_fmt_convert() will check the blend_modes to see if
> > premultiplied supported in current platform.
> > If it is not supported, use coverage mode to set it to the
> > supported
> > color formats to solve the degradation problem.
> > 
> > Fixes: a3f7f7ef4bfe ("drm/mediatek: Support "Pre-multiplied"
> > blending in OVL")
> > Signed-off-by: Jason-JH.Lin <jason-jh.lin at mediatek.com>
> > Tested-by: Alper Nebi Yasak <alpernebiyasak at gmail.com>
> > Reviewed-by: AngeloGioacchino Del Regno <
> > angelogioacchino.delregno at collabora.com>
> 
> This version has difference over 50% with previous version.
> It's better to drop these tested-by and reviewed-by tag.

OK, I'll drop this.

> 
> > ---
> >  drivers/gpu/drm/mediatek/mtk_disp_ovl.c | 41 ++++++++++++++++++++-
> > ----
> >  1 file changed, 34 insertions(+), 7 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
> > b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
> > index 89b439dcf3a6..0cf7b80f612e 100644
> > --- a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
> > +++ b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
> > @@ -146,6 +146,7 @@ struct mtk_disp_ovl_data {
> >  	bool fmt_rgb565_is_0;
> >  	bool smi_id_en;
> >  	bool supports_afbc;
> > +	const u32 blend_modes;
> >  	const u32 *formats;
> >  	size_t num_formats;
> >  	bool supports_clrfmt_ext;
> > @@ -386,14 +387,23 @@ void mtk_ovl_layer_off(struct device *dev,
> > unsigned int idx,
> >  		      DISP_REG_OVL_RDMA_CTRL(idx));
> >  }
> >  
> > -static unsigned int ovl_fmt_convert(struct mtk_disp_ovl *ovl,
> > unsigned int fmt,
> > -				    unsigned int blend_mode)
> > +static unsigned int mtk_ovl_fmt_convert(struct mtk_disp_ovl *ovl,
> > +					struct mtk_plane_state *state)
> >  {
> > -	/* The return value in switch "MEM_MODE_INPUT_FORMAT_XXX"
> > -	 * is defined in mediatek HW data sheet.
> > -	 * The alphabet order in XXX is no relation to data
> > -	 * arrangement in memory.
> 
> I don't know why you drop these comment.
> Without this modification,

Since we change the MACRO to align this to DRM input format order, this
comment is no longer needed.

I'll send another patch for this.
Thanks for such a quick reply!

Regards,
Jason-JH.Lin

> 
> Reviewed-by: CK Hu <ck.hu at mediatek.com>
> 

From angelogioacchino.delregno at collabora.com  Thu Sep 26 02:50:07 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Thu, 26 Sep 2024 11:50:07 +0200
Subject: [PATCH v6 1/2] drm/mediatek: ovl: Add blend_modes to driver data
In-Reply-To: <a704c8ad4e9d6e1644baf338cbb98de4aa2ccf6e.camel@mediatek.com>
References: <20240926083526.24629-1-jason-jh.lin@mediatek.com>
 <20240926083526.24629-2-jason-jh.lin@mediatek.com>
 <a3da0d24e6749b054f8a65656ec40d4aa0b9f2dc.camel@mediatek.com>
 <a704c8ad4e9d6e1644baf338cbb98de4aa2ccf6e.camel@mediatek.com>
Message-ID: <d3cfc62e-5c79-48ef-b86e-28dc9c17012c@collabora.com>

Il 26/09/24 11:49, Jason-JH Lin (???) ha scritto:
> On Thu, 2024-09-26 at 09:30 +0000, CK Hu (???) wrote:
>> Hi, Jason:
>>
>> On Thu, 2024-09-26 at 16:35 +0800, Jason-JH.Lin wrote:
>>> OVL_CON_CLRFMT_MAN is a configuration for extending color format
>>> settings of DISP_REG_OVL_CON(n).
>>> It will change some of the original color format settings.
>>>
>>> Take the settings of (3 << 12) for example.
>>> - If OVL_CON_CLRFMT_MAN = 0 means OVL_CON_CLRFMT_RGBA8888.
>>> - If OVL_CON_CLRFMT_MAN = 1 means OVL_CON_CLRFMT_PARGB8888.
>>>
>>> Since previous SoCs did not support OVL_CON_CLRFMT_MAN, this means
>>> that the SoC does not support the premultiplied color format.
>>> It will break the original color format setting of MT8173.
>>>
>>> Therefore, the blend_modes is added to the driver data and then
>>> mtk_ovl_fmt_convert() will check the blend_modes to see if
>>> premultiplied supported in current platform.
>>> If it is not supported, use coverage mode to set it to the
>>> supported
>>> color formats to solve the degradation problem.
>>>
>>> Fixes: a3f7f7ef4bfe ("drm/mediatek: Support "Pre-multiplied"
>>> blending in OVL")
>>> Signed-off-by: Jason-JH.Lin <jason-jh.lin at mediatek.com>
>>> Tested-by: Alper Nebi Yasak <alpernebiyasak at gmail.com>
>>> Reviewed-by: AngeloGioacchino Del Regno <
>>> angelogioacchino.delregno at collabora.com>
>>
>> This version has difference over 50% with previous version.
>> It's better to drop these tested-by and reviewed-by tag.
> 
> OK, I'll drop this.
> 

You can keep my R-b tag on this one, I checked it.

Cheers,
Angelo

>>
>>> ---
>>>   drivers/gpu/drm/mediatek/mtk_disp_ovl.c | 41 ++++++++++++++++++++-
>>> ----
>>>   1 file changed, 34 insertions(+), 7 deletions(-)
>>>
>>> diff --git a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
>>> b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
>>> index 89b439dcf3a6..0cf7b80f612e 100644
>>> --- a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
>>> +++ b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
>>> @@ -146,6 +146,7 @@ struct mtk_disp_ovl_data {
>>>   	bool fmt_rgb565_is_0;
>>>   	bool smi_id_en;
>>>   	bool supports_afbc;
>>> +	const u32 blend_modes;
>>>   	const u32 *formats;
>>>   	size_t num_formats;
>>>   	bool supports_clrfmt_ext;
>>> @@ -386,14 +387,23 @@ void mtk_ovl_layer_off(struct device *dev,
>>> unsigned int idx,
>>>   		      DISP_REG_OVL_RDMA_CTRL(idx));
>>>   }
>>>   
>>> -static unsigned int ovl_fmt_convert(struct mtk_disp_ovl *ovl,
>>> unsigned int fmt,
>>> -				    unsigned int blend_mode)
>>> +static unsigned int mtk_ovl_fmt_convert(struct mtk_disp_ovl *ovl,
>>> +					struct mtk_plane_state *state)
>>>   {
>>> -	/* The return value in switch "MEM_MODE_INPUT_FORMAT_XXX"
>>> -	 * is defined in mediatek HW data sheet.
>>> -	 * The alphabet order in XXX is no relation to data
>>> -	 * arrangement in memory.
>>
>> I don't know why you drop these comment.
>> Without this modification,
> 
> Since we change the MACRO to align this to DRM input format order, this
> comment is no longer needed.
> 
> I'll send another patch for this.
> Thanks for such a quick reply!
> 
> Regards,
> Jason-JH.Lin
> 
>>
>> Reviewed-by: CK Hu <ck.hu at mediatek.com>
>>



From macpaul.lin at mediatek.com  Thu Sep 26 03:18:04 2024
From: macpaul.lin at mediatek.com (Macpaul Lin)
Date: Thu, 26 Sep 2024 18:18:04 +0800
Subject: [PATCH] dt-bindings: phy: mediatek: tphy: add a property for power-domains
Message-ID: <20240926101804.22471-1-macpaul.lin@mediatek.com>

Some platforms requires a dependency for power-domains.
So we add property 'power-domains' and set 'maxItems: 1' in the
DT Schema.

Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
---
 Documentation/devicetree/bindings/phy/mediatek,tphy.yaml | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/Documentation/devicetree/bindings/phy/mediatek,tphy.yaml b/Documentation/devicetree/bindings/phy/mediatek,tphy.yaml
index 423b7c4e62f2..c77fe43c224a 100644
--- a/Documentation/devicetree/bindings/phy/mediatek,tphy.yaml
+++ b/Documentation/devicetree/bindings/phy/mediatek,tphy.yaml
@@ -125,6 +125,9 @@ properties:
     $ref: /schemas/types.yaml#/definitions/uint32
     default: 28
 
+  power-domains:
+    maxItems: 1
+
 # Required child node:
 patternProperties:
   "^(usb|pcie|sata)-phy@[0-9a-f]+$":
-- 
2.45.2



From angelogioacchino.delregno at collabora.com  Thu Sep 26 03:20:44 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Thu, 26 Sep 2024 12:20:44 +0200
Subject: [PATCH] dt-bindings: phy: mediatek: tphy: add a property for
 power-domains
In-Reply-To: <20240926101804.22471-1-macpaul.lin@mediatek.com>
References: <20240926101804.22471-1-macpaul.lin@mediatek.com>
Message-ID: <7b7605c4-aa8a-4e03-95c1-386bc5f1669a@collabora.com>

Il 26/09/24 12:18, Macpaul Lin ha scritto:
> Some platforms requires a dependency for power-domains.
> So we add property 'power-domains' and set 'maxItems: 1' in the
> DT Schema.
> 
> Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>




From jason-jh.lin at mediatek.com  Thu Sep 26 03:22:36 2024
From: jason-jh.lin at mediatek.com (Jason-JH.Lin)
Date: Thu, 26 Sep 2024 18:22:36 +0800
Subject: [PATCH v7 1/3] drm/mediatek: ovl: Remove the color format comment for ovl_fmt_convert()
In-Reply-To: <20240926102238.24303-1-jason-jh.lin@mediatek.com>
References: <20240926102238.24303-1-jason-jh.lin@mediatek.com>
Message-ID: <20240926102238.24303-2-jason-jh.lin@mediatek.com>

Since we changed MACROs to be consistent with DRM input color format
naming, the comment for ovl_fmt_conver() is no longer needed.

Fixes: 9f428b95ac89 ("drm/mediatek: Add new color format MACROs in OVL")
Signed-off-by: Jason-JH.Lin <jason-jh.lin at mediatek.com>
---
 drivers/gpu/drm/mediatek/mtk_disp_ovl.c | 5 -----
 1 file changed, 5 deletions(-)

diff --git a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
index 89b439dcf3a6..4a4bc27a67f0 100644
--- a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
+++ b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
@@ -389,11 +389,6 @@ void mtk_ovl_layer_off(struct device *dev, unsigned int idx,
 static unsigned int ovl_fmt_convert(struct mtk_disp_ovl *ovl, unsigned int fmt,
 				    unsigned int blend_mode)
 {
-	/* The return value in switch "MEM_MODE_INPUT_FORMAT_XXX"
-	 * is defined in mediatek HW data sheet.
-	 * The alphabet order in XXX is no relation to data
-	 * arrangement in memory.
-	 */
 	switch (fmt) {
 	default:
 	case DRM_FORMAT_RGB565:
-- 
2.43.0



From jason-jh.lin at mediatek.com  Thu Sep 26 03:22:35 2024
From: jason-jh.lin at mediatek.com (Jason-JH.Lin)
Date: Thu, 26 Sep 2024 18:22:35 +0800
Subject: [PATCH v7 0/3] Fix degradation problem of alpha blending series
Message-ID: <20240926102238.24303-1-jason-jh.lin@mediatek.com>

Some SoCs not support pre-multiplied pixel formats and extending
configuration of OVL pre-multiplied color formats, such as MT8173.

Fix the SoC degradation problem by this sreies.

---

Change in v7:
1. Add the remove color format comment patch for OVL
2. Fix warning: 'const' type qualifier on return type has no effect

Chnage in v6:
1. Use blend_modes instead of function pointer in OVL
2. Use ethdr instead of mdp_rdma to get blend_modes
3. Add 0 checking for adding blend_mode property for mtk_plane

Change in v5:
Add fix patch for mtk_plane

Change in v4:
Add lost cases of mtk_ovl_fmt_convert_with_blend

Change in v3:
Change MACRO approach to function pointer in driver data

Change in v2:
Fix build error and typo

Change in v1:
Add fix patch for OVL unsupport color format settings by driver data

---

Jason-JH.Lin (3):
  drm/mediatek: ovl: Remove the color format comment for
    ovl_fmt_convert()
  drm/mediatek: ovl: Add blend_modes to driver data
  drm/mediatek: Add blend_modes to mtk_plane_init() for different SoCs

 drivers/gpu/drm/mediatek/mtk_crtc.c           |  1 +
 drivers/gpu/drm/mediatek/mtk_ddp_comp.c       |  2 +
 drivers/gpu/drm/mediatek/mtk_ddp_comp.h       | 10 ++++
 drivers/gpu/drm/mediatek/mtk_disp_drv.h       |  2 +
 drivers/gpu/drm/mediatek/mtk_disp_ovl.c       | 48 ++++++++++++++++---
 .../gpu/drm/mediatek/mtk_disp_ovl_adaptor.c   |  7 +++
 drivers/gpu/drm/mediatek/mtk_ethdr.c          |  7 +++
 drivers/gpu/drm/mediatek/mtk_ethdr.h          |  1 +
 drivers/gpu/drm/mediatek/mtk_plane.c          | 15 +++---
 drivers/gpu/drm/mediatek/mtk_plane.h          |  4 +-
 10 files changed, 80 insertions(+), 17 deletions(-)

-- 
2.43.0



From jason-jh.lin at mediatek.com  Thu Sep 26 03:22:38 2024
From: jason-jh.lin at mediatek.com (Jason-JH.Lin)
Date: Thu, 26 Sep 2024 18:22:38 +0800
Subject: [PATCH v7 3/3] drm/mediatek: Add blend_modes to mtk_plane_init() for different SoCs
In-Reply-To: <20240926102238.24303-1-jason-jh.lin@mediatek.com>
References: <20240926102238.24303-1-jason-jh.lin@mediatek.com>
Message-ID: <20240926102238.24303-4-jason-jh.lin@mediatek.com>

Since some SoCs support premultiplied pixel formats but some do not,
the blend_modes parameter is added to mtk_plane_init(), which is
obtained from the mtk_ddp_comp_get_blend_modes function implemented
in different blending supported components.

The blending supported components can use driver data to set the
blend mode capabilities for different SoCs.

Signed-off-by: Jason-JH.Lin <jason-jh.lin at mediatek.com>
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
Reviewed-by: CK Hu <ck.hu at mediatek.com>
---
 drivers/gpu/drm/mediatek/mtk_crtc.c             |  1 +
 drivers/gpu/drm/mediatek/mtk_ddp_comp.c         |  2 ++
 drivers/gpu/drm/mediatek/mtk_ddp_comp.h         | 10 ++++++++++
 drivers/gpu/drm/mediatek/mtk_disp_drv.h         |  2 ++
 drivers/gpu/drm/mediatek/mtk_disp_ovl.c         |  7 +++++++
 drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c |  7 +++++++
 drivers/gpu/drm/mediatek/mtk_ethdr.c            |  7 +++++++
 drivers/gpu/drm/mediatek/mtk_ethdr.h            |  1 +
 drivers/gpu/drm/mediatek/mtk_plane.c            | 15 +++++++--------
 drivers/gpu/drm/mediatek/mtk_plane.h            |  4 ++--
 10 files changed, 46 insertions(+), 10 deletions(-)

diff --git a/drivers/gpu/drm/mediatek/mtk_crtc.c b/drivers/gpu/drm/mediatek/mtk_crtc.c
index 175b00e5a253..b65f196f2015 100644
--- a/drivers/gpu/drm/mediatek/mtk_crtc.c
+++ b/drivers/gpu/drm/mediatek/mtk_crtc.c
@@ -913,6 +913,7 @@ static int mtk_crtc_init_comp_planes(struct drm_device *drm_dev,
 				BIT(pipe),
 				mtk_crtc_plane_type(mtk_crtc->layer_nr, num_planes),
 				mtk_ddp_comp_supported_rotations(comp),
+				mtk_ddp_comp_get_blend_modes(comp),
 				mtk_ddp_comp_get_formats(comp),
 				mtk_ddp_comp_get_num_formats(comp), i);
 		if (ret)
diff --git a/drivers/gpu/drm/mediatek/mtk_ddp_comp.c b/drivers/gpu/drm/mediatek/mtk_ddp_comp.c
index be66d94be361..edc6417639e6 100644
--- a/drivers/gpu/drm/mediatek/mtk_ddp_comp.c
+++ b/drivers/gpu/drm/mediatek/mtk_ddp_comp.c
@@ -363,6 +363,7 @@ static const struct mtk_ddp_comp_funcs ddp_ovl = {
 	.layer_config = mtk_ovl_layer_config,
 	.bgclr_in_on = mtk_ovl_bgclr_in_on,
 	.bgclr_in_off = mtk_ovl_bgclr_in_off,
+	.get_blend_modes = mtk_ovl_get_blend_modes,
 	.get_formats = mtk_ovl_get_formats,
 	.get_num_formats = mtk_ovl_get_num_formats,
 };
@@ -416,6 +417,7 @@ static const struct mtk_ddp_comp_funcs ddp_ovl_adaptor = {
 	.disconnect = mtk_ovl_adaptor_disconnect,
 	.add = mtk_ovl_adaptor_add_comp,
 	.remove = mtk_ovl_adaptor_remove_comp,
+	.get_blend_modes = mtk_ovl_adaptor_get_blend_modes,
 	.get_formats = mtk_ovl_adaptor_get_formats,
 	.get_num_formats = mtk_ovl_adaptor_get_num_formats,
 	.mode_valid = mtk_ovl_adaptor_mode_valid,
diff --git a/drivers/gpu/drm/mediatek/mtk_ddp_comp.h b/drivers/gpu/drm/mediatek/mtk_ddp_comp.h
index ecf6dc283cd7..39720b27f4e9 100644
--- a/drivers/gpu/drm/mediatek/mtk_ddp_comp.h
+++ b/drivers/gpu/drm/mediatek/mtk_ddp_comp.h
@@ -80,6 +80,7 @@ struct mtk_ddp_comp_funcs {
 	void (*ctm_set)(struct device *dev,
 			struct drm_crtc_state *state);
 	struct device * (*dma_dev_get)(struct device *dev);
+	u32 (*get_blend_modes)(struct device *dev);
 	const u32 *(*get_formats)(struct device *dev);
 	size_t (*get_num_formats)(struct device *dev);
 	void (*connect)(struct device *dev, struct device *mmsys_dev, unsigned int next);
@@ -266,6 +267,15 @@ static inline struct device *mtk_ddp_comp_dma_dev_get(struct mtk_ddp_comp *comp)
 	return comp->dev;
 }
 
+static inline
+u32 mtk_ddp_comp_get_blend_modes(struct mtk_ddp_comp *comp)
+{
+	if (comp->funcs && comp->funcs->get_blend_modes)
+		return comp->funcs->get_blend_modes(comp->dev);
+
+	return 0;
+}
+
 static inline
 const u32 *mtk_ddp_comp_get_formats(struct mtk_ddp_comp *comp)
 {
diff --git a/drivers/gpu/drm/mediatek/mtk_disp_drv.h b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
index 082ac18fe04a..04154db9085c 100644
--- a/drivers/gpu/drm/mediatek/mtk_disp_drv.h
+++ b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
@@ -103,6 +103,7 @@ void mtk_ovl_register_vblank_cb(struct device *dev,
 void mtk_ovl_unregister_vblank_cb(struct device *dev);
 void mtk_ovl_enable_vblank(struct device *dev);
 void mtk_ovl_disable_vblank(struct device *dev);
+u32 mtk_ovl_get_blend_modes(struct device *dev);
 const u32 *mtk_ovl_get_formats(struct device *dev);
 size_t mtk_ovl_get_num_formats(struct device *dev);
 
@@ -131,6 +132,7 @@ void mtk_ovl_adaptor_start(struct device *dev);
 void mtk_ovl_adaptor_stop(struct device *dev);
 unsigned int mtk_ovl_adaptor_layer_nr(struct device *dev);
 struct device *mtk_ovl_adaptor_dma_dev_get(struct device *dev);
+u32 mtk_ovl_adaptor_get_blend_modes(struct device *dev);
 const u32 *mtk_ovl_adaptor_get_formats(struct device *dev);
 size_t mtk_ovl_adaptor_get_num_formats(struct device *dev);
 enum drm_mode_status mtk_ovl_adaptor_mode_valid(struct device *dev,
diff --git a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
index 0cf7b80f612e..1d3b25d768f9 100644
--- a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
+++ b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
@@ -215,6 +215,13 @@ void mtk_ovl_disable_vblank(struct device *dev)
 	writel_relaxed(0x0, ovl->regs + DISP_REG_OVL_INTEN);
 }
 
+u32 mtk_ovl_get_blend_modes(struct device *dev)
+{
+	struct mtk_disp_ovl *ovl = dev_get_drvdata(dev);
+
+	return ovl->data->blend_modes;
+}
+
 const u32 *mtk_ovl_get_formats(struct device *dev)
 {
 	struct mtk_disp_ovl *ovl = dev_get_drvdata(dev);
diff --git a/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c b/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c
index c6768210b08b..bf2546c4681a 100644
--- a/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c
+++ b/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c
@@ -400,6 +400,13 @@ void mtk_ovl_adaptor_disable_vblank(struct device *dev)
 	mtk_ethdr_disable_vblank(ovl_adaptor->ovl_adaptor_comp[OVL_ADAPTOR_ETHDR0]);
 }
 
+u32 mtk_ovl_adaptor_get_blend_modes(struct device *dev)
+{
+	struct mtk_disp_ovl_adaptor *ovl_adaptor = dev_get_drvdata(dev);
+
+	return mtk_ethdr_get_blend_modes(ovl_adaptor->ovl_adaptor_comp[OVL_ADAPTOR_ETHDR0]);
+}
+
 const u32 *mtk_ovl_adaptor_get_formats(struct device *dev)
 {
 	struct mtk_disp_ovl_adaptor *ovl_adaptor = dev_get_drvdata(dev);
diff --git a/drivers/gpu/drm/mediatek/mtk_ethdr.c b/drivers/gpu/drm/mediatek/mtk_ethdr.c
index d1d9cf8b10e1..0f22e7d337cb 100644
--- a/drivers/gpu/drm/mediatek/mtk_ethdr.c
+++ b/drivers/gpu/drm/mediatek/mtk_ethdr.c
@@ -145,6 +145,13 @@ static irqreturn_t mtk_ethdr_irq_handler(int irq, void *dev_id)
 	return IRQ_HANDLED;
 }
 
+u32 mtk_ethdr_get_blend_modes(struct device *dev)
+{
+	return BIT(DRM_MODE_BLEND_PREMULTI) |
+	       BIT(DRM_MODE_BLEND_COVERAGE) |
+	       BIT(DRM_MODE_BLEND_PIXEL_NONE);
+}
+
 void mtk_ethdr_layer_config(struct device *dev, unsigned int idx,
 			    struct mtk_plane_state *state,
 			    struct cmdq_pkt *cmdq_pkt)
diff --git a/drivers/gpu/drm/mediatek/mtk_ethdr.h b/drivers/gpu/drm/mediatek/mtk_ethdr.h
index 81af9edea3f7..a72aeee46829 100644
--- a/drivers/gpu/drm/mediatek/mtk_ethdr.h
+++ b/drivers/gpu/drm/mediatek/mtk_ethdr.h
@@ -13,6 +13,7 @@ void mtk_ethdr_clk_disable(struct device *dev);
 void mtk_ethdr_config(struct device *dev, unsigned int w,
 		      unsigned int h, unsigned int vrefresh,
 		      unsigned int bpc, struct cmdq_pkt *cmdq_pkt);
+u32 mtk_ethdr_get_blend_modes(struct device *dev);
 void mtk_ethdr_layer_config(struct device *dev, unsigned int idx,
 			    struct mtk_plane_state *state,
 			    struct cmdq_pkt *cmdq_pkt);
diff --git a/drivers/gpu/drm/mediatek/mtk_plane.c b/drivers/gpu/drm/mediatek/mtk_plane.c
index 7d2cb4e0fafa..8a48b3b0a956 100644
--- a/drivers/gpu/drm/mediatek/mtk_plane.c
+++ b/drivers/gpu/drm/mediatek/mtk_plane.c
@@ -320,8 +320,8 @@ static const struct drm_plane_helper_funcs mtk_plane_helper_funcs = {
 
 int mtk_plane_init(struct drm_device *dev, struct drm_plane *plane,
 		   unsigned long possible_crtcs, enum drm_plane_type type,
-		   unsigned int supported_rotations, const u32 *formats,
-		   size_t num_formats, unsigned int plane_idx)
+		   unsigned int supported_rotations, const u32 blend_modes,
+		   const u32 *formats, size_t num_formats, unsigned int plane_idx)
 {
 	int err;
 
@@ -366,12 +366,11 @@ int mtk_plane_init(struct drm_device *dev, struct drm_plane *plane,
 	if (err)
 		DRM_ERROR("failed to create property: alpha\n");
 
-	err = drm_plane_create_blend_mode_property(plane,
-						   BIT(DRM_MODE_BLEND_PREMULTI) |
-						   BIT(DRM_MODE_BLEND_COVERAGE) |
-						   BIT(DRM_MODE_BLEND_PIXEL_NONE));
-	if (err)
-		DRM_ERROR("failed to create property: blend_mode\n");
+	if (blend_modes) {
+		err = drm_plane_create_blend_mode_property(plane, blend_modes);
+		if (err)
+			DRM_ERROR("failed to create property: blend_mode\n");
+	}
 
 	drm_plane_helper_add(plane, &mtk_plane_helper_funcs);
 
diff --git a/drivers/gpu/drm/mediatek/mtk_plane.h b/drivers/gpu/drm/mediatek/mtk_plane.h
index 5b177eac67b7..3b13b89989c7 100644
--- a/drivers/gpu/drm/mediatek/mtk_plane.h
+++ b/drivers/gpu/drm/mediatek/mtk_plane.h
@@ -48,6 +48,6 @@ to_mtk_plane_state(struct drm_plane_state *state)
 
 int mtk_plane_init(struct drm_device *dev, struct drm_plane *plane,
 		   unsigned long possible_crtcs, enum drm_plane_type type,
-		   unsigned int supported_rotations, const u32 *formats,
-		   size_t num_formats, unsigned int plane_idx);
+		   unsigned int supported_rotations, const u32 blend_modes,
+		   const u32 *formats, size_t num_formats, unsigned int plane_idx);
 #endif
-- 
2.43.0



From jason-jh.lin at mediatek.com  Thu Sep 26 03:22:37 2024
From: jason-jh.lin at mediatek.com (Jason-JH.Lin)
Date: Thu, 26 Sep 2024 18:22:37 +0800
Subject: [PATCH v7 2/3] drm/mediatek: ovl: Add blend_modes to driver data
In-Reply-To: <20240926102238.24303-1-jason-jh.lin@mediatek.com>
References: <20240926102238.24303-1-jason-jh.lin@mediatek.com>
Message-ID: <20240926102238.24303-3-jason-jh.lin@mediatek.com>

OVL_CON_CLRFMT_MAN is a configuration for extending color format
settings of DISP_REG_OVL_CON(n).
It will change some of the original color format settings.

Take the settings of (3 << 12) for example.
- If OVL_CON_CLRFMT_MAN = 0 means OVL_CON_CLRFMT_RGBA8888.
- If OVL_CON_CLRFMT_MAN = 1 means OVL_CON_CLRFMT_PARGB8888.

Since previous SoCs did not support OVL_CON_CLRFMT_MAN, this means
that the SoC does not support the premultiplied color format.
It will break the original color format setting of MT8173.

Therefore, the blend_modes is added to the driver data and then
mtk_ovl_fmt_convert() will check the blend_modes to see if
premultiplied supported in current platform.
If it is not supported, use coverage mode to set it to the supported
color formats to solve the degradation problem.

Fixes: a3f7f7ef4bfe ("drm/mediatek: Support "Pre-multiplied" blending in OVL")
Signed-off-by: Jason-JH.Lin <jason-jh.lin at mediatek.com>
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
Reviewed-by: CK Hu <ck.hu at mediatek.com>
---
 drivers/gpu/drm/mediatek/mtk_disp_ovl.c | 38 +++++++++++++++++++++++--
 1 file changed, 35 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
index 4a4bc27a67f0..0cf7b80f612e 100644
--- a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
+++ b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
@@ -146,6 +146,7 @@ struct mtk_disp_ovl_data {
 	bool fmt_rgb565_is_0;
 	bool smi_id_en;
 	bool supports_afbc;
+	const u32 blend_modes;
 	const u32 *formats;
 	size_t num_formats;
 	bool supports_clrfmt_ext;
@@ -386,9 +387,23 @@ void mtk_ovl_layer_off(struct device *dev, unsigned int idx,
 		      DISP_REG_OVL_RDMA_CTRL(idx));
 }
 
-static unsigned int ovl_fmt_convert(struct mtk_disp_ovl *ovl, unsigned int fmt,
-				    unsigned int blend_mode)
+static unsigned int mtk_ovl_fmt_convert(struct mtk_disp_ovl *ovl,
+					struct mtk_plane_state *state)
 {
+	unsigned int fmt = state->pending.format;
+	unsigned int blend_mode = state->base.pixel_blend_mode;
+
+	/*
+	 * For the platforms where OVL_CON_CLRFMT_MAN is defined in the hardware data sheet
+	 * and supports premultiplied color formats, such as OVL_CON_CLRFMT_PARGB8888.
+	 *
+	 * Check blend_modes in the driver data to see if premultiplied mode is supported.
+	 * If not, use coverage mode instead to set it to the supported color formats.
+	 */
+	if (!(ovl->data->blend_modes & BIT(DRM_MODE_BLEND_PREMULTI)) &&
+	    blend_mode == DRM_MODE_BLEND_PREMULTI)
+		blend_mode = DRM_MODE_BLEND_COVERAGE;
+
 	switch (fmt) {
 	default:
 	case DRM_FORMAT_RGB565:
@@ -466,7 +481,7 @@ void mtk_ovl_layer_config(struct device *dev, unsigned int idx,
 		return;
 	}
 
-	con = ovl_fmt_convert(ovl, fmt, blend_mode);
+	con = mtk_ovl_fmt_convert(ovl, state);
 	if (state->base.fb) {
 		con |= OVL_CON_AEN;
 		con |= state->base.alpha & OVL_CON_ALPHA;
@@ -621,6 +636,8 @@ static const struct mtk_disp_ovl_data mt2701_ovl_driver_data = {
 	.gmc_bits = 8,
 	.layer_nr = 4,
 	.fmt_rgb565_is_0 = false,
+	.blend_modes = BIT(DRM_MODE_BLEND_COVERAGE) |
+		       BIT(DRM_MODE_BLEND_PIXEL_NONE),
 	.formats = mt8173_formats,
 	.num_formats = ARRAY_SIZE(mt8173_formats),
 };
@@ -630,6 +647,8 @@ static const struct mtk_disp_ovl_data mt8173_ovl_driver_data = {
 	.gmc_bits = 8,
 	.layer_nr = 4,
 	.fmt_rgb565_is_0 = true,
+	.blend_modes = BIT(DRM_MODE_BLEND_COVERAGE) |
+		       BIT(DRM_MODE_BLEND_PIXEL_NONE),
 	.formats = mt8173_formats,
 	.num_formats = ARRAY_SIZE(mt8173_formats),
 };
@@ -639,6 +658,8 @@ static const struct mtk_disp_ovl_data mt8183_ovl_driver_data = {
 	.gmc_bits = 10,
 	.layer_nr = 4,
 	.fmt_rgb565_is_0 = true,
+	.blend_modes = BIT(DRM_MODE_BLEND_COVERAGE) |
+		       BIT(DRM_MODE_BLEND_PIXEL_NONE),
 	.formats = mt8173_formats,
 	.num_formats = ARRAY_SIZE(mt8173_formats),
 };
@@ -648,6 +669,8 @@ static const struct mtk_disp_ovl_data mt8183_ovl_2l_driver_data = {
 	.gmc_bits = 10,
 	.layer_nr = 2,
 	.fmt_rgb565_is_0 = true,
+	.blend_modes = BIT(DRM_MODE_BLEND_COVERAGE) |
+		       BIT(DRM_MODE_BLEND_PIXEL_NONE),
 	.formats = mt8173_formats,
 	.num_formats = ARRAY_SIZE(mt8173_formats),
 };
@@ -658,6 +681,9 @@ static const struct mtk_disp_ovl_data mt8192_ovl_driver_data = {
 	.layer_nr = 4,
 	.fmt_rgb565_is_0 = true,
 	.smi_id_en = true,
+	.blend_modes = BIT(DRM_MODE_BLEND_PREMULTI) |
+		       BIT(DRM_MODE_BLEND_COVERAGE) |
+		       BIT(DRM_MODE_BLEND_PIXEL_NONE),
 	.formats = mt8173_formats,
 	.num_formats = ARRAY_SIZE(mt8173_formats),
 };
@@ -668,6 +694,9 @@ static const struct mtk_disp_ovl_data mt8192_ovl_2l_driver_data = {
 	.layer_nr = 2,
 	.fmt_rgb565_is_0 = true,
 	.smi_id_en = true,
+	.blend_modes = BIT(DRM_MODE_BLEND_PREMULTI) |
+		       BIT(DRM_MODE_BLEND_COVERAGE) |
+		       BIT(DRM_MODE_BLEND_PIXEL_NONE),
 	.formats = mt8173_formats,
 	.num_formats = ARRAY_SIZE(mt8173_formats),
 };
@@ -679,6 +708,9 @@ static const struct mtk_disp_ovl_data mt8195_ovl_driver_data = {
 	.fmt_rgb565_is_0 = true,
 	.smi_id_en = true,
 	.supports_afbc = true,
+	.blend_modes = BIT(DRM_MODE_BLEND_PREMULTI) |
+		       BIT(DRM_MODE_BLEND_COVERAGE) |
+		       BIT(DRM_MODE_BLEND_PIXEL_NONE),
 	.formats = mt8195_formats,
 	.num_formats = ARRAY_SIZE(mt8195_formats),
 	.supports_clrfmt_ext = true,
-- 
2.43.0



From fshao at chromium.org  Thu Sep 26 03:41:39 2024
From: fshao at chromium.org (Fei Shao)
Date: Thu, 26 Sep 2024 18:41:39 +0800
Subject: [PATCH 3/6] arm64: dts: mediatek: mt8188: Define CPU big core cluster
In-Reply-To: <fbdbe9ff-586a-429c-a987-b8ec39b485e8@collabora.com>
References: <20240925110044.3678055-1-fshao@chromium.org> <20240925110044.3678055-4-fshao@chromium.org>
 <fbdbe9ff-586a-429c-a987-b8ec39b485e8@collabora.com>
Message-ID: <CAC=S1njehOqkM26o=vfirZ9L8bec0jbtnvH0J2miYR_qEDeSVA@mail.gmail.com>

On Thu, Sep 26, 2024 at 4:33?PM AngeloGioacchino Del Regno
<angelogioacchino.delregno at collabora.com> wrote:
>
> Il 25/09/24 12:57, Fei Shao ha scritto:
> > The MT8188 SoC features two CPU clusters: one with 6 little Cortex-A55
> > cores, and the other with 2 big Cortex-A78 cores.
>
> No, it doesn't. It features only one cluster, so...
>
> >
> > Update the CPU topology to reflect the actual hardware configurations.
>
> ...the actual hardware configuration is already reflected by the currently
> declared CPU topology, so for this commit: NAK.
>
> This SoC uses the ARM DynamIQ technology and embeds both LITTLE and big
> cores in one single cluster.
> Check the MT8188 datasheet for more information :-)

You are absolutely right. I found that description in the datasheet,
and this patch is completely wrong.
Thanks for pointing it out!

Regards,
Fei

>
> Cheers,
> Angelo


From fshao at chromium.org  Thu Sep 26 03:42:21 2024
From: fshao at chromium.org (Fei Shao)
Date: Thu, 26 Sep 2024 18:42:21 +0800
Subject: [PATCH 5/6] arm64: dts: mediatek: mt8188: Move vdec1 power domain
 under vdec0
In-Reply-To: <b3842173-7074-4bcb-80f4-1f6f8cb38a52@collabora.com>
References: <20240925110044.3678055-1-fshao@chromium.org> <20240925110044.3678055-6-fshao@chromium.org>
 <b3842173-7074-4bcb-80f4-1f6f8cb38a52@collabora.com>
Message-ID: <CAC=S1nhs4EUR78HunNnz=Z-cG4GgAZ=7JFyJmj6he96Z=GuxOQ@mail.gmail.com>

On Thu, Sep 26, 2024 at 4:33?PM AngeloGioacchino Del Regno
<angelogioacchino.delregno at collabora.com> wrote:
>
> Il 25/09/24 12:57, Fei Shao ha scritto:
> > There are two hardware IP blocks in MT8188 video decoder pipeline:
> > vdec-lat and vdec-core, which are powered by vdec0 and vdec1 power
> > domains respectively.
> >
> > We noticed that vdec-core needs to be powered down before vdec-lat
> > during suspend to prevent failures. It's unclear if it's an intended
> > hardware design or due to power isolation glitch. But in any case, we
> > observed a power-off sequence here, and it can be considered as an
> > indirect dependency implication between the vdec0 and vdec1 domains.
> >
> > Given that, update vdec1 as a sub-domain of vdec0 to enforce the
> > sequence. Also, use more specific clock names for both power domains.
> >
>
> As far as I know, yes, there is a sequence:
>   - Cores (mtk-vcodec-core) gets suspended first
>   - Then the LATs gets suspended (mtk-vcodec-lat)
>   - Finally, the LAT SoC gets suspended (mtk-vcodec-lat-soc)
>
> ...but you checked that downstream, and your downstream misses the lat-soc HW
> instance, and only has the lat one.
>
> Are you sure that this is not the reason why you're getting this issue? :-)
>
> Otherwise, I feel like we must ask for some clarification from MediaTek, as
> I'm mostly sure that the two cores are independent from each other (but I
> might, of course, be wrong!).

Yes I think I should... this is actually based on a downstream patch of theirs.
My understanding is that LAT SoC is not always in the vdec pipeline
for every MediaTek SoCs. Although the MT8188 and MT8195 have much in
common, I have a vague impression that MT8188 doesn't have a LAT SoC
HW, so the downstream video decoding works smoothly without describing
that in DT... but still, I could be wrong, and things just happen to work.

Anyway, I'll find someone on the MediaTek side for clarification. The
datasheet I have doesn't seem to contain such information.

Regards,
Fei

>
> Cheers,
> Angelo


From cristian.ciocaltea at collabora.com  Thu Sep 26 03:43:19 2024
From: cristian.ciocaltea at collabora.com (Cristian Ciocaltea)
Date: Thu, 26 Sep 2024 13:43:19 +0300
Subject: [PATCH v2 0/4] Provide devm_clk_bulk_get_all_enabled() helper
Message-ID: <20240926-clk_bulk_ena_fix-v2-0-9c767510fbb5@collabora.com>

Commit 265b07df758a ("clk: Provide managed helper to get and enable bulk
clocks") added devm_clk_bulk_get_all_enable() function, but missed to
return the number of clocks stored in the clk_bulk_data table referenced
by the clks argument.

That is required in case there is a need to iterate these clocks later,
therefore I couldn't see any use case of this parameter and should have
been simply removed from the function declaration.

The first patch in the series provides devm_clk_bulk_get_all_enabled()
variant, which is consistent with devm_clk_bulk_get_all() in terms of
the returned value:

 > 0 if one or more clocks have been stored
 = 0 if there are no clocks
 < 0 if an error occurred

Moreover, the naming is consistent with devm_clk_get_enabled(), i.e. use
the past form of 'enable'.

The next two patches switch existing users of devm_clk_get_enable() to
the new helper - there were only two, as of next-20240913.

The last patch drops the now obsolete devm_clk_bulk_get_all_enable()
helper.

Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea at collabora.com>
---
Changes in v2:
- Dropped references to 'broken' API in commit descriptions, per Mani's
  suggestion
- Added R-b tags from Angelo and Mani
- Link to v1:
  https://lore.kernel.org/r/20240914-clk_bulk_ena_fix-v1-0-ce3537585c06 at collabora.com

---
Cristian Ciocaltea (4):
      clk: Provide devm_clk_bulk_get_all_enabled() helper
      soc: mediatek: pwrap: Switch to devm_clk_bulk_get_all_enabled()
      PCI: exynos: Switch to devm_clk_bulk_get_all_enabled()
      clk: Drop obsolete devm_clk_bulk_get_all_enable() helper

 drivers/clk/clk-devres.c                | 30 ++++++++++++++++--------------
 drivers/pci/controller/dwc/pci-exynos.c |  2 +-
 drivers/soc/mediatek/mtk-pmic-wrap.c    |  4 ++--
 include/linux/clk.h                     | 12 +++++++-----
 4 files changed, 26 insertions(+), 22 deletions(-)
---
base-commit: 5acd9952f95fb4b7da6d09a3be39195a80845eb6
change-id: 20240912-clk_bulk_ena_fix-16ba77358ddf



From cristian.ciocaltea at collabora.com  Thu Sep 26 03:43:21 2024
From: cristian.ciocaltea at collabora.com (Cristian Ciocaltea)
Date: Thu, 26 Sep 2024 13:43:21 +0300
Subject: [PATCH v2 2/4] soc: mediatek: pwrap: Switch to
 devm_clk_bulk_get_all_enabled()
In-Reply-To: <20240926-clk_bulk_ena_fix-v2-0-9c767510fbb5@collabora.com>
References: <20240926-clk_bulk_ena_fix-v2-0-9c767510fbb5@collabora.com>
Message-ID: <20240926-clk_bulk_ena_fix-v2-2-9c767510fbb5@collabora.com>

The helper devm_clk_bulk_get_all_enable() missed to return the number of
clocks stored in the clk_bulk_data table referenced by the clks
argument and, therefore, will be dropped.

Use the newly introduced devm_clk_bulk_get_all_enabled() variant
instead, which is consistent with devm_clk_bulk_get_all() in terms of
the returned value:

 > 0 if one or more clocks have been stored
 = 0 if there are no clocks
 < 0 if an error occurred

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam at linaro.org>
Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea at collabora.com>
---
 drivers/soc/mediatek/mtk-pmic-wrap.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/soc/mediatek/mtk-pmic-wrap.c b/drivers/soc/mediatek/mtk-pmic-wrap.c
index 9fdc0ef79202..0bcd85826375 100644
--- a/drivers/soc/mediatek/mtk-pmic-wrap.c
+++ b/drivers/soc/mediatek/mtk-pmic-wrap.c
@@ -2518,8 +2518,8 @@ static int pwrap_probe(struct platform_device *pdev)
 		}
 	}
 
-	ret = devm_clk_bulk_get_all_enable(wrp->dev, &clk);
-	if (ret)
+	ret = devm_clk_bulk_get_all_enabled(wrp->dev, &clk);
+	if (ret < 0)
 		return dev_err_probe(wrp->dev, ret,
 				     "failed to get clocks\n");
 

-- 
2.46.1



From cristian.ciocaltea at collabora.com  Thu Sep 26 03:43:20 2024
From: cristian.ciocaltea at collabora.com (Cristian Ciocaltea)
Date: Thu, 26 Sep 2024 13:43:20 +0300
Subject: [PATCH v2 1/4] clk: Provide devm_clk_bulk_get_all_enabled() helper
In-Reply-To: <20240926-clk_bulk_ena_fix-v2-0-9c767510fbb5@collabora.com>
References: <20240926-clk_bulk_ena_fix-v2-0-9c767510fbb5@collabora.com>
Message-ID: <20240926-clk_bulk_ena_fix-v2-1-9c767510fbb5@collabora.com>

Commit 265b07df758a ("clk: Provide managed helper to get and enable bulk
clocks") added devm_clk_bulk_get_all_enable() function, but missed to
return the number of clocks stored in the clk_bulk_data table referenced
by the clks argument.  Without knowing the number, it's not possible to
iterate these clocks when needed, hence the argument is useless and
could have been simply removed.

Introduce devm_clk_bulk_get_all_enabled() variant, which is consistent
with devm_clk_bulk_get_all() in terms of the returned value:

 > 0 if one or more clocks have been stored
 = 0 if there are no clocks
 < 0 if an error occurred

Moreover, the naming is consistent with devm_clk_get_enabled(), i.e. use
the past form of 'enable'.

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam at linaro.org>
Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea at collabora.com>
---
 drivers/clk/clk-devres.c | 34 ++++++++++++++++++++++++++++++++++
 include/linux/clk.h      | 24 ++++++++++++++++++++++++
 2 files changed, 58 insertions(+)

diff --git a/drivers/clk/clk-devres.c b/drivers/clk/clk-devres.c
index 82ae1f26e634..4203aaaa7544 100644
--- a/drivers/clk/clk-devres.c
+++ b/drivers/clk/clk-devres.c
@@ -250,6 +250,40 @@ int __must_check devm_clk_bulk_get_all_enable(struct device *dev,
 }
 EXPORT_SYMBOL_GPL(devm_clk_bulk_get_all_enable);
 
+int __must_check devm_clk_bulk_get_all_enabled(struct device *dev,
+					       struct clk_bulk_data **clks)
+{
+	struct clk_bulk_devres *devres;
+	int ret;
+
+	devres = devres_alloc(devm_clk_bulk_release_all_enable,
+			      sizeof(*devres), GFP_KERNEL);
+	if (!devres)
+		return -ENOMEM;
+
+	ret = clk_bulk_get_all(dev, &devres->clks);
+	if (ret <= 0)
+		goto err_free_devres;
+
+	*clks = devres->clks;
+	devres->num_clks = ret;
+
+	ret = clk_bulk_prepare_enable(devres->num_clks, *clks);
+	if (ret) {
+		clk_bulk_put_all(devres->num_clks, devres->clks);
+		goto err_free_devres;
+	}
+
+	devres_add(dev, devres);
+
+	return devres->num_clks;
+
+err_free_devres:
+	devres_free(devres);
+	return ret;
+}
+EXPORT_SYMBOL_GPL(devm_clk_bulk_get_all_enabled);
+
 static int devm_clk_match(struct device *dev, void *res, void *data)
 {
 	struct clk **c = res;
diff --git a/include/linux/clk.h b/include/linux/clk.h
index 851a0f2cf42c..158c5072852e 100644
--- a/include/linux/clk.h
+++ b/include/linux/clk.h
@@ -511,6 +511,24 @@ int __must_check devm_clk_bulk_get_all(struct device *dev,
 int __must_check devm_clk_bulk_get_all_enable(struct device *dev,
 					      struct clk_bulk_data **clks);
 
+/**
+ * devm_clk_bulk_get_all_enabled - Get and enable all clocks of the consumer (managed)
+ * @dev: device for clock "consumer"
+ * @clks: pointer to the clk_bulk_data table of consumer
+ *
+ * Returns a positive value for the number of clocks obtained while the
+ * clock references are stored in the clk_bulk_data table in @clks field.
+ * Returns 0 if there're none and a negative value if something failed.
+ *
+ * This helper function allows drivers to get all clocks of the
+ * consumer and enables them in one operation with management.
+ * The clks will automatically be disabled and freed when the device
+ * is unbound.
+ */
+
+int __must_check devm_clk_bulk_get_all_enabled(struct device *dev,
+					       struct clk_bulk_data **clks);
+
 /**
  * devm_clk_get - lookup and obtain a managed reference to a clock producer.
  * @dev: device for clock "consumer"
@@ -1040,6 +1058,12 @@ static inline int __must_check devm_clk_bulk_get_all_enable(struct device *dev,
 	return 0;
 }
 
+static inline int __must_check devm_clk_bulk_get_all_enabled(struct device *dev,
+						struct clk_bulk_data **clks)
+{
+	return 0;
+}
+
 static inline struct clk *devm_get_clk_from_child(struct device *dev,
 				struct device_node *np, const char *con_id)
 {

-- 
2.46.1



From cristian.ciocaltea at collabora.com  Thu Sep 26 03:43:22 2024
From: cristian.ciocaltea at collabora.com (Cristian Ciocaltea)
Date: Thu, 26 Sep 2024 13:43:22 +0300
Subject: [PATCH v2 3/4] PCI: exynos: Switch to
 devm_clk_bulk_get_all_enabled()
In-Reply-To: <20240926-clk_bulk_ena_fix-v2-0-9c767510fbb5@collabora.com>
References: <20240926-clk_bulk_ena_fix-v2-0-9c767510fbb5@collabora.com>
Message-ID: <20240926-clk_bulk_ena_fix-v2-3-9c767510fbb5@collabora.com>

The helper devm_clk_bulk_get_all_enable() missed to return the number of
clocks stored in the clk_bulk_data table referenced by the clks
argument and, therefore, will be dropped.

Use the newly introduced devm_clk_bulk_get_all_enabled() variant
instead, which is consistent with devm_clk_bulk_get_all() in terms of
the returned value:

 > 0 if one or more clocks have been stored
 = 0 if there are no clocks
 < 0 if an error occurred

Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam at linaro.org>
Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea at collabora.com>
---
 drivers/pci/controller/dwc/pci-exynos.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/pci/controller/dwc/pci-exynos.c b/drivers/pci/controller/dwc/pci-exynos.c
index fa45da28a218..056cebd4e0ba 100644
--- a/drivers/pci/controller/dwc/pci-exynos.c
+++ b/drivers/pci/controller/dwc/pci-exynos.c
@@ -300,7 +300,7 @@ static int exynos_pcie_probe(struct platform_device *pdev)
 	if (IS_ERR(ep->elbi_base))
 		return PTR_ERR(ep->elbi_base);
 
-	ret = devm_clk_bulk_get_all_enable(dev, &ep->clks);
+	ret = devm_clk_bulk_get_all_enabled(dev, &ep->clks);
 	if (ret < 0)
 		return ret;
 

-- 
2.46.1



From cristian.ciocaltea at collabora.com  Thu Sep 26 03:43:23 2024
From: cristian.ciocaltea at collabora.com (Cristian Ciocaltea)
Date: Thu, 26 Sep 2024 13:43:23 +0300
Subject: [PATCH v2 4/4] clk: Drop obsolete devm_clk_bulk_get_all_enable()
 helper
In-Reply-To: <20240926-clk_bulk_ena_fix-v2-0-9c767510fbb5@collabora.com>
References: <20240926-clk_bulk_ena_fix-v2-0-9c767510fbb5@collabora.com>
Message-ID: <20240926-clk_bulk_ena_fix-v2-4-9c767510fbb5@collabora.com>

Commit 265b07df758a ("clk: Provide managed helper to get and enable bulk
clocks") added devm_clk_bulk_get_all_enable() function, but missed to
return the number of clocks stored in the clk_bulk_data table referenced
by the clks argument.  Without knowing the number, it's not possible to
iterate these clocks when needed, hence the argument is useless and
could have been simply removed.

A new helper devm_clk_bulk_get_all_enabled() has been introduced, which
is consistent with devm_clk_bulk_get_all() in terms of the returned
value.

Drop the obsolete function since all users switched to the new helper.

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam at linaro.org>
Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea at collabora.com>
---
 drivers/clk/clk-devres.c | 32 --------------------------------
 include/linux/clk.h      | 22 ----------------------
 2 files changed, 54 deletions(-)

diff --git a/drivers/clk/clk-devres.c b/drivers/clk/clk-devres.c
index 4203aaaa7544..14a657f336fe 100644
--- a/drivers/clk/clk-devres.c
+++ b/drivers/clk/clk-devres.c
@@ -218,38 +218,6 @@ static void devm_clk_bulk_release_all_enable(struct device *dev, void *res)
 	clk_bulk_put_all(devres->num_clks, devres->clks);
 }
 
-int __must_check devm_clk_bulk_get_all_enable(struct device *dev,
-					      struct clk_bulk_data **clks)
-{
-	struct clk_bulk_devres *devres;
-	int ret;
-
-	devres = devres_alloc(devm_clk_bulk_release_all_enable,
-			      sizeof(*devres), GFP_KERNEL);
-	if (!devres)
-		return -ENOMEM;
-
-	ret = clk_bulk_get_all(dev, &devres->clks);
-	if (ret > 0) {
-		*clks = devres->clks;
-		devres->num_clks = ret;
-	} else {
-		devres_free(devres);
-		return ret;
-	}
-
-	ret = clk_bulk_prepare_enable(devres->num_clks, *clks);
-	if (!ret) {
-		devres_add(dev, devres);
-	} else {
-		clk_bulk_put_all(devres->num_clks, devres->clks);
-		devres_free(devres);
-	}
-
-	return ret;
-}
-EXPORT_SYMBOL_GPL(devm_clk_bulk_get_all_enable);
-
 int __must_check devm_clk_bulk_get_all_enabled(struct device *dev,
 					       struct clk_bulk_data **clks)
 {
diff --git a/include/linux/clk.h b/include/linux/clk.h
index 158c5072852e..b607482ca77e 100644
--- a/include/linux/clk.h
+++ b/include/linux/clk.h
@@ -495,22 +495,6 @@ int __must_check devm_clk_bulk_get_optional(struct device *dev, int num_clks,
 int __must_check devm_clk_bulk_get_all(struct device *dev,
 				       struct clk_bulk_data **clks);
 
-/**
- * devm_clk_bulk_get_all_enable - Get and enable all clocks of the consumer (managed)
- * @dev: device for clock "consumer"
- * @clks: pointer to the clk_bulk_data table of consumer
- *
- * Returns success (0) or negative errno.
- *
- * This helper function allows drivers to get all clocks of the
- * consumer and enables them in one operation with management.
- * The clks will automatically be disabled and freed when the device
- * is unbound.
- */
-
-int __must_check devm_clk_bulk_get_all_enable(struct device *dev,
-					      struct clk_bulk_data **clks);
-
 /**
  * devm_clk_bulk_get_all_enabled - Get and enable all clocks of the consumer (managed)
  * @dev: device for clock "consumer"
@@ -1052,12 +1036,6 @@ static inline int __must_check devm_clk_bulk_get_all(struct device *dev,
 	return 0;
 }
 
-static inline int __must_check devm_clk_bulk_get_all_enable(struct device *dev,
-						struct clk_bulk_data **clks)
-{
-	return 0;
-}
-
 static inline int __must_check devm_clk_bulk_get_all_enabled(struct device *dev,
 						struct clk_bulk_data **clks)
 {

-- 
2.46.1



From cristian.ciocaltea at collabora.com  Thu Sep 26 03:49:47 2024
From: cristian.ciocaltea at collabora.com (Cristian Ciocaltea)
Date: Thu, 26 Sep 2024 13:49:47 +0300
Subject: [PATCH 0/4] Provide devm_clk_bulk_get_all_enabled() helper
In-Reply-To: <20240925075654.f2pefosdspqiakvj@thinkpad>
References: <20240914-clk_bulk_ena_fix-v1-0-ce3537585c06@collabora.com>
 <20240924143634.pqpdsewoqxn3liqi@thinkpad>
 <70a24964-990b-4606-bdc8-4dd42c44785a@collabora.com>
 <20240925075654.f2pefosdspqiakvj@thinkpad>
Message-ID: <227a813a-0586-4072-b6de-9dfddfe2d060@collabora.com>

On 9/25/24 10:56 AM, Manivannan Sadhasivam wrote:
> On Wed, Sep 25, 2024 at 09:52:44AM +0200, AngeloGioacchino Del Regno wrote:
>> Il 24/09/24 16:36, Manivannan Sadhasivam ha scritto:
>>> On Sat, Sep 14, 2024 at 09:04:53PM +0300, Cristian Ciocaltea wrote:
>>>> Commit 265b07df758a ("clk: Provide managed helper to get and enable bulk
>>>> clocks") added devm_clk_bulk_get_all_enable() function, but missed to
>>>> return the number of clocks stored in the clk_bulk_data table referenced
>>>> by the clks argument.
>>>>
>>>> That is required in case there is a need to iterate these clocks later,
>>>> therefore I couldn't see any use case of this parameter and should have
>>>> been simply removed from the function declaration.
>>>>
>>>
>>> Is there an user that currerntly does this?
>>>
>>
>> Yes and the patch wasn't sent upstream yet, but anyway, regardless of that,
>> this series is fixing inconsistency with both naming and usage between the
>> clock (bulk) API functions, with that being the only function acting
>> different from the others, at best confusing people.
>>
> 
> I agree with the 'inconsistency' part of the API, but I wouldn't call it as
> *broken* as this series does. Please fix that and you can have my:
> 
> Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam at linaro.org>

Thanks Angelo and Mani for reviewing this.

I've submitted v2:

https://lore.kernel.org/lkml/20240926-clk_bulk_ena_fix-v2-0-9c767510fbb5 at collabora.com/

Regards,
Cristian


From macpaul.lin at mediatek.com  Thu Sep 26 04:14:45 2024
From: macpaul.lin at mediatek.com (Macpaul Lin)
Date: Thu, 26 Sep 2024 19:14:45 +0800
Subject: [PATCH v2 1/5] arm64: dts: mt8195: Fix dtbs_check error for infracfg_ao node
Message-ID: <20240926111449.9245-1-macpaul.lin@mediatek.com>

The infracfg_ao node in mt8195.dtsi was causing a dtbs_check error.
The error message was:

syscon at 10001000: compatible: ['mediatek,mt8195-infracfg_ao', 'syscon',
                 'simple-mfd'] is too long

To resolve this, remove 'simple-mfd' from the 'compatible' property of the
infracfg_ao node.

Fixes: 37f2582883be ("arm64: dts: Add mediatek SoC mt8195 and evaluation board")
Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
---
 arch/arm64/boot/dts/mediatek/mt8195.dtsi | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Changes for v2:
 - no change.

diff --git a/arch/arm64/boot/dts/mediatek/mt8195.dtsi b/arch/arm64/boot/dts/mediatek/mt8195.dtsi
index e89ba384c4aa..2e1b41359b43 100644
--- a/arch/arm64/boot/dts/mediatek/mt8195.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8195.dtsi
@@ -487,7 +487,7 @@ topckgen: syscon at 10000000 {
 		};
 
 		infracfg_ao: syscon at 10001000 {
-			compatible = "mediatek,mt8195-infracfg_ao", "syscon", "simple-mfd";
+			compatible = "mediatek,mt8195-infracfg_ao", "syscon";
 			reg = <0 0x10001000 0 0x1000>;
 			#clock-cells = <1>;
 			#reset-cells = <1>;
-- 
2.45.2



From macpaul.lin at mediatek.com  Thu Sep 26 04:14:47 2024
From: macpaul.lin at mediatek.com (Macpaul Lin)
Date: Thu, 26 Sep 2024 19:14:47 +0800
Subject: [PATCH v2 3/5] arm64: dts: mediatek: mt8395-genio-1200-evk: Fix dtbs_check error for phy
In-Reply-To: <20240926111449.9245-1-macpaul.lin@mediatek.com>
References: <20240926111449.9245-1-macpaul.lin@mediatek.com>
Message-ID: <20240926111449.9245-3-macpaul.lin@mediatek.com>

The ethernet-phy node in mt8395-genio-1200-evk.dts was triggering a
dtbs_check error. The error message was:
  eth-phy0 at 1: $nodename:0: 'eth-phy0 at 1' does not match
              '^ethernet-phy(@[a-f0-9]+)?$'
Fix this issue by replacing 'eth-phy' node to generic 'ethernet-phy'.

Fixes: f2b543a191b6 ("arm64: dts: mediatek: add device-tree for Genio 1200 EVK board")
Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
---
 arch/arm64/boot/dts/mediatek/mt8395-genio-1200-evk.dts | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Changes for v2:
 - No change.

diff --git a/arch/arm64/boot/dts/mediatek/mt8395-genio-1200-evk.dts b/arch/arm64/boot/dts/mediatek/mt8395-genio-1200-evk.dts
index 1ef6262b65c9..b4b48eb93f3c 100644
--- a/arch/arm64/boot/dts/mediatek/mt8395-genio-1200-evk.dts
+++ b/arch/arm64/boot/dts/mediatek/mt8395-genio-1200-evk.dts
@@ -187,7 +187,7 @@ mdio {
 		compatible = "snps,dwmac-mdio";
 		#address-cells = <1>;
 		#size-cells = <0>;
-		eth_phy0: eth-phy0 at 1 {
+		eth_phy0: ethernet-phy at 1 {
 			compatible = "ethernet-phy-id001c.c916";
 			reg = <0x1>;
 		};
-- 
2.45.2



From macpaul.lin at mediatek.com  Thu Sep 26 04:14:49 2024
From: macpaul.lin at mediatek.com (Macpaul Lin)
Date: Thu, 26 Sep 2024 19:14:49 +0800
Subject: [PATCH v2 5/5] dt-bindings: display: mediatek: dpi: Add mt8195 support in power domains
In-Reply-To: <20240926111449.9245-1-macpaul.lin@mediatek.com>
References: <20240926111449.9245-1-macpaul.lin@mediatek.com>
Message-ID: <20240926111449.9245-5-macpaul.lin@mediatek.com>

Add power domain binding to the mediatek DPI controller for MT8185.

The dpi node in mt8195.dtsi was triggering a dtbs_check error:
  dp-intf at 1c113000: power-domains: False schema does not allow [[44, 18]]

Fixes: 5474d49b2f79 ("dt-bindings: display: mediatek: dpi: Add power domains")
Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
---
 .../devicetree/bindings/display/mediatek/mediatek,dpi.yaml       | 1 +
 1 file changed, 1 insertion(+)

Changes for v2:
 - Because of the corresponding dts fix has been reviewed with a Reviewed-by: tag.
   [1] https://lore.kernel.org/all/20240925080515.16377-1-macpaul.lin at mediatek.com/
   We still need this change to fix the 2 dtbs_check errors.
   So keeps no change here.

diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml b/Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml
index 3a82aec9021c..07acc8a76bfc 100644
--- a/Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml
+++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml
@@ -89,6 +89,7 @@ allOf:
                 - mediatek,mt6795-dpi
                 - mediatek,mt8173-dpi
                 - mediatek,mt8186-dpi
+                - mediatek,mt8195-dp-intf
     then:
       properties:
         power-domains: false
-- 
2.45.2



From macpaul.lin at mediatek.com  Thu Sep 26 04:14:46 2024
From: macpaul.lin at mediatek.com (Macpaul Lin)
Date: Thu, 26 Sep 2024 19:14:46 +0800
Subject: [PATCH v2 2/5] dt-bindings: iommu: mediatek: Fix interrupt count constraint for new SoCs
In-Reply-To: <20240926111449.9245-1-macpaul.lin@mediatek.com>
References: <20240926111449.9245-1-macpaul.lin@mediatek.com>
Message-ID: <20240926111449.9245-2-macpaul.lin@mediatek.com>

The infra-iommu node in mt8195.dtsi was triggering a CHECK_DTBS error due
to an excessively long 'interrupts' property. The error message was:

  infra-iommu at 10315000: interrupts: [[0, 795, 4, 0], [0, 796, 4, 0],
                     [0, 797, 4, 0], [0, 798, 4, 0], [0, 799, 4, 0]]
                     is too long

To address this issue, add "minItems: 1" and "maxItems: 5" constraints to
the 'interrupts' property in the DT binding schema. This change allows for
flexibility in the number of interrupts for new SoCs.
The purpose of these 5 interrupts is also added.

Fixes: bca28426805d ("dt-bindings: iommu: mediatek: Convert IOMMU to DT schema")
Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
---
 .../bindings/iommu/mediatek,iommu.yaml        | 25 ++++++++++++++++++-
 1 file changed, 24 insertions(+), 1 deletion(-)

Changes for v2:
 - commit message: re-formatting and add a description of adding 5 interrupts.
 - add 'description' and 'maxItems: 5' for 'interrupt' property of
   'mt8195-iommu-infra'
 - others keeps 'maxItems: 1'

diff --git a/Documentation/devicetree/bindings/iommu/mediatek,iommu.yaml b/Documentation/devicetree/bindings/iommu/mediatek,iommu.yaml
index ea6b0f5f24de..fdd2996d2a31 100644
--- a/Documentation/devicetree/bindings/iommu/mediatek,iommu.yaml
+++ b/Documentation/devicetree/bindings/iommu/mediatek,iommu.yaml
@@ -96,7 +96,8 @@ properties:
     maxItems: 1
 
   interrupts:
-    maxItems: 1
+    minItems: 1
+    maxItems: 5
 
   clocks:
     items:
@@ -210,6 +211,28 @@ allOf:
       required:
         - mediatek,larbs
 
+  - if:
+      properties:
+        compatible:
+          contains:
+            enum:
+              - mediatek,mt8195-iommu-infra
+
+    then:
+      properties:
+        interrupts:
+          description: |
+            The IOMMU of MT8195 has 5 banks: 0/1/2/3/4.
+            Each bank has a set of APB registers corresponding to the
+            normal world, protected world 1/2/3, and secure world, respectively.
+            Therefore, 5 interrupt numbers are needed.
+          maxItems: 5
+
+    else:
+      properties:
+        interrupts:
+          maxItems: 1
+
 additionalProperties: false
 
 examples:
-- 
2.45.2



From macpaul.lin at mediatek.com  Thu Sep 26 04:14:48 2024
From: macpaul.lin at mediatek.com (Macpaul Lin)
Date: Thu, 26 Sep 2024 19:14:48 +0800
Subject: [PATCH v2 4/5] arm64: dts: mt8195: Fix dtbs_check error for mutex node
In-Reply-To: <20240926111449.9245-1-macpaul.lin@mediatek.com>
References: <20240926111449.9245-1-macpaul.lin@mediatek.com>
Message-ID: <20240926111449.9245-4-macpaul.lin@mediatek.com>

The mutex node in mt8195.dtsi was triggering a dtbs_check error:
  mutex at 1c101000: 'clock-names', 'reg-names' do not match any of the
                  regexes: 'pinctrl-[0-9]+'

This seems no need by inspecting the DT schemas and other reference boards,
so drop 'clock-names' and 'reg-names' in mt8195.dtsi.

Fixes: 92d2c23dc269 ("arm64: dts: mt8195: add display node for vdosys1")
Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
---
 arch/arm64/boot/dts/mediatek/mt8195.dtsi | 2 --
 1 file changed, 2 deletions(-)

Changes for v2:
 - No change.

diff --git a/arch/arm64/boot/dts/mediatek/mt8195.dtsi b/arch/arm64/boot/dts/mediatek/mt8195.dtsi
index 2e1b41359b43..ade685ed2190 100644
--- a/arch/arm64/boot/dts/mediatek/mt8195.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8195.dtsi
@@ -3331,11 +3331,9 @@ &larb19 &larb21 &larb24 &larb25
 		mutex1: mutex at 1c101000 {
 			compatible = "mediatek,mt8195-disp-mutex";
 			reg = <0 0x1c101000 0 0x1000>;
-			reg-names = "vdo1_mutex";
 			interrupts = <GIC_SPI 494 IRQ_TYPE_LEVEL_HIGH 0>;
 			power-domains = <&spm MT8195_POWER_DOMAIN_VDOSYS1>;
 			clocks = <&vdosys1 CLK_VDO1_DISP_MUTEX>;
-			clock-names = "vdo1_mutex";
 			mediatek,gce-client-reg = <&gce0 SUBSYS_1c10XXXX 0x1000 0x1000>;
 			mediatek,gce-events = <CMDQ_EVENT_VDO1_STREAM_DONE_ENG_0>;
 		};
-- 
2.45.2



From andriy.shevchenko at linux.intel.com  Thu Sep 26 05:26:20 2024
From: andriy.shevchenko at linux.intel.com (Andy Shevchenko)
Date: Thu, 26 Sep 2024 15:26:20 +0300
Subject: [PATCH v8 2/3] regulator: Add devres version of
 of_regulator_get_optional()
In-Reply-To: <CAGXv+5Gf9+rc+vLcr-JFhO561G8dw38ksV3drat+DyCfWEVakQ@mail.gmail.com>
References: <20240925093807.1026949-1-wenst@chromium.org>
 <20240925093807.1026949-3-wenst@chromium.org>
 <ZvPscRdWlFPmtCyR@smile.fi.intel.com>
 <CAGXv+5Gf9+rc+vLcr-JFhO561G8dw38ksV3drat+DyCfWEVakQ@mail.gmail.com>
Message-ID: <ZvVS7ITg2t-RIh8C@smile.fi.intel.com>

On Thu, Sep 26, 2024 at 04:43:52PM +0800, Chen-Yu Tsai wrote:
> On Wed, Sep 25, 2024 at 6:56?PM Andy Shevchenko
> <andriy.shevchenko at linux.intel.com> wrote:
> > On Wed, Sep 25, 2024 at 05:38:05PM +0800, Chen-Yu Tsai wrote:

...

> > > +#if IS_ENABLED(CONFIG_OF)
> >
> > Do we really need this?
> 
> What's the point of going through devres_* stuff if we already know
> _of_regulator_get() is going to fail anyway?

With devm_add_action*() this will be other way around and there are plenty of
APIs done this way. The ifdeffery is simply ugly in the code.

> Also, _of_regulator_get() does not have a stub version for !CONFIG_OF.

So, what prevents us from adding it?

> > > +static struct regulator *_devm_of_regulator_get(struct device *dev, struct device_node *node,
> > > +                                             const char *id, int get_type)
> > > +{
> > > +     struct regulator **ptr, *regulator;
> > > +
> > > +     ptr = devres_alloc(devm_regulator_release, sizeof(*ptr), GFP_KERNEL);
> > > +     if (!ptr)
> > > +             return ERR_PTR(-ENOMEM);
> > > +
> > > +     regulator = _of_regulator_get(dev, node, id, get_type);
> > > +     if (!IS_ERR(regulator)) {
> > > +             *ptr = regulator;
> > > +             devres_add(dev, ptr);
> > > +     } else {
> > > +             devres_free(ptr);
> > > +     }
> > > +
> > > +     return regulator;
> >
> > Why not using devm_add_action() / devm_add_action_or_reset()
> > (whichever suits better here)?
> 
> Cargo cult from _devm_regulator_get() in this file. However since this is
> meant to share the same release function, both functions need to use the
> same mechanism.
> 
> I could also argue that this is not an action, but an allocation, and so
> devres_alloc() seems to make more sense.

It's rather matter of the naming of the devm_add_action*() APIs, but again,
we have plenty of APIs using it when it's allocation and not strictly speaking
an action.

> > > +}
> >
> > > +#endif

...

> > > +static inline struct regulator *__must_check devm_of_regulator_get_optional(struct device *dev,
> > > +                                                                         struct device_node *node,
> > > +                                                                         const char *id)
> >
> > I don't know the conventions here, but I find better to have it as
> >
> > static inline __must_check struct regulator *
> > devm_of_regulator_get_optional(struct device *dev, struct device_node *node, const char *id)
> >
> > Similar to other stubs and declarations.
> 
> I don't think there are any conventions. This file already has three types:
> 
> 1. Wrap the line with the function name on the second line
> 2. Wrap the arguments; wrapped arguments aligned to the left parenthesis.
> 3. Wrap the arguments; wrapped arguments aligned with aribtrary number of
>    tabs.
> 
> I prefer the way I have put them.

The way you put it despite relaxed limit is slightly harder to read.
I don't remember many headers that do so-o indented parameters. Besides
your way defers the burden of resplit to the future in case one more parameter
needs to be added which will excess the 100 limit.

Also __must_check is somehow misplaced in my opinion (talking from my
experience and this can be simply checked by grepping other headers).

That said, I prefer the way I suggested or something alike.

-- 
With Best Regards,
Andy Shevchenko




From sumit.garg at linaro.org  Thu Sep 26 06:52:59 2024
From: sumit.garg at linaro.org (Sumit Garg)
Date: Thu, 26 Sep 2024 19:22:59 +0530
Subject: [Linaro-mm-sig] Re: [RFC PATCH 0/4] Linaro restricted heap
In-Reply-To: <2f9a4abe-b2fc-4bc7-9926-1da2d38f5080@linaro.org>
References: <20240830070351.2855919-1-jens.wiklander@linaro.org>
 <dhxvyshwi4qmcmwceokhqey2ww4azjcs6qrpnkgivdj7tv5cke@r36srvvbof6q>
 <d8e0cb78-7cfb-42bf-b3a5-f765592e8dd4@ti.com> <mzur3odofwwrdqnystozjgf3qtvb73wqjm6g2vf5dfsqiehaxk@u67fcarhm6ge>
 <e967e382-6cca-4dee-8333-39892d532f71@gmail.com> <lk7a2xuqrctyywuanjwseh5lkcz3soatc2zf3kn3uwc43pdyic@edm3hcd2koas>
 <04caa788-19a6-4336-985c-4eb191c24438@amd.com> <2f9a4abe-b2fc-4bc7-9926-1da2d38f5080@linaro.org>
Message-ID: <CAFA6WYMd46quafJoGXjkCiPOKpYoDZdXwrNbG3QekyjB3_2FTA@mail.gmail.com>

[Resend in plain text format as my earlier message was rejected by
some mailing lists]

On Thu, 26 Sept 2024 at 19:17, Sumit Garg <sumit.garg at linaro.org> wrote:
>
> On 9/25/24 19:31, Christian K?nig wrote:
>
> Am 25.09.24 um 14:51 schrieb Dmitry Baryshkov:
>
> On Wed, Sep 25, 2024 at 10:51:15AM GMT, Christian K?nig wrote:
>
> Am 25.09.24 um 01:05 schrieb Dmitry Baryshkov:
>
> On Tue, Sep 24, 2024 at 01:13:18PM GMT, Andrew Davis wrote:
>
> On 9/23/24 1:33 AM, Dmitry Baryshkov wrote:
>
> Hi,
>
> On Fri, Aug 30, 2024 at 09:03:47AM GMT, Jens Wiklander wrote:
>
> Hi,
>
> This patch set is based on top of Yong Wu's restricted heap patch set [1].
> It's also a continuation on Olivier's Add dma-buf secure-heap patch set [2].
>
> The Linaro restricted heap uses genalloc in the kernel to manage the heap
> carvout. This is a difference from the Mediatek restricted heap which
> relies on the secure world to manage the carveout.
>
> I've tried to adress the comments on [2], but [1] introduces changes so I'm
> afraid I've had to skip some comments.
>
> I know I have raised the same question during LPC (in connection to
> Qualcomm's dma-heap implementation). Is there any reason why we are
> using generic heaps instead of allocating the dma-bufs on the device
> side?
>
> In your case you already have TEE device, you can use it to allocate and
> export dma-bufs, which then get imported by the V4L and DRM drivers.
>
> This goes to the heart of why we have dma-heaps in the first place.
> We don't want to burden userspace with having to figure out the right
> place to get a dma-buf for a given use-case on a given hardware.
> That would be very non-portable, and fail at the core purpose of
> a kernel: to abstract hardware specifics away.
>
> Unfortunately all proposals to use dma-buf heaps were moving in the
> described direction: let app select (somehow) from a platform- and
> vendor- specific list of dma-buf heaps. In the kernel we at least know
> the platform on which the system is running. Userspace generally doesn't
> (and shouldn't). As such, it seems better to me to keep the knowledge in
> the kernel and allow userspace do its job by calling into existing
> device drivers.
>
> The idea of letting the kernel fully abstract away the complexity of inter
> device data exchange is a completely failed design. There has been plenty of
> evidence for that over the years.
>
> Because of this in DMA-buf it's an intentional design decision that
> userspace and *not* the kernel decides where and what to allocate from.
>
> Hmm, ok.
>
> What the kernel should provide are the necessary information what type of
> memory a device can work with and if certain memory is accessible or not.
> This is the part which is unfortunately still not well defined nor
> implemented at the moment.
>
> Apart from that there are a whole bunch of intentional design decision which
> should prevent developers to move allocation decision inside the kernel. For
> example DMA-buf doesn't know what the content of the buffer is (except for
> it's total size) and which use cases a buffer will be used with.
>
> So the question if memory should be exposed through DMA-heaps or a driver
> specific allocator is not a question of abstraction, but rather one of the
> physical location and accessibility of the memory.
>
> If the memory is attached to any physical device, e.g. local memory on a
> dGPU, FPGA PCIe BAR, RDMA, camera internal memory etc, then expose the
> memory as device specific allocator.
>
> So, for embedded systems with unified memory all buffers (maybe except
> PCIe BARs) should come from DMA-BUF heaps, correct?
>
>
> From what I know that is correct, yes. Question is really if that will stay this way.
>
> Neural accelerators look a lot stripped down FPGAs these days and the benefit of local memory for GPUs is known for decades.
>
> Could be that designs with local specialized memory see a revival any time, who knows.
>
> If the memory is not physically attached to any device, but rather just
> memory attached to the CPU or a system wide memory controller then expose
> the memory as DMA-heap with specific requirements (e.g. certain sized pages,
> contiguous, restricted, encrypted, ...).
>
> Is encrypted / protected a part of the allocation contract or should it
> be enforced separately via a call to TEE / SCM / anything else?
>
>
> Well that is a really good question I can't fully answer either. From what I know now I would say it depends on the design.
>

IMHO, I think Dmitry's proposal to rather allow the TEE device to be
the allocator and exporter of DMA-bufs related to restricted memory
makes sense to me. Since it's really the TEE implementation (OP-TEE,
AMD-TEE, TS-TEE or future QTEE) which sets up the restrictions on a
particular piece of allocated memory. AFAIK, that happens after the
DMA-buf gets allocated and then user-space calls into TEE to set up
which media pipeline is going to access that particular DMA-buf. It
can also be a static contract depending on a particular platform
design.

As Jens noted in the other thread, we already manage shared memory
allocations (from a static carve-out or dynamically mapped) for
communications among Linux and TEE that were based on DMA-bufs earlier
but since we didn't required them to be shared with other devices, so
we rather switched to anonymous memory.

>From user-space perspective, it's cleaner to use TEE device IOCTLs for
DMA-buf allocations since it already knows which underlying TEE
implementation it's communicating with rather than first figuring out
which DMA heap to use for allocation and then communicating with TEE
implementation.

-Sumit


From christian.koenig at amd.com  Thu Sep 26 07:02:45 2024
From: christian.koenig at amd.com (=?UTF-8?Q?Christian_K=C3=B6nig?=)
Date: Thu, 26 Sep 2024 16:02:45 +0200
Subject: [Linaro-mm-sig] Re: [RFC PATCH 0/4] Linaro restricted heap
In-Reply-To: <CAFA6WYMd46quafJoGXjkCiPOKpYoDZdXwrNbG3QekyjB3_2FTA@mail.gmail.com>
References: <20240830070351.2855919-1-jens.wiklander@linaro.org>
 <dhxvyshwi4qmcmwceokhqey2ww4azjcs6qrpnkgivdj7tv5cke@r36srvvbof6q>
 <d8e0cb78-7cfb-42bf-b3a5-f765592e8dd4@ti.com>
 <mzur3odofwwrdqnystozjgf3qtvb73wqjm6g2vf5dfsqiehaxk@u67fcarhm6ge>
 <e967e382-6cca-4dee-8333-39892d532f71@gmail.com>
 <lk7a2xuqrctyywuanjwseh5lkcz3soatc2zf3kn3uwc43pdyic@edm3hcd2koas>
 <04caa788-19a6-4336-985c-4eb191c24438@amd.com>
 <2f9a4abe-b2fc-4bc7-9926-1da2d38f5080@linaro.org>
 <CAFA6WYMd46quafJoGXjkCiPOKpYoDZdXwrNbG3QekyjB3_2FTA@mail.gmail.com>
Message-ID: <2ab11399-ffa0-4940-a965-fb95a5f3b20e@amd.com>

Am 26.09.24 um 15:52 schrieb Sumit Garg:
> [Resend in plain text format as my earlier message was rejected by
> some mailing lists]
>
> On Thu, 26 Sept 2024 at 19:17, Sumit Garg <sumit.garg at linaro.org> wrote:
>> On 9/25/24 19:31, Christian K?nig wrote:
>>
>> Am 25.09.24 um 14:51 schrieb Dmitry Baryshkov:
>>
>> On Wed, Sep 25, 2024 at 10:51:15AM GMT, Christian K?nig wrote:
>>
>> Am 25.09.24 um 01:05 schrieb Dmitry Baryshkov:
>>
>> On Tue, Sep 24, 2024 at 01:13:18PM GMT, Andrew Davis wrote:
>>
>> On 9/23/24 1:33 AM, Dmitry Baryshkov wrote:
>>
>> Hi,
>>
>> On Fri, Aug 30, 2024 at 09:03:47AM GMT, Jens Wiklander wrote:
>>
>> Hi,
>>
>> This patch set is based on top of Yong Wu's restricted heap patch set [1].
>> It's also a continuation on Olivier's Add dma-buf secure-heap patch set [2].
>>
>> The Linaro restricted heap uses genalloc in the kernel to manage the heap
>> carvout. This is a difference from the Mediatek restricted heap which
>> relies on the secure world to manage the carveout.
>>
>> I've tried to adress the comments on [2], but [1] introduces changes so I'm
>> afraid I've had to skip some comments.
>>
>> I know I have raised the same question during LPC (in connection to
>> Qualcomm's dma-heap implementation). Is there any reason why we are
>> using generic heaps instead of allocating the dma-bufs on the device
>> side?
>>
>> In your case you already have TEE device, you can use it to allocate and
>> export dma-bufs, which then get imported by the V4L and DRM drivers.
>>
>> This goes to the heart of why we have dma-heaps in the first place.
>> We don't want to burden userspace with having to figure out the right
>> place to get a dma-buf for a given use-case on a given hardware.
>> That would be very non-portable, and fail at the core purpose of
>> a kernel: to abstract hardware specifics away.
>>
>> Unfortunately all proposals to use dma-buf heaps were moving in the
>> described direction: let app select (somehow) from a platform- and
>> vendor- specific list of dma-buf heaps. In the kernel we at least know
>> the platform on which the system is running. Userspace generally doesn't
>> (and shouldn't). As such, it seems better to me to keep the knowledge in
>> the kernel and allow userspace do its job by calling into existing
>> device drivers.
>>
>> The idea of letting the kernel fully abstract away the complexity of inter
>> device data exchange is a completely failed design. There has been plenty of
>> evidence for that over the years.
>>
>> Because of this in DMA-buf it's an intentional design decision that
>> userspace and *not* the kernel decides where and what to allocate from.
>>
>> Hmm, ok.
>>
>> What the kernel should provide are the necessary information what type of
>> memory a device can work with and if certain memory is accessible or not.
>> This is the part which is unfortunately still not well defined nor
>> implemented at the moment.
>>
>> Apart from that there are a whole bunch of intentional design decision which
>> should prevent developers to move allocation decision inside the kernel. For
>> example DMA-buf doesn't know what the content of the buffer is (except for
>> it's total size) and which use cases a buffer will be used with.
>>
>> So the question if memory should be exposed through DMA-heaps or a driver
>> specific allocator is not a question of abstraction, but rather one of the
>> physical location and accessibility of the memory.
>>
>> If the memory is attached to any physical device, e.g. local memory on a
>> dGPU, FPGA PCIe BAR, RDMA, camera internal memory etc, then expose the
>> memory as device specific allocator.
>>
>> So, for embedded systems with unified memory all buffers (maybe except
>> PCIe BARs) should come from DMA-BUF heaps, correct?
>>
>>
>>  From what I know that is correct, yes. Question is really if that will stay this way.
>>
>> Neural accelerators look a lot stripped down FPGAs these days and the benefit of local memory for GPUs is known for decades.
>>
>> Could be that designs with local specialized memory see a revival any time, who knows.
>>
>> If the memory is not physically attached to any device, but rather just
>> memory attached to the CPU or a system wide memory controller then expose
>> the memory as DMA-heap with specific requirements (e.g. certain sized pages,
>> contiguous, restricted, encrypted, ...).
>>
>> Is encrypted / protected a part of the allocation contract or should it
>> be enforced separately via a call to TEE / SCM / anything else?
>>
>>
>> Well that is a really good question I can't fully answer either. From what I know now I would say it depends on the design.
>>
> IMHO, I think Dmitry's proposal to rather allow the TEE device to be
> the allocator and exporter of DMA-bufs related to restricted memory
> makes sense to me. Since it's really the TEE implementation (OP-TEE,
> AMD-TEE, TS-TEE or future QTEE) which sets up the restrictions on a
> particular piece of allocated memory. AFAIK, that happens after the
> DMA-buf gets allocated and then user-space calls into TEE to set up
> which media pipeline is going to access that particular DMA-buf. It
> can also be a static contract depending on a particular platform
> design.
>
> As Jens noted in the other thread, we already manage shared memory
> allocations (from a static carve-out or dynamically mapped) for
> communications among Linux and TEE that were based on DMA-bufs earlier
> but since we didn't required them to be shared with other devices, so
> we rather switched to anonymous memory.
>
>  From user-space perspective, it's cleaner to use TEE device IOCTLs for
> DMA-buf allocations since it already knows which underlying TEE
> implementation it's communicating with rather than first figuring out
> which DMA heap to use for allocation and then communicating with TEE
> implementation.

+1

I'm not that deeply into the functionality the TEE device IOCTLs expose, 
so can't judge if what's said above is correct or not.

But in general building on top of existing infrastructure and 
information is a really strong argument for a design.

So from my 10 mile high point of view that sounds like the way to go.

Regards,
Christian.

>
> -Sumit



From daniel at makrotopia.org  Thu Sep 26 07:13:44 2024
From: daniel at makrotopia.org (Daniel Golle)
Date: Thu, 26 Sep 2024 15:13:44 +0100
Subject: [PATCH 1/3] wifi: mt76: mt7996: extend flexibility of
 mt7996_mcu_get_eeprom()
In-Reply-To: <20240926032440.15978-1-shayne.chen@mediatek.com>
References: <20240926032440.15978-1-shayne.chen@mediatek.com>
Message-ID: <ZvVsGKmHHX2q_HRx@makrotopia.org>

On Thu, Sep 26, 2024 at 11:24:38AM +0800, Shayne Chen wrote:
> Support passing customized buffer pointer and length to
> mt7996_mcu_get_eeprom().
> 
> This is the preparation for adding more variants support which needs to
> prefetch FEM module from efuse, and also fixes potential OOB issue when
> reading the last efuse block.
> 
> Co-developed-by: StanleyYP Wang <StanleyYP.Wang at mediatek.com>
> Signed-off-by: StanleyYP Wang <StanleyYP.Wang at mediatek.com>
> Signed-off-by: Shayne Chen <shayne.chen at mediatek.com>

Tested-by: Daniel Golle <daniel at makrotopia.org>

> ---
>  drivers/net/wireless/mediatek/mt76/mt7996/eeprom.c |  9 +++++++--
>  drivers/net/wireless/mediatek/mt76/mt7996/mcu.c    | 14 ++++++++++----
>  drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h |  2 +-
>  3 files changed, 18 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/eeprom.c b/drivers/net/wireless/mediatek/mt76/mt7996/eeprom.c
> index 4a8237118287..861aba68a725 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt7996/eeprom.c
> +++ b/drivers/net/wireless/mediatek/mt76/mt7996/eeprom.c
> @@ -86,8 +86,13 @@ static int mt7996_eeprom_load(struct mt7996_dev *dev)
>  		/* read eeprom data from efuse */
>  		block_num = DIV_ROUND_UP(MT7996_EEPROM_SIZE, eeprom_blk_size);
>  		for (i = 0; i < block_num; i++) {
> -			ret = mt7996_mcu_get_eeprom(dev, i * eeprom_blk_size);
> -			if (ret < 0)
> +			u32 len = eeprom_blk_size;
> +
> +			if (i == block_num - 1)
> +				len = MT7996_EEPROM_SIZE % eeprom_blk_size;
> +			ret = mt7996_mcu_get_eeprom(dev, i * eeprom_blk_size,
> +						    NULL, len);
> +			if (ret && ret != -EINVAL)
>  				return ret;
>  		}
>  	}
> diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c
> index 327337b31279..fa7832f625d7 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c
> +++ b/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c
> @@ -3548,7 +3548,7 @@ int mt7996_mcu_set_eeprom(struct mt7996_dev *dev)
>  				 &req, sizeof(req), true);
>  }
>  
> -int mt7996_mcu_get_eeprom(struct mt7996_dev *dev, u32 offset)
> +int mt7996_mcu_get_eeprom(struct mt7996_dev *dev, u32 offset, u8 *buf, u32 buf_len)
>  {
>  	struct {
>  		u8 _rsv[4];
> @@ -3577,15 +3577,21 @@ int mt7996_mcu_get_eeprom(struct mt7996_dev *dev, u32 offset)
>  	valid = le32_to_cpu(*(__le32 *)(skb->data + 16));
>  	if (valid) {
>  		u32 addr = le32_to_cpu(*(__le32 *)(skb->data + 12));
> -		u8 *buf = (u8 *)dev->mt76.eeprom.data + addr;
> +
> +		if (!buf)
> +			buf = (u8 *)dev->mt76.eeprom.data + addr;
> +		if (!buf_len || buf_len > MT7996_EEPROM_BLOCK_SIZE)
> +			buf_len = MT7996_EEPROM_BLOCK_SIZE;
>  
>  		skb_pull(skb, 48);
> -		memcpy(buf, skb->data, MT7996_EEPROM_BLOCK_SIZE);
> +		memcpy(buf, skb->data, buf_len);
> +	} else {
> +		ret = -EINVAL;
>  	}
>  
>  	dev_kfree_skb(skb);
>  
> -	return 0;
> +	return ret;
>  }
>  
>  int mt7996_mcu_get_eeprom_free_block(struct mt7996_dev *dev, u8 *block_num)
> diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h b/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h
> index ab8c9070630b..55aa5f6ab77d 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h
> +++ b/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h
> @@ -476,7 +476,7 @@ int mt7996_mcu_set_fixed_rate_ctrl(struct mt7996_dev *dev,
>  int mt7996_mcu_set_fixed_field(struct mt7996_dev *dev, struct ieee80211_vif *vif,
>  			       struct ieee80211_sta *sta, void *data, u32 field);
>  int mt7996_mcu_set_eeprom(struct mt7996_dev *dev);
> -int mt7996_mcu_get_eeprom(struct mt7996_dev *dev, u32 offset);
> +int mt7996_mcu_get_eeprom(struct mt7996_dev *dev, u32 offset, u8 *buf, u32 buf_len);
>  int mt7996_mcu_get_eeprom_free_block(struct mt7996_dev *dev, u8 *block_num);
>  int mt7996_mcu_get_chip_config(struct mt7996_dev *dev, u32 *cap);
>  int mt7996_mcu_set_ser(struct mt7996_dev *dev, u8 action, u8 set, u8 band);
> -- 
> 2.39.2
> 


From daniel at makrotopia.org  Thu Sep 26 07:14:06 2024
From: daniel at makrotopia.org (Daniel Golle)
Date: Thu, 26 Sep 2024 15:14:06 +0100
Subject: [PATCH 2/3] wifi: mt76: mt7996: add suuport for more variants
In-Reply-To: <20240926032440.15978-2-shayne.chen@mediatek.com>
References: <20240926032440.15978-1-shayne.chen@mediatek.com>
 <20240926032440.15978-2-shayne.chen@mediatek.com>
Message-ID: <ZvVsLmEY6Q2uDJzP@makrotopia.org>

On Thu, Sep 26, 2024 at 11:24:39AM +0800, Shayne Chen wrote:
> Current varaints supported:
> - mt7996 chipset: tri-band, 4+4+4 NSS, eFEM
> - mt7992 chipset: dual-band, 4+4 NSS, eFEM
> 
> This patch adds support for the following variants:
> - mt7996 chipset:
>   - tri-band, 4+4+4 NSS, iFEM
>   - tri-band, 2+3+3 NSS, eFEM
>   - tri-band, 2+3+3 NSS, iFEM
> - mt7992 chipset:
>   - dual-band, 4+4 NSS, iFEM
>   - dual-band, 4+4 NSS, with band0 iFEM and band1 eFEM
>   - dual-band, 2+3 NSS, eFEM
>   - dual-band, 2+3 NSS, iFEM
> 
> Co-developed-by: StanleyYP Wang <StanleyYP.Wang at mediatek.com>
> Signed-off-by: StanleyYP Wang <StanleyYP.Wang at mediatek.com>
> Signed-off-by: Shayne Chen <shayne.chen at mediatek.com>

Tested-by: Daniel Golle <daniel at makrotopia.org>

> ---
>  .../wireless/mediatek/mt76/mt7996/eeprom.c    | 206 +++++++++++++-----
>  .../wireless/mediatek/mt76/mt7996/eeprom.h    |   2 +
>  .../net/wireless/mediatek/mt76/mt7996/init.c  |  78 +++++++
>  .../net/wireless/mediatek/mt76/mt7996/mcu.c   |  16 +-
>  .../wireless/mediatek/mt76/mt7996/mt7996.h    |  46 +++-
>  .../net/wireless/mediatek/mt76/mt7996/regs.h  |   9 +
>  6 files changed, 289 insertions(+), 68 deletions(-)
> 
> diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/eeprom.c b/drivers/net/wireless/mediatek/mt76/mt7996/eeprom.c
> index 861aba68a725..da94751df020 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt7996/eeprom.c
> +++ b/drivers/net/wireless/mediatek/mt76/mt7996/eeprom.c
> @@ -25,17 +25,108 @@ static int mt7996_check_eeprom(struct mt7996_dev *dev)
>  static char *mt7996_eeprom_name(struct mt7996_dev *dev)
>  {
>  	switch (mt76_chip(&dev->mt76)) {
> -	case 0x7990:
> -		return MT7996_EEPROM_DEFAULT;
>  	case 0x7992:
> -		return MT7992_EEPROM_DEFAULT;
> +		switch (dev->var.type) {
> +		case MT7992_VAR_TYPE_23:
> +			if (dev->var.fem == MT7996_FEM_INT)
> +				return MT7992_EEPROM_DEFAULT_23_INT;
> +			return MT7992_EEPROM_DEFAULT_23;
> +		case MT7992_VAR_TYPE_44:
> +		default:
> +			if (dev->var.fem == MT7996_FEM_INT)
> +				return MT7992_EEPROM_DEFAULT_INT;
> +			if (dev->var.fem == MT7996_FEM_MIX)
> +				return MT7992_EEPROM_DEFAULT_MIX;
> +			return MT7992_EEPROM_DEFAULT;
> +		}
> +	case 0x7990:
> +	default:
> +		switch (dev->var.type) {
> +		case MT7996_VAR_TYPE_233:
> +			if (dev->var.fem == MT7996_FEM_INT)
> +				return MT7996_EEPROM_DEFAULT_233_INT;
> +			return MT7996_EEPROM_DEFAULT_233;
> +		case MT7996_VAR_TYPE_444:
> +		default:
> +			if (dev->var.fem == MT7996_FEM_INT)
> +				return MT7996_EEPROM_DEFAULT_INT;
> +			return MT7996_EEPROM_DEFAULT;
> +		}
> +	}
> +}
> +
> +static void
> +mt7996_eeprom_parse_stream(const u8 *eeprom, u8 band_idx, u8 *path,
> +			   u8 *rx_path, u8 *nss)
> +{
> +	switch (band_idx) {
> +	case MT_BAND1:
> +		*path = FIELD_GET(MT_EE_WIFI_CONF2_TX_PATH_BAND1,
> +				  eeprom[MT_EE_WIFI_CONF + 2]);
> +		*rx_path = FIELD_GET(MT_EE_WIFI_CONF3_RX_PATH_BAND1,
> +				     eeprom[MT_EE_WIFI_CONF + 3]);
> +		*nss = FIELD_GET(MT_EE_WIFI_CONF5_STREAM_NUM_BAND1,
> +				 eeprom[MT_EE_WIFI_CONF + 5]);
> +		break;
> +	case MT_BAND2:
> +		*path = FIELD_GET(MT_EE_WIFI_CONF2_TX_PATH_BAND2,
> +				  eeprom[MT_EE_WIFI_CONF + 2]);
> +		*rx_path = FIELD_GET(MT_EE_WIFI_CONF4_RX_PATH_BAND2,
> +				     eeprom[MT_EE_WIFI_CONF + 4]);
> +		*nss = FIELD_GET(MT_EE_WIFI_CONF5_STREAM_NUM_BAND2,
> +				 eeprom[MT_EE_WIFI_CONF + 5]);
> +		break;
>  	default:
> -		return MT7996_EEPROM_DEFAULT;
> +		*path = FIELD_GET(MT_EE_WIFI_CONF1_TX_PATH_BAND0,
> +				  eeprom[MT_EE_WIFI_CONF + 1]);
> +		*rx_path = FIELD_GET(MT_EE_WIFI_CONF3_RX_PATH_BAND0,
> +				     eeprom[MT_EE_WIFI_CONF + 3]);
> +		*nss = FIELD_GET(MT_EE_WIFI_CONF4_STREAM_NUM_BAND0,
> +				 eeprom[MT_EE_WIFI_CONF + 4]);
> +		break;
>  	}
>  }
>  
> +static bool mt7996_eeprom_variant_valid(struct mt7996_dev *dev, const u8 *def)
> +{
> +#define FEM_INT	0
> +#define FEM_EXT	3
> +	u8 *eeprom = dev->mt76.eeprom.data, fem[2];
> +	int i;
> +
> +	for (i = 0; i < 2; i++)
> +		fem[i] = u8_get_bits(eeprom[MT_EE_WIFI_CONF + 6 + i],
> +				     MT_EE_WIFI_PA_LNA_CONFIG);
> +
> +	if (dev->var.fem == MT7996_FEM_EXT &&
> +	    !(fem[0] == FEM_EXT && fem[1] == FEM_EXT))
> +		return false;
> +	else if (dev->var.fem == MT7996_FEM_INT &&
> +		 !(fem[0] == FEM_INT && fem[1] == FEM_INT))
> +		return false;
> +	else if (dev->var.fem == MT7996_FEM_MIX &&
> +		 !(fem[0] == FEM_INT && fem[1] == FEM_EXT))
> +		return false;
> +
> +	for (i = 0; i < __MT_MAX_BAND; i++) {
> +		u8 path, rx_path, nss;
> +		u8 def_path, def_rx_path, def_nss;
> +
> +		if (!dev->mt76.phys[i])
> +			continue;
> +
> +		mt7996_eeprom_parse_stream(eeprom, i, &path, &rx_path, &nss);
> +		mt7996_eeprom_parse_stream(def, i, &def_path, &def_rx_path,
> +					   &def_nss);
> +		if (path > def_path || rx_path > def_rx_path || nss > def_nss)
> +			return false;
> +	}
> +
> +	return true;
> +}
> +
>  static int
> -mt7996_eeprom_load_default(struct mt7996_dev *dev)
> +mt7996_eeprom_check_or_use_default(struct mt7996_dev *dev, bool use_default)
>  {
>  	u8 *eeprom = dev->mt76.eeprom.data;
>  	const struct firmware *fw = NULL;
> @@ -51,6 +142,10 @@ mt7996_eeprom_load_default(struct mt7996_dev *dev)
>  		goto out;
>  	}
>  
> +	if (!use_default && mt7996_eeprom_variant_valid(dev, fw->data))
> +		goto out;
> +
> +	dev_warn(dev->mt76.dev, "eeprom load fail, use default bin\n");
>  	memcpy(eeprom, fw->data, MT7996_EEPROM_SIZE);
>  	dev->flash_mode = true;
>  
> @@ -62,48 +157,68 @@ mt7996_eeprom_load_default(struct mt7996_dev *dev)
>  
>  static int mt7996_eeprom_load(struct mt7996_dev *dev)
>  {
> +	bool use_default = false;
>  	int ret;
>  
>  	ret = mt76_eeprom_init(&dev->mt76, MT7996_EEPROM_SIZE);
>  	if (ret < 0)
>  		return ret;
>  
> -	if (ret) {
> +	if (ret && !mt7996_check_eeprom(dev)) {
>  		dev->flash_mode = true;
> -	} else {
> -		u8 free_block_num;
> -		u32 block_num, i;
> +		goto out;
> +	}
> +
> +	if (!dev->flash_mode) {
>  		u32 eeprom_blk_size = MT7996_EEPROM_BLOCK_SIZE;
> +		u32 block_num = DIV_ROUND_UP(MT7996_EEPROM_SIZE, eeprom_blk_size);
> +		u8 free_block_num;
> +		int i;
>  
> +		memset(dev->mt76.eeprom.data, 0, MT7996_EEPROM_SIZE);
>  		ret = mt7996_mcu_get_eeprom_free_block(dev, &free_block_num);
>  		if (ret < 0)
>  			return ret;
>  
>  		/* efuse info isn't enough */
> -		if (free_block_num >= 59)
> -			return -EINVAL;
> +		if (free_block_num >= 59) {
> +			use_default = true;
> +			goto out;
> +		}
> +
> +		/* check if eeprom data from fw is valid */
> +		if (mt7996_mcu_get_eeprom(dev, 0, NULL, 0) ||
> +		    mt7996_check_eeprom(dev)) {
> +			use_default = true;
> +			goto out;
> +		}
>  
> -		/* read eeprom data from efuse */
> -		block_num = DIV_ROUND_UP(MT7996_EEPROM_SIZE, eeprom_blk_size);
> -		for (i = 0; i < block_num; i++) {
> +		/* read eeprom data from fw */
> +		for (i = 1; i < block_num; i++) {
>  			u32 len = eeprom_blk_size;
>  
>  			if (i == block_num - 1)
>  				len = MT7996_EEPROM_SIZE % eeprom_blk_size;
>  			ret = mt7996_mcu_get_eeprom(dev, i * eeprom_blk_size,
>  						    NULL, len);
> -			if (ret && ret != -EINVAL)
> -				return ret;
> +			if (ret && ret != -EINVAL) {
> +				use_default = true;
> +				goto out;
> +			}
>  		}
>  	}
>  
> -	return mt7996_check_eeprom(dev);
> +out:
> +	return mt7996_eeprom_check_or_use_default(dev, use_default);
>  }
>  
> -static int mt7996_eeprom_parse_efuse_hw_cap(struct mt7996_dev *dev)
> +static int mt7996_eeprom_parse_efuse_hw_cap(struct mt7996_phy *phy,
> +					    u8 *path, u8 *rx_path, u8 *nss)
>  {
>  #define MODE_HE_ONLY		BIT(0)
>  #define WTBL_SIZE_GROUP		GENMASK(31, 28)
> +#define STREAM_CAP(_offs)	((cap & (0x7 << (_offs))) >> (_offs))
> +	struct mt7996_dev *dev = phy->dev;
>  	u32 cap = 0;
>  	int ret;
>  
> @@ -112,13 +227,17 @@ static int mt7996_eeprom_parse_efuse_hw_cap(struct mt7996_dev *dev)
>  		return ret;
>  
>  	if (cap) {
> +		u8 band_offs = phy->mt76->band_idx * 3;
> +
>  		dev->has_eht = !(cap & MODE_HE_ONLY);
>  		dev->wtbl_size_group = u32_get_bits(cap, WTBL_SIZE_GROUP);
> +		*nss = min_t(u8, *nss, STREAM_CAP(1 + band_offs));
> +		*path = min_t(u8, *path, STREAM_CAP(10 + band_offs));
> +		*rx_path = min_t(u8, *rx_path, STREAM_CAP(19 + band_offs));
>  	}
>  
> -	if (dev->wtbl_size_group < 2 || dev->wtbl_size_group > 4 ||
> -	    is_mt7992(&dev->mt76))
> -		dev->wtbl_size_group = 2; /* set default */
> +	if (dev->wtbl_size_group < 2 || dev->wtbl_size_group > 4)
> +		dev->wtbl_size_group = is_mt7996(&dev->mt76) ? 4 : 2;
>  
>  	return 0;
>  }
> @@ -168,32 +287,10 @@ int mt7996_eeprom_parse_hw_cap(struct mt7996_dev *dev, struct mt7996_phy *phy)
>  	int max_path = 5, max_nss = 4;
>  	int ret;
>  
> -	switch (band_idx) {
> -	case MT_BAND1:
> -		path = FIELD_GET(MT_EE_WIFI_CONF2_TX_PATH_BAND1,
> -				 eeprom[MT_EE_WIFI_CONF + 2]);
> -		rx_path = FIELD_GET(MT_EE_WIFI_CONF3_RX_PATH_BAND1,
> -				    eeprom[MT_EE_WIFI_CONF + 3]);
> -		nss = FIELD_GET(MT_EE_WIFI_CONF5_STREAM_NUM_BAND1,
> -				eeprom[MT_EE_WIFI_CONF + 5]);
> -		break;
> -	case MT_BAND2:
> -		path = FIELD_GET(MT_EE_WIFI_CONF2_TX_PATH_BAND2,
> -				 eeprom[MT_EE_WIFI_CONF + 2]);
> -		rx_path = FIELD_GET(MT_EE_WIFI_CONF4_RX_PATH_BAND2,
> -				    eeprom[MT_EE_WIFI_CONF + 4]);
> -		nss = FIELD_GET(MT_EE_WIFI_CONF5_STREAM_NUM_BAND2,
> -				eeprom[MT_EE_WIFI_CONF + 5]);
> -		break;
> -	default:
> -		path = FIELD_GET(MT_EE_WIFI_CONF1_TX_PATH_BAND0,
> -				 eeprom[MT_EE_WIFI_CONF + 1]);
> -		rx_path = FIELD_GET(MT_EE_WIFI_CONF3_RX_PATH_BAND0,
> -				    eeprom[MT_EE_WIFI_CONF + 3]);
> -		nss = FIELD_GET(MT_EE_WIFI_CONF4_STREAM_NUM_BAND0,
> -				eeprom[MT_EE_WIFI_CONF + 4]);
> -		break;
> -	}
> +	mt7996_eeprom_parse_stream(eeprom, band_idx, &path, &rx_path, &nss);
> +	ret = mt7996_eeprom_parse_efuse_hw_cap(phy, &path, &rx_path, &nss);
> +	if (ret)
> +		return ret;
>  
>  	if (!path || path > max_path)
>  		path = max_path;
> @@ -213,10 +310,6 @@ int mt7996_eeprom_parse_hw_cap(struct mt7996_dev *dev, struct mt7996_phy *phy)
>  		dev->chainshift[band_idx + 1] = dev->chainshift[band_idx] +
>  						hweight16(mphy->chainmask);
>  
> -	ret = mt7996_eeprom_parse_efuse_hw_cap(dev);
> -	if (ret)
> -		return ret;
> -
>  	return mt7996_eeprom_parse_band_config(phy);
>  }
>  
> @@ -225,15 +318,8 @@ int mt7996_eeprom_init(struct mt7996_dev *dev)
>  	int ret;
>  
>  	ret = mt7996_eeprom_load(dev);
> -	if (ret < 0) {
> -		if (ret != -EINVAL)
> -			return ret;
> -
> -		dev_warn(dev->mt76.dev, "eeprom load fail, use default bin\n");
> -		ret = mt7996_eeprom_load_default(dev);
> -		if (ret)
> -			return ret;
> -	}
> +	if (ret < 0)
> +		return ret;
>  
>  	ret = mt7996_eeprom_parse_hw_cap(dev, &dev->phy);
>  	if (ret < 0)
> diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/eeprom.h b/drivers/net/wireless/mediatek/mt76/mt7996/eeprom.h
> index 412d6e2f8014..7a771ca2434c 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt7996/eeprom.h
> +++ b/drivers/net/wireless/mediatek/mt76/mt7996/eeprom.h
> @@ -40,6 +40,8 @@ enum mt7996_eeprom_field {
>  #define MT_EE_WIFI_CONF5_STREAM_NUM_BAND1	GENMASK(2, 0)
>  #define MT_EE_WIFI_CONF5_STREAM_NUM_BAND2	GENMASK(5, 3)
>  
> +#define MT_EE_WIFI_PA_LNA_CONFIG		GENMASK(1, 0)
> +
>  #define MT_EE_RATE_DELTA_MASK			GENMASK(5, 0)
>  #define MT_EE_RATE_DELTA_SIGN			BIT(6)
>  #define MT_EE_RATE_DELTA_EN			BIT(7)
> diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/init.c b/drivers/net/wireless/mediatek/mt76/mt7996/init.c
> index 5e96973226bb..bf70799b4bc4 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt7996/init.c
> +++ b/drivers/net/wireless/mediatek/mt76/mt7996/init.c
> @@ -884,6 +884,76 @@ static void mt7996_wed_rro_work(struct work_struct *work)
>  #endif
>  }
>  
> +static int mt7996_variant_type_init(struct mt7996_dev *dev)
> +{
> +	u32 val = mt76_rr(dev, MT_PAD_GPIO);
> +	u8 var_type;
> +
> +	switch (mt76_chip(&dev->mt76)) {
> +	case 0x7990:
> +		if (val & MT_PAD_GPIO_2ADIE_TBTC)
> +			var_type = MT7996_VAR_TYPE_233;
> +		else
> +			var_type = MT7996_VAR_TYPE_444;
> +		break;
> +	case 0x7992:
> +		if (val & MT_PAD_GPIO_ADIE_SINGLE)
> +			var_type = MT7992_VAR_TYPE_23;
> +		else if (u32_get_bits(val, MT_PAD_GPIO_ADIE_COMB_7992))
> +			var_type = MT7992_VAR_TYPE_44;
> +		else
> +			return -EINVAL;
> +		break;
> +	default:
> +		return -EINVAL;
> +	}
> +
> +	dev->var.type = var_type;
> +	return 0;
> +}
> +
> +static int mt7996_variant_fem_init(struct mt7996_dev *dev)
> +{
> +#define MT7976C_EFUSE_OFFSET	0x470
> +	u8 buf[MT7996_EEPROM_BLOCK_SIZE], idx, adie_idx, adie_comb;
> +	u32 regval, val = mt76_rr(dev, MT_PAD_GPIO);
> +	u16 adie_id, adie_ver;
> +	bool is_7976c;
> +	int ret;
> +
> +	if (is_mt7992(&dev->mt76)) {
> +		adie_idx = (val & MT_PAD_GPIO_ADIE_SINGLE) ? 0 : 1;
> +		adie_comb = u32_get_bits(val, MT_PAD_GPIO_ADIE_COMB_7992);
> +	} else {
> +		adie_idx = 0;
> +		adie_comb = u32_get_bits(val, MT_PAD_GPIO_ADIE_COMB);
> +	}
> +
> +	ret = mt7996_mcu_rf_regval(dev, MT_ADIE_CHIP_ID(adie_idx), &regval, false);
> +	if (ret)
> +		return ret;
> +
> +	ret = mt7996_mcu_get_eeprom(dev, MT7976C_EFUSE_OFFSET, buf, sizeof(buf));
> +	if (ret && ret != -EINVAL)
> +		return ret;
> +
> +	adie_ver = u32_get_bits(regval, MT_ADIE_VERSION_MASK);
> +	idx = MT7976C_EFUSE_OFFSET % MT7996_EEPROM_BLOCK_SIZE;
> +	is_7976c = adie_ver == 0x8a10 || adie_ver == 0x8b00 ||
> +		   adie_ver == 0x8c10 || buf[idx] == 0xc;
> +
> +	adie_id = u32_get_bits(regval, MT_ADIE_CHIP_ID_MASK);
> +	if (adie_id == 0x7975 || adie_id == 0x7979 ||
> +	    (adie_id == 0x7976 && is_7976c))
> +		dev->var.fem = MT7996_FEM_INT;
> +	else if (adie_id == 0x7977 && adie_comb == 1)
> +		dev->var.fem = MT7996_FEM_MIX;
> +	else
> +		dev->var.fem = MT7996_FEM_EXT;
> +
> +	return 0;
> +}
> +
>  static int mt7996_init_hardware(struct mt7996_dev *dev)
>  {
>  	int ret, idx;
> @@ -899,6 +969,10 @@ static int mt7996_init_hardware(struct mt7996_dev *dev)
>  	INIT_LIST_HEAD(&dev->wed_rro.poll_list);
>  	spin_lock_init(&dev->wed_rro.lock);
>  
> +	ret = mt7996_variant_type_init(dev);
> +	if (ret)
> +		return ret;
> +
>  	ret = mt7996_dma_init(dev);
>  	if (ret)
>  		return ret;
> @@ -913,6 +987,10 @@ static int mt7996_init_hardware(struct mt7996_dev *dev)
>  	if (ret)
>  		return ret;
>  
> +	ret = mt7996_variant_fem_init(dev);
> +	if (ret)
> +		return ret;
> +
>  	ret = mt7996_eeprom_init(dev);
>  	if (ret < 0)
>  		return ret;
> diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c
> index fa7832f625d7..83bbdece45df 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c
> +++ b/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c
> @@ -14,11 +14,23 @@
>  	char *_fw;						\
>  	switch (mt76_chip(&(_dev)->mt76)) {			\
>  	case 0x7992:						\
> -		_fw = MT7992_##name;				\
> +		switch ((_dev)->var.type) {			\
> +		case MT7992_VAR_TYPE_23:			\
> +			_fw = MT7992_##name##_23;		\
> +			break;					\
> +		default:					\
> +			_fw = MT7992_##name;			\
> +		}						\
>  		break;						\
>  	case 0x7990:						\
>  	default:						\
> -		_fw = MT7996_##name;				\
> +		switch ((_dev)->var.type) {			\
> +		case MT7996_VAR_TYPE_233:			\
> +			_fw = MT7996_##name##_233;		\
> +			break;					\
> +		default:					\
> +			_fw = MT7996_##name;			\
> +		}						\
>  		break;						\
>  	}							\
>  	_fw;							\
> diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h b/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h
> index 55aa5f6ab77d..3f3278f43c79 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h
> +++ b/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h
> @@ -34,13 +34,32 @@
>  #define MT7996_FIRMWARE_DSP		"mediatek/mt7996/mt7996_dsp.bin"
>  #define MT7996_ROM_PATCH		"mediatek/mt7996/mt7996_rom_patch.bin"
>  
> +#define MT7996_FIRMWARE_WA_233		"mediatek/mt7996/mt7996_wa_233.bin"
> +#define MT7996_FIRMWARE_WM_233		"mediatek/mt7996/mt7996_wm_233.bin"
> +#define MT7996_FIRMWARE_DSP_233		MT7996_FIRMWARE_DSP
> +#define MT7996_ROM_PATCH_233		"mediatek/mt7996/mt7996_rom_patch_233.bin"
> +
>  #define MT7992_FIRMWARE_WA		"mediatek/mt7996/mt7992_wa.bin"
>  #define MT7992_FIRMWARE_WM		"mediatek/mt7996/mt7992_wm.bin"
>  #define MT7992_FIRMWARE_DSP		"mediatek/mt7996/mt7992_dsp.bin"
>  #define MT7992_ROM_PATCH		"mediatek/mt7996/mt7992_rom_patch.bin"
>  
> +#define MT7992_FIRMWARE_WA_23		"mediatek/mt7996/mt7992_wa_23.bin"
> +#define MT7992_FIRMWARE_WM_23		"mediatek/mt7996/mt7992_wm_23.bin"
> +#define MT7992_FIRMWARE_DSP_23		"mediatek/mt7996/mt7992_dsp_23.bin"
> +#define MT7992_ROM_PATCH_23		"mediatek/mt7996/mt7992_rom_patch_23.bin"
> +
>  #define MT7996_EEPROM_DEFAULT		"mediatek/mt7996/mt7996_eeprom.bin"
> +#define MT7996_EEPROM_DEFAULT_INT	"mediatek/mt7996/mt7996_eeprom_2i5i6i.bin"
> +#define MT7996_EEPROM_DEFAULT_233	"mediatek/mt7996/mt7996_eeprom_233.bin"
> +#define MT7996_EEPROM_DEFAULT_233_INT	"mediatek/mt7996/mt7996_eeprom_233_2i5i6i.bin"
> +
>  #define MT7992_EEPROM_DEFAULT		"mediatek/mt7996/mt7992_eeprom.bin"
> +#define MT7992_EEPROM_DEFAULT_INT	"mediatek/mt7996/mt7992_eeprom_2i5i.bin"
> +#define MT7992_EEPROM_DEFAULT_MIX	"mediatek/mt7996/mt7992_eeprom_2i5e.bin"
> +#define MT7992_EEPROM_DEFAULT_23	"mediatek/mt7996/mt7992_eeprom_23.bin"
> +#define MT7992_EEPROM_DEFAULT_23_INT	"mediatek/mt7996/mt7992_eeprom_23_2i5i.bin"
> +
>  #define MT7996_EEPROM_SIZE		7680
>  #define MT7996_EEPROM_BLOCK_SIZE	16
>  #define MT7996_TOKEN_SIZE		16384
> @@ -95,6 +114,22 @@ enum mt7996_ram_type {
>  	MT7996_RAM_TYPE_DSP,
>  };
>  
> +enum mt7996_var_type {
> +	MT7996_VAR_TYPE_444,
> +	MT7996_VAR_TYPE_233,
> +};
> +
> +enum mt7992_var_type {
> +	MT7992_VAR_TYPE_44,
> +	MT7992_VAR_TYPE_23,
> +};
> +
> +enum mt7996_fem_type {
> +	MT7996_FEM_EXT,
> +	MT7996_FEM_INT,
> +	MT7996_FEM_MIX,
> +};
> +
>  enum mt7996_txq_id {
>  	MT7996_TXQ_FWDL = 16,
>  	MT7996_TXQ_MCU_WM,
> @@ -329,6 +364,10 @@ struct mt7996_dev {
>  	spinlock_t reg_lock;
>  
>  	u8 wtbl_size_group;
> +	struct {
> +		u8 type:4;
> +		u8 fem:4;
> +	} var;
>  };
>  
>  enum {
> @@ -405,12 +444,7 @@ mt7996_band_valid(struct mt7996_dev *dev, u8 band)
>  	if (is_mt7992(&dev->mt76))
>  		return band <= MT_BAND1;
>  
> -	/* tri-band support */
> -	if (band <= MT_BAND2 &&
> -	    mt76_get_field(dev, MT_PAD_GPIO, MT_PAD_GPIO_ADIE_COMB) <= 1)
> -		return true;
> -
> -	return band == MT_BAND0 || band == MT_BAND2;
> +	return band <= MT_BAND2;
>  }
>  
>  extern const struct ieee80211_ops mt7996_ops;
> diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/regs.h b/drivers/net/wireless/mediatek/mt76/mt7996/regs.h
> index 47b429d8bfbe..06e307b5b02e 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt7996/regs.h
> +++ b/drivers/net/wireless/mediatek/mt76/mt7996/regs.h
> @@ -660,8 +660,17 @@ enum offs_rev {
>  #define MT_TOP_MISC				MT_TOP(0xf0)
>  #define MT_TOP_MISC_FW_STATE			GENMASK(2, 0)
>  
> +/* ADIE */
> +#define MT_ADIE_CHIP_ID(_idx)			(0x0f00002c + ((_idx) << 28))
> +#define MT_ADIE_VERSION_MASK			GENMASK(15, 0)
> +#define MT_ADIE_CHIP_ID_MASK			GENMASK(31, 16)
> +
>  #define MT_PAD_GPIO				0x700056f0
>  #define MT_PAD_GPIO_ADIE_COMB			GENMASK(16, 15)
> +#define MT_PAD_GPIO_2ADIE_TBTC			BIT(19)
> +/* for mt7992 */
> +#define MT_PAD_GPIO_ADIE_COMB_7992		GENMASK(17, 16)
> +#define MT_PAD_GPIO_ADIE_SINGLE			BIT(15)
>  
>  #define MT_HW_REV				0x70010204
>  #define MT_HW_REV1				0x8a00
> -- 
> 2.39.2
> 


From daniel at makrotopia.org  Thu Sep 26 07:14:22 2024
From: daniel at makrotopia.org (Daniel Golle)
Date: Thu, 26 Sep 2024 15:14:22 +0100
Subject: [PATCH 3/3] wifi: mt76: mt7996: set correct background radar
 capability
In-Reply-To: <20240926032440.15978-3-shayne.chen@mediatek.com>
References: <20240926032440.15978-1-shayne.chen@mediatek.com>
 <20240926032440.15978-3-shayne.chen@mediatek.com>
Message-ID: <ZvVsPqwRdL5GltTX@makrotopia.org>

On Thu, Sep 26, 2024 at 11:24:40AM +0800, Shayne Chen wrote:
> From: StanleyYP Wang <StanleyYP.Wang at mediatek.com>
> 
> Some of the variants do not support background radar, so add a helper
> to report background radar capability.
> 
> Signed-off-by: StanleyYP Wang <StanleyYP.Wang at mediatek.com>
> Signed-off-by: Shayne Chen <shayne.chen at mediatek.com>

Tested-by: Daniel Golle <daniel at makrotopia.org>

> ---
>  .../net/wireless/mediatek/mt76/mt7996/init.c  |  7 ++++---
>  .../wireless/mediatek/mt76/mt7996/mt7996.h    | 19 +++++++++++++++++++
>  2 files changed, 23 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/init.c b/drivers/net/wireless/mediatek/mt76/mt7996/init.c
> index bf70799b4bc4..f6a010b61a8a 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt7996/init.c
> +++ b/drivers/net/wireless/mediatek/mt76/mt7996/init.c
> @@ -390,9 +390,10 @@ mt7996_init_wiphy(struct ieee80211_hw *hw, struct mtk_wed_device *wed)
>  	wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_CAN_REPLACE_PTK0);
>  	wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_MU_MIMO_AIR_SNIFFER);
>  
> -	if (!mdev->dev->of_node ||
> -	    !of_property_read_bool(mdev->dev->of_node,
> -				   "mediatek,disable-radar-background"))
> +	if (mt7996_has_background_radar(phy->dev) &&
> +	    (!mdev->dev->of_node ||
> +	     !of_property_read_bool(mdev->dev->of_node,
> +				    "mediatek,disable-radar-background")))
>  		wiphy_ext_feature_set(wiphy,
>  				      NL80211_EXT_FEATURE_RADAR_BACKGROUND);
>  
> diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h b/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h
> index 3f3278f43c79..9aec97dd81d9 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h
> +++ b/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h
> @@ -447,6 +447,25 @@ mt7996_band_valid(struct mt7996_dev *dev, u8 band)
>  	return band <= MT_BAND2;
>  }
>  
> +static inline bool
> +mt7996_has_background_radar(struct mt7996_dev *dev)
> +{
> +	switch (mt76_chip(&dev->mt76)) {
> +	case 0x7990:
> +		if (dev->var.type == MT7996_VAR_TYPE_233)
> +			return false;
> +		break;
> +	case 0x7992:
> +		if (dev->var.type == MT7992_VAR_TYPE_23)
> +			return false;
> +		break;
> +	default:
> +		return false;
> +	}
> +
> +	return true;
> +}
> +
>  extern const struct ieee80211_ops mt7996_ops;
>  extern struct pci_driver mt7996_pci_driver;
>  extern struct pci_driver mt7996_hif_driver;
> -- 
> 2.39.2
> 


From afd at ti.com  Thu Sep 26 07:56:11 2024
From: afd at ti.com (Andrew Davis)
Date: Thu, 26 Sep 2024 09:56:11 -0500
Subject: [Linaro-mm-sig] Re: [RFC PATCH 0/4] Linaro restricted heap
In-Reply-To: <e967e382-6cca-4dee-8333-39892d532f71@gmail.com>
References: <20240830070351.2855919-1-jens.wiklander@linaro.org>
 <dhxvyshwi4qmcmwceokhqey2ww4azjcs6qrpnkgivdj7tv5cke@r36srvvbof6q>
 <d8e0cb78-7cfb-42bf-b3a5-f765592e8dd4@ti.com>
 <mzur3odofwwrdqnystozjgf3qtvb73wqjm6g2vf5dfsqiehaxk@u67fcarhm6ge>
 <e967e382-6cca-4dee-8333-39892d532f71@gmail.com>
Message-ID: <cba2c216-de99-4f54-8762-ee39018d1b43@ti.com>

On 9/25/24 3:51 AM, Christian K?nig wrote:
> Am 25.09.24 um 01:05 schrieb Dmitry Baryshkov:
>> On Tue, Sep 24, 2024 at 01:13:18PM GMT, Andrew Davis wrote:
>>> On 9/23/24 1:33 AM, Dmitry Baryshkov wrote:
>>>> Hi,
>>>>
>>>> On Fri, Aug 30, 2024 at 09:03:47AM GMT, Jens Wiklander wrote:
>>>>> Hi,
>>>>>
>>>>> This patch set is based on top of Yong Wu's restricted heap patch set[1].
>>>>> It's also a continuation on Olivier's Add dma-buf secure-heap patch set [2].
>>>>>
>>>>> The Linaro restricted heap uses genalloc in the kernel to manage the heap
>>>>> carvout. This is a difference from the Mediatek restricted heap which
>>>>> relies on the secure world to manage the carveout.
>>>>>
>>>>> I've tried to adress the comments on [2], but [1] introduces changes so I'm
>>>>> afraid I've had to skip some comments.
>>>> I know I have raised the same question during LPC (in connection to
>>>> Qualcomm's dma-heap implementation). Is there any reason why we are
>>>> using generic heaps instead of allocating the dma-bufs on the device
>>>> side?
>>>>
>>>> In your case you already have TEE device, you can use it to allocate and
>>>> export dma-bufs, which then get imported by the V4L and DRM drivers.
>>>>
>>> This goes to the heart of why we have dma-heaps in the first place.
>>> We don't want to burden userspace with having to figure out the right
>>> place to get a dma-buf for a given use-case on a given hardware.
>>> That would be very non-portable, and fail at the core purpose of
>>> a kernel: to abstract hardware specifics away.
>> Unfortunately all proposals to use dma-buf heaps were moving in the
>> described direction: let app select (somehow) from a platform- and
>> vendor- specific list of dma-buf heaps. In the kernel we at least know
>> the platform on which the system is running. Userspace generally doesn't
>> (and shouldn't). As such, it seems better to me to keep the knowledge in
>> the kernel and allow userspace do its job by calling into existing
>> device drivers.
> 
> The idea of letting the kernel fully abstract away the complexity of inter device data exchange is a completely failed design. There has been plentyof evidence for that over the years.
> 

And forcing userspace to figure it all out is also an unsolved problem
after all these years. Neither side wants to get their hands dirty, but
it is fundamentally a kernel problem to handle these device complexities.

> Because of this in DMA-buf it's an intentional design decision that userspace and *not* the kernel decides where and what to allocate from.
> 

DMA-buf attach and map stages are split from each other, to me this indicates
the design intended the actual backing allocation to be chosen based on attached
devices at map time, not at allocation time. Meaning userspace doesn't really get
to choose the backing storage.

> What the kernel should provide are the necessary information what type ofmemory a device can work with and if certain memory is accessible or not. This is the part which is unfortunately still not well defined nor implemented at the moment.
> 

This sounds like the kernel provided "hints" solution. Given enough hints,
the correct Heap would become obvious, and so a complete hint based solution
is one step away from just having the kernel simply make that one correct
selection for you.

> Apart from that there are a whole bunch of intentional design decision which should prevent developers to move allocation decision inside the kernel. For example DMA-buf doesn't know what the content of the buffer is (except for it's total size) and which use cases a buffer will be used with.
> 
> So the question if memory should be exposed through DMA-heaps or a driverspecific allocator is not a question of abstraction, but rather one of thephysical location and accessibility of the memory.
> 
> If the memory is attached to any physical device, e.g. local memory on a dGPU, FPGA PCIe BAR, RDMA, camera internal memory etc, then expose the memory as device specific allocator.
> 
> If the memory is not physically attached to any device, but rather just memory attached to the CPU or a system wide memory controller then expose the memory as DMA-heap with specific requirements (e.g. certain sized pages, contiguous, restricted, encrypted, ...).
> 

Agree with the first part, some exporters are just giving out CPU memory
but with some specific constraint (some subsystems get a pass like V4L2
as it came out before DMA-heaps, but no reason to keep making new allocators
for each and every subsystem just because they may have some memory
constraint on the consumption side).

>>> Worse, the actual interface for dma-buf exporting changes from
>>> framework to framework (getting a dma-buf from DRM is different
>>> than V4L, and there would be yet another API for TEE, etc..)
>> But if the app is working with the particular subsystem, then it already
>> talks its language. Allocating a dma-buf is just another part of the
>> interface, which the app already has to support.
> 
> Correct, yes.
> 

Importing the buffer to a given subsystem with be subsystem specific yes,
but I don't see how that means allocating the buffer should have to be too.
For instance I need one of these new "restricted" heaps to pass to V4L2,
I'll need to know how to use V4L2 sure, but why should I have to deal with
the TEE subsystem to get that buffer as proposed? The common allocator
could have handled this.

>>> Most subsystem don't need an allocator, they work just fine
>>> simply being only dma-bufs importers. Recent example being the
>>> IIO subsystem[0], for which some early posting included an
>>> allocator, but in the end, all that was needed was to consume
>>> buffers.
>>>
>>> For devices that don't actually contain memory there is no
>>> reason to be an exporter. What most want is just to consume
>>> normal system memory. Or system memory with some constraints
>>> (e.g. contiguous, coherent, restricted, etc..).
>> ... secure, accessible only to the camera and video encoder, ... or
>> accessible only to the video decoder and the display unit. Who specifies
>> those restrictions? Can we express them in a platform-neutral way?
> 
> I once create a prototype for letting kernel drivers expose hints to which DMA-heap they want to work with.
> 
> The problem is that there are tons of different use cases and you need touse specific allocations for specific use cases.
> 
>>>> I have a feeling (I might be completely wrong here) that by using
>>>> generic dma-buf heaps we can easily end up in a situation when the
>>>> userspace depends heavily on the actual platform being used (to map the
>>>> platform to heap names). I think we should instead depend on the
>>>> existing devices (e.g. if there is a TEE device, use an IOCTL to
>>>> allocate secured DMA BUF from it, otherwise check for QTEE device,
>>>> otherwise check for some other vendor device).
>>>>
>>>> The mental experiment to check if the API is correct is really simple:
>>>> Can you use exactly the same rootfs on several devices without
>>>> any additional tuning (e.g. your QEMU, HiKey, a Mediatek board, Qualcomm
>>>> laptop, etc)?
>>>>
>>> This is a great north star to follow. And exactly the reason we should
>>> *not* be exposing device specific constraints to userspace. The constrains
>>> change based on the platform. So a userspace would have to also pick
>>> a different set of constraints based on each platform.
>> Great, I totally agree here.
> 
> That sounds reasonable, but depends on the restriction.
> 
> For example a lot of GPUs can work with any imported memory as long as itis DMA accessible for them, but they can scanout a picture to display on amonitor only from their local memory.
> 

And in this case, attaching the DMA-buf to that monitor for scanout
should fail at attach time, if we had a way to properly communicate
constraints between importer and exporter..

>>> Userspace knows which subsystems it will attach a buffer, and the
>>> kernel knows what constraints those devices have on a given platform.
>>> Ideal case is then allocate from the one exporter, attach to various
>>> devices, and have the constraints solved at map time by the exporter
>>> based on the set of attached devices.
> 
> That approach doesn't work. We have already tried stuff like that multiple times.
> 

Past failures don't guarantee future failure :)

>>> For example, on one platform the display needs contiguous buffers,
>>> but on a different platform the display can scatter-gather. So
>>> what heap should our generic application allocate from when it
>>> wants a buffer consumable by the display, CMA or System?
>>> Answer *should* be always use the generic exporter, and that
>>> exporter then picks the right backing type based on the platform.
>> The display can support scather-gather, the GPU needs bigger stride for
>> this particular format and the video encoder decoder can not support SG.
>> Which set of constraints and which buffer size should generic exporter
>> select?
> 
> Yeah, exactly that's the problem. The kernel doesn't know all the necessary information to make an informed allocation decision.
> 

Why not? For instance when we attach a buffer for scanout we provide
all the format/stride/etc info. What we are missing is a backchannel
to provide these to the exporter as a set of constraints that those
formats impose on a memory area for a given device.

> Sometimes you even have to insert format conversation steps and doing that transparently for userspace inside the kernel is really a no-go from the design side.
> 

Agree, we cannot be doing conversions like that in-kernel. We need
the format and constraints solved at an earlier step.

Andrew

>>> Userspace shouldn't be dealing with any of these constraints
>>> (looking back, adding the CMA heap was probably incorrect,
>>> and the System heap should have been the only one. Idea back
>>> then was a userspace helper would show up to do the constraint
>>> solving and pick the right heap. That has yet to materialize and
>>> folks are still just hardcoding which heap to use..).
>>>
>>> Same for this restricted heap, I'd like to explore if we can
>>> enhance the System heap such that when attached to the TEE framework,
>>> the backing memory is either made restricted by fire-walling,
>>> or allocating from a TEE carveout (based on platform).
> 
> Clearly NAK from my side to that design.
> 
> Regards,
> Christian.
> 
>> Firewalling from which devices? Or rather allowing access from which
>> devices? Is it possible to specify that somehow?
>>
>>> This will mean more inter-subsystem coordination, but we can
>>> iterate on these in kernel interfaces. We cannot iterate on
>>> userspace interfaces, those have to be correct the first time.
>>>
>>> Andrew
>>>
>>> [0]https://www.kernel.org/doc/html/next/iio/iio_dmabuf_api.html
>>>
>>>>> This can be tested on QEMU with the following steps:
>>>>> repo init -uhttps://github.com/jenswi-linaro/manifest.git  -m qemu_v8.xml \
>>>>>           -b prototype/sdp-v1
>>>>> repo sync -j8
>>>>> cd build
>>>>> make toolchains -j4
>>>>> make all -j$(nproc)
>>>>> make run-only
>>>>> # login and at the prompt:
>>>>> xtest --sdp-basic
>>>>>
>>>>> https://optee.readthedocs.io/en/latest/building/prerequisites.html
>>>>> list dependencies needed to build the above.
>>>>>
>>>>> The tests are pretty basic, mostly checking that a Trusted Application in
>>>>> the secure world can access and manipulate the memory.
>>>> - Can we test that the system doesn't crash badly if user provides
>>>>     non-secured memory to the users which expect a secure buffer?
>>>>
>>>> - At the same time corresponding entities shouldn't decode data to the
>>>>     buffers accessible to the rest of the sytem.
>>>>
>>>>> Cheers,
>>>>> Jens
>>>>>
>>>>> [1]https://lore.kernel.org/dri-devel/20240515112308.10171-1-yong.wu at mediatek.com/
>>>>> [2]https://lore.kernel.org/lkml/20220805135330.970-1-olivier.masse at nxp.com/
>>>>>
>>>>> Changes since Olivier's post [2]:
>>>>> * Based on Yong Wu's post [1] where much of dma-buf handling is done in
>>>>>     the generic restricted heap
>>>>> * Simplifications and cleanup
>>>>> * New commit message for "dma-buf: heaps: add Linaro restricted dmabuf heap
>>>>>     support"
>>>>> * Replaced the word "secure" with "restricted" where applicable
>>>>>
>>>>> Etienne Carriere (1):
>>>>>     tee: new ioctl to a register tee_shm from a dmabuf file descriptor
>>>>>
>>>>> Jens Wiklander (2):
>>>>>     dma-buf: heaps: restricted_heap: add no_map attribute
>>>>>     dma-buf: heaps: add Linaro restricted dmabuf heap support
>>>>>
>>>>> Olivier Masse (1):
>>>>>     dt-bindings: reserved-memory: add linaro,restricted-heap
>>>>>
>>>>>    .../linaro,restricted-heap.yaml               |  56 ++++++
>>>>>    drivers/dma-buf/heaps/Kconfig                 |  10 ++
>>>>>    drivers/dma-buf/heaps/Makefile                |   1 +
>>>>>    drivers/dma-buf/heaps/restricted_heap.c       |  17 +-
>>>>>    drivers/dma-buf/heaps/restricted_heap.h       |   2 +
>>>>>    .../dma-buf/heaps/restricted_heap_linaro.c    | 165 ++++++++++++++++++
>>>>>    drivers/tee/tee_core.c                        |  38 ++++
>>>>>    drivers/tee/tee_shm.c                         | 104 ++++++++++-
>>>>>    include/linux/tee_drv.h                       |  11 ++
>>>>>    include/uapi/linux/tee.h                      |  29 +++
>>>>>    10 files changed, 426 insertions(+), 7 deletions(-)
>>>>>    create mode 100644 Documentation/devicetree/bindings/reserved-memory/linaro,restricted-heap.yaml
>>>>>    create mode 100644 drivers/dma-buf/heaps/restricted_heap_linaro.c
>>>>>
>>>>> -- 
>>>>> 2.34.1
>>>>>
> 


From ulf.hansson at linaro.org  Thu Sep 26 08:49:16 2024
From: ulf.hansson at linaro.org (Ulf Hansson)
Date: Thu, 26 Sep 2024 17:49:16 +0200
Subject: [PATCH v8 0/3] Add of_regulator_get_optional() and Fix MTK Power
 Domain Driver
In-Reply-To: <20240925093807.1026949-1-wenst@chromium.org>
References: <20240925093807.1026949-1-wenst@chromium.org>
Message-ID: <CAPDyKFqoqppLipOG1vK-8oU_6cMdZ3DV5Gxqhs5-+7+cQJ6=qQ@mail.gmail.com>

On Wed, 25 Sept 2024 at 11:38, Chen-Yu Tsai <wenst at chromium.org> wrote:
>
> Hi folks,
>
> This series is split off from my "DT hardware prober" series [1].
>
> Changes since v7:
> - Added stub versions for of_regulator_get_optional() for !CONFIG_OF
>   and !CONFIG_REGULATOR
> - Added new patches for devres version and converting MTK pmdomain
>   driver
>
> At ELCE, Sebastian told me about his recent work on adding regulator
> supply support to the Rockchip power domain driver [2], how the MediaTek
> driver has been using the existing devm_regulator_get() API and
> reassigning different device nodes to the device doing the lookup, and
> how the new of_regulator_get_optional() is the proper fit for this.
>
> Patch 1 adds a new of_regulator_get_optional() function to look up
> regulator supplies using device tree nodes.
>
> Patch 2 adds a devres version of the aforementioned function at
> Sebastian's request for the two power domain drivers.
>
> Patch 3 converts the MediaTek power domain driver to use function.
>
>
> Each of the latter two patches depend on the previous one at build time.
> Mark, would it be possible for you to put the two regulator patches
> on an immutable branch / tag? Otherwise we could have Ulf ack the
> pmdomain patch and merge it through your tree. Sebastian was fine
> with converting the rockchip pmdomain some time later.

Thanks for providing some context!

In my opinion I would prefer an immutable branch/tag of the regulator
core changes, so I can carry the pmdomain changes for MTK through my
pmdomain tree, but also because I would prefer if Sebastian could make
the corresponding conversion for the Rockchip pmdomain driver. If this
can get queued soon, there is really no need to have an intermediate
step for Rockchip, I think.

Does it make sense - or do you prefer another way forward?

[...]

Kind regards
Uffe


From conor at kernel.org  Thu Sep 26 08:59:39 2024
From: conor at kernel.org (Conor Dooley)
Date: Thu, 26 Sep 2024 16:59:39 +0100
Subject: [PATCH v2 5/5] dt-bindings: display: mediatek: dpi: Add mt8195
 support in power domains
In-Reply-To: <20240926111449.9245-5-macpaul.lin@mediatek.com>
References: <20240926111449.9245-1-macpaul.lin@mediatek.com>
 <20240926111449.9245-5-macpaul.lin@mediatek.com>
Message-ID: <20240926-visible-harmonica-a7cda103ff70@spud>

On Thu, Sep 26, 2024 at 07:14:49PM +0800, Macpaul Lin wrote:
> Add power domain binding to the mediatek DPI controller for MT8185.

This wording is confusing, no binding is being added here, you're just
allowing one property.

> The dpi node in mt8195.dtsi was triggering a dtbs_check error:
>   dp-intf at 1c113000: power-domains: False schema does not allow [[44, 18]]

And while it is good to have the warning, it would be better to explain
here that there are actually power domains, since the dts could be wrong
here also.

Otherwise,
Acked-by: Conor Dooley <conor.dooley at microchip.com>

> Fixes: 5474d49b2f79 ("dt-bindings: display: mediatek: dpi: Add power domains")
> Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
> ---
>  .../devicetree/bindings/display/mediatek/mediatek,dpi.yaml       | 1 +
>  1 file changed, 1 insertion(+)
> 
> Changes for v2:
>  - Because of the corresponding dts fix has been reviewed with a Reviewed-by: tag.
>    [1] https://lore.kernel.org/all/20240925080515.16377-1-macpaul.lin at mediatek.com/
>    We still need this change to fix the 2 dtbs_check errors.
>    So keeps no change here.
> 
> diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml b/Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml
> index 3a82aec9021c..07acc8a76bfc 100644
> --- a/Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml
> +++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml
> @@ -89,6 +89,7 @@ allOf:
>                  - mediatek,mt6795-dpi
>                  - mediatek,mt8173-dpi
>                  - mediatek,mt8186-dpi
> +                - mediatek,mt8195-dp-intf
>      then:
>        properties:
>          power-domains: false
> -- 
> 2.45.2
> 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 228 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-mediatek/attachments/20240926/1ba13bc7/attachment-0001.sig>

From conor at kernel.org  Thu Sep 26 09:02:45 2024
From: conor at kernel.org (Conor Dooley)
Date: Thu, 26 Sep 2024 17:02:45 +0100
Subject: [PATCH v2 2/5] dt-bindings: iommu: mediatek: Fix interrupt count
 constraint for new SoCs
In-Reply-To: <20240926111449.9245-2-macpaul.lin@mediatek.com>
References: <20240926111449.9245-1-macpaul.lin@mediatek.com>
 <20240926111449.9245-2-macpaul.lin@mediatek.com>
Message-ID: <20240926-unbounded-gosling-6b4303106f27@spud>

On Thu, Sep 26, 2024 at 07:14:46PM +0800, Macpaul Lin wrote:
> The infra-iommu node in mt8195.dtsi was triggering a CHECK_DTBS error due
> to an excessively long 'interrupts' property. The error message was:
> 
>   infra-iommu at 10315000: interrupts: [[0, 795, 4, 0], [0, 796, 4, 0],
>                      [0, 797, 4, 0], [0, 798, 4, 0], [0, 799, 4, 0]]
>                      is too long
> 
> To address this issue, add "minItems: 1" and "maxItems: 5" constraints to
> the 'interrupts' property in the DT binding schema. This change allows for
> flexibility in the number of interrupts for new SoCs.
> The purpose of these 5 interrupts is also added.
> 
> Fixes: bca28426805d ("dt-bindings: iommu: mediatek: Convert IOMMU to DT schema")
> Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
> ---
>  .../bindings/iommu/mediatek,iommu.yaml        | 25 ++++++++++++++++++-
>  1 file changed, 24 insertions(+), 1 deletion(-)
> 
> Changes for v2:
>  - commit message: re-formatting and add a description of adding 5 interrupts.
>  - add 'description' and 'maxItems: 5' for 'interrupt' property of
>    'mt8195-iommu-infra'
>  - others keeps 'maxItems: 1'
> 
> diff --git a/Documentation/devicetree/bindings/iommu/mediatek,iommu.yaml b/Documentation/devicetree/bindings/iommu/mediatek,iommu.yaml
> index ea6b0f5f24de..fdd2996d2a31 100644
> --- a/Documentation/devicetree/bindings/iommu/mediatek,iommu.yaml
> +++ b/Documentation/devicetree/bindings/iommu/mediatek,iommu.yaml
> @@ -96,7 +96,8 @@ properties:
>      maxItems: 1
>  
>    interrupts:
> -    maxItems: 1
> +    minItems: 1
> +    maxItems: 5
>  
>    clocks:
>      items:
> @@ -210,6 +211,28 @@ allOf:
>        required:
>          - mediatek,larbs
>  
> +  - if:
> +      properties:
> +        compatible:
> +          contains:
> +            enum:
> +              - mediatek,mt8195-iommu-infra
> +
> +    then:
> +      properties:
> +        interrupts:
> +          description: |
> +            The IOMMU of MT8195 has 5 banks: 0/1/2/3/4.
> +            Each bank has a set of APB registers corresponding to the
> +            normal world, protected world 1/2/3, and secure world, respectively.
> +            Therefore, 5 interrupt numbers are needed.

> +          maxItems: 5

You repeat here the constraint from the original definition. Should this
be minitems: 5?

> +
> +    else:
> +      properties:
> +        interrupts:
> +          maxItems: 1
> +
>  additionalProperties: false
>  
>  examples:
> -- 
> 2.45.2
> 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 228 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-mediatek/attachments/20240926/4045bb3d/attachment.sig>

From conor at kernel.org  Thu Sep 26 09:04:58 2024
From: conor at kernel.org (Conor Dooley)
Date: Thu, 26 Sep 2024 17:04:58 +0100
Subject: [PATCH 2/3] dt-bindings: mfd: mediatek: mt6397: add compatible
 for mt6359-codec
In-Reply-To: <20240926092519.6556-2-macpaul.lin@mediatek.com>
References: <20240926092519.6556-1-macpaul.lin@mediatek.com>
 <20240926092519.6556-2-macpaul.lin@mediatek.com>
Message-ID: <20240926-smokeless-clobber-0fb8a1cdc7ab@spud>

On Thu, Sep 26, 2024 at 05:25:18PM +0800, Macpaul Lin wrote:
> This patch updates the audio-codec properties includes:
>  - compatible:
>   - Re-order the supported device items.
>   - Add 'mt6359-codec' to compatible since MT6359 PMIC has been included
>     in this DT Schema.

>   - Set 'additionalProperties: true' for 'mt6359-codec'.

Why?

> 
> Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
> ---
>  Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml | 5 +++--
>  1 file changed, 3 insertions(+), 2 deletions(-)
> 
> diff --git a/Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml b/Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml
> index 40cabaf60d0d..ffb5848a96d5 100644
> --- a/Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml
> +++ b/Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml
> @@ -104,7 +104,7 @@ properties:
>  
>    audio-codec:
>      type: object
> -    additionalProperties: false
> +    additionalProperties: true
>      description:
>        Audio codec support with MT6397 and MT6358.
>  
> @@ -112,8 +112,9 @@ properties:
>        compatible:
>          oneOf:
>            - enum:
> -              - mediatek,mt6397-codec
>                - mediatek,mt6358-sound
> +              - mediatek,mt6359-codec
> +              - mediatek,mt6397-codec
>            - items:
>                - enum:
>                    - mediatek,mt6366-sound
> -- 
> 2.45.2
> 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 228 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-mediatek/attachments/20240926/475bfb75/attachment.sig>

From conor at kernel.org  Thu Sep 26 09:13:55 2024
From: conor at kernel.org (Conor Dooley)
Date: Thu, 26 Sep 2024 17:13:55 +0100
Subject: [PATCH 2/2] dt-bindings: mmc: mtk-sd: Add support for MT8196
In-Reply-To: <20240926070405.20212-3-andy-ld.lu@mediatek.com>
References: <20240926070405.20212-1-andy-ld.lu@mediatek.com>
 <20240926070405.20212-3-andy-ld.lu@mediatek.com>
Message-ID: <20240926-footprint-faster-4263120d0b83@spud>

On Thu, Sep 26, 2024 at 03:03:18PM +0800, Andy-ld Lu wrote:
> Extend the devicetree bindings to include the MT8196 mmc controller
> by adding the compatible string 'mediatek,msdc-v2', which could be
> also used for future compatible SoCs that support new tx/rx.
> 
> Add three properties for MT8196 settings:
> - 'mediatek,prohibit-gate-cg', indicate if the source clock CG could
>   be disabled when CPU access IP registers.
> 
> - 'mediatek,stop-dly-sel', configure read data clock stops at block gap.
> 
> - 'mediatek,pop-en-cnt', configure the margins of write and read
>   pointers while begin to pop data transfer.
> 
> Signed-off-by: Andy-ld Lu <andy-ld.lu at mediatek.com>
> ---
>  .../devicetree/bindings/mmc/mtk-sd.yaml       | 26 +++++++++++++++++++
>  1 file changed, 26 insertions(+)
> 
> diff --git a/Documentation/devicetree/bindings/mmc/mtk-sd.yaml b/Documentation/devicetree/bindings/mmc/mtk-sd.yaml
> index c532ec92d2d9..82d1a9fac67c 100644
> --- a/Documentation/devicetree/bindings/mmc/mtk-sd.yaml
> +++ b/Documentation/devicetree/bindings/mmc/mtk-sd.yaml
> @@ -25,6 +25,7 @@ properties:
>            - mediatek,mt8173-mmc
>            - mediatek,mt8183-mmc
>            - mediatek,mt8516-mmc
> +          - mediatek,msdc-v2
>        - items:
>            - const: mediatek,mt7623-mmc
>            - const: mediatek,mt2701-mmc
> @@ -154,6 +155,30 @@ properties:
>      enum: [32, 64]
>      default: 32
>  
> +  mediatek,stop-dly-sel:
> +    $ref: /schemas/types.yaml#/definitions/uint32
> +    description:
> +      Some SoCs need to set appropriate stop-dly-sel to configure read data clock
> +      stops at block gap. The valid range is from 0 to 0xf.

If you used a specific compatible for these devices, which you should,
you would not require either this or "pop-en-cnt".

> +    minimum: 0
> +    maximum: 0xf
> +
> +  mediatek,pop-en-cnt:
> +    $ref: /schemas/types.yaml#/definitions/uint32
> +    description:
> +      Some SoCs need to set appropriate pop-en-cnt to configure the margins of write
> +      and read pointers while begin to pop data transfer. The valid range is from 0
> +      to 0xf.
> +    minimum: 0
> +    maximum: 0xf
> +
> +  mediatek,prohibit-gate-cg:

This is also probably detectable from a specific compatible, if you had
one?
TL;DR specific compatibles please, non of this "msdc-v2" stuff, sorry.

Thanks,
Conor.

> +    $ref: /schemas/types.yaml#/definitions/flag
> +    description:
> +      Decide if source clock CG could be disabled when CPU access IP registers.
> +      If present, source clock CG could not be disabled.
> +      If not present, source clock CG could be disabled.
> +
>    resets:
>      maxItems: 1
>  
> @@ -191,6 +216,7 @@ allOf:
>              - mediatek,mt8188-mmc
>              - mediatek,mt8195-mmc
>              - mediatek,mt8516-mmc
> +            - mediatek,msdc-v2
>      then:
>        properties:
>          clocks:
> -- 
> 2.46.0
> 
> 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 228 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-mediatek/attachments/20240926/8b1ab111/attachment.sig>

From conor at kernel.org  Thu Sep 26 09:25:16 2024
From: conor at kernel.org (Conor Dooley)
Date: Thu, 26 Sep 2024 17:25:16 +0100
Subject: [PATCH] dt-bindings: phy: mediatek: tphy: add a property for
 power-domains
In-Reply-To: <20240926101804.22471-1-macpaul.lin@mediatek.com>
References: <20240926101804.22471-1-macpaul.lin@mediatek.com>
Message-ID: <20240926-treadmill-purr-b2e3279a14a4@spud>

On Thu, Sep 26, 2024 at 06:18:04PM +0800, Macpaul Lin wrote:
> Some platforms requires a dependency for power-domains.

Some, so not all? Why isn't this restricted on a per compatible basis?

> So we add property 'power-domains' and set 'maxItems: 1' in the
> DT Schema.
> 
> Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
> ---
>  Documentation/devicetree/bindings/phy/mediatek,tphy.yaml | 3 +++
>  1 file changed, 3 insertions(+)
> 
> diff --git a/Documentation/devicetree/bindings/phy/mediatek,tphy.yaml b/Documentation/devicetree/bindings/phy/mediatek,tphy.yaml
> index 423b7c4e62f2..c77fe43c224a 100644
> --- a/Documentation/devicetree/bindings/phy/mediatek,tphy.yaml
> +++ b/Documentation/devicetree/bindings/phy/mediatek,tphy.yaml
> @@ -125,6 +125,9 @@ properties:
>      $ref: /schemas/types.yaml#/definitions/uint32
>      default: 28
>  
> +  power-domains:
> +    maxItems: 1
> +
>  # Required child node:
>  patternProperties:
>    "^(usb|pcie|sata)-phy@[0-9a-f]+$":
> -- 
> 2.45.2
> 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 228 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-mediatek/attachments/20240926/aa3d5717/attachment-0001.sig>

From robh at kernel.org  Thu Sep 26 10:54:09 2024
From: robh at kernel.org (Rob Herring)
Date: Thu, 26 Sep 2024 12:54:09 -0500
Subject: [PATCH 2/2] dt-bindings: mmc: mtk-sd: Add support for MT8196
In-Reply-To: <20240926070405.20212-3-andy-ld.lu@mediatek.com>
References: <20240926070405.20212-1-andy-ld.lu@mediatek.com>
 <20240926070405.20212-3-andy-ld.lu@mediatek.com>
Message-ID: <20240926175409.GA2644361-robh@kernel.org>

On Thu, Sep 26, 2024 at 03:03:18PM +0800, Andy-ld Lu wrote:
> Extend the devicetree bindings to include the MT8196 mmc controller
> by adding the compatible string 'mediatek,msdc-v2', which could be
> also used for future compatible SoCs that support new tx/rx.

Generally, every SoC ends up changing at least slightly. So we don't do 
version numbers except when there's a well defined versioning scheme of 
the h/w (e.g. FPGA IP blocks). So, use SoC for compatible string.

> 
> Add three properties for MT8196 settings:
> - 'mediatek,prohibit-gate-cg', indicate if the source clock CG could
>   be disabled when CPU access IP registers.
> 
> - 'mediatek,stop-dly-sel', configure read data clock stops at block gap.
> 
> - 'mediatek,pop-en-cnt', configure the margins of write and read
>   pointers while begin to pop data transfer.
> 
> Signed-off-by: Andy-ld Lu <andy-ld.lu at mediatek.com>
> ---
>  .../devicetree/bindings/mmc/mtk-sd.yaml       | 26 +++++++++++++++++++
>  1 file changed, 26 insertions(+)
> 
> diff --git a/Documentation/devicetree/bindings/mmc/mtk-sd.yaml b/Documentation/devicetree/bindings/mmc/mtk-sd.yaml
> index c532ec92d2d9..82d1a9fac67c 100644
> --- a/Documentation/devicetree/bindings/mmc/mtk-sd.yaml
> +++ b/Documentation/devicetree/bindings/mmc/mtk-sd.yaml
> @@ -25,6 +25,7 @@ properties:
>            - mediatek,mt8173-mmc
>            - mediatek,mt8183-mmc
>            - mediatek,mt8516-mmc
> +          - mediatek,msdc-v2
>        - items:
>            - const: mediatek,mt7623-mmc
>            - const: mediatek,mt2701-mmc
> @@ -154,6 +155,30 @@ properties:
>      enum: [32, 64]
>      default: 32
>  
> +  mediatek,stop-dly-sel:
> +    $ref: /schemas/types.yaml#/definitions/uint32
> +    description:
> +      Some SoCs need to set appropriate stop-dly-sel to configure read data clock
> +      stops at block gap. The valid range is from 0 to 0xf.

SoC dependent or board dependent? Imply from the compatible for the 
former. A property is fine for the latter case.

> +    minimum: 0
> +    maximum: 0xf
> +
> +  mediatek,pop-en-cnt:
> +    $ref: /schemas/types.yaml#/definitions/uint32
> +    description:
> +      Some SoCs need to set appropriate pop-en-cnt to configure the margins of write
> +      and read pointers while begin to pop data transfer. The valid range is from 0
> +      to 0xf.
> +    minimum: 0
> +    maximum: 0xf

Same question.

> +
> +  mediatek,prohibit-gate-cg:
> +    $ref: /schemas/types.yaml#/definitions/flag
> +    description:
> +      Decide if source clock CG could be disabled when CPU access IP registers.
> +      If present, source clock CG could not be disabled.
> +      If not present, source clock CG could be disabled.


Sounds like you need to describe the clock in "clocks".

> +
>    resets:
>      maxItems: 1
>  
> @@ -191,6 +216,7 @@ allOf:
>              - mediatek,mt8188-mmc
>              - mediatek,mt8195-mmc
>              - mediatek,mt8516-mmc
> +            - mediatek,msdc-v2
>      then:
>        properties:
>          clocks:
> -- 
> 2.46.0
> 


From almasrymina at google.com  Thu Sep 26 11:15:15 2024
From: almasrymina at google.com (Mina Almasry)
Date: Thu, 26 Sep 2024 11:15:15 -0700
Subject: [PATCH net v2 2/2] page_pool: fix IOMMU crash when driver has
 already unbound
In-Reply-To: <20240925075707.3970187-3-linyunsheng@huawei.com>
References: <20240925075707.3970187-1-linyunsheng@huawei.com> <20240925075707.3970187-3-linyunsheng@huawei.com>
Message-ID: <CAHS8izOxugzWJDTc-4CWqaKABTj=J4OHs=Lcb=SE9r8gX0J+yg@mail.gmail.com>

On Wed, Sep 25, 2024 at 1:03?AM Yunsheng Lin <linyunsheng at huawei.com> wrote:
>
> Networking driver with page_pool support may hand over page
> still with dma mapping to network stack and try to reuse that
> page after network stack is done with it and passes it back
> to page_pool to avoid the penalty of dma mapping/unmapping.
> With all the caching in the network stack, some pages may be
> held in the network stack without returning to the page_pool
> soon enough, and with VF disable causing the driver unbound,
> the page_pool does not stop the driver from doing it's
> unbounding work, instead page_pool uses workqueue to check
> if there is some pages coming back from the network stack
> periodically, if there is any, it will do the dma unmmapping
> related cleanup work.
>
> As mentioned in [1], attempting DMA unmaps after the driver
> has already unbound may leak resources or at worst corrupt
> memory. Fundamentally, the page pool code cannot allow DMA
> mappings to outlive the driver they belong to.
>
> Currently it seems there are at least two cases that the page
> is not released fast enough causing dma unmmapping done after
> driver has already unbound:
> 1. ipv4 packet defragmentation timeout: this seems to cause
>    delay up to 30 secs.
> 2. skb_defer_free_flush(): this may cause infinite delay if
>    there is no triggering for net_rx_action().
>

I think additionally this is dependent on user behavior, right? AFAIU,
frags allocated by the page_pool will remain in the socket receive
queue until the user calls recvmsg(), and AFAIU they are stuck there
arbitrarily long.

> In order not to do the dma unmmapping after driver has already
> unbound and stall the unloading of the networking driver, add
> the pool->items array to record all the pages including the ones
> which are handed over to network stack, so the page_pool can
> do the dma unmmapping for those pages when page_pool_destroy()
> is called.

One thing I could not understand from looking at the code: if the
items array is in the struct page_pool, why do you need to modify the
page_pool entry in the struct page and in the struct net_iov? I think
the code could be made much simpler if you can remove these changes,
and you wouldn't need to modify the public api of the page_pool.

> As the pool->items need to be large enough to avoid
> performance degradation, add a 'item_full' stat to indicate the
> allocation failure due to unavailability of pool->items.
>

I'm not sure there is any way to size the pool->items array correctly.
Can you use a data structure here that can grow? Linked list or
xarray?

AFAIU what we want is when the page pool allocates a netmem it will
add the netmem to the items array, and when the pp releases a netmem
it will remove it from the array. Both of these operations are slow
paths, right? So the performance of a data structure more complicated
than an array may be ok. bench_page_pool_simple will tell for sure.

> Note, the devmem patchset seems to make the bug harder to fix,
> and may make backporting harder too. As there is no actual user
> for the devmem and the fixing for devmem is unclear for now,
> this patch does not consider fixing the case for devmem yet.
>

net_iovs don't hit this bug, dma_unmap_page_attrs() is never called on
them, so no special handling is needed really. However for code
quality reasons lets try to minimize the number of devmem or memory
provider checks in the code, if possible.

-- 
Thanks,
Mina


From bvanassche at acm.org  Thu Sep 26 11:26:22 2024
From: bvanassche at acm.org (Bart Van Assche)
Date: Thu, 26 Sep 2024 11:26:22 -0700
Subject: [PATCH v9 2/3] ufs: core: fix error handler process for MCQ abort
In-Reply-To: <4bc08986190aecb394f07997b2ad31e301567496.camel@mediatek.com>
References: <20240925095546.19492-1-peter.wang@mediatek.com>
 <20240925095546.19492-3-peter.wang@mediatek.com>
 <949fb86d-6b61-4a1a-bc04-c05bb30522b9@acm.org>
 <4bc08986190aecb394f07997b2ad31e301567496.camel@mediatek.com>
Message-ID: <108a707e-1118-42f4-8cc9-c1bda9fab451@acm.org>

On 9/25/24 8:45 PM, Peter Wang (???) wrote:
> diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
> index 24a32e2fd75e..06aa4ed1a9e6 100644
> --- a/drivers/ufs/core/ufshcd.c
> +++ b/drivers/ufs/core/ufshcd.c
> @@ -5417,10 +5417,12 @@ ufshcd_transfer_rsp_status(struct ufs_hba *hba,
> struct ufshcd_lrb *lrbp,
>   		}
>   		break;
>   	case OCS_ABORTED:
> -		result |= DID_ABORT << 16;
> -		break;
>   	case OCS_INVALID_COMMAND_STATUS:
>   		result |= DID_REQUEUE << 16;
> +		dev_warn(hba->dev,
> +				"OCS %s from controller for tag %d\n",
> +				(ocs == OCS_ABORTED? "aborted" :
> "invalid"),
> +				lrbp->task_tag);
>   		break;
>   	case OCS_INVALID_CMD_TABLE_ATTR:
>   	case OCS_INVALID_PRDT_ATTR:
> @@ -6466,26 +6468,12 @@ static bool ufshcd_abort_one(struct request
> *rq, void *priv)
>   	struct scsi_device *sdev = cmd->device;
>   	struct Scsi_Host *shost = sdev->host;
>   	struct ufs_hba *hba = shost_priv(shost);
> -	struct ufshcd_lrb *lrbp = &hba->lrb[tag];
> -	struct ufs_hw_queue *hwq;
> -	unsigned long flags;
>   
>   	*ret = ufshcd_try_to_abort_task(hba, tag);
>   	dev_err(hba->dev, "Aborting tag %d / CDB %#02x %s\n", tag,
>   		hba->lrb[tag].cmd ? hba->lrb[tag].cmd->cmnd[0] : -1,
>   		*ret ? "failed" : "succeeded");
>   
> -	/* Release cmd in MCQ mode if abort succeeds */
> -	if (hba->mcq_enabled && (*ret == 0)) {
> -		hwq = ufshcd_mcq_req_to_hwq(hba, scsi_cmd_to_rq(lrbp-
>> cmd));
> -		if (!hwq)
> -			return 0;
> -		spin_lock_irqsave(&hwq->cq_lock, flags);
> -		if (ufshcd_cmd_inflight(lrbp->cmd))
> -			ufshcd_release_scsi_cmd(hba, lrbp);
> -		spin_unlock_irqrestore(&hwq->cq_lock, flags);
> -	}
> -
>   	return *ret == 0;
>   }
>   
> ---------------------------------------------------------------------
> 
> 
> This patch has several advantages:
> 
> 1. It makes the patch 'ufs: core: fix the issue of ICU failure'
>     seem valuable.
> 2. The patch is more concise.
> 3. There is no need to fetch OCS to determine OCS: ABORTED
>     on every CQ completion, which increases ISR time.
> 4. The err_handler flow for SDB and MCQ would be consistent.
> 5. There is no need for the MediaTek SDB quirk.
> 
> 
> What do you think?"

Hi Peter,

Is the above patch sufficient? In MCQ mode, aborting a command happens
as follows (simplified):
(1) Send the ABORT TASK TMF. If this TMF succeeds, no SQE will be
     generated. If this TMF succeeds it means that the SCSI command has
     reached the UFS device and hence is no longer present in any
     submission queue (SQ).
(2) If the command is still in a submission queue, nullify the SQE. In
     this case a CQE will be generated with status ABORTED.

It seems to me that the above patch handles (2) but not (1)?

Thanks,

Bart.


From quic_abhinavk at quicinc.com  Thu Sep 26 16:01:27 2024
From: quic_abhinavk at quicinc.com (Abhinav Kumar)
Date: Thu, 26 Sep 2024 16:01:27 -0700
Subject: [PATCH v2] docs/gpu: ci: update flake tests requirements
In-Reply-To: <20240926070653.1773597-1-vignesh.raman@collabora.com>
References: <20240926070653.1773597-1-vignesh.raman@collabora.com>
Message-ID: <e9f38fe1-10fb-49ad-b209-0e2786ec6f94@quicinc.com>



On 9/26/2024 12:06 AM, Vignesh Raman wrote:
> Update the documentation to require linking to a relevant GitLab
> issue for each new flake entry instead of an email report. Added
> specific GitLab issue URLs for i915, xe and other drivers.
> 
> Signed-off-by: Vignesh Raman <vignesh.raman at collabora.com>
> ---
> 
> v2:
> - Add gitlab issue link for msm driver.
> 
> ---
>   Documentation/gpu/automated_testing.rst | 16 +++++++++++-----
>   1 file changed, 11 insertions(+), 5 deletions(-)
> 
> diff --git a/Documentation/gpu/automated_testing.rst b/Documentation/gpu/automated_testing.rst
> index 2d5a28866afe..f918fe56f2b0 100644
> --- a/Documentation/gpu/automated_testing.rst
> +++ b/Documentation/gpu/automated_testing.rst
> @@ -67,20 +67,26 @@ Lists the tests that for a given driver on a specific hardware revision are
>   known to behave unreliably. These tests won't cause a job to fail regardless of
>   the result. They will still be run.
>   
> -Each new flake entry must be associated with a link to the email reporting the
> -bug to the author of the affected driver, the board name or Device Tree name of
> -the board, the first kernel version affected, the IGT version used for tests,
> -and an approximation of the failure rate.
> +Each new flake entry must include a link to the relevant GitLab issue, the board
> +name or Device Tree name, the first kernel version affected, the IGT version used
> +for tests and an approximation of the failure rate.
>   
>   They should be provided under the following format::
>   
> -  # Bug Report: $LORE_OR_PATCHWORK_URL
> +  # Bug Report: $GITLAB_ISSUE
>     # Board Name: broken-board.dtb
>     # Linux Version: 6.6-rc1
>     # IGT Version: 1.28-gd2af13d9f
>     # Failure Rate: 100
>     flaky-test
>   
> +The GitLab issue must include the logs and the pipeline link. Use the appropriate
> +link below to create an issue.
> +https://gitlab.freedesktop.org/drm/i915/kernel/-/issues for i915 driver
> +https://gitlab.freedesktop.org/drm/xe/kernel/-/issues for xe driver
> +https://gitlab.freedesktop.org/drm/msm/-/issues for msm driver
> +https://gitlab.freedesktop.org/drm/misc/kernel/-/issues for other drivers
> +

Acked for MSM.

Thanks

Abhinav
>   drivers/gpu/drm/ci/${DRIVER_NAME}-${HW_REVISION}-skips.txt
>   -----------------------------------------------------------
>   


From hsinyi at chromium.org  Thu Sep 26 16:02:27 2024
From: hsinyi at chromium.org (Hsin-Yi Wang)
Date: Thu, 26 Sep 2024 16:02:27 -0700
Subject: [PATCH 2/2] arm64: dts: mediate: Introduce MT8186
 Chinchou/Chinchou360 Chromebooks
In-Reply-To: <bbf023c7-f08b-4f9d-8770-08e63074fb4c@collabora.com>
References: <20240925080353.2362879-1-jakiela@google.com> <20240925080353.2362879-2-jakiela@google.com>
 <bbf023c7-f08b-4f9d-8770-08e63074fb4c@collabora.com>
Message-ID: <CAJMQK-g4BdJPPU59s4X3yuAU+Gy-hTm9bCnSHFfDEbtKv6Xr1A@mail.gmail.com>

On Thu, Sep 26, 2024 at 2:27?AM AngeloGioacchino Del Regno
<angelogioacchino.delregno at collabora.com> wrote:
>
> Il 25/09/24 10:03, Albert Jakie?a ha scritto:
> > The MT8186 Chinchou/Chinchou360, also known as the Asus Chromebook
> > CZ12/CZ11 Flip, is a clamshell or convertible device with touchscreen,
> > stylus and extra buttons.
> >
> > Signed-off-by: Albert Jakie?a <jakiela at google.com>
> > ---
> >   arch/arm64/boot/dts/mediatek/Makefile         |   3 +
> >   .../mediatek/mt8186-corsola-chinchou-sku0.dts |  18 +
> >   .../mediatek/mt8186-corsola-chinchou-sku1.dts |  34 ++
> >   .../mt8186-corsola-chinchou-sku16.dts         |  28 ++
> >   .../dts/mediatek/mt8186-corsola-chinchou.dtsi | 445 ++++++++++++++++++
> >   5 files changed, 528 insertions(+)
> >   create mode 100644 arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku0.dts
> >   create mode 100644 arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku1.dts
> >   create mode 100644 arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku16.dts
> >   create mode 100644 arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou.dtsi
> >
> > diff --git a/arch/arm64/boot/dts/mediatek/Makefile b/arch/arm64/boot/dts/mediatek/Makefile
> > index 8fd7b2bb7a15..0db7770e8907 100644
> > --- a/arch/arm64/boot/dts/mediatek/Makefile
> > +++ b/arch/arm64/boot/dts/mediatek/Makefile
> > @@ -55,6 +55,9 @@ dtb-$(CONFIG_ARCH_MEDIATEK) += mt8183-kukui-kodama-sku32.dtb
> >   dtb-$(CONFIG_ARCH_MEDIATEK) += mt8183-kukui-krane-sku0.dtb
> >   dtb-$(CONFIG_ARCH_MEDIATEK) += mt8183-kukui-krane-sku176.dtb
> >   dtb-$(CONFIG_ARCH_MEDIATEK) += mt8183-pumpkin.dtb
> > +dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-chinchou-sku0.dtb
> > +dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-chinchou-sku1.dtb
> > +dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-chinchou-sku16.dtb
> >   dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-magneton-sku393216.dtb
> >   dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-magneton-sku393217.dtb
> >   dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-magneton-sku393218.dtb
> > diff --git a/arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku0.dts b/arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku0.dts
> > new file mode 100644
> > index 000000000000..29dd92318da1
> > --- /dev/null
> > +++ b/arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku0.dts
> > @@ -0,0 +1,18 @@
> > +// SPDX-License-Identifier: (GPL-2.0 OR MIT)
> > +/*
> > + * Copyright 2023 Google LLC
> > + */
> > +
> > +/dts-v1/;
> > +#include "mt8186-corsola-chinchou.dtsi"
> > +
> > +/ {
> > +     model = "Google chinchou sku0 board";
> > +     compatible = "google,chinchou-sku0", "google,chinchou-sku2",
> > +                     "google,chinchou-sku4", "google,chinchou-sku5",
> > +                     "google,chinchou", "mediatek,mt8186";
> > +};
> > +
> > +&gpio_keys {
> > +     status = "disabled";
> > +};
> > diff --git a/arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku1.dts b/arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku1.dts
> > new file mode 100644
> > index 000000000000..8ba31f81d9ad
> > --- /dev/null
> > +++ b/arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku1.dts
> > @@ -0,0 +1,34 @@
> > +// SPDX-License-Identifier: (GPL-2.0 OR MIT)
> > +/*
> > + * Copyright 2023 Google LLC
> > + */
> > +
> > +/dts-v1/;
> > +#include "mt8186-corsola-chinchou.dtsi"
> > +
> > +/ {
> > +     model = "Google chinchou sku1/sku17 board";
> > +     compatible = "google,chinchou-sku1", "google,chinchou-sku17",
> > +                     "google,chinchou-sku3", "google,chinchou-sku6",
> > +                     "google,chinchou-sku7", "google,chinchou-sku20",
> > +                     "google,chinchou-sku22", "google,chinchou-sku23",
> > +                     "mediatek,mt8186";
> > +};
> > +
> > +&i2c1 {
> > +     i2c-scl-internal-delay-ns = <10000>;
> > +
> > +     touchscreen: touchscreen at 41 {
> > +             compatible = "ilitek,ili2901";
> > +             reg = <0x41>;
> > +             interrupts-extended = <&pio 12 IRQ_TYPE_LEVEL_LOW>;
> > +             pinctrl-names = "default";
> > +             pinctrl-0 = <&touchscreen_pins>;
> > +             reset-gpios = <&pio 60 GPIO_ACTIVE_LOW>;
> > +             vccio-supply = <&pp1800_tchscr_report_disable>;
> > +     };
> > +};
> > +
> > +&gpio_keys {
> > +     status = "disabled";
> > +};
> > diff --git a/arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku16.dts b/arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku16.dts
> > new file mode 100644
> > index 000000000000..d3378d7ad096
> > --- /dev/null
> > +++ b/arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku16.dts
> > @@ -0,0 +1,28 @@
> > +// SPDX-License-Identifier: (GPL-2.0 OR MIT)
> > +/*
> > + * Copyright 2023 Google LLC
> > + */
> > +
> > +/dts-v1/;
> > +#include "mt8186-corsola-chinchou.dtsi"
> > +
> > +/ {
> > +     model = "Google chinchou sku16/sku2147483647 board";
> > +     compatible = "google,chinchou-sku16", "google,chinchou-sku18",
> > +                     "google,chinchou-sku19", "google,chinchou-sku21",
> > +                     "google,chinchou-sku2147483647", "mediatek,mt8186";
> > +};
> > +
> > +&i2c1 {
> > +     i2c-scl-internal-delay-ns = <10000>;
> > +
> > +     touchscreen: touchscreen at 41 {
> > +             compatible = "ilitek,ili2901";
> > +             reg = <0x41>;
> > +             interrupts-extended = <&pio 12 IRQ_TYPE_LEVEL_LOW>;
> > +             pinctrl-names = "default";
> > +             pinctrl-0 = <&touchscreen_pins>;
> > +             reset-gpios = <&pio 60 GPIO_ACTIVE_LOW>;
> > +             vccio-supply = <&pp1800_tchscr_report_disable>;
> > +     };
> > +};
> > diff --git a/arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou.dtsi b/arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou.dtsi
> > new file mode 100644
> > index 000000000000..c77cc43f8442
> > --- /dev/null
> > +++ b/arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou.dtsi
>
> ..snip..
>
> > +
> > +&mmc1_pins_default {
> > +     pins-clk {
> > +             drive-strength = <MTK_DRIVE_8mA>;
>
> Please stop using the meaningless MTK_DRIVE_(x)mA macro.
>
> drive-strength = <8>; is enough :-)
>
> Cheers,
> Angelo
>
> > +     };
> > +
> > +     pins-cmd-dat {
> > +             drive-strength = <MTK_DRIVE_8mA>;
> > +     };
> > +};
> > +
> > +&mmc1_pins_uhs {
> > +     pins-clk {
> > +             drive-strength = <MTK_DRIVE_8mA>;
> > +     };
> > +
> > +     pins-cmd-dat {
> > +             drive-strength = <MTK_DRIVE_8mA>;
> > +     };
> > +};
> > +
> > +&sound {
> > +     status = "okay";
> > +
> > +     compatible = "mediatek,mt8186-mt6366-rt5650-sound";
>
> You don't need to change this compatible, as the only thing that changes in the
> actual driver are the dapm_routes. I implemented support for that nice dai-link
> (standard, kind of) graph so that we stop getting a thousand compatibles for no
> reason other than routing :-)
>
> This should work with (99.9% confident it will, but please test):
>
>         model = "mt8186_rt5650";
>         status = "okay";
>
> > +     mediatek,adsp = <&adsp>;
>
> This property is already set in the node that you're inheriting from
> mt8186-corsola.dtsi, please drop.
>
> > +
> > +     audio-routing =
> > +             "Headphone", "HPOL",
> > +             "Headphone", "HPOR",
> > +             "HDMI1", "TX";
> > +
> > +     hs-playback-dai-link {
> > +             codec {
> > +                     sound-dai = <&rt5650>;
> > +             };
> > +     };
> > +
> > +     hs-capture-dai-link {
> > +             codec {
> > +                     sound-dai = <&rt5650>;
> > +             };
> > +     };
> > +
> > +     spk-share-dai-link {
> > +     };
>
> Empty nodes are meaningless (and you're inheriting this dai link from
> mt8186-corsola.dtsi as well). Drop.
>
> > +
> > +     spk-hdmi-playback-dai-link {
> > +             codec {
> > +                     sound-dai = <&it6505dptx>;
> > +             };
> > +     };
> > +};
> > +
> > +&wifi_enable_pin {
> > +     pins-wifi-enable {
> > +             pinmux = <PINMUX_GPIO51__FUNC_GPIO51>;
> > +     };
> > +};
> > +
> > +&wifi_pwrseq {
> > +     reset-gpios = <&pio 51 GPIO_ACTIVE_LOW>;
> > +};
> > +
>
> ..snip..
>
> > +
> > +&pen_insert {
> > +     wakeup-event-action = <EV_ACT_ANY>;
>
> Why is this set to EV_ACT_ANY on Chinchou but not on the other Corsola devices?
> Is there any specific reason?

Default it's set to EV_ACT_DEASSERTED. Some OEMs want to wake up on
both assert and deassert.

>
> Cheers,
> Angelo
>


From javier.carrasco.cruz at gmail.com  Thu Sep 26 16:20:51 2024
From: javier.carrasco.cruz at gmail.com (Javier Carrasco)
Date: Fri, 27 Sep 2024 01:20:51 +0200
Subject: [PATCH 00/18] leds: switch to device_for_each_child_node_scoped()
Message-ID: <20240927-leds_device_for_each_child_node_scoped-v1-0-95c0614b38c8@gmail.com>

This series switches from the device_for_each_child_node() macro to its
scoped variant, which in general makes the code more robust if new early
exits are added to the loops, because there is no need for explicit
calls to fwnode_handle_put(). Depending on the complexity of the loop
and its error handling, the code gets simplified and it gets easier to
follow.

The non-scoped variant of the macro is error-prone, and it has been the
source of multiple bugs where the child node refcount was not
decremented accordingly in error paths within the loops. The first patch
of this series is a good example, which fixes that kind of bug that is
regularly found in node iterators.

The uses of device_for_each_child_node() with no early exits have been
left untouched because their simpilicty justifies the non-scoped
variant.

Note that the child node is now declared in the macro, and therefore the
explicit declaration is no longer required.

The general functionality should not be affected by this modification.
If functional changes are found, please report them back as errors.

Signed-off-by: Javier Carrasco <javier.carrasco.cruz at gmail.com>
---
Javier Carrasco (18):
      leds: flash: mt6360: fix device_for_each_child_node() refcounting in error paths
      leds: flash: mt6370: switch to device_for_each_child_node_scoped()
      leds: flash: leds-qcom-flash: switch to device_for_each_child_node_scoped()
      leds: aw200xx: switch to device_for_each_child_node_scoped()
      leds: cr0014114: switch to device_for_each_child_node_scoped()
      leds: el15203000: switch to device_for_each_child_node_scoped()
      leds: gpio: switch to device_for_each_child_node_scoped()
      leds: lm3532: switch to device_for_each_child_node_scoped()
      leds: lm3697: switch to device_for_each_child_node_scoped()
      leds: lp50xx: switch to device_for_each_child_node_scoped()
      leds: max77650: switch to device_for_each_child_node_scoped()
      leds: ns2: switch to device_for_each_child_node_scoped()
      leds: pca963x: switch to device_for_each_child_node_scoped()
      leds: pwm: switch to device_for_each_child_node_scoped()
      leds: sun50i-a100: switch to device_for_each_child_node_scoped()
      leds: tca6507: switch to device_for_each_child_node_scoped()
      leds: rgb: ktd202x: switch to device_for_each_child_node_scoped()
      leds: rgb: mt6370: switch to device_for_each_child_node_scoped()

 drivers/leds/flash/leds-mt6360.c       |  3 +--
 drivers/leds/flash/leds-mt6370-flash.c | 11 +++-------
 drivers/leds/flash/leds-qcom-flash.c   |  4 +---
 drivers/leds/leds-aw200xx.c            |  7 ++-----
 drivers/leds/leds-cr0014114.c          |  4 +---
 drivers/leds/leds-el15203000.c         | 14 ++++---------
 drivers/leds/leds-gpio.c               |  9 +++------
 drivers/leds/leds-lm3532.c             | 18 +++++++----------
 drivers/leds/leds-lm3697.c             | 18 ++++++-----------
 drivers/leds/leds-lp50xx.c             | 21 +++++++------------
 drivers/leds/leds-max77650.c           | 18 ++++++-----------
 drivers/leds/leds-ns2.c                |  7 ++-----
 drivers/leds/leds-pca963x.c            | 11 +++-------
 drivers/leds/leds-pwm.c                | 15 ++++----------
 drivers/leds/leds-sun50i-a100.c        | 27 +++++++++----------------
 drivers/leds/leds-tca6507.c            |  7 ++-----
 drivers/leds/rgb/leds-ktd202x.c        |  8 +++-----
 drivers/leds/rgb/leds-mt6370-rgb.c     | 37 ++++++++++------------------------
 18 files changed, 75 insertions(+), 164 deletions(-)
---
base-commit: 92fc9636d1471b7f68bfee70c776f7f77e747b97
change-id: 20240926-leds_device_for_each_child_node_scoped-5a95255413fa

Best regards,
-- 
Javier Carrasco <javier.carrasco.cruz at gmail.com>



From javier.carrasco.cruz at gmail.com  Thu Sep 26 16:20:52 2024
From: javier.carrasco.cruz at gmail.com (Javier Carrasco)
Date: Fri, 27 Sep 2024 01:20:52 +0200
Subject: [PATCH 01/18] leds: flash: mt6360: fix
 device_for_each_child_node() refcounting in error paths
In-Reply-To: <20240927-leds_device_for_each_child_node_scoped-v1-0-95c0614b38c8@gmail.com>
References: <20240927-leds_device_for_each_child_node_scoped-v1-0-95c0614b38c8@gmail.com>
Message-ID: <20240927-leds_device_for_each_child_node_scoped-v1-1-95c0614b38c8@gmail.com>

The device_for_each_child_node() macro requires explicit calls to
fwnode_handle_put() upon early exits to avoid memory leaks, and in
this case the error paths are handled after jumping to
'out_flash_realease', which misses that required call to
to decrement the refcount of the child node.

A more elegant and robust solution is using the scoped variant of the
loop, which automatically handles such early exits.

Fix the child node refcounting in the error paths by using
device_for_each_child_node_scoped().

Cc: stable at vger.kernel.org
Fixes: 679f8652064b ("leds: Add mt6360 driver")
Signed-off-by: Javier Carrasco <javier.carrasco.cruz at gmail.com>
---
 drivers/leds/flash/leds-mt6360.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/drivers/leds/flash/leds-mt6360.c b/drivers/leds/flash/leds-mt6360.c
index 4c74f1cf01f0..676236c19ec4 100644
--- a/drivers/leds/flash/leds-mt6360.c
+++ b/drivers/leds/flash/leds-mt6360.c
@@ -784,7 +784,6 @@ static void mt6360_v4l2_flash_release(struct mt6360_priv *priv)
 static int mt6360_led_probe(struct platform_device *pdev)
 {
 	struct mt6360_priv *priv;
-	struct fwnode_handle *child;
 	size_t count;
 	int i = 0, ret;
 
@@ -811,7 +810,7 @@ static int mt6360_led_probe(struct platform_device *pdev)
 		return -ENODEV;
 	}
 
-	device_for_each_child_node(&pdev->dev, child) {
+	device_for_each_child_node_scoped(&pdev->dev, child) {
 		struct mt6360_led *led = priv->leds + i;
 		struct led_init_data init_data = { .fwnode = child, };
 		u32 reg, led_color;

-- 
2.43.0



From javier.carrasco.cruz at gmail.com  Thu Sep 26 16:20:53 2024
From: javier.carrasco.cruz at gmail.com (Javier Carrasco)
Date: Fri, 27 Sep 2024 01:20:53 +0200
Subject: [PATCH 02/18] leds: flash: mt6370: switch to
 device_for_each_child_node_scoped()
In-Reply-To: <20240927-leds_device_for_each_child_node_scoped-v1-0-95c0614b38c8@gmail.com>
References: <20240927-leds_device_for_each_child_node_scoped-v1-0-95c0614b38c8@gmail.com>
Message-ID: <20240927-leds_device_for_each_child_node_scoped-v1-2-95c0614b38c8@gmail.com>

Switch to device_for_each_child_node_scoped() to simplify the code by
removing the need for calls to fwnode_handle_put() in the error paths.

This also prevents possible memory leaks if new error paths are added
without the required call to fwnode_handle_put().

Signed-off-by: Javier Carrasco <javier.carrasco.cruz at gmail.com>
---
 drivers/leds/flash/leds-mt6370-flash.c | 11 +++--------
 1 file changed, 3 insertions(+), 8 deletions(-)

diff --git a/drivers/leds/flash/leds-mt6370-flash.c b/drivers/leds/flash/leds-mt6370-flash.c
index 912d9d622320..dbdbe92309db 100644
--- a/drivers/leds/flash/leds-mt6370-flash.c
+++ b/drivers/leds/flash/leds-mt6370-flash.c
@@ -509,7 +509,6 @@ static int mt6370_led_probe(struct platform_device *pdev)
 {
 	struct device *dev = &pdev->dev;
 	struct mt6370_priv *priv;
-	struct fwnode_handle *child;
 	size_t count;
 	int i = 0, ret;
 
@@ -529,22 +528,18 @@ static int mt6370_led_probe(struct platform_device *pdev)
 	if (!priv->regmap)
 		return dev_err_probe(dev, -ENODEV, "Failed to get parent regmap\n");
 
-	device_for_each_child_node(dev, child) {
+	device_for_each_child_node_scoped(dev, child) {
 		struct mt6370_led *led = priv->leds + i;
 
 		led->priv = priv;
 
 		ret = mt6370_init_flash_properties(dev, led, child);
-		if (ret) {
-			fwnode_handle_put(child);
+		if (ret)
 			return ret;
-		}
 
 		ret = mt6370_led_register(dev, led, child);
-		if (ret) {
-			fwnode_handle_put(child);
+		if (ret)
 			return ret;
-		}
 
 		i++;
 	}

-- 
2.43.0



From javier.carrasco.cruz at gmail.com  Thu Sep 26 16:20:54 2024
From: javier.carrasco.cruz at gmail.com (Javier Carrasco)
Date: Fri, 27 Sep 2024 01:20:54 +0200
Subject: [PATCH 03/18] leds: flash: leds-qcom-flash: switch to
 device_for_each_child_node_scoped()
In-Reply-To: <20240927-leds_device_for_each_child_node_scoped-v1-0-95c0614b38c8@gmail.com>
References: <20240927-leds_device_for_each_child_node_scoped-v1-0-95c0614b38c8@gmail.com>
Message-ID: <20240927-leds_device_for_each_child_node_scoped-v1-3-95c0614b38c8@gmail.com>

Switch to device_for_each_child_node_scoped() to simplify the code by
removing the need for calls to fwnode_handle_put() in the error paths.

This also prevents possible memory leaks if new error paths are added
without the required call to fwnode_handle_put().

Signed-off-by: Javier Carrasco <javier.carrasco.cruz at gmail.com>
---
 drivers/leds/flash/leds-qcom-flash.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/drivers/leds/flash/leds-qcom-flash.c b/drivers/leds/flash/leds-qcom-flash.c
index 41ce034f700e..ab848c5acd2d 100644
--- a/drivers/leds/flash/leds-qcom-flash.c
+++ b/drivers/leds/flash/leds-qcom-flash.c
@@ -812,7 +812,6 @@ static int qcom_flash_led_probe(struct platform_device *pdev)
 {
 	struct qcom_flash_data *flash_data;
 	struct qcom_flash_led *led;
-	struct fwnode_handle *child;
 	struct device *dev = &pdev->dev;
 	struct regmap *regmap;
 	struct reg_field *regs;
@@ -896,7 +895,7 @@ static int qcom_flash_led_probe(struct platform_device *pdev)
 	if (!flash_data->v4l2_flash)
 		return -ENOMEM;
 
-	device_for_each_child_node(dev, child) {
+	device_for_each_child_node_scoped(dev, child) {
 		led = devm_kzalloc(dev, sizeof(*led), GFP_KERNEL);
 		if (!led) {
 			rc = -ENOMEM;
@@ -914,7 +913,6 @@ static int qcom_flash_led_probe(struct platform_device *pdev)
 	return 0;
 
 release:
-	fwnode_handle_put(child);
 	while (flash_data->v4l2_flash[flash_data->leds_count] && flash_data->leds_count)
 		v4l2_flash_release(flash_data->v4l2_flash[flash_data->leds_count--]);
 	return rc;

-- 
2.43.0



From javier.carrasco.cruz at gmail.com  Thu Sep 26 16:20:55 2024
From: javier.carrasco.cruz at gmail.com (Javier Carrasco)
Date: Fri, 27 Sep 2024 01:20:55 +0200
Subject: [PATCH 04/18] leds: aw200xx: switch to
 device_for_each_child_node_scoped()
In-Reply-To: <20240927-leds_device_for_each_child_node_scoped-v1-0-95c0614b38c8@gmail.com>
References: <20240927-leds_device_for_each_child_node_scoped-v1-0-95c0614b38c8@gmail.com>
Message-ID: <20240927-leds_device_for_each_child_node_scoped-v1-4-95c0614b38c8@gmail.com>

Switch to device_for_each_child_node_scoped() to simplify the code by
removing the need for calls to fwnode_handle_put() in the error paths.

This also prevents possible memory leaks if new error paths are added
without the required call to fwnode_handle_put().

Signed-off-by: Javier Carrasco <javier.carrasco.cruz at gmail.com>
---
 drivers/leds/leds-aw200xx.c | 7 ++-----
 1 file changed, 2 insertions(+), 5 deletions(-)

diff --git a/drivers/leds/leds-aw200xx.c b/drivers/leds/leds-aw200xx.c
index f9d9844e0273..08cca128458c 100644
--- a/drivers/leds/leds-aw200xx.c
+++ b/drivers/leds/leds-aw200xx.c
@@ -409,7 +409,6 @@ static int aw200xx_probe_get_display_rows(struct device *dev,
 
 static int aw200xx_probe_fw(struct device *dev, struct aw200xx *chip)
 {
-	struct fwnode_handle *child;
 	u32 current_min, current_max, min_uA;
 	int ret;
 	int i;
@@ -424,7 +423,7 @@ static int aw200xx_probe_fw(struct device *dev, struct aw200xx *chip)
 	min_uA = UINT_MAX;
 	i = 0;
 
-	device_for_each_child_node(dev, child) {
+	device_for_each_child_node_scoped(dev, child) {
 		struct led_init_data init_data = {};
 		struct aw200xx_led *led;
 		u32 source, imax;
@@ -468,10 +467,8 @@ static int aw200xx_probe_fw(struct device *dev, struct aw200xx *chip)
 
 		ret = devm_led_classdev_register_ext(dev, &led->cdev,
 						     &init_data);
-		if (ret) {
-			fwnode_handle_put(child);
+		if (ret)
 			break;
-		}
 
 		i++;
 	}

-- 
2.43.0



From javier.carrasco.cruz at gmail.com  Thu Sep 26 16:20:56 2024
From: javier.carrasco.cruz at gmail.com (Javier Carrasco)
Date: Fri, 27 Sep 2024 01:20:56 +0200
Subject: [PATCH 05/18] leds: cr0014114: switch to
 device_for_each_child_node_scoped()
In-Reply-To: <20240927-leds_device_for_each_child_node_scoped-v1-0-95c0614b38c8@gmail.com>
References: <20240927-leds_device_for_each_child_node_scoped-v1-0-95c0614b38c8@gmail.com>
Message-ID: <20240927-leds_device_for_each_child_node_scoped-v1-5-95c0614b38c8@gmail.com>

Switch to device_for_each_child_node_scoped() to simplify the code by
removing the need for calls to fwnode_handle_put() in the error paths.

This also prevents possible memory leaks if new error paths are added
without the required call to fwnode_handle_put().

Signed-off-by: Javier Carrasco <javier.carrasco.cruz at gmail.com>
---
 drivers/leds/leds-cr0014114.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/drivers/leds/leds-cr0014114.c b/drivers/leds/leds-cr0014114.c
index c9914fc51f20..7e51c374edd4 100644
--- a/drivers/leds/leds-cr0014114.c
+++ b/drivers/leds/leds-cr0014114.c
@@ -181,11 +181,10 @@ static int cr0014114_probe_dt(struct cr0014114 *priv)
 {
 	size_t			i = 0;
 	struct cr0014114_led	*led;
-	struct fwnode_handle	*child;
 	struct led_init_data	init_data = {};
 	int			ret;
 
-	device_for_each_child_node(priv->dev, child) {
+	device_for_each_child_node_scoped(priv->dev, child) {
 		led = &priv->leds[i];
 
 		led->priv			  = priv;
@@ -201,7 +200,6 @@ static int cr0014114_probe_dt(struct cr0014114 *priv)
 		if (ret) {
 			dev_err(priv->dev,
 				"failed to register LED device, err %d", ret);
-			fwnode_handle_put(child);
 			return ret;
 		}
 

-- 
2.43.0



From javier.carrasco.cruz at gmail.com  Thu Sep 26 16:20:57 2024
From: javier.carrasco.cruz at gmail.com (Javier Carrasco)
Date: Fri, 27 Sep 2024 01:20:57 +0200
Subject: [PATCH 06/18] leds: el15203000: switch to
 device_for_each_child_node_scoped()
In-Reply-To: <20240927-leds_device_for_each_child_node_scoped-v1-0-95c0614b38c8@gmail.com>
References: <20240927-leds_device_for_each_child_node_scoped-v1-0-95c0614b38c8@gmail.com>
Message-ID: <20240927-leds_device_for_each_child_node_scoped-v1-6-95c0614b38c8@gmail.com>

Switch to device_for_each_child_node_scoped() to simplify the code by
removing the need for calls to fwnode_handle_put() in the error paths.

This also prevents possible memory leaks if new error paths are added
without the required call to fwnode_handle_put().

After switching to the scoped variant, there is no longer need for a
jump to 'err_child_out', as an immediate return is possible.

Signed-off-by: Javier Carrasco <javier.carrasco.cruz at gmail.com>
---
 drivers/leds/leds-el15203000.c | 14 ++++----------
 1 file changed, 4 insertions(+), 10 deletions(-)

diff --git a/drivers/leds/leds-el15203000.c b/drivers/leds/leds-el15203000.c
index d40194a3029f..e26d1654bd0d 100644
--- a/drivers/leds/leds-el15203000.c
+++ b/drivers/leds/leds-el15203000.c
@@ -237,22 +237,20 @@ static int el15203000_pattern_clear(struct led_classdev *ldev)
 static int el15203000_probe_dt(struct el15203000 *priv)
 {
 	struct el15203000_led	*led = priv->leds;
-	struct fwnode_handle	*child;
 	int			ret;
 
-	device_for_each_child_node(priv->dev, child) {
+	device_for_each_child_node_scoped(priv->dev, child) {
 		struct led_init_data init_data = {};
 
 		ret = fwnode_property_read_u32(child, "reg", &led->reg);
 		if (ret) {
 			dev_err(priv->dev, "LED without ID number");
-			goto err_child_out;
+			return ret;
 		}
 
 		if (led->reg > U8_MAX) {
 			dev_err(priv->dev, "LED value %d is invalid", led->reg);
-			ret = -EINVAL;
-			goto err_child_out;
+			return -EINVAL;
 		}
 
 		led->priv			  = priv;
@@ -274,17 +272,13 @@ static int el15203000_probe_dt(struct el15203000 *priv)
 			dev_err(priv->dev,
 				"failed to register LED device %s, err %d",
 				led->ldev.name, ret);
-			goto err_child_out;
+			return ret;
 		}
 
 		led++;
 	}
 
 	return 0;
-
-err_child_out:
-	fwnode_handle_put(child);
-	return ret;
 }
 
 static int el15203000_probe(struct spi_device *spi)

-- 
2.43.0



From javier.carrasco.cruz at gmail.com  Thu Sep 26 16:20:58 2024
From: javier.carrasco.cruz at gmail.com (Javier Carrasco)
Date: Fri, 27 Sep 2024 01:20:58 +0200
Subject: [PATCH 07/18] leds: gpio: switch to
 device_for_each_child_node_scoped()
In-Reply-To: <20240927-leds_device_for_each_child_node_scoped-v1-0-95c0614b38c8@gmail.com>
References: <20240927-leds_device_for_each_child_node_scoped-v1-0-95c0614b38c8@gmail.com>
Message-ID: <20240927-leds_device_for_each_child_node_scoped-v1-7-95c0614b38c8@gmail.com>

Switch to device_for_each_child_node_scoped() to simplify the code by
removing the need for calls to fwnode_handle_put() in the error paths.

This also prevents possible memory leaks if new error paths are added
without the required call to fwnode_handle_put().

Signed-off-by: Javier Carrasco <javier.carrasco.cruz at gmail.com>
---
 drivers/leds/leds-gpio.c | 9 +++------
 1 file changed, 3 insertions(+), 6 deletions(-)

diff --git a/drivers/leds/leds-gpio.c b/drivers/leds/leds-gpio.c
index 4d1612d557c8..7d4488191241 100644
--- a/drivers/leds/leds-gpio.c
+++ b/drivers/leds/leds-gpio.c
@@ -148,7 +148,6 @@ struct gpio_leds_priv {
 
 static struct gpio_leds_priv *gpio_leds_create(struct device *dev)
 {
-	struct fwnode_handle *child;
 	struct gpio_leds_priv *priv;
 	int count, used, ret;
 
@@ -162,7 +161,7 @@ static struct gpio_leds_priv *gpio_leds_create(struct device *dev)
 	priv->num_leds = count;
 	used = 0;
 
-	device_for_each_child_node(dev, child) {
+	device_for_each_child_node_scoped(dev, child) {
 		struct gpio_led_data *led_dat = &priv->leds[used];
 		struct gpio_led led = {};
 
@@ -176,7 +175,6 @@ static struct gpio_leds_priv *gpio_leds_create(struct device *dev)
 		if (IS_ERR(led.gpiod)) {
 			dev_err_probe(dev, PTR_ERR(led.gpiod), "Failed to get GPIO '%pfw'\n",
 				      child);
-			fwnode_handle_put(child);
 			return ERR_CAST(led.gpiod);
 		}
 
@@ -192,10 +190,9 @@ static struct gpio_leds_priv *gpio_leds_create(struct device *dev)
 			led.panic_indicator = 1;
 
 		ret = create_gpio_led(&led, led_dat, dev, child, NULL);
-		if (ret < 0) {
-			fwnode_handle_put(child);
+		if (ret < 0)
 			return ERR_PTR(ret);
-		}
+
 		/* Set gpiod label to match the corresponding LED name. */
 		gpiod_set_consumer_name(led_dat->gpiod,
 					led_dat->cdev.dev->kobj.name);

-- 
2.43.0



From javier.carrasco.cruz at gmail.com  Thu Sep 26 16:20:59 2024
From: javier.carrasco.cruz at gmail.com (Javier Carrasco)
Date: Fri, 27 Sep 2024 01:20:59 +0200
Subject: [PATCH 08/18] leds: lm3532: switch to
 device_for_each_child_node_scoped()
In-Reply-To: <20240927-leds_device_for_each_child_node_scoped-v1-0-95c0614b38c8@gmail.com>
References: <20240927-leds_device_for_each_child_node_scoped-v1-0-95c0614b38c8@gmail.com>
Message-ID: <20240927-leds_device_for_each_child_node_scoped-v1-8-95c0614b38c8@gmail.com>

Switch to device_for_each_child_node_scoped() to simplify the code by
removing the need for calls to fwnode_handle_put() in the error paths.

This also prevents possible memory leaks if new error paths are added
without the required call to fwnode_handle_put().

After switching to the scoped variant, there is no longer need for a
jump to 'child_out', as an immediate return is possible.

Signed-off-by: Javier Carrasco <javier.carrasco.cruz at gmail.com>
---
 drivers/leds/leds-lm3532.c | 18 +++++++-----------
 1 file changed, 7 insertions(+), 11 deletions(-)

diff --git a/drivers/leds/leds-lm3532.c b/drivers/leds/leds-lm3532.c
index 54b5650877f7..24dc8ad27bb3 100644
--- a/drivers/leds/leds-lm3532.c
+++ b/drivers/leds/leds-lm3532.c
@@ -551,7 +551,6 @@ static void gpio_set_low_action(void *data)
 
 static int lm3532_parse_node(struct lm3532_data *priv)
 {
-	struct fwnode_handle *child = NULL;
 	struct lm3532_led *led;
 	int control_bank;
 	u32 ramp_time;
@@ -587,7 +586,7 @@ static int lm3532_parse_node(struct lm3532_data *priv)
 	else
 		priv->runtime_ramp_down = lm3532_get_ramp_index(ramp_time);
 
-	device_for_each_child_node(priv->dev, child) {
+	device_for_each_child_node_scoped(priv->dev, child) {
 		struct led_init_data idata = {
 			.fwnode = child,
 			.default_label = ":",
@@ -599,7 +598,7 @@ static int lm3532_parse_node(struct lm3532_data *priv)
 		ret = fwnode_property_read_u32(child, "reg", &control_bank);
 		if (ret) {
 			dev_err(&priv->client->dev, "reg property missing\n");
-			goto child_out;
+			return ret;
 		}
 
 		if (control_bank > LM3532_CONTROL_C) {
@@ -613,7 +612,7 @@ static int lm3532_parse_node(struct lm3532_data *priv)
 					       &led->mode);
 		if (ret) {
 			dev_err(&priv->client->dev, "ti,led-mode property missing\n");
-			goto child_out;
+			return ret;
 		}
 
 		if (fwnode_property_present(child, "led-max-microamp") &&
@@ -647,7 +646,7 @@ static int lm3532_parse_node(struct lm3532_data *priv)
 						    led->num_leds);
 		if (ret) {
 			dev_err(&priv->client->dev, "led-sources property missing\n");
-			goto child_out;
+			return ret;
 		}
 
 		led->priv = priv;
@@ -657,23 +656,20 @@ static int lm3532_parse_node(struct lm3532_data *priv)
 		if (ret) {
 			dev_err(&priv->client->dev, "led register err: %d\n",
 				ret);
-			goto child_out;
+			return ret;
 		}
 
 		ret = lm3532_init_registers(led);
 		if (ret) {
 			dev_err(&priv->client->dev, "register init err: %d\n",
 				ret);
-			goto child_out;
+			return ret;
 		}
 
 		i++;
 	}
-	return 0;
 
-child_out:
-	fwnode_handle_put(child);
-	return ret;
+	return 0;
 }
 
 static int lm3532_probe(struct i2c_client *client)

-- 
2.43.0



From javier.carrasco.cruz at gmail.com  Thu Sep 26 16:21:00 2024
From: javier.carrasco.cruz at gmail.com (Javier Carrasco)
Date: Fri, 27 Sep 2024 01:21:00 +0200
Subject: [PATCH 09/18] leds: lm3697: switch to
 device_for_each_child_node_scoped()
In-Reply-To: <20240927-leds_device_for_each_child_node_scoped-v1-0-95c0614b38c8@gmail.com>
References: <20240927-leds_device_for_each_child_node_scoped-v1-0-95c0614b38c8@gmail.com>
Message-ID: <20240927-leds_device_for_each_child_node_scoped-v1-9-95c0614b38c8@gmail.com>

Switch to device_for_each_child_node_scoped() to simplify the code by
removing the need for calls to fwnode_handle_put() in the error paths.

This also prevents possible memory leaks if new error paths are added
without the required call to fwnode_handle_put().

After switching to the scoped variant, there is no longer need for a
jump to 'child_out', as an immediate return is possible.

Signed-off-by: Javier Carrasco <javier.carrasco.cruz at gmail.com>
---
 drivers/leds/leds-lm3697.c | 18 ++++++------------
 1 file changed, 6 insertions(+), 12 deletions(-)

diff --git a/drivers/leds/leds-lm3697.c b/drivers/leds/leds-lm3697.c
index 99de2a331727..7ad232780a31 100644
--- a/drivers/leds/leds-lm3697.c
+++ b/drivers/leds/leds-lm3697.c
@@ -202,7 +202,6 @@ static int lm3697_init(struct lm3697 *priv)
 
 static int lm3697_probe_dt(struct lm3697 *priv)
 {
-	struct fwnode_handle *child = NULL;
 	struct device *dev = priv->dev;
 	struct lm3697_led *led;
 	int ret = -EINVAL;
@@ -220,19 +219,18 @@ static int lm3697_probe_dt(struct lm3697 *priv)
 	if (IS_ERR(priv->regulator))
 		priv->regulator = NULL;
 
-	device_for_each_child_node(dev, child) {
+	device_for_each_child_node_scoped(dev, child) {
 		struct led_init_data init_data = {};
 
 		ret = fwnode_property_read_u32(child, "reg", &control_bank);
 		if (ret) {
 			dev_err(dev, "reg property missing\n");
-			goto child_out;
+			return ret;
 		}
 
 		if (control_bank > LM3697_CONTROL_B) {
 			dev_err(dev, "reg property is invalid\n");
-			ret = -EINVAL;
-			goto child_out;
+			return -EINVAL;
 		}
 
 		led = &priv->leds[i];
@@ -262,7 +260,7 @@ static int lm3697_probe_dt(struct lm3697 *priv)
 						    led->num_leds);
 		if (ret) {
 			dev_err(dev, "led-sources property missing\n");
-			goto child_out;
+			return ret;
 		}
 
 		for (j = 0; j < led->num_leds; j++)
@@ -286,17 +284,13 @@ static int lm3697_probe_dt(struct lm3697 *priv)
 						     &init_data);
 		if (ret) {
 			dev_err(dev, "led register err: %d\n", ret);
-			goto child_out;
+			return ret;
 		}
 
 		i++;
 	}
 
-	return ret;
-
-child_out:
-	fwnode_handle_put(child);
-	return ret;
+	return 0;
 }
 
 static int lm3697_probe(struct i2c_client *client)

-- 
2.43.0



From javier.carrasco.cruz at gmail.com  Thu Sep 26 16:21:01 2024
From: javier.carrasco.cruz at gmail.com (Javier Carrasco)
Date: Fri, 27 Sep 2024 01:21:01 +0200
Subject: [PATCH 10/18] leds: lp50xx: switch to
 device_for_each_child_node_scoped()
In-Reply-To: <20240927-leds_device_for_each_child_node_scoped-v1-0-95c0614b38c8@gmail.com>
References: <20240927-leds_device_for_each_child_node_scoped-v1-0-95c0614b38c8@gmail.com>
Message-ID: <20240927-leds_device_for_each_child_node_scoped-v1-10-95c0614b38c8@gmail.com>

Switch to device_for_each_child_node_scoped() to simplify the code by
removing the need for calls to fwnode_handle_put() in the error paths.

This also prevents possible memory leaks if new error paths are added
without the required call to fwnode_handle_put().

After switching to the scoped variant, there is no longer need for a
jump to 'child_out', as an immediate return is possible.

Signed-off-by: Javier Carrasco <javier.carrasco.cruz at gmail.com>
---
 drivers/leds/leds-lp50xx.c | 21 +++++++--------------
 1 file changed, 7 insertions(+), 14 deletions(-)

diff --git a/drivers/leds/leds-lp50xx.c b/drivers/leds/leds-lp50xx.c
index 175d4b06659b..32ca45aec76c 100644
--- a/drivers/leds/leds-lp50xx.c
+++ b/drivers/leds/leds-lp50xx.c
@@ -434,7 +434,6 @@ static int lp50xx_probe_leds(struct fwnode_handle *child, struct lp50xx *priv,
 
 static int lp50xx_probe_dt(struct lp50xx *priv)
 {
-	struct fwnode_handle *child = NULL;
 	struct fwnode_handle *led_node = NULL;
 	struct led_init_data init_data = {};
 	struct led_classdev *led_cdev;
@@ -454,17 +453,17 @@ static int lp50xx_probe_dt(struct lp50xx *priv)
 	if (IS_ERR(priv->regulator))
 		priv->regulator = NULL;
 
-	device_for_each_child_node(priv->dev, child) {
+	device_for_each_child_node_scoped(priv->dev, child) {
 		led = &priv->leds[i];
 		ret = fwnode_property_count_u32(child, "reg");
 		if (ret < 0) {
 			dev_err(priv->dev, "reg property is invalid\n");
-			goto child_out;
+			return ret;
 		}
 
 		ret = lp50xx_probe_leds(child, priv, led, ret);
 		if (ret)
-			goto child_out;
+			return ret;
 
 		init_data.fwnode = child;
 		num_colors = 0;
@@ -475,10 +474,8 @@ static int lp50xx_probe_dt(struct lp50xx *priv)
 		 */
 		mc_led_info = devm_kcalloc(priv->dev, LP50XX_LEDS_PER_MODULE,
 					   sizeof(*mc_led_info), GFP_KERNEL);
-		if (!mc_led_info) {
-			ret = -ENOMEM;
-			goto child_out;
-		}
+		if (!mc_led_info)
+			return -ENOMEM;
 
 		fwnode_for_each_child_node(child, led_node) {
 			ret = fwnode_property_read_u32(led_node, "color",
@@ -486,7 +483,7 @@ static int lp50xx_probe_dt(struct lp50xx *priv)
 			if (ret) {
 				fwnode_handle_put(led_node);
 				dev_err(priv->dev, "Cannot read color\n");
-				goto child_out;
+				return ret;
 			}
 
 			mc_led_info[num_colors].color_index = color_id;
@@ -504,16 +501,12 @@ static int lp50xx_probe_dt(struct lp50xx *priv)
 						       &init_data);
 		if (ret) {
 			dev_err(priv->dev, "led register err: %d\n", ret);
-			goto child_out;
+			return ret;
 		}
 		i++;
 	}
 
 	return 0;
-
-child_out:
-	fwnode_handle_put(child);
-	return ret;
 }
 
 static int lp50xx_probe(struct i2c_client *client)

-- 
2.43.0



From javier.carrasco.cruz at gmail.com  Thu Sep 26 16:21:02 2024
From: javier.carrasco.cruz at gmail.com (Javier Carrasco)
Date: Fri, 27 Sep 2024 01:21:02 +0200
Subject: [PATCH 11/18] leds: max77650: switch to
 device_for_each_child_node_scoped()
In-Reply-To: <20240927-leds_device_for_each_child_node_scoped-v1-0-95c0614b38c8@gmail.com>
References: <20240927-leds_device_for_each_child_node_scoped-v1-0-95c0614b38c8@gmail.com>
Message-ID: <20240927-leds_device_for_each_child_node_scoped-v1-11-95c0614b38c8@gmail.com>

Switch to device_for_each_child_node_scoped() to simplify the code by
removing the need for calls to fwnode_handle_put() in the error paths.

This also prevents possible memory leaks if new error paths are added
without the required call to fwnode_handle_put().

After switching to the scoped variant, there is no longer need for a
jump to 'err_node_out', as an immediate return is possible.

Signed-off-by: Javier Carrasco <javier.carrasco.cruz at gmail.com>
---
 drivers/leds/leds-max77650.c | 18 ++++++------------
 1 file changed, 6 insertions(+), 12 deletions(-)

diff --git a/drivers/leds/leds-max77650.c b/drivers/leds/leds-max77650.c
index 1eeac56b0014..f8c47078a3bb 100644
--- a/drivers/leds/leds-max77650.c
+++ b/drivers/leds/leds-max77650.c
@@ -62,7 +62,6 @@ static int max77650_led_brightness_set(struct led_classdev *cdev,
 
 static int max77650_led_probe(struct platform_device *pdev)
 {
-	struct fwnode_handle *child;
 	struct max77650_led *leds, *led;
 	struct device *dev;
 	struct regmap *map;
@@ -84,14 +83,12 @@ static int max77650_led_probe(struct platform_device *pdev)
 	if (!num_leds || num_leds > MAX77650_LED_NUM_LEDS)
 		return -ENODEV;
 
-	device_for_each_child_node(dev, child) {
+	device_for_each_child_node_scoped(dev, child) {
 		struct led_init_data init_data = {};
 
 		rv = fwnode_property_read_u32(child, "reg", &reg);
-		if (rv || reg >= MAX77650_LED_NUM_LEDS) {
-			rv = -EINVAL;
-			goto err_node_put;
-		}
+		if (rv || reg >= MAX77650_LED_NUM_LEDS)
+			return -EINVAL;
 
 		led = &leds[reg];
 		led->map = map;
@@ -108,23 +105,20 @@ static int max77650_led_probe(struct platform_device *pdev)
 		rv = devm_led_classdev_register_ext(dev, &led->cdev,
 						    &init_data);
 		if (rv)
-			goto err_node_put;
+			return rv;
 
 		rv = regmap_write(map, led->regA, MAX77650_LED_A_DEFAULT);
 		if (rv)
-			goto err_node_put;
+			return rv;
 
 		rv = regmap_write(map, led->regB, MAX77650_LED_B_DEFAULT);
 		if (rv)
-			goto err_node_put;
+			return rv;
 	}
 
 	return regmap_write(map,
 			    MAX77650_REG_CNFG_LED_TOP,
 			    MAX77650_LED_TOP_DEFAULT);
-err_node_put:
-	fwnode_handle_put(child);
-	return rv;
 }
 
 static const struct of_device_id max77650_led_of_match[] = {

-- 
2.43.0



From javier.carrasco.cruz at gmail.com  Thu Sep 26 16:21:03 2024
From: javier.carrasco.cruz at gmail.com (Javier Carrasco)
Date: Fri, 27 Sep 2024 01:21:03 +0200
Subject: [PATCH 12/18] leds: ns2: switch to
 device_for_each_child_node_scoped()
In-Reply-To: <20240927-leds_device_for_each_child_node_scoped-v1-0-95c0614b38c8@gmail.com>
References: <20240927-leds_device_for_each_child_node_scoped-v1-0-95c0614b38c8@gmail.com>
Message-ID: <20240927-leds_device_for_each_child_node_scoped-v1-12-95c0614b38c8@gmail.com>

Switch to device_for_each_child_node_scoped() to simplify the code by
removing the need for calls to fwnode_handle_put() in the error path.

This also prevents possible memory leaks if new error paths are added
without the required call to fwnode_handle_put().

Signed-off-by: Javier Carrasco <javier.carrasco.cruz at gmail.com>
---
 drivers/leds/leds-ns2.c | 7 ++-----
 1 file changed, 2 insertions(+), 5 deletions(-)

diff --git a/drivers/leds/leds-ns2.c b/drivers/leds/leds-ns2.c
index f3010c472bbd..4c6f04a5bd87 100644
--- a/drivers/leds/leds-ns2.c
+++ b/drivers/leds/leds-ns2.c
@@ -238,7 +238,6 @@ static int ns2_led_register(struct device *dev, struct fwnode_handle *node,
 static int ns2_led_probe(struct platform_device *pdev)
 {
 	struct device *dev = &pdev->dev;
-	struct fwnode_handle *child;
 	struct ns2_led *leds;
 	int count;
 	int ret;
@@ -251,12 +250,10 @@ static int ns2_led_probe(struct platform_device *pdev)
 	if (!leds)
 		return -ENOMEM;
 
-	device_for_each_child_node(dev, child) {
+	device_for_each_child_node_scoped(dev, child) {
 		ret = ns2_led_register(dev, child, leds++);
-		if (ret) {
-			fwnode_handle_put(child);
+		if (ret)
 			return ret;
-		}
 	}
 
 	return 0;

-- 
2.43.0



From javier.carrasco.cruz at gmail.com  Thu Sep 26 16:21:04 2024
From: javier.carrasco.cruz at gmail.com (Javier Carrasco)
Date: Fri, 27 Sep 2024 01:21:04 +0200
Subject: [PATCH 13/18] leds: pca963x: switch to
 device_for_each_child_node_scoped()
In-Reply-To: <20240927-leds_device_for_each_child_node_scoped-v1-0-95c0614b38c8@gmail.com>
References: <20240927-leds_device_for_each_child_node_scoped-v1-0-95c0614b38c8@gmail.com>
Message-ID: <20240927-leds_device_for_each_child_node_scoped-v1-13-95c0614b38c8@gmail.com>

Switch to device_for_each_child_node_scoped() to simplify the code by
removing the need for calls to fwnode_handle_put() in the error paths.

This also prevents possible memory leaks if new error paths are added
without the required call to fwnode_handle_put().

After switching to the scoped variant, there is no longer need for a
jump to 'err', as an immediate return is possible.

Signed-off-by: Javier Carrasco <javier.carrasco.cruz at gmail.com>
---
 drivers/leds/leds-pca963x.c | 11 +++--------
 1 file changed, 3 insertions(+), 8 deletions(-)

diff --git a/drivers/leds/leds-pca963x.c b/drivers/leds/leds-pca963x.c
index b53905da3592..050e93b04884 100644
--- a/drivers/leds/leds-pca963x.c
+++ b/drivers/leds/leds-pca963x.c
@@ -306,7 +306,6 @@ static int pca963x_register_leds(struct i2c_client *client,
 	struct pca963x_chipdef *chipdef = chip->chipdef;
 	struct pca963x_led *led = chip->leds;
 	struct device *dev = &client->dev;
-	struct fwnode_handle *child;
 	bool hw_blink;
 	s32 mode2;
 	u32 reg;
@@ -338,7 +337,7 @@ static int pca963x_register_leds(struct i2c_client *client,
 	if (ret < 0)
 		return ret;
 
-	device_for_each_child_node(dev, child) {
+	device_for_each_child_node_scoped(dev, child) {
 		struct led_init_data init_data = {};
 		char default_label[32];
 
@@ -346,8 +345,7 @@ static int pca963x_register_leds(struct i2c_client *client,
 		if (ret || reg >= chipdef->n_leds) {
 			dev_err(dev, "Invalid 'reg' property for node %pfw\n",
 				child);
-			ret = -EINVAL;
-			goto err;
+			return -EINVAL;
 		}
 
 		led->led_num = reg;
@@ -369,16 +367,13 @@ static int pca963x_register_leds(struct i2c_client *client,
 		if (ret) {
 			dev_err(dev, "Failed to register LED for node %pfw\n",
 				child);
-			goto err;
+			return ret;
 		}
 
 		++led;
 	}
 
 	return 0;
-err:
-	fwnode_handle_put(child);
-	return ret;
 }
 
 static int pca963x_suspend(struct device *dev)

-- 
2.43.0



From javier.carrasco.cruz at gmail.com  Thu Sep 26 16:21:05 2024
From: javier.carrasco.cruz at gmail.com (Javier Carrasco)
Date: Fri, 27 Sep 2024 01:21:05 +0200
Subject: [PATCH 14/18] leds: pwm: switch to
 device_for_each_child_node_scoped()
In-Reply-To: <20240927-leds_device_for_each_child_node_scoped-v1-0-95c0614b38c8@gmail.com>
References: <20240927-leds_device_for_each_child_node_scoped-v1-0-95c0614b38c8@gmail.com>
Message-ID: <20240927-leds_device_for_each_child_node_scoped-v1-14-95c0614b38c8@gmail.com>

Switch to device_for_each_child_node_scoped() to simplify the code by
removing the need for calls to fwnode_handle_put() in the error paths.

This also prevents possible memory leaks if new error paths are added
without the required call to fwnode_handle_put().

After switching to the scoped variant, there is no longer need for a
jump to 'err_child_out', as an immediate return is possible.

Signed-off-by: Javier Carrasco <javier.carrasco.cruz at gmail.com>
---
 drivers/leds/leds-pwm.c | 15 ++++-----------
 1 file changed, 4 insertions(+), 11 deletions(-)

diff --git a/drivers/leds/leds-pwm.c b/drivers/leds/leds-pwm.c
index e1b414b40353..7961dca0db2f 100644
--- a/drivers/leds/leds-pwm.c
+++ b/drivers/leds/leds-pwm.c
@@ -140,21 +140,18 @@ static int led_pwm_add(struct device *dev, struct led_pwm_priv *priv,
 
 static int led_pwm_create_fwnode(struct device *dev, struct led_pwm_priv *priv)
 {
-	struct fwnode_handle *fwnode;
 	struct led_pwm led;
 	int ret;
 
-	device_for_each_child_node(dev, fwnode) {
+	device_for_each_child_node_scoped(dev, fwnode) {
 		memset(&led, 0, sizeof(led));
 
 		ret = fwnode_property_read_string(fwnode, "label", &led.name);
 		if (ret && is_of_node(fwnode))
 			led.name = to_of_node(fwnode)->name;
 
-		if (!led.name) {
-			ret = -EINVAL;
-			goto err_child_out;
-		}
+		if (!led.name)
+			return -EINVAL;
 
 		led.active_low = fwnode_property_read_bool(fwnode,
 							   "active-low");
@@ -165,14 +162,10 @@ static int led_pwm_create_fwnode(struct device *dev, struct led_pwm_priv *priv)
 
 		ret = led_pwm_add(dev, priv, &led, fwnode);
 		if (ret)
-			goto err_child_out;
+			return ret;
 	}
 
 	return 0;
-
-err_child_out:
-	fwnode_handle_put(fwnode);
-	return ret;
 }
 
 static int led_pwm_probe(struct platform_device *pdev)

-- 
2.43.0



From javier.carrasco.cruz at gmail.com  Thu Sep 26 16:21:06 2024
From: javier.carrasco.cruz at gmail.com (Javier Carrasco)
Date: Fri, 27 Sep 2024 01:21:06 +0200
Subject: [PATCH 15/18] leds: sun50i-a100: switch to
 device_for_each_child_node_scoped()
In-Reply-To: <20240927-leds_device_for_each_child_node_scoped-v1-0-95c0614b38c8@gmail.com>
References: <20240927-leds_device_for_each_child_node_scoped-v1-0-95c0614b38c8@gmail.com>
Message-ID: <20240927-leds_device_for_each_child_node_scoped-v1-15-95c0614b38c8@gmail.com>

Switch to device_for_each_child_node_scoped() to simplify the code by
removing the need for calls to fwnode_handle_put() in the error paths.

This also prevents possible memory leaks if new error paths are added
without the required call to fwnode_handle_put().

The error handling after 'err_put_child' has been moved to the only goto
that jumps to it (second device_for_each_child_node()), and the call to
fwnode_handle_put() has been removed accordingly.

Signed-off-by: Javier Carrasco <javier.carrasco.cruz at gmail.com>
---
 drivers/leds/leds-sun50i-a100.c | 27 +++++++++------------------
 1 file changed, 9 insertions(+), 18 deletions(-)

diff --git a/drivers/leds/leds-sun50i-a100.c b/drivers/leds/leds-sun50i-a100.c
index 4c468d487486..03f1b6424692 100644
--- a/drivers/leds/leds-sun50i-a100.c
+++ b/drivers/leds/leds-sun50i-a100.c
@@ -392,7 +392,6 @@ static int sun50i_a100_ledc_probe(struct platform_device *pdev)
 	struct sun50i_a100_ledc_led *led;
 	struct device *dev = &pdev->dev;
 	struct sun50i_a100_ledc *priv;
-	struct fwnode_handle *child;
 	struct resource *mem;
 	u32 max_addr = 0;
 	u32 num_leds = 0;
@@ -402,21 +401,17 @@ static int sun50i_a100_ledc_probe(struct platform_device *pdev)
 	 * The maximum LED address must be known in sun50i_a100_ledc_resume() before
 	 * class device registration, so parse and validate the subnodes up front.
 	 */
-	device_for_each_child_node(dev, child) {
+	device_for_each_child_node_scoped(dev, child) {
 		u32 addr, color;
 
 		ret = fwnode_property_read_u32(child, "reg", &addr);
-		if (ret || addr >= LEDC_MAX_LEDS) {
-			fwnode_handle_put(child);
+		if (ret || addr >= LEDC_MAX_LEDS)
 			return dev_err_probe(dev, -EINVAL, "'reg' must be between 0 and %d\n",
 					     LEDC_MAX_LEDS - 1);
-		}
 
 		ret = fwnode_property_read_u32(child, "color", &color);
-		if (ret || color != LED_COLOR_ID_RGB) {
-			fwnode_handle_put(child);
+		if (ret || color != LED_COLOR_ID_RGB)
 			return dev_err_probe(dev, -EINVAL, "'color' must be LED_COLOR_ID_RGB\n");
-		}
 
 		max_addr = max(max_addr, addr);
 		num_leds++;
@@ -502,7 +497,7 @@ static int sun50i_a100_ledc_probe(struct platform_device *pdev)
 		return ret;
 
 	led = priv->leds;
-	device_for_each_child_node(dev, child) {
+	device_for_each_child_node_scoped(dev, child) {
 		struct led_classdev *cdev;
 
 		/* The node was already validated above. */
@@ -527,7 +522,11 @@ static int sun50i_a100_ledc_probe(struct platform_device *pdev)
 		ret = led_classdev_multicolor_register_ext(dev, &led->mc_cdev, &init_data);
 		if (ret) {
 			dev_err_probe(dev, ret, "Failed to register multicolor LED %u", led->addr);
-			goto err_put_child;
+			while (led-- > priv->leds)
+				led_classdev_multicolor_unregister(&led->mc_cdev);
+			sun50i_a100_ledc_suspend(&pdev->dev);
+
+			return ret;
 		}
 
 		led++;
@@ -536,14 +535,6 @@ static int sun50i_a100_ledc_probe(struct platform_device *pdev)
 	dev_info(dev, "Registered %u LEDs\n", num_leds);
 
 	return 0;
-
-err_put_child:
-	fwnode_handle_put(child);
-	while (led-- > priv->leds)
-		led_classdev_multicolor_unregister(&led->mc_cdev);
-	sun50i_a100_ledc_suspend(&pdev->dev);
-
-	return ret;
 }
 
 static void sun50i_a100_ledc_remove(struct platform_device *pdev)

-- 
2.43.0



From javier.carrasco.cruz at gmail.com  Thu Sep 26 16:21:07 2024
From: javier.carrasco.cruz at gmail.com (Javier Carrasco)
Date: Fri, 27 Sep 2024 01:21:07 +0200
Subject: [PATCH 16/18] leds: tca6507: switch to
 device_for_each_child_node_scoped()
In-Reply-To: <20240927-leds_device_for_each_child_node_scoped-v1-0-95c0614b38c8@gmail.com>
References: <20240927-leds_device_for_each_child_node_scoped-v1-0-95c0614b38c8@gmail.com>
Message-ID: <20240927-leds_device_for_each_child_node_scoped-v1-16-95c0614b38c8@gmail.com>

Switch to device_for_each_child_node_scoped() to simplify the code by
removing the need for calls to fwnode_handle_put() in the error path.

This also prevents possible memory leaks if new error paths are added
without the required call to fwnode_handle_put().

Signed-off-by: Javier Carrasco <javier.carrasco.cruz at gmail.com>
---
 drivers/leds/leds-tca6507.c | 7 ++-----
 1 file changed, 2 insertions(+), 5 deletions(-)

diff --git a/drivers/leds/leds-tca6507.c b/drivers/leds/leds-tca6507.c
index 4f22f4224946..acbd8169723c 100644
--- a/drivers/leds/leds-tca6507.c
+++ b/drivers/leds/leds-tca6507.c
@@ -658,7 +658,6 @@ static struct tca6507_platform_data *
 tca6507_led_dt_init(struct device *dev)
 {
 	struct tca6507_platform_data *pdata;
-	struct fwnode_handle *child;
 	struct led_info *tca_leds;
 	int count;
 
@@ -671,7 +670,7 @@ tca6507_led_dt_init(struct device *dev)
 	if (!tca_leds)
 		return ERR_PTR(-ENOMEM);
 
-	device_for_each_child_node(dev, child) {
+	device_for_each_child_node_scoped(dev, child) {
 		struct led_info led;
 		u32 reg;
 		int ret;
@@ -688,10 +687,8 @@ tca6507_led_dt_init(struct device *dev)
 			led.flags |= TCA6507_MAKE_GPIO;
 
 		ret = fwnode_property_read_u32(child, "reg", &reg);
-		if (ret || reg >= NUM_LEDS) {
-			fwnode_handle_put(child);
+		if (ret || reg >= NUM_LEDS)
 			return ERR_PTR(ret ? : -EINVAL);
-		}
 
 		tca_leds[reg] = led;
 	}

-- 
2.43.0



From javier.carrasco.cruz at gmail.com  Thu Sep 26 16:21:08 2024
From: javier.carrasco.cruz at gmail.com (Javier Carrasco)
Date: Fri, 27 Sep 2024 01:21:08 +0200
Subject: [PATCH 17/18] leds: rgb: ktd202x: switch to
 device_for_each_child_node_scoped()
In-Reply-To: <20240927-leds_device_for_each_child_node_scoped-v1-0-95c0614b38c8@gmail.com>
References: <20240927-leds_device_for_each_child_node_scoped-v1-0-95c0614b38c8@gmail.com>
Message-ID: <20240927-leds_device_for_each_child_node_scoped-v1-17-95c0614b38c8@gmail.com>

Switch to device_for_each_child_node_scoped() to simplify the code by
removing the need for calls to fwnode_handle_put() in the error path.

This also prevents possible memory leaks if new error paths are added
without the required call to fwnode_handle_put().

Signed-off-by: Javier Carrasco <javier.carrasco.cruz at gmail.com>
---
 drivers/leds/rgb/leds-ktd202x.c | 8 +++-----
 1 file changed, 3 insertions(+), 5 deletions(-)

diff --git a/drivers/leds/rgb/leds-ktd202x.c b/drivers/leds/rgb/leds-ktd202x.c
index d5c442163c46..04e62faa3a00 100644
--- a/drivers/leds/rgb/leds-ktd202x.c
+++ b/drivers/leds/rgb/leds-ktd202x.c
@@ -495,7 +495,6 @@ static int ktd202x_add_led(struct ktd202x *chip, struct fwnode_handle *fwnode, u
 
 static int ktd202x_probe_fw(struct ktd202x *chip)
 {
-	struct fwnode_handle *child;
 	struct device *dev = chip->dev;
 	int count;
 	int i = 0;
@@ -509,13 +508,12 @@ static int ktd202x_probe_fw(struct ktd202x *chip)
 	/* Allow the device to execute the complete reset */
 	usleep_range(200, 300);
 
-	device_for_each_child_node(dev, child) {
+	device_for_each_child_node_scoped(dev, child) {
 		int ret = ktd202x_add_led(chip, child, i);
 
-		if (ret) {
-			fwnode_handle_put(child);
+		if (ret)
 			return ret;
-		}
+
 		i++;
 	}
 

-- 
2.43.0



From javier.carrasco.cruz at gmail.com  Thu Sep 26 16:21:09 2024
From: javier.carrasco.cruz at gmail.com (Javier Carrasco)
Date: Fri, 27 Sep 2024 01:21:09 +0200
Subject: [PATCH 18/18] leds: rgb: mt6370: switch to
 device_for_each_child_node_scoped()
In-Reply-To: <20240927-leds_device_for_each_child_node_scoped-v1-0-95c0614b38c8@gmail.com>
References: <20240927-leds_device_for_each_child_node_scoped-v1-0-95c0614b38c8@gmail.com>
Message-ID: <20240927-leds_device_for_each_child_node_scoped-v1-18-95c0614b38c8@gmail.com>

Switch to device_for_each_child_node_scoped() to simplify the code by
removing the need for calls to fwnode_handle_put() in the error paths.

This also prevents possible memory leaks if new error paths are added
without the required call to fwnode_handle_put().

After switching to the scoped variant, there is no longer need for a
jump to 'fwnode_release', as an immediate return is possible. Given that
the loop is called in the probe function, and it already uses
dev_err_probe(), the common "dev_err() + return" has been updated as
well.

Signed-off-by: Javier Carrasco <javier.carrasco.cruz at gmail.com>
---
 drivers/leds/rgb/leds-mt6370-rgb.c | 37 +++++++++++--------------------------
 1 file changed, 11 insertions(+), 26 deletions(-)

diff --git a/drivers/leds/rgb/leds-mt6370-rgb.c b/drivers/leds/rgb/leds-mt6370-rgb.c
index 359ef00498b4..fe76e8e27f9c 100644
--- a/drivers/leds/rgb/leds-mt6370-rgb.c
+++ b/drivers/leds/rgb/leds-mt6370-rgb.c
@@ -905,7 +905,6 @@ static int mt6370_leds_probe(struct platform_device *pdev)
 {
 	struct device *dev = &pdev->dev;
 	struct mt6370_priv *priv;
-	struct fwnode_handle *child;
 	size_t count;
 	unsigned int i = 0;
 	int ret;
@@ -936,37 +935,27 @@ static int mt6370_leds_probe(struct platform_device *pdev)
 	if (ret)
 		return dev_err_probe(dev, ret, "Failed to allocate regmap field\n");
 
-	device_for_each_child_node(dev, child) {
+	device_for_each_child_node_scoped(dev, child) {
 		struct mt6370_led *led = priv->leds + i++;
 		struct led_init_data init_data = { .fwnode = child };
 		u32 reg, color;
 
 		ret = fwnode_property_read_u32(child, "reg", &reg);
-		if (ret) {
-			dev_err(dev, "Failed to parse reg property\n");
-			goto fwnode_release;
-		}
+		if (ret)
+			dev_err_probe(dev, ret, "Failed to parse reg property\n");
 
-		if (reg >= MT6370_MAX_LEDS) {
-			ret = -EINVAL;
-			dev_err(dev, "Error reg property number\n");
-			goto fwnode_release;
-		}
+		if (reg >= MT6370_MAX_LEDS)
+			return dev_err_probe(dev, -EINVAL, "Error reg property number\n");
 
 		ret = fwnode_property_read_u32(child, "color", &color);
-		if (ret) {
-			dev_err(dev, "Failed to parse color property\n");
-			goto fwnode_release;
-		}
+		if (ret)
+			return dev_err_probe(dev, ret, "Failed to parse color property\n");
 
 		if (color == LED_COLOR_ID_RGB || color == LED_COLOR_ID_MULTI)
 			reg = MT6370_VIRTUAL_MULTICOLOR;
 
-		if (priv->leds_active & BIT(reg)) {
-			ret = -EINVAL;
-			dev_err(dev, "Duplicate reg property\n");
-			goto fwnode_release;
-		}
+		if (priv->leds_active & BIT(reg))
+			return dev_err_probe(dev, -EINVAL, "Duplicate reg property\n");
 
 		priv->leds_active |= BIT(reg);
 
@@ -975,18 +964,14 @@ static int mt6370_leds_probe(struct platform_device *pdev)
 
 		ret = mt6370_init_led_properties(dev, led, &init_data);
 		if (ret)
-			goto fwnode_release;
+			return ret;
 
 		ret = mt6370_led_register(dev, led, &init_data);
 		if (ret)
-			goto fwnode_release;
+			return ret;
 	}
 
 	return 0;
-
-fwnode_release:
-	fwnode_handle_put(child);
-	return ret;
 }
 
 static const struct of_device_id mt6370_rgbled_device_table[] = {

-- 
2.43.0



From lkp at intel.com  Thu Sep 26 16:56:48 2024
From: lkp at intel.com (kernel test robot)
Date: Fri, 27 Sep 2024 07:56:48 +0800
Subject: [PATCH] mmc: mtk-sd: Implement Host Software Queue for eMMC and
 SD Card
In-Reply-To: <20240925113949.149655-1-angelogioacchino.delregno@collabora.com>
References: <20240925113949.149655-1-angelogioacchino.delregno@collabora.com>
Message-ID: <202409270757.fiwHeAaN-lkp@intel.com>

Hi AngeloGioacchino,

kernel test robot noticed the following build errors:

[auto build test ERROR on linus/master]
[also build test ERROR on v6.11 next-20240926]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/AngeloGioacchino-Del-Regno/mmc-mtk-sd-Implement-Host-Software-Queue-for-eMMC-and-SD-Card/20240925-200025
base:   linus/master
patch link:    https://lore.kernel.org/r/20240925113949.149655-1-angelogioacchino.delregno%40collabora.com
patch subject: [PATCH] mmc: mtk-sd: Implement Host Software Queue for eMMC and SD Card
config: arm-randconfig-002-20240927 (https://download.01.org/0day-ci/archive/20240927/202409270757.fiwHeAaN-lkp at intel.com/config)
compiler: arm-linux-gnueabi-gcc (GCC) 14.1.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240927/202409270757.fiwHeAaN-lkp at intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp at intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202409270757.fiwHeAaN-lkp at intel.com/

All errors (new ones prefixed by >>, old ones prefixed by <<):

>> ERROR: modpost: "mmc_hsq_init" [drivers/mmc/host/mtk-sd.ko] undefined!
>> ERROR: modpost: "mmc_hsq_suspend" [drivers/mmc/host/mtk-sd.ko] undefined!
>> ERROR: modpost: "mmc_hsq_resume" [drivers/mmc/host/mtk-sd.ko] undefined!
>> ERROR: modpost: "mmc_hsq_finalize_request" [drivers/mmc/host/mtk-sd.ko] undefined!

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki


From ck.hu at mediatek.com  Thu Sep 26 18:14:38 2024
From: ck.hu at mediatek.com (=?utf-8?B?Q0sgSHUgKOiDoeS/iuWFiSk=?=)
Date: Fri, 27 Sep 2024 01:14:38 +0000
Subject: [PATCH v7 1/3] drm/mediatek: ovl: Remove the color format comment
 for ovl_fmt_convert()
In-Reply-To: <20240926102238.24303-2-jason-jh.lin@mediatek.com>
References: <20240926102238.24303-1-jason-jh.lin@mediatek.com>
	 <20240926102238.24303-2-jason-jh.lin@mediatek.com>
Message-ID: <5746a0ed795922315d4264b1e5300fdb9acffa37.camel@mediatek.com>

Hi, Jason:

On Thu, 2024-09-26 at 18:22 +0800, Jason-JH.Lin wrote:
> Since we changed MACROs to be consistent with DRM input color format
> naming, the comment for ovl_fmt_conver() is no longer needed.

Reviewed-by: CK Hu <ck.hu at mediatek.com>

> 
> Fixes: 9f428b95ac89 ("drm/mediatek: Add new color format MACROs in OVL")
> Signed-off-by: Jason-JH.Lin <jason-jh.lin at mediatek.com>
> ---
>  drivers/gpu/drm/mediatek/mtk_disp_ovl.c | 5 -----
>  1 file changed, 5 deletions(-)
> 
> diff --git a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
> index 89b439dcf3a6..4a4bc27a67f0 100644
> --- a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
> +++ b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
> @@ -389,11 +389,6 @@ void mtk_ovl_layer_off(struct device *dev, unsigned int idx,
>  static unsigned int ovl_fmt_convert(struct mtk_disp_ovl *ovl, unsigned int fmt,
>  				    unsigned int blend_mode)
>  {
> -	/* The return value in switch "MEM_MODE_INPUT_FORMAT_XXX"
> -	 * is defined in mediatek HW data sheet.
> -	 * The alphabet order in XXX is no relation to data
> -	 * arrangement in memory.
> -	 */
>  	switch (fmt) {
>  	default:
>  	case DRM_FORMAT_RGB565:

From Moudy.Ho at mediatek.com  Thu Sep 26 19:27:14 2024
From: Moudy.Ho at mediatek.com (=?utf-8?B?TW91ZHkgSG8gKOS9leWul+WOnyk=?=)
Date: Fri, 27 Sep 2024 02:27:14 +0000
Subject: [PATCH 3/6] dt-bindings: display: mediatek: Fix clocks count
 constraint for new SoCs
In-Reply-To: <7a1315ef-4be5-4528-858b-9f07c814636d@collabora.com>
References: <20240924103156.13119-1-macpaul.lin@mediatek.com>
	 <20240924103156.13119-3-macpaul.lin@mediatek.com>
	 <ffc1900b-3921-48ca-a2b2-1b798c57e572@collabora.com>
	 <20240924-commute-collision-13ad39717d31@spud>
	 <2821ef09-1b32-082d-69d1-e09a3a302447@mediatek.com>
	 <20240925-satisfy-epidermal-bd414891479a@spud>
	 <7a1315ef-4be5-4528-858b-9f07c814636d@collabora.com>
Message-ID: <93d9ffbe466ff61d5426b6f158a4b8464f56824d.camel@mediatek.com>

On Thu, 2024-09-26 at 11:38 +0200, AngeloGioacchino Del Regno wrote:
> Il 25/09/24 16:34, Conor Dooley ha scritto:
> > On Wed, Sep 25, 2024 at 04:42:59PM +0800, Macpaul Lin wrote:
> > > 
> > > On 9/25/24 00:00, Conor Dooley wrote:
> > > > On Tue, Sep 24, 2024 at 01:42:01PM +0200, AngeloGioacchino Del
> > > > Regno wrote:
> > > > > Il 24/09/24 12:31, Macpaul Lin ha scritto:
> > > > > > The display node in mt8195.dtsi was triggering a CHECK_DTBS
> > > > > > error due
> > > > > > to an excessively long 'clocks' property:
> > > > > >      display at 14f06000: clocks: [[31, 14], [31, 43], [31,
> > > > > > 44]] is too long
> > > > > > 
> > > > > > To resolve this issue, add "maxItems: 3" to the 'clocks'
> > > > > > property in
> > > > > > the DT schema.
> > > > > > 
> > > > > > Fixes: 4ed545e7d100 ("dt-bindings: display: mediatek: disp:
> > > > > > split each block to individual yaml")
> > > > > > Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
> > > > > > ---
> > > > > >     .../devicetree/bindings/display/mediatek/mediatek,split
> > > > > > .yaml     | 1 +
> > > > > >     1 file changed, 1 insertion(+)
> > > > > > 
> > > > > > diff --git
> > > > > > a/Documentation/devicetree/bindings/display/mediatek/mediat
> > > > > > ek,split.yaml
> > > > > > b/Documentation/devicetree/bindings/display/mediatek/mediat
> > > > > > ek,split.yaml
> > > > > > index e4affc854f3d..42d2d483cc29 100644
> > > > > > ---
> > > > > > a/Documentation/devicetree/bindings/display/mediatek/mediat
> > > > > > ek,split.yaml
> > > > > > +++
> > > > > > b/Documentation/devicetree/bindings/display/mediatek/mediat
> > > > > > ek,split.yaml
> > > > > > @@ -57,6 +57,7 @@ properties:
> > > > > >       clocks:
> > > > > >         items:
> > > > > >           - description: SPLIT Clock
> > > > > 
> > > > > That's at least confusing (granted that it works) - either
> > > > > add a description for
> > > > > each clock and then set `minItems: 1` (preferred), or remove
> > > > > this "SPLIT Clock"
> > > > > description and allow a maximum of 3 clocks.
> > > > > 
> > > > > Removing the description can be done - IMO - because "SPLIT
> > > > > Clock" is, well,
> > > > > saying that the SPLIT block gets a SPLIT clock ... stating
> > > > > the obvious, anyway.
> > > > 
> > > > Right, but what are the other two new clocks? Are they as
> > > > obvious?
> > > > There's no clock-names here to give any more information as to
> > > > what the
> > > > other clocks are supposed to be.
> > > > 
> > > > Kinda unrelated, but I think that "SPLIT Clock" probably isn't
> > > > what the
> > > > name of the clock in the IP block is anyway, sounds more like
> > > > the name
> > > > for it on the provider end..
> > > 
> > > 
 * Thanks for the suggestions. I think Moudy could help on the new
   fixes
> > > for both DT schem and mt8195.dtsi. This patch could be separated
> > > from
> > > origin patch set.
> > 
> > Not sure what you mean about separating it, if you mean correcting
> > the
> > description for the split clock sure. The other stuff I mentioned
> > needs
> > to be resolved before I'm willing to ack this.
> 
> He means separating this patch from the rest of the series that he
> pushed - which
> is okay, as it's a bit mixed anyway :-)
> 
> Besides ... Moudy, can you please help to clarify the description of
> those clocks?
> 
> Cheers,
> Angelo

Greetings,

May I address the check error by adding 2 functional descriptions and
specifying 'minIeims: 1' for this property, and apply the limit by
setting 'maxItems: 3' in MT8195 additional condition?

Sincerely,
Moudy Ho

From Mark-PK.Tsai at mediatek.com  Thu Sep 26 19:51:38 2024
From: Mark-PK.Tsai at mediatek.com (=?utf-8?B?TWFyay1QSyBUc2FpICjolKHmspvliZsp?=)
Date: Fri, 27 Sep 2024 02:51:38 +0000
Subject: [PATCH] remoteproc: virtio: Add synchronize_cbs to
 remoteproc_virtio
In-Reply-To: <20240920091659.3933-1-mark-pk.tsai@mediatek.com>
References: <20240920091659.3933-1-mark-pk.tsai@mediatek.com>
Message-ID: <109aa022a017648be7b1c583ec21af74d8a23dc7.camel@mediatek.com>

Hi,

Could someone help to review it or provide suggestions?
Any comments are welcome.

This patch is intended to allow the rproc driver to handle the
following use-after-free issue:


### UAF log
[  337.540275][  T470]  virtqueue_add.llvm.10153462284424984632+0xb48/0
xcc4
[  337.546969][  T470]  virtqueue_add_inbuf+0x44/0x6c                
<--- vqs are freed in vring_del_virtqueue
[  337.551755][  T470]  rpmsg_recv_done+0x1fc/0x2c4 [virtio_rpmsg_bus]
[  337.558023][  T470]  vring_interrupt+0xa0/0xe0
[  337.562462][  T470]  rproc_vq_interrupt+0x34/0x48
[  337.567160][  T470]  handle_event+0x28/0x48 [mtk_pqu_rproc]
[  337.572742][  T470]  irq_thread_fn+0x4c/0xcc
[  337.577009][  T470]  irq_thread+0x1d0/0x360
[  337.581189][  T470]  kthread+0x168/0x1cc
[  337.585107][  T470]  ret_from_fork+0x10/0x20

### stack trace of obj free
[  339.253063][  T470] die_helper:       <-
vring_del_virtqueue+0x16c/0x198
[  339.259757][  T470] die_helper:       <- kfree+0x274/0x35c
[  339.265236][  T470] die_helper:       <-
vring_del_virtqueue+0x16c/0x198
[  339.271929][  T470] die_helper:       <-
rproc_virtio_del_vqs+0x3c/0x58
[  339.278535][  T470] die_helper:       <- rpmsg_remove+0x8c/0x12c
[virtio_rpmsg_bus]
[  339.286189][  T470] die_helper:       <-
virtio_dev_remove+0x64/0x174
[  339.292622][  T470] die_helper:       <-
device_release_driver_internal+0x1a8/0x32c
[  339.300270][  T470] die_helper:       <-
bus_remove_device+0x130/0x160
[  339.306789][  T470] die_helper:       <- device_del+0x224/0x518
[  339.312702][  T470] die_helper:       <- device_unregister+0x20/0x3c
[  339.319047][  T470] die_helper:       <-
rproc_remove_virtio_dev+0x20/0x44
[  339.325913][  T470] die_helper:       <-
device_for_each_child+0x84/0x100
[  339.332696][  T470] die_helper:       <-
rproc_vdev_do_stop+0x30/0x5c
[  339.339130][  T470] die_helper:       <- rproc_stop+0xcc/0x200

On Fri, 2024-09-20 at 17:16 +0800, Mark-PK Tsai wrote:
> Add synchornize_cbs to rproc_virtio_config_ops and a
> synchronize_vqs callback to the rproc_ops to ensure vqs'
> state changes are visible in vring_interrupts when the vq is
> broken or removed.
> 
> And when VIRTIO_HARDEN_NOTIFICATION is not set, call
> rproc_virtio_synchronize_cbs directly in __rproc_virtio_del_vqs
> before virtqueue is free to ensure that rproc_vq_interrupt is
> aware of the virtqueue removal.
> 
> The synchronized_vqs is expected to be implemented in rproc
> driver to ensure that all previous vring_interrupts are handled
> before the vqs are marked as broken or removed.
> 
> Signed-off-by: Mark-PK Tsai <mark-pk.tsai at mediatek.com>
> ---
>  drivers/remoteproc/remoteproc_virtio.c | 12 ++++++++++++
>  include/linux/remoteproc.h             |  4 ++++
>  2 files changed, 16 insertions(+)
> 
> diff --git a/drivers/remoteproc/remoteproc_virtio.c
> b/drivers/remoteproc/remoteproc_virtio.c
> index d3f39009b28e..e18258b69851 100644
> --- a/drivers/remoteproc/remoteproc_virtio.c
> +++ b/drivers/remoteproc/remoteproc_virtio.c
> @@ -74,6 +74,14 @@ static bool rproc_virtio_notify(struct virtqueue
> *vq)
>  	return true;
>  }
>  
> +static void rproc_virtio_synchronize_cbs(struct virtio_device *vdev)
> +{
> +	struct rproc *rproc = vdev_to_rproc(vdev);
> +
> +	if (rproc->ops->synchronize_vqs)
> +		rproc->ops->synchronize_vqs(rproc);
> +}
> +
>  /**
>   * rproc_vq_interrupt() - tell remoteproc that a virtqueue is
> interrupted
>   * @rproc: handle to the remote processor
> @@ -171,6 +179,9 @@ static void __rproc_virtio_del_vqs(struct
> virtio_device *vdev)
>  	list_for_each_entry_safe(vq, n, &vdev->vqs, list) {
>  		rvring = vq->priv;
>  		rvring->vq = NULL;
> +#ifndef CONFIG_VIRTIO_HARDEN_NOTIFICATION
> +		rproc_virtio_synchronize_cbs(vdev);
> +#endif
>  		vring_del_virtqueue(vq);
>  	}
>  }
> @@ -334,6 +345,7 @@ static const struct virtio_config_ops
> rproc_virtio_config_ops = {
>  	.get_status	= rproc_virtio_get_status,
>  	.get		= rproc_virtio_get,
>  	.set		= rproc_virtio_set,
> +	.synchronize_cbs = rproc_virtio_synchronize_cbs,
>  };
>  
>  /*
> diff --git a/include/linux/remoteproc.h b/include/linux/remoteproc.h
> index b4795698d8c2..73901678ac7d 100644
> --- a/include/linux/remoteproc.h
> +++ b/include/linux/remoteproc.h
> @@ -381,6 +381,9 @@ enum rsc_handling_status {
>   * @panic:	optional callback to react to system panic, core will
> delay
>   *		panic at least the returned number of milliseconds
>   * @coredump:	  collect firmware dump after the subsystem is
> shutdown
> + * @synchronize_vqs:	optional callback to guarantee all memory
> operations
> + *			on the virtqueue before it are visible to the
> + *			rproc_vq_interrupt().
>   */
>  struct rproc_ops {
>  	int (*prepare)(struct rproc *rproc);
> @@ -403,6 +406,7 @@ struct rproc_ops {
>  	u64 (*get_boot_addr)(struct rproc *rproc, const struct firmware
> *fw);
>  	unsigned long (*panic)(struct rproc *rproc);
>  	void (*coredump)(struct rproc *rproc);
> +	void (*synchronize_vqs)(struct rproc *rproc);
>  };
>  
>  /**


From linyunsheng at huawei.com  Thu Sep 26 20:57:58 2024
From: linyunsheng at huawei.com (Yunsheng Lin)
Date: Fri, 27 Sep 2024 11:57:58 +0800
Subject: [PATCH net v2 2/2] page_pool: fix IOMMU crash when driver has
 already unbound
In-Reply-To: <CAHS8izOxugzWJDTc-4CWqaKABTj=J4OHs=Lcb=SE9r8gX0J+yg@mail.gmail.com>
References: <20240925075707.3970187-1-linyunsheng@huawei.com>
 <20240925075707.3970187-3-linyunsheng@huawei.com>
 <CAHS8izOxugzWJDTc-4CWqaKABTj=J4OHs=Lcb=SE9r8gX0J+yg@mail.gmail.com>
Message-ID: <842c8cc6-f716-437a-bc98-70bc26d6fd38@huawei.com>

On 2024/9/27 2:15, Mina Almasry wrote:
> 
>> In order not to do the dma unmmapping after driver has already
>> unbound and stall the unloading of the networking driver, add
>> the pool->items array to record all the pages including the ones
>> which are handed over to network stack, so the page_pool can
>> do the dma unmmapping for those pages when page_pool_destroy()
>> is called.
> 
> One thing I could not understand from looking at the code: if the
> items array is in the struct page_pool, why do you need to modify the
> page_pool entry in the struct page and in the struct net_iov? I think
> the code could be made much simpler if you can remove these changes,
> and you wouldn't need to modify the public api of the page_pool.

As mentioned in [1]:
"There is no space in 'struct page' to track the inflight pages, so
'pp' in 'struct page' is renamed to 'pp_item' to enable the tracking
of inflight page"

As we still need pp for "struct page_pool" for page_pool_put_page()
related API, the container_of() trick is used to get the pp from the
pp_item.

As you had changed 'struct net_iov' to be mirroring the 'struct page',
so change 'struct net_iov' part accordingly.

1. https://lore.kernel.org/all/50a463d5-a5a1-422f-a4f7-d3587b12c265 at huawei.com/

> 
>> As the pool->items need to be large enough to avoid
>> performance degradation, add a 'item_full' stat to indicate the
>> allocation failure due to unavailability of pool->items.
>>
> 
> I'm not sure there is any way to size the pool->items array correctly.

Currently the size of pool->items is calculated in page_pool_create_percpu()
as below, to make sure the size of pool->items is somewhat twice of the
size of pool->ring so that the number of page sitting in the driver's rx
ring waiting for the new packet is the similar to the number of page that is
still being handled in the network stack as most drivers seems to set the
pool->pool_size according to their rx ring size:

+#define PAGE_POOL_MIN_INFLIGHT_ITEMS		512
+	unsigned int item_cnt = (params->pool_size ? : 1024) +
+				PP_ALLOC_CACHE_SIZE + PAGE_POOL_MIN_INFLIGHT_ITEMS;
+	item_cnt = roundup_pow_of_two(item_cnt);

> Can you use a data structure here that can grow? Linked list or
> xarray?
> 
> AFAIU what we want is when the page pool allocates a netmem it will
> add the netmem to the items array, and when the pp releases a netmem
> it will remove it from the array. Both of these operations are slow
> paths, right? So the performance of a data structure more complicated
> than an array may be ok. bench_page_pool_simple will tell for sure.

The question would be why do we need the pool->items to grow with the
additional overhead and complication by dynamic allocation of item, using
complicated data structure and concurrent handling?

As mentioned in [2], it was the existing semantics, but it does not means
we need to keep it. The changing of semantics seems like an advantage
to me, as we are able to limit how many pages is allowed to be used by
a page_pool instance.

2. https://lore.kernel.org/all/2fb8d278-62e0-4a81-a537-8f601f61e81d at huawei.com/

> 
>> Note, the devmem patchset seems to make the bug harder to fix,
>> and may make backporting harder too. As there is no actual user
>> for the devmem and the fixing for devmem is unclear for now,
>> this patch does not consider fixing the case for devmem yet.
>>
> 
> net_iovs don't hit this bug, dma_unmap_page_attrs() is never called on
> them, so no special handling is needed really. However for code

I am really doubtful about your above claim. As at least the below
implementaion of dma_buf_unmap_attachment_unlocked() called in
__net_devmem_dmabuf_binding_free() seems be using the DMA API directly:

https://elixir.bootlin.com/linux/v6.7-rc8/source/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c#L215

Or am I missing something obvious here?

> quality reasons lets try to minimize the number of devmem or memory
> provider checks in the code, if possible.
> 


From wenst at chromium.org  Thu Sep 26 21:00:48 2024
From: wenst at chromium.org (Chen-Yu Tsai)
Date: Fri, 27 Sep 2024 12:00:48 +0800
Subject: [PATCH v8 0/3] Add of_regulator_get_optional() and Fix MTK Power
 Domain Driver
In-Reply-To: <CAPDyKFqoqppLipOG1vK-8oU_6cMdZ3DV5Gxqhs5-+7+cQJ6=qQ@mail.gmail.com>
References: <20240925093807.1026949-1-wenst@chromium.org> <CAPDyKFqoqppLipOG1vK-8oU_6cMdZ3DV5Gxqhs5-+7+cQJ6=qQ@mail.gmail.com>
Message-ID: <CAGXv+5Fot5BVxtAiEj==2u1ew7mGYkrS7=mTqeTMjTiEg8LNag@mail.gmail.com>

On Thu, Sep 26, 2024 at 11:49?PM Ulf Hansson <ulf.hansson at linaro.org> wrote:
>
> On Wed, 25 Sept 2024 at 11:38, Chen-Yu Tsai <wenst at chromium.org> wrote:
> >
> > Hi folks,
> >
> > This series is split off from my "DT hardware prober" series [1].
> >
> > Changes since v7:
> > - Added stub versions for of_regulator_get_optional() for !CONFIG_OF
> >   and !CONFIG_REGULATOR
> > - Added new patches for devres version and converting MTK pmdomain
> >   driver
> >
> > At ELCE, Sebastian told me about his recent work on adding regulator
> > supply support to the Rockchip power domain driver [2], how the MediaTek
> > driver has been using the existing devm_regulator_get() API and
> > reassigning different device nodes to the device doing the lookup, and
> > how the new of_regulator_get_optional() is the proper fit for this.
> >
> > Patch 1 adds a new of_regulator_get_optional() function to look up
> > regulator supplies using device tree nodes.
> >
> > Patch 2 adds a devres version of the aforementioned function at
> > Sebastian's request for the two power domain drivers.
> >
> > Patch 3 converts the MediaTek power domain driver to use function.
> >
> >
> > Each of the latter two patches depend on the previous one at build time.
> > Mark, would it be possible for you to put the two regulator patches
> > on an immutable branch / tag? Otherwise we could have Ulf ack the
> > pmdomain patch and merge it through your tree. Sebastian was fine
> > with converting the rockchip pmdomain some time later.
>
> Thanks for providing some context!
>
> In my opinion I would prefer an immutable branch/tag of the regulator
> core changes, so I can carry the pmdomain changes for MTK through my
> pmdomain tree, but also because I would prefer if Sebastian could make
> the corresponding conversion for the Rockchip pmdomain driver. If this
> can get queued soon, there is really no need to have an intermediate
> step for Rockchip, I think.
>
> Does it make sense - or do you prefer another way forward?

Makes sense to me!

ChenYu


From lkp at intel.com  Thu Sep 26 21:05:28 2024
From: lkp at intel.com (kernel test robot)
Date: Fri, 27 Sep 2024 12:05:28 +0800
Subject: [PATCH] mmc: mtk-sd: Implement Host Software Queue for eMMC and
 SD Card
In-Reply-To: <20240925113949.149655-1-angelogioacchino.delregno@collabora.com>
References: <20240925113949.149655-1-angelogioacchino.delregno@collabora.com>
Message-ID: <202409271143.hRope856-lkp@intel.com>

Hi AngeloGioacchino,

kernel test robot noticed the following build errors:

[auto build test ERROR on linus/master]
[also build test ERROR on v6.11 next-20240926]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/AngeloGioacchino-Del-Regno/mmc-mtk-sd-Implement-Host-Software-Queue-for-eMMC-and-SD-Card/20240925-200025
base:   linus/master
patch link:    https://lore.kernel.org/r/20240925113949.149655-1-angelogioacchino.delregno%40collabora.com
patch subject: [PATCH] mmc: mtk-sd: Implement Host Software Queue for eMMC and SD Card
config: i386-randconfig-001-20240927 (https://download.01.org/0day-ci/archive/20240927/202409271143.hRope856-lkp at intel.com/config)
compiler: clang version 18.1.8 (https://github.com/llvm/llvm-project 3b5b5c1ec4a3095ab096dd780e84d7ab81f3d7ff)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240927/202409271143.hRope856-lkp at intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp at intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202409271143.hRope856-lkp at intel.com/

All errors (new ones prefixed by >>):

>> ld.lld: error: undefined symbol: mmc_hsq_suspend
   >>> referenced by mtk-sd.c:3078 (drivers/mmc/host/mtk-sd.c:3078)
   >>>               drivers/mmc/host/mtk-sd.o:(msdc_runtime_suspend) in archive vmlinux.a
--
>> ld.lld: error: undefined symbol: mmc_hsq_resume
   >>> referenced by mtk-sd.c:3112 (drivers/mmc/host/mtk-sd.c:3112)
   >>>               drivers/mmc/host/mtk-sd.o:(msdc_runtime_resume) in archive vmlinux.a

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki


From wenst at chromium.org  Thu Sep 26 21:38:35 2024
From: wenst at chromium.org (Chen-Yu Tsai)
Date: Fri, 27 Sep 2024 12:38:35 +0800
Subject: [PATCH v8 2/3] regulator: Add devres version of of_regulator_get_optional()
In-Reply-To: <ZvVS7ITg2t-RIh8C@smile.fi.intel.com>
References: <20240925093807.1026949-1-wenst@chromium.org> <20240925093807.1026949-3-wenst@chromium.org>
 <ZvPscRdWlFPmtCyR@smile.fi.intel.com> <CAGXv+5Gf9+rc+vLcr-JFhO561G8dw38ksV3drat+DyCfWEVakQ@mail.gmail.com>
 <ZvVS7ITg2t-RIh8C@smile.fi.intel.com>
Message-ID: <CAGXv+5EV4nNiAneajqr4VBkX4TO3zV76yqBM_u81ZMNjU52Bvw@mail.gmail.com>

On Thu, Sep 26, 2024 at 8:26?PM Andy Shevchenko
<andriy.shevchenko at linux.intel.com> wrote:
>
> On Thu, Sep 26, 2024 at 04:43:52PM +0800, Chen-Yu Tsai wrote:
> > On Wed, Sep 25, 2024 at 6:56?PM Andy Shevchenko
> > <andriy.shevchenko at linux.intel.com> wrote:
> > > On Wed, Sep 25, 2024 at 05:38:05PM +0800, Chen-Yu Tsai wrote:
>
> ...
>
> > > > +#if IS_ENABLED(CONFIG_OF)
> > >
> > > Do we really need this?
> >
> > What's the point of going through devres_* stuff if we already know
> > _of_regulator_get() is going to fail anyway?
>
> With devm_add_action*() this will be other way around and there are plenty of
> APIs done this way. The ifdeffery is simply ugly in the code.

It's still extra code that doesn't get compiled out.

> > Also, _of_regulator_get() does not have a stub version for !CONFIG_OF.
>
> So, what prevents us from adding it?

Because there's no need if the only internal user isn't using it.

I could also move them over to of_regulator.c.

_of_regulator_get() stays internal to that file, and devm_regulator_release()
gets exposed instead.

Does that sound better?

> > > > +static struct regulator *_devm_of_regulator_get(struct device *dev, struct device_node *node,
> > > > +                                             const char *id, int get_type)
> > > > +{
> > > > +     struct regulator **ptr, *regulator;
> > > > +
> > > > +     ptr = devres_alloc(devm_regulator_release, sizeof(*ptr), GFP_KERNEL);
> > > > +     if (!ptr)
> > > > +             return ERR_PTR(-ENOMEM);
> > > > +
> > > > +     regulator = _of_regulator_get(dev, node, id, get_type);
> > > > +     if (!IS_ERR(regulator)) {
> > > > +             *ptr = regulator;
> > > > +             devres_add(dev, ptr);
> > > > +     } else {
> > > > +             devres_free(ptr);
> > > > +     }
> > > > +
> > > > +     return regulator;
> > >
> > > Why not using devm_add_action() / devm_add_action_or_reset()
> > > (whichever suits better here)?
> >
> > Cargo cult from _devm_regulator_get() in this file. However since this is
> > meant to share the same release function, both functions need to use the
> > same mechanism.
> >
> > I could also argue that this is not an action, but an allocation, and so
> > devres_alloc() seems to make more sense.
>
> It's rather matter of the naming of the devm_add_action*() APIs, but again,
> we have plenty of APIs using it when it's allocation and not strictly speaking
> an action.

OK. Still the mechanism used needs to match that of the existing API.
So devres_add() it is for now.

> > > > +}
> > >
> > > > +#endif
>
> ...
>
> > > > +static inline struct regulator *__must_check devm_of_regulator_get_optional(struct device *dev,
> > > > +                                                                         struct device_node *node,
> > > > +                                                                         const char *id)
> > >
> > > I don't know the conventions here, but I find better to have it as
> > >
> > > static inline __must_check struct regulator *
> > > devm_of_regulator_get_optional(struct device *dev, struct device_node *node, const char *id)
> > >
> > > Similar to other stubs and declarations.
> >
> > I don't think there are any conventions. This file already has three types:
> >
> > 1. Wrap the line with the function name on the second line
> > 2. Wrap the arguments; wrapped arguments aligned to the left parenthesis.
> > 3. Wrap the arguments; wrapped arguments aligned with aribtrary number of
> >    tabs.
> >
> > I prefer the way I have put them.
>
> The way you put it despite relaxed limit is slightly harder to read.
> I don't remember many headers that do so-o indented parameters. Besides
> your way defers the burden of resplit to the future in case one more parameter
> needs to be added which will excess the 100 limit.
>
> Also __must_check is somehow misplaced in my opinion (talking from my
> experience and this can be simply checked by grepping other headers).

Seems correct to me. It's between the return type and the function name.
>From the coding style doc:

 __init void * __must_check action(enum magic value, size_t size, u8 count,
                                   char *fmt, ...) __printf(4, 5) __malloc;

The preferred order of elements for a function prototype is:

- storage class (below, ``static __always_inline``, noting that
``__always_inline``
  is technically an attribute but is treated like ``inline``)
- storage class attributes (here, ``__init`` -- i.e. section
declarations, but also
  things like ``__cold``)
- return type (here, ``void *``)
- return type attributes (here, ``__must_check``)
- function name (here, ``action``)
- function parameters (here, ``(enum magic value, size_t size, u8
count, char *fmt, ...)``,
  noting that parameter names should always be included)
- function parameter attributes (here, ``__printf(4, 5)``)
- function behavior attributes (here, ``__malloc``)


> That said, I prefer the way I suggested or something alike.

Two people arguing over style that is not clearly specified in the coding
style doc is probably wasting time. I'll use what `clang-format` gave:

static inline struct regulator *__must_check of_regulator_get_optional(
       struct device *dev, struct device_node *node, const char *id)
static inline struct regulator *__must_check devm_of_regulator_get_optional(
       struct device *dev, struct device_node *node, const char *id)


ChenYu


From vignesh.raman at collabora.com  Thu Sep 26 22:24:14 2024
From: vignesh.raman at collabora.com (Vignesh Raman)
Date: Fri, 27 Sep 2024 10:54:14 +0530
Subject: [PATCH v3] docs/gpu: ci: update flake tests requirements
Message-ID: <20240927052416.1833889-1-vignesh.raman@collabora.com>

Update the documentation to specify linking to a relevant GitLab
issue or email report for each new flake entry. Added specific
GitLab issue urls for i915, msm and amdgpu driver.

Acked-by: Abhinav Kumar <quic_abhinavk at quicinc.com> # msm
Acked-by: Dmitry Baryshkov <dmitry.baryshkov at linaro.org> # msm
Signed-off-by: Vignesh Raman <vignesh.raman at collabora.com>
---

v2:
- Add gitlab issue link for msm driver.

v3:
- Update docs to specify we use email reporting or GitLab issues for flake entries.

---
 Documentation/gpu/automated_testing.rst | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/Documentation/gpu/automated_testing.rst b/Documentation/gpu/automated_testing.rst
index 2d5a28866afe..03769b4a17cf 100644
--- a/Documentation/gpu/automated_testing.rst
+++ b/Documentation/gpu/automated_testing.rst
@@ -68,19 +68,24 @@ known to behave unreliably. These tests won't cause a job to fail regardless of
 the result. They will still be run.
 
 Each new flake entry must be associated with a link to the email reporting the
-bug to the author of the affected driver, the board name or Device Tree name of
-the board, the first kernel version affected, the IGT version used for tests,
-and an approximation of the failure rate.
+bug to the author of the affected driver or the relevant GitLab issue. The entry
+must also include the board name or Device Tree name, the first kernel version
+affected, the IGT version used for tests, and an approximation of the failure rate.
 
 They should be provided under the following format::
 
-  # Bug Report: $LORE_OR_PATCHWORK_URL
+  # Bug Report: $LORE_URL_OR_GITLAB_ISSUE
   # Board Name: broken-board.dtb
   # Linux Version: 6.6-rc1
   # IGT Version: 1.28-gd2af13d9f
   # Failure Rate: 100
   flaky-test
 
+Use the appropriate link below to create a GitLab issue:
+amdgpu driver: https://gitlab.freedesktop.org/drm/amd/-/issues
+i915 driver: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues
+msm driver: https://gitlab.freedesktop.org/drm/msm/-/issues
+
 drivers/gpu/drm/ci/${DRIVER_NAME}-${HW_REVISION}-skips.txt
 -----------------------------------------------------------
 
-- 
2.43.0



From moudy.ho at mediatek.com  Thu Sep 26 22:51:40 2024
From: moudy.ho at mediatek.com (Moudy Ho)
Date: Fri, 27 Sep 2024 13:51:40 +0800
Subject: [PATCH v2] dt-bindings: display: mediatek: split: add clocks count constraint for MT8195
Message-ID: <20240927055140.19688-1-moudy.ho@mediatek.com>

From: Moudy Ho <moudy.ho at mediatek.corp-partner.google.com>

The display node in mt8195.dtsi was triggering a CHECK_DTBS error due
to an excessively long 'clocks' property:
  display at 14f06000: clocks: [[31, 14], [31, 43], [31, 44]] is too long

To resolve this issue, apply the limit by setting 'maxItems: 3' in MT8195
additional condition.

Fixes: 4ed545e7d100 ("dt-bindings: display: mediatek: disp: split each block to individual yaml")
Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
Signed-off-by: Moudy Ho <moudy.ho at mediatek.com>
--
The purpose of this patch is to separate the corrections for
MediaTek SPLIT CHECK_DTBS error from the original mailing list
mentioned below:
https://lore.kernel.org/all/20240924103156.13119-2-macpaul.lin at mediatek.com/

Changes since v1:
  - Adding functional descriptions and quantity restrictions.
---
 .../bindings/display/mediatek/mediatek,split.yaml           | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,split.yaml b/Documentation/devicetree/bindings/display/mediatek/mediatek,split.yaml
index e4affc854f3d..bce1b8b866ce 100644
--- a/Documentation/devicetree/bindings/display/mediatek/mediatek,split.yaml
+++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,split.yaml
@@ -57,6 +57,9 @@ properties:
   clocks:
     items:
       - description: SPLIT Clock
+      - description: HDMI RX Clock
+      - description: HDMI Metadata Clock
+    minItems: 1
 
 required:
   - compatible
@@ -72,6 +75,9 @@ allOf:
             const: mediatek,mt8195-mdp3-split
 
     then:
+      properties:
+        clocks:
+          maxItems: 3
       required:
         - mediatek,gce-client-reg
 
-- 
2.34.1



From almasrymina at google.com  Thu Sep 26 22:54:01 2024
From: almasrymina at google.com (Mina Almasry)
Date: Thu, 26 Sep 2024 22:54:01 -0700
Subject: [PATCH net v2 2/2] page_pool: fix IOMMU crash when driver has
 already unbound
In-Reply-To: <842c8cc6-f716-437a-bc98-70bc26d6fd38@huawei.com>
References: <20240925075707.3970187-1-linyunsheng@huawei.com>
 <20240925075707.3970187-3-linyunsheng@huawei.com> <CAHS8izOxugzWJDTc-4CWqaKABTj=J4OHs=Lcb=SE9r8gX0J+yg@mail.gmail.com>
 <842c8cc6-f716-437a-bc98-70bc26d6fd38@huawei.com>
Message-ID: <CAHS8izN-3Ooiexsr+Xp2234=GqMUy0sTTMqExKVkXAgmjeWQ6w@mail.gmail.com>

On Thu, Sep 26, 2024 at 8:58?PM Yunsheng Lin <linyunsheng at huawei.com> wrote:
>
> On 2024/9/27 2:15, Mina Almasry wrote:
> >
> >> In order not to do the dma unmmapping after driver has already
> >> unbound and stall the unloading of the networking driver, add
> >> the pool->items array to record all the pages including the ones
> >> which are handed over to network stack, so the page_pool can
> >> do the dma unmmapping for those pages when page_pool_destroy()
> >> is called.
> >
> > One thing I could not understand from looking at the code: if the
> > items array is in the struct page_pool, why do you need to modify the
> > page_pool entry in the struct page and in the struct net_iov? I think
> > the code could be made much simpler if you can remove these changes,
> > and you wouldn't need to modify the public api of the page_pool.
>
> As mentioned in [1]:
> "There is no space in 'struct page' to track the inflight pages, so
> 'pp' in 'struct page' is renamed to 'pp_item' to enable the tracking
> of inflight page"
>
> As we still need pp for "struct page_pool" for page_pool_put_page()
> related API, the container_of() trick is used to get the pp from the
> pp_item.
>
> As you had changed 'struct net_iov' to be mirroring the 'struct page',
> so change 'struct net_iov' part accordingly.
>
> 1. https://lore.kernel.org/all/50a463d5-a5a1-422f-a4f7-d3587b12c265 at huawei.com/
>

I'm not sure we need the pages themselves to have the list of pages
that need to be dma unmapped on page_pool_destroy. The pool can have
the list of pages that need to be unmapped on page_pool_destroy, and
the individual pages need not track them, unless I'm missing
something.

> >
> >> As the pool->items need to be large enough to avoid
> >> performance degradation, add a 'item_full' stat to indicate the
> >> allocation failure due to unavailability of pool->items.
> >>
> >
> > I'm not sure there is any way to size the pool->items array correctly.
>
> Currently the size of pool->items is calculated in page_pool_create_percpu()
> as below, to make sure the size of pool->items is somewhat twice of the
> size of pool->ring so that the number of page sitting in the driver's rx
> ring waiting for the new packet is the similar to the number of page that is
> still being handled in the network stack as most drivers seems to set the
> pool->pool_size according to their rx ring size:
>
> +#define PAGE_POOL_MIN_INFLIGHT_ITEMS           512
> +       unsigned int item_cnt = (params->pool_size ? : 1024) +
> +                               PP_ALLOC_CACHE_SIZE + PAGE_POOL_MIN_INFLIGHT_ITEMS;
> +       item_cnt = roundup_pow_of_two(item_cnt);
>

I'm not sure it's OK to add a limitation to the page_pool that it can
only allocate N pages. At the moment, AFAIU, N is unlimited and it may
become a regression if we add a limitation.

> > Can you use a data structure here that can grow? Linked list or
> > xarray?
> >
> > AFAIU what we want is when the page pool allocates a netmem it will
> > add the netmem to the items array, and when the pp releases a netmem
> > it will remove it from the array. Both of these operations are slow
> > paths, right? So the performance of a data structure more complicated
> > than an array may be ok. bench_page_pool_simple will tell for sure.
>
> The question would be why do we need the pool->items to grow with the
> additional overhead and complication by dynamic allocation of item, using
> complicated data structure and concurrent handling?
>
> As mentioned in [2], it was the existing semantics, but it does not means
> we need to keep it. The changing of semantics seems like an advantage
> to me, as we are able to limit how many pages is allowed to be used by
> a page_pool instance.
>
> 2. https://lore.kernel.org/all/2fb8d278-62e0-4a81-a537-8f601f61e81d at huawei.com/
>
> >
> >> Note, the devmem patchset seems to make the bug harder to fix,
> >> and may make backporting harder too. As there is no actual user
> >> for the devmem and the fixing for devmem is unclear for now,
> >> this patch does not consider fixing the case for devmem yet.
> >>
> >
> > net_iovs don't hit this bug, dma_unmap_page_attrs() is never called on
> > them, so no special handling is needed really. However for code
>
> I am really doubtful about your above claim. As at least the below
> implementaion of dma_buf_unmap_attachment_unlocked() called in
> __net_devmem_dmabuf_binding_free() seems be using the DMA API directly:
>
> https://elixir.bootlin.com/linux/v6.7-rc8/source/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c#L215
>
> Or am I missing something obvious here?
>

I mean currently net_iovs don't hit the __page_pool_release_page_dma
function that causes the crash in the stack trace. The dmabuf layer
handles the unmapping when the dmabuf dies (I assume correctly).

-- 
Thanks,
Mina


From jens.wiklander at linaro.org  Thu Sep 26 23:16:42 2024
From: jens.wiklander at linaro.org (Jens Wiklander)
Date: Fri, 27 Sep 2024 08:16:42 +0200
Subject: [Linaro-mm-sig] Re: [RFC PATCH 0/4] Linaro restricted heap
In-Reply-To: <2ab11399-ffa0-4940-a965-fb95a5f3b20e@amd.com>
References: <20240830070351.2855919-1-jens.wiklander@linaro.org>
 <dhxvyshwi4qmcmwceokhqey2ww4azjcs6qrpnkgivdj7tv5cke@r36srvvbof6q>
 <d8e0cb78-7cfb-42bf-b3a5-f765592e8dd4@ti.com> <mzur3odofwwrdqnystozjgf3qtvb73wqjm6g2vf5dfsqiehaxk@u67fcarhm6ge>
 <e967e382-6cca-4dee-8333-39892d532f71@gmail.com> <lk7a2xuqrctyywuanjwseh5lkcz3soatc2zf3kn3uwc43pdyic@edm3hcd2koas>
 <04caa788-19a6-4336-985c-4eb191c24438@amd.com> <2f9a4abe-b2fc-4bc7-9926-1da2d38f5080@linaro.org>
 <CAFA6WYMd46quafJoGXjkCiPOKpYoDZdXwrNbG3QekyjB3_2FTA@mail.gmail.com> <2ab11399-ffa0-4940-a965-fb95a5f3b20e@amd.com>
Message-ID: <CAHUa44GfsSjE9w4vPcbcESNoDj3exA+tfSxzbJh844CzyBVFtg@mail.gmail.com>

Hi,

On Thu, Sep 26, 2024 at 4:03?PM Christian K?nig
<christian.koenig at amd.com> wrote:
>
> Am 26.09.24 um 15:52 schrieb Sumit Garg:
> > [Resend in plain text format as my earlier message was rejected by
> > some mailing lists]
> >
> > On Thu, 26 Sept 2024 at 19:17, Sumit Garg <sumit.garg at linaro.org> wrote:
> >> On 9/25/24 19:31, Christian K?nig wrote:
> >>
> >> Am 25.09.24 um 14:51 schrieb Dmitry Baryshkov:
> >>
> >> On Wed, Sep 25, 2024 at 10:51:15AM GMT, Christian K?nig wrote:
> >>
> >> Am 25.09.24 um 01:05 schrieb Dmitry Baryshkov:
> >>
> >> On Tue, Sep 24, 2024 at 01:13:18PM GMT, Andrew Davis wrote:
> >>
> >> On 9/23/24 1:33 AM, Dmitry Baryshkov wrote:
> >>
> >> Hi,
> >>
> >> On Fri, Aug 30, 2024 at 09:03:47AM GMT, Jens Wiklander wrote:
> >>
> >> Hi,
> >>
> >> This patch set is based on top of Yong Wu's restricted heap patch set [1].
> >> It's also a continuation on Olivier's Add dma-buf secure-heap patch set [2].
> >>
> >> The Linaro restricted heap uses genalloc in the kernel to manage the heap
> >> carvout. This is a difference from the Mediatek restricted heap which
> >> relies on the secure world to manage the carveout.
> >>
> >> I've tried to adress the comments on [2], but [1] introduces changes so I'm
> >> afraid I've had to skip some comments.
> >>
> >> I know I have raised the same question during LPC (in connection to
> >> Qualcomm's dma-heap implementation). Is there any reason why we are
> >> using generic heaps instead of allocating the dma-bufs on the device
> >> side?
> >>
> >> In your case you already have TEE device, you can use it to allocate and
> >> export dma-bufs, which then get imported by the V4L and DRM drivers.
> >>
> >> This goes to the heart of why we have dma-heaps in the first place.
> >> We don't want to burden userspace with having to figure out the right
> >> place to get a dma-buf for a given use-case on a given hardware.
> >> That would be very non-portable, and fail at the core purpose of
> >> a kernel: to abstract hardware specifics away.
> >>
> >> Unfortunately all proposals to use dma-buf heaps were moving in the
> >> described direction: let app select (somehow) from a platform- and
> >> vendor- specific list of dma-buf heaps. In the kernel we at least know
> >> the platform on which the system is running. Userspace generally doesn't
> >> (and shouldn't). As such, it seems better to me to keep the knowledge in
> >> the kernel and allow userspace do its job by calling into existing
> >> device drivers.
> >>
> >> The idea of letting the kernel fully abstract away the complexity of inter
> >> device data exchange is a completely failed design. There has been plenty of
> >> evidence for that over the years.
> >>
> >> Because of this in DMA-buf it's an intentional design decision that
> >> userspace and *not* the kernel decides where and what to allocate from.
> >>
> >> Hmm, ok.
> >>
> >> What the kernel should provide are the necessary information what type of
> >> memory a device can work with and if certain memory is accessible or not.
> >> This is the part which is unfortunately still not well defined nor
> >> implemented at the moment.
> >>
> >> Apart from that there are a whole bunch of intentional design decision which
> >> should prevent developers to move allocation decision inside the kernel. For
> >> example DMA-buf doesn't know what the content of the buffer is (except for
> >> it's total size) and which use cases a buffer will be used with.
> >>
> >> So the question if memory should be exposed through DMA-heaps or a driver
> >> specific allocator is not a question of abstraction, but rather one of the
> >> physical location and accessibility of the memory.
> >>
> >> If the memory is attached to any physical device, e.g. local memory on a
> >> dGPU, FPGA PCIe BAR, RDMA, camera internal memory etc, then expose the
> >> memory as device specific allocator.
> >>
> >> So, for embedded systems with unified memory all buffers (maybe except
> >> PCIe BARs) should come from DMA-BUF heaps, correct?
> >>
> >>
> >>  From what I know that is correct, yes. Question is really if that will stay this way.
> >>
> >> Neural accelerators look a lot stripped down FPGAs these days and the benefit of local memory for GPUs is known for decades.
> >>
> >> Could be that designs with local specialized memory see a revival any time, who knows.
> >>
> >> If the memory is not physically attached to any device, but rather just
> >> memory attached to the CPU or a system wide memory controller then expose
> >> the memory as DMA-heap with specific requirements (e.g. certain sized pages,
> >> contiguous, restricted, encrypted, ...).
> >>
> >> Is encrypted / protected a part of the allocation contract or should it
> >> be enforced separately via a call to TEE / SCM / anything else?
> >>
> >>
> >> Well that is a really good question I can't fully answer either. From what I know now I would say it depends on the design.
> >>
> > IMHO, I think Dmitry's proposal to rather allow the TEE device to be
> > the allocator and exporter of DMA-bufs related to restricted memory
> > makes sense to me. Since it's really the TEE implementation (OP-TEE,
> > AMD-TEE, TS-TEE or future QTEE) which sets up the restrictions on a
> > particular piece of allocated memory. AFAIK, that happens after the
> > DMA-buf gets allocated and then user-space calls into TEE to set up
> > which media pipeline is going to access that particular DMA-buf. It
> > can also be a static contract depending on a particular platform
> > design.
> >
> > As Jens noted in the other thread, we already manage shared memory
> > allocations (from a static carve-out or dynamically mapped) for
> > communications among Linux and TEE that were based on DMA-bufs earlier
> > but since we didn't required them to be shared with other devices, so
> > we rather switched to anonymous memory.
> >
> >  From user-space perspective, it's cleaner to use TEE device IOCTLs for
> > DMA-buf allocations since it already knows which underlying TEE
> > implementation it's communicating with rather than first figuring out
> > which DMA heap to use for allocation and then communicating with TEE
> > implementation.
>
> +1
>
> I'm not that deeply into the functionality the TEE device IOCTLs expose,
> so can't judge if what's said above is correct or not.
>
> But in general building on top of existing infrastructure and
> information is a really strong argument for a design.
>
> So from my 10 mile high point of view that sounds like the way to go.

That sounds good, I'll prepare another patch set based on that
approach so we can see all the details.

Thanks,
Jens


From brgl at bgdev.pl  Thu Sep 26 23:36:40 2024
From: brgl at bgdev.pl (Bartosz Golaszewski)
Date: Fri, 27 Sep 2024 08:36:40 +0200
Subject: [PATCH 11/18] leds: max77650: switch to device_for_each_child_node_scoped()
In-Reply-To: <20240927-leds_device_for_each_child_node_scoped-v1-11-95c0614b38c8@gmail.com>
References: <20240927-leds_device_for_each_child_node_scoped-v1-0-95c0614b38c8@gmail.com>
 <20240927-leds_device_for_each_child_node_scoped-v1-11-95c0614b38c8@gmail.com>
Message-ID: <CAMRc=MeXxeXq4m4nvb+P2ZQuYbQ18n4572cwkkHG+=U7nfa7Vw@mail.gmail.com>

On Fri, Sep 27, 2024 at 1:21?AM Javier Carrasco
<javier.carrasco.cruz at gmail.com> wrote:
>
> Switch to device_for_each_child_node_scoped() to simplify the code by
> removing the need for calls to fwnode_handle_put() in the error paths.
>
> This also prevents possible memory leaks if new error paths are added
> without the required call to fwnode_handle_put().
>
> After switching to the scoped variant, there is no longer need for a
> jump to 'err_node_out', as an immediate return is possible.
>
> Signed-off-by: Javier Carrasco <javier.carrasco.cruz at gmail.com>
> ---

Acked-by: Bartosz Golaszewski <bartosz.golaszewski at linaro.org>


From macpaul.lin at mediatek.com  Thu Sep 26 23:50:40 2024
From: macpaul.lin at mediatek.com (Macpaul Lin)
Date: Fri, 27 Sep 2024 14:50:40 +0800
Subject: [PATCH v3 4/5] arm64: dts: mt8195: Fix dtbs_check error for mutex node
In-Reply-To: <20240927065041.15247-1-macpaul.lin@mediatek.com>
References: <20240927065041.15247-1-macpaul.lin@mediatek.com>
Message-ID: <20240927065041.15247-4-macpaul.lin@mediatek.com>

The mutex node in mt8195.dtsi was triggering a dtbs_check error:
  mutex at 1c101000: 'clock-names', 'reg-names' do not match any of the
                  regexes: 'pinctrl-[0-9]+'

This seems no need by inspecting the DT schemas and other reference boards,
so drop 'clock-names' and 'reg-names' in mt8195.dtsi.

Fixes: 92d2c23dc269 ("arm64: dts: mt8195: add display node for vdosys1")
Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
---
 arch/arm64/boot/dts/mediatek/mt8195.dtsi | 2 --
 1 file changed, 2 deletions(-)

Changes for v2 and v3:
 - No change.

diff --git a/arch/arm64/boot/dts/mediatek/mt8195.dtsi b/arch/arm64/boot/dts/mediatek/mt8195.dtsi
index 2e1b41359b43..ade685ed2190 100644
--- a/arch/arm64/boot/dts/mediatek/mt8195.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8195.dtsi
@@ -3331,11 +3331,9 @@ &larb19 &larb21 &larb24 &larb25
 		mutex1: mutex at 1c101000 {
 			compatible = "mediatek,mt8195-disp-mutex";
 			reg = <0 0x1c101000 0 0x1000>;
-			reg-names = "vdo1_mutex";
 			interrupts = <GIC_SPI 494 IRQ_TYPE_LEVEL_HIGH 0>;
 			power-domains = <&spm MT8195_POWER_DOMAIN_VDOSYS1>;
 			clocks = <&vdosys1 CLK_VDO1_DISP_MUTEX>;
-			clock-names = "vdo1_mutex";
 			mediatek,gce-client-reg = <&gce0 SUBSYS_1c10XXXX 0x1000 0x1000>;
 			mediatek,gce-events = <CMDQ_EVENT_VDO1_STREAM_DONE_ENG_0>;
 		};
-- 
2.45.2



From macpaul.lin at mediatek.com  Thu Sep 26 23:50:38 2024
From: macpaul.lin at mediatek.com (Macpaul Lin)
Date: Fri, 27 Sep 2024 14:50:38 +0800
Subject: [PATCH v3 2/5] dt-bindings: iommu: mediatek: Fix interrupt count constraint for new SoCs
In-Reply-To: <20240927065041.15247-1-macpaul.lin@mediatek.com>
References: <20240927065041.15247-1-macpaul.lin@mediatek.com>
Message-ID: <20240927065041.15247-2-macpaul.lin@mediatek.com>

The infra-iommu node in mt8195.dtsi was triggering a CHECK_DTBS error due
to an excessively long 'interrupts' property. The error message was:

  infra-iommu at 10315000: interrupts: [[0, 795, 4, 0], [0, 796, 4, 0],
                     [0, 797, 4, 0], [0, 798, 4, 0], [0, 799, 4, 0]]
                     is too long

To address this issue, update the compatbile matching rule for
'interrupts' property. This change allows flexibility in the number
of interrupts for new SoCs like MT8195.
The purpose of these 5 interrupts is also added into description.

Fixes: bca28426805d ("dt-bindings: iommu: mediatek: Convert IOMMU to DT schema")
Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
---
 .../bindings/iommu/mediatek,iommu.yaml        | 25 ++++++++++++++++++-
 1 file changed, 24 insertions(+), 1 deletion(-)

Changes for v2:
 - commit message: re-formatting and add a description of adding 5 interrupts.
 - add 'description' and 'maxItems: 5' for 'interrupt' property of
   'mt8195-iommu-infra'
 - others keeps 'maxItems: 1'

Changes for v3:
 - Refine the description for 'interrupts' property and fixes the compatible
   matching rules.
 - Refine commit message.

diff --git a/Documentation/devicetree/bindings/iommu/mediatek,iommu.yaml b/Documentation/devicetree/bindings/iommu/mediatek,iommu.yaml
index ea6b0f5f24de..10e2bb0f0704 100644
--- a/Documentation/devicetree/bindings/iommu/mediatek,iommu.yaml
+++ b/Documentation/devicetree/bindings/iommu/mediatek,iommu.yaml
@@ -96,7 +96,13 @@ properties:
     maxItems: 1
 
   interrupts:
-    maxItems: 1
+    description: |
+      Usually, the IOMMU requires only 1 interrupt.
+
+      The IOMMU of MT8195 has 5 banks: 0/1/2/3/4.
+      Each bank has a set of APB registers corresponding to the
+      normal world, protected world 1/2/3, and secure world, respectively.
+      Therefore, 5 interrupt numbers are needed for MT8195.
 
   clocks:
     items:
@@ -210,6 +216,23 @@ allOf:
       required:
         - mediatek,larbs
 
+  - if:
+      properties:
+        compatible:
+          contains:
+            enum:
+              - mediatek,mt8195-iommu-infra
+
+    then:
+      properties:
+        interrupts:
+          maxItems: 5
+
+    else:
+      properties:
+        interrupts:
+          maxItems: 1
+
 additionalProperties: false
 
 examples:
-- 
2.45.2



From macpaul.lin at mediatek.com  Thu Sep 26 23:50:37 2024
From: macpaul.lin at mediatek.com (Macpaul Lin)
Date: Fri, 27 Sep 2024 14:50:37 +0800
Subject: [PATCH v3 1/5] arm64: dts: mt8195: Fix dtbs_check error for infracfg_ao node
Message-ID: <20240927065041.15247-1-macpaul.lin@mediatek.com>

The infracfg_ao node in mt8195.dtsi was causing a dtbs_check error.
The error message was:

syscon at 10001000: compatible: ['mediatek,mt8195-infracfg_ao', 'syscon',
                 'simple-mfd'] is too long

To resolve this, remove 'simple-mfd' from the 'compatible' property of the
infracfg_ao node.

Fixes: 37f2582883be ("arm64: dts: Add mediatek SoC mt8195 and evaluation board")
Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
---
 arch/arm64/boot/dts/mediatek/mt8195.dtsi | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Changes for v2 and v3:
 - no change.

diff --git a/arch/arm64/boot/dts/mediatek/mt8195.dtsi b/arch/arm64/boot/dts/mediatek/mt8195.dtsi
index e89ba384c4aa..2e1b41359b43 100644
--- a/arch/arm64/boot/dts/mediatek/mt8195.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8195.dtsi
@@ -487,7 +487,7 @@ topckgen: syscon at 10000000 {
 		};
 
 		infracfg_ao: syscon at 10001000 {
-			compatible = "mediatek,mt8195-infracfg_ao", "syscon", "simple-mfd";
+			compatible = "mediatek,mt8195-infracfg_ao", "syscon";
 			reg = <0 0x10001000 0 0x1000>;
 			#clock-cells = <1>;
 			#reset-cells = <1>;
-- 
2.45.2



From macpaul.lin at mediatek.com  Thu Sep 26 23:50:39 2024
From: macpaul.lin at mediatek.com (Macpaul Lin)
Date: Fri, 27 Sep 2024 14:50:39 +0800
Subject: [PATCH v3 3/5] arm64: dts: mediatek: mt8395-genio-1200-evk: Fix dtbs_check error for phy
In-Reply-To: <20240927065041.15247-1-macpaul.lin@mediatek.com>
References: <20240927065041.15247-1-macpaul.lin@mediatek.com>
Message-ID: <20240927065041.15247-3-macpaul.lin@mediatek.com>

The ethernet-phy node in mt8395-genio-1200-evk.dts was triggering a
dtbs_check error. The error message was:
  eth-phy0 at 1: $nodename:0: 'eth-phy0 at 1' does not match
              '^ethernet-phy(@[a-f0-9]+)?$'
Fix this issue by replacing 'eth-phy' node to generic 'ethernet-phy'.

Fixes: f2b543a191b6 ("arm64: dts: mediatek: add device-tree for Genio 1200 EVK board")
Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
---
 arch/arm64/boot/dts/mediatek/mt8395-genio-1200-evk.dts | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Changes for v2 and v3:
 - No change.

diff --git a/arch/arm64/boot/dts/mediatek/mt8395-genio-1200-evk.dts b/arch/arm64/boot/dts/mediatek/mt8395-genio-1200-evk.dts
index 1ef6262b65c9..b4b48eb93f3c 100644
--- a/arch/arm64/boot/dts/mediatek/mt8395-genio-1200-evk.dts
+++ b/arch/arm64/boot/dts/mediatek/mt8395-genio-1200-evk.dts
@@ -187,7 +187,7 @@ mdio {
 		compatible = "snps,dwmac-mdio";
 		#address-cells = <1>;
 		#size-cells = <0>;
-		eth_phy0: eth-phy0 at 1 {
+		eth_phy0: ethernet-phy at 1 {
 			compatible = "ethernet-phy-id001c.c916";
 			reg = <0x1>;
 		};
-- 
2.45.2



From macpaul.lin at mediatek.com  Thu Sep 26 23:50:41 2024
From: macpaul.lin at mediatek.com (Macpaul Lin)
Date: Fri, 27 Sep 2024 14:50:41 +0800
Subject: [PATCH v3 5/5] dt-bindings: display: mediatek: dpi: correct power-domains property
In-Reply-To: <20240927065041.15247-1-macpaul.lin@mediatek.com>
References: <20240927065041.15247-1-macpaul.lin@mediatek.com>
Message-ID: <20240927065041.15247-5-macpaul.lin@mediatek.com>

The MediaTek DPI module is typically associated with one of the
following multimedia power domains:
 - POWER_DOMAIN_DISPLAY
 - POWER_DOMAIN_VDOSYS
 - POWER_DOMAIN_MM
The specific power domain used varies depending on the SoC design.

These power domains are shared by multiple devices within the SoC.
In most cases, these power domains are enabled by other devices.
As a result, the DPI module of legacy SoCs often functions correctly
even without explicit configuration.

It is recommended to explicitly add the appropriate power domain
property to the DPI node in the device tree. Hence drop the
compatible checking for specific SoCs.

Fixes: 5474d49b2f79 ("dt-bindings: display: mediatek: dpi: Add power domains")
Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
Signed-off-by: Jitao Shi <jitao.shi at mediatek.com>
Signed-off-by: Pablo Sun <pablo.sun at mediatek.com>
---
 .../display/mediatek/mediatek,dpi.yaml        | 24 ++++++++-----------
 1 file changed, 10 insertions(+), 14 deletions(-)

Changes for v2:
 - Because of the corresponding dts fix has been reviewed with a Reviewed-by: tag.
   [1] https://lore.kernel.org/all/20240925080515.16377-1-macpaul.lin at mediatek.com/
   We still need this change to fix the 2 dtbs_check errors.
   So keeps no change here.

Changes for v3:
 - The origin patch is [2]
   https://lore.kernel.org/all/20240926111449.9245-2-macpaul.lin at mediatek.com/
 - Thanks for Conor's reminding, after MediaTek's internal discussion,
   This patch v3 is the replacement of [2] v2.
   Because the DPI module should has a explicit configuration with power domain.
 - Drop Acked-by: tag since v3 is nearly a new patch for different approach.

diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml b/Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml
index 3a82aec9021c..497c0eb4ed0b 100644
--- a/Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml
+++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml
@@ -63,6 +63,16 @@ properties:
       - const: sleep
 
   power-domains:
+    description: |
+      The MediaTek DPI module is typically associated with one of the
+      following multimedia power domains:
+        POWER_DOMAIN_DISPLAY
+        POWER_DOMAIN_VDOSYS
+        POWER_DOMAIN_MM
+      The specific power domain used varies depending on the SoC design.
+
+      It is recommended to explicitly add the appropriate power domain
+      property to the DPI node in the device tree.
     maxItems: 1
 
   port:
@@ -79,20 +89,6 @@ required:
   - clock-names
   - port
 
-allOf:
-  - if:
-      not:
-        properties:
-          compatible:
-            contains:
-              enum:
-                - mediatek,mt6795-dpi
-                - mediatek,mt8173-dpi
-                - mediatek,mt8186-dpi
-    then:
-      properties:
-        power-domains: false
-
 additionalProperties: false
 
 examples:
-- 
2.45.2



From macpaul.lin at mediatek.com  Fri Sep 27 00:02:17 2024
From: macpaul.lin at mediatek.com (Macpaul Lin)
Date: Fri, 27 Sep 2024 15:02:17 +0800
Subject: [PATCH v2 5/5] dt-bindings: display: mediatek: dpi: Add mt8195
 support in power domains
In-Reply-To: <20240926-visible-harmonica-a7cda103ff70@spud>
References: <20240926111449.9245-1-macpaul.lin@mediatek.com>
 <20240926111449.9245-5-macpaul.lin@mediatek.com>
 <20240926-visible-harmonica-a7cda103ff70@spud>
Message-ID: <cada4a75-4b2d-e1b6-bebc-ce15a13a288e@mediatek.com>


On 9/26/24 23:59, Conor Dooley wrote:
> On Thu, Sep 26, 2024 at 07:14:49PM +0800, Macpaul Lin wrote:
>> Add power domain binding to the mediatek DPI controller for MT8185.
> 
> This wording is confusing, no binding is being added here, you're just
> allowing one property.
> 
>> The dpi node in mt8195.dtsi was triggering a dtbs_check error:
>>    dp-intf at 1c113000: power-domains: False schema does not allow [[44, 18]]
> 
> And while it is good to have the warning, it would be better to explain
> here that there are actually power domains, since the dts could be wrong
> here also.

Thanks for the reminder! After MediaTek's internal discussion, a new
patch v3 has been submitted. The details has been written in that patch.

> Otherwise,
> Acked-by: Conor Dooley <conor.dooley at microchip.com>

Since the new patch v3 use a different approach to update the DT Schema,
the "Acked-by:" tag has been dropped, please help to review the 
replacement v3 patch. Thanks!

>> Fixes: 5474d49b2f79 ("dt-bindings: display: mediatek: dpi: Add power domains")
>> Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
>> ---
>>   .../devicetree/bindings/display/mediatek/mediatek,dpi.yaml       | 1 +
>>   1 file changed, 1 insertion(+)
>>
>> Changes for v2:
>>   - Because of the corresponding dts fix has been reviewed with a Reviewed-by: tag.
>>     [1] https://lore.kernel.org/all/20240925080515.16377-1-macpaul.lin at mediatek.com/
>>     We still need this change to fix the 2 dtbs_check errors.
>>     So keeps no change here.
>>

Best regards,
Macpaul Lin


From linyunsheng at huawei.com  Fri Sep 27 00:25:14 2024
From: linyunsheng at huawei.com (Yunsheng Lin)
Date: Fri, 27 Sep 2024 15:25:14 +0800
Subject: [PATCH net v2 2/2] page_pool: fix IOMMU crash when driver has
 already unbound
In-Reply-To: <CAHS8izN-3Ooiexsr+Xp2234=GqMUy0sTTMqExKVkXAgmjeWQ6w@mail.gmail.com>
References: <20240925075707.3970187-1-linyunsheng@huawei.com>
 <20240925075707.3970187-3-linyunsheng@huawei.com>
 <CAHS8izOxugzWJDTc-4CWqaKABTj=J4OHs=Lcb=SE9r8gX0J+yg@mail.gmail.com>
 <842c8cc6-f716-437a-bc98-70bc26d6fd38@huawei.com>
 <CAHS8izN-3Ooiexsr+Xp2234=GqMUy0sTTMqExKVkXAgmjeWQ6w@mail.gmail.com>
Message-ID: <2a495d47-f1ca-42ee-a23d-736d4cd47880@huawei.com>

adding Sumit & Christian & dma-buf maillist

On 2024/9/27 13:54, Mina Almasry wrote:
> On Thu, Sep 26, 2024 at 8:58?PM Yunsheng Lin <linyunsheng at huawei.com> wrote:
>>
>> On 2024/9/27 2:15, Mina Almasry wrote:
>>>
>>>> In order not to do the dma unmmapping after driver has already
>>>> unbound and stall the unloading of the networking driver, add
>>>> the pool->items array to record all the pages including the ones
>>>> which are handed over to network stack, so the page_pool can
>>>> do the dma unmmapping for those pages when page_pool_destroy()
>>>> is called.
>>>
>>> One thing I could not understand from looking at the code: if the
>>> items array is in the struct page_pool, why do you need to modify the
>>> page_pool entry in the struct page and in the struct net_iov? I think
>>> the code could be made much simpler if you can remove these changes,
>>> and you wouldn't need to modify the public api of the page_pool.
>>
>> As mentioned in [1]:
>> "There is no space in 'struct page' to track the inflight pages, so
>> 'pp' in 'struct page' is renamed to 'pp_item' to enable the tracking
>> of inflight page"
>>
>> As we still need pp for "struct page_pool" for page_pool_put_page()
>> related API, the container_of() trick is used to get the pp from the
>> pp_item.
>>
>> As you had changed 'struct net_iov' to be mirroring the 'struct page',
>> so change 'struct net_iov' part accordingly.
>>
>> 1. https://lore.kernel.org/all/50a463d5-a5a1-422f-a4f7-d3587b12c265 at huawei.com/
>>
> 
> I'm not sure we need the pages themselves to have the list of pages
> that need to be dma unmapped on page_pool_destroy. The pool can have
> the list of pages that need to be unmapped on page_pool_destroy, and
> the individual pages need not track them, unless I'm missing
> something.

It is about the pool having the list of pages that need to be unmapped.
The point is that the list of pages that need to be unmapped is dynamic,
it is not a static list:
1. How to find a empty space in the list and add a page to the list?
2. How to find a page in the list and delete it from the list?
3. How to do the about two steps concurrently without obvious overhead?

I am not sure how it is possible to do the above without something like
the 'pp_item' added in this patch? Even the lockless list in the
include/linux/llist.h need a 'struct llist_node' for that to work.
But if it is possible, please share the idea in your mind.

> 
>>>
>>>> As the pool->items need to be large enough to avoid
>>>> performance degradation, add a 'item_full' stat to indicate the
>>>> allocation failure due to unavailability of pool->items.
>>>>
>>>
>>> I'm not sure there is any way to size the pool->items array correctly.
>>
>> Currently the size of pool->items is calculated in page_pool_create_percpu()
>> as below, to make sure the size of pool->items is somewhat twice of the
>> size of pool->ring so that the number of page sitting in the driver's rx
>> ring waiting for the new packet is the similar to the number of page that is
>> still being handled in the network stack as most drivers seems to set the
>> pool->pool_size according to their rx ring size:
>>
>> +#define PAGE_POOL_MIN_INFLIGHT_ITEMS           512
>> +       unsigned int item_cnt = (params->pool_size ? : 1024) +
>> +                               PP_ALLOC_CACHE_SIZE + PAGE_POOL_MIN_INFLIGHT_ITEMS;
>> +       item_cnt = roundup_pow_of_two(item_cnt);
>>
> 
> I'm not sure it's OK to add a limitation to the page_pool that it can
> only allocate N pages. At the moment, AFAIU, N is unlimited and it may
> become a regression if we add a limitation.

Maybe, let's see if there is some stronger argument that it is not ok
to add the limitation or some testing that does show the limitation
does bring a regression.

> 
>>> Can you use a data structure here that can grow? Linked list or
>>> xarray?
>>>
>>> AFAIU what we want is when the page pool allocates a netmem it will
>>> add the netmem to the items array, and when the pp releases a netmem
>>> it will remove it from the array. Both of these operations are slow
>>> paths, right? So the performance of a data structure more complicated
>>> than an array may be ok. bench_page_pool_simple will tell for sure.
>>
>> The question would be why do we need the pool->items to grow with the
>> additional overhead and complication by dynamic allocation of item, using
>> complicated data structure and concurrent handling?
>>
>> As mentioned in [2], it was the existing semantics, but it does not means
>> we need to keep it. The changing of semantics seems like an advantage
>> to me, as we are able to limit how many pages is allowed to be used by
>> a page_pool instance.
>>
>> 2. https://lore.kernel.org/all/2fb8d278-62e0-4a81-a537-8f601f61e81d at huawei.com/
>>
>>>
>>>> Note, the devmem patchset seems to make the bug harder to fix,
>>>> and may make backporting harder too. As there is no actual user
>>>> for the devmem and the fixing for devmem is unclear for now,
>>>> this patch does not consider fixing the case for devmem yet.
>>>>
>>>
>>> net_iovs don't hit this bug, dma_unmap_page_attrs() is never called on
>>> them, so no special handling is needed really. However for code
>>
>> I am really doubtful about your above claim. As at least the below
>> implementaion of dma_buf_unmap_attachment_unlocked() called in
>> __net_devmem_dmabuf_binding_free() seems be using the DMA API directly:
>>
>> https://elixir.bootlin.com/linux/v6.7-rc8/source/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c#L215
>>
>> Or am I missing something obvious here?
>>
> 
> I mean currently net_iovs don't hit the __page_pool_release_page_dma
> function that causes the crash in the stack trace. The dmabuf layer
> handles the unmapping when the dmabuf dies (I assume correctly).

It seems like the similar assumption made about the normal page.
How is dmabuf layer able to handles the unmapping when the driver
which creates the page_pool with the devmem pages has unbound and
the 'struct device' behind the driver has became invalid?

If dmabuf layer is able to handle that, it seems the page_pool may
be able to handle that too. Adding the maintainers of Dma-buf to see
if there is some clarifying from them.

> 


From mripard at kernel.org  Fri Sep 27 00:45:51 2024
From: mripard at kernel.org (Maxime Ripard)
Date: Fri, 27 Sep 2024 07:45:51 +0000
Subject: [PATCH v3] docs/gpu: ci: update flake tests requirements
In-Reply-To: <20240927052416.1833889-1-vignesh.raman@collabora.com>
References: <20240927052416.1833889-1-vignesh.raman@collabora.com>
Message-ID: <545585e6f2e9d0bbe35f0a2785838cfa@kernel.org>

On Fri, 27 Sep 2024 10:54:14 +0530, Vignesh Raman wrote:
> Update the documentation to specify linking to a relevant GitLab
> issue or email report for each new flake entry. Added specific
> GitLab issue urls for i915, msm and amdgpu driver.
> 
> Acked-by: Abhinav Kumar <quic_abhinavk at quicinc.com> # msm
> 
> [ ... ]

Acked-by: Maxime Ripard <mripard at kernel.org>

Thanks!
Maxime


From peter.wang at mediatek.com  Fri Sep 27 00:51:53 2024
From: peter.wang at mediatek.com (=?utf-8?B?UGV0ZXIgV2FuZyAo546L5L+h5Y+LKQ==?=)
Date: Fri, 27 Sep 2024 07:51:53 +0000
Subject: [PATCH v9 2/3] ufs: core: fix error handler process for MCQ abort
In-Reply-To: <108a707e-1118-42f4-8cc9-c1bda9fab451@acm.org>
References: <20240925095546.19492-1-peter.wang@mediatek.com>
	 <20240925095546.19492-3-peter.wang@mediatek.com>
	 <949fb86d-6b61-4a1a-bc04-c05bb30522b9@acm.org>
	 <4bc08986190aecb394f07997b2ad31e301567496.camel@mediatek.com>
	 <108a707e-1118-42f4-8cc9-c1bda9fab451@acm.org>
Message-ID: <134227055619610a781d5e46fb14e689f874b7d4.camel@mediatek.com>

On Thu, 2024-09-26 at 11:26 -0700, Bart Van Assche wrote:
>  	 
> External email : Please do not click links or open attachments until
> you have verified the sender or the content.
>  On 9/25/24 8:45 PM, Peter Wang (???) wrote:
> > diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
> > index 24a32e2fd75e..06aa4ed1a9e6 100644
> > --- a/drivers/ufs/core/ufshcd.c
> > +++ b/drivers/ufs/core/ufshcd.c
> > @@ -5417,10 +5417,12 @@ ufshcd_transfer_rsp_status(struct ufs_hba
> *hba,
> > struct ufshcd_lrb *lrbp,
> >   }
> >   break;
> >   case OCS_ABORTED:
> > -result |= DID_ABORT << 16;
> > -break;
> >   case OCS_INVALID_COMMAND_STATUS:
> >   result |= DID_REQUEUE << 16;
> > +dev_warn(hba->dev,
> > +"OCS %s from controller for tag %d\n",
> > +(ocs == OCS_ABORTED? "aborted" :
> > "invalid"),
> > +lrbp->task_tag);
> >   break;
> >   case OCS_INVALID_CMD_TABLE_ATTR:
> >   case OCS_INVALID_PRDT_ATTR:
> > @@ -6466,26 +6468,12 @@ static bool ufshcd_abort_one(struct request
> > *rq, void *priv)
> >   struct scsi_device *sdev = cmd->device;
> >   struct Scsi_Host *shost = sdev->host;
> >   struct ufs_hba *hba = shost_priv(shost);
> > -struct ufshcd_lrb *lrbp = &hba->lrb[tag];
> > -struct ufs_hw_queue *hwq;
> > -unsigned long flags;
> >   
> >   *ret = ufshcd_try_to_abort_task(hba, tag);
> >   dev_err(hba->dev, "Aborting tag %d / CDB %#02x %s\n", tag,
> >   hba->lrb[tag].cmd ? hba->lrb[tag].cmd->cmnd[0] : -1,
> >   *ret ? "failed" : "succeeded");
> >   
> > -/* Release cmd in MCQ mode if abort succeeds */
> > -if (hba->mcq_enabled && (*ret == 0)) {
> > -hwq = ufshcd_mcq_req_to_hwq(hba, scsi_cmd_to_rq(lrbp-
> >> cmd));
> > -if (!hwq)
> > -return 0;
> > -spin_lock_irqsave(&hwq->cq_lock, flags);
> > -if (ufshcd_cmd_inflight(lrbp->cmd))
> > -ufshcd_release_scsi_cmd(hba, lrbp);
> > -spin_unlock_irqrestore(&hwq->cq_lock, flags);
> > -}
> > -
> >   return *ret == 0;
> >   }
> >   
> > -----------------------------------------------------------------
> ----
> > 
> > 
> > This patch has several advantages:
> > 
> > 1. It makes the patch 'ufs: core: fix the issue of ICU failure'
> >     seem valuable.
> > 2. The patch is more concise.
> > 3. There is no need to fetch OCS to determine OCS: ABORTED
> >     on every CQ completion, which increases ISR time.
> > 4. The err_handler flow for SDB and MCQ would be consistent.
> > 5. There is no need for the MediaTek SDB quirk.
> > 
> > 
> > What do you think?"
> 
> Hi Peter,
> 
> Is the above patch sufficient? In MCQ mode, aborting a command
> happens
> as follows (simplified):
> (1) Send the ABORT TASK TMF. If this TMF succeeds, no SQE will be
>      generated. If this TMF succeeds it means that the SCSI command
> has
>      reached the UFS device and hence is no longer present in any
>      submission queue (SQ).
> (2) If the command is still in a submission queue, nullify the SQE.
> In
>      this case a CQE will be generated with status ABORTED.
> 
> It seems to me that the above patch handles (2) but not (1)?
> 
> Thanks,
> 
> Bart.

Hi Bart,

Regarding your description of 'ABORT TMF success' and 'SQE' 
I think there might be some misunderstanding.

In this section of the UFSHCI 4.0 specification. 
4.4.6 (Informative) Processing Abort in MCQ mode: An Implementation
Example
There are three case for MCQ abort:

1. When the host controller has already sent out the SQE 
   and the UFS device has already responded with the 
   corresponding response, the CQ Entry will automatically 
   increment by 1. This case is the simplest, the SQE 
   will have a corresponding CQE for the host to cleanup 
   resources.

2. When the host controller has not yet sent out this SQE 
  (SQ is not empty), the software can fill in 'nullify' to 
  notify the host controller that there is no need to send 
  it, and directly fill the corresponding response into the 
  CQ with OCS: ABORTED. This scenario is also straightforward, 
  the UFS device won't be aware, and only the host controller 
  needs to clean up the related resources.

3. When the host controller has already sent out the SQE 
   and is waiting for the response from the UFS device (CQE), 
   the software can initiate cleanup to notify the host 
   controller that there is no need to wait, and directly fill 
   the corresponding response into the CQ with OCS: ABORTED.

Therefore, when a TMF is successfully executed, for example, 
tag 0 has been aborted, the software will know that the UFS 
device will no longer return a response for tag 0. 
Thus, the host controller needs to initiate cleanup, 
allowing the CQE corresponding to this SQE to return, 
while also cleaning the resources for tag 0.

In both the second and third cases, no matter which one occurs, 
they will result in the CQE corresponding to the SQE being 
filled with OCS: ABORTED. So, as long as we directly 
requeue when OCS: ABORTED, it will satisfy both of these 
situations.

Thanks
Peter



From macpaul.lin at mediatek.com  Fri Sep 27 00:57:58 2024
From: macpaul.lin at mediatek.com (Macpaul Lin)
Date: Fri, 27 Sep 2024 15:57:58 +0800
Subject: [PATCH 2/3] dt-bindings: mfd: mediatek: mt6397: add compatible
 for mt6359-codec
In-Reply-To: <20240926-smokeless-clobber-0fb8a1cdc7ab@spud>
References: <20240926092519.6556-1-macpaul.lin@mediatek.com>
 <20240926092519.6556-2-macpaul.lin@mediatek.com>
 <20240926-smokeless-clobber-0fb8a1cdc7ab@spud>
Message-ID: <78381b10-eae6-1414-6913-994e1ed03410@mediatek.com>

On 9/27/24 00:04, Conor Dooley wrote:
> On Thu, Sep 26, 2024 at 05:25:18PM +0800, Macpaul Lin wrote:
>> This patch updates the audio-codec properties includes:
>>   - compatible:
>>    - Re-order the supported device items.
>>    - Add 'mt6359-codec' to compatible since MT6359 PMIC has been included
>>      in this DT Schema.
> 
>>    - Set 'additionalProperties: true' for 'mt6359-codec'.
> 
> Why?

The mt6359-codec support these 3 properties:
mediatek,mic-type0, mediatek,mic-type-1, mediatek-mic-type2.
While mt6358-sound and mt6397-codec don't (at least, I didn't find
these 3 properties in driver codes.

Set 'additionalProperties: true' is also required to fix the following
dtbs_check errors:
pmic: audio-codec: 'mediatek,mic-type-0', 'mediatek,mic-type-1',
       'mediatek,mic-type-2' do not match any of the regexes:
       'pinctrl-[0-9]+'

>>
>> Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
>> ---
>>   Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml | 5 +++--
>>   1 file changed, 3 insertions(+), 2 deletions(-)
>>
>> diff --git a/Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml b/Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml
>> index 40cabaf60d0d..ffb5848a96d5 100644
>> --- a/Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml
>> +++ b/Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml
>> @@ -104,7 +104,7 @@ properties:
>>   
>>     audio-codec:
>>       type: object
>> -    additionalProperties: false
>> +    additionalProperties: true
>>       description:
>>         Audio codec support with MT6397 and MT6358.
>>   
>> @@ -112,8 +112,9 @@ properties:
>>         compatible:
>>           oneOf:
>>             - enum:
>> -              - mediatek,mt6397-codec
>>                 - mediatek,mt6358-sound
>> +              - mediatek,mt6359-codec
>> +              - mediatek,mt6397-codec
>>             - items:
>>                 - enum:
>>                     - mediatek,mt6366-sound
>> -- 
>> 2.45.2
>>

Thanks
Macpaul Lin


From ck.hu at mediatek.com  Fri Sep 27 02:01:08 2024
From: ck.hu at mediatek.com (=?utf-8?B?Q0sgSHUgKOiDoeS/iuWFiSk=?=)
Date: Fri, 27 Sep 2024 09:01:08 +0000
Subject: [PATCH v2] dt-bindings: display: mediatek: split: add clocks
 count constraint for MT8195
In-Reply-To: <20240927055140.19688-1-moudy.ho@mediatek.com>
References: <20240927055140.19688-1-moudy.ho@mediatek.com>
Message-ID: <0610bf4f130f238af148334969dfc0373cdb16de.camel@mediatek.com>

Hi, Moudy:

On Fri, 2024-09-27 at 13:51 +0800, Moudy Ho wrote:
> From: Moudy Ho <moudy.ho at mediatek.corp-partner.google.com>
> 
> The display node in mt8195.dtsi was triggering a CHECK_DTBS error due
> to an excessively long 'clocks' property:
>   display at 14f06000: clocks: [[31, 14], [31, 43], [31, 44]] is too long
> 
> To resolve this issue, apply the limit by setting 'maxItems: 3' in MT8195
> additional condition.

I think the main purpose of this patch is not to add limitation.
The main purpose is that you add HDMI RX Clock and HDMI Metadata Clock.
Could you describe more about these two clock?
mt8173-disp-split could work without these two clocks. Why mt8195-mdp3-split need these two clocks?

> 
> Fixes: 4ed545e7d100 ("dt-bindings: display: mediatek: disp: split each block to individual yaml")

The fixes patch should be 739058a9c5c3 ("dt-bindings: display: mediatek: split: add compatible for MT8195")

Regards,
CK

> Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
> Signed-off-by: Moudy Ho <moudy.ho at mediatek.com>
> --
> The purpose of this patch is to separate the corrections for
> MediaTek SPLIT CHECK_DTBS error from the original mailing list
> mentioned below:
> https://lore.kernel.org/all/20240924103156.13119-2-macpaul.lin at mediatek.com/
> 
> Changes since v1:
>   - Adding functional descriptions and quantity restrictions.
> ---
>  .../bindings/display/mediatek/mediatek,split.yaml           | 6 ++++++
>  1 file changed, 6 insertions(+)
> 
> diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,split.yaml b/Documentation/devicetree/bindings/display/mediatek/mediatek,split.yaml
> index e4affc854f3d..bce1b8b866ce 100644
> --- a/Documentation/devicetree/bindings/display/mediatek/mediatek,split.yaml
> +++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,split.yaml
> @@ -57,6 +57,9 @@ properties:
>    clocks:
>      items:
>        - description: SPLIT Clock
> +      - description: HDMI RX Clock
> +      - description: HDMI Metadata Clock
> +    minItems: 1
>  
>  required:
>    - compatible
> @@ -72,6 +75,9 @@ allOf:
>              const: mediatek,mt8195-mdp3-split
>  
>      then:
> +      properties:
> +        clocks:
> +          maxItems: 3
>        required:
>          - mediatek,gce-client-reg
>  

From ilias.apalodimas at linaro.org  Fri Sep 27 02:21:33 2024
From: ilias.apalodimas at linaro.org (Ilias Apalodimas)
Date: Fri, 27 Sep 2024 12:21:33 +0300
Subject: [PATCH net v2 2/2] page_pool: fix IOMMU crash when driver has
 already unbound
In-Reply-To: <842c8cc6-f716-437a-bc98-70bc26d6fd38@huawei.com>
References: <20240925075707.3970187-1-linyunsheng@huawei.com>
 <20240925075707.3970187-3-linyunsheng@huawei.com> <CAHS8izOxugzWJDTc-4CWqaKABTj=J4OHs=Lcb=SE9r8gX0J+yg@mail.gmail.com>
 <842c8cc6-f716-437a-bc98-70bc26d6fd38@huawei.com>
Message-ID: <CAC_iWjLgNOtsbhqrhvvEz2C3S668qB8KatL_W+tPHMSkDrNS=w@mail.gmail.com>

Hi Yunsheng

On Fri, 27 Sept 2024 at 06:58, Yunsheng Lin <linyunsheng at huawei.com> wrote:
>
> On 2024/9/27 2:15, Mina Almasry wrote:
> >
> >> In order not to do the dma unmmapping after driver has already
> >> unbound and stall the unloading of the networking driver, add
> >> the pool->items array to record all the pages including the ones
> >> which are handed over to network stack, so the page_pool can
> >> do the dma unmmapping for those pages when page_pool_destroy()
> >> is called.
> >
> > One thing I could not understand from looking at the code: if the
> > items array is in the struct page_pool, why do you need to modify the
> > page_pool entry in the struct page and in the struct net_iov? I think
> > the code could be made much simpler if you can remove these changes,
> > and you wouldn't need to modify the public api of the page_pool.
>
> As mentioned in [1]:
> "There is no space in 'struct page' to track the inflight pages, so
> 'pp' in 'struct page' is renamed to 'pp_item' to enable the tracking
> of inflight page"

I have the same feeling as Mina here. First of all, we do have an
unsigned long in struct page we use for padding IIRC. More
importantly, though, why does struct page need to know about this?
Can't we have the same information in page pool?
When the driver allocates pages it does via page_pool_dev_alloc_XXXXX
or something similar. Cant we do what you suggest here ? IOW when we
allocate a page we put it in a list, and when that page returns to
page_pool (and it's mapped) we remove it.

Thanks
/Ilias
>
> As we still need pp for "struct page_pool" for page_pool_put_page()
> related API, the container_of() trick is used to get the pp from the
> pp_item.
>
> As you had changed 'struct net_iov' to be mirroring the 'struct page',
> so change 'struct net_iov' part accordingly.
>
> 1. https://lore.kernel.org/all/50a463d5-a5a1-422f-a4f7-d3587b12c265 at huawei.com/
>
> >
> >> As the pool->items need to be large enough to avoid
> >> performance degradation, add a 'item_full' stat to indicate the
> >> allocation failure due to unavailability of pool->items.
> >>
> >
> > I'm not sure there is any way to size the pool->items array correctly.
>
> Currently the size of pool->items is calculated in page_pool_create_percpu()
> as below, to make sure the size of pool->items is somewhat twice of the
> size of pool->ring so that the number of page sitting in the driver's rx
> ring waiting for the new packet is the similar to the number of page that is
> still being handled in the network stack as most drivers seems to set the
> pool->pool_size according to their rx ring size:
>
> +#define PAGE_POOL_MIN_INFLIGHT_ITEMS           512
> +       unsigned int item_cnt = (params->pool_size ? : 1024) +
> +                               PP_ALLOC_CACHE_SIZE + PAGE_POOL_MIN_INFLIGHT_ITEMS;
> +       item_cnt = roundup_pow_of_two(item_cnt);
>
> > Can you use a data structure here that can grow? Linked list or
> > xarray?
> >
> > AFAIU what we want is when the page pool allocates a netmem it will
> > add the netmem to the items array, and when the pp releases a netmem
> > it will remove it from the array. Both of these operations are slow
> > paths, right? So the performance of a data structure more complicated
> > than an array may be ok. bench_page_pool_simple will tell for sure.
>
> The question would be why do we need the pool->items to grow with the
> additional overhead and complication by dynamic allocation of item, using
> complicated data structure and concurrent handling?
>
> As mentioned in [2], it was the existing semantics, but it does not means
> we need to keep it. The changing of semantics seems like an advantage
> to me, as we are able to limit how many pages is allowed to be used by
> a page_pool instance.
>
> 2. https://lore.kernel.org/all/2fb8d278-62e0-4a81-a537-8f601f61e81d at huawei.com/
>
> >
> >> Note, the devmem patchset seems to make the bug harder to fix,
> >> and may make backporting harder too. As there is no actual user
> >> for the devmem and the fixing for devmem is unclear for now,
> >> this patch does not consider fixing the case for devmem yet.
> >>
> >
> > net_iovs don't hit this bug, dma_unmap_page_attrs() is never called on
> > them, so no special handling is needed really. However for code
>
> I am really doubtful about your above claim. As at least the below
> implementaion of dma_buf_unmap_attachment_unlocked() called in
> __net_devmem_dmabuf_binding_free() seems be using the DMA API directly:
>
> https://elixir.bootlin.com/linux/v6.7-rc8/source/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c#L215
>
> Or am I missing something obvious here?
>
> > quality reasons lets try to minimize the number of devmem or memory
> > provider checks in the code, if possible.
> >


From lbulwahn at redhat.com  Fri Sep 27 02:22:32 2024
From: lbulwahn at redhat.com (Lukas Bulwahn)
Date: Fri, 27 Sep 2024 11:22:32 +0200
Subject: [PATCH] clk: mediatek: drop two dead config options
Message-ID: <20240927092232.386511-1-lukas.bulwahn@redhat.com>

From: Lukas Bulwahn <lukas.bulwahn at redhat.com>

Commit 0f471d31e5e8 ("clk: mediatek: Split MT8195 clock drivers and allow
module build") adds a number of new COMMON_CLK_MT8195_* config options.
Among those, the config options COMMON_CLK_MT8195_AUDSYS and
COMMON_CLK_MT8195_MSDC have no reference in the source tree and are not
used in the Makefile to include a specific file.

Drop the dead config options COMMON_CLK_MT8195_AUDSYS and
COMMON_CLK_MT8195_MSDC.

Fixes: 0f471d31e5e8 ("clk: mediatek: Split MT8195 clock drivers and allow module build")
Signed-off-by: Lukas Bulwahn <lukas.bulwahn at redhat.com>
---
 drivers/clk/mediatek/Kconfig | 15 ---------------
 1 file changed, 15 deletions(-)

diff --git a/drivers/clk/mediatek/Kconfig b/drivers/clk/mediatek/Kconfig
index 70a005e7e1b1..486401e1f2f1 100644
--- a/drivers/clk/mediatek/Kconfig
+++ b/drivers/clk/mediatek/Kconfig
@@ -887,13 +887,6 @@ config COMMON_CLK_MT8195_APUSYS
 	help
 	  This driver supports MediaTek MT8195 AI Processor Unit System clocks.
 
-config COMMON_CLK_MT8195_AUDSYS
-	tristate "Clock driver for MediaTek MT8195 audsys"
-	depends on COMMON_CLK_MT8195
-	default COMMON_CLK_MT8195
-	help
-	  This driver supports MediaTek MT8195 audsys clocks.
-
 config COMMON_CLK_MT8195_IMP_IIC_WRAP
 	tristate "Clock driver for MediaTek MT8195 imp_iic_wrap"
 	depends on COMMON_CLK_MT8195
@@ -908,14 +901,6 @@ config COMMON_CLK_MT8195_MFGCFG
 	help
 	  This driver supports MediaTek MT8195 mfgcfg clocks.
 
-config COMMON_CLK_MT8195_MSDC
-	tristate "Clock driver for MediaTek MT8195 msdc"
-	depends on COMMON_CLK_MT8195
-	default COMMON_CLK_MT8195
-	help
-	  This driver supports MediaTek MT8195 MMC and SD Controller's
-	  msdc and msdc_top clocks.
-
 config COMMON_CLK_MT8195_SCP_ADSP
 	tristate "Clock driver for MediaTek MT8195 scp_adsp"
 	depends on COMMON_CLK_MT8195
-- 
2.46.1



From krzk at kernel.org  Fri Sep 27 02:28:52 2024
From: krzk at kernel.org (Krzysztof Kozlowski)
Date: Fri, 27 Sep 2024 11:28:52 +0200
Subject: [PATCH v3 2/5] dt-bindings: iommu: mediatek: Fix interrupt count
 constraint for new SoCs
In-Reply-To: <20240927065041.15247-2-macpaul.lin@mediatek.com>
References: <20240927065041.15247-1-macpaul.lin@mediatek.com>
 <20240927065041.15247-2-macpaul.lin@mediatek.com>
Message-ID: <bilc7elacctsvr3eeqi5n45loy2w3qnzymwwhytlaeb3bmn4u7@thakmicixlko>

On Fri, Sep 27, 2024 at 02:50:38PM +0800, Macpaul Lin wrote:
> The infra-iommu node in mt8195.dtsi was triggering a CHECK_DTBS error due
> to an excessively long 'interrupts' property. The error message was:
> 
>   infra-iommu at 10315000: interrupts: [[0, 795, 4, 0], [0, 796, 4, 0],
>                      [0, 797, 4, 0], [0, 798, 4, 0], [0, 799, 4, 0]]
>                      is too long
> 
> To address this issue, update the compatbile matching rule for
> 'interrupts' property. This change allows flexibility in the number
> of interrupts for new SoCs like MT8195.
> The purpose of these 5 interrupts is also added into description.
> 
> Fixes: bca28426805d ("dt-bindings: iommu: mediatek: Convert IOMMU to DT schema")
> Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
> ---
>  .../bindings/iommu/mediatek,iommu.yaml        | 25 ++++++++++++++++++-
>  1 file changed, 24 insertions(+), 1 deletion(-)
> 
> Changes for v2:
>  - commit message: re-formatting and add a description of adding 5 interrupts.
>  - add 'description' and 'maxItems: 5' for 'interrupt' property of
>    'mt8195-iommu-infra'
>  - others keeps 'maxItems: 1'
> 
> Changes for v3:
>  - Refine the description for 'interrupts' property and fixes the compatible
>    matching rules.
>  - Refine commit message.
> 
> diff --git a/Documentation/devicetree/bindings/iommu/mediatek,iommu.yaml b/Documentation/devicetree/bindings/iommu/mediatek,iommu.yaml
> index ea6b0f5f24de..10e2bb0f0704 100644
> --- a/Documentation/devicetree/bindings/iommu/mediatek,iommu.yaml
> +++ b/Documentation/devicetree/bindings/iommu/mediatek,iommu.yaml
> @@ -96,7 +96,13 @@ properties:
>      maxItems: 1
>  
>    interrupts:
> -    maxItems: 1

This does not make sense and was not here at v2. Keep constraints at top
level.

This is how variable-length lists are created:
https://elixir.bootlin.com/linux/v6.11-rc6/source/Documentation/devicetree/bindings/ufs/qcom,ufs.yaml#L127

Best regards,
Krzysztof



From krzk at kernel.org  Fri Sep 27 02:30:02 2024
From: krzk at kernel.org (Krzysztof Kozlowski)
Date: Fri, 27 Sep 2024 11:30:02 +0200
Subject: [PATCH v3 5/5] dt-bindings: display: mediatek: dpi: correct
 power-domains property
In-Reply-To: <20240927065041.15247-5-macpaul.lin@mediatek.com>
References: <20240927065041.15247-1-macpaul.lin@mediatek.com>
 <20240927065041.15247-5-macpaul.lin@mediatek.com>
Message-ID: <vo5ia2cprt2eff2frximgkjkapyavam65m5gjxpgbht76wacuk@sttamlbk3iu4>

On Fri, Sep 27, 2024 at 02:50:41PM +0800, Macpaul Lin wrote:
> The MediaTek DPI module is typically associated with one of the
> following multimedia power domains:
>  - POWER_DOMAIN_DISPLAY
>  - POWER_DOMAIN_VDOSYS
>  - POWER_DOMAIN_MM
> The specific power domain used varies depending on the SoC design.
> 
> These power domains are shared by multiple devices within the SoC.
> In most cases, these power domains are enabled by other devices.
> As a result, the DPI module of legacy SoCs often functions correctly
> even without explicit configuration.
> 
> It is recommended to explicitly add the appropriate power domain
> property to the DPI node in the device tree. Hence drop the
> compatible checking for specific SoCs.
> 
> Fixes: 5474d49b2f79 ("dt-bindings: display: mediatek: dpi: Add power domains")
> Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
> Signed-off-by: Jitao Shi <jitao.shi at mediatek.com>
> Signed-off-by: Pablo Sun <pablo.sun at mediatek.com>
> ---
>  .../display/mediatek/mediatek,dpi.yaml        | 24 ++++++++-----------
>  1 file changed, 10 insertions(+), 14 deletions(-)

Reviewed-by: Krzysztof Kozlowski <krzk at kernel.org>

Best regards,
Krzysztof



From krzk at kernel.org  Fri Sep 27 02:37:01 2024
From: krzk at kernel.org (Krzysztof Kozlowski)
Date: Fri, 27 Sep 2024 11:37:01 +0200
Subject: [PATCH v2] dt-bindings: display: mediatek: split: add clocks
 count constraint for MT8195
In-Reply-To: <20240927055140.19688-1-moudy.ho@mediatek.com>
References: <20240927055140.19688-1-moudy.ho@mediatek.com>
Message-ID: <pnpj4pexz6nff72kmk6thupwvp2dgkz32ye7o44qdpuctbewb4@kpokc7c2rflr>

On Fri, Sep 27, 2024 at 01:51:40PM +0800, Moudy Ho wrote:
> From: Moudy Ho <moudy.ho at mediatek.corp-partner.google.com>
> 
> The display node in mt8195.dtsi was triggering a CHECK_DTBS error due
> to an excessively long 'clocks' property:
>   display at 14f06000: clocks: [[31, 14], [31, 43], [31, 44]] is too long
> 
> To resolve this issue, apply the limit by setting 'maxItems: 3' in MT8195
> additional condition.
> 
> Fixes: 4ed545e7d100 ("dt-bindings: display: mediatek: disp: split each block to individual yaml")
> Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
> Signed-off-by: Moudy Ho <moudy.ho at mediatek.com>

Your SoB does not match.

Please run scripts/checkpatch.pl and fix reported warnings. Then please
run  and (probably) fix more warnings.
Some warnings can be ignored, especially from --strict run, but the code
here looks like it needs a fix. Feel free to get in touch if the warning
is not clear.

> --
> The purpose of this patch is to separate the corrections for
> MediaTek SPLIT CHECK_DTBS error from the original mailing list
> mentioned below:
> https://lore.kernel.org/all/20240924103156.13119-2-macpaul.lin at mediatek.com/
> 
> Changes since v1:
>   - Adding functional descriptions and quantity restrictions.
> ---
>  .../bindings/display/mediatek/mediatek,split.yaml           | 6 ++++++
>  1 file changed, 6 insertions(+)
> 
> diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,split.yaml b/Documentation/devicetree/bindings/display/mediatek/mediatek,split.yaml
> index e4affc854f3d..bce1b8b866ce 100644
> --- a/Documentation/devicetree/bindings/display/mediatek/mediatek,split.yaml
> +++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,split.yaml
> @@ -57,6 +57,9 @@ properties:
>    clocks:
>      items:
>        - description: SPLIT Clock
> +      - description: HDMI RX Clock
> +      - description: HDMI Metadata Clock
> +    minItems: 1
>  
>  required:
>    - compatible
> @@ -72,6 +75,9 @@ allOf:
>              const: mediatek,mt8195-mdp3-split
>  
>      then:
> +      properties:
> +        clocks:

missing minItems

Missing constraints for all the variants.

Best regards,
Krzysztof



From krzk at kernel.org  Fri Sep 27 02:42:31 2024
From: krzk at kernel.org (Krzysztof Kozlowski)
Date: Fri, 27 Sep 2024 11:42:31 +0200
Subject: [PATCH 2/3] dt-bindings: mfd: mediatek: mt6397: add compatible
 for mt6359-codec
In-Reply-To: <78381b10-eae6-1414-6913-994e1ed03410@mediatek.com>
References: <20240926092519.6556-1-macpaul.lin@mediatek.com>
 <20240926092519.6556-2-macpaul.lin@mediatek.com>
 <20240926-smokeless-clobber-0fb8a1cdc7ab@spud>
 <78381b10-eae6-1414-6913-994e1ed03410@mediatek.com>
Message-ID: <z5zehicgqqsbgsjz5nrjlqrkpqll57gb26jdc3ctpeajtlfusm@b2s5vrbuv3es>

On Fri, Sep 27, 2024 at 03:57:58PM +0800, Macpaul Lin wrote:
> On 9/27/24 00:04, Conor Dooley wrote:
> > On Thu, Sep 26, 2024 at 05:25:18PM +0800, Macpaul Lin wrote:
> > > This patch updates the audio-codec properties includes:
> > >   - compatible:
> > >    - Re-order the supported device items.
> > >    - Add 'mt6359-codec' to compatible since MT6359 PMIC has been included
> > >      in this DT Schema.
> > 
> > >    - Set 'additionalProperties: true' for 'mt6359-codec'.
> > 
> > Why?
> 
> The mt6359-codec support these 3 properties:
> mediatek,mic-type0, mediatek,mic-type-1, mediatek-mic-type2.
> While mt6358-sound and mt6397-codec don't (at least, I didn't find
> these 3 properties in driver codes.
> 
> Set 'additionalProperties: true' is also required to fix the following
> dtbs_check errors:
> pmic: audio-codec: 'mediatek,mic-type-0', 'mediatek,mic-type-1',
>       'mediatek,mic-type-2' do not match any of the regexes:
>       'pinctrl-[0-9]+'

Why is this a correct fix? Aren't you allowing "pink-pony" property as
well?

> 
> > > 
> > > Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
> > > ---
> > >   Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml | 5 +++--

There is no such file.

Best regards,
Krzysztof



From krzk at kernel.org  Fri Sep 27 02:44:21 2024
From: krzk at kernel.org (Krzysztof Kozlowski)
Date: Fri, 27 Sep 2024 11:44:21 +0200
Subject: [PATCH v6 2/2] dt-bindings: mfd: mediatek: mt6397: Convert to DT
 schema format
In-Reply-To: <0b6c3217-5156-4c4f-8aaa-0b1cecce1818@kernel.org>
References: <20240918064955.6518-1-macpaul.lin@mediatek.com>
 <20240918064955.6518-2-macpaul.lin@mediatek.com>
 <0b6c3217-5156-4c4f-8aaa-0b1cecce1818@kernel.org>
Message-ID: <665cd94e-7b09-428e-90b7-3ea861a01aa3@kernel.org>

On 20/09/2024 15:07, Krzysztof Kozlowski wrote:
> On 18/09/2024 08:49, Macpaul Lin wrote:
>> Convert the mfd: mediatek: mt6397 binding to DT schema format.
>>
>> MT6323, MT6358, and MT6397 are PMIC devices with multiple function
>> subdevices. They share a common PMIC design but have variations in
>> subdevice combinations.
>>
>> Key updates in this conversion:
> 
> 
> Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski at linaro.org>

Unreviewed. This is incomplete.

Do not send incorrect patches and then followups for them. Just fix the
incorrect patch before it gets applied.

Best regards,
Krzysztof



From krzk at kernel.org  Fri Sep 27 02:45:13 2024
From: krzk at kernel.org (Krzysztof Kozlowski)
Date: Fri, 27 Sep 2024 11:45:13 +0200
Subject: [PATCH v6 2/2] dt-bindings: mfd: mediatek: mt6397: Convert to DT
 schema format
In-Reply-To: <20240918064955.6518-2-macpaul.lin@mediatek.com>
References: <20240918064955.6518-1-macpaul.lin@mediatek.com>
 <20240918064955.6518-2-macpaul.lin@mediatek.com>
Message-ID: <339b4c83-201c-4f63-85d0-b0aa1eb164b0@kernel.org>

On 18/09/2024 08:49, Macpaul Lin wrote:
> Convert the mfd: mediatek: mt6397 binding to DT schema format.
> 
> MT6323, MT6358, and MT6397 are PMIC devices with multiple function
> subdevices. They share a common PMIC design but have variations in
> subdevice combinations.
> 
> Key updates in this conversion:
> 
> 1. RTC:
>    - Convert rtc-mt6397.txt and merge into parent MT6397 PMIC DT schema.
> 
> 2. Regulators:
>    - Align to generic name "regulators".
>    - Update references from .txt to .yaml for mt6323, mt6358, and mt6397
>      regulators.
>    - Simplify regulator name labels in device tree examples.
> 
> 3. Audio Codec:
>    - Convert sound/mt6358.txt and merge into parent MT6397 PMIC DT schema.
>    - Align to generic name "audio-codec" for codec and sound subdevices.
>    - Add "mediatek,dmic-mode" and "Avdd-supply" properties.
> 
> 4. Clocks:
>    - Align to generic name "clocks" for clockbuffer subdevices.
> 
> 5. LEDs:
>    - Convert leds-mt6323.txt and merge into parent MT6397 PMIC DT schema.
>    - Update LED binding.
> 
> 6. Keys:
>    - Add detailed descriptions for power and home keys.
>    - Add compatible: mediatek,mt6358-keys.
> 
> 7. Power Controller:
>    - Convert mt6323-poweroff.txt and merge into parent MT6397 PMIC DT
>      schema.
>    - Add #power-domain-cells property to fix dt-binding check error.
>    - Clarify "BBPU" as "Baseband power up".
> 
> 8. Pinctrl:
>    - Align to generic name "pinctrl" instead of "pin-controller".
> 
> 9. Compatible:
>    - Drop "mediatek,mt6357" since there is a separated DT Schema
>      for PMIC MT6357.
> 
> 10. Examples:
>    - MT6323: Retain complete examples for this PMIC.
>    - MT6358 and MT6397: simplify settings in regulators.
>     - Preserve "audio-codec", "clocks", "pinctrl", "rtc", and "keys"
>       sections as they contain typical settings for different PMICs.
> 
> Additional updates:
> - MAINTAINERS: Add co-maintainers and reference to
>   mfd/mediatek,mt6397.yaml for LED and power-controller drivers.
> - input/mediatek,pmic-keys.yaml: Update reference to
>   mfd/mediatek,mt6397.yaml.
> 
> Signed-off-by: Sen Chu <sen.chu at mediatek.com>
> Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>

NAK

Follow up patch pointed out this is incorrect. I don't understand this
concept of sending knowingly incorrect code, so please sort it out at v7.

Best regards,
Krzysztof



From andriy.shevchenko at linux.intel.com  Fri Sep 27 02:48:57 2024
From: andriy.shevchenko at linux.intel.com (Andy Shevchenko)
Date: Fri, 27 Sep 2024 12:48:57 +0300
Subject: [PATCH v8 2/3] regulator: Add devres version of
 of_regulator_get_optional()
In-Reply-To: <CAGXv+5EV4nNiAneajqr4VBkX4TO3zV76yqBM_u81ZMNjU52Bvw@mail.gmail.com>
References: <20240925093807.1026949-1-wenst@chromium.org>
 <20240925093807.1026949-3-wenst@chromium.org>
 <ZvPscRdWlFPmtCyR@smile.fi.intel.com>
 <CAGXv+5Gf9+rc+vLcr-JFhO561G8dw38ksV3drat+DyCfWEVakQ@mail.gmail.com>
 <ZvVS7ITg2t-RIh8C@smile.fi.intel.com>
 <CAGXv+5EV4nNiAneajqr4VBkX4TO3zV76yqBM_u81ZMNjU52Bvw@mail.gmail.com>
Message-ID: <ZvZ_idJsmuzNhFMc@smile.fi.intel.com>

On Fri, Sep 27, 2024 at 12:38:35PM +0800, Chen-Yu Tsai wrote:
> On Thu, Sep 26, 2024 at 8:26?PM Andy Shevchenko
> <andriy.shevchenko at linux.intel.com> wrote:
> > On Thu, Sep 26, 2024 at 04:43:52PM +0800, Chen-Yu Tsai wrote:
> > > On Wed, Sep 25, 2024 at 6:56?PM Andy Shevchenko
> > > <andriy.shevchenko at linux.intel.com> wrote:
> > > > On Wed, Sep 25, 2024 at 05:38:05PM +0800, Chen-Yu Tsai wrote:

...

> > > > > +#if IS_ENABLED(CONFIG_OF)
> > > >
> > > > Do we really need this?
> > >
> > > What's the point of going through devres_* stuff if we already know
> > > _of_regulator_get() is going to fail anyway?
> >
> > With devm_add_action*() this will be other way around and there are plenty of
> > APIs done this way. The ifdeffery is simply ugly in the code.
> 
> It's still extra code that doesn't get compiled out.

Are you sure? In case of the stub the compiler should go with a "dead code
elimination" optimisation and get rid of most of it (yes, I admit that it might
be the overhead for the exporting a function which returns a constant).

> > > Also, _of_regulator_get() does not have a stub version for !CONFIG_OF.
> >
> > So, what prevents us from adding it?
> 
> Because there's no need if the only internal user isn't using it.
> 
> I could also move them over to of_regulator.c.
> 
> _of_regulator_get() stays internal to that file, and devm_regulator_release()
> gets exposed instead.
> 
> Does that sound better?

This sounds good to me!

...

> > > > > +static inline struct regulator *__must_check devm_of_regulator_get_optional(struct device *dev,
> > > > > +                                                                         struct device_node *node,
> > > > > +                                                                         const char *id)
> > > >
> > > > I don't know the conventions here, but I find better to have it as
> > > >
> > > > static inline __must_check struct regulator *
> > > > devm_of_regulator_get_optional(struct device *dev, struct device_node *node, const char *id)
> > > >
> > > > Similar to other stubs and declarations.
> > >
> > > I don't think there are any conventions. This file already has three types:
> > >
> > > 1. Wrap the line with the function name on the second line
> > > 2. Wrap the arguments; wrapped arguments aligned to the left parenthesis.
> > > 3. Wrap the arguments; wrapped arguments aligned with aribtrary number of
> > >    tabs.
> > >
> > > I prefer the way I have put them.
> >
> > The way you put it despite relaxed limit is slightly harder to read.
> > I don't remember many headers that do so-o indented parameters. Besides
> > your way defers the burden of resplit to the future in case one more parameter
> > needs to be added which will excess the 100 limit.
> >
> > Also __must_check is somehow misplaced in my opinion (talking from my
> > experience and this can be simply checked by grepping other headers).
> 
> Seems correct to me. It's between the return type and the function name.
> From the coding style doc:
> 
>  __init void * __must_check action(enum magic value, size_t size, u8 count,
>                                    char *fmt, ...) __printf(4, 5) __malloc;
> 
> The preferred order of elements for a function prototype is:
> 
> - storage class (below, ``static __always_inline``, noting that
> ``__always_inline``
>   is technically an attribute but is treated like ``inline``)
> - storage class attributes (here, ``__init`` -- i.e. section
> declarations, but also
>   things like ``__cold``)
> - return type (here, ``void *``)
> - return type attributes (here, ``__must_check``)
> - function name (here, ``action``)
> - function parameters (here, ``(enum magic value, size_t size, u8
> count, char *fmt, ...)``,
>   noting that parameter names should always be included)
> - function parameter attributes (here, ``__printf(4, 5)``)
> - function behavior attributes (here, ``__malloc``)
> 
> > That said, I prefer the way I suggested or something alike.
> 
> Two people arguing over style that is not clearly specified in the coding
> style doc is probably wasting time. I'll use what `clang-format` gave:
> 
> static inline struct regulator *__must_check of_regulator_get_optional(
>        struct device *dev, struct device_node *node, const char *id)
> static inline struct regulator *__must_check devm_of_regulator_get_optional(
>        struct device *dev, struct device_node *node, const char *id)

With all my hatred towards this clang-format "feature", i.e. open ended
parenthesis, this looks better than your original variant.

-- 
With Best Regards,
Andy Shevchenko




From linyunsheng at huawei.com  Fri Sep 27 02:49:40 2024
From: linyunsheng at huawei.com (Yunsheng Lin)
Date: Fri, 27 Sep 2024 17:49:40 +0800
Subject: [PATCH net v2 2/2] page_pool: fix IOMMU crash when driver has
 already unbound
In-Reply-To: <CAC_iWjLgNOtsbhqrhvvEz2C3S668qB8KatL_W+tPHMSkDrNS=w@mail.gmail.com>
References: <20240925075707.3970187-1-linyunsheng@huawei.com>
 <20240925075707.3970187-3-linyunsheng@huawei.com>
 <CAHS8izOxugzWJDTc-4CWqaKABTj=J4OHs=Lcb=SE9r8gX0J+yg@mail.gmail.com>
 <842c8cc6-f716-437a-bc98-70bc26d6fd38@huawei.com>
 <CAC_iWjLgNOtsbhqrhvvEz2C3S668qB8KatL_W+tPHMSkDrNS=w@mail.gmail.com>
Message-ID: <0ef315df-e8e9-41e8-9ba8-dcb69492c616@huawei.com>

On 2024/9/27 17:21, Ilias Apalodimas wrote:
> Hi Yunsheng
> 
> On Fri, 27 Sept 2024 at 06:58, Yunsheng Lin <linyunsheng at huawei.com> wrote:
>>
>> On 2024/9/27 2:15, Mina Almasry wrote:
>>>
>>>> In order not to do the dma unmmapping after driver has already
>>>> unbound and stall the unloading of the networking driver, add
>>>> the pool->items array to record all the pages including the ones
>>>> which are handed over to network stack, so the page_pool can
>>>> do the dma unmmapping for those pages when page_pool_destroy()
>>>> is called.
>>>
>>> One thing I could not understand from looking at the code: if the
>>> items array is in the struct page_pool, why do you need to modify the
>>> page_pool entry in the struct page and in the struct net_iov? I think
>>> the code could be made much simpler if you can remove these changes,
>>> and you wouldn't need to modify the public api of the page_pool.
>>
>> As mentioned in [1]:
>> "There is no space in 'struct page' to track the inflight pages, so
>> 'pp' in 'struct page' is renamed to 'pp_item' to enable the tracking
>> of inflight page"
> 
> I have the same feeling as Mina here. First of all, we do have an
> unsigned long in struct page we use for padding IIRC. More

I am assuming you are referring to '_pp_mapping_pad' in 'struct page',
unfortunately the field might be used when a page is mmap'ed to user
space as my understanding.

https://elixir.bootlin.com/linux/v6.7-rc8/source/include/linux/mm_types.h#L126

> importantly, though, why does struct page need to know about this?
> Can't we have the same information in page pool?
> When the driver allocates pages it does via page_pool_dev_alloc_XXXXX
> or something similar. Cant we do what you suggest here ? IOW when we
> allocate a page we put it in a list, and when that page returns to
> page_pool (and it's mapped) we remove it.

Yes, that is the basic idea, but the important part is how to do that
with less performance impact.


From ilias.apalodimas at linaro.org  Fri Sep 27 02:58:55 2024
From: ilias.apalodimas at linaro.org (Ilias Apalodimas)
Date: Fri, 27 Sep 2024 12:58:55 +0300
Subject: [PATCH net v2 2/2] page_pool: fix IOMMU crash when driver has
 already unbound
In-Reply-To: <0ef315df-e8e9-41e8-9ba8-dcb69492c616@huawei.com>
References: <20240925075707.3970187-1-linyunsheng@huawei.com>
 <20240925075707.3970187-3-linyunsheng@huawei.com> <CAHS8izOxugzWJDTc-4CWqaKABTj=J4OHs=Lcb=SE9r8gX0J+yg@mail.gmail.com>
 <842c8cc6-f716-437a-bc98-70bc26d6fd38@huawei.com> <CAC_iWjLgNOtsbhqrhvvEz2C3S668qB8KatL_W+tPHMSkDrNS=w@mail.gmail.com>
 <0ef315df-e8e9-41e8-9ba8-dcb69492c616@huawei.com>
Message-ID: <CAC_iWjKeajwn3otjdEekE6VDLHGEvqmnQRwpN5R3yHj8UpEiDw@mail.gmail.com>

On Fri, 27 Sept 2024 at 12:50, Yunsheng Lin <linyunsheng at huawei.com> wrote:
>
> On 2024/9/27 17:21, Ilias Apalodimas wrote:
> > Hi Yunsheng
> >
> > On Fri, 27 Sept 2024 at 06:58, Yunsheng Lin <linyunsheng at huawei.com> wrote:
> >>
> >> On 2024/9/27 2:15, Mina Almasry wrote:
> >>>
> >>>> In order not to do the dma unmmapping after driver has already
> >>>> unbound and stall the unloading of the networking driver, add
> >>>> the pool->items array to record all the pages including the ones
> >>>> which are handed over to network stack, so the page_pool can
> >>>> do the dma unmmapping for those pages when page_pool_destroy()
> >>>> is called.
> >>>
> >>> One thing I could not understand from looking at the code: if the
> >>> items array is in the struct page_pool, why do you need to modify the
> >>> page_pool entry in the struct page and in the struct net_iov? I think
> >>> the code could be made much simpler if you can remove these changes,
> >>> and you wouldn't need to modify the public api of the page_pool.
> >>
> >> As mentioned in [1]:
> >> "There is no space in 'struct page' to track the inflight pages, so
> >> 'pp' in 'struct page' is renamed to 'pp_item' to enable the tracking
> >> of inflight page"
> >
> > I have the same feeling as Mina here. First of all, we do have an
> > unsigned long in struct page we use for padding IIRC. More
>
> I am assuming you are referring to '_pp_mapping_pad' in 'struct page',
> unfortunately the field might be used when a page is mmap'ed to user
> space as my understanding.
>

Ah good point, I just grepped for it and didn't look at the surrounding unions.

> https://elixir.bootlin.com/linux/v6.7-rc8/source/include/linux/mm_types.h#L126
>
> > importantly, though, why does struct page need to know about this?
> > Can't we have the same information in page pool?
> > When the driver allocates pages it does via page_pool_dev_alloc_XXXXX
> > or something similar. Cant we do what you suggest here ? IOW when we
> > allocate a page we put it in a list, and when that page returns to
> > page_pool (and it's mapped) we remove it.
>
> Yes, that is the basic idea, but the important part is how to do that
> with less performance impact.

Yes, but do you think that keeping that list of allocated pages in
struct page_pool will end up being more costly somehow compared to
struct page?

Thanks
/Ilias


From Qun-wei.Lin at mediatek.com  Fri Sep 27 03:14:19 2024
From: Qun-wei.Lin at mediatek.com (=?utf-8?B?UXVuLXdlaSBMaW4gKOael+e+pOW0tCk=?=)
Date: Fri, 27 Sep 2024 10:14:19 +0000
Subject: [PATCH 0/2] Add BLK_FEAT_READ_SYNCHRONOUS and
 SWP_READ_SYNCHRONOUS_IO
In-Reply-To: <CACePvbUCNxy3sf6+7hk9HPGTNtTMbA2=Entu0xbV7TbwX4M2WQ@mail.gmail.com>
References: <20240919112952.981-1-qun-wei.lin@mediatek.com>
	 <ZuwM-aEEo7DE-qXw@infradead.org>
	 <CACePvbUCNxy3sf6+7hk9HPGTNtTMbA2=Entu0xbV7TbwX4M2WQ@mail.gmail.com>
Message-ID: <120a91c2b71256d7723c6de7d98c611899b84bac.camel@mediatek.com>

Hi Chris & Christoph,

Thank you for your review and valuable feedback.
 
I will submit a v2 version of the patch.
In this version, I will ensure that 'bdev_syncronous()' sets both
'SWP_READ_SYNCHRONOUS_IO' and 'SWP_WRITE_SYNCHRONOUS_IO' flags.

Best regards,

Qun-Wei


On Fri, 2024-09-20 at 17:04 -0700, Chris Li wrote:
>  	 
> External email : Please do not click links or open attachments until
> you have verified the sender or the content.
>  Hi Qun-Wei,
> 
> Agree with Christoph that BLK_FEAT_READ_SYNCHRONOUS is not set
> anywhere. That needs to be fixed.
> 
> Having a flag for BLK_FEAT_READ_SYNCHRONOUS and another flag for
> BLK_FEAT_SYNCHRONOUS is just confusing.
> for example, read path need to test two bits: "sis->flags &
> (SWP_SYNCHRONOUS_IO | SWP_READ_SYNCHRONOUS_IO)"
> 
> There is only one caller of the bdev_synchronous(), which is in
> swapfile.c.
> 
> I suggest if you have  BLK_FEAT_READ_SYNCHRONOUS, you should have a
> BLK_FEAT_WRITE_SYNCHRONOUS for writing.
> The previous path that test the SWP_SYNCHRONOUS_IO should convert
> into
> one of tests of SWP_READ_SYNCHRONOUS_IO or  SWP_WRITE_SYNCHRONOUS_IO
> depend on the read or write path (never both).
> 
> "sis->flags & (SWP_SYNCHRONOUS_IO | SWP_READ_SYNCHRONOUS_IO)" will
> change into "sis->flags & SWP_READ_SYNCHRONOUS_IO"
> 
> Then you can have  bdev_synchronous() just return the
> SWP_READ_SYNCHRONOUS_IO | SWP_WRITE_SYNCHRONOUS_IO if both are set.
> You don't need to have just bdev_synchronous() and
> bdev_read_synchronous(). That is more boilerplate code which is
> unnecessary.
> 
> I also suggest you squish your two patches into one because there is
> no user of bdev_read_synchronous() in the first patch.
> You should introduce the function with the code that uses it. Yes,
> yes, I know you want to have a seperate patch for define vs another
> patch for using it. In this case there is no good reason for that.
> 
> Best regards,
> 
> Chris
> 
> 
> On Thu, Sep 19, 2024 at 4:37?AM Christoph Hellwig <hch at infradead.org>
> wrote:
> >
> > Well, you're not actually setting your new flags anywhere, which -
> > as you might know - is an reson for an insta-NAK.
> >

From pablo.sun at mediatek.com  Fri Sep 27 03:29:59 2024
From: pablo.sun at mediatek.com (Pablo Sun)
Date: Fri, 27 Sep 2024 18:29:59 +0800
Subject: [PATCH v2 0/6] Enable Mali GPU on MediaTek Genio 700 EVK
Message-ID: <20240927103005.17605-1-pablo.sun@mediatek.com>

This series is based on linux-next, tag: next-20240927

Enables the GPU on mt8390-genio-700-evk.dts. 
The panfrost driver probed with dmesg:

panfrost 13000000.gpu: clock rate = 390000000
panfrost 13000000.gpu: mali-g57 id 0x9093 major 0x0 minor 0x0 status 0x0
panfrost 13000000.gpu: features: 00000000,000019f7, 
  issues: 00000003,80000400
panfrost 13000000.gpu: Features: L2:0x08130206 Shader:0x00000000
  Tiler:0x00000809 Mem:0x1 MMU:0x00002830 AS:0xff JS:0x7
panfrost 13000000.gpu: shader_present=0x10005 l2_present=0x1
[drm] Initialized panfrost 1.2.0 for 13000000.gpu on minor 0

Changes in v2:
- Fixes the "Fixes" tag in patch ("arm64: dts: mediatek: mt8188: 
  Fix wrong clock provider in MFG1 power domain")
- Reuse mtk_mt8186_efuse_pdata
- Remove comma at the end of mainpll_d5_d2
- Add patch ("soc: mediatek: mediatek-regulator-coupler: Support mt8188")
- Couple GPU SRAM voltage to GPU voltage instead of fixed value

Pablo Sun (6):
  arm64: dts: mediatek: mt8188: Fix wrong clock provider in MFG1 power
    domain
  clk: mediatek: clk-mt8188-topckgen: Remove univpll from parents of
    mfg_core_tmp
  nvmem: mtk-efuse: Enable postprocess for mt8188 GPU speed binning
  arm64: dts: mediatek: mt8188: Add efuse for GPU speed binning
  soc: mediatek: mediatek-regulator-coupler: Support mt8188
  arm64: dts: mediatek: mt8390-genio-700-evk: Enable Mali GPU

 arch/arm64/boot/dts/mediatek/mt8188.dtsi      | 11 +++++--
 .../dts/mediatek/mt8390-genio-700-evk.dts     | 31 +++++++++++++++++++
 drivers/clk/mediatek/clk-mt8188-topckgen.c    |  9 ++++--
 drivers/nvmem/mtk-efuse.c                     |  1 +
 drivers/soc/mediatek/mtk-regulator-coupler.c  |  1 +
 5 files changed, 48 insertions(+), 5 deletions(-)

-- 
2.45.2



From pablo.sun at mediatek.com  Fri Sep 27 03:30:03 2024
From: pablo.sun at mediatek.com (Pablo Sun)
Date: Fri, 27 Sep 2024 18:30:03 +0800
Subject: [PATCH v2 4/6] arm64: dts: mediatek: mt8188: Add efuse for GPU speed binning
In-Reply-To: <20240927103005.17605-1-pablo.sun@mediatek.com>
References: <20240927103005.17605-1-pablo.sun@mediatek.com>
Message-ID: <20240927103005.17605-5-pablo.sun@mediatek.com>

The OPP table of mt8188 GPU contains duplicated frequencies
for different speed bins.

In order to support OPP table, we need to provide the speed bin info
in the efuse data so the GPU driver could properly set the
supported hardware speed bin.

Signed-off-by: Pablo Sun <pablo.sun at mediatek.com>
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
---
 arch/arm64/boot/dts/mediatek/mt8188.dtsi | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/arch/arm64/boot/dts/mediatek/mt8188.dtsi b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
index 02a5bb4dbd1f..129edaf33704 100644
--- a/arch/arm64/boot/dts/mediatek/mt8188.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
@@ -1752,6 +1752,11 @@ efuse: efuse at 11f20000 {
 			lvts_efuse_data1: lvts1-calib at 1ac {
 				reg = <0x1ac 0x40>;
 			};
+
+			gpu_speedbin: gpu-speedbin at 580 {
+				reg = <0x581 0x1>;
+				bits = <0 3>;
+			};
 		};
 
 		gpu: gpu at 13000000 {
@@ -1763,6 +1768,8 @@ gpu: gpu at 13000000 {
 				     <GIC_SPI 382 IRQ_TYPE_LEVEL_HIGH 0>,
 				     <GIC_SPI 381 IRQ_TYPE_LEVEL_HIGH 0>;
 			interrupt-names = "job", "mmu", "gpu";
+			nvmem-cells = <&gpu_speedbin>;
+			nvmem-cell-names = "speed-bin";
 			operating-points-v2 = <&gpu_opp_table>;
 			power-domains = <&spm MT8188_POWER_DOMAIN_MFG2>,
 					<&spm MT8188_POWER_DOMAIN_MFG3>,
-- 
2.45.2



From pablo.sun at mediatek.com  Fri Sep 27 03:30:00 2024
From: pablo.sun at mediatek.com (Pablo Sun)
Date: Fri, 27 Sep 2024 18:30:00 +0800
Subject: [PATCH v2 1/6] arm64: dts: mediatek: mt8188: Fix wrong clock provider in MFG1 power domain
In-Reply-To: <20240927103005.17605-1-pablo.sun@mediatek.com>
References: <20240927103005.17605-1-pablo.sun@mediatek.com>
Message-ID: <20240927103005.17605-2-pablo.sun@mediatek.com>

The clock index "CLK_APMIXED_MFGPLL" belongs to the "apmixedsys" provider,
so fix the index.

In addition, add a "mfg1" label so following commits could set
domain-supply for MFG1 power domain.

Fixes: eaf73e4224a3 ("arm64: dts: mediatek: mt8188: Add support for SoC power domains")
Signed-off-by: Pablo Sun <pablo.sun at mediatek.com>
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
---
 arch/arm64/boot/dts/mediatek/mt8188.dtsi | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/arch/arm64/boot/dts/mediatek/mt8188.dtsi b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
index cd27966d2e3c..02a5bb4dbd1f 100644
--- a/arch/arm64/boot/dts/mediatek/mt8188.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8188.dtsi
@@ -956,9 +956,9 @@ mfg0: power-domain at MT8188_POWER_DOMAIN_MFG0 {
 					#size-cells = <0>;
 					#power-domain-cells = <1>;
 
-					power-domain at MT8188_POWER_DOMAIN_MFG1 {
+					mfg1: power-domain at MT8188_POWER_DOMAIN_MFG1 {
 						reg = <MT8188_POWER_DOMAIN_MFG1>;
-						clocks = <&topckgen CLK_APMIXED_MFGPLL>,
+						clocks = <&apmixedsys CLK_APMIXED_MFGPLL>,
 							 <&topckgen CLK_TOP_MFG_CORE_TMP>;
 						clock-names = "mfg", "alt";
 						mediatek,infracfg = <&infracfg_ao>;
-- 
2.45.2



From pablo.sun at mediatek.com  Fri Sep 27 03:30:01 2024
From: pablo.sun at mediatek.com (Pablo Sun)
Date: Fri, 27 Sep 2024 18:30:01 +0800
Subject: [PATCH v2 2/6] clk: mediatek: clk-mt8188-topckgen: Remove univpll from parents of mfg_core_tmp
In-Reply-To: <20240927103005.17605-1-pablo.sun@mediatek.com>
References: <20240927103005.17605-1-pablo.sun@mediatek.com>
Message-ID: <20240927103005.17605-3-pablo.sun@mediatek.com>

Same as MT8195, MT8188 GPU clock is primarly supplied by the dedicated
mfgpll. The clock "mfg_core_tmp" is only used as an alt clock when
setting mfgpll clock rate.

If we keep the univpll parents from mfg_core_tmp, when setting
GPU frequency to 390000000, the common clock framework would switch
the parent to univpll, instead of setting mfgpll to 390000000:

    mfgpll                            0        0        0   949999756
    univpll                           2        2        0  2340000000
       univpll_d6                     1        1        0   390000000
          top_mfg_core_tmp            1        1        0   390000000
             mfg_ck_fast_ref          1        1        0   390000000
                mfgcfg_bg3d           1        1        0   390000000

This results in failures when subsequent devfreq operations need to
switch to other frequencies. So remove univpll from the parent list.

This solution is taken from commit 72d38ed720e9 ("clk: mediatek:
clk-mt8195-topckgen: Drop univplls from mfg mux parents")

Signed-off-by: Pablo Sun <pablo.sun at mediatek.com>
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
---
 drivers/clk/mediatek/clk-mt8188-topckgen.c | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/drivers/clk/mediatek/clk-mt8188-topckgen.c b/drivers/clk/mediatek/clk-mt8188-topckgen.c
index c4baf4076ed6..6b07abe9a8f5 100644
--- a/drivers/clk/mediatek/clk-mt8188-topckgen.c
+++ b/drivers/clk/mediatek/clk-mt8188-topckgen.c
@@ -342,11 +342,14 @@ static const char * const dsp7_parents[] = {
 	"univpll_d3"
 };
 
+/*
+ * MFG can be also parented to "univpll_d6" and "univpll_d7":
+ * these have been removed from the parents list to let us
+ * achieve GPU DVFS without any special clock handlers.
+ */
 static const char * const mfg_core_tmp_parents[] = {
 	"clk26m",
-	"mainpll_d5_d2",
-	"univpll_d6",
-	"univpll_d7"
+	"mainpll_d5_d2"
 };
 
 static const char * const camtg_parents[] = {
-- 
2.45.2



From pablo.sun at mediatek.com  Fri Sep 27 03:30:02 2024
From: pablo.sun at mediatek.com (Pablo Sun)
Date: Fri, 27 Sep 2024 18:30:02 +0800
Subject: [PATCH v2 3/6] nvmem: mtk-efuse: Enable postprocess for mt8188 GPU speed binning
In-Reply-To: <20240927103005.17605-1-pablo.sun@mediatek.com>
References: <20240927103005.17605-1-pablo.sun@mediatek.com>
Message-ID: <20240927103005.17605-4-pablo.sun@mediatek.com>

Similar to mt8186, the efuse data for mt8188's GPU speed binning
requires post-process to convert the bit field format expected
by the OPP table.

Since mt8188 efuse is not compatible to mt8186, add a new compatible
entry for mt8188 and enable postprocess.

Signed-off-by: Pablo Sun <pablo.sun at mediatek.com>
---
 drivers/nvmem/mtk-efuse.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/nvmem/mtk-efuse.c b/drivers/nvmem/mtk-efuse.c
index 9caf04667341..38d26e5c097a 100644
--- a/drivers/nvmem/mtk-efuse.c
+++ b/drivers/nvmem/mtk-efuse.c
@@ -112,6 +112,7 @@ static const struct mtk_efuse_pdata mtk_efuse_pdata = {
 static const struct of_device_id mtk_efuse_of_match[] = {
 	{ .compatible = "mediatek,mt8173-efuse", .data = &mtk_efuse_pdata },
 	{ .compatible = "mediatek,mt8186-efuse", .data = &mtk_mt8186_efuse_pdata },
+	{ .compatible = "mediatek,mt8188-efuse", .data = &mtk_mt8186_efuse_pdata },
 	{ .compatible = "mediatek,efuse", .data = &mtk_efuse_pdata },
 	{/* sentinel */},
 };
-- 
2.45.2



From pablo.sun at mediatek.com  Fri Sep 27 03:30:04 2024
From: pablo.sun at mediatek.com (Pablo Sun)
Date: Fri, 27 Sep 2024 18:30:04 +0800
Subject: [PATCH v2 5/6] soc: mediatek: mediatek-regulator-coupler: Support mt8188
In-Reply-To: <20240927103005.17605-1-pablo.sun@mediatek.com>
References: <20240927103005.17605-1-pablo.sun@mediatek.com>
Message-ID: <20240927103005.17605-6-pablo.sun@mediatek.com>

The Mali GPU in mt8188 also requires coupled power supplies,
that is, the "vsram" voltage should follow the "vgpu" voltage.
Therefore add the compatible to enable this coupling behavior.

Signed-off-by: Pablo Sun <pablo.sun at mediatek.com>
---
 drivers/soc/mediatek/mtk-regulator-coupler.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/soc/mediatek/mtk-regulator-coupler.c b/drivers/soc/mediatek/mtk-regulator-coupler.c
index ad2ed42aa697..0b6a2884145e 100644
--- a/drivers/soc/mediatek/mtk-regulator-coupler.c
+++ b/drivers/soc/mediatek/mtk-regulator-coupler.c
@@ -147,6 +147,7 @@ static int mediatek_regulator_coupler_init(void)
 {
 	if (!of_machine_is_compatible("mediatek,mt8183") &&
 	    !of_machine_is_compatible("mediatek,mt8186") &&
+	    !of_machine_is_compatible("mediatek,mt8188") &&
 	    !of_machine_is_compatible("mediatek,mt8192"))
 		return 0;
 
-- 
2.45.2



From pablo.sun at mediatek.com  Fri Sep 27 03:30:05 2024
From: pablo.sun at mediatek.com (Pablo Sun)
Date: Fri, 27 Sep 2024 18:30:05 +0800
Subject: [PATCH v2 6/6] arm64: dts: mediatek: mt8390-genio-700-evk: Enable Mali GPU
In-Reply-To: <20240927103005.17605-1-pablo.sun@mediatek.com>
References: <20240927103005.17605-1-pablo.sun@mediatek.com>
Message-ID: <20240927103005.17605-7-pablo.sun@mediatek.com>

Configure GPU regulator supplies and enable GPU for GENIO 700 EVK.

The GPU in MT8390 & MT8188 has two power inputs: "DVDD_GPU" and
"DVDD_SRAM_GPU". In Genio 700 EVK, DVDD_GPU is supplied by
mt6359_vproc2_buck_reg, and DVDD_SRAM_GPU is supplied by
mt6359_vsram_others_ldo_reg.

According to section 5.2 "Recommended Operating Conditions" in
MT8390 IoT Application Processor Datasheet v1.9, The recommended
operating voltage ranges are:

- DVDD_GPU: min 0.55V, max 0.86V, typical 0.75V
- DVDD_SRAM_GPU: min 0.71V, max 0.92V, typical 0.85V

To further optimize power saving, we couple DVDD_SRAM_GPU to
DVDD_GPU according to the following relation:

- For opp-880000000 or lower frequency, keep 0.75V
- For opp-915000000 and higher, DVDD_SRAM_GPU should follow
  DVDD_GPU. The exact voltage for DVDD_GPU should be decided by
  speed binning.

This rule is derived from the OPP table in the link.

In addition, set the voltage spread to 6250 uV, the step size of
'ldo_vsram_others' regulator of mt6359, otherwise the regulator
set_voltage operation fails.

Link: https://gitlab.com/mediatek/aiot/rity/meta-mediatek-bsp/-/blob/eedd6aedd4b0cfc0ee79b9c9b9650dfa73cf87f6/recipes-kernel/dtbo/mt8390/gpu-mali.dts
Signed-off-by: Pablo Sun <pablo.sun at mediatek.com>
Suggested-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
---
 .../dts/mediatek/mt8390-genio-700-evk.dts     | 31 +++++++++++++++++++
 1 file changed, 31 insertions(+)

diff --git a/arch/arm64/boot/dts/mediatek/mt8390-genio-700-evk.dts b/arch/arm64/boot/dts/mediatek/mt8390-genio-700-evk.dts
index 1474bef7e754..0a6c9871b41e 100644
--- a/arch/arm64/boot/dts/mediatek/mt8390-genio-700-evk.dts
+++ b/arch/arm64/boot/dts/mediatek/mt8390-genio-700-evk.dts
@@ -190,6 +190,11 @@ usb_p2_vbus: regulator-10 {
 	};
 };
 
+&gpu {
+	mali-supply = <&mt6359_vproc2_buck_reg>;
+	status = "okay";
+};
+
 &i2c0 {
 	pinctrl-names = "default";
 	pinctrl-0 = <&i2c0_pins>;
@@ -253,6 +258,14 @@ &i2c6 {
 	status = "okay";
 };
 
+&mfg0 {
+	domain-supply = <&mt6359_vproc2_buck_reg>;
+};
+
+&mfg1 {
+	domain-supply = <&mt6359_vsram_others_ldo_reg>;
+};
+
 &mmc0 {
 	status = "okay";
 	pinctrl-names = "default", "state_uhs";
@@ -314,6 +327,15 @@ &mt6359_vpa_buck_reg {
 	regulator-max-microvolt = <3100000>;
 };
 
+&mt6359_vproc2_buck_reg {
+	/* The name "vgpu" is required by mtk-regulator-coupler */
+	regulator-name = "vgpu";
+	regulator-min-microvolt = <550000>;
+	regulator-max-microvolt = <800000>;
+	regulator-coupled-with = <&mt6359_vsram_others_ldo_reg>;
+	regulator-coupled-max-spread = <6250>;
+};
+
 &mt6359_vpu_buck_reg {
 	regulator-always-on;
 };
@@ -326,6 +348,15 @@ &mt6359_vsim1_ldo_reg {
 	regulator-enable-ramp-delay = <480>;
 };
 
+&mt6359_vsram_others_ldo_reg {
+	/* The name "vsram_gpu" is required by mtk-regulator-coupler */
+	regulator-name = "vsram_gpu";
+	regulator-min-microvolt = <750000>;
+	regulator-max-microvolt = <800000>;
+	regulator-coupled-with = <&mt6359_vproc2_buck_reg>;
+	regulator-coupled-max-spread = <6250>;
+};
+
 &mt6359_vufs_ldo_reg {
 	regulator-always-on;
 };
-- 
2.45.2



From macpaul.lin at mediatek.com  Fri Sep 27 03:41:13 2024
From: macpaul.lin at mediatek.com (Macpaul Lin)
Date: Fri, 27 Sep 2024 18:41:13 +0800
Subject: [PATCH v6 2/2] dt-bindings: mfd: mediatek: mt6397: Convert to DT
 schema format
In-Reply-To: <339b4c83-201c-4f63-85d0-b0aa1eb164b0@kernel.org>
References: <20240918064955.6518-1-macpaul.lin@mediatek.com>
 <20240918064955.6518-2-macpaul.lin@mediatek.com>
 <339b4c83-201c-4f63-85d0-b0aa1eb164b0@kernel.org>
Message-ID: <df270bf2-07f3-71a8-1f67-b8417f7a0719@mediatek.com>



On 9/27/24 17:45, Krzysztof Kozlowski wrote:
> 	
> 
> External email : Please do not click links or open attachments until you 
> have verified the sender or the content.
> 
> On 18/09/2024 08:49, Macpaul Lin wrote:
>> Convert the mfd: mediatek: mt6397 binding to DT schema format.
>> 
>> MT6323, MT6358, and MT6397 are PMIC devices with multiple function
>> subdevices. They share a common PMIC design but have variations in
>> subdevice combinations.
>> 
>> Key updates in this conversion:
>> 
>> 1. RTC:
>>    - Convert rtc-mt6397.txt and merge into parent MT6397 PMIC DT schema.
>> 
>> 2. Regulators:
>>    - Align to generic name "regulators".
>>    - Update references from .txt to .yaml for mt6323, mt6358, and mt6397
>>      regulators.
>>    - Simplify regulator name labels in device tree examples.
>> 
>> 3. Audio Codec:
>>    - Convert sound/mt6358.txt and merge into parent MT6397 PMIC DT schema.
>>    - Align to generic name "audio-codec" for codec and sound subdevices.
>>    - Add "mediatek,dmic-mode" and "Avdd-supply" properties.
>> 
>> 4. Clocks:
>>    - Align to generic name "clocks" for clockbuffer subdevices.
>> 
>> 5. LEDs:
>>    - Convert leds-mt6323.txt and merge into parent MT6397 PMIC DT schema.
>>    - Update LED binding.
>> 
>> 6. Keys:
>>    - Add detailed descriptions for power and home keys.
>>    - Add compatible: mediatek,mt6358-keys.
>> 
>> 7. Power Controller:
>>    - Convert mt6323-poweroff.txt and merge into parent MT6397 PMIC DT
>>      schema.
>>    - Add #power-domain-cells property to fix dt-binding check error.
>>    - Clarify "BBPU" as "Baseband power up".
>> 
>> 8. Pinctrl:
>>    - Align to generic name "pinctrl" instead of "pin-controller".
>> 
>> 9. Compatible:
>>    - Drop "mediatek,mt6357" since there is a separated DT Schema
>>      for PMIC MT6357.
>> 
>> 10. Examples:
>>    - MT6323: Retain complete examples for this PMIC.
>>    - MT6358 and MT6397: simplify settings in regulators.
>>     - Preserve "audio-codec", "clocks", "pinctrl", "rtc", and "keys"
>>       sections as they contain typical settings for different PMICs.
>> 
>> Additional updates:
>> - MAINTAINERS: Add co-maintainers and reference to
>>   mfd/mediatek,mt6397.yaml for LED and power-controller drivers.
>> - input/mediatek,pmic-keys.yaml: Update reference to
>>   mfd/mediatek,mt6397.yaml.
>> 
>> Signed-off-by: Sen Chu <sen.chu at mediatek.com>
>> Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
> 
> NAK
> 
> Follow up patch pointed out this is incorrect. I don't understand this
> concept of sending knowingly incorrect code, so please sort it out at v7.
> 
> Best regards,
> Krzysztof
> 

Sorry I didn't know mt6359-codec and mt6358-sound are similar device
until Sept 26 (just yesterday) when I was reviewing the DT
bindings. Until I've found the previous DT Schema of mt6359-codec 
incorrect.
See [1] 
https://lore.kernel.org/linux-arm-kernel/20240926092519.6556-3-macpaul.lin at mediatek.com/T/
and [2] 
https://lore.kernel.org/all/20240926092519.6556-2-macpaul.lin at mediatek.com/

And.. I don't understand, the origin this patch v6 should be a text file
conversion, shouldn't we keep the origin content just a conversion and
trying not to broken other relate modules?

Please help to indicates what is a better approach here:

Should I merge the properties of mt6359-codec, mt6358-sound, and 
mt6397-codec
together and put them all into to mt6359.yaml and redo the converting of 
mfd/medaitek,mt6397.yaml?

That will be much simpler for the audio-codec node for mediatek,mt6397.yaml.
However there will be a little mismatch from the origin text file.

Thanks
Macpaul Lin


From linyunsheng at huawei.com  Fri Sep 27 04:29:22 2024
From: linyunsheng at huawei.com (Yunsheng Lin)
Date: Fri, 27 Sep 2024 19:29:22 +0800
Subject: [PATCH net v2 2/2] page_pool: fix IOMMU crash when driver has
 already unbound
In-Reply-To: <CAC_iWjKeajwn3otjdEekE6VDLHGEvqmnQRwpN5R3yHj8UpEiDw@mail.gmail.com>
References: <20240925075707.3970187-1-linyunsheng@huawei.com>
 <20240925075707.3970187-3-linyunsheng@huawei.com>
 <CAHS8izOxugzWJDTc-4CWqaKABTj=J4OHs=Lcb=SE9r8gX0J+yg@mail.gmail.com>
 <842c8cc6-f716-437a-bc98-70bc26d6fd38@huawei.com>
 <CAC_iWjLgNOtsbhqrhvvEz2C3S668qB8KatL_W+tPHMSkDrNS=w@mail.gmail.com>
 <0ef315df-e8e9-41e8-9ba8-dcb69492c616@huawei.com>
 <CAC_iWjKeajwn3otjdEekE6VDLHGEvqmnQRwpN5R3yHj8UpEiDw@mail.gmail.com>
Message-ID: <934d601f-be43-4e04-b126-dc86890a4bfa@huawei.com>

On 2024/9/27 17:58, Ilias Apalodimas wrote:

...

>>
>>> importantly, though, why does struct page need to know about this?
>>> Can't we have the same information in page pool?
>>> When the driver allocates pages it does via page_pool_dev_alloc_XXXXX
>>> or something similar. Cant we do what you suggest here ? IOW when we
>>> allocate a page we put it in a list, and when that page returns to
>>> page_pool (and it's mapped) we remove it.
>>
>> Yes, that is the basic idea, but the important part is how to do that
>> with less performance impact.
> 
> Yes, but do you think that keeping that list of allocated pages in
> struct page_pool will end up being more costly somehow compared to
> struct page?

I am not sure if I understand your above question here.
I am supposing the question is about what's the cost between using
single/doubly linked list for the inflight pages or using a array
for the inflight pages like this patch does using pool->items?
If I understand question correctly, the single/doubly linked list
is more costly than array as the page_pool case as my understanding.

For single linked list, it doesn't allow deleting a specific entry but
only support deleting the first entry and all the entries. It does support
lockless operation using llist, but have limitation as below:
https://elixir.bootlin.com/linux/v6.7-rc8/source/include/linux/llist.h#L13

For doubly linked list, it needs two pointer to support deleting a specific
entry and it does not support lockless operation.

For pool->items, as the alloc side is protected by NAPI context, and the
free side use item->pp_idx to ensure there is only one producer for each
item, which means for each item in pool->items, there is only one consumer
and one producer, which seems much like the case when the page is not
recyclable in __page_pool_put_page, we don't need a lock protection when
calling page_pool_return_page(), the 'struct page' is also one consumer
and one producer as the pool->items[item->pp_idx] does:
https://elixir.bootlin.com/linux/v6.7-rc8/source/net/core/page_pool.c#L645

We only need a lock protection when page_pool_destroy() is called to
check if there is inflight page to be unmapped as a consumer, and the
__page_pool_put_page() may also called to unmapped the inflight page as
another consumer, there is why the 'destroy_lock' is added for protection
when pool->destroy_cnt > 0.

> 
> Thanks
> /Ilias


From krzk at kernel.org  Fri Sep 27 05:10:10 2024
From: krzk at kernel.org (Krzysztof Kozlowski)
Date: Fri, 27 Sep 2024 14:10:10 +0200
Subject: [PATCH v6 2/2] dt-bindings: mfd: mediatek: mt6397: Convert to DT
 schema format
In-Reply-To: <df270bf2-07f3-71a8-1f67-b8417f7a0719@mediatek.com>
References: <20240918064955.6518-1-macpaul.lin@mediatek.com>
 <20240918064955.6518-2-macpaul.lin@mediatek.com>
 <339b4c83-201c-4f63-85d0-b0aa1eb164b0@kernel.org>
 <df270bf2-07f3-71a8-1f67-b8417f7a0719@mediatek.com>
Message-ID: <6d3d58c8-18ed-4832-ba2c-09b90641cb7d@kernel.org>

On 27/09/2024 12:41, Macpaul Lin wrote:
> 
> 
> On 9/27/24 17:45, Krzysztof Kozlowski wrote:
>> 	
>>
>> External email : Please do not click links or open attachments until you 
>> have verified the sender or the content.
>>
>> On 18/09/2024 08:49, Macpaul Lin wrote:
>>> Convert the mfd: mediatek: mt6397 binding to DT schema format.
>>>
>>> MT6323, MT6358, and MT6397 are PMIC devices with multiple function
>>> subdevices. They share a common PMIC design but have variations in
>>> subdevice combinations.
>>>
>>> Key updates in this conversion:
>>>
>>> 1. RTC:
>>>    - Convert rtc-mt6397.txt and merge into parent MT6397 PMIC DT schema.
>>>
>>> 2. Regulators:
>>>    - Align to generic name "regulators".
>>>    - Update references from .txt to .yaml for mt6323, mt6358, and mt6397
>>>      regulators.
>>>    - Simplify regulator name labels in device tree examples.
>>>
>>> 3. Audio Codec:
>>>    - Convert sound/mt6358.txt and merge into parent MT6397 PMIC DT schema.
>>>    - Align to generic name "audio-codec" for codec and sound subdevices.
>>>    - Add "mediatek,dmic-mode" and "Avdd-supply" properties.
>>>
>>> 4. Clocks:
>>>    - Align to generic name "clocks" for clockbuffer subdevices.
>>>
>>> 5. LEDs:
>>>    - Convert leds-mt6323.txt and merge into parent MT6397 PMIC DT schema.
>>>    - Update LED binding.
>>>
>>> 6. Keys:
>>>    - Add detailed descriptions for power and home keys.
>>>    - Add compatible: mediatek,mt6358-keys.
>>>
>>> 7. Power Controller:
>>>    - Convert mt6323-poweroff.txt and merge into parent MT6397 PMIC DT
>>>      schema.
>>>    - Add #power-domain-cells property to fix dt-binding check error.
>>>    - Clarify "BBPU" as "Baseband power up".
>>>
>>> 8. Pinctrl:
>>>    - Align to generic name "pinctrl" instead of "pin-controller".
>>>
>>> 9. Compatible:
>>>    - Drop "mediatek,mt6357" since there is a separated DT Schema
>>>      for PMIC MT6357.
>>>
>>> 10. Examples:
>>>    - MT6323: Retain complete examples for this PMIC.
>>>    - MT6358 and MT6397: simplify settings in regulators.
>>>     - Preserve "audio-codec", "clocks", "pinctrl", "rtc", and "keys"
>>>       sections as they contain typical settings for different PMICs.
>>>
>>> Additional updates:
>>> - MAINTAINERS: Add co-maintainers and reference to
>>>   mfd/mediatek,mt6397.yaml for LED and power-controller drivers.
>>> - input/mediatek,pmic-keys.yaml: Update reference to
>>>   mfd/mediatek,mt6397.yaml.
>>>
>>> Signed-off-by: Sen Chu <sen.chu at mediatek.com>
>>> Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
>>
>> NAK
>>
>> Follow up patch pointed out this is incorrect. I don't understand this
>> concept of sending knowingly incorrect code, so please sort it out at v7.
>>
>> Best regards,
>> Krzysztof
>>
> 
> Sorry I didn't know mt6359-codec and mt6358-sound are similar device
> until Sept 26 (just yesterday) when I was reviewing the DT
> bindings. Until I've found the previous DT Schema of mt6359-codec 
> incorrect.
> See [1] 
> https://lore.kernel.org/linux-arm-kernel/20240926092519.6556-3-macpaul.lin at mediatek.com/T/
> and [2] 
> https://lore.kernel.org/all/20240926092519.6556-2-macpaul.lin at mediatek.com/
> 
> And.. I don't understand, the origin this patch v6 should be a text file
> conversion, shouldn't we keep the origin content just a conversion and
> trying not to broken other relate modules?

The conversion should be correct. Correct means each compatible has a
schema ending with additional/unevaluatedProperties: false.

If you need to change this binding to "true", it means above statement
was not fulfilled. You did not write proper conversion.

... or I do not understand what you wanted to achieve with the other patch.

> 
> Please help to indicates what is a better approach here:
> 
> Should I merge the properties of mt6359-codec, mt6358-sound, and 
> mt6397-codec
> together and put them all into to mt6359.yaml and redo the converting of 
> mfd/medaitek,mt6397.yaml?

Not sure, I don't know. Are these different devices? How are they
related? I expect you to know this, not me.

The problem is that you send a patch having a finished schema for child
node and then - in next patch in different patchset (!!!) - immediately
change it to false.

So the first code, which was not even merged, is incorrect. This is
heavily misleading.

> 
> That will be much simpler for the audio-codec node for mediatek,mt6397.yaml.
> However there will be a little mismatch from the origin text file.
> 
> Thanks
> Macpaul Lin

Best regards,
Krzysztof



From jakiela at google.com  Fri Sep 27 05:13:53 2024
From: jakiela at google.com (=?UTF-8?q?Albert=20Jakie=C5=82a?=)
Date: Fri, 27 Sep 2024 12:13:53 +0000
Subject: [PATCH v2 1/2] dt-bindings: arm: mediatek: Add MT8186
 Chinchou/Chinchou360 Chromebooks
Message-ID: <20240927121418.4187550-1-jakiela@google.com>

Add entries for MT8186 based Chinchou/Chinchou360 Chromebooks.
These two are clamshell or convertible with touchscreen, stylus
and extra buttons.

Signed-off-by: Albert Jakie?a <jakiela at google.com>
---

Changes since v1:
- PATCH 1/2: Delete sku2147483647
- Link to v1: https://lore.kernel.org/all/20240925080353.2362879-1-jakiela at google.com/

---
 .../devicetree/bindings/arm/mediatek.yaml     | 22 +++++++++++++++++++
 1 file changed, 22 insertions(+)

diff --git a/Documentation/devicetree/bindings/arm/mediatek.yaml b/Documentation/devicetree/bindings/arm/mediatek.yaml
index 1d4bb50fcd8d..47efd96e5659 100644
--- a/Documentation/devicetree/bindings/arm/mediatek.yaml
+++ b/Documentation/devicetree/bindings/arm/mediatek.yaml
@@ -239,6 +239,28 @@ properties:
           - enum:
               - mediatek,mt8183-pumpkin
           - const: mediatek,mt8183
+      - description: Google Chinchou360 (Asus Chromebook CZ11 Flip CZ1104F)
+        items:
+          - const: google,chinchou-sku16
+          - const: google,chinchou-sku18
+          - const: google,chinchou-sku19
+          - const: google,chinchou-sku21
+          - const: mediatek,mt8186
+      - description: Google Chinchou (Asus Chromebook CZ12 Flip CZ1204C)
+        items:
+          - const: google,chinchou-sku0
+          - const: google,chinchou-sku1
+          - const: google,chinchou-sku2
+          - const: google,chinchou-sku3
+          - const: google,chinchou-sku4
+          - const: google,chinchou-sku5
+          - const: google,chinchou-sku6
+          - const: google,chinchou-sku7
+          - const: google,chinchou-sku17
+          - const: google,chinchou-sku22
+          - const: google,chinchou-sku23
+          - const: google,chinchou
+          - const: mediatek,mt8186
       - description: Google Magneton (Lenovo IdeaPad Slim 3 Chromebook (14M868))
         items:
           - const: google,steelix-sku393219
-- 
2.46.1.824.gd892dcdcdd-goog



From jakiela at google.com  Fri Sep 27 05:29:39 2024
From: jakiela at google.com (=?UTF-8?q?Albert=20Jakie=C5=82a?=)
Date: Fri, 27 Sep 2024 12:29:39 +0000
Subject: [PATCH v2 1/2] dt-bindings: arm: mediatek: Add MT8186
 Chinchou/Chinchou360 Chromebooks
Message-ID: <20240927122940.4190949-1-jakiela@google.com>

Add entries for MT8186 based Chinchou/Chinchou360 Chromebooks.
These two are clamshell or convertible with touchscreen, stylus
and extra buttons.

Signed-off-by: Albert Jakie?a <jakiela at google.com>
---

Changes since v1:
- PATCH 1/2: Delete sku2147483647
- Link to v1: https://lore.kernel.org/all/20240925080353.2362879-1-jakiela at google.com/

---
 .../devicetree/bindings/arm/mediatek.yaml     | 22 +++++++++++++++++++
 1 file changed, 22 insertions(+)

diff --git a/Documentation/devicetree/bindings/arm/mediatek.yaml b/Documentation/devicetree/bindings/arm/mediatek.yaml
index 1d4bb50fcd8d..47efd96e5659 100644
--- a/Documentation/devicetree/bindings/arm/mediatek.yaml
+++ b/Documentation/devicetree/bindings/arm/mediatek.yaml
@@ -239,6 +239,28 @@ properties:
           - enum:
               - mediatek,mt8183-pumpkin
           - const: mediatek,mt8183
+      - description: Google Chinchou360 (Asus Chromebook CZ11 Flip CZ1104F)
+        items:
+          - const: google,chinchou-sku16
+          - const: google,chinchou-sku18
+          - const: google,chinchou-sku19
+          - const: google,chinchou-sku21
+          - const: mediatek,mt8186
+      - description: Google Chinchou (Asus Chromebook CZ12 Flip CZ1204C)
+        items:
+          - const: google,chinchou-sku0
+          - const: google,chinchou-sku1
+          - const: google,chinchou-sku2
+          - const: google,chinchou-sku3
+          - const: google,chinchou-sku4
+          - const: google,chinchou-sku5
+          - const: google,chinchou-sku6
+          - const: google,chinchou-sku7
+          - const: google,chinchou-sku17
+          - const: google,chinchou-sku22
+          - const: google,chinchou-sku23
+          - const: google,chinchou
+          - const: mediatek,mt8186
       - description: Google Magneton (Lenovo IdeaPad Slim 3 Chromebook (14M868))
         items:
           - const: google,steelix-sku393219
-- 
2.46.1.824.gd892dcdcdd-goog



From jakiela at google.com  Fri Sep 27 05:29:40 2024
From: jakiela at google.com (=?UTF-8?q?Albert=20Jakie=C5=82a?=)
Date: Fri, 27 Sep 2024 12:29:40 +0000
Subject: [PATCH v2 2/2] arm64: dts: mediate: Introduce MT8186
 Chinchou/Chinchou360 Chromebooks
In-Reply-To: <20240927122940.4190949-1-jakiela@google.com>
References: <20240927122940.4190949-1-jakiela@google.com>
Message-ID: <20240927122940.4190949-2-jakiela@google.com>

The MT8186 Chinchou/Chinchou360, also known as the Asus Chromebook
CZ12/CZ11 Flip, is a clamshell or convertible device with touchscreen,
stylus and extra buttons.

Signed-off-by: Albert Jakie?a <jakiela at google.com>
---
Changes in v2:
- PATCH 2/2: Remove sku2147483647, remove duplicate nodes, add model
	and remove uneccecery nodes from sound card.
- Link to v1: https://lore.kernel.org/all/20240925080353.2362879-2-jakiela at google.com/

---
 arch/arm64/boot/dts/mediatek/Makefile         |   3 +
 .../mediatek/mt8186-corsola-chinchou-sku0.dts |  18 +
 .../mediatek/mt8186-corsola-chinchou-sku1.dts |  34 ++
 .../mt8186-corsola-chinchou-sku16.dts         |  28 ++
 .../dts/mediatek/mt8186-corsola-chinchou.dtsi | 432 ++++++++++++++++++
 5 files changed, 515 insertions(+)
 create mode 100644 arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku0.dts
 create mode 100644 arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku1.dts
 create mode 100644 arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku16.dts
 create mode 100644 arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou.dtsi

diff --git a/arch/arm64/boot/dts/mediatek/Makefile b/arch/arm64/boot/dts/mediatek/Makefile
index 8fd7b2bb7a15..0db7770e8907 100644
--- a/arch/arm64/boot/dts/mediatek/Makefile
+++ b/arch/arm64/boot/dts/mediatek/Makefile
@@ -55,6 +55,9 @@ dtb-$(CONFIG_ARCH_MEDIATEK) += mt8183-kukui-kodama-sku32.dtb
 dtb-$(CONFIG_ARCH_MEDIATEK) += mt8183-kukui-krane-sku0.dtb
 dtb-$(CONFIG_ARCH_MEDIATEK) += mt8183-kukui-krane-sku176.dtb
 dtb-$(CONFIG_ARCH_MEDIATEK) += mt8183-pumpkin.dtb
+dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-chinchou-sku0.dtb
+dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-chinchou-sku1.dtb
+dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-chinchou-sku16.dtb
 dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-magneton-sku393216.dtb
 dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-magneton-sku393217.dtb
 dtb-$(CONFIG_ARCH_MEDIATEK) += mt8186-corsola-magneton-sku393218.dtb
diff --git a/arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku0.dts b/arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku0.dts
new file mode 100644
index 000000000000..29dd92318da1
--- /dev/null
+++ b/arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku0.dts
@@ -0,0 +1,18 @@
+// SPDX-License-Identifier: (GPL-2.0 OR MIT)
+/*
+ * Copyright 2023 Google LLC
+ */
+
+/dts-v1/;
+#include "mt8186-corsola-chinchou.dtsi"
+
+/ {
+	model = "Google chinchou sku0 board";
+	compatible = "google,chinchou-sku0", "google,chinchou-sku2",
+			"google,chinchou-sku4", "google,chinchou-sku5",
+			"google,chinchou", "mediatek,mt8186";
+};
+
+&gpio_keys {
+	status = "disabled";
+};
diff --git a/arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku1.dts b/arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku1.dts
new file mode 100644
index 000000000000..8ba31f81d9ad
--- /dev/null
+++ b/arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku1.dts
@@ -0,0 +1,34 @@
+// SPDX-License-Identifier: (GPL-2.0 OR MIT)
+/*
+ * Copyright 2023 Google LLC
+ */
+
+/dts-v1/;
+#include "mt8186-corsola-chinchou.dtsi"
+
+/ {
+	model = "Google chinchou sku1/sku17 board";
+	compatible = "google,chinchou-sku1", "google,chinchou-sku17",
+			"google,chinchou-sku3", "google,chinchou-sku6",
+			"google,chinchou-sku7", "google,chinchou-sku20",
+			"google,chinchou-sku22", "google,chinchou-sku23",
+			"mediatek,mt8186";
+};
+
+&i2c1 {
+	i2c-scl-internal-delay-ns = <10000>;
+
+	touchscreen: touchscreen at 41 {
+		compatible = "ilitek,ili2901";
+		reg = <0x41>;
+		interrupts-extended = <&pio 12 IRQ_TYPE_LEVEL_LOW>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&touchscreen_pins>;
+		reset-gpios = <&pio 60 GPIO_ACTIVE_LOW>;
+		vccio-supply = <&pp1800_tchscr_report_disable>;
+	};
+};
+
+&gpio_keys {
+	status = "disabled";
+};
diff --git a/arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku16.dts b/arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku16.dts
new file mode 100644
index 000000000000..24084a77999a
--- /dev/null
+++ b/arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku16.dts
@@ -0,0 +1,28 @@
+// SPDX-License-Identifier: (GPL-2.0 OR MIT)
+/*
+ * Copyright 2023 Google LLC
+ */
+
+/dts-v1/;
+#include "mt8186-corsola-chinchou.dtsi"
+
+/ {
+	model = "Google chinchou sku16/sku2147483647 board";
+	compatible = "google,chinchou-sku16", "google,chinchou-sku18",
+			"google,chinchou-sku19", "google,chinchou-sku21",
+			"mediatek,mt8186";
+};
+
+&i2c1 {
+	i2c-scl-internal-delay-ns = <10000>;
+
+	touchscreen: touchscreen at 41 {
+		compatible = "ilitek,ili2901";
+		reg = <0x41>;
+		interrupts-extended = <&pio 12 IRQ_TYPE_LEVEL_LOW>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&touchscreen_pins>;
+		reset-gpios = <&pio 60 GPIO_ACTIVE_LOW>;
+		vccio-supply = <&pp1800_tchscr_report_disable>;
+	};
+};
diff --git a/arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou.dtsi b/arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou.dtsi
new file mode 100644
index 000000000000..96cc3c267c20
--- /dev/null
+++ b/arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou.dtsi
@@ -0,0 +1,432 @@
+// SPDX-License-Identifier: (GPL-2.0 OR MIT)
+/*
+ * Copyright 2023 Google LLC
+ */
+
+/dts-v1/;
+#include "mt8186-corsola.dtsi"
+
+/ {
+	tboard_thermistor1: thermal-sensor1 {
+		compatible = "generic-adc-thermal";
+		#thermal-sensor-cells = <0>;
+		io-channels = <&auxadc 0>;
+		io-channel-names = "sensor-channel";
+		temperature-lookup-table = <    (-5000) 1491
+						0 1413
+						5000 1324
+						10000 1225
+						15000 1120
+						20000 1012
+						25000 900
+						30000 797
+						35000 698
+						40000 607
+						45000 525
+						50000 451
+						55000 386
+						60000 330
+						65000 282
+						70000 241
+						75000 206
+						80000 176
+						85000 151
+						90000 129
+						95000 111
+						100000 96
+						105000 83
+						110000 72
+						115000 62
+						120000 54
+						125000 47>;
+	};
+
+	tboard_thermistor2: thermal-sensor2 {
+		compatible = "generic-adc-thermal";
+		#thermal-sensor-cells = <0>;
+		io-channels = <&auxadc 1>;
+		io-channel-names = "sensor-channel";
+		temperature-lookup-table = <    (-5000) 1491
+						0 1413
+						5000 1324
+						10000 1225
+						15000 1120
+						20000 1012
+						25000 900
+						30000 797
+						35000 698
+						40000 607
+						45000 525
+						50000 451
+						55000 386
+						60000 330
+						65000 282
+						70000 241
+						75000 206
+						80000 176
+						85000 151
+						90000 129
+						95000 111
+						100000 96
+						105000 83
+						110000 72
+						115000 62
+						120000 54
+						125000 47>;
+	};
+
+	pp1800_tchscr_report_disable: regulator-pp1800-tchscr-report-disable {
+		compatible = "regulator-fixed";
+		regulator-name = "pp1800_tchscr_report_disable";
+		pinctrl-names = "default";
+		enable-active-low;
+		regulator-boot-on;
+		pinctrl-0 = <&touch_pin_report>;
+		gpio = <&pio 37 GPIO_ACTIVE_LOW>;
+	};
+
+	pp1000_edpbrdg: regulator-pp1000-edpbrdg {
+		compatible = "regulator-fixed";
+		regulator-name = "pp1000_edpbrdg";
+		pinctrl-names = "default";
+		pinctrl-0 = <&en_pp1000_edpbrdg>;
+		enable-active-high;
+		regulator-boot-on;
+		gpio = <&pio 29 GPIO_ACTIVE_HIGH>;
+		vin-supply = <&pp3300_z2>;
+	};
+
+	pp1800_edpbrdg_dx: regulator-pp1800-edpbrdg-dx {
+		compatible = "regulator-fixed";
+		regulator-name = "pp1800_edpbrdg_dx";
+		pinctrl-names = "default";
+		pinctrl-0 = <&en_pp1800_edpbrdg>;
+		enable-active-high;
+		regulator-boot-on;
+		gpio = <&pio 30 GPIO_ACTIVE_HIGH>;
+		vin-supply = <&mt6366_vio18_reg>;
+	};
+
+	pp3300_edp_dx: regulator-pp3300-edp-dx {
+		compatible = "regulator-fixed";
+		regulator-name = "pp3300_edp_dx";
+		pinctrl-names = "default";
+		pinctrl-0 = <&en_pp3300_edpbrdg>;
+		enable-active-high;
+		regulator-boot-on;
+		gpio = <&pio 31 GPIO_ACTIVE_HIGH>;
+		vin-supply = <&pp3300_z2>;
+	};
+};
+
+&rt5682s {
+	status = "disabled";
+};
+
+&rt1019p {
+	status = "disabled";
+};
+
+&dsi_out {
+	remote-endpoint = <&anx7625_in>;
+};
+
+&i2c0 {
+	clock-frequency = <400000>;
+
+	anx_bridge: anx7625 at 58 {
+		compatible = "analogix,anx7625";
+		reg = <0x58>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&anx7625_pins>;
+		panel_flags = <1>;
+		enable-gpios = <&pio 96 GPIO_ACTIVE_HIGH>;
+		reset-gpios = <&pio 98 GPIO_ACTIVE_HIGH>;
+		vdd10-supply = <&pp1000_edpbrdg>;
+		vdd18-supply = <&pp1800_edpbrdg_dx>;
+		vdd33-supply = <&pp3300_edp_dx>;
+		#address-cells = <1>;
+		#size-cells = <0>;
+		analogix,lane0-swing = /bits/ 8 <0x70 0x30>;
+		analogix,lane1-swing = /bits/ 8 <0x70 0x30>;
+
+		port at 0 {
+			reg = <0>;
+
+			anx7625_in: endpoint {
+				remote-endpoint = <&dsi_out>;
+				data-lanes = <0 1 2 3>;
+			};
+		};
+
+		port at 1 {
+			reg = <1>;
+
+			anx7625_out: endpoint {
+				remote-endpoint = <&panel_in>;
+			};
+		};
+
+		aux-bus {
+			panel: panel {
+				compatible = "edp-panel";
+				power-supply = <&pp3300_disp_x>;
+				backlight = <&backlight_lcd0>;
+
+				port {
+					panel_in: endpoint {
+						remote-endpoint = <&anx7625_out>;
+					};
+				};
+			};
+		};
+	};
+};
+
+&i2c2 {
+	trackpad at 15 {
+		compatible = "hid-over-i2c";
+		post-power-on-delay-ms = <10>;
+		hid-descr-addr = <0x0001>;
+		vdd-supply = <&pp3300_s3>;
+	};
+};
+
+&i2c5 {
+	clock-frequency = <400000>;
+
+	rt5650: rt5650 at 1a {
+		compatible = "realtek,rt5650";
+		reg = <0x1a>;
+		avdd-supply = <&mt6366_vio18_reg>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&rt1019p_pins_default>;
+		cbj-sleeve-gpio = <&pio 150 GPIO_ACTIVE_HIGH>;
+		interrupt-parent = <&pio>;
+		interrupts = <17 IRQ_TYPE_EDGE_BOTH>;
+		#sound-dai-cells = <0>;
+		realtek,dmic1-data-pin = <2>;
+		realtek,jd-mode = <2>;
+	};
+};
+
+&mmc1_pins_default {
+	pins-clk {
+		drive-strength = <8>;
+	};
+
+	pins-cmd-dat {
+		drive-strength = <8>;
+	};
+};
+
+&mmc1_pins_uhs {
+	pins-clk {
+		drive-strength = <8>;
+	};
+
+	pins-cmd-dat {
+		drive-strength = <8>;
+	};
+};
+
+&sound {
+	status = "okay";
+
+	compatible = "mediatek,mt8186-mt6366-rt5650-sound";
+	model = "mt8186_rt5650";
+
+	audio-routing =
+		"Headphone", "HPOL",
+		"Headphone", "HPOR",
+		"HDMI1", "TX";
+
+	hs-playback-dai-link {
+		codec {
+			sound-dai = <&rt5650>;
+		};
+	};
+
+	hs-capture-dai-link {
+		codec {
+			sound-dai = <&rt5650>;
+		};
+	};
+
+	spk-hdmi-playback-dai-link {
+		codec {
+			sound-dai = <&it6505dptx>;
+		};
+	};
+};
+
+&keyboard_controller {
+	keypad,num-columns = <15>;
+
+	function-row-physmap = <
+		MATRIX_KEY(0x00, 0x02, 0)        /* T1 */
+		MATRIX_KEY(0x03, 0x02, 0)        /* T2 */
+		MATRIX_KEY(0x02, 0x02, 0)        /* T3 */
+		MATRIX_KEY(0x01, 0x02, 0)        /* T4 */
+		MATRIX_KEY(0x03, 0x04, 0)        /* T5 */
+		MATRIX_KEY(0x02, 0x04, 0)        /* T6 */
+		MATRIX_KEY(0x01, 0x04, 0)        /* T7 */
+		MATRIX_KEY(0x02, 0x09, 0)        /* T8 */
+		MATRIX_KEY(0x01, 0x09, 0)        /* T9 */
+		MATRIX_KEY(0x00, 0x04, 0)        /* T10 */
+		MATRIX_KEY(0x00, 0x01, 0)        /* T11 */
+		MATRIX_KEY(0x01, 0x05, 0)        /* T12 */
+	>;
+
+	linux,keymap = <
+		CROS_STD_MAIN_KEYMAP
+		MATRIX_KEY(0x00, 0x02, KEY_BACK)           /* T1 */
+		MATRIX_KEY(0x03, 0x02, KEY_REFRESH)        /* T2 */
+		MATRIX_KEY(0x02, 0x02, KEY_ZOOM)           /* T3 */
+		MATRIX_KEY(0x01, 0x02, KEY_SCALE)          /* T4 */
+		MATRIX_KEY(0x03, 0x04, KEY_SYSRQ)          /* T5 */
+		MATRIX_KEY(0x02, 0x04, KEY_BRIGHTNESSDOWN) /* T6 */
+		MATRIX_KEY(0x01, 0x04, KEY_BRIGHTNESSUP)   /* T7 */
+		MATRIX_KEY(0x02, 0x09, KEY_MUTE)           /* T8 */
+		MATRIX_KEY(0x01, 0x09, KEY_VOLUMEDOWN)	   /* T9 */
+		MATRIX_KEY(0x00, 0x04, KEY_VOLUMEUP)	   /* T10 */
+		MATRIX_KEY(0x00, 0x01, KEY_MICMUTE)        /* T11 */
+		MATRIX_KEY(0x01, 0x05, KEY_CONTROLPANEL)   /* T12 */
+		MATRIX_KEY(0x03, 0x05, KEY_PREVIOUSSONG)   /* T13 */
+		MATRIX_KEY(0x00, 0x09, KEY_PLAYPAUSE)	   /* T14 */
+		MATRIX_KEY(0x00, 0x0b, KEY_NEXTSONG)	   /* T15 */
+		MATRIX_KEY(0x03, 0x00, KEY_LEFTMETA)	   /* Search*/
+		MATRIX_KEY(0x01, 0x0e, KEY_LEFTCTRL)	   /* Left Control*/
+		MATRIX_KEY(0x06, 0x0d, KEY_LEFTALT)        /* Left ALT*/
+		MATRIX_KEY(0x03, 0x0e, KEY_RIGHTCTRL)      /* Right Control*/
+		MATRIX_KEY(0x06, 0x0a, KEY_BACKSLASH)      /* BACKSLASH*/
+	>;
+};
+
+&thermal_zones {
+	cpu-ntc {
+		polling-delay = <1000>; /* milliseconds */
+		polling-delay-passive = <0>; /* milliseconds */
+		thermal-sensors = <&tboard_thermistor1>;
+	};
+
+	pmic-ntc {
+		polling-delay = <1000>; /* milliseconds */
+		polling-delay-passive = <50>; /* milliseconds */
+		thermal-sensors = <&tboard_thermistor2>;
+		sustainable-power = <1500>;
+
+		trips {
+			pmic_temp_alert0: trip-point at 0 {
+				temperature = <50000>;
+				hysteresis = <2000>;
+				type = "passive";
+			};
+
+			pmic_temp_alert1: target at 1 {
+				temperature = <60000>;
+				hysteresis = <2000>;
+				type = "passive";
+			};
+
+			pmic_ntc_crit: pmic-ntc-crit at 0 {
+				temperature = <80000>;
+				hysteresis = <2000>;
+				type = "critical";
+			};
+		};
+
+		cooling-maps {
+			map0 {
+				trip = <&pmic_temp_alert1>;
+				cooling-device = <&cpu0
+					THERMAL_NO_LIMIT
+					THERMAL_NO_LIMIT>,
+						<&cpu1
+					THERMAL_NO_LIMIT
+					THERMAL_NO_LIMIT>,
+						<&cpu2
+					THERMAL_NO_LIMIT
+					THERMAL_NO_LIMIT>,
+						<&cpu3
+					THERMAL_NO_LIMIT
+					THERMAL_NO_LIMIT>,
+						<&cpu4
+					THERMAL_NO_LIMIT
+					THERMAL_NO_LIMIT>,
+						<&cpu5
+					THERMAL_NO_LIMIT
+					THERMAL_NO_LIMIT>;
+				contribution = <4096>;
+			};
+
+			map1 {
+				trip = <&pmic_temp_alert1>;
+				cooling-device = <&cpu6
+					THERMAL_NO_LIMIT
+					THERMAL_NO_LIMIT>,
+						<&cpu7
+					THERMAL_NO_LIMIT
+					THERMAL_NO_LIMIT>;
+				contribution = <1024>;
+			};
+		};
+	};
+};
+
+&pio {
+	touch_pin_report: pin-report {
+		pinmux = <PINMUX_GPIO37__FUNC_GPIO37>;
+		output-low;
+	};
+
+	anx7625_pins: anx7625-pins {
+		pins1 {
+			pinmux = <PINMUX_GPIO96__FUNC_GPIO96>,
+			<PINMUX_GPIO98__FUNC_GPIO98>;
+			output-low;
+		};
+
+		pins2 {
+			pinmux = <PINMUX_GPIO9__FUNC_GPIO9>;
+			input-enable;
+			bias-pull-up;
+		};
+	};
+
+	en_pp1000_edpbrdg: pp1000-edpbrdg-en-pins {
+		pins-vreg-en {
+			pinmux = <PINMUX_GPIO29__FUNC_GPIO29>;
+			output-low;
+		};
+	};
+
+	en_pp1800_edpbrdg: pp1800-edpbrdg-en-pins {
+		pins-vreg-en {
+			pinmux = <PINMUX_GPIO30__FUNC_GPIO30>;
+			output-low;
+		};
+	};
+
+	en_pp3300_edpbrdg: pp3300-edpbrdg-en-pins {
+		pins-vreg-en {
+			pinmux = <PINMUX_GPIO31__FUNC_GPIO31>;
+			output-low;
+		};
+	};
+};
+
+&i2c_tunnel {
+	/delete-node/ sbs-battery at b;
+
+	battery: sbs-battery at f {
+		compatible = "sbs,sbs-battery";
+		reg = <0xf>;
+		sbs,i2c-retry-count = <2>;
+		sbs,poll-retry-count = <1>;
+	};
+};
+
+&pen_insert {
+	wakeup-event-action = <EV_ACT_ANY>;
+};
-- 
2.46.1.824.gd892dcdcdd-goog



From robh at kernel.org  Fri Sep 27 07:21:21 2024
From: robh at kernel.org (Rob Herring (Arm))
Date: Fri, 27 Sep 2024 09:21:21 -0500
Subject: [PATCH v2 1/2] dt-bindings: arm: mediatek: Add MT8186
 Chinchou/Chinchou360 Chromebooks
In-Reply-To: <20240927122940.4190949-1-jakiela@google.com>
References: <20240927122940.4190949-1-jakiela@google.com>
Message-ID: <172744667757.3625970.10650745782102063964.robh@kernel.org>


On Fri, 27 Sep 2024 12:29:39 +0000, Albert Jakie?a wrote:
> Add entries for MT8186 based Chinchou/Chinchou360 Chromebooks.
> These two are clamshell or convertible with touchscreen, stylus
> and extra buttons.
> 
> Signed-off-by: Albert Jakie?a <jakiela at google.com>
> ---
> 
> Changes since v1:
> - PATCH 1/2: Delete sku2147483647
> - Link to v1: https://lore.kernel.org/all/20240925080353.2362879-1-jakiela at google.com/
> 
> ---
>  .../devicetree/bindings/arm/mediatek.yaml     | 22 +++++++++++++++++++
>  1 file changed, 22 insertions(+)
> 


My bot found new DTB warnings on the .dts files added or changed in this
series.

Some warnings may be from an existing SoC .dtsi. Or perhaps the warnings
are fixed by another series. Ultimately, it is up to the platform
maintainer whether these warnings are acceptable or not. No need to reply
unless the platform maintainer has comments.

If you already ran DT checks and didn't see these error(s), then
make sure dt-schema is up to date:

  pip3 install dtschema --upgrade


New warnings running 'make CHECK_DTBS=y mediatek/mt8186-corsola-chinchou-sku0.dtb mediatek/mt8186-corsola-chinchou-sku1.dtb mediatek/mt8186-corsola-chinchou-sku16.dtb' for 20240927122940.4190949-1-jakiela at google.com:

arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku0.dtb: /: compatible: 'oneOf' conditional failed, one must be fixed:
	['google,chinchou-sku0', 'google,chinchou-sku2', 'google,chinchou-sku4', 'google,chinchou-sku5', 'google,chinchou', 'mediatek,mt8186'] is too long
	['google,chinchou-sku0', 'google,chinchou-sku2', 'google,chinchou-sku4', 'google,chinchou-sku5', 'google,chinchou', 'mediatek,mt8186'] is too short
	'google,chinchou-sku0' is not one of ['mediatek,mt2701-evb']
	'google,chinchou-sku0' is not one of ['mediatek,mt2712-evb']
	'google,chinchou-sku0' is not one of ['mediatek,mt6580-evbp1']
	'google,chinchou-sku0' is not one of ['prestigio,pmt5008-3g']
	'google,chinchou-sku0' is not one of ['fairphone,fp1', 'mundoreader,bq-aquaris5']
	'google,chinchou-sku0' is not one of ['mediatek,mt6592-evb']
	'google,chinchou-sku0' is not one of ['mediatek,mt6755-evb']
	'google,chinchou-sku0' is not one of ['mediatek,mt6765-evb']
	'google,chinchou-sku0' is not one of ['mediatek,mt6779-evb']
	'google,chinchou-sku0' is not one of ['mediatek,mt6795-evb', 'sony,xperia-m5']
	'google,chinchou-sku0' is not one of ['archermind,mt6797-x20-dev', 'mediatek,mt6797-evb']
	'google,chinchou-sku0' is not one of ['bananapi,bpi-r64', 'mediatek,mt7622-rfb1']
	'google,chinchou-sku0' is not one of ['mediatek,mt7623a-rfb-emmc', 'mediatek,mt7623a-rfb-nand', 'mediatek,mt7623n-rfb-emmc', 'bananapi,bpi-r2']
	'google,chinchou-sku0' is not one of ['mediatek,mt7629-rfb']
	'google,chinchou-sku0' is not one of ['cudy,wr3000-v1', 'openwrt,one', 'xiaomi,ax3000t']
	'google,chinchou-sku0' is not one of ['acelink,ew-7886cax', 'bananapi,bpi-r3', 'bananapi,bpi-r3mini', 'mediatek,mt7986a-rfb']
	'google,chinchou-sku0' is not one of ['mediatek,mt7986b-rfb']
	'google,chinchou-sku0' is not one of ['bananapi,bpi-r4']
	'google,chinchou-sku0' is not one of ['mediatek,mt8127-moose']
	'google,chinchou-sku0' is not one of ['mediatek,mt8135-evbp1']
	'google,chinchou-sku0' is not one of ['mediatek,mt8167-pumpkin']
	'google,elm-rev8' was expected
	'google,hana-rev6' was expected
	'google,hana-rev7' was expected
	'google,chinchou-sku0' is not one of ['mediatek,mt8173-evb']
	'google,burnet' was expected
	'google,cozmo' was expected
	'google,damu' was expected
	'google,chinchou-sku0' is not one of ['google,fennel-sku0', 'google,fennel-sku1', 'google,fennel-sku2', 'google,fennel-sku6', 'google,fennel-sku7']
	'google,chinchou-sku0' is not one of ['google,juniper-sku16', 'google,juniper-sku17']
	'google,kakadu-rev3' was expected
	'google,kakadu-rev3-sku22' was expected
	'google,kappa' was expected
	'google,chinchou-sku0' is not one of ['google,katsu-sku32', 'google,katsu-sku38']
	'google,chinchou-sku0' is not one of ['google,kodama-sku16', 'google,kodama-sku272', 'google,kodama-sku288', 'google,kodama-sku32']
	'google,chinchou-sku0' is not one of ['google,krane-sku0', 'google,krane-sku176']
	'google,chinchou-sku0' is not one of ['google,makomo-sku0', 'google,makomo-sku1']
	'google,chinchou-sku0' is not one of ['google,pico-sku1', 'google,pico-sku2']
	'google,chinchou-sku0' is not one of ['google,willow-sku0', 'google,willow-sku1']
	'google,chinchou-sku0' is not one of ['mediatek,mt8183-evb']
	'google,chinchou-sku0' is not one of ['mediatek,mt8183-pumpkin']
	'google,chinchou-sku16' was expected
	'google,steelix-sku393219' was expected
	'google,steelix-sku393220' was expected
	'google,steelix-sku393221' was expected
	'google,steelix-sku196609' was expected
	'google,chinchou-sku0' is not one of ['google,steelix-sku131072', 'google,steelix-sku131073']
	'google,tentacruel-sku262147' was expected
	'google,tentacruel-sku262151' was expected
	'google,tentacruel-sku327681' was expected
	'google,tentacruel-sku327683' was expected
	'google,chinchou-sku0' is not one of ['google,voltorb-sku589824', 'google,voltorb-sku589825']
	'google,chinchou-sku0' is not one of ['mediatek,mt8186-evb']
	'google,chinchou-sku0' is not one of ['mediatek,mt8188-evb']
	'google,hayato-rev1' was expected
	'google,hayato-rev5-sku2' was expected
	'google,spherion-rev3' was expected
	'google,spherion-rev4' was expected
	'google,chinchou-sku0' is not one of ['mediatek,mt8192-evb']
	'google,chinchou-sku0' is not one of ['google,tomato-rev2', 'google,tomato-rev1']
	'google,tomato-rev4' was expected
	'google,dojo-sku7' was expected
	'google,chinchou-sku0' is not one of ['mediatek,mt8195-demo', 'mediatek,mt8195-evb']
	'google,chinchou-sku0' is not one of ['mediatek,mt8365-evk']
	'google,chinchou-sku0' is not one of ['mediatek,mt8390-evk']
	'google,chinchou-sku0' is not one of ['kontron,3-5-sbc-i1200', 'mediatek,mt8395-evk', 'radxa,nio-12l']
	'google,chinchou-sku0' is not one of ['mediatek,mt8516-pumpkin']
	'mediatek,mt2701' was expected
	'mediatek,mt2712' was expected
	'mediatek,mt6580' was expected
	'mediatek,mt6582' was expected
	'mediatek,mt6589' was expected
	'mediatek,mt6592' was expected
	'mediatek,mt6755' was expected
	'mediatek,mt6765' was expected
	'mediatek,mt6779' was expected
	'mediatek,mt6795' was expected
	'mediatek,mt6797' was expected
	'mediatek,mt7622' was expected
	'mediatek,mt7623' was expected
	'mediatek,mt7629' was expected
	'mediatek,mt7981b' was expected
	'mediatek,mt7986a' was expected
	'mediatek,mt7986b' was expected
	'mediatek,mt7988a' was expected
	'mediatek,mt8127' was expected
	'mediatek,mt8135' was expected
	'mediatek,mt8167' was expected
	'google,elm-rev7' was expected
	'google,hana-rev5' was expected
	'mediatek,mt8173' was expected
	'mediatek,mt8183' was expected
	'google,fennel' was expected
	'google,juniper' was expected
	'google,kakadu-rev2' was expected
	'google,kakadu-rev2-sku22' was expected
	'google,katsu' was expected
	'google,kodama' was expected
	'google,krane' was expected
	'google,makomo' was expected
	'google,pico' was expected
	'google,willow' was expected
	'google,chinchou-sku18' was expected
	'google,chinchou-sku1' was expected
	'google,steelix-sku393216' was expected
	'google,steelix-sku393217' was expected
	'google,steelix-sku393218' was expected
	'google,steelix-sku196608' was expected
	'google,steelix' was expected
	'google,tentacruel-sku262146' was expected
	'google,tentacruel-sku262150' was expected
	'google,tentacruel' was expected
	'google,voltorb' was expected
	'mediatek,mt8186' was expected
	'mediatek,mt8188' was expected
	'google,hayato' was expected
	'google,hayato-sku2' was expected
	'google,spherion-rev2' was expected
	'google,spherion' was expected
	'mediatek,mt8192' was expected
	'google,tomato' was expected
	'google,tomato-rev3' was expected
	'google,dojo-sku5' was expected
	'mediatek,mt8195' was expected
	'mediatek,mt8365' was expected
	'mediatek,mt8390' was expected
	'mediatek,mt8395' was expected
	'mediatek,mt8516' was expected
	'google,elm-rev6' was expected
	'google,hana-rev4' was expected
	'google,kakadu' was expected
	'google,chinchou-sku19' was expected
	'google,chinchou-sku2' was expected
	'google,tentacruel-sku262145' was expected
	'google,tentacruel-sku262149' was expected
	'google,spherion-rev1' was expected
	'google,dojo-sku3' was expected
	'google,elm-rev5' was expected
	'google,hana-rev3' was expected
	'google,chinchou-sku21' was expected
	'google,chinchou-sku3' was expected
	'google,tentacruel-sku262144' was expected
	'google,tentacruel-sku262148' was expected
	'google,spherion-rev0' was expected
	'google,dojo-sku1' was expected
	'google,elm-rev4' was expected
	'google,hana' was expected
	'google,chinchou-sku4' was expected
	'google,dojo' was expected
	'google,elm-rev3' was expected
	'google,chinchou-sku5' was expected
	from schema $id: http://devicetree.org/schemas/arm/mediatek.yaml#
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku1.dtb: /: compatible: 'oneOf' conditional failed, one must be fixed:
	['google,chinchou-sku1', 'google,chinchou-sku17', 'google,chinchou-sku3', 'google,chinchou-sku6', 'google,chinchou-sku7', 'google,chinchou-sku20', 'google,chinchou-sku22', 'google,chinchou-sku23', 'mediatek,mt8186'] is too long
	['google,chinchou-sku1', 'google,chinchou-sku17', 'google,chinchou-sku3', 'google,chinchou-sku6', 'google,chinchou-sku7', 'google,chinchou-sku20', 'google,chinchou-sku22', 'google,chinchou-sku23', 'mediatek,mt8186'] is too short
	'google,chinchou-sku1' is not one of ['mediatek,mt2701-evb']
	'google,chinchou-sku1' is not one of ['mediatek,mt2712-evb']
	'google,chinchou-sku1' is not one of ['mediatek,mt6580-evbp1']
	'google,chinchou-sku1' is not one of ['prestigio,pmt5008-3g']
	'google,chinchou-sku1' is not one of ['fairphone,fp1', 'mundoreader,bq-aquaris5']
	'google,chinchou-sku1' is not one of ['mediatek,mt6592-evb']
	'google,chinchou-sku1' is not one of ['mediatek,mt6755-evb']
	'google,chinchou-sku1' is not one of ['mediatek,mt6765-evb']
	'google,chinchou-sku1' is not one of ['mediatek,mt6779-evb']
	'google,chinchou-sku1' is not one of ['mediatek,mt6795-evb', 'sony,xperia-m5']
	'google,chinchou-sku1' is not one of ['archermind,mt6797-x20-dev', 'mediatek,mt6797-evb']
	'google,chinchou-sku1' is not one of ['bananapi,bpi-r64', 'mediatek,mt7622-rfb1']
	'google,chinchou-sku1' is not one of ['mediatek,mt7623a-rfb-emmc', 'mediatek,mt7623a-rfb-nand', 'mediatek,mt7623n-rfb-emmc', 'bananapi,bpi-r2']
	'google,chinchou-sku1' is not one of ['mediatek,mt7629-rfb']
	'google,chinchou-sku1' is not one of ['cudy,wr3000-v1', 'openwrt,one', 'xiaomi,ax3000t']
	'google,chinchou-sku1' is not one of ['acelink,ew-7886cax', 'bananapi,bpi-r3', 'bananapi,bpi-r3mini', 'mediatek,mt7986a-rfb']
	'google,chinchou-sku1' is not one of ['mediatek,mt7986b-rfb']
	'google,chinchou-sku1' is not one of ['bananapi,bpi-r4']
	'google,chinchou-sku1' is not one of ['mediatek,mt8127-moose']
	'google,chinchou-sku1' is not one of ['mediatek,mt8135-evbp1']
	'google,chinchou-sku1' is not one of ['mediatek,mt8167-pumpkin']
	'google,elm-rev8' was expected
	'google,hana-rev6' was expected
	'google,hana-rev7' was expected
	'google,chinchou-sku1' is not one of ['mediatek,mt8173-evb']
	'google,burnet' was expected
	'google,cozmo' was expected
	'google,damu' was expected
	'google,chinchou-sku1' is not one of ['google,fennel-sku0', 'google,fennel-sku1', 'google,fennel-sku2', 'google,fennel-sku6', 'google,fennel-sku7']
	'google,chinchou-sku1' is not one of ['google,juniper-sku16', 'google,juniper-sku17']
	'google,kakadu-rev3' was expected
	'google,kakadu-rev3-sku22' was expected
	'google,kappa' was expected
	'google,chinchou-sku1' is not one of ['google,katsu-sku32', 'google,katsu-sku38']
	'google,chinchou-sku1' is not one of ['google,kodama-sku16', 'google,kodama-sku272', 'google,kodama-sku288', 'google,kodama-sku32']
	'google,chinchou-sku1' is not one of ['google,krane-sku0', 'google,krane-sku176']
	'google,chinchou-sku1' is not one of ['google,makomo-sku0', 'google,makomo-sku1']
	'google,chinchou-sku1' is not one of ['google,pico-sku1', 'google,pico-sku2']
	'google,chinchou-sku1' is not one of ['google,willow-sku0', 'google,willow-sku1']
	'google,chinchou-sku1' is not one of ['mediatek,mt8183-evb']
	'google,chinchou-sku1' is not one of ['mediatek,mt8183-pumpkin']
	'google,chinchou-sku16' was expected
	'google,chinchou-sku0' was expected
	'google,steelix-sku393219' was expected
	'google,steelix-sku393220' was expected
	'google,steelix-sku393221' was expected
	'google,steelix-sku196609' was expected
	'google,chinchou-sku1' is not one of ['google,steelix-sku131072', 'google,steelix-sku131073']
	'google,tentacruel-sku262147' was expected
	'google,tentacruel-sku262151' was expected
	'google,tentacruel-sku327681' was expected
	'google,tentacruel-sku327683' was expected
	'google,chinchou-sku1' is not one of ['google,voltorb-sku589824', 'google,voltorb-sku589825']
	'google,chinchou-sku1' is not one of ['mediatek,mt8186-evb']
	'google,chinchou-sku1' is not one of ['mediatek,mt8188-evb']
	'google,hayato-rev1' was expected
	'google,hayato-rev5-sku2' was expected
	'google,spherion-rev3' was expected
	'google,spherion-rev4' was expected
	'google,chinchou-sku1' is not one of ['mediatek,mt8192-evb']
	'google,chinchou-sku1' is not one of ['google,tomato-rev2', 'google,tomato-rev1']
	'google,tomato-rev4' was expected
	'google,dojo-sku7' was expected
	'google,chinchou-sku1' is not one of ['mediatek,mt8195-demo', 'mediatek,mt8195-evb']
	'google,chinchou-sku1' is not one of ['mediatek,mt8365-evk']
	'google,chinchou-sku1' is not one of ['mediatek,mt8390-evk']
	'google,chinchou-sku1' is not one of ['kontron,3-5-sbc-i1200', 'mediatek,mt8395-evk', 'radxa,nio-12l']
	'google,chinchou-sku1' is not one of ['mediatek,mt8516-pumpkin']
	'mediatek,mt2701' was expected
	'mediatek,mt2712' was expected
	'mediatek,mt6580' was expected
	'mediatek,mt6582' was expected
	'mediatek,mt6589' was expected
	'mediatek,mt6592' was expected
	'mediatek,mt6755' was expected
	'mediatek,mt6765' was expected
	'mediatek,mt6779' was expected
	'mediatek,mt6795' was expected
	'mediatek,mt6797' was expected
	'mediatek,mt7622' was expected
	'mediatek,mt7623' was expected
	'mediatek,mt7629' was expected
	'mediatek,mt7981b' was expected
	'mediatek,mt7986a' was expected
	'mediatek,mt7986b' was expected
	'mediatek,mt7988a' was expected
	'mediatek,mt8127' was expected
	'mediatek,mt8135' was expected
	'mediatek,mt8167' was expected
	'google,elm-rev7' was expected
	'google,hana-rev5' was expected
	'mediatek,mt8173' was expected
	'mediatek,mt8183' was expected
	'google,fennel' was expected
	'google,juniper' was expected
	'google,kakadu-rev2' was expected
	'google,kakadu-rev2-sku22' was expected
	'google,katsu' was expected
	'google,kodama' was expected
	'google,krane' was expected
	'google,makomo' was expected
	'google,pico' was expected
	'google,willow' was expected
	'google,chinchou-sku18' was expected
	'google,chinchou-sku1' was expected
	'google,steelix-sku393216' was expected
	'google,steelix-sku393217' was expected
	'google,steelix-sku393218' was expected
	'google,steelix-sku196608' was expected
	'google,steelix' was expected
	'google,tentacruel-sku262146' was expected
	'google,tentacruel-sku262150' was expected
	'google,tentacruel' was expected
	'google,voltorb' was expected
	'mediatek,mt8186' was expected
	'mediatek,mt8188' was expected
	'google,hayato' was expected
	'google,hayato-sku2' was expected
	'google,spherion-rev2' was expected
	'google,spherion' was expected
	'mediatek,mt8192' was expected
	'google,tomato' was expected
	'google,tomato-rev3' was expected
	'google,dojo-sku5' was expected
	'mediatek,mt8195' was expected
	'mediatek,mt8365' was expected
	'mediatek,mt8390' was expected
	'mediatek,mt8395' was expected
	'mediatek,mt8516' was expected
	'google,elm-rev6' was expected
	'google,hana-rev4' was expected
	'google,kakadu' was expected
	'google,chinchou-sku19' was expected
	'google,chinchou-sku2' was expected
	'google,tentacruel-sku262145' was expected
	'google,tentacruel-sku262149' was expected
	'google,spherion-rev1' was expected
	'google,dojo-sku3' was expected
	'google,elm-rev5' was expected
	'google,hana-rev3' was expected
	'google,chinchou-sku21' was expected
	'google,chinchou-sku3' was expected
	'google,tentacruel-sku262144' was expected
	'google,tentacruel-sku262148' was expected
	'google,spherion-rev0' was expected
	'google,dojo-sku1' was expected
	'google,elm-rev4' was expected
	'google,hana' was expected
	'google,chinchou-sku4' was expected
	'google,dojo' was expected
	'google,elm-rev3' was expected
	'google,chinchou-sku5' was expected
	'google,elm' was expected
	'google,chinchou-sku6' was expected
	'google,chinchou-sku7' was expected
	'google,chinchou-sku17' was expected
	from schema $id: http://devicetree.org/schemas/arm/mediatek.yaml#
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku1.dtb: /: failed to match any schema with compatible: ['google,chinchou-sku1', 'google,chinchou-sku17', 'google,chinchou-sku3', 'google,chinchou-sku6', 'google,chinchou-sku7', 'google,chinchou-sku20', 'google,chinchou-sku22', 'google,chinchou-sku23', 'mediatek,mt8186']
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku0.dtb: pinctrl at 10005000: 'pin-report' does not match any of the regexes: '-pins$', 'pinctrl-[0-9]+'
	from schema $id: http://devicetree.org/schemas/pinctrl/mediatek,mt8186-pinctrl.yaml#
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku16.dtb: pinctrl at 10005000: 'pin-report' does not match any of the regexes: '-pins$', 'pinctrl-[0-9]+'
	from schema $id: http://devicetree.org/schemas/pinctrl/mediatek,mt8186-pinctrl.yaml#
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku1.dtb: pinctrl at 10005000: 'pin-report' does not match any of the regexes: '-pins$', 'pinctrl-[0-9]+'
	from schema $id: http://devicetree.org/schemas/pinctrl/mediatek,mt8186-pinctrl.yaml#
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku0.dtb: /soc/pwrap at 1000d000/pmic: failed to match any schema with compatible: ['mediatek,mt6366', 'mediatek,mt6358']
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku0.dtb: /soc/pwrap at 1000d000/pmic: failed to match any schema with compatible: ['mediatek,mt6366', 'mediatek,mt6358']
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku0.dtb: /soc/pwrap at 1000d000/pmic/codec: failed to match any schema with compatible: ['mediatek,mt6366-sound', 'mediatek,mt6358-sound']
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku0.dtb: /soc/pwrap at 1000d000/pmic/codec: failed to match any schema with compatible: ['mediatek,mt6366-sound', 'mediatek,mt6358-sound']
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku16.dtb: /soc/pwrap at 1000d000/pmic: failed to match any schema with compatible: ['mediatek,mt6366', 'mediatek,mt6358']
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku16.dtb: /soc/pwrap at 1000d000/pmic: failed to match any schema with compatible: ['mediatek,mt6366', 'mediatek,mt6358']
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku16.dtb: /soc/pwrap at 1000d000/pmic/codec: failed to match any schema with compatible: ['mediatek,mt6366-sound', 'mediatek,mt6358-sound']
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku16.dtb: /soc/pwrap at 1000d000/pmic/codec: failed to match any schema with compatible: ['mediatek,mt6366-sound', 'mediatek,mt6358-sound']
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku0.dtb: /soc/pwrap at 1000d000/pmic/rtc: failed to match any schema with compatible: ['mediatek,mt6366-rtc', 'mediatek,mt6358-rtc']
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku0.dtb: /soc/pwrap at 1000d000/pmic/rtc: failed to match any schema with compatible: ['mediatek,mt6366-rtc', 'mediatek,mt6358-rtc']
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku16.dtb: /soc/pwrap at 1000d000/pmic/rtc: failed to match any schema with compatible: ['mediatek,mt6366-rtc', 'mediatek,mt6358-rtc']
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku16.dtb: /soc/pwrap at 1000d000/pmic/rtc: failed to match any schema with compatible: ['mediatek,mt6366-rtc', 'mediatek,mt6358-rtc']
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku16.dtb: anx7625 at 58: 'ports' is a required property
	from schema $id: http://devicetree.org/schemas/display/bridge/analogix,anx7625.yaml#
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku16.dtb: anx7625 at 58: '#address-cells', '#size-cells', 'panel_flags', 'port at 0', 'port at 1' do not match any of the regexes: 'pinctrl-[0-9]+'
	from schema $id: http://devicetree.org/schemas/display/bridge/analogix,anx7625.yaml#
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku0.dtb: anx7625 at 58: 'ports' is a required property
	from schema $id: http://devicetree.org/schemas/display/bridge/analogix,anx7625.yaml#
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku0.dtb: anx7625 at 58: '#address-cells', '#size-cells', 'panel_flags', 'port at 0', 'port at 1' do not match any of the regexes: 'pinctrl-[0-9]+'
	from schema $id: http://devicetree.org/schemas/display/bridge/analogix,anx7625.yaml#
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku16.dtb: touchscreen at 41: 'vcc33-supply' is a required property
	from schema $id: http://devicetree.org/schemas/input/ilitek,ili2901.yaml#
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku16.dtb: trackpad at 15: 'vcc-supply' does not match any of the regexes: 'pinctrl-[0-9]+'
	from schema $id: http://devicetree.org/schemas/input/hid-over-i2c.yaml#
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku0.dtb: trackpad at 15: 'vcc-supply' does not match any of the regexes: 'pinctrl-[0-9]+'
	from schema $id: http://devicetree.org/schemas/input/hid-over-i2c.yaml#
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku16.dtb: dp-bridge at 5c: 'extcon' is a required property
	from schema $id: http://devicetree.org/schemas/display/bridge/ite,it6505.yaml#
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku0.dtb: dp-bridge at 5c: 'extcon' is a required property
	from schema $id: http://devicetree.org/schemas/display/bridge/ite,it6505.yaml#
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku0.dtb: rt5650 at 1a: 'cpvdd-supply' is a required property
	from schema $id: http://devicetree.org/schemas/sound/realtek,rt5645.yaml#
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku0.dtb: rt5650 at 1a: Unevaluated properties are not allowed ('cbj-sleeve-gpio' was unexpected)
	from schema $id: http://devicetree.org/schemas/sound/realtek,rt5645.yaml#
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku16.dtb: rt5650 at 1a: 'cpvdd-supply' is a required property
	from schema $id: http://devicetree.org/schemas/sound/realtek,rt5645.yaml#
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku16.dtb: rt5650 at 1a: Unevaluated properties are not allowed ('cbj-sleeve-gpio' was unexpected)
	from schema $id: http://devicetree.org/schemas/sound/realtek,rt5645.yaml#
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku1.dtb: /soc/pwrap at 1000d000/pmic: failed to match any schema with compatible: ['mediatek,mt6366', 'mediatek,mt6358']
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku1.dtb: /soc/pwrap at 1000d000/pmic: failed to match any schema with compatible: ['mediatek,mt6366', 'mediatek,mt6358']
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku1.dtb: /soc/pwrap at 1000d000/pmic/codec: failed to match any schema with compatible: ['mediatek,mt6366-sound', 'mediatek,mt6358-sound']
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku1.dtb: /soc/pwrap at 1000d000/pmic/codec: failed to match any schema with compatible: ['mediatek,mt6366-sound', 'mediatek,mt6358-sound']
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku1.dtb: /soc/pwrap at 1000d000/pmic/rtc: failed to match any schema with compatible: ['mediatek,mt6366-rtc', 'mediatek,mt6358-rtc']
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku1.dtb: /soc/pwrap at 1000d000/pmic/rtc: failed to match any schema with compatible: ['mediatek,mt6366-rtc', 'mediatek,mt6358-rtc']
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku1.dtb: anx7625 at 58: 'ports' is a required property
	from schema $id: http://devicetree.org/schemas/display/bridge/analogix,anx7625.yaml#
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku1.dtb: anx7625 at 58: '#address-cells', '#size-cells', 'panel_flags', 'port at 0', 'port at 1' do not match any of the regexes: 'pinctrl-[0-9]+'
	from schema $id: http://devicetree.org/schemas/display/bridge/analogix,anx7625.yaml#
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku1.dtb: touchscreen at 41: 'vcc33-supply' is a required property
	from schema $id: http://devicetree.org/schemas/input/ilitek,ili2901.yaml#
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku1.dtb: trackpad at 15: 'vcc-supply' does not match any of the regexes: 'pinctrl-[0-9]+'
	from schema $id: http://devicetree.org/schemas/input/hid-over-i2c.yaml#
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku1.dtb: dp-bridge at 5c: 'extcon' is a required property
	from schema $id: http://devicetree.org/schemas/display/bridge/ite,it6505.yaml#
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku1.dtb: rt5650 at 1a: 'cpvdd-supply' is a required property
	from schema $id: http://devicetree.org/schemas/sound/realtek,rt5645.yaml#
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku1.dtb: rt5650 at 1a: Unevaluated properties are not allowed ('cbj-sleeve-gpio' was unexpected)
	from schema $id: http://devicetree.org/schemas/sound/realtek,rt5645.yaml#
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku0.dtb: thermal-zones: 'cpu-ntc', 'pmic-ntc' do not match any of the regexes: '^[a-zA-Z][a-zA-Z0-9\-]{1,10}-thermal$', 'pinctrl-[0-9]+'
	from schema $id: http://devicetree.org/schemas/thermal/thermal-zones.yaml#
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku16.dtb: thermal-zones: 'cpu-ntc', 'pmic-ntc' do not match any of the regexes: '^[a-zA-Z][a-zA-Z0-9\-]{1,10}-thermal$', 'pinctrl-[0-9]+'
	from schema $id: http://devicetree.org/schemas/thermal/thermal-zones.yaml#
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku0.dtb: regulator-pp1800-tchscr-report-disable: Unevaluated properties are not allowed ('enable-active-low' was unexpected)
	from schema $id: http://devicetree.org/schemas/regulator/fixed-regulator.yaml#
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku1.dtb: thermal-zones: 'cpu-ntc', 'pmic-ntc' do not match any of the regexes: '^[a-zA-Z][a-zA-Z0-9\-]{1,10}-thermal$', 'pinctrl-[0-9]+'
	from schema $id: http://devicetree.org/schemas/thermal/thermal-zones.yaml#
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku16.dtb: regulator-pp1800-tchscr-report-disable: Unevaluated properties are not allowed ('enable-active-low' was unexpected)
	from schema $id: http://devicetree.org/schemas/regulator/fixed-regulator.yaml#
arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku1.dtb: regulator-pp1800-tchscr-report-disable: Unevaluated properties are not allowed ('enable-active-low' was unexpected)
	from schema $id: http://devicetree.org/schemas/regulator/fixed-regulator.yaml#







From krzk at kernel.org  Fri Sep 27 07:34:57 2024
From: krzk at kernel.org (Krzysztof Kozlowski)
Date: Fri, 27 Sep 2024 16:34:57 +0200
Subject: [PATCH v2 1/2] dt-bindings: arm: mediatek: Add MT8186
 Chinchou/Chinchou360 Chromebooks
In-Reply-To: <20240927122940.4190949-1-jakiela@google.com>
References: <20240927122940.4190949-1-jakiela@google.com>
Message-ID: <9ea704e6-df1b-4dea-843b-008a3a7c3a67@kernel.org>

On 27/09/2024 14:29, Albert Jakie?a wrote:
> Add entries for MT8186 based Chinchou/Chinchou360 Chromebooks.
> These two are clamshell or convertible with touchscreen, stylus
> and extra buttons.
> 
> Signed-off-by: Albert Jakie?a <jakiela at google.com>
> ---
> 
> Changes since v1:
> - PATCH 1/2: Delete sku2147483647
> - Link to v1: https://lore.kernel.org/all/20240925080353.2362879-1-jakiela at google.com/
> 
> ---
>  .../devicetree/bindings/arm/mediatek.yaml     | 22 +++++++++++++++++++
>  1 file changed, 22 insertions(+)
> 
> diff --git a/Documentation/devicetree/bindings/arm/mediatek.yaml b/Documentation/devicetree/bindings/arm/mediatek.yaml
> index 1d4bb50fcd8d..47efd96e5659 100644
> --- a/Documentation/devicetree/bindings/arm/mediatek.yaml
> +++ b/Documentation/devicetree/bindings/arm/mediatek.yaml
> @@ -239,6 +239,28 @@ properties:
>            - enum:
>                - mediatek,mt8183-pumpkin
>            - const: mediatek,mt8183
> +      - description: Google Chinchou360 (Asus Chromebook CZ11 Flip CZ1104F)
> +        items:
> +          - const: google,chinchou-sku16
> +          - const: google,chinchou-sku18
> +          - const: google,chinchou-sku19
> +          - const: google,chinchou-sku21
> +          - const: mediatek,mt8186
> +      - description: Google Chinchou (Asus Chromebook CZ12 Flip CZ1204C)
> +        items:
> +          - const: google,chinchou-sku0
> +          - const: google,chinchou-sku1
> +          - const: google,chinchou-sku2
> +          - const: google,chinchou-sku3
> +          - const: google,chinchou-sku4
> +          - const: google,chinchou-sku5
> +          - const: google,chinchou-sku6
> +          - const: google,chinchou-sku7
> +          - const: google,chinchou-sku17
> +          - const: google,chinchou-sku22
> +          - const: google,chinchou-sku23
> +          - const: google,chinchou
> +          - const: mediatek,mt8186

These don't match your DTS. Which also means you did not test your DTS. :(

Best regards,
Krzysztof



From rodrigo.vivi at intel.com  Fri Sep 27 07:35:58 2024
From: rodrigo.vivi at intel.com (Rodrigo Vivi)
Date: Fri, 27 Sep 2024 10:35:58 -0400
Subject: [PATCH v3] docs/gpu: ci: update flake tests requirements
In-Reply-To: <20240927052416.1833889-1-vignesh.raman@collabora.com>
References: <20240927052416.1833889-1-vignesh.raman@collabora.com>
Message-ID: <ZvbCzqvyeTI_j2cD@intel.com>

On Fri, Sep 27, 2024 at 10:54:14AM +0530, Vignesh Raman wrote:
> Update the documentation to specify linking to a relevant GitLab
> issue or email report for each new flake entry. Added specific
> GitLab issue urls for i915, msm and amdgpu driver.
> 
> Acked-by: Abhinav Kumar <quic_abhinavk at quicinc.com> # msm
> Acked-by: Dmitry Baryshkov <dmitry.baryshkov at linaro.org> # msm
> Signed-off-by: Vignesh Raman <vignesh.raman at collabora.com>
> ---
> 
> v2:
> - Add gitlab issue link for msm driver.
> 
> v3:
> - Update docs to specify we use email reporting or GitLab issues for flake entries.
> 
> ---
>  Documentation/gpu/automated_testing.rst | 13 +++++++++----
>  1 file changed, 9 insertions(+), 4 deletions(-)
> 
> diff --git a/Documentation/gpu/automated_testing.rst b/Documentation/gpu/automated_testing.rst
> index 2d5a28866afe..03769b4a17cf 100644
> --- a/Documentation/gpu/automated_testing.rst
> +++ b/Documentation/gpu/automated_testing.rst
> @@ -68,19 +68,24 @@ known to behave unreliably. These tests won't cause a job to fail regardless of
>  the result. They will still be run.
>  
>  Each new flake entry must be associated with a link to the email reporting the
> -bug to the author of the affected driver, the board name or Device Tree name of
> -the board, the first kernel version affected, the IGT version used for tests,
> -and an approximation of the failure rate.
> +bug to the author of the affected driver or the relevant GitLab issue. The entry
> +must also include the board name or Device Tree name, the first kernel version
> +affected, the IGT version used for tests, and an approximation of the failure rate.
>  
>  They should be provided under the following format::
>  
> -  # Bug Report: $LORE_OR_PATCHWORK_URL
> +  # Bug Report: $LORE_URL_OR_GITLAB_ISSUE
>    # Board Name: broken-board.dtb
>    # Linux Version: 6.6-rc1
>    # IGT Version: 1.28-gd2af13d9f
>    # Failure Rate: 100
>    flaky-test
>  
> +Use the appropriate link below to create a GitLab issue:
> +amdgpu driver: https://gitlab.freedesktop.org/drm/amd/-/issues
> +i915 driver: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues

Probably good to add:

xe driver: https://gitlab.freedesktop.org/drm/xe/kernel/-/issues

Acked-by: Rodrigo Vivi <rodrigo.vivi at intel.com>

> +msm driver: https://gitlab.freedesktop.org/drm/msm/-/issues
> +
>  drivers/gpu/drm/ci/${DRIVER_NAME}-${HW_REVISION}-skips.txt
>  -----------------------------------------------------------
>  
> -- 
> 2.43.0
> 


From liankun.yang at mediatek.com  Fri Sep 27 02:03:29 2024
From: liankun.yang at mediatek.com (Liankun Yang)
Date: Fri, 27 Sep 2024 17:03:29 +0800
Subject: [PATCH v2 1/1] drm/mediatek: Fix potential KP on 0 bytes nvmem cell read
Message-ID: <20240927153305.27642-1-liankun.yang@mediatek.com>

If the len is 0, kernel crash will occur when performing operations.
Add the len check conditions to prevent kernel crash.

Fixes: f70ac097a2cf ("drm/mediatek: Add MT8195 Embedded DisplayPort driver")
Signed-off-by: Liankun Yang <liankun.yang at mediatek.com>
---
Changes in V2:
- Fix the commit title.
- Remove blank line between the Fixes and Signe-off-by.
- Modify the judgment writing method.
Per suggestion from the previous thread:
https://patchwork.kernel.org/project/linux-mediatek/patch/20240925084116.28848-1-liankun.yang at mediatek.com/
---
 drivers/gpu/drm/mediatek/mtk_dp.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/mediatek/mtk_dp.c b/drivers/gpu/drm/mediatek/mtk_dp.c
index d8796a904eca..9ecdf62398ee 100644
--- a/drivers/gpu/drm/mediatek/mtk_dp.c
+++ b/drivers/gpu/drm/mediatek/mtk_dp.c
@@ -1082,7 +1082,7 @@ static void mtk_dp_get_calibration_data(struct mtk_dp *mtk_dp)
 	buf = (u32 *)nvmem_cell_read(cell, &len);
 	nvmem_cell_put(cell);
 
-	if (IS_ERR(buf) || ((len / sizeof(u32)) != 4)) {
+	if (IS_ERR(buf) || !len || ((len / sizeof(u32)) != 4)) {
 		dev_warn(dev, "Failed to read nvmem_cell_read\n");
 
 		if (!IS_ERR(buf))
-- 
2.45.2



From nicolas at ndufresne.ca  Fri Sep 27 12:50:05 2024
From: nicolas at ndufresne.ca (Nicolas Dufresne)
Date: Fri, 27 Sep 2024 15:50:05 -0400
Subject: [Linaro-mm-sig] Re: [RFC PATCH 0/4] Linaro restricted heap
In-Reply-To: <CAFA6WYMd46quafJoGXjkCiPOKpYoDZdXwrNbG3QekyjB3_2FTA@mail.gmail.com>
References: <20240830070351.2855919-1-jens.wiklander@linaro.org>
	 <dhxvyshwi4qmcmwceokhqey2ww4azjcs6qrpnkgivdj7tv5cke@r36srvvbof6q>
	 <d8e0cb78-7cfb-42bf-b3a5-f765592e8dd4@ti.com>
	 <mzur3odofwwrdqnystozjgf3qtvb73wqjm6g2vf5dfsqiehaxk@u67fcarhm6ge>
	 <e967e382-6cca-4dee-8333-39892d532f71@gmail.com>
	 <lk7a2xuqrctyywuanjwseh5lkcz3soatc2zf3kn3uwc43pdyic@edm3hcd2koas>
	 <04caa788-19a6-4336-985c-4eb191c24438@amd.com>
	 <2f9a4abe-b2fc-4bc7-9926-1da2d38f5080@linaro.org>
	 <CAFA6WYMd46quafJoGXjkCiPOKpYoDZdXwrNbG3QekyjB3_2FTA@mail.gmail.com>
Message-ID: <7c9e3a1a6092f6574c17d7206767ece0bcefc81f.camel@ndufresne.ca>

Le jeudi 26 septembre 2024 ? 19:22 +0530, Sumit Garg a ?crit?:
> [Resend in plain text format as my earlier message was rejected by
> some mailing lists]
> 
> On Thu, 26 Sept 2024 at 19:17, Sumit Garg <sumit.garg at linaro.org> wrote:
> > 
> > On 9/25/24 19:31, Christian K?nig wrote:
> > 
> > Am 25.09.24 um 14:51 schrieb Dmitry Baryshkov:
> > 
> > On Wed, Sep 25, 2024 at 10:51:15AM GMT, Christian K?nig wrote:
> > 
> > Am 25.09.24 um 01:05 schrieb Dmitry Baryshkov:
> > 
> > On Tue, Sep 24, 2024 at 01:13:18PM GMT, Andrew Davis wrote:
> > 
> > On 9/23/24 1:33 AM, Dmitry Baryshkov wrote:
> > 
> > Hi,
> > 
> > On Fri, Aug 30, 2024 at 09:03:47AM GMT, Jens Wiklander wrote:
> > 
> > Hi,
> > 
> > This patch set is based on top of Yong Wu's restricted heap patch set [1].
> > It's also a continuation on Olivier's Add dma-buf secure-heap patch set [2].
> > 
> > The Linaro restricted heap uses genalloc in the kernel to manage the heap
> > carvout. This is a difference from the Mediatek restricted heap which
> > relies on the secure world to manage the carveout.
> > 
> > I've tried to adress the comments on [2], but [1] introduces changes so I'm
> > afraid I've had to skip some comments.
> > 
> > I know I have raised the same question during LPC (in connection to
> > Qualcomm's dma-heap implementation). Is there any reason why we are
> > using generic heaps instead of allocating the dma-bufs on the device
> > side?
> > 
> > In your case you already have TEE device, you can use it to allocate and
> > export dma-bufs, which then get imported by the V4L and DRM drivers.
> > 
> > This goes to the heart of why we have dma-heaps in the first place.
> > We don't want to burden userspace with having to figure out the right
> > place to get a dma-buf for a given use-case on a given hardware.
> > That would be very non-portable, and fail at the core purpose of
> > a kernel: to abstract hardware specifics away.
> > 
> > Unfortunately all proposals to use dma-buf heaps were moving in the
> > described direction: let app select (somehow) from a platform- and
> > vendor- specific list of dma-buf heaps. In the kernel we at least know
> > the platform on which the system is running. Userspace generally doesn't
> > (and shouldn't). As such, it seems better to me to keep the knowledge in
> > the kernel and allow userspace do its job by calling into existing
> > device drivers.
> > 
> > The idea of letting the kernel fully abstract away the complexity of inter
> > device data exchange is a completely failed design. There has been plenty of
> > evidence for that over the years.
> > 
> > Because of this in DMA-buf it's an intentional design decision that
> > userspace and *not* the kernel decides where and what to allocate from.
> > 
> > Hmm, ok.
> > 
> > What the kernel should provide are the necessary information what type of
> > memory a device can work with and if certain memory is accessible or not.
> > This is the part which is unfortunately still not well defined nor
> > implemented at the moment.
> > 
> > Apart from that there are a whole bunch of intentional design decision which
> > should prevent developers to move allocation decision inside the kernel. For
> > example DMA-buf doesn't know what the content of the buffer is (except for
> > it's total size) and which use cases a buffer will be used with.
> > 
> > So the question if memory should be exposed through DMA-heaps or a driver
> > specific allocator is not a question of abstraction, but rather one of the
> > physical location and accessibility of the memory.
> > 
> > If the memory is attached to any physical device, e.g. local memory on a
> > dGPU, FPGA PCIe BAR, RDMA, camera internal memory etc, then expose the
> > memory as device specific allocator.
> > 
> > So, for embedded systems with unified memory all buffers (maybe except
> > PCIe BARs) should come from DMA-BUF heaps, correct?
> > 
> > 
> > From what I know that is correct, yes. Question is really if that will stay this way.
> > 
> > Neural accelerators look a lot stripped down FPGAs these days and the benefit of local memory for GPUs is known for decades.
> > 
> > Could be that designs with local specialized memory see a revival any time, who knows.
> > 
> > If the memory is not physically attached to any device, but rather just
> > memory attached to the CPU or a system wide memory controller then expose
> > the memory as DMA-heap with specific requirements (e.g. certain sized pages,
> > contiguous, restricted, encrypted, ...).
> > 
> > Is encrypted / protected a part of the allocation contract or should it
> > be enforced separately via a call to TEE / SCM / anything else?
> > 
> > 
> > Well that is a really good question I can't fully answer either. From what I know now I would say it depends on the design.
> > 
> 
> IMHO, I think Dmitry's proposal to rather allow the TEE device to be
> the allocator and exporter of DMA-bufs related to restricted memory
> makes sense to me. Since it's really the TEE implementation (OP-TEE,
> AMD-TEE, TS-TEE or future QTEE) which sets up the restrictions on a
> particular piece of allocated memory. AFAIK, that happens after the
> DMA-buf gets allocated and then user-space calls into TEE to set up
> which media pipeline is going to access that particular DMA-buf. It
> can also be a static contract depending on a particular platform
> design.

When the memory get the protection is hardware specific. Otherwise the design
would be really straightforward, allocate from the a heap or any random driver
API and protect that memory through an call into the TEE. Clear seperation would
be amazingly better, but this is not how hardware and firmware designer have
seen it. 

In some implementation, there is a carving of memory that be protected before
the kernel is booted. I believe (but I'm not affiliated with them) that MTK has
hardware restriction making that design the only usable method.

In general, the handling of secure memory is bound to the TEE application for
the specific platform, it has to be separated from the generic part of tee
drivers anyway, and dmabuf heaps is in my opinion the right API for the task.

On MTK, if you have followed, when the SCP (their co-processor) is handling
restricted video, you can't even call into it anymore directly. So to drive the
CODECs, everything has to be routed through the TEE. Would you say that because
of that this should not be a V4L2 driver anymore ?

> 
> As Jens noted in the other thread, we already manage shared memory
> allocations (from a static carve-out or dynamically mapped) for
> communications among Linux and TEE that were based on DMA-bufs earlier
> but since we didn't required them to be shared with other devices, so
> we rather switched to anonymous memory.
> 
> From user-space perspective, it's cleaner to use TEE device IOCTLs for
> DMA-buf allocations since it already knows which underlying TEE
> implementation it's communicating with rather than first figuring out
> which DMA heap to use for allocation and then communicating with TEE
> implementation.

As a user-space developer in the majority of my time, adding common code to
handle dma heaps is a lot easier and straight forward then having to glue all
the different allocators implement in various subsystems. Communicating which
heap to work can be generic and simple.

Nicolas



From ilias.apalodimas at linaro.org  Sat Sep 28 00:34:25 2024
From: ilias.apalodimas at linaro.org (Ilias Apalodimas)
Date: Sat, 28 Sep 2024 10:34:25 +0300
Subject: [PATCH net v2 2/2] page_pool: fix IOMMU crash when driver has
 already unbound
In-Reply-To: <934d601f-be43-4e04-b126-dc86890a4bfa@huawei.com>
References: <20240925075707.3970187-1-linyunsheng@huawei.com>
 <20240925075707.3970187-3-linyunsheng@huawei.com> <CAHS8izOxugzWJDTc-4CWqaKABTj=J4OHs=Lcb=SE9r8gX0J+yg@mail.gmail.com>
 <842c8cc6-f716-437a-bc98-70bc26d6fd38@huawei.com> <CAC_iWjLgNOtsbhqrhvvEz2C3S668qB8KatL_W+tPHMSkDrNS=w@mail.gmail.com>
 <0ef315df-e8e9-41e8-9ba8-dcb69492c616@huawei.com> <CAC_iWjKeajwn3otjdEekE6VDLHGEvqmnQRwpN5R3yHj8UpEiDw@mail.gmail.com>
 <934d601f-be43-4e04-b126-dc86890a4bfa@huawei.com>
Message-ID: <CAC_iWjL7m4ZL2W2OZM5F22dLvZhxU6fyCXV_xjyGf+W7UP43EQ@mail.gmail.com>

Hi Yunsheng,

Overall this is a patch in the right direction. I want to get feedback
from others since Jakub and Jesper seemed to prefer the stalling idea.

On Fri, 27 Sept 2024 at 14:29, Yunsheng Lin <linyunsheng at huawei.com> wrote:
>
> On 2024/9/27 17:58, Ilias Apalodimas wrote:
>
> ...
>
> >>
> >>> importantly, though, why does struct page need to know about this?
> >>> Can't we have the same information in page pool?
> >>> When the driver allocates pages it does via page_pool_dev_alloc_XXXXX
> >>> or something similar. Cant we do what you suggest here ? IOW when we
> >>> allocate a page we put it in a list, and when that page returns to
> >>> page_pool (and it's mapped) we remove it.
> >>
> >> Yes, that is the basic idea, but the important part is how to do that
> >> with less performance impact.
> >
> > Yes, but do you think that keeping that list of allocated pages in
> > struct page_pool will end up being more costly somehow compared to
> > struct page?
>
> I am not sure if I understand your above question here.
> I am supposing the question is about what's the cost between using
> single/doubly linked list for the inflight pages or using a array
> for the inflight pages like this patch does using pool->items?

Yes, that wasn't very clear indeed, apologies for any confusion. I was
trying to ask on a linked list that only lives in struct page_pool.
But I now realize this was a bad idea since the lookup would be way
slower.

> If I understand question correctly, the single/doubly linked list
> is more costly than array as the page_pool case as my understanding.
>
> For single linked list, it doesn't allow deleting a specific entry but
> only support deleting the first entry and all the entries. It does support
> lockless operation using llist, but have limitation as below:
> https://elixir.bootlin.com/linux/v6.7-rc8/source/include/linux/llist.h#L13
>
> For doubly linked list, it needs two pointer to support deleting a specific
> entry and it does not support lockless operation.

I didn't look at the patch too carefully at first. Looking a bit
closer now, the array is indeed better, since the lookup is faster.
You just need the stored index in struct page to find the page we need
to unmap. Do you remember if we can reduce the atomic pp_ref_count to
32bits? If so we can reuse that space for the index. Looking at it
requires a bit more work in netmem, but that's mostly swapping all the
atomic64 calls to atomic ones.

>
> For pool->items, as the alloc side is protected by NAPI context, and the
> free side use item->pp_idx to ensure there is only one producer for each
> item, which means for each item in pool->items, there is only one consumer
> and one producer, which seems much like the case when the page is not
> recyclable in __page_pool_put_page, we don't need a lock protection when
> calling page_pool_return_page(), the 'struct page' is also one consumer
> and one producer as the pool->items[item->pp_idx] does:
> https://elixir.bootlin.com/linux/v6.7-rc8/source/net/core/page_pool.c#L645
>
> We only need a lock protection when page_pool_destroy() is called to
> check if there is inflight page to be unmapped as a consumer, and the
> __page_pool_put_page() may also called to unmapped the inflight page as
> another consumer,

Thanks for the explanation. On the locking side, page_pool_destroy is
called once from the driver and then it's either the workqueue for
inflight packets or an SKB that got freed and tried to recycle right?
But do we still need to do all the unmapping etc from the delayed
work? Since the new function will unmap all packets in
page_pool_destroy, we can just skip unmapping when the delayed work
runs

Thanks
/Ilias





> there is why the 'destroy_lock' is added for protection
> when pool->destroy_cnt > 0.
>
> >
> > Thanks
> > /Ilias


From alpernebiyasak at gmail.com  Sat Sep 28 06:02:25 2024
From: alpernebiyasak at gmail.com (Alper Nebi Yasak)
Date: Sat, 28 Sep 2024 16:02:25 +0300
Subject: [PATCH v7 0/3] Fix degradation problem of alpha blending series
In-Reply-To: <20240926102238.24303-1-jason-jh.lin@mediatek.com>
References: <20240926102238.24303-1-jason-jh.lin@mediatek.com>
Message-ID: <adf21ae5-6820-44ea-8cc9-7a42b345114b@gmail.com>

Hi,

On 2024-09-26 13:22 +03:00, Jason-JH.Lin wrote:
> Some SoCs not support pre-multiplied pixel formats and extending
> configuration of OVL pre-multiplied color formats, such as MT8173.
> 
> Fix the SoC degradation problem by this sreies.
> 
> ---
> 
> Change in v7:
> 1. Add the remove color format comment patch for OVL
> 2. Fix warning: 'const' type qualifier on return type has no effect
> 
> [...]

I get warnings and "*ERROR* failed to create property: blend_mode" a few 
times until mediatek-drm initializes. It happens on MT8173 and MT8183, but 
not on MT8186. Colors are correct, though. (I'm tempted to add Tested-by.)

------8<------

>From MT8173:

[  +0.017201] ------------[ cut here ]------------
[  +0.009250] WARNING: CPU: 3 PID: 37 at drivers/gpu/drm/drm_blend.c:586 drm_plane_create_blend_mode_property+0xf0/0x110 [drm]
[  +0.022533] Modules linked in: [...]
[  +0.158166] CPU: 3 UID: 0 PID: 37 Comm: kworker/u16:1 Tainted: G        W          6.11.0-next-20240927-deb-00006-ge514a0f89dd9 #
[  +0.023542] Tainted: [W]=WARN
[  +0.005936] Hardware name: Google Hana (DT)
[  +0.008379] Workqueue: events_unbound deferred_probe_work_func
[  +0.011694] pstate: 80000005 (Nzcv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--)
[  +0.013959] pc : drm_plane_create_blend_mode_property+0xf0/0x110 [drm]
[  +0.013111] lr : mtk_plane_init+0xf4/0x198 [mediatek_drm]
[  +0.010829] sp : ffff800081d538c0
[  +0.006634] x29: ffff800081d538c0 x28: ffff0000c431e080 x27: ffff0000c19787a8
[  +0.014314] x26: 0000000000000548 x25: 0000000000000006 x24: ffff0000c431f000
[  +0.014317] x23: 0000000000000035 x22: 0000000000000006 x21: ffff0000c0ca1058
[  +0.014313] x20: 0000000000000006 x19: 0000000000000000 x18: ffffffffffffffff
[  +0.014314] x17: 6f72702065746165 x16: 7263206f74206465 x15: ffff0000c414e626
[  +0.014316] x14: 0000000000000000 x13: 0000000000000028 x12: 0101010101010101
[  +0.014313] x11: 7f7f7f7f7f7f7f7f x10: fefefeff726e6f79 x9 : ffff800079e689dc
[  +0.014316] x8 : ffff0000c5875554 x7 : 00000000eeeeeeee x6 : 00000000c0c0c0c0
[  +0.014314] x5 : 0000000000000000 x4 : ffff0000c0ca1190 x3 : ffff0000c0ca1190
[  +0.014313] x2 : 000000000000ffff x1 : 0000000000000006 x0 : ffff0000c0ca1058
[  +0.014314] Call trace:
[  +0.004891]  drm_plane_create_blend_mode_property+0xf0/0x110 [drm]
[  +0.012415]  mtk_plane_init+0xf4/0x198 [mediatek_drm]
[  +0.010132]  mtk_crtc_create+0x34c/0x858 [mediatek_drm]
[  +0.010479]  mtk_drm_bind+0x4b4/0x600 [mediatek_drm]
[  +0.009956]  try_to_bring_up_aggregate_device+0x21c/0x2e8
[  +0.010825]  __component_add+0xc0/0x1c0
[  +0.007685]  component_add+0x1c/0x38
[  +0.007163]  mtk_disp_rdma_probe+0x148/0x230 [mediatek_drm]
[  +0.011175]  platform_probe+0x70/0xe8
[  +0.007338]  really_probe+0xc8/0x3a0
[  +0.007161]  __driver_probe_device+0x84/0x160
[  +0.008730]  driver_probe_device+0x44/0x130
[  +0.008379]  __device_attach_driver+0xc4/0x170
[  +0.008905]  bus_for_each_drv+0x90/0x100
[  +0.007855]  __device_attach+0xa8/0x1c8
[  +0.007685]  device_initial_probe+0x1c/0x30
[  +0.008380]  bus_probe_device+0xb0/0xc0
[  +0.007683]  deferred_probe_work_func+0xbc/0x120
[  +0.009253]  process_one_work+0x178/0x3d0
[  +0.008033]  worker_thread+0x200/0x3f0
[  +0.007511]  kthread+0xe8/0xf8
[  +0.006115]  ret_from_fork+0x10/0x20
[  +0.007164] ---[ end trace 0000000000000000 ]---
[  +0.009278] [drm:mtk_plane_init [mediatek_drm]] *ERROR* failed to create property: blend_mode

>From MT8183:

[   13.936989] ------------[ cut here ]------------
[   13.946224] WARNING: CPU: 5 PID: 60 at drivers/gpu/drm/drm_blend.c:586 drm_plane_create_blend_mode_property+0xf0/0x110 [drm]
[   13.968714] Modules linked in: [...]
[   14.116814] CPU: 5 UID: 0 PID: 60 Comm: kworker/u34:2 Tainted: G        W          6.11.0-next-20240927-deb-00006-ge514a0f89dd9 #1
[   14.140323] Tainted: [W]=WARN
[   14.146248] Hardware name: Google cozmo board (DT)
[   14.155830] Workqueue: events_unbound deferred_probe_work_func
[   14.167505] pstate: 80000005 (Nzcv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--)
[   14.181440] pc : drm_plane_create_blend_mode_property+0xf0/0x110 [drm]
[   14.194529] lr : mtk_plane_init+0xf4/0x188 [mediatek_drm]
[   14.205338] sp : ffff8000804a3860
[   14.211960] x29: ffff8000804a3860 x28: ffff715445288080 x27: ffff7154417fa748
[   14.226247] x26: 0000000000000548 x25: 0000000000000006 x24: ffff71544528a000
[   14.240536] x23: 0000000000000035 x22: 0000000000000006 x21: ffff715445a49ae8
[   14.254822] x20: 0000000000000006 x19: 0000000000000000 x18: ffffffffffffffff
[   14.269110] x17: 6f72702065746165 x16: ffffd6facceae8c0 x15: ffff715470421d46
[   14.283398] x14: 0000000000000000 x13: 0000000000000028 x12: 0101010101010101
[   14.297686] x11: 7f7f7f7f7f7f7f7f x10: fefefeff726e6f79 x9 : ffffd6fa92d179dc
[   14.311973] x8 : ffff715445156ad4 x7 : 00000000eeeeeeee x6 : 00000000c0c0c0c0
[   14.326261] x5 : 0000000000000000 x4 : ffff715445a49c20 x3 : ffff715445a49c20
[   14.340549] x2 : 000000000000ffff x1 : 0000000000000006 x0 : ffff715445a49ae8
[   14.354837] Call trace:
[   14.359718]  drm_plane_create_blend_mode_property+0xf0/0x110 [drm]
[   14.372111]  mtk_plane_init+0xf4/0x188 [mediatek_drm]
[   14.382224]  mtk_crtc_create+0x34c/0x858 [mediatek_drm]
[   14.392685]  mtk_drm_bind+0x51c/0x600 [mediatek_drm]
[   14.402622]  try_to_bring_up_aggregate_device+0x21c/0x2e8
[   14.413425]  __component_add+0xc0/0x1c0
[   14.421094]  component_add+0x1c/0x38
[   14.428241]  mtk_dsi_host_attach+0x80/0xe0 [mediatek_drm]
[   14.439049]  devm_mipi_dsi_attach+0x3c/0xa0
[   14.447413]  anx7625_link_bridge+0xfc/0x1c8 [anx7625]
[   14.457522]  dp_aux_ep_probe+0x54/0x110 [drm_dp_aux_bus]
[   14.468150]  really_probe+0xc8/0x3a0
[   14.475296]  __driver_probe_device+0x84/0x160
[   14.484009]  driver_probe_device+0x44/0x130
[   14.492374]  __device_attach_driver+0xc4/0x170
[   14.501261]  bus_for_each_drv+0x90/0x100
[   14.509103]  __device_attach+0xa8/0x1c8
[   14.516772]  device_initial_probe+0x1c/0x30
[   14.525137]  bus_probe_device+0xb0/0xc0
[   14.532805]  deferred_probe_work_func+0xbc/0x120
[   14.542040]  process_one_work+0x178/0x3d0
[   14.550059]  worker_thread+0x200/0x3f0
[   14.557553]  kthread+0xe8/0xf8
[   14.563656]  ret_from_fork+0x10/0x20
[   14.570803] ---[ end trace 0000000000000000 ]---
[   14.580052] [drm:mtk_plane_init [mediatek_drm]] *ERROR* failed to create property: blend_mode


From Andy-ld.Lu at mediatek.com  Sat Sep 28 06:14:03 2024
From: Andy-ld.Lu at mediatek.com (=?utf-8?B?QW5keS1sZCBMdSAo5Y2i5LicKQ==?=)
Date: Sat, 28 Sep 2024 13:14:03 +0000
Subject: [PATCH 2/2] dt-bindings: mmc: mtk-sd: Add support for MT8196
In-Reply-To: <20240926175409.GA2644361-robh@kernel.org>
References: <20240926070405.20212-1-andy-ld.lu@mediatek.com>
	 <20240926070405.20212-3-andy-ld.lu@mediatek.com>
	 <20240926175409.GA2644361-robh@kernel.org>
Message-ID: <10ce6e9af6daa69735f46b45028ec1b2d25ee66a.camel@mediatek.com>

On Thu, 2024-09-26 at 12:54 -0500, Rob Herring wrote:
>  	 
> External email : Please do not click links or open attachments until
> you have verified the sender or the content.
>  On Thu, Sep 26, 2024 at 03:03:18PM +0800, Andy-ld Lu wrote:
> > Extend the devicetree bindings to include the MT8196 mmc controller
> > by adding the compatible string 'mediatek,msdc-v2', which could be
> > also used for future compatible SoCs that support new tx/rx.
> 
> Generally, every SoC ends up changing at least slightly. So we don't
> do 
> version numbers except when there's a well defined versioning scheme
> of 
> the h/w (e.g. FPGA IP blocks). So, use SoC for compatible string.
Thanks for your review.

The new tx/rx represents a significant update for mmc controller of
mediatek from the MT8196 chipset, and the dependent settings remain
consistent for MT8196 and subsequent SoCs. Therefore, It is proposed to
use a unified compatible string for these SoCs that support new tx/rx,
and name it as 'IP(msdc) version two'.
> 
> > 
> > Add three properties for MT8196 settings:
> > - 'mediatek,prohibit-gate-cg', indicate if the source clock CG
> could
> >   be disabled when CPU access IP registers.
> > 
> > - 'mediatek,stop-dly-sel', configure read data clock stops at block
> gap.
> > 
> > - 'mediatek,pop-en-cnt', configure the margins of write and read
> >   pointers while begin to pop data transfer.
> > 
> > Signed-off-by: Andy-ld Lu <andy-ld.lu at mediatek.com>
> > ---
> >  .../devicetree/bindings/mmc/mtk-sd.yaml       | 26
> +++++++++++++++++++
> >  1 file changed, 26 insertions(+)
> > 
> > diff --git a/Documentation/devicetree/bindings/mmc/mtk-sd.yaml
> b/Documentation/devicetree/bindings/mmc/mtk-sd.yaml
> > index c532ec92d2d9..82d1a9fac67c 100644
> > --- a/Documentation/devicetree/bindings/mmc/mtk-sd.yaml
> > +++ b/Documentation/devicetree/bindings/mmc/mtk-sd.yaml
> > @@ -25,6 +25,7 @@ properties:
> >            - mediatek,mt8173-mmc
> >            - mediatek,mt8183-mmc
> >            - mediatek,mt8516-mmc
> > +          - mediatek,msdc-v2
> >        - items:
> >            - const: mediatek,mt7623-mmc
> >            - const: mediatek,mt2701-mmc
> > @@ -154,6 +155,30 @@ properties:
> >      enum: [32, 64]
> >      default: 32
> >  
> > +  mediatek,stop-dly-sel:
> > +    $ref: /schemas/types.yaml#/definitions/uint32
> > +    description:
> > +      Some SoCs need to set appropriate stop-dly-sel to configure
> read data clock
> > +      stops at block gap. The valid range is from 0 to 0xf.
> 
> SoC dependent or board dependent? Imply from the compatible for the 
> former. A property is fine for the latter case.
Yes, it is SoC dependent in principle, but we would like to use a
unified compatible string for MT8196 and subsequent SoCs as mentioned
above, and this register setting(not relavant with new tx/rx) may be
variant. Therefore, want to use the property of device tree to set
individually.
> 
> > +    minimum: 0
> > +    maximum: 0xf
> > +
> > +  mediatek,pop-en-cnt:
> > +    $ref: /schemas/types.yaml#/definitions/uint32
> > +    description:
> > +      Some SoCs need to set appropriate pop-en-cnt to configure
> the margins of write
> > +      and read pointers while begin to pop data transfer. The
> valid range is from 0
> > +      to 0xf.
> > +    minimum: 0
> > +    maximum: 0xf
> 
> Same question.
Same as the reply above.
> 
> > +
> > +  mediatek,prohibit-gate-cg:
> > +    $ref: /schemas/types.yaml#/definitions/flag
> > +    description:
> > +      Decide if source clock CG could be disabled when CPU access
> IP registers.
> > +      If present, source clock CG could not be disabled.
> > +      If not present, source clock CG could be disabled.
> 
> 
> Sounds like you need to describe the clock in "clocks".
It is not with clock itself, but rather with the bus design that would
check the 'source_cg' status bit to decide whether to prevent the CPU
from accessing the IP registers. And there have been no changes to the
'source_cg'(already been descirbed before) for MT8196.
> 
> > +
> >    resets:
> >      maxItems: 1
> >  
> > @@ -191,6 +216,7 @@ allOf:
> >              - mediatek,mt8188-mmc
> >              - mediatek,mt8195-mmc
> >              - mediatek,mt8516-mmc
> > +            - mediatek,msdc-v2
> >      then:
> >        properties:
> >          clocks:
> > -- 
> > 2.46.0
> > 

From krzk at kernel.org  Sat Sep 28 06:39:46 2024
From: krzk at kernel.org (Krzysztof Kozlowski)
Date: Sat, 28 Sep 2024 15:39:46 +0200
Subject: [PATCH 2/2] dt-bindings: mmc: mtk-sd: Add support for MT8196
In-Reply-To: <10ce6e9af6daa69735f46b45028ec1b2d25ee66a.camel@mediatek.com>
References: <20240926070405.20212-1-andy-ld.lu@mediatek.com>
 <20240926070405.20212-3-andy-ld.lu@mediatek.com>
 <20240926175409.GA2644361-robh@kernel.org>
 <10ce6e9af6daa69735f46b45028ec1b2d25ee66a.camel@mediatek.com>
Message-ID: <30e4735e-bf50-440c-8ad1-6bcf8b8bd930@kernel.org>

On 28/09/2024 15:14, Andy-ld Lu (??) wrote:
> On Thu, 2024-09-26 at 12:54 -0500, Rob Herring wrote:
>>  	 
>> External email : Please do not click links or open attachments until
>> you have verified the sender or the content.
>>  On Thu, Sep 26, 2024 at 03:03:18PM +0800, Andy-ld Lu wrote:
>>> Extend the devicetree bindings to include the MT8196 mmc controller
>>> by adding the compatible string 'mediatek,msdc-v2', which could be
>>> also used for future compatible SoCs that support new tx/rx.
>>
>> Generally, every SoC ends up changing at least slightly. So we don't
>> do 
>> version numbers except when there's a well defined versioning scheme
>> of 
>> the h/w (e.g. FPGA IP blocks). So, use SoC for compatible string.
> Thanks for your review.
> 
> The new tx/rx represents a significant update for mmc controller of
> mediatek from the MT8196 chipset, and the dependent settings remain
> consistent for MT8196 and subsequent SoCs. Therefore, It is proposed to
> use a unified compatible string for these SoCs that support new tx/rx,
> and name it as 'IP(msdc) version two'.

Sorry, nope. That's not valid reasons.

>>
>>>
>>> Add three properties for MT8196 settings:
>>> - 'mediatek,prohibit-gate-cg', indicate if the source clock CG
>> could
>>>   be disabled when CPU access IP registers.
>>>
>>> - 'mediatek,stop-dly-sel', configure read data clock stops at block
>> gap.
>>>
>>> - 'mediatek,pop-en-cnt', configure the margins of write and read
>>>   pointers while begin to pop data transfer.
>>>
>>> Signed-off-by: Andy-ld Lu <andy-ld.lu at mediatek.com>
>>> ---
>>>  .../devicetree/bindings/mmc/mtk-sd.yaml       | 26
>> +++++++++++++++++++
>>>  1 file changed, 26 insertions(+)
>>>
>>> diff --git a/Documentation/devicetree/bindings/mmc/mtk-sd.yaml
>> b/Documentation/devicetree/bindings/mmc/mtk-sd.yaml
>>> index c532ec92d2d9..82d1a9fac67c 100644
>>> --- a/Documentation/devicetree/bindings/mmc/mtk-sd.yaml
>>> +++ b/Documentation/devicetree/bindings/mmc/mtk-sd.yaml
>>> @@ -25,6 +25,7 @@ properties:
>>>            - mediatek,mt8173-mmc
>>>            - mediatek,mt8183-mmc
>>>            - mediatek,mt8516-mmc
>>> +          - mediatek,msdc-v2
>>>        - items:
>>>            - const: mediatek,mt7623-mmc
>>>            - const: mediatek,mt2701-mmc
>>> @@ -154,6 +155,30 @@ properties:
>>>      enum: [32, 64]
>>>      default: 32
>>>  
>>> +  mediatek,stop-dly-sel:
>>> +    $ref: /schemas/types.yaml#/definitions/uint32
>>> +    description:
>>> +      Some SoCs need to set appropriate stop-dly-sel to configure
>> read data clock
>>> +      stops at block gap. The valid range is from 0 to 0xf.
>>
>> SoC dependent or board dependent? Imply from the compatible for the 
>> former. A property is fine for the latter case.
> Yes, it is SoC dependent in principle, but we would like to use a
> unified compatible string for MT8196 and subsequent SoCs as mentioned

Also no :(. Use SoC specific compatible.

> above, and this register setting(not relavant with new tx/rx) may be
> variant. Therefore, want to use the property of device tree to set
> individually.
>>
>>> +    minimum: 0
>>> +    maximum: 0xf
>>> +
>>> +  mediatek,pop-en-cnt:
>>> +    $ref: /schemas/types.yaml#/definitions/uint32
>>> +    description:
>>> +      Some SoCs need to set appropriate pop-en-cnt to configure
>> the margins of write
>>> +      and read pointers while begin to pop data transfer. The
>> valid range is from 0
>>> +      to 0xf.
>>> +    minimum: 0
>>> +    maximum: 0xf
>>
>> Same question.
> Same as the reply above.
>>
>>> +
>>> +  mediatek,prohibit-gate-cg:
>>> +    $ref: /schemas/types.yaml#/definitions/flag
>>> +    description:
>>> +      Decide if source clock CG could be disabled when CPU access
>> IP registers.
>>> +      If present, source clock CG could not be disabled.
>>> +      If not present, source clock CG could be disabled.
>>
>>
>> Sounds like you need to describe the clock in "clocks".
> It is not with clock itself, but rather with the bus design that would
> check the 'source_cg' status bit to decide whether to prevent the CPU
> from accessing the IP registers. And there have been no changes to the
> 'source_cg'(already been descirbed before) for MT8196.

I don't understand why do you need this property if it was already
described. Please do not describe things twice.


Best regards,
Krzysztof



From Jason-JH.Lin at mediatek.com  Sat Sep 28 08:31:51 2024
From: Jason-JH.Lin at mediatek.com (=?utf-8?B?SmFzb24tSkggTGluICjmnpfnnb/npaUp?=)
Date: Sat, 28 Sep 2024 15:31:51 +0000
Subject: [PATCH v7 0/3] Fix degradation problem of alpha blending series
In-Reply-To: <adf21ae5-6820-44ea-8cc9-7a42b345114b@gmail.com>
References: <20240926102238.24303-1-jason-jh.lin@mediatek.com>
	 <adf21ae5-6820-44ea-8cc9-7a42b345114b@gmail.com>
Message-ID: <167af196a5dec4a0d9a808756166b72e34e4b273.camel@mediatek.com>

Hi Alper,

On Sat, 2024-09-28 at 16:02 +0300, Alper Nebi Yasak wrote:
>  	 
> External email : Please do not click links or open attachments until
> you have verified the sender or the content.
>  Hi,
> 
> On 2024-09-26 13:22 +03:00, Jason-JH.Lin wrote:
> > Some SoCs not support pre-multiplied pixel formats and extending
> > configuration of OVL pre-multiplied color formats, such as MT8173.
> > 
> > Fix the SoC degradation problem by this sreies.
> > 
> > ---
> > 
> > Change in v7:
> > 1. Add the remove color format comment patch for OVL
> > 2. Fix warning: 'const' type qualifier on return type has no effect
> > 
> > [...]
> 
> I get warnings and "*ERROR* failed to create property: blend_mode" a
> few 
> times until mediatek-drm initializes. It happens on MT8173 and
> MT8183, but 
> not on MT8186. Colors are correct, though. (I'm tempted to add
> Tested-by.)
> 

MT8186 is using MT8192's compatible name, so its blend_modes suppots
pre-multiplied.

> ------8<------
> 
> From MT8173:
> 
> [  +0.017201] ------------[ cut here ]------------
> [  +0.009250] WARNING: CPU: 3 PID: 37 at
> drivers/gpu/drm/drm_blend.c:586
> drm_plane_create_blend_mode_property+0xf0/0x110 [drm]
> [  +0.022533] Modules linked in: [...]
> [  +0.158166] CPU: 3 UID: 0 PID: 37 Comm: kworker/u16:1 Tainted:
> G        W          6.11.0-next-20240927-deb-00006-ge514a0f89dd9 #
> [  +0.023542] Tainted: [W]=WARN
> [  +0.005936] Hardware name: Google Hana (DT)
> [  +0.008379] Workqueue: events_unbound deferred_probe_work_func
> [  +0.011694] pstate: 80000005 (Nzcv daif -PAN -UAO -TCO -DIT -SSBS
> BTYPE=--)
> [  +0.013959] pc : drm_plane_create_blend_mode_property+0xf0/0x110
> [drm]
> [  +0.013111] lr : mtk_plane_init+0xf4/0x198 [mediatek_drm]
> [  +0.010829] sp : ffff800081d538c0
> [  +0.006634] x29: ffff800081d538c0 x28: ffff0000c431e080 x27:
> ffff0000c19787a8
> [  +0.014314] x26: 0000000000000548 x25: 0000000000000006 x24:
> ffff0000c431f000
> [  +0.014317] x23: 0000000000000035 x22: 0000000000000006 x21:
> ffff0000c0ca1058
> [  +0.014313] x20: 0000000000000006 x19: 0000000000000000 x18:
> ffffffffffffffff
> [  +0.014314] x17: 6f72702065746165 x16: 7263206f74206465 x15:
> ffff0000c414e626
> [  +0.014316] x14: 0000000000000000 x13: 0000000000000028 x12:
> 0101010101010101
> [  +0.014313] x11: 7f7f7f7f7f7f7f7f x10: fefefeff726e6f79 x9 :
> ffff800079e689dc
> [  +0.014316] x8 : ffff0000c5875554 x7 : 00000000eeeeeeee x6 :
> 00000000c0c0c0c0
> [  +0.014314] x5 : 0000000000000000 x4 : ffff0000c0ca1190 x3 :
> ffff0000c0ca1190
> [  +0.014313] x2 : 000000000000ffff x1 : 0000000000000006 x0 :
> ffff0000c0ca1058
> [  +0.014314] Call trace:
> [  +0.004891]  drm_plane_create_blend_mode_property+0xf0/0x110 [drm]
> [  +0.012415]  mtk_plane_init+0xf4/0x198 [mediatek_drm]
> [  +0.010132]  mtk_crtc_create+0x34c/0x858 [mediatek_drm]
> [  +0.010479]  mtk_drm_bind+0x4b4/0x600 [mediatek_drm]
> [  +0.009956]  try_to_bring_up_aggregate_device+0x21c/0x2e8
> [  +0.010825]  __component_add+0xc0/0x1c0
> [  +0.007685]  component_add+0x1c/0x38
> [  +0.007163]  mtk_disp_rdma_probe+0x148/0x230 [mediatek_drm]
> [  +0.011175]  platform_probe+0x70/0xe8
> [  +0.007338]  really_probe+0xc8/0x3a0
> [  +0.007161]  __driver_probe_device+0x84/0x160
> [  +0.008730]  driver_probe_device+0x44/0x130
> [  +0.008379]  __device_attach_driver+0xc4/0x170
> [  +0.008905]  bus_for_each_drv+0x90/0x100
> [  +0.007855]  __device_attach+0xa8/0x1c8
> [  +0.007685]  device_initial_probe+0x1c/0x30
> [  +0.008380]  bus_probe_device+0xb0/0xc0
> [  +0.007683]  deferred_probe_work_func+0xbc/0x120
> [  +0.009253]  process_one_work+0x178/0x3d0
> [  +0.008033]  worker_thread+0x200/0x3f0
> [  +0.007511]  kthread+0xe8/0xf8
> [  +0.006115]  ret_from_fork+0x10/0x20
> [  +0.007164] ---[ end trace 0000000000000000 ]---
> [  +0.009278] [drm:mtk_plane_init [mediatek_drm]] *ERROR* failed to
> create property: blend_mode
> 
> From MT8183:
> 
> [   13.936989] ------------[ cut here ]------------
> [   13.946224] WARNING: CPU: 5 PID: 60 at
> drivers/gpu/drm/drm_blend.c:586
> drm_plane_create_blend_mode_property+0xf0/0x110 [drm]
> [   13.968714] Modules linked in: [...]
> [   14.116814] CPU: 5 UID: 0 PID: 60 Comm: kworker/u34:2 Tainted:
> G        W          6.11.0-next-20240927-deb-00006-ge514a0f89dd9 #1
> [   14.140323] Tainted: [W]=WARN
> [   14.146248] Hardware name: Google cozmo board (DT)
> [   14.155830] Workqueue: events_unbound deferred_probe_work_func
> [   14.167505] pstate: 80000005 (Nzcv daif -PAN -UAO -TCO -DIT -SSBS
> BTYPE=--)
> [   14.181440] pc : drm_plane_create_blend_mode_property+0xf0/0x110
> [drm]
> [   14.194529] lr : mtk_plane_init+0xf4/0x188 [mediatek_drm]
> [   14.205338] sp : ffff8000804a3860
> [   14.211960] x29: ffff8000804a3860 x28: ffff715445288080 x27:
> ffff7154417fa748
> [   14.226247] x26: 0000000000000548 x25: 0000000000000006 x24:
> ffff71544528a000
> [   14.240536] x23: 0000000000000035 x22: 0000000000000006 x21:
> ffff715445a49ae8
> [   14.254822] x20: 0000000000000006 x19: 0000000000000000 x18:
> ffffffffffffffff
> [   14.269110] x17: 6f72702065746165 x16: ffffd6facceae8c0 x15:
> ffff715470421d46
> [   14.283398] x14: 0000000000000000 x13: 0000000000000028 x12:
> 0101010101010101
> [   14.297686] x11: 7f7f7f7f7f7f7f7f x10: fefefeff726e6f79 x9 :
> ffffd6fa92d179dc
> [   14.311973] x8 : ffff715445156ad4 x7 : 00000000eeeeeeee x6 :
> 00000000c0c0c0c0
> [   14.326261] x5 : 0000000000000000 x4 : ffff715445a49c20 x3 :
> ffff715445a49c20
> [   14.340549] x2 : 000000000000ffff x1 : 0000000000000006 x0 :
> ffff715445a49ae8
> [   14.354837] Call trace:
> [   14.359718]  drm_plane_create_blend_mode_property+0xf0/0x110 [drm]
> [   14.372111]  mtk_plane_init+0xf4/0x188 [mediatek_drm]
> [   14.382224]  mtk_crtc_create+0x34c/0x858 [mediatek_drm]
> [   14.392685]  mtk_drm_bind+0x51c/0x600 [mediatek_drm]
> [   14.402622]  try_to_bring_up_aggregate_device+0x21c/0x2e8
> [   14.413425]  __component_add+0xc0/0x1c0
> [   14.421094]  component_add+0x1c/0x38
> [   14.428241]  mtk_dsi_host_attach+0x80/0xe0 [mediatek_drm]
> [   14.439049]  devm_mipi_dsi_attach+0x3c/0xa0
> [   14.447413]  anx7625_link_bridge+0xfc/0x1c8 [anx7625]
> [   14.457522]  dp_aux_ep_probe+0x54/0x110 [drm_dp_aux_bus]
> [   14.468150]  really_probe+0xc8/0x3a0
> [   14.475296]  __driver_probe_device+0x84/0x160
> [   14.484009]  driver_probe_device+0x44/0x130
> [   14.492374]  __device_attach_driver+0xc4/0x170
> [   14.501261]  bus_for_each_drv+0x90/0x100
> [   14.509103]  __device_attach+0xa8/0x1c8
> [   14.516772]  device_initial_probe+0x1c/0x30
> [   14.525137]  bus_probe_device+0xb0/0xc0
> [   14.532805]  deferred_probe_work_func+0xbc/0x120
> [   14.542040]  process_one_work+0x178/0x3d0
> [   14.550059]  worker_thread+0x200/0x3f0
> [   14.557553]  kthread+0xe8/0xf8
> [   14.563656]  ret_from_fork+0x10/0x20
> [   14.570803] ---[ end trace 0000000000000000 ]---
> [   14.580052] [drm:mtk_plane_init [mediatek_drm]] *ERROR* failed to
> create property: blend_mode

Take a glimpse of drm_plane_create_blend_mode_property(), it can simply
find the reason here:
/**
 * drm_plane_create_blend_mode_property - create a new blend mode
property
 * @plane: drm plane
 * @supported_modes: bitmask of supported modes, must include
 *           BIT(DRM_MODE_BLEND_PREMULTI). Current DRM assumption is
 *           that alpha is premultiplied, and old userspace can break
if
 *           the property defaults to anything else.
 ...
 * RETURNS:
 * Zero for success or -errno
 */

int drm_plane_create_blend_mode_property(struct drm_plane *plane,
                     unsigned int supported_modes)
{
    unsigned int valid_mode_mask = BIT(DRM_MODE_BLEND_PIXEL_NONE) |
                                   BIT(DRM_MODE_BLEND_PREMULTI)   |
                                   BIT(DRM_MODE_BLEND_COVERAGE);
...

    if (WARN_ON((supported_modes & ~valid_mode_mask) ||
        ((supported_modes & BIT(DRM_MODE_BLEND_PREMULTI)) == 0)))
        return -EINVAL;
...
}

So I think if the SoCs don't support pre-multiplied color formats, then
just not create the blend_mode property and use the coverage mode color
format as default settings for OVL.

I'll send v8 for this.

Thanks for the verification on MT8173, MT8183 and MT8186.

Regards,
Jason-JH.Lin

From abhashkumarjha123 at gmail.com  Sat Sep 28 09:11:08 2024
From: abhashkumarjha123 at gmail.com (Abhash Jha)
Date: Sat, 28 Sep 2024 21:41:08 +0530
Subject: [PATCH] iio: adc: mt6360-adc: Converted to use get_unaligned_be16()
Message-ID: <20240928161108.163647-1-abhashkumarjha123@gmail.com>

Changed the manual shifting and adding of bytes to use
get_unaligned_be16() api instead.

Signed-off-by: Abhash Jha <abhashkumarjha123 at gmail.com>
---
 drivers/iio/adc/mt6360-adc.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/iio/adc/mt6360-adc.c b/drivers/iio/adc/mt6360-adc.c
index 3710473e5..91befe2cd 100644
--- a/drivers/iio/adc/mt6360-adc.c
+++ b/drivers/iio/adc/mt6360-adc.c
@@ -124,7 +124,7 @@ static int mt6360_adc_read_channel(struct mt6360_adc_data *mad, int channel, int
 		usleep_range(ADC_LOOP_TIME_US / 2, ADC_LOOP_TIME_US);
 	}
 
-	*val = rpt[1] << 8 | rpt[2];
+	*val = get_unaligned_be16(&rpt[1]);
 	ret = IIO_VAL_INT;
 
 out_adc_conv:
-- 
2.43.0



From jason-jh.lin at mediatek.com  Sat Sep 28 09:15:46 2024
From: jason-jh.lin at mediatek.com (Jason-JH.Lin)
Date: Sun, 29 Sep 2024 00:15:46 +0800
Subject: [PATCH v8 3/3] drm/mediatek: Add blend_modes to mtk_plane_init() for different SoCs
In-Reply-To: <20240928161546.9285-1-jason-jh.lin@mediatek.com>
References: <20240928161546.9285-1-jason-jh.lin@mediatek.com>
Message-ID: <20240928161546.9285-4-jason-jh.lin@mediatek.com>

Since some SoCs support premultiplied pixel formats but some do not,
the blend_modes parameter is added to mtk_plane_init(), which is
obtained from the mtk_ddp_comp_get_blend_modes function implemented
in different blending supported components.

The blending supported components can use driver data to set the
blend mode capabilities for different SoCs.

Signed-off-by: Jason-JH.Lin <jason-jh.lin at mediatek.com>
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
Reviewed-by: CK Hu <ck.hu at mediatek.com>
---
 drivers/gpu/drm/mediatek/mtk_crtc.c             |  1 +
 drivers/gpu/drm/mediatek/mtk_ddp_comp.c         |  2 ++
 drivers/gpu/drm/mediatek/mtk_ddp_comp.h         | 10 ++++++++++
 drivers/gpu/drm/mediatek/mtk_disp_drv.h         |  2 ++
 drivers/gpu/drm/mediatek/mtk_disp_ovl.c         |  7 +++++++
 drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c |  7 +++++++
 drivers/gpu/drm/mediatek/mtk_ethdr.c            |  7 +++++++
 drivers/gpu/drm/mediatek/mtk_ethdr.h            |  1 +
 drivers/gpu/drm/mediatek/mtk_plane.c            | 15 +++++++--------
 drivers/gpu/drm/mediatek/mtk_plane.h            |  4 ++--
 10 files changed, 46 insertions(+), 10 deletions(-)

diff --git a/drivers/gpu/drm/mediatek/mtk_crtc.c b/drivers/gpu/drm/mediatek/mtk_crtc.c
index 175b00e5a253..b65f196f2015 100644
--- a/drivers/gpu/drm/mediatek/mtk_crtc.c
+++ b/drivers/gpu/drm/mediatek/mtk_crtc.c
@@ -913,6 +913,7 @@ static int mtk_crtc_init_comp_planes(struct drm_device *drm_dev,
 				BIT(pipe),
 				mtk_crtc_plane_type(mtk_crtc->layer_nr, num_planes),
 				mtk_ddp_comp_supported_rotations(comp),
+				mtk_ddp_comp_get_blend_modes(comp),
 				mtk_ddp_comp_get_formats(comp),
 				mtk_ddp_comp_get_num_formats(comp), i);
 		if (ret)
diff --git a/drivers/gpu/drm/mediatek/mtk_ddp_comp.c b/drivers/gpu/drm/mediatek/mtk_ddp_comp.c
index be66d94be361..edc6417639e6 100644
--- a/drivers/gpu/drm/mediatek/mtk_ddp_comp.c
+++ b/drivers/gpu/drm/mediatek/mtk_ddp_comp.c
@@ -363,6 +363,7 @@ static const struct mtk_ddp_comp_funcs ddp_ovl = {
 	.layer_config = mtk_ovl_layer_config,
 	.bgclr_in_on = mtk_ovl_bgclr_in_on,
 	.bgclr_in_off = mtk_ovl_bgclr_in_off,
+	.get_blend_modes = mtk_ovl_get_blend_modes,
 	.get_formats = mtk_ovl_get_formats,
 	.get_num_formats = mtk_ovl_get_num_formats,
 };
@@ -416,6 +417,7 @@ static const struct mtk_ddp_comp_funcs ddp_ovl_adaptor = {
 	.disconnect = mtk_ovl_adaptor_disconnect,
 	.add = mtk_ovl_adaptor_add_comp,
 	.remove = mtk_ovl_adaptor_remove_comp,
+	.get_blend_modes = mtk_ovl_adaptor_get_blend_modes,
 	.get_formats = mtk_ovl_adaptor_get_formats,
 	.get_num_formats = mtk_ovl_adaptor_get_num_formats,
 	.mode_valid = mtk_ovl_adaptor_mode_valid,
diff --git a/drivers/gpu/drm/mediatek/mtk_ddp_comp.h b/drivers/gpu/drm/mediatek/mtk_ddp_comp.h
index ecf6dc283cd7..39720b27f4e9 100644
--- a/drivers/gpu/drm/mediatek/mtk_ddp_comp.h
+++ b/drivers/gpu/drm/mediatek/mtk_ddp_comp.h
@@ -80,6 +80,7 @@ struct mtk_ddp_comp_funcs {
 	void (*ctm_set)(struct device *dev,
 			struct drm_crtc_state *state);
 	struct device * (*dma_dev_get)(struct device *dev);
+	u32 (*get_blend_modes)(struct device *dev);
 	const u32 *(*get_formats)(struct device *dev);
 	size_t (*get_num_formats)(struct device *dev);
 	void (*connect)(struct device *dev, struct device *mmsys_dev, unsigned int next);
@@ -266,6 +267,15 @@ static inline struct device *mtk_ddp_comp_dma_dev_get(struct mtk_ddp_comp *comp)
 	return comp->dev;
 }
 
+static inline
+u32 mtk_ddp_comp_get_blend_modes(struct mtk_ddp_comp *comp)
+{
+	if (comp->funcs && comp->funcs->get_blend_modes)
+		return comp->funcs->get_blend_modes(comp->dev);
+
+	return 0;
+}
+
 static inline
 const u32 *mtk_ddp_comp_get_formats(struct mtk_ddp_comp *comp)
 {
diff --git a/drivers/gpu/drm/mediatek/mtk_disp_drv.h b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
index 082ac18fe04a..04154db9085c 100644
--- a/drivers/gpu/drm/mediatek/mtk_disp_drv.h
+++ b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
@@ -103,6 +103,7 @@ void mtk_ovl_register_vblank_cb(struct device *dev,
 void mtk_ovl_unregister_vblank_cb(struct device *dev);
 void mtk_ovl_enable_vblank(struct device *dev);
 void mtk_ovl_disable_vblank(struct device *dev);
+u32 mtk_ovl_get_blend_modes(struct device *dev);
 const u32 *mtk_ovl_get_formats(struct device *dev);
 size_t mtk_ovl_get_num_formats(struct device *dev);
 
@@ -131,6 +132,7 @@ void mtk_ovl_adaptor_start(struct device *dev);
 void mtk_ovl_adaptor_stop(struct device *dev);
 unsigned int mtk_ovl_adaptor_layer_nr(struct device *dev);
 struct device *mtk_ovl_adaptor_dma_dev_get(struct device *dev);
+u32 mtk_ovl_adaptor_get_blend_modes(struct device *dev);
 const u32 *mtk_ovl_adaptor_get_formats(struct device *dev);
 size_t mtk_ovl_adaptor_get_num_formats(struct device *dev);
 enum drm_mode_status mtk_ovl_adaptor_mode_valid(struct device *dev,
diff --git a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
index 4bfed8a4c14f..703cd3f6c6d3 100644
--- a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
+++ b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
@@ -215,6 +215,13 @@ void mtk_ovl_disable_vblank(struct device *dev)
 	writel_relaxed(0x0, ovl->regs + DISP_REG_OVL_INTEN);
 }
 
+u32 mtk_ovl_get_blend_modes(struct device *dev)
+{
+	struct mtk_disp_ovl *ovl = dev_get_drvdata(dev);
+
+	return ovl->data->blend_modes;
+}
+
 const u32 *mtk_ovl_get_formats(struct device *dev)
 {
 	struct mtk_disp_ovl *ovl = dev_get_drvdata(dev);
diff --git a/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c b/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c
index c6768210b08b..bf2546c4681a 100644
--- a/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c
+++ b/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c
@@ -400,6 +400,13 @@ void mtk_ovl_adaptor_disable_vblank(struct device *dev)
 	mtk_ethdr_disable_vblank(ovl_adaptor->ovl_adaptor_comp[OVL_ADAPTOR_ETHDR0]);
 }
 
+u32 mtk_ovl_adaptor_get_blend_modes(struct device *dev)
+{
+	struct mtk_disp_ovl_adaptor *ovl_adaptor = dev_get_drvdata(dev);
+
+	return mtk_ethdr_get_blend_modes(ovl_adaptor->ovl_adaptor_comp[OVL_ADAPTOR_ETHDR0]);
+}
+
 const u32 *mtk_ovl_adaptor_get_formats(struct device *dev)
 {
 	struct mtk_disp_ovl_adaptor *ovl_adaptor = dev_get_drvdata(dev);
diff --git a/drivers/gpu/drm/mediatek/mtk_ethdr.c b/drivers/gpu/drm/mediatek/mtk_ethdr.c
index d1d9cf8b10e1..0f22e7d337cb 100644
--- a/drivers/gpu/drm/mediatek/mtk_ethdr.c
+++ b/drivers/gpu/drm/mediatek/mtk_ethdr.c
@@ -145,6 +145,13 @@ static irqreturn_t mtk_ethdr_irq_handler(int irq, void *dev_id)
 	return IRQ_HANDLED;
 }
 
+u32 mtk_ethdr_get_blend_modes(struct device *dev)
+{
+	return BIT(DRM_MODE_BLEND_PREMULTI) |
+	       BIT(DRM_MODE_BLEND_COVERAGE) |
+	       BIT(DRM_MODE_BLEND_PIXEL_NONE);
+}
+
 void mtk_ethdr_layer_config(struct device *dev, unsigned int idx,
 			    struct mtk_plane_state *state,
 			    struct cmdq_pkt *cmdq_pkt)
diff --git a/drivers/gpu/drm/mediatek/mtk_ethdr.h b/drivers/gpu/drm/mediatek/mtk_ethdr.h
index 81af9edea3f7..a72aeee46829 100644
--- a/drivers/gpu/drm/mediatek/mtk_ethdr.h
+++ b/drivers/gpu/drm/mediatek/mtk_ethdr.h
@@ -13,6 +13,7 @@ void mtk_ethdr_clk_disable(struct device *dev);
 void mtk_ethdr_config(struct device *dev, unsigned int w,
 		      unsigned int h, unsigned int vrefresh,
 		      unsigned int bpc, struct cmdq_pkt *cmdq_pkt);
+u32 mtk_ethdr_get_blend_modes(struct device *dev);
 void mtk_ethdr_layer_config(struct device *dev, unsigned int idx,
 			    struct mtk_plane_state *state,
 			    struct cmdq_pkt *cmdq_pkt);
diff --git a/drivers/gpu/drm/mediatek/mtk_plane.c b/drivers/gpu/drm/mediatek/mtk_plane.c
index 7d2cb4e0fafa..8a48b3b0a956 100644
--- a/drivers/gpu/drm/mediatek/mtk_plane.c
+++ b/drivers/gpu/drm/mediatek/mtk_plane.c
@@ -320,8 +320,8 @@ static const struct drm_plane_helper_funcs mtk_plane_helper_funcs = {
 
 int mtk_plane_init(struct drm_device *dev, struct drm_plane *plane,
 		   unsigned long possible_crtcs, enum drm_plane_type type,
-		   unsigned int supported_rotations, const u32 *formats,
-		   size_t num_formats, unsigned int plane_idx)
+		   unsigned int supported_rotations, const u32 blend_modes,
+		   const u32 *formats, size_t num_formats, unsigned int plane_idx)
 {
 	int err;
 
@@ -366,12 +366,11 @@ int mtk_plane_init(struct drm_device *dev, struct drm_plane *plane,
 	if (err)
 		DRM_ERROR("failed to create property: alpha\n");
 
-	err = drm_plane_create_blend_mode_property(plane,
-						   BIT(DRM_MODE_BLEND_PREMULTI) |
-						   BIT(DRM_MODE_BLEND_COVERAGE) |
-						   BIT(DRM_MODE_BLEND_PIXEL_NONE));
-	if (err)
-		DRM_ERROR("failed to create property: blend_mode\n");
+	if (blend_modes) {
+		err = drm_plane_create_blend_mode_property(plane, blend_modes);
+		if (err)
+			DRM_ERROR("failed to create property: blend_mode\n");
+	}
 
 	drm_plane_helper_add(plane, &mtk_plane_helper_funcs);
 
diff --git a/drivers/gpu/drm/mediatek/mtk_plane.h b/drivers/gpu/drm/mediatek/mtk_plane.h
index 5b177eac67b7..3b13b89989c7 100644
--- a/drivers/gpu/drm/mediatek/mtk_plane.h
+++ b/drivers/gpu/drm/mediatek/mtk_plane.h
@@ -48,6 +48,6 @@ to_mtk_plane_state(struct drm_plane_state *state)
 
 int mtk_plane_init(struct drm_device *dev, struct drm_plane *plane,
 		   unsigned long possible_crtcs, enum drm_plane_type type,
-		   unsigned int supported_rotations, const u32 *formats,
-		   size_t num_formats, unsigned int plane_idx);
+		   unsigned int supported_rotations, const u32 blend_modes,
+		   const u32 *formats, size_t num_formats, unsigned int plane_idx);
 #endif
-- 
2.43.0



From jason-jh.lin at mediatek.com  Sat Sep 28 09:15:43 2024
From: jason-jh.lin at mediatek.com (Jason-JH.Lin)
Date: Sun, 29 Sep 2024 00:15:43 +0800
Subject: [PATCH v8 0/3] Fix degradation problem of alpha blending series
Message-ID: <20240928161546.9285-1-jason-jh.lin@mediatek.com>

From: Jason-jh Lin <jason-jh.lin at mediatek.corp-partner.google.com>

Some SoCs not support pre-multiplied pixel formats and extending
configuration of OVL pre-multiplied color formats, such as MT8173.

Fix the SoC degradation problem by this sreies.

---
Change in v8:
Remove blend_modes for not supported pre-multiplied SoCs to fix the
return error from drm_plane_create_blend_mode_property().

Change in v7:
1. Add the remove color format comment patch for OVL
2. Fix warning: 'const' type qualifier on return type has no effect

Chnage in v6:
1. Use blend_modes instead of function pointer in OVL
2. Use ethdr instead of mdp_rdma to get blend_modes
3. Add 0 checking for adding blend_mode property for mtk_plane

Change in v5:
Add fix patch for mtk_plane

Change in v4:
Add lost cases of mtk_ovl_fmt_convert_with_blend

Change in v3:
Change MACRO approach to function pointer in driver data

Change in v2:
Fix build error and typo

Change in v1:
Add fix patch for OVL unsupport color format settings by driver data

---

Jason-JH.Lin (3):
  drm/mediatek: ovl: Remove the color format comment for
    ovl_fmt_convert()
  drm/mediatek: ovl: Add blend_modes to driver data
  drm/mediatek: Add blend_modes to mtk_plane_init() for different SoCs

 drivers/gpu/drm/mediatek/mtk_crtc.c           |  1 +
 drivers/gpu/drm/mediatek/mtk_ddp_comp.c       |  2 +
 drivers/gpu/drm/mediatek/mtk_ddp_comp.h       | 10 +++++
 drivers/gpu/drm/mediatek/mtk_disp_drv.h       |  2 +
 drivers/gpu/drm/mediatek/mtk_disp_ovl.c       | 44 ++++++++++++++++---
 .../gpu/drm/mediatek/mtk_disp_ovl_adaptor.c   |  7 +++
 drivers/gpu/drm/mediatek/mtk_ethdr.c          |  7 +++
 drivers/gpu/drm/mediatek/mtk_ethdr.h          |  1 +
 drivers/gpu/drm/mediatek/mtk_plane.c          | 15 +++----
 drivers/gpu/drm/mediatek/mtk_plane.h          |  4 +-
 10 files changed, 76 insertions(+), 17 deletions(-)

-- 
2.43.0



From jason-jh.lin at mediatek.com  Sat Sep 28 09:15:45 2024
From: jason-jh.lin at mediatek.com (Jason-JH.Lin)
Date: Sun, 29 Sep 2024 00:15:45 +0800
Subject: [PATCH v8 2/3] drm/mediatek: ovl: Add blend_modes to driver data
In-Reply-To: <20240928161546.9285-1-jason-jh.lin@mediatek.com>
References: <20240928161546.9285-1-jason-jh.lin@mediatek.com>
Message-ID: <20240928161546.9285-3-jason-jh.lin@mediatek.com>

OVL_CON_CLRFMT_MAN is a configuration for extending color format
settings of DISP_REG_OVL_CON(n).
It will change some of the original color format settings.

Take the settings of (3 << 12) for example.
- If OVL_CON_CLRFMT_MAN = 0 means OVL_CON_CLRFMT_RGBA8888.
- If OVL_CON_CLRFMT_MAN = 1 means OVL_CON_CLRFMT_PARGB8888.

Since previous SoCs did not support OVL_CON_CLRFMT_MAN, this means
that the SoC does not support the premultiplied color format.
It will break the original color format setting of MT8173.

Therefore, the blend_modes is added to the driver data and then
mtk_ovl_fmt_convert() will check the blend_modes to see if
premultiplied supported in current platform.
If it is not supported, use coverage mode to set it to the supported
color formats to solve the degradation problem.

Fixes: a3f7f7ef4bfe ("drm/mediatek: Support "Pre-multiplied" blending in OVL")
Signed-off-by: Jason-JH.Lin <jason-jh.lin at mediatek.com>
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
---
 drivers/gpu/drm/mediatek/mtk_disp_ovl.c | 34 ++++++++++++++++++++++---
 1 file changed, 31 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
index 4a4bc27a67f0..4bfed8a4c14f 100644
--- a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
+++ b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
@@ -146,6 +146,7 @@ struct mtk_disp_ovl_data {
 	bool fmt_rgb565_is_0;
 	bool smi_id_en;
 	bool supports_afbc;
+	const u32 blend_modes;
 	const u32 *formats;
 	size_t num_formats;
 	bool supports_clrfmt_ext;
@@ -386,9 +387,27 @@ void mtk_ovl_layer_off(struct device *dev, unsigned int idx,
 		      DISP_REG_OVL_RDMA_CTRL(idx));
 }
 
-static unsigned int ovl_fmt_convert(struct mtk_disp_ovl *ovl, unsigned int fmt,
-				    unsigned int blend_mode)
+static unsigned int mtk_ovl_fmt_convert(struct mtk_disp_ovl *ovl,
+					struct mtk_plane_state *state)
 {
+	unsigned int fmt = state->pending.format;
+	unsigned int blend_mode = DRM_MODE_BLEND_COVERAGE;
+
+	/*
+	 * For the platforms where OVL_CON_CLRFMT_MAN is defined in the hardware data sheet
+	 * and supports premultiplied color formats, such as OVL_CON_CLRFMT_PARGB8888.
+	 *
+	 * Check blend_modes in the driver data to see if premultiplied mode is supported.
+	 * If not, use coverage mode instead to set it to the supported color formats.
+	 *
+	 * Current DRM assumption is that alpha is default premultiplied, so the bitmask of
+	 * blend_modes must include BIT(DRM_MODE_BLEND_PREMULTI). Otherwise, mtk_plane_init()
+	 * will get an error return from drm_plane_create_blend_mode_property() and
+	 * state->base.pixel_blend_mode should not be used.
+	 */
+	if (ovl->data->blend_modes & BIT(DRM_MODE_BLEND_PREMULTI))
+		blend_mode = state->base.pixel_blend_mode;
+
 	switch (fmt) {
 	default:
 	case DRM_FORMAT_RGB565:
@@ -466,7 +485,7 @@ void mtk_ovl_layer_config(struct device *dev, unsigned int idx,
 		return;
 	}
 
-	con = ovl_fmt_convert(ovl, fmt, blend_mode);
+	con = mtk_ovl_fmt_convert(ovl, state);
 	if (state->base.fb) {
 		con |= OVL_CON_AEN;
 		con |= state->base.alpha & OVL_CON_ALPHA;
@@ -658,6 +677,9 @@ static const struct mtk_disp_ovl_data mt8192_ovl_driver_data = {
 	.layer_nr = 4,
 	.fmt_rgb565_is_0 = true,
 	.smi_id_en = true,
+	.blend_modes = BIT(DRM_MODE_BLEND_PREMULTI) |
+		       BIT(DRM_MODE_BLEND_COVERAGE) |
+		       BIT(DRM_MODE_BLEND_PIXEL_NONE),
 	.formats = mt8173_formats,
 	.num_formats = ARRAY_SIZE(mt8173_formats),
 };
@@ -668,6 +690,9 @@ static const struct mtk_disp_ovl_data mt8192_ovl_2l_driver_data = {
 	.layer_nr = 2,
 	.fmt_rgb565_is_0 = true,
 	.smi_id_en = true,
+	.blend_modes = BIT(DRM_MODE_BLEND_PREMULTI) |
+		       BIT(DRM_MODE_BLEND_COVERAGE) |
+		       BIT(DRM_MODE_BLEND_PIXEL_NONE),
 	.formats = mt8173_formats,
 	.num_formats = ARRAY_SIZE(mt8173_formats),
 };
@@ -679,6 +704,9 @@ static const struct mtk_disp_ovl_data mt8195_ovl_driver_data = {
 	.fmt_rgb565_is_0 = true,
 	.smi_id_en = true,
 	.supports_afbc = true,
+	.blend_modes = BIT(DRM_MODE_BLEND_PREMULTI) |
+		       BIT(DRM_MODE_BLEND_COVERAGE) |
+		       BIT(DRM_MODE_BLEND_PIXEL_NONE),
 	.formats = mt8195_formats,
 	.num_formats = ARRAY_SIZE(mt8195_formats),
 	.supports_clrfmt_ext = true,
-- 
2.43.0



From jason-jh.lin at mediatek.com  Sat Sep 28 09:15:44 2024
From: jason-jh.lin at mediatek.com (Jason-JH.Lin)
Date: Sun, 29 Sep 2024 00:15:44 +0800
Subject: [PATCH v8 1/3] drm/mediatek: ovl: Remove the color format comment for ovl_fmt_convert()
In-Reply-To: <20240928161546.9285-1-jason-jh.lin@mediatek.com>
References: <20240928161546.9285-1-jason-jh.lin@mediatek.com>
Message-ID: <20240928161546.9285-2-jason-jh.lin@mediatek.com>

Since we changed MACROs to be consistent with DRM input color format
naming, the comment for ovl_fmt_conver() is no longer needed.

Fixes: 9f428b95ac89 ("drm/mediatek: Add new color format MACROs in OVL")
Signed-off-by: Jason-JH.Lin <jason-jh.lin at mediatek.com>
Reviewed-by: CK Hu <ck.hu at mediatek.com>
---
 drivers/gpu/drm/mediatek/mtk_disp_ovl.c | 5 -----
 1 file changed, 5 deletions(-)

diff --git a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
index 89b439dcf3a6..4a4bc27a67f0 100644
--- a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
+++ b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
@@ -389,11 +389,6 @@ void mtk_ovl_layer_off(struct device *dev, unsigned int idx,
 static unsigned int ovl_fmt_convert(struct mtk_disp_ovl *ovl, unsigned int fmt,
 				    unsigned int blend_mode)
 {
-	/* The return value in switch "MEM_MODE_INPUT_FORMAT_XXX"
-	 * is defined in mediatek HW data sheet.
-	 * The alphabet order in XXX is no relation to data
-	 * arrangement in memory.
-	 */
 	switch (fmt) {
 	default:
 	case DRM_FORMAT_RGB565:
-- 
2.43.0



From alpernebiyasak at gmail.com  Sat Sep 28 10:18:47 2024
From: alpernebiyasak at gmail.com (Alper Nebi Yasak)
Date: Sat, 28 Sep 2024 20:18:47 +0300
Subject: [PATCH v8 0/3] Fix degradation problem of alpha blending series
In-Reply-To: <20240928161546.9285-1-jason-jh.lin@mediatek.com>
References: <20240928161546.9285-1-jason-jh.lin@mediatek.com>
Message-ID: <5207019e-5059-4721-8ac6-4f4ea2753643@gmail.com>

Hi,

On 2024-09-28 19:15 +03:00, Jason-JH.Lin wrote:
> From: Jason-jh Lin <jason-jh.lin at mediatek.corp-partner.google.com>
> 
> Some SoCs not support pre-multiplied pixel formats and extending
> configuration of OVL pre-multiplied color formats, such as MT8173.
> 
> Fix the SoC degradation problem by this sreies.
> 
> ---
> Change in v8:
> Remove blend_modes for not supported pre-multiplied SoCs to fix the
> return error from drm_plane_create_blend_mode_property().
> 
> [...]

I no longer see the warnings I mentioned in v7, and everything looks OK
on my MT8173, MT8183, MT8186 Chromebooks.

Tested-by: Alper Nebi Yasak <alpernebiyasak at gmail.com>


From conor at kernel.org  Sat Sep 28 13:14:17 2024
From: conor at kernel.org (Conor Dooley)
Date: Sat, 28 Sep 2024 21:14:17 +0100
Subject: [PATCH 3/6] dt-bindings: display: mediatek: Fix clocks count
 constraint for new SoCs
In-Reply-To: <93d9ffbe466ff61d5426b6f158a4b8464f56824d.camel@mediatek.com>
References: <20240924103156.13119-1-macpaul.lin@mediatek.com>
 <20240924103156.13119-3-macpaul.lin@mediatek.com>
 <ffc1900b-3921-48ca-a2b2-1b798c57e572@collabora.com>
 <20240924-commute-collision-13ad39717d31@spud>
 <2821ef09-1b32-082d-69d1-e09a3a302447@mediatek.com>
 <20240925-satisfy-epidermal-bd414891479a@spud>
 <7a1315ef-4be5-4528-858b-9f07c814636d@collabora.com>
 <93d9ffbe466ff61d5426b6f158a4b8464f56824d.camel@mediatek.com>
Message-ID: <20240928-hummus-carol-0f09081f892d@spud>

On Fri, Sep 27, 2024 at 02:27:14AM +0000, Moudy Ho (???) wrote:
> On Thu, 2024-09-26 at 11:38 +0200, AngeloGioacchino Del Regno wrote:
> > Il 25/09/24 16:34, Conor Dooley ha scritto:
> > > On Wed, Sep 25, 2024 at 04:42:59PM +0800, Macpaul Lin wrote:
> > > > 
> > > > On 9/25/24 00:00, Conor Dooley wrote:
> > > > > On Tue, Sep 24, 2024 at 01:42:01PM +0200, AngeloGioacchino Del
> > > > > Regno wrote:
> > > > > > Il 24/09/24 12:31, Macpaul Lin ha scritto:
> > > > > > > The display node in mt8195.dtsi was triggering a CHECK_DTBS
> > > > > > > error due
> > > > > > > to an excessively long 'clocks' property:
> > > > > > >      display at 14f06000: clocks: [[31, 14], [31, 43], [31,
> > > > > > > 44]] is too long
> > > > > > > 
> > > > > > > To resolve this issue, add "maxItems: 3" to the 'clocks'
> > > > > > > property in
> > > > > > > the DT schema.
> > > > > > > 
> > > > > > > Fixes: 4ed545e7d100 ("dt-bindings: display: mediatek: disp:
> > > > > > > split each block to individual yaml")
> > > > > > > Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
> > > > > > > ---
> > > > > > >     .../devicetree/bindings/display/mediatek/mediatek,split
> > > > > > > .yaml     | 1 +
> > > > > > >     1 file changed, 1 insertion(+)
> > > > > > > 
> > > > > > > diff --git
> > > > > > > a/Documentation/devicetree/bindings/display/mediatek/mediat
> > > > > > > ek,split.yaml
> > > > > > > b/Documentation/devicetree/bindings/display/mediatek/mediat
> > > > > > > ek,split.yaml
> > > > > > > index e4affc854f3d..42d2d483cc29 100644
> > > > > > > ---
> > > > > > > a/Documentation/devicetree/bindings/display/mediatek/mediat
> > > > > > > ek,split.yaml
> > > > > > > +++
> > > > > > > b/Documentation/devicetree/bindings/display/mediatek/mediat
> > > > > > > ek,split.yaml
> > > > > > > @@ -57,6 +57,7 @@ properties:
> > > > > > >       clocks:
> > > > > > >         items:
> > > > > > >           - description: SPLIT Clock
> > > > > > 
> > > > > > That's at least confusing (granted that it works) - either
> > > > > > add a description for
> > > > > > each clock and then set `minItems: 1` (preferred), or remove
> > > > > > this "SPLIT Clock"
> > > > > > description and allow a maximum of 3 clocks.
> > > > > > 
> > > > > > Removing the description can be done - IMO - because "SPLIT
> > > > > > Clock" is, well,
> > > > > > saying that the SPLIT block gets a SPLIT clock ... stating
> > > > > > the obvious, anyway.
> > > > > 
> > > > > Right, but what are the other two new clocks? Are they as
> > > > > obvious?
> > > > > There's no clock-names here to give any more information as to
> > > > > what the
> > > > > other clocks are supposed to be.
> > > > > 
> > > > > Kinda unrelated, but I think that "SPLIT Clock" probably isn't
> > > > > what the
> > > > > name of the clock in the IP block is anyway, sounds more like
> > > > > the name
> > > > > for it on the provider end..
> > > > 
> > > > 
>  * Thanks for the suggestions. I think Moudy could help on the new
>    fixes
> > > > for both DT schem and mt8195.dtsi. This patch could be separated
> > > > from
> > > > origin patch set.
> > > 
> > > Not sure what you mean about separating it, if you mean correcting
> > > the
> > > description for the split clock sure. The other stuff I mentioned
> > > needs
> > > to be resolved before I'm willing to ack this.
> > 
> > He means separating this patch from the rest of the series that he
> > pushed - which
> > is okay, as it's a bit mixed anyway :-)
> > 
> > Besides ... Moudy, can you please help to clarify the description of
> > those clocks?
> 
> May I address the check error by adding 2 functional descriptions and
> specifying 'minIeims: 1' for this property, and apply the limit by
> setting 'maxItems: 3' in MT8195 additional condition?


That sounds reasonable
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 228 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-mediatek/attachments/20240928/53857981/attachment.sig>

From lkp at intel.com  Sat Sep 28 14:58:50 2024
From: lkp at intel.com (kernel test robot)
Date: Sun, 29 Sep 2024 05:58:50 +0800
Subject: [PATCH v5 2/2] drm/mediatek: Add blend_modes to mtk_plane_init()
 for different SoCs
In-Reply-To: <20240925101927.17042-3-jason-jh.lin@mediatek.com>
References: <20240925101927.17042-3-jason-jh.lin@mediatek.com>
Message-ID: <202409290726.oaatx2OR-lkp@intel.com>

Hi Jason-JH.Lin,

kernel test robot noticed the following build errors:

[auto build test ERROR on drm/drm-next]
[also build test ERROR on linus/master next-20240927]
[cannot apply to v6.11]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Jason-JH-Lin/drm-mediatek-ovl-Add-fmt_convert-function-pointer-to-driver-data/20240925-182056
base:   git://anongit.freedesktop.org/drm/drm drm-next
patch link:    https://lore.kernel.org/r/20240925101927.17042-3-jason-jh.lin%40mediatek.com
patch subject: [PATCH v5 2/2] drm/mediatek: Add blend_modes to mtk_plane_init() for different SoCs
config: arm-randconfig-002-20240929 (https://download.01.org/0day-ci/archive/20240929/202409290726.oaatx2OR-lkp at intel.com/config)
compiler: arm-linux-gnueabi-gcc (GCC) 14.1.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240929/202409290726.oaatx2OR-lkp at intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp at intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202409290726.oaatx2OR-lkp at intel.com/

All errors (new ones prefixed by >>):

   In file included from drivers/gpu/drm/mediatek/mtk_crtc.h:10,
                    from drivers/gpu/drm/mediatek/mtk_crtc.c:22:
>> drivers/gpu/drm/mediatek/mtk_ddp_comp.h:83:9: error: type qualifiers ignored on function return type [-Werror=ignored-qualifiers]
      83 |         const u32 (*get_blend_modes)(struct device *dev);
         |         ^~~~~
   drivers/gpu/drm/mediatek/mtk_ddp_comp.h:271:1: error: type qualifiers ignored on function return type [-Werror=ignored-qualifiers]
     271 | const u32 mtk_ddp_comp_get_blend_modes(struct mtk_ddp_comp *comp)
         | ^~~~~
   cc1: all warnings being treated as errors
--
   In file included from drivers/gpu/drm/mediatek/mtk_crtc.h:10,
                    from drivers/gpu/drm/mediatek/mtk_disp_color.c:13:
>> drivers/gpu/drm/mediatek/mtk_ddp_comp.h:83:9: error: type qualifiers ignored on function return type [-Werror=ignored-qualifiers]
      83 |         const u32 (*get_blend_modes)(struct device *dev);
         |         ^~~~~
   drivers/gpu/drm/mediatek/mtk_ddp_comp.h:271:1: error: type qualifiers ignored on function return type [-Werror=ignored-qualifiers]
     271 | const u32 mtk_ddp_comp_get_blend_modes(struct mtk_ddp_comp *comp)
         | ^~~~~
   In file included from drivers/gpu/drm/mediatek/mtk_disp_color.c:15:
>> drivers/gpu/drm/mediatek/mtk_disp_drv.h:106:1: error: type qualifiers ignored on function return type [-Werror=ignored-qualifiers]
     106 | const u32 mtk_ovl_get_blend_modes(struct device *dev);
         | ^~~~~
   drivers/gpu/drm/mediatek/mtk_disp_drv.h:135:1: error: type qualifiers ignored on function return type [-Werror=ignored-qualifiers]
     135 | const u32 mtk_ovl_adaptor_get_blend_modes(struct device *dev);
         | ^~~~~
   drivers/gpu/drm/mediatek/mtk_disp_drv.h:170:1: error: type qualifiers ignored on function return type [-Werror=ignored-qualifiers]
     170 | const u32 mtk_mdp_rdma_get_blend_modes(struct device *dev);
         | ^~~~~
   cc1: all warnings being treated as errors
--
   In file included from drivers/gpu/drm/mediatek/mtk_mdp_rdma.c:15:
>> drivers/gpu/drm/mediatek/mtk_disp_drv.h:106:1: error: type qualifiers ignored on function return type [-Werror=ignored-qualifiers]
     106 | const u32 mtk_ovl_get_blend_modes(struct device *dev);
         | ^~~~~
   drivers/gpu/drm/mediatek/mtk_disp_drv.h:135:1: error: type qualifiers ignored on function return type [-Werror=ignored-qualifiers]
     135 | const u32 mtk_ovl_adaptor_get_blend_modes(struct device *dev);
         | ^~~~~
   drivers/gpu/drm/mediatek/mtk_disp_drv.h:170:1: error: type qualifiers ignored on function return type [-Werror=ignored-qualifiers]
     170 | const u32 mtk_mdp_rdma_get_blend_modes(struct device *dev);
         | ^~~~~
   In file included from drivers/gpu/drm/mediatek/mtk_drm_drv.h:10,
                    from drivers/gpu/drm/mediatek/mtk_mdp_rdma.c:16:
>> drivers/gpu/drm/mediatek/mtk_ddp_comp.h:83:9: error: type qualifiers ignored on function return type [-Werror=ignored-qualifiers]
      83 |         const u32 (*get_blend_modes)(struct device *dev);
         |         ^~~~~
   drivers/gpu/drm/mediatek/mtk_ddp_comp.h:271:1: error: type qualifiers ignored on function return type [-Werror=ignored-qualifiers]
     271 | const u32 mtk_ddp_comp_get_blend_modes(struct mtk_ddp_comp *comp)
         | ^~~~~
>> drivers/gpu/drm/mediatek/mtk_mdp_rdma.c:236:1: error: type qualifiers ignored on function return type [-Werror=ignored-qualifiers]
     236 | const u32 mtk_mdp_rdma_get_blend_modes(struct device *dev)
         | ^~~~~
   cc1: all warnings being treated as errors
--
   In file included from drivers/gpu/drm/mediatek/mtk_crtc.h:10,
                    from drivers/gpu/drm/mediatek/mtk_disp_ovl.c:18:
>> drivers/gpu/drm/mediatek/mtk_ddp_comp.h:83:9: error: type qualifiers ignored on function return type [-Werror=ignored-qualifiers]
      83 |         const u32 (*get_blend_modes)(struct device *dev);
         |         ^~~~~
   drivers/gpu/drm/mediatek/mtk_ddp_comp.h:271:1: error: type qualifiers ignored on function return type [-Werror=ignored-qualifiers]
     271 | const u32 mtk_ddp_comp_get_blend_modes(struct mtk_ddp_comp *comp)
         | ^~~~~
   In file included from drivers/gpu/drm/mediatek/mtk_disp_ovl.c:20:
>> drivers/gpu/drm/mediatek/mtk_disp_drv.h:106:1: error: type qualifiers ignored on function return type [-Werror=ignored-qualifiers]
     106 | const u32 mtk_ovl_get_blend_modes(struct device *dev);
         | ^~~~~
   drivers/gpu/drm/mediatek/mtk_disp_drv.h:135:1: error: type qualifiers ignored on function return type [-Werror=ignored-qualifiers]
     135 | const u32 mtk_ovl_adaptor_get_blend_modes(struct device *dev);
         | ^~~~~
   drivers/gpu/drm/mediatek/mtk_disp_drv.h:170:1: error: type qualifiers ignored on function return type [-Werror=ignored-qualifiers]
     170 | const u32 mtk_mdp_rdma_get_blend_modes(struct device *dev);
         | ^~~~~
>> drivers/gpu/drm/mediatek/mtk_disp_ovl.c:219:1: error: type qualifiers ignored on function return type [-Werror=ignored-qualifiers]
     219 | const u32 mtk_ovl_get_blend_modes(struct device *dev)
         | ^~~~~
   cc1: all warnings being treated as errors
--
   In file included from drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c:20:
>> drivers/gpu/drm/mediatek/mtk_ddp_comp.h:83:9: error: type qualifiers ignored on function return type [-Werror=ignored-qualifiers]
      83 |         const u32 (*get_blend_modes)(struct device *dev);
         |         ^~~~~
   drivers/gpu/drm/mediatek/mtk_ddp_comp.h:271:1: error: type qualifiers ignored on function return type [-Werror=ignored-qualifiers]
     271 | const u32 mtk_ddp_comp_get_blend_modes(struct mtk_ddp_comp *comp)
         | ^~~~~
   In file included from drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c:21:
>> drivers/gpu/drm/mediatek/mtk_disp_drv.h:106:1: error: type qualifiers ignored on function return type [-Werror=ignored-qualifiers]
     106 | const u32 mtk_ovl_get_blend_modes(struct device *dev);
         | ^~~~~
   drivers/gpu/drm/mediatek/mtk_disp_drv.h:135:1: error: type qualifiers ignored on function return type [-Werror=ignored-qualifiers]
     135 | const u32 mtk_ovl_adaptor_get_blend_modes(struct device *dev);
         | ^~~~~
   drivers/gpu/drm/mediatek/mtk_disp_drv.h:170:1: error: type qualifiers ignored on function return type [-Werror=ignored-qualifiers]
     170 | const u32 mtk_mdp_rdma_get_blend_modes(struct device *dev);
         | ^~~~~
>> drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c:403:1: error: type qualifiers ignored on function return type [-Werror=ignored-qualifiers]
     403 | const u32 mtk_ovl_adaptor_get_blend_modes(struct device *dev)
         | ^~~~~
   cc1: all warnings being treated as errors


vim +83 drivers/gpu/drm/mediatek/mtk_ddp_comp.h

    48	
    49	struct mtk_ddp_comp;
    50	struct cmdq_pkt;
    51	struct mtk_ddp_comp_funcs {
    52		int (*power_on)(struct device *dev);
    53		void (*power_off)(struct device *dev);
    54		int (*clk_enable)(struct device *dev);
    55		void (*clk_disable)(struct device *dev);
    56		void (*config)(struct device *dev, unsigned int w,
    57			       unsigned int h, unsigned int vrefresh,
    58			       unsigned int bpc, struct cmdq_pkt *cmdq_pkt);
    59		void (*start)(struct device *dev);
    60		void (*stop)(struct device *dev);
    61		void (*register_vblank_cb)(struct device *dev,
    62					   void (*vblank_cb)(void *),
    63					   void *vblank_cb_data);
    64		void (*unregister_vblank_cb)(struct device *dev);
    65		void (*enable_vblank)(struct device *dev);
    66		void (*disable_vblank)(struct device *dev);
    67		unsigned int (*supported_rotations)(struct device *dev);
    68		unsigned int (*layer_nr)(struct device *dev);
    69		int (*layer_check)(struct device *dev,
    70				   unsigned int idx,
    71				   struct mtk_plane_state *state);
    72		void (*layer_config)(struct device *dev, unsigned int idx,
    73				     struct mtk_plane_state *state,
    74				     struct cmdq_pkt *cmdq_pkt);
    75		unsigned int (*gamma_get_lut_size)(struct device *dev);
    76		void (*gamma_set)(struct device *dev,
    77				  struct drm_crtc_state *state);
    78		void (*bgclr_in_on)(struct device *dev);
    79		void (*bgclr_in_off)(struct device *dev);
    80		void (*ctm_set)(struct device *dev,
    81				struct drm_crtc_state *state);
    82		struct device * (*dma_dev_get)(struct device *dev);
  > 83		const u32 (*get_blend_modes)(struct device *dev);
    84		const u32 *(*get_formats)(struct device *dev);
    85		size_t (*get_num_formats)(struct device *dev);
    86		void (*connect)(struct device *dev, struct device *mmsys_dev, unsigned int next);
    87		void (*disconnect)(struct device *dev, struct device *mmsys_dev, unsigned int next);
    88		void (*add)(struct device *dev, struct mtk_mutex *mutex);
    89		void (*remove)(struct device *dev, struct mtk_mutex *mutex);
    90		unsigned int (*encoder_index)(struct device *dev);
    91		enum drm_mode_status (*mode_valid)(struct device *dev, const struct drm_display_mode *mode);
    92	};
    93	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki


From lkp at intel.com  Sat Sep 28 15:20:02 2024
From: lkp at intel.com (kernel test robot)
Date: Sun, 29 Sep 2024 06:20:02 +0800
Subject: [PATCH v6 2/2] drm/mediatek: Add blend_modes to mtk_plane_init()
 for different SoCs
In-Reply-To: <20240926083526.24629-3-jason-jh.lin@mediatek.com>
References: <20240926083526.24629-3-jason-jh.lin@mediatek.com>
Message-ID: <202409290616.inw9UGyc-lkp@intel.com>

Hi Jason-JH.Lin,

kernel test robot noticed the following build errors:

[auto build test ERROR on drm/drm-next]
[also build test ERROR on linus/master next-20240927]
[cannot apply to v6.11]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Jason-JH-Lin/drm-mediatek-ovl-Add-blend_modes-to-driver-data/20240926-163734
base:   git://anongit.freedesktop.org/drm/drm drm-next
patch link:    https://lore.kernel.org/r/20240926083526.24629-3-jason-jh.lin%40mediatek.com
patch subject: [PATCH v6 2/2] drm/mediatek: Add blend_modes to mtk_plane_init() for different SoCs
config: arm-randconfig-002-20240929 (https://download.01.org/0day-ci/archive/20240929/202409290616.inw9UGyc-lkp at intel.com/config)
compiler: arm-linux-gnueabi-gcc (GCC) 14.1.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240929/202409290616.inw9UGyc-lkp at intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp at intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202409290616.inw9UGyc-lkp at intel.com/

All errors (new ones prefixed by >>):

   In file included from drivers/gpu/drm/mediatek/mtk_crtc.h:10,
                    from drivers/gpu/drm/mediatek/mtk_ethdr.c:18:
   drivers/gpu/drm/mediatek/mtk_ddp_comp.h:83:9: error: type qualifiers ignored on function return type [-Werror=ignored-qualifiers]
      83 |         const u32 (*get_blend_modes)(struct device *dev);
         |         ^~~~~
   drivers/gpu/drm/mediatek/mtk_ddp_comp.h:271:1: error: type qualifiers ignored on function return type [-Werror=ignored-qualifiers]
     271 | const u32 mtk_ddp_comp_get_blend_modes(struct mtk_ddp_comp *comp)
         | ^~~~~
   In file included from drivers/gpu/drm/mediatek/mtk_ethdr.c:21:
>> drivers/gpu/drm/mediatek/mtk_ethdr.h:16:1: error: type qualifiers ignored on function return type [-Werror=ignored-qualifiers]
      16 | const u32 mtk_ethdr_get_blend_modes(struct device *dev);
         | ^~~~~
>> drivers/gpu/drm/mediatek/mtk_ethdr.c:148:1: error: type qualifiers ignored on function return type [-Werror=ignored-qualifiers]
     148 | const u32 mtk_ethdr_get_blend_modes(struct device *dev)
         | ^~~~~
   cc1: all warnings being treated as errors
--
   In file included from drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c:20:
   drivers/gpu/drm/mediatek/mtk_ddp_comp.h:83:9: error: type qualifiers ignored on function return type [-Werror=ignored-qualifiers]
      83 |         const u32 (*get_blend_modes)(struct device *dev);
         |         ^~~~~
   drivers/gpu/drm/mediatek/mtk_ddp_comp.h:271:1: error: type qualifiers ignored on function return type [-Werror=ignored-qualifiers]
     271 | const u32 mtk_ddp_comp_get_blend_modes(struct mtk_ddp_comp *comp)
         | ^~~~~
   In file included from drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c:21:
   drivers/gpu/drm/mediatek/mtk_disp_drv.h:106:1: error: type qualifiers ignored on function return type [-Werror=ignored-qualifiers]
     106 | const u32 mtk_ovl_get_blend_modes(struct device *dev);
         | ^~~~~
   drivers/gpu/drm/mediatek/mtk_disp_drv.h:135:1: error: type qualifiers ignored on function return type [-Werror=ignored-qualifiers]
     135 | const u32 mtk_ovl_adaptor_get_blend_modes(struct device *dev);
         | ^~~~~
   In file included from drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c:23:
>> drivers/gpu/drm/mediatek/mtk_ethdr.h:16:1: error: type qualifiers ignored on function return type [-Werror=ignored-qualifiers]
      16 | const u32 mtk_ethdr_get_blend_modes(struct device *dev);
         | ^~~~~
   drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c:403:1: error: type qualifiers ignored on function return type [-Werror=ignored-qualifiers]
     403 | const u32 mtk_ovl_adaptor_get_blend_modes(struct device *dev)
         | ^~~~~
   cc1: all warnings being treated as errors


vim +16 drivers/gpu/drm/mediatek/mtk_ethdr.h

     8	
     9	void mtk_ethdr_start(struct device *dev);
    10	void mtk_ethdr_stop(struct device *dev);
    11	int mtk_ethdr_clk_enable(struct device *dev);
    12	void mtk_ethdr_clk_disable(struct device *dev);
    13	void mtk_ethdr_config(struct device *dev, unsigned int w,
    14			      unsigned int h, unsigned int vrefresh,
    15			      unsigned int bpc, struct cmdq_pkt *cmdq_pkt);
  > 16	const u32 mtk_ethdr_get_blend_modes(struct device *dev);

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki


From lkp at intel.com  Sat Sep 28 15:52:23 2024
From: lkp at intel.com (kernel test robot)
Date: Sun, 29 Sep 2024 06:52:23 +0800
Subject: [PATCH v6 2/2] drm/mediatek: Add blend_modes to mtk_plane_init()
 for different SoCs
In-Reply-To: <20240926083526.24629-3-jason-jh.lin@mediatek.com>
References: <20240926083526.24629-3-jason-jh.lin@mediatek.com>
Message-ID: <202409290651.YLKsl39c-lkp@intel.com>

Hi Jason-JH.Lin,

kernel test robot noticed the following build warnings:

[auto build test WARNING on drm/drm-next]
[also build test WARNING on linus/master next-20240927]
[cannot apply to v6.11]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Jason-JH-Lin/drm-mediatek-ovl-Add-blend_modes-to-driver-data/20240926-163734
base:   git://anongit.freedesktop.org/drm/drm drm-next
patch link:    https://lore.kernel.org/r/20240926083526.24629-3-jason-jh.lin%40mediatek.com
patch subject: [PATCH v6 2/2] drm/mediatek: Add blend_modes to mtk_plane_init() for different SoCs
config: arm64-randconfig-001-20240929 (https://download.01.org/0day-ci/archive/20240929/202409290651.YLKsl39c-lkp at intel.com/config)
compiler: clang version 20.0.0git (https://github.com/llvm/llvm-project 7773243d9916f98ba0ffce0c3a960e4aa9f03e81)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240929/202409290651.YLKsl39c-lkp at intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp at intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202409290651.YLKsl39c-lkp at intel.com/

All warnings (new ones prefixed by >>):

   In file included from drivers/gpu/drm/mediatek/mtk_ethdr.c:18:
   In file included from drivers/gpu/drm/mediatek/mtk_crtc.h:9:
   In file included from include/drm/drm_crtc.h:32:
   In file included from include/drm/drm_modes.h:33:
   In file included from include/drm/drm_connector.h:32:
   In file included from include/drm/drm_util.h:36:
   In file included from include/linux/kgdb.h:19:
   In file included from include/linux/kprobes.h:28:
   In file included from include/linux/ftrace.h:13:
   In file included from include/linux/kallsyms.h:13:
   In file included from include/linux/mm.h:2232:
   include/linux/vmstat.h:517:36: warning: arithmetic between different enumeration types ('enum node_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
     517 |         return node_stat_name(NR_LRU_BASE + lru) + 3; // skip "nr_"
         |                               ~~~~~~~~~~~ ^ ~~~
   In file included from drivers/gpu/drm/mediatek/mtk_ethdr.c:18:
   In file included from drivers/gpu/drm/mediatek/mtk_crtc.h:10:
   drivers/gpu/drm/mediatek/mtk_ddp_comp.h:83:2: warning: 'const' type qualifier on return type has no effect [-Wignored-qualifiers]
      83 |         const u32 (*get_blend_modes)(struct device *dev);
         |         ^~~~~
   drivers/gpu/drm/mediatek/mtk_ddp_comp.h:271:1: warning: 'const' type qualifier on return type has no effect [-Wignored-qualifiers]
     271 | const u32 mtk_ddp_comp_get_blend_modes(struct mtk_ddp_comp *comp)
         | ^~~~~
   In file included from drivers/gpu/drm/mediatek/mtk_ethdr.c:21:
>> drivers/gpu/drm/mediatek/mtk_ethdr.h:16:1: warning: 'const' type qualifier on return type has no effect [-Wignored-qualifiers]
      16 | const u32 mtk_ethdr_get_blend_modes(struct device *dev);
         | ^~~~~
>> drivers/gpu/drm/mediatek/mtk_ethdr.c:148:1: warning: 'const' type qualifier on return type has no effect [-Wignored-qualifiers]
     148 | const u32 mtk_ethdr_get_blend_modes(struct device *dev)
         | ^~~~~
   5 warnings generated.
--
   In file included from drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c:7:
   In file included from include/drm/drm_of.h:8:
   In file included from include/drm/drm_bridge.h:30:
   In file included from include/drm/drm_atomic.h:31:
   In file included from include/drm/drm_crtc.h:32:
   In file included from include/drm/drm_modes.h:33:
   In file included from include/drm/drm_connector.h:32:
   In file included from include/drm/drm_util.h:36:
   In file included from include/linux/kgdb.h:19:
   In file included from include/linux/kprobes.h:28:
   In file included from include/linux/ftrace.h:13:
   In file included from include/linux/kallsyms.h:13:
   In file included from include/linux/mm.h:2232:
   include/linux/vmstat.h:517:36: warning: arithmetic between different enumeration types ('enum node_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
     517 |         return node_stat_name(NR_LRU_BASE + lru) + 3; // skip "nr_"
         |                               ~~~~~~~~~~~ ^ ~~~
   In file included from drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c:20:
   drivers/gpu/drm/mediatek/mtk_ddp_comp.h:83:2: warning: 'const' type qualifier on return type has no effect [-Wignored-qualifiers]
      83 |         const u32 (*get_blend_modes)(struct device *dev);
         |         ^~~~~
   drivers/gpu/drm/mediatek/mtk_ddp_comp.h:271:1: warning: 'const' type qualifier on return type has no effect [-Wignored-qualifiers]
     271 | const u32 mtk_ddp_comp_get_blend_modes(struct mtk_ddp_comp *comp)
         | ^~~~~
   In file included from drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c:21:
   drivers/gpu/drm/mediatek/mtk_disp_drv.h:106:1: warning: 'const' type qualifier on return type has no effect [-Wignored-qualifiers]
     106 | const u32 mtk_ovl_get_blend_modes(struct device *dev);
         | ^~~~~
   drivers/gpu/drm/mediatek/mtk_disp_drv.h:135:1: warning: 'const' type qualifier on return type has no effect [-Wignored-qualifiers]
     135 | const u32 mtk_ovl_adaptor_get_blend_modes(struct device *dev);
         | ^~~~~
   In file included from drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c:23:
>> drivers/gpu/drm/mediatek/mtk_ethdr.h:16:1: warning: 'const' type qualifier on return type has no effect [-Wignored-qualifiers]
      16 | const u32 mtk_ethdr_get_blend_modes(struct device *dev);
         | ^~~~~
   drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c:403:1: warning: 'const' type qualifier on return type has no effect [-Wignored-qualifiers]
     403 | const u32 mtk_ovl_adaptor_get_blend_modes(struct device *dev)
         | ^~~~~
   7 warnings generated.


vim +/const +16 drivers/gpu/drm/mediatek/mtk_ethdr.h

     8	
     9	void mtk_ethdr_start(struct device *dev);
    10	void mtk_ethdr_stop(struct device *dev);
    11	int mtk_ethdr_clk_enable(struct device *dev);
    12	void mtk_ethdr_clk_disable(struct device *dev);
    13	void mtk_ethdr_config(struct device *dev, unsigned int w,
    14			      unsigned int h, unsigned int vrefresh,
    15			      unsigned int bpc, struct cmdq_pkt *cmdq_pkt);
  > 16	const u32 mtk_ethdr_get_blend_modes(struct device *dev);

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki


From linyunsheng at huawei.com  Sat Sep 28 19:44:53 2024
From: linyunsheng at huawei.com (Yunsheng Lin)
Date: Sun, 29 Sep 2024 10:44:53 +0800
Subject: [PATCH net v2 2/2] page_pool: fix IOMMU crash when driver has
 already unbound
In-Reply-To: <CAC_iWjL7m4ZL2W2OZM5F22dLvZhxU6fyCXV_xjyGf+W7UP43EQ@mail.gmail.com>
References: <20240925075707.3970187-1-linyunsheng@huawei.com>
 <20240925075707.3970187-3-linyunsheng@huawei.com>
 <CAHS8izOxugzWJDTc-4CWqaKABTj=J4OHs=Lcb=SE9r8gX0J+yg@mail.gmail.com>
 <842c8cc6-f716-437a-bc98-70bc26d6fd38@huawei.com>
 <CAC_iWjLgNOtsbhqrhvvEz2C3S668qB8KatL_W+tPHMSkDrNS=w@mail.gmail.com>
 <0ef315df-e8e9-41e8-9ba8-dcb69492c616@huawei.com>
 <CAC_iWjKeajwn3otjdEekE6VDLHGEvqmnQRwpN5R3yHj8UpEiDw@mail.gmail.com>
 <934d601f-be43-4e04-b126-dc86890a4bfa@huawei.com>
 <CAC_iWjL7m4ZL2W2OZM5F22dLvZhxU6fyCXV_xjyGf+W7UP43EQ@mail.gmail.com>
Message-ID: <ac2eec69-8f44-4adb-8182-02c78625851d@huawei.com>

On 2024/9/28 15:34, Ilias Apalodimas wrote:

...

> 
> Yes, that wasn't very clear indeed, apologies for any confusion. I was
> trying to ask on a linked list that only lives in struct page_pool.
> But I now realize this was a bad idea since the lookup would be way
> slower.
> 
>> If I understand question correctly, the single/doubly linked list
>> is more costly than array as the page_pool case as my understanding.
>>
>> For single linked list, it doesn't allow deleting a specific entry but
>> only support deleting the first entry and all the entries. It does support
>> lockless operation using llist, but have limitation as below:
>> https://elixir.bootlin.com/linux/v6.7-rc8/source/include/linux/llist.h#L13
>>
>> For doubly linked list, it needs two pointer to support deleting a specific
>> entry and it does not support lockless operation.
> 
> I didn't look at the patch too carefully at first. Looking a bit
> closer now, the array is indeed better, since the lookup is faster.
> You just need the stored index in struct page to find the page we need
> to unmap. Do you remember if we can reduce the atomic pp_ref_count to
> 32bits? If so we can reuse that space for the index. Looking at it

For 64 bits system, yes, we can reuse that.
But for 32 bits system, we may have only 16 bits for each of them, and it
seems that there is no atomic operation for variable that is less than 32
bits.

> requires a bit more work in netmem, but that's mostly swapping all the
> atomic64 calls to atomic ones.
> 
>>
>> For pool->items, as the alloc side is protected by NAPI context, and the
>> free side use item->pp_idx to ensure there is only one producer for each
>> item, which means for each item in pool->items, there is only one consumer
>> and one producer, which seems much like the case when the page is not
>> recyclable in __page_pool_put_page, we don't need a lock protection when
>> calling page_pool_return_page(), the 'struct page' is also one consumer
>> and one producer as the pool->items[item->pp_idx] does:
>> https://elixir.bootlin.com/linux/v6.7-rc8/source/net/core/page_pool.c#L645
>>
>> We only need a lock protection when page_pool_destroy() is called to
>> check if there is inflight page to be unmapped as a consumer, and the
>> __page_pool_put_page() may also called to unmapped the inflight page as
>> another consumer,
> 
> Thanks for the explanation. On the locking side, page_pool_destroy is
> called once from the driver and then it's either the workqueue for
> inflight packets or an SKB that got freed and tried to recycle right?
> But do we still need to do all the unmapping etc from the delayed
> work? Since the new function will unmap all packets in
> page_pool_destroy, we can just skip unmapping when the delayed work
> runs

Yes, the pool->dma_map is clear in page_pool_item_uninit() after it does
the unmapping for all inflight pages with the protection of pool->destroy_lock,
so that the unmapping is skipped in page_pool_return_page() when those inflight
pages are returned back to page_pool.

> 


From wangyuli at uniontech.com  Sat Sep 28 23:36:19 2024
From: wangyuli at uniontech.com (WangYuli)
Date: Sun, 29 Sep 2024 14:36:19 +0800
Subject: [PATCH] mt76: mt76u_vendor_request: Do not print error messages when -EPROTO
Message-ID: <B74B0BCDDB8EFA12+20240929063619.925099-1-wangyuli@uniontech.com>

When initializing the network card, unplugging the device will
trigger an -EPROTO error, resulting in a flood of error messages
being printed frantically.

Signed-off-by: Xu Rao <raoxu at uniontech.com>
Signed-off-by: WangYuli <wangyuli at uniontech.com>
---
 drivers/net/wireless/mediatek/mt76/usb.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/net/wireless/mediatek/mt76/usb.c b/drivers/net/wireless/mediatek/mt76/usb.c
index 58ff06823389..f9e67b8c3b3c 100644
--- a/drivers/net/wireless/mediatek/mt76/usb.c
+++ b/drivers/net/wireless/mediatek/mt76/usb.c
@@ -33,9 +33,9 @@ int __mt76u_vendor_request(struct mt76_dev *dev, u8 req, u8 req_type,
 
 		ret = usb_control_msg(udev, pipe, req, req_type, val,
 				      offset, buf, len, MT_VEND_REQ_TOUT_MS);
-		if (ret == -ENODEV)
+		if (ret == -ENODEV || ret == -EPROTO)
 			set_bit(MT76_REMOVED, &dev->phy.state);
-		if (ret >= 0 || ret == -ENODEV)
+		if (ret >= 0 || ret == -ENODEV || ret == -EPROTO)
 			return ret;
 		usleep_range(5000, 10000);
 	}
-- 
2.45.2



From Andy-ld.Lu at mediatek.com  Sat Sep 28 22:44:03 2024
From: Andy-ld.Lu at mediatek.com (=?utf-8?B?QW5keS1sZCBMdSAo5Y2i5LicKQ==?=)
Date: Sun, 29 Sep 2024 05:44:03 +0000
Subject: [PATCH 2/2] dt-bindings: mmc: mtk-sd: Add support for MT8196
In-Reply-To: <20240926-footprint-faster-4263120d0b83@spud>
References: <20240926070405.20212-1-andy-ld.lu@mediatek.com>
	 <20240926070405.20212-3-andy-ld.lu@mediatek.com>
	 <20240926-footprint-faster-4263120d0b83@spud>
Message-ID: <ebc787cfb5c89588deeb219190e4fbc4f3f90436.camel@mediatek.com>

On Thu, 2024-09-26 at 17:13 +0100, Conor Dooley wrote:
> On Thu, Sep 26, 2024 at 03:03:18PM +0800, Andy-ld Lu wrote:
> > Extend the devicetree bindings to include the MT8196 mmc controller
> > by adding the compatible string 'mediatek,msdc-v2', which could be
> > also used for future compatible SoCs that support new tx/rx.
> > 
> > Add three properties for MT8196 settings:
> > - 'mediatek,prohibit-gate-cg', indicate if the source clock CG
> > could
> >   be disabled when CPU access IP registers.
> > 
> > - 'mediatek,stop-dly-sel', configure read data clock stops at block
> > gap.
> > 
> > - 'mediatek,pop-en-cnt', configure the margins of write and read
> >   pointers while begin to pop data transfer.
> > 
> > Signed-off-by: Andy-ld Lu <andy-ld.lu at mediatek.com>
> > ---
> >  .../devicetree/bindings/mmc/mtk-sd.yaml       | 26
> > +++++++++++++++++++
> >  1 file changed, 26 insertions(+)
> > 
> > diff --git a/Documentation/devicetree/bindings/mmc/mtk-sd.yaml
> > b/Documentation/devicetree/bindings/mmc/mtk-sd.yaml
> > index c532ec92d2d9..82d1a9fac67c 100644
> > --- a/Documentation/devicetree/bindings/mmc/mtk-sd.yaml
> > +++ b/Documentation/devicetree/bindings/mmc/mtk-sd.yaml
> > @@ -25,6 +25,7 @@ properties:
> >            - mediatek,mt8173-mmc
> >            - mediatek,mt8183-mmc
> >            - mediatek,mt8516-mmc
> > +          - mediatek,msdc-v2
> >        - items:
> >            - const: mediatek,mt7623-mmc
> >            - const: mediatek,mt2701-mmc
> > @@ -154,6 +155,30 @@ properties:
> >      enum: [32, 64]
> >      default: 32
> >  
> > +  mediatek,stop-dly-sel:
> > +    $ref: /schemas/types.yaml#/definitions/uint32
> > +    description:
> > +      Some SoCs need to set appropriate stop-dly-sel to configure
> > read data clock
> > +      stops at block gap. The valid range is from 0 to 0xf.
> 
> If you used a specific compatible for these devices, which you
> should,
> you would not require either this or "pop-en-cnt".

Thanks for your review.

I will follow your comment in next change.

> 
> > +    minimum: 0
> > +    maximum: 0xf
> > +
> > +  mediatek,pop-en-cnt:
> > +    $ref: /schemas/types.yaml#/definitions/uint32
> > +    description:
> > +      Some SoCs need to set appropriate pop-en-cnt to configure
> > the margins of write
> > +      and read pointers while begin to pop data transfer. The
> > valid range is from 0
> > +      to 0xf.
> > +    minimum: 0
> > +    maximum: 0xf
> > +
> > +  mediatek,prohibit-gate-cg:
> 
> This is also probably detectable from a specific compatible, if you
> had
> one?
> TL;DR specific compatibles please, non of this "msdc-v2" stuff,
> sorry.
> 
> Thanks,
> Conor.

I will follow your comment in next change.

> 
> > +    $ref: /schemas/types.yaml#/definitions/flag
> > +    description:
> > +      Decide if source clock CG could be disabled when CPU access
> > IP registers.
> > +      If present, source clock CG could not be disabled.
> > +      If not present, source clock CG could be disabled.
> > +
> >    resets:
> >      maxItems: 1
> >  
> > @@ -191,6 +216,7 @@ allOf:
> >              - mediatek,mt8188-mmc
> >              - mediatek,mt8195-mmc
> >              - mediatek,mt8516-mmc
> > +            - mediatek,msdc-v2
> >      then:
> >        properties:
> >          clocks:
> > -- 
> > 2.46.0
> > 
> > 

From Andy-ld.Lu at mediatek.com  Sat Sep 28 22:50:40 2024
From: Andy-ld.Lu at mediatek.com (=?utf-8?B?QW5keS1sZCBMdSAo5Y2i5LicKQ==?=)
Date: Sun, 29 Sep 2024 05:50:40 +0000
Subject: [PATCH 2/2] dt-bindings: mmc: mtk-sd: Add support for MT8196
In-Reply-To: <30e4735e-bf50-440c-8ad1-6bcf8b8bd930@kernel.org>
References: <20240926070405.20212-1-andy-ld.lu@mediatek.com>
	 <20240926070405.20212-3-andy-ld.lu@mediatek.com>
	 <20240926175409.GA2644361-robh@kernel.org>
	 <10ce6e9af6daa69735f46b45028ec1b2d25ee66a.camel@mediatek.com>
	 <30e4735e-bf50-440c-8ad1-6bcf8b8bd930@kernel.org>
Message-ID: <0736d8a7584b1c3cf3847e138ebff1c1b4f47dc7.camel@mediatek.com>

On Sat, 2024-09-28 at 15:39 +0200, Krzysztof Kozlowski wrote:
>  	 
> External email : Please do not click links or open attachments until
> you have verified the sender or the content.
>  On 28/09/2024 15:14, Andy-ld Lu (??) wrote:
> > On Thu, 2024-09-26 at 12:54 -0500, Rob Herring wrote:
> >>   
> >> External email : Please do not click links or open attachments
> until
> >> you have verified the sender or the content.
> >>  On Thu, Sep 26, 2024 at 03:03:18PM +0800, Andy-ld Lu wrote:
> >>> Extend the devicetree bindings to include the MT8196 mmc
> controller
> >>> by adding the compatible string 'mediatek,msdc-v2', which could
> be
> >>> also used for future compatible SoCs that support new tx/rx.
> >>
> >> Generally, every SoC ends up changing at least slightly. So we
> don't
> >> do 
> >> version numbers except when there's a well defined versioning
> scheme
> >> of 
> >> the h/w (e.g. FPGA IP blocks). So, use SoC for compatible string.
> > Thanks for your review.
> > 
> > The new tx/rx represents a significant update for mmc controller of
> > mediatek from the MT8196 chipset, and the dependent settings remain
> > consistent for MT8196 and subsequent SoCs. Therefore, It is
> proposed to
> > use a unified compatible string for these SoCs that support new
> tx/rx,
> > and name it as 'IP(msdc) version two'.
> 
> Sorry, nope. That's not valid reasons.

Thanks for your review.

I will follow your comment in next change.

> 
> >>
> >>>
> >>> Add three properties for MT8196 settings:
> >>> - 'mediatek,prohibit-gate-cg', indicate if the source clock CG
> >> could
> >>>   be disabled when CPU access IP registers.
> >>>
> >>> - 'mediatek,stop-dly-sel', configure read data clock stops at
> block
> >> gap.
> >>>
> >>> - 'mediatek,pop-en-cnt', configure the margins of write and read
> >>>   pointers while begin to pop data transfer.
> >>>
> >>> Signed-off-by: Andy-ld Lu <andy-ld.lu at mediatek.com>
> >>> ---
> >>>  .../devicetree/bindings/mmc/mtk-sd.yaml       | 26
> >> +++++++++++++++++++
> >>>  1 file changed, 26 insertions(+)
> >>>
> >>> diff --git a/Documentation/devicetree/bindings/mmc/mtk-sd.yaml
> >> b/Documentation/devicetree/bindings/mmc/mtk-sd.yaml
> >>> index c532ec92d2d9..82d1a9fac67c 100644
> >>> --- a/Documentation/devicetree/bindings/mmc/mtk-sd.yaml
> >>> +++ b/Documentation/devicetree/bindings/mmc/mtk-sd.yaml
> >>> @@ -25,6 +25,7 @@ properties:
> >>>            - mediatek,mt8173-mmc
> >>>            - mediatek,mt8183-mmc
> >>>            - mediatek,mt8516-mmc
> >>> +          - mediatek,msdc-v2
> >>>        - items:
> >>>            - const: mediatek,mt7623-mmc
> >>>            - const: mediatek,mt2701-mmc
> >>> @@ -154,6 +155,30 @@ properties:
> >>>      enum: [32, 64]
> >>>      default: 32
> >>>  
> >>> +  mediatek,stop-dly-sel:
> >>> +    $ref: /schemas/types.yaml#/definitions/uint32
> >>> +    description:
> >>> +      Some SoCs need to set appropriate stop-dly-sel to
> configure
> >> read data clock
> >>> +      stops at block gap. The valid range is from 0 to 0xf.
> >>
> >> SoC dependent or board dependent? Imply from the compatible for
> the 
> >> former. A property is fine for the latter case.
> > Yes, it is SoC dependent in principle, but we would like to use a
> > unified compatible string for MT8196 and subsequent SoCs as
> mentioned
> 
> Also no :(. Use SoC specific compatible.

I will follow your comment in next change.

> 
> > above, and this register setting(not relavant with new tx/rx) may
> be
> > variant. Therefore, want to use the property of device tree to set
> > individually.
> >>
> >>> +    minimum: 0
> >>> +    maximum: 0xf
> >>> +
> >>> +  mediatek,pop-en-cnt:
> >>> +    $ref: /schemas/types.yaml#/definitions/uint32
> >>> +    description:
> >>> +      Some SoCs need to set appropriate pop-en-cnt to configure
> >> the margins of write
> >>> +      and read pointers while begin to pop data transfer. The
> >> valid range is from 0
> >>> +      to 0xf.
> >>> +    minimum: 0
> >>> +    maximum: 0xf
> >>
> >> Same question.
> > Same as the reply above.
> >>
> >>> +
> >>> +  mediatek,prohibit-gate-cg:
> >>> +    $ref: /schemas/types.yaml#/definitions/flag
> >>> +    description:
> >>> +      Decide if source clock CG could be disabled when CPU
> access
> >> IP registers.
> >>> +      If present, source clock CG could not be disabled.
> >>> +      If not present, source clock CG could be disabled.
> >>
> >>
> >> Sounds like you need to describe the clock in "clocks".
> > It is not with clock itself, but rather with the bus design that
> would
> > check the 'source_cg' status bit to decide whether to prevent the
> CPU
> > from accessing the IP registers. And there have been no changes to
> the
> > 'source_cg'(already been descirbed before) for MT8196.
> 
> I don't understand why do you need this property if it was already
> described. Please do not describe things twice.

I will follow your comment in next change.

> 
> 
> Best regards,
> Krzysztof
> 

From andy-ld.lu at mediatek.com  Sun Sep 29 00:44:04 2024
From: andy-ld.lu at mediatek.com (Andy-ld Lu)
Date: Sun, 29 Sep 2024 15:44:04 +0800
Subject: [PATCH v2 0/2] Add mtk-sd support for MT8196
Message-ID: <20240929074558.2076-1-andy-ld.lu@mediatek.com>

There are some new features for Mediatek SoC MT8196, which include new
command/data transmitting and receiving path (abbreviated as tx/rx), and
two modified register settings.

The driver code has to be adapted to implement the above changes, and the
compatible string 'mediatek,mt8196-mmc' is added to driver and devicetree
bindings.

---
Changes in v2:
- Use compatible string 'mediatek,mt8196-mmc' to replace 'mediatek,msdc-v2';
- Remove the 'mediatek,stop-dly-sel', 'mediatek,pop-en-cnt' and 'mediatek,
  prohibit-gate-cg' in devicetree bindings, due to SoC dependent;
- Add 'stop_dly_sel' and 'pop_en_cnt' to the compatiblity structure for
  different register settings;
- The SoC's upgraded version would discard the bus design that detect source
  clock CG when the CPU access the IP registers, so drop the related control
  flow with 'prohibit_gate_cg' flag.

Link to v1:
https://patchwork.kernel.org/patch/13812924

---
Andy-ld Lu (2):
  mmc: mtk-sd: Add support for MT8196
  dt-bindings: mmc: mtk-sd: Add support for MT8196

 .../devicetree/bindings/mmc/mtk-sd.yaml       |   2 +
 drivers/mmc/host/mtk-sd.c                     | 162 +++++++++++++++---
 2 files changed, 143 insertions(+), 21 deletions(-)

-- 
2.46.0



From andy-ld.lu at mediatek.com  Sun Sep 29 00:44:05 2024
From: andy-ld.lu at mediatek.com (Andy-ld Lu)
Date: Sun, 29 Sep 2024 15:44:05 +0800
Subject: [PATCH v2 1/2] mmc: mtk-sd: Add support for MT8196
In-Reply-To: <20240929074558.2076-1-andy-ld.lu@mediatek.com>
References: <20240929074558.2076-1-andy-ld.lu@mediatek.com>
Message-ID: <20240929074558.2076-2-andy-ld.lu@mediatek.com>

Mediatek SoC MT8196 features a new design for tx/rx path. The new tx
path incorporates register settings that are closely associated with
bus timing. And the difference between new rx path and older versions
is the usage of distinct register bits when setting the data sampling
edge as part of the tuning process.

Besides, there are modified register settings for STOP_DLY_SEL and
POP_EN_CNT, with two new fields added to the compatibility structure
to reflect the modifications.

For the changes mentioned in relation to the MT8196, the new compatible
string 'mediatek,mt8196-mmc' is introduced. This is to accommodate
different settings and workflows specific to the MT8196.

Signed-off-by: Andy-ld Lu <andy-ld.lu at mediatek.com>
---
 drivers/mmc/host/mtk-sd.c | 162 +++++++++++++++++++++++++++++++++-----
 1 file changed, 141 insertions(+), 21 deletions(-)

diff --git a/drivers/mmc/host/mtk-sd.c b/drivers/mmc/host/mtk-sd.c
index 89018b6c97b9..4254b3012aeb 100644
--- a/drivers/mmc/host/mtk-sd.c
+++ b/drivers/mmc/host/mtk-sd.c
@@ -65,6 +65,7 @@
 #define SDC_RESP3        0x4c
 #define SDC_BLK_NUM      0x50
 #define SDC_ADV_CFG0     0x64
+#define MSDC_NEW_RX_CFG  0x68
 #define EMMC_IOCON       0x7c
 #define SDC_ACMD_RESP    0x80
 #define DMA_SA_H4BIT     0x8c
@@ -91,6 +92,7 @@
 #define EMMC_TOP_CONTROL	0x00
 #define EMMC_TOP_CMD		0x04
 #define EMMC50_PAD_DS_TUNE	0x0c
+#define LOOP_TEST_CONTROL	0x30
 
 /*--------------------------------------------------------------------------*/
 /* Register Mask                                                            */
@@ -202,9 +204,13 @@
 #define SDC_STS_CMDBUSY         BIT(1)	/* RW */
 #define SDC_STS_SWR_COMPL       BIT(31)	/* RW */
 
-#define SDC_DAT1_IRQ_TRIGGER	BIT(19)	/* RW */
 /* SDC_ADV_CFG0 mask */
+#define SDC_DAT1_IRQ_TRIGGER	BIT(19)	/* RW */
 #define SDC_RX_ENHANCE_EN	BIT(20)	/* RW */
+#define SDC_NEW_TX_EN		BIT(31)	/* RW */
+
+/* MSDC_NEW_RX_CFG mask */
+#define MSDC_NEW_RX_PATH_SEL	BIT(0)	/* RW */
 
 /* DMA_SA_H4BIT mask */
 #define DMA_ADDR_HIGH_4BIT      GENMASK(3, 0)	/* RW */
@@ -226,6 +232,7 @@
 
 /* MSDC_PATCH_BIT mask */
 #define MSDC_PATCH_BIT_ODDSUPP    BIT(1)	/* RW */
+#define MSDC_PATCH_BIT_RD_DAT_SEL BIT(3)	/* RW */
 #define MSDC_INT_DAT_LATCH_CK_SEL GENMASK(9, 7)
 #define MSDC_CKGEN_MSDC_DLY_SEL   GENMASK(14, 10)
 #define MSDC_PATCH_BIT_IODSSEL    BIT(16)	/* RW */
@@ -247,6 +254,8 @@
 #define MSDC_PB2_SUPPORT_64G      BIT(1)    /* RW */
 #define MSDC_PB2_RESPWAIT         GENMASK(3, 2)   /* RW */
 #define MSDC_PB2_RESPSTSENSEL     GENMASK(18, 16) /* RW */
+#define MSDC_PB2_POP_EN_CNT       GENMASK(23, 20) /* RW */
+#define MSDC_PB2_CFGCRCSTSEDGE    BIT(25)   /* RW */
 #define MSDC_PB2_CRCSTSENSEL      GENMASK(31, 29) /* RW */
 
 #define MSDC_PAD_TUNE_DATWRDLY	  GENMASK(4, 0)		/* RW */
@@ -311,6 +320,12 @@
 #define PAD_DS_DLY1		GENMASK(14, 10)	/* RW */
 #define PAD_DS_DLY3		GENMASK(4, 0)	/* RW */
 
+/* LOOP_TEST_CONTROL mask */
+#define TEST_LOOP_DSCLK_MUX_SEL        BIT(0)	/* RW */
+#define TEST_LOOP_LATCH_MUX_SEL        BIT(1)	/* RW */
+#define LOOP_EN_SEL_CLK                BIT(20)	/* RW */
+#define TEST_HS400_CMD_LOOP_MUX_SEL    BIT(31)	/* RW */
+
 #define REQ_CMD_EIO  BIT(0)
 #define REQ_CMD_TMO  BIT(1)
 #define REQ_DAT_ERR  BIT(2)
@@ -391,6 +406,7 @@ struct msdc_save_para {
 	u32 emmc_top_control;
 	u32 emmc_top_cmd;
 	u32 emmc50_pad_ds_tune;
+	u32 loop_test_control;
 };
 
 struct mtk_mmc_compatible {
@@ -402,9 +418,13 @@ struct mtk_mmc_compatible {
 	bool data_tune;
 	bool busy_check;
 	bool stop_clk_fix;
+	u8 stop_dly_sel;
+	u8 pop_en_cnt;
 	bool enhance_rx;
 	bool support_64g;
 	bool use_internal_cd;
+	bool support_new_tx;
+	bool support_new_rx;
 };
 
 struct msdc_tune_para {
@@ -621,6 +641,23 @@ static const struct mtk_mmc_compatible mt8516_compat = {
 	.stop_clk_fix = true,
 };
 
+static const struct mtk_mmc_compatible mt8196_compat = {
+	.clk_div_bits = 12,
+	.recheck_sdio_irq = false,
+	.hs400_tune = false,
+	.pad_tune_reg = MSDC_PAD_TUNE0,
+	.async_fifo = true,
+	.data_tune = true,
+	.busy_check = true,
+	.stop_clk_fix = true,
+	.stop_dly_sel = 1,
+	.pop_en_cnt = 2,
+	.enhance_rx = true,
+	.support_64g = true,
+	.support_new_tx = true,
+	.support_new_rx = true,
+};
+
 static const struct of_device_id msdc_of_ids[] = {
 	{ .compatible = "mediatek,mt2701-mmc", .data = &mt2701_compat},
 	{ .compatible = "mediatek,mt2712-mmc", .data = &mt2712_compat},
@@ -632,6 +669,7 @@ static const struct of_device_id msdc_of_ids[] = {
 	{ .compatible = "mediatek,mt8135-mmc", .data = &mt8135_compat},
 	{ .compatible = "mediatek,mt8173-mmc", .data = &mt8173_compat},
 	{ .compatible = "mediatek,mt8183-mmc", .data = &mt8183_compat},
+	{ .compatible = "mediatek,mt8196-mmc", .data = &mt8196_compat},
 	{ .compatible = "mediatek,mt8516-mmc", .data = &mt8516_compat},
 
 	{}
@@ -872,6 +910,42 @@ static int msdc_ungate_clock(struct msdc_host *host)
 				  (val & MSDC_CFG_CKSTB), 1, 20000);
 }
 
+static void msdc_new_tx_setting(struct msdc_host *host)
+{
+	if (host->top_base) {
+		sdr_set_bits(host->top_base + LOOP_TEST_CONTROL,
+			     TEST_LOOP_DSCLK_MUX_SEL);
+		sdr_set_bits(host->top_base + LOOP_TEST_CONTROL,
+			     TEST_LOOP_LATCH_MUX_SEL);
+		sdr_clr_bits(host->top_base + LOOP_TEST_CONTROL,
+			     TEST_HS400_CMD_LOOP_MUX_SEL);
+	}
+
+	switch (host->timing) {
+	case MMC_TIMING_LEGACY:
+	case MMC_TIMING_MMC_HS:
+	case MMC_TIMING_SD_HS:
+	case MMC_TIMING_UHS_SDR12:
+	case MMC_TIMING_UHS_SDR25:
+	case MMC_TIMING_UHS_DDR50:
+	case MMC_TIMING_MMC_DDR52:
+		if (host->top_base)
+			sdr_clr_bits(host->top_base + LOOP_TEST_CONTROL,
+				     LOOP_EN_SEL_CLK);
+		break;
+	case MMC_TIMING_UHS_SDR50:
+	case MMC_TIMING_UHS_SDR104:
+	case MMC_TIMING_MMC_HS200:
+	case MMC_TIMING_MMC_HS400:
+		if (host->top_base)
+			sdr_set_bits(host->top_base + LOOP_TEST_CONTROL,
+				     LOOP_EN_SEL_CLK);
+		break;
+	default:
+		break;
+	}
+}
+
 static void msdc_set_mclk(struct msdc_host *host, unsigned char timing, u32 hz)
 {
 	struct mmc_host *mmc = mmc_from_priv(host);
@@ -881,6 +955,7 @@ static void msdc_set_mclk(struct msdc_host *host, unsigned char timing, u32 hz)
 	u32 sclk;
 	u32 tune_reg = host->dev_comp->pad_tune_reg;
 	u32 val;
+	bool timing_changed = false;
 
 	if (!hz) {
 		dev_dbg(host->dev, "set mclk to 0\n");
@@ -890,6 +965,9 @@ static void msdc_set_mclk(struct msdc_host *host, unsigned char timing, u32 hz)
 		return;
 	}
 
+	if (host->timing != timing)
+		timing_changed = true;
+
 	flags = readl(host->base + MSDC_INTEN);
 	sdr_clr_bits(host->base + MSDC_INTEN, flags);
 	if (host->dev_comp->clk_div_bits == 8)
@@ -996,6 +1074,9 @@ static void msdc_set_mclk(struct msdc_host *host, unsigned char timing, u32 hz)
 		sdr_set_field(host->base + tune_reg,
 			      MSDC_PAD_TUNE_CMDRRDLY,
 			      host->hs400_cmd_int_delay);
+	if (timing_changed && host->dev_comp->support_new_tx)
+		msdc_new_tx_setting(host);
+
 	dev_dbg(host->dev, "sclk: %d, timing: %d\n", mmc->actual_clock,
 		timing);
 }
@@ -1704,6 +1785,17 @@ static void msdc_init_hw(struct msdc_host *host)
 		reset_control_deassert(host->reset);
 	}
 
+	/* New tx/rx enable bit need to be 0->1 for hardware check */
+	if (host->dev_comp->support_new_tx) {
+		sdr_clr_bits(host->base + SDC_ADV_CFG0, SDC_NEW_TX_EN);
+		sdr_set_bits(host->base + SDC_ADV_CFG0, SDC_NEW_TX_EN);
+		msdc_new_tx_setting(host);
+	}
+	if (host->dev_comp->support_new_rx) {
+		sdr_clr_bits(host->base + MSDC_NEW_RX_CFG, MSDC_NEW_RX_PATH_SEL);
+		sdr_set_bits(host->base + MSDC_NEW_RX_CFG, MSDC_NEW_RX_PATH_SEL);
+	}
+
 	/* Configure to MMC/SD mode, clock free running */
 	sdr_set_bits(host->base + MSDC_CFG, MSDC_CFG_MODE | MSDC_CFG_CKPDN);
 
@@ -1742,8 +1834,19 @@ static void msdc_init_hw(struct msdc_host *host)
 	sdr_set_bits(host->base + EMMC50_CFG0, EMMC50_CFG_CFCSTS_SEL);
 
 	if (host->dev_comp->stop_clk_fix) {
-		sdr_set_field(host->base + MSDC_PATCH_BIT1,
-			      MSDC_PATCH_BIT1_STOP_DLY, 3);
+		if (host->dev_comp->stop_dly_sel)
+			sdr_set_field(host->base + MSDC_PATCH_BIT1,
+				      MSDC_PATCH_BIT1_STOP_DLY,
+				      host->dev_comp->stop_dly_sel & 0xf);
+		else
+			sdr_set_field(host->base + MSDC_PATCH_BIT1,
+				      MSDC_PATCH_BIT1_STOP_DLY, 3);
+
+		if (host->dev_comp->pop_en_cnt)
+			sdr_set_field(host->base + MSDC_PATCH_BIT2,
+				      MSDC_PB2_POP_EN_CNT,
+				      host->dev_comp->pop_en_cnt & 0xf);
+
 		sdr_clr_bits(host->base + SDC_FIFO_CFG,
 			     SDC_FIFO_CFG_WRVALIDSEL);
 		sdr_clr_bits(host->base + SDC_FIFO_CFG,
@@ -2055,6 +2158,19 @@ static inline void msdc_set_data_delay(struct msdc_host *host, u32 value)
 	}
 }
 
+static inline void msdc_set_data_sample_edge(struct msdc_host *host, bool rising)
+{
+	u32 value = rising ? 0 : 1;
+
+	if (host->dev_comp->support_new_rx) {
+		sdr_set_field(host->base + MSDC_PATCH_BIT, MSDC_PATCH_BIT_RD_DAT_SEL, value);
+		sdr_set_field(host->base + MSDC_PATCH_BIT2, MSDC_PB2_CFGCRCSTSEDGE, value);
+	} else {
+		sdr_set_field(host->base + MSDC_IOCON, MSDC_IOCON_DSPL, value);
+		sdr_set_field(host->base + MSDC_IOCON, MSDC_IOCON_W_DSPL, value);
+	}
+}
+
 static int msdc_tune_response(struct mmc_host *mmc, u32 opcode)
 {
 	struct msdc_host *host = mmc_priv(mmc);
@@ -2210,8 +2326,7 @@ static int msdc_tune_data(struct mmc_host *mmc, u32 opcode)
 
 	sdr_set_field(host->base + MSDC_PATCH_BIT, MSDC_INT_DAT_LATCH_CK_SEL,
 		      host->latch_ck);
-	sdr_clr_bits(host->base + MSDC_IOCON, MSDC_IOCON_DSPL);
-	sdr_clr_bits(host->base + MSDC_IOCON, MSDC_IOCON_W_DSPL);
+	msdc_set_data_sample_edge(host, true);
 	for (i = 0; i < host->tuning_step; i++) {
 		msdc_set_data_delay(host, i);
 		ret = mmc_send_tuning(mmc, opcode, NULL);
@@ -2224,8 +2339,7 @@ static int msdc_tune_data(struct mmc_host *mmc, u32 opcode)
 	    (final_rise_delay.start == 0 && final_rise_delay.maxlen >= 4))
 		goto skip_fall;
 
-	sdr_set_bits(host->base + MSDC_IOCON, MSDC_IOCON_DSPL);
-	sdr_set_bits(host->base + MSDC_IOCON, MSDC_IOCON_W_DSPL);
+	msdc_set_data_sample_edge(host, false);
 	for (i = 0; i < host->tuning_step; i++) {
 		msdc_set_data_delay(host, i);
 		ret = mmc_send_tuning(mmc, opcode, NULL);
@@ -2237,12 +2351,10 @@ static int msdc_tune_data(struct mmc_host *mmc, u32 opcode)
 skip_fall:
 	final_maxlen = max(final_rise_delay.maxlen, final_fall_delay.maxlen);
 	if (final_maxlen == final_rise_delay.maxlen) {
-		sdr_clr_bits(host->base + MSDC_IOCON, MSDC_IOCON_DSPL);
-		sdr_clr_bits(host->base + MSDC_IOCON, MSDC_IOCON_W_DSPL);
+		msdc_set_data_sample_edge(host, true);
 		final_delay = final_rise_delay.final_phase;
 	} else {
-		sdr_set_bits(host->base + MSDC_IOCON, MSDC_IOCON_DSPL);
-		sdr_set_bits(host->base + MSDC_IOCON, MSDC_IOCON_W_DSPL);
+		msdc_set_data_sample_edge(host, false);
 		final_delay = final_fall_delay.final_phase;
 	}
 	msdc_set_data_delay(host, final_delay);
@@ -2267,8 +2379,7 @@ static int msdc_tune_together(struct mmc_host *mmc, u32 opcode)
 		      host->latch_ck);
 
 	sdr_clr_bits(host->base + MSDC_IOCON, MSDC_IOCON_RSPL);
-	sdr_clr_bits(host->base + MSDC_IOCON,
-		     MSDC_IOCON_DSPL | MSDC_IOCON_W_DSPL);
+	msdc_set_data_sample_edge(host, true);
 	for (i = 0; i < host->tuning_step; i++) {
 		msdc_set_cmd_delay(host, i);
 		msdc_set_data_delay(host, i);
@@ -2283,8 +2394,7 @@ static int msdc_tune_together(struct mmc_host *mmc, u32 opcode)
 		goto skip_fall;
 
 	sdr_set_bits(host->base + MSDC_IOCON, MSDC_IOCON_RSPL);
-	sdr_set_bits(host->base + MSDC_IOCON,
-		     MSDC_IOCON_DSPL | MSDC_IOCON_W_DSPL);
+	msdc_set_data_sample_edge(host, false);
 	for (i = 0; i < host->tuning_step; i++) {
 		msdc_set_cmd_delay(host, i);
 		msdc_set_data_delay(host, i);
@@ -2298,13 +2408,11 @@ static int msdc_tune_together(struct mmc_host *mmc, u32 opcode)
 	final_maxlen = max(final_rise_delay.maxlen, final_fall_delay.maxlen);
 	if (final_maxlen == final_rise_delay.maxlen) {
 		sdr_clr_bits(host->base + MSDC_IOCON, MSDC_IOCON_RSPL);
-		sdr_clr_bits(host->base + MSDC_IOCON,
-			     MSDC_IOCON_DSPL | MSDC_IOCON_W_DSPL);
+		msdc_set_data_sample_edge(host, true);
 		final_delay = final_rise_delay.final_phase;
 	} else {
 		sdr_set_bits(host->base + MSDC_IOCON, MSDC_IOCON_RSPL);
-		sdr_set_bits(host->base + MSDC_IOCON,
-			     MSDC_IOCON_DSPL | MSDC_IOCON_W_DSPL);
+		msdc_set_data_sample_edge(host, false);
 		final_delay = final_fall_delay.final_phase;
 	}
 
@@ -2324,8 +2432,7 @@ static int msdc_execute_tuning(struct mmc_host *mmc, u32 opcode)
 	if (host->dev_comp->data_tune && host->dev_comp->async_fifo) {
 		ret = msdc_tune_together(mmc, opcode);
 		if (host->hs400_mode) {
-			sdr_clr_bits(host->base + MSDC_IOCON,
-				     MSDC_IOCON_DSPL | MSDC_IOCON_W_DSPL);
+			msdc_set_data_sample_edge(host, true);
 			msdc_set_data_delay(host, 0);
 		}
 		goto tune_done;
@@ -2995,6 +3102,8 @@ static void msdc_save_reg(struct msdc_host *host)
 			readl(host->top_base + EMMC_TOP_CMD);
 		host->save_para.emmc50_pad_ds_tune =
 			readl(host->top_base + EMMC50_PAD_DS_TUNE);
+		host->save_para.loop_test_control =
+			readl(host->top_base + LOOP_TEST_CONTROL);
 	} else {
 		host->save_para.pad_tune = readl(host->base + tune_reg);
 	}
@@ -3005,6 +3114,15 @@ static void msdc_restore_reg(struct msdc_host *host)
 	struct mmc_host *mmc = mmc_from_priv(host);
 	u32 tune_reg = host->dev_comp->pad_tune_reg;
 
+	if (host->dev_comp->support_new_tx) {
+		sdr_clr_bits(host->base + SDC_ADV_CFG0, SDC_NEW_TX_EN);
+		sdr_set_bits(host->base + SDC_ADV_CFG0, SDC_NEW_TX_EN);
+	}
+	if (host->dev_comp->support_new_rx) {
+		sdr_clr_bits(host->base + MSDC_NEW_RX_CFG, MSDC_NEW_RX_PATH_SEL);
+		sdr_set_bits(host->base + MSDC_NEW_RX_CFG, MSDC_NEW_RX_PATH_SEL);
+	}
+
 	writel(host->save_para.msdc_cfg, host->base + MSDC_CFG);
 	writel(host->save_para.iocon, host->base + MSDC_IOCON);
 	writel(host->save_para.sdc_cfg, host->base + SDC_CFG);
@@ -3023,6 +3141,8 @@ static void msdc_restore_reg(struct msdc_host *host)
 		       host->top_base + EMMC_TOP_CMD);
 		writel(host->save_para.emmc50_pad_ds_tune,
 		       host->top_base + EMMC50_PAD_DS_TUNE);
+		writel(host->save_para.loop_test_control,
+		       host->top_base + LOOP_TEST_CONTROL);
 	} else {
 		writel(host->save_para.pad_tune, host->base + tune_reg);
 	}
-- 
2.46.0



From andy-ld.lu at mediatek.com  Sun Sep 29 00:44:06 2024
From: andy-ld.lu at mediatek.com (Andy-ld Lu)
Date: Sun, 29 Sep 2024 15:44:06 +0800
Subject: [PATCH v2 2/2] dt-bindings: mmc: mtk-sd: Add support for MT8196
In-Reply-To: <20240929074558.2076-1-andy-ld.lu@mediatek.com>
References: <20240929074558.2076-1-andy-ld.lu@mediatek.com>
Message-ID: <20240929074558.2076-3-andy-ld.lu@mediatek.com>

Extend the devicetree bindings to include the MT8196 mmc controller
by adding the compatible string 'mediatek,mt8196-mmc'.

Signed-off-by: Andy-ld Lu <andy-ld.lu at mediatek.com>
---
 Documentation/devicetree/bindings/mmc/mtk-sd.yaml | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/Documentation/devicetree/bindings/mmc/mtk-sd.yaml b/Documentation/devicetree/bindings/mmc/mtk-sd.yaml
index c532ec92d2d9..9281a0326891 100644
--- a/Documentation/devicetree/bindings/mmc/mtk-sd.yaml
+++ b/Documentation/devicetree/bindings/mmc/mtk-sd.yaml
@@ -24,6 +24,7 @@ properties:
           - mediatek,mt8135-mmc
           - mediatek,mt8173-mmc
           - mediatek,mt8183-mmc
+          - mediatek,mt8196-mmc
           - mediatek,mt8516-mmc
       - items:
           - const: mediatek,mt7623-mmc
@@ -190,6 +191,7 @@ allOf:
             - mediatek,mt8186-mmc
             - mediatek,mt8188-mmc
             - mediatek,mt8195-mmc
+            - mediatek,mt8196-mmc
             - mediatek,mt8516-mmc
     then:
       properties:
-- 
2.46.0



From wangyuli at uniontech.com  Sun Sep 29 00:48:52 2024
From: wangyuli at uniontech.com (WangYuli)
Date: Sun, 29 Sep 2024 15:48:52 +0800
Subject: [RESEND. PATCH v2] Bluetooth: btusb: Add MT7925 support for ID 0x13d3:0x3608
Message-ID: <34A24B6870318797+20240929074852.977045-1-wangyuli@uniontech.com>

From: F?lix Jara <hello at felixjara.me>

Add compatibility Bluetooth device MT7925 for Asus UM5606 with
ID 13d3:3608.

The device info from /sys/kernel/debug/usb/devices as below.

T:  Bus=03 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#=  2 Spd=480  MxCh= 0
D:  Ver= 2.10 Cls=ef(misc ) Sub=02 Prot=01 MxPS=64 #Cfgs=  1
P:  Vendor=13d3 ProdID=3608 Rev= 1.00
S:  Manufacturer=MediaTek Inc.
S:  Product=Wireless_Device
S:  SerialNumber=000000000
C:* #Ifs= 3 Cfg#= 1 Atr=e0 MxPwr=100mA
A:  FirstIf#= 0 IfCount= 3 Cls=e0(wlcon) Sub=01 Prot=01
I:* If#= 0 Alt= 0 #EPs= 3 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
E:  Ad=81(I) Atr=03(Int.) MxPS=  16 Ivl=125us
E:  Ad=82(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
I:* If#= 1 Alt= 0 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
E:  Ad=83(I) Atr=01(Isoc) MxPS=   0 Ivl=1ms
E:  Ad=03(O) Atr=01(Isoc) MxPS=   0 Ivl=1ms
I:  If#= 1 Alt= 1 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
E:  Ad=83(I) Atr=01(Isoc) MxPS=   9 Ivl=1ms
E:  Ad=03(O) Atr=01(Isoc) MxPS=   9 Ivl=1ms
I:  If#= 1 Alt= 2 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
E:  Ad=83(I) Atr=01(Isoc) MxPS=  17 Ivl=1ms
E:  Ad=03(O) Atr=01(Isoc) MxPS=  17 Ivl=1ms
I:  If#= 1 Alt= 3 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
E:  Ad=83(I) Atr=01(Isoc) MxPS=  25 Ivl=1ms
E:  Ad=03(O) Atr=01(Isoc) MxPS=  25 Ivl=1ms
I:  If#= 1 Alt= 4 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
E:  Ad=83(I) Atr=01(Isoc) MxPS=  33 Ivl=1ms
E:  Ad=03(O) Atr=01(Isoc) MxPS=  33 Ivl=1ms
I:  If#= 1 Alt= 5 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
E:  Ad=83(I) Atr=01(Isoc) MxPS=  49 Ivl=1ms
E:  Ad=03(O) Atr=01(Isoc) MxPS=  49 Ivl=1ms
I:  If#= 1 Alt= 6 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
E:  Ad=83(I) Atr=01(Isoc) MxPS=  63 Ivl=1ms
E:  Ad=03(O) Atr=01(Isoc) MxPS=  63 Ivl=1ms
I:* If#= 2 Alt= 0 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=(none)
E:  Ad=8a(I) Atr=03(Int.) MxPS=  64 Ivl=125us
E:  Ad=0a(O) Atr=03(Int.) MxPS=  64 Ivl=125us
I:  If#= 2 Alt= 1 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=(none)
E:  Ad=8a(I) Atr=03(Int.) MxPS= 512 Ivl=125us
E:  Ad=0a(O) Atr=03(Int.) MxPS= 512 Ivl=125us

Tested in Asus Zenbook S 16 UM5606XA

Co-developed-by: F?lix Jara <hello at felixjara.me>
Signed-off-by: F?lix Jara <hello at felixjara.me>
Tested-by: F?lix Jara <hello at felixjara.me>
Link: https://github.com/openSUSE/kernel/pull/10
Signed-off-by: WangYuli <wangyuli at uniontech.com>
---
 drivers/bluetooth/btusb.c | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
index cd22b34542d5..4adae0be8222 100644
--- a/drivers/bluetooth/btusb.c
+++ b/drivers/bluetooth/btusb.c
@@ -512,6 +512,11 @@ static const struct usb_device_id blacklist_table[] = {
 						     BTUSB_WIDEBAND_SPEECH |
 						     BTUSB_VALID_LE_STATES },
 
+	/* MediaTek MT7925 Bluetooth devices */
+	{ USB_DEVICE(0x13d3, 0x3608), .driver_info = BTUSB_MEDIATEK |
+						     BTUSB_WIDEBAND_SPEECH |
+						     BTUSB_VALID_LE_STATES },
+
 	/* Additional Realtek 8723AE Bluetooth devices */
 	{ USB_DEVICE(0x0930, 0x021d), .driver_info = BTUSB_REALTEK },
 	{ USB_DEVICE(0x13d3, 0x3394), .driver_info = BTUSB_REALTEK },
-- 
2.45.2



From wangyuli at uniontech.com  Sun Sep 29 01:24:16 2024
From: wangyuli at uniontech.com (WangYuli)
Date: Sun, 29 Sep 2024 16:24:16 +0800
Subject: [RESEND.,v2] Bluetooth: btusb: Add MT7925 support for ID
 0x13d3:0x3608
In-Reply-To: <66f90d4b.170a0220.288304.076c@mx.google.com>
References: <34A24B6870318797+20240929074852.977045-1-wangyuli@uniontech.com>
 <66f90d4b.170a0220.288304.076c@mx.google.com>
Message-ID: <20E3795420C6CF06+ececafaf-0a3b-4e3c-a56e-448f50c537c6@uniontech.com>

Could anyone shed some light on what's going on here?

I'm absolutely certain this patch can be merged directly into the 
bluetooth-next branch of the bluetooth-next repository 
(git://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth-next.git).

Am I missing something,or is there a problem with the bot?

--

WangYuli

-------------- next part --------------
A non-text attachment was scrubbed...
Name: OpenPGP_0xC5DA1F3046F40BEE.asc
Type: application/pgp-keys
Size: 632 bytes
Desc: OpenPGP public key
URL: <http://lists.infradead.org/pipermail/linux-mediatek/attachments/20240929/4b1411f2/attachment.bin>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: OpenPGP_signature.asc
Type: application/pgp-signature
Size: 236 bytes
Desc: OpenPGP digital signature
URL: <http://lists.infradead.org/pipermail/linux-mediatek/attachments/20240929/4b1411f2/attachment.sig>

From yanzhen at vivo.com  Sun Sep 29 01:57:27 2024
From: yanzhen at vivo.com (Yan Zhen)
Date: Sun, 29 Sep 2024 16:57:27 +0800
Subject: [PATCH v1] bluetooth: Fix typos in the comments
Message-ID: <20240929085727.523732-1-yanzhen@vivo.com>

Correctly spelled comments make it easier for the reader to understand
the code.

Fix typos:
'fragement' ==> 'fragment',
'genration' ==> 'generation',
'funciton' ==> 'function',
'Explitly' ==> 'Explicitly',
'explaination' ==> 'explanation',
'Tranlate' ==> 'Translate',
'immediatelly' ==> 'immediately',
'isntance' ==> 'instance',
'transmittion' ==> 'transmission',
'recevie' ==> 'receive',
'outselves' ==> 'ourselves',
'conrol' ==> 'control'.

Signed-off-by: Yan Zhen <yanzhen at vivo.com>
---
 drivers/bluetooth/btintel.c   | 4 ++--
 drivers/bluetooth/btmtk.c     | 2 +-
 drivers/bluetooth/btmtksdio.c | 4 ++--
 drivers/bluetooth/btmtkuart.c | 2 +-
 drivers/bluetooth/btusb.c     | 2 +-
 drivers/bluetooth/hci_ldisc.c | 2 +-
 drivers/bluetooth/hci_ll.c    | 2 +-
 drivers/bluetooth/hci_nokia.c | 2 +-
 drivers/bluetooth/hci_qca.c   | 8 ++++----
 9 files changed, 14 insertions(+), 14 deletions(-)

diff --git a/drivers/bluetooth/btintel.c b/drivers/bluetooth/btintel.c
index 1ccbb5157515..a6a125935cb3 100644
--- a/drivers/bluetooth/btintel.c
+++ b/drivers/bluetooth/btintel.c
@@ -1040,7 +1040,7 @@ static int btintel_download_firmware_payload(struct hci_dev *hdev,
 		 * as needed.
 		 *
 		 * Send set of commands with 4 byte alignment from the
-		 * firmware data buffer as a single Data fragement.
+		 * firmware data buffer as a single Data fragment.
 		 */
 		if (!(frag_len % 4)) {
 			err = btintel_secure_send(hdev, 0x01, frag_len, fw_ptr);
@@ -2835,7 +2835,7 @@ void btintel_set_msft_opcode(struct hci_dev *hdev, u8 hw_variant)
 	case 0x12:	/* ThP */
 	case 0x13:	/* HrP */
 	case 0x14:	/* CcP */
-	/* All Intel new genration controllers support the Microsoft vendor
+	/* All Intel new generation controllers support the Microsoft vendor
 	 * extension are using 0xFC1E for VsMsftOpCode.
 	 */
 	case 0x17:
diff --git a/drivers/bluetooth/btmtk.c b/drivers/bluetooth/btmtk.c
index 2b7c80043aa2..964911bce528 100644
--- a/drivers/bluetooth/btmtk.c
+++ b/drivers/bluetooth/btmtk.c
@@ -324,7 +324,7 @@ int btmtk_setup_firmware(struct hci_dev *hdev, const char *fwname,
 	wmt_params.data = NULL;
 	wmt_params.status = NULL;
 
-	/* Activate funciton the firmware providing to */
+	/* Activate function the firmware providing to */
 	err = wmt_cmd_sync(hdev, &wmt_params);
 	if (err < 0) {
 		bt_dev_err(hdev, "Failed to send wmt rst (%d)", err);
diff --git a/drivers/bluetooth/btmtksdio.c b/drivers/bluetooth/btmtksdio.c
index 497e4c87f5be..781a1a86b8a2 100644
--- a/drivers/bluetooth/btmtksdio.c
+++ b/drivers/bluetooth/btmtksdio.c
@@ -681,7 +681,7 @@ static int btmtksdio_open(struct hci_dev *hdev)
 	if (err < 0)
 		goto err_release_irq;
 
-	/* Explitly set write-1-clear method */
+	/* Explicitly set write-1-clear method */
 	val = sdio_readl(bdev->func, MTK_REG_CHCR, &err);
 	if (err < 0)
 		goto err_release_irq;
@@ -1396,7 +1396,7 @@ static int btmtksdio_probe(struct sdio_func *func,
 	if (pm_runtime_enabled(bdev->dev))
 		pm_runtime_disable(bdev->dev);
 
-	/* As explaination in drivers/mmc/core/sdio_bus.c tells us:
+	/* As explanation in drivers/mmc/core/sdio_bus.c tells us:
 	 * Unbound SDIO functions are always suspended.
 	 * During probe, the function is set active and the usage count
 	 * is incremented.  If the driver supports runtime PM,
diff --git a/drivers/bluetooth/btmtkuart.c b/drivers/bluetooth/btmtkuart.c
index aa87c3e78871..f4ae9e5ea09e 100644
--- a/drivers/bluetooth/btmtkuart.c
+++ b/drivers/bluetooth/btmtkuart.c
@@ -327,7 +327,7 @@ mtk_stp_split(struct btmtkuart_dev *bdev, const unsigned char *data, int count,
 	if (count <= 0)
 		return NULL;
 
-	/* Tranlate to how much the size of data H4 can handle so far */
+	/* Translate to how much the size of data H4 can handle so far */
 	*sz_h4 = min_t(int, count, bdev->stp_dlen);
 
 	/* Update the remaining size of STP packet */
diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
index c5f7dd65617e..65404642a373 100644
--- a/drivers/bluetooth/btusb.c
+++ b/drivers/bluetooth/btusb.c
@@ -1070,7 +1070,7 @@ static inline void btusb_free_frags(struct btusb_data *data)
 static int btusb_recv_event(struct btusb_data *data, struct sk_buff *skb)
 {
 	if (data->intr_interval) {
-		/* Trigger dequeue immediatelly if an event is received */
+		/* Trigger dequeue immediately if an event is received */
 		schedule_delayed_work(&data->rx_work, 0);
 	}
 
diff --git a/drivers/bluetooth/hci_ldisc.c b/drivers/bluetooth/hci_ldisc.c
index 395d66e32a2e..d2d6ba8d2f8b 100644
--- a/drivers/bluetooth/hci_ldisc.c
+++ b/drivers/bluetooth/hci_ldisc.c
@@ -594,7 +594,7 @@ static void hci_uart_tty_wakeup(struct tty_struct *tty)
  *     Called by tty low level driver when receive data is
  *     available.
  *
- * Arguments:  tty          pointer to tty isntance data
+ * Arguments:  tty          pointer to tty instance data
  *             data         pointer to received data
  *             flags        pointer to flags for data
  *             count        count of received data in bytes
diff --git a/drivers/bluetooth/hci_ll.c b/drivers/bluetooth/hci_ll.c
index 4a0b5c3160c2..e19e9bd49555 100644
--- a/drivers/bluetooth/hci_ll.c
+++ b/drivers/bluetooth/hci_ll.c
@@ -305,7 +305,7 @@ static void ll_device_woke_up(struct hci_uart *hu)
 	hci_uart_tx_wakeup(hu);
 }
 
-/* Enqueue frame for transmittion (padding, crc, etc) */
+/* Enqueue frame for transmission (padding, crc, etc) */
 /* may be called from two simultaneous tasklets */
 static int ll_enqueue(struct hci_uart *hu, struct sk_buff *skb)
 {
diff --git a/drivers/bluetooth/hci_nokia.c b/drivers/bluetooth/hci_nokia.c
index 62633d9ba7c4..312da01e91d0 100644
--- a/drivers/bluetooth/hci_nokia.c
+++ b/drivers/bluetooth/hci_nokia.c
@@ -501,7 +501,7 @@ static int nokia_close(struct hci_uart *hu)
 	return 0;
 }
 
-/* Enqueue frame for transmittion (padding, crc, etc) */
+/* Enqueue frame for transmission (padding, crc, etc) */
 static int nokia_enqueue(struct hci_uart *hu, struct sk_buff *skb)
 {
 	struct nokia_bt_dev *btdev = hu->priv;
diff --git a/drivers/bluetooth/hci_qca.c b/drivers/bluetooth/hci_qca.c
index 678f150229e7..1086ef2c71ea 100644
--- a/drivers/bluetooth/hci_qca.c
+++ b/drivers/bluetooth/hci_qca.c
@@ -873,7 +873,7 @@ static void device_woke_up(struct hci_uart *hu)
 	hci_uart_tx_wakeup(hu);
 }
 
-/* Enqueue frame for transmittion (padding, crc, etc) may be called from
+/* Enqueue frame for transmission (padding, crc, etc) may be called from
  * two simultaneous tasklets.
  */
 static int qca_enqueue(struct hci_uart *hu, struct sk_buff *skb)
@@ -1059,7 +1059,7 @@ static void qca_controller_memdump(struct work_struct *work)
 		if (!seq_no) {
 
 			/* This is the first frame of memdump packet from
-			 * the controller, Disable IBS to recevie dump
+			 * the controller, Disable IBS to receive dump
 			 * with out any interruption, ideally time required for
 			 * the controller to send the dump is 8 seconds. let us
 			 * start timer to handle this asynchronous activity.
@@ -2358,7 +2358,7 @@ static int qca_serdev_probe(struct serdev_device *serdev)
 			 * Backward compatibility with old DT sources. If the
 			 * node doesn't have the 'enable-gpios' property then
 			 * let's use the power sequencer. Otherwise, let's
-			 * drive everything outselves.
+			 * drive everything ourselves.
 			 */
 			qcadev->bt_power->pwrseq = devm_pwrseq_get(&serdev->dev,
 								   "bluetooth");
@@ -2530,7 +2530,7 @@ static void qca_serdev_shutdown(struct device *dev)
 		    hci_dev_test_flag(hdev, HCI_SETUP))
 			return;
 
-		/* The serdev must be in open state when conrol logic arrives
+		/* The serdev must be in open state when control logic arrives
 		 * here, so also fix the use-after-free issue caused by that
 		 * the serdev is flushed or wrote after it is closed.
 		 */
-- 
2.34.1



From yujiaoliang at vivo.com  Sun Sep 29 03:09:31 2024
From: yujiaoliang at vivo.com (Yu Jiaoliang)
Date: Sun, 29 Sep 2024 18:09:31 +0800
Subject: [PATCH v1] serial: 8250: Fix typos in comments across various files
Message-ID: <20240929100931.530620-1-yujiaoliang@vivo.com>

This patch fixes several typos in the comments within the tty/8250
directory to improve readability and code documentation.

Detected using codespell.

Signed-off-by: Yu Jiaoliang <yujiaoliang at vivo.com>
---
 drivers/tty/serial/8250/8250_bcm7271.c | 2 +-
 drivers/tty/serial/8250/8250_exar.c    | 4 ++--
 drivers/tty/serial/8250/8250_fintek.c  | 2 +-
 drivers/tty/serial/8250/8250_mtk.c     | 4 ++--
 drivers/tty/serial/8250/8250_omap.c    | 4 ++--
 5 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/drivers/tty/serial/8250/8250_bcm7271.c b/drivers/tty/serial/8250/8250_bcm7271.c
index 2569ca69223f..431d560375d2 100644
--- a/drivers/tty/serial/8250/8250_bcm7271.c
+++ b/drivers/tty/serial/8250/8250_bcm7271.c
@@ -812,7 +812,7 @@ static int brcmuart_handle_irq(struct uart_port *p)
 			/*
 			 * if Receive Data Interrupt is enabled and
 			 * we're uing hardware flow control, deassert
-			 * RTS and wait for any chars in the pipline to
+			 * RTS and wait for any chars in the pipeline to
 			 * arrive and then check for DR again.
 			 */
 			if ((ier & UART_IER_RDI) && (up->mcr & UART_MCR_AFE)) {
diff --git a/drivers/tty/serial/8250/8250_exar.c b/drivers/tty/serial/8250/8250_exar.c
index b7a75db15249..5f8933537728 100644
--- a/drivers/tty/serial/8250/8250_exar.c
+++ b/drivers/tty/serial/8250/8250_exar.c
@@ -360,7 +360,7 @@ static u16 exar_ee_read(struct exar8250 *priv, u8 ee_addr)
  * @priv: Device's private structure
  * @mpio_num: MPIO number/offset to configure
  *
- * Configure a single MPIO as an output and disable tristate. It is reccomended
+ * Configure a single MPIO as an output and disable tristate. It is recommended
  * to set the level with exar_mpio_set_high()/exar_mpio_set_low() prior to
  * calling this function to ensure default MPIO pin state.
  *
@@ -516,7 +516,7 @@ static int xr17v35x_startup(struct uart_port *port)
 	serial_port_out(port, UART_XR_EFR, UART_EFR_ECB);
 
 	/*
-	 * Make sure all interrups are masked until initialization is
+	 * Make sure all interrupts are masked until initialization is
 	 * complete and the FIFOs are cleared
 	 *
 	 * Synchronize UART_IER access against the console.
diff --git a/drivers/tty/serial/8250/8250_fintek.c b/drivers/tty/serial/8250/8250_fintek.c
index e2aa2a1a02dd..f59c01f48480 100644
--- a/drivers/tty/serial/8250/8250_fintek.c
+++ b/drivers/tty/serial/8250/8250_fintek.c
@@ -125,7 +125,7 @@ static int fintek_8250_enter_key(u16 base_port, u8 key)
 	if (!request_muxed_region(base_port, 2, "8250_fintek"))
 		return -EBUSY;
 
-	/* Force to deactive all SuperIO in this base_port */
+	/* Force to deactivate all SuperIO in this base_port */
 	outb(EXIT_KEY, base_port + ADDR_PORT);
 
 	outb(key, base_port + ADDR_PORT);
diff --git a/drivers/tty/serial/8250/8250_mtk.c b/drivers/tty/serial/8250/8250_mtk.c
index b9cca210e171..2b8e6bfc7d81 100644
--- a/drivers/tty/serial/8250/8250_mtk.c
+++ b/drivers/tty/serial/8250/8250_mtk.c
@@ -346,8 +346,8 @@ mtk8250_set_termios(struct uart_port *port, struct ktermios *termios,
 	/*
 	 * Mediatek UARTs use an extra highspeed register (MTK_UART_HIGHS)
 	 *
-	 * We need to recalcualte the quot register, as the claculation depends
-	 * on the vaule in the highspeed register.
+	 * We need to recalculate the quot register, as the calculation depends
+	 * on the value in the highspeed register.
 	 *
 	 * Some baudrates are not supported by the chip, so we use the next
 	 * lower rate supported and update termios c_flag.
diff --git a/drivers/tty/serial/8250/8250_omap.c b/drivers/tty/serial/8250/8250_omap.c
index 88b58f44e4e9..f967d09482d5 100644
--- a/drivers/tty/serial/8250/8250_omap.c
+++ b/drivers/tty/serial/8250/8250_omap.c
@@ -1304,7 +1304,7 @@ static void am654_8250_handle_rx_dma(struct uart_8250_port *up, u8 iir,
 
 /*
  * This is mostly serial8250_handle_irq(). We have a slightly different DMA
- * hoook for RX/TX and need different logic for them in the ISR. Therefore we
+ * hook for RX/TX and need different logic for them in the ISR. Therefore we
  * use the default routine in the non-DMA case and this one for with DMA.
  */
 static int omap_8250_dma_handle_irq(struct uart_port *port)
@@ -1338,7 +1338,7 @@ static int omap_8250_dma_handle_irq(struct uart_port *port)
 			serial8250_tx_chars(up);
 		} else  {
 			/*
-			 * try again due to an earlier failer which
+			 * try again due to an earlier failure which
 			 * might have been resolved by now.
 			 */
 			if (omap_8250_tx_dma(up))
-- 
2.34.1



From jic23 at kernel.org  Sun Sep 29 09:48:45 2024
From: jic23 at kernel.org (Jonathan Cameron)
Date: Sun, 29 Sep 2024 17:48:45 +0100
Subject: [PATCH] iio: adc: mt6360-adc: Converted to use
 get_unaligned_be16()
In-Reply-To: <20240928161108.163647-1-abhashkumarjha123@gmail.com>
References: <20240928161108.163647-1-abhashkumarjha123@gmail.com>
Message-ID: <20240929174845.5bac3f62@jic23-huawei>

On Sat, 28 Sep 2024 21:41:08 +0530
Abhash Jha <abhashkumarjha123 at gmail.com> wrote:

> Changed the manual shifting and adding of bytes to use
> get_unaligned_be16() api instead.
> 
> Signed-off-by: Abhash Jha <abhashkumarjha123 at gmail.com>
Looks simple so I've applied it, but plenty of time for
additional reviews to come in.

Jonathan

> ---
>  drivers/iio/adc/mt6360-adc.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/drivers/iio/adc/mt6360-adc.c b/drivers/iio/adc/mt6360-adc.c
> index 3710473e5..91befe2cd 100644
> --- a/drivers/iio/adc/mt6360-adc.c
> +++ b/drivers/iio/adc/mt6360-adc.c
> @@ -124,7 +124,7 @@ static int mt6360_adc_read_channel(struct mt6360_adc_data *mad, int channel, int
>  		usleep_range(ADC_LOOP_TIME_US / 2, ADC_LOOP_TIME_US);
>  	}
>  
> -	*val = rpt[1] << 8 | rpt[2];
> +	*val = get_unaligned_be16(&rpt[1]);
>  	ret = IIO_VAL_INT;
>  
>  out_adc_conv:



From krzk at kernel.org  Sun Sep 29 12:43:33 2024
From: krzk at kernel.org (Krzysztof Kozlowski)
Date: Sun, 29 Sep 2024 21:43:33 +0200
Subject: [PATCH v2 2/2] dt-bindings: mmc: mtk-sd: Add support for MT8196
In-Reply-To: <20240929074558.2076-3-andy-ld.lu@mediatek.com>
References: <20240929074558.2076-1-andy-ld.lu@mediatek.com>
 <20240929074558.2076-3-andy-ld.lu@mediatek.com>
Message-ID: <wuhrl54ojj4sjbk3qbm5jjgeupznbs4uhfedogmucjhvnbjbeh@vwvpeuiwgwli>

On Sun, Sep 29, 2024 at 03:44:06PM +0800, Andy-ld Lu wrote:
> Extend the devicetree bindings to include the MT8196 mmc controller
> by adding the compatible string 'mediatek,mt8196-mmc'.

Your entire two-line sentence, says the same as commit msg and is pretty
obvious from the diff. Say something useful instead, like describe the
hardware differences.

Acked-by: Krzysztof Kozlowski <krzk at kernel.org>

Best regards,
Krzysztof



From christophe.jaillet at wanadoo.fr  Sun Sep 29 12:53:40 2024
From: christophe.jaillet at wanadoo.fr (Christophe JAILLET)
Date: Sun, 29 Sep 2024 21:53:40 +0200
Subject: [PATCH] wifi: mt76: mt7915: Fix an error handling path in mt7915_add_interface()
Message-ID: <b9d8fbfc19360bfe60b9cea1cb0f735ab3b4bc26.1727639596.git.christophe.jaillet@wanadoo.fr>

If mt76_wcid_alloc() fails, the "mt76.mutex" mutex needs to be released as
done in the other error handling path of mt7915_add_interface().

Fixes: f3049b88b2b3 ("wifi: mt76: mt7915: allocate vif wcid in the same range as stations")
Signed-off-by: Christophe JAILLET <christophe.jaillet at wanadoo.fr>
---
Compile tested only
---
 drivers/net/wireless/mediatek/mt76/mt7915/main.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/main.c b/drivers/net/wireless/mediatek/mt76/mt7915/main.c
index d75e8dea1fbd..bea8b77b1b92 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/main.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/main.c
@@ -246,8 +246,10 @@ static int mt7915_add_interface(struct ieee80211_hw *hw,
 	phy->omac_mask |= BIT_ULL(mvif->mt76.omac_idx);
 
 	idx = mt76_wcid_alloc(dev->mt76.wcid_mask, mt7915_wtbl_size(dev));
-	if (idx < 0)
-		return -ENOSPC;
+	if (idx < 0) {
+		ret = -ENOSPC;
+		goto out;
+	}
 
 	INIT_LIST_HEAD(&mvif->sta.rc_list);
 	INIT_LIST_HEAD(&mvif->sta.wcid.poll_list);
-- 
2.46.2



From wojackbb at gmail.com  Sun Sep 29 20:05:49 2024
From: wojackbb at gmail.com (wojackbb at gmail.com)
Date: Mon, 30 Sep 2024 11:05:49 +0800
Subject: [PATCH] Add PM_AUTOSUSPEND_MS_BY_DW5933E for Dell DW5933e
Message-ID: <20240930030549.2116070-1-wojackbb@gmail.com>

From: Jack Wu <wojackbb at gmail.com>

Because optimizing the power consumption of Dell DW5933e,
Add a new auto suspend time for Dell DW5933e.

Signed-off-by: Jack Wu <wojackbb at gmail.com>
---
 drivers/net/wwan/t7xx/t7xx_pci.c | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)

diff --git a/drivers/net/wwan/t7xx/t7xx_pci.c b/drivers/net/wwan/t7xx/t7xx_pci.c
index e556e5bd49ab..2dcb0967f9e9 100644
--- a/drivers/net/wwan/t7xx/t7xx_pci.c
+++ b/drivers/net/wwan/t7xx/t7xx_pci.c
@@ -49,6 +49,7 @@
 #define PM_SLEEP_DIS_TIMEOUT_MS		20
 #define PM_ACK_TIMEOUT_MS		1500
 #define PM_AUTOSUSPEND_MS		20000
+#define PM_AUTOSUSPEND_MS_BY_DW5933E 5000
 #define PM_RESOURCE_POLL_TIMEOUT_US	10000
 #define PM_RESOURCE_POLL_STEP_US	100
 
@@ -174,7 +175,7 @@ static int t7xx_wait_pm_config(struct t7xx_pci_dev *t7xx_dev)
 	return ret;
 }
 
-static int t7xx_pci_pm_init(struct t7xx_pci_dev *t7xx_dev)
+static int t7xx_pci_pm_init(struct t7xx_pci_dev *t7xx_dev, int pm_autosuspend_ms)
 {
 	struct pci_dev *pdev = t7xx_dev->pdev;
 
@@ -191,7 +192,7 @@ static int t7xx_pci_pm_init(struct t7xx_pci_dev *t7xx_dev)
 				DPM_FLAG_NO_DIRECT_COMPLETE);
 
 	iowrite32(T7XX_L1_BIT(0), IREG_BASE(t7xx_dev) + DISABLE_ASPM_LOWPWR);
-	pm_runtime_set_autosuspend_delay(&pdev->dev, PM_AUTOSUSPEND_MS);
+	pm_runtime_set_autosuspend_delay(&pdev->dev, pm_autosuspend_ms);
 	pm_runtime_use_autosuspend(&pdev->dev);
 
 	return 0;
@@ -824,7 +825,13 @@ static int t7xx_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
 	IREG_BASE(t7xx_dev) = pcim_iomap_table(pdev)[T7XX_PCI_IREG_BASE];
 	t7xx_dev->base_addr.pcie_ext_reg_base = pcim_iomap_table(pdev)[T7XX_PCI_EREG_BASE];
 
-	ret = t7xx_pci_pm_init(t7xx_dev);
+	if (id->vendor == 0x14c0 && id->device == 0x4d75) {
+		/* Dell DW5933e */
+		ret = t7xx_pci_pm_init(t7xx_dev,PM_AUTOSUSPEND_MS_BY_DW5933E);
+	} else {
+		/* Other devices */
+		ret = t7xx_pci_pm_init(t7xx_dev,PM_AUTOSUSPEND_MS);
+	}
 	if (ret)
 		return ret;
 
-- 
2.34.1



From wojackbb at gmail.com  Sun Sep 29 20:09:07 2024
From: wojackbb at gmail.com (wojackbb at gmail.com)
Date: Mon, 30 Sep 2024 11:09:07 +0800
Subject: [PATCH] [net] net: wwan: t7xx: add PM_AUTOSUSPEND_MS_BY_DW5933E for Dell DW5933e
Message-ID: <20240930030907.2116224-1-wojackbb@gmail.com>

From: Jack Wu <wojackbb at gmail.com>

Because optimizing the power consumption of Dell DW5933e,
Add a new auto suspend time for Dell DW5933e.

Signed-off-by: Jack Wu <wojackbb at gmail.com>
---
 drivers/net/wwan/t7xx/t7xx_pci.c | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)

diff --git a/drivers/net/wwan/t7xx/t7xx_pci.c b/drivers/net/wwan/t7xx/t7xx_pci.c
index e556e5bd49ab..2dcb0967f9e9 100644
--- a/drivers/net/wwan/t7xx/t7xx_pci.c
+++ b/drivers/net/wwan/t7xx/t7xx_pci.c
@@ -49,6 +49,7 @@
 #define PM_SLEEP_DIS_TIMEOUT_MS		20
 #define PM_ACK_TIMEOUT_MS		1500
 #define PM_AUTOSUSPEND_MS		20000
+#define PM_AUTOSUSPEND_MS_BY_DW5933E 5000
 #define PM_RESOURCE_POLL_TIMEOUT_US	10000
 #define PM_RESOURCE_POLL_STEP_US	100
 
@@ -174,7 +175,7 @@ static int t7xx_wait_pm_config(struct t7xx_pci_dev *t7xx_dev)
 	return ret;
 }
 
-static int t7xx_pci_pm_init(struct t7xx_pci_dev *t7xx_dev)
+static int t7xx_pci_pm_init(struct t7xx_pci_dev *t7xx_dev, int pm_autosuspend_ms)
 {
 	struct pci_dev *pdev = t7xx_dev->pdev;
 
@@ -191,7 +192,7 @@ static int t7xx_pci_pm_init(struct t7xx_pci_dev *t7xx_dev)
 				DPM_FLAG_NO_DIRECT_COMPLETE);
 
 	iowrite32(T7XX_L1_BIT(0), IREG_BASE(t7xx_dev) + DISABLE_ASPM_LOWPWR);
-	pm_runtime_set_autosuspend_delay(&pdev->dev, PM_AUTOSUSPEND_MS);
+	pm_runtime_set_autosuspend_delay(&pdev->dev, pm_autosuspend_ms);
 	pm_runtime_use_autosuspend(&pdev->dev);
 
 	return 0;
@@ -824,7 +825,13 @@ static int t7xx_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
 	IREG_BASE(t7xx_dev) = pcim_iomap_table(pdev)[T7XX_PCI_IREG_BASE];
 	t7xx_dev->base_addr.pcie_ext_reg_base = pcim_iomap_table(pdev)[T7XX_PCI_EREG_BASE];
 
-	ret = t7xx_pci_pm_init(t7xx_dev);
+	if (id->vendor == 0x14c0 && id->device == 0x4d75) {
+		/* Dell DW5933e */
+		ret = t7xx_pci_pm_init(t7xx_dev,PM_AUTOSUSPEND_MS_BY_DW5933E);
+	} else {
+		/* Other devices */
+		ret = t7xx_pci_pm_init(t7xx_dev,PM_AUTOSUSPEND_MS);
+	}
 	if (ret)
 		return ret;
 
-- 
2.34.1



From wojackbb at gmail.com  Sun Sep 29 20:16:24 2024
From: wojackbb at gmail.com (wojackbb at gmail.com)
Date: Mon, 30 Sep 2024 11:16:24 +0800
Subject: [PATCH] [net,v2] net: wwan: t7xx: add PM_AUTOSUSPEND_MS_BY_DW5933E for Dell DW5933e
Message-ID: <20240930031624.2116592-1-wojackbb@gmail.com>

From: Jack Wu <wojackbb at gmail.com>

Because optimizing the power consumption of Dell DW5933e,
Add a new auto suspend time for Dell DW5933e.

Signed-off-by: Jack Wu <wojackbb at gmail.com>
---
 drivers/net/wwan/t7xx/t7xx_pci.c | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)

diff --git a/drivers/net/wwan/t7xx/t7xx_pci.c b/drivers/net/wwan/t7xx/t7xx_pci.c
index e556e5bd49ab..ec567153ea6e 100644
--- a/drivers/net/wwan/t7xx/t7xx_pci.c
+++ b/drivers/net/wwan/t7xx/t7xx_pci.c
@@ -49,6 +49,7 @@
 #define PM_SLEEP_DIS_TIMEOUT_MS		20
 #define PM_ACK_TIMEOUT_MS		1500
 #define PM_AUTOSUSPEND_MS		20000
+#define PM_AUTOSUSPEND_MS_BY_DW5933E 5000
 #define PM_RESOURCE_POLL_TIMEOUT_US	10000
 #define PM_RESOURCE_POLL_STEP_US	100
 
@@ -174,7 +175,7 @@ static int t7xx_wait_pm_config(struct t7xx_pci_dev *t7xx_dev)
 	return ret;
 }
 
-static int t7xx_pci_pm_init(struct t7xx_pci_dev *t7xx_dev)
+static int t7xx_pci_pm_init(struct t7xx_pci_dev *t7xx_dev, int pm_autosuspend_ms)
 {
 	struct pci_dev *pdev = t7xx_dev->pdev;
 
@@ -191,7 +192,7 @@ static int t7xx_pci_pm_init(struct t7xx_pci_dev *t7xx_dev)
 				DPM_FLAG_NO_DIRECT_COMPLETE);
 
 	iowrite32(T7XX_L1_BIT(0), IREG_BASE(t7xx_dev) + DISABLE_ASPM_LOWPWR);
-	pm_runtime_set_autosuspend_delay(&pdev->dev, PM_AUTOSUSPEND_MS);
+	pm_runtime_set_autosuspend_delay(&pdev->dev, pm_autosuspend_ms);
 	pm_runtime_use_autosuspend(&pdev->dev);
 
 	return 0;
@@ -824,7 +825,13 @@ static int t7xx_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
 	IREG_BASE(t7xx_dev) = pcim_iomap_table(pdev)[T7XX_PCI_IREG_BASE];
 	t7xx_dev->base_addr.pcie_ext_reg_base = pcim_iomap_table(pdev)[T7XX_PCI_EREG_BASE];
 
-	ret = t7xx_pci_pm_init(t7xx_dev);
+	if (id->vendor == 0x14c0 && id->device == 0x4d75) {
+		/* Dell DW5933e */
+		ret = t7xx_pci_pm_init(t7xx_dev, PM_AUTOSUSPEND_MS_BY_DW5933E);
+	} else {
+		/* Other devices */
+		ret = t7xx_pci_pm_init(t7xx_dev, PM_AUTOSUSPEND_MS);
+	}
 	if (ret)
 		return ret;
 
-- 
2.34.1



From Moudy.Ho at mediatek.com  Sun Sep 29 20:20:58 2024
From: Moudy.Ho at mediatek.com (=?utf-8?B?TW91ZHkgSG8gKOS9leWul+WOnyk=?=)
Date: Mon, 30 Sep 2024 03:20:58 +0000
Subject: [PATCH v2] dt-bindings: display: mediatek: split: add clocks
 count constraint for MT8195
In-Reply-To: <0610bf4f130f238af148334969dfc0373cdb16de.camel@mediatek.com>
References: <20240927055140.19688-1-moudy.ho@mediatek.com>
	 <0610bf4f130f238af148334969dfc0373cdb16de.camel@mediatek.com>
Message-ID: <41b226173cfd945aef7be9bd4d9e7e0603b0ebbc.camel@mediatek.com>

Hi CK,

On Fri, 2024-09-27 at 09:01 +0000, CK Hu (???) wrote:
> Hi, Moudy:
> 
> On Fri, 2024-09-27 at 13:51 +0800, Moudy Ho wrote:
> > From: Moudy Ho <moudy.ho at mediatek.corp-partner.google.com>
> > 
> > The display node in mt8195.dtsi was triggering a CHECK_DTBS error
> > due
> > to an excessively long 'clocks' property:
> >   display at 14f06000: clocks: [[31, 14], [31, 43], [31, 44]] is too
> > long
> > 
> > To resolve this issue, apply the limit by setting 'maxItems: 3' in
> > MT8195
> > additional condition.
> 
> I think the main purpose of this patch is not to add limitation.
> The main purpose is that you add HDMI RX Clock and HDMI Metadata
> Clock.
> Could you describe more about these two clock?
> mt8173-disp-split could work without these two clocks. Why mt8195-
> mdp3-split need these two clocks?
> 

Thanks for the reminder.
In hardware design, SPLIT must enable additional clocks based on its
front-end signal source, and this also implies its position in the
display pipeline.
I will elaborate further on this part of the description.

> > 
> > Fixes: 4ed545e7d100 ("dt-bindings: display: mediatek: disp: split
> > each block to individual yaml")
> 
> The fixes patch should be 739058a9c5c3 ("dt-bindings: display:
> mediatek: split: add compatible for MT8195")
> 
> Regards,
> CK
> 

It will be corrected in the next version.

Sincerely,
Moudy Ho
> > Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
> > Signed-off-by: Moudy Ho <moudy.ho at mediatek.com>
> > --
> > The purpose of this patch is to separate the corrections for
> > MediaTek SPLIT CHECK_DTBS error from the original mailing list
> > mentioned below:
> > 
https://lore.kernel.org/all/20240924103156.13119-2-macpaul.lin at mediatek.com/
> > 
> > Changes since v1:
> >   - Adding functional descriptions and quantity restrictions.
> > ---
> >  .../bindings/display/mediatek/mediatek,split.yaml           | 6
> > ++++++
> >  1 file changed, 6 insertions(+)
> > 
> > diff --git
> > a/Documentation/devicetree/bindings/display/mediatek/mediatek,split
> > .yaml
> > b/Documentation/devicetree/bindings/display/mediatek/mediatek,split
> > .yaml
> > index e4affc854f3d..bce1b8b866ce 100644
> > ---
> > a/Documentation/devicetree/bindings/display/mediatek/mediatek,split
> > .yaml
> > +++
> > b/Documentation/devicetree/bindings/display/mediatek/mediatek,split
> > .yaml
> > @@ -57,6 +57,9 @@ properties:
> >    clocks:
> >      items:
> >        - description: SPLIT Clock
> > +      - description: HDMI RX Clock
> > +      - description: HDMI Metadata Clock
> > +    minItems: 1
> >  
> >  required:
> >    - compatible
> > @@ -72,6 +75,9 @@ allOf:
> >              const: mediatek,mt8195-mdp3-split
> >  
> >      then:
> > +      properties:
> > +        clocks:
> > +          maxItems: 3
> >        required:
> >          - mediatek,gce-client-reg
> >  

From Moudy.Ho at mediatek.com  Sun Sep 29 20:28:44 2024
From: Moudy.Ho at mediatek.com (=?utf-8?B?TW91ZHkgSG8gKOS9leWul+WOnyk=?=)
Date: Mon, 30 Sep 2024 03:28:44 +0000
Subject: [PATCH v2] dt-bindings: display: mediatek: split: add clocks
 count constraint for MT8195
In-Reply-To: <pnpj4pexz6nff72kmk6thupwvp2dgkz32ye7o44qdpuctbewb4@kpokc7c2rflr>
References: <20240927055140.19688-1-moudy.ho@mediatek.com>
	 <pnpj4pexz6nff72kmk6thupwvp2dgkz32ye7o44qdpuctbewb4@kpokc7c2rflr>
Message-ID: <e78c2a518b258d6287233367be1e071c2da1a724.camel@mediatek.com>

Hi Krzysztof,

On Fri, 2024-09-27 at 11:37 +0200, Krzysztof Kozlowski wrote:
>  	 
> External email : Please do not click links or open attachments until
> you have verified the sender or the content.
>  On Fri, Sep 27, 2024 at 01:51:40PM +0800, Moudy Ho wrote:
> > From: Moudy Ho <moudy.ho at mediatek.corp-partner.google.com>
> > 
> > The display node in mt8195.dtsi was triggering a CHECK_DTBS error
> due
> > to an excessively long 'clocks' property:
> >   display at 14f06000: clocks: [[31, 14], [31, 43], [31, 44]] is too
> long
> > 
> > To resolve this issue, apply the limit by setting 'maxItems: 3' in
> MT8195
> > additional condition.
> > 
> > Fixes: 4ed545e7d100 ("dt-bindings: display: mediatek: disp: split
> each block to individual yaml")
> > Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
> > Signed-off-by: Moudy Ho <moudy.ho at mediatek.com>
> 
> Your SoB does not match.
> 
> Please run scripts/checkpatch.pl and fix reported warnings. Then
> please
> run  and (probably) fix more warnings.
> Some warnings can be ignored, especially from --strict run, but the
> code
> here looks like it needs a fix. Feel free to get in touch if the
> warning
> is not clear.
> 

I apololgize for the mismatch and warning. I will make the corrections
in the next version.

> > --
> > The purpose of this patch is to separate the corrections for
> > MediaTek SPLIT CHECK_DTBS error from the original mailing list
> > mentioned below:
> > 
> https://lore.kernel.org/all/20240924103156.13119-2-macpaul.lin at mediatek.com/
> > 
> > Changes since v1:
> >   - Adding functional descriptions and quantity restrictions.
> > ---
> >  .../bindings/display/mediatek/mediatek,split.yaml           | 6
> ++++++
> >  1 file changed, 6 insertions(+)
> > 
> > diff --git
> a/Documentation/devicetree/bindings/display/mediatek/mediatek,split.y
> aml
> b/Documentation/devicetree/bindings/display/mediatek/mediatek,split.y
> aml
> > index e4affc854f3d..bce1b8b866ce 100644
> > ---
> a/Documentation/devicetree/bindings/display/mediatek/mediatek,split.y
> aml
> > +++
> b/Documentation/devicetree/bindings/display/mediatek/mediatek,split.y
> aml
> > @@ -57,6 +57,9 @@ properties:
> >    clocks:
> >      items:
> >        - description: SPLIT Clock
> > +      - description: HDMI RX Clock
> > +      - description: HDMI Metadata Clock
> > +    minItems: 1
> >  
> >  required:
> >    - compatible
> > @@ -72,6 +75,9 @@ allOf:
> >              const: mediatek,mt8195-mdp3-split
> >  
> >      then:
> > +      properties:
> > +        clocks:
> 
> missing minItems
> 
> Missing constraints for all the variants.
> 

Does this mean that a 'maxItems:1' condition needs to be added for
mt8173 clock property under the 'allOf' seciton?

> Best regards,
> Krzysztof
> 

Sincerely,
Moudy Ho

From wenst at chromium.org  Sun Sep 29 21:45:20 2024
From: wenst at chromium.org (Chen-Yu Tsai)
Date: Mon, 30 Sep 2024 12:45:20 +0800
Subject: [PATCH v9 0/3] Add of_regulator_get_optional() and Fix MTK Power Domain Driver
Message-ID: <20240930044525.2043884-1-wenst@chromium.org>

Hi folks,

This is v9 of my of_regulator_get_optional() series. This series was
split off from my "DT hardware prober" series [1].

Changes since v8:
- Reformated stub versions with `clang-format`
- Collected Andy's Reviewed-by for the first patch
- Moved OF-specific devres version to of_regulator.c
- Made _of_regulator_get() static again
- Made devm_regulator_release non-static

Changes since v7:
- Added stub versions for of_regulator_get_optional() for !CONFIG_OF
  and !CONFIG_REGULATOR
- Added new patches for devres version and converting MTK pmdomain
  driver

At ELCE, Sebastian told me about his recent work on adding regulator
supply support to the Rockchip power domain driver [2], how the MediaTek
driver has been using the existing devm_regulator_get() API and
reassigning different device nodes to the device doing the lookup, and
how the new of_regulator_get_optional() is the proper fit for this.

Patch 1 adds a new of_regulator_get_optional() function to look up
regulator supplies using device tree nodes.

Patch 2 adds a devres version of the aforementioned function at
Sebastian's request for the two power domain drivers.

Patch 3 converts the MediaTek power domain driver to use function.


Each of the latter two patches depend on the previous one at build time.
Ulf would like the regulator patches on an immutable topic branch so
that he can merge it and the pmdomain patch. Mark, if you could oblige?


Thanks
ChenYu


[1] https://lore.kernel.org/all/20240911072751.365361-1-wenst at chromium.org/
[2] https://lore.kernel.org/all/20240919091834.83572-1-sebastian.reichel at collabora.com/

Chen-Yu Tsai (3):
  regulator: Add of_regulator_get_optional() for pure DT regulator
    lookup
  regulator: Add devres version of of_regulator_get_optional()
  pmdomain: mediatek: Use OF-specific regulator API to get power domain
    supply

 drivers/pmdomain/mediatek/mtk-pm-domains.c | 12 +--
 drivers/regulator/core.c                   |  4 +-
 drivers/regulator/devres.c                 |  2 +-
 drivers/regulator/internal.h               |  4 +
 drivers/regulator/of_regulator.c           | 88 ++++++++++++++++++++--
 include/linux/regulator/consumer.h         | 31 ++++++++
 6 files changed, 121 insertions(+), 20 deletions(-)


base-commit: 9852d85ec9d492ebef56dc5f229416c925758edc
-- 
2.46.1.824.gd892dcdcdd-goog



From wenst at chromium.org  Sun Sep 29 21:45:21 2024
From: wenst at chromium.org (Chen-Yu Tsai)
Date: Mon, 30 Sep 2024 12:45:21 +0800
Subject: [PATCH v9 1/3] regulator: Add of_regulator_get_optional() for pure DT regulator lookup
In-Reply-To: <20240930044525.2043884-1-wenst@chromium.org>
References: <20240930044525.2043884-1-wenst@chromium.org>
Message-ID: <20240930044525.2043884-2-wenst@chromium.org>

The to-be-introduced I2C component prober needs to enable regulator
supplies (and toggle GPIO pins) for the various components it intends
to probe. To support this, a new "pure DT lookup" method for getting
regulator supplies is needed, since the device normally requesting
the supply won't get created until after the component is probed to
be available.

Add a new of_regulator_get_optional() function for this. This mirrors
the existing regulator_get_optional() function, but is OF-specific.
The underlying code that supports the existing regulator_get*()
functions has been reworked in previous patches to support this
specific case.

Also convert an existing usage of "dev && dev->of_node" to
"dev_of_node(dev)".

Link: https://lore.kernel.org/all/20231220203537.83479-2-jernej.skrabec at gmail.com/ [1]
Signed-off-by: Chen-Yu Tsai <wenst at chromium.org>
Reviewed-by: Andy Shevchenko <andriy.shevchenko at linux.intel.com>
---
Changes since v8:
- Reformat stub versions with `clang-format`

Changes since v7:
- Added stub version for !CONFIG_OF and !CONFIG_REGULATOR

Changes since v6:
- Changed reference [1] to Link: tag
- Rebased on top of commit 401d078eaf2e ("regulator: of: Refactor
  of_get_*regulator() to decrease indentation")
- Exported of_regulator_get_optional()
- Changed commit message to focus on "of_regulator_get_optional()"
- Dropped change to of_regulator_bulk_get_all()

Changes since v5:
- Used "dev_of_node(dev)" instead of "dev->of_node"
- Replaced "dev_printk" with "dev_printk()" in kerneldoc mentions
- Fixed kerneldoc "Return" section format for of_regulator_get_optional()
- Fix @np parameter name in of_regulator_dev_lookup() kerneldoc

Changes since v4:
- Restore platform-agnostic regulator consumer code to original state
- Move OF-specific regulator code to of_regulator.c (separate patch)
- Split _regulator_get() into three parts for reuse (separate patch)
- Add OF-specific _of_regulator_get() function
- Rename regulator_of_get_optional() to of_regulator_get_optional() for
  consistency
- Make of_regulator_get_optional static, as it is only used internally
- Convert of_regulator_bulk_get_all()

Changes since v3:
- New patch

# This is the commit message #2:

# fixup! regulator: Add of_regulator_get_optional() for pure DT regulator lookup
---
 drivers/regulator/core.c           |  4 +--
 drivers/regulator/internal.h       |  2 ++
 drivers/regulator/of_regulator.c   | 51 ++++++++++++++++++++++++++----
 include/linux/regulator/consumer.h | 17 ++++++++++
 4 files changed, 66 insertions(+), 8 deletions(-)

diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c
index 1179766811f5..d0b3879f2746 100644
--- a/drivers/regulator/core.c
+++ b/drivers/regulator/core.c
@@ -1959,8 +1959,8 @@ static struct regulator_dev *regulator_dev_lookup(struct device *dev,
 	regulator_supply_alias(&dev, &supply);
 
 	/* first do a dt based lookup */
-	if (dev && dev->of_node) {
-		r = of_regulator_dev_lookup(dev, supply);
+	if (dev_of_node(dev)) {
+		r = of_regulator_dev_lookup(dev, dev_of_node(dev), supply);
 		if (!IS_ERR(r))
 			return r;
 		if (PTR_ERR(r) == -EPROBE_DEFER)
diff --git a/drivers/regulator/internal.h b/drivers/regulator/internal.h
index 5b43f802468d..f62cacbbc729 100644
--- a/drivers/regulator/internal.h
+++ b/drivers/regulator/internal.h
@@ -67,6 +67,7 @@ static inline struct regulator_dev *dev_to_rdev(struct device *dev)
 
 #ifdef CONFIG_OF
 struct regulator_dev *of_regulator_dev_lookup(struct device *dev,
+					      struct device_node *np,
 					      const char *supply);
 struct regulator_init_data *regulator_of_get_init_data(struct device *dev,
 			         const struct regulator_desc *desc,
@@ -82,6 +83,7 @@ bool of_check_coupling_data(struct regulator_dev *rdev);
 
 #else
 static inline struct regulator_dev *of_regulator_dev_lookup(struct device *dev,
+							    struct device_node *np,
 							    const char *supply)
 {
 	return ERR_PTR(-ENODEV);
diff --git a/drivers/regulator/of_regulator.c b/drivers/regulator/of_regulator.c
index 3f490d81abc2..358c3ed791db 100644
--- a/drivers/regulator/of_regulator.c
+++ b/drivers/regulator/of_regulator.c
@@ -588,7 +588,8 @@ static struct device_node *of_get_child_regulator(struct device_node *parent,
 
 /**
  * of_get_regulator - get a regulator device node based on supply name
- * @dev: Device pointer for the consumer (of regulator) device
+ * @dev: Device pointer for dev_printk() messages
+ * @node: Device node pointer for supply property lookup
  * @supply: regulator supply name
  *
  * Extract the regulator device node corresponding to the supply name.
@@ -596,15 +597,16 @@ static struct device_node *of_get_child_regulator(struct device_node *parent,
  * Return: Pointer to the &struct device_node corresponding to the regulator
  *	   if found, or %NULL if not found.
  */
-static struct device_node *of_get_regulator(struct device *dev, const char *supply)
+static struct device_node *of_get_regulator(struct device *dev, struct device_node *node,
+					    const char *supply)
 {
 	struct device_node *regnode = NULL;
 	char prop_name[64]; /* 64 is max size of property name */
 
-	dev_dbg(dev, "Looking up %s-supply from device tree\n", supply);
+	dev_dbg(dev, "Looking up %s-supply from device node %pOF\n", supply, node);
 
 	snprintf(prop_name, 64, "%s-supply", supply);
-	regnode = of_parse_phandle(dev->of_node, prop_name, 0);
+	regnode = of_parse_phandle(node, prop_name, 0);
 	if (regnode)
 		return regnode;
 
@@ -628,6 +630,7 @@ static struct regulator_dev *of_find_regulator_by_node(struct device_node *np)
 /**
  * of_regulator_dev_lookup - lookup a regulator device with device tree only
  * @dev: Device pointer for regulator supply lookup.
+ * @np: Device node pointer for regulator supply lookup.
  * @supply: Supply name or regulator ID.
  *
  * Return: Pointer to the &struct regulator_dev on success, or ERR_PTR()
@@ -642,13 +645,13 @@ static struct regulator_dev *of_find_regulator_by_node(struct device_node *np)
  * * -%ENODEV if lookup fails permanently.
  * * -%EPROBE_DEFER if lookup could succeed in the future.
  */
-struct regulator_dev *of_regulator_dev_lookup(struct device *dev,
+struct regulator_dev *of_regulator_dev_lookup(struct device *dev, struct device_node *np,
 					      const char *supply)
 {
 	struct regulator_dev *r;
 	struct device_node *node;
 
-	node = of_get_regulator(dev, supply);
+	node = of_get_regulator(dev, np, supply);
 	if (node) {
 		r = of_find_regulator_by_node(node);
 		of_node_put(node);
@@ -665,6 +668,42 @@ struct regulator_dev *of_regulator_dev_lookup(struct device *dev,
 	return ERR_PTR(-ENODEV);
 }
 
+static struct regulator *_of_regulator_get(struct device *dev, struct device_node *node,
+					   const char *id, enum regulator_get_type get_type)
+{
+	struct regulator_dev *r;
+	int ret;
+
+	ret = _regulator_get_common_check(dev, id, get_type);
+	if (ret)
+		return ERR_PTR(ret);
+
+	r = of_regulator_dev_lookup(dev, node, id);
+	return _regulator_get_common(r, dev, id, get_type);
+}
+
+/**
+ * of_regulator_get_optional - get optional regulator via device tree lookup
+ * @dev: device used for dev_printk() messages
+ * @node: device node for regulator "consumer"
+ * @id: Supply name
+ *
+ * Return: pointer to struct regulator corresponding to the regulator producer,
+ *	   or PTR_ERR() encoded error number.
+ *
+ * This is intended for use by consumers that want to get a regulator
+ * supply directly from a device node, and can and want to deal with
+ * absence of such supplies. This will _not_ consider supply aliases.
+ * See regulator_dev_lookup().
+ */
+struct regulator *of_regulator_get_optional(struct device *dev,
+					    struct device_node *node,
+					    const char *id)
+{
+	return _of_regulator_get(dev, node, id, OPTIONAL_GET);
+}
+EXPORT_SYMBOL_GPL(of_regulator_get_optional);
+
 /*
  * Returns number of regulators coupled with rdev.
  */
diff --git a/include/linux/regulator/consumer.h b/include/linux/regulator/consumer.h
index b9ce521910a0..37a5c4199563 100644
--- a/include/linux/regulator/consumer.h
+++ b/include/linux/regulator/consumer.h
@@ -168,6 +168,17 @@ int devm_regulator_get_enable_read_voltage(struct device *dev, const char *id);
 void regulator_put(struct regulator *regulator);
 void devm_regulator_put(struct regulator *regulator);
 
+#if IS_ENABLED(CONFIG_OF)
+struct regulator *__must_check of_regulator_get_optional(
+	struct device *dev, struct device_node *node, const char *id);
+#else
+static inline struct regulator *__must_check of_regulator_get_optional(
+	struct device *dev, struct device_node *node, const char *id)
+{
+	return ERR_PTR(-ENODEV);
+}
+#endif
+
 int regulator_register_supply_alias(struct device *dev, const char *id,
 				    struct device *alias_dev,
 				    const char *alias_id);
@@ -350,6 +361,12 @@ devm_regulator_get_optional(struct device *dev, const char *id)
 	return ERR_PTR(-ENODEV);
 }
 
+static inline struct regulator *__must_check of_regulator_get_optional(
+	struct device *dev, struct device_node *node, const char *id)
+{
+	return ERR_PTR(-ENODEV);
+}
+
 static inline void regulator_put(struct regulator *regulator)
 {
 }
-- 
2.46.1.824.gd892dcdcdd-goog



From wenst at chromium.org  Sun Sep 29 21:45:22 2024
From: wenst at chromium.org (Chen-Yu Tsai)
Date: Mon, 30 Sep 2024 12:45:22 +0800
Subject: [PATCH v9 2/3] regulator: Add devres version of of_regulator_get_optional()
In-Reply-To: <20240930044525.2043884-1-wenst@chromium.org>
References: <20240930044525.2043884-1-wenst@chromium.org>
Message-ID: <20240930044525.2043884-3-wenst@chromium.org>

There are existing uses for a devres version of of_regulator_get_optional()
in power domain drivers. On MediaTek platforms, power domains may have
regulator supplies tied to them. The driver currently tries to use
devm_regulator_get() to not have to manage the lifecycle, but ends up
doing it in a very hacky way by replacing the device node of the power
domain controller device to the device node of the power domain that is
currently being registered, getting the supply, and reverting the device
node.

Provide a better API so that the hack can be replaced.

Signed-off-by: Chen-Yu Tsai <wenst at chromium.org>
---
Changes since v8:
- Moved OF-specific devres version to of_regulator.c
- Made _of_regulator_get() static again
- Made devm_regulator_release non-static
- Reformated stub versions with `clang-format`

Changes since v7:
- New patch
---
 drivers/regulator/devres.c         |  2 +-
 drivers/regulator/internal.h       |  2 ++
 drivers/regulator/of_regulator.c   | 37 ++++++++++++++++++++++++++++++
 include/linux/regulator/consumer.h | 14 +++++++++++
 4 files changed, 54 insertions(+), 1 deletion(-)

diff --git a/drivers/regulator/devres.c b/drivers/regulator/devres.c
index 1b893cdd1aad..569a80963a86 100644
--- a/drivers/regulator/devres.c
+++ b/drivers/regulator/devres.c
@@ -14,7 +14,7 @@
 
 #include "internal.h"
 
-static void devm_regulator_release(struct device *dev, void *res)
+void devm_regulator_release(struct device *dev, void *res)
 {
 	regulator_put(*(struct regulator **)res);
 }
diff --git a/drivers/regulator/internal.h b/drivers/regulator/internal.h
index f62cacbbc729..b1b4277aaf90 100644
--- a/drivers/regulator/internal.h
+++ b/drivers/regulator/internal.h
@@ -131,4 +131,6 @@ struct regulator *_regulator_get(struct device *dev, const char *id,
 				 enum regulator_get_type get_type);
 int _regulator_bulk_get(struct device *dev, int num_consumers,
 			struct regulator_bulk_data *consumers, enum regulator_get_type get_type);
+
+void devm_regulator_release(struct device *dev, void *res);
 #endif
diff --git a/drivers/regulator/of_regulator.c b/drivers/regulator/of_regulator.c
index 358c3ed791db..9096d8f494a7 100644
--- a/drivers/regulator/of_regulator.c
+++ b/drivers/regulator/of_regulator.c
@@ -704,6 +704,43 @@ struct regulator *of_regulator_get_optional(struct device *dev,
 }
 EXPORT_SYMBOL_GPL(of_regulator_get_optional);
 
+static struct regulator *_devm_of_regulator_get(struct device *dev, struct device_node *node,
+						const char *id, int get_type)
+{
+	struct regulator **ptr, *regulator;
+
+	ptr = devres_alloc(devm_regulator_release, sizeof(*ptr), GFP_KERNEL);
+	if (!ptr)
+		return ERR_PTR(-ENOMEM);
+
+	regulator = _of_regulator_get(dev, node, id, get_type);
+	if (!IS_ERR(regulator)) {
+		*ptr = regulator;
+		devres_add(dev, ptr);
+	} else {
+		devres_free(ptr);
+	}
+
+	return regulator;
+}
+
+/**
+ * devm_of_regulator_get_optional - Resource managed of_regulator_get_optional()
+ * @dev: device used for dev_printk() messages and resource lifetime management
+ * @node: device node for regulator "consumer"
+ * @id:  supply name or regulator ID.
+ *
+ * Managed regulator_get_optional(). Regulators returned from this
+ * function are automatically regulator_put() on driver detach. See
+ * of_regulator_get_optional() for more information.
+ */
+struct regulator *devm_of_regulator_get_optional(struct device *dev, struct device_node *node,
+						 const char *id)
+{
+	return _devm_of_regulator_get(dev, node, id, OPTIONAL_GET);
+}
+EXPORT_SYMBOL_GPL(devm_of_regulator_get_optional);
+
 /*
  * Returns number of regulators coupled with rdev.
  */
diff --git a/include/linux/regulator/consumer.h b/include/linux/regulator/consumer.h
index 37a5c4199563..582b82a104e2 100644
--- a/include/linux/regulator/consumer.h
+++ b/include/linux/regulator/consumer.h
@@ -171,12 +171,20 @@ void devm_regulator_put(struct regulator *regulator);
 #if IS_ENABLED(CONFIG_OF)
 struct regulator *__must_check of_regulator_get_optional(
 	struct device *dev, struct device_node *node, const char *id);
+struct regulator *__must_check devm_of_regulator_get_optional(
+	struct device *dev, struct device_node *node, const char *id);
 #else
 static inline struct regulator *__must_check of_regulator_get_optional(
 	struct device *dev, struct device_node *node, const char *id)
 {
 	return ERR_PTR(-ENODEV);
 }
+
+static inline struct regulator *__must_check devm_of_regulator_get_optional(
+	struct device *dev, struct device_node *node, const char *id)
+{
+	return ERR_PTR(-ENODEV);
+}
 #endif
 
 int regulator_register_supply_alias(struct device *dev, const char *id,
@@ -367,6 +375,12 @@ static inline struct regulator *__must_check of_regulator_get_optional(
 	return ERR_PTR(-ENODEV);
 }
 
+static inline struct regulator *__must_check devm_of_regulator_get_optional(
+	struct device *dev, struct device_node *node, const char *id)
+{
+	return ERR_PTR(-ENODEV);
+}
+
 static inline void regulator_put(struct regulator *regulator)
 {
 }
-- 
2.46.1.824.gd892dcdcdd-goog



From wenst at chromium.org  Sun Sep 29 21:45:23 2024
From: wenst at chromium.org (Chen-Yu Tsai)
Date: Mon, 30 Sep 2024 12:45:23 +0800
Subject: [PATCH v9 3/3] pmdomain: mediatek: Use OF-specific regulator API to get power domain supply
In-Reply-To: <20240930044525.2043884-1-wenst@chromium.org>
References: <20240930044525.2043884-1-wenst@chromium.org>
Message-ID: <20240930044525.2043884-4-wenst@chromium.org>

The MediaTek power domain driver contains a hack that assigns the device
node of the power domain to the struct device of the power domain
controller in order to use the devres regulator API.

Now that there is a proper OF-specific regulator API, and even a devres
version, replace the hack with proper code.

This change is incompatible with incomplete device trees. Instead of
assigning the dummy regulator in cases where the power domain requires
a supply but the device tree does not provide one, the driver will just
error out. This will be seen on the MT8390 EVK, which is missing
supplies for the IMG_VCORE and CAM_VCORE domains. And likely all the
MediaTek EVBs, which have no power domain supplies specified. This is
however the correct behavior. If the power domain's supply is missing,
then it should not work. Relying on other parts of the system to keep
the unattached regulator enabled is likely to break in ways less easier
to understand.

Signed-off-by: Chen-Yu Tsai <wenst at chromium.org>
---
Changes since v7:
- New patch

The other option is to follow what Rockchip will be doing: getting the
regulator supply upon first use / enable [1]. This will result in less
breakage: only the power domain that is missing its supplies will fail
to be attached.

[1] https://lore.kernel.org/all/20240919091834.83572-6-sebastian.reichel at collabora.com/
---
 drivers/pmdomain/mediatek/mtk-pm-domains.c | 12 +-----------
 1 file changed, 1 insertion(+), 11 deletions(-)

diff --git a/drivers/pmdomain/mediatek/mtk-pm-domains.c b/drivers/pmdomain/mediatek/mtk-pm-domains.c
index 88406e9ac63c..3580913f25d3 100644
--- a/drivers/pmdomain/mediatek/mtk-pm-domains.c
+++ b/drivers/pmdomain/mediatek/mtk-pm-domains.c
@@ -353,7 +353,6 @@ generic_pm_domain *scpsys_add_one_domain(struct scpsys *scpsys, struct device_no
 {
 	const struct scpsys_domain_data *domain_data;
 	struct scpsys_domain *pd;
-	struct device_node *root_node = scpsys->dev->of_node;
 	struct device_node *smi_node;
 	struct property *prop;
 	const char *clk_name;
@@ -388,16 +387,7 @@ generic_pm_domain *scpsys_add_one_domain(struct scpsys *scpsys, struct device_no
 	pd->scpsys = scpsys;
 
 	if (MTK_SCPD_CAPS(pd, MTK_SCPD_DOMAIN_SUPPLY)) {
-		/*
-		 * Find regulator in current power domain node.
-		 * devm_regulator_get() finds regulator in a node and its child
-		 * node, so set of_node to current power domain node then change
-		 * back to original node after regulator is found for current
-		 * power domain node.
-		 */
-		scpsys->dev->of_node = node;
-		pd->supply = devm_regulator_get(scpsys->dev, "domain");
-		scpsys->dev->of_node = root_node;
+		pd->supply = devm_of_regulator_get_optional(scpsys->dev, node, "domain");
 		if (IS_ERR(pd->supply))
 			return dev_err_cast_probe(scpsys->dev, pd->supply,
 				      "%pOF: failed to get power supply.\n",
-- 
2.46.1.824.gd892dcdcdd-goog



From macpaul.lin at mediatek.com  Sun Sep 29 22:42:19 2024
From: macpaul.lin at mediatek.com (Macpaul Lin)
Date: Mon, 30 Sep 2024 13:42:19 +0800
Subject: [PATCH 2/3] dt-bindings: mfd: mediatek: mt6397: add compatible
 for mt6359-codec
In-Reply-To: <z5zehicgqqsbgsjz5nrjlqrkpqll57gb26jdc3ctpeajtlfusm@b2s5vrbuv3es>
References: <20240926092519.6556-1-macpaul.lin@mediatek.com>
 <20240926092519.6556-2-macpaul.lin@mediatek.com>
 <20240926-smokeless-clobber-0fb8a1cdc7ab@spud>
 <78381b10-eae6-1414-6913-994e1ed03410@mediatek.com>
 <z5zehicgqqsbgsjz5nrjlqrkpqll57gb26jdc3ctpeajtlfusm@b2s5vrbuv3es>
Message-ID: <edeb6345-fc70-a3e8-0702-b9b146295aa2@mediatek.com>



On 9/27/24 17:42, Krzysztof Kozlowski wrote:
> 	
> 
> External email : Please do not click links or open attachments until you 
> have verified the sender or the content.
> 
> On Fri, Sep 27, 2024 at 03:57:58PM +0800, Macpaul Lin wrote:
>> On 9/27/24 00:04, Conor Dooley wrote:
>> > On Thu, Sep 26, 2024 at 05:25:18PM +0800, Macpaul Lin wrote:
>> > > This patch updates the audio-codec properties includes:
>> > >   - compatible:
>> > >    - Re-order the supported device items.
>> > >    - Add 'mt6359-codec' to compatible since MT6359 PMIC has been included
>> > >      in this DT Schema.
>> > 
>> > >    - Set 'additionalProperties: true' for 'mt6359-codec'.
>> > 
>> > Why?
>> 
>> The mt6359-codec support these 3 properties:
>> mediatek,mic-type0, mediatek,mic-type-1, mediatek-mic-type2.
>> While mt6358-sound and mt6397-codec don't (at least, I didn't find
>> these 3 properties in driver codes.
>> 
>> Set 'additionalProperties: true' is also required to fix the following
>> dtbs_check errors:
>> pmic: audio-codec: 'mediatek,mic-type-0', 'mediatek,mic-type-1',
>>       'mediatek,mic-type-2' do not match any of the regexes:
>>       'pinctrl-[0-9]+'
> 
> Why is this a correct fix? Aren't you allowing "pink-pony" property as
> well?
> 
>> 
>> > > 
>> > > Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
>> > > ---
>> > >   Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml | 5 +++--
> 
> There is no such file.
> 
> Best regards,
> Krzysztof
> 

This patch is no longer necessary. I'm working on a new fix (v7)
for 'Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml' and try 
to rid of these mess in audio-codec node.

Thanks
Macpaul Lin


From macpaul.lin at mediatek.com  Sun Sep 29 22:53:48 2024
From: macpaul.lin at mediatek.com (Macpaul Lin)
Date: Mon, 30 Sep 2024 13:53:48 +0800
Subject: [PATCH 1/2] dt-bindings: mfd: mediatek: mt6397: add adc and
 regulators for mt6359
In-Reply-To: <172731883694.2430476.10157265874067724564.robh@kernel.org>
References: <20240925171156.9115-1-macpaul.lin@mediatek.com>
 <172731883694.2430476.10157265874067724564.robh@kernel.org>
Message-ID: <bd6376df-baea-d29d-6b74-68d350cbf797@mediatek.com>



On 9/26/24 10:47, Rob Herring (Arm) wrote:
> 	
> 
> External email : Please do not click links or open attachments until you 
> have verified the sender or the content.
> 
> On Thu, 26 Sep 2024 01:11:55 +0800, Macpaul Lin wrote:
>> Since MT6359 PMIC has been added as one of the compatibles of
>> "mediatek,mt6397.yaml", the sub-device node of "MT6359 PMIC AUXADC" and
>> "MT6359 PMIC Regulators" should also be contained in this DT Schema as
>> well.
>> 
>> This patch includes:
>>  - add 'adc' property and $ref for 'mediatek,mt6359-auxadc'.
>>  - add 'mt6359-regulator' to the compatibles of regulators.
>> 
>> Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
>> ---
>>  Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml | 7 +++++++
>>  1 file changed, 7 insertions(+)
>> 
> 
> Reviewed-by: Rob Herring (Arm) <robh at kernel.org>
> 

Thanks for the review. This patch will be merged into v7 patch of
the conversion of
Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml'

Thanks!
Macpaul Lin


From sumit.garg at linaro.org  Sun Sep 29 23:47:47 2024
From: sumit.garg at linaro.org (Sumit Garg)
Date: Mon, 30 Sep 2024 12:17:47 +0530
Subject: [Linaro-mm-sig] Re: [RFC PATCH 0/4] Linaro restricted heap
In-Reply-To: <7c9e3a1a6092f6574c17d7206767ece0bcefc81f.camel@ndufresne.ca>
References: <20240830070351.2855919-1-jens.wiklander@linaro.org>
 <dhxvyshwi4qmcmwceokhqey2ww4azjcs6qrpnkgivdj7tv5cke@r36srvvbof6q>
 <d8e0cb78-7cfb-42bf-b3a5-f765592e8dd4@ti.com> <mzur3odofwwrdqnystozjgf3qtvb73wqjm6g2vf5dfsqiehaxk@u67fcarhm6ge>
 <e967e382-6cca-4dee-8333-39892d532f71@gmail.com> <lk7a2xuqrctyywuanjwseh5lkcz3soatc2zf3kn3uwc43pdyic@edm3hcd2koas>
 <04caa788-19a6-4336-985c-4eb191c24438@amd.com> <2f9a4abe-b2fc-4bc7-9926-1da2d38f5080@linaro.org>
 <CAFA6WYMd46quafJoGXjkCiPOKpYoDZdXwrNbG3QekyjB3_2FTA@mail.gmail.com> <7c9e3a1a6092f6574c17d7206767ece0bcefc81f.camel@ndufresne.ca>
Message-ID: <CAFA6WYPtp3H5JhxzgH9=z2EvNL7Kdku3EmG1aDkTS-gjFtNZZA@mail.gmail.com>

On Sat, 28 Sept 2024 at 01:20, Nicolas Dufresne <nicolas at ndufresne.ca> wrote:
>
> Le jeudi 26 septembre 2024 ? 19:22 +0530, Sumit Garg a ?crit :
> > [Resend in plain text format as my earlier message was rejected by
> > some mailing lists]
> >
> > On Thu, 26 Sept 2024 at 19:17, Sumit Garg <sumit.garg at linaro.org> wrote:
> > >
> > > On 9/25/24 19:31, Christian K?nig wrote:
> > >
> > > Am 25.09.24 um 14:51 schrieb Dmitry Baryshkov:
> > >
> > > On Wed, Sep 25, 2024 at 10:51:15AM GMT, Christian K?nig wrote:
> > >
> > > Am 25.09.24 um 01:05 schrieb Dmitry Baryshkov:
> > >
> > > On Tue, Sep 24, 2024 at 01:13:18PM GMT, Andrew Davis wrote:
> > >
> > > On 9/23/24 1:33 AM, Dmitry Baryshkov wrote:
> > >
> > > Hi,
> > >
> > > On Fri, Aug 30, 2024 at 09:03:47AM GMT, Jens Wiklander wrote:
> > >
> > > Hi,
> > >
> > > This patch set is based on top of Yong Wu's restricted heap patch set [1].
> > > It's also a continuation on Olivier's Add dma-buf secure-heap patch set [2].
> > >
> > > The Linaro restricted heap uses genalloc in the kernel to manage the heap
> > > carvout. This is a difference from the Mediatek restricted heap which
> > > relies on the secure world to manage the carveout.
> > >
> > > I've tried to adress the comments on [2], but [1] introduces changes so I'm
> > > afraid I've had to skip some comments.
> > >
> > > I know I have raised the same question during LPC (in connection to
> > > Qualcomm's dma-heap implementation). Is there any reason why we are
> > > using generic heaps instead of allocating the dma-bufs on the device
> > > side?
> > >
> > > In your case you already have TEE device, you can use it to allocate and
> > > export dma-bufs, which then get imported by the V4L and DRM drivers.
> > >
> > > This goes to the heart of why we have dma-heaps in the first place.
> > > We don't want to burden userspace with having to figure out the right
> > > place to get a dma-buf for a given use-case on a given hardware.
> > > That would be very non-portable, and fail at the core purpose of
> > > a kernel: to abstract hardware specifics away.
> > >
> > > Unfortunately all proposals to use dma-buf heaps were moving in the
> > > described direction: let app select (somehow) from a platform- and
> > > vendor- specific list of dma-buf heaps. In the kernel we at least know
> > > the platform on which the system is running. Userspace generally doesn't
> > > (and shouldn't). As such, it seems better to me to keep the knowledge in
> > > the kernel and allow userspace do its job by calling into existing
> > > device drivers.
> > >
> > > The idea of letting the kernel fully abstract away the complexity of inter
> > > device data exchange is a completely failed design. There has been plenty of
> > > evidence for that over the years.
> > >
> > > Because of this in DMA-buf it's an intentional design decision that
> > > userspace and *not* the kernel decides where and what to allocate from.
> > >
> > > Hmm, ok.
> > >
> > > What the kernel should provide are the necessary information what type of
> > > memory a device can work with and if certain memory is accessible or not.
> > > This is the part which is unfortunately still not well defined nor
> > > implemented at the moment.
> > >
> > > Apart from that there are a whole bunch of intentional design decision which
> > > should prevent developers to move allocation decision inside the kernel. For
> > > example DMA-buf doesn't know what the content of the buffer is (except for
> > > it's total size) and which use cases a buffer will be used with.
> > >
> > > So the question if memory should be exposed through DMA-heaps or a driver
> > > specific allocator is not a question of abstraction, but rather one of the
> > > physical location and accessibility of the memory.
> > >
> > > If the memory is attached to any physical device, e.g. local memory on a
> > > dGPU, FPGA PCIe BAR, RDMA, camera internal memory etc, then expose the
> > > memory as device specific allocator.
> > >
> > > So, for embedded systems with unified memory all buffers (maybe except
> > > PCIe BARs) should come from DMA-BUF heaps, correct?
> > >
> > >
> > > From what I know that is correct, yes. Question is really if that will stay this way.
> > >
> > > Neural accelerators look a lot stripped down FPGAs these days and the benefit of local memory for GPUs is known for decades.
> > >
> > > Could be that designs with local specialized memory see a revival any time, who knows.
> > >
> > > If the memory is not physically attached to any device, but rather just
> > > memory attached to the CPU or a system wide memory controller then expose
> > > the memory as DMA-heap with specific requirements (e.g. certain sized pages,
> > > contiguous, restricted, encrypted, ...).
> > >
> > > Is encrypted / protected a part of the allocation contract or should it
> > > be enforced separately via a call to TEE / SCM / anything else?
> > >
> > >
> > > Well that is a really good question I can't fully answer either. From what I know now I would say it depends on the design.
> > >
> >
> > IMHO, I think Dmitry's proposal to rather allow the TEE device to be
> > the allocator and exporter of DMA-bufs related to restricted memory
> > makes sense to me. Since it's really the TEE implementation (OP-TEE,
> > AMD-TEE, TS-TEE or future QTEE) which sets up the restrictions on a
> > particular piece of allocated memory. AFAIK, that happens after the
> > DMA-buf gets allocated and then user-space calls into TEE to set up
> > which media pipeline is going to access that particular DMA-buf. It
> > can also be a static contract depending on a particular platform
> > design.
>
> When the memory get the protection is hardware specific. Otherwise the design
> would be really straightforward, allocate from the a heap or any random driver
> API and protect that memory through an call into the TEE. Clear seperation would
> be amazingly better, but this is not how hardware and firmware designer have
> seen it.
>
> In some implementation, there is a carving of memory that be protected before
> the kernel is booted. I believe (but I'm not affiliated with them) that MTK has
> hardware restriction making that design the only usable method.

Yeah I agree with that. The point I am making here is that the TEE
subsystem can abstract all that platform/vendor specific methods for
user-space to allocate restricted memory. We already have a similar
infrastructure for shared memory among Linux and TEE implementation.
The user-space only uses TEE_IOC_SHM_ALLOC [1] where underneath it can
either allocate from static carveout of shared memory (as a reserved
memory region) OR simply allocate from the kernel heap which is
dynamically mapped into the TEE implementation. The choice here
depends on the platform/TEE implementation capability.

[1] https://docs.kernel.org/userspace-api/tee.html

>
> In general, the handling of secure memory is bound to the TEE application for
> the specific platform, it has to be separated from the generic part of tee
> drivers anyway,

It is really the TEE implementation core which has the privileges to
mark a piece of memory as restricted/secure. The TEE application in
MTK is likely a pseudo TA (a terminology similar to Linux kernel
modules in the TEE world). So it is rather easier for TEE
implementation drivers to abstract out the communication with the
vendor specific TEE core implementation.

> and dmabuf heaps is in my opinion the right API for the task.

Do you really think it is better for user-space to deal with vendor
specific dmabuf heaps?

>
> On MTK, if you have followed, when the SCP (their co-processor) is handling
> restricted video, you can't even call into it anymore directly. So to drive the
> CODECs, everything has to be routed through the TEE. Would you say that because
> of that this should not be a V4L2 driver anymore ?

I am not conversant with the MTK hardware/firmware implementation. But
my point is the kernel shouldn't be exposing 10s of vendor specific
DMAbuf heaps to the user-space to choose from which can rather be just
a single TEE device IOCTL used to allocate restricted memory.

>
> >
> > As Jens noted in the other thread, we already manage shared memory
> > allocations (from a static carve-out or dynamically mapped) for
> > communications among Linux and TEE that were based on DMA-bufs earlier
> > but since we didn't required them to be shared with other devices, so
> > we rather switched to anonymous memory.
> >
> > From user-space perspective, it's cleaner to use TEE device IOCTLs for
> > DMA-buf allocations since it already knows which underlying TEE
> > implementation it's communicating with rather than first figuring out
> > which DMA heap to use for allocation and then communicating with TEE
> > implementation.
>
> As a user-space developer in the majority of my time, adding common code to
> handle dma heaps is a lot easier and straight forward then having to glue all
> the different allocators implement in various subsystems. Communicating which
> heap to work can be generic and simple.

Yeah I agree with that notion but IMHO having ifdefry to select vendor
specific DMA heaps isn't something user-space should be dealing with.

-Sumit

>
> Nicolas
>


From vignesh.raman at collabora.com  Mon Sep 30 00:31:55 2024
From: vignesh.raman at collabora.com (Vignesh Raman)
Date: Mon, 30 Sep 2024 13:01:55 +0530
Subject: [PATCH v3] docs/gpu: ci: update flake tests requirements
In-Reply-To: <ZvbCzqvyeTI_j2cD@intel.com>
References: <20240927052416.1833889-1-vignesh.raman@collabora.com>
 <ZvbCzqvyeTI_j2cD@intel.com>
Message-ID: <5fd48673-571a-4750-9704-e172f7ea372f@collabora.com>

Hi Rodrigo,

On 27/09/24 20:05, Rodrigo Vivi wrote:
> On Fri, Sep 27, 2024 at 10:54:14AM +0530, Vignesh Raman wrote:
>> Update the documentation to specify linking to a relevant GitLab
>> issue or email report for each new flake entry. Added specific
>> GitLab issue urls for i915, msm and amdgpu driver.
>>
>> Acked-by: Abhinav Kumar <quic_abhinavk at quicinc.com> # msm
>> Acked-by: Dmitry Baryshkov <dmitry.baryshkov at linaro.org> # msm
>> Signed-off-by: Vignesh Raman <vignesh.raman at collabora.com>
>> ---
>>
>> v2:
>> - Add gitlab issue link for msm driver.
>>
>> v3:
>> - Update docs to specify we use email reporting or GitLab issues for flake entries.
>>
>> ---
>>   Documentation/gpu/automated_testing.rst | 13 +++++++++----
>>   1 file changed, 9 insertions(+), 4 deletions(-)
>>
>> diff --git a/Documentation/gpu/automated_testing.rst b/Documentation/gpu/automated_testing.rst
>> index 2d5a28866afe..03769b4a17cf 100644
>> --- a/Documentation/gpu/automated_testing.rst
>> +++ b/Documentation/gpu/automated_testing.rst
>> @@ -68,19 +68,24 @@ known to behave unreliably. These tests won't cause a job to fail regardless of
>>   the result. They will still be run.
>>   
>>   Each new flake entry must be associated with a link to the email reporting the
>> -bug to the author of the affected driver, the board name or Device Tree name of
>> -the board, the first kernel version affected, the IGT version used for tests,
>> -and an approximation of the failure rate.
>> +bug to the author of the affected driver or the relevant GitLab issue. The entry
>> +must also include the board name or Device Tree name, the first kernel version
>> +affected, the IGT version used for tests, and an approximation of the failure rate.
>>   
>>   They should be provided under the following format::
>>   
>> -  # Bug Report: $LORE_OR_PATCHWORK_URL
>> +  # Bug Report: $LORE_URL_OR_GITLAB_ISSUE
>>     # Board Name: broken-board.dtb
>>     # Linux Version: 6.6-rc1
>>     # IGT Version: 1.28-gd2af13d9f
>>     # Failure Rate: 100
>>     flaky-test
>>   
>> +Use the appropriate link below to create a GitLab issue:
>> +amdgpu driver: https://gitlab.freedesktop.org/drm/amd/-/issues
>> +i915 driver: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues
> 
> Probably good to add:
> 
> xe driver: https://gitlab.freedesktop.org/drm/xe/kernel/-/issues

Sure, will add it.

> 
> Acked-by: Rodrigo Vivi <rodrigo.vivi at intel.com>

Thanks.

> 
>> +msm driver: https://gitlab.freedesktop.org/drm/msm/-/issues
>> +
>>   drivers/gpu/drm/ci/${DRIVER_NAME}-${HW_REVISION}-skips.txt
>>   -----------------------------------------------------------
>>   
>> -- 
>> 2.43.0
>>

Regards,
Vignesh


From macpaul.lin at mediatek.com  Mon Sep 30 00:33:10 2024
From: macpaul.lin at mediatek.com (Macpaul Lin)
Date: Mon, 30 Sep 2024 15:33:10 +0800
Subject: [PATCH v7 2/3] ASoC: dt-bindings: mt6358: Convert to DT Schema
In-Reply-To: <20240930073311.1486-1-macpaul.lin@mediatek.com>
References: <20240930073311.1486-1-macpaul.lin@mediatek.com>
Message-ID: <20240930073311.1486-2-macpaul.lin@mediatek.com>

Convert the MediaTek MT6358 Audio CODEC bindings to DT schema.

This change implements the following updates:
1. Compatible property: Added the const 'mediatek,mt6358-sound'
   to ensure alignment with the schema in the actual (DTS) file
   "mt8186-corsola.dtsi" with 'mediatek,mt6366-sound'.
2. Example: Removed the example section, as it should be relocated to
   the MT6397 PMIC file 'mfd/mediatek,mt6397.yaml'.

Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
---
 .../devicetree/bindings/sound/mt6358.txt      | 26 ------------
 .../devicetree/bindings/sound/mt6358.yaml     | 41 +++++++++++++++++++
 2 files changed, 41 insertions(+), 26 deletions(-)
 delete mode 100644 Documentation/devicetree/bindings/sound/mt6358.txt
 create mode 100644 Documentation/devicetree/bindings/sound/mt6358.yaml

Changess for v1~v6:
 - It was not in the origin patch set.

Changes for v7:
 - It is seperated from the origin patch set (2/2, v6).
   It could simplifies the audio-codec node in next patch (3/3, v7)
   of 'mfd/mediatek,mt6397.yaml'

diff --git a/Documentation/devicetree/bindings/sound/mt6358.txt b/Documentation/devicetree/bindings/sound/mt6358.txt
deleted file mode 100644
index fbe9e55c68f5..000000000000
--- a/Documentation/devicetree/bindings/sound/mt6358.txt
+++ /dev/null
@@ -1,26 +0,0 @@
-Mediatek MT6358 Audio Codec
-
-The communication between MT6358 and SoC is through Mediatek PMIC wrapper.
-For more detail, please visit Mediatek PMIC wrapper documentation.
-
-Must be a child node of PMIC wrapper.
-
-Required properties:
-
-- compatible - "string" - One of:
-    "mediatek,mt6358-sound"
-    "mediatek,mt6366-sound"
-- Avdd-supply : power source of AVDD
-
-Optional properties:
-- mediatek,dmic-mode : Indicates how many data pins are used to transmit two
-	channels of PDM signal. 0 means two wires, 1 means one wire. Default
-	value is 0.
-
-Example:
-
-mt6358_snd {
-	compatible = "mediatek,mt6358-sound";
-	Avdd-supply = <&mt6358_vaud28_reg>;
-	mediatek,dmic-mode = <0>;
-};
diff --git a/Documentation/devicetree/bindings/sound/mt6358.yaml b/Documentation/devicetree/bindings/sound/mt6358.yaml
new file mode 100644
index 000000000000..5f7611e26a89
--- /dev/null
+++ b/Documentation/devicetree/bindings/sound/mt6358.yaml
@@ -0,0 +1,41 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/sound/mt6358.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Mediatek MT6358 Audio Codec
+
+maintainers:
+  - Jiaxin Yu <jiaxin.yu at mediatek.com>
+  - Macpaul Lin <macpaul.lin at mediatek.com>
+
+description: |
+  The communication between MT6358 and SoC is through Mediatek PMIC wrapper.
+  For more detail, please visit Mediatek PMIC wrapper documentation.
+  Must be a child node of PMIC wrapper.
+
+properties:
+  compatible:
+    enum:
+      - mediatek,mt6366-sound
+      - mediatek,mt6358-sound
+    const: mediatek,mt6358-sound
+
+  Avdd-supply:
+    description: Power source of AVDD
+
+  mediatek,dmic-mode:
+    $ref: /schemas/types.yaml#/definitions/uint32
+    description: |
+      Indicates how many data pins are used to transmit two channels of PDM
+      signal. 0 means two wires, 1 means one wire. Default value is 0.
+    enum:
+      - 0 # two wires
+      - 1 # one wire
+
+required:
+  - compatible
+  - Avdd-supply
+
+additionalProperties: false
-- 
2.45.2



From macpaul.lin at mediatek.com  Mon Sep 30 00:33:09 2024
From: macpaul.lin at mediatek.com (Macpaul Lin)
Date: Mon, 30 Sep 2024 15:33:09 +0800
Subject: [PATCH v7 1/3] regulator: dt-bindings: mt6323: Convert to DT schema
Message-ID: <20240930073311.1486-1-macpaul.lin@mediatek.com>

Convert the MT6323 regulator binding from the old text-based format to
the new DT schema style. The property "regulator-name" has been added
as required property to reflect current usage in mt6323.dtsi.

Examples have been streamlined and relocated to the parent schema file:
  mfd/mediatek,mt6397.yaml.

Update maintainer and submitter information with new entries from MediaTek.

The reference document cited in "mediatek,mt7530.yaml" has been updated
to point to this new DT schema file

Signed-off-by: Sen Chu <sen.chu at mediatek.com>
Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
Reviewed-by: Krzysztof Kozlowski <krzk at kernel.org>
Acked-by: Mark Brown <broonie at kernel.org>
---
 .../bindings/net/dsa/mediatek,mt7530.yaml     |   4 +-
 .../regulator/mediatek,mt6323-regulator.yaml  | 119 +++++++++
 .../bindings/regulator/mt6323-regulator.txt   | 237 ------------------
 3 files changed, 121 insertions(+), 239 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/regulator/mediatek,mt6323-regulator.yaml
 delete mode 100644 Documentation/devicetree/bindings/regulator/mt6323-regulator.txt

Changes for v1 and v2:
 - This is the first version of converting mt6323-regulator.
   This is because converting mt6323-regulator together
   with mfd/mediatek,mt6397.yaml, so we've create a patch set
   instead of single patch for each skydives.
 - This patch has been made base on linux-next/master git repo.

Changes for v3:
 - Rebased on linux-next/master git repo near next-20240906.
 - Added 'regulator-name' to 'requried' property to reflect current usage.
 - replace ^(buck_)? and ^(ldo_)? to ^buck_ and ^ldo_ prefix.
 - Update file name of 'mediatek,mt6323-regulator.yaml' in
   'mediatek,mt7530.yaml'

Changes for v4:
 - No change.

Changes for v5:
 - Add "Reviewed-by" in commit message. Thanks for the review!
 - Remove a blank line at EOF whcih causes whitespace warning
   when 'git am' the patch.

Changes for v6:
 - No change.

Change for v7:
 - Add "Acked-by" tag, Thanks for the review.

diff --git a/Documentation/devicetree/bindings/net/dsa/mediatek,mt7530.yaml b/Documentation/devicetree/bindings/net/dsa/mediatek,mt7530.yaml
index ea979bcae1d6..413db386f090 100644
--- a/Documentation/devicetree/bindings/net/dsa/mediatek,mt7530.yaml
+++ b/Documentation/devicetree/bindings/net/dsa/mediatek,mt7530.yaml
@@ -129,8 +129,8 @@ properties:
   io-supply:
     description: |
       Phandle to the regulator node necessary for the I/O power.
-      See Documentation/devicetree/bindings/regulator/mt6323-regulator.txt for
-      details for the regulator setup on these boards.
+      See Documentation/devicetree/bindings/regulator/mediatek,mt6323-regulator.yaml
+      for details for the regulator setup on these boards.
 
   mediatek,mcm:
     type: boolean
diff --git a/Documentation/devicetree/bindings/regulator/mediatek,mt6323-regulator.yaml b/Documentation/devicetree/bindings/regulator/mediatek,mt6323-regulator.yaml
new file mode 100644
index 000000000000..9bc9aa9a4eb7
--- /dev/null
+++ b/Documentation/devicetree/bindings/regulator/mediatek,mt6323-regulator.yaml
@@ -0,0 +1,119 @@
+# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/regulator/mediatek,mt6323-regulator.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: MediaTek MT6323 Regulator
+
+maintainers:
+  - John Crispin <john at phrozen.org>
+  - Sen Chu <sen.chu at mediatek.com>
+  - Macpaul Lin <macpaul.lin at mediatek.com>
+
+description: |
+  Regulator node of the PMIC. This node should under the PMIC's device node.
+  All voltage regulators provided by the PMIC are described as sub-nodes of
+  this node.
+
+properties:
+  compatible:
+    items:
+      - const: mediatek,mt6323-regulator
+
+patternProperties:
+  "^buck_v(pa|proc|sys)$":
+    description: Buck regulators
+    type: object
+    $ref: regulator.yaml#
+
+    properties:
+      regulator-allowed-modes: false
+
+    unevaluatedProperties: false
+
+    required:
+      - regulator-name
+
+  "^ldo_v(camio|cn18)$":
+    description: LDO with fixed 1.8V output and 0~100/10mV tuning
+    type: object
+    $ref: regulator.yaml#
+
+    properties:
+      regulator-allowed-modes: false
+
+    unevaluatedProperties: false
+
+    required:
+      - regulator-name
+
+  "^ldo_v((io|rf)18)$":
+    description: LDOs with fixed 1.825V output and 0~100/10mV tuning
+    type: object
+    $ref: regulator.yaml#
+
+    properties:
+      regulator-allowed-modes: false
+
+    unevaluatedProperties: false
+
+    required:
+      - regulator-name
+
+  "^ldo_v(a|rtc|tcxo|(cn|io)28)$":
+    description: LDOs with fixed 2.8V output and 0~100/10mV tuning
+    type: object
+    $ref: regulator.yaml#
+
+    properties:
+      regulator-allowed-modes: false
+
+    unevaluatedProperties: false
+
+    required:
+      - regulator-name
+
+  "^ldo_v(usb)$":
+    description: LDOs with fixed 3.3V output and 0~100/10mV tuning
+    type: object
+    $ref: regulator.yaml#
+
+    properties:
+      regulator-allowed-modes: false
+
+    unevaluatedProperties: false
+
+    required:
+      - regulator-name
+
+  "^ldo_v(cn33_(bt|wifi))$":
+    description: LDOs with variable 3.3V output and 0~100/10mV tuning
+    type: object
+    $ref: regulator.yaml#
+
+    properties:
+      regulator-allowed-modes: false
+
+    unevaluatedProperties: false
+
+    required:
+      - regulator-name
+
+  "^ldo_v(cama|camaf|camd|emc3v3|gp[123]|ibr|m|mc|mch|sim[12])$":
+    description: LDOs with variable output and 0~100/10mV tuning
+    type: object
+    $ref: regulator.yaml#
+
+    properties:
+      regulator-allowed-modes: false
+
+    unevaluatedProperties: false
+
+    required:
+      - regulator-name
+
+required:
+  - compatible
+
+additionalProperties: false
diff --git a/Documentation/devicetree/bindings/regulator/mt6323-regulator.txt b/Documentation/devicetree/bindings/regulator/mt6323-regulator.txt
deleted file mode 100644
index a48749db4df3..000000000000
--- a/Documentation/devicetree/bindings/regulator/mt6323-regulator.txt
+++ /dev/null
@@ -1,237 +0,0 @@
-Mediatek MT6323 Regulator
-
-All voltage regulators are defined as subnodes of the regulators node. A list
-of regulators provided by this controller are defined as subnodes of the
-PMIC's node. Each regulator is named according to its regulator type,
-buck_<name> and ldo_<name>. The definition for each of these nodes is defined
-using the standard binding for regulators at
-Documentation/devicetree/bindings/regulator/regulator.txt.
-
-The valid names for regulators are::
-BUCK:
-  buck_vproc, buck_vsys, buck_vpa
-LDO:
-  ldo_vtcxo, ldo_vcn28, ldo_vcn33_bt, ldo_vcn33_wifi, ldo_va, ldo_vcama,
-  ldo_vio28, ldo_vusb, ldo_vmc, ldo_vmch, ldo_vemc3v3, ldo_vgp1, ldo_vgp2,
-  ldo_vgp3, ldo_vcn18, ldo_vsim1, ldo_vsim2, ldo_vrtc, ldo_vcamaf, ldo_vibr,
-  ldo_vrf18, ldo_vm, ldo_vio18, ldo_vcamd, ldo_vcamio
-
-Example:
-
-	pmic: mt6323 {
-		mt6323regulator: regulators {
-			mt6323_vproc_reg: buck_vproc{
-				regulator-name = "vproc";
-				regulator-min-microvolt = < 700000>;
-				regulator-max-microvolt = <1350000>;
-				regulator-ramp-delay = <12500>;
-				regulator-always-on;
-				regulator-boot-on;
-			};
-
-			mt6323_vsys_reg: buck_vsys{
-				regulator-name = "vsys";
-				regulator-min-microvolt = <1400000>;
-				regulator-max-microvolt = <2987500>;
-				regulator-ramp-delay = <25000>;
-				regulator-always-on;
-				regulator-boot-on;
-			};
-
-			mt6323_vpa_reg: buck_vpa{
-				regulator-name = "vpa";
-				regulator-min-microvolt = < 500000>;
-				regulator-max-microvolt = <3650000>;
-			};
-
-			mt6323_vtcxo_reg: ldo_vtcxo{
-				regulator-name = "vtcxo";
-				regulator-min-microvolt = <2800000>;
-				regulator-max-microvolt = <2800000>;
-				regulator-enable-ramp-delay = <90>;
-				regulator-always-on;
-				regulator-boot-on;
-			};
-
-			mt6323_vcn28_reg: ldo_vcn28{
-				regulator-name = "vcn28";
-				regulator-min-microvolt = <2800000>;
-				regulator-max-microvolt = <2800000>;
-				regulator-enable-ramp-delay = <185>;
-			};
-
-			mt6323_vcn33_bt_reg: ldo_vcn33_bt{
-				regulator-name = "vcn33_bt";
-				regulator-min-microvolt = <3300000>;
-				regulator-max-microvolt = <3600000>;
-				regulator-enable-ramp-delay = <185>;
-			};
-
-			mt6323_vcn33_wifi_reg: ldo_vcn33_wifi{
-				regulator-name = "vcn33_wifi";
-				regulator-min-microvolt = <3300000>;
-				regulator-max-microvolt = <3600000>;
-				regulator-enable-ramp-delay = <185>;
-			};
-
-			mt6323_va_reg: ldo_va{
-				regulator-name = "va";
-				regulator-min-microvolt = <2800000>;
-				regulator-max-microvolt = <2800000>;
-				regulator-enable-ramp-delay = <216>;
-				regulator-always-on;
-				regulator-boot-on;
-			};
-
-			mt6323_vcama_reg: ldo_vcama{
-				regulator-name = "vcama";
-				regulator-min-microvolt = <1500000>;
-				regulator-max-microvolt = <2800000>;
-				regulator-enable-ramp-delay = <216>;
-			};
-
-			mt6323_vio28_reg: ldo_vio28{
-				regulator-name = "vio28";
-				regulator-min-microvolt = <2800000>;
-				regulator-max-microvolt = <2800000>;
-				regulator-enable-ramp-delay = <216>;
-				regulator-always-on;
-				regulator-boot-on;
-			};
-
-			mt6323_vusb_reg: ldo_vusb{
-				regulator-name = "vusb";
-				regulator-min-microvolt = <3300000>;
-				regulator-max-microvolt = <3300000>;
-				regulator-enable-ramp-delay = <216>;
-				regulator-boot-on;
-			};
-
-			mt6323_vmc_reg: ldo_vmc{
-				regulator-name = "vmc";
-				regulator-min-microvolt = <1800000>;
-				regulator-max-microvolt = <3300000>;
-				regulator-enable-ramp-delay = <36>;
-				regulator-boot-on;
-			};
-
-			mt6323_vmch_reg: ldo_vmch{
-				regulator-name = "vmch";
-				regulator-min-microvolt = <3000000>;
-				regulator-max-microvolt = <3300000>;
-				regulator-enable-ramp-delay = <36>;
-				regulator-boot-on;
-			};
-
-			mt6323_vemc3v3_reg: ldo_vemc3v3{
-				regulator-name = "vemc3v3";
-				regulator-min-microvolt = <3000000>;
-				regulator-max-microvolt = <3300000>;
-				regulator-enable-ramp-delay = <36>;
-				regulator-boot-on;
-			};
-
-			mt6323_vgp1_reg: ldo_vgp1{
-				regulator-name = "vgp1";
-				regulator-min-microvolt = <1200000>;
-				regulator-max-microvolt = <3300000>;
-				regulator-enable-ramp-delay = <216>;
-			};
-
-			mt6323_vgp2_reg: ldo_vgp2{
-				regulator-name = "vgp2";
-				regulator-min-microvolt = <1200000>;
-				regulator-max-microvolt = <3000000>;
-				regulator-enable-ramp-delay = <216>;
-			};
-
-			mt6323_vgp3_reg: ldo_vgp3{
-				regulator-name = "vgp3";
-				regulator-min-microvolt = <1200000>;
-				regulator-max-microvolt = <1800000>;
-				regulator-enable-ramp-delay = <216>;
-			};
-
-			mt6323_vcn18_reg: ldo_vcn18{
-				regulator-name = "vcn18";
-				regulator-min-microvolt = <1800000>;
-				regulator-max-microvolt = <1800000>;
-				regulator-enable-ramp-delay = <216>;
-			};
-
-			mt6323_vsim1_reg: ldo_vsim1{
-				regulator-name = "vsim1";
-				regulator-min-microvolt = <1800000>;
-				regulator-max-microvolt = <3000000>;
-				regulator-enable-ramp-delay = <216>;
-			};
-
-			mt6323_vsim2_reg: ldo_vsim2{
-				regulator-name = "vsim2";
-				regulator-min-microvolt = <1800000>;
-				regulator-max-microvolt = <3000000>;
-				regulator-enable-ramp-delay = <216>;
-			};
-
-			mt6323_vrtc_reg: ldo_vrtc{
-				regulator-name = "vrtc";
-				regulator-min-microvolt = <2800000>;
-				regulator-max-microvolt = <2800000>;
-				regulator-always-on;
-				regulator-boot-on;
-			};
-
-			mt6323_vcamaf_reg: ldo_vcamaf{
-				regulator-name = "vcamaf";
-				regulator-min-microvolt = <1200000>;
-				regulator-max-microvolt = <3300000>;
-				regulator-enable-ramp-delay = <216>;
-			};
-
-			mt6323_vibr_reg: ldo_vibr{
-				regulator-name = "vibr";
-				regulator-min-microvolt = <1200000>;
-				regulator-max-microvolt = <3300000>;
-				regulator-enable-ramp-delay = <36>;
-			};
-
-			mt6323_vrf18_reg: ldo_vrf18{
-				regulator-name = "vrf18";
-				regulator-min-microvolt = <1825000>;
-				regulator-max-microvolt = <1825000>;
-				regulator-enable-ramp-delay = <187>;
-			};
-
-			mt6323_vm_reg: ldo_vm{
-				regulator-name = "vm";
-				regulator-min-microvolt = <1200000>;
-				regulator-max-microvolt = <1800000>;
-				regulator-enable-ramp-delay = <216>;
-				regulator-always-on;
-				regulator-boot-on;
-			};
-
-			mt6323_vio18_reg: ldo_vio18{
-				regulator-name = "vio18";
-				regulator-min-microvolt = <1800000>;
-				regulator-max-microvolt = <1800000>;
-				regulator-enable-ramp-delay = <216>;
-				regulator-always-on;
-				regulator-boot-on;
-			};
-
-			mt6323_vcamd_reg: ldo_vcamd{
-				regulator-name = "vcamd";
-				regulator-min-microvolt = <1200000>;
-				regulator-max-microvolt = <1800000>;
-				regulator-enable-ramp-delay = <216>;
-			};
-
-			mt6323_vcamio_reg: ldo_vcamio{
-				regulator-name = "vcamio";
-				regulator-min-microvolt = <1800000>;
-				regulator-max-microvolt = <1800000>;
-				regulator-enable-ramp-delay = <216>;
-			};
-		};
-	};
-- 
2.45.2



From macpaul.lin at mediatek.com  Mon Sep 30 00:33:11 2024
From: macpaul.lin at mediatek.com (Macpaul Lin)
Date: Mon, 30 Sep 2024 15:33:11 +0800
Subject: [PATCH v7 3/3] dt-bindings: mfd: mediatek: mt6397: Convert to DT schema format
In-Reply-To: <20240930073311.1486-1-macpaul.lin@mediatek.com>
References: <20240930073311.1486-1-macpaul.lin@mediatek.com>
Message-ID: <20240930073311.1486-3-macpaul.lin@mediatek.com>

Convert the mfd: mediatek: mt6397 binding to DT schema format.

MT6323, MT6358, and MT6397 are PMIC devices with multiple function
subdevices. They share a common PMIC design but have variations in
subdevice combinations.

Key updates in this conversion:

1. RTC:
   - Convert rtc-mt6397.txt and merge into parent MT6397 PMIC DT schema.

2. Regulators:
   - Align to generic name "regulators".
   - Update references from .txt to .yaml for mt6323, mt6358, and mt6397
     regulators.
   - Simplify regulator name labels in device tree examples.
   - Add a new 'mt6359-regulator' to the compatibles of regulators.
     Merge from the other patch [1].

3. ADC:
   - Add a new 'adc' property and include a $ref for sub-device node of
     MT6359 PMIC AUXADC: 'mediatek,mt6359-auxadc'.
     Merge from the other patch [1].

4. Audio Codec:
   - Simplify Audio Codec part with updating compatible items.
   - Add 'mt6359-codec' to the compatible.

5. Clocks:
   - Align to generic name "clocks" for clockbuffer subdevices.

6. LEDs:
   - Convert leds-mt6323.txt and merge into parent MT6397 PMIC DT schema.
   - Update LED binding.

7. Keys:
   - Add detailed descriptions for power and home keys.
   - Add compatible: mediatek,mt6358-keys.

8. Power Controller:
   - Convert mt6323-poweroff.txt and merge into parent MT6397 PMIC DT
     schema.
   - Add #power-domain-cells property to fix dt-binding check error.
   - Clarify "BBPU" as "Baseband power up".

9. Pinctrl:
   - Align to generic name "pinctrl" instead of "pin-controller".

10. Compatible:
   - Drop "mediatek,mt6357" since there is a separated DT Schema
     for PMIC MT6357.

11. Examples:
   - MT6323: Retain complete examples for this PMIC.
   - MT6358 and MT6397: simplify settings in regulators.
    - Preserve "audio-codec", "clocks", "pinctrl", "rtc", and "keys"
      sections as they contain typical settings for different PMICs.

Additional updates:
- MAINTAINERS: Add co-maintainers and reference to
  mfd/mediatek,mt6397.yaml for LED and power-controller drivers.
- input/mediatek,pmic-keys.yaml: Update reference to
  mfd/mediatek,mt6397.yaml.

References:
[1] https://lore.kernel.org/all/20240925171156.9115-1-macpaul.lin at mediatek.com/

Signed-off-by: Sen Chu <sen.chu at mediatek.com>
Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
---
 .../bindings/input/mediatek,pmic-keys.yaml    |   2 +-
 .../devicetree/bindings/leds/leds-mt6323.txt  |  63 --
 .../bindings/mfd/mediatek,mt6397.yaml         | 596 ++++++++++++++++++
 .../devicetree/bindings/mfd/mt6397.txt        | 110 ----
 .../bindings/power/reset/mt6323-poweroff.txt  |  20 -
 .../devicetree/bindings/rtc/rtc-mt6397.txt    |  31 -
 MAINTAINERS                                   |   8 +-
 7 files changed, 603 insertions(+), 227 deletions(-)
 delete mode 100644 Documentation/devicetree/bindings/leds/leds-mt6323.txt
 create mode 100644 Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml
 delete mode 100644 Documentation/devicetree/bindings/mfd/mt6397.txt
 delete mode 100644 Documentation/devicetree/bindings/power/reset/mt6323-poweroff.txt
 delete mode 100644 Documentation/devicetree/bindings/rtc/rtc-mt6397.txt

Changes for v1:
 - This patch depends on conversion of mediatek,mt6397-regulator.yaml
   [1] https://lore.kernel.org/lkml/20240807091738.18387-1-macpaul.lin at mediatek.com/T/

Changes for v2:
 - This patch has been made base on linux-next/master git repo.
 - Keep the parent and child relationship with mediatek,pwrap in description.
   [2] https://lore.kernel.org/all/20240826-slurp-earphone-0d5173923ae8 at spud/
 - Keep the $ref for regulators since dt_binding_check didn't report any issue
   based on linux-next/master repo.
 - Fix description of mt6397/mt6323 devices, use "power management chip"
   instead of "multifunction device"
 - Drop unnecessary comments or description according to the review.
 - Convert sub-modules to DT Schema:
  - RTC, LEDs, power-controllers, regulators
 - Drop duplicate sub node name and description for sub-modules
  - RTC, Keys
 - examples:
  - drop parent pwrap node
  - Add examples from mediatek,mt6323-regulator.yaml
  - Add examples from mediatek,mt6358-regulator.yaml
  - Add examples from mediatek,mt6397-regulator.yaml
  - Complete the examples as could as possible.

Changes for v3:
 - Rebased on linux-next/master git repo near next-20240906.
 - Revise commit message.
 - Regulators:
  - Use "additionalProperties: true" and add "contains" for matching
    $ref DT bindings.
  - Simplify regulator name labels in device tree examples.
 - LEDs:
  - Use LED bindings.
 - Squash following patches in v2 for removing old text format DT bindings
   into this patch, includes:
  - leds-mt6323.txt, mt6323-poweroff.txt, rtc-mt6397.txt, sound/mt6358.txt.
 - Fix file format of DT schemas, add blank between properties.
 - Fix 'make checkrefdoc' errors, update reference in mediatek,pmic-keys.yaml.

Changes for v4:
 - Remove "mediatek,mt6357" from PMIC's compatible string since there is a
   seperated DT schema for PMIC mt6357.

Changes for v5:
 - Rebase to next-20240913 (linux-next/master).
 - Fix the "title" (device type) of mfd/mediatek,mt6397.yaml to "PMIC".
 - RTC:
  - Drop "start-year"
 - Regulators:
  - Add blank lines between description and properties.
  - Drop allOf for the $ref section on property.
 - clocks:
  - Fix no need '|' in descriptoin.
  - Add blank lines between description and properties.
 - Keys:
  - Drop compatible since these enums are already in $ref.
 - pinctrl:
  - Drop compatible since it is already in $ref.
 - examples:
  - Fix indentations for leds and keys.

Changes for v6:
 - Commit message:
  - Add note for simplifying examples of mt6358 and mt6397.
 - examples:
  - Fix indentations for mt6323-keys.
  - MT6358 and MT6397: simplify settings in regulators.
   - Preserve "audio-codec", "clocks", "pinctrl", "rtc", and "keys"
     sections as they contain typical settings for different PMICs.

Changes for v7:
 - Add reference patch in commit message
  - https://lore.kernel.org/all/20240925171156.9115-1-macpaul.lin at mediatek.com/
 - adc:
  - Merge adc property from patch [1], which is newly added and was not
    in the origin text format bindings.
  - Re-order items in commit messages.
 - regulators:
  - Merge new compatible 'mt6359-regulator' from patch [1], which is newly
    added and was not in the origin text format bindings.
 - audio-codec:
  - Simplify Audio Codec part with updating compatible items.
   - Add 'mt6359-codec' to the compatible.
   - Depends on the newly added mt6358.yaml (2/3 of v7) in this v7 patch set.

diff --git a/Documentation/devicetree/bindings/input/mediatek,pmic-keys.yaml b/Documentation/devicetree/bindings/input/mediatek,pmic-keys.yaml
index 70567d92c746..466566ae7f10 100644
--- a/Documentation/devicetree/bindings/input/mediatek,pmic-keys.yaml
+++ b/Documentation/devicetree/bindings/input/mediatek,pmic-keys.yaml
@@ -19,7 +19,7 @@ description: |
   by the PMIC that is defined as a Multi-Function Device (MFD).
 
   For MediaTek MT6323/MT6397 PMIC bindings see
-  Documentation/devicetree/bindings/mfd/mt6397.txt
+  Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml
 
 properties:
   compatible:
diff --git a/Documentation/devicetree/bindings/leds/leds-mt6323.txt b/Documentation/devicetree/bindings/leds/leds-mt6323.txt
deleted file mode 100644
index 052dccb8f2ce..000000000000
--- a/Documentation/devicetree/bindings/leds/leds-mt6323.txt
+++ /dev/null
@@ -1,63 +0,0 @@
-Device Tree Bindings for LED support on MT6323 PMIC
-
-MT6323 LED controller is subfunction provided by MT6323 PMIC, so the LED
-controllers are defined as the subnode of the function node provided by MT6323
-PMIC controller that is being defined as one kind of Muti-Function Device (MFD)
-using shared bus called PMIC wrapper for each subfunction to access remote
-MT6323 PMIC hardware.
-
-For MT6323 MFD bindings see:
-Documentation/devicetree/bindings/mfd/mt6397.txt
-For MediaTek PMIC wrapper bindings see:
-Documentation/devicetree/bindings/soc/mediatek/mediatek,pwrap.yaml
-
-Required properties:
-- compatible : Must be one of
-  - "mediatek,mt6323-led"
-  - "mediatek,mt6331-led"
-  - "mediatek,mt6332-led"
-- address-cells : Must be 1
-- size-cells : Must be 0
-
-Each led is represented as a child node of the mediatek,mt6323-led that
-describes the initial behavior for each LED physically and currently only four
-LED child nodes can be supported.
-
-Required properties for the LED child node:
-- reg : LED channel number (0..3)
-
-Optional properties for the LED child node:
-- label : See Documentation/devicetree/bindings/leds/common.txt
-- linux,default-trigger : See Documentation/devicetree/bindings/leds/common.txt
-- default-state: See Documentation/devicetree/bindings/leds/common.txt
-
-Example:
-
-	mt6323: pmic {
-		compatible = "mediatek,mt6323";
-
-		...
-
-		mt6323led: leds {
-			compatible = "mediatek,mt6323-led";
-			#address-cells = <1>;
-			#size-cells = <0>;
-
-			led at 0 {
-				reg = <0>;
-				label = "LED0";
-				linux,default-trigger = "timer";
-				default-state = "on";
-			};
-			led at 1 {
-				reg = <1>;
-				label = "LED1";
-				default-state = "off";
-			};
-			led at 2 {
-				reg = <2>;
-				label = "LED2";
-				default-state = "on";
-			};
-		};
-	};
diff --git a/Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml b/Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml
new file mode 100644
index 000000000000..adbe4d64844b
--- /dev/null
+++ b/Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml
@@ -0,0 +1,596 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/mfd/mediatek,mt6397.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: MediaTek MT6397/MT6323 PMIC
+
+maintainers:
+  - Sen Chu <sen.chu at mediatek.com>
+  - Macpaul Lin <macpaul.lin at mediatek.com>
+
+description: |
+  MT6397/MT6323 is a power management system chip.
+  Please see the sub-modules below for supported features.
+
+  MT6397/MT6323 is a multifunction device with the following sub modules:
+  - Regulators
+  - RTC
+  - ADC
+  - Audio codec
+  - GPIO
+  - Clock
+  - LED
+  - Keys
+  - Power controller
+
+  It is interfaced to host controller using SPI interface by a proprietary hardware
+  called PMIC wrapper or pwrap. MT6397/MT6323 PMIC is a child device of pwrap.
+  See the following for pwrap node definitions:
+  Documentation/devicetree/bindings/soc/mediatek/mediatek,pwrap.yaml
+
+properties:
+  compatible:
+    oneOf:
+      - enum:
+          - mediatek,mt6323
+          - mediatek,mt6331 # "mediatek,mt6331" for PMIC MT6331 and MT6332.
+          - mediatek,mt6358
+          - mediatek,mt6359
+          - mediatek,mt6397
+      - items:
+          - enum:
+              - mediatek,mt6366
+          - const: mediatek,mt6358
+
+  interrupts:
+    maxItems: 1
+
+  interrupt-controller: true
+
+  "#interrupt-cells":
+    const: 2
+
+  rtc:
+    type: object
+    $ref: /schemas/rtc/rtc.yaml#
+    unevaluatedProperties: false
+    description:
+      MT6397 Real Time Clock.
+
+    properties:
+      compatible:
+        oneOf:
+          - enum:
+              - mediatek,mt6323-rtc
+              - mediatek,mt6331-rtc
+              - mediatek,mt6358-rtc
+              - mediatek,mt6397-rtc
+          - items:
+              - enum:
+                  - mediatek,mt6366-rtc
+              - const: mediatek,mt6358-rtc
+
+    required:
+      - compatible
+
+  regulators:
+    type: object
+    description:
+      List of child nodes that specify the regulators.
+    additionalProperties: true
+
+    properties:
+      compatible:
+        oneOf:
+          - enum:
+              - mediatek,mt6323-regulator
+              - mediatek,mt6358-regulator
+              - mediatek,mt6359-regulator
+              - mediatek,mt6397-regulator
+          - items:
+              - enum:
+                  - mediatek,mt6366-regulator
+              - const: mediatek,mt6358-regulator
+
+    required:
+      - compatible
+
+  adc:
+    type: object
+    $ref: /schemas/iio/adc/mediatek,mt6359-auxadc.yaml#
+    unevaluatedProperties: false
+
+  audio-codec:
+    type: object
+    description:
+      Audio codec support with MT6358, MT6359, and MT6397.
+    additionalProperties: true
+
+    properties:
+      compatible:
+        oneOf:
+          - enum:
+              - mediatek,mt6358-sound
+              - mediatek,mt6359-codec
+              - mediatek,mt6397-codec
+          - items:
+              - enum:
+                  - mediatek,mt6366-sound
+              - const: mediatek,mt6358-sound
+
+    required:
+      - compatible
+
+  clocks:
+    type: object
+    additionalProperties: false
+    description:
+      This is a clock buffer node for mt6397. However, there are no sub nodes
+      or any public document exposed in public.
+
+    properties:
+      compatible:
+        const: mediatek,mt6397-clk
+
+      '#clock-cells':
+        const: 1
+
+    required:
+      - compatible
+
+  leds:
+    type: object
+    additionalProperties: false
+    description: |
+      MT6323 LED controller is subfunction provided by MT6323 PMIC, so the LED
+      controllers are defined as the subnode of the function node provided by MT6323
+      PMIC controller that is being defined as one kind of Muti-Function Device (MFD)
+      using shared bus called PMIC wrapper for each subfunction to access remote
+      MT6323 PMIC hardware.
+
+      Each led is represented as a child node of the mediatek,mt6323-led that
+      describes the initial behavior for each LED physically and currently only four
+      LED child nodes can be supported.
+
+    properties:
+      compatible:
+        enum:
+          - mediatek,mt6323-led
+          - mediatek,mt6331-led
+          - mediatek,mt6332-led
+
+      reg:
+        maxItems: 1
+
+      "#address-cells":
+        const: 1
+
+      "#size-cells":
+        const: 0
+
+    patternProperties:
+      "^led@[0-3]$":
+        type: object
+        $ref: /schemas/leds/common.yaml#
+        unevaluatedProperties: false
+
+        properties:
+          reg:
+            description:
+              LED channel number (0..3)
+            minimum: 0
+            maximum: 3
+
+        required:
+          - reg
+
+    required:
+      - compatible
+      - "#address-cells"
+      - "#size-cells"
+
+  keys:
+    type: object
+    $ref: /schemas/input/mediatek,pmic-keys.yaml
+    unevaluatedProperties: false
+    description:
+      Power and Home keys.
+
+  power-controller:
+    type: object
+    additionalProperties: false
+    description:
+      The power controller which could be found on PMIC is responsible for
+      externally powering off or on the remote MediaTek SoC through the
+      circuit BBPU (baseband power up).
+
+    properties:
+      compatible:
+        const: mediatek,mt6323-pwrc
+
+      '#power-domain-cells':
+        const: 0
+
+  pinctrl:
+    type: object
+    $ref: /schemas/pinctrl/mediatek,mt65xx-pinctrl.yaml
+    unevaluatedProperties: false
+    description:
+      Pin controller
+
+required:
+  - compatible
+  - regulators
+
+additionalProperties: false
+
+examples:
+  - |
+    #include <dt-bindings/interrupt-controller/arm-gic.h>
+    #include <dt-bindings/leds/common.h>
+
+    pmic {
+        compatible = "mediatek,mt6323";
+        interrupt-parent = <&pio>;
+        interrupts = <150 IRQ_TYPE_LEVEL_HIGH>;
+        interrupt-controller;
+        #interrupt-cells = <2>;
+
+        leds {
+            compatible = "mediatek,mt6323-led";
+            #address-cells = <1>;
+            #size-cells = <0>;
+        };
+
+        regulators {
+            compatible = "mediatek,mt6323-regulator";
+
+            buck_vproc {
+                regulator-name = "vproc";
+                regulator-min-microvolt = < 700000>;
+                regulator-max-microvolt = <1350000>;
+                regulator-ramp-delay = <12500>;
+                regulator-always-on;
+                regulator-boot-on;
+            };
+
+            buck_vsys {
+                regulator-name = "vsys";
+                regulator-min-microvolt = <1400000>;
+                regulator-max-microvolt = <2987500>;
+                regulator-ramp-delay = <25000>;
+                regulator-always-on;
+                regulator-boot-on;
+            };
+
+            buck_vpa {
+                regulator-name = "vpa";
+                regulator-min-microvolt = < 500000>;
+                regulator-max-microvolt = <3650000>;
+            };
+
+            ldo_vtcxo {
+                regulator-name = "vtcxo";
+                regulator-min-microvolt = <2800000>;
+                regulator-max-microvolt = <2800000>;
+                regulator-enable-ramp-delay = <90>;
+                regulator-always-on;
+                regulator-boot-on;
+            };
+
+            ldo_vcn28 {
+                regulator-name = "vcn28";
+                regulator-min-microvolt = <2800000>;
+                regulator-max-microvolt = <2800000>;
+                regulator-enable-ramp-delay = <185>;
+            };
+
+            ldo_vcn33_bt {
+                regulator-name = "vcn33_bt";
+                regulator-min-microvolt = <3300000>;
+                regulator-max-microvolt = <3600000>;
+                regulator-enable-ramp-delay = <185>;
+            };
+
+            ldo_vcn33_wifi {
+                regulator-name = "vcn33_wifi";
+                regulator-min-microvolt = <3300000>;
+                regulator-max-microvolt = <3600000>;
+                regulator-enable-ramp-delay = <185>;
+            };
+
+            ldo_va {
+                regulator-name = "va";
+                regulator-min-microvolt = <2800000>;
+                regulator-max-microvolt = <2800000>;
+                regulator-enable-ramp-delay = <216>;
+                regulator-always-on;
+                regulator-boot-on;
+            };
+
+            ldo_vcama {
+                regulator-name = "vcama";
+                regulator-min-microvolt = <1500000>;
+                regulator-max-microvolt = <2800000>;
+                regulator-enable-ramp-delay = <216>;
+            };
+
+            ldo_vio28 {
+                regulator-name = "vio28";
+                regulator-min-microvolt = <2800000>;
+                regulator-max-microvolt = <2800000>;
+                regulator-enable-ramp-delay = <216>;
+                regulator-always-on;
+                regulator-boot-on;
+            };
+
+            ldo_vusb {
+                regulator-name = "vusb";
+                regulator-min-microvolt = <3300000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <216>;
+                regulator-boot-on;
+            };
+
+            ldo_vmc {
+                regulator-name = "vmc";
+                regulator-min-microvolt = <1800000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <36>;
+                regulator-boot-on;
+            };
+
+            ldo_vmch {
+                regulator-name = "vmch";
+                regulator-min-microvolt = <3000000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <36>;
+                regulator-boot-on;
+            };
+
+            ldo_vemc3v3 {
+                regulator-name = "vemc3v3";
+                regulator-min-microvolt = <3000000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <36>;
+                regulator-boot-on;
+            };
+
+            ldo_vgp1 {
+                regulator-name = "vgp1";
+                regulator-min-microvolt = <1200000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <216>;
+            };
+
+            ldo_vgp2 {
+                regulator-name = "vgp2";
+                regulator-min-microvolt = <1200000>;
+                regulator-max-microvolt = <3000000>;
+                regulator-enable-ramp-delay = <216>;
+            };
+
+            ldo_vgp3 {
+                regulator-name = "vgp3";
+                regulator-min-microvolt = <1200000>;
+                regulator-max-microvolt = <1800000>;
+                regulator-enable-ramp-delay = <216>;
+            };
+
+            ldo_vcn18 {
+                regulator-name = "vcn18";
+                regulator-min-microvolt = <1800000>;
+                regulator-max-microvolt = <1800000>;
+                regulator-enable-ramp-delay = <216>;
+            };
+
+            ldo_vsim1 {
+                regulator-name = "vsim1";
+                regulator-min-microvolt = <1800000>;
+                regulator-max-microvolt = <3000000>;
+                regulator-enable-ramp-delay = <216>;
+            };
+
+            ldo_vsim2 {
+                regulator-name = "vsim2";
+                regulator-min-microvolt = <1800000>;
+                regulator-max-microvolt = <3000000>;
+                regulator-enable-ramp-delay = <216>;
+            };
+
+            ldo_vrtc {
+                regulator-name = "vrtc";
+                regulator-min-microvolt = <2800000>;
+                regulator-max-microvolt = <2800000>;
+                regulator-always-on;
+                regulator-boot-on;
+            };
+
+            ldo_vcamaf {
+                regulator-name = "vcamaf";
+                regulator-min-microvolt = <1200000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <216>;
+            };
+
+            ldo_vibr {
+                regulator-name = "vibr";
+                regulator-min-microvolt = <1200000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <36>;
+            };
+
+            ldo_vrf18 {
+                regulator-name = "vrf18";
+                regulator-min-microvolt = <1825000>;
+                regulator-max-microvolt = <1825000>;
+                regulator-enable-ramp-delay = <187>;
+            };
+
+            ldo_vm {
+                regulator-name = "vm";
+                regulator-min-microvolt = <1200000>;
+                regulator-max-microvolt = <1800000>;
+                regulator-enable-ramp-delay = <216>;
+                regulator-always-on;
+                regulator-boot-on;
+            };
+
+            ldo_vio18 {
+                regulator-name = "vio18";
+                regulator-min-microvolt = <1800000>;
+                regulator-max-microvolt = <1800000>;
+                regulator-enable-ramp-delay = <216>;
+                regulator-always-on;
+                regulator-boot-on;
+            };
+
+           ldo_vcamd {
+                regulator-name = "vcamd";
+                regulator-min-microvolt = <1200000>;
+                regulator-max-microvolt = <1800000>;
+                regulator-enable-ramp-delay = <216>;
+            };
+
+            ldo_vcamio {
+                regulator-name = "vcamio";
+                regulator-min-microvolt = <1800000>;
+                regulator-max-microvolt = <1800000>;
+                regulator-enable-ramp-delay = <216>;
+            };
+        };
+
+        keys {
+            compatible = "mediatek,mt6323-keys";
+            mediatek,long-press-mode = <1>;
+            power-off-time-sec = <0>;
+
+            power {
+                linux,keycodes = <116>;
+                wakeup-source;
+            };
+
+            home {
+                linux,keycodes = <114>;
+            };
+        };
+
+        power-controller {
+            compatible = "mediatek,mt6323-pwrc";
+            #power-domain-cells = <0>;
+        };
+
+        rtc {
+            compatible = "mediatek,mt6323-rtc";
+        };
+    };
+
+  - |
+    #include <dt-bindings/input/input.h>
+    #include <dt-bindings/interrupt-controller/arm-gic.h>
+
+    pmic {
+        compatible = "mediatek,mt6358";
+        interrupt-controller;
+        #interrupt-cells = <2>;
+
+        audio-codec {
+            compatible = "mediatek,mt6358-sound";
+            Avdd-supply = <&mt6358_vaud28_reg>;
+            mediatek,dmic-mode = <0>;
+        };
+
+        regulators {
+            compatible = "mediatek,mt6358-regulator";
+
+            buck_vdram1 {
+                regulator-name = "vdram1";
+                regulator-min-microvolt = <500000>;
+                regulator-max-microvolt = <2087500>;
+                regulator-ramp-delay = <12500>;
+                regulator-enable-ramp-delay = <0>;
+                regulator-always-on;
+                regulator-allowed-modes = <0 1>;
+            };
+
+            // ...
+
+            ldo_vsim2 {
+                regulator-name = "vsim2";
+                regulator-min-microvolt = <1700000>;
+                regulator-max-microvolt = <3100000>;
+                regulator-enable-ramp-delay = <540>;
+            };
+        };
+
+        rtc {
+            compatible = "mediatek,mt6358-rtc";
+        };
+
+        keys {
+            compatible = "mediatek,mt6358-keys";
+
+            power {
+                linux,keycodes = <KEY_POWER>;
+                wakeup-source;
+            };
+
+            home {
+                linux,keycodes = <KEY_HOME>;
+            };
+        };
+    };
+
+  - |
+    #include <dt-bindings/interrupt-controller/arm-gic.h>
+
+    pmic {
+        compatible = "mediatek,mt6397";
+
+        interrupt-parent = <&pio>;
+        interrupts-extended = <&pio 222 IRQ_TYPE_LEVEL_HIGH>;
+        interrupt-controller;
+        #interrupt-cells = <2>;
+
+        audio-codec {
+            compatible = "mediatek,mt6397-codec";
+        };
+
+        clocks {
+            compatible = "mediatek,mt6397-clk";
+            #clock-cells = <1>;
+        };
+
+        pinctrl {
+            compatible = "mediatek,mt6397-pinctrl";
+            gpio-controller;
+            #gpio-cells = <2>;
+        };
+
+        regulators {
+            compatible = "mediatek,mt6397-regulator";
+
+            buck_vpca15 {
+                regulator-name = "vpca15";
+                regulator-min-microvolt = < 850000>;
+                regulator-max-microvolt = <1350000>;
+                regulator-ramp-delay = <12500>;
+                regulator-enable-ramp-delay = <200>;
+            };
+
+            // ...
+
+            ldo_vibr {
+                regulator-name = "vibr";
+                regulator-min-microvolt = <1200000>;
+                regulator-max-microvolt = <3300000>;
+                regulator-enable-ramp-delay = <218>;
+            };
+        };
+
+        rtc {
+            compatible = "mediatek,mt6397-rtc";
+        };
+    };
diff --git a/Documentation/devicetree/bindings/mfd/mt6397.txt b/Documentation/devicetree/bindings/mfd/mt6397.txt
deleted file mode 100644
index 10540aa7afa1..000000000000
--- a/Documentation/devicetree/bindings/mfd/mt6397.txt
+++ /dev/null
@@ -1,110 +0,0 @@
-MediaTek MT6397/MT6323 Multifunction Device Driver
-
-MT6397/MT6323 is a multifunction device with the following sub modules:
-- Regulator
-- RTC
-- Audio codec
-- GPIO
-- Clock
-- LED
-- Keys
-- Power controller
-
-It is interfaced to host controller using SPI interface by a proprietary hardware
-called PMIC wrapper or pwrap. MT6397/MT6323 MFD is a child device of pwrap.
-See the following for pwarp node definitions:
-../soc/mediatek/mediatek,pwrap.yaml
-
-This document describes the binding for MFD device and its sub module.
-
-Required properties:
-compatible:
-	"mediatek,mt6323" for PMIC MT6323
-	"mediatek,mt6331" for PMIC MT6331 and MT6332
-	"mediatek,mt6357" for PMIC MT6357
-	"mediatek,mt6358" for PMIC MT6358
-	"mediatek,mt6359" for PMIC MT6359
-	"mediatek,mt6366", "mediatek,mt6358" for PMIC MT6366
-	"mediatek,mt6397" for PMIC MT6397
-
-Optional subnodes:
-
-- rtc
-	Required properties: Should be one of follows
-		- compatible: "mediatek,mt6323-rtc"
-		- compatible: "mediatek,mt6331-rtc"
-		- compatible: "mediatek,mt6358-rtc"
-		- compatible: "mediatek,mt6397-rtc"
-	For details, see ../rtc/rtc-mt6397.txt
-- regulators
-	Required properties:
-		- compatible: "mediatek,mt6323-regulator"
-	see ../regulator/mt6323-regulator.txt
-		- compatible: "mediatek,mt6358-regulator"
-		- compatible: "mediatek,mt6366-regulator", "mediatek-mt6358-regulator"
-	see ../regulator/mt6358-regulator.txt
-		- compatible: "mediatek,mt6397-regulator"
-	see ../regulator/mt6397-regulator.txt
-- codec
-	Required properties:
-		- compatible: "mediatek,mt6397-codec" or "mediatek,mt6358-sound"
-- clk
-	Required properties:
-		- compatible: "mediatek,mt6397-clk"
-- led
-	Required properties:
-		- compatible: "mediatek,mt6323-led"
-	see ../leds/leds-mt6323.txt
-
-- keys
-	Required properties: Should be one of the following
-		- compatible: "mediatek,mt6323-keys"
-		- compatible: "mediatek,mt6331-keys"
-		- compatible: "mediatek,mt6397-keys"
-	see ../input/mtk-pmic-keys.txt
-
-- power-controller
-	Required properties:
-		- compatible: "mediatek,mt6323-pwrc"
-	For details, see ../power/reset/mt6323-poweroff.txt
-
-- pin-controller
-	Required properties:
-		- compatible: "mediatek,mt6397-pinctrl"
-	For details, see ../pinctrl/pinctrl-mt65xx.txt
-
-Example:
-	pwrap: pwrap at 1000f000 {
-		compatible = "mediatek,mt8135-pwrap";
-
-		...
-
-		pmic {
-			compatible = "mediatek,mt6397";
-
-			codec: mt6397codec {
-				compatible = "mediatek,mt6397-codec";
-			};
-
-			regulators {
-				compatible = "mediatek,mt6397-regulator";
-
-				mt6397_vpca15_reg: buck_vpca15 {
-					regulator-compatible = "buck_vpca15";
-					regulator-name = "vpca15";
-					regulator-min-microvolt = <850000>;
-					regulator-max-microvolt = <1400000>;
-					regulator-ramp-delay = <12500>;
-					regulator-always-on;
-				};
-
-				mt6397_vgp4_reg: ldo_vgp4 {
-					regulator-compatible = "ldo_vgp4";
-					regulator-name = "vgp4";
-					regulator-min-microvolt = <1200000>;
-					regulator-max-microvolt = <3300000>;
-					regulator-enable-ramp-delay = <218>;
-				};
-			};
-		};
-	};
diff --git a/Documentation/devicetree/bindings/power/reset/mt6323-poweroff.txt b/Documentation/devicetree/bindings/power/reset/mt6323-poweroff.txt
deleted file mode 100644
index 933f0c48e887..000000000000
--- a/Documentation/devicetree/bindings/power/reset/mt6323-poweroff.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-Device Tree Bindings for Power Controller on MediaTek PMIC
-
-The power controller which could be found on PMIC is responsible for externally
-powering off or on the remote MediaTek SoC through the circuit BBPU.
-
-Required properties:
-- compatible: Should be one of follows
-       "mediatek,mt6323-pwrc": for MT6323 PMIC
-
-Example:
-
-       pmic {
-               compatible = "mediatek,mt6323";
-
-               ...
-
-               power-controller {
-                       compatible = "mediatek,mt6323-pwrc";
-               };
-       }
diff --git a/Documentation/devicetree/bindings/rtc/rtc-mt6397.txt b/Documentation/devicetree/bindings/rtc/rtc-mt6397.txt
deleted file mode 100644
index 7212076a8f1b..000000000000
--- a/Documentation/devicetree/bindings/rtc/rtc-mt6397.txt
+++ /dev/null
@@ -1,31 +0,0 @@
-Device-Tree bindings for MediaTek PMIC based RTC
-
-MediaTek PMIC based RTC is an independent function of MediaTek PMIC that works
-as a type of multi-function device (MFD). The RTC can be configured and set up
-with PMIC wrapper bus which is a common resource shared with the other
-functions found on the same PMIC.
-
-For MediaTek PMIC MFD bindings, see:
-../mfd/mt6397.txt
-
-For MediaTek PMIC wrapper bus bindings, see:
-../soc/mediatek/pwrap.txt
-
-Required properties:
-- compatible: Should be one of follows
-       "mediatek,mt6323-rtc": for MT6323 PMIC
-       "mediatek,mt6358-rtc": for MT6358 PMIC
-       "mediatek,mt6366-rtc", "mediatek,mt6358-rtc": for MT6366 PMIC
-       "mediatek,mt6397-rtc": for MT6397 PMIC
-
-Example:
-
-       pmic {
-               compatible = "mediatek,mt6323";
-
-               ...
-
-               rtc {
-                       compatible = "mediatek,mt6323-rtc";
-               };
-       };
diff --git a/MAINTAINERS b/MAINTAINERS
index 3f3ed5600769..1d1ea25fc2e1 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -14421,10 +14421,12 @@ F:	Documentation/devicetree/bindings/net/bluetooth/mediatek,mt7921s-bluetooth.ya
 F:	drivers/bluetooth/btmtkuart.c
 
 MEDIATEK BOARD LEVEL SHUTDOWN DRIVERS
+M:	Sen Chu <sen.chu at mediatek.com>
 M:	Sean Wang <sean.wang at mediatek.com>
+M:	Macpaul Lin <macpaul.lin at mediatek.com>
 L:	linux-pm at vger.kernel.org
 S:	Maintained
-F:	Documentation/devicetree/bindings/power/reset/mt6323-poweroff.txt
+F:	Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml
 F:	drivers/power/reset/mt6323-poweroff.c
 
 MEDIATEK CIR DRIVER
@@ -14585,9 +14587,11 @@ F:	Documentation/devicetree/bindings/mtd/mediatek,mtk-nfc.yaml
 F:	drivers/mtd/nand/raw/mtk_*
 
 MEDIATEK PMIC LED DRIVER
+M:	Sen Chu <sen.chu at mediatek.com>
 M:	Sean Wang <sean.wang at mediatek.com>
+M:	Macpaul Lin <macpaul.lin at mediatek.com>
 S:	Maintained
-F:	Documentation/devicetree/bindings/leds/leds-mt6323.txt
+F:	Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml
 F:	drivers/leds/leds-mt6323.c
 
 MEDIATEK RANDOM NUMBER GENERATOR SUPPORT
-- 
2.45.2



From macpaul.lin at mediatek.com  Mon Sep 30 00:54:50 2024
From: macpaul.lin at mediatek.com (Macpaul Lin)
Date: Mon, 30 Sep 2024 15:54:50 +0800
Subject: [PATCH v2 1/2] ASoC: dt-bindings: mt6359: Update generic node name and dmic-mode
Message-ID: <20240930075451.14196-1-macpaul.lin@mediatek.com>

Some fix and updates in the following items:
1. examples:
   Update generic node name to 'audio-codec' to comply with the
   coming change in 'mt6359.dtsi'. This change is necessary to fix the
   dtbs_check error:
   pmic: 'mt6359codec' does not match any of the regexes: 'pinctrl-[0-9]+'

2. mediatek,dmic-mode:
   After inspecting the .dts and .dtsi files using 'mt6359-codec', it was
   discovered that the definitions of 'two wires' and 'one wire' are
   inverted compared to the DT schema.
   For example, the following boards using MT6359 PMIC:
    - mt8192-asurada.dtsi
    - mt8195-cherry.dtsi
   These boards use the same definitions of 'dmic-mode' as other boards
   using MT6358 PMIC. The meaning of '0' or '1' has been noted as comments
   in the device trees.

   Upon examining the code in [1] and [2], it was confirmed that the
   definitions of 'dmic-mode' are consistent between "MT6359 PMIC" and
   "MT6358 PMIC". Therefore, the DT Schema should be correct as is.

References:
[1] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/sound/soc/codecs/mt6358.c#n1875
[2] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/sound/soc/codecs/mt6359.c#L1515

Fixes: 539237d1c609 ("dt-bindings: mediatek: mt6359: add codec document")
Signed-off-by: Jiaxin Yu <jiaxin.yu at mediatek.com>
Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
---
 Documentation/devicetree/bindings/sound/mt6359.yaml | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

Changes for v2:
 - No change. Because the 2/3 patch has been dropped from the v1 patch.
   Hence the new patch set v2 needs to be updated. 

diff --git a/Documentation/devicetree/bindings/sound/mt6359.yaml b/Documentation/devicetree/bindings/sound/mt6359.yaml
index 23d411fc4200..128698630c86 100644
--- a/Documentation/devicetree/bindings/sound/mt6359.yaml
+++ b/Documentation/devicetree/bindings/sound/mt6359.yaml
@@ -23,8 +23,8 @@ properties:
       Indicates how many data pins are used to transmit two channels of PDM
       signal. 0 means two wires, 1 means one wire. Default value is 0.
     enum:
-      - 0 # one wire
-      - 1 # two wires
+      - 0 # two wires
+      - 1 # one wire
 
   mediatek,mic-type-0:
     $ref: /schemas/types.yaml#/definitions/uint32
@@ -53,9 +53,9 @@ additionalProperties: false
 
 examples:
   - |
-    mt6359codec: mt6359codec {
-      mediatek,dmic-mode = <0>;
-      mediatek,mic-type-0 = <2>;
+    mt6359codec: audio-codec {
+        mediatek,dmic-mode = <0>;
+        mediatek,mic-type-0 = <2>;
     };
 
 ...
-- 
2.45.2



From macpaul.lin at mediatek.com  Mon Sep 30 00:54:51 2024
From: macpaul.lin at mediatek.com (Macpaul Lin)
Date: Mon, 30 Sep 2024 15:54:51 +0800
Subject: [PATCH v2 2/2] arm64: dts: mediatek: mt6359: fix dtbs_check error for audio-codec
In-Reply-To: <20240930075451.14196-1-macpaul.lin@mediatek.com>
References: <20240930075451.14196-1-macpaul.lin@mediatek.com>
Message-ID: <20240930075451.14196-2-macpaul.lin@mediatek.com>

This change fixes these dtbs_check errors for audio-codec:
1. pmic: 'mt6359codec' does not match any of the regexes: 'pinctrl-[0-9]+'
 - Replace device node name to generic 'audio-codec'
2. pmic: regulators: 'compatible' is a required property
 - Add 'mediatek,mt6359-codec' to compatible.

Fixes: 3b7d143be4b7 ("arm64: dts: mt6359: add PMIC MT6359 related nodes")
Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
---
 arch/arm64/boot/dts/mediatek/mt6359.dtsi | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

Changes for v2:
 - No change. Because the 2/3 patch has been dropped from the v1 patch.
   Hence the new patch set v2 needs to be updated.

diff --git a/arch/arm64/boot/dts/mediatek/mt6359.dtsi b/arch/arm64/boot/dts/mediatek/mt6359.dtsi
index 8e1b8c85c6ed..98a4aaac7911 100644
--- a/arch/arm64/boot/dts/mediatek/mt6359.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt6359.dtsi
@@ -14,7 +14,8 @@ pmic_adc: adc {
 			#io-channel-cells = <1>;
 		};
 
-		mt6359codec: mt6359codec {
+		mt6359codec: audio-codec {
+			compatible = "mediatek,mt6359-codec";
 		};
 
 		regulators {
-- 
2.45.2



From Deren.Wu at mediatek.com  Mon Sep 30 00:58:16 2024
From: Deren.Wu at mediatek.com (Deren Wu)
Date: Mon, 30 Sep 2024 15:58:16 +0800
Subject: [PATCH] linux-firmware: add firmware for MT7920
Message-ID: <1f796ed3de1374f86d299b410b135398fded89c8.1727677569.git.deren.wu@mediatek.com>

From: Deren Wu <deren.wu at mediatek.com>

Add binary firmware for MT7920 based devices

File: mediatek/WIFI_MT7961_patch_mcu_1a_2_hdr.bin
Version: 20240930111002a
File: mediatek/WIFI_RAM_CODE_MT7961_1a.bin
Version: 20240930111041

Signed-off-by: Deren Wu <deren.wu at mediatek.com>
---
 WHENCE                                      |  11 +++++++++++
 mediatek/WIFI_MT7961_patch_mcu_1a_2_hdr.bin | Bin 0 -> 100384 bytes
 mediatek/WIFI_RAM_CODE_MT7961_1a.bin        | Bin 0 -> 681228 bytes
 3 files changed, 11 insertions(+)
 create mode 100644 mediatek/WIFI_MT7961_patch_mcu_1a_2_hdr.bin
 create mode 100644 mediatek/WIFI_RAM_CODE_MT7961_1a.bin

diff --git a/WHENCE b/WHENCE
index 1d4ca27f..e878bd0c 100644
--- a/WHENCE
+++ b/WHENCE
@@ -5796,6 +5796,17 @@ Licence: Redistributable. See LICENCE.mediatek for details.
 
 --------------------------------------------------------------------------
 
+Driver: mt7920 - MediaTek MT7920 Wireless MACs
+
+File: mediatek/WIFI_MT7961_patch_mcu_1a_2_hdr.bin
+Version: 20240930111002a
+File: mediatek/WIFI_RAM_CODE_MT7961_1a.bin
+Version: 20240930111041
+
+Licence: Redistributable. See LICENCE.mediatek for details.
+
+--------------------------------------------------------------------------
+
 Driver: mt7921 - MediaTek MT7921 Wireless MACs
 
 File: mediatek/WIFI_MT7961_patch_mcu_1_2_hdr.bin
diff --git a/mediatek/WIFI_MT7961_patch_mcu_1a_2_hdr.bin b/mediatek/WIFI_MT7961_patch_mcu_1a_2_hdr.bin
new file mode 100644
index 0000000000000000000000000000000000000000..c9f83ff74c37daa3ec6dc4aa3e6f9ae9035099ed
GIT binary patch
literal 100384
zc-q{(e|%Hb`8a;=k0dv3+T4~vi!1b|zbJ^1BGbxZxe4LYAeIYO?J_3iS4GEWCr;hQ
z-kdbI5LkhVwV-d_7*I>+wAL9TD068+t)l3BFPocYtLRv9`^>cbDm5nG=iJ<cqWgT_
z at AvoheSQD<&{ytx&U2pgoaa2}oaa2x$+=;UZO&ZV4cFSLs;X?ZIjgc9OXOR&^V|6(
z{6p~1b!|x=BrHn(qYz5r|J(mqM8h+HsI3^a6AqAO{!#yB^>kxvug0i$MGJcJ0!H{E
zMw>=4D*UVkS)Oh|OW^Z=`@c<j?Z{Kyjz;Nr^e3hr{SMN-Qy~T12gU9G*Y`h;>^X6B
zR8SBW#+Kto_h|NGaXgDZan!?83*(|PGvTUPdU5p81Hsb=?p0O=7m3R{Oo3skT}GnS
zl%IGmw5VqGDC;i?t_rw=Pe`j`NX%FArQ1bYs8n9=m0dQ&Z>7yL3YI7C_fPx8I>hW;
zbz%(on)WuTb$otW%xCjMrNPEPi((D>M8R(gI7FJwPZWfhcsRNrq`W!)f<h at 3l3<+B
zU`2B!8>Cg<4bieVjwAQzkN-|m1)!hQ*UTRkg1*3Gz>8IReOp8-FBWKontMj=E*{ll
z$tkcKaY at h_JQ&!P=sB=hTxQ8}3FhRV$^$<St`4*%_6Od9KIXhNC9o6nyAu0Z8|Dbc
zQ%PBT-j|KR)h}ly_P>&?Qe^?g1ely7xrzOvmCfm&hX<jhwF>7R&70yu)U_^zYMpEF
zM$$@fOJF2eCRUkDf#*fupPyJ6Dhs?2xG%U`%v171B?qqaZFz-L92(6_X_}XfN3zm1
zM@)xvf)0^F`5}t5!Vks+U+*DnMIb3imys3ZuSiP^xLgfa^woa8m4BrsfF>*G0L-?)
zVy%z%%YEd334Q!#x{r#(x8>KySF(cTN3%t~Enjr-ro^40@?V=?$pKvMcwFE at -~kwS
zbru}BHgI0+b1>cKU`3$nihgc at ej*%(asRGjswo~7oD<N-AO*8Y6!U<Kfc5Ut2Xa$$
z<F*}AL6`|-IgxDa&Pvad+eC$`K_|LE-WvBP^PRP;pQPQR#-KfS?o0M5iJ#ejF!!*6
zqE;NRe?R_${f at aulnRB?=AUf01J#nbhocp<fJZn_!4iTJggRWj;R%hZ7pRWlC*2p5
z0n%zl3a&fLJ$lPKfU`<>B7_HfDUjd+mO;y%h|BgoNL at 3qK;ej9p|1$EdL!wzd01XU
z)w<9zIanb*fRK~lmkq0w-AN6Mrm4+mfV#rB^{^9U!H4?~JDZRVH6R`x?vG3g7iQ=p
zK$q{^k}6Npsr1VsWe>lvws#~(<Z6r`h*PSB6)t}A4<)YMX5mq;!nj9scB&Lh<K8$G
z^V+XTa6uY$XSCm#$V%jj$dnV-1!<9o5h;-hM4QihcwGZBqr-nC_3qDtdPtfE_?9E<
zn)qF)f%l>#e}$3L#j#`v- at +p5{!TV*fDtPpWA@`|aU9)0uH>6w8BBQ-2lTVh{J(oR
z>Y9iyDnL3tGD at fr(wz>MfLteGl)tYC(GtZ7{aOxv|1yKMMnN{h(Fb}$lm$|iYMwnO
zaWE>lM|WI9TCL&sB8fLnY~V4fsXT#C(L?OPH=pi{#7Wr+TvPa$xFVjShM1?lkuSk!
zQ3{d at G2+eG5HL3(6L4oyw;6hI3)tL;!REsJoA4QY{yqy$Ji3!UO%LUQ)XSl77D;AM
zQj%bk|A19sw%mFaWOd8M*q}Jvqj!EWFj)Y;bu5|$Ge{?|LG|{VzYLDelx8EOti}3h
z8OdY)SeYc4k#bimFBy<7O(P>zPq0_m)d9_}Vz8?)HqfTM2F-sHK7C`k at H|q({iola
zYaXuQ-YtUk^BV5tOi2G1^yodM5Bii<gQiF|-1|fJT!ReM)sQY#%IwAQ9Q!?SlT?XO
zfUFa~djia)LLWZTuT&oCXR9b?%myu+Edaf|5M&Wve(gxVeI|Q at f`TQuG4POk^zcG5
z3tn0X<ABIGfYg=-Yj#p;RAB8MzK%R!f+wzk^zArVlc4o1r`;Sc*5G{rQvjPA5QpvN
zFJIK)<M!NzLW(B4%buIB(bI1OT#|y>et at kSek#C1s;<#uHz!tWd<KF4h=#u#;5h(O
z4TuQ<{7nr$4e$(rdC<cMz>jPEhd`c#DOh(e;IB@>dKvIvXz(m(>kbX}10H5yT$Jvc
zJ5lOzeX4|Oy7}M98<kt+j at Fw*U18t=dwgQ>$)Iit6V?T$FJZCyvYldH(MJ7uxXFF-
z%Q{aZ#VUP~zsAG%6(W*yKKoEcxu3t64QuprowtCpiL3{(tjXkY_`uG)mPT|ZJ8&iC
zhd{ZEP=bYgFFet1GI$2^VI}w3e_-&y8lOx?EBpIkFIK{QwW>LdGt_tzRx#@yeJ=_v
zJOrP^@QH$FLU{3n7nJ7^OAhnPLwIN$7G_$U6c_9pfNnjVr+jSxH`3<)e<Axq_O)u8
z2C(fUH!~j4YUF8rbAfL^p&^p0djO#;R5|k#-j=v#lrYcYzww%VrhyTWj+J<HPUc(4
z-gA9tt%&rjRM?JK0Xr-RJHTRr?StGpuoKUOM1baWds!aax}9J<3Qs%}*d`f7n?*o#
zf)04D3oHf;YXeOPc(9H^9bkz}!7w~?64%+k50<sDFlUxwbSCT~e>-^-;IEf>fesD=
zRGp}?|15EX*j$tY`-r8c`NUDXDZeB<8}#=oX$3-#Z`pI_eD)>dM%=4dA1SVBRB1|;
zzMBRS1O2`p?Dq{p3M^!`c&*7KA}&8s9HLY{*}&&9 at D?ke_T!-aqWqGmmB^xirM%^*
zDrAk=JnN}%LYcL15|M!D8tS##O>;gA>xec$FW;I)6?K8O^~CoCZV%dT)>>vs%ZgRB
zwWZr;wcg&8Y3U{n^MICqFCM5V+{-Eu1!2=#R%F&9#DRagJz#9A at +K3Hhq;~9?ktg_
z%GR=tOoUlm)~M3J+?@rfvCZ3N^VFJ7sb0a8YjvN}O|WZ1%8=O&b2<zusbRDi87A0Q
zus6JB_^m$hbReIUb>{=dp<?b1WT}{}=>85`x*koe=1p006&9-nQx=&EXre4*Eb};U
z at E1>e|Cq?&0)PvD1s9fKPdw;-`WIirrRf#{ZiGU?=Q`hQT8^2-=b?Lo_jEkc+0#^o
zg~T5qx3r_K^Zq6)5)->ZOM|mTByjZ*BQ^n-#G=q_vZDeI0eF;vRpmn^!ICC5g_3D#
zBAbWA4yJP|;JCyh3*^31gVk!Vq=xEUC6j-J&+qL^D$qWw{kz~l<yIig+I*nyH>rK5
zK3WcRA1V|)iM<A{Fh3occAXvi-Sb3#h!c4nftH=AmVw5Zp;^#L?Y5CMXQ9x74A#}j
zf<#op3|JSDN-DI4mxYzRhi6Lb1s=Q{u+S*$@H4 at pG#n}d4=eyVn*~x04qt{%=rYWx
za8M8RY$3gxhEu5trBVh`pd~h*@Z&W&d>K~xX)u$91=2py36K}Ge3<xhm-EDv;Lznf
zL-wO|-ZrkjP0Oe2YxzulEuX1R@}efMNMNo18m!8z!Au&KHF{Zt!)aKf*I*_MH)`~a
z1lIU#uu8ANOd4+1=$i?w(QB|uufa?j#u_~)utu-JD!m3XX}DdZZzr%uufZz42CMY#
zYOHYaOK)l>Q^Y^2N%<lzJ?@KNd`|LUoi2VkTcf;1DYh^a at TB@&s5l8}zZ#Py$NmJL
z)5Jf7-2h9u2qg- at CSo^ghTZOqr`(9y>qh!NxY2#ELdHIHBi*Nve-A$UpnR@^6e~n4
zBLn%;o#4AN4B3B;ZuH}u39S0DkP>gn_<Qg!f9>JetHJIzv#6!13D&*^Qgv5Cc#ad*
z8lmkuU`cuRsQjuTXi$fizNV!|phgwcC;>h3P at _cR_(30j`F2-PaWZjR10O&~{&3`W
zCqHT=DOd*mkv~X<d_}<QM4OD@`y%5>ck;_?+{wfZ#LmwDJFNUs`6i$dfN!3rS4+wd
zhrH at X8SVpLsC0}1O`99|oj(9g&vRcY$R5ao{Y+G>uvcyf3dEX)1h5X|Pz~ZJQ#RRK
z>|E||;Pa~HF&zZ&>0oNawj8w=Cmtp~!@Ymje6B6T8wQ{1$C at 04<1AHsv`jKFzXgw|
z4tCEW7)5G~c3+IIuHk;)0DYQ)S1QCGoai3CX}yGmiM?LMD#ILtd?T at MUp`GDH%L3+
zvs$6BfJJ3Bz*g{Y=ex?ly-&u^sFaI{@9iF4de}X>@ka2hZ4iYd<GZ1R_$g1Ro>4N{
z=e~GhfqRttoXjX9%NLi3<^8e}K9k{NOU<+|y5ZBL)w9 at 5?AZZ+7W&3(VS~L$hr#1v
zP6=lWvmgr5_<jfxogt1DqRRr%EeF=K1mMY_*CHn>%pRByIT}27laoKk9chz!x<2S2
zIH$ES+fzw>!Scu?Bf8$n$2beW`GKGaI~SC$RZAfXG&#`*<KZ at vuICQ7snY*m(|Y9?
zof at H?9{0tug^Hk-Zc(4VBr+*Nw at a~hyCgn&R_1rj2T8WOcq;FRKj0Yly7)Z)JXOE^
zA^x{)z&qlNjDc7DAdJ!Ii7%>|$Fkb`JnQ){h*y~!x%kb!E$NY4{Bw2WeCd%}>?7k5
ze<w9^@t5G!dU at pHE(HzK+Q^yW2jdHH*h_hxs#Qq!#h&Vk68DzkPu&+U{aF!Gmf?%3
zTIvLU>!-cc1+QfnrY+B5#_~93FSbUl-~)NFo<yhdV+yLFEc>GS2aIuqDGU+qm(N2i
zi(r%xj1C?1DkRR#g^wATF*|Ur`_jap4&;D`RSv79Komje4p_AetStI)pBh0oGO<pZ
zhoh%LZ)f9Nm^+vL at T_807|59cJ|s>MjGZezg;Wmk%nci*Y2jNG#9EnQ_od0ccniev
zmnJNax5P`vw?B^CmT}xLk;}em(J#RgO`Nr=sC*VRwR^=HM0rrssOVih at +zYHQvQO-
zO~fV`ei~T>^RZ-B-qdbSVY0x*(=dXDpWrZHv+XxR)T+g-)HBi2h+RRzp;=iF(W%hA
ziqm~5?{p-`!!fy}C1{0HTWL{S;gxWt0Q#P<P#Wi(f$#sig75Eu?<Z;>_u;VJL?rhb
z_l$a)y$}tc09b+ZSP!F4seLy<UlH`x0DaAZz8XA;D#&o33f!~CbEi?X)NXQ7<P-qP
zS&jc>@Q}|BWWn=7z~$j7vr-N#{9+^vTD;R<H0S(wYDKKZJH$plhtc<{<7=>QaOuI{
zW}#pIR48&5Gwk(nCL^Xg<<7nC(I at v2TKDLWPmnTLL3yx}%R47QOlHrEyZCGbwn`T*
z9ig07(FnNF5y%sKv{W&<N7;XOUwURctY8Xe(PVW7J*u at nD_j`|4fQ-qN^zK!H>u_S
zMJwFDXk|TU)2qfx6IkSHf&EMeDeh#W`xQ#{E5opAN5aOj+_pZTmp$J*b4gtTlzO_R
z#@2>Wh~vvsFy{ieEVYM#<;!)MQuwS+fOAr?4&r+kor3jC0A^t3UQ9j+qkBQ)xEQb+
zcU=!~EY<KI!CtZhA|P|(8u#di4^r6NLfAiuJQS?&AN4xOY0b*Afw_>oUoOTvHD5F^
z6Y at WSyk5;)2Ff7+)AZ at iO4C3QSuLH;Itwa9_h3DOn&KLf6W8e2<W at 4f#5D{HQ7O8s
zQhg4R=iQFDHz=Gg8 at e$rNHLJ+;<j_u1qu>lN6}(rN33+)3W%>(E7m~E0q+5 at Dxi7T
z|CnFGtR1~)i3&fJfdUX0zISrc`1qXZj0d3HPR{<Ac7U#jd~$S+`dmcf=r{xRTI>bd
z_qtt(iS;^R)EnKS-+ebmg?W&CBJ^dFh at dYJHv?RdFvHU#A_E)u#htj%!)39xh?;mh
z8=o4Q?BVo~L+_t93>m<35cm+3e%r$t2z<hWI6}RQoJBw?dbr<`JhLK(-XALVaK$7y
z--F&GY0ZlzL0E0CE#g^>0zW2u8h9_3kR$MumnXvWr!P-}=cdC2Au8VQ;oc{8CVS9-
zl2jnRL2%XOvoeNDot_1TFXQL|4L33l_ko5xI}SIb;m(c2jcT~_<Ju_Ha2LkmDmC22
zak%OfPW{H<GPX8a7Pvn&Kk&e?_Xs!K(q#+$Fz~Cu*#mPA{0Ox0RJ{Mn(?8ml@^yS|
z(XuXEO~%uR(_J<g-}qOk*IuTM_mf=-yt at 8)e~{`FVb3tTij!DG-ig5Hc-I_w4s=}$
z&o at D{g|ulm2k;3M|F(*M2k<;Y#`K=uTqgodxa-~;{={2d8&5Nko~#=|tKFkl|Ez{P
zaeNkkA`EaR^x(!TWZD-k4eDX-{_|^n3kI9MdfG`31ctwc`yep#HQZ3(?ALIkfpgKa
zpgyfp_vrC?Aw#_X#gZ;Aunck at GRHuQsdGLC?Ns1J?n}A(@qXfweR&q_gE;UF at SaOq
zfeAxQ+-QNcZ!*g>VX09E9>XBA032|F4_(;pB<U8^?Ti$R8{LLT1*whunyih8)DN^k
zj9=K at LQ*~IZjtu#rLJaXXva(m>(GmCveQs~;;jPxd(+O3-yI#tYXi|^v@{-$BiJ#&
zWuH0c<NoWxXMA^HF7ZG}1fiZ!=YjN9;aqsm3uoJ>#7n?3TM6HXzi-b;{6|#KVvPc*
zdlY8R1ci*`QF0PQ&e7b-3)`<a^+_gwrk=OFOU}5dJL6d5In-7r2|NNHrOavjfNOJE
zcnVu=l-D9qElz6#2dU3l^(p5R2017HDak89(+)Hbf#=!c6#ik9@@ORUExN?*;K8=2
zy9fAqEIHvvF5vDSJ=vfjiD%Vw<eKWo#A<5`T`ja^wNV~p_ZJe+>tTGXGQZWbEX<;i
zozNcf9`Pvx at itNH$j`y&3>;~LXZXktayAJ26jD!Pn^Cyt27XX!OWu?`DF%=(cx(xS
z*mtK!ve}0)Rku4C55Ae~>8F!>LT|oX at M5XBR-s=vvtB4`K_;=oPX`C;9!6mEE9nTG
z+!`9#>D?o=t$+I?^}9CkKj`z|Z@`W}rAp0x3j1J~w4VNe_DD32#;iS}BJ?=MgdXSE
zw4Md267tQjhs&F&!PJ0RDgcPbw5O2I*09XZf)!Af?v=erdJu<EJ0c at 4*zF6KU<d3A
zrS_uAkh(u0`-+9jaU;fE%~*<-9~yz3r at 2VqRds6cj7g;jZ+4b-k`gWLs%oQpsv>9k
zhY=MI+lv;>YqQ#?E}GW`mV?cPv0A0_60uJ)M$3tA!J_DQQYm at fWE46j6+&_P^tGYl
z5ieMWdtlF_8!qCZYC|g}#_Z~zR{=5l>tFf18=V}N3!<aQZd%ydIV-%3oM%es^UYY_
z%S5fgVtdi-^$}4kbwcUP%I9Lf-UY$pXbF at xrKzL`BG(WqCu+_P&jO9q1BI1%#WmE7
zMKHsuqU(djT?jn8BI$lo2I-GT8qwQlO7{kfhbiLE6S{bd%JBygR&9S>)JiZT;AOq{
z7WmpoqQkU|^x%~&3_!F(ONF*)WyI!LkT=JDDe?_sTf8OsV|>hg>Ex at Py)@@}FsTpf
zov5A*>0yP7;Dr~sMD%-aiSvj2Mvslsxi9^vI}Vn_UbJw5SBzQ*bWo3Y>jlbm=Q?)d
z-kLU=*ar8dcU~j?tmhHmrvoWB!l+rC{DawjM#weWr!Mxwrv*MfpkY;-dmyKDy80M^
z?~?>!B1n=AIDgn^H%ULV=Pv#?_-uv`2H7Ek1J4<}XPRq8cp##0<#0H{d_gO3whH+4
zCx$Z<T1A*063)WYuv=Mmj*6DcIz-h6P}0+FIoI~_p3%tvl37gEw*zJ``?q*soC+1&
zO_j at ry-^_ymPaX7&l|l&@9s-)e;aJlUkAVkuUsA#;@~?Q4So5ir=Q7Ha-;kE$hY36
zoz!XO3<vwpM{U+lh=>*NN- at kukBy!bx8i=h01t*X1J_StUi*?t85 at QvECn}5%Lc%s
zj34NNPbyX$X~7FZoAL3Om&g$F5$YH<%#6^4I!r%@VU)p(!r_!3^)?G0)e`az#EB%V
zqJ_OQ at f%5`5iLctah783c at a`$&%He%@T5!ta|-I&*z=MijIceno~rJR-9df=;(F$S
zhvhgu72~sHy*!HhQY%I&tTsHPu9&Eqr+DfrY7CKd{NGjZ7egdXW9%?nuTuX$0*L&H
zC~Vvl7SW*bG+X~LPC^?$)>_z9ZNMnKCfTfcVohGr#dsgsxUAGSM$9uVp81aZVyxPQ
z=oJb3p65 at 6q5ikWmEIXy3Vy&xU#qndYE6MSqPeF1z!E2;l<j$5j<NEocZY5mN3|(p
zgW6*v3K(I(xwQK|@NU0|_jPie5ZNbQkN07!U*Fl at PfkFbak3I_g_YNb*|RW1-k%82
z+ABQ(2K>6q{Ph<1#n1l)GYujI-S=fgx5N5e3!evS?wVvu(Xre-!NTH-c|u1Sfk+xe
zA*#kWX|BYBo_K5v2^!Say%1{Az at 0=i-$}vrKLNfi1yhFsUXg;)0KiK${6_#U*6P**
z?ABn2X%<QvpSb|vtkvxWSXLvb^l79yeH!_d9uH|AUo2WizRhu?)e$#ZdCZNb){&J9
zdjow)Jn;G<1x9E>-E#Dhr;#$g&UzYYW4upZMjwt$hUZ6-N%ArVMJBwXdp!#%vg3X5
z<WxEi^n4(qmt|ZQVc=PNx^3wDlEBGe<q&N}d;Qb=4*!A|or*)em!ltv-+BxuaTs9G
zF$X&yWvgzVO36EsQS=I?ZPsO<Zcd8l+K{+QU>zSfn_irK%jXD*%7b+MQ%q8Ps at Wte
zfqb!}l6`5m_=F!x?VMa4m_gAU__00aM at qL@{WG?e`d96{Q_N#cav%wHSXRvAO)pMQ
zEPjy at C$hBoB%5Dv!AVhUH;D^*HstI2Va*Lw+o~N~=slw%DiYgT>>DcghUSaTb`cB8
zY9$b at fVt8acN}UtB(m*Df9Uwhyw~bH&6M#C*3+!&Yn7_6RjR&LrS$bi7Elm<HB+2Q
zNA%SP`f615)rf2Bmto<xZxC%M$UhydE%JLM8)&A=Yr_F@?ogfALhVufWha at CBSMD`
zfWN~P!dg_;KYDE!rC34IJ)z=ZZ(5&YwVJF}BI|+IPwHNq4f2#l4DYaVV at oAz*EhF*
zSqpk?g4XV|bek<K7OV3x)t2Qi3pqT-_AlZG<OPU>c9y2vIj^-tvq~9W4J{pjKWi60
zu%(|?7Pyupl)U4$sf4e;0yujWDaF~>fdkSiatDSht8Yez>O6(=mw6s!*ic`(SG8xs
z?o!yRtnYaE%GQ_;rKH}9M*Tju#S(m~OYHLEW1Wu&bZ=(6c={i>(OJcAl#xM@^SreY
z&b~sDl}7w{v^+RJMu(=sPI at pz!8(7KoT|;T9az$BbP0w58ByWxEGOmP*qsg5-gyX<
zJDMkTVCCCMoa8M5AEGCq!}IYcJNu#~^*Ur08w-W8nK8=Aup2{01(7%+PLbVMGRM5I
z8?!xC3KcQ$q&gA!;6?>}C-54KF$z~iOCl^-`>LL~=q#d!4Dh6f*shHVIz{nk!9ViG
zVJ89VYoLeVV|3ly$Be}y^w=Qiv?p*v at pb%V_XEkI{hK;#+glXz)U+Y9D6?Ylsru#K
z<Y4QNZgAZhrp?jW4*OnhWVk1UY4z?^;~}YQ0TNL8A$tGSqLURmkuuGRFttYzX(ZMZ
z9ynUfx6oaMu#@W{8n}3xJ;N-|$CQ1Er0bfj-rEy!W0$jwI<yyAaXHA<3vvaNR(#so
z%x{!LZfS!vN3M2GrFR}6(u&J1V&JA=Ysb=hCzagYa>ob~cVB;ok)4}yd&%}Pupjza
zBDAEOVU-q<Z at -ST1uX@- at FA*;4l`r95n9QeWjk^H1h1 at fmY6oeY+Bk-wL`A9Zl^ow
zz5Q*hpAMCV1mf}HKCi$FI1hH+FEE8H5aXT#f7f2wfsG`hBfjs#QR4d&ugdGR&s=!P
zYYkFk<=`Cxj0eZcS at 1)mB{)0_pEy_NLzA#!Y at L16!VCBbT&XO^{^&G3i1mQm05}zc
zpNLifJvwm?q9m&)ki&Yq^(;0-4E0Z;&pqAdf=7PUF%Nu#6dx~sLRp;RqT+xLaPg+N
zNQg?x$ebKB46#yi9Qi*U)LZVuFhe9W<ieJ<m;u>cL?gIwWGnvbiL31Uq(6jyqj;5)
zli8TQ;Jwgt!FNHq(26D8gu5cfv);2UXMJatv#l`$;GT$12c4hy)KcG2YbHs(%e7P*
zQZGws{Cds!ap>oH=%;Q>9?Od`il|V7C1-Sl)NKZwi9CXR_~XDrZ;1<`j}(XfnS~b;
zrm+p+A+?MJqBC4Pt{W7FnEi7i6I}ed&s4Z7lH=lQrws~cxI1DuEIY&OtBSDu=0s at F
z(sNGPLMh0(9HT$e3Ps}d&>_%*!@i>Ok(x)RG{{S_0lNcl;Xc>`X*K|ol-K;YXw+_(
zO7SAB$J5EkOC{u11Jrp4bKr?C#!U$7LA25btA5*AZ_SUV+Mz}nYR3qCKA11(d{A$u
zR1ULeTC}9*7gIh3t5T7gOZaZ$#{##`FB!b}EOm|{ZB98194ev38R~4aOS7<Xm?kh-
z2#D(>*uGtjjY#>}_4wn-LF!Cyb(Nkz^~8|wlhQM~=LRFp;IT7bsw;Pd%u%V at mLpf;
zx#axKzrZiH3ayUT?E1Mlxo3rQd7y0fs`?R}l<&k@;<`f9<HKT=Nlac8*V#?MCz8KP
zUJ&oymtQS+(L1bro)vGgo06MDPk8nkKPICOD>O&8;kk<FZwxH}s9H<yS}MvscKI9q
z0(f{Rv>*hLU%X_VxeelS`aTFar%9DI6PgbzZ7HU~lSLsKFh%NfruwvpV7&UW723m7
zMuqk8v|cfL3K>S>q&#X^7Isl0#jrBJ3jy`B7K)l{$)m2TbE3a^YE4DbbPkanP~x~=
zPqliMc*-ST%X_MI1pXLoH}crj^Tto4B0VBFsZdYO5k%-=p-Zk3Tmpsa=AfT?swqMj
z at l?~P)JD#(K&nQGE3`#6cxvf_H2tw3YSgc5)UT(g(TGO9##74x^_&#-T^jXE8ud#W
z^@keucRaQ1WI_#cJgd?6XtceAgGPTWMGw%^o?2bH#v!dnw^rlnaW$UK)Hvp;)#r}u
zZ-A6=wnTv{Pp!c`u53 at LjNBnm`POpgbYGx!XS$RnrH^`QjalPL6{Rt<M3q1!r at qLW
z);FO!_A at Az2}ZJok!u-MqLu))T-Amo6K9Jwlkp=I5k|74YATIn93yMeoPfu7RT+9C
z2S{3Ni~NU{KcwZK(DFT6UeyVaI$|P_R;o|K)i#K~QDjbr>gsV+<(H`<#o#e8k*R?H
zCRkw<nM@!eUoLoaDXa-aa#K(iiWrpuUWauN9l?-08q$NdUDA5n;}*t;mK`&pP?6<Y
zAN@*;<rW|FYah&MqoveGSxOlS=6g@~Es|hP%2sm{);Wgt*xvnU_qOiGy0=4q7f?K|
zSS@)zZdsoR9q}jb0hn>32e~7 at CfJur?ugGq`N&NfQ>Z9N5o^(em>7&~AVdL{;3{oX
zuE5O<Qdi{d<MV+cz+B@*_i^1t0gIYi0wy&zNu2G*1FX||ANLFPK#|kA!uX4#!0)75
zo55N2k+J)Cfi`Hrz-e7!>~0IVpxtRs9`G)fMq%K3J(xa&1z?uKVHJjyrH}>#9%*<;
z+2yDYc04oL3zL!sa_lnP2M|2jWk`hpC*!`vETHd$Hu{=i?*#sRz&`~;3j8$~@JPdJ
z^t*XtRns-JoK`2DOV!eH0L2e>;ht?>-X4F~mY(fhh92-4yZQoKdfr4fWb7H}>gR0`
z%{TVErK|#|5<b(r5RY&XXs?I(DnVosFt^*%IjzSGd*uR%g;1D_dGW_Ukuyw%R<`k=
zJA)X&NPdWxw^@T(BdxHL%#F1KjWJ(vJ~>BNG+=u+rm(qm9%ziSKuX|NMDBv8bGV{O
zD+?Aw{ojZz(nm{!Gsqo)&<v7(MAGR_{vTXudhjl(7<LkVS2A&jh+32oIUjl)b5X0-
zipqBc{9@@knPQIO^^%30%%Zi?GT0;MVnc9#wB(N1=HGhJndPSk&gcRD!<m~s>$xd6
zz7u}|e2T5X-&~GO*_ly0UT at zqK3-)TTuYPhxmG5BAFYghQ!*q~UuX#yum0b0AUD;<
zVcPKeb8NIcQV=?T&7M)NB3L|Ne|HwyTUd(X6sy>{*Oc69Sw(RW6J*7hkTHI2gzC5!
zI8 at sZc(8JVlj-m;aEdH=<ao8 at MF=}^fJ7~F3{lnjEafltaLjLCqOdt~-t!<8CFgl8
z@^WqOi5r3Y8<u7-7y0eGCau-1ajj-WUV|FPwHjIDYGg$Y#~m;iC>sabtim7T`QB3E
zl}c5;4w3EUq9wtVO4cxyP at Dq$Bc;Mgm1Vat_KS~QpD^vzixd*Uj}fK4Hk15hYrTA5
zYr_R at o6~>lO>V#dn6-dePx5<&0Ty<Y8zLp-yCRQ`Dt`0Y<E%%disE5WXK5t&a&R*7
zKu8FRu40r-+$QpmvLq)J$IR;dxJ_()j17h3;WsCVw{$cHb(s=L<e{WIST3$<<U~F|
zzW<yUdMzIAoAt=|fIA8b;<Y08U$(F_ at pwoKiYgbYz=@^Ci6PN{D5xVhA;mQm at C@n_
zQsUjvx_J0>>(K0utEHHcX}Gv`ZuO$wv^bJFw}J_ZD&R8%KJ(zSI+;xRvp|M%(na?9
zvm(0zo0g^VQC7{XdPweyw1L;-L=Pe6(EGz)h%C-4!mtngKkzAWcz{;=2o6uji(-`O
zEmn!h#`P``QQ at R$$uQ$GC;yQ!5idXH1Al*kvO)1H;Oocx-<l}eSdn!kll$N5^wdp6
zrPVU{f~`aPPXGSjc6xAY<N|nt{>UWq_EH=vVleO at d3%J;Q>Ru9<yJT5(%5yX>kPa9
z+d!iSk9|ZDF&*6x at g9!5bc0CWCBlAW5cx1CKjA~$9Kr49yz&Ac>j<|a+2`Ye`?gW%
zT7rJCUEDbz%$;ZDTYSB&tEJh0Knb%k!~~RcN<bHS?Zh`5bchON1-be=aT4rGGI4!~
z3l6x<0A1JFE(%6=cuS}j`u{j)&Tl>28ZBYjmgWX>a}CmAz0CMJ>>H%({1mYn%Ivec
zXvKL$P{&$Ynnh&icALq4u!s}prmLYG=|hWyD~4N}tW+{l0DIet^lp%tB%+_NA!1K+
z+BiQI6q~Gwd?P248FPLMK;e+6%Arroz@}u-;ij)j0W#>XltDoj$dR~Xm=4*8nNTIz
z<QXF at S+f?Qr8#~athP%*F(uX-+Y;N_%DqXqvashryX+WO8!QSHA6^mj9$ujgs`oBF
z3KoH04Fs01PbNb}zOAhec at 0-9clg3`)vn}OUr?{kyj&4YXSJKDBsB)NG&up<0v7k$
zXc<`lE<%^ATdqT*NPDlO?P^+%*-#h6C)Y;H&(UX at 6(byYU<ipnJo=5 at +fM~ZdYmJ@
z6cJzGI0-H=jX#0bx2Rlmfh!hi>c1s{{Qsc@@<j4Y08W0ARX39SsS9lWsiHHi<D`uP
zuj&EV0XFVRs#eg2i!^(<P-N$F8Z1c&qZCZOE$m$sEy?T~&B%077h|^@F6!Z9*ltih
zOCE3k$1nwR=UEF+{~$OYp841iKOU#ZSy|Wdll*HE*hKCaSVo$Qd-1`DATL8hkty;r
z>b=NS?_`q_N+0)<v(8AqEPHJcGhmEr4Wo+RK+Z$G_2fLX#eRCr(3G*YU0x?`DwB9_
zX#>BrvBo{Mt=gGIccRcr+^0y+Ms8zU3)Yh}M{?q*IMwq;FZ`+JjfaR__g-;^*bj28
zQsr8el8cmpTz%wB5#(xA<r;rF*{I6ZsLIvYVy|C@#n-Nv8bP8pxs3`$`^ssUsYp5i
zPCdxK`NE#N6k+d<&WF6Gox?>N>1i1G-F}yc*O@}A!7jNyg;^uAfU-It!hs0$k~4Av
zS32|eZEQR6WbK~2{L}qqp;dpn*k<XZJY35kK?3z0aooAy(gp-Am%vJVaBQu1X1Ne;
z#<ij18sk*|u=i}M*LA+7y0HkoqlYm=BAN<w2G$-dVwiX4P88d+FRz1&DIIw+e=CaV
zmSFUwVDT_5w<9`6J&7Rh)O!kPZdea<ZJPU1a94yKX25EoVNUV-rw?x(HY{n!I#h<K
zw{l{-ozy32Xc=%|{ZyzpM)|3jH{zy_W3>0SJ7QSCO=pbDCm^A-cDti~7$vbILbne3
z`}g$vSM2|x;}mNGTbSQ$dVE=8vAEn~N=U=o_TQCUI&4hVIr?Kcj*}*nT)a6c&M}!1
ze-imoHgQMrZt`xZIF)5XGd$~soSMlnJNW%HIgxI&?r>G-?axxeL#(d_FOB?qM at i(+
z4l43<q9M=>7k at 1-9O^rS at iZ68+6z6Lsw{M_ at o%h|JfpF5S~Yr%1I?Laq%(=lQ&G?$
z3VX$R#3Y}|iwEKhyaGAT!4B{Ri~wC2&~0sZH6mMtUHESDJtd4NT%-)18nh%a(^XjG
zKX{)~Q9YMJ2^V;iLKo#<Rnu^AlV7Ml*oH{^)yu(anm*EcUU6S~;g6lu{#Mq>h)S3{
z&yMJZ3=$7s8owo2-P}db;!m9KM4m#*0MLau8QF at 2;GOk9^d;{&+k(z8^2RvYJ62bQ
z3YO5gaB$Pm#J1+0)ZnI0G{m0 at oVgIm89X+Wzq7fG8axI#{i&=Wc8PBD#R#)RCmLLh
zRMNR>FBM_Q(<|1kMXbDrMM}WFN%|o4oAX|59AWTwr9 at d3od!0m6B_|`fRE{qmdB69
zL1+{Jm!Ta|a&t?sgh6se|3Ni-6^*CYJ%RMlzq>+)hz`<q7AARXTVLC!p7r`+a%yu$
z-M6*6$FHb+lU8?;g~9ezT^*?lF-Di83k`6f%>a~NZ(-1pIM#CH-urp-eet0_98Qn;
z3+1OjZ52Sf>UUQ9C#&11(ximU_ZJF+?#_aGE0erqm?m1aZh{zl^Qf4|;yMfH1ope`
z`=MR8kKFfMA8Uc<hFJSPBUx36qLH7UZ9BIm^qbg at cMKzRY7J(k*5K9{-HJL`Z5{eM
zjIo^)-^Gk~g=H6}@IWjZ)?zSbp#Kdac|W54gE3wqZ+b#BqJCe@(b?EA%taV@((X&Y
z>c>Ka4o-{Z!n!oZcEKJ)#~zBAm$V}tnv1CuMz!90sP{c=7~vu?q8P<mePPV(-Ezk;
z5-x0mwOI;lvwb^VAA_|?leH-d52DU?e;Cs{DUn8|k?s4vi2||YK~rKk_!2zMj~Vy$
zip!BHrr-a35Q!z6DS3BN+Mk!$8Z#z(L at UY>tw4P{tWAAPuY}v!*p?xk?sJ?45x}un
zUKe$$acJ at g*be{dovX;o_S2%=Mw8Y)H0<{#?@kmXrNliE!{d&`?8KiEQ%S3^j(0;p
zNY58X=+LxSwrYC{Vl4X{X2|ZiO^i{)rZ%b*odPR#hKuF=Tm<g~O2H;EB;7&PCX+YE
z-vqz^Nfzt_!k1^P5^i`3iQ1g_pnfW1tI<_-AA at H^40S%l2B$?Bc0%%2>~8A=88~(J
zeg-pP0hzm9(4yBmhK8w;R`;dn&&664s|)4a2k<{*zF~4#@^=6a#S~?5QP_+gc^T%l
z&V@`fBMdzEk#Fgr|Kq+FAodabrv1Ma`MsvZ<B7$I+fwhs#dLdmJ9EQ18BWJUUNjO<
zmE<GK$rCu1%Sy{L!xY4j9MC+!o2M<PFft$DUn*YlTAo&Hi50u~He2U_Y{h1A0&67W
zCn~HcI!&fz32Q-I#G2vIPB?f^N2UV2{r||pqNF+S`154${$+_>i7qkElq2#jERl}f
z?|A<E8Tr?=Qm`)+iWb(CSTvHxem7Hoi<95PW$?>}sWAj;tyF{%p;vPfp;mQl7x`uu
z*J`<W!%POAJ4|cTv;9Ma+c2w2Qt4^du`nBM1lxt2*5>R(sH=}yjefmkVc7;AixI=y
zEcE6Gj609d;{{MFhkOfs2u4~l;R?v32Hu3Qq?p{7dXu<<w9|VbB_o#9+&NsKmi}ET
zG^b7rBrG}kAx_2qRV)37^j72ZAw<>&aU+D*RW0 at YJA(}Iq}8{u7>I%AHlSjN)4X$W
z1 at s1NT<@z+{yrm?wA at jR;|onZN^|^`O8X>0-A?|&6fMbhW$^nlJV@>_6~7OlcBvR^
zk*Xw^V~N`d9!pT-&(QpvRG8FyCY3_ZFVozgq1gb^m_et8Oxb!*yLw7{Ylg<tz>7$g
zf#e!8_&O(V=Q8*uu=iY#-MC2s8;`oB0)(RF_MgRHQ0cpY;<}jEWkcQPC~VYDIgTn7
z(P<fe6~ND!;a8TyU)40e{X&AzItNfLNa-Udh2&(Aoc5iBH8<tG?yKP0-kl#YlGL-F
z$_9)L at b7nL0o9G&S&_+}^)%OgRd>Ei0Q~mId8yWRqh~#%;<~d4mxw;ai{!gY(y~1F
zyYaF-_kIRHFkTnWy-svN_TVdY at gJ9U@mz0O7n&y2Hxr}NGyDSMb at AMOEk-oB_$lon
z@*YPwndQ&zs7J-gP71uu1z_bU+)v*1c+>Kgv!ru)J>C*6Pgzi1p^MM{yZhpw`^dM!
zvjQhR>UBcAU-CEO2<(MtXodEZcNLx_zuzIQsT5p1^J$D#zaKWh4*RWbGh#Zxbvs#Q
zWA~Bnd9X^IWT(f2oh!xmFz1|5pFQI3;}pTZqH-U0;Je7TOHQUCJ8V>Ok6}X^t03~-
zbgU)j!xh-j+tPb1T2{{>I?RD=L9&}hOPbao+Q~F$tGE|ZIOm#XBh=gloGLQ4Se4?%
zOf8m_5{vSN67P>YGBO5IGI~oi8ULL~gSTHH<D)4V2{t7oc+g%VBVO6tr^#rv+bf?Z
zXNA}uEzL+tu)S&QcsVmQS(WBj<7%=enY!Iz69|<X<o!#$Pf^Dd52`m*FLd3Ygh~6#
z!d~)PLeT}Ed-TY45GhWO8NgbjC0?nud|?>P0iTDjUx$(d6;PUA(|F<{HbhJ0b%@;V
z<irVOlbooz%zg3iU)YPJJoQ_|nG&r2URSgP>gEj?AP<s|d+~&;XMNTOBh=2m&gQP_
zw<Zs;<UBW0NWL{yp()_Qq#$yVn1ZHzIM$&;a|Vo%7O)iEN#1i!EQ-t_Z_tdx#YCP}
zBGZTmbs1|$BClg3MdbY%6<bAjO6Fwh%mh3RJsZh|Hq4jHV#!RIV#$MG6tpmq4SkpZ
zUOCrQvy(c_4l#T&&VydhRC`?{F(f5>3=&Y0f?>r5V87HWCFBgL3udRZ-qxdJfv(mC
zE3h7HBvr&CBRMse3dwmfH4{AUvY;ONL51|N|17~__0I7H-i%8TgEH|3o;J3mH_JVG
zc!dh(0d)H;;lz1zk{)0 at 0>wV^#_o$<*T<BuIbmkZ3|^@j{MUyO#WIMCwPxZTSD173
zBNQwmaZk+asibmbkUy16`~GJ^c04`hQ9rw>b6RW*o<7C`e1APcQ|)#sXEznw2C><u
z8e>6+vOqoSLtirL*#pcdR6%~Nq*aVD^*=&M7%>yM<EWIwSWN=UFehPhU;OMtb^ho<
zllFy4tnXbs!jf-^Re0G5t-^`ktlni<ik99H<B*s5?6?_qk at vosUAg3b#BvKl5T_VX
zDJmyt at 0Gi8B{}PYy7Ac7UUzSvJR6q+ueQpEu^xN}_gU(k{=6|-88d`g80FFd-42JR
zJL?(cOqZ?hVRY31Io(Rn(8A0NEzHc&!psaU)MjWQ%p%nC2$`YDH?$dg85a|qi_$YR
zgM}H|JS9Ct307!%Br`)NL3Em)p_wvmhLSSH(%kY0jKVY6IIM%7b1D6kI~3%$yLu<V
z6toA6WZpMe&-;>1FuDnIs0iw?WW>nGkx`4k9T)G2k#BXpB||qa8n795_DK)go|Su;
zz at A>&x9#{g=jk`=&Z3<`PAX3OI3oY=tb`2lP$kTqBuMCkT at mr~iF_7xPDf_^nSZcM
zi_wW(Mhm0>H at or>Qoo-8n5+PtrJg!AM$6<}rq^!_3WVy8m_jvaR71;m_U-A7gzt#)
z)R`qjy0))N_s-D#|FLZQ|KG~ij?%K7VcUpoeVE)yE>*(HY=yl5(ZMhO8uOCqAlDD@
zUs90*Edcz-n9s#O at PNW9OCk4%&|iY{HLAD4KQsncYPq*E_%QJsGx%54h)<_bq2kCV
zghu7s1HKneXw=*@8T>)lRG2GLaHUg?B2?UeWJ(`y;CYm(^$_?14}w-EWXgR`h(9vr
z-VFYMrt$TDq~gl}`d)oAG7nSAQgWyNmv;@*8L8I{Ga35tLOb{LE)1 at 8kGj?l7-G75
z9wr_`>Oy?B5%a`zQ7IQduZk0!NsjoFzZA9Kc8SHGh$C_{{Ev^+G`@}0H-s;}`s+9j
z=w?}qE{4IYpjS94c4Kru?AFK5c at MnqPA1RR(I{|^>Rj75MdCRb{QU=I8FBt;dw1^Z
zR|N4PR(x at K_3kZMZB|dAFs9Mm<)7xS2wFSpc3<~QLw!D?`=)9o4?yj9Qd_p6?O(0W
zr|aMSmHKR^{{2w at 1Fio1|J(Xn`(*X1^|?&_AIUN$r0P>w{a5X$>hGyIp00f#)LO6B
zM$~Gk?O?^AQth~+whe#J|B3&NV1-&+{Vol>!sBX09Y97^tF at rj59=o)s_&YNR%0ox
zD#DX}^)8HkeU3g>JkC!1Cqfan`t~h!=%}jW3+X;ev%_X0C;8U at I2&A**dNgay%1Yk
zbJ>ssxYK>JGFp$Nw5|xW4K4gX@#oY0 at BT0OvwhQ4S^-8S2BWfQ?`?_*{O?lv_dCM=
zas0Ov{ti#2#$SLjTI83=Z- at AjZ_|mDp%UQ8WjOvwj=?ykIqvvxalHFqaOC?cWRY4=
z%jkJ>|C8m>ef4uOPU*sH6)9Fc#=Il|zk_=EB~jJDMU_%S-}8S8<ESV0{{)?woqB`9
zTS`tf$W3Q=GO;#XMo!_>yUeC|c-)=mFwBtdh#sEDBMdwT+rZoPpV98)wpUxX&}~-#
zqM-9>ucuHqMmXb7yk%sT98%Z-(gXKzhO6p)|2^)KjY5i${Bs+(ZAR+5XQ~~qa>+ER
zF45C|_Z#{*nb5(AF0?wr1jC{JHftLT?VeTJJw|>-l+4R7<KY7G?h)ar@{N;wS+Z4E
zzxO8~KlWFMLc17rws}G7TK<ca)G)U}BjhGCaQHA>Le6i#&H;MwmTWYFC`wBH8GFSl
zR#c at b1*v=>RUq_4N-F-`SEPDAEfq~}93$G5;z<?$E2-GaQbGNcCckVCPyg2(#EBe|
zY%KCu0H;9m&o#9NJ8IS+e6r)Sy+41$Na|EyYoa5%>N)VFgN<zmLaRZ>29}(#Iu3cs
zczI!$(tS$e!S2 at 7sRzkJ&PQyrP6p`562Cc2PCm4}8vmQB0oss06VdW_sdgN8g6@^B
z3F#7=C8r*M^GF9Uf;nMQsqO>J5|OWD2^`5%TQdR9nZoHz#Qt}S8IIR|^`u3^&(2Vk
zr%qe6Tq*dy2J%}DenU{u-cU&0H at M=gMYk4cx%4 at Sn$xH8hvKQz7A-fX;@1NdOP{x>
zxqoKxpJw=w+$j~`2+#*#KX1`BlKvffFGKVC*UwutnpZP4!OQ0 at T3N4WFIAl>e=>d6
zqUH`}@O#te3u>+t{P~N2ot!D%mOd>|b6Yd`pEZr=_EShVL>m78J26pP{nizd-#{e)
z^k}AZ<`t69(9Ssqi5wx&kzOG4`q1Q<mo{S>_A<9u?4kw=iD!mvP-0RXE}rSra#<>V
zE<lLPBq)Piq(J at U3n=e8uZWkayUwb3pzb=OQi~)<?wtVUud-z;3R11=?-PY6a<hzr
z6yz(CZ3Yx9O`WaiTn&5+3Y7*+)!%?AMLGx>6mmZ))(Wsb=11i8e;Yj6m=A9cR3M1O
zV_O2H<YX+i6*rw@&KuOTpJ}*KS<;*B9(~@8E62p%T+1#DG2`=25}BUkuzsw3M0eK6
z--D~8<&I-uWZCvwf025-BNt|rDI`FIFm+4^G1Ov+DV8ie2eH^&!z`|imVx#rb{@N9
zxP>~y%C=3Y^TW=`vTgHwogdcC1(RT700QsaBu{8XetVGIgROKTkt02?FF}P(@@7;|
zBZG*zGWGj%ibR`=1Mh>lr6gKTZdi@!qSjWy-X?v3e?jWMG~e<#rc!c4q+AI#_Fy-f
z5Ay9J*l4-DvDK7174yeQyc+x)XudS2;5*N;m(Q<sN_09zNX3d3XGKe5%9U>h>B48(
zXjzN_|GFs5L!4FtGu9h)NM^GZb2-sk=!XJx_^Tx$Dw6wk>PAAXhZvlVDP-Irnx9Ed
z6d=7OrjNBjUyEXf*bW$pSvZT_lZ1XFd1IRi=1vYsIs;e6Ae!#2>w$HF)(*G2FMhIM
znA|s;G7q&OP1^D>M5J_O&>&7NLnNkDXPO~Mr6iD9%xj}7h6Kp5Bu9SLCL|E-KGeXs
zqlh(VNY$mlCrQB}gP2=}2<-<dZ3Dj*jpy*G#sN2{Y^thTf#?=va&lN>oXS^=C0Tg=
zI4uuF%VX>gY6;%_5IIMLI<p&)J`hB`H<5T<S_+!r!3Pkdr6;cgo#d#$39$8*oXb4)
zmeiZ<ujG!y*)*Ja9Bzq*<HzCFYq-2|I0bMf>B*=7Bk~LNEW#uWsyTHoLi(|aohkhV
z>xcExlK7hgblV2?G)30c`wz-U*Wnj&xg?rnL8=qo5kvS4?9ZD~Tk(n*nm;rlU`$l(
z=C?CnE77-AF3H>cH-&tINVRQVF^uOAG33-iK~GQrQ<B6m%4-9(@_K4jc?Ew-Xg;Kc
zvd>%QFOfHTi&_`83d7!QwExuK%7)4v$J at 9QymCOy?>4b#F<Lg5Op3)UD=v?jME)q9
zygOo6tfCC1=MY+U3QAX6SdoX)<wxnn;=~Ue;aE;&wmfn3ALUy&51yFFCNZV^8%C`k
zi??@}#EXh)`9<K{pG-RbHcE?kK<$+lI${Ajw6zal6AR^z&sh_BPmR!tNqdU!_72+7
zujGgm$|!#s;-O?J>$oF^iB9+=YMZ|z2L0!DSjoF+rz&>Tp4k)cgB`*o&!Gw*`IS^)
zFbov?CI4!f#|@!UnWl;)3+?sO4ZNSsO_~y<f<=q`w9G3jAn&BgB-YvIcafXOA+Y;e
z-DXlVRO+Xtxh+(vk<=r!e%kK}38B>_)=`jDP2UImTj~~ap6u`jx{buDcjv=c6v2*G
zY1;*5k4x)qGo=Qb-9j<kvTz$Z><?`VZ4GS+wMrt-OWn3-fj4DYNX>=MbuN+I|MEI5
z4Eaz_5Z?(kk;TDKkkX-|qu#?UBzM#+)#{P#q(#d at mXZ9n94Kc%8`m86LEAUF_$dgu
zPqA1KZGkAMdv*7631H}7d+4svouQ`CIw)hw9b_nHyUV&QB%gxG{o`&6xvNa>C6imo
z<n}SSbxdv>lRLoV<}bPLOK$o8i+n%i;R7kc{oqB?nC^9+^+GIudyMK`0O>8mw30Q#
zBwS9O`w{pLxlaDcY(EumK`1WFYCQ49>pE8>+U#7um#Uk9j*vUsax={AMwsQN{QU!U
zCrVFmsT)DhNHL?X;o`1%^`dq}ZZbyAddoAv5-Nhz)Z2EsqCAm>n9e|M;UyP^4#fj9
z?=6Z{s?X^joBBP}HkH>F;H7W4h-=63ddyN(HZxc;j#n+zEb}`eZY^D^rMGM8cTbd@
zZXH^w@#;w5u#B2FC6h^V$MPyfj)PNoEmbN0q&`2C5j?L|pYuG`)O_G#*SLI?mWbTb
z)aO^!EJx~@FzHbj^aw%AVvr{HJ$G}WT);-AYPb@~97~-Ug7lNvNPZeWu18$DzQ*xj
zJP;RQ)|yVR@*HnrL<iF70TTSH!4fsf%e_VZg+V8bOP@<lqD0T`+JQCFJu$OuGfGPB
z=9s+3oE&6_8cyqnZb|jPyRW(ctH0C(IxU*Bc<rWO>5B^zKiFNly at cE??R1Mz710sy
z#Rb9ApF8WHLP>I;RGi4N5Ia=`zD<5RVt2I|@Kd4%`dBIQzhon2fIomKk$;ljZQEYb
zSt~wONQ)EoY@{Gn at -_ZOf(?B8$`-o6O>PZDy5r=xw;I0IkFuegPnQqXruxycw%VYe
z)Vt*RqPcZV2qb1SexN-O_VN$|5>HkoE))YCC9>+MpsR_*lU0dP84VVn?nJ7 at I+{qV
zmLz8F=C-Tj*h!6(c=DAkbWc{_d3qrphJ8}kfEc?ySDL56odDmEf>8;;_7qGt1N^Pj
zJJI^(0E;Quum#}x05f0*XW4TX{v(Cw<^X<y2JZvdk)p}H3Sb6ca+k#faDEEUJO=Q@
z6yES2z)MpwcOSrYDcD#Euq6d&?F2Y4#orhJnAhOX05+%KtQvp~8ms`U*JP*%Sf}y%
z0AO09`6s|A1!qIw7bZ1Ww&zxMq+k=sT=}pD`vKmq!A}EyJO$_E1E1L%yaH$*(cp6c
zKa^^hZ2+3$6h4>eaEhjf-vc}+1smG{o|~f2A-`zxSqiT^1 at M^^tS<w2NYfkXmz=^I
zHUU1N!S4h7c?!<H188bA_yWK;rs|r<fM!@5cMk9_ at _u3JEXMz7P2nFp$S=SIo!W1}
zaG#B-<?1;K_i0Tvl;_hlp=qN+4z2vI#EP-iPTsV!hWj<^cT}S+`U-6I(LsM{HS(h?
zX^+YoS~u8tz`W94jr8O5wO8ifQK}J3xNHC}>r-4_Zpd)CvZVUu%2ca0!rRE6I|n==
z<)##$Bh4CLEq^$CW&TLvSIXCG`Ndkk at XGv44}K*- at RfX}mS2}xq1>I4JM=+D?(tav
zzr<Ew(Z_KmFAk+k)b|u{@GkHy+MBA{QRuGVonW1xRpC3OYT=WhPa3tM1}8+1K7jo;
zzQGB8z7NXI27TmhoOD?VzpP(*FStpngLuRVJHu&b6?pucUZtg~7)o4xr3Ik*2{XBG
zow(qvdXIah1^k33g2$X|HW@?54m{el#()~u(C8PB61W*)8^FX;N%tT#v6|w#LK-l4
z;#<KB5t3aNfY`O at R)FBiu2Ug+f`4Sw9YeP|PV)3bNOf=E6bvc&ptp(_+i44=Y%9PD
zPg@{mp8$9vzzfi=zHP7STnk`hJ at jhpfnO)D|HX|5u5vnSxnEpG(j{8D0#eq2jikf^
zX$oGV!cuiI37(FZ^!6=N(3SW-_&hmna%e5=h^w7d=eS5t8cXyvuEZExP127bWlLI`
z$y;bnYopOZV1X)?9qg^Lby<nU;hSl(`eu1}+U(&c=BRIy^0?MdjgPD2<gKq~4~d8L
zEK1df7|mz_SgvAkg?M5Y;Z=7Fddy;DW=gybHbQ3B+c!(L_JAZbHp*2$&z7wQPUc&6
z;78IxWde#ENOK`IL&`&%2WdW}6D&Mqv53q>NGCyB0BIqllOeqd(r*A=5ztM6bSk99
zkP47mAuWNl6zIx;t{l<|NT)$s3F&l5XMjib7gY`c<lr?qcufvolY<{8hoH$JXmSXe
z90JI}YjW_K9K0q6KTZxolS9zt5K?kLdUbTa#J7Xb_w#I`H=;8l(c85|XOhh(syeIE
zboM`y)28Xmrs?Z{DyL1;myMYbStQv&8UduK+RDjRU3vsl(%3X<Y??GSkVeo(PtZnB
z(4-N at Nn_Kbv1!uSG-+%gji8O5ppBlONh5&PM4~nFtCT&3HR!}>bblAQYhhB~jG+uJ
zn756xm9K58!Vn*k`vt5G&GeTztA>mgfP#)DE6Q!KB2&l_aFSn3?sf*eQt at Ew-10U_
z(4)ld-44JN6=!f^6<5QZIHw3bVvmDJ04?MG0#D&21|ZhM(Rw12VvMN2eXP&`>ms^=
z6vT#DQX_SG+ma8yk_f9OA8L~KHVwoI%7PD(wJY;JwxJ5^{S>TVQ7VpWZ)&B^EWAnb
z`v~MOE}!-J6z at Xna~zN#$ClLZ!)%FrD%CftcX|X1AO4Oq=&78PrBL4)qH{dmbheA1
z#z%|_711fD2EJ5i@;?Yo at Z)3iN+Gs0&MUK&5s0M0CaDoPt}zIq^=j$q=XZMbqy)cv
znI^PeqjJf+ at Cub~Xx_Ar6c<Q=;vUa~bhc9Je2(4NyR+KzG+kXagN~5 at X~(8v7gqCt
zojZdTYfMyR8Xi<=k1(k_B^5q1uT<k#O87xvSESnv-TAL5NRL8yinbV1gpsT58>DDx
z<+<r2%=sD7iuilV$8}87tI*2FwaKI}?jY}L;{LbzvDwNh`#$M3cDPV3#!sB1qSLWn
znW5Z-n<5pSN@~K`>~ZBy=P2A2ovxr11<6GwdIXyFR5BC)6|c*b$^nq+bhP4Ka^q<l
zUWD%?xQG!nl1+Y at 4~qnY52dKcFKAuRhyH@@!9^FmfIFtXPlD_#q~qlG*;1u|e@(@!
zxeErB@^ux%T*v}U_609+uw7_@=iCcEcvfFf;Ay|m3Y2dEr7uoFzA#gJ;4;5V+izvs
zKB2ZPerfZTco&>{V<@L?H!`ZXI`oQw$`KtcRqq&_g}s9ZKaSrD-cJjin!DQf8nPb;
z+4?+O=tLX1&Oe0MAS>o6Wzu|{RQLDS#k?&_s0>y+(?fpuOHZEa|IE<`<FSOS99h`X
z=$C>mGQS1;EA|LM$BGezJKNP?CP6EP)l)0$W>hbu_ at n;>&%_|-Lyc)cYp1z`k(Y15
zB9C+aAKu<RK8osk9KJg{*_UKVCS-xAk!(nKRUsg)5o4GvVIWGw(x#fO5rSaE+LizU
z(NZ&;Op*l`2oM5Vghen!Yc=Y2#h2=$s1dEweqF_v)PRVIuag%Hq+$1W&YhPmh_?Sc
z&j+$|&bjaBo^$S<x#!;NJ<!w^7+cycitx5Stci3Q#munLl^i9d`gbo^PgPIHl%ihp
zmTzN+2cB=Zx`C1e&?~-Qbnx(eY0&SUz?9N at adpHyE|6cGVThJ?8>qkjeT2_utvu)B
zp>(#9#j=VCgv&IX+(#fsxg)8|<a2fKZrNZQ^y9ZY^cukv92dOmWdpfFQiuA^EO4m=
z{bGP-Q}#(k5&=sqCuVxzQ84Y`a%lqHyY`*JabqL;hj>kzf5^e*cw#VEiya`f3)On_
zSnsAMfp-qdyHIg98T4i<9Hac10$g!Wu7uPY$I%*}F|7XS`i{O>eIdro^J))sHo_0p
zp8d(%v*Dco#-&SWsRvECV;tT!8xGc8$T2LZf|iJR;|cf|mZ_I#K>wLR|6o3PB<AgW
z`tH2SPe=~?AcKDL56;$3IiGe0?*n?;krQ_*BRL=>ColE=mK=hikjfz*cP|^!D}{2{
zos5(L;S+Y==R0gC;t2P$;(q!aF9h-Id6gf3g1JjmAkIiFcjFmc{k*USIVle^JqFwZ
z at Stg^26>fGF4O`;B_2Z`=*JpB`F&Do=Y3cMmJ>%v`M$#t)^+jnY3lhj^)a>l`C^A5
zM2N at WH~QC+eInCcThL(aEZ_`%e8bpl4m`&bc2v&>xmuR^lnElPE*V5z5rI5{089Qq
z;(6c?v=;3n=1qr6S3&TRu-V;Wh<p8KwS3qqb>R9GgK-`Z(s3;o^PqSW*h(1Xj8+<h
z1&UWl?^V|xB_8*~t8@>Ikp|G(f=i+h>f~@o4wEMFkpAa%<rQ;W)+h;=!m!MFw<85t
zCLdTr{hu(G-v|{p2uoveMU7H^O~WwX8w+qa=Ten0q|9;qv3ATedhM>IX?Yd9Mz7OV
zG##&ES4bVtE)tKpqGGY)t889IPpzAB;i+|Ms895_{$j?M2G(<Y#`uOTaX!-{lBX67
z?<Qo1gJZ=w_{|zF6Ego*Vsf!n(Nl(SUTNPpsVl3ruW?>iW at +Dcd)FBF{iG|Sw6AG@
zm!q_A$M3q*OZ#?C?-~uigI$-G_C0X8E3LHeL0{KprG0-c?z$9y-|xDlwj-Qcdm=ot
z_Or0P_GEZ??dM^x_Eb2r_KUEswlf at G+ZDFdei=5^eideGzYa6C-{g=NiCov3oI`Sn
zTn}|hk{R5a#Iuq`_TcHOQguNCndV7 at 8H$Kdts%@x9)NO1Yv28aXZ8+Ci{$F=n!+>t
z26_y#w|hOLwc?4e=r_fatPF_rWsjxTT6pH6>>j4qSa at d7E}-GL^nPcSl-143o&rK#
zkpf=2+mavhj^dNSCX;HO=PcKNRF?4#UJI_d?p%Z`;k=z?k&5!L^A<V2FCmm5kf}RP
z$GJ!xIcD_Lg&AMX4oB;+bGWSx^&&U}F@@sM#;9OHxiE>cp~svbA}O+oZ)~;j1_MwZ
z*~K?-mOy%2DowKt(p)L#QuucOkE8wxl>ns)=~3dF62Xwl at F*Ii1?VHx*pCC8L}MQW
zC at v=UL7v;sV!d}nF?<+Up&h5oIl^K(iuKZTp!GYtoLnVcqo&vwf_>smqTu4BRY2(g
z%D-vMHh|tM;XqFX75kT-LmO~wC<o2|zgjGZvepS4L)ypcai7+F3 at FyB)0;J)1d8pa
zwFVySc+lgZaclrL3hAFwJul7@&FC??;V_2KcHXbo(o-H=%PPJ7t4m_rPg^HZFTEYV
zS9F%#g}P}d0}Abb3FN}hs+3zWjHX<Gd_=va*nFhZI?qNvBAsHh1dco}@h;B0Qsv_e
zJ!UrYOOH93@~ceTAl@*<FFo$1N=;NORi`H+zjV4yuN_koTRY;eP)<O?U540>rXI at w
zIYTXL`WC}5cGF2JA#+sh1ky40rejn>=BU{F*fMd>P|KSBp~rlcN`e;i5Zx7XhgeVZ
z)FeTR`&XqVD)twhzL!dZM&F~?ZhJ{=?Y0fRD;a9}V7mCF7 at 8YBcRR*IYu at C!z?#ni
z+B)IM-l%4gn<`w7Bt>~{0uwu0H2qey%uQtl*G3`SM#Gg6BUlCW-_SBJ?tDxw&WTBV
zBMrmU`GG3ruZ_{t)?%%$dv+1ja`@o8gBfC|+asPRN+BzXjN~&3?<~T87%QZ2);wq&
z*~*TkGW5A^x}3%VJJFOP%@;T$QL$ut2C+jD{i9$Q!qW+iEu#XAz>+ebEy$qc8%W{V
z?PoN<8j5{S=@x*#<{b_TpVDFBx%DHEhT5?G6y1jd7G*o`|5EnhAodX*FFAmYYJMve
zdxwsO2pvW`9SJ#*xzA;To1pX=<`yj>$F+8Df9l8Dx&2YCo!j at swsZSKKiy8;Z%11u
zVLN*?teVoXos}216L-dJUrBfMVat|bJ9{*&TyJOTdF^y#d<wac-eXYPxk70r3F|H7
zf3$@;dJ89?*TO6R#}=lP$F?w8Z=w03Ei`B?Z0wJ1VdH77C5>MVwFIy(t>ulM#<sk%
zeQ+=OF+&@dXl-nK=f~RE_`24{#usDT*!cYaCasNo%VVUqagQdgjoU9Kt&N*CX>F{H
zmDa`@s?AvYd#F_Mw6~(sO at n*!tbJRWo1^Ej1@#u)KGY&<zDg at oeeT9%jl<WwEpekk
zZ+GfxZX8PE<T at -m4+>(_;X6e*-ECnrAnm<++N*w)gJUm9ZL|YCD7KAur!oum^uuD)
zm&K-!yCA(O+~Kw`>5zJ+mU`Q_v8i1#skfcFAaz{$klT_t22wlp)bGZ&`=s9PZEY8%
zWy1U1sRrE9T8FnT%O3GC<WnGie&jNgK^s`|ZI235&QzhFGt9ymo_la<j~24G+b{q<
zzinqh8qVIsm%y8U0Zj+}x@}`QXBK-5Jh$_tN?EVQ7YnY8s=4iEdlcFq)v%Q~LJe5L
zm%Taq2;H}w*a*}+VC2hzoR%UU#*@c6J?u9SW{#{y47F<8P4ui>{C4!Jc+xYQ-6O`o
zH4SoyQDEDwa?U}pP7m#;IIq&L!Tkr6E>V2CO249<Gjt%mMTtK_rKdxgqhSu0)uZ5P
zgNNKXhH=tWxjy`|BrX-32iQJC`vmb0>B`)7l%`O|Qw(5ftTdONZaH2YCpP2vB%l at 0
zy@%rl51n#$W?+9{E8};GhsDnd&u%@bSP7ona}udQ>7d~|0eYYAY*^c);r}<d7yW!r
z;fePlkJDrHjNO#gmF%vxfmX2--Ib_a>{xdthtCXmWeV6z_VOa5ahNbZWb}_Xb)uXk
z(i;(5MsyBuvYcXMPiK75Hl~{1*F6kFTZV;`PMs*~F}8>8?h4GA>1cxY1%MOW6%71w
zR(C}T(&exb-z1dX&ReTsuHaDiI&ZyCrQ!UKQ)ze0hEq&Y4_Q{Ujby6fx5uPes?u(W
zN#llh)l53e1linLq|b#N;e7W_gIyYX{oB|N14O)2tP>w?&y})}GC=5VN=hkum at HN2
zn!hXBX1r0)ZTwJffGM+Okm#+K372_0MFBm9RLUrE5?HcSfQFTD7J_p|iY0`d3Wp4x
zbdNCf(Uw7Nu1&E4oi01MiXr;9I{oB%^b<P$*m?B#!zs{S8 at 3JWD^3z`(AszEL|2?z
zixy?a_m<~rE$NQ$Ezha6)^d*3Xis8Kbf!W-<g1~3V^a84+K!kMP2rjDN<$v>5NO7h
z4JDv)&_f8XS7{>d5>jbZDs2sFno3)((s2Lx=n_sGKEQ%)$3DD5=|jn;_u(X at 0G<ys
zbV_;mDmC>lVoIK;(q_e!>{Myj#+00+(x#{-+Xm=c+LkMUV^@OiT%m at i$K*X)rHzQm
z+pf|QV)BkxX$CcKc7X0=2Th!$gf#RG<=W7z(!LzZwV_L;bqwX&@Tp3BKZaM6K$|D4
z^dm8OzNykeF?qhM(t<I0{!OJluI9-pTxfU{xbSy(B^w8t))bC&SH{f&=rWLvbVUvt
zwxNCHxxM=pS!ifb>Gfz|fi6K$3E^AaEmX(WK<X5ANB>^1o$J)TT}FFyJU|YS58G6Y
zY*1tRq;c5aG`1QOPe=vXb}QD+aF=4;40kBj&9DUcfzL(m3OvQuFbd|o at 6)le0_t`x
z^{<|<V%O;Ot8gbRzOMrZ at P^Y096=k#hi?Q)gc0-HeekyhtY2 at Wl$IBbl+f~`kz#7|
zqLHQWR|IXnx at cQ;pUMdac#7|>hb0?~x_^9Uj8@*})3No~+^f^OV(L+*)noH#STcDU
zT3iToKbK-J4TVKZ3_ma0X2{o5AHgw0&$Ugbzog}=hdmEt7;VQnhtiI7X-YfJ8R2gv
zokd3n&ncsWGBz+UHUO<xwbp$QZz9<JIbio^D`}&1!!z|VrSn=?t<x)qTDX(wEnMlY
zG&w=a%IN%LiynLNdATgo>AxPzWk1aYQcX}(uhe5X&r8kg^q*g}4%zMsGp7ILJD2G(
zGtSE)U8j$T=_mBouLzG;XXW?lag67sHE8rr{X=OR^wKwVQ`@@`%1<p?5(RmQd_{F2
zdhT+`p;$s{;Z<9R6yZ8==fHd%izG+MR4-9NaK|-{LYrQtw!089=(ivp3!;NpDx>M9
zz|aW0=^2&w*w6^O=~0Ng56An+Mu3jv-HK4BBZG&EZu`#{3a1Adpva1bL|(?59AL~p
z<QXG={^lk0Z6_P at 5ryGNqKm6}qer8x!zYwDzaZOq2-oX?Ys+9}nx&^H7q~rpUEKZe
z>S=D19J!AJ5B4IirEH%xfIOWJV|uxo&kA>{Em6<MDI}Zm+>2~1Kg{7<hC4N7sBY7+
z93>pf0?K4%hlXCaz2QsUsa)ZaF?yO*!JhQod3CeX_Ds~%Jc>2Nx=D+b+5v4}I1}cv
zW3^m1o`zih9-GU??*G!lJBM=KbokUOpn<;yTRi67TlGBO671w!$nz~d&o^+UNozM=
zuib(6aax|z;_w*gz47mk)AM)~^0 at xIJRbS!Jj6RO99yWIHV3l-ywx>ZatzEDrjzS2
z)HU_~w=PI^NBDDyY1KFfF|Q4Og)6MeESQ$OL_gmLvBi`=9iW?aI%2=pPEp!;qrfHM
z+C;vJ&!s8e1}INDgx~jjH2gX}WUBryj at T6Xo&oR28^@M&CU{3E;UuC`GP(_D(>JD;
zb2b{{B@`c_oIAA9)(CGn7RbxV4O%G0LQ6STc-9vIy%KvgY*4572s3BW6;}L0g(<(b
zs3Bj{IG+I2;pB>y)*|+Ao&Fw-Em58RFP+|o=SlV$@XIsBU(-u_!O0a^^jbWp)1TD&
ziP&H17f`X+Ak8Wu3B|bH(>_*@`+&|b#CB->@@-W3rDFGMedzP(@exzL|3csRRtqy_
zz2)>fFjAN6t+*XpZPi=11W#?;TOg28AGnBxKbm(Ut}9I-BR|74$d4@%mVft!P$d#!
z&%e(J`;MY-S)yx|xV}In>s*bs*Ut`-D_oDT8>HFcVu7T-<s$Lo(P;u1Hx^GEKQ at b|
zzmKNBRoM3~>sn%aUQPcFq at N1u=eiy-Pm&75(}m^z$Ax=i%d)+r#`UOWT}8{fF+BPw
z>Q$%4odR*=B_V8)LgFcp$uq8|&LhBliinOLPvP17kN4mVQf_=tB9TQRkKXb3e}cE{
z!t?)nX;@^Dluz-a^t-bipx4Do^s6(%uTlL#=mntWtMK!}lV_4>{7%50z;Cem at 9-A<
zl8UD$($pBzOj9GYi-vJBU0tJ;oish@!2O%Vi8KYm8)*uJYJi%r!qpfzQ39xvmrAf4
z3vZA6HKwA}mGra&gqG=H`6^{8{m#B0Ah$T4eq~4aH<*G#^MRVL!bLQ03qS=h2jf+E
z7LAM0wLr~R;T*iFYDlW2w~meixw2?-CB1euDLhP*7wPq*7ENNLH;*z>h~C|J_I_?V
z?xd8Vf7XgT;KS73VQJs2Rr?0d51xZ3z&%x?t{Lv4D}&=^I2y9{6W1Ow?QzS%JkcsS
z3eRlcD0So*FE`*y_J)oec6Yq*xVzGPMzKH}KEQ8pLMl)2+nZ#=acjfB6f3mhO|UfC
z%4udB+8{nYU&b|<9tD0$`NjZHK+}4PJ*|CP*wBLC7SO(lsVZeZ)yfwEdXSc!tdxv2
zT6QD-3Ir0dVFOqgs<jmJQu@~b-RI;=X;~Cor>seVg at Lho7#XrKG;|rnwd!%p6;9;X
zcjJosaiH9aoEUs#FyB9m6$y)bn+qxoeJWQUpW(0&zG7ED;sq{aXTcqN9SkuZ<6Vu<
zdgky;Q$Lt7#p{462?L|2*~NUnx|EPf;Y&(;w(aa1QQFh^TglKhytHTgH4 at X6SlZLX
zO2)2uc>YsjyG*4$JH|<IU5rGoeOH8$!Jd1}2wFUX$~?@uHdux9L8EqtNcUl+O8G!%
zG%1 at WlJpant^`fW=81fIt)ael;Ii=Lnyf*bWKGr}JgJt{uLo|=4cj2*{R5YWE%2-x
zNDs5Mq{b^+pd~E7PqGwLkZA*z&Xlw)fNqSWMf><wQm(UN!YbVT=NxOxicAMeKfjmU
z%$KoNeo1^8zl40CNbLH*P&v*A9hWHHLiezOJzu{YzlhL1tcdNRtp#~lzqOn*MnO_s
zh)em~p90!Os7)eG2^M|5r-Wk&O^H~Qp5y9r&J6Stu15VLy?%veH`e3#KRio(DdNbz
z^-H7-yiHBC0$fr~>q6n1X?`L=zd&gYC)0Y*QEE$JL64D3-;MHBY=+ij>$A(bnNcYp
z&k3RURWt-^lqsYU?He?3<uOU6r|B_<^PCIv<Wo#qSR&5y<Cg-&q8#JwpJI%*F5^8@
z&Lt9MT?Vl4wN`t-#<{m<FTG#t^bWehsnP$f)8C^joErUK!l>J4xj5)aq~rkQO at TAr
z>f(GmDJ2&uA<02uuu|UVfj?sbE&w<{^XvoYF<~UpW>AP9kTU41VZOLn^nf+aY9Fh|
zZ4 at qv>fBLjn`8UlTT>p>_g)W_I9aXRA2m7ft|*U at EbnqUqJ#j#?|%#(QxIFC)A9T7
z5dCJI{tMdY8vRC{o?jkIpNa1%`1U1+&=&i~DsN|GA0Y=$L--U3ySB%G^Iv7g;vJ{W
zI=yMJvrg}&ioNwF57}EUSG13e?ly?=0LLjdm%{A37R7Sc50rD+g!&hbRVm#iK#^?W
zOB7pO-&La9>iW)iP55pnTqboYK8Xk+1>ZT*^45Q#&3)_tasJ%5{)jd+s}E^2*=ltr
zTmPb3_A}?tWb0d%Hq{@va3)*7Pn$2-KcLi4#dhfQjj{9S`unwcT)juL{1mG~X+pb?
z^-SUlxDM6wC#6B?T^^#tw|g9V9*eXQfnvAn^k2o!jO!QZ^f`Q1$cnSzrUtaa>+x*S
zPbj};>T!Oi%$|8}-w2g5Rp;1v<d`<|r|B}^wFn%kgZc2+pkt0O_rsG}>uo%jZP|Jy
z#t~L{JRn7 at ykJl2<HYe;$Apf;vvpAwJ_+zykeUeq!$?`zOY4QyE~uBSN5j6*>Fq!_
z>hzDb`FPzwW8W<5-qq=^3F$Lc?Tme|sC!9|5s01j*FF7Hv;Ml>v9tcVT^gtAw#Lr-
z>l!rf*44$%-s>byO6%?w(&bp2fwa}QXItW>EP9W!zKdEm#O$Izu413IJMd;Pu>-Xi
z^|<+ZxmwraZ6e5O-7lcrls~KbTPJAxTbCQFzjZSdS+AQqq`!4|Zd*L)FN`d8W2xVY
zHEdDzvhH$fUkFM=U7F0`$!Lle)p4lP_$3FlSk?17Q#sXY8aqyFeeHkF*U{QDn)cLw
z8>>~dU+eS}v07Ezq4Br&{aF6izNgcV2<g$8TCc0L*YwaAl$AR@<e;*?Rr_QKT_>aP
z6G{teA35JP)IO~6tM-A|({*ciNTHc+&+xVRGSilz=H|t3%Q=%%$p9N3htI9~yvKrb
zlnXSbc9qLc at a|CC?l&Wg_ at 6m!k&hw^BZ)A_9EN%I)IglYbWP4U!1A1TKk~Cy*Z<mI
z#oCtI1+lZrSldEFuOG4@=sQ_E!@Vr-fZj8ce<+u=6IHpy8}9xWxqM~N>2aW3lDkFH
zW}zoDf>gRVady}$8$e>>frd4xK#46pE1dy(5OK7rc}<a4={rqYrO#ufRr*ZfzVy+M
zv`QboYXw;~1N1JHRkJ3m(i=mvD!s0(v`T-+l~!f-ReDjSJ)@kfqf(#3vRRmuNC%wU
zQd%~}9?|K4M*jijBxZ{5RAfckTta1q!kaXnO49k#E_pO-BCU=64k4}9>37B2GU-mu
z%1DbY9KobpG!2m!#A=Q-U#HKG)f{P-CI`~Bu`(lFqtma79b=>`erlYOM(NOSJ^irr
z(kJM3H^f at Vny41P=5*}XRnx1}yXd_ox{lVI(nCIp{oYgak;b)}qZhaIHE-%MUUqV2
zD!+v%2ctlFp<c}MK9h at Y{aWwVJf4$PL6mp=4HD8&erlTaTz18d7c~#+9J<JOQBxN?
zUerkR-O>-xy?ma{B6)T#<cEXSugBBCBR5CK at Qwy1GLkQ|4SUz>`^S#frfEeiNx+@`
zVe_eXy4X!X3&R_?l230<Pc`IKj9#TMPZ`cHvDuK0>){LDAz14hZwayZC4ZYHjWyT*
zP{V6-6b%=WVLoX6A9dUTGe_#l90%ie%_w1AG}^pEc~7oMz<X7AE{$n^3QtE-sc~9(
z^?wA=x8|oJb5#6{9`Y at w!ZgiKsgy4V{ew5ib<IR_ at C~9#HqjHd7(<A#%_g~CHW5FG
z<BhyU_DXm<mr*i-F`@pCH2rJx{n&O2zbyMG9p3Y+pOfkL845omZ-O at h(Aw%Jgi2h=
zLyw-?5n%I>_9(nd;M1?u^C|w2<UspV-KfkG(JN1xB~~{`8T47NhUDuZHEKEc;;16=
z+Ne^!RxRTXl%B8C at 6y|`7{5l~{GDQp^mhDOJ12=^ztY=UNaN?L*c`pB*K4ORQS7?h
zD}~!+lPg`E-#!LUH4>MJCMiQK>@&BI#k&@yj$EJcvG`k!Djo<%>A684;mxOFDf&^i
zj}?EL`?&BShAQzO&LqhB5s48e(lc!LNd~;-6w*CJW6V*~<<1j!DR{4?Jqx7pVZ?eY
z?U_Pq_GXsU7|Mx_ at Z^#LJHXV7$5CA&85$e;>{Q#<0zM;2!h4h0?CKT56y>(V$ZluG
z?<_!F0dcLuHH1Ly4DWWJSRtNOm_pQeLiS7&*@JZ4t<j#Lto?W%FQ+HAQTQ*)ny}|#
zd{@O at QPzq*djzijB>E$7^eNsEo+iy}!s8Rt&s1qXOhyrXm~7Oe*CS~j6rOw0O9<Zi
zMZ{^?8uv~^a=)j)y1%Ah>aPX<9LQZKeDLf{%I89HefxN*<zm^?o`L&7x-BkZ^y3Z_
zuc4MKc-5OFZy+G|pOK;-5&=%W0;%T8W_nNTA$ffa7Lqq>7`)X!E*uM{O9b9)_sSk9
z$JA$SpG4nwo8WEN)SJ|2!JBA>9oRDxPiBf)NC~7B)sX9)q`(qPL+(jn8}Llm*i&ES
zcsvId_pgY{+OxVX>i(5huR&gqJ9`4ePO59!l<JC7*+I%V(P9U<vq(GnNmxXp@@5ya
zIa)i%HEaE0xgl)BQ)Yu{a|x;4oZpwMuBcZ9*zP2}<LU}F$o6dsq~YoAbT`xXU|Kg9
zNW(ohGwGh2i`KO?wysiH`&d~$p|(`^>!;^-wS{je;6mhtqf at v@4GWbT{(n^ytri93
z<>(1RXWT~GdfO4mr3__)-qvAI?05lZAo6+d5a*x7gr({yF{R;2Ozj!n37TyYr*;q1
z?1^|qw at tGl;@Iv)&2EV4gGclgs$9T_D`PUek6TnqBAyJQhck4SJC{n=c8;oXs+9E~
z9-tm2OvPlpL(9dp#{yZxlt>cQ)|)V0Fe{J+a*~eT82~R8Mysb6zC-uqFAXe>><$(L
z3d%D`IzA&e1+%o7WK~EXixGQi&@=dpW?t$zaoipi&CNph29ViB(v at 7gcsu-+b5-IU
zU>9$9O%cmoGsQb#-0>5J;EgdNVP!AaE3}v6(Khy&`{Kb~J}DYNpFRfKooFXj`Xp*C
z(cj$EZ5HQ(wY)QTm++x at pf6q=uf(FKse!fZHY?T=cVVj564T+1OjG+<%_ibqda-tq
z%|e?99JDpsw}PyhCA^UidUl~~Y0toO>8PEhxrpl&J1ewg4+BamzH5p%_=iK at c#|t>
z8Sam#&v;0GE2i&`AF%Y8BR1(u+|iPk`a&w`Z<84B<Gg9IPunRc at 6h(Q^{?-5=-=GG
z5x8M at -R))N`@t?{$(vB}P8opL$+#y at 9@%ZJ<zZ}jKZj?Dv=?u+?lJeqKf4II2qR3c
z at M5>Q$12BDoAtcBH3oY at -lk(<r{wM8B(P5Ty(!`@uvK{49nDQz+&5f&Ov_Oo0U;j*
z(=l$3S^TZ!5g)@4_+#+C8~9`4FHSub4{zDN0j%9z%u}{?+X4h{s>RdyoTStWPqUM(
zvjp*6{yR`!-Khp^V2+Tceha)QI6g4GXB5h9r-i}^xNrLs61h1z-j!`3{zbTVx`gvI
zv at 8mYFX3c@vC6r6g5QD>1}U#lXrdWlV{p9Rjk!3v_be at LzgtN!B7Cbt4_R7n_1~(}
z4FE4xN=@P;H at 7VGFH}PY0bZnrbU?_Wz%2Skd{ZzJAeco*ZYlvwr<|eKsy;W%kWyA)
zk)D?s%#_XWHfNC&i#gK&<}le3j+2u^RvB+`m^Zsyn%$e&o+WSW9oCmZ#}gCG;ilQj
z at QlLtv92sH35+SQMRCU?gC{IOxrub2C4*-xWvkC58LXqMz$6Lp at C`C at a@*w~Rd+z?
zmj=w;36aF^B%YYqpqXW>&D|XCtBfRp7MKI$hxS!ENd@#5o>>0EY-$Hl4(&b*zlo55
z1#-t5g885&V1Z{SXn{DTr~z^^nIhiNW_3?6Oa|%uy__iKwr7UN13r$9X`HFdn;Xb*
z5tHamYnmG%rLrhC5#=PdnEkrh(LR@>s;_7|bH>Ga`noq4Wij8oh at nqzkgYx#72O0q
zQzCal$+u{_7qRtNyUnQcPU6+{Z-+$W`{k|j7G3`uH2s6IH7QEZXQ$e?9r$!*jP at nb
zR*&jVK)nNN^}Yn!hj(d64%CZYv{#DmCFr`hEe3l*ZqzZ<y(UZtx at X5eg}l&r<CsWu
z1T8ax4yLqEl1EC8U^;|+pv^S!h7r8wlE(40Pm1L~-uFQ at Fdy`99_Aacbla3Zk<Zsd
z%m1i{ocgq)%%@TvM7@#;m2+M1Bo(ITF!C|F$ErH(#vJez#~A(NsQyuU+Yj}RmN=Tk
z>YwKf)jt}NuIOK8&j_l07wB8f#q`Yz`bJ29TcT{~HiO0`QH{%>8aGGRIQx%i9Me65
z>e~exX1q|tlG-j)H7pf0%nBNotZ3K|H40CQGplE1qINykq-ocWXqB64RZ?4mT7pH>
zD#_WNsnV>m<zN}zocgrt`?hJx>fUU<7OV=B3R<oLo9RuWX5fGYIAFz^yDUnJaR)Yp
zG5!>V&Rbei{3$Bk0I*#tF<p!#wb=c3b<cJL;1L+oG6GtXuGTtD<<;;X@=9xilPt3g
z)!d=-?BL*k;n{Cgo+Z(el)XKzI^SlsX9C{x|D!HgKxS24P|w<>x)99t-=gcnE&f|{
zUAV<x8lwxP{!(2RN)_!<b>UXZjn)5!8zsmMy!*?QQOA2r19+Mp30ZiUoOul}10t^E
zx&m)*kO>+9nhOv<=c!MZ`YcwTCF-*jpDKT^k`urp->+EYbBnZ at HA7^}Pt2^z4`<ec
z|LENeIoNs{;5X4_s3UmhYk(<+_Ls^Y(liCfi3o`~!5}+&2F8gqMbn81#)&iCTf$85
zmZB_zr at Nn#w}zkT*&2QdeGEPM!9{ex$5=PVqD0(ZWHdyJGD$>RWxaPc-PNhCvffMm
zKS%(eYvHYg<LI}EK8s45u7^$%KpvEDmJ}bahg=@}{Rn3wDt)A0qOF`W;5zbJ6}Qq5
zd*Ru8;0>UZt`gUsR4M<_!@8Z^@05BX_MMj7J)bMz*|iqjbAsNIfzUBL#hTuRf!O<c
zino!j?e{Yn+#Ef9CMp|%H}?k8i;QHs9yb`voqGaWEAM&ihupd65k2(J=X2+toqEWo
zi*x6mdcDLyozI<n?$tR^@dNJsP7k~7Jnod~x!n}Y9rU at Sx0+yk>vcXAU>kKlIgw85
zl%uo}?=;cdc(oonQE4Nlqxd*IByFgTm{xD&2)#t~|BnV1>20*o5U6=&1lt%`G}Ok*
z0X<B{Hqv?`_N|s%<w>QDS_>+VYx at K%Kfs>W_6b&o^%QT#N=D_IXi<Xm+<qzti%<?o
zKgt0!OygrE-T$r0L1nA9qpY$ycK4mOmk#KAF5F3nd*QSb&@1n!yP)$`Y(1qP1gJ_s
z0UfbF>GV~|72aNVQV(0M=XE=JHy|8Nbo)`q8BVYD%~)%M(Kn>>*Mo=Dy{*xxm&*Am
zy56Ets*qwBq4VxqWgSGtl<)u0i<MU?Qi1R3np9Ly&_hQnQqiN~m+2wNLsEfhHL0kK
z*GnWQ6+H$`D%PH(A<)-rdwIHMFeDXgzth7$N2%!1u+OyI)_$n1zp429ddS;DQi0z@
zwEezhA>}}d9`7J>PfxG!xLo`A#ru5iBNyv)&A)T)7VLA)zjN(oZIA2PT79(uu^OFz
zkJ at HCwwY2^>v`RUeXisMEwB$BQnfl7*`>+&+TX-#_1c>??OgkdA8Pg5xq4{c`C7g9
zIz43SQ2&Lm)yrF|mzQx~dFgt(5f>?s(?d-clxNgJ)|?fl$Wd*7Wvm at p)2)@c=8N;~
z$eNRytyuHXg?41k`+C^hv36w55k0ri`F3Q at -?hECYo4JahPoH`+$XvXy+u#^Fv^Oa
z(yz(Nnx>1(%9_m=lNH)_=-)MeL|LIcLF^t%2MJiST)Ux)V!zkvOVrltva)88p4YEY
zR+PM;?h*6~I1t)f!}<w}o_`E6el$FZe!FEMc3wH22%k^k>s8wHf(Aq1>^Js0O4KlZ
z+t_RJUt6^U!mfBXzJM4z(KpVuWQ|nXORmLxk6Vp7Wx0g<l0FWxQp!2=8D*cU?Qyh4
zYm#&?KR+3LB0k2;&(EjV=1aFr!(zPr{4rjBem<#|m+l-eg;|Jqmy{@l!d8IFr9`0c
z;%~)x>CnKp&im4`3OM3+j%KrXaaS%qO~o!{IYn_5FI_&$z06=Ls35s&JeQM|vZRds
z(B;>lhZTAcuRa*-%eOkH`SPuPT=V6l>tjf15xBH&Dc{A3GEh2zvPbb0T-~I29`l?}
zQvB>zZ`C}yR(mzizB<*jZ?&ZPtgXHmJ^Rp?u4So8S)=Co`*Pi9Z}smK&)U^XD2<?3
z?dsb!Kfcu^v3`83Z=$_{b(<%o4-%-W>aDkzRq3-eZ at tymo$t at rqx$Tvp03B3#HUDB
zzM;8ntDV1lS3l3WEIhX>3q!GgSEr*lpEL!yoC{bAt|e<8eyfwU{raoTxN3s?MA3tY
zQjFB^9ol>MS!IWfiuLRCZ}js}5c^7}AJ@)<8D<OT0RCaDSK-|sXk+5t|A_S}y!$PU
z<98n_kMSzJ`(>T}w^*;jyPwhNk7{E$#i)mb%@5E+xaX64P9yebO78>+?EgF(pJJPJ
zI at tfYL-ZP*eh;qw>-4oc{r5tdO+UMdQts5l7HKD0Q0!Kn{wr->L9qooeU9cCNwL`=
zDbou3pL#<*3FkJkntB~`JW;$EX{@U>siN2wIz2<<2gTBL`Uq{dO|cZ6Pu7xHKAAy-
zWYh&wR5WN+MDto-)dxM!YkupidUSdx?#t5Yr*t~5|Bt45Syaj~+H08WJDN^Y>}`pG
z_Rf!OZz3yj4z;~B&fm&oQ#_-W@@RQ%tq$mP=>M2n{aI`8sx7f{u}bg%Rkg8lu}bg%
zRrkco#VWo3SN%R#E>_*8(-+6e#HvL){nxQFvFcYky)afLR?X4r*T>4ls_PV)X#M+7
z$;7J6SeaOrq0>jj%EYP>Iz1s)CRSNB9<7YV%EZcZ8c$dD#!A4-Zk_%`tOTt5T<f!y
zAIJ9c$`7%ZTT6ecmsh?L+si9MdI`bUUS1i{>5s+s^2!#y1-muhWQy(5>04uae`SNl
ziIsJ+y}we@>G#I={>n<7{)gD!U->(oep_tsuPoE)H^uh;%3_^<Lu~J_oU7CGVtapO
zuG0HYzVuVQzcMSf_g9Y5>8Y{3zjCBbx5f7U%6OeeB)0cgQ2ifv6resKy<R`_BZr>(
zG3+RgGAq8;<DAgiL$MB>{=So|7^1(Y(~scU06M)*r at y4Ng<>xjaDP3d`H8Rin>0!D
z5MS}+kcaq+M`1K}C?4V~_Gw<<D<06j&Jo+8(>H2g6exB-<!lCejnk7?WBkTfRO%xP
zVrz8z at 3ePOiv3pe;9gM{>j}PMp-wN3^#ot>OPxM9))Rb%pwn|>J;7H{|9{+JvLaiT
z8N?>*^ekOw5F3Nq_QWGUDlr%*L6;1~sQxDcCo7_&qIo9)J}aavbC9ja&^P%(iN?o}
zZfyot at kOjpe8uO3uiz<F&2-&)z<xjmn(F^K05koHu(orj;;jpJ?o_;??e?kod+ctX
ziWd~my^5!QxRa>juZpi>#r`2*!-{>HuVKXl=ldE~Y#H)3tY}dD3M=Yy7XiHS&Y at VX
zN?nKEhC20LZBJ1}1>O?dqhWv0=}RxR*QjEl9$u__{vq~D{Mzx?upT<QJT`QePQO;{
z(BZ40WQ!hWs!ksd?}X{}WV=;Sg1z)mmL6-g_C=H<|D(V1-a(KPhh?wi%ci^CyoG0%
z|3^r5SYq&AAtlFxyWP;o5zpdW{-ypVQAW~En7ZQiH;FR-(t<LwE<8$qk0>LF`g=qf
zkA8FSge~yv3FGZJb?7;#?Y>+798V_T?mH{U-eGO`-STJ9TUFw*XO{nUAQd>7Ejh$|
zia$bkM7II-XGM+^eE at G4QfEfD9z`zgI6&`9E};AMFwCdNs at 8OiVj`YX{B5g;CrO?P
zxxRTqx71ft#2C)t`p!uF#xtw=%1z4I2H(1QCf+^Qkcj8VNQ_)Pz=e|}7GMLwBy5$9
zMGTXvQ6wTP%ibAG_e^pvVOxaCY_H6I=74-2pf}){afeh1y&WA_F7pqEEWq2N-n0N|
zy`hQCA<glU!)-CJ1voB})<8ivM{=ez^bQQiIoB+yC4e{1{}s=<#nX}THa@~2<hojF
zp*gd(BsORYm}r>tgc4Z;Q-S9y+u=#qO&!LNw^TOx3 at 0pIqxpq45{TmqShB-WPK+`S
z18p!)itF+A*5Q3^kKff}X`LRZ#(U6QEHM;|B-(50jth5?BoXvUuHC?FqEsz!tdX}g
zkiH4>m+O9_g!R4N?m8%8MvwIeC0M#m;ZLQ#PfefQ!NVKxu8BMmZQXIaNVo?rO^ocV
z7mMvAy4&i at Xu1J!RuxjBa^$A1*$ZXAp^3q7`yo=CF*CZb+hM at di+Pg6FpO|D#Cm-z
zsIecZQy~t4I5Lexc;e0UWi(_I*@@Ac=jDC*4f#b`059Z|O(bXdnD|>l1{1qkwA6dT
zhq{?v6Hhp#hdZD0X9QXF29sK36Yw-0&o0JxI;3D)>+~ElhOrwxR|L}NidULsDD3}B
z2;=D3b6UH at 9j+AUYlGlb`<mXj2)(I14e-=^xm at jKN;fSyY$-Un2>RK2 at KflCeST*-
zu8}(ZPP$g=#PaYgWxW=0Q0|{7CISZ5>o02pX{|S)PZY+&Rh|+xg)4tUYdMWaYi$dr
zDL!SEqXCk`H8W1K&dL+>N%StWlj`XMsZLhRYMr;!+gj#z;5}pzd#d-Sw=A$EXDSR0
zhvAtm#`{>eWkRou6%EA=Bsw=5xdUX}?8>(s72^jgT^aGM-RucNXPT3<W$`ZFvSI8~
zZ}ZzE@>GZGHgSS?JYU^Fa_(+qf}MP|m*iA5GQR!6&VQe#Hzj?hp0RK5F=Cy0Vkv;S
z*-_W+^JzH?ET2fCu$U0niul8zuY9MIAHiE(Q!OXGivvcKj8c>g*44n1FynFT92Out
zmCB2&PvlGcMNg;6B at +sDrMR|Oj;_y;h<Ci(5*HVIHRuVm!S(h6u at dXGG0Sa<KkbTx
z{`NzEzouCb^ud}NJ@@Z#T!W#(1u)(c$#KGAkBTP$)$+FHsbH_B$y=JI%lG at I%Z<%H
zlQ$A0v632MDwWAOc~h5lfRi^vZob(eGE#~U<2NxLC~=fxmm4I8OA;5!39Y}O9tp!C
z?oM^r>Op$C at Ns&2zC%4dp9IZvg3p9!waeR~ta#a5#27b9MBV`Qa6QaKYK5KIn?;kD
zEAg(G;-aTg+sCqY at lyR1Zvnl*?MO+ at -otX@rML?FI}2iVB3?@UxV&O+kEu6VHn)$3
z at oIN1598N5;bS>j^gg=?W*j!z4B^90TiVBq-dvyXAyCcTHkGD$#BS)d0L|2s0C`*~
zJR&FH4Tsd9YmyY#J_c80S&p%jDdHl~2^-IO3+#X+O=!tB1C7z}p5cHQBAe|F1$WgN
zZ9vHe9dc-Ka9x(d5Qlop--M&47V6~Qwy1DL<Gig|09OFKT+M|8d^zH{I!j?z#M?Oc
zILSP#9bpUbijYfyw}jG&cu9Y}t5G~GTTgU!-pJ1iS;VD%TcG8;M6)zj%5NXrmt1fq
ziSmqt-gSA>iZ?_!xeofoHQ~ebo=dR+?-C0-Tyac^m&MyK8;Ek3#Ac%0jwy=jeVFM%
z2hZTmnRMM*31if!f!?nAFqZ8*-k!PROgMo4u;@=JBoPuxLVrnlM6II<^}`}>m$?(x
zqF%;LS8C(vEtG!~C(2461>`L{{EUYOcv$-wdFw50Bke$WP7ga66Ytrfc+W0^QE0B@
z=oyAyF5RA<>Tc at aqRNd$@|;d?pX93X?qr`7<7F%8cp2pIv}{5TX?Y8jV*xy<;lS1R
zB!f7qCs`^(e_IGIQ12)x;mIWO-?&CSD2b&ZK+yW2UkBKnEV`O*3|d%Y^#p*@fkP93
z8`Yw<Jp=fbjh-fUcmg~PU?afO0G^I{QhrX??ZqDLi`!lHq4QM%8?Jp-zsoXo!X;p)
zVo8hwZ|dauZip?Gi at U^@_DOO=FkQ9){oi1H2w5a9>PzXhO9gUuw;8xRNn0cP?Q#8U
zCt{x}Z>}wiK>{9>K?2ZcT**uJU~XU?sxdbieJ)FT?dXN1rkQg~o1Jr|ctdm~O9~p$
z<B=F!;{7({NsA4*GaNmep}oVQ^}~gvj%ZJ+Vo7jM2ykUMn+bH?uR^6PSG?#@&VjNV
z(xy1cQY&z8CiKpwKubYdIrlQ5aAq~Gnk8v>y0CKOW}qiSoaNZ7C0s30^8vg;gOjPo
zD)ExhXM at 6-)%Jo^EWLo<a}6}Rl8)Y(q}6A6&xnXXLzmN*O~~F)tw;)ODcAzPQc5yI
za6QKk&s##E0l9*N_EntQo(bGZ#*rJilZ+C1I^N|sz8GEz=@W3D1Efz-;6AGgqb<|R
zh$ME8pt7_aa#~(a9ApT_TXU^3I2QwxM4U|`PH%T|kg~uSw2{Fv{smy`tSt-VL^p}T
zEZa>YCW&{Gb4JODGXXi?m0ituTVVv>#phR(K$g#d(jB=um<8i=AJ{X0XCiv6i}Av6
znE&4(Ek3=aJ?nJxu8BMNa5u<GLBK%gBQX0Bmud4MvALYmK;G)*_~uqJUtBceU6FKK
zL9Q(@i?&PTiK)#~PcfbG^gdowcM@{2d8*G4?gM*~_Qce%IW`2ez6SL}6vTC+w|(r!
z3>b-<W8SUIvEC+Pn&NGuQt=(@pRyUpc6q&QmN(3e4z3!!Wx>1R8Q0{hmX;K{hem{P
zJmr9=nc?^G7LUW9(rjuO0l#rAqx>m;Q;?A?MK!pK#-3Ouvx!yT(HnH*R7`e_u4-sx
zTooj~e3fX<kM1%+$k(kH`((htPOkbI&+S<C6o#~#AhrY{$74eF>mee9bi{=0&_mWi
z$fq$O8|eMOTwJk>#5H&)dE+Ji1k8ILTOU5>y07Xz$sx^yck(l<)~Mc?t=>uShIr6E
zy6SUpJmm7Z<bWK*Q2+1=rpx?ra*nYsp56)BukJ}8(l~ECwVH^rQU_oiI5Ta|rn7 at P
z at lI`VF78>u`yz682_GvIHm|B%tf#wTCaSw)CV+KQcDJCHH;omHYVq19LM^_ at o6u}&
zMxJ#ehuP6p-Mmpm{5#$_!2(aP{X9v9xnc!k|A(>c_f>rX?;Z}GC630~-hBJys;;~V
z`wx4^G%^t9-_Y96fOnOFj6BODZC(T9`fs2g&9m&^@5NsF2hAn1>RT*NvI6uK#5_#H
z-olo{^L-dO>6{7RBM|?6x?dw6u#fXn_lZFHRPqByzdd4s-)@kUVMkJ$y<twp;*Z#f
zL$rh~M=bE<!t4>Kt(Y3*eS0B>yknU!!^eKq0WlLGukJQ8{C?{u29v~w<0M1ah&YsX
z3TqGW7hVU{v6I&ET~?|4*Nuq116UWOe~2`|KBL$_B?7;l)J6~+3-AZpZViCj)i(KQ
zn?7MN*U?p-Ebul5UVQ+ at eBWY=s*d6fi@|ijzLY&V&NK#QgYOUZdHZ;X`vrvlL+XH-
z4D|H};vJF)Bq4nu6Qp47&|V(RyI-8}zwLz*e>=1n3h#}FQa*sv-U|@)`i~?5`~ki9
z9%qvkz}Nq4oX01#+i`{moV5y^A=AZ4HvwK2P7qRuFo7FB-Nn`3f%7E57lUP80lBqD
z65;nNcymIlz5=M$p?xbru|nt(q-wiYkf!fn0jsbHIsY#S`Ben{0XzeK9D at -ZzkC8O
zSZ7sK@`LQ>LI3D`i`c2rsJH><>UmWkqQ|eqlc~``aRatnxxfBmyNV$9Phxh+WC8wh
zfZ(i8yg}PTl$$&IOKeelCQ3O%*ixSBuz;3)ge|Uh&^CWW+p<C{%Vk`D7*ZU=Hesq?
z!W%6})qPbbfciFzA(N}x0}g=Rj@;yhcg-3W;vEYbpxs^Aerz*H$}y$gInHqmw0k_X
z at Ux+I=S*#8)OL3b?W_VSq142x6L?=GOBmeG7>6^Fuo3q?K}jcI7H4Id>I&ol<q8wS
z70MC&!m2kFu0Z^gz!|{tyAGz>m{G2#!4`hz=-MH5KrQ|StvZ>Lk;njiGI!qWE^&O$
z)ZGlmft*HH9nT at V;}P>6Khe?EDWRTxn&YTuXc$+`z?)1y<k8VIHz%2i2deBdbQrq6
zf!x8y=aA8$AG14y>EZ#=g4Rd80ZRH7c-BenA>`Z9(e;%pv1;dDXTagx`>1oCD{?hz
zxC`F)f%jdg-zxkW+65m6&=;!pFiR+Z-@;h=Bw7_}Pwytwa_}ULKQIgJT&zCl&3&W|
zB=r3p=V(SWfxap_JrQjs)>bORy?4R%UQcgzZ%wb%TdT$@s`^&k*FIj|iMT?uERm7W
z`i~;@bk`yDkT9NVkAZBb{e}AwRl6D)DL6obMj;)g4qHHV=$mE|!t*)S;kf|hUL0>F
z2XN$VX>Q?}3hQL@)_;nO<OMnsk~o_;p6W29cCA_;qATu>!n3y*X?LDbY#v(twlR9>
zOgcjplo=w at aOdIe*J7+-x|E^t21YrPxVV5PGeB~_Lp=^(uIDgX$pO84^-?aubdq1n
zkUhbdQR>CTz$Y0~Lhp{Q`nG_i9EDjD)$oFBGUGxG518rP${efRQW;9KF2~;mh%2w^
z?Hog0JoV>>*mQ29_5F9~;f9jyN9*&Q<beL at ZO>{7;aq0ZI=qk3wIHs<l at Yg-&ktGn
z6&)7uW8NDCk|YPl{%veT*p}nX;<p_j5y3n0vEP35y(Xt&lLkp;h0&M)g0nTeF+}3A
z&)PGk4mxsHkPtja;S*;K508MJdk at luarSXyOjiOvbGXsWV+(x8VdVZC-d4MR#Eba2
ziotwtL8Pi<Ff at 20%;74Vd6>n$2=g<-i>xWYz`QL5ehn>lzKpj>ar&&S8)f7W3sO=X
zHp1^xRe!p-zv42A_^t!<HqqePBU<p;>cn5Li(e~HE2C;wH_$qLW-UIYe=9j)e6kjv
z`9laHi1jtV&#Q1JzyTHh0^lcTKj0kaTfh!b+08bSK;{6CUn*3;ad<*V8p|0%%J&OH
z2w at CCm}<dMNMBDt8#sW0uRW51qazMaSZwn**c+%b>bP$M_;Y}V`B*Q8e at P}+9mIOT
zEM^(-{}j$f=p3d8_+~pY9Of`dDrP;B(7Z{V!PwLp%<v~f2tDO9JXnpEqN(A;EMG<!
z&QRpM)Q3B9P6lJ8A4i*79_>85sb(8PVjav+L;mZeF^aSg7~3=ae^m5lNhRv4{{<CW
z6EL at N(6U|?zjH`ekrKH%oEQ`89 at 0akptJ+E7%X#9)mJ$F;7F9?oP;*K7cG~xSRIGH
zq9aaS&eX>U4I3-*^lO!(|KGKbf#1)eq|b4-f$w7mLgyO8ye9mXbIhWAYp5qd90hTd
z{StTNEVZa#hH<RU4jQn}X25Kv at T_+j&E28q4sw=59*ZxGzI1wHK5ABR9EqMV6!k{S
z(cZ(%8~f`kp#@}RbXBW=SRg;(*?kB-p>i at tGda@|8PLOuCbCf9SA{b;IzoZ1$#LyM
z9A?UPUZu%zj)z_~<9HsxIsZ7<h`3VkID~@}0sfr=i-j!<09&VEEx!a<QsG|#>{H+{
z=7l5iSN_7SIXU*- at nHvy2Jm)Ly9{G&&7pZ#DzJEG%WnYlDp-pf;0C<QaBE4+pOIp>
zi)>EuZX8E at ync8;0ILdp1oLEQ;|So#SH9yuYJZR?O*xcLYf$QR%O}r`Mz-PT&{its
zKs}Ocv4rEU1s;cMswb=AjJKJ6qDuCb at 2cm=T5NlgBM11|#1<VB7#kfKn9XnH;v&s_
z1{t<tPE!LsZM<D#;LUh!U{)ZL&+;;na=edn!}zAT at U%s4_F00NZj0lia2812H%G>)
zS~Ka0vDtf3E%`>YfEEP&e-eej9eb}WjQ;)lfEnt439bJ(npTEC)b;P*pno49`Ize8
z2S+|Y{R{se<#L55&3h_vM*)eF$m=f7lQo%t>pxq8^GzQG@(;&F>bA~p+8SoWS#Hr_
z2CfW*+<1mMm8RK-RM#U0heYx}<H&m9A#-g8U(jH4ZLNyJlLf3%wEePCB!QRstyxT9
zH{Z8E4ni2-3EZjK;ee-&zqyf#-VuB$a3D~R at P*+Jb|A1J at EAV_=*1BJOW at tZJC?!I
z7M&8 at 5ZD{=oR_XzO9y=23w#ZR9|0a*Lu>qqAysTyFVr4?XbR+~*OcGUsMIr_)^kJt
zNv)oCwH|gGpG26*_+WgXK49kOa}3Xl4CutL4MzMLYPUtk`&xo#cZuUY;L_Q)=}_j?
z%G|=>5SMvF((zsC at J?#mV~C9BXZb*0{wDAZ922PHi?z~hYVB<{o at rsC=3rgG6EH+4
zD`i0_gJs#UtYtxiJI8TMJ!gbti6`ypq}WyCr&D4_K#HXapW;&;1HqC!v<vT+l|7Tm
z+oUZC>U{=JpHf#>49e~=1D+{hkPQ&~VZ0YsNF}$4A!$CyN``Xkc-bL5ZG`Ls=vn-x
zh$oFu>~Er}@a)?gpbSzNeXfZ<&p!NDEE8=vu8y>4V9tMDGU%bVzUGrX;)G{sp35#g
zd-O^7PJ02puhiwm)toJaxcnOqpLnA)2Tvz)WqVJ0%L21-C9t%cuH|^>S`M?bHsI8$
zbbZj(N3^w^Zhb9B^d4Ogvkq^(dqP~?vzb9L%m%&o0#fPAZ)(`cx+lb+rnlR+4IUDR
z6=qb1!?}sVNq|iyB+dlzX9}Ik0{Daq3jiNi<BS8iL#6Kr_*0dRab8j3Qh*Ps at JfI~
zD(nULWfk5D at JlM(0`T8e_#nV9s_;7izo5eZ0{D3qmH~cFflUP9gDT7c{HzK)01m2f
zHo$*VVIJUs3cCP)Mup1&ep-bq0Dek^>i}+5;avbfslrbK{DcYz0sbq%iBPwZ0E;U9
zZGim%4=W+Yj{yDy!0|x;9^h?CeD)Z?Thz3P06Ubl3D_^|RQPp(|ER)k0N1MU0Kk$0
z+iU<YR_R3m7prt9!1t(d0l;6VeTRAe31A!0QvvoUagvaq_o^`R>i25hMgv@?=8yR-
zQtSUPz@;ku7{G2d4wmZ!*aGlYfFD=rmH at yDm2%A}8}$l3 at d&_mDvbSGt-=w2t5g{K
z at naRnI(($U*xnCS7-jF63jYD%4^$ZC?R^z~9N at 4DhX8(0<qyj6CklV!8GzpcI01A7
z>wH9^50e0XQ-Ko)0d7;^B<z<rl=c#o^Vd}vW%xBE|6x9W4=Z#l%HFFAJPhko39uEv
zT?4#UDc6efvqq(3TUIN4V^Lr3R$x;(z^jxvh8F=|slai40IyJBE6Qhu0^5*R%hmqH
zvUVskNu~k(Yn6`h%_^J&@NH_G-2gYL^gMt!s`5M?;77sI8JhFCbdhbwZLo38=G?R?
zcW_CfsTC|DSXo}`@EAPKhopI{$*5XKb9RoMVcer4 at sl$~H?l?;wX(cy;n{^O-s4c4
z5r+4DUt9P~wCZ`5wwAoqHwFhv3!~9?#r8(O9~7JOo5ki=_+-{G;B+Q?S2foR*qzB_
zl|=F;yw;GjfRKM0eTML0`)(SO!I&^V;qxZE^rA#!!v|+Mr`cC^SCe!xCpZ&+b3IIV
z%|lX6jVH5~?>6$RY&c=)oM~Z27+b_I_gC=77NlI=&GZ;@_}$F at 6;21c3fqyBZ8hNT
z5XP2cPsA2Fu!Vstk&WyLkK(7>_&_F56JQzy^xoP&sqpNr>wDw+SW34dRb)#t at NBMI
z|KvL!KH_Wh%n83V`05}dhM?tja*ed1IXjr%=gG4iD$7fK?O5J~*R%6-UJ0ExLinEt
zt0{-R1Wqw|%U*5~$3cp at 5Z3|J>t&2{4^V0(M#<yv`}0y?IxGr#IWO&}Iovx~t>|?8
z2I$+<?Yo8XAsd at avO+AL9}zafuhkBC`|hTKH{&Ejo`K_li#*;t%3GafWeHBgCgf#s
z+zz?8K{SWv2xbzO`-^h{eqWhIy2HKGkRe at J;E;)nkmB|%!5lKVvW;1ROu7;b?|l3S
zmc^4MhSt6)#u>_B-kBLrAGlJOLNK*UPo4I^rp9_;eQsI>Z at 7>H)W$K8B{-6Zbcdc>
zYD{hwd)VM-KbG5I2;0M?EA7$K+hfv~{h1BE`s3*bCI~|*9ng+3^o at 5+U<_aJ5F0!}
z*RZ09mvG|9;26*e2VYiZb*9)74lUejZAw37?Q{z=^jQDKK#o}?yqrsJAh~3>+npF6
z5C4gDJj_TPS}#ah1r8!3?_*l*&}%%)nZhRU$>tyOFcbSfnE6JgmeYU(IVeDGdQJ}D
z-5BQ*HbHMi*#m6wmGfF*fL8e7pV|&C;n0oFB^HnxE<rpM%F=V!dpV|_Y5yx{^;{+>
zb(Bd=9f8Z(|Nn*4eqmI|1T)A9F1{wqKL*}iqb+0nW561YfoCSgGyR!>k88;c6bMPO
za({bWupqEha2U%Xdx8c2ha)2)_QL`(`Xi&lX|8O@>r$HbQvap!cNv8*^Iz6-8Pt9#
zk6D3P!CC$XAvMIa6Y(vaPl}<YYuaqNzZiT*GDzbDhc%@n!~BU at -kt@sx*a6Wb+=fo
zv|4GgXl~D<eeRIvOLw?fu|&nGybgscycW&Kqo!%tZefa?RK$|&mA2zPymFX3WBc(h
zh8I6qcmZL+3;c`W%M9QP>m+4X^#8-Z$Vm8ID&Y5u^dRdWgJD{pk-C<Lkxxun_`3gE
z>X at G>b=;4Y3O(|prDE?Om&I~bMzZz}&;9-2Gkbp(7~>x<dxA5EIBwzS4KAd~DTa#d
zB)%|uZXLWEL?hGb at Ag3vY^Ie>29wR=ZE0a6dh^%;hdw0mwqXD}D+8BptV7IvJ+a2~
zLKZ#eX7s`R2gjFWa0LAh4jzDX0NWuBSaXLMI=|m7JodY=R at LeW1!%+WbQwjL(x(6w
zE4nV-*`D<}>n<}Sf=rtUTfi}FjriO~DeJlQcw#{~A(o1i=hjPEc8<h at mXaToyOfrz
z>KD~dwQRMNcxXT5CuL!7&#gZXqi;_?$Wgp7N7W+#k2&JW2vSC;6~8}V2-G}LBJI0H
z1B_n8IvnOr1G!0qIImBJx#x`Bq;qBkHa!pYK?SykfNoXb_zHmI71%Zn;(V{d62M1P
z_;rBaRN!GIfZJ4fA;7J9N#Dx?XH6>MeAO+p6ljwRYL)^r;1os?W`HaR)stXafg?c{
z%)EHebFk+54bR^%@z47T92WBYMj?5z(RXFg0nbq_`9j8RL`ZQEUxq6K<lfm*0~D at B
z5;7V{Nd`lDJT0|CCP&2Ee2ZIN7xEVyh3tZ;;BgVx)XjZ9U&|c3NG$MYwP%xfJ5LfI
z&M0`=g#6ox%gGR^-7vrt0q5YE)MtQSPOSEMoKufl08WM&!y$(h__ISUBZR4o8P`-1
zWo0DbqW~WT&r~6MK2hnHK-^1vtATo%Fcr#~>ahTvCM?MyfMe{-#d6<m at Ek2nElYyB
zegSYg!0CAF4Zsdz>I&jp3{Zw^s)2#$7zi~${!4`gw<SRtnZn+(QN1<7iX{X>v*sMX
zE!{P3bHCkB#=7<-VIJdLSBn;V0~s&m-;Hr52vfI{Ifs^TE~f!nAi;Ze92pTJ6YXVW
z614ORh;wCdk=;SA5;Dq&tJ`2%@SQE{8Ur<w$z;fR3WQ~k=pa+=6=WKuyc$wYhm=2q
zls^wFa{Y4irx4>Bh at AtmueH0#3 at HCPh@A_uuZP%q5PK%X<^xy`_HUBlg0jHsE%;1y
zKnf at P&9ckTGk(TkcQA~-fiaHgVAv5MCeB{QnCv`bwr4XI%z?3D4iGyYb8tlrm?{D2
zHb^zhUcn?nSQ4ayzGadj)o_|BMaTdtn}>dc0F8p at 2$U;V_q?c`V at 9GxLAp^wcLnj~
zm-JT?$SoBpmq5%*AqC^gAXxxkrlwAVRF~UDW^@k&SUO5A$g2fl2f!F3Llk^Yc#ff*
z^$-qXX9}J&d}d*Jf at ce+VKy3oG8STvgFMIg7y+7qZG`qg-!c;cp9HnJ0@`*ZaO5gz
z+hl0l6lhyEZQE3An=6Cc1 at JVipD!Pvt0A}PLh^0s3HdX4axP8`0sQlB^mDvMNZ~-o
z0Lrnu80a@<2K)`e-?_n8z`7)}gk(BNT0+~DK_c8ijD`L0oGk1QF9?`Ws}&z-Kb}Kr
zX|Wadzds!QMEL70>_5s)=0^NoG#z5$`Qn?2V81LlA9~J9eV;8YPCwnX*pfde($T)d
zlQCc#$SUmLF#>(==Mu86)lk^K;T|ZL6m2C}u}0!7CM4BOEK30{b}cc?#Z#|ZrWN*Y
zdph^>LBW^7`$YnEt0#ok+5{nwY=|#nqy07BgT*iwS`NN<&<XWU#Z|V0uY~j7HDO*(
zQk)PryDJT51uIEto2t><EWil at oS^j3Sjh8_SekHvr1&x(@VXu`kwAPC8!|)4A2yhv
zw1Mz&T=lG}e!*EjRZK0JDsnHpLd&;8`Neo<-of`ovp5k_xMghRbpue>rcHQP+TiTM
z{_pPPD;yT-Ra}>n%3Ma0+v;g##ff4~VgFaj(mZ#W(Kx_w%FkiFq>b?%-;`gJ75&eq
zL+<6#FGcg<YjoThcJ6QOj(3b(;XMZL>1#3!iW0#wDfjxwZBmAq593BA?qF)n$-O+X
z2*2o2Y$~qWMgK+ND-a43$nQ|$nV;V(SQ at ffP?FbK^v?|&OQ at GFu@8#5rPDeEoAIA6
zl2~-il4~=Mgg3*u+%$8_n+(nb+Ki$jY?O$UQFvyi5B?-t6Px)r&P0-d{`Q~5;nzip
z$evd8Y<x#506y5;QsFH%jw}*cet0dr<HiDxT~CrkGnpcqK8)uV7}y<m6(n`E9b at 6`
zjQrz0cmsz#;C<ZeN*B!qIAZ4)_J1q44Z~EM3{7~pP^8mDV}A&L$MDOjWDp&N{odm+
zSHZ7=9K89zotqT#4~mB at Zq5+zPGu4bI133|pnMXJE8t87-ZLCt7<Hwx6N@{C at h%(x
z$b at -gcy|B9_T486x>(=hreon=9GeHpWbPmDzd5SdktCOPv!pX_GL+qB9TeetEM${1
z^DIYl!mKn2o&`{cV`@(oJayRP5D$5rl4F1u&Apz&Gi4h at t2n;3Mp}%wO%(Qj(;Bw+
z0r$Q%iPmnMYdz|5xOa+|%WNoNMy8L<$h0}2lrZi(f!2m)QxQWNTLq9Q%M1sEJM?fS
ze7SpPL&il?vU<w37fopqI7br3375Nf`qM6w1E=H=y6K|n9pMi5&ejYjNwkD)&`;bG
z+0EBJF|~E}uIV#4iOk?w2ZUKe*Ff0tC#Jz~$`e<sIjP~{iSC^h6DITj2p`TOzY-J4
zJ~2sh)Ean(9R|8Nif36{6N%K2t4U&0L*#v4wln<H7g-K)pe6BS0u$LC8O0e%k}t!Z
zYWkdK#T4LYX6TyQ{5<cGRLSA#tl7YiCCn=mq%z*MpX3xI8X6z`#NwSVl^wC=WJ=_T
z*6^ji#qJzSU-&FMvn}=m!*Ok3N7mu92P*g?n{9_9|3t&^oL@;KI+>r(u}@})zXrSY
z2y5{ja;I|tf_^_dI4e>wl{Ibd^}J$~41=$3e+6vCZJ>eC$QfxEXi$G+jhh(yfI1Fj
z+v#z%xkPiTv(+OlF6{sMK<F~w*kI)|cUkjt<{XtWnnvM1ot$JZf#>iXgV&OK>$w*`
z{dpctt7l}|p(pH)@D$k)y8JW~Fdd6OZS+q)W<JgOryXNY$N8^5`XOq|oHuiA$^AY<
zZenu3I8Fp>_idcy$m8a`8BV%*_&2BX8s at widfwxZhC!XvMeE?Jv~6P3=DwJ=N%<h-
znb5lRYU}LKx?XIZSO}6`=Hc6ZqqR?5U)bN-fc@#S<W1n0 at hQ+!k~ZjNnr at cz`DE7C
zEW+>bC-})Xf8RN;ICOn at 8nkTmkF>0v*1QdB{ynYv_hO+^_b<oNwzY-1AB|zp^UrAu
zz3Ab?@xagLJ~abB8#I1mi?=n4 at z7#|-V)JTw0F=y(WpqF+W`6_zUvHt_SQWLvtoYl
zq1>y^4JaOQ#m4AN(6 at VvmsFG2&AGPW_JT5o+}J^k#b8B4NEubKgjFdXg)*XKi9w|_
zD3sKaC7ep}DwL5WODvSql#4j`^O7aRpu`XvO1T0kj7niC<!3-)Rf>gDCIQ8wQn*k8
zP$mL}Lkhst)euL>2vkS0F+|JeW|S=9)!O(K%G8o24oboHKk9)rp^yoF`4G%CPS+zp
z#PJf-K8AAXT6jmx5JRno|JUBPz%_Mcd+(E+BnJo(Bw$pO6CR2dF+5a?5f33m(jtw3
z)lwCZfY72)z)Cw-4;nREsz|9tOKohODeZJDo#A at 1<2Q|uwmN-`(<#^9nbJXOE%q7I
z8LdU~t$of(2m!2}$Nld2`}OEQd+)W^Ui-QBUVEPh?0E=PXjcrpshv6S_PIMD1?*&Z
zoyO1MTI~&erNv05tsHpEf{sYEn+D!widz^6zisgU;xDj5eS1WvoeydK2i|I3ZbF;d
z at H6iXq*ZL$l%+uA%V)Z7KC`6p`J5aU){-m{>kI4s+sW}FQL<*U?=GV28eX%v6%8C5
zNV_P48TveX;*!F`^6%|Xt$Kz3IbpYFXUo|`#%r5rVq0cga4MzvkZFvvkxG^vSIbH}
z2-}$~F`AzjiDW0F)?QrhU40FwacWX6N<Cr_d<)uM!*x5*VO{vrJEmMjnQEMEZ99$}
zw|-_RI46GjrLMvKszwohM$cli?Kmq-PTMO=P7C$jb+GF@?Q&W0AH_D`E)g5PU$tNH
zM{yhYxAfpzY#kgpe)?zmDq^xhW*6BO8Z?My;&-mXPmvE6v at NtP)F&YX6rE0Snxiy?
z;b$N0erIl4h^_)y8N+c(6NBiEsNt#c7pjM+J`x2xUfPu&W_^{|l{)G+Q%AW|!+c57
zLh6{?OdaD+{k#R8 at G(rY%g7)k=iVX!7h9qhl#1SA!G4pFdtlcW=-{4J!}oDvXNwH$
z5jhyRWjpx-D_0UIM2~3Hx$Adw=eD=}U`%=J^nJ+g$bsX=YmciI+d&rSiD?VV<N?2<
z-qHhfd2d)>Xh#elHGd;uPacz}u%Qn0N3!Ak)7Sg!^Xo+4cF+ySF}1(G>+_3mT at vql
zvrC*)j3gIN^ojLV=o_$&CEO{%lPCmsUjF%2-(bu6oL5OyVCNCIR%Gx{jri|=D#bt<
z54LLk>kM};6N<n3*=e_c{_T#{YJ&#!3g0T2c_rPEmkFJE0|m6}m+LVV)4)omO~r+X
ze at BF(xpWF49qmfDOpWaBbTp=6zFh+&`9uiwVcKPmX4qs8v?bxcp<z%^RfDO6fo(~)
zq*5ftUnFg4OVY|Ek6|f$Q|*%>mBuAWkfJG7lL%A1bFxTq2<qe0r3IhLB5AMhj_fCz
z=0nRXNEPO9htm4B@%#qDffzMSF|<#Jt0sJ0m%l9uMuy$1Y&Iwxm!}^Z%Cl6BRG0$o
zf!pXh9w7s27{jwVXhUS+*}cZWrNaA5!m~y0H at y@`=%F1M=?8nHAP5uOJ5IzA8unLr
z=oH7OqrW`LaUZq0xWW3F4&#K_vaNFxekZi^na(@#mr*-^*-2x|tkY(zH3SawXR!hL
z5d5|n)T7!U=6ng3K<KGy5O#mPwJia+dY%F{1#%cW1dN>^sF~>XJ+DXO7JdEa&>I1K
zOs5j^DC}(RRO0uEz_09V7D^MsmFB6=30x`mL3tHq6|%rCOm9L8B$R!=g*0A!;&b2+
zD#d(zI>Weht)2KZxe#iD-EeTH;J0Qw58$==i9c|4r8=L%@2x*^x-*E&V-FX19LJSW
z9_?@k{&sKYFS*!XyFy0ibr$LXZOBICAqv?k-lu`RjL~`XYoqh;Pa2}`Za1v9iw%?#
zcJb6qgQ^|rXCuEY+g at +#Z2s-jN1y3zJ^Fm-3rAn-eEDd5=W9pbc>RQ7yq)Yk_1m{?
zKKOm8HXpqAIofKx_M1)%0^idx8seZg14|Xpp=FACbaeOYfrfCI at OG6>@iBFD_fh;F
zlji6y?AEhKciH0c+qBqHZ;Qu$vo{rNhqo;fUJFna%YeoSAzw2NX_re_*Y^Pgdf7)4
z4AX8Fn$)63PV=G-e|DuXsRQrlX_6(J=ER!Rl1W_whUp7D_&wr6`O&RMBnkU4G2Vmq
z#o>1wz;+k!B~QEbQP5YeH1yQyD}*7Og;BQKX;S;5!6|<x4T><-B{nD~!dP_FW2syo
zn#;sUoi?BzG`M~EJmZ?dc>U(`QA~|?5GKV=)HLP4Nxi~yvP-O2Y?;8IEvNV#FhAB-
zcj{VK4yEcT$SuEihyyJj;y{6*-2proE-PA&pY7rLM2!A~>4vCPJwVr+)I^>j<GO+7
zXqhgWq0nd0RE(^AdBl3w;NpZ(?NG=Ni>#0?$)xu0anqs_9)ek>-J~YfLuK?MhssE}
zYvD&?+6~aLhS}bH%SPu@|FAs1WUssn;ZBoU{_arO{V06iJ5(yMc1TK~6I!mwB}uIH
z;G(^_R=K%6dRbgCrmPANF4O3;a9 at c{-S}=A0{zR;(<e>bO!|RIL1cCmVY)89)h}N|
zkh{`;e;s(3QpFa>QTtJRqD3D)@w(0s{s*_7_E1Mp9L)hcLd>0eeZbvoqmD!z%_-%i
z@?+xkBw?P8-WzHU at m?`>YK9srogY50k%Q$>2=kKI=C4Cqs?8tYOTbpmF=559qM;Q8
z_!PEx*fd>yho3$?-1&~wc5-kfeowMX!uxtqTe>Y6_#`@%>~~sb^Ap}KB)g<;zqAeC
zHBs2aJYNjv^DTvqGycLj at Ckk?{!1CIk^bA^qr^ezXW at H&%hXjP#|qXl8?T{4Yee)D
zc&2TV?-E at U4Xr$vNc_Ef{02xBg`a(UhlO>}ub&wH6?V54+juRu_!+P5d~5Xbj9wNG
zd&kGE?>3JyL=BB0F&;y1E-^L4MaGWBMaFu_5_;QEX%D<i;J*zsctoepa@$#A4{af%
zToOHb at Yo=ucpgivtA2)9C;zvdggRQdJh8RNk6f05k*ja7=X|I5w7l%*rY4<d8lhEG
zyySiY_i at vFMsbzOqY>L*Z<vd)Eh7HCiB!W1sfK>bx~RJpoF5}fuvrY at cK2Jo68u$j
zy-g2#gTE?S&_y%!RUa2eehe94vtT}-;e5|^$$2_aHH at xm(+guDm(z#_L!dp-^=1j=
zHNH)b-(%+Nv4XAzWDt~2(T<v8FGfJ=RHBICrIRtkq_68z438%?!{U|h+?6A92U(uE
zuWQ4Wk{IkE27kZ3(+(jeNwd=o_$@YkH+EVa3ONR{{D<8e<nC4DdxQEw=h;*gI)30_
z99r<D>$}zi$avl7MX)GxNwh`UKq%oC><0)D4}<L_u^>w%?4u_DEeB{yd}QV{yyt5e
z&jdq?UvqCjfs4NzM4+>z0g2E@(3ec1i58c2MCcT!eDG5Ocu&Q<r@^&Qu;Q3u9%7&z
zdVD9qB5%-I>N|><2qb6J)^QEQk+gg&_&eA)N8od1*PM#~Zqd;Xu=}Clf;IC&oF?S|
z<R^<|JjX{s!9IL~u2Woq5Er+(Glx6B|3Ij%jH|88LV<2y=I$XNtvo1%KY<8RVi%vY
z{9;Fb41U7ic^N-74|d4)(CPu!cwKsCfYr(qw`v3C7J$1A+(K}-Z|&&~1b at +`80_nd
z1}j&5hU%cTQ|7M1c4r6b8oyV6W<sm3Lw#U#hmKL$DMqoAvt=<4(9?E_I%tMqC<aMG
z3<_ES@`~|uW6-NIi^#nzi;dGPXzh-IT<ed7!!L{9#ZuO4*W8qCvHUhd;L17%R!ib0
z%T$Y~d#cudU;sZAoN&<M)2-I}-=w<ff%;VR-g#Vq1J$S^3lRgd9&v7etK2KUDtza8
zZ<5_tJAWA6(jA#6Mxqh)MvhL7pxZb)HG<yG(G?@;r#U)3g8m^#XGYNbx+9<d-CLtj
zp~qqu2Al{OpxNWv$u|kM$0EjGu2>j=&kDOE25j6Yz^y}etBu#T+ at D(3y#aH=?qLVC
zAEqtt+&RFqG at C|iSk$0?XJEgg`+$|{74=b+2@#ZrCH{27g3t9)_W@{86RAK9|6LHo
zfS(oo>`-i}M{KD(b^uwVxDG7M*T9#Am1sCc19R)JTKX;<L9yU^bG5RiQXv%7!Rb5#
z6dnFXgky^yp?Rt3lV<31OKQs}&G{7RkH6gmJJR4~ik+_*uRXN}!v0-~d`jjSa|~h%
zAuQ_>dr(iM&{ohB_>IE(Ben18!xq7J=I{=|_xr;;h0?v7qNY&mLg1&d1f<w`R-r(C
zra~lVrS0k3SXn4OlYVNyLu{d~(*7+sG=~{&m at KrlK3_%1gj_%DlBOmrK4gL{whlFS
zq8~)M+UR30hYXJ#dLRcM!G9k7zL1-rklP|Iw_=BQD}(=zl~pR_aA8Ef`rP%pba=<J
z+qm?!|7TqK^nUyou*5C#Lh7$@>J*xCmB4XW|Lj(r0_+RSe}@<U)e*T}cjxw<JGa=x
zZCq-(SLy-p)PBg7+K=!^y&b1+{`#_58<uEkNx(AlRb(uLw&u}nAgsQ^81f@=8?uEd
zYPUqnEz#%jKEdaEc>l9+H}7C&?deU6IoWSGxRP0getKN)x^Dw5P6?&h%5lDo`?r6K
zz^B4|R;d@~M&P@%Uu-?j1V<5CZ9;4RmQ?DKX8d<<22Kn}`mI=V9Xq(M(ZFcVr?|gS
zu)^VEbPnzWn}cbPYXc-OyCpmeb0Ex;n9F#r<)~waHY~6|j$UxuA|JGv;y3l}%CZ(&
z)8Z5h>{@x?x6N55g|lZL(V(#s9g#;C*zW7E?}+H%Y+KyFr6a1}Vk_$3+Clekvk{K%
zc%BtnE$WJoHcP_%je>a>uMm*qk#LXrDy>$sK$`_?$nwPP-BX8j)~~T^?ywRq=1P=i
zJvh8XEyr<*Y~@E5KxyisG at Cmj`?o;pEKr)QP#P{z54r7-BXgDN`1!EhuHqR3+Hk8d
z_rV-7d=8PTunm{^vy;BVR|I)dca-rOds-Wi_!z`*+<#J=nz#X0s|TUJJE3MfEWfm}
zO`Dyu+7-jnE$fc<%Apa at QYj0Xwcie;RK9%d+pkQvP0r7CY)^mvmd%$WyQKL0edx`0
zvGLlYjd8NSm7JcDUq?)bd>(C0(@sfzG_~xLX0R%>$-#(<qZtvlF!0+POc1$rZ(}M@
zQdRHuvG|Vu_ at Pw5m5Nj78__GUi*H07?eC>pKWU}|5Xu&zYS4v8O;??c-dT|QgZU`h
zuhj=?`zUNzP%=qU?8jaAgP$<11)xo5FZ%ZRvr^Vh(+D*XCuF~1S-VLM^t&$oofadM
zkIE;mbf5?N{PR(9ay~K#=Tp)1T6bvU5+B9#x{~tII-h)07nD!c%<712Fn7^-jN`I*
zq%S_s!v4AGKfC;}uOr<RV=07M`LG+hLU7G`efoluqY#DfHYGkv(Jb-%zjaX^;-Op`
z%!^MV{5LLl;g+=fpg@*PRlyoSmtHkqb1eN_*XM)v3(LnXz%GQ92VrRr-2RfUl+Z_(
zuN3 at gH+#H30>2 at tx1sxc&-BGIwJpTTEA_RPV%Vvv6wz-gCTedS)6-~$0{ZmGf|La?
z2WaH<tNQ29T&aJJXniw9r$8xbjdX*bg5ETkRp|U0Mu!B_I$-zW#QNR!;lOeBC5yDN
zSNrVH`X{%stJ!Vc(;?>-I46ruuR-_USbi>4p at E$KnsQGgN?{cAVap5gSL at r;o|U9D
z9zrQiQFOyWg$?;M_;r10xx<y$U<Egm93NmfEs%AqQ>k|-Z9u|j7SOqb&#Y40<`W^N
z8YIuJsu*WWvk=xad^e7ZvqL-Wv?Z`_TXC!J?CLX6EHY_C%8qm#W3gK!I?|8e`}B<<
z at q)gQr6An}kXg^kq_S$+aUHZE^Ik3v%iLj$7i8{m%T#ePckmJi>|hsSU2<vCX|Piw
zhi13EcRA{>5FVP=2eZ*I-SbCK>-qsbrq-jO`N^O5wk7;WSQn%4lyyg%NJOW$C_ZHS
z9NS1UD|tW2A#HG&nprxlYSVXK{0_+dRQ6^RK!O!<1a_BfK--<R*=;EuQrkm2iMDx|
z-Z7OnArY-X_|;$nluK-T?MOK0b=2EtJ2q>7byK$A*RjQ;^p@@!9lx-}pFQc7A6TCq
zQ*H6K*Dh~`_}4!8&3<Yt<Jj(yeaiIx%9hYC*+p1q3<lV08N at OjHrpLX!fmmR`uXqO
zly#IGobDm%^uY(ZwNIpVeF`IHSRMf}pfC2+=dNl}>%bm|xi2|szbH9<zsQ3px#4(s
zbbeX%W&Gv_H{$S{>RQRedWG}mfeCwwUb-(p%lLl5Bm|Jd=iPuzu=@Q6eh;gd|G*jU
z_jEUH!S6Cm0lbdCh#FT2Ye&!4Sncw_{x>J+a-(W+8(BnbX~$N#oU()E-7^}F!;bLG
z)9t<XhVz$17JF~crHfD|EWvK+f%M<LIf2P(VX@|UrEiAx)4BA=M@`=e>0z}xE$Tub
z=WCEsIEs{GZYf8HN%_>PRinD`XxG<AT-kEf^0%%1n;rE==Z%7Pnep2CZN_VlSwKs`
zMtF>c73cx3MPcX2+qZws+=_VHVwWSe?5{bg)L)It-FP+FJ=jlh?hSl5vyrgc*^A$s
zR4=fi8^MR;+YPMjvIt^t_DgR}wob!o6gCze_IdVka7Eco$QS=jY2f%X>jS^%t at e7u
z_hG87NOZ&TYCr4SZn!MQ7Ea at x{nE=MBOwuMS8YL}t<0;(LAumZ1QrtH-#8uOB`xuM
zY`fvr<CY>;D#T5?Cgtx92Mk~eSdz$kF(uN9-+~K9C=eaiW;YQO&l3o1#O`Mu^?ZGI
zldR8W;@STLw8u_|Xk*EgjtJWyZB08Pdm~^?yP^#vbsdClhwZMNBK$@)`V4HQFWBi^
zn^bXiTJN at k|Fzb=!DZd={-r}|wZm>?+YQBG4QJiI###4VeSEQXkMDacNLvSyf)Gj}
z5G|DGV_c%v*_>_7wS{kwLX3O_|9SBHHoPO`#o6||*Eyt?o@?8zc0u|D+?rgQMhRu?
zJ6tRHE*(y5c#BIdSoXW`?U!EL_Jejk<Q8~|<4^VE->vYne+|4<yX*aaX-m9ihDw2m
zRMlTIcM{7T=szyuZ<lm9w!z8^+7Dy+dyCYy@&$&aCjS-B0^BP7*UWw?Ub~Ffs(<SM
zZFo3o;M9$j*3`p~!5SaM_H>CX=Y<kTaKG-d2qQ%Teyi1PdJ+*gREIS%9(~w_K-&iL
zkahZv`yAU2TU&kbUw-0F2N<$YoHcwd3Z(I=fKJT#dGEsmGrJ>oV*N<E8PhXI(pgN;
z8cA=(bkj(BC(w)Y{JeMifgkcaUc6e8g at o9vypB=Jt6Zi=QKOU>)Agg27t_t7lo!)2
zxLk$9%Z2HOxN^}33L#S=sW4TMnRspJ*v6K6aGh#6)g7Hx?7RwmB2%GAX{r)M-HH#t
z9prH?faAXEjx>}h96%M)xnl-QH6+y?Z7L?~_*iyz$M&Jvh6~-%hGc~!t7g+>A@!D_
zScofQ5l>%ylGGd{S=y9HGDGov+%XA9*L%}DS~<FA1iy@<XN{m!9_3CXP2JH@*R*>4
zcAgcVo#1omBh#_1^9BQUsl`#xt{!S3LVlI#o@!VXrL+{9icwn2%I3Q|h-d#hnLOaj
zm8RZ<H>Nw9U7cS?e~YDY=Q34 at 1)2F?GPPF;Lv at t0d#b61t+&`)<~EBsS*&N at 5X<<r
zoxTj#Bt3i-5EXpijMAeXedFpG&sfjC;d{n2mhYRPp27VxJf80v+%F^P9j&-uM&Xy?
zei?;M4J)^+Z*;63_N=Y!dA##V1)p|pqJ`Tz?8uKH<c1iqU*kmz*h7nL_q9#1<+n{V
zI{&_rdwLjktHA<j#m{a7?Io~YH=c&M?2&!ks_q=z4b-~)LK)uEm%s>E!kt!X5QFtw
zo0 at P@u>Eiwv-ngr;o at G>TQ`YTd at mJZ0!GAi3NfK}xmOI#Cr0PZdM<X#h;$Ai-Bj-w
zky40>^Oh)z<s`Ppp?7|PpTpp7B6n<-R-5#n+N`8b?ee6f-P6q?y~t5-79A2fwwOg`
z(UEYo2!Fd?XsuxF#zd<F?+~^-#PGYVBOHFWIz;fh1 at eEPOU}jCbFnNJy9wyechh?{
z#%nKZ1pjkjL&hc?=ohiF?g+3Z|Bh|So4(wy4_KCj@%ogUxM|-%X;Cu at t9&qEuXsdl
zVFy3_blEV?UPTfF^#0uE4CCz&k*FT~Z3daWn$!S2b?!k at O%U3+xzCe|dO|y8?h7P>
zaKPL{T#gfla@>12mnVMSYJx3fZzg_&ZE#`R60mu%Pm#o}=J*O*<WK)*a1QW|^D0{#
z=-ha_%I5zx{^GgQx&5Ulpsbg<`r#As6T0{T-=}<1D%*}dwQpe`LcQBANwU%zpI%X)
z^d at tYxT$=~=c#>z?=kV$MND;`5Ay<`DTZRU#87&Z%$b$To?<Q|5-h4?%oPf|O-ykc
zvHS{Rz~8`_fWH}k12C3i7K7iSBpG!qb+Px-G^Y7Fnf*Khb*&?xdx%-pHu0^=Ik||=
zUW(*Qno`c>0W2ziMy>K6e6>sNeA$%4(u`gycaCS$RTG&gmH$?BN(`DPI(c8#I!2n+
z%#c|Gs{1qsYSGO2LM>#^eaGlGP)`y~X at f7a?0!)%`}nNKV<3NH_LIo(MkABnC}m%K
z*S{Y25vCevk1mgu^}d+1kR^0Et;C!D&)j^bB4-uk%Rot*o8|bsCrooAX+k7g?jX^Q
zS)b0be#@9*eV(ph?fWIY_Qz*2%@&HuJ4-zo+vGPmi^)Apac!W0HdGuUp|vgD2U<kE
zBAj+d%q3qaFZG9yn*133ht!jI3{LC%GADQY;F|$?4n!=2{U0MbHi^*>P*19xh{0*k
ze%E!vf(%bPQP;VXf5v|;z3Uv)%#vBpF_Nq$n?5*s)`IjZgu32sLIb*|e43tOs$QX(
z!aN`6HKs6 at T6h|vr|xU|4`vTg>v8|sNTxoPf?hu85a~5CXSNQ#nU#RPWojH`b`JVJ
zD}lYjG&{&=qD?xnv*|b!JU}^jH=Spq>^@AQ^%|pOgLS5cD5l0vF=EEY`8F$i=4P*~
zPjcYDt(ST)_1$D5t=DuWE61 at n-XngG5Fc-+TK=pfY~{|)5cgfL>@5ikeRoL=Tyl_d
zni11d%xfo~1?t7~eSgoYwaeHT_M(NcpsqU at C6p!7at%Lyu5(a)S#qH)-?A_6{I>T+
zkGz5{P!@7zS&TxwnxR_u=m>iBvg{eHEEftd$?AJsntJbP`HQvkIkofJG6E3{5jK&H
z%wC8d$;p9MU5f5<jha5vI;(e<bvHxD`s{7qFM__OKcoi7HyfK`nH&=}Sji~b$bl2g
zl at _vZ5_4sP&pxO1+kHp=Ac6YYO}b4zIx#ED7C951p>t?NGm(@(Qw(}j!^)lKz;2!T
zC)s->bJa%n$=Den2l_bcz=8pOWDJ~eUd!6J>H9x at 2jghG6A5{7JewTQnxAtiFEdv+
z`0SXzW7ZA|bVXVpvlW?gKto8J^WgW-lyNynLCzM)xtRr6@!$LW#$wM&K*aKXmcHc6
z+F8Ovo8p~4b`n$iCZ1H}s6n5qta8Rg$?-RS7)68s-~#8XZ;A2S7Opn3&SIDWY=c)q
zi4HU&Mg!xO$@3Zf+yG1A;OBT`=R}ZGvZo>c8;!ks*gY3A at mBu}bf0MO&#bunfSr4S
z#IVqbdh7d0Y=3qiFvy%v*a0}Z52RGKXe~5b#4;x+y at s5kTa0A;yBRg;H}i at QQ<O(J
z=RUQ#=@q8vEahC!l58}jAiEE+g%|agrsOSV#c%rL<gn!ar}mYpf><Ie!8y1$lVNPs
z;A)1!cQ+eJW-;aSCiT<<`ySl8J0-{xg?Ua$_vO3zyP;kKX@>RC2c}k0V+UKv*4Ia{
z$KRX4GCI?M&)}=s5vbabG#mdNo9ns=y;IwMeir6pk6$wKX`oMj-{qsHWzIiKZ)$D^
z8?UF)U3u1*R$kuj>{H^|6l%^r<>B1Mh(j$$HaY6Mj4LlY-|36jqm!l{pT6<z1=uyn
z4C6oD$ez3zY(kP&lft4kUe8<uwu{U#_tT9gHPGTM+OBAWeAaG*V&c8{Z-$$Y_&$?j
zS2)f!bEzQ~Vl)%)HK~Cbzbm{ea42V(yXP>Gp%zxmMi>&$aP>)h{YZF!eU}*jc7*p6
z1IL>-=@bJ#488jT8_|6L{e$z at sbw&GtrKRi?J#>if at d#$N5&)?5bdLNk%!84;;3?F
z4~afiGY5|$U8Jpi-`U<CZbrUmN93oGJMPhm>GFNw^`6HxCPa&zZ!aTRf+1TcUZ6qS
zds<L$V2jZ@>p3+El0nNK613d#4{7;?v9#QNU^E@?dh$;pShKMvGePf3nJ8Fu)HHd*
z_b(D&lNl+m-Cggyw4Nbtr2XQpwAxuYmR37g{fo7FJ!rLU{`}PFnwaUav_9kBG*dcV
zTV1|-bxC!J*%zU-Wky=Ju7+MyxwgEvvYIxR)Rq+2(rUWqk(%0)H7T^FF1n5`uPPRN
zr6sk+Wpt6*T+I_e1ga_m+N|}Z1?$($f at B3;xL{53y0~IgR99XAvI~Sf>G|{VIV(a!
zfhyOQ_##YjmoYap4JQ~XBpq$0Ys=S^)Zna;Pz7VoV!Etot+}G48lg<1VJJN>5 at 9im
z?#Uj;2zBLXwIwyRL#Yv}DJv=v>R(V^{ZN4`%3ShrQC0CU5?YkLq`<`0uN)E}l#!j6
zb6-JmWlcd%No_%O3I264- at i01Cwm3G)KHL?o at cx_Eia=WJuQn~n2|^4W-Lmh4Qa+K
zTq#e!#Y>Di83j1{mb`os)|Z!-7nIi&6c<$#n4#Vvg2t&lQn=g2BSm%Pnu4OL@&a>t
z4cArBEj6`8)wMJ<M4T`B(P?O$HzZtYG#Cp^>BfwLtOTe+w!Xl$C<El-(NYjUM^~_}
zd~J#_Xx5vHYKt_kkPwdd3MY7l6Nkd<itjFYB)6nun7kw}{@GsPIbPwpLt#@T)FrzT
z>a(t at 3j5V+pjA|quU$>oRFsrd(N)!zoNAO7l~+I{PIIf~@zM+EqFH6oO}MK{D=OD>
zDL4jD61a?OA1<mWH`7KvjCUxJZ!|yN`8*({sqB&Tq6z~fHR6G{)R4PGx5$`x6*-qL
zHRzWtGNtEW{-p*}T25M47P8wB422ZBic6PQXD~x+m8O at K6hBDk-5+gUu@wI-#6LJA
zju*J}F?nS$ipwf1%+u+#nZ=cBs%9E<axhzLUZ&tA at Tok~zyKJ*t{WEg74p!h&&)M0
zr0>Tqzhb_74&mZ*^Tvvc$*L?ePfwwjR#&cFonBN^LN9dJforF++ImgV+I8M-oqk_I
zR^@6sV{I*rV!nZ)m7pROMYU^7YHA7=<;|TtClPWpVEMF;%Z5%bbJc at SpH;s0L3-6X
z^XigXx~LS((wov}&N1s!u!pY%onu(&^7?w at otK+ygr=aOh;b?Ox+EOddosH6sI08w
zGGAR#RGx&J*|feIGA=2q9%2 at FHFe2}8jW6)m^4z3J1+Saap_~nC24LE=b4`(n-Iz0
zL|f!<5&#iEyu~}L3PdOjKm(!xF at Qopgv@|401L1HtN<GbRUJoL@<7HzBG@~V2%Yj7
za;?Ebu3{QOEhz|T)`7e)5PEb0LRU8;)OQo|%0`H31=-2Om^{nzpRBRMSPCLgBh=-G
zpj4?QOq>)pc}h5~j)+7^jub#`^=<JzhWg}CZY~y~X)y?eL(C+=1l&e|0DwOLijF7&
z{7}RzNJ(8S4A_dbMFmA`Yimj>Xk+%hX<0BgWMpNh(TncUXYjKG%!Bc1YirYMt1Gxs
zvM at eLaOVhayx`6j#_mua=2hn6f>l+e1*@ydD+`K2giB^F#MV at qYYP$~cdux7T*AmW
zUI#(xVKMbE1bBjA55&aO7S%jhQ2R(#37rZmKAoOAmG+=%=|ySF3exY%EyzpDy}KZL
z$)f4gxiaOYrQZ!p3ifBz)g~t7uGiNV*T&H$)z!XUG#q9aR5h=pt_miA^0lxom#nR=
zeuR#RhFMLGFDz$XMb-T1x>&k~cgkxyr{rNigo(hDy~v1Hy4rO$^Em?u&$0TvnA%D@
z`_AdUE`MfaP3?4?uTh`1$Yo67aGFUsD=kw8^F$42#Z<1V<>&P at eL;pXI}Znnii=^^
zp>xs};o9)&IFDLQuPu2PCKhPI5*ikj5-#n$`S?m-S5sTLru<Q`ko3BR^pdokJQ}N|
zu4HxjT8_i_2YEBrngz~L`S7xGyE5IpLo&4)%hEGUdB%IPQ*pB)Ewm-}#lpmzdtWZN
z<>vW7F9&N0$3wWLdOqh?Kg78eIEcel#atK+GS018k5l3<gE2FoPm4Rdmh;am!Q_<a
z8h6*Of#&498mqxfZh0E!FCW$KJ2XZ{8613HxW-rt{lL04Rdgw=HBgk|lB(MB%C*q0
z|8xn)$OD_4MKv`g)%<w!op*nA3Fg5DOI}emUX*g6*DBYpK*g0{M&pF5)|HmRXezIv
zOV?FY#NhEfUC;&Jd3lw!MHRH07Y|l$#K+Qn%%Y4%v(j^DF0ux?or{EY?i3|!VGfu#
zuW0pZdhNP3^n92TV(H>_)zzSTIE0%I#s)MTZr58~IDV)RX|6YE-XNMc at BZ|Ava at 0M
ztQaaQZ;8fX#plQ7kGl9aUc4k at Ne0ZbhI`y$8m?SpKDefgw7Y3KeMwFZSBB_f{@-F6
zZ%*i;U#LI!&>LpXq;qr9X<DC~N7IX7;->X!d1*AAXXGqm<iR&w0{n2(jB76bN9x0s
zk*<c`hb>$+Z%5|D<w6U(O)4}mjW(B;(8XotRoLb%TD7*adJXil%j%jJQv+748Fo3P
zl?5<s@*!Rcct6+Z^SL_5;4PAi6Z^;FD=CLX!^Ox2Jf_x>3GkeemYbWAlgCXUv2-<_
z29P>OS72BIHZDgis;L(AKDq|#g(u(wQ_ekk1$gV1o&%#i`A)E3^og+64B3>!`3f|y
z{pKif at wbRexJ6vzE#i`H5jT5S99|XD($h0?bLotnoO^P(9c?bxYC`RjH5#a2`gC{Y
z<{5Qq*>`Jblb+7aGPzRgGx9Rh^Z5L5eEit)`X5NI|AF+Now(Rz#^VJsk6#RFbIGc8
ztDz<|KOK2=5t;{!W<lOPV5zJwSOS_ikJAi~J~XA%6|mwISFVNCwgSdnOddCqU?mpf
z at Pa?z&7YMsHa{OXoZlmVJ<KzF-TCqk^}^6O2(-(>0vw~EXVPF8(AY?b*U-b_;)mj}
z(J(A70pf-X2yOtl;}Rim3}eF0lLR~-hJ~9x8|b4L8S`#=_yh89<Me0VQUlGId314c
zdFhb-qRShV{L}T*_0#p!_0#p!_0#p!_0#p!_0#p!_0x5m7s36q++BoUx~Yv`VTKFu
z9!e&{Nj<_vI2<?>uEGgC!mL-=<P~nj@;$;f9Pc5&eR!De!ThiCg-041Rf&YUV81{{
zazGD3?7%le{J at _n7T01n75qqXp*-TkAe~bvfCBvZo(d`W at mY~X at Z*Ze1V1Cl at w_sL
zp|T(is>1hS!~)$_uIq%j)(MxZAzL6kS{$ZhK@^u>Tq|}p9{645z<zMTah;m6Kal6g
z<)=kM^@|Ec8(euPJ^V=?e!YjkSwXnV+X8+pQ10^6{Jo|lA&rPEM4_U3A~Yym5sHF?
zLZQ6zlt6=0BsiUPsPlVusEE*vhlYrUf#HsO1IIas;_7Y@*LaIKn+Sz6hzKo|DZmX1
z{X3$8PaXPOxJV7cwc^qZc%_5>;bb}qC_CcIPHNowgd!178`jN2{NPw=1e#|(8KFFo
z?*#99ddD^1B5tgDz6;kVLy^0B2tJKX%BP9-Xd9entaz8qj|p-|51^41vCV)MfDLd6
z&<1z~&<^MTbOJ5_P`!vH0Te(EPymzw6(9^i1EK&ifLMSAkOW8uXaNjB56A>$0Zf2A
zz%syc01L1HtbhhUBfti*1H9`GeY2q*$u}d1d@~840B8XG00lq^PyxaKG$0BP1BeA^
z07-ykfEK_2^ngr27Qlq%+`K(dw+Z=eLh(;R`A>odL;+#|u>cJq36KoX0vLcEkO{~F
zm;iZzWq{>?LVy`i2B-j30cvquL0?e-IY0qW0#tx7+=m3j1FRz8p~26B3+MoJVt+lP
z11JDWfC>->paD^U7(gsQ14sfS1GE4J&<JP-v;bNGHo&sY^37)f9|ArCptF!CKmkw!
zSbzm!1vCH}0nLCGKr6roI0Wbb*a4>i9|1nb{C@;~Kr^5P&<d~t4gop<cEBmX0D!SU
zTLLlxSpXA&u>%c|3CIGN0C|9AfaQQffEiE*r~p&}Y5{eC4FEgf6yP-AEZ{@HM}Ut3
zJ%9^<KEPK12jD8;I$!`m7K%1d069PbPyxaKG$0BP1BeA^07-ykfEK_2^ngr27Qh6^
z11tj+0?dFiKn0)*Pz$I7Yyhx;j{yje1L*79HgI5(mLEqOumz&PF8({AoGZf5fo#C5
zd>H3ah~``cisD=v#c(d;VZ!hxQxZo<qGWJys2kCZ at J7@F!0YVC;L6<p5UP9R(VuO2
zY~!Y?hpKC8*FC&m6Q7WnG<(k6<U3R5Y3HXdaJf=KN=T4|vojE%1|dET;(1`{;nE^^
z_&cx at ZUS8HRlxTi?ze#JfNuo%65#KEKEdq;TmhUH+`j-Efd3ZUKM85i0=@>E0elH~
z3-AS?bb2F_1Fp_&MAlgF159@`qU8`i0a(d2qKn!_)SK6c4gs<N0RV~cFKAq_G9;9L
z<c0tB@%5AY<8SaG2T~*z@@{e_c>0h^<8pW2*@*OzuQjm|&CoZZGF>AI16*9th+YP)
z1?<XhM4Rd!D#}ToJv|r<r*R-_A|L`V1CW5<%=H*1*tQA7_y4d>gzpo24I}(8Ts~kG
z-~j-B9`8}F_*EYCO<w84LKVJJG<kfGpA?0Sqwq)nQ~|y&Iuc at F)P;qPlS4EerWzLj
zt{%#c4L at w;F#!l&#jX$7Y5<jFY<iIJED#=pv*KpP-Z5i(Oy$}&6%Rg8UgoVLn>IeS
z;b)INQn&u$b+t9s4^_GN=FXayI$t|4Wvp~#rC(iIVlG})ROnuV5g`&wq%vxZ^kRr7
zaXfUtn-}|qOD5Rjq+sNbUg4fG;JW($jkulb-<>}JS0MK+7;mwMfEy at 08y3igF_TCv
z_G&v%;Qa#LL*Ttm3}@!TJmXal>K1(eY<j#Q#CnehO_{KPtn)~#1Kf2BJ^W|WJH-E5
z5NLFGUowI2>Eg}b6#-5GA}=7JZ#{uL`co``@S+hOabgcyXbf7N(3Z&_edVIL!Wgpz
zqzb4M`a8)3`1%>31~3nhD7Y?~D?IN<$O{$5Qj`Z~jMC0i$H0jF!Wj5R`6w at p#pm6>
zV~rPyM_-D@;Q29pc-&0EX99vgj^)w<kg$fv{Rr1}&LsU2?mwD_`T=<N7d1-TkJT40
zh=lf)jG}M1>c4*^4cI at lhT(opqxIj}9-hP7?dj<m7C+Y7^ikh+N)?mL2#(twYh3;i
z{^!pwN2iO%(6b+VofT{ehY(f>dZ0l=JA;4c^^vg7Ul+!zO3=q-A^%&&-A?=uU9*L`
zHc_yd<Au7z?gTvs*dWZ`cny8z-%$VcfQJF=5O3?&2y6C3!Wx9vg|&b+fC|8a!n$5A
z*Z~WK^<%zZ)6Wy^{yT+sm at BL^)5geuDd1kf5<uQ4^8ek}rdzai-EFkbYCtIfKM-vO
z6brUbkzgzR&;_#rTzC*sy!ZOZx$suHe=FXx%Kc;df3BdUj|goNjQG8e!o%Jf&E`_x
zf;Vs!-FNBzSpi6(+dcTa=LdY#!p=>=ZV#<#$5XO`K6 at 59fW%R%g*th|^Qyj0c(#+P
zjUE=-(KUvC2xY?9aM^fR|JeY(9G$q1(1Er72zB6g6bW^f^LuEe(CHKaA0U?n at N?M5
zc>ck>@{uxe`WD}z^gR;%)(b+-5Whjh%XZ0h<v&6;b|IY!kPQ4JE+Ynn>i|`NulztZ
z-~ylzyI2;<+l-#|!TaY61YcHMX1Ro)JMetjD%_kpgvX4CK$Mgejb;zFd%^qqcgK6%
zeWQiF`8_XuR)Wt=e8<r3e|P-<#`gSY!vC+^(^r_66oNm(buZAvc8>TLtXDDto;I)d
z9(A;RtEVk2zD?S#_N_|cJTFW*+Z&7KvWr|8i{>hWOeiy!^@N9=DfMW3?8j%pI|ZJn
zJoXyC!kQx+<9t9i3T}t*U%k(C$#I>xx!Tq{e7k(E{&Ah<1q$huLR&o{_(dLR{RIA<
z0zc-l3hnuXNBPCK;mUp_uV=kH&m6sN9qNAxujjtUb<QUd(z)v6BaA=4e}JDiUvB>w
zpD9chbZwF_KjHI8*L$jRL9VZm&shAS!uh4kUK=Oq4}SkO910%}1rLY9hJ&DRIWK1l
z(5C=>3ecwjeTtml2P^>k0-!Gd`U0RYkn?#?2Kr>6PX_vApic(6jJpW#^7M~+dCgO|
z+Lzvn$Fm*&8J^MRg3<JTv@@d7Xp?ReKDU7D`k&+xjO<%_CV91~YwQJk$oZe-IndpR
zUiq>SbpYru8d2*vNF;*ZIQ2CW%>nlqxCHdj{b)H_!Sz=h2MO$CrC?plV3$t8ZrulV
z?HImbZDaVsZeEV&fd0(|Jxqo<^-c~7*b!p{!R~k*Sh~TmTUNrZIRvx at BNQy(@hA<}
zLLHPf9m=eSdSpQP4N#ATP at hcDM<du5cOf;p8|;WI6p0prU7d}h(LHD?GQs}Zgkk{G
z0W;9zVYmb33_~o+MKihGwg?e!Z6OdS876Q(xWG?JL}IB7&n4JakA=xg14sfS1GE4J
zpa*0EvH&JP9$*<@IiL_=29yCB0F8iVKntK1U;`Wiv|$;b7+C-lAP=w%upCebFayc}
z6 at V&0Euapt0l)$*03|>L2m{b~-vNjL!~!&cBocq8AIc420D6+&pR~w at 24Ht}LiZ93
zxM4sG!}kv<US61pA5VDh;^r_)nA1f3Si^H2H|J5p94O-FL}k`-q|7{sl)5yeWC#?p
z{5T3(b`XW+q at fTKf#y`4M03hsKyy~5qdA3Qv|!*QT5$aZwBT|&THp|)6>GxL%7+xF
zG|vx}J>-iDi$c*VKp9|l1B^|)7lV9B$d at GfeHor#{DJNdbbp}x1HoU!uM2n%=jL)s
znA=7CTu)}%5t(U2q>e!(Y{dLOwj=+KY{>ru2KmDVe9BkH(UiV}Xi9Gyn$km{@PXqf
z{Q5x at emM<=I|%fJjzoQr2BS|)0inSt(!#F`-1<NX>xGEd%_TFIZO%|_D at qEvx2QtO
zpZ!z`ZmpC*52};$XG0sL{Cy`D-21?_NcsCqR>8Gh#=07aYQdGkST=)8!Z0>n#yTxQ
z3>Pm$Vc?2Ed*xi1LiT>_Mx)MtUf0_>mxMj}TG-cDqcz~-v#(6hySqT=vOwRmLDx*6
zPdT7Jc~IJWp at hqzRQbY8u@V))zP<>pLdD38N>C|U4SW4^^Z<I0J3C`Q$916JdeChH
z=(PssjyW(_q`-U-5A(+ym^0?VypRC%NEFN)S{OmoL4)rAjhzYe&n#|TR)g+GgTB)+
z4 at 80P$H3e%3FeM4m^&uJ+%W}OLkV+=g8TLK2f=I;3NsM?4dy8Puopr7NoXr6v=aq0
znlH>`au_WE!&g^+874TNNF*Xe1os~<F+qqqpO_>FlJk)gf{<`NiIgCuoKGsl>9J2n
z5yUXbKtn$KtOJsL-ID#>lI3p6a<^oEx8wk~<Umfcn7bK^C6k~P3Xlo05(yDRh((-F
z1U at n66OSWsvB5_M6JiPHlPCzWl=Df!hd7 at M`#dEB4JmQ)ILS)4WTjhjh+A@~TXLvd
zveGRXd@}bwkrKJu8GJ%J`-oia>??A$v!BS-&T^5fo&80wb`B7^+Ig5{p`8WEzHZ5W
zZpm`DWVu_izgu#ETXG;LS!fNAhue9)NQ5OrYp4jZ59bqs&zJLwClF#k&PPrp#B$Cj
znM8>FIiD1K0h~`3#<j+fWZce^39%q~id%BHTQcpItaeL|a7&JKOOApT7m-rRR~`VJ
zDUtd3`3D9?O^ulm8>dM~ik>$8j+wLK6K9W8hN>opO`#)#L&i^-G&x)yIVU+qo66|)
zhPijno4+6}J!2t0Ka)eVDga7=3J?aM0a18;1LbKI6bPU9<-uH70aym818e|P0Wtwu
zfI@&7;Cw@@0!#r+280170VV<_eA_Bk0m1=O0Fwb>fJuOffC)_!{BImNPQv{I7oqWz
z at sby1FUlrKCP|`<FabyHiE2bD=B0ZP+Y|+ZtSNKc9vsd^tT{$MXV={gF(u%hNoj~F
z1$W_$xS7S^KEC|R%+=t&ss1u5B10OH5gM74F*PYelNb`5I6LFs#OS1q2)#67#nY<A
zE1s@?Y}ef{F(0f`E#9@<`S8LS)pzb%zGCIMH_koQz3$v&@27m3`FQ#{<GFR`jPIm;
z8MSNqeJjtcTe0$;l(?Dr(d;8@{({#0<p_#0Hle>9S%aFQjL6s&#kJ+<ZO?07XlqhR
zCRYbY)tePkb(2E+(h23EHbB(#;|@ig7<bb4yh1i%vs^Zz3GlpJcJQ)7cCc6Rx$XHN
zbLXdF=Dt($=E6hq=3_6!o7*59^(O$hZNE{P%ifx8?)iDVS-UmdocvjsS^Kvs=A at rb
zGPhq<ncFX@%rU2wC2cP#O9A?*C&!h<o(k1ZcqvRAv|V|EDp81oUJA>YP@>3~uwA)=
zz(+##ESSoxY at Z@ZVXvOgMkOZh-)Dl+bN#X0BH0?~dH$G|X%{00zLWGGvMnU1paJ1o
z^cFE%ZHNjYQC;1;*40b!e7&%~5Z_u+=0Nw23wm}@EEv77kQUKAKN_j<h0mhQ6lz|y
zk)kaW(kStsvwZ at am7$@{Rz%Q7*zPA0>(|qXPLT1&nxUufI)pt*yPV&jT#)m775sf9
zY*#qs{66-ooS#(`{``Jc<<IYh!u<LDL9#!;_bl`0_n{U3{GJq_17kbnv_HRBz2MKE
zJ$&WQpPkv{{Qk2;&hJG#<-F~FOwR97ZNh$4E9dvF#{lCIZ~NeS<0ro+2nQtC_9vzM
zo`90__8UH*#`f9;!Nup)*e1be*WtoBJ3hy202hB~#qQ6a+too~BZV_|JQ7<WJ{s}o
z<oG!UE6LyEijng70P(#e{2?Sp&Oa}KpD`JL{l;DWjp)GTMp*yFV4wD&sel+jEErvJ
zfHa>skRE{lSOJm at iW?<PO2NH$;n<{s=4Zf)FhLKs<NX!19GGToquB1WiJhD7z~u_s
zgE|#^(8D2n(C@&%GI9_4HH4P|z6jiddv`||w=pGl;PyuK5XSvTi0U(OhX;%5xes+H
zMfGOxz>(a6`;`Wl8xa2F4t#F`>}gzOY)4yhe3lS42`-G14fsIc^{&NIebyrG&Vn7G
zMVud`u at ZzoJi(p(3j@%_|F60juft;JkGwwl`lII`_?7l|dfR_ChP-#_57Nil9=_uj
zd$)diw0391sZ9Ge!#i0CKId)wA51Fvh3czsavqJ^{mTv62iL85{NjIwO`DmY-?)F)
z>PLQkrudNqY)`rEV$Qz*s9Pe+`OFfb`cARq<H~cdoIUp7_iLBvf3 at c0JrTa=H|`;?
z%sgX{FG$|7ab?`Y%lGfB$va{x|0Ms7_cx7ud;HATW-2!-_OE;~<Ehzb$=_=WI_ocg
zyX>AT%H*x5$-6#TKELA;<C~@bB|p1+#@pXbPn(<7zwva@$u)6b7yR1i>-Ph{YC0!A
zHSvixZGrtO4X=)0-Sg|}CzL%;r{1MLllb`7yQaUt;ZM#}?|vjn%!<-fZF;}7IR4J~
zgoHWqvjbtw(Thw=@C-%x;okCmr^)kureW_gdA`Tw`OcE(`%0egDtW%A<oS-0$NNb`
z?<R?TJjy|Ml!N$3%3<?J+wS4#mT%8 at ul~Qfjy97z+n1?TJ|Ra}d{y|%JAPmD>y%aY
zaqZ=YLW&pVKK{{t?@xXA!7opzFWuVkMckLlV;NKI>!x+R_FvC^d}Lz&FDCZ%pxWpQ
zM;^Vp|A}dn8&uD%*>57pzr1|kH!rHMykjfxP*=TQ_e|lg-(+r=eI9dv_sMaSzn*n(
z#kc!DU(j~f+-F~1^~A!m&pw*}%-V!csD;7JeOHn``rF>PpBoaTM8Q|PK7Qi9IlE3T
z`(~4A#@wCFlPt=)LH4Dp4|?~$UNf;kG-#dp_N8~9$S(HZ_~rB8SDyYTDE+>dC-)bB
z{A!Qd_r*Ux_=@D at v5t2t|GK3ne(R&(SU&qa?s3J<^xus?AGLAi=9|Q1^LzSN1|I&u
D^ET<K

literal 0
Hc-jL100001

diff --git a/mediatek/WIFI_RAM_CODE_MT7961_1a.bin b/mediatek/WIFI_RAM_CODE_MT7961_1a.bin
new file mode 100644
index 0000000000000000000000000000000000000000..43988eea45729e17c2403ca53136a246a45c5c02
GIT binary patch
literal 681228
zc-o}Adwf$>wm81eBgsjcwrLxnJcN_Bl!8cGKqw`I(=>zzYYk8pJ2)0W9?B?Ke9eID
zw5L!oRxDT$84OxO8L`&6omw3nPs=Ncqv#lA9FMnDFSf}zrUkK<*nHPMNlU$R at 8@?v
zpWh!jXP>>-UVH7e)?SZ&_K6*7N3B3{$ug=#_^?HrU1J$Lv)MB3RLjAS4>0)#c0zs<
zYd-vC$(+cwH3(@Hh^aH1iz%cQ`9BmCQ`;jJ-KjP^&pTI`Q1Qt6s#Ee|eAte(8&@Fu
ziZub5NDV?F_TMBN5w!aY>I{O=IJf>|!60#ii><Uiql at p>zGynIq${mQ1!abm4;BfA
z#xVjCxWVkf54xCc?E(6*ql*Rzrkf$<gN$H>)^+mX?=R#(^asz+IX at RviRW(X>h2zE
zWsxSdQ_>3}(l2u&URZ977b>tm^1ZMc>3?Q$ks}g$ySD~QqUVQQ{)~<rqdk18-QD65
zs4*@JK`-cyi-baRys#YWNl$^^!wM-U;-U8oy}NK{4AXPHHO_K`ZtFnHFKcX at 5E54F
z<NZs7E&S&qFOvEttzW+D^4q(5dit#_CbZd>2{1ybAzsM9`oY&-X=F5E7Ce)27#J^Q
zPyFB{z`hpf?6e}!hOUb}s^SzWzDw%XUFLRAJ^c5}H9`(gbuqiMF(Z~=-UTBiAIv%U
zM3=NX`?6+P0p^8Gd-OuNK0flUu*n at ys0eZFB&-FF;eTeyhsE-*r}Qvgz8)RSyGAJF
zsogzYr*?mjPx<M~HGuJC<Xiu at b;z0<);$Nk8c#g;{Niqex^@69g at U$=?pFUS{7n69
zd`|n^^MijCa{FoF;Zm*eGW_bYIH4+wvpF at 9;^p|1(1+NPK6FC3%#nMYu)2|2c^L^%
zb_-5`-?xty&~#2%3T4sA3a07YrLLYS!oGgC<R!!k;^XX#n}vHD$DO%h*>c2}+zFg2
zFzSU;_=&0Uf+;nA at O8gF@(1TKn7PfUkBkutQ^yGzsqxk56a%_SpS-L15kXzNPhdf7
zAOAWFX0cDu!7MZ{{v_D8a(k(|g2AI0AEdkRQ`t{t!T64ny(n&Ak5ITrjgNj1?*fTB
zD<YlNQmpAZx@<9~tji8jr{iDv`Gt+k?uBs$pk&`Zy?}tKeS26ZV$sSFi*{vyon7<2
z;GC}AzY$9ZRbA3k*}^`N6H3o>d#BgM4Q30=&vOb748TJ}0}I?1<--T)E}Hb+mDQsI
zdby7-)Wr$5Pr1D}4o>k0mo48pcsijpgs2rxL<{tZ at q#VP?KRa=gHwM0lfOem_Wcp$
z|NP_^A`*H3=fXbB7QZN{if`Zk$;tB~vZW&A|DX<qt<P!eo)b15=Y;Z7ZRAIxd^)$-
zhtP9()%{6$7HVBYJ|0$ZP3J($M?$nMM-wTrqSM7Q(f2|{h%H%$t`*P3mxX;H_Jzq#
zD-)?}7gEAp<e9pQLWZOjX4U*C7;%c#>CO-;Bu-!iZR9N0yzq0ErdxIR?=?MLJ>5SG
z=`}xEoiz$XeeQ_%XJhTT5_jMWE9Kb`sf4zlx- at 507-R=Jtm)PR7N5ZIY62^<zlYjO
z7rU<(Z;>=O3ttjpiTQ67j6h4e_ at lrAEg>#S%W|OQdwg{F_gzOvjFln+E$qM3;)u1I
z1n$7IR*L_hX?ga4qUD?N9*wK(KwZ~u2mVp>(2J(Xk1Hrd3DksfIK5;sdScl!;Od=d
z$&l7`vo+aW*)`7y{B&*ozJoN#p8u2^9J9|+H(glf<OUxCJIRJSgv$rm?(xFqt=i`!
zHQztq`jHCeD><#(JFN`Xl+clxFYwEFusG>l)WQ&J_<2zzlKD5yUs>UbhwawjX at Cc0
zTzq(8II0=pj>wP2Pj0{Vx1T_d#zatTECptJ2)OyJ(z8#vvQ at il>aOfv9IO?!E2|ng
zm%$2Q$;gA(URbY;oB<;f8 at CT^+rApMC^GmjQCc<=Q7d~f-=o74rbOPE8|jo-Qqw)|
zq+ywfSg;zs;N)OE>Ei{1JAQCs<n=Sm3WTU39 at S(ELRbrPc?c*vT!(}l&{v^UJNT`=
z2%*7miDoZLV<&zi^ymlnblG}nv0TWliT{T0rU$>kjC@#PRv0j4UmQVQu5Q-OAq19j
zk_@==A39(bd3*$~!a|4P8=+fchoJ}S+L^&6wFR~ucA~WaX%2oVm<)PBIIa~|m2#1}
z&pliBLF6%E)p;)R7-sQgz{1LhJ5rYAg4LRXG=pD=SU~Q0zg7 at x;)NWyUf_W{R1J$W
z0516#a0b2J&j~qX_P_~&(+}Q*S>jWLrJVM3;&b;uzrOyN{2V=-FYIB9XA10v0Y6*I
z)@HbE&s)!Hxg11s0;Y;*F1&Vd0?Z4MdExR)ww?*41(+#yV&-(*vSpY(_}udw2xMvj
zKqp7S3Vt2n-vIalcYeX13{v00J-=imT$E3ZCqxN%b}S`c>iK~KOT=<NEv_mpjE*3>
zf$!5#>rXOdBo~briR~bq3{e8Tpo9Xw_PO-ZrATwY{eu3*3?WTF?p%Cr#*5+nJ&pSO
zy^Yh0leUL{A3jtJeK at FNp)P~eogNFAJRPG-W+I(JQz53 at N4~fQaQa%)i$8HfB$8Sf
ziI6(C$$jxdU(~89^PgC{6y~mt&3%1p65&#0u)atTJP=t30$2tEcznVK4*2i@@F7Xe
zATS;3=gWrR$^646EcLoXm1qh~whz*et at u$?%h?XZPKT#Q;mIgx2amB<YKjddu%J=)
z%aoi^w*EIPP`VPl;Dg;0%F5Twfzo~5>aud`ma_8Mwth`n`T99!<qs?_D_=(-?;gky
zRe{MN%7K<fMAg7_e|Fh=th7K+SGT^b{Ned!<rP!P)^A=cYHS9C#RC7$W#vyzEGrM?
zm8}=e4tnjs{EI at APZik4BDz852{!F0|NOu|hHyLcL>2VCFEH7kgVnv1gQi#bZ*-vK
zul!je?Lca^Kf^&kY6DpM3A=xys0L`4DA;qjbT-$uK~DD at qg=pi<!pa~eG``^VtJ`W
zJ8P58z&>M{`h5dliyP!AQJxTPD10%=Fu#GD0+Ss`vj$2t0+UB at ZE}=r(3X!oB^A&S
z5hwXgBOo%P5W(@R!KKF<+2o4{EZKp{X8m7Y_c0DcYn7SZ8knri-YbJQ4<89rj>v$Q
z)KI+GF7rxhV(dOi=ArdBAj=~2gSY$>?yF$r|8SsHZ(()61NcF0cp-47$OhYmNf=!P
zKFH|`_Ag~#p+o~~&SajjEfq`hb!utP!=C@}T#++8Gd&fK$Y5s)i;P&U^w0vFG6&KV
zOVa4;c>JL#2G7HQgNb5 at _Q7gs^*N}bsX*hg=xk&jtHZ7^Qs{Yw%r@{3EI1&53*#^n
zP5oNn#(JgZ?@CRYT_Xra0|HZB6 at j*OO4~VT6YTp1fn{+4y9Nt`b4qBmZV0Q50h>5S
znq!2PfSol_&*4m<H7&4BzSFje>6UpbKVgH-usu?f)|Dn4b)&j$!Sja<=RTLGMJtUX
zZ~%h<h6fm-O8}crnY98^XYAHp()IjHOaR>|0R7o#89S>@wpy9uIPs!nu#W+n5Eev;
zkc&AZDIuUbq)@%dx_U+2nfM_XD_RkSU_{=5uKnYzdYBu(3QJ+Qt66Er4BE76M$!zw
zl+d1_;EHl*iAY(f8K1$=@1OAA1PArt*P>KyvTce)fbTY!5Pa7wxZ4Gz2r?VojwT}w
zx*5^pGy9u^UzM$AzxRJ3QZNc~Al1i`iHss8%m8dsoM;*tOXhZSk!+2Q62>!D&G_`g
z1PAqyT9JVo+kpnovTDX>3dE;G9#~RjOuJ0D3*^j;liJ6MsFhMAz#ZF#)y6%TK6Xw{
zgFI*AhjGK2N8wED!0Y4;&<zQ^JTmKV`Rb7MXzho_=nBU7HY^bf8Ynqkq#V at p+mx#l
zt6}}rSyp9lA(}$^pmM~0I11{i<qMRnWvD-l05mK85&bx!S?LA(2b?pOFsRT$EqfPt
z&Y<N+2UT|nOJ{F#P>VPCrk$BO at OKem-a$RF+Q-$lpMez-kVFb}`v=ITfRZQf+<yvs
zzYVj>7*L(%KGYEI6*tIMn2$#(OBig5xC;2mggt<F!GKE4P+G#I1?uUr2jt-in?w|H
z4df8ZXVHDdS;jg`ZM<fVyaen<ZeVgV&|mzvFA<(*MxSn7g*$y3c%DUUWf{lB4a_0E
zMHDnc?c5?n0k(npP?Lo<4r<ducrphjU!~3 at 4J?RRSPCy3SV+oPLwbRXbD*CQW=H>O
z9O2n-J|g9f14<i=tlVc2yLjs%Nh_uiZr^?vR*Pv4>d{xBZJsiNxFhEssALeH^T{(<
z@=_?zC*=X){IaFW*p!GY^j8^CE^luG2(vN+Dn`qKz+ at ZGt+MFk^MoIS7f@><_<x-d
z<q&tDyaaO7v6obky**|RX-9*tUla5SAv0Qn%t(hGMGfeWNJ3=9fint*g+LMgEBLLe
zvJneID5N%CfO0{U`j-qq{fi2$73i5lr2Wu<gW7rz*himIUl^D?gSz^eWQMC>nrAnF
zz8UZ;ML%W+tV5Cj at AJrtAFF6N8?40C=u_n-Iorq2*nIU<VbcUPcrAj at 9)<U-l&8h;
z)G4<6lb~EQgbQ>>u|2nL1ik6RXZ<v29)WfQCZ8ScpzJr7ag=sQ!*0d0)vs6D7m at kd
zr$Z|Xa^ueMO6`)7nx>sA-zIS*p7Ubdz9kAJPPR;i`W)?i`3|MNI4~Lf6~FL(`8Y%y
zX at ncuTa*##vd4f+<Hht5ykr0-10s?kE`k3LRhTDqExkh;@1UM6Z$oaX4U?6mP~Rw9
zhiBq at 3ypY!7U%`P-)#hnwO5-#cU~tF`rZAYPh*wmU1f-xA=)kDHXzW&eh1||LLin-
zXmbs7F(mT9N6GTLBmL33yp)5qMO(tU+huFndi9UNF0ouL0Z1NVg;XV0sKPJHnWBkU
zk0;BO>l!gLsy`2$h-&?<Ps3cN06##peG`dw@*)Z3AZCFSr$$%9ZCl~_Mj}-Qeb-vJ
zqK)H8`2jmbMLA%lpsxen5|k3i7|R at Gh|vK*p}Yk$ATb>*9BAhN#CU-Y8qq976x6lH
zp(Y)q;;BO<wgw9yiTo at vvf!q`;!(lzq6FUAKEPdd$);u(*u_i-Rq-eme41XWoyb&l
zM1CGeytLxS?KXrK$R?1h*QXavmZWU2IidYI%Z+NXmVX1VY#75hltnwUS+)l547S^m
zHgyG}Pc#>ZLdXScA>D!Q2CsFuQ}G3vX8pFYmhrz9<TQwONHlOKL}|9*_<@P6q4Jnz
z>da3eVj+-=2PT4a(iA$11}4U$kfMRO;gU`^MSBw}?FLx)hN=UA;h#eoNd0vj(YXwd
z7YF0LY?(R>4UZQ`V29gvv3A37yY3h5DY15bxIJYAy(uF`8Wn at g8-^S;0&>(4<Nz0&
z!$yED9fsvbz;d#Q_`7I4yCYxDj+Uw|U|T?U9)36~wIOa*zD{gWtS)Z2q#G`!43`KM
zu^2p76B|p3J3LqjzD?+1Qp9Y)nKoQTiW~tBppJ+IV56dN$>PFcI8q*l6Ur-Dh{(VS
z{a8-Cc<*-egKx|rEd%*r%UD<u;8_Fri7fG317=bKTKq9QgD?0Hw0zCz0gD0$YoYW>
zk%f`LI}(q+ at V)G2EVWT>m6y&yeEeNWA7zaCgB at G)G|yASBgl!<>FKl{4NzC8PHJEV
zj72aZ?cd=C{=aaSS^q|kgL--qcr~zFw+09D2#kZW9)M_nf=I`_AU)&-wWFc_v;&R3
zU8$Q*>h3uRrJF^X^s9Z^L9Om at Lu7^C|1Q+eQR>msH4f@#zXK&e1o6dN4yxmG62Gs0
zL%}ka^nBB<l=Db=AflA#k)9tcchI*cD$n^bO6JGzX3~E2J*7;1C-_QbG<qyVGEv{N
z>p?|tHi4JSfxM8O at e`RbSWB?mTi$ojsZk1uhoqXuIMDG;iicEaehlKkx1V>QM+Y6~
zyVVZ#tww<@P%_O5!2N5`L^|p-9mrAcKufj}-yXP+_)7&xWDw>Vuqw1IA~kkIfh4ab
z5-HsJ7}&gj#Bg;C>-UP`QU=LnD|iRJ^qMk`o#a!5dK##IphG<EpQ3OvmDJW!m+0;v
z#Z&$p9O&X`|2UY-9pD2ZgXa{jegLBB$iU0L$O+He3=DrgCv2mN%b)x^#AayW`=?H{
z5$}ZBT;_yZzJuStV5G?48AW&J#WXT9_<KboXDTu?D`iDX7L&+mwxZ35+osgttd!3v
z<vB!y%?WSh$cG8#<a*0@(QB<LFfCSMhf5SGg?amW-p5uTeJO)kNh7jG2I)yw%$Dr`
z>a0fOlxNVplM>9~7MR1SH!4MbU<Fpc at qt`uKfwF2hCIuK)mF>yofn+ at aE{0y+SNWY
zkJZpED34L=AkixKP^7#=httZkbbVMIsJDz?Ed(A5)CV35W(PmETwA>lYXbE+`+8mQ
zm?#Wo!+09LSI%h3w4q3NFrgK)9e*5TS}XcotqWzoWnmvB`EZ*5R9*^A=cQNDgLgnl
z=Z2V8*Dpfehznvl`~^81vc2y-x%Di>o>Z&WlN)%uF_-8L{W;VoNIH=wwQCWgp`OJ2
z=b(Nx)U&aA7V3dV%n7KU2v|5$A3OlHgi|+qa_v(hcyP32AW>iIJ>b{VNbJ>ePpiYT
z+0LQufmwqIjk&>rV98*D#1bpUc6eqHitHROi6+QdPkLqnU9&th?L3PBSG+xymyA4?
zJToEp(>Bh8Ebt`Iw#75kW<p3Xa5U-Lt}*gR@;q!cNZQ7SZ4)CAz$J+b6^yw)O^aHZ
zMEEB2zVUBSZ-Y#9G|({0qT6{P55>`~{M&Sg`Ylw?<)x@;IqfZ!m#(JUD1k!BM3ya?
z?Fpde{q+urDYQ at uH*AIy+X6BCyyrZd+mkKY*@(0*9e@(sPywYM25yMPOS3u8X4wif
z#M=yX2%e`0rU&fuuSkj1$Z4KjrLFJZ+WO?QrwhtFDzex5aiCw!a8Or1a?m+^G#+$q
zB=KPQT)04#LM~T<EA6>HoGDD6pv3I=U&5IoO2{~b-0kqxUA8{1FWer!^$ihsg7&V&
zYUhjCEEg(ety~!OePqw2wo61SD=-yuVGYSN!IPY~yt?`X(O^6+s;l`tm{EQY5B2M@
z_TTHler4jtztF#Ts|7qQkC{g2W&D9291SI%qz+MJSLc0JG{H<8<NC at Bl)4&Oj$Ofi
zvsiA?UfGjp(9<hJcvg3g<quOH&r at k=m+n$r_f%mrTb@@))1IWkOesyYV$J2s;M<pJ
z(x-;;xH=#rC%xS?%qcBepNI5x-YA9^L{v^>%(7@$%I@`L^PKPbJMvUK4Hj^&W!giJ
z=Or;TuDo<(cN##I6YcO&pgB_oHVYjoIIY2&zN)@TdGZyekKo67h^I*(!5YQyF%4n&
zClY-C*n+%8JWZfyJ1t{p<2+LeEnA=F%4!U!tA)IjX>_|D+8(cW^sC7el(*J_XLbHn
z;ZHBX00)V_Fkk<7ePO;<^rbN_6r$WzJ><m@|AOvBCMvRRBC-wtwE?XRAyW at SVqN(b
zcOqO5`$pI1U&`oC3G at 4XSR(r&-hy_`QTu<Y$U1!hVq<sv{^qjv>=nq*34Chp41gaM
zhP4SjG$bN+_AC8d9V+O@^iLh`b2ZurdQGXF3B5AH!q6x#-b+biP$^dbr!klZ+VU`X
zuv2n2%D}|elv?6iw*>YD$4FYNb)Z8<VJU|5>#!8X85Y=bl!H5+tGA!87Hk+roXb&;
zlflyY`6VwQ)hnBdOCc@*Yk at e4^XB2qsGqD7<m|xT!1_$Y>T2GBs>`c(;i)9wf1Rlp
zyzd5~^raxtJ6%tk$_}tsZtFlgGEY%}{+n0)xO)!h^vj4vRbU!dBYkxNp}^k}mVD{8
zb6}SI^;vogTzq>9a3v|w0{X2hOQlr~lr-pP-(z5Hd9YSAIjFvi!?XLA%nqV_B at VP3
zSdy2dfyXRd`2OZk?T3(|b&`|CiPZvn2qXJe1d;~IsOBmMRend{YqzNw;S<eF%R;c%
zkGOc>7 at SFGV;#xl%HL~)T<_)_8?X9YzO95ojcrJrW|;~#IjX-GA at n?p5raAK$=^vS
zB83IA$FOU!&7k at owCupJz8xSna+-fJ&4Q9;V5UA1ve=s;ESX%!d2-tj>qMiRAj6N-
z+K`P`tDFdxdJ2Mlty-fIQ*W98!hpuOC%B2_HxQZ#J(1rNdfXGD6sa}x9iYE^iS(B}
z=1jo{i&4bwzreCsC#gJ)#2^pSfE;v?H6D=Egp+}d(BrqzgZf)ZFI9}BQNy#yu^H5s
z|2_+~MNWertD at MY@mQ<yEn@`FvWIx4ULxP-OSsN4b+LShUromPWH;bg7(N*mj<~9M
z at 64l@OFd|kpfYl=Y^wX(%?Vo$sn3tAHrX(Bh3tn7Bs~LJMoCrVTFG9N^iiVQCw6uP
zx;e5h^yy{yMdxb7`}@PvN8SF*VJU1C%lBiL2aoL-q`cY*T7X=F*!i at H^n#YmW|xDy
z=gwkQiW4cZd>C at RG})gVqP-{UR+r_eRe;^+SDj;<A)<@C3Ri0W2kwjhugv;GkH8#L
z1E1P>O(D!uM{0nZpTbO2Z8 at 4n@*Uw0A7`F$=n?S36Wo*$uArs#z$XODubX{bGgS+o
zW`4tm{UQ~vgv_NfY#q{AqNUZs)7j1ne9(cYKl=;{Pgxl4dqoeA#kk7CSiSyq1?SV4
zhn7QR*N#rYl5f01?-tP{GKyzCC0mEEaPt%_JFa8l=7a7av~5VAf3B7cxY3Tev_M5v
z^4t;<vo^Qm9dZ^x{+ejAr$W)=nFwK`$1_Igv5Dw0_p7KLA9J;;8#lMM|C<)GiWct~
z)?z}*-HI0PAhvX=v6zXt{Qn3%{0se65&iW|AkzQ%GRV*X)Vcq=rgCmYQ|~Qiq<E2u
zMHk&<*EFW}w=4Y at LCG2J2-BjE@ayg`eVW?#W@>-4gZfM5hd+W;kP?G`PGWE at u?T4)
z0*p87U*g2HR=#RSo0i0ZZM#Th9^r!}5bwn)ty$65;DNSXB)bfj5ZeU)P-%^}kvL6h
z{fM-3q&4Y!tKC2&D_RK<c9npDV|Mc1gwO%@&mV?7f$Yzd{c*+qDKT3aM<<b;Z+ZYS
z{ZT6nPmi|qa5u$o70W>nGW_Zo9Af at OcGb-rU#YVEp<Z8nADZoXqh)R5^R4%aLaV*;
z4fFI at s%s0(GhV4alPP67H=$JLUc}YU!&4!SYw~G5vmk0-3=t7BFz9jrD6+2eXFC~W
zgnN!z|B7gS at D;H!_f31N1W(m&%AD{@wJ4EY_^^OGM~rOt<hEp1qeg8j|EAhlg(w1F
ztH7VRiHwT1OHV3z+5JD^32;YXe>lw5J0RYo=I!<+z%yU(pwj_%E7bJhPAQpCH1Ep)
zPKjTy&^!q-Xpx};{dNUH2AIntLLq at 8T*Z=`11!Giyyl%EJX`pFz25TM*S|48`RY&b
z8xSS)gRfq*c~m^ms^2vQutp-^nDws?m=C`?aNx;C{jqaz^6-4kO at XCqFekivt@ys}
zLCbGFE6h(ej)vbDf}=6j=1IgOaCDgUjbqG*8^>J7(U_{>*lJE_OjU5`>h*27%_Z`0
zRXWR&exTC at xeWAeXrun(f;nflN^NxQMK`tor?yHm`bWLwy-Yi68Ta}(e#SDcUf<GQ
zT#hIGQu?0vYgaYCf5wP;n7P at Ijutgl8PkzAxCr7^h*=GMj3e{?v?5dTj$~uwXv;Xy
z3cxnjv$@6IxU{uE<XbZvH=8Fkrq-Iw6B|>{=t;~=unc1uH;jSDoj}+93SIZt>z%|B
zQS)?gCva*{?y=t1vyJmwJ3TYqRO8IBhe(Oc;1bi5Y+m_F)yIjR4K0ge<4$heV4eVa
z1mnI^jaAXJ0I-^QSVh&*_kmEtP@=`OkSn;2c(39rUpzetYcAc?qa(d9rT0M84RDQ7
z8y%}tk$um>!(<JTsLC?!^-vexqj%=ATf548IP=O^f2uA1Wc>NOmRI~gTc&x|L|YTt
zXlvtWXw{#eN?HlsmTC3+PuTM&@{CWrOuz??M=hzMGta9NQKO}#4so9ON*!<|uLkPo
z{~Jd at vX=Y*WB?ndWZagx)!mQ at Pio8!V~Hu_m=yQIy2*#N5YzJAGsFVHg!G4#26vjx
zuPs^zULSI1Lzu=?bAf}Jdm<VeNi3Onhz?iod)7^L;htn+sh<8~Krq!Ln`gYX$TICu
zh8n?;guvUqW)l$h#5he$Igr73cTqi)oQA4M7vD3UKv?qsWY|sBscOnm66VB$T9c5(
z>JRT4yc7EB0b-FT3?>>(m at _B5wkTXlqVcLJ<Xv)dBFu{pxtgh~mB0ZFvCT at X{<K9q
z<AQ98?*2t<l)Zm=HcxmXzkNJe$Cy%f9my`_=T-&{zk3zNh^X#1AxWK~?1mc6`Zw}P
z{7Ckk7ruY$f at R#P3vc1Kloj?C8*;suqTpd<6UHaR50Zjia!Fth#NX$@e|aubxIxZ@
zC}(&yd*XNJoJe<|t%~eLD;RaBE+}gjwN;*AKZqN~5F!}<%n%IG-fe7b_f$tp051X-
z94;VOu=EZygd1P%bDcK^z9nAHzK2V*Xm37&Gi7TakKkqMgB!$hz7V4yD0wQx0Dm}j
zL1Nk{U&=3f^pEKA$KZxPqZ1T?e+O9(p1M$cI~w=baZz}ScFt@(Rkjk0WM4~Os`U9J
zxWSTt>H_qc@*yKqehp}o>a(zGGHCTh$fY6n$lGY+(SDHSZPFydXUjC8WE`>n#P*8_
zqJ&(i&m*?~jXXO_p6x`cb&WI4E8m#&Mf9w|D9?1VYurWcrn(`1tt}Av8hs6Qc<JCX
zH8jX9#v7NZ&*h81P94>2nL1|;UK>13=xbvwzddyUvh2sN^YHu-H#{TwXC{5YqXPew
zp405y!4pRwcB1(2&yO3T at BFA?zHB6CT|9lVHF%nEHOftTI_Xb%saWQ1 at 1W1;zoYWZ
zx{wz=2>_BrSXB(`+EaLNbBPh%)Pnp!*)@?!U{;N~alz+W&jW3$gIozjTyIqaH~T%`
z9h_C7LL=r!-wX3Qgm;J at n4RjN9k8$iNq!a19B{&z_k*?C3NjetPC=i`mEQW|um)@*
zbDk3>QjPH|H at E@cA3WXit~}*`;L)b*Jc_~J3L3*i;oFceVFc&bTBgoTC7N-9dWV*$
zyo-qb7jHs0on?wEgsdUn%>|umxkt8slxPoeY3xoHrS#qdy-P`N1$P$oNQ_3MN~;H2
z*IaLH`PTo*8SsCgX`+p%UI9JR3_tycyrh?Ee8g at 5sTr!*f&F~gHYxHw(K+MGNNq?#
z$>9A{hPd=|jw|gl(IL=>m>zf(9a<OFg#VM~yz_t4oM=zb9#d3%V!bb1 at 2$+D)W*|a
z4$p}^1>_|*6e#b~bf?=BycFO(4CN6tGYoJD57BJn1LZ<W&D?rzy~Dbx=8<FuaUbbw
zDRReM{!t<#C4Z6)MFt6;ky^~m08A}-9noXq@(IqVsrt4nQ5bXB9C!n$EVYH0ZmVG4
zfXneBn-gqnLsx?^rUnVt6I#Kl&T#R?g*f5RykY^x;iDt$hAp^3o&tFtQ*9#afmkP*
z7dB;}cMw<|HE44lXukH{>KXK@^FEeDMn8`x+$6kgoJr!GW0#}RT^sGD+A2YUkV&2T
zl;~NgioEAMb^g!PNv4hV>4t1As|{{ALBGSunPg1+{zydTo%^1N;LcsV`S2U_*=I0g
zM^vZ1@!*LXO^eU at O8oaBSBNPtM-P4&lUlF~XAxTnYaog<EouSZVDM2nlVnpvXHaHB
z#_4Gl%jJwC55t_s#H5a6QcsUbUD0Xwt`S(WJhKiyUNQ>ZNG!+C<uph~GDhXq%Y>-L
zS)jSJM=Om!whQ8{+*YZV@#r8D(D~y%tsQYext{g0o}1+~zp4#MjOP(K?J7g&=U2a_
zK3D)&f@#~~Qn#ET`vxuE&-gYqa9f2EhWYe+kb3C)tYQ|6z`05?6dS`53-j|lM<jd;
zIcag~JY-WysmqS$D)+BYJhK2fDSs&gU+liY@~iczy4aOwbv9O%Wl_4uKx=g)<Q2m9
zpBe1%Yq8KctyQJeJPI{-z_FD?<?`}FxnaqdRBO7F(Vb9VBo<rZ)<cd|Q{k!XP=}GH
zpasQzH;lWMjg8y>p6L>eJG&=ZezmSUI&M~U+zn*per<H;)~~|_jrWtd5&9-6bujXM
zS4WII)@g`*aw)BQ6hx23^+lGrb=|SiRYPMBuu*%KcR;o(lxPN4hFrM4nGt!pP>C at f
zz4~;BYAyumo&O)LRO_S})DNA#F37S~B;Wg?vt?2*IS;ws7lwF(2Y(}pRN#{`L``HF
zG+r9#Oh;KqP9h4;tJ?XN-ZC$*zkX64g^>Z_1%J_tY2Jkns;v+#-9qnntZ^Vd2e{<9
zG`U-CiF at 22AQlfr%9aNnH$WU|10Ls)op12nPOK&wpE=={e~7C at tC%jbhFNGl<Oer`
z{hSY2Z-M6t at H`!!&G1|t#+Oupdu;ZKJXA>!;l@%RAM}w4W6WEoLK~%~z3pXr6#I(x
zGnLy^mdf at M>4}169%<c8OX{OkSrNq^wSKH}7nEhGek7QrnTSUj9oe3fCvRd+IIb*<
zzUjz4P7|I`+fbHDjXJck82rKcv?Cj88~g*Fj}O at zmo~Z at -)l|xB*QvM_KzYh3RKdC
zYaVUOs>ZRc<>Xvhqt>&m*3`I6K1|LwMCoREq!&$%i(1pXf+g;iP##j#B5yDt9@=@!
z{KpLko<apkcZx+zQT%zeJEttw*-v_k6v-376W>Aj$o>;}T^{9Wq7V361hM)9kC!`8
z>9=C1WmonJ%d6{)Y>3Ii(}JU44`FrHj<?)-YbNUYr$E*;p>b|oO*P4%B=<$*UZibn
zZhHgnGa<hVmp#t at m*s)uHF&CxSJznLyhtv at 5P5*~!g8Vc!CStt#BJ#|Cj at 6G(Z~Uk
zjl1{(gf9j_mwbAWBl;^Z2Mul*;AJa}axg4;ss>Oph4juOlsZ5)K`w(bMAQ^-cot>6
z{`a%2NH;+q_xcxD9ms`W4wfV?iV5&E6OS0p`(1q0g17{%?O$%6fDG>0#RzA!rFi^l
zjps(O!=paWitT<HpEm2a{Z8!cl6v&!>D!*LjQ!yotd-Nu3EQ at so3?GkozRY<H33?m
zgx3C8tE;OM+AD=k=JA)hx?{VX<TN7alN2tDQs5MEmduB$N-9w!G9rp*k-CQZbqHm3
zYleD&1wTx72>$rY5S{N{QRvjNFJVTsvMQuLuM!LV3|{0~WO?GM9v>AY&$KR~C$Xg(
zPsZB5>K{Zo;|I2v>5>|6Y}_c6o5%O5+$|RE)#DfbSyoPI&cv0K(?%F+eeeaGX((qV
zVXeOdwD{d%g6{-kQNDv(ca!f;|D8~GM=(KJ&aOce(Hm+y__vT;hze0sP)4(0fiFkN
z!7g?+mESrEVk4#9GBxjnoQbh0K@=bI%rE2U8;@)aF&Cx?>>ji%nVNn at 1TVFW%Eu6=
z<#o%Gudtq<1Z+SjIl<^b%QC3xfj`OVyHFI0;H=@683Fs$yer_*CJO?O-0kiwW$U?5
z{47~3kk6y=$r($p9zP#9BkAgE#RjA<bFyk!(`u0#&cjV2M|`M7JCBpC;=OW7aHh?m
z+Z#Or1#xVqNJst0`yG-7X18dC0n at P77LlETfE{-RSJ4K<MbCf)S2fP3Q*Z*=`){;3
zS7WnCMzA)`Hl*O&jOloE)2yaP3=A%b>YtGz*)CisA&_1m3 at wYu2}vn2jKHES5>0DO
zh&GUtVC0bwsMtZQxfdz(Qp5E%kUblnjk3CLahXCjed6V(0}C5a$Q at YT%OOO47TOu&
z*m4|CBQ&N)`Y;x=leseemZ|fK at mjnCd*$ek&nMug%6sC8_azXlns7s`B-|)Mbgo7B
z at uztxo(fe;2_aU}2bKp;__P+?nF%(7>PssnR)nhj at c{MZ^=FGVdsDOzR`)V}wCoJg
zB$8>JB%;ucQ1u(<L#kfNO?6T|>X5pGp?ZoCb=jNSt8&vdR4>)Z_x#|^DdQ%yP=9h|
z2xWGwr1&zVy0d?I8D}Q7C(1aP+}-_4SR>YZ^(8d*W{8DrOUtA_+DjdccX|-rGRfO3
zR3j8(x~g__HFP}{+C_F(c30J~^^|{1FLiK2C*Q4C;{T&AO5uQwaDc?Ff#u#_uj=5*
z5LLrKPZvC^nsSx#p6=jQ_9D}vneNOUdcY|=y}39Gs8{!CWhc<JnVk)uA%~8|#R}fL
zfcK>eXQu(B47DIcg`Ns52Z?>xG&6else*Y9>Z8Z~3`)d?rr8jqCS1pWAfue;#vAZ1
zd`zC^WbuU1Zt%vM0kGv at B{U&ju at hYoDd$U(aA?;LI;RS;P;&;|j`H?zJiQ*Q2PbAD
zgjztmN1=IThD3Jomil{W6{0SUD(OQnW1Uz4;}_GT5GCCp at NTV0)!!)?SbZK-g9aDp
zrPOeqtpvV{>Y?AG8_k|=$`jwil%$~DjSIl8>=bgKUjg(>f_~|41oz~;6gTudvW=dM
zsN!TvRh%R|;&;H+fGM#EbivcJQ7~|i=B0>;e1%kB+<w*X_~Kr%sP;(bk)B@*bj_oA
z3`XQDrFvGn>R%G2x+h^McOx94ZUqjVLN}v%1EQQ2h3K9u at OrSX^<&6x56l2?;AEH&
z=P?64Fw<gM(i9`<Cdkhg_!Gq<C?_furT=$|8qNN(V$t8n08O4AqmW$li`HY?{JJ3z
zG!J4iKLh%{i+u%A&)6W^o!5|;oQNlS^9_mE64FX~zh-0&__mwH27erygw0Klz;!{>
zqj0q}Jtlg+y?;vqy=J at xuWxpz)$pLf1-ltsUUOgl*voY2sYBCh)HQ{$&f-EY|4b19
zJ^@d`>YqN4ZiH1k6|_kx<FuKfcwaiKi2?-&bI=u{YlQk|A;NN!7|%;B%h^6ylV0!W
zb+s%6ZRT4S7DWcl(0fADY(J~qZx*T0j+RL+3%wM9 at aDEIRMssIy{c;@fKLhOOA$l`
z9M*<3lA5fSTFQW2pM^L&2aO at C373bsWGIKvg^Mn+p<S+mKKJFPd-OwAh#mkr{`0a{
z6p0-QX~~=Dl9y46ypk<Pb3%Gat7Ip04KJe-<Lj97-w1iim{5&>3e;}6ME9tOSAcbh
zEaSj_8C(>bf%WYy%0-`_R6%68iPSj}&hVDjQ|+wx_8O|5a!_aA#Zn24z6QC~_~|oW
zk)7z!Zip at x;!cZpesSPPb3$Og8U4PI$W6%$XI=vS_at7ovGgipKQ6~9D}9RC>34qg
z3mv65S*GTv;&pf@$+lot<O>A+MuMNkyP at R7nsEk1<2CuF8W!{Ud`*V8p-J?PZPGf8
zI3cjw$zWYzJ_OCl;6W1Lo&xtoXycSNgVLslIwRcU;jZM^IF4rVxZXG at 8Nga!$U`c~
z>2Q+xPcpmEQ{?J&qEwM at jfj-k6%u=0V7)7Utm>`q-O;DL95+zopnR_pj*$2EhD}HZ
zc~~}hM_owQs|$XDm&Cph;V#ExHJ%FD*&8uQQSZDHSgu5^U- at SeN&Uc`&qNg{&(m7d
zx&Nn?mn-jTN$WP&P<1)vtM%42&!c_ZZn~wQo*Ep}N(KH#r=T&O|8P)v$MqGKpMj^?
zczOkRay|rk6kdg0M;>)hj*TMnGqMmU4g122En`7ytDBbuW|$2iwMlriWo&+F at IrHO
z at Z%ZD{Fm>+8V#Ry8c>#Z*QFIDmnn4>_Gm+uZbPVw^<esy+GbrZBihBz!0eFd(){Rh
zO>wf2rmK6n5M3>}b@=^iQ>fZM4=gHmNLRykN<CKsf0EcTBy0VnJ~FNhVUzHPdAvUn
z>ztGD6vK;niUa-n2C%`2cnYjaRwTaVJ2x#D5fU&?*(LZtQchnWSi31O8b>Gy%$DL~
z=MTvDXddO{0tH#xkNyB_M7nkrIlBNYTW8Rwb)dyhK)HgQjpEAk=u*t}?r=n|{o at kd
zs|HJdKbwK{$b>%c7>`O(3raw9dw2e@!+~Z!@q at ZobK$PD4wglF?_1te=je__-bKZ{
z<aDbK{WdT=FwK9<jO1=-d!e$nkc*Nms3D4 at k6>6)>=EXiy@~V(k3xBE?=he;(~d4G
zzFp7|9C!)L#Z=a)Nykf?^#rHO?z_Q1wk(gCNW7hhqyA3SphRX3 at -&y-Z@?PhAmxvD
z*|Eko#jkbQMar*s*{gYoUm^bMrI7*a>WfQKA`h0(k&Q6E4!C22dmO}|Hz at QV>T_vK
z{{*a)Z6V6XmDELOJRugXpCz>lN3VhvyDHz}9u0NsUWm6ZQ?SyHgAFgZ9*bQ_5S6$S
z@<qZ2-lesSy?R`<<?)y!yTT-MJ9-vNUOVvlOLB5$bt2?cdJzGgvbWViJ^4}_P)3an
zY@!h!FU22rU9xtop*$h*sE_rl$~cA<Z}Zawx9xk at U0}!tPf7b#igl+%DtJXi!PEgJ
zsKQeQXnc=@+Ip*`8D1SLWoy-rHpm?f24>=0ao#z#rr^CcKBb19g~mYyKNlZ$Q00~p
zJvPbK;JaSB+9Wh!J(MU65j)lkD2w&}5p1I^+)j2>$Q$uMn<yyfP!q^GSY<9|c`=L7
z9EtVjfSo873xaE-W8(WA)IF^u#t~(!yqH)6W+E9+yeRCAjW><_FGJu5Wwa#7oFF?4
z6at6z0TW12D=$U{>T|H-o2bvuj*8+7JS_5Lry{tvHZ6EBI}7PyghR;W`W)rDK9j9s
zk2i;`x3xMY_dFu%NzN%HcnWPfXqA)4sZF20?iY)bc^FyABg3As5D3CNG145BAZ5`*
zR-X`PDNCi}kkR#dy9TbGy~hH!H^LIj;yJ!#8=_bIG~EbgNfqUTe>fM-zW`K7flcfl
zoCNWl4y6ATIYkF?*rNK;J{!@Dvn|!8OW*X2h!)Wwi3h~%6c0EJYseRHfi^{tM-e at C
zedjYmoHO at aJn=26vr*rIeBfLDseH|0R^U`<uHt*YQ>aRkMh~Cb`a^Jxw3O_|?0VLB
zt6zt+ynhr|*@O~)fOb$%eD8mYM3&frSAiYR2D&w%V_8HpPt+*Vn5{_T0`P`|`*&C!
zyw`y?zfCk8A^e#eM#Z1CK^c8kKgP$Bkv4~+Ro6!N85dj&{Dhw9^Y>V=!?K@&>sJJN
zFu|uH(96FE4S at Vz?6e%qUXgd-L>lcyRM`P4DW++9qG at Nx5G^Oq{eN!L8}^{D+!xCp
zX9G%4$?`n(WDnBb0vJ=zZbEvN0U4=@y!uNa7n|d52YVV)_6Y=h(Um6Kumoce3%dvH
z#k#URO1TDjk7%Z!qtns2_ch)eak2xIlJhG^v97-cmy`TD&!gvppMpLjikyD79!PB1
zsrXtxUfb{&k`>ijcNf$@OP*_{*aX#=ByV!(SgAb~vJ=*XiFinMFHpG!&nc-uj}bZ@
zk^VNKS!A9;qhS-(<IM^DSxjpxAgkNB2_-39mdSeb=Je2@?Ue74Us{^2zxi`C8;P9>
zSMuH;NIpW&gF_}i_niKE1f#oZnL2+u<cKdr8-wNsHbr%aoR8V0^4|#B5FeAlWT5Uy
zU=!rE2+s)v=ja=-4(iM(1 at a#Q at L><K!QAuDOxW#EW(>Bn{#k2|p at LXU!FUK^#yvxJ
zlARLyZjeJp>m-Ogy6{P|KRIBP3qPFuQG6gvS?fn_De-sqQ7zl?POu?&hZ|ZZH5WRl
zCHKLK)<<C=O4|rfD- at _5vej!w_u%p8Ik1`In+sbe0rZPlI+OSd=(~oXNyHv*!0K=V
zSh|zvjJV5H at P2}e2M>`I8-E#I0vT9zd`V1mAj1pFE{|}usHJ at WM&VvJ+bSK^?;pLN
zKShg`!m?Dh)#H7?{;T>6CuwnwP_U0}#olw(S at j>*UpPm*(uLW3*w*r+AMC%nKkoy^
zmEota at xneg`zC+%ucZ}Ob(XP%e-Kg{*jE1Nv-_L&H=ki_<wy`JShltE=pFml?q7eJ
zu|Y5^+<S<OJ$nBP7 at M&P6zVUo{|v at uY&n1-I`Sukl5>nJ-Ot$euqZmZ_s;r9>x<rF
zTqaV>q3HO064I26LafL`EvP2>&lI5HW1zJEEMwcmBVn&d=-j`*K1!8<go+HH3N1z4
z5M7Y7DRiL%sLKGl3Lwgfa^;h%2;l<IHxmuf=PWf~shzQrSSW|khLVuB{*L;hcE%1S
zW$>O>9{j1c{&4-C4#v(?Xz<Qfp77uDyKTjyWb;s|mKS!PAYTC3c;t}_vG%n#E0a~B
z>|mw3+hNsna-p*Vd&<@u|D~J^l6>*F9AoTJ@{a|ON9Mo^I4);~CEA0K*m+HF-RsE+
z6gc<ctQzq13!4GgeDY;spnyEpXyJK*yoA^u=AY4#$-Xri(Gs`&gjK~=B)^Q1kwN6k
zr$UGtwg+B!0t4MtUd}FU8J9E=mM$5)InvWIep_*17mn>)L9I?Kwv6BP0jcu>9~xNs
zFnM1V`xdU(W{3<HBdi_Smz)zJ at 9ptPvYuRNf&3528!!Ecl~kl?{Vu;Aclt)IFvo}$
z)($xY3pqqF+*NSD6|x8h@`fpZy**suN{_DAKtAA}`BB^mEK8zT0K4=H?6(Z9HG=)n
z)&M9jat5Z7Gk^vLVo?Tb;eI>Zb#T8U_$gfP3|xilUC}Y4^T8(r`MC4Lv1Es21opD%
zoTAuUCW&d_!PYuZB6n6BJS&>~tfUHlqGTf71lzfiunBkcx>_f_Ka%#lqcr;C$r!(&
z{?{XTb0qkQ_c6fK8a(TL6z(6J^)+*X2g*2gGMj=q at PZ$g@`&$XARGQqC<#jGT~OkW
zt9G_=4G$+9(84wjr63M^p9f2;EkhB)?K1M82}Jhi^21jAHBeX;s{93o_w+HB=_rLR
z{udOMD=kqDbb!ayc(*)b^8V at Qqbv7ey5Z_8bKhKe<d3zc+Jf36S6wR&m|kf@^vY!z
zy#66S)`UBhac2?D!Cn8xnSz*9|9xERNX{R6GM{&|AX#fZug}1OmuoV3wM|J7EpZLM
zg?VoP8`~Z|$>cJ<moU8UK7 at 7G7Te*<#M-dr5-bmFD<1gfOakyHLyGgvIx0XO!9gB6
z4o_9GBChu0{-2zyk>{g-0sYd at u0N(+R+2+uEl5$4CZSCz<D&_V$e<STTNCJ0hOr7U
z$q<nlUq-B<0!=0n;^k!G<<h=E%1N<5k~->8>d*;7-!P^05unr;%i=T1xP;DY8E13~
zof at ohrl4_A`kpZn>Pq%TE|VD%T$q=1fkugA5z!O$u at xEO$Z7e1uQ&cL^{GSk9Mr49
z&yRs@;2f!gykl%h2AV^7;9+pP7s<AxXFr^dGsQx29f>yAlW#xl^lVI#r*%Jxh4^04
zq?9j{9c;W-DSt=K2E at wWifPb$l~TS4t4ag;_F5?aLpcdgdkV2s<$62Ld+x32fp=OL
zf=)lu>w+xf0kj<5FPcEdC<kRv4^??)*F%g<PK$x%Iv!%k8Dv*ssH(S;SP?9RXxUcs
zGAjRQq@}vOkG{;1Rp(E3 at n>jXQnXD(t&^bj4)Ed^6o_5e8`XQyJd}>L!AgiiQo!bp
zjaiqChII6RAqCwZvo60;tjmLnb$KYb6Rw+}B?0c6;hqThhvA+C_bqTICp9bJPR?vR
z61*{)LGx(_$HCnUcRkz}V0Hg~vVy`L|KqHl{{J^Chyb}mTk$HgGvpM|V163Md))?}
zqP@?<m1*Ogg;<9h^3%xLquAKm%YwBxwJFIvttlB+%^GZTM6UgzZEUcz?RoD4ut at qk
zn()TE5Xz}_43r-r{Hdd&9IDSGJPPitPmFS at el+1zaOW`eW~iG%cop1PrzSjtK9gcR
z8%1~(<I?;Xmk77wquhek_;rk5X(E5gXqbfK;g=Bnd-u(_E95H6qEy5(rOypfPG}2m
z3$hMs(Nb8?y5R_}A7}Paz{N=r>BWCOAq06V%Ek$3Ax;F?nE;zS1Z&n4SiBD12JQFY
zMCipro<A!560FLXMtaLLBob`@ZywYBzj(~Wzwnq1SXI_Y-GoXp`M((rtk+E8cB8&M
zA+p%89A}c9R!siep{74kp()RwER-9Q4XbhHhi8;lJG4F_Nr5apttz6x<g_dtu*ueb
zW0?oCkR&uaid%$O3QZAAdVM=HxYN%FJeO=p$5V<Tk(a_nmy9mH&sEZgeqFL0t#TC(
zaS)#}0H@%W06*Z7?HKNqG{Zbv?@xBBwnr|pJ#@7VYnzLjMF*9(7GQ>XZr+NgU<Yt-
z21>*;B+bgp)8FmU+RCT@#jl2%n<R(@6C&<*=j82?I$!;sGwk8s`U`#<tckW4EP-tu
zU^7IqondR+_iutWFW}un at Ls0yZrKVp)o0&|3{KFZun(l+3tNdlf_SSDR at LfeYhVUG
zX*Rt0S at I;v+w)6SqdR`FzDkFr;*Y=Xt6+>4XuFTJMOT%1`k`gC5hL${<_;l=#d(yA
zYSclTgS<~d2#uTUux7H(sBD57M;dC|$@|&oo4ceQl~Q^YOK`p28^$}j%7q;BxL&Gd
zlJ_t57eo(8apB0!#O#YoQOPnoK;t^Xg`rA(k@(UQ8aYEWNNAKZ8;^D_#A6&(p*&L0
z%|y>>=soAG+Exy<oTw%5tj{V`tak}rlJK&5{8^x?KQ&b4r+=(+E<#jY4XlOHr`TFo
zeJ4P#3DLa_U_J_%jnS+|>7N^_g7q-^&3i1`1!RrTc-<97d4qn^umxxN!@#MN;ewD0
zd`1`9jSo at 8u7R%8NW>axTEl|lx!~R7e5%0mhHc>CQ$iH^3bT;+%r4^!wBOpg)eX6L
z8ZL5BYnM2eV?FWU?mjLVQ>g|-{byM542*FNIdKbCV>CIxiLs9(-j<uJy!l$=*Wy(W
zEs&ZUNraB8h(9L(U7 at UEAO`Ci?)ARp{aQS7bP731jCt`T2gQ?9^fo0X081=(R^e)x
zx8ZfHH*ANMupL&ycCh!`!NzaLNlLt66^li_Sq1q6SgD`B7fqv1#-fEPh!$Q(8AB1n
zzkaeIbPL!sy at NV%yPL8Z)HwJLm_b%^A>r*TnnV;6{~V1dUJH|mV*mG^3T2j$c+ZJ^
zP&4EyTNjFHy)N*(1rEyU2JW9C=T-oIJ?YiFk6e!_-~8R}2oyx)Sa_oOPsr6VkG#EB
zs81o^14O;-zmAdbPaJ4`uJYYPMz9!Y)sgHV_7561BGukX*%qpbN)>eRHjl0T$#yQ#
z(yoqvPxs6oIU6K2LrQE`iM&`W7X~%SiRAk$$gC$ctAO4`zFEqMXv at E%-vfx9mgg5r
zdF&xd(gxK>s8i|?)k}+lxJu4&cb7fB=ZZqn=w3QRiGm{%j!4>JZO`eY$XdafAqKoe
zn4E}@>;<Y%DO8^#`$Ey!&_%hXC^6R!vDk22 at fMV-P_Ww5Qva6@ZNNm%FJ7NVlpo`c
z8TO*l at XK(=;>WVbjWWb}N``??mdrvgyV8CU{T9dUe-gw8x{?ayBHa3gC%AQFb^{)O
zL~EnZtIM3Urk1`$`B~Sue!BXiVL2KN_M0n9rKfajh&)$PM7FQrMXs;iL#|CvE7zk+
z{ivucucd$tEV0=<yyC|l(_*uUeAnt9)y*m%wL7Y5$Ipt&cNyOu1O3sC)JuqBGJrPi
z**GYTuI(b<5}#E;uNCKM at xOq!6 at dcQh^baS%Bd}C at -ERqPe$ar_ at D^%-W2aoIXv$Y
z-3>Ag{tUdH=a2h^g)NC%SS4p$R6^5{z at QUWV@L$cYA8e9!**@KY_Prte_V+5s(mpW
zy)4wP_m;@kB1HceSQ){&1`FSomh{nIS)PIn_ag4LK7uMr9;QD7x at So$@|_Bd@(KB0
z59=s4LzvAXCk5kGdRgBBthrp>TjhxK$MrInxNXJmyc*t_fvtfX4 at KXl*_+6lw8c${
zfrxCotn$ST?cOdp0I{rIq2qAlcv5Z>V8l7jBy2dY^X4{Az#71eCY%G!rkeD<j2G;{
zaV?3Ip9=$>S%KGJWg8(I{DmG=cM?4?Mlb^q7Xz<BX1}@7MmrJ7ALg8ovl(<h1s6oW
zE+h6%_mi9!#pcaDQmnKO{GxqesNEBHR0u=}L>w9k5r-6rBI{&S(Xhpna(ro^<vo?W
zvSACc)`5#w6=+2|GLpAYP5~R5yetp;I}436<f1=;>{dWL$vQE%=4a?LypmxyLSD+i
zLZC^ql5~_~;880L7 at P<f9j}DasN+>^I!Z9|*a%M(q28&~^T(@b22D;znCum2NP2H3
z+202~ErRD2=NVB&-mHWwiL8`=YALtg%vQh{iwq{bf;C|dr?a!r=+=9oF4 at 52F)>=>
zf!2 at B(`)9eH6gAn3o>z1pM*Xx&B6RhrqqD{6H0<ode;E;ioU4WiiS6xIf!pbPv-H4
zmUQw}7nByZFd*?1u(B;6m3Z(^YI+u$K^LNIzY0cM33mH#XmJ5laV-V3+zNBRmuQeH
zVi{zL=Gh at 7&&HbTnf7!1 at XQ43WSChYvaz{{GZf(SfEQxcvYZGDb18F*0C68c7!mo>
zEwBEbCMzk|Wi%DQ{pO}ZqG_+GorOR>>oj6tU^UESF!(vjz#ov at 0PcS!*#Wff!yn>f
z|9f`O!qOS&wqzdFD5a%P+NG41Luog5KqR)t5&6OGOh at IOq+n%Z5>T)Us9F!))Yqjo
z+2HvpD5ut?LzeXbJk{2jnij$RnfkR5M;Xzx^|v)GCU at wyss0Xt+C-j)`)pQV9)!}v
zq*Rv)r3$70Jxw+-t!WW$L?y=yX;|D!Cc&a*B$I%93EVBQ`h~H2vQo!L<lO`Hhd&{R
zn2En2|Ef}i(48Sh(vkNJcPVdRjvorqfm(>h2<(gG`s!bm>$ghl?PNa@?8kE39<sA%
zRb^CoSj7 at +Mp|N0 at 7#k7&^ANjiJxrN$UrTo!B-}L$4|tQ6pxwF3|KA4UA#2pJstvE
z)8;hPt|oCc(04zK2zEX2zJDB0O6Cx`b}ewxm1%trIKq;zw2pm7-q8R|n}gbyI&9%t
zoTc<do2T`H);Z|3405&oh1l(Bxxj~6(!vlM=ow%GJY+J%K6k;XfeeT*vppxpVz6(i
zO>V;;tQyEjPQv;jyXstuGr&5e*6cX+QsBn?v>M*)g*BPwJqp*UHSM|-#5O(X+3YQ9
zdMJ>KHGv$zmc(X$wQ^1``d<DtL>Rlm)+59U7 at QS|FGCsE{lTYn3NrY$UdwgLES&dA
zpsWDoDLD5cp at i%dHel-8(r%8(6ztk1;txJbyv|Ka9&qzM(0<4bmFTd;V+M(715d at I
z7K;X;Zzfnxy>kyXfYg$ksc3u?lNwm{Ks)(PcY$A0&Kg3#O1O?T{Z5fdE?Ca{P=$zs
ze<k09HzhR9R`ycR=qLO}@=m4)EV2G?BQ3H1Z*m$)kcJ2VqMB=mNH#zyln;j&LC%)e
z{ScWG+0C_<a}{ScytfYKeFKWVw;c}_W<o1uJURp7dR?9^y_KE{^6ti4)LZ4X_lnL2
z%r($#g)2W)9av|XYO!IRJOy{w7X%8xLfHU^6>t=y9Q3Ewd%)67>vPdOvh)$loY_Y#
zwy{q{JbJUQ8m at 2k?SSjseLLa$=e`>91p&k~Cs>in5A6c%`ves%HiJu$vta%!YBc-X
zkIp)>IoK8Wo}3F6R1*+Dh43ml6WUzl%S({~9fceyc at 3t+r!TSH%fpLs7jBnrlH<e0
zv;nOw<uPk57vnnE6{``wzq#Js!9a<F`qbePuax-c`vNEl!SSremG8B)d(iaW9f1R0
ziFV=}j?y&76DSGaiKkxPb*1Kqox%PeG(S{^s^46A)n$AJGowDjEcwQfaBCrZS$l>1
zK`l?KSKjU)&lj1d`5>Xw(KFeXn4Ym=0e>C16SsS`auMi4ft((=Q{?3$$S(>!Gv)Mp
z0WS`|W6Pn)>FYYOLk7LZ{a<>K|4fhe8w at KuYXyNp(BK?o!#7^CkvOS)c{Or+Fkgk8
zTW}t3+~ok9pVOf2@^sHVWd2&{nceVKDTSEpk at UjSh9_X{%<brJ=!f}9d8-gryh<AV
zeC3fh&Ln#iypH<Bz!eNu8Rv-QS6r>{%9&VddG`ucre!pKlbb8!_I&GS<-3c^k)~mu
z`$$cv|BNV=R3b)fFQpOfi{GDdDz2mo>F at -c8NB9K1^1FKZNu$km$#boUkaOgUFQ<8
zguC7!87;5wqww0H-E;&V`^BV7l_h=XZgILLZr2CFKYNAuSkcrZye85NCSSo9l1$$h
zU57^kjlOS=JYk~{b>0M5`aEx=p-isy`AIewv2djje}1AJ(a3E$e}m1C_|C|cnD~yI
zCJXYS at R5O~egmwy0)PC#GJhPDtbT5wz^}IPH1abxo<hq1H2*)w-UTeG>slP&=P^$P
zIKUt%L=F!X)GDYkXb2u)1jY~?BQbVL6B0F#Hf>Eb&ziai4vK~tVhozpnjs-0ww7SZ
zMNE at sP@`y`y~(+;_hup?mcW^tbP%J2jLdJXGk~P+{eS<DkF)pLv(MVEwbx_swbu>}
zf3E1T4&Jxb7Vle_MoS=dGp^X59R*F%8EgX0VSTWG_TbLK585l?+S9mpz!ne_^c&g{
zJOsLeCa*9_?j!clrI)>Pnjbz~;8;y84uRnLidf?U(37(%^WQ;`HB2CpBy>%+GY3~F
zQ|QUCmbH)Znk6oSpq>RXDKn;Lbvy5C7(z-le5vnJzhPYNP=9}IMP%6)sM~s40`<av
z?Xoj1pQGHat<Q_NuQqb>w25#asp;Ln_RsN at +nF0a*wwZ72=1bNFoa%VaTm?aU8C5`
z>Y6vA-2+hg{93jGttj?c42{vdxLS05jB?bC6%4gFjTRGx+%8UbOQ0#koMZVSV(cj;
zw~|i4h2Qixl at F0$*B2CSHZpr3`zX%2mPM<X*n4uQMOswP#{wiJ!nu~Ye=VeFZ$MiB
z4#RFD%jB0UUV&0tEXIn}P|7QEm9%OPmY!GfEX6vRAmpA&ukDfcHbd#PX`_dwRB=sX
zL*XhbQ&vH<pgiHLwElFhyz4D|`Ew*0;#>tsxzW=~Jd~{2b>KUukEWnx0yWylnz2R-
z|Go~wXsB79%#bwF2`xL?TQH#eD=);7qYCSd09_vU{@;=d(BrIJWoM_~5%lg#?Mv?u
z`vICb4}#jdEA?uQJ=C`kxacDeYbey0*1vfFC7QletmBVx+N$t=VLlZ+b|Hnv0KS+Z
zjD;`)!Z_4nAhbe=YpwARMnO0Q!e|JSfcqL_Q$RAu(}^i`nukLTpJt%XsvAM`mWgv8
zca#4{;O&1|8pjhg3(pSOnWZmx=j;!*6{+jAnq&~DLF;~a#<cDrP`(gH%@D>xh&HZP
z2rUrCLl_C+6bPdrOoA|)h4N!@4-LwP_t*)o|74J%C*-Oj*MT#AclSqnD*Ssqw?QrS
zo;Cg)&+YylZ3X_Gpv#%a#V<`2$kKE{#FOPylDiSMu5~j!^{o&4Ev=9EUub<a=+fZ2
zegHKJpziS829VcikZ<?rXfQVY8 at M-iM**D88tjKP*pC40{|oLKfP1aR<8bT$4ct35
zxR3l(ov*=7qbClWk$d{?4!CgTs^8+N=+b#^>*C~8g$sZL12A?3Uk12|OH(ZX*CP7o
z*_kEr-7)HKy*kiT7qwomaIK48`xeJ_$z83BVaC6#L4P?&XpL55ou>lexPlbmm^C<Q
z7IFW2Nc-i)>JgzYAK1}X*l+Os!gJX34gB_ymOql#fTj`tV#EIC{e5;OcWC0PLV6s(
z3e at zcdNw;=A(qMp(10IxCi0O;-<*k}Y1l}!j@~JI{2x=$mE|7Ke|Ro~)MBg&9egyv
z9leug`9B_A7Ca7RO`%`X^kK$-qxxt~2>MX-aE5D)`=8wZ7so<s{M|A;bLV1^vNZWE
zSnNtWutWCt6?UWyxh~iAm)k=Z23^F<vu?sF?0?)z)>9sBOMu53?Tq#6cGsz#5l0&z
z-n&<QXi4Jlk)`$&^Z`h#kJyH%1yA8Gp4?r0pRS*a`H)6>aw`P#y;ESOI*B16{0)8~
z7kGvbF8$pWsMD<OB+ruiuDYJRZMehU>m5M;VziT(SOs^ePeJQU0fuI=D91X0(w@@V
zaB89ltNXJ(4?7dt7?2U;p)Wz-21zjidixLEHwD<{M__b+fxX0B4_s at W8t9tq<_=y$
z>ox+dB at KjYUTkM}ZVuG=kAhs88DPT}F5hx?Cf=*{ZzA?D_U?G!dbT*ysS$cM0(YDs
z-;Ut%Vx9=~mWe)Q#_H$lkA!j)pxk)(3D4#L1LJreYG>B4UH~jfAIGcxuL57W6m*S2
z8pri<Y}9)y<U%_$uk2s(@%~Gb at Np9E<|h1W-rOmZ^1c$zyC3pq&Ku7QZA at zr_dft>
zN&g;h{HlM28=pU(7e>PnBwD_{F at GKD^oxLt9&cl1aYXVJIUi$Fn-_p~!8b32r>=Ps
zdYWjy9-fBg#qcyX-vCb&p1#FZRtQZHMzj^;Y>odU_zK|0EAK7`u6x{7;1bV9P3(qM
z054yyjbK>L at H(CajgP0ir=l at ha=UoYnP!4+!}MAE)9T-&U*_+S9QfYbgFfei-sWss
z%&p*=a~4T-lcrVg7=dnsrb3JH?3KdTXF3!24L0Z0e^KXEE@&<GYHcj||B`OU-Uz%c
zoOqMqZPEA};9i0I`tdiAo(kNHedz&LMLY>fJWz%Clr#=sVk#>r_Q9rLS5Tx~xEsM|
z6U&D>&*ov?^RS|qMIolT(N|d$5(IWHo;3Zx@>yeO1m?2}#4<UbuTmC2WIdY&^lchW
z*R&H%bw3EX=l>tM^TyJ at pvQeSTIDJ6upj6>Z-Qog(eswV%M!-me+bWwo{e@^F(y(#
zFP_wq96BTyybC#yn%J4xy_3uRkoRo1GpC-#w6lm=Wp+~bwRTojlhDS?`ykTu8>qz%
znuWzQb)Qg0&)Z4)-RKuXVCW5?aWQn723gYXG_X<chtt9qKI9SiBcN&Mgmm&~*DR7v
zGfrf{bBZ&UP2~k at 9GxO<qIzK?ZC4WUelGGDegprH=1;|Yh-{*@PxBLCz;}52%C|yW
z-G5lKj+;CJv7XJXm7tv+ZGGBv^mw$d5>Haq>m49>gwIkbI$3P3^i{Sl*Xo)Y{+3eD
zX%Fk%$V9PepdqFb?{OpadMpWe{zFJ3gNhMG9^T-85HZls++G at R1wc;-PFQw&3OxpA
z19Kf{x?u<jp1(kgFEqaqn@%=02SG;L+<X<D4>ym(^AS%-SV+E+ at 3J%Z{6mR{@q at gw
z1bH{Z|HJVA2&8<2qXs!Xw-GJ`vfn1H#RcPKs{24Xoa0`Cwj2VXYurmf!?pltV7t&~
zi3wsn#8`!IobF|1&dQK!?j`ERLXsR|B{V6|a&$v?ytd18BH$XteF9>!D}b>GEo|or
z`KBGSU~X-_T?B2PpkG7KjAQyPpw!=yC~Zs at f$uMAUVzfU&U<9ePEuzp(H=eU45R0Y
zomsT|+6h{zpUw(<E(6S~_GH`1 at 79DdXS`idpI?Inx*b|q>v^+pWxu}I!QSk+b>~_|
zSM1<VI&OVR at +@-_*61W0{OgS%mFuC!JhT<si8cT8TwDPq&r#$5OaZRdUX~-pd9D(X
zu7X$;gpM*%GLwbW!h_~N`a8L*_ikJ_ui5t2VVGCxq}}rtJpV%*#SYKg at H|R at GeP(U
zT7W?KX9yz%k=}mH0x^pf;2g8SS5O9oe}VAUV;1O1M<+<U6fLnNErvQ)ffh4E?34bm
z%?gRA5ATUY)ZvIk$z{#(j`uvUVhoNuPtZD>ID7}jVyh-%w`zRA+dXlDMGD$tws}BH
zdc{}Swwxv8Iy*`GyEhScfk`yAPV5AeG!@?CQA#E&X at b+J;{XO=oxf2rs~cH?CZVk@
za3mi0BGrw6g-@`AUI)J<R|qoc;?@Ea06711 at N&S__xFK`{fz<(+BJAO at aBc#6gzpr
zAE@?hMBNeb<An=>noHclM+cc9mKtQq&MbTv%Y_`=!7K3lCmKc??97JqvgFxF?}l*=
zX}_Ev|7F4K;42f9%u++&uryzc%^}IhEX{w473p=L|2~44MM#jxJDw<N6Kwv4zEl12
z#Q{_D+AB4cx%ciP(h&MN*PElJOo_#lA2?%V4%cW at x2A!xc{c>*-9*#8yS!Xq+N4${
zqLl{TOA_qzfOtXXN)1#PblI7`r#e#HHw`k{*^8*ZXW$;1EGaP)UuK}Cq%x&DL468v
zIUaJDAV<Nx1!8miOVGMK*G?p9dF{A<3sT-pXx9tc9=6v`UfS(7_)2(z#G#cI&}~hk
z(4=)1Zy0$;LR(Fc5Wc{@_3p?Ch}mJAyRj9_E`a$ruYeXV_E68AfJ-`cb?<3w0C(Fl
zE%Yg_xb*S;^AQ at _eYvE*-T})GFz!`aBHxWY;eXpxAa_a6 at p$?ISD)7L7HR!H-X?@X
zqmOF0>(oJgKS!D4wRM_S5el^iyELo42 at awbdG&ZdMkyf=4*x<;E$2v;x)Em7XWG-}
zzTWv5gE!K=<twoX4`(|FTbZ9#@R2Qh%Ab8}JlV|;!ECw+U+*p7ME>9;3^%;O^QfnT
z8it#ECHYeeKEf|-;*<g3itxMt26*$M_3fnhuYD`DT~YM0-hlqpWBWjp<~&C|0h#)n
zWRjos*2!G*2cSZ^VhwR-LOD~=7dJoR{|KSj#00Z%#jr)Ifyq}Qr^CGe48k-BeRu;H
z(Cr9kCWkFO=FDVgPj01WWAp3mLh^*2IgsIOV5fO*@ZedrANkAC7jQx;jAh=qugHQt
zO!1|mUj<ogxuJz=DFoV>d3KJkL=dq|c!v8et~>RgdoAH!-x`nyD=P@`dSeyKhXV9|
z^yHpOcoh1=fPH9Z)=za`U$&9NppCvjT$i!7t}95-mt8=w8l5rlFCZ<uZjVd!PLoqn
zgYaDOEU+^<`?WXV4Ia=Ca%#f2;hgxjn%W&3<_u3>uY}L~5fjlu=E=EZx$bj6?8yeL
zBgq~bJ%%SW_MQDu4`1RQH6uR`+&)?EX?c|D51nnXYhSEHYO(DfFsp$-)ykkD<9#dB
z!l(IA$_y4PJ2U?QkSM><B$sQmWIeR~f5UU6lrT$34M at 8o&s!eGNj1FuukK>X(X=5~
z$DQ_&?;V%ae&-O=9ZfT3<3(4;Rt?5u<2J0g`@+O~@&z4<LO&$A?wMwyBbL?$@QiZA
z6TWpZW&94uLK5Zw)Ki9DoIGeN7YE~3Ll}XQeE*!o3;c6vrk(l8Mqi1whUktGJS`er
zr0B+AvQ1B*kMz;j<B at Wz#L8^<^u6Wfw~}*!afN_!pDNRAvGDsZyCNFrcE{~4my6yJ
zU=#}h+dfqy!Yi6`ahXGU8{{R4rU4~MJrLW+_M2hmM#xOZS&3LIe<q_TofPV7b*J#J
z5FKAbB92Ne2U>orUUnK;kU(0lAG6P!MmU-X?YP0ey>;Q3P0JJTTU6s>uMzm*R9ke&
zI~px;6zwUeV~TnS@>Kdt&<_I0oJrw!BW5 at +!C33i(ofyeve*%aCs+N;)f>m`CoK at h
zK^RFhsR^y&uAb{iQ7XD8D3vxIMd1}mWu^Oi&<;#c{|Lyr8*#Zc2l^o&YcGpo|0FI3
z=TZLSg~_>`oAH_?KAE_?PUxsf7G=;!(1-UvsMRj?9xiC3Ak1WC2BeG#i5M+!5cCC(
zcOi5zbawll+Uee>@%jCaJ5pqWm4jYI3w|@+^O5{?dkW&EZ#l|acx%y^SMC^fA0e&_
zKt&>XLStZVa<qqc(72EIs~kX#8au<OYSPp#)GLc^j7=o#eMKK!YkeKG-WJAaMdF_$
zoGj)|Ke~a<pn`*^iyWy$th4Vw*;_QAYwoJ6>MiOw$~~Bap3Xm1n5>vzB}WQ!+1+Mm
zDU5+gIYrIYB{OXWxk5GD6(?~m*f$1{{j>2lJ?d3VKPY>-uMjPC_I(BX<o%$;y9wve
zk?cw1gLCf9F}~y_8%Q>x1n)gF+C!gNY0spb4Uk%jBME)wWpzYwY#@sq4Mf~A+wltJ
z_b>WV99Y_%Q>TY;F?WKHl_yBHXEV at _WLz`czgTUe=B1($trN_`3=m|14!640%R&u}
z1WoroJ2St8CIdc3svDHpm=o0O-ww5Ss9Oi4tEH-!K_gfJa%3dr&4IGK$~)mxJIl^w
zuZOx at Tw>pbfv{i1R+~Wl`B{aZ(H(gDypz;Q?cPpORz(0O(3ARuxghth=_C-l1?~1m
zudm!lnA10QvQ8rhx)x~57CYm40ev6a=hj<nBGBg*JWt_wqXm5`&EM5Y{3T%zOLk_{
z<xcWO*sITSr^p&G?N_7SkxDG26!Q-9643Q6AAKvt(%AM_l^~QuIA|NpAGC^(>b8#i
zK1I)R$B5g!i)k at ay}DO1)D~!-wqBOe-lTw<)V-&5oj at r-#?hC*O!N>>qb2 at dV_(#w
z)%+LqEYx4<?dngG_<cnE0JJudM9?bWcm`jk`ewILE>et;X5LkRcHO-z2DpxUU4 at 9(
z%9qrP-mqN-^LC$akiBh%9Vr)Gm#fjw2<-{5&|CHBm3_NQiEmFSb1%CJG*#&J_76+C
zM6E0j`bcH|*x1c$@CLWj0P8XM4|vV)LfL!9=;m!zhL5CmM6cZv=I*;7?QYf&L{50{
zgVEz|$<HcE)=p_<N^#9nzIo$&=r<`)1G>s|(1()3a^=(QxrY5De18saPK?d7)ZMCZ
z at LUzBQA`jzlpwCxq2Knc3+Az at WnPPO9}}_iI5FMB;b<~(0d5b2c5 at JqbUwyKoH7Mi
zn-EvWiey at VQ}+aFiV2f3$T>iO?`8U-4gt<4+;y;58~|DUt`>X`9=9={c!S45c10IC
zGp}Zs?+*L at z?0C}BHcI8qI1xqX5VbTF_+9_HLMWWEq~?9?xx)PoWC4&50)BV>?};(
z93gRa)582Rd;PrF)bcaBd9mjk%43;mlnOnDa*i<{gUL?;v#Ph0QL?POn%vahT~;M=
zv>WhXHq0{NOR+y!+MGeu%RZZ01Qg9U7Bey_N~9LY6RB4)reVe)@Y>HO(j&*yA- at 5w
zFY3`+$VygIOMp2C*r>juKBK%Rk9jY%85JXXil2C&tJy(xd|*I)*ZBBWrCjbQTfgi(
zwYRsY|6A#~WP-j9#_E(m7RR!4!*Q)vIWTf70rQ^iWX9msJ9sh|=B8j1bt^T$<Td`=
zcq`HGWD14N5na0C>A-oT6>bl=8%ECXQDwmJ*Sr{^WxxRArnB<I08s9?TD5RP{TF+O
zm7~}~_!IDEhhD9v<wN9lkh&oDHUqNUs!65p^sNLrzr=qV^#XMUni=BvfBRyhR(hVp
zN<_D*-PLktC#|dLZ~^t62W`sHpv;>DrA331;lIr#g`tdo0rH9NMPnh^907V{1`(TL
zT2_IqCAKrWYNZ94%ucR at ahrB>EvEJ~cg&0LcHE5?*Fec)fsYkmP7LfoxqfKprKeoW
z`DbYSDb06<O!0&<Vxl2AKg(93-6NFeq+B%m=BS~^EOLP$y7nEjSR3fQofcsu^Maju
z?4iJpi+FFJsO}F~J5pc at tPNDdvocU4lR#}?o6H2Z`{OUmKv&UbfBlg8QUv|Iot^WO
z;Hltp^r=dFC;VYz>F1$zdCY&&Z1g|{RNFG?cNKnb(0r24<`<HgCoGd^kpZZ>?IWB+
zD1$zM=UJIwYd+b3y<2<A_}ucEqlQU*oq1jS?(Ww)oa1T+z?!9|mt{+n>S9dD&suH`
zmt|)j4PI-j_C0z#VguEIn%7A{4!4%Xkr+}$4w2R5_v#B*w!hBED__6c&d$CNd?#qT
znvKqF&TxIT(4w#pOen?lV<=@2y%$Q!k_nwPe4YDxd4`kloMtJUR<rHTrormL8hJiI
z&IHI=z#XGIwhq?1uN*U~p(`@rRy at U<9$D*KZ6%=l0e6|!IB1|H_Xu@@tQ*|!cZ06g
z-)RKs187-`-dbrd*5>R#*XF;j)y54P!Y^KNiB1x~P$naps!FT6E#n;2)CW1o?iEzh
ztPO-!LjprBXh#QOq<c|Ivd~1M+>2YTb1w!h%ygOq?B);oaQC+5I+~6*oyvsIas8Zv
zgc3e~<zifguJjYYr)3&0$NVFWGB*2Wj#yQ(hIYs2-=Docmz&AvPc6NKyw|+cw*ueg
z+4YwEtkO%iZ1au2H9>Dv%}9cyh$Ob6SGgG at R<z*u%yg_HnQIBrx6ZUh_mIP>XhSR8
zd_^Pt;T-jH>mrbiuLmh#kLQD0Z*VUI9&F at SQ=|Hv`qD?7<`IJR{|6sF#b}0HnGi-m
zn1xcW`zDlmh37~VO~zAaY7R|Sv$1Vgv(K>I5#zLPc^jQonNAqoLC>?4P1SaXm!nnD
z)RiC&vd#uha5fmCfS*l4y=yoQpYC>gKaBP-a6KNz<_~Bg4p{vtu3RZPls-p4xXRH2
z$P+y-`*`iZMRA=rN)7et1}093W8bnFFovIn?+l~*V+ga`C3(|8cC$D(febH at sHN$9
zc#taof}#2sDlO$GSqd_BCo9C0D3FItGVvcMb4xmH_26kuDv9nSbj7th8c<?E52Bqc
zogJ1$4xXl6ry~*XVD4&|7e%yjz8C6}l|L0mm>dZ6K#|?@-}7ZR-B6oqg`VLh^3tKE
zj%~TZ0k-9cwTiq1Qg~CH$qLVRrk}VDc_b}ykj<qv+d6mfG1TM`p6WbShq~)88=$8$
zkQ)B{7usqc^Q&J0SIs7F<v*cT%NZ{*&>p-E;DLLn*UNz%5Or;CL>|r0DsHA*G>VYr
zc#h1aCcwcSn;7|qZ-wJEYQcM$T;`=2){KBlyN4-55Vf<yZ{k_ur8BJj(u_SB0S3}F
zfA^kT#2HP_69A*;g6=U3FsU8hV^oPJBoR_F{e{%<-DyZWgt1}7u-{|MKMcQSY4}?R
zI?N5Ixx}9!GxHdsrR4^HK`wbnlUKFdfkL4YMHjv&XwwXk`GFq6Y)kF3T$^c;OD1HH
znV#IhHY|g at LfgOF5s)!%4}JS|pf+4`4Tbtqk{Fg%P)-@#&cj#)3?M}>04fzzcAGSp
zUrlCVyUxwzp{5-v at XQRjfI=JsE&;6w)X+R?rlmvtB^_`D<^lA<kcg`t=p7APjH{&3
zCY)Qp2Q52OF}9ylKES$!W`j<Xbt+Ts?c>9KHO9F><dZN?JsMWeR(tmsfc`Gj=}8Lc
zz5=mezs$sbv4rdHFF|io;huSDt9Bv-rR1(Iy;tX}1Po00>$p#B#L^Y{StW at 88#RYn
zWDg}HysNmdnQr1Yk(nUtmI8k+^%|+kZMT#16qtFC27Ezq;7C`MWzz(sgD_<k-pB(x
zdhYJG>{|$QII{jO0jP1~Ips?IUGV(6_pW~Sbi_5>i)w&!w_Hv4WvRWpK>k3C>Aqf@
zCnC&~XJMY?uv^NW^>QxJoddc;OoxQN&$U^SgEPb?M!9$4oiR;N6Ob=TyL~HQ3}U?|
z=m%jsO9(ASFA%gCduTc<&njE*<>Z-Tx<di&sd1ra7}7w9SBEnGR~Z8n+`v)?_4|na
zjBdwsz4<$!Ue?(xQ1>d3K(j#ty^C5M=|EA6h(OsF3mZ#&Gx`nTo(PS|sfwQJVPwBX
zZ5dZ>H!mM#yh&%0zADJ&^I60!)Q|wT<~SCPK}mn{sm6w0Tfg4upc)i~2MGV at nyR9V
zoly3iv;p)?%@6OeMU~>cBteNs%)}Y?k#%fVL?}4R9q=|AsOO_DQI&v~B>>$`s1=pO
zQ=@7x;A6}f)^F=P6rKr}@Lc4f at Eq-I0a;W4+8RCH8<8=<hjQut#6|_wFhSZ+$>nEX
zlj#%6c6+DbzWSz5yfJk42<y8g;DVWKx`_6o596t#$9nP3r77r>rz<G=4>_KtM*mv+
zCE75S%K1x5>!`_>;Xl+^0I6O`Yms=F*s||x(QGv{>hxjD#-LZj5}}$U+12t10jTv8
zRO-?Zi3)XmBdITdUMzA5^v!|Gz5|rQ{YKdfR8S9kp at W#u>oEp8A-Q%3nKI(5B!sC6
zx}p6>StNw?tIxuhxZ}$V*3jd%BA(2a9wu>ZI+`_7X?=<EzM{TM19+dX#sTd%&0db9
zKO2!@9?zC7`Ez!>hi4b$l-3w|`eCc^EFtjETAw8hHLzB~k_`A?1Xyb$2D!=3=*|F@
zUOEA>Qd>(0h`2Kz>~_3F#Wv0Mn~!We?N~{Z=pjc6o$8oRr(tUO^brT034HulbSnJE
zz<)CQC&B+TUlD%k?*W;0Dp^LSk(D(0=rXjrrXK&t!EPtf84r~7r40Z-$ChjRv@>A@
zdqyhT7+;Zt3;k~+V-rGZuh^gDUsbjdaOAYYjeIG4d;13P3_3GyI at LpcOi&+l+X<*&
z#1R|b6nM*j?meP>6Z8a2#^7<jB6ohbd7_=0aU~O4c)Av_wax at 1ag%qpJO9YGws!zZ
z9Q6Ry7=Rk9z6H?!Ad4fKk7fTIlF&>Yf~#PuxQDp&m!?}q^{omU4WSJev@(|5N#i=s
zgDkR=TKyku_pbfbosUqab_Y*;qk_1*UqrngP>P5ZW{)X+)=cwBy<()0cGXHU$Y^aa
z)@>%h>q_fufKf$#pA1C)VBAY+CB0`vhBlm~$v)sj(A#($Vz!-`^(&}-7Sw)r+q=-3
zIrI?r)h(q|k2YvrCSOA%##VjTIyf3NycSm+)j?cu^v_i#b)QpUZYKg$QyxoRgT9f4
zXFxWKrgNaaGgTjaZ at KLqv^dBlTF+%`{bTYKK?((eRG>D}EcH?KZ~g~J1tUY>WI^A|
zhSAr<=<oM`tV+beRF~Z$S=)-JUbvIa_4hy;=5s)P$P3sqH=G}OvB25FpAMdN*0C{~
z4RTW(uijV_QZK86{_Xy`&@LOadU^0{c at 4Q8+d4INcm~j%jId9T!Z_n5`HsW&@|~^5
z7%yd7cUmcB1WL_nm->zBmZP9;Q{4H()1Wyi{<+wb0Pi~NFRT~ZKXlLf7yP*s`yOpi
z)pcz)bsk81)6r(ICIqn*v>LotdW*@O-%Ji$!Zn>4K=_H?;92AeAkk`2aSsh4`wBtF
z_ at zI=XCrZRCG~2awIpu at pH5TG8a)J0qk}Ghqu0c8Gy$~s-+_c+hJ0)IB5FB#tCn-6
z$6b*M+R4q$Jry}L=*<0SI!PmmeYSzP14`fB1HwHygx_^v- at 1Varzlt)Ia|MhRD&aR
zYjt0N!n?k}J>-g6G^FU9*>1fv+sn&Upm#{}T{YX at GQVkgNAFzASU^6Bc;85FWuAXW
zSDsGpFJDORC9%x&fH}9G<;oWjTvhln`V)b^y($S*5A|Ntox;bVH$L^D;pN>rC4RWj
z`@OQnSE6=yN6V?Q4t<s#3=H28aN%wt^a`aVLm=rx{vRnh_R!UPy%`|mn}Nqf4 at X1G
zXUp2n@%BCFRfVL}xxPXL<{mR0VD764;U3GR95;t^fW$BOO3>rghu^CY0o0ii=m@|^
zMTN&*N18<$&7WHjNGPeAA8xa3nuGyALEXcBVq}qnp^2?FS!`V{JWDeiF?1%R%>FPU
zKg;eOHqVQ(Hw(a{AbeG^IMV4fb&fg@@Fb2-$8-o&S_?+_SkV2(J#~Y;a5MEvZlFb9
zxX>c1uuUJn=d>+iuofuMQJ?Lrih<}K(1apf{iXLJRVXD)Yz;*Vad|G43e)9Ha%!ss
z?OUCKK3+SccPm=Gwyv_eV1nnDR}&ui136qF&sBdfi}l9V!cGg`^{6v=Hl5Lr^n9PG
z=tg=JcBKD%F$~9;?o4FUkD1RzIO2d4&V-r&^l(L|1;Sb-8X(5=JTZ>{M!p>`*4_#E
z+F`}C;e4Rx0Jp6e`S=Vg(D3DUhMe=i8K`j@^|`VruaKExE8ZC>mkkSYntThqTjX at P
z973a<q5aOwGvqS7CCcgrx|aiVZ$aDp)C`nw;gNDXv*JCO at xSjs2XlOZBaS4t#j1ze
ztp0QAp_&lDz_~wNxh25$MfL0bHSo5uCZt46^lJ<BYbCCx`wIQ<*9Va9w?)<UJ)Nzd
z-!Zc-c4>M&!QMcaOEc<;dZ>cX at 12A(9f<B at WoCfi^`lBc(b7B>XhMz at Ly|l>1SBv4
z>M1Ovi;z-y_0U^75`~tP;Tm~1VV|scM`reKRtJ$j!G8koskNQbcGOa6vWKDR{<D}b
z<8<3{YWDZEMRlYA70m$(3Nw!`0&cXBnvsTj763ieQzMy9$Z$9MAH#bgg6{^)T%uQC
ztB4smO#DQv at pNi2Ego4982;W5sNQldrANa^qpyh00*s8jvK=sT|8^JpQE^G*Clegc
z(Bv2|A+H_ht(5bWwifs=(k!z`BL{1MZW<5Eubl;oSPJ!@LNn23C-mPif=gfom$rQf
z<9Fi`2U1GApUfaE)wA&+yIha=!hw!?(9SSF4{*Q>jN0kc>3Cuc!W0N+#GE7?{Ik%f
zc%E#g|F<z8(qxpkylbJhH8s at w4AnK}f>!q1eI-P2-P9#rgjSLO at Ve<lCy`_dvw4*;
zN(>r5`x~?cMiBH;&=pBO(O=?^rqBZVn*U?}Z;_V;_;XX+fWr!R5aYKsb|!svP)GIt
z9{6=0)B?F0d`0y~Q{>c3od08)3DjV(P?M(=D9?wQN4{eLt~(l`!1td+&y*;JvA0jD
zo at V-cg6{<j at GeMpJ!nJgw)RvG5vl(gu6E=3Yqa1PKIvFbB%~3fnSd@<{xZ4Zf75A<
zF{rC?orHP*yXl^XkZwA7Vgqd<^jQY&0e!*h<_^MlADNL_y1xgQpWun@;Ss?8)0*|W
zK&~prF<OfFP!7Mm>2Plyt$dX*3Rf#p)sy3mk(twa^za1QP`{F1vjgpiTs3Gb1eh-{
z)oQ4ZFTcpFs at d@drbX4Ukh<uYMGe(4S`Bk?*T(-UK5 at 6B><)}MNl3tU=p$=(g#C6h
z&ucKFAhuVD4*xdZA1esd&jE8c%6|oGIc90BcM=0~&zrFh{UWZm^~LljU*qm8tmqwY
zcpCI$FV<%Gb%&K8oJgN$0YxI9H2H1)hjGfZAAIv;$YYV$gKiZ$;;sp4Yx8fYt9_N-
zc)x0B<c-<_WsG9;i>L*@Lfe&9w1m&07Mc1AVKgLc4W5^|$~fI<=V2p{-(@GMc#@$L
z<}FFR9b$hPzgLpyhL at B-ME>BPLubn%-6gIZ&e2A8$@s|r&kfqhX8QkAaFeV4)9~zf
z-`H&kkKu~a=EoFK8}q0ijQOq2ot|^h5;L~L{cDg7t)5c!K=54~`plh#0jq)67K1jk
z8dtlRYO;w${f!gcOikaV{#9BZm!p5{I)-dyZaSTa<A|I`gSB%wXGDTN7NJLPQbWfq
z5}}#|SrbA#awQ)i=62l(Pt;kW$_O2!QECXiRin4DI*Ft*i=ZV{Kvkp0&*xwX*o)u&
z7;#Sx)c{@z8=2frtmE_0Ke6!kyb?7re%O)<S~7y8XOWx3r}8y?;)btjT>lHXR)$9z
zMmIEiRMRlLV;aUnprhKn>^s?Snt<GZevFg?$3_ at iLL{`y at aB1L^qR+g&oVGCJdfk7
zIC2X0j^+iZd5mcyK<7$+j@}i$rm+#*kDiaHU76}D(X<YUsYY$1dBKGK5%PZwWn7yF
z_{Hr=7qq at P9XyS?mXq+)FX;MtCt=f-8BSsZsZvODCJN#O$G~;6zJrrF1y30y-Z4nT
z0jrk6cJSJ_iII^PZW%D+Z4Mn=M+T<o_zTOGD{_iv`Gk9<AhporBbC0Q60a`0n2-_l
zWV!1LdZ=!|;kIy&1`Fe$7L!A=@T)#xnf+P4On;>((`oeSK3(e>II+evu>Zxn<-KVG
ztDVMd!=Z;fS at mqoLZujTEI(1wch5l7 at U*fh$>Ny at yv^j9->vWPXnAs!Mf-mQ&`f=s
z2Moi;GFCF|pVzWT$?CgzV3uc&=l2qkj1r09J%1cc at En$iiLVKj at m?e3y55tui*H%1
z#FgnJ6TIJm at 92|IF_-a}0&&w=ni)&0b1P_R?v+!5!0Up``!Yt{-^%@q>B*s*i`4;F
zalkZv?UkLu+yt3Ofj5aSI+vf4J0kjf1B~Xos)=96_9{uZQg!4Veou8z*yq(qbATBU
zeOXJ>_Yl-Gm57ll_=X+iE;7=c^#s1^^Uc&wais*`!5cJfB5BKyaJT!4 at O~v*0|`;D
z+!OYTi%-pOvx(OcUAGRNX6ZRP4fo}M^ZdiPFQlFL1})C!<#FfwxN!o1T409TVMb-4
zCtI15(_p4$(rP9DOuk%@H?O}OW<+LwdQ*ALwl^Z+y&`XV|LyR<_L!xMgYY(x_9L~}
z8iz=X>YV(frc%(DL}G!j%KVq}xu#p7jX-2Wht>0rbRsNG)!yEOH;#z@`Mc)&|B81e
z%aT^M3$4|{-jBy`wS#&FZGutF&$?M0zrDk~5abMzB`_-kz%8#(X#nI;DtcCeCc6>W
zW3(CJ4tusmyFzF?$U>(~liQB_mq26JH7}_QkkaxY0=$UMg}&7Kf)?XyiDKwBhU*7!
zP&<XgGxS(T$9jr4Vu#Lc()=poE=50Z;S9~9p2>^qFJGE&Bx60o16Sah(34~&_R0P?
z$NE9*6>6Q_D>MUpWvN&%=Dz|xzrE7}uqrwu;dxtU6g=0U?HY_jR6pwX^SnotV`DaA
zxO<iAV(FJIo0okzdfYp5xCc$&LJ!WxGpDlKmnR#`cN4Ujt!vGOXF+QYy>I`bYkv0$
z$XsF1`_$lffP8IM=XtgWz{50quV|1;9sc*BW$}cERI8R6zR at lMA>)n`)Tr1+2A}dI
zdVYLy=V-LY=}L#^Prls&&r02g)C%EGFU5~WcjNBy^MogRMx!Cts6F>;&wbkSh0$o>
zjyvDuWUrDOh!`|qG|?^g(CA|C at c4+{Tsmk5&K^Ncj`%U}gXlB<i1R)x&VUC%``Y4?
z)E4h$<sUFhIFxD0!z3ZF^E4~>I--bJXRtGS^MJzMrY;*YQ#-URq5hW+8`%R`wHm*{
z6<+Pm0PS7`M-feY!B$Lw4iM9CWHI0ZI=XDII#4qx<IMpe+s&r-A at g3*&g|QTa|QkX
z*D?9i9z3V63-|N9v<E+HmEq}Y-C;`!)wLGGb60B#t*kc=ntTrYqTX1S4E>qF!~a^C
zTtJ}`P<nj2Az)JX22Ta;F2EkL$5lYTyyWUgv4=j*(&mr0Mjjr0bCTvWDm;I(+zT~{
zUi7cWQ#qi2qF)9hj4BVIsXYaxZw{qzvJc(`2w#9O2ErF1jFow(n=?CGSe@`1jZ^f_
z7G5Xo;TMo2=|*8Iwfg6x2Z288K-iL_O3fRq#gg!SL-ZBj>;p^sxPFVey3U}<0z63Z
zixl)d#wvybdFWk7yBB6J>PQn~yhYn9w*p6;;wv0XZqoxFOTd$rps~h57;z?gFbQ=z
z^?ZG{|J-0wn?*fTpW9|ey-?u?lP)Iv9Aqmso<{F&CiDY_+&6r~=FNLRI;a|_IOYc?
z>N*Rp&-)e)jICin&cnXKv0RU8cLr4{acwO6t{aY3;wEx=Cvv$oSodlkyR>~_pde?0
zw=O#~|INxlx~_bP{hE4dy3D%LU4^Pjd&*h153$GRXkG&1g|(3hZ1*g2612c&2Lgs?
zGQJeys|!H6?u4+%ljkI(`mlcw_HUjiJ^2#R at qulP34MH^79{eixWfdJKx{w<xuS8`
z$w>rVK;JmsYY6DPx-e`;$D==~D4;_onDupXsk*3KPYj);p6R3j`wszq1raIC#sI_w
zBWbjk#}T!HFa+vY*Bu=&kaT(%iKBNzM>k0gJNRBx;3=r%F2xowIG&@c9F*|rA;$3<
ztz4P`TyTa}g!UGXNVwJr`c(<NkD_lC2WYd)X%;n)Na`XgdiCKOC!rSEFb7g)2A*gE
z333U*;az&%U({ly08@*Ng<2W@^}ZtbHV?|475fsMGUg3s8 at 5Ow&>~mB2v4+F*b8~E
zPK%(oj7+-B(JWPUN!`Fd2E$`}LGz20QS30L at wZkF0~KFK^^Q22L+__MFK+kE2pGcS
zN6qS9r7WOB+sgqypeyHCQw2{A5b7L!XjpPXU(J>|fDa`y-$PlmAx^qs1e7EghjoD+
z`}1Jh{}kytRP+x1VD;Yv+a+NK=&At|X!BKc$C2B8v%Lniaid0cFO1`-LkTpi at r8hC
zXb03`EPco{Xpk7U3ADGL3fUC-oi<YHrC69{VO;2BppRYhd4TbfHr7O<Bo5ax<Ss~i
zK49$Twb-_y2%6cJ0Mf~#p>4h*4d>iC9^l;taPO8HbU4bhhV)J&y9V1qv)bxGTl&0Q
z7y2R)<Bh1$38Z^srK>C%#^To#Z#H<_JQ$03x+{$qwEgW!!r&|L_3rNDgE5}Ez`n+3
zF1~m%c2^;upz7~zOR7)vIlhfAzm+rxU}O_<WMA at RdHSUs7hgHpK*}$Yy&&tRI9O^7
zxJF2zTF#()T*;GZ{mY=2-GR7ZeTG^*%kVUeda3t*=#}E~q0mmm0 at nCdCd6fj92!<w
zmkDb&m`+QvW>Bx<axU~pg^pzJ<^wNkSTnow5=||?82UM2#X4$lOY%9!@Q7T)qp}B3
z-w6G99FM{{)b?AzqB`G<wj`RV;Sh|Sa=kWldB|ND#-C7r<t2h8EFB+5NpSJIGRJW#
zG!JK@=CuTV<7M{m9Vv)4+E at VA97#G-=F9Zz5IX>B0)_!g0Hof)KHyeaFjouOlAMV~
zLH%1>ng4;dCOq at mCa8znUTTZQxO#{(d=beUoEmTi(mR#~st18HIZGLxEDcRlblAH?
z(=H{_LokzDrG_o$^5;gslv$fV)&Z4sm$Rdv$xJKMxHSu;kULxF2)ik}e=gppNbdX=
zunIBgTaB*S&|rLSKv(f9$(G!iJbd#b;bp4F956aMnY7MVbe?6c^EHpRFv`%ACjU7Y
zZ<BgRCXjL${ND|5)@fL<D&X?JPxTjdj)i28O{&{v4}E_KbiZ9V_r39WT6LTr0gVxm
zCV}30wGHMK(j#v|m>S9Fi-}l7NW`-+dvr33C#9P1r3RRBdc5No_(6&iGgcRl)InX4
zZe?`x at U>hTx_UpzGy}o^3`&kFk_j@#jHZiTw!S~l(qG=q!}AtzN`6FBsa(uIM;LWc
zcP#1x4l76(CC!(iUtvCx=se5K7wbXly!oPb_u?ce7iHCAk-b^%FJp+lZ+<_wYkp%X
zdRPbEadCjFk5(ceb^&77DSC+g*8qC2p3{i_*P{na5TD&h`jQ8DwDa*DP&3qY_=WAa
z1{siwyBdjlo1I<ylozx}^;Y%aK5k$vR!9<=pbPcNVgbtk9ccNMVu3&D5T25>o9@|b
z_xXkY at czNM$L$QiO*?h$1>DHiEOgAkQ{gw=C2fU)f!IG}QD!0ZL&!n+m7Q6z%aiTZ
zW4^g50OJt|pVz)N!kE*;IqDaO7ixatd+a1@!@QWwpVp?H;iLwX;ydSi at i`Yyz|^Ly
zpE-$6k53-n5aRl$yZLs5x~s#G|A&r5*}L4!*>Lw4&yr)PSz%s>G0pBW0b_2^$JDRU
z3VwK=wr5Pp{QM*jDHJwtBBVz0^6j%^W;k^$Zw%g|gu6miKj;cuo$|&(rrjV3Zp&y%
z$E>k at QQ=YuA?Hz7X`dw#(J~s{VW<gB+=~>8<+9LI5)~}~fr|W5g93dcr)js>ev3JW
zjR<cTYu`D{VTpJ`r6%MHw~Ua>UbZ$BcebA{bXM_5dFqNs*@xF&sbPKdy~c37x)0)z
zkD7vA!BpBK6aN_;Eq^qO$UQh7xX!nCo&OB`E6SbHwHxFv?8ixvW?h2>(zhP1#4jsy
zmm-ekneLn4KC4Tgf7fLN{y%|sq~^y!Jm&Hzaw^_z2mR>9o9#NVjSPMb|DRBOuqnvc
z$?#X&Sy)$)<lpbeqxa;SKQ|T&rj)fpU9K$IB(p(H%bWXTJO1MPU-(5_D^y>0KMTK@
z)wHpkO99vKfs`o7^O2eszSk1w+okZWnd_dQUVG?hLN{Nzjxd_1Cq`9p>}B+N4tbWH
z_3a-a+HO-4!pNWM;BBJ$4|tYq()(fG3Vh2;e)3QGS&))#e$BT=-L1sCi{yL5clP|5
zv??PK-r9qfr!*tHvlN!lw3`pa at tf`erijo0?k{{RyXOOyxYX-?F?)ccUWI+hmAB=|
zKdDE4c)vK_F5c at MK;JwEl_~0{g&euxCT<PYNxc$f>Y{hAlw#P7`d)<l;^R<95$d?p
zw+6NCW$!k9<Vy7?(Oy2=73a;BNvGUd+qtcCPv`TUjlT3wiZzqgy=nA`b^1<MxSpL2
z;Sf at u1*q-$Q&+wRIwVLI5x0%?j+O at RYkVuz<@i3jB|i&NvLn{|)+h_$m!B&00KV%D
zV%x~|zgS(EntZ>lYHR3)DZSOwta{SPOR;$-N!XdOQ#@8XR_?RM1o-l2JDEa~e1Dy{
z*IPGV;vg5%XB at NcWICT8FWI*ObXhWTjuy)z(BhALMd8 at Xg0BekgmL6)E8d^Hvfm~}
zWT|N~101A$I0DChFQp*y!y7L%bmmAo^zF|foe8*r6Fx5M)ERiraQaU5%lcHHj8S3B
zvwYJnBIxZ8X?N-|XnS^T&Hxq}WF36{ggOKGjCs;r9P<F=&x2oojj*rbDx_?|6dCW%
z=+M4 at Qk`KZ)n~N$Z`2t$OGah@<<+U0hu_d^vTkH1q-*pz45?+IW|x;7#A~jTyO!a)
z1O9?N?-QFABDVaNFDy*Hzh%L`yL&U*w at G{Vklpit%S#QO3`}=#rW>SYnc%N=zuG-t
z5_V<moZW&q_ZZPObVuq=6OM`XIbxiIcd2ZKd+{4P>Y0|s8eLD;{Dg^eD%6)(XEY75
zaTI-Ki%uaUYGjND-cpLGBNbz-r0#>;PR%0gsB|hr=7Ac{fM+^93!wc?K(*eGc`9nD
zbKoh$EZ*QxQoU-uFBSU~(&u82T|S50$sYRCYcfBQi+vSz`wqB4P9PG at vd;y)D;F(a
zn1AOPBH$YLdxqnlc?!Mdcr)D~MbLuAYP{*a at diBI3sQ#!9KkGm)hB35$9exAJG;1F
znSx$6<kXI3>J$DwiqV<KMaik^6Y}(qW&Yzd1 at iQS?*>Nh8+3W&gJRPO>V=+>#!iWT
z;+qdL;T*>%DmIpN8PVd?|9yDX%y)p|%2{~b(E->FT2r3o$=BuOc*j=Dwi^0I{TsVw
zsl|3|=dp$s*BE`wgPiSv{hc-`<`y*#S1S8>`o%zkdiy`Oo))OjxR*}6d7&?E^rh1t
zMOT|@t0LX<-!)iMS2o+knEN#faP9qPz7;>HSu)g&9Qxo;y>%nCSgWWR!dM7}7L(9G
zN%$nl<?ds|V{F<1+TCwFrm+*dk2tHC<WuvVRhky~Ao8s6O^VcQXXaGPcj4J~C}}~*
zR?yiYE$d#nOwK?b5O{}#ww8i9e=(8o{CHZ{t+HL7sc`U2AL$QW>Lhh&9caWGTYv(9
zzGi2b-$QB-&LnEIK1X$9ZLEhjo|)8Ud_U`3F=7nKodjrJ{k~#%nJqi!J^bCb=52yA
zukN%@RF4#j#`|poQ0lbaG|It at fq7M((Xt8Y0eW2nc at 1hxCA{wk%KsT~=DWsfo)T_h
z=H;<cH`>J5+)1^-_a(j+8XkzPk`|`6769H#*t?yisVhty{z5z(yKeA2=oFai4?NzN
z)}J$yS@@isQFn&CLX0438=Wmorn<aP;=^3U)@!3PfbKG3y6gV2yL~6qEBW8=x4KRB
zcrW}Tz05!q)EDnzC-q<K5QS!HI at INSj6)u^S6eS8!1dYBGjQgCE_T6ALWw9P&bb-B
z1MTd!y-2?RSK3=lc4pou7;~DqG|(ALa_WetiIrP?g~<P*wUyA?6Jwlb{QacHm;YCu
z4P#Jg%Z at z-e1`-1)TD7-^4(h~St49d9q*=0c^WzASpjnwaqHvl)Fsl-T*(#FNr*Bi
z-O(Oj<sbtxRzBcl4M^iCw}nsWZ1F4s3|;BIsk=;ls(Xby-&+cE^^Lxaf%xIM#|^AV
zZbbhb&P;D%<1f1mtUzX?A4q4ScPZZ6eP*%3p<k%sDHD0KotfG5Cgsg`CT7osytXrG
zn3tUj6cYVTdTT-x-&mZPmMN3Iu{aYgQBdEaZZp+?0Q_Yy1zGE)!pkRsQXL1K>!_UZ
zC6Q=e685Loh6wjtXN`OujX0xs=S!mI;Z8zZCg|-&WC3O-g`@!Q_*nG;VSeJ(WXxaL
znL9rIitkSE7mEWRi(Qeca<{vQbP3O at r6or3eaGeQfobv?B at tq$2IA$@N*u&a4hZr)
zN)*J74 at 5w%Od#VJWN*JN-?VaVZk0%YBV=eJeIL!DE9gDG!m<rSNA<(!!<M9g$shG`
z<wN8x^>+0!w~2Pi#radqn}Ifo-6`trzEbxBq+)w%Cy_H=qu9<5c*wC|;o!LkARqP>
zp3=)Ydua4~7|9np$srfCdYJ|<2lBir+mX_BFCBw6i<bD(@f^uIq0cOL4Ma}Vu^Z}G
zBHyp=QansgYb92XVQK*AkKI?;Nj}hdkU!{@)BcMJe}+5ca?Kovu#%@)zCzre9+d&c
zYODj`a-us&F4bBz1?xa1<U^W#!ojSuO?;g}XQB at jJ2~_dWzpETdGKwK_HEKXeaphP
zV<rEvM^;K26lU)GO3WCPvWXfPuR+OYeJ!}}BWF}>B+=9xZYi{3mani+{XxIXk|pdH
z?ewi1EsjU6h3kZf|Fd+hcB7wawb-ehJcbzva}8Hh3_+LXUH=^|WO7abMbm72 at y?rG
zZ-3;zd_0+{`mvX_dk}Tuvzf>thdE954~6>C%5xsjpIwYP8@)kYbRGZciOQ2d at y@N4
z7%yRdS4~xFroUgN)@6QK*`IC%O<tBNF43*I&lpMBc5ieoBV`yZjn9T|m-bL$@BQU_
zNMz{Kz27OO`T}QW^fyul6+kWkit}`Va-Q~3ch at Webf#9UPs`s~m$}{b<?R0H#wxT(
zsu&_$ms~KCTfXu}O7p@{_r4A=*At5d)2P7=?0p?l5Mrv*JIMU8^pEFSMVtx8Q%+0|
zO0t{Q=D%2%X?rb1r79tEZ~LhzX=6j=-k{{NlHBzT<TNL(%jAXigw!|HyPT!b- at LXK
zC9<w4S(37ik&U07;9KiZyT|gPhS7o=*B!cIkH?%4`t$>aU3%H|nz2;?4yBW+7Gqiy
zHLs7FPv8n+nYS at TBK&R8t7#QgoR`wwr|@>>ideFYetEIl&YV9LsM&uEbY`xxVTifJ
zsz-w_2W<g)u)5>Up_;S2{5Cxfl-ezyuU#qk_*c4Sy9 at yybY{FuJ at 2-YB;-h;*U at Ch
zd^+8+jHY~B3nSVFICvdNq0`AqNYP#MI`eI<zY%2_yc;ysImq<(NYnF at zSZHa;nK#u
zq+XrWnwKOw@{+prgDh~ah+eOvgP1s=@6}5O@}@~udDEU|oOMxeI~$_)0ZwQjL@~Cf
zkgb%L9>$ZiuYqJ4JQ);^FOkXNY4n8SL28^VMKzLcK`rJ}nR%e!JwOe<G=CB=xUPp-
z>fr at 4rzGP!k>-bFlE_g8&ty7{Vi5O7;a5h9#Pg{#$>ple%@5Tx^%;jBavIGeGTXWk
zW!NCmU at yxzGu<$wP?Eb@?g1%n)<{KL<dto{qNYEo#khOxh$E860C^YVo|k$rq=97X
zOLLkeUf9HJM{m{W>$xLEeUi^+7PP0Zn<-n)vDN?sHQy{R_oa77^nF!6#O@><DR+>q
zALT{WE%wJDrO@(h(egxUc^)Hiq}(ZF1ID&5vopj#DW5DCL%!(tt>b&fj(VG*&%U;U
zGbwMITnKs7)Z6(SS3!VjD{gz*mmbhx0Lsr6w=dIZQb8cfmmZD>WO$24X*E#G=T!eJ
zzz^!$@ARclg4izG0AkU<g?Qa$h+5Ciraf&X05NUi7h$|C^br?`nRt`nEq3A!#y$`S
z^p;duNvO?GF at uCE7SYh&$HHFNYqt32PpZ?KGH{meW&ctqWBCyC at xQi`7Pv%g<yf1y
zhiet6YY(+WqMTl5z&vi=m)=%VH>>_ai`n^@a0#?@Bg&L*+wEj<rlO-J^oKII7{>U(
zq`I8cMsexC)I|?<dHP at LqV+=b4|+lPK`%`75PHhP9)doJhu+}fKZAxEziWRRXnFUf
z8oVd3 at THft%$kXmb6Wpc`Uap5Hv{%L5c?W&rSI>PzU!HkEB6PvKA4oNAE9 at fe%QWA
zzh6RrhxZ17{9hi<bqz-bvbC0EQM-mA;Z|h at qJhJw7bl7v9Yqwq+(h!(u5HrBWJ~D0
zL<Gy|GAnUy^T)wlj&(S;CARD20_nkI3*?CH_<Q>XDHZa()Un(jM+Y=0669GgGm;2-
zQtM(nZ0)xC0K$W>VmmH`YnwlH714NePk{OG#(%0Q3zAWXh8<C1xdqos{c)}m*DR?P
zcTCz!Djp^wE8ZYL{9C%CwO!@uZ6)Z_)4$gnJz@=O<f|--ej=WX9Nr&?X90xI{c%u(
zx$<(5SAK&%w`!3#v##&!^S=tEKMEA!7Kae}sIm0SBnlW{#wj4gQvI(21)Pd^9uG2!
z<Qn~hbfA5MFpSk^)=F8Ve6d#aWMIA`v*?vwDgGgi(0U>HpL=0op*BX)1K}Ahr}=IZ
z(BgBJFU`u4Sef^~s-%W{b8Hss1FU+lojLuI68}$gV*Hmj#i+G6Pqt$Y#DgEs70?pC
z4Mf88V*V3MzoX`NEw$Qh03P(m at e8dla;RZ2(wEk~p*_XB1f*=!$;EgE7jXx7m(&XZ
z22V(>DjkYEDEelg4JQ7|Mq}Q8&hhG`9Q?n{(Jo_-us?fc4&)RE^*!Ri%szG?9nS!J
z#c^#P`w6uG;D%HDcK|1h18m7e-N--EY7EC&h#ww{^APU<ImfYyE-Kr+wW0iFV$jA{
zl38DB{^OU=*(fRY<a)2a#`nT8m}8MX==+Lh8sZCF3j(geNNS)fd>P#-{ulgj^)mg@
zgORzUh2T8yGxuAi>=xpgI`$SB&_fL}dYAztwAgr3*LF+$okOfI!(rPRlB!7@)F`vO
zCUlZrNYW|?T?OG&eqnB7T(5DPI@;o!2_ukXBTR*M-+Gdp^RIRYB(b%g%%_&tr)>gL
z5i1b%jZ!+u`q!av+wdALdI_9#SH!!)mCN3JIhTmUc+qu6e~cb;9jlSkj#by<UXkFM
z9bmo`%P*1xvIx9cHz at mx!lPsphy<flLGQu4QQD$>Gsdtus?F9`3(_{=5cJ`0=)(nJ
z+!@rN904-<Y#hmpe6KVxWAaF9<EWn)#{_L0t^fbV at fik368i1zq_Ml<pU18vC7|=A
z2CCar26c^IS~OGxbzbFK06At1aWH;cKpr!~2u2O+a!LL82*%ajHEH~C_c@~%$8R+?
zzN3?+w&nD0-wdq=ICAf(uSg9rj_ZgGG|jswVHQx1;D^D2$#!Qrs;1i~+nw>R5Ki;r
z^Dq%B156&!q{ki4gOp>XM&GUMBB~p;lx34h+;deojX}5{@#1Q_FB5+Utce-0{NVRr
zjsH#-QDfhRfk?XT8djMe*0AcJZ>CbjFQSaLx|z%9X!@{Dx#`_Jnm*(L4e0B<`u<&x
z<)rK at -4FwKCG_hkPt$!xN&@9avWHy0B1-ct{S8jSnI+z68e)2@`c3tBHU3QrQa&%a
z|5;k<bHvJ2XCq`|Yo2FW>rH^cnX%B?3G8GPo#vH^)jVycHk|-mnK^zV0rarcd}H$y
zc4lL=_sYRz`FDSQt7mCG`}r#8eN05YX+fLZ<14%ZvU^(rEm0yrh{iNuVKFf!t|jc7
z0asgr%ut}g{w`lS-YF22nrdW=c0#Aeo8YdI=f=hmi=%)f$~U#HcPu2L=g!s*!m|)o
z3Na)#eCG<T2dTT!8m_5kgvWbHT&d(0V$h(>a&sf=aSzcUlEm0-n1joD$l<@*mW94<
z{Y0)3nut!wAx5Xb=>TGc!ogd_*sTK@)&^pR5`I`ps=J8xI0PyZk(&Do2RLUYXUxm1
z`@8G~?zTsXu*DEgnU?EFB9O!MpL(=O>pd|rtQaLRvC94I at nM{K*r$2Pb${>e!V}jp
ze at Fe_hdsC+mTW0d#{ydl)X~;jD`Z3cB&eT6B76rl&q)v-rndQz%hhUwK3VQ5UMo<x
zwV1?c9y}v3bS84T@!ZfiCq{TzfkvOEsH3<JET at jx=)De}CW2=3-_~YoZe9}0)7WdY
zX}n))kDCMfBjV|q#$AmKXZ28XXa3UE2bAmb=I%&#70V=lTE^yH7HHE`xsDp9dGLP>
zQZ}vPpQR`Rtwo-!4CWR*MGkKMM6aE*Eg1MtiIxiLs`%Z6Dc>EsLIg5P)=9D3csqG%
zp~BXR+I}pqkp1jnyLKNG(N=37bl&$hHyr8UwtmxxGRpnVD#q!&?^oO~=e*C0`KuuJ
zO^}-(a5}5_A4AU1fVNdQt8!L5s}`?<cQ5=_24N?pmpZFHC~>UY`U`C*Z;|ZPc7wT7
zGhm#us26BP3`jnSNTJKBNF>pbhzde<Ud@}pa3WfWGN!R#b$BjTeV|w{rUR9E05scF
zWg0+;RKKJKz?wfpU*D*hWpAxi{#@w&@W|te4fWzpI_d+UxppZR@!sUHpJ_bzihB~c
z_i*sRiJb|MNF#Q8dEe at Kycg3Oo>{<uC4bjNm&~+*)+k%}=P0Mmf at C)*m&J<O4I7Cz
zF_#?PVVfWN2k at s1I;-{R4|oAa7thK8wus{x4?GE=qmND88<2H&a^OB~?X$3{rdSk<
zKsufkaG^DpyTBU5p0C+<EEdxt-b37kI~Ip;omP1NqF8`*Qr$~75ed&hK#xqb6H{#W
z%wocbzA^_f>Opo$>rNsd<2V}_5j2fPX9GLiCvC6(oeRcvkDVAt$~kh!q%Tr^X&?<b
zeXIB91drpYkMWH6oO0gI#QfGCYE8A1XM-?)9C;9ZnW-BPlVtC9m#rbB?VP&^`U0)*
zlBV+(nMgu2Pcn#sEF!G@%-%Nt=g#~1Zve)B1DE8&W8lvlF^y!{$-oUzZgH_uNaY1m
zP;3;t`6 at EEn2@&7C@;6&rR2hQf9Vd|git_Q&9i at 7pv=?i_joxQYI1I5jHgBCMiy}D
zcP=G)_*QQOXxmmzKCbi?+CzUlVGq3=3o!Nre~O@@x<N6)+w)Kp7V1I#c{2JvA!_RO
zYDK at jTJ|bXD)j;_&sIejfl?k-M`h7rqZy70ng~3h;@g at _)xM%{IeAL!+)FIlezyJy
z*QfCtnD-W8GtHnz;bp?L-raf^;DAxhhH(O^9 at _i0ojh;$8WI0&#6o?k_E6I^c&lsp
zUh}3Cz&i+(jCZ>p#=EYl7z?s7hK^TA;x48SJuhbheW)uAm{QkX*=h58&>Ptbl1D5g
znPigv<S^+WG);~m>C~qFOwPcSP~h)2Xzx?#g9_6HfZ~WFb7i9b48m-*SckE}_#!RN
zYVlkx&S~*HEgq%CB`t2y;x;XA(c+~TABoiBWg}7erv7XsS6SqUqou(0Y<A`+cTiE8
z>wr3VVziqj7gF1v!upJNxo*88%6Jn>tdi`GY2>|A^DO%x<_SqgKZ;81cpGGbF*`F|
z&^#+<D!TAjFit>^>$4l}p0{n;P+z>++U$RcnqU-6lPGZ^&|&wO9el&q9&K*t;W at HZ
z?+{V4HJBWWNUrSdJ=vc?q6lH96Sl4TlB;8 at ojml1?yUB$c<P|Ot7TftPgZ?Eg!+wp
zk6dDu0S6CMLE|<+jhuoND1AIJIQCGnb$RR_7 at l}yhSc;)yzn^G=eUe_A4uw`OLA<c
z(!pb=BEnjpZ#CdC^*rt?1nQJRcq)O`VW4{SD>A54rr6o!3~y{Wor$1&&*SO_Jd^8r
z+)l0(C_40I7*2ycbD%$Y=#QEH?~y9bW7AIp^}U)8q3?iqVc1_I;IM<=Km_fMx3GNT
zJ#`iM+;So!hw~hSmO03BG8_8$cK=H}NI6!Xn*299tTa=7)PEyo)W7&|MBhHv|Hs+8
zfHzfTi{twwC-1a9Z3C22=t&<?9+m(FDs;kW8w$ZrCt_8Mj20jG7-vL^%G~klPJ0Rk
z1EOF-h8a at 9P-d8b{(3w3m}^>4iaP4(JtNK-s1<9QI8NG9s5O$`T01S^%>8};@B4rK
znzP?$o&8vkz1LoggwIi(=Nj%JaZ1X(u!^2iynzukvmIh%xD`)kL#s&*`2?ttZuAyL
zR0cT3fllUQVD$yMzBeCeieAINoup_m#1ARoL5V@!l?E>DQt<1-oL<*Edb{bs`C>pq
zl7^@hh`qQRW3q&Ci6ij+z+36DCeswV6#Njv7dq9E<j!|d4=nWC5_6;7KJ&o&wE~H|
zvxz|#i#cBJwYoFbe;@j-B!~u#vvN!9GhbZ(|5Xmpv(ZN^NE0qu+qz_c3+2W<P&?{_
zJ}H^i7;UXPIW9(;pY#2tdu?y}))U?BQq3EgRHPMqazidwvb3 at NuxHE*FWc)KAEWrK
zjN(`smtu$iC1{ZxZIQ!2+J!BLe+TM}*%w3E&GtzzE|<%TOR2tCq<XYxy#713AO9Kd
z%iDi;;0&H?qdz;DYhyY%(1UMO2!L;3uA{ET&BYGMvYVY&W4(TaDRG8R2r2E<_T=|!
z>}fc&LO+FXFWYTx%RagMt!0IGowdF1aIE7<zo%?{7ROE>ZNQsPM(KhYJmo|619i^$
zkxd>FoT&+d)R0X{+7y!JN+x+j>V9rO<^4QR7O1!Q2)FxNNX>8sh;3wH+LL5FT^4X0
zZJ_zo7;+Wgo294vwBHhQ0s{kAZ9_b3uRCjFGUBMukww|NO8yyJ^sw)ZLV&j_joee1
zc6Jv$Yp7I``tS|*U%hx{b<{)pG?B^@!^1ZylOl)tGOl>f^~c^?DbRQ*4@)(2O{FCh
zAHD%c32*UqXy7;L9aW2?P<8hC&g)CoJbVN2sZhUIy+ at C0uPHg0&gOEmGd at UzNwOs8
z(!1y;`|U5Dk-2X>6`pZzgRCqc)WQgyLF+P?Lxo0wlP5`RMmY9dzxNTe;fFC<YytcT
zJ-Q3NNB%kk*V^|s$X$*$2UuV4g8%1%>x>G7npxZ9gC_XmISsQVa&V#Du<~Tn@=%#F
zC2=ZUA&?6$p-w8J`~wc at sd!^!ccZlMAbIW?X&^bTa4xII9eiAxAm0jg-)lM(DuXYc
z<K?6sdE?<-b70M>8<XJ+l3><U+b7<<4$6I2EbLVkTeqTTavsk(bpK><Ux7?fBdo|X
z7v`MZ)luR>O_i?74Rl`h0h+=rKH}Fr4{e>t^EO3?p0ql7h<}ZD2UbS)>1YYf#mD27
z>m);>b-Us9_n>UDyCo&*+LWt3<NaKDe>7+G{Y&1-4btH2#A9t$)9zsM+exg~79!qk
z&GqfI8*VbA?It``l*P8-andTal%nlAVI4`rIn|+!JbQT=t_DTZ^f*3S>e$)4^?O_5
z&2$;G;=u1n++yvVBRoY3o%-u!x~4#+T!-E*uGYB4*=kxt)yhzi at 7dI+`i)0cjkx^l
zPV>d$6MBU&7M{?1+i^APFNv^f(Bkk5^B}|{&-p?jlh^Aj^n at Va%RF2JJChuO#SCv>
zJ!WV8rq!4d%JI!ZYrEtgss&zGdfNt6SQtHLzu9LfN$$M_9IoD;d!P%YGkAWEavaFK
zCJ1-i(+_+hPYW8MhE5iNYH7n~6*bU~hoN@?s}`q{1m5}H8UMannOQQc_o7840^;Hp
zL!tUW7t8`ZJU at pg#=GHZgy$FVG>zyP#ZL2;gZ#NIq1#7_s4k$4EJy9WYbg$_^x)VU
z-}lBpFGLPUJ-DWE4TnFVx&iLksZbu;h-%`BQF|TNWYTZuB-Z0 at YhpbDl>3#0Uh4(K
z8(*8DwZsbJ3RmXtv#-eA_n`qoEg$OPxAjaW^EANp$<QyjJgdV{Ch at ht=8mK&*P0v3
ziFsK3u67OXy#ki?z+b8F1p1%$Z{pWbp<|VFlVp%q2K5z&7k0Q(sdPqLtxk#ioU#NG
zpW0=Rh)Z8F{RL9VNhwmUWJu&T?Z-W<x(9JD07mOYNnK-*#2UR@|AOI~QahA?K)ccz
zO_L2;bSOO)NykW~D48U+WN0EykI1F2In*)iRzejigjCFk#~Zbgf^MnTP@#snbu8ZZ
zXP==>tGt66y(9d92e?-$cu(_*A3(p8=2`AWTU2K>_<owBBwzW0iSPv^Xp+(sur=KY
zGx27S?B_7Z1qQkPO73!{pTW&H+2lMW!k`weLhYJI3xFamP%I4UOoTH0Vz)R7b?R8W
zk8jli=Ysn}8FGHWAyA?j;nURAOpP#qjA7gIczg|;KkXG}LKx>#>e at lgQ4i25j_m+U
zZa&e^(dBseFywL_fR+S7LwLY|H^EawwP`!qY}AHrnC8XReiQBiCGKQb6o^6IO1^B9
znB+sqEp7M~f>tbnPk7L7%<UY>A8`Pu0Meqb9NsRH4X`3bD)EF0&Cgb?CyL~f3=Y93
z?QXAh(R;e``_df5Cww at yOVg)ykQZJ65%2lo+aS&Q;X?S${czFnN+^Ffl>Ql%#=13s
zxdDFHK+4U-z`Od^VxEJ1NTBZi;l=KCYV~mO+exU^=OhEu(f$ZL^YK1q;{qj_PDOo(
zfyoIkCj%2po`h6&RV`^~vN_4}mxeR#cUkX~$+2=OIZ1RqNRk_)YT&>$YXPe$>Q(R?
zt?x%$I+}=YSY7gq#sx5Q*H#N0Y1cH7 at S><kQT2PGoNSeya*Z<mf5{QiGQKj&y^+&X
z9n4;M)9_;odd*_m7?qQhAN?=2@*KH@(6vtP%b;={)D_;Jk=V0L>?Gb=>=3xW;7(#_
zsxsNVQLSh5>=7q->yyej;7~0X4?jV>;7hq%?>}WiKflb6P(;yuz&Fita=R}hpMUr-
zAlX^itV#Ekk1&m7%Q|Wt!(0xLvy9>{m at Udz2_7XT`S9+f?W_FWsj77#t<;brlyMrn
z_7!z^^<|?4ba+lWXah`}5`>ka5}3X5c(<q+S%~OYv-3p^?O|5Tzew0$PuMc2LBBaT
zF=11IeAAitFZ&1+fg2Y`HT_(2u)*qB7mq8GM$7-Tv-pR*2*ILJ-(Dc2lS9G3DW5wz
z!!Mojm*R?z?G#9(I|UZmER)Mmk$j?KK10U#3I6FMTi*WneS*((gMvKP?yrJxyYE+l
z9KYq|YvgzpYAix;QRppoUqW_iXMF~e9`;*fcr#_aRx;Xa#RqMj^QfNL?EBBQY=2Rw
z+DW>zM$9OG2fLcfM=D(^kog~!bB8?6_|VrwoN655AT3Wwqj}?kgcIuMEc7QuXGgw=
z-|OJNa7^0t7X^7-FP{&xUO$2BzA)`)UcfyQVxpY8owGmqvmIqMeC?s=a28r~Lmit#
z{lk+h*F6<G^vdv*%k#rCVm{m%7_B$yU+XzZ>`&b~^!JH1A@)YMu5aYfD=b}miw-qX
z+0Fv<C=+{?wMfxBF7ALHk&cwYGcO<oN=NbnWe|oOh?mM at pv)ogq@~m`j*ynI94Sx+
zIi8kMmLeuvfzqtKkpd`T4V3yy*9w$tDNU5X6nXYo41e21CIgBi)if9?FInB_#*=XS
z3hP7i=iT|e<E0!PcXv}Ho7qsT(vils<XOsBi$o{oHkzfpMn165YXv$G#`$|qJ72PP
zoHy?J|Iv;L<sEE?(azctUe2R;hH^VCt!U-bL}t_E%gZA5cu$O^&?HHy<0au~zHKV{
z;|dhT>R1aES6h(DXba=0D5c26&v$B2D%5@#t2 at Spo9R?`TRes814VeFHei4 at aDQ+)
zwjpyz=GZgyPKF)(io(-NW^J)`=n7Znz2V>Rsd`km1V$8jIWI_PqtwHJ)|{$IO1x!G
zg+?Mg;g(`-JJ&K7N(6ms786?L$)u&I0`dXx(w6x+M_+iJs7b~yv_P3LdV@$aoPNXx
zzvd%z at MZ*RvdH9!Eim_R|KR~Vss3(H%RKgcqooM_&dHzC;L+gG_CnRqYK{(U=Xy9{
zkeE<AMkZk;P$ZMU{KB-T>*&R!mxNlPhkt{AE=d2npjtL7dYM<Wa=wsGjIeG}@a__7
zoZ(xeo?`&x$M;hSTC)Y_^xWVe$>hkKUd_Iues0%uAs6b?vb8 at AZ!9qmWJ&W0S#;e^
z^QhJVR5Mf#JV=Jj3Fx^laauzgM5On^PP!V$PS{DbK*?u8d>({#>~{A~I at hA67P$-H
zStO&+yT$dJ-t<!An_J%83Z(@2Plf+9_)kyp4OExd>A>0PQ;!76Ix@{Z{npho*;D3o
zdd=Q~#&)+p_8s7PgmWfvv9se}y9muV`c^<5(WKQ-a~h#(u64A){=%)RN8Z{@Tc=Cv
zC}|UUnQ|5iY`BH0+SOit$hu9xy}k5(k!+jw{x at Ts%atAHps!xV0R~JZMd34zs(s#W
zRiEbImd2cJu6KmpAY-_}{<DLtP~ry~v?o+<H at y^vnY6Yo*is75_gr^#b6d&|*Rwrq
zws%8M*?<31w5fRX&QwaVW{RrnIihp#;S3=E->U$pMa0J7?qke~(?1ZBSUGA3UTpA8
z-CT#YUC&TUlMPzfRD5%$s>jir?=OY9klU<zPvj+HdT+8%8=NGGjpn8ut1lB?+SSPS
zrjs-(g3QlF>!oTwvpSi?+v4&x^tESp)zi+Inh&Vj+YWT(f0(Yh6Xd1M!*d~Lip<H=
zSe&8-8S at K}W+_xz??x-6vK405!*p|`8EB>!%gJl#W+!Ld92}^pG%I!@CLYqGCvr&=
zCZQh;`C(aw7B}QP|8Zz at 6O{dL)RVk91ar0w=WM{%Umwud*9C+IG4dz$@`9F at nElI<
zSchM0pZQX>hc9lPs_I=L3DjIoX<Y6i8X|Ug^^W(i>&fj+mo!;5ZP_x~O1qCXQs1|;
zqw0ROpLjn9_Ky$fhqIJkR_9)*^D(RQA=IHRLh`X59jlj)yO at bu0)+gw-NRlkV5^TS
z-LVdzS_P69+68eJ%&K-z=vo;o#ho0G|D>M0-X9~R#i?2q$)jA)(ms{!5JVUSz&A3m
zp43X$P at kua)KIazqIWV#j4I&ll8^dm*P?nKPfskW7xNa??jwt8vqVKFyhzBRyY`Sp
zYxaoVQm at B*zgO=)sC*tt4ko>Aj@%wO7fAtnd?(QVn_aW1COi=NYb03?N@}8Y#xI}6
zbCl8DFGk^G)@x6mSFHkm?U^51JW&bobt3QpLcFV|sBfWrTGs;heIon5+4jZoeQP$U
z{5SUG!`I~j2D(@7f|;L>-$-(yce{JFXuH$<x!0x)BcvTyAvOL#Al-tu=n^Nqcsec<
z^h*%1HArlnfcyF5orxO-)Hhu2x8ZmwgE(&hLy<sntUXv3D{B?2eKh`6dGGbj>gJA~
zI^Rji<a*~;KS$!S1J;{*L~2?-@<zO}A}Zdn>e9B8(tW!~)48^(yU(Gv+u?aF7g`=U
zJm6c}@+j~?S(0uStP5|}V13Bdb`JHvn57Lh+BR`=`o9MGQBS-b%=1pi=#K4=`5j~u
z`YQ*lIVYiiv}$9hOj)4`5_4oetoHn%`o{N({@6+tPmRa6^9L#LQh!?uv=fL9m7-6h
zufY+$q8c$qw?qy7TO)Tnxkq#GgoVVzOZts8*sgW0BbjJfMd2ZoA?uIWc%D&gsl#;8
zwo2s4kz+6m^E*;kkyN7SAV=)bLJm;@Wm2?FcHFZDxc?kA1^I)v$g4+e`-)t7XkU`j
zMLGIBs68bhqgA|s)ddtLy47_vNgf`Dw(MO?Nt)k^Hd^?6VgxLsk9zU`vbz9?Mm~CR
zQ<)d#G?MUQSaE6faVTl=TNV9)IXrXtCm4fOmW0+^+BK0FP?R#jrG_J2K<jnriKsC3
z$oaq%@cU(;w2(W}8?d{|sUAXofh8a{@FSHMwuQ<sB*{KmFWdxtL5{2q<jH&>U$#b#
z4P}8fNAEtm7S at lhe_O=mZA72#{YICaB>TNWE at hTv=r~s)$q3H`IyOGMxZe!V%<$a+
zaWXL@#B at pmMw-3I+DK3*BD^^5CSs!cAun2I88VMp`jgtSD~KUy6-j=KE{%GI>Zl%V
z?heWQ4MUsg^g-hV1LDv}+g&^<k!K46G1k*p^<^(r>Lsy-f30!A)M2Rbk-BYVlF-6i
z1fo}TYXu*Xd=T>yJ^IIf at O_{se`Zq7pV2-R%%L9xbu$N5+W;ef`%$m}_ at 5}%qdgkn
z@^e)@QM(N!2S)G_q)^2^ql$h`+qY$m;>={Km&Rq)$c}JPr-o_o`{nk1zueuaMA<1Y
zmymcU(q*TIc_d}`p_bEZ;0-iHAO2LOA*w~QcZp~>#FbAn(7MnuM-vx$2zU1-Qln?K
zK^kF>E)r7cH1uC^%!p?lXy+2GUE&>opgiZOSe(moUQU`L>YF~5tXsx4=D78Fmm<#u
z`6g$hsKhRtnmDv%!V6?l|JJHB@(AmLNANTi*2IHR<FS>;wuk at ZBxg>r6|~K at ix$9}
z*ORAcHLNd{ldG+x!73Fu2fffhFB`*4g3C|o&;oD27w}-Cf_rxvEUZ5w^(VD!4oa(p
zAUPsojrO_wPJ$GQYong64H4GHJ|e){SmT1Z-2e1|$%U=X3>U)OM!!<Y at Jxqi3a&!n
zLAZ{T_7rGC7#;_;ErN)?Z0I;BF>c#(CF3-Dy|l{90n){6U4FE0JIqZR5h9<|$8o=K
zw1x?5$YPp6One^E5-XX|F%C7on6)6l3hYTpPIL<k?I0`gd1H{=rKFCQ$-rm$%#{+$
zM@!V$jd^Dxvtf+Hm;Xj}ATO*6l~-s99#vQ*BAKFl9YiEY7U8G{>~eNs33 at FHe|l_n
z<e_b74}~17i9FPA80MJ23g#`|OCo<kt3v`XW3mXp=#8xgz5qf(9&nfzs)2tk{OiJ>
zx-2k{Rgs5~_5x3d{ENvog{UH~aACiRuJ%_7Q;61&Il3rn0>>{OL+H|Y%JDq(2O$$W
z)!!8;s_$knD at t4NobKu>m8Gah?v}ZMx=Zx~a<pM!6V>(`2Mu(~kQw^^AArTKU8lA0
z!8+ZC>oloDU$KtVdAlz^#a5{nS84nM%Q}J<y14seuwp)9YxE<u2nJLDebW9I)@T9l
ziH?i}rvon4y7h|+;920-Z_Xp*2wR_WS25M9=qZ at BHV`$CLrIk^SrmO|(0sH5(WynN
ztCwk~N^WP~kp6M)I&HW2 at VzB5E8{*mmCEl0JZwb1GMGD@<BWe-C38wX;N;2vZHJP_
z_!1%lPhulhZvpKfF2D;*drcW at C?~n}HH+5m;}@;p2V93Tc=EFZ{jQHY<FUCQpIo8f
zxHF!hdhI^~2o}dm83bzp0yFTsMv#;44dx760fHoeAkVE=W%-lH4yx_Z01W(g^reCP
zgPP=TojS at r==U at tE(xCl4nj~aRy`L#d-eU_4gAadNBJAPbr at cWRvJP-Zld9vQBR>e
zsZ)%Y3yo*@wd>BSd(~b}(a9=Be at FDG%YFQIt_khsPN@(?n_YEwUm^ToR-;d7i0wi9
z8vob{Jny2Q8FF3-8tlfizVP4e(^tLWu#vAqx3HW3kX9iWa#smk)9|Ek)j@~E{W5Vc
zRVEedG)F3S at F$_Y7v!L;cB{>`>uIUNr at 8@mcY@=27n$`5v~FD-<Xsx$st>ggE(z)?
ztAkp0*6{+!d3e6^!l>Q<9)tw%A=)RdIzxl7ihhF-B<>KN^<gTc?GLSZKP3S<a9n at 7
z2J$lixgQ`;oI{=+^=@wc-|h}GU-5ItG{t4nH*ZAx!M)<5P_A4f&7s<+jjh=OoRgcL
z3%r}dr<Rf1mB<dl3E6bYS2^&T{nAN)#Y+u+8ut#>;^l<=!o7|&oHDyNCidTkL6%MU
z{hM@)Voro+OjC4Y+S{ux;QcCB3Y{{19sFiP4GFOPluq at q0nZF@x9;2jWGT4+kR5p!
zc=fULjmm<uojXir2fU`T+(uLR3E5O#PdT at sndHvUPEWKu&;akw9?)PLZFfdJ7wgK@
zdrW2Ny8z$N`{`DC*vVyntE95h*;sn|S#l at dl?G^M3~1;Rv=P!y!hAf5zQGd~81T$x
z<blMAi(E5iO+i>UW=kPqK at jkTFGiT%z`RHtR!H_~v~_p8G8xAMPow%a`R1{ce?2?-
z*P!i>AX-7ay-+2d?-u*?2W at z}49`$tJ>AY^&(a>AcJ(DCc4lwm9Rm5>KK-@=dY>$#
zM+`i%Y!E{rQ%gKe4?jVJ;TE8zdjNujy{etQd55IRn}W~uobO8>(<Ei>d<X56jJ8vd
zu<^#AOJdL&!+U^6eS$aH3e&`MiW+`DC*|aJNq9qla=fpW2TBImDH)!~B^r5<=di|U
z9!hqz@?BV#pGPKqQ7+9lbG at qVYxrD}@kN=Gug6$v_nN-4?$SQ#N^9w(t)*OP%>eCu
z(d_{V9{XmYGMm{lDGFM`rSNPG3bF_kA$Juqe;D<&p|60YbdBtx%}&*%n-wE^^{Egc
z-)jDlu5qd|ukS=pkhi- at +~h^O1h*?FpYE{WUD6tmtV%uN2=Q=uq5~su8ymacmgYfN
z5eI0V?4ZU_`Hd%N#)ukd7migj(Tot>RZ*o-m9UfMrD<T*G!PE8A)VyOGeHAd)Ex6k
zPtPhTY`^=8=g-?@M|#mcAgSL!LPKTYVHsA=(@OxF@*dtp`ivu^-mY#tNDG*ao)aD`
zdXw{OqaK3vv+lV0tLuos^%25_`|G1}U-FeYZ=hAELG=aR8INkB>evbU at 6MvG*Zhho
z^vk7Zb`(!IIBJu0ty at l(t7N&j;y->dgA6aF9L#!)ECy}{xlv%h8G)O<S;}?83x{>c
zzrg=wW!$ihGJDNrBCJ?(csk|07A12ye>8QRGJZIFG;CFb;fau+r5K0Djiyajw8JTo
zmVvhOhxH^%C-!PUwjL*wZY at GeXOvk;ZGF7 at J{pHyE99=DlOb0Z*-L*{R!wT7>gva7
zTzHOJh8ik?3PDd-M1fn>zZX?u*vT39A2$zagc`2z?KJluv;I{x&4O9>wv(vOLn{xK
z6_Hx+{l1A_u4SUa`)0s%#t{FB;kcPj6V`Fz0Ttf)G*1M2eFEs?-m^j4#qMS!{w|`1
zey&X2Slg2avvM|S5LXS5jj(#gJbtgI2F!;ZEC}4{7F5&G2R)>_K}IzDAEQRORIYJy
zhWA6uWD&h1jPUlEZFyz6wAN=q?^CU+P9Aq2`I}{l8llErQ2LLULLOEme-o^lDNxtS
z6Y at 5288FY(8|4#<=wImMwylwKgDUyD$lkJ at v=+FQX>P)$Ge7n5%Z*ABtUTm#rj5QK
zkNNZ>>Q!<O$`nAEKaG0%X;4hEgwV3LZ^ZY(_?^3Yx`(@{o%$>D`m<13jQUZR_KNTK
z+b+<l{$rSq{btWR8w_s&?x?{33_!sLw#BHsK%MY`Rt5ME at 4h>L2h-XgJR1aQeAM4O
zjM&<;d9)VR%^JJGZK2D^96C+871F0h#slV<QI$@9dW;)k`aDs&LQv at iv_rbD-!mct
zEz<`x+1{JZxAZj6e0HW6rdcPQHdGK*W7Gq5HxtU66dlBYQii>k&Cz=FC$u(}2JIXx
zr3Sz&d8 at 4Il}^=!2LPWIb?VCQMh^>s^=HIRdZw1`gcxd&6$Hx0zTRyEi0=Yui`Y%3
zy%DvH`_F}P4!fJIgnk-3$xf<H0v|RG=zNiV#@S$*Xs$(1#{Qep;!}*s_XIvcN(43D
zV46|v{ws0;fcyUta}Xby^_2r=;O{&l_8T>NxR8U*)3s&u^|kfXHHQ|+B#_B(pvJ28
zWD`--Jg8guCr#B&<i6wD%5~B`kTz!Z at D5)|(*o3%Jv7m^ftGkZM<?=VQ%pCoX=pQW
zSVKd)DC!`=?D at txfPM@Xxf`{7C$CI#Q}tx3Ez{_0<($a;LnncwP$TDi^dw>~C+AHM
zstcd9>bm>-_~BCE>m0}-$2CgDXe}$7nJ}kV|5ZZ&-3k2P)mRPC?fXMz!@2N1a|3e%
zMd+C at P$YAK1&WyHci&>-ptJn+xTY=pIO0tBvS^*J1Zv;bv;fBS0cfj+9>NhRyB9G{
zVpL#N0 at r=ni2OjJj}v2q8ZuoDpv=MExomc7fVY}XwJ<-Yq6d-4Ui%^#wRxo0mj!qv
zi&- at gg;Y9?dAfQX*0VNYfk_c6$b165u#=r5$G`ud(R3cyX6!YYC`NXRLI?TNsT0zU
zDgVS>c6 at u^RnP7?uWn-2z1cZu$N|#fE*SlZ?&DPF5OrICyVOw~#v!&fw4(5?vv0hg
z$?u}*KgC#>W1To`v`>dzo9<b_2z$6BNShj7dbyhF>f at t1&xdYd`w3ETc}zSM>^a|C
z?px~9o|gDjVmke!U<rOVtijyKc*^;m?Yv*|S_2Z#fmGW8QhzG+FRWUa#hHbwbI(GL
z<OlUo7yZ^~{DPAtqaMK<of#lW?2_~0t?$8GSE0QqkRdrb4fWiimrBvYCt$uN=E3e)
zcoP}ci#Y~74BEDZuRI7}`Fd!@)zyJL<`H|Hcpi&u0wB4E*2-P=n<7gaNXC;yJlcPB
z;OOAd3zmAKf`1;*9OPW#Ny2tkVvBKJ$r_Ybh3!PkN?$lSbo3(dj({U$m(ZGaPzP89
zalS54s~7=`XcUwNG~J>^-pCBh8*$i8fYtfNT4qTXwRPBd0rWFslKnr<20db8rIu}I
ztVInSszWbWWEZWl+>I9T0Otq|$L-g<cQ_>d at 54DL=O$7cSI~;l^kd<iv9?FgJ2+-F
zq=Me**P$*k>fHd#$hX}&=y?xMQro3cGk-GHo!fU?r7g&JtNLzcH`uwVYGUYa?#ul&
zvvq$r?aNliy9-LyC%ziuTK7NyfV6VwP<Q_G*0%jao<75;>TbSI`<vA6y2gj8L+Nha
zKg2!fk;*2Vf36uzcnFMJbL)QoDCMZw{X6OTC-l;K-XPt}8~Rc!UkvhJ at O?>=L*TyP
zxBkw<Z#^nG_VFHITWP++C&K%m?e5sVhE_B_?0z`j<z5m$d%78@&u?R8J^3E%RbI*6
z>kw3R)Hytv2K^l1u0J*pRn?MKKYC8jjCw-L{L$5yiQXcRw~=1=nto7oFI|mRe;PQ?
zG&+rPgZ2G&(0`tO)u0;a)FfZSI~lwL^L9C>_NaiXHT9JBrtl&$^H%cq7dgG^>SswD
zr19&!zm(R$F=_WOp1Qg-_|Hc2*bLz0T9^H)i>;E6>*pG!?s96BtZ!sGIn6d)k0qS2
zwbM|tM%dh7l~;gV^;v_csOV?Z3A0HE8Y0O-9bj24l-N?Z-f9L+l{esVa$6o6;DW~I
zO5w}KHSK^LQ=ew!q>|D7S)a!Bi>G3{UsjTOPW<p&)po=iv5wV)>hJs1_|DaXR06p^
z+?3j_?Nk5um8KnNS65#1eXf(!v3J3n7IyL_rNYySYD9)rX_S8ge7DcZX}`jqbV6bx
z!%%9VXg;*6ZeQG%H{zi6W##%>e?@cNp=BU9YIcjzgV984&zFbK_d0+p&0BS8YeDhj
z`-n972GjA^TC(Q42-H at Wsr78-C^o7=j!DTF$t#=3*S6;N6!h_cBXgB}Z;mo)gh%Wv
z8|C1UEIIqg<ijse4O(G>{++ChPt-a1o1Po`%qoFoZp~@AO%~g7!+RJ<7{C1Y1U8QE
zN7?Q<60 at Qd*1MRthuC>@*s&;E7QLS>O6SQj&!SXbL@(xY&7u^UNY(=MFTIkA$iD#`
zz`^CLA-ro2(O2C^l3k?!tMJmu-w)o_#FY`sZErs^@ejL{l=qWgx-D|!86NKdDQfu5
z!xJF|`>&a4E`mH7`5SF-<X~2v`DCK7j+{A_4EUi!R!4lm-*Da>8NM;%lhKQ<S_Uo;
zV+oI(LIr+F<ZsLa*BSJ*cUl`Gezb|CjP4)g(JsFh_#kbt1gO42;n8+y;)ZGLAX at W0
z{hj|!ayQkJdDMWn49HE?)OM#_KH%w><ubHkE?Woc2I~7a!(4!Oev?Fl2Nwm?QA0s4
zm+y0OsjFDHi~^^dx-wy3>fi{3D}k#%c=}!1uJq#hF+06Nt)CrK+#&)cv+XPTLhKud
zIxO%^J!nI%AEy1k5x(G{q8SbCW?CoVgjay?ZK&x<9=0297soU`Zx=Bol=A`Rtoyf|
zb)g*poE}|YGI~mKnf>$J`iBkvBDa38);~W`EHlj#kn<hUI@&(q at sxY`j^xwW*02Aq
ztzU<7st%B32>tfo at _q|>^(=4yzvb-@<@Bo at MD4h2M*E-9`bJLndDWhL+CcA(%KhBF
ziCtWu79`Q&d$$0N`uU-LNL$pX?h^Yh`fYA~sDwd(J%fG$gMOZWzFTjwy{GT_@;3|m
zW^O+(?WF0-v_BhYUX%yvup#8Sz{|~pnnV5D&+q;=l6FT_&GqpsH`J5e-=0d3su7Y#
zLnB9*dDZ(KYwR1^d|}gI1GW-!4e2gu2Q~gVUR7gF)2Gn?NBu_s7K!6{uX at k1&vW{;
zyPs_o_s#7x^j)aDC#Y-NDwDK(2vICDX*0^!G+>EFOo)wcFX>l-6ucHSq}#Tpf#}C(
zAMV9)^aRa$huHw~acBYP+zurZZJn?aeDrKl9yuJrlTgV%y^0jhJ+}kW at _uOR1Z|d#
z+N!(XZu)~9Di42Bk{nqh6Z>tm&!ZmA>@NHDvp=&>pM9n{&0{D|Bl_Z0svpzb<u9SN
z(b<it8{()THv6ys;03IrLyWY?j%zVgj+QNH7w*ddwh%pH$t-BUM(UTC)y!QtqTS3*
zCE=GN)g at VxyBfKt#j58CuER6v)!W;l%mTc~d*4<H&}NzU9VO4bk=NM`v(FckiCiq`
z-l)+)?2KY`Z`5L_OVPMD>afIT#Uz7Z2|e$9U(vfa8hGzV3h&-%)O-Jm-&;&FRbx7E
zOWys1+*~hPRq88#F+_Xn>_)s3iTCmjmadL^iXnEFk4sqM3;_mujr{N5 at +#NJ?Jcg-
z5Dk1ut&$3F^UC6j9^VPC)gls8)AGi0i;bi}I31|q(3>9DJhI$A=?}82oUC%)MDB;4
zJv{roeaq}K_7`9jemVQI7hh=EY91h*B}%o8Ke33^Xw0Ephq^eQGmu=e4nlcE52204
zc@&>d6zAg24sV{f9mcBL$!#A7{#iY$ohJcIQF at mwh7Y&YwbZxBEe#;MGW$WnDLyr7
zeEYY$3)WBc-_Ub??>LA%fS#xFHj;)l!-suaeeXhO7(!<I%mDHIcoD~oi92l2n^8Q~
zI?Xfv<B{g4T{}oY*b4HMs`FBKedmxf{!J*D>|e*u at oKaxo~PVP6>gWF`EW!_v{2%`
z&ZyFLoO_jAP6>WS&}z;BDo8s?P31kfp9)mg5ias}c7Ch;8DtoPTc7&Ganj at fSvQED
zLHsuYPPRxZ8+d6Ywe0?xdsVsFf0O?sDHT!#YH4!1GaTcUqwZCXlz&YxH<pnC6Tq_1
zAz1n<U3B{oO5ETOAvKlM!!z=cx-wPLmJvOcm))+dygOqn#LXCg0!lntc_Y~XrPsS%
z^Y3*F^Y3=Mwm_LJP$mP*JP6$RL#!1I?$j%59O8;M60un(#a#^p({3W^RB&f>p?!eV
z(|A`ut-Z30h$dylsAcoY<D`t_nUpdI32izv?YR0?6?*=NOQfFM+aLnJo{##;mAeRP
z>oUIp-VY()=BlP#^>Z|?3?5fCIZj)fk|8x8dNjjDp5nqYl!?drS2dTHRi(u<AwSi<
zY6n1OF at apPN`w$^QuIA7RReKT84*mlM;!~=GqZQ#JaI{$S-$4hds;lc18p at e^}cT3
zOTK$rI$9hp4QPKfd at KF@>Mp(g!R#I3TP<pGL&Ew+!qO$gD at WstN8>*pjhBqZt48BL
zO6=xC%1>C_9?G>aUkLG65!cb0LT>h!;M_uW0PVueDoOps&_09b=%k?8SMM9wnZqQv
z9FWkAol|_bv}ZBQbs{9f`Ybr~!b?*mSBar<Q^`Y-2CVB4^~Cq-R=?d8$Z(R4_cF~&
zkg+I-XC-)d$w4%|E|8|kPO4*js1+_dtgKA`?cH2oc_%OD1l)m1{z;^ns$3vpRW?W(
zhp4hCYKN%#&>`qa%WV!p^I^;0G8>;~pA^Vw`qY(7DjRb{E-0%<C}h&j*#`rHZ=Pdz
z{KbT|3}FY=K)qgQ<ug1*b){4Bht at L2ZbppisS#hftA<Lxmsj`exn7O$mDT;4zx3$<
z4?$lsyBfv*e*3(DuzzAtU7y-r%wN|r-9N8WU1IpeP{Ms;*weAPzme<hwJ#0`UcF18
zm5u6<%eNl$8aXWGpM$qY02d`E at aJ<WKy4ZzRnKc=4&Q^e%-qH5%P?MdVGq)Fl>dOA
z?iybBc3v27mf3^F=-IV%e)#Fmd4M0kF6Q${XJO%iK&rcin~5H`=?W*ew2B5h^D#D@
ziEovI$`mN6S0>pfLLKoS at szqngoaB+9#fW}P7%8ytV5gIOVc~QD!v!Ws~zZ(0rlw6
zJGgXO!%mqV9OV+xb|%aym<M{aX$(D8KBgn*@R57IE5sX);XO3y66*HJTp&p<lT!kw
zfLTzJ$Kn66BiqwNsxPso#o=j$=Vh53NrJFRR?ABTks6Mqr1>b?W7WZbmO$ua+!F;k
z?R9vrfaj~BW!}%>`5H)48KLsfGLV0#uM#{K7g5Df244M;L*hs{XDsI#TX at 5jbbd6w
zV3n}>U}WKybR(0cHzsoAtL4YB^i_%U#<N$_Cyur=1KwN)Z`NPQ$-4T6`VEnyE9u!+
z(;LlDWA&AsoU1wXe_S9uUCEhxHOK3MIvcO#%nIl19`@Uu at k?L0*D+g|4kyW9<RqHw
z6FTmp)vVW2L(AYdEwl{gQfNEZqw?E&RXF1JUGm!^mhkJaB1 at SUx-OxXED+Xl=b1;k
zb=;T7%_EW^a9=@Ogm~|9GyF#2x0Y;x|3`&&s*B9i>u{+2xY<5&^(si&bsTNgJO!cW
zvApUMwrp8P{Kw7k`!?=ZgjR%>(P_Yi+2D)b04 at wx2fve;L!yPJuY{JtTlz|#Jf7lT
z(8Kqd>@&Kmiyu)L{g3$<7F)F{C;9$6yh(;qC4MFEBCl88M4O=X*YP`==f7 at z&4jy6
zRpsRAp1bhgILPX+uNElR(*QB_#+JY8Qlqzc*|VH9khn*_np6 at a*-QSLQ~_ at h-T+^t
zcZmEdJe3VC!&rC&#NDA4d at br|$T?1ub!XJ$s;$eTx_-_+9m?DIpN4LUHCLsPpFk@=
z#$EWyKZ-TKGY(QJuC)2^zqI*CXay_zO03yk%*}NdsBGakI<JGVCE9<+nupUMFY}u6
zPec7F*TlCe<KG?s&bW39+T(|^+po#{^}oF9H=z}==I6+$jD^~P`MqT^0 at Bu~U&7HF
z&@{Zq|FR&~?Q at a3eg5@<Qh#lr+`l2<@IM+@>VGUy;eR}^jHDAi@=&8TPbQ+R6nJJP
zykn9{2Om4K^x)%1DpXMJ$TIjf0A|+1(+E!kJWZ(ma`kR6a!~D4(9*fjgy)f+`Vozs
z!z6<vp|Y4K9O=pFO$r|m@>i^Jk|{SQp2DV>hqYjApOt9gUu$EFl!nWDRK1z}Tw-$D
zxCtk8?qZb@>!<BZv}4^G^CV7NZ%3<u70hFkFEkZf|DmTjmj8f#`t{y1y-UB%o|!i+
z5gPnWnJmFNE|bN5-vnBOoOrw~*LzGzi}#-yW)ea-ZzX1rm8?-u_CFPzRP`K5dRuhg
z&*>;ftm-WPlf#y<w7p$1y{{*nIxDCF38(^64PnXKF4U+eqgEGn`k!=?|49u?!VYy7
z>KiY4r%S?JL%9-tQL=F_0_u7rVjDKg;@@9jcJ}L!*B$p9r#Q!^Zh{$Y^e>EhK3EPR
z(+9<cDytrF_4T1;{>KJ56(Q+P&cw^5^e+Enu<kEnKYjampi&iV|8+0U-t_;(-<($w
zBVBj})^;bB#**J(_CJPk3}1d6)8tYo`FNt=CR@?gta}|hA-fIUYQ(o9lzT7Y-J8*z
zO27 at Ks-0vxpG#&t1hvBsvm?A~fJ1ATP|Gj|YXVZ^QF@>MF}jRF*@(L!xPKd8#-N<R
zpj^wKyz>W8{{9*$^DvDrbCQqV_S@(*XZ+$`IT!0(YyzlfIph6B{srN0WD at qtBr1pd
zkExyHtJ{Kxv3<4MKOD6ne}auk2}oL^s+I`H)Of?(y)F;EXZ-{?d<plXt5jTNxX%xC
z_QG$`yQ}IUmxh#tdmN$~Mh(KNSon^%Y`{Jmq7CXJ9}$7Hw)5=vdn=UK$VxmI^+5Rs
zVr$ihdypnU+C!lg7{k at C{&^xCfjOc6MIwwd17Z)4#YhZd>q0BS|HWv7RqhIuzS;1m
z{AT@|b#HnQVxTfVZ`I3Iz_+Qb`Z1~!{;xh2^b~i`dy!wuLE&DYBsJXm at PENKIUuD=
zs3GUxq>;;X8H@(`D03{-Gkz at eT|a~j*z4c+^9{rpxm;CGs;Cn+Ck=1W`yqEZmK**p
zT|o;d?y~)qX;Uq5Jqll}6R0{Herwbs{&Htpr{UdP&lx94qF8S4!q#loOTo~JD91wW
z at YOoj2l&+;iI`BMy4b3N_(|-+L>lY8w=fJXe}yMvZp!AS8{pFce2>!m#=c{?3gDZ@
z&hwJ+z2Eo1h#Yx^6V|D-;TPb;U+&B+)+_MYu-pq at A$;MNuRzxqTJZ{Z1-ft|hS0sj
zLHz3kbgv}J{v*5r!w4PpIpO{be+ at e3EBKeM5cGM3WAVZQ0`uozXYQA=VA8cSSK&i9
zcrBxn^9jVJxbw+0FW6W|xn8wweH*<Oad-a%&&6j)(JMjJlc31#%x<(~U!qhyE7gS<
z>GrR2{%OA)qfDdmuaGOiSYi%p!;o+ILCV)ayF3YtQVk-*<{)p-VqquEUrUHifN=fh
z<9epK6daL&C(#3jIM05+eE)~kAQ-k{pCC3c|0BE}xZ)y~G6(o1fqZg$7M|1L7xeO2
zM)Owl<F0g)^%rsbL7D730<x{acf>8`sAaDCf$ayCOTl!%4e&>`eNx+o at D|{lXSGAm
zl77Unxw|`geCn4lZ>0c#0(#W*p(uA2hhIbJ{{==LgJ|aHo0GR6+&8Nd?Q^MUaTDLE
zZhk<ygeUMYPRp3@<TK%QRGXMlW?keI<Nk`Vb?6-}w$HxyF`z#n8CG0YJ+kW3W<E4q
z7Q at e?E*a`BMJ53E-g-LaZM|<p)06EQpyb6(m8VUlhAfbQMaa;`=-b-x$4xxQ1HdJq
zw;II8xTm&}SVYn;2x=)%7AUod+;f7Ul_6dM|4S3J8GSDE;<Z at ZAwWG4_wfr7HJR^V
zkX8VaKB~ulV(0To3A!78z#*s>Ms5L`+X!@dTG$%AHm4Z)u+A%a+w8w;+fcTF)Vk_v
z0pSTBoL2QBdLFf_&OIxa0+lcfzlgt1GUDXZX|hB-lB<^5TCP{paKv(63noJkN}VQF
zTaWsD=bnZ2ZSX%f+>o$u#vtq)h0&+a36~%w>Q)BhW_ma@!y%CB_<Q!>w{4KdWf7+B
zU=CW?tV@$g!0dlamH?8UN}4S6%{faJM;xJY9IfnDwA|wnJ)EZu at 5vogwLJwn2J{KQ
z1&NNmmD!bK?|cg0c^}<E-v~{$|Ez7pus{f%733NHJHpSSM&K_O`=2~kN3#Y!k*CAk
z=+y9FeOzWR1(E{EQPm(P<q at tbkLb1<x9Y2Sq7J+t-iBwTt=X0XB-x at SDgGyc7szsw
zFN$dvh5=)zyLJ+rr5?T6;yLM-<$)s0LEuny at C_^RPOpc6Y at 6dLN5~n}$zvX88RQWL
zIgVNhjM at z_Y7SCMR77&65vfx+yd_|0JRL9s)wzqLS)L;n%ZnskfIRd~B%fpNnZoW|
zC9qHpdxvSPXZWd+TP|=3K5h(8F$?W@|CCvCziVY at +UQEVlvrs?F0hp*cWA3&{jl|R
zK}OF|%(Jzp?3$U$^y=_EnqoHUTTrKt&CIJg*N at IjmPhJ|4rZcJr6!rdf}U{S)NWm`
z5wOxWhCc?`xMk5W&_kf9*S!!N52e#!rs|=uQ&jUvrj*;Fm*%wS_msP=4-uF>9|1>*
zHvo>~onViI`eC at z0BZw2t4b%2<C%i}X+J6RkXi>JEd<87-{UP6;5ll2>t4LukJbT3
z905776mJqj$z7=12Dq(}YD49Cs|s*Q9$vLXSOW`&p+1=v)Pb}=kLO78b4EoKn0I9E
za0XQoE6EUYiJpigqhq363Sk5Km2UYzg*nzAxeGWA;91oEBrQd>6y{kz)4uTdCbY~~
zRJ1O<E&PXF2losdS}xp3^)8O;{hcSwzIOxdzCX9L`^=5Y>g$eg^BInB_j;(|=)%M;
zWYpsu9pit+9KXWxVKV_R2aJF6HF-|}FJC>D%cldD!XCQ;dQ76V{Cd*9da#A`niHOK
zS&gUc(|<}}-ugq+BWwK&-5IKJ{>Oj=u;U0h1T(>NUf>Eu94X`<FHd3~1m-ZCm}9sj
z0przHUrb;QfMPmwzV1CL3t|wv31-IcA`^mUrUP-3@!sZy3=b5JOZYaSK|ddI1dGCZ
zh)6$q$JRQv+D7S#f~LoNX7o*0*+^#hn!fyYv3Z%xMzTIOZ$J2(S(S5%zIm2g0%}%@
zRE3>w&vw}0>u18(=a_3Hp+#>=CGE(g#&1&e?Abi(H;C;3`pVH}yh at -6sj{F?8zbQ}
zX!m|hx{Ij>>(Lt2K;6HuPtDfIEv@@;eGUURH7hr0Zp}vT+^yOD%s)EnjDLR)R$m?7
zEAv<fJZ(?$N2#gvnz7a8+ovze7?Z`&d(Jg^Q<+EO2LLx74o!>fWAwM{hZ5qj^D18A
zHz)9t&X&NaxMmL(_sC<`SXtg282#1sKFs6G>Fl1mALP!3+=9{EBFghO(b?4;m4Z6L
z)BNB#2TA=<nFuLjXIgbBrSGMU^@XmAS#doWnhN~oUI*bmR5T8v`cP4Y+yUEj`oNsu
z6uEes8E&RL-mzl$yAHx{cEIDxrO9{`iWtL-fo`SY9WQvM;|(v!)3ZDwyf}Oj?`}ml
z<ISyx9APJ!4D0+UvY(<vp(Ys)i9GC>9p5V(Aa9Ce9dR{G6Us>@tlvrKOG`*6<Kce-
zNP`p8o+reyKOTaT*$vmhuL!ADD4hePbD?yeN<)ZT>eZ&<6YXnGg`BCvJdz(MjXZ(&
z at K}jDFV9NgUg2~oH3Qn15h!iVcIA at ko#ru~p-d&$`bz^hd98s`z%(BN1+`#(uLf(w
zx?1KDWs;UcC&4%E>2Dm^GPw1^)ATJTciTO*D|lUai7T5f7|;(IE*OVQZRh$u?DmNg
z*(V2y4=}GTyd>I)zb+TakX6xo)F7nO(Khs;ex$MO+(pmDx{D1LH#s@?tH}NTq#G#D
zDYm<ODz?-k`pq(>?E?)LHeYDGuq9}|IuG?c%!*wwM-PUk`RDrk(ckR$yW~GKeJV9S
ze`}e>l2>UX*Ou2o`Bu6$G)?aEzC{lKKXD)66Ob;tjlDMk6(R0MZW`{p5WuWbDxlL`
zVuE&str#*x2 at T%a_rD at pxA6W!$(qdjFG$uD-hWY&lX(9nsVJF;Qb0=%@X9oIqiQNC
zht_U_*2<pc;b}V5FO`kQP@=W63H+h;(oN6vhX$pUzvT~IkXG*J4?$~_`9qha4O0 at W
z)gIuzocGVlA70*k(erZS#k!Zbz`TE?Eq<}y$<3G_OzqbU>Uf?`lBEm!Ap>wKklU}r
zQGu2Ib?hz7>(|Ij2X&YaxL|zjE#~#JR7Si0pVMrnK^45>#nN)cvt|kl9Y>#*SA1;p
z!o!qTG@~~#zWOS+Z~U0Wao_b<eT~r|p1{bs6N5VPv}xhxl(uXNxaj-ps~8(49NbwA
zTRSJCyuh75jheIZzUgEqS>WEI&IG!?sB=8-WQ<gHvb|T;#m?lbxLQH0CA!i5*W5tq
zwfMbL4ec^pu+I4JpT^T=XZ%}~9IPP!JFf2QM%JEQ%5<7;kgbR<d&3NtLG;k(B<UR6
zM;(kc1K<6+Ti}fCyjxJ2lxZyY2_+YwY2PT>xG#Cf5r=5}?=gw&jw2}V8sALpb;>zd
zGPUp8y-p}^Gj at b-!S{xbC<dT>K;P^$+cG4Mh`45*@!@Y}5ud-Ges!NY)*Q3acI?Hd
zr&`Ss_rvjIx;Ej#5a+w82Il+Mi2GvALG#*lj+`FHq$*RJ7xkw{9E#z6^VQxOSx%>h
z%5l#oGaK42qg}vdss=r6`_W_lHTe8c0-qa)0G~g=XzPq)bp+-N%sXA=X|$!wAx(QF
z(ckevYc_H>J*x1wzO2Z2zrNGedS}bi16+%DKqZxnL|$`v%hrxSXTT6J9yVGi)l}U>
zv|AnMcPH=;aHUX-*ziP=X1rS<mj>Dc9Tzxho=60=f at 7n43-J6<&)Baz?Ah90buY<r
z)Nll4k%_NDzlc|{fayl)aWh at ZDC9Kd3Z*cy-AVQ}Q{{8Y7h7|yEb()JI^{F8`WIUo
zZSYuW2fHbti*7n@{2?#IABMho;(}&K3)m$|N+%01oBQR;8mXl!jrbd+$WQPFY($Q#
zs?=l~^pla?Lk-g197sacM5-w#-L1l~nQWjM>25WKRb&d$N-I4WRv&AWR at PyNCo(0{
z%6bfIhc-*KEMF(pvRuFx^?Xztd3s29D!;0Z<n`<K&H>3o+;jbQZmU)zSrceQnV40(
z_r}%H%^y-#uc}e!rg77+H%WJAebU|8_ao_^46eGK#P=@i_cZ4B*VABBzqg{wLWENp
z{oHAFzq)-vzj|*eq|EE*wu<natr+$$-8!{u9N|Bhsc0HXPpKP9x1NGp<6s;$TeSc|
z8eJOI(5Wby3~hFD1+Ne3f;yJ66w|)_KT%ab;JI!tT30m~|2fJ;6Nh7ORlOMhQu%w;
zf%xB)&th*eU0s-$eT>JGX at bksodIt1YiQ+QXgZ#mA+L^FHc)a6@||UKNbRB8LlZw!
z`_H^<ElVY}z+dbA^8yBcQNRc^eL<&2R1>~RLk#{_e{ppxdFr`kfGJ+_ulK(!SvCCj
zGJo;DN1L7n+7|nN$wj8EV{#E%lY)|Sqg-MoT)qw at 9qa$jMVp$h;i6HBoy2x3GD6D$
z(^^KQsLav*3iGHGrD3}e5C#r&5Ovys%5Q-GN3UW*w9i*hUo{^B$%Up`M4I-hX{|t2
zAicDOBY2x0IHH&Bzi!)rUQfc?A~u(g7Eq4B7~*X;zp8ysP~9LYS%|SRUxjd~GCuq?
z+Tz1~ug*b5*U3VweSm`vR69Jo^Pl_yYI>$@^-CZHVab`S?yozif^<ARVgr7luv0`#
zKKy0p6lGFpqV1=tuX8fC6ud^}H=JYZ5qS5|425Cg%wKdG6?N4CyjzO+ye9*o)3W;&
z at t(AX(y)ZoqaCFnv=h#QlvfB)Ee`U`pK57CY5nHoW{Z!c9ybF|o(i};tx^hVp?o^@
z`%L$84)1!zW392^dm0w{CKenUUE>M{&wWhp1=+G}C#l67)v)F?o%+NrR*uygUdy1J
zp`6B3grNq!+cHo$Sbsr=ndu at X8g#o<*T^WQPZP2deCc#H18!h5VEOQMr<dYx9ncW3
zLo`Lk_VDiTCid`5U*j%czlN2W4rOenZ$h{HK)T`CndZ&?oZp6=Ki*sVew;^4?90{1
zPmc%AFe{kc{P>3;yX-qs$r1hNPMj5Gm(yCL#KTlkH7ub9+`UAZV{{hlIV*#6%IGfN
z#8Frua){=6S73c80jqg_Xa&k2(5HtOJ-a358QUejqo8#OYW?E5Qew9%{DemgmO10}
zl^%63kG!DrqtW|=BR=(r$aE4w3LeP`RI?jZ>qwqJNnT0izDI=vlneYv;8*-ylJV{p
ze-C%O2RPaVz4SFb5GsI~f!dx1<YG&*_C3lAG^3mARc{pozq-aFh&rK99)s_VeAF+)
zJSmRWzn_9 at m*45(60NE}X3|hXQktH)`{$854RTJxlO9S#)EGM%?u)!hC?V<-#0cvw
zi#p-$nIJbgNeUI5+|2KRFGh|uj~WLzUjTl1=IPxM&8JS9HPirQ`3o at X2Y5-?VZOY5
z2spluq at Z~~{f-{`PR~C=iZ4F}Qe|;t4gC^*!ttS=yL$N(S#ph{lGgwaJ&igex<4+t
z;Gr!}@=;CrsLa)SUMn8+MD*tI at KJ%%aO@=dK%;8BnSs2aGyc>+$3`I*yfO;)Bcf{#
z$w0plBU1ywMFoBe at jTfoJWKKdw;lc4RZWqY)F4U+X*xCHoyuTlxFwjuZgr0LZD{&M
zdm5=F#bq~nO}k^Cn5hv at h%R65)P+AjrH)KgRFOTAA+&m9>4KJWu01nkWBTiB&kWgF
z9TzJ1FNlDw5nhQ_pZ-<^a*F=i9r at UcxJtME%)Y*BKKvKK|3dg*5PK2$;V%2$bLWwU
z6so#_D!}i;&WXx=IcWdgxm^$|>JIjri#3_5pjMV-E8gAu{=b-K!U5a~h1Q at R)(TFN
zgPsZq&4(I7F~3(8G{QKDf4npD6X1>O=>aEq`FE`5H>~D-_+L0`w;H`-Cg?>MTWMJg
zn@$7_hxV=S=Pc|zNWyb at z~sr68j?z<;%<n4qQ4mN;ozUq6FT$5E?rr#xoo|P;dNvk
z{lvYIn?#7`d at uv32l4dOZ+g|-AVTQ;t7iBe1WdVuq$2(peBEzDsqUo+wAqE$sbb}x
zQW<Z4O+XLOhfaYMQtJ^TZ~D0gPLc`U?wUsR{x&C9eLt+VMZ;DnXB-zfdGkpcUr9(x
z_?ZT&68&7vr6qKkle at L4iF8iz%%D2|W4JC1<0B^<4Z+D&Pp7d~N- at VZn@*^YLvB<N
zTp9v2R;~$u-S0U#w=ItC(E1^@lYBU+d<>Wh?Mz8c*N2}7M`^Gfy#wfpKqKv0zVbuM
zD{q!2!bhVw=W)3HRj at 9}4qAh!E4SV*St!@EoSli$P99bTp%Ju0W%(Q0d7~cxCjT=3
ziG!+>Dj9fV+3)1^hG>0M9jimjO+K}U8{H8xUW)?~c5%XessqI6B#x6oKKyahl%VCH
z4R5 at B-_V%?GG;MwY`Rreq6eA2SkbQ?3$gnN{{QxWCwmm0Jt>{uwx1ehm_ at pG(0eyX
z*2F^S{8#nxTMW>21g%6Q#Z9|9MAXxzK__?1Kd!-cLXWC9d8^p89B%_(HieIZTnAr@
zXA$_ks!1?v<7?)BR>~rQHGV?heA5{%go>+SjlXN~TAQ3MEAhEAECaF?=7{JAIo`Mt
zHG8o?*lp;eDv_ at 5SoN>_L@}S=)3KC at w6!C at -t+pL*XI2?v&unIi9~zeOTrVAYLW6C
z6M%EU8{ox4Igym)cU2we8KAhSscFYM29N=I!XHNtM26Td-jQ%=J$=pg>fF75sVX7{
zVk2L at s|kM$9Fs~hzoTkTX6G<fP0LTCp2b(;kHfLin$KWA;%cDhU)96!moZ;#S(QpP
zldmC at s_s%v^N6GPos8WHS4{>9e^JklzN8;urLcYaodR8pJRRg;|8Myb$ft>X*9Kak
zQq%OPEQ at 76n@L`N%p59*x#6hv(G{?I`0#c`6 at D!;6#iJY0`E7)l}p4{6~NxZe!pVe
zpVX>icetm(Bmg;#=#F_KPlu02%`hA0gpb1SJVjV55LFZIH5CI-q{n at L@W%}j^b8*v
z0vcb+R}-DfLb57dp2h^n$;pWmvMM!K4;;b81_{rrs#IJv&l59pT9ET=k`6Nt_ed5w
ziFzj$algUGH`#+GYUpoBoQ`d}BQ(2Tb2+6+0*UA!z{N%AjKsGhv<NjqjIH9Gba;al
zJ_`I|D})xqJI4o&17=6^FKZfAz|YRvs;bg(vm>Y2*OkJ=odZ1oysbG^<G4I_kM=y(
zew$6yWHC^e>wEZyvR;jSVvSVnqa-ngQMuD_?Mwu2I2z?qwgWsyqMNJMlV0fko(SH?
zg!x=>9T3M-rhPR(T<Vzy&jsO9dY?ri3+3jf;%FnC7UhSY9^86ii<6rc8Q_~F|L&;9
z$=y6{$aKLVrR_6I;ttiIvBMlRZ4twz-ZcR8g3GsB1hOCs>zCQO3t9Gq^gEaQ4!+7p
z7QFj|dBgo2=1ml6-2splN`aG|U-cY$K3w{R6Gmb|w6RZ({?}0ByuljX0?_{{s+KlT
zGqeTym+isaesz=w==L>9s$61>Y6msXl(uC at 4N=ePrG%p at smQAx&<^RG<o%z7ORHZZ
zap>Cx(z<<V_`Olhb}rfwRReV{?Z?|*3uLvzN7dW8CK9bzI-`8`4ia<kILLhez+2NP
zma;*=eJ-rSF&VxYR^Rnhd-;Z at JBKF(HH`8tP at I_BKG`j#B;lzbqo74Smfj!9qJ7c1
zU5Xhg_IE!D4k$%lt7MfW{>G=`e=Tfk?3Vh5m6b at nM{DF^c}(wJcD3Z$VI{*E|JBny
z`aTP5e<9LkD4oRGKhMffzqUNn?s*Z{$hUVWGjLYQqQbMM6;Fo|hfr-(C6v<f7GkD)
zc2*pZ^)HWKUT1%?YoT&(U#UF}sCwqP^NN;*iy*wKxTemi{3UiOR*GlDE*~kWx{G+n
zFbi)14ydc0CzMW5R2~jbp^om3dVpgz4gfdv!C`pwc(=fA5<fyL^e1R#0&1Dt4SXKW
zen;!CY^uCPpq!$ExKS3nbE+rMIIKB0!+YM2!Vi9kf!iZ at 0RAlsAMHqEcsQk+kT=}=
zM&QMU#ips9>S61dq~Sss$9al|*ANq|xw$Z+xXQj{{glk4gm+@?30yr|--7xQAN&eh
z(2<*n1oEA_K7MBWumM|Q_?TBrO;znlFi*x2Q+*uL=K?l<ErE?=oxlSzOO7BfNva=k
zeY(Y?5);!CLs_scy;Fnd_s~W<VC~YV$HRGYLJk$$e!`t--KqINLp30o&roJTzW_(_
z^CyCQVVc#X=)>zfF{DRJ8&-p~Vc(_3X-$UJQ6lvs)wv$e49F6uPX*uf&vEcQ*MF!(
z4S~cRw=W)mc4s={XFmYmxg9v9cJzZ>(k!gPdtcFp at J{*j at cssoo?7y5TSjzKwS}TL
z`pqFnzs^Gd=Op~lmySy1kHb9Ebk at SJsdF8lM~v_M9IZG7AC!{wMCPr2ZJ|nhB{%`_
z^{he7-*rHX%==HSu7y!I_G>@Y?LPrwmBQ1{6&39!_mG9k{3susQ>`IVFh|9cOyFz0
zY48NxyRef-tEOZj;NXR-dq`&3Tb)mqT$an!e4dm_7BnsI$>~#FHaBq+$(XR4Dy9k|
zmJ`9eq1}k}%W7!e?qhP7qDFgafbAb$b*WwznjKUFw|I(Sbfifx?i-m?<-vHYZOf*c
zqrj{6{tE4dFn!yN%uY<%p;I*IuQ*nR`-t_MUNa-#N37&CCkg-lb<{G{o=9 at rRAwce
zY1xW`jr-?uGpxvOlyS(xBJbk)C*xqhQOsj|M3LWsoc7nzlc4E%PRza^p4du*6=5S1
z_fP+0fE6>zJhJeQOYjuDcjj?3bqYJwQ-Ckk(FbG-X=j<fD))dT)&cX=hV%0TJ7th*
z=tg{#`b+!tntSk6BC(&{u21Z6!%PLv{2LPURoh^N6gQ?++XT`yF=&nv%Fzxdmv>51
zlO(1Of}Xg4TWy7M1&v0?Z-?CD*XG7lz;hL-O3DAF>}}wps?rAVb3f*j0R|WimEsN{
zf*FEZp-tmu7|}78My1we-3`-Pt+q&Pt6j at 8aM3~WBQ>;gYfKw$-(I43$!KfcL9Os(
zwR*c-ZOw*MGz|MOpeE7e{GaE{fY$E&|NZ|ze%yP{opaB}bDr~job#OLnXoH=m-U!Q
zbW at YKjOZ<QQV%{Wo#s31cLMCj9GP<L+Ny>7iBpouU-NBKmi#v<rVkG`D7irIl0iNk
z*Va&K6*2n6>;X^0;|n*mG at u*Nnrik09X3-(Ml)wi>BvyUE!OJn*ykYc%FJf&A%7Xj
z*jZ#7TdyC-o5?KuZw_T1Pl4XnbtNTM>~;QHS%Cc82p0{+pV=xl%G5QK6VsTNni-wO
zgsk2Ul3E&lxMe{nP_YWhP`JcuDy7R at +}Gc!<NZGYx|ihpEoi?i!XA3o`E1*9UYQGd
ziy?1GbLlzsVUy_1#S3u>9ZwY#EBDojd7zb+nSG#N2Ygz3HvC8QJl|FUZQaK8SMDI!
zekTmg1wL16_IdiD*D0zMZKHfQ&_eX7*H(h78_V1JZ*)qAp^>%zM0yz4W!!|9ZCOo^
z+Y6VsIg1V71#hQXpuji8rJ+qrf>W<p$q&TsVVUfSbzplW7kT*-$kN3w&fWE$0Mgno
z1Gx(NXoMV!6<hK0KUu9iu~y^FqpgUiXaArTJDtTwNAPx4z~217w8a;<cc*7 at Z2609
zR-tC${{!;AH17N#OmMyMI!c!7!nJVq1n07SkxV{`?ceBd7i9TbXv2MRJGA9%S&JSB
z&PU61OuNPUD7<-eWSt1!Fv~pSuY>cipdiWd=lWiFo-m|^UaW;))T at Y7miia)8}z5Z
z-fjxsez_NMZz}xPi9Murwuh90-0B~byNn5p)L!00g1MRJ;+DV0*5AzEw~h7J`-?|b
zg#Y;>TkV?BIUZ#jhNWWwk`H&L_s>Z5`2_SSDbed0kp6SRR=6M6jc1?eF7*NVBsX+U
zc!M-A>s|E*RqpE3C^c_TXR#2fkfn(>d(-0)PqoD9s|$DoYW0`Sfs}>!=h4F&jt-Pw
zgD_3nF*@q;^pnB)QR-_vp#z;SA1w<$v4bA>Y;+EK;Bs;En>^BGy|m^S>ZReT=v(30
z4I5rJ?KuWoT87gcAeVmZl+62IDtn2#F{a6Kn#;V6=TcMa9=ImAHYIk)(Z6F6o+o48
z9WyBN?nn({17O%bO3>FJHH2p?0p(7&8{k!NuHl?Q4RroF!!W&a_xF}RfYxwT|LYdG
z;>w)-w~n~1g)tc4N>G|L|2L)iyZ!$IrI7<!O2CufScZF<v>UB3h3o*xoS+}W=!QPQ
z6=I<G*>Lp<QeuY_Mh-aJkrRnETcq)(;1%mmg~7S+Xt1q9b~J#NsTkjaRzP{bNBbd=
z-k60GK%QBb;rGcJ{QexrY$)>IvGtdZTDzCKDJfS1{(?XXp2FR2m&assWLoSy;3|;|
zo?xCgaDi)XTTrzwQZy~(K54w13vvwM at 8QLO4|#EG<m9n{A<0+fSw at r^%muQ+JLnDB
zUJW%b0x2t#8 at FeQQsZ7kokUs}t(GR5mJX2oka$AhDy!OR>1MIIARx2`n#~LNSS0wY
zJDti(nZKZ#OiTi4DL(|7fvTw{kWUZ!UTSXpco1-}+#`b=H-Xs^B%Mkcg~29hi<#bo
zJCq<-PFVOBDZm(dc!GuOBqS&u%I5C}$svVsf8xB_pGQami&SuwwV2- at U>>_>Z8_y4
zU#7b2Kni&!Qs0$M(Bq{AG})<itc&!F<Dpi*id_Bf=OFQ1-Dt&#raY7hQm63L<6f>u
z6B>)0?m|PbOuUN-d=cR;2zJA=JZ}Y^7<90_ at ZKBP_|C3Z20$gI^1=Y++{Lu4A+Tp*
zcYdEZz#o^@IsQkRbG$j-oqgZXHxHDO^jK_xOf}7IpA4&4r}a?&w^Q5m#26(Dt^&Pi
zkP!dM)>ZJH&<*}a<-shjIY+*zXhR|WAW)>0-l?rC)$`|h|D(r}e><OUz#Q_$o!XEV
zfA^-gaOy><udL+>?^*Sa(8IM0+_P6hAJ=}(ZJ_QtBJW+ at p8e5PzTY1)VBEf74(MB4
z>-5GPHTl4U{%P+T at jN@HX`Qa{(W7ZciO^_mes{t0STC;i2jcedUk9HBdiQlFdP<6?
zk at n!}ut%Iy%Bx6i*hw~P{5NGP{sI(PbQY&{qF+V!^_UT=b!Q~;<tgM0%H(+NJ0p<$
z4CY3ARod;bUY;o_e*-L8N`FB&U at T@L&<AlnvnwUOQ^ay~<6I)s>4R)GVjS%|UE~XG
zKq7gR$Gua~?zH|J{13axU14?9U&pc)pg*Bkav|toJ4CoIE3znunA)W<5Byio+LUtE
zmbm3pK3Z9 at b-v`$-{-KF%z&1#)-qp3ZuDBU*R#J3q`7Ey0d at I1`8+y)_jttTzB0FU
z-KSyMTkc*?@>-q%eI;X$p_>m~&wKz#-DQ2n{z!GH=Gu5vme^|lfWLjqik6R-4$yBy
zIaOuk($YclZRl$6ik96y&c1O~b$^P<8O?^Cvc8O-yuP%Jc`frcI-wksH{buGDuL>N
z%Agb(XmJ4zIFX3rGHOSS-d%!AdBV+yr~mPNy<j>`rU&BM7xpprEr5ZSt_RJl1adq@
z1fa!)`Cr?S;Egju%322!frqWYWsqX-{K-_v_Yj_%HBToG;n_gIg%6xk>PNx(s`Uil
znGN|KI-Uje{ybprBPi#PhcFL%TuSX9 at wmjk`8#k_T^L{usp8as1#buWLn4pk^5tla
z7g&vJ5;d;DQ-_JKV^`F;hShihYFxr<Tr*OmIsM8S%^6qLXdWB99pwt-JivuAm~4 at X
zI1`HgCmy6~FY}<dG-W3BJ5fiee=-_CDV}g-OrW at mqhi-}RX|_5U=o8gEOUdWL?Y8Q
z$Bd#CBzuWae6N(5C4MK9=s}S9$Py)feT5_~SYk~@i;)_?rc0!_)20KN-NIyc3!7PN
z*E(_TtNnPApH`UREA!UO2v=&}1hT^C-+_EF2WCch_~SM%{MjpS!E+?s;wht(!VmAK
zFM0iZt1)ih0~DLXQ`hdux;;xT`v2P_g(k)=h~jbWfs&ir%G!;=oGvkaC$~gRi@$F-
z(n*PTKT$_DjAd;Yqm*&m?(e^iz7@#w9X&c8C<yR=|Id%4q2zn~xKe=rY(M;qVseqz
zHNNQ}DQn^B at hII7?~lKQJw|C?sWF%EU;8~r#zrMl3%L4-kj6`7)`?^qfDy~>G9*S!
z6PE^G?nDn*QU1U+=37D2qvz`tkDM+}fRw4fBp~t}F{=Fj at xaS?++X^$2wDXpCX5?;
zTyw$%GiM2KM#AqoBJu=deuw`Ue0CTkz2(I1jfUm;DbK_?(OUlEh=l#R$tmf-LF~X2
zpvzC;xlhF0ku##f`SF>v{1oH^EhC;QE;;MJ9Z91csE=Z*--4$~{l#&axWkl?(p^kG
zhcXQ2;H|W#OU9Pa26Hig9`5 at r#pIO^6I|Os4mKTH=T754 at E5zSJZRxFX0h|7b?khp
zfagoGB(!ic<c&(A@$|$iC3z}!B{QmeU!);8cR+v^6haG%4cDR6uH?G7pM8Vl!1V^0
zZEvq9aSo%GN#v>Dm&g^_ at 9-D5JPhM^Hu^jvQLd#6r0N=SgSi+a>q!aUQE4Y~dRK%%
zil~TyMtHGdO8=+*jd(s)G+FYQO>Ak@!*-*;j(P?>Apbvxd(<eoeKRZm%QwG?dbSf0
zEiWWb=!lLGM(wQO?a1|<l6DsjxJkWiAGd;x^nV4x5zsz`91irMuZ|}%IX0B=gY;jj
zfckrQJ9?xY at Wk!VaD^(kw9#tb#(m+tK3v;%ZP?mXDAv-n>RPTOZj-kA+PH5^kZC3c
z at x15_7BhJyL4T8(4wiPDSs=t-R5PKZbLtpIo6_-JZ>yT3oV7rS?b*1;x?7B|M||0V
z>s74XOW9erACLAUo?gPN3^>ql3Rf%z9p$IYZ(V1gFuWTrOF&PVh_E?<UdC?- at S~9V
z>j-3)e=&*~Uogmg%6Pw&fJqLt*NV^>iS8Re^B(TQ-AUjucVFJ0gx0Lb9ZJOW6}J8v
zqb;?umU at Hp6RSdI?p%klmk+so*CP&h&17dWZxGYS8)yU5DT*9<q$>+%9Y at mGH#kDQ
z9k}-pL<<+Ts>r!aaXk{-39a-Z#8kcI!T7%Dms8{C8F$@*b>JzM_)68;+tnncdo)*8
zBG-Zu&*aE$fnrP;;ke)55mR-d53pAQGc|sqBESoD5=gfNRc4VKAF3i`Z8e#90X=L4
z2FOF)7ia#7bJG0+zXyHfAU^ODiJ at 9Ad>;PLA<|XO;&m}^O;3$?s=V+`pmy at 2^?C9l
z?`wcBFZ0(E-N$3#sm&Q7E1Gegs!g`qejJ>8X%Doq4J0SV*<!|_n^Yr+eJ>|gS=)kh
zEw$tosO?5vGYikTq=@^7sksV$cDb#>S8|$oqa1mYdAAwyZKKrmSAo?1doL#ghpN;N
zEsTJMw5u7=-}Yt>p8=0?AIpffUOJP|<IgK+8)8u7Hu8J6|19H<oJTsHJQ8USC6lz)
zxLrEh=lFmlv^?Ia#~42GRgUJC;MDjUJIFekt_rb=PVm`3a{QSG9;~nvO=I}|BqN|l
zXljm9q;M(ZFj|KJET at j{woe8s^+h$|^4UqC30+q+&k|R7QHGLAK@<KJolk$^ihZ3O
z(0wOR7rh6bC#l+z=O~-0-#Vc;*q_Vz at Pi#vwJf|FX2QQnjpv_y1|1&|9Lot8YYsow
zd?NT`d3k|8D7lvlUy1vuDLhBc5O4GlfTkZ|FYhGW58<DHJjNCkiH5(}%$ecJETbs;
z6#!m%u~+D0mOqzLM{yQU-p(V%^ahON0`uNfUCd-Yg_Lk#R8A)pS2NzAVhKru)T5CG
zm|<_wPQc+*!tpI#I_5KBMpqVmvjX1if>}1?evsb- at V&Z4?9#G(O5h)=HX=aH4+MtP
z+wdt?7x-Ltiz3xC=*|I*`&G3*)j`V1!@I88C7m)|A)EdTBs4K at 5pFXrX^k{8-oC4=
z7^Tmy>&SHSup(3!r<#;p$|Y7m`4&A}&m3->Q!3GsRZzpo%Hcmg`u;j-2iMGXcvKxq
zmt9O#xVRX-7{j<R-;WrBqgM=l>)uBTf=<2>bkQ*&DFwU*KabD?KheBJxW2!Oivjz7
z^>OH}uZErW35W8+O}+)ynSzGeT(OU8*&KKq_+G-g?L&5s`+vW|c$pn(VQWBWl++ at k
z!Tr|Yc9`=Tk{K|dufzC?Ge$&L|4_L-_D>weZ=UPApk9Ui0%}N!`%L9 at 2`|KBR3my&
zRdtu?+;<j?m<I9<$9V5tciy`5(AziN*Pw>d*6F^L@~+s&6T2qzw^D9Td5@=08sPjV
z{7teoS!^!%@;$WgDt}jXsVUueeOEqOU?U~$&sC)nNZx7dXP(KtWrH5|Gt}z-?Yw8~
z^KY2fhUdC8_&a>hPRL*Ut4A(c9df^;tM+jkrMvnd(8n;+aFEsCjIVj5JrKP0brawe
zX^>b<_GEkt7?6`RNX%Cr at c6HXm7dD&L`#jbaBxCm-=-|wPXotAMMgi<q?TUgitYU{
z;sFXQ5F75mb%q!njwI;tKf<g34?6xCM!NvK1!(hsjr*)YxryX at zBut-Vl+;N=Qv0r
zGB)j@{0z^Jfl4p38IVSYn|X_8vAn4HHMxX7>>$l~?w$2}y5g3J4s|SOmoEeD&Y-UV
z-G*zpRy5OBdbrBL7_)GS7LQWTGBwGvn7$n6bf8DH!E85^S16Bu(ZyO~^vE7-n-GuL
zUb&jQl<;AE5HM>B_RXiM6v*DN6|T<$1vg%?LumvERYW}Q7l>_Sm$LKrDl<SQbDpMp
zx4|@2+-0cV&FkSi9Y~)duOT|$T09Yp`mrLnZbbfB1!F_fxKQU*sQ13ORKp2F={{SF
zy-P52Tt8b?n at jH=D*C=}02rw%#mauMcAdxkfl?+*_IFL8+JyDN+rg<_*Qt3eWyf!3
zW$XD_<}_9&ey0KX^h11d#fC+Aevh3t_zPgiB!DWRe*oSDSN8T>HER@$mw+bZP%Y>y
z6Mi`iGf<0|zI&Z&WZ%8czI&Zf`c=4c1${dfEd$IjLfMCDVC3{vK=5e-qxf?t#eG@#
zK4Jq(Zf=(<2#H)u>Cz+bNSrlZ5uA##t)Q>TM5JT!e8wn^WK=2gp17D8ef9-zd1K`w
zJa0(q5u1Irmv at r`^|uAcS`YbYU|xdKTpF$tiK$wz*Z50;;;cz<zdHbCw*oByc_?5I
zGf4JvtzT>rZwDZQyplnT=tZhZM`HmO+7F`#ISSJG;AUnE61N1=4tNq{@ltT=0Ed<!
zz&Rx{<A_;ApL15yek7^Wh<m|+o9n_d!`&y<j4A+JwRgWc at yp}LtC);87?;~1kM5^k
zdS<(O$*OA5lDL}ahmk*D+zBoBLCf|1KZo%+#Kz+g^Kn}aJOE=uDv`$U`(125XGIoj
zE}Ds>a%DW7|Ghnl^vin^Fq*yWL`Uo!GV~XakF%V`n&P37_`9L6hfXEl%^aG<XOQtI
zEnPDGJfeHAa*!PN--xjZem*lW;flHz{h;o}!TE{O&J4YfDD5`D_!n`{n$5=-eAmPE
z`NSSf+%n)9q%WNslvJRNJLA*`=0q*`Rb?G%Zkt1Y;V(WEYeS3E11 at sit>M~p8i3EM
zJwk|o=A%Ioo?q+XL&DQ$JWncaqaB}1AyM9z$KmR!DAPkQ;u}K3#xGQ!b|XyLPEZHP
zXvO4JxJu-;cbN6@`-_17YHexeCvBX0C+I#rl|HwI3_aZ;9Y6r2?4NaXY1Jeb`BAuQ
zNHxYK at A7vO-U4FZlwXF1cIx+`qb>g4$fRAdTQn{KwHfG%8=<D13Hpzfy_-CugW}#1
z`%Mns4m>;u_n!T_w)*}}{*u5<;9WO{S3^5yFzunFKSdVU%wl`b=34aSlsFHh0l4ep
zcBMo8(dU_dEjuNXII8)`*j|%nWHc{^&};Gl$Mj&?S!~in3!cXaIaERoukC(lYZ<O^
zw5?Kdl=#yMB{%VOM?Bw<DV}RcAI~!cQXS at j9FHpjrw=$P+V``)4nLuV4s$^r@>$B^
zc`x*S<0f2Y-0#+gm*`yk%#~iJO#Zm5Eu2%mQv5O+Ncb5T8wG)qMQ32P<qi_}xs5$r
zxdzLCU*1cs1v~w72O9llgc9w6KxH~NMv?8~^GTyb1N2T>Uuu4qL^MMmzcxGkl>dhK
zT56=87E+hxIV!*}7yZ*Wcx0bmPv^-g1*QRwi<@00Yih}m5uR*r4dI9I-HmRP3m^}H
zJZKj>yU72mw)GKB|0X6!Y^KZ5KRU=>nfAiFWOo_Oe3cJKgIe)<!pU3#S1FPtS)=Ew
zbum3Dp^l|bP!8}j+v6IVCr%^!XEG|CB<1O+K?gEY-ct at Tm)0YBWF?!rU{;h3UGMKc
znlq^Noqc9;Wfe((rn<)$N+CQc>e9p2;VECb4Qkh at BGus6Ls$EHSebfOrWh|1%1I;B
z$dscg=d_}OBtNqhy at Wr#FOkEEIh at 5XW*$d*b6rCW^2%-pk&kAvnpt_zjPIe4Tg37(
zuOp+m4rGCJwi;@DdLyoXLs at 0$_xgxyX+#Kxl2A6lk+T=BT;eR|z6;*2+Da|g5dR^1
zk3u6FSM2^>N=-zA at 02py0O_5;vr-P!Rl7NJwVO|?b_*6JOZgO!nhp|kA$^fHsmb^b
z<L&@%`Y2U381<d*rJh5xBOd<^iZxOnA8F8!mbu8sJ#2O2ztH*vqbjxW%DiB?e<s;M
zL1?48N}ju&d0Eh-7lsi(3wRRDU*GB>63skfJ<t0(H?DxbqGqCJ=f*6GjAz4I>(SpI
z?&&fM>g2E-ezVJfysdi-w2WD+wmRZvQqDiWwakz9iT9l2ePwt8j4by#+!E2V=b!o(
zb}pjzxR2>BX$biiR-0p*PGO7n;6mTB<K|X5QP)+hE(@#6jCFnXnQD4<j;~A{B*Z)U
zU|G|xPyggKXQd_9JzDd;&ir%yUhe5E(9II3VC;swoK7?U24L?B^n4M|3%QIeSL*k2
zy$QKK!dxofDvy*3*nGK%>m5#7=YF0PAb&I?mjo>^@RM^q at KvDktcMHTIi%Q^wo!n&
zG2j0<)em|OJ?A1HtsUgrpYtsO{har52h+~+?nR_joJ07hv)pDOR0$HHuh6&9OTC;0
z-X2U-2Y=WPf!GW0UVvu>NBRL=B>CU_D{zqS&CB^<qzj-26)IXOp}(Dxw{l|q<s**0
z+&TW~eK6`a82 at y)8>qrw6IZ#POxwH4+xQ~qo%3`So`Cwdx~{bs{$k1x+LZnu+B607
z`QrIlqyyq!PUO~UmoW%6lP_J-BYs*@EG<}4vNcn-dTaboR!f|b#ZHf1+Rk*V)gvqM
z7~vK7^uJpb^<36{{6_R36MXgxZHUnE at pqV}HF5gw;JkGQxKpB^$J1nvG;bZ75oO0U
zetruVo}94Sw$cDQ$4j{M at MB^v$009>c%VmbVb5Uhn at 7){F>e|D#eTGE$UH8DC&zuI
zgD#udc@<h9VM$$@qIByut+i2#I%E-V&2Ggr9u%IgX)TU>Fo>_?#bZb~C63xByml<y
z6z4gYt;*TX8hZQw%5GS>bHr=+%ANQom_zo{2fuQLuH_Xvrm~(CIBPiSxGOWy{+rj1
z?Y1*rbuB<*EiDYXcVAk1p5xplbS<6NCqRuDZbG0!&<)T60_=E*)B!Cr9Q-zXAFgMN
z#MWjpEb at X*`?aqfbDB9y?{v&i>Oc+4B_*D<)ur5cpQbB`axTsqrh$Og#pM-YRKvX4
ztkg9WBhm<-M_Qc;-wlBguMyZUuKb7n;>w|40<I49C44;uogkx6cx%|F{b-2rOp3q2
zyqF9ioM0Tr^AgEFuDRPv_?9PB4RB&{2|TC6TQ<HdE^v6!X{_(@f2;5DczwwI(N9Q!
z3VOg0_mK$!sq%S}9p2QH1+x0Mu5m5fdL5y3%p1PV6^rS^4*|yL`jf at QbV@k%zJ?m{
z{6~!GF|mmw at rkenFb3`R@!hrICZ&dQZkaCW|Ft3?_(kjS*3+#gTF<nee0f3ZW at VY%
zOx%z at 3Eb%t$cAS4&wA+u^kd3PCtupjte?)>rgThDI<c>pUb7W-OrZHg=&PgMZiMoG
zXRaahnHSzp%m=wRgaqbemQv?fOCV=Fs)3u3d999kB>Jul+x;D-_Hp+ufZw+{rIc|X
zm6`Dw-$6PHC70opxK6jSgXUvIrD(<M6WuH9_jK2KWZD~EiC8qy1QLfEeJQy?@`!Bk
zbCLD#2I at xtEdyHWa?hrd`?vF{bWE=%ln*%PYCDO)^>1gt6)93Y6|XCz3qNq64097e
zD1Iuv>QFX6n~sGxeBm~4sR=qd_$8nftEEdL<Wk>Fz!7Vjzra1o`}9sp_u0q}B}?@L
z=ZEJ&st{7ey007-B`<h8wE8Z at eRmyc^UrMNT4xTY1k1t?Kn+o-VHwFK3(0iiIxv&J
zgO0)a9Au5Y!Yq~8QaUEgBV4K?yEAATv-YX+- at gC7^V$LL(`5&K+?{*Oy6|(lq|fXm
z<kNJK2oYWSY{L09Ko=%Q^c!n1rRMG5-kk%w;L7woBJ_#r+3;@sMooGu+{gCm6W{Xb
z)9Dm7<%+yK<jsJ0BIFeS2Ui03nnQ40R};5?CUu?P;38)y4QTx{&+9sMibP%ezlFwM
zr)m-E`-kCq3giHZB9Mzv<Vi<;9O_V3e)zx7YbnP|bc)+d-Tvb*%s+I;{#yn-JR#Rb
z>O1)G1CfS{iruiv3{bk0x`K{~Ay5q3{Zz!Vc-*IoOzBHvr3*#kx#xs_P<uq^e_g%G
zL2P=}f{{kyjmSnXc?l at Fsu69u;_pPF3QLHdSl~-2<?lX2|G0w&XjgBXQjK5~b-76Q
ztAKH?t}#5oq*}UU;sF}f<dUAxrek`_`h*@SG+_jDSItl at kWWbDyY2`1bffv^1s!oH
z0B at O(v5x6v;6`#BTks2aE}7 at guw;;HyY&9FfCx0{I#qz{lnROA#<<r#(YK>>VTRmi
z|8;k5#N(L at U+*P#9uA}mH=dLCNFdAUhv#9;u=G at F#&~{kPlMlG0bB#Z5;bHByh}&@
z)UuTt(W`T06P*-Z*<alDj at w7)h5unrrTNfKVCvM3F_U4$9#KfEf$T)D4%8K&QHTNf
z1hed#{_VKp3iYMHoJ#E!K|<w0OU>y7E$xyBP#HIh33DB}qz>o9s--Z}_Yf;_!3<30
zZ>1?P8;FC<(|6GDO3z%!K2p~XvK`Z|mjaG20_{VDxhDbrI2N2Ax6b(Pf1r2s at a!?<
z+D at S55f5A^!R#_anQ2gVdZZq(zVt%ldF5P#_%bz$TWJz{j0%+c%7^E<BQ(=IiHab-
zPNJF%n&B#pj|p${(%m$@|EcrhIl+7t#h9M@^tqHvzmf8g)>#fv-m-xTai2{f=Z_g3
z?fcp%W2E)b^fs2BQ?Z8-_fGosNblTZ$Rj>OGY6Q+RtrGZo77ka+Iqf=kP?vmv*RUr
zbTHBl38=x4Y`IrNuQ{vY at LB-yihsl1CW<7lnX|wZV|Tz;b)=4>1&<qk-K&a?vS+gT
zZuA{OqGgQEN}dYH<)d}<EMig6`Bffhk-FC=R}PZ8iiqLbB^T-W(p at ib^7(iyn+VLJ
z2>fA-J^4Y5_|cA$;(-6BZp2-VV)uSJum4hKo<dM|M7#iww-E4Zuz!2_AApAzig;+D
zQvhFt9xkK>{d_LWh8^mBz(PU6{j at tkcwInsY-LFou(Q(%gX%0|p^rjoHK70N;JNa+
z#shj!<3yGJHV?lA?65T-qgtnw^xuqDYw-=F+8C|YB8>)mZF3eUy$ae_dIBpEuKNM5
zE9l(zdzjtzge8RNks?PsqmGd|2VCi$_>65NZULh?Lral2?FQL&9@$23Ha8G1{1=R<
z8~$zjR;q=6-9^s=ci;}i+WO#uciOXY)wJ!XALb7{OMZ^dh53`hIG7H34&1e&0(=VP
z00!vLF7tP1TT9g0KWOVOV5aE+yS0b~Nbfo*&=DPe-y`+S$Cjvb*;Qh^>}n`2iIw(;
z))M?ehA&jh4 at zBmWvPs^TH!l@?L`hLB{jI0(|HF5pp;z;YDwl5U$?{8t46*)Py%`p
zD?uLRZJ?1N&3g;I=`q~10zC7>E5qm7tr*D=`6QIn#VBQkBaha#qoh5 at od%TA6wq$r
zT1^Vqnxg7091wYq+`-bRjEbXVh<4gPN<{jQ`;U70h7BE0bZmv0po6EJX0GFTRqL*!
zULWw~gEL_yL9b|7-!W;U9RAS3kyTD<UCb-@$dvP at ZogHw@_Bza2(3o%O81~uDZ>M3
zIXxS1dH>k&wfxgKjqe`|v~yn9W!nFDe2?)Ip+|;9Jk1C3oYz-#`b?v_qI7Z`V)yAm
zvp1q2OAqNxANl<r3!MzJJ}Exh#5 at 93^%kld0L^CjYx91_!?b3YZQ;iTxZsb?7W$(g
zMooOwZK0(H4JQpiHEJv~XrU|_x(_y~8fOkAUin}X&SHRhF393Jq7~zu0N0S{yhKdf
zNgMg_D-KD&%1Ho1d=F2{y|->pm5DLW0=gobwP?$AE1iUKK)(B5^fkmF)jgC3^A+X@
zT3fUmE<@#>f*{l2hM)ETBoQ{~#}V4zwmFX)?Bnk3a!RQ^Yz~j4z5trf&Z-Z0V2!|+
zmXmG15*W)8g+Q&lQ4_#1D&i%tJF>2S=|%cZNVFMh?*>_bT>38DhR+CNH_*(YbZL`q
zT<t2z-P|L=FZc9mdav&jddGx}EaxhGhq<dTH!p4JO$v#2zWa=-S9rYRZ%g98Jpt(s
zxNnF1yKrxU`(L1jjrR2J58=K8?jIH9NIUI0-G8-N&9~SJYww5jZb*Lu=^sJ*0Z8wG
z^v7`jEu>e&{aHwdY}VRUUcOrj2~g at sEUI!I^T?7ia at q#qX>*$Sd+mkyEM<GKg=`%+
zOeGuzfNu at 08}P)bm0yRl#sF9S2&XBUCT&&)kVohFw}bYjJ%Ok1E<`&qmMQMbuvL2r
zVX6 at 9XE*4!2j2O&{!N4aO at scWBiv&na32S7PXhk`9blJ?sn?0a{I33W3jNvy{aXe3
zn|sRO7liz60Qu`fNr}9x at Ga*50P@??p#NNVO}zjAe?~&lD*?ElKI~!eSaH~Qc<<ro
z5AQp?|L_Zk{f7 at 6K6v=W!@oQHUx#0+FaxhMdwM}fVX+hLTj7*7VmJqNmiTJzrm>^%
z_2C at F3ef08Z_l6n_H|N0bmUS>KtGDz%IgGAS_gQA!<mY0imwgCVQ9<hur*t4*L2v5
z(!2lAImf?YL9Sd5&#!lCZ4cHiw=Ju^OVz;Bo$#~*YeMdc{8Eu{6(7F8nSFn=l2eq^
z{l*cYhgZesW4m7I(S|ay96X-`aJx$t;JSjzkk at oLFlq~o>)(LGRWK{Xis;_zOkRsC
zhX5b+U_<Z(!_c2EYnedJ at Laibpx(nDS{I&G$&=Rj{;OC+k{W2`a^h#-{GRbhiOHq=
zX`OoxS?ON}oH}U~D!XCC_W)duA(cL_3^WEM?ljT4ZzJxAXF%gGq)Xf0xzNzR{enRA
zF%_3BBm8->H!Y<1=M3pyc;3rVsbi07^5=d|`cfJ;zMj>d-4J_WU;O>X{MaTrW32(C
z&wM6r0v{nI#6{(!BFd*Ad8E=*`U}SlZyhb?OX#egnvlV5C6D;u?_C}eo0qk|A3er&
zj&~d at ymjq&!@NiWXd1*^l6H>UcxUAda&`0=#<v8z)D8SZLhDuSrz5)Iz1@)d46Rq4
z=A;gLA*747Uj%QD9%})fYZWmH>hRU>4C3<vHzkjt{HG9$u<lapv_x#y`?@Z}?4<<7
zr>bdh!|BWXAQ0ykD at OS%t`Gocc^xBSRg=<;A8_`&_*`Ok7L(FMd6N1CUq>YO4kGt{
z*_U=jZj{UKhTIZAgL1 at 4bs)RGPxe#YndwD~x&sStlhcao&q~!^E}41q1Rh2USerhe
zlj!`QqiFS6>5L9f{hpQV&vysZta#~YH3GTLBd5cYdvU78Jr6LNqAWuT66LHa<L>sw
z&9uAgCg5DU-W7dpT at a|8EuP;Lfc!SdJ(*t)Z4 at bYT7z66TB2rDuN1WS{O!AHa`j4)
zS=2<|RCU!WdA%Yq-qENKHUDyN=Wm1FE+2_Jt0wdmtdULvZmF{y?p=bd9jzTlbPDr(
zHF;hv);7X(x{M<ubFUX6-2bGS1>-e3j`!|~kJn1QYL1Ukfo1f!Ha>%xhnKMLW?wm;
z>eVEJ$UtK|@Q$a<J2Nn{8J*cDAVu{%d#?qmnBINHuYDHZuV6ItJr>i3$CWD3_2PCw
zH at mnO{)jQ${WthuyDW1CG{70f>ZDkT?}k89IMQiIc<Dgf!fN~)ciy1(b`UXV6ZmdR
zS;v&6R>HZsKOX?eG8ocq<J at H3_GmrSS`XCWX_)2DRi=}csLZ^o$`~{GtGvD>#fo|u
z_V~UvBawdXzxm at ajMF3UZ`S)gGmjns%srr&GY*p0CV%~YzI9`l=p;!UKn>F}^q?(h
z06r6Kh73J=k at gV0GXIHb;tHZUoeUa~u`7w4fUO}nzpbVEp`*;la-dW=Kp>y()}!Q>
z{&ztyz`eD<;;bD_eG;4xoWmE8WZ at umm+;-%knnV|%5T&{pY{R=PV$B&fpYkMBb55g
z`tJNbL;t(BH1k5xD*`aTx>Y@<GxUjc59%2T^s0fN-xwB$@7vKD{~4T*F*0%O7$r>L
zR?qzLm`6){Z#zn2Gz<M2;g$7px(M1(*Hnzt+cl;C864BVG- at 1L?2#py1>MFzjdY&!
zXKxK%eP;ZyDJ;?MK#uRIBDp;@kLrizg`G6>oF`cBOpUdeQ;2wu1BokzXogMc95t2h
zA8%~#+*|<j=IA>xb3m`vF<-<W%ei8)-($R_KOQTUbfn5hV^40vkpnql4$7(?39qb`
zX3zvR$I%K0#v!~Iu<7Pb9rNt`I_^*bUFHCmzRv93k4t9Cq?)J80KyVT1$(>80K)G`
z8HB_48#$GKTHh^S0pXXN#oU%FAdKm4KwAUNAc>23_KVnW`r|R#Tw`dVrPd94IZdgN
zizUN$bE~oSID`96XmyHH;(i~TKU&UCD5o7y!@&F3aBZ?z8<KJ5Gp++~Js-X|oX=vp
znx?FFtgx8|=cw1>wOTKr#VEx+;*@)R+_UAqd3_VB^@fXT4*Q)5gErH-PtX?%?h-_4
z;_X-Li$%V&XE*ga`-JLD!{0<gHeI at 2{b!MI<}r){3RuA<O1AspX*-EWe at rsllMa($
zImWHBKXb-yfARjcN;frtoH7+-HYqZ_$0>6Y!a0^Tmuk&x=yjGgc#1w_hK)1-&LUoV
ztXU7&$CYfeI1CaLJbwo{SHpjuTm0sOcsX>4&Sm9HbFcU&5YBP$jGCaVEK41E(z1i>
zfd8E?V$ci~nCpZt_&=Ur$9)O^y*LWED;|CycS_>@<$%ucNva8ZqYJA#7tw!-C!t&<
zsk#eo4)?H?V<~{KB)8x=7_&xuIS1y&Zw`}hON)fVq$d!XrWlpHV3~U#;phR!ZFzN6
z=MeJh_TNW}iS^Lz{l6UWDAGW^+e}J*O at j@hnV1I at w@h%2x_G~1pmBfs!211SWP{Hd
z at q$!mxUU=J&bqxhdshV=Rd<n?dJ4}!x=3=pSWGr~BzG-Os!Mr;Vx+l9zkWFnV=x>w
z#XWyQx(1~0r|gBlT#F~`u$A_E50gD*_Kd^Cqa7}FP_d3q>fgLMYgV2muYa>AG;7k%
zy#9}7O=_0-Txzss{j1)aW4q>G^^i(}RD-92r5hk^g0#X?3Z#-D)yPtfwkiKw at B6j4
z%vSWT^_^PZx8YYV?Lix0c<<>c3+X`WvqL_QT{z6ae5C%zFlyQ-8v=YZKm)T+9wtRX
zR~EoC#ofS_%Uh(H1CN0QY52(4t{ZZaDx&{LQ?$4%>u(c4wnVR4eZ7ARjoDLThp+Gp
z`-H<proI~g&1U!tYZxkoCp}0rA`$ouYUBl)<mCcJ_>S55%6Dbf;3)>aDNgMo9*@=j
zU!(1?xa*)D4`tPm#niB%Dlidu>z at 7zr1T$M<GX1Kw=}ZuQlFq?M?2$szVD45`RV#T
zeoGl>@KzGH>Z|Xmr at 7v#GH)};M4K1wWNkkat%&=*Zxa=1xDx3g$PQPDD`>Jea5`ng
zYaNcHu;U6(+yx40Ej9zDRX$HFXTG2B85r?niF0xVd!{kz$Bm`>A8h8mTsk~OxHhHA
zOj7$r0%f>jdykWKG_^Mtn!MTJJ<&MN at j@22F}!OCO3zTZcujkzwK+#hf^v*l4m+C`
zcqcXdRhzT5_~ijQch5BM<k39c>1*g!(YJxJe$YA5S<J7nPdILNm`!!QTdFg)SF_zu
zVw&Kt;fa4nAOq&)XGp7I9x=)7mmdKB|7wu)UjSLhFo5x-zGM-jWQ+q!yD{3QlKTSC
zqVW43x$8z;%YoUg=dLFLz0nnWY7ue(n9E_1$O>giUqcp>Dj315s&YxRT5_AJ3uv0#
z%oCn)#%3;^P@}3(q?1 at 0u>M?7InpU&v|E&1;*pu+JA4Yy>|!Q#TB6e4lQe+dfu1c6
zFbe}Nx&LmrK=sYVN=0}^mj?3sDD$Be^+h=)FXB;*tdEfa4rJ3i&rU&nu)|%^$O8Fr
zSKDd5qNDk=!bM)N;QM%#7LPSf!y0JUwa~N2JhHoi+7N=i$1#q<OBX;!PWAHX0!dB0
zc at LgbDt8b)NO&gb6<pP1$dycu&1LC$w?RoOnH76`{9J-Zwt0GgqY#hvCDc`ab82W$
zNw+?f>3_Z1v3uHC(w6}vOz0%9G3fTs<SmpWFpKzSB1Y_b#oMiZ1tnEdgwQ778b69O
z0bft0RWJvaN46FTr{0TfvvIw at 0cq~q)1zKp5QD{hd*S{15np~RXET1q?5a<XV8{Kq
zC%A^>^2^Vef(~0+?{92e?e+@>FBkqx__r<Gd+5FNN2&l<cMBKUh~BaIJ5i at 0Td*`p
zEn{9;wuty9gI at -6+`C1&XVxN?0yj?T6+?QZ!oxYJzRs-(r=cv`aC$KHoOxq;%eEfA
zFL%(?Blk&A+MT_|P?qeYKCjfw5p(@REo8up^%Z5DY;eE8uY0yhE)n^Y!lkjQ1_YxY
zJBaro{9V;3B;s|yOsgVB7dQDZ?XKjx8-PdH2A&Ad_DImrHQ~K&W5YMu$ZNK?B>=6W
za1mUmDN@^br6O1kBbzo7^&>$6egyEFLRZ;uIrTn$F=z|7nPFtuIu_S<yIZ7UcsZ5W
zIsU11X{$m~>CajX_6eun4=;ybjp3UB=6`|QDRBP~?x}H^f={RVwra%ZfQjn+-EIpt
zhl_}Xh-M45_&L?owgkR6hnI(Mf-+aYmln9+1@|!^^NTcTAmxJLJ?)&p>_8)@_|&mQ
z!bwlUF5#lWi5X;5 at JB7g#eGy0&_J#;jYJhTZ1oUjFRl^LWwep%FKp^>iELK#6l0^r
z at L&O5Ipz!{;io`rn?IOLn=T{)K5)JF;mp7 at WAJ=`I&c8IH*+>a at BJ0PP$HXD!SWnU
zD#|_Sp}N5x;n|VxBmU_th+)bSqWNp1q*!65^26SN`bfioLUpuoFymbMYqQZi7yN5o
z+_iU-3_69n=qg2Uk+B;i+XvDIla&?Bo-NHqezz6lhYsrLTF^>?r*_Qm6p)%+Fbt%8
zY{5P&T<}N0m#z|lk9u>I@>Z`>*4osHeCn!ZAswz_22IA)AYivUo8As`>r_nh+4NeN
zckna}qf7XONBJr3S>jFtk`&QYkaQyNq+%oquNHWV6iT|GLulqY8s^0=H8P(Mr=v3R
zEhT`ls4-IOsgKb*1oR`WdN*glXP>4^wC_0e at u;u&ftH&Aj=w}$qF+>x>?B-tKpAX2
zw>~U2P|&wtJuCpnZ?KvERj+K8JunHUlT5|;a at NZ~E6P1gK(Y;`PbVgKImsj0)U2!k
z`GhlPki6F3;YTiIp=7mt2!63NuWh}nb-$&a at a9FtbTms@)_T^fBele8t|OD0Gxv7l
zEM8DcjNu*O=N8n;28A~ZBwy8=r^8iaUJO^h^{lP6sS&jQn+|80bBNiN(zO0$p52&l
z8QkC^mS4~;&@8gT#c>&KP<QB#{xL)#6C?F>GT at jpsI}P!=bRTWXo3#V<b`S<=Rluj
zXN%RFZA+Ur*cLQ-ZCOoCTh>yoCtvAym(YUE)@FXegCw5}#J(|~r#JEgl%z+<O=N(I
z=JOs%$1XwoPr_NMf#1aDvvSNvAm>F$X?6{HU&goIt>OUXyi?T=Z9j*4Dxschnwmh%
z--n)(;<4NT-cLj;_Z|hDFuQlq{|SHO)%6%E&ygngaw^CB<i8&9RQA8(A3QMqz?wtZ
z`=>`d`)5Sz_g^1rfSyi?C~&<l(g<9lG_oH0{ASRBQJSESCH at k)PGf5)#fk{9Yg7b;
zAf7{M+Td at 8s~7&8jwCG|AlAVhef+Sy&En3W3xaM1Y6i;9t72~wNJ+-l>&bK~18=N7
zP;y{3_c_rBM}dN#BN*dg3dkeZ9XO{*K!1g{#TVBr-Gdtjn#TN#5}4zhB}RG6Rw`It
z2CQzp=)Jg+wRRKCMAOC17q?v8dU4yuCqPq}vc$Y`HJz(q49gu<7d?%7eehX~z=rs~
zF!o&=(Ai#qSO!4soYLbqQ^`B2XKLj+?z6@`+q2NaTqOXIUT?b}pniXo7g{XCy$Ljy
z`#mz+u_HVcc2?jL^;FCw+*=6kA(->pjUba30?cQST!8t&foTWo4rTkVN4v*JJrTqW
zBtu*uJ`YzfNP{BWoBCHa#MnqYMKZ|l at Od^KXuth5JU7DgZ{c|lJg<l6XCoWn`dq{d
z*R$}x8{Rh|raqttS&7vRwfvea7Hp(JxY_?2nJ&yC<-$$4J18!Vc;Nao){>uNo#Gu4
z1@*f~Bid!Qh>`X3qP-%Nw&FkIfPY$IZ+n}6dKCfbf+w5WX3@!@r>+c^gDhw3)$|GG
z9Yky-3y;zTo`T^u{u!T>PzhQen(Ex?MDI6{9HN)4oai^oR$lZc$yPx;GNEmjLu{@)
zB>S6)1AfmjhzE at RTV!jxC|h;n5hG$)vxpc*ZRd6b-RClfoSV6Yr%9fA#xt1+!cBoW
z{xzU?m-`>?lzVl3qM|j!+l5CPjx>_totOh!GM(P-m|?DSmoz-$&-VXZHha+0LNA-^
z at otdK4Ps{&wq;x0 at 5=ml_ at 71Z?<5U!ShaXJU~8}~@s^y2mW20(w>HGiXCzv4$}<@_
zG-$?z2Fr1 at 0x3%)kY5}&1ATgq<dWyw#={)x-uXn(4Xv6L$blK~T(wuqhL&fsys0pE
zbK+})54?nX!6a9hMOOwL<^~u~R*EpItvdY1&L`X%4UdB~_AtKf)R7EfmX~WG?hIv*
z|J4(M;(+;g3(UXyt*`oD9o&If0pHqWt5qD_3H3e$?RlD|o`k1o2V4BVAKXQ90f%6=
z;!GXf4U&fF=>sV!Mnj~5ehj$%QCX)I=B>wym``#&5|#j^X$POGT0!&+KlkLkExMO0
z&%;;Cm6nLoHhwT8(ipkw&>fNWgO*6<peN!T91|HgSRdImIMyvFZ at BA}KMghvY>jM#
z8E=G{Z-N=0{PmX0^IDM=4raU#sDZ&nQue9(ikFCa^KGig?p4&dFjntIeZL6lRRAq<
zi_*`QxJc?zkm3K0evMGC(*nrZ#Ut|N16 at iUuE1h6KG5}Z8knAeu`eJ;Vx9JZZWxne
zwkd;if(}*VewGv<jDRj<q!lg at 1<6<oPyCiCjdF{t*+l2>d9Qm}p8;gPMzmkI|GMX3
z#H)_=cQ)VoR7Q7R-}wXNlvueh*6oqK<t<Nm1vON;k0eJlc<#5Ei!?%yN(VGOQr`vj
z&*6W-2uKU0b%PN-odjCOKZr<gj;!aWQWHGcBOCawG^JXK8LDZ_ at HtPr<YhL{nrWBH
z(<4fOVjOG&UT1(2mH?B3#7Sq1i(@fG3TXzk+pKPLZ2QvlB&d*(CZdb4r!GAQX*t9X
z<s6y~W9GqrhCkU)=v<%!(MSWpWGLuhx!@~V5RLeim=TM0bD=SDY)+J+m2=@&>$>d?
zF}tDGMkk5WW3iwEINL at S+5GFkc;;P at Bt6km6tIkpO6`51E%Da7(JqnNlq46Kz8Ylc
zB-CN1{|Tv6s2Fsuw~F}CZ04=l_~m}Uo9mXCo4kr_pSilmDf9mm&cQLI0lQ(f8Ki41
zO4qL&l?srnQ_xx|SRSv>Kf~WPLcNh+!Yqv-)f5JhY6^o91$2<Rp;cW$hrbvo;|xY6
zulLXBP3tpVp1Ti%R=K6i-yU=fllact*;4-ucAXB_8~xK>I0yF|Y>%!Eqf`+pBKw2^
z`}1dEj*DJMmq2ZhBV-o^F4vawhh$8*h=K9$9pWBpXscjSc?LYqV^1lw^1RUZP$@>N
z5`FNc4eop4e)H0E^*?cEh+QEKz~(P>u4- at +eu>SnI*e(j#4lmgD6;edDT6l61p0|`
z&Md&ZSpg%^i~)CsaDL|#kUKBvRt3z1u;|JfPJvRo!~5ZS)=9`CaPNV81n!@Md^iQ}
zU%>yD at ZSsnU%`J!ox}_LEc_1cH{q9Xx8av?zZt)TyB)uT`)vFg?lP7D_cAO6?hY&o
z?&WNk!mzpz=aqX0x292cZjJ51IrF(3!UzqLS)k|*NIIe)rQJHT9Tvq{tP*5qix7)}
zUeExufQ=rVOy?qA!WiZS9h=K=9%8fy^)L2WXXWNoN;i~#V^4QztSGFDS-4nC%v~2d
zVi+x5p!sNj+<X=!!aVftqlS<^V8l|u(PE%YnTXE;i;FaqKw8|RCgA-2ok=)D5$7M2
zfu|>-b!$n~MK=8-Fg89jOuwntC#A8y+;TH%_TpP}t*Hsqc*3=Lqk7e_h56|p<0~It
z>@KF6t$P%?^|!+{>BZCp={$2S&1-#X)JMOM$&<c7y03vxBWCx2M$aUpoSvzDNm1hF
zhz!!s3TC}MDpA2aGeBQTaIIZIdvLMH5h_ufwxXtugX``0e3_>RMLB101RA?Zkp?%o
zbJu2qWYt`>=<LkFCV1LhloPUFXn?0J at NU-NW_PY&DVlcn`T@|r2I?;;1Kxp+1Dgh#
z2eu4u9oRPTM1=%1+R9bMXSR2;viDH-*NrZc^xMEVw?L?U-0DoHr0K;|SKmv|M|$8i
zUsY=_gg3?T27OpGMLFDY;%1^vAEP0&;eYA~&3SMI%<_An2c^)a8;cw;7og>6k at bh<
zKo*t=<<E0UB8&C(z4UzBls_bg=Ul2{ZwujVF}%H9Ef^Y9^Ob=8&d_Y&OxG*Ci<lk)
zO><<#o1w;g2f3gFa!iH)Vl0uhT at v5_K`rkG=VQFhD5r2kX_w1D{)Ht(xTq(fj}o7N
zvFKf~*rt)Oi<TXlT~vM;dEiEc$I-DT9nPXX=R92|(2NRPB>58<*QxfW&!T at YyE?&U
zYihPlY1#~$&Xz4%im(6r4~#D~Ht+S`{erS<rMF_Q$D6NyZL>qJBFF{fseW4YJYe}j
zE*mY&0CyT`pi&^Ku}?})qPGX3xAzTl^d8%S!8z at JLJjNuBA8b<1O)6qwjm*JE~u{6
zX@;uc>DB}UrogzayaFQe^nCcHC_G1o8P7|61&s8{(J`0;W6nmlXj-TUYOa-cHcQZo
zclo^f3gj+lZz at U;6?G-`7KVgoJl9c(mI`)w7wz1FdqA3IE2dNvQfk#OiYE~$?LnBU
zgzZmZyq|}F&tQCl3L2o<!E&I;GMyc#)lf%8wK-<OsAw%FRa?E1H&hYIw~&Aa^F=*4
zsy0*8RvfADkHe36B--gSDCN-0+F&j~@pgRcn+EAM$}PcM+TB(7)x^F@%)ioP-wgZs
zkQ~hM$Vk`ht3ws4A^hXuJUYoYoz4yBLfb3injy9XW}po4D1({nC|VRMf9($7jWp=M
z8le0)ebW>d)F5?D_$se&9F_y6lm&Bpg^&p_XKTD9_@)bRV=H<uiAzcF<|91A9DFvA
z2_#8|9y1?siItyrJO{r2h{_Kyccu{{=8{c{qHz6xW2a-v*{OzqhJC=3MLZ2A){*4O
z)x^{Ld7oHaE6j)<t*+%XsQ0S^t^)KI^*=UL1lnW)d5)$o@{t?*?Mk=9SHOjz at ftsu
zLY6jX{~w2D4v3w}n9Hk^1yW-%6AP|1n9ZcB`Rrz^8fL$Bo9p<3=+O$w-{KaHOZp${
zFLH6GZ^z#nB`o{Pa(UmI;~SdXdB!EmmyXA?^2k=2ijh0Q7yIpA?koviL-lRWK at WU)
z2f2e<2D#7DE{K0k#WLJgpw(xw`Xyp9*OIEL?KB2bB-$|t)Xx??DeK8%zMyHMc?Y%w
zbPDdLUBaK$ubG#LK+$SRJ(G|z0Lp-SToLF6*yc`AAj!R&%0Y5(MFc41#pW#BDGa7+
zues)$e4=m->pM16?T|s?*<GWMj?K|dcB*4;wDWQg9poTaA at jFXxW!|KvVZ%Y$KZb6
zxWv6^lRP&-e%GG8fRgL|rCm%*x!}Qe)DibJsc(|pSj-P{-~~>#5|I6{#A-8#5$#M~
zL$k4Tv0zk_*wa3E(&CdMm1YP=%;|r`Ye2Z*cx<+A=9+udllZ<#Vvy+EPHa=oeUezE
z)q}*c0#6k+>(Sd5g)0c6(s#u!lC}-tu*pTt9|iJzdqYwj7MrJ(KD>v>=iVd$kCZ7>
z#$F?4kOrSlHNjm8cc^-}d)tXB!oA7I<L>?zJV8gOv=Mltk{$JJ2U6Or2~9|pxc2fs
zY<lK3#Af<eL-1K#`C?avT^reTed0V8p6~5$wC<uT(qdV4CT9uvqjeO_2s5wu&FR#H
zcM~)Huv6!E$QH#U3yQcau&1PjuhxsbMHy!vmva at d3V3v9mXa%%h{-LVwir(eEhHLX
zUQCAKGYoV3dD%>pTNWJG#^3q*XrO-q#=wrB8e(THD?mrBBQjdvRM*C);dcrrlPr@=
zXu4fEgC{R_;oFp&q3H<KE=w4__@%e;xNgk$IFcx6on)Rnm$<|klyi|6-cXGrw6V?%
z_&E*ejzh`DC>224j^KWV{oYgWd(da3?3UoWVzP;HpcBu7uXoT2YEZ1=bP8km!jsUN
zZFwfZgO}XP*V=JK)4W4_KijX6#9H_+03*E%y>+K{2eN&0-MPH!P)@l0;KFw4;B7ws
z;8^AzX*o}VQo?T3ye<ZkO%4^jsoST5=AU<PHOfGj^}Di6w|VO;*y^}k6vaqC0o->*
zpF{_33X5TO>BPaCKv%@4w;DEdc$JCl`A;29Sfg{B5DH2TlDEoPvo7|OwujPX-UocM
z<aC=sHgC!6kuX=EF(?fs$wGX0(D&<&oSGVxe7}w*;g{Y(Pry61A-4UDd`_Du^EPsD
z)<{Gpk4$^$(FVn1U{)uHOD5l(;|3P#M_0suwhiurhqx`2tJ+3m)w{)ioJm$RpfSGR
zWvOf+8MbBS-!<adAibK}(;L!anx%x^5Bi21B~|oH8a_Qd)bnX5bp$qaDFwZ!t^nZk
z8r{&a9`xjQ%un*yTJ9oAmWPOG%v;2WyQy(XkCE0J8a#Q2{zTTHH=N2l$$bppQ&}9*
zq-w8dR0Kx~$y1KDkXw(CJJoEs7FHkR#}q9;^=`FS&^S^u^VAGEMb!5~o<4EQkzH+Q
zLE{a;-BooL(eG+|TZ_N90Dn>CBH`4#y?meWoM%^?_fyC-9dz><k)%L&qj-jI<dgvI
zRkRn99E)k4eVofjHA=+=Pk6=!E?}S<`?yCUj86-=;@y0<rL;%i*9Us@@llMH at qCy<
zPA4_2r&?^Ks)eU4RiMY!?`9u8*<jyyvK}Od*>>U7dq}P9%TJxL?>MQref1AHpZoov
zoT;(1?J>tTT1QXFLIKx8da^>}{iT@#;ruiG9c*oE7F!#;iLH$>twI)e`%tskvo`2P
zU$^S#=&gp3`fCqm6S=++o(h!iXT%n%!6R;?COnhl(b0D>mKC#w$;2n1F2(f2>QcZA
z0k9>x=uW_sm7I=^iteQ7DN{P3x1EVNRG$N$q!tNh)?u8(%6-J}wgEA#OIzfy-ld94
zJ&Z(SgmbJWTzhsvds>4w9qw&J?-pt5C7UIMJZX8B>>P#NQlJJi+LwxUvXgEQe@>oE
zNKFph1NK-+P5rf`wtlkcqb5y&CIzlJlYLs)v{ao!IkcDiE{*NB5^8fkm^b8<j=CK*
zGY>hi<9>Z!xLK~F7v<&T!^U~)7{G<Jx6Q;{uR&V?S1baQNIBC3QXJs<f4wbuDi9Mq
z+IZVA4_npXBlU+qgO*Zg>Gka{dJpx|11y5uk?6wjWO~F?ev0wE^By)IT#&aNX2VnT
z?x5p5=gC9+8vAd6N9j2&XxJ+pYe-#l$g+bb1Dx%Ei%9 at et-@ObnyhLq%i$_u3<M>h
z-UM`|vqj%y4Bb%5YY61iRO|U1_+8IsFFi-(zAM(C>OO#4pQiJj#RT+3_3F|b4QV at 4
zYJEyC=ZMmt68{tOvfWbaE4wJjvVS at DUgh&7$yq~W$6c9R8&C6gz5-f2Pfws9sJ41n
z?A!mvHb&ozIy_~zEa=0%(1%RugBkizBi1RziIH5w&0V-xNmeOjSPF+dQkMw)VV7D1
z6uPF$OtPypvoShlw#qkije;58S{f*i)BtpFq~kSkPhNPGU(mrHv_ZO1DFAsu5D+4I
zOrs0{jJ68$rCRn;#=XoU)%S0JtHH9L3aCH$Y-Bo=x0og$%I<#$*Jx;Jq at K<L$VBKy
z7`@V<!!7VmUs?a)A%g{|;A__QtcqfNZZmf%ODyr+i+-Hxq+l-cB(@`VBp!VbdX`6f
z!g%J_+L&kAMtCzNCbN$uzj!RJWl<NIPE2$ISxl1chBXq at 26`cutq?4kB8|Xu1M#SN
z(XuNf7foDpX)X|J=o9YZdgp>=^g7=w?ROu1>d>8ve5m5!D`GL-v1OSBu5V|9^v at 0T
z5rOD|%Nl&Y$9TH58}#;F at 1(`0Kxm7eloLbvfkQE9jSP749Chuj1Mc-Rm|I-L6XAx6
z0+&EnL at T`H5j&wZwNA6C%wD)=8?zwI$C19Y7RP;ei4Sm&zY1{~?V_3syg(IT<h4Wl
zsZPlQF85E626h0QWwDxLPXLdsz%Th+?n~4O1~-v9p$po!Sm*>jNJAR<T5%tFhU^gj
zbYY|BD7P#8K3h>c!dBFd;;x5qY%nR(s953YEtq#r7mNd*$ofGq?())k7dJqQKLAME
zaHj*cj^JF})!>U^?5Fe7?S_Yn;n$lLSu7{X;$o5l`p4TCx9qrC5tP8eG=-QszSf<l
zU3#eV#ikcGnwM$sH*?ziXug{hPUA^M79T)^wqLgU&VBm!RYe&msWP`{`kDKJ`G5_n
zmuKHYH2~!UxB_gmo%<VIpI9&EaAkRLZbIJD_KG26{2BCfj!J`^EB5+}_N3#PFyHKO
z&$Ewv)ajJcA7z^CmFfA+<|G&O^TGFUclM+V?;Gq%XWW=4o<IJK?}PK>Hb{`$3E!<}
zI^<=X)1nm)THrJnFkVqyU(nMKGRFN7ME at 3#F`)2Kj5;7HI*?ZN=*gvlGHQ1371Zp0
zpk`g5k8LVyIO!of_`-KmE?Yz+MrGvL3!PPQn`D&UKbJrs*&^@At5HbXTsl|WPc1<G
zt6XI3mahB(okbv<Eg7U4B=~s5 at icsj%Lm96y7Up<-9&GWY;eL=)v**|DYWU>JfH)a
zW^TVPPRA7vy&G`AYaUWSR#{0m(iacK0AmE)&sS<9^^pc8HPU!!-9?4!>166+kr-oj
zhXWeqERXR_b{&xey)erEgVdiEqP1FAvC`d at T*ONsC}#tP_^J56f8nfE&H(4px*K?+
zNW)7&7n=-yD7Wk*)Vz~u%xj1UQpp*hh08HAtj5j!h&`_e(PM0e5rld4n4*s!i%S2A
z_QK4|hjF?e`n#1$v&{eQ|0T@=G*i*`|Iq at cWN92Z36Mz5r|7S1tGy7?#gM+;SAwVN
z|8uR)r|`_;qb8>`Mi at E4m`E}Fy!6Y!*wJ at M-^-DNQ7;q;>M=QsA$2?SkfN7FkG1oA
z6lly;d*MTEbQPmOh+!hln|<=QIpXnVxqU>Rph3C_=dK}o at 29E&?aT~Y4`m}Q78?lA
zV{szk>@y#&EwygsVdO)!u(ae^9#@r$7N4X+M at uQlrW{6Ha&gyt&~tUK5wP+}(Bq1h
zT- at aB_sbC*=!KcYLL at R7*w0RKillI3xetiK59yi3aK at 0x?zhh)<WctY;DTCtjk^J(
ze?hMa^m;vm!R6F^s%J1D0E6}FI7<WB`n~*{zn6bA=1+_cez7 at tyXt7q#$Pw;@jD!U
z$oC9j*OlKr^Mmi6f$y$iE&QvRoA5jca$NiDIL2%&@NhrCnn-;f(DSWLsh^XOfl)z8
z)vyxIgN&eiad3e^HMDzPEH(?J&MTv^;ut2cwHN+s#71!vK`)05BpGKU(0q-!gNP{o
z{VI<hc<l~muXB?k+iZh#sW<4btsR_OUCYi at SHgV%<Z~&Mc6kQ=$_+DcAItp-ZNgJ}
ziln0F at 7T~!JyJD^<=a{Z-}B7?y7#HlZF_w1FY*35Wg+As=F6ujLHEK_lqq?(qQM|7
zjMLzuH{<6pF1 at Nwpp%fZvpQ>`&KDG1eTRCY%hcq{J37Bo;5UD~^+ at x>yO6_Ts`uVd
zkz$q2&88~i at pMhEGOvHUb7FNdKeY|G|KNLQ^SF6TqTY|8rxmVPc&sgJ at P7w6NWCvx
z#q>)lavBjax1t&F^#4D!y$gI(Rkk?1&&kQNX`4QP@{pdig%)H=3#c9Jl+!eX25XJl
z(N2b|<smXNj#hCLm64tH6atn41w&CTq=>c5a3S95)D#^}0kx>3_&AD>45d0XBr`+W
z@~E9izO_!$QtzGbe&6r=?!WzIzn^Qbz4luB?7g--milsyq#r+HCN7A-WHl4_CJ-a>
zRT#TLF_9jKpKaDj$uN@@A1C1r$jEb&D!vP&_*jYBq2+!2e}nnB#32B!s1D;<uvG(_
z2A#0}@}k9~tFNcuT&idHQxkcJHgel&4y=wkXzgOUEPwvHz)weeDizE`Q8Ya=jR|j*
zr3}@8yy8*yz-CzSHV$Y-W)N_xvtU30auF?_K6tid?YoWvHH_Kf;^{+Q4QRmh<LdUo
zhA`*DTkVFDG?1t`kp=1LG at ec9X9Ma+22%W1-k~oaRzUxt7nf=!ZIy!XJ{_Lo4*nai
zP!<D9T_0?~RT${mtaZb|>pd00{9^vKrv>Vs0&(k8=h7*7iml|S_x`dl+sWfOHmI|&
z4eEIBYm-8s(3yF~5mpQ+$y{1X7STt^ZFJow)DrG8DGUja3UB>=+VnTykEm`~;mg1~
zLYH*%$vO^8Y~vu!r)}C;Yu at _|X#W{#9pKsD%cbny9dD(CXZVsmOJzATAv_~w!(0P1
z+A5$OpSCg5H!+^UW*|wym2w*mBo*U;D^9}_i}&<DRoP6YF1uLwv-2tAu+t6Ld6-&Z
zwXgP at V&C`rpDIasZ+IZ9*x3J+--Z|kqj;8`OAFXVG at reV3fAbA&&Al at n&RD3=<%8X
zrARJLwMM^l0-u67Yp at dLN}S(V2K>ei<M at x5e<{$OW#)p^8!*&tnAZaopTV8~@6~{9
zZ^OR{Pdvvsx8lP<nO6dDm5txlgR?s`fhH`1_Iv44`it+gapvJ^*Pg`UWrK?=s(gB+
z<7YMDdcgLj__nRgv;SM<I3cJt?1wz<#E0b-MdoQ`{^fa at f6?ITLQjPhjXjdWwkjrT
z&|iS;Q4eAQt~~SUT98H7z^c+pnIVwxS_`39wa~7wXl{`)mGzs3829J>zl62pEUX=K
ztFJg{k$NkGd#ooJ{Ldg}QcWHKr1~B62obx7Gv(9GsL3=J>YH7uARnQ=%*r(KA at T$u
zNxcKSYC`25<Sj{U%Vvw+w|B at ownSgUVxWm9Vp`)b?eb~I$3n~z<RzHvJ!SIlIRV&^
zE%JMemw(p*=C=W;XX~H>=z8Nd+9Ib_4%CO-nDXL$Yy+fg0=amcZ24FO at Te<48{+1Z
zCcg<%;GXI>Cj%?c_85hYYp#vcS6ObGB$7s^`8IQy+~C6d`izjGLT)6<#uFWIKeLKn
zNMK1eo7cw%ZiHU%?wfI5@%*ilBKj+5>m{I%-|o7^_>wCcNYdzz!Q*<s4B#4(lLIL?
z16r{QTH|U=b}FIGg_th31N}I1|K<4A7E+WE*Cht9$k$+!jEDo^T7vIrH<U}0QD1lr
zQzm^cQ_ at YM8)&Id(&LNWk`~fhBo*~Fm?e-K8p>qc*h$xh_ExwB#aqhQz3+cMkMI9M
z*?+;it3!W at VJz*n)R5ox<ie;gu at iMp45oAmv~QU$E%_*}6v&qpFB|#`w2y^3_AcPB
ze)Ox!;}lYP=n|AF at OxO~<I#OdSQVCF9HiO1tdKCp6><sk3h>XL%9 at dUZmuV>Lxp=a
z*T(XRy)c%4 at SEIg-SeDGk4}!)jMn!Az5q&n@{0uVFT4BX_k84+Jmh_&bonG`!#m0N
zYMDJxp_ldkzY3CqnlsRpQwnSJgMY@)hklEiz-F5L`+PawMp$!rSaW!MWs3+PD=Oca
z{BDM*@b7~bOo)*D75oL5|5BeXzyU?QfP3vhsfq1p&Z|Qe5sK&LLlq#4C?XW*d09OT
zZi763&o}Y^=$|oEH|WTpcWjTWMd&B--kg-Q{U^@r#)b64Dt$^?T>_J}$gN_B8i4!L
zUj(obA^(wMJDSe*pG%KYyz}#-i}bUDii_NkGQio_unOu6Grp{4R|yxGADitBwLgA4
zOoXe*D{`DJ15*7+ngJ&F&P>TDta46~a=@p2C-dFu(&Trh3#%HZNK?bCFY#OUy!xc>
z9rlC);?tz$x4>o+r9?UtSC8l~sZUZvJC))INnx%b(a^66QQ|jso$NY|QaHG3lplhe
zd7_zgPX^vcxtb^JJIS1l&arEvY4|1V3_vn$lhpWa?2J|#u at i+hrVozBU-BLS$&M~B
znGEnS)Un;OBMfSDC#6iwNshan+%GAxydj5O!*Nt0P3l*k*U5J!e-eYRykqCUx=wR)
zElR8raSEl#=pQ2vtO>tMcP;||OuXeOzqRo;gc%1Mv at f_GWa-LQ#Q at XBL+RS_<A?h0
z^VwrN at O5G+GoL7kXq!*OewH&4eZW9i8Iz3W0%8t6Xkzqh at n&QtN2Z>dEKNZbAN_Ub
zQ%|LtZNyx%^p8cR()6`_7NnR#^lkUFJ=b>D$~^E1VjA!m3cUa4{)1T4W)n-Hh3!X*
zP~)Av=idr*fC)-?s=>-^5pYic&-5{Qu)b0G9vJUd*lG#t{ulgaD)eAKZi at FK0{uvA
zQ|+$%=Hz+(weTl%aPL^YYwC7CA+7>$@y7lc0aeM5pAw5w at IIoL)%xuF8m^Ee0OzP|
z+ifMUDdf8&f&=O!wIr7%#IP((P6tx_c0A)D8e=uf<*$;pVeh2c-~*1Cp}nZ#_=x%F
zn`Q$!EuNc_MpTDRh-6sdASmnp^-m4~Fv5)Qc8GkbkJpHb;79HAswR+V6-T0iTgib8
ztC(<tFu2PzD7G&^j(Cu^<H?2S;QIC(MVL8*>l%din;@kIe%f?=-=1muqMvmTSSN4A
z8|iquzkZ|l8JZ_*(CuvmmsWOd1((8qtG5Yk7Hrf41=2r9$RE8s$K0=Yca6DU^*#$!
z_wU{VVD@=m0P}0_K`_7Zz6j=^w++l8?@M4__O^q0-g^|xOI{B^Mb?glFG$3704{mC
zN9K6TsoHjw=K0HP+h~F8*ZIq28_$H1 at TRa5wV<OJKOetBd4ec!J3;QTCDZ)QOfYW@
zJ8X05><J%G7FLKn+afye<%E}SwUSp0=`xSHXo8m6cWT)H{r<eVD1Fo&P!^?a))ws`
zn#NLl9(N)5h>ruj=cU57D{VLK`l6-9v!ux2B&U+xk9F&bKyyxN!JKF>XH~>N?U*}Q
zOL)5IxWb;tOmfyp_?{6 at 7QK_yc2nDBp^yr&X3oJo(?#>Q5-W2wE%G+d?je~g69A_u
z$sL&%<Q;;qy!FICi)|}u21 at SK3O#2H^+b7Of#^%!N%aoYSCg};0oMcI<wn;BBe#nx
zD|eFX at Qbp12V0gPqj$zm4!ThHmi9=Ip`J2$Z(`ji0;!#J_{SmxA>5Il$lqB4uy%ZE
zC3W9W9gLAqK9e-McUoTWaIlUtM-Kg~-|Va4YG5Y6-DdG5c4m5#L?P_(B!}w;>j%Zb
zhQW=4Aj43F8T#*e=VkrNw+!D3+`^i{B%6Y9JF|cnS>tvLB|FR79YZ>I9oTh43GRBZ
z>xcAi5o~cN(cJ)c!)?cjqO-WNj&SbM&b-P4V4FH;1J}*D%Q|Pht#F$=a|bfI6>eoG
zBQlYmNS>_6{W{N9)FIt at uct}$4LUsA2J0@@V|y-(_|E0!O_!aqmRU*na8RH#ZG>^-
z-eaUaa;F=2zH<S?1elcVI3_*gsmHF^Yn|nU`DN<~b7u6<HU-T%+Hl1D?E*}ns-Sup
zy`0KH#$vH)vba0y<_NoJS_65Rf!Spemxm@$t$#-FZmzIykLMnb2)=AQHNxKHxeMG`
zvb)GrG3GAxn8w@%p4-RVb3Ntg9;v1(oHd^5!PbS at 8Xly`^#%pa1N*mN&jP#NfIHX8
zbSu~?VDAJw6>JySlfm8&b|%<QgMA&?bzo<K-2iqH*do}|z}^7%bg(yqoecJ_9wkVN
z5BH%y@^gkEG8Mu$K^(q5x*Ke~fz$-{M6jE|o&xqZuqT224A_ZaZw6Zr_71Q!z<yRP
z^O3PKXF^yb#LWPE3)neqG8GQr06u5vk71B*Ok`aGgl9v at TCj7)3K)?Je;N4ktT)0T
z1#E;vssU$VGED>fM_{Leoe%Z|u;+%(fmskb31%ULWq>^ob&JyK5gS0aBD59U>w>RS
zVIfS{g$&_6rqCG(YYZOp+!Zu~YgZ6!slhkwz+R58=YhQf?8m at f3HIai-7E!J2llU_
zpZ5twhVB#Ke-Qku<NhbX{}A}^kNckje=Yde#Qp2R|0vkM_1q4w-+=4sh5U8`Z8*4)
zH}D<}Pzg`)^M%>Fc*!t=da!avQjZh{^N!5(-*IF<VCqkgAil0Xa>KaU{;@9sUy&SJ
z$zGHB3<|5QQ+^XNb_eqU?RC%Rwi5&6Be`b6a6!IGq*0hB3FGp968~=RYpsV_ at _s0C
z#GK+IN=%QpAS>(1!m3>~N at w9JxN$$sPOl9{m*)CyAT?S<j!U6g^>tnQ!JgUm0+_SA
zUIH_}>-S*J>pI$muT|gZB3*xIT-9jqId99R%Q~{^H+H?^z8y;Xs=d^GM^_iP0(6#@
zZ0eHK*bkY1Ah?fmjmAaTlF3i4L-=_Zgq~;=1!&V8{91r69}}s=6J^oA=db*LzOMmZ
z|4$<BhS1^%kEM<7`464LJ(NG4gx`Dc`viVpi9+afOpj1g0Qif8W<i at LpMNGYB$wj3
z(v3#EwGULs4OB<wV?Z9YytL_kka at UX)JpgRxJKfy1^Zf0h}lScj+hN at ge%vJv<FK4
zxL6<fZ92F`&Kmv41I5#hrQw<Z66>Pkq+ at AxCc?o=8va_Wzc{VExOm#d>%cYL$rsPL
zm`SzHtoEnlYqV-?jV5s|YCc%S&zUm`*}^+#R!$(e#ynsA;LthTR~BpVlpLO6EYZy@
zFR~>wLTjVuFE`t3s#H|vDW%rnFH3$ov)uVk+dSZGliUvjHsl3|!c0f0lkH?W)go#C
zu{7VV(PV%enP=j}9QVV6jFazJ-l}z$^_2-XZ6}?j?Wf!iJDG)qBMTKGFHOBhouA at i
zBpciQQ%Y=HZZEpdH!h|EV`Qx^alN^?huVsFevotQMGY*r7l>dBZ|Gfig_<je$bVv7
zKL`BNe~=r%{VZYj{j5JLpaz;cgRsLAaC!SeKM$P^B?B+=V{6p)E$-I7 at fN`Dr@)0M
zgM*<@^O?Du?HX2tC!JB3=s&)eCS$q4`~R)TKuMFaKRcivi~U4W=cgS>>E`gO#-SCs
zbLd(kGN|ii_&v-g8izj-840A)-Cc-7Z)^j3?O)Uu!{L7%mZr(I?Sa}jsEz4o0|wCu
z at feG@nuH=wBp~mxc-9=;8Z6b7C=$6&)ahA at tvE3g%NcH#+rUG3{49OI7T33~3_fEg
ztR{31MTzt+YxF?t at J?S!s86gxN&hL2*}$^0q+d^8z+F>G5gUn6l20wq2lD(MQ5yzI
zzE<+hIcs#~9oA^qi#S{4vzBA0FA>)qrL-40AQrzP=wY-T>i-5t>H!!j6}gXa_98}y
zU)5oxlvXmW4o?@y$7&6e0X<AX{^<2^406GrQdQ_v40(3 at _ln_3m~)sfSrM>FSpaDc
zVe<MH!9h9oPel^?6hoeU5=7WsYxHx|D3p%xL>~Pk7w(V)%qGeA3Gm%4gb?0FNdOpW
zxpb<h+BlSwtmM1=AHqrT_;@&tYI;W9Ib=I6_;yC1kgcT#TMb=+x~81x8ic(I`g+eR
z4;DIAeZ2t{p7^zr>wYawJy_7M3`_vIxuE)rcrbnr(U6*&O5!is{+py~D3#r0+AWaZ
zCw(b%eX=H=2npTiW_l(UPkZ%C!aMdHSBu#tX`Pcxn9H9 at Iva89Et$1R!y4$H%>~n@
z`R^*$zxuhzw_9+;7QJ)f0Xg?|*68<rUedvLXEbspleeBR^Qo`l&ZU>2uaN`)pZrU`
z#B5NXh7_|PMM0|kYBB0pys!qpR?$q{5%-r>t|dRU5SD3V0q&&X>g&YbviN3hCoup|
zm`ZbD+?LS$t>g{Si|<7m>=~@mP)p3xk42*d)RI)hP5 at J1j}Bxaf!09U2ff5l18H*U
ztdUeG^<$WeTCmR?!`Bl~6IccP1*Ef!Mo4LZl&QeY8+<Al(*(m>vKU~YAeQ*qVpi6B
zxH!_?QxM52e&E$FxcR{Ml#yD%NVO|REbHND8F1r5{=;*3zs-tY=iffJr9<U at _|GbG
zCs|Hbk`*8sx6(H|&x*dwjw^Lmrg?U8 at vC3ZnPMqhNRvijcKH4yazH+7DIkO@6{MNg
zcp2cz7gp^g(QoIRm%j{gYw=b(tuh<*X(hAhIvJyKz07V;|9i07^atj}Fk|D%qWfEj
zFjOq-b4|ZXKQq6wvU0&f!6H(zPb`!2zBP-E^Vv4#hDh*l^c&G6WkSr?qFI^>_BWCq
z%z&f?^Sq=2GYCDPVn|#pC5V)sr)EhF_BUcFg!j at VUeaF%JoZXbKvtbk>0f-Fv-3(F
zl+t~I6_3lWSg({+CzQ{=ET1y#7B%)-r2=nqQ%lHYZ_ydNqzT`6TZJ$02}<UmK&G9n
zS~-ney-Cv9Ta<b)kz?aAE(YJviTIjHAOD;tz&7FD2%$a~=L5<4%4byy!lEm3<8Iem
znv#T1s!OJR;FS3UTkH(^fI~0{+TfGT8bc;fisNC%%Is%xe<k>&hcV2Buw7PWpA>QQ
zOpCBEU%m)kWO-^DbbwhlSjX{{hg5919;C$eG!vvoC- at mC4Wz++M<aFk+AUz^EZ{hn
zdYITLh-fO7l$uOA$mQe+of67`Tx!EZRM$}&+-V~Ti~86ACqgSE1%v{f3LS at ZNrq&a
z;DI*o`z>%TSZ=yCdNqV4L2Ds5{IC=i=7FCQehF40z6_}mqiTw$RS>t;C!AVTy!X{F
zJ7#s?Y&R$t+6*KQWdD at b&8~?rhI?kQgr-%2V9`a`J4u311vP6}LTsmV&?Q<@ZNyeG
z^|Ri+3xW%JQelqh!1qP$ylNNYPHbe_6A9;N!TlWr=h#!VmPYLBs0!keAT9|g5Hos8
zHuQ67-#(x)U;5JB^U1wb9lCrb5#aN=TMudVurB4n$`^Zibw9|04w-7=%?try)-$_!
z&Z}Qo3Y6^~2W*AgS~!Lzil&d#ECuW>w!$sd6^u^<?t5&7n|QJEWA$_GW?Pz5Fs9$_
z+D^Mc4p;>E=ddy_Ugndjx>JSwZ!(p1M6%=>l6x#RLaB>c7G_95fR=tC9_MOFVu#y8
zl<hW>+;Tc4c3WQ101dmxM%29c{%Q5|N9CGUrhm5E6Z#x5oWs>a#JYT<gIf4SG at 0hY
zdcz$27Q)s3Tf+{zWQYm<x|--8fOUpxdQIf>vky*29SC)=LCX%vEjxhpyVddjWEpA`
zt<kwlP|pjDCvP|CRI3Ta^UNyw48aLWWzR^Kp?B3C)7USf`@#1oVGcSI`155pg12eq
z7c_Qa{|=&-kI^3E?(Hem3c2W=0JI7)I}@>}tsLJ=fYtXuphVu5OkriJKL)sv7X}uC
zlmf5oZv8{$3i9ubJ?_E=!9;2j!VO^#<GvPPMc;8vKM7K at wCjPAxktZphw()`8d at B#
z8(^V@<s}K9YWz0T#2lI%t_Pnjc*s^ysu$*@lSWPOEX1tAy-<i*1L<vk;9kfi6IqbZ
zGZ9=9DwQP7J+F$8uwCO(dPyVWrK5hK+`XWAqHAtXY4Q43KM#%c&j^@+zw}(y%P;?F
zai##*t%KFwj%{%=1FT=>jxYq at LVys3Z6)!B&IAvQ3%3C;3+)S at 9T!&PWUze$jNcY|
zyOF_Dc{bp5f`2QIM%UWOB47Lk%vU2PBTPs+;8>W97_xVkjPZP^FvPe7Ipq4_Z!k=L
zWz8X^30mM0TU_O#%{}-%T7kEpUQ0w8fHdv-ixEe0G0gqX-<=d;?0F1oCsyOzS_Z&>
zpx#XIj$y#EjXA&tm5QW33hn~b3nWvF&F|zQ#R4em@(bs-ygRjuCklI>LOr4}5LzR$
z(ge{Y6lmBJP?Dqu`l~b)KsY05G2Xz_<^FwOLJ0W59kDGsRX}L3i}--Hl at qqgRTSPb
zpexZ`s3{^UHv9~@))dvKSg=<WQ5Bod2A2C~a~xrNpe at HH|1;0an8?Ak9VFP>Yycen
zk7G=+{@7#_pR=|t&6U|czXLT^=-eso3*4#gH}EM$fA~>1?hLGSPe at mgsj)X$WxbJ0
zxpcyGls6i~+n&>f8{Ief)C2l0Y#$>Sil+`V#$+Ucu!`_jfcECF^OANz|6vmM0^ycj
z0-C4`a8^dWMN)v-M0<OZ!kS7p`fP`0K<i{WHDQgFT%8ftmJ_Det?&(sM3|w`QujwQ
zfrpsne(Hn)c!+c|pHw?}q12}lOvzj{bG3mggn5aa#5s9%cP^I_h7w2JG}}2tFf{T5
zTN_&&Iq6G~7>mQ(QP+ydk1TcY{xZY|p9<)wC3p;aZ9yG1wlwgK>Z!>lOOK#Fgj<ei
zA-rN#PYvo0Mm;rP-~R1AsHx`s&A=h_32vA}Aj9djAXCi>zF19&6D0mw=tC_<Y&Myl
znnM}8#+D*$rqNR-WV0=xhR|ni6)|l#sI^8)^^!K!&nW8%95G- at b8__e5N81U&tRvF
zY>`w@=OET8Zt)V}H;eNXXXg0kn~C7W+KTm;b-oF(G5~jHCMM?;SecM^*?8#5^}&2%
zfL=hIKyPlBQZY^G_%xPynx*kHw~Xo2(MxL7!?c<R=p#TqrUI|6Dw(|TViBSE6 at j?d
zhMNdL)1INrcX1-$!ww`+^}x=H&A~<C9XJLTQ$=Bq*+R7Qs!3uso=*(diNGa<HQ|i|
zX;l5ny||+~lmhtjcP@=i!qGzw$Utu<jqpcI(yfEKk|`I~;qG*|@qemgv}7-VG97Kc
zu%>CbP^edhHx5A!kRwgX8BB0-LJFBe)faaTT+5&K%Dw-pjb0)OZDb&|i4hp03X9lg
zEJ<#yOU5doNuFxYE-U$!Ih+vuQ>uba2O2ji*aY-!5<<qdlNKWtz%L*NSxGUP3b29i
zz#GNF)w at N~nLVIupA0j6T at lFqK0WH&q3lR9m^ur|@?D*j&QXm#`crW9fd-xNCCEGo
z@{$3pQ-1#gWiF&da>!~3k=vmFt~(9*(QL93R<=5DZwL6Ip4A;-PZMi^FV6uEeqHB=
zA;(Z1q^}9r3x&H>VZ%W3V3ODhvO#rNd&Swvgg2K*uc{-b<y97OHzl^y^Zmc~=rAn!
zW$+A0IAM@*zCsBHH9(8_{iqyoD4G;C3Bb8ACdIl0VI{9=?g=R`%ak3@%<U<Nv|i&y
zL%V`cBE{ZQ5#w<N9b+N4;z=ZwzfMh{J}-Go)01E}FkX=j2E9~L`gFnFuTx3g1ue4~
zXor<N_8P3)WsBbZ!0F&c;$UbWV4zr;#=e0vZS+f;=K-3(p++=%IIx!$AAa=<kZisz
zZW<b*d9mH3^{;oOcm*fZ$8?o?ea^XE-NpJ#6T3+0LfGM9LfVB2%G+Bi^blImH6<3>
z_)RRlD*-}{a#(55ytg<w3)X31n+6;nNAP-E8r1~z-Al%N`d~hnMt(HrH$ZIZm at gfC
zWn;b!@R`PZ)4;bFec<MCX1mRCUyeM_Gij1-KFwPergTtoUSTst$v~aQ6f`eP0p4Xk
zog<{wXe)CF_rn;-mkO~3az5@~<XiBs^MQn_8Eab+^okH|3<fyQgR at Yc_LRE0utN?J
zAf)(`(^Kloh=-VivjoPibrH;kuOS7^nCnuVh1YJbB5KmCX=H3h6%~vGA-}u0;*!gC
zQ}a%N1<6RL(4v;0lbq$=C~+#o4FY4+4l1vvH**j+H%hKf3O9I^A#Dh`*)J_T at Xo)p
z8IxOVE2$0IY8JCTN(m(f0~HK#v^;RMM&M}kKT<!pM&@V at yKZuoi-PNnm1%u`yk20W
zjX+0?BPxHXJX3xLkT8#O$)YLFCmY7`$(5(o&mFqPkpnN-?l&P`H3$n8g!hz&Zj&KW
z6`a)t>-(iiqu7M|_Yh`)u$kk+mIY^pZu2nElN!W9g1D&y->O(?Ah7@>^A(@wz>24V
zwo at 2YvVp{KIV3>L42aSH_ZX3k)<Fz19;eGAvISCSRFTYZv+}>^iN{ZCPI8g|u|!@j
zF()`HtgvO1Jk)7h$^8(kIDQCM?>U08S6jIN;*1-}V4bH9 at f$Uuq6^{+g85)B2<BT1
z$>FO>&G<E&LYYOey06|7u4^vvupuqtG=A&Am$$EBw%CjCxgytzI;iD#L5Qamck??x
z4Kp5-iI@|@b#i?9xU?1EmU{;E+d=}ERkB$vo6BUgMuv&YQ`(&9nj6D)vP#YugTorR
zz6WHpRyH4%&2_T5UN)(0in8gH%|_YWE}Oe#vqd)d%BCB}Y1*-Az#C3=GGh=w7 at Xxz
z81uD{Yr|oPF^t7{#>I31zL5cWMiMW=32;l>H6<SM8ipVh_c->Naa16d1KH%}|FZ9J
zqIlY+h8~4WBXI)3ISwQARX{cRJ=ebvc%Wu^4 at kA>o!kOhhp7#uvrMoBf0^h*j@%=<
z3It<@;I=k)1Lgk0zD9F7786=5%xw`|Bp&l;`x@?Ym}}O%GW+#`nU=7&u=<MgOz>B+
zGue9lTexsxYU=d7674g?Qc{U_ORblJ{8K0yO0>>1UK-4k5=yk2GGuMsNt at q8&E7cE
zyMRNYHC`Io2yML=)}>Wgf2+g2`LeU4w=!FEwCV*K1uiZMJv`bR9^70xsChBgg3Z;T
zHr%tkhdHe5QJz*7rF^CQn{rUOR8^ER`ro6fRDG%qs%q8O!irMXfp7f}LjM2!JJl}r
zKJ_Q?zfPmmWN8XCC7KG&|C}eHDbN;aW9}AByT+q=UGtvi3(Ys$K21;~XrF{QQQIh|
zXxF}_9nt>R5>6+uI<#5+G<}|afnLy8=&SV at vceEcaXERq;eTqwD*c1{NA!>BpVU9C
zuhVbTZ_%$x>P^O&O2ZfNoGT1owuAUG>?Cm#aP9Jbz~yfxrCpN@(#o@|y{yRpuGGw5
z_h`xFtv&vwxXTbCVNHKZ<)He**f>4I#ZK?z{-K#^XWVQS*{k?ZMPqX8|2=ShA^Qdu
z{R&wx*Df#PFY_{D7I0|G;kQD}2Gc2Kr5nhkk|_ZScDC8Tk#=)%vDn?dIQW5~hOA6A
zkR-8O<URR-<0{~myx=|p9N|N>3x3C}<dwHYBF>_Ml|213`DI)IXgn2tz-L(+yG4dB
z-|Y!e`x at nUu~;iPW{7FH6j?|IGAJz-6|xKW^vTnr>;gIY=?$_A`v3Hkq7d9i>&)|*
z8gnYMT;%*SpfAX6T0{~=9U3oyp9g=1d}nVlggn>9z?`6m^{}c{*!aZW&eCHro1d%}
z`E-UPw%=Z&3s5t!>P5KV-7g#q%3F!I9VE~s=z-$$X6SJaof+0znVq*#mAHsn=xWgs
z`b$20VV%zaJbCt^x<h!@VFR8_?U*bwVmA7~opx=P=!rxADi~K|Cy%3jMVFs4x8>AC
zF9Q-zjStW1CWY=Bc)`s;ZCgba%*Jpw)c99C6K*AcxFl<nt at hj{lF%05eyTknAco51
z{f4<-rgia~N{c2M4bDH47HgO1=lFf+3E()r^&^6q1!cSkEz24K=>Oqu=xrIuNE5O4
za2 at dZ+e34^R14=e^2gM#YF^X+Nj_cft(D&-AzmXwC3qjegN?x>bRV7BhAo<baA^jv
z6+_Vv7y+=NGa<A?e)0Qr=r_Wa=x|T!Ufdt6TuFXTXO5UW+5WPTWpt(||MK(xGLL*q
zXwwazpQF9vyOO6q`vOX9UYPA9p6uYw#Z2fzYBDXC>v|A=55ez&c&=Yzu23(&>_t~&
zNJAgkxQDg~eJ_27x`h$94js1`n5*&~Qj4ezx#e(G$Q>Jre+>&P;gukaUKWhr7*5FT
zm=VK_<`Ve?awe>0lc3KE!1<Zh=y(5+$9#4t515&qj`Ij-x?T>Q+sSvK?tenpizHn>
z&w433njX_#8unMoZ%CI~ncDr}j?EpWcF$;jIn`hNRl7aQh6ugv^fJINtlU6cYY&^{
zxL+geVGis3RsHW(4l4iPWe(MY`%FMFq6tI#0ZqFZ(;RB>S9$XB<d?q;%F2WI3`q&D
z*7J(sxv;Yf_r{`OO?y%*Pm{V>km?rN4GcHJ!+JBjNxOv+XNA55c)Th at B~Br%<d4Vv
zRYy1btGa-np?X{4hGEy4{uPx&%3JMu34jmEQhT0GEi(8v2vtc+SAnG1SLh=BD*!Ir
z14;V|`?<j67{$A$|34#R+BC?odP`@oQD}i~=IJz$QzbGuTW|%0+&c_4Gza?nHuU=@
zFOyzFroeA1p2b at KhJ5->F{ljg^;cPvzyE`cu)I at cPMIw9!KeiEmgGpjjVRVxc;>H8
zmCcw~+b5i#{ehyhTVfAw9vI`2`<V0SzNL!^X2TdJ`m2IFZG6I_zS4jS!uH3)EJShI
z#%rQ|rImx+Ko?LTEg4NcnnoU{833&<{wmi3Q<^@(O4dox{vOElncV)Qc&cK5m2E%u
zQf-XySp5P`4&J at f#1%T0(pgj|n*G_qyLX=j|1CwU_G;u?d=Q4Y?d at izjS!2hC%WPT
zrAL-u{8jc^PT>b;nes=>U>c7s25g&cjShT=xe#_T+_J~R4I#^Ikz=RE+gUHSuNHjA
z!M9$Hn-0Dc;QP%nCVe@%u5txeEB5YPkp3{43N(0%m3eA7+(2{3N<9f_ at AWcB!6CN+
z at pzy!M&Sqk(_bYh1mMhEkBEXbI{42xMArMOjxnjriK+QCm}OAPn@~!zTt6R=n<dB1
z#vG|N<a&Qq<x1}QLx7tW4IzE1${`MQS};!y!A!$bpT9#2_;?%eZVv*F`rxstUP5Oc
z5}`yb{B$yHyBeG4S4R9*vOg5JPy4I#*+7j?i><Y5Se3bqkmyU7onehRn~>t9W0M4%
zhV5d$KuwjbSZd(u3fwEbG)bQ4Q0B!CVr30J1!dhnw`I5IQ;n58_zvDK!MPaRTe5s^
zi@)j(hN=uJsS|R1SFFF~Q<6q&aF+;V0-zHxf7r at F#VazDR>sCf;gNl-0G4Tjwm%y}
zUIIt~4*;Rnafmvv!9~#`kHMXnHDd1-SLF)DcB=N=WhKA<Q+T3}z2dTE(&^!e@~Sl5
z^E|l9!V?FkmdqZhefiy at G^%M?SH!UF5v`X2nKN<Vg${n;pqmN52$+=Qzct*}#h{!E
z%k-K{xPtsU%DcosYd=cIFGYjd^0y+RPd)mr=wscM17;rN(kv&)r7+_Wf|dB4>Cz1R
z&h&9Q>hKxLwwZL*74rl&`0lZp)chy9Eiaf0Am1I0uebt`Zw2Ig&`R#dTK9VKJ;UXO
zObYxxSpgyYWlH9T6_5wJRpf&AfeieOHM-$3=y9fJizna8Jh?;G!*r`dz?lp-FO~uv
zwuiHWF&d-s- at 2QSWSSYS12ZqUCtUA&5a9O$U42RU%Dqr~C$28{_e0KJkSufXdy`z#
zFw|5EIFRev>iJMkbEZV=(9 at ZNi9;z6H{YiZO$|N~Z1fv{5T4t3uHw;Xf4l at fRvyxn
z-AzcD-&a{`*jsEXb=8v6Qp26JtxOPL1q7bwwWsj>EASP|t)%f5f7M9d)kkp$t2n8G
z32Ojnr^q+amiw!U^%cxWUhsFFK1_wa;O`DO#<}apx$DQd#c^&}aa<20|FX^NuX=qW
z{5HW4 at a}b(ldl66eEk{tHNt#gj%Y&nz5M4^M~Qah>DUQ7aP<aTJqf7E^28&+6=YPd
zWX&>9kpdFg%#mfD?8{r^6Nx;#pQe;3&fqCTBiKJG-t)IfG?!XS63!I(Z6#CB6i};Y
zp5I1Qp4+XY?o!F`KlN5B*y}t?t>m6gaAkOYZY8x#z?Fu0UwbF*1$QDqbE!?qWI;Pp
z#<-Il(E?$4o?C(os9>of at AqhIE0Y%%=U>**nW9qCiY)k_EKUOd5>ZKKhTLe1r6D)&
zo7)MK=1Z~@Hg!Z5J4NNlE1q^)C;I#*+AnEFd?Nu#IpUMpk)DxW>|FzI*iU!Z38%6X
zrKU#%IE~!nPAO63q{vt)#Yo%zCP=$8A7FsJwyk8=E#!A07q<)6lNOP2zGGYKSO at +c
zo?kA^*~M>OvM^guLLV-ip(maPLLWlR_3)bwzgh6hgWnVIdlG(+du~U1S@)7>De$Ge
zWG>wSoL4isjqW1%(w(m?5`l*deeC(U$0a_FDIbCnZ!j9RQxdvQ<XatLIm#EF?D(mZ
zmCV1r!IFny^zNl8hLw(%)H~^)D_4*PDA5SLc-3Cc=t>ekLoA5#hJ%s@{9lauFNobT
zw at 5r+1K(unJPR`ShcaIR{PfEYiiDj at Qy>PvYq~M^Sr5$hZL|$ScoD{acb6=qz|1??
zJ}T8%$xestwpht7AKupNoLsW}@@HO_ at XVg$8c~5EB9YJQOaN%^rD}^oTTpEf-!J*`
zR<Bu at wknuK)odo<<Sg(POuNs27swF4LmS1##rfU|z>h+W&mKk_u;N(Ewi1^}Rfs26
zLV*`7*>U+ZfXW^SIfwEH=Gk=&VT15Op4RhqXB0y>+>QP0Jd3&IS5n%b^qXV!padj^
zw>XdxM4V-^+1uA&G8kBY*Zq_!Sze%z?HJ~#6zK6TmjhM|QRO$m+PQ*kMV at n%<J|p+
z{}55%1xO<;o(F-ib|P<^WuTlj8iqC3^{A-qR)Q?S?1dQ)W&^I|<yv8_O)JbV(zud$
zpKX3 at cWnc2Ckp(c6DZnV$J*PErr>!mY8A?AfXhB`ukZFTjIPDko$c+LQ+Kxj*Ruqm
zR3kcoPrng*3jVlntyDCYV;8=8Cl#Pniju&#zeux at zdWBL^NZWdqa&Zoe$|-&IB=fx
zs;_LREmGI9v3;2pm!eVp8DN>fpUB$RC^$$9I0EL2k+aPtatog55EYiI?Bmr}#3}x{
zB?+H;z4iFzxj_JWN=jPiwwRe1CjcwD5Aj7b0XMM%aBHL4MmBVwZ2-yZ at IldpJ_z4P
zXT7orPe~nq?hOS>HjJ05Wm<QeCrP%=9<9I3rl8d80P`zvUCD|I>lzePeOZj*V1s5F
zB at Dix*`zTGn(e_XuLA6yv5?>yNL5&EsM7?qpnbc&iuj&@J#=6CHmW-0pelR^!jGq4
z)p!pAY!>a2?87EHYXqd+Lr3G`ikN@@GLI4 at o;Oflg#2+#eQ0TzqpPdQhA7?W5yN5(
z=MOl*#{NBuzDL54TJ}G-Jr at 7aW-~sbP7WtS?}2}YG~dEVTjaPZJW&_pi$eL}wqR`V
z$|=-cKpwgqIl8}hd+~<EGLes+s*q0#{sw-J0(ZHd`owduQ<0=9h|aJU)?wl|x6g-}
zX$=0!O7;zR!AQHG0lfGP5$LaojsB7)z-#*&vP5Is$FwxKN2V}qyrksN+-i3j5eTFr
zzifNA^DLmrZ$L6F4LcAf8(_YBDm|OU$Af<YN>*mrK+EB`1b!CyEw+*eh7pPf*;p#@
zhaEFJbfWQScZY7|p7iY`L9Zl?SOYF4RpCt%D{(vRYq$$9Z^AWPlwY3*syuC>f+MKG
z!}03q&dYB;jqOe#4gUQJ*_Dm6;rD+E{ss3b9`RYpFLp=Xl}`e$`o5ss;7blo@|*F^
z1o;*a8*{ZSLC8KVdWpNV(b!&UuT^Q?CUBWP;M`?km*GA{7u$1_{66!|*64*#sITWn
zFXLAF=64bI(mwwD+~Q@&CO5Vg-*arTe2Rbr`FYBjG at KEgz++u@07u+fvLdh?`0vTc
zH~1z7cNafc!APlI_P?Hxxo}WY<9VRi7~}Xxx+4~O_p`Wyyv9<W`)8FV_NB at +_C<G@
z`wN?m3hqOz3u&}!2Z^3g*%m}Y{VOX6*<DbGV5h9X?o@(|%2GSU^EB)xDBTP#ss^_M
zs?8NCep8{U!FuihWiM{LxXExEop`Y>_`nDk<U2DfS+=(I1l~<a-$}LhmV79Md1Bc`
zI`<-Q<z$(?B?m($LCB0jMZjopG2$Lc2>e+AZDlh#VsGIw#0NG0$lj8L?z8so+1Q#H
zco*$&cjGs|;%P&Dp$nm0d&?{=F9Y(=4kXxHW at 7qbdrO{dLmmj5gDEm0#g8fnnN0ik
z>(L*Tcb6ssUppzjzXZ0&37otJ-2$oOx>%4?Q?QO_Fvp8fLSrD)-trLoo(ErTAj#e`
z4}DGc?GK>+37$r^M*r~$=5k`laeK=aw4cG(BkV0Z(EU2(Z4S(^Z{K#aefxF{@nX+H
zLF^UwE_A_x+F=G`-;*4uvn7JxG(#7J^c>={h8o)o@!WmrL&&?=-f{%Xu-jWgXz#Lb
zKP<Nicfduatpa%4a46S;`l8uTF5+m960kAhV1=afSY*y*wO28qax&g}S81p*lxt%6
zgq{icsTbCr(uMA86TAe^SGg6E&do|14^WziZXM0hUI;Lp7>D6Rj}!Okp!VBgmMB8G
zR0FMi8h8Z*!=K^^VT``<B`QO?ZZ4Dy{rh|D>n!wpY;*;VG5|;StR#E;Z0r%Z<#Cm~
z1ixa2az`>kxn36B$zYRUSwB}f#H2TIeLAoWT`a5#d7OdTg at Sgn5Z2Y;EGUIrc8SaY
zOdypn5KR|Lb+PZ$_dnnzwltatvulA+kVh68og|nKwf#-5AvKf>93zkW4;0p%;N4uQ
zW9e!oNp5E4y at s5s8%S~y*GQl at dyh?uwb1wTV+`(ubR4h|O|(xL&{_=2_TWyNVOvXZ
z|A!M}I&HZWk|=-SOaaL){)O`+-Ii9f0VKCn at g`Tf#L+z9a`QzYfBvVumDxGdA#}w`
zZXGL`mrDjoGPwVvjCjeECgNLJ6%=Gi1C(so#DA#W(r%_G6S`lis-sbfZAhYdVkwji
zyh`(T66+9frxu{(Ka~+s3yV3O&9tF;H!rc&A*B1XuJZ0Q`Acj3J5jI~_n)F_Nh8vL
z>RS3kh0?7!0yGEk<xyz~p4O1csLsm#`y1g+Qi(7DxFIEQLo<LIy3Li at e3#vzP?uOY
zMv78ZxTnR#+)+d7!{JTsg;FZud5UmDjrL^>>+<Qu%<!fdw+5WfN%zBk(<t9l$I)4X
zYQHJ0mJ;xs5zPZEoGYo!WY)*nR=`;W%@AiDF^BdXSv<nwotBQwU?Kbpq-0Cx_kXY%
z>Ud|CnVBr~0l$}?MQ%dv48aE?Z at J4@o*L|VbNGlcj5JZO)li|w&^lm^PI<kemP~RN
zf~zykV0yeYJNY(A9sJ6!;q-WK`ujqWiL}PFs{8+K><)6N(ns(fTyAHkEr|f?6XvB8
zHjbzSw?;#CctgiGueF}dCwyu)!E>%TqHv_n_1e)B>5%pvtvA({O$v7VT&OE6K~h(*
zrR>oY5H?5b9fVb7%2R`kPf0a+m*B!rLJ{0;g8qMhWHHsIzCiS`+c>y__->3CWAEm0
zD`|>7W8J*41KLkG%@};ANjfNT3Endp3q#$6nfR6rYF}{G+70>yyCEgfo{=yCPYqZZ
zrx<C)vm?$eal285!|1C$015x%NUQw*Xbml^5=f0pc+aq#tuzy^+CX{NL#T77arM=0
z%^G`A#sFm at WhVSUN};T)x=Nt at dkWV>66d-f(o at 0U)Hjx2O>SOo&*KOE`y$MucLG(^
z4gB`helDO#-2`?G%X_t92hGGg>;vCO8D^r&JDp at Enwe)(DV|JuRnm2Bmh^a+<=29w
zk;8gouO%Ow5OJ6ds=Nw9^=5-+CfFM2y%z75RN3&&)ngOl`hW>g(-xono}r`w6Xx2p
zVfkzh-Va(!a&0S#aImmHqjHGc3p9F9555|(!iQ%VSy3Om2XmnX-+#Z*0(svYbNw0j
zC@$>5)XTOLCfMi8uoyJiK=*n)jNce~uU{EJojsP4*%#bEou8rFVJ)Tzy&r~nNqHA1
z_sJ7~Ng&HzCJF|g=GX+9Gg5xI74t1L>Pb3J6VmZj0iI@<7e#j+`Q)fHQkBY6{pjlg
zl1hF(S|Q&Z>!yOpn+wQ+l3UKDn{16aE=|!L>Et6NzL{J09qN1N$vvJIVJJHQ_!$jS
zpPfW=fGb+xqk=v$1$y`y%mhlf`CR(2%F1m0ek7&j<}<aX`DCqFI>0zr$frY at rbIj`
zJ**tlYyp^5AI0|+OMZVYo%V`8$LzM^K40KE!1 at DJ9eP!)0d94Ui4k*vcREn?Q$oJd
z(p*!TX01~T>%knqP2%u&S6Nto#j`J_i+5z8<oPqTP}&lQw$0qv9mt`)DQ((XQb6a3
zyoukNQ&i<7U#4Mb-df?J2G2gt32l{MUENy0ZDD?TPFuNQIxJzF426JPx_lc3=Nz8D
z*)6_>xBPF2&8nt!m{lpZwNz;PZIkiHZ`(G&x|xXaa;&*za?@UrPVa2&maYRBZf+~_
zO-9*4KEFK^B-dMAbbyi1tKaf3!<nrh=K%e=R(rx|?fyHVhBbZ at l$~|01yIs&|A$&K
z{%>ko7ON%fz&9*tH>pi%IfWYDCrbsv-}<ZleEgI+p<R+L9zs;##azCNR$^b#lOg5D
zUyRv<FJM at Bd`aV(=Qtz#EzD&V%;hPf5_f~F#PO(<2J6k9o)1P-S_=5GFvA(@&O-V=
zuCVT$mHe#dExd_F>^Di+mWULTwL$o>7LF(~eN#Gk%$uH~$ULQtyZBBYmdP3FjTq8o
zgfOF_hO9$+FMW;rA}lq0S at p_<_4pzs`A+N|QGgvyT}z$@2z at B)#~wippS#DfmeEJt
zsI7DKEgbm`OgHwMb|X|+wG0)zPc2;>g^ObN+WR1Bs`#rQPrWrO-fm;RE|3MQ$-17*
zPE|aN_bEDkk`jICHHyr*&5!259yK!Qq~0jsELw-Ufkj_TuTvC86xvuyyD=3&d`I`{
z_=_Y at y|r8}fhvsOCIo)Y%_j-yui8bTT&*H=6ScKcyfroV?H}1VnBv=l&m5#xM)_ at 4
z&Ynm46VrXyH5%w_(K6%+E*N5ZCf;^}s7G5Vv7KMZ<=YheSp~MY18+qbsTv?XwSH5_
zx6(&;ssqk_TtCw~eg99ri*%3G5CVy*3}%t<Wk+Z$>N*I%-eK(IM_BnC^GWV9pbslR
z3d%Sle!Box+y*f-peR!0;C at NY2%8F&f9%cj6A>Qw!RGE68y%8XEcOBfPt&(Y+v3X{
z!>$Sc61#f;HFjCamv-qdu at Pu=b|;U26Gjdt`ppot#TtF at WW4_0_$JFPUjLXqkI~C1
zc{%1uaTaS-6-(-OH1V`girLnv<2uwoB8O~GXtB2_CdlrZgjkPi6P`oaZ}<DaCpI8I
z^fvIm;BJigaIWE6=E%mkj!}aKjyHaZAvXJVw!~h`6bu(zqfhP-$?&4kr>Iw*mRiY&
zP1o*twiUwK`D6DDJvRo8Jqv=5^vtubW90T3-1<kU8n8Fk=SQv41D0SdRmE;MHtdgd
z4<}ipPuPc3 at O~wfy#z{L4lC!!P{LcW8=0_9M4zythWprU%=&2PQ|UsaTh{Zx>Y%f!
zwBH<98Gn0ye)W~Dj~3-Ri7*g5Z^Gp~?QYY@>VIZ?+YNEoj<y@)t`=#DTZis+Qul4!
zf_Uhjv6RoXEwF2%H^yiAR-ayEN7IPP(KONwQ66<eO2Qs7JMMZeLgnvY2QhCoN$~i~
z_CERpzfICw$w!{p>Ko%X at J4+z@*OwQ?m>smK;#lU3ct;x0Lm;3F;-GtMSF2CR5Sud
zq7t(P8Sx>yG1OYJ;(|wn<#C!S(ive}>&2V_N4&1>wlpF at N#FQwqm&qWl`+;U&G=qP
z>d}{rz^54PBUy=W1K8IvIm4~klF^cf*VB!n04<m)DnqT}T%>y9&!Am%!T#xRp5Y;y
zXeBKHz at Iv*8m=D}hwqlIAC^zcjFn*rUa(GlNHmTs<0d>&0QP)&x0c-P7MY+wwm0PI
zrW9|NwERhAhVO=7_3+Q241zcD<Cwo)ZfoA~Ek9`MO!OhN<a%Tmu6v_()_*U~#XY+E
z at 1V8ULu=;@|HvARTq;>UcTa>4&lulkpbm58RvV$+vC?oH>L@=}+NZG|)PEH3!6NkC
z{Y%-bu|}_gbo2em80EoRRUnV#wLN_BMkn*llz>i*^XE;UKv*a00CPVKQp;pwpc%o7
zI4Y at RV{wGal)(s;f at gpy!_`tOH5eOz)7E1VVC3fMpY*{>B;zEbe=N3=7=W_0X=t}K
zTK9L6w%yeB7 at JL|kon{$v9)u*m29T+Yu<$V#$I}x38iRc9k-j_*8*lU-!;Fbipy5i
z7s1uDl@)tmI at mTtsF}>Q^^atnm}E0XrGC?SjlE$0bbG<g+4h3sBxzz_f8e at 3HTI%8
z2?r0YHWKwaiDJ2=hS1bKHEo9)OLy&T3piP4pVWJ#C*sC;59Dyuu4d_COf!?b<JTU$
zyBF(!!VXI<jLX_*)>mc`TD6_}s1Me!V*j!>>e|1nx&LQC(H?c8E-0;ClakSv+IA<t
zEGZJNBVK~1j}5F4=2M=%olg6l>vD*kbQf^Nm+TtV-Q&{7A)fFuq+c3OUjXST%$yQT
zUuCE#-9NFpNnY@$vhJ`)Ez^L)-vCm^eC|%7ce?R~4pmy)?6zOUMiSQMKTvC5X&_6O
z at 5J(|Pfu(tm4>0EQ+|- at Kjl=(@l at v1N=zlHVa-?J*!;6gzRTK;cj80cBe2#0MKm~%
ziGqADo``%Ld)J$J#vt!21MZD-C!7v-T3DHFYw=td*z2L~UqL=2ClKv>sF6!>e^YgP
z9eGo2u|aztd1lA%_usxmeJ|$H1GH4+1;(p2q>*)1DQ at D*-JRU68RI-K_jI4e#rYCp
z1({(bAG{__-u3h58 at pq-GBc!9dpUC&-5WmyuJGM4%uDi}6!miNmZF|?yyr0F$S<6`
zx$|D?%g+kfPRz}pe*|wo%_%PYOnV~lILzRWZW0B-NK_zQt?K8_r;aO4jdGW9)jL|0
zJw#S^E2PBZI!p`g11ujQP+MBW0jd8%RUL~^D|qy2<jiEPX_;{vvtz)q+qK*CmReMF
zfD}41(wQmg!VJ2vPNAv+)Y(0+^K3_E!~tb5?}@M33A<wY-bA4JzQPD;tsfl~q|*4E
zv)>Xtdp;Leg&0p!ch;W4&Ok}C^<lFi8vR@$=CwZ at kLz<)bWcQ_1pfG(Ic1}}FDsA~
z<4V|bAgRi03zix at 3uABw#<QYcbQm41L%<gmL#ybULv{YLWmidZ`hJ?0zKy0&_<&Bl
zyt{IU*&AkI#w1l4NZ6hsC|#Mm*zmJ2za`&6E%%oNUw|Bp=nmIcR5><=6%{t-;l4wa
zgA6U2kWTiV7lcNwOW$mC-PX<T+bnhq*&4m`fSlr?z89eU2j~l84L#A=DqKn@<VrN!
zxLmk at 57)Qi{1tKC)xE-ejb1Q1lO&G5K!K0lcdq|&$a_1i^b4x5G%Wk^w_6!}nc1J5
zPp<t>XY!aE84F`$?95}#`@jWU`(MxWGZ}2Z2z5_)KjG{yC(IPQMdtoanqHa8XvESc
zqmaVs_ic7A?z2K&Q~MS}+Kke_rW3kYtkFaX(^x9pw3QPE(i!23s5*az9%$O$-w;TS
zx9VcilI=tojPW0-)3Wl5iCEL2u3&s$N$GJ{%5W*V`f4Nvm<pgx?@KBSx%yV+JksNA
z8!i-UT7K1J?3)E~pZCqE93r0<rPZ;0#o+&NpVq19V<7CkzG>h;HOLCebmGjSWtSR;
zL~B&z8R9M}eXO(1`9e7%?v7j^+uG&qmXtA9w6XJT2;YV7$`#~Lhgzt~_)NMSk8P3$
z;;wDd-+ZjQt1_3UAPuk4Lka4u&EQJxTq3P4%C6H%wf(09N>6!_;W<{a*wQwH`wIf<
zB1IkRaTYNuom696xuLiJWZ*Y3_-slauTOx}r_aWIUA;xhlkKHa&Rqt=6wR+=i?TPe
zSVPhLjXLQk!&9Y6!;_t*l{rM=EZ<x8HFLhA&w74oU)K3@=Th-Lk#AalLZvAsjF772
zq!B1hCuPZHrEO%F;;q?ItRbF1{cCc54&<NR$DYrF{K_WAmmn1MYBLI<1cO^64L5D;
z-*|q0m>FQ2nC^*TM|t!raJ`ZD<kxnLLP4XxDuw2pN&z#qTO(%ed)ZmqX9*;TOys?)
zLaG%Powx!#+9feZ8tPjXxHQN*kBfr*1{7Bwjjq(phnkF=Iq6CaGR`?gOPX249Dnlr
z-$$co;MWJgEzxN7BG~NJXw<GzXkc9i4np at 5@`@sh`(wa|tf2cr{{Kzz11nj4C;Dx-
zQ9M!nm>jY+9>PM%lX6HYhJf#>;0F+{fRG}ROj(ji8G#5Ifhf7q_rbfbCPRoK)E!!b
zw;4o*yplMMPwdwR(obnDMf^ATPP4#JLDJw3hb4o*XfxEW3q9RII$4>cWn+{M-T3Mc
z+QEaP-0n4vmk~ki1!;#f1D7MZPa8T)TQ at tG6qUMI`~6YXAG3s2EveC)I_nzq8e63S
z)IVaevA5Xn*iv1Q>PveU_+UGqG>K+Q=_gfUjy*3aMVuieiAHeg#cWA?QYp at YRCy97
z=Dy2{GtGj&I?9;|Q*09GT3S}Ju%N|^uNO|SmOEDgz3+<9{uO~#ke?ZP66B-40Y~Uo
zkq_>mO9mMF3%U`~yfLDQbYt(Z2lxXR%z>7zDcEkilN51fB*|XDB%k2y1?)tLZ!`F~
zYF1Aq#cD9=3 at NpKqc^$QpeJ41Rueq|`d=(*svyp%IAW8yBZdg=WaM#XP(LVedlPDj
zCD)gWdR;jqNx6ErtKtaih}_qswWtZ}=I#O}(L|;t#30*K0&=0okj?Q5U$qfmv{U%H
zQ#pgeXQ@$=YC|tc2e;c)4P0fr3GI!f-6R<>J?&m?tRa}gT?c$xMtdFFD$-tOX)$D*
zYZZa5b1YOzLR0@}4L$)aGzvfE*-zC?=RUY1vJoG`L*5}n9Rf$O7lfRw>SqIY^qT at U
zfNf=eUZ5gE_MPg#-;z<F59Gz>!7~M+uR;y}WQ`$X`po<r$%xNVkQ|n#i9P0mD3LNm
zU+9W7VWh{hC`_b;c&s`etH4;B!LeRa#ZrKK9a8wvEl&CE`o_Et=1sjo^r at XpTW<#=
z6t?KEzTLST+jsRX at FgDUl|~TW_?F!NtM>N(FSNIDTzj4WXWQGj{ePjod&jl6<^ODZ
zw+jCY?L9oMz3u<s+k5<WXzy*%&Rh3u`!~t0{87A>e;dE<LtFX0f+8~Fwg}Lg>0-NC
zfYwYA-DZJArHLc$mfN7U`gpu19?!+%Z3bEd?UmDjd%<XXJD3yDQUkQ~B?Gk7l&+7e
zI~_RBqbl$v9yP>TI!cXVGw_E$+%?-a4f(;Bj~7o{`7WMO9B>G3K_mKX`zaUtvA?1y
zy at fb+jotn%`x*{p;m8S~Ed~w<bBuEZD*p|(G1S<>n+z8<c)lM>=KHf~FYP{`Xf`B2
zU!vW%H#jF~@&6oM7~;<Yis{EU-$k-J0`9-OodPBKI6 at Bun}EMMVA1d)8&Q~rnkl41
z6>REM0ey8_Cixh5g~_lzAx7y&{f(pkT%VRpVW|(lHtB)3f(g7Y{cmvva$Lc`jAP|E
zb~LV^3;d`*CvbhgIWVjLKp;25+ZbXH2q%c=gtb&J+~Lz;Yfq-yY7~M^V7EKpbRHD$
za0)`INIRI|i=9jdgLouycshSidxz at kB3Uzx8%GHGfO>E!&~eArBw63K63Xk96kvw;
zirv6rck*~6sFMY(Sk%dPX31>^c%d$Ekn=JDVsl1U&(U8`624yrWqdD}^miLkwZKZu
zjIP9hy~WV4g%R`6CgBc2W2s?I7q2&IdM4Rk(D1f0b+2u{MzHNv_t{pe&vh<xHi$;&
zn*()W at uK5$y{HpX+le&MrqB?l(pILafz;HtQ^STGwv`$NZ~r^r6iMfzu!yN!9&p}w
zQSChB&yAeKUIT`3m((!V3j&pIa=<+dLMw~-K3gH()p26=TEdWrXhwgxu<|vo^TdBi
zvG>_6&ea`X3&sLX^Tp;0!8l#)EQ2(8a+*9yV<dZ>mW~yI2~zA53OyRZWP at Mgvz>L2
zu3S!64(Uv!rQ_f(h4_$QgpmYn5#~8luQpxX-)WAGPsAND)8i$xwiVE?@e3N>umN8Y
zx@||PX5kDy`h|KCW{hE>F`e`$I5P1ZY9LQ6#rxD%h3aYVPN=$_uzyZ;?K*xPz&!W1
z<3w4M+`vRm7Acir0u|wkIP^Dlqpm7hN7ds3PfzaqaX%w4KRFmViQ1z_Cg48Mb_2{?
z8|o;8HlC!)$VnXU{;Yrj`rg}U7E)BCqZDwNVUfQ8Gd}9fzfMIsOhvdKq)LHQ-vS($
zjixg(H5y3)ruJGofZ?CHEb?2+O}^w%`074O!J;s}N at Oyw*9e8c!|zXrSQ%SmDWA67
zMB*u<|2^f?a>_hNnL^gX97K)9I3t;K at c&o*jtC=@abL``+m{0{nd3K^YZzh^9XXvn
z+(EiD77J1cf!GSVw6WXrxG%?Vvj4(15R2o|XdT2o;5Uu=E5Yxy-0#c17DiGa?C>=|
zQwIK?aeg!S1LORQOSC%-<NOxz7mf2T0soqD{&MiQjPqN;?;Gb|3jXjo|1BljW`3N%
z0{rEE6TYzu7%~|#q`B5_vOF%3SQ_`!5JK^V1>4$sUo4Ey?0|MO?*+<kvaiuxiMV~q
zFzWacjS?se(u at rL@1dp+V~nDYt|k5IfClh=72b}B#{ezqo(xoS5`F_SlP8wrZsITB
z at agbG)Gwd+sY<lZ_Y{%q7)en~{@i!CV3hJ9H^`(~W*pyUS)d5mjLH+X!n$qNtI_qM
zU at 0cVdiCmNYm|KHV)mH?LmdYz&PAm7K<#|M|EdX|&=Hyqu4Gvcw?dYHP+#grz#BcR
zH$OEKU4}T<pH-<Osu=GKKLzH6b%S$F2l}ai9&pevJjteE67z3={$hUV^Oy1qpTC at +
z^8A&2=J{bM(XL at 9h^wI=r%j}B?MuQ-Oxy9cvNrBW`cd1_lp`M<xpNdoGBk_;jm#fF
zqbLrIbQv0Z#o58%NeXanU&!k at I&&f4nA1j&INO*b+EM8ECPN86=*{mz(o>FTi?s_H
zOLV`;2)Y(#r{@G+bY}4Jpey(|-u<Wjqq&Zo4*F6H$%=#Bhfg2uIsD<lQ-?n~_|D;v
z559X?I#_Y|u7jq-RR_xs-+j=WnnE-O7lWxiXaQ4qa0!?Rtbu63P6S&6wjOL9*hyd~
zfSnAs9&7{HiD0LIodk9&OGt7mL(<0J5a%&`X$McRJkeo(XPL7U>;<kJ&gEd=&@$P@
z^sxd{Jarf2LTZv>;LRWmrIY`QxA%c>>bUa7=U!d?GqQDU#D9V%+ZaQLkqJp0>e^RA
zxiQ2A*(HgqvS9wyA!*t;A#JjK-7>PT!6A-u9AjuojZBF#UDh~MQL<^;$UqZA(u8iK
zw%d*NIfS~l)Hbpq;1ET6=Zqv{lXQRkKJWJ)e0=Ae at BE)RGjq<>of-E{vUz9Rp^EPW
z+TxIQ#uehQQW7ozew)ect~E*S at 3*ZoS=~PXsu|pt at Kx|T2vjHd-zG1MfW6}W^7WF)
z1!BHmz_mM|f~TQhjT*~qx`4o3eL|W+kNb&V at N(e;0Tn#wB<4Dhj^!}lG?%Wt$8Wca
zJGy?@^+%zLsyy?BXQ{etqj#&fL9)-z at ->{A>s=*D^99K!W?hpc at rXgP6c}Q^jAg`T
zNoG;-t at 7r^p77;*b0yL)`0$rvzgHy at Q&vJ>ixQAzgFg!-&gw98lEX@(4k&Iw1a9z}
zO15TGM-?Ff9rDUFN6|QOIC&zMi}_uLC5v#swAGZ={_L^CE%vU%9jy}7G`2vx)sPj-
z?#c1w#P2?~B{dRYg!i%2_-?L+p%f613jYK~*UeaG91Wls5rHE**|boCFf?W~0hek`
z&u`@HOYzX**has~F21kpshsesvWvrdM2B at fRjdarp=a5;VuG=e1$MEOJ1>cT-H&vk
zPG=@P1*^KhDX(dpA}H?Q!i1H}PR<lTcexzkL$^2yx#*QT9sv6 at J9hu|xrdE?U0`;9
zI?P=&L$?Gp{b at jDVm#2dtN|@xswB76YxdD8G4%m+KhAm!LhnL2ZNCBN*`arn;fn)$
zr3`S;yOPKXZ%wR4DpImQN06qZlo43r5;<M}0 at rNbIzA0z%^aTxPZ3Z<|4e*uD`!W_
zLWdjTtWMf-Lo!V%U_ at OvU>H|n8Dw#1JQWJ?k}u5hhPF`^dnH&)^-`wx;`O$Pt{Sqt
zbB1$D?`(U8o(_M>9mnrjaDU9oMa^bdX)hL+?dF{pPLQ&d8tK`5;#uuo4Z1BzElA88
zvES3U??Kf1L0(RST_#1V+>$%T&Gi{e=d_)7n8|wjVd;a<<prI69Hc+UzLWV9T?X^g
zmqJe at cH*#nq?>tZhhHa=f*Q!r&~&%Q2Kt!^aw=-gQVj8ozICC0iD!HCzIyLw&z`0a
zy$?uvP2fwjVl!jec;<8T-zI4=7eO~EPUt4>JjjI5F*7!6k_KZRo;j4KY#yEtEoVqr
zDQ;0R?;+kCzaWw3tN at I<W+C}zDv at p>==e*)hPw?c`M$}&9nTjGrfY6T4naGu-jRpn
z?^=UwCNv;iqYeupiT7W0SjyZ*yqm!?gOY<LxeNNtmdc at xL`|i0p4&kE&~6@@9dt at t
z!PYVtFH?BQsE{TZs5B4PT;StfvprX!#_drOx+VOH)5={us%zTfYcNZcpjA7r8_#e$
zx#6b6zDC5PDzi at 7+{W*JF#beCe7`6Dgk*nCXoy3YzpyYOB~HRcB*~-OZ;^_2 at v%R5
zlsECQO(-q+o81-7&?%_>lTeQxZnL!GdE$K&v_qAMIwU;%g=(Th8lI<s78os%(?Byl
z6P{;O;eAMP<X5Ut3rOaxtlyX(ozy9z-#GIm-IHUwCpSg+G)xI+Nxj!f%#WpC+qXg5
zqSPGqUXX|Lo7YKOnre!(cJoJHYU)?as4+S+2{}+yob at y><uuhCU4JIsTttail8V|5
z>~^h<iTNW+y(A_}VtaaTb>I{B?IH!MD7|z}y9s}54?U%jVsky;%z5oD-QsAl^K356
zUKW(5gp at pUK5<s^Od(Bl66y at -;aL;Vz_Si_D^s)AELlo)xW05e8{6xXuFJx?Z$Vn$
z#F{43YMDPNEeoj*;EBT9AuS7e64J7eg8lQo{27hc4KuNJ|E$=e^)||%(L2@=qqi%T
z?~vk=cp*cDGii>Bcs!Q>g5L2}P?79yJi~QorpfE#Wlp;>jxl73_>(cjGdgdV402>A
z59^bdnPD~pSX~N}7-mQ8afWroPHViD at TRshiNMS=F`5Q+`1?Co7pw^15zI-<=L7l_
z<|I7*Le!r^!Cvr#y^ts05g}6MZeAh{7bOeGxLH2~EQLI_(&+Gw0U7SVH=SJ4B38pH
zHVm>SF!xnh&4wY5IT&_4-DxI$-kfR??9v=`DfQ)m&j4xw1E2vk#PK8%lSn#}mdM*)
zyPt0>?`=xF)sVNF-xhWdQQj0cI;-}^;y+*(N)=ctvpK<Dbw-Ept?gBQovRq#0iCNH
z-M4k7ui~z77zM&GzUg?|yV<c6dZ^Q9^V%G at LLYHp15KL02D1C_L|uFX*k$-GnV;#*
z-02@$IbyBNB%97!*MlD8*TFN}Y2F!uP}72)8#pQjJ3FTZ at OP~2vjU(7h%0jVn_>D;
z`N)j*ndCE<n3?6|c7`?(!eh#+G~nD5w at xK>w^Joxldg=~=qdWak>7fAy4&3n=%POV
z@}Y~vs?fh4zg=$SB&ku-IZcgS&J~TGk_~p9A~Y2od8ujp3%3Us)~cw0=fw|eokF8O
zSka_A@^~=k$gM|L9Q}?j+glsHAZ%6PZX`3kJD87m{^9S{EPp(ApO5x$fUak)<(JGR
zJ<Q*rPc=zin_`g&HN<A(8~8+NS;#riUw)W1r1cWXZc~HiBY7pXF(t9p5W7F1Q8r7N
ztp+Jm$hvOR;Ee?W;ol6JLGDPeDe<Lm_!w9qqO~@-(J3~z(k<82!94uc9P!{rySPo4
z!eq1g9%57fLbjUksV-`KO|e~Y3>%ua9o=wVXts5<20j5^0Qq6{>P_fQ1mY0&Yt38-
z8PbgK>>HbVMAG;gTD5M8`PZmllj|VO9gVL^ssoa<l?W~|o_^Hv?`h-4R0wGY_&i4i
z#jH4RPlI at bqW$xmWDdU=(hO^wQ>p&~?`eo~-2~5l_0Mq;VWvx$p~kaX17hgjPv#Az
zJ4F8FQhmpY)Z4m_6^I0LLf`o$H_F~FMmcJB5Rp`flHd>t4Ic|`>~kwMiawZ^xMhWs
zs5`m});I{|wz+fYhZQvtwuaC?K5_N~#<@~&Izd&YLsYoh*k at -cq+tr6Y2fX4o!#zp
zS>1lnIE=DYIO8mOTB^wOr(q8SH&Qd*0_~Z{zP+|b+)&P_8+SDGxU>2#nq{OKfl?St
z<Ot#D2QZ{L#lPF#edmC_k1r;(3D#Q#zv!txew0Hb^EB1<7WYpR1<HC^sNx at 0a8Krz
z;6mUD@^lgIrUi?6p=-P5KLUez(}|mN+ugai!#?&tp5q7$q6sx;Vj?rnYD5zyy~Vwc
zMg5p=zzDvXEvg|r>jU^<)!LtcUCQ?sE3gVGIlWKzE{7hHN8R*d>74z-iyCOX(|A)$
zv#>G;EX4BO?amW45Bx;L=uZ(nQht1UW7>eq?P%2F>0ZiRY#-ernkgFT^b2neXJeZw
zU}cVReW#&~Re)!?mxPb$@LP6}XW+#?2h?^;Fi#SCKq at cjMn>6p%^yVHh}w=)l$bYe
zcAH%_!UEU!q|D5wn$W#aZ%PLTrW1jx{Q45Z&;RPzblY8`O6Yc+<wNhXlcM)SXkPgs
z^c|o#y{pA<OFo;f)PtlxjrSD at t(0T^+OL$;#Y&A^!ro=2=IG*Ul2Q}Q!!HYkbj93T
zhrI!1o=$Yo8~GIcln+islIRXV^RbtLd20_73Gdm6cPT=zHQ}G|!%z at Q`-Q0P3sL<S
zqG^*+mN%A$Aos~C=t(=shlO51xyN4Vwn9tmp>LiexX*D~<C5-2FDx3K4QU9$jol}u
zGD@)CkyNjwK`-hQO`jcmrn{(_>n#fWIeH4x?I*32B){9>lnVM`vd`65>O(=XfpFbL
z7qr6$NSRBNF42Z8g-a9uMvy<jbwChshXPIO!+Z5sc0bx|>3uX1fqWcfFO|q4>R78H
zpLXkTmvf7H2)|Ld++E<li}nvp>?i3s-dz{8hyIH9qnCrF*0m%2zy;5U>iL2Izel~6
zC;#CvpLSl5M$~wtcZE~>Ewo8RpPJp=c2}P&xJnj<GgRXgpN4fN#&_ at NUVc{N%U1Y^
zn{omDL0d=ps9Q1n$^xqH<xr31-OES03mlZC1J~fj9JfAMFa3X6??*2z9v<w5ehV)R
zZoI~Y&vl>dJ9T9j^gtdlQXRznpt~;gH;_FdW>Y*bL8SRgxl$wUq{ft70wTkVr9)29
zVsFtcq0vx(AMT5tuV@$!a?y8JLKcD3{kKBt|68Hb{=Y*hT;E-N4XfjyJ({R}c|5MH
zjz{+lsKVdxT at EW<k>^&rq$jOwhe!Vh6+3^36QO5T6GQoGvSRLPa_g4pnNq%D5a#0Z
zr?t at cSuUa$@%IL*I+Q+C-~HZ*rX?4(b!AH+O{od!h8`Rdde4I_jVjv$(cbr9c6QLg
zM!dCJqW#d1ORh<Mg70;=%AFThaQ=th&kl_$TzF~tSRWtR1?5*oc3)8xZJ&d#p$`S~
zysy8>U#;&hA|R<pBfjhtP#^5~;T)<F0Xq?aTJ2|Z1&sVL{*o$~2jh!WJVy-?zGJ3e
zm-15_30VLs5STo?4=qs?J%ei%fz=hp?FC<U#C=ZHZwo9qd($;z_$3%!JUb<k4<8E!
z6{!!TD$<DK at k;%SIIO$clstGhCFCKHn_A@*jjNT at C|Xx5uTs>Ze&`=wkwQVJBS*Jj
zDpS+IGGZ#hymwDWPe)-!r0h&joV&X#ac<~tV=^kh`s#!=U_Pt`CbkajS(#&ibpZD{
zAFt__=wN>h^!!5nrc0 at Sd8Zhp*uwT!FILPiKJC`7%rglGibB6!nJ1Fw61>aGHGBP)
zwa*bPv>lK0Q$W-GKR{nu-Y at hPHF5!M at 1uC98{YfY$Tynl$Tfpqpm~bLcAAi46(OM@
zoge;pyqPuhH-#3fMRM64K8C9%%BZ65Q=n!GBZ7b0Wv<!nDo=|%V+sEP)|vO|q5#Z^
zedROWg}Lzq=*>?8mnauKkGmDXN)~XYBbg+V%JiaJ4Rgb*1G++xOTYRv+>;iM{}1Rn
z>E&z~?GMqX=ursq#)(ms4U~h#H;@T^PIRL_S3h`NpOb4q!`iBTjeVWHE%EK0p(nTs
zQvEZ2g?_C9=ha?oZ_(=bwJUi47QG;w<8i0O7`tG@*?kyvrmWBDOj)2aN!xy;tXEN^
zq*4j^Zk~NBYBL;Djzd}4?h->!$N3A}hBKONbjbdwX@{^Q9;>L^c@;3BcK~f>7^k}A
zjiQNf`s)lmN<}KReQVPWx8>jp+&9jAMMID2CxmOZbd(PjK<y2~f(RIBz9jkGeNQsn
zG5p1;*#f at D@P^H(G^E4dYu!2ci|zD#ZmiGrdxANTFQic|Huu=4H|>D+9xM=QAP!3Q
z^zT2ZERm)QxA(*Rg{OSeEs{;ttR{1B!Br3>*&o~p(h2r3&ZIbt!VG*$;X^^3sg=R-
zOE};5*>LW<QV%nl0sde{R at 5-=zIWXZeE`)=MKLvhnxefC#Zj9|JC$b2543&>G&})h
z-V}ZbR!-(i^?3UjeGv5kKzF9lKo-mepG#wM7=>x36Fvl2&j_Bn0&N=dz(`ap74B7T
zA-HPo7V<;fL+rT~_Yi-~DHkdToe}z-cO>-ViaNh8waXV!{T{8OZhDhcH~;GXahRe1
zmXOf&ik{nCPL<%QR?h at E=ai3N)zb~b912oQnHHqS*<_N|5Rt9AT+m{RC}_`pN-)>2
zx~7i+Kr>-Q=Z94wX)7=-Olc$y at y@$oZs&Vf;93zVa~i2}HCeux-Rki(&knK-_;~Ce
zo!K-a;s)wjw=^(wRKWeQv7fRzaSb(x{zf0du?Ctm>VZ-GN}R44PY+B_SW<Kgo~4Z;
z at T3Wr_R4VSs6b^1{c^JGFGtUGH=I)|mR at _WJJ<<QH=|#L_BQagg#G6bRm0)`a7MnB
zvEizF>BxP~$Tu%+xJth<@>QVz2`J}?6R2B&@{D}N8F}a#hOGhW%Z$3)8F}!pK&>Bf
z0QEzlULUbJBisK7RP#tFP-}sDa^y?S$OFG)R54H+8Fia8Qac3HwvpvP)iZ1vP-%=>
z>WqA&4XAIAECwnMsQQuo4Uu^phZj!%%_#Ldl%j?|4g6{055L*a!(STw;a6N>%`55f
zmjQpqVCOabMHGLR<Jn5<$948{LqrK50}7<C5zp`{cQ3?Qc&t9s=(f=h6^m&v)m{_&
zcGK;_g)j=7VAtd;DpwCThn6FTD@^Yl5nKgug(cm%-wMB1zN?y$r9HPrIH{cqfp01{
z4DIspf~!X;e6yCQD6?&b)e*H{?O7QRJYO2%J$Lrp>bZ41Z&WoVNG3W at I7DGSm7XPY
zd%p`gXh|;3?DdZE-Oq}-L^q&{XxYAmWL|-6SC4Apo5iV=U|u$SJ|&P)mR4^OmZ5h=
zgin-NGATl%`9q6%iKqiJ!wtQ+<6WP<cYp?vu=?wO(gn>uw{<_!eY at 03g%9- at HhL!Y
zn-QM7 at 2F7?$D8rgG8oTkL5nh2v4doU=Lw>FF7Cbs4P##7o44i<0+(=SIE;KnA!EBP
z?RMvlHqt+puBmvO)==qyquJ1VR`K`jap at lZG<283jenhulv*k)7U<PHnjcQCLg at xv
zc at nesGs|FA{AXG_CS2BhtbMucs{2Ykh6=A#EYKnXYR(Bhp*@dpWu=>kWx|!R^m`TS
zabK}A!1A<o|GfKJcX4t>Xl~lleP at zx>G%WHBOTs(8CKd)ew|3CrC;Ip_d)$GzB7m^
zK%U=SO|&aklVvc+7p|3OTmQu=DORsTHb#u0TVuOqD_4i#P<XmxGi5XJ#AfwaR+HQQ
z(_bL(zq%`Qzq7rmS}3Z22v5Rs5Y?GruDqjx58dA!Vdx@;zKthBCPFE;M5qLhesqyy
z3+7(0Cw>VLU0ZhUBX8tsys0+QjQ7q)o`L6q$ZmKZj5M+HLe{|FJ$M6)d)4SJdMb$L
zK~yAKkJ%z}-;AV9GCjEJngeF;S;19_TE{+xS<4Llg=YXy3+AnkU%4=#3BS!OdLG~7
zM3mI&^pU+z_0G{D-V~>zZ2Z*dBx;W`7<o346U at zbJIm-A=Q?`N>iE at QL<^dy4&*B*
z;eWM$Y#Ob-Z1^}Gay5nD?py_Pv4-_hU2{vonA}6S_pC~>1Ozgj%s3lO>@_psd3hVc
zL3nNqU4Z8%q9P`6YrLAs^U0lpZ4e`i<dPYHZ|w^t@&s$=AH-$!;nhS?ClHvMH)5#1
z-vTy2xeu{fSz4M_ at pz~`(g>}(#)tO--!rC(xD#?i(=KT*>plkQ8NUGSQzf^8G`BZ5
zW9h0b=?1XXrYCif7AHr{XN6bYuh4+;75A%@{oW;VuLTURf~EJb6#en6@>2c&0<Rf=
z<>FrP5_)&r?8sAIj^=~ACs9%uACZ#gpZ{%TUc2BFh=7`HD?z<hJVJOpXM^oP&5s!I
z&H%3*%B?U<+SGZd=k<FIhnGlI^yU5A1A=lGR@&YZ<ygDqxOgVnZqLA~ch3df5&6J1
zN9o*(r6DMXn|sOZ(R*tywSe99%?{yGhX0m`UdkKPkEY?i6Y1GOy`7VEA6mv*q}DGB
z5bD0Mi~%v3X7j)_=L(|3n}|*cf{6$L-t#pde#x;QXoIj)q-8V%w6OC*dw_SFQ|l&O
zd at YUHd|;6zTb|jvIG-eV<(`D5m3WVmz!L9LQnhL3z$$E=&<&r7h<+3F`I=OlUhPW7
zgL<zaW%QoQcuwf4fXd~G==x@?Cb#7EO<zrx{tT?eh<|pfM*iutrnc5;)zr!bRs+lq
z^PNQVfT at V<HCf%gCXRdAMBFbYL$^YX4|`tpjIAbojA3Q8hODCxqo3zd&&kz9b!bx9
z8j_IFr4!h6B6?l~<lz+Jc@(%#7?-Ho2yE1E=$o~gWNadv=slOzkouZro5{E<>yx*y
zkIL2YPv4r<hHDaSNYhf`p>%5q8?~QiUT--Vp{OlsCURPm+##Gln%Tr{h^U5#1;h<6
z;GV*n@#YUA!v67!x_`QsxC?5^JoZjhj_e|PsZ$|IO}|+g9BU*e=z4O9Rzn_z3O~C0
zQq$$98XAFHHm0GPOKRHq at +R67`r*}j1!ksCKcSjYHJfD$VU~dv<l~=GZTDl{eNcl!
zl0e?3`Oun$fGoSL#To9(dtil;@C>ld4^dS_GpZd^JFFxEBU%r-StZyCZ$v9#bwgc)
zj_w-U9ciTbsri$Bc)980r=a8tl(h-U+I(ftm8bEPH<(q8%&kbAbP2O-Iy?PM>NBCW
z^-0Ogn?gUFSk-dJ1eitCv<K?3&s8UVWy2+E8=mQ^6H12uG^}+!$*Dd$;i}^oj{_#=
zxt>g%H|46+sm9ZR`d8Ou#J=HDJvXd#JxNvL8(oi*TLAy5ED%yrM>gUqvEbh0AOg5j
zXW)*;g7I6E7FO%p$H>9Pd{-T(8eiPFaD470{JF+lhTqhfGoI17WPHvfzoy1Q=4Wig
zyjmyu`~XUfCH%ps7I^++N>11E<OzIt1=x45^*7>4MUO{>QO%f|Zl`<bF{u6f<%C;$
zUCt8i6KPknq2Jf{rA0cz$NHv4_T!FI_QvquzV(V0_5O+3MU&8Ug68XbRbr2GL&4N^
zaYn#fe-rN_67oKlc4^w=`64iUJ&r=gc_kal{MW`sfsDq*0Rw%rF)yHprzN0)=hA=*
zp39UE0{TzQ0j=^bBG>$lw<s6>tI~y!VGcOUVHxR`<VfTu%F%*|(}UjxZFqrjto#(l
zi2~!qohs{x(ugIMi at 1({<uYi+&^~vu_xj0M4K(2_Hft_S#Y&tqfGJ)U at Jx>z+vh`R
z?WOq2iF6 at 7C~cxo+HjTy<SVK2qNN+mYh=5SKh(l{_sp=})x at dX`D}hk?A2}QdmG<8
zDsC80Rw(BkmlYQO7_9EiiC-Zg&D+6_+yd+KZ9o_IeFd!56<{N<QePHQCBa%ISMqhV
zB7BUMh(K6JUuD87eTECX%545;0tX^$U-rZ}N14-JALpO`LwP**cJ%FT>1;-C^-;}*
zJaLqAU8<C28vDkOC7=g;4Ez*x!ng4PJo#>0 at 7KFkz4IlG%<H`=*m+b^=!Hh`Ax8yQ
zxmr*f0^n*?iqc{^F{jrBVdwQ8#9zJob at Bo0A!oZ=ke{@61hl~IO>(<JcQr?(OyLff
zPGgiK+Vj%Y#;eL6>F(B-<r*?D^nx^9xFaw}0j*j+O at _I4TtD=J<35St$y<SRIb!r+
z3=H28mnE(hVq^(-jPT7C at 9y>D-gvFu7>^r$yS;D9>xj`=1>AR~tX+a{QRpuGqDqd;
zA=1^St}08US<1`M3KUWhn-VD;lWXD;{6$@wuHoZ_EvmS2i1$4;yejm2sfa$|AO$35
zk|OC>l{869?~u3x-Oxgb7-m6iPA<0|6|zXdKF9j1c%)X0M`DkdfETj3zjml=#oh6k
z(Zq9qWvR at Uih6WXM4wCvQYmVB0#ey5>#W`KqB!x~B^71V%LODJE{L_ne&6#ee6!<l
zs)q57B{?!cSj+uXy1)JRveQI{ekD~YFGC7l{ydzA_B|NLap`zr-$Q`~E}bw7Eg$L8
z*;f-We|%LrCq3}PJLDP@`SZek4 at q0+{~qG@?>iaLxpXSczHh>K_v4u(a$Q;6xnnPp
zzPgWpI|F($T{uE-mUsGza|ew}-<i+HKQcW|Z+@%fkZP!Yq*UH+y{Tc>>o?2mAcUR7
z<E8Nje(}$z`KX`SleamnP!5aXe#ugxlQ`jihZS1mJ;sefeIAnTXx=~6C=uYHx1dZm
zxfoJx_}8)~UNSG$N#s4fMAn0=|IRC~NByp1&VVQJ2F}P%C}|axwCaa^;1|$ZwjnL`
zyX|ZT=N;8o_j-%92T0-!Rb3kV)9HxfKRXTTM5G3tP8lpaS8>tVPTvm*YY)e-1o9<S
zgcK7qKkD}BVO2M~)e6`Amtf8)=lWjtrL!|3rnv8<GFbZ4L_A5=1L0@$7#gie2y20m
zSEBtc4;PO1%VnQ=owmlKP4y1vXMetMWF*a5)Y#Lsik%4#ZPL*in3g&#ydsCF at jWJ<
zEZ+H>p>Ge*^&2~XJM`f2H0a&5v#J(5jK0~Ny4en~ctr-y%p(wLt|cTQnRSZEOwH^U
z at fT6LJ68MgWM{QP>5+i0bj`Ylm7ahAZo6_ssp&Xy;jUqA at s@P1qK3|C-W(Wb=P}fP
zMDJ=)UQL%swXVIr%^?*Tm7hQJDzv>u=%|btUulZc0c~m8y6+!cKdx^s$8T%7i@=vS
zGl{O)s^^MDHP;Ytb`}#o7x?$64WxUoAd-dhqnQLoNW5BX!Y?!y3TBco&nCvuVUYFL
zO~5f^%Suvf*%`04%ylNQMRHj*4q;vfei8EFNFu~iPZBZTeNlo~U?>5NyzEi?Yb^x#
z$w?DfM2DCaF!Kb~s-l1y0Mkui4Rr)~Rgy1=bpll&fOyKw;$`82_)HVff|C^BH#+fJ
z6HrjcLx3!-t%CYhLH&RRK0m$|MoJyj0%-X$ktF<|cY;4+i(=o7Jppa82-;_n>`eD3
z+UK|@iJ9dZV{5J0fbE61$l+a|{&34A&Wfk9P2vr}>ry<>sw7<yd&gvjQUfKIMU1f)
zRwv*b%V4}_V2wbUnn9Xogd?Fr$;izx0qx~vyGUX)!~57Cm<3pIq#y*(&G2y^y+b-p
z*xjGCJ$jEmHZ!&eU0Jr0*n-$Hq!VF*N^?k`B*MPgljccdVbNU>y8~T$a~<B at ssnl&
z3)S2+%`+`FlRY8l5}}9P^@yc`vgwe9v{kI6$mtz5N1&{+JAl_C53T3NQY85_mg=v7
zOG6IxpP(18SV$Y>npTp`!+`um9>}FTY7VFJNJn0-$rwz=Mn1z)b2U*%FvVyFBFWH<
zh7x&_p^+EmZ%C=UMC2#(LM~IT5v176YS2LN6jVf#agolFw^$Q7-2zA!A{e%Wq_~N+
zkee>o at KzQYZw#4^2!_rj6I>!?q~}9eF}5J|G4S(|pU5S_4N3w_7r7b9cr#!G929EE
z47|@$dSuQF6VP6NyrX(6M|^&uI;Ec!2ro-sKMS$-hckTsF1MrZG^yQ6;?-M8?J;+k
zJKhn09bNgmRub=wpFlbl9_V_x4#q<w{F}$>yXqnQQRa3+JaFYl>qz28P2d`mA)Aji
zbTz~~*t1jGS|S{4fRgGGWrK3+kW1x~<n at laBLqu>H*X*hIXnTQRu7{#O|BV)kxXGE
z(_aCWhFJW*_%awpX)sTu$xfp`zF>kk$j(+0pIL2(+<-$wvO{k6XJ;h&bcgdWgkUk!
zk(ZqrgUJ+-&u}=el3G|<tL-3Hz$2Cn&uGZelMIi%DBmkx&rw8VQjW-H%1%MT5Hg0y
zL?js>=`6X*n#%7M6JC4^e;B%iq_|1xAwOMq^44UGT)?IyhB0!<1eZu3>G=>^j4zPd
z@&r>Wna_{|)|N>*GK}S+WX>>A#?O$OtOkhnSgQbY>I_(^x`irolhf|R-r!ADhMNTV
zlOM-<mU0Q6*SGcI4!`QEC@}#C$emJ^M<;!C#th)^L_WUJUUgnK!QEF~)k0ESvY!pe
z%hlF at 5w=h_N=_az0VQm4FHgvu2`J>^o%XGgZi4GbQAt_klKicc_*;?3G)*MI at tO%~
z1R8m{j*}9yn?%%d#6a85<M+qaTeE)ws2Wl!N|eREwFXO2gb0p|2^#XykrbCKK^o(?
zxz*@9o0x!tzUZ8aK#msq(5Z<W&5#Oj0aUmDMQLjumP!Yl8DnIipBYP?3jIVpS!#U>
z`96lxgWh=jrTpr4H+eZ9-TI`fB;6)(g`W^kJ`^c)w(pHg`|^0{@q at y#QDKLUmrqcm
zeMeMh0vdVe3&yy8$6pu^R!4o;Yt>sta_lw8rA>H_2-WSa#00MJ92GE66SxW7J%QJ@
zLvOd!Z7IL&JovY{&Gz;Iy$Rfx3c$w*KAM*ckUkV)r3G4Q at 8PBP*Mye~)E5bn55(hG
za@$9F{Hl+h)XhMw$vPkX9{7kDzxEN)AeP{>BVYSSM^e1)qXJ%vLyuo3M1Vi(>Ji?4
zbzH~zdiQMkV>7WUkLyf83zTXk1!QJ-7mOD6^_;d=f&NuU74TZ*B}K<qD^(=L+b$Y-
znX1jUkIcf1L8|r0cvglqt8qq;?716s3D87nRnOg?yJIcYmMYS-+jF;EU_B6fM=J6N
zJ#Pv;Z2&zzJ at i5-Y64o|`9&~7+-$XQn2^(1n*@<NC^z1FFKRK>Vm)Xw+(99eJLpu@
zy%QMl5Uvv}Gv3Mc8LkufL$XN#-faQ?5Tt&SJY7dRIJBsMo^7SLBI2$VToEC!R?yZm
zL7StX+hls4M}4s8d9)-_w2;FS;GcyspgqDo1-y_$=i4n$>P+AYmLv@>;F)&IcEmFQ
zPtf2(8U+xSgSZ7kZha5#*)V~dpdoI8K4xmDKL+kk+nnJ~sx9~43;0ikTs|3|?@7=Y
zp3xAVhw%JQ<=ua}_j(*2;?xg7TiuKMEFp~n<dgXzeHQXL3+}mOoc{s%IY?(95uP7N
z&`+jl2+u=!eo}b;9Mp9w)JcT8E`_=#XmFvowL&F%UM`Cp!;$z#6VS-RoEVuz8&mYY
zhue-I4e at 3nAN!lB2z=nLwg_Ter;RDP{r$FWNP8X7FGjniPVaMgS7CX5s{qNKL?0C_
zZU_PL4leXU9$<~olVwm^BlJcdl)S(p#iMqM1AD3f{P!W2;yrJ*)k(`Ugr2uN4Q);-
zCr#*S at Vw<%N=V1QgRT9R=QMLqd){X5+a4 at aN5|^e-W~;Nw95msrX}HhJ(-?4NotO#
z(xHpTW1uAabv>1yuf;O#MAG%lQAkLRxP$kG{wZ|dC>IukIkh4&!g$h*A(tPLL;nQ6
z6Moqdw2HpSPcj$qvZ$r8`@`ZG_c>oNkGG5Cx-W`p7r*~GJoEwLj{^?W=kU7E;SNHM
zuo(KW1pPTbIg^su-4nj-_r1^uau&hT=0-SXf#UBJ|ELgoXT%tBJ9q4j%g;(=Qtn5v
zCa`i9j3J#r)hAqK7tiaa`1}!l9FLGV_^zoI&lBdmWU?=7ah$<)pY!XRlw048KH;h_
zMAv)~iaFef2dfgPOQyydW60g$hv|O-3bkk_H~NHrHmRgPyU_>RWkC0ZK5M=RO_p{F
z4!u^92+yb`Q+l^zq74P)Q2JPZY7`DnP>Nepp%pXMA=TcB1l*)Poa8668s_6S!`&o2
zPpGSZ2;Z^PKj;_OZ#@RZ96BjKY=nMwZZ*ckYvfiB2~7JO3eqEqM+8L*oeVBY=Cn_-
z00(tpJ~s4;`eEGui@@=9csHA!)adbcHWTs%)^u1gZmP(Vc6!$1xfkRA)U)2>K&r=q
z?)&;4hb(fr`1ZnSR_=9*zsWI~RZC5xs!$fK(pz`S)>e;fuBmYrJw457(dwLHquL>H
zyveFEK*)4(Gr%>1D}tK|Zq~TlB&lXV8Z*J21 at 3Hc=YTsG+<6dUK7_mp+y&rfgKGxY
z0&dRuE(oy at Lgs_J2;2g27lXT`oRIS at Z!_dAstn_+#=pu^HYZaytLBY=ZTy=ojyVwr
z+?#`)tmb;C_j;^vLmXQ`HgmZQg;sFdgnLsh0d>WeuvF$a#iyr1-b*2kLRMeM^Q|@5
z60+4Qv6d)mRI?TklPw at 7TR>E0fjb>sQ$rl6L`#@evw*WE+rpY`3o+RiVzMp7WLt<T
z?1x-%^H>^*HZiLfu{08`VpS~(+$CF~L}n;a(Qcj7qE-W%D3LW;B5SflRw$8KWnw*J
zPWFsBSsL at C(pZzFu_jAnO_s(Ar7^4WSpS%l{bNp+#0+gMVOvM--L~#G1xi%JLsUo4
z9Hn at b)2Q2*4ed(31ofF(A`%}5RI8T*9lR;Q3!tolUUdL>cA0<%y^DhFlg at acKW^~k
zL7baF>k at nNF4ubu^0<{S4u89ShP at eC2jgZFz6Sy1$B0NTICT?<K_G4kcMiKHD9wDq
z%t^4S3MO!cMYJr|U2Sm^6Ht({_&KB(5W#K%s|Q at qQy8=7DUX}EZXrUa$+ at V#HVG!6
zg$S7 at Edtt1rU_<uKZNp|z(xA{+qntekSNCluS(EdG9Jh1>+vS|WV{Jpg|z1>)V`o>
z;6912%`QguJvMa5!S!yUTD+&?v!MugneXiXSmmn2U-!7R&?-Oin&q8fVTe(k&+M_`
zDh4`oUAP6}yXEXSzQ?>zHj}~F{Rt!zPaqkDA-32L*lubY?p2FG8qn_l3_UR#u7_S2
zWxu066mf%V<{$KCU#eG at CBMbr9cuQyj&rDyT;fn)R at Q}@gSp{!cK7lyr1Na(R`2VV
z_zJg_=C#FUg3N$i*vWcbfbn)xr<=f-%wQa^O*W3lL$}6eN-q%MWgE<iKl1YJd>bzj
z;~5|Ct(T2u=$|iHjSk-y at V`mm$UM-vpA46ofRc?y at PB8zcXMn3q)(zCbs{l=n+gX~
zh<9Gk3uIzBT-!M{%)+{W-nE?vYMU+~$mTkN`{pLE2B9O0C79#LCZJj2>JGE{k>Dce
zhn>(8htS6eKG+tm$+m$0aYO$U#POGt`x5OdfT3d--_x7G^?Ky&aqN$8OD_n*%My&I
zr at ad=@$GBcV1?a##<%dLg>p93_ON79c*(lg;roX7kdOtn5b2ZQ786je?P{G at l4lWu
zyH5jpui3R-lNM`{X8^L-Cwa~BcLF)_cix%q8 at xWIs}p0GpVS^e2aK#Ob_}N4V#h^n
z3$c#G-}MdN&=%&&Z2`O#M9azmlJUvJ+P4f^X6N;AKTEXBqNLmwSpON?L=SC}Nk(PK
zKv3>YK%*>1^(fCM%eX?{AkF?M(%cd|+T-rx<Yh)|=We^@VO at _KQg?fKJU<{Nv(~jk
zy`T1S-klS&#ChFQWNCBgcT9GF9J;lF`qR8Qu?!!N^ITG9b5M^4nN4AA-a}hc;OIP*
z!;}otc_?Wz$isE13>`*kfZo!0Yve_Q1k#|NGJsA<N2h!n^w%NiFDZ6k;O2Mcd1<Vc
zjYjI_lD!4#UYFiP9ydrc#AQ7wPV}I7F(u6)9ng2JH}v365)W4~X_i2m7bkj7XyqRQ
zy at hGH$=<aE7h~^w>^RflIeu)8vg5q$v4`ZTD6=s3LHe$Qz7MkDnye8`;I=6^3lCNY
zSl_$J7sZ+IWAVcCLU~x9P;R0|in)SH=P;c7XaqE|`2tI0N}bS``Pi=eg#L&*%R6I6
z(BxqL3|GmmB$CkNAk>6jnur~)!no)QK2XcV%=m`Tc^hboW%z3qgz at 3tfr--JhxdIl
z6!+}sPts2 at y#bcXb<~nXZBx)h*dt#U_DIkLqwcqux2uLzeX=1 at 0^E;0sTBKYexei%
zmw~>a<--HvmZ_~y^HVsLKi^Z~BRDd at Fb4Bsr5c5n{Q=XF6D{k(p6U5JJrk~Ce*b0P
zIQA3rzu7lx?3=Y?Wb^;+-kE5R&-GBEJs?*8^){SpJ=n#+=)Tx;K%dab at j$YFaqWHR
z|6vcC|85UM7>KoKQZHhizJI;9am8bGn$*)YpVf-_Q5pTvQgGGqSg+bty_&wThY<hb
zUP{*MbNvMP-|H#!-|Z>$lsI3|Q<1;hQxWK?|C4&)*#Tc%6Xx at Op)QyIZe1=zT_E-%
zSlRYE-DL1&PI9%BQ6gcTo(rqfA!i+}@m!Pd|Hi7=0?_?+^18pi)w9xBRWHKY at GoH5
z9*~!3W}2KlSR(vFla<eREGJ-{@Qc6_YIPPpr31P^wmQ)w(gM90>@}-%bG_PB!!MC*
zh$r!T7=JUQVTCk`@azb1mpg1E6Wm*6Ng__WTHU-2xD}AXZI0zU0rz%gGd%A&$=OMT
z9#+UXCkd>V*|BV(XM65MwC7H*Hi7xH(Nq0JQT!@+X{dw7SLU|og_p at E{6<B!GPl`G
z|EIl`<|%_REsNkg{nY;c;#(K+%^!GGlG)5ld3)wdVga~md~9!%zSg3OuP3TFXp$<|
zlbYe^>Cc}I5G4ZwY6f_gkoDOvN0)a0u?G5cU0dI)dXM_p>iwJBT8~ZJKc}s(=hq#-
zX><1M?Qpk=Xd(IfkF7ao=y}IvrnsAn_TPy*51y^;EF!bVEyoAi>W-fspLhHmxNiYg
zJU;9AuYrCW=#ufw<L@{vWCif=Hc4K47NpYVgr^=-c^X1kn`*pU8{%13ng-!Y+UkIs
z*2H^Bn}~PYOq{$t>Eus8)})Qqq~0l!lF)noGri`c&RXl<xHo6LxR=Bp!INRU0$2 at k
zPiA-fdSV1UJ7)9=0gIRPiV(`lk?}MPHxAmDSLii)D%VRK!MF13tvqRn#~z4nsui1o
z6G&{+dZHsSV?(?rGg*RS>j6B`(b@#|{(7$pPe1L?l*Af+4oA40O2UT*J2=TclaFh=
z#n__ocAqMc)*&5tN}^dG%kL;}6OUIO&tm6u<qRA91(0$~aW<qV?ke$G+Lm{0nsjoE
z`HT+i-UH6ZG{vC5`vO|vnvz_%)2=D;D$XkE@&3wt)c#oYv=e^2y=I!E`o8{zu2+=!
zsJ?eL?!`MRLc2FPExc9Yc!H-cJ+8MGJ+AXfz8aqt_^N9*HwVkW`d6%9(PZ{+cH}ah
z(FS;Zb6ykY#cwUNFzVG{39NL@=I at N=l+M}jc(I=zrl;M1W;^~D;oknNS(Lo7=uH05
z;Ssdb>oHYG!R)o+eHlJmqAVJsnDJXD0pz1NSCiIk>1eue*T}d+il<XjoJDlaoJ*JX
zDU|=P!owf7+1BA1Ob$Aj9PDxu(&QzQRnoORaeM&#p-t?~>~*Hv56{$^EH}*p)}n=+
zQaQ|NWa4Za`1 at 6ERBAL=w9;(vsixC!3qlv+0=(Pd&nSMZn|B?J>tE8~S74G-kR?4n
zU+ at hDG~OXZz(1|I{25E&Le!6EO^mwz(`2Xlp6aT`KU_1|E9s8XCF?E*GVo?h{DL33
zQrEiU0d?sT=X{_BT*aK)QAF at m)S3vVEK=yW18-`8lyr%dc70!}YW4)u5@`^1smr-O
zpn~V)H^eP~G}|G5UNXKu8DGTs${{Gl??OMOv;xLssjG5D>5|IzN?t$%DZK|VFDnI8
z(_0;ne+TcgbDO>X)$z~Xqk{_f?p(U)v+3h;g+uofZk!+g1n3&v0n-p?H2Qyv_f$j*
z;BRr%PadZ;6m!c58+K3*{64 at NzQFwuT`H3mbOz9t(zHlHu{d8B^+)gSY9Os7^Bum+
zUAlPx_P%m at 0p?7>{Xya^uqLu{QIomE{MIkCmeIKog5oKrFP_2EfPrg$(MIc6<`@L`
zpO{1rX5E2jDJ5I)rqJ)Dt>pLnUv#x{c=vCb>j0lg7b<rJ)O3+j4mH0AWYFp6ey45b
zI{X*5j9dd5d{g0~Z$^2~s<XVu_96!}`9XFL;t_V91vy>-sfzRtg><YguHv}gXi$39
zQM}a$V%A6PZjiN5F!Z;O$8B*MX}V$_bJL5f$*hl)XW4&GSrm4xCNqBPAZn|U18aDV
za~;h9<ebv~riR_c@|_JeguBMG(=cTy!+R7@{p1tp863c!5b3zfk(AMlpnbgAO$Kf%
zgkEszxZ4XKi!63M$u0j(HOA5H<Jn2q!rTYOXC>V^2|O^*`FK2z{l$8P&L^%W&O|k|
z07I>g$Np^+eLP7&2(+7~jZ5r3kJ)`c$ge)m-nW>D`~E<htbsXY7ScpbGL<uaUKtp_
zbKk84(;x<ZOT=tW_KniKfXa0M&-Jw4#OB8d-?-K!(Rl<~&@Y63<RZKfF7-bse1oXo
zQNfdA?Q{!_K_bMRMDSPC5RIdboWJ&FKmeC2Aj#23+^|Z9{s=3jm49$w6u%(|i)$Om
zB3cm4#owl4J85}XOxXYlD<bu~RcxnX19~y;6cI9s&SAti5V0pfYtiA(5dlV5U_O*S
zoi0wL78dF1;1cx3cl*~-(5;rRw~-Ksr86_W+f)N<E*Cv@{nXeYUN}VcSJQ at zhmH*2
z4!x<Cw_Eo?yKJ{MHlKM(PUudOn(&fymP0m1fs4x#om5q?^y_3}oH#*Kh|5ydGmby!
z4QplNhb)9t)qUoaP+Qdyk3Rsip|)2=@x0usah<OlPkDq=_ at nkAo(>MLIklSRDw};f
z=_zHKBDoh{a!ZwhhHe|Hr+6yL3H%n6>Vp>CHxRllz=v)R{lQCon(KUctC#c?P2z6@
ze))ACX7i<h+&TrZ0<vNXvI3CXaJMqHQL=QmpSn%S at s;77VNgB`lrN8VB}=yD|G$!@
zas_MLacWhR$1jjWr4ZuF%>~}WzOG69(yq!WytS)p3csT3t5f*muJx07&%WjopG|Qn
zmN7TX4_)+(uWXdnCw7h1N5l5r)U(s)_~BblE&bmqji;^I3aPUeQ>0P6TOD#prho3n
z^b>8oc8sfDo5S5la~sXj#txXhw!K_N8%>8OFRfQJiVbH1jLRG8?EhDCFe#V!fWLim
z2(AQ>JEkC#7w;+7O~D)t(@(+58J0E$t6<o)DVURChAG&3hNVxzsu`9s1>3+d;}ooh
zVd4~Q8^bcEVA~m%H3fT^VbiBzbqq62!5(MWj49ZY44XLx`#!^FO~EL`W>3KshRvCR
zH8E`N6s(zH^QK^}44Xd%YiHO^Q?LUJTQCJX$gu1wn1^BJ>*Expb_Gc7@@USK(Q(Sx
zKV@`0JB7D)wN2qybUinPFYaoe!k2XIo6I{!_mQrS8<3u^{Wl=Th0R2F1J(za{szno
zSlSKPD}YVA0ecNF!wr}pu=E?SGk|5>fDHg<ya9U~F!2WLJYbnOVDABzbp!SXz^31T
zy$_h_25b<p88=`T0h at UPHVoLT8?e6sHv0xF0@$1zu*-nWy#X5sY~Br66tMY|F~LG^
z!rz`?rp#0PY?idqKfx^7<@=wYL)^~hNo~+VHDH}2=HXdvZPr;^nY}>|o at v&38_?!>
zg;c}eDOI(-nD`ndo#n at kxzFlkQC;H{X-&A9<^=R$wM<JQTf)twT(BaT6Lo_;yFpWE
z@!Dh<hxq#u-qR3j at p1Ajf0~zT7utlxuU^5<&ZmaHGCUpZ)E4h5{PHVyzb{w5146Az
zoI}{YzAaB84T?{N?+YLt5o|ODt|%1Im{e7xKjD-r2lXc^9W`+xn~f2vO2@}K<G07I
zwDq+)+nU<8pD6Er>ICWSXLrn-OXh#vRA^atphI^~h_|#21bFJ-5Fx=46==5aw{cFg
zvu(pA5-jDcvjM9CtlznHXItrJ>zpVZu%Pt`8e at kbx%WG=<Fw=7)~+Ce9qjJ5@`L?&
znmBb(Rp4W)auw??xn at yKX;$SyJpHjSt at 2><4FP`N(B!nLYw#PYhjqSH%+>o=^`p-L
zrx|>5 at cj~=qzSIxmlNzPof|2EHmOl0%(u6`*U@`duiU#k*vZaGEYf_(Q{QZ8bGXbx
zrmH|b?JZSHPGB0ImD!RT(6;0U)UE=p at RrbG>9K>wS<GDtL<*Nj^42aVU&cEqLwWRY
zDEI8#l5g)@_6I|0S{0 at F<4eKq1GfO&1A#nv4gd!hP}MlNH-S4Cm;*6*j8Pc at Y&u|O
zaE;*V0 at L7G44e+!?cfUFI`Njl_)$DzP`2{-IE(gF4;U&k{aQuUE0(5xbw#if-N at 2l
z=Ok3bwoBn96|d<g;+kFM{InAygjHjyp{1ad_+F-0bd{^pl6W7($61=lA7K0-w8W&?
zl at W#(e=fF};oB!->lp8ZaGvw&Ubp8d at 3!VH$<mbNIk$g1p3cy`G;lfCd3J^WOVFc4
zFq1M_B#~H4o3k{haxd_Y#qMjfmS$QP3L<%|ZAHf>pz|4B%;-goE&&Snf_%NLu;USs
zq!xjYZ?(-Y<tv++-I`ZAcfBE?^-oK2U#(V*U?<OwECst8o>0CtudTVuyT$Vql&rI7
z50va`;?_~WFex0KZTTax!SeiRZwQzU;_D5H5%9fHO3jILFE#hOba73;syicbrYWsK
z+)On0tyPny-A&!|pBGD(wr}g;T?PESjS*5X0+prd!A_vfj5Y*2FV1GvG at wLAr3E|T
zsb`_`hKDcCAO6cl)9^<Z4S`X}BbE2pAa89yGy&Bmb5HqHCrf2a;CNyvDca>)dn<88
zZKca2H^JZhLKWHPwo{v5DE!{zbpfzcN8RJ=>EIYg_7R>}6LLX6ytrE=Gl<&!G12bf
zY<?nkXYMf$ek4&M4yRFmyb|Uv(qU)qeN(`2w2kuiZL_)kC&#PoTkD9O%ue~vUkm93
zghtZP6#9?StjN-`Q;}Or>m!9F2ll^*xs~Yl2f)76mU7E})G<){=rRvgMf)kvb;)x|
zHD7<{PI`gzZah7(qWgPCUb$c!&NpA8+U{RMDOKbfMA(zF=iNc0)JnzuW5ZfzRX%7Z
zc_felzG|9g-+BN_XWyDf_MZg5?THd5%0`FW`K)Z#(zZxZ>0^=Q`<w72(~|j3U&8Z7
zocLxkLl#9?72G72jwjhhrBYX<WM6KR>W9b8b%dCoBf<xZhWQhhi))(20}q?)sCsY+
z_-770Tx>Cj<{GLQJT=Vswv^7X&Mp?4#f_2pb0gXV$IYWeJGcyd?r&-|iv(}ay~oTG
zEwN}eKd&2<hP4pVKO%JJG;_T<XyGX&%Sd_n6Yv~Tkk*P9-OZfy5Y at eS8d|)9-VGN1
zVp#LSP}4)SrWkZozp+?o7X5}|6+HE&dME=ih<;&XWap2EwU|Z=_EtsoRAH9+qY^`f
z7S}ZwQLV$Y=-mp1w01{N0V12HLw!|*!;@GG=SHMK^RNoyO6Fx$XEssJo+*&RB at x@8
z4e+dp&74a)b2c^D#U{k<N!(rtEm64GItTGYYZP9Ktb(>c-&K(EDmJHMJ78LRD64-2
z>s#84Wi3T}vg};M?8dv>?;+x@@A%3}zgOu|%+!xJGC~U+kJNj!{dy%APw-drab;2#
z2Y7E;=}K5feqzu`Tn{muacUx(F}LI<+ at FLI?Z(la=SBoP>ngx2l2i#{s;KrycU?R>
zGVL;7IY>29M8w-bwZkgh!6!@Rd$<dlEmGW+K+K2`yJqX<hQTI=h>ahVj#WM*jUK2W
zS1Dg?`w at 3x@9>u)H}z$1<Jit~!#YU)*2{cz{vH8Zw2-AGhVR60xh3;7K~cRz6;ho0
zd>YJq&y?<|JRevTQ4Q*b(^(jvh2hcv6$-w6f!PdKF<h9y{Q>snQTR at Va})R=jx_=F
z`2pb-T29DQC5HBGpex{SaShl?5jWLc0*mvroypd|_Yxm7g#JS!!pvgsM|$>73D4Jh
z15ci%1^6W~*qGVCahTR6w0Q4Uw7{z(9JDvc_0C_7KuN;;0!aUS1ZzTgQmlGD&7od#
zpGm-5B{Q=Ei^2D$gs&>)>qz)!<pkz}?}_l8BL+M%ernvTTLaUoVRE?vT>&ot)GF{$
z!~7xO8}IOTptRmYF=IG}_feM4t?Vf#&!>g&jBATmJ)Z`$mP1dKEPYKk>K?KW3m{t`
zMh}Pokq!c78P~yc=O{<D;eQ0`Hea^4Ec7G1O+NbgoA^dsWEv)Mikubf9<#URsI|6;
z?u`A}SL5ZnU#ul$C+djN!_jh-=>BxtucY1+)|JlL at 5j5C%8B4Fv{!au`<IloZzFZP
zzEe22a=*)}N^=!sPYHd$AVY`OUJ{P)$x~>lZP~#?b2`e0>i6#%(PN7jE~(tNM>8mm
z6a-d)?vszYq*v9I*=CY>9`sAO+$ws7u1e(V6`vqfQX8IRAv{a?#2cs=6cb>=a$@te
z;hsmmV&aL7$qG?9OEy%f at xARI)+m$;^hjX!#!EXdDYju=S at jCuJA(T!M6X)1NjiC1
z+!!vvJ&r!LupIMY?;hW<7e#a?;0ueE9egW;mGCFA-q=y!DgiY5#J6H5j at sT;SE+Vh
zZs!AO&RmkAsA49?E)m_#DnfLM)WO?{jwt1J4ou#9r8|Ik*w<4JXuSueR<n-nu!4R+
zhwlZ6)6K6qxuv$~brSo?R74&*S%b8+qFDg$TR)TJvZyf}kzO$HlBYm0bpf`j_JuMc
z9qB=??q{o{+YEf{O$c3wdb!hGzv5^1gL_z*DhN|aA35oPw)n8N3esKQjtHi^DT=4O
z$E6oc$&>+I)zQl0wL`pTY2D9qAv_;j26e`?n*@$F){+_`Nts7XHrlvs#9B~zr*%=`
zYHNPsQ`UtrKh7Tptt>w1SJ^I5QEH>2awM=2at{yd0U!4B9U+GP1jY{Z4?`n<e*Y4N
z9u61*{j`w`YXKi;SXV$DuR at CU6plr1f?4=*<zCYXstxcT?;a39t8WRQ?NEkiVA+c(
zxzu7`PRONa>?`2eY(GJWeFdOTlXY}H#500y9s;_g)MmAUTMX_pa94nfXUAB<y#-t|
zgnJ&`rQmj!ZeG?^YFTy|HLDiekbUhXvZt^O#sg{zW=&1g>W)??xAQ^=@5^2*5RH=~
zIY{GK^c{S}oy3+P4cKLH>yy|Dq&sKAvmuGBM7pExT}>6CH+K+adq54;G at u^2)abC1
z<#uA=uty_L4W~2hmXN&l9<mchyI>`G9ajT*;)M;{-Mwl!b0Q4cN!oOgT`ZggydC(a
zfQmL;+LhGfHWt=b9%#;x+Vi+QdPjsT?*NUegkxt>q5r1ljOT3~<#zHKI}Z%>1yS=4
zYaioZ2+R)sC#+gK9TKsPDx-VGo}%V!>y!-T_~l)6o7*wkIMy&$Kj!vra(@8x`rBCk
zM(x^5{CBaG;C|Z?;Ycb)yzOl54*pw(k5#r8axiYTN-%B)bpv;>y0nt=>UO%*1TN4O
zNxDL4<@nlmcf7jY{k92c^&t7Sd}z?f_QxH{<E7`=p2}}SoNr?|Y5x(%L%46rhm7%w
zaBU3#7Hg;f)4XaRudQ5Mdf<Rys$qG5OMV3M+G>nT+Ya#Y6M%jT<|ZO+q2Ce?(P{g<
zQhP)Pe)~*_fG;AzK}>9mfpq5<_iJ8F=morK(Nl!`!X=U|^c3L?_XU1+*}}2WUlP}L
z_Py>~5NfZ$)47cwz}#OaQL|#Ir*jpZ0xGSmhFe^?8QQz5Pxnri{G>I**+7 at RRN#0d
zRa)PGcc6Bwkw{xP!8ZUQ7JNa7o?1M2f_Do(-N$;?e_NpM3fVeDdF#op+A3NWUuSZX
zZ=F0cLD!uel&g(+W<@;y1Gc01;gg=)syLAj9}`R-<gRKU^iFnez{60F49_yCgQ{m4
z>nTX>db+^XAs2hZB$7I?;2ut;9s72CFSPl?h~Y07wIbwTeMT@@6Bx{N3u;Bk#b}bq
z!=6ppTfnP&HsQO6uJpp?mCxAi59_7n#%(>n7Nq)9a#4iD3uAvaS?f=E&caImH>v13
zq35i3^JNa!+Ol}I&kZ!sX7-|I1>a_`J29`vhAyj^BowtFx>;TqiN`leRZk1PE>8=d
zymCn$>y|7TN>7XD*M&KdbJ1V)lI7`bJ<s6kArz6vJ~p<$Z at T~zQ)bu)tH5In%ZOdU
z at e=#U_xc2u9vhOX&I9(b8?j3Up^`i%;cv&uJ#5l?6RZvpx{{P#)dK$$zfQWBVPzld
zgh$EOrM6de@}{_o_0ivOzo`jOw5HqJrDeK(CZLducX&6&_d_cuxS3;Id=|7O<6 at nX
zq7zJ%ab>aJ!P<tsTL#?M<M&DJ?Kp0}?$O)H2E9Z|FZSr!+bph at n2AKbd<5TT;a4-@
zw=MBbOE9|?hcWq!p(4Ovn}{oHHJRy1BJQy?rs?c9ncZ&S>&Jvzm<>UT5FkXo#{jb&
zr1<5FJqFB)!<^V at 4tOIF(AyHUh_u4qsJ$v_seoU0yPKe29uK|Ba&H2 at c@p0o$c1_B
zz4G{H?J%dELAp`P^brBDHf0c=&*Io~50%GbHa05?YsWr&Vj?t#`$2R-UgS^nZjsB)
z7eS(^R75ZOws=8rP(Y&G4&N4MrPk~T*^37BQc=C5C*=J`ZBae?<@vq=I#Y(d=sol~
zVglMfN8q?~9p&S*gd&cUjs7ywen6wrI7}SJfggeS!#JKLi9((!lN$)k#PDrd5-A7$
zhdb90$1v4|#DOC~4?v5>8ju at Eyko?-jbN$fl%2Jj at a$!poj5l<p{)tJl*aG>azKY~
zKCXTbPiVXPMBuh=E57;bE`sNr)$#Fx!mLO|a_zbIf?2VQ<i5g#zIT&CXxZxcC#4Gc
zS3)<fj$eC3;gZxtrD>58u*8twkM}XGj$dK9Trn#IEltJT`y_rX5+$W+l~0D4R$DFZ
za)zEr+#yTN<0{bEED+-Zc7K$F^&oX*2CZ at DDBQdDZXJ|wzE|~11L0_9DYxv$cmo-h
zvzlnOg?@>5gN2T*%xfZG at 0vninyBwWcGEyMe)|BapG=mnx5Th-8C~=$l=0(n#qufv
zo(Fo2YQgs}?DV=3q(6Q={4CgD2NU;=D^h7rqylUk?O9g8kNX0`fXXFu_$>@gw%YpC
zJ0hSr45)f%2RlpVS7<w*R?HG<(j at KNd$FA_<lHxla=q2~c4|X}6s;Wt>4 at k{s;};T
zKirM?H*F!0k$Mv0B3uXYGk5C$L2{X7a0Ni!&Q)-=90jU{JIuYto#!I|jsGF81J7u^
z2S!f&S`|4JNXL?kqGkiskIUaOzO7?*$%6K6tT$^|yZpnrEBsBYg~(}Y!h4g{W{G(8
zNqS2%jjiK%P5A%AB>#;`|4rk!g}(`{I~d*z&kx!PO0z02jNi<#4;gk5V}bi8 at EICk
zz<frSPbldV2A{u-XEL9^wpoGu+jtt|{488QOZ60JK<gQLnxSWsv3~`AZv<rKbC&s>
zOZvP8K5qx^WIn%U>An+K&bad|+;3RA{}w1<*l!v3UNUX~e0~?0$9(#j&x<Vd$v~o<
zKVz6T8Tuvg at dbpA3UD7sIl}wE6VgCN64LP0Ur-wG?zk=FVe(z_eez4Lp7g-;#{cKY
zf08Spt^Sgm$>nn;Toq6?TphQI>*Rj<-}wIuml`>#n}swRKz?Bs!RKqb1PU5sO2Rjf
z{~-B}U~9~nq_za+r1Z+<yV8xJK|Hew{mtU8O)+DzvoNc2un>BEd?Qd7&<+O-dK$Q)
z&}Ddj7~T%gi_mj5;EsS_XuKS#zr>923<v%U&%Xis*FY{%exUlti-9^7_#@E20_qKx
z&S{p;nLr6V&w|gn at r6LW%~E+Qa0Z_50QzeQ_W~^e?mTe68J`Z+zm3lXIsnw~SW3TT
zDZLk%1<yY4c`@-ep&<_Z$?|yo5MVC>?PH;T#zK3s-mGSi2RoH)b~|{Qr^;#5n7!LN
z9 at zuqx?Njabcn{@^lkHOs}+GV_T=G=Fu-5SfEFtlS^!egF``lo0rk)vB at HZWE#iP4
z0Bh`rh1V(%3>xvh9ODnHj{h&--aJ04B3m4<yY!l^vj72++)hFg5VN5Yd3niAr)`Kv
zY%z{ZKSskcipz|QxQ)*l>ZWg?!4?_B5S4+BVhldM80KXnE^q7vlm;DjoVla3^fRE7
z3EeY4ZxRAcY}3C}b#Es at XWr+1e}DXvPv5FKRdwprcIs5ssj9?>aa_H6_xg{x>U2_b
z at p^nF;`&;Y>iIRy(oiv3Ehej0*i^Hi-OpD at yO9IxxhQ(DtuDF>2LamCel1yd5Oc^~
zi9TcW;2tTus=Y?cX=lK9sJa^3LLpf%YDi4{huVr45M0j|;tl5v;UcH)PiT+Sh;c30
zm_{6YpslXDe9!Ny#XU;tcgvo4VRL?|r7Xb9%+lUGh&RxFElsHe_ at mpLzekFEK~ie3
zsaf#c+|o+*@=}L7H$2~G+#{7<Th>w9Q1$}gAv;X|-n{l2*G6+bze!rEQTN>XaItbt
zTOG)aPr*#Nr1ZNmW44qR_2$8MzADkwVHQhLS6d);aVmAdUs1LnVwFRzG6-KvV_m6A
zK<{&E%Qw?{c4xSl#9HwJ;<LVwQ2bb_=jPoXk-FGT>X3|Mud_Jlv2iJ~K*pPqAi1}m
z+TMgQqon*rkbiL?EATxS-^r<bzUzAc*$HlH at 5<6%5z|gJ$f=%OHkF*=5e32Q%C#Xm
zRkUrJp_nL)p3jz3wUh6%7%rgW5~RUrvL*CAdWOD7&*XqR`9dv^T1p~2a^Oo-;%Y2=
zx|Rwy7)kf^EG^q9bk`FXetW5~6UOtZ$`+QqW7y;MGh)6utGC``<}N at w-a&TA9Tx{3
z_{`7>seXKU&2wMA_2EJXHW#{`sNA<rJQqOtc=TVqPc1FY(cTR$O%-acziDsIENrvA
zjGcIy^Javqvdm=tkn_#&StDi&$hW}n%qhpIo)X(RG7dX-nm6%RVcuPcZH<|U*vn0g
zw{9MjDJBws_o=FUqlV$Ss;m60-`=~{lgpo1&gk#K1?fwT$d}eeOV(AJSLWyCfV;wb
z;p5boQI)uhZLGrvzIk(^cZ<KnZ&t>L#&(VM-+F51tZIT;_nWc4IPR?L#9}5dbhdOJ
z6Ky_0b~!SAn>vrnjhzN!BQHMIEL^*@3TXNb=Vz37cpr(=*-v80*VE9)#+{w~ROs8*
zPY)dz9hEtoT(9Ppq5YV=&2mg0aKFS|cz*GjZ9|t^j)5$+^(9eknag}`7|P<^n-kms
zVtj8onjYO$rS4*1-cWV(Ot$e>#Pz=Fmz1dAjK3h-uyK%e5^t&A at vXi4YphMdnmM;U
zShH|dQ_a%v2xDAqTf8MMqWiHRIz;n3965a=2b3%20J*8q)m1M1HZNqYYTm=fER7Ea
zbA89bZdJ0Y*34wZO-_rr>A2aOXnYWx#Z97xywlqFkZ6EVYi3&g9VGpbg~Zn4`8)n}
zQ8AIYS_maZZceOu?E4#Po?G`jIT$m=QgCN1RhD``i`|M%cmb6ECbHg|DD3_0YYw}d
z<-{%ThfvqW`{It5k4p&cM1~V-D|Vp_nR%@i+Q!1Q?Xkkx)vXS>PcgPS at Ck)$t-~kJ
zoEoy*)*}v^0pD!ZE6b!r*7$4YtZlDZxbAl~OV>U+#(`h;6dos8#lrYyZz7iF?^8Yl
zI5Xw5@;ZdbyD^F8ct6=Wy1P*h;=lZIe&bFto8N`m#+|_ov<v4n?h;eR&5liIQ{dlw
z^8?k|>&^Z?|549|tcZ+y*<OymB1%eQ&fSfz0zO^ixhLLJ*C>cfJ5u-n=H;N+YD0z~
zX7HU=`R(kDePUMoFAb*=6W9eDDdo(*vlid&XPjq^pU*qXpILsEmDl*+_iV_GzLzU=
zR9E$7M^pQzn%R4+1B-g|5Q}qEspq=D*^Y%Zmc8bVd&7>f=x5 at 6Pul%ep7yL`<OQ4%
zUz&CAI)#Jp+EP|^ll_(^0e>yC{hR}4Cq#E5a+{2zeX7)5C!1>)s!id7xI|msx$67g
znnC6!I4 at jJ_>^@0IFD;(XSg85qYTU`tc;qnk at +Oo#s_)2ujp>#cm#HsOWeDriDQ%Y
zW^9bNfVr*)DA6<xpqJjGuBy5Pp<}6?18vJiyDwE-DQ8W5XX5 at Uz#7LBKNJOD+TlPP
z2d|CS*Sw;x>aF$SR at 9T%h*25)L&Us$1-lQSJ^%T|M@?7ZjI)N7b=bD&w8HKg9+iON
zo2BdT<Z;F>w%Y+z&mUz%<V`iJuK+I#ySJYZ7axGQ;?HpQwq+~sOnmkvbMps?SAIj@
zJr3XCpFufJGkb%3oplv9#!|`Ytymf^ay9eE-Rn|Ba9Odjfw}%T at o8Xgcu+U1=u6v(
z=tbPSzE>dccsOlnlcuq<!omDBF1R)V-c8$A;l99n-homYxnRfODVS9}0CMENuDT$X
z#{%Ju9JCbOgJh5&2hs0X@}JKPu7^-}=%H3uEqRg=hu=bB$mK593^Q`SeK}&BgBu`J
zqaNz<i<#jJvpF@@X3NR-=f__27sP()FO2=Ce}3$Uzlhv5O~YTMhd&g%7|ytU#fp_H
zzvH=m at NV!a)_p=N5c*p<<DMV>@PP*&e(a}K<S&8PX at mDbm>GJQzd at KkhBK_`=~-Db
z=giA5@)yT`>R%9h+`lmPnE#5{qy9y)hy7Q^9`u*S9`KjNHj>!rycWB)B=+Vdam!=P
z{)*V`{>s>D|Kga(e^qRi|LWLx{MW>q{7YghS1d+<@K=F!^WKiW!IOaJV;#?<Rd+qh
zh@;iWn+RuQAqQHGFgk^1GJg2KlOg#<Z|Pz8#-yq8!G*Eny=!9g_pXf<>|GbL?_Cer
z_tNkO^ziS;?$*m^)$Qv^`Jg?z&k*E&bvWbU#~*KL@$J}cMSJgr*gv5;Y}LYSNrf=i
z>v_zbSGcfz at As8^_ui%4?ao4G<xcooly&g6D$VdsQN9P?RK)||H08Fzdxn~IJWYTH
z=ABlXZRX6m`6Z=SL5Ot41>X#%9=<k3gm0$uukg)Mmcln%Spwf2g at l};Q~<7}I<5oJ
zKSx`y2l at RQ_+}~d;G3&l2H)9AE_~-GGvIrfk_F$nN(Ou{S5o0SPq7>`da4)#&r>+~
z&g at I+H*}V0FIjb(50}6=`MvNy$|(cE8LQRpXlMpr>sxdCFxYHygx6r9#;UIJagqNZ
z++=(e=|@^mB(cb=EV%FF<#-_Sp%bBpunXVmzKP8Jzy4D+_0^+oR<cXb*4W3%%;BnW
zPA()nb$eHJK8nh)DeM4j9Vd(9?65S#;2>U0P6hy;M<O2rhBro-sFR){c$B(-5xEep
zAw2SMxm-BTQB3~Mjesc~)#40_twlTeqP^})G=RS0{>LUW8IGFA1Q+5yaw7|Bw4t=f
z(~<pPTIe|oo0#oH%wuE^hxzxKIlwIijE);S+pFk_vhcpc?aJ3$`M6RMA|(V^DVG8H
zRycOoV9C(;2d^7i=W;^|E4QIW7MHo)z`a&JA%cBDlDjo>;>sO$gU+EeIjFS=Uw6zN
z&bXcDOPq*pS1RR`9vid3V`Gct6CfcM%I|t?yj>1 at at-s8JP5O25h#W$Co#mQUQ#FR
zYA(-PA>98_QsLX9Sa2VhKT`~HNQr~3bEOR=hR at rU`xv}F@}Vr^tqqCzmz`C<;HyVT
z3nKZ92X>(qm1xHxnQ=d{dKg^^=GG~0D!S)#a&WLhT$f`6pT{*yw#ikqWF)F@(Kp?*
zghki5H*6VzzkLT at Y3g|ceQ=lCzWKAZoo+j`Pq_u`f1>smlq&{d9Nw|KZKpEJQzDqj
z9m^9v;PWd*obnmG{;U~bL1;O5ISSAwr4n4PC~23(cv~qRyng6%u=PMVkMg%h4qxdJ
zgv%f{@3ynG$}ITiDmf71Q}XsV^96bPn^7V3CPe|;`^ra+T;gv^rc+=GNiV6gnMqq9
zChcK|S1Dh|SZE22$mV9z3~wSH=&u<p8me}QQ2P#OUo1*@iBS8F6sUb<c8P{VZiltJ
zkrihT&L1k#N^5&}vb4e(sae&65kc(~DQWO6P)H3HDyEZJ&?4U^?UJ2O+og!nF=OY>
zWV?LTmTZ^DuNcf9S}?eFsMuu#Ds0dO$*p at fpuz@i5aASZnyL{6b5G5DZ-!G~)+@&M
zG6x%mG9b@)CiD4 at v9nprC$#zIB<?smUIEz40Q;4$a==~z*coh_d^woG)@WK}sF4xp
z^#T3N9wqCfp+5y|yOp$l$P4qVVu9~2#R%W0X+LYn-zTlFA at S9bB=>=NnXb>*$OKKK
z-@;e|vXkF_*iH3M>+oq=u;pRnuX!52uXDrTnP|n(I8YWF^bMWI`Oysgj#O~5I;gIA
z8W~TRorqteSWlS1oKI5cOG)bdTm)ET(Z>LfDT#cjaksDTi#*ikSdoLQO#-TwOC2^J
z({{~729dvjJCT<T>m>U(DfnwXrC<Y4;7?M3KPQ at W!7o92Gwx=A5`!D at B6+c%U%zjB
z at J_j4C{t?%{+{TcHMzoQw8Bs&=PSHyhZF at LBa4v_34J<smq#9IvLT_*a3?}Sv^KIb
z@{mRqP?t+*t~zf at nx*WyRl7_e9W8{~wUal{=URd(O%<rtVb4wJH1~7cLALa9hs|18
zns>f!i7q!XGJ-U2h0<bTq#W7EtuY=<j=V~o_(aISrWGc{M{5;!f+f^|Jd1D;{N4%j
z at coohhjrK=HP<(3Oqvkt*s)@0W%H-Cu*_*KEM;2T$Z@)PAJn6p-{#3>IR8P+;`KfQ
z-lDarao at BS^^J6bS$&zOY|*ryKxF8ThVfb2Sb-4A9OTYkoIVDU7va7co7|R1-ZTL@
zQ<LiLI7mtfW*hlYhSd5*Aei}~;a#)SM%vxGCNN36v(a{E<L5>m at -gv_sZnI=7iVQV
z%s*#`>s%&L^x`+1Z#KTw<T4?|yHS(NY%2<|y?MhNjE|wP1LmW3u9rpfLN+;d19M<z
zz=;#6=lTx}Z96?BHkf^SHZUg9F0i|ndjy;oy(|(W at 2Q<RyZ7254i6|%?LBy{RgXwP
z3yd;mCdGA^D7x1%#}$Ka3(5no0Kz>+5tXpP)NkQAH;E_Rh02BKGvt+5wMF&1nBieJ
z%E(h?wN>4sZdLv2lj;ujDRrm%Gj*5xw7Oe;Ms0JUIvUDl!yDbUEe3T@^yXpT at V4RY
z!%wK~>a)?yhz^eW9B-3$1K&uf&%->)E|&nbB*%t|$m$rsQrbb at HL=WCW%HX|0+{yH
zIj(XrEBx2+4)#ST;rT%44k)!pQHdlBOLEY?N$Tz?Zu?H(RGv=mtr#M&ER0Q+&9}n;
z at P7*LnuWOFm2nhE at h>78S-p%C9dq~8x$Z)o!@erzlw}7Kx;So-^NFPMb92}cSWM!q
zf*D2EV*es7w8OqS<x~!Y{Ax0!Gwe`O0x5R_&Ms;~_!O<}Kp(4fJ%X~6RBk~)W#j*4
zuI~IFa|JDuN2tkxY@}Dr3KsGROAhp)IR{M2dzJvK4j(2bv7K`h36Wvhi907Uau|G=
zoDFw95-fH$|AcXG!p<HO%wx%W3_+RM(HFLV5QAB3fV{^V7hMmDh=zOGYwkJ7bNE=(
z%BK=dC?oOF^cbT=LzS#sA+&=ZG!B(P3U`Twr`D{x&|;3<tL+VB8B;;RcCTaIFxIbQ
zn}GwbV at 2mi#-Z52wo&;CzF3LDcc(J8<MfF%Ese0f$LK)Ll;8#JmDun;Y$7rd$p at j2
zark3BCdhwE$h at QPU2`&)a-M`Ix$z+0;xQXCq2w~j*(>NxnoT5kI(=l;PgM{(VwQ-Y
z-x&kx4%BE?cxqa@(rKw`euh9Aa9KW(2Ap5)N~1o-BH}ZVKzvu(yee74^r|_TNJz%x
z%Q5jaxrAEa{5~Ei$OsZ0vw1n>omj$g1bG0Tz{apM5<O|?WXSp;9w6`1dp7XrNseJ&
zZes+u4F|%FQ9rr$E6CB+58&$LO|6!au${EN!TeF_EU&GL4DymN^i{v%_{AO49zo%7
z%ZMbBcUPMM(=E&k;^G4VcQ(`EEAV~4RgCNt=bMc(AD-`C$2E(5I|?`YOv6k#KlBG^
zr>1eYD&f9vBYA^Y7UUJ(thPqd@~p~qySiJ#1)+2p%dLlh1mBdy55PC|@Fw_L4sVQa
zr4()b-(U%9)Nk#qAn(F=R+9JQI~Pa#v^V9uT at bFNfw^@<=<k3pW&Eb;_{QDc>Hh%l
zifMSCh`4w=yM&|$IlBP#U3YjRe48lUS5vyLI=m_VM4X`^Z at _(>%T)==o5ojWQt0(6
z)A=J3pSo(nwFz7*b&24509<Eb6#n0qS`nq;YDz;nrJ(|7`2SLBq?C$i*<DS`uDo+G
zd at GXW*7SbpZ-7zDTO*8OlR1k^1jg;|$)k0Cfyxklq-}YB7PcoP2pVSRwARP;=8Z~F
zA19|{VcpZPSX61aWyDKs$2uyXYt{2$)bsFTl^JG7xXC<hiynk=qLM=SQA4;eG#1|$
zXP``SBe#u7Z2|t~mTUX0vVD{Z&rhZb)Jb at a5=+wD;<%J%wr(2D^=iwo_v?yt@)&t*
zuId#3;Vh|GG0Rf#{#Zc+y7>peSo|2J?NMB;Qri5d$y>0VN6qIIa+Xuu#duU@<r3m6
z3GZeo+`Bogf{c6jt1MnfD3 at RGCIFi&WC6L8$Cmgpn*K51O2^{duou503w!QUrID82
z{aMgw-ZA4sxdUX(nK5H9CGPF1CH4kXyd*Sx&yEjLluVWFsU2b5wG^5XJRkQGh`Wrq
zi<FQN%8YA31vBDa_}A)c*K|%nOQQY~2yI2=mE<I(fw|?4soI5>-{=BfIn2O(JrK?(
z<s3Kbz0R!nI%hW*uBWwjjqQG10xfNMw|9JFxKPLAyEH~ON8&(C)Lq~1t6Gd0KYQq7
zkJ&b^;n3oP#EGUbtX7dYR2moX>38_mDi#!Wuvq7Ffir7|c$|;x at tW1cSQt7l_chvs
z263 at DRk4VRQ&abSS6pXKo%k^Ei;45AvoJ&C6wzT$jV{N_67$0ILt&U}117qYMarxM
z_qEl*D3Xtb$m at +ZF+)aOmA%HU3Yj_dAQrLEfNpHoN=RmVjS*LL&7lWLcnG1%*&u}y
zNt at dHDb59L4Q*2xtx1ew at z8@54>O4eP2#CjrO4~}G=xu)?J^gx3*Q3r2M#;-R>b=v
z-NTGTQuzo6L&aE#uIG7}qt){{ki(3>CVJ|~4GO&sb)#I=Q`fX9LGJybkX4(4$SWN+
z--$LSj`~PUFMi#e`0#C?V$xRMA*Ep00d2KU%MT`R#UCYSkDNkA0_eB)GF_HKezFsU
z2YQfHGsq9wwQ+wtN{;*aR(>Ygfl#Op4PMrO@)HUVvnZ5*5C?;Em25c}dHvuUy(bR7
zeyCc>(bA^*{BzCheI-51!VZ7mBt@~FV%$Kf3hqL|IX!|Wm(7hMIoKOKAY(?J53T?4
zV5U}DHI{w0u!CsTV6g!;ZiQG_uV=!yYDXlGnKjY6Lbtek^Lp|K&m%hqFvq(wWYTJw
zybT7kz&>moFC}kb#yFVQycisbd@^22c6z=Nf`5~F`O3(Au&)dbg1wa5n}Y-JZ3u<|
zQWlx7#UI}nRAhc!h=2@?i^f;P%)wuS+YWAqxEm4||G0up90yqbWEcxT-ULX&v`~Ko
z*bz-1Ndg%{s%t>mf0u)yxiH5=scWgkG3)c9A>()sEr}{+wmi`I5TX*&cqV<r`67`p
zl(XauaY{ooAiQ-vM=R at ntMvVqAclCgUrvvwX&gm<5?&P+LQozTPil5 at P6P7Tn{=@@
zjeE#;;2s^}eA*MfH!gs*m9H4}P>B0dMm0>?0h${jdKnJ#8@(rjCUPSc7YYlj5aPnc
zdTK`cg6Na_O#>ho$qb1*-M6J1<UdOiJ8vMfNV0N3dZWz5S}5O3(rc7i;H9O?tVx;;
z;O<Z|CaD|Oag&+!X+_)j!Z6<)AaLB*d&j5*zNx^0|2tHDf+sI;D!DQO_bbX(lj+PT
zWy)R*ny`^@a7f`Xr3ga26Dl|nl^L2RFHk*qiVB!B&Ya2xH%_IGG>XMSUS|eQIgX9w
zh30S}S?8U~6U)m;$(fA#)nrMWpUTO^lao0~)}w)xH?uWN&cS1nPIzAp{Z3*=tWM7k
z;NX#;ksTire=u#x2z~X at D%8S~a;7rF3|c?LchS)0a-EpTr#1;V<CLYT{3-OFxygpr
zzD&79fxe)yI3GeVC>3PoR2qAx7F(mRKP%4Q7XrI`?+E;#5q$@+<K6~l`S#@KAD5E+
z8=wc0qZiCZ3dns%Sg2m);GiAaH14z`Fty%iw5Dgx75o;(=m&}4Z&Fylkw`9Nobwx$
zul&4nk*wjvj6;*N-%jRhqMo*Go8LNZJiS2 at q30YL^&a^k@&|IS5bhfnWuZHZXgl8Z
zs(U}qRa<4VEXte5?KU2>)s1&`%SKxn&b1X{27Vma=h|xV<zUW(UmpC(I+q>HeE1c>
zuMi}<`Ct~oulU?{_%4Fql at O~G%rf|u!><BjRf4$~epkVdys3E&m`n5<8~-Z510zl*
z2C0&0oj{%iUS at wuS`?PB at yN>FM7V_b$RdTW#VtfT<e$Lv{|UU{TX17<LM|k}M^^g#
z!X=&!)?Y<_8KkQRQI}jS-y}Dm<78v>On5%XiEH?ElqT<y>t3ssjp3r`8QI=#CeYqI
zS%f*SQC@#!8M#j|nhAE88AblCVUtZ!7tF6HzJG|#q+_#8!)BU>%|x&v17d^4-=NN%
z#Mf<2V(iU3a-D1r7j>r+oV|GjPHGy;viZmjI!3dOk^2@#%Rj+r(P>PZMx#aEFp1GZ
zFhYxbPm|T0EVEWbMnu|hTpHwtG6&}mWx(vQoC#L1c9?-0(VZ#P$-KKl62tR}<UvMo
z2_!4YfscDi7$ZobY%ER5*|%~qf5-qXE at o7$m^;Rj(FeHT`!eeZ0Ow>p0Ru-gWC<)%
z=n`OFiL9&0`3$!m^;K6pxW=8LY4FRle0!yASGe{{Tuk+Tf<%(T{S6auZVB-p677Nj
z*m02aY)pK$uaa_?z+lnPZ0NDIt1h%OP2bP3+H!MBjnEeMk#PE*e?0u?y#z4!vvmCW
z2*!RB<j+7>6?ZTood`O%y+k?*XYi?6bI#;{$3#}PpR at Xn3J2fxovdQ@t=+k1pkRBx
zzeq$r>si*%x9Mwxn1K at F{j9=!N;rN8OW+|#+(k=I7+>CP#K)xh5+APbtcnbGUK?H1
zV^p^UD%7okO4S!wtZt)k)t5xyhwlQ!p)4>L(pT)S(BH3L1SWZ}{z{aAo9L_at5ou8
z?rOCKzRju^FYGpSZ^0YzHgpGeHzeL3kH4$w7c?YZI}pdA+W)`k`6ea(vo%UWx$(MA
z3;v5#DAh}B=kjPjgkKch){uDP#%>0e;Op_-cq_yyX-NF)GqP?@?hA6M7~x~+DO?V-
zva8U3T!l8{>c%BRqaxn#QU%nw<n6di6^R*hjUX_C#+VUs>{D#6VT4}Gi{3<T7P{c|
zCcw`CK2IwkpY+cSenvTTKP{siI?qYGHZ|+vdYXGT2l_^(K>uh<;Mk}al_MMQQyZ9>
zU}l1u1!fkQ*<faanS&6T5na at _9C&ms&S^;Wen-dWrP#BkVHaWSl18LJ%ScPWJK{wG
zU at rsg0$?u#>;hmf1MC7|F9YmC5<BJpfcy7*rsF<q)pBrlrf$yC%%Pif^La20I5-S*
z%WfWKTgyki;d-cf8EU>2YJLmU{8n1?0<C$wUi101<_q+iFVt&({xH+ckFcXql0z-=
zR+0knByFbC-)HE7S;)|r3P=@a&-EHLctaxcWzrV4PTEqa4LDT;+Iug#GX*3SmfRQ^
z?V&SE2oruK89Mwru^||FYfp_odY)gA&0H~<yJCd7QtQWC)@yp`<-ip-q8+FUy^Fp;
zJTs4}WL%7g`61K7v at xB`QRer|5Oba}vvb(x>>~CQ_vVhs4 at f^gnyzGc1eS~ZpvF4h
ztq7<1n#%D*)X!MTjvwmf!JhO#)N7!#v>!nHC-nF!%9oS=2f&|KRPf!d`&yNON#B4n
zOtJ5!eg?q4SNYAP?_T9&>f1i)+phFa`nD^_sPFDc-`$b%N#EVe6Nw&3b&H;=ahl&w
zrI*I^lYB4$gSh_4IEDG9!F)Pw>onL_9kyi}Y>N(Sod#>wVe&MX3^4A^mL%jTtA}}9
zSphWO2q7NVAzjLKdY-y~?h>{ZsP2Ls-9UWrJ*8X&zE_vB_nx8{u~G`|D~}>A_Pr;S
zB5=<K|C2htN0iF}G8gbYqC*~5asZMIkcV~1LrMxjtN?i^GVWT0Y;Fe4&}IlA=dmMR
z8T#ue2lC4cASw69TjHz?{6Vfe!r>Q3iB|DZl_R$^^80Zb at TjWZ#Q9X<Th(B9dfKf#
zxkZZjJ+<hs`De#Jyg24PCylmvTO_+AzRT~sYLFeeOh&`D at Qsau%^?31TdbCT>nXH(
z^T4nT#<3g6*iZimHWS#=lzG?$vx510ybrOF#weiQV)BI^bvzlm(Y^UsU^j+uY(rxV
zxLyMn4<Sos!>~;uBQe2ph at 3tlVH$UC?i@$ngyy<2xOu<KX)d7VS&&SUSf2)aD%hEr
z6>Mo><6;J|0q&l+0grogi#H(ygy0cj3P(rt{`mD{JAvarI`%X8K0dbV!dx(YV`Svm
zDT%{RjO-YF>fDoKPkT19X3s{BoKEZ}+(Bkkzj}FZo|>sjYL?of3aWQF1zSflM$^vO
zh&JO_e_FvZhd;Dp>u}0QMnfWAhJ&Gdu_;!orV>oS<%%_AQPYNPXBbB_&xq))%M_EE
z=5F2`^PBf{w;^@AnsUZ?HeCe_XPC3b=jzmy?ZyG-tU)qDJz5o>e+pZrBK2~hArolG
zQoTTjtY)jNszu$>o1kf at k7nR)xa;DY5VQcGf4!V43%DV&S55<Sd1Nn8V^IvAjg04f
zin2;g4X#>!4!<^(=V at otT*z<;q^I)6fSB#tY3OqEPqiy~R4XPRT0QOQW+ew=eD}h3
z$s`p=7vhDH(cx`MMpBo?Y0LIGczKgzaP4Gock^2Xb=&H5=(VBQ9^WO{(_C)Az6-GD
z=-7D=PXBInp|sGk8*Nf7N!^*~LPrzYB+YL{%B|<qWGE%iqx at xB95l<#Z9dmV&Vsyh
zcERdV)EiwmWORxAJ8p-8R~EWN?l*1+dt8~XZU^7jhUR)Uu(oMb*jfdbXy}5`+Tw1>
zXjcj+X=zT+1zM~QFQrA-<N#Xgffl}1ATbok1LSenRzdj%!NcCJ;V}ugScMia{sq+O
z)5C(yjHE#6bHf5&1|~Z!jAVd`z<oWKCU9R4CJ$yNm<BMjB74Wde<U5;W-!yhw18=g
z>{Zh}<_wFP4Xw{LYK2rjQFo|9Xcp9}4O%UC{z;gB&=}ylk=DH{vR7F)Y^k2tm|nfF
zF+)j_jl&d5TLhTZI~p at oJ6U5&$k2z<2}~_`O(g9WYTKk13|qSDa&{tCF{%YQ7%}i;
z)dG}<8*Mg}31$_THZYxFW`VgJ%<SQUgI*cHI0uuJa}2N<GONr{Q$w#qn(4~BW0#Lf
zW0_+uV_9R~F=0#|%N}bTvy4GomIDomub*DQO*ob(CVn121>8^Ut;P8xUc6RzVChIb
z^syzB0}{=$mQioWsI7Q@?25OLoi4f#o%pye-a=)T7T|Z5IBJ72{o`wc`np<jC2pGE
zec$vWcSsHusS at tTr`;JirMuo;hSS`&IQ<;R3?Dxk$^~e~FtI-*38Bo$^Byyo_Ce+_
zLwG0IhYBtH+- at 7iNV(GXG)Aty2t8?6ih+x!fkc`TGDW>11G*oliR;^quO3zAKr5Y1
zeXQVPCilgL4AB}{JR>S>>uHL~e3FlPKNpg2Y>D at WIC8>K(^d%bWG7HYQ;@i0L?T)_
zqb=vWjf^-$9%$N$6LJt+hM5r---)*Z2mO~&ioegZfxF;8?RnHNsu=0oN53w$=2Kml
zRQRRAFFpE)6&$(?3ozrmu{RHL3tWCru%}jLy1k=J1DZDyH237;Vp)v5tx9rGDJQ#e
zeHVz11TK>6aWlricT=I<_J#iDX=b8wpE8PW!fD415N{b?6RX5UJ$WOHyoTru%7NHS
zEClE1u(eSqK+*s*8{*pKKDk-*fv{=##ReqI*rQ at 0^qKMr;7mXM7lKn>6EiCV;LbQc
zNZo5;*7%?@K+ay$yuLtWzK at Pg+lfegbb7k$H?L23eLV9LSMhY$U#-(!N1xUt%Gy)+
z9zP0va`VIv=8Q1J$;?rF6#S3W9!0yEqjWV3WP*)!7D-NgqLSIkTk***Id5wrvm3ii
z*6-e;t3N at qvdKu=$|my$^kA5G1CAaD at q-3bdP=ijwJA0~m<BR)b9e>JOoyB{W^T=b
zFArcZelc7G>1=>-y$z_$0p at EBiT^lA-eqV=yu6W|YJ6ED_E&Rsxfqp*- at tX#6fPPD
zc+<hZsx9#S5+v=!!32z$oXV0Dj;rjZ#|VUAn2dini9gDo<KzH&xv<;Wka#7BrhzBJ
z+(*MO_&~U*+XVi_-=N|CDH>{KmmMN9{lR;?P2El{RpVO_r{t1UA0aWiPaNS%szCSl
zxP7n?`uZB&Pj#|Hn5i$<v~;UcId4vtuTW;ni<BJsN+pY&bOP#b20UL9d^Gg~;bNx^
z9l)m*PF^Svs?57)S&Y7cgD@&EvZ$Ekx=9z<CYI=}qyy#{-%k5 at GVM~5cD^!0E>N=N
zLM3x5ZMN>4X)8o`2-5n1B`N$*_`QXf;4f2Vj0;Nkxcw6RKmG^!OTUeOuy80ZG>_<a
zL7NoZh{HZc%r+az9gx9H;794eWwzkXsnTa(s#&n#94 at +q-_o72-dcX8^d4|~39s$B
z1L&Bqry^A^y5Tfmfzr=#Lnhviazq9-N6VtWA+vYgFHQHGG2IWw4<-^IoVp?L;$`Ia
zZ6-Zt2&T#T<A!iuL*k_|RT^e$Ec>t0b&Sc)=kz at a<`eQB#UMYFtCg9&D!H%3TWvFI
zvc`K93w(d67~$KiaPWPNq^R><q-!L7I++LTG7H^2LiyTi$-(LSo{59=i0MM+0!aBm
z?IjG|^^oR*Fyor}3Kz$H+4_zu$eWY9=$JyT#&jhzbYZe=3&<%)@F~ZA-F4t|8LGwn
zt~Kt8#I82aidl$v<|QQHj)q;5+p&39+nE(h09Koj92LNegv09LN8>Nj6kd#rxDTI^
z>OIIX%VRc at wcP&*nFb42jG$L)toPrin2Gk-U<tT?4(`=eXf_iM%I1BJ!Th02&j!J?
z!hv=;5vq>|K{gX0+%|Djs>OeL&mIM29E-VW9r|$a{j)B>{P^Je;QwQfnHP7Q9{d9A
zo1W>>YNK_i>XE%j93|`Mv_9tia4*!yoFDv|+<Ewex#Z5m`&R$e>FXO>rN!7Xx9a6C
zB#u?nbv!;jH~)R^KzTfPpduawTP4^QQ`=QwyPDdr0o#&zur*&sj@>(%h;qg>#LFn6
z;DNt7hZgC0AFMI~URB4-3xfQDC%|xWhs-&iMw at D^_vKWf`OHN1#3ChKUh4^PoV+IK
zcklbU-`qARr^o>)D{_mu1!kce$Uc|0D?PavjkUJP-K({U at vF%Clw7aS9!dBw-K$RR
zOVL}$lBu?lYz^NCQT6Q*&=*BUh+Y&cP+(Y!>~m+CM7P6K=PMXteCuUimcsMnQrsSK
z;nQ-Ew{rvCb?2oWXTte|XNH-f>?VZSJ&i%m-?3+d1Nl<gZtvs#OdI-$bD$h1WRn>s
z9UHMrmc&YP>cj`fsIR}yQ^H at 2cfdaramfO~J1mj*s*+t60eI&b%$zjH%^#!^-72h&
zdmTXk1#K_>Lt}O7uMYPbiOy2*otTRUf at Uq3%nQ)!IdadamQ%_TP0*h1!2`H|Skh|J
zS6yY=OKUQmVP3lQ`kyX+0qLo9sm!Dnj{9As%M>Fz2_Gr78ul7Xc_S_&S~$umiJ>wi
z4!DPu#r+ly1Cf3J@|iL}Njbz?4v^n}1IGu-(5cIk=~kyUW&!LtbsYp(HVyNZVpgG)
za1ntj?|;Bm|MXXf$&5Apy?6)FP^&#@PIYZ$g#R+Rv%OD%>{T!G?!{g|sXLIJ3?wJe
z!*<bK(ckkN$_VFUF*Mdw6b)b;8g^%+RCfW&aW6)>4QO#+Xy^^(=DgbpXMu313En4z
z1m}}|s2&v(tfAjyV*{!Tfd6kuyX8K?%`zhwgbM)@LfPmFkBu=Q4lN?1f?^#1*M`Kz
zd%>9U28=Ezh|ccB at lX%=UkUzZkY`v-ZfJia^a{i+_2e>EGQt2I2nE9VE4ajd2wO&Q
zksZ&)6IcM)Gqj{$q5e-reha>{<zVDCXipW=AzX)z;Q|^?qG#-0CA*m60&xFW*LeF|
za?if}j{yB)Jdm7c1g(H8Gjf}zF~nE2Jg1nZT+)F_J(iZxEV}0*ME2o6D4|U66LP(~
zLM!`ZU&A1IEq*IBKGo;M3eik-qM*NJZox9&bBDWPi*$~e8UyvV{K|9<DA}n>eXLxs
zGUHcIj>!^P<<v*x?cv7cp3D at UAcv)sX1ZeqQpEn%VTUq%^{|;4nt9;lffa{3x3BT7
zZTs$_H9+GpgXvnhu=sNc7eVMpsSbp$Sq-?@lU9%zjY&)z+$P{$qT8_e`C!UFj{nbM
zLYyc5X&eRziS9(mOeNykWG6mk(e=LOXnJ44(dnhdKJqOcq=%;<!Q40#JqXf9kasW}
zaa|7z{AiQ`ZaYn%jQLTZGO15SZy&HUBwjEk>yhwW+LAW4p>TmR7O#`V5otv>bKMG-
zsmG^ru)7W~8)qW-c(=ShLuK$XA9M7X?mF3YL5ke-dWsHt0w5L&vFVVV5RZmYnVuri
z)-t!Z==C{m4EQ`pFv<+^3;ak6-BkhcSqgbThg6airW9j_j`1mga5T&#dYC0LFXmxH
zLz(qZJ_u!`5UUQ^4iE!{SairXfTUAMwhnn3ASo1*sY8ASkW>oE(jmLL>&DY4Bu9tr
z28b3WRfqVy>muD0lBPqR?5+c8p^n1Rb=VHTZKXNcq~~NYV4 at TS9@HUM0VIP$9?~IK
z1H?ul59^R?0K!wuGj+^u0MYU~ONZ<Mh*loCI;0&STJ6nN8L1c`&$>Bm2b#n-Ch{z;
z=^`R0gHI>;%#SUK+{0(1N)497p-O-*h}kJLe-fGx&?{pzDfF62=rsVXh^0{I!b#{t
zfI at yqdfo)}1IgTf(Z}q$2)?EM<DN&?zee=7>Fl;o=Nvzs-WM7Y9nVhJwZjZq%Xs04
zwikj0kd!lnya%zfmAr^6inQ1IU}Q#7`fj9>N}-7C0AqpJiA_m?5R4Xr>Rz4G`2=Hw
zmWD-Hc;1a$N-7X@%<L&&ZSa(r0WZRZ%2*#i*m;)SYXQl8V<$evSCz-j3ST9}&3?vj
z_vD%{=(-{q(XVA5D7`=WtZV at DUQL6AoDT@w;}YF(wGEY#d+K{@VPvmcbphujWp`Un
zZehuy at +yb+Hy30Pqs)R_#wqMLBKk34=K*F=c-aW1NfvM&*v&n)WQ2O2=pRvCccPV{
z>({~9c}Umyq~l&D)r!H|z9^ZoqZZ;0WwJJ$K{VK!Y)>T`Gf^t3m*^TCr22kFEyk2K
zNzET<&d9C%n%;*)79^ri!T at h~XXRl&S^-}J{ETj7SnJNi=}_uHb~83LuETR&0hocj
z#4RE_=iM#tT5NLPgsn&F!wZ9E_72QPUjK-XJk+=o8DQ)?qWqQYQ0h4XJWg9i;!t at b
z!n~#pqqUlod;_!O7R3OgF|mDbO3RhVJC|}==HMmmjal;XC9eOx#P!;xI_1*7uzh;#
z)J8Kj^p8d}%76c3njWeB<r6P&=@dJq&i<FVmmIwbgpe6pxUqq$Vw3aMI6C0y1jv#X
zr_#ZJ4z9C~+*{F!diQrM=(wkWx%OYCQiAxOP0@*)AtdTc5i&8;z$`rx;-*S!?{@+6
zTjj!J&tjH-l*ALv1o=Q<1abn`&7i*MQ4yu1e;|iLdP^@UrKRsrxttCp`kZ1#ItsCJ
zZMYG0;d}xoaztd`Y5_5;Ma;-NF7U4*x)vep;QS$rb~BhIw+b0q?LCK+X at l1drD!*g
zZOg5)ZD&P<)7p5=H)PW8F50#z`ktnRK+d|Z$VTV!Ky~W#VJz+72f3kA&!Z+X7u09@
z`@5VrCX22e+(lMx28Th`9?<%t_du2D=S*_G^cean+KzUhKcZhSN0~0>cJv(Dhh9O4
z(HrPpbP9cdXxx51?!ff8HOPThpp_8*Vdin>&nO?=j at F_dq6c)GyMQ|p>TPJ-BHb+2
z%`yeJ6WMi3`YX#XabKy3m$*xnDs4Y#GJg4_U%9dn!j4}OzCsb8*NLTB|J~jPlI*D*
zdMlL8vRKIo8MPatER_n2nNtS6d>6|i(No1 at 48{?~p@$)o at +uu?rEV_P{YrsDC&Q6f
z=&N;m1=z3A?N?5-mxH~0T9}2UYyZ1FN!JI*hz+|4T_AJ+H+EJ36l#}M@~H-6o@)_8
zZaaEY8I#Fs)^3<}*1;V0XOlUuR8Bw%8K>MyYL#Du3{CZeL=-e%(sPBrLc06l-*w8p
z4%O~@cl9X3^sSA}KwmDD#_8y-yR1$dCNh8R#7}n_`?%+~D6B8oRvt3ReSHQ9n}Blc
zYb%FT>S~@fBXOf>_HO$xt22x3a8|Mb9CV8424Au7F1e1JFu`{^Z32>^eq#oxqdVmi
zOlBV61rD?E4bF|M*ZJt3K`!JrK;JFuW}E`5ZD1<T!#L_B^C~<*-rWGHWOMWsjB4}b
zpeq2q=Oxo|$-cLu>X}@#&q{9c at c$-U at 434v=CW~#$P1)=b8M_jH<#(=a@}mu&Fl41
z&P2J|PI=*hqu~N7w=R&8ErZ-&C{rE52J|mqzky`I$)aF5U$<duvx802Y~wb_$xg at _
za`W3ABwv)j|4F8Luw*m`*PrQVjbQw^97br6`j>ahjGN?4#LeJ3C<|0CuMS4`HnsH)
zG;Dwrnkf~Dgo}(bfX^KHzT77d at Gr6X&T^#Ut+*5BbuHs7dOy1$U1%X^{lg2%8P at h+
zy#aG!pvMKHUNMa2XlWOAL3(-EWV;{dH6X(v3HQR~R3GzW*&Mc0+i!`yPwrQ5-%s6P
z;wHF&8kiNsy#F}W3Q31NR<O5(3uL<}w5L{Q{-k;0sp<tkX;w01Nz6B=R at eQcncUGt
zV5dy9bZ-F(pNDxFGd0%H^9jNw=Mxg`)l)9AGecSpX*1fmgv+KzJfb@?XrSl3fphtG
zYkFVCRH3LG0lmeFZE)?->^=iflx0qBTMn=i#Ry+P;oxg0V*+&-5nFUET~D3j{*@?S
zv~Nc~_ELC5B7ScA`4~bUxoLb at a+g~h+&1evqKW4#B<namcU&^NWL<7^fqq^F at hkBn
zEQ~N at WqvYD%eTT@`47TS+I$7%WuWNMX|%DT2y~E`ymKWIomr@^`aXxLH_uln8-1-K
zth{E73l}BvK>5`{`Bmc2ala at A&00Bb`*X4!E30a>a-7>rT7C)0MQr5R?m8b2?b0qb
zx2Fy>6Az2KWh2>rQ_^V3lJd0E at -2!U_3^lPlD at vU=xT;uyv}qS58$G4COWgz?B0nP
z`a%W|trwGbrQPKT+ypbTo$GveqYjM3TWx83?)!DB+#x!4ri$0u__ke`c{O)MA<9<B
z3$e>ja?lH~zmA;8#b=-=S;+mP1csR@|M5D<I^U+l8{<K|hMvHlHD0HU$y<+;Td>?{
zGxkGkPPO{#+Gc5QB6Ygqo2A`r5wGvflj@~HneEwpgd3ACWHcb_smSMkJ4kS@^L(H}
zw279sn@*ZmynwhEc|~-NlCvX!Fn?$UKum#6^j5V^-URrh1s-S;a5=eCq3!lQ1NAd^
zZ9-3 at oE1-_H1dWsd0Qm#kVIbCO^7z0?|LY3^)N$TF6g=%mEkIxWoxk&X!tl}Ji(J1
zh#!Ogc`PpS8<ANO+NyD1kPoCpc66mQahMGn0*lG5_Fap?#S_;mgamM92M|!OShh#v
zU5g<X<&cXH_v9Yu_pcp%VQ6O4Ef~L(`o6Ja at hS&0A6%>$U$Qkhkl!QvVomkfcHBUH
z_=Af*<!p|poa5h{tC*XzvDlZp3JIvILdgM_&}Y?M#y&$of4~-f{g4eP5rL8=<OFZm
zk|s_<KyhWXwyUy<YeC>s2{dBjk~N=ah~20AKuJ_OxS^DwnYaK$WneMn7V@`K4`D_m
zd{B4UX!y5Mw32ubO2WYfQ#3z;`hA)b*c7z6GEfG2b-Zg6%VV=kNT?25+)Pi}E+gkl
zHD3q!x0J3;L2KaZ$V*ToIhdQs&}zrQg;Ih!fd|N|E)X)ktCG*b7R2Kk;2l*iTZSs4
z7B=v}L<ULo{ghx at V3RY$lz@<n0gqL*9Wu8yfbU|*rjJriWCSW*b2DIk1BxCHc%0 at c
zP?5-RKuy;JWGy at Jo}*4pY1 at 08ya2*N-w~*d at 34p~Ma!O>JZ at I-xH<mUMT)g)rGVa{
zuZc7{Z0P-&O4cMqXj*AQzvi26#%AiqO%5}9->Mh^qxrZ7slz<A**X9d5=l4)fejNI
z3pR%0;=#sJn;C38*c|o^=BAZq3bP at S60wQMar3zp;#+NQatP=+*hKS+tB`s3pLadz
zu&**_l_PWDhPD-b5L!Sv0y1lJKJsEY?sHUx%sBszZEyNu{sE=?)i&}jS>ORuSFSRZ
zy!^0ZVpdlrokKajEqGwuE!oKkkB>>bbX~aKRgh3c`vdF;+{hM%-?JyN=lqrxEy$o6
zqpz!5px+YPY;{YwE8=u>xFoVbW^5czIa~`pj@(mn{MalWs3IDq$1S9cVrFQwX6?-Q
zo!}-k9~%#(coWffWsICQ;LDNiSYe0Bvz+A*EK at 8eIk|+~T7Z20+$viT1%AHkyKOHI
zI?jU2hoT=lgzA)2Ch~4sQwj;O6SWlujjK?AXe at KuD@?o%+4?ei?1YwGOPd&k+inX&
zSZr(CEh66mJ(PfK{pOw)S9va)7<`WlWI}H=1#SRtXxN>)D~IASJ8Yk(^zkg at BD^np
zGr$nC1&x90c3s<qa9(&HiP2=+8Wd5xMaN4*a6L#d^;rVs)*=%KO2EZx6Vov8J!sb)
zg$G_^*_G2a3w#>s>9RgN;BCc>luyo(Lao$?>)rE^;42~TCU;fz79BY1T#QhYol7{F
z$IV?8fwy5?W&<M=Tb&uTiHUc+M!Jp!YD83JZeu3$fD0rD_uA1i*g`pP&YcLAcU7|2
z(S!A=BC<In4^O(GFWP{sw0(Lk#Z$!=h&*o*(ISFrYu6EF4#c0$-inM)Bq4Dn&e?PK
zrxwy~yN<91WEK(1*;BWAq&0lj5U6mVYC_!+S4NE7vOTk_qVp|Rxd{QaEzk-p5Ql3(
z>b{Je*PB?@TSWLw;1S9pmasXPC!9viG_uh1m*8q_<_lrgi<U^r+}<LfV@}`^?G at jc
z#U*eELOLcgTzQEM;0y%A41~N1mjF4+G_(*LC=UzEjsdSIHL)&#Mk4Sdx10fENr0WW
zt?Nh8aY9c+;^LQtBL#jzc#<nmCD^_*kpUcOzX`$~V7n?|Tq*#rgalT!L&^LMVgpRb
z#%cKax(`e+o88EFRpKHdQO5hDzau*W?ri8Q&S*TcAh1M4g)C5$jm;Wo6L(_Z<vC9y
zlLI|!iMBvo6IrcavX!14sFRRaB3w3bFD;uZ_#6b>6V*u9N%^DXeeA@=XOdhL-xGLl
zit4U8fjgY{n-ZhUP5mfEtbo-1020a?na}w?GASt&598~*ZUbCqy^fc4-3Fs^x~m>a
z>47}fm70;j3p=ckZc*aI!Bb>?ub-~bF%~657)EHIY$)xpTQLX>*qO6m(e<S7P3}pH
zp<I_AAt_&~!$CaoB;yjz1-t`gVxu at C7vx!dcev2sCq9TS^K9ToVKjLhW__FRn=o<*
ziEO#+Gs3I-(r|Mqou14raFqjw3hW9Ogv^)T9;Qis{~+wLe->8X+x&sHw at K|koMyj&
zn*B%A&I}sqxeCXs3*K|OT$ny{UU?A>^MGQb<|ZYTnhz>wYCfd!)O<WFkQuuwk^Mz-
zxAb&;vh!Q`9 at g<aqT_p1$M<6$-(#2J)6esY;e2vm%+zjy4zK$beDb`r8<|VUJbBWe
zo-mJ#a!?YW=FT*EQKE4 at o+VzLo8I>4W40Ky?04ttt4Bd>uF7tQ**Q5M`tB8>^Zq_%
zh_u`wH?_L>&+PGfGQX9fZ47&*{PV5!bpV7Oay6sC8|Z5eq-8_+7JnbW#&K~2BZfm4
z$-W>Gh$I~vrFJ{D|NXyAGQamnc-h_&yfr*O^cR``FVo(K_g=svapPd<&t!h(eWKgx
zF2h;SCVofek<N{%0cMb&M5}NSnKzPK=ZN-5cwy*xwCaMS-7?(rY42yyqmzEcp<b%D
zBEU?&0et at evDc7&A~I*i9pPdugkEZ3YGQaG)PaR=LqkG6H)_Dk?#u+4-Z<PE4M2{5
zMqXwoYZ|VNDBvGdxu&O4LPSu;{0bI5_6FKlLv}w`a0!epvK?}NJJ=s1dB$^epH0+t
zneMtzt|O(e?<f1>xFtLvAnQme;9 at N9y-0Qg0pdxP0=8)7KzAo^a;Z=j7;^J+%O|~g
zP-e{-<3Mx<%y<{l5H+N<qBHnb_EYL_q%-u6a0&R8Ycq0~vowJJA9`z5Nk3WF0r5*{
z{CU^{C2~L5X5%7SBKHm(WFyG)0(OxSiQeEF at H8_9xev<Z-=R&An*+$I^!};&<*?M7
z*N}MrS2#G#^bp&z#8%yQa#F)df*E1?&O9F%y(ls$Ad6xqPql*xh7n1ufVrK(2)(sp
z1rE6DxWBkFxi2F7d<8vskXb63qXG^G)iK#C86 at Y3myF8&tBzTycEmj3E%mY;-xV$d
z*=UDrC*-}E-z~jPG{SHR%tp$46Oiu(Fh}R+A-vEJGemkuuZ~|S{etYv<F%wsx(%BX
zgX~Zy!OC<4R9i7Bq$@G>c51 at A$jw~jR%@d3Onp9pvIn>)z*yvZPk=Q+4(%mIg~iuv
zBgd>yWTZGIX}xQh3l|b9hdD~6RxfqaX&mMVjVh<>5d8vZAuRxCOwu;O0d<qK4RhqZ
z!*GE{522IpbDKywC8(W2#^!iGEyHFQ!vvz$ikbc_T!5YU?wF0n?1Y#m+(2T2ts$09
zMi_jzTmZAZML<IXHpO`2L&nm?%(~-2^D{pYTU6u<Fv1wwxt_s&?!KBE^p!XTF5%mN
zw~!ULF~&WEZ}!ax|Eu{m1nR3M{=_fb=r-`DLAspqnZx<SWmuDReUm0!r1U1WtF+Rb
zt`|c~=J9Vr*t|=0XUK}qmN0n<kq;S?XMA;Eq4s3i<Aa6dY#_Pa0m^I^4Zod+zZgoF
z>s|+GX>RJf{KQjlV8tv7zN|MeHYytaK-}(ZK5Fq9pJ^2z2%5u<?Mr$$pOb(WW&>Bm
zlQ-I=_T1sjLb9_Gc_aH|o~%p~?x54uL22sH_bBp-jty^TZ<K}TAEKq?E*RjP8FcmQ
z8FEWg<U$`09GtE_AFk5$S^eY<J%--NThVe;Z{FnXCfYvv&C_pLk?rI3#Nz&te&Qbg
zV;GHj-6c2woZ;88-$QrcoXIsCeecHmG`$Z9VUg^+ge;W9?FnSc1)Wbr|FM7sW<6l*
zyoKUit*yIF-(#ZiTfen$|D8)xC$;@z+wyPKx93}sf13tjv>w&62=~e4CYUuxfV+eY
zBTU;<hr6|t-2c0qbCP%7s7&<N&=-`@MVN!F!$nI4Um<Xuxrck;d->sQkqd_(21&Q_
z at FVbDY|DnZSRO6}(*kBOm{v9q+YXU1SAvV&$5Q}iMtrNLK`7Tpmp6%+!)t+-Nln84
z8w#;8>IT|MJ0G;=;klhm^i=0HkwE7XTL!K~95REs7)%Q}a~FLLzQqTw$;!YsfTh!u
zmmJC<=kk)b_>`Xw{Z3_2HnKs!Uk!Z#l(JBo!mziyUX{TA`=Jb#({2KYx2zsTb+Y{|
zE9a{W__>1TldFUcOxfgV`8Y4G44Ty~PM#_78HTs2(rAlwJ(CaaLT3&mIIm*tK7((*
z at B6;a>iZnl-aAz9IeEl%&L~^MMR7SUPTn(Ms<~$~s(Ea4xx&GiHK at y+zal4%h?E*k
z*T#oP6}0adaGGap76b&UJG?*-`|4!aNiAa<a^GagBJB<eO+OR885X8moDO^a5||BO
zHhh%q<4!??X6W%IkU4Z2kfe?UNdE=03k3Ww7&_+?Af_Gdl@}6eko~)+H$!hT(Io<?
zgLRYIpTJF^wCX?#+6W~kIz?^>TK9;yF8s4o)7OQEC4f91G7??@wu94Ffy>DXFVOLy
zP^)N|A#F+Jf)<sP3wn!S{>suDVp_;LeE3?uHpO2Gc)+uhGbe9L2{bC^02{IrNr}2Q
zgl{3YsVJFxY4nHfI2bfd`pb$+MwPIQ+^-U7=_h-nKuM$<C^?eFAhVnga%#c1brp&J
zu1s#CKcMM7feWOW#Lp*PkiSG5)oJKIu-jRlk!Z9BQ<Ar|1okF*9OY6Aq1+)~fBrR<
z$f=ajo5!#8rphR~%~pmDS+&p?zW^EO4tYJsM2>|#n8LR}od1N}r9*EvkRAR*k2hx4
zj>&bs%g7FYIKS&!$kz+dQ-UMXxfaqp2FsyWG?N!%N4-%63!|I|%`p at AIdUKTvE=!c
zcs at Qu!h39nlHNSZ6M&XzKlFM;D2tv1S{R^4x`dkhNLdqVBCi82w%YSD+iN1U(7S at J
zg)!@v=#`Wvha^h*_!!VI;4#n9T4O)eODH1R9k$Jwx9!J<03+MU$}de1y>>^|{n!wz
z3!RPk$JyRIps62zCuJtOEepztlu)d4a!=rYod&)`OM~c?=xJnpBaLm*lOzSAT|!>g
z+H=QLDtJI*B!^T8<&`;DK9o-Li*O-67S8XeYg*||{9aERc!P<Y1&=CF>M>HPk;k-p
z?oHTUg?hdpb6G%<oS&@e&=)|3OA=59cGJ`FO%h12_;bnG`?l(3 at 5hTg?W_$_O-rVl
zO!E_(rcy5t(D#8YQAI){9P~UE%0u+vIU_)W+LH%VXQ}L<Z76-D1xCC&4$1~E3>S9P
zjj#mIe}`d|4?@a(bP=JrCr|a!7T`_Z%aOAm%JC_jleHPAWW9>hAQ#!dE%Li%80pNA
zhqvPI#;=n^ZwvkcJ%yJ8)kTo15vb;*0)=fAJdZ-l?1q*Z#H+D&Oo}RFz%B56D6QpD
zrDwCJO0T_lfab5Y(bSu2tHr61{@kdX`5~mbADb?00Xi;+^fMs+!tNGG-w5e{9)Bmk
zT-`=E%gB?5N`@^m3$wV-&ut&`MHO``v<))fd`!o?n9x3ABBzwX^VKbp*VR_l+QzGX
zrGo0&Si#reuEn*`h6*)^BoIEKLBoX at OQ><Dcx&YKMvQKv?Tx(Ul0Tf<_q{+}lg*o$
z_{pGs#M-vw)T*=prW$je!iF788>4PfjWFlCdklI{tN7`uR>A!$uBG>gAYSGyFl%&-
zn!YZ0?GEjB5%mcIh1%Nk+8vr7ei`Ojkos84 at A@MzMxOGtSDqof at mwqAI&am??r3xh
z#(x`4IcLx~kW%3`ASUuRPoR>{LjOVNE%<KbET6!s%F8b=Q`7d`|7j=Lg(f{iZ8<N=
z?6BqQZ0wU?yx1T5L^Tha4<H_L<Yx|<0pqTCNb5zoKN9G<W1NxKIK`hJ7zxmVH$#HT
z^wdUw+<>k)rSsSp0s;4LLKnvwnAP3kEJvc;f;(dcA<Ih}BhP>OcMT5l$xXDt+je9Q
zW at y^7L(qc8Vf4T*Efol}EtEkZ@^z!EERnZECgLHZ76yFnfT3P;$`bxd?|%6O)hpRY
z<k42}`65(>gA$tFCZNsSP4*nUIGFibZFB~-BAA_wa<bRyMw?@uq03nVLcY0K at YVHt
z&#2r9gKUoxspJ at W^X{4FdJ`&#7m(ZX at K*T+Na at w&EqU?laFE at JP$#Rl;?tdrN4Bb4
zV0O&nWuwqeB at x>GZI{q<J-!QX3(uDj(E(Df*ZnF1zK#0d1-u!ziqH<l+F_8W$V#h0
zH8+Z432l{yGCH at 7@QYz1$jmwCER85QtBLg{8u?(hi&Ig;rJ8mf{WMkXkb}K%Uy#nX
z3>#pUcel*O-d9dgjAn*viF4%y+mm(S{LhzTeD;KLRO_#C7ojaScf^PL)NS&Bdp|Cd
zrD2Q6&P|<2ht~d!L3JpDtY7thCbMmiV%Mk{A81H?eHQ!<K(9PV*HF=-izIhy>tz2l
zK>x&g|CDLJc~TptXoyMwVLtM at 9B8zO6|LeodXfQe!GYIm^}e)qvM<%@z5%^2nSNKT
z_mQs30op(0$^Mb+6s+?`O-j)uXW*f9(Ad^V&LC3Gz>_sj;0ggWYs^GWD0o&?4yp2_
zJdnh76TashulLL=DF4V;jS&~&4$(F07LAW|)Tw5|nLo{ddTH)``#i|4TG?S=Ln0no
z!6tsJqykqVJ^DfaY0t))#O8uuHE?29ZRxGm?zbD2&Uxu*faatoTNb%rag-tLoV<Mi
z{X@{D%j01IM*5WT+~j?A9nCNgAkx*%R4 at 8#B57(mo7hOSJix{f9S=G?TTOg*DQy3A
zJJF`l;u9N*g^l#IK{{Do3*QXs>;yTukLq>lD{mTZqE~{OLur?UduQ at gUa_7oBH9~7
zPe;4IOuK7L9*~NaYrc8ona9j8(C_==WnpzQVkG;SqM^Aba&&4#-Bc^GA>sR1EQGii
zaDL(w{eaAh6(d=}0KcU$9 at v#H<N?L7<8-SaKDbxE`3<CN6OlK6yGRmX2G2)6cO(4f
zid_h7do4s`7WxXW-P#7ySQl9zC|y%_;N9XR?SR3i-S|fJGwnnMeR4k4U92bNH+hSj
znWyJBz5O7W+2x=nd1<%K(b51Zb+R;!rA+DXgLcJ~gm4Ds0&tW$lennnyZ0TMOZ`T)
z5XCRGgzcdyZLiwxYGif~lH|moe)pUaa&$YGGfAoa_7nLyk#v9i{g7pRwkCsj9EG<3
zJLNKsV_HXOxX&Qg_hdd+Asb?45PLC5c-7GQY?s6u(4_l at g#Uqt#1ns2=0Z&CH!u$=
z{|`XdeFJ(<`5dsbL}vf(J<0hE*nbR?-gI3XsD<BdhxBJPBt8y at QZL1vl;LGv2PSbA
zep?BikB at 5i6hdto=_>uZVL^ep6mOTvjLPUS8|KOV<c`I*)Zk at p-@(Q{qg>FyWcA9Y
z6$4r2%{n4~4()>6JN;v93ERKs0QNGO0cz{*RKGbGw-e6k&cM(L-urpbG(JzG?*$Zg
zbOY`09Sxc%VYaYCvEiV6T4luS_S6ZNXlqYvD{os4CCFqOJR5{DdaIr`e}P=Qw~Nfo
z$Q*mPh1?MdEhW2~q~udfPFp%6TEPD=YhNGOWOY4!pO1XDv`^DQ3sjo4rF at 7|kV(X@
zJPjcb#2OJN>zEW!)Va+n)9JprX`VvRsugNMRy9EF>R!aM)#}t~TE2ohWFPrWw_j!p
zu9jq*X<8tZ*u3Z5CoM(YU+?=z^4#ywbI(2J-gD1sw+(nOeH6n{k6tZ<f?By^rk-+5
z>$|mmwzE3BnMbK2vylV^J6fBNMPjo^+-d%-7C0o~;(^hVm{Ge?&g2JQjB3UC!(?=I
z&wq+T$(#f~=!w;`*HcT at TzK-)Q5kEkY1-`TiTW}I^2`k8jk#wBP2<AT$J`}B?U=hb
zpog}nZini*)a_7hx4y5iU&~q{u(P|d6wo3yJng at Pe<l6l^aSafPrLfl(5gwl9 at 0EH
z?oNtHtfxxQ_m!x%o-}>Alq2a0GoBarr}b^1hq08C6;O(ATq!>FWbkWJR(*ZSqozbf
zU$NWLpVhaKp6So%+fI-4r;!Kf%+60Bmj`lnjmy=g$}SzvNLc8nM>6{EgVHgz8B>4w
z5~SWcE_Lcuu}j}4ruy{xm;2;r;UAj6GLkF$uI-<s&h*oFSr;lqwO6qr18o;Ak{v5u
ztJkar3URSrCUS5#+U-!!YKI>fZU`1C4-C^_fpU-H4dyEw6(u-XS+CRvCqa%a!3mfz
zXdHeZs8=2cYL$C}qOuXz<a&h$HJAd*q$9`rW*j`#Zx|^F=tll_ at RZso6-w1spZxGE
z^Q`YHPWALJUzt4vz(6s;0M5q1*Ux^Jnm7FAys7YuUk-Pe`J0#p6j7BHR_#itt$Tm*
zms7JdAW553m8ZMPk(;E!>?%nwRY~c(syt1OJ&TZ_(INd<s-FuhHcQG33JytBZx6GX
z-aR_1Mbi(tw2(_Tft4d*YL?D)MY?5&07KAT;Ka3xd3ddJ<cZkYL3&;Pgz_mf9<`De
z`M$LNtL2*JYTsklY~C20URAR<qpD_KPSvA67jonnTF+JK)4mAi0`0eWoIg|1I!5?M
z)?84ULv!1%S9Ifi3qPCQKR3$J5`Z83nhWk0>#i0e4<Y>I%q-WIs;>ne0ZId3A(b%S
z!(;C)b6_k at EbK?Y^XeDx8pl#T5{$6^9Z$Uk`0;p&O&0R#xRB9XR%w94I~MhnXe>nY
zl at RS$LUdmV(SIexpoX9pG`|IQtpfO&;fL-*_!Ysg7}JJU)*F?@c&eZ3?QB)kC!;Ai
zrHDF$Q(!M^#l1Rtoc;fS{lCio_p|@ssCiWBSj?lozQmVof&XE5$L6uR%Au|vsOvVM
z7H=NaD$4G2_A-r}O!gUe%P8ssF~%Xho}Iq`9$^Oa2F|GTfpi|?9%gZGjpYhrF5v>i
ztYa-x&-lB5bI_`i$9$Jcld{+wS%{yOD4D5Pzmmybm?B+dk11-+ZrJxI(3pdDLtBBK
zFHE(*gxx^A-B~aoMunJWP&=eMCxuD^F*RK2MgDF;yc`4V`;=LW{e4tGN{`M6@{GRy
z80tHcD2CbcAkT at l1Pp4=fJ4L-hTyDGKlU^=R|Tot=r_^U$+%Wzgk}Vy7}r^Vu?qK<
z*xukD6D<k*fMPEoB<hLP(Zlr9fvq3taSotPyg|<imN}$qig&pK+W;4ufn&=TUqbzy
zz!`ZCIYP6koNCF8*B9ftwu4AO^NWqOuSK^}cT^bO2&raK8u$;>J6 at fqjX2aXp_}kD
zM%4p48iF^{fscdl!dO7dl*O0ZHL&f9mPx^x?aQ#f&c#ZFV#fNYn{H6+O0_8WYik_*
zni|gr{|q%&FzEBUEv<x&@aPNWh?|uE<o*tJqb;-E*S6w)?o7I&ylS`_#()MQPjXdW
zO;jzrwY2rY*59-aLCK$78G^OB<-lKlHCXj1ce6_%(<6rRDZ^_cGTyd}+iG7cpK^a2
zaAYg!Y~bg&l~>*0-dYO0X9 at D9dO|g*LzczQQ0`Ma5Z^H_cH(F(@R{Emjm0>uV=S&n
zxu2E18%u_7GxX+Nr5Iv<NVf$YAFg0MT at Niez<TR}T+8T;R9j|4xDQiwF2-0`OK!SM
zxeH=jFqW1;JFXcQUx at MaUe*?f#TZC29pkWEY>nbpW5=~+neszrRMO(L(2UBR#E7%g
zTAGq;SP(3DvRLU61(I>Pr+*Mjb>&bAOC`n0FUW#qg4mNI^ySXQt)&1lvt5m}81m)S
z_wI at Z{|VfciWxJj^jv-lE12<xJ-(dBH|=~EzAj|AVJsZr8vN{yA--~VCmgZ5vN`uY
z5!*&yq^|N=`$`8CdWIIemmcyivgE+3T2z!{hPE40kUI+?cVW;D<+@>H)}P2KpMC!U
z7~gd`wzMKNQ?b0h4$@U9o2dKHvS5}94fy_#;%v5$O9AtX8ck3yZm2||4AwW~Ujgf>
zb&&ow5I+=r9k~DH(ON~qH9g>wGHIT at Alajkm;&y}@S6g^sd!^2iIhWa&G19p1#-Lo
zQ2k&X{nWj*t{}98?c}obG;sGz;J>tTf2zMcoellHF}NHs9>xBCm|bpU{Vkv~=rZh2
zlxIC!3~86KK0AUY#SE$1R1LtRX*xfN^1$E9*y}^fq1T(C*E6D;(S8%`H$Nc6#INah
zDm>Ni-zEYHTW5j1J{>5e0XIGEE(-rA>^rIIPT$LRuvw_TN7;rtq~N<7cM9d#$4vOT
z5%stzvXh%~kbqC&Ms;@A?rl=vNOq${NkBt+CpUFLP>b5I at ZNFiPt{kg0TJA$1jTT0
z<*E11jL)fXRC6`1jcL{LMk9&5;YJ<nx8qKwtVes6^1PPx<HE>agMvIS9ksFQLMy2@
zl0NSJ0HK9WZq7ralty4)0tUX-+v<!oc9;iheH8;9pKU<#Eg7f-G%dm0=D{}$zLVi=
zg6|agX2W+Xe3=ebX)YBJ1|sj#CG8x&tKCNH$U0i;OzyZLp at d!lI$j67vDuk~9T at 4n
z?=oGsDLa#OFv7_?#q734KBmj*Om~rd7vN)&dTCF5D%B2fbU9krbSB*|SMDR}fKyRR
z5yZ#SsWuF|xcfzX4FD^^4KcQe=uDodPQ^5`(H8I~aTwqd&wNqmqQ4m6<mxE16M{M{
zBePO(5T<q%zzpUx%WU6LXh3hig-$YO(%c^LTgxbi_mHZV*H at 0B&2&c5d0<v*_?xI7
ztxd9(xc+&8?u|ifXhr-6T$#@=pnIWh8{+fX8>OwxR}sHjF)I~R_uPDC1KsPW5s$<R
z>p!eByEZ=|D>9u$H$cjLR2R=h-}BeeeUMHUmy~Kc%e7?71-c(|$Mtm9i`Qd$$_B;v
zq{W#$W~lF~+AZ{ii}5vZxX772dV=bJM~7Y=J;H1Q0;TUJqx|y0$HrWbj8UM=+~$~a
zt}akPd)uLg;pOzO+m1St at dl;!hRAyz+NjqzFS^|~Kl- at uy66*3S8gfOl{+t`D|bHA
zm3v)ESMGw8uH0{+W at M%%xteK7zKh*c-5d1`i0!%|O}lsXH%JoTXN at ztb6Vm!wCy;y
z&A(1<qyMqg*E9Y-k-u(Cr at alhQn5c1c&Z6Z!^J7rJZi&NNGR8(N^~)e-hAX`^^K5d
z;|{6wiZ?W=_d|sUGYBsz*@Q2ynf5P&r<@6(^7{D5y#92D#QE)J;&(~472)lXHz*gr
z9rl5T6Yjpkev?`|z6wHZ8Fdw|d37?C)mKfZH7eB()W2W&g$ecbxxeY3V3)Yt!}G&)
z!j8~)!t>D=Dje095x!%<4V=Oov at piu%|FEc;EJ?AxSSStE at 60akRL98szRxba<av%
zjlAhkgH-M-^0-qrYdGM@^Ey8{uRHICmMmnY`>sgo8{ZOfUhNEK9jVBl0denKk at 6ii
zWl+!fyKkptdHy}B??R{ojD+R?`HEbBPL)3 at efk|W6~A(PDt_hVRJ6;<O**b>RK__!
zfik>>c5}mgFOM(K8-Y{$ipE4dxhU+PjkC|B)Xpf{L5_BXim5q}4VXlqdVOrg7f_>;
zY>JL9Lr#U7fs4)K(osLy6|H(H)nml5c6{OKsNww4ZDKJM)E8UYx66FH{%1hv65QTU
zA*=;|X92h^um%Lu6|DugIqCs-cT^D at sgV?scgPa*uIoB?k?S^hp)1>6tQbSH*eU93
zY!5OzleKr_&f{5a63CtSk|F_+N&RP;Omuy3a4zFLk1 at W-98mevzcJ3n9Qd61{+{yn
zGvCL|*AwVfWjeS=P?{EYu<E?@vh<ZtCAXFRaOG2~20l+eYB0iG38fL4^|jHpAcwcZ
zzQZvaY+oLI4n}WLiZ@!Qwhk?91>$P`3{GNdJDK}mYAcz$5A_L#R=Nn8j(*^jLZj_O
zKeliaAzWF;%BR?<>{9v8F)0FfqCz2kg^|3o_y)eqPDr(_ffnOTHQyL{!)pNCuVv*9
zpfyx~dh?>l8`1+*=QXJ7S{8^lWt9+cPVKAXF;MNFukf9ue#JZ<l1>Vv)^$>QIg at Xp
z-Q831Zlz;gd?u9xvr_Qp7~nd#FpWfJw$i+~f>7Fr$_jaJQm{x3MSmbu%`=umhtz1t
zI%o2WhTz%IZB;W7TE#1HiU_ at Fo`>VnC!W<h$_R0B^sV4Z+T*Tp7gE8MO(!XKdN}eX
zzPdXZrP|@^6no^&l#D5An?T7U4d!f~90ZD+I+)GvC2Y3-fKrg5Lf~SecpeQ<YXM$G
z2OP;JNV5u{?Ne3j1NXbmPjKf-Nd?aid<5&yn37l3!48NL`zM(VNZ?T16{5oZjut8F
zX*d06=eyJnJ0NwNLo-wGbPcq_094^UP)kAJ!pXE$dkv~gEX?b_gQKMzfZInI|4)Pe
z`K-8KOLf2-Oj4Gx9veRdKlB)UW3bbeC?4>jE?Mdy<-WV}RPMw5JD^qzf#P05 at 1k`I
zN^<)G`HBT;aJmWhXILeF$O)$W&Sc_`5TD-p2~y_V?=Exyp^{((=4%bkmuBhs`O++9
z^VO1&zbI8-`A|o^6vlBrm0_GV#f!i_r?2}g=KRGKIe!r<3|jg=?H{s}{wZ>{toQ2h
z6)^S5IW(KCd<jOU0!x9GDd5*LSyl)5Y5?15t0eBP>K#JD4}0o$eRuWGgVoM(n!)<4
zu{-0rjowzJ`e47}+kMVDuYtT at P`|fojd&@j at p_c?*6SpF3aYCWZK#-OTf}z0az#5|
z8O7 at 19pf}hB;66zlz|f5Fy}?|(<pa%T51Mi&A|MXoD_~{r)ISa`7ahaHF#c~`>_xc
zaAayuKl2-p#np0<m&1_Y=P>rHWm<83%d{dJ`@Jf?fV6_b4RS~~go*=3wPy;u6<|7<
zGRI1pdqpX8St+&bg#C0%a(BwuxQMv_R1xlcAVXPSmjBLCdERcM<Ua&TzO>#{R{qY>
zG5K949SSX3<?d8(W$9h)g*5Dx+C5j)x##kJ9dm~rodvKqj{r?bP|`@5-cbP5@|(bU
zNnBq?!7*LPg0d8Gt-=K-ge)D4Beyz}m!4-U`iKHCc;cn{(5=!8;X6<Y&wUtMGD?$Z
z|9V9${yLs&V5yIerM^5`pI?#Z^AvvKQ#pVNG-Xm<<mafR1XgmjKTXxWim7!ZrT?>p
zhcqz8Lii5oE94q*V-9GoDsz6c-Hw<sR5T!B${mYjsb4P>w;gDB)aK`hzMVMFwD|=D
zd>_O1434eS4wOj=m0<sLtH!rgx9W2L#!_-)(#8<l#}B&ur at -3DvzPYs&!stB+$qQ6
zk-5)KmnB*6T19~}eA at 5b>%Gf+clZTwvHF^T)zorDO)ZyeLVYbbhQOz6zdVY%x35V5
zc4`!%Z!n68m$@r6Ti7C}X^;3K&4Ar*fw+;kbQZWPfQEgJ7G9`Tu^IAlcqWN7o^JSx
z(uYI0g$e=dPC%}VLGou%P8pNHzX#SvKa5^CqYrHTlYlzQ8KuUzu0U%1Da#(|@+*t4
z(JGVl<UYlPXRG_EXR>OYyL|HeGT66&6e%s6c2jTH1d&k5Wu~$}O_XS6m&W%@w<eww
z6e$<vDbRo`pHeKcv^#y|j<RVhpTaWAXU(6}QRvI^?QkZ8SgM_hWk0*A_qAnv7Y)@_
z?&DnNvv)mRxshAhB~-5BoZaG(RB7Xu9u|kP;9KDrhfMJOrs#p4i#np!#M)@$Vc*iN
z+(k9@?kcC|Vx1Xc^{+3+*w+?Y8%r?W0P(ul7C&iueR0+9tIo4DhVXNk2IhcEr7}V)
zJ^G)tgrBS0edCZgNR4%5Sr62+YoA)ri$sHGiH3_&C8~+l${NDS4GZ+VKo<^rXvNNJ
z0uvZrG>@wp*h*)e+cs1eDmtf&X@@k88|2b9LXBvpTyuu%<mgP!nk?h<ql62d-wyQA
zX};p0MDEvG=hyO`zW|Ch?n^pcQ2VWlaqkvcqnE8Fh3_;sA93v^9M-wrF5BDWKzfQ6
ztD(h!A-6)Eg|Mq>=n{nt at Ta+c!+=z8w at S5qPS%zrlzYCTK%S?_jkf2$O$D)t>QCw9
zhIGzqDdvCe4#ph>>f}UY<ams?5|QuJytcT$g4I{p{4d#7d}WRNU~T7%P$S>*BCAng
zHD+B|BXB|EYcxQOQLM4-iW)_M8U_Wm&L~&E-dl~eHXjH~h`F&w*_1Ae6<m!XbOOZ{
z1G<ayif`p=k|t(TW4&mVn)n<EYTO$<FX!m>UKrIOQNESPr^SBVkjZM}`OZ3Q57cCo
zEt2ezp=O!YY-IKFQL&!$8n>Ih_iYzC?vdTFU3&ngg~-nOAiD=xg8GE{d1T at HqQh$L
z3Gzzypc{6ODX_od3o$~T=Q(n{_#nv>pCJ=E3mnuSuTg~lU^ay1LRbdGF9_<uH!0=&
z##pKkDjy<02Uz>5Ly$<lj&{|_QBS*_8bdP&L@`N;Z1x*gb0jlb+fpjKP8pu(dY<03
zuA+x#$29%x<fz{;$jKM{`id^u(Dcm80l(puQpZw4;%N>CDGla9o7-P0h48B!PC_b9
zN at B&yTv5KoY>+EWqIF5Fv8D8R?v+wc(y at Y+j{Iu1L=$qBR*dno^n at 6k;kdP0lJCqB
zt+!#y=86L~j;v}j^0c)G{5AYsYG^hbD0Oi6NF%vcVXGRZPlb_G7|S;xJXvAQt~IV~
zK|Mi<!|Z1DFyINp{Iar)n|c+qNg at j!lBiuHJ-N2ijJKO at w(=?NmbPW^KPN{b`tm8X
z488{V=D^noX*6r3$9>>VYjc!Oy~zr$oYZ$>`BdlI at SRjXb-4`R-14c8Bk;|GZ!>%+
z4_^y4E`Z-R>=G%1 at AXigxJFV4#AcRHojU|yX<S%#s^t8#{JjsrH@$6XS^ghe!8HNC
zFTppXEZ-->H>)iF$UOL(pm%f1r_}j7&E=D?akW)IywGM-&w;S#2<O;)SX~bRU-b;*
z<;M1z+?&Vm1i3e}eMZ$Q|1?VTe1>*im$+p&&$I#MmX+BEvytm|k+ecQVPn+zH-Vnc
zt=vyEkqwaxK~aV=23n{`=9(uoiK}<gq<`Xo2l!ptb3Lrc+EDQzKOg{%rvXP=lb_Cu
zgd~rfend!6gExBOKixB;oIeNk>Ie$~R`Ep?p1(E}v$SZR*whHA1>_b|F9nl7y)>S0
z`<agED^<^T48YT#a!FeqkvAgsqbECwin5=*bF44i51f1Xb9;PBx@{-jtoX~f|1u%(
z*XuttUbdV`wbq=OJnTmBZR2Ac${zi+x9VQu-%RTvlZ|K+0|g0kt!cQUO8}btY2>c`
zI at ETLT9bi)J)w~JTg-+W`CsiA2W(;5v&GBW_!6|w*grL4F3Wi5SoveW%v0vrYQ)X>
zBGQ_ at hi5f^3^flkJ^IPy3koUcFXf|MIrX;RpN;ZI!2R{sAL(d4Y7~pMB)c`Ah`>FW
zVV at 5K&r?mp?^p{Q-z?alEqFKLOrHN~B~Na{9T|7#)UKS%cI8sol})0VW_D-#zTGt;
z^-A!4x*kv2fi5ou9%fT8<77%64<RWdXS~#2S^iDEjNbeJ%FBlR-K5^gUO0iAzS1ji
z+?_60=b1*&B>Wj=>F*qazWv;97}n4kOp57Vpr(&8t?7FK8m>yn;X7zA(1P!w-Wp!=
zysbd5(LQw`jm?4Pq=+Z_fD3 at OI(K3%P!b70a_dMp_*Px+MbxdheOVng)|VnYTTNCY
zP3*8#b1sXR-YJ7C&t>8GHh0qrhh;q(d9ke)z7pWEiET?9*%DbJxk;NH?e8USDf|9S
zy`HUa=Et^nINnb4#VQMhK1DXor8mNF5nn_Wz9%|nnj?Ve<vnNQTRZf!t-~<1U7 at ta
z at nn*mDzw%#@tbx&om}~hoHbyO&5g2bS)iA*78nM$4QOSlK^~~9 at Jn3KB=7Va<VL@~
z-o3I>7I($H+jd!CxB6roo%kWuz)$CJuP0HjVi5(BYbu~OxN^vWPV>cC&2DJT4bThd
z8J`xv6ni?J=_oRj`il6uSOaQRSb-YYmdF3&*jufQJ)@=<vq`QeNmtY_zo>OQ1EXSh
z^J<J$t~JI-9Jg6W%I~T*V(P)ifkMB*F|d&zt#JdCs}ro|T6~LkgIGjzn++yR!)+*V
zl^V6yd0I7QGsJ9H^E?Q7c+Oh1)fk`YT1fMrKM^-+&X8OvS9<=$;11V9#T+-NA<qy9
z+38y7;Y?eg9gEe{JV|ko<UW4_!yKDo#x}c&^~YOT9Om;RT~W#nHoCq+L{pO9F!(Iy
zjBBk+;a{-co@&#6l8fmu1?*@88!}xBpH5o8ab>KFWG==OR*lve-4)*)=i?8!e1tQ-
zin**cFjDu$e?VtC_O6#)joZcg!l7TD+cVe{doB`dv*q}R at bZ!Pn)v-Ne)$)Fk0lQp
zy<8L5T!Ax){b>4_?UL)PxiE?_b}>V9muWG*Vc>DcylM%@9VqjOaVfSvrj6&w7M~b5
z#-502F{Zgoo^G6oso5N4Vw+<1F}+#>rfB*j^bO`|<i&Wl8X9{trgzNSAhA+YbvbT)
z>#f*RF3S^djh3TAN8}gSHkVY}+-U}146XR6eX1nM|I}-mIGpXsFFZ-#L$Tc#Z^r(4
zSs3gm4=LoLD}I-&m>h`T6R(bC#_x)MHzvi`$E#vl at qDOZ60AmTb65TH_#JWA(A4-1
z at te<0iI>H%#uhhsA#BC<YPt;t=r?MiwTn`1Tm*0cak0tGUGatSQj8fi#b>i`cD#gr
zbK-?8M-7AENop?E=S71P<2fu2pxu*<OU&(JZX=7I6c^by*IKI9hb1(3d6J`TfRuJD
z`Ic_-!}tn1v%V1LJbv4NCLVy1SOn`~(%4)t8qmRfk|rn2bQW)n&xoO4l5c%{BGwwu
zifUk1NE0U$vl!P$HL`}E7#HOXl08yj<rq}564?raUcefYWb)8N7B|{DT$d0R%Nrdd
z4E^u3IGQ3glZ(`ujNgZKv3Xq7{#}KO{~*55;jSi7&ffLJrSQ#&FL33#inoiev-Rhi
zNcd%4>!mh#n{A?>LH$+n@&RqEE^dR;Zj3Rghr04$w$husVg`i0SXvzBKb9UB;C}*)
z>y4>)--s!3reYbRq49TE&u?_3fAE2eq<>)Lwi*EnBavUcPGXuiH}r^CYlhICRF7^{
zd*n=hL9i9Bm&gIuuNwhAA3>^Ucm||C!N%=Is}E|~m#T#WY)Sx|iVguVDVLgo8({|W
z)D$oSWCd!MT#j*Z6Px85VWhRN%j&K3V2)uOx*FX)>%lX;+OHzDUl``N&O$I93ts}|
zvQ{vxdMjYnRlHHWjpXsS&>QQE<5L(;B}Ogab`EeT;kmfc!EMw*3m%PYz$Li|_n?*E
zVZ<Dmv)PhrC-)3-`2^0oZwKPPhc2gZ?PHh>(pXI_Zbzz@(3<C+rgbc4ek$xbZ29vB
z6Xdm80Nc)0!<uhZ`@KP0BT;J2dVFl0pr0qOovi;bMljMjsgbTxu}t5zv&LaQCEMJ9
z*kiadWJ9RDBIa#`$5hOXYony>Y}#1dzpysDnUsZWo~>_8>MVF8FY10{a<n$8$MPEa
zsE5bB8rq=H-{%fz0Il*Tpb0)?l-`F4e({O<R_a#-q^{qfcyFOF9n_<@7^>FHQO at I-
z_IJ8BfZn+ at 7@W}g$$9tr+Vh^_jLRBDp!EIh#RX7_KQ2{u at 0ymS?s7Tlvh^pRwdGZ^
zzU*f<qg^C-c{Kxd_8d~(xei}2D|+vA>NqCa7m$rX0sc4G?;`8HcMoa2K!Zi=qMF2h
zyshWV`1)C1MSZUQnm*S~&1bI7nts<t%~|hJg`9Vv=F~UOgSE1$jZnKhzlG4Jy}v?>
z&xvluX3G*eIZK>kGmB~6x+Vp64W2IS=kX4-udqKo!O;q8j(o?-8BJfYT5h2nJxvb}
zxliPDv$NjXom8i=GsM7ELDTy=<E;dQz8jpVrcul+Mf!)I;q6P%$fR|4Q0=%=u)Tf!
zS#6b`pQLaHrJ$tHS0&(aCR9nBp-WSh#~YcBZ2_n*@nGIK9W+ABt;mD5(p)+Tez~s2
z at B{ad2k5|$QtkIddXd9X?~Wn-n}Kr)k1EH3x<S~<>kINuy}tbAQrB at T-I8iI(8jW+
znBci(<W>lI2B=Llb+mJ68(Jx%axjCvp25`5Tu#koF_)#RT5JlT?4}vH1-(WlQwU1M
zvD<$e>d%S1jP?YCEOxRg!cPM~EuOL}MNAL35o%ChC1pXmGul09RW4MFC#Q{K+kE(H
z8pX9yt^2HCCtAwxC7;Jv*CET8T- at _-5`Z}3dk{4_Ft?!0V757;k(U)gwDC_<Gu?ov
zg?94TdgsVLUIu>R9>A6(|4{rJQ2#BybI`v7IsU3 at Xn=Vx3jC1(JzQnxCS3W-eB>3p
zpAB}WQWm0~n!sD^E;)!gX8mV_9cXU^_1}26L7QH|w-XaSV*cus+*pfmKGgUMTJB({
z#w|oZo5o}w)H$D7;n>Muw|oTQ*M%(Le}c`!9`G-Kbl-q<*Ryn6g853XB9}G8x=1Qo
zSaUM0uL at dgUrlVGS!lUq)K-XIi?dV7C%wy)$&HC_w8fn;%eSg4E at ib!;$EU>T%}wq
z>KF*WKx-9IsTi}?;X at 7TbeS{x$o4>7mDEQmhe40Mv|*jM$l>D5j$1}PkxONL<IS#B
zPxQKMqS?FO>sG{+hSMT%9jv1(^qZ!1#VbvusbQRk3L7z#=|m<a)K3VRA-nu~+S^%R
zZzN}6j!#2Rd!VPiDQyTZN8LCEFg`P*fNw&x6dByJV60}NP8--U+wtx6fV;^KE9w at S
z*~Ld5V<*Zl4ZzwNtG70#b^ZCv8VcUaRQ2}YIkHy>tz<X;Uph;EFZb{y)HKqlK at C1-
zWj5}F=(1?m2L<5Mdc8c}D0~^?yl2K7XwAhgH57Td#-((LA~v50N?oaxXglTErLHW`
z8P_~dpCWpv$2gpo(DXob3~w<DD-i$bc=?mdx at OPo0k0bXvm4LXvbzJ{_>qTkS$d_;
zlG-L*T{!-7gRED&TrFE^S-nl?YTW9kJ#@Qk9i2dDw|nTO&QBC=Xr`)j9%a(#GKHjW
zLH<wVT2&X2S|YypO5LCG)Q{R3=xj2Vrqlb-+9A{C0dbLXzfQI5qA)xX{^gh-t>dCB
zbT?qNUfS(00xWHOFYo=_ at i;l2(Vf{**r6NA7`2*GZrCq%%;<20Y=9?LD}a;3ccT<s
z`T~E>_;*wLt3x)FwM%aE>qo=)*Mw}r>%yPKwSg?>$WN1Y!VNjODK!D(6*=o6mH9*A
zWLnUqVoJQZW;?<}^?ndSw5eSr9Z%@l{?LF{C-DYIeFazFHNYvl at ZGRCt|xeh-_=*#
zFC_ at -#kZ4&>mwJv!sVG&c!WEJAJzUNd;-wRvrwi at AGHg+vN+<J$8jhL6n?=W^GR68
zl`dOma-8mzlujL?M=4ZwmY}Ak(>?v7BH~D?7Lh2^)pL3FSPDH#sXCLd{8rInN>!tS
z`q~Emi&bcYUG~yANaND38?V7XO&)(H_Q(^Xz81GEJuY^daS!u(x<s30wLU1ozoCuo
zYaPBFZ at s$Q=eAjD(j+s at Qr5wLS=Ab*pKYje6*=G6QW+zI30p at s?P_}Nz;>UF_N<m(
zB(mIWcy(Tj&@@95NQUpHc7c!)$BxpcEPWPfkWBRbl=%voZxZ-2c1TYNeH{35BikTP
zrmw6i6TXt~MjKh32Ch8cA{+TWx=iT$kr96A%NF-j-u4o-a6ieZe26^ddkiJgM>1>;
z|C?6F2Y5Ge0D2qAkQ<A|I#Kn@%<mKH^s1ji>(JlD51W09<VHnwNO}kZf2r!j68(I*
zT^6a>wy<(PnIP_ at yhAb*IY;5U1iQo$)G*n%rgD(`vG0Z*X-zX$HxNC*;oWNo$V>?R
zzH2AV8 at 8^F60UNPd>6hvd^fE25fRG!ep5-MKpv at b;b}j2UEkx7<2K)-=T`2Ru$mBU
z)5l)l>ANA!>D777Z4Y{j+a7v+#-3XbJhF`{=5}6jWPJ#0e~IrWHmM^`$|l8?Ci0-~
zhSktlzp-*Bx%CRmOGee_$R`q7I;x)=vZ*2AGt6(nb<AbAa4>^}Rv<JC&xE~fzr2 at b
z*O#8DfR>0&P6&Cy&9ShV7)FMz`+a<qGiN`+*Z++e<Dyi5W;w+DO9uK@&LP<l^F-6+
z$WKn=IP|howo-$U5-z;AosYj2?jj=9g+u(0s2KT9)?qT;$%+4iIs=1qBI!WO&4hWM
z9xU<A<0&AUVv=5E7WJ)%`qrEk`5KZ2Yo~X04oOr=KQgsG*jIWs!zB at 8cw@UQd at X=R
z23nSdZzfuoRV*-8(;;<wRi54k-?yvsyydXx7r$p(og<LefvTxQzjlC{q3lwU88r0$
zM5#Wj1$TN-;1^JhY$sW(vuI|eos at J7k>=pk)x`q&)x4^!iEeF-6rU9$e+p*xy>NCC
zfZ<e_jw!OuAc8wzwi)qzmCUD!P*r+R!{kX(uNG(WkZjXtlG|PzzS^~f%v at BcHzOXG
zipU)JPJr(<FbWGy*O95v18e2JWR^=H-wc1K*g{J>j7<w6_6DLMLQ?^_7Ks|d!S|aG
zqJeLDaBk&}k+>^|^5Kn;Z)W&L7;~*B32}39^x=CAFH&NH6$W1szPXWRY$f<K;G5c1
z5IGl2|5}?_-Aqn*sk_K6(z_xryDNY)Tt^Fm=3miSK#wxHJ5^#^KAztiKRjj74eKQD
zQ1`G4VR(>ZI<(f)qK*QfO9;DvKD(%>QKW|OJMbmpPbzE4G}1^2<jX&nf2bQZ<zikn
zXGZ~@HJ0-Oma`=MW6T-(eo#yGK`05JM4LF8&_&$?b+j9`S`E9<V(~d8v?R(Mn}9MP
z@$^xRR_)pWQ%nrGAUAMqu&@0+FcjqmG$>~}Bp!kgLscMx8nhJutKL@|s9mA7h~ACb
z43a-X3Ec8o``e<P0cEJpJ^jKYg;;MTq)A at 6+K;!}8hp`~9#;tLbIn#CB~`n%6Ao>K
zJ~3 at uE`dtnkMV5*?TZSXNoq!&0z(@5Ybf29IGzytz8|f{mqb(;s_QpGDQ(u$dbPA_
zN`it?O%Hdzt4hX0KHxT!O2U)Ua`x at WhRbwJS32rWP3fh&6S=tmraQHJ8s2r#Zj at a}
zX^mP3J8fP^$(>R9i?gV|{^xNW`jQ{@XWBE9A9ZT66i-r>8o#2f{J>RTDytgGn$%je
zHcEfY%6cTOX|3s-)t{jl4wnA6avbS|Fl~JnrCM4{wJ0?oFriJfNT$6Y`BC_iD?9lS
z)ke7RrSQYR&uJg$nn+?Vd;6TC at 4P<Ml0ZsdWGZyK{B at y^_kL}te|#w5^%a1Pm!pJh
zt5=yGFBr4rR?>PXo);KaX0-k$o)b8)6u161E(KyrQENv$J at 6l;u=TaL9=M*ft(|c(
z(5F~hUx%4{CD0pMY3BtVHKM^N{f+rhKUx;}{>*#?d}zh-1Nde-Ij$sd99$XT`evY8
zeVrM4A>iy<?lboB{Y!mmeL}x2VMcx`w32oK2leaL<zv)0&_fXNaw~FvaddCLsr4b0
z?PTF?t(#G{6Y|!e|M5>-Fz!?4KGTA6|6uOZJ`DeexqE#W{wL<{N%iA><a5;71D=)y
zZt7Y=yN2z+Q))v?#yGuSqcma)f0VJ1mz!C;(7pYpX4Wni-qt+Ut~WVsS2Moi{FJ%R
zG~?UPe_*=DPvdQ1;3ERO at SCJ<e)x85AB23E3b`)w2W%yT982jr*qbN}*t#mB?&0MC
zu|QKI&Pc79+o`$TGs=Sm=M4x49>ka(r5JbMp>_}Bd1C_th93A4hVCdmuo=RE!wtat
zKJbkl613Te)+G*Hk9BYL<BLJ`gS*F-O>)5h$5dPP1r~N)kMyX%h<3rcxs945ucIvB
zD3k$=6$UN=?EEG^EpP!~>bLPJfk6gilLDUu%)J&j1tQ9HfU%6gX8 at D0$BltA%1qb=
z^>Iz$AIdCn8Gs-ES>U5F$eG-gmyjI|oEg`atMLhWwLk<pTW|0hP$E(Ep+;bQU5i%U
z(+3m&ajVoHnAJ5C^_;sa91^UTh9`WknkQNS?hM9>WX$Sm!vCZN<5%uX4%G)Bl^;?a
zHfBQ#NZEvTO#l6)1!Ci)r3a>UU6op8GoZbrHWewX2tsV5(2KVHMxi&{&Q3G_J=U+B
zF1$JIQrqQy(pBT#fwk$eR_G0@@8XwwQ`lum)oO{SjjioM7<UoYc5&-(P@@g3;-Qw`
z#Pxvz#nSRyi21it*wO(pp9T8IYS+X5QKVEr=pRRQg^psjz|^iO<JafoJy)(z--9mU
z2~{%u0xO|CFgUuN0=Zq2{(D{(uAVTn)p21gkI==B;#R-#)i7q$H)ZRVhyCNr?Y$y?
z<5%Moa-VBVvVDqMwLN>UyCU`CcZm9%=AAb5Phec`CaY#LM at tkLR>)`g7C0C~{osAB
z{)s3L2RZMfU9 at P>J=QDLj^;h;=^(SCsq*le^BKUUX9C|Oov%Hgb>4H{bY3~1eZKB|
z&iSq9C!XJSe$sg_du8{VG48!C^``rw at o%~TLS&azw*g-!MCw&pb3T&_C{qAFos)cV
z6>2>ukAxpCpZyD8<YgK5G~gkpx0vYqmYqNa`TdezB8STjE#Ft=FVKY{z>%M6HU!tG
z`gB5t<$Hb}7(Pv4FH^K53EOpKbL3_3eNdLvx~Anhg|z&w9wkoi6{44IC62R+=r8}t
zPt5iPQmK|;o7YmDD&wB9GPuz)CVb9L5{|I*%P~zmD0=}di+rW65!E8o1K(t4kwCdA
z1kV^vnUs&5P-eEf!!bO0#F0_V;b&lUme3w&vhBOj`!UUpEselYzQVZRJF&%8HC)c|
zoT^88Ra3PYbz?#)?2N->LAy91i=qimRJ6ftCzsoY8veuzHLX&pFpIltTK2L6Uz#s;
zlEe<`hxzy!?w}4AC*uh^+N^WUr at e~XWum7$KXI+1J&HCo14;p|`-lH0e22nAskziV
zY*SBMJh{;7!eK|K$X#N3fEwYKM*D(BC|?MEFxI2DgLd__mCjJO_Bwo<#zrBnzSnEm
z6_*=GcGaU3qWCT!pj at lwQ#iCNG?tJ2w|r7mA#ok#%T48j85ns3s7nEAK1H3t&86D$
z63~Dz$syaAjEw9ym!-e+YGB5-t1cC<Tump?e++AsVwTp7(w-q(`HoA)4j<=Ide*$e
zk*Y^IQ8^v_0<}c95q!}~{Q)CN=%f#gz6ZFhnI^F`s?gq8U6qv7&@SkYp!kPHueOOq
zw=ylL#PuqjAu1k&Vne-k0Fe@<v^6x7`p`CHo!L!-g;kFxr=xwybK0iTkNydKUjdzd
zZX1&XLfwr;*i-EDu^p<Ot(cB!Jo_H3Dc?$Q at uyE(qMDTrTRsc^Bc+E7cd2f_7Dk(g
zd|Xz+aly$+hmWN}h{&w6VQ3cnPeUo1gjwmKe$~>Z!Zke#cqJX-=-6Y&v?*)N$t3DI
z at Zm^I__u<x+-$8llXpLGrRE1bGrvMoxA=U<z}DC{d82xZ)42ukfJi)EZPX24>cz8V
z#lC>l#xw1!i947Jq5D&@J{H>ovHON<qrj~wMsG<>>)kY@^CThlUcBc?)ztD;ebl4$
z at qhcOn9h@nHxuKi>7{tb;D){h-lRQa_W^%pYwTmZyZAl6`>3_gC%oN62x{3 at ZNl-)
zPTcUdcAj*N*@-)hF0?=e at r2o9tH8JK3Lj~Ty5EGcQZ2o;*HWI&n36 at f`rZS#9k|1k
zMbfGs6)!T(em7#JHwpE#61&lz+@@HVg*oiOU%)p<krh2)f|nH;MxlrYZkKLIZUYWB
zbr- at HDb;9a1kzSODASRScI&`zc8QPQJz6TbmxT&{ud~Y}>00oFCArO&^Mo02sT`Wl
zVB{Z|gW1Rf4nDbUcs1&l`rfz3d_4GW!MCH34)DtNE~i7EZPbSl_Pra&;<VsffI6iB
zwgKM0r^DQ65e(cMxO<wc_~z7^ynkPPZ*m)s4V1 at m_X8g}rKUl-#hFZ0jx4MclCxk9
zaGeD)x1#A-H;8rW$DmQbcS}y9Syn}+OiJm2J2k+yEA2-k_R#b|#(>ySF`yaw7MV*k
zWyw3Cvt;zGta>k&Sc29Y+?JRdcUve4c8e)_N`-96OCNcs+w?VM>chX3b7*>0GXkY|
za!4aiI)n0>SXR{Su5k18Oy`SKi`pQ?VJPn!W&Hq$?<hu29xh3h_{WaLV<qN?e>tF$
zH6*>lFY-}wqMwk;T4H*tH!8knuKID(1h8s$YjBR_X~p~tH*^WKCm3TjpJbAvsusqS
z<#nj_U8r>egOb0f?@3`5Y1K1URm&C7iO_2tJMm>m>*_mt*60$peBPJY?{o>t&ylYR
zPVS5L=Q^ZPNtRj(&<gopj%oL}4pKz>#8Dfl{bogDyNhlP=2z8Z8LMhc>44>DI7q2f
zF9r4Nn-vt<*Mz0Wq=c|?GNIPLC;X}mrIqaA;cK$i>@gxv9<%1b=v8J(#_X>6VxC)s
zHs9i*(CYP&-;io`l}lu;{uXL2<Fq03XQll{Y`aUMW?A|*kx7&UbE_J%(yAIv8CAO_
z8 at 9+rNNLcRa?J~BQm*+jnN8^OvNGFMa#8aXXl+p-ukUF899ItXym+kVqO#O>w|+Cg
z%QMC4Rx|XV(JNXT_81dgXb&28c9Ux^<(28URt~$B=_*YDZY3zHwx-qB at O`EI8a&~?
z|4*qmc}x0osGn at 1*0VzByNSbncX>ShiN2+7&RyuXpVd4)@3Xo6Lv`kI<M6+#)@U_~
z*(yyoRJCz>_;T{?IqAt;f_lXwyBgD3h^x_Lbxk%{&6Bxq3345=lF1yNOC}C8EZ{_Y
z4S?t03ue&5&UI|Raw09#vCi*j>CKZ3mHU!skAKE2J1mb^0i|1sJyUmj=+hL~>)Dv^
zKxq at BoT1k@5gh+$txWb2*!lP-YiEI%8xWd^7xtGr8S|qZ4`;GF2DuG<0X3dB_Y2OE
zAN?)L(OKa`XtfLG!5kEDHrR`sNo-tGnl00N0CVaX4X_4i2d-l=T??h{Qr85N#yv*0
zw1_V6+~On`9}EmB7S<maujR?)*ju35=CQXxW3N&?6xPUTClPX)4%547KAqL>0siDD
z&=J)z>s(FxfM74JG}G--H_$P}O#;qVYm*qzz<-86H<&Kx`1R1%N$Oj-)}J!18nM>L
zWD#v1RJBP)7ZG6(2+V;TlLERR`1vlG%=87%yE3*QOk-Ko0;XVo>rcjVX&~3(ApG;)
zm=^6M1pmEugh>6&en9OXsFBWUc at ro-)GQ}ZC$##BN)OQnwfK&3O!Bxpu>|QBcLnX1
zUZf`YWy3EAeiNO9|0PhTWXiXsorK8G%6i#OeJ-BwR at O(|-~7O)Yu7|;T_)b&xn<C!
zFncU68{g$xN3%m^fwZTyKI2>4`^7aDA_URSobF&dYuo=&9i5Fb3b3lg*3!u2gQcql
zD!3Z!s-L~&HLTwJVo&4^uMRkoiO74kmaZX0I#^0Fsp;T#@SlBf9{lGV#GC)L1M|T>
z@!<6;9)uNjc=WAS?MYR4Z{#uctycKL!5Vxsuf9RzpI6@?sc)E4c1g+C*vpoG^{3T7
znv@^Tmv_ahYNmYCZElrlH=E;9nBz&oG at Rq+ayGxW<GER2MsN^k3NT3*mYDBjr%d^f
zev&^e71N!HLC!T3Vy^WYTj#YtL|3$)SKRbvXL5Zevykn-0t=ERz!IBoR%L7Y3S}be
z&x-a{LU~Ytf3sKP<=z+U=EX_%1dpX-x;pTlmY#NPOmiz05^Cu1HR`=5yzil24#naY
zmioDCP_Epc9(jXm!?)jha!WE)c+25rT*Xk1QW&9mPf+<s<|(o!9Y)G)VA_oa5?zZj
z8_O0wu>0-L<Gbj9d!SA+$F>f6&uym_Lmb-B8Qd1vDl*+Sq{X^`%6te?=;(T?1?sgr
zrcZ?`F$10%$MrEIhQ!5K8s3UROf%Jz0$Lh3DCA#ys7d)(9 at 2X_7I)t;sxxBK{p0Tn
z?`a<MEs?8b{dhW5>8%60UXi1onDTnTg<5<iFSbzQD0Rwc(Gu?_y3N}PJi=_ZtkSp;
zPor*c$#B7dC(3f-`}k3c7wKJZ30>yhq|~x}vtVV4DBI7 at 5mt}4$02h-J+4HJYU6Cw
z7Lsl?d|ar^=#!Eb>)I$s&I+cTlo+!qw>Ih~XL-de3wp!qA|kkmq*L#H at q_`m(0enP
z6{`e?_RaBqx7|j3K;P~~OF at e0z3WTXY)NDS)5MpCyvf~r#@l8GPUu2{JFi6 at iJPqB
zth*;SZ5Th|n;sa~m(n*TTzMazl9EV6dnqY=T{EhO^rbBOVhTIL$Y%$n1Ak=qx0W3@
zJXP9P*smiJF`zwF3BGJ+T#CA8Xt&4X7J&m>Np7Lb+j+bJ8FF`SVOAi4I*}Vn_>L_@
z+(|L#MXC>KcI}ey+AW^<-qKApQGMihQ7=$f+Nd6_ih_F|3!NPG9)YioJgSd+4~q~|
z8}*|8`bM!yj_NlN5*^8mdfS(eT8{*n1S<I8VzePCWitzsNBbuA>rQBahHbYJig%Aj
zv?SNj>z2g^qIovC<1^aT%6Imz&Y@@(Htc&u7Cgn9q;}HwNT=5G_!|>sQmS7~O3BDF
zW)U%??fTzk$kH3kiYVr4yWThNgoxJmf&#Xc*_ZIQbgiD}NgfEa2u-;MrO*pidAzoR
ztR`EML48%8pzk1+8lr3Dc4QrpE=!O3DtJOOSCh<S<aZ`QAzz}XZ^?j%cK6Sw)q$Di
zKe;4_|6vup`f}r?GOMK5yE5sd&VoTVaOtz?k|AMNjgv&m1KLQhV%hzU6BtX>0SDMU
zSE+U;gBJs6xh2<{y<4By&u|z at 3hqyEitmtHT1Q1?@2d~KCo;K2_mMBUCc=I<>(y$-
z{HyBI)B6q9+X(UQwcaY~(e`ife5<(+AhZ8$FiqhPnp at 34D_pQ<rD89(R-fkj_0}vx
ztXWiF&ovR$28`!tsNc8in(jG=uU6?uMWD0j88;ug`6<4SSNOB2ebV|_q2kX;Qm)l{
z+TWiO<@~uPh0gbanyPy_v^mHrS~{!ZNFE8 at T;C;S5VEU17#V#(qn<6IU1X&PYgqi=
zCA++_g?RtBj&Cic4zKZGY4{%siBH4xAhd`cpX}O5_Eu3&tmA^8Bc-zUtl}^K^(9%}
zTui*- at IO#iCa$gTQq!YE)$zSm_X;t#vYl=-d($)t-!-|Org^ZU8U{Rz%#uiFE;2V1
zx6lLLR{o$7!hO^XA>yGGiwYZx>C%^$zv60Lac~u;ZO?%J;)AwVWI7Ar;^t^=<OhUk
zQ0J4D8l2?O0 at X_2HmdloVhw?jv9}woH8rH%PzqE#w6xD}XwMiBtfYo`ORPRB!CvGe
zTgJ-KMLFA2!pZvxP at b3UUY*xqjuO&)OMkxPBftwpd87uE>Wj_z(g^zm&{T{t1Q4{A
z<>`qW at t&2J0wJ)3?q#Q_Z{B*6aNh}JcEV_!NZ88e-1q%hE&TtWe9@&cgxi?s_Fj_o
zRx8xogR@~Z$0d~gtuk+!-(G9A%p`RL_`bFn_ow1^5Bj}Jn;NWUuLLP3KYxJPv- at E&
zu?{v6>qdaX4|n~h$I+i=t!^Ra0ZJZsH0|iQrC&I>yN*N6=)wO*TeGdZtwjy``t|hj
zsx~3OZj&wa at L?%nYW)ar^qQ6fwX8$CmmB*6X&<IX(t#@3JF0JXoGmLm>P3p=g;&A+
zy+OMVb%*yZD)O4I<z9N*Z7+Ae<O_ElvQyDr<o+kl<DwZb<9^dZN?LhINBO?#>f8Rr
z5i6`1n6=?bPx7L-tM5bURVwxmS|8d?yl2-A(!Krv4i|@u=&VR4y*K`MzaTvgyKZrW
zL(L=3<X at U`{H?xxy|*X)FfG|GOZ(|wpsbwjT?){=$sH-&ek8Gk?kk`5QiJPN3Y5m8
zq6U$^x2Q-eZiyd=whkYR1r~H&{|60S3iD$RmUO-gc--$M<yDvLN{>~OM^5+j=TscY
zCkXYlL|zaj9WS248rGlVtYTEE at 3rz#{jPX0?A6zIMf|YG{S&D^E9aH01i~t+X70Td
zyr5En$TcNyqCJ<_2#lkjSvfr1?!Xa?7u@<Goq5ox;ORzwXvuIEq?$QA5mq(_X-~1$
zQHd*wR<y_mT(Fi*xRzM>s>>_PlRRjw+(7QDGg~u?Nwn52M|l~rMSF%-q<|w%8_(Wc
zwObIYe0tGs4Dy$xc1K5nRcZka6JTMYLY>J!yO0-)%uy`35|E-rUE=K~TwhAHmsv51
zdT=IoJ7Pkl*UMW;vmVk;>?oi!oymPKr1BSIUUlXC`CYbh{D^-c$8qGlT(=X>YnHOf
z-qrhPGI-!gOV#eoR-iE)RM)W>-{yV6;oH1m9_FQ+yt>G9Rw-Ri=2CI at lKS<MneMH!
z?!ADgG?!#-gSYqK4F?y&JiH&s?wSa5D|c(HGL at _qxbMQh1U@~=2ngrYeTUtnFpPQm
zjE?E`tBoo22x|309e#?rU9T)3^x%$u5~-1+QK5Y~b;5{EfmTjsmR+U*Tn}1vb^`$x
z<-_krJ?M_|F#+}-a<*6Ljn=t!uNOr50Wl_^-3s7MrULv=jjs#n5aa3w87}#I>a2A+
z(ymegEs at aLSOH)}Gd*G|pp)R22maZpJq$I6LF+QGb<plPsrCgRt+V|D*DZ8*REXRG
zt*vZ-5?Xt;GnqKTT6;CL_Fsqo!0e6MqZ(-MR&+--F)eHF_UJaH2hz<x-BTGO9)*i~
z+JSq|2RzVO5Yt9AgSsIBdQjp_{;AF_R|@1|NL|8UW(I^Ej|w at kwpS6Nzuixg<W(v;
zT>7H+r^HomEuC!@n~Bvjg+QBTq1G=m^wFG2XN{y+iX?4>ZxR}W5&q8T7TRx!JQLJ4
z2zN#aMVV@{#SzsPiQC*<`$=3Q@$}HlxWSoR^SwA=h&AuV1!wZxIqfHD8C_wWw}%`u
zDtoauw5j^->h_c99v|mSuDw5sc6hbWM+La>15u$KdRs+wXzyVg>b->T&v0(wdl#FX
zK*HX+7{)tCLF+PkiXY}g3qL)~i!nT)!i=&UcEWU6*Ag`jx}^so_5o@@n{RYE{Ta-S
zG0H(m8q5zzXESI at b0#khvH3}Z`MH+OfDv#}i3(R81u#!;>$H5*Q4r(WyK%Mt=?Byt
zm<pqAfV6t>8&%7|9B&o#iFG23F~lkB>w81RfUiDcFm?*HVyT#t(Xqt?wTF%YALM~P
zq{9zoyK({dncI&;J9DFM#UHsNas=9xZoO`IN<X|pagE-gf$|2Syq5o$QoeQJ|4S+V
zGgitHg-W;3429w>nP99 at g8J~)forH=wcDZC=ouVM)NkCb(EB3x$Q^D+_?Jj+Db;`z
zVZ>t`)R;l{JCmnIfT}F-F`gA<ACcG?MquwDm*2*x_<h(fPz#PJljgw8&p{|?M;l9X
zq;kUH+_!IUe-BD6jPfw=eEUke7UsRknH&b*R`J(!=WC<eU?z*89hFhRIt^_*Lp$pj
zEEEDP$aUt(@1qK=EL{^&4biO%1sVue=AgFo#Y4+u8nhzt;*&8RwKvLUIyF|yR;2~<
zo1rJeu+A*Fh8j6oKbH0n+705bXwpjZ$$&_g<GO(MS(Lq@*(rMP6k=xmai#(G9oF~u
zD4#eEV~npPjDQi=;j8CETii1AH$8MS^`mq(+LHa_w*Wd9;u-)LUyEnVkvpo|cr9w7
z=7hQ>il2>miPF1DpgQQ8A9aVawJ<@UD3|s8{6Gd`4!|44nvqB7%+<v-$>QCi>DV$&
zKVnaPFKgMy?DV@(kx~C<Bu|n1xI^8hxl}79DO%m(+7H8;y at l!`cR<|_L)|k}c at wuL
zd<t)$m5NZx+O=B<pK7ld=NH4LBA=jN4R<E1R;VEedsPmo{UfyEnQ&15q4yLLtA)|Q
z8(g%-ILU=?I&=&x!2SXdVU`vkM4YTf3<6NNg5F29(6UL9JH8OuZVdb8#eXwMU%8D&
zdgT$K?YCQV03w#CJB(6o&56Pu)42s!fE%!JA<X;@Fyi>GyoiU|VbpZc0#kfS`w1K`
zg<y`D&{?3|ALYmL6a=zIb10Tno@{H;9%9wh0Oo|Yl%S0|7f>UJ&4X{UvHmUe_85cv
zV~M3Os?bANuM+%BsI?Se{RGZ8&OT64)wHa=F0Kbo?pB3^k<LPj!I^v^M0*0u-3+Sn
z&Vs>%mF*SBaIYBP09T87#JdUiiFS?EoX6mx at tLP8MwD>9Y$4xjcQl!-(ryBKhjzr&
z#E%F;zMdOFJ+?(ne51CBZ$FM at S-IW%0ZuKAu29_dU7_jFkK<Jh0OyvVzskqy+|J-z
zsx$@F!7eP1YGjqG^I#`Gy$Sg#`JQ at x`Qw-7JpXa!exmi>Yu&qBA2dP>&D21bdGDpL
z8eYf^Xz4uwm!FTj)h$$r(i8TTJ@$(g at Uz2jIeY7dHew&c*YnQg$;VQX>##e7FI=2J
z{eg?+4_yMf>bskn)cP`*cM^FIsJ|Xh?O<(WZhLz8WwsJc1H7_?<^yEZ!uU?3`Of5r
zO#ofR)UWiw4*e_ShTFaLdjMqxkvovmj(S2e?Q>Cr6n4RBKkW65b%-gZwXd|2TK=@5
za*%8TJTx(n-0YW^vfZB_evocIw1VcxR|5n>3|gHB806Voi&;@2zC11|cXbxf?UaX*
z*)cx8I6hIikHudN at z$7tc>o$Aw<oFGucke86QrDdIVQ$;7GNy28*^S0&&Rl6u~I!&
z+f~qttT^gboe95L at I$)jYJ7pJ+)wk>G=N1~F(>rvDo+yP=b&}eRU*|l5ycl(+TUwx
z^WJ@~E`?_d?RqQ818j&Z=9~ugwrQhJT448oI7J2A53q4OQ4D(#VEf2>P}(&3sakRY
z8xDFR-Z5+I-&e$TN5mVrsPGU!8C*k(0In(E`dq=2<*UFIR`fV$;QFV68W#(|)x*}w
zRB-(rXU8wbrvV4Tbrc{K?M#mRHgbf$$5 at 1V5Zkxm8OI;00A7xeEkMC?Kt-dz!=FOl
zseV1~lO5{@1*C(%Xjgqu#&n3ygIJ+saf~12 at ZHhy5eS>?*8!!<!8m>fG-DIexBmAr
zgq0}*B(@}M<@deh!y86-u{#OemCE-;8Q&Lkuag#1{&;b~+&8y>+GmCR`PKr3$i*UQ
zYFIl!_V(uj)o!<!lD$Xuw&MED<|UL^Wv at QbjXvO^q=QzfNpv&((#`hR?!;1*&Q<)V
zJIO7W9-tYao89Js%3B^qJPPzw?f_bkUBRe at iBbN%_x$$A9Tdkj7xnj@<RVA>{jgHB
zp_`jzST6=#FUY9?-kGWNT!uV)4>cUpA9BK|&JA2Opm&K|J{z&yGm}ReZ<Zx`eM2!&
zCX<j`Y<iTP832vtOs?JvYyK04A5pI1Xo{M*0G7)==cfDV`aO?Rv&}+;qnfHUTm}_`
zJe`huZh?DMWv-YMZAw1U#^i4^14WnVmhiid1B67~?h at MfWCfjtw4ky+Vpn|5<S*0Z
zhso6NFQ2q{{jkUG7Gr3o6I#^_5StoH#6n>oTB at a=Mnp;n-1Mk3`P`~eiv)>%Q7&>V
zgnU16 at y@~INBzRV(!{<y2WiDwefYv^*u|Re99ccG;$RK#b<tYHMx!eLerBX9;8%#2
zhfz~_OhIbMq;kH+F!BP7)>R0t at 4tEIJvYJIV8lSn3FiVTVJ2PH{{A5Y;HRD87il0`
z2Xj-5n2D>v^;^kvH!upwJ-~-gLC>p)L|Eg~;(x1?S8GTTxtJL0u$~e1IFq*<0)GPR
zH5vxo%I$pM#JG^@FgBM0NO8}ARW)t3nE=l?BD}D at Y3?2=C^XIWGAapaCcBv|wh=uC
zTuGPAl}*KP<atK(JY|7A`msEPkf+ctVIEP<L*AaMY>=h&Z$VAd5dv1rRAwVJmlizE
zAJN(8CjBFK$RvGIP{jYH2lk+iXEWjh*4Op0-^_6)Z+p2?NZtcf$Z`w=|BK*Xr_%jo
zn9(s7j0vIU{@YUFBP_gdEPUBHen3-KvC@^?6uc&tCdOhGrF=u9HL%dRsn82wD!(Wd
ze(6i)=T^0GNI5p>k&l`Mv-2!T4)D~etXF3&d<yW-Tcflc at PT%ugcTY-6+)~u4ee=T
zZ1^pVM`#*L<Hj@?r^qaCEuDqoU!PNPr}E09X(07nD5W}lDxNW#KKz!N3VMNY>z at Sr
zZq<dVHeIWV^GDvH`ouAOS$S9lPV!h#o03zW7%IA~&zGGbP`nT7EAGG65jCt>bHV$O
z^&Y@{gJmR?DNZRYt(qxlUQn7Ef(2DGxvQG(RBqA-C%^DQQ$zE#pw?wc#+n*j9L;DV
z!Hj1udp0&Lf8mAZX)m0tFKKFMB26DPEf0!RM(LJ=Z87nn6xAH`N3{p#1l>UrvRH%f
zPu-T|>C74h4VQ&)uuB<%a4X=mmeA}7>}}Kd$g)2EY>rq&^m0})2UDFE5F2mWQ557A
zv+s2W;rd-fq+Z?&R0})dm8svKjyj2e3cD3cG at OPKH$jOrpv3Aae4V*N+tIU9ASQep
z)RpF|=#blP?W}m+9EtfJddkxFP<R*YNS_5iXQfeWhlz*QzUY$ppRKH+n&aY;2~dAe
z<aDSKYY<MC&uY7i-lO<JC5r!&=yni+N`R%acbA7xx at XuL%$rFuP|7)UdAHW*bdLNp
zPimpdRqhOHahu09VnTV+ccI1ip+-!lr>=tPLiS%RqyCkv{R={CMM84 at 8pYgZlO&Q8
zT2?;!*Da9+cC++w=obH^&@v)%pLUtR|7c_Z#)VddfFsTEku0inj{NQCRO=+tJHd?b
zL#PWZY^l=ohS0L`+i0x-Q}nr!d&2vFlpdiyOviCLljNgeE9-4RYCLE4{qroZd>W~+
zx~A~uQxZq4HB*dM*B)c}bHDzJlKzPiHEW5*l<UrpG8vde7oBA@(apXUT>{E!s=Bv2
zW~n~B1pt~LWe1YMLN<)+m_DhX2z at W{kB^@M at dxN8aS17bv7bRv(+$e4|C#n&%Uf>o
zPZR}G61g2hOWLk4<D|9|8D;q^r&i_hX}%x3q;028bAaon1O<$9?Id&B7Q&dlO$~N)
zMg@$gjvCMpK3iyoYqKZ0BfRTko!L%>{_yED=KjgDP)x!nLw2_uexr}?&+z>?{F+Nj
z<jRt7p>t&L4`H;PvdlRW{t?>e4fX*Xm%w-tBd-)kehMRO{tC3dI}TdO6n^-K=mN+i
z{LfBJa?Pjd#6~4rwC9PYhST=`G`$&i+JD*}%-c+g0JhGdRAR?V?0&_UfL7s%A(tO@
zkB2X#Gu#Rk6u=kkpSRN<;P;Hqk%r$53Jwz?;&h at vT=>i5Bfsd<IDSY-@<LE}_R@|s
zdnAk<adc&3=*U7>wa{OA57~9+;Pz|l%x5RLHYf6e6QA|$IPBUe^as!F$sKW2W|M6g
za_69C8PMl$*T$c`S!c1=XdFnN?=FujL_?&G#iz|c&p#C9`^1g{ud!c4TqJ#f|9AtT
zB%SI*c4`hU0SNt$NN5^B>>cn;55FB))xI^#wN^%+h-!Dg5fuWOcs3z)xqoGRKFJ`<
zUDL>Nzme*F&RCsu<jkE4ksvgt85ZemTMmKwq at 2h7X5%~04xo0uNtHWEZrQEU%XTtD
z`baPSU&`J;E~+YT96$HR{A7R&j0%b}AR?$4{wg%WJHv=f5spS?lTYD~%B`MVP206y
z%QJAP(TGS1t;e-7X~Z(5U1G7?x?`=5wU5<4d$+b{r;u8LnYJDL71A{GdB5*~+V1oH
z<NKP|+;i^veb0HH_m6Yl=Y2Fp*Q*=Qi at Wi>R_~z!PTbwXI9uw!4t*lFxUV1K>vxvF
zhozhY{`{Evjd7|5LaguIp4~28Tq7}9TUQS5sCDN6WoeAQC+l5=)4KG!B#FgSe^OOh
z)+<72hu0X~KcWfl_wGEdcUd4sq0S`PAca+GEL- at BV4EXs_CBYuBTEk0KGU{Uw`pU^
zp&6sMC*m!k$ya7YQZ>wq=-903^8JMa?$nDAQI=J_9_?v5p^u1#2**uM;^tMK4tz4+
z7~*Hg%KR~0CebmtEPJGQeRv_vi`C%;c1u!2a2fRmbZDini>V at Gb)kzEU&H%l9YXv>
z7A;@^%+o+B-poUpAveT<l<SD?+A4v(cb0)zH&UekE7!lbNT?iZk!mNtA8#ddkQIML
zUEY67n|~#3ct1$?rZL<t6qFSm=G7Zy3!vo|uSD;4#Gdj0U!^2<kCg)4w}mckJR>o5
z&7R>fb#2vL0zS0@*RB59r{3msuf&Ea`0k}vi3?L&f%>A3c-KnR$AWLU>f^vyg_^;V
z7}{@7XV%!~GPSB6MICC at 0#8hmS3_$=n5X_z$%u&)c-REk at 347voQpoZI%ZN?(a$qc
z!<HTj7I_x|%q4eKR81wu<Jto&KILCp+4k7Snl78V&nr_F at R0pNgX9(N2D#*Jng#!f
z0<QVrO|#)Y8U9n?p98#5R`)yboOl7(V<ugwd#$40?JjrcUlj1BcaY|)h6N|^zTG+S
zoTA=UniHv`1rg2JG`fL4@!C>H{QJP2GB?3h%dHyT+Q$syE=d+yOegoP1sw1sV1jdG
zC-6CwQMSW-+FctsQ`HukRyB}q&t4L_cBYDok0=kjYMIOvysMU-qHG$T1SRRzTu at q{
zbzm*{Cqmfz(UK-9w?TfF$V>X2MnH>PXhsyJ$83nttdI9u2A8QhEQ2>A?+*Sf$h`zy
zD0$#UMZ8mHCZQh0oifz7 at N#`wP~T*zZ#MGe5H<^24gQ=y%Rs&|t*VXWJ$q^AK-EFn
zqGY243vt<MeG}9imcfkC9Frk;vYL}wsiU~w4S%#1E3vrt9YqNmXQqgH>J8RVUtjM)
z=HBa7>SJ-lo_N20M~|uTjNoPV_LzX;O$Us2UyljT2nqu8+ at 4|OYaDGk9rc1?zI=u@
zX;30_#GbZw<v57x6?n#8PEqF|P-4oW9$)yj=OZ=-xGrtW|BAVdhOd?ku+kEMYn>?U
z(@JZGTgnW at 8%mm|7*%em7pRsng$2q}OJ8tW>b6y_A(|8X$yC5)@)Za*Y$+?MK+66E
z(Cwmd5ODhhste!dwv=d)=R at 8E-T^;&?V(Q^%WTbbvw1hs0|w_vM#w7V;l6&nBf;-s
zJLMm7k%sR_XX*@~iz&w!x|%tSt66JS=2PwPIGCpfS`_}(@c6KPcyegZD5l9pOrzu?
zHi<5fC#qOwFJLAW19=yAO>Z}#?SyV!`@;G-e&<BiYiwfLjZ{}35A8uap^o?n-Y=2h
zL at kmmW)Q7v at 2S@j|9FbpQ?<}j-l!FD at dm`jv={A$#>1!yK5`Jh8PCaJi>4s%TMD?(
z-)W^wamDTMYjSF$5AA|}T4*6!+r*U+od2{yF%B^`wSZ^@a at r|8J at KMD_6yt<4ts&K
zD(9Pl+wL8zuiiyWS2%&xm&Z6wYJlD+xbo|WHFh0%r=EHOJ7wFtEk^h!otUV`#77Ef
zEw-(I6{lF3CYVJ|VYoO_r}E{dmYYRyqv5U#8J+>XqPbW{?{!z8Rzrrz$<bLrF+{s1
z_1*665qI#WuI<j3IH07?IrVW-L&opAKhn^e6_FZ5<ek410T*n<^CzLx-8n&fsH;B@
zLT*Ezs2~9!DG{!kC3kn_4Bv%tOs&9G<0_W(^b82AiEy$OLh<Z&?C-Bfn9<t52rdhh
zc^8M4h$)2Gskd3SBpugO%m#jDg2J_MyErG|z7_ at ky0W5|#Ry|BPW>{tQkkZ5lNuhV
zRQR^`vLOx5ly5&DV$bsE`+Gy8Po#Y600>IqEyM^CQxfo*hT!T1Z;k1Czf0)f0x$4%
z^xe~c!LWZWfw$iv%>%x5UP7lYK0{*K=b|24*>lC~>uCx9I7`p)wWAV9t&HnNFdEU>
zZgF*t=vBC)Q`qXWOesimH?R8c at wSC0hZr$dO7O1aw;6%dvQhY_GfnV2%}WG&>YfsQ
zKdX_+fja|?9<^LyZiH#Ja;G}dU9!IVMaDb^iNnjC{PsBTxL at Ktt*4kK*6i{ydKK#P
zz1MrP70#KmrLx4lpXHq}`-Qq~PLkB~u>ts2i}(3%&cn860e5=Q%n`lI!_I{Iev568
zEFjBNsC=%4-S#JqkWSMfU6dEdf&RR~^y(LZn}ZaMxtOm0 at nd@6QF%LgxOlirf_Xd4
z;VB9DqMvxLmvTMXP`&~2!w>tT@(I0nQx|ZX?Q>DaQ)VKUpwwWkK#A77MS!6MUu4<O
zk~FfUI-P8&UQ70N`J4>9jXy~ApYnVfc>&kHAaA)Nw$tM=Vhvpd-Z`TfLEAnDOT_jf
zrw%ft&1*gEhVV_ at eziXcJ<!OQ;i+gaWq7HqQEyz?5LHL=hj2pLC4?*q+(C`i2T86p
zU7h{1iWdp=LG_6$Ond2Txf07z)0SgTgqDP?HaEW+=o*7oQsfe9q|+U-r~U}vAI0&B
zeT=P;L;-M_IyR(k+eaE9Z?vDGT_9zTgF1l2rxlF=FBJN at M{gG%F2))>4Ajxm<Ef7W
z->SBJcnff^)0Cs9KURK-${^2||5%3Aw~t{K#FPa;q6i|wuK_S!@9AW`878z@&GBkk
zkzE?)X9`O+1#E*AW;#)=&v<~p0sNl8?)pzuo-M)O%)rxs5>UV$Z&9&9{5}QGmVap-
z81Kqt1mJ!2x at 3_n1Uxd-5VQ|z0D?Yh(AX`2lg1GSb(EEX+3Xk1vIf&~T!WDs&NhT^
zJF9Vv9??9N7`%%j4KmkYRTd#F1?-esMdBm;trYEzPXFt9cova)w2+k3qVC1;RygE_
zl!u4v;Q8`UeR#zC4q7++ei?jA21qY|1F5vg%uxg3$YFtloE&)>+#(1sY+vkrDXGVN
zkQn%*RO2lTE!jcB)i$2rjI$;||H9Qks~kB0VZ>0|Hy`)-E~$FJ082>;%h>UfC?zB+
zx<%^u|A>#(+;)W<F53az{QeU2MAmKLH^K;Mw*P>m)UT=9M7{=`dntiYc1FU!P(d)&
zNP3yih`>C~;H`bt50Q0OAO<8Jj;1Rdgs$>F(gn1qeG$$&q?jfA#DAS1eh7c0`wZ57
zWqzm at q91{>CnV(G;Z*}^>V3oby-C#^c at 1#70cg}+fIT)LbsoM^E&Iy)4ELeBMj+LW
ze(er`7K_T^1K*CY`~7yRLp&S(Ih3&sskJn9c;d+kfOQw)*C2I4I$8e&V48fYVw$lT
zpw6Zz)jZPxE^j?qqPExq=_g`45Ko1d_A&KwwcQ2S?(dI6yKlogi=f>srvLsyiBq!G
zwk%Zh{}9kZo78a}o;KP#Rj&E|b}SWF!6as2E@~A at 1<Hhz=ER&GC{ok>u_1RfPcqe-
zcT>P^7u(R{38bE`%1`ouIWdlnZ<XlkSTTZYeEN7ij#ogIg4+fEKKQG1nW43z@*y|$
zgTOPY#BBoC1d`$>?`tXJTZNV}qwa`$`tke!QT6?omMsJ<YHeltT`&@PFcQy*3mYtS
z at IV^Ez+ppoe#sn&&4rP+n&AmOHjDb*;)hq^fRtasSQU at X?85K};2@(@c(Ui1$74CR
zLn7!mo2kBiE<k}1VEhO*Bzo<;ol%*8h<KG#>U!G0!8||VY6%db9(YaY*{_#g1v!5P
zcn>G~>8Y<u4jpF13)oL7WCJ5J{X}MFGZhR#_x;fJPt<YCg^~Re&r>!4SdyB6Qz;Kv
z$U!Q&+L_6uhMGbbKh4B(zPKCez0LbhXo-idf1+mx!WFHx&EYrG8P41%d*1Nip3lgV
zs65ImZM9qYhk;v3R;fG8gn%9~6r;s at f4C_skJcA<2`YwsI=GsM<df=hvhzgJmDPac
ze~f*%I!m0R-|D2ls9r%Hh8fG!41{K79DLJwEc?P6WAkm~R`|Mg3Ao*<-VQz@;EYp>
zP9`PbZA4K+HBq^Gcl=A7N6Ms=2AoIm{;C at HSYoays$S&CFVq^Y#W4U1h~@rL;$W7j
zFnV$pPsjoI#-fBwF_CrcWu~h6?!^1V!2LBqa#mu5p7xX+dYMg(&@NI2u$v9AjDI at n
z-v{oCV=zsEcGU&}PvybnAFU0%Q&zO_n=#l3+7F#{TYkJIExbRrCLOvJaM%QYK8zl6
zc)8#vxeD3Ip|=7PM|f(rO(mNNLn_gRx}4 at s3mEMdQd5@Hy~W1qH$#&$1KJTjTnu=e
z(8{qDZunvY!pMb at 0FUl>6wmhs_v1gpbXy{9w;18NYZEIoi%%7=r?v9cT>Q<@KA^M!
z1#5fA)qEm-w}+8xVg6d)bf3OzjVSdt6(^3a5%rJ*n=r>;Ie-r@&%&IVhMXHxoE}!m
zhxQfxOa65~&JWxYaBiRR&^u$ClHCz&I2StVVUSnqVbR7u at WyFxx=*C?<-`!O;%ega
z-dK~Acbum at P_%NueSg4}jzdpS>b8<*Lav77^fH8GT<66VD4=`=Dz{7=z3OVzEL at FB
zuMFN4Mh;<qcmZ(mv+Tv`%YrMz3xUIICicr*Ca$Jl<}#ylcp-5TdsU5`dbylCgEt}E
zU3^nLOG6wWY0hTVn*{!CRVdy2qqQYVV07gQq@!mNYhlrHDi77UZRg!ce}Z-&1Dt?v
zbe;W at qQ$UK4~)`q|9gYUSFg3FnJ>d;kqVnnxXFnht;VNK99xY?S)qh~9^ol*gUruV
z2^KA~-XCFL4DW;5?!grQ-?TFAmaAzc&l3~$*Mu(|RC}R5d|Sj#%mj7NwBaZ5mL0tH
zXNcd)syyfQ5q2kV;T43*cal`v#|+Lc$$y^h(mCg_+b(cbjLh>4dEq<8bH<*Lf7JXC
zHT2DJZU%h5k?03G`@#H9Pso`u(2O^+I5(fKL^y<0c%NMbYBYcMy9+>Xs0N_qd62Q+
zl~bZ5F$ZWZjKYb~!o)1VGdQK$Raq*Z3!KcKII0Qm5AF}}rKYM$Fspd*8^E6hT(}lb
z%%Z(Vi5r_+WxtFDB>5fsc3tUD-<bn+MrXIMo?v<DWADs`|2!vGx2-hgosZ%FCt3m6
z+EgJJZdxTg-BPyjWs6<RC<^8EkkPOW;RUo}G<;Sl?`^kzBYEphV#~<Rhmh;{W;rdi
z(o^mvWJ at B)lU10y(I3i7+%qCgqhk0C2jTt;;RxI3<p6n1AF6lOlKHOGk4zGuu>5cs
ztv=k`IIfZ~53>SM&+r1*@|V!B(c+mz&NBP9^r0QUd)qdhWjqC{zn0xih^v{o3$TBx
zt68;0xT1$hz2T+q=^{1h-Ae(Io{;eLesL&7djq=5^{rQ`ki+wB5i+RBw*Yv*WZ!l0
zO!fV){T;L=1ej4*Vd39%<|c^>dsbrxctOiT;2OX+3R5ZC97+NgEe at r&|6a1UzwPa6
ze+%AB5IPIoWN>GIo6<iGd@~2wKruq<<lO+Nk}_2yBl&8(k|mxNsqGr at Jsh-^8D7rr
zLMb<FZYHd6KD5i^dl*`p+^>=H+qVrStEK#=tjPAavH7Ip_#)gbl?Xq_{Q#X##o$yZ
zBQSby)~hj4W6&;NYCQ8);htgTf>R=v9R{ioS=?eEX{={nHsKkqPz~ffasV~t=8{ab
zhH_pyR~IZl$DZd$CUj(n>pLc=*AbI%iZhQChN2x)?5VxvNS4H;v&4LioRyHrThdG3
zYGhitBWV)pFn5f at u#WN0bOJQw9Pj(Qj~lSRMQEGNxpgy{OYi6iz%%jz&#$02{J}`q
z+nwYsTd{dFKZoAXxTf{fj#IYct at -Ebo?FMyrHeY=2iZJA+>{Y0<$RxY{E^hrRZ{Jd
z58z!R)$Uo<*FKPXfo(YBIp}F4D`-vQ8u7ap(@Qstx3}=G-mF9#8Gtjfl_+ntr9D;X
z5gUlarawcNqkldkIG-VUI)M8(^5jsLV5TIr*V#fvBG59y9QXUI at I3Ba0?&5=rXfZA
zJ>ODz{=vrzeEfv4C4SNgGHqCPc{HC>V`vWi;k(;5dHj{}*mG#zM3UW>dir+9+lSp1
zZY}Ucf~p&~TIBbtJ9D(xL4G}1UdD2CbqygU@=YNTs8pt(6R8*2b#hIOz!SevL-a&C
zAhXhoz|GAL at a7siThV;PON<%bK?b*lhvjJr7jQ=In2*(s`t+P3d>4G#?X4?CFF#2U
z#_(#H;g$Jzfw^718%M>g3QEHOtzU|RoVkq_jp}M0G)uG)R}T|kWv(T&8mz<&U*sQ{
zarO7?dtJ_9GvIp!n(3byzKgfeNiGYk<pnwgPq0ZWw0V{ygq}ogahHYRK^E3Qjk5w+
z-z;_C`OoSaC6RIg-(G`S;1sy%_KAtJuehUR7g!0~K4$#~zk-#5c_5|E2HLQj%rtK%
zGl6RHeS^y4239Ip*QDp;n)F#W?ukN6YtJ%rAwQ0ofGb-W0QQdlN!Ccn6U<a{SPj83
z$&@GX8j=KUH3D=`#5Tj1OoldV%=M5?4|V9E)|t at ysbr?A-TMK)OBRvjbA1*(eTMtm
zO?Yd>OsQAQkbtJ*UaN!r_J3xl$G4u!;SWMvy=;cd%Z&rxd;-Ky59RZl$?VY7*tn)M
ztD6ZUZrrC;Owt+mQg^PR2iFQNPw{=aq`_U}&^;)ltNY5cp;hVF3ONPk7pXS1d32=f
z%ZgrErH*tVe~uImm at pN5l^%2L$2<BMg>C31x03c69gTmg9bz!WDYGJgbl=`ULVaJ7
zfr}z%ff09*miojTP%f0Nekb at 52XrThx|met=aGUi#XWAB2TpmSlI~9A9ZBQ`PNR+%
zNx%Vy>1Y{4YRd`3C!|AaQF|%g=b<wsRvIl)%0+Ea_}*Dfx#6{v=&UDuyEdr1Skon@
ztI`qoo$Jy|(;TF-Rn|d1%V=Lu#y&!8%c^ZCi!=zl(j=)@g^Q%bUIj=gg#0<6RY&ps
z$XC#cL4F-6aBX08rOUVfzRVc^rJ at 1f+u+;wN%E^QEs!*!d(b)(N=Uv9l8(YSM7^g3
zIW@{injv at S9-vM&XBpf}^Q}tQdscTbEK+ajBT&-)@fvV{FIh^byc0wlo5Aw3hvLrA
z=T458q-wOcNhXFqm+ZlET$@j<m3Lb4yp|*W>x&@g%BzT8z`MRxy$%8OI*?~;Vn7Dh
zMwolmScO+-*0)0pbx0a at -5u9q{+c-H8&^~}7W`Y3`nf7WT!{Ov0Obp!*3fC%hx<5<
z*|LtWp}J3bJ6Y4NObgu#X+H7i5yJd~v{4;!aT5U}Xi at h4!wM>^{=2C${AAZ+HlI%1
zHKTRjo+tn7anJF__r-OE`tFlazny6&-MXkhxPLYqr)bR at Z!nN7;T>`Tp1Pzb(e7*b
zZIMt4wV6a=Uvg`e-%O`NxG|jC>31$euB-7WJWmDbfUjT)_4UbOZRw<hMmyToR?jKz
zkLHJsWm!jRsXu&!lQ31Gw`o6~YQyuAzMc;1JJ#V2KSdX#byk5NJtwx6<{WW4;%BBs
z+sY<x67dW$xcP~*!2S6H1|J8tie<)4g(ZZ?^TFESet0W^=ZsCFk1I*zN%%3yQ#h8#
z#|<PyTxma#aRa)mV=*`2yIKk8UYToCshBGzx3(PDmgGr9%+s4<6B=_}nf%4kz32%r
zk2uU7e$4l7aH(@DDQy$+Mnjk2ELt6*%LjBW!IJM1#Jp2RCC4RnPH_oeWxFydKf)@R
zB!eu2QBIN#FgtQiX?=VvzY+#i(ZRbBu>oQMnd|sdl#Y;&bd*wQFV^a|0K6 at 8uA`+e
z?n&Xh{CeQHbKckZOlU_zG2nfbr_>wXl<RQKDunl_X3(5ddLOp0(J92YhSw at ayn}Q=
zLv(b4Wa+ciOrVT^vTuIBeh_i|IKW!XmvMYEh6M9`^VM+>C;^JfUFkctqYIF{qGK-7
zjzr&tHbOrawpBXUky7jxALq(!)08kQq!t+hqth|>$~WQH;CB&2>lB%X at 13jUhpcGx
zTjqUp`^OJXhOZc>_OI!by3!n9tYo+{^;*@xMM;K{N%;MWZp4t_xL)ZB+CoQdLT}P3
z9<3R-FNn(2TUxqr1z at i^?kdXCJfoE|eQkr<KD(G#Itg_g@%*zZGxdVHt16d0zwsNX
zcklIL{=V8)B3V#JHuyZqOv8=u;VBT|9Imgzx0)clN%fgW81Q>kfA$Cq{<;M9roEv-
zl-GP#q`clGr}#tVz8gN8fcU|+fj<wm?c7vY_VUJWd~ebsajIS{;q^qEmRXA at G=g_S
znhR06v})gq7WTMavVs(yNA3hEp-j<U_RkhsQtPvJtnyWK-08D*+~F(laJ8{VCI<Jn
z*<6`-rM6jJ6L}N1fip<UI?6j}*eK-#y}vWK-zTmTDBB^<PS3ro!wTUu6X8)YVJRSJ
zhnc=*p9nOumSng$b!-gv1kz at +Ir}^2l`^TPJLZ&{p6KtG3;qv|%!T|jFh6{~?W}v`
zcKW4oEk%t`1D-R(zJ=Lr-b+MIsx8TQg81qnJjrME at dDbm&Y`Bzx3nO_bk at Pwe;MG>
zN)taAJs!0jsAoamah at ag(5D`4U+Mr__VGG516-8?HzdlJf~$Rxf at DA6SJuxDupJq`
zbl+pXJ<fRq=v4d-RsOcp<Fwap&EyE*VEJ<TKo;&UbQDXLRzmNF8Yc#l0k;91!jn<0
zrLafPP6~TuUSr^?T;=PQ8yfkjpIS<1?OQ<@<^eg=pYHwd57K>=VjAxSZ1_eXr8L`f
zogZMIOM(>lqjnBu5*j*`Q!$A at XonVkAt(8YrD<rt#ZJfu>^rsRXg?2p>)QT&c-|e&
zlPakncj!A=kUXJQ)Sx4|?8eUHj(F at s*hmC+<EiVgPUMq7R at 5lhx&*C;2+aL{oofTD
z?F4v?{h;K}PXD6WZ<0_S;7&Yw7ixlW(MzcLn{-+OeQtwR{RT$1Mb at 3xVm&wtu^(o$
zx&I++PV;IxA;@V6=<wE<0N%c>l~W at Oa-*oJ{KHMY?U?6pT=d1n8P({EQS1LXa(=)P
zczZ};(0&Mb-2SfyE&@l8L5gq$A$$gmAtwONX<5`DM%)dls43l at bK@WPt)Mdy_xxZU
zVmvd%DSWL!+#3bz-qhA9kw)t->v6u3X=Risgg?|aXSqxm>uKJAIvb7F)@PIv!Q$TB
zHa8u{s%;*m`T0{;JiQCwzNGPeS3CdTG#l^M!TTk>hF~S~!)X6evIHxsH4JU_F1qsW
z7QHu&y>;hMtG6^b^=qEu2~??O35oYh;M*SFwmL%Y2j4HL{(ODSOC%n&<5<?T&^VoO
zwhs67qesNs^2M{P_>8$$;N6j~oIS@{MVD}|cvpnpH;{au^8 at y~=MKWVhs1eiL;8F=
z63$YpUBZ0}T$vkg*#okuM3hqCpVFNyEdz{OD^;R(Vmbp#e-z6M8--eSBhZKqoQ~>g
zK8)uF04*EX*+Lq-k@{%?p2v*&_iftafq6Hg<YH~Y7Wc(alaiIFVb__HWBtp!&tZJ{
zppx{X(6bmCLf=sIc=&DT<NJgA19-!WV7%#Hsf_U^w3LlE+(hafvD*u&C7_3%6eAp6
zL*4X%VmQPeDwixiU3ZRT#n9pGXdR at k8^ZJgl_LO`@xIfB?k~{FIjxY^;A*5|@Lexi
z56wNad5DAZ)?zBpBX~>3;`cYfsM;;;mL3u;?*Yk25Ev2uHuziZ!mPJphAfvX at LZ9&
z1NInk5uTG+_>yv%FU0)-uG_lrcf`MMg1-G4?LD at MKn0B=fUI4d_4Z+-T_obG21%6G
zI0?)$+7akD^{TO>spILRe8(T?;;>Fw3~bi5AaP$yS@?5!{ty1ZVLksP$SUrAJHooM
zyf~iW--#Au+DPex`&Nh?p&cU0p+d*fAx($-i2qggXhpj%O4XjW2KTG3ZPYCX*9c68
z>Vnv{Jh&er&zwe<n;EiVG!}BTjdFfIf;oxBEgqjj1h>^cN!3Y+tvivhYD2ZdWwN2I
zcr>*rk?;p<XkOqV$X>B^zQ9 at K8^m^(O9U=UU8 at oS{-B4|TSqwH{>AXy{S2_nHg!Ea
zQOmF76p&2Jt*N*&3X+u>$3q!s7jmvw($(_sl1+e53Q$g$b#`G&T+!Nv)aw<_E~Lbf
z(zg|h45i*Wo}tV8L_GJ<XF)2D at +^+M8z@^FIYzK;hfZ|geUc*^iD at J|WN{Pu`UBiZ
zsgos{>FE$w)?t?{&b1`JV~I3%#3`hcsYv_JyMyKD8IW25`I7t^o|f)nJLUj3BuD1<
zklh8sZo(cthrQl$ow_@<yB)%z_gA#f1H3y2{>2jBUo3`d0N3R8gX}UO;F at q~8%W$J
z6J2s`HIGDJ3`P7Smu``Vl_Z$QeHbfW3t`us<SyCd8SG|abmq`xstZ3F<{k0F?*t~n
zcv_fpzL+d;vbHw&R}Q4Vo7T8y*M at hs`?Fe!YMU8t$|S$bHLYp=6#1va{{=Wsi&B4l
z6X0vrwxQdm)|C!*33%rTK=#ILDp`cx)HIqFX#6D-IG at lCzno(_<d_CIjF5w5Q=yq?
zL#O3zg&z(DzKi;?#o;fYy{Tx&1M0pvV89(6axK-8L`co$*35vuv4(DUGgJ;%dJR9u
z#2~K>T*1U{5pXYH;{HGEk)_(ftVAe}JRsz0^}A{{!Z|mF@>cgX)Cw`0V7?@ZxkP&o
z at 7(~-hfXznVOBJg6~acQTwODtpJ>4k#s5kPL@&vJ8lnDH(*It>JvcrQ?!5uiG!U_c
zXkE2 at YUp;X&s$0hX=N~9Tu-!$rXiP}f*SqQ2=XCFvhhl^HmCYlLw)vs)?My=hUy2B
z#~?!HLhXUPQK%SJl0&y&X-_M2IYnCdaCj9pgzhUVs+7tW9&rZqTbXnXVI at w`5H9+j
zdU8+ayp~RZ-p_Hw+Yf~&@zlL2u#7CDQ^<CjgZh_^?vuQ@*{g2?Y3_Xexw_%x?wrtl
z^iWyRD<9zvc+?OqjMVM%tNV}N46(AYtr&3%P#l=+Qf*(Y!n%7&IVo&)gdW|IE5zw!
zo-&J82yXE`t=*}m@%2py6qdF@`3*zTg?e)wcdBEgJ7);win5|3Ca6bqfeRLTbjk}?
zeNkx;@1og*wrWFL0V2xFvL4zPoSLw=3-Ufl*E at a%xYEA(RPn~MZYoPv^bFd!Lfuq6
z%Pv)QYJ%mRwoXYRoqxbHY$tywS&!juBI89S(<EAWzW>A<6gjYph~bu1-#z(N$$fiA
z&%(^EtXaFui`Gp=izmJRMCt6R?15Vn=^9N}(rGQTZn}S~Dj~fd(S({J4HbmML-Qh!
z+W`$K3nT{jFn1J$I+bfBR`px#1mvVbi4nbprrAvK7V#y*EBdS6y at lyz2a31QB3#|r
zp|=x;C<3l^!y97<?4lSX4Ze9s&`vh4>YQa`<*u!au_kwWJhpPEZitViMkGZan-Hms
z at MzsCRxu>?5Lp}1gbzj<Bqsbm_6_z7_T{N4P)AGX87T8R)I!BOP8{*yra5BAWGT1w
zr&ZZNZF%Wu)EzzmZ&P3#@@a4P-PA8tB{<ej4fc7k+_h2QU0d}FTQ}nQI!FBV>m_Cg
zdjIu#C&r`I$>DLA&+ at fNtTdIb?Ro*mW^TYD<yKfM<w9CgW3)}R3LF1TW8fP*vDhP$
zo!tFqq^{E@;a=3enB&yJz~>bLq_2Gv(gUB_26RRATDypM7jm~zIy<d+3n?a>M4=H^
zH&S?kO!6m138^KEP8%8*Ibw~+fW~Tprm0*zQVr)uQs@?a3y0kODFcR)@d;V;2=zS@
zv<*)O*?bz_3B}d}H$3}mEuL?{^CCxjrHat}YL5K!YdwVhV)=W3*Rmn}8_5=$9}vDy
zcABZ_N_pEis&}ZZbMo8ID>{hNyQuygybT{IbLT4BuerhS^7rB~TEuIJL0;~aYH~Bl
zuA7g~cUf4I%fd~Yz1HGBF&nW7eCtz6fm+)@Xuc!|OloNCm05r*w56u1DUD2NO4SrK
zMO1B1I-dPF@~x8OUD)<Ezkp1lJ1b)B=2hQ4J}Y=Fm0`XD2TisH45tk$=2}gE;)u_k
zfp7-6aGIY>$M4tRiXXrVTF3Ou_A&0?rLVF%Ib!E`6G1L at HM4@NS(DTtR_`XLr)5_)
z;;&H<=N2iPBX)S5TZHhLASGB}lnQ*m8_}P2hb**L&f_WJMhXGH7 at a)HJj>8E;TI$s
z{Q2e<VgMY at P@Q=_Ndh{n3l(EK64u%hmKZ7gL%Wdb0&eJ~{!X-VUk=#7+F4I)4=o;^
z959{c?LuKLauj+d!o^Zl`}HqMEKo-qo~EaLDkfpB<Rf;ZU4M86dN*+vJ|AeH#_m*0
zaq1b2KgYx#IBBe5;_-7_tRnW$A@{j at -~tR#!#@*q at tk|8p6U`MI^uyF1OKbq7{$Bp
z{r^gVREjtE@*Bi>=Ut|bz3?_4XoD=8X@;mF8Ld6Te+5c?7hpsS-h4}Qg5?K(8+wWy
zB-4TKu~f697bUWn&cc^zB2Bmg-kAz1yWksjAF@;jQX(UzqEA{3epc8H+-eR*9j}e5
z3|ZE;pfyEKk+flr#KU{(2m|p}@Gb9LMstRDLOd^LOOSso1;(Qu6Zr8|sSW<+ at OMJ^
za&T9`|5i2cgKZ0>!qzGBB#0sKFO?Qc=-NhdNAp at Q=Y{$p=1SgbsCT@)LNY+DxDrt+
z<w$tq7qAAT6V*26K;E3I>dm3I(wxp^!^O&V>Q^P<SE;2<4^@QI!rRbxr}{lfl5R9+
zVj>2ulS9lDh|!P6B>yO8ylld at V2mUF+FMuRaAn&Oe|%EgX5V?=>uvJ^)4mwqXTLW7
z8>c`r1;9Zaje?hIaE&`%ASR%TbKpP9Ndjzt9(4j7oN?P|jylRTSk41IrC-SRSHDPp
zLd^6QCr=B#e*ffst0 at z9F1prZ@l}O)_?Yl<CqsqM0VhcGp&MWZnV}zy;Eu!9fzazA
zf9M~fpprxnF3M}>X^y&zyP-q${iMSR`1$5lxhZ=`EWR|k_)tdw(*rzO&rq_QbGM(B
z$a5P at 4pP#{^l`$AG-dFTa`w4f$%|B9!kK_0rXGM#_EU4?8j0y!KX}fiXHqMOrJRtY
zXIigQWsZ-4<^dNyb7AzOrd($(qd)aW1y8trRGm(wsFipr|Fsh+wi{@o-u5iXub|K(
zDP^z7=i}`xw{%#2TRKF^(qZ%c+_{B%I?Ao at dWm#x#}e$Ng#9w;8GWMHJbHM`Ael7V
z*Bx|@yk@)2oDXR{4e`DIEzUL70 at qj%ygX0zR=)?N2z?5`0WZXeUg3lkqFPeZpT(79
zVQ}wskX*a_ at _^?q-cEhAF*mk9(?S^KBKDAE6@`4_$tMDB^=rg5Vv2p(`YBrb;xE`O
z at GVR9n|%v>TVQ4u_+FH}ho+$w(W9@($(LzRSJ0;LSK~L7rN%6Sq0AlbqqV{6 at O5?}
z$yipjW_99((=eMj`&%Cm?gz0pM-*heUyHkdp$DO7RoaJp6wcL&y^7mzPq at x!6DP1>
zH2z1P0g~Dzd8)VExtSDt7y768j`gn^FpS+d_^Jizqmt1^Y6ywCh?jTiWgT*j*H#CT
z6y4Z2yjqKQ$BowPttlp at yVkl&nDI3hM&4D?;i<7~B)h6QcGOt3WS663r_C}espCnT
z#h%pBh%0LN#VQrgf_YNtAD?HT8P)kD15cOX`9O+mJAaXJ_iYkLJ}k%@@Fn*hRMc}c
z5?W(r_s~u^-n;9FzeFo$5z=U_VniNq<?du0vC5Ny3ABI(83pOoOJ~EMm1P~(!w7vF
zTn6&mKf<3$Gs=n}q?m~WR|3wii!LqAexQ43M_E?K-$Ls;Zwk#W6+YRBw$LEtD+sAl
zL$*N3L?<PMWDA*4y_vj6%w&Au8QjOjFFK_iV*I>x2DpN^h?i^vsfCHu1Dz&%ZA6N2
zFIBi!>91jVqU|>Whj9qvS@^<yJjwT(A-2*b^rHUHf5Cg2Z%u4vbq0CX=_GhEYleO<
zWlHjR(wHmedeVJz>;;5NS0;a<As6!0*-7y6Pp4qnATt&YW~pTZ9&%;I&7lZj$hq(~
z4cvL)7U1o{;8(4?HCQCS!ZldvsR-Yi6KQ}M%}1EPuc4Q6MWNlaTqdpt(MiZ>Lr+8=
zcN at bJN!cEgbKn^t!kc9$Mi^O7vxhk3p8x|ekvibdbu_#4CJd1cCk)`PQe*iBtHL%g
z5$*ERM1PCC{cpfga3}I38ke5cMA&LJzV;%&>%D~arr|W#23E6j3(UU^Tq#}oF!)kj
z8~EhvdXfYb8*Q53B=sshe1ohUP;I7&&RSAPdwp~IQwAq{=eVtEuP3!#*KZz}d>Pia
zDamS&ncJ?z{sL)!ET*&V=Zfy~+kkHq%!zB%QxpGmtEX(bDk<vz$6jy7-BxHnf0~u2
z at En~aXL&iF+`oQsRG%JaF<)F()RB$)O_;*V$-2;9fbt$yYq}?4xd&}s*9df*E3+~w
zv98kdhN`dp(=ofm3H`Oi>XwVJ<Hvkl8gkFbaaR;u$|Zopx-a-#wvV4vcg7KSe-AvI
z(-Cw19A~^4=TipF at aN0PkpK3eh0h?9pcNBvrm1H+?!*<Fo^8M(F9Kfw2RW66^n at du
zY6LIwYl3!1?Bmw}f1%qH^`aE#h%Npm0KKvJTbalEZ-u|0R&m?o2TraY(lY}k0Lv-B
z>+*Ofs6Xbmc#{CbV;^1C)WlxWPA)6DqZBnYz4Lq|p at YykMegUvk)%^v)I)Fz?xz&3
zE0Ya|jyeT;!T%}RYdz5wno+Zvnp_+8e1N at d1qtuz=#?r_qH(SR3VH)-?bCuwAG$5F
zreYr<Pvs69pv_MMAGHnoq|ha(ns+}B{}JSR!oTAt at YSUO9{8;r6-{+r{0H!rL0GCI
z_V@?gIn{N9cX^nU(U8|7ZhAl3$f1=E(mmo9g at a@<dyr(*fE*tPc(2EMN^1mi at i<6v
z42dm0^|q6vFfw->HY42R09;J=Rrn`$*7<bdCqqX?!K)W7Uc(S860d%jzE9j$GN`Xe
zjR5`95mC_d3MZ!Ncyk8PLmeiWcM*M(GERlUbbvx4aCDQBjPH26xwqU`DP+)1z at smQ
zaduGy?$IFr_3i+AGX2m;xC2P#U0=Bbk$1#?_scTlre-`5h$sAAgvktj3BCSi6_E{l
zK5=c;X%iG6>V+QIiaHXg$H85vK9}MdTqt!S%3=N245Z`TFOnALQ^$s}`)kA1ZI3u&
z&z}n3+-M%vwzOV34~;Nk*sapPQC(GpRp1})!#hw9`1xka0hDI3Q^`aZapKs)WS|pW
z`k$=?cals0{0eZhU3x<`@Ki>?X*a?9<ff(044TvW474~4`;5CG>L1Q<#5z|77P8AI
zGn_e?<O{e;OxkdXBX)dk)bFvLbt at O5c+>4$>W(^FABXg1fm}?#ue{Gam_5Y!-uLYg
zbCdbTau3 at _>*IsTYAMhwWGbEFh`lp^w4?!)v{15p=dY+`061250)G!!zRFoloOY4i
z3jCt&m1i<-l<9b&<7fZ-eS*sY{JSbxKB|%M_wZ*Gf??Sz!97<J%N8Cbb}{MoP~Plx
z%ReLzU|AzEBH>Md8)lTI>{}->W$Y#jBkFX-o7jZ=&KnN03ReIKQm*g<z%~U}ESmr8
zdX0QT)Rw at jw7|;^&s6WyIL_7+#`yx}f8ZVQM?2kO;3A&zSfYn<)Zl8$V^(Fd_gA#i
z%LScuI()@8fF|efD$EBVA3*M+{ARMq(roe0gSSFQ{ArL!6L6(`oVcA9c%l^ChY(&2
zUzga0K*$hYOxXIrD*lrn#eZ at o{_0cq7-w`|4ONI2eUG%2d6=&z4vgNA?mO1 at 7(lAW
zlLweT$GZ@<zg@&Iq2D-Qa1lP$rPtwEQ?m2-QLl at PGrP$4 at h*Mx1jUfh+l_iv_jPo~
zxFk%!<K;w5?5V_Ueo-r1OQw@%vao{arvit%w`LuQ1_5)?qVS!L_}g=34x~1nt9EPg
z>T~3g0kf;NWG46)4(MIAnFX%e!hF{TeZFFG)vn5M)oz&V+E6)J$#T`UXF{sOn97sk
zs@)4zR7z8lU9|xdgr6GVT^o7~ipEuozG0p~9Y8q~Ry?liDQ)w=_LTS12d2b1Ry7{x
zXUAJAe_G^S_>v5GIO^Kkra>C=x@$I at TPBZpZOtEdI>|2RxU0uU$KlQOm)Zo5Y{Z^n
zX5$%L6`#n+1r7mKd41s!qn^~5NG&jX)zgaKb|kFv0~Xur5}5I7$=iNZ@;0^PUtBJk
zL5t{Az1afkYH2g at 8Qid0JuCbzMVoaS$Zk^TtS5!8z3g&Gv6J at 7>RAobUcf4Mj8e*j
zWD?r~^-93^y+}+oX4E1P^)7*G%^EU6co=CXuH!@}%Vp{)-$r`_3u}0wO at z+|>?{Q4
z*0eybX3D$vI<c3CZl<~>d!sT_%<!sp#_Q0gCScjA%A|^IL}>huYN0+e#LQJPsn)fZ
z!*fI5Q>|if?Pc^(-(sv6W{g3~Rer!;#C)L#A*T*|(_TyFM%+#Q(^+`d5-l6!h&tj2
zKbFTMU)=GH-IDrRa9JP~`8^oXZ|udXzYVTbbV$uds$_0>mU3qJ8r;#smCX33h##;o
z%gq7&iuktbDD{^6$9p&V&EAJtf$CRB9v26B$y$~dmuABs&(vZV$eEV1^thysG{w9A
z0vur3&rwD>@Gh0d=0VVc;|IKl$xcd0s3M)C$&Dp^F882!UaKRRm#|QACAD`mrf)Oc
zOUU*k2JhxJ!zxn395JY}Pj4U at ZAO$Cj#>b-zO2G@;+zsl508E(r;hP at N9_>*TaayZ
z*go}6*qQ%-Ij%=->gw7?b}H`7zEGdA(FY^L0nZ5BW9UJ^YYDz7{^&kAbwqQeZsygX
zEy9e|ji<DrhYn!BQ(4XeKB~}F$Yvn5Mjaa$@BqO5tMlTAzv1^Q{3#rtEh-!}sAp!T
zQvYDm<?pMZ1*)dGIV#gH-Fcx8X at y$^4rv~}ks4{aM4!L4wX&~Zz^G3Hf-it{A;gCp
z-Fqy`dBLt)qLpW-N1U!qW<uir3^IL8OC0=ov#Ok+@<*w91E>vgFw&&id6vk2LuiJ}
z!le35l0|ZhdAzB$sWtGv4&`pmNJ8gA)wi%pq(9%C8$Lg1yxj73TBMfdr+uA_lo!6A
z-Ur|KjCwQWXqp$c(gNjMpz);vJ)ZS+#N6Mh*x2uCX7#RSF4f7$<DnTq$usDU at MWox
zs?4R2>y$r(??wnM>rGg2P}f7zUPJ2y5l?@8W)r2P8ZTvRwVtG!aU?EI6?nlyvVoJD
zOs&9K-V5}!P)?=3E0D%HRlVV#(4D~ooQbM_aIPc+oa2nG=>Fm&z`%|+IT`WmRr!98
z`MS0T3vi|L5|NV=vczcY at lo3WAWr}XDf;Yy2PgY^p!v&`)qDmOx^ikPlt0eHT(Brw
z at U!oKzY6 at _Ijwhf<@hmNR4T%Y6}#8gwY?(shtp2NrHHwdtszvDwGdL>m=c?!Xe$VE
z9Z4iMp<6ApD at QGrRoGBe4Y71>k1)p#6*;k?(2KFVx)<LI;;y2vurMiNnuqURyb9hU
zZbd+S$=1f>8ZXziIF_pDTC4q9^oxY1cjt61mPFLL9Ad!LhP~<y-+24wwtcs{8RtRj
zl4PO*i8Gt(=?qnhOcU4btp#j+he+CzTlv6D;CGtyO=5E!FYG3FC{r8#PgS}$2>l4N
z&Z#6x-0Z2P8y4ky_<f5)HxQoi9c8|(j>X~6#M;bSDHpidJ0Q17Y at uoiLIzodBUYNd
z?^fW?QbdbKlxo{Q-s`a!lUs#3qzYUcxK8-j;N4in6nod{q^nv#1wQ#xU;A-`@33ek
z?0cHn{*J@%vmNb??SH)x+&?>Sz=@@LnB#!Fh%>k!o>d9B2gne+a}YOp_EJlrv=cCZ
zrz21T^Xd$0rGfm3bGsL{NBi>!rnKhB+5Oxg^07(Egj1TXoK?7!q#riKmMSTyv|Twc
zUbH($F*M~y7%@XK)yGAFPakrR>a%@<J>RuB?4 at ErBWZ`2uy>RP^s9UCRinB<2Z;z$
zvWGlO_<^xIC3l0=DD<ZdaxjO6`@b5vfTyA4v!Oxg%L0(A>Qr67H9a7)WQ)MP3ub|&
zVjdTXYn|&zWdl)+l3Ow1NgYV3Z#*GidWz{Xen|$ulPFn0G-Mjl)-W`cj3c^$re+R}
zteQhPk!dyrIPf`Z7?KL%xg at eGm#`uuV0bPO0g^FXfb;?d2 at 2A);imU+CH7XBuh1q*
z_UMFSQU$Zv3A4Bcxz#tD-XOq-CY3NcBAdiqzP4pf4Iwef(rANu`~;+U0QK91Z*i|%
zP76KC*D{Es(Ml^#%ug+MWqu}fsjpZ at 8%=RtS<wwg#<(iLg)dMmp4fL5Q?W!$HuUH{
zOk*yz>qS>)+6AB$xe+(?>y$$$ksid3VPCzuP?Ae$0c2io?Xz>Ry*2D;YwyFI(l^a&
zYyY9nCXxE_WPqN-R*dQMV0-kyi=D<8{@-HwU>=Nt$UjUt=d+|RFxxk$pC6nFVVh7N
z+}8!PD5GYG#C)&S2=Bz3?4D&JX*BFiMJs|km-UK+<2<r&LF?@RbL!q5Y7R)&;k)F~
zHOJ7Gh_ at SagErK@<crCq1NA5~z6)SXHo0x?TtX?2bxFA}j2WV{-BdGoalH4Q!9_Ls
zBnC1W^S-HxYh_xv-r9jV;{3*KzRAOrVol1-ukC}pnBHh?b%+PloMg{Wo_zpvrZ;gO
z<7f`ku655pzatOI(bVJ-ooLY~*T)rO%gw!O1`K5WXlSk{xwS=MCGiKKubw^sSL^)?
z_I=P-J~%gOIh3^TkMHsHUC(-jrSC!5j9=g3`}AF&{@rsBLcZ)<GMIZvbUEWZtx(3%
zC!Rml+T2$@FyWA+Z^?jJpGTNOw$CmqX}(i^+<-~X5T=TyNzadOC4Kzh#nClTke1bZ
zY{ljAAKE1v*?GSHd;{g(`OcrYSMBrnt{vnfnn1xNtM63f+ULr9mkeGyROxcwrh|HQ
zu2r|{m9(LHCH>G%E at w&V>hn~rKFj=<vxYJy83o3gT{N!nLk-Ycw+H&xGgbKnZMHBw
zeQe}Oa37Bt!wcFfcrRg_X0<vFSSj;VRTJYeMj9nDv?Ed%@kHDa$xR~skfD+3Wvb7T
zUx)q?dAyO0JTat;@E&H!(2Mq>b^%5quC3Q_!`Z9P(b)r&`UeI~{r%9I2V7e at T>smu
z!IN!km4&XY)3{*+q?$H3&v`EXiNy4!4$g+Sl at R71NQLJ+kZ&2dHw@;%v#k0YQ|a2c
z^j2jOyd56|nTWmzVP&qZ at r;O8c944r>s+ at zxTmu}Fkk=*Qk!W432b-uI%XDHJ#uOY
z8+oet6qH)&Om(kXC{JXU9Vdk(1rRnT=Yz{YZ%l>qbbz5)cxRRIu8l!#ab`pdapNM%
z&MAbI$}c>9z9}^Se9DE?0H)PIT1}O}XaEoYM)@!-xu|H0XovVl)?;ZkM5Ksrhgb>N
z6IVpZX^A*<+^b$2-)k5&J6YWK=}ZGE#;UtMmEevWV!`L|InaM9Yk0}(^F$m7mssl9
z<Ee+5Pb8P*<r$sx3FCXF#!chrm`0mtZR>Mq-Hl8ut0+UP at 234b`YU0a_BL2s>qHH3
zXXFL{o{@7&VupwHtckI)@$t{&CtFJ*F#66sny--w*LmyC)vamJT4vA39>7ZvcepJ$
zJLnAL$X+Ar{`k*2GeD|}QQXs>k>C$svjlAr8vpqmh<^y+2)H)7lp2H1h!O32g?fY>
z>e!j>F?K!^n&}jXaX1OEbPB{dz)c+u6+&petFk_h7BxrX#tms+Tj|^ByID-r at aY0c
zJ5xANu<$rQE>9jK4Bn~K*atEY)OVpF=%f@!^Mb~u*O(%l5ASW!gUfg1!ISHl3b3kc
zWg=4Opx8_V<ummZ{Ga5})h~%C6=xZ0Y^=idi`Hix at yFK&&PDXH?kr2SLwesX;LV=}
zS#6&ADAjk4FY)FX&oU7mj)X^SO~bK>xQFu)y71(2=SrWuguG~s;P|ku45mX}VvNVM
zCBj7L37SuhXH6HH&Oe2BbDmGWkRtz2WjxlqJYKg7wY!{NQpi3`wEh2p8P?>s at Brtm
zhA_ODa*coVFiqd|$$KshrX;W!I}KvyQ=kj4iL}5|4%o~u)@PGG{XoW*6!kmagcNJ?
zX(6V-(%#`by*vB&TxuXN0v@#6->VyN_~z`hiDf+L{c^C}7jcy=ojp4}cbb1eD<jYI
zJ=B!jUpR1W6VuA<JJ+4lAa*Ur^O?QOK)&y}ed!)!uVpaDml;Uf=c0ylzy<yA%sEEp
zp~sJ$V|-bSERLS|BFXU7Dqp%vG)b+F{(`~m*=+7Kw>H2jMq1&U1F5DEVwGuzM^;`x
zt{v9kC`A7h^;g#s9q{UfXrDZ~HL>#sy+uiBJw=V~AveDTV9KJ}7J4oevs=i9^n7Y^
z at -$Og)*(q^M+0z<sO6l`rjRMl^)$a at e%Yc;1Az6IlI8VmOZ{K9WyVbd9 at fVz8r&B&
zT$FSjbB<|I8hqM&WX#vyv0&79{K&jf-+zZ+2hK^q3gj-}KJ at _6CU8?u-U7ss1Nlzx
zT?o(Qwi{Y=z%_ao?V8j&0eneax?Pi7Q^99yD{axV&+nREK{81!CBS)0QQM<^L6^=(
z)+fol_qtG1`*q$$HnKJG7R9$}o at l(+g%7r0hv{n6m~a-p;cW-r>+n9(_UoKxDlVGZ
z0u(p&Hn=48#g%iNsIj4HMuLp!h?N{hxf{60KjSS2&dv0B)waPnn6WigwREO;PFKMd
z`%A~5OX-9r+zpw4D at QvEs<`-I53v{PpW|UZ1NU8Xct>|Z`)g(>qlc6gy|E2#IW%TB
z;t5DWnh{)y>j93~!V;8ufqy9V{gTQJxuRJz at fKp1SbDGYRQPk>4QvLPLLCm0avUx3
zN;U^cJ`@_3raMRxTFvD~Y<t`Z{gO^A&h%%K)cdrOM&E8jUD8YLgsrblN22x7nf*0G
z?(Vxm#?~dI(BGX$`}HI1VHUkIVv}Ua(#g{=g`d$>DASJjm9(5e7p=%ciL<0!4136p
zTA`>Ds-~DLfh0s0)6`H9;~{Md)b|`(OS@!C<k<9|oz>{pWg_fRk=8n5mwKVC_D+Wy
zK3O824v(dgef52pUWj((bXIrnkbdEayZfWBM60RHZY0L=pFoCk0oMG+J5Sw{8MQ at O
zX6PvdS#wHRQBRd5p{2jkT^S4BJlSbhHS?-FIrygf){@Q|lvo}r?5si#)%{_F>0Ao#
z-$GX4;ywb5ihDnr#ECnJ0oes8#m-IM^Q(vG)Bznla|beA#c65EWbj)DC&IHFWSU~P
zUNNhhDz`)a#7%j(!+)hRF5y?>R!Y4}%9vG$(RSaXO5SMg^Nd6qtniH!groGQkotb0
zE33i1%Ml;^kHp?KxE#dZ6FN$q^y8X5Dzr8q&t>P40wU6GTW(8|a4o&jmb*7eLe1~8
z)_ov{n4paRfdA^I^}us;H8zsHtFC{Iu#8p-aeAM^(K^cR`RN~S<mbUW7U)Of^1m7O
z+}>dA(?DH!!GE>LzJ>OTdGK#wbLdQ07D-lb<8na{C8GrzF};D`HC-{{IS~w3bcuKg
z??9PlOM{l>(8ad2z37UzwB{t+oIfWCi|J1keOGSlU49MP#gcS14_cuobLhvd7vD9J
zdE|k24X$ENPoN(HoWuc+&;hiq7Un at erP5m>jQSnd(g&g3|8&F~j&#<;7{l0ZTAZ*P
zw8=uJ<NL-LIOd&CNZTE8`bGrD7C7YHzm1-T8LEfx{<!t${s~d$Ks~k8KmJCN at 7&w7
zKpcF4ILZB?-*<ljDIOkjug)b5&Zu4ec=q$EoDW2;2i`q-9}&nVz#mxvP5&u at Y)4Gu
z0bXm{otY$a!!s4mwyrQK^rTDAUVmV_lcU)m&24IvYWF=@MJU?Y(vm#7sc)^qx<fUG
zXdHK@`CT;2X5O0w9BxrfGmVpU`k%O_<~N-X__Z{vW}TTh*F8v9uLH^#SF|TI7>e~A
z_{pBmrZ(kI5(z0aKo`Z_2lX{(%7|&Ywjnp3&)w67yd(6AHGH>NJL#*7ZeN-29eXi}
zIO6Zk!qc2Ubr>oG#kn~haCXSrX=Mpn?1<4f<niGz)U%oiZR;5I!<z;;8!cIeXGk at i
zq?bgxHr%RY0K8%^HNKw$(k?6WSe~K>zdrDN>%D#r>Xc&nQ8(_Z;f^4l`e`ecEEN_@
zHAu<Z>K{MWcI>5NzGH`g&fHm&M)YkFh`VJ~uD)=@OzUh`x|zOsq_!=R at Vj%5tZ9q1
zJehcF%%$r+_n4odOj|^vwp_Z|v&8%iVO^R0KYiPMZ}`3s>$+c%e2%z3-JV8>?;V&^
zMyXL^!k<U|@^n?xu$UN6<o0i&y#o^(EcUc`-1j?a2d41-!uK2Bx$sQ7<9Ca(3_0Sv
z-uDo7pbq2lX!xYMTOAJ1bj16Ak9~^xzxtZQ-N=d4jd<FVhi|e8UnTi at mLpS?LXt+(
z{Xo&YOby}Uie>bKrzy12Z{VkrocFc9s at AHN0>v|)Q=zq%zPy?VH15}g9+LH;-z&OM
z7tYx>R$)gt=v~}DD?gRcAVf_rJYQ?<v^wJ3{{#5l3slD*rM!du=ZCm&hNpGWrl=#f
zJ<``Zps&$zvaC_z0AsXh72&{%@C0 at pO-5YnTZ%W7RtWriPT@(hX5Hd=6_HbG)^YM_
zv-hzI6G;uti={w(XDqe7EGnbL5J-VM&UD<x&R#US6E5 at 3L_4IOzd2GR8^YBAT?H{X
zfv&S?<0oA0+)PSkv+ssLIzU<mDRq#f0pQ8gWg~TX$Aw;MALsj3EOix#IPK#wJg^)%
zm07q;FRwzHegEft2Gz^_D#1$>?p}DB;T_T}!}G7frLtZ<L96lEYa-CMJf5HJ&kdg(
z;B91s9`E(tU@&u3AFh^l^-uKZZRA0Hk4Mp>9XFfsjp3LFBqp{yhm?~N_Es_h*AZZR
z^?=t*j`))|CUy;_N at dolCA;J<LyK;guG`>!)VIhHf48HnNF??7-3GMyh5U}Xj&@Tg
z+ga|2J#{g$60BP2B1TcQ2TP2%qAa793mk)Cx4J5J98wy>2L*gq%TxHx)ZpArB-9>$
zV}sq2WD4GNQrrJ`I(<MRO+$UuR4?ksLtJsvT+}pza at AW>anA-h5yO4TrKru`MsPm^
zfB^gT^#b+$DM*J at i?%TV_Ozk)0I$BS!~G~6ub>6S&Z3TnBYaX63fWT{yP*3Bdfp%s
z3mX{!fAl|J6CsSkg&yi>2Dp(_fZ`PR7GwC&f$3_`B|%+0U?Y>FO^h)3f0>?2)f3Oo
zROCZqI}if_l+2PiN9=+R*S at H3h+(g#I%z#^bHsPNtnPo^h|e>9zD51xsdhkvH*v^1
z#fanNAo{SPp{J_X#dqMHG1#-XKi9?3GrK0XPH^Wr;=O-8F}da43Ih0u=nK)RUt8zM
zd|Gd_La*CB;(@eA_u(`QLtAX#M?IXkZr8%r`#gE=wo&{1ljxaKhQ$6I^wk7mGr2SB
zZKEUe$4U*gxVCDwZPv!zBUXqJ!4*|KgfptuoR{4;;CSQ)Ml@%dM4_E+E%uw}^iJS*
z9ybQ~54i}QM9C at PpEu%4o9SENfLAX5fUKvo^C+Dq5#W}p@%9yvY|Fj#oV9p_iA=|n
zRH1FO*Ecs(@0%Bq!oQ0&*a=e-vP9g0%baA-w#0qmm4x|cgc(^Lih&#ml1PUnP@=)~
zPKo9N<}leU%q*%8;z>7<OsXGZP6AZqSF_B!-W%ZQhc|PiPSqkP?#u|5x0MJy48Tly
z8of6-Gw4Jg0ly)%4$3bM-2myQKuPn#%>j1-P$KfcPo-($|4rv%6iO-t=sm$xI8sB`
z*oyU=&$DfrW+<_(B=KH$|LY}fSrB5N_Xbzk=90}4B at 9i0I?|y`7q}VDd9=BUgEUEA
zOlk5?gy&T6BzWdK=hIa$ZEczA?zNruY;JVZqn-l?e$svLrLBz{Y^-Oqhw-vzCLVWH
z^51seggUreTY!I_8Zm~^{`l0+9pEdE7=~D=sRmk5OE>%G?$W{AZR)qI1>Z`PwZOd{
z+&pksfr~A4SvcAN7=lmO`9~QKBr6(W!?(tyvYTEn5$p7*ONya&QZCh<ed7G%Q04}p
z26*qLT0Z#gv)MPE5je&S?sMRdD`n_b2!9gtvgfsDbr6<`(xe9%Rwm1tO9~dH at x;ly
z%R)s?o)r4*LIyL%w*;O!z6y9+e3&N}_{m~;%Y!t<J}da9`fTvbhj1R;X+Dq at nF2Zk
zW^10b4DUedDG%Hzt)Z4Zq$ZDWCATrm`&{g2O0uhv(TKvcyn^<gz}Jd8MZzB5Rmo}1
zz%v83dBs(!Lw_dtUvgC at p?@OyUvO2XB!PdDtB^C|t&z|h>w!}(1b)-vDo!14T+_(3
zeyW`8%m7INZvneKlHtrCE!|9He7hkssojW@;&(3q1<68=^06)Se(%I%>`n&o`jKw7
z%Xp00$+V{(Bi<}<)4daW>bi_QZf{l(1(^yYobA3y4$SJ=5uDrCI$P*h at WoA`R$3JL
zMd+{L2O}KdzO=TjV{;v#wboYb*(_O(tZEy!F`mswtPu^`t~twwY at wfqS}Z^hVdM=G
zfjQCK&9ocZjqOQ^n_IneKysd=WJ_X&2<6$Jye_)7ZEH)0+hS{O+1zNQMV|cjQ*B#q
zq-C>*Z$IuT<j*R9mxvj4K$*}S_ at m}G-V%Yg75z-I!1Jfkzu;alJ?=MjS*xcJ9iDK@
z#2wvVMpW(AAASw|8$&I~C4^4_A48}qe9EcXWc>a;Hue9p_U`dfROiF^naf at il1Z}M
zDa<C3TM;%wYouwIEX%@T3JXM~`=vDqMQpL6L92afIh#y0V8qBJp%!sb8ltbo(8dT#
zbrNoiSj2w2iv5}zkj7-!%O>2GxMbhwIkOwV_V;-|zt89WV|QlGoO9+}pWAsZRDk#P
z|735_pj~foz-*ld?G50I%-*1Zw#=fd0B$RuL{%R`akT``GOIq1??yYif3KC*^MA2o
zi28vdPPB}xKX8GIP=JZ{|9efW>~t(!|0wfqpQzdeZE#~GLV%zct2(>b@`ilDPtT&Q
zohpax_dniSJu}aiADK2YFI|obU3`xvd{@W3z-_vnU9>X9_f~#mV|PGP%RBNL{Ay>l
z0<?R=x0Vy$nSv2Bf!fZ3FP;fvgxf6NqoNozg)BjHNG$doXbKsNJzwn!3Gjc!9X01R
z9}}PO&qTjYi*q=Iz6>>=DJ<B<cTB7?K2_4-_ca;*hTc^Sr;z`o6TH({?P}13wFgbC
zHY2N9uhVPJ?Oz!_pQ=$Q*qIJ>p6|G+1}#hd(4Kz+e9LaGMp#$1CNf&|!uRv_+?tv4
z#kU=3f)de=n?e at g<gzJWyS#YPL2}W6bu{?d*nBt2hu3Ra$oGevG{EUlXO1WF)}$a%
zk~Aln&f1mcT1yhpww7<V at SFBQ&12}j$(p%d?vItKurDosEItooxMPeqdbZh&xX+*G
zU5=RPGrk*m?c$LO=Rw((p}Uf{mu#M*)#O!b`)qd4H#ydY+`bx1er<O(Nm-A+a9c-S
z^SnZ`+wv6WtI52q5?>Q%LVJ5Y-6t8W at J{w~=;3CM=Uhp*9c6FEXlNM5v1p!$a4 at zE
zBOIdFKq#3O5_|#FDN24(4WS<i8|L&RUfZap4Zdj!-z66K;p-te{2OsCcN=h&xllF_
z-j%}s%V`}4|F)<f{)a{@;eS}Pil0R#ej&}`?}oX6nhqZ6m{89}{-81s3GpD5EeoB4
z|7D?1FrF{QYsc|wHqyhmx;th!yS<pk;P-1QFdC!&^)@5Wg=YLV%n#NgU at h>~Ox6yG
zwIhqQBb&7&9ojJj+L3`YDz at X5TVS@P$BzSrbe3x2S;zBsy`kFA<@OBOqm|idx=%Kb
z at yX&?U*TyP=*tnIvGm at Qe8nYY%}3b^%2}9vr5tFAgqjyhr}wfuIb>qjT%dj7>J>;)
z_H=U7zB&6I2fAv`?qhx;ZlzrBMy2c(OW77WuBsBKqN4DuXiZ>d*&g7|4JpjqGJ#Ab
z#49B_H%+Sdw9ax%z_Ccw*z1p0?)kw5bA2XIPv48Gu){Vfi}sLcb at cIG3pIO);bvG_
z6Smmuhwqya_~E|kNZA61Z;U;2O^9tJdDPlI60m)7<f_XdbbIZ>XGkUE8LVPYzspJH
zncvuWpeBCwnt;!qggP;P6#a?EkH+Oa%Cac6cN-&HU2C&GseLabsGamU at RO2|=$g at E
zVCh}8?<taEsYl*Y&-q2|d(boe{$lNWTSnAR>&omFj%9}Q5?|N8m!kU)b^|ZrrE}57
zBB>KQcz%r1t!x?iiS$9O*cXYh#R#wzt=9kKml-FQMkgaj<4LUlP(P;tjD2s_rh}YI
zz&KD_9E|(n4sz5~CRHV}bI4fRR$@iJ6IHj-$ta&Ybigw($>1l!Y;h>z+<8$laOajn
z&%pQRR8h at 9>Imnn<II5F1e8vw_Rw_EKp0mYp4oUU>hHP-C3t*xXe2d;XQeDkWYK4C
zHXld}8t535`24+_V)Wf*Kp$MdHeFpGZ at ZzduP{ko4Q)ant#lG{4*aQ>Pk?WzM$2oI
z-2>fYsb5t;uXWaf9P+=y11+ACHj=Y!fY=vYAP?6+v%j5czz_2n(XtOH_tne1a|qYR
zmGb01%I{g<TzwH!cU*)Nh5091-K9rTxNmG^ee)ck35#dSbp+P3ZKf>Af$#f0GjFnq
z;kV$Qgg+5qq?~u^hEA`I%Jt894aD5x^^V;TtoP9Q{bo<%%|zf4cjjk_mJ;CBhqZF>
zL`IO7l7Zo^9MFHo0FkmW2gwXPjX9b!1CQ(}a?6RR!ts3I>4D)*nYBS2oz>6I%&Q|a
z^CTI{Sx_o3F={1#q~rG5%=i)b_OtOL7`>$U*RP(B+4LRb|Da}W at ojG?E+yw^IM=&^
z>~Rr;Tw1=N7xUGpL%-^P=1Q+IRVDtd#Ji~yRs~9Y9uIWg)IBd=0`vp=kSQktV!|^s
zE<Nxa=m)d~B|UV0<3H5Rk$+Yb^dQ+-LOWp}OxRuRTg~P7a-{*yjuhWVeN|M=!*TxT
z3*fT!yKZG`e!3!%^r!90inZyAjf#ms4LqU}rv!Lzeq%q@>n($oR!I}S8u5K5`%x$@
zDk$uBJ>VyFwu@}=y4M1YR`KK-^dEDM?*>@3f&A`HrH|$;yFwRrXDUm!(bsNTu$81y
zzQ|J8Ju_D#Gjr?YreDOh(t-_LMYk1pM;0L$iFMW(>r0rou%SBV^W>WC>W+*Sg`RCs
z56o^eP^PmN5<H1}Pt+X8Qw`j=ewmb$%sqydNo7<>;GCCel&9wKOuur<=oy&$D(q})
z=nh!d6V(z}*N?*U%+N)$j#^1R1^nFS56^_1ZSoAvc(@PsrHl4G*|MR2OLhh9*XhK%
zU;;6_WtcHLF(Q0Y6<ZyZUU^y*QTreGbJ!Zx+~V2dt8ds>d)NXz*l;E%tO59HekGIn
zvMxp#ZL1^bH9`bvVkK*drQuXV>^;;h9JsmGRzcF?H>AblUQ42hW5<U&rFm&;*NIV1
zNl8=BpBUzpTxsgRPGmbtX`1>OKr0s8I%EY*X-;zA2EZdc4Ku$9b3KXvC(s&$&Zn#0
z1N_5Fuh5o`X~#x-UnE5f4-=y(QV~j|;rE}vix>#XW(>T6jJ=wVCooV0Atzz~>t6aw
z<1}tZdynjKREYc>rEhQa)t*;1^aFKH>&~n_Pch<?5Xpo$Uj#4Jwjtfzus?P!^cB#U
za?zTd536WRyRyYtDv+#HT*=nXm)i8WlG;U#st#YR3w?!rv_aCjinKM%@8CBzl(8Bz
z|8otnMtU(fo{TYWJmt?u^Gal;O(G+UAA6(lrA<v9=96p0wVdRBEORNg5c(#*mQy<>
znf6mi`#?{FyAQ*EPo|#==N=?pLd#(8hrU$V#CeFZy4d=V!;|>)g??D0eVgfcynb8=
zZ!pqw4;}yQ9&P5k%-t5%t^l_Ikoz#&Qzv8A!HW6em!(5sWjw at Wt*IwJp1t{<q6}QW
z=I8JfuH8&0cjRv7s%2#xHHI<+?zZ&6Q)O8^X*2J8vwjQkI|jr#y|b$A;fFNAGq6u#
zc&uGBgdf5;SH_~etv*BJt7TZHDqzMsm&|SMn7?2P$=A>GJcN4=qiayhz8^4rWI>O?
zz5p-!nk<>V8g58Zx at QS|&u12lyg<hSzCr(s6T at q$g=roIh>>>sIR>XEqg1ukO6Lde
za%Vn~z^A6+P--|?K?}XxiCm*$6!v~^$LwQvuRzUc3q&Wt`kn}*`KD_eCD{Tk8pzBx
z5GnA3vK5($S~H#0WDTUPBAJQA6H8Yp#JQr#{L+&l6P*-DiyU;4B6Cxk?$?!KG{0h=
zkg>4|R1R7hu5J#R5&w7+HC1t{T6CK*^mG8!d<J4cmz0?h_rP9RNqF8%%%y8J5%RUY
zKL9-1c&rWRNO$lGv~(f!IJiVh6K&{ma4#uyl3K5G!=qjPkX5`m=y8yqqh(hp_e5nk
z|3nq?OJ0%M5Q854sVEY2ALk^?(liqt13UR%Ph#WPcw6eerYqhS5NgdGyNc3xJ}i0(
zT6(T*F}yF*Knn?7LzrDu1aB76k=_UCO11pM{MY8tDt{h5>=!<?lRi4D)?XS`hVy-N
zY-v=>Y0upKlGsN{?Q+|_l(StR<aL9sl5)G>*xdHg8&BEkQTp<0^FyENbp(F>S#Hhp
z#COzkrKHZ-Z8;^@^FV(IM^Ml3KuA>mr{bY2Kwsf_D at 9{=KJ1m~%7CS5V{2|xR;v=Q
z)^bf&K8uVc9GQjOapEQB2~n%65?`fh<Z0 at F9cpbe2GVp`8xjC3PeBSiTOh-u7F>q}
zBgPA4ZZxCS=rwE at sAkkz7bndog|;PR$k4+8S+|mrs8K9!rJ{6!EVR8yhDlqA2hxXA
zBc#Gk?Vo~BRH~u|c(WiW_syg;pzZ+V8waWLbZIR>eiOX4`6zD!=xb0(b_Pj{Yh5$C
zEx58M at YU;gLb+MV2*NXHTaP70dA_j|^}|swfBmUA)xHxiQ8j;FpTBh$?W`_Q3?tG9
zinR>%>CuNVWDEdN?g$yx<t}9b;PXE>p$v4`m-=apx;!Q#d_evs at iE-F{R-uKtNK*W
zKtYCPXms{g?>!t6XlJw<;NR19O#RxZaP`E1P$-UK(p1A$WxHZ2IZASrZJHVIf&uWg
zHI%LTV-sm3eD5<Y7C)wH)Lq*~ExkfRGkoa;mZPXcl-?(L5}WF&1}*-%9)SpYc)%rb
zy+A*oxhT>@9g`QflMI!%J|7i(g+2qlw<@9j0cw5&FmWdIFhlJu6vy)Q2NV(7E}&n@
z#5UmTapfF~yLG>qd=4GkTS?GY`Ru(<0G!D1R?(u~D&R~4-dCYttEur)_0?sU4A3{j
zFl+5 at -%`UBvX1boUwLRudi`yx43vQp+G38`FTi~N`PbUe_%XVk&ZZ_h{z5f;^(Pk$
z=mXqWXt?4Oj-=sv2ilsvmQBqu%LVA^#@AH}HKapdc-VuUs>B6>^`$I+%wL3F6U*{x
zVxX9ge+uK275H`-Foxu at xbg=VaDfL;&)D5dUZgfyH8=b1fyby7IRlK(GB71*^$bj2
zs>vx1jQRQZk|OB^Dg+Lya+zI7WXohMP^JXnz742U^u;z#sw4AMyXy2L;uqr@!m$;%
zp+!pTxIVwi*Vm}!EwfNh^@$m}%?m}FGJm`Tqb1;Yb}Tb!<onR8JG{RIIv+8?umwC>
z#AlF<)^ROwL#yZav)+0VzxpHaDi-}IwIcs?x44fO`JWOqKZi(V&dkI`|KGDytNl$g
zKbB<B`Ft at kU*tNRh$Rr`Jn}=VrR8o+hmm?&GYys~W4X}EL_~bEpbE;v_t1an{?n)f
z(=kW)U4ptr=#voEJm=^7syc9tdl;oWUG4nIQS^8cUayS^N85%4X78O>TBhXm3T?*Z
z*>}&0wD4c>{F6=^`W_{8r at 9Av^FY#{)Opp9d%I&UQMfaEZfR`AeELc2pMHX8OUd&T
z80TJpAJ;NVB{4Hf5eJ`9XZg>NG6#1y<!EkSrDtH;Qsz};TO)~9u^nlvUyGU~k6gTN
zPsZwRi~1EovnT<@9OX2ND#NZVh(fJ>=n=|-p2XM+&1xCf3n_nY3#BLbsI_Gl?$K*k
zaF2$*<nt-7YF%aBL#Zip4RD4Ado`1H0jHMKL1DXf8SYkkZ_C>qld1vhhSvlCX%9DP
z;|>UWm8fuLG(VMCp%!DZmglH;EbA`<%IWw8#A-P1=aM!3TCZvE>W(6&&6nfbVf!f6
zhuGm%AFjQKlrZe at ql3HOK=_tfxcjed$K4<5V>5j;KD+hqi~a at K<R>uCpZafNHl-MI
z=_Z8Q*Lney3lyMoXn4aJ80ERlXXRYvMlpWi)Icb$;iFXgwFh;Z@~ITKgYT0Kl!R>5
zuUmy+>jkD)PJe!h>lh!($CwYz0{UYbu%lHMovW7bhi|H#+J(^YsMsQJxy?61vcNhq
z0cQm?)qnq>UQu~Em!E}C)x)%Zg*x%nnw>g}QNKzs+H`g%9Rj}$_+_d$d8g4)DtAG>
z2oPx9v+7MM*ZhQc7E({^b^@l$;K$J+Tex#_4^VF7e;ws|`99%-c+sHl2H39x><>VH
zA3!Q4>i64m59~b-EjPQ2z#~p*{1d>1FYp>!1b5xKX34-lW_wfOXIk%jkE7)<(|dn5
z2K|eF6j_8Nm<Hc_sk#=B#1(ix$#~DXjeY9lC?`$mRy=Ig*Pm8%VdX!M={0xgwtxY_
zUxGRjWC?Ivoqx>;T)2MS8Fm#<db6(a4BgZ*iEO1NwUe(RR(c#gZmJ6U`c3 at 3p}D5h
zw_1$BC};L-zVaNiN_1$HI9AiCTUZRc%&hQA{3U*Zys)YPFYHhO8qh8V1BL+%uq9zY
zR`@Sb{}aH>!dM{9 at uIhwaCfv(*c<;96fY<De;4~+r*AF$-URl&%{7`Hl?J|N#PL%*
zVa!XQy~gl**e&U>cP0Vvgtb0e(}^+7eLKV$v~j<0we71Ldw|mS#LsT%L0eo#?Gf0?
z%vR%XwtA)U?L9Lg-=d&_`TV_<)JO+zKOnTuY9uU at 0G?0h2Qva+f3uQ}&*>xE@;t8P
z$a<)4gkQl^Ru&&F at qSmm0yAPl-Ht?V>g2VJ4;tBbzDoJ4Lf>WxS8xTWGD4QG-$4kK
zOyv at ZWa^tNl`t+5+FuK>8PoT#LyxJD(uMvDYuj2AXc<ENYGcEGPvX at BFfNzkyHQsM
zr5$ZN^M6L#bK?GDi-W2%`lo3sVVWnz`ZM6)OFhJ}&qFeSuS%Pbw#UVsV?BGHNPHEi
zWfFPtgb}zY<7Oj^0M0zNsDg)>Zvx1d1svvbRe&~BLCO?2u`FIntP`82tK7Z<Y<*-A
zqo<7Ub_mOFSB-j$A;p%=KmObK;oE<K_BD7&wi`I5?a;o@;rRmaei%y_*YSreA2FRm
z>c&GX=hc9^slQy!>-V@&FNw6>kFl)Z`Y)BJcHmk)9x`Te*e%+*MDcxQg3+-%asz+v
z&vg+~3EEw=TnlMAlxc$XMEf^T86_NVy%zX0 at V&&8h56Z?G<cWUk<045s at KQv`}KQO
zfxhz4j(UuH0CTW8dEK78?gWfRj;zEd`0 at szJtfsnm#gyu^QEaA<Fz-?@|Xc(r8*y5
z*0uwB`%uzC9PKNu{eqg$uzV9z!8n59_q8G6_Q;QYM6haRw at F(>h;_ndE<72^A@>C}
zqn&n5Rrukc(4P at rtk)4qhguGGIKvOShii)@vT3}B+_WP6a4Z9DIdAX<Nd|KyR<;1m
zorWHLsMasAmYmk<aea-AF+e)>)7%pj6*9u8w*gjFrBA9fm5~t(gMw<*qa?-2i4kr|
zULZ<z3C0x(w*$$tEo4BS=FsoYx=h{X5U(1GM;=;+-r=FI&Cnlb>)pZGbh%s3Sb(Lo
z9rSK at Kwhx)59IGu^V&JhT?bFw=z(xM at R)Zi;trXo#JF+1;V2<w9W5;NYX$>QEb7^o
zakQwf>O$ouKhTcGOWXy(4ZcS?<2j{UP&=!h7z!mMC;@3Er)uNE?b(#vUEB7Q%eUHe
zD&8K<VQaTKC}7K={SrCQW`OS!@)KCw$2=H`7h0|B(rFeLc}AlhB5cgi2QNTCjNI3X
zUO9{{ccZ;1jz3(xnTLb+rG(T0O}luhRJ#qmC>+}1QiK`dTzrcoZTvA(B)Bj8IelLm
z%k_OW<Z^1C;W(i_osCe3OCm~k7P%Xr;rdg&N*p<meEv!Cj}I-w{6Iq=po-$4a-oxw
zKaPbvrRn({ZMB?ahY>NGE<zjk>zZuW^=yj18uWI<%&m0E!iJ88n&pNRf5&_VC$OJq
zlMtYv^*2VTuKCAz11=||fS7%SoMrc-kBx9|fqQ`po9*=&126wXuMQRRKfo3fNmaa3
z;`Fm-e3FO?aKvUW8dGZ5GQ#aL5x2V?@`7EeWLLMtdNW9zx;>Ouzu<%=att8eJRg|{
zb0<mSc3g=<FVMkOEGP77hE$DgjT+FeL`c- at jNONAn01n@gLXJDpDd}{J2_ZEC2!E$
z+)f$p$N_o)VY{r4tiQByZ6)t}l+RP!*xoANRLj0lu8OI-lFF;DsIrtL^7TZ22lNEV
z$wA$XF|f9!auGP^*krV?^2<279Mn2quT?`hAeCEdp~M52SGY2jx8I%Y1<z6v5rDbb
z5msNFUZ370PvV}_Xazj$orj9TG1Qty8|H(=x0*9Vj at 4%b#i<Y3%a3QFO|K414icF8
z7V1XJaK!T}cYua6+J>Z{)uEPyWbp0FZ`1g0#8+%A=eLat=1sll7t5h`nYAm<{;#qY
z&5xBs88T`w^RhtR%JGoAm*ReXW?-h~tK*6?c0LWM?QuW$StLASL*g!nab6)rQ4-rf
z54Dc=eIL))&?W(T{Xv{|@jW&j&P6WhaE|!|T_9x%z4|y+^#MiqH-v1EH~ar1?}cRE
zi<nRE5wtD`S2DEwcI1kS)@Wm(g}J5W1p1ISwkSgzqr=PoEDsSM)A4G57UD at 2@T5p#
z|1N>uaz@|3P{;4|z2PAv at 6cCJRkZO`<5NmO)T|Udxu@~zfe(pH at qQ&-EpT<g)e6^q
zxTe8XgloD|u<1Nphrsm+Tr=Rh2d-IgRpFYg6l}!znQ+DT5?t|p4qWlQ4X#-Ka3!lI
zUm;aTkXq^DX=l&0>+uEEP)m``;-!#LhdwYum)Nd~V$@f5cPXjW%_mo-2cs>Hn>Dy*
zJ_br_F2IuA^zh+K7z2OgrKmr$G%^RZB>o~@;5zb?r^LGhB`3a*^C8;Fl3jo6x~E5I
zw}qzpCi2-jT&Oy9A|3ZWDX6;QLsL`-u_#il5x#B at 96o8f(?L1+T-Y(UST~~g0<4SJ
zMbS5r8v;1P611=uA5sV%os7Al(?zg0-#Q#_7YTPWO8;Hs5}%{(WB8w*#Ju-(*cg5v
z`pJiehClY1MW{#gk}t#g;k+}KLsnn8U{OV1IcHJ at -)jC#JW=)}mYblY3n0pRRa41j
z^>X#)$AQ-|qK0EQ7SX6VatH4C%TI{q#9by3DJUG^g2Pc`gqpKog`BTa(-rkfHRgMp
zzU?o5kvs-pmWX?mMA5?8jr&@a`?zM&Lk{KPQy=FYM>Cp%(tGn7KKF9X02vOAZ8kt3
zhcx5vvxQ>^xmx={f6*>&9QK;H>s at UnWh*#xY>Gb8{&6QJOwA*YE$bz>blX&}SRjwO
zWWE6?l-}ZzZ;2iA at ecjky(PLF{Em)0Lnx`RGVH_=cX1ARbgDoetHqL!g>ryC)ob|E
zw`#B_Yxr}=oy>!<+`kmlb>Bn9_q|n0SK%{Y&Lyy0Vyfa&NJ}`E!AV(9-8f!V=qgBm
zL&v7cFF1e>dj~L<`MT$K at vB%e`TXB0j5e4O(lHvW(+<39qi{TIENZpBzWw7|GMAOC
zbIf(U7~^tq+0YAmUB2Pp<YOlm3XFCg%o;nVqMh(mPUZmRSLh3HC`0|;XRaP|TwA)$
z517sdIYX0xO6Yb9b@#dC4GHIL>AoH9=gMnbl&i_4H=T3UOxyCnmW2venXhCS^F0GM
zJ+UlmdcQ}~zmRPE92eonrTPJ|@O6}n0o;CHGb2<UZdNsA1%X`zG+(-h2w!RFf82=l
z3qJGdgOo|SPMN^YVvx<;uR}K7!}c;l8P_uW3#LVO9X0Wni8`H>9GQ8^t0#G#?@9DO
zf-998udYqa#$URDzVO1h`BPYc#Gvg_jB5h3)52n$Ptg0>bStAkj>l<GhWUpy+SVbn
zkt5Q5F2{yMP5HTUT2cceb;zO+Yre01f+;y7UVX;kZjlbn|3k}ZyR9up|5kXvQ#Rk{
zlAzAqbGcNg$=otckt*|Hz9g~`At{C3PR~aDu+O=+>uZ{TP!RC<(gi$u7$A|C^OP<j
zYmbelCC%K`9B(G&fy17A)rL at to3EMB+KQh>xvN<rOE0$|oA}WFA4=aDy1??JMsOZN
zY0d)>DEk<|A-*`i8~Kyi(819>0HgU4jOK0}sjF|(&fs*4{vF60OX&o5{osbY|LRy6
z%uTi<O at 9LvXAmIv0hdGQ30YHVrqju^FJSHO)_J5irn<=tpy#qT1BLJ($FmJ1iF~E|
z)J&|#Q-A at alXG$GVBCNridG%_cBvNtlen9O*l%H^tau;Wptmq6y4IRbhXmJJ66^)I
z4P$1A{py=N0PxHMl%h#xQlEq){=&b{qEZekV+Eg&`6)&gT<96d>pa)lZ68co1Suav
z%7{T&Fdtf&+fjlz$*sr>prwdA-C_Y<C_2d^;OzKNCL3{M$^-qtniMAW&)3^C(0#*L
zo`$j90%Q3?oP!-Yj7dS<&D>>w_5&1l*Fgt9<643Hbku0U6#}*VA?~M2aJW7qKEfeY
z)K1$Zne()<*c^lNyTc`m4|dE)FSAJNAjPT5t#XqyDPc$?uISL$L7NKHe4RghYjxnk
z4kzr?n>~p*%$O<{&wNPPR$I8JhMX}JTOU$t_>Nu7uk97a=Q>-*F-k7LZ)Vpz{^>qH
zJ==0O_WDBQ#VXH0hC4Akk>;MDEuzbn>?Yop#cx)!^Lb2x`=^nnHgr}#%dT4G?=fA;
zj$yuMmF%^te80!{VzhD#yVA<7dcH%LZ;O&Gr}AxO at 8!yRc9kj{5_h`qg*Qw1`b38N
zF1T}6HXI*<6oe9(DB50t);zOE#An+U{^^U{ks*rmsF=+8tWpw9-T(d~kMD|7&s!9K
zKrdIxZ at nlSNgEi>+Q9Mk19#(S*d)Fo-X1SGaXa7u2U$Y>T|YxVo+!6^>rt1)PXUb5
zgnm6xCeUT*z7^ZNRNBPil8BUK03OLK{`o_S+SwSrCeqm#{IRsM0O5+$NX<+lk_+5|
z7m10^_6!W!P%mm3jnmOnbz^~M30ydAl3pYj*Ku-Se at 7n5@@h}}9+f&+S(-2Fo<y`k
zO)zW`_tWA at Z<o<ksvl!(BNb#wJC<?d4vmSPfnoOGrFn$>T<;fp-u%Yn5Ub}GP|r&2
z7f?`T*t=3M@#@qfQV-wkrMC~LGE#!Do9=+!RMz3d+(}q{2cuicl21!~X2F0FCSx`x
zLoxFr+-K<boIwTdA!bTGp`Ry!QLn9W5wgKUhIU~(g9|h9E(ny=NM8u(r;#%vhdpFS
z2Fjys;dtPL6)=%b-<08wLuoV92Ws;>eIvLrI2&Kf4O-w9l;LaXFxFN!>LwU*12r{1
zgrm*;LOor3dcoGj7jX at s(wMT{B%#k_`02fCOYcyIe5<5IFF80*U&S>Y?!XvzGsp<|
zT+QuwMg6f`qj0BsV$)M+FwoA?=qr at T1(`%*AfIY_w4O#zy9O}k>qd;c$GN>509Gg5
zZgLwrJ;V*YK9i0Vq#`)XThdt#G$izEXmJ>hVZ3ehAjcwT5;u80s!sNjv<<O0-54Wx
zGWrIJz2=7XiuWRky~-p7vg$6jIBJl-W8M-wX<PdsoY&G(76x#fz-&%Fo*vtt;v%#W
z9Zokfky<WfjcpoCb?B+bV74-sGCytY?bgBC=A~q7{<A?taj#<|l|xy$9*VOZn?mRV
zScJPLr*e)>!K|qTjwe<7IbrG|M@{Kn)C~D+fUZQ21y2d6YWJTF^<7UlWv{u8ZbD6x
zCD+kS at O*9UAl+nTbW`HmuXMU8<KscP38C#HDJfAf9i<%gkDSQF5r_=~x|?&<hRoNG
z59DL~NN_l`yH*>mPR6_*(sF0<az||nT5IcF5{%*eqM}lJhx0$waD6|nqyNz7-oW+r
zp9rn~hW-<i{XqJ!Y$-8 at Z|Fxj{8^E?;lt$2o}-5$?XTLD`l6t<OaR=3|7I=UC5=6W
zQJE}@(Pk}Y*s)>Zvk6sMA%3{*0{MMU&Nuee+5v!s?-x(fx>@Y{2_b{)X90pa>kDAE
zon-}rhAW8jK8H4TSubttHu)UNNS}iaKbaA-`EDUO%X%xhZqZjjGGNAUQPO<3&_Nvp
zEr#nO at QC8*w$#rnQ>ak?;Sp>7U8v*jlZ;m12$Mz43mIvCNL1~x?sHYeGq7TwUnVaC
z5BEN!S*=A=O6_}qE=@c^<?xe1G4MmQ;Rq`{A!BeY&(c1%cju`k&4;0^!ffxWSVX3Q
z6=)SbgaE%r7Shb?EpFX8iKs#<dG{2O8F(ZzabWYn at TTv_+qFsIXxjuL5u3|FT*Z at L
zD|E`W6$mqz7WmgFSt=#KJ9-_|{OYj1BVQff_^c!oC&~`sIvZsNa7CHI5V+1!$v$((
zF6}1Rq&Al~SzoTLA}QTkqeyiW>)Jc4u|a}*_x+AQZTp^u|Jf4M30D_f(}B01BM~~J
zV;9h-zl|%Tj at ZarQWH5=?>b>AlZbM{Tt61xJpl9&+UEm*++SGit5DE-%jp#>VmJHe
z>@F>~Zr9G3Qn0Pf1{lQ-X%lysUYF{E)M3TeZGjt7*FkDpv32XaH>B?AaCR)F<HHxK
z67VknhIeQ1opU9vpf6Knpv60sOjNa6bIZ?4?V9wSX)kH~ytG71Q`<sjlpDkI7w|05
z<F!p6ed$}xnNu~jr!(zo4Mx%xFCkuH^R6W-p7~w!lPW5Pd&2Ld-#J_-YB`=d4Lnp`
zviAo{wVdAg+bY`lHW7&07*}AihhM+M>D&&tMp<E_jcZSgJU6C$xH=x8rc+ca8u_5q
zSP;xe?ezBi4kuu9Sch~np3Ys{fI2bS6qp5AB>};`7HX^TuL<|SF0W8&@{CSsye&8~
zc_J74ruMy+(6evqp2vLe%dFldfMqm>?>e;tQci4$rI$LnHQQU17e)~BJwp8Xhx7es
ziwfxKa}RV6DUupK#MlPV-^-d2Xbnp(*JKG9(6R$hvuaKR(8E_6U at rY@>(Co!ET)pC
zg1Dy1amDL}arvAoYFj|q`(0&gdivhujlU!uQ59Dm-}q|y^<_~K#Z$s=5qS68nH_)!
zaKUY?rB2{-2Ispy5X#`oiM0(OTn#%Z{ALCZ0aR at FR#8-96$3x$%3aV$9 at FQIT2eCy
zV^Gh$wX7-IN)pi07YFx=SZ8h>r)o9aOaAaLBTHzxb4E=C03Lv%QNIdYQT<x<nnCHM
zs_^UQte1ptKF0i|i5FudvNRau-JFJ&Q7Q*H at 1d20`HTv`BfaDl$*xLZesi>AaW5CX
zplVeKC}*m+1EVFvjuw=%+H{piPne0RShjnJlCxty>~v?DKun5A(-n?n!!C8|C#~|o
zT4qK08cwyd*cT;8je2Dm at 4xR|qWTqQdU|*uF|~CT)f(@F{jD}OgkPtfWZNLzvj8QJ
zW0HQ()QuL=NI}hGo-8%LT|dd;*09wUrJZd#f!Vy5Soh3-KLdRtAfAK#!H@}RXo!3l
zC?*=|ORmSyVD^6qJL$SLrra}vlC6XU4lmeBrWKXI3iEeQ)>l~1cxcydy<Ip{EdJ1a
zz@@zH&7;@#$FDS^w{GYOj?kw{w-qhBVKscwSb$Loq^*QYYItj!17TR;aH=25wmNf_
zpPnOr=9_;*p&_3Hjns&qolq8z`$rv56=%L!K|324qZbX`E}7-Ds7B{HQqedQ?W&>2
zU+5AT;0S^9{?qZeKbQ?Ty&O-T`18e+D-INLMozJdO5@@!hQ_Us=cF#1KyHn1c1wVL
zrH#MFbEL!PT?#pwl6>LY;*p2ng?(@)CEFTI`6zi>!(#lfH?Qb&HWl{h)saaoZ=oeB
zp7SQI$~u-$bKijFPw6o}zTxTHbs99lTK`AnKlxM1v!7QmvNO=>7N03mq)TI=fAcF2
zD7j{(@o)6}IiUx*a{cUz|6|D1xb>XUBce2e)#T;>`2KL6+GF+pF(?*~Y(F0oibpP#
zAw`DTEQiM^vul*bb9?iE8iXCG@<giqBWfS?U)6O4sLX5_$)Aj{YyXyNn at b`^ln=kG
zJ^<@G*D2Ii at Uzh0BT;M)Vu>81?PY|N`0X%fCWhU|J9G9_sB-`#%8jFHIfa<--1jV6
z&mC^&B`Ucb++pC`+n5ZBjXSJ at p)mHqZ*za|SQyN~*6D9}$-fH9?SL{Lpv*9t>wj>D
zzAb|~T$DPCgAsTIPl<6PGz-vwPijWo^GJ#JR{>Ry<MxU^dQ1|NNW2;TjGe9$|Eh4i
ze*VOtQpW+$)RN?#UQ1qElh at ai*8 at 702y6HicHZ+k^T|wNbM$pE&;h^mC{2WSmvrC9
z*R^>qlXeAYTkPf}-<1n+$fJ#|pAi(DD at LRN4baY7dY(x|{CJX26%W}z2KlZ1lTtF4
z%2)6We1rL2YBMGw$2-iUGoD+ at 7)KlZm1 at G?xgQ#J=w`TzUJDzK^_Q{n?nVn-Nh0Gq
zcI}yS!VH+v+-3*}c)G6ZMz|gP?bn at Hir#`vOGy^wGVNaUu_3VJgs{8pzfHSJ>dkmw
z8N84xB`@GhDn;TT=EG%ifKI#pCoQKec-ElagPcbHTIgrFvZzidTTFA03aSzk+Go-^
zdaHit-TjNBGq6VA#Fnp5iL0C>7pT<LoMDwSmo(T1KCAyI+ at 9^=#Wtgx3?T#KJj8sS
zMLp=n-6qb16~@+s=)tH6cw)_qLEwh6H|Y18*+YzYGE0?P(np2fW2>u#pa#13*&KQ{
z+|!fcrsmvm1<Y9tcEoRrCmoqcf38*omp?Hz9{n~y at 2n;jdmjY+X!eT4{66s4`)2QR
z_S>8{0bF}fg0Tu*@^Zx7)Mk5zaE;M at r`ybtRh#WyxvIT~M+}q18)l{#w9 at w|51e)`
zkFtjT5iE9F{_ZN*xI|qfj&W7@&FLS39%cGVy#mQcFInCdXl0UW(+;O7QFCO)%Mbd@
zEnfrlXYt%{)|q#(K%DQbL>?zv)hk4~J|1z^)z)}ryhNvnD!TzQAFY;qxxj76yP!{z
zQbG;r8Km028CH?Eg65y<1#FcD?_bqSskMEi9KF`TTFmOo>k)mDkRGRdpNKKv*jIkW
zv<2Q{tMf-Xv`wwSj at kNEy-B6&a<o|7Y_|arX*%5GkE}S+uk&@NCB|$Bt$_kh;tdVC
z)X3|x%<JBg!MFP{j!oos4;g*vTkq2v9UU&%K?{jgO&d+HPEaC}{jG2Ohg?wCi|njI
zX6tGmJqs%<>$Cix5xNWqSBWsBc+&ol>3z&w*Z5G{;0pW__G(`EZ^53pMlBt#y^nVt
zh4q!xhh`<SV0}@#imk87yB_Px?;ba}M+I|*I|>-*%F{)K!&Rb050Uw#h=^8c7>s5`
zC=32Kgfig2HiUDs^ILo^`(~rbL((eZ8q<iXOUg69)@K60Bkb%i>zIu)xTVBOm}j3F
z_-#brI#dIGtkBOzRiLB9K0it+{d1r{ligleGm9&`y${irs_L(21SXXV%6AA)&9KWy
zHcq@$4PORoz$xWd^l_AHda94FEwoW$Y*Hgt`_SfD+LwXx*)AEpi)sERo$<q}j50wf
z%UaW4mOKsK8QvJq- at P!LcScaTP<nW4`1vz<>S%Hk!z(~OInEeWF{#B<gIu=T%ir!@
zylH7^wr2M^GSXb$oEm4=whFX0RUEay0*csSY1vY;=^mewF$8_~upHU83OpSF{_fV$
zNZ`a<Lc`o%@rZZvlM2+7<64_jL))CocUHK(kZXnQLudAwiY+D2_9 at b~TWd-}0&=NA
zQ at 9;4Wd#0Z@;S3YQ~Y+?PS11i(TU_~I_2FVJ}+nTEfwZIU)HcXB<{4)7aC~)(vaet
z#~Gj7)zJL>Pk~FH$6LM2X~yPXHZ(UZg?$kSIehbk{7=VpTfM&|M%amE8~Pho!y9iX
zPZ^Mn-6ro!mj2TX{h^C4iJJzyvL)qB_(%(;bmY>;&}S)0(UET8EgBK}(ii$&3tlAC
zcYLpo3xCc|*}i0F+^@mES7?R*fY1W}vhaGJKm2hY##>7d#|AY%fGhVTqA^H+R4_vu
zO>|6Ejh}=BzqM);VBJY{J*|N?HyvQa>}cgTIPs|1%fl)?+zZ at q$B+CnT#X$+qMdLR
zI(`IjidT8Ks!^WGaIJ>tba=19bx6mL>PbU0z)wSz>DJfBE((`KjQ5ss!|qeC#e}t<
z5aG3y?g`?j)^PwQKacXFokYX}`XxpL!D#0L?bn at QTl6*or=E%L79EQpzLCZ|>KLT)
zh|mgLSANf(>|{l$dTm)BY3<I0wASwQq#jr|RhD_lcC~HUL*$vzD7}_ctDv at JM5=m?
z*o9WC(_66N<GOp4>FMbMcl+eJ^jcSa-MPx1jK5xF($*}}9ZG-iGCN=Eb`i2YWYF*9
z0roYS_NdFx(H^T;+VG3ITqR3QuNCXbz|*12Y-RSu16`Tjx(0z<^_pr|<eGG}HQV+6
z!1L&7Hc9V%77qkx>6EB&2x&`ko||M4)E!9b5qNwuXTp2l&Wr8eWl;&Tl*w^jEAdBV
z<pk+x9=&KmIgC(FgbXjCQYgzS(bK8A6+sl^6w>Q3MYT&=!l8j%<5bP;*i{R^@EO?I
zb{PF(N%=d<-OEw#uCHxg>zMGZld;{YJ|wT*$!kyY8b*Ie%(iP-a)!QSPaE}9R}V4F
z25OS(kxz6A>*BfiZamLRYIUHVAGeLG=YJX{N{@iLn&HJN3Eu(S`EpO<r4Idc*GBw8
z8IV`Ov^WRU#H>gGRl;|$9PcJ2#kzLS%SFpd?WZ$5M4Xe9{R32km9buwDqluwH??z*
z?qCv2<(fmwNa;);eHSoE_I2kGlbEO6>DqALTF!Djt?PU at i;i>Ye%%t}QW=w&vk^N+
zibo!IF^v>0sc+jBeqXzJS3#GlI}h;B9ZRoN9|-?KiDIl~bNaBc`4guQU1o(c at ZKyv
zRz|cA_5S*%#r*)ObuR(}q-MtbgI|*LQ*RcjB6mP&XaVZ&Zz^|;XQMj3SRh-HwC!7{
zfimQlr1oVZ{DmG_Sl56Am}9HtsfM)Ff<E$JK<mG(xuDHXwj29Z`5eR5!q=Lx^a^k^
zc%NYRBE!st-J97x&+c{2oy+WA$MYP!R|>^vdH33dMETWDQOyVH!lcV)jyXbx<ee8O
zd(<`)o=4s2<oYn`QXCxZ{{LznhqPYHEXcjKkJG6ohI=*OT<=&asRxjAJwC;yh;Mwu
zxe6N0jO3EVBPq^xFy)x8w;^Z%*)JAPf;5Nt4)RURKe^n$PL~t#-PDEh(A|s92#u0{
z8j0H2$kV&)_}f*@yKU1_<P~&|p|J!go?(F>26MzEbV_NNCWW628Uw{znr9$yQ5<P6
z6EDzZzz1qUQ<AedhnABR<7*H_F0xErLY{d?s?SuG6XOR3$m<lZAkV-~ni4s-iU>r@
ziPNJu!5Ei|6Hle5&Y+6cl-gIV5SY(LJWqjI>ORPZl67vfhz#87A$+2vRLye{lY9y|
zJk)fCb<qxEH8)!AeI77`OYKBEVehMSB1Ot)w)bi3pcB-2)OzLdj at j%EW0hvosjcJS
z|NF4gCwiyR$@|l;R8p&V7QJQvkFGr7Nj%w1=c-)uT>3=e_blA=KVH^HuXURWXKb`I
zA1f at WF^AF%XAGvBlj&TIxsVfCG*huFYJjmsd!w0whfmy!Uflrt4G+y|ytVO>$ZwnH
z7D|+y$Ot^rmQG}v-)@2bVZMpHkx0~6X!Bb-<`S9AdM6w5UseEOkQ~w?3S>&*jHiGX
z+^`XFOGl3p_Mi!%@j&Q{I?hWrY^mqt$6+px!(1GXmlXfJ;t2iJZ*RTZTSWqDxi_#O
zu}Gt0qeB}T87)fw?@{9ge}_GMmssMzrJjm53XrcO{{k1pxO(}YDm_+lHZdPD(R-<t
z7PZ{nk*_WXo?~L^$_<~K6kq9=rc-mgEs1lMKyPo_TvA`xHM at Hn&|#|`d#Ma<9_oJ7
zQ4^`O!Cj!pJ?+&*Wa7Z%O^0xAh&f~^?1=MX9%)kp;&jr!y9n{0dxT at JNa)bW-DpJ(
zPc?yBH}R5z;Z5nxe<xw5tz%K29JsmtQ&*5Jz#|T0I#pX#wlc0ghZ0)koYOK<LyWt5
z6``WWQ)A4Ed_1fGlK6-26PKL{?&{^x-s;Qy at SKqOF|z1df4~(brN76Q^>Vtd=NG?8
z#swNYTRXmHP;VV|n3nWQ02%)~DDEm4)K at 2%_SKhI3U;WJk}7?5DJ4s~p}sw-`k-y^
z>Jiqzl_QwS5qt7KzK;*S|6l*<eQ?T+n)U$mCTbQYk;zAV7|t6Qf^Gj+sj|UZy;KV#
z&ip{HUGL)!dDX$ZGc^PI!W34cd_%70WUc^mil5z#kSLa`35qa=#cH}C?- at OBC~w!s
zE_XM~w2q%@mlaN^Axdu%<ByE#*(1j0L(7(i at U(JOD4lUj7Wn@?i<!O;y+tJ6iuyx*
z6mVDEzlAWa$N>=LMP2iHXC<tx5*<2k{#)e!r6kkaG`EFxz>2dx3-19_XI#X*NsZi(
znMSUQ`2hqj9essM=+jOh=o?&e0a$A)Xu2h-N3spRb{?RW3w9jp at WPj4>pX<a0LtSC
z at a5CdQaUMLd;@I;Jc+I^Jy4aK3?s2&NQc#CLjF~5lBM4**K>Dm^pN4NxQUU(1UDH9
zJt23qRsv5eN>%^puqSzN1 at VVy*5#dgA4GH0ElK^c={QSDxx>8WU7Qct7nO{gkD!GT
zVD)9V$1cCC*$E;2KJ(DAWfjyoRUqimQ9{avNSj)HBSu?;64RC3rjCW49Sm7Cv#w=e
z_%qwB+aiZOiTJ;8o|7&7FbXh<$=6zw_5v4E`li}wJdsa4;wIlGr?bx)dVmWY$xi0K
zM?w}iDI}*&h%HWwZgML*!z9azP#mc^>j^WS$&cb9vpnSYb9K6c)#i3f1yK9 at W8Kni
z<bA7K8bv-D<w<;<hg2YWJx-IBC$_0s4yr0BAycwMw(eQ|zr-EdA5X~!6CYsPzxq_y
z_(Pw>6&XJAByhzuvY3v<m&wRtg^WJbd(6SC_*3-V2@!3;7 at dSCOGBBI;W~=<gu^9?
zBRj at _OOH+qw_|_AI!;V1!1Y1f&gART2lcFGP}c1bmQ_$r6 at lyjo0g4vm9lL-=EU*J
zB4>ae5 at k*-vlGWa>pRx>^mvNji)-v{f9M}*NvE$AzS}Ri&g%1fD at e=k2Z2r)j{Y1`
zKOC->pfxZZrEe%p0n)e7GqBE~+pPoT83hcIU%DdE6>mcd`#Rqi3eGV~Lj6kdatA;q
zgfCvhhQzWu*gQr&ky!8oNvoC>VWOaRDpl0Dpppy^iGD&m{gZJ;emRxd0M3nNAuPGP
z?YJ370OqG&JsaX_H(&{qo&#aQf-S_V)AQM+awwMXdKPLN%QTvEzRltGJfRAxCu9Bq
zu6Cqc2WPBYkGIC?XIM)pB at Y_P1X2?;0qir>i@|<`j-EvKm^%RoI*B<gPJ at OMV}Y7E
z&7>CknPe$#5623HN*=X$T!eoR_{-$8Zbc+q(Jq}bMkdDt at D@tCNZNsT;KT at ksO_}#
z#uobspT^|$2UxVwz%qewx|N`Ab>)_(k$P?bAmjkR04 at D`+ou!j5YEDPXk;>;8y4*>
zwJ#6|g&B$kCozm)4j6wmH{3%^_XcyyMC#FWJE!~AbK00P7W36QoKboAt7nhpgruY%
z(vUJ6yc=P)sCHHHkj7tx%4k<eP&M__!E+5+T*K-zqAi6gW3ACjx*OWHr*)R?c`5)!
z@;GWg5wE!B6aBlmK5jYg80624zDI?$q-1Cl(gCJ>R5 at hzJ<45|8nXgbsD)Sx!0lAd
zscIYYt*m{c!|l>qaZO0j{RYR|g9UMbofP&8S+cpL%h^4Vp7rNdJ5K-(<pW%l&C}-^
z&=qL+;2|&ki<;<U>Q>7=WX~>NUAd83a2 at Sw28d=wTP}X+2gdAjerRgHU1t-=cKAEw
zM%qF(0|oMj8)*wni)e$EjAmUgC34(NEO#y?#?|_XRlmeAP|0pT?F5ciJT;NU)J}Z%
z*PyU$CFL3mJ6xI^FluAbPoYXM8X84k=m}+M&_+$@-A8#bm>F3gM2~%9(2BhADyfP9
z4?kMByVosXfdW6L4WpGeaO?oR-kAZ=YuUf?>urAI`X1M&F+XIx*-4<Fd+R<iBgK=y
zkPAC at TvAH2HT?W(Uj6iX`8QC{<LXP>c=c>#h0k1fHQb(!Q7k9moW78udo1dQT^^aj
zPWJ5mBx%8!h)mbViG1+Q$sU$^{wCa~Y<<Z(lnR=X7FlxSWD;({t|4p5xBx=+KFu9D
z2GqKx{!r}aQ9nXJZG6DpHXc?>I<XU_%h{6))c)*tBQMkO0Bh6V$$-1bc;}PThe98g
zmPvH2BG*~kGeknBpj2g`8ol&~j1;|NmtZU`9Cx)Ga(a|3)rc77+DEh#W#9v2oMa4F
z&&78mjEL`!&%XW~>YbGgTO7W6INUo|lNbE>6yLqS(nU$RE09y8E<eDLsbpMm7N7-$
z=S2sE;B90q^k-Y-7>fyW@&f0Vm1pSae}gtUKfNXyX#z&i;0yBAb~+{|p0jov=olEE
zU-%Vfljc#X$!JU&cypfvzGaarh&eoY-wb+R2zJh^(S0*8Wzi{;&-mO&YukRLZTK_n
zMTa<r<^c?!Pgg_fA2jp0mtIujhm-hs6UOjlS`UeVx2~fgWP0`+-Sc<0B~Rlt217=C
zFiI*HN9c4u;}%S(#Nyi)><kI;zYX#qV(~QPj#9LrRiqt876tXjI{$t{o$?3cDbwce
zc^l;h+z_lAN37U#lHmG5yD^j>!k1-y2Vb1TzBmcLc(Mq-#&k`fcbR(3QlG at JnLf7~
zB`xuLwSMNY!>-z+{+LKR)m%nde7>xlaJ}3zfzcb)s1Xg<{~hJ}zkkf6&W^kRcekpu
zVVqsbd${VBYmo0Btd9Rmj@*C8X}zdTh|A&j=QlyGCL(|S!B~10T0Jqv7oGH~^0gcW
zkMTSf=Kjtcf|4NvQg>G_<KBIahGW=@cmQQgt-xtr*$14J0z3O2^kja#qy;Fm7vE-Q
zszYGZe1ouThz`qomg{@e^ui6W>;}7vlY4XtQ*()$!JtRt^0_FNl*5^r{V!6zBU}=>
z{gt_BMJ`Fi3_mOUB#dLl>?S^Br>JuOJUus1=o&_phSmQg_<aJuK6w70q%Gnm*a?6?
z*x5xnV31rX%lhP?^&_OB9(#6{Vea65kt%uSl at H)*d<mTZ&?!ev*&;v1qUjK>8gMV;
zI)DecbE#D8v_VVt`;B9oTnvNDqlhMYIidh<!?y`bf!I1MILSJ*hinh&RR3tA5QkYI
z{_Rt<*R90!EcQOp?@4k6Xw|vJT|Sy1Zq{jx+Wh+YK`7H~R#tG^Lk1raz6Ppo1JL*N
zL2=az4ybKKYBpmjWrbn;Qb?J~L+wDJIajPRr|6=S%z_$cf7{ihMcv_^A=g{f0hK5O
zM*$zOJv99Au&L9 at _NnvNtwo$M)w*uASmB at 9Ixc)~WKQv<lhLAO&y61RpSn9)oAr9z
z#bSQl+W$xOtp0ydPf^BmqyK-`L%NJTylPBRF^VT~_L at F+J!AiE<OCSG`ft;ziD9Yn
zf7dZJhtwx64Tr&MwPFiI!g1IFXjOfx74Md+kE?&azBkDG(N3JzE$^b&UetaL32xp)
z5>K!h{R7kc>16j-y#MqH{LbqZc1#-TWRYZ(R{E>|H`7D`8cUrQNk74>LdrTaDeY#E
z@!cALj2<$LnvmX!r88S688{UQIMFEs!#qSh#VE8Hx}+0!!Q2ZQuOF8NpirqCwRp>k
zc|iqvJ^UNsh-OYLaM1dBDtF<jjvqy9(A#DBZ_!Ofuaw%crG`2`vv at SrMxR7a2Zowx
zEqaD9s8KcC-kTQr at g-|-Wwg3CJyQDm-I1ZaRnf=8_fjK_Tl0k>WFeK8Ev8(@B)?pb
z)T=|dQj~uC2gQ^AN;;Oo_A6l=q}Muu*;CqD$6cueUQM5gp*Ry!|Biyil3(eVP-AIm
z(_0*Fmld?vhK+r@^5PhBu?FD&8kn!Is1<5<_5bXmnKpGysxhTXKzrYg*1#U!UUPi$
zi+)A3LP}ZDnCC`!%H1NYztzmLTM at Tndt|S5Lz1)ojc%916T=Uq{$$!?(Mpz!SpCte
zWZF|vHF;MRtp<t~`v2Fp7tDGaFhV4EtNRIU(Nfh)s%6{L)J%IWn$Z)GxYs{($F0!v
z`^3d06H5IZfKW!qWGojoKV`3#qBXu9Vx(HelX3A6Tq-wkk760gf)X*z{gl0-?I{Uz
zqCIJ6)Y5DDV>|PGeH^1j`zQG4(&IqMd^{-09v6<F-dVWCC-Gvy5FCc5*q(v4Q<VV8
zfqMhoPjnKQQ|d%3JOdtDD|@#kwxqnTh#zn14Y%9YayjU64bMioO!WQ)lx2V)1N?Aq
zN;;rwmn$z<VFaRig#6mQmcQLwp-a{SM^B~$#X98^OX~(|Y at Xd*Nvr6Ko`IvEC*|i~
zh1)L(uogz16S{?GM}+j#kOh6bDEUX7%Z0Q>kS3!<UvzRK&iT8AP5FZ<i#hZa7=Sbb
zU;z=&<!w&?@Z at y_=CR$vjl`2ro83Q3x7Xlo`bi=;6!8<WTPM6@>B{YvfO5;go$$Mt
zLMF|EJMDLSJc+(n5qE$6SGFRe)(tB8>6OGA0HqMKP6lZCVElz7W?c&y>aL{{EyMGS
zQ{^tjIFp at c$Vmy4!?l(ux);%;q->;WMEMv{d#KIuPsDzDO~oTm&2z~{XX at -@FvX>x
zeTZvy`#VT;80X>H2cuXD(f35^1cjAxKpF21wP4C(UH1>;8zv%5%6b$})o|u8>PTw#
z2qi|p!d8^uH<249-T^ad6b&Q|>D-=S{Wcx?R(3mWq+++Hv`jMx(t-v;fEN*iDebF|
zRfY0+LZY&BJ+)ktH`VI?576dalBsRq(~^T);g<$aneda~K6~G0xPy`DtJ39mNeu}s
z%lIB4y6-M23+R_Dk_Nv__(|}~-ghVbW4U{o1?JfXMt^-VOh5Hi=V|8lS%X?C0 at Zx0
zdGl2M7t7VdfW-y19r~Iz_&z<UJ7q+PjZ#iVp=AW}VcgCC<d2VqeNoO$VgENH{}w;z
zTg};YOn__Xxjn4U1o>-51wI!N;d^I8L53mZ>!s~fYtWFcY-mOdc4`b#5MAecG6wnj
zdAcVFW>*imC6qRJ;x><Q>K at h3_~<8?^-J4=9P(IlS1w7Ov~H;{23qJrZIlaubDPC2
z5sj8yEr^v~ofaDzV$ZI8Lat7X&AvK5mUlJZEjdW!Fz{WIS&58fi4n1ktHbaerqYtC
zM94N+){1v-nb64Ls>D?Rb6`%lERm{2?CZ#3{YfUVOR8CwV{23k#v0npckv7Q$ZGuy
zSSt1}{T}OyeS)Qu=^x?!0+P5G`#V4`bL at 82LdVZTZy#oE0_$lxzXi)SycN0qm=#+U
zdpl;2{UvfclzKBXfx2U_v%1|FW+=9w)$NYl9(x6!^{3D%Y*F{PWE*ae?Mk)`azJ|;
z*vQ;YOJZBtI6x}g*Qy5Sk)T_Z?OK5A7HQBe=_f>#u>uv5eH$6b^pLtL=EVo#&90{g
zB`}h%nYwE|Pz_|)ZwNdA2mY`o^iK}){e`%mc74Z{qou~-4*foIIOa{>-5$F=`5yZ<
zhe_=c17E9lX3KL0=!$%mi!sPO^_F!j5qfW4j&fa;NG&U%Tx=84%Hj6Sc7V!Rk$Ylw
zj1EbyVF_E at FakA|pZg_#NmW=&B>f&*l9s%?J!VY4hn7HY-E%_Q31d>`I4WdF-i-!M
zk<?#84N2YW0&<Q6yBXxX7jWtdD`C*mhEfX{+ndls&U5XagtCr6D)wVDw|TiPM^qix
z^(7x5 at 4}@kGQE5H1N%`AW8iKVAr&3Dd%ni!tifm8FN0hNt5GGJm!l3U*5gTBJ>elw
z2U1)E at KaehN}KJGdtkRotY-n#$)s(ke|XN&lZ94qr)R(&(2hJgJtvOdKgj7Hx`~yX
zcHmPEIb96z%}fS89Hq>shhzFsa at vgN9A|D}cD&IzWt=Sfp~92BXYm<!zCc;r!o*UP
zi%F8`z-zX|kHq&eYch8gg9blM)=`(dKCfT<=coDubZ2*)$j1H$xL&T^tET$-T^*ai
zo9}AFzp<eP>|BU27*>g$`>v8@=zP|^KqMxXa|)h3FbFwCpU=}w*G at cAJn}u8OBS03
z at lh(}<&OEfrw^_$JZGRR`EC-tbBOyGc2gLwQD+_h*=;?>&x(6Y{q1TGaPjY`pN0hW
zJ++I$zb#Cnur<Y-pL!I1e$!QGsr)}@(5JetxmQhQ-m`<uEFU57edW~}FQ4e%d;hDR
zDtge|n){aZ?X;Q8cghFSTSb&SOwI20PPI>~>9Q+VYWS$%7vpRI*@1fc#YVuvA3KT2
z)p6b^$zFDa`n%KhvuHeTi%w6DVP=Y|fl(`JGkK$wvb=n~70)?T4Yd(y7iuHux{o{7
z2A+J!y1NwdX(1WGJgGS=D2Jy9zSS*XF~5Ec#~Wmw=BRlVX^!{SyA+;$qeEekVSJal
zWZse*@xhcdosKZbVc>uu#ldIlR0L{(c at iH#0pI-OhI$kzHT;HpFl8iC5)4;%Yx?eW
zckD{ih2v3r&OFK7@^7AGth%=tI-dFN7eW@*?jyVrS2k+TP~8e(xe(Po@`&@U^Cy#t
z4^MG<r*<a&$+QEPH=4yM0q%j+3FsA~ELsILzc=amDVpN<PMxOrT@(iSy>{67iq`?q
z<;V*qK1npU8P1JY$`6f(St}{!5?6o{7TbCB+QPJ1ai0LLXH-GH&w{xAKWJ>4_1u~n
zN}ExOTQsO>D~l3hc3Or$DWhDHR?iAtI++m}A}%3Q!rlMSHE8E)7M%u(`&BXS$7oBG
zgY_bRLv_PAj!Qzlx_SrhIwfa^Qrp&KMV)uHi_q8HGs(3#rIb)>a!pP_en_WW*jw1O
zkmF{^fi|9(5gx|M&@UVGqf^&BQja9**t%$Cv<f3V_ItlpuJ}>Agc at BknZfSnC$(uG
z?U?Nq$V6`rnc~eOj^_6L2+tICrJ7FXx)kx*roN^NO&6OkHC?WH{LPJT*4RX9f;GH@
zTJ$yj_`a8}gma-xZTO%29zy*wS7zeGz6y2xD~?wx_I*!!kziZVW7)4 at 7L!!AK|zZa
zsT<Fhy at KR|x_%5a`99nqr^{RlXA0*+UH4??m<z-IlyW3L{5HU^5`MHlAO4T16XE|I
z_?=X9;lB#<FH_gR-Fo=_27bSV-zoUL2fx$sd*7AyctDyi1>tvM(c#Rd)*^Kkl)4*6
zucUvo8iw?0$oICo(j~pUS`wsR!|yREPkL0EEgggVcj0;*u78D`>Oo9_e!#y|s*sLC
zz7n{vL!DQYiy0>#JbCc1 at aBBSZ212d!(Iw)E1th at ojQfC#HfVwB5Ldm^jP-zT4p<C
zT0wawYrQpOL>-;1DB6RB_p9ZRvR52<CZcM7C8Y`PAMd7cry3M8n_Ax;MbJ)n`0mG~
zg;XrPL&;HWBNQc1CZeQHqE=#;4m7uU61B4<zuTN&Ki|1cCADp+Ee~t(EVabj`fu4L
zpoS%`GhV6`2Qu_?&$ts~HiZK!@s~tKE#S$z$o-sV7#6u7_SerN_v@>!T7f-Xcq|7}
z3HJ+C3uY*`okS6%gb-;xDX&}k`^O2Xdv}x8 at TbWAL@~T~gjZ`-Qo2qlWspj#83XLZ
zDV0Q~qSYNnT-p9q<bGK)X33c}Q;}6`r*e_&79t;ogl$|n;1$$Sg(5q5G at uvTP^Ql;
zjD@@OnjRw5`4wA~)M&q-At`mILRsvoM~>E=l7+f=<OgVGP3G at sbc%{nG#YbkERw~#
zQ>v^GSqMJ^>lEM(@S_V!LA77!VhoC}koyk$N~}>xmUJX!^o<aPvioC at V<BM0`;{#5
zu6L}=s%{mFqPtMaGQ5X!Ae=p*VS>P0-aT+Aaw2lS-!2nlmUkRAHarvYz?xa<6l?O8
zx)B`4o=6-~@@np^e at 0nh{&4XMvQiOu46A28P0`y*WRx}rM%v32rrP#TTjYL#bQ?8E
zC52f$@08*exLRvDUt0H7hSwGX4Tl=@M3jXu+DG$>se4%;q1^&qi5lmG^0MilV!7}+
zPfVZmzcMhz$=NElZ66rp<VRFEx%3K@;9{SM-O$<2*Wj6+>~aV(r<9(wX0BFT-po#V
z*ja9?C at guL7juNDvv0k{Tal^lzO823xoI^|+aT?w+ujx5mCluPXFR(JOE?|2igUS2
zb`fW at S4C}ERlV^5rm4in!83=?@e=(k$e_3!nVtSIPMVGy^D$K$IN~1<cv;PCn$t;E
zUhp?Oc<v@$x6q(;n_5;Y1+ib%EZ_9A5dZ97#RTQ*KdO14usDNXyqH=Sqc`e;xTWS_
zwQcSwl(|x^IJc))G+gzqwsyEAXj at dQI4&sbc3!dls;Y+`ajk{4 at -Y<vKlZe&KWO at k
zxhC&io^tCpa&Y6Dn@)-+GofEYlKoP!Uz;AV<qCbaTZ9YoHm5QMd&R>ukIzWY!fe`M
z_R9HM99=y7hqd$rSVN1M_JzYgGhC~1bokEw3P<kJcT1scMY~brw68~<p$fLbW;0*4
z0rXmSsVX?5ZF>7HhYRRozY{$hc?RCP`hPfk7x<{EdtZF*$2>Dhb{;@LBs&j6K!os;
z5o6dh86ZIn14N}$tP#+v^?{A3?eUg1nH?B#z=$}(N^uaJ&|W*Fy$Dp>e|G}fV6Eb5
z_bGj(#n3ZOW<2NY2|-30Gxzt~GYRw@&%O8a|IBC4UVE*z*Ymf2zwdADwSFtfc!4&T
zebil#Ur<(5Y1|2;JWFG`<;GFPtnq~gLOy54=ce+)E6(PGmrKR6<nx}YdVBtU_Yu2a
zeDm4t%oDD7J+0dkKizv{)Ec{Cxn^0v{)$(Me=A<qpKr}8E}kNaRic<#iF<<WKNxHX
zl&ePguT(kszv)D|Zgpm<equT3WJBJhPgyv&1G-(p^MkM#yfd6H^R0ZbFXk3t+!t+U
zd&;`D)AHk`-99hJo!JqCR`})qI)MtOq)q!JjVtE(nP|!S%Lj1<G>kKAq7g=xK^i5-
z7+1*eh`|_lB3>wbg7R<~G at s7j{+xJB03YlR;8etLA+w*<AoWeL8>XPeyw$ks&wCp_
zfk at 8Djy&TYW^9yUNa8;Dx5}j3>7Gli-Dp=~9=*`Skso6$C<zZ-cH4j$Gwm9CZ=1>|
z9xL3!Zp+3nK#cD}3~m>b#ikhRdwAD4zyY`aV;Gd_b|{O$eorsawyUfB%)UG0JAqSl
zFt-oPjG3S(nZ#qo0#l1Q6?ZVT_Vy|4*tl{QKWD-3onLB+`(7%QXvN=jZeCY6`CQ3P
zQICH+XaQ+=p5TJ_to^I|=4RFhdF_eEq-ng!iwtE2f4x0#3Om~D)Sj~p%#9Ug<J^wp
zBGCq6)=Z0`e}KXEQZ2gAu5q7TXya4Q{q}6l>h!*t*vC^*cA`B3)cU%6C~Zvp{{Won
z0-){Q5l6e|l at gE1B1oghsHG53S}CPW{1q5uO92Zlg}z`>4vv0{Dt(Ka4wK0TZjCRK
z2)`J|p58W(!RT9}w_^au9hnrsQ*IVR&wvl~%2+>a1NT_ZeNX>_r}qGAbR)Bo=Fn$7
z0E$E-&PCyxgDm%?864U!d8(NeE)h7Uekv}lC(H}~GA4CE+LUDFiXY+`{fr2bRGp1$
zaQzHQRkhS3a+SLOhpNbzaWVHieu}+j59 at b$>}+u+7RaZ~yBPTQ`kCymv5$hJhuvcX
z{l_3O!ZxIz4hC21kZrir(A`0pq*r>17L8Gc#`rB4F2wGR|6VGhlQ5Ma19g2&=Uol@
zh<FTocnOXfXfr}51$rco{2r*{Fexewv4PH?AWi6Pd|xrc+=frmv=Zq*jUNavWZ0eU
z<fQJVW;!dw3r9ZCsbNX{Pl-Q4+MCFvu{N}eZ7jyiaKe#)M;qws(Q(dd0=f|lQ^5V}
zv2`d4+A-txIl0vWX}^GWA4mU&((KC`oddjq`uM^AG1-dp##v!&#g*mmvi$Qhi4>}w
z at MQiUac8ws{eQMGr_<EaxGDiLp+Sbx#Jfb}9sR2zr!D{Bw+ghh&_DRNAr?pO#T;BM
zT&!Pol9Fq- at fd%;RQ7X=RK{X1BJ&Ki(H3T_yNGUvv6jE9Je$@`NUO&9Q2*U}O`nh%
zb?z>Qi`l^qu!Dy9pQJMW9>5^j3xCvYyAi#upTYOOzXA};W{DhF3 at Lo~``^i=2r1$I
z-<5j2tp|SMWTv)e>3?g67h$`i%pOCB^nz|9js at gXNNR)+_D}ZLcXkBXZbzaqI3H0E
zaOY!`1^g!I{Z^a7H-EM3c}Vmu(gXV%<$xX>sr*DUK11)2B at 8d>ah%!FQtu>{4?7Dg
zTjdtI(w82OX~vlH1v at v5r7IKnVJt+}z^A!s*1#v8e~Jz3>u>6 at v}2U7m)Z=M1uiRG
zIo?^W7P76Kp&O`W$d_#EcY$mrwST~~4V0N0L!aw1xd>3qeA3FV at x}gH>IpH^dJJyn
zg>!Ptn>`ptH)1I6=HnS(yxk!YVUm+4l at cXI$OHT=j&<iI!es66XQ=;?F-e3}jW}E3
z_I#k at X<|5Y*J+ZL@(2?oS{oo{v*y+P-<4jTO3+{6JG|Y?^mYbWC>f at Tg@Sn*pk6Pu
z{=`J19{Y5+OHYG^SaWF(#5Ch~)2oN22 at s$7>#4EZm1xw^UTI;XaXBHw7{@KLl9Tu!
zmKIHIaZ2LDz!@#hX1>))%nui@@qJP3 at TKTsrzk$G=i+rP<Xel&eIv#5eP80qnuPE8
zAjwLP6UHwFt(`yByih(O3c}`9MZ`!=x&_QXxjBE0y`8c6<G8L%*wnFE;5r^0IXyz+
z|AJqy;y<90tbA-<F7RjE!t;{c`v=hE!}s8hy$lT)tAj)q=|=mS?L=}Ou$(FAeC99t
zT?GUDpslNLfDT$RdYdHhl1L~AdRSS&<tZs1ygF at +-}rmPOTu&em<#za4z#`JfNxZc
zh3)qPj@~9yVIJtK^Mq~g8elj_QbxFsrZ{&E%S$zZmL-mTqAv|kMoEAtX`hI;riEX?
zbw10XKlBKUDWgFY7clL*1a*7uW4iPCJMsGzNRCi{y^Gl%%8tDyS^OxDjf;Pvd{LKR
zJN5rv&<~<v;{N%dcWe+u;lqq{%j|^Hd~nCzjd*gZzN-<Q&A96kEluF=#?0QiAURQ*
z<TY-{Ah&edJGV5F2R_ZvX<u1}KKpJQ<7OZI%_W*kabD^le8m2hAayomIL7vZaU27Z
zW#sUfuG2SZ{GBuKP7~mc(u~YOU%*J`>t;eojd at M~-D+WmZ~W!cjP#X9WpZ$ryC(fP
zQ1O$>pAjd^9QGO1iqIb5G*#I*%Cog^%hukPt-btzs6D5#L;QH{AJPmXhY7)bOJiJ*
z_P9g*l;|1z<{ypY<G^OSX+O#ARpV{N#ri6RzpCbp#R`@G5?B8JWEDqvs;C$B6Uch7
z-LPd9L)J#bNAFp(Jiw5(kolhe^^MU((K6XGnXLJUPSsCqfiaD|3oe_GPX#<LTUKhx
zrxyx!tDILQ+?}MiXUpgQ;?0x+Je=EKk0HA67H}IAQ^rtv6U%UryU5t}^Klt-jlIar
zWF+)*x42rWv4JeYz0AnF`L$k$RPS$b65GSh!a!>=%bP)774jCHYfC`ePNv>n2IHY(
zES9bHcw6XWKOLa^bNu;73#jo#TVwhP&0_f}$glVo#_r|- at nlvb=VeiIE>OfCK*okF
zHrtbUOdmghB>|&Q2w9;&i{2gC(Khk at Nx16TB{H*%D=DK+v{!zg^$4u7$K<ME*Q-WX
z4Ko{cWG?2fR}B~nrCkqqw4J=#UN at Ox%h;WOd*@8H=yIxz-L-#oLy|0z9Z~^rBV`@u
z2f5LER1TgBg at TUr`bZTE3)o%VF1xs&xC!@ZuO(Fg{A2Uz21(m}Wngv8nzG=$z-Y51
z_!oD}_JR^KU{!%%>`Q0jy;27pWN|ky6biqvOC?0&_KWNm^D-U1`p59g=w?Xo^9%nm
zSgFhSJ)@P9mW$6*-9^xI^9+o{l(Z}t$uQJP;sxF^dVnXq8KvXiPtID-asw9zjXLN4
z5Uq>LVz<FAl$e)O7-6#EsGEOczve|*kXY<KLbkY{+SVs4TAK};95BugbzYO!cPT=9
zj}~K{B++~iwESse*cQNc+?DCqi9^0bqiEQ+r+c}st>v)yQQHuAp5Jq*5L~@E_Poi=
z02?!D3`@-QNYiQ#xr>lymget0a?YUWJ1VX`j%N+Anz=?#V>Puo3IDKDtbJHxeW#sH
z@^Jm9a;uZAeb_l^U#ojT`rL{72^Z6sk4`;$?@wRzG;os-eMd?c8wZW6?vwJ4n+Bwq
z73$0p-F^_xZGZl>x)59ysX59*b%v*bo&OVqy<Q+66lLEO;Z4KwZw}NC-oUR*e>rey
z(D;Xmd{KG?=&vwCk%Sm4fg&G6?c!`fHr<t&D)0iMTn<ma#B<!x_2uv5Z|&m+(9bny
zw<Ev?Vw%^}!WiV9hIIN);A-#U%7WA at RDs(6KD`4t3X|TUTd{p6z2n0QeQfBQ@?0&@
zapM?{16{YpaN+*}!EQzLjJ)N`xAmC@;yy-;<4GtHqf-XO-Gg{SI+*~dWfp#M`|=HZ
zR(RxCUzEoG4QSy<$g94XJaSs+6+0A5_Ph5%*OqvT*Q6R;TejA?yxT+9OEvt~p?PsN
zHB!|I#qg#+L$M<1^NNkcJ~hcHOV8Hfx3X6_#OQo8o$b!E)|^{{cH90wgwM$=cl!9Y
zB>S=Co at TB2xJmc1%VqWnxN1??QJ3hn38U@$89kkkh;0G4z)u+)Q}zNQdzQr>`_h`7
z4LR9>cJec$gfM61F^#ZY{l$QJ at O@}S$}9oB*5(r8_W>0E5{$Qu)p1-Knb>|oEf_Ej
z{xm})#arMV7X9_owjXrJWFV8W=C!M at jhqH~<M3ACmm9C++Nm+of~Fy+6Xea;)?aBm
zmk8s0OgV9q$4MU<CJULB%+t*4%v5eYq;{1Fu_xFVYv$tj$YOs3btJyoUy&^jMF|Z2
z{>cWy%=wD&w$!<=@b#wNz1|nyAU8h=67-Q;DXvc8Aa)kdc6R&U4?4vPedhi-_a<4N
zX at OjCp(f}7M4;fZPng0&De}isrt#2{Oxp0IP)F#t{)%fT4X~Lv)ixgY{m}eO>Eic5
z`QFa7RA|9<ey6g23&(5mv((0~sN09Bd;XhL&;4Vn;PY|H@!!Nv|6^RB0h+q$zlnSL
zD at uFjzm)dfRL*}cEm9whu9yCEU+8%#nLZeQz5vhswP!DZXT!B;%?r=Q{)*-zx~;Q&
z3{S5YD76<%F-!NCNQqY>3j`lwBHz|g8)(>ou9`FRm7OX71w?v)*q_6afnG)0a0bW?
z_wT?cI<GGMiqh{;7k-7WKa&EC*GFJ{uhgFyc={GR)vGs*kHJa*wfDA9S989?w*c+i
zL8;%6If17fXn`v)1%SsrNzL(lK+4Pj#I%a`T>Cm2|E%dS`2bf1(Uqb3bk-Q+>#y)y
z^jTxdw`x22&47;N{Bxw37?Zmj)0f07erZZHqF?cA)T&v|8f0hpZ>d)`$YpdTxOO$B
zw>=U6AIPuVhxsX9QL`kb=n|u*ohGe&?zam+Voxj;OX;elS8I!ZlZL4YIQte{1u<;t
zpP96deH+4<osOnLa$cA9l?LD)WH`vUg*M4q#y`9^#7O&}1t~d0dqLt$TBLm?B)JDM
z03rb5>iETyd|AX0 at XG~1o7R@}WuCb&c*3PFzc}16wCmFIiDpgC#$$%8JX*8P0l#)>
zGx%{l&lmBAAuIYVcbm)kjou~Nb~@`){;;6sLD~2BS6wbhTKtAiFMUYYpKEAq;xSP&
z7HGL*bBEV&27T~Ds5NNDns<MlzB;wlyJT$<Bf<N9{5)U0e}>xVIm)aY>tP&4i617`
zd!_g{>u!DL18k)RxxbQ%o!({xNk at w_>r$H+k#w*zW*wtyyCaWC>{LsidH=1D_GkLa
z*O}@Kos0M1itaN;kHnbk8qaN3jqv}F%EAAmQkhNa`sc1SC(>dW;fB2M=1Biczfmob
zL!P7Tq{INu?IGSpjLdIhmQWL(r}A;7IIsP*=ro)W*S5dgU)AZ*Y>FXi`>|7BIr{#H
z<L)hl#T9>hJ^>mX4sL<}N4k4bl^|a^CAaP-60$Q>*d(JEoWj&rNjQ=VV^TkllOMzr
z4rQe-hlCK#f9 at 5Ypd2E5Jmn5k!ISPDc?VA^)OTtSeIG##cMHl)3U`P>Oe$fl^)KKl
zerUN6QtQrqvGx09N8PQzeKcN<e(^um&HU}7fK5Nd8KTU&3Q2E>^KJi`HT2VWER7^k
zbSg*T8p-ZoLh7&jwx6=ST_Cr}b8%Hsu!B++xJIy}Yazs(3Zc1h7tr2upbf4Cy2}gK
zE$G_4|Cct;vrGY`E}Y84aJc8geKD?>4%{BbRF=AnNO5QZx<ZTK-=VMPLz{Saz~#|P
z33{fF{w((tl<)cDd=be_G-X{-YJB(kgXrcfh=pH3a?xk^)1mp`X8}Jb<MW60beQ83
z*0*<h?d%_{aZ98!bWxZ`<{jVcUPHta4}|`9bTD-KXgqZ0Xd>jTE1Ua9=#APrtExg_
z_ at 4o-{s^wxdOnri4Rb=@0sdyDSHOR`lfK8}+OpjiT%DlYrk_fVR$bh*2W_$SS>&>-
zCR}gv+vob7 at x3F8y!kz&+yc4{4}Ie1U!t5#AZ|BLOUQIGL#Bz>J~YU-VxC%b3wAtc
zewJF>57y8sLI|FH^e%*1ud~yp;MX4g^c}QExe(*_*W-VN8Up(F``<n5lDKDaeG7)j
z;?Wg?Kx*6~v_bjNHAmMTT?fzeAeCiH-{0!`8F5QgJihtT_RuGnc7z5(n=bj2I{_<x
zn+~)~F2dKwMX%T=Ue)bC<7rpF4TV<sJ5Lb;sUFz5L8F at mk<`d#gQjflFZ4UrwRJOp
zw*ipu at B8nL?^W;ol at ZUDbA^aoW!qi+X3EJ at V#Fozwe%6%mUzwWBb6U<R~eOucm|op
z)44U%iBiq1c{PjH2C|@t*xeOmwtE58rJgijHflaizS8dIa7TQg^%M!2ih*TQ3%`lj
zpv5flnxBzSet<cepSU6Z9T#DS`^%a(rT3pAKiol$DyM%rdv`=srXD)YZ=wR=`J(qM
zo`={HcM;u(Co8A7=yn0V;pV6dvF7MGHAkPJ<zz)Q;_0lA%DTkO)R at _kvug$J!bQAI
zCDjbiOFd>DcN2?xYK<9t<yQ+cJCS}DsGIydw6?6D6d&TCJtdDYpZAp1n%soA8bOR^
zzg-iw1P;_y*zf3H2XCJ0cOICBVW<&Qzd#kmG at j~t-Li6K2Y-V;pO&#$S`WQ=E!Kz%
z5{BH+XC3oVOR^<79pbLVQ|;<yLWzm+^vNhccrEsNQcRzOe*TnyissPL%t>SJ!*mM$
zt4u%#VS&OKNl?s^u#*Qj+3gy=hfLp=mW1bddl73z%|m9?gu8;4%Ot!u{Bb7sZa#eO
zm73A}!oLmhlJEk5bYsBfF$+l=T~e`+&(tUW|1GHqkoXU2HELMZmDg&oK9$O$)i_^S
z&C6xzulw!;-C!?J#G^9QZ^ViGfBo9+Z&D?6(}~j1Y|R_G8Q1Ta%eA&EK7OBf$?*pc
z&BRqu>hVL5^v}$!fzrQlRiWj~<c at vGpIE#7!6*HoiTO9<X|oRpfjfT=l6=C6Qur^_
zyzoC!YfB8ky-4$+yaCrFO=g!;0d(SG(5(xAvdl at 4it1<mRc|hVTyBH at 4!>_XxHIY;
z<UA$3;31Ym)#j;YO`a0Y;xQXds>M^yp$*01J=P6`uo=6W(djX>UnGQ9Df}Kr!2Q7J
z$NNP=L^n`ZxuBn3O)B7S2`$U)5W~}@X+53<q}$z);-hScSXmd{P&ef*dviG{>0O*y
zNAGtoGPj0*5DfO#pgr^6n at J^o8_H-PHKhL6hE%Snn&DDbw6IPOIq$NylC{+0S+8rC
z53x0*s(Bu at HO(g*G5+biXubZX3w$<s*0WrSgBoJoyAtc16CkJEdU_ma_UL<O^E|?N
z?3@)+D*LrDoUhcQjq?#DxTlu~^{lL?4(RcCbk3mBBjlOu9@!THWbnw#)qo5hc^P^P
z#?Az!gnyaZ at 4PwzX$5UpvXyiLSxDceyC9^72=wEzP<Vcb6j3Lsp!H+{b&-0yEMu`8
z?WODgmH7X%g8%zMBTDEr+G-{RP>Q)RYwcA3Ee{IR>=BGja|*@JdRDRpbVKm*U}Mj+
z5rQ`3<4)S^+$gt(w+6ovZ0K3aN at P}ZA=FafjJP}4BQW{RPGa*&HY>z!b2{Z#0PWz<
za=`s1;&PUEv>xdQ9_$6aLDoZ0ZP~kHuj>ONnMdCqsE at G$hqHiZf(<Nz)+fZKSRqY|
zr-ZfESziofc1P7&_b$xvm^p>tYGFl?xE!9#0q^J*oRmrZYmp9|1*A2c8>|WvB at bxK
zqFZV+v*tSM3r8`PjzD&&Gw3xTo7dqjrxz2f!X-LX8|pQQd%?Y3HR^7UVn}%H(llJb
zNYRdal#OxxGQyv^AuL`LW5(TOa=z0=TU9pjf_oE@!^7dSuKy(;lGX-nd-?Fj;3T?2
za_(p2C(%C3FxqG7!Fk`Vud!RGwRtVwa_ITrOoWt=NAsJ8$RFa)_~Y>(9g%{onu^Fj
zhnK;<kbD?6hCPzT=c!9P>xGg`90+Ubv4l+!LioHOuW;?3q-JMRx<rnLr$m`lrDwgk
zShrbDo%Q}!Ds at fooY>?fZ-l3K%pzJwI(g6$t$_FkJ;aFgyC1KpIc5PGb4nV`ZN5So
z at Y@#^Vm$cOtA=Pv%m6M|aFVKR(1-}-{vYtXOig*#OKU0XE%Um(TmpAh=p}tm2)lq*
zz6E*=bQaL)N}yyv$fy#uZKgg5HTg!**U3}a&>7?5X2tDZwk;i%W2 at MOpgCzUOt1K!
zwXf(P(vUtUZWc;{AE`DRv3obFX1Lev-K_F(SN1;WvBQW=r=RxN89q9w&j0nyXiS~!
zS?{h&tcySH<ovB+L$FGj1_<2>qxS}u(A$vu_OdFE?qEL94d^Fya`2WWF1;37)T-tK
zJ$>27gWIfH+ApZ4{<Y2u+ImEAYJ3jOA5r#_5htF3eu4#l)eCLG`DCa|*9l{vRX-iT
z2`&S=z6_l(9yd0UsYm;4$Rkb|$HzX%+uv9BJC7Tc`C%e}_&aWlJG&ghH-L#&QY*A7
zXpjN3)&^}#P(OJ!Ho$bIVpEPU4+{eqVx|MP%5&*PXAR$~a_)H~f0)%6I<u?nvJY)T
z?si<}l#9amfD(I0ddK<5nM|(Ww?gwDAzB->f>ql-v~$Rq^g^D__&&6)oZOLQ4#{qj
z%Hd{4A!rX-O!~CvlcsPD&Zbi)z@#=qzO86)Qpwji+1s^F0uG at u;kz$!XrUc#&c{!x
ztj21)v>aS%15~utt$&qF8u65Lt-bEMZ`q-Bx6sy5ZFYoO!Ic at G25{-4Gik857+Jtp
z`G0TH<o5j3w3sn|m`0sjL>QG<_!Qvf(MF{XO46Wl?T#cP8Hh~^5g~kQ>UgRmelp2I
zsh2>WMv13FlYuM<*IX2R>6kfw7+Mih;#+;`Y<<j0=F6gC1D+Z`I!(DT$v`SEhQAw}
zG-SBMNy`M*m(HX(n4h%5f1a9yR$t<uLHdTK!|9)@+=P#)!PP<1Lq;4QslBn>4WopG
zF&M;_gB+JTMZT4?swwOLD%Or{A!c{pwseqaGBsw~qcCX%uJ<G0dLi2S)!Zw|kGD^r
z7LbpnfNLGN)w|poDhAr%k5OBy>hf-&#*>$G6$x5t1+)?at;9nsQ6i+uQq#xVXe%)W
zmp}_Ggr2?tEu_;Krlr%_;Y|C`<@AwZ9$V<k-O98i6aP0N(H(oi2hkR^6b~)sx~`>c
z&{E8xMYX#5ZRvypxfq&!=^wkcjI~jGU($3)M(Tn*OH?*hpqb>k0fvV0bdjrhNu#!-
zZkJ9il(y~`)alU1JihNsyVsF?^*^A`v1d!6XQkL8w}D_g>u=KsvSmJSc^8y;;bm)I
zwPxCbU&nVScJewkc#ftA)J0m(sys3eDfBLdq>r1M-yqw at sPedZj4Hw9Q9cBj(eiCp
zeP7S}9JJ}gB!{OI at HU{AnWP0<BRDDi2;FdrOWzVdsTlS4<v{C5YZg*UizD?zMz{-+
zWkQIMxU)bZjL<>YV`s26<T6hPkUd&Aw##TAub%d5zGR!18}_mywKlCI--6a^iJ1>f
zhI&4Te1LM$Lr6y*B-^G}n1I>4e3?R~X|iX38o7T+9|1g>935!hN4Ej(b?*6u8aq>C
zH3iDc))ZVGg@>Akrm^w2Ko*+x(efi~Q^@Hql8^XfRfrgox2+0Exf(BOg#X5s^gDyb
z at J!&eTR?aFrp6^%x{^LXcU*37OpiR(clTvOc+RR0;&D&gmcC1&>D9fY*(<8YG~A=u
zbX~p1#>rT{EE at A#&;O;gEz`z%g?ubK-lyYuN3P-9Ua#P&FaY)F<yuak%a*IU&zc>_
z2Z`}Aj^vA~S<8byAzJ=11<|^emv}{>_#BaNy(8!`WnPIDs1<mr7tg{0`fQ=CfdBlV
zg~_(MDKA$K$(P#c-&PU22%eP8eP0Og3D!%LT#(QrNSyf|qNB at aWoz9dPhU_Mh89B2
z#zJRgLm!oG5L&HHhft4le>QX~NU{6myt+rWy44cdRQJd;&#J{T5BHcV=+E7%O}4<j
zMm5Vhkb+<3<y?rb;3x<%5=UAzUwi)X<swH6VfO_lW(+XCwt59PEVrhI;FsZ<^trBu
zjp at Jd>oaOxpl?;nwzw)DH=Zzsk4Juv??rBhe`BOBX~4UmN%D|Rg1~qp(+G>>;SwuT
z;0R2Q5qQF1RIZ(X2F_43w4~#Z?E?<lxaZgG`*u7-IeY<dqcPx+pKv;CI{FedY6~9*
z>QV-cQkl87`9+deSwMH6K>Tu2Ln}0I>IJVvXJ`yyWiucR3)w{TQtg1AZyJ~x`*^KD
zH{%NGQJeFDlF9+)ZWDzZ^*LVGknHoxlDv)f2utZyVJ^K9?$h92iYa3bnlIHtT1j5$
zt+lOmbNWoL-F=Ksb-zGwB=w|%EFk5n0yzXy<0c(RI@(1Aai0SyuaK;USdcF6$Jh8I
z=Szp)(&J8`6xa2rpPebBRT at X;(y0*d#^LtVEI{5j4I8k`&JMm(<!GC?64IOQAqG5y
zsWkLfZ-G0XPSdS}mSPz+FP5T-q|eERfYW_S>6y>6sZN7bOB>TypIJK%>wj?uSx3ra
zxpNA)Hf+%71A}I-fgFZf6p=jd4An$lfN~szGD8`l{8l|*vjP35fq$uL(5=*0`MmOl
zRn3wa+NDBjJ*wMm1KJ#u<qOAU`NAyHCbQV13k4rB3x|oN;55ktP4>))RJY_UJD%=C
zL$n_87J*S8+6TIX8PE=mnF3xw;pO1l2E4#Q^7T_MAC*W64b!Fy at +9a9Hv+n}X1^gm
zn!3mBpf%z0J_{+Qj^0gs96}k*iELDtdCbhcfrrAc_I_=TBl4<xJLt8UH_fa&RZE_v
z^C{<fmRae(pPIWCkonXx;EUA*@0rz at PQBdp61hFx8Yqjjsv_vXppnpuL=ACL2S|2v
zxPG8A#zSbm>_|;aO+G)v4R}>1ktu4qr^IMY*&yc|l&O1|$PKbXEx~>Mo)W_ZsPO^<
z2!ycILDtY5kZJJVc`mb7Ix+=k+cG<{WqPb6+_0xSS`n+oZK at xj4m~g0aQ5a{xolLY
zMH^y9^y#_r;7&Csdgow{9zH8pD*s3-E566?5JWN$uy9_+f6$`Km>Ss>DFGe*&e*?!
z23rDcl9%!CKREbjm52DBtDiyWAJrtz)gh-t?M9Q6z9zza;4KeZFSR#|Bp*-x_Q`yR
z^08u1HCIzxMjyIZK6q37>BQlPwU(jJ2AEn4ebz1Dd`Tovo#qjFUKZ67cMYu$9}MUg
zStADruf(5TPY9QJ2WJuRt^T#CAIf56xm+f<s2p0`f%adH=v-vTVzG?aE=Ysi_XU;R
z#Rl2GO&H9F at a@ie+UjOWb(aC^VS*Mk95c$kV}R?uMyC(Lnn`u|<~~<bC9 at +uC%{DJ
zoaLJ4GhQ60a?4N5Fp_ecSmrxl+#{~0(<wvT)Eub(vo*XE<agyNQ89*Gnt2sy{$DJ|
z)7B^h$XN`3EwV1;I=bwOl^84XwWRr|E7PXO)(Sw^NlxR at Vq4*tnr^30nAP+W&RPI{
znm{ugZCXG^Qe1}bGq+{F%Dan+9Vl=@Xy-1esgg{bQ@*uPB9;qBEw!r-<}^8(8Iaa=
zxt>1UUpeybwNT9f<(~{#bAJEYK|{(EUa_Z4&4K6An1xm)Cb|i&_NBusfO1zrt5i8(
zqOEJr&}#AxVv2?VBixH^(G42g7yk+zK=k<2Rd6qdJC3%agr_s2{2-f}<|4!eGWImc
zz}INSDL%^ya!!roR&aR$6?7u5sA5w$!@Je+t_kD>ukR-J0&08<-Y&aHVqB^n<j=b(
ze-bRb^;~L~he%wi5D>WyMl6>?yKdzkbDB$;F~_<o&x-a?7$hr{>j6MX2az|rkAO5-
z2-h;goG9%!YhG-9z7luN{k>UP;Vz~kl*5ekgycRdMyxU$$%{NMK)v9qhHEBV^Zt1%
z&r_ at u;7lq)y#)RF-t6;s)vP~z6tn&e+|I}rgHLJ+P)#W<)#tn*1n0amw4l=%P(i`f
z3>D<h=wF-QWESlfM;6IkWbw$mfW1h};^q<2`gYYT8C_+pRTLXaSj1Ysw8tzNQ at q|X
zf5CI}5)*yt3^gKMf(CDntVOz%%OiK=ygOVo;HrjerY{Z1#w@%@nc@)P)#D at Yjx>Vy
znNJ_mwrec?<OpF~sCDW4Z`rjS-l<K5%?ssde!>&8Cc{6}M{9>NiV+w5OI}yRA(YbF
z;i`jcsTWt&E$<dC`7ZD5ucu~r5tZpm_fonP&kut(0omv&G3A1!mT~qFa-5;J%i}=(
z>yz9?2T<V;Q-1+zd%G7;gR0ZKCrdFF_TnXe*nraX>f at RvY8qUDen}oAhY0kY(YQ8_
zBV>l;CygL4rnz6Eb*VDQCv>tj{tBL(aJ32R*T1&@G-*Y at R3YZ@Hm|2G$*hn^fNO`D
zV4gA|QwBN%<m&Ap-Rpd5ERP=ZCPd$fcjPi?S4Z9V-?Do`n at wL7<9sMk`dn&~%ZAYI
z#CBZo`UUU{8D~K&W$cGp>O^Rb+ch5Oux=Gmc+GHbBJ^b=%0xV+N1jeuVGXf>yHXb2
zBG5^*&cSg;bzbTd%q7X~Yy8A9$OU-7P3(rt<h~%0t7Du~pv)I_La}an;m1Jrh6}Tx
zU7rWU#CCU}?K9|ahvtL-dTl5CyR_{WXTg1$wu||QN>EoP)@|_C#5<thS9wU<OwF=*
z>G{U=Wz(gc_~Tz!(w4ZBO3n(tmApu*0iV at EYYS;}+?jX>B%DNMs_d}QQ-eOB8<&7y
zVpQ`y9qF4W(1l!nY4=cI7}6X5>!sWw+i;GjI$fwv_1KZqFdoQPBr|~0tM%t*)UxT$
zfyS6Yvv>ia`FxN at +3-$y|ChrSkCe_G*cmfwR&S-|1I%xP&<Y6q2}o0uTnVH949<UM
zQNzD}!N`@^uIjYJIx0Gg%&j1&#PDxCH4N{u^Z9tfjaQU;;00CJ^9I!z&WoC39LSD5
zXsxAspPP+yfR|dFKEOsisqCwAFQ9Vx8{yaVGwl8>dr>z&($Hg0ns819QzbQO5%l%U
zL=BExoqlkJ+w2zLpAbtVM>a-wMQr_ReLImxL01*SuBJlrgsw?C-FtNY0=gw>CQQ<B
zia*u<@g$vJ6%z*dRo<x#x5B6GstI|qV$z><UUf>&=-56#rj8uBuS_#T&c~y9v8g&Y
zpL~i3G;a>mfpS3SW%6n#@gq9V59>S#IFJR<j1SR_%n11DzlgRcUL4IAINA;&FX<tQ
zn}>FF!6>wJ`GE6U((N*lT1t$#?)AOD;i#j_fg3(Ca`w|Z26K>Gge^h&{cptgL at YRd
z)SOQnV)y9h0~Q3&oL(D$J5qpOdTl#K&T9OsJP9<oB)7`_%Oy=OrR^}592$4d4EOr;
z`OrfWNDOF2TArvuBoekot$Od-GT0MJct2&`Fxm=wphf3WTV$tDLn<-9u4YmXnD9u<
z06z1>#gUxMXvZ&*i02y8X`+wknuhe~- at O$n&``j2cI50x1J2_h7u9^;GQdq&sPWJT
z-K!dj>GLLzeVbiMC$pur#A|gZ0S4q%I}6%C at CpkUUx23`{GzehS!b)13gpG87X%yT
z%-`B at scl0N5Ipafl5MIj$tGrv+Cb;u>`+=eUE&O3-G at c~)JAA!dvbe_ at 5=@4REGAK
zd$_1uHH3{(Ha0Knip@>Afp=6MbVkbuXM&DV4WnW at elvW(oLb~6;A?X<;}=D#+d&tq
z at l-Q_UH}<Za|YQdfDiUL at S{qQ0L`S5 at E#G+%&S5%;Zys2|CTDJOn4RUBLrRFC_5uE
zHG&RN5pm%ejE%&SOcmf<KFTOf4%?GEa5r3rcjN3FP}qM!e^uki2-l(}sOy2eL`ZFr
zXzkf`hh|0y|IFP?WvM{0>~(g{rIz45!56|;yB=vwU;Hh$f9h*)PNzMAy$gEQEL6~&
z0E4d%{i1hyxVMWNKW||!aQB%Yl|hrb;#81^=4$-85`Cr;<^5b7Px@?S<_X4=K4WRp
zpY-u`wDt=LsBMm5Ab3*nT)0~%yh}{(H()#)2(ID8MeE>#KFN#{p0)#Ddm}4Bkf&Ed
zz2nYSq)I4xjVKVK8 at N-~Z09t-GU-Q&<&kv$B~we%IAp%WUfwy}4%*5+!-mTir7^J%
z#^7xFoO6M>RU)zlXlo6v7~-Rx#Ma*M&&GjevLnXJ^`L7w^>1beob|TWeVpGVFr-Rj
zH)v!*%owT~GVf&uq*wuH6J{vW1{^7YGT at i9HP&O^Y)qNtSy0~D8pyUG0b<l9YA6Fd
zUjTY3;pXeLsZnoE@?AH<NGcns1ddn^W4j_|49|&71k5!J5Y;it5A2GWz$XuVA`?{;
z at Qzs-cO)-0n5DA20cTVL?NtJfDJC^|<{Y%a-#wB(Q?fg0q?RG>5{s7TQiYI<c^ECk
zt_|lwedfpbq+x&=oSa$+<G(z-2lOURZiwtj-3(Z`EWA7l(o(LDEKgO!a|J$w{Jcx8
ziB5L6Lj1bH2~i$m at R7Py5u{KCDY)R-1u59FZ&b>av08N!j4t+A9kj+Qq}^;>C&YC|
z_JF4Tc{X-=tO`)sa<$?g%4bV`8&E+pse%jdGvJ!37C<SAXc>O3hSF3F8lfD}GLbr!
zKQ{4L-myB3qcagb***e(c39_UNM+Mgn>-C%sota4a&V02Fe97GOw|G@&Vg2+0arC#
zGl2t?tG9R>_*>_&TN^^(gA^VZtOT_G_>g(j7XQ;|04QTBNVeH~Va!Ik80f8Wr_;v+
z9f1^>C09WT67+-(?RTY0$4mIV)Z}q_AwrK<MwUa&=@|FQ=cyczWCUcNWP#>PXxV|*
zL>$0jZ6K$?EzgQL<gyH28!~~mVg`w5{-dGGq4DS09 at BU(cZ~G8D^XVHa>4 at qrgfwb
zehq!L%(oGJB?EqwDb`mr^u<SI@#^YsJbz^~m1MD-!?O}lCMJH~`H{5cMqV}v`E(Xs
zw}%(P|4g`U0v;=cTcd`U6)^A3aLs{hE?hNg0sPN{Yd%~H;93aRBDijWYcX8*@K*T0
z6|N<uh}hshJA5Vlboi%G)|)i1p7PV-AyQ9rGv|yCF^OO^$xr|1J!!bF1Fl?suSY)3
z?{1)`ZlC;2W4e;)Ycs~a1zpg;A@||Btg%+ew86iOWLIAtI)powpMcysdQ*_c_2)?@
z@%NEK8iXlJSb<oh3uCwF-`W5L9CE!|16aWverSM+nRV2?Y<&KfrTKMJUaI^<Uf9tr
z(k-59$r^6+RGUkh1!_B6e04^|RX3$0 at Q3`daCc6)?R~QzYPeb%aa}Es)b}48S;<n+
zde%8B&6S9<w4D;~CtgR$mE0i}`-!`S)KEwK!^q;mY>H=nmNll!yZ8xEgA2Ty&el&$
zn+B5RWZw;;+`h>?p*ejM;osU<6l&@zm{V9byC+Y)L`)g^f~($CUglG*Y-l9&S2ndW
z_fvDXyOHoyn>gm{>=RT3`CJB)y7K!qnjhTd+AjF707+h at J+GODb|(XkB(FDV8_Ipp
zddVCQj82tE$)vS}Yz`8YrKY*PTN^+Z2MPYl$3Cj&xLS(*&b*RJ+~106y0**^s1*>=
zhQ{>imk=MK?LMdjAjfb6wl#h!88Yc at U9R$)3GiY*uINn$Qn%Ak($-f6V{9MbMbKGv
zJ=jGpx{O;2GH#Y;$!NltKI*$0<PaOY&r`zlDPCOyTpRV~g|c<@4CtISv_-9PPbYF$
zarmr!NOE at Ay4Fcdhh^`^@XBy!@T2sc;H3D;_zReK<LEzqEYFgL+pi4d56;qQgg3W_
z+k&ros(B;e+J&PZ0H0|A1YycNx#!V7Y)5Fls#k<F0<J`b=jri3`6VX<Wt<_2!rjyy
z?0~e7)iU&<feV9HToI6Jp=@|>@U=Zo;H(zSLT8~3DSDtW{rUeKc^|ZTdvIS<1(Ao$
zN4MkJv+(aC>X4~GA$j2rq}Tygr`Of|Yt-cIFt at 5ax^~Y+UZ-=q{IB<IE_hFnTK8Y+
zOhrE(%+;)YIa&@{u2#*mBF6#CC^U*EK~ZZGcU*isX-Z9iQOk=-Vk4E5)9J~I^VW!2
z?)rqJn>7M at ysy`L0s7S8tVAA2SyDzSdwCh>>28KzgPxWNV$?_;E&ZR~Zub&#ABq1}
zuj4o96Z8P>0<JoH9RCzTUX1%Lat#4l5dlFjvWS8Hx at P445%JI+Yz?)tPPzfLpXQB3
zY1&90bF~0n3^<?M-`e$y&M^3FCQkZxR36M>C3;)4lPDfZG0U=0Pc7;VAW6pjYdlho
zDHWDagC5twj``wh5ku-#xmV><`{f>CBe4*PK87JpPLfRR?>cnsb+Q(6I5KEu-L$rO
zEmb^j#Uvj&wh_`_ucu!-p8jv-!;t=ZcFZ at Eey{vGr2k9#kg%3mQ||=)T^pl^L8tAJ
zUq7}HaKJA*=Rj_LT%$sJo%eUNb}j0h20q)atJ|#W>qac<1gM)iRjucG8`LTXYGqE%
z*7IAS*QaK at J`RZMNX^&lvJp}|19fSE6gNSNEl`&;$6i+}JP&cUY(9Vi^mOwf-3gwD
z*fD<_`a}90q;I)aTDl$NBIaei-Y?+yrMq5_o*snQ$6mh{@<vVPv@`Wks`b*hr&>O$
zgLJoG3-6T&+GC3YUcGh;Al!MT3jXWQRFD?x!j^b%0&&x2?;4>+_*98}M4k4Y4crFZ
zmsgEYOGC;AJy00+4RY`4J}j2@^=xThcdmhwwL at vKC!l4B<xCFHHTct3Y6zIS98d=K
z7{d~(uK?<^p#J47psiU=7xl(6+DaH=0o*B$ghrf+4IqWxXwUrbvzKoXSFdl~eg;M;
zSJ_IJFBdEu)(id*>ux>2&m}QhpeJ7Ld8l}(Zpzj>>TV*xsavvjW!)X*16-B2b_MXd
z{1c at z0e&Z<O(9BYsFAGM(r1mo+AI*$UaqciYg2Gi9lP~TnZ#ANHvxjd`<-)&$ZvoX
z+;NuM$E%<v#xLOMf3+6+5QKaHAuGp1_L;IF-;_CcbCqm_|HjPR?VLiKjWt}T%~KZP
z-g~hDPw2S1=a^aEbxe?b$4a`S=<9<8BjoClV-4~d`Hf at lWBbGW9z;_HIX_~C=Mw!S
zpcz+J<8IP!Bc7_<&1BATiVhFvj7jm|*P?Cz{yPE_M!KjezC_`L77|d$W&iJ+`<)V3
zVgbxDTjB&uFdxy2#F;a$S)DHcW?0_sb=5pegeU0C#&jv3n%DLJGv^&&nRCr}&U43e
zo->~FVv0H63^~7{=PX5w>4m}E#7hCyL(;d5r}rr4r{0|T_L`Zw2CmBnOZ)Hy6y at q{
zeU;{!_>Wv7|6JYV^Uw9K%!H$6i{BQ;zAPjleq?^_{q)%n|MtcAv4={ZQU8jo?DW&{
zCa7h5%7XsridczUCK11_StJGTPXgL;oh^X>@}2 at f$oYG!gAJfNSnDk3YwQ4gRU;Jv
zKUARoV~VS#rKP_n=e^=t9uby$8|{fNp%;{^)Pieyr`7gdW?v%w8&B81soW-2?jt*$
zZ!9`;r8c7620lynZ`$bq_Y!d5x^q_TLFLxk1Il9m4}anP1?zABdE3v4fAc%kT~9lX
zZ}!)paD@)}%a7iFWJ~CExNki2Wau#5H;pJGE~<3)pd~NtBQNgZ6>-Jjs&ze6JAdNp
zAg=n;m6f<UNAhU|S9JyNYbs>&=CE(SidOSMLp6i`S_$v*NZpsc8T!7=j8VAA6Sm1f
zzUiJrgv16q%fBMQ{{%3`zik!`q#Z&`=-Zh7`()LSab5W~h9uVE+7stX=1RAL$nJ%-
z#{bO&8xH&+ at F3c0Nf^UU9i8NX{=9IkZ&R~eHHPlGndcu(6?+7ZOHCmHLCoU1x+)U`
z=j}j-_F)`|`xeNBt#k&??}e>E34}+D at i8LOMVa`J@;maZ(PrFRYxpI;rEZ{xZWo|o
zJXdHJV7oj(CN{qV+orjO=6md1aqT=nB=v)f9u#Q)dV%twNwKvB^w~gJ?PU5a5W^gG
zhR4oV>BvRO at Ug_A@b*Ez*RaQ-vH?eAJMhF6nXjLKU8}?Y65TYIn at x|4IIqzw&??Rf
z&q&l{YQW}=wMOC{y_Nzq?5Z)6{=2aRXKR4BwvyKH5<TuLoCl#jS3g_c0X%iz_A|kG
zFj6PPk19pf;^d~b!Z>-<B^rxhtQeqvfF=P68sksLM?i~Y13m6Hhzoda6wz^G`o at bR
zXGR=w|ASXVZhPaOn)VV|RxlUfj;jWgrXliAGSEheO(K=-%L|n9{<Xec^}SHfzq#A=
zb5j-$#30t@;H^-S{J7SWo0`>|;}Lm7YPK+K+lQ$Ijp;AHMNO&a0-r!^mpbTXiCOcG
zNrkI6=eHrXA3;6Wl2$Ljrk5_%n2RK~MB+&iq&W}LoJ$}j&@S?Q>E4-Rt?Ek$S7HuL
z6G(|0=TK^aW*K)KVfFP*^9X1QNK4SFtEdU72-@{H?$FPiWqN)UJfG^ndp8pp(M$Gj
zpr`XEprguox+=6r^GMH#l#v0oQ<X*EcR)_1I9g<7Y_zzx5Ep7QdOzesKjdWkA*}N$
z)`0t%M`z$3o?;C~Zw0*&;`B4%rLG-eN#^Lr#?gH#tsQ5U_pnhu*5GcX@^TF%<dwjg
zv9oY_zFZ1_Zw^N;$<ly$;=ULU`uiO!?iy*-yfUj!*F%TCGL%;*LMXd+^?(@5nNvZA
zdwEYaW0Iv4_v!HrSr^7NXl+R-Gu=qr=<AK-(Jx01<9b}hifei^E0c~$4+;u-Qv%;d
zN2Eg>uJi5^qjGFBavdE}bUE)5T4jZ_K}y?c*gHddswA&-r1=s_|B4TIJ4Jd--_`Uv
z;#TL&B^Y-fHP!v_e6{q{eu()iv;3x~#l+k1Dj^sjW1ENFlsIMO<x4 at k`3Pa;3)0I|
z^P2Zj258p!$_j}05XAh%^Q`%Db}#Q|o(5)$Ogo<#@Wm$BnF6M{g)CjQQOSMN`ex3X
zwl{O%%zHDx5VSG4EF((5-zlmI{ZuT6=7oM=?=AasUcZRiEy$cZS9K^=8k1 at Py}}V*
z7 at LH0DrF5njk}(rGk_009-TD^8Yiw|h|U0n$En|pR?2K_v-(+-9gG7#JRE*HS~d7}
z_3OCec~ysWKcr{Rrk6{_K0bU))TG{;x-Dvm{TaC1g($0DP=13s=pnU`#tLv*V!w$R
zW9Op0`Z1KM2vV7lO~s;|&`ZQeZ&Ig6r>hlcRa<>Co8L^d827#3X5vyYme*&5)U1Oy
zfCQYZpQkh_e2Xs~<y2D>o8AlQSTG#wzyja0kM!WqZ16F_vlw}Hq(^c0tR9hAiRf$g
zQ73Vh+gkY-2 at k!p98brkpCmkr1t?*r8}vB(O|*!o&ce0hP at YnKUG_pqwHVvGU&ONW
zw&;wQDLP%|VmwHU2{Ie8s|C?Y)d1zm({sO~T5#<=q+rCA-_TP3F^3hC;b%doHbk?f
zy|&XypA%7VZTEOdcR at +pprlU`{#OlN;OV#?xRDsUm16uds;6YUehwR at TG$)h6YS`<
z$wa+*9LM;9=i2d1zAz8tcOs14d)Hr~6s_ms8KJycn3(vTYE1lYFCVE<P4UlzrRqrh
zbM=czH(Kq0_P7uCt%hr&+#t7yiPQj}U}Oo`)ChB_DS^Al-k`>Wtug&-+lY4$8zfP)
z?2S#5SYm5-lRy8459aro)cjtMWlWyD5wspbwCt at oaJJV7K86GDt1R72IiTx1v+IVv
zp&YH<O{hF1pD4Y$+UM;q1e9|T at H*ha?p(N=h8RF~Ycpd$%z^uX<E45H4d7k_*E*61
zEpIkV0M7G8U%@Fe5ty9grB1=06K)H?x5uF|c$S!RUPn$NDKcX0r~%U828$#CaAYZM
zkp#eztHE`jBmj<F4M?(-ego3JSDh4e_3)rwl+wFEim_Su-Qec4?t6mM6kf(su7^|&
z<MHpmF8;>g#B7{R$4ha(Ae-}s at tnV|=bR7jeEKyy6?{BjJgS%>MHWZh at ufgXR*iKZ
zBy!?&S=_^r2$9KVY8()Y(?Hc#)Czh#3tBqbeOcfo8m^QtXyTZUbe9EO?|<qXEO#5W
zjp7c4&Q6v0gm_N=70xku%$(VCls9 at P!=-XmBd)TA{)KqaUxB7ZIYewfik at j2V!E!H
zp^VLP8JkB)_sfl=FGjIVNij9z96 at Gokv0q)6G4>UmzcPdu5^~kt%dn?DlHew0M|`t
zo*LrcH}aJ7R5_kjbHjFU8^Yhqye+rL4(dw;sS>s~vE)8n1-XjS`!dK8G){AZRpy87
zFh+C8_sH`y=h?z=`h4mGD&IA__hR4^&5- at -C?pw>=^;S%24V>EiW%a%JkPSWy6^5v
zsS-Rn;mJ_<-Q9N8F+Q3O&>3ne#WlN@@KQkU3xGEi)O~m7DRnORdH}c1(*0+nbglcY
z->z0)dl%Zm)bE5AE2;bL3lIIhMx9#s-966&Dz>YWz!d|Rq!!kFH&6nu4mB6 at KCg06
zp7rqTRx!O4xLTSyPT6bJe6rI+IBtk*mpYGKYy_0^nZ4+TjO5;LX(nE!^B#{y;^d>j
zCsq|n6aHAF at k30M0je<J%ofzWfV8 at wpi6LlSvyI}nqM^l7cs{_Q~#JWHS;8W!0Ts%
z#Ba4P at G`-U;N)gtXSCvjyXQE!HbvV8*ABD9Nh}_TX&UC=5SyJ6`JkbhFp38-3{U}R
z;~Y^Jc`PLFRB<yg5yb@*v0ZUISg at U}7j_YK9+a?#PQCPea at Ww#MpAI^kR at rol+!mI
z;`wn`30m9L%w0s|LwuJ6dcHB>m5({uV*Sf7^km)udunpb+>B at 0TQT*%e^!mn0Mpek
zPEA%XYaFCt#nyl_86On93LrBDpZjb>%-C8#GYu1kXSr=@wIFy_V)k34vLlw at 3&Baj
zCjt)Vyf<?)^oO*&n|ZS)(CeWl{2u!_o!WgTT|plPedB#dPv=Is&mqMB*YDU^TI5+O
zo0^OkFi-yAcxlqmNN(=cnC`XRyIo7uzi&*Jct(B$+R$EoEQt;2Q4gE1+gG{~u4!<U
z!X?6023I*;6~6S?-jCnE2^#A!KnMF|$b0rW%~&;i#Xj at +^9LXe&fpi>CYH6sePU)U
z7(1U0QR}D8O+)O>p&X=<6Q$GvbTS=qFB2+;*kz;)WRK$BMCF0{m<iX=QmU__<=hg<
zA8u<T+;=r*m{kh8mwBU0W(0W3ED>#$WCkS>3ja*R3;%4SEnK#jze_=T2$4lBN2_22
z=EzKB5v}fD8~<_G29(XqTx1c?(c)m0!iN{dNA#!3!CUYtaX7LlTpqcl;53zSg%$7s
zbLy`;Kjj2KtEqnizL$T*jAzV_PE^c at U~x=lLg5XeFBkkAidE;lClw>ch_W)HOXr0d
z--B)X4n?yuKUJyNQftDwz|}D=2eui|78hBVc`ueLOOfMxissbqxGF00D$cdi`Ken#
z|C`^-Lrdpiy145sILDV(szA?bz}5{<fK*FE#lya#w#2<d>@cU4;A~Z7 at eu(+3L(|?
z!F*g%9pz$1&<rZ=48awgBz$~88e}62zpn87*ZT}O^Hm-Hu`i8Zyd#Ulw|LB=A-u4U
zjod;_&^zg?kIH1jC^1Cl4+9E`EO6)PTz^iu4BCGZ_5+Str4UezIhGHoya|wD4z8oX
zbBt4Sn~6jKS2B_LsrfN0yp`8yO4$bu5F-ybvNvV#VN<oiTfqHK;RW##_0F&N at lAT_
zQ?Ms>E-)c{5)gh-Hub!0>N%ORA2IvVdM<3_rx_opOIftQmmbRxo@)>bf=`29Vu6Uh
zbdNFI3S*mzw1VD+6au+N7U+3Gc#lC3<s+>Sc5`?^Vsd1GIulx~S}$8=crnmVdA3A1
zW=k{$XuqAbve0vSi3-9`A^mv-4sf5*j9f-BVOyv?@*njo%TuD1VEe`<gonFYao>i`
z7Jgb^mvb^bCw`JGrldz-m4ht?bzFdXxqVbt%5a6+!Cg^jtPrhs$PPeB21yK90*(PT
zRtUX+k0j6*(EW{wp!EJWLrfDOLHrVG!r4W{1TyaWVo~0IG5Hd+<|A56m%EGU1Zj@#
z25L&e7&ZTfR%xt!NBn<c$>cJSm${e{RKkcWEE>}T3uF;;Gg9jpQ)+GgTkvFaY|FjV
zAcx7&>Nh#b!W=y3`uI{_pf*;Zvzvw2F6^D|DVcAPD{yrNmPz1g0iF&p#L(wb1GpX=
z^wXxZxj0^y3*wwQ_U#vCWlT#|4Fili4CwU|>Z?>#3P5Ac&uXk~%?!y`%)z})(}^*$
z0l(vZ8PGM?1S07Xr&mN>PY!Lk%#d2|y)NNCnm2fj>*0QV;BME=C=Oq(%+4tGVhNmE
zr&cC5_`G!HWqrp*WBSr7?g}cn>p`+_ at NcIx{mb1;X<lRcZ*y?I<dwyjnXfB4^6)@j
z`AV640j=>r2wbcDzy at 3ggR@I$WB&4O!;EYtg=FE?Rim!#%#mSy=E(1=;oj)K8&A84
zlmpF2om)w3sJ4-i-z7Ha-<i{2PHOUz96T>M at g3;be~Z70E5y{>0<o}NxvYPI{$1C)
zEWO<gG$rFsx%f%t(~BhbuVFi#3CP_pONkAQ>5-%wRSI4CX<wv#Y;MPC;9K>Q=(9U$
z&p_oNMq8vDcN?bG;G1+N-3T0HE{uu?06B0(Bt^s=apFGSNIkAAMP4qKp*`&7O8jD=
zY!y+)+yA_vpWNK*5t*4IV%P>f|8h7N{)6E>`0oto!+!^UdxZNd$iLve_sDK&w=L8*
zT3l<n*Yzt4T2qXx0~ca^Jgw6X$(-V?@A94U(g&*uqMMg0M|0z|GCRiWrtDpq at qICH
zy>CY#<NLzVYrZsuJ83>H#(gv&7a+R)I1kU~NU(i2jY-@~l|D1vJrYNZBVK$%W=6dI
z2NiqI;zL|G6m`XJ;YDI5^T@}|WmEuNteO=`Rq)@PWqi)*^5r%B8GbF9?Vk6%^rssj
zW-*?2yw{1RXUk5IJM|!QfYaj{!XW?52ff!$JNAeiuI%vZr#%AAX0%2;Go2O4hUOMp
z@}5aQTls!+k8_hbC-`{JM0$Z2$m~Q4XYoK&bE1pO$-2ypN$yp7`83Fp_jKD1BGfN0
z^93U@(BA}ocEBaDtLkRn_GW*TY7BAoldu%69Mor+M?$^U)E)6-M4%^~TMjTzjxwD}
z+yOQC7<jCa=Lkq at X$zS`))B|=KNVUDT1C-w>E8gX^S7u2)fK+|GFpTXipbmWrbFP!
zJ9EA*#*mjmFB?H?jwu}WG`Rj1btR+{aDSS0zf#KxTNMteL*F-YQa|PB8F~Tuw}ACV
zn~l`S7wPR_=8XC&dnZ*6%5xISgX_%z``kLxpnnI*)U6L^&%L5 at 75Go;xRIABhj;`=
zdNjLd at -S^pyoh at eudW`=$GJ;c#5Emb>p3!OI6$*N&GdE<5BmCm at H6L&Jta_<3St2<
zn}-&+LEdmE*>y`1Cg=<Ojl|DElVwxCj!utFPMjRq9dEu)cbs#bt~nP_!UA27tWoDi
zs|Rm}F$t)bvI?G{!v}3yEprk0nRPz{xcIE^E#MZ%eTA&=;-IyOC%pdt(>)nKdptc}
zmRqkY%aU<D_BO~l|0{By_mw%%|H_;fd_~R+!%y{aSIsJi*f{lQ<LIuFkW+4WvEG&o
z2yo>qXEbko0DTn>WW4}k3y7s_(X~}AxT58Y>C^-o*pkfLJab!SpZV3*VJE$S>*OL!
zGCkSNWxhdWdNO?5c&`}8*5vro|BpSBsX@*4Z5PbT`YyS?Uij6l`*}nWzBJSj4+hJ{
zx at Bq!HC(58!JYB_hnj_-!MgQ$JS9v{_-T*8cw7Rpqjm{2`%Od at gN1LjE*B*ttyRo_
zoC{Q#gKLiD3SC2<fh+1&1Nh{kjtnW3Fu4#?3mUKqt at -F$u=DB!)ds$|WPLkyO?mP4
zx^cfV#UVC<T({tkFDOZ+r(`S*(2~XLv|$KWV^?cX7gmcQhJ-q>nxD<@ylTzl5hzg&
z8NXfYn`=PxeNdKya|ax;I{UhvOtX_NT_s7Dz2VM#{$!92 at u179rGbWEhx#AQWuS|S
zw88^=%XNAkXm!CCP^%kj!9=jT-e0|&1wD`E-6ZkV#BVyn1ij7kK;IRAeNp{0wtw$m
z9~6ukz4edm|7C5|Kk8)Aqt@<*%vz~}M}X_}=~g7rwoq;ua9R>iHg3cjweFS3zY3mI
z at EhY<YV2MHPyf_+m3 at NR$WpqX`6W(ysp`||WHnthIN4+84B(Q~Jdd44*HYDjGitbN
zK;?hU!Tom6eoOI#n at COPPt^Que7kDR#$T)&(82+ at ZfS0v3Np93h%CM28*bYhhf at 9Y
z)5^dnns=DJ#0?soH;LpuZto|ZDQZbFbVdB+$k}VN?uT4xALLvK?$<px33u<Fn}{=@
z=O&=-jdR5~pL(tcEohu8#JS#c1-jHm32KB3t-Ek=@o*X7GQnlWZ<_jkFhF(mlT=Q~
zMmnguZ(Of^!w=|fEv-U*Clm+^<2E%ab(<QiGdLyuTk#UHg^RPhI|~A}l1OS*F8H;e
z_gB2cwDT$_5epw=5JOT$HpcP$Wq&)7+4#Tn>&OhlX>yaCc6BWM$lDMfxG2SLl(=dV
z|M0RGPcXU6;F(<@(M0lFiTbC2G at c3y!(?fn%qskVN!n6-1MV4*f2Iz2o=M-3nsyHK
zM{-oj0SP$=t&429L_d{{gErZ!TEV>rFr^{(IiO%}a8%~vJqe%0)7&86Hv_Gc`qJ6=
zbF=SToB3ZV-Sv&5!e9C(%0|@+ at 8^KuN4nqd`fN~-9 at Wy!(|q0M*L_^UN7R<^CFZ#2
z(p(+Ujtb`zb$y1WHsHEU{NLlRl2VH2Ip<~P-5hdDA_&~|;4tGVWDm)bYd#x--kKgi
zs6RXK889yRjP!!;_e97S?ufdYhR7o$juWMnO+s6FrS_%r1!{^vM-`B(w<Xe0`dg2e
zu4<8Zjp<w9_7U9g!$<kSd^{~#ZZZ7I%Vbc9#RTZI56=tkuSM+$XVql~SqSB&ag+q|
zp7LmU4D}%+>P>qq0%eIm9bX#yU!gm?+~I~l at B<d9qxJ?ox54vl at h=mv@@_KO)0s9D
zcaX_|g2ZCsf3x=P at lljl1Mo95d*4m6xj+I$v$>E2gb)-JkuH<X60#V>qEYFJ5-wV7
zZAH<_>uY~Jn at k|Y01+`nrML)PXiMYLrYTiwHz7jM)>}KRTDOLPF`1=0n{Zj;lKsw^
z-GqSld%r)vUw)H)=DA<ab1u)E=NvK#VqxVzz%S6SD}NmF$NXe6)Iz3049WXzqywOm
zQT)hoo>FgppM8J}Rz%z$JMLbfRud^3uv0#;T&M;}xXwGV`7u6O(0F%AgTWo>!*fqb
zGv15+Y#<?~iESa|)(7Q{FAM~ng#2VDZ~_sx-w;91BWNS<{vh<^>(>?Sj1qV0yNDM$
z+^Vk2RgVKE?4uo2Ta`?b20_aB`qRF%?OB6N|JPN?nPkUwfh_e?2KcDVfj;L8(eNPS
zTBlM6{{*s^t}5F?I at SF3Dm~tkAF~PZowwefV3jhg at CDu!6&^cK+-vVoYb>Fg at Z{&f
z${qW6-S at fSz^b+dpJ=@nv>u$?MF?8h6NBjKpps?EN8y2i9VY$EoedjrUgb^XUCN-X
zM6{duaZezR_B5Bk%4U*Mg=?IGUa;G<Am%#sg)O at Q2Ex2bAlBPH$yBT*POsOZoyT1r
z(wSh2^!463)@h$uAazDy>eVSw<3vcC18F>_0jzm`OULJkmn<hX@*(Ef)dB6=p_~nR
zQmXV~q3p&UL8wgWPmT0-Fa^pvq1-y`%eQKL7E<b28+qi~{;;JaKc3!%Y2PZ at 0xA2U
z?LWl&@>>&oH_6A=ZRRv1wr(RC#`XoUC!r5E+fE~tIRs_=w!2!4*Urmt8{=(tU)v9e
z{{Z4YgZ at kpOhsJ<SFtt`tyxk%T8%6hAhkb`*Nk?29+FBh#%X3?^N^8{AlFGh06Fcp
zPa=W5T^)i)6{RZYYn0g;oO|C+f_s=>Xws=RyXVE)`qaG59Vo={&|kR at 8YOHemV)hk
znit5!G^l4gRmbb8N+V at 7UXQ?hXFVE;<;eG71h>N+%@6jX4Knl(k8AVkT&UL>$gkHn
zGu?P%yHl~Q!1SfHFQA=6ZtIkvRScMi?Ud=zkz$&6Ob!1hx{BG<Z6zR`d)_%Gn(P+h
zk+$G at sXs|ME!D9`%J}t8kbVc5wvB)zw&Ph`%zheLQtaafCP#RBTDtElYp#mDP`4#!
zF|?VdivX{u+KU;G at 1sYQ@4CdF(UIOc(c68%`LBrw621SZDDkHrFnRwDzexv--oL at G
z(X~uvI<Ulh-zREO8?&mX_-QRuZ0Mo?cMCm1HPW;GR7vhg1|DM~aA0^3PU9&(P>y~?
z at w6H!6L)k9MgQ)HU2D?@(2po!?gpS^d6hY2Q=}BwQ0416P=#l`+xr#+Hs1jFrl(BS
zKZsxd=N4>X_z-^oe;Cm2WcVv4|4{xa;m`W=PLDVZ<|~13GJ)K_H5)LIzH*4%D<U0F
zR3tq8K&6zYNJqIJEBFU*x{ga-0QjdVpRIg>sKwi?FTdyy-ry^7L`{R;8B|NBv9kc)
z7Eso?gaW3%{J6gWaVnl=0R3X)cVaoz0K|J<jVI>in&Rit-gT|K_wm*e?-Q-I(K0{-
znurR|%|g##@i`WkvP)?v?Qv(1YNqkra(#1Bx1ow-{5w!0FjjFIvO^DameY>KtRp*2
zjmYJv6tO?5Mr&d~0gQb*n8_ERXGR-0!`N3S1qRZ2&JOkM?BZurJD)pWKXRgZJI~NA
z>8qV-Jki-l(s_%n%RGywiW(cY!3g|elJphNt%XvO$HqNr^vCWEm~GrTqZwrZy;F{c
zg_7PSRUBC`kRh7j7iG(28>chgO9=K$FDAxfDvVOdm7&+!IHxf<Lsaq=v9i;pW743{
z3DEcXO5arjYWPj*V?~r)F`V3|>!0aEAHpvwb*Z|Hex0DQtzKi4(GILZ<OEK3`$_~p
zc!MJvc2F&@;mEsVn#D;JZ#EgpESdy7ZZhy4DP#pra70fQz+SZj&)_$2r0GCMM8X4f
z+L#aFcVg^54)g9_?m%_lexNPKLvHJOa><s=8{Ii9C58 at N<s9bCxaB`fqzg4bE<NKl
zG}lz-5nWXt)m7#&ziz&@)eyYfy~ws-xBi|k%AjUadzM8_OmfYVPNJm-!E&xPP<jqz
zG)tdfed+uAb<(y&$c2^R-Gxg_;XQIl2UsY-IUn8~`*p#6kj|n#wf-r1ej03X5lwpd
zu{Kg=A-YZt)!I}5aXDfVl!(8z3Zgz161htScz3teF1-#r=tIb(SM;~?6z%->=A_nC
zsRVZFhd}!+&E*|hmEsY5M|yKQ`pa!@@6?0D@}o|T%fhJzu7ee{k`2qF9>4d6UcR4g
zHHNRl-iHUh3DUOKgz&^FLJaUO!FvSW6LBoz)82&OK6ukM7s1<S at HVM6A$H26oU?1f
zA9)j&fh2>mlC3sM7qNsq5^D+VHtf)}Cbe#h`5pMxLS;OE>NWyyRZeOytbw}B<PWe%
zk4Udm4W1^U710ZC0>6sA+Xr(w>5vZA;cvm^sEyG7e&DXsE|N#{Q3KFfN$_lT5nzGz
z`pu5$Co9n=A<xMK#*B9*Z;}~-UoMkCzlOJ{49 at J0JDPW3O+xiyX#cZ2{Yl}+g_X)J
z`s?BtBNH)3NORB*b6Jfiy?7H&viVJID_n&tbxco=W-2R~D<-sMxpbU1_8z<poKq|%
zr`0Cd5O&%(hD{W`aNEK<A%~VwLs+Gx<T|4N*oU{-P#3>#qtil*VbyEmwj7dM?>d$~
zq&YUhvVvac{rF$WAoG_TOB7Z%>RL-%KN^*SK3!v-^y%3_24$hDos@;SS&te=%AN9=
zu#@+owm&VvHb5#ZMT-n*>7sRWs~sS?j^;PtYKGs~*>LDI;94V4Ho>cx-e^_yVt}(m
z4eBS!dcdL<wB?C5a9SI@?$+l#&mR04%$Tm#Zce4QqQ4-(15BhV!i3z^4=d{$WQ6Ll
z6<W&k>lBVZ?%U$rG{xp{3H8(7_Kn?X)*t<>;+wpy^Mxmer-Uurvz at Dnr}Bm9P^4p=
zo)>Ap-p?&tPgP2pB&AFO!qo6=*$on^hAwK`sA$^t02gZMQ_-G*#9*&bJ$kZfq}FNQ
zFH~fT{D{Xvu3swn at nqM^kucIvpq{C5>S^{IJFx6?lXAA3jc2>0xKoW%5#SY1oPzeF
zhj8G(ffLt1?~k1$y4$kQ%Ci3D?n^M%^6%mYXvwY)<Oe|VjGq{MN?}ENV!p~<8}0$x
zV9_ at -LUv!8HI-c2<r8}PRW$$7pTk{L+jxrR at 49s9k08^06F%zNQ1#z(9}53wEVoz5
z{R`KIJ8$LpS at e7zN&PadpQHUE_l-*E+2wn&y=*rjyMDJd8*p{GuQq(3LWLTT_)R!C
zG5EZ<VI;lP;1dM0-`U7KY_9c>Jl#wtClkh{(}l5}*lEYEOOB{+u(y985dMj4L*=Yp
z@{aCZhx`8C&$;uVtvta$dKYf=w5{(<zZ!7;G<a at M^z}T%j{3BP>#^10YHXKk8auH5
zU5BCeW4$K_<nRL5h9!J+ at s4iv1o&l@?1s at u&;rm79Ld&f)TfG%rKCdTANvOM>293s
z=ELDq<qq)pvFY|ZhhS`U!8T at OMQn847q1zc&?^myz!`6IZE%);_gwO;3w2k|CeXhB
zKpzsW?gKxSq at oqs@0exi$u{W8ZZbN{-Pg`B4|DvHxY)H}>FxY_i+<OozH>0g1<D-v
zTsz0j#k<;$|G%E$;;D-=^ZB;agUZa870)Hg+{fEhT2=QB416snxi;LJXkGPG`562j
z!SNL3JXIdBMY<yvdP-oV`(Rg{3l1sXByNkresD<fr!fzB;dRZ#WoC3PGpj#ofSf~O
z0{kBo4OaH4C8BmXEk0AIx!{Qq>*TB^Lfk8e*<I}z`OoL0_bSjHbkVB#*8_jQ8owUk
zw}Y7V^>}QOb=4csyQ&!#<opuCF9}4*7fNV#-0KV at yF0W3`wn+Z4V+5}JPhS`R`G;(
z at n)ThH`m)yOYzGe$%;p;FZYAIp6}#|KyD;D at 4hOAD*j=BGIPrbRs5zN$m^QGC)ewn
zm*80_pNzU>Cs~2%s~OPmSkwHzYc8wVVQ=344vQyZh!YzbV03iul0i2;-JVr)EKg^B
zMZM-k2KqM&>gTCRp5h<MO;mG*mkr at rZ42s|(_}y$o?f2`c?{doKjnbcsD3oW%r#Fo
z00u1S%aPr*;|dP^m&$HtKC({xdVd at Tc2K5lgk87nA|-)Yg2ifNs?h_JgRJ;1w$77D
z7OWfA*?_C at uR@xSy$IOQPCHAmZ)o#h;AJL!2koKxGK1-WCCP&iMo*m34I5(X_^&m1
zQjF<P_e|>)^`mpi%Lc`pCf}E1&1LSox|i(r<9bO2KAcJY{wuZZr1=0Bu*Q8k*Oa^W
zs&XaJk9V&s*%d3<r?qm-(*8R^vRSe0;+EZ`x{<mWHk+;fr?9kE_ULSQ?u6$Nc<SKU
zYi0lRb9nv;k0?%pJoAngQ@*9NG1F|JTV4A42!5A at oaZ4&GCVWkalrEsJnq=n?>~iN
zzi-9AhQBpUDKl16>lT;Ze>t#c2eD3JmbL0y^?^NjW>}QUtSsV~>XD?t9!RO4ODIvi
zs9Wqr<&!LU^MZV$_7k+lU+qjJ8F-7mbs?svBoY&F1$kD((L(1>0Fuo4r1f!tH{M&)
z`h?fky54T)3T<gZo|m&OerwH3r&{NDZ)?4oaPGR+TS#uL&YVkhPOetxbwfz+t%3gr
zZ!P>cdR4$nm>|vU72rL=tA_VPXKt;zjXgNWlXCE8PwK&2JZT4S^-M_Pi0;7uc*A?9
z^;El6&P1lWKQnx*(AfOJT}z3 at mfW;{*V^cs`a-&}G4EW>d3V4`3v?E$I?ptgoMT&V
zZf<fCX8*{3(eU$04Ru1rE{iQiw|?YMePLsseI1P8$=!JY=N7FKHZZ9Iu6_<tVOuyR
zn33}Sf`*5jvuXCQlb>CGFL15}!lT%7bCWIEgl#W(n%(vFd2}J3h-3Sx8xd=Lh*R26
zb=L=1*XNDw7LB{V-!N6EXfC&{tA{>dN<Fl0CyWsD5m<jt8WJkJy4G8D#UQmNa^)kt
zVMGRLHazI{pfkWrRp=3(mcZ&dJCc;!LD~pyb^^tC675$vJ3$IWjr}PR5Q!pWJgloz
zufV!u>6&Az0((vtMfjpz<{sMfjz%bfopq0cJaAGVm#WZn4nTcXS(B<u at H=-t$D_Y1
ze**frtf=xEq$7yM6kcs)c8#cx>#ToGwP;Q1f#;O-ifq~;1HUsewXah+-ERbpv25<T
z4D!B4W at vtRhjl&UM4k|N4MvM`iY~*^$leIQG#Ux_vA~lhjUNT~lPjYDYS?JEFoJu9
z&7%Y9oEie9N()Vy1lEc`FOn#aI1Vjy_LdEBuQZFQyH>NLzH>+CE?*HxBJZhSA3P#z
znxCjlBPx3}q1NY^HN0 at 0r5ind7Se~IKMtznQ&oDp7_i^t%P!Wo24-Qqw%YnU)Q- at d
z<JS=M=&1p at Kg&Z924Pf>W>|<ySwn4jBCJ#z;>&t1-Vlz}Q}bkC7NqGEZ+6gQ%7>c-
z7G^8kKMA;O6Y9kP|5$8&fpIFhwkcDG7HGC-hZDZc=}(B2f&S%*T2~A3!&=2VL(<Y{
ztuEp}Ss3Bn7TSTUMtl4wuNHkLApg5_Yw!;5M(-Pr==1K;RRd_a2c&WfS}0ilCSVwN
z7f5(1`b|S9h^?jvr30Q+Q@{iVIsuy+fHoE?nDU%;(q|h2Ht{ClbTxPvC)y$2;9ARS
zym<2RJ8`OOEvLkfTokihYnenZ7Xrw*TxDI&I71AKWsxHq`Lme(o&n&|*_nXx*xSom
z7~R_2bdUqbnuVTIVm1QMe+tyMb<7)OJ>d9~1 at Edi^yRp-2ND71-3T?(45=(|e|#6X
z13BUyFh+o^7-ZzLy?p=~Z^a?w1VF~&<MWme5jwyjJn*$T9a{Zpex9;}Zp57aB2OuL
zGJ(0sXzfDzrS<I;3pELgoy9b-9p at -dSh3ZVMhSE9<u}N|SIkXxj&d(t4|45X7^me3
zX=IMjE4y3ND7W%BWsfUfqhUm3`9vYdZz$r_PXde>;-hR5EU+>yxZh#)KNc?mMyQUZ
z&rj at l(0Y^lNoZj*rdy$;;tBjAg~O>9h_{7Wyq`eL$m7PT+-DiEc56pHa70Rk9`xuU
z`7YvUE&lKAt#vLW7Vm*zge)Y}@jEPxeqZoaGL`Uv!}FZ`NS>?EG$p3tLoIZXuOmFs
zZyKwAF4Vs)UVn$oG at km^Y}W?USrNEJTHxz&ko!OHmSiSPjebjFK1=W`hO`4_B71Kw
z?SYyt$~WgE)GC5Gc!i`AqwH?3=ztx8mLU``HTz|>fe&zjI~(tQ;MgyJ7MsiaKMqb&
zncd~Xx<EF1*>(^E?-<E^alYw}v)x9=<=_1iH5lRdZ>YKHAju~jBz?8uxBkzpWpi`U
zYoxw<nOUe&F~nrO?bHS*A#HY^oQ&Q6RmsSAdTNDg!VsP$lM-h(u{oj>k`ULb%*05{
zbP|j}gB}w9`c};E0CJt(3BYB|gjuQ|h11Va%W7sI$BVW_^`4vkIw^Y_gFY@|J_;xk
zhx2FOBti)f{W+=P8JZ%pBU#EV;KYs<M at XH8SG-W3T}JhQ0r2ehK`#@xH}-w$3Dg9X
zvT>}Qo4b{r_LW_=j~FXKLfU)b1jzo%Np=aIcMi5F60;V#;2%1o7s|z(T?g4Yd!L4t
z&#btIpDgg+b$A!-7lV$G{|UwNIz~cY__GBz4g&}6sR<=s-~K_s5ffiMyL*0xXF*@Q
z4U^Kw!=r7W)O=y$-b>rgi2s3pUH*Kl;(xkHh3E6H2s~XyrwJUibQDVrLn!3KmHzDy
zk&8tgCG^S_SQ?v2ZlQJB%H^>4Hc at Y&fN<pTfL#Tg2<?HDn&i at PH%L6l?D$=F<~yo~
z&Gkg&Toy(RYYm}g=0=hNDc%K+=!#3Q8xob!EWg3KaTxvdx)Em%GLFlAA0RDMe5-WC
zAU&opbyZ(#ukA~pYE)Z_YE<iq(J^w at U#X at 0BFxMrzZP}V6 at 8^<Ooz1d at XN$>q=r?B
zw<W{q3<vUHh8Ls!<Eiz^=Gi2#cGH_CXEN|4v*|~zC*L%wX4C6h-%)<AZ+-Vo6U2Ye
z`WNN*!`8n-&Wz!QTK at vr?61RlDanfWAgxp!@p#>?LMBmVAx2jrYlsl3Mc{#h{Sf-~
zr}%eAi at W6VY(IN45x>O<)zbRdcvTav(*orRwJv;5NgGQ^w@$mQB0dv^(%mXTGW=7V
zb)=A}NRs37rRD8eXgh^f5vHE$^$(b1<7D#yfPvGr>JRfYzrGZ81_7R5YPs0U^-sh+
zL+*I4g at hYotooICG`HT4Iu;Q36yfT78v1r!s^f!8s9|?WPr-m8-r^kTAJWe&Nc0o2
z$a{GAM=hm2rv`?+>s;oUNy}wg)UR=6aMydEXkQ>scA3AI;4+sdixXUhlheHGZRQqZ
zM^ashn1Jct_03B{ZlGF)jK=#!b0xo5HKm?wX6lcL-K2`PwPk(mg%KB%jCV~jJvwDZ
zo`Jclj&U}y2aPgQ$wpt0?mo}p+*CLhY?ba7 at WkxHlWN6k!G}VJbhmZVspSeLvZywr
zU+b%4>H~|VyY1#F%kbSg?bLF6v8o|(FVz5Sf+Rps(M~s~teQtzwfXU$935M=>F+6N
zV<~?cw`$XYSGer|#HCZIkUK at Yd33Gfh2oN%UwVud0u0~kxEy|(y`C_hH|ukHJNnP^
zxfar!)30jC=P6AsD`xKyEY8^t%W6C5saiKJ8FKIbuxIUn8t3U_QJit$@t;p``THqu
zAncW0#nV%lhv*Hk62*+kRm at EkGhD?tPIS%v-URQBo84k^?Qt>b?L_Zj^JmA5=x=q1
z`IlBWC92<6d2bY1fERo7^YvZg`}j?X;y0!1mK-CQCrmK2JutH$olF<9>q=m5KcbSD
zOt1IVqV|Jx2?hEP{WF_HHC1GRzdK9pKQTq at Q|6k7xqa4dQQtH+`=c>)0*ldx7kL(D
z9w?^zmcYHxS^=!QnOx^GGn%@RG!MCsN at Jy3pp@;ZdN8Imwu<TNYNHqvuWe!A-pbcV
z%-6 at T;**J)pSfXS$n67+G}l>AKF~B~yE0S}JViw<)QFAt2*h1NJ0;Hvu7iCiVGMH|
z0?gq6{^W;r6JX~|;OTOQ+|oxwjDMo at MN-J-Q3mbm)U&V;lLSp{AJT8_!$@b#dek*<
z&@^`lmfiXuuK$8}b|YJF=~+1t^7>qs?;-7JU^%+Hs)=L(kDEBwhc4*D9o{4CO>{Z*
z;Zun}u%7Xg`@HA8PqCEDV4KLyiU)ZUpIxV_aPvCv9}e8Y=jc at x&o6kJPp(q|j-KJY
zHTa;noo5(T3ZXMWo_jo4<QQ49RmD+5AKRZJy at K)*to_}%_8&|R7gPa<-kJC?A+RL$
zK2<I?d2a&ReP8p$kt8!i?h8Js0v^w=_TJQ-lm;R1oZy2>XmapDme3i^6Pp=7D=-i<
zCHNqLI%=c$5~8yalM&)FfwDNsebDbTpe{42sz|gV#h=I$GPA0RMk`pq4k+3~&5n9M
z{5}G!)CsthjKk?4!>j=A5_6p%Scj(w`rcsr&JHA at f8)Nn{gcOXp2L{oa>#pSUC%)2
zMeJ0f!8>Kd8KX+u&Mx(nygEzsZL*u54E{-x4z71Zzj at Q2Cq37l09cp7GyKM4p-h_7
zJvof><Y^JDluuA3qUA$O?9_bZ)?HK_>#JiYv{p_X0o&GWSBpwKo(^~wXzhW`NWqrh
z53M9(=>F&Z=<9uyc50D!p1u+Jy$J85w9w7Fvk_N&?x3B3`S}53tc7sW6<CY-OFB%X
zH<O<3pD>Ot%)vYL3dWz0xfG25Bpt>07HMCPw!g^x_-;eJzNcqknzz`ci)M9P=e^OT
z%bVhT()+vS$97h*_mK6xx&FlulRL~Q6Ucgiz~420y~ECDn*`MRL7iS<r6XFBfUwO2
zlg~HN)Ox at 8VZ`rGLynFR9JezSR_rD+*|TNaqck75!Mx^AfMRY(4sO(cVf+g!$S*>U
zm{^oz`A-pRk<m6U$W|=y`6U8D&+U$p=se}@GQ}c8j;|dfr=J?N5re;YzY*&GMDcfb
z<^99>S7iuWHbR=ck9G63!_Csu11adMdF)HWc9(~Zd!+T;h%vCTT%AQw?5zmpfzrxa
zGU?0Gfl^m>)GRD8XVDB<vy3DWdDC$%yk&;8%gozJXfxFd*}hF-wOE8)w{MeUB)lKx
zj(2m<YeHHZd(haPWn&Kk?`|U=Bl?B2k^RP)UpN~%XtbFjO$gQ5Y#t**A?ld?+hV(G
zzcG;C%*1 at dMY_<7AMK?bJ{8(_c9#Z9zsy1V{{ze7W0;L&2>M-3?9%aGSVzOC3mbc%
zuQ%_C`!I%gczfB^#N9ep=BBI4=wt7YtL2I>WO#c8c+=@)W#(K}#t?glTrXYml?-pY
z-`9xdI&vcM%c%p!XgSy?z+7eKK+hZ_Lm at H${i(_fVr;T9gBdxqs6Ho)8giCUU9h)(
zMX08ENAqHwxj}cRR=Jspvqg8U!nsO8opa6%csp{e4?X=jBCxaYE0VyvZMb9q?FX!_
z?4GtQcFOhd+{b5Io`(33EfWZVv{OruZH)FrFi(GKpk!{<9+sbwNp=S3PR%s)vpu`4
z`p=2Q9E~=f3fOjq#UQ`4g%6ad>>!H2v-7m{Pd=MIZAslY0{QYr+k$Wf?qGobMIgga
zzS^Rfw*Qgz<_~ZU`Dm@?kJN6_^LVmiasnNk5m+o(hL`&|)Sed>)2u)#+JqGD at ExPC
z!tA^Vm}LwLeZB^;(4Bw<vjwBCl&*kXP<w><Q()A0&>v7e-3%q3l@`WoA9)g}=?r_Z
zeo5foBcxk9R?7zH;fctdxL at 4agPZ8-$|2^4 at jC`!>mbX8*WgO4O58J5D#}89o?J&B
zqiHS=_rPdMa5u(N>hh at UO59TSOnEacL3{0iscy?Tt&6hrT=mNBfxjsCsBd#_r+HN4
zbJB8Q74-K8H($w-AnIi~Uw}Pv22T=jtv_#JmrzS!>Ml2?NoROf3yFCm{`?UA;aqzm
z2~4fm>~gyfDpKFOz at eUn*0^wztDMo3B$@{8*uxVb?Pz5wc|%k~D&{;2Grr7cR_ at bR
z`1J70$4>e#p2dE_?_c280l)7LndOZ3td}!nx8mb51$!vhAXLf|<yxheN6)34PX#G7
zpZc3ihLYt;vHZwcDqbOL6m7Y58Kk2g9qR9$OGE9w^AiHovG?dNvOO!F8_HpB2u;F~
zvI}S$%)tb91$vo;@>MtoSPt{=Qu1OxjD=JW<ev=rr$GMem0YOn<{m$DJzbC|6Y^Xa
zn>%q<@0R(M9n}Ljcg?BXL2imcPV6*b+oyc)RF(C%QyF$%|8FS=U}Gh91Eguf8lhT&
zxmuLlE|!i$9G;p3%w+(~oeJD5_+^bhP2hg>M(gdOS-CBbHk=J0!B>yMV$Yd?tu9-9
zJM!0vZC+BN1+8E?qW1+s7L7 at coq+EN6LGC&(xBZ`svW-FL9X}0 at 4TX1wNO^9U%6~{
zje%~F4pDui^SwT#!h>5d9rEqK{E)A1EZ-)`r@?b(NAx<@&&5xL at QsYUEj-N5V@($1
zD9uT9$_aC at SD+}#oB}B!Edxe)2zJ~4K)!N&?(L$NijNfiT3zoT&QpHPFhdIhcQ%u5
z=zm~g<ZY^*pV_gxteU;Ux!SNSaOcR){A#LsPi=mTPN5ocLh#2bGnZLL)Q6nJFsqj_
zZ=_QMre9x1G!H<`t-XxE0kuSr=2P(ec)~e=>?!aznV&<6K&qan(O?6Cci(1#1WPY!
z>kJJ8yN3Doo(qt}Oc!Aqo)<fR(4HmaW9WJfdI<^cBD3h^_{{8V;03)cn?Q}|BU;Fp
z4hhOB^L6sK^VairLVgOl at nn+<1<g&;A*BcP*n_qOzAgBRcYcC*wr8Q<b`ba>KJ_5e
zytr+}5JNX9{o$?a)leexHp*)P3AuryXr<54eu2z5MrtNezbk1+nf<XS6>az*^`}vj
z8vlD4-~;9W$EfZuM$V<8iJuvK1-O&%`Hha~r2#xWfp`sdpp+Bb0eed8=UloGwBV`n
z8zs3zAJ=ctKq(it%|1r8%ZE@~rm4fZdgG2=zeUTFji+{nT^m$g3fwS?43ZtTfXopK
zTf&p&m;`bRai}|6!J at s0M`ic>Ns9ma0=fusD8$qX*)rp+b&SaCBb|ySwZ at r?w9R)6
z;x?ib7Sp7Jwt!j$KN0-h8nm(pshQMoHL9DelTJ6;E$s5ZlH(bEPP*7(f&NU0$F9K~
zAe+s^@hiEfL3}a$P~hH34b2x|UcZ*d)$(Xyaij)XLP$3vO%AK14%pjx#(j$v at Rd3-
z-Ug*kp$42k0YZNtSNF3}_aCrs$p1^I3CsNgcNC at r9$C4}T(=25R-b;<&a<DP$La_x
zyM3k5!pP7W>h~uB-O~o{M6EraO=f5r at Sh`J|5oV%jns4`MgTUDA0lQtA#f*2B@^&8
zebJGKC$ML}sbe+J+FZf!v$tnm5MWm&U8r-6oU3eGKsCsPw=EFhm-YmUWL2<1x+trB
zb-_}Y^(>kYtOqQE9-glg at I5hDPyO9t)cEtK$qc}8Eq)<M-QWFH&`Oq2lV9IFH^dC8
z+BTk71CNYf at HLTrfjxLi<X2-&KwS<)O>D3MYqFckt;)_}>!yXL!|qwNY_|JGx{2mf
zjd>R3q(hj4YGQfp>&Q>Tg+lhYeDPckQrYI8CQKjAIl2#DHrq%ZX{NPN*imD3UdbmE
zp!#(tgE>aapw*{%K7x9pK6kKGW*(F`M*4NaRP<LbeFGf(R5ASwaPIv{!qm|isF92H
zjsApEEHB(1Ps_VD4QnKe`t^8oX{^p%aWcfhd%qduM`Pn<p?BMV6{{Cg%i^gy*QVn6
zPEk(w{gpZ7e<LOI6!o8+GYs$}Z3p_5K~DgTlK@~H_=R<E<^{ejOZqdyL36Rd4>95U
zUDeEFp+h_itDqmBlR8FoQU~BDeYi|uV&O2}-Ry8>FeAfi;C=6Grk&}6|G&2c+(ZeK
z%7>P|P+DSX{-Aq&-a#go_dWfvn&vC?LR*(Z{h}KFpAcDhLB*OspP(9mUZ|<D1NO=<
zcKO5$fd>HA>}BiNJA8}kEY9@}%jBB0SE;tFTGizk8T=d7s$QpB=V~Jl7#FBB{1>P;
z%*k~?7fIoC>!jkNWfselW!a`j+p~D{K?^nT*@d1V?wkr?I%9*(;&-;F6R2sIU)!PS
zRO6nWln8PiwB4uePcM^UH7;)H8r2gpnSdzH(-GzF(&)XW_?@OJUultcCY4|Pl@@P2
z?I3;ZzyudjnOsB-j|Lvr<kE2_r4DucUKAIvSNX2s82L{%;1L@=C0N`RkkB}P@^~7Z
z{15B2UMGD7X>{-fCr2hkI&oLJ0Y at velBIftdrKBowQhJ&rb`Dnff3aY%F#%_N?==W
z6FKt>lxZ_SDb7I(Ucwt`!E>&)2Capo#L5&O5euE%#t`&9&sELk0?q*1!epVvAzzJS
z<ZM60=q#y}pzUDGENXBv<kkkJnJkydV*_eya`6$t5b3mLLromMDbywJurSOkCkGnT
zB|$0}8o=*|fjfgmw8s%md5u!wmhZ*W+>xIRseoUI(xhXi(Q|kleaamQhq6CVa8dQX
zLSubpR2yuV$C+Ryzu6(H01A!-e>T at l&C)lrY79#yj`9G6Bf93MUcO)7rlAF6_-Jzs
zUjZIfazps1h+kBIU$8_k+pm{ZSMZkryEU>u;*_5g{GsOsO=!l at j&qIYcMfh<y-KHD
z*ag`6MVdeC^ko3ncENLhpj4jWyAQ_v*iia06Q0AyPLOd_iED991Nm}#SvA1#YSW|q
zYT^-k<R)71%L~J>t3rkC3t(*zhHBvdp-^pTMl%Tsp_!pNd6V?gh0Pc1Wn(CLFkvX=
zoaua;W8|yuxEC-!G(%8H55?P_4Q(gT&Gf+dIZfQEv|b>at-mZj%2Sn&f3lDOgcZ;-
zIo%N*c at rST<(x(D_hmSu=}$}3<riZ7kGwU`|7;7Hgc8{ZyMDWz+ at 2LGlv4(cLo<}V
zkj#jy#W1(%wcIX{X4C>}WplfVIQ6DR#tQ#KGw?(yWG<sHasfszs61vB$praD4U|(w
z(&U8pEICnj1Jt<`?^5@}?k|wjeJ%81XaTr~pvL7vZ|hcQ1O1h{T9R_*^etpdx%3~H
zhnT+%CS)8m$uk_$1xa!e)R-W<q1GCu)>@@jVYF6ZJJj+FSwO2?E#`vJn(&MIm3oGD
zhL?oWVU%fDr|p6NtIlC6I$bTv|Gl=takbs at f7a#}r at 2~EZn!c^m|13geU7O0t#LIb
z{GT<}oHse569=8DDDHfXJOlQ-12sTo^I*F5Hh_$5Vwsy=Z^jhZYx_dUvJtrU%V(F#
zjUkh494rLro8cH4SOzesl^zmV`2{&O@<C+L;l=aVM&xuX=eEGk*aTb=6S#91>WC7g
zIPlI6)<eo>2m!Q9XW^Fv&IWP-hP)Gf>q1D4ln{PRfjiv<eiH(B4(iV7U28euv#95s
z8+Jrp*dW8c9 at 19XNp#m*F-d^<_RlB0Pg$TPTy6BcaK0{<gEqkEpjVL-5xXLvVQWdD
z%}B9mw2~$F93MN8?R^$_$~;;Yw<^-*TLco at DvI8Cb-qo(QrPuq4btLjVdl->^VaT=
zR$yT!+F{qEQw`F5=^KJ!;CqCeQJOCuf_BMpP55oVkX^BIR1f7|R>~<HM!eh>suyyv
zDd!IV5-FJ?i*@~f9E0iVF#tE3{jE`C!6<H<{}ZJ*kYnKP*eHbC$BiLxlp~7wg@#w-
z7zB2HqB45G?gO{RMj=ccH- at QKmlL*!7mXVOi(?Ry6h4H|&;42 at Peb@-Sfv^zPfa8@
zCQAeCsN%UM#%sz^+S6itARFI|ZN~BS%Ywpt0Y8g%?E8*7(qp3li1<~!mfMwD=8UW5
z-fL=M1s=G~1bEOE#jVnP!6DQFkDW8291;APK%{Tt8nMbbCC1|2T#N^*TLio`?Vbdf
zCh^!rXepsHwRcs2vh^mlU<Juuy4ai3&kf%$a>Mgz>8P9!l&1#u(L-)2O#Q)<xnwen
zw(4R$TkKmXRSAlIs)O)1<Eg=G)oocIIiln-V!G$b>GA}pqQ^cmFjLXl=l9k+*At7^
z+O2{oSxlAgbEXnrHM{1A9=vzLt5QiyAUF8;W>vQ=PQzb+{;-bJf^3T#CpoBpLP~)n
zP?HQ{)o>v#555Xz%(V at F+ycA`?<sLUMe?MwgZ~q_2c#X|!vu1UJU32v#4qiL_#<r5
zs_dB{f#OMeS)kNcqiE!g{O1uCxSHnK4JccxAguP)C}A~(H8116eGST>kh2QrXraKT
zz}ghOmOXR+i{@SPpE9 at 1f5`mO{Hf-b+gHH<R|ehifA?Sw-i&x(|DLXG#XFio<{i}_
z3mo{50mqbuYJEDiTOQ)#e6Wq`fXWH5#(M`<!pg&1s&hmWmRgc%=4L8nqw##YQmz|R
zIhWAu=usurCaWzA;BCIG*hGBwGB+eZ54j<g^pD+>q at Oo271Tcg_MOhT(@mb6{+uP{
zRcbz=b*^`l2C1PZWg|^Kp6Oi85HYoFL5C`=h7p at XOoz^Ch8)uyEVWUHNe;0cdS|tp
z at cRnUn>_=wks@<Kwyz#|w!h>gQL|&De{bY%l)V8 at l=)DnHw$KXVW70{cz+ at AzN?m9
z6uRdApoQ>5^9l058q>tdmN_7+WGmXz7GDkBD54e8Bmq_g;vmI3t at seohyBpX)3{GD
zA8_-r-CDljo#AzYUy;Ghc#Di`E^ICvVV{PUCI at CYi1`!b-cu?OO2dD_a7LP-qWRK8
z7dFe<ZY|_kDQg=Ud9!#4_>ffCHOS?r`ZnP?jI05E^{7C6i=g$RMf&2SAcZX*0O&tL
z#RQQ2zUc?*e}uwrfW97~A+2MiFL;E&9!!Rke=75Uv|;zbDy15ozc4J5Yf)>G8iIE!
zdXqg=A5^FiT?Bj7jP{RGo=3eAT88)8;H?3us2Tc`JhEtH<H*y^<pMd$qAp;{`nqhq
zLq}FXxgXF?zWVkolu)FXa1Zu<1!GBxk0r%dr;J67ytkr<#Y?*d7JUdwyB#B6HsdLR
z^bnnf|FP~UP)GQGoj~NxA?-=+Fe{WuyK$DpFpOk{K;kpJCooIqP*Y#<JEDfKt^ad+
zf6J|&k`9=QKz3udYprt_wW#nmd=$8Z*LFLiH7C$^j-QY4cuSP_IQJ8t1!!6>Yo-n)
zj_T|8>evZ{v0F5GaqTd_<MQ5A)Q2Q0f_{Hgs7)IDhWg>1Cr=TkTaCIxhJTCZsuyVH
z3prGaHBg6h4zWZ0SNz>O^|2eQ(O-$G*mpLxq~Dny$)?9>uk1c%0%?J9M3Wy8NQh}$
z1fj*KQ%D)SiIaR+yH>mu|2~(E=bM5B;Ei=ALAo2|C`Z)z5w*lmMJ7Q!%%mv~&oYGU
z;17xNZu~3!G9Wu~K6kw(<Zhk|Sal`z=`HBXUXaen#J6K-s%K4CX{8YXXh-rNA#|tE
zb0J at D7~Ed#9(K|KU&_$dbI+aMMqZ~)WINqSUZtLk&zm>W5_oLzlmdQRigY%(DwNz|
zx{6xQA50F|E^Z62M1MdzduUI{gmX+8c-!eN5G;5`<cMDUGFB?~bylHkz$=Av+82a!
zVGJZxFqCl4cs_A3DQ!FDLUk86%k^|Vw9yh2E(pLEX#zGmIc68V at lm;vUr#;rf6}o!
zRuA%L!&-o^9N-{<f?*wUK^=O~!_wQS=Hh0kLnj;P{K2GHOMq!MqphoLF}tLR_=Q9^
zDe}cHh=mrSOrrG2Kp&P9LOH;n;oN>n^V2}G$5A+6pc!TrRnbC44&Z1SVu%+XLoM8)
zTp9LW_%XKyc9G4O0=u~sW`8<JCfgvUqz$l!Wu~7qZ>J^bowVB!GAXC{kMcz2 at stI(
z9V`nOL1HnW#1fNb+$1i`Aa`sFCB;0Nwl4q<dAe^0{XvzTM$a3A6QJdhGn-<y(R}Ft
zBLE$2DA{TlUWfksfD$9^<@|sJfKMJd)8=a84A=`?xyu~#)Zzc7^95cuI4<|SAwLHk
zd(Kb--30F=r{4g{7_iKZr=+~|1}XOgPEaZK)Zap$dv+CFK9nOXwwoi5#ecWaX}Gh#
z3CpIz<nes^Wq|neAH+0=FZ?5hLy(`QC61B7*Ae2RyXC~lUn2|4s at VsftF@M1e?LHh
zs>`|hxdpxc$|16?Y#sN3b9H at GdGp|Tb_GYC59irEsr3z7o)o4_XT$XsW|9_8tystF
z%Lvp&v=)d-2`Af|AXfoz-hXRV6OD>&T at KE5Z4`2v;H?PHdhnd5HtL$oa&?P<Kd(7o
z?*_i);_Z~bznf7zAKEw~s_*aSG|q<zyUQoC^c|OlNpuym8vY>*zwJHI;40*<Kkeu@
zeyQq@#T|!yY5W=wFB(oy?>9iaN_jh{r2az;jph<cLaD>-Ajl-4w2(WbQ>5#1kgih)
z^&z0~?JGicp-u8;kc70foIXn%=r4goG)LYpt5zR$u1;!ku78fN;5I%}XR9!8Y;aF6
zk4Bry2&9pumfC1tWnB)$KMk>s&h=Xe>WoCn;^%B+8?)R)n9;K~w*^nIQ7VF879||m
z%_toac?<9cb57joqU>zIf5fs2HL8I^?uMK?keV9cR}a6>!7oTnwKRqYV6AN-_h8Ln
z?FAt=4%}sm%|<<4OP0_=piO}FFCW}J`!p|f^dF5Jk1Ph6;Vs1c&NRX^U4-{;Iba-Y
zIMCqTPMWCtz<b0)Rm(?6k}8d)4nB8o3&|sQkvU{3v6IE2ZT)PQ!NqeXS2>$hW>z0^
znj4D61msCYLzx+1$-IS#>M}FHnE5$AR39?*&L2?m*Q+$Zt>(&rONO2wYyxZ-y|88|
zS>D=vY|t!_etq8$`qftbY1Ld}B6Pl}?>jO2o&oQJh9RS4q<1Ue`z5gdm!K}HQy{=G
z4hI!K(|(t(a;mJy``979<MJ1U@)p-Y79{2{Cn~z_+IK5oBZ+vY7ti0X-{t0k3Inh3
z)&10uFo)EPE_Otdmcm*XVMps-O?s`XNv(D at C31C^Py*EghF=0)$nWJ^IWd$V15F3)
zu_>e%m{5(pS$gTBAnWLSx_HQR&T!rcJNGQ~&4~7?<s_OP{06Ar-MeQ;-T_MUPPe*f
zTJe$Adb9-?SQyv?tFkSUv-cSFJJ(YS&}9qBrP+W{GGI68I#n(Ui~gaK#0+?D9hIOI
zzlo~wB;fq3(8>qkCJW>@DEal`@?i#L711)xh}U6QDWhYS0_3Bnh%Qu%Qqf{UsvXhL
z8PSdw_d3-sU at wO`Q8mob9Pt$L<!8PSZ*l2VH}~25ZyZ($mKZ0w-88qLfsNUbcsUx4
znhCmvAp{-%2_ at ne@zy5e7i(y57S&afXgBoLEGEU%fYTg)pgjxIWTh{VnoCltQPCgQ
zAcqloEzT=2k=J&R2yh6}UD7?Mf8!t}+wn^l$XZuoHepOHeZwSJ(vrz_Z<webey?{#
z2Qp%JiyfE$z6UX;Gy`+SHD*6Ti#-F{u^d~K98(~N#X3cO2slIzy{a5I=}&ZRU=r+R
z3qfzu^kK)yxu*ek3h5%z5aaBWxF2I!C{e;cK>c%sL5J6`R+&i=@Ph9)qs0&4+G2M=
z0?W(HFr((}ov4*a7g=vRea_A^SyGO~H+G<IVLZKMEG>JNPtk5ag?E9}hXji?Rs9<X
zwJMexZHH^-aVpE8o4i1 at LXXVQ0>|ZF*85Ed7Rk)V`l>Vv^Vq at SjesF0NbxJ-3)!v>
z>i^(LfuIt2mzhx^>|m<*ao|3#j(I}hu8Db4z<Zz^&VcfM6KXn9lpp}^20>yQ`lt6P
zfyF%W_xDjR at tsV7;UvEfAUC7vZgs2GsBRSv5IO{*L!uf&zk$$iJ~Tu~E3bT4o2%$)
zJrF-n2Pxm1L_1*3o`)8vN>BLFmqUh>-95p(!TX1kYM`w at 2k9o+YjtHXDQN#*+Apg6
z)cu%J3^I;tI8(5A|KNyDe;D}U!9GqLf?OAH)j(Qa4H$Axz+OxLX!8EvY;hlj-*))@
z6a4-Ge&70|3FKxSg#P?Tlc&uylvYgFrCI3XM@*iddVZf~Ay1^4(O+MLdbr`WDho-4
z_2j*FFIx}X-JV1nX<XmV<5)Z#YbIt_hP at y{lst9Ac?WDGRR>hV<@Jm$rG7o$lAAwc
zPa<rwl=__3_lSk00rct`b^BF^3{pXivs_Ycoph!}(fg!<I~vnqmbksOz7l0DH#&%R
z0-ktF&-hC4O?3<8tBnv(DIwGrd<J4>D)wkBdyiQ-S{_ydZ&q$WzJ_Q!AneHDXg<iO
z at E<}25Zeji0_SQ9wL4R3In?m50)@m=>&%8WQ at mB)7Xhnq=y#R1U)9fNWBt6U{Y~GB
z`R%u2y1o_jk85MpOgx4Igk*C>r<PyQnHZO=C}w?!_H-x3PVCR%{nOdjX?IvauG>rx
z1o8t9MEueS^!BK8Ct&6^u(!!vCnf*Zx41peqfL-N4oZ=txe*}wgLCl_PCDbGWl&!s
zjL~m5lM$k#NDnxw1<46yAH4a~oj9)5$x5rrHzsHkB#!9svA5mq$+6Wv<Ai$G1#F_u
zTi at sGS39D4Qnwm47eOAU-x^;uieB2NKO66yISDnnZL|aLC-^6OI64gmkwMFXs{_u)
z_wD9rWaOuGvAvia6e!gNU!~gEO#{W>3G6uK>}KlTTEXIDhO5YWQV=M`Q=bEZccGW<
z&Ui0f;G}1Ovgqe$?nxX5l0-A40813>idvsa`ZbiBLl<589*q7MN?(5wvB2m|SB-8B
z%A7D74}Kwi9VO-h80CxITD%k2*za0vz8LYu?q-x_60&<s1w)d1`2o(KA|^V`^vw!r
z5mL;JH&+n9M*056#=pg(^k^Uc3sBlJv<O6ApfCo3 at s&!?0M)exGXNs$!e2^v(R?3B
zui<_ed)IfAV6Q6S4!<{6;{AAu53mHDzr;(Zd^JJf46zK#tx&2l{JY>e;61aTRGU(&
zbhzu9cGOq3^L+T_v36cj>|uSogyyOeTf^?L5;gG>-PiO?>$3&b<N8$}{=rzk*8Z1P
zbXT<^ge%8dS)!D%4g0TYMSo2z8^d$PTEX+*&d5 at GHL1U*l;NsU(Ge*;X{^*_DD~lY
z^v!rx- at Xr}z8dWvgrCL!bzgTf^PMS(e-#hpIwAK^P3xxC%|O`o at EG7R9@=zh^Fbj6
z-^^qp#H3SzqOutPamn~4SDNQndpJMm)kbKr0(M;~+e8e&*Xv=|4bmQ$E{Ym^D>qa3
za{8HaN7w8v=}0`V=yQ{E0%58=G%5x0=2>95bhN}zCy#oU`qI{KSaOW$RcnaKxq9QD
zm#-#x+Uxh>oiC!g8SOBcAEPP<VeUI#T$HNzot!ybu22)Me!b9<(nQ$TH)B6?^Q^1Y
zzTl73nz%yiq%XP^xwg at 6VNc*~hS(d%L(Iv*;&`f=+-RK!amDOk0{7zTj~mw}w9gz}
z`v3QsxOcCNiTvldMd4?BSH{%3NNIf$(2wtp_4<(A!cDwt92k=kSR6TqbJAgn5QuA}
zeu$kK%X3w3m<KLDu=qXWRpV~77jx5K+*DcPI9~dq$2w`?$+4T5WOyyo;g at vilS<gw
zz6!P5M*itHj^&R){+6-)meCaHafq)U!*BlKvo<a>53!~6aXq7WFkQXOyrtKA+d#dY
z=VnPcfc?;u)6s4<TFmF9QOp-X`^)2N^~GyNs&Uw_9qmb9rkH{C3otyI0Z%48*QF4e
z1f0W@@I0mDAM1IaeY7s at x!*K82TB{Gn3+P2CiHdY1n$G>q{WBKhmsGa97=60ugHmh
z12}k at Kn@iins#XVp&J?xe)7%Ool5rP_&!&S)@L<p_+h*BYpStM(ZF10JupVAIqDxj
zPH9=ZOfBr^e8tW)BR%7|+}wp6CqfW%oWY&J4CyY^%R*`d4|-oWN*(Y&0iHz31OLtN
zBtxE5wDTr~f-~TKB81a at B?_ncOXQ2b)n|TOpJ$Bq8RYCN=YQ>U`DmXhQcmbI at SfGu
zGr>+fVU`1JRKcSbSXmgJEQMf4;LXA=XdUkna<t>B_GgSj545inDxiHWLP*xRc<Y`B
zdrj+e<0Wdab)iC;v5w(1>8p54 at 1gG7x5k-qWt{4W(hiJM9f6iEUE!m?Rf>!&b#|DK
zmpTijF8}vZ{b$FO>KSXR#}Tz8j+MH0RE6IjRj^aKD?X<8VNBWIp1uB$<E8dOOCJm6
z(yzV6LA7 at _tUBYp5owI~rr<g69O)Ul08ibrzK*xQH^N-g{^<Om_uwqNi2?1am2%kr
zF_ay at qy4TctEc|UxYZN?>*}e#WA&cFkpc{DK-iHQ5qhM5;@7b;*s1x>)_vnz at 50f?
zTDLG`tzR?B0r^{_WCgrEL2#U?iwBPi9yL7J@^Kh98DB&H?lGKkeaAW&>4)Rs;A#x^
z**FaLIbzN47=bWu1V^rnAnRBEbp&1C8UfmPWCd;T9L{8Xz23!sE4R{5`gLQtaBc8?
zlurP+XN-%jAB(LR7kh9l_RzT4?y=ZY<6`?qW21&Ev0rA6#ahS3R*c0yGA{PnvDhu+
zVm+g=k->4XV|}<hd0gySjEzw~pgIpPGrQ-ZuB)`x&NH2gt}E_Sjxtxx|C3`ob;>Bl
zj^VrUIRkeqd4XC4XNnUMJH~RN^~me=kk{a2;<0o58uZ^Ra`@E->H>@lHFdr-zRfWz
zaZ;z?+O%O<ca&-{3^mU7pC5-=uI;gXT#sY;QuAMO7GKFZit+wS&Wv$6<5=#$<kXGJ
z*)v*ax3L55M3+-Pg?Uha9E**e1jf at U;%R>wpN4j(6)n8k{VKFK9oPdnpfj+inQ at xQ
z#%9NInbLm!U4$h&8T?;GxDm_~ZAFXhduxY at b04vgI-*r1!0V+EkoE2ywm4NZgO-z0
zGClaJ^CpnkCppt-UaQ_a$*=KFcILqjBS}9TFAXY^U<q&G^|E`HzuDZLB{1$1$H<r8
z+w;f1GV&NzR}PXNm&y7y%P!W=xnghDM5YrvSx0sfFFCFg{DQG<f%K3&pZ0~b1QUj7
zpBwGRxQ=Ut1bi2IM5~ZEE at jhk$R`*fC6?}Y=L at IMastGf;C(Ew&?(+>Tz^&G4pADP
zOE^`RBmSpy6^W-;?jsLCP4@|>j_YGF^n|+rVl84ttOVp=IIP^WEjvVrRWGeWdstgb
z#6^{_k=q4c(YjqlYaG#>5;yN!%fJ}X)1zbL^j)IbwU)g>@Q2ggyl8^_xtJR{$Lx>X
z=(RAN_PJUZEyOX9e;(v-VL`s1(BtM$q at zd3wiOVc38l@nPZTTnMgLXDiw40jej%Kq
zC&V+AuSG8jr^GL at eBTCYh;-nIDQ~gBDmC-XX2(eHX+;l&nU at 68641QhWju@Pi(H8f
zJ`2*l8^4K$=3s1RB4E^N+DRFoo93bgh)|)-v?3I^V^Dcj3(>51Vs-ImC9b>~zlKkU
z#nBGDha;4t<)O60LbgyURHH?<v|kH3W8q&2xiUi)TN7!o+KC+P)eI!yIU{{oNq-S_
zMIblyFm1b1FSc-N?5qbum1CjrD<Q_q2e)`jye#sBLbeabdpGt5d+{rO%og0QZi>~U
zgx8FoBndp8p#17jv3mGoUOzU{rsfRf_>?=`MEN4^_izFapv?nR9GUCXk<Ya)PLHEQ
z1yWMBnABMADzsb}{k|?WDt6RRb8IB|P24(4Nqd%)A*PU<b}IWb-NUsla5i0gLNmw=
zKPynGzv_G at W|JjvxJS`^TEr*qCaBjUu&9 at T`n;%{(Uv9G$&9>7=1>z4^Uy`~bA?~n
zFAys;%d6NhV`d$Qg^x|@o`O~Y=|1Z3P`k{`q;P7))2Z{eSabDftT*V-2rI=2R-^um
zm$Vk*nct{?qrk%2XkbsLLCN_A<otrJbdXynh+jeOFT{baySncMY&E0*?!L1Ar68x>
zuUR+T6~h;s*UT-bCoz1XnV5e|d9}^ivi_K=P1UXzbK2BmM(o{dX`LZX_RbJ9$KGd(
zDc+f4+GzfR(?x at 4db>*0Dlr<b#mrI at t|o!sR*U!zO7qTa^5$5H86xMI(XOIwgqF=G
zW+y{oJP;xfdK2xm0lu-gOWf>*8jv-#7iy`V<_mVA+PMT)qCtAfUxeQyl(>}`NA*&J
zK!#^X60GPA5D##En8jEKFQj^S;~)pqu9dli^JVs+HSGn;r0t`uxt5xK`6uN@!H?-8
z$K{4YC;`qm8PiJu%>TVWcFg)1-ZfL~a at Bh{x`22{fpX$G@~>$^c5ut^{NPU9Khj`(
zR`9E~EZBFv6S&*pSBE<UKfs3C`2tPr_4m&Zc$!aF{d|5~7WNLkr=iW4u{XV78~0|y
zk&L~WaSmc{(85BYnr at LAfT9nGAAp=T9VG21fd^_ at 8m-+B@gK|Rp4^wyp8*hM=u~@`
zSyS~rfjvc>zDLx>-%ly;r&=@c%;gGH!3wYfYRxAGKfy5tRk(|zp8&;4I&Q$dET#}h
zJ(&P=RXxL`SS~A3Rwq$v at DGVG{V_7<3)DA+d8>)nho0|1LY!|t at 4|acSZn%+c+cB+
zOlE>#3E8v+<}4u|Ug?}gjY>V6g$^f3m(VhvUKk)|q0B&x9zqXytE?+$9k`|?!)P0V
z1zI6<JaLVc99Rj1kiCo$v<7Z~77R)Yhk&b)=~X>}7N9S|uauUIO3Oyb3EUC35^^hd
zuawzo&w|-mEWILRqvv6~Ljv!3;$G91HHfv3a{e`uQaslsFOUNKP7s_e^!Q4>H(soD
zjC`u01wIvW&N3(66Kv>C_0CqlvKXYNM2*b(Y>w!}&tz7v^Qq`Gp&a<k-J>?xBc+00
z1`O%WcH5+Y^wkC7LY+{etV(=MDDPL7JxfUADX|pe>8itOi0$dV5VZPlJg=^(@)s-l
zZS)6FB0*~C9zb0>pp=Dp+vzkfs_?fLeT{?MPFG1^0YpOGG9xu8C2_~8pxj?&m0u4$
zzXxw8;QkES5k_H89TAm2IM>rRsTNN!g=+HxkZE9-I9~_cxd3*;O7qQxnO_WR2NFZ~
zT!7zO=qX?6T=Q<?&VhB+xY0IPA=)F2;R0B<!l0>R5>U at V!3J?KE&{azrPuX7(w~4n
zMS3|=b2_(QtAwljIcQ0<m2uV2_-yWkOd`OZ6-e+aQ4_cuIO$OyxidDahr591%Dx~R
zybW)T at v4@DW|covX6B~8%mU?71;6T^MDx)$JJQYQd<@~pFV!ml1)Lj<gY{}gtE#{q
z{aZP^%>z7OLD|k<eApe_O8e&J?#!EKX(ID-n=BWZ6Gqntra;=Y_ZA;JkC;dx4>*t<
zv=|orp at ZC11>>HK*84j$(7M-6#c}vfMlCFOw|8H{)bM6er*QsiWo#^ZK8Wl;W)|q{
z8H)WxotV&@1C*a>%@DcXlK#ke|9J`~uz8LN7U$!XKkx>ul1V7>-UjPnGEXH8e%&5_
z@*}&Q&r{oRr}y?geLpAYMGbJ#PY<Z at E@<oR%I=;`OL3kq{|@#g>}J&ax%?Z2J0Lf{
z7azl7#mAcgaR}~DND07bhuoIA6Y_|_`#N!lQaye}^}Y#v)Clw5qTD^iID>$;VND}R
zScj{LQPpLOXJoWrZh(C0;uQJ_Vk at N=>kx-PZ4JsAK`4As$c~5hL9eo*?OJI2_p!S-
z=iIPfNrGG84<ARmI#gp`LMK4nM0nES$$0%X;K<iha%9!JYMgiAb5|5)&pJ?<L%!d>
z09u=<-1}Q1U3ALPi_0(4pY&Id6?Ec<63oRa;6tE3sR4LX8}1vbQNqB50WFJ#7ebi9
zuyiqa3OJT`<;@U_8nh6Hn&xv;VSk_>&h+3{A#I1wmBD06ub}>QFDt6!A-*4HI34o}
zh;h>q{zF=UglFI`fHmL{UJzDLKO4t7SPSDb^k;QnA95o;RK_tS#2n@*Ppg5pLjOYy
z^xvTLgrgd0307t#k!nI5$jTpIv%hL0C3_LF)>A&FS?IkDB-fFD*5HjQToZ&}@4Q~i
z0Qb#wk^Sa|18*Kr!JC9Y<EcNzb6dL#_SQ7-8)e17&&=MmL(wYlz&KcEuQ(jHLPqv-
zP8&#Dd2#46dslk*d3!B30$hL2OE8M_0!Q<Ua`#VijC_7vkugi-w*ZKH0okZ<bt%VV
zrOTCjp(&2&SASDNsW1;3MUxiqjQYF33aKr#XiCgWq$4^VsEc0%So{X687>rIR)(>6
z_X*SS#`McauH2}GQ9QJ4Hhq%P;X=HjiRmpzuH2#?o;E&@bZBgajz#z~?Zt~ulC*Jt
zVka%r>2yHdD1_a13v*ifx7BEz5h#`ZZMTrUR->Ul9<GLPA%=&Y5JKOKcx%mU<@90r
zHNm5U at Hs1&kO5B`JSp%b4^OwICSWev5iQt*=N-XGg5Uab!5r)Vo=SuMzBV#v?*0}s
zcOTU?GO<?cwSm&%*&|O{jUTU@>rv?%v+J2*r}Xc}jzFnvZRwX0zyF2^FOATiD_?%C
zlY;BM^XqRCe*JAa2QA$k)7At&|Kn at E{c7;rFU-&bG3{5sazioteoUjG^U7CRcHCFm
zLZ|0jUuhj6xi14L!0_E)X*+Yf^CCR$MY|#$W>*Glp)AfP+F>=6OU<-EdRqD<_$c-P
zQ*bT<rBrL3V*INT#ygZsZDDqlp9j8eVqa;0diO*;>7co|dUO@$wlVeVp#(^%)*B4<
z;p>$Xi*cCx*kmX-rF(LOxBkdbNOSqsI!|!xyxcUPDm#hW0wIf#17%S=ct7n^+8&ST
z?-MBCvqX53tas?;xla%?V6wYH?xN&kGwtk9Tc==IOLGyxN4I9oKMCLsNU4VumX at Jb
zam)*Fo}K#Rdv12oD+y_^r|;~}30kF#_4=1f>I<3|0|$B*At+0^%bl}OAijl^5C0f`
z?P%>ZC)c+SxsC7|pIy;B8u_wDG%EZ{Sy1I5#;x5SiXX at K!9OE8?F$Co-C2S<SVT`N
zH?=c?6G*bIPspH)+7>vX+4i;tgN$+#iCTVIyl>mKAf|;1b+5k$L%jyPaX-i<X7&!{
zHprOn9fUQbcTJT$tTzJ;O`{zrr@=ZM#P7*8zjf~Gf5iLc(AKHedA<@_hV5G3 at RjVI
zA6t88D*Xk-K8*3xK7}_gzM*dRG{7y9-v=Im2T!$r->2!H?9#EB5nkZj*#PGUX)j<w
zzkh;)>pGQ~GCWBid4cu-{@sP%iejr8*X8yrdLqey2lXVI6nGayxqqO%J-R~3bHa=b
zBYwK99WGRC&vIio#kHfjXY>YWa}(W!xyIcl*A7p+V)p^kHDmZHW>do*$qm)e9HEq+
zp~qym^k=!&Ta0ul#LCPdr|_!j^nhdJ+^z3(!7k<WV_$?5JmwYD3{NsVDe$BUp7V8;
zrR0gqo5(u3mUd7MG4YUluqN0LVh1^-?K!)Bb%>V%>Pit~V_fjkXlj8g3^XaH9@=H8
zWr#zIUisI{YUP%@MrJS{r2iba6bSjcD9S&t9XA8NUna8v-^ohMOBRs#Ess&NtvZ7d
zISgS*gw%Bg48eN3m2>Ie;s4Lyg59Ce2VrH5KI9J<vAJEqhnZqF4ydJDBXBWV^cjuR
zMr?SRBfHyIP>#Gxi$k^Ve%}Z4=U(U-`P+Xe-+kA6`nD`O4bPYU`gefB#iDi3jeTst
z#kH18uuaWmPA`I$_!WQm(J7~Mn%52#iaE}kqT%L`ow-zZI=8uLz})K?Fw-2K>}Q_K
zJ!Kg%(GpPyoGS83Iidz0j^+aASn8@~lU&uDPE72b)}My<ekkC(A+BwOK+!V~<of~T
z1WVhBAx at c{yhtZqCH at _yW;_)|sYkINJP&1`y~n&ap+*{aMWa=xXt<8)wF)XTNAsMu
zG*9u^&QR2|bbAjwZ^Ca8BmeT=`2SG%_Tf=g*TVQdA2V}iGD%L70Rr-ICJ7J_VIqjp
za>L0mj)|smpi$G2YWR?1Uwun2wAFjtvL|zZfFlB8pjL5E46(J8_KqW3+fD*X)K;bS
zwDe;tL>oh<>Lh%PahUn7wa+95>wBN~KF|BlFL~zdz1Lp*d+)W^I%n^-04jK<Wk2)@
zwDgc?c#d2G9Q6)j8Yaa8wU5yq9y4xNq=lhYcH3+M$T_(gn45d}7GZ)GuFsq;=n)gg
z+G2YS<9l*K8U=21TA}aJ0FC*pIXf-Kod at 48C5Z8MDIM;c2VCDP-XzTSi)}Ag-?)=g
zhw#11R5F7sBwo@&zDIVD10+WNLe7x_u99<e%eg*J<5}`tYLemZbM%QUT>QDP?eef+
zk?_33cKH36#rz}}^AjJpG1bRIO(?{5vbbk+anGh4|AG%W1MH^^b|?osWaQC*XD|zK
zKe at bQ7RO4`8^54r^!-?`Wida_#r$|Q=2?Bg<uw|O>C|Vkn9f{G=V;79-RPTxxtN2a
zF&%n7i|NS4bd1J41G~kdfvbFkQ&ZK<^`sUsw=U&kZbNDgbA72w<~F4&nA at CEn7ceR
znYk^gQs%BsIheaPB{TQll%2WjQWA4Fq(tVTCE<IR?|b at c=2E?dxthM5xovtgb3=L)
zb9d-I=I+)Tn7dc6WA5X+hq+;0W$pppXi=wbwCFkAXwhNaXi-ErT69D=TJ*ARv?!(<
zEjp$fE$Y#Y7X4N?TJ*MVwCEk(XwgaCXwlzvqeZ9MAKv}Qz+0-^X0Ok at _(#K%e0s at 1
zMpMWJ>H(g89Dd6u8lCypBsvo~v at a)H=}f%ihj)!>Y>=mu>ofOl2&jH3TR6h8!OE#@
zUx#08md0RM2=_w|;f4o*$~E%bj{QMc(QhZxG9{)%9*>Lr$QL9Ph(VVW3&alPNN0ob
zCBW&aX9Zax6?A#=0>Tv?1IWyxqujcpqvTEa%>gPsj&4cvAbY%`nP3l?kZ23io>vBW
zpuppRGni1Ho$@8*SluR4;d_K!1+`Bn`I;+EJK8L5TnASwQm!dTvv|(<6I)`|Cv$+}
z)zOwuT%psl7+B)JUmU>n$oWDotK8ov>o+M0bBC!E=vC7JObJr&O{otPvl5Vk>^H)Y
zL*YYCS>%@Z_eul4r^$7gDsdroLMu!CF)=IkSFH at oNu?ihCY}PEvw%~JIE0XKsb6d5
zsiT0^qm?tPGX|D*2(WI-VNFf_M5{<02CV0`3WoJZ1Ivb3x8<;Ar}k>oQ%?ZaQ`&Tf
zb#x5Y${g0h)Fy34Y8zlZtj%CphsR+3?;Msp_3zru)OP{vd)iEf^~4yg|HxrArtZ=z
zQ>y{%9<7pLZ8Na!h_yL~<xe$evr<a|>o#o`!}{(RtX(;*HL2^g*{K at 9S^_)>Vyzy7
zwJ(SD at 2MHum8mNM%cWh(u$GR&`f(2H2dNTmPO22Jrf72*R?Qf!Xbx*zsR_na!*LB}
zwX0|y%(3yflLxbGgiScYMhxUIC6~kdFt at t3*xnk*p`FdCrwPuCx%8$+l09Y24QiyE
zi?ah}?5m+JHpAB1`;y#175rRypAS~dV{|gee9nQ}>FKb|uo!fiy`byj<!_FAw99vv
z(&ZNeq`we#389{&oMst{r|;W`HQ1qt*QWRP$^B-{se&}r4t%1Y$oZe0$NDEoVgJmX
z9ZoDo9Y$y&hxXQI|9MUB+}&>%HS8-Gt|ZGqc3RyQc3-WnCr)bf?F8wswta^Teja#*
z-Sw)xSK(JvVOQCsKUddJR(ACk1H5<x6%IZLyh^FBh{^|S+qpe~pKfbhMfQ>+Drx+7
zXM5eDX)^eeT<RX={GrT^WChK8Q&oAQkTBWMdlS%oy5|#3Xs^#KQfZrXn)DZ^6wE<h
zL2Z5I at U)&;;+KWS(UwitR}FL7W4jwp&Fo)+diO(|Tdu4)ReQ#d>AG$&UJbQdjk*pn
zkAwSUz|lB(=Dk_J-N|e?cv%ey`F5{*W-*k%q`f}-&hDEa$Lm3Qf2LRjo(=23QCn{r
zrtHr<xbMx`A!w7)qWWy%1ij2(DolhLj6ZZ2jD;BD+KJ8&li^CYTU+m2N#sKdftQ;5
z+|}%zdbZ#r-8wLn&S0&W1LJcq8=o%Vk)VcHigAB4-IXri(*+Xi^_sH>QZW2QfZrT<
z>!l#?-i4OcKfVM!f6<_6h}reb7L7fl_s?dazW2p%8<mHi?wj0?`uj=gSJ+wToa~5a
z0!CvV_<T&-Nl)Xql-6(4?qneDJXDQ0%h&H=-2MJ^?fxLF4h8LsMyH8iAw|OuF-YX|
z0hG%dd2-i&p=kjrT-r at a9j(Obdx}(?=iXT2D<O6MW=jF(hE>%;fcLM at eC#?4eW$|g
z)?JXFnY}x|U91Y+tcsFV^Tf;bik?XWx2vlqD?o4Z6_Yt2#{nFANE&vq9@>ExkMyEk
z=rEn3OCw(s|M at m?;2lq0>=6vT0BEsccmeRgD~N~M=;VL>R=7M#l>TC^cG04JTe_ at h
zt3Y*9anam;TW~K`ofvK_)>DS8#<26X6^rKV+XC&dXU50GLp_LjNE(sS7cDxv^k`np
z+#y$UnuKxHMH(<}qmrI`(Y;4+dDZc}H=s0x)gs`!McUi2Q?-+g)D_KM%)c18Sa7j*
z|1aV*@T(Tcm)+?lNexmp1-M0zAH8Ex#QTLqo9KH1PjFL%teW05!7hDk<1X$iHF^1-
zWZ;FnP!ov84T?<_K*?IpnLujGW{<)CeWNC*<H&^bBJ%R><O6eqFBWJV;;sYkcun)g
z;5(^}cs^kUxt^>gC&~L<<5R at u52JogZl=0wvI6V-A#_taKq|VzPk6Hm(gHx+LcdLI
z{s3)cmxOu&Lp5^LDjNyuh!={IT at JmP`gZ7eYJI3D^{vorsc(L;6u9B^Fy~%H*XOX8
zS08+qQ_mas^2?wev&md?HE`+IlN#a%UcHy}kpc1%86qjb3H?6R5c)&vrqDa7x{#jo
zhW?oHg#MIrhfb!{(4SK^p}(XSh5njCiKZ-dE!6m1cykqM`#r2RK+98epbjtPO8;B+
zmi?T1ZV|f;hW$`MRPqB-$}Plxup0e9o>o^suIN^Lrt+V7SzWzX#Z#A|u9Vr(M?_jf
z-AD&N at Iu}p%}ihWtc9DZp+Ba^3(dBI;_;J1f7Ab0D6ZcV`n&%1(7XEGXh}q02~Vef
z*9S}c?;GYWOZ&a*gPp|a9jsq*>C}qZu7!)-b&XB_mNobOJ3$*Kx*MLe^u_R;tuKP-
zmHKt?oTD#<=T-WAc+S;b at SLY#1y7eg8=h4<e(}0muYl)#9W7Qa(5J%l8XfJXEYwTk
zd96MUp4ECW^rID8YExHJ?8EDHt8X=}(arE&q6_f6;Z-?likV3PA&ib3?QqH9Pntfn
zN(}S*=q at 16Ft;}aIGneS-&WmX=KI{LEUCe6F--HJ_ud@%<B)0KiC_?9>gf$ijLmft
zgVFf4q2=d=#Tq|o!g)@AKp)3>p78-)iVReoHw~13U_R-CTz+Eo-{uJPeIxX}y;}Xo
zhQ>$8llpxB4z4(N+Yv{u-M#9-`p{AE1vDWcFnxgEW4><vyO3gY=$O79(#Vj;=HFq=
zB^G~N|2lJD(N}2#j#=nc{Z2 at 6U#P$Bxc=4L*Sa;hc0zCIOPTwo{^kDVM%}hFS8oZE
z&*q-lwxH&=HK|H{5tLQ{sjdFK!j0~y53HvHPrR&GrGzJ5(&s`+Pg8&dvp+nd&xFzz
z`tBx^^s-!O^VGYcl)vednEO|KJYY-*KX5W^UgYxSuE2PJgmhER_u#8C+73<@bmT^G
zu%N?rNJ8Fb><Ffb*T>)NTehvafsdIMEkAmzF2Hm7D;9d7=H`4)edhVIBlmHDGJfU1
zql^&0?7xeL?fhn++Xf}6)<yQCx5XwbYB>6}-`eyNuPPq%x${(rDT0`<b(uSwt7XZ^
zgGl61ss5>vNA68(`2{<D4<w8Quh#du`)}&A_Sc<nJr}&VX;3ppqwUm)ZoGoh+1KA>
zv)#6m;M*=LfXw7geGI-ONnubtYdXi%j{58+SNiGby9haFI*&Ir+D9>Xx*2HieIseX
z|NSxkE#NOt3PU{Vsm$(3Kh3ljjp*LtnAJx-M<FCQt))J5=0cA(RoKv?nrce&XXyew
zD^ZU~F7|^SJG<v^4`y>XGZ_x*>I;m#Cyklr3i-3}WI=xAXKzm#bS8t&U^Y`~HANl=
z%RotdSyKWe0o)5+0c9k$SdT!yiDx=AXRh2n?G(T^QcEI#pdY^h;eM9jQg`$eA*Or1
zJ<q*L%F}HCTiRnWU=D!Ed5x_^JTB;_H$|q|i!e?5PTB=B$|-do<V8}|JyVX0{&ie|
zJ~1^F-(zCi+)go1x4WHocn+ZUO3OgG+v&(-?Jm!s4(%?_uedbQZ$C472IK&Hu4ksR
zo~dA5&Sm8RcR#IXGAl7(FHKF!l_<9F#`2`g%9BURD`(}Ejh6Sn{-wNfR$dvF2Xk)R
znAvOs>Zd?#UjF1Zwae5|dPv5Z+abfeP3O1<!&X}F>-iqp-U_@<a>N?bKa&WFmtoJV
zC6ciG91UtQwL~=c&w?BmR4Zn_TZ}x_&_wMuw)^iLuA|hgwypR0h)Yv-Gv)PyP_19F
zmbj}N71b;4e8cMOC&P7aSKInF!T3g!n3p(VyrqL#iTCxov9!#sn%Z02GXYAOQ?1nS
z-FXqd$4bkLZyJe{*O%LsG#!>|Cf&ctJ%O%|aIv$-DbRE|YKf*ioyjzyKhjg?RZP$M
zoHiG%NwMKu`0hYA at B5+d=yRPh1IMlQmY?|)cHC){bbPsYM*l^WUG#H)7bmGj_S at U#
z^wVs0@~~!>picAvPX#)g-W3eu4F*bk=H>J=yBfk|4ve1Y6AAa^i9IRz>d6(^V|xyt
zI^Lh(_jbRe7Vae-=3Z;R at VIji!FxOU*~TC##?ged1-Bd}b~25c+5&qNwOHEIuB4A5
zeWYUgXip(fpQSN-2WfH<%PygPLKlCir<*s%(-_H^B~3bR=nz4=n?1sbkAYn^0!x#a
z92N#n5}7Dn7Jn(1KX4M-^3OD7?%zkKDmwuz<hQYv+lJ>5!-A&Z%~_ajZS|QCcJ at fg
zfaYYO?7P=6O~=3+4}3HbUSw~pYa$$pEz*eZn>0WAZpx`00BZKFp6PRWXGQegc29c&
zo-=AEOa{GTAe^Yt4(#TeWWvsyG!c@>6b at Y6-O#=U+_*-P0e1hpg;HjPqhX)|B;W6A
zD+bD;F26_ZBM^Q7H3Wa~2Gcg2Ibz3q4SRMZTce99r+MfM)T>HopoUdup}I5~j4V#_
zL)=-RKJ&sQJl$j9w)?at^ys-D;=gLrT0rK at 1HS)%MWzh`_Bp^l!lzpqMQz1z8$&_L
zw>LwYW9K)aeyd!Xa!jM0j%I;g^B`$$`S}e{&NtBZnb#+ki^~FdGDSj7k%wQQTjJC8
zykRqC65EHR_+|4m2`sJl at c}}+0_A6}zRZFJ>b1Y}G7A<lKNV~_$o!m53tsE;iD*?q
zQ&WY^Vv(&rYrCTU(x2)R&uD at S6032)zW&mm<#cRQEj#i00hDT at r~B>3-u3XP{nwTj
zb<QLL^{|iB11Q5Pf?6nIxstzx&;Z_0k8N`1VAmTp)=dcWgh_VPcEok@@^%92svdVM
ztA<t*!b^xuuWWDVGUK_?#HUOvEX?-(_V61`%ZU1lm8f+3Z;Lw~eO>k_T%A6ysf;ME
z=kKXGRzsY0p}&&L^C)tiZuKZdb-LN3 at O8T2Q3%kfNo9ohDRk1nmGr>%Wo;Eip;HeX
zfbymty2t0F1p`<5WMUhb3sQWsECaV$L`%ReggA-C$t=zeFbBB#;EvOjVwvP2MWx*b
z_V0hAX(vH#fF_TR_CUEl(i09f4HC8A4y8?h-Q4la>tge=0MSdDm+d6F+_ax4XxXTF
zSu4 at 4?Z586nUu3u0M-r?P$%6wTIU~+)LEVmtHr2w`IuUl<Z4}#t9AL9T9 at Q%T{5=T
zP36S$hS0uK7n+?!j#M<sG14XS#l-epZLvb^*pBd;(4>J`K&3&x<O!9MZNn1n8rlZ@
zv_L2Y8guJWCb>V7m=O2e`U=USHuizVbQa at BW+Wc(pwu$-;K1VKR)qU}q%>*6Z(JH5
zU7QRKGA%2x`_Dodb13hubr|T%?Gqwq-y?L9n=HzUSwxt_;FBESqGorkygvJFuE!QJ
zyGdPMObB1Cn-_8NcGUS}dD~Y(l}K4<k(=~LQ66y`0H@<xogXfQ8E^9fzn>|@yfAJ#
zaEM+a<scmkV<y-wtci)b$lSe<!g at y!SB!S}p!epWCBE8=$*p)+c+ff|X{+gh`i!3T
z)2v<AD3A3EZauQ;2-LVqI?~4a!cw2T`7h~LnYGJT)6=8Vpa%oY{&)j at FTNykG#S*U
z;hEyYOYj8Y#m(|J at yto~#`H7kdf0skY6y&UvHsuQVNY&z3u at lbLuYq{Z%&4K#2aG3
zqYLnyN+%C)t<N?Mvl02*pmohEva!8xaBKUz!3TXUWD(S*@@yX6I+PDQWv3_-fsM{i
z7 at dc)ri1ceV9=`i){((h)U_R*HW*B5$xX at 4v=Z=&&KA<g>$A7j5rN(k{sCH$0!g)?
z+b#-pT938k?WQUk@>ON;UtUEy-7L<hwxa^6LOq!0@}QR<jab=;nuD8<un|4dHZq<Y
zCiX}eTW5?nubXfzb$;Ma!Obs8N4C1TI>3(1a?8KX>%y_Iu<;a#F`g69dNRJRAp)^>
z2{3+qVsGO4q!qO-Up96V+1Qz3><V&YHx<iWK3c2gSdO&`B=wjHA&D1{v?XnRk~IO<
zuGCG`HVC~p=e|Q%W8FKiN!kZ~)+4&fJCbhl5?&7RFqcpl#PeQRX=s)oE`^=0r324)
z<`0wL<`<<yS9{5Lk|{jWrjcU69GN3G^`u{8bL6%34bf=<=g1rhED4D8AN)6IMSO`d
zPf+_9yVWqQKKtcg6&KP1;CszU0sAx=1bPB~JQb7-${T6%s}L&wCY2K}CWA at g@Df-N
zfHhozw={8AJX->@;dkj*B5GuX>RgnUc_LaHY58G^*HxGV+Lu+YmUz{vNSTf(-BqVL
z^To)Dl%P5{<S^ToL?LA`s{%L6AWB<pRK;&cf!Yo??d}Mua!gX?tzrjV`WCfkZtn;N
zrmOOUV#nseK*tS<PgJK#?C at MH$UNL}<0hhV7BSh{QP!~{Rol^$DePF4Sep!Xly<CE
zNvqiL)x_G4yH#Qmj|4g<cifSh*Wm}8uK~`cL9V)>jDLtrHKp$Gw+X}Nxx<{g?0|6C
zeLj#{)_1JGut^|-pYSvMM3 at I7vZ(EKB5cey6F<?fT at xfiVD?s9!|uf&!3^VJK5;5h
zB`hnLg%EkDB2!2l*=%C%AeSmj&C(N)zGPztxWO>Qlx)l*u3pTbm%OGhVbBahjaajx
znamHAk4p-f{AA#;`!E;Gri8;Bp83r#PI8B;@t((_2UJ<L?kYX>r6hmoKNw`uq3`El
zKRC3Q-60PXb3pl^elWPdyWgsrj5n7bE~2y1GFk`MSK4nMh2D$pL7QpFUy7?Kcfi#I
z%Oz&<+lcLn1-|)2)(e<x(`}=vA_vw%3Xsrw5l><OhnDtBZ6^LJ#J=Y)-=>YJpKD1W
z`Yv!6bx?arogXF#n^C{x$w>#l+EI0K!a;w>)h8VX at 93C+vgqLQjs+(R4t}lUnv;14
z at 9bE3QaX57$F(O->H$)s)dC-(79XG>L!^(Qtwgkx*ucd=?mi^p>7)D|da2h1vU$~m
zD!^?9EEl&Ebp<iMoWIkEY2yybAdxD{EyS6>qnAHp_9~FtnWyRkN*vKzL-T$94wWM<
z2lzvF+{eWoXor)^z5`V8ZJ-Tpwq8rWh&o^No5?lAJYvQ2!<0uB-l&=NQBJoAP%U{;
z!O>M at HLZu)Q-^lW<(7wb;@JW$XZcxjt<2@`I5Wm-D9hvBQ62b|yo1WBu(xGv?R)B(
z<ETH&>w_9DduT^{Td%j at rn<G3#JrGpeVJVeIYW|u9_1*^-Rm-1Nva;&iSIAkR^l6s
z_LB`f5j54SLN4z79qskKOZp2`UTS&9{bx&<*Ay5}+rZBFJ|+PTA*Y4)Ca#BejHJ;N
zD0 at kN39St|)n#G}zbu<Mc at e)HK)(^GCCuLj(t(?l=H)bj;Muz)1GDk85$fCZx;S;w
za<}9wqFs@@d{s1dj?={WbmO*AyunM*BDRm at k$4&278>||yg9DqGy+b_g^2K};fvWv
zAfjyq(_{kPlGjCzzzh=54glUGO9q00n#X<+)=v4JA-{|~o8(T;&|()_F9ZW-tx_W>
zogY3*L8kf1?j9j2w8eZNyfn4atiMeh#IIN|3xr*7pgmSC+|Sb=H{43h@(<WMg>KaD
z^iZY$e!H#_d>5H}vrcf2`S-_x!zGD>$XVmJy2L@$DhGXI_??=n at nie~`<~|n{95Rj
z5x843ji#;D%%lD#nkD!B5AmfjIMy*`*~Z}Kf!`}Sg*&whNLx1Qm%z_ at 5G0cl14>cH
zcn*VoKODif(HZeF7}u+TX37Q(En`F7M=;Q8z`A&uhdi(X<clxIrf594vtko9lA7y*
zt&%D!wC`TTECAx264X5b`zrq_xMr&KOsU7S5|dyr${ME(Aw>bqfkJ>>0K8AY9fG=A
zjoct~0#B`F{?2sq)Oo9wUYK2VYSCu0#}Qd^%o3q%s at h1CTOyecnraDeKn?@MWkAGZ
zR?jVqvypJ7&!fgjb}oZT$MU?lJel>m3t5a;Z5fG?k4cfR7s$7}DrH4j`=M at Yhu~FY
zfSj_boWN&}M^~_Of~eI*QhG(1%oG(evt8QNq!OzL(s?1YZlbqR84@{CwuTT{l|{`_
zM9SFegI0)6TDAr_a<vHIw9Hsnu>#b=HIgo|7gDYMf>aWuTK!q7p6ayfodCQ|;8&`5
z!S3D7Je_tV<|RI0#7(9nU0&~ni&#%z3!l_(@W}zmR~2gTkrkrP&3)_n8J=}Mwc!zp
zYpWo-;(5ihPE{Hn$qq*YkyCG7*k0Sd^YxE34oh(OsG5%DYV%%bo$B01BCWg4?VM*Z
zscCP>+?eUhycJ!E7`ufgIh$3Ns*=B&%LDwgQ2RI9r(*px6Lc%)Al5R78z3_s9DPIN
z=-<3Ev&l7NV>WXmwD4~t{Jat=9GIUe$lj)wQPJU~e`BXs7-aztPVxbT8iYBGZ!CMJ
zL0{ajyr&)Ytq-KUdzDzk(mu^kENIa;CW?X0J!yDuZ5Mk|i7N&k*xr?xz2|V;`R0eP
z|FM?!h<!89nDufPiL$<mex+LiNo@*@$?tqlE)4u1^O10*)w?)Zm`LL6k%-Fky<XLl
zREy2P8)l|O`4OuqBNUK#Aq6C5i~<5Iam0XyID|lN{BHk5?=0XuDl;81!R@?X>VoG6
zsq=?MYrAbwkBQzE-sM|jzT3CTyh67aA at 1wGRop7NA2sqWy4P)?YIGy4>lucX+`h8@
zvNZ8ZF2<pOgwWL16@@K_Gy?~>65QqBwu0LN?o;5dhFY#|t8L at Xii4);%BaHRbC~Op
z(==~oE}tsWq>;82Q2~6-Id^%^ZOOT-p`X^at$=)mD4$y|rLNYPC2U;-LTod!5nVL=
zomMuhN?p7D&#|y?03G7*^~g3CP|mVlj`nNuzUdc2f#TI?4&4&FaWr-V#tz(0Pl;8n
z_cbdmBnK<Uc`$Gw?!+(4t at nA9Q!FO)8%CWk%iCK`vx%fy?vpaF;s|A)%%w5nKf_jx
zvM|oA+$-fE<#^K*Tk at I+EhV}DPg#^{3i}vlo*AJILQ}dKxB|%~J7kh#^GMmw;SR2m
znn at d5sujvdR_+aiq|Ot5sdIQNd~a9y&mk$g(txLlhfI-S%<?;n;W?$VSR*)s4vrLg
zt5z%p|4#HbS26f=ohO>)U<@GR;5Qy1+d7N9)vgCM(O(i1G%grCvei2$2D_uT&h?`s
zTcb;&9>DskgX0zg#GVr1IXU8SJHIDIJ;5x*QGo2|Eb1)obas|?PV`?9!&W{Bt&}_h
zt?L|zr*PRlVGlh8Jf({7+yeN%ZF6#q|9(z<bpM{i#?A4hIXW$ANe1Z58tX^j8{*Fj
zbQ|r6BS-!1+_zTv at fPjt{;*)uT6CU%<1G>TaU1ls<a*2$<LzRS&j+@@Kn(MRqRh*K
zt?(=w48pT`P=ja5;3jWTOOd#PcQnfy5q<nPQRT;r3O at nzc&@Y7>rlyC;*I^T2Xz6S
zKZ at 39P8g^0x4uU>Xjy*Pc1tfYfn*lb1)%)2)3#?jz^8<5uZm-#Nwc?vkfs(P#_ISW
ztK*M4Yu_|^WsX3Ol3I02a#y9Lw=B4Nqb;l at W_a#o{>R3}2=7P|AxJ at N5glP-8ss~@
zgF@$xgW`*AgQgd^I(88GS36(c_0l6r%XYq<^ojlEnu#C9stGktq$qDmFh&o;Xj`!i
zpeU8DALT+jgY?Cnu;aU4-09`GK_4lUp&dVUkibH4ajZ*WthvNpQIKuG{~T<Z)o<Bw
z%yGPjNy^4*TmTR at 15j@yjQcomDIt&oTF_a`w6_s9`zYkG!&}X7fH~LfvUgf>E_D|B
zssiCo%=KZ2f6~DT($ZLn9BGT*9bN5p$+CB?>!*OjIp%W<;I~j*8E|{A&0b6-v-=$2
z7ngDF%twx^Ik(3J{mKc%Q6+HT^3ln^3><02&@X}hnu)KfRfRGSb-o9&!jT}Z8;?AN
zbS`6SXBo`V+JJ($%wfhIj7|gky#Z+DOo+8dd3a8a@=X<#Z`wfdto+vpxo)v}KIPj_
zvi?&GIrZv75&98V&rhL73mm+$ZbYaZ>~d1(IMx$Z++?vf;Kn^M;BH(=4*1vFCVRgs
z5qyK_t(Fe^OGW&Oe9%MY%l=Xm`a7Txh+j6Nzth`bCJ0M?&%c%{Nv-Je`%Bq5g#G?f
z-f(3>NG$;>Q(fxPzwBSjm!ulInsQj}IjnYu<;r2*=wB;L^pL9+kB@`#Yb++)a`;<w
z_zyDtQUf2A82Z<WECt{Oa=5LSI)~p1_{<$m(e7VsvZkzE|A`REmH9YT;9qMl^pL7t
zsa at -hnC7ZhVw7O9G?Hwz>t5hCYgyiFrTe^fFq&>&4Q8?QuC);7MwnNQ5f8_eVI1Q6
z<Ph;Ll3e;7*pr9>tI%Vl)fDVey>TQj$fJ&xeOP}U-D;Qq^IZ6)TsVp~(?tV{G*zFM
ziy6k!SZoFQa_Oe#Vke<?2Yn*IuJKhpOmv6g+fMXC^kGdxM7Of{_$|PJ0IV6fUT-I?
ziM_BUt`W%6V<8g#o at 1QAzu4+9;p~MuV}%uS$Z;#o_NE~BY#vgl<Dy5M^0qF(bH}qb
zq)XkRM_~|U%8t%$Ubzsd_Ktz4U|!PB6`e~vS9UJb0&MNoZUlOiV(ahawyb5~C4dMo
z2OZo-D9=%~5o!>bmhOtQc;_Vx+v^gQ$SGv at x#hH!d6>N|;%Ka091O&eirIlXl~U54
z?XOA at nv5Z|SHSdcGTjgcp9y$Nw~&Yl*H<&)Nz~-4wUCIY%3+Cx#fWJQ;Yg-1YKn-=
zcVn~y(+*2a*8dr`kteD0ftzfk75&$E*DC+;ts-x$t7enuy)m&F1P!3c at az&2iy3uR
zyOB~W%&#0pzs&sdvD{n7SA at jV3?eq}BH}=r`T66*z;>M<cqwW|UK9CA;FyYlU;GE~
zL2s)?W)i7|@;Jf)K0Kq`2#*MO_RH{`?G1<2k=Py)<8*wx2((l=FLGRKmx%8Hb$lCW
zh26K6^;M<vrdUM&ZH-KMv|R_1GLKv|`8Px3Z_EZcOda^X2vv>atrXx!pf^s#oL{R9
z;<+BrI<p!vHxY^S3;|aJZP<P~?tJT_CIa7rI-=b4v{#nOH>tq2^w8MZz+oYw1<K-1
zv^p#<Yn?-9Q!~8 at Z@0#$5Av$`IIqf&7pprc>~YFF?GM0?q`hWCY^|2zo9W7*bMfg-
ztAuQl1J3=O=2a4L2y_#cbD`C-iiQ$zCWW}u(=yEY*0;JMmhD~1)>m!FwL$MVlRT^M
zd2DUEyQ at fbO}4hb3w?3SQAMV=U+Z%!4wWOvBE;zLVUC^3Q~Qh3qzhJq1pP#rwdq71
z+I;c2Bod#_cwVOS6mikUJnapXp9=&`jYC}F at +4Kk&3k>}VQ=cDi)Lo^%Dd<L9@&yj
zT25Fq1t*1ur&XBcPzxWK0eih`V=^;!m%OLeqgb+omfzblckXii*}y6VEJA1as<veD
zj<j|I4I1@{Pj3{+Uo at n2CkHtw)!8^ie%rW={I;oxe2RLc{goCQwH?OqFxm%Y7tH-O
z-OfVaZxZOm3ueD$Ha+_ME?wvMJntbEJmaBa-z1L0E<c0ysgvv-cyCaPv~KSj3Z83)
z{bqmS3egt;2|hmk96u<k%kH<T%Tm&iaN@(puaI4Po at o|T66HPeFgMhSnn05L(56Uu
zyYsv at 7(`kR=~b4#;=DLy+VyKpJt+MC!{4n}g~`_KrxUH%=Dv at h)zkaG?oC?PHeU=?
zRDbtzqMm)3o#QKLY-}vJvtVH({@t0gAO>_od9|s8Yz)cz75*LkRR3O~ehh3Px)=tz
z`52 at bkM_E#Rd<Yq!@96t7Up!3TD280e_GJa*F)ty%N}<6_hilX3c~$(t3G^GGDgMY
zvSjJzlr>g_qiMj at +Q<01Y<Bjrq??B!Cw7XIPaoSw(zQ$)__x7;HY1?mO;>7tvjE4H
z&Y+vcm91B5H+UBkf;PlsR%#vaYBK=8CSJzQ8j6owfsfc2oz_H&MSVJqZGQ)(#FIF<
z!0%D at 8oQ{usTtp4s6}m_C>L>d75Xbp=FFPc1kI~oVCC09+h%}l%<IcSwf;)mKOvu!
zAmyzC&Sir-T at qCj5u;^Mg<&u9l%xo?Vr_v=D141J18V&OhI^_8IpZrmwc`1u%!bHa
zFp94}no*Z%V*8Um`P6Q at M&(OAp{{6cv;}tNPqB|fj_h$S*_iaf>;t$3+ky4RdW1^V
zXNagxi`tM{p_Ny*GV}3_m{j&?fyYH+Y*jAFPK{5`tw;`UuM>4B&|f at Cb-J__wCv}c
zwj at 5iM;hXqoFul(8}%9za9YK6sKvZHpca(uhQ+>4arky`$*RKMV=vU<Tdo(B_A2Pu
znLSfcuZ4OZ=cms__j>D;S83QM)7{>+ghT~(7dfV>>V`H?s5aUaJ?O8LJ`HhxsqP%o
z{64<F+}o_22|cIstt1j&v+Uu*E=xxp?p00l7LvWC+tT4v<>w&O2BD*3M|1n_*;|g8
zI$Cz$+<s^FmS}kNy+Ika5~xgBV=<>RmT^-%es|EWUY#!<EI1~(tNNvbh3NiMI#`14
zN$KEtudkG-?p?jvX&t{mD!ARNrH&Kmu9G_6L3e}H at iw~mOSHFRPcqQ)x|aw^Rk86M
zR<$Yy5=TJnkPhCQIZnI06FvZnJn&TJpjx#@#G9i)i{2$mi0zo at Au^7a*zx@?KJg+c
zA$eWwyA&y*R<CM?I+&jVzvNZ8B<yE=wh*|5Yz#`iS0Vz*kFh#|uOP;11-?S`eNP&p
z!%0qad%v{hQhYj9pxmcMMmibP+z_|o=K_p$={dnWfso9a#2em0*tRbQTM^F-(oNQ!
zs6%ZJu*Rw=QE%KKGFrM3>MtjLtGX3wwB+I#>ybo!6yh)-EU$&6kmUq(5P35wbvfiQ
z<(S}ARbteZ#d^Fh6=S~)vEz^N!#g0K2{EDBO;qreG9Ow at ojBSHlZ+OFZ>rHBth{PU
zayj1MtD>hM#|p at C9OQ_prx`hp>7^TCjrg#adJ3Oez;dX{8adRdwYys5(+!%0Rv_ at L
z6XjnMXf5pcic0V;)4dYxy1*6VshM<fI>6T7!oGR^3t^oFk^z+$?X<f|QPtNcH<87^
ziOuo4U`%T_Lq1-YB{`-C+)#^_o~d5Blq5M-d91fS`{|i<0AvzDGseYb9%-8!>h=_V
zAHbQ8eA=)C>om|+(4FtCigCMnUzO%itLV$S|I$Rr<md`~f0T9~4hEcu-Skvy{-B`M
zKAwlC at 1G2)PSK9sLS|RyTI5UA7KuL$oWT$u;Z;(KXLY5sf;LN)L-y?U%(YQo<J5JN
z?OqE=&Fe at 3rUf2@GqgfsDfIMVcR&Gp at FJAc1?7|zdy-e at i}nb~{3Y}1zM{+o)k%3M
zIp1Gtt;8I#WGvM?lZe2D*;S#!t}fZj)0G+TG5c!*?6>)Q-aIZkIM|Ua at U-b-7eYT*
zK0ABVohF_nPnKV#r~0kNslAVmd1P)}yiC6ZDK$5F;IH`ZUK8qx<$k8w>Iw)ujX2Fb
z at Yi^m*AiRmUHjO}qK~J(Rrw$Pv0~tWcS3BbgR};QZRnH9HalVgN7#yC;B*CuZABQq
ze}lY3=uceXXo2O<%FwN!l?FUmXdnjl=5o2oY3lWDBw4RlUPw-St#|sFxn6k!InfNh
zabCHAocId(EMD0{PBePue4^jvmB*12bzXTqIdOwmE+TrZSDr^sEH>~ak`vc^<tvE3
z&?_$>Cl+|+YsiTzuk0fFRbKffa^gxO=j+Ld8Agh0$qA=dt|s~vue_L?xWX&flM|(0
z`QK2kl6~Yvv4Ph>PUL&#TR^Vz%FD<JfZRb&h+cUq`EwDrhRE9-AhX(GFH)3SM5mxr
z#Y4#Ycp1}h&9vZUAH*+dq8vPlqn8eN^9TNlkY at Q|kB=059OXK#oi at gsLkvPN)<J at Q
zFgWsDIUvJx9`uWHYioOB*S}#Os<KOhepDurU2}eK at +#Mn-`jMV)n%!0;zXsRNI0QO
zx$qxOC=mXGcO at aHY5dI+<nlQ_u24mr)-^ubHQ-G=1~WtIv^~4^**7T69JD*c>i*Zb
zQy1qJZ}D`UX74Abq2!foh0m*4?`d|L_EjsbHr(f|m%IcZM5xHM<Q*eia3~knA^Z)H
z%hu$=e=*|4W4Z93*ttgb9~+k@`vafVG-lU`M<MH>*S4{FEOlC+eK6PGBv;!%g|Vk8
zNKBKBk!f}oZU7p1lD4{4`+B<CqmqSgSza%4bUy6c3#wuNVZ2R<eIcOOKHvzLJ?X*?
zz}e%+o|EqBWPQ!`TeR at 9K>4F@?wvM}=(30$S-?_49oo)_B{Z)qkKx`;)*En9AlE?s
zVldd%ZnAs*6HPvu_&T=&&p#e~%|002XY1kV0!S%9TEOpM5FbD$0c0)s*8!x6>;PXA
zKqt4Y at cGEP&U at N|5P!eJMW#M$ef<5<4)7 at ese7!fb8Dw9zAvJPE+X}=I3qkZF}^Px
z*gI+4$hX;Z_-!@<QW}xMUA<*z#JwfkVHem}w2kW(&hSPbJg at HW3MktKdfy9h^eE-q
zW}mUqC2?QFs+dV5QENKZ_PQ?78{@uh$J;Ell6vF5=xga%8q?KoJKg*KrCNH7maAMP
zIb)$7OiA-0O&+~*+wr)MN~+^=f~oNIAZkqMaYUR=zF<~WVjxj$Nw at E4drDP0t?fT+
zdumtpp6|AQ_k=iNQNCwNTGdtu%JAH8*cNU`72ydo)Nt%4rsBvwnzZX1?H~8u-Jch}
zI=sPGf#=k+OiKn^Td{O4jLONZXJn**c#R1Afasw`{yJd+xK?mo0cBWR5~CFXq3z|i
z4)G~kFchFRdK&Ut*(;sp&M1CMcA7YjNN5XHEni2dO>`2OwxNs#6ai+QyCPIEEV|3-
z`Zh1jnF4%w%kJ-4;K!%C(yFHgYN7#dHQnr1L+ia^sM9lr8|dn`Z-`a2^ymb73UX+n
z>jPz~sg#I>6hi)!d-BzBrG#2=9-|G0?04Jo%>r+{UFc~}tBL!>7U6W at hJf?&1+<JV
zq3^|g5wpM3BqmyQ(cdYGiMyia$P8~`l6^zVt?La at v%2GeDmrMMcSm7Tb!_I<@=hsJ
z=$R&D+jnLPG85JiAsaQb)oBjBA6ItSA~Tu*mMM&ylQwT at VK#ayvU%XCrZOR`awTc?
z>Po9xR>1=|Il28~uO&&^mZ(Y|pIM`Fq8K&f$<Oo>kadLNg7ne8y94F@^?haZbblT8
zhWL!|5AP1B+wO-qh?_`}zfD*yK0~bjPT@<QFsTk$-L!MPcz~2PK1CMrKckahxQqOZ
zE=t_u`x$j4H0YcEKx%MF07`xOtO>##$SjJlgxXYxriQnMYCE^)XvjZA1!h5|@GID}
zt^QKsMa>EP?MdCLN$I1S8GaV{@#&+eiwP*wNj!PcT=nn<w at X^T{|?bfC6DXYHGegM
z?5uPy)y*E)ciaA&=O`jYJvOG}2Y81|sBMD6E@{l>8W<^A_y;_F!YL2Ab<N3fUh$m;
zK4SIaF5%@l>LcdLPFvzWv<(0gVDBLZjJpE4lkc{joC<zb1HPNu4P0p)zR&2ig|{_3
z2~bStiaA%#xqRm~DBsN9FuAcM8OKOl_U_&P6_0Z3n!l8!#!(MYO`u>q)~6=!eFxf6
zkeagJ+Bq?7dv+3jAJWS_%6HrT;vDuEHvxj#5sF7WZA;n&pfgtlv%XqV-MIoN6ovUa
zHJA;*hLETjwspSO$-ZG at P14-r*S8$=OZ*~j@@tDg&KScx9U%rU)MzGV#t%)=uSEB<
z-K-2~@PoLcb=q)`@Dhb|<~_R=_q3jp%X4c44sSbmgpTE~fEG<PG}dZ->KbOD^w}PB
zgwvjBG!a2NptWfBnwz%Nxt+A4dZonwJ+H>LrLIjS9FbxY<-$vG{|T+|SDTXfMZmKT
z*7mWHooMgv;V*YB3Gm6lrb;dLuoI|;WsqaGX*cQBecfk-O^Uui6(<v4n8?V%i_-}Q
zBM^&OwsY;IkKd%8vFKBQ;&4eWRkW!VahJvb*O}yALJfC+K|SC}?nSQo8G`xlZ+trY
zJ6$(YpBV=Jdip0X=odbnN3EzUO;fc{jUU=mB}02cd_#*Wu@<%9jb&&_t-sQAHpgSW
z?~(1d;EoHjQV at 1YTra-hses~<Z(Rd(mk94R_+t0e{KpneT~A}8KnpZy>Kkls_u<X%
zzOpj{te{xPIYM{UaGT@{Qb|N9$P>P<npE(8#r*=TwODZTOIP^hjmc=)OOvBzFHVVa
z5y^- at GYD~0b8*ukPKk0yrbNO<`nU5va^Bro-;p~lSo6HQ<7H5a5(yi*Fsyt21?!%8
z*+Y0|vAW^WjW3|o?vcOS_UH7NHWea0$gb9h*nH&&gP)@tMLD{WADyPH#`_DJ^Kekx
zM4yJy*^zDq>d_iDKi1mIpOKFhs<rZ--qo;6S+ at mu1*+BYwy+JKY&}@w`=F;ENW0ky
zwm{)tEXh}~G27>c^4?{A*-c{sWp at GE*n at G?YGWet6%Z*oQmglexWU$%Nn5nGvhX(4
zLs0FU#N*km!VQlOy<Qovua+O<yQU<CUvd#T#8+26&bQT9yC?H>Hp2qi`RV?x3Z2a~
z-G6ALY&)glTi85(Do~ATw;-*DU9D7~;GdU`hpp9QGVd?Uo>V=RoPi&bnP#={9)<oG
z`mQzhn*MaCtKHQro%t!7Hy^~rUhA13qJ+bG6*;|=G-jm6{6&RGK8`5iF4#khUMm6_
zstEen46YTwE4^u>=F}YcT?N0ndZ{)Yq*}#aEtt^yqAvTZ`Me%0#7%<V74Vy^mFq%-
zjQ7S<^N{oFnFkyrP(QIY_z#~ON;)mBB-YpRSi7s3O at J>k%}zmmvVW~$@w<eHkgHuU
z at VA&ge$xVeGwLZCKC0Wb>9GDq;Eran+g~4}y*{M$Ic at gEIllZ9qp--C9L0MIKtu6P
zevs`9coPRT6RLh9nD%YzbNAb8z5#P^$6iS-uOJ<7`&}lBCZs at Gts`Vp#|dbw-FqWQ
zW^Oz2UK?A6- at vx5?tF)yT4dip7^nrRnO}ct)!*>0?Pv4ddIRviT#oyWC+>5s6aJpK
zkA=g+ySTRi{1iy5BpeLifF}am%CPnzPrMi2>}w&){tbIycU&#Jk9~*nj-uc{I=TVU
zhY-io;OYI>u()-K&ruuf)mj|$sT^6u!t-fScrfQH4j+U3N{`yZRgXRPnA|I{aya1w
z&D`(MMW~xg_~4a-WBF{a6Y$gr^!AnPl-L4BxkbE7)@SKA&t0}f1DR#hp9Sp41`tk}
z#WIxHzY6^-F}>q*3#?Lp*1)Nr8DsYa?5+2C)XT7_VE^FQy at 9QJXHVhh*1MEj at AwwX
z%JiKp*bZh-+6Vj25}!b;H6^hcZDe%T3|nOZ=LI}xro%CQR63psa^Osm@|^tU_IKVG
z|C+4{Z)yqc`}D&088NwiyPk))wwi#?KPt3$=psN(?d`7%%n}>N&d2;rBy at 7O=qC5F
zuRr%%9S}B7$9NT9g*~6D98VU_aq~#W)6SZEBoh8FFA-Zpmcc+A_-PCYVLXk*wZzLZ
zi_`m$ihdV2Q7`vOE{fmmo)AM)TcAyetd4Nqre<e=Bp%gGYrw_tYf(>>)A4KK(;{h|
z)t&q5<pBT4yUVfl+`#I&VYHr1cV at 9yQik!wgEA13B5Ie|TtonG4LpsrFzhs(_!-u~
z$%wK>K1@{CL)x0EAW>^~ifi0tox04SB`&R5MlB=nPA^Z at Wr`^H{ZSX0YmF)q1!^Uy
zuvT))YLv$6BzsF)x>98z!nw(6Yd6$;we;Cny7ZE>LAv^qYpC^HATYf?^R+{<D&xIm
zaQ-C$&!e2<;?o;<5g}Iornv9AJ{~ymwVcxTUjLLF-qmy_HIHCYW#C1iPX*MR=oME9
zbA0n?G3ufFxyg4I9Uq at zXrw@GpjxcvfwSv?W8tdHe?;gC8ld4&SL%BITKh#7_jW3e
z;u&Rx&hxJohZ$7XIIRU!1hZOME>?jw7ch1xiSwQ1*K$dLm=Z{r(oWSpJ9tEkRX;kJ
zSLb&Uydlz5L9?WaN_4ZfAJ)eYK5+G$LS1`)?qBOjhW_b)pn3qMk>!N&@qNZKU8^a@
z(<l!=A!b2awl&Y5lQvzci#5-lO>QcuG3`|1S<x*NRgarSsQGYUU?_AtUeR6+d&D`&
zt&831RlRGKo`9mAg5CNs-sHJAFP5LX(PNFwaLaG!!T5sPllPh(zgG^+acA$D$FJ)b
z=qbH_<SQ)NPl!HwKJc1Yp9%a1)|kwh*iFcQrbITL<LWc5H9aZh2^q#E-8zav(TZ>D
zcY20lC4sDRuJwG7|0Z?3W{SQG at W*ufDCSd|a+W_Q(2n{{Fwt`{{Zv{=ww?{1)6Q>#
z9p#0X$gt3Mx+^+uP)PDa;#t#Ywx%-=_9W4Ui&r7xkOx<AydhpTV)2KNw1<3?){!Tv
zy1l#a7{8I0_0K=I<?QC6O at kV60!iyPnEwB-?<MM4)Ke#llU#}37ZzU(;EnPj(^>O5
zi at 1valRo|npeOabFM$3zJ|kB?e$6s!w&e3Q%fWB>7dSWIO$LBJ{}8y}+<9Z}>>!8s
zyK<p(V`46h at qawVpB&>K9OEAXzd3ipjtp at ce(yI<--&~`Uds%t6b7#G-e;sn!kd&E
zIW0O`%am3~yHq0neQ>0Ni%kMqJc{QW3TP at ltriipx*{gU8+?L!b-e7jnfX at b@b;&9
z+Raj at 2U}?cjD8 at O+odFrIImh*=u_xtBSkCPPi+ at zS0hjE#uMcO{|W2Z8!w+LeC=G*
zBcyQPI|H{5oFDkl8VFOb=EQbF+<Ab0CkH<d at Uk5I!Wj4kfS2ds7stRa0(@2uerXK+
z62NEY;F&S-48X6<!LwuFS=0=x%|ZB`WZ*mMjta5nkvmC~K>1iD;Qi<DY{X#k1(&zw
z&I0NkuFS>RKg;t at JEj<(#o+m)dFDf&Vr(+zsm&b8^J|}eu75sd^_juqhDXwVZ5Yx@
zxwMs|Y15xen`UX}v2umcas@~$#}=@(6{BfWpG%v9nCZE=Psa4mCjh at H*G6tk8#z|i
zTn6Vy%i^IdB_^|eD at T3b5MOeq1!iI48krVm3LzzgsA{xj*g4v_rqA`QiS?nv;>6MX
zMMz6?`In96Z at w&l2n9$Er(zUGx(o+Gts^+oM{%r|;Xp_OZY<v5A(qp4tDtFp8##Uj
zOEY7%-nORoM!hqOS-own-ZNQT-oSUV$7|N#nTIqy%?$<Ex*3Qrrsec#yi65TSc8$p
zK4KYJVIQF;vCG!|S;qgUv?buAy*;951rhW-l~X0)jez$ttF$~`)^nc5P%jHhah_V~
zOvt^3OfswtdtJaaR?$`Q@)(bHg^}6;#7SW7=O7&Wq8}R!h|2<rb6iJlM{CE?4ica4
zk@;_-jqibMs?yl~1OM#!c1N`1B490uPe)tQq=Z;WIkA!XBrk_^Cb4q4lW=&u@*FoX
zo1H`fIyD$T{oa at -TB7LxO3vy|OjTl%T0+b|&LSiIWxCD*J9-yo{lZ&~{^4y&F0y!p
z>Y*%|SPJ>vH4?@?`TSXWq>h*a?AF|1U?d-dzA}G)yK5Ae9||&<9VlP<*%9o5K`zPX
z{DotvUU|&}5>Z#iq-0<y82;s8t51;VAa_<fw<%r*VIIN<m`?!TQ_LrVZ$J9L4G)@F
zPEY4fe{apvc!i!)TMYVaU2=Si=8Tuc8#E_`+{~wduXfa at qR%6fZt$;&m%$Tym|Lh%
z!dVb+pfg9(F<<SdPaXB;QUQJgs{vZk>lzB+NiE9dMxX at SPtAiI_#OH<zr>I0V*3C;
zLE}dD8-5(>@Ee0UexzUfD*ERp180Lntx3+<=O1pUo}dvm`7-YF#mZcqrKp)0X6oJg
zxG|wMdcl~`*LBO7&{{l=u8-I-VZA84nd?QAU~R at s=f0~+*o&G)U*?xgd1IgogEl~0
z?ITdi&b^~{8NJponLooeF>F!423kJ~g`QuGyEyiV<+Jh>29q at cGPntG^eg-=k_os|
zlg3d+clg&@@tby`Ciq)y5<cxV|Jpp0#%oTr6_#%WpE8o)NSkuu|6o*MBoxSn*g6jc
z<K=8cLmcA at wi<ICSHdW)Z4@?=$0j2WT#1^Z$`sb3^&rlNe}Q&<A at rFMXnp1uIp;dC
z9?1asCZKM;TguoI?aK!i+5e>BTPaw>twX^<4y6f=Fq_V(8-rN(=InS8%VVRy$C)pe
z<}Ao6$V&md8NcNQFX1`5oR6 at t(5-2blb9tIhP2Ve4CB+Gz}ePw!5n@%GA-`RVRFfl
zT(Yp{4PORN?p>B2pUZC~EabvKVd{zS(<GOYMkpSH527U>p(AIlj0jJUv`7e#_{<+%
zmY?{!{K-fd at 1#Mx&9K!Ih#|xjSJ(|k%<cO*m!@f#t;aq}`EQGt_ehuP<Tv=+?y*?S
z|0k?mUdEnrJM1=JoY&- at scG&k(CjW7$p2ShuBg=>a`qc*HW&ITlp`4S<4}4ravEc2
zAkb~^Dd;Qj$1+tY(@pM(SA21qX)aOKGa-kyoGJ-UTM at 6wNhtw@Yfg+wa1`J@=M9^6
zFbcJ_w|gO4 at d-Hluc0yj4yZ3;6Tto&YL%ibai;4?<2vr|Hmho>UFAhlH>m`CgccvF
z){8o-<tM2HAZU5VmaE0r&|)*Bzb9V7EH=M`G9Wt*(Z$N{>X`y^rOjPM*3+&%CpXPT
z{KJ97k|ejy(#|)EL=1K5;`{uWyzN~+F`FHDc+cU+N3tL30!r|Bx~#{7w5>k#otDpR
zL*jb-&NgGc#T!6E;mNEKK7!5RPiQRed{qER-onDeXqS$f>j}SMWDfGd+#Dmk-A at F3
zn@|YU)y&oyk1k7j(U^-ljYc?k=dg6b1zYsp3waj;7wi{WFXUecUMRSrfxNfq!lrs6
zE&&{n3_Z?ju8og3>^2$HqK`iVk~LrGC45U_G0YQ%U*~gjZj~cpgQDP at u|B at v%F at c8
zrDZ3M`Tjii#t72z+}JdD&SvpzlAZQyOgAjr#{nt#%C0iM%uek;iIx{H%FGs2ZGEQx
zpmzt~@)AMaUh%S*$iUND1 at vDn#?zJc*$aQ5W^Eq0F9XG9cRI5#psSlHp7#DZW$#q8
zFQP0L?4>j4jY)Qk7D7XGhOfMpVE84XIiaQN44E&OH1bD1pUn2dzcc82h83WA`H1y0
zD0O#V_nADr-+=vux%ij_s^jeq75y&}l}sX7cYh04 at Tv&7E?s8%{ezuVs*RWH*p?ZI
z2T)H}{ce34i at gA`Wm;{nu7e{XO+_EzU4dVipl)+OYD2dYt(UMjI^AhrYe@!xo9&ht
z)57jje<kNMTA-=%^2jtzNjZ!fL>5DCDz+%H7|Z{pM7J84h{v?%pTjq!z>Bt~IS*Hz
z-^OV%eEWAHu-kOF7Wvc*0j9wTI1 at Gt2T*5g)Xe;eQJVeXb61c0KYDKdsQ+Ub_|(zR
znZ)zx2Uwo5LZBBZ^rC_{G0m(O$GjQ1JWly6&bZNtX9Bcxde`ADx*6s_>~^899w9O<
z9blFvSRc_^>>-$cg<XQblsCqukHUVKcmSxOW#C8YR_K?NsV(|2+h^DwN4w7kyYrw|
zCuwR*MB5LjspkAjy$GKF<!#|xkSj!f3*3swtI&P?>OmpLoz`lkuYtao44jd+f4R at y
zU$$q5XQxZl$9XuH*v4b;?lz(H5F2Oc<&E4p$f4e^wz9rAqBHw#_%_|ZVk0o9f0*t{
z^Rx at v12ZZmK)anVa?@bORlZsZGj5(SqhQvmqqBeTvyd^L5vEVTd*R^wfYy%0;T%PX
zZZ&2pT~nW_gEr_Q%-l;jGe&MxT=qlV(6A>0y~{z+b_0eNr;V_OWWmR74HS7xsWrUS
zOOhlrL6>r&!ouvp{LJ`~yPE{4n}g7K at N?nmra|)sX~^oAWTYB*_(>7EUrk!H-sq`_
zxy=$aYf{v7peVAxi4<n5`SG^M{(Tcu<;VF{Wok~OJ2eq}<*Av^Jd$#NZ)&P+|ISn)
z_$H>NJo9ME20llsbpNiD34DdAl4tfbt%7`3Vm|6JhZ=cBT~G3Z+2dyIw7NcI-*!Bh
zjlL4uAKD+?AIydyX>tN~8DKkAx2Q%cV0X%o0gtJ=?DlQtc!wl+>tVDdCApS3{+pI8
z{(sbx#s8z0EdC$1M9H<p`TzSd`M+t&wEssfnf5<w$+Z8wmXM_BtXb=h#v;OyrOg}_
zu-*}VQ0#bn7l*aqNHWt{{Z{~=KRvSY;I3T{sPps1)a3AqgS%7X;Mtyol!SjzRuCzb
z$6Q+uDuw?5A^WZsO;uTvxmbNQ<`r5IT~W;!*hXvo2jV0JkfJJIWEi!f+GuSxZ?gd{
zziIIscb0nB5~nZ7$-lUHXxlFuh93My{eLOHh at GF}UbP_a!WMO9(t4o{WP0naBYW;T
zzx7uf*+{jfM at aT}GtXOInfk=;U$-`{=L$T&Y`V9jU-(TcJ$^o~VP(v8-q!ZYuUlWY
zXtg!vcRD;uHm&p9Jzk$uy=d;Aw&>Qz_2letTDN;%3ee*^|7$+L1yoHrEDx*aHl2M4
zt(+wvPHy%V at QVlLCqpliWZ|-8fa@*nA3td6Dw<nzr{lE(RgkQ^J%B^nIF&qp#S@~o
zLQ at a>^vN%By)*g;2lJy`qd<-vX+09C5$<#xL5nL#epf7Jso8!z<s9Hv`?lHqE>RBE
zhE|-nygt;pj69XxeBO>Yy+7+uK#K1qrJjnU6}T(=;X>4`mAJ+6Fy*OraN3Zf-K)z<
z>vo=5bh+yb;{W$KQ_UTBmeyx4t<oElNR5mCTde2xFCi8`GimK9`l9kiFf%6LU{Ft1
z#TQ`RH;Q$;UV{0FUzFF{QLJZ^mRRXr=%b!-Z`p8<XlPN3G!A<W#-|AP4?JUHKs+l6
z(Jjfm&@t49nzXgWl7%5I`EXq}d)2R7b#o+qe#g1Zb!b12q+j19w*wDdWJU_>mz<Ue
zw`<HTIlO5e%g67IVH;{*!;`fRjw^;=i9X4<R8+&Wy>+hrZnDnWIXhxXv_?%~=NcEu
zsw8Y}hgH<+jF@)02A*lJ%iI{9p3^u$!`8&&QT+onY=e+-X1CI{KeEzam^HbperweQ
zcuLWgkydXtl;QSRqpguvw_BAAcP+SpD at K;+rby5;k7P3)%}$O)mta2O6YQ&H(I&BT
zso#<n at FqT%AkPRd?c>+TG<^o72Hw^zQ&|__S=qUC%-7U5QK2*@c?&;bJ8sIHxJ$Qr
zfvd_)aG;7lLbYHv(F%TiH{euN)w+kOu65R3rF)bng%rLq-7C3%DiW@^&pq%=c8kZJ
z&1N^BDcSDsbHi*r1RR#V%M2V=o_m!l=@ySbNOlXfd6h>>RrytUy<aWb05g1-znZ&_
z<>ljwJ%!N9xoXQq(OZ~>)tBA8&(SCJ<M*@i%zEB9_o_NcFWP=1E9C)zo4Z7iBP<}V
z5E3&=Xuvz at KlK3t4`%&piN#;%xXZn&MbhtZuUakX&Hifs`dsZxSluP8`|HRR=CL|Y
zW~G#REHKw(j~Sl%!25Yd+hk{Lk~}8XCK21Fr*maC_*KQ^SDj|P!o8|l(w**AO_Dy<
zUoBSPJJ)yA2tV*lGa)5Wp4CC&ihb+EI at a>>Alb(<6R`bg<1Kp?1wJs^&Ey(KdOsD?
z`+>smXCrMVq`qFhvcA6X<@&nkTI=h&x_~$SCBj63*u|>ARYu&eE&{F$+ at nxmpI#-d
z;y8fa18I11eE`3odA#=$Qdj?Io#^BN{+o%|FCyXp+I*4T2Jvr;FzZA@>>iE?qMQF#
z^TmhnudjRA0_Eh@*Zq34kJy at lH@~^Q?iVRFxrjiTo8UM9dRbJK6T)5Zl(4R!cqQfi
z>y<VI@#=4Spr-z&`;XUHp8~0=Fk4^ullP%N9);hg=8IcJad&{Lv37du>wb65^$Kjt
z&v2*>VH5lwt-tBv!=ga#P`>1mi3jRtyIw~7+(JL}U>Uw2fnNpuro(Rr{AR+h5`MGb
zHyeIe!fy`zu96EW>JGF+-#zA=2L2ZQ8(tUQErC2-kcSKMa6uj}$ioGBxF8P~<l%xm
zT#$!Lx(eDvYOFusP=Ay4x#o+(R*%e~jk`#VbveMyv#TwXKz~)$)u(T(u{~eymC66d
z-rIo3aa;$21rQX0Aw at tEB~jL2!4 at b$9*_VCku*Xem|skj^V8~Xa3E3KVPmET7<2yA
zJwpurX%)&=d`hBAM44igMC)ZX%37;+Hd?QwD7NKjv)Y`KcsIVpmvyqvp1!QV{j|BP
zqsuw5Z{suXy;s#UJ%bsLa_s%?zE49Is=De`)vKykRj;aEy?SZjCbnx~=$k5(!3T}q
zr?UQg7~qm;Y<P}eya(EEW?<y;?SS9F!1Tulp&sstGQ5ifcrn0>0bUI7Vt^L|ycpoc
z051l3F~ExrP6kH?9p(6kJ`Ht+a^^WO22fs~@ie=#Fm(T;z(HIWW_{bDY~Zb6-+(hv
z?f>W;-!lNXesN%g?b`E?&-bl-=V!hJcnt&XJgAQR^vcnPgFcn*Tm-xT&q1b+{M;3F
z;5^dNQNaDm!bIrn3qwC<Fvjkg<GXlp+Y=7Z+I`CLdn3V{nX at nyd<Dur2=I$xzU>{b
zzXB!(`R!!ek*2?wRgU$)1Z at g94_|>aVSYW2Z>ao-er#vH=N{$wp$|aa3;+(hqKqfO
zq`;_P9sr|((ZLvCmcg6=lLiAc${%D%$0O{@k!{a0<=D&pijw&j+s2MS`yWx1|9S*<
zk%!r~cW|8vd9i`Z{T~JRoDzHGe}??72lr2aKVM`V%WxUujzsTZY(RT_4%>g>wukqE
z|BO27TVYSL9Z;7~K-ql8Wp)M1*9U3r)^2)yk&Uo>z`aNP@$=UO_ndbY+2aF??4AJz
zbj|LD`abs0KZ|`Nru<z-Id=4UXt#dsFQ{pbVgDZO|DJl_{0`;Vw|*5h{X;tVnlW44
z_5$k%npzl|%FRJxkM4S2i at rNF4{73#&hh>I at 2C(D+MPWQY5d0G!1K`ecf7E0`)hk)
zcJ2$_bl!nzen{&&$a7FR_N9&J2+-XK(A@~o-3ZX#$RNr;-3tb9Doud756p+b_`yuZ
zlwbH|75HxD*aLqUW;Z?AzwNva(!-Y<z5sm;=w=rS-o%^{z-eLVBX?j~p}yY+GrlnN
zYYh6rA{#i*j%@qIetc_Y?n6M6#{w$Q)e}IAy8*AoIiLwBV{zc7^M0tGvuf)6unObB
zfcEj%fOdWv><<I(6N at 8z`(fO|G3knOeD;5X{x-Dd*U$F>?G6C1ab<Djj{Y!bFwVRP
z?f2n-voP`SMdg at sXdu`(2kGcgzh6+HUoQAQ|0K9yhWvH~*`q_sO`khCFuHBu!z1TW
z3)4N2#^TXkaR#)#b6`6bV8;OJ=!3f6w#eQdf<DdP3!Q>_2;vT_Bj;nvvE?$9o5A;P
z=nIQ0BTqf09NV?H;A;#5E`t!Z3(C~L_<w$pf!`jWq3f07(`TW62bAMu$Dv&HMfPz9
zI1B(Mu(-(H90E8V9=>v3Id=G8!uUS|u-jKyAN0Q${}}4?E$DZHKr{F*_bilW7mShH
z7KToTm1F5MisJic%CUjn%CXY#jBM`<L3<43N7&Sj1LymX?0CFyVEPjo8t)f at ZWe)V
z7J+USfo>LoZWe)V7J+USfo>LoZWe)V7J+USVJwEW$&bLq2J{Q_6<cA8&`0@`!EFN$
z`0X?X&R;ot$Mc$UEdPdao?U at _E&*L_53}<yYM#H9htC7O$46nj8w7mbym9zEzF~bQ
z5EJTny+OT+p?0L-UAXNp))#iZ0dvt)e1K^D=q{+Uor>}|aYecH59UUnguee2gE|?8
z{-Z<uTaO%m3h}y0Irgca1RCD1D1VI_xo?S{hBBUpGM<Jqo`y1>hBBUpGM<Jqo`y1>
zhBBUpGM<Jqo*tZp@%Rx%`NUV%>7Tm-_4eI8Pcx{m#}AJnt}qTk- at 85x9HtU``}>Qd
zi-SOKLr~ulpzXcT9*o`0uq?N*_kZvI-v7P-d;j<T at BQEVzxRLd|K9(-|9k)U{_p+Y
z|G$3f1;&16J7W*`_2U*G3okNul(8%D69D(VeSV|$-DxW?{&MJpyI#H+S-AW7rxyPE
zE3dpBzV&BLJ-YkHpSbPBchWE2_~{?hUz`2uJ3oHlr$6|aUmgAKo^RLs!nYm&lh3^S
zJAZuT?pJo5`|sa5{(=AU at XZ$=+pB-?&%eL^PhbE2CyGDu`+wvA-tXP|%*0=<-ti|l
zr;aW}cKzwh{x?3c!_;pree2}cwjEh}>#6D=1wQfHfAiQ+p81Q>KRjsNF#FbD{Py0T
zt3LkOUzm>n_OJa5Ho1M*pWXS5-+Afr7k}yeo?XKakKP~s{$r6KtG>GZSN`CQJHD>H
z^ZIXm=JL->O$~?ceC^cdf8xVmO8K69>{CClhHn|-Xa4hr=X_uK&OeL)--V&;f9-*@
ziz~l%+Xr75|L%W2_}`}f?&OF6_2_s1pNW6;@IU!Y^N;?(Ta|kr{=3xs1oi&!{onui
z- at B(_{PO(LN>s^cktIbpB3dS(>k-Y!gqIU)CKgDB;}Oj#V0b(c2u<<0qHBEJEa!@r
z&5TLMDmxXs>4C$f9?2+4NK0E*@qkH<w|^_z1DSL*oCsvVOl1shB@;@8Bc1*LpV19n
zgi-!#>_Hv`lsa(ODC7$VDpjkT$yRLZfOF2NS)~ITU}p;DLT!H*@*H#K_>xuQC9_am
ztu(lOV1t|4GrU$PS(SQibX1lxquQ0M<v5v`63r;(8W!j(>1XmziSmd|ftiN#qM2dL
ztj|IUdd;lWos&=jT1E-4WT19V at u|kx3TIbI+p#HGc5=))#nUmY!^~2|$Rw6Ck#H!G
zNkb)MlFNztv7C?E5%Nz%-WXePY*~_c$;?8_UNx_btWJ?<wv^*`gU|7-S-!W%R|`45
zQK+r+gdSc7M4~CkvDPTX3VF>ki^WP-h1!Jr%|rbnGMH*QpDUT6QZ7abH}OiCS)&oI
zlr34ku0N#J?yr<{7GRsR$~C^M2f1!&b6h`DsM42hIrWmot60ih-M04ou2P at a)KofK
zt5j+ReN}C;T?{eLLXC*R=Hq5AXJboE9a)*+t5zNo<mtj>v>*XWm0Z1OaijstyIZtk
zp?qetSa52*S}Bxk5bms3>ct!{SD;oco?MQ{F*4dR*+SW=ndO=vie{ZHRO*iO_oVA%
z5^=!ytXYJ{k$I2hCOQxpcZmM at SdLF{9~&QEMlw1$GvRUBp}MV~b1=mTKFK`+t(vlv
zR-+baR13D1b73d=0_1ZzFMboOy&P_V^LC}g#~h!x-t9QlOUyEJ&;pn+GeprHZWe9u
zJ_ohHsoKT>^*WYU1xhHC*F>>9zWL}pcWZ>P@%pSGx^=?g2LQt;{P at v%?kV!2DSjWH
zo|>APm>|5{;v5CYCg at b-$dvd&)ldvbbNt}UebZAjvlP2~of_)}N7UC3qiQoq!UPWE
ziCuGx>hagCQsu1W2DJQ<qJ?iQyP7H2i_|}Zho|n}$EP_C9l|}s#~R?a%xtARJ~lPe
znCtj+-+l0Z!mpZ+6Fi4!*3o)7dvYvyY8>1Xe$M&_cHV;K^wi#6#n?SJ>H#%FV?!pG
zF*0Ig=;)vLNsdynbYK;RUB|3uRtX0&4pr+}C4%iUK3=thj-!<Gm5Ip(D^w|$Q&r<!
z6{>Z9o~P7I0;Y*fAQXz|dPYq_HB-AbBY``hgrQawffbzNQXv?P{V*S#<0Ys$`y2;6
z?0U6UsFZy&Kj;=%-I|q!EbB7?$Ejo$=wV1oGgCx3<Mk|Mkh2<sY=9*Ahxzz45(~Pf
z&<GlXvIOh-Jhczh4HxC)MXS74Tc at sTHL{kK;|a3?#9u1Z$dksFu%bmm#w5negrZAO
z(2R;Rq)()UH5 at bym@lR8X1^IqC!_~x=*h#V<*ZvdKVM2^02temE6I$irIs|PLi!G+
zmT}rfH<S6Ownd31D?v)Hqh0FRu%RSW%Pv%MM8Xp?Pfxdo5qk{=Z-)l#t>RC}wG*zM
z#-<MC_VHk2Eay+x;Ez at klinu(8d5RalFnd6%-B|z2&^g_ShkO9SvWrhU<9Ra=>}}O
z<OQw<*C9hLusMAHA?!xF0X}I%;75K3TYfx}gg*iL6PNRLxZs$pFp)Tf$#OMk)~sNF
zJ90Yp^H3t3*}xo;GRQ^o4&Q$myKqN-hr8f#xE+T;WD^b at Wg|Z?K7o>xt6v4B!}lNQ
zlJ}90yc1m!@aB~RSMXe{0;7LHPH)*tsRVPh>?<@QTs2NTt6Q}P>K1fu0q at S0$lDMz
zv+DNTv0SSTbfTcc_kRTIHlA#&3o*vNH~f0W*@U0SUuj^LJqKW3pO!e+c at 2g?oah@^
z67;~i-a<!xCT&E3jdGJ_iL3*;airA-xKB=<0{4FU&rht^zzf4tRhUb`j at 3eDm5U(h
zTHU~OwT8Y{XvW+x`r2{Jss<=DZsLrMIYO6)f=WDN8--lTb)e0ISXtmu*Uw3`R?Q9!
zQq^g61UD!_s6MN3)@rsLOw at cf2*XNYt=z2joLh&2gypcpD|s$DISr at 4W5`MH%I+(7
zeaY{(6V8)zAi&=%7g!%yzy16LwoQ6%m-cmFUjO9_YzXY1{>2Ln>);)*cYyt+&s<=;
zz<%rJFR<&uUjO0+HVpR4uUufe!QTImFR<Id9=Lpgjeva=;BEl>;a|GI_8|Pqy>H(P
z_Dk at M!Xw8ZfBZfCn!xAb-?+eV@%Fjj5P11szko8IY!z(8?@h1~zrTE4;Pb)Xyub#*
z&V63sJMaa8Z}JNQ&)91M&qu!?@LPFJ;QQhi1b$!pg23-Gq;nG at 0_C|8tQ*0`-j5?f
zP}gB*#c^T3tp6|sC8+0!Z$r|w3~TzwJpMuQzZ!p#&961rb8deos^9OXnZhwF+)NkJ
z3|nW34pJLsSinlMq;4}V=n!XK+pgFE3wbP;3$SRBk+8^3KS at wQ(<x*VmDK_)8M=mb
ziL-20ot&hfmH$Pw<-6Z_mfCROP0 at zQ-x6*3^lyna{Qesk*iNkLe<RxJzq}#Z>c-y^
zZS~bRL|eW7hG?s&-w?F%jW<Qxzw)eTvw!j>Nn39SnkvIL(%8db??oB_d#ifSmP;87
z!itC4I^nE^)&r{*yN2_1JNMIr{UI;GD<kKYD<GG}7v^C$Tux*{$wcOX<&+VCrG7H3
z7)mOc2}h!V<+w4y_wD1}I7fR&0e=^K9jhFf!)|%RaQO;cQD8Il(H_8<G~yl(hC at U$
zN2xp_e$&&<3%4jT!1+MEK<z|KyLc|J>SO}Jq at UxOC#8mBJSoPYb{IdWanm6d4Ok@?
z+J||s=79NZv}Y~-I&((8Mih&9H1`ABD_ybAz_KZ6)spqnwKbY2e%Bi47Tk%E7l;60
z#YSN>OS8mBzqh)T`4TB=)+6to5Gn4G4eRU{U(m`87?TPtU=b#kqh%?rYhi+clwql%
zF9Bs_w8#S)pimcV;yq*0QO0W`Di0q6<E}f!`nhTsN+!(rp>?xdwu<h&-v!pkJoIr5
z)!d2TRq3hM5 at _6;X_M=xJg`;)#f+{-LP}H#(H4`aTnRS0084(ma2AI833Q8;Xz|zl
zKsqV_4n6Vv!D at WG4cCs??OyG1G3-684?F7T at 6~6=V8P-Gty|eM97Z!<g5_Qb;yzNZ
z)J)o+nS(W=5je0E!Z5Et5`W!6B7t#VFt1R8s9h<gs-g9Ak^Ga^26Ad9j>+T+exdb5
zdCk_Xat_-GCdV}^a at K+l24PSEg)A;>T4SA6b}ZJ4C+U{vmA3T=F>~Bqlyv$>Y_I=R
z$6AI5vzyj8zK%6zV6DZ2v}Gmz;^kJjPHEzwP|lmL0$)7QXp2W_b@(;mC{;JqlXfJF
zf65{fFs<;lZVHAKdHezpL>sOy8l8EzVI;!5_=;MK!Wie&t5v9RzE(Q}d~&{6F>~Ck
z!TeL63 at EyvWApP`g%%ive7QoqlQ1iBJ5X at +s+C1XLG}*ZMBj>!*r=Lv&7FY7q?nzW
zdm>2lCM>uEq2_`+tp?_J6xd2DhbXLBWu!QZM*?apK6%_a$In`}gIocYRS9AFD9)Ke
zZf=Z5aaeD_;t9%{gb7ubWeup at w$4Cw-1E09<u$%hG|Q4N1ivhGn>D*quW|$vz^m4}
zdA3loN5x*d8sIrAYoDvu_#97G+)boB)Twb?Q8P=%@yzkagPF93J3UmyCVmjcl?YDo
z^|Do_M4*V62`ptzH+ at RB1-eA|V5v*a8lOHe)5K#MS2#282 at NLpv2pjyqD|Tytl_v*
zgugzPUsLGRK*vv9Gx<4s$qiSn(eg^0*=oHBh6xj3u4F2?qUDL|Sdmh-c1}R`qLB@!
zbfCInXR<ZBh=k(KU20_mFihq19QbJ-cbC{SmFcbB^mVfeX#x^-L;&Lpc^C3ft97E`
z^+F!#-Jv6e95my6?;q6>I(Ry8Ji?b%9 at SC_9@gV3AJ3L+v}SMtQ|Tn|GNI!<8c^b+
zqtw&*BrY&~>}2>vR6oUaShHr=iJ1L(a)Eoea+{ovo>)+Bxxtv6SqhQUXe1qH4i{Nk
z(-ke0&7%15F&bS7)Dg*JUa%NGYZd3X3e-QpfEJY{QpPQ&=3WyEpUpdwGSn5U-zeG`
z4f!}GWGxKz at D8xXt3ktKe;OA)z&EW~fWu?do)m}hz?9J8Yo$x*2sAKR+}>-;SG}JL
z+~%m>!l8r+3nd7pT)k9X23kbiwr$@r1oROC@&FJ_EslvZ*RPbV73HB<$SmSX5^D<s
zPue^u{>S65SrEcD!QzI1>nBhoO2_lOf>VQ4o(tdROR-vM0j*JZk|<Hkhce8t3u|kZ
z?Fsh8L(k^+eal}do7oyML4jg1wt;&WHZ+ZoIfb>7iEFz`AbSRE({U^;DfP8%-KkYd
zZHHm7j?QG)3spJ~%QIHX6|u=#sZQez*hV2o-&*5rsA!osq*<!w;8WNJ*futUwOU_;
zevdQ|$|4FZcdi`V&}x)k$gBd;iJ0LRgb3eD-f!E=Qr*{}PcS#XFf=-?@%cP==QoFs
zIlayVBQ%6*bRf9jC&zT;$B<o;3CJI=yZ at 7UN$jC~@KSSc2iM=HXFo;j?;}^lp2;iz
zODrjE6ju2c!ArDv!>X6q9k|DnzQpbV`;!md`}QbqjqJO`?!k5Y_b)I%*t?>a7`ADA
z|0P;y at A=;^vi)d>KgAYtZ{_)C8J?s3^!J}-zk>1DCH9YSUtrI at Z+{N!@#cHqehBR1
z?a!c?5gYixGc1bv-|-AfgY_8LCveP#bXIU5S-Zr38N&gtB+FHm_Tz}h*?Zr{-K0PL
z(zEO$*cYLkFXGrUdx`xj?n{&|vERfo;Lo0Acmh-h<i^Kl>-&LesLu(HF=ukjL7sSQ
z>PWFM!SE29<L;zudkyYS#Vc!a-Z=>)V)ejS{S>h at tCm%Uk+51cvoQCqp5x76IX~qK
zT!<p at MQHjtxo+u2&$(5xFNF1?fWdl+MG_2{7^cM&ECFs{gqfx%nYNN(1{fG~S>!~7
z>7gXk0|6EQlUOpCl2q`xoWc5zr30!$=bB20#R74rCcr;xMDRde2?bPw(;)o^AnkAh
z^9pEq)&zgFR3M=wmzZW4%m~MIgbhLiCYE9RiyJJI2s16fm<oPrBN(SMmWak;N|YIp
zvc3$<p=6jTI{2kS(IqTbD$OF0KtNL&4yBkE%o$oF#F!C_K)F<=9yc;!Ek(FNn1LB<
zx~?QrNtTX=m=VMa#vvAdFsVcG400j*(L*{5r2<JTd?XYCJhf#^!wA5bjOAH50pZDH
zC>2?uJ>~ETs;3atOJv2+0?8#js$+pzIEc80Rh1<JNytxQkg5)KNoW1x)wM{Y26K6I
z1E^yLH^p&mbHi}NbN!p=oa$fo^*{QFzW%45=<7cZ_Fw+1zWyh`eiOc*1p6rr19K6~
zb6}naa~aGFU|t0CSuihyc?HbtV7`cP!F(CaSHOG?%-6xZ4e5OYZ1xPe!F~tKyI{Tz
z=DT2w=lc4;2lfEK4T2c~vj at x_U^tk2z>I_OgP8&|3+5=8MKED7F);7E*w?RuZGd?g
z%xN$=FzaBdU>aZ^#d3mq3d}_?&x5%P<^?b>f_WLtD_fY?!F&<STVTEn=Br at 72IlKn
zKEwgcyI{TzhW#Xz1<WomBR{!yx<4wj2lDOJx1Eh9OGrN)d#C)*(3p*;c;7QLZsQ*3
zr@<fhPI0`o!5{ZQaV&rH!_Sb7`>1aM%#e)xF at W(&|4)K at r*vNi_bv(ZIdESu-LHci
z_g-;)zh&|n+IPh<|6AaHgLEH)yl#~F4nSVpWSWnG{~n3wQ{aEI^#5&$d#i;18o2M2
zdA$SfyQKTi!R at V|yk*wvz%!e6HB)v()quO~Ajc7~t1uZ>E3m at m?g6K}i6z)gW*1A5
zTsCWlt(ujs86}s`*yJyzBD%&2RmwHHQlx#RkWObaX)Tpp^0BVCqAX0VhDZDY-;T5M
zSs_b7C&JBB_x8hK7kpykYMUu?oqM(xKmi0gUGQsQ;&N?$_}~;Q?ZXBS8Yx%~PrGbF
zhyM&0>qz=9;vEs;+6oVbk{DIS>-3)yM+`ylx;t4B1(WzVZDFv+_af_f_XYrKzuvwt
zfk3K_dHB`UmOBJaa_AU^Vqm?8Q4TGz2E3wZ=ypH7R;h0GLsq%n4{=0-ND)DtjA&X)
zJ5?<~a4=hzl%krpSqkOX#wX at b`pKHZ1%aQ#!a=MIy3<B=Mi7Nu-NAxZol&`21NL^c
z4$L7h6`Ya at iyUAU#+6)S9#=yEOm-k1p9Jtsz%Vo=qbm<Z=H+s<dtRkXwj at OMaDD_X
z1eTw8hFh+gg)(lwyL&A{_5xRJxPHX5u5i7o<yTSk%c7oCErm+n-7OUscVcHthN-%W
zz`z8HZ<zKx;I!Rk<yf~c6mfxmW=Z)u+s&&`OO<69#uM$?qnvKFZjzr#TD6UeeWocu
zlZ+VYly*F0Jg7!8P?r<eE_0(Kqgnv?@a2%PtVJeBmMUbV3*~TKY!EIxxGy?BK0P%-
zLRT}ha=){=?Yn8W7km4x-0lsVH52>$%tSYNk>-$a)xGCr#S8#FVWd>GsyaldSP<Id
zt<L~8;TK>J%Z5}wY&ls#*C~9=s^rI$sX!(i(L<SNN=pO`K(<Y8OiB>qsm4?z?-7WD
z at LoaCcIr%ZDJ7dCWR|nI|LJJfBXw8}!4P6sY#>f(%d%%1c^(fZsx>L}xpf+y;k50V
zwVI(AE`tQ&0=3}^IulTV2Da!wtucHpQ?-po3EL}SHpE_ at N>XaB_z!Ch=+t1Ps$BU7
zLPC`4F=)4XrckaOoSB&BN1+{|#U^oUop!q0gAR(IM|qb3w at o_p3tPp)S<626Bg#<F
zG49+nk1v29PibL6(k?3A^Nady3oZ3b%|XmY=Vg6e=^wbRSH0Ivw?Du4uGv18m2>=o
ziatpPTe3lT6ncb33_`NPaTy^xCT%A=V*8J)`lOnII0Q>FTuMYph{1a0<P_Lxvw$<k
zYSB75eM-n!ZNQ+3HP95cij;FO#w!tyyS?LMRTLHzep)ox^z`$ZT`%K!2%v<QOpD<@
z5)UN}+IE7`g}#N{m^;mM)RCKcDj!hgv5~~)BrL6X+O*41yi+O+s5Q%m=?W)=d|{2F
zs0rXzGHsXweS|vzwBS0wGjX*u?@p at Uw~3enp at T$A&~!qq2X{2BMwKQ2KXiGTYg8SN
zN!BddF2Z>NMpr+NIwj#Pc@#N0;KsNR2*T#8tphJ;2^m{VJL}FaVvb`#bKCm1 at 1V(C
zZlb}Qj>kT<$R&Rr%2&u*qMC)=6?4O2MF#{DEM at g-(~npP;U&K-RS7}gxX;s^@Umsi
zGM!3UhBfE7umvNEZRJ{wD23CeBh8>Rq#>fAa!G`V+Q2P2%cx{j-Hp at kA4u4_bF6!q
zs`n0q)v)xBTjp7dcBgf4c*b0;4<d^0VNuhmsk(r062KjVt!x1gGGutq(Y!spb2Jwd
z#=2$ZpqYhClsM}x8M&e(Wb0`MQmqvrlJwWeUv)}NA$Z{rK(fl|7_o~#^ZMbsqxD at 9
zxwYi#UH^C$%ZuH at F17rlB@2>hLZ9gG?=k+>Y&r3CmAN*7 at u=Ij;pAZ)Y8SVL!MBuH
zE7f8fG+j?Fm_l4!wR6B1oGhH$57WNYs5Palmz_;A*gvW~VchGH;}4;nB1>X;uAzuO
ziu|@J-VZB3<X(WJucd at PqCB@K<@h)(Czh<5D<XCd9l6H1cRhOzEIIZSAb%a#K=q=9
znIcwVi%f(OOAAYX%k7)s*L!^c>-mg4^QAs@)UKGN1&)95V#NxKC)D-nPK*Y=Q9V(R
z)2n-??Dza{tz}!Dbsy^rEC16<70=0J-igE0u#TP*YwC8t8PD3cm17HLY9DV~AIsEz
z-gIU*!)*R;7N!;NP$y1 at r)Py%+xLtIpQ&l^IP9X}@ju+mww3<jX8K**Ni+zxQRkLP
zTRlxpb*a09`}n4MxW8Es?f6c2 at e}oq&ChAI%7F^Rk{&Q|$$?26ffeC&<%8G`<TXjq
zny at b9P*e at q>vhMXRDfB8P5>?;*ETI=ZGdRYPQeu}EaaM-L#;d{2yk2?6N%CRFGii^
zIM~H+w!;tGd8WD9)5=e)mucb@(kYud2=l@&mkVMm&Gpl=)xrt0Shpe#{I<HJ8!kB6
z3a(H*VS3G~I;?AFY|Br0;Ql`F{7J<~X>%k+h;=GO&9N*{Gl>d-R_x`PZq;C|mME0l
z{F}47$1hZ(^`O at B@%EL_I`$PM7b at 4#kqB$y2hpK5g2GaT6%C^u4e3w_0#w7xXd40m
zth}`KGC4&5bFyZ6f#+6pS&mcyL*mS6uRemXQa)7&Ck=!skGNTAvO7Sh&{wsd4O<S~
z$Z`rzx$;1^mMVwy&ORPp!SajS0Z>D$7Kf>T8x2}t$-d>uNyb<0Rim+wCk=?4q|LeU
z-U2Wat#L^WaxGv)IBxD4V|Bj<Mg^nemS)N;)8u5!L=gJa{WCBc=-Dz4CnNhf0P-;8
zh&M6d4_>_p;U^Y>YxH>n)6wyw+djPB!B0RBA;4fW8vTjG9~J!*_!-7O#tBToaMM%b
zp1n&-YDOgG$4yI2MgBoAOv<k(#GYls5F45(KpswGX-{B18?v(fO8b2kk#+`BN3fNo
z7`zkBv^7e0uKAyCQ23)d1#Q9+)1h1v$&RqlN*oH{j^%PsHWZ6+{kWp;qk8dq{gvbr
zj}>arNgRKix&RIW^R%t&6z0c0^UQ=FmwRr~jAnNv8(vr|<AqZszqv8Tm0`iYiBdF2
zrNE85a!;FQta_ENSDe~@_^ra4bpw{+D7Qi5p`YWeF+E}!fE(Q+Mm)pu<p?+eC~qAP
zJeWaYmt{2*jR%&-Cp_gxSW(ARt$NgTCEP~wv{542E|W&5 at d@0!P1Z~MxClN;*`K1~
zjpgWuGZu|@wH(^z#U9Obu!!I&Sh>+E-zaZu8)}D0QY0*}A~ZrqOKz_T7uK=0WNpj#
zg502+gv-`GZd4&+jP8*U4L#D)t}a{>K|<~O at iLqP08dtsJ5y?B>8_=xZ;Iwc_7vNg
zkspk)<Smvz=r2T9ykS at wLWYR7(vedELv~Mt$O$t`sp22KhGVxMy(=XM at SC(DfHa5K
zgZ;#I$^XzL;J;0Su3jw`T-=&&zZlUx-=a|=hgN?G#i*P3yyp`kkL+X$Mz+xU8aP(k
z>W%t(DZD`w$c7k$j^G${!WCRr!cgOhvG%-(mc%HmG at D%Wv{$^~)T}Z$rX^SuTU5aj
zG;X+q1ZJ)39y*CpG)}^5qF?*N9y&^-G#G?q`{-U+lh8#NjQ<G-ibowGC=;ig5I>Eo
zBj&*`5Hz~NH*rZO5QYPg6oQ0;5NO?RoPj at Knh0{fp7Wurm|z^~8#x7<2x*$rL&*#<
zO`bawEf9AqbYZ4i=V|bX5^9<uhjXf+q$+1K at fpPc8e;WC&s%K%s3tqB&zm-GH at eLg
zb%&P(eiD@=Lmv2WS#%hvdBbhgX4iJ>5I7x~9 at cO&EE|F9IwVO7)@Sdzg6NP at a-DOW
zhOfy5VFOQx8;P6*skshZ0l9oa?iDWzv}k`x6Er{=>R4xn;-Q8m#Zz8 at HR8Y)NN6hb
zl80WB73^Um)b(3VMpjf~#*=|ZW;w#+IBeqReZboeP6^0P5dQ($NMr}Z*o?IxSw&HL
zdFjyM9{FN%+UiZysDumoJPKt=Y{G7~UKpk9)bp6S1XA5n`j?HizMZ#>3gEcnQk|fI
zP$x_R$Vqd=!Dy{jFU|P6jO7o=x}nJsg=QidB^-}<zg?$hw8P;wkWeg;Oh)2u{xI2g
z^{1&e63zrdhH at f;H?D)2MjOmlVR6*cl5EF8%;Bjd?eTm3RlrsW#CwK|w7l6xD7!X%
zgW-@!fOaAd0+*l|8Hj}eUOh6Nd9JyB5pFrPA)!!80+Y>Q&7yS)qvnwQFxDCsnnvM+
zeepAW{a*p|O)%dBv**RW{v%)vFzaB>gSiamEiiH%$Cb(y&Q*bUoX+csH%Fm~d2xq8
zhmwX2E#7S{)d~Zb*sX5{q6`Gxk}eccCNW#F at _bU<9wHHX65tnigKLglUBMs~CGZeH
z=L^{a3OClXu?-~${LuKqJk5bP6lJtPLY!;MsJN?CU(+m<Yxi5Yl;l;Rh=o?+;!>th
zz^7}gMcjYd5)Rix*h#6xj+p0V{6t~(s?mkK8IQ;HIgT1(%r&chKLDZd?q)&>Lgmzj
zMwG(GERyu3g9&*f!OBsBov=bkzdJAx-%kiS{Qiz@{r!E-dWKrkVMs1ov2;kJBm5-;
z)ph<9a^e|0yT>^c<@e_Jha&bI53TDPVzDPS9~SuZ{Zw`d!_m&fQaW^!6Op8mF`%z6
zMKUO^ms&P}c~Zh8yAC68)wCU)EGQwNy#@Yw^b*iUpwtl~DN)>F76eCiB=QaLti1Xq
zrNLnhSt;XDfL%c?H4a~^kf^YPj|g289g*mWsAM+qwoof=1cLO$xiszQY!Cw|4wO((
z!W3&(yf)`<P<iSE|B@;k_w<RBLHIfKY)*GG$aT;Y2grN9u!^d6WE!TuX4UX02Dge@
zxKW!ZPSUCcP&8T|f{8G?)eDP=`l{5^v%iTQZA9VO4hi#n@^$amySg|6E7<X<P1Q(5
z<34Y`v>_y9<J<i4Ovb4->0`=E9~j=cy69=(W;j<m(-TKKSb~CC1D7c-H;9VGR_G;H
zgL2&+^czr71xH)ml7F(o*YHAQXWnAhPZnin%GaeF0>neAUKkt_mW3KGnk&PRP+Uny
z!s1 at S<})kk-E^wknGW?krz%dCkdTT%GFb3xUd$7)%+VStv7tQ&V^GLVP+aJ7Ra23y
zdz&~Do^in_wQAB<Ue|EfACU-}4sZ{Uk?V)|+wedOiBsMwMSs+lvRbP(Qy|z<4xxmE
zgp3a^j4$rmwfi*>S-Z9^^u`R7uu!(dnOHpwS(+sv_Ec5gme!(~fB_SGB#;QkBjO at +
z)z%tkV;dxMA1SZF=%}qU?=Lu9+|Qk-4iXj2O){QAk!O at Cm>0S-PHK@*AkI-soLCW@
z^0oOzl406}J*lC9|EZH>Q%4%|FaDu+04(t^kkcR82SbJGx at D7(APwoSA7ADcUBbYj
zANK?cw3+Pc8jEd&@@p`W8je%Yi<PPc&4cr>d#}Gfi`t6Zo-gkUA<@Y5Z>W>J0rlbD
zna)BR%gT!`Cqpp(;+~1If=bx5kP1V4G`g$<qZSTpFlJEdD5&J_wddhGQy{@XR~;7>
z8qb(;`V>ra!9nF}kPX%@36*(aqG?${0u05?C2x|6te|X0Sjb at mRwz;qb8nFNv8aX(
z#mB?JH0>dxWRHE;$_ZEqBU??SBO35<2|limAKE`HWM?3)P%IN78SrqWS|uHSDFawY
zh><3El;s9)jE_$nkIkZ%B{zLO?uOiNJa$CrU(%JOAfz}&;xRyd9=~a?Ur1a-n>jRD
z!`@AT=ZWRXgpx?{Wk}wU at pvMnyJ_GhA(GA4A52W5hwC4zl&Uxz(TO_l&syk{2}M(=
zfsc`$47ZgFzfm(3ls~B(I!hFC)R8hm*a4Wb+BuO{X*Hul<AQrRejtoO`%4OO#w-?@
zj2ltmHdereiK0y75+oZJd~H0ehG6Qg*(TS|l~yZ7ls&?-V%`)l1EmoSkgS(hp-w7!
zE>e~;=w1ylo_Lk3v|3oJBWl1RLa~dqKM&=dj7CDhfaOSHCu(MC<K9?FsoWLHqck$!
zG=QieYufh#2(t*2Se*nJUHn}DZJ7rIPlsd7bjSBh$M?aG at 7a#;`#Zi5b$lQ0_&y@)
zR*OJ45EZOR`r8kUp9#$DKRJE>+~HGnm#t*hT6Ba}i2aFmmJ!O({yo$2eX!$u7WJf+
zxR48BF$4P}q>kwVF(5s*YF5-X-KqlWV;+3b4RHfYOIl<pfI2MbTTi4?MofeyQyD$A
zjI;`Emr- at _fC%w8^xZJt-^c{hPzm6h%*4c9j99xDe&`v1q`hTZ(6o|NGAGQUOP?yN
zqo8b=0HD_igW+qD5B2 at kzx(Gu<=QWO at L+fuCcl->- at _J<$Jx~HJ;VmKU$+Bg?Y(|-
zei3))P$-HGu+yLG>u1}yvntxx?O+YG2Yu{3+B<i$r_tUu%$`Sk<W}|q+I#O}Uqt)v
zyV;k)?qfUHSJ584iM@^Xp1aw*U_-)e*S`WA(#3T82d`%wzjqI_S+qxPVllM$+`?AS
zzV%j?LmSesq7CUk3N}96_B7f91MD)|fG?)E?YisOi}<}m;JIzrZuUBU4-d1q&<1?J
zf%e|LBK)@7*gN?Bf!o=;Xy0)s`!3pd-6g^yzkyf!`UlufHiGu9UF;6DuiwpP(S~#p
zZeZkgb`-zwxQoTmhIl!!w?lbrXhV6=qdmBrJ%={Ldl79Y at 0(~t{d^Vd>!9A=Mtg9W
zy^A*B%U%V0 at 7-(!>>Uu!(T4CTv>|*EZ3tIiMV+xf`u3xC^Ryq?yG1=<`;iUpM>ez{
z*?UEOV*63Oc4@!UuU<?0?Pb+hMY~aWmv(#d)veo&+UxJpZco1|+U*6j_uR@}L3{7*
z>@BqKxSM?q+lz^E?vVDiw97YN{r_gWTwA}odVjiFyY%W$^!)?(r}x?pyRO<lp8lb>
z!`>fS|DbPAJ9PFB`o4y7t$Y8tlf4W158TyikMF%I+GEdaqCGg;gM-YE_RtVJinh<k
zVrT<>8)!p5>u6tpJ$n at G-MiUSuZi}14sF2yWwdX*n|<-M&Fv at WtGH?iVN3Z9tBL^L
zR&>7;g;m-`YOU)e97&xuS_?+$FYb}!aU7&X5}|R_?P<_rrd;7OeDxgOa3NiGa@&jc
zy?~qMxbBhbz4i?+I!_R3#;r9od+yp&wu>dBp>EjlpJ0K#)ljSzqu?b>EGO&RHaO(l
zx$FAfBRAZ%=jK~(-Fw at WjmieD6B}X6tk>3sq^`RyL6YEdt?lQroE^8yLPAJ2&*5TR
zeq+H-_pLA!%qo~Hm|a8H(XH%$x+S-r;T(0GrPwi+WC}~L7>l!YvuHFB%NhI=A`b4w
zzJc0j!MqIS;<ka>b6}naa~Tczy#VGsxSs&?B$%hbJPl^GUMS`cWS#1P!yh>`eE_w!
z&Fr5#P_-)`wX!vblu=|#q}we6#mZ!}<>^D2Y4gDT{hj}5Nxll}M3Ge0{^$X#Q3GTT
zRPnI;0Jwy#{+Q!$>Z-#v9v{cQ;))XKJLhO%9l*oEB`%~%a2+}a6*h!^Vq+dJNYAXC
z;`2=<&<w-VDr!t$il<O7?2rs3JtjjOZ|jmK^Wd`nU`A}jw1HrJ(zuR52}KWaPpBIf
zSW%`j+Drhov2Pg;AFz}nWUmINg|7jQ)|*TCoyeq?jVa!S`c>hluLci}j2>67S}s8L
zJ>k&-e^os2pb-_S>IQFbzb<g$fYAxJOe6%PBZ+2+qfaIsN0E;XWMvpY!xD3Br2{i|
z{%&!Uvv`-VIo(AK?Ed%_S5E at C*%fhDb<pEK*x}FMW2EV3SN6JbrT-2Y4<Ay+p8sZ_
z(5s1;Ylo!bf?Wi$gWwSobs2sW(!fprchH94UrPI3VY6?O&DeLP{XJ>3pa>t3_Mo(P
z3Hv8Tq`gPld!>Dcw7InJ35xv3rR|sY6xipn0tas;9TS(q#(TSOf{o={1U$lEVqoH6
zR4 at jZ6)+EjISnQUW*tlsOchKGOasiLV9tYi0?d<Oo&xhUn2TVZ1M at tX%V1sr^CFnf
zf_WLtD_~v+^F=Ukf_V$fm%)4m%vZsD4b0cUd;`qeU={<zfa5UWI1D%r1CGOh<1pYj
z3^)!0j>CZCFyJ^0I1U4j!+_&3;5ZC84g-$Efa5UWI1D%r1CGOh<1pYj3^)!0j>CZC
zFyJ^0I1U4j!+_&3;5ZC84g-$Efa5UWI1D%r1CGOh<1pYj3^)!0j>8|vdc=Cgx<p!w
zOB?GF=?3c&>82>{hP0oM_S4dSUfM58`xR-wDebRF`|Hxa(mdo8H15)|OWRjmB_bF;
zAj1b__<#%_l;MLiTqd*^?EfM2QWgx at 8L%_?Vr2uSr?re}hx3k5jf3x0;Lf`|q;bzX
zV;k8#?h-fmR_Ufw)~eRT(tdoRrKe at r@bx3RZ-5zn&<Fg(@Ce?CAK20QAh(1;x*WL7
zJ~0Sp514_=ec<i`ci$&o_{>Yc_VTNr|E;%vm$@~Esz%P=e&^ln<!$T}FK_GnL~-cT
zLyz7(bxZh`qkGgnuk88qp3tqoaXVvYhb|6%^5%WFME87YPvX{JyZsk$erV52d(2xO
zfw1DxBSXJ3^x{xs5AbJ4e4ls{%u`^ffy8S~th#<q--wsZXf78mlr5uPwvY!=*Uts2
z)#ABWVQn25k#IF9I4#t0wTvfiz*HGAs=-yo(SZA_*p_5`wvKP)a=0-?QR~z2rB`#L
z6GJT!=Y$|o`JvEp+?%&@YZj#>(;jm;ozdg#B1$rp(oj{r)M at S0)A3|rfhWu|Z6&+R
zgP+sAfk;_49q0G)C9~iHjpgQeG#uvBejW%Ze8!J=>(nzfe$bD4b~p)6V;rg|RM;fq
zpxQ4!<>$$YUBbvw)5ge2%e3Pd7acmrR>FkH%nGT)suyc=9&*zSTX_?F=Qt$K$7XVV
zp33J+vn}VrmUE`%oEA=Gv_*<D4N*3^r~X4rFOV(73N>+f=x==)>-3#A%Qckrqz`nE
zf3wbjWk)PT!a*~826daEcCCbQ_#-n at T%FDZ`P5^x*jj!*c?it(Ec}^)s+>GHg%SXm
zPOz4)QYz?ZB_lA8Z2<YUe?grR7O4BEUk+Ej%wP}qh{wFw-(`>4<1y;r!?@|G9qD^b
z_~wf at jo$L at J>Q1R-nsqA2mbJm=Wc)Qc6O6`!+*R9n2MVgw?Dn at _qV@0 at b19t9~%7N
z&)>8Dq4f_vbUpAPdyJj_f#1DdV1L(k@%K9VyKM;n_PZ*<!QHoGyR0L(Zb^2*k{2RS
z=9jyM1d`-mul8xi(lO+Vk7Yvm&O_{YCJ{+w^gvQE9%L*-196CMrG_e2Lyj7mIWAp-
z7Rxkp&=W(xO>q>b0`Q4K861*!rqcP=$F%$5>-Bz7EFD#J?Gz?IP9^B_N64tam=`PL
zfyDJ(p+XwXU~Pk{LwG1?q*P+PVTEF7srW%&a%w^{Aa~C9UgJ8&v);I>9^uA{%A+vI
z$k%pOTVg0V_bDIgL3f(t5riHU%2DK3yWolp!#1s#&y*`0WsYrwhdoeRv}m{R>XuM?
z2s3QaqASc0V3i-KTXl<99Y_k+fXz3O)}yN>AdskS(V2u=DHahMZH2=Ma-A1&F!el8
z<%WwjV_T at NrQNK*)oZu at WW&S5Qf905L+KgDKKW;TsG+PMq70nhtYeXndhRNbcF#f%
zusMLQAXLf+Hr6v$6g;(KE?0qf+sDUaD2PUD&<UVU`KZoxoX!bFnNVnkH=hdQ$&|q#
zifF0v7ENg at i8($_`wkPNGR1vn$k!3JTy}3yyDAjKLr8P2iDnD at YYo7EV_j&k)51%c
zs9DV7j)xHp`+3<C8cBs*K`0dtbgz#*MZ)w at -JbY@bg^3%WWOSf6WwcO3Tq}0v>~N~
z3P4h8W|0KWCa?)SVI*KCbbnHi2&=+`?J5M7G)Mj(zi}i;shMJec!}|eIn*bO9Uvif
zu5fAqp}|5n#1>`Eua;V6t=378mx?D}86tQg>h=Kk2wAIiW(_^zY#?M*^mWs=j0S}Z
ze;s&+?7Gp&1<E<<DtbhdeSj2}qBIMQ4Af0|&~zNUK{MaGom;rB7xFD!rM|T}ASuz&
zfU(Mx<h74QR9MJ!3+2L at 4g(NZRfZccT!<yIXna|ZaUs{Jnl|0aas}S#jSphja9~cD
z&Y70L+?6iBE%2>+s+Q><t)Hmw6V;E3*S7Gs1g}>|#h at kLG^@zk!h2 at O{Lj&dUosm)
z{;q&egiSEigj*?JD>T$C=5!UHwti`>3%Vq+Ne71cA`Z at _daVwmZ8fsRI%)KcDbWLo
z&@xdTwBi9_i7~*iS2J28LqhuWt<h_6R_l$m)_}d72!y=AeEany9RI<8*0+5}|A24j
zuEFbeBTb<`Nzu;vLcSt2Fkmz>R_m4>pP{?8B#zG^eQq}%kvY2qG47*aNGy%JN^|sN
zA`dJrfrnz?<*I{6K62=guMGxq<cYA_f|)+}kr^NM7s!-u{fWJ0EhsmaTODT$T0zxm
zO=7`$t2b}al8r(*A=_6dSL@<kJDd-VN)6gaHP>i@<43t(FQa4va1vaeXS*tZDGk)w
zN~4?!f6j&41h7tu&QDE}!R~PCWV|{xKZXKAxS+vupL5(4T4jv_ZLGu04oedLfLr5`
zAgQ6k=kj73^tPbtSg5>bp46Q|_`u-c(5}`GJa+B5bK?F$;z8??fA~|+!g?H5<bxx7
z`}+C^XkQACMz&wKW2aoS-s9gfxU=;Wdt9{M9~j(u^IhZ9KNe1=&5zdp;s12umwxrv
zp?pA0r#$3Bmzc7^pUsIiKr{TH))10&?GUYS<Er8A+flvq2<A0QTrTYdY7!T)SZNz)
zcAMJ7%T?%MCB@^@lFF%Hd1$UpOCP!MVJ*rGXf8gz^?IPMKR&ZHME^kiU?v#d0%CCy
zAheZCAebV#{LR0CL4Yu}g4jOdfye~AV13<)%Uz*a=+Gy-AZ5^Wsjb(o*H(X}x?Xlx
zTW3SqG}A;LC?`ML at jdOS<Ibm8<hyt_z76t&zu{1yMQOE;cOb6eA&;JLGTkb@?C9dx
zy6-}QqIkEe19uT-0A1lT0>TFhDc;Trl}oKxe&`-%1%~%B_IbSA7FtJzN*T?1#E);Q
zq+k#*&Xk4DfxpM&Ama4}Z*2LthWoUJtJlhd19j8QSO}OUs|F>(5FgUZn^3;yy=`#o
zDAjDN0~1pdx>C>&mF?8(RjJ}dDCf$0-%D7+O9Qr3L!CSpAS>cQx^$sjs*KC%N^&V4
z$)Fwyy!Y9>jzX}gK_^fwx=M6N)(g`w;su1D4KsU-UJt!;k<I-2MWKHa?2B&*_odHY
zWS7Bw>BWokovMr7`?_3vY?JGc?eYu&$I+p-d2G|uL$(Rylf2vAq&t`(<bqJ_Sj}_&
zK^><zBN8%%@~b2;V-u`*+NDQ4dH at p-BwTTEm|*gBqDd?Yw4yJ7uioMg81U$G&>cwW
zV6tAK6I53dVe2Cp$mq+eN_Sb4k);$)xD=oTGBPr_;?jw;v2Y{7;2XtaL(FN;m#CwV
z-fXPY%Ls(0r2|lNBaE{tSf{D%G&|2Ovp3n>RMFk#p|_T_uI7V<TFI=6odPbHbnbo$
zL|%FcTJO8k#<shTu_s?-?D4~3|14uabv>>ed)BwzkaZ0XsbLCdFML!}oGQ~f@>YnB
zic>0F7UpEk0*Tih$Wa15N?R0ODM!<y6mE)&8tY#8E#sU$6ze6NzD2yA0_{S(X}dbK
zo@!37qU1DeSE at X)T1GL)BHm&e<)|*7YmMBTudSW~bouwH^^5NVSMBt=){rmm&;yvF
z{E*+3^GII*fZG1xLD8?9bwI=>E-r%~4Q^nEE!z5!I;QB#&{p)(>W_#HzV?9YReY<V
zZ4Kd030g>1xM|zwIa+Yc$vsxj(tlOF<^&xsTP<+B+~C+*u`q#k3HmiRywTTvnh_PI
zt;tspD3i0OzeB98w3QRM*U&&g2TqDeib60|h^LD_jnh9VBcV^F?3{pgmFW3asp)>8
z;usPnAtVCC9>?aigK<tWC-Y-cUcEbv`%*(eDoFL9WYyL!dlHAVd0Ncl+b3ERFtHra
z=5cp>vg6Nv_rZSv*23=r*4tJjxyx}&uDQnO5>7qBg`mYwr*^>kuId5tsgF@#?=il%
zQKLsj+;?XRWuWFN>R;4xg$n)a2)~cdPB33WJhxUwGN4tT*yF0tO7$TU?%FyhV~{Zv
zW67=>t3{E*5%g0W at KSQ)^%;C=R>{#9X?q$UC8mO|aG)Yi-5ZnAgQ=mJ9(2>dnq3pu
zL*z42?MaGgtP5NgAQBdemgDh-goE^Pvd25Rs7fymeSRirtru{@!7ztz<t|r4t9a94
zPV9~D7YhQqixpa(nG4lzV_v9q%J~gw#QCvevF;a^j~QtL=C(Dwmv8f$la~*mh*=je
zT*&h*gab|s=sjz>Z;3Zw;G&(b7BJw}DxgfNiW*lex_&9)n5cV%M0G4mSwq3?O_k_r
zh^n}5hT)NN4VJKz3;8vnkpMNuiuA(uYLS!|8UhPUFlScrCTFdI3(_vhPf1)*XR>9L
z129OSY!=FJ6^rMtB?Ur|_Mx+oZzs9PqlBv63?PNK8)X=v6+*sC(OLk4X1sB|WYsIW
z7p60QtHbol+XdK^Hy*5Nm7*1>_K4d8ptxJMnP}H09T?DdmXagAB%27qzd5ssjx<C+
zzG^oVEe^Q3YTI(n@?knscjN4G(GBN9xwY8WT|LLEQthhIAZ;7h6sLk?JzmSgccYf+
zLY^mH_y@=<d~JD!DX$Df6c0QY-rfm|l+EJ?EwtLe=sX*57B(x2H+9#GF+|)I1#*Sq
z$r1yCt3<k~`zs>`;F=}D<QV78W~(`4Lu`i#Uc`s at uVvyiHbElDFyNM_xZ?#phZul@
zi4e!9Jh)KtM@$vH!%Qx`ft at fL?RwBR=kMi%-itnb)RES at 7cTU#ZgnesP44L6O_b*P
z0?T`n#0d~%xyAzag3bo!p=na2HY1oG1I9(X8KoIIhxO~GZ(JgI^t6lfO{g5yIA!Pp
zT2rEQpDUuNERlfqPn5BErM#95oM6cV0pJzJN$<C at BJN2U;DLJLP!k4i3D96aD&PDG
ztgR6zHOkOc5_jidt$_NqpcY1XQl8w1+hzzvGr=g6D;-fCqp%(%e$4SxFd#p<=|9k7
zBg`Gz-;^goaw8JYP(CzPZ_>AT>kc<Rkd<c4|6lw1XTcl+a}>-Xm>8Iv<eR~EBe~zP
zLSAssp8Ztxhc*0$Y3I~4HKUTiSF!{wc0JF%)dn3g0ubH*!-*peEGW(vf;Ge`!+pE2
z8$CWEY0<`L-gB#TTxyBvJh-BDcQ9LSo_R`<B05eQ9pzQ=-q$$Zjhv&MeLsSV0|bl%
zgGsHCvz)AC>M^Z6?f(L{fa at gvj-m!(7_LZHJ9335$Ev3|i5u5XEeIGNYwJKbWhmuk
z$C_X&3|jJr_-ZaIC^V9<BO3LrJO!tBFe_FgxRDLwmW<GAEi1Q&*o_xHT__W$*-JpD
z1zW3BTZ!8}BlPtT42~@JjK_N7Yq$L6 at uN4+$<X>4)v~K+YO>3pn#0H3NsK#bZ8XPK
zA3pvw$0sK-F;rZU%L&P#$w}UH3poUPEi2m22LZBw;W5taieIc at T;+Roq5urO7LePF
z$>jtdj$sz<x(T_Afv-DiX*_ty!m<q6PV_;9wKO!d`=OL!9x8y}oVTvE4Oh7#_9AUV
zq|zl^XfWCA?{=+Df4O~&-D6W2odIeaoBYG8Yn%NnY at oI_YlgK#pikh%?&w at o8obvY
z8YFRGbt6lT3^+0ssY7`!gDOWb{ZuuP!|`UnB?YC><D}a_r$}wScp4j;KNB?4N>s_D
z)QCpc7Uh21a)Ne;-$SYkT~fu1i}bDN`f`Ml_RxyhXMT^kUkmEk2ZHI)sdN-I8-k}l
zlu3k%{^PDA8A(g0co#(6%aD7mFlOkLx}6ouU<yT{M3klkDLaCKf4IA-+J%aZvxa<&
zCn+{?ydgeMKL$^{*lwGs8>R`-V|<WG(`6?P7w}1O=u+G;*Tj_!EI#HVRk#{ljk=pt
z*GxaQc!Z!ntFE6zNk&x2asU1FZlf4a^MwY=T|iJ)-nUI;9mR=PHiF1w;5*ec{LEu)
zag0r(kb$M3K0O`uy+`;Z-+O{zdXMQRr*+-;9?OuN5pgCb7uE|k4zc*Ej3#&_bGhoa
zB at DeVpe}HZo4*MZP14dnf(chP%3DFf0vA=pb1J{sz+EnvOy`UXyj(8gwzQQ)Bn5zv
zwcNmGkB>GdN0DdOFz>uc_yc7%$EJqdH8vVZ;fQZ<c~qJ{v=wzOh9_>SrlkD9Wwn$p
zx6;JPYlD=hN?FjW&7mSrD8JSVumzV|JxhbAc;jf3KMd~fn>(#A at 2KoetL3{@|B<3a
zq6;~W)a4x801n=8@^WAszxu=8$XJQB20k_<x}Q-&5u4WjTGw>1@?QA0;*N`{d`0ks
z@;vN7Fpcb8rOb~_BFp{bqjK&Rhc$G(h3&Xy`*~nVK&BULD8^AhBNY{lyWh>yrJuT7
zhZ!gplm}-1q?jIY#MaG{<>$#1-vs1it0uC-o!lV1_Ie?=d*2K9*ts+3zP&5w0N$L%
zx!@9HIL$lJa5w{#5<a?;(3d<|%W&f=;qCEBbWV?m_fgylE1Ak90tRUa2xTz6=yHhW
zK++^4cr~X=*8u5k5T%n(k}~X597P+YTkhdzszPl54*~PlfO?J033Z}8Vno8==HUo1
zUX5m-7O#QS)I5wGoxCb`qP8HS33o0l=uN)rsFq%k+uCz(pH>_au0pYSvHvY6=195s
zI3(hs+-z=3x>Ou|;}+F(6E3i<wVd at zF}KwiLvbK!(lWT^O2LI+Dx9^JtAX0g((D#%
z3O8N7dQ~(ee5lquCCy!}E>!2ZWmN+t(6to~9d*40Y{FSfR^&(;s at P@JEat4y+w6XD
z;9KWJAJ^K)AP#k~U at b!DC-IsUaW at taK-<8#g~3;cE)DZyy3m^dkUOMxM}k<Dgb<2B
zC7!r;QS*^9y|<k-r5!jS>`F}s4imSs#B<ybnOu?=CnY};7i~k<z2aP*Ag{F!><z)Y
z%REpz6|=Ew*{x<iFMMnxV6XPXgyv^h7`x-foZQoC#ScOX+QwFWODqvri<Rsd9AmTM
zZ6e at Sgaj^B`{V*vy;N!4T*x)!28}r_-O3&1ONd9sZc?vG)l}|2gc!G4_(A)}HdNqR
zHm=tH1-$@hY~#chD{e8qVgskOOk7DQog=VM-LUcQ42j)~D^Y^GrpqzLx at 5fbcs<Db
z;f~94O&!f<LlvWe&Dgpx?L#jN at +8dt>1amA_ak1?iOXzF;MF+g?q#IxbRLqN<1orL
z?+CQ+3*ZLF$zUx-9SV{S#n6FDo<-`ok`PBa=_u(gcL~EaepqzTW?5^dISFy(iis!1
zyY_xAhB$JgjwvxS`L&i4x>{(xxwblaBBGIZ?7?70T&nU1i7NeKkHJ$;_x3_Mk2??>
zw!F&FynqwLTkaA<!?RN9+pLaY%@a{Qn1<djojBAGft{oWsbxPV9nmM{k?kqm)c9zF
z>e09g1gseg4G!caj-6#`ac&8 at b7ZCJnHxR+@<kiF-QUZSveqpQPjNhz;_I at 16QVtq
zoHaSgU1!Jc4bpdOR|jg)t=8DNRlAUrH=ZyuuDf~j3_FuFqM5K&G|&0kamGBTJb|;7
zLJn3=<uzEYSa!E^3)o5(%HZ+^o6~6qZjOuf(<?59bw#1CPmB+Sshf6(7TQQM5JZ9R
zUg2RyCxB+SQqIBR4;sJ|N23Qv<!%M-LJ2Kn%mV}XxJ!{-(e|cCI!g~NF*XC{elWg>
zxFi_FzvINDO~8<vSB0<RNIDbW;hH#%&??2^Nj#Y4_~#Vv*uy7&k%0)RErwk&zTk<+
z9PxrGtSQ}&s+7-WP!nJCTON9hk2w=O6hmwtBYdhET8X+s!a_Zt!<T6ij?>?u3=BqL
z;g>Jf4RcK%s|fw)`+0p<jQV2I4 at MCR<rvejK!#-yeo8 at B8O0~wTo<pNNnp(~b4CUG
zbF7f>1Q%&S&OMWy>%gKdeTcYa@^rsK$d4Cr8?!F%6uEvVt^##j_j4tes5R!ect6Pv
z_qQT>{PJtjRWG;*lj>v3^<q(G19%35v|Q~`l3=uCSzCmk3`RqxoRB3tCB%qEc`!=H
zFr>rP)lGt0VBK9YJh}rM+S<;KN7s#DJ_K#MR<X~?iVWs0OQ79)Taf&$TGX;~sGd{F
zS#%nkFl%-J4~*9>qoJbAaY;OMl at gCNqV8MTivzciEm;+htl*ZLk~OP%a6qj#r_?N=
z5f2G`et}A2l`HkNb*`r|CcZ<lYT=_rIk98c%%f(X<3!bdA$WxxtvDDRMNu_6$3#My
zbWj}0u9rx-L};;;dw&F at grwX_E2scC>M|CM5JDAXn?IHT37X0QX?erkw;@nYpmhf2
z9;EtMsV+`v6Lq7ZHIQ>*;Ac0)N{hB#P=hnRkn4%l5uT_gmTcs?TJ()DONAUhOg1NL
zUQ&RsBdql*IR&zgxURg12cTQHB0EG|n7}Jkw0q#y1#i;NHz&kmob>`QD!7(C<wxC<
zYQ;I}c`xIX--a=+A@~$S36B?Ye#a?K%#Bm<gujO^=EVTrAH?f}bUaBqw=LYs!4)=L
zp4=yPcCfj{x6#mRsMpm$mfMFXaIS1|tk&H1>vjpVc^9K8E{8)Y?NQRjW8%Gg?WaOK
zV}*8b#V)7Y4oI~d>lz*{37tHsj;DD`iZR<1bVVBov^>(NC);MH5Blj=5f{~srV1h^
zc3_&vlYFcpHqWJGPg5&44Q!M~R8NSlIbNUf#LH3Hu`^?#L?IxdWxBh`la4cnVudV(
zf<~yWy^JCaLI-dYm^Jg&Ok~Stu9yo=dJBB!{`&=7%Ws|p0Psiwr!!A|EjylzNvMTu
z=df at 0(Dj4tx`BSSWBax~+mwP5W+PC79vipHP(CTbiLwK*I6xslQomr=t2MX$?q+3s
zeF(SvUYO~92e56OX`}3=>54o^B@<HK8V1+(b5Qijg<u-bfTkJ;CzubIMO57iOC(Y`
z!|{+6X>Ib512y04%@2Y}1VR!{kSJ2UC$4ydp(Y4K^a~98h)j2~%O4-`n$QoXCTB%D
zhns0b{A8?#{RGC>W|+uB11=DKT|dvUK7{FO1$>5dT|^w4Jkm at P{3tu(i=iHHpH1rI
zqG~|DScI#w2T`zF)C^#mdkp_b?F)#rgu|O(O*r2e6>}ELCI5(iZc&y;rY5HkO-&w|
zIx;16N{LOnV0vcCPg1HbKZ0TP8NI%W?*}wE7k548#hXVEMl%!)C`G;jMAg#WLGh;7
zC|O`g=W&=hsfVM$8#Y=RnSDS at O-*4$SK<L*)TQpeDcqaRa-~dl{hXBXg)c29o<jnD
zG#uu!w5v$o&(|_0J^^o?EmZ1GY(t#x=TQCCSk>1N7kXH(lq$<{$lv5OT4ig(SE?>}
zK7SQ>MSB1XdWyH)J!8<*FZF520>>XAF5D6*7J}<E*W<ves0v?)6=G!#=hvnz6ooJK
z4hJ+KRH*`EN%v^rTkrUWMgbJWbl$TKic+>nzSGnIz9((8y~$LCbbxZIL0xy}krr&A
zcGmlDOW4Lo%=tbZP2;f2k(Y5V4!iHI;C48~<uJ0f<&&)N(prspGn|c5sKuD%mBhO|
zEvZksl0)pog!|q)ihMQSTNm$?PqgGj+n-y<!xBA|qBqt_n>p&w)<emO=37+_6fB0n
zO2qqq5S16kAg>>k#piLmd;By{pp=TdE)W-j^~mhDbP!0LEWxo{CX&l$%{kx6#PZ51
zKy+q`_Fb%O(=qEhj-bPL@<bqhO at Q9?jrBPk9_GcUL#hda>Di9&Bi?T;%sk$vS%+B?
z>5!@)d`Rbr{2fK2&jo=496OlXKQ?tRS8`y*cSPR*To9pKg1IowUyror<qs9gbN8e5
zCX(zd;)05VbUg|4Rx}uMafgpKE0XgrgA_Si(x8#&o8z*!;yW1%9Y5t$Q83 at 9=X21s
z<SML5S0ZQUXw4Eei;fk_;?a>$YoyMQU)GUe%y%*s4JX``4D*p6I3<+H3u*M|%qa*5
z?<oNZu4#0kju)-ba=|h{0O;kMa3ph8cYg30E51<njM0P_E~C-P&YK?!mk|IYAsoo>
zi1$BSNo&8nAR4aQ^9QFKdY^)>V#Dw^KkfKf|G>^$VBis)3iK%PJ{{?!lw+EQhbfkT
z$CIzmC#}NT`fA07SqUGahcM{N@&t4vcn+aN2!*-#--y}iJ^r=kpmEz+w^01TFr71E
zX-kWn{fMOZH8hyf-RqB6iz2T=GWo72@%dSCbJ4wTQ>#>X5haXC?GJW_30LnYO>$zp
zMLtA3z6CCwdBPmxdbM3?!3hMb9S>ONsy4kLS;;%JA7eGha;E9;4E|l+z`t3uNM1D&
zQWHVIVWXYO+twrK$WtJV9#*+|2^`hQZXdul5!nV;;}vKrS#@6jSfQK0JY1IT3baDI
z*`i938PQ0T62rtUdr9n!dA?ik*|z-f0;ydoio1s&yY~{^KWyB1iS8hN66_!Jhj`1=
zo~`(7$IjFmxlFc{qdWQdG?eEh3SHxP)`Oi#3D3DhlHe_b;AfK=&^72bNpYcB*F=B7
zPhIMS)$OHX<%DU|J0b<##m{yNYxxU8Zo9Af(#$2gv-uUU at y6eO0vqpcPJxa0H&w7v
z8xlWwiRv?cP}Ju?I4J6~3O3Th$HCqS_C>H!m)<YVUSijS{ZHY0H`t#Cdl>B3 at 4rNP
zrTzkJ)EoD=0CywaH$8NTbU$ifqrRvoz`hym*TB97;laKY;SOJ7sEbbp`!;M(uyqY8
zxR5`mZrI2b(Gx*XRe at qLwjt`y!@su9c}Y2cTbPHprS=e_lem0ouCGVkwxZQ2#wIaK
znupwW^Mn(@qQQH7MmtzrI-+$czouG|&b)ZmteUWJ^U_FLc<WM3*F125$`z0VobK_3
z3Ztyc18)i!iZ}3$vuZV0=Q+%(R49v`wPu#>amsRRr>9@#K0{j$9q at P=@MEainB?WU
zV6+Jyukp&K*m}SSysM}@nLFlL_c5+b<%2G>3YkK;DF~%~0!TdhNOK<mg_4FRAJM|l
zPahBrdGi}D9vZ8~RG!%OP5y0uKzBLsw?dz-Z=8DC;AyEVzuk)|P(;-sB)tAno0Rdi
z`z0UP1P9~FCO;*phCB0-#ccEQ7PX6io1ZLdo1ZLRI~){Id{f1TaPw1dNyaugiB=C2
z=Q`bbTq|v=KN=U?{k*m3^~c&P*4km++VlFkwbzy=)n4n{Tjyv*O|-s6EqKDIk#%_(
zBzNL*Woc+DB&yR~$a<$2ImdRLV}{O(asS^RyF_FE`Ggqze>Nt@{y$A!YEP>{`o_Da
zg>1ICc{|tsOdm at 1ql&{r^n4q0$IUD-MmFLlrhHd}T5DqtrcYoms}*rO$yLKZ_i8X9
zoJ$r}F$cw#fABf{hxMZ|0aqbGGshpOS8AqvgI<P_cDLEd8Se9Z&$PawLHD=zI-C3N
z?o6OsE#AiU(`~)35{(CnsH+vSrkrUHGm3B4kUYj5-TlSa_n=L(S#h_zdpK&7iiCy!
zDA7&=&dlO=BnK8|bbPEa;qEh3s#ZC(NhyqlOj|~Z3~u#Kmn*zjTeqY>`PEA99Cu2j
zNRQX>*}sGmn&acm8|!0r;4~55b4$Is>TZvTx5F!Waa{!!Ld7D1a74om1D9Q`+RZfZ
z4j-XF8$OT}-jgy?nXoQzQNfD-OrZ)XL(9+<BlQw=)I%HNm#dV_LfO^bf`>xDbKw;(
zs0+FqfI2l#_dm+P+yiDDj33Mtm{~AKz#Ij$2qp|B1||+h1!I6&0rM~zWN-^cgM?Y;
z>5+0fv`!8>YDQNujek+fk{+Z7;-T->1#~{OsFt#IA$%mtf^1Pn2s(<JX<LP7O4&jl
zfC8Z at y88(Bw6tfWeNfobGJINwPs{LW89pP!XJq({44;wV2W9v{8GcZP3+)7fxUqr&
z!9<AQf}teYs-94%WcaiQr})97urVAR$v~7PAri?YsmoK+o|g8Ev?;GdSVe*62QpK_
zt$~~7hDfOCkM5>_G>nh)9>*^cS4o934@|jfX&v8`#<VBB>9%;&9r0v&rcjq;IA8>T
zeo46^Ggk0TzX)lnL(g>J0Qm=#(?VAnP9Wf&knubHHpNfidvtNgS5pmCVviPd7WBt7
zJM)hzQM~8?fXsEP#|=zZ=li%fby!b`yb+G-A)PQ*!lKR at X^J#N;zAx3-^kKs9kk;q
z>mnoSi|}f?(+O`Xj1Au1-|wz}Mx-16?3Heu3%PXTT4-FlaXmC8-MA(?BHcJAElM}8
zjbhS`>myaVvCpkYH?EUTOE<2S)}<TgxT<vHnyDe(!=$udxN+_Dq;%u@>1pZ4HPmy`
zjq9k((v54W7w;Ai<>GqkW$DH>)$7uY>#8 at U8`oA}mT_@?^%d#H-`6C}H^4^EZ-R|=
z^_MPgT!epHhBGe0cY%%dxEE}!!+XHS`kMlq>JDryiwZX4{xH~x-#XZcTZ4<_o|Nf7
z&qeyL$n?J~)BlD{|6Q5>;HXF+;Rj{>A?fdv{yU{jI*&$0`s1S_{n=5Gehh4E8x?G9
zmld$FO-_%BcsV!T6Mf`yTE?r53cSAlL?7YRkoY`0D)4zi;&E|Q;Bgsjq=(Of{Z{q@
zTfe8j|F8bt-n~sdXg|BH-^+uX|M&%>;ZK8o4_5c at KTGZU>B<FaQ?&O=`!;Eh<DQ6p
zf#~bw<qJexXpczy25DouuYlbzZN$I&rqKH|2<aeC-~;;u*e at acc4^-s?K`E7bon~i
zH%WVsv~QL+wv!6>4rvccdq~<oY44QwE@@vc?ftkX0p&j+ZN&Qz9~XF|y-nH!(*6+E
z8^jw!`g{Euwh#Sl7udbh#zE*cS^htN>zPe_-)FzFS at +eo!hLIKGv8YNx6d^9V%%ST
zN%(mi`x{WUPQTCYytK*hv0r$GJ at -@3wD}D{;b(6XJpWf-5q0AJa{ueLer%J=*Kh0Z
zgP+yF7mbee<a>_|iL?dW!I`VUl?q~Q*XuW)6maTHHANROd;DgL&k)`wDn;8Oy|4Wr
z&k`IRaJoVjUEq at 6d6w!U={Q^R`7<pzt+551Z<nZFy=o~rDQmM8oKxGfTG)-B6YaEm
z75u*OF9jSbG}tQ5pVjVt8}mgOCe*sw3vPEs;OD~8h4L=HCn{p?2z;{yqb2&L-}fb4
zO^7 at 6#P7tPT%<k<WiSM2q}&be>j1Y+<ZEn|Wb98bih4%<9&2=us4JXy)3a_lwuF0f
zkD!CnBc(_#i=rOg^ZoaKB+3z?9fgu2&qp at n_q3q<4!8_Gq1gp4R56Q|lf{cKwABUl
zEgk}vzxx(GMfg=W>}*fs!+qER(T at _A>BO?dGri!x_kA%2+7+_|nf6TYo3A}Xa9Yi2
zURdb{_j at DHQoU%++bXV9Nc)f9&<PjZ=$76`Z+O<FgXW&R*y(Biy>P>`E*;>8kWjDy
z%hOJ{zt*0iIY>z0hga9)m9B;U**isfBWEGKvt at t^nYH-YO%?uh4>&z*mn-zDxcI#;
z;Q&9B{^?oIfBQu-M~XWQJ&;3Q<{?pDdFLuxXt=N8c8o)|pnHTvZBJdQgnrTDvo!b1
z^kDE6V%42>9V<R7>6G3d=s5tM^|#^I6V!zhg6;0ji_LI<T at Y{xAs*rAp+okg&GhJA
zMz4B)vIDMHdS8`ru0VaS0{=y$RSuG{@AYoRjDT|m?t9_)(6kpWXrkhYZg8KRZqhxy
z1=uUSTQXwr58Gp_dFJ$kqJ671Gn3EuoIcq8GtGPxW_G#}>M_KOToLmYDg>-=F`?h_
z-^6&2iafW1EB;3T=hPk4aMTm_#I{cfxKg%OL`BACcRKYk(J$#xvG;V&es7PM-|Ve`
zkPiMYF<$B6C`nZI0)G2%1)P&L%UiX_*Z$-gF<)X~E2Tm&xcHAfL;d$^e2MxUG0#-<
zp?o4&?V0aGZ(pSJEEGN20>5LD&mp*4PjY5^t`~6C^>f_^aQXY#u%J`CEx%@)xh8LC
zSS2sEZ;v+ll0>0gDAh}}MT&c=ZRu72RLpO04hdfSnODWU_!Ujquarc7SL25<FaPds
z{e7*c!>-C3W1Mk_Ga$c-E}*?bW>FJrVY|m!Jkj5bgKr32jmN+^-(MDMS)7zd?!7v{
zfw14}h!f0~<z94m9uHx|Bdzk_5AT^q>&0TPp$FsqhkgCcdh2V=y-u;(yWak|BMw4$
z$Ep?Qv)6BHk8?Kf#I3Vdaf>)Fc;fhkE(G^_FjPfA(YwUi{(!&@&0U+~s55GpIR7tu
zcLNw#RVRM`+<8f6CX;sBPD=`*Olg3j1RY9%0YW=%hY}>vDFlcRB`s+QZh)~35ZDNp
zCdG&mV~7~tq5&cX%tFwhS<GUPfDyYIv}n}oMu-xyt^o>kv6BDy+<PX?OcT)6XP at 2m
z{K|)4&Yg4a``ml(owuxaZL_9qrg_WGXhWZ3^X6;UU%O`WM%tz}m3$ZR!8V?m+ick~
zOC#CFpV7vydQtM-*7ckX_P#S$?LQgQxhQFG<g_+{4e8tTkTx?+XMV<X*hkOiX?Jba
zEVC!;1~aC!=9(*KUl`S9(V^3szOD}0sIsm%bG at avSsgD~zc#at at 7>!RvLnbgIfrc1
zYtO%W+wA>t>mFxDo7Gp*yPx`G+RW=<@w7Jb_*PoQ{H&Ls6ezjzLiqt1>ua&o+Z?Xi
z$aBR}8EsOZna`Zg5!1GhyeF}u=&H5V at 3DPa)*qZVc~9t+cW+{~X<ct`Q+dzq<MQ0M
zk&fdHo6D}V-Z`@QqRdmTth+mrv5#(6Ka9BUQdxgp&Bm(^Y4dz$n=7wXuWQEFU3AD9
z$!>Fr+TUc1JJZ_SxVffAw&J{&-lj~ok at wDG>RiH=Y}Iww&;^^}GTJ(hX3X2ci=%Dl
zCN3!|z3#?C+w>>W&p#P$<QKyn(q`aY+nhS%bOztO&5Y9-n!U|M7pzXqIGtVZ-e$(>
z3{P8cvdu*|${!M+`5G(LW at OrQ<o(%oJZq9QH_0D?=6s)=vCW>0?Q`yRwX3&YziH!|
zjkBLmAJ1rW&X%&e_j)e;CUZZqe`{pz+Vf^_^V^Iz*1fii<g2{1w|Qx%Ht%wOPPQ4J
z)<%}k-&m)<4QKZ0yplNh{E@$Mw&JQws%zh6HORVqGoPpL(N~sjexEUK*797qEor@|
z9KSv}Q=9+Dn9h6Mdz5YdkVrrFzSn(7*=8c6P3p5o7hHeMtZiPMHgB$}zSxDE|6%h@
z>emGhZF5`3@?2=&E0P~mxkP?AVy5XdO at IERw~24AsofZvq0J|zwF%GA=A;?g+%bEb
zbFRCt>X7-9Z9X~syd|!?ZtIL~nrCifuRgmYGyQgt)#g*PthX6XrBiM0oYuydIh|Ry
z>1Sr1&cSbmylC^4hnyRywdtKUZ&%7spv*FzyJlVo9CK4&Xm|F7nQhvpwW*q^O~(0A
zwz)gwxvkpRU#&O8q-5RpnWvN1X8NRLn=i~fow9Q4O<0Gna#?rh%<I}}BX^+8PMK_T
z&&=!1Y7^fq?`a;ouD_Vk<`U~u=(FwyR+}$n%$wcj!i~wRtE`V5XSSAYI^Ltr`5U)h
zmDvxucgA@;*e3HrRkpb=aqwDGuIux!lW)&leZ%Ih8?TyezwVqi9eM36e~l<!d(p<E
z{P9dK2G6<f&^Eu!I3{McS)Dwz&97!_leRR8>$j@!CYNpgebzRz8($^A>u;)ls?BJ|
zdYffBE0Su#WSd{V_jFbyuQ<3SWSbXen~v<3bCR$QK+{&9Z1ZBqbl&U!xNP%U#=dj#
z9(c)hwcC={)t-H5|N8Y=+o(I{>OHa3+w7aQ&CK`YWt;t~FJ`3fp}fcadFy`2tZhm+
zU&|AFrs;?c>BpUeZRFAB&_>qpHBamNSH2>@zv?RcYyW2HURuBNx*`3!Fm=j_mz{h5
z4A*tCO^<rcS?>Y0KZ~2VhUdZ6SKc&h|KMvG{R6qnSbd$DF6LC5e6>9CI!4|{Vmd3X
zn)&6NsWwY8uF=_x-?Pn88Er1KKVNdwwoBw!w9ecnv?0Cke{OPPJX!Vb{i=eDb$$LO
z`Rgz5e(XIaW8N;k<{ImRL~FNPHRB7M*12*0%x%i*)+cA1&fV+N&skH`xsfOKEN$A?
zA6y3kk=Eww+2(EMwCQ-JwOM`jmTecz(&mfPmM1&?p2MLx#Z;SPGwwMgSo(|Q%gl6Q
zXL!ol_f)4nf9y6FzGs`|8Ew=>{npJNjc>hri~L63EB|5o>z~&B-i&Q(eGGFo=beo+
zt~RU9i5t?7z3QWza^GGNnWfG9Hl%OUX>E#TYZIBhO?0+4D`swU%Dc^5(d=zzowrkG
zZ!_z>MQ3VbcaCO!;>o&a%(Q*%HY={0<$lPSv$r{Awl>8XZPsnAD%o7N_3EpvpF^H`
zc~)k$IseKltrPpys}%D4cQfz%XB?|kn=9X~P5jU{9DZkOVYeyCXtVa(Yt(NO+P%HZ
zM%Mdw)b?pwz~4^^L7Q{dze_7w_d?ZXINNS>_O-OS=%#D0EL&4nHp_l+e&+U(ZQ|Em
z&mM5;y7=0X+8ORAmS(isa at AV(i->1$+*)&!^?QzMOVZn1Fw=A{x<-Dhsr<3T8Ru>N
zhM8W+kgp8ew>Q)q6w=z1XS9*E*Hu-iuUDFR9ei+xHf8c__iO8BY$w}XmeEGOC*S%W
zoHZQSu1{XLd0XvuTQmCpmuIwDaZXuXf>Xlv+fJ(5w7OQ_7fXB9O}43+>G`uhDL)yu
zdbVTYhu)>lOy?lk=EKw4$otCni|X=+>292L9bA$5JiWTE<fct>tIXW7vfjg)(Pm?E
z%j`G#QuisYFw*)5_I|K>Ytnwp&WvrY%$Sb+sTcVI_U3DAFW$C^{bz<Y8xPs0TQ1yu
z{kF}QUUy?+rZbRivnjKWRA<lB>aCluuC>1#EA2f^)-_qiIqRb9H(4)JR?l)H$$DSl
zwDY#zAGLo{NH(;-DDYCAMc1eAJ6mRa{@9;f-LzT#JW<AUuF7bWYu(Ma?~S<9-r at Lv
zG}OYs<MG5|R at re`f}Zwe994~kFbwBDWBPkQ*Jd`HX_SWjn2~+!(eAk-YpT7&;KX1*
zmd$y=2{|ocI32#=5}#YFn0kfGv1EzW-?vA!gl*-RdEQ at eiGkgQMZWJea9rTH<x>^1
ztcguB9{I-pKgj3(VXfl#^4 at 09e&55^ckK80zOtZId|KY`d*`#_Q*!vx_WL$&Ir%Oz
zBwx27e@|Y^7u{vOx3}!^R_nK%v-(@b4tbBl|5+jT#wX^tT7BS~BdtQ-`i`E|D$2<Z
z8+VCot^1a(;sf%1CM)j}XUSv8-p>g64&NV~a+i=F4%u~8tN5e5R$Ou1sC-M}(30au
zKPJzqXSRx4<apP&TJM$K_kH{Q1xNo|tM#5~-*c@(zK<d}(keE|^Y%|##ci^G^>(ZH
zgq-iUTCMk5C&}C8e2Kfny|Vtlwu)8chm5<$)8y|gX%z!<-!EvjuIXYYwu(FC@{{Fz
zuLBR- at 4Y_yk<W-H<@L{7ZPs(8c3+#-Cy)Nde(&|rxc%Pov5HpfJ=}ReZWBFn{Xf?x
z9+mehPP$vXDX;O_9?#10dt1f#<#~qkpd9b9t=4gQ$xquvNcLgLOXc!^uvN%YZOb)x
zix0`ypH90=d{%Cc=v`u14!_*~e7IS6w|GWgXB^Wi{!K2|A6vx_<m(~tw2H6Edq1Q0
z`>My7-d*w<hV^@&yvDfLelNEpb&VUmTl5F*_m*^K9ejUwl<jpVil at D2<AL4wdqE!h
z{%5B4R;L>7Qp4rzm>=2OYQ0}QbsZxg_o&C^`_;|paiemb?mGRr(HxciD(9*^N9DOH
z2UMP?@_dySs4TZx-A(rR<vb2QYtQ5IXYKb-ec)^MJY4cV`+YtYuDh&xTokt7&lo?x
z)jBc;OIxk?xYrD}O&uNOrwQIM)l=O6(&Rf^n#%3p{k{E{cJ^cmLw<J|leDvuc?3Bo
zqkL9Id0>Vk&j052ZtEyFG&P>o?_Kxh*!M*;&pa~?b4+V1Ycx&DebFVF$?{j9TgX0g
z8+i%2oqQB|Cpkp!AUnyOlkz<`F40AHle@`T<Q{T1xtE+z?jy&@{p8i;0kVfYNcNJ4
z$T{pqO~U2yQy!)~hrFA7Bzc59kGyA6epbLGM#&4wW8_8Taq?m0z2q{+)53T*klV=@
zk~_%zzeV53;dHsPvOQj3jz4!!!Li}xh3|{3C^|KIM)As6)t2gy)Lfg~T6;s?&GomK
z+Z%6hx}*8dmd}3f^Z#_um+rm)%U^l$tN;ASqf_fHeM>r~t?ksE3Hz>wN7eJFdLC8J
zlU6T%1OZhDO-;dNUx%sTsccToM`-GaVW_fW`s~ocP*X8f*^xGR(;n_hJ#Gre^cgYL
z at R+*ir)Jm`88hUWS|cGtjowh>F;WYpT4bd!z^vg>%jKEAmZr^lDhi$!4U@*Can2Q$
zm4C=ya?+*AWb%)TPK=dQR#r}Uj#}}-ty{PLDewJj-s^FBF8t-&3!?HDsDGO^@6^n)
zJV*ZWPYa`0$oq<(1&5R?<+<WN=bt9eF~4;OPMNX%_JUJo`K7G+MVVzeo?rZD{#v{K
z;j3pV?|FO4+6rra@((G?dOzQP#A;dojqC7LGneyMUv7=>h(pRU|NO1PS6?R2an8Jz
zs(eza{6YD?xqW$OT`FG#5R1;tEXzL2Pv2NnEc34oJ5MjmdOvw%(HT~K<FGR_%d+0{
zuLg at Rk?ZxH`7 at Sxzqas9S^wWB7amf+)UJP~tpBTb793K(#Ht^(GWAc-EX(En<$oR#
zlgl;cTD&r|EZ4&?_UErGx68$u<;$(|5vx at Fvogz<S?lu%Ykj at wTzqC`S=QULe^E@%
z&u`p$XJwWzwdyZgS!UHg?99xvtpAI*4zt$t*gL^P%5pw`_U2({UM%bXDR_Ej*{VOW
zz*^s9lZ#enmgRVUHnHGLYkKc2IxDkmPjCJztNuHO9a6TZH~%bqdWW5vS-#v}-c|Pc
zJS>)3w(Bn{mi1q7ELxdaw$|sH3uE^BT(l~)EbEWFvG6Q8zrS|a`{nfVhphQsxYk-<
zt|QlGmgVw{yt#0dtp9>DKbBdR^?zyPt(DXLt$)e7%(ATiv&lSbeZ1&fvL>^f_aw(L
zB46c@$^|ONp0aaX<r0-kRqn_g@=J+akz1LYms^s%-}*b1W4ROl5=3*y{h{1pe>iu<
z63FfI=j9Ge<rwv4-I%JIY7>Abca%Ck{M|EEmh~d!C?bq6#&G$!nH$Yb=7w{Fa{lK|
z&Rs1}7P&2c`AvV*|Bmr at EH{#?|Nh_ccYy7AtGHF9wriLy#Hv*>|1o}9 at 03%{<1#iF
zOy&R0w>nJU!ezoF9JxoN<u}vIf9-Ti{9$X|oqFm87sz#%%Ks<V-5Y<~b*J~czh>R(
z{qDd1oGtnLS$7V-?*6B&yZ!zzTk9?oIrB^*7A;EU{|hfIn8LTnT34yOFTMQNj(^nO
zW39XQzyFLgCMOpyO6C8P>+X%e?Yi6VZ~yz*@5JAFzZ?Dg+3)_w>n`Sx{r&Xs9DnQn
zT}+>6bst5qyZ=@FyZ!n+tIxCl?dwkW at AQ7B`*-?0`}eZ$Qm<d6Ue9>1*WapDu2DIu
za;?gBD%Y!Qs@$k at lgiC1x2W8va=XeqRqjx^Q{^s|yH)N{xi>YxPpRd3%3hxLdcCk(
z<r<ZfD%Yx9r*gf at rpk>fH>upLa*N7sDz~e=GxhqU%AG2Asobq{kIKC&r{32Qe%dY<
zlI4d3BC1 at Z%28D=R^^x~$5pvRl}lB*OqI)JnE at 55T&c=cs$8wgHL9Fc<yuv)Q{{S9
zHdVP%m77$#S(RH<xoDH)Hu*-HQRl($D6t|UgzH@%3%<)^RxB{A_gfnF-@&5{kuBGS
zTz<K)%h!fQZqy%p+F+Q$FvA))>=%BQ;Sg?QAsZeTaKLFe{;cPdoNgp*!;HgQHkM8O
z9h-Z}!Qnr;WXAe0x`esFEzGqTa~WpPZJ2TV#^o><x*g`(_^r!nE^<4~br^TK%sjWt
zEWuuv+st>n%~DLbvdoY>%S_;HSGKv_oo!wQr`uzmj4Kgvd(9Y<c+ur!x<01sW4bv^
zH;3uwFkL^>^)p>R)6HeNxlA{g>CR!gbC~WNraPDE&SkoDnQnmT2AFPu>CR)i^O){D
zraPbM&S$#wneGCnyMXB~V7fu38)Ujcrn`{oE at Zk3neHN{yNKy7GGB5XW*+7~%sdCL
zxbn=y-FfB*@O#%{^GNq%^L)JSI^105KHR(re{vmRp6EWp{180ud^3t_9OgcfaU5yh
zh!<T;nC=p$yM*Z;#dMEix<|2$A(k=3GKN^jr7Yu8mT{^1JJ-?X5$>bS^DyCB#xgEr
z8JC%FxeCnV+y&;PaJY{#S6~z7xQ{hg;#w?mA7@^GTkw)A%zT8Ik1)$}Jj-%C%W}N=
zAFk!pTTZ>@<{PdP%wyaqm>1(uu0ocjkYy<}z3vmu({VKxyWeM?i<@ww`~5ure)CgU
z>yDV)a6c;CCz;LYhfk#cb7cJct$09e5yy((8V?v-jAM-(y#MGmy*s>jct7oJ^M2l&
z+0Lp<n^Yaa^UMVg{5bjKlf}s=J7*-{n>m~4OP+=sZ at f_yTRB_ARF11$qH;pza+PH}
z`QF=Nm18Q$RW4CEp>ny(YkAU*S$VB7#$TzNdgQ$x7thIKHODBGUC-Ia?mU$}D(9;l
zc+NT&8U-q!e){Q*>-5v3QTcs$(de1-(nFkiX2kl5he#y&UD2>=)hdzqUHiQTAyqC=
z<w8}CsB%=5i&dF%%kj!_ssm<vIcV1tA(abNj;fsc{Pl{UOdO+J4#(SB%Yr#ZvCI0d
zp|=-jW&7#7n0CFi7(I6K&C})z at sl4s^F&{tn5jHEt?YdDMB~-dIKqGD at vlA9*(s_g
zybbbm0x^{B at HWWL!+aa5;mK*k|MkxpK7Blo&r-kdU59(7jmI->emv9ad!|kI-G@&f
z&*QVy?|YZwreQQ3rJgrK!f3ERG4!<9E&m>1y}~rav^rv19WkwrJsy!Z9&vCyLcY1x
zpl_v4yVL$=kKi0{*KsjiOiWr2<&PQ-srO(P^0ykL7&5H!TcrcmwCuJ))63uXdt8It
z`Mc7tpV}5;+P1Lz%4)ep+H#45%Vo{8m^RO1+B}PC^DL&#vzRu|V%j{5Y4a?m&9i6P
zJbR|ivuD~od#2{uf4lsR1g3Di{4Azh?B5|j`{@u9J7n1@#&^iyFmQ<B9rCvc9AZd4
zKDfhSy;ps}s^<`Ws$Q=u_gIfRM7PRaDtD;y?o{P=D?3G-Dz~WIXidi{OjWK|xlZLP
zujVQGQ`YVCLi}L(NBsB0=YGt8yZ%jxXTLARcZa?wo_>bs!jn%8d}ok-{0Skx)i1=q
zuv0(w&2RKQ^0l6?KiVtASO2;D;jeT(_|Uzb_jca*<@+D_bbHI^Kl6pwf4XaD+dXaf
zeD;fXf9Z1_pX(6f%1>SSspdO{_{1Hb<Ub)AKi2rM9Us5F=~nZ$?G4udgt+0Rdj7ld
z=8x6=<1P08|Ez9W>VJm)38?AsYB%ivG0^@no%)}lKBHy-dWn(#$pj;9aH<92lx+<4
z-t&XwcFJ*EJxo>88n?q`&5JWN28Wzl+F+}y+!j-FY&fP(f7%R94Yrp>&3syIwM>rm
z+Nn>X`5b;D$C>M%n?27<r at EJYznAB133&h|{5^mg{;naHl1s_*xsV4xWk2P(L%?VV
zFf74yAi(p(Z16O=LcWH6{x0D8Rlso}QRi!LE%i0*!5HN8R~~ngNne9}?g;97Hu at S0
zz|1uy;6gLw^1te7*w5n=jh=>P>ici>H3ZOA>1ha3-o<16JQib~V$4$uxrH3M-q+AX
zy-uE|ffZ%O)oV at JN%vg6mb3cJMFG!!fh>`5ZMyaIXNWUo$o1k7MLi!7<|(I~BIG&y
z6zfdNNxNj3wH9x-4kiP+5T-mNn2%H&BH)}q<SqzoZCD)g4}{6Vg6ADiMf^`qJT8wL
zJ590dhy^*~gcDBiUm%P*33=D?GQ;aNjL71E5IIB6xjwgbv<YAK!@Ew4%=>8BaSxpC
zcbLXwA*03GF=E1T<d7+TY`n@$bO at HGNB&Ap)t0I)mDc~oANLje{UX*{aPpBySck%+
z=FBnapPd|>@6TBlT9S9d^5q35EDwic>N6Eb^}KbP{G7tzw;#Xt^?%!zo&SOu<>=+h
zU7Qg9!=fVZN+FIo<x275FMj-e#~I&$%=+OKr&kObgT`*`GscWTF~+F&8DjA9AD<#l
zIpuU=b#$J%e_p_I|8rrN{5+fddFqYgHtQo7_s=`t{^Uk%S#0vw{gWQ?7%S*8^Ul`;
z at -!KH=<W`2jNEA#KPyg&xclb$gpdbqk0*P%h at Eg@bKoSg?1JuP16e)a+BYGa$gk3}
zw%p)Z*57Bz&lwG_wEkWxKaV&lqO93EoPm$w+jFh0>ha{fvVQ)Xa@?=1-};8|pDF_W
zGY}O4pD%miN_)Bs<>$_pw|Bg0i23t=_7oeh^ES_gKf7>Ep4;tS>`atD_|>kx9=pyB
z)Cv6TJ64^NH9wVgT&~3q>O9!B_rR`IxpCK0@$K(CJ#t{z5B*D>OU1XIcyi>YXJ6y^
z>DlMshoj-Rcz*WMz?!D}E)L4<dCIYL(ivdqTM#_iW$^bx`|scn33|Hz?-4?DEM8vr
zkXT;ykhuJ?XHUNTu;nMq6&{!;MBbtWfp92v<f7obIpiaP^F>ZL#5FbxCKv9_!CvFd
z!EfSmBd>5xD6e8o_@<AXyWvJSnmiBQ^0rryyYE=;llhUmFY^hP>%@rbse(wLNj#Q^
zilltr+UH#LN!JE-3~o at zPAf+Z``jBf?0!QdWtWu=EAOSf+scNO<#{+u^&zs<xjtL<
zQ)J#lS+4t0vezmbs%%*0eYE#k*|2gQ^>VCiSUJe!ek&VRj#JLHvSH<X%5$u2Sh<w)
zTq_$^mi>x=>J!O4!Q=C+Y*@L3<KuiQ8&(c-ERy#y^2qWgX1>ZHvi#ki0+sVPrpcS@
zMdZU&KP6A~v1A at L?CA^}_H_IlH|6gT1<3NVutBms3gnaJ?*@g*@-wG}Wb3<-Rlh2(
z`h-oCL-I8e=6|VGHdNWL%1QNjQVkywLS?&L&awJvas^rb4p1Fgem1h6e2ld|eGT$6
zqye)0tYinrb@|<aon-kL+-_CwQDqP35BZtpV)6-AC(qYVC=U?i6Xo)<UgYl+Rk6O_
zuljTm)gP6)Ypbt8es^I7kIPR`$7_8J^0UO1?59QYz6 at C&+XD<gRSxG|a+;iPvb<`V
zV0llsvSH<3#wU+5eJb~>JfQOMM|}<QN-NAcr&#t|Da+40?&5KI91)y{<Y$UqWO>x`
zkmZ**1j%dU{E+46$P>(${Eapj=REoOY!7*z>}xXKbL4treDbrtJt`*{ey)(e0pn|s
zpP??IzV#Vva;aQ at Wcj;uC1m*>LY%A`)?4Q=(U7pphAJCYxq|(5gOv>{S5m&v%7&Fa
zw3FY at UCDUl$+U`mu{GRK!woguu!i at kdi`X1Cv1>>sWseC!woguu!e`|N662u6sYHA
zfqGuD?HfL5Wy8v4>UmnGo~IR*FSD{?<s|Dxe!j+2?Q4*q4-1p!=T%%}`FXbv@)h=L
zKMk at w-$=GTE6#BFxwk&D`~t^e##?1&!^-)LSAJ7PY^l8;j*{g!nvIj?HyOp*Kjk;u
z#wpA1bR1(p{fInXu%F3aYe-i58swL!1*j*#=wXEIcCET at xlUbkU8k;-lIj}6p{|b{
z>iXlO>e}g}>iTG_x<=fpu93E>>$`30nx<A=kI6iy_UkdVUyrNuxGE<oUvFi@%JEi*
zW3jwe`HaJHEY}V_pOL at M#x=-i>}!lF`Yq*-5BfgnyNrLA^UvX{`0#O89AD|%_#sDR
z(+XB%k<W38 at 0?S8j?;W4QQx_z`#x}n at 4Pd8rNzGU&+=Wc(zkw<FA?)?Sna!Tjqjqh
zzOuOQ;<J61tn*#^Uv4P-w+3_K at Hu@hpWFJErKHLShh+OaKCe%8tPQ*StgZ;G-|Z4v
z4v(9YMgDHiaXr3<(69&IhQO$=LEev&_oC!|D0%Ox6!P9v8RWgE=u2K6_wu;6A&wH1
zB7riLql589AM-U-G5&o1E<hNCh at eP5j$*_RM+r)iKpDzWfl5 at N8u`p)0m3Lm1VxCV
z7%{|Af>I<<hH_M(5>=>1$J3&r6I~d at 5XLYL*E6C)-d~dUmgIe<yaCY=hP-Dc at 0ZDY
zbHT-4 at 8XXd>NPF5m^W|U$@Au&ByS(mM+rPCg#2Q_cmDIO*I#>eU?3uTdSYUDI3%{b
z;S}fF9f}S!Bw|NaU-t)fEz~oQo at Ln$WjEx__h-%VIO=cym~h4k#y#(7LiT+xCbkea
z5+={~=d7jyV~nSa*Xxs8-RmLbp(2MM=g61fZoTzZQv`37UC#-5&r9A9l>fKy369Bo
zV5<yQz;yXTB0Dc8{9#kfkBy2WDig-BO{2z&z79uhZ_=3vZ*W~vy}^B5*M_WH$2Vj*
zhgNvn%jSFUt^bbqD{X6h4|Z;s^I*R7$H`T1zy9y5-uU+~t(y4$`c=RC`X5%l{FO&m
z{^9G7tekvl)vElsDc0?2aooIfqx<XTk34&;xA~7eeQfTkpLNc^;Ka?c3o&`r;sv=2
z=X#x7CkvlXE?b~PCb at X_qD`;_e`4;x&iY?*GM53?F~y~_M`aet>Kg at A4u<Swah at vY
zs~l3p3qtm>IIM;jsvJ>|7pd_^RW4RJrgGu1-Nz~!w)<8i!*-u4Fl_g6xYV-xP9C!C
zI~9`U0?W^3$-YwJDLcEKw#OG#IZx$$l|w4Gk!9biUFGhl?LK0U%DrUS=jv0rU*!Rn
zcd2^AD(`;U?wgIMyhr6xmG`Q86Dsc`%f8xvl at F*ap0Ts%8M~gJEc<c+l{=oX=f9II
z`*vMq*|+N^%f4NYs at F@FeZ0PB>^@%qGj?BXK(!xK?T1wRU8?=CYQI~xA5rc1sP at 5U
z?7m^1%K0jXR4!0Cta72skyK`T%08mt7$N(JF0$++dcLccSLJ}p@?N;?JLZ#R-%;KR
zmwm at DS@sp>y>QuAEF#OkqP&-F?O!U#RF11$LY95WQhA(``wdy1!^_CBFIi5OeaQ+{
zUp#H^Z@~e3e)3fgsocSFQRY##y~b3QuMNmPs7GbL%JMY<*(a5+8OT0qzRDq$<!c2e
zThG#*?Hq=-2at~e4B|MBn?A9^`fizg|0_A?825^MMM9ioyeO^{3yqnErQH;pA*}nL
z`LSu=r(lP*{6(>Y-;<!iHOqM1vkbSs3t>)7WZuBa7Bft5hWT`4<jmpDS%$l28Sb8C
zc-Ab#vuC-%Xn#pVXmt9N4h}CEwQucZ4nKBu`n^0k+-v=HoHg7zwfu6tsjq>ES>Gj*
zn!obL3#L|5?7UJjb)(RG*3`X8StoS|Q`VXK?u=9&`=@m0{5h|A+w<xR7(V-TANz-O
zgt`rX`!DVJJmeLjN&60`!SzL%vBG%H at t|X~<8;@boS$>v>)zo0o@=Y;?d<nuugSU3
z*XsSM|E-)s--0>k<-V0O7I=N`<#Pt-|I57B=jJb*Sn%4s>km6_(ZqsF#0GJ$=oa^j
zR^c%AiC>6v<80#?!{rz^zG?J0?r at yz$a4O|(dwvho=En%e(1c``H!wM$v*c}u5(>q
zaDRa8GL{<oj&et<E9frphJ7B#8b{RC<C1 at u%ufXU&MTc|S)S}~<QC7ZIihY!z}4tV
zdMds0v6h04a9-BaSzZ3X9QoMDsT0K^Pque7Ffd;}7CJY!L5}CZ{Je!nAK!ao{KD$X
z!@hHK@)jl!>pgL3MfK$^n<M^D<|Y=0@@3neYesMSWUha1C_i at 8MDb&5M{oLvj~CDV
zeW3HG at UlDOg{AqQC~yCL;D__W%L2z0mUfnvx1assQ{rdhv&MIfYn?xI{vzv(*|!^y
z8q1xH*57iT&t*+~+qKSpuJ4+h&jf$ID06w_a^K=@_Q}WOJZ3JB9M4&Eel&Mv$vH=V
z{j59VU(CMI^P{<K^UgVX(Xn!#rY~P**`dpKP0rW+-#YBWhyTOLOHY4(%bKlU^B*zi
z!-tn1x%Bj#SFPE)@0RVNMa(e at 4LP53UNW~w=JNcd+b47Rg6>Xtv#&4b=ZmTq%X!RP
z-lwx}&koG#m|M5x7fa<f$XwnVJy&_#<~1!?bnJ%Zg{AkGtrjKX<Kk{{411qkhRo&3
z+&+Kl@?~znI~+f9taI;i%k?UkA#?e!bUx+uWDjS{{YEas51nVaUe12jQ!p=Qfn0_&
zUA?YnJ%iqy1;;Ox%TO#X6Lq4Ob4;}{%AEN`P at E>NwVuU3VZZuiUkcf;gSn<1zpUSr
zQpeoT!DDR9oq8K(%uz2-r|#5ocEz0SE_mQa0Lhc)Y_CNf>QM>#)ui(L*xNH_dk^I3
z<uG}!+(&t0+Aw*ZEP8a#_Q<0LhskqhE#+itSeZS(e%kffZB02$j_&~F{nLiY at fFi9
z`sl%7a(wla>(nrLl%6k+5C!5yajLjLY!SDx2Rux7?N`?KwTbjEUz!`3H~;X%54YD_
z>U;R)ck)T{yT>Qabxb+R<+DyPWb0IRl+)#q_a}~WI34d-S=jG|vLAP(UfOavXPB-v
z+`4deIGu at axg1UJcRCLLL%s;9jkQ$$+}^Lw$vmkU@;e9BD^=;I;m60?L^D$P=lGHO
zTY5p|SJ0;N`0v|9lNv5>;P3yr%VB at -nGjaqpWX*?sdH_X+Sit<{mre08RFpgeYw?R
zUR5_&REi%MQBkMPM48<MBctrhC}(AqJsD-MNdL;H+>FQPWR&M-lmi*%c^TsiW|R-l
zsGqOOAyp1#)L)uWf8c3{L#~A|S^hqG$DrIB=;uG>u)f%{fNV_K_2lrd%Cer^_`B5O
zvfiYsCwmNGm1R9Se3yDWRWFw1bc{PWI~xw8cH_2<Td&wQ>+gwowc5YMY1g}I)_Mm%
z`{(~Q>Yw*6zJq-)d5!u5_Lpx{xZRNZ->A5UVW&FeHvXL`U|4{e%oA at 2AH%-S-^=Ov
z+)Ez91so}V$j-BYdY=#rgemV4?Vp_d6VKK at E-XJbD#v}Cb&>N=J(H6Yj+4Z#bmtzu
zU~=+zuG7W%7U~SYGa1TWDc*MnhfBvhlU2TT;*OsQ at uM3LO#X51`C`L5Lp(nB?a7x9
zD-&zS4Y7RrTa%B6%0=WO4$*(+zR8o1uMjIabW~MNO#bTRO0oOLPOI-%_omA+DQ{k}
z3v_*(&6YDLtnB-aoxR_-v*%y!oc%9$&ibaE-QTdY>uYv)K4ND_x1Eg#?JOP;%>#0`
zy5G)oZnJaFlXmuf+s at v8J9{3tbM`mvoYiY*_t)+0dc at AouiDx1pq-5wrt_q|99CvI
ztjuy)ndPuD%VA}f!^$j&m01oevm91tIf}kxkKf93Z?iM=ZDr=$%FMTwnQtpI-&SV6
zt;~E|nfbP|ap-vE^Tok<tju_<%y_KKc&yBLtju_<%y_KKc&z8A=&*C{ZFbK7x}CEg
zwX?g&&aSW8+1X`h$CvGF96BEP{5Cv~+BxeHJG&pUv+FB%c6Qp?@g+Np+w9{;_M>)o
zKVoOsLw0t4#m<gSb$q$k&a at k_#`k4AJMOcy(P3v{??;l{&*Zw3<hGLYE6Mfo&TF3)
z(LcEyT?br_fdkfC)i|zXXIzb_YZ>FQ<!4;@k(=+hKYh3{XU6KnbM%Teo3?ImeQerr
zW0v~XcTR44?2zG(S?W7xsqdVnzH^rOam`ZSHA{W>EcM;9)X$owe%37YvuCNFJxhJh
zEcHFJ)VI?_&P0x(u21D%U8fk}pG#fg`}vopuHH?<G(6T2`%2p<O8J*#{okMZY?F7?
z`{#{qzhl4Sy~ZZn{&{1Q!{2LcX6pMZ{|jRi>KrE+7P5K|vyDx*datpS at Gr;u|Nl2*
zoA6F}|90E7&Qs^n+w}k6ZJH~xj4Wf0>J!g4<Oj|lIA^LepMQV(kpGTp8P?LiY5%sc
z_08$BPkx%U1?6zJl~1+Slq}ozf1>LDB%}UMGV1?CU3O2>zmKK9<K1Q7aH~{hQ{7$c
znEDR*^m?IGUs#nha*xM;uTGEkUR+T=V83_AGb~g#tn5nF3)s0pmE(a_w%faeUG}K#
z5?)odbD0{ytHXXgq{ib?!$)?j_YMsRmF?+2!raQ&<h$H6-lCl`ssdt>NE-CM11lUN
zL|(eca6}ffBcCK9Vv(=Ge$1mDbBM?irxBB1v3%11#?KOVi@>6s?ei9~H?T~mD=g%<
ziMP1qUE-P6#ouaq|ElT!AKVT)bm*{;*<#ec-31T!LB#yqTM!cd?F9&<5D^q1iekhN
z2mOcbCK}O%X0)IU?bwM9bfFu)=tDmSFpS+8!5-|#0Xcqy at xw$T1~3TWV1D6&A7MmM
z3=!Zlc;H8Y$>WG`XFgGi1j;Zp?BBi%!x(ywzcGy67{MNlVhrQhiwW$*eux341rPiP
zAc#EVBZLBkQHThN5S5QT$z#~J+EMRX<EWqd_Wrx?wsO;roNv|N*0rJfTb^2r)Zf;1
zU23?~A%?%{a124 at yX#ZiHz^LjGAXCgxbtqyK&9arf@|9SS#j`wtep*4tqT#>p9jKe
zZ)d;L-o{0yy?&!=9lM<NKHzcM`$0f$14drPm42DSm9waDjemY#L8PRz=2mf@^IYdS
z&bV`}bB(duh#4QqD9h5>)5;|o<*AZWmSV=bRLL2$%4cVk(@QZUy%aOjOEDw8#J`O4
zdB(ZMIY!)AYpD6pD9h5>)5;|o<@6HspH_-xJQ~X=#WG5<j8ZJ4bm%{?Gu!EQx|~j@
z!}?f^C!;)7vR-BoMpmliv_Hk-&M2psgppp7uYOD~*{@)v{mUqOjcmhhxU5g-So4=r
zPA at TkX(f^IsK_XZjFQMGiHy>r|GdsmJ3i%Tc6`!thvPPJp73Op53WCZ%m>$>J?4Y8
zw+mVSPF4DZLw?NTJn^ZFa(YRK^pX(iB_Zt6!E%$sOe?!H<|n<B+I~jb_A}D9pYa~s
z at 8e>JXyhWnUOrDo`MtK^^xAT+Z%-?Uj7P<^l3h+OiK$YmoGPWtslVkvd93{J-G9uC
z{l^sP`-hpaf0!Bjhbhua=G6X?DyNrBkt(Hzr1p<g*_*KiJQ?Nml9{%B<i8ym<@Ay{
zRZ0y>J(enG=FESkqC}i8&J`Dk4_I4pddd1d(X^7tD2a at c$S8 at 7lKc$G!7<8zC26Je
zG9Eo|s<d8}Q;)4zLsB)@&yq9$In`YR$J8C4^gR9jOEbNH%%789PKYHd3{x1B_RgL#
zmYnFg&2ZX9N5T<Y#vbmr-h1SBCY-?~E{7wFenv>RT?yCRB^*B{T~^VZaQl~Jxm=Uk
z4zWVGvl3apV7A*mIcXKM6WN~mo~%^Slkj-_-s~)jp*6zoO?W+ipC?-teF<NdFUM;Y
z<HDVj$jS0d`clRB?9a~0SjG)<8U12XE#n4b375ErDmpeef?*C~s_5L{3@&rY*G8>H
zc5QIYUFLQ=RnfgcE#suM$XOe#WlR;bH(1M<Dtb0p%ji}`?*?lbt>V!v;|6OPQ^lMO
z)-tAw{s8kVa#csnohw9mvp at ARLH2trzb~Ug%-+Thwfr%A8 at tr<$I`cPEPWft(zkIe
zeH+Kpw{a|e8^_YOag61koZ80nHTjJBTrKC*H?^Hsr*Eg#>Dy^_`gU5KzMWR5Z>QDi
z+i7+Bc3PdjomN}(IklbG5+{nB)T+-BMtFtKpDOz0hROLeH%#Vs33(1~7nj=zc at J(E
zm)jBY+1o|FHN@?9hH|Xs&5|#dWw~7;zg%9|q}wXGL%CDiMP$3PLUX3J3&rfv+^Ov%
zJb(FiSvqaIFrQ1OZ5QTq>9p<Qayyq!+b%A*Yw5J@;&!{29^5Vzvz8v*E-Xd%(u3QD
z*?!OMvg|L|E}o2K3W(rlW9o4uU<8*rM5^crSkH-6(HU?CSf*6b6>#|$yPc_`JKzp1
zmNRX=B$u5P$nq_gGi?{M1KGaZ$t?8(T(<BY@=Iai>GL6%V)}frjML}C5uBP2H}k=4
zrRF1x`CztE^O4PbFk7kl at Gu|DmM1G!^jNc%ovO^(oqx%E2}gMPd<kdx#7W1Wd34gD
zLx&C>I&|pJp+kob9XfRA(4j+z4jnpl=+L1<hYlS&bm-8bLx&C>I&|pJp+kob9XfRA
z(4j+z4jnpl=+L1<hYlS&bm-8bLx&C>I&|pJp+kob9XfRA(4j+z4jnpl=+L1<hYlS&
zbm-8bLx&C>I&|pJp+kob9XfRA(4j+z4jnpl=+L1<hYlS&bm-8bLx&C>I&|pJp+kob
z9XfRA(4j+z4jnpl=+L1<hYlS&bm-8bLx&C>I&|pJp+kob9XfRA(4j+z4jnpl=+L1<
zhYlS&bm-8bLx&C>I&|pJp+kob9XfRA(4j+z4jnpl=+L1<hYlS&bm-8bLx&C>I&|pJ
zp+kob9XfRA(4j+z4jnpl=+L1<hYlS&bm-8bLx&C>I&|pJp+kob9XfRA(4j+z4jnpl
z=+L1<hYlS&bm-8bLx&C>I&|pJp+kob9XfRA(4j+z4jnpl=+L1<hYlS&bm-8bLx&C>
zI&|pJp+kob9XfRA(4j+z4jnpl=+L1<hYlS&bm-8bLx&C>I&|pJp+kob9XfRA(4j+z
z4jnpl=+L1<hYlS&bm-8bLx&C>I&|pJp+kob9XfRA(4j+z4jnpl=+L1<hYlS&bm-8b
zLx&C>I&|pJp+kob9XfRA(4j+z4jnpl=+L1<hYlS&bm-8bLx&C>I&|pJp+kob9XfRA
z(4j+z4jnpl=+L1<hYlS&bm-8bLx&C>I&|pJp+kob9XfRA(4j+z4jnpl=+L1<hYlS&
zbm-8bLx&C>I&|pJp+kob9XfRA(4j+z4jnpl=+L1<hYlS&bm-8bLx&C>I&|pJp+kob
z9XfRA(4j+z4jnpl=+L1<hYlS&bm-8bLx&C>I&|pJp+kob9XfRA(4j+z4jnpl=+L1<
zhYlS&bm-8bLx&C>I&|pJp+kob9XfRA(4j+z4jnpl=+L1<hYlS&bm-8bLx&C>I&|pJ
zp+kob9XfRA(4j+z4jnpl=+L1<hYlS&bm-8bLx&C>I&|pJp+kob9XfRA(4j+z4jnpl
z{7;Tg?mTDMH6R*1D1>+#-xUomc!oto05xz87}PPSV^9a*HK at a|VS_pbbts2C4Wb7F
z9_o9j?`iNO5BUh80AWN>geYQ&qXeZWLsHfq_A~^?sC$6Ah at u!V#8HA$Bv6KORG<=7
zs74Kvs6`#>VWJUDXhsX#(2kwxKqtD;jUM!(53Z1xWyFA&W%RO)UY60zGJ07?FU#m<
z8NDo{mu2*_j9!+}%QAXdMlZ|gWf{FJqnBl*?y#3-r0xOgB8p<f5Jw40kw6*BQGrTS
zp&B(vq84?ihlxfsp&2b`Lpye&1D)tXH+s-3hev%4mAicn13&XMct(8<0aQHZYcONE
z+Z$o7&fVUE4)j8V*f-#T9{~iBhkS%kfG`RXK at p-TMohNvpgsHuAlM=IH+!E9A`kfp
zA*}Y(z>_?NJme#U0)$bG8YEGRI at H5NBbv~R7PO%qJJEqobfFtP=tbZu#*Y}{C_yO_
zs74Kvs6`#>VWJUDXhsX#(2kwxKqtD;jUMzqWk3I12qF*p2%!LB6e5BmL{W?w;wV8W
z%2199RH6#is6i67s6#zWG@=R3Xh9p=(Sc5Mp&LEuMIZVxfI$pl7lyGLBiMscjA0ym
zF at b&9j|1{J^9;)h5Bvxqh&<#YgaU+7hzL5+i7s at b2fgS+KL#*}A?(61c4Gv4Fp9Bf
zrXAzpM*u<OAs-<WAdEspP=qLo5knj$C`AHgC`ScqAf9C!@WB79eJm|R1SROk2*h*L
zg9m;D5JVpG5kdh(NFHN3=E9Evg2+QYLMT8Og@~XCQ4}L4+jr0&egqIi>ewDc9`X at F
zSRL;JPx2V at kdF`w5Joj>kVGx&P!AK0XhJhu(1v#GL<c(2g>Lkq7lEf3KVpcZ1f at uz
z8Z}6w7ImnHiAFS`87*i-J9eT2o#;Y0deHlneI9cmh&<#YgaU+7hzN=hMKNNCqXeZW
zLpdr?i7Hg121(SS4)rk6h$b|n1#M_Y2RhM(ZuFoRedxyk1~G(P7{+dlU=KzyhH>o0
z1omM+4#@NMGb}4S at FRdA@{o at Z3J^viBIrOTy3mat^r8>_7{DNgunWW3jS=j at D8`<d
z)>nWZ0R)kUe1uSdFbWYt5uzwY3~`j86bY1}92Ka6c$R6v1OKyjpQI2Gl%N|U5YJH$
z9{3SJ5P8T)2nF(Q`W~TSyAKjZAtES36vc=kjuMn2fije%0+pyjH9F*Y=*vW3qAg;G
zqXeZ$pbX_`M?U?6(6HS<2%``Y6d{UY#1KabN|8Vr%29zzRG}Ijay;}iqA$@FF~m`V
zQY27 at a<soB`#8RaDChlr`T|wE?S4Sd4IFFHhn^eQ7tn`F%2lXF4U(uu9qLg at ohnqL
z21(SS4)rjp(}*TCqXlhf$4;2kX+#s6(SkO#V<!Z4T=2k;0D{OvK0+u!7=?(S2vHP6
zFb)?y at FRdA@{o at Z3J^viA}B%>#fUMEI7(281j<m33dE=rM+r)iKpDzWfqv=?U=Tyt
zg<<T*2=-tUV;IL?Okf}O<A7X-8(9bNz>ffe$U{CtC_os6h at c2j6eET>N>GXf%2199
zRH6#is6i67s6#zWG@=R3Xh9p=u at fEWL>IczgI at HZ9|IV~5O!f0yD=gkXB`b-5JT97
zVeG~T_Fxoa7{^{rU?2A5fZRuJWE;Z+KLQ9M5BUh80AUm&f+9pwj2Pl5K`9a_Lpdr?
zi7Hg121(SS4)rk6h$b|n1#M`@PIRCXUFb#+deMh|3}6sL*o9&2#)zDE`pX3fqYx1k
zA&O$e5Jw40kw6*BQGrTSp&B(vq84?ihlxfsp&2b`Lpye&1D)tXH+s;EKJ;S%gBZdt
z3}ZJ&um_=gnSX>)hzN=hMKNNCqXeZ$pbX`xKnFU}g>Lkq7k%i*00uFHT^Po0j9?E!
z_c48hQHThN5JfR!h@%9hNT3Yms6dE5Q~|;$L<B{Mq8Ks6QG!w=P=<0;pb}N6Mh%jv
zMIGv4q7hAKMhn`|j-BX0C%Vv$9`vFQ{TRR?hOi66*o_hFLFiuQA7K<Cf+9pwj2Pl5
zK`9a_LpdtYflhRx8$IYnANnzXK at 4FRhOrwX*n`l0OdnwsB7!1BQH&VkC_yO_C__0a
z?lY#YAFb;~)xVYf+9LYaQ4}MFIEv^4L{W?w;s|kmD?k{9_-n79{@Ola<~40*zuUt+
z`Vm19T*A}fflGMFoW}$7BT#`#RG}JW0nYEJKqabB4Z$>A at W2njG+c5z@XLO>-vjDS
z&=1<kv at 03cR_2Ro%3*T)C2?Ov0{KZF!@SgCKDM$f!fTb~yzSiX0ez9>o`$5H-w^E?
zPxV%Lt-|sw^)>8dc|4&x+x-Y2h&<#YgaU+7hzN=hMKNNCqXeZ$pbX`xKqabCgCuHE
zhkBT3L=&3Pf;O~cCpyrHF6_Z5#^ih~Wj;`ZD2fq793?140%a&i1u9X6YSbW!TGXK)
zCK}O%X7r#JeFz=R_%RThvwaXl*o9&2#t8Oc6k{02UQA#g_TvD=>N(q8 at W77%g2+QY
zLMT8Cag?AG36!B66{tiNs!@X^YEg%Jm}o>3n$dzbv|}ea(1|W|qX)g{Lq7&Eh#~C4
zFm_`EdoYSIjAJh*un+rj0AdZx2 at m`TAc#EVBZLBkQHTf<C__0aP>CueQHwg%!$c#R
z(2N$ep#z=hLN|KQi#|E-B;!UoDo_d0!aTwQKLQA%Wtj1y2fgS+zbr>6qYwQUz#xXO
z3&Yrr5$wSz#xRb(n7}^l#{r0wm_9u4BY+_CkdF`w5Jn*)C_)s)h#`S8l%oQbs74aC
zs6)LRelqJ4)u=%dwWvcqOf<^!S~A)pMDBJMM2w6BLRiO*X81=rUQN&k7KU{kX at -B4
z{@w&Q#`qCH9D-wD97*&b!0{(^0 at rv5!^Lq;aEwac?rEq)Jt{fARZZB(Il(c^j{xEj
z96RGkq6dKx*K8+n&4w^K5*+t94hoKWi5=9to#QUY!m0`Tm?$C~yCI^!h9L3~LIG-F
zq7hAKMhkXg49QCBVDRgV<3}8mVRGyo#1M9&WyIIehIZ^k2RhM(ZuDRPgBZdt3}ZJ&
zut%2b=qq6adoYSIjAJh*un#>q)8|4T`Z0h(3}F|Bu^aoTdjR4l&N=YFj{t(mLq0~R
zy9c8f!#MV00{i56Z~!6d79fm5L{Nk%iV;H`;vbnFJn$ocAo7rp5DHL2-BKh_hH_M(
z5>=>1jhr5J3lTvPq9{fTaXB88B1zp^)S(_G8qtJiw4hB+kGf?jM+GWTg=*Bu at t_v%
z)ZK{=bfOF0=s_>~&@ZP)-Fld4L=&3Pf;KrG?8E?d2Qh?Q7{+e7{;>z67?abZZYR3X
zjUM!(5B+jH7{qWLeLIX`4 at NPDaqPte_Mzuy`iSU5KL#*}A?(61c4I$v4?x^Rp9CKG
z5kL at m$j1nE_h1xb7{^{rV4oZh4j at F`0)$bB2#OFzF=B{A{3FwY2Yv()L>}@HLIFys
zTZ#nAP>u>zq6*chk<+7YAtES36vc=kF2{pXB&l1AI at H5NBbv~R7PQIfQMU}`s6ZvE
zP>mWn9 at L_px;xQ<PIRFgJ?KRr`sMVfTMrYBXhJhu&?d)&ofx3*Acn9D!`Lm?KlWf0
zV{&@b?L-&4(Su&}p<j*%gK|A`EGS2T%3)NXP~`|JQKWJdRS2<9l%qi9Fe*@}as-tq
zQaOq$xgT-v2qGT^C`25kC_ at E?u^S`UiwW$*ej(2 at 97_z2CGaDJC}N1C1f at uz5>=>1
z4U(usBbv~HUi6_K0~o|G_Fxoa7{`Phzk~6k0+kRhj%Uc{99V!tc`oEU7(_k_P>486
zQHBZ(V>d>y7Zccr{gCHTVX*JRj}W4WA&wH1B7sU&p&B(vq7IE{LJNA)hkguT5X0Dm
zQH)_66LS0x#*YeALb!PTA)oVk0SXb|934amMW{p_x)3mV40#Bd_PN}T0P;|Te(b^+
z_QP!OG&G|P?dU)!y3vFFMo+^85<9r&L6Ckx9`X at F0V-4<p;KN9y~?#1{3t>c#VA35
zzCc at pm+8<ic$M?Nkk at WL`V&635!X*BM+NFo4-<_LTpzhY^4f^{C`Jr%Ih^aJ7~<H2
zQH)_6LHY<DdCi6Zg2+b*1qef4)48gthake}K%XpgJr_d)6{tiK&1gXf%#YGfK-X6K
z73e`P`p}O7>_VWHc|<AluV)?*MgrAHLfpu_zym)52%-rs=tZKAz7Iw)ChX_In6USk
zj)d%|(VxX&4}D^|9;I)KI7-lnrbnmszdNV{4_eTMcI-q4I?;u0^q?1g=*IvCF@#+h
z#%>6%4P6rbYY+SgASnCW^lx48z>ffe$U{CtC_os6h at c2j6r%*C5M0N(;DH|j1d)e)
zgiwGm3K2mOq9{fJWhh4lDp7 at M)F6pk)S+HpGbWfG0tg}x`3NC_N>rg5Nz|ea^)S(h
zCN!f3ZD>aaI?;u0^q?2R*o_g4VhrOD8<-Dx;70&K<RKps6d{Tj;wV8W5-3ACDp7 at M
z)F6pkhzl7%Jn$og0)$bB7~&{FDJoHgYSh3)BU;dgcI-q41~7;r?D{*-u8UZ=2qGT^
zC`1v85l1P?P=PAcpcW<?(S&BSpaVVVMIZVxfI$pl7e+A#QO5KUKoB7mAc7)@OL!a}
z1Q0|X3K2mOI?xHh at xuiV{0Jb3Jmkw`OMu7Wfgb?`k%xTj<oMKqPIRFgJ?KRr`Z3UR
z at L0AB!`O{cjA0ymF at b&9j{^{o9z6E>5kL?j6d;U3L{Nk%iV>T3tSm(WWvE0Is!@X^
zYEg%JnA47}&1gXzI?#zObfX8o=tDmSFo+ at S!Z3DY1bZ-wF^pp`Ca at 3taRB0LEGInh
zBY+_CkdF`w5Jn*)C_)s)h#`&=lp=vLl%oQbs6sVrkVGx&P!AK0XhJhu(1v#GL<c(2
zg>Lkq7k%i*00uFHT^Po0j9?E&F@|yM#RT?YKMp{Ao#lrIeuPkfFbWYt5uzwY4Dqka
z`zrQ%(gQyN2qF*p2%!LB6e5BmL{W?w;wV8W5-3ACDo}|kRHFt-)S?dcFwux6G^0h%
zi$U7~+M){8s6#zWG@=R3Xh9p=(S>gGpcj4UhZtrV;XwfT2%!LB6e5BmL{W at VBv6Se
zRAWN6;oK8Op*)XW%sik4ZD_|%bf6Pm5b|8FLx&C>I&|pJp+kob9XfRA(4j-e|Db5U
z<<fsWAmSls*c at 2td!lNM)3dEHv~I$?@Riek`Tmu@{%}m>#TrA6 at zk&b=7AW)Bk_Q^
zHW&~)8c*f_x5tl~>>+==F+4wD1mX$fz}r#EpNNNq84m;#jnxmXiC2o|c*5^`yLm_9
zj^F=rb=(va)VU)V5}zbDH?D3BJ^a*zYu`>bb_6Shw{hs<!N7#b4n#yK&>@yJ{`TS6
z!?!)W<`MV9>jEJWz`Q^}%*O%*A6yqmh<t_~Noh%-MI04~iKYB~bkG#OK&3eI?Pty&
z5Kr*esz6d)8m~0oX?&Tn7cU$T0j4;Qzsqqs<-;iFF|I<K$T;4I_ahQah+J}%;ir?&
zU>awUS5hv)x%~YBoQG2C2FYa%znFXpbw5bHjB*t=GZ))f!W$cZ8=o-NvW$1dJDk7z
z_?Lnc%zsjRnxU5lJH#=KFULC;w9Xq4wLEeZb9ftCSe7>!+ZJ4fYNmDsImwtmO5V!U
zt|#9>*(7gA0~)D!G`X4KpCaE$z0Z(anbNTg+lhN9e-U3|F24Hq at A&^Ctdo=DNyk-Z
z4;cTt;}5~4C}c>{+rMKjmY+T9eVjS!W?8;V9-{vDY2Cq;jwg39#s|p{F{OVdKg^U)
zWLO{mh4SP07W%0lArCVAY4S7F{~q~S%DeGAfBytO#RzpzV~xDTwmswQf!w+5O}DVk
z&TRYvb1=4WRIFzH)&wHPTxy(6i&4h#Yw`>1880&C-|+Wu88(4e`TI4zj(v=ICHVlu
z|Acq=domC(*x?KVjzFd1B>RyYXffslVhj!#>@CJ(rd9e!2U9O$>gNU~4AzbFwD^R`
zJA1(UgMewQV?Ix1u1>%?)V_#ThtrxZXXJx@*I2?7jv|L~JmV-N7g6sNoXX#)Aqw_C
z;|%Ja$@JDUy#(br&Ss8E$O-Ciz=iyM5!1SCM|L1-Y+^31V~;cE9AMao81l)uIX4hb
ziffstE0JXQhsn*fD+BwkaS7A8l<8c;bS|Y_iH*!#6}g6KTtmK=>9Xe;TdBK^VfFYJ
z<y&woOxEm1audTpLB50fpJMu-mirZZRFyRkN#m=H<NW`r9dqMJ_a~W;Z(@-8ce3AX
zrfoYuPx%Y at C+uXr)#Ofwe;E((_gByb_B-PtmggU6Tf^VIc#N&~4W`{kyXz<q(B?_<
zcNoTgXFS9Ff0y~$%JjcP-qtwA{QNs}c{Fn}%8;AL2PmH!kL2v4d~+}&OrE8Y9QHC}
z7|$`DAK}N?&2(-c?_u~a$-iPc?1{z;Oy@<0?ZxjY{|Ekn3F^!Bwx8kuNq(ED|B*I-
z;_r88GZ~aefRMujZy at 0CAqRfiH69qSkLN27f1>J at PngERqd7-z$D_s>4o^rv78e}z
z?_IOO-1fkO6|aiWxU+fn!w<eQ*#5}}0?o$V$2}ZqEL{`vY at 0BeHg+xUJi0r-b6NM1
z!oiW$F#QL%A2P1hYnGbZ5=#y9D;HP1X3Fv1`^d#|d~(<WL2H~rdz?)hUo{fOZB4;>
z=BCa~-D^6p>|Se+`L-6u9E(Ss;dgee{Kykk_pbi@$!|~WD2zW)AAaE8 at 63B3bcZ7$
z#L}2Ja*^p=<0{zJl+|H;A>5YLn)PDr<#}>W-ifcg`H3nsyUAD=%ioz0hWYmJj>5zm
zr}_M0cdmZ;-skr`(0Iq%#8Sqxbnzw3_c4s+9M at 8@=?f3F-QBwGh3(_+J2yW3^aD?S
zfA4{T#+o&vd0WSmPaf$Kx4si!R3H9Ao}AhXq46MVn(4{;T(gnAB($?A9x}|-`fd~t
zpY(9#fceWW9{BL1yC=3chTcw?*@-Wi$yAL;Kh+qLXGqhV8j^U#ETCSgnKd<*(AzQ7
zmn!YQc;)gZsy<(qxbQaffomGYH?H_&;N#7s#(4OFy}ei5QJFZ&48=~m_f4~E&1n<c
znl>GMlKI`lNe4vBCLUQAd(~V}@s at ek_?(taWv`l({2dtg+&vO~!!HtVnFiUzc5*yF
z(pV|3Fbm9vnA<NNFq${M&@t}(T%Or+S#<9HUCvj2|NNZGO6IzSTg-Xh`-!+X<<`kp
ze*c1V+}VEQ^NuF>-D2Xl2}eBU3{ScmCVP)+to(dj&hZ};JN%;?$Co@%$h<mV8HtJG
z-!xrovOBglIUGVflMuIluf-Xg5OOZ_$Frla3wyp^7oO&gcmMqP7sPtAs8N`mW at YSt
zx-VZAMzit4L*vf72h4{q^BnQk_ni-%^!$R$qDOed$>MO~6h|~UpZB+)EE2a)e#MA7
z{o;ik<IW~GbLqNxKuj{13Fb0x&Et+l$K+(<O7 at q)4*$oWWKQ$GQWSf`Z`{$4SR+EQ
zqs86k*=vptZ9DzNW{<hO_lo9?P1{{-#HMKc2_JJezOIt}ZJE<tS7}`P+U<#Dm%p;E
z@~l5KR=)P}#4^XKhNn#D>ka1p=8I;-YmK9~UGSQC{GNM9pBz7;XV2-s{(>WVQmZ4j
z%5Sv&s&z}ntDk5c&wA6@{N(3)-fVc at SMlmsYG2NJE$fA~<E|1R?rAjcxsR4h<=!Og
zMytNy;PLFlt0SL$Vg1Vs at A%bcztQ?k;`JM at t$6F67hld at 7c#DGdMdHhdBqFsUe5a5
z=sh=ouDbEb=N*j$iB^&I>!stto;^J~qbEJ!*uQ99i*a4+mPFg_jV~^H*>lgAN1y)O
z=*!M~Zjmjh?WOi&S@&2+^fU7vcU;}}tA@${SK7OPMRlDE!)ssW1_NwhR6rto0J&)d
zFEJBB#|?}l7(zy4Pbl?7 at D|(VBqpS3+NO04v(ZsUG{&H{sTmS7l6)zWc1kt%BpWqK
z+SI0r^EbUrizLUwOiw!q3gU$M-?e9829lib`@bKb*?aAEdDpw%^<LLnduu*Kdr6zU
zpF*2B%VwmOTd6D$V$IPV9;SW=wd&|wfUTuP=ywe%4IRhSFt(q0CSE#o^k=~JmKIdI
z4RHW>I0N7=pvUJ8v4)m3HNml!)ExfFYi;|E{_J{-<)93ucW at 4=Jr`<c(AU}h#ln$e
z>gV$Ys%;@?*+E*~RLFh!9oD1SRiRLoh(wIHzPSNrHqNlwfdDHO%6OT#ZeFK}-f_QE
zu}<4mrr%V+RoK)6%|prJHz(g0mT>C+%E5RkK0qB2#l%TdfB6s_V0=Y at A8JFvzXl%)
zG!t!5;l#Pd<8N;j#7;zAKuG)tj;lz_1npqgv|B;iJG<E_X+|uf0yfJMlx5Y3RuSDU
z8MERd at Tjszm;u{hrLZpd=`pJ9W1^>DY{J{@JJ@#6=ncYy1=I_V9exd;CsHhoVddcb
z%lU6!xaX5rS_tW=`T(U7u8&h7Mf4C;vq^}5QxrzD2t9&DM=u9gvDeY)8MvI#eZk%!
z_HvC_?7m=F*Bl4Zk1EhkicqDs9RJ#LmP^9!ZWG7}U{3I^8?&?C;s71|1L$dxaAPTG
zzY?xV6pU-ng4H=&V$HU!v#BlZHcqHO0%$?COC!~};-n(94MvP`%78QkN*t#SD2Hm$
zPOKYW2%1DOUO2RxrSL at -V|rb$Ep0$O^p*DCi04CRp}yfX1<!XuYB}48-*YC8=XYg$
z7M*<E6%ToZE-k>yJNa8z;S0Z*EbEtscw5M|=wvJ8&Odo at Kmwka=Z<UN2hXYP`=JHr
zT8tVn2hZ_vPlg<oNOh at gp)P&bD=m6QdD|gJS$#q3%UA<8pnM-6O6kvS`(Q}fUp}aG
zl-C!;kBi8A0yCi9?;CDL9O at Xhl`TH?0&vTVq9i1%HN#?A=BYM}CpU^)4rfokZ<Fvf
z+it7bns?KByx}_2RyB}4n5W%@s9{!UcBnt0hVDQqNW4xBln<)L)i`L)wzUjfJt?2)
z2Q{BCgNgW(6}TJ!msRgke*$=X!U&ts&KI0#=R2&PKLjY_zPGntqlf1GJ$q=*xNabb
zsX<m)kV$zMAvHijjP>5QMqF#*Y`jx*L?IycyiN^pJ+a;e70IZ{782JAi8?hYv6R at -
zdYB_$k!z(Nxl6uh1Ssi_+LuuZ&cu1QYFdF?uCar3i-1+|Y>GbD9!7CcC;wLIbRHj|
z#G)gjU1N`%)b<NQiNkWw6&N>($RdJE%_0_lir{ZR!}Hy(hGfwCRK1!H0*)Nm^$lXf
zUdocoa9vl>3Pg#*OX-2VCo-<vM)wTcbq8@=V1Gc>FMwWsJP<dcaUszG-U0`jyTq|_
zMBP?ZQF5q>_$&6tj*Y`D!x~4Hz_D|O)xh%{*F at r9JKv!N{-XlBo$343VCOXfF+jB-
zpsEUI4zt%C<G;6}>)O9(iw%&Yl5_fS1LRbQXh at Bf!|ccb$b0*`b|j%5Q_A`himg{u
z*#VWP-$%chXh=coK>R+M+ at YMUH&D8Oa##TpPtjR8j!wc_0iB)SRz8pe&q_HBT7qyS
z=&<L)v>>?pjtny`z9VZbh~Wh8?8>gy5I>tlLODH)>I*1^O9Y=zbm;5T__5$`f@`fv
zM8nNMTgT^VYh3&G)?@9KrHop1p4xbF-3_bwdc_7^?u|V+DA2&|);xU8YQA9`6^C1{
z+XK68wg7XLAKVsDUst-&h+>~crZjI~Db^55+nXF&IA?^l=Zq*{)e08v+!62#WRH@?
zm3HCP4Ni^oxzYW{o5AO*#@SeXW8d|?<JmI5D6VU6#Er%e7G0*tvj#eZinAGQ`T<pd
z0UBz;*as+~^6dOpdY|U#Rq`zM0$*lgH7=?SO%}>fG(#$sh*$^3!4-JBw?**8fzDS4
zRC_DHTVzGaGbT#DS9}LO$7AXG!bFP?sHzruq3P_+u8LFVMMASFsx|{vn<G^Hbx<g)
zIdv2y{}_?{P^Pd{tq}#cgq)~DIIPy-mydD-`v&J3ggE+zPX>mDxPeE85`T0KHDU2@
zih<q2=Cb)7<-kdD7ajyjF82(|{ySNXLG~umcjOm>KJy_Rk1k+kbttr8$@3^=jHe0=
z4S8`Q0-e0NZfwtPZ?SPcg$&3Qw}e3<2PN#xoNI&>i3k4K8L$ph-E?&**d<$_itfcx
zUEaNTn5qtab|QQa{U|`5QvbV7Ug;s;Jy{)UBr}Kmai!~z+)_q^mQpRmM&jOq&4Ww}
z?}@7pO|(iuQBT&44BP^Bi(b|%dH%UB%{9f45~~3AS&44Z6O9_Iv<hGW67bdQR*A**
z_+gI%Q>6b18t at N-#4LT&Ch}s8Cmf*0cZvPR<8O7g#2MHZ=~^0nqetmic2smQZ!9m<
zo_g+$Co5Q#dzc=eh7_fY8jVonLdUX=0d)8D^IFG0>c5KzJokxG%i<Q+Wf+hKSKIbf
zp3iNvBqFtIbuSD3+~+a4RDCP66OqD#o<#!U=YlSOzMmRe4EMwR{7?buPh2~xqZc4n
z?lFPr!0RxATY~_JEk&e1cv?fllZ-<m&aX(#ZGv%YVSH*wZYi>d>wKN~d7ifj<wI*E
zR-`xuLJ>NsMFjI0BxSdB!Sg}k_5)TPpA(UlPGb;T;q0Wu{+e&2^oyy8B{&>batvr+
z5>tE&IOA#A&p-zXKn~#UxO#Nl at xEs;C`p=*in8=g1s!ymW>W#NW?sQTc~3|yUZp1<
zC6>G*Mcd at s-L==Xr)wYLk-BR?Ts2(|xW;uIfNOkLD_nJ52c5RgeNM4+KPo|UxDw34
zeXfPaT-Wa*HLvSKxTbY|1lRPgD^68sVoYyo&hoMar=D|G!1b`R60XlXO>lj|xf-r*
zPBUDOI#p$fAYsu~^IaA79K}F%%ky)M$t6x#W%${}MsnKg5j-O^2TxSV%Q0>53hLW!
zxZkn`aAy$TN`ZY^V4kF(s2gk1`M%}L^Cq#0Y1tMigZX&OlN?EX+oO%7PI^?4)PEBH
zFJSebZDS=Z*aHfvuCE&t_d&ef9_}wd1>2>ZAZoXX6q!j9BZ|B+?yb&gKX5ttNi~*K
zWSV?&DnBfnkZPzKvo0giBt()jJcvaKoQ)^-*Pa`CAZT_WM;<<J&4!xkbz=t>dy8>@
zA4_TmFZxbPL1$T;QM%>4*F`i%ns2+e*eZB8B7yq!{l&lz$v~w=ScCKMrfQ at JSoywB
za6aCJ<HYJ}6km at e+n&?$#`JBAxkHFK9S_>$H at ZVec{(1R6{q7JnE-X3 at 3^=4biDsZ
zU1qEdUIa`pVm5d&j4jI{jsGrJZ^v$DjlJ^IuMcuTB<d$PXqWB%8fY!e)@KOKyqm&f
z+`t_}hZohSF>y}XMb{%1tfvMf!h3?upri$y6C{mGs86GnF1nTV6-7$svldhWHc0yY
zT+8~<2NoKa)Nm--xfsSDhiE*vUQMf58pji;l!{%CwVr=W!Nt6^NN!((q>u6eLtz?5
z3A#gup^Lysem99gk+h%|5-upgdvw=qMvPeQVgRm|z$I-x1DGbUKY<>^y~XF2ICTJJ
z5lf+XsQ at G);XI2h*!|~hl#FtFv*0=x#*`UE#`LX0e9m{p#M4KnsO!_4xNn#Et{4lq
z22CaO3nag8taS!o1k3R`Q*p at N)s3&pYw2%xJ=xXtlNICJ at zzqkJr}rL+tmTrgsvZ1
zc$DZ{WLb{l#$Vuaz)B*N3R)w{@(Ru<U8qLD-JI`U#NY*xtFt_hLCawZ(sM)wmx|`X
zZyr3Q!9CrW at x;fzEzlyvckdGViN8Sp0=RqOo at Gi3?S(rpCcsrM(s0cdwQ$W5S-9r1
zsW^V!d9=c%w%Cy2MQfKGau=Eq+6MQ$2~s~lmUjVfwQrFv1hP`#TLNCU7BE=szX|p3
z^zDc7EOAj#whZ*<0x}N&A0lH|M)2>_%z(uK4YrgnQS*rGBBX-x1S)uV=e@&L7wXv+
z(`TZ4mv0fk;!%n%1oT=qOp&@>8q$Xh0ebP at kZA-l9pL{>=(AKL6uVbUf@@i at H^_ at l
z+$_(K^Hk%h&8N2f<Wta*8NNmMQfZDF<_9n6I*T}*)%8SVeo|1JJjxU<1?GtCbELo=
z$uxj6E<%A6qyq}jXbzbPn4k49KkH$BXqcb%C>>LNi)B5^D9yI>t{SMlz(qk>cy4HU
zZfJRKXnAgEm>UgTb6uH^op4`>b1XE<^B?fNjfGN#Q7MJ^pff0lCb0qcRwK=tzQT*S
zYz~S)r$<1=wwhl4<VU~Df_N&`w)=GasSCazcpqY)NAX@>$70YOzSWLQ;N*Wmyqy*0
zWULBGvfh#~{DS4OJUWqt`)j_6>aBXq=FkUbtSPJ$wT3+y_^qVIiE5oIK&n>zLm-)z
z7t4KmX%$MvAAl_=^WT(M^dNSBd~f|BN|AgXE%Y$l^Jt-81z0YGevP2-FN16e5j~jW
z)62RcD?Ez#5_?wp=U}C{8aIko+zu at sffh<{G59KAXGP)Gg8E~WTE>9&=|LmX>=vZ8
zY}xgJ=gnZRq`~E_<<}|(6+uM&DxwW)Q_we99>>>aqisO}wFBQ=wet0y6ziPZmjJPH
z>Ubg1w_BxCEkxTgk2o?t$)IBlN8OiGPCak4%DIofM(ElSt{K(Ap05x}dwC*Nu7qpq
zp*(;XPc*nFy|&vHngRLQXgjQelm&c+9|AQVj8G#DE5RzP!QZS#v?VAxsICOxe$XnF
zq5$?Hf7}_KtFZ0?y)Q|5K6h_!5Mc>qV{Sd7=g7V9J`*pZ&crjM&sALsG7cX{`wn8~
z@~BMWJfPI$gi=!Fxr*L$R>1KWjL!GlCePm+6s$a=ks9~*sW1&K^6SR-|C_g%@K}q$
zIf;D|`(L{#_t1IjU3rw=SPKQxlF&OBZNTo|rvi>@iSvDg^L=mmZ*Z>=zKHU~XG}GU
z3&QA5NM%8u-HGBZ-Rs*g-Gh63^H16!hPaDR!nP+mHg;iTY=^#>uCba2EUX!#lm<_7
zY_1FWb-rJT*<Iy8O=p;{GL4<!=^hB0*#;C>yBY2G>EYQ9ob<HIbZya)f<%2)2tDpn
z`o1S?&Lqr%=1juL&gGU at P{s_6rv^=(g;OG$BMZ+3&5?xX`Sg}1q8BVL;RT>OGl^d7
zRuT(<7C?EX>mL8FW9Mm{E6ufs^=1~%mi6WxvE^aiY72FnBl;@~XOdd}U&|Vkv<*Yf
zcHINloS8fzR^wgONHyQT-K7P-)5exYsYLvY7%E*PmNxA9cu)8$r671e6TO*BsN(%(
zRqGmOgw)XRZ13aySEAkrsUgF{#^mDtVmSvME+!u1N)}S*mV^GETVFtzIK{TN&n*s;
zy_F^OlXZG(1(t9lZtq!j-6~qe)lp4Bc+;4^OCr`hzAVa#Q`UT!WGadON>m31tzgG1
zutXxCZfeRuj2%A$?+ao}6)wd6Vt8i&;=h)E0{#NtjGG~UDlZ%6!G;#Q)y8zZ*pUf-
zXT}r;;XHyBHGgKF1)&YGxh|tWO+>!+;N>=pl&{yXN=d at Bj9UfBA8@vnml7v9Q6Hu0
z*FTt|sb?wC)6R0R4%*IjJ>|ORk=B2mW$-c#F}e=!;MwqKdPl^$!kAth*bX65=L+DE
zLZ}~aIE2+Oi!VrQD+M$3f;>+Ljr8Dp_^k_`3ksGeu<qzBtAJHj%GPYn3DeV_2)rao
z1?`L}D}=#@rKLOx9*_y-Wwq{Qq|r5_xChRmcqmzn%W!qn>y~5A2f*)cji#HQm3^&<
zg$g1fjTawuj)G=dPi)_NY}Z3zx3Fs-a4g7^YYm~~wIY~(=TH&M{*zH(4(8nn^WG%W
zn#<>+^B+q`Iu*qMe~wS{ryiTZ5)oTs4`P6bqY!<6Ca at xKtuwtt&?Xo&L2L<xMmCPw
zM{BPmu&yMA#5BG-@$l3R;eGvO6nHS;Q(sd;oi`yOdJ at K6;CBguGUQGAH>5=-R7=%T
z|AwF*(^Udj*0KUCx|X*77tC|Y(c1y5r4r3u_X$d~Jcu&E6I%cpC>yvi54^kruw<ki
z at x|D#<)o$OQ<4KIwrfS}r=Gu}=P(7&qnHxLUQ~f!MGtW^dF$B%(4N)P{Ppkk{I>ZU
zhtc-I`1%6lec+oVfQ?Ud9fwqsr=p(Uv9!M6o2%fd2=W)n`HMX(;mW~tG8 at 8_ue~%M
zJfjm`PS;Ca?G`-- at 2a#I`qpD at S0`K(x?Y1^@W()x>2V6T5Hy({r^21`Bm<;e;#IgX
zmy3|g3RlYYBDVz6KY=UNI<Rl(=<QEG5lV8=;Bzn^y)ing7v at 24rF(XbTJe8 at Rv*SZ
zW at 92bsV{EU=uPAIIvJ3E^mo%x(yX#NTr@?O at r|+;h{Ss**MR&Stbc|o>;unya9v-r
z at d=QiCkNLP-=(i=g2VYSaNZx+%*xpb_N8uCp3_rHBJA<}neqr)Na3H1Y9-+Ibeu*s
z4RieS(F{%lAMnRfekFDcd^tqN&+P37TF<;C$;Aii)2O&u?fnD66JPs0nnj5pSf=@7
zjfjoq#cl9wh2MVo9THf6KHT>K*3XM7xE`?pPq=CSXW+plxM>c9zfW@<N^;X+yOMg@
zi9C+jv*<`Z?0F|fnjtr=HJOj5b?H00ZD={6gjgP>1<W at cuy!{OQ&a19yM5l`=+mA|
zZ}D|nNZz3lxIwjmtfqamZ?*r=!RBE3v~`qDUi1yQsJ_`_-r;&;YSh7Av>e?{=b#L+
z7rSu2h<pAfuLnUNw$8BsAwPo#-?v15)|mJbgtz0}QQJYhJZz5C;$-YAL>_EYjAde*
zQ2eEoSWKKvfQ#s=TB0w0VH%%v#Dam|IuUEhtUS@`*VLeEeraK`<g|jmDCsQMF<>k9
z_GH`ko>^urEDkvIXMTqB4NtJBO?@euth=gj&l>ybXiqKWqzyz|h2RVAG_<qoNs}@D
zgU(}i+wQma6RaHNcFIWZndSxb6Lp-U3Y(4hV8JAyb74+Apd~gsTzW9ucjb%Ar}D_$
zPt}#_6{*2OtOK^~_uNjj2z*Z+b^{l2AbAIfPk;sDp`N+~(a at F8`vm~G1brBl3(%5E
zu*0-({gnM3YvxX2ZPW@&@w07kRVef{jQ2VJ_H#^^CU}l>f_*wi?B&J)-ewi7`a#9D
zqCv&&LJwm)gf=c|EN%tQwg4nAFNU`LAa`w3^o1EaBzsfwAUB6<N01fg&5+0O8QxT@
zC>a|;`WlN5nK)D;^Er%YuUcNEnx)x)m^Rgx=tj>5QPo+>ZNUj5&%J`RBH_7JV4p8~
zi#Y}-frms#b2?X%J)`KeD1mRG#(A&3Ei%zu$kTv#sh$C;0CF_ZoP!G?5Bv_yMm4B+
zqq#(#BkI|u)^Bkf{VFzp#&~nE(nEXy9ee at 7cTkq5h<v)rUCQ3O!M~5k{T8&V``WzO
zn)-(ZS+|8bR$?E7IQJDKL6mz3iE$&5?Yt$~gX`-Hs6^sJ;(YK$wWs6Zsy1d1uEUyJ
zsnfCMAmBg+tkWJcCGnu;*MlFQ0(0kpIeT8<@VqwEr}5ACeb<EYIj>$`YwmzDN4+}4
zipWDdC^N^;fmw3|twH{?rDUZ-Z0PFl8t%H at HS&|EB5M^brP-0SiZ|r7ipI!VMe6ig
zMQUWNB6Vu5!vEXpwHlqgRx?Lb$*V`p(Ome=gWvz{Dw2Y%BDoA?)d(U92IWCSog^io
z9Gn1_x!jV96I^=%YI&E{wYICm!eGwV2Ds+?zT?;U1t`yzd%ag)?J58WtKeP;cY&;N
zV5$9rZ}R9Qk-y)~pBXv)uxe@!oumE%Z!P3JW8zdhjfMZ}Xq&`)@JVl;XF+x7GnFN<
z>*I}Mcops+O8jz8 at ad5SsKjFT$4rc;NnwdZA7(Bo<owXdSh#~|@?n?qy*XSm(pHCp
zACm|>U==A2VKuS9XW}6h=UhHa5uH032e4p1MLe}ScxvgXWv7-;&*vw2TX=PFdPcwY
ze>0=<+LMX{?+<?AwZY2B+S78B;s1lH2I`WPr~i3A$=*e72bsx*ht*_0|3A*y>UF)l
zf*U6h at nFwDM9>@dVjTg4YM2W9v5%olRFCSYI!cSot)REXgqLrZfVHUb+=VEd)W_Vu
z+e6<j^?d|!2<5*a^JKeGQ#>Ayhe1MuaL<DKXW{mV??dYv&s>nE!z~EpE(!9R>O{o~
zk0#Q?g4 at fX&T0>P`);^bkL-n6Uk7$#CGom(KlpyzoD9L6(04>Lm>tIZK<7P|0!Wx7
zcq<nal$7Xj9*(OH-H2zmA*Ck?$B`A28&^DW;nd_pk0P83sj&*Zicq+pgALx|z~1)n
zi*%qlV1rmr473Dx11uF@`^#1SIU|~heU|l@>>{kM8^a`W$Op=ob(z3|966`9?Kv}#
z%faRf?tS%{qhYUUYIS4ZJ~_^KSLRo^`ZfgL4X(k&ZXD>H&F at F1_1>lMI%`yKLaGq_
zla0h9ns~UIp7Jq#`z;UR46=5^Wnnek6XC7_d$JAgX%pFSO$Yu6uWV!hU#7|{8w=o0
zT4cGbmJxVbju%)Sz<Cyk4nV7>m1f(~n^j~@lv{;!(L78+-G!yOb_Dv3hqh$Rq6qG(
zo;f79y9yxZKyESA&H-5{hT7TT+5n*_0$~y2Q4*BR1Ixby?u$heT<-*IjV8YI7}S`P
z0;M8Ez27b&>o4$>27ZCYw_hZul;bB732nR2ea66S9uHm$g2&}#@YN`#OkC-)vUFcQ
z at fF}+Q1)Hl9RGIkVKZFS76B#pGWcZ=gFA3DV9489<Goh|kiR#KIaf at sYGdk^)i{^r
z|KwqLMYsd<*UI_#i3P^w;v=okfJG$hQ(p&pDkr_i?j0?8qPXpM1+!-L4VdfJ7$0Gu
z>?06cvJZR&->ljfrfPyOv=2P~KZ#c%)hc at o#4A5cVp3!Lm4fO0F$HoPnJWdLAz}6b
z(?UW|xZh=Ly0Q|Yu_P!Za<vWah6x(3_c)hB)R{4R=fF7sN-4}E*ism^(SH+auJY+$
zyzHWYFBVvK$~&`JrMcmq1CVv*iixc1!+rJV*SAV@!fRlF$y#|0EX%ok#5%Lq2<6)X
zu)?)Wq!xiidXQU(`&di*0P8D2`aY<%1MW2<3)lPoMP(XaKKu$qviflZJa8q<%}o(a
z<VL+IE8mwHYn}W9K<EBxe=1^|l<CAa;cwu*_%&~y>}6$&YFyYEC-#eoV{yW3 at B4lM
zcdbuPJRUR$xx+pW*o8HqD+<BuQORCUucY_6d$XLTwjcIp%95T*R at Sf-Yaw^BGrYmW
zSUGVQ;C?K;#uiyQCOcP at Wiu*pJ<+r2+L96LASWtg`DNGQXk<fdnez#<=NTI%gSLCC
zFJqW;XBih=DX0#OIf&1+B=t%GV4iR~zAV|7p8_%_rwSkyM`#$_0I(RC5uWV01AYhO
zy*e1fu(dDIyi=X+T^FWX95xo-`v!@Qu*;i|mGUlcK2TmHySzaYSeYr`%j}|vF2`iI
zKE9Q at mOA(_$U~d-bw63uQcDj3oe|c^tK$8{PRrI>4U{8iJI+I#a0qBkyvZzx2QP!x
z-aXUP4eW6)7qeYxxOvzn785UHM1`w|TY5sn$}#Jh2sQ5j4Srf)!w!Xx%drMaqE`0e
z7sMH?sf4{0vj;<XOSNQbZS4Y#Wxvl|n}X~xO3(yif0Vmz_>2~G7T^3T+}FVUG(<Wd
z$TCXakl}nEaZP9;SzQ<T*tK;MG4J~L)Onwttk#qDKXv)3cYXTkx_P(;!C74uvt|HK
z at +udUO|P&6r@$!lp;w6AW9jDKPAG*+AX11 at tD4YDrj=?Yt#AZCTa~xioCvlXsaA^C
zfVC&|86&R2kKm5znr`rd_k?s$P%rNa7<~JsmADti9M{XjRsG&9i?^$0dMzRwA{nT6
znZ>H{I?r5D5+Qo(`P)q^RzV-zWBZW#@i5tC0{;<V<<waMS#sKgYb=LR0nr&CF^M2C
z$+IN}qD?ABW-hT$qWR<m&crb+_1!@vrMnsYhH<htL}%f7Vd;QW8j%i&Txp;ulkyT)
z)IJ}&N?J|^J%0&a0)E&9-0*C$;#%csGx(0Z0qbDW#M~LZ at 0{uxbo)1)^U)zpyU=yp
z6yNk at S=dnMnr4I<{2F*UO?6|t9lmdceY3bkXGXTc>FhuvMNU>kB9iAkrg6aGU!tdi
z at MhmCch)e4&7-s}1oRp3+zq};hB3W(Tr`i^!t1zu`n<&>Oka`n+4?kV0h@#4&6@&A
z&h?h{2T`cj3=>huS<xR8I0|XVei=4{9LA5*1Tt`x1*FbQe7-3gM9wFX-TdG=5u)hB
zNXm-r3oQT+$OI3RoDE3Fz3-(%+Q6k^;CzTA4gN(@&X3IJ2Od at I?he3&NW+S(<zbz+
z&j8W9AuN--S9*)DF at vn^RY?=<jFs)1?dK=h6b5T8Ip7Cnc9DJhToH+U*Br4b`c467
z!?{?=b;um?WvklvIp#pD0lH5z%=9*JgRdM3Xz2YrE-ezt+jK)V+ZioF)|(E9IIK5M
zYvuhyHI?q#<T~zGx&AD6^t=SEt3W?GfNt8~C4pWTVw17limc+3b{!=+AL!fy+ze6H
zOns|3Xe at j>Evj!LcJ7&oT(pV(ZTCcJ1vsyDvTa6bjl2uI8sd$`Ziej7xpT<woIA(F
zD_-wPa5JDe{t?wO5uLkd#_kg2+$@H8?J~q`cUk!_h}R0E at tW^4j9W>dOzicjBQmQL
z`RdT^Jjd1gXLMa;r+~cU!C<lm6 at 4>=>|>BsQ%I#32e4q^v3wp={aFwLUy+^fok;pa
z%Jh1`PLx2_|3!owt3xC9>Dd3e%sog%)rd-kws6<{XXGxD6MXnQTY|7v*htov2due6
zS~FH>i`duX+X`OP%f`YtkKqn)0jogx#d6&ogpZh{Ijxj{S&hJQYGENl?dt~K9aP!l
ze1EhT`5(n<&%gf4x+?|-hQ{ngJy&1bs{;v#k<z|DmKGo3OZg+n_cur({5Suj<b598
ze?$Wkh<{=oI5)@%l_D0FAH(cnM74iy;I$!j&0$ID7TsG0whqy_*Fg`^gGr=@0Bzd8
z)}B1jGNk;A(!B-xtQ at 4VRMUXt1O}j_9>Xw$@8Ueq2hcyyHXw}qFKS;}suK_v1P+&G
z>i`##A72G>rkCX>GLvt*r{<Ax8HwLzdVEAYBz8H*-aI0e8v~fP^7!hI);}QPNS&)d
zv-gQj at aC~wF&1<$V#_PLLb?t}vz^%YNB^U>FQfR at bBB8&!qT+%0*<@t9}nFQl1Ltl
z&JPm=2;`i9swt6FL4+4V`TIfaX!neQ|B-zyH(<rRLkUD8pwD%rPbv}m{0p%WAP;!~
zsv69V%iP`UQbpI11N1Nxd^w2B4SY at AmLvn=M6j8GDXt^?KoCvzLvQ~gJB+bq<cSty
z-#UW$#c5$^A({hE{oqBQX}!{<{%?r87Ktbg;VSU>3I7HysdR;$ql at M+Uzc<6RE~&r
z3~d12UgNJxL3<986x^SW+>b`?KPLO&gnQcJac?b)Qa3!0LVqv7?+s-{XM=gnSokv*
zd|H?dPonvd%-aUJ<WVR|lWA7y`DB8vcnUXJm}Vg;ovc7S*8eH4qnWng<Uc8oeyer^
zQcj%(bJ at UCE0~-^PL>7r!&WR=cG3blDJUrelpI at M?NeE{psJcJA at IY4?IN+s0*x_k
z6$BO~TlIi#jwpeJP8*O03kCKV&qyfI(t>!gA8o+sZ*k-trbR?m_0Onp$)`Vk<dmj#
zgVrIcEgsqzdFEQa4fQ2b|F0TS$I^tW>UXGbL4T6VAdPi=m(&c6dghWffzYE^=#y8D
zT$IBkIzRYbTr#5Wm);q7v>)B!xplu3y5t#_Yd(Yp=^v3=S4gcI{LX)cYgtO5PvK<R
z1<k8p`=biDy~=k4eB?s!2}ikQDfC~U9`V<BPe44yiw!5a3))xL{V@)eqlBZ07nG!a
z1tm5??M90pMrTk5<nwh6A}@fyhsx<do4US=QpxN1;{*~|m1H^qv=*)v;C`9&V`h;p
zg;^{M&!Vv97>QFDI$+sCkArSsN>*RLuvPiYR!~3STIry=R(@%VHDA=C^?zz{|I8MM
zp>LA)I&um?;xL7?EA(PK=;1PV)_8)H=FS2=lmu73hm*Ywq*?3Ef-6M$eHzHmhV-}G
zS- at dP(-5?F>}&g|b_M!ANI);n1`q66*C_74wgWVHEEc-~iwy(^v>c^<u5=HSI!I{?
zi8a$c;Ro-qKz!%A_2RRlQ^-O5M{#iirs#G=*Sw4pWF8n3QW4*=R-{}%2bj8Xy?jFc
zY71|91!cPKAut41ByZTI;Udv_>~sW%6<{<^!8rB|KtN##z;RE at Fa|`3e^J^1H5gC&
zpn04qq+;Gdy|J$ic}7I4>$_bBa_Ytf6dzP|RJ84{T^N<jwkpUC0ym~@L`VZ1!;9?$
zIj0(iG at wb@0eVRB<8uS5<G=B+KmK4~&AvvV at hnxl6|te)p`Tx7H;&i_hY}{(SbP4n
zs1*R;475!}yQBTLtP?9)j8#^MWpL5>@zNxbFD-VU&ltaH{Ku#mC;d7Nuf;pUo+f_E
zTl}I`ppeqeSFBLyR+Mx$RZs=ruq*9314{c<EZP6{8AIAb>u2B7Yz*kopmMMI6SI8~
z|Jwd9+uqZfp7-p^0j2QBi|8He>E^d>!E<ix-0fWB?ETT^few44{qfFT=ec&qUO7-{
z&$So#I6Ip=E4?S2=dNuZOm#BgM?VFg-4*{|{4Hxy8B!{>@CTFv9R}BVKr0m0nTmVm
zbpX(q<b1$ks1U3K?~_yKupI8|R(SO$M5`+lDA#-lY{`*>2Fp%mzg@#3+F&1&=-+8b
zUH|0()C3iVP*3|?7sq68>P(<{n8q52u76URqeYena4O{3pkxtB!l at 8Hw1_-z#8%vn
zHF#|`Qkg_F!OvL9NSQT9k<%n(rIdKg(BBW8PhQI#oF5)_^ZSN*A`${;$r@?g+?0$3
zVm!nSS{+0&o(wU`6P!Svi3!>>KEZfy67MI*pN#lH%D)kcIIj~=NVgR;SOak-QZe$F
z9tbo~(E)3QX*pk#?j=#t?MsAGxX|}g7Bw5BqW01Y1$eFNW@&{EqI{6|eK1-Wr`Tw&
z1zam=7PnU;<*z++V#i1<H{mho&tSBpIIpx)ho<;4hSHRW3Z5q?21I_u3KVPv8cKKo
z;JsXX7$wM<<oV~8<~ooC?e52W0YA!Qq1B;hkKM&`w4pbB{rX${|1*~rsJAYp5*z`$
zH6s*Oj;|!^N_fpIJf9AqQ21Pb--Q0+r}~roDulkCpV3!_+}Aw0FI{Y3(0<hy_O^=j
zMq+7P6tG&et(A~hi~IYMX7a<&(_(hddPQX0eY(}HbUq>Qxzqp{>a*181M<n+^0yps
zALL#E)*xqsOI+``CdcoDKJ-(4$YZ$!H+;Sa`6=8(yYors^5X{wvIVY;60Nq~XAYcg
zl_6K6a at R`{*nb5+Spi-^rEdsfgs!(3U(Z9LfSZZku-OcAvJu`K-X#P%wG)5JWeha;
ztQxis+kivL!!i-}=Iq}Co>26yt=~Z at 6qgb0Vc?1g4A<NESrJde`60k*z#38_mSbBK
z`o)Bk-><h&T)l-(uD38cvO9{MqScckpXzks-JS%J=V3*%YUjk*qkxE)f*H2<tO{5~
zJ;ClK!E7ULjA8}+S3yS97e9+)kK%k!{CnK&+$bHZ5L4oMpc*N*frNjqwV3Vs$H}EY
zIi*V#u+~;mO;|Z<1ugPfJ)#mvDYH|Z?JFaas!lf+{``n+b&Jp|2>E`F^L;-ZZU&!?
zmlEXIrXeiTYCY7vfNl5{Z$UWnzMT=S5h>4x@=w8!-z_ at BHEumkdW)%%V=Q#@Q#FWh
zgHKj`m2Gk at vovF#ob+}r=V)Beu`Gq8 at 3t(%1zj0_Z&#*k<%rGKuY+9Ya_5tsk9OWk
z_6}$UsYU*VHL^nC^cLTsMwreeosWZU)^*)Md_SxjfpOn9j!<3c_3F?PS<7r5p{}XB
z(g!n+s4N`aZ_l@@P%ff|t?(4+IzU4 at g{NM39q&5mda-N21%Y?Ocb0>u+%}Wa?ybi3
zUmmLpg;pL>1#D2S-wyN+Fvx@`fLTJ{s9A=zF%$r=$Sso52N(>!(k0aEzMuPk3b8`+
zteVwOQ;OCESYxCn5^&M1n)ewCe}QJy9EsFiJgX*nSidMEHN&$EQd<Zf04vi(5uk=?
z9fvZ=%#B|P*JvppwsB72b=5F=+bsjxP-?A>8X?cPN^B&nFSu$1EEF!lcJihmtHWBq
z!7PA&uSiM*`}ZqD3KJKg#2jKbN1K6m3xW5`fO;?g^=yEw7n4&~xe#;Jke#aQFk^t%
z99oY`#l~CT^&3WMfkq9S6Dj-#R})FUQRz1b6{x|V$TcGtA_Qd>q7K&!6nU5babja`
z at 0B?(#&grePxE<Un9r^G6)&JBh$;9fE}i0Z4F`03Cc^1TqKj`GB6aXy0x<$F8S1=<
zw*xf`!_si8bE?lsjg%N}FP!SnwUY2L)(}3{=`agv1>s}D&*77UVNNC|`=MMFhCT5L
zjL=Xo&}4+q$s<hr+z9W8j?h&SunjZN=b8#9Zt{yrfq3)+Dugyk<^UNfd(ukDtxBfH
zT7;EkmTzUqkf$|-W@&h&qcn`8sAE~6IXelnwF>mN0Ap%ERg){OQx*=D;2q$Z<zv<O
zBC at jqaBkQyk>~<q!$NtjR0;kr_~x|?`baRnsJ5gqX;@{?hZ)~7Y8&S)I-s>mNEQ1@
z&bWG%0k|m)feW>O`?f~lz7U{^H^D5V=R{(=|3%=BA324AI<MAOF>6pI at M$G_spERv
ze8BV|R(Cup3L_9B(6>5%20C7a3&!swCyJbvzW;Pph0pznp#NQWhxbi!HnAzjl)s)u
zxfq#CfS;EhOcV6>hOP~MgIF$5xPiPOEZZ64pS>aSenWV_ch5Jy#r{N*_dVw^*H^I{
zf!|VVUqN;Fb-WK3!RWpT_#*mof)!pXW7S3SK=b_!(g$&oyq18VPn2Ys-nG*K9z5jf
zlhTA_79;|*egiH7Pg#}@uvi*^vJY_CPV!@M5fq55MHGZrD?LPWCI*^8Z}Bnn+z#{H
zPwW8Xe<OIVly at NCYtDVn-*leuYz9fzbec(w0D9YirCDc>(qmVH$Zpv$QFOPAK-XS3
z7XETENP~QiBj^;1IxGD50^ewT-|^pzull}In!}+|{t!>*mii~e4wX|Lv{fKJG*B>M
zYF#NoC$DJ2Xz}abJpUts=GM4takbacZ^J(90f*m3-aFKxT67xODLeHn{1fEs)OwEP
z1*8p2cW at P&19<!#U#r-Oo3I(B;zboaZbB4-NEDISwI4X^6stf?WCjfF=kaDz&-e3+
z65M3X21`>Y;7qkZ at u1S^5zAJv1?S}TOd2%ln;s>3Uyh_j0i^ely#?q<^GNOU$Tl_4
z<Qy)P)I(3-`#<U_nMW3`IpB&XeYH~8X#2UrIiQ&#I=HoOm~q9Ew_VApLlaaK8^9xx
z-!#FSK^AXJ_g_h5=hl-^EXbM^{sz?f#B&$@0`SfB`WK<q*iT`$mB8_cdJQoB6me(~
zHUn;iUde=BtV}P at Tr!4s8{333JX|<dYT at O%n;@|P*bIo5 at DP5_L$~nq*|10qaalXl
z#{N<O8!LL|OkoHS at 4RY+hO9zg@~oO0Nm<Np$qO!Jz~=X&7Ni2Lv)6g|H5PcJCCnoS
zyCd(WW}5Z|=z0{#jBCjr5X=)Zt`e!vyT at 6QA5V1dx8(B!&-i{p*3#-Y&;$rKi25#*
zNO#`txgs*1cl&-J>+gunk#`Az+ndRL+QbQw0?fYOljWa7qPPIlzO21zJSV`=sbJ;G
z at eUZzPd#tSy(#LEHp8>5{rk at 4?WF^XA!Q9MEp{#&U<V6C>a}IBHBCVZFa#E~{FZ0F
zbHe$y^ZU+K$Bz$eKCW(W+Lr_^xsO?BCk$!HSY~0)cbTG*5O|>!dF!?}9W!B{*LK8P
zETy<mY#Z0=UX6?GQ+1Pl6%){}l)PUNL}X<KS4Mp0n`BRcte1y#@mAatE@?)Q5{m4E
z2drctd?Syc-(kv|6NWRjYd~s&9Z&1|+fCI?Yq+;oyWAUf-HOkj*U0ZHMKm_Vaq2+i
z{Ry!xvKK?rUEvnP)(CzCikrOmF3%Hr`e%3qk at 4u{o>62c1m;ju0C$&($p0I8rMDLk
z#FV9ojW&EXNk~4X4JA4H&K?w&9 at Ac8CjahXgk{<kT?tAeI|=e$_EeihvD}7#1#Qx_
zjy at q-OcC^HT7kExymfF^&q^CUlT^V;nln=+WY4Qj#xPr~Au&UD%(uwMn<U*-$}UWE
zkIQ?nkyEU}m!(BP0p#lwixsQQPMFPClhW{e8%HPstwxH$wDqZ!@NfX<4y6*mKyk at h
zDzIrF|MXW80~-4SZ<$?rK!4PFpsM~Ddrf41`c~JyWJO7SQ(U%1$Krr16pn)WG(HIV
z)T}ba%(5U4agt=-3FS?|SE<JuT=(~?+DfK(j8u-^`W@^ILOW-rh`<*l{Ps<ds*LdH
z+ihZlWeXBqPn~?ib$8DySJSZ7_2e)}8V<*7P<Qt=VwGIqmaREy3-cbj<a&Dg`F(G(
zum!Uh6DN{mHOTJ;`K)eu1xp!xIk?_g3EES%AS|5hebtH%A=dxBZYJhy4@{WaEqO3&
z;rGNp6!kq>-6Ym)1Z(GtVAKQU3A1|JF}<fu_6Ni;T=|TaqbG~3badOqSukSz>w7Qw
zVQ_uBO~#Nx0$@kI+DqPhpNS#bf*$%(ER}%eUVQTZ2bM}1%NZ~}hvkFhq`TZ&F at 4tk
zdBj*)EV#-cPNiulVkikQCWMX++hX=*`=#o3o5h5Af6#Rje2-(u1pZM8x-0x;fR^>%
z;uie`S)a&F0Y3|8{&JPbcej8~$>7(4PZrM{nY`aPHL^ofBkNvGa0~C(MBZ6a#q92?
zX6){M<U1VvD7eO1iT_6Uf>0d+_K-ID+DdbDxuraKGC3S?;c&y7d;ABm()TuaHb~S%
z36I-lif at u_9>HuU**mp@%z?!)V{0V$7;xwzp2eZs!zgLijGT?`nodc3OXBp*UYgQ?
zEg&&{W5G+oD$7e)P4=iJYOv<b_hP<<S0lHVpW2s?S}imp^Wj8vWG-rYRz>H+ipY6|
zQL0`3ew*v0KM3<tL*@cipt$IK;7pk9YWz+2OJaL;jGyDHz|<J(JE?TJ%^LSEye~R_
zdA^FisKo?{D{`$vrTIr#;QYnhE2scyoPP)r3IjYX*-ygxQQFItSI5k$Iy$FQ?{37<
zun%CwPt%sr at kX!@=DjZ{h!VbL{Ly06wlwB^!F*q*luq`gz$ck8$`3P*=^xd|?=eJ9
ztr*xJku$9f?kAc~_g8r>X-&ANJwQDvbrysY0s;JqM`F+OlQ+6?zqJyBeUradA#2at
zmr?Gu(V^K8EC9hE_YrO1YfN7ZD&s|7@)@|FAW?V&_mUG%@;g=F7tZk&#KO3DgDEv(
zBg8I`;Jwpu{yo?We5;DuE%JWgwb8*|<2L{{lgUeGA!=c}1h^`?$_>mNNcufukqQ^d
z at 9|8H_|hzVw-S5}Id>qBc2)_VITFw7<UHpR`rGA8Qob!17olSj+kaWs9J93hhsUBT
zou6;hvg`}noQ}4+{8gN1)GRJA at znHLN>O2?7F*1T^tbDf@^D$=eRD)5<kW?86xSeU
z9y#B;xFM3GgPe3x4LLi)IqYMQGhfs|&Q387uFp&`aFr%VPJo<Wy)!LblX)L%u9+av
z`Xf12kaN!jfi at V)c^Go;B_~bWZB}0XCJRK}5Xl1G1`CU7zA7Xgvpb(V7jG<FTp+X;
zG_VjwV~tlIuzKc!rA{ySr}<fg2o)?%_*XHM_!we`wNtbh3xA_UgEg_=XbD&Yl>Am!
z^RP`Q7t~^7*`pOIONtWr?7B`{DwNh6jHrb8uQ`YWULs$F;;_;}sgk`l-s~WRUMy9I
z;*iMq at SWwI6`hrxrq0!!=FT-b4yoa%@t!bdJbv0;&Qhp(I|6dT-B}G0OZW-y;wrP6
z?}NH`l0DGRN`ynuPlK`O at xPR5e>^<UFc at b@PNeOHZpy$U#yJ|>KK6`)&0L7rfF{WW
z33%D}5O}Bm3-a>t8WDMOrl0fS8N5~hX$!k2nS3+Dn@#qI$(lay7tuJ23&|OJfN at yp
zkbBLD=@qrohMZQ~4t at 3rq*th$3l?jk{Qji?67+_we;#!7dT0##7w1VTpPAKDuY-;#
z^kzd&{&WsSa*W at 5JkY{BOP$}h$GHW2QIBvt(OvE=o1ELHCOd?V(fVWR>)^@s4qN^6
zS>CDu{If0Wu8?0ErfO{=zvsWni5iHl?yEx at J7E4};%`QCZv95~KM_RY2wm{<5;u_+
zD<AC*vKJcFE98uf<okiQ&dWn2Rd8{eStTInYBSFue{1Jz=W0{?Zf6~b`Oekmc|tN<
z(oEs2lP~G`W{NFA;5n{B<O%W47R#Y#VY?m)oh_zjggmKJP?<81$NjFbg{LnkkT-Bd
z>R`E7PtJ&3o{L|zFwIWSu%r9qe~G=G;mZj#@qJ}_hZ1^6ERT6}k`(eSpPZ{BZ#?A#
zMoVeRoD?K^3v?7sITL`h_|61*rjdCE$4hb5Nc&Tkp%Ij5b#V9Ok*B)I6O_IY)+q;k
z@;8TIZpF7DHAg@;>*>`{FYENXW|fp{;i*yQh6-*}-MPV?4OA)XAsj{GCrL7p9Rz4y
z4)ItW at jNgOG3Yj**$-IolBfsX%yui`IlV{eN5B!hHydV|vu%V~)|=D#Zt`smGi^tc
z^I&xGVix4}>KH_R=Q_3U)Cc(q at JsY8mg|>5{X4%C@)t~=&_P?$7l8_8lAD63V?7k)
z<Pk0k_k at +ulbZjvn+NQf9^TDwm+xd=e1C`75|dseTFio8?v(w19%RvOSf`?2_{|6M
zxdr8I`RsK56yNk|F6#+&EBU|Ikyr0YpXMi3L_-vK;v#v78J8)EC at n~v-G0^i-5x%C
zifg)++RQ;KZr at _D(Gx%2Zj8(a#1fp9b5m{NIW2+BA{v`{mhv~l++&C>lQ!^(K9?9<
zR)L;U%cV3HJV|W}q&YK79}Sl>V%2$tyHU{FQ#_2jaq>h at IZy-o1Z`z%%af94wz9~r
z!eu}!lN>F56+E|RCpMB;AnLV|^~TSR09`+DQ$1PcM6|%aq6eZuk)6#gpVf*8sNGkV
z`QyL<HK;Kp)3jklGwq;y8rzWP2BC6u8}O07Ud^V=l9Vg4a$SX}G%~0DBA9QE<6zDu
zQ!dK_^(adTeW<6h^J^xKS=w1IYhNC9PS;lRe`j~1`r4<E;>g*<8$67OPYP8qXX7Py
zL({<!Jnu{j$+a5L*J`&S#S8AkS0J|mat-|7%@2$xiO6yamst+tjq3)ILY8&b1{0SQ
zdQ)Xcp)`g$@Y7KmHW}9n+&C?8&8!a6 at cgxkz}fgg#Rl$Rh}3j1j64V6`39w_)gk4P
zn!_tdYjRqU`vbw<f|!1>2zr(R&1L}w$Ve6al*q2L?qMmboqUU#4IuQuCur%r>MN>x
zOOn!zP{5J&aY2CEfRaLexkEY7s at qb67Q1tZbob=QcTEq;2R|IFQwRKBg`X>8tvY>Y
zYIu}RY>lmmSQ$@>tg|hkvlXK)BjR<Nci}K~ooUs#RgJKtiuc@}%g|;g(oD4>9yD01
zGc^q}^32{Gv7b=0TV>$yplWiEI$G+ at F)aLoyxh;{krS9)|CC(2iIx2TBu(bVAQn}!
z9hm06peL9euv)Tk!gZ<}{L0&75i6R76R%TIt9qUCFCn8PTueCHzruaBhZ?3tWfWSN
zO9P<OL<#sbVOnlLs{LoY59&}ecJ%sfNbW7hmNLYa`i)U5It+Tt_v5GyCC~CW`k_Zv
zv`0Di7r+~2LDP<S7`T4o_}~|LIKP4os(X~8A{INK$RE6VoF5C}m*gynWY!|&T}@7l
zM9#yL_*=Jx9;|{0Ak7&6aIP`EqsqjqE#W9 at --i%s#8)HL;vkMGt at 8|%Z}<SF{Sa|Y
zbXHE3beblLJ6D^sz>b<H_|7$ukBNT-cLDD4K+CJ{a&uBBiP*LZB&d5ppVT9zvL2~a
z<n)gT6(9mL2`rtAVF{8jZ_#7D#Nlk;36Y#n<H4U|y$gLmU=gMC@@0u{_XRPg!`@o3
zN|b7I=$%%|D)ipxOf>IE3T*(W0jo2~vLz`L+FkoH{WZ%%#JOqncgDsnO$T>{E;>`3
z4{k>^BHwo&2~8$CH?S`tMNgKA;gTm4Hyn9sSHKpa`k30ybQ;lo(G>&vZChp#kyA3b
zpqs2L&aE4Ba4=s5U(~xNr<SHRI at xI7fQ!zV>|8&i{|7(ce{B;rQhS*4;!9)J>d-_F
z;6q<rDx#LFW)A!!Zr`Yh4~5JEq$@O|Bb4wE)=vKOyxLG=rD~QUg`*Ktn$XklstoHX
z>O<Di4tH6{@P5L*!<3GrcaxN^fwqgt-yl-{hD#YD60K$)pz7nEGL?ivLJHDO{;*eN
zSVvJG5h&{-P;SU=chX|*VU!D&Uy$F{t^y8gBhohw#XSW@;5z6pfHNw?IYhSvXz71~
zvx306LCg3&_GNI${xNNJXG!_dmYOQk(*4f=+|s=YS~drmJ}vQLun@(;vmn4o=`!WR
z at Z2UL6dGZKc|h at pYg5r@GL&0#{|rE}xwHEI`a3Vc`m<T}%P|Ymz`XyC-N3%IOHxf~
z4qvNB7odR)xW0JzD&T|vo=ogh4l^bic);8{?FsmTM8^>QQiafW+*xgjQVB at bZ&?do
zFESg}9}HOp>ki9KYn40Ky=DXV5;|P4L7x<=Pt)D;r}?c^8`U=|>L=2oR<$E{+W(Bv
zV!mLck0Zco>}5ujJVFIi7cXVX`)rTYjkRtB&2ZP$(*X<Uky)O2$MlYyXXnLakADMG
zj-(m7vJP>G^dnyIBv)*yiof{V*wPAArj|?J_0VE(Z8MsKtDFy+RRJ`a*g4NRmz-|j
z4)WDGSF8{tYvxu?UUPW7EVF&mtO6-RNxOO|S>i#js at 34>;>pAwx=i~rGI3eEdU$8D
zDeJS)c9gZNGZ}Je$VoAABOtjn>P&$g7IGdmC22{osqm~crE<xTx51?S*FPao=eb)v
z=XsOxQO){QOqi3ZLX(r1?x+rpUxn1B0NtksE{G2>wRC9XFIIWfEj-z2^8ILB!@h*+
zNSeWY{y9)Tx%O~q5Za!HbiM8rW`4QJFItPRuPXG}e}X0GL+F}n at b33k%Kxv&U9HqL
z<zT#dl76~wZ0~4z4~fgjU1F#R$4qgfo&}NUY1ES*$$QG9i=^D1q)2LoCoWR2%A<&+
z+y<nX`i3U){}A|aO5nJEK-{pP4yb?n#9LWmojp14^h-o*5L?Ei6RMJUfOzWQ^=Hev
zjd=apEH5&$Zi6S03D-8ygSp}k?jn9X at z25QjPq};gIR$VaS<O?j#J<n;xs82o__$(
zW$^rispv3nH0qQ3w@!`u^LcSAzMx*!7v#CWpzTv%kT+egIy5#IT{8f?7e{QL9I>i_
zX86p4?OZ21LufV+`1s$>yhL=ZOoNQiQH=21+-ZstZkrpX7 at -zvF`HuBBlL>w(5wSn
zv{sJy((A at rYUI>%;E{)?_mxNuwVc1HZtP&jblu(I8sJAIk)5WpXWu^cyRTpgtB73y
zn|o>r9sHGpGQw3}Z39oC`E|K9q(lK|!-Q8e at ijt|&|5&4$1Z1L<@ko_7$`YRyZ9Ai
zk+HB7^f^5ceNWM&oQ{hADN^#jl>`!@5UFtveoBBh26qMdTGse3`PvP6pUNo>=qqYG
zE3)q=k-S?fF|tF~x?9GmIr2S`h<5}n=y7GZMIS4Ie>i?a=H)4D at 0h~YnBJLd;u&|;
zKax^smHlG+dyUai49Ke(<QqBlBn9+)OQzpjWd6U5ZnxF~_JGC3#F?7ag=Xvuk-b2v
zFH4>!eo1mkgF|nGtG_`$<+3{hBXt%GJ_^I5 at IGi^(653{`HhU3(CTDpbrERqd<it+
zOQFFG^rbJMN;blH;R><(7x}7rvA(K@^FB!6`|phDp<&jT2 at TK4G(1CS2)I4}CDamU
zw_Nq>;8~dAdnEcaF4Mk!svgmaFh^<N1M{cJTKFAgrY0|mv`0;z$(JtS`Oh#r9KVe4
zzbBsLGa5O6P(&o}G$yde&k~4I(hTm_nMzdKV!i^1g97=Ir>TJ%^zs#a+BZzxu8=)@
zAY1s31060lA43Jg&J($oBi3%WrfrGDhrjz-fuJT2HH87eUMx^$8UZPD_o=SM4gL45
zF?Y^fn>QDr0yY`lBPlDmpr($)$sWaaxWbcK2l-*m9_oR)N(0$RklzztBVQZj>(gbA
zy?shPE&Z3Nl at K*q36UcjLRERxDKeD5NC^|^Gq8Do`m`-X4ew=x#ZnArfd-nSzXQD9
z8Mav|N^M3qq34sHB!H4EX(9axkx7}#2R-BR{byu7N`8~OEYMu`=-a1;ZP%?AS!glG
zBY+P05s8wZ-dfK+<lMFV#r7NW*C)U?-wQgf9w`*{J17QU>Q)%jPpVBkdOy0)wuIi<
z2mYO49l*`q at 7gz`b(sIF0wrVpq<O$<(WC78g7<F>lK%;U8b8n{zv&q~>lM7KgJ%J=
zvk<5Mmmmmg%hKI__O0$M0DWth-OO9i<cZpBv?nN-3;3&+MpR<I;NEU|0+nrFidO+#
zp=Z1OQ+u=f5qF2%ELd^sc0F3vW3JO9s>dueN*ebX<Lg1ETQnXIzG$2Xb^;f77{3>M
zqsAsEh0PA;=$jYk8n)4NO{0)%*xF3jY!;FXkHEcAiZ?t4`I{w`VGBl%Ubw2uucB1J
zDrk(~40hlDsh}2`)r=sbRPeKs3 at uRGD#RN^Xx%KR3^s%gP;gZn7SeHs9E=QiH^*J8
zG&~GXrslXog&_xglFFgER^D1JvgBM&C=ujH;d78L-Ir<Kxzho5<DEN2WMDef1}0Zc
z_UwatQQ=z;vFugb?sv2z at _iNBHNN8rN1C0;#K$RO;?M+=@7IDnAyY}5Dn_2jJEr|6
zL~o4Q8|2Bm2<<j<;t$8U-Z438i=_$Wl08Ctqp1X0MI5t3sKRTbrxyqhbd?bs*Yy>m
zsk at 9s*L1A{E!L3oiu|4I#gMLp`x2tr;9dgv4dgr2mRHaUv44XNhva><s`14c3Pj0g
zud5ta#}^*Gm7+ka>Yw2QQ0o<_#Y4~ZczOzhj>~CgJQdP!$!T^x0n&ex(~5Bwq$dE9
z60db!1$`F+SPYfnI0w-FBCp3y?ImhvzWwVvOx|1aJp|gZH(>297nNXZ$Qc(3c<30G
zHU<zc(gEvGvWbgd3i3+6ERhYcu6v7pX7ATY4k__wN2EvxvoTMk1TIZ`8vJ63v|IV5
z?N)lTMZJKIY0n_vLz7AV-qTnVL}hpR=Wt*mI5d7Kti~_Hp^voN{-y1<PvP(u67(qL
zE&OYx?;(HhG#0c`bMi{~{Z^8XS4C*lESG%xg(Zma32 at nefFGJ^g!GiRz^X|J<kGRZ
zv?ew;#y7YbS!Gtmmc#tsNBG^m0CXhRd|VWa_naIx3EHIS7wD!T&zZ6|Q2XgR?%<=-
zwdY1_$MonE5%JwbzHGtUr;I7Vx4<$tz^{&2Xkt;}z9EQZT_}IudZL|ZZbbImp9%`?
z=g}5SzSJaK)-5 at lb3p_voO1zc4T^Lm^@$PkEsVTFuzWlb^ljS7y%)9h4HPpD;|!h-
zk1 at 0fV$53dek|$BNb)xWZA|q$Xf4TcRZFZf1#<2MEKdie`W;N3OCv`-%fi-U_aLzz
z@;g!5l#J}6>d@``J-Kjwz at vA?!M(|IhkS4Iq|5g+o;h$G at TAo5V3PqS72p=OcW22v
z-o(~<B3~IMvICU5=br}S{DeaWeKYN at F!1Dm(W+M`PmprseF=w1xgoikHe}Oe9lJbS
z_Qn4n at 0OxtyK-jzZH4@Y5luaH=VRM;KK1R#w%z$3jo*0e&i{Do?t4})-L~w`WhG1R
zzVrSK<Y^P!?q0ck)9PiL?k}&d-BkWyb>*h at 58S_Lefj;H?th at 7x@PsJ%F5cMD>p4|
zgm%kTl-#qtWa-ip!(A&8n%(c`kh468I0reH{lEF!NYNa`U;o=blYqFg|C9fvIKThU
fcRrt+K(RE1&?fjRk^iCtT3WJVDQfu-`_TUj0li6;

literal 0
Hc-jL100001

-- 
2.18.0



From ilias.apalodimas at linaro.org  Mon Sep 30 01:09:11 2024
From: ilias.apalodimas at linaro.org (Ilias Apalodimas)
Date: Mon, 30 Sep 2024 11:09:11 +0300
Subject: [PATCH net v2 2/2] page_pool: fix IOMMU crash when driver has
 already unbound
In-Reply-To: <ac2eec69-8f44-4adb-8182-02c78625851d@huawei.com>
References: <20240925075707.3970187-1-linyunsheng@huawei.com>
 <20240925075707.3970187-3-linyunsheng@huawei.com> <CAHS8izOxugzWJDTc-4CWqaKABTj=J4OHs=Lcb=SE9r8gX0J+yg@mail.gmail.com>
 <842c8cc6-f716-437a-bc98-70bc26d6fd38@huawei.com> <CAC_iWjLgNOtsbhqrhvvEz2C3S668qB8KatL_W+tPHMSkDrNS=w@mail.gmail.com>
 <0ef315df-e8e9-41e8-9ba8-dcb69492c616@huawei.com> <CAC_iWjKeajwn3otjdEekE6VDLHGEvqmnQRwpN5R3yHj8UpEiDw@mail.gmail.com>
 <934d601f-be43-4e04-b126-dc86890a4bfa@huawei.com> <CAC_iWjL7m4ZL2W2OZM5F22dLvZhxU6fyCXV_xjyGf+W7UP43EQ@mail.gmail.com>
 <ac2eec69-8f44-4adb-8182-02c78625851d@huawei.com>
Message-ID: <CAC_iWj+Shb6buVf+wZaWe-NZ+UVxmW9DYqsTiL27U+V_Ko_65w@mail.gmail.com>

On Sun, 29 Sept 2024 at 05:44, Yunsheng Lin <linyunsheng at huawei.com> wrote:
>
> On 2024/9/28 15:34, Ilias Apalodimas wrote:
>
> ...
>
> >
> > Yes, that wasn't very clear indeed, apologies for any confusion. I was
> > trying to ask on a linked list that only lives in struct page_pool.
> > But I now realize this was a bad idea since the lookup would be way
> > slower.
> >
> >> If I understand question correctly, the single/doubly linked list
> >> is more costly than array as the page_pool case as my understanding.
> >>
> >> For single linked list, it doesn't allow deleting a specific entry but
> >> only support deleting the first entry and all the entries. It does support
> >> lockless operation using llist, but have limitation as below:
> >> https://elixir.bootlin.com/linux/v6.7-rc8/source/include/linux/llist.h#L13
> >>
> >> For doubly linked list, it needs two pointer to support deleting a specific
> >> entry and it does not support lockless operation.
> >
> > I didn't look at the patch too carefully at first. Looking a bit
> > closer now, the array is indeed better, since the lookup is faster.
> > You just need the stored index in struct page to find the page we need
> > to unmap. Do you remember if we can reduce the atomic pp_ref_count to
> > 32bits? If so we can reuse that space for the index. Looking at it
>
> For 64 bits system, yes, we can reuse that.
> But for 32 bits system, we may have only 16 bits for each of them, and it
> seems that there is no atomic operation for variable that is less than 32
> bits.
>
> > requires a bit more work in netmem, but that's mostly swapping all the
> > atomic64 calls to atomic ones.
> >
> >>
> >> For pool->items, as the alloc side is protected by NAPI context, and the
> >> free side use item->pp_idx to ensure there is only one producer for each
> >> item, which means for each item in pool->items, there is only one consumer
> >> and one producer, which seems much like the case when the page is not
> >> recyclable in __page_pool_put_page, we don't need a lock protection when
> >> calling page_pool_return_page(), the 'struct page' is also one consumer
> >> and one producer as the pool->items[item->pp_idx] does:
> >> https://elixir.bootlin.com/linux/v6.7-rc8/source/net/core/page_pool.c#L645
> >>
> >> We only need a lock protection when page_pool_destroy() is called to
> >> check if there is inflight page to be unmapped as a consumer, and the
> >> __page_pool_put_page() may also called to unmapped the inflight page as
> >> another consumer,
> >
> > Thanks for the explanation. On the locking side, page_pool_destroy is
> > called once from the driver and then it's either the workqueue for
> > inflight packets or an SKB that got freed and tried to recycle right?
> > But do we still need to do all the unmapping etc from the delayed
> > work? Since the new function will unmap all packets in
> > page_pool_destroy, we can just skip unmapping when the delayed work
> > runs
>
> Yes, the pool->dma_map is clear in page_pool_item_uninit() after it does
> the unmapping for all inflight pages with the protection of pool->destroy_lock,
> so that the unmapping is skipped in page_pool_return_page() when those inflight
> pages are returned back to page_pool.

Ah yes, the entire destruction path is protected which seems correct.
Instead of that WARN_ONCE in page_pool_item_uninit() can we instead
check the number of inflight packets vs what we just unmapped? IOW
check 'mask' against what page_pool_inflight() gives you and warn if
those aren't equal.


Thanks
/Ilias
>
> >


From chris.lu at mediatek.com  Mon Sep 30 01:12:57 2024
From: chris.lu at mediatek.com (Chris Lu)
Date: Mon, 30 Sep 2024 16:12:57 +0800
Subject: [PATCH] linux-firmware: add firmware for MediaTek Bluetooth chip (MT7920)
Message-ID: <20240930081257.23975-1-chris.lu@mediatek.com>

File: mediatek/BT_RAM_CODE_MT7961_1a_2_hdr.bin
Version: 20240930111457

Signed-off-by: Chris Lu <chris.lu at mediatek.com>
---
 WHENCE                                   |   9 +++++++++
 mediatek/BT_RAM_CODE_MT7961_1a_2_hdr.bin | Bin 0 -> 493809 bytes
 2 files changed, 9 insertions(+)
 create mode 100644 mediatek/BT_RAM_CODE_MT7961_1a_2_hdr.bin

diff --git a/WHENCE b/WHENCE
index 1d4ca27f..905a5830 100644
--- a/WHENCE
+++ b/WHENCE
@@ -5796,6 +5796,15 @@ Licence: Redistributable. See LICENCE.mediatek for details.
 
 --------------------------------------------------------------------------
 
+Driver: mt7920 - MediaTek MT7920 bluetooth chipset
+
+File: mediatek/BT_RAM_CODE_MT7961_1a_2_hdr.bin
+Version: 20240930111457
+
+Licence: Redistributable. See LICENCE.mediatek for details.
+
+--------------------------------------------------------------------------
+
 Driver: mt7921 - MediaTek MT7921 Wireless MACs
 
 File: mediatek/WIFI_MT7961_patch_mcu_1_2_hdr.bin
diff --git a/mediatek/BT_RAM_CODE_MT7961_1a_2_hdr.bin b/mediatek/BT_RAM_CODE_MT7961_1a_2_hdr.bin
new file mode 100644
index 0000000000000000000000000000000000000000..f6d37441b19c55bcf487b0989946e55f62d15311
GIT binary patch
literal 493809
zcmdS>3wTpi)(4F5b8?cVZQ7pFRtkbmdgEd#1wku at avDN7(TV|z)+!P%t%y2S0Y$9i
zNqfM66$(Nr$R!|FMD3KBSPP?0iiianWf(HzrCLxKa2QMr*o&e0e)}XX1 at wL2=l?wa
z?|D9PHT&$n_S$Q$z4mSG%jm4pW3q0)C2Q2EQDes5Mo4a+ZTd>Gk_7M{x#mCan(zP1
zCrcP&X9$rZ at P||?zdf{BN&wM!W!?9?q*$UNEs+e7N;QO3tO@@1BT80 at W=H-&+#{;r
zBS1^FJHtrX?;-pz at ihM_<d6AZ at P02j5C~I}Zn#MzXBr(uo?1 at C1rmAc%`#H6yNo;p
zSpJkmZXG0%Z~j$A+B7m*j$iIiWn|zV%Sq}R4pLI*Ae!kCIrz1Mc;5K`Rg&N1 at c*57
z;e|@_RZ%5b^-?9NwO5i&Cn`z7mz9JE)D%||_uZAG^gtyMR#%c@{2oR8z-9P-s*?QS
zzDn}gluFVDC_%peFa9Tz^S_GZXBHp<5cZV=WRYAxDU$9XfVqIBfHi<!A_=S%8TCAo
zVIBvp5SfUvA`^94WTK~w44*ABaqS|Lus~!IPm0W-ERne>PGt1;B9k@;@EqU;kx37T
z%+SdIG59-dwaDD|l*ml*ij1jTWG04-%rvAu)GRV{)`-kJ<S8l<na4dM^F)NmluQzt
zCkdbm at U_T1l`1le7{DUHMUh!N8ZZiQt4QqM;rB6-c^Z7a at Po)a^Nq+X;Q^qrWGSFl
zWR?~K8bm_rFN*=p6&dI4BD4Bdz(jyUWGa6WnYAwh-T=H0Xb_oo;B(!(BC|dL03Oz(
ztatw?GW#z9ei502!vMoYrpXETNMt?*?N475nIi^3n#g<(+9!_y{vk4_psQ1}MdoLu
z{hR@~2VetC13<Sw&j8#9xF7H#;AaI`{Xax@*yAEQayQ_h$c{At9tM;Eo&q=k<$xBz
z8GsLPL1b at b0MP&*&<_v~7zg;X$Ywtacn+{pWOGaa`g>SpC&U3pitL^3BAXWhz;|96
zV4BF<7K-eQ2_k!ck;p#zG2nHPUG!K8{(#?iMRxHWfO`OQ0b2muMD`irKLdUhcoe at +
z06^=RMS#VCmjQnh*`*JN?2;q+1<mKGMYc2zFbl9+Wd8{H6!;v!rvaBm)`4=$fLnGz
zWXtar*>!^fCjsY0c4MN*zRHR0_R#>p$nH2MvafjnjsG+3EEL(-zZKb<8$|ZaN|Aj_
z2l!cJ-_`??0jYp=zz)DpKn>t~k$p!N*;=c}{u%QA1$@1mDYErQdk^_NQ6l>{)ZKe8
zi0od_-Pb0ve}x|2ht5BEO=Lfe1mptl11tml8329{ZUX#OWIq`J*e9}0qeb=*<Z42_
zAIb(i0)So)H37a8*&~qs$iGGQ>mwrjIm-U}gvfql2Ye{9rzsp2+5dpo|3G)=AkVqs
zfH8o{fPl#U_X&}`gz|p{pTA0g<$!~tD&ihd)xQAnB;W;6mG~&&Ilv0QzeUvmD`2mv
zy77L%LV#0L4gRmFN at 7LTO^*S}0dI;by&f=BR2gak`vFHpRr0d{58&^jDy<Oko~TN{
zT~v)o7ga;{h^owfqH5?dQ8laua1PKRs%{=2sz%KaRkwhLF+Yf^vA2n;+wKrmx0^(j
zumJGAs509C%K;}u)udMee*qj4Rg-VJ0 at jB`)t!*x?w3W?l<9!gfOb)J5BR<Zw5LIq
z=>+hOs483xs1j8V8b#I2pG4I|?~AHgJ4My(Uqsc`7e&>a7{F{%wFPC&Z4*_+KZ~lz
zmjb>7d?l*>AON<Cszsjz&H!2g-J)u-R#ZKWxYCzI)hm+#(9<RzelLoubt!;t0LZw0
z4d820RRz6NtpqfPstu_C<lE3Gs;V;ph}#G~Y=VxqK+Y|Qd-Ev(^6oYR9t6k$)Y*HB
z0Lc5^T0k{mBVaFJAK<S5$oC%V<-Jb;O#sOC-ceDtce|+iFiTW at 0G)q03XmzP4m>8R
zJ_gN?&x)#pkn<q;Z32&nz~8Y~MAdP~aeOQQ`CHV0y8-tCmH?gyl!n63UitlgnMiEE
zik;8gDs~Oe5IbM-iGj-)!zNUS<e_k}^C_p;*}g;UeAX!j0`CJ3iUB{xF^Qdz0lyUE
z!b7=Ym*x|(^VA%%bJ}RJbH;zgu3JWkUBePFX51~3qG4j^g=(>L`2%9-6Jx~Aji*4T
zOzgajGR*%)cq!;vP{v54e+l}fVrRz;u`6to*!jj`vGeKii2JkHr4q%?640~Pi(R8u
zi=CH_fZrdGALTxAzu39ql-OBR2R?pAS-TNlD|Xr!i)7Y0;5{LBF5Lj0W5rItSL_<<
zN4_ay=fX$C&ildB*HvQYlp?V!X^+?y at hbAiiJg1<i=E3(qMQPhR}LC_v2(3W>|B*3
zcK%W#b}j&KFKWcD5g&_Pe_AYdO#;1FSg~`R0km%b&xK;(SHIYK@}k%Y`y(bb(lf<C
zcN@~<#m=tBL^9_!vD5vK*!k#xL^5+E(mGJaBC&H3<_Ni4Q1%VbzfB~?ve>!45cvJX
z&Ns6~GAROj?hhTm0{r_?)^M?Fq+9vzykv&#8nN@!Xq1}*y*Lm*NF=k}(9;^|^$p}f
z`fJ7D;X%k?gg)*N$vo)L{~2&m-uQK5=lmA%P$+hObq0JvKgE!D!CPYIUj~4W43Xq?
z1Gh at -8rX&Ooe0N^<iXFy&J`QMe+}Z6L#EFlf1}uC{=3*&@F?_wI%@-sHPFi%o!E8L
zFR-0|fS*dS^YQay=i55e*CmvB40`r}CiGccFOs=2VrL!dx$}F__)zRz@(1whf?e%`
zzE{IuzlLnbMKW<HY<7p(x$|$J`wMuuQ|wZ|h_YbE%PB8yVrTb1fcGirfcFvEC<A5h
zd;s5vArtDQ<4>@~Cb9F^Pf;#-Tl|gKS^00sbR2b&Eq3l&2AiA-yT5=uQ$YJ^*vU?@
z^Yu#PC-`12cD=V*BoE&RetD7H1KYU>yIGrx{Gfw*SLfxMV0&l4&sp%-1$i})8}+HV
z8S!=CJ6i0lHiFL<$WsOxA4NLytbv>h>ygf(F5ZV7u0T8^cDe#$7du5H55T4-ya&FY
zM7{2T-Mo(c<G^ng_(j|O^+D9h5wyvFK_7REfv(fQeOv7O17xdfKzg0n`A8XlVUteS
z-eS<+z=>T$9MDHA%IZK{0F7DD*X2#1wHq>)LGGhsXDjsh#I2x-wsm<qZ1(_u7eQ~3
zWe03+=|JGY#*wdc8tUfqe6h3UCDgkN`&$ax&_16+z0aL4c0#7E0f)hd4s~G!|L4Wd
z_nt#NGyv}-v2*oju;<mFJp*=tw)!^O_(T6f*;RmZfDZwX<8m>0TnWBVulId`Z`9W+
zAL#5s-g`g`wss#6J)%wiiZ-zZeGRRf%DJek$HdON^YINE;?RG+0=c>%<H<zu#6SnL
zk!FWIqh8k_Ps<L(odnJgVpsY$=od1*fqDPTI at H-1$Ob-&4QN}@V%Oj@*a-TA4&;4h
zGxS^nJA^&VorHGyx!76WhPH%!b8Vm}LO+W{Vmyp~+J>@VD-UUae*!qj^Vog>>hppC
zzEO{>E%^P9*y(!*wy+nx&PU$~yk&aS$zR2;tYK)s=tmz)M}K+ at bZXHzp>Hv6Mc+Cc
zbrcERv&c6Id>lf*6A2snLhQWrE96CgI>8K{A@{Uw*xY+a{}kn;ADX`t^*J8=t5F_!
zdOQlWP(Kg-_ at IyIWy6_pftPfaFv7+2Bw8lTTP3D>tDj`5O$ANi77`v^K*%~XA68&(
z at A74;w`HtiPqSwRTEaZjIKsqRY$_74Sl}8s!Dp&no<eP16w;;>qCV{jGe%ASv{^4}
ztR3b1{F0y4tSB5hV+2h{-lwagJ$g%j8ZIX$VvH=*G6OiiJhCdUG2R&S+*+E(lVzvn
zWNXKt!el+T2`eCB6=uEaj5OQY at s9+VNP0Qf+HrV`U$S<*cgimThXc-XV~p(sgjEG3
zBElFmwK*6LUx4tjU^r?J!rukM(TNDR1j8{W5I%x1=#bH%6Bi0ELbzWj>_#{?7-n<`
zzn>FzcZP)zXA1b0(yocYP{ov8lS82bXg4wxo`Y}<bUfSApRiqIs^>*gKgg_)^jX3L
zslm}uzHjBemt<id<kXUVFI)aGhgceCt1NMPQem)+n%#fuy+mhAcaQ`dA(lOrWLKj_
zFb8&-c9mOFcw*UZBQ^(NCNp#Rf_KY^%@lJnfe_9z*FfUyh}w2<8HtyOX4m9+7tsR3
z;{_67GTF4C7isa`L*lcD4m?K1+ekEW#vm7u9I=S&2mCldJn|$+%cmYJNwu|0sZ*;Q
z+R2VN{VU3Vb3=lM^aqVZga-h3V7!mqm{3UuB}im2^4(;~wa0*~e<PfPa1z1+g!Pu(
zCrO0^A%iWKVey-cRA#baE at U9{EKkmfnS63i5~!w3oe&ea=&-D at _Xk$$)P<|tZC1!q
zNzyDQ?IfXuq+6ygA_-Y!2-1gIa at Ui|v2%IbGzV)lajL148ST`$s{=NJnoRv!7f9gA
zuy{Ke4tZ||en$PQcs&`BAdpN at 9GPGzSqUv<RDzz22Ieim90Sa;z`WHx%eHX!cfh_4
z*xA6oJ-&pDL%DYV+X(FOz|H~o1Yis9S(XwznR=G!ks}wFCcwl5fhF;kER$eo*@P at s
zmC(X+2|TNgx3ijf8yglcuv#}bV#9$MF;#R>>_}kifE|^fXQL4x18g4HvB2)<o;6j>
z3m`{af{l%j&tenedG-ci^`D$uLhiqlC6Wbs6Dv%J8xSwC0~0*#jldfOyutA<_9ojK
zsBs^glu*g)6C~CETFHn{v23^V_)QJk*&1RqFzm~@h)DxRI&u$bV-Ok&4u>U_u)|Tx
z&EPNt@{9n7nc#3FILuPy8C5acmd<aUswE!e8IAI90fjN~N7=Cn1Pk^$_BQaA9bdvi
ztL!*{A8^@!61`O{yrL;4GAOcXq at P$GCMs*klVR45r!TuTv{e<uMOm+L=}g3|-KDd3
zJkwz9SdtD{W$kz>D>Gr+2uah(;Wy(@bh)%wTfj at qUZ=~1U+pfFD_8l=^-IlLL;Vw1
z#d*}|r#KVgB5B)|S{#NhO;@V5BWx-9Elwolk9CZ-qf8HO$dt7tgHsVxJ|T&PL|cq-
zzHKfen#hCNU8AiX?32cKY~stgD+KWS9zpL1NzhBOMJpqwaDn#nmm2a-#I9{P-e7_(
ziRg*64g0;hpKB;36UmSCh7~Sh!h&A~kxgTI;+wS44uN)nRS at YJY7GQjo-|O-Ha>0>
zEpL#xibki$_PU0+BOnuW#@@VAgEG6k{VYQWDKGo0sd$u>STIWB|GHn{A{<<R+JpF&
z!lYry(ccG29W7npSkvl1iGRd6e)?M3Amw5NNs(D=hbrATc=~FYX*MWdNwV77 at zzi!
zJb;G0#80F~YsW83Em}UE<4OEMu9%ltuL`<n(Z=KHcwvm1 at o!T!G02Q at aA~o%<H0sL
zSB}9*kQGkAA+ZSIi3O&xfV9I(MppSHj8930M5&GM{03vxb89`}vewL#dEm4L^_1%0
zZh1zClMmV!uHxNcCbA^5DSTDqhPo+p$j36IVh?*S^~IQ?4x9|7zpJG0^Zr6>nAWvp
zc=_^%X(nO|Z#ZTgY)gXd2Kt?kZ~6<39m`DHHllE-DlCXufEXHrjiS!y;Y&$#P;5KC
zLe{319TiMGDOXclmUR_Icdjs+=(@L6F!i~G+PE%R3wg#UW3WCn2H*Sl2upt<4mSE{
zSPRYlXK$Vbj{c*ZGCEsAqw<fQT#PezTb63RI|Ul&>Qme)CjNky{^C0;_<f}3TlqEd
zP5A8{{V@`&h%l9~3grQzasLKcFFEAgVBM at 1=&1j~yRt^s<F{V<YEu4w5Rx)NkugFh
zbgZ{_)Q_ZACB5t4j`qdKgpZNJY)Mj>nGhQt<2T>f6h#oXim4))yL6w?$V`s<yah1H
z at 9-0uk!VRrVDYCgGLr%lQ)P^q{()a=)E4qgL}4NuY38-W3wz**S8e7s#LLQhC+0h{
z{nYF;QG!h;ygoE9S>SdKYu<Xwe3q-2U3J2HfzFCBBT6_w at lgMKeT?tHR*sxeXQJ$;
zaB6esCwX-8(443<sa{SVj$bo)IN_IM0vk5(IpEMsjSiEn?-Hc23l3}Nz++OlG^DOv
zo;~F?f_AaV>kYpM**D}$;jIkvzUj~xR!f6 at oG0=Q)d6yc%B)8zCR(qM*5uPnVaY3X
zbn2zOgCL#srnBC`h1HdY-^j`J=6w1$b80QTUPp1fMTOO_LBBzP4^r^V_|5!!Z%biy
zoq>&!v>qMmiLcG7xxIE&-K5Q9#_=*4$8&n5g?nyATEE)S_#0PyOOR4ex_4+{b;*#-
z8RtzOr!Xohnu(Lp)|clBtQ>{D>INa4(^Zk~a&ilauBz<*mmmmi_rH03Atpv3X1054
zcYj_*Vk!)UiJH>_C&fXVsh-=GGZRLf;beW;Qx2Ojl(74U%67rFlVn??nRT1K(K at Hg
z_QSgD6q(f4c?VX^F3i?m^mgJmOB?@2Kf$Dn+K_sn^NkW=l1{flpWCmpU-opF1TqD&
zlKWGZ_gsY`SIcQD8VeKoW2p55{)yc$%J!<&7aaRlGUNYf{eJYEbI{)fx;y14*<kJ9
zW}%<Dh}d*%$E%My^i4J?tj<*DkY`&vHvZjnqoAq`7g9Ed=ZxQ>l?_$>1tRIPW1R%Q
z{jwRS);M$eo!{M>6SckL4pkm3AW!c_`|%9E#JV*nA}*<1qfUff;#{LoaF^7sTaJE7
z+scjs#;EzrDi~wT{AE(QguegPk+MD~VaEV(%<rTp<*eT^z_ZVxm!r_9|0;$1KT>3q
zs#ag at Bb%HH3r~S`D}&Ohe30$}l}@t4t~WY_ru%#3lU7(e)*tco7q|*-&WP<TLL4L|
zgZxgm>OMJFh~;!O68`q96*6bsotl^L8Sfnp$!_``$(j|;6Cs(bNG40xplll+Qe;c?
z^1q95ch2iO5<Txb1aAcNDSj6QeID)6ry_Bg6ak5eY=<2!qazaPClHX7&>V!GLrCA%
z&)V_)di1Ko_D17~=}z=SLz<KGRe=d;r_bikEh7i95}N;-+0K%?T8JuNB@?<fnqN~e
zmkY&UkCDdgESSrLVk(0%ZxqbsLov=^%<BbnwMtBtQOUElU at l>TbR|}ac?B_SC<bFZ
z=x#v_7mCp;F>4W{4aM-DNZ_nN3{PVa-W*ENdsK+k=c_!yvUe2B6++y&f-xHl=IWIg
zD*u~~e3j(!gyFB`;jsFf*Q}=+k%q`@bF!kRRKLrgds>Y?@ual>EHBd)TWF0L^@T-`
zuz|cUJtFP2wqIC7N7?6}$%!glB2=cjxOj={w at A{s8P}ma6&atOLc;cIoTrNClCV{0
zDw=3+&OpZ3TSB3nU3-cbN?}{w&dG0nYMV~9wuOO3yH?aUI)9XBeWBX at rnh@jVkJ8b
z{i^J8tvDK%om<6b=iU&pYP+}7IP>03|4_LiysVV8DRC4357jP&%UkFu_52)vW7Bhm
ziOgV(s;q0WC5uSHsFia}{E_hPS-U2?CY#3)f*2D<P9>&dkXvtpo)2A?8SgBNMM*TL
z4XYk^>eadHQ{Aao=dMr1LQmh5AN_2iswX#a|4+G7dvl|Y;`E`ihyEXP5ADspLniyf
zEkitETrAOHrpCnMm(GV}g3&?13{uT)Ckd7qU%*CU0)iTI1U{Tto*`U!O!<r4UnE^T
zLlVqHPa0Nzs0%DV7-<}D`<u+j>A|{ZFn{!)w6=G4aB&iETPO+nyo=b55_PM?@!~Q)
zQvP!)>P(z_ at +BtUpeM&Pws?ujuap99j>2lT&7D!vNOQD0yg!{jcviLQW3Ou3T%ta`
z|BT99NzP;LrdGTiuaN|-YoiJ)&(pd47uRqRk6A1oYXvUuiZtEPnCofdRfxg-t=zFs
zFzW(=?i)-*&^CBvm9_oyTgLJ8SDX0=93GI>%_(h+$xy0A+^RMQjiqszsq1ZX?U?_W
zK})Mw@~sZ#)A!^<EAaH@)6;wk-gDREv6y?$Uj^#=Hl<9<3!WI)7_3VJ7G7J at ozoq&
zYm945F;N9Df2i0s#u)YRmy}9Xj%P4(W%ZO8qLNi?;0P`6+LC0<m?HF$C){gP!ijZ`
z<`f^ZcCgP;NVr6bUk528cLgQ4Fg_v}^jbk5o<M0+4FuD?QLZt8gJ}1jz$b5B?B&e`
z-W2Uck{+I9b+LgYA|HW1cuIv at hu;AE9qHCvQeuu)S-bD6N86w)w$LvZ`sM3k=RGS$
zj(V43 at y)pPnB_9{daV0yHu3Lk_rA54=H~ahdayCq7zR6GFjK$LL`uUOUTwG;zuJbk
z8uZX1-{5jBvcz=9Pz&#lHYX6G==doM&ch%yT8^={`)gcJSzsMOoL!@-*7JERd33NH
z2DTFm$=H2s_N7sc?t2}z5gklvh({UrhII|`SotL(9N(}m#7%<2&H9D`3Ktu}FVB?_
z87o1vjqrr7iNX7LnM3)-;64@<_=YtNgOq%m8*aq69n#R>B>dh4I#R<{%mmu~QxsXX
z4X<`3;%jn4tWw4rB~74d^O4r82k4^&`cP6w(OCLr4Rnlw3|N~>$@v7!dTlV2MVeIB
zz~!H<fnQ#<q~29$dDx?}Xyf5M(2lSq))Dhq5?Q`{-`a+Cf8DV6)rQS`cQm}V_sxdg
zd+QqZ?ETxm{a7z>4F~@Ei7TA0nRbQKb=U)&u#*2kCJ15V^<<(pV~Y80q=0vjy{q at d
zSdzj5Hhy)W`(6|Ojdt(qz0s)Sti7w~uS43q$~6i)&_PCS*C<*yRXG@|Kathc#;{&2
zkp#53&{xDf`emH?@HZBco at OHvJuPnji2;@&m+dwKTS;x+l4kiTm_K5k%@FfIFit%~
zX)PJ>Hr?orwhWul2ft6+4MFQR6OO~GM at 3gW>vv!lrNK;DRmC;+w8v0;Rk+cor(Iwy
zNfNA#db1)(_f21M7Jd-%sx16K*rLxtsVe1XwK3PXX$xr~-7iucrGHZT8GI={n5?Gl
zTPcT6PxCQ0ekECZ)0do?mp}5V%zXI(fs`KzmO%TqHl|Onv8bm77aML;w58BrbOi&B
z^iU6pb`XQs9UbI?@=6{=xxqS7k$=*7OX{2!#GB!7$`8?4Wzj2fVo#jK9^P%6OPmzn
z%&W|jr3VvVi>`cGGKdqj#@Gx|Ej<{P)X`6(m#MQEIKvelBe^R)GQCnnaulNrZLG^3
z)YTQd0>f|Oxvs at 4z79{3GUM$d;G)51&>iXF4BuMn2fo6U%6NsVm;f|4o93nZRiR(*
zsbf{|NK$N2u;%n)^{HjmW4}x5u|BkH*I<Qc(YjLEVE6Diq5VxW>p!w7J?SwU&xr2X
zG~P67b7Wx_!>!6a+yNY+m at oJ3_3WjdHvQiH`%IRk&wJZxi+1n+z0)v<pgtgG?=g2W
zezo<<d#9nt=Jy^8+C<ZhpiBLKX;n9P=*R+Vy)t5$3_ at tUrQAhQZ<G#mhVRfXsa#Rm
zWzg=z{sd9e8O{5l5yMHYj3B_{U7t$1rcv%lb5c^^Q;qAR?uQC^4?G6JPz%{L(G>?g
zwTWa$Hifw&(UZ^_Ea%nqhBdn)Q3~%;1 at VSbyoh2fR145c11}WTkX;eImj2g}EFr7&
zG3JpNUzQgbO0KcJAYOzk*g`|vNN#2FNfueFqx&;gMxL|qST53fRkVlpIp9SQFb+nx
zGFLEyDbza9ie150EJs3TlYW~Yim8m{N;~M`rN=_(Xx4*4IqbDZZ4XAV0W%Q;>BUlM
zuV8T*zlX(TT)|R><_DH1JTYyIZ7#G_Z!+Zd&a+f~S__xjL$NOowGA#c$eSE0)5lmc
zFkYjzbT1D|AS-1;zg*CAB`qx1T<3r_YWE(Xk_R!`n00H{n)>FUY0xHSNR;bVhSu at g
z at dAHQo3AHQtHW{|p>q+{VH;<_SZP4L<()R2jVm0=j&{kGBu`9m?6T<9E#3F+GP}%Z
zHvzPUSzf)MzZl+wQ8<)~cFEoMV(xr3-Zrl;7|)bkl|ONpIb;LVl@?K9i9uO(9&>|I
zR{vc(mo79{oaLRs#ezG&j;zf%oeb_0+2pIa3lpxQzSzrOoz7%kl^)+)di?dJgI3?t
z7w at 7oB~`hjK|tFQ8a()l=k(GL3(=A8{_#W_Lj94jW~DtF at 18ypt0Y@jhGirn@*~Zu
z=9s|I9QC#r{oCQYD}rCxuK0ylTRYyq6*GqE9Iw(;7~=6a_=Ww*DUE7LBd1t9Tt^Yt
zXMgjGZxwAl=v(dI$G3{Qghy2mk7_bJsp0j>^!G^Uw+X)?A9VY#^Dv at Mfh3AoS9Z8(
z3&}($7 at Yk=p50Exj|{IltV8KjP5e>q-eY^GnfT+OU(9BXWsZecIU8PO^tvYg1Y&52
z`tMEr5BO5j$`r4%w%4m1rubXK;5%;r^#<eM=eS0#kv;xH6K7<*@;q#_0lo|&xEg1$
zuaR8>9oS`$#f3Hb>uS5LlB~0pu!FJ_2D0_T+>=9?^C}vFTUa<>e<>6r<9nLl<F_mM
zTP$_R|E{dFxrp0V$!2FKY-Q_*yR9MY0~IGRAG9M+cHxrSE^sO2C0iVu5lTIS_zc9o
z-1CjJF^Eg{w}97J$qtJc7EEJxHXdGsj_i2wT!}K*l~-Dx at nBnS6C1)9;~e77RrqBK
z=MT6<`NKH!E at oF@A&dvD9k*Q!g(ZZ~_tk-_z*fm*+e#SQ)jD7gP at 1=$D4ZW1(g6#;
zZ#xPdkRUBp2ELo%FM0!T4`5*^-i-M7{Zf_rkQ(bvjrnD)r3G0Kcp=<WVvnS|O*!f2
zmp3$Eg&XFX1glU}OBWWlXyu0ss~NqVVb=QyEI+?F6})QT*H5MX{FZR)#}9m7|Gj&n
zCCL}+PY{Q_X~vE<Q;PSdU|XTBrZ?}P|65+l1Lfsjc%Eo}g_oqRREs`_^wLVaLQAl}
z%GH1Ldz|<^T|+I9B9v3F8sttc#yp<3Bf-9rtKUz*r2zd#A9zE3vfo39UoY70;ifoU
zWaC3?!>f``ho335_^{*O4o_*AL<FCa+)0dNYhht at L<IgP@=5snTY7XTr<(P|M>Quu
z+{?4Rm*<J5I4)9%4Ws)bS8EX3^<X#T6FTovYNJa}bzlLtUP^jZBKm;2T;%^C2Lm}=
z_!p9ck8HflG*^o{=Od-l9 at J)ty3(TswcN{RpL+VAb=ym2Xpl!A>BA%ReD6Yu>E*Fx
z3s-;YI$gVrQKcgGXqxbA#qS~f-U&?;XqudgLCoQ^H{-j!pna9+RLq$)taDX|v~ImI
z>A6qo%F|7}{bAt)Hk;grtz~YL0R0L4N at X=maS)%oigoJ+M$igGlR$SOK=laS2QuD0
zwOM9+yhG}XnPXpYHm8CEbA1y2PV_l)?v~uf$EP-z%YRJ{`j9m7?_=FkYLe68bxb!#
zO+5xL<lv<SIlLKrf>Xb3*3<nW8e at F?;ctLrFpjwQGh@`Wx7Mu at V##e))~$!DzT7fU
zXpL<@6?2v|j(caTms at 2p4t!^;G3wsGpYj+-zq9phgfvms!*7&nOuDy8(!etz8Sl1b
zNE+kddk=wPQ*)|c%2E6DboU6moI^P~D}d*iz>5bTxmqqwwp84lS~bQKVI1FAUQJ$e
zO1_G)*Toko@!WOs^Obn*b at 7rC&tDf`t;FlEi{Gil3)jWFn^QJ?c<@>-o2cx5rqy8_
zJoStEq at YHpWx11DndamkUCUgv!P at TA<vji~YGdjb at K3Cun22K=Rw93{C6N$^V9Szi
zZdHARTSaTt{rwb<U<UuQ&*z}^8LHuLyb*{yeN~)adiWyKoNie{h-D7u0Cw!SC)gIs
zw(5u0-RWj*Ya}LHogU#1b32SPq2+W?*7i^g8|2mWhO?T}q(=&?^*{O>DNh`6P at fFO
zeMdY_1cYLOGXWZdT>%ZPH%TAlF3gNo$JH?<bgtRAX2YQQYhn&4TBLTV&xw+FXeJQY
z551TmCGM?YAM_4blNlB?IcJN{T&U%u;9G at 1<Hd6}PJ&Nlq#M4_C@){A4eLqqhf>}^
zN|;wgeWjUWU7pPqo1+V}>*BFj8(lEU$=$(tu!n at xSokKRoZ8wWlrrI+;W!l##L-=Y
z!}sFE)=mxb;fx0j&=K^Z+=;d3Ez2ZL-9)s8SLx2y$YX6PSzkT6wY)2<RzN#>b+ZHh
z=&(?J)IrX8`1)gIm)oH13dX`$t?UVCQ}18|vU!riWstX_JWs+yB at IJ3!d5~er7&7r
zew|X<t3H+N`K8?1LqCJ^C+YDwl~N at JZC0%u3XQ5=vE`tWJNeCrl-#AQs$a^hZx8V{
z<{H_uA=}3kA1fv*S<zM4#_LKFdP~afEonrlRmnT~s=Vgw@`}BAt$p&|spK8jro!2X
z$<^b2DTgK>Fpek{^J7U2=IS#-oagnS7pz}f?SW8DPpv%^3QgPc$+|VQhp9wsr&7w9
zejmI@)V`egzm!uN&aggpThJrFam2$q1^<Vuq<E0#=!0($;sZOfZlZ#Jq>bu#T&RqB
zbSK+pr#sqaeceR#qL4(vYd|gPotoD25N645VCI5fXwlh7&mstMsZ47*P9mb8S~@5v
z%4e2MXpvekhtX!E9NvZVgqyze at As=)opcoNt-vY`BSY!rLamza2F&z at V=r@(G0JYM
zz({1b8KagC#u$SBh+<hgM(^{jFb<w^A~Ws2d9toswvBq>%&I)+Y-es}!hH|o)XKls
z<=OZ^%SNUm%gMM?>L<AFZ*{nnTgzNiTg%<4t+H!&>oT{#b-9c2y?CWx)0SQcH{NZx
zUDDEV3!^PcM1R`b?`fNi<L&nt at 5XpMv-Hkp#P^Jh+B4qUuHtB_!cnes`_&v(H&TvV
zkJL{9Hx6)9=1yrX2X`{KSq5&F(=xBn4ach5Zo8;;zuvdB at I2agp}$%d97km>^mkSN
z7OwPor8yrBgdBOwXqS!}>FsaBE4(_?&SyC at eH}ghZg at rZ=nA$u)!Kfp(->1K7{{09
zZu-bLp>zUf1IIy!N<Kw?%PFlb3uGvLc(457b<JtlaBzn9r{gB9Gyd!!_e8_{KX=$F
zUkLm=87H at L9dpjAS7}bOQ`*RnbdT|gNttT#gQnr|qz^+m{N`L^QYoMFxX%nvp)os-
zXfwyYy2>n&dGthxkX!joRdr6<tE+Mb`veK+Tt<Xn$%Py_G>7>pc^iJxqr_eJciX{$
zFXz8LvtBI`_?b&kd;F=lQTn5WBrS6DFi6W2q-BT2Yo$-U4<O9giU8z=qo*UzL`fRS
zqvx at G!!(A~2$Bc3b at cS`v%lyk5>hBUGVq}`vfxZqp)fbQP?#52D5l*Jq?tWAUh5rG
zC at c;y6qdvmiVH`&Q!3_pF~0cBly~<;+a8Itc4WNijie#>#GVxFcz0y{Dn05=pps$7
zEjD`y(b66EQeLZ<n8TO6TDNNRBUDe6>xy}{zYqp at C@QHYJ>mIk5<m%NV{(Vy+EG2{
z-^pi&h0Y0K$1m6_(Qon6<mMFbAhdNJr?sll8vp5JPwCIbDS4xo9=CRC|3o=J%5f)V
zluM6e<y!3oAJ0|OlS8FE-H-jlrgK`<v3!olXgoXTgP(qI=w)oSI860PK8IN%4+!t>
zw4XYB=5}FmBJ<D%$D*@irF2Uchf`$B;Xz^+b-j<(z)X~s$2$T6SSnXP!K>y_51X|0
zN#kN9GLDh-e|m67xX-bN**tihi6`R(USIJjZwPef*#keo`o6Ycu24WU1b)!~?Q^`J
z_)ki^WzG1gsm+zAdgce=9nx~?;pVKI!9V?A(IbaJ!@%$0n#6<8%ANLKH^b6qeqn%q
z@?v9O2(0_5KB<te3*#_)Z+g;+-eerknvKKQ7|RfDM{cX5u5t5>aic28xU33&#dbcI
zgjd|<ZIN&8%TxDblq2k(Vcf-BIIP)_6ZMlBdfXs;a-RR`2k3u;6W-2`G7Igl5vY+o
zm#J`QT|bxXob6(q6EPdf58;%9vwNJmE^~FPHx_BLg%ru|TH{PsuyR9KbX>Z}$zV1g
zg?hTD;<)#7i<S^umS&!NB2AM$&Sdw*`jnigGwZ-dmAS-2a<(X(RDqMS{Ws;!l?J01
z$aCeo3Fa%DGuIm?j6qpnI&+;9oj7q4fdBM4V1wQi7h7?JT1M#<?{}e+<|`#l36_KP
zIHU9t>A^WggdX$Hlq<dZ$j^O_3(S?iFG4^sd{wU&fq6IPv+#dUZFUG(`sIiv*Usi5
z>aL5q9>>$1lC!07iS(20U1H<rN$St|3ZHGAq|aL%=(@V(ND(EUnzDmLbC~PZ!zU?4
z at 4DSJcGoz!#`WY%X4f4w-kpx6D67vRL at y9VPvG<3Q=dd}eGb=HUm3N-O%cBGKAeBk
zoaL@@jXDZ{X5W54qN6#*o$eaNm1D=W#<k~|dzmC0l^EfdF`6^AuBQZzo~$x-TU=uV
zo)g^LT{qV!xiWkXT7tW1`>-oojMQ&m(41vENEq)a*xps8L}Fb6>)SHfne#kWaWkhj
zXOG#$W>4J2_Q_va(b$|;I6tk8`co9!)zH!A;bUe#aCz&1D&~~_OtjJT`3_-pG<Ws7
zD$>=Q+S}_y+2SyUN7?!*e`A}`L%@D+1k_W{S7s5$@|I;7S7w~}cz|ho>Ov}u%u2=X
zWj&*8q-Xmh%~=(gW!zV^q3)EY;^bLY_MB=tdm6myLE%BU1^NH=@c?03we%bL&-Lb?
zc};%!0gyi*`7wKFV!Z@(j)RK*dMdj3UMe%LqVoMU+AW36xcu`R$rs8m%9ob4miZjm
zgMH5$=-gI^(_fDswzi)|4^WzmUjZ%fpNe+jeGINO&d*<F56-zN#GJ>^Ka~@8{*m~<
z(eZBB3$5s}@cSI?eTS7fJ<{o4ZHcc*Y*!r4{8^;1Hk<(-_QzID*I?%mnum8uq&9rZ
zOZa7RIywR)8cq at qdq4`u-#JSDL5bxO`)i35#$zO at vtXq#8)<u6HOqwR+a*t8IbrK8
za7Ht29D2*y at qbb{c(WDZ>QPb)%^gZtOJSkZO&2slPn#~E#$Y~5oZsJ}!b*o={*Mjd
zTH}<p%<vEnynn+6`5YmcAC$t|m at OYzJBIq3;&VpObqR5~{+?e+0`8RU16*INOg)t{
zrH$b$7|a_lh}f%@hEbk|`lwVx+npL^ttD@^T))=B8Ywsz*J3WN at S?qLt<{Ue_u|CX
z(px9kZPH?`B?Q-O!Q6?px-Bnbt!3$1YYiLJs;M3&V~+X%m$jB1Yb~X;;96_wk3Nmu
z(!SiO3C+^~x3$)CC3k48HS}PsrhR$!s8HVDT5HjDBxJJ>p;j at pmdX~Yr}<Z{2Q13U
zA-8=wuyPa)3{T{7Zg%kb`70Tm8-Dk!3fArREvF}ze!fxZFEl+Pvu;t&`1A97`wZ+!
z)0xWo`LHpJotPcWYl^};LhI9 at wQN+r)xq_|y7#Q at EuZ_)sutw?f9M*wIj8n{%!V-f
z(G^t1OllWHehAswOoY!kJzHA45^J+)YoVtkhx{9*5a*Dt`+du6otwjPpYW7lPsg!x
z>BIXepMNX7(r at dQP><2oy`63+W);8TMbf>mcyq4vBI!;j at z;5gbQhKQ>%2%&yb^z%
z7bz+OUZL7+y+ToR#6qt|{W08JhwW-!qvnM?Uj47`v!be at XUNK_98=|V?iNQu&*~tm
zp*dCYg<az}iTVLM(9n{SD~qAIN|@=v5k8v32!D;1qO+)$K#B8QLn#{P4*F2aS18R0
zQ7ZinO1naowAWEOeifyA6-xJoC|$gsQj9)CiNBUo3_O5+c)Cium_^r93QC9CxJIur
z at aXlSQ*gzSVvfL1N$ZKu&Fma+E8(!Z#3;U8Dh`dp^n3=XIMAGyH#cw*c&yFN#$zui
z^?$+x%}EZN^2|(l!6|zx3_18UZY!N^e4=!UHE>~3Xk5mv!55s^#nV}aqWoBm-ObcD
zy29UF;fi>3C0c47#-}`tS{CI#32s;@tu6+CCl?a6E<}Yxt7L;Macvvo8a=u`_D1<1
zO8a8kvX#;}P|O33+$OcP{m1>v7#R3vaA9Q_Cld0J;;qesw-%OYobcTGkhUnDdDQ#-
z+<Kg|>gxriDVWPBDbd%ZY!0Q|a9v76DCH*bdu3)sseRK-XScU16w|NGM^8yADVf*i
zV-jh;%Refqw|b^rO_dqboHCEy$wJqXZ8k%EE9f0K*H{zLMS8|S6XPZO#c-^+7aH#=
zUF5D=Teo4pIu0j-XO%7<pH%v^Ym8b&)DyM3NNDVt at iC=KT#HS-GZL%7XI<}Btu~G<
zT}tQEK1XYLoBZD25 at MvDnH*$d@|)AWYOJ<M-s~4XQ8>)Gj{l<y|EDw6Z5*s(V5Yj&
zU!R1(mvPc4s#H>_mtCn3#)tJmDf|M at V@>_X=5%15Lq5#&N}pDC2%b^$E%B8h=2>4k
z{suXe`_RY-jfJ4G2s9SMgA8B2Ei0V3Qy^E2>jCUJ at w*<F$C_E+i&T5Q74z76tZ(@|
z$mVl~EGo_TLg`(;FzDq at UpW3+=@?Ne`n33Kf&VDA8Fx5vKbF*CwY&7DR;?7)oQ&Ow
zBXl-8wMF^+tyiZ|Fe?-$Diln}n?h5UCM$oF at b~xfe-|o4TXzFJBlkppW?J5>vO(aT
zy6)&I)wNc{E}>S`cXtFQdrLS5XP9D2!*S~FNqD|#I08G1PjOj at pHLdf85jojtmAkG
z1N}tdCNEucMJuf?&)WXOjrht{*5>yhGzD#V4}SA7xBM(8s&!B{;aEDZV$P(cW2=+N
z8F79dJiqWs(6CR)j^$W7-sU`i-YyH4O01CANdy}B%r=`N*>MtkD)&q*zK^a<c7{Lb
zlNl$AQJv=qrAu>47VlX|27LtO3-uC;R{n74idL%bQuIPkG!JkkREfoS)~tK-t{KSH
zq~xW0MIXbzkF&t#t25P`x5Bm}@at+a<lqadiLZdies)s<PqfB?pWT$1Q0|2975<7@
zIH%33L20}<qJZeN#)!{u0{&sI3V%<5t^^N0ZV^?VZw6Hr4gHsfSQ<J<Luwl8prJsN
zF{=0u0aVs%n>3jT)g1!iG`P2<+|@?UxPacYJIzhGK<>qP`^RMtJ1kGazVNpuvSww~
zNP%HEW5nS%>8xjcfsETg>oaO_o|2Djg5R(w|Jh$@4&(+6rylv)!*8zQsu-Fx6FDlB
ze30qM8pcEtBRvDI%^NJeV(9PX#hJ>OBHW$9?I?!coofAX74sk=iX0NXD=<M0!)+~i
ze6e#R8E4KP`LWK(zEg8F+>hF|CCi$sN90`0EO0jyF;w$}WKrE_s>@da<J%^l*1 at 4D
znT1CufKd;($Z;F)7nwyJI=vAxZX{lll1^L8>VMHaEbO#6s7J8Km|3*G8fQkLGK=0W
z#cwzyEv8xqzjngVbx+YONds at d#ASNqQMZ;!r!JJ&Z*xp~qcVP*gnL~@^p^Z|<tDt&
zIAUsrJ4qVWob1u~Xj-n!`ade1&ndUqs?U4-70zda;d5SH;e1sv{9mu8aK4(J4S*#m
z`O?q>miw4iR+ at Z4<=!UkhF_N8j*99+IX%PP>S!wqou)^R%U05LA3cXIbM)5H_WRpd
zgy8?)o{#mFS_$3L#vu-;Ubf%arbZkMO+w6Y%vZwDYahh-c*N6hb%7zwhwriYHdypp
zd~37uJ;Gm(R-(eqqS10=PEq;GID6g?J5$5yjlb2Ah(YTqUxl+KXb;r(aVCfMhT1wc
z?H}ML#Yi9W6wSjdIi`THJI%cMgth&vcVQ=KIO#K#xzj&MI%yo7Kf-~&^sPad3k=Q=
zh1}?;9!|aTZQ+w}st at 0z6i=6W^E%}<gAm<*TR?Y39n=1zJVf@$+gr<hPH-Giz{|4n
z`TY3S6_=LPO_D59v9$ab$1lrKpB!5Ky5=FEn4yFWsQZt%9y>kf4Bi(g-H4vBn$}X=
zOj+>i4u{LLbH=veRe{oFNRc5QY*AuivkbMac~Lm$vx!<0&I5(Z at McW=6dJHgux#k%
zA0Ccc<ec@?%I0O5?HtwCKRttJ-nl<3;UI?WV^%c+XW)iC$kG1eqo19-qCL$(NO^<z
zd)R2M)I!rQeVdu^Hco)8Z*LryGk$k9xN=H3&!AoCNFhX$vA4<N6iv2(e&0=`Q&o)A
z=!wI5<S?4Y+Hqt%{gsB9_(2OPzMx`&SH*bG`y2C0Ov}(_E*@mDYg$eCoOgCt!<RJ%
zIle8_MxoclFNwqaioG9jC+<dHE+nzPP>Qq!P=CsEo?_9LDbD<e69wvmcE^eAurjvi
zEXO%Q$W8{!H^2cvKbDYWz-Yj7fCwl6%m?gHfkWWC@$h92+{y*NDK3rMgx}qOeSo6?
zKR}0kg8&(TDF8d*DS!+xMio8V*N(JV*7h%pXe at yQ*wI9Y`pAo(MbFuao2s<uY&G^f
z+)AZ9q>)GDB&`1yo`OBFqnWT at q?}@=TnIcNN1;dlmRivIi*h4Yj_7MpUm7w}3R7Y)
zZJl~L?aYv%R?5z0_m^?P<$cl|qtT_0%c8w{i&stixb-bE&VcK~6nZrNJ5ZY-tCSQi
zZnLUssEhNSSH^;G3x{HKf&JyEC;eT{g%!?1-<yIwX_*PA>pKzSH0h;<gdwuPQM)k4
zyf8}PiN2l at YEjx+Yx{{7<bppIPcJCikXcANx%WF)R^fXB&a;PMlvz|85!8;t*-1H)
z@=I}RghKuSIt%}%Cby8kOhaGPu&9aSeM<WRrM-!i!@bl6Sq<vgMF^FiE8|5LMtfap
zVaRp47fX=C at qMZHJ6Ddt_ka85qPnEDsAvnXMv|8)_Y|WxlGY#E3Ut{^LFfV><Vf##
zZWs8#*5)-*cTqm}UQg*tNt8kjQ<dJ7--UOo$ZNe6&0Un|S9`xFby1#Q>HW5J;cXc5
zQZMZo#TJ93cxz2~)vcbJyYQkDS=y5Wd*|9NybD8~>=P5-6^)qrePSZIVh}T{PmCh}
zs?;j0aUk at g)F94ezT&}cOr;(ZpNOx4Z_FR7=<Yj=foZ7alep8(2LjE>Q`pNFx>Vk=
z#$>dQg!Lz#$;O$}&Z4EX027{=b)RHTTIXy|qwT3lk)n$6;Kh_)>&Cs63ybmI&rvF2
zQ)I9W(UxW$T$I&pK*~q5&Z|~ZwQ_Gh#J@*tZj~X(c_ZG8x?D?JB+c7w at L(P?HLZtB
ze<OIi*cf#%f$|B;&t{HYuk>2hjzio0jfEr%E0tK-bWv6?zrWG1mps9-U&C7Zd!}Jr
zdCbX>lGswraLyYS9REQ|N4t8uIa!XN_v3fHf?orESAWhS9`{j^8|P2qY1G$5)#Ond
zgVZ`>#HCu?@+TaT4jYp%)vo0QhUIV;_AsT}HPG1aQf+hc!6-`Atd9wRV)WKMly=n`
zgtb_c6Jx)wJb27i#)z&wdj8WB3Uy(X9eACN%t4;EZ_jzW`T$Xpu_OiW;0!KuTHD+F
znAf8u+_4^m5(rsIXK8*RXUlF8BaFwkGf<(!E>%@l_a7TaVQfqE#1#@%;+2-GE5a-S
zGZPj3SJI2J%i8|0tzN9=7f4?0p)PQEHNaKl1s|iA^{ATl-UvZ86umfkTh`<4hq-t=
z;wO#^1cZfBKis#T&*8)Z^}W;Hvh4}uoZ~-WcKpEUv`qEx$Kjh at 9PBThgR=WCV}ku<
z1i69X*erGj(|5F^Qn{%_&on3JjHu2tj-2Y0Q{@P2N6klcwp=aH9<RC(mf at _4tC@xw
zHR{9|aU`QAR+&ZLVq}kGoaW9Bl~bMQMUd|e8WWs7AHkfVTA;J%YC)lZJaqO9O{Z3f
zz+Lm(xL&PdFa3^WfU_lZPJJW;Wn$G<+^;E-wiYAOC`I(@<Ez^<Cso5sgL!mPaX*D$
zoCleH9(kWdUYbWkd)w*<(2lG6P+p4EAl`FSd(Fv|TTo7^cC_q2o3gTT6K2>)V5`Ov
z#klKSGY)*DAjXh0qAJ at svN#5~NJYvBIs#Sql=>W{(VUFZteZ;Y2(-3feyr+)^fxVc
zCa?4u2ZGvyBL+p!5BOa)mvMY?zf+CI<RgZ&16MXWCn8-b;dQ@~${sObrw<%}CzK7k
zG1iXP&j(BQ#!BgO1ok33UjLDDx>BR)jOOvsa!|tfX+Ozo$l9Kn292fA{;B!_Kp|bX
z7WY%|DRtI6Ii#7=kY*NFXMdiKus~(s^dyxE<?QK^NYPkC&SFqo3~N~mNtPZlcvGsF
zO?4|Z3eUJ%Y8(#TsjIX7E;&L<r<6crHRbh`=d99O_HsjO8=O#V8U3B_vZ5b at GyT=&
z(3=7Bz{`52eMJ{r+r5MQuC>IUn_0Ab8Rb56{qFh3!NmjRNW}_LPP1n*N*AYNq)iNH
zFvj4`6m=Y8u1e|dNzuT5Oeom{sb`)}#i at m7jL%O$A8c7KE$L}l^sKFxWD+~6A&Tvt
zLzy?py5=F+twA5R?O9p^Y}J8re{gYn(B>4JDD;EWZf2s^Z^D_%yNj{MP5t=ANfsM=
zgK00}j6%%@f1_f(*rf*@$m7)0UXs<bEIb_dq5n2W;fHa?)2)|dXsOnYowxfNmG9^t
zE?%qgH+IqT2lm8l8-X3jqH6U0)j!jCSVSA7eGzfzFq7?_;l#vR+mAm%`+J?nPps{~
zuvo*=89hsVRTbzRu#Uq1Bz>pm_O0{g>}0L&U$2)Wc+yJY^L!q?4QtCPBd!5h75ovW
z8)Hf(_e7H+KeABIXmO5Rl5tzu7I~P(NTt_fKG^E#cu88Dos-adIdg0q)=s5=RD5Cn
z9$y&Ndu7UQE)(ok*#q!kJx{%0ZJdX`TNav~#hwfGx^{TF{+Kzb)t@<|^|H17pDh;Z
z&DFC+IrWPZ$;t_9<rgQeHSm0~IHg?XH^?4|-oTqDYkzTA+rKC9gG55AhaqDMB$*HI
z*CYPzbbT^&8`kUZG>!aZ0`58BmUP23o82K|m9B3%W+orm-03DBcfxpvU&S<ap)JHH
zRH&b6zFR|ILPF>fOPF&1f!-4n=shv>0Nk|3UCslzBj)Y*d2En2;=}0;?1ufyJ4ph5
zr@@DVl8j5=d55l^X1+}CJDl2zTOj(&n5}<xM1U7XxW%p&MmZ8zHReQ}i_azls62x*
z(^~O1j%T`!*9n5&X|JC{V{Al+;}}|deG9x5xm`mm at cs-&;M-6uxqcV?H8&z2H{X#j
zHWDe4z1~h^Y=%fqFyLX-Q}pYqd;-Q{yVPQQr*!j_*Wgu)D&6Wpe`aaG3L~a;YrNVa
zeXirw4(hYqqMW(eg1B<@qd&>4G~C*;<)4b>^RWDQxxY{;#R(n~Cuq_+;5ihXZicM)
zg4(OtZOymX at h;pK0*Nnjl-d3zrCQz-;-uZScV*7;ciRr!pT}t(VJ^#=;^t{#5hR{x
z%9Iia%SuCVA0}8HzRc3|#M$D;O*$^JsXxj{MH!o5^{=jEz9(lcx+783Tz#aOFoL!H
z+Y~pw9fxo4zbzz-1YT6A+nF+Vv at nCj0hg_h&dU${&C5!MEW2=WcY{F8b<dM2`^oLn
z5R<AzYr#r$>c<*w{h$C&_Jfy~>;2f5K##KBgY{)<z2AZtog7x2^yS>}Xa)KD60i96
z@?{5KVG3ViLB5*5aEB>;g at G?vTHr<RNQ)Y`w{MGAGiCIZsvU!Z at w5a=KfZ`5qa`@3
zeafi$AIo^XPZ?CFRBCtvA#ns9WlA^01J(lHO^e at de7Sf^rg~#PoDEx$S+sG+l)0oB
z{a5?R{fL=mTST;u^krq3_L1-PXQts51r;fhSc20 at 8|w1xWb$PdUT68rA$W3Y_GM1m
z$k$}E3528b19(k1cqCM|G!mIJeq&y9n#1MEWYyUH>X);AV?OPvH_qVH1Z{=wVABXE
zji{JdX~GLN)4YRS&(e`Ho3AD{*_mk at vHw?ddqtx#m-OEt@!){}7#2IYcnW&tdtDd@
zmydbbP~r2wjguAaCm-;FEA|*Iq4h(YuK%Q2k5|Cj|GSxvwyhsRZer~?_&VmZ0!Jh-
zG=me?l9$dv at xlgfh$-<N?6hcUI_gVFm+4=R;z26fmhl-qsYK5sEkj!=b0(Yh0be&}
z6&Uv(uS&ugGdTZgtjZstz9QgJ9NOa`$Ml8hzshiK-+(@orpPB$IYn)W%38%n-;*>1
z{Zxo6oX=P>x3 at J-rv6Tv$74bXk4c)G!RsHRqiWFut2odtGuxlXO!UM?%rrt?Rq$7K
ziamoj0Zy#KOKa)?y(84qFPB@}|1rt?AF8AEHZ!5T at 5eg_L5W}`GpEmWrbrUb3TO&O
zIeutP17CrFjKA&Y;XlQ$9r`N{Z)xV+33u>*IUKvtBQWp2j5}4+IhBf-OBlQ$rzi0U
zE2#ryZ5LJ=%Vyc;>Im&`aW^%3)ydD5nI=a1C+XWY at FYNrZ_Hl2NlEGBDLdeK@J?v(
zD>LC9&P1{zyQ6c|_fT&!ont;ueYUiW at 6J&UdSeaE$yft{N;xTp3BwnwaPr-8zY8yb
z#=~0)f8?_MnV{r}$|<^s!^yn9FMVP>eM7ITTu at HeV5Jm7Dblw=u`1H$sB5s7x4=o?
ztm)MUAsP?7 at 6$h|-bQOjrLnKJs%}8LdOXD86ADG#C-|<i58qEv4a(phT4WU4#4qN!
z?cXg?WL!#dsfKaKY&!h=y&C>*eo(`5t=Z0)Yzr$0eP=F%YPs>V9xXp5Vg3`;^4Dwn
zYB?j)gI2Tp#}IFS=;h7ShqpgazOLw08`LS~ZMfeBS<|Vu6ir~EX5!tEhsHubE96GH
zqLMrz+6#K?E4~ly1q$sU7|lk(K2ii#mNuX8q?oTH-IH+_3NNa1q+UgJ at a+Y(i)`i1
zJuQP<d8?=RCCL-|#*A%s8Py%yZ(2|7gi3z2N2+hX=u`5eO3AP=n;s?OrWfvIC%dL%
z9>VOJN;UuOUr~pG!%%al<dIJ06TA*4RQ=I`dH(K9&oFv64!swP*{n7q1s?l>@S-P~
zvsmIq`{lTu2fXo!;dXw68xr%G=$-p(SnRuCq#}Z8l*HggxGb!^S!qFS$J+U|o%FOB
z(&iZ>cD{@gzMs$@2cyTu;P=S6_+~KAn&}xxdyKZ3bX|_wPJ%2^YiU?tzYU`lZWh5e
zJifFV^H@#6G{+AZwQlia26a(_SC+wftd7P%7-JUfbQA0&#VmLY{ncb2{KCfZ`F0<J
z7pz81m9a}VB7YXXQ0o{o9Ln4w%JxyS9`D2jUprinJ*5N9dU(kyKc8m&;NG{4 at 7(*B
z%%awc3cPK2x=EP({=gi3;r7yQ+`9NP!Ei))DSktp055LN;8r=CRBNeETB3KP at Qd@a
zxSJ!8RGL~!Q{6XHdK|`_swB*RX#652emEUHdgC6Waah$SB0VpgY=Ylc@$<){hkde!
z&a-0tErm<io}GJj&idB3yzs8K?)HqKUf`P{%ly%}!;+Yp;PS|%FtLuF?tH3N>u<sD
zleJn<DlsPo_S6bpH^UA)$~r+&tG*#rk_K9jDt!uTXW+^DT0!}KvR3f7DD;ak@}L!j
zuqkc{<!jF%=ny&uhy8=vlv<i%GZR`xdUl~zG!C9WdR02^LF0WC at 0;lBr{YFUq(X(%
zVaJAzP)54lShozGYQ$|?7hQpj{0VK*CMU}tK1m|W405{Ef)K-R!|3^hqyliLLv<lx
zhk1n%PdF3N`WD_4q`o7%ch!L&<z~pa40ZSx(mwEnDPyP`<LC$eqwuz}SXT{|k}6W^
zSTr>qecsWK76-_9xzKeKeri5vz3T|@a&wAYAIW;U|BSY}hR%a<PkN32D0FY|AEi4p
zt#0hgN0t7;+Wtib{mo4H&n(nw5gm6<eh15+gSP}0Z_AJxw~oUJvocFHA*Wexr=wc<
zi=aJ|ZYjZ@?LvuQe?g`?Z at b^D_dg*dIEfV2T86g(Q*nOKV(n<fNy=@nY+i)kc)Rm3
z$2qFw=Q*mu;}R*X$_n4oDNtAzJXH-RLPy(JGof at O(u!G{1v|bxkw_g2iX?=^Q0kHe
z?<jV(uC4g^^BiTw#%X6yKZKsFqHQZ``cr6aQPbx)>phpvaDQ6D1R<U$ur~BiOMK<H
zp~6&r)SO&A7iS+3BdE0DRXEE9sd$MrCvP6}zti%cDlB2R!X+GDTzX*)oyEU^T+>Ft
z_Xc02@)b2L1G9oPnd-O4$k<n0$DlRRb1=L+x!ZE6n|c#_%B<RB?RdZT_b~mZ at DFpY
zuiwGSF;ZsCybh<zIh=3(@-7*t(Y16%sl%6<+Ni&Y_Fa<4+L8K>&%vpPu23s!G3ILU
zTK2_wyr1YpF9WL#^OGuQ-GROiyU>J*4t?LH?A_qi+n#;g;0u{Ow}Rz)eQza0e-q%l
zgYUuG!LOmcXfNI)zl--YZcav>fyXwShsKRKAs}E5#qBt>yV2`!-imVrLeAjsY*{$P
zoKfv|crVkPwNUGUcgEESpYQFBbhb@*U~cakPG3xwe)Ph#NLU(!(UB>a_Sr1`t8VOG
zz3*sdnyYbttPQIc?0 at ZXyS@y-2iqSwjs_cANC5fvG#thK&Yri*s1LIg^Rk$NQSx!z
z%hjp=f#<TPpkFA0O^;|w_c^*!@j`C<*9&N$r{tvP&S}1iEBXA&Zu7l(=~bB_ag;x_
zc#f`J?;WY+7yOQpWHGRD`W7(s!VRRB*jIk^+R^B at VpgS2!wU&(S=lAeI;tL|4+JW<
zd;N6m(!uI%@U_~aWj);+eeO<6)K6c7>!0fx#V!uPM?uFh%ot%m80Q=Ihf2n1{=!#5
z8RU?!LA5I+#Q}OE%JwQ|_pq(P`;<4>VM#GhqqIRmtBP5RFj^?}>|&25W-8Jad<?(-
zNW@`wrQV5`TGxicB}i{V7%R4 at TI3rO3ZF(e4Pnp at Hv%UfVJ)~Eh;Tv>M`uC!4uqk{
zD2h+%Agn{Z*bW85G4vhx(+Go3Bu+ou>O<jtgx^J&@^cX3Q3!*Fa3^S*gE$({w|x-`
zV|8u&EEN70IL2UDi*ejW{YId#U4?id7>-Ov_?}=m+-{7SmW43Nik=7jHxQ;gHz7=Q
z0zF095FQr{lTE<?Bp8m4hpx^eO!<c_`FWx6W`yrTI}j|3#w1wQnSX#^>z%?SShY^K
zty^}NpiXpc=ME&ece>SiDv#PVERU05Q9WxBP4yMeytV!CKdE<J{cpb~Cz>PZJ7+pb
zkF^|)RNgfRtzk580Q>vkd5lc-EwFZ+t_ysK at S#w+g|>Rkl^#^SJI+k#gSWd6-VyBd
zClqE|v?X}E3ZZzMWj-R{NkI!wF537qL5SsUs}gZXoU<hIY4DllVl9~4jB_|exQ|!#
z64rLu0m1C#zR)hop~KKBUgp89m9{JC5cEToodnD$FJ<Hme)G62Wb4Z!usg$(orhEy
z3^s%NFTt_hA$g`aau3lH*CAPTD|&VGn6y&b4aq0?Td2>1<D^42cX=wxVd4>%&e_(L
z>rc0yQEh1O-q7Xo#=CK|Ul-XFM^{$f*KDaT1Ox|(n^GRQ6q*%3EM+t&o25X&`yVO7
zJxq&J%R(AqoR+G}`eBDV=quElM+N at k{A5Gx3gPpAVir^ED3b+;9{1T)jv~w{@fw#j
zTnfkAVeJ<`%z6IJ<C3R38{NfbPk0|0j)CjQjX5&Ivt%=2$yFyKbpNupAM#_j(w_a7
zO%bx>`~*vgofpgNRE5<MaZ_F+`mQ0nOgPaWiSzVfmLZTlmK>sUbi4$4$jkRB=cis>
zDX)1R+U-9r3&zLu<KsO<<y+b2^f7glr8!cWv?G2s=AG%7`zF!3uNggCz21KsFL+}=
z2V-T#r{uFf5=5ne$K9w!>^N*Z13wzpg_7P(h@;1+T(kmTWy-odWEaks2QN68vwf-D
z0xB;8&x~^u)2>($Jn-<2hwMqeX%sEp8w=}Nfmm4BN)6q&{**B$AOAt%wf$EL#^Ila
z_RQAdt<|EJsDHbt0yjuoD4iy>hVDK7?Z)v%E2wX~=%xAzbSI@~CDsIC1=FNKu(v_<
zl^R-a7fw-|bTTr%-Mp>~=Lz$pl+jv}X5)oRZG`3!ZC(HIJ0woRxgIMCkE3I?R$EBI
zW2xulfzRo=Dwn6qN>A5dHetuBb1C?%%vF11XM0tMo$X4%9wJ}H?fQR+dl$H<s<nT7
z&4ppO53oU|R5pl;B?xLtI*uC{M<;J1;w7>Gxp)^6EXz9X!L6cU87f+D=~QM|9uF1A
zq&hWprMsP+?sm}3 at SO7&X(dbu|L?Q+2F8wc&ilT<&*u-HHETWVzSe%$TF-jcvz|2%
zBclMg*)iuEnT}OCHtPIur1kTrk$YZ+oUMUq?wf|e4K3EF%d6Ihr#D#c?08f1xEz9R
zZ+M-)uG|w1nt6MM{z0wqtkLK%GhtfkxY+VeM!-nzNuK5yQyX!G&fKqXh2$DE%D;z*
zLj+!Cijx<?Ss)s1jz?!~Tm<~kK!b^;DH>~_rfH`os^dh{F6<3%XxfcmM^hbsr#0<C
zzwxQi at edyDpttCr&*zkf-o%dE%2|oCKqu7Acq`=IQ*Yw7Z_m3}A3@!I^mgMg?@zSb
z{OI*A_q~Z{6We02vc{9Fj!Ye%qq^V}@(Yj3<NWAp(n46Hr=54iqw>x>nQ1X9#9h$H
z#SFwp at 1Ba$A!6k;VP-egtds=c9@>W9eh9TJbQLUWhj;~K&)R~{Cbb2+hID^ZyY3y`
z*GcDs`$tsNa`ap(-ajZXGGPsGY{1P$qsEn0-CPTOGjqPS$Ds`UQH at Z<8?&GxMtJ<t
zYm)XkJGYZ*4xK+L%dF)D;09pUdDn%iA2*7pkb;RGTJc>&F>{%Yy at JxP<{5U;X>{(u
zOS<!#3)&xbvvxvHc~8$DiK93766C%}ccW(Sor1}2Y}62a)U)MiGj3E1(66%8l#J7W
zQt13e`%=t}2872W_knnkVf3biQWg)|Lc{7uW9(V1xJd<bvk#o41 at o+7oj+P4=6z}n
z`*|$vkF8-pVTGQDyT48|=!;-$z`oPgupbd;$#bwlH7q#_X~l?~M$7)3XPrZWjE!1q
z6H3z`)i!Ej8&#WEZQ-caO?+puK3WbJk81V2%W21yL|Ua>PTbw;>4_JIqjo)_12hiq
zh>EQ5rGZ1 at n+Pwk-i`Y}y1j0<Bo#C!iUv2%*Wa8k8b}k+n~C5zT<~Fkf;HWA-=mI>
z_1nNr$Oit%r$Zy}E3Q4D1t(l|7HF80K>{06)HNZ^W95<ePshdg?+^=QDeV2dQrM4-
zAsK9(B|!%Jk)N_EYGes)^z%CRpR*E-A&|(u!@ag{Hl)oU-|T$(=>B%s`HeqF7yYCG
zb%({ReG=FO8{Wh|@1OpsL{VAFjIB=s$6_7iq1S>ldYj|o8}H$(hsv at +Jy(2tp{M&(
z(vocnEA9dJ>f-Sz%zHS!hl}Pe;5B;eyt>NuaS6SjVMlQ}mk_+4IUewSEVQ0rd>d;L
znyQJ@<b8>_S+XQ$=D+0g=YPpZp{0XleOEzp`h6Jr(Q`cE#wJK5irS{yCdm51-qvWL
zIpnAX)Nn2IIhzoNHF5I1va3nfaNJbW7bk2kq_z86v{mM?fj0^c*VMlH5nuQ+ZYcEW
z|GJ$@{lE<+j<&)L_0If%Swrife-ua}kUX?lFX)Of3K|RD+uT8=>8_sc{T}1Jn%ZDU
z1Sb{i3v^yxaZ-UCr&!BU5jUvDRg;!CE#!1 at z!_~R$RgM}gwbg7z^1s+-Z%e2>&(1$
z65DHgWX9`(9~s<Fx*_Kxdg^nWjDd^d{s}8eWS(&#UX`MKfs_cohY<$yj`$7srsf$3
zO%O8=PLs4Iycz%#^j3&H19PWF6y?5wZH+m<=!qTR*KruvT0Ij*)B?RGigeaEdl at k6
z9&qh3eFEA8nkGV|(-m+-;0l2Wm4-Gz_qfUx!6=RUrR#p29>zMIbdTP}9(6r==(BF<
zb(spk^N?r!Q{4xpIijxn`=e!zWxICQ9l?7jeD^1SX78F+cUx%!6T0s^I=c}PAUt at Z
z8t_J4#2X!jJOYsik32|Em5EMMfyuBDGMvR?O%QhJ>ITElD6a^@uTtpM6tHDFmB!6C
zFdtiH-syb^=M>JDEfIHm)lq7Z<$RSL=-!h<5$_AkxLC=s15--N+GVK4CG|FFTN1rk
zfwKDQkzJ>$O(Qy*)39umMf&E<dd$%zm(nr<kQN%{LbIT;u&Ksr(&jeeWRz*M5(+|a
zqVx;a&`?}7&doBl8#&X4+ZzS+C_;<nP^>4RS!`v{u^O_WH at L>9b#%-U)Ow5Z%ovE5
zvR-pseEn{`i-FLY?Q)zLlrli#>upj(z0Gdwxd1(glTnjxHj^e2FZAH9yUi47g6{8}
z`%NF}-LCU4uaEAppC9PxIK3c4_h7J0Q~ZK?3ORwNgF6NY>*+DdeN#mz(131*0WU=4
zML{Ax{x~;avGz!u`SLan%uy3Ffg&?Wi%pZU%Pz$)w7lR~D;0<WY#odq+|~-qsHLN^
z-%rNQ#z4}~IHN6wq;s{{45~wK9lEg^YuDewXOd;OH{MGts2O{qjrSfbZ;5CQrx|}E
z?vQ{-${KK9;XLb|i{Cb{Gj*Q(gv10VXZR4(LoyFF79k3U61N|S-`f&;Fb%J<(OnHc
zKH<7si352M5^!p|kq6Vjp*E|#v5<plph%m#c1S6fc*twhxMb2W{DQ-bUmA@%7`-%9
zjQ4_j7xz4I7>T<`<En2g?dW3imz${caQ6c0;qDKW9`5$Qy|cfEyL0}vhvoQdX+G`S
z8}?i}0C#UqKg3Sub_%C*W}KmQr2A$V+#l;MA%AF`hP<F0AKcsd_qN2P2IO%b$l@*e
z67ajwBoUE1G;aZLR=!2xfmSBELxA%Kx?SZZS^?N9;2of#V;;4)^vYc_N5{M>OK`^t
z_ at 3|>Qw_YfF4Y4*^)6S-K#R8HglC`}pEW=>TK+mlFJx%c at 6!RUDd^mHx04O-=`D_n
z at 4SK5M9`}+;MyJr96~LyM=+)@U=w8Dzo<E7;(oa(zvL8&F`1ObxDd}cPz6UlV=RWZ
zub-u7X?aU}QY|+Zd}EIX5tYB>MYO_Ft!bKAJ at i9^k%!=2B2F}Z!Rg{_sU=-4?{mNA
z3w{9knts0E2N{HiT`e;GffsXdu2=wlZa5(n={_%bO+ at 4VE!$GInm7{RK at l&h0CUsN
zsW1~@8qjv&IW&ED4A_AiRNy|c8MUT52F{uXV*#fMOFqNQmxh at U@@Y#xvyb<%jT at V2
z&48|72|RXpvo*l|N*>=3MKa3!N7|VYJPu|BpJ;Mk^3#EKU6L7mrEYHk_+YZjuIQFn
z;}?3VFZ7ZcdaGY(S6^tC8d{E)U3?2Xp1W3}WyDXSHv&x(cnhKn)L-Dj^o`?ysU6d2
zW4`5KJEc at rMq;m{=gqg!_N at -4b-+M^@}0i`w!obQGsV&4!wLyn`r?O6TB6i5SuONU
zg2p_)52s_arfP6D3z;9pnSS}Li|Q)rvRfC`cVebd-d_x};nWH|G}3)ea-u&HPXi|e
zhtP%q(C;F6MD2<@{86-L9o%|+wS$mu8?U${j>CTz=49OAfKF at qR!Fr2B__hp0G%W_
zcdgD;@(5joxHW{MdvAvMXJ0+?Fsd2K&mrE1JO>8<@vtTMk53^T+7=p)dc31z^>Fy%
zdurR at _cC$s(YL1RTO1v0e^EkoClJ!4xb?Ac%TynoZsT-^Ui|_M2Ys#2c#S^VNkKYk
z6Xu1rUn2ikaFQ3JmJ?}XchIe$oG4Z`5%%0Dws9oExUt3#V;ul);YOj_lfzIRar`<^
z-n&X~UiPYGEZtza;U=_G(e+4r6mv;irG%THSoQQ6c~Pa1`#Fa9DtmR`L*socXq6!(
z&4gZwRBK3 at YV}ynA~6p1P4_oN$#yL$#?=yyGqkAc2APMknq>G1b{)jdSME2>OQ>Nn
zWKjgYPHdK%A*%u#Vfe1$85kpr;l|!gZ^XAE9wmM6f5Ke^UK!u}79O2RIi at 2NZPtSe
z>EzW_d6zE=CF1?c8q8bG&yehjh8+#;<<<KTkF|@XXg#!rI(mM*!Nznv&O*WGxU^3`
zlcG7|;+tP%B(26dRU_7liLhV9IpB*pA0S<qnCE}^Gs#ckhQ}n#f`2}zm*>4k`NWCN
z>(rB`x6*Ku%=@N`1=#WCVLmd+G$MG|tQ;$oM$+RKW2SedqV*JR+?U&UA8Z5c?J5lz
zDB)bJf6aoVBe<7&#_|Bn{~yzN)~AwsmrS0q-=ex4R_lnJ=?{m`5m#MVb^Z3@=5HMr
zJxgf@#~x|rr^J(KrTc1kt(M(2l=Fu}5w1a<*EVF*=q!1 at Wh|iEobh6S3_sH{67ZdX
z4Kn;>OA_GqfCFXt(UyVW#Odp at W^pWzm5Bzd!vR8(U=)f1^gUbXPJvLQ)8m`=oM@$A
z at 9pyMr(G_hA5o`QsBLg(PJYjMm!sqUU^@BKGZx9pH4nTQ=pGO5U=YU67^zhXWYKIa
z_(e$flFM@~2>+nw<j3E at EymDBUO$9I9yA_w)ab#FWl<XTA|!+UrlcVqPB=x1)SB3f
zr-!%cqRQEecsC_d%fuJ|>&>Wg at kMA}{SaqG?%r6<94HNw<~YRy+YUPZbKb#BhzwjG
z$#Ug4&`l_Bpd1G|!~RH(`_~!`V*T|4eX3#HO&;LP=AS{0UWIMgSa4`Gz_P_I*F$;j
zF4qu8=ejzv)q}Iucs=N{D$AhlJBh!Dy+UV6D^7q7{0O1KW5hj7=rZ?WucC`_bS78X
zCJtuR1-rhiEf$5Nr8sxz9i1!xP9u~zS&_y&CeLUb%{Vcd>BT6)?FOd>TNAy=u|_dc
zcpR=EN9XM?^t=fvwy9Ka>`Nd=k9zM02US1o88%Q1Zpdz^a&$(Yrgu7i(4E&F73wpO
zA at wLd=Vn^(K%^aUd0P99;C$yU at l`QMP5avAX}KMs+BY{*Y0R~wDH6Z;QClbf6Tdw#
zWkXW_v?XOb^#krwZx_KWAGBdyBS{{b@}cA2#ZD)->1#7<HQugQ0wDpppqsNqY~PF<
ztE0AWMoP(U3i$_8ZgiSzc${PEYc;i*bhhLHR)_<-IrLB at Qf%?r<+ZZsFAF@$jZ8|#
zNqy3hOex_=mXvZNTe2Ln;aq+S)#V}k1Ri?5Qnqh)LW3i at VTS|WNbVY(*>2xLZ^x<m
zjlo&!I6A$ek>_BR1l5jF?P%4GRBg~(mXsZzza3y7?wPX?FJu7UOxWkgb}`7ogzfkO
z^a`^W+!}fTOMxc#xLxw?jCpjofyR+#(EU?#c`?lrcEA0VNQ*9UXK6tdgX|LC4Xt7e
zi?qxVfBzJ3oTUuEF}Ws|CVkKxX^EzIT9%7A&7do^O3aA+?dZ?4`*A0H$LB40iwN~%
zs24UJSSbcOI=^f3T;*UBkJ_CZ<d>Dh*{8tr`={9P&|NMxwR^#1zTXZ=B&a*0dpy!W
z@}?^jCjr@(F^PY$+`Qv+5wB~#7hqq2+;g_EM^flaSVJ#Kq(bK7 at dBfR4KEc+uF?y0
z-Nsxxba-OVh at SDiacpUUI3GZqT*Bn<{(2NMlB4r`$g4;KZm}-L={lRZL at sOQj?do>
zuunxfS<tZDSIQ$pk@`B^guz^^HQ2P+VI<%#t5Ii^-Mj;Lq~sgW1{+Sjm9PM#?540?
zU1AGv3AjDBXb;2A2s5t<Cp`!$wL{hlZ#ZHSli^$Ja8N8U(;I;vG?7~pC>*hI-ll|t
z<BIEngcUgV?)>6r+=U;s<MX%Z+;t9iqAaRFoP<zbY!#akJ`?f}m*I`+R(6-Ekll^>
zr8myRE5!K&;%xAXGvW$yM8t6+jt=rhk4YkQB~+c?sP_C=>h)m{Gz6gcYU!5mdEn=S
zM%?^m!(YM-x)Jyiil(ipW57%eusXCkY-3f^v=^pzN9?i-8ocL?9k+lZFK-Cma-G&R
zZP!=bI)R0L1x^49v|+zLt%1I55n3J!+GQ+JpvM|9L$Kl7NhYZ;&#5m=y<(nIo2LFt
zo>S#KufIZ`MO`j at x{SA?K~EPxpkp~K?sWsi3FB%K_9Rx@=&eQl&&@$N*&FB8y8{H%
zz~H*zll$lu^8al*^h_e?_f}~-YSnS->L-pp(fNT^Iz?1`(jL4EAa;)jm7o`j23i2Q
z;KqtN at Z$#B|CRycJCYtlUq9NVlcwWDt+ at fW(H$MF7aMdxXx<Ny?2gXJo4tY34X|&-
zTpJ<EdIge}BVGd1Zldpmx6Z{p-VmI}2ZARO5MD!^nWNs&8muN>9exu4f9TaaIuFn6
z5^b#O at 3hK1-9|Hx=ejQb3D2A9qKC)%funQIySxtaxt(*~haCX>_}R8|!3Qz!=j_J1
zX9Nd8XEns1!P?(Bv)$3Tcv)&JA7L`FiBfZ_A-?6brwzKA;9r^=8~;^JGllGF at LuS0
z)9i+NyoK^d%H`M77?4^Ix(*7~)$t}Vu>QIF+YbHY=v;W*y~c;Q&v$@IY=ayebDHiM
z1GpV&18@%1`Sdp6G&?9rnfG3EI`f>~!LGN13hHclPM$@hZ2YCU;v-S<;?;j00C(=^
zX3_JI?I3X)LL5CWv>dEx21N(jC#3y8^z<f2XJfU5k#0%ZF#Z)Cq$PFm`CGdSvMIH)
z<Xq2-*N9^3{0Z;c(z<aw*JjdUelrj2{vM*K5e}C0GjO`|#m|A$tR+0vKH;Nx!}?++
z+tPY~@kwW>hA)mos|z04?BX3gFS7RoEc=&)7V82ZcQ%Sfv6Tggp}PW|Zu$Ztni@@3
z0EFTa1iXVzuN|WY9tIsTz at yv5ye7R)3|rKm#@c-F-|5k7H;PGKP at 2zgZTZF9uFn?3
z#N|$%_H%uVsAWU6r>d)Q1Fq-!I=qiL&X>k?+EYh|IXah~)$2ta<Zy)g(G2qE(DNUP
z9WSfVqMx3L+9 at WQ9usj6XUA8N{pwQ<6W;e+WeuP3o})8-4b=i)39Hlg)*4f_5pN$A
zN@!=e(Q26R9?tI=@x4&4(AOWsgzM0r&FGPv#9*AeX+#ewbHjw==+R^~7J3Z5_%7l&
zP~N*OBORSDK=T1=eGYScq*kXX%wvH@*h^c8CS at 7Zd;{>lY0nF_UfQota&+!}8YLT=
zK`p;fgYVh%0`$iL?|ORDq#&D#<vMzrQt`bOyAs*c+H=s~iCVrep5<1ZYurlT7k5y2
zGhV{O*MrbzEO0DI*PwNBRi8ULKRKCqOdDi_Jje_;-uP?KFr08U=-K-``XfRJfZjPB
z+m7%cgx>?(IKwTVU!jerK`=IGrE5{vbkK=+H)x?DxaWnbQY)a_X=Y1$S6?JXY|`Rn
zP5TDoHN6bnVo5)VM)cx8BpUaf`~D~e%Jw0uBjFeI7S$Rr_pu>=vTmO6F0H07%td^R
z^?kb$pX~dkR<Bjg at 4eL9CLDj0!*@LH=nT8J at 9R)*I;HQ2+#}}^>>Z9+A0XCxwe;0$
z>C4q|Kxwp;MlQX)uXIk*(P-T_Uka4%9H|*{$fvwI at vQh}e~IF9A$u_TcgWl~2U8!}
z%F%BPLO8wnj5e3ec+3+HPX4tGRcvfkt2Y_E8uBli at t6ocz7Jph`G>usN^c7|b*EmQ
ze2#kAd-WTG)ZT|=h1~mL at COz=4-SKr*ieOCU(fTBH(2%E2s;t$chB=8X4cbPSy-c?
zYu?fMyj}G8(x~Uy>n=g*Y4m+kFD at tk^!^ag+Y9iLk|~;~foDXI#~=nmM#7FSTZ&p-
zHKSZGwrl8nKR+9O`Et$5g`0qv<d+S<d5+Ge!!rulTs3~Eg0s($r#N!G#(Ft5U8Drb
z!v-zJ+6*;TqF<Y?LQY%in)_=?BQEh#?EbJCTsq<%;JQXFBZeKQI+s_kMGu+KuT9S>
zxiwvC*NE3pnN2?Q#VcqFy|CNUy%cUk*DLy+%rIm3<iGWO$DzVlQ6ATcW!{fy at 8=o7
z(zK_f8P-8vtyz)P6;i8{7md<}KmGMj at BHblKfP^A6OBhcbacL2W~$H)?s9u%N*P<T
z-Zan^Aqh^3b<dFpeZb$+`)F->?T9?f7eX%dXncz+)3W{Ek0p=IqZ at hpowk9l<gA@(
z71$RsPc&YV<Ep-r?9NKkJpAROEy1)W!rtT*W<8C77eiZoB(>~4gBG5WUrxX at +JqO7
zM0x=!s_C^Rn{<N;CEy*VnVYYH+ at 6W_|44--i?)7-d`hR01m7s%z=r1Yz?JK=+QIj^
z1X((nHwlqX*w at tEo@X)+K0Bff_tCT*^rt7fGm&#E$`QPLo{5K_5ZCAD at y7PKd9TTx
ziFmDeX{k4j+iU1^7t}*839?vAO-2{rXt1v{T~mq^Wumr at 8XAY$BA{s~Twp`>N3n13
zdCq-3LQK%;dOc1~jEY?@+mIn>tqrgmaJg8=JjjDyAoa+n>Xe)Ir~&ttF20J}{OhNm
z<Qs>HBym7JrF$|H^jMIduM(k8OwYk4w^Rs7t3WmPWhLMhQoiOsJ<P%c6C?M=Elq=@
zsr1T8)5GpNkejCd4(esh(BjD?)PnR+;=Th5cc*7DXHb25DryJLiXjgtN}%xrDNZTI
zHZ&;9u{Cn+zB;4LsO>E$d2ptPe->irmx6<qWW<@|b;s`Mix+UzaIApdFFV!>34{c!
zA#Q27=m6dPxWiY0*+qfjz9x at 7u5xGeKcb!wIxar<0CoXNjKvP$nxE)P^yO?q4F;_*
zAZhnLKVJ5mrTF1{>DBL*Cf8O%-x^e(blC^e!+k!ZWuMJ{K4WB`Wqv+mWuGm6KG(@U
zH~aaFlYOfFe8$T at oBVtP$Wcs|B`BcP!*TJIyWNwiuj?oO>MI!JuLG_3y<dqiUdCBX
zeI`cKAbjDVribB+w_1QNJ$Nq_dji~1wa~p(ThP($#_Uqy1Z=?;4}6`EeK)u!v-T3*
zh%Z<OnG8mIs(*F&`@)p~TD*@}2YN36#sGtzEad?)JDnzfR)vO_hKN(~&GPWQGOdPm
zL9$810nY+_J>bdWR2jYja5`YClr0VSae%G?G>O6joMNUE=W`Br_2b}=>98Y=p<J!j
zbYMfkjqraUbsTaYQujA1Nt{Zjc at E#L-{7>1QU+2Uh_zW7c3EzJP;-lf#vq}g8DVn~
zs{(c|`5-0sXjiY0z`^sYLy?*)7{2q>c%Y1~UVu7f3X>&9u>sGP5|w(Z at Kg!d?w1c~
zO`*0#Nkb$7ZJCVF9HbjVy at PyhXwzi0qKdd@e(8qvr9&N&&Wg}^NH+lKZlL-gofYXy
zrD4=-2%ST_>Z=36ZPZyN)wbZ|Jx)rJgqlKxEp)J}d>Db5VyQ0#sisp5UkHUC{0wlm
zSLb6#%+hfGyskR+FL^CSUJH=d2{o@!q=oi=<P|FC^*P`{a$Z+SLzFsEUm?W{YI~-k
z?%8P1B!u1x|37)hQ(mY`p~F|+V+pHmk&+HJi_nEq_bq&WmP6^C3SW7<8u|)CL*>wK
z2@~)|?1UMJL73s!tL2|4y(NdEx5_{8aa2BHPXg3}lVUC1$nM2u_QxMIv!dBLX*lHb
zeC1!ZSCI>{+`jUUaa(&h)^eM)0?<>01wO+CiuL#p8kFLqT{573Kj6Gs%p at N`dti?S
zzqwkCgAn-ESXNOh&r`aMfa|G^N5)9_QfxEeyQoLWO>qu>0iO!hXG@>Ya!P|Z+vJ`p
zQp30Ph3Bb0_w at P9LG6c&!UZkzo9;7E%P#1=>1sZk<$Nahmn_=llE?Lztoo!}Rx<Rg
z%XLM`YB==1%RVSs_2F<2ongf=wCME(u5Df&es>8)7Gv!PXu*77PB!W^bkPMSwCQSe
z-rz+SGz>1SH(=2PJ-Kl5AZ2HzGYySWHoxvuhp+4$t)4G`LHX*LYb&kKkOJF^Sqs!9
zB=YXTSxJO;N5DUo at 7wO0rPJYNnPzP2uyhG?r@=l3 at 2?4l8I4Io`aN3v$Oz>P$@$&+
zN0Sg|lRZt>PGQ@$_EB9C^81o<SR;jQ#_Aeh_XMOF at sc~>E%b(Q-4lXotNv(G*BcG*
z_(sX!x7^X0c8dBM^+qepp6SP_vcv5gm2U$7gYA-xYXNY(+c&8xfKg=+K;yBJ-VUf1
zuZ}3tR6zH%S3^S_&9w6YN$p#)4&b#^S}{vm8l>q=tUe4Yd8o6f01#0i#!x+seM2iG
zqd{B1O)`@&kC%Njszvzny|H|w0GWCrXSyp0u-FIVrE<Um!F_GbR$7FWz8y6h;0vJI
zN=xC6RB#R<&44hkGOPhem&RTMtd(7R;aeyTclcKOu*y4qSDj37rwe1<RIa8zoxUg(
zAD%&r!mx6JhYDJT+85Ss6 at Ug@G^72ho$^H<pXQDgdjMnYk>TTnX&2~Aptn}PMfmg5
z3rNi?tz_75GEg?yU?{X2s080^xIsrWLRWbfD-Swqpg7K*27y*?lrE=19P|pgHM{X{
z8hTl?8*b`LoDpk8nbOr6 at J=3lt8g|D2I-?7NFPCGCDoaHdfpdwRrns%9*xU4TTP2w
zKAPQBc3-Z$sfHx?pq8 at RSz$;cTB{dEJ$v2NYA)4k4R}!5gVtkTbut0@)~KO1aPR0V
zaR<f492Q9B$Ti-s#)JN>^^g_0JT1lc&Gw5Qt=TT&G*Z-Xa8U}xk49OFPtE@(z8FMx
zp;F}f)Y^x%v+mg1IOMxiNY`C9c2VlieVL2e#mVQiK9e2i8lW&FXSQKlqu$O#Ry4NO
z<SrD_wU>?R`ohc8U<4VEZquAs4g4{TC2(4+kLhJ>&>WMFg~?we=-BpSVZa6S{yO8a
z?M-1$oq;FGs;2FY7JL<f+6)Or^pMh*a{oaSa+97ynxrNpdYxSI_dy at Z?L3*(1eqh*
zf0NRGz40k0<+~_-aV)qgq;5FPMBP)H?%9`l){0jRBGfi-b`C+CweC5&klU>_()=Wt
zT>APszlsOV4j4Kn%??SR9RoB->;P1wx at +_%j1QbJL9&Wh+ at jd)MjVr$8xm!Vzd-kL
z%YCC9ovD)~1}UxK7xWI_swkQXB;f+)w^gAu6Tl7XZIuDBF%JO3y0nr;E5<({thp;Y
z0AVZx3Iy~6AdF-{MnHcDB-3RVf&hI at v@mKHiW*TZpyO6{>;2rkpPOpk8;4rc>lVnZ
z%%L=Y)`xYy(N&^Q2(C=|mTphG2HdDFno;nQxNqg#?Nz;V_{!IaMu0!sxbh`+KBsmZ
z>zmIH0eV`Q&wT^neyVRae;Uw%_G*>JC<1f`<s>c!H^aBGLYX at y?1xsa!n&I28$h(j
z$|ce;xb?D|sE0#TzO)=6d8x63zp$6%{!7JHaC+I3;?ykY0`zILg=~a0To at CFHxg(a
zT{$Ip44drJqGz)JS&5qV>4_RxnSu9 at XKub0+|okdfRjmb+v4Ew#JgL=eI#K{eLqyC
z2cDMG3?}NEJxys4Hh^vjyclF_VDo;ac^CDQ1Zg!wf>RBHzYvFInMQ&uk+E}=#-|a+
z?hTTLQ=L})qSOcTH)!J(KlayY#dmZQgX-iPK(m1_j&ekPhKztXBS{d>dmptYECD{P
z_(a7(VA_fgRSd*eTk(#Hf%sA at Uhl0J;oORskT0bM#;rI;Es-H$+={2WzWIGzSn*mv
zF06Q|9~V{}>&Jx^&-mlQil_Q<Va4PAxUgcMKQ64OK;0AZWlK?yRsFcIVo5(PtSIcq
zg%vj`ZBlSyMecu!3o9o3<HCvzzkVNmWn5TsgFh~;i1){Z6><K!up*Lh;RW5l;=&3@
z1pGEGEdR+L7nXn5U#I15SH^`E>`J(>{KI}+SpH5wE-Zh&9~YLt?2ik}kM-li@@M>U
zVfj=44i}cc)Q=0xkM-li@@M*SVfkTyTv+~iKQ1ia?~e=1_xj_)@>MD>V0<lK(vJ(v
z3;S_l`Az+}uza3BE-atbj|*F-A>=pbh2_`#<HGXMe*Hf3%DAxH=8p@@v73~4DDu3p
zJjx#zmWL27G+p{vTv*oqd$_Rddw*P5*4AIAWv8!<3(I_0!i8n;^y9*^*ZXl{*~|U7
zu&l`+7nVKKj|<BV`{Tm0$AJsH2z^|{qXFHZ2Q?++g1?x>3XHWwL6t!-sxB-qE+EPo
zEzTnv7I#zIGgyGe3;ud9G)RMY5Ev*LA(u at CZTK>1Lka~wBWTkMuTzL^)Z`u^{g|=t
zvu^A}D1>&z6oQvBN3}yDl_e?r6uKEk;ZhP#a^$&q*&L#iZE?`LWhZT1M0eUvrca!v
zZK9x)^!jM6meXmqhy^Odgrm5HA-GYUWKTAcK7T`_hJ3u88>@~%SJOh{F}kT|!B at OW
z=^2M_nXOKGTThVJM>$|uCZG?3uqz|IS%UOxR<vFtE!ozbr2)UVhzYL5Jq at oIls*Ur
z&rx-`Gs?}%uEs72!WcJJnWg7Zn!NhgbpZMYbYlgou?u?Bg|Q5inGrSPc7ao>sdwR?
zcvxuy_6herzx{<U`>0lB7q?G{H0YbQlb#S64+=#dc{bC2;MlXExC$Wk2C3Kei&T3d
zeN}S1$IINi at x;A5w$D9Y=H89Rj*}Np;Y1^q at Lgk+3UZ5dIL#gL7h#NG^o^3BrKH11
zA at F;aF#nh+E+K#TrNQsRhq_c~ETFfYV?;R>LNfrrLSgU&*HmKx{5<-ySfxpleyTbt
zbK$gF;#_FHr!^XF*`UriSkac=q0Bhwzk30#QRW<?QI at V$W*mfI2ez~Xb50`M3$bbx
z<?S#)6L#K?00X at cj&nFr9!t|`Eu<K5&jNL9A>J3I#+!q_r3sQCE~dE&?yHq?guUH|
zfH=9AhXX1H6h^cfxR{|5(Z^y_4P1qA2~9P~3)~!sZwa*7WA|q!Z7S<$i$OnVB>}n~
zQM#`PanOz>&;kig at s|Y2{!8H3N|XWkYzqHn7f~#7eRm at 4XYd5TZA1KBfW8-4oaE^E
z;3)aZc?dqtr%PUzbA1}J)0`7rEAxR_dYo_=yaxCTTnI^O=m#GQ|D!O=?fhe(*e6~J
zb|$a`&h(9+KucZ62OpB}tU&A|$M}Unw)!2reZ&I~*vI%Da3%yj=uF at GfTQERCy^o?
zW{o|%1G&HTxt-$$ZwBRhN!Ob%!s}5Ft6Uy(^$&UH>MP{B!O`*l*GM(hezlzIpU4(H
zsIx^BaBmDymhLXx!F}sdI~Pag?n8?6bslLb`XUcn#{y(~2z~V>*U3EuU%2Put7mQ!
zq%*dc+nM#N^kVD#={EXS&`I*!--?ra)gbpXeM9<I!4h5zQfN!~U;eFt(Q=u)BpYIy
z>08xla-j>OSue1W(1$F4 at xlzlA)Fc$Hk5u%B^>o)4Vbik1?D>qu!Vfy?JIK`VnGXp
zAAUUBhab-%>}(%?JPYV=F6NIHrOyf+>fp#_)lB$CZ}jK|(_wv`qvjj%mX>G4W(4i&
zILU9%%q!2;LzDI$y%>(&h>YK`f!)d|pj}VtJ?c6GTC{XiZyjlGRQd;XHNwa(U5Aht
zsjU|Ry%BKdVMQfQXC}gy174`Y7Ql<U&OibPe4ln#<1my*=ST at haWi}UBEOT8M4U+s
zTAwHDDH^o?MzZ@(LWam;3l%?U81}rx-N9Z1=TxBoQAV1tz;`w3lMVMZmO-^GmX!5#
zaVlsMp{2GjpP`hG95zo5gJzq)uwi{+xpLV1(2Il}j8q`!&-&sGm+LbBvic><emR%<
zjeuX+`kPMjo;aKm4xV|!nmY4G%cPx;r`qFBrOuB(jnml`eYsvE=KwzF$poxV>it)=
z at mgrnV9?bOJMt{PoE~?FhqaA>mei1i7sZGC^tC5it!bPdm+wnW8>xTOyaWB9(cTz8
zXskEf4_fLC^n;un^1zKQl-0=F)1us^rY*=%I&qZ8eXMvf0(Yl+y6^4Ye^hY0N)rNm
z at E*kCdY9YPJ>Sk>@9thupXsJk)yb$sK)uZ^+2gyFH1lo4pbK$9y$$={V8qyf7*W{M
z22<PQc5zC(T$O(9GH at IR4gjTiStOY{s%<Z{mG;NMdY%QN6rEhN`8Md6>RurGo0xJ2
zXgXjNA_K02UkK7pxAPuw8z5gB84v@%=}14_9^bCk5)$biIsJ6RU0@%=`^Q}XzZ>m*
z2w!UzA_HGT>KoycXBQayNyh6T at XJGvdGguTy$chD;PewdX^1rnJ&^$E%8$Fh<p9G^
zEKSGPN*5~ti<m$}`(zJvgrJAd+67~|98W~Ns_uQZap=AM$g2vuZz at f|2uNU)0dGnj
z2i!;oZY(}qDr(x)UaWdCV|)!0et40Q4qbyGDk{o=yMmj#an3q{dHdWG8Kn0%QHVVP
zeL&Kmc6(YN4;l`B at ZVui>+P>iG4R_#e%;~Fp5XzHQv+DT?gzEe4Qv$w-%l{y8rdDm
z?zcrCPn4QQB~fS{LbY($ksD*VU3Nz at NYT;x^+KoyhtD2_?m;Mx^dY at 4oeaxv#I}cn
zD^B%AUEI*^VK*n$Qkc^u)go;u>KY0=47v!I09jc_5<<iD>7X=?pfm?(F`QD9kA}U1
zxUax|^|H9H!e_6{-Gq&IaWF1^ZMvXIVEq!B+aLvZsvWu_`bKo5Jfb1#?Kh7_!7pWf
z3C>|~ccCw4wCr2_D_>6bE&7#jjGXIY%9Ui$Fis6L#y~yF;}Yirp6>ni68zGFJVajt
zO9}yRvO`p*``)Ys!C1cu(6R=mh9=Z+0!GcDF%4{*L+&h7t5FSgk)L}rFv2M$@J1mq
zD5ie1do#tZ-~5Q(HVU`&=P%6p3p-?g#Eu)TJ<vUocgU`H>O>(2V=N~ohJ%~no>@Kl
zeQr5TFVve(f!PQBDcJ{lC;LE2sk+sa3e=yHU|n^8N?kR<YMF|=w at ex8Pf0OZPJc?4
zL$F$=;zr8P8OSafQd6!~U|m&zN-)Wtx+=9y#jU1PLi$q@%s%W-$vz}lEmLv#mMKI1
zDJiCIo18KWeJkj;;WG9%`+^466HfC5V3_WY7p9}eDulbnG|Q}2V3w!C&nmN!Zlel6
zh477-ZBF#V>;!VVrythc<9<^}$9EmQJ*NK6M*{6>24_!rPyC_4M*@3d7iOg}a+PLb
z)Ml|84h5oa*k}Q7vhJt4x(KHDeQr5TFVve(f!Xo?l<YWW$Ky&$)vcyfp#GEu>$di%
z)NLhLEmLv#mMKI1DJdr2%I>QzyNO`6OvR0qH!u#q6r!d~QD7amQfOy(B(+n*H<DC5
zP~7;MZv%sr5cO-OC@}NNUvn;v6y^mUcvU=5+-gcCq(3EKL098fCN9zFYE&Gk!B?y4
z-nTFTwdHj+dKh)ZNRi<*R)`x~?cMKpe*zpR#5XVW!wJB;O-h(<6S>u}SAidZ*~e<S
zkICI1#sKTKBMkG1Zad1{ZlB!Tqn7)u;>Q-stJ^-zDhttv3wzhZo>=sv?2~2s(pZ{x
z7xl6XmuBf&7iMYsewYD!<ggoQl}u*xDtRO7a%1;Cdzwa&=dl|xkKI_Ba2GVzIcWt}
zVdRyd75ic65J_O13g1FBOn^c?+=6xe7L`i57Hj$~_Q<Fn%(3lo=i4Jq7oDc9&A2ys
z2Id=>v$WH;Xn#Jb at U^!K`(2)J+#J{JI-kdSjMYnsRz3(Bgn}=yXFHF5GOy4*b<@rc
zL%Pq~jLMz4fEgKu2AnS23&4FT3OIb=*1R}_9`fD#ytp9TaI*7!gcbaAZ&-$Ium*Vt
z31bEdeYqbN1NS$#Knfcx!!>9_5}o9M(s~m0PC}m~T}J7+WlATB;@SBEe at Z9G?Xt)B
zKpq>k$oz$-23DVmSfJiz>XLFBCQJS3LGO{onvra}*{{M{1^zNfv0K&fGq91*poJzk
zLmq<^w?}r{O?sRxRgJ9Af(z8#mTC1<WJ*+vSP$E#;OtYOD}#~pVe+#(kHN2pEi`SW
z93Dpd9=6BhJX~H2q4yqAXz)#A4?FpM&|O*SXN<si^4SNxos2n=;C%{=e9|S%nF<U%
zCMr!1qm*sEG54z}gAuwPDFIVT)If#1-_J at vPO;_CzETNt`=xa&a9>&(?n|pc`=I at R
z+TcdZ9<ft;(0sty82CLxex(T;fZ?Hp;WDhQ;*TKjN9 at TuMQY&V?(b0>@_W?o)D)<7
z2!Y?D<mXp^8SZ|c=4U0$F05oKy-Hz^*{3XIYWe|4{}}lx>32~3Wf(n2<tc83)+P4=
zzjOx_nA%=T>0}t?f<92(S*A~ey7zTIfp#50J0C~8q2rJl06(t6?SKpV;Ry6Y0QG|$
zPFnq2=(J6S?1Mom%9t$snAkzWB)AU(i{M5*Odk>k5scGFI%#BdX2)fj{z<uTD6?6S
zR<rT<D>Fnh!kZD7M%PBfX+F8Hg<koj-3kwX5q at +kITGQN-$>*UZXd|vm73TSdRpbt
z7f#ZhdzJAOPV$k68&2;tY7(!I8^s8s7>!g0-Fr73y}T5qL at nN_dIl2oxK;iyHTsY9
zkZX<nP!gS1j#OJ?Lf+3oBJ=-RzpZ&pk2{nat6ax4^jbQ44K}bNJS!dTgbnvd_-o)E
z`BtiZnu+O0vy80tt{@IJLf=<I-`A%>Yf8GP<zP1wmZxESn~oMxZh%55w^>8j8?rPl
z?nNs7P8y*hk9`vN_lDRrkb9(<k!3>eu+iT4(RTWJ at 8jH=<{vH2pjltv<IW)Bgu_3S
z=0I;e?zN8m&vQYVG$jYPLg}l%P5c={e+?G`Gf=yG^Wt<7er-4Uw;eas;`A|B3Pt;=
z-}-vSn*mP$)mMt?--k#g_o3RKq257Qfv)|Zra~_I-}@48kJuN4J4PW&d(nRRi%@&L
zL&@*05P4m>>^phm-j+v;61RWUAhpRGad}Stq4+v<rXCKy3Z$__>@TtVge|{@I-FAB
z8~Tsf|7d(DxS)&)xb@!Qc}Bzd{};KTHGQK^t@}v7IRc}xnt8`Vm-Y4k+tN at 1@VLM3
zes1ci%Sxm1L4I`OySF at W8!%(`&2WAFMe_q{tju<P;{_Z8bxdKz`i&`N93AC*TL%eX
z?a_F8ZS=xMlw~A};&=!~CPqXS_N0(HCL1&bZY%~l`C#ZovZXPa1!XNq)UKm6E9o&>
zWhoVmR*mYWkt at 4V!*%4AZ#|mWee#JDY}D+&g(j?HuoZr&!?#FJ5@=8TED6$5a5W(#
z;PBlf%YQY-gHwk(A{C8&n(bvt4Y&nz6OZ?)&y{>oN1QI)^c9^LfKPB560(N)Q{V$r
z-YvuzR&HhD1zJcWT326dquUQb(8aK!TMyGEiUq)4En)Ag5qe%U)$Kl;bu_yzNbeNG
zj}um#>H?1H!~k$8^dv_Oj<LpSn4JV&@8Pq#j3Id8nAbz|Szes!7f0vVpP at gJ1>l~V
z9L_Ee_g<ja62qo+Y0sv%rR2pKCrP|?18yvJyymt=bp1UFS`u*g;m;&*ElXer!X<0k
zf^P%d!LZ%1Ltw9i9g5bTfgRS6DcvB2J38y|E?b_-6p&{cWb}p|#2vWn_TW}t#1pRf
zp&@)*vZFKo8*c}GySl0*Mz>OZ+B!yka}cX=k68Cm_kx2}Pq4aOc%v!F8aq?->JaF9
ziRG_4m<3IiEa1Pr at r%wg{@gD$I<#=s%mY^I%tj-RL#sr+k?}0zZJZ)>)%g;=;TZ{=
zg5-WV?>%E3$6sX~H)}72(cPhaxZ8_w%-n|B$hrvJ9c6eaAXEMl1!9CHd-yp^V)v=s
zoq;{OYJ~)okdv^Xt6ICqMYr5i3P`qi;JI&YLZukpHW9qd(1jN_J2RfBXTnbwys at bd
z<_4cW+ZO3fIeqrrwTmveCU}G48n);{)f#UATnURVY<#M1Fx}oA__`(Ro^;apeGlD>
z_=ryL at HU~*2Bfg at g;_%S0kqp#>J1bM59lprxN8{Nx+xX4pp!(5SFL^y>#OmeRsQvr
zgtJL|4%KO_!%_;`#;Nt}=;y)8_4J^g$)`P3I}O#-L$%XVJw4|JF1nz5stvC;Z+o{U
z!4kjiUF>W=64C_YTftOABWk$huI}$qzgVxK`+Lh|xpt4swG(Se`c|tK#Mv$S+$>#>
zSGRk3?H<dR;ir{ed at X+8z&g!o@!ZwGjQ6Mqw!J6!K)T1+5{gsO-V)Y#f9qg at -_YHG
z?r+sHUMGHC7vG$mIzR3WU!^Zg60NHTby@!q*O;l<q4}n&EueWosv+)a at 8IKIr`_iQ
zP6r6-maDy5vFgExc4SuD>UK2iGv;ExJ(n>zNaH=5Y8cds+oN+MuEUsKZR6Q^?<WtM
z>a_BHi`J19miP^2dg#A^F80-=73PwM#v`QP+bkimOQB0b^qGLqFu)}`o7ISk;wz4x
zhi9}zK|kaE+IOts(~~ozYj9#5YLss>|6(njo<`$&dOF>d7}NpUkdyO#k=8U1jsHxX
z{))I60~dI)P#Pg-s(J>(?kUML2H};wdy3B5+N?+cnU>kD%6G1A%@~ezqaS2^j7^^4
z-kO6!LVW%10rf$W#(OpSXm9QF(R!oEM|Y^tN9PS9AN}b*9|kEu=;OYp1UOq#gSR^M
zm?ylt;?UCpy&-gJ?Y^#*X#?x8!wY?el)IpFBl#pxx+hX&Q|>BdETS&IJK~tE+Z{8(
z2<UDPPgw^oZdvu&^`u^(he?P6ZEiEM)v%*{Ns<G0Bw$PZrur>#M=O0Fyc#*Y4bzER
zQD4b;RVmq!-vPwMdzR;4kk84XyJ7PP>mO#hXA}r{)k7PITPcq^dLCNl4am^##f`a#
zO6e;M?xgp|H;?cJ<Bq_^7HIi!baE>wSA@{74=cqyq`=FVmar{%g9;yn8M!$(lIfc<
zH^$CDx-VKx2S;0xzc;jQ-z&j5weO4-;Qv93{@@t+KSr1$V=u!z(mDDa`D at BI6h{Z+
zc4Fsf-1{3H<-uL=(bwYbkIvD2%P-&v(|cr{qYWOToNC;?y1I>r8*p2=GwA8VY5O)F
zK9;D%H3U5iq?*p!i_zjnN$zc$Zpo=(qK((!&Xh5>TYF18<J%0FZBJz}J at aaP5p_EB
zW`We|DsW}FhCE!85i=+<BjDl4jHHJn(XXv_nKh>lr$y;D^h8B(=stYw;WagH=dCk+
zM=xVoSI at +~yy0JntrG6)V%)gV>&&Thoxn?lsWVT|xft^JE6HLwdb;+Dt!Rbh;w2C9
z)lUyQ7Yq2dhn~*TRj;iR>VjK?+Cuh5)L|VOy_(k2|JrOVjsL34vuB65jb=RLaW_tt
zJJVgBp@?&19-D`rA3g6(L>u~I^qeyx=LjC*(c#Tv$fd$<^XjS3(r<z(^`yYZ3cQ4@
z=;#Ts)4b$!U7m3sBqc_NNul_?)=S^u+B0Eo7hw<2iDsd#e47dBFL}b?Gq~Cy*KokE
z+)*{SS)angHw<<H;-`ATt%FliQo~b5Ir$#kj2~ym?3jYkRBtFk1|x)js0RKM;6E7t
z at ksR}Y7?0{EdG>rSo~K+SJY(Yn0o%16>Y4jL+jE{b&2TH8ws~Br9p>m&o39c$I5z=
zHk{J|M>phD^n70(NV6A7Ucu+d?oizEj#y~g+7A6G at jL&aKwGBC(BBnk(~tDp)jjjU
zwffQ$GW;*Sk};Nuo!_c%=yBV5R&j at s`y16Cx}kQSQQfU at f33O&xKAtY5NMa$c}jId
zf7Z at c)eZf;JMlKOaUtk;==9q8n(BTH?l09i(CfSNGvdObUN0(sVU+ht%(%dJX9k_%
zC^m3}`ak at tR@<nauQ3k at M_h27JR%&)I<oPI4erm5*n$7vBU6uTa&!#4+Y*7hL~?43
zOlXoo4jseRq{gO8M{M}rbYu#CHy^R%cgvBf(Aar`XpeMT#^?Y|O~O^UAwtv_{CCOz
z#h3ddRi??LSqEEyeFyBxu<wLzg}om3B-nSsw!pp{UzN%qeb8n_4GvDh at 1}!x{BAxt
z6~9|>kIAOgAvhCLdZtR{^p<Z;FTUKLp=_kfOpT3uz#2QfgvK50V))+ye*yNLuqVS_
z58Dd+F4&WB(04b<+n_#z=y7FI|Hi*6G1n0BjHBm)#~&J9$8uv>Pi~Uf1No>Pp9yo0
z2XDtWyAl<hR3hX-gas`oNh6rzLicSISW;-WwtGRh9rv;VyX}JMK=_e$NY&hh+(Ab|
zYs at IzCLXoZy85bC52(yhFW;-rh}JM`?2IlUn&Ew48WsC;Gjsu{4f*N$gF#lqOqL2-
zu`U?%UqUVuH^4_zH^Uk`YwxTmwg~fF2>G<kPn|_EXLNyTJWw|s^HXC+rfAHF)Ij at h
zp3(G6S2NWt3)ej;zV#0?4`4;c{4i=O%~;ZKLBE&L-7-jnU^eTy2O72lGots(GQg(u
zh_{a7AzkCY#9gbzeIQ8IIC>uML|fImpcZx0C6+Pf@|tvIKV3z0s!woqymXw_r&)WU
zPwJ`$4SE;1fV(>I4o)#@QABqvJ+~z0i`vB5qHg!{-HD(BlJ>0FGb9RrQSfUCm)PX+
znT^&XpqTf~Jh3@>vUR#`3N&+jL-Acxv6Fyit&C`9RQdr_Q8Y7UtkXp9Jye~PaUC;t
zzu0}(t}lfI+kC<F+PJ#Us<W$y2zLzpIU~sxlwpQhr}p7DR+NL0`8aM{GV7rKelY_#
z#wl0lC7;O>GHe6+UTP8Xj)LMJd<oj1N#Ds<Y6sdh8+6+PpovNxog=$2w|xi7#^{Fp
zAMOt0opHy-$FGK*Ke+IgRajd(Q}HSdNnubsX8tIa{s;-jD@$ek)7_Vov7Yp{i0W9r
zCEbScjB&e3L!((4zftKM{)TaV5#v%Gzv%I8bTSL+j^p^!&qHSPOAoYlbPa;;##OMN
z#r_Mr60XZd=s~n60VC}zYivrs#GpT;)9|ySGi`yKDk#-(RU0r1F9+1N9AuPBH`Z;e
zR~pb!5uh}_q<Ael$>WW(7qA~47auEg7HNfQ4_wRfE}*{WN9-Oh9{;AL16o^R2Y<PU
ziRi=D);ILB{|UJq+?d6kzl0;e)k}L&E39y%8vFM>mf-GFsCPS7lsxpc9eoYizm!Cn
zIdXdF+<-1UjI_aDBF-&@gDHn#>K&bt0g!u&-*Pv}C%9u|3B?%9D(Uj<)zk5m5Bh?|
z*n4q at PW5@z-v=-5?!#NZ`y^1y(5ds^a0Oy^c}v1rj+f`+_;-kU<Oe}p3f_up!yEAI
zN6Xa_4 at -Kl0q%C$jgu8V!V(g(U$(D~c!YWn at MF+6cnS7H(lEr^2bUXq-$NoEwVCjK
z>eUekBqN~5;i`vy2)<6Z4 at xsE*G4=6*OTylifAHy#Xm!@R5NKK#n;f_XpZd&s*6B*
zq}y#cY6tF+4t<Vq$5h{B^b7RN?jH$F-jHI|gZl6W$f>oGmgr=p1nq|#wubmOEu*%4
zVI9U_?<3y{SgGO5PXy+?^-wUv-v$lzPBnV*p)Blz2SQWNpk65cT^|p6BR2j$#Csq4
zy!(Iat4(&xQ%YZLN|O8Ozak#}Px?yoP;W`6EM;5%ZrQNqExc9{vE^-F5_;hsz%8iV
z>(T_&^9{s!&t{5;{<AF~!xoVHX9zvMX|eTa{D;uuYKZ@<^|ttr5bu*s8?A4|p8)OW
zh0n*E0<D|lFQRuqS;uz(V?Kx7>F8+R4?6q}>tH(8;ElD$eKn4be>$zV at jB~4UT>}A
z11u{dPD=5p;op##2jw(dkMfZc=rcarhmpo});IVVYbif~C;&bVuB%|KM(iCh_ruh}
z?1b3`vm5yukT2 at PhY+^%p(rg3DZ*g}!^FezFbOb;FhgLHV1~jBgBb;r29pjm8fFa4
zSmbdH%(XHWj09bsg_%E|X8spGlJ%5A+cP9_9bQm(nknLB$S8JLo at _~D&@_#8h1Gpu
z_c<FSYI8LrFYMSGRQIR4vN~3GLtU*$hu-q!7Kr?whVJ+`bha`;w=#ZDN6&q4>TDZ&
zJUyRa>_0<%sgZxC6?o*aZxf**sxJNvUT6T9#V0^RNyiKKIXb at ULFpOF+K%#<x0q?Q
ztc&%;z<*{#7HOfh<hO*w*XY3>i$<=b!|gEI9ip$}U+vmxofQXNJWP0`q-WM=6Ql&p
z5}}qso3-8c<}rAK+>m_Cl_-8~UCmoO(2u-XQzsB-V6!G;XJ8O!E-lVlA_Sejpl;sb
z%=+f8W^k{V2CoGwF)0?s{&mbl&7}85GZycA at 3Y>58svz=Bdbt@(U;ZWTD1n)1&L?m
zIzXFee;ugYjK>0l4mTgtC?&H`ejOgQgK4NViU+|QP!uvf*?G;)j?QbNF`t5Ve<fPL
z>60Lcx?T4RImYL9nX|Oj72t$utF_%>c-c)~3tpcTkCd6zK6U{8a-=1I+Q9zWh1qD^
zNc5Z72s-iGbk9!|YFP!pA|^82yR`y_9rnl%(C~s+B|Tan50y4}rw!?!c at r9UP7asz
zT?c`zh`eOeU%~I=9UcFO_P$#jUa%>3e)5qSTIe{u8F^|&5fc7#o;U}?3+7b%>rq15
zE|DdOp)+_Pgz7?ZOd2ut(}3de!V>XO at Aou+y7<)6<Re1m4&$DNO~M<|a?PJL88g^J
z+6>cS;MKQ63-lFk8|kudEnp>LsQ0_nShNN{GYUMQ_L7h6ooeF6P-|WC5pS^IP8Qiv
z7OMD}cH^n8T0FVc%I2abxgI^ro<i at y)MS??FvveQK|>kVuYgM at P#b|XL8ji8d`$H0
z>G)uz%j)QeFGvmeF4PlXU3=+-b?tYdsj$zswGFU_b;o7w7z{4%L+^lE>BwOF at G|A4
z6ODF2pVA9Z^n&}P6VDCn^5Fe|h$W$x4NF3b!w&?2j}x1G?5)Jqm`f+_O at ItQvK6kj
zXln{`oMX^_idXTZd}|o;guXY}pJp%v`XL@~2-8d4$SGdQ=_K^zqBcS2j8Y=}LJ=mH
z;K6&78~%_N*aJ=xRzkO<<7_NUiU+&~N>8bJ;}UNHV?pM(pHNTgzl81N15NH6q`t8}
z2b^{jyP4h)KwJ}h(#~*N&$J^UVVeLQACU&g3W(Q$Gas48YOblzvPH3i`fQA7z9x~h
z?hoN>M$}KSM`_$O>GgJd)DU;g_4QNjQKJfK62UJw+N09=8j_w2vU9k_Y!b)A9c<@J
z<W7P+1oG#6&1kqn?c7ke95>9)rBOH!-*7u86x1ZZ6#)r(zGgUFCOcP7;n{FU+BwNB
zhez2tH(xUhe$jUBQC{|=mmv6>N$`uY$Dt;aPpmzzyg<%pfIXI(kWVFi<Lt3Kxktin
zw#TNCI|c5m?6Cs5sSQ`#W1-D-1Y85{u?41@>){$?k1aRVB*Qh>9_umHTmx6UJ@&mF
zNb@}0yggcHsu>Db0?h at G9nOa?8|8HBRg$wKISl!(>#KSbOSg|TF}${b^J1J?gdtVB
z-lW at L7xX5aUg8W{w*j#V<daO;<i^Paoy?GXV)wl^({rr*KAe|N1RQNo?$<DYIMMnv
z_{Dc9k`#(01o>@*gw1sxMGkc%=Gcw0#EeHi$KFW!lqzz)^p&FZCe1X`@s6{WX>d<P
z7*0ksQ&l&;k%H5vK3GR?mEUf+4- at IMm1KmC^>(+t)N~(CoFrCnM=5c1Us#p-hyzS7
zyL2GtQj}^Tc-Ks5e*Civ#ew#uvmiQClVj6Kk{T9F5-V^AJ2P29W3fHnqnys)l4Uw!
zB<%^*mq$rH#*$@vQAx$K>uvEm`D-+yZR~o4A|L8=$ReBA6x4=Jgs8kJfETGUGZ}yv
zq0i#_r4j52c$1D~mE+u-ZDz=%LTcePxxHDYcgfytkMB|?7jO~=A9<YW^^9$*HOksL
znJ)^Iwpk*MQXEmoDFbZK3IIEnDDspT7!LI5**b!PEz!fj-o|6M5e?UA*%bxXDcJ?>
zvcp?tmkF-FJ%|#JCgLG*7*fKW7^ASmYB0yAgvvbI5Z^HPfVxRBN at 3t`Z$!z*VOQB0
zxIQ7VE?dNLvPH}|A+Z~%Ua<cFs+)Z8wm~8o_Fb46Lt at v%+zE3B%sQCcVQzz23sc!8
z?#_IDs4%)!zJo6CqE^Uq8($62OY7lqyG0bVPNNW&7Sz2!faFbg{>gn=Q7rJm&x9;}
z=<WpX_pj+~aSYV8-5JQbM~OV~Rco2FA9RwyH1_;<w##+;(Q~o8-a7r*xoE+u*Uidh
z#_s*Egh-i!hFx`X-x+oevRo(kJ!r&=i_{`k-d(O&1R?FNpxT9k6Ow=FUB*1VC$)Lp
z+r})d7?^|8CeRO|UR_pBm$5o=RxBIP9eid$Tcih4v{ER-!d}rqT2|}Kaj`7zfsjQ}
zF3mQ#H&6th^_F(Ar!9E*GGWf{>jdrQGxXgV`_y0`-oXS-HA=TfbfF%psiVpZD~pzn
zDk at vGs%-VBiaRRuWsiKtBY#!V+SDS(l9MY7D^}!J-ceq{TPN{pBluy%ct1Z2KQnV-
ze)jCS`MH^Mr{~X_H*>@YtkrC8Zf5rMDYNkD7 at M-La?I$tx7#X<DpUEAHET$}u)iO{
zDJcu=b8no>SCp*evvVf!Y3tH6(#EBwT|agtUr||DxwgXJdvtm>zp|{XoPyR=rlbTz
z;9gBlNr$FotQ*PCFI?FR1pjaIFIinoxkER_)PGYzf1H`w^VGUtp&r?@XU%fVvgc&-
zb8~YtoxK(ORc)a at pfBEHG`(oeZ$<2nS5{ie7niLnT(+90BufidFG)xs9n)xgf2?2i
zZ~B;wEA?;sb!orq-^+6NjmrEV%IWK8`vShWWbxW1{M^~j{;vy_3I6_SYz^iE4b#HV
zFa47bo`iy}X8|zuuY=LTXyBuT(J(FsN at 8G&VZdQzHkc%su`uq_jMc+5z!-l7(FtRM
z;b7um2Ey<#NifMUBVp2D#_A0aQ7~W`F|ZjL19~0&O&Bc<4o*-$L)r45$e4IPW7RuE
zmb}>oQw6gTMuOP{vl(U!Of}3_7?Dle=7On$*$5-SY=YSgvjqlnNZYo;P{uBpDwvHh
z63ix;%`jVFs$sUmY=gN6rUqs^%)K!8!63a0>0L<gLV6d{yO7?6^e&`#A-xOfT}baj
zdKc2Wkluy#E~Iy9*51Z6x36QGJMLtf^>=~4`v<1kATkYd)NGWPX47V-*;36kTemUI
zJvB_T{a&WI4;z~MYnf)}E~eRC$25EPGR*@IGR=QI#551 at W19VLrg`L1rg`iD(>#8V
zX>bazIrJpcJaw39{&<9G{?q_{KqfW-CJtsG%pe$iHT1s;{cl45Lplp40LB0l2xEi^
zf(eERfeD2Pg9(R$Iv!HY&Z1zzreqvU3=Bv)W`?;6=4zP1F!3-{R)U0DWW}+IUtP`q
za&a)5ShB7>p9W+8nv#;$m22+clZO_M;4vZ-5|DsRTv<M8C?=^2#adP=LnXJ#)-v)$
zoLMs+>f|>GliE5S=@!^>lPk;kS=W!ioTs>_l~q&%f<p1^8PoY98u%qV;;b&?i&m~c
zK&CTmROYlSd0MDkwyLCTZ6!r#&P-eW6vwPw0vxs(GkGio%PPy{`MEc~>{TLrvBILF
zl8OpGCvzsv;!3=UGjcFfEa8jFRwLy~xt__nvL)APqLXIo-w9XJQ|HKus4i-n%l#(N
zU-sIH%Cc3<?kp+hZCO+Kd6_x6{0!utRkCE+YB`3S{&(X}SzWBgoOq>pws|w1|7o6m
zar^VMOj(#c#hL4vJ<H0YDa?XzNUo7QR**E+PA7X=F^)jkvf`B`6c2F48hF57bE|Bx
zB#_|pA{j2Ztx&crZl{zZ`Eoi!A$znMkJe~%!jF)zQg%-)A at 2!8EBa7v6~3K<dN&O%
zzBz?{5a#Dzc11TjwijowfUMN*{Ww2?U%qx#IbXV_Y!#|fR8n5KtZa2Ko2VlD|Goyl
zQASZ&MSfvLMadckuY)Jvw5Ei{-m=w8_}s!ZOG+yF9AHS<>YG_n*_x7Ks@&qWrKKfn
z(Cd8Z+LbGlX?%@P$7b-v+_K8TmB48=E)5zPJ4f<L$jm7-M`h>maz+(EM>&uMPwY#9
z6$<U0Sh!>fzk2N|eiA>lcqCu6cFh{h1q5N_BMLr4F!k&2{ZV*-C-U;w<cC&Jhfkb%
z6D`Xid~WWqt4tB`si~As#_#{p4`s_H&Y3r5-V`2W%IrRv$KPB>-V~m9PRX3k^V#!q
za^yM;EmHpH at Mt5&>itFg3FPleN#W<_Wb?djZZ6NyblBj^%+2KaT*u5QO8$NEdef4J
z?3SlJIF)$+qo&A_se4h6HTe1!l_hKBZeuyAbJ2rDC$3ZS&E$)hm0;#vR?ee(g^O30
ztyzWd4{}$IGBLTLXlY4t{<77jW%-z>6iAt|6}Q~!lc<^#lQDk#Vv_r};*~60UD+2=
z1{6A1MYLaMjCNQu=gysylPgawBl$HnEwF@~tbF^t88hI-xG$_&qmKKb6=*k2>iM=Q
zxl^)p^Ffe<D&>Lb8P}(cO|y*wDc{>bq`fRI=Iq`e#ow7TJ2&5vGbcZduUxZi$r5Ej
z_*Gc??}Uy1ov<;#6E^mD!mhh4j8>)0?CdFX=kil>a%Si7s4hRZcjrLOPQ%}IWBr;v
z(SbEDXZB3qY2)Y4aP}rwIt-Z67p`QOsVsk)#l>rA8Jt~OT2WFdlfpnFB`)glyLlm8
ztsKTy at 8?kJmC^q>`tte@%B5wSn*JNbvWdMBexuy${QKkbxWC_C%sRhYt{VPZ#ridu
zO}s4b?-q-=(=u}~H~pJt_kWMysK8jc0)BIVU%tPM5x|Md<NXI;2x*9z%2fz2b$6qT
zL at YUd0}W%)VzKbKOH0<2 at D)qT)~+n(7nks(<(XYsX-b!^EU8FE6f9b0t4nC at 8oDl(
zw_2^hKbyR3%I?SdUd%-Kpq26|B#lquK{OI^I4eC3QqX>3>HT3uP+k@`8evO8OZF0%
zeUznN`Z0*}8-!+G`C}2skLc|4r~LZ~P<e9c3mZrIs>G`wF*-4Gp at YxDK3An#(XW*y
zMU{L44^9TH*Glt=dQx4h3TXvUfkF&o)mdCvS*SX1D_ps(Saq+tU3H*<{H3(WD=^Iq
zz5O{Jb-MylJdx^k+p at Big+%x8nCC%qtu3$o_jN>~e7~yYloS>xr;Ql3V9m11lH~Le
zy)}|s0s>NnDV4Hz<QJ{+L#T-h?7Ym=;fsovmG;x@^X6vdXXWM-Nkm;jpPKdYgBC9-
z^<xI9Tp-4R!~RX9l8egLuCAOQZ*qde=p&S@>i-VGVSOJWIPCIP28Ug_nZaSo7wc=M
zlJE)*EnK=dpYmJ at 5;|X9pZG~w!O*TrldMB4l1Gf>Z5T0VDFOIuQ$Z3|fJQ7|3L1|u
zEnKz|oD!m{{{KKJ8i>>e!n9vizrX&NcPK*dnpaXx1QK<yLeuoObISZotlw%rB}6$<
z(wVbo$txmuhuCqfVbdITR<X2 at vZO6vK2a*YVa3>Llows*#lY0ccM`)8B+If&D8rQ9
zSO`lhiDOv462p%eh`^`SDn2b<xwfRTtgLeBC~P>(*H)?w$EAfUM-{HEEX!X~vU=3w
zN?=O*`2520<Hx1tmzPzH0%AJLZZBDrkItwlxpi&H>Y|eTl2yy{v6%ov^7v0XST)RH
zKT{012D|tw?8-N?9ZZ6~3HD>`R`wTWWiMfW{xSnU0=xeza0rw*1JyWd5GNCH7~;4P
zCkSyyB9009j6 at t0^0^Cfiq$x8B2EC}#Hw*()i_j^MU8ViOXbqI(cD;W9Ctl8k(<O#
z<}$f#&dyEaZs2Bcvp6T0!_DIsa5r){aW`}M++wbnE9I7Q%ej@@YVKC9f?Lbo&fUSS
z=l;NnToosAo4IOk8 at HXikGr4S$?fL$a1U}1ar-zo_b7LOJIEd4p5p$<{fT>;dzL%O
z9pj$oUgTclJlreX>)e~%TiiR`d)x=yU%3<9$K0pf=iHavSKKM?YwlrgKlcdt8230=
z&ppW<=8kX;$l=f2b6gYmf||o?+#7v4eCU_M-{c&=;lAbm&i#}7j%(-6b3btxxlZmE
z?h?mhv@!Y^LyR#dBql5-A|^5>Iwm$IF6OG3fiZ()5 at LqL42>BcGa_bWOlnM8%;=c0
zG2>&dkC_-VDQ0p^R*Wsi9y2ZGhM1W#vt#DO%#E2Bqx5G6H-WQo0++?ve$}73+<a~!
zw}`uiEBIA^mUC;kN^Tu at CwJGc`m=_+m)pVZ;_A4)zv at q=HyXHSxW- at gC-p`P_b&H7
zcl=lV*~*>f&Twt`CiF%6`%}rI|BEO&yp24rl*3u%(BGdwazAq&To>2v*Pp>Lp)uhx
zQ8AoffATSjF-bAWG1vI@=eU at Rm<ch~7{RYUXT;2kamM7v%#T?ZlNWQn*<zk-&NSQ1
zQ_T+Z4D)RB9CNODf%!)BB6GfZvANj1#Jt?R(p+X<W3DvcZoboemwAJ^%Dl<E#k|eD
z-F%<9*1X%i$NZrAVe@|TqvprW_2wtde>69kpE3X0e9Zj3`7dUV`4#i)<`(li=J(9U
z%^#V)=1<LEm`|Ep&0m|pF}IojVgAnCZoXjt+1z3N<^QAZUBH^S+Q-2NnhMhfE!dXC
z)+!=ZdLbZ1zt*oBYt=?dBjSZAjzYDqmEzsDw3Q?TG@}f;Od^DkWD)`rxdx<OC<<Du
zscl7w!e}5MpjJOG5c!l=_nm-W`}_U&+5hf7`|Puuc$_n5&Ya78-t*p12!0gI;`(yg
z+_7AQ%i)ga26CU{26K7blfgd*p9%gs_}Ad`!7afTgWH2I2X_Q_K?{AsH-c|L3-^LO
z-WLA+-)&(c_a*LR?o at 6VcRKe~?i<`l?o4hB_aEFj+;_MF?gH*2?)%(W?uXoXZUT2D
z7v-+zuHmL|*K<GPe$M at ZyP3O<yMy}`_Z#jmu9%z2&F0Fvd$|Nx$tAg3Za!DfHF7C#
z5x0bE<Nh;P0PuV-_<exq2f<4Lp38$10iLV9 at LcbO=NDdhe(8m02Ea2jcsIavZ*VTa
zQysh?;8_rC1bAA!@I2^+XN?!0KX~E!Bf#@)@Gk(*=3pnlvpv`a at azii1$f@@!t<UN
zo)5k79PNeY(*VzL+#rDG3tR>oFLQqac>V${v_KmSJYCSjRc{M7z3?0Wcn-JV<88tJ
zf3z at _JB>R7;Q6{2o^Jv?-{#H*c)sg}=MsSDQtonqXQCIL$pFt!xf=nVo4oM+65#nA
zR|4?N^1?F*;Hl>B2Y42E;b{SQmU7FvmE4zElUY+BoMbA5XG~*-v8J<Tu)={pzs`CC
zyn&IdC{{G<P1Y>dY}Q+>IjnbBb6M~!J*@ZO4D9=?C9F7>h!xLT&RWSrS*uxVSShUa
ztj|~*S!t{-tR1YcSl_ZTfZFe7?FFu(X63Q;EQ)1i*;tjVTGmn4an_G42kSiR63fN9
z%KDvkkM)2BOn{X#Y5k-%@E6Z#&6)-EnJ<flOlH2|5192fw3z|#Lm7MI>yHe7pGAhh
zFCpG9 at A=_xc<}J|tx3b*lu5(iS0iT53V$OiCJg>#(zF?`M?T3j&$d86xzKwW%wsQ%
zJ!K^K<hllC`W4LX$^Db-llT6=K0X%fWdOH7*z%tm at umC$9C#ma^LL at 70&Mx~fotob
zMg>R#d%>1p4z~PhV9SpJTYeRA at L6Eb{}k-`{b0|}0DJ!XV9y^59NY)|1|NdoU at X}6
zSzy;^dF}ecK7<Ug?>`OpeF*Ph{S4Um0^lF~pcLyBz`^~1g)Hb{3}E6UC}9CUvH&A9
z04Eu#p at sDt+`kU#4M-7yL3~J&tRWcDhpd at U7R|Z?`1%?v#*4LM0B>Jo{R8rEL7Q*G
zi06QW at lVz|z~qg9%ef$-j021YzaX^nE~EvJ-h;juvT(rhO>j;O{)7rV5wgAnd}py@
zSvy%DKzSVGKZF)VfcZ-S^Wy<Z%ivi8<d=h7vjVOw0g9^tI}#zGFuIRm-bwJ at YDgHs
zXboJ~vi{9VhIywzn;%1;>p)go4-(KPaQzf!_!*=PQ15fNZUkIQh4claG)SAEzs-=g
zK-vmv8|xZtJHTlNKy at d;>`Q?ESMcuF&`LVY_8Z853+X#ZVn|sq_iRYue`10Ei6w_T
z4hj5EfCX^K9oirOZn-cI1+12m^_WEh#^eJQz|l*V0U%(6s|ntr;CT_`4?rpfSX9Ba
z1`@MR4?(JfbQIDtz^>!4$|qsPPQl9m2ypnn`&q=g{nBvyW6>hkA4?Yb_<q00=gh1{
zzM(%Z@}2hSBHyqVAbkVLy~uZtW0CJaI~V!BQ at _Y}Y1!0(Tv%sc_z9Ly)-*`3Kzeob
zT-NK5=J_?S-i0)7H0#mJqaUY7jPBo+JNo!z<LJkaD at Q+`G}mtu#IzqD0uNQh%d9)Q
zKp(m at 7vTFLz@`%N$6<H;27bR>UwFs&@vd-~;I^n-R&Hc2Yuc<_Ru1HAAj#o=3Z$R-
zxvUQ$jeOv&;K*kbD`WqYybmkm)sZ}mD`VD3{zJ%TKB+T>mBH+pG0c62k9gv!k$k3)
zcpMb5neshQ4wt7Pjb^bkm_6goj~mYW!aaCb#V<gH$&Y3Gh?(b1K4T<58uIXWzrF1+
zSwN4BvEB?&6v#763SGlzR0dO*$-nZqJZsdbjEIqPmd{`LvA(0c<7euR9sO5++?Y|`
z`7-6>{D<?ySTok!K9dh({gr2p8k at n)(OU=poaBG<zJJS)9?nBG#?9y*50hO3FlXk=
ze4fDhDev8wZ&-6#fcfwPc<^D0FtF=^8pwQnSjUG)#2D`orexe)aCXDB6B2y>{@!rO
z|7-tO4zC5Pa(INS%HcI;ReIMEM(M>DxO(veuEX<%H5eJ9-^g`ju94pPK}`1uoES$j
zeCB%Bxg<6hpuxBYGN5c6%Qn(E3#bTlU-6&&x!!y5Z$J4k!yEOt`v|xn7x3gMsK)>8
zKI6aL-(l`Y#s*m<bNjdcE4}xB^$+9~`g_tocLn at ebqIBUkMBtG=12LA@`bOD_sd*|
z at 0kCe+zsdd$N%sbQ~#IW|6T{S+5h1?%=6)|&)=?p^)vkTlQy1Q|9bw{Ti)^ik1_wx
zQV`61&Z=@*qt&^rFG_P+Z&&29+7INi4wZmCK%2|@8d9k>msM!VWhtp#*1H9{tV_CF
z)~0- at 56_YzeFP~7(#^_T);ExpHSn7bkj6oJ8q!!uqam>%eQ+d~^)jS#NIQ<gnlu58
z{2>?Qkm2uQ;4~xn3(NQa%!ffqS38V@&Sm*S+ITsawf+i>=YR2;%RK+vU>Lgaf92!4
zb&1+g_Vy3&8tZZ=oV)%j``eNo;Z}{T`|vjT-jj=tXT9fG66xnQ=6^mDv%YZiUrWE9
zO4z>nz_dLH?{!WLdo3|BH~)=KzN$Wx@>O9*=V!*=rFpeqCipDv$(-`SgK>K<r(Hbw
z+p*7wzDRhtEcLQtiog3i#pwRm&K&1sv%dLm_3Jx6%9n3lb|~{RS7O62yPiG${A*RO
z1${Rze|7N!G8+B{$2RPH at x9wC<NAYU$$lFBzU!koHD4`0wch#kZ^Vq#52nwHS#tNg
zpVl^|zJ3d<_Pg~<z)j^v-;>;ZsU-n-SHD;B{3o5&TlNKYYXABE<TFvY?EUG#d~@OP
z$)7KciCQu>V$-f))~E1i^CKhQ<VObp<#;*v!-RhWI7cB2;edb4-i804(2e2zT)2lH
z17V7X$@>#}u?g;<(29(|<v;ve9u|~|LGgZ!O!-JVm4D at 5?qupPG{V>KZ{zUNEO?z6
zlQ%!toBuyQ4&&e6^>+7!F8vo81eN}O^%*ncW^UM at Z3*}0j!r+j=@(9~b8q;nSAS{t
zmGy2q at xxo6?E2@{Pns`o*!uLIv<FMBuVVYT4nKHP#e4HqME2dn4;$YrJ$rS0UhMiS
ztLEP?wH=*4YiZT!N=-=K+_<aF_fGd0p873g!Y<R(t9M at 8_4utI`^<k%*mL~n!T3Kt
zUFU)argkhy7)*F-%awKXzgA<{{SFEi{o_H9J^ADBF#qz~!SVcv=9B-7cyDRXsy&x(
ze)IZokA#yu7QP>Q`4hzplA9mg`o@*>rmZsWi_qNlr=E%X!OCI#UD!S$CLnpJ{?YX8
zrQ)<L`_*3 at Ii|kRTJ#isj;vZWZeK>|9>3*=4-Wn$iMeZtEq>)6!T2}&bv{2xld~V?
zZjUjqjE|+7cgIt$c}|KZ`DH5(;BV_mpDR+5{ip{=m-ZYL?U?uOPY32}_|+YI`1Xzi
z<aeZbU{wQ&*m`uL9X&_heqXCbELg3nTdUrd<j&8wt`s at n&R&Q2MJZRrqcz=Dp5~14
zd1XxfvAh`lvBI?S$9D!D8-nC4bX%N+K2JyzC*YRE^YRn?^LRb`iu+~<iB}V2o=(#1
zdA1JHe at d*vQQFapSL=T@`GkBou#epu`@W;#PBFga87l3qf?r<Ba=(J9ol;z}Es2<b
zB$3YzEJO9q$9?%5%lXG*%DjD!YdEOeWGk(g&7_DeGbx=iz^b3{^iuuT{bjghbdqlT
z1fy<yfKfUgF>8<GrGyqYbxRFYNR0~(SI5d71*rXstlpe%G27CM%_Zqp^MQ1exjfxy
zu1GhV52jP*GOQN27;2GTeh=aEbQWerHBmLclB+0MBg}|57)<=ssH*eYY~RrQDARev
z?j%ln>=8%7kXfFvk4hP3Q>CzMxhcLjMT(D2lk$vBoAR_xof2RpQ#b)8T5tbn#H;pq
zIy6X03Ig|q_BoI*Pl<;7e!DN^52nOGKHokH^3}TWQPvdxozuTgkWayT_EBj{rmqFX
zw0HzoxdTZ=D8Opkz;d+kzriX3l_V`_Fop-&>{~6i%B{t=s;ySrp{*uc-BzQmW~<p&
zyOkm+U9E2kAwx`iWB{u}ql|Gbp}k{&R2{9)HjDM)AL{op>nESWw at jiECp6Tv&&O2Y
zHBJei4(LK<vG?e;=$%!q!h63?Dagk3&O3(M4d>B6b|*!=>+A~qX0Y)py7O86Gdv at D
z*>)&pf~_Xyd0SoLWz>m^(dST^Jp at ZY-+Zg6n$nS~N}@J^3YHQT{A2<3?k&4fO8QYL
z&sUqJGJ;ADnp8}y?B-Nu{D}^dIH)2Kgs4TP1e at +sO#Sbc+l%`04J|3!c&d%GznrX&
zuU<8wI^@?}#FC<}FPf}&C-ABG6Z8ZTbwM$oqBq7=taune(fb#e==F9gRw|^LvKJWX
zF9~a^65y+KN>j*GidNXCKwopAudZNwoaD%OqSPSst5&9pQ~68WJ11-0326n3sfNO6
zOL47$`Zm~ZtoM%FZiex9r3BR%rD&P4-?j3Sq5sx6>S at wdN7VXJ!5Qv!{@lA3X8gNe
z^46!A`jeIJ1nGT0%0RlPhz1zzo0x>IJ<|ZNos8+ at s@r6OM9~=UyEcAuLy`18B8ga1
zU!){U(o)p%6kTf%Nmbr0;U~vY&ycQfW9^Q*$$9PsCAlF*Ns`;rlu$<o<04@^GMJ;x
zK4tQLcLL1w=h(9gD(Oc6|LmrEEWf at etq`8)+ovc=bp=lvP)z3w5;tv?Pf?~CcW4uk
zgK*uVE1GR(p9Z+pZg|Y at z{{cR^AxhPg`35Uktky3_mxgSEmRSu%$UZKox5SoR*YE(
zllu`@=B)?g1vuOw4ls2BhU=7KdRIp5`LopwtT9+a7)K+fbtf3ec7P3xUrm at fnfimg
z;Whxq0%}1kQOvaAH{6C1)7BUD?KdTg^}ZG*`B^7Mx{PUsvDHHvF=g)_wgc`3R+1Xe
zi(%Ub-P4LX|G_Kn{6}~YItR_eZ8OxwHTFfK5sku4Nt%7q?y796J1d*QCU^$W^TM-^
zJfWyV+ilYQsViUcyk~;=if at 9r%%_xg;<hE`(<W&Rl6)Z>H)}JIVn^LT5~j{>5|@qo
zCT#hj6kUPO4-XPhZ=V*rb$VgvkBWh!SJXr?``0*0_aSE&T8&=~R}+m&^3Og<-(m`=
z`(m_Z=V7KCmnq3dwy>Flo#8?F{KSjSe;aC}GG9>(`%WpKjn<<k_La_`(F74q7lvB;
z4>+vS`#g$Mo_fMTy7I-h{Bz&F*sbA at i)j#Uab!zL+!#xCu2zz-?c^!qPh22fCRih*
zlAODQS3sD1R4b+Y_-M=SO2Wh`AdJktA%9>BT(hxUfMpgule@|Z62~GwOFeNx>#~S%
zBgNS)#K_U+NFs(7HtG}$B4{ygQEDIX!!^#{h#`S-`VRu?wLbSxXmx-Ro?Q!9JH;H$
zkcoYMa7`FVbc*$C6V}pb at kqDb(A7#SIV#bSc714#<%;LE9{aW%oIKHy4h13QC`3nG
zN<yNq4X^8wZYu=Xz+C?93!5<5g>Dy^2PJqiuK|gqw})D`|K>1>$0THldxDPwovjh;
z$JWtSgiB{3FGa)(RY?k at ijE*GI?G<Gp?3a3_OG5Kb_ZdOXvS at 5wZQBi1vFYJv&_+S
zn=o=PIl^x+xkqK5!A7DjTPHf-4y(llfvQl;)>N4Z>Xa(gTeC4GJWD0ka<uq5kJ+5a
zf0h6~6Puy4W?9idSZmdwPZ;S&#CpF9Of4`|t<KvK>H4xjJ=2b;v?G_Gl<F;7kII}V
zCjG3Kc5n*xJtd4Betua+P%wr>j)q7MR0zyc9+Bd?U`~X-mPWV;3;)?TiT)5imEDS4
z04C<o)y^AAb^LPx at 7}PWLCT||9L)Z}$Y{%!KU^j(p~<RLFZ~2t7OLLT8VY4X6;I!J
ziGP|I_mb?;Wal*)^OP_Tp6uzS9ILm9nlCBHf;nm|8r>i;OAvXZCyMIjpB5^%D7^28
zbryw{-LYUCUB}=7Gapf#_}18p;l7`-!5+PX)npq(j06?7oiK-OKermjcwE={{P#WG
zR4=Ay#zvUJwx3!-vImxPz8s`5QeYOJW5x$`T_vL06nCq`Ccyg>M&?A0wTku6lzHo&
z_tq=DqK~QAe43E1(84$mFfhcE12aQwHk(A%7jgw=**=$Xa-zWa_J at ulrS{>gkY;nV
zcT<`9!dO2HR1Lz|kqwvz)<EN3 at 8q6->cgJjspS*)hgvN6n at V5}jdNx?ESMV4jM$4?
zIJ!8BzJkm0vXJwb8j+x_BFU9p+3(qE#B7iuH}ZM|&SRyMs!;u)k4H*<NM<3?VXbnB
zlKj_Io;0*(%O}x4Z&}N<vA7ZKoo=GD7ZlNj{Y0eRJ&vcjTh7tCZ#XoFQmK9hC$-3V
z7_*GjAm^Cz_6$+W`>xrHAlKYL?e2NB4DS-lp0SGe`4lntSSt_46IV at N>Ad|wgH)1A
zq>P5PvezMsl^eQB`C$&z<UE&=e}!kFi#m at GByy0~B5H5n at 9yS*?+)UXH&9~oX)Wv{
z63cZd#kY86{1!LC4{_{GBSoc71yRbW6qR18CoG&A!Y1zF)MExwGrq??F0eq<+^iC{
zqbkD4$zo_ZVG{R at D#H|_W?`Pd>{{7WuFoGzni~JJiT`haXCBa+ebJW9fFtNJfjKM2
zJu at u9J(G<LO3>}FhHFL5ZMvU}7wo at P6jk6diDhGp2pOJ$B><h!!@inCRP?A!%dzFK
zCu-v)g>^!OKoNR%^V+}mV1m}^QK~n;<$-$tb+5tu>zZsHDU|PH7c=c}6lY<txL~g=
zyTt63%}JeaU at Eu7Q2T*6cFBL*of4)#YGz*{EbOK at iJ>Y~z3GPYnnz{40_~eZ{xxI<
zdKbd%<xMw4rRQO<N9=T2=V*!KDA>zKO|X~E#x75jDbaJmc!k}>?5DVlh!>oXM)q?P
znh at Hu=|+xJ+!J8I*#imLqj2+rk`+F*2HrQwr+7k4i8}MMR!rp_fOloFON8$23TKzt
z<7Xw`MCu4Jo<y!dhPd8+`T2J7tpM1UFh0ExvoAM$_vI}jIYdjOfSk}n4kCTxKmF>-
z7^I<Z_ufw;T0oY{j3GV}nY&Y4JG(nb#17>jZ at t*LN|{O~MzjzTHciZP$oyk4b+l#E
zHGw(PS9ozD5#6#ml_-hW33I>hsKH3*<M1HZpMr;G_GL%u40Vh+=N0DOjd3*0m0ACo
zvdyc3mTFGD`0S$4fz7F*R{@>_m<nK9jh|$n at vh~3;2*G0Kfl1t18_EhS<A_?|Ip2o
z0PDsMh3IT^zPH}vk@=QBnJ=vApMQh*-iXFdExQ%y1<?1tf2&tcD2$_Y*3g<wWAGld
zpLjXqX`rpqh>5=F?8fQ^<`v^l8hLu}zU)O+0&1!OXjk-LcVaC(uR<DWGt}wp^nF%y
z${0w*bZp+~-QVZwUZVb24PJp3IJ?7x9-2|5z)asGjQn)OghJbW`8Er-&1FQlGWBB`
zHt$?qMfV~~^nA?i%{u_cj>k!K7lfMSim1*LT7ZReFeR*ID5US2dSy@^jM>DD`GFa|
z=N<DpSkER}gLkr9I!`3l5+93Yel{f;@Q9~~YouGDp9H*U2JoaKFUz}L)CtW0<~JPx
zdSc=iEo`Qhp_Y?NhsQ*_aW%khVK at 0a#mk6!XY&r>n+sdrZK(yYZkq^6x9s^+rM73R
zSnprdqcTpzNL&)J7oP2iqE2Z=MN<j)X`bZCoH{=TdPBjS;5ni1mQ5&u^_j*~5 at xKn
z^C-ioHjQ7vqP?;Tz<pV0&Cc<S6=CFc3Dy$5Z0C!Fv`1I0?6DV5i+E>n%H({Y)80K8
zYS}s7QOdl(bA0r{okfHs;vHuH0ncFgV1My6 at t*-j436#`Po!`ZvXpF)gJ9nb8ft}k
z9&_<D&xPX9k$ngFmGXy2RXh#wYZXt+ at E%cVn}Oj=@cuY~*=__r2K)%<lQ}%dy$?-j
zvP at AEO>d~3U7Y*|iXi=|K$ZJ*UZG7P)<0!KRY+BPhQPR|j2RDMMePEk=k=yi{zncA
z;E;J0?esvonHekpNKC_~a!&<T>n;R-*OXW*Uz4bj_a at F{`XMBMKleZ{x3OF5>nCXX
zKjsuPSYq=<)FlH^#NY_Nhd6;w1R0zy at _~Ke-&Tm*l<MgkFV5vTA0~QS#>5BsfpoX?
z_drL?<4xtQR*wol5vUXSw<~u~P07nPrv$r-R|eWER;cZ7V0EraW{lP>kdF*{D-Y%s
zsA#CiDqW^DIgzC#?=Hq_;Jre4?<IJq$1SL<bh%QEuS++%icl4P{p&R_$3~lWZgb%;
zx;~w)?MFn0k=KhG((scXJQm)Kn{ta4xvwG9K>kXF>YA#=bNox8|MCR2v>3)>VaDRk
zzrge(Gsj0Cnoei=SEQR7t*N^D3XY<_BHdVj5KF*qXYL}fetC0rMqX)bZ1hR=zA$Q+
zLa5oG at VknVBQR>$r|T|;T4CSM4;z$A=um|ER-NM$s0rACY7r}{L7b=}cb!KS^eOQs
zo}|mg&9P*CJzD7A2e99RY224!{~X}|jtf9X?_N1!!CE?dr0p}ild!w^bapG#4$q3_
z0{qD~S=i2oKYMgms!fWV=sx9R_E$tzHy5}L at xO3XMjUr`^N%+jjF{^vHxyl^+M19P
z^m)8^$^)Tx1?W at lv;5TbF~riIZ}={D$-gHnQ}^Bmyt^O%{6izidiP(^_}!)V8{V2H
z6HcMCezA7!KujF1{FAgith${%TSQC!>%{wftw0k-$4Z-unK6*rNV=y#JX`#y|G~gK
zKMP%b>p+_dIT5M3W#MRVnaK6XryVM!Bvt{sv?#zr7x-PJ at 0a&3tXX)Ep1xo%t!g;<
zEeX1H2s~5kd%5`mHMCY#-Jyi52Cka^z0i*gWD--zF{rO>*!%4j(UFsy{tSW?QXt2?
zMean3(sX5%SU<xQB7t_aqS7BV{gvMGqh&Y5`@&5jh2Hj#oYM4LK#n$rXhcWa7#;Jr
zsQRKpRC-bN^TF?4Q)I at fZ<(SBIz17_{;fJ=HmohNhVv)DY`>!-J4N0_e&S!2l7&>$
z&1Z{g61h!k{fl6}vN-Maim2UwC+TD74(n2~El~xFTeeo+-J<KwPRLn~Cvh@`#TWI9
zsoPbB&+9ya+jEv9Ns|*?7Hs+6DU4jcGEn$Yzp7i4z1F`gN^{K=d4xO)GS-|(O`MXB
z7CJ8`3qLxo>NdbSSC6c7`J7$d#R=P1uSGYwY)hsv_KUr*aFn+`h)mf#9rUxVC86#x
zUe$_^=-e(T+?$q!?hWJYAyQUOg7SR=>STIT-EdnDyYBN4OO$TKa=NAKK=$W|1>MsP
zbgkf-oCG8Z-c6=e{y97uz(1c^FHvcGp$K#~(OFbUyqDKIWM<}=Rthw8UDUk}a^W9f
zf2)D@{MWPEbBeT5p>~Gi)|Re>fKrex#7FhrwSW_5T8fm?{Ybga$+5<sU)<PHC_K?I
zelgWuC^XTVg~!_zLiYuQt3r3z*GAk28(x#trW<&68gV)^N#~qo#gq))MGvjq;OwFm
zxGAp_F*9QkDVhD!Imm8t5Aq7!VSxqA-l4-C3cQ%3>D<XncCX^q3n-+sDVsLoMtHY)
zwx_EebWGE1b=P4A-?;k%tf<y-4PS?p&py&^r%&J at i$9<oCcJoRdx4pKoG4=Y))}*`
zj7-6_5w??9ui7whhvBE_HZMId85!dvZ1Ay}-3s{D)X+tf{uRV%9!0W|I$ni-W^kFP
zy^X?g*n{`JUPDOP=M?#IiaaZN?15QH-aN^vZ?cGQ`DL<y>U at b)qklD6;b)@ljs~n2
zc+;uQQ at AYiqZJCzL9E7kKfMbVfNWHj-u1vNsy37_RuG^k-0a<wl4?TL(Dn(lrthIK
zkAK+)b^@oA?)9$-D#R at zdl@~x_<e>(AKV<>vh!Pz3&@yXH<b$#=XII2?304T(cdt-
zrcIlmHfx!B#Y;<_UsEIWs?kqD8yJ}rWT2X%5O#|#6iq<vbb;u|CA~WtRaeZM!RYTL
z?pC^1z9o1+(wsQ&WQj7h`8D=0L>9<?o7oVYM!#ZfW&Z*?P{El)bgloE;7sR(HW~6#
zTP-q4R2N)LPltOFc_|R|CU`fOlTmT=j0~BSKE<63_L!nwzD_a!k&Wz-;XM&&+&^{5
zkXmM*oJE7aj4l^}h^Y1)(BX||Yo~NNtO;r!m6*7D>L-~a^Y{@_&?cm_J<-{fl1WHl
zTyJ9P5xKAh<T4}P_2LiCoAgyg(=i6Q#(&pg!qhGay23pH)8I08ode}hA&SsyX9jPr
z`wZ=or%qTWik|v)Ks8F^HvUgQ|Lu4Y`_xd#3^mwHF9WWt^i<d~Mot-&PAhs4!fxw~
z<2pfBG&(v%8ZfGZY$^bFC;E;h4RaJ-Qby(zikceuZ;Pl7oru!qrB>52Q8lVZt1YRw
z#E}|NsVyG|o4vrCh}}0S)pCrd0(hzAUz4O?G5ePQiaxbFDOT#R at au8ebdcYc6TmA>
zzzc#1IjUmt?!`wO&7@{p2eQUYkRK*=z74XO73>Q0J%K?RKp!Z<VGqBh?=B-2AW4aB
zu4+${^)6$hM+&lii5NU7 at g0{Xu`S1!qsj42yp+?3uKpm|LE<Is7F+;)ofW8Au!g?l
zP6dC!J$j7%ErJ|3AN12d$fppANA-LwFT++Q)^n@)R8w_&X=ksPj5-AN=v87_M75ZF
z19a5M#U7P43uJ{NrFz>HY*|ht at TQ#%d{(;Ujf}pKDtC)lFN67B0vS at -pl4quB)aXm
z1@>NYkFQn2KLpP@;8`V+%{~ERk>NL$sq)HHIgX=w&U=i!lO_ilN9-2UGXK<PWdZl-
zQw#q9+weGAv0xrukdujRcgYhEyRgJs*D5R?c=&bqg&vjlF3h8qe+a2=UjTMfkL?QR
z);96Ju?+tl0vfP67H_)GjMb9mPL;Bs2LFtF^OPEV9kvY}q}3P;-Ei$jq&BBp8-*8<
zeFLWxUBrA&{>ciM>n-Uh2bI|Bkn at Z1<X at waB9Qqr5?uk4>C6BteF?^<hdHTs&q!%=
zx23EEJS63*D>ppBcX;l_2YgG&r_Kj}!&ZL%U1dZ`9EG36GtmzG6gm;cwPnF?Qwsnu
zw=wXQTfp|mzeKv8?b~g$O4%$5Yy{t@$_13)m4<qb7}`|E^Uso##-qyq12C_|fGzIS
z^ish4=6L=?vhxwpMn1?p0=PzDD;BJoIy66N>QzSe)t3s at 1tHn%5m%%lPp<RGt*~di
z*>rFt{krJvZDow<>IV-2Cm(&xe+)L0Q9$?VKqm(K671*Fc7~6SX7&rn5z_+1H0)bi
z?f;f;3~u35U|W!ZO-W`W=^~_5TsF1>__ht~5jJ#Nj+CRs=W}v#A at Jb&i8Z!bShK?(
z>GQ2z8*-NhU1&#5vkq`DKb`X8U&RRi*+%d$hrvHyJ+rs=<Ry9>Mbci}qI(ms+Df@@
z1CAYJ_HDp at 8wuqlOu1tWQVQ$;n4zEOPYw%|S2E=sbNqR<SU3vJa@}O~gB?|n4#k at i
zNudwe9?k6w97obAgaUd>T at u6nd-`L6u*a3^9n1NT;?J)n5i0RL=6yHI0eG}>1M>{e
z2~@>D)j_(lVBZRc*BJI8^lf?1eFo|QPB8U$e~?%UaFhYfr~{i>7vRAOzylZVKqm>z
zMLTd?*mi)`nw-YOA6y at TEnIRHwKk&L&*X^ry|@Qm!K_v1IiM$5eVQq+#;Ict+~bug
z#iYN5mvO5&a<8j0-4a{f{Cj+L!Weyh#5n`-8tYl`rvV)VKabo#g`*_uQ-bVMymS8(
z?46#O8+Ul*61EFZ=AQt$YY+)zbY66Ot(E`I;vdo85go?k7GpJ&Kpu0?=uvI^PD$Q7
z(U-4Y27Z7g>7An5sow*=IUxrd=1SQtvMZZ^$gi3X*WY|r=@tWDnHbyDXyXt#jww5>
z9_h+V;Q!0hU-qk_#fCRm)CjvB1;LOX;SENihRzap{xRO!)uutJcnX>M3|#SC+*&^d
zF##=^LU-7-V&y<x{dmyF>p{O7p($~fg;WQ1wlv*{%Yi>zetixBS!5EQ&UK3;9_nj&
zd3H0r2YRgaEKg;p#Q6i(z8S`czrKkWfre1+E5W|@JyE~aJSYHP=-Xi}ayPo&c|EZf
zc=Q?f*u4Arc~r^3$9+G&5BTp1LUJYpp#YyN()$1o2AET}kU~p>!9ED>6!%y0_5mOK
z{<<VeY}4y&eJ)FD#zfLGq%>Tu|Fb(Yfa3pTRuA{RI|=NEMBje(G8p3lPt&&Vz~;Wo
zC)d3MlY^fm1!RT6nQ6Hbz!!J|WS=}{TzEOVMcy at x7YmGS;!w+u2aY1|`aU4cD$=i#
ze9Et=@0#%utY-_ at H6&lZ4)2^|_#^D^%T3?&I{~M3j#5~=-Dfm-C0zG#z^1UfKG=k2
z!}S<kGas7M%l*V?rW at N@?!MR&id;*R<9lGueICF&qzcIvPZ<!SKLD>i5n8jm?z$v0
zr;5Uq$e~r+oEd=`?u(ecvkmnuR(13u_QU}2A>;wg=AJDD8vR0GF7#8&^apK|$h}x8
z=rLbThx-LZ?Kf<f#qt5$TF?h+ at t*m>`-?a_X6y at 0?Y^!R{7!E>peOjh0DSE!sAn3k
z2Xty?KsKG}X9irXiB&t4eY=fAV#xsEF<Z~h8SIh+&$&-m?V0P5TF;7Wf$ut8MyyrZ
zJzKj#L<h!HY&s_ at o2nvGURE)*&-pN|)cHGaBT?U%ZybX3aCjfVb0s_vLhS8{FrQ5S
z*SNWme*^f at Jx4jv$oJ-GyGk)N&)l8}b=6S!k?6&#O612?J4I*PWv-HrOynk7C`hzU
zWO!%Oa?Wn|MFw936-3HvmFupOywi}F(6o}@8Bk5rhTnBkqIS;yuKoXkchz-sr16fG
zV{>0@^B at zK_!b1dSmb9yvznCusl%*Ep%=b4=P0`@^xZvkSL;QM?Unc*1`e<<vu3Ni
z4`T^;C=LPrYFxFz>#ZCyk^FM5%MSTsj_!_;lZS77S>v)9AVz=#uvx7HU&XQ<8zwgw
zfPPw)owBd1qY|-4wguS#8tZ}&X)JykJ;BwzS{*vD<I%$V^g$S3w(zP=FPagZS<nUc
zFQV-}Ue2E!r;L80`<p$nQz=(QM+Rb#O+X}xY{G)hT-*<~Hc8?eh%qrhD8=<c=_Q4*
z7|jv}(h8u at T(GN{h0m{2I0rGMQ1!J!*e3)#Yfqr{4A_ZpMts-wuuTm#N$0rlQH2ch
zPP!Gmc7bt`4fNAC!s5us%hr;i+t6+XcL@{VTi0K>hc^ZuM9a{8oS-Wa4f-5DN=crS
z^Nz$#q0@=={7xb>;$Qfbyq19Tv=z^y>-=ZYt^O|nZoa0wh?eTISytU|c-7Q=_j4n<
zO`gtDYSmqwHI3amyyiRwqa#><K~*lrYAx{Y$KLXTyoI4PLzSI-<JEeKw~8nk9_JHW
zcdSJXV7F<8 at r5(vySw+V at tyjbH<?%u>$QXvihs^|cL9IeM%>0x+^GZ^Aunv_;PJ$0
z at XL{9=GA1AsUr|{H5G26n{eyg-}G{j(QLpU1Poso;Xen^0zuNW*Y#jGBaS&#c(ID~
z7m$7aJ79k?bmkD+i`x=|oZX2Y=S|QJuFZJPuZGTAP}M#j+B)TaGyM4>6MxiDNVo>%
zr);n#<iZtb4A5+lNhZPlkg-FG6t7S??{gFZ&!8HxgSCR)BjXySQ^b6KMupVzSNJv3
z;RUZQnY!ROje#z3tkVknB{?zPRjyR;yvq9`;4V5j&P2CeSZ44b_f{_-uEX0OYaHld
zo at JN#D&31g-Y$mccUCV4UF!!&IlB$;p<uW!>{}~5Ykcx9=mpIE at zu+5TgaGO#>gl2
za=qmPQ2vC+NoT8phHL at 4R(XvgKS2ihD-dP-N}!GM>rIhhi=JX?x`nN9{Vt9isE56G
zY*tIx_dxq@#;Ju*(UPV^;o660X8z$p&<6g{9H(~vj>R{rfIc4s9q)H+xucGAIG`9+
zKH>SDy|MDnhjTPt2Y{BCi)MrGjJ#(K+(WEiz07r#zk<l5i~RX{YT`WI<39`h&($Cs
zz<NA1u}|Eph|&|EaK3{5yd3uP(wsF)GG-jm)2ZYRWGbe_ at dyRXm*ESQdFELp?B_2>
zV5EV0^1S6nZ}|?OZ-I<0VB$lN|16Ug;Fqog|A}g4)-19+3+4-c4VZ5$__bDmUO*en
zx(K9}M?5r#YrS+RV|Hy<?eMc(MUmOwHL6yU{j&q}nD~vHHJpOG$uLd}tc4QhW?Y@%
zUITmVy(e=wN&@Q8Ot77|FnXuUK0`fZ^ztQ!P8KeBnKr<94+*U_)yS+T;6{w;9#3Bn
zc2&WpeEb0To|biF;C5#18Tk!lNgC{2hkJA at k93n!6yRSKdW<NFQ1}hd2BET1A-wa=
zc&xW&!-x!H(x)@=H=G&))tB%1VHkeITph@*oPAz?dx+6r=`1flI|zBxNFMCs!4^7;
z5O5T at fTL|l0v&M+*wUm*G9s3 at +r0+(!a?3%;Pa2O!OjWt>tmp&e=NMuD`=?K_6RE`
z7Ru%?Np+RZDeUt4l6O3gp1I?XhWgNwTjrh=>myo<gDrURy$<!_-xjLHGKUl|M)wP-
ziL>kL)8vD5v8BKRlXBJqZFnWjBX8>axA9Q~4;MsSg8f_zvau2LA^)6i(1&``i-AAp
zbuJCm=D3IDO!u2;gY!PbI*}k-l`6@{x3*I586ek48Cfx6ouh>B5A(M>EU5CX1ZxG|
zIb5hn*9)W2%u+H$6|X|U&ZILHKe0PiuiT(dr=5rtY#xHJRy>)JW!Nq``0JVRfd2t}
zkkk=J5#Jwp<0-6q?zTo##JZ*i)BrXaHLmC7g6y5@`hll(&za1~u$LMAj*-XZv4P1T
z)Ab_ff%oKKI~g6vwFKK9(2G8?Qxq`1$$(C}!|TII26%KavhoO>tD`~R7^ZVTgZRU?
z091tw=v<uSnL}sp{@(d7z7^(ba0dlyvNF)^cnS17o|olbgRSsu2Kx2xl8q-VxB|E8
z#voN3J!(Y_!btD>YjLm#B6}fj&j!zpU?23>SrY0pk-f;zn0+y|OU=}E-SqUY%<=Y-
zE9BEzcrs@<gTp)C%U<Un8JT-G`Q at X4PtYgr@qcT=Mz0NJH}JLPUK>h-Gh=mClXY^!
zoxLzVcyH%xJRM at 84>S06%ji%cIZ-N@%VF4iwJ!U_Oz#}}d57@>m>ql#@l7(1ePs?~
z3)PJduq_G2Otj2lr8{wQB7qd66fuvdCFTQulrXd(Y&Q3Swi|U-M5#z^ur5|yH)7kn
ziid5h#C)KW1N7m5F1kagIIR$N4(at at FMe@kU+IOaEl~C|@N at 8~3BVsPg`U9p10d!?
z6L6B&!nievnpP;*qIxV4aOwKW363s^W9&|hjtO97c&v6Y8`iCqeM+7TcyG3zluKZ2
z5F;Y at O)~&K*ASNQ=MW2O0^LyvYpL^_3py5KPY9p$VV4Ef5gF`rLm{A7#G-1Xm_7`6
zQ*_eJ at QuJ$S9gLM-wS-K1e4d7V4I0#jxt9Na7_l?cj07|8Q<a)gKGWKyiD9IQuBb<
zE%=T05%#9*^Ja|LG0TT#f*`Pq11+8Sb8YroJU1#gzyk93*1!VPI(71`lE_ at R-n~^4
zr5`e3yRwbp&$-mtH!e*_E at FheR}Sy|7^z>e9QEtAVcMa|*j86&kb=4IDn<8$PxJE8
zwXi?JfM-h3Z9wyDhy~tvl><dOC1Pf5qZ}<kJzKkCdEywbSFcC<qr at wg(kHv^946jp
z7vY6XU>-9r at 18E=k8>1b-?@sgZ(YUN>&HqXb;SH|@KL}u8Pz>B at qfDYO{!tRhf{y=
zKSG8fM;X68T+6U!IM`cuK4Scmm}+P;x|*2B`F6qasgLo4Gc at kUsRodP?&F^UO=^NY
z0XE>l3^c)cowpmQZc7tYx9tTVhJ+9}dd8M9bb(Ft&Y^j{=Jr)_K(B^g=0677P;l0S
z%AHcs(OF<?WQD0?8j at 0mLckVvj9o)mXQ(@mGCn;fPDPv41aTv96 at jmBIF<$MClAe7
zuD4DX(|2HQ%(-KEX(hT!uwPWCR->9|xB{M6p^@!*^^#wE5Vry3QKfczc$)&RJEOpB
zhQ|i>zGkluaShWlu_=Sej6a*9D~xVAAvflVx82{suFlXdHU0wd0)}46(FBK;v41l0
zEa1nc{>wNba0|P|d2?7#Cyb~a#yVk88Xn}lj(hye`6qBen-e(*ICj at iyDHmIWEvX*
zbS*;bfVf*i%HINZRnVC+%|mkp*r~&2GB!yYi5+r@!Y&d5bh*4cu?}=zmvt%AUb at +R
z8U@=pH;;igAq5-mXO3PZ7t4KU=7+i at V0(Qz9ANm<%Av_KG{Aq)*;>P&2OFQ#M$XXs
zft?R at Ny<j18Xy%o?_$b0$(|~(Z_7$a at CTW^>#<_63HoKBo8=Oqv)2<_L0)MAo1<55
z0Ufvi+8+yis}%IXbM^HYS*(Ou3QM2=#_|S(@HF7F8^7aUK1bVK%+$pm_d{%pcQ5}r
zP19ch{`VsGkI?VYQiv<CX|URC^H!644a{XDL&F0hMh5({?QKc|`~*a|l5BrJt(2jE
zyI)O{+kOLGEdwn8d!QEL0^h!6Z0kiTBQ*o-mu$p=H#X?`p9+;jYQuMn?-ruEtJ;J)
zJI%R~VC!3O6Kq2>Y#Q*B3bw3eXk-)c2(Z1W<uf^2TW(txQn%G=_&vSY{TO106{&f)
z+|>ObTWVlUw}HKIwjPDOFe<F3z8>tn5ZCcAB%-+U2ATl+H^}NU)aR at bIbf%#J!=fo
zgAYaK2XS<X8JNd~zbJ12-(0`}um{`Il_IJ+kHM{+s<4@`Prdk-6C5@(fC3&U*?K-s
zBCi4%od$dTxrV8nLZ%$b4pGyXHbJgAi9QE$#xt3H!}Q<8#N$ng0NEdK0(2qwdH%ai
z327=(>2GU at qEwapZi1TGQw(0>^Z6loGGl{$vDg7}ZAv&#3h{TO{~<BS13N^@j6hXP
z#k`tqb6>s!_HDGq{vv)AQ!qA4)`Rrk#?myE%n0#)Rj8`}&9Ir^Ys_!3%u#h60NJ(}
z;+Z6zTv$7p6IRn7<h8Gp?jSS)>;gZRu1}jFT#IIjx-RQQT}~CL%U-wbqsV-iXA{_M
zOwKzDKFW`QJR%cbJp=rPV*@&=2Y-HR=V7Hf__)_cZ*V?DtL2UC%Q+IDqwrpiG~EjE
z2TBH};vSxsxo@(Ajk0>yz3vLpcVIs~UATJjW`l7y at Vq`QgQwxyv=tf9St_RKEEFU6
zKn!;x4nDlA9)`~q49*97H9u?spO-iw?@Sy&6!HXa5Gx`9_}xpD6V%Q!(S{Dg5a3Yo
zp%Huf!&EuQB|c!6W!V&g-w)dzKRVf9NdTX5R9!=T`c>GEIN-0kL67PYF at 4&NrP<A@
zIfuHKc$Pa8mEux{4}7pu*nB$qzDb<qU#wK`&EP;x(?|AxMY^TFgwqD|Z4=fw^qmc;
z3adsx5t!p~?>ZF19=QN}Bnv%;Thh)l{RqrSz73h+XFe>JJ$2OEhu)_8VB>H<x}N6~
zrfEbQ+93uo>1!AGRQ8D=p1>Bry(WC+28bun35-L(;DVHVxHd|Q;Qhx~ja0B?qfNy=
z2XknK7$vPu1vEvKTG(JwYJ8iS_aQbSobM0zy|)}ptVB87zs~pf`kkHzSm!V>Pyg6?
zEo>VTs~YppM<0NEoj at c5E`pufx}K|W-vXO-nMV~4c545FeVU|iz;7&xQVP)fw;d4E
z6mwvokdXA<Px>Z)8D>RqI1KRK#AhoAvr_xqKY8Y#tu$MH5d8cyusyyQD-oE^MGCXt
z((AjVHNFsMj{KoiPe|rz2#N!;){X>GWV at a)>t*3bz!or(BPC4C72aLLlSLogvE13G
zm-*b6$}%Dhq%YY1!G=81c@^rceK8lFFT*qW#lTk}mXD!tC#pl$JHkV+?nrQUK^qgj
zF?FP?($jBU1Hr}5PDm4&*Uxf5Om}$6nS8t!wI4OV_JX?$Qv+{<xV`rLxN7<U*u#bd
zDE%40W<@GRYeDx|;WF}={$3N9cXcxHuhxlJt#{7$u+f7cSMjRpg?O at 3{n{yvg!mKn
z&qIN^?(Ov?(iQP3YHHu@?88W~x$X)u(GY6}dg(!>c1Ag-$7TFbg8Eg1{0 at BXLeCKK
z2xxyM|KwtjxzR0&`_M>q0iuT3k6u)ZQ0R2OX7r&j*{KkYI|?y|>zhMswl~APj|lr#
zE8Neqe<V!k183KgEg;uvWLS1D4rePMP6OoXz+$L>#IesKE$VqzA4d%x3@$?@N6j-}
z{uArm{pi-k7wKMR{sAWRGR*%vdLCUsP}?iunVlIAZdPs>m=0q*4fa(Ezwdu!yOoeI
z at u#PGgYh96*9Sq1p48<vqYL58$}Ywq12CKBsP?Feu8H*n6*JU#yLxm*Hz3ws!oLY}
z%SpVOeTa!kB&ZNQ6C+EQLloYtQK_z24K(x)=t9w+{-SY8b=^kY{qWKy(}W6I(SJL3
zNzCm{KCsrlMdQTJ_*KI5i9C?OV0{n5`W}Y$HND1lgARq`%8f|X#1e?VOa0QCex0#t
z%O!der)C#)8&}tYjjp=1FitBxgi`qWJP&?81dmbdJz4l1yESip$UZ*>TKyP&?)_Cd
z6JEu{QPUcEMPLTRc!xnOa5ipXY!$ryG3PctL%jsCx*&Uu&t178PC4}*CKj5(nWAxk
zGbW{WTte8w!N$Y^@ab=dc&(p6F1{DQM- at aD`UB{D;KQqR+X~TR&iieLa2e`3b1?2H
zVfBT^GbLXiAWR=r<xL9_>(lctrkAo?OI`dR;qk5N!six?$QGO&je>3S&<BU}rp10d
zvL`INlkzU^g1T|k2 at AeEeL8*;o6z|d=dg%-Np<Vf$U at oY9D|74p}MstGFO%gacG}_
zJe&-6z3XvHuAhw3i`Nnw!~`~u;uT<nz!LJ-#C|O7MYDnxsC}dlE90vN7}^H~5j`XN
z3W?Vwwm7@#9)wJ+mCeUUpslK-rnV47#=dg02x2y at SPk%%1ed9!A1Uq_kJq(bKu)xo
zkoRXl*LA4=^vom!>7aZIQq3Q4XtK=RQy|SN4$I=~Rm{t?6ldw~Kh at 32h`YxlG1amS
zgemlECKmR2afA{4DGKEMHZyW!-txt&omIjU7h9P)e}E<U&kjrldCHELOjqA)=STW!
z=q2|~Gw;PN3FxJ9;PE>Ln-Xi?In3A-J)rkUAr7jPkaUcLb>D7oT^U$CBY9%=E4T)U
z#IyXY^dYd<S^eM~hTlQ_N8|^k_9b6<_78Yg49|+-nQi1*7Chrm20GAYCd>|v9|=j0
zi;;X-b1HRAz#&>ItOor^zO~!Wik6G0mIC($M=o9nGMdJrfvd)U5y&)0U~R~b<%ltR
zDsD!9V9vpucq%bkU~aiDRPRujH6fqJNlx4K>1eRC3nPJ_#MnorMB9BG8vo^xMEG*#
zJFwH6+BA@~=pl4AaRZ-*d;z|ePSj<~MGp&%KhmJ12TvLgXUE<EdvgK27l$^0y=%ij
zC4-~it?E=VHbteDmjis#=r{sn1|JIjHR498(?6h90psaC4E!F4uup;AT5Xutra`{K
z>;`jao{+jQ9qf6Y`05WY;@7YN*jpE1EJpARlj8&+7Yd;6d^i_)Jxc313_J*~XKUfU
zFiHWs*?}&5njNV|rMEI7;S2>zowapjAw>2%Vs0e!{G%?2tAzF{h)js50Q(S=znc%f
zt|3fOU&71-yC^W86oI^<uCJ#7S7(4M7cq+X(NTnGX|<o-q4pQTwGyt2nAnPtTA)#_
zxPX5cPXXCn65-3##~U#X&x{%aAg<1Q81$bbXVmzSk at uMQnRXU2F&fGZo}FO{gN#p2
zmRbsN8PEp5)IB&+QPB>u;|wh8X^o$$;}B8{^7VG$$wjCZ{A?e%7oe?7+yH(Gn;@W^
z?6_LX^6L`d83d;8GJ5Bh?;g`;MbdQ^`7}Pz7@#|n(}(ow9ZuvJ*ppIFh*e<XGQOMc
z`XFrI$e#TzRGp>|y_#0w>{6<~@Ajw~N`Y6 at E7es$@N$3${)6b6&H<SxKeQ&Tu(1ee
zYA4WC#pn6118C`8bHoN$DU_8nWoX^eGQO9_HI#-uGfeY8J?F^us4SOzKwXQKfUhv2
z?5cR*K+O!b`(3^%)UxgOY_R{sbKS~jW$L$bUj7I_I5o@<Mri2Gh<suS%mMfV#Gr19
zKDaGfSiMv4&h61z-eLa+_lUC(@^jd~!I(D_T_7*qk;<|+#3}IOSP&yCSmwYuW`ljH
z98-IrKbFd*5$GU3g?%B~vTZDkg~RwvA>OwYaPp`4>i7WsI6A at m?%TkBsB{q?f-U>0
zIQ=;yIh1Rjj42pe^STyf*UsaN><Z^K!XO?9;^jgActgy;RGQ1seAqM9X)1?ha<Th?
zBg?-om8n;YC#P%h`C{@Z3HVa0+f_DIXsKDn*$449A49y&Mu@{nb at nT@lNJW9M@;Qv
zI74(RAU56ND26ym(CY$(ASe4k86*2kBMhLwMh{*ai4kM;l266Ao+*L&l8R?l{T8&g
z$%LvpOMv#Fe~gk#0 at tCYsVQLN{)*f`C$~!|?qR<#?%}>0;e*!$&*|a6?(B;wMa1o5
z_i>Qd45{)n#r$`0J$e~zCwg4ZKMFj%q;prA%Kac!1^P1vvSfk{_=7(VvBMC*G?)x$
zvsR(o<QZbpw=Cf(?9oCIbp~|IU-g&?{ZvH#2)gFKzx2-WJnvhO+w*wm+mC>pRD|P`
zo1LA^-fce$^Md^{t>}y$Vzhn+ns6qM3}AfZ=OF(J(1%|~?k~XoZ*YHc<h}*&&%?cQ
z<i3 at OH+z06#GB>8e(GAWR5S)RM`_}y^J9Qsb)78sK7Se)08AyYk7S10fVrW55Eln4
zTQm=J_^XDQc+J=?c{PZ6UI3JL>!b44`I^!E6$zp--6jJ$DiX%k!anIYitg?|0&(~K
z%GA>{Qsr0{x}o6;oUen}w9_^i*SS0rXXeoC?ei??wanNafn9{TJ{$^(eXT(cXY)W#
zIsPg5<e7Hvr^>z8#_*s9J;;}xuc!ry<6f5*;iP{KwABu=USQjDUI)8Lk@!}iRjK`Y
z^qF4&Gk_OeunwJ!%>{fMkNI_sEm_ojx%SrkQE=|%lHPR>*1k^M6S$k>0$QyWmHvFi
zd5iZOBa{1_f%C9V^a9X0*bAI;r(3Dbe3?U`rb{|!ALtdCj2{QR;3>xjVBhq|SEF-a
zuL2#vq;qAl+nWwB`fx`<9OY2dTOz9A{nX=?>~=>@nhN$?7IS}64KjL}Ui+y}$B)Q!
zD-0Jv*Ii5*^z|0DQ(*q>AHnC_AA@{Pf(<M$v}VSGv$nQV{>S??Tc7t;$fP~ehrfhP
zfPJ$Ta13<(K{%Jy3w}j50yGZd;QPL}nG)29iZ<OUe<i5<-tbv=@ppX0t!C#xRe7Q|
zM5Av?Yc38PGDlRq3c}TK)kCCff4I6+#G!^DMiZwv)&MD;ImGBFptC&53#s%`0;Av8
zgCPX$XE-~F2P=tgusak(elOOFA6IJIehmw9Ulr?*)<Kz+Q{c^)K_2wVA at k%Sfzf~c
zU<lLa1rq+W)RAHS;!!PH24_r9!C7{59w|H!XmDq)46>Id8-&y<qrPl)U6XNj4I?+k
zHcs7;ZN~49{%C68eG_BTninpV>hyX2aP|-MA81E$#+1;akLt^s at x|=A?gJkCqS^B%
z2~8Jj8GCe0nQ#Z*ttWlqe3L#B^9YPV!Gp<tni*dJzfFoNim4Fpa1d}- at HFoj)89yJ
zsMd3^Z at 2C}QElhwzC$y<SZul89aR`wv!A2r*O37dMvv~x*UjVP65tck%|lz5bDzvv
z%2?_GInvL$!6|Gcmilc&Jd`ayNY}(xpC<u-Bx#3unkVJ4)fbsEGFH-jBVOt{!&hBY
z at Rb*<7E)6`OM}=Y=i7_n9FzUTlk*mgKRM+-*a_gAA>r<^r7ShHBE9IL#db&U!5c5-
z9{k-`g9C2Jx?{(P<WtwcoRH8O`-#TlFj9~-^;;$`6WU_(DGu<-5|YU$oIPO^ppWAY
zsMGm2yOA09U?=Ek^U)PhZ!Ob5#BlV39c076SBbU#7kZ*ne(LE?In&dha+a}!M(o%B
zYo81^_efJ5%sovac`#1!d!MwhT at D+>rAjzT_dZ?@BB6_1N6}`Whq;ro(7cm%80mfs
zm*ZgT6(r7mz{GeG*Lrj*KeI1Ff2mD(IN5j?oKIZLv<v>{Dy##oM$4iP+J``ngEHlY
zWmdr3L(t!^=wqQ9&g<G3J-Kuc<ib{W2<&mGR3^^A2Jn~pM(5SA6>t`IP~O$IUr`41
z!U?vi`w$b~jB4>Ui8V0a$MQy)=QWt)K#%WVbEIn#GImswlvYP)+W%nev*14~2RqgS
zZ){{KW2 at sCAbzFRRmwjC`8^QxUgY{7tz}{dC)J^O3;48 at p!iRt^$>Fab5pGF+Mzq1
z%teqm at dG&XQM+LL)Ll&b0oC9;x`xZ}{3q~Ww+NDCFTj~CG4%UyW{%8U at t<_g*TBCZ
z at _{piBlFGJh&B^V*aWwhePM8J*iJ{WN1F0_=zgb%jktI4ss@?)SM%>Uj$sMWm+kAK
zO!G-cg^v9^MOWeGV6azUwf$rHUpTMB8Rm!heWX|X2QQX?BBttgo#A)(xtOwfvcY6;
zTi*{h_6(&g#Wv?iR=1QXdGaz9`1Be(;P)4JV)uQJSr3A5sJAUw{^Q~*h+8p03{`7m
zIi at WO47tf01!tldKTj7=!{gJfjK33wGZ-ho3)}8|n^~h++)>=8c_#~e=5HIw9e~eZ
zN6ZJ>nj2%feaHZ~9%qbZa2n)RjFd~+KjF!Q0#AZ942AW56m&F(nAZ?vm{+M7H*dY+
z&A7$FL+J&1y^HUjE$(}$*bON=`(yvE$h^4f_Ez}41`673)Bg at Srl~LIoquJ2EFXCW
z<(GsitV`P1SN_gz<~<l+7Wii at FuvP?xr534J58&?5&%YRF^6xT1Q>~98epsg9(&5`
znC5IT#1|)pf=?dg<bI5dIRNzz+`a at j_e`Fd|1YRtb<)I)31kAvv?8c0YdVTK0YBD(
z&Eh=Xm}dz%|INPB2QYQf5ln7*YsV5^H`+Q0c=VtT(7;G>{Xi`6Lke96?}ALW at VqoL
zO`UB{g?Ma`-BOer?yur0(Q3N>Z{@Xk3c3?wK++x7_=HL4={$%f94QOk>L>=>^Xcvh
zEP-|<a4r&PL6crjB1xfUhiS3MRn7NZ*a$I}O|(Ju6K#lV6q1ZDKb_)e;u=wgcFhL-
znk_V;t>xX%)Vc5X?N;Q?Ycc!_V8U5k)mb)sKxqFYN9c}kEk3^Rr2fX7BOveB#!3Lk
zYwWXucFh)^$65)=&f8WV*pBm<`CUa*3V9{)Y~tDdXo9^A*1!h%R+22cZjOSp+nikY
z>A+N1jz|r$t%cS0*)3frQ413fR$UoiE6vDWCnq9zSBE8&`afVCuV9MdwVAetS)2Ql
zp{)Zcqrr}4ut&mLO<b&om|!kJr98#htwCmkGv5oA-#Q&tj2nU9Hb|5A-0P;YDc#3)
z6g&T!BP70<3f7iY>tu3k>}8O1Hh9K`1;IM=2SdC#t#H&qnPK>RCiqJVn7tgQ+&q)9
zzl_w;IlOoh7L-SY)rPj%gMWrNc90QpkWJ4=|7>5k_ypPu`%MaZSL(S$UUt9<djB~%
zo9%ooQWZ{HEMoS>bql})>^?*n?1wP`J1P8z0o860QD7^l8bOx$3C{AIGxs+zx)}Ho
zO5jXeX?vCcz4eu&Ou2E+QeNI)d>YQ6!C6Z;0b~DC?D4mX|9tu=-wu8ReV#owe|OS<
zX(P|g*hMr<d?Qwc7lCe;6uMe;_Ph?@@HE)pTL^}qJO+DF5ejr|>Nz-X0CEQZdzfRL
z`%Ie$pGagOMO=`lX>F5yiSH>nqZ6dn>Ia_9#Y}BvQwFC1{O-?yjIvK}1{?ejoHf{q
zcJkEspda|~>w({V)*y+c&!P}VCj(ifcrnCV%}(el<*Z}QjuKW##gL4U7#|$ii^2YA
zlEZIFz`H6xioV|<V>{q?JDLl|=xPFcQ=5 at PD4dm^trklAs_J`~eTpXNpGhNyk_#gJ
zDP3kjR;nF0p_}imPYV?Oc1oeI)oJ9 at KqvAs$efgxbW}0&8m&h1=o&;D>vY}@Rs;Ya
zaXsp&Me+>f0L3Yds~$rxq<H&cD&jgFo(T9o5_+HWHdhJ!pd>F}r{-AM2)t7gS3Q;V
zT-B)q;6ASU8Ri|8^ESw<r5yNOlc$+`z4!hAL5 at vg>b%I5Ntt%zBvVP?Pv!0&y2ww?
zz9h<TS3;XFdTK)9Y$vo4&iNv)dg5?>A`Z?8(fe>ohZ?D)YyUUC-aRg=YW)MQEDZN)
zJc?#Il_?-4T|gqTvJz8|jpUgSQMNP(tj<XzPAPf%8Oh8rAZ&4%J1{daR|Xg^av4w%
zNl;5iQxriM9T-L=Gg5?+l&tr=2CDOWKfm|=V?KM$zO23Wx;*Py&+~o0%X@$J#Qph=
zKK9 at 5C%VR%@d_RHInQ?2fAV{?fPL31GN)BIY>dk1BKg)6wfVNyrTOL+rR#h+!mf6X
zRISk_1x{OIU<x@##|&plzHJV!`<1S{57%dCn**`7ZqlM3bu}4Tos;#`ZZiPmyc}3>
zRZRU*+7^lXfHz;!ic+<iV<ma_w*Pm&6M0A#dyhvI+%>8ddwf_zaKRJ|U0<RS59N#S
zP6gg60q!`|6R57+R`v||L^faa-uoeJ7S-@`rEil{LPrVu@^1L^LnrH9H&O5Twy;vQ
zXr~qZ;A*}t0%>7}+QzYp>!`-S)-?ukA#4Pp6Xh5zk>@Hb)Pm600<Rof$Hn>q<4!wW
zNT)X$c at 5T=STgIfZP269Ps%Xfl7U$`QzW`X`cRg)9t+n95cgGM(O}MMUn3YqI=Y%8
zP-}QXM~=snui%xc6^xHsv8^n4)_&t-7X$0E*HCUcr^%S0MEOG_4e at VJd>hL;**9`(
z4IwsP1AT!KY-;W+4UK?*s+ODGBSTEW6Ry`;EjT{Tsd*LtAy)ll|7fT+^qSEx(zD;`
zmNWfWD>R1`QnF3Wu;;eJmkC|B;{$L15|aMqV|SW+>!{#BA at Z;ER0Pi&_r~8&^cTk5
ze2i@<5}h_YpmC-5dYJwq(Pi?@b*#LJcBf^NecR-{?q-31;w_6^=wFDq1;$x1Sx4oA
zc|{#;A?CG6tj{vhJ|3!%Cv#R6i7t@*5Qksnh{_h3!3&^6`x~Ap5}HywD!^aEGDJ<r
zFA<vuUol#?Y at gdaz{Jf9Io<gh590&z%dZ7?d9LJ(7&Ew at n*CH_?P|@?!LZ!$L)pH4
zcYUbg3LnbT7kGY64K3YNLucEIS0fH#T!!n{$aOMS{y(mt`2Bk9yFCx}!wS0NA(jmG
zzW9DUqoD3ZLDyl6xQ4cLu0fGL)EEZ8DX#&2R_N5nNYudjbiTGA4L>1%g3i|%QGg-p
zQtZ3&@_s9$@W;2szI$2TZviLMYh*1zu<@{KR2A9I8^Eh`s9B*l6xmK10 at FG@EFo-T
zf}~rU6zdERC>-U at BDG=drFDk63J2_Bh#5X0?pMnx#I1 at A<h?OUqF+KLu7?frQ25?z
zNwbb8H*Eh5^JX<<GVKY((O!x<&_4<M1Iy<$8<Ad+q$2CtvA%7OX5-l=<F+o$2VXJ$
z>?{}aj9l`RqME`QZ=IA at aNL7M99dV}xUR_jk~Pp*xG-eXUA?-F8jbECYc#sg9!+d^
zKN;vbtCy%H>z2H%h$xDeYo$@A!!M1Oa*An5n0~W{Q_b^m^y3<fHM9;gDX*wl?fGlN
zXOFAK2eWgG<ayOYoT?~om}{d3x{D`&$>(yTf9zO<HXe410h!<NpxC5ab_E$XJ at pfP
zim7crHVu8Z%P_4l>DCEcds5M3DiXCBCiHIaHyWgh at 8c(9%)#?9&B~U*x03JN&r^()
z1<f8YEz>Z9FpZdD!CoHHGSo!d+`0vaw7BNgJKVvuMpnRfzYsDZTJ70_*aO^ml8Iba
z7~au#(`_11$K3)qfPqy)a|1qzjiG0`O=_juivD|*b(rP`EBd%g8~bstiJU8B)ve2M
zD1-x{4_wnNk#Y2F4f?3wS*L9rH$<OveYR9Z?!8X#m9h$>y!VE at j(fEneK5KAU>Me~
zPE+U<@m|#crROzj at 2PJ;@*(`>Ola*M|1H{@k~QhtA$53LSyTaMYWIxDxJ`|Lb!{VB
zTU0-1s#C)GrcJ^OES7VQ^n3~|?kU8&DXur+`))<m6!HRQYT^PGL)H#+U+HP?ys>e1
zbzWjA&p<1AwGJt#W{#Fqv#EOYIcZW(4)RAHfu^>Rk-brk%z*m#w2Z}a<cakdVlm>7
zry?qwgY|`o!!mPU>8>LA)#Pm{)p}6o<N2bXQsiOiZHIkQ>FSj#@|z~|gpEr{^5ulK
zS3`DoXmjXuoa1rTz!9m?SF`@e-!_>)Elt|@x3!T&#p>I0K3t*_>7x|dih!Bkm_-4~
zAqS6=Zk7!GRMk;Iph4pg-;v=P8O~ksDAvxxv1{_!gEB+!A+}dMw*tOv{W>GcI771_
z^d;AeQzYQX;eb!(3COzFF;^P2;7Gvw?)#kbP)Gje-f*T|F-ZB-G3yL3E1;{())`*M
zQH^*ux at Dxwe-Fpv$Y_JzINa1W%<Z{YM6NS?@Gdor5Br(OMfrh;r|o7Nv9HDl`Vl-8
zxfgBHhV#R1Z_`pH9eVSZ?2CafqAiJD_Z;x77;hehTUl-eo;^O`Mb7=ZJ#%4yBiB7|
zfJ+YJ3_6jAYG^(_4}SC02C8740lH7CBR`@l9_yCDf*i;*@Kt2&v9hwm^j{J_w%Isp
zBHoCX_fh0}==UVQn>W=jRkfZ#o}`RH>&QLc^K9}S*4nYe7R0cD$1z?ATTs555^6<L
z3_=lOYk}>VTx*fob&x>@Pp)-~ALhq^FC*jsq5>Br6K&{?j;N@;IFY{CjCA+pc{|e1
ziS(r?q<fLh26yBMq%R?Di#A+#A$=L?lhKCGkB~k$k-i{9`ut=X94xhGC(|~h+b7et
zNOvNQd^*)gcTJ`*Al)&UZb$mUWco7FWs~V{q^*<bV at Q`wrjH<9I+?~gzP55QP0Cy~
znf4%EKAHXv>59qpFwzF3t5GMUY{w_l9HhU2?W+{+Gl29_q)U)KgY+?^4JdyC(mlBU
z2F|ZR+5!HjwuI^@`4PV at _rqL~(_P`nWcJU~Qn_^cYN=WZ3{bAqJYY{~Ob&7Woy=8q
zE^GqdN&*I$ghrmCr_#~D?4K*8(&#j9_C*Q7xVB7X{R8)1 at aB1_I!A1nR)G96zb$iE
zm|B&IV|J*R29`4Xm+Bnc`_InTJhFsp*vL%Pncj3Q=>vl$k}&w|7h=5`=Dmh_Kgg5q
zerI#vP=QjsUVT+9pt+bsjM-nu)eHaSb9!BW?@rDU`vc9TC)yeCZH>9#xx{P<=^6J|
ztHiU^->8LgUBLWQue|M$j-F6wisi9&SdWr;^dr}{B^6<Py4hK#9+nwHp6BQtk(-Y6
z?$r2w{v3%ZUu{%NuJM=1m^2cL8w!pstb-N?b-~BGp3y<REq`XtZwrX8pJ4N(N&ot5
z+=aV(%nNY`UgrOeE9)DId~QuKuNwK5!uHj{tcaY?xI-TN**_#R8<-=+eLvW at KU&7O
zszq~b;C^Y?wfv+NzNjLmo)KW}ts`~eLk*Q6_Tjr_HHa7ZWoQ8DqmW5$@YR-J&e?!<
z+<?!yKvVVy&YSSDnK7T;MBOf8Nuig4Gp~Ba$oD)2Y*$*eeWUaG%5y{ff$_KvVVS}!
zsmD&1#nhQ^MUPZ8#=^G2$_}inp5gkE at Rhcxw`Hz83)^>^y<)}HiZbY97Ti<D$`f0Q
zM8V+U`cI}$uhSHLzM_V$6d6-Q<XN%7jTpeWvhcmxpM=5w>NLf|?tdwfly9|xCVYjk
zp;gboIG+!nk5>;OeyhNv)kDV)^F?n%A5dHAQ6`c`7$0BpKt+snNXKjMFIl$JZRTl+
zZ|pzv&{yFXJI{dkYea-KBz#o(&Y$cI>aJ>eIPk}Xf%5G4#iFc^Yy;|O6K}Dz7&fBy
zL9?eI-uC*{uw0?bZrc&hQnGKEwu*#Nms>YrU2K8;yf&zOUE{S0g_F7uOvg6~2CQ)#
zA`8opMQOV&v31<WOP>&1?-=q<a1 at ECTcH-j71g;ufA3Sf?!C_uUt|k3jqeu<qT-<=
zuM!K`QthI-N>y;wv3w&d8F}6i@?UK{VqTI*?8*rji61!(F(}@;xiKvFIW at Kr=X;>9
zlJ^)F&*B<@t2TU`&n^2`0kATv!qgz>?^2bv4)zVhv29-6=&l!gTZDGDK#uS46tHt6
z4dZTcDfGm0*lNoL3%2AE8;Z7>U6$N1WN8*L at ktHnSFKDU>?wzYiF+P!OJxT22NA at c
zvZtjb*nm05vTGBtIFinBsbcX|*!KFRN&j5TDn%RehU>tKb70~g+_zj at N!}sdy1iMd
zn0W$yv)JcUq at ipZ@Jx!uIlMelw&6OuHbR`m>r7*bo4_X)QB`X}AIX5dM%B?nFpA^A
zf|h*>8~=e#TajN5ZR<>vDuS0z*xw^sHg5u7Qyk&~ZH$0#n_}s<F;z2UuuoTuj6 at C*
z-I@{Ycyw6<upT0+hA&!E%U3*E!B;d_;k*Lp(VrvX<J$3Irh<Y$$6L>WfuCg`@>0UP
zR(wnG9Zi(paX6x-Sv*oQ&=-|4xF_i#?4 at Gx%(Xk3BV)!c;n)KG;KGX^S3hxE8hV&}
zQcSpOY_VL&*X{xSy>$fd{v0shgJCxA$w6|h0oO|0rTlwOl576_d(YuGZ3Mqz{yh#k
zcY%Lz4LP>+J>lfq0Mcjp_h at o1(u*G#aZjp99QnuGlS*>5b6d3}Z%d?3e95(fe{U1H
z_YUqI2B*zsr0x8B+sHW*x84>;%J&@@KtH6$!%Dd)_mVs|<J at WVgLrOh4#_J&Quo5=
zB(GTVoQHpJ13CVRUp)U_BT3J~^M3^o3)gWQu}g{E)&nG;55mi{B$08=v+=Cw$R7T^
zc5?4RzULr0t^l?}w;|ZIVlXf6q7Q7c0a?J2u7$p!2wWMu<7hEY!-!agR=pUy0{Yn}
z<o@<ju@&}PohQw;LYny09CDvj^}vgv;A-qqx>gLRH=UFwB at IYb0p+1PBB~Dmf;?XV
zx9^Tf<0l7PD-h=~O{)50LFkT^?T(jFzB?$Nx$o5A9(fAZqh`biw|Qhc?o!G~tREt#
zzm*#C##>)T^uDz_;ta;Fm2gg$ycj4qjYiyf>$A at OsP~ztA%_AXho*o(EBN=c$GGDN
z{PL6cb0lgF1AZ;nil~Z6-Jx$tISCfw6RuS5dKZ2VU=_O at IQ}e^|GF8+QK`J77iHGn
z^1*kieq%`b1&zyFXR*6+P9d2Yx+BmOm|(BeN-4|W#f>hkOK<TGt`h_+#CD(RNP}mJ
zy&1B92|L}zY?)nSlqPM1J?L}8Qk%O5x?dO>Th$K{JFQplED1eCWDe}#FGa>xPjgm7
z<}BGVE24#&j=87KUMx*Y at L>_oimkU-vLxW=Nct!adfMk~b>C}jWn|op9_Xc2_F~}u
z5x4Fdl5YL%NKg#MUwC-A^&=)oYo1;%G%+<rq6ZWG^UuYT^VPn;pHKg+Nc8vvD_*B>
z(jT$=9o9JlNBW-l2a+)E3qyT~e8v45k`H|5{VRT at TInjnzsl~Xt$3!rJ%(H-`4!n7
zY5l*h6MO|d`-o+rDdF`6_ngH8O}pM(;1NII7^O6{>a?|Ylqyk;aZLE1r}8jmu`g;)
zGIi9|`#$il`3!W-Ny~s0&pv@?t$21eqvwTFQit{1iF*~))u|sRmv8#J_BwACIA5~x
z)3ylg7l3K9QF$9 at +n)Z%V{ECT6u%Oq8|4B23g;ZLJNHzqITwu>T!(=%#&m$|LnMT6
zYW<SsW}z82QP?+u1IPLUKD|8n-`(tF*bEiErR;;^g|LZL!Twg5`j(_AN`5VJ2_M*l
ztd<A4DXRU^N at 3<wxrSbn%a%Aw(bh%t!OP8dIZB<Yqjx}Nm5Pn2#~|NI+111*82T<b
z;yuVOdI!lz6SvfRU;h?6&Y>(uaA9B$0#@xDY at rvgZCN71+TC$2aS3qm at EZ~v_YJlb
zemSd12S27i%I%M~*<0<quI92wwg=y!Vds)IJGYU@=3X;%ZK<-qfvbdl#g at F8Cz~#%
zyHA*T9UP$}-;;92%>2ZwbHxQRMDId>B08w2Z=au9G7g-Upk>>h_j&MN at bah296g?U
zXVR%5(qF)%G=O#Gwb;6vj}p7{g^8QS7N+EY!%boyCw3RLJlGmrZ+>~rG4sKcQ|8xs
z&}+$D;5g>1yC3sJclk*(;o|MdrEYbr+Re#W1KGjLL&{9b;N?qNF9x4-UvZqR#pHO&
zcQ3xJk(ctlU`aM`A<f_uMT|tybHtyDb>2B=EpS&=e!$ZPy*_b{*Wm<5$(WB9`z~X?
zN8KgTDJ`bZZ_uxDII^$cM=i4Lz5 at IYIFO;|5Z*&YOClW(Tz$^BYDYb|iU_Z|;(_Ac
z2IhOeJo&iVG}RNmU-GZ0wP<ru{z-c=RU0%LHr$1prdT<@I67D3Ub^31y8MvV$gh}Y
zSvtGFBxv at v;xOsh!lf^|i<jqJ*Dp~6hoo@<H^2LqH?9S-mn05>20v`*!_d(>?>-gR
zz$|}Z#;-w+7k#r36XOnk6zg!!9q=npeIGFa_c^poNepcLPe{rh_50|U1^BVzO^3!3
z9Fi=?4;&M~sFdS-Uyi%LEejy?#T|P~H;Jd2c<&X$`%K~lc$&M$XP^Ugwvf8^=Kmrc
zLt9K+3CGCkor;%6-`#C&LrfNM&l*Zkmt+F-$P^{ZjOyJ+a3E;Kdi>V_>x1`G#hVT@
zOe{$s2L8B+^jA+JyI at c77U%S8x~Tdm#LAW}*CKu=33l+z`Ned1l^i?{hY9|T&T~zR
zlC+tFm3NDu$%VYLxq=b%z7*J!D#Sc$h%E`&yw7_xn37%3-ns}*?1bbCu-glO4au>W
zKbD8~O2>bZ%M-2C8trnbW{s9 at bflv{{gV9 at y<<G!=^4KT!tWgENJEU7f?WaBq{$%}
z4@%xtW!gNO9~m8k`0gUkr!@F<y9>vkio2G5nEvR=BwB%=Jo{J0>S-ko8KnV^R_{MV
z-J|Qp2G!U0+KIfHt_RDeiyW6IMYoB0fjP<W5&O~eo`-6t>%VUc1I7zDJ0X6JsLu-e
zfU^;EFZk<x8NUqp&NC at 9`gK{in!+`0v7ZM2Rq$oWC{K6O>RalKz?<S;2jclrPmH&o
zq_Bz1ZEijzqbkAcv0?IBizA!48e9OLt)jcd6LE`uLxK6wiIpwd<yv2x<DGSa-kqM?
zOKqH*LGfLG at bH%6`Oksptzzd^7^2jO+lSpas^gk?3H)n_tJFZRc)q)gX;jxT##cMt
zrH)2M3~mQwa~%cTC?h_R4b0>#j2Iju&9oVOp(DUcZN0rdszbQq%m`KWjGR-)lM54*
zvo-XYTB=mNlBo`!=WG_I!S>lOl!kiE4^z7G!A<-u-k0w!i>Sh%ymMKD(3LU^ZIf34
zE<D)gm55<enftpNnZ~&S$VN?PUpMMi&8H0N*-W)s$QVify#nfbbc!%B8glxKl)BDR
z)4;IuW;(Xg<qr9KiH at zPV-xzc)K})My8^`MsN81MMOo$+#<WD at tW>O`N`VhGIjp$%
zu=n09e~Gx*TPIsRalj~-f$#5d^eurQYVBOPLpwLXktNo_K4{88d?WB{rHgaHO{zgW
zWy#wb$T8$KPwpr|+cMx<XTd%y{!KSIHV4&b=K|}%vpD|MR*pQXx~0_Ti&fLpNj%ER
z<}nVfL42WZj6*OUi)Uqj{WMt{ceu1I<5^dLr`2~K2A at Ok^iYSB>Zb*+NbwOSUaSMx
zWY;X{eG_s=t at 8m#9rbCqrL%wOm+>*QJbClR?cX1R9{ZhQHC3G~!yF at M13tr-nVARt
z;x4WsAfG7#zi9lT;%os+mMvyU!2hFyFA+TIbnmU~xY;ZJ4Gydj*f>fcldsTse$zb<
zJJX`SILk=97~TD|?giqPsie{!R`^^n9!MQd;A+QMtV1h51rLP2yRc12`a;x1TVO5V
zyAS2aihGxD6vu#9EFUrPYI-H?Z0U$^1wLl%S%y#c0RgAthr)O4kNRfC?)d&#*n-tv
zY-Q$(Ggqna=|UzQ@!Ro1KibQYU#Xu`Y{XhkhqYS6fb1(^ProV*+R2pCEhN92OWC<%
zKIS7$tOVGSo7t^#bp$`2d}`AO>XvY7^>V6rD~E)bACD5-pf_*CdHZ>=RzB>_!x0x_
zAMajC9qx&tineti?~7DIcj3qZm6}t5zE*`Xd=P!M2H3x~y;7<YSm0Z%%r&>Ha?MFK
zHQ)HkCHFe=9P&1_%jgF1e?0(R$5`;JnQ(t8?jM04|N7EAxBkp3>N-ht^Pq!VLLHj;
zhk;9%K`xomZ}r_4yBXh|MfizuKFcAciX5HOz6wp@$?2`orN3DxsOohdrVIPb9-$|C
zUZEY>Q>uk88a3mX7F&ndm<G(l#nYsY3-GIguQ~J^S0v`J>pV^0_g>D!3z;jx<q-eW
zKfgDJNivLQ9;Lny`ZsX+9)iDUzWf5_vAEgO7dq0CpWPTX-N$i}7wXu0?Qcs;ymf}T
zVmKALSQX;0%(OEye!&)S#S0T&iLDE-tA6D49?ZpL4rqbxg^xPVLOa=k_l1pw0bY0a
zPl!2qxwoDA(dUA*fjk#ehdIkio<%%!K2w=o1`fNe!?CEhQkDd|<iEv<Ym+#tuOytQ
zO<K+{TYF4T`#JSR7p56J?u1vsML!iW-CbuU^n at D$Wu5&`C{;>upMn33a(6e2r|>Tz
zcHpS5iCYi(@y>L&!{n8#uSZvlrsQV|+qa)5v8GfBbf*3|tf9g6eG&21hzoUTf&V`Y
zo}&95{~_GVb_?oN5c;xHuf6c#yOZP8rS9^FEWo^*Wk0a1w9T}u(q7 at Ow05(k&>#N;
z9az05e%Cel^fj)0 at aS1Lbj(G5;GH=XY3RC!c5fl`weKFD0{sGf?A?vP%6<VXCSoz4
znZ<13$y&5UHtN05D&V<l5tnBb>oA{N?Y9{Lcy`d|F>a-ZWAxnW0v2~2=IU~COfJhL
z_}6vlQ+qJq<2{H^Xai603Sb at -Q?-a+JQCM24tzW-(UImFbM#UD4#qc|O*mF_eajsj
zrylcMYVaJSzZhSHwd0d<Gxr%CH>pCz!B(vvq~<s(IZJxM^CEteF}~?XX}TLVGkFTg
zhyvFpa7P=|SF?*9h>42Xz-iwk(ahXXFV^?&qJ9W|6r7}cztsdw?&_jt*9C|<H`- at X
zf`x;%qll&30eLP9ma_vLwp;dzGCQ*u%hw4UABjy*|J9Wj7lXdx_p{|h3}v#%P*z1T
zWydpLJJP6rw50(2KBe>t=9vE%klntRuVvWhq-eg`A!9$=-8g@(<1*q!WSfxR8vc2?
z=9YRjQ~hLS%U=4d&`2NpHOQxnT>sS)oi`Up^8Lc96Kd+6V8R!hPnjJWQnrzrVEL`4
z$@0~Sa~VAoxMTBcWA2)V3dlWZZz*NnxD_%~O2Ni?OTXo7)c>0#Z*EzT1X!N<yU at Xe
z;)TkU`hc&;mfL4j0(?&iD}=oe??`kMIUf%CeC!)~J$NF1Z>LB9?{;!r_uVtuRzd3J
z!DZ at ybIKmiqg;+=PRD9+vi=QY#D5;ss_qIaW|fay-Wzo-3ZBU+2Bu+gvTQs6W491G
zEMirt!@U&s0~flhgZ9k{o`Lxyox8RB49QDuRiDo*_WxCUjO62Uf&D0LbN<AWF?%NZ
zXtuyFFT&Ng%ypBj>#Ew<NvqN(^w^+(7r$>GKwE8~a>#e$efh+XMD&U!8NlO}w$?c8
zzS1Z2?v|-9WD$9Bm5edoZ?2Cf-oudC6SOP#Puc3JhTi!)<cx`6uFk;UV-NPtVdb)C
zqTbG-tzSbM7t^whXyftXe8mc5)P=kL-EoX=o>|i$oQr;!i+(5gHMqNzI{ds;Yz=7i
z&bwF9UTt3fW)1nakqrOl+R^7VWZbkc&}~i6D22wwGGQ8h7WxeSN9WJQd%S(5lJpVs
zU6b=-&GYiR#Si3B#on<m!CoWSUkdtG@?<~2bHDcktd9;x#{17jKd2mA9W)HRwl4dr
zxXy_=ZR2^!iRNhuJ<0S;)3(?-v>bXt;mR4%tCx3cF_xhBcWWS at l)h&0HUP`$3(g6g
zFCynTk&b=N;`d^}FQLS|c=1=A+WmB~`s&?cu^xKISqi+o`NjS(aB?@0HCEAGVALYx
zpWXfa4|EFbSub%DyJdKn795!}j%8dqgn4=23e2k}wB^v_GRQuw$hb at nPNmPVe)WT%
zyq_*NZ5`5u+3@}Y(-UamB6>2ta!Z4CLjK7Oh;OK5hte13hSFJBS5#vCGXT5wBbfVq
z7!7PMuh3sQkCHVFZ512H{g8S6Cw!R0(0xjhrSq{CsX*KZlMlP#5Xn=%fhrEIgb$KU
z^4qtNb?H>o#G1snFGfCOY}qD0>RrQFC*DKe(Yt{uRjit}7xg8j|1-h_t9}VQ at dH!k
z(*b;}7~BDo%~}#C#AHwlnNF&3>$&koQu$3Q<dzwFZIyKEFU#U);~T-<+C$|1JAHHW
zW0)@FN!mi{mAhut{cOm at j}WKjxNV`&qn+#Qb?}G&ZE_CzapP8w3Op;|4Tr42Itq5H
zS7PAbtbPRb5_wneSmi5T*1$?|^z=7_H|Q|<&!aH!A6Ts93?>>x!cBG4s~t9h&r(zW
z{@6OcEMG7^1M59~cQFT?F0Nj18kKEoa_TnOy!xOZZZl_KT+1tWY~}RblTgFm#iM4T
ze@>Rit+r%<Lu at U^w-^|uH^9Ztxn))Tx=3}5vjp#d)^Xfds@`rfsM;87uri}<nQDGK
ztpq2`p;LNNr-+}6f{(-$tP-cu-6MD2v#~?F%_G0 at hDnUkDcBgv_o4l*<QtviybE`A
z(yjOW=nHLFNBZV~vkY^bZ_b8M+7ht!TKSR>ockv8ETbF7b<g}2I;;DRC0N;J!aBgh
zNJisBzyGscgC%c&d?SzZi$lde at 35Y?lC^^R-z^6FRo^||q0hd2um96Ci>Mo{m1w(`
zHuMu;U>Ko8{||I%>9~$p$NU7HwZHo~^%`OdrIYnSWW!0q8;zLnp);RTKca4`w#1P(
z^WB4=6td`sDx8zGK|UYjY-|-TWwnpG`e at mP4rYLiD|{okTlNWNNfC?u5_N+-7xXC^
zKbWJE7*Vh)gXqdCG6sGhhtJi5w<&dO74UEk_}y4)i#OA-!34n$i1`jSvuV2SW@>*o
ze3soBuAoQq_cF+(Er?A>fZyx^dxI~Kp1#VBGwT2K;d^s$I{w4H+1<iU>pqNMBYx)k
zZ69vJ at zCi~M}u$GTp5+tt<H3F&uf?9xxL-rP+vTGZ2DP8lUHwI1zuzAcQgX$WzhbR
zruD7lb)3}E9eDm=E9#BCzx#mmaK7nGhPqDZahQQue+am%LfEIoxOVV}jz{i2;4GP;
z61$QAzL_fMUzxsQ`h9#uVQb6dS?g+gcaHv~{zf(XA)#vw`eZTQV at 5f?>{d~ctX$ul
zj<<bvjvePo?4hpP;?%dO_XO>#*|TWN#@dg0irS=PiR-4_Lp63=h&=`K&^J_H_d&#*
zhQn5uChi}oO?ZW8qoqB~&HU}BjCZ!5F#ZNU>UDMz+R^5_7r!k0a`2Plmy0Fdm1ISx
z2tFcx)Fq*@SF|Huo9Ft1Q9KkCnCF!(55hO8Ujo0>Ibi56YvA+Bl9UlVlGk46Z7;$#
zwf7U)eAW#xUpd_(nPJ&RA?78w#Zx;gX=wv^$5N6vZ>k-x&mSPXpkog#%fo-!1RvYq
z*Mu21!EQ$|7__`k!v@!4uZ(;0Qm%L_)=B>)n1g^X3C0 at 7f7^?9cUBofOTkeMyKm?X
z;7EbHpGaffD27jsl)=mx791fyq`uUFrmtGv@@Yo4)>lC1iHs9IBq#m5y>IuURf$VG
z-6gx%gKti1?OXkpCBd!W1Fzu4Tng!wCL_JR^M~D)_VV5REhetK8S$VN#qQ^=c_cPw
z=ksB$?ckHZzBp5Yx|*98&tl#r_AkUzflsZaIrK)hV4Je at hi*Po$*q}NPv=+VE}v=n
zE7?~J at e;7PHsc;&;4-{1npg1bm%zpW%dDgZGeU07leYBF%@qmZ2gqP0qn_%(TSD;8
zzhIv*NtJ82!dZ^JsZ9Re9B_A!O~LxtjQnaGd8m(U?6(2F>_x}2(~$2i=>J*ZzrsEb
z#3y%3#$PtQLa~T~?SH5j>(WSntl=G5kom-Jw+L&YLwL^>=;t4T7bDle-L5wlv6NQj
zXI!gtdkMMMuz}14usImEm$GNjg_xs?jB3nhCfIDA<u7{}_>s}q=@ch8+^9qU^Wj7v
zc>L&Lv*J-|hyivv>cOD_a{rk}8KZp>Q)+*dDGAFZ^~sb4?MM<rhE+TAv|&*ht>wt$
z at XW$zsvXMff+g5r1$=3TcUhXvECJ3bo^d(kl22asxXWIxb_?zlQ+n?3_0}c%q?}|e
zLhcnVOqy9Gi&i-+U$ymn^TYZQ_HgUjq?)SpI|nVOlZOwnL>$#;lA|u(>~*m9V4NKs
z)$$PMN_>;Bm#zR;iT<+>oyEKKh7YkXC$Q#*4ckkdknz+Z$8oAT7CI*0cW4T9VRHPW
zCaNm*9pQB{uFhcJQj!nG0rFX?3vkR`0^CpyEx~&ZM5}m;GRg1n+EqNZB3UZ-=k08J
zlJ&w^8v0h`MB6fn^E$}-2sVwI;MUEcO4v%PBq##5={nf`_Y5m{6}#G#FI3c|e#0#r
z$OrdR8n@=#3}CxH;Tp~saBDjADn8W~Sq*{NoEoR3qE at ZQDwZmqK1BNJo#T|@j*`+%
zK at 8STbCqPLg~Y#O-<N at h%V3*sS)g~d2SqT(pooe6**vnZf_X7*7J^->d|bT6`+exc
zlY2=4)Av;{IS1c$Km9pyi1L<y_&BZI{73Gq5i6;M at QsDx*pK6LV&yaeY?BlZF(01V
zITz;U1*U&qeWC<h1|_ at cYhQ=uTAt-yn9HXNtA1Q&u`A#&dD~C#HsSd)JpVjPIaC-1
z47)?rc9w-$Zu*AXB34c}`2FH6hF at VGxprRB*6O{s!(A*^atwa0YxIMKZ8yE?qu%Sc
zywCJ_^Z5~FGWcC|s=fJY+s3`m8r+tAC0*)w%$x7+u-rBJroy%><XYSSxwfU$uY_F7
zV#u|I!Zr!HwrQEWIA6KF)URdbH;&phdShW*X1?;DrGC|G^tFX;8Tra>rGE8m^h{wJ
zUwqrw at I-^y8WbZo<7dLJ0>5(nO7SbfuNc3wAmGm&Wn+m8n6bnn#D at jN3?J~GtH3$_
zSR(d+ON7m?6?SCzGvJ5fKlhhvc6y|7k%|EZ7qJFfcIl)puve)2i-G8C6E-Q=Md16Z
z=#<k#|MMvL9)wNUtMQp(TJemYR-K3K-%_x<(vnAH8Tc59-5oZ0VB{;9J#=A{KYa`G
zLp#)n^-x8a3~_kZqlFg+oR&#`=UeUvS!7(6p*&`~2(n-4yNtxF(}gF^yNyEQP9yBr
zN~UzT`+H$nVG?5GwZ;>$!E<eMagRj~el>C(*g4qB#t3Eyyg!d-ACC(;34i4^@Umq?
zpU*xD|CRL*IqYJpdL at khJ=>{VwmG>x&adjq%N_1aZcB)vNuj;or`#rZcmAP(o$ji@
z=-v}%^mi-v#x&Y-e0kJug$%NuSVWmHXX at ZPvx2v~9OJKim&_;!?|s=!Rfh2I9ikPx
zB+k$1l<)V2VGM!$)xeUZ?Xyo|45Y3w_TMCOoW$|_^O;2c&|m73v+ at 0zr)xu(L1!wc
znl&TemB=G|1k{Vo6ZWG~_zRuy;#;SHZ=2X()4cOW9uxV5scZpcc|Gi9Lg>%HufS$j
zR|Q@!=wNk3haWeBYvU at oMg`uw6k_e0hB_?bGpNtf6R;QK`QlL8S<GMdNNH%a%K at Id
zexG_L>XEdo7hBmDJS$sB{5FW;xESX_-G!AU%od%h*d2UCal%HG_%~ZMp)v5S$cWFV
zlMf%^in#OQ#K*<(8||&qoXEu(4!-t%XbkujkdJylRgHI)&QNA<SsO_FKxutG_0zk+
zW4p5D)$I4N&av9DzU+qW2fT3Q8 at F0DWKE1ZSP`TMFK-)&jLSI;9&ek=fqs9T?&#!0
z7ignXvfJWRWS%4X0enakwr81Ir^LRFV=KUUfjRHy);QZfH%|d3x<uI9@?oDU#NK;S
ztl8^Ml71|N&7g#Eu|m&|5~oeSwX67KDg0ZNv31~K&-bmTRhhyQd`8C~c)$W35!`v0
ztBR at uxy_a<$+mq9qnib~B-`AD4#ImKhdOU2^RBghSH4jK4x|3<f5p72GAhB1wh(LI
z&%8Fwc&zVL`xeH^vHn&eR-D9~=VcmW>QKIXyf=@`jmU34o#BwKLo6%D-=QM;!tSmF
zrj(R_59Zm2nD*Uff#JlXlmYrdCHj2v_To0(cD)$!y2i at wc}}u-V#|NcS1ptCRSV&M
zdvCT=oBVi%AaxA$2j-6MBFrCJo&fWQ;4Jnq?aX#Dg9XZE&{M)<<q;LD9&|RRzQ`@R
zpshHrRa`d&7E~NzX}M(`g%#gu731Xp at z7R|p<Uv%roLFtSJ!dMLRNSlQp+F4yff>~
zWKBgsKj*RcQ`;-_>KGPm3$Vimi492_)B*IiC^^1AudNJaKJ1rkkxkA^#@-o>(XpH<
z^=UtfJ-@#E5x(7?9`K}>UvwgteQG)XxoMR+{}UT=mo)ZK1P5}fG?BGIF^4kId7asi
z5y9fz`xYXe!O-f?2A+z at 6snS?=JuQ`WJ*J%b~9|wEo{kLKz_aPg&)EWUJh(~ze7D~
z57Ki~t0WWrXW+&n<HQ{|#;o8KVyv9Q9DNA7ny^JMPw0!e9`^W4oqeG(*{zUErMvw*
z`7hTXZ<)J{`=y3{_ZR2tIP7H?*TIw^uf7TWkimX3EzPhYpNg{)8H_g0LVx0)?1!zH
z=r5hT6l>LXJ!AcBBkC>8s`OJDB`lNSLsp}L$gD$A at N+t{TEU-7HG7|7;A>`vZ|}O=
zm)Z at i!3<4X+3rQ8UM+u3?l at A-%4jjN)2qs3m9Cef<d*W?0g{?1rA6kKTa~-hM05hQ
zjhyHOz&(z>_;H0fo8T}LQO3h at vnTim37=W$4e%n|dmtS=!4114utzMnH#;s+)|F$h
zk6~Xmul--gd<%QW-M^~(D!lu3tHH at 4_Pym$YXs^p*6+R}4_Tvb!+x;deRFELt(O|G
zR<Lnfu{Jq*nV~GSuI&JMCv?tlh`s^&aTvDl10gp!vQ%PApRm^tt4+C(1HeGlz@|g&
zKP}vo7YnV0tPGNeJr(7RfeonHQO_LORXMDjp``e9w&yk at 8vQC7v33hbAXgcbF^g|h
zNGM>undWHu^aZqXSeZY2dOHjDC|ZJhvV2{1-nEh?T7F6NeCWnmbMfC<zSaic*w+;7
z5|eu05soraLO77f*v5Ae{d*N--F1z*B2~=4va8fyj(yv<zHD=s5PtDp&nPZrA|`zI
zlt^P%%CSSChiVrl-}9|^$SPh<&2ha>a098+nE<uo{^BjOTCm^s=;k6b6;HnwX*jnC
zx<U#3SLgALIpEcA0FG!*%Mai at GNm5l7&b~OM##OPtra&B<NW28M_bCe`IHHH at Vw9a
zz|SHB{%QpISdoXFd$L=GG|BHY_hfH6_U2LerlTKl*~h_IplC9I4^9NX^$pA~R}j}&
zO}-(t|D+7#O2uvh7yU|m)}##op2%=kHHl>;d;IuXAlHXjhta1u+4muR75lTco=ro0
zr-Q#F&7KB6>nMUp0O!EwCHrvSbN0s2Xy<;kVVQS7mQ0k*;Vj|bn_2}N8SqXU_p>24
z9k)rGq|1T%6}BKh><2yVGd5!_WM{P))Ou-gcPCTDE~>baI=k;dwJ5E4t*ycgKKjVX
zxkLhAkD2e8UJQOoH-1u#Rbx{2UH{M<uw7)Guq0=Le{rj)(~H+c3})b6tYPc!`Va0&
z^yP~p>etSO at 2<!<hgP}r=oEV?a43Rj<edXv+h7s7=DJ3>MJI5Jz*th?m!!n-=ZH)3
zGvQ~&uaaP>kH(SpGv;~7F4(OrQE%W!bb^oP;bLAP=5#H~!XsSt>re(c;?B-<%eF}a
zExXoZ?$iP+jk#Ew*mNLhR$n4Nr_rL#2sT7xZBHXMc%Wo;vHNI_?sr_Q{S((4A>g{(
zmK)KsD!{29+ at qXnw=tdY0d*l}o$ysyz3r`-R_?D9mw~6D%-&)(<twI^`pK}5pcJ+P
z#CUnJHa5tOnA=i}*VTTN<lRk;j~CV$-8PAC?jhk8$g1Nr8;5II2Wkx7b9IyF_M`ne
zoN15ePoB at 2Jiiy`N1b(v at -V@2)rp$u^^lXpt>x%9{;a~`VwMKi^@yQXP`437ZE(1-
zhq2C at 7+a_PfnU*7JXh(o%#}olSAjcv at PN`U8k~8KVZ_xd`GTm+1P|;jqlH|<9<R7h
z*zb^2SAqSwjab6t*ssMB-63)>7a?A(Zo*D7SyzANc>!3Fc3?%0Al4CihpB{V%e7jx
z^O(?Y&$@Hn_q(oO58$$GMG;l20%*h|kCgH6vEx|<_#a6APpQE>Z#fFi{TRDmGjros
z?n!$Rng2=MH=4B>FEk?dVigN}o%iN||Kd}`d#6P-uL6I~R%w*}w;aR>+<^|RnBFK<
zP~Q<hH0E*mw;1fL9H`nA!!6jRjkvKYV8k?7g6}LqI#3pAPiL;;cN at Rs?grnIjaws%
zRt07n&(twB_BynGI at 5)9#0u{^??tgOW=CX<Gj(Nqz;xFYf;At!`*CTD`XfsaxN+&7
zC-u at q^M~*qjgpw at fV81Emt>H6&D(!0&?!j$;(LXO;L1HdvAzHoaRm5+BFH}S*?jbw
zui&%Yk35vH(fl9JhAlZ(MCK>xuCZf??IQCN#$h1#JQs``7w(1Ltr$hD_^8dEOBuXl
zA{T8+`t$+i%;@uIqjq*NtzgXH$Js(+0^;hJH~s(ReJ+ixlP8}+JK>o;JQD+3Lp!IQ
zR^T|S{b8vMb8~xtG1q%Mg}8wc*W|bS17#xII%)oIdh at G?tat~y?(gNmw|n#S^X7TP
zTmZX6B4VP+w+rc=BaeCOt^R*~_e^h{1qc(NBi&Z>83T^Tqb^?)V4ZS%iG=SxJ}v>K
zeCzGa|5c8 at r0i_rGqXmPc=I%gh5iq=iOKgRXTx7mMCZ_jx6Xuo*9N;Z)_JP2e}tZ=
zF4INmqZ%Ru!VJq*^9{7fSvL5xa;7_XhHhcTe2YW$d;Mcy)jHz;9&N=pknjHb3Z0sW
zce?4FKl`IBALG3fSg~%g5dYWvog?4X(hTmB5~dMc>sv>KA>YC8l1thX`)?auR~*xr
z63CkBM7h}QR!DSb6ikgf{J9d~k0xTN(tvX+sxh+o5%X6ChFO*)mTb|~`4(Cf_Q1U&
z;DoTI;Ssqk_ugmd72)}TtP=8#*aJ3=#MB4Cp3RbDt>$feJpZG&t?~)i#G;ql<fM**
z<$u(X_>VeLI<p5xQs;%9kC?tHkkrv+eM!SCM<(jZM9S>{1F0wAbJL(dzY^Y2 at hsV2
zxEa2O&Z~s;hxn at kwB9m+SB1z*^g(djqK?q#C+iG*E8+jIz~<>4J*3{ojepjgC&^oH
z;3MdfdFxKkDiQxPBqrj8Re`leZyn||?RWEM>&^fh=~h(ek_xfcoRr|_Zg*nul#)cb
zbH7_L8#ewi?imTW=ehsB=WFjhis?0|SJ-izz4b at R&iAnNyaq20?;(~7doz<Yx{8!9
z$^f}!=s5vQ3=iKO<Q?-iaHo0CU(9FH+ at kwSVmr9m4gVT8OmNKX%LC51QE1vz$x6c<
zcL8-86eggHGK=||rcDbF`*N->y5_wq==XP`q{v?uhx`|PLH14|bvgD_P#3YoHfu?r
z^SL~1__K~~bBP>5JpmudsZNzJR~9JHFWiLlPTb~AFT)%eOX|-nOLV|>KJ^T6k<X}p
zMtlp}Xch8 at eFeVFz6A>O2NlMQl3DIw%_RDXsR~+&ywjT8-n`x!Hf-x^T7W*?_=23H
zQ)`+_gH`N7hk~>_Y?&%?g14@^kdGYYY-CXPx7W}qZAHMn>3H=+t|bOenA5-{;+lS&
zvdO(I7G+p}M~}Uk4$swav%Bj_?8Ufou?q1QS*Tw{lQme*Ejs|dH|ZA7X}<!OBUp|x
zpuB_lBaGXUP04@$kEqIew^Kmo7S-_RXYjYIz*_$2BHLF&M;W7|XTskQJJ$L?v$9*&
z%IUUz57V_hU2MR5<;}GL&AO*-Ehp$p9NF$X?Jo7G#GqFC+pw3wH;%qYUFfSV1G_#J
z>Xxd6e6>Mr!2Ra!A9G)^OZEv^|3=-Wlo^u|_XOOUJwJ15yGuS@;6wdi=UN^}o at L##
zOC$Mi>5Gy^Zb5U}c3>@&Jyv6M{Wavx7?K){+wrV>*JiPM>CJxgeYq`$<T}jdDsg`l
zzw@<x+w_ciGLE6QANwGma&A(~DeQgK`5NNO4-FQ+(YT-x{4vlcdY0iRhTo$Gu~w4d
z8nh4kWN<y=*Gh{DM&ATCk^;vMafFNphe_3N&0yh!Q at wgm-E@PaJHIAM0i2y~OwY3o
z_it0Vu7=RAPa%6^R=eA>F^3qo)lTH!-Qe0C)nq?Zq?o4O)+N3oO;mm3CqVzn3pX9j
z>9Y>VW;KO;hcxL^ML6!mQG;U^j#?b|j4gm3VFd4!I&{@K!^N$@gC(k5u<=<!|3=D2
zco4xq=>)&a9rHQ16nN-=n$N?A8qHFfWhoZuhv3+cf}f48E-K~iNBs!#{e)X4<Bha+
zmpbp_yJ53sirG?e<~sOcz1QnCUp_7sTi#iO_}>)~CvH at enA#UVt}R6jn_^lG8+d?j
z#QtoV?X002stvT#vn*jY`s{m7OQM1!jm_M at kf(6!7O3$4^oqgM8GZ6pzjD1=#4k>r
z3CuL&kpC`$Uac8g at MRZA_^!ll;-CJDrCGsLu+_u5;K$ZAFR~NvqPfkqV0;nJ)?^I5
zFcwBj at Q$aQ(SO>Zf9Lm_;PJU%%^=nc{Hd~&#j(|$eJrJmP2%io?_jN5f#c7ve-hu)
z0JG&UArYN at Bu&dl2*w{gKqLDYC6$M3r+B at ceMn#R*OU5-ICA4Cu>TiEU!r%698lL!
zv4#v>)2VF{2csTj^XV$Ony$+KA?0yePnU)tsvQ at 9@6(0!`H=?T at V)#(0YTt4;?sIZ
z6?~6nu0il}5j+|0^}go^$d1`Tv-_sZ<P)Br)>`Z%pI-a8_}*Zn<j`QYM1Ws2e&Dy;
zf_(_LJdHI1;qyTp%$BE#jR)s~36@^E_1p_=mDNJN2kAhh&68<=Hf-h&4Za8R?f!@C
zh<yjol5O~w&pDjK8Upt(fUSho-&LP;M5h>i2WuUHXJpIsv(uQ!g+omGf at 9!Un%g-5
zKC|b+C-xiq&YsC*CfTcRIq4^!z!z(O3p`r;Yv6;m_XuwHoGZ>_FMqAsUAZjQU4ppc
zOG3re#qNO at 44EG?8<!|=4F;uXXy#F-iYLJu?y at V7UEGq$YasTwOb(CO+hj-=nciKK
zYKpe|P&)8)*~Ph(HmaLbgY8w@!F6v;(dU<?=v=o~yF;;N0{>Jq+Po;g40gZL0d?vp
zZrgJ@;3KN&qRuq(o>1p4D-UC=_BX_?6iBN1k34LGoEV{tZt2(8{g at U8jOs#@xBN6)
zM!p;TZ^yv at mO}VUo3)|-b`x}C at cmnhS;W89VKs-e4>c|+z<#+BZcQKAFLyI+BEVdL
zgHQ+CHo=J+lFK3uH7(vfhx~&I8W#l5n(&*(ikK_@@({xtk`QA{^`7`X#d$-YJX-MQ
zd&;h|WE1ak9HYv3wlMx>mA34D?NCjaG81`c>Y@~5&yiTiuM?nG&!eRd>;;rM`-JJO
zbkBpab>@Yv<V>SVJ{p&$V1|g#H)u4w-{ZICJCA$ID7f8Df}1;j${n&VjM#{NAOV(-
z at I-cyn2MAOE#POMWGNlq<K2|57SoOmEpG)Az3O3eVe*J?1}!(gvF5V*wPYFk=P%}g
zPezz*@AZ3Z3$1N2q20~^_hwC&kv&VOl21kmpBtWEitB}kkK$efP43P2we$?Pq+<<Q
z1>C)XRv*4X*WlZaWeoXiF_%A*G3*an5XjE(xN<4MC+EkF8 at J;B?2J3)f3j>(aH2Z1
zIrMCcDN%+sR=sO5Syod4pR0(RL)4+caX9qcH;4zpxg6KP9PpOAu3=vOoR^C}(MJ0J
z`C`}rz_DR3#$F41S%oL|eYx_~9 at +*Q&erp0jDhch!cU}mgtI<ay1rrwvF9w22#v4C
z5dSzg`@Br7%fXI(*oz^1z-y}{&s|!>Qer=B*fVRtZi8JNW$q-h6&zJdp}!J)W_#yA
z$Sv2)XRr at E#^}4`T#pE2ZhXs6e~wvl at 9?ia=fd~amLkqGo6MKA(V at j0le8k4C!f%t
zHc!PE(1e#)Y-$!v=v~6kws%Zii;gn(O`iMv_RfiO at 0yKQgJy@9XD=5El59rzf)-=n
zf;yvXg2Mp)MNZbG;4wHw_WA{{!6~#!yO)di#-7e7vm<v{ptVu&@;s>DW1YbEM8*ss
zj;iTiBQ`RkoJ3wH{_BXm!ThMw?nOLWe8A at ud5)`iHL!mY-%`yy#6XXG?H^dvfA0j>
zFr{Tlw0r$N8m_=xT`^cVb<bd44jE6)-v0$T2Jbp`7Py-JwYpXf+cQtWtqIs8l7t)t
z7oKhOJ at B<uHy>jV1AX1-n}_?h;lBKe{#1GAFO1?p9}%7r*k521AU2w+e)txdCCcG~
zofq)kV@#xHBv=Q|srTZ#vJ+mIm2Fu&Z#Cwxq!EW|o#9ovLmyl3)WtT_n8z_^A?73?
z1-`Fb>@!Jhe}jyfZo#=A*xByzHb5UwTpHJ;FL<}giCEhC at p4Z2m?EMg9`(}Jnn`e~
z at dI>lA-GdKMBi0Ud83uQ+a30r^(2?kU5sNaD(uVL{56F#T{lkA^zrSVGJ5z_boLq8
zYb_7BwtsODcay<??L6>&HQ0v}IKbF{)2B>H8b4MMgE@**ydAtNjyE=CI&wP)HjJKb
z0yZ>WJ%wsrwmGAXMqDR+@;}7H<GEBk^FDKhJhNir8NNf?Ip9J0y#1hc>`iu2R87ZL
z=tX1?;Uc<bJ?vGmU74_dd<9F1|Jkrx6ht(~=T08sKlJ{WP9C+BN6qB1X!2M%dCZ?Y
z=0%9(Rnfw3MMO?K_|Z3Vk*C^T{6`-h&0e at o4u4Tsc19f5bAx+wj04w$3!|P;1`poN
zF}gRTfybtA_S!%WKiZ?UxHsfl)wgA>JJaX;Ipnb0%je(kkSm{F8<@!_{5Iq|_(qPb
z at K|JsqukE3&0pY<y9%XAJ9hIQn%0PY21x&m0(b3FmI#~;*P{(x53Q at YczD7;+QntQ
zqn~6RmTtMb!`nw8Q#?XHk0OJ55_UD6*hWcb$an?^AAMtySU7kf2RuJH25`yfmtJry
zmy5t{r06d}U5~=PgV=Mw(ZR+X1FI(DNLR}>(~^48mbC$e+?i4>o0sp(gU|d~R{But
z+K>Ce?ejlvh>5sDkBAqB{6#gFmoFAXJ?P5wJBxnS2D=gVC~Rv(|LiCK@&2pg%9&{M
z&?=;VZs}(gK(;uMr;0k7d;xR7F)@>J6n*BH`DSb<a11t6P0G>0D{XD!)*YGVPqmlX
zy526TDz-h;Z3izQ)^NhkZAO2TeLU7HFT&-xmwdx<l=T{`szty%X<i(=qc42NX7kgr
z_2EB`m!3W_SdwFidL*-Luq+2&`TLA1@%blHHgnR>d#bjl at Q{Abx;<vS>Uo!Gsvx!*
zee<&k`L$u2(f#MU$TwlX4(~ULE9qM2)?}OWGw5WkaW-a!BaktqYPhfTI at _*0!WsRS
z^T}NAc at 6t0l?{Xi>xe!RuW+hK8)45Yj7{<%_I0fodOMK?R3WSOSQ(iw##O^!nZ&vT
zze9m{{d;IZIyn#dRTfd&g|WZruCtnd&v*X<)Wf*yf5|uSMN`_}<r?+|OXq9plGRm_
zaVk5LIMJ`2hhYOgkXl;N8#=@Fdg=}MFEpMC_$kU#Kbf#+rv`Hjof3~Hbup*rUCfR5
zFL!>iAeK9`yPEKm(iyZ2dexp50Rz7wd}wCWyEWwr at gc+&|CpjNF9uI$3Ci(XN}>30
zO1|lZ)oSKC_N)W<Hqn)^hXc5rXdBkS(#Z7z9K;(V79#X-ox-(&5f$9#(`MkDr(rK3
zw5|U%Ppv;SR~lYE@>)a-_mC?$i0C*C(KQ>BBdWNEz@<KiaH;!K#Fj4I$_2;2xDk4)
zZh)Cp6Fdw4bwzd)uftjb8;}*YXdZk>z<R+ZQRHa|1RnvnG173BCboyjn6orl$CLT`
z*XzK!&XXp+g}Bjh#6p3;An~&-sp7Hw$vk9e!kQj?oZS}^sT(BRE#E~OI;KWcm<*9|
z^G{$O^;oZNY<wskJa)Sx4bdKOzPTff2g at Rj=^x<uaHQeBxA9vPX_)#R_NDK~FD=se
zYf5C?S4+doEgv8+;2W?%c%fAON}W{x#wMvea1PRMOXaUm!|@1?v!(K7*hlO2JNO at l
z{bA%%`GP4 at x&P-<`JxVKl63*m*D?MDKDNj>`D0|RB=t!4i^2Q>-SIRJWtTw4ghf;|
z8^mt1_LL?Ts{Jyt))ZoIS~Ykr6hmoYO0k{=ziziuY$1IMYt01c-o--2Lj{8cpL|XF
z)t-5nyH%4iE52z<pJH7xT_0kYUtM8HAvWW;#82`RVYRe^76hzZQ*)*|(->O{4!!)*
z3chwq>|l>_d(a%xhNE9flUBNLyd{-ien+aRkw{hhcj5nCsRH&b#lzo8la?pJNB^l*
z at xTqV5n@@#bac!F=LPyrIpLrPJp}vF^WhagriM4as^ANxNpI`5qUl!fj{gtr+m(=i
z2H^FyL}%{hN7rm1Hl{Sxg at SKfJZF3XT_y&n%iAW at pU}rf_M+(=_v%>7p=WIZp4o=q
z8NywVor$tdmC6OPixkrZg9VoNLcs^L^Ixa+QpH0jQO*Kfze;TAKBv5X at h8c54ygS<
z^f`+@*V$GgRnTX=Z32#6uBEM#RY%5IWPAwK#)Zr<`h7555j49~;K`Nm!@g6xu=EJs
z^iS=GrG0$a;6?fgjH~ns+|1O^2Q9s;e5!wsUx$w((_XvFVy`MnU%v!A0D7JhI*{nw
zTT5+T{yl=RY2eK^<c4r2#?@vI;%Y`aui$(&>Q%s#0<WBgxcwYgANWoLp<R$e%Uq|i
z&Uu>m?(o|&um$lwql8=T>3rp!c5notuGj5jC6Kjb0{Ed52(Q3?{A%&5fy@*JBgV(e
z+uZ5J1Yw`DglaGLI|DjkN8f_(bn0=jg3+-HfNxG05ssAF(68Xb65+qd`@e>z0bWgF
zhyO5PzxUZp#9m70);fY=U(c|YVa;9ba~9Y`3-s1BFF*5-Lebub|Kw*T<9y at +_|dFB
zZR-T3wS5&Y$YH;F5nQb);IiT4U1{*aFhr+h%;3|mL;O~~H|~ocac21wj47nji!%g=
z9Nxi4Y<)UoA{<E}zj<}pDJ^QwAn|`!=K$BX<0O9@{L?6JJ#g36bmqy4Z{}lM$%tNs
zG3kQ5!d~#Sv at f5Qh99c7^?gg``F|8*Pmu}Cjq(FU_+P4XR(}JWu^w%k4U9&u>WE!L
z@`g`r|2zT8&G*((JwM0S1l<e%*3p69MZhUxZ$0eSkWYgTk>pLkN6NV$dr=d6GJLDb
z at KfMtdY|>y*or^+o`Cn7mgnViGT9rLnw?FSoIiM+5{Mu0|CjTr=8t>9`Sic;ReSR^
zPx3>Vb~icolblmrP}ueV at qR^5Iqup2m=yP?ua>E0Re!$!!wK#va0Ni$CVgXqFW~oQ
zQSLN4^Mna}RkbP`$HJ0M@=u{};vE*)IS3x3jqorBeCA!B_8>-~19g5aZnp3JH1TEM
zC4F+b6g-=P?mBSe$|*B=8wUwa4*j84c!kn=`$Rfr>L&Z&W{`4_{YMgNfH#@fi+z%-
zGc%32uNdd{!)E$s;NrPLIyg{Xoz4WpemYuY`yyLyDlT5TqO<>TV49 at zn8S`vs(Mag
z-<McdrJ>)p(&rJQgZ&S{O)exnS>TVt-d5J!%zyY!i!L(e!k<%5u-F&*-Z53rs~b1+
zI-OSd+e^K1 at _exnw)egXjxF+z4et at ZG}+q{c;vm_we?Lq_LQXd^F_V_ugxSA;~*mw
zwxWb;)Cuep%oSkT9_Nj^J^*(7 at lY}sJEChgzad^oINnJf&#J-wF!4>9Aq5k>%0YE4
z81v=Nf4Ncf9Dm?1=4GGtOO}1rUy1z&Pj)wsq)pz>6j>-UYyUCgcN5SydpR%w`=P6p
zl6)6!2bcJR_ at +9n9qLCa>08bk{=J85QhT^HKjfkPeAh`FipjCuvL`-pEB2y$apL>f
z8Zy>B>)G(-IWi|WDuTd&481`EIou!Gg?aI^s}DNM?a;f>3Hag<cwayl4&=556hbER
z*XX~w8h&Wxa%5b=V&?{8%N;4fuN3R;iF`(p&s}dmp8v{6{Qt^FJeiLN`LHJQ`5O5g
zA?x-?gJU|r^D at 3A62E{*gY#gdq5E%rUt*1_f-J_I0Na{^N<updh<(9(Op2r?jw at dE
z9u=$+V*BX+9P{xg{HgFG#&u>d!k$2_K8}5Q at Uaf|e$CV}-(=UT#+X+0n{w#ncfWG2
z9#u=YOD;((yHstQ5&k37hrV)i at 3taN5xAKF)ZYo#S?+i%!3z>uC2(r^ryqmeDl$%*
z>nz}(e$boN{L`7sKRxZBBNsl>v+$j!RB2WXJF33wV=r*13C at O%b at LaJkb=JLz)2j2
zuPq&O`gE3nd-o#2W?gOruY1T;mCC;VNfFvj@$hec#4o9so<P2<_h<Nv{@(IFa22ni
z{~8uRXRf}4`Kg=K`?Oo6{g&T1{LlZImm+}S0QNuOCutHVa&lh!f#?kET5xe)MjyX~
zHFSqt5Il?Mff(;jdjsV34`iKDeHpSI81zY5UrxqBXg`CsXm)+bZzxL)(HY4RK8iWm
zgK0hX;!JD8oB{c)wo6Gq-udY=k?mCZAM&@m?^{+~wimM$+Bf~2<LvYZM>_pd9Dj8u
zjkp|IjeYHe2|pm_wLFHz8e<OX^<j)5l?*s>6MhQ$t%bw-jL7e?Ee-{6jXU7~YhV(5
zI;t)$JGheD^G0 at msva?F(v^Sj35|LeI&;kWYki6dZm%bd7ZhI at ZYbZ-SIFCqq04}U
z(02Y3rPOQ*{Wtu9`4Pi?A(zVd1CN>c12ZlBfd}>ehshWkJ*H4i>-EY8b at BVDeXyk#
za9_DZ_7*4vw!ElMzVmEf1WVf&vGeSIoogRkv5d at DdAKJZWjn#~>ydEh5qm~Yo2#pL
zfEo<#qYXX$)#nfwUQMe{Dlm5`9LJf8RNeVp#33~CANfn^?h at b)54xsdo-6aQTZ+Iv
z{7P?iRUuy+F8uu)c9vod`aH at csVaib`bsa~d%gCnYn4Tlaz;u2I)SJ1_Ty%>T}sPJ
zR?OIniFTMQM~k-{e3YZsTaLbShahuBsDq0C%1h-h0xmR at 8m0>>x*o_QvX?3Uuj>lL
zI-K_AAL-5img6kR-?0yT1m*K;QBJ~#QH{FN0CT6UVyV;j6{~FagS%gLR`GKlw&7c?
zj$*28_sg8x_av(YY;_e2=Sp#|Wb$4M-tiP24qnAK|N9%9dh%Y?0P at YiyOL4P<jHdW
zqY7Lhj}cC;Gkp0>attCeHs~fJV0$qDHy_-M_^gY>-ZVn`!s=U&TNC3x at S#fQS0$5j
zwxX|s;O;OESA2C%tlzz at vWR>?_NoGh%@=aDsS<n+o&6-QZxIJ0O$xo`hy8A(No&(t
zdEByAhV-eiJ${fW(31yuTU~c{T1nX+#=aR}{xCC_y!-rBb|<bYrj7eyk7B99_lck#
zz>e-3H~JrF`x}uzg&#WK;z`&#T3w;CtC)(Q9k?$kl<Wbb3wW5M*V_ESZCHM})dIQk
zszNmiF1biUkC{O{!Ds|Ycl(3C;vwvdryMEq=Gp1JcFCLm0 at r>dxMH$DTOT-DrjMW<
zg+2W4N^d*Ls=iZYa4gVabaVva!o*t3CN^Qd7ei;3l6j%J!aFbYc;(YW;`bMP`se(z
z{Go|?p}Hb6ZeZTTyik1*a{~5pBYNH7&ywc{t|v%Ux0wUb_iCQZTz#9J0l9T>I_yhi
zucCx~f5?>z=yg2kQsW8I<Y?zg$g8VC>%psQ9&>w)3Hu<A#Bp`kTIrqc7Lqsq at AJyJ
zgOGD<BIjJpb_*kdZ=~k)E#5u(0(KgpFPd>}La*IIu!(lWq?A^2T&akk4O$PoCc*Bk
zzw;DiXT}rtRq|z$enIFm*RyQZ*nP<(ca5q0%Kt-R<LPtbx~Ct-{PEn+*n4amc$ArR
zaQ(zD3Lm>~BFzM%Pxt`Kb00V}jUibRbpV`omS-ek-xG(SZ_X7*l6s{W=yxKje$x(S
zHO5R`Zv>+YJ>+849)BZGZp<U!=9Rq%8S|vvEP%|e1h46GUQG5CmXz5RcZuP!l-XD4
z?L?NI%0OQQPhXXmubtT(k`Bz^JN5&+&s|FoQxym9J}=x-BpQuhiv0l{BDbFKP{h_1
z2fz<e!vfz3Ir40lD?85tpSvFAd;s-!qNfV_XBmkxq&2Gr>IrVuUr`3=5zvXjK}Gzk
zp$({$RA7PkXO>{y;*FI+`R{tmf7*2%+zc1G70lyAe`{9w8crY`I^1`L=<SZ<Su3C~
zmQ2dGoR9({-w1bDMIhD*Wonb4c-g)3V(_RWuYA$VA-aw9WpF<7g^BxKa at Poq>h}rf
zV~lrRsF0`PC^9%~lvSKgMRV#!>HiOB?;aObwf_&FykIglq)4WdDUL|x=`<tJoJvj|
zjEs<olu#xdgRG85Smd!HlVP|BI~<sqJ;N{z!(13H<AB`68={b!j;08V%IGiy;&_P^
z5y<TFyw?Uj{m%FMJkRTS{+QR^v-aL=ueJ7CpY^%EKam#)(tth6j+_vk?o<w`!6#Nm
zwgM{)c4CJbK4*pSqs*LIF3$APbN8T3L;TPpZmubaG91rec1tr`S}sO>I%v&#ku19R
zqH<^-&d)kBsU6}>ww{}fXNtj}>D<E}J8z2b56)k+->1}Q^XajB9wN{F0DF}M at 2=1s
zE-}M)f5^Wp`#AOf=P at t6*xTC&Y~je(Oi4&x-;S}q<(=X4BHsRx{-?o1Px<z$k?*4D
z>^^p#-1T*_^-8QgqVA0XZID>XN)J_8+rDm!*y$_~>~Zm&jj^YlyJ9amcgB9_tP54C
zZf<$bS@~L)q<71ARvvGu<T5*7HM*k9`uqyS`MosSH-}9D1Aupw(H-x&I8GnS0~9+h
z0?!J$FddrF`QMzE>c1%@HYlte^B6D0&`&?ifd=4GkX%M(pjYdM{|TNv2fol1o-FRl
znY*Zd<WVw077$A^w^uN7fR4lqv#Q7(Vb<?|%@N7?91(RQ|JcuneRxg?8z%H;&yDsD
z-;G<2_47MJmj>M~(U-wXYVUv^1tRW9M_I<@_#?6;!8P_;MvlJ=TJ{Tk%*JHn6Tov#
zg={P(d=4WU6ItjkBL|%T9eL<Jzf=X8)56G`$Hrt?yua;|@V(1KZ#sJ)!za}WwZ|ps
z$6aQwpMX3pgUoc2kzs#vAclui02{b&EYGn}OV%>h)gX?<-de(&(l7rSzE+Tvq2uHI
z%*3W>*U2F#AIoi1-DDN={A~rGn-<8)`Gn>X{$X|#-f at C?$6f64&^g{)Yv5CKHZ$}G
zSce>708pl$M_GjLBC`Dv-XDVVE?#iwj*Ha#|9U5(xxa(vt|NRYW5W)HuH>+w at +S-Q
zIbGl-e`3b+oNyF!6SbmlbqqBRGRG~FE3)>-(fQ!x4tl)i{^YqL&hjYdUeN_S7_XU!
zJXe9NeOo`0t`8YRj-J&A0+yd-xrJ(xlEKJ<O|PQP{jTQh8;D&eKI?;Zft$m43pPmC
zvJ0+cEdE&fA^dw|x;N+cg3q7i$(nmbqqkT*->;6~?MIF*#B~b6mkHH6lZKwSP?O1S
zg7&10XX1ni<rdANnKdQ+QNoYb^l0eZ4}cR^M)-Q6yryTv453!2v}gN at 5rei_oomab
z%E_}fZ^|@w4 at KR-C)>FkKJ(REuOLsxM~8NY)b^T_>-crx-+FMqGp5#AhqnC`va`23
zrk3iByx?2!P^oh_bqZ=vod=#uQ$WU$&wwYWRFXcnw#7g7)k%>1htRD#JI}&jN4NL(
zgKP=xo(G*fM8}<FqAp+#Q at +6bb*@p-)V{VxV3Pj}W#ao~*0D0w&7vkmcgeR!(%t4Z
z6>P1a2y{8f2L_)(J at B6lUb`R%HV|xdu>`(~ulN^@z7kFoJVzTP?3`#selpXLkF|cw
zyAj5?0zu`e^VUkpmjovcn9PtV8}Vzf)@+&OzU?WQdu2<J^{@Ok+~>qt!gpY3s^DaF
zE#%M#?H=gA$#a!t4rH(MF)W7Oi@|g$gx=zN=)oJs#<5&@;&k9WXOG{{%o$E&?Atwb
zuUYi<;WD-~_U-euGz at -CZ-`<@T+_85IPmoj5Vk>Y#(jbKarv$#SYK_We#iv at y&dAk
z0~+wIx^7_4qr4Jpqms-S9dg+a`zMLRC;QfL8~5)|WJTXXPNQ4rOQLU`QwQ80VoBTB
zx~N- at _3)!U%o>Fs^)1KC($<ij(%!|&%rwziN$)F}SGhq&6Z;&BWiF2Fdp$5WbA^0o
ztfx>cCb2@%WSpCraZV%tN at TslhiX3TB>Rx3-N4A_d&oNCK7=2etU;ptPxXZlb`$t6
z`*X>vf00=0k<zDT{_HROG&dW5_t?uqV;sY<fhfZcI!OK|l~v{`{N&0Ox-EM{K6tD`
z(KW9|+g|ARS3VafI2Bf-l!r_g420G6B1R0c7$nxWD?<4i_?<=h#Mc$Paks!4hWzyX
z`MM8C*_Hs33v4R*4)cTJ{wet!{qr@{)5sgY0D0pB1cP}?K?mx`ZF%8#8POyB`(^x=
z)EY(mkrRG_9X<f&=^~O3O<oI3RkN>GlR%%h6m2?;Jn{jx1`^vbR_-kKU4&<rv{iiN
z-_lHQ5}#C30m3Er4Ct6jfkT*1Y;+{XhS;0^zQr1DuvtY)w0kbGVTH!On1Wm%a>Np<
zsf?`??PC6XX|)Jg%h-F~W`BwM8)2VW5zqkp`ia at w1Dc{{gw;BJmsVpQZGe8}OMZv+
zd-&PvMZc1|NgOpL at tlkMHCZA3X{*DY#XeX(39)-wbAXA#i3WeOk4m3 at 7W?ZGrjE&|
zgEOZVcxR11Mw?>lE)ndyJqnKTd>Yn-j+HJf9-~Rn)gvyHxu;>PX8fLXb=7#;UeQgg
z^@8zov9t|)hJ;*`G)&z^V$g*REk at C-njb~MnEUTLE1+LsVXjrWmN5GG%>-u^x#5Z5
z#yRMm(q)Oaui`t*7w36f7$1E(bKerS3Ye_G!xYt`o_H$3PbxU(dI9kmkey!ag6#C6
z)I8oMN_4x$INk<otAp|v2H}~7z_wTN*vz|MVCn?Y8Rl#Q-i_G%@pso?{I8{UAkQe`
zKz&bJN&e<~vJO0j32aWW;9}higjW^R<W94vlYF0E?U>I6<UYi9(9T`B?;+%iZ>jrx
zaLtyGp!AD0e4Dzg6|e!93RR(TzCQ+(Z}EpMN<sYH$Lhy3KK<LQ-kMCRcZ;(X at w)<R
z-QS&NS;B<RImy!Z*cNFbyAtcD#C46+H8tI_3w9F)_*6RQ0PHD7U`DiTy$&0SLVXSA
z`<b%Lsm<`sMGTF_VpHU#GwUtpd+`?H^Vkqz8aN4Fds|D{_&6O94N9MctPP*;;r$o`
zv;i`B$*sh(bqd{TcIe80U!6NzG*lqr3!(~O>n<A(7=QnM_M6bbJO at 9y7{trw!#0!T
z+7sw^vJ8G at SMkgwUi9dE9X(kD-A^0rDhGJi5r^3bABiwv0tK+**W^;4#O)#YEAAD4
zKi7AgU_6b}j+FstnQu}KT;xj7&VPVDSK(WFGv6}ASqOdV1=!0YaeNx~jcp=1 at oT?I
z;&-+SbwihY<x&&m at XD==2o?Zk!MECh*jUtM_D1|6bB!Nk7lX%r{HyE874`^Z?wG6P
z;JF|BXY)WQ_+ZWpA;9Q<c6)YQe(saPw}s=Fk&sP8DBEMY2!$PSY)s5t8S=BwvG*cR
z*K?lPx<IrE{->DlA>eIFLXF;4R4DX*l{^{r+mGOzQt%J|@g8m%aGn(vE7%_BYKn=y
z&u0hGHNbz$5OoOOR})be8x6cEh4y)j`wmUNvI+iIrCW`M)Q{y_I`J)c*fOwQf&Hv$
z#CLC?OqxcUh5W~PS-2JJRFiGSJynqksg2Z+m=p_JE<HMaUXGZ<9h>GLH!|*n57?ru
z+_ERPa<#_ri`tM)PXLpvG5d(7f%CzpC*XU16Z235o>~cdfV$95bF#dKX$NAn4I*FG
zAo?61xE8#1t<*?#C)|gf&0_8CDn8=o$$t`ODf+jwNf?s*lQ3ndB03*qdNH>=Zm#qQ
zTXr~hO+Egfk%o$HQR|>TxIyq4;G5X+T|DBe)@<+7Or{LHCGH;4zX?Vy!SP(?CHz%t
z79O~_rbon_EXyTe5KH3x+IAwA*O*lWS+AI?<mR?jqaC=nW`@@;A at a1iSFm4~E at gi*
z{yj7;rmcNw{{_%#<fC_#ko%}N*;eLT#s|!mrjhky%b1#l{u{9#v(YCDV$&<4;M2Gw
zI>Hc_M%F6Fu(}@OLe^^L)J*cs*t(pWn+*S%9tHehYNba-)5gc^dyE%yaFg+oDPk9(
z&!M1^*mqNw;ui{^zWM!{lveB){r#G+afELfO>)|fBIo<2jU3oL?)hZ}J{1~2sdzL2
zI?_<>WcX}8khP1!5nmf*{-?^G9!cBGv7Z;mVc!ZRJc;->#0SI-EL)uFd at WG1eJS!E
z<ernc5~y{zZ;2YO=7Ao9Hc;vChpXyA8{uztHE;&Oypx)Pw9+y*e2UM>q!mFbY30)j
z=Ua$zs}jlk#$wsl-%t~NfzT9D?NBvht&MEt<~z_MP2=Xbtzyb|A&xPU>h=9#Z10QI
zB9CjDj;m4ln9x7O+6QzRKX+68`%-`(GoxZylCo6O;M0m&vEM$M6x?9^9Q(=d+eth|
zn(*J$2jYtlR`Ftl2 at 4Jb=R0Pf3GG)wpHavEgoQY9_d<Rvj>tnaTHyW%w~5&Ol|iI`
znw?ZFzXpCF`2)uO#IJt@|2`!-2C==mq3q;FRu-^kpG=O)evjSE`0;0GOIQX?K4pfE
z@?np+GKdYlmL7_XPeisb%UuY2NqLAOc;$|BSoeM{31~yL1F=Ax`diW+weWj=d|N!~
zTf3$Udf6t>Xrljn0&P>UltLQz)*{!r$TuTWgjo^25ye!^lQTp-hcaUR(qh*E<Snk@
z9|lfOVQ3sbD>vauMfB6%nXV-<ir5Jbg<!Dr4cD281%fX--*D!umQiwcmC$V3fL!s_
zi2pBUO*#KLiCK<b+ at 0=Bo1<kt(5=CLHU4KJzr;QMtI~dj`#tdsNqN=trr`9P638#=
z0FyDrRz-LzV+vvg(t^J;rbI73CkGZ>CUQ-YSW(&=7#8C^Tm at zG>VbXy8>tzw+Io?U
z+BP=MSdT?`Mhh7V{+5ufEyxeT2ezKSLx*vAWGK+<jMNCMxxLU&W^wD_|1l at Gmy^z#
z;AoRpFm;vur!MRTKXC8Z`=5DqpG(*=Si#?iI(}l}jA8%SN^px$tm%q2ILR3Q&N?zS
z#>F9;+cNX=g_LR4diT`0F57MJ1i%)(t><>LrXY{8iFr@)f8N8Xajy<9fWM;>@nps1
zTWQVeOnD{Zx+;8ITJ`VLI``rm15cVN=LJR7#TBs3!h)>afHN%fg7xruD=>CWmr)g7
zhk;Q+^c0Qm)nrb1*$`8&!M(663RU)BrSznD#J*c0-|pI=qB3|Bw#9p$x!*VB5xw6x
zt#HVGMJPI<w>?imP8<y<`9+8OQkdLyJBEXd-{}GxjGK at rayVNOdCL&gFG&eS9v35U
z|EJ^Ui{B&uyQMbIcK$T~E`i$ZFUWDvlV;)n3{N%R&vSr38|NI{_ZWV&@Pls&@MW$B
z|5!a7yubRY)X-5z8T*>Njj;+~G|!2yI{R^esd^5v%g#uGT+tfm2Rx8nxkrQ>2^IwA
zpbqm*J2(QIl5};gB#Yl4z5ZM={0GcNr6?EUlItu7ewiM6(Pj~N#pOR?yea&)k+^ts
z`@cPNr#Vy at GlCVN!><ItLOhp)dm2DHhpDA;O}U4J(YYSk`u4wacAB}dankhW5tdct
zSMJ_?)|_xEfK_ at bn5AF7fI8yuuf6+1oqSSIhQ+nI_;q8{<;8{=oyFxu{9s>ZX6cH_
z&D>bz)@FY(8Y*fux>MSLyQ;=dhhGVPg|N-!;MV}%(g^aqz*qh}{qXaU->Z0GR}*=k
z3PXfy#H1>&CxEv&2>tOj`0Q8kfI9&Hax;!)h&eR!irs%juA%+F2+<Q+g2+muM$4>O
zGRv-%YU60iq2 at I9$I#Osf{)KXkn^^lI;ghKZ3hh+7?YE>8>ly^I^cxH_wmaOxLyIg
zmHFg|ao7c$TRC({42JUqb9_1-$`ds`|EA2uM;q4%PCZJM<7XD8I^PkhZ at nn256ak#
ze7Ulu7mQ5(3gqp6ZS<caxeK@=*rykdw)$%Ym7R;Bd-)fRL6Nt53Rc{VEyMZCg5Mtd
zSy0<45V$*oDG#M$S(|B=RozIni&jyko}%whU|+10G(2?1v-kTBk9iWyqnzZe4Zxl?
zFYOy{ks$9e5B5sg3Q7AGoc|&y=zLzF?|d%!<Lcq;vAP<lcErEtJ=Tx=)GH(o_?A9)
z8Tb4n`0MJc5yo!t)sMM@^X#7r<)(E~Gxtz%Ue_#~Z;_UHvL-F@*eCtN^ZoZHxEF)-
zI;Ww0le8S=ER=hryn|aAoOiqy<$lsClutpq7s^j_%YyTMh-U7G&T!HLD4&S(lib?i
zyb}dXIpp|BAt-+t<!88g!Fg@%Ot}f=Q&IjP%G<f>;JnsosRd<|Dbwc at P(BIecJSmA
z<{gR*g->eO>DA-5i|r(K(zeR;m{{5;ksJEt(+%p$#;jLY7RPbEB6>t)dtbV*VTBg+
zun}>oGG{bm9(obu>4o|%(0vU-e|L*~FW1Sz8k~=!YyyrWI@)U&BkS*uGMpZCpG@>a
z%+fH9(-2oe&w`Ipz)0du=n8fVtnb1fYk_?5jOUzgq3-ZR1MxHL-}@By!QmRjA6$og
z7I%Fs at i~+p$36bK!&43Ydl$V18 at h<>vm)5_uSW$atO0@>Q8S}%oe!2GM_4VMABn>A
z*N|&4?z$-8x#}T7f$Q+#NFvsMz*P4cQB3jMFMQos>p8+35p^|{3P;1;r!Hd+z&^e(
zj2xxcWJxdi#IAI{Df%t47xTt-aZA*#9-7G6!Ffj at M=pE{?Q4WQob=L53=MlcH2%@s
zi07q&uSBz|!EeAPuA`Hqswu^J-~WmE(P0;Evb3*hJYLxoOqowjrpn<z0zFU1G+~Q#
zCGl5V_yNfufmn=#w$fC{u5YSDGGUQ)0Q_^c#-yqC*ackyURr+So3|Sl<O;5OdIfIJ
zkLt{TAVH4jM}gS$<M5`jyc`I<k)*tddwG$|wWR at V0yVDngLc1(^0xyx!5PMNpzG^~
zt;j)WGOk0;xGaGqN)-Wpx3-!1=MX>q^V)zidw?`O27b?D{_%{@-<x4}<REY9GsPg@
zo#bRf-c96FB=s at R1LFWO(J?mdusq~0r_xdo*VzWlSJudy7WljrOyxW3q!r**ZwoIl
zm<c%|E%B>)FHKh_yDXe*@1^oTe-{|~CSaze17oG1tqCYQ{WW|#R=Xb9+9?p98fqyc
zF=cpOiG8cWQ+RA8^bU2NqGKyX#J=4I9y12}#<2azxK7sM?n&+f at MFjY5poyDKu12M
z<Z~GxqKnwGZ}(FJzw~8N20EM71zzARaN!!jlaGkDW_yscN)vKY8v@)b#>bn%y<%dS
zCg1AopI~I~ALqSJxz_^2f`|G?MGdY!UWX$S7Oc-MrB+OO7x|0yn*Ntcfxl at bxq4zh
zjcCWdYyy5!zfAG`THk7)CSeB05I1FNyQ7Y>@P};qGL_8;`QuxW4spC^fGIs}OS?ZV
zCDeA|ng4ZMkWU%oa>lJB&)ImO-%dfztVH;HX9}#d5+R4QwZXS(;1{gz(7=Z0J}%Fs
z65uPelvjR-%O7g15D)ytl0ZXGfp!vK(SPrB7jV)b|DUk!6!-hwza~TsDqB`(gicT5
z3;A6{Y+ at HjCnC>ry`wXiKQjxmeUn at 2XvhshU#fkT#LuzC!1+jP4N)YoxwC at I86TtY
zSDOXC at cNL><TXFbn_&wa$CRK$<G3V_kq#{l4;ec~HQ35!DqR+d*+9$_b1m*c91+Jh
zEPs77Vs at Y_9r=aG30%otqbAG8B2#Vt3^D{TJ*dPm#9A8P3osSFVgt4X?n5q7;pZfm
z*|u9)f2HwilJ^DpJgUv#F+R$w^!;Q_lX&_InFCcp$OYdm#rNLsED_V3Y%%?)0{*Zx
ziSgo2b(Zk`fSYs{x>;4BnRnC&@y)Iu*cz#U%W=xdwF`Q3O&vdeO$tBfUiN;%Bd^{o
zOZxRg&aTk7zrJfr=il-%bSuIQni3oGv<I7V@|+Dam1H?P3vnfdz?A{ECi2p^A}{^%
zlRBDau#HnhWy1BLrEi^wE=Be2M at 06yB-~sVlHcbMZf5L<*^-3Z&-g62!mB9Ibk+K$
zfj==c{-7?(>;TO<C@&7tWga!a at qNc~f2p3)F{{)Q*vQp^*zsm9Y*g$oqW9XeLk(In
z at -%Ocu5ifQV$Au!Lcg+0C>sQwAL6q$h;vRFdL{umbufpZ&#5zbH2`l(rGAOTMT+SM
z%Ek0##3~{-P9;Tonuej9s&9FLegl at EJ)^KW-<kLH4EVw9ToJQ+ntKV~NNj=+RJ7}!
z&HAJESzxb)8pIC?bg$Oj^?zD**Z7pu@`X(G`QE^pcj3ny{Ws(dF9cS2=_17)eQH!_
zY1x|5d7x>x7tZM})7IH4PAOQte#ywwi0y6U=zL^x at XrI5%#Ln)c)u>&*Tl{bH_k1N
zst;H{Y&`|cQ7 at K#3FH_dp^L_k!K2acc=-4(88)uot<`e2rFK%ikI5rT9dveeK#|j=
zExa91(UYPBG)9suGhO=|C%s4MJx}!caItTmkG}g+9K~_(T~yZ_1FGt|#JB$Cv-PDo
zpU0e6wj2nkYCh24_n8r6Hun5w?|IAr^<Cqz{4*nmdA8*M-_(47=)hmDtuN)9>gO@%
zRJ{@B-0^4oHoymd&vjtLyaqY)id&+6n6phc%!;RiS>4nF)ETOu)tjtCu9(csM3JI+
zx-9X^3csY5ZOIo}4(sR*8IiA33wRGXBZuXycXQ;Cdu`AY@$MKcGTMKNHV=I-L9B(=
z2;JCc2FS`4DAV^KeoswDRAGMCFwf<?Zl)Hw at 1zugM)(M%VV#1Ou(L$}xWaILPmt`Q
zYMBH%%MJT>l6V!jM6}oFN$r4-aFOwnF7x5gl+%_=&6#<j$c3N<z5#gJxpj^+f}1n=
zQHJKy4)|7&yzZ$;{HuQ*^pMc~JB}b<rOFiyOdvylzU5Q2NrE;V<eTOigrgXXS8dqS
zp|d@~Tu%|v0Zpl4p)3D>4t#9FzYd60L&(V;x^hxB_T#Qx_yf1?)Y6OUJ-f4yK+kNB
zMP8`s+ru&)(#$@ld~fy<tWD at VBMo;m1k%_M*xCzVyOy<9(RHk{804Wvd0y-Yxh6Oj
zJ1AKjvIe#at$kG2xFJ`gr)q`1&;j0J0Uv7hK8#}nv+lojeUVxmZrG=FR{KGA&iNJ?
zc%aES_sWZn_v*;hn5_g8F9G=?xAkPOG9wFII|7R48Xa|*ucK~i5n|-_?PvU^NAccX
zj9HLKfqtq&S58KZEA(A=Hz-46_Wl-Nx&@4ZZW+GSn?#2+-w6HBr`Q)0JV(Ft($Pt(
ziCTfKo+B;wuftd$wTp?Ks)uGhMdVIT5smml=<_pkwqxFx_R%@u)#*O)ci*QPu at 4nN
zb}cfhQjM55nMMUEyST}y(9!tLrPAh8N>)F9h>adT%D-jlmt^J|QqEZV)tQ#c=@MWN
zDSaR>h1YR_ at z;GcxWNF-3P+(dL7i!{U~bgJH3}yH8>kpq{B_!AINKu6MNHsmx2I#C
zAD~89z0_OO8EqtTYRbY5cS~$v@#iA;uffIQU->a(abnANBCU3-rgVx~m+6gI*bNz8
zJuSei+K|z+liDxx^HB&ju9w)G-A~4 at lp2=@*d_RmRmm-wyY($sgwtET=RM?O7b?Qr
zgGx>;C%BgVSQiY9umi(KYjh7w7Uj;)C-WKo>KNL?tPkzjx`KRD$6JnXIzAs?e1q7l
zEGc9TgXYETi^Cj{wt>cRw*+psRT5q?(1qN8>qnh|exU~H3dw^C9*tgQVe*RCV2ow;
zk1_O>UZrBnDw7Ny%K9fz2Hck1^f){6e87(Ye6V5r-MidoB~{upNHzK9K%Xe4)Fdt(
zwnoZfo|+3>@s<P%y58mLHqnewgH%y}0N?f(;46ORDG at v(0zQaH!C>VXq$<ei1-R#x
z(L~(i_F`e(x4UYl7lg}ev`)R+wAI2tV{3GDLBDz6t|7G}`dYUx($KkHXy~Memjq~r
z8`-)D;|j$3rD`J#&NQdKrLcOLn%<1usPttomJhJ9K}Sy8s<8)!0>@Je-E?o{-eD`Q
zd%Rf5HCyrpHDRZZ>-j%8_06<5!FvEk61j$4QH?CxQ$b$|Vlc_2y~r8$YI6qF$}Snm
z3Mx9L7XiDEpOREB?80|zboU3e3Yx=u+RW at U)VmXS3w4-(`Ivja66}G0jkXbW=h9cP
z4r=g at pP2Wb7U;ryj+ at mcTNPUwF6R`x(r16`9t}B*^;OWPXP5L<fG*YJ{sA0!;&_W)
z48EZVw#sujf at ceJ2()26_9a>c%b?0+RcV1`rOHGetbB|$$wLdwnXryyR-V$w=%_&q
zx(t2p&^9t_zlMyN1^tbbJ7{;mDuc3)Kc6E~;<*b%e at PGN=&2p-V(4sg>Fc5f^z%F5
zZAOmQee_s^*2;knmcHJTL6s0*tvOSo*U-;a1+<EgH<;{^R0&&|T$6ee`2xFGO<$d1
zm3DtXe5kY^I8@&6M9$WlqkzwQww;yVy>_ at UG92gAaGt3BM$<UugRT2)`q`>%v#60%
z+WoQCfOho5-fj)MI94BU-!sL{&?9$o(z=tX`cWs4bXjFM#zhwB$~E+q%ZNL$M8-v=
zpDn0CeDU$p*aE4<rt%g>(&*0_*zt?#Yh-Qk9ynIxXqcKy>Vw|n!9YLYtPonaYIHv4
zmnYEA5-^SQ<&l;&#I@)->QRGs*r!Y~g1m?Fn&<d>!O5_Lunp$YqhoUrdk)!;H1;Je
zh1S48g<Cr(7x at k}ce%4kobx(h_}77N%)=46*}CO-jh=0EARE4$IL-%;RFT{WJWk~y
z6Y3mc>oC7=VsBKgFq}hdQrID2 at xvFH@T2^C+a7#}QNlNRcGLYhzc#G^d)geQ9%YL_
z`%THJfQFoXSoi(fpER`3!X%Y*H|`t3br<6448rqC at Ug%g`A%yNNXN71QFbmV{la>b
z9o3dIW#@3-?#@^>qkcA?b*Jc{TPs1?X;6KvBTjwfaT}@Q9CG$7#L-dzDDE3boQLzn
z^)nDlwHp7gCO6jkrYh<m!TC=(_et%ndnom6-NUKM`spaUlK8^teB8T?&?3*z^z}I=
zmwwgEx)P~!Y>ovKMb!SG71gc497}vE)R6Nc^0(+PrdLA^+gwbJMhox>OGTRm7sD<<
zCzuV~!c552^y<YTZB)GjeviAZL at 0$>B)==c|ANhNCFTHhoU^e%tZs(?67cWBuG=Np
zFPhNbUy<Jjxb4zx87(>!=!b9d)@U#GF{5yk4{{76Kjrqw7i}sZCFJs|9y=?CtA at Nf
z!eS at OwPxt9-|f*;R*|-4fiBYrIbxE3j(i=u*Djw!!nBi_$Pp36=U@)(bX^CX$l+xY
zxp=A(`9JhQ(tGoRD#N^3$cAnJ$BSMKz}`C&mEQ6T3!YUh_j$xUiPWPBm}|>K1)~W)
zjjX0wdY1frv;79i7m0eG25zOn at i<G~y;Z$eY at KR~iWSO*dz?+UZi;#b=ZBqEtZ7q^
zDc2x1QL;zi6G54BKV}!`KBP=JpC#R9)pvg(suO+$8mAj5Uo6iw6HJ|!!X2>XfS>4c
zYvUU2H+q6uPitHemgPwzy%757?&NU&3Sh@~e^U61TB)hDDZNF~ove6uR(7RYN%Y*_
zYf$#CZP!$zLr>9YPZ{<V%OgtLQMSsapEl~;={VvYJ)uZy!hOrQFWUY9uL8`X56<9z
zrN*v at -<0%KjN?1FZ#ByZ+e4z8k9*%i{O)#)*VDkHlwjYYr)Rl1;-cGC*t04U9!Gwh
zxlVJeVlHqIFlUSFgA#T1Ja)E)#yu9?Qw4o-8NNNnF58%5u+S)bCQ)0z82Gh at ZShVs
zbBsd{j;*lMWPlHmLq>z0#Zd-717_cY4*50kojTagWTOdaW3=c~rft#ekkQ__E{xY?
z)}o%9tR{`y_NOt!*yR)!g{#7AqsZ8;=hU93k&i at yu?KcRchYe)`icy2pl4a$ap<Ez
z`WpiuJ7DU2uY!GJH;EbQ-pFcl=n)6G{=0v35R-sh6t(9y at cUDaVT*g6!djTYD(L>k
zStF8@`$OZO$Oj*MZ+uHx7+>&^T~gqaW3CsG`a<L9Mz%$=- at rbXc6>)5@?nxS(@k<~
zt|u6}@W-BU*BCe>x#sJgqrJR&?hMCB?wfJY%L*%_TaQbkTf4;J=_^X4A5AL?ubWcR
zN-*HQBsg(BTH>!fJP0i8QvX;VvoOu3mOjrC0l#`5V%##ZhNnA}IYy3rTR`GTe7{I%
z`Ksyl!}vy<#J at c(!TIkv|AxI?q<4H0UDZzF?vPhG=P$Vb6z-2=?!SY3zPwKh{In|^
z?UWMvnhwQ%>3W+};H<<tnj$QY_U=Lc^^5K36a6rceCv+0pcOHry@<hS!k7nOzLW8O
z6Z-XEaeUYJ6l^U9mbm*1<dRjiR`y{2h+n+Dlgy=*Uc7&fa|g;SD62==qC_1t2X|12
zwfXb>V(W+<`Tv}kAsc(ku|Jt(J}nkPXS4&h-SmI2;M8`fI8A6vAerNwJhI0e$9lxG
z8fO{59%J6wVj#L7{$eUq)J1(STYqpna**iH>j}N6{E+ESKhvLiWBth`{c$-)a*PgT
zZqyvuXuAtCKUlti^+4RlXz%mDXvbPo3Of)(t{XZa>}WCY^<!m-4M&|jKI}mZ0Y_<G
zz?OrK61?CBTO;zT?wFlV_AP1$TkFmMP3~K at 9&PJj+J;<*J_SO^g414S+O-Vr0!=<%
z<H*d(g?vT!W$eSmw-mG<x*xpfXrP}>BhGuMC~(*<!8)qp&5r=ig`g+wq+psS5IFV4
zRKM`|(D-$q*s5{9O?ZYnCi27o^~KzfRlRz49+kj*%cs||jqD3jVCjA^Pxyzum*lpL
zOv3*R7U=Z{^Y|MgJpUwlZE4tQ2(9ace_6-Le4cXKyu=z&twTn5YV1ePh8h&NupebY
zr?Y;v0CB<FNuFTHjq%U?6&Tg<*;)_+OdYZ}b&Tyz7nr^2RoDIbc>TZkCZb!Q5+DZv
z>-8_Nn>_o9XZPy$BBeCls|oo*hP}+<-)2{${Bx#UMao0t?)nj|<X;~qI*GvH=RP+4
z7U_*Ws@&00&qXdgbE2P6(A_AU=@2&>nOp>!?o|FOEf!G><Zs~BAztIGuQICjJRN25
zrCr++725rr;uZ^Ez+8L5SGnSlLtAf*G}<i5#V%<Q)<<_>n_dEW3imc}G-LJgPcrw1
zGxx)n{E4x;cHF;S&0P0muB)O9kB?n9- at k5Uu17N06;XycxGtmrVTC_VUeW>Bt2a4i
z at 6*MfKVD4Uhd2<#H$R4ZM4#3hA}L!1f4O at zVorv2^eKbnGHhopC@;8I?)`?2K2FMw
zOu6QMdAyE3M#@WhEzRM6+CPt*vtr#0ACIF0doZD&1KJf{$fbE>g{>@6fm~>(>J7B=
z_Hf`P><22TETtnVZ()E`n{s+?y5kIZLd21Q at BEp;kW(?bi+)Cb0lQMz59C`1?=bX3
z_P#jgi-CFF1p6k>k!$IXJIjK+$g;<M5nZP#jNYq*FQ~si@*t0bj%;?C!K-GAHjU`H
z6(f3K&yaQ at cuoH)WIa_M4OCGHPtBy<PtW)n_=LA!6KN5*q4*hl!*4?b)1TlSaxa3$
zr`c*9 at GlW(dYe<Rhovfqu9NFr2lC;nh6b4P_R)E$GY~RP(`@Oe(J`DGg}jd$Nx8t!
zK1%8(c;>gBO~!x!M~QDEzROxEF!Dl6^$(A7@$8iUYR at c@@_u{ZZ$8!@#CLN*>zZJr
zC$d#tcYy`^K at 0Ynp;yQ~I4&JK-YUlteYw>fI5WBCo411Z8~R&dJ8ot$d@$a>L)NSb
zJ4W=#80YU{+bE>}AUZtwY#aO$zY@^xo=?%6PKL<)vf-bcAxX%4lh2BH+rz{jJiKeL
z#eW;<>`DJ3y99BH&$DHqZNCgccMlvvFCrJYe-*8CT5!*Cau2XOAZHn~{gt;=u%XX~
zud#t(1O!N#_nZnT=-WB=o^MC~^B$jFJz~`RGyH at b;ICJZT=UgwX##XI&yYGuTcMkY
zUzqei>Ui;g)NyAJzHVc6e36ejltZWP*Fo$`OYhgwG~SMH{#3{A9x3`Y(fup>bId;<
z{aH!oSJe~|q%7`5?1O%2O9AQ${O@{Td%r(!K7X#~dw=cydXA!=a$snV)dL)_g`EFU
z&kz5pXPWsCXh-*7nD(6Thac8>dzPUd at C+j-N#Ee#RKdM21s=l`E#FUQDEno=6qH8t
zg2TU}xwTq~SR-KLSUJFpCf|uIAJnr|gJl1-VXP{-!^Hl8eyNA<{Qr2qhTAp%yk<!K
z|MEPM^Zxt&R&L|i^ZxYEp8xO950X9SO~xN}I4XS+9kF<YDyr at -y=<{i;F^iJ_?I2K
za$k?@VjYV6I<m+nk4}fbl>s<37Q|T|KfjAINiyMIkNu-ZL46E8nTh`ZBgcO%ZuUVg
z_0YJVI(*9G6z-x^`ME}J4)k{Ofw>C|1sT2ECF*ph_cTx+BX74JetV_Bj%MoU!M)J2
z;yK)x^pEVGd`gYIEPmB`JRiV358c%AG*K7iv=Wv+jt?7SKJ4x)C#lB-J*}yS&Nbi}
zYryom>2b76pSzOvP2vUjvcz}muS2iBAvp*8FLdKQ^iX*-?PEBFBl4l-II?nbk;|dg
z0lziy5Os)YrlChIgU?0-_9-!2opi`ik9{o5Ny-!`1E29?_bK>WAV)Urup`ZZo04l%
z9)Vq~kqVU#PXb0H6GM7y&YozSLk~WE9oB1q+YW!ZUBWGdj8&s;6l)&>w!L={Ta0H<
z4-!A%R^MFvjaBP$y)wLRv_xx#9DW&m7I2xoc|- at rx4|#A(0CL!CqsTUsdKOz&wWR9
zC|{l)m-k%2UA5b)NNiXj4S5^iPe#9zg*NZTw@=M|=fR at n9QX4{IrRk?mucWT;%?lj
z&xa1cOvW!U(0(H~hV at Ot1$=*%t0m#xy6gP6>oz1;La$!sUYAs983n$IA?4r@<Qecr
z8tA#o=GF^i>Wu2lQA@&%ZSg${)-$N94)&5~0{x()#CQu0;RcHqdIN)f3E~ZQ^3MR{
zV7p)r>?rVIfv&|ybVq_p&mtl(Rt6GZR?pMe>qZ5&o~PYf*jN{f8h at FGT<@irccne0
z)Oyd~>0dpM3LZypiFHxo>LZcoPWB?V^y_hrB9~(Wumbl;=5Lru>Az{(mnd6bw=5a-
zKeoW_fxhG*en*h&vea`x at X>~M+>@zpg7Z?xJ>N~~sX?DtqNAf^J)0v6&My63uPuXJ
z#+0#U`TG$~XI0d-fK;L at s0$Sa3qrz1e6oc)ZO02uy=Jxy-+@<9pS^Bs$70#lzM$-a
z3UVH#iCuC2Qm-ldgPe{at?Es-EH--erCxp5mxv|32|e9#^yw;P<`I6wTp4oEY^%yA
zWlod$##iOba<CT-!%iQo4bpV77Y+}7Ha{|QoUd?46xa(QTqj6;=4QbkVIv(^0~>q}
zLT6BzEVuR{cfsddfR}o)!0Og09x^8pz2>kn$D<UiJ*J}eCKKL!)a`Mos1goxGJxK+
zrr0swvG6U*lN$Itkart=zfcCuAbP|5oFZ5H`6I0G^O;omghV_$Y;?o^zZN(Vd)cYu
zZMrNd at Wcvkgbfp37;PUJoj7(RJSO<=k!5Ez7QxG5wgY9J=LL^z+AT)UD*DKqwcy7^
z(htKQzpdovEB}J;mCunuzuZFoB>a6_JUgGNhTZ$R at DC{$*JLlm<faFaeC#F27nSFh
zfIqT8CtnJip&7QY_ysqL<&aSap-Z{wF+cx^=Ik>>MkRdJA at E&ebCS_>V@}pE<w4-L
z#>yF8H_9u03 at gsN<)>%~uoOQnf)AF5yob?A&u%lT8 at 3YttfZz`kQX)^b9e&!*Z{tN
zHcRF(_ at q0s4pss0!T|kgxq5`T_fSnSd^6++^R;ChLwMw}dZ8v#rlE1vMaqQaD36qZ
z9 at lfUmYuv3b(NY<se%l$6j+-EzperEV&tW<AqS9*KHR4n*-)h(NvYzMMCiNIoORj)
z_9#WOM>X^#$aP at 3sV%u{Sm4X(!S&9xa6`Ek-(&XZL~YrFh5%b at 8Gj}VG*O$!+YOyC
zeXNxK!?^BtGI$>7x%o3m-ndp1WJ=I|*qlN4VK1q|+Ic?p4Ep;Q&?-{rMEer|vSX3#
z4+9i;bAZ#Uzv|{)?=`R3b-i!#e)l}oHQ>l(-GZ;nKGAJ~*7OJVmHg=Ro_wc8R6z1n
zAf_STX%@-R4kd8=fZ1jGU1~<GsY#R{UDpF_D$qaZ$3Oo8IVSoYjouNCOz+pBzxQHC
z65BAx8j{fmJ=)ZIwk+D9(MHyF(})2BCNW!!IX}x;E=&3>1?@+CC8Ns^g1>OZe{3Dt
zXYz@?12NC!xs2GiZ3?D7E4v7CA5#}_Daldp1ePZJiSyyd at DX@$(q5uV_hOEi1Mo}M
zL3X97l4g3Mp7#`)M}%j`9+L&xyZAVXZB-J!Xl6E}qqTsaAo_yZIFj$Sm<na|zh4KK
z^reuiGu at x5CPx747I6}K*v&qHOr75Xj9>aiw)Ri at -iOEQiXlD=p at x#f<30&VUz9Mu
z(7WkwVa#BzSCc!}zuBeZN1<-yn225oERI6)OeQXC9{8i-+&<5P^cQ$%-zUFDct#b1
z<gjHWS)NCq|BL7?^`hmk-dmsh4`O{*2<xyue;Z$)&D0g)EwVoMx4wY=G)NN~Cl6UR
z9cy&gf2~mq(UqJM;r;WOI55BErt$sjnxNovpzF%`TKxk4CauGgjoXQQ at 3}&6U>CUb
zJ(pM|>dR*<$(S+af2TiU7hueTDIISlY^P&ZZn`>O2t6XJAO1rg^}%J86KmnaQW0%9
z-Vjl~uNXd?=WH#Sv<OQiuw~A{ryToBJLU(;>2?**{p5iDLbm?o6<^(WyMAXWg?jrH
zQHrx_#s<`NTKXE_3-z4FxjlSTUgFR&|LqJ0$Ys=V4eu^?_*1krn6+9Q;=Qv6x>;U3
z=4T=FxS7azxR7P$ZG*k&ZODAE8?6DZeb^K3$zBbxfk|A~aovLZR4Fd3Gow+#F2P=D
zHnu}ot4z^5&HTlK={%B$^Dy*cnfG*yKD&g-^Y|zIqCwbBmBFTHLjNi-p1=uU)v7Zk
zm5v6gSlYl6#dHqzO_%lM0^90FOv8XUXcv5Y&H)dp!sk{;kxy?&hx*L&2K(>OKh*WW
zPTq3TPV5NXLiyk}GM_|^F5Nh-J&8CHC48^p(+2&aAJzrOzGQYuOWRk)mZwtHmMf8O
z95+c!)O_$P)vF#kWtL=st|*DUEJAWus|^Zh)s at 30mmax~vB&XX_f*Z!2k+L1x~8D6
zLLwtso=tTGoAh_ad;z*?w-P${>Qy}S?J%qMtLdy#;b~xE6i2xobX1muj*y%`8&TS&
z0=|?zqR)XiGKXJ;v1=6nJ0jBXzqgyl^_lp8k+}~2MueeDK(5s&#_U27#&ZRv4Wsi@
z&$Q}W)Z0EJ at nrpyPk%_Aey<%ZX<H|fwphxx%3YO_otWQewao#<E{C at N-`_v>O&khJ
z2fmQx;j1G4E- at J-=S7skVK1wKj^+lwyH4HcTPf{gSvNf%o_ at 5X?8%Vn5$Sh}O;wST
z`^vN5XHkn)gTJWhxs{t{l~vjl)X0|A1K$P7tW_bhKC_Nyxi at KdREaNomy4}a5I1$S
zl&gupc3wGDDZcoyo~w<%b}m1<=q%#c#TR|b5SyP7BpaQN95dIPMbWZ5g;e7BcV3_|
zso^)kv`q&3g*>)n`nsnS=>LqCbaC!&U`{uur*>vbQabHRVjG%)<v-d=)~v&ebpvq;
ze{o!96=QAx?(k#L&CsLF)&WmI-(9vm2|3)9LpzaAu@?9d^}Mfr(uG}N{tm+PD;S=?
z^i(6&E7}CVdXF at 8jbCmn*4kA^DW%kyau;e$d(E)Nr^1#}hyDL);p6sRT>lCCLk-cb
z(gNgg{0qy(MXW7sWEQp<JdU2a&acVs^(FIiBi59YQx2VfJk~*-qm#OxtaB^J>hLK~
z)>(<&mxDF1i1-A0HQCC!h(DU%;)GAh)j>`^a)K3OA4otw=Skh$;`z?7wT}HKDv|fL
zoFe(<KusKC at F{mjLwOg_H|@6h30T{SdZRLM6V6MGXA`mJ12_Gc6_k%La}qiw+=YC9
zi-lR+xrk8;AZr<zNr})o&Ig^S7174Z6t%G?1;!Psk at _S_WvoxhHr8U?fqym at lWO0S
z+vb9fEY8le&TWLQAsRW)=-lQQ8R9gQ at U{CK^K6*ax1~&*x5;Wf6JB5D at XgOo+*FgB
z&K6r&Y)Y1<uW5*oh&0;gXUT)IdT7aY=_FP>!4bcZc-6A_jqJ5sYGCh at QyI&urN98r
zejopLaAZ^lg_t-|2k?PcSPOZ5$IG|$b83Y}*@^sP$7{AMu%6Lmrkkai8S&xm$W5sQ
zR(^K&TFB#dv$s><b!1R_X(Oez?V@(68|9FYa6JvrORSG<xkNBbMRl*PS9_4pvKsg7
z7QO>{zVZ0gEtjm*c}qo- at 75z{tR_4?swBK_X$hW%U%xQd+P)>wrNA?FTip2HWIb!k
zqQqPJa9(Te!a0evs-n!m$Y`XR!*^;2P<IB(Gq;=|v2(~%;1f|7U0{8I<Oo|ez3xd0
zx%9St2ij9;<q_;2;#ZmQ1ioJe?$2~75 at uy@gg&%<OBrHT_1TGAo|$_{sEIKC!Q>34
zN*rmFc|}a7B)W;y<S1zVh~&@=Y>fQHrq~v^R&22}cW#SM6;}OAY6AY*XH`$8&f59B
z=ytF|e at EN=xDtGf-$_0AIruHGdNmD;s#4E^rl#v|MBXJdbd07325ZgWgI~hD=;cNE
zv<kP`%#rR^>=DpYt6D8W#b|<OoA{$x*z}`C#C9P57jwQQ7no!%x?%a|7k#%yo^iY<
zsG%B!?W?<>dz9JJx%t=|2AmeJ#t7NbUi+X(yDc8;&o1=UrY at gt??r5qg`F=rxnC^^
z*<X at eE!qiPMhx~Xg)rR_(2_=cagv%^(s<jN)4W*0`}J1KGrS8e2dOUBqbZ+Sf>L;}
zRcKrKlG-hcQl7IsnIf=UO&K9{6?M?qJ7;4bwSwQ998P?6cETR;>9G7$r7v_ at 3!;d>
z<flsb)DXSO^WfvRvx%KO7SBBd8)%+)70Lo}?e91)#Bni>#K+JG8*>oq`C(3t4S3?j
zM+vcj7x1n$qOVxEm-t-i at 4yC>v~cJAQq(ofwyg52D_lN-;8os!X5F)R$CSuin;g$n
zw;&(E>TmIV&LAIwp=Vli>HHp|ABp_wo*jTcPima+9Fs}FyY*cX`ac03Z>_^k=|FS7
z6u}Pd)fC;`z6-HCj%*|Ueb`*Y at RJ#!O#b`rX^9HxdS`&otG&N3cdb=`cloB?VB=Fi
z!nQS^-z?4IRXDGU`)8M<ZwgKxu?5_`I=-(<y_y0PdgJ%zL at Da>Y1%zb_fKoeC%xv?
z<CG$9<VVm$6{lcqUxH2|e%>A`l;|c(2GJJ8>56v2o}jR&Q9RhW;VZ}~X?c?2Az)u`
zIfXT%xA(H&YuP3q at Ig*jJnv71Qp(%0k at P^R4Shw-$|3Q<Y=Q~%8^f<s(4~9?UWepk
zX|a_d-szHW7RKOATitlObHI;`0PhfU5AV386%xEpb`@+tWvqdyHzI<j6o<wQoClqf
z2bfCtwCSP4sr}Eh^^F*tVDddn_u%;<!uwG+cAER{SN4m$#_#(U at 3>3&oK&TK(9y+G
zVvZjdX(Qy}1@<fKV)qZeMDKfr=vF~rH at m-pKFN{@`*7l;^{^$^FJz0Eei(X6LgNba
zRDHU}sU4*M{&pwizfeP`rM?RHJ&kcG$9Kv_3}pAkeDGO&Tsrt6kom};(*<4I^yt=e
zng36|4`|23_8XYTF8JE%CG>;Wu<l<J|K`1u at 7Tsoyyw#~f%tUPf0B4E$#4NWxAT|k
zlVM}MErP#n34ElHrxfuCz26hv^ujI7yyOF;d2G#bj4noQRzSy-M`UGcFV?O}uZRA8
z8_fgVw2GVAWxn}X3yqK&!3Xv4`?M(a5dQnY at BdTdF3=(9_9*Q?MM1qC!0xeil4m%p
zAakD)4oiE#*827d6+0{_&-q%%=@YhQ_kCT0<D=PG&^x{b%$y67%q(Rw{Oi-Tla*2v
zOaJvdtX9Wf at Do3<dL7dbS~aGLmflRnuUMxT`i6CezQY<rUzf_D8OYXeiOKE at _^9jy
zM;Qw^S;MimGFBeWhXcOg$nd<(@#yd}lm&>J1OE-os-sWOpk6_anFarRHK at 0T&XzFk
z&Eu>R(R=4<?5ti<qx>`EOf>Wz^{FEJV$UbpM(FY00nS+b0{BeEmjwT+ at 23KnE(q`C
zT$UOx?fdi$Z1%t|XBlD at 5k;|}SPuA7_9UQxd7P-#bmRoY<V>;aZ-%e=U20g0*orM-
z*^<7}DTX!^%Qzlys}$$?tc)#)uCl#9ba)L-nYMIU7k0z<3w^29eCMOrbe_^{mZ>b7
z*tvT3(xX|L6qL2;#G2N*`p>%}ep#W6*to1X{PUT$5x1juMPzg+hkZ0hXIj)pk7fmY
zU$#(lRwLHbN9h-&MWo|CiK-SD7P}%8XO+W$yrbasI!FwV8hxGP^MQz_ZmAms+n27B
z+!QtL_@%GY#}M0aTiVu18PQH5)6R8S3)5&W$)SlgC!a2Aw0;)b5TuNynf?RI4*9*b
zoY*Zct8$au+PTSP?b_4_I;bn7dH#sG)8ZVy55PR~hTKN--0pzfRSCLe#ed+PvubeM
zfnzm}HMmy2YQ1zSd6&9tF5&^?pRDkB8->l}y%9xc$HskcPa^Z)NXYsB(3pLo$132c
z8#(QL-%<EJoFU*LR`n!hOVE$E0ymB#ADGnm^h_%KsYmU17pY*E!oCua3cOv~em8I?
z*`K1TI*==;U$PPVXWwM(De2Aqpj$D~XHFwFz>aTryxcustUU^>r;X_Z>#4NSS%LVW
zhSJ99s%eB)0eb`T8{>=EFW(3(rH$#xd0G<0T#J3%Q3=0b*wCEF#f9tX<Q{%#xWQP0
zcnm_%8VP;x`vY+run#}6 at qf1uKk@#b?Ze0W3BDNcB}@7=yszO`- at GCwF5JCj3}14}
z&Nk}VZ8vHnuH+E?u9veJI*$-`4$db#_u-t+mgC&VSxd^1(+hb^@&9FKCH^lUzDB|)
z!VT9;;HyVdlOhY4<9s#kTgmqti{%K(>}v`fj_d~BUqa9Glt1#f9_XWe4e&)bzSEiB
zOI^;Xj{8;k!Rp_fRW0ggKTNJ8F at v*KlDHCXflbJ+Bz?X;5&l(0UgyA5S7?93HxMUO
zsB>{l>#3y{_vonw_<u3{xS%HXW`x9EpuJ9bHjWH>t1gyKb9MuCe31i-2#?X|W9WV~
zAY%~xQ}PS0N=@SfW=+H6u>p&HR6 at kAwHzdV=+3p{c3t9g&e&~<+;d5|F-toDy|t3M
zlsGMNy^Xe%Bt9xU1i#~H!Y<*fj&R}Uj`!-#kyIP<Sa00U$!Iabjt-sl#H(?z9se$9
zgT4K4Q+(z13(+U&vT}P93$zN~0<w?UOv!TC*Rgjv-$or0TP3k+C(GTxkg^NqQHCkR
zW?rDp;K*A{ygQ`csdEwwTwc>l0vby9v{u0mt|V<E--)x=o%+cEJg-qVgJ)7C%fVNw
znoY^j%SHW&cRY)>RX3Y-be91(@ecl-wp#dZT#7t at +zKq$&ys(KU&NRn+nvbe)FQ90
zD1#TVw=?@H+E-x9<u5;w1789Y-%8pN at E+utU5S^lcfvnK*b!bQDmh*&0w!wdo)&4s
z44(!^W!-$9qvhCr{^1z#FCf?HXgg_x9^4gl at _(}e8{V2y;Z!Cn;a{K|v-h8w5 at mP*
z?_X1kyxNVp_rA at 4!WJEU+8}v=vH9!&WAmSwq(eR>loOl3KJvcJe*)~fXGl40{&V at l
zd|cZH-v+rWm5lQ*x5z&EV- at 7fa_pUP*L+A{>K3L}*85La*{WppvvWAWzs=bL9{}}e
zD0tCQQJL|Q=(sdJ<q_<St6~4Y2p;hap&5i89J0ugUYtX)GWjQ}xXAB$D)#2d7TCLM
zMRlOH6%6lH1RZguFEGqRJ3|c`6PfeB!53U$jlD_EfB%5+6q={u52KcP0u`{?^ipk4
z%~%Fn?S31+!4 at ra9XOWr!<N-)iebZ7+{!05^ZDjcF67^IN2PSWIwP<$ayICFJABr6
zL6*_GUIK3loCK;3dg8r3+gQMLjqX0D1cpWf+SYEN8C at 6Zn{Pb<{!W at czY6+Y_#Vu!
zLR)L8{`ttii~3>jlFldo!RpMwN==5(WgWdi?AXOp@*WzU02}<rL?#!(M>w!?z$J|B
zOA{i_TBKmr3#*|I?F@|@O+35 at aT`DKC&IRn9~##f?yMB|N0`L}9OROv{|4J-H|&_;
z)&D*a7>v4jQshdUYHC)pO2M0%d5+Nu7 at H3RyQsAUvre}DkC%nWXCv&ue*HFV5cP<+
zqhBvaKC&`mTX;4eb|0a$Hmn at _85wLr>;G8h at y<TV*10EZhNqd4>$ci+4f$@>(q*I`
z+4`SX!dD5ndQ>9vtVUs+TOGxb2I&1;9r><a)o_FfYp*t$MqXZR-wPBy`E%~;R2ky2
zd%2sbGU%)g+-j*oSVvuY5<J8|=8jH;o#%`ri%LkUy2Is0x0G?;Vzmn`(Px}8W~|e=
zkCU;6Z<D-5%LQ(+Hj`uEeoOp|T7F~d_ziWaNFK|(TrNMd?8G22YxfTUpYxYeQP<Gq
zMGDvg!0$clFD)Izox*z^$cX{GB4B`WldcUdV)`K;>xV|}qZeki7?5|kDu^vKbS)in
z at _NxfG3MAXtDd=6Gu~$%RhC>88vnPoW5;LG$NPFmikR^6KIWl)oj!}v$I!S=^zmqm
zg?j{YPBU;6EWpc95}ya;=WVxWG0&<ra#9XFG+ at _Z{>%Ji&bZVnX~Nhws*L1Xcya=H
z58ey=ou~=<)AZ7EyzdGbkC!(gX6N2`<lG;R-Gpa*MoQw;e at h!5n|-4Dz9%<61Riv$
z at SQvUPtPPd@rFZ_!N>p2_b%hd#obAAaFQITKVK8c?)j_Sm`ZqpVfn&VP6@#%p*y`A
z1ud`ESbmbxPciXffeP^L?z>#@4-&+H77Al5S8;6x{F{+S!@Ev;WRgMr9dyS{9TsN&
z5PLH1ZEjKL9UYg`et1$rEr1P}3p#RFR7GS}*EjqVkjpMvjQ-8`H1Hq>#QD9ENLK~Q
z=p_#&fM0~a-7c?_b+C<7O~gkad!4stu^RYtmwGF+*FE^)VjXbjHuqXu<WYf$`&lAV
z;)i{k#9qShB>j@`vlkg#dQoWHZ9ho@`u5ot at IDu{!b6V1*yx_keKqXe(N)g>{4Zyx
zlk#3YHL`JkO#VQ1(C#rlBf9-QpOHIsap^TV`R!x&^BD;k7hz1}B$7|{NyNi~Mjm2k
zxTj&95f6rULk>mkIQ%ym``;6hA2VYCd-!u7msZvv`|7Ow6;|`r^2H^tf3Rv at PqFe`
zT@&kw5A2;U*}L4qEU7z|C3Ev8Zez+~ApfE6JJE@>D>JDPxPvR<%Rg%nwEhlqwSvyq
zI;*fJbJ_Xz$5Ig=5qp#PnJ|781`hn+qx~5h$D at QMM=yjvrBFPZv9~+}nzVj!1^E{6
z6*uv6UEhdk*N>3Hml8XDqS-A^TuA8Fvo9o;Lw{3L{|NE1_~Q-4 at YNF=K4ds6?0UuZ
zvq>Eo?=COQbLcw211{PD`D at v|Ih5+e{uD;qg}LRiOVHj3#7&xlc8!hqTmJXrCH?mv
zQ$M^Py5c0Z8v5NZrv>LJY{c0)-gWA6{t2<6 at oi*}BKzI#uZZqFey7^NjBi){_ZVLu
zs~%%mi+9}^M4VLp_xwAE!3Aawe4bj+t{#8H|0e#?GJ!v#qdt+gA_nj_X|L12fRsaa
z>o^>Nv5jA_#0ftM)~AV|NfR0Woi2PsYokE~e<1&Zh}nnygz>p8OKR`qz~1!0Y4AR`
zz^9GH!4mlyz7LhM#9xK!Cd0s0U~OF#H2^b7ElOXr^3ZK5os*6jwUd!H*o{2(#!nid
zKl;g at o_NRo1Bc{gBl)h7bCBD?^rciA!ZGx?SS66{<3`p}>1*#CuTt+Suass{$X5!?
zSasFUx_XuY{*xtB<>Bd!A4lfI%h2s#;wW3(vqGa^a>#2-w at i*sU!ZKQ^o;|331jy0
z!pL;I&+1eVn-==K5!i|bhiJ at ijD5h3JWuB=;FSxZJ1Qf1dF+hns_9zr(TpA2UBtuy
z)gVrT#PZBSEDwp(sKNYul9_*V*~K^)GUp!?f75_Zuy$xcDzHQ2=f4O%0>pKfR at NC7
z&1gyF)h%m9Y-Js6(ybhQ{V|<{W%%lBcQJT9;@8|x;<q`O^~VX1!e6+oRa4?>mL&zg
zKyaC6=DWVZd2-@!INwkBckB%v(El`z+tPlezVqrq*+uvXDJhcAw1F*-+6g;rD<`Aw
z7#Y8>dd}|$Ch(={+cEB!?Gko6vyU`EcTt=8dsH1oSGl|kqZ%A^cLmy1ey>eLM-c!U
zH;L^gv@=!LMzH1<FnnVsbUKg!Y(%^x*Flr-fqREWx$qw{U|eZ6ol0U)>3$0OHs~?n
z_Ya*0ndjiK&$sR6pTK-w>)3&HmXsXqp2kwTUzu1qrvHk}MVvPBHbU<DNu(I0y-tv|
z#_({p=wB%4bgRQ)9}EvG_G5HYe~>Xi-&`c#8S%{Phn52i0q?O{$hso+_#;O$sfXxk
zMOX{m*FoEA at onP{q?5StY0zbj2Efjc5B=0i<cq(OeRKwRr8W6J4+yga7o%LEaTB at 7
zA(Yhd7^lR2xQF&OBEGhglke^z_=c%G;>W^!m-vxkZB)`9dN(4^N}M#)TS#ZIR!K7-
zHsBZ=sR=9X)`1s4#>g6G^nU|eHT3?l<Wq%ucw*)3f<cKbjiqzoC(fK*Ge;?{U?Wa4
zyTqpVCov8Mu%%Rp%tATQ$<8#vE}w-s at k|-b|AO#Sf16D9?7LGSACxbQA$?cAB#IH7
zjJ=7z{%B8k at KA3sbcC`{gR2`kK^~rJ<$eb|%F^QC809 at 4?9Qj8u0`kEcR_2)#KE({
z`;K%$cladm4`M at 9WZZglsI<=`Lz;Rsld&(^fS)*~r(>Q0eH!@<_XmS#E`tu&%*`zh
zX1+CzHLE4qW7ta at jV^Xxw9%1{XRi_+pR+!>F-pHdKD@(M89m{6$-Q#Si(yvbs`cY_
zY&s18>v>OM|3=P*spb52;8m5<4^g(!R|-EZ8u2BS?jO}<;IoS&WM|vmcYC_1OTfau
zwESKy&vo~^ydHb+x|-r(zwM;WkRxVe{F0bCSh8yUfBeQc$Ri88Ht6$66<Z5BvdsM}
zVuQ$-00&w55(hHDv?s>K8tdaj_I6h at _N6D7ed#Gi7cmwK%J{;#o=ALZeC_^(_;~~L
zoMfKul;XSn$|HXGkZ((fPs3lI09{-b8u!o*Tb(TF!Uay at pXMFtQtVA>7JqkW{HwQi
z9v7D#+6x=wN6_;grxdrp4N(F6a0E2!Zw!r^1-+_+?BN8<3*Y5;UO4EKYiv#=(k&Ab
ze+P}mI|HXVFY_06>|yo~_ at R<=-?bQ*J7eQQ<O+<bp{KpAoY05BYfi-GvNk4eapwBx
zNB?5WCG%kXx#i$_we<$f52HhU?_1U%!<-`VvIA@>Qzt{K14ofN9eWn`H(YOfg1rp%
zq!IqTh2oEyaTJpMee{|L`^Yov2|a-9Wg)yC!I7BpQFIJw_qRcYL&$p#decPqaQ+F4
zk&MrRZ>R*Z>^A0%|2eUC0{opr<Jz;^Ol)GK^CLc>Qi2s@;Jt$T;6DSNp*m)z6f%V`
z<1b6_F^Sw1{}%8IMdAeh2_J()8f0iCSforl+F--ZTQ=4X%r%;|w~wAi>P&~6Vic|f
zzGgA-4 at K^~(JS%nw?StP>D+fu!5<9R0?0WD8c1s!e1T_NdI-6lcV{2%X at D-hi2mHs
z$-2eF48|kh>>k)`-WI_hPco0-8AqNA{<idDaB*pSb((CwmBb}(#54aU-{qN~G4JT}
zmDuNq&i{&-K17Zu*rlOyw-WIC5Wf$Ap?-wKVI+4x37ZDV%_&QozhXY0^k=&Va<Yp*
z#gPL#P2t;|BYXz`1jA44$A5<JVCeXSj(vDH!=EllBkSU(on1|6M9Tyna4;v9Gc+M@
zSpLXsoIS8j9CgAV!TN}A1FZ#rGclXU;)lsQ8Gp=kRd{x;J)M67viw<Blqh%TdHxBq
zKUKLV6fi#gP0W}D14~&J3I76kh9ZVZgm`e!o43K+FuZzdr?eUSo|5Yt=hp|u`1SEU
zse;*)bmSYlHj{X$^O*k&HUfhIGJG5HZyt8vCGqpH7nP?feA*p_tmzIt!CSp;0)8La
z3!~%wR8GVKUFVztO;!Szq?qJjg+EY9)ckWVgWvP>c?JC5{O%p#_xxa+C{{UofMMo!
zq3v6opZB_8+l?`QM$_kOSehg>B4%q*Z>DfX;FQ>yIBRb;@T^~1tP~pOokA|sn!a6Z
z<rTx?j0p2}=qIms#H{Sj=q-Jxlf>TGe-R$Qnu*7J-h^*EBwxUMzqK6}O2LBfB<lH0
zXegzeui<|QJ83kO__ssOcteDE&cE3RZ at h3W@&dNJ3h8)(VL%#W2S2-iMNIrO_Z0rG
z1pj056;Y4$rf8Zp&Etmt6#1bORG7~-gJ$BF?^x~3kR@@6j-_f&@gUaG;1b__XD+_=
zr+iyoDd9)`F~;+jJNGlkU!3rxz5OExyxNoCmHd@<NrIB_xTtH{IIs3!e3t(iDaQSG
zCbv4%b~V~gL$*j-_#1c>n##PLA5!0^fsZ{UN%*#e&vV<nioy@>k<U7ip!!ccIn7M_
zeq`5<&q1^+;3H=_e{IJe(Dl`vyg#*fhO-{udKGx$_@}n~@9h*Jr`EGijmI6}zGu1M
zLy{IEmgG<4d3tO--~H#k@!Wjb*uHF}T(kMWje*SuhUQ|7FkYXq4}``INwM$9PHy)H
ze>wl-d*cW?%E$r4|NN$sy^S0PKVpANjzdqf({5ejWTBl8F!#Y1n$Y9_8dI|0JR-G1
z*K#P(Pi?q24~Pu->?tAx1aki8SW2EAA4}7o(f=`)c=s*u|6?p$?~mo^pU2YwO=c`d
zn6W(jzmFy9 at 3WHoF&uIEkilg1f{&2DaV=;n<KHLT1bam{d_oRqriC;Requ$VP$ha>
zxE`^=av!r$=zd<40F1BqsE=X8xCNV$mB at QXruvu}pZbDa5+`Q3{UH1g3z;(csj;%S
zBXgPeEf&$_9ni=9UyQwdT$A<wKdzFfEXPT_Ny!uet<+*5QkkbB%?LS!L>N~zh0ISB
z$2#7X)QK_1%`R!|4jAKNu(5G75ZIXH4Wgi#keMQ&EC*vEnNlK5QnP-~_cg3 at zMu2?
ze13oIaoz5^d0+4M>;1ZUzMe15w0i4a<ibhqDlWkV$VvR!)7+y(+^vx1ry;i6G~A~M
zb}UVn-Xi1KfbZcaUu^73 at G*8LEHs`^@P$rQY43nO`Ww#E<9W2B?f6zq*Uzq4xL6B6
zcRy^fMd;(tUd-SeLTq$MT_#yf-XS6)T-GJ!*r`(1Crt1-{_66{EawREMLsbTdTj~u
zuZ*51ehv6IHo&)0pSe}63(8$PY at Lkn{$bQFR>GkPd}gn5-A(E))*osWlej$eMmcgA
zVdpRw*m2(i$6m5=j`_#+lkA0w at vx6s+i28(%TpG_<4;2e#r?ecw)S>%n#bpnd*HI{
zUovxiOyT(AwpPRwzSxR!1$pr68SV$6 at lSLBcL*8en?vSr$jTxz-m8AVd=TI!u^oWl
zLu>5_Lrk~zjTB8t&0&?N&RSXI^{4KU6|cTEjra!P7tC3LYiF?Y6XeJJd1=YaR>+pi
z?~`X-{?2_p1A0`_hy=$7erp?R6H+cYgZ$Zj at wu2cI>r4d;MITa0mQinIJL0(e`lPd
z at o^UP9UgV;{Cn`>4354|S^CQ*sQK-cpPr!}mY2M+6n=~d<{Gf1DTB`{KPGw{+Vo at i
zBQ5ZizLzY=oED*zV%|ytFX%yh&-*y>J-~@KuU+rLiDUl$nCK#e?*UlhijA|)@JWAe
zB%B+G%Wd@=XEzoy%^a<NVEw$!waG%Oto~s^=AP0RDf(nS@*^KLEd_QPx-^-;5bFu%
zl;WNz+%3q1L at eyCdfG$QoLlAa2`kZ0wvjl(4I3NNuOa*J&J_`_gv&QP6h8R!LrluJ
z-^W+oy%3mhU{mDlcvk7Qs-6!cwNE1sKyXuDd3{aXe3!q)l|Mp%z?%qrk0LtrKnHmr
z>UCg`HOQl5qD<{_O6#ZWav}x?tj6L`Wl4|j5I8-NR~c?V9(O%&H*8=j at W$$>mUdZG
zt2NjD5ZV!3Xtr{`G^*t;FwDHC$h?i~q0Vlv6g*bB1mnCEeDii-kH>`2q0gZ%X<7C`
zI?+pNWPqCnt`B)Pf~I>irC0j4HslYs8%tpS10U!iqGV)$cs%xtxZ<c5ijHdO$c{Q{
zMP3%M+pR*gHo2`UZChKE)=w4Hrp`2LAD`KkmMm^&_{!Tl@~pkc>rpcjty4JjCD`sQ
zz3)l1 at VTmF$xmDb&$<rJ)CC{E+v77KOXPGa{NMs^wf!NtBD2;VwF;jAUzaTTc{}$Y
zY+<$e7XkBV*?@Z0ll&%|fnC-k&os&gK1b+Oxxv-f<^ngJV7`U<b|1zJ_%DpoXp)06
zEYT*uXxo>f?L*FsH)$7efPoX{yHIW6rZL}vL%TClPBIo?L-qdWbT@!G5F at X|Y-NnM
zQYJ)c+Zk|+$)ifFh^1bXMT0|)_!Df%^`ZMU0*;o^6P^`CEhBm$9yR7e{nZ336;iXN
z7}(81d%nLA>nhkDdsy2eg4o>fkA6Y=bjq|SZ3nKemPb0^qbO15q7Ngl9C=L7BLApg
zJ#ejxV68O31*xy3HTFJ0m!lR*x&|?QEK{i%U^SZhQW8DT)@kUsP7ZAHzcwMCs8s#c
zDr4B|{A1uj*R5|uo)K_hljZT?I3jqWzt#q<H$TS|j at 2ZH?fGhqUB)tXgF1bB2^m}d
zg%L;2C)uC&SDOwq`|oPi=?|9p7d9+PoC*9^g~H75JX*;=ADmvk!e(?F7Xt6#rk#?U
z=~#8XpF-Vf^MG(S;Wp`qUieY~{1|)A+Pi_NPxOY*Ix-{qC^a28;+*i7R_Q6d<RpD?
zHu&lW<h$Jj<($$PQao!XaAwHmg{;u at mT=7K$(}~5LL4->Kg6oOf;PFev?{VY{8(rz
z;znxbUem1ywCY=2!^L!Z2Q#o at gZfHN3D$Rk>+czfC at bDCE?oFC<KOU=7Zc<c+G21D
zL-Xco?8?=sZ7;kchkuiK+#PXoS<<Dou%pY#K46E>zN8Gfv_>6rdQEZH&ndYPO-l;V
zCLIyl3*eQ!mmg+Y!Z-&Q)dTUo66a+m5A8I0S&4dbtzpnZv5&|+YBUNsEqiB5Z&a?e
z7%>>jq*v+m2~zOQ7y8;Tr`Hf4{^%LxG8H0j`x|3<AYP!v*k|0T=!OR-`L`kmYL=}G
z>!Iv=j4KylO|kKL%#k%bPv<E5-ah0 at RS3Y>gSfpf;RNgeMzp;M^;;Df&l(Pq6-1UG
z2Lf|+o^t^IsloTrf}=-h)u7Mik({@XoHfXS_g^vwZgz|bFJmA2Ah>ntMccgy7RNum
z{J~RSE>X6D7bm!({6WlDrmJa#Un-DK)_6dZ&58H-j;!}Xy@<Gcr<2 at 6rd)N8%>h at 2
zoLN(7NB)~z1?I#X8cWi5?!EZVdFbottH^!R4c<|pPBq4Dx^dgX>0?^=lXL>k>j8Jk
zG1%#bfR97t|0}5LHp!J?uZegXub)mxxzI*<AJ(zHkHzqPsO?IxVsd_D+J*nRpVOdd
z;Htr)nit&%4x6Dh!mb;{S9b6^Ly>#{-fz0vCBbCeSKZj=G&&~aRSkPcC5{2}?g`uA
zTVGQY(zHecf1Oj@&&DkoI&sei`UhfLKIk^ICs2Sm`f0QW{2<^PC?l9-lGn}6O+HI0
zqR)b-y_?@)JH*qr*Mnax$4hjg26Y|EBBbQ_=oU&78mDT(dOlO_w*mQpSLjk+AE^oF
z at d$ihN{KtCMm<qi#p?stg{to&-%Pit%3y<~i-YIoMX&T$a%S|ngU_4^Te*aZYWqHQ
zcndd^qwQJTPVzfg-i)2;?M7Z7Iqp59XEFG$CXV5HlJtO|{<zkPd3j+gw=$83!0o-C
zpC1;ufC*W>rT}9=BuVF8!SyCUhxv7A&wzU2Z$WvPN!(m;Gk72dV+=AK%Li^q^iYL0
zmy_p1 at MM?^17>qtd)z~QUsFsU<pafLy+Y~YCf96T--5O(_)e<Up8-eG*Eyfb+6_Ww
zI~j9Yyo<SKaa$?mkkNYHWBHtHzG+aY%F^hMA5^DHs(}TlSBuuU at +%7YrVB}JmDY5R
zdGi=ax at y1Y*(PO(w*9=vDpx*^qLyIhw^?f6k$^ji<@xLg-dkR8+<zvWv#&`sHD00s
z-n9^8`$r=0!n8EQ;>NVhCHQX3IhB%zta#wxqj%4Dl%ZCqg9pw`_(&j=r-7dV#RlO+
z!aWAaJo34^SxBy%a*VINkd$oN2)@Sc0`!|sIy6ProOW?Cr|kZ7{BA~{N`=p>z{vFO
zr_I2G7%AyV at ZUu=`IBd9kC64u3YWh*=1fKnfO1t?ZxvUAwwX+9{4lv^QMl<+h%>nf
zcwNabWSj@&Q~~s=-Cb#3GJ7)W{Y{Tm%+*rQl5zLoKKBdZ()=QfuTJ36FEh!gXKRIw
zf{YG%eocYBTQb~;xxwR+Fn$~2!UXpw>UTKh+JJKVad60<K;LWY5cK8xnxL<ya`fK0
z&_g>j_i?4{a{sml$xrUxl2^Fd98-^bo8jUBXBSsAv_}HG6u4^BfHM=aT(uTly8&Fa
zm$|xt^3ZrsOKa)hJ}9CnP4MCJW29EFP3(2B&kc3G_951RZ^uV{jv-z1dyl0<rZjRJ
z at Ep*2)FR(1iKtQAG_g^;IwCyqb7}D58>bwlvGKO at n5d%F;6N&JSfnMfjL3myg~O6v
z5_>)<?M)5o(_;zn)d~b6?^MK{6H#*o*j+_AwHvVqQfoA6v|Dh`4Rx#G1KB_3hCF3b
zpE%x6J?2LAjr at TfEauMt#W6QB&kash?8E;n2Y*n2FLCz-Z{&upDe5cTo{6PKS1%FK
z2j`{xmzA$*uZ9mr3!MH+oNxB&42|n$u>TS`Q{aDpE8d>&1<pC5H;_3QbLl?B4c<93
zKpV+?Lh{NsF_E-il5 at wV`E;T;^yoDOPQSr}idvcSFG0}V_NA1DX-^in>Y>yBJ|JK9
zBz{j3os(y7E$;>QId7s(KUkn3eB-6Kehsc)LG<48M&z7HX$RV0g8UlEngSvR*!iW_
zO9LGo{tY~HBeBVRi%IMNW4MsaC+Nq8t>xhUi#z!x8&d#3t$hshsL}mf^o6I$eBq5H
zp49-{zLoTkFm3b|R=zzAE*i5{@3B&)5T50C0xK|CKaiLXzrV<1Sz@|GM2*o4x1V!i
zQ2Jbc=H2jvro<{F{ivsw67VsJaTM3{nuf&z6~x~*_8IIPZ67tZ$omrEeGZNL#tPe2
ziyG`#I0t7O=zAE?mgW8}>?-6p_0-wL?k6DEzx_c3{pp7w)KI6+q5iFmzV_mY*bT_1
zHPA}W7hdchN)JSx)>ehakhx{LJg5M<p#y*9hL$lm-X5cGamU_nD~eMa_8Hi`vy+%(
zen;MPw-4-vu>{grsGXs4&UJKxEcubrI18!C7W>AVgY=?6DO2s0FIr6O%-(cPO~eJ<
zd$7Nn%@J-$e_Ng5R^lJjB#LUB%cF917r}`n2hU`cJGn<Y>Xozo13uC7!+pHcu|-s8
zd%e5Ws7Jn!3HGp#iVclFKO0z~<cDq$JUH?DX1xI%4#`bzhMk*@n3<A3 at -N#2bBk at l
zH%x4YRzr#wIhfGtkuUl64AIb?ASr-kzl|-5`DSR8uRwjleAtg{j^!9|;9XaducE#9
z8Mx-)TZTM#<yivv+Oyq%Z1KViRRblr=C~gvKG*lN5Ib8$;$<m4%wp&qrT#4p_(C!F
zidgxX!27c6D(u-e<1C2#$?am`_L|%qB92&<6y$7pV{bn6b5%rY&n(3MB+<fNrPImg
zxN0JVem|0Zl(5^i&xqI{;mIvSUvA=Qk)J~PRdVpD-u)ai@`q6GBKuX0CGa45JnD at a
zraezO*mcy8NyG6f_Bil8!UVd6 at CNw>WceikAK9)H&rKk_*^eXUskq}iKtqq3+tj2f
z8jbfC>h=+R!EYYRNfN)Xd(0QQv;|}8P{iE6 at VQ3hBIS@gqy<=F{Xm#dU4-=mWS!_|
zWWCR)w~VvzjGjIMpLi{Dm73kHz)`7jjP9F- at 6`nPGl^jL%0t>yaqTaW=is3A$a9!x
zytW<n|JHngJclmiIXs9w2T$ZVfcHhC9{tRpMq8)#l_Ix(E9AsMmYWtaN??4I$d^^k
zkdb`Vqpp12JhF~_;#7?NG<zrT9TkwxU-J5m*RebR+eX)Wo|bG|(Orw>-aX%U8?nsU
z)7xF%3x2mfwhIP=!7C4r688{ZZj8}e;1*ny-F5q-k~4p>IJf{gvu3L$s<4N$Z6SRS
z<Dv at ho}el-SAwUFtS1S}+O=n}oFVJ;u{L<{9?GR1z+}Omlt7M+x)c1sFMnyPWo6Fm
zZN`A_G3Ik5LVtB at DQuKUc-BL}jzZ at odDWc$xYs#padXamVeJ&JoO2l4u_x25BJn!t
z9I29YP6XoTO>E9s<I!ruGePU=p6%1Ru5arCzD{kti~a<?ntVe_Mh)nmbGJ6z&sd-j
zd;^?J0s8S6;@}U7g_40rZ2)*4tihbTu+RCky_IcQo6O+I>gW=<U+9|x{jMw`kUjyv
zD6L}wbY64cCf*hMcJH*cE3Lxt%tT<{=Bgz9{AT(nH3#Pm5xp2P_ATTPA0FR#my%k~
zHVf3!+VU_l`s7p1rMS*T^>=0?@5=8!?VTP^Z|gcUfIhwwwFhLqS2*Ul2Z?^xrXkm|
z7Ioc*KCp7eLC9;jcoU_-_1)NgiSuO81t+$$J}<wq at p~_0?Wr=z2rZkVmPYLORz2^x
zX<EuZQ-_+vGZGq5E2bf&_O%RR3#Zm2ca+Ha=|o;TcH44!TEx2db96luq03pI-zq#-
z(G4Df-gQQ$RSE7g<y0YG>8&Hr77%McODjDBKkFdRroTK`kXlb-W3Oe{s^=6yPnswx
zQ(0*C8s53)8wuHViF*U=xEc0S5fe{UtzA0Q7nn&2{5E5$HtJb?YG%~A-lC{;9kS$7
zN-C-V=RYuv&{vd``yB&ww6LQ}aDQ#wV^KZdr=u;v#p6|MS9&AgIra|TTNG9GO)eb@
zUYE6-EhLAzD|KmJYlZu_(6jNpyfy6x%u~p%W!v##UQ?Ta<kE19 at A%4+()Fm>Q^sq$
zqjNv8pxj#67y15dGPe~@f!~SPOsA<|Q5#1#_QDc^Rk>|Xr)SaJ_wLqf|Le;GsN+H>
zNLD~5Hb#`(RXU4Q6Z0#P4|LG$ber?JF2 at -1QEsX8+Kmxut!Bx}M(r!TQIjr8Z=`bb
zZwSY)|1EX1>j%We{CU4Im>b0*Zc^{SxQVuEt6sd4-$DDT&I`|4PkMypp9lw6GumMy
zYD6}5-6V2Tqc7EB-a50efz%g`)mj_8bv?^H?bdY6Pj@&sdX`J7{P%#{?U$|_;Jy?Q
zU!?zaQx$v!u$k(S|1J at NQ|w38{@*LzzddE1C+ge8H`~whEiRp4{29L?&-nIXo0RAb
z{Ejdk^oV}a4|dLA^I at u>bI5w0`nt5;;_>jjLP<ZaD<C?AOu2fUEI9zSzTjgvh8pS0
zFLrjkc~D)l6m_m^7e^0|&!@i-e$Fql7M}0A-5%_*%>CO1fmT_%{5f!Okmp|b0{W3O
zOxs!v{UIal?DNIPYZBWK8&<LUM-4dUlmew2$v=1iztfnj)2!)|MTog8VVi8WmU%3M
zZRF^A{fq-P&dNE)G3}b-p at o5k$^Dd+I$D-Ev?;JC%Je%E)juqcGC8DCKlU9!pN?%o
zF15$H2y0sgcrs%k2Zb(q^i?I~k<M3BcLefqUqaRbGiqwr5*f8|X8nYK*;(<M=mm1C
z+SCO5q{iLKj=Rm!3t0>Zd~t7sfA2cA17rR5wozb?YBZf+9aMLFR<Ex=a~=JBp+GtB
zDr_QMZzCtWH=lD*DdjY?zUcz<1isR|njS-aZ$bNk1Tkp+J?xJGyC+N(gI5AENz4<?
zYwGM<xO<x~b5p`}-No&C at RS4ZqsT;_dbLUcY<O0fumg7cT+99Q;roDov8K+X<pp*L
z-xW8ekN1Id5g(8m<->ZehAtso1+MGke8%=F^q`hF)H_E^1pQN-syZH0$&aQT$ZtN2
zIpW!gBGfCK?w@}5 at YTz}Z1JoXaiX%3vmA5xyXgCm!`HtQIzbtZEkR%TC)-!TfNOzG
z+q)QcS}xAd=d^%Js9OEn(yCW#S`7hu=r}UZa!S>j9iVTep*v>r&yIu%m`AF4`_ZOR
zLzzJZnMBsT>zgqAU%nsN_K|ZCM~h{TPn5i)Qp(TzZUL at 4eZ->a9M$@%8If;xS3jPK
zg3Kw8ivo{iy5t=qlgV-R{0NiT{Q^f87lnCkuV*8r&WevPjaIAkrx~o@(K5Aeios7d
z?(6uK=%LFD8<T8}c!!luXX$vAzt>re<MOykhzXqF9CANdbb|GZ+zZdQW{l>zqn4XB
zHf(=Tv0X4j9ln1~5i<nb&aaXZPL0L_d%R&vHDu{nK&&L)_h){iwJ=gUI|q0OH85GJ
z<F;se)TG}v$>s2$YSEV`p)XhUF|2+17uG&q0^jK0Sl{R;{7!zpHHm+PN&=1++?hYA
z2!4fNiuyDgy&5a|%t)EKgi{ZnP1Pm|D-%y_OhT+4^Tq`x{K}l7q8fe_a?SH3 at 44DF
zD}LT6C#`47v0wQeHlx$Llom8SSS1imEn}ZqYx at zLAAt`Q^7A$(eZ3F+D_OZ>4%6|k
zNRl8!g1P6z4c<kJ#XA!i-)6}be6x1M#}SVisYAd0Lq4HhGnC5FcV?ibeb4mq`Et5l
zK<4g^N#wmC%Ya|+LG3d>xPSR3@}A)C^Bk8sztLaAm+&sPD5~unhOJ|<H5NWwlADA4
zUo-mW*2HvN`?VoKpxpj7cy?2Hmr-w54t^-i2RCku)7&r6FTsW(b(iZ^w-PH+!_zNO
ziTuD>_SG&OLXyVH%5(Ux1Nc6h;4AoqKam>$ZX;?w>g}zaXf48cm7+F#18OwfB)RfW
z5xm4waIwQT=|k3i1Vce&c}c(okmW`7esEq)I+ekGivrL6R66QoTEr_=>728wypT#f
z|Fie8 at BSDsy(I2-ckKjg2|1U4>_U>~P3ov{>lr6K#vL91Kjs}(I(@d?A`Vt(us)xI
zJq7mFs;@#SA(Ij~a<c;Yj5B?dm^bngE4}ht%3SY at I%HKi?^Z}<4t$I4PLBle!6<kh
zXupXqZ>lr!tSxOdF&_ at S9Hc^>#)B=czG0bKhA|q<X9%{8eTK_q?j!dLcon+gbjlPr
z`D`7(Q@@;B=<46#TU^{Lpv~~Nc(MK24|T+T8cRUlycxRVqIr$rmB8E#`{gF at H%>oQ
z58iHOS{n5P;g>&F^%q&#&Bo%d45vEj`CLZx&%a5p`UIg?!zl|rpZ6Q$Mhq*XTM$<?
zudYWfgqCx(XHGxxA&+fc-6%PVI+d+)v%qiup}0 at 2pHdgs;GNs^;c-K+oMYzZ*=4W~
zW?1v1S}t}+wVf*xy_7jj>oVb+^m`1s4EN?$thpY0gHpsAD1{`^t-)3 at -;(uYLb|aU
z&prb&@d^r<0zWQnbmG6y1Xt2w;A3mAr}Fbr6I0=t4&B+@^PzK~9rF_UY67JSZ(LPG
zU#5OX+**nA&Ga?I<e4QqQ3v?tNSQS$;wF4SH)4WC!iY;zCO^il->Pt~1IvV#o8WwY
zT;H1HK)r5SxkK*W0&Wh$nD(<dl7)~pCH$E+i7(CM%c(t*RDu3->AEqFuq+AB_#$d6
z11~=AqdjNs77IW7sir{f&ovOAq`R$M4;eR`QFOG#YODp|JvM7HIHkQ`aR%u;kNuo7
z at WZQ5WvBd=@P(*;%(t|QK7V>$rgwdf`m^PPAHhBfp8KYCmAKck)-SCYtp3pweFdDz
z)2U-Uli4wk+(FMqVo$_P?E4ITKA2xT20pLmDcrT-E!oND#h+vI;;*{$;;BFK;!|@-
zF8pf;NnU)aj9u50ym*Zln-_na$U^8-%t*P<KvzGwzAMJ(!+RT(hI`yQU2#kIlb-eq
zNyMg3x)<?ES3l$AyfIin3F%wY`eD23-7O>KIM&K7>Pl1Vy*k}bN~$&{K}Q=y-qQ at 6
zFaNtXHgDZIt1P1Gh%&P at e<1vT`vt21qO>^!|7+oGXv)}D-&ccN`V1F;?OLthtH_0x
zg<QIye}6j{KGGQYlva{_gxwR7w|f{q*T--j*#&8nJ!PJ5Rm!8f=X))5{dP}`g(lrI
zupz6rgCmpp07wi5{ws!!NgFT*Vo2T|t`~ye3jBhJPXM)|N*gk_D8oxNMNAFm<Yy3D
zT=0&pVG4OCJnMN<OOm&r&l?11T+h;ita+$UfWBvn=?n_|T*-Hb+%sXmGHr+4Lk&&%
zr6BtXF<&e at Ryjih8^^8P02u;qfv{tPkO?!2h>hbYOHf4C98YpqC(gWHNc;$asmc2(
zX_TptK|gtGC^axI>e(yu<}~E<%eboMH25=QSWn|(-}t&I*#fN2N09R(4<03JE8#Z)
z<M;vQ3k&Y+ZZC%YYC|r^F>h(4(JyJ#kHr@;up>Jcw7}0_>L_jp-aoaDwRtjK=WLk;
zc`C;>$UFniUs>|xw^55Mn#J+ur|pE!LCciSOk*+HsH^MO@=ZB!KkJ8k1bP#EQ^XhS
ziWA3mx0efY+=}rn3V8crd&<KNnEz{FgXIDb8z=qE$h12-RVh_uu9!Q?DraLK)!@N4
zv-fw0%n*5mK%PF6n2zHwX8FTMqQjV2j%7cVfykplj03!9EEkHANw$#u8T)1uBO!Sw
zWPai8k4Wp8h5Iw%hUk1%J>t7$|7rZ^rnT6}_^)bC3;XI1AMxeY5yY<^d>y`E0}YN1
zZmzN`qKz_9#-Nf*`9phR6<ESvi+WWA8&vR_<Rtv(U96A#zt>X}&C at l3W969@;WxKR
z!gFJ#$?~mAmw%qOKV1ImS?34p2EkX*8F;=bPF>ujmNMTo)YoX>S8=7_^^!W5!<L_<
zIxaz7N6w8nw{LMQgynV{EFwCFtN(?onV&W$;hQ~(7+e8ti2Ss(0Zs5Bb&^^?UDts_
zNuyAox92f_D`Fx4<qe%0{aD-C8Pw9MM7&2+^;55&Hm+|`orwtjuEb{pILHelWixZa
z<*1+c&xbSMhi{k~4?n!C{|_J*>GJX4bm+x8RfAB+1-^JZepSx%n3iUJ2|Vc5;Pb!?
zq=Qo{-hV6cY58Bid-#qo;t>@B%T%#I at 0LOOt>4qOCMsB&iFoP(!KDYQaqLUiH@&R`
z2Vfq53~~4#Tdm-d8!+yfr(w&}UcmYEDmf0sqEDf2fUl1NcoQe=+RvcJSm{J-utyN9
zOJt+o7r5ntEnj`n!r1}a`ntgBRz(#_gcu{|&=+8fq6X1H_-)O2P7d^n`N$0-`o%-=
zCuB>05QyANt80q>bIm-<44vy)B`v(b(6}G|j{n_r-IL7g-U7(-DV#}h4@^5pz4Ub%
zYyVIAq7`|v$F>5OK^>+qyVu)L_X_s#D*I$SLrFB|+m6hkJ?lLjW#jYNIpnXozS)VO
zb1e$|KktiH{^z8Q={Kvr<o3 at nt_&m&qFlnEDUJQOcO9;CiB9lpaM?fJS&|BH77p-g
z+Ye&gRXEcotQk1u`*-9urVZ|2aQyQNgfFI9OZe86D>;UNprJdcxt9fAbnu6wUAHvU
zC+gY_2}<Gz;UA;&)*iLChQ=MQH(L at HLH_p<J(ND--b?rwOkcv6)t9L4BDUX3ulsT@
zb6oCCA$6tUV{B|~MsAdEqSoFCePQJc<UKq&$*kn{b4+m);rB=1cygXui8|lxb$FON
z7pH?a0=Sx(H--`i5_hNG=Z{GAMEo<afk$v at -77*%-kL at 5GGpz)9~!u*2abCYPI)cb
zW+nWb6{L0>nb+Jc5hm+q%JgO@?2a@>M~imMTdnV}!O~-OO at A%DWk+CU0{uP7F|(%h
z8-2i&?6c9P_j$`!?h_3hs*{t8dr}$egk{;NI}-sMGvXtaD&-vHm1C~?9&?Qnvh;&D
z5|NKSWBj<3^{q3L4v at IVck4)O18q3V-U&a*RI5__4)Xc6anbN~30Pm(elk}>zbCOn
zE%9eMJC at R`=Qz>?Ia5s-FXj9dQR0sML*E7MW%;fu!}N at E9=I2w%h%$)`>F1l)=w?r
zui2!rG2!Ws3T|Fh+Bps3LX%A3$|Y0aOPdJ&%N_hMW at -*})rs_G{z#a)`%1X|l$7YM
z@$gG}V`(;HZuBK~q)M6jhy6m`Am1O{nuzU?aagW|e{vS|rVGfGEEfB!?I(@v<M^{T
zCW$A#eU{|oe$mI%wxWhQeNZLxs+?DVy5EJa8j{p)eCL0H%ivw?%OmlqwWU3Ih)<sY
zH~2;R6vnMD!8u^;ZiK9tc&DP?K^<~w1=qg{OefcXk0lE>f@<70nnUVtV_fdSdFh at X
zS<{K{rt9VzIeh_foPStz*M4Ztoja3oC{h|)OxaMMGC2H-cTtgLjts|&Fz?9e3T|%f
zWePq#>S16dE7~)_0VcqB#=7JMF1bJS7H~Oe;6v(%Z^oiNi at F$TYx}Iv;h7F#ex}VC
zus7TVL+l*1j6X~4&MiP&Ft)n!eT(CG<Mtwalqx}QCH$-pxql1UKJUz7_yI4IcBk%<
z_!snzKkP)-ABgXP7}&VK3*QK}zeu0Kdw+v>Xc at mQI0(qIERVo_iy%Wq9LHukUG at 1T
zVhaLO*<mg~&Ok{(llOVlk(hKbx9fIFZmW>}j_0G2It1{YBBtxjkR at tvINObH9I(M}
z)|V?w`u4K-CR at oHrOmaFYgfrT@k)UgO89M#V6`XmjT+71->RURLgPQ#2|iS`HP43Y
zf7gaQSluA<Kyb`{744_(c>}(&ToddU at MTMFwLXlk(g&Cnez8p-$BR05K?*zRwk?e4
z#PC1uB00?H>jvb~HzX=ym%aziDA=W#!(9G^&9J|Td|xb1L*IekLVR*269w*L?_Afh
zB|A>k_8Q=$QHWQ1GmS=mF3Gj#$m6DTWl%+A{vx>0DDiixY)rfk_!qOaSS4k-8jG_Q
zCY-OY<Tdey(4UW at rta%x{^>w_BX9jn<fQi#n=Z~$l^g($HNQPWCB35@<Ti2qFy0qP
zZiQ&W_{6U@?k{$Ff#3Q;6ON7hhzSk~ewv~pXIKGaamydx0uG`ES at M(uTEsaMaVd5K
z^^2pnx1Kih529AiJ!gsksZ4ReN|m8q;n4=$IURV-ebi1o`+#S?w-L{#VSONj8vW=7
zqPufT$s9;x=%Y_^4-xy7$bnOOmmH8dh#k$!63q3ncZ@%+u3_%s`KJJvL}K#i9O+yg
z>$g;L+$7yo<MTV|=h^t;cabu`tzG?2dE!#|$DY1#$3J=){_?!xM4}(8(AX{u2IhnF
zX?L18<`<%;2%OVMPFpPE07f#G@;m;ti=4XMX%8cQ{n{Z`KJFd2Wlp;H4zJ;6Q&PW#
zp`(F0o+H*`yu$?5jP)%SYgzw|#jV2SkM8 at 7|0!hbBwIPT|I+B;7oig%_v6gZKCjzX
zua59;>G2M(X7#{ZoU}i%D!qSVRmlHV#z*z^3hk>?WKmV8fUkc|#6FLSzsFVs|KCp5
z{}*bX%m=qAYKqiGMX<iAJv<NX7Pf!XlU%nc*<A5B#^D6|_1ELN$V566{@>&HUZuVT
z_Pfaa(e~s5Q<yh`y0D2)5Iz?3e4PKySOV~GLQ>DOyn(fWs$d%>!GGJ27++GaJ}W_U
zkQ3;S*wUTJ3(_{mEYNOzJyPq~iDeXiui+ORsr`_L<%Y=8FcFsVk-8b+#oqYVpVy1b
zM{KGSvBG#y*~Xa29BZ)iIehmCXDnF>XOvl+HOi<TuzVN4t at yozA7XEa4>Qm|<2Abf
z=XoZP=Q+b0f1WoYwYPF`zdxRbJj?jKm01bA8f?RkgMC-kOSVz_a(ufaMV+j at v<LCO
zL%M3d7|SnpwPcP2=f|)&bP9Jb)ZnbrUEcm3!MPG{xGsV_%VtC?jrj^r<1-fg=Lqmy
z at RbEZS2&&!4s0!OXj12ZTA5`)OtX$#fZ9XFux<41RV+R<li(6yPi2z%zBCT~9{G{b
zW!I40wS`y7JWZDD`{x_0ftP at tNOS?j?vu_i=-a^Px>d*$Zr}MA&KncS?-SgcP>cOP
z{R`(!$wsfxn3bDJeBg^iEO$A3&1qWKH3|OFcb*G>jCvI>lAN&jUgQ>HeH~fvs^x;$
z*0uiC9g-vWO8}lVfIOow$<a<j%(Z0W?1nmL;+yh!GaKu+WY*PWCrCbwc;!_yl at T68
zW&AKbXzW;D*lJZ^SVU3Vddr)~E<E?<jkuaO`z{U?d9DAoNGQ(Rv0+|n>Y`Nx{iV;W
zaa^SvM>j-uUOO6?chxKCER|ZeMbN)$tUv9U2l@|lE3cgklnN78z2Q*OTSqsnx&vP3
z;A<0u^weu*TdtkPu|=z9JLvVvf|l$nl9%W*$xG`$xOO7YLipc3g_MX1$$ZCiM^H{%
zb#x~sENLDZ3e3#%Nw~~_r*$tdS>|XigYD~#wh0(cY*XM4m;_GBN$5i*h*6&-eTW($
z^)wVxZ_yayZ=8e3CHT%MUup*D3hZNrl<+gG_{oJ!0q*wiiOP08aM;rml|)vYQX+P-
zh~Q%|2Ys7(x?RdM8-G%X at +)VE;1^71uFpe^64?1)5>G>?QPyh{PfJn}r>f)i5BEc!
zE<-FOWBWPC4H+vpfUUVNGt75n%7x;@(~$Y;Mqn;AozSJ14Hjy8a8Km66TVsWTZ7#X
z>#)7Sf!Zj>GhM!xQZ<fMb}p at i%?`QmSWA}t?$G$aVY@(<)HiMLM at 7A0x;L=Qq4B)k
z&=Gp0p1qhF)uPr!wcX7nen0U4?l<<q?l7JEj557upv%H)LgNGEwrmztE(4~9w9V5t
z0h?!?N^Ea%SLEOvg}sCL%dE<2ufqO!VMj4GR+QOlDH(9!$U9u2b)Apg3~(6q0q07d
zvrhrPJBt$xJPLhDPHb4%9-q*miB)1D at b@KDY}BNl%=DX?0URCdlv>RBmF$0>YA>_i
zqLneP#{#R2Yg_2c_)eRN&w}u!1aYDQ?`B0k{Vz418^|%V&0_H47*@yjmr`cftR_h*
zbuKi1E+0C<VS=x9AQpgk%4}FAaC(0^{+vggaznRwrc1}T7BjA6XomhC$e8Pzkn@%}
zg^VpjH#wjBJ~Te$)2O!gBHD=SMaz_n5}>>K0vA^0dIozXwygvk#<#2sRI|0j`fJJi
zah-S<e77ep at XchvZj$3$-2}g03vg`2Mjf>aU9rS=;IbD8kc0dq+5^6*mUP%^9l*E%
zmukw#cQ7Va8Nn+<m!}9th}#+))FLA=aOtQ|@qpI<+|Z`&t^L{Tf1hf}T-%2 at K_eUI
zTg9a%msiIUowL7 at _02qJ@8J2O-cTIuv}fDE&%vpUZGbE+ApR%ls?Q>~fGi)hm7>im
z;3EP~)P5HIHw5qB2F{X0OJdee^yAq$c;45zt6?WS&ieWuC32hC<K;U^uJ0p|cehOZ
zeAK7O4~_e_2lLw}twx at e$kS;N+tn=Y`)_0{KyL_T`P!B6y at PA#>)XHsfyW3wg2Ncg
zRYdNuP3%hJ=h}aTY%V7}5y(~7cBKwg2Nk1Ew|qz+qy`445PofD!agoDWC~=4>H?*r
z!{8`()x=Y}@>?*^Hr#Ty)e%_^{p4lIEzSmaaIeqG>zfb$T|aUUzLMll5P8pUv2Hn0
z9?%4Qr55!elSY0a at 3Ul<eNm>8BL;6gYWM6Y#5!tgll7hFuwKQ^U&(G8V8aH2M<j#f
zSDi`0{DoM6WZ(hVwxiLoJGEzaMRiy+W252}j?zbRY+}J6rzW5gIOckAjlrje^QJ8c
zW|xmH2?m~j%ZXAS*o8hq8_}&^cDKOSv!xYt#GnZJH)PvjJ|APA)C3}&M8D^b2_;TW
z4Yd<~8>dJ8d^KvFd;xnlX|RU)0Yhk7j~Yqwv*X6xaIe2CSwZeKNbq6tA;^g!$Nu`w
zm>cgf$vq-?H7vogdb^JB)6s{Q&i=g=wn`^*W`U_DwHf;6qwV}i`vI at D?q7I9;{6^6
z&kvCYSIOAg9h!I=cnRERVG?pQB8b0oK~dtFX83=X8f3|{2gva=7$ZH`hZ=(pMOA%A
z*6)GKMIEKJ4TEEZX>TEYMy~W&j^AUeWj31Rcwqfk at b;r0OeX6;3YZ7T@&<lA0%k7O
zId2J=hsi!Oe&3M$Vfh2_^TMFCsH&snKIeyypidnFcR?$T{U%^$k#mX#%9&(&%SVlK
zI-;t6C+C*Hw@~NUCtw~Y$G#9KA0x{?9|4Y)MpfM-=ak|c^V+B$Q&g1~+1BA#2Kx;@
z)UY*0%OOkfAC8B>ITiYY$GsFOa`%)j+u8c5=T{Wt(y8%Xv}QFO+KX?Ene^Z64T2Nb
zh)!zNqFREJMjOuih?{H5AU2ZMwn$*5!%d&V*EkQkIc*pxkeQX>sxk?bh>1FvmkFHD
zf!oRhHPUx~0)P60e6 at KG>v#Vf<Wx9i at Jk#jK~DXH3Fw=M4VGG;gAIyzu?Ae<%P&NZ
z{Zg#+&A$*11hw3JJ0%}Ez}2Q|aQO)FT at w<&wSNoy;U2EP$Ga%16)|B_M~38nq!7;B
z<xgW9e!+kg_?elh704rMwQfWHQL_0UY=}3YZ);hZIoqaB{MJbFmHP4RUQYmSz`bF(
z1nt)=OP>BQYA}$tJeQy*`^~qJV_!0V|F91G&Nv;20S~#=;k<XKm{t?dOQPdFB`Haa
zfd6I~G0&5PKf`8l{nvCm at eJyoq0S)i<yxGJapqit>p0QRFxGwv at Pgk1I8q&IK5D5C
z*yoI8pYvV3&v)dy$mjjBy at +7{9viY1;G67sU0YJits8F}w2RlvwsgK4e#Bzimp-|+
zgFY%7Y(ww2e9~=oJ|c{F;F`#|LZ0iiM8s~8&rz13lpsdiZn{6-xy2?eA3OzKTXAoh
zErQ4wYu at -AJe^K>=Xj{LxkH?W_);z#Un-AkJ5Ro!|Ij~zG*K;=Di9+i+xE4`tP5>5
zf_smWcJvqA^CHXd1WtDBcwl|$IR5>{rsMF at z^}#gqRV(sS+*x0W5;h<Vs2NOPre!3
z;8IY*Ufv9xr9A3f8+-z!KfouT#@w(G*IESMgv^S12;<irj)-d<aql#b2pD(0;6Y9~
zkyDE<v)k3=x{2U2f!>u)Fje>cB_y_FwHSXP*wO80n(dmsz+ARA3HbM)f$+2?-I|R1
z{U}p%2DoQ2_Vk<za!(fXaLfiS;z;=H(GPm+M%;VNw at 5#}D<3XNTw^ZB{GjEg{XhS)
zGRa$y!|ta4c=nr{j(7c#c)a};77Gg*%oVx*^T)N1yZ)oWdt+{xgt$u at bWa-@A5O>a
zkNNpz?lj+V&7C*D!}ISUoPTY8m^;_ER||gSRIy`nJ#>mx)beq9Z%oXAza)|Thy6Y?
zS7$gR$hE;Y^AN2ra+twS|J&+3N4YZJLxp_`fs%_nxd+KNordkbm at mn>lGQ3AGbfSt
zS^+bW9Df<>hhx-3rOJ0bnz4S6m62IPhandm1<XU_9BTC!j%tB&2KiqVV!c0;{+Uon
z>e!<%eK2%{FNJJKAnQ?8zmfj+Pa+E)dR!|N{)cE>19d-_lWXk}Fs)>{7QYt~G~^mC
zdEk|9zHN1KF7p+q^$9ZcAM}YOF*a!e>fHr2S at v)-KU`>p{E)fMn_pln6pW%ihLfh)
z_Sr;yK5l02JM6L&GUy-P(1Bh3Hu!k?+Tjvz(KmV at W?bf>UMn9l95Rn49s>@7({-KT
zCwb$zbv$2)>-mU$!EtX^KIpjnLgUWwufK(yUNiA2oKu<fEEWoF!pgsV&N=Q8@}JgR
z^n0zfIMOr+b$j72sZcBFYUnz(Rs{$8-n5EDA-=2JbbGtTR6(u*Z0P!k!q$ewZ>#zq
z&1g>ZNGJRg65V{p1UW$Z_m~pTb?uKf>5}LYWVS4FUoRKGNF|vcB*>8o(|{wH;B?gH
zTZqT}$NMG7Nc&^#4Z=sULZasiz`v7;Ymyp+DqHQJ^2esfI`V9Z-_gY-i<)Any91l)
z4Z`)x+E+6Wk9?jtOH{I2g#Iv!{QobbW8QkPPwC=)E!FN+>cNkqXP0FCBmC|vHQG;<
zrP^>M!IPS=Lzb75I)n>jQF|xpmz5YF at 4?>7_1<S0m|snNnteZdm!M8W&IBp++L|T{
z4gWe~QljPi1fu6EXv^putGiLpR<y(*$XO`_Cc_jrrR|7QXvmzmS0Wq`8q#G6_oi_(
zAfKh=o{~xzFPW`^_$7fgp&)x>e83a7_^9Rb{3G}Ax%aU(o&qak9JqHC at Me!ll#OWX
zQ~GfqTfalW(ME_P(-3#oSxNif_dhZ&EG3Ki_$5@^J3 at RN(3Pg!ucs7{x~RI^#N$y_
z-DLdyI#e43ZjIg?aNd#aQT$H9e?`{MM`>Hh@>pnG7jkZSUc<)3HQ4UK_GYq;JoT&Q
z5_b#aFml9M`J78|rZ*08GehGp?1SG{W4?vC8?q1i_`8r#oYyDjkL%7(xo<dZ5i#ss
zwRe4J%<@#$2NBM4&{f+GI7cwQ-gB#wCA%+R^+1LFVZO6&JLc6g=!wYXGym+(5Zk-n
z%9Re|8;+qKJG0c?a{qlLrL1m<cl`#uOUvJZZn(w<j#rGUgQgKO2EdOjhyYh|k0mtj
z;x3H)Y*L4DY#Hw9<C-H!DiiZD-j1>3!#H1NA~h{>ui?qihpOBg`ovq-ko%3d2jOt~
ztSgP!ATjwv$YXGn{@IVm7LonXN2- at 7S=?t!Yw-zi at esdec&Swm+=-Il6L3AE+fIkw
zyX;?WI(M}zej6riE;f(Mm5qNNUwo4%j8Cc>=2SjpLal^iV>0m}N5rZA>tPG9P^ig6
z6{%)~eOcs;Xz4MmbpTg@`cvchg_f6;7=IVqDiQZJw>O9v06$@FcZ!!GKAHgkc-`t;
zhu)<db3z~!o)akNRtXq(9zTZd70~rpP&<(W-r#?{d?#XVZ%ImhEcHLjlIkR~<VSzT
zc!rJ#dsTHG>xz0#cXDVS(zmWikeif4<2q+tI_K2*ah<bP;ADN;6I}ma`<?aFunFh=
z0$nq9T-SUJy5<Jxn(Gsg;|-Y+4xh~(uk9}VG6=P`WXV&`Jfa`2<{C}StnQj{eQ#hD
zyTA33Bf~Y^a*VGNoJ!b+#xQ?X?fMqR!pU*j^3ZWz at q!}M`)2T7U!$Kx|K+A3&mQ_~
zket1ahA*?#tUlDgpV*q+ItjR}&=%m$@BS_{?hGZ_H$LVKeB^g59EA==#-fk8%H0AU
zKt0KS82%9)4w<r~J2!j^Y&9-fX#N at Usf>?)yJ*n-0~b6hPjtEXlrYCng56si0N*Cw
zFNZe^b6_Ln;Il3{7#nt94u<HYiWl*V)Y4dXE0*eL1%>UcTGxJZESg>CDgRt|9b2Wl
zrdXvLR+vYK?$XPcZ;<6hsd*n{C%dnGeBWIu-t)Sv|1Y1z%GMjKY=v)Uk-(NFONO4n
zcvK{wBtD0wunF&e3b|LESkRS5#k5!d*#`F};@CfYid}Ohkri9w{L4l at g|D0Rm2UXV
zt1&+sLt`F;od<vAeOZy`8mss0M6M>DB)o`ZjE?N)n&8{~-ki+cZ?1*jZ{llQ*Cyw4
z_p<xS_(itYp^K++(;*`oSvg(8{g|EG%lImDGW_m5Qd`$&c1Udm_>+*+R=cLU8L?Lq
ze}#^<7PdWX at qhwwb|}HwaRIrtjPVM8Cvw_4byv8l#w(;Y-S)Fti#D at 4vCh$i`P0r?
zbBt2KAmNy>U*9;>{P;VM*k#~>&j*erpRFY!?|W00Fs9`qzLqj)n#mf{^>cEk&f(&r
zAn(8MD*Vs=Rt;y^T8df~+VL3YPxiOeU8sEoPHUD+B6zF?cpT&v7_X2x&40?F+&HVQ
z_TmXn19;1|y*#=yc63_5HK*<=$0%3F#DfFcl{YXLvA*j!Nx;<jUSCeFdnf99kniF>
z6oy>!9u|i=Z$uCNcA|IL1p~w`=B(WKNTb1b|8R?YXJdu0nBdDAD}BEhwqd!?Hw`#G
zeOLe1oRK<>o`Z8dFI%M}`!xEcCU!k{qzvo(*>(B&`*omZi+<@rg53p1?J{C}X$LzZ
zWp^u4^D8U!G}^K at Mqz%6dxpF-xMEbmIv&nnx_R#Lk^GgMiopwtVqg;X#m+?jcBQQt
z at gxV;LE>qlG0%;VcowbSIJ2>O%VeS7wiT*PTah%P9+US^FRV!U<T>Ypx$p5ita-#<
z&BT26O-Zam)yGXlJ|+7c!j?_*$a66%T+~3u{e2UQft!8QR*!qvk$b!DJN_;|0IS<+
zD+d?zzGl_ZC2Y-$LQ`$jk)hNe8B<Pg+4*Q at f>;n#G=4s6zq|Ls{(BTy4EUTDZEi2$
zW+warP3cQ!DL({P-B8f&v9y@;OrSTo5ZaZrX)tf`*N8n;-ugYbI!_v;J(vFTp&(hz
zhO&<w<(k6Lmm%k?VzZf2b*Ed!fRWmuKCVvt^f~VqDl<s_s*==rozfqnEb8O$^1ex>
z2WwV74xb}<I4<o!@dZ~H)EW)k(50faV^*1HU%Qj8!#&M}%VBobQq(D2Yp_c2zf4=b
zV^oMZ=G1!SQI5HNfUb*C*(%2O8I{L4da^H8<&FPvw79n}n&iG3!~0K3 at tus|;YQA*
zQ at -|D_!Hc~pW0$=fxn7r)eq)9If=aAZ^0uKs=U}r;Ju94_Z+*AV0adU#(&V$p03J!
z2{wrbIe#^K%me!`(4pX$dl~x;vAc>k2AuTNzS-$tb|Nxdd-9<LSPzX^oCFLb6H at xy
zH2CF<pZqI#6zfyj_2<>V|E~8_y}SNhejxQDd}awZDrxEHTd+rlf-V5Vm&E+2)@K?A
zF5F5&oe}8o;o1&WP-?f5f2>34v^esoRLz%0)+|+yZXwUX|1LZ&x}_DoBrosc<^@;h
zo+aN4x!p$Rmcc4TQPj>5{k<PUG_M3WiyaMVW`BXYR<wna79@|%@!Jum?SRkIr!cq(
z-&y!}y43XFj|J)8M*P~FAu;uk+E+fem1Ay4tf3&xq2!{@__lq|)xn24GAqUT{^G3p
zMgE6xHAu9p4mxUmmr4 at 2a%@|!<pkx9%u?rZP_Ga9Wkg?bVh%cbOBUDNZ-~&K&3{J@
zBXE#|Qw#n%_*lWaPWhS)@4Vng6r`TmI at BVY-d;MebPbz}huTfzZTU<Rd@%9;;-(U(
zF=|KjXiT(UM88?|4m}biTC1>v?VW0}mC|L%ZPNgY=E!V~SP#3v2_Nq-L55h-(3WT!
zqXQRol=Xt6GG;^341QhsvEI<k#P$9-kMP*V1r5F=lD`|VS32<gf&R*ishpA+6=bvw
z`5yAQjn;fd_rivlD8Ee(BRLk!9&_!F$j5j)FLqEnMJ0UTQCn})70YLeQ+)@+k6GpL
z$4ez&b1~l~XSBb~zXLu=3ugst2%d|G1Sf`+Z>FS(m*zW{BZqGV at Yj`LlkA=<)NSyq
z;&)Msa9$7--Z%15_*XAPjVjgU?uN%^0zWDZjq(2n+N&0ErsOB}-qJ&`%bds`A4_!R
z-kJvv6nrm|^C;2z9zq_95Z~rV at O5$a&*I1_@)w-KSt-$X!cAKlj+|nILqZYwRT|y2
z{%xcd8FS5>)VoQ-yKBnNLB8M9SUw0GGz5PS8C68MEJ!RV4og{r(}=v?^LK at z@qb?#
z8)#L8*Z*E09I|*h^W%UzZeQd!`KoAVP+Esl2n;G+MQWr)*wAiD|MU~<aj%cadWfX#
zHsZhXC~<GWNG-U5%M$0C*&5ndpON^aEnUzwwHC6w3jLslt*b2?sYjf61~*MKxVqb6
zME+3~_-tyhPrrG-t(u&R|JEeVuUBC|sl_d{E=5dwUwB>$YU>T|3;y1{jo^1b2-I|P
z;*l#xa^L&FJNXE7Rvvit(}^$b?@sy}Vnk&DKOi4iirkpsX-yPxk!>fOH4*`>Q!5|5
zk{E(>75E<eBDL0|A<bd&Vf(2ov at zPunMBpo=>bD`eUa0l<9Gd{3s at df`s-0}_vk|^
ze?8jw0kCUttytSy0sj1i!Hi{NVWM#Do6-fPRLt0>CEd^)mf{;<1U}PDaB4>mQQu3_
zD0yEmYH^@mo7v-{n1*k5-cA2P{(kfo?e}NRQ*myIEaBE0 at coPpW~q`?0{SdfBuuvk
z(;1YxuLu70EPlSk{+Oa~9=YdW-UHnMFGp)Hpl0>2M<Y=`33k)_mzQ{Hkk1?wQvd5w
zl}WA4HXxrlVM#37XeZl7I<%39w9z(-Z6iI}s10r8m+1c=+Gt6LCM=$`Pgow>MihOM
zHd<HE8KiCadEip)WZMS!3MoBr at B2uoT%{c>UN)vtPUZ0Tqm7KDjX3|-Mpn{B(5;;E
zSt;IX$g9YpbFIp<B-#7Fy&NqIE<=B>rcc at GA-_Ix40vgG#D~81<O at RmfP8T_{<Fth
zisO~G(g8K~Evd_b{aH(b{ToiK_piRy+-7jni-p`gR;Hx|NfFB_6Oj75Ch~t$L-{qs
zDGfL`UZO1IeBh#D;NRIC)lycDIbwZ#EuLdi968oNbe4ga+&lfhxz%8+$Nm6zzvWt4
z5U^*I7dyU|0Us|5-VOZA-Nk7{zOIUM>{AWPwF4uIk;64Q$0=N#tyb3RcGj>t{#wi<
zlYlF{yzAlqgZvd`EzG&m_`$CWUZT4nXo;Q`bmLWp;fKMjf>4L3P`CR;Nb at VN3UyZH
zjux)i|MH3THR1)uAwR#eJ*cEdQC@*IdI9IY%++AuKmOSFBKEEOv?<8+s-pbnXZM1%
zy~^@~t~eUzfV+#cyz at q?xP`z%eAHgSwka^%zs$atkRzjkLBx8$GvB=hx%>a3b71~5
zIFysj&+m2UMO${fj2fXeejj0O0`~)z4t=>((niH7jmR@;h-;7tdC9 at ei{pc2v8Y$-
zPtz~7XK+mTnK3VyV_C;l)qWSzgL+Dtt$M_=*f^@+TQ>O3M?GD6Avb(J8{(8&(}id|
zEHn8gtE at H`vPAD+Se}b<pZaNx1bk_?eR*S&A5WnML%{sL2JjD6mnU}(Aj`T5+&S_7
zZ{O9?VuGa|CA<yk^g+7%{Wqu~s+hV*j{DV2tD)rfK==qwdl%i+VQiL>m@>He0=dA1
zD5qmyO(ZxkDu-Z#{2uPR?UfFB at EE6wD!Q5$m?zTlCX;pa<@G^Yn__MaC3B6X<KTk2
zl+QQCB{>I@&FG8Gh_z|#i`5pc0d|2&l1D=q^IWV}Of>{VHtDQ*&cVFk at BItGNdcMC
z`%y^cz_qanOU^=;AO<N*IuJFWp7rtjT_kU2)R!(K?===~y+a>~>nxg$*iZ$YpVYFA
zhkddgb?eLd4XBS?)Yq%d_?&Qex#Z#WX?Xu>_b4X1uSXf)A0|Z(nj%~t#Ej<ni5vfl
z8ujI at d`bgG#wlCu=V5vJ54n_znjab=ZFNE}9cJYcWbVJorL#mXfe)U@%DKQ1ytT6S
zKgmj9iRIAc3+|LAJZyCEHs~BnqQ<WHoTU>`=d9HI9H|=;8vowUhwM~GaP^5uv^_(i
z{qSuDXw-YbcRJVCi#9t#Y8rme>$?H$Z<@7-K7v}a6&DN94$wa^pKM3pC`Y?guCI?a
z#VN!4YB4uolHwaN%-iZRN0ndUXcO!t1MC`i@;`D7Mg;kMF5L9$Lq!?t&H{J;f7DI5
z-v$A1(fa>ko^Z)R2a$!Gb3_&fP{4 at 1Kj;m)jM`iOBA2Cf0?7{nCb#y9JkwJt=j~gz
zpC5ad_(Ns+yj6o)ny0|yR=9S~&}Cp+%7PBS7jP&#CiascQM58VdQeGtW`p+rF7Ym7
zOrKr?4_G{xju2H}qlBF)wnNz0OE<WG&J|$aRq$K9X{*7$i*&<;xm*qQ{Y(kZJ`b$F
z>C;ZS;lWPeyilK0^Aw3|<GBn0DSYkaSt`9d2lBszjBmmzGgKNR4SnmeV&FdC|D{aj
z^wO>03ckdc5#uxR{_1s?!wvlNOvx&lqfGYx?U$qEjCM&((Gy(w=}0Vtdfos0@!bUH
z)((Huv~ryD3OCpP{H^-Xw;taG&bQ9Y%`a-165zL6;yUdo;u@%%z0&4P*pYjXTa>x2
zPJ9%(MOaGu(Z_qx$E%X- at O-G?8uyUBhcA_g_?@snJ?uR`xny0^&KrV^=#+?X4H<7}
z*upnS`hD);+?aJ=QPvY>K0@%wbPRWMWl?QCvf&2y_+@*KI&YO$GK&-M=vxXbdFp8F
z?xHxy+Sxk3DO~YV(Xfu+$?V|`g)5?&XgQTPTtfaA5n=BcEKnu!O~O!q=WwajKwEKt
zJjd__A1Qgh(AOh)lC;4KIoaT1vG7N`GJN)u<7t($4<g=)ecjt&RTj<QF7CTQTO@{U
zvCSoneo_sutf^#MK1cpWw|!l5elv+}_9O$(M&64z6d^lTC^3-xTgx(TxVDGyZwHKT
zmyaJ`F}}^dC(i$Pe4A|-Y=7$7cC{(LlOvB&+j~@bL8y-geVNonV~D;Wp5*Ggz<+Bz
zAEFfC{#SYW^eBwhxTrAGDn at 5bxgKWXV3}}U(%K{vYZG2KIpXF(Kb>Vt?9KDgX+)ew
zyqb|x{yDqq47SO>jY-K`>yUi{*+v^>t*h+H2v~;i=^v&&#DE8>$f(4)ircO=c7mT!
z3vRt?Ml>zKzfh-4>5tfVAqkv{>WKQEmEhLW8qaGAAB-oQiycaxA|OK|3ixs)3vIW^
z*JPjITW7z+dxW$h`7Sqe(LYwBe>5!mav0wX?|<v282kQ#ePxUGOTOj}-8{_p!=d4F
z{;xN`<PG)J(}rpP2v~1l8jz6{&vee66mZ+V6x>oRd}UArrOZqn{92V1aVbb-RSGkq
zM_c^^hfD!4ISh{dh+pS7*<%%%U%`JC#_WA60NhUoS|ka8zO?TQY6oIj3w^Q7Hv{io
zfVe?HWR+i%vq7bdtU~?hS{&bm^EP3*IW|IN;yo0tmDOj(<Jbb|rG>l@=%Y2z1#9eg
zpaT{*N$DE2T_x6u-a1LBT#7o>^d!VfUjN$}oEOa2#hBEaw<Df+dO>Mf64{rG7z?fw
zjP)w^IJ3>%T&7;T8$7GO6T7 at j5aAIATg-rE6SWa|B=G%Oc at iz%FfAw|hCf2R8`NNB
z_zvptDzV_i)G|Tm!v;akUknbB8~iMYBkcLY4K`;2(T!7#_S at Ty#-b*rhjzOW^Ic+b
zE%A$zF+iSodjYXGJn_xgu|PP8`hoSE#A5w|7X(ro9IHVe0=5<J?pl|QuUFa0`AkZM
zM1($I*j}-~Cr*L)Dnj2X!aElAZ9U`9(VYqAfQyIjcZ~yy!M6_gI%)4A&)}0gau{Re
z{un|&7mj(39}|w4{v1!F|BO^w%S0di`*_NV$G&Rb&<TS&@A)$1y=sARAGcp_N~xXD
zMPv~&*eP4oWs0v{b5h*|>YU4dNDOw_EX#KMp_fakE5hSWw^^S<XVTx-&57MYeNS}r
z;ObjLeam)thSZ;Slsi~EfVGuI`2WMbrv7oS)woxFXw0&|{-5_M`SV`Dktoai2Q%h(
z?>_&hE#w<bhhkpUGkVOa8^YylhJjy^W-Z;cgdT9&Y33QQe~?S?Yu8|fDv8XqDg%8s
zdc=RliC3T-$~bOR{kRR3M_(g0(13bzk4Cgg%f6fa-`;Kc|L|^4|M70qSvxUiS;hbP
zZrVTJO(J0L)z9ARt2m2G7x8Tt_YeM(dKC7^PlJU8pHSZuUFDD+ at gy&66 at 3KzpNt3#
zsd?pZ;49ML`{ts5qTa1_4fMoZrPu1SYhUY8LKi^}SlfwkucsI%>c$?bLOXRgqQ38L
zsWTq_TI5S%{y!KU!^ix;L2-Znchfd0TeTyKtS2{l-q-WW4Zy=bi}pr5movuuHhj*T
zQrwpbpF>H*yVpq@{z~R3Rj%h*>afsg_2*<b9q2zAwtchF_XkM(@}a+-emtb~^iLzQ
zjdRfldue0958?HAo*LNGH56jg)}!{@>V??`+^b5xkT$6M@(u6sLTX`4m-k+w>F6TP
z3~Rmrd3?hP)}B6setC}cON at _!@$3H#-_j_a|M`D=evkj<`MLk=^XI#sU!!~ww&?sv
z2lM7zxq4iG$-iBH#{Y8t+5hYH^X^|i<^J`1h<%BBEnt*xcOYZGaEQFL<Lha}2Pb>q
zQSVjQcLTC2VQ at eDObgVCX$Hun1cKLo?zR7*3x9;#R>R_cqT|Ok&@TX285=hXw(mvK
zm*^i{b^zir*EkH7js0_(f0F(O-k1Mo0}z|Q<!=bz{uBdl^oPP{lD at S~O8OU>&lgCo
z^XZ?UQ&->{H*Ui>#ysLrbY}8xg_yt9!W;wi;TgN73m&pQg74?@nKW3h2(zrS=nSVX
z`cN~ykNwU~_|CRpbiQZ$#?T&m)a}-OHsoJ+E7e)Evj)Dc_SPEATf3|R8vPeO!otWV
zD{`hk8?rlb-(5tv=mqZdi9CWk9k&fW8q*HYi+k5S0z04&{>d?Mf51}M at v(^UxQScv
zoPWrd9jttzubwHTpM-qDJ1sC!kNz>%^C2_8c6zbTTWNjW<<FoFKo_|5i%yns_Y=Mp
z{3{8+?ftBV_<Zz*pAF#I1$cHn{5kJm at AXo98mJd*dj9R%2k`7tde at TO|MHyAjxBQM
zp!Rg`EpOmT%NH*L4z}RdEW(dicH4h&aSS-Q_evc6(UWCF$48vjh<cmNWp~?49%hb#
zcdD_{Tgumh$K<(4Yq-{}sOve{&oy)8>^x|qenb7GtR1H{7Fz4?ed=@WKf!4<X8Rbm
zqxLEugRSunzEfqUAiPnK8rd6$x>_zC09rwd|EQPI at un=U=4wlj6m>Js_cvtgvpb$~
zI>2K%?LuJYo3f41xsF{}(qEmem%Q+dv%eO&p?zFUByf<nDvfg51#WJn_QDeQV~d2S
z4=i~hFgH at xyE|MKt5qguz9TL~tfM7c>7g2|N<9{qFFDF>q&Da`pl(OC!^j_fQ+v at K
z!n}4%Rl>hzYoxdAT88)t`Ond8<y7wYe_FVV<QQ at +*NtztGMyN6RjDUguI%uL7JsFx
zBO>liId$=Bi(1imz}d0p(FkR(;cq7XjmxwAFDsq|XX<;o2KD*EO)t(F&52m#oQ!iG
zW=?w>UXUUWGQ>IgOe0-^ee;~=HM3rjN*Aij(l%k;`)?-cLP__EMflHJ|4{#Qg)fff
zO`PB_UQhy?CS3vkbcK(w<QYqUX_Uogz;nJ3Z86djY;AMr!1iAWj&boS_+ZkU#x)Dz
zzl#nCVZV!je3xkDRb60Su8u3E`g?Z^eAljsjqa&&n6gFU!e{Cw{XuzBH)^INExQ|S
zC`KF3k)(2U)NA8yi1YBx{ya~Z-94>q{5%2L`Za?$sgZ)~6uxP~_skf-UTStX+Shfx
zG_Lwh6My#~#{}8kXlvIoA#(z4ElxejGaIinCp_K`D`SSTMf6Y4)Q9(P{lfnn#pAgT
z{B05cEZX at S#goz(UkD068X7w~KO(^y<GhPD7CE)p*YaYBGo}c(<(V4fC|^T6-$gqI
zh2IE`&0ULiZ?w(Kza{a{zB4QL0ly!MX1%y8Tow~D+NsXWG at QxdBsz6#LY=}jv!h4l
z!_O%COJ985R!)n+zgaBZM4d32BfciJ<e~e6OMtXD{KN~19~?2xeo{Y(;KKaRV%}Ms
zZ0bp3uFYfk+MXmyn(Y0bHZPrND|uq(UEPwI{^^DTtgPNOS1#!vFz@<;jB}@Xmt?Mt
z-IgHV3Y?A5D_<lSa1yuOwU_Ac;y0#MB?>XW=b2Y*%f?a)Y))R&5yW>(fHke<m6>5*
z`!^U4wU+WWKxbyAH3nn_V;kdH3VjvaQ-(wKl at art7R(LL26(Z&o68Zysr~o{`5$~y
zQgCH~C+R|JU-N(v_s#J(U|x9^&$pL1ky*~x-<#g&M{=sDd0o#n7gQ`+q6|K4IFP>-
zz9KfaWPslF1(BnR+X&7Dv2E!{#gbW32QNrRD#43b`|)>U+8Mwn_<cCG2ss#tyN|AA
z_t)VW4nP*BLC=@=eT4V^0=#a!h`-6daDmSHB94Da<b1fSH~;H>0WSxa8NT$CTVG`5
z`>*cp<L4Yo)>6m=z<c95;0T`1T<1+B^+7n#ve<akTVUIX+)Ma>+)MEP<6gi`{>#07
z`tSEbT=IM15aNbP1M~3yAC9%Yuju-bttS;TypHfqlerq0yaaF&ErQKE19gl~^agYE
z;5iAjW_g;dG}QvzbqnIqhquW|O%C`u)b__>c1U#Vle>g76Gy%v`QPA<gT3>`B*cBT
z;r9ai28&~aAE?0RLlV0(J)BUPY>Lh^J&J3atYTdEDtq0gKdvkM*Xz3KifBY`ELQdK
zED}qvo9o{B|1tLNaZT5I{CH_%vKl2`(q+m`PSOQfWNKET9<s?HL?rp7E9`Q@%u|Y<
zvW{+JO!ra8?!p+b3*$2GFe!18pq4C;qJYUq$HttbXr(YH>GFHN2c6S-{C>ah<NL=R
zpU*z`&-?R!zuvFQ^Ywgft=V0R+~9mNzZ1I|HkA?FYuawnF5?zskJ_Zh`+S7=iD!z~
z8RUIFS%Yi&SS>Q;kTF=nhrg8cH|S?Z`l&E`lA`my?mlYHpdjQHmX8hEVGk=1gZWFC
z?DoI0j0zLMR(E6HBZJ`lyKf`5JrR~i at B#D-VS4NXE`XXkXbAZkxd6b^UI3nU?0H$;
z at Td2+9IELLXvel`Jh`rbjv_e&sQGve_^IUtM}@q;fz(cLGU6NUjvg_gMudsfa*1#g
z|16el*i+NS#v^bXm6kf0F#5Egukv~Cg&jw|rXBXV3glIt0}sfBh5Ni5A}4kTF&|g0
z=#49|$W6^@O)^u~8PjtP6<v+(=oiHIg?V!lY;NRA^gpM%+J7zXiNveO<LsqRDl&H+
z2}WI}zYE5`1K}VG({%R{j^Cne7I?tlVZcGFp>kZ`AqEHT8{!L#Fk5VnA5p7O1U)As
zPds8pzsc~Kb{u`g20oqltY7JDqgHU>T}`@_m!lK!nZNBv>#6?3aZix^x5RsVzHPT#
za&)!<a!fzT^;u=-)xRpY=lGO6>>LsLrkM34{A2aF?vv!0sY>*v*@z9=oTX$R#;lO+
z8|&kwo-0q$`Qcmz_*OTBKk6{U23rH&v}X6KG9ly)FfypWhW4K&zvbqNoL0=cmfl8s
zp1pBO$yqG__!jdgk9~{zS-1{oBn;m)lH^vCn$hqVRFOFKr9ERjx8aG-vaQm)BnIkX
z=Z<g7x7)$@Kd at Cw&Mli9tOu7vzUsS}Cu9R*I at A+CRG9#-5wk_?sPu_;pf04!h3A63
zHS~Ve*tf4|Ye&NnQw<|{ivGKM+Q5|)n)tTs+y3r3v&Z9yPma|CI*A-P*n*c~=Xy!5
z=bq8e)NN)QznBBPd{Hg7X`bL=zW!U1cD=Eu>bj8BGYDYu*DxAc-=dy{f?sw+&-#?7
zxKOb0_Aeic+$o2Vc_FW8US{9ox}2#mji@&@(<f-@)`vv5WGdDbdlTzQgwS4^a-^j{
zDWAXQ>hvw9tJ8TUl-yoAhCdo{@w?o5#}T at m4y3F3U9%1#mYqYX&Y%V>T}*9v7{I-w
zWOAk$z*AmvNyFM1Gcv`%ET09QE|%d^eUO}KV%_f9LAftA9 at V4GODL7~A;dt+p<md6
zC44w>b-eN0f5V1T&N47BO~H9sE_eMb at J_TlG=cGK1<TNr<!U6~e_Jl>i^5x{xf;z9
zwpR1p-@*%~dIz_qc?Wmo2b?9b*mq8l{Bm&3y at 9@$5BY71niiiL{?c6&zqi|k+<5#a
z>llw+<iCH3dDFcQT;Lpj2W4csy1gO!;9BU2PiF|e3z$O&d3oU<##Q?AWWtayyWuB*
zFXO}8BZv#w6{>$g9>ke_W-@;v=Qd;LdCvY@@1gF%Cbm}c26;wZ&SdM-7Efi0sw$L!
z7`ahOUhDEaUPGI<-J%-`uH8QUKj(&W4wG}W7uZ_uxuna$ci1G>rM;dbDP2_`fuG&1
zQ=zs%KI+wp3AcPubwqo~9o+w at FOO?nu8%u9{2^JQHik8#+SjmN=jo)4i#p==4}a(>
z-#RVD#i;CId>glc(sNNehUg6Ry`CYK(PvtJXwka9N-Xmi&G3|N9fB`eZg0b}wPVNP
z89QYe=?%1bbLZTp6l7d@`l#uzZ|Sei2KNB^{5<v{eIuvvq$ROx(85-zm5GS$hToIi
z{`>m{vjx9Cm4LQEEvF%U<XVC&K)W8rdmJR~$~CsBBO3QrB8F8!+Ll|7|K@!)_+JEH
z%odi7Z*wDWk at Y>**)52i?kJ43rKXs}=$ELqeHG%jw!h170?!-bFzkca&h_l0RJZ%^
zoeF$;aW{uQbY+R(8G3<>I6U8WyN|Sumzn?9==hW631&TVA^*H>WWvh-*EZlj>iSki
z#&tgre9&)<jim+`=iSJz2-OKbE0!^QC-5~)doR{1axZT3<i*Scp0@($)OxN_+kwk0
zlJ+6 at eh#NBxyPxDPmSicHASX^lRyD}UJ-dFr&;{Q_TX6XlJFb<{4C%}R>9}gi*}sj
zZ{x4_onxW)vpb^5_O484P*}#Wcq5S4QOBM;44lT^zS5NL8{qZ=7BtoEWqcSzPmy?U
zkdfH~x$BdNAZuIwIpx20Ki{inH9-dd>d&ie$Npda``gE`AHW-L2ev;asE#RU2S)^L
zgPutIy>-CiUkg?s-YTpq;~?(1vuLaj18=+>SV(j96AsJna}v=`e=a;^-`MuUy*VuF
z>}<qPi-G&p)mZ)K766lle6~x<|6U8R$E8FDfnyuXg$8dR!9<aD(s#z6OXA`L6W#D#
zV4IsTw+d_e(i%(qc6Z{woi#43yMU)OcwzSf_gzkwxUL_&Mb`Z?dF;8Wqn{wTi9 at eO
zPOov}JooMnT%%(obgA4^>ZK!YM4utoAm?lmQrhF9n3-|=eOFjUd}oqVSFyAZH66g&
zlBO*(f$LRq;S9#laghP>@{c{LpbGq;n at 0?cFRy!b5jPYWzu!w@;lTbEKP+<3^EOA^
zK)dSye69b(xsf=R#HM7_cK3nad+<#{=sxt%hwV9Z at od5mt;g89LW^;qGm%-;J5<$_
z!_+~-8?B839`ktOeH|5Hg%Xj at JlS_zK!3p&pQ_$!(+^E8VC5htbTP$=nr+wz{QHQm
zSmblm(S5q?$ySdj$S5<jN_1ig^7mSYnA@~#j+`fI>vPukfWwgalBK=W#X3c}mUUH=
zEn%fR*BLqF@*w;gUHk?{(Q3G$WSJ5>+6|8w#cgSwc_xAVskBGFWnH5#vLuXwCu)}`
z8JiC$)iW=+AK=e)E#Y^8uMqfEU{S#_g#OaWbB*fVGj!$vi|%41^i6-Q`}wbB68_j}
zz^CFp33m(dw8`Nl=UosSnT2h<Ti5X(ddS!Y$k^H>aF>$r>rrbfyh_X^_%0stOruwX
zZ>7dk8F8Jx4(BO38mfYJv;TqLQ;0vc91!Xn at 3pTV{^j$;`{-?(mu;+|GG7rbw>{Eq
zPI^Upu^@JjQoXT)QM_W+>9ACZK3exo!PGqmp8DHT?P}wNGixds_*<DsUYiyeh%oVB
zOX6z9bGqTlp{v6;3YdJJe4rp!s#J6HFRJ%$$Un-d$UlmAwQ#J7ujFNVswNv(2Xfon
zuuoSx*`hNm at a}`3C$8QoqVjodo5#+@{#R&+{uR1a&THcpfCKTPy!OObUZLCM-1duV
zo~{-3;^KpN@{7>b6Ic6Q)D0!t^7X7b-LLr0Bf-Xl2UsQfIZ2iLwY>D at TF)I$TUt8P
z*jK6>=AquM)4E3;Rie{iT?PD}MwY>sR!#VH<Q3rsZPmp5?7*X+JzJSmP%`nZu#(p3
zzS?(G*LeTYaBd>rpF6Nzjqzg;S!9=4Ri4W_<IBk+i|2BiF-6Y5LFID?c<Ms|DRS<>
zTs4llNc)dj6+ at 0GBFA_b|1o*jJl}}$UsTFg_}DrXuWa+QSW}NmZ)!)LJNsO<j-SRW
z9w^}EGirV@&Z%J3MHZbJZCOg%lC*E$g4I%=-Gf?Z{24rB_rrSA at -*N8r>kX&npMS&
zs$gI0T%N0KV!^%qX{%5_LH2lFH^-FM1^M@?>}cKyt0QqWZBA49UW|BHcPFKzIzMG5
z at 5i$fo5NNQaYg at D=|x#{O7nNVKXQNMMZ~DpuEv;HdQ;31X<x6KuH&>#L5!vi{ejj*
zxB6CwRkVQDdy9e5I;@04j`T_34^khWHS)%0jZC<+bC#V_PSG;MtlQK at yPfD$e07VL
z?xyphzs`WKzZ~Z^Fa3=prz(gH at E8)laTX_>EgC=!u)a+n*Jyf!%&~EezRP6ph5q7X
z4O50G{md}1z^9UgEf4M85VP5(#W-reu=Y=5C~d@~FS*|svHWh>Lr3{aMoEW0v_Dbd
zP$!5eU7|uqmPLsQ)ZY_PO4MG!lB1w4#3q_QYa|T0jjfT>z%!o15;4b7R{^-j at IL?c
zMUl|e=H(E6J$iY1lhhs1DQ$(F(*WKCR0L-A@#C!FR4pB*E1hgjOpGlB&NY`&@bWJb
z?!a8h#O>mO_OwpPyw$d}SDBu^B!L*55RJ}P94A at 1R10NbewBR}aPb?-XE&>6N1Li1
zVKl6BI<dg=*;6bHg?eDG%8LdN$2=_1uR!irvZ5!SBkz$QR&oeBXg2K60#+#nuB9I2
zAwf5-g)N9UG;Ho{X&)n()>7M1FYXiS6xD_NUz1F<%g{XxZv6qy5tb!g0zZjTR*ZOc
z16#?lq-V=2uwIL2$mK|(ZvvkOPOn^AK)2I!`ZuDl?kcu+ZgZJb%siG#J)cz*Q^Go&
zp51*@H&15f+fg4Y8{7vHl1p$uI7B38qB|TGJV!&YlJM3O4kqU<**dydoyIC<uCc^y
z%mv8HPDT61uhQs^ON;tyf%8jE_W_4|PvYkxTY1`aIqfY{Zx*0N;Dh{Wt|ipREKPcL
zvf|QFUR_#&{syon_0&FMkMru0m-qeDeVBI|+O55E8W_JI->zcrd4dxLN4uMW+;_ at Z
z!|4)PMa<MBVN(e&cOCqjt1uTh at I06&G(P2P-4js<q{IvUSq0it-R%Jva6QwJXza|S
zjGby<Wu7{rj9|dV_JOxUBCh!F|Jzb<ch-`5G at ui?k9N`~e;iBnc?afT7VzsMUqSbu
z7yV$H0pBel`oYnV%r$on{9fczUmOMA at wNz9*Y7sV?-rvzRNn^Gt(~zlp7LT*vjsIZ
zN>VhuBfWW*#?@DNub$O<%HWkYM(q01tdj)QrmijNTOA?s2<$6X^0N+lHV)(5%I0gj
zze>u0t18iDwHObsgYKTos`dp>%hc@|t(K*-HYCnDD2iD3os?@s9qP=VLLQ$<-u>rd
zaIZc67fpK|BV-wMUCqUFb)p(@T7*Q1ct$I at BfeGmeo0-+u@QX6x<+Sw+V<og)rMw_
zG1+%9 at 2)Hkzi-sExr6j|*!cedh9~3pw|M_PYP)pLRAsjZ`Q#R~K?b#!=wXiaG4^;<
z^=ppQ7`r2Fn%2G<{52UV(<@sSE%a2RXsSX}no9aUvq?- at HlqK?L?K;q1w&uN-5k2^
z$|CJPray-t^fKYj=y=lhsGGiw=&?(VVcQ2}8}yRnf703Q(AhWf8~d847iwWA{O>i{
zhluU)zuP45ux`fwO9t*ZryA$p$E~4FAzknX{O2Bj==Og+2e8&tJm~MR+3>sr`|!N$
zU0Hwp|Ks at yA4_T)^tQBusekPI|2vlG|B>qdeJ{=dKM!I>0K>0;7xmv(J_etVf)XN!
z>niwlk6g%&XdIXY{zftDcl1;6RAJ6Dj-5j=3#i3zOci(gpx5^Gf;*eJ7?>&Odb&*Z
z6>@@4h5)0$wFu5c6V6-IOq06Po9Io at uX6;y-dq0K)VhXC*(`Qi<E#c|QGEkjnB024
z5cw0}W_JpJ8<(W63xBl_T(|Xv_dCeX`~94M{Q>{_5^~LgsR6e2Ih0x-t22i}kC5ZH
z*HR?r)x$3)Y^owPn at IabWDnW79!h=vnzuRp18!kUnCK$Qv<0yMPc~iQ$sXepp`PWo
z0h_HFs=NMXtPacC>!)IKTiSqEw`>{0v68W4(QokW!Vmfy!o{8ww2}0kMdw;Pv6_Ns
z=MX%*%Gu!Qhg~`tp0j9MUjvrei(d6ufW@}3<)<vbX<N2*j^A6ts_^^N;mbO);d%xa
z+_b>$VXpB-aO9|ymNB?IZ7r}&Z((kM?LM$iCM>eCZUvl=s~lSYr}gW9tdA|dy6}Vk
zV_LfVy`$6W!H17JHt=tpKz^ec{;P+(uX>f?B<C|VEJYUY^(;9Jd7go7QY<%NDaP_m
zEVHqE14{{CA7>t_liA@%TFh4^0V9b2;5PQ^c1*y%I){$lwuUyzszMJV=N{L6;vcy7
z>;E^;jCc9sKhHmQea!0vzxnS`X^E2w1I~}xXlRee(f5c92nF{^a*^s&<efSwN_i(Z
zcvHmDeOCBI-iBTP+$UsmXyol at -Y@Zu at xpe-MWd$c_<BTi)lA!wcU<ZOV|qojVWv%%
zv2o~NAM$YM-W_ytx-RHVO2b<_s_e7M<g5*_uioHjb3E%*&UL-ZXv0P|FZBmyUztov
zlYKL=&qOarJ<2zDW{>K68MjJ!<M|#>E!)7Izf8+DEYn`Eh&{}=FoZ|_en;`T&YQQm
znj91Rod%;WT3HSGTFjCC=~#vT*wiP2a7+e{i3_XkU#wcp*5CAUmGwqluCf~VgwV9L
z;F{q&4bLn3)<%9fBGCJ}5%0 at zsVNIp5p87E)r9VxQ&mj8Qc}i8d~M)2*nH)ER)KeJ
zg-0_J^7WUHwC&Dyk<YdpU{9EUtKJ=3gjk|FslIKGubKv4h^K=LP_w>?(CUi=SjomN
z at Nn@T^5rC|{o8+Bq>_ck=C1FfRHD$;Hgo;*X{jkpkEb-XQ6x;f;+G#cvtWZp+Tx3^
z4`2>Ub=no$MHe~9oyL;kZ1HbT!+IB$dfSR;T8f;|)F&3+*-K^J*{AE8Zi$&nd}Qxt
zC%)zPkxlT|dCHOs!7-K*V3YQ3QXe!0*z9)XmETYNWLu?V4sk6`_cfSg*H|Sw_e|tx
z@;<y+z<-m<lx8Tj(|-UD at E2=-Vo9JsH4JFm4|{|!B0e8fJX^^%{-EZW8Espc?&{21
zhl at 7)luJ$%F2RA{NZw3xyJ{J7X*0o#WW;lxu-ms*P<kq#wh~-4`okIEX)F0dz$xb=
zCaL2|dav`*A1mv1 at Q3TPtlG53l6thw8o`5sghOp{40yi;4?Z}y{tst~;K6&E$acic
zEF at 2sj5&58$-%@sYG)+=_Z?BI=pyi-8}9rKe%lP~Fnx&31)FC8-#gf5 at ym`)@O at nX
z*O85iVN?zYrEGScT}&5;+Tjnoc!!SC!ViY}Y at sbqTcXI(G`)a-3iUzEVfr at sHV3Wj
zJXOl-EhLBQ*Q>#D|1w7K>&isgZF+;?*A+WMQ%6mF+nr62S(|{3YUQU6-$`$Zd*AZ*
zfBM at O&o%Tldt6F<?-^W=XlDHq_!M<H604^K_Bhcq%;05M^|ggkAm6>lpPTd&FkP+Q
zs2yuizi4^7mVPt6?myT2{5gfE(UYsKUsB{5JI5wozUcLWbnYkI(&gfTGA`Z+&)ejG
z|9 at QH9Qy|JGmTwOe5y}g8=Z%Jol!IH7H^dTkG`k*-7p3G<{GRE at g0%R6TulJIP$~H
z5xNmJNfXmU+wfgEkuygAo%!$>4`pW}eZr;MYDw>kHoaI!8(gZ*7MFT+&hC??eV=_r
zEv4i*?gr)qdx^`XO0rM|(Z-^>nmaqYT#Lc!)<EZO- at wmGo66|8?<9!fE6antV;~=V
zq|WTEW!zlUc4)!>XvuQHt$P#yG=6OYZ%8BjQt1IUuHY;5--`v@`d&5P#Ek2<_ at 2-U
ze_M#Ly(04Cxc!zm_)Jk(IJI%ycj}X6c$e&0gA$?>HvY;jZ4*OwmKCg7V(SAR9`5-W
z*RovQ1}?hz)TjDU*M(kRu*Bvmr4)lUPl&RD$Q{)-v}q&iQEWp$>ih+B*2s1AEf1C#
zqEz5r at PC8fbmSYLpCs~A=@pbxvT1W?!PF<Ffm`KJa{F)Zk4%j8VJ?3+?wgXXZlPaS
zcuRT}V_HZ at u!I|@9=!L0oHh}j>-iC35=M30;y}Bxbpw4|<tpJ1*LV#Vikzi+swEwi
zO($^d*}g%0&(JGg>y9;4Y`TDwrZ*r)dby-4T}f#t7E`LKz`<_XG at 3&j;a|qwFRDoH
zN|t_`|B8`k<JI=sUa9C1@#<4dvBn}jw;A=0Dg^c^B`I}e8 at IklpD=3X$>K*XtkTg_
zEK`ImO3uim+>FNe&*&d~d$FxJylLob-B*qZ-B(h}sD@=s+vY0{KR;e0=q&N^9I_ym
z*_W1*+;j5fh+j(DBW{*BhQ1DO8qZ}t8=)Hb&HWzgS;j{a+w;fKFnnw9r#Y<XgJ0u^
zx`S$P4|R*M-iP*nf^Q==RfjvH9|VWxOQe7O#EViPCZFkJA$DK at XT;Gt;9kZ&zK4x^
zs6$N-#G^;{dk4e!fZIcYym0J`P$G{J at c{7TW&X4y`awrY^n*mUHN)2EcEK076?J(k
zdcbYF@|`48CGO85KFr0=!()As$fk!Tj>Rcj>;d59n?FC|gwK2i{>k6__^GbN!5UdB
zyU?|m)Uk&@06M=T9lRJ}{1Gy?6YWvp1za!ZwYJK~+pE==in^5{k?K38oTB*Dr+<PC
zLGJk==8lZt9g)CtS>DFng8IMdjo5#k1~-FWKgjUw2kOb8L_dIzvc}Ujvwm@%CmH at W
zQtNGqx-+x~F;z3c)C<HBW`Xz_qE}2{yr{=`D{y1<a69GaSx3DI?wg2 at sPF%(NILXB
z+WhaFkKL!iJG|M?L5 at 5I=x{FZ`Pr#_3ct}XMaECubbOO&E8!OXX&<<^jF<Mxg!4<d
zf?hQj_u&aINKTiao|hqQdqMiDPUmZBjmbwk-mR2>R_YFld9O;_gTC{ryDBAI!Bftb
zyWbms?z;h9uut{wz)w9qSF^q<H6~=dt<Jb#53j)dr~qbEjhs6h<jGg4&wZf9$hVgC
zL65(a)tO`uUti+F__&h>e~bq?tZ9wGLPnK*MD+nV#|>WAk+yXBF&>Akye|QLA)|9U
zvH8+%l$rTSZ<NHb&QkSsIdz#vU%YJ)++thc=U7Z at hEhrGj^14GL;C{XX6GUoPknzO
zm5O*m5B!Bw5koi}Va|+k*qJZsG5cAzGMd at H-pmke#YqzXNp4q@@B2(dc8OQwNt~2M
zbP0>MA?rL_PGZto=M`IaTnx?@FI)PVN2-5&f>M+rp6%(=8g=h983Xc{N(V$yg at ZQt
zi_|f~O*yzM_+KN-DJ6-I-U($RPJv}9yO1mg)7c8-la_*K8$2wb8t^BSA+BQ~`si3(
zX9)GzV}(SA9sh5~|NOY4L)S5e>bUjG)!@8U;Q#uu^;iMH-~QC{KQW)}@Nw1R`Xi9>
zm%$CQ+WA4`cG&z3YHo<#qn~J#`>0%*QE+7f>dpA$Bm0rl&<9&KG;%up0Hn>q1M)xd
z1D!vvQO?*9*RW4PJptObyU1ZkMLrv`YyT5x5crR4fDTXihbng$_>ZxU$3x8jJqNLd
z*zs5cmWVY>BDvsXTci(sW{1 at AsFNWKE(cFu!ATNtSQDA$zPa?>pb3<Y^)Ms!)bJa5
z=M(ah1Wc~)(T5cU?>{O>UYZa&##;D at guwdg>Ah*%?g8d7%f`{yDAH7=irr?3X{Q++
zm=RNmoUPtnivOk1e{56CyCY8<Qaei at IvYb*Ko=0AM$JuXJA5P?{I-9KK>TzWV!0N9
z8n&hwwx&M1fz&!i{jGoPzK9seMOPAE;j+A$4c_rSk!e%LFyz|MbCGd)SMK<`Vu^RX
z&;PDi|5IE=L9UfifLe!~b}8YR>Oj4k at mSAaW@*HpopWo- at ebv?^YF}h$@%REz(=tr
zIsb~zbtz9Zxr6BnjGL<%m+9XCJ2kzg2FKSRH*iDv8hl&TXc+N(cy(E)0#K`#*h~wY
z at Rc6H@;r`t3w;JQjDJ7k!3(Al|3~*t<j@&=W)S at ryhx-D%_HPo;(zhinE^IxL`do&
z_WxupnIm_Pf(PqBOyemFa<6OHnjq9sO>7O%OgoR7RH#cu89Lv)Z29ZGL*Z<>COSM=
z@&>+jD(0G|M+M-3 at v_Rnv%F7s4IE3mQ(74<c;*Pli$?MeTYhVGtX7hVnDvB6-$76M
z5U;5>PdXuerh7yd2i>rV1-`i`qt- at SDEKM(X$yOIDZZ%%j^YsVIIhk<l-%mbNp54Z
zlUsYiQ+S~y$V_QO@$6%5C8QoWFctOGA!oUNsT)5gHz*s&>{+U!hDy|FrIaf1Jl+NG
z!4vjtDEZp=E?NG%e&|!Y%iqI!l9wLK^;kHa;=i&rD<5X83tvoYOo-vsfQKd*c%1L0
z at UhTzSgjQN3qhr@2TIst at SEi)&%Sgh=qi=X)3nOR{eNctu1}hr731SmnfMm(+CSk7
z6!?NHf?s(@;QKT|hM*P$C81O at kxneC*6j(hkal2$FZj}Wx`wJBT#&AoieXFr?xmMJ
z<(Xbuk#elW3jb(XbYDV-?u)qafk#p%Gg{<)Z{U^d)k7O-^?k4F{JPvvHuiz!%u7P*
zFr_W}epTH<ds-u16V?u!WE$EH+z>t4SiiwCQwA)jJ1x;KEUdyY*08&fU$f}FVb at 0D
zeZfn@*r_9ZeCStUO>{hE!~QbFIB!Tq-oYhdsNXhz9rq;EH4lZ&1-suJK at F06o&LG9
z75%7za49q4fep|v-b=SF{2lE&%sCV>G;kwfgj0a!boT}LM(-P#<~%}yLpZEZ3fp>0
z9r7!z0cU7oKWbPKJ at e@W<oV;K;kgZC&&`rk23du!H~=;ud^l)#T}STxfUdZs1G7k6
zfjeQjzO6K+0hrvcORUHxO^temw70U_t6TC^;+6Q+fZs>r5&Jv}e+kavwo+;`|MVR}
zKSm80b`zE#qegh@<A3AH)8$F9$^5ou4&or;{`~$p!e4`TjayihcAh63DB#ui7U+?0
zv!Vt#hRXgj$<>JS^0Jf>y*)*v7X!xvf3oC8M82pvQ3 at H-h}ug>=#u`=C0_m~$x at Z(
zcA{@^v2ePO-%4rEfD1IJ8eHgQ0yVD!yn$wcItsFj2Cx5O0dlU*H=5kKFmT8^bMnZ0
zWrfraJ+(T5bB0p5cMH^Mgga(Y%*zrJ?C-w`)SSCZv*}Hgjc^bK9l~{sa7{zl;f1oa
z4m#VbTYOM=P5Dbe)8Jv;?+e)X9&UEBaa1!{>k}=O$_}%Ny`xKF!zrHN!gQ|bD>cT&
zFnBi4fN!%5>+P at u^XYiK7?^x9eM+Wb73<V=D2Xq|R62ho^Je%c>hY3#2j|wKR=p_O
z*RYsI&79xDDZZT1#(guelEmn^rUbQ93t#_LJYR|K+QH|&p2cG1EjHe$mng!ixXv4P
z^wUXB+xRhMxK6gNaq0`<%dxM{S&HY)Nh=w8ALmKN^8!wh=Rob6&KtEPE(e_XZ4o%N
zSwcLUnV*$>L?_qJcvyq;Tim<B$1yR|#u8FRJkg~EJP~u6rJxG+lk(Lwtr7Rvd>}g$
zh`IuZ(dO|Kx&r;mM4c~zquHROq<XHdG$%(k#Indvu!?1!tcumk_$j;8`uo7?9=y6y
z&*jSZNhmJ8P4<?~h;=dbA<dP&B_it*Du%4f$a*%FMi0u~+V`hpq+`b{B-`mw9Fs%M
z^so2%ud|I at lNSE>I&{5%`%eEc6 at NP3;y=d!40JKpv#Dg7>$j=z&<WJDverd+{%sJU
zp86b3N-8BkOV%r9k#(`C9`d+`eAkqG;=7|WC}1}*SAGqh at zxe4`oFM<_=fJpYAB;Q
z9C(+CTLP}Gy##TpQXG>9uAKc#1$~x~4(PQ)5&9<PE#+bnzL{{U65pl-`GYd&VZi}*
z3BH{|q at GyJKIB-B+B|>!-|Mg6RGMPEycJwj*^pfw-On%8pys_4|8r1(sscH+^^P)N
zWkZuxz#MPhQlGxr=RJ%6W0)^8e?!l1!LJ at a)VPUkjmSO${OgH2`1S3mBc!`+?BBcp
zErmMpWz^?-C3+*_ZHL_6;l3)+H(S74`cLc=;y0OKqfA at e3PpzZW1>@`K6){y0ytYq
z9O at r{v+V-EeyuuB>J?3k-*rLXh2>{s%c$!A?u#nN^G-&sA?%N;06w)4G9-P~;kd at p
zf`-CX2jk46MT8$K at GY-0N`_j)M(RM3d6jTsc_)vo=h?9xT)MM=X4iu+ANY*RZ{r!F
zdCCpiM0;4i`?(06&koG*WIUhICyKK6s#t|dPW=t|j?(>j;&L2cj&qBON>}9~$NM($
z!{xxULf;5U17}6P`|hUM3u`ve;0Qag#dt!UV!WbmSPZ*R%JJ*m>(50_hwe>(R84hp
zh3ktXCUB?nfqSiIsutQ;b^xDKxv*;GIoCih@^<?3)!(6}gA_F_Og+i)H#$&D^HAkv
ze@%#I21!oJJz*N0`z*gc9PO9ZcuUJI+PeYU17zYM<0`vEw6vI<Q<Kn}9r#XK6Zlj_
zQTu7cZg&N35p`w)w|TZjK=7Vh4*S3PhHyT3cnjk<tORFd_ at ej?fBiOoLxLMRmO8G|
zcnfiqligm_gs4FM3Oz7HUi at wlecG!FdCYGoO$Rm(wE|XB=yyL7zQMSohAO(xW7}6o
z at +-UkPHc}4RenCvDjWw)I56WzV8-*uan1Rpzl{3pSKwK6e*MkJe1PTO at LP{x8p&fJ
z_xuMiOtSC&K5Z3v3@>b{-|z{rw9TfgyE?4>kh8`8Qk87mxn@(qm2n at EL53XN2?xPd
z^S)x!JM(dVrDD@>seE1h+9&songTkA4v3mk<>Wbc?jg@#3e3yc^UE>>`o}i<zgJOx
zX#Z~u8DJ0B>^hf%oC#C^E+rqa%DjqA&w#@NI5b7(nVsIjokBmyd>nY({52tM_u#rq
zP=DaqrUyy80&9=@8ZrMsJrTk^k9RNq8-7Xnt#*&nYSvZMpC2XT26AKuey?C`!H0M|
z2J7L#rJMKlJ4*bxS+5_Te;)l!7OcU%?j9fS=CN-Zi#m$2QLyvtV9$;MLon5K&la1>
zv-1LQQ-!mH3@`x}F`j7zbKd!6p-TQ^D{8Kv$J|&UP_abm>bM66Ryr;7#8^&(Y?Go+
zNGJWWF2H1Z?wF?@xlLE8Uub)nGS~p!Z4V_KKCIX>;jlwP+u6HDULxNt`i1z^g)fo!
zChZ%(m-taaPR3Q1AdW}kES9(bh+mLn;!|VZ8wtf&AT?dT_T$$`y!&@x)==Mw-wrOG
z?<qz4$1>sRZ0JMGTp=@kR(%ihk|Ncx&!@#Tewm8p3wXZ+ at H=D<tw3EX(r*cFs*Tzn
zao-7k#L$V25hq6XMLaXQH}MFUP1UC^PcV}48o3?$OHDFh4JKAcq<n2iYt-LJ>qPCd
z_aU>zvOfMaUhaiFUJ9k{v!pfp?1@*f9rbVp_K9g58fC(RB`g!=qq*x<v?u*)p6Q^C
zWzrm_OVc{_vFvO~*lOFY at YsXA{<(Q8;QR8eWNUazo`l%yuhWbQ_?OIEi(-}34Mw%G
zn8|dOE}aB?8J>YZEob5$ag=3!zjOQ2FMbN+zHoCM7aXl&1#Ol*^9brllKAi{Wn{rm
zVQHPtvb2i?udqt_bb-^5Xa2q7FVpm~OTY2NBA>1pd1?l&_?gFh7tkiX-m{2SPud=~
zcTl8zXs&Vb6;Bye)a{9x*@8F;Z3tEXOXW!jFuR4>Y~f%P{UysJTL``UV{l`3y1l!!
zyi!Vo*z at hZ8&-DuD%IK{)O#g9=z-0#pCp_LKXddXZ1Lsr{Y-J7{t5bnC#FIs>J4BO
zfAS9MRcx8NY>QMz^x5>Yyoz&C)1V9IRdn1}&|+7p*F3Y$0N<Q?P4u?nkxk&r0*1z|
zBODH+ds{2%yL1WsVIM8e)&m3J5^n9RI-k~f+??gDn!4zG-#TE32bnzy!{P6joR3_K
zZ at YHHLuG+evXb89n;6wHRYyTDbe2c2R5m2S28_P9>ipJ`FG~<#IR9D1^?}$oon_1k
zy6L_xEK$!}$J5C6@$0}x0DIEs`e at PGzRKjas7<*zNqFfBZOYS3>^Q5Un^6A^GIMJg
z^D4m}cYFMD@=Uik3O>p3osc(Os3Y0w)<c(0|N48G-lu%%4UCyX+pcqBpvzaD5VM5L
z-#LPwj}SM`l=V9f2mZ~G6Sx|`L>!lgdX9#kPx0F=Go9A3{sFtltx%`DzRds`&>e3S
zy>HS+rUogPJyq4wTlC_rJj%4b(G~hx9>=u4R`Ua2JyA%hfThx)9=V@$@GNrS at joy5
z#>GGXFG;>J at ZbL;CN&xJ8sR8BjpGw)!+CARA$vHc^c@&~HgGCkh-&HoTJ->A?DDI+
zti|)5(^o8#dunwhbFH4LNyWOuvg!!d at e1nPD&gE~zyj?_5HNCyi2cuz3Bb at l5c2sd
zVed6rE0fJ?beLI(Q_=SwSf2{L@@zre{*ng?uMfAOOY5uhs3w)6KM~)CN7p^q>a}JC
zdK!_#*T}11p6Av_w94W=*?DCjy^A(9fuGk|rGY$nf6F%LY49IleHn5)Je)#*omXwl
zc~<?U;&uzIo}vvnN9KgvKfvC8AZ7=A=>G4C+_}N1W6>XqGK$m_gfVvurXsfVpzhjS
zE84$1=I*To-SEtb*!Do|SiRvhs6|o6JOsJdoE3=YTg<PxUcyyy8!i=b8;CBzeqUzN
z`GSF|gFIZyZ9Q3p<%4ADmrv;Dq7|#RTz{LZ1kP;jU?6zsUh{dPTEHE09JV3ZcA9L1
z4;B7 at U<5kRC%5-iLsx3 at x93l*1Q)N_J)8EJ=cC?68S{_ZvWUEevK32YZTt#RpBwc#
z(aw$J*c7dHKKW1ESQY;5Vpc82Y#n^F3Pu2VDkL%$zy0{_!}snY<B-&V9<nS_&>7sk
z+cL!69>~)KbueO9V;cM`jL0cQUkLL$vKFtNgZHrU1ZNBMu^z3USXUZUt$PdcV&HbU
z at A4EECH{9;bQF<!bjanmk6yf8L%u;CIDZ_I=qC6}G9rC{w2jP at vaKMUeD_6bJW}1W
z=wsQ2V%>eg)jEN!*h^&v&fbsl_MEiU*A~^H{gQ6<C_{>Mlb)`nl-y at -gU2VLl-$dQ
zxF5X__xzQe>yMx9qSnBM%_6=)8otk=Oe!wIJi5<yImOmv+3tlbnJ%-!e}1&YZG!Go
zT8Vk8p4kJg?%l|z)#1D at cNlbzT#-2Y7=K6>8dKbTmGIhd>Rb9|)sA?WNmF!GYO at J`
z!5dqZG7s9ThAClH>#`48u&mTIK3%O7i^+PGPMmFdRO5RRbA>QPBB^%UCJISTQsi1(
zucbveyOz~=sq(8*_$8|o<=xLq-en27d*N?81bZ!yC+d-7T?czDAGRC#J9UlsS#)Af
zweD>ZY#p^VLUhX{Q_ve=w}bnS*zY4EpJy645T+dIFP!>qk$ToAF?XTcMI{+Kmb%aM
z=Sv<_Y?+m!*z!mVpN=zMU+RyYR*?7<IMgqpKT^<X3T}Kx_bu<19C6s_N`c;iTF?96
z+T7_Xr`q!>6d6sEV at kSjZf(D7+SY0BBkRPr*mjZBhFVzH$(aRiTCxt?BL(w+<oNol
zSPyqA_%`f6faO|FD{wV94)ydV!A6Ds1z%n(+Ww|UyuS=O#7oo#IwatN`?NzXT}E`O
z00ut59o_v{@AFNZ_O@?u+TVSmY42eSKb3-b8{YZy*qEO1{eQ=_B;$X^^p6<R^m9^v
zJH~VFm|oBR0NDPb|BmPH>|`8+FP2YgIZOWTzmI3yd!)~zzm|-(*CRiZ_JS`a{p%_+
zA9A`7Q^A}OVK!gE94?PHE_<EKf%0m^qKrgWECJqSRDG)$+ at 5c8_kgcn>p`uZ4+;Wo
z3(vm((RDLdv9RWtwOhEXL?&X3Fb<Si8Em<@6!njRfpa$e&#_znbF4sbi)!+UvNA{;
z;h3TTo7m*X+xdV4S;n7$x|PE8A>fOe5i?(RqO?fuAl%uX_3x#gBmDoIf_fviDG0WL
zpN0A{;HssANZu(OAN<b3mWI;g`fg>Ck#iEhk>rTR7s^)FGErETWBD|;5zfL%sN3=!
zY|bQ7zr{8*M=9P^q#ojf+o{z5?yE>{1lnL#Qfv5T^wqEFctu9t41r?E#&7Jto2)28
z%zyiaRdV-pi)^T?l<GW!9F1K|J75cUi24>?;I;K1Or9RDJCm&2qctU6a)+&|b8C^y
zyJ}Gbul3!7z~pHibw1_G>4?je_3zcKM6DY5Pu4$`49s|v3hk>AWT2KU;m+C%JvB$B
z4%`5{4RiSR8_12XUb at U<RcIeOM`g94joLp#8~vbA7ffEH^weQFF>$T?M}BUS at aAFS
zGm9|qtd}5uSV}OO8^YzzTyUNkR|nxY3-^-3?rMQ-*}JNKCaJH!*XlvuT>Z9AoM-o+
zC&e|p{`Z=Gnf4hQT&ycAa2<D&ajqY4;`k^7yhNL(%a*gx;XC;1jpSRgE8Np5TlXH0
z(mkE8rNseFZ5DjT^We;aY<zDAXDg{I^WI0CO@#mYy$?9=;yA=d$#Du*(082OZaM0}
z8#!^#PasQ|QCW_PO~Al#B7EMA>B~1nd=OvU-{!w&27ArI8pHB#A at sy@w2hIy0P#Oy
z6|PcQA5f{#UH(lkkNJLKRnjC|2->qvml{=pZxI!&kqX(Gq*!M9HzhF>54LK(@YVhc
zc8M4Ke_01_%+b4_+1QoP%E;-z<J-K0JZq!=hyz^t_1>k8ytg;YdC&YV=RLbq&g)K)
z^E$T4hvtM&wS~oeB`YnmJ-?^l^31>A)go?`>qdOj|G)iRHR29gr2Z?OEz6w%AE8;`
z<yodloy~Z*#rW3vo`3rkIZejGfB962YDcm{Z4XSh$u<e{hZ^3V4s84(?0e0*PN7cx
zo}+2-a^6PG9c<rNu`p<t*8LFG<tW{lb)x+FPNy|b!&rmmt0Z)R>wDQ-EEBf|{6p%$
zeZVm_c!LcQ=0lG<N^sxf!KnKXbH-_ndB{<X`<=(VayF^m_l#p*9%j=?Msue7Qo7Ck
z5U21&BWVlQ1BvxLz-w{D4O`hoCrHg2qiZ%DA2SiPyp)Yw`Rkkp^4!oV_WByO?@oM^
z=kA4n_|e_AdE at U|y3%~h1gyUi{kW9){t+`@w+Y;WOn$o+{*o%-k4yZR3z-w#zeTYa
zlT^%)ZEF!z&4_Fy_V~iHD;~!j|2Dpp<|H_0kyo24GqLMf9Zbs!o3CwqS at hBirT*<&
zC+28Z9_|evLY&!L1Prx?wU_LJ&TjD^BWDSiqY;hfg6ke`qvNR0wB5Q?6LHmC<ocFx
z>njD;oF;jx;rX%&0)3E~ImOybumu=<^$uY0ey|T6 at cXQv!Ce20%)riaSR&P~JTgxs
z*Goc8zjX_oOILtlyup><uE;a9I<^jfT^6Yp4=e=^f(w5xBO`ffe$L!Jri&#>x7~V@
zT1&sAKZ*0c8b9wVR>!XAPnV at WdMku0XIUs2aMHkP2Q&eHUh8_=|2$$m&t;x+rJUd{
zVW*@*XRWpCm*ywN0tfRfb;V-|v9F5ly#{PRC$QJGhzW=%el8H-V at JIS*;Z-1F)0yp
zw%*MWs5e_<T&U4UB_FvW=bZ1M2ES)4EJ;A`pgHEtw#Mj}9EXW~X1+x%P!@0G7Xbr&
zTqX)QPPc9|b`KHR^n<VaJNCyxh?lghVs?wst{w}cVSUcl;{J_o`(t*azV9n!j&gjA
zzEphrgSM<){qA$oN8DE~9cF>|Coms=Y<0jHyFKPOiPhn}%Z_)qR>0qKd`cZtgxGHs
zYO=K9UX^<{MCZ3G#kW`v9xj3hhpk6vY)1b3oLoF(i~ibF;5p%^*%VWacxa1XKimg9
z<Izd5*`aSgO8P^{Y1X~WQGx+w#W1z#Q~SHUUOH=y<5|?KSGv9?*CYLjBNs#7ZZ9L}
zkpDV^qk`#1UoopJ5o=u6QKM?8$o67xKrcA57krJJ0MvLqkMF#8qzzm}&FMDj#81+K
zCLsS-NEJ%w1)Q|kFalaar2_w(am&TcbKhGeVHqcAz>$%YR6nZjDdit_R-)#Mg<t0^
z<2S5)lhM=V3U&HTg7-iTiM#%#qI&>%>FXGS*#Vc^j!}xcCbZcRs)4lG;C?*Q!Nm7T
zZbm`}a=a~6ZL;x-dAtpq(U<n)o7pi28<2Z|oKdO;%RFHJi at Jxyz$5>|=Xxr-7&1;f
zvYfP?_BeeQScI~G<9Z`<P?}@1$hSxCzU at Wj*nOM^V!QJ-Bg?@F3Ht(lazBZqBHmOh
zHZ9cwm+&Pxp)4t>sqeX;AFGoS*_vpw)^_#obeevq|H4;{OaM;SxTe`*;OnstxwFRJ
zmKT%cpx9OJe*$lEGX%I1)Fwa;I>dlAZMh2dp>R&AbH9HZIB}^Fha&oT*M9Wd{p at 4@
zb7aufLL=k+>onG5v7Qzg=X!j6n<)B)@oUnF#dvl+!^i|2cRn&sRvH<HdB*4ee+TDu
z;hbpv)?l9%zcQ?Ugzez#$TM<|5}!eP)2>-btvyw|wzhca()-=#cJ;ciK)wzGUnisr
zx(8NA at D?%$otBv6 at KGcKt586`sr6D!KiX=)`^o}UH~664h43E`e(gU0_(px49;y3f
z#MO=o)RRBIq+ykDMAmaL{jLKsH(Xqdqq1m;RJc0Tbs(TK-Z;3T4R~7G#8Dz+c{8w~
zUe*TWQ{+Hi7^$J-|CMXCkRj9Q49*2fg$wa+;8}&c3}pTdir;3CA-|d>#!t$ZBIjBx
zGs1t+uyX&cN(W>Fw+Y|VfVjr`KfdRry*kOPqt_*mXTx&bj~Z}<Zx?wh&ciV;Iydr*
zoUftQV|s|dxi&=STo)pDzWN{eT1WI7|5%NJPKlgF$p5FMZCke;6v8%pMLWpakMS+Q
z_<r_b`NG~6Pdg85f28YxaX3Oa7PyDNop7Z4&aP`xBgTOl`k3K;*oKi=M8 at Zck{YjD
z!O?>l3I`kqFCOCiQ0q)izrFP%=ZE;- at sSs0@#$U7h6U4p3Bla+`--Q at dFiF*jFzwR
zB|#O`tF$+I)4B>qbJyf$;dy*4 at thno7Zq%LG#|^_gp0aED~g$1tjnAR<kB>2y$%ao
zLVuOk`Q1I-qCef6U{11}X5jhW+&b*sMQs~31au^v;%H<<o&gu2`p_<B9h#bpT%j6w
z;h3FO<(Zvhy;fv{th9-IyDnbe6I)pIZgP{PO_weE?X#KsfxPS>Q`WgE<mHdJVIxAu
z+&ZA2gt_J3 at wsIZ-9f8?9r}-aM&Ge6<gbYGl<G2+21y2OlGW22yt?%_JSA+ at UJMd`
zR>09yO4Rmfkj3YzC!1nEg^aCt$L=zWM(#3N&msO=>ZqVgo|tiWKBx9{J^FMXWwWaB
z4FtRTfKyNveXontS%HH!un)SJV2yj2t;Bu%-B+N455o^3++~F9Ib>BYt17arl8=V4
z6-4G24Wu>R4WY6yugKdikjEmn(!D!oQZuo!FU3r9{T?iIG0>};{9_^eci^gd#f%V~
zD21p;QVSjc`MA6*alZ~MR~1#j0*5fRE3Z$`om}`u-d7Tn;}lEWE5JLn)7IHX+-n0G
z(O>QH8_K?M9QMy!61=ay4Ru)Dv1BZ;3*7q<`;kO9lh_;N&>N&Z&^~t8x6xnUHE;??
zON+Yjjk-8-iI?-jbX|ECwy?m;7LYdl_6V at 9r7@dF4YLdHjvXh~saLBIf4=yjg{>(t
zMfdvqNj>_gYV4Uu-lXDM4Kd~Zyz-~CC+Wu{ePq5*oQk=ACUxaj6<2xtM*3r`GA>+m
z7N<W3nNy2xxwmiRMNI5KtZ)1{);*Bl%hPL<1H*Ia(&)L!M;oTaf?tP#HFf<3G6r)*
z-2Q!6P|M54s-tSFOqi2}i;AiSxcjbWb7jzpave5c&Pq7~9BWUm2$zFnZ!Tok*m?=p
zhbcSx&lspwY5#K<`fS=~d558AO9cAKW=4ahdUACyu+5wz>y_C>kaJzUHbx0M4V;|(
zwa|6eBEQ#;>(>)(9=TSah1!oCMzk at tf2bs&jp*Pney20HTVgi)G3xOcA4E=mnYmWl
z7xM&aTsXVEy{Ml6d0NUqo~BQCt&RRTZgt6LZ5H at lj!f0lWti(<QDhwZZKKUu)c=#}
zk#yU!6WTk-ONQQvK6NnKN9+UiS2<*^ezGL`2$8k!E6*R3PT+!Xf;q}H?AE(jG2acF
zG5_kdDUP~JdsyY at i{;?eQbP_%mLBp{P(}Xut}wXSS<Lx at e(!_doLl|dGL8*=T2lr5
zK~*91Ba8m at d(vMAQFG>IcI;l3o6=Y5W1e$wd at U1gP*gdWIYnDP+dNbP`Gp#pn4izN
zo{rhL7c~V&UZRSu7Ze#S>)DCGs5ipD9MukA27QF1Abla(coBXa*f~bn?2TR}eVdXF
z9;H&jA2bqg9G*qT<DHwa{rWCo!jj~9;8nI-w^m?GDqHMf2Yr>~KN$-b>)?X|$MyVD
z#}UYvX0M3;ei!gxN#L{Q6)ddURpi$}K95pquZ?4B at ch0?_958lYvRn*C7GSAz#Q!)
z>kDgk6(Ig3BImW(`#-l at Q?dko;jbe9ct_E*;VF679+ls^7ONFs>px;G$1{or`XMuP
zv%ipWNdB{dCG}s|e?5{fW3}Q}27i^cUuq?_?#TOgM?N!ByhVB!KHNJyQ17V(ezLuS
zk|{N)-%(8Y{Nv4pK9x;4eIjSJ=pR?zd498|`vx%iH1VA?Ekr)U-aZ99Xf0$Hz6;R>
zVI$DtikfxfI$%EOkNst;Igco0M%WV)%uUS!hezgd3NYt_rzZ3>zpWkQw;9wU$Enny
zP)2JtL_Oqw`O<t=`O<v5p4vJ0NlHFz4tQ1nKXiF;civUa24>cZ_umIBG06wr$N!M%
z_~M+UcF$hmG&Q0O(Qh%)Zbv}=#A`(za|-*vAn_6LXTb;Kjj0bfkDza=gZH?0a&j=w
zMRkF1qiTqK2>%QH|55kS+QTNgH1vJdJyvzF7`2u1iA)}~Bwc2`3B7LEuY=~f&&Av@
zse6yphR4M2ms1M}-!?hV3A}&vwapI!<F5mrsn%H^ebaR^CdmE7f`>3qjLpNO&Ba at 9
z__09$(KDiNLeCN68ZC|^kIO60EyxA$i=xB)$+h#AOQ%@nED`jOLeoRrt^qHz5_Mg{
z%T0VCp_v$~dU784MF<`~^Um5Rc|xd858ikMuu^0!*ST6b%7j)O+Kt!&0&ifMz<Ym%
zzdiit{CGY3rsFW?ZVB#H2|K9yQV$JX$*<$zh*{G88^+r*wEqgkE0;xH91YuyT!(-w
z#LlAQiM;}h^}qaM>jcZl96-J{<VnmK(uZI}ohRQZx&FeT<oa`a;QN*Nze`>4o_OQB
z*POM{C2jRY?&x&nTf}ep*JI8K=&@$M?Sh)ZE1vUzXW7ywPi_DGRzH?D<PvJM=Pmqw
zS8gY2sk)!yOEI=QZbdYW?{NtDK|ij5{vk>OTbQ)dZy3LyjJ!eqBZma|W7L${dAbBK
z6kyDLyiB1^4V6ah?=z)L0LICrzy at Ob%#maMYQet2 at j11c*FOwg9$QNCoX2hL7TQbh
z5wen;@9*pLqg0$2rltED?Ee{KV*@og{xdd63>Du*4w<#q<b at 0uQaizgQVo4nVJ+e0
z!tTB7DE=q|F_<noBfS%Cx*vAb&h9(uHqpz`6t9EIu;wCv`Yv at 8zTC?WLn7){=rm6g
zTueq}SE3MpT+wUO8|yOmBybsJqKHu^aCJpfTB%i2jMU3O<_xo*VV_DAj$%9Z at A2=?
zCHtLsi^P;sJIV2dLY;6wWRC at N)XkWGx at X4hz+7aVBBaW3jcUx5J;0->SOTgvKE2}^
zaHLizHR3w4Z+)65WHNa<DO#&{*5L^7z_?|LG{DJh>^qjyJy6WuFEh^8)>JY%^sO+&
zG&^R{8DyQWCf6eO*t<co<=!5!gtRgf3xe7CkmrBYO`N2+dweu}s8cSatsR;V|J#^-
z{4ITgdelEJW<(AnpW&aF+onnHN$-}Pdg`HLl|_>R^P at K<#4`^g_eGvCT{n|e!W_U{
za0|;?$au|Q3DXDN)#CtOE|6g0PG1tT%3tF&6zjw_u+iy^O`6eph~<~SmbF8tKn=i&
zqrp15CZKaPgi>^Sq8`3$i2 at G)=P7LlIyx|afoe(#Q#cy(85t*Mcul_>yYId>y+t1d
zj50 at _@Qtp<Sq>jZA->;hl+N{+*QO_Dh97b^>T;h-jneSye;4XaX+_toV&8S<EXwOE
zi$eUmXK%v$x`S?(LOt&`N7MqH4!Y!Y-tkfWs7Ys?VOh1oY#i4WiV|1z++U-w!aiLF
zd0xUC!@Dc-?j(l4Lz?-49&zhF_=XByf$#&vAEn}ioL*&2xz;_#=W<&*fl|?Xs2$R4
zPff)b`j;Ooz>Au(@=Io}>p;}ZXSc3+Iw`iN>X>umTGv`lDvN>rVbLz(bul{D5!mTx
zu_QVWY0s0FX!tyAQ!XT3Cb=#RsJDxG;*2yD?FzgJT at i2+wS4TzH{bF=P_S;a80{KK
z>Cvvicg<0`@y5Gvqg}5_^DpUG<xvl at z}*g;{|v8gH`+B_eb*Ev_qXdix>B at j9xe5^
zE7})11pf*~ty`U at IyEZyf7<m}l%nkjnOoD<^s(r<kehi#@0n!wKeu{Pd6ed_8Sq0?
z!!{juD8ZR=h_f2)cn{j~0e?GwxcBi7enUIXL_Yb4BVQt~VN?J8DuSsPN$(>17i at a<
z$V<^a#}TdEVVGXQLTpgxioTBV4?TtSy>s%FF+DxtuuE+Ne*DK5h!3ASfxLx=lTw0b
zMION&Ujy9}tUX-^A4>DX8re1IHEwXBJN?Jr!t*HTGU#~C{0^5hdZ}v>A2EFRZ>rPJ
zOC!QGG%x*8$l<RSZrznj<~r7VYJb9Tx(nQR_K0k={>}o%4IT9s>Gy$$iJppiViWFl
zgy^v9oIp1)m1N(3g*uc$4eGu9fvQKxz8U%mz7hN$#Me?mY7zGQG*;uiXVj%oYXVQ>
zdd09cinmn?WP~Sg+Yia at Jk6cU$Xn;42KD8o8^Nu8`_^WxCkuXM8$y4-^%mAgP$$I@
z>Z4bnUuJM1U+3lf=dTQKHh|YU-gqL+QI=TJRy-Xwj$`gSV~M#x-ssb8F;J*`>&!*o
z#i2pFz`L0*@KWpj?bL%>rZ=7IaDFHB7+_=r4Pm;4yU`whg|2O;4#2L_43=VEJTfi=
zzC=F~Lx$hI6ik<=Pp5BChv<X&uVNZ#Nz4P{A5e$b%A8|KQXjcBk1N-h96fXu+D$TU
zZyJ~n>Ce~XB`M$+nSZelT;%!mO=_-eB4PkPa!Of4(C<5`T5$K&vif0PJ`iwvT%IxA
zeaN3mjP}W{G0-`qugl{5Z>Szcj&262FK&h|53cFWTckwS#~7IgS)lmY#1yl{3iT5&
zlRn_}Y_CSYGbq$Ku1E7DRMZt$Yd{;TkJ%4Bx<gi~Gh4usb;!a#wDQY{#biHxzGA<f
zF-Z3L`Qj8KFZt~l^*x3#=+n?EPbo8fQ~d4O$1*d<wnp-8!;0Nkwn*K>{H8HK-Bu~a
zq6YqAt&HTC)}dwzH!M$PAWKRgZ!8$Tg?i+^54;}wCa#w`W-Cpp5j+`G&M1)|g?fQ8
zWZpBaERNU++xcL!@tlC>?fSue4#zgXmN|C6Z51v00C0jvJkeq&b~W%U at Eyk+jmI4?
zhc(Pa?&ct{6U6?)x2EBX_469Khqp)<wj|vbg#G`0-eCP7;{mwwMabE~bE2lC|C#ZO
z3!tZ1(3cI!aX|bFzTh*6+knIEvSzRWoHAEK^OD<}2 at j_mc<>=lnE+g~kbA9yUn#N-
z341TO)r#BziX1aAm{x?CGyEw}A#T?c{TS at 7Mc2)-1unogSo4ZdqYKN+VLRPxu>3Y=
zGWL51KaM8xn=l-wbf;nal9-iFbMy=3T;jvSa_Qh^!IOdToBkt|_|n*U$+LSQ at 7Z{l
zlK0V0XORc7)tRCISE at ptwE_APeBr=zFOeCe7a->?)0hB#>Jfrf+@&47*BiWj{YF(>
zxOofl#m?ZPmS8x=;Cglb|7qaVG_L7vI}H56qp-cisVeaP)CUPD at E+_sWu-1PvhG!=
z_rFMdnkk>++#dgVyMQCZm>ujGw^at&cGu2eCB9w#pbmYklZ@|EDGt;QjyJaJ93tok
zTKMqMKW1B6lo)%RGLIrt at p_SOi4iqnW}lUBHB;x3PGJH%vr9hcjd?y9oW6r at w$**F
z_SCbVQScYDMechi<-!iTy|Q at za@S6^X81$&4Lq~n2<~(7Yneocq)UoKETcj_=_Y%>
z|5-!&_gafN!n}NS&hRX99qjA#ndqD9(&2~4b>wUP-&(<|<$e+K@*83L<a*p2{snUE
z{6=Nw at Y2ZJ@Uu;i>!fbG)}}x6^E}K8B7W+^Gb^I-ONB2~NnZs|>js7T$!hN)eH(G>
zw~1|v-}ihezJ=e;^xLTA7&Et&>ig3%whNI<*vzQO96RxIqJu;qYHh;u4*4FtdNBrd
z$(d&lK{w?u{9(l(u>=Qw@{{`RzGxqjZ9o0)_c=yk4#^%i at Vi{j{_j+ereFA`$?vz&
z-_t;1$<%FUwSS(p$zEb3*MiDIoG}wRU#={^XcB7!wFdHem9!Oe{$Ge}#q!*oX6Wtp
ztWpX&Zt8bfU+=m$7W;^r7Su#(F^+TLPrormLTVI1J~s4X9*>&Q3|;!?Vm#MwaQ6T&
zfotrS^+jKI9*u$z5<Z7iy!+G8Gi=1y0a at Kl{1fS^<eIn_{LV2qh%b(=gj_IudnX~`
z+aKxj=((d|jEipWU+{<g#IcyKdJ5_C&FB61n+%y_!JJv)pFc4NoAdDfGk>>HsnGd4
zN9UpTh4FDMxaZYR9a5^N)XJ2sKDFll^HgE8_i at xI{>#I_7v`=serp(;gXh$v4lJ=#
z{nz4~!M6h((2oPK#cSb*5=P&YE$0BAG=BfDQ2Q at 18r-;1(=dmA314s2%8s6oP>VbO
z@!t>QPMGu1#w`xyGO~^YYsj$+lU6(}Gk(B~h7sMir*h>zJ;koI+PJ`6w9DQ^`AS32
z=PO_8`5bdZEvtz+%JMO_uNc$iEH!hK*U#jP&oxfeExx!4{TI4$3+BK){X6Q?KsJ2t
zhS1ju- at wlwgucp}4y<S;a*6u!>_$e&YNm99-BHufhWpTefk%Gw=-yDDX!{N52QSXf
z!?hZC76#+DWNlj+MM<UU at OAl@Ykz at XM*1G~vNt)hl`k>z(245tO!e2>)bFxB!nJ9y
zXnQ${BQewA&pjr)7JWTAv`2Gi9^~i@^$u2S=yzjn{y1OS3J?NxngpLNC*h<n8#?Y{
z5-*r&2-B08fO|x(VNE7|7w1l76!4p?ZWZG`FCZUl0-ZawArUwc?iHC3`<eqz?hWl#
zu!^H*(3R*j^T*y3HNYREF<#otI0j?w-lJ^9uAsXaJKi6&A3EL`HBjY0M+O|fWq3T-
zlf>_GLU*JKAAhKO;PKoxYJn!<s7^!ojh!EeT*SaS)R`)FuSIU6J+KD;f^6jMFMz&O
z2R#dXvIh-p<>^x7DH6S_l$^(evYMl2Bro`u=vY<B(o1A%8hdv}cKQg~^NVzK8#$Ja
zW;^%cno?Zzm)EBOC-Ualb9Rw)@>jgU?1f&@%Azq=%O}eH{q7o$-xqy-)PQkNNfi=V
z(o!Qh5NL_1au!GbY_CDwaaB71*msx<|E}KQTcsXh4H19P#;#k%v8P-NGoRJm`z*_H
zX$A}R5d8i_3ttX at zY;YluOKg#P3(A16?G7G+%w=a(IBr=CcIHp0>5$e<Sx|E_=0lE
zLix|Y)>!AD5pR?bUj#qbb=@BWt*FR_jD4Ao+x|N74M?I{rpGig*MnLaY<waoTu%5u
zmSB8U6P<~Faa<Qhze~RWA2Dzw<{~_+auoRmL8M(5t49KhaLyI2k7ps{9_vhcmxJW^
z93k=meP#jkEUOv*rwr&*kVo+w9 at hcm4g9Ykf0T#uLfTY7X at KoEQVl<w5)<Q%KOH?|
z#T;>i=&qqXV|EyDd4KhP$McAzwzBHRVu{ejoUUyFU9cg(Sy>y=7jLv2<*jB8Lbtd|
zo6{Ba`_#XJ!1W-_;CHTE7V&o+SAiPXZz6X2FZ%tBnm_j8_)l0C;wR`0VHLxc3Ss2v
ztKjl`eVVh3D!gle>|F0(9$%NiXwe^zx)zaRm=Myhq?!1xiDTzXGKA&2ikE6uz8YSD
z>+Y6$!eDP;|0|Fy#GW&RJ>Y89`kv{A--_tW(TG8LFkXrOw;8ebJB%@5B>YFj01>BS
z9)gU%0Y6${(p1R#`klmHivwq+e-7~PYhnt=wo{)=;m>HR*KQlS`iEax_jajT7ZGVo
zysS4Zvf-I3gJv at FDLa`$dLQ*I(Sv{a2DXpHf&N3=hLZg{Ir`3+PL5ay**+HkG2mG~
zU-Oe+AD@{<^znnx>4RkxU}OCyxB=s=7O|3p at cGnMYsTmH?}^Vn;B<H2*t<_GgHPDl
ztr*k0W4?3{A1%fkX)oj`6C6gK(@GUV-tH%Ii;S(oVv3J;e0i*YP`_aPZ8G;mrt8W4
zkGWTmeKxueI>1J at k}gAymhZ;&fyaR>`aK#p<X``oXQEDGo<VG!*+awL11`XSkL4R8
zUt4)^<Sg1u#-So}bQZWSaBYHZL%+p%Mr~TexqmiMzrdDWP4s<Ya}u3 at +$QKGHo*}K
zc+lN1!*8I>9C=qgJhId~xV;+d0qSAjzcCIT#s3O29+a6wlYk|BLy>v+Q;r50!(+%z
zP}%j!>)){8C5L5e#m}bb>my;XCFj7$bv(UuVau)psZbytB4aOy-|+u%_U>U(m1`ex
zN at 6m*F-0w%+^K-1>}p0tw-vjZG;@zcqmjylqo5ryvr>20j&?B&1Iki|IRnEu%z-l~
z%y94k8laYrW-4MZI?gaEX;~r+l+^C~-3#j7 at B3cw^<Cfh$6Rw*Yo7J2XFbpT+=t)&
zyGi$^-^e#k`}WX`xdzzu*tfgV**IwHdm2W#HYDbg;(x^pJFhK0CaE~{d#pmk`b-ax
z`1{nXtiSF_;2h!>(p;;|B|k%ojeIVr55ccl)`^;Gi(<NKg0lK<(6uDxBl^gcdlvG^
z7;kV68YP^ATs^ZmaU98ttTtfT%IB#V_)0wMbUmE6sf}3860!SL4r11r^9|5N&r6*4
zH^Jdx+%apT(s__ at 9V-*^Q;Y-Sx67KxfbG~*`tcm^yT$>|cKUz3R%VY?qm2+|k6RBN
zs0VzKw-_dB3iP$T!1=Rr at q4x?{WuxwkV>Pbj6*DB&*KRy8ESqn+u+vj={9c<DOl<o
zvaCExW4NdF#%k>&Yh#Wa;ite~abxLa_vyv!-T8D6l5G;L*|sPTID{_P9e3d0J&HYh
zJ?FH0H)<(vbQHnY!Rk<RwL>%DGbv}W6laEJ&s7Z-bspxF3Em!>LH-cdubPGb<Guyw
z$G5tb<E`#J@?<);>@`t~Ux+*=b at n>0s=mZH5WOA#p0X%|`8!}{GK0~clrS1+h9c+Y
z!nbp|tvpJ5uY_#3 at Mk=wtEV5Sz<j!od7iN$SN~{~7P-7;-)~Wqa?Z+ at JWzsT^B8bg
z2{wHDgYM0K_*WSw7%^8R{PjH3=CN*l)(x)eF>r5t;*A!jc4Y0|G1 at I9!B?5G$bZmS
zQ2q<%Rn(aSJzrMt6P&nk2>Z(+{vnEQh%`LZT3S6}1lw~Wuq5~@r^UTnX*KFX?Z67)
zMVMyb!lO=ByN_|QgNzDJ>;hnZw7~r6IX3sM!2aOYj%Ou?VgDKQb7!Oux=jtI)xAr6
z=sX(}yD?UBv8 at EUcP7@xEY|nCo%}@es}QFnd{)^bJ8_Mt%xPO1nfoM at m)>({e^u!o
zWOgi{3E%V=O!lAjgQF#l*<p)%yNf0BkIK0p!}k<}zQqh$uSq@}4UR6YTzB7wl<D9i
zv#qpx1kQ-z--70*gbx39CEpo2{M)F3lnKMXU9NY|962u|<>8U at 9(0Bc|2Fz=%H+XW
z%XTX>jJiz~6qh9~L&^8v4#7Zcy0k6^pUIybhn%F&nnhoCmzwH%)^Tc2O-L^Jmpd!C
zdB{QA49*x`;~b3R$Y;k&<bV_peZ8glx0*rZ7oryD0-t{xL-h<8H|#@eNcPR_dAV^8
zm#(XltDyF~N=?weLNuOA)UCB{s75{=-q)W--2rvf7sS~jF;)7~9<~u?{PgCFz}Wvp
z{q=V6FS?8Qe{+`#mbfiAcdR;<$s;T;-{&32F_8`Z$FaB6sUQ7|jtLfcyE$qcH~T*1
zn9$eveP?;#<&=Cw{<;s&jhr)%llRB}D~_t?mI{7yl>{`*kD-WRSbn3tE#D{;^5_Na
zUBztwRdi41A>X%yQ(;T-&#%(8=>B~E5OrJ)?i0Qfo^>?%N=lc|z0Fzrf48v>_>nEe
z_kf!RH^*~nDql;~ByYE23 at 3L{VK?q~={$G7#{^%&Ja;<lE0|}j!ZmBet>F#gQ)f_9
zIV`L1D8^%nbel(w{=X&rby9`2eaJ?AMZKyz*{^>F9!zL`>$TzEr0pIN&RdFD`o1VF
z^;_A!Iu-j0aw8?5cs`T;Ivw~$p*3Za=O5^MDe|RTzf$2jf2}O#Uy9G at J~-mDCoCJ{
z96jGwlCQ`r7+88<a_FXFo`%K;pYuHi8aKmrrq0xe_iLPV?m_XXW9%3yebRnUlkC^2
zcIv0J!&8oH^`KAiB_K}r>mwBshtiAtdV6i1rw+%yz$+5RE2Ni3`ud7TEDJmmhu_Dp
ztrxeRq(0sm>EjXfk?JNC4kja3TLNDI>T)oR(`19z)st$PdMYZ5JByjL<eY{1*Z#b)
zISp}&C|#g`8uY~Qa(ZTu_rMp-M?PYmU3RL1@`ry4XMM8`6c3Hm-V5Wmcr&gxGL4-4
zll!L`kJ`3?!yEdH)14mJAFK7)*KULU`VsWkZAv-pq6Vys?~NN94_;4Uel*w5%Z7gJ
zmG=K;W9ybo8hQQ()GWEq+24~_SplCM;+AL1Ou8Yf5x!X7-d@<SL9cSnOfg}uc+e#y
zU+YC~@@O~iuS76_zR!S6c at 1(%jQ!aFF5&~oPp%)L`elvziXY3T6`=mJ!7B$}b0bfU
z^`K|${5GYXo2e}27U2K82503fek-4rr!3;vF-81z_`y}+=+MVGhSI%q;wXt&#E#Dw
zz at FL2#}YLuf3KkZ6xP%Z at I7hYgq>!O-T|zYZDm4I_3v1#$egzP2lueo&7|vs1BtGS
z*d{-{El~<N!L~nXOYu(+AwLN at Ow^W4_rQLci3?t0^w;=5|K}=|Vl58;kIg4tOlunF
z%Hivs48PZluxH at gd14$mPf9TlEa2(~#)s2r=;zc-D|A(CsXJ<Q9|w;cY6ftSGqdIx
zJ>#e<<Pw0N2KSA1 at cAob;~hQ7wypI=lm7?n6fw(~W0G&sr(EB2{5Fi8co0tZL3z|9
zpCA6xON1j=YkLo(FI#>e7uc_-5%bo{lXng9t)dmfb*3M-PS=eE2lrTO8~B;{>3`g3
zF~1J+&)1k_$RzB$sI&35x1YF0VBdJdc6&^+z%=lTjHzVD$`qoPYQ2rzVv6eyr17 at k
zzXS9iMhG4g$g6=zN6xGJV-D=awSYh6w-N3b&vqA{i9uP4_1ws>^B}f9phKH-_SjzW
zc~9oCa`XlA!P}4ZaWfJ&U$}oT=xAO=B-YGZz%C%4Y$yykf7>h$u74c5su*}mjX!Jn
zzU8+B9G^D0V0yt7^Mf_iU$keT_Q1(Q&+X at tK3dpufX&B_t(^F@`~8tLKi<!`{^vNW
zQ$NA60d@>%?qQ4vMy at sOKgW34|2f7H?GpFtk$Vcf7&)IEzXiO8yK{&yX|Wi37jjLo
z9*VIZ=>9QQ-hM9eu%- at VOEs7$BlDLFUr!|PJ^VWMSUtF@@H|nAEbzd-$r|6;PzlCZ
z#E#cnN7YZ2V!XOh+pK7HXifE-7b-iJ|5{i9f0CClGu<Vo&&Ym}-JVp6xWjtXzVP#E
zeAjsm$T8J%js%|phf^MMEibzcjEtil*eE=gz!mU{B}F_3S#puHe|a5Z1KCt7X`Z^L
zL{wqC^aOlHh&MOFXEnuJ2l;J5&HG|?>W9Ls156`ij)CyG*zdO?7Es0ALwdeT7P!FF
z8ZT|Cc$oPK+`oi at R$g?0rycfxIrjfc(5dwj0c?mJuKhECL+Sb__LF~tXZ%yxa{7>E
zh-cm>RnhN+1HpIQ;C&c_NRlJqUrY-B%O7*4dHDIsI)>-UqFs<3xvUJ3{joOes96Zv
z;exNiE9b8Jea at n;k^1qm$R}z=4*7XW-uQ`<f`w<()C&dI{tUh6n^P3m6B=J-YJqRv
z179z4yoE`=_g(w&c at OfbT$0D|{S%h+l!^YVFfnf9$e!Z#{mFQ)7-I(+yB&E%kSS7K
zpMzJ3=a9Z5EagPDE#)QBHNEeUtYD90O at +^KRg&CUJ;~X-O6w&2<}ChN(ksAs^HXJs
zu>qL&ffmwhvSkYJT`5Aa?li|p2JyQ+MS|Jv-qhY4;H;QN9B8mh<O3Y4JF~fY;QlzJ
z?tW{8)prlq#5j)39jCJODJ{j2+4W@?JV5he;9Mlec{YdStJr!*Ew+BqD6aUj$>WHc
z)OUo|_zdJJ&8WodJjNC4p1WIF&dnbR3(KSVJP4cp&ThPVLf=yE3o|J#)ZWbHIKNi8
zAN@(ez0vq*LuY${9fJef)$RbtZve;Ca at diJ*Ng6mRSTP&@)!P!{8794edv?#db<T_
zz_!;36C20VxWG5I**Af+$M-yEhxncg`2TBOSJhPoXIE at -H`UkL4gVJTdW16 at gjSu|
zHy3yZ)Rp!<89BKZakG?|;rBOwhQ4}q at n-R1w;KCGhcM~&X42i+_E!Y$9kk9wKGLo$
z(1k}|z`UUUv$h7VA8(cD+|7$}yX~@LoN~cz_u<IN=#MfE9Jp at m1?bZe*Ma}hC#oSM
zoLM8Z>JtWM%|z_m`Ni=2E;;+2FhfT7H~(FU34PW*2(F($A%BqD at TSiDw;+Yb`KHbn
z6O=Es%8Z_U>}U94ndCO$^syg-gI=m(^-=tnTN#_%T_0=mH}ZYH7_J^V^0*7tzy?aD
z14qoC2MmvucpjOB at L$b3icEZ(cab{qe94%M3HmK|<JTOyyIP#lWj+aC=D2dy7m}%U
z>opiVysupkz0_{JGiU{`Q-h=)^HU>=bk}hTWc49sQ}ys;?gd}DQ)sQ-jeEoUp6A%>
zjQwxdc=dl>BU`OYPQo?tzBZb@#{0<0q&!9B4^ke(%B|mRoTpma!c)K>18#SWsUh at T
zHh1-P!F0lLLZ%Xi;2h;d`bG&pa;MXC;*WDT@&D`w&z&!Zv&*+CXqV5AIr#`ZD{r0H
z8lLTo7tHXz0B(*t_z}wm?Y-G(yAXI85$QGIxr6Y7Gv80c*qC9{sC7|)`h6Y4XF3F1
zV-AP8SvpVUy~t at AoFy3R&J(O#de`W#)Bwj<j2c1>z at ipNG#DG&53qhs3dSl0-{q_S
z9Gs=r2|khO`gOyYobgtP9QA>UhyP2w7sv&$@LR5A!Upa&*DvZ%+tBfCnjJAD)WrmM
zZ at M})`}6-euV&=DpZ?>#bogv>&*`7ixSGGl^F}T{bje}{JY>O_q5Exb%NqF(8=evJ
z6cO$A^~a8YgQe9CZsoUlnro;r`$Dub{(P6tQ_u7=4v7Z3B=R?Sd5Alpj>b(la}2h*
zf at _LDkFm_;s^ZUsi#?;Ktg;vwe$?0buEJ>FS)x>ACK)>_D<cv|{?{ea{Cz^lx0Eww
zLd+~e0zGx}m(IY2NpA}d+$;&$P;W{lKk<ydyC%>!>0M3%xGYw<D=@|mw>inm(GjOS
z=Igtrzf4FW3~kIVi3yxFGH}Ho#Ja`3N(@x9*jvae0B%VN%%)QHkblf5a7Imf8~1%g
zyej&9YvID!H2K0#V=?wX9g_?$&Pv4X-WFr8Pg6!)TMXb3&#SD%vq!v)_70z)31)19
z1DGS9$nBD*j_*Rj7fJ8P4Wx0xJT-XW8(D3>KF$jLNf<}?CK{{b!+B41&yfM(eLrGS
z3<^#FIhhS?tXRS6&)#_07OnA3!0$I9?`!zuaKA^qbMQT#>y9r$eAwac0AI8TF=Yj(
zkYdWl4v$eV8oy^Co~#h<6)ZT9x_ZnB at Tdw&=Mdbld@<4C$rCK-N|ch$`jJPaPAzsx
zKS18#cA at nv9nH_BR*7omIf=<TVECL<BEP{n1kbk7dj{8V`cwKJ<UiVqKkvTispYpU
z9lW-5<ojd~c<As9Z7#@#__1`Z`Fe<TZJp5C=FDkT>q2)y-!4TwQ(}mK&wMoctQeNN
zoV};Y4B)KgcL1l3|H*Icw1S6^@2)`&4iorib&rJt*VhRCX9q7EI*$f^7>lUIXhL4d
zJ&qMI#8O~4^vId)4u>yuWF34fxl7p0J at CUJKSJlKg#G`wAPwyeT-ZqSZwh{b93_8;
zo8&zBb{NFE|Ez4iTF0pcPr&!mc3y_$EM8wJ)4{U?{@LsboCgjD-=Jh0bU>B2nQQQV
z3O(d|7Dq9N934|gCE6_#OeKs<Wf52D>ov<@>*`#^vfB at pBDbfSyEpz9w@yA<04|tC
zxv(`2-NoGXz7~pIuoy_4Fexd{mm>i;)v~qTLrNW|3UT)G>l%xJY5>5V7=^K35pmd+
z3z>5SvaVS0(bBu_lfD%kvnNw9+MO;~=RRTvE+Ht#vyb+jS6+1G at mt_4(Yzcft?k<#
z37Z5s)+}keFiBkDTS0w=E^W`_lZ+gEEpk#{Cj0$W+DF{zXE*YDpRsb(o=nKpOhJ%4
zi(A)=XJZcL<#`7<kdb-sFZ?wvSDB?wl`r9UV at z?4nMe9MNhgTRfiAaMjQBjp4H!4*
z9s|_AIhVL6X#aCst_C=@DOzDt#lnUn>N}?}9(Gul&Rj3Crs&Q!bJLLvegrWcJ?C2J
zVPIv?x9v>P_Y#)@s^qXT^5!}n^1|wu7V&bNwwdrTxGRNLmBCYQCVzt#eq?R$E}Y-I
zPCv39J2 at JOrLidZqNfzk2sY83HOad8q9N2|;UV6>a<&UPj(novfXj||uHZoL9)20*
zXgxS8RgeW5;uo&1;V<*G!2bi>g-;?F=moYY5Z`kT^Zj0>1)PoNjV9C=3S(<@P2y_s
z`6>1@@EO8{ZJ+oup$is3#(z&7Q7KOh+ng*`^#t;pVjy=Cd at Zy$2?CJctbYY-?YmYd
zFsVA!#d^uC7;hsR;bwy=4HyR8580z0{q%g__i4O%>y_;*<yW at b{<1ZX`k4ogU-$sN
zQzlO|^d?jP+(sWCdB)|yubej?z}h<kY|J5GFC0EOadX1H*bl#royC-1$C^wX{FH2p
z*|*zD!*&X-UrGm)m5TeV;nTneSQziPO0p!E+7wj~e`CZK9*cY+#M(T-sg}dXN_kv(
z4!@{%j{r|jd4o7#v+S<1&<8z?-TTV;ExwkZT=?{!?+B33mTJ341{OY+_Iu7 at De`gO
z6CXNtXjvn#aA^(i2qWzIYh`sHh`FWK{rM+gPm;o4aFv*QIglsu7(c|Bt}-sl(fg{5
zZ1$M>5<l=-mW2<dAy4)yi<w%~YP9Hqr+Nf>J at l&t_*AwJ`lBXQS4g%oh>`Rshg$Lf
zBh}Lc&)&0524}(7Q#{Zy?|WI2P+bsrsJH;w=6!}<)PAU^ykYM at bz?b=p;_27^Rd>+
z-*|=aDcD;IyiNbA7AEnfOfr0n*3;kOH)FsM+zQ{4sJcL{n;d|ymJ$h`M?CW)De}7n
zFa10-Y%FnCi*i|x#yqk0>Vey((O6fVr5*)z$V{0jO37{XJr7*b0br6U1hauB%JcpW
z-^;i;z8Jh$As4#UsPt63bC7Rx5q?&g(E8f}kHc_-Q?1rLS^%tY87qtaz+;n~CrotY
zbLi83v}Wz^Fv)M~<Kb&{lm at BrtQ8!`dVQR=Yh$2JGN160&Y3B?WmaY{`+1fiC~$3>
z-Z_(->##*!I8~G~InL_d7}&+z(J(Vb<D8BCsvS6)OYq?V%ZX?AP=ke)VTy*56wL(|
zCqMgP_=?dkyBD#T_kM8B4W<jKupW^k5;ev50r<j6&r^Vd+-fWZuUxx-Kl0g?vEX<G
z-aeP>KrX3MTrqUOlMcDr>fQ|;mI?c9fU_TaZL8btX{P-NHJax`CLiDyEIsE2KI+V0
zk>j4tX_ly!{_94jL9Kgy0oM$UrKw7A?=kIyVs8`mi~2rDxqA!Y2Yxo5{D{}4IlW?o
zjzLTbm~0)eNmx^mH+#6i&j0WVbWz8ME?N&=wE2MyLA!U7I(2s%bXVNV-7%z(Mhv-X
z1<0M}`$z|Hmq5m2Kk~ImYn48n`!an7b^!YNpzWGu+uEo}4Xn%#LLPg{Lk^1x^?)Oc
z!_OsI=bMjbV3F24X03;A+NBHB@$?Qn8>bED6eZ)?L>1uK6#n;TGwkE&{|@6TVD}JU
zu_*sn at Nicd?Q<dENgdLiNB$1yE at CNGcNbwv!HY4>wPIs!hXC0C_rm_L8wwfAT=>-v
zyaS((Zt)XT!<O=0_&KoW-SCkZkQcz>*hXp=i+<lTSUCY-AlB0$VcvF_NA`gqX&->B
z-w7Sf`dSmoQ>Fzr)tn&6tjBjXSOx1Y*l`@VivD-FvW6o5pD#Goy1&&yAFl$AK`)rG
z%yH=kc!lNSL!R8;bZ{C_48f0ib~X*%s}fI#Ke3+P!T*!xDnTxd9%}%5ILE9`F1E5<
z#092m!bwL=F#QPr88h+|pPQFU^Cw%*pG|#lvjbc3xvqrM!j&mo`Qw#2VKQ*oHMv$%
zojk;}^nB0AK6Py2k7<P-1AHsR!@d=cUNS`)v>J6{qJL@=aoc^pSo`}J#kK_0DK3V5
zus0)S1- at 7V@Pj$Q$LYEq_u!u`POOK%+JyZC?Yob2^u}{ctzZ*!Fw`U0`hxOAkQeYd
z_S-D*n1f?QoW$-|so;1>TJcpc{5OmlG0#Ep+FK-_laE<hLcd9M?04cHv(1^*M!1tI
z#L)=P<`8 at zZ$%!MKe)kD2A at WyOfeq3ph2YxM-g+C#Z>M5RhaO6k*i|(JY|NI>fla7
zpU%c-_{-zfKR048oHW=Cxrh90;&-9?UNO(wcaEF`B+62q$afqu at 7S08E8~izOO~3>
zSk&5n0ens1HtesBtVcbI at 3tL@+Ys%00e(%kZEJQ4TLUneVsDTas9$lN*>>djdZ=_g
z_z=%T24Wty at 672=Y-C>a-(jq1_q?$vqy%-Dk<%A#h+7`rvlToVu`jWG6UMISE?8n!
zz7;+pd$V!@Cuz$YzDUw3Zv7T<EN?T#lvZaEkME8eQH#60a3XL5C-|QSUjL+8q}l5C
z35}O#mKehsC+74|Xukk?0N&4WZ at S3-_n%qo-^}PaN1xdXZa$G{f;+S6ICqcK;(pJy
ze#<Y*ESGBYi{kW4io+j2s#v7;^PV$zmnBq!hrnPeS8NQi&VwHuc1hXhLh at a)JV>q5
z?b6mux}0ufu+l!AiI{XOiP;Fqb;zPm{q>kTWOr-Ty0l)z;{3p8ycT=OUjgo^462n%
z*aN9J`^Dv(JtD+%ZM-a at wecME2vcts9fN<Wh+7DrxAvH(ow3o56*|Q7E=o(?1{e05
z4PQ~4*AK4=VcW|bZV&&l&73Uq_T^)IGdaj9jn0wuiEfB62H2C+CEE^LHlO+_EclA|
z^pfvy?~)|=74Q at 4!1MpN;ry{Nh1Yk-;1znPt at 0`LmK@(C_}_1j)IPV(6an{W1m5^S
zpIts60{#@A4-2jDEML~rW9pCK4`B}={(saqr+g#+kkA&nYw$ic_h at 0vu4CwP7veiz
za*nMllcVV}%Cq9G$So`3=V#-p;P4~=1%HTQV%iUs`fMv(%l89U3GNN~vYT7nD$`z`
zYGsRC;jutBa=^wxJrsPeXTN9Qdoq28O^M?n*5zrZ%LAGcs$Bt}A8bp_%9g9_u?MYe
zf5DxG{xV#3rt;awZuq5%JBxfH-qULBoky at Peeel=0K8Wl at FcC2Z)NWX=W7)MZu}7J
z2iRxcky<Y4VlMBDl~Ns`rm!7|eYcCijaK~~JxjquZE|pM8qtTQ<w0k_(_*`7gpK&G
zDi81~&s2tP7FxI7-?oZt6j~1oFbAMpxdWb3ddB{&J?vbe|M>MeR>Tz!UDwz=q$7>A
z=>*qHl~khy*Uuc_jVaDN=NT#ZC-A-y`>j17w|VgS3AJuxuUfZ7B-Qj)5!YeZUidS#
zeHDTUqSnt<%HlBa=t$u&`}vm0=T at y$J)u*U(i-}=D&FY^2Z_I#@*Q{m(|m(t4Hxan
zFpe_V!=7GJ<o=5IXYk$%tic_;pXeK}GjQ%w?C0{Yuw!1 at Y;|8;SiShA!=)_G%NE>Y
zSxnW|a+eXYiVx##E<?a(yBcV-E$I2iQXaNvr6x^BGWCp{Un{P-l7nZYi+U~1kNwxs
zAxBMbKXeA`z1<Pot=~rUZymMp#}D?7$fl+pNpic(N`8OoKcJ6pqwA1t#QBrx`%r1{
zxjuWK4;(##kkXmNb#jI3Y5b{HH at 1IuPhQcByp)Ce-{0;Mqi-L`b)0VCcs{_mBt?W%
z|0A^aI}z=;=KlA$#dU{o6nQ%h3oW}6R%)Vj{l$PvK0PAez!_qgZM^j8Y~qo*uCYH2
z{LqP>9hSyvdg8sJ-?p8I%I&yu-DrQVXGf7xPzpamF>o3$(KSTTpH0B}St#mwNtKfk
zxbSk6aiOF_Z3w;ztm)HO+e|{;ZMkvXg4xF8D!g`<^n9cJAo#4*+n%Z{mE09wr*$6)
z0`Jrq<N#dro=#-@!OWKCc%MWL%Zp}R$m;8r+fJELm)Tf9zAA3i$#P>YI2glD7W?aV
z7fn@((l4~ipQrjMm&hMO`$}!R`h(|)v)&gOdKo-UI^_HtT5n9>x7pIAa1}J`Lso~D
zNiAJlTzObCy*w3UY(kqJ{N~*}Gv>l};N}i5v}A0-zA at jQgWqTIz(uuq8-8!Zx%IA6
zj63+`Lk{9t5qk{!UY88V;M>44aJ7f*&wi811-}DvwY0D}<Ng<|okq0tci79hkQ3l!
zfPBa^D_mA%?)V~JUhmPUDcDbghGx$!q&3`I#h(iNqQIxZT>Z+d8-x96!NE}d7Uacw
z!-74owXhM9i{Nqw<WU&`XOvvrC_dEHaI{-iKRzQYE2hqlYr4ORcU(aJ0WSkGAqTbA
z>tyNJ!yQ}d#g40az76a(uMD9MGmA%So4LF1h32fW$rCfAweEyd4a$MBz<xx@!9mzG
zT at BKr=8)1YI_QA<^Y)oC<VJ5(TEb>wA50e}4Qy?z324Fwc?Ck-jPb60W*sMwZT}|j
z3C|SY{b7A~_smq``KtQbNG?py!#xLvX5!e2s0qqaj8_{z at 8#B^O{e&ju?GFF8$O3(
z0ys7=YJ%?;Hy6LnM7z7$`0$hJ)Y)Tr`Mnm3Yf>9ChvUXi0?%fLJUNDI)imqJT0;v+
z7P|HcUZ8emz?+UM4$JN>;ZN-?3Oj*o7UDU+>Ou`P`VBJYGJZ3j*^leC(!F&3N at K+y
zt3Zr)D=XvRBbvFJy@%1bhsv-+5t)7ECmY!7W%~X><0l4}bXUIb0d_pb0CQy?e#T)3
zQQKg9+ab&)ArJl#`w3TBPs98W%*{JdQ+}R3)zsI<)%R5it_<I&bT6LiMDeMitdY3{
zzASeHT|1;TYQl~rX+E{<y9HcUShJqf6Pkzn$#wOj{}buj-xTB8dBCdv<V}YyL^Yr?
z&_5a5Kk%~ITiNSBfa~|O*EjabxrMmK754s4MNPox3nP6g at c7NTAk0Bg7TU>zuPg)q
z3-AgS%C0?!w%Uef&Y5ts)~w*1h{zXNFJ$aU`j57{*tW`t+nTBK9K^h{%65y6(wv*V
z3%V*~YnL3?i#b_}9L||DcY8|tJmBA^^nw!`@$0F*w%?yOHyh{eXU8Ff#(|w<47E+;
z!RANJX4l~WD<iQs(7ynD6a{$iM{f9(!Z6rcuS-K*l~MZNN(3`K at QL((7`nmJIHIp<
zC4C*;QTm0|qHQtu4|WcLm%u0tXsjzj;g5wcFN0(yc);2)2CbY7>^akg3CrgEHx4QL
zb>qu(=c;_UTs3l1wZ7ko*8ue^(FgQ1fcJqmk|A3m(?7(VZJ at Qye@c#d8Uovo(+|JL
z at c4rlf5%bWAHAa%?z1lnZLvF`bN?(%c;yH1gw^}pG-oBGbH6?!8=-Tb%7o7SI((y=
zZC}7QMx2t}uq}U>U7V9Xa-RxgiMoVxc4OB-Z#Hf_<sUPl3^|BZxG&<3L#+G3y;3b|
zQR+fbi_%j(X|K|jtP@$=^1UC>^Pv5RdsN)jsRq}ZeI<NNo>j8j55VSHmzAt at +2!Ev
zNuCT22-RkXROgsA@}HM*{Lt`m`5(tu{@3xPWQWhFz-u~u?e*|ioWyutf$Rm&+kGX%
zo+xt_(=$$#5x1iAmA8I!ekD!FEqSFjKN7s6LGv2xPMQOp6DfE4UpL+`CWKGu_=$XM
z{@R5q<By^im#{Dqd*R4F!W at 6=-yNut{KxlWZ{6wWhTe*Ll+jth1KxWJ`UlGqr2S<(
z{0FH$JIuj?Quuvtfe*MqyA^TB{fn0Xb6Dp~grEGwhzqcPDUQ(({$B0f{fPniO_LRT
zNdoja)Pe521%7J<=TUh{fi<pAI!}^%+#(5uPaOGnMnOr*$n(iJUJ8RR3;7hDGvDcg
zIeO at XH#-BIr_GA7vrsog8 at RCTP~4T9S%J1Srv-l<>Hj`|qr9Zt8h!|Su4c_?UT)0%
zokQNga5Xe{*PO;0Z8hpNb*r?VUGkCxBj;^9#PZke_S9lt9|~Mpb9zK~$d{L#9oAte
zhXyeOYD22^IOHWB>tsC>j(H0E;`eJq=f_?T`|d^f?79(qDUVhAkxTfX9=yxz;3v8%
z*(OZ*>r7o}>=o3!C;+yodS!z6!Dz)wooMAShGuL<iz#-;1tsj87+ at K64?K+6!C7#8
zjz;`hH+h}V`b~();zms(;H0eIM3c at w%$<dLdC!95^I0TD$O&J{**C%`m<wFUWsfD`
zXTFsrz<&4L6h@~nRKn+Nmj=Mq?eP8;@le?1%qVs0clYsf`sC)~{v^Vkad*X&KSdjA
zBA*v(b!`l2c?IxgL9a#q%-7In*Q15tkwHyP_#`5Do52sa_e>d{;jiZUzapm%b5723
zOcetoA}4*9@)pPsAxSXh>2f)Zz+1)yWirK^*qpi_x!}V%npOaxW3KN>_zX}RfoYGN
z at 9V|?GLNkQ*KCq6XOW at 1c4gytwrB<Xp}FMC@(vI-ZnWy2O}0C#lKfeC4ngGGLT%w7
za3?QW)xL1|;tx+%TtB>Rv_ErP(JIu6>?BNX0J(AJbBfK#Ba^;Pu{cd0atXTQZpXmC
zFP<2#kpN>Wo#jq7=l}H=QK=+9`$Z$4Q)0ZY at t`r#co1t|1ex&+F9&#L27W~H`RL%I
zMf~FHM)IG!swYCXN;5(yzkz$d0{q5RWioQ!tFX6zHPNhG&n;x*E>@ODA{TrQ6vIO<
z4e&P2&l<XqV2+<3L%GxcTsr8M3$5o;;P=pZ!L<@%jYG}B(T3jE2y0+t at F}wC|C)nZ
zKaZoP(6OD at 7e2W7pGqOx*^T+=<TXlUZgWhN#1!oi8^n%tD)AxFE>T_EMXE*RQvyS#
z4^lv<gbj4GrmY<RshU*+PRk(XTQ(2xwsM_O6WV<hesw-0vAE6A?VSd;?%3T)*{tur
zTCxHhhSS?n^K4P6bQSjCacJwjYYq15r+RKxmRt`)ekIkDhn-2XR`S}<VU*)fwjt>$
zQi|!(e)cDJeiRdiM|x41^w*HW*B))axa7N<5Id_uezrrY;8ah`7gwB at _kFavkj9$$
zGnLlOg`TpoHO-Zn6Z_z=WaXvg3-b2}t>>SG&rLV&dCZTL$V)jHb0;zDq&jdYG#$3g
z(K5%Rllol1^;sfUNzb_}6sQe*d+9u9-<Q1Fjvx7HCUBpGWT38XlVG~S4qji2U^MvF
z6hrXs!k_mAWZ{-yEbuvagWJJPxCNX74rS3CE#fujaP2QWb#bLjO5N~VpMwv=7=!rh
zRkEw5FN%GCXlAs!4Hy?- at UOyeJGSp6@~xg8LT$F8y_j2to_*$Y#Dm7TN({)654+n|
z0<N4>QB#mJrHd++)*~kP1!^N+%IRkBY4Tx<<S6nj`hJ^<wfXJ;z9-a>dEF&L-3-*2
z$nT4rcJk=|pL at FSChF?aJ;5h@{yDNo2?K-sx{P}$zP(gZkNeWJl?onUzQcVY=QD7N
z?jvf-($V0BDK)Bq%PmAqCc16dSDrRBGfIydPPr at w`%dI4)9!@KRaSRy$FsD~f;l=r
zxL8Psewt+7Ohw1DoyD9(Q?qZj&C{!fxGITU`jM(Hd&ADJ<1Tj}$lkc~>*$QinF;4S
zwJ-iDVdd42{Fb<5o>HdnPSeUp(|2 at Uw0hNwH9g%WX;ZRqY at I^9)sPEXWeWLo<BH)2
z9DvP{OB_XgTGV?DmHj&UHU43jc7&JuZN%N*S*iUF{OTq(_}yDj_otNdPr`D5_XzjI
zskO6S0~e9)?gw%^Zx3;!dp`t6z3rI<e{Ec`x0si=zZ?0*<pRg>wZ75NwGd0VkNyA4
z at E?W&lVMQSaip+KDzMM4hyeE<`D<tlA_FeO7reI+H&5YqBF=oq(~~%Os at XgSay&u#
zBK%-CffGX>DRO;`M|Z at vohl34=c?$;<vhKpP&BV+kErFXJ>&-ycb)$fd#=M%I`x(K
zdEu$3!{DFvcI><Uqo~id`;RtceMfki<4fJ<agA;V)xyQ+!u|gE%ck!ZHHqfE^+$W2
z7pBjmIuwIK!oZ-G0_uaeffJu<=8jH`+|F_fcf%)rY^Vly8|>kgs|qJ#yarcl3TI7L
z=?by;CA(F~zh-NRjV~epDQa?-V*Rh>s>J87ysJzZc}9*-$g``3 at ZVd2m-^UyPiC6-
z^6>MTxPpAC at a5>phuew#I!5;oKI%>u4|A#$_hF8_^E&5HX8^ntlaWgn!RQ1BI1Y(L
znD94&%YqowA>9<tKIEX5q3*rq`6y43ctv4otQa+gfw>KT$yEW4 at TBlWc25@KdWhdM
z-ICW(2L^n}i_;dKyu061*>hr6-e?W>qBL-4?VUyV|5oUx)37&(4>`S$B=*ZI1mD7L
z1E27aU2YR>h}bsN=(O at ozAt!)+xBG5%ENm82XrD}+MyFZ(eVR+mK1odHVJf|uX!m>
zYv}s#kHh!-4*ZHndGgLgzq-^q%>5Zu)uUXvw at 2s8L5^rG>aJw+SNYBf7JEv8`yt%d
z4V|9zAY#=9*yG~_&At9)Z8WMz<2nMuqG11BOZzW)ySIDxv3u}4_ at A{^A~@tq0Oq at F
z`8!SvFZ-Aiy3~7y7Eu-6-!Zhf%JBZS;d7B4 at 0$#5OqJvS^30Hz8L^-a{=5FSjMokJ
zlqs&eDf)3jaN|7h?i4>?0of=yf^#;yZZPV9 at MG1Ix5D4UwO{jOs<mO=q3;N7eV5xL
z$c0XdH7M6d?^%`5d9AyIx%-bNxau{>JFmfxxV5ast!=a{4?kP#zJ#~|u%9FPiBdAu
zuM55yZ|%G;68bgLOyrc?C5KnZ-3I2QI#qR%S4iI>o8EH*58V45YT?YcuZ_9iE{)k{
ze*?S(YnBMys)ezOH{hNLtGXEVHQKhNjxn4rgRGjuQ)4br{NPK9A0Xc at X;29L4A^ee
z`|1%Uz3 at 2jSJR=}n|0R^|0qq+L(WnD4)nNCaJC%-f17<H%d<!L4Haq+wo5#;jtNuL
z4!k?~55n7CL#?rW{5;4gmG?GRKMwM1YAv|;m0W`_XT)|~A&95iXV5*|t;L9+XovYN
z-1Vd@!4`XcxLzOlvvolfZv=L{<2U|YiQ~0*vP&Y2gx^BVGvLY)ubT^ea&hz?=&w~P
z6V|r;j*aJKwbTYxT)_Pye*7xV;~=J6318u};6tbwQYlM@<7uql9<dPk*w)88I@$R3
z(+up+Z)E}ITkx`kMQ4dyFC4tRDcU4%?X;jaCVV7a`#f4%0NB!i2>gjWJ#oa6&&Pdm
zmH2|zUnv{pWb+&Gy-DnH*9;;LX&iA_q_dnAITR-q9Uz at r;_U6_=KEx*nc?W#O5c at U
zaFWvRxA4q=Lk$l55bD{!@WtThqnfC<D6a{;=fC%J2e1pTgLnA1#p}g)jkZ;<O4?DI
z at HpbMe7{|GJS0nYd|Wp7lK8I6CcZml5#PH|=4s+Ly7RN&Qrd7oeeN9b9e17hp2Y4s
zOnu}WMt;vhx|a(Iit#%xdVq2Cg(DU|H#AdOG#$Jp at E;dVPxsW)@r;K(jp$d8TK9nn
z^*k%OAQRNO)L7KvtmrH}gB%B;wQ7|In3<@hg6V{n^v&hzaSS!EAvYF5-dMrKr at U_4
z_DL|yt^TwEHK>6V)2`tuFgJ6le)QAXu>C#>zRGgmtYQ7_BEp=ya_GMaKNTK|eb}FV
z-Mwakv2<+4CugeD9zc#+rv^UvX1Skh5+C}ekUoPiHCOd`+!#;Ev`vVkG%u5%)!y_O
z>lzPA22r!58GBd#fO=Y?QcgNv_)^k^c-Odlk;8iccCYAy1$~}EerDGt*jZo1XWVi!
z$B~<@B!4bpOdvZygn#w3P?qa;9Qf^?&XWAnXoYTlI$5)%#@!E{aFBCe(ylY3-d;(<
z$G4y78uq;Sab81}vYSatQHXC{F^TV9wGHzJxj$d(mFQ2 at 87^`xp;@P)I|3&q_I}FG
z at f^Z)#`6`W<M}*-brTM3 at pP`TFl4$p?k+gTK0j+XQ_4r(1NUTa^P>gM5 at 4Y0c!su=
z2 at Y%WB<C!`J97(<ZI{00w5CkL?~@TT0ftsurzit|C2C|&+8EsK<g??AeBG2#PbqBq
zZqy(AaOAn{L at h7i!v>ReJ^g=%PW at 1%c7%spLAodK5qVzts794Ro>wV0a at 5f(-vejy
znedN`w+O9ge`7JHz)lbUPY~%U<JTfT9 at TvQIOoprIe6B7JmZl6^^7mdQD=SR8DFGl
zEK84 at j%TdLGrssgp7BN0In4JvO!eTztqYmx*M``5;AR8{+%_LrUbXg`g~cmh#5_Pf
z40ay8O0fc(3y+Bek>IL8|NgRAr2aS6O@}Yz)<IJm=71mm?}vD1FR)v`tm7euggQ2U
zU})|lUSaisQ;mEn;mBjh93uXO at 1c8&__ey8*oN*>#GF@>9*Njd;vTFQaKE?%nw?Kl
zd%)VUHp7~!!yKLgc}_O`{OQrkw!?v-oJ{Ed4nbs_1-W0DY~QB1)&R50;M%Ry0nZWO
zT;=HdJJMcH9rl3}p}8zB+<JBu+t;snz*zt%ZvE<VyxLt1OmqM?L}0wdorhe|cHb2G
zPw*Ea?>7 at 7`V(vDevunplEreblKz9bf2ZwBpy#yPE=lWvk<RNoI5Iz!h>!25^-OWA
z*hb{t{zmc(b7MVpkafx;_-tO6>V1#!YgwCJkG>*C_1GoM1L)uE=Ql>$+J&~f$V0Wb
zFVXL*FYs$oPePaa0GBu)FZ~`{O&u#qs4M}eO!;*tr#lV$k~j!{Dl65#$kCzQDjK6F
zHb4i^VC=xHG;*D{xil{In3J~3i_kf|s6)bj|8g398xwx-&!1mLzV~Vz_e1CZjOGg6
z1M7EM5BX7tS|>?|!F{MqS+t_N#4zAGz{S1|9ssMms7*q;CUA;`tw&7-jKO-UO at laY
z5zTR7($pD)L2SHnKIN}66_NyJQL<k6#=ehWPpYKwow{zx0{z$V{C7a7S~RRvW&hyM
z*keN;9BQ)1S%1?-*$(R7u?}gYY-jO)5OR8VstY`(z~zsE?ljqH9p*6Obkcqw4!jEH
z<2lUBSnRcH at c9gCgxn%tB6VuPk`%40IN0sY9rn52zW1iiS!6ga`YlC^w!RQMn2uE|
zB**;a at O4lQ)%P-mC{L!~?Z at YvG6j<^Qy6n(iZnXr<HA?Bd=KS82$TN)6#8Kr2b?g|
z$AjMl_>w-Z9lDFM<9mK-8+3sfd+ZrcZHnHNsZJfYme=641iL*I8}(<JNCv;Ebsd1t
znBh`{ED%`1v$j`h5j^FApDJlCPvx}mfAUyTz^OkIdR^QTo{|*kM3MQ(+eK~+;b^4+
z at NcN0gZTf`=XCiL?wjyPHo{2=29&sV??w2xlG2X(dQA`Vimv(?V4*evACk5YTtn5w
zCw0K!!t?Y_CpjFJ#T*a5im`D)&&U{mLQ>FoYxxYSv$IOvdCkw>`|I%|`v+<n4A*=1
zTwD4*{0YE>Q~nC-dRUmkwtbVW3(fE;4evG8gtG)T^8jkXPLwO+i9c7JpM_kd%&Waj
zHP-3t%V)UA-$i?7-f+9#bi&U<_OA%d_4UT(w3R_mOA<-ZpLeN0-FEJ}g_djY;X9rI
zSLJ;Vc-(i$e+BHz3e>748^yx^8S5PRgTQ=m49F*?3I at PqY3QzCb?#hY!ss6fuj}g#
z%>cG1mvnP){GvwajBC5qD-GXeL}UMyw74vSVvhxW96R*DIzEGOz8|>;L2lSl(CG}m
z7GP*Cf)m1|r%$+0*F%^TyUVj*FhFx37 at hlRjDhvr39Mjhzbb0d5T4Pn|IQHDww1e_
z-G5)2W&j47 at Jv)UXd;sW-hCAhHP45 at F|F1qTSMPtMBKf!1|N`aFfSEIG}zlWl0E1<
z3tkb6`xxn8xZY`{H<bJ#skiopcHlb4+q@}ePOrp<wQN&f3o37 at 9HVwt=IbPtyarsW
z3+H^%mMA+DRU$p_QPSG_2AIMt8%NrAfXhYJR*JY&b*RbnQVKZ2fJ-aqZT5U3`!(qA
z+*h3C7<1^mAv=P>p_Q)-EyriXd6+w)^~zhopcB_&&#*s{?$24~E at AY710u~PllL3J
zbaP3ZF0e5|*jPC-2X at CTr}_`5%b at c`6JC_>gC6LHo>)hEA~!uYn$;7VpeOpc9k)Z~
zwcj2$PmcVcN>8oqI8&4T783?N@$TU~@!iV3;(JV~rx;k~J-|orkexB^MBjROgvCXT
z?4APIXR_m?pm!pgk?N at zoB$^f?q9UqN4e+vo}Y^TEqHEOtK>$d4z*tP1Mh{J#oIm`
zZSXCZ=Gb(Eg`K&9 at OR7?gqtMYklKJ9T``o4V+RLkVZWJm-OW at m$2n#G?CE93Y)<z|
z6>5CuL4U*EPJ5B0nB=zd2f=mt1b6#*(hjPv2z at F8_%2gagW%cCz|EYZ`AyiaeKQsR
zHTQ5oEPfJP1U3P2bb!n1+0VfnnA)Qpo^MnGjOoStC;{FA_^TiVWLvgipwh<OA$ANQ
z#@oq&-*>0jQK`g!FCyQz{!MV}qTo}1(nR2T+?EdD`cRAXOL;LfaR1r}8+?q!fsK3y
z8mDP$Tvrc0k<B?Eos_WMob&D?aaUKJ1MxZ at xVwEyL73|>V#<e3W%y3I6*&tgX8RVe
zCtkH~<@cK}cKi&vD1aRJf#w4A=g-*sM6e&Q2bN$BBB#RFi at 96I*6h+jcTr(qPDO6q
zv%s602`~Knxmx5F`8bp(gZeGy(BU6~Z-;8yLDzp{7X6>~`yf|eo!a!Ipk0_G8>F?c
zq{z+I$Yt&b+K1%>#vgOO|1)sD%iYjRkke|t)a!c^<5?Av*AWOi at 9X86l<9;GC49!k
zhkQ@|zWyV!aSZstunv!%^`)Z^By$LNk8`S7Oram^!Yi~1%*Z>!y3rYcwE_Pf8?V|o
zZ0kzC at c9W3iMdrV1YICJNZD<y<3I;Oy(-<<qk^dze<Sf%z-OMs_9y#~{*=-GT&1)h
zgl+wQ>j&8=?7nsfenKzwyhh*)8&KE5AyY&-VB=Qt-$XoguU7#)Yel~9MaU8np2x7w
z9XWt_+rOw at 66z9vw^Dv_OtkZ=&ivinNfDDI-r9;-kH0MTvi|^hu^hl3(EhrPn<dVW
zWQ#LI3UP*!VswA;lp&tk80R+K(q(fVN=8gtaxN!hBk|01lHI<io1+H~^Wu;V97kgJ
zDEN6~rY4Nr6C2FH?p_z|4`?iUDX<t<sJ+|Hij>Fjj=3N?ftbK`*yp#?%17kQ^>qau
z-%3Bi at m|V(MGPk0SpiIZt?c%Lu;s^B%XFjmuiMK+jGTYVZD;hbonGL2mfYuV;|#hj
zz8uc6+6vqcUgPYH7FbM!zZM)oki)-TN;ds$<K<$FnG{~GA=^J^670OJAsb?7RkC{E
zHR~|8&G6-bXA9^57K(i0ReI!32f$l at gd=lXn3>Y~!lVbht|r26MrrAqq8qQPd}~MS
z&u;~rMBV_!&OYe)*{ulKfH-?C>>+tiUb=D>bhcLy;CIvz=V_c3GTmt88-lNQSP$8N
ze8Rj<2Gqd5=(}+?gt5S9mAUC*VN%y6_+69L*}-4+W^O%?^{UI+0NkfFapl7OugXYv
zrZ<pIBZ+6*#2&y@!^hLT$>6&Ic`y2JZ4p+JY|qPxmlmL(TJVsQ+(Yi})>5`!%V|Ne
zO@;OA|0HQBEU}JRxBTOl5_R&Ghah7U9(=$%7<Xw&gFBOr^X$X=sg_p2Uw;K_h<q!V
z_<Yq<1q at c%<U+)>^6 at HQ@!8me;D72mUNKk8$&%>6y`1{f{am$=GyEM~p at qQd{TFt>
zSki>Ceh1jD^tM`xe}I!8m`%jdAZH<is`(7flW&$uSiax>XDP-LQPdGYE<h5C+s9Z6
zs_xBH1~?|cONTAe_CE0Mq5|?pjz5}k`!yrDeTSzRYpV&dhX!svixWRYHZ0!(Il9Z^
zL=2fQ<90S?fjWc%Idf-XK4JEmOmKG~=FT+0_tK5^|3g?O at B=RktylJgn?3chjazaC
zXG9vnyEt3gDybOGAHdx1mDB?pfA9}%d^(Gb*Nto99>H2kN6dhMJw|zF>Buw7WpmLS
z+#Sd%KwWA!&&=qlBVSZ!F7`a#19N}x1J^{dv#ny}J8a0YMc~7NF5dP5<o;)B9XFo-
zcNqSt!y0ib!|oHbJ|4S(F`E&orM!Znu=RT1d`5vBr#2R&J`=V4s*rnbO_}Tj7eR;>
z_^zU<EMC3V7Qs6SygFpf##6GCDGqz`gosRuKPFS+Jyi^j52w36XMw9eM*!K?Elm&~
z8lqhG)c*FAhm<MEV_C&B(q1tBGITbphvNa4hLd!(V<``Lil*l}?aA1`XOseS9`JpS
z_No(drK8_SU3K2A?JJ2 at D^Vj+nDoUG;974-I})|nGgW`Yc<ZFEA-_(%r?qEpC3I)e
zysbK6;=Dn5W%kDL&qq@&36pC-d>P$bGyE5*_eXlTWUucLb?U>N(6vm^q2Nn^ocDrr
z5o at gLZ@!0U|K`a~S>h~h7UCXYfB!f1*WJMGTy!-)DnmZ(T<kATd8+dj?#gL;lOA<z
z!0Ui<)`j#7PGFBL^oT~}*iDuL;OmEg5f~J at QTvK)w~bndRawuh&^2-v!QLbJ93xXm
z>asU7ebA{Kt}d~IWOUa7PdV%);JJ;+Q{RO1LbAvvhD}r9(U468dHNOfNIEwIb=2rR
z3$?G1YkrD8qqc^m3wu&C{I51oc?z&%B8?B&Ph~rNiFWm-z%^bjE3+Qq6(g?EB+j^6
z!pgS4K!3R*s|Tl)j+4sT!KoR$@cE_SuPUz#n#GRu`-MrD*Wp?d#2Kf^r_qSMgjd4$
znMVKl5aaenM1~9Uk7Mn6s;wjq at fGfIA8-ca$=_iu)8qWdhp#o!=<Sp`nbv$e at cx-O
z7>f|_cZN*BUc<$;)1?=2?i5__al9|6En1R!y9_q&v#@dV<jLvk|Kgo!wEn7n!uBid
zPmPY=AG4m-IW4l?uqEY8-?ZUaT_5W7C}qu~u&3{igxq^0^0uonMPC^qZA9(_#Sp&1
zJ_0Nf#tt^7PpQ_)HKF;=BIJR?_vt}A7<TD~VY at U%51V7tV1T!QbTw}if4<mpxzK5m
zHdaOeuTUX)-2?f0`(s`*{%?Bl2Fsx$_dN;D-C2-TIni-sO9y6fZP>49?>z=vhHR8$
z9wmG2)IWL2R^?BrT!6M at x~%>#{twDbNnn}g>J5%FaWwhU2}8y?-!*&5x$s{w-qV&8
zh2KG5g2z>U^*CpWNgFY5m6>vUl<AW5p3kTr8GP)S68Fh;vZ+Qr>)OZO(}=ANo$fhx
z>ZK!iZ=v-7J4eWae1EzWez4Tur(oj^V$MIu&BM#+?J(7cSjX*UGLT=7{b{^i0$c1a
z&kW9*6$-!Zh|Ea=FaH(T&nXWP_Mp}R`BVMB<&UFO5F|og at kvX{6i?}TZ6JKA!8uE*
zW2$+(9m9D{z*)e*e~G8*_#S((fNXs9DTS9oa%SAOBxk<)&ErT>x$MDi)Giza|9LRW
zr|@@4y(2OO>pg4>eea(IJKhSv?B7#N$epaX?Tl8A_*N%l?@%u(awoyY_y+S~4r2FM
zPwx5RigWb-%rJMmJHn%unP^>dhVU%gqW4n#0LQT=Ssm*XK6Ats68dd4)*ihFi>;OP
zK9>5sBn|(43bAdgd+##q{=K+nsI!uCpRb(9IjkPNWFz_0b0T4X-o{+fC5}hz>l}Vd
zdddV$HXReRRV16quPr_mu5vz}G97-bl_Pz0VNPYC-Lqs<WBf at +YY|%0!E^0CPJMWF
zBKmNX+IyVhbQhf9yxub_rO<aVt!p!$1!Mx^m0wr;G9jPK;UB#$uNyN at sc5t=J4$-z
z?euv~tX at _k^#C({HKO1C^0|!lx|2;;?VKvAyZ*xI$DD5LX({mipD#rFn|i(Q83EHb
zU{5JT-N<uvO{R+rn;F;kvcK(jR?ckqUBuq<7t~?S-g+K(UJd1jqORj>s7FaS;B}sQ
znPOClY`3wT_)vhGQUjCyZ^4bqV#FC7=h1HootHv>fnUwQVf+AHw at dab`^^507*1Ps
z*6nwq_acUKK-}7O5H%Zq(HT(RI5Vt4-0CXA9;)wa;$A at hU4U}~`F>@xfUz4novrRN
zajQh%=ipX at KMZ+EIA-~SXWYhehqby(F`n(vkyJ|Lxema80sB%Vc68;U4yFN-Ji=mN
zog<I61T_qx at BA_ze78vvCBmd9w_*-$h_LSrt^5Z1$}%Z at DIfQEmQc)v{Q8g?qqu}C
zQh`?(IiP<TgFVPh>o(9Z(k`wC4m at D6A`Q at UfgJ%KY$Ea#R!`prz7JJAI5#dds8cVV
zC$1)Gz*~pfD>sN==D%=OCzkULd3nM0!i13dL$*yF(1TJtkqhD?%*{U7Lu{Vq?|K{f
z2H_Js=A173zjQiUcgJkQI$bZ~C4(~rlND8nZzG3ocyC0_H=AUYFzIZ}Z5wLvWIT%4
zdFMfoF&gU|y5Wp`J$x$gQ-#0pvZojjM}R*sRO2MvYcc$hC4vJO(}ywVANFKK=PRxG
z1CmPoFKoKTX at iZZq|fMY7&p at o4wGdq4Dj8O$!CzSHu7JxUnXN7qt4 at S?lk&xwhbKD
z{al{jS;RFsDX*dqx^Z*L4#cB&XxG5M))H#w+?5<f9KMOT0jw)nTa7Re{W+}|^EK0R
z=lI;&KZb$Rd9iXHlQi8lN8rv*S`ePPY618dixQm??Rk$LD;5;@Z6r=ptjTwbMaY#^
z4^>Dn9=8xrAbcX9NMpo@!c}p1f#0g%lP_{?GKs97`$XLrRDFVBJmEIty(rc#;FN|r
zvBq1#hX{Uc$c%r2%bBf#Onyw{0zLwLWejR8S5H4v33<{Xhu`Z*+M7GKlP)uE+l+e8
z58&dsfVQAR_CKjJa8AO{W(#U+LkuW>7i=qx6ZXCA7`yp!1YWmGqQM<+A3(gXO=ugv
zs|}b^CWF80zc{|lhf#AP1NBgJSR2!Xwna&<IBo^v)0#7T(a$}+s^N3ZV}h)R-5)@`
zydtg&HsI}EK8`En^q%@eXQc=Eal3-+AQM{%e>g4zYrxw1E$Z7&R;B}Y^||q!vSjkV
ze9t|a8>NyQ at O}&oq$wOeFu_E^p2cRZPBo<&FNGuD0{s=i*L at gr;yu?<+-ohx7(ZU+
zQzM4DhWKEm+MjKxwWg62L#`$Q3$hJ<z9Vh%YVCy(?2EQVeQitVKcUF2wu=^4gKvk8
zV-V*KuLk~*ZEPP6s4ruY99ei}@q6G!#XPl(AkVdzXP^cnxY&_9ihLaYF6`woci{WS
zd&m+&_>Xw^ve=7P5-E<P0&gL5lBmWL>#uoSo5a;4Z`)9B#k`&kezb=|WsH!!%L!d<
z^cvWp64=(Tv5h6*EUZc~xmE}c_$GyJ at w~D at Ek1ufS#mCX@~U$ZEo9##)c&$k at Eln3
zbKRA(T7NUy_}~*eNOLGOe~tzDn2nGVInQYQ&Yw?kYF244?1x at qQtLQT_<axMD7ufF
zqPkCee%5np%=O!(OWJ|AX)jEiR|$T<f!2Nb>F&yjd*NT-+gkB+7N_=^`tE&PJ>;T#
zPOUo&K4HV at oyc=bMh)VJP-AaCI4usK4)lHS4b}--AVaka_s1`sBXeiVGEgfedr^CL
z=?lkzCCK)aCA3e)?;d+6uAQJoJ+N%wfWYo4;TewEr8$_ZS*QuVu<{bPspZJio at bPg
zQ at OLHHi;Ts+dCrq&4&@&I-)EUOpMRCT|;?Ao*FvOtq|It?g58^_Er?P&{0V|fym`8
z0j9>r8Dc6Uw?h_Qh-pgP4Z9My6y#YO<Xi>K3!Nck_sIaKhMhMDm=_V#6I0Bqiy1E?
zPUFsCP7P|O*1{fGOL&IF0B4lDdC5h$X)5wxnK9B!SSxR!Uk9nqmiK1ZX4ENosiS)n
z*;J3 at AU1jV1h25qvdHX5e%h^FM)(p18<wndPxT&Wa+xAVk@<!(Vtf(FskvILnbYFt
za1CN(#qb-OAa9R=TgA+NzXd%;1>Jfo<c|RL(&ws^-<PxehdXfmsOtdyE#-nQsm1_g
zOV1GfcOXuiZ(H6WE2DeBJlO#`aU3-+hU=OQQoFE)OW;FtF*^~%8URl8Nz4^xoK|#4
zQXZe-zM at cGH(FoM*U8T<|2K4 at yxzNuVsQTLslDzj&v(})*4Jej{f*#f{*IS9+(w)>
zqJQU9`hQ;q{$qFN`4)q>_!n*|u6F=AaaR=k^ApCOTb(+m*PV^yMqFp|h3~lz at 1Zzj
z+X1 at 1xt?<?;Xq8)hwG`HQ+!63Zv0)h5pz6yX^~`q;Yn^jFc<}RnR at SnSLCjH6P@F+
z=vq0YCo%WA$~j_pHmBEpbV-6+ee3o-s&ChHp&Bvmibdw`5<CYd*I=?>Tx$NTQUsx%
z=nguDd0dWpUnAB&hCC(2RjGb1wZlH&LZ at Jp_uDW{M|bB5PHkrg2i!xx2*|9=)v1h&
za at 8WYu`=ciD__1Ie37RiewCa<{NGsY!ymQBSssCt%H)lo*8hFuhxMY3pCR7(r8AyC
z<b)5D%~8C!@qNOJ=YVGu>+zqb%AxNYSJng9Tm at fewH*GZ$^y(~=*i57kT0+B<c^{g
z)hP?|UW-y5cG#xrDeu(@{lYmrMGsE4DX!AwT#;3h;haTnCd$}0y=<G8&}KW^rhlZ(
z*AZ)N`2W^sWjMHm{mNpF^pU;Lam`Y-J6Wvm(kLvXNAMKzqj$6w1E;u8fVu_=TJQlP
zUt>uj at foq}vU_a<<}R1=Wp8^?qkd(y3ORId0()-T_UfX+qixX|R8_m!+$O!`DVs{4
z>+!kWQ-b>Kj?Mi{3h?1HX4&XF>Q06rM>8iAbN(K9b&A}Gk4y5}u+Jif46LwJj~s}a
z%FD>pmM7Me4wIA3sQTYv>nW5V{_Ip{pbZD at U!MECwU`?vf;%qw_?TizJANzkAU{}W
zy}Fq_wqI}ubt2S|Gu7TNw`i7GHKt}e@&+;_YH(5M#*by=W#GWDZ#Zg4KH at B{8G9>y
zA@&Uv=iat*i^li!W{u|{{nvp1N>L{%v4-}i2i;VQGtmj3xW2EFjx&E8S9*crSO~5k
z)Xigrbl;)a=M$Z-N^U9kdOQ2S3ivB3A9apzkr;nWQQl>ez$IJpXg$6cjC^kt+Ma1~
zWjvb0QAsQ!&8MpIy%M8HBm4k0P1{Xrz)U!XkURRr0aotrOZ?FD8D1|us at fw1mhSnr
zwaiBD-@*NmKz&5bQs`kAPem{X*LS$6CIf1d<Ycn<<bba{KzPF#ZDNzlJQ27e9Amge
zCy|%W_%MfjLCMh9+A&|+bz9=%Znw<KMcwrcs25$Ri;V367oF~YV7+-uxhD2|DZXPa
z at hV~mfXk at wUx^&;Z3#zBw_+O=Wzj0rEPQ{LeXe?7Fy3IVw*&M1bL1zlX0h9b90dBI
zyDlVMzyIH;wa}kfd&T!?F2<wX^iSw0YIkb9mGqQATaKb2H?5)|Yf}Yq9hqyli|=)*
zbl8(c#T?Tf;S|GddBS{=f at iuNwD>aiwe(eYBwEy^z9PDlW)j_bbHdr8nOJ}J2Nm+z
zI?<iCRH9cOQ;8CIcuDYD3HwV>kFh>FocnpbFDL8KT+Chb^Qiese0lwL=t3pZguC6q
zu)<fu{e|#n(6t_BYgkS|E=0%O8pP^+hR<DH0^Ue0<(@Yyt($6#K^AUDt!ox90Xg7k
z)43ZsepxfO^3g)nFl?7Z+u!?M&Q;|Ip%X7rj%MK3g)bwMFdX9 at h@sh|^vkSrlc$<6
zD}>YjW|qf6IE-(4;5SweS at Lz#il`}U?Tq2$&LN9jHy)U654hRTmYLdm;AQA1c;_Af
zhb4XQ9sWLUBH=aowOA{_FwxqG(yzpP0Y;u;&XmLCz}yD*Bg_HZjizrr9Us#5p?={?
z<Xd4+{?n4L!>=v5FZ>>zi+cp`NmnkgT%jI&XfErQfejD6hV1=^Xza#+95w-K`Sp92
zX*tSSQUi2h<fJe9v*@~1)nEM7l+)1F89#K~BEbV^N{31~etsNsjw<@C5i5Kdgem%=
z$&?m+aR at jd<{E6hc@)2s75DE!?#Sw?^&{)B at bfav?;Ej<-#+7j$L_wLa|3g0p1Txt
z{Zhq8!R<pMcz?!)x&+6_UQBHE9PX)jcOUeX*Lw=yEkCNM`~tDkBFLbmxt|{|epEv_
zsW~~4t)4tKud7)poL)3!Q6krjXBQ^9o^kEM{_rhqaB047Jk}cXEf;cSQwQP#SLnF}
z;kopo{t{u1LSCgYynwNms8PpK7xK|nJ?iFY0&ic<V#;;dfem!rh2z0>(0_l!GhYC`
z`y<w0^C7U}mgxrMVW$RQhveh{D`KC{a;JG3Ap;sxG_H!t$j5aT*8hW--;n`aB5J!w
z0dw~^@ZJr_JBROKa2D_MU~9mclgZq_Eh&2xW5c{FWv(OVRWCX3t_DWnqK|TRZY2gf
z2Bu>kZFVSAq<qg2*vz-KI9lupjlkbKnESa|y4kVc_)%Y&F>iL50?##cSHLfQi>tg{
zB3;m3!fnF;7MhZ8<l%o4|6XA<{k`Jf6NdAz*>!jj^@XnR;3q!5bc;G+g?*C03bi!+
z#xYNn^n|>-Z;KjxKJ1CK8p7Garr3`51fGv0FM_kGOuPCaaD;taGrmn?&Oy!AGnQbd
zG6iG9fQO9s90q=H at GJYGmq)}@*_TiZZ16Xp5%UGLlB8PVNT6eQR~1f#-E|#y?P`*f
z_k*AG4He~xw81aH_?M)khPp~|8?w$~j^QL-MGZ63rC~=lVeYKP{tG^X+k2w(rL`+{
zr;5q{-h4xDMed#)GVfcoE7{z1s{X2uaq^H`La}K0F|NQz!t(s!{0xfWE{|Y&S1XoB
zFhcfO9X(b8pM3@|8 at AOJS1B-m1#z!nZNOIMKQbcAj+oL$>hWQp!nm+p45fQ`#08-^
zlR-GAPVg{7hUK817usp7c{G!b9j{Pp at Bgbh`O|UW?2vQeYuWd7bEUL#5Ato5&G=2m
zeJ|&lWGj;iJ3Z6>pvd4dDg1(GZu^b)hS_xA5sBEpCbwBklpi<{1?;vj1M{uWcxhrI
z@)9cvV*$TOnM8Z4)DR$9zzJq!3w4BjbyZH&Al?h^$+PtgI6FcfMvM-eAvv>Xj1wI(
zpCn$)IgaP4`)j>_FK|G24SkGpdJ*((1>|fdbg=x&TqcWCfmoI$G!MFe?)ZMU>Pn_W
z16|=_pUO2Gn9e=ackq<&Al*ltb7hw}<VrqcCp=tOWBh1$DsO^Y0Zv2pv7)sXvR at 3_
zU6}Y<U6!0H#-6*K=G>t5;|afCGh2?l#tc^$$1x8$Hflqi{K*2={!<Lj3I$eS at s?BS
zvpUom<FLBc579fvtKE5D)+0xxd(ogs{?;DZ=V$9VRcDJi`zP+<sKL7^Lpypue2XjF
zAIoqXv4>Z9N at KtBgBxvI(pd!uZ7tjl`+9gS at Cny}8c4u at UR7}R$NucE0S8i*&cUf)
zT)660`=;)SiF&k?N8`$=;_e0J_ubo_;M_6&(Z;LL`SS{ai(#Lafz_`kyG)Vo%=3xu
z-~ww7DcJ;`k*mR+64VlXg}0Z+6ZJ-u|8<d`2jyfYTEPMPPuD(1hP9x9Ovn7G{?)S&
z=a|6D0<2`;KFU=zcI0Dy1FM19bMQIXa;PQ4uKnU2Nraoc+JXDKIG6&R0XTYB4R{a<
zE1%Cb^hF~k?H}pm?*BM<bmT>4Mq)j5ihnVcz$w5#*FTEp$8}>4{E{MzG+}&)M0Lhu
z7+}D;+;^7M9WP>jzeT*zj00Rqev*mAg~ay7HjLYi><3>d<*2mhv?VqQlNQ}+tAigS
znO_ibEzzL}i=Bjbr!OO6(kic8EArleK7sk3%P%7PM41fiX(^4H<PFIv3F>fSe4G;G
z^d%l#GQq9J_2VFG49M$F{&YOnd<pW8%H18z at AsI?FA&{WhFCk=VR=?)U+gSF{n;Nq
z$Tvpc@|l!X!1i|Kdh`Du%HBOLs&Z`~FHPLAa!B#8bxK7<N;=FyR93bNQ#Xx7h!e^R
zryy&Gk$GUdOWiq)13F6><}3~a%#pJS!+=7BiidPELj;1+VFpAr!yN*mvd!Q1%wTWt
z`}utT`28`THM3?Np7pHfxu5%R-Peu0+<NqNnE;q`dYTJ(H;I^Q0}r~AtcO at LO=6?Z
zao)<SGG1>K+KE0M2Ygfy>#LD;=-El=v#+5Ocrm?CP|c2uu*KS76Z{?T4tQ=)zZgi}
zQ9N5j#NIuV!mSQn+v~l|npX*r5%>zvZ#x-rDWP at wF>rz}#j~0=#5q^v9qi|P1wSJB
z---W^{PDkq{EztjxR7D^2d|ag67VA)$NBA!!!#HDRmS<MDHAm+#qjyP3a$m=*Z*05
zo8C=$d4DW&WHLR%tV#8Yqq?mk3;bk$Kbo=6<!EPmwC$6So9r3OT7vJ|z;Q0yu*vyP
zPoB?3*gxNc>;F#KuY$DicJ;m{*{}JHLJe<lYUd*NU02pdD>5bV$p1aS&P$*__>N(%
z`vE)>66Di*<n95?vvO5BWm-M0@?czT)e8dKoGOPFIf}#C-SA1>q6N&~dqXky9$~Uk
z`@N9N3BO9x?h_ at m^C;*O%yK^Ji-pUwdsrG~Ii8_XWbwx{{7?oR;2;?Toc!EUZR=nE
z?{j?f#kbC_!o{%VOu!&{<WWT4p2a*PZ8LYLO@*wmMf|#Fai*xp>~B~yldUkN#MYhO
z037c3W!E8Bvi)Rq;rvt_2fr+G1gaoAdlonLJbb1y#tf#-Hqp-18fp6GA4qPCM}}!2
z!z%ueVbvZP_MOl+$s{!)&#l7G+*`Kh)t+h*cn~4yS|M-tA3p*a=U!Bc at vaZA`jqfM
z?*|rLF4eJe`tOD-Vya9j=(qi7TOD*RufDY$9J}RvCXw+3oX9!XDxV9kRowQ7a`QU3
zi|C|phr+MX2`-U*d<ZW|L5!j8QTI9EjM)XfK4*c!@8_ at 5wXB#OdvZSEH+fcMwu at 0G
zkV#u9Px{yU%+;ZPveu1^gM2wIPpN&8PJ_LA%h%v2updKg;IC^{-<>A8c)hQsy#tQg
z>$5AC|3n)o7hM_KJ>NoA(pJ1bD>%!JkeW-rhv<UqJHypyWv~m#drjAx{B6-ndr{0|
zJW-dZslHRqWGtG%JE~Q7Bd^J6(PsGPuXytM`tV%pH`EfA(R&9QwWfTF_VO&qMaeGY
z$``+{ED$Zy^*|n@=9Ua~-wsNTVjNrOH at -W=3IfJ*FKoq1*D&JiLj|_KsaK;Oo0nrB
zx&X-|^zhL_=K<fWUB&d_(*nM+sx-s`QW2M&0ls0c?_tv$;8XY}d3&Zlc?atF7~%{+
z_gY^>9UqlQHSVS4N4)#G+O02n_dUKU*$4YjE2x!i<#_k`u1tQ+dt7smHO#wj(*ERG
zWBb0cKI`4bI+gs_v2%IW=f}={EP3|WamTDrV;|}f`OGEtgYf>}L=JMb;2p$w(%m0(
z at 4+6Cj%~9Csyx5<NDcHb{3+7#3ke0-W``fgR=RBuIKxa-Sv=}HkA4cg&Imrhq|Kj#
zPr%5ynTqR$VKQlUu2^KGk-rr(BI()I&Lkz&N{)3+Be+H1;%#biA!1-fLa`_QKd at fi
z_RF?Df~_i(@inLos76jjGu4K5^Yay{C(Io(swlN!RPWR5%*1y~M+SAQqlOZ{b#eIi
zHobc(@R9h>x5kkJ%vH5}si>FIb3cHsBxl4vCrC{*CbFZFf)6&T^5y)3a871JF|K2b
zQ8tuezoBC%W0)yNT{}&;MQ|jlDo)w3C&;R!S#{*P&`Y*L2fC%Rpf;}F;leg&<W1%_
zbq6~9F~|Lb3UZxq3LA>Q>218xk;52f$#voI8CwLoQHCyMLrKR^xW_Su<P;G;fZeN8
z2yYSbK>+K$_4?It$w>N}v*jzbS95KzJkfnPu2uA*_BNZpXkAa?)Qo}~aY~_HJIuC$
z$M-;Nji^Uk%~mafuP0pL%0|s8qOXG|0c(1itI&gwjF2XAHeOE(|H8FtiAiVR$nB-y
zv?3=|;X6PN94w+_L|!_hH^}X4$JU5>98Hsj=1aO+ZPKKK7RfHo#%t-}#lYn45tT)&
zT;_yfyX+gn1!SU%Xi-}a-eqk<gm0VUUH8blpXbqCLexW5kpDdWolYy6-du5C2`5w6
z<4^$0t at A6{a2fVt2BmOh@{9?xs47}{tyk-M`S2nu at A#)u-lKFzUI6EHcNZ%j`lW2<
z3Ghc0hote++w&sw5-v+c(dq7lo?RkC at cwXP9M(szcw$*^z2ui3aLz at i!zZZKA-B%n
z2u^{zzT&D|z0A$-#UtG{8XHqNEV{{=wg0*?T*j-S)15^)rc^72Jn`_56Th7&zwkI&
zuLVCvlqXzn>+Rb&b`4E;A9U)g!`7Renb7N#P6SuKF~N0+3(nW1Q_?rth{q(^fk#;c
z4%>ZI_knwv5GT(|67YkE-k8YKpP!d^R&&gbSjWx3B at Bwp+>d!hOHl6^{`6w;hfGGe
zoL59=VE)X^XkvYWYfnVXTPEHaeHrmDn+WeJ^TQRvsApZ-{WamUg??C=P<<x|_i3in
z5c6C=d=B?R?%E&i-KmLSfN{n%@4hAqSMUtqqz^4fsLq?xcerX`=EL?L`=h=6adI7e
zwl_Ii8Dq;GqMBC(UtgakXTTLOax`>mgATljg$tF9_Y>M4%zb`3^%PC=)H>`}r8$hA
zEhBifp<|&M^g$z&6bj5suvLUQdA^rv4et{=gEwzb#ane+(S1a~=i at ngY+CgTQy<IB
z?tb-h&n~Sx$bcNJjPPn5!A(>L<kF~1$s0#!IOF2uownDu=gkb?@3h2k&7)a=7ZlMs
z_Tmi^hCv-*g7tDB9?}r96*k0H(HB?;HigJW0~b!d8}f9(gW%MK_w>)m?i9VC_}xq}
z2=o2H8zdfIMSLCC>SE*#gAeq?-w`s|eh_>tf18!(U*!mlF1#nstRT4HvApQBG#~Zu
zdzmE(GbH+iO3CTafY|hoo#3yR#Y(#JNIo!f4iZJiXqEGT&^EqUXk%Lt<9&y-5&n0?
zF#~0za|y4`Q{d)0vGO`>=cy at SyGZW)(%6nNoYT)Pd8)v*Y0)azvap=7{qU_9ETs~)
z$S36FkA}d<7sM#GB!*7!uR5Q?n2DeF3N8J;_qChd;K^FGP=oOuch9WK^y4g4BQLci
zj=$=waNAm?+wQa94d2oPJr|!=^#r|E<K2?)<kO&OEMBZx8r$ijP~UE8Vds^loX&gr
zey;60JC};=*c$szX94+*nxRTE$59W9k9>C}YL}jNg+KFG*P&20eruzvfEljhPtY~=
z*ce0CPO1WH&n1y+LRj?Ka6^|$R2VwTbKM^Btjt~rPTS~Q)F9gLDv#IPdp2~|y at SFX
ze#Ou1=NSZfZpETjp0O``^tsUeyi8hkeW&VEzjV~{d$6drM;}XSI%!6qdrNoixHhNu
zh%}hQwf(A)E0TiTY at Lr&lBCl39oV4KRbyM)A*Wu&7WjF;LWkV<O~|A&Y?pMUQ+-_2
zuSQLIv*RaUv15|=c{<XmMWO718?^S`a|?la30`-vl&#L(xp3BK1?st(g}uJOAhVI%
zJNle((xf6`zpwt;S(LeBi}QEns(cn#d)N5d#ij2B{{x%>eCR?e8x6pSn1B)a5ce#^
z_DO<=4AvrM_AGpk^W1wJDoVEAQD6+6RsRC5txts?<#<3XW$xUE^(+rtt-sBY<LQ5W
zmmF(h6(#08R^aJ>wD)8v`|iPx{mi%jdkq?W&LQ_JM;+$5&`EEByOq?h?k8Be(EX_I
zrIwoTPH^ouypxOX;hk8bbJ1S=Xaz@`S-6lr`W)*xRo+>kD at PpS6zWmVLoD$)d|CfZ
zF2Q>G*xeU6nWN95wwQ~vl*|E_nQpcBd)AAeA at fCd7y4X;Uc1vhvZ3Z~DRO&i6IS_K
z>8z$wjGt<5-<^e6qtl<(`HJXw8Dq?2QB^PJ-&sh;)YH0{^o}byHhc70tyrXruhl&d
zzKR74XPqhHnlg8WvhO`7T<XC%e*RSEXhl5U1xpJ)s(qssTCD4 at RQH${$|NTjDS3uZ
zrK8V1zwbvqI0I0BE8+7_eJ1$$>4}b+s0BMRYGUsiEdrjnpRVA^yJVQ}C2jY)X^<23
zgnN>#*AEUZda|eZY3=V7z(pTCKZ_|pzmTbbetMREg9%- at kC)C%Zz>Qb`WA(1?;T`0
zV=r_mVlRL<zq3=ptKu2 at cZbKurgVKWTE1wwyJ(^Ix-h)fdFZXS2hTh|=T7Ltr at Zff
zp$@e|ZFkC^FL+QAz71>p4%z4nvwwg3=_l_k<bDU6*>bNGHBr-_&ilRih5YW7q1xqg
z(+AFXWAffH*pDw2&i9E;>e%<Ed&_wSdwPG3>eHe5q1w9 at -~wBx(hSXGEnCW2u+)<y
zIL={^j8naIdp*Isqi%5!d~Od=fBP3w<MU}?WG~-llC;yHqk{u?!WO$8buh~sphJ;;
zBnC|8o?z9I#09UD>$!UceAHrFO4TY-Za<>gT&)h>pNV-7Uu)gS(F7Z_95LFIh0~c2
z6WS!FG{>03z2n!UaE}T4kU#7?C5w?qz#fU2 at 9le^vpjXYYz!L@>|(;tPE+4s3j(;u
zmd`VNnQeF~TQ_Ct30_l|26jOv{Nz9Lj9r=bqTu5Z_?~V2T*8zsR5RbxvzZCNNgZMD
zKt8KjP=tGRpOSfWeWI7`)#@`X+V)`B3S=!AX-ZH at 4G9+|k0kt-Ki=niNfK%yi?u$8
zqc5Y1a`~T at uy$w96Gr<T={Q751d7a_;K>Cy;@frM(U*pAcjZtP?)OZ(BgYRl?@-?;
z$FH2o7}^$<^m0B`<eASpo+S=4E-s%p#gXAEWb2vYpjVm{z(@fP^P93m!suVGb(Ke7
zn%O|ByALvzLy50JNA<+_lsBLwNYl^Ym=*7@{gh7et)SI6%;EWYY;rF_<-o7V!waRK
zamfO5q)EBA6^5WA;tyAR;(V8Dv1j8Rg$&MJKb6*jqsh2-hJB~w9%FG}ztqJf#_ at 6N
z0{5!d6g>wWrA(oqlBaL)8Tgf4JLnf?0>{#1CdX>k)E30@!};-flUdurUs3~|u~w9X
zn2w9Aaf|ppS>Qam4*#u$$YInxi(+m|kiY16U|S#L*ns;o=P_SkDqM%6l}<fy6;{X<
z^RgK{{evZW0kGlMbN>z5r-dI?Nf*(YyZ|j~kg#$*I&7+d&uf05BF}$gUHGNJZ1TM9
zpP(<zcP2omEfVkr?R1KBAK at km?6uS2RZS46W}>f9cN$pD!0Dvl$T4n3w36%>mGPk?
zJ`m*vMJwM)dZ4=T?{Ep)(k;y(&mPzTAMlgNoeaZ$GCcQLIo97dJ^fAgqyFxS`PbKn
zeFT}F!;?LT%nQJnvEu)1`Vwl|TL-J?X>*DkvbOskJp_Jb*3Q^X&?UZZ7S22c*{tc*
z3XWY&0c$GZdGy*1d!kqHuB5?d6|!YyNyw1vR03+O3eH5Cx~}?OAXrYH at AK*0h)+v6
znmii*J+XHj4IEm$l}QTQr_#R0 at 7BNlLS6tFSHQ$TKOxUc&O>eZ3%)v9?b?-KBmI##
z8SgzaNQh_2r%%sc?_A|QhB?8pO43=Pwg-?Cz4RbC-f7h?puou>l>|DOGxQYcBdb$z
z-q-YLysOEtt?Z5?9OcB`Zb9tzT3wv-tcv6Y!e_l@<T$-b(haVlm$*lLt&VpKZfGYk
zl^7dEUAw4ytjAV|6ucx?ptBn?cdl3?5^LXo!LTCn#uwpYUgd*yGH(Xb>4Jgl^zRt!
zr0*5pcTx~Mgns+uo|?NVUf)~jJ31eHG&X6HpjK)?drt at gnDHytJv=Y=?Bx%cw*?BG
zo{mJE;*axV<k?3({B0)KS-{;O2BMT4-O*bSu<hg09Fo@)xDqwB_anDjWzGrNQm%NY
z^DLfR_TIKD-BsXJ%>-|&Fz%=SxWe*uJD>|)Xjggkp-5Jq?tb(;;TO78;Z^M_(UQ20
zc?m%bPfcf(%RSFjD_B6M&}xT95KgCLFJR?h^m at KmOnIfYr+UZ7b5d#5;4R>k_h=?;
ziA7xJ9-i+8!E<akd*<ppb|0!RWD7gcp at Dx?J+fpiaA_wJuXTqXVv3<BrL%W88lpw^
z!yGc#bS`U`ka?&RS?Hg9r_<1hXs7E?LaWQ_gP7eT?=%%Ra3~{7PD2ND$FWvqcPBik
zkiRnAEq35uYlpK-cLeh+%T+hJ!<dRVB7+6CQpMM(vyI%-G|dEF#Vd`#u*i%?mYP at e
zfY?LeLnrM_7^Z9ReBeZM?!XvH at 93o#(foXRMJoEa-mZrokRYgTLrj0L%+o(=V*j?e
z1=R!BIxJK~M;rAjIBp+-jCvpPBm(||R~IQ0%{1|c4uKbj#YDzj5{#q4zaOZuTNqDG
zYt;9i)C8V2*a(TxeZrj?!{eu>2>9?PC4<k(X+Nw{Gst_?4NckUTh%!fTlYgId|Q+3
z<sBK!tFR}Fv?_m9bRPUrVg`OHTw{7>GHXk{5puSOsbfsY9yQCAdp58esdKcfe_dDx
zxhJ?ZjmOJ7)Xbu_1Hg!BvX7#!M^W6W|7;GELH?<;j|TFo`{12Awbs^hsH28?b*2{e
z02HnVamYz&5%I!+VKS{9k)#Lmf%B}zI#K}qWy)YRFvA#+z at zVCl5qW3mtMS)9Hv&z
zT`~V$CU`1O!KZejqm6l${u|Z^DSQJg_o;XPD-{J^_U at OSW<Ee49^?+dcildA>>D^%
zHuD%g&RN8dcYbxohly}l_AL3Ixe}+Cqw;mr<B%T)4#+?)WR*&qM8i)GKIwCBFGGCr
zzWW0Br+>lcSnnXS0CS~Yr1JYjo??I8``!0|JjE{w|DT2r{71r7El`?E)AEp~bDwO9
z4-2_QzA+arw at Q;fo@|>3U)#7;z9DGS4Dbs*9%-Cff$b#s$MTfRIr5a>7xoUO{W~zv
zeJ=T_mpiV!3%^)7V(~Lyu2}jm at sSfAiGka&{Y~IDDo0G#MSSbMq3;=pe>5R0;&I_u
zZWo;&@wzY?+X8&@+%D)nrQCLme;vNd$ag9DuGsCgm|aBginy3y$UaKqP4-~MfRE8G
zW2}gkDtmh*yYXT0kqB~tW2+sg0-jMw&UJ{{GaS3vZL~Q1{#sjuX|u_w-duz>9GL?Q
zD?V~I*HO)W)UgjAEk3zuYmh{YYwf}(vo~Cl(dSq83yGy&p}*`zE>~%C6p6`Nze3;c
zgYR)u@&r8p!8k*Ey!AQnKHra%+1`CWM_FI+?(;j9Jkz_c#bJHMyU*u%@*MBJE|E3V
zyKmwhPmOc*XKT2p#yRdmo%Pf>$2~e2PmOaee2*8Br+UxrSZpQl9LM?2O`bls at 2+*O
zci&%@d3=;Ax19J`1$^oK&3VR>&B&QEeZ~eyA3k{vNt>qP{eFSZ27Eq8ov*tM$(!b|
zkJI<?={3AyA7-xL(~Hk_e6Hbh6QBR!^9w#VFs4uwY}>59{1?~Y`}>IXe*j;?Ns at aE
zEZP?yELuLWZ2`8xbu(-W);)o- at x3*89r2$IBW_=d+|^;bl6w at m6uoZ|oi)fxXeC?!
zc3K@<SgIB;<MaamDQ5`B3BU0-NqWa2NP$PCZ)z(=M(}yRsomv26#ZDb3*6xP%n$wF
zj9n>>4AV%L6{vh$VjdH&(^gYM<Ug%?yagO_q?Qp`FJ0h?%<#Erw|Ka&a%TF_Dksx1
zjjHPkru4!YU+Y&5K+<sh-we9V%N$k4-0IrO8$91M6M2)m at Hh?hD0TeGuC2n)1h#JI
zb;9J-mA)2Q<?4 at tjnpL~{|^PHt{j0ctE`y#^64#-qxAcKx~F31bXwK$c1RlG*zzCe
zP{$rBRqwh=D+hOL#UTdN9DFlOL1)foMBUMkISZqoOl_udPr+8w242x=m9!hrc{NVc
zVCtx349M-%$2{g)=V2=jSEMSiMz^Am+n8mDJ at WPM>x^+}{8+(O;Xk}>mMMf2zt+dg
z2sf~YKY=RP$=ivVIMAD$HNeFp79E8=xu&{5 at flQd%vjsR(ocW|HeCJ=m^E-OAhu4U
zR$Jou$xTugiKD3*G0_XhU$@s|z5b4K!^5*$>*1Toj5K!6#5Jl2&jf5C{dI6^qs}2C
zDtyh>b3_p5EFrZC7iow;sM|u$2@^{{1h?x-a76DK-Qzunv$4C1a8rcIoCgH4&N#%S
zP%F)s;7p1ZzlV21;^D-fi~54ljRK!40Pn^cQSv6AwqN6_z{~j3$T;%-OfU5)jx!7o
zhJHH at xcb9&JiSAKoOmV1s4}?vmyM%Avt+0>ne_eLP){v}h!Er?83nb-*HE^NLf-X|
ze5NZq at f-S(&kuyx0{pbANS`7v4#!NBxrJTB)UTfW5!FlcLZ at QCs%<n>IWis?&tFKa
z134R8QJWRD72xkjzEHt6+ at EZJ_iPiF)sFrCuQy+x;4PN(aI8|$<dB~;!|td{eFywE
zf{~!W{UbrrlZ<&bYKNibH|n$wAT~zY4FBv8k%m*t{#RQKf(YhQ?%WtdlUPBa_Fwhl
zmL5Ifx?xUB)Z>$I%>d{N_)Vi<NSn@;+llW(%h!QpPKJF-X%aB_;9|UIToDXBBprM9
z{08{^|I|;Uk1o~!`M$xXW&Pw?2aiKu92HEX#?z|u(S%`15WO|?Xp53D_Gq at 2#!rp?
z#r}mfiJ1ty?Sr1W`4(QEeVX)m+?4R5cvbjs?W&=^o~DVV at k6ou?Ws%yeT2ClzbZ0O
zz8PFSJ4W90#u33CFzx!haLM>VhcZ}cHC}%-Jo{|5w#dJ1#ek at 3c3%0t6=zNN979_Y
zwWk#eSi16iShrVhIY%{_QifW$oXZSiZNc+QgO3#a->|)x(D6)RFB8b3ft{Ma9QnTE
z1O0k?0;%4?K;IDlKn1WQ$GawAtfqZu2Zw11YUG^;PFw>%&zdhTEuRRCG>K_HabCt4
z2 at eSHF(y)vK_P){Gza!c+6cG|nWVtxdLy?P`K*4>HEB2DQ;g(%>8p24tM7>+wwBIc
z?<g4!3Z3ElJajtAVX8Y5GW~y at Tll}vbw`7fif}X*z&6l3(jT5%-y;C$WJ<?KAmm0;
zLbdyEf=cF1xvDW_QJ(8_?QJS8Os!Cb at WIQmYa|JL=`p=!(%<RnQQdJ at b){YHRJHK(
zBonDEaX!iYH;lI)U^61uE8(B0Y5V2%pLz}nF7m8{xq at _h=P~f at GR3p<T&H at q(%*B{
z(&jTZ3OYH#TnrS3tRmQ(CAFk3Y;K0Axx>aRShD1XJ{&mwGb&~Q;aC#LN0Nb0>N{g*
z7R0rlLtZUo<gW at aI+S?tpOfog{;wi-h8y)ofHTv!-A(|H0BYr&nm^M$BhKn?pi8pT
zp=&oV5fTFeuq)w%D1?8)5PxxIrbE+c=5AurQ{^s-dyOgSg^w6qJ<(c4fPoSFSr`@d
zsGz;gMcRUR<`URL<B%71y0>2Xdx0vTYRLotZp3kB2wNvv;)ir!d*)K|ptb8Fm4$r0
z?#}$9Wx`hfQsi;{eX;`ipatLn<2y^ZCzzhx8U~nnX)>*m-T)@1ntQ^veua%P(C08d
zkV{mr<8_~r;rDay$GK_XWLFUGNsqh(_b6hHeDo{Yv7!|m&-u*JT(f_3mkD*%%xDYd
zaXe}(oc|=^lHknXZ|FnR{vGGpKP}gFioOt)*>#oKIo7VKgo5MxwKnH3oB at eA_Ywc*
z6)Ng>f|;J4&_LA!qxu_LM}I;;$NTLA8CC5-ELc%L)Gtt=O+!4_JFpeIDw&&;CH~b8
zC2$~_{uWx)UlNWO6tLkzPbdV2OC|Oy)N(F9e~2-%@{k`{K#oBks$xzNt(;Rscen at X
zs;FAW)!o1<Ge$upV)7#QV6Ka5_BoF@^Eu?{Ji~L<>)g|UKbcivTVm#>@npATQj at m*
z1>%Q7-Uo65^zIqlf8w2sux=qfLDzZWLnVLkb+ktOAUG2<u2V1Bl{+D*S!)h01 at 2}x
zokm&cb8dg`XOtzujAuVGWX3)Al4k_g`~&V<&ofp7YXHuR at g|||5t3_aM=eMF=BpTY
zs3D2mOi8mD&tY|~r<J&O2Q7CzceWJxjO&|!kfwh$zUm9szOwqI@%={;w=H!71B>ew
z at w<3caSEK*5+$UsGKEAo3mYD(1AZz?*x+BosQe^?R&x-1wdt4jg9nh4t-$|f$fY)W
zI4K*Pg|n*ubl<w&iTJO)ONHxz`+_4GtKEv6Yk6w$Y3_-rWAs(2iE{z#P^!StcG6yo
ze0&42+>++y at H<8jU4i7YHW*Vi?ipLNV!Ofb^GjFFU`>~j%0fK4YO$=l4D#h5Q|%|&
zu`AP<whP!+rJn?R8OF{AwB=%yki1J;<1ccEVkH-Hq*uISJgU-hm6vlI<2s>%zCZ_;
z|ExVNu^@hVuT#a$)}G!?>WrDt_Xo7?XYgJtz#8Pffw;KI2eo(74idXml7aQZm=G^{
zwD&dX at 6bn$!U>2kO!BY9yxN_+lWAsbz{e^p2IH&EgTTpD3$q?A5?INYLfvA0RQvME
zwmaJ2W}r?RHJg)7xjVllW1RQfY8g-cPmC$t|Dd*gKkgs>s$E0m3C61y*qoAx&jn|Y
z`%>-y5`McKB}_@|lld9iiR?1?A#WkpQNv{T8NMmVG;S^Mt#nM=JwLg`y)^k5p6RrT
z2L6~v-n`W1(@ta;#y1BtV2(9ERfiAw8O|se<ftKs1oL`(YfN{ip7}6$MBBXM{feuw
z)z5X^rmEliLHCRBKFhpff9x-vGUQKcr1J`f{nWX&ie?AihqhI8Bv+hi%oS^mZ~b8I
zlcy9;BkS3Yw(<o#rsX`#or}EPA>7+UVwa4*!^F(X{8$nmE{A;jR+0|C?GfO>cVV1Z
z at vao3I;xv~hR7w){4gYZOXj~jlDsF(jZeJuuOc at Wb<A>azhHbbz%+;W2EM#Lk_5cc
z+XPFK at D}0X-UIGrd{6XzFN>CWw;b?sLx27eIr)eFSZ{zgkGtyMjj{8~<-AOhFl!Ec
zk-&LrCHK5~)X+QZUBKWJv4NXI9I_5_rvO`#c<16u at V7OPckR`wz_VQJ9RuUdf?BfQ
z)y>^T{`0KOpMcjcef2ck3rTEXkaqzmbPo7Wt#q76#)~22zgcdi74&Zj`U`7F8-yx;
z*<xW&nYW%f>Wh<S0``pj7t;RX=X$e5#2rShQ`tZTWCY0*=3yN^1g_&sZ1+NUEy1=D
z`6DZbtxqgRjHQxQL+Kr_0MEH76EPuRIn|VZ*cRYB*14mRpZssuR|F$SJuXlojtU<R
z;ppw#uX>(bS5WP`6R2_-Soy${7PzCAwnOF-`GVZi<Y~C>Yfaw)J1I$4*^xtmx<4|f
z<)dj%6JJSk6=2uT#JH{p<{_PM{rOpvra7&ArF9-lOMZht8!_4VKaTab1NzBCq3+2_
z)K3p1_0uie;0IRGhJ<orFLmn~)yS|sW$6{%ztX{pt@=UMFAlFmTf)Kb6DAD`4#4*}
zfRV^yyB%*hEioiV?G3VzCvVYw|6Y_5^W>15C(L at X0{2>u{GAeDB>TyCY;R%vHmgW#
zB>Tv3Rz1;o{OjP;nv1%q>49^Ldf at LjrAm0Hl*4WyygTdL{e_M)+TDqIxqP{k$S+|0
z{i=W!(>q>w^Ki|jWA`9ia*ub;z>fvreJOtH;G_8vyjsWMFYX6^+sP5Q-vy={m^at^
z0wt*h9GURc8sLAHxTDV_r;PM9v5(ema25%2fVobcI|0`O<~j2{^1kq$g*@LPf$ZV4
zH(9*jy?xC68uk-%Gmn0WvF**VdHBxB7%GFm?re<A-Ekgc3A}S;eE17AF7T)U- at M9w
zoUKExD*4$W`!F>DZJ#H|1;?k#%Ue#yr?xN at HCvX{`kZengCAG%jVz|yk=E9YG5ZD9
z4w6qYi#r26Aa&F{N3rXO_H<b(k<S=&H>GV%g|?kqfPIz~Hmt#>gBH%)zLOpI;LB3D
zdOd9yOZD*KWCG8b&hdc`+JWbRj6-{GvhrLFoG4QFRO;bV{Y{Gh>-($1?&BTRVI1eV
z26iZQyP{S0!_XTJEzJZ at G3$?gRRl{xat(yj{4J;>YZIuEzX!h|{JO2I{p7pz0Kb{!
z58)it){G9<g-!l?4z7*+)KQht!=y`J=)W4?h}eIbC-(oRnkxR5yR~e6X9M)_d%6nn
z%@}Aga&6Uq45<U!`K`0Uj_;%&*ac{>liUx_RYO&iXNw*@Tg?5ssg%q!aCpM6NdAxY
z6Js4izaI3lIZOE)``-lL5LwrX$-2e~11H3F*FU&l*}=>29ZR#rrQi^Ey^k0V;t${k
zOaoWQkffVn+!32&(R`v4LKe$TmU52sH0@*WkJahVb%>}yM;frR&+um4lku*;ren?!
z%q)0Hs)fCe=L#cy%}Wm=e?T4E*<4NLjvp|e)J<%??d@>I64?Sj<Id2j_l&d-G5w7K
z3!MVq4fWXjl}gQ=3(gwwhS|LDm~uOwaUJ2l0-mn(sQqhOVxfPJb9G`&vD8vMu*gPy
zJnI|UU&`J;CbxHDTi-7a7b9Mq1|213coJ+dubs3rMm~RA at RhWmU@L(u3;xFAbQ(`H
zsw1^Rm)Hb~6Q+VzD$=JFw%96<o;cvu6G;r3tlPVTlSGwSLh&RkWMIWCnOICXe1Y%B
zm~>X!YnUf`t$Utl<*E)r&Q|bi`-QMSh+KK17u>$k)iF2b=xLGDOvY1~Y#<eSGIaQC
z5wQvIZYqh6h_=+gzMJUN<-Q?Y%r}j_XN&j!dTf-Vu(cpN;OkycZ*&M5aJjtm8Dzi`
z+~-s77ZIj4arH*dV8o?0D>-_$4KZ~c_N~Ph_|i3N$oxRQHEOURzp@(mllL4`VWZ8U
z8|VV*74Fl(Mf?gmwl%vaT87-{q)&a&SMLUpeEmC47xxQ$34G;cu*Z_X{c6H{ju&Rx
zV;LXn0<(Z>qw|<O@}!S1(XEh0^9A5QvDZWk?WSDQ_>%aM2<4hMj)krAv`g=Bd)fuP
zowQ3}bm*GQoJ)9zGoz{|=ATWGDyj5<_o9p~`QSHBTK8SFs_98qqg#aauV0?DG4|b*
zT>c_?ci~hmdB at C2^xYBgqaTco_3%@E68JT0a_2yA8gI=)J1v}A7x)M8Z2z>IxR=UM
zcX7`rKGi>fllF<F<bTKq<kPr%ITLV=g`R6Xg_v|Yk#WFav=LcG)?RO&Wvq3Xkd-P%
zMPxcY-DI2#YM at 6HqK`8p`TzXXTc<u(^-XE=bKc`O=acPB1D)lWD+lr3$U5}D*Q0#2
zaT9n2I>)vrvE4CKPw$O3%ukU<avikc;%B>ql4n<ka_4~CzM3&(-WPJfF^U)kmvd?N
zypI=DPycvs^;C}xy^jAqYYeHQ?Qf8$evdk#jF|J0zYNddogX$Y-z<DvSHPj_9bYFR
zzFiYBaC^Plt?p&^yejw!z6Cw{^O8H8aD{vN;(NU3S4T~$a(9qmNQzox<ML2{tnQ;s
zx5lTXzE{x3H2AbP>a^mr(x?XG&#9%>L+iUD`Rij5PdN;ED9O#l^Y_>@m}|-P;u_Ra
zFotQ|-(cTuPfd&V*jL4hden<AyuwnrZ>(=C3#9Yf;13)57=EjdLoPNnJe&`m+KBQs
z5mXHgz7;KE2x}%WjNm7?8nSBd(sJlPy4VX&Ijx`nRevG!;oo7@)LcB*V}cg<9B^qw
zda*^U!`Sb{{&8f#AkC9k{wz2tjL{tztg|zNFRtMTnrS{b7Fr3%g0mR!@Xctg9eEEQ
zqOK~&&=#!cZD at z`ENaj0nFu~!)Sty%$wIka9Yze9D=&HG%5HhmC+|d0CUfOj4aU9!
zW8cu1Z?8bCx9pjzk$l_dM5iME!`5xqEtsj1F2Vf*xMz-=Ion|ydgn?7Fiz=Ha$Vpm
ziR9N#(HXS8)ZwwUJfKhg&RxDDer5a39y7i_;1}R~H+-Ii-{4i$)K=_Cimrk at IlJ^H
z$M+a(^MSXOlfE1 at p<iyZ(rLY;H_~{Y+w>pShj)!aF>4MmrEf+%&d!W(KFj8a(a%GX
z{7V14BvuHKFXTP;$e`0*aCAoUQP4gyD(Sj8OmpJkn2b9 at -)g(ow@>&9;aH4~b&6I8
zSf$=R&n)$64>qlNJTh@#x3p+%?iP_ch#ZyF(gl5}z=r&YA=Ja1;4Il7!FsaTiG1xR
z-o_j*A$p5v{;u-O-(=L;HnNhC%K*L{GLPBK=;O?Kmpmn6Gx`zS7%>J%8+114X5a#=
z1TRJ at bg8;fB{}Byb<`Q(DO5!PJMs5&=wj8ZTyW;J<DTz1&Ez+@!yq?Yy#kVNf!gOC
zJMpewBYgm#DYdJCaQG7)4SI~BQx3n}1&@C9M92*At&;XIp;eBJz;Eo2tupQO$OOXe
zvfQIfZo)YVTt^`_;a%!spF!4de4g|HMo})&&#usWUh?Q at PD<`r93T60rj8#SBTWxe
z$282JHk at iVQ+}#K$`Z&1mcG?5+f!dXkY`1$nsn&Xl3#7uZi1eqs5I=UPRn4y#_sTb
z??jCU3GAJ8$Bu{pZ^ayZ`2QyO+6lf2|4)D|l;v87yoB(mhT*j6Tj1xN0691jwh^ht
zmvX-_0sM*cJBbg;J(zGI%7?xR+~Q%X*1 at Sj-LxlN(N?=o_Z+)$^=w-Oa?YZb#QA4B
z(rx98QlfoxeE#&PSYi)|5lf|wA;%*V6~(|yS&_4qGISZXx;R(JG&{`9Qd)`p?}@Sd
zyK>^>G;$31Lp*sr*Bz5vDat@!aF+ZB{(?r#o5La_vx^FgSBk{o42EBh_~gdq-qXJ6
zj(gA{I0CCfjhX`B0BcbXUR#{kQw}{WeX+Wyh`k5z#x`gJ&*>g;QC0_K#u|QY0VhU9
zj~VuiKFAVl`0wFC at U^Vy6Y4%7J{~7N&rVhkR{FFLGORsxv*Rh(z+^dH>6jtC;?wRL
zh*yA at rlrjl5^=1QbBgQ-M(4opM4xuZTvL?{`1=B`p48j}x5NXCHIjpT3%cd+_G6eo
zilibOUxFH-#jyX?)Q`~X&$FAn=d$*avBfGuTs{!{7X;ZV`;tw_Un!3*{W+bCTlg66
z;#zkGD?hSW6>+t&um0m!<Jcc at PC*>uUAa3l4&T4WzB92(on9rUB&!2<Cw^2kc6`6*
z`0sH{zUTM{V{M&|>rS>?J#G96*YzG3_{VY6QSU at YEyvn(9R3(lLOXd6O?t at pNW>bJ
z|2ftGKbIwbOJ0IE)&Ti+mvGgR`ccps&%s9Y`1W`%@X~qLwOZnbA^0}vtZL}2x=CB6
zzJ>FapkF4^mia0D`j5vWX0OJ)UF6i;eJB>@U!+jSFVW_#FXPtXIOP4Gc?t2=SBVV+
zT%p|km!R{v^&B6xPldSIu;h3`wZui{bATH9V;X$BU%F>_{JO7u{8s7SHWJ&vh41lE
zsJzeNXrpF3PEq%`ukc(y$l_d%H~ydP-a2)e)QCQug!8xj|8KkdFW at 30+>0X8ZrE>-
zKlZ`Z)2gI`VKUy$>jl+_a~-JKn_E4ngm3Pbgtx+`DUIXDKjWV0tv4{Ubfh-+j_~}k
zBMvcaX|aDD<bzaj(Hz<#rgG!0&V!S+RF&gP)IQFK9(P#kPJ0sZ$^)6%XYfCcIRj4Y
zDqvbq%n~Ah>Tt!NNX*owp(Yx+PT=LS>l`BO7 at 5}y8-mC<wDbP|vz;dR15SF|`ToGe
zc5<I>`Oil`SE`PYT-xP?Hv~RV>5dcbb!jI&?b$`zGxlG#_di!7+EF~#{<^XD_l&jQ
zbG-MsxGGv_9`rnKt+UGW{LZm<*E>r+zb}pbZty+_u{T1ej>(oyxW7lX<fTY`7=5m|
z0KD(xiG28SOumRb@?|&VOU+>2n0&DXWk9~1^2ir(SUd?Hl4th><zdY^9Baq}xAk5k
z3ufapS8AA|flqb{kqfXnRL2XU0|s*rW at 4X5F63iP^c)j(!8wFD8|v44_p>@Z9EvyK
z1C7DlJTq&1-rA{z|K?v<J5V1WS_!QCKG><=_g00zti-z&p2?tcS#N=>sbnNsAjiE<
zNkwTFi7c`2f}Rkw$maYO7_Bm5%RAxcK-(%E9+}|G5Ki)~6DW!7aRo!JoL`+HG)60R
zZsa4Df?FcywTnHLpl_j55t&zv7)}P>W1jnwv^=TabDam|IUk-g6z)A|>3j44I#>>V
zlc%B22a|i_+6&lX$cKNCylT>K6=j^e<}&mPu0x)2cOqma_{#k1*+SUY<XE-eVV`R9
zj3TsoBpJ^oOuHyOi0l3ic{LI7BC>{e!#22t at o*0IxzSPYvGJMcv;BL+-QIDz>a&OA
za>ADT=F4 at HmR#O~&vybDIbK at GIwdW_+Fp2GN$rJ?>?V8=WWR}ZL2C5uQ#oDW%S5e3
zzedzHFmzNqd-2=SVWQ5k3yzxMFE5U^LSAZ|^?~40dqPebF~@d678zLL0V7L`Hp%Sz
zz#L~;pv-9|=d#rUX4LjEMcc`}bY%eyaDT-2DH{-jR~&20fQkj31T_unoI2=87uZGz
zhr~4D-z$izavWz{9URmUqetciBL6OA$m0*caJn+$b-|h2x3sqp8i2J&43k>AUMbGV
z6ob<^spvD{S}h4G*VptkaPUm?*t<gLgx$>hekGpV;#_d}H at Ecy2XOHGbSf|AkvNe<
z!WMS!clUGh>5Y!m+)`$`#Bg4L*p7|XcdF9MwzdO3tEOJ28`{V=f<7Yc^J%9m=~Q0Q
zH!A3^zDzc*N&Xwhh~NXkdXMjqGD3WR7?T55m9q=}l at egaZu^yjLt}JDkvli7NIH*Y
zbwA3P-BM0Zm0Dombc at 7$4$&>}gS5bhlO>(Y5=o2cM)wrDQCh|grYk#j6~){y&BQMF
zJ3EI#jCDAM^>-2{asF#e|1G3{=k=YznuPU(!~)Z4e#Bm)8_^?Ca{6jsie?D$aS|K-
z9Nc1RzdE0v7{q80JN_B#+?a2KTpu~)EUX{1xUUVF$KoCO=oRkINIrCk@*Z?vdo9Lt
z7QYhwH8Ov2Tsrl at 7T6YoZ*5y%+YLcw6XBbNzsur3R`b9st4JQ{e6lVOec88?K7d?;
z48+bjkVB{onpdEEPT1gUj<43;=(x=k02?fdzT|t1E}=wpC-g;K{$%ZK|KrHnyT#fI
zol!1Iem4ZUdq<py5R0npsAlS8ocWXCOEJf-$`3%Ff6mGg?Rs}MeXL_C!5|~wT=#kr
zbNi9)E9Qg4rVc*8THOB?$VDRSPP+Sp7;xrZByAr}O0eO-MbT&NnkWlh8OfJCKiG)%
z9<^0RjX?~PPQIgNgQvd4&o*~|U?Fff26iR=`tHO6vEP2QH7!0K*Gfuwo%0O*G^nLc
zTRrmdzqIXa-Rdb;o6k9G1S>;qfo)U8?Hte$>>-EdAtuhQOb};Uaqc|Nxya#5XtG;@
zF+q%r=!1R-5Nq_uwzN;p`wNcy at w}R`kvy+diFaM-EXKOY0k-j8zbagTni6=%PK(nj
z%zCyedVdrA1Z0le%e?Z>wJj~rwJ$!?6^t=3v8x90J=F)`rXOFrxVfhYvin?g&vEnO
z=I(lY4~p(NTMN0koScikhkf&;X-6L912_SppO)^(b4fkdgRF#%TjGeIjMANyah5!@
z5d0H!iB2lm1nj;B^}2{&`jp5VuasVi-`wU}k&6AgvHek={jT_}WBbJzLqm|QWXvF6
zZJwO?Wc#m%?Sl_z0#%N8QV at hO)hX6x+0|4Ss~$3!1KSDu=&w28MC3XxT!()ctreEV
z$arD)yxoa-UMji{y4nPcvGm}ndb3-^nHQOuTgZbSNoVkI-ODm9(e3W at 0qULL{a`nD
zHaZJeRW~*ee)@U$(Vk7X&qNY4h%<O>1YodeF0MJzHGt<0i<4&>1#Ovc`LyRHfU_{2
zeE{p at e#T5}%@^0<d at jy^iDyV4SZ+D|W?GN at dDN#J&xKriJXgNYF|jdo-Cquc%cR|b
zqp%S##>hL5xcY;eb46NJrVY=_jne7FTGe<Te1FN)uRf&z23+x<j`d%w{otsYS|(I&
zvGCQpLh}CNsxp_P<>e)C4x*N}6n(eXZWB~PM=fc)C$Kd%$dl;5L)W;GbQm!&p-4>D
zu=wi6`%f#|GDv=8$0;iJF<E>p-P*0k8ulstTUY+jO_GVt<B30){z`0BM-1 at MPK@92
zB(D2wLGO42_`hoKe0yOBl><YD+7_&0a38K9H6)>zSOUQhRnSXyueDK+;#z+HO~?8S
z-#2{hhoD2iS4K??RSq5?ddGq_z*2J1XDX^3oOC{9-`u-o&JDMd at AJw%W2f}L*?(N4
z8uvbgF`WxttP*Q_zF=5{dJvS=(Wx^6gOGzY=4)IF_W%a>q&u3-g~c)*c>FM~%A7?y
zUC$y$HDOEWbaL&{1(-8=V|v$j9=$6I@`V}s7<w0}F>ojZoXfw~{GoRpf!?)??8}4w
zx3_xaW3=H6(Hlsc5R2FsI>oh*^&Qa}(B@*1k(G*hin{I4GmNYp@*Qid9Cli<vxw}2
zO_v|18O6LKww`$&na`vjg}P_WoKqF^fLHt^t(BZN8jAm(V?%#m_(W`{R_ at e?KH=0u
zzJR}zdUjy|#^iipWyELn(X!Ey=+U#pkMJzMqgLSPLb?jipUK=<|2}+UMev&;{>09O
zjxG{sz>lpDgfF^4Oy$6azY2Y|iB6L=5qn1aepzWi{+Lao;3-Euu>r{6HB^{`hqa-u
zzmU9>Fj-6$qjDB<K8Z}+a9Gk!;<j`9a8FT_g?xYJN%9 at _lfQ$%`AO(St#SO7!iRa1
z6OI2-Z8S_)J!J at 1O*B%fVQl|q at YFvf@jQ<|#p6>lk!w94OlrX}X1WnPR(G0u at SO1D
zAigQ<&V_w+$lgokffq%QOyWS;kFhr_l`(quDXAX+znDzc5{K(Ej>>tBoEu<6+q^z;
z=s!{mYhQm&*gnK4G<FLav#cCJ2CY0}5$Mnsj%Q37I&*+IN*O+e*bKO2;r~(LzYuVg
z$p@`0N$jj28ILdL2<aQTG&1p~Km6~=<#uM0^X~r@`+=#LR3gw}emyr6 at tsK)%*PPU
z1;!loI_WF4QAczJ<cW~}>%zJZ?26aECD;{emd|;2Bz)c`#N6;+c&<U{6Cqm=+p!UB
z3S#qC_aNs3#@HohfLj<hhFgFhQ5}=sq8iK!Ah?*@Omkp0?w3g)>&#+baFqG$O>4;3
z^L&CG7T}DOW*Nao_KpI-mBt{R?^@qw!!^OTFK9tMCXojRVnNI*3)nTpYsM2S{E>i6
z$fe8y5qTfUe_Y>l-OYcxZnwwZoW at gcga1FM+8aBhQ6C9-m#ica^neCG)SG+UOyXa(
zi20DEjz11R53oGCFl{xjRD1ESmgvjik$7&XA~<Pmtmf=a^y)$9OvH~I{3K#Ve8f-q
zB&Hde7}{oUSo~g3BY#!@C*k|N<MF-4;U|}<c(Hw|w+wx%@dxa}0U>xor7Xq3PL^yS
z9r|)6>_+JM-WVvUrwd$T9&{{HcYQXoRUiI_Ow$p3=C- at QJSqr2L9&$K4Up4Zh1eAI
zL=rpHoru1C7I9k=*BhC4K7-04b1y+DnM?ok_HPLUXUliFNNi4?8?0O&)pm`ui1<4&
z|GuY=ISQ8^bNoPJQxPYY^YD2GpD2O{A+>=wly)9M-KmQ&S8UIYcyW1L#K+5*y!_nu
z-4Rol$6zd001x`^z at c7+W@~S_=Ih=;&9=UM<=-(G%+8h?#@J+|jGEq|wZjU{MiK|=
z9i1A+Qb+u7A`3NCT3$Z5eNUSUHB_$XRQ_g>ignwko$QY`bjjlkPIH?J*J|wBU%r=c
zoNTX?ih8x01 at Jp8flp@%c$iQ(rZ8fIBDxC4SFP=bpEzUSx6M~*3tiz>_o+Wno{=#p
z!TbIy at QxPfF5e4?9`U;;&M$*q>y7jOPWJJtS~O?J;{1r2ln%%-AOC^)MmpystYLQ|
z6F#>RpDUBM!Ahe>SY+asCik20C5w=&rI#mF1f|L);BvwD6j$Nq at -oHw36!2Z*ZB#4
z_r|vU+)h_Xl+L&>bZVJm{Y9xeUfkv)+p*_A<<ky4WZT&Dx3;;UABwzO2dF!skrt5{
z2k at LXw#|p$$%QRdU8c~9k^8KoM0Qnn`!*Bl3#`A at Y{S|Uji_nnx`RGE0@?lpcLr=O
z`5-Xu at F(nrja?1jY9~G?cPB!J?7l*4eoU}g4J00e_q8KH<N7s8X*I-`MDo88d!F4B
zpGsCqGa%nJkgF5mvo?TRr+oQj7gxY{@faKPMQXg%wCOPeXOj=cMigTTG`s$Rc+z=!
zYC{P6a~J0$!aMpuScwl+QWL4^#A(O)6t-RCUV=|2v&u-~Gi06tZ-suwSjk3=^gP+d
zSRE=U{OT`z{5l1hlwpHP+9Mc_Ozb<0Id!NZeORQ~I7=fHZN3;>y?g~(&yHCTYb=?P
zgWt<^H$D5`GP-cw*3E4=t{MB^H1_rFF8^+Gix)dHY at E6Q+|n}yHstzhVZ&tWUV;oU
zfxl<J(B@|b7W38kYUg_%oDF!VhOL@^4;wYxwWf57XRgV3ils6pnbVH?RuB6~LHgue
z5uVZD$ZJa{eF)$47XkZ%G51au|4(0i7wzq<AM~DBd&CHEbL80>-TKM(AIei+`IIff
z{M!Zjo`G$q4zbCAa*V&50R^tI0K~`VzsRHq$m%U})vT!@b4JcUX28!&YTZXXd18W7
z-y1r$4)q30FBiDxa%VuE6gQf<GcX>oCESeH2XNhe;36Bvnsnb)rZw41RVv at xjyCE-
z at XA}wS`+YST`u5O9xuiCI){3=iSu7`lJ7sjS7yexd5YQ<7V>XToGf~ME at E|JTz3-Y
zkGTG(prrvZJ=i#>=|>$x`+z*@eGb-z-O!Ku^;4N{=y>NLGgO}VtvpK9lAr04K1L<7
zGEzkjC0ppYL$1--;6OgNPdjOAqfXE&ZNhaNEBMrNbZ+dz&TROJ at 918dEE>#W3(2+b
z2Fa6Beu{3!Gu^psoK at he+EB`z#X0v^@SS>cE%f0*a1E at 0o%I0UHJ-Se&OQu&f at O3g
z_%f2#=OA`{fV2;>IBT at 5sr-LpZo3oNa@Yusk^H(+au3LsJG!g0@}O7UJ!|5KGYh%b
z8g(ogwV2*lf0I#D$4PuJU^n?6#}1x70NlvInd!v#1!lKUAad|y)7fI4g;pb;mWN|*
z0ehl7e$bvlod<s<$w6G8c?|r$64D>Av9<)8ZXxgK)}HL=>Bgw48&{=QXyg$1Tp;_U
z>A4ZFH49pp;&??{ud2^)!f?RU&xYfs{$p+HwO_&+o at r2}GjQwdHOQCyb=EH50f!F0
z#;F$$bey8f;Gdd1PL6#Aura4Ezt#CvMi1-D>~wm&vzC+R8H<lP?k;_#^8q!9)-HXt
z^VF?V1Pjo4jI>*4(L}sMV$|pVPuvl6lS-ep7vm$BaH5`Q4C+9C+yZXw3+&UL1-8_W
zk3P@!;03bmaX7we%D-Gyu(PV<N&Fnd^xvk_1{JvWPpBWF=kyICp5mtuYJgo}qxxgU
z at y2K7@idN%hRgD#kLX1OjhDkTM~}d#=_;^AR=tqh1{{m<Q%@Z6J+!qK<G#=JGpC(k
zFC)#XQ+SGvvbJmRug=0fPBQOPRluF*J6 at vB!?vpmFu;DzZz}VQg8)}mfNby`?$b@#
zIQGW?na8%><>?<8#<m34zf%_1prYht48hOjTDAvzqB4>%uE2BO83vw*IzMckS1&jc
zQGRQWyLsCc65Ao?>2|Sm$`tf>W54g(D at cE0o*;i^Ufsjv*LP%^$XMvxot3ab(b&U1
zjQ3v~Q#C&YSi+pL7U0>7x0&jn=X|KS!u<$+tjD}Bz_t+E{CZM<<-Z#gF^3$g`Ve_a
z_)FWaKsE!TPG|Va=>nc2VREC1(+=A(L$__iWavt*?oIObVKcxXJr`@yZF$Pyrf><?
zy#lps^5$TRnrzjG at 8w}l0zOcncKw8VAi_uFDtvRgnb^8l5;_0nI3^ny<3iGYJX<qc
zJ*XeAafLzG{jT6Fl{g>zfnA)bU!BrYhU?rXd6FS7d*Y!#!H;!;)8_hGYuatWxj!MF
z*%iDJZAa`=Yf?d8jYO&XhFc!a6-CPMnV<sHWK$3BVO0W~!o-dP$8{s-eJ+{zt5agZ
z**{pz0{1L(L6w4*-HCXw#gJ_$9cP*H=#J&L);-Qd2FaMe2Wg~{xE`rRaUSO$BC&J)
z4gy9BxKqu>gle6I-YR+Y&+=EE^j=-UH21sAON^YE%;*Iz at O2Cfo~BWcQ1U+N90HF;
zWBtweoJqnvF3MGpF9|R?_e#MPA0T(}fTMptR~28vmQ(QGG7@=GJd0I{e)q=z8yr<s
z;p9E|4>m)~UM8O|Ao7p at UhcH<B{Uy40cs<Xn7c4dkmN{N8t9P0kF1fRMgx=O0CyYk
z2ny2n#Tr~g(_QT0sM>;gt{4P%({5pXZZE}g<q!Kxdt}hcecEng{R{1eAJqXLGPxFN
zWSl}y`Lip6&y~^nbPb&+y|Ow5a&HAgFuA`$))uMWr^;AwLzh^??DojSwd at nLieR(^
zuq#mW?k#6jh~vf2m)|8=aM$Yf7t2)ZXV!ltPkBuT-}!dDGX>^6iGh5L?>UeWjY9D_
z at _SQsJ@81YgH2fb$@=%YXZ at q5)~#38-=te;<j-U6I*h)59+(S}M}A&{{Je=AfU3d&
zD?fXKi2O7Y`RVPOZaMC!$NfrX$pqjIJgeuPIlGI@?+=x()ts;4>oSu$t^*D#z87*#
z-+N=;cftEztA`cy>en7Y+*$krxu!8m*#_=~dG#1;vfSPmnrV5aiKVt0>2Jw=4}S5)
z+Th1d2&9o3H`Az98x7GaH`cYrbYLi~kk56H&q3pIA)og`X3w}_#=gTHDk at NOlKPdz
zJ6RhcLrzMCux0gvO81QotyTl~aNEuT at lYc8VT+QKz!Vj at 9zdV}CwV4pw+UKE`|)0`
zx4Dv)@Kagfvr|BCCH487(HFETsUh at 9M!d~HWX0l3Ny`5#E3AfxvO=I}T;S7+Iwz?_
zUcCM{@C1DtLXQ+<Eb6w&>ldsC2l~)CdoS({tnc`%*jfWxA(t`{dniSW`GD@?lnSi%
z9ZeceUXzTL)L*4rBJ!56fNl1(9kqouU$ez{&nxhrbAxwbz02;^&ijsg746RO%0#Xe
zn5PQq72v7LlAn7hmpuBVi0GGJj*Iwq`E}aRsli&BkM_+ONr$hy2KIxNf4RRGn4dP(
zm+KKFrHA!Yr5m*$zl<8{6AT5a^@d5R4uh}iGV1OAwOA(x57I^Hae2z?H5h}x3&pd^
zSiD6rxWRvMg>iOZPM&bz;lAunmaF{7v$|sI&b38fpjBl+=1bk^%a{9pQ6>lq+ at G>a
zV(WgikTwz<hxn?8PI4wh8oB~p?+A5|NRWT5r;lOnI0?VdeyIg>&Vxf1Al^>zb>E3*
znrh)=D1lB~`0zjOdEK`G1ya~61JE&{m-67p%?c>xo_9aOUFC#d&+jzs#L~;CsT6p#
z>EQ67X8W{)0XatiPFvVR>%qH*+>-Z6%{a~?_+%=3Oc*cU2!IoWjfosP7x2X6Ymq}4
zF+Pvf&VC&D8qGI2=HI|mf-_w6Z%(Uw1+h;!VW^k1uY7L+>Oya?;~N~{AN1(eD)`!S
zkuQsO{Hz;v1nhyH9)<XlbP(7n(jPI%zdQ$DNMSW{brS=Nov6oDSVd}a2O6Yiau0zT
zHUVsH<gyo{rWtA_Y5ooW7xGsAQYO$kfv5V5B at jL*?q%T5)6w?Ck$I#ZBc1l}`jLqn
zH-X=FQBxW0&mZBF_=NDHqrWVRWj#etL1vQskn8fR5$`U8AK+pf|Gh;I<8|Zr?K!jV
zd)sJi=l8%vEx!w&WVll*?4Mokz21O~JYVM_FU|+}!2>}ud!r!7iTKgb#emPq`@YpB
zAeeX3z9?sfKt{H)ooDh1U%)Nl!}o`G))!Pm`khrQPf9IDjukN9gkSsC6q0X>>%Gib
zBsM{J(R0T=>=$zU<0j8FqEHV9*zS;Nkca;z&kq~VlatCMk+>TClSe|8h+W$dr_FA=
zid at U?t_Z3Qyz3(HwD6bK!)KYTy9s@*4r}Co<o(oi`A~J5M|f3qT4drYF6dQO_v4$5
zV_4xD!pQ=E6Y>_}D-;eJjSGhdjW6}>qebvv98GBECI4I2maaQVz0aK9)2(ft6QRA$
zD-|f*UlrKi+D+djIcP37 at EAw1Cfw(mU#{4=FJk`YnJ-`7m>)59^Mr^OH&2XsY_ku3
z?;*8o^^Jn+i1N)PE^bH~!C0Wa`3(10nBSGdEyfqf{c&9d!JmU;_}Z`n`>e+2;m0kC
zL0kZ9qfsj!UpOlj?;<P0wE3^OM%aPC9#XnM8~g+Ug1?VUNJH&LFAm=|Ri0`>{QTv{
zjr(8^lu_xlA!66&$Jhqi5Nz5!5q at GdnXeS)D+O+5W4=74oZ&7&{?jxv27{HGAB{<u
zHSpx`liV`sFu-Yj<<mu;fnbJRZZ>LqUQz^CZ+^@*mxCM_&e<{hGRtdU3ixh0Y7Et(
zeFn78fO(RT_7uJcVf&01)BU76;sos=u|BDZ`!4QhCHHN+M&3E64Zb2FnZJ`z+YLPK
z^3p!;sTSm6NYjC%HsE;^=P!~b!LOCtw;T2{;U`&ry*pg&YoN1rpMVFq6qu_0PsrSl
zK<~tA$GjSU(YeAi-nI}w(@C#AjP at eeH;B{L_B!V*@pTy&lKLH+pTzGr$RS|$dlklK
z at p(?5e7Qv0j!&D1|M39vi3RMz`(UFVW)c2zaFXUk;JdSg9N(uFxHH%J8Ny`+#=d-k
z8 at m379$i1)Sq<A9$KgI~lIsF_lS8iKEbbK<pC#vEu2`bT{o369eHj8bzk0YF=i>gs
zrvIcNN5b=+$QR&&@!mKyh at S%QqKfz^UYSh%c?Dv|fH~qOwc)S*&GWv`7N{6t5y^S3
zxu`)fwpP6I0jZ6%`BBs{gs)&T-V^vO at qAKYstx;}JX<KJHufM~u at iM-t0qI=K&`AI
z{0@!o at a%tjb32ZkZFCE4#;e%>%;ujk_O!+;=%Yf^lRW<OKU{MO_He+Bbrkh2yNDlf
zVuWe?x`^`a#1_cKe{uK^IPdKryUO at z$98an_w6^VL0=+o-WV1j4<6b)haA&V!~$n`
z*7NoR0Uy`7|MJ0&+K6wre?-<==y%D`r+}y3yhn3Yo)q^YIUiWhB4P*kD$3*JDW6c-
z#v&j6Rp@{RgWxNdD{EF`EFB&emB+?G&Tjw2HFvnaJQg^c!_i%^PqN{w*sHq+AJk#&
ztMlyJ3vP)l58k4<S6lwBPc`1>1bc&A)o~(V4^Ka;<5g+%a_hJPR~g5|28WAV%l#_2
zdi%#sMbWvWy-x7vMSQz?kF;m~DrT-cY3&z+RlslaJ@`+IZSb;AAo(Fg77u?GGDAx0
z68<Sy8hTZQ6m|0aP~Vl^KnuYmum;<mSd*>TibyRVUlZhKcFZN+jSY&?plv2_gXy4W
zs7B|4H{wF*bol;|3ltTHTxb=O1UqU!Ifvw5I4&dSU*%3_fHn5{31g;JlHT`9`76Cz
z^)lq^anC<O)zAfVd}z6?Ql2DR037Rw_8e-TKw`!B(1VaIH#~eL#cnySn~VQ)9d2g-
z;;lXT(BE$fwxG7`Myx?<>6<~tl!fkstSXHz4QJ7Y)+G%l#4n(a+<0-bDcayXO5<b9
z!Fl at w#E>7A#7`>Ckf#<sK)#6jq0dxM=`6v1i3c<O?L&DemEgD_R&{J=2ZQ at OfgCVW
z3uz<4JHv*{@x=D>U at utc$)pXtLzA-_OvwtPB6+XJcbdae!zcY7{D)T|Gp|y&5I3tQ
zenKyv9`Ra@`+4Fo-Ud7g`sWRjlj>;3=O=0UdH4<R-i*T{b!2b7`i&mtq%v)_e|LN}
zPp-|={gSpEHI^YamZc%q3Y}<K8u$XX^jC$;NR1@*60CPU+F at Q<=+wMq$hzs!Sz3M0
zz1+BTN!tz7&v<>AuN}I`(8qoIR9oP;ZYA=N_z?xI*WKY69(hP=PL()Xnf){5zPIR_
zix$+<_+?ThT}4mI>|y;Y_{y^W;Gtztk^4%!ub}<l%RJOA6dGfeFRNtdiZ1MkSuWG+
zC^=mbEANn<E}WEu^R`JnYZLsqrxN0&-A_LuIrYqx(<P2+lyUnEDvZ|9NnoBDN9Tb{
ze+rf5xJB)CjHAR1*e#eaN`g5Z>haI>JpTFZC$fG$3OyG{CE#O}s9W<M-Rdy2gW;RX
z?hP<LP3#}|Bd$1<unX&`A%}|OV!FQ~eot9 at jC_V_C<{J;ci9(cn?n!Ys-1|}Bqf4Z
z9LJleUWeH|o%=5Ft-R$bFrPMR+ovM8)p<w?n^W+jy- at Iy)R-#yZ_vUSsGDGAZqg6x
z$oWsK;Op|)1yTCAe8iJTo`sr?`#Wo;YKGXuB%jG^59i{%Ba!^<Lr$|mLXLr-Ohf90
z;JX|3?&Z{8axdg_L3gGj90$pM_DM%QQwIDEY^~T?9T}tzwAo<>cdMLIht6Pjfq&oA
z7Wxgyyx;SZFy4!wBHXGu$WcM<DQy#32Qhc$R2y5z9Awfl2O$T2j-#zgcNc8kLDWMk
z?G&L;Pzz!=>db at 7{{W89!m)BeD|1Gkw7MQ#w5VS*?*QZu^i|2=lsx#%E2V`xTc{1X
zW+Y1w9awHBe3<nDwX+I(Rx!!joVH7fI#(LR?3}`B`JVs5mp-O9BA1DkHCiO7HYKry
z0zKlA$SW|0(udu-q(AUZ%Y51~?iut&y)+s4wAaDAwJb!#%u6l38x#Pp1G?5(hw%%2
zW^^t%g&PFz^&hf!fd}Z9I74Tm>%@AEYaY0OF2m-0n>$kP62MO{n2P5-gc|eJFMhsk
zLbbu;-`^Wty=)T3P;FCovWhzHaGfM$FpPZ&7@<mEJzeA84mm6RNOeC5<K>qQB_-6F
zeHKK&ix_<!TSv=s&)Q3wB4O4L>XhNVv^Y`2T6dGFrsV4pmzy6pGCoAjBrTlY1e<&H
zk0I01=LOPvsgef^Le<Q!^~f}0W&Ek#vj1r}XY>EZ*}KOzS^ody<zc1EnW9-PQ%+LS
zVH1(E?0}hXLLx-8n7D+rf=m(3ccCR42jv#V#tx1#*@+=16~;g%GC{4FrYH<?GB+k*
z9#RBE#l!b`-NW+z{(L`=$M5(3V~=~gcOS0%y07bXy$;XU^99Z<SsncBlou}$Z9g8C
zX^{fgHaev89raXfBO1?&)keQ(z!AQa$m*aI;nN_a$2hJLn~GgP)`*(|{!SwMo#W{^
zA9U#MeFc*c8=s>z1OF>!=C!3V_j{=M5}x{(N>L%@^=yhA`2nMgl(LLs1{3zKy1 at vH
zofliO8k~dAnQYlKUpVxEfrib^nO?S$Ox^O9dM)&Cjg9b|yO_pz7tw72w^@F)vWIG#
zoa at -g7BdaDoPl|q&Dq0n{W6KHrI1aIA6@|8409IzRkM^IP<qa0nFIKXLf|l>=T?U%
zevu7MvYB{>a at dqdXubaM_;y*>-0BYGIx;%3mZ^bT$PTwdx7VvL&#lR>C*0R6Uy9Uv
z#2Ol6TAfKa3J1N(SYaH(HA+UIR%OApk7`l`Dxg+)EsX|#PUsDuz}k;_qhHtp|F at B;
zN-1ZRLMB%(?YP>YN((YBY!6-97<=*f%pFH}KbIdWwA2ItBe9o6&lC-3<%ou{<e4M+
zL1Ya^e7npUtZID=F&NrLQ1kAR+&lDvJOp_*Ax&$fIV&wLW)abImUbhK*a{z%OKzh^
zQzgz6q2T%Lf#((^Wp{u}X&HM5v&SdCW!I+5Crfw|<fojz<;{KZmY!Xm?pnGjVzlLZ
z$Q25*dZJ~2e}jC+V_AV^A50?0LHEhP{t0-8H<^5v8sjgQf5`S_S{zH!=a<n1{ypU2
zAU^#WsRP_UT=4-fo?91b_8qa{yPjC&@$FJ at EG4iH--j;%`E-_|sKrN?LO-5|eIFnv
z|37>t_xvptw66rU)8Q+rv{l!W{JOu!tDW~JXMlsQ2Jf-`>>kAHRIrmyq7KLx+;do)
zIp8s<8F-Q7QeT>k`bLN;yoU4Yuzi^&XII#sCHkN`6~9k~$?j+nTi#D{j5%esm!XSX
z<hNTLEHSQ$>k*sygQr9#SSRNY9SrN=uibabj`~f7zE%eOXVw5X(J8M4d6BEF2>Qpb
zOwZMs(1CKtZn0(Y_S(jYbW|(zmL&djFFz8GBD&r<_z at sC7IgkI$FSzUj=X#k;|Lj>
zgWhv%h|k8QhRsQ^g*V3Uco+|^^y*GW3^<K>q<gDo4od`?365(zR(y#5Pd4=5n=Iwf
z{z7_x-q8NnlbVqCU0$j4{M9KZew%40OP&TFlaO&-ED0AYjRZ^i-6Z=y@}Ccz%=_!|
z at 4pa{T+BP~l@}OMQ$`?(FFrjq7E>^`r?**|O5iGo`&Ho?Exa4H6Y3+-W$ywL+766`
zb;bnL7i$y=GV>_o=>e?2Edef-EHtM<u^>k!&e+0||E2|A^3qb&X*$26Ic&V5M}hM_
z{bnKNKhbx>;ZI0kWe$&S<Yp~311nhwzL}q0Km9m8|6A~wn>n8FrKa%pww8v<Fy^5$
z+tKwgiiXf)UIB@{W8CI2du&+?`grPeA#j&-SQ|->EU9fgP`?~{X>>DlJWtGvwT%zo
z>?6Ba9B}U7E~<j5adrCZRIp<<p98m{>{xzEnm6i1_*JuvsL`h+SX#`_7u0ExIWIwX
zG}uz8B8CNc>=yf$DOJu}$d%toYQd=t2aVjt|M&+GZ+r#1#AWo|E9Z}Z|K%sjz&rJu
zp?jBXZMSvyV~`u3jJ*oB%87HIp(<Ej$fej1e?@C)VZxN!&n5A%X2C!FB<6<@d1xcB
z-2z{2iY%Qu?7zl+)<5GOaTXQ)W-1GGSd8yn=NAcQcv{<e(Iu>r at RvDM<T_z`OA)p=
z at k|bE at 3T=8Frfis;Wp;sHpfYS<mw`>aSNDBA@>}{E5q>wFSk+4uZ2EPY2Cux&``rY
zv08^3YjOR#a+`-Zu=#_D_F^g>d02AhC1;utKAW41*a|}|_XP1R*Vk~kjTPLr&ba?=
zzDeR&$Dlp1ab at 2oY2lll0DPfzXsvtCaX4Pg(WuPiH)43-;axxNc%Rl+(`P?Pa|$a0
z9DhiImknPts3$T$$p~Iqsa_G at hUcH;%%R(BcE<U=VcA0+Vfs>O%vbp>!!<l<zwfXw
zMLJ*+4XEX?2mUqzY~F78M|>H`SA(A3L3~MM{UW&R=;pA>)5n3^xJSjhCJOYZDY*}}
z$zN?<%rs!m%TSk4cXof at D#EGv(bu6(yjYAMJFrwEnK`T))Cpf<uR|>U9_s$o;k-Ux
z->4?rLEzVia at 5d&{XWH_V61sYb?2x%k>hs?3pz)gR&`H`a*Yt^yFZbA%ldWHDck;l
znTw=5KS`PUqzSU+5U&!PO%wHUf~%wRA9iKv(e?sXG0FKD8*3A12+0};UwgstzQ|W0
zc#2(k=hrO62j793mt}Z=zWkHuuM at zxKsNa9B(kBe1?y!2`ZOP$qrf4NTm<-kcRS<I
z)*x{8SJ;LT-^EoTZv%ljyT$#(8OKwi7RvF=`jok&4&XSftAW3I<U4O+3=1a9;lov~
zDJ{q$Yiq$Z#v!uSQpJozb`4Jwnw~6E8bez9rx%QzU8)-Ks*HymXvQJPuS0cM55Xr7
z`;v~w$Wcd!#AOuLJCLD&B^5zd=9K0zj>FFT`#9)0I at G(|DayqDTq<XM46u&7PfTYT
z(YC^5BWb5z%#u$9Pc8BDm55cEC#Da{z6?go!4aFZL;j at -)Yev$bs6h#0Ts(D!Ca+r
z4KIS*4(m?m&{~s$d6e2vj=8lLF_nt8MyeA1mohB(?==k^{tgw^vTXNSW>=wKIwt2}
z-D<*hT15ibEW5)@@K^2!W}wqjo^VcdiL70StpOi{ck`Oa$b~)0DYF;xB{;`{wef_=
zC6bLrt)Q}x*g1izSl5g!F}>aG*1_d-x-%cHZv$H&jbGeeZMlH<nmnw`cC5vy$BDJS
zl=wv+#vmYLHQ3)m%Z at Hub^uQR+XT;@|NaaG#>M`r at S`64pKa~=yRAk}nW&KavGW$G
zYsy7_D%RaMiC_4GG4SJj2fWnvpyQi*2A+hkz}0=rt$T9Lh;$pXh at O<Wg_qdip!HSM
z=tE9d{6l?}RV@<||8PqC*nK2MaUMQqPB-$x%bb__`-%L5+`^cCd5)+UV<naA3tPTG
zw43{}-7qQVpkZ}EY3^!;`#(v1eko*cE9`)D+V at xy9R1^Y=SSH0JK4uVT<@$P;!>Mf
zRL1?7ZpU=&r+o%E20jnsFW6%tzDCXp`;AB1d+P7 at p8UJL1*E<0J5ZPH<44+D=Wa7<
zJQ(>q$h(CcZD}-;xC<)}-_4D?g=x$ZdW>W at Ag5nMxyKU5M-A}B?~u7RS~qzIiHl$z
zN at sG(|C8mSEa-4)jGCcm9;$&%`Z~JGS9<spk>HJL*Dkbq`Z)QK5^z5svW>|Qvf{9w
zMv2tia%Y^Sn#sjnpY8UqoO?e>U%n%ZvLMfhDuK*NvB{~u7$285 at 4<Ssg{kGGz$bDZ
zTaq7a$5x1K8|)<|#!MxCi}3phu2E|##2CK`9Ny2K(9xE+03$sdHYCj@!OY{U5mP!B
zG3TrV`^(u}TbUg^xP8lj1J383h(xXi))xh?RZjX6dh9iP_XyI;W&~Bp{HY5hM<4A|
zBWEi=T#ULQ&5 at N$2dx*-)@ht{k}D+=5}AqLfv~?TY>(mmk+|1n%3ztz48Vs2UCE1#
zBfsxN;8bN^VjL at 1;rOn%YUo(L6}qBfCU|O)N2cXh<G3U;KJIlw2PVF;OT>@E>xX_;
z=s4`ivk0KK>M`$tC8jj0G#25**Q(M|j4IhyV_Pb<&u;?38ua%=x7*KPA{VI${?&;N
z=ltfY=>f#&`<SSN_?_X8MLc16B^|d?(|&K{w(Em91Y4$X+#@k7g2_zW)?nz~p*@%;
zW0E>f#4Z!^qKMzTH&tbj7`xAuYEaX$zD;$!h+|D77;6&GS>R!C`*+VCz?u<?dW8if
zhUJ(hiI+b^Vpy-`+65{1Mw!U{nLCE$WfSsC3j6rDCj2CKy;&0YjDg3%Ij at s^8zRSE
z{1N;ojo>wzh4D4Z;f#_4Cq#0$6wXWFXF34iD_MJW#Fu_92lJ!xkyy`<h_g=|KuwK@
zKAc<n{?iKZm=K at 4A{c(JeDJoxZ(Qq>5D^?R=z%&jMUb)EQSVFM3(h5KpUBKimsO8W
zL;v5z7C9PJHMVuovuvUk=7E%UkMyv-2;G^KLF6*sdw}_EgFLUcokhIgZL6W)q<kKO
z)Kc^({#)R9^F&_W=?xzupRHOF`|b?(>VfBFR_4+$F=F*!)M^q=*UkcCF7P?QF|Uk6
z%>ek<eV7B!6JLVI4veEb>TP`1koJY?8+KuywX^bjGYMAk<<BjP{QR-Lw6V*1V{t!s
zEJlmt-^7?L=LOQ|kA_?>=fyyWIu7~wv*U>bA>>~_ at C1IOjcCW4B0a{QZ$c2^N5A`<
zpFiqq*C2P04WCeUgsy at 3*GGZJ&I5W>7LFfYOL&E2rvE_mfxLpYatKz5&K+*1$9@{!
zpWxO-Z1N|_2Vlc7e~7={1KV1xBTtAfV1DmFej4)Cv41 at FAE^Ds?U(BXkAgi5x~qwv
z!<7VUiJEMA)Glnd16v@(xtTP+hV+ZrvLEYp8r6mRy5+b|C9aoGu7~?%13M<MIyM!T
zogaEfPH;s2Lih*WeQGHs=W_N9o!3U^c(&s{4$h?Dm|yQ<%$#THY+3l<itBF2wh3de
zOw@%oz|Y2mJgfba*pak8v>&ni^=flCdEVgz&m#`|>jfVC`Dey at o%z!D at CMT7&(j!=
zuW1YiZ^D7Nj9S#bnYaho%OALL1pBkih_SnA$iFD^T?b5Q9OgnTt{sZ?CJnLE58ZKC
zj*A}On-Q1ZBvXtkU~P-2KhqFa- at FpBPaWiSe4o!maCIyQA?vGRvpZhvxDA~1W;!OF
z6NvxpJ8}II*%zY at 0vF%}E`Y(&Ii-v|w(f+?L)R<zHuj2N0TvuS+MVE$0KUdOAIlbj
z&qv5t48;-;y0 at EFisD$npd>NWX5bJJ8&S+#ir8a{x({~8kS}jN^p<kROkfh<gRQ*;
z;}5dsnGn1a#NhQQj@(ckVu|UTiK7fQ1!7ex&czsG2K-+Vl?&U0TnF*XO<y=3 at Hb%l
zc~JYhZvvZ>YJ3p~%5H$pT-@&}i{Sx(wrLIVKP(+ at 1DEa#GqO88P%|rOWFvS=f at 7mw
z;3H~&G{*BT<A20>WPdO`vQXRQFyw3#V&m4xsEC+{vGFO!g7V;~+{ZEn9um5ZM(`Qs
zEH~r3dbAjGV at sH-K`ZlPZi9al_>Rn8>`!AQ<D9=5jNCZ9&rOKqtjrd`{@?$|@dkeX
zUa#nCJ8EfC2KGGYTTu}ust+o?qJOp<qRmt&OH73j9}GDM_ at zwb@Dxo<!(4qG&+`@f
zA2m9YwmE<=d=GwN$h*DvNZ=(&{A-3AXEeI5`zGHJwK(6S`##?xyE)qYkgFss=5MZ&
z@}YT?GsIQ0f{r^b5yb)v(!{+5InqhS^i|Dg=^goWTL_M*jJEZp$c>U94!PxnZFFqP
z!AT2_LTt7QZ98^jTYov}Yl0Wze at CS%(<ZqwMCon}5p>rj%6 at vEf#7xMzA;(ME7GZK
zhs=V!6pl_+!Iav>h2OFYhW5$neW}>@_U3biF3xXQ7pIykI%~_8xUquh>(%hffY*A{
z*Vyg^r%wExad8>pm4mWcPf7f1=lH<naXNqthadJZ;zNkHI`FJ7!oD+3P*W=<vJ-E!
zYv(_0+Xp*(J at us|e(}ghVt{25so at j0I9R_v7PZ$zxX&sf=3ZIEiVWYMHmzdnZ6dYC
zB4zG}54AQ-0Svqd`?BbLwU$)ofr+^eQe)u?S*vl+J<so?<AS>%i3?JQS?Z=9vt-Do
z_eHR3 at cn2*ol5MFx`LslAz6_3D#$7|yN<Vm4IHua&Hpu4xP-(C7fztLV*Ke?;q$-?
z%m#iy2)<m?4RNRhJaz){e&=^?{2{ocHefBdj5;Rk=RfB248C6(Sm4H+JY3Ty<B_l7
z^Z+k-nE|<izQCE}xQtWe(7_vt?tt~B&ZTzCnzU*zCv?#l?p%|df8$K at F{Y+qZa~NI
zf8V|hSQFG`xOtnb{g2>G_CN=FhrJDX<G_ng8`H3y=wtp*(tM5wpdXY&hGZizb~p=p
z&Hfw7{hi~G??kXcz<OO at O|EAL?nCr$M9HaK=*w8wW(5okBRMV5bpoOH{3q6AaMssJ
z<^PS}n{*FyZX)JsP8fxG<_Fu(02`%g!Hv8(M&09?kpowa?*Z6Pd`Rv19yp{I?GBE*
zs3h};UK7sIYr^FT2XL+2C at Ew<k)tCU%KpLmiM%B7w~xaQG at CESTz@t=D*rd&ldsyt
z$T|kwk*v7{r!^h=OO7a&{#}K+1AU at apU_5KfWD#SPed+N8|Ll>*o95F#%^4r!M-Sr
z{kw^~8*A4;Yp!8v%~d_J=H~pp<}x0xxsC at oE{ov)+;JG at O<oSOiwDdHjmNNx4$*6F
zH8U;j@!zW-c^>fM+%ELkF9K%wx{&nY@)q at WkG;tIRgu1eU!WQ}rsD?v=x0zq@(fs?
zXZ+Xz`2>Ck1+^vNW9X1K at JwIW7XlOZDf%FMIrI at u8RkNfTFTDBwg=DFO8auMftAn2
z{VF-#gIeTl?T37Bhb$<d-(xNGoMX^;OxXUy<Jt<j=}TqII$o>e0cv`T&1iwn?B>-?
zDJbmLF at PEQ;Ho9hc8PLuzUNj)%BUlf_y=<K0mlPgB{>)QdQW85dsNo$CN`PZ8R*Sb
zc)lZSE$?YZm<1S9f{~=;l!WLMJTtGtW_Dwwc~8UNsdRdCHA8mF6snWoN4>;24ZQE4
z&_52<_7EG1ZnsITWACW#<+o%1dE&bv{@Z&@zL at y8@$8NvJ6rjvosDtS5ct%l?_f`1
z9{Il%I1B!QBG$>FIaqAck at vbZm&S0?vVP`P^raj!erF at WzE@6`!%v?MKVTtbk9 at Dr
zjTu#gS3v$V<ckRFyO!WZSve*hi3ia64syum8iLjCj7ZjnRa$7Q_KfHG3fOkQv-)2h
zYAgKV1UL4<n4mF3K7oahH^RR$jm=lDp*CX<<Vlw>cH7Z^FpcAMHL?udO5{-{NFy~e
z#eDj6RS~KIzHtxa+zjNwXuX$_dlQ`FOT+wT0jHQn?6m&foRI{ZIJ%U!C#L}87(bYW
z|8?i(z2oV96VY$U5tR+{-qEa65tYY at p8V~j_{W!OX#69Yr|aS8Ff+Y=uV(H~$$EjV
z|Ml`|JYz1wQ9{rD26lzKcRH(@zMdDx?i3scU<7R0iSVI8uD$XJWK%MYyVRYN_a0;I
zppX5Hj)(k*56O9ptXIHm!hh|d^*;8`y<y{Y$f}tE*b1JjjI6XxAvid`z?K$tFlP0k
zBIGmH;#{Ptj-J6?jPc1BE8uO%TAK at BfgJJ?K3{^V;w#{v`HkqF^0SB)botHV3(m at Z
zFGu|qocDk8F$@exd$is(_VWR3=L`O%fB9zkJLJ6 at ehvEQXhh{7$oZ%3jU&V_#Ps4W
zrhspJ0lb;FLvhY=_d6MbSSi77x&0fj?g5?<bLv(7|J`pg<S)^3gX~qb&#?;6tyZVP
z_TTT3?Yzw4h$!L{qVW<>4Ge$yzWruBYy-LOz;LV?@Ezekih<!+9|Q$v<{W~L;C>5C
zT$yYm>iud{>KHZ2c2Xmg3g#Zl*MmpjjVUMzmo%n2E`nFRkY}=9M(t!B!87tEK8$yU
z{9@~JerG$%gs&d!Esnok<K}`#T(cW-O=A>l!UA^+I~VhEHTq5bAGYx#8f&&X%|N)>
zAuAUX9_6Gr;16i=owe?6#GJORR9q*eyUE)qdsPzqPD}S4?e*?U+CK8!>+S~5TGteG
zJh4p_i~ZMVjNw;~CyB2Dxr(uVGGFPsyVh&TV&4nv`a^ULJDt->9ea+zVz3=y$_bY(
z{M|QvWKLIsdEpk|n&jZuFZVg%yiR1}y1SxSf*Y{s`Wkq at h90uz63nU2f=?IcaCv84
z8fDyY%3)?x)+^mxw|~*SZ~Lm%Ed&pytLF$Dw>SdS8w6Gg-}gXIF6A6LZQz<pcLSr|
zk%ao^z(w|8tzV9O!6$)d#ki!d!yll*8qNUj=uPf}($2|pa4=ROj<0}?{gg=0eaiXU
zdHBs9?uRd=KP>ZVSwL<Y>d}G=i(q(j at R6er39hirVfL)DUa_Q&ei_&OSGY6-`|xb{
zEY;onO11oc$LpSErqHIPJbAN&V?KScq2%GSf#1o9y!YPCrw|Jl7j|+EBX*|3cL{V*
z6>@y~nPu1~u&ESQRUztL4+|Bx_5c&63KcBK$2Koi at CDhzXKqVX%Id0^bzwL9`w=%Y
zaRk9pAK!DB;e+zxw>nqgo`syW28}n?RMN-reGpq}c_;OH9&(BIeU?(^LfqkxjqHj8
zNsXpziy5_!T2RL*-`V2X$CgC1oh|%cW=Aw5WN&L1uQGaM;mgV6!z+0*Je%6N0{Lf$
z;6EzISRws>ZL->ZeWE+9>LT$G_?Fse-_o^5d`mj`HgpBEe5=;o1?KNdi-C_^DZ9jZ
ziAA_|5_)uQn^M<7#`n5=gu`4rh%t=sjinhYnP&o2SNHPe9cBCi`)>T69H71m?w}3>
ze<v^>D%ga1#3n?$F#i2yfj<H35}UlU^dj)o#~FW!gm`c7d$s`k?HwGGcaX*{nz<d!
z%4l}P0ZW1N3SyVL$QZ-B-9_VvnU<~n=s&_KjkffmmL>Ff^yftAp!p(=BzE!3d|(UL
z-L;qC|Lf?BzX)zC at r=XleLpxVrvu0RMDWc%*I+|k$Gi}-wqpN%U}p0iX3k6;S8u(>
zNhZ7yPge7#$Q>vjfPNQniLD&^{}ghQ8o~ty)%5(kNU)gPLQ2q`sqL|Wa~18WC+}7g
zub<3W?gS<^c-di_!%XsKIf5P+_`+Z at WxgDj3Jm2hL88P%bsfkZHLPm_P82wI%u6y4
zy9lo$c{bGNEW{iGW;!^g>aZQTmp%@U)go{fEymo#y!nO3mg`8rctEH2Q37{|xH<X&
zc2wUuvLAlCqJRUilbgV8u+sS!S5NZD$Nbfr8-l**yTHOY=^V7|0te6l`Xr5$2bppg
zoW^OG9}-6;8 at LAFxdi*Jvpk$X8&28Dnw(B at r8>{x|8OEx(7(vp^i>Ub5q+I6$Ji>y
z7-SMGzV<eF+f#t&_@`Ed*`ZBNq2_V+>8trQPGLd+sMF}5msURSd=c|p`1?)j0FlY4
zn{t4XjyfGCrMcIQl=RzI!lYq&7Fp at rl%Z57tYUVYsOmM6<1#)Ubu#&d4oy_kR?ihL
znEZhcJ^(J-BFGuwVllThR2;XEU2oHn-$5r5f4APY$wmiBVz()wuS@$IbfHXnaMY*p
zE0g)-v(A~CtaONyl&~4Hc$IAzdbLy<?thNdu<9^=62GQoa4+W9&ETk=hq3*At5<Al
z>1*9vwarP-;vKt8rta$TXSiDOA98e4F&-}j{<Ll)W$>1Abnl2cx`P#4V;r&*I)^M=
zK=U=|=y&SuzNNj-z0aH(%^o$3r^2=VfSp!2|KqlKRIppO+7jy$Wb3(i$@>J}SEkkZ
z%Ubov6$zT~oPr{Mahzt7{GN8d_*bI}{#m at g1$Yk+xPPGymcZ at nCPJUkW2|gK{JRG2
zKwI9a_-9)n<LIWE(QX%MGq}l8gHr0jy@)k8YRk)z*CRw4%(2^KY?`4{wM}*Y8~PdW
zvbsM=zJyPzs5n<Ps_pOJ+eBLYZbBRGa<9WK at QOG^IFs52X|9z$qLHYB%@}n=5}SFQ
zw;@7zTIuM8d<CBiRp=89?gtfB%4!a36Rm`9^3;57+piJB&gmoOSV-Ug=4?Y-?t(|d
zg!St4q*iRxN4yOA at fcaZFyBPWBFJ3BHNoo=o2oWjWSK$Wg)n$kLcfg7JVKr;Bh;<K
z`2IlNJM`xk{ce5^+L(oVSe(ClEVn+ueeNM<UJC4XWX8&ECxPWO()$kM9W|0QBUBQZ
zuMSjIJ#o}xW|pbUic)OLRpuJ9MSO^93eh3wI8%MZw;p3MmE2!=mE^S3>qQ;Ohw146
z7wlX<`sZx8``)OVyNk{>Dsaw at n@YdWk67D%Q`db*a(hX;ohv$Bx{p|O8Lm!~?j!i}
z;@o|0DShO;LhSdDb&VdE68Kc*;=(IiW-3Ly$a{pW_z-q8WQ}7Aj_HL?w}s#AT*1#p
z8^&N>-^JE|_ckkHH1u69sYwFe^z{V1|C<D#P=Ng6eAr}a=pwRVByLiSx|F(;vVseo
z{H;EprG}E4KRWvs{XW=6W%z$jY-*_ftPD9~K{!7{ZT3*RpB3#mglnH7{lLq`8d~?y
zJBIC24ZgMtPC#ho67X5 at GH~B5!W32779F=LOz0EO6E?5LTvPS;g)}RLzCv*c-c at o+
z2B{OL7vsJL&TpYYl{!>-R_0uc>y<{fIDb at CJ*h*xc5%m{jl{N83yB}TSS5Q(7k)ZK
zcW|dN)k7RsY=gf-Ew<=B at z`tf&C}Pewz_4-^!I^Jz!)+-N!}-=#<li79B1^L at fGdH
zGer!&6ReRK$KOQ^vlBbzJ5e!t2l($k>ooc}F{nqh(DB^1Uq$aOylXRLd?9*oCb%;O
zuTvwD_j<#Y557Mca}D0v0*{@TKWWTe$wu{MN$kJMX!*Yue4ymIk(eXfVMhwc_z-n)
zmpC%Xd-ZG&j_K+Yl at HzXv|9$QXXBb9AI?u7A9@^KlElxxjs0&tDjyB;cpv{m))Dz&
zGC|fIB(jd at mUU(8CjKK+9?BTEY;n)E>6(A$nx_nH9*7ui&yASVh;e7 at NBfm%KQNGw
zwx0z)NyxMJ at tIFzgWlEF+sTuFrwFoMqxIBWU8p2>Jq!A3D7P+HclrU^dqXb+&eRhz
zsZ7LVD!C8FB7e9s750;mRZZuy#PpV99ZMv68<2~MgwqZF_3i)M3-KO>|1<w_zLuO%
z-mhRc*5&xm&bfWzkePqro`0a80Q6t(a|0{TueYP5)_w-F!HD;Ux-q!dI_On9`H{4a
z_B+1kX<JB4t#eSfgv2m8XBu|#>k#j3fv=z$G1&~XYbD8%anur<%e!d63wF;X*bz&(
z- at c^dWkk`rZhkbzKk(SP6^?6&FLzKzW=B*dxb`UcG3rDe8(t`Ub%RROL0OpszO?AE
z4F#gP{QRj-)YJris_;#TbjMD7F5 at 0T;LRoz%qi>+teFIV8D!2 at h6@bw3rx0xFabT^
z5;8QtLgxe6Lv_%JenH(#o&O}?=0xq)_h&rgJ1bG+Qmv9XXAK8Wha`UAHnL`Xl at L^z
zt(<SL75W+ywU!j at 7vZCqNCi32IrJeb8^D3Dm6JGwM5=rb?a?Ez;}CL&4e+xUy7f~n
z@&khPkz2q`p>WjVcm<obH?#^mf8=Oz%qD&Va`?*DB0l(@B!2&=_^ifw{xMb&R_-6)
zUq*9VJcfL{tcc at 20(%MfRs-sRmOYE(zhbQd*Mb=SfCR^KPF6#PyFE{C0Y-X%SW~@`
zTdvk|z6yE}n%KUp`;O`Z at _&@#sxbh5YF0te*wEF^n{<7N0_$aumEifJ<EC2qP&<LG
zroYSQs=+_?ICQj=kx`#K?vS~4G`4O)_MPs8l)|S)*CY)rTel)O=KFW(9IIL~&l9y6
z51(V6xSUUWY&U6?GG3|27VEY1h0KzW3+mO+<~xskFR=~~8&;*uHzWS4=gh#`?SV1*
zn)5eq2VHjxI;R#@@t8gIoX8l|Fsg9PHoO;&r5HK?i{Xc;m?3xD<cS*lPh7u-+BiiB
zsjFFoSenG9R-O)v{;iaIqok1W3&G)s$`%U1BZ;*HICUS`e9!U`6HnCQz2 at Pw&HgiO
z=dQ$ek)>E7&Et8b<9?Y9mHe$ZuEM?>eN>0okfET~z8LSn&;vdwUuSUCv at NJ>6nnic
zx&_}4W)8!5dGthlFUhQzBs{$<S{AJTkd+zB^|K&`RX$G*tc5~m*$ZEnyML7P-?i-o
zPe_Wz7+0L3k9)}^UMe+>>(}F5G-&gHw<`4cmq?)MRDj<+a6)1^Vmb|4mEsVysMABM
z;;)B%d#+ylMy*|&5zEwff3JOYg2Gjy^7J*TdUL0%PJ2&RUC*KG#xQ<Czn6u|mxx21
zjf4klBjLdUzj_*(8?Yf(2K8hseJ><#8+u3O&ZkJcx?iZ3&(B9~043o;>nQD(EZ;55
zMU0imrIq%SDOtXU*R4EKL(6*PS*=^)TeSl<vDYKcl$dGJcJ^xP(0_uVxgbDa0GqE{
z<e^5b(=pJ~7ZMI^d{76wJ9atx`d`s+=8?MC#8;tRlA?Y>2`;vWb}(#W-_*oa#6G5N
z-2Z3Wm^&so>XUHi96n_7uk|8rcb+ttJ4TdA^d7&7?t4e&Ts8bB&OjSad?$$nyW2v|
z>mROZAJRQ;)AdG<BR4AMPl0R|vj_f@#O?#y?+L$D;ymy>2{q?QKHl0(ME4GymAD#u
z;KxA)%OdpNtNR@;<ae0h+xR?blEZ}@JC`kxDMgG2*no}q=7N7|rYbn9=y`{W(ZC*N
z)5GrDFERlCeUbQJaIbIp=AgPn at Bpm+(^A-}(k|~eY0gUGOBeDpasOa^mIoeQTS|DQ
zw97f~xN{o&8#MX-r#0=21~N~=vpDqxw?=b-={r at Lqmp><FZzWV5X5MHbL%3$Rcr4F
zkz=I!o#-O!v{^A!TIzCN6*#8ym3y(4X>jZxoHf8c%g~lV9Dj at OKsv_L^LZ=rvsl2d
zhJLsx%0!>E(>{nnEozPh8rDw4bD4-;3yj@(>qYQl9N?RQLCjLfiT{R<`HwG@&_0Gw
zX&=KHw~s-)oY+X;G!OY0KBavOYyR8E(0vE(xs;YMw+6PUvZILGZr27Ri1xT;p$7g1
ztaqsI%!?{5PCg$T^Y4D^Z9cf9&L;IhpQ2on_?i33F~ELe&DVIP++*)UTof at whl}_J
z$Q)Qp at H6ja=xN*L{hms0vZ#o&(c$teq%Lrm5F5VFgI$NdxkR|SaBLXKvvj;m`wrB^
zcd+afKi}~#i|C&p;Jpn!C#Si$1v=F&*frp%3XZv3IAs6twNu!C1#8oOPP1bqjyuFS
z<5&nhO34}cB_#1L at 5ePSllRQ^wDuACTTp{qKT^m5#Ck4gT6Pbe*9p73590v2$`}*p
z$r|h1m$=&Z!rDtXXP={=@jJOE_+++f*OPIC@%5so%<Wq^W~RrUp<BLuD*f!iJvux)
z<hkY?WJq*M+NeVEz9HYEky~rzY;=m*5{&hkq>W!^vc$o<yW1P0v4%!veeXbD_mTPy
znhQLQgwt%jV(TCMGR9WB2e|5d(kyhJkywDw9MYG-AW7zbe74!WZbh^?WU7^J?t(vM
zLArOOD>ZeBH+0;i5xPNQ$Luo|#!W=cwh43_(H0YMJAJSTM-#mn*T*s0z&8=S^>wUa
zGNvn8uB;3bAm+m{<JkVwGVslM7Cy8I0?XF+;GNWBd_6#W?m9-O(lX%-(KMd7GEK;R
zkgf#}+hSS4%a}WVsM0PY9xJFx8o;rG#Gds{#XK3ZKZwr0e6xF8jqR}Y;oL49=fpAH
z#GYa3A{F at V2+Q?}CpHZ)ck$}}pH$|trQsE!dfSr~yTZ=tD^?UBuO=%vs>^QL#qGfP
z-EKP*ejF`7->!|zCu7v)137UR?fjMI39K4T+I%z;e%ZA*LWO5!c%HlX{(#(<g?ued
zV<c)g<5_g)U`r`wYl=fm4Mz1&rj8{KGqPoSclqXx&E=))p%c_O@$P}Gal9K>V7>CF
zPK@>akGLG?uh456$$E@?p7#)&kRyaTn?w#=L at f{6r-t*@#CPX-7q~H+V}h0=O62X?
zi7dhUIVI9?laaTiH0|P>OAGlej{9*1qAlDdqC%D?qVdem|K4v$0+{nx_Q9Zo%RV;k
z8j`!KlA7x};tFWL$iZcidI#ql^c{UJ?bn5UPGlDP;<5$x{LseBq>V(L16xb at 3(!Wy
zp<xGMO at QwK--F;=c22G!?X)9*_9^&Oh<reM78AdZQ-XSNia5lWi&7DP#u()8bI@`Z
zoX5W<w>D~dnO0g}OX6i8`b|>8SF2r4baFm<2k>XD(PNIfYXZkH+JTYOSgvuaQCl(?
zG2?dT<2?P9&H(Z*M_>+*WQuuO)RJ`TL{61KXXI$GzUOLYs$||}h}&+1O>s&27&9IA
z!Ml-|XCKUh3|bpd-%DiCMuC9819L*&v&$l;y0{mte*)L7Yg<Eno=YQab6whke&%R?
z6a1|$&eQO_=msv^i%1LzYg8QBVx5m8wUE*0WwIRb*LN{H-juks5u_&22B#SMbP4jK
zb#H8N0S^Q$B(PSDX5<6kk|y$NkYki{T*I$MO%s`CH+$ugt>CTH-N+nU%}Yfr%J!!w
z0Cj((qe%<_*IUf2=3$+*wUf4!8kfLoHG!wL$W at fFijoBEu&>5*zUPvS(WFTFc5|;E
zS;__<qF<DAE^N@%>~HK-rhIJ=A$<Xx=wRYTaxLe3ZoNb^(_K?jGm~#t>bb?%w^Zh-
zrJbdk8DW(fUE_0lfz71$vLqrQcXfa%La{Z*H!naRQQ$s~U*(Km+7$TH+9?5*5sLmY
z<oxW!d##T)XS(pb_3#TRP}7pw2GcMnfLVh~THCM-?<!y^8G9qBQraiDh}p{1U!5QD
z19`u_r+9ZmyGV`T{$9M(o0G~GdV>Gbg7-hpVxT$qwnGOPhu<T!^{SLfyM6O;t&!pN
z?mp^!0d`(aWG?(bP3W_4MQT^t#9es)1$=Wr<*)P at 5XQm>;^3 at v0@H^4k38h8Xplo!
zAlix;zmuN}`><KBVC at j0h9uL)jnpg1`5ZRe(`F^taHMxqpN{6tE+ at FX4t^%Cu>%<0
z*7=Xyl(4I-u*O$8(s|9!AFxJz1=}i?JTum=nW)R`wjEAxjZtacV;3=~V86auU$32#
z>6IYO+!8&@dWomBx)84~vh_2i$e&p=cM<HF at sO7zLro1T^<UuJw-b9-Ielz;_v_ks
z!H1?;WKVk+d1*x%U8tEX54A4HJ)Ga~p$U*pVxA|tbUu}qlEu<MAM|?~{TsC+*N&*K
zhU}clhhM2d3Aqb<c<o4&j^8M#=eDzpcugj~%RFuutB%=fYhBQ+O7ZnM90UBDA|vjN
z7}sva%__cVIx~j1)9RAQUb3 at 4V^0G9AeM#N<SLoRZk3b??om89u4Tiu_$2|AhYCc3
zIC(&2gBp0}D&!s&IG!Z)%9g`)fh)%V`8<<Dcwf|yr<3ntZS{4)8oRh5c5s_u{w=lF
z((^IeUW1(USn~aOa0+33?4fb!w0}V}os}#4jK9Gi2 at K!I|MY*T;|i%6L+pswQ0aZK
zLqY3`$ep6ctsS`z`BvAIHfM`1EptOyTVrSUMf9(XDJA_KeIsPj`L2*t=etBMQo9T5
zZ92HJgjh at cFuy;s<xnow^;~TRYTKsB9xEdE^$=6VMDGJu+=YF>Dr*8DTS-kpA?KYQ
zJ--@$q!4B|4_ug#ap-^NSXC>_==0FdYzmdH1MlxIm=lmEs6#^qpZ8_z+X7KbPzHQO
z9nn3$`j_hZ*b;sfvxuj)-dO1CI1(Aft6comST0Y|_wwteOs at dRMZwIRlmr#W;{k6O
z?(=CwArE{8!N9`c9euOVfPOg|E>Kp6f`>2EaS!)<V_Am?xQZg4#_6*CLP<$K3<swO
z*CVv(v|2Yc3VP0+ul4z!?Nl+R65JWdjw3{uR*7r%zN*qT$d8 at ezo>d}p=ef1tUW|;
zQ`V`Izb}Q}wqZcW&ZR!<H%*9t1NjUG)u9>P`?UWWmnw3>=J*$4K;fJl<Qe+E?k>@O
zMB5-g1pS`94zXp_CkAis72aazsk45tS0bGwBiDmN at 5n(aVzJQh(KzKQpO=CvZa5vA
zRC1<SB^xV1O}uxpHDgSn9$8}vwqH!nflT}&L+Go7Os(qBc&0h?!XUFT-@|Ah(vN9+
z5^sjC7()8ULyVeIse0u94s?9Kn2P0ABS#Ci+~7}itwjOqXk at kv5cfM3p=&zn$V}D%
z|6WJ(4D||6#4+#O)Jr*)R3Y&fUOYa4+KQ~46xrhv=nt^z;VS|M4zN0?AIr=HKOeY5
zN+*fZYIGq7uWp^0b9FnvqQeMzAmB-b`bdRd!Kp(&c2=oU5*zR=r%t5vUJe^5ZER(M
zIV8PbPhDZ0w`U|9EmX1=x&rud-F^!2HLJ6QOQqHx94GuSu0$R;1 at dbf-hT_O@s{&6
z)+WEs;nWpcPbok?oXkpct|5PeV-8Fkh)vexdWMJBL)@dzq76sgUo!tl+X<JoPhn<<
zBzC3&>$2b at aVW=<PsYqtt}Q1G at izZWNqWK&o&RBST(5?4{^8hzT+}ct2<H%MJ9L+m
zSeFq~-}a*=6}7Fz>~9|4lRo!Lj3?CQ!I-KpUCcO-`iGT0 at UOlxN)qq)y<b#t)ND at +
zc$T^*gQNDydD&>aQWje5 at gb>KE{g5EtQpPAty{_UaQ6f1ai+s|xX8=xg-;h;J7&bQ
zehfOF_(PC0dmZ!+%}^UnL}oCXc$&lTgZ2GD_sP$J&1>i56EQGsz5#v)<m6zytixv&
zv2%RauPITT3 at qCg2KlFeo;}wp^b5q;`=PNM{1Wovz{sur)KUt6Am(!4D#(a$81=|!
zp#2B<j`0Q?;#=6W%VQ<Z9Q?m*Zh^~4ucHZJC6<F at hoSy4skiV7_<?64-X6gHsj}n^
zv)DCLktS3f((58;nr1`>1a4ou0r&dyk6i^V%%jSa?DXJ~p*bfy*kapHHKhfG%%i at E
z!VXocNCvECUB9p>4O=m`nb;N(+kayvK6Sto620+DySoj at E0iSMy^q)+d|h~kgu8wG
zz-oW2;mbO0ni$@7DuZ{DDjJhA{G?5qF+5VjJZZ~U>myHLyHy<!S&41B`f}tAb at IY{
z_Hb3z)IQabsS{MGV~naJJB_O*1ZlH>2+jReyw}SwD)6VnzzOh{f$wq=vywMYs3G&4
z!9)!6Ag`A<@?eI at JUXT>Ei=ZqzAhvA0bh3}es$$1@%`mV2M=bfIjNL{97lfcIiah2
z>(}AkJHB4XpDGkkX_=(XhmI#W2s?t^AJ&q8LuAN|d1F?FMP&}!uac_F(Hn)p^iJ4-
z_aRW%u{FuRTrC3jp)%<g*DiGyd+R3?OoEUtp*oS;G>lbC#d<Tul7h4eQ+<^|hnmAe
z>l=c>y%a*d5BXoxpF80 at Hu7vGvD43~Wus%bnm-NX8UguRy;qoX7KQv0Drn+X3}dCj
z_isL48nswiqq;eYaiX6RU|ln~?*r~mv-3)_isY#3%epUZ{}3@={ZLzku{EK(0X4re
z8a7t+pBQfmLK0hF*1c={zn8~{MlFf`vm9}~4FNg*t5i~vnFSu6^Mat1=CJ;1 at EkP3
zmy=wO_M`yy31q7Nu^W`~v90`r{kscNvxb3}r60MZz-5emm)8=Ka=t56cSuZa!S$oK
zHngk4N%>D0(s%0Bk*^V3eZqhqvNalZeo=~)De{|uIrcSVMb at 7N@R at MHg_Frvlkr??
zP|7A10|z>T*j9`)TfJ7O!)txw`}<<2RPI6yQyV)Kc!Cz_c;x&&_<mVb0)KzB-vr>A
zSEANp9qimw&I{^$?5!#4T1m1lM5jlMzq8^shQaHlGU)C(-uhChQs#%+T%)s-^&z?k
z<p0Xj#olSwi^;LQdl=^tXQO&c8Rz#3ydfJttLoL_`xbX>KlIWk at z#q6bN&6?*KW|_
z`xE3k13L+CSZ^VD56LR$?IabAA5d^@;5MXy6)HEq1soFm;=XHv&3f>6Kb^XzC$()8
zzh1iN>}MVD4+I(-dVCFqAr^3$&#)p7SPfm{HTt^wjz5y}2fRrgfVCUIog#&NmRTPp
z83~um#O+B%BHg;r(KqezNutk5-WqbJz9M}@WRg!Yo$IUPw~+Ho<;ZWpAWX};!5g5a
zk(x)gZNzs1-)eSnly;17)y8G+_|4>s`aQ589w2955FsUNTX>}rHR$<@4s(BQQG!P{
zFt-`>@dwW0*}C&I0#;ty7Sx~EjaWzdTKHHtF3TV_>5=nPl;Afp at bJcEgbS#MN&J!<
z!6%06__^(gK*PqT2|kJB&GvwQt;nCzI^d0a*QE&h%1HajGn3zFOIJumsBT^^;msqy
zP00KfW-Mglx15i`%eWPFk+$Y9SKb_3JShjdr}(gDim11&pir|0 at 3RATBLlevg0RJu
zzqf+aB`5fe(7T_+hfBT)4Rs!I>tC_(@y4PZ*_&GmUEFrG&q=pe#3uE#4CFVF{Y4^@
zb4IogkMV;Y(AhifPssPBIA20^!p`0z at IMv#5l%nYjOG55Xv|jmL(CSj3kc3f61#2#
z|6B0xY(&3~BQ>4DpH>OKL9|ms;vwXESW8pYvQb0+s-o%qDD>-i^!3x22d~m`rh{uU
z!BYfYgp8F>c*DOt9{2Zyea7MzItS3!v)n?$jYf`D#|_!oe|{k&{_`T=xfQ at 7!S>(y
zH10dKLI;eN;5jvHX-NkB!bQHg&U8H61$Hv-IfeMP$hrqSoZV7^^Jk3DQQIfWucxvU
z*{S?0>y4EXv4rSpubW`o{Dyq!C^9Yx$BC<Sxfys-;<xI(F2HpUrKrai at pFRp+7sD=
zX-6oZp?7n!Utg5KXdz>U)P&*z3n1#?-Jo9Ny)|~6?HS}^>?iFd*ByJv29BBY$Xn1N
zCb{ux3ozqFGl)MQ^XcV<yklkbILg!1 at qt&#2?6iu6}-<j%EhSmy|8hauXN+np}C=i
zOPSaX=R%zWkY{AP<J~=yGgLI4TZngb)o}~|O$Y9Y*a*PJUGLzpM=k*u`P5d}7z%3M
z>c(5%uT8q|30oO at QnDB7W3&=3th0|r%sj0{jRDj+ZBx}wCwL823OMP~MwNN*2yL3G
zc5X^I85}j3yY<Dm)H_8li3tv)Ja==a_3q~GtuZ0rJ2!3ax~<`ksx-YQ*YDyzU*)+b
z^NwC3W1Jv4Hisp!TVj)chh3TgJ!b`UjxEqL2J!!ohzaW$$7uapCy_mV8+tZ!7bzFX
z+gm#F;c<^Y?mq$FW!6D|DddkVSl3!O;MHI1F^AW3xgP7<ynsC4pBkRJ><Un(IDN;Z
zq>%LkIrSRwVw4Q!V(J*pz;^70?!Nv{7cd_#U^$dLIwoo*_&p_f{ZY#-?LYQ|x99)`
zT+>3Ir4i?W7oz&VePy8!aPkuP`-x9`vDHOY1KTuWX(auBHLyh^z+Jta$TBPNVihL7
z85}`Me0G>jCxC~+r<|ONXV){11uy&8m+ohKbYIAxfA$eOBpEWMJ8%1X)OOGd)3)hU
zX8%&u>MagQ1I|zh?#Lb1x723*R|We(%G_g1W$qrrL6~eig~&%G`4<j8xd*n(hqj;6
zTiJ*y*rs?kQE|KtB0+-G*@ax0xdk$Vm;W>2`czr&sTq?*hJ<EzJ8#Q9Z^X#Y`_1-E
zy_EPnaK_;hTVarB?e8Ii)-L@`a-Ye0Oi9~%W=Gq`po43FhySP0v3Zib=MGEZ2uyk|
zSl106Hu4U;MeaUg*x)~Gr)7T}13v2${me_GT^D$3*MU2#ODKE%Zg*bFxA@)-95wnO
zB at y2*2xVg~#ytbxiqnz0Cbnss`&ib^xCz*IGE&!GVDiFs^h5ouJEI@;c8|9~J<$u?
z`!VM%!7=QL|M*X{I`fV<<n!G%CAX)&_)KujGZ_sf{!;KASZ- at xln3k1-m0rxlQ}T0
zKX-a9 at Br{3C=wBm$aeShQ7L>?JF(6fqK{bL>dejTCAiDzUuhg=S at aQ+U;||NhSuPy
zZMX5<1GB#V)Es#3)AvLK13ex2mEe({@HL|ueRtgSHQ#LQTxo+I$HN+_rE at oBC%Tvw
z+(Pt~oN0=)WqU#Yu0VU8l6ccMNe0suQd0*!&cOTnmjlzPjJ|!>TRjrv<MB+LIuKh9
zQ>UIkRwJC3c}cxtY_)J53qC5ypnqEt&p_QF3GOu$yl8UfJUY)|Eq*8AgZlBd&CbuU
zA9=9wLme<(nIXOMi)A`97;V{$v0V`$4lnn433;D+eO_-3;P`*T2HQ9Faht(qMqQH%
z at DtpKRN~ws$eeWWgl!P+#<^nrw^t||af<%$q&@4c+juuot}1Fv-?Fgw{w|fwL~PX@
z_cca#L`rcDqx%}|Q9=PLg;(RVLVd}%3Hub0I%~U7KXklCD0}LX`*@)UoJHN}E0UA?
z0Y6jJ!RMgfA|;C9=Vt3H)uZ=Yj*k8r+d7>4=ZR;SfAMmsHrWLD>|%S`7TouIX%c*S
zqx1 at lH#IQzK1q6vx0XoV$uzwT`)Y-<C$n*G3BKnGWskjz at 1;ZEC*V8qbrIhuX<=jf
zfrXFckhI*_zJ#1?kq;GPIm&c_1Hg&*OX^8<QIVs;CNo-|;ycv{{xu1Anlrppm3aqT
z6`AM<)W{hV>v`PT$*b$3Ys%pF9L6a!rUMP1miNGR*w#IC+~;u<(JvCr3#Q4tdvfU;
z<T~6|w7n!!cRD$!e17l1yWoa^txwI1wvzgR7GcWODEN;uZ=fyj5*zykPvA7N+;ybd
z1*l&o5f!S$!u|Mv1pLk($m1Um3_0;*dVnh~7Ii#hQO7fuuY?WUk}2eEq*kD=k-!4G
z5%rs1=9xG;wwNcd{mId*%;nEOCVOpu9=PlY94*+u1hy%E?|*gkIrvzg#aa>N{F?AP
zk~(7Sonv*ViC)qM{&L&B0web?jEQujk72$wkoiW%ZWcS at H(zKhCb5X<hVrJ(exWA2
z4EEJKsCgpH?Bo91NpcQ!yt!%_Wa{Y6(?WHp6CqRQ(lRM_v(yovBI_$JC>$;4P7A4Q
z?J9p781MHt8*$8LvUZ_86JdkrUabzuC1V!+w7em{>efN;=w|A@=nA?&dlTf=ONh^I
zpPSZ^|JF$t{D+~Hy-IMqZD}Y*EsI@~#lQ&NhyPy=|G#43Gg5EP=RM?X-4~|4DRq_5
zInnnAwTvcFq2E$G^WbV-b3D!&bY2Ay$}y2_1bpV?H~zbi7+F!SFLGplkCgWAV#U+v
z>HL;H*M$Et|BgkU2A^ZpdXGw*G(Y;2czZP7*JpnJFKxc{Uv0jIHs5-r&A0wPw)qy?
zY^2+K;(xUH7TRq5U)n4SJcc>|;BSG<bXq&zW1e-EZ|=F7WT0i*Nxm3!?LH4UVEEyQ
zd^_e01m5%|TE6{(dC-h?B+2wD=Bi65d*Wi;v+jMZTGPw!eUHB!H+kr|Ak)lF)yKNH
zshG#!xYlt|UECASOBna}$(n<FbGr7=P`wZh$Bvpm7?TS^NnI`QYs<z|lUh6Hb_VTv
ze~qQ^`;*R|;lQf#Q7?}#qXd%pUxMLB)_6t-$2|S9r4Zag`(gK&AYM-Uq$lP$3Abe_
z1DqIs6To+Wo2}>FV4HZol*S<oHBzZmJ$FU<O-m|ubh8xyU5B2<^i2hiaAtcI^2DZq
z<M?@zF{};WpKUaD*3vwm+Ye_26(p*tEp$FGo%>rpd&8*m%cxJh8 at a_V5j%&kB>u^Q
zNt3gDFM!je{*4}21+d%u7aoeZb9SeC!Z<a2CFQ8inltJKuNX|vgx|T(9!}0BaUeg1
zBMP!*izL1!)qeu~5%Db<y#Cs0+)c`o4XK4URZ>f7NS*TRhK$0*4ZjTPovEbm+v#TL
zy;wIX1NYD1n2{Bjcat#hCV at Bd>ii1Z*?}#*DAKp(k}$$~bEW)Lm~Ck#PYUkVYfdim
zs=PMCR{CH{c~0kL`853YCfo=Mx=0>0c(w$!(;RY(4&S}O1v|qb4Ha}7=dbv^gfcj*
zp1}Q2-Dc+yZfa4nAK?`&05?;<^=|jh`Oib{?FL4#m|+PjmI0duo;%b_aOZKsfBqQh
zFTa}y;+%3JYTYS5Sl-X{<f)m7JZU&;Y-DbWK3y*HsL1qR-j^<1x(s;eHOPg|t}SA;
zi%OLN%qCzdzz0%pv!He=FuE1UL#_dD%LU{R8kV9afqxDiBYcl98F&x*P9=&%>wjEO
z1g-|;7os-F`b`%W^!dEkqw)K8;84P1u09gF#)3r1XLYt9`c!!yTYwsO>IDPr6vYm5
zO~U!ci)z at Nkb}Im{167OYp}?2ovC9qVXS?NHf};2lhF6y4(Jm|?izAK79>&~F66x|
zMa`ekFX?{LLC1m)r_Vz^MK(PzZ~r|n-v*B0FQV5x!rKj=a)OJ54fm!<(2Y7<h);ks
z2er1a%J2dq`%TcRv!9dLim^US!sju3z>h`hZn1uVe)Opoxl+tK=zs75T06UMmAwu<
z>Kn{SIpIad+WWW8B#A$>oF4_*8VF9L-vSSRa22^-O-{$kk%UJb at _}$|Uvvh>d5~Cz
zz8&-5iF$Oi<HlqDTd{_gn`XH8jT{#DynCO$#q{FPakt`L2rSzoGa<+J(`RtL9lXo0
z5xYETBJ3874fcVdzI!C^kMIOd$%K9KiD=m9Y>csTtZV7cTMNYzm(J#a??*Xg3);dZ
z&9ITVCmbTwWiTwAMR<hr8(B#Y`<?KE4>;qWA^ee<9k8bi{BxNp+$KuR at fTgd8m(uv
z!vC)3YER23aFp~v?YCqg#hED-VC<hApLf8M_ibS=uf*{@;RFGva*0z;=3xIkzuBVQ
zezOO3{k`(D6H)KOM at H-*?1R3}i3LUiI8#!)+wV5&L`v`Yy)@35g}Mx5!>0`vaW5ay
zBBuROwAsQ(oY8+uKFx_V3^}^RR1?+5%DXWUoHjB13BZxOHmU}716~~`$rw&?m~$51
zI~mQ|j#?jIm%BDkbVxT(3ayL~mwN&;Zalvi^#sg);kFFse%oH=rLe{Y0-q#YV?=EU
zd^+zlP63-<!(;Foko#HZe2wOBsiJG|9zYCm|K at AzI$*GJHt%Mp at OFk)MuS8B{di!p
zsF2DNJ4tRHa&Sw^3oMyb{^mcecTuxfu(=fbTFccq&xtr&3ASC>mSWqD?XH4CwqBIR
ztP9Cemt$Wic}ARnVRN%%{pQwCVY|58sggcr^nU`m$$8~2TQybAnOE*mNyixd8Nei@
zGo8E)XYgx}yD at xT+pHa4b>R|=;sN-6ZXidRt!+C?2^cMdMw0)?P9NIt9973N4;sVI
zTkrUf8>~is*V(L9gVj-Fn|=p*r`F4DnUsK?PakuW97F%N>ft%POL1-EYw$f`Tl88=
z??U3MO31}Lhi~wMtD-u{wlk#P at O<T+kd;aq8=U$?p7N at B4#IZ|eyP5oDVu&9W#oaA
zU*?akmB_|BMsTDZ^3Sz)C8$Nf3pbr4_&?OvL>)z at AFlbc0(H$1yDx%0;fEY5)F#1x
zIr4{QGX>;6_?-m~t9`rzlJiX4Lh!3m{@6boa at Y^&?&eN#D&Sjm3DYuW at J@>w_!F%c
z at LwN}`3sygS>!l;zkzM4H>ulP#q6<}`wF?sds_+${q_6}cYP6WaiYG9)>hNo&;1eq
zSM=V(e;Sf=k6i3=wn7riBz1|vQ?tRILHExrV6(N3Fy4(j)8Zvm+Uglor$Cp!D2esD
zt1f5j7e+<LeJVTnGwRHgtlm~rtZYp#`Qn9xZ!24WEL}Zn(7<Rqwjr$8QmT{-i-GAF
zs=I{tTA32g_o0qKHC>-Im+?zqA^e2(h($>T<)Mzlcvm<^jOWSWzV2KOu5_(UgEnhX
zyWNdjsV6?gK{2V{4!yAWIU}zbIsR^cBmQ%gqmM|e_ao%_9lMrD+o4A>Ryt|y;DD$o
zsVF$=S{wArLg-IQr^A!P4$sj2e^o6T-Vc50H|SFSL*I|ZO%2nXu8-8UcAH)zdQy at O
z`q5-sKe_=~Q6Fv16htEjG<tycd0y|{m9FGPSTA<(NLQj($tC`Vp!OxZos#an^c|fZ
zz8&3{(y!oi6`vdDVPkd<fBORP3O{#xdl~002^tg8+EJWxZ!F at 4$VJ%>Y>|R&MXUIE
z?0VkWK*L`K=Qv!;#h2Ol%w5u<;Yal7EdA7t&fK?ixf_GZmo(EH7bg4`6YS at ba|HAG
z&LY$n4Tj7L_Ny9_y@!Gdmh5)d!RWq)w)V436Ty?}K2}tOdnozq?Il>(%9reR<3;%!
zh+IBaIn>`h{ra~rFwQ$KCocvTGkx5!?tST38P$-Zvj(v4rSITJ0UMc)c9;4#|8 at GX
zfW*1W<^=6ovIp_|6TwjxBgyyDPSkfZZe*7NM?cmmOxq$sJqW`MagZnieuW!s^j{gq
zkdoBK#QBrSIlxcpf}=`L(0oHC(pJ*$?yc!NB=J8+x%+;UkvkmuG4SicUtWWH6o^Zb
zF;SX}I3MA0{zVcGtrI#A{K;H?jy{Lz&%Cqv9C2QT4YECXG3v1kp>I|X48uAEoku^%
zQ!P>_X at PUG5Fhn~Rs4+ at KaChmDeNX&zte&1{mccA1jf*8%*}qRqr{GWEA9oXt=l7Y
z=L=}Poa|d4_bk1(`eSWn;n<t7;kU$%a9)a?ifbOn at lB`|Yr%DYflV8N_BUq=QTHMm
zoahwrDrwQJzo#cOQ}-mXFT8`cz3s?D?w&kc(ET?53|%kgry#B98Wj^RrgPF#iQb;H
zI%qC%<Rm|r at OD%Z%#Gh-)Qed>pn*Sp8lU)v4&U~KFH^{C1|BtjTdu$Kj^-tTwM5(=
zoNoA^_H`m|K`^n~kaL3EY0S5zF{NTs1CQjEdN#8K(QK0`*{Ad*!PX^fgQJvk(odyL
zlK3shxRJn(=HNN|X_<MCth;yy7V+J1-U%!_oOZAyxf!*V6VkqA*odE&mZ9}Hj^w#q
zLf))zfjJDZdVMtGJe~KhYa`grQ1 at 6R*cSSEV~-RAe}Wvcd(#=mfU9e2)FvoMo(#=z
zz9-Rycs$9eI~Y;YAQ6>FVm};@n$ty|>fornw|h!RtOb3w74=fiJnTorgeXb8Fca8@
zO!6J}3$WYTG?MQ_esllqL4FglxjPr7$R=0DPoWIZN6RGfBUX_3Wm_Iq_{!5*cPTsK
z0%Qv=+o$mvH|PV*;DyOKwMItOpf^i#$J<}pRSCTF!DKOF7ul%cupPB?qQG6!P6g97
z>jF#l>@P(EtSxsKM at nrU`G6syNtyn};*O6Ark=#Xk)vM9Efc{$>HCq_-%vqtu=b1y
zU2R&BC|OQ&(jVrh2gmHYvs7Xuc!YjR3%xgkJWu?`;IYplxPi%2iLW1dYw5^)O98*#
z7J?f^y}%4r6>zCdG$vJe%#BHXE2OXgr;z59j_^aFx{dky=DJ_0I#uh~R_GBaD%r24
zs*LUAdph)q43ZB8{W1!A?y7};?5n(*yWW;NlnLwLfz2hz{Y}BUebQnAe?c^28fB!P
z#?u&4eH06r8Q{u4f!u!r`@1K9MSc%Ffwt$7x?725?p!2dw}Bsoj+Z2 at ZqPyx96{z&
zRL#{i#89sxm-Uh`Hfsi#<FqjHl+}akHJlJxZ-Gb2)z1Q2dyTA0;7l>beAgmQr^j`F
z0xnrL`en4yh`#+D^_`+=48#836gK!M at jNuHJt@|nf_6v2?lXX^yYY+|94bQKM^lIl
z(L-KoDTWQWO*XE*j*R6rJ$MF4{9_pV2RCOCxt1ipdFc5^R}h`w_nt_D8WI;?ndJPz
zJ;tqrc>b=3F|ZIa-{bK9TQE1j5(V=W at F}dM2v7Bi<<)K<ntd)XEn}+!PoS0+^y5Dm
zrwA7T^6<YY1Rtdv>*txKSJ1u%)NiI`*i^mLE!W20NYc6Y+10ci0lCIXCpJUMcY5R&
zefkvc1)QJhRc?FLD;5TPg75_bhfucec8??p9JZ?wx3OKr=PwcR at R@evcLp!=0qz}O
z-(7g;-;sG_b#XgH9mrSz26OKA`1GI((W?4N=-vv<&HE|$Mi+JV>fUD+L^QVL(z*Ea
zSz`FFH1=Y5jy17mksplySeGcG`2>*bwur3XB)^TnAw1R)AHEKLT(7gTu<>}tNz1Q=
z4a4>cJ3DM9wzHRqA~!?<x!;0XD{|(Z6HAz7;4gGd$P<Y=g<4_fJZ*aSR at FRw{}~wf
zgG9$nq+sJ?E#TKc-^iHiX(Q(!fIP3A3Latjk;PMi>4DADPV$dM^H|Yn-xpY;Axjg-
ziAu1Ba6HpYT*NR=()~Y3uIHFft{FEOva=bVp?7lb#KZo7s+#uWVy!vn(#vR_h4^Ua
z;@B2Z9lwUW3w<m79)JboEzJ~0H&MZi=BuA|252J!6r#_dk7$=y`Bo*a0JgK_SV6xK
zIJ3$Q75Z>;H)}b3QGxi6tl`c%MAolqF1-xg85{V8XX8?dtai at 9`!bRoip(zO9Pm1~
zc&hO}Uv>Ji at m?Bab|dlx&JM}b35e%E#g78V$eh6D#7H_vWjf~_)HfmZRLS_zp#Ih_
z?PSP&#1+CRn}L!7vqaab?;O-lM?dYuJ-+4TR+=G~JHTnQ5L|61-D`?=I<Xs(^J3t_
zr?zu1^vh28u+XRY-);BP*Zl}<iFOHDOYq#fHsJewHWGaYzgGoE?e83bET-$iY4}Us
z*lil4uX4^=Z6?q7&35EEErA at H#(i)Q{M7{aO>%{TV<Pj(`UrX9jkP8l+gGvHh-s|z
z!}aAk$bjeY3 at 5oyg9jYkiYzg3J6DMx82#pr>&J^0AwMbIv&Fdr?_-{4OB&*c>PwPX
z&j9iq&ODI-`0(j?ALcce2-dEy;YF!FAx;4Nx_NXEWce2E7}OT9iv%+!f&Wd3Ix|uB
zRLrNzlx)<$ZE2KT5?h~#-0r2^8mkMjta{rK=TVMSE%%T|G^z*=_Jq4H4*V!8_MZeS
zt0bb{@*(e#VFU0vxq}*DPzxb{T<&Kd>hDVG at N2*XV7+||&-fHAkLUa&kBMK~`)y0<
z6fv&-1<BFFyjcO;8+qP*j3I9FfA#~vf~>8i7L0aDf%&6UGA8&vR>FUw=Pe%e=Ft2p
zkYB6&UID(o4DYDkrb4bg^4}LY|NrL04+3u&w-SAq&fDO8*(29E2XeapEF1pJ#blh&
zYseImrv^^8GH^|q-D^n3I*u-MQ8&$9H%Zf=n565MZPRU*jnx-O6ZIZa56wZ at B+aji
z-t8m??)~-Ecd`C_>MgcYsAE9*EdIq;!d{i5f91XZdN|IK<wCS)Q4ctdQCm_wjvgD+
z5bHk@(P$|Um7uToBu=Mwy-D6eysvW&Yf&3>3yz&c^BmkG<7n$QTwqcXSM`=Z%y$D$
z;41E0P5S(k7oBsEuM>f_XYk?wd<n^KAn&F3GIE}3alL2gdwY at Gi=aK=GpOs{vHc7G
z3EXnNjO6F_zDV*X9^6OUda%~5NBg#;ZJu=7CW6Nc?ccu2e-h69c+fLJ!PT92pLdKt
z at 2uVYPn$&sZ`5l{^upXxVm>93V?`a_h_$1i-bLH*(e3U-E?*V$Kbjr)(Qf2_*stN4
z at Qiq-qxi3;w2*g-eF{7^b1;5(d6%TEo4d55nv8$`X_6z(l$>RR=t-Wy*<lSO{GH@^
zp>xV81#6$E#JiF{zUF^9zLakdOvUjI#8VWU8TM+le<Js~r5JPa1E*{(utHd`Yejm*
zzDDr#foC|rrljpU>P8}G5Ap`wt%Q%;J-=%Ah>ZRo&{dloOA^GuJ8~mRPKxn=!~g^9
zBi1b7kknYWhtoQ-FFzOSOAFS!)1rCH&DT#YZ^Z9rh5W>HrWtFxAJ+DLSbL|Rn9Z!^
zw(@AZ*S&rZuY9<EpPTn^{TP-?`vI|joN6__iWuKVNgAvl?_m9Ca$dr<DsjzjT-$(c
zC$33quw9}t$vKTie)9qy#&n0e5Evzs#*SPv`?C^Kn{fFH;pc+(XTJzc=u5~oeUV_b
zN1&DsopZL;=K#q^8>lakjgF?*{*67m>Fu}Rf+xDbTB0ifZ at +=$KV*(nN5QU&9Cl7U
z5!-RYUQqjDJ1r%r^UaTS1*oF{&XRW{7d>1rc}=`_QQe6TnB`cv4JV#q7NY$nXuA<>
z`EK-0SIU*%4}lS#gE&hE<J3SfzK`ac>jcnAGV%EtpM&_Mqu&s(fAab6JlT&#SLqzo
z1jAPgA29Nl5wASlqW?d1y?b0!SJpmWYo&!#gNm2d^oD>`Y2OmmI at UU!##+awlv1Qv
zj+ho|FIY-Dik%tClq6g<rxKEoL<kYc4NL at t5b%a5cu#FrAT}Hg2?*9&ry{o&Tm3yd
z(01nizP~^6*~!Vd?7h$4Yp=c5v!0~}Mr{4EesITNp8+h-`ei at yla_uV)29LZ036w5
z(GCvw3wd4Bku%-$G-MqMdA+kZo8$$GYdu=ac{{A(-|wC=PH+&_cVz-Y0lAO<Ay|UP
z#_Mp;FDcWZdjT_WuG$tnajY<9&crdREo9=@_bIT|5*_d}lZ?Niqd>=~DHiR#h4(jt
z&nWDuL+gT|i{wE!Ig8JO&OXFxycT>MW92Kt6*v*|LHte~1NEEB$92AQ{=eyg_l*5E
zj?O)5Tll-q5r*?Sz29RE$JhbZXn+0Fc$ODqs3xP+m;xEI9R5#mp+R3Ke2ycx4ahlx
z(zni at 07qJZUq@gRn<wpoZLBO}HgM|4oVTzy&rKYL{im<&dc;htns-WiFYoZ}aGcYR
z*rZ^;W8O=2hG#@`gfjBhw^=eP+@{P5X1m`d2hEXNHNplrj?40bG_q{OUyQMzGX06F
zRWEkc$trk at 2d+g{JNBj9tG@@ISao{)8l`5}slCMwtF3A6VL6{=oi-<~g<MPh%95_C
z26wT4rAtj6{jB=8Yr)^R&wHJ&w}zvx+3AYvo*B8MZQdW*PO3_KaVqlS!N+n$2HO{X
zH!|A2SCk8`!5r_8XxGutmEd{CIiFtu{!<YnW=_Q^=^|q9f*tr-aKzLAlNSG7t>b&9
z8EeK1cy>E0LY~8ml$y5k<C{O1&eJNb6IitXy{n(<jM8{t5DsIXDV0f?5~i7L4A?`@
zmQ7ZqzIm9tmm&F-nvsX&-eo$^i1x*$`$@lP<>BC-K<=?!jMVQ^8%@qxR at 7^LQ77cH
zsWE!jl{F@|jvI}8hG;Vat2kP;@s=lLuDmQ{Sx0YqOo#6rK3ymKy*_0o|Msx$f*IYV
z-c3P=uDz!1UAhl-zaf;%Jm5wveP#~o{|H^T?g5EmnYMTLGn#MA5$agW8O2-Y!(J3r
ze5P{O3ss2g>KZ>Ed4SI`s(=D*A&J|eD?{(Ds$}!Pv#KWN=nQNfQ%LTM^TJ6Ua5 at 9B
zNsPU11~t8FC-T&N>HSfAo~n}=nOnT&GT0c=-<Nfn+KVel&c3RJMb`|-(Y1d?-B<|v
z`X3vH3X+kJD|y2Z18jV%lJ2(JdDlF5GQ~2<hFQ>4OPSX=rBo$bF`(EGU(gm=C0#&g
zdM67N9&^NWlxmc7j*)!uX4PlZv4}!zMYO!l#G6OPjx(Dpao1+*Wnv~{%Q`a7Bc_d2
z(pvB}oODOy91}SwNDIEEJ&xVog_Oy)mFm*=&Dj at u9{kU{+_uchSj)w#7NblRpyzIM
zt0FXG=C~qYPtDNHQ~`&|I{n+V;y}cnYKy+G((r3gd2}V|D>8QOhC_$_;F-cQw3(~o
zt<RSPl?v)p>~1UJ6yYv*)N?ZET((G(P3vHjCw1HDypH^TX1W-Cs^XgIcB>rm`jzQQ
z at 6Tz<z<gE#{9jfeVq$6=c#FXihx-XWrIfT&P`@cwpp2WY`#w6F<p2Gqa-mw#vmAC8
z_8fIUdvTLxW{$2$r at BwCjc3de8iD@0PG``@QRWD_u2~xwVCI}_F>%$^dfxOg;4Q2c
z<PNWizE6<SEf>7Y%H2gY;Ud<OKKt1aS<Ub_47Cy5iDbhN*2xa$yT9>a=hMLlS!%UI
zu3N#4+km->`OK+wh?r827Hh7~yNO#StAtD`<tSq<M__NjclZwqk{#-RhD0u&kv}nR
zE(oqTV85n!A+I2GTHYmVAKoG1V at aAn1wL-@36kGrjickGl62TrKdD}-`^2y$=d;z2
zW%WyU at 3<;0=PgEzz)LMTiB6QOkZ(thTr`^ADq7uw{5JkxwtiRMGI{zsI!MN!sg7Of
z8qdFzihK78n`ItFD(^!gAJa>{t7v<(b at fL~l{S>A!yK-l|K(nVylk)m-wyFZ+-O7*
z at o71bV<?~jcB$&jh2WbmC48gkxA-x`7n7YL5?j+HA at 3DAM$`s*x>8u*t~!HUesLD8
zXOqJhJF39XaJ}13;XYEtGCH#fe*$8ALlB#q%-hebgbWw6c}LB_BJB%bOVxD|UhAq>
z8=DtUJHr^;bwuuc3VGzZP84FUx40`sH)iF+#*?3}ED%Tbw$}2_BBxIg$>|el@?lF)
z5Nv6I1np!PbwG8D%UkHfll)4Z at 6vilked&2G%dd>Hfet1DA2dR7Kjs&FP{Ci#fbaC
zCLOSEh8*||-I*$K4|0E!1FEaUTetz-yIm!YeQbZgKHj&81)N@*sJ)^_uEk0A|IYc>
z+&m$}o9J6DD-a83Ma(O5B at ufjX(#M17zb=_z#gHF<h=iIUS>sXb!h28b>v?Mc3 at oS
z9|)EKt47vlW+m@{FK2?2x8HjSc-9|<QiE#Z{y*@R<GqhKd(v&OT}Mmf>JwEM!&S{W
zk$-htMK^*hnP$xULUO!0C*39l--5$LE78x{c*Y#JR&--dr7TygpHV?g>XOBFwTUpU
zbI6)>BPUAd;eH{%CXOl<iC?hw8c7@^Yz=1mg%Q}th7O5t%-&1J7H<yXXRGjjb|F@?
z6nl-uuoXTEY<+4RMaFpOW3Ua&y#>N%PubO-<;9v|K_%fl{G{fr*@v&wAqN{`{I`Sy
zKNU|fnj?x$h<W0j2M<hubCCC(C#5Vmpd_YfESQW7_$IM#-wv6pv1+i_v^-Ksav>z$
zAO0*O-h?;>$^Owv;lGfaZG8RTuS#1V)yeqa%P at _v{lG+TmO)1Ely7KhE8oz7I!|47
zgq=M2LgZTHyU4|uXhxZX^3dZ`>7DqV|CNm`WGcY79N|KFTFrP+no)Xj+>GN-LYH8W
zvtTQ1mW86JlXk;zaX^SX0=Kq%&qr|cjS<MTz4}$~^yobG2^y at omB__#&0WJFmrMxO
z8TKOf-H<t~6J_b`VEAyZ4=YVqxkRRa?TrB@?nPlIV?aEOc=IFZ at 8?MDgJIvq^AIC2
z??B)6d51T+nB3yr5FaOgf|5qAK!W|4cc8d0<or|I{Fk1Z%TL-|=z#su09*yB2e^mQ
z-PNc^No3kVL*%S&Nx*sRg54Ez6S-`_I~FmUg05FwiDxM|<p+`f*>jKI1=2UM0ay2)
zEr_(BkMg{m at V|0hYM3$OoMSH;!=eqI6Jh6<d?`Gww8b@{&RpdCy+)on7R<@PbDx-a
zelW)B3V$p5?-SA<<eT_7Vm4#l<dpS9rj81Hb43+U>jDpWP$|(Rtm?VSvdznedJ(s0
z)x;e0-rWp7LfAe&h(-MSu?;#s^pQ%$FUTXGoxrFS-40PC+sEzV$Q{Ew?%2TFKRAZ{
zJMzB_jsO=eZb at fyB8moo$WoE`58#A98<cZP5Wn8gTO+#hfGMlPIIkGST8_NBXPK?1
ze9KJuT{>la$n4%k`|68qHrC4`&nT~T(Eer}l^42+Y79+vv at GlB*`NO|C0Vp1f90!b
z?$@;ab9y$|S0ANwtJ||o-eJt8X at 9aqZY!&&W%UCyJ1hS^&bz+3K<Wm(m#=PDd^owe
z)jnJ=_`x8bVT0-jgv<i25A&~k*V4P6)Lb@$<FlWm#<AHB#Mop03EXC1`S5Mnsn9ma
z_p3jZ7xNBFdsL%TNVgwl67 at YsI25|ce1<*a2^M+YkcU+$0{&98W76()n{H@^0`gBr
zI7uM)WylND0NE{d4*E3(HnD2mzvt$T>)<{vsZ#jsbrb8K)B7X+h`S}T61 at 2G-aWtR
zG>LZXr4f${UALe2t)-At37gJh{`yVx+N=}Duae`?w-m4oOjc|<_yG4EYa#TAn)D!H
zc^72a#CcbE- at 0SE)l41g-8UnLielRli=w5xU0Tm@*xx4V(cThDWHItSz>ab&ORHw~
zBOeCg>C(f;g}nyTwqWKNb9^H>$Pkx!T1_3p92^r>KVVMKA$Gbt(44T#U7nyUgRLb{
zO4^xOLE7mrV(YEyg+*nHcpn(lcpuk>ZKko9OQLMVh~C{?ZdC(EP$9~Fz$mP9jzlgn
zsMD2kdIw at ZIaR9Lh|So^fDfH^{$v23eG=9kaB2LuCY>=itGL)70vA{Y?uNY{E`0Xa
zzUaVSsJ_;F8f(-S7x5i2tE{b7A4lxTm>;~qk>3VQLIe5kd2Dk<3&zp-GktmoYgJ?H
zx6v6(zxkvFaUBZp_QYAS7rrL(A@|^&b|CgKkKtnvaSC{ovLG39*EOHAlQkqx)rR;y
zi9XHdwgH2v57RnobtN~G7}bMGVeJpg*}Kg-8yehZ<TNQyv<nUF2N;{W{~SAk$is)W
z{O5St^&jJ<8{_3McMWW{c<06$L1h!~&*lB`pOx_8XSmD8$Aj at 6?tA~|c=!?H;WeyR
zEx=p!1%2tAB~*JS`!zWlf76w at B@_2_V{hf8PWg2rKe6uEr=-0cpWZZ>7F32c;I3m+
zH?To7<8nzp#8bevS`r8*TSxW^BtK}2IJ)i3_RNdO9e4=w%WwMZ^}z39UY50PaOF~`
z=6*!gcS%~;l0B;;d6OT;{Tsi{0q(z0HwCHNcj85#kmrp*2fA1?@kxabOU2NWAd7tK
z>^!zRZ07BqUm0EJfqq<ye7b6XKf3;hGm8-0(tZ{`;a at fFz4rMa!Cq(x{#^2Q=)?S^
zMGb3?4%QVL*1Rq_e=@mrUfdg{O5gr*hjUb0ZZT^w24hbH{7QX{*mY&Nkx^|qwM^Ml
z`&y`=u3f*THO|8r)~tQ_1U)*+haZhEltNF0{+8GPbInZeCG at jZH01$PVkd15{TTTt
zYGh(z2iC1){sZhN_{=i~ZwiMAe^l&c#NQ8IE%~UXMICT|!WJ?{ZyQ8YA222~c~=RW
zkPCV$$C%KF?{%1OQ>U89clwZXgrm-v at cw4dVDGH)J39D;-%-pnVAo?bf(s|@7_(pD
z*{L_mu@{>XQDnV{{d`5{+wSrwi<s+J+ZxH34?c<K{VD^dUe}9xbH=BeOw<u^@8f%F
z at wO!4kgu*QLUk?1 at wvxX!`CuQX1Q}D<eYP4bH$he_qRV;g!MI71{(<OT?ZNPD<h8U
zd>Exq9%#ajdRJ{OC%GpLMd?aiLr at 8Io^|h9r|qv5XJREs-bmH&a=<k)zxP4s`hVtj
zZ8;fxkPA7P<$v50 at fTQcog?5%xwg4t{J!X)qVfC6#1fy}AhPb}FlRgDp}Ih#^~x-&
zrN}2<NIk$Mxx!GA>oX0$>wAy~6!x0&c7wl?|Ic3E{Mf@=uFC|+)A&AEg1w9aeK|^r
zy0rYH=Gl-XYq1vOP)hL2{OcikYo)N!Z4TaxIdTZc*5$W3i~;GekBht3UF(g4A0NEh
z>BRr+8{_sRUv1sb at G~zk#^9sC8ex5b9;yG^!pfrXCDt&S at S~T;O1~}e1hd9~Ee}a?
z&sC=m<NMZWUs95;mvxJ$XA|x%e!OI*_cZnzpYqOf^@%UTex?W4m5$hOea~F(M-kl{
zJQQ~66QbsOjjmkgA<>Sxb#y#ckGPWx;bl(=cNgxFEB$z`u0{O$W$0x3(ys%^8sW3C
zna9AToeW(gdB#qeiJYG@%K<FR664l3;4{}^ulB-T{X^%&u54}l2C*qKldr0i9$04Y
zk%L3mQf5DKAo`5J)(yUqxw+sFgAc3A&wE;^q{QG(x3NC%^y)o4KhvJg$-qP^YM<xD
z<2iP+-&$fk7EhidgWU{y at 2YL{#(l}=A^65quI@^DAX#<Bgzw2DhW%K)p)&<o#qePn
ze>iAnYT^ay at nu=Pz0uWJ<Kv-^l{>V4UqenE2X>$wGHTTsCH8xtB8Qp`c8M5WGo_EL
zMvf|VK`#e+_wWuZT_1Xr$$zdo*fblxr%CBjF^|O(EYbqx_W1<I at SCex70K?R%;1NI
zZ-hG|ah3CDM_9n830vHc4)@MX6~;UNz3h!%YqZJP8#!{Of_J3Nn6TCz4_)X+(56v7
zxFKzkBY_h7_?cQBa?6VB+!~QRuu5c)u&_no5Rs4LtbOB$$f6FxUac<d%E=ySc4YL)
z3R><ikL(fjbjw%W!wv+FvN?g}^l_oS9XX(O*%@$By(Z?WsPe?QZ53~UD|Z*TsacJ5
zd6K=YVplF#&t8>oc|;v^p`DzwO4btu><q9R<%t^{<&keuO>9L0zvNJ$xujHJF44u9
zwKwLNL;1tHus3kd9K`V}{Ilt2Wcv7H*UE9PkG0877IHtWN at jXyX7gojf0H><uB+De
zOZ%ZWs)_w4y5z1wtCoVJB(RcIv|Q#YNT2JfW8 at xLDCtiH=}%oX?<}x!Dtb^eOdUiy
zg0iVh^_CQ+5hdf>Ux62dvnxi=>{{K*B3^?jS>38tlKIPALH=3fUH)rCQ2l7{@L<Ft
z(QtqnGCgH at GJLt~d*1>k4)28F&lPz)!Eb*Hw$6IRrmb%T6?@YVi~n6R>qTt!m;tt5
z<g6G?NmyGtgY&7Znb^GPc;^p at 2mJ1x4YKALYOmDqxcBroDh58dKyVvkthpaYj&tYp
zunE|BNBnJUgit{%PF1oE0U6QUqel1#%!p;Q_))qa=IR{apj}r-IB2)!JD=ym54bId
z#09Ub_oIls at i(v$Iy<+JGC=O^A($8Fa)!wLh(}{)B5qaM09jzeTyBcfNMN%hb07Nf
zdk)01G1rg-rGTUK%7fDR`c*}3@!%+#7d|8vhb({{^?IP0hHvY_^|<=@DV~0Mt**H@
zjL{2KKOEuhSrv;|lqtLr*v2XxwdpFd_l at r9k`9hC7w=2*>ntGgwZG76<QzUO?cx38
zFkk)2YT|6eI;3x{;|0hh1RD}9U38RHd8fP<TKa}=cqoY(xo?Bt@!=x=47bJaRCH at -
zYQC8q3k?GId5d#|?)1DN%xFWrvbUE$B>4;QY#~9K{FjBpg6W^xJ%2)*I$+mS)3cdL
zj)er1len0hJ<bO;zfvj&cS(o#995?^=b0z;X8F2QT_)lB;wS^bl?9o(u0TSUBA#}L
zilX(>9(qe$D@!<q8a?H}ois;kpr>s2{7oyD>7!L16F0}3>(}A!Lk#IZR_p{{!^lu9
z>YSv#8B{JAp)4FFjXjYticWRE$TK5;NIpnnqaP(Wqw^oe>ILcGACY_8c_D3YV(u5h
zHZ+ZQ#XB=`7C1 at v5MHuXZ?mEn at W0Kq>GBrGGP&E5be#dsq1?f4>>HHh{f+g14)RkW
z{yA}p_ZzN!=?j?(H|$D`YK8=9O>^(PB+1Q<8t-$@n6RPDz<bx*?st5gR|g!GQG+Vd
z=bqyUa>9)xi0albGH at 1+kb5BKtr+7f8~LyGybdN;k^1-dgEV<3NE<H5V=Xjni8xOk
zDM$MhVfWF!KMY3|-t6P3$#-EmohoZ(<nTA_A$Y36YDFsj0X^)f(y7rN)dNZEQU~{<
zEju`0=2b-oGTYcjM!hbToQphch(}}QJL*FkhC;RFdb75jsUz<WSXVJ)BKGK~p}V1v
z#FUXed82kwzDE(1>rLxcF}I>6ZMz|hACam24MEE2iqQAGnsvzS=;MKlc2urd-&4_y
zcLY1rO2n;+*(H=3dq*qct3ByOd*-cKi at oo)9&=WaptV)yT|sYoxRre-_RJ}f_f)!X
z at 0Ty3%beL{JYzlom=_gO&#r)-QN?+h^JVOrt2-I+?(ySAEY7dTe6^GF-Mh<FTk;{J
ztiVD at AO}PVO-z+vllK&D14pl<r4RQM!48CdsPhLQ*5$4T1-x!$Si{MlGZny})Ibj3
zlBp)^!DA6i`X~HL*b>P)FNYoH3$F-vwZF~H!F4aT?(wZ>lC~<G7cWclrv0HCfdA|n
z-?>}B`;|tnQRPt|qWloQHx5hYbfP>9-S(SIi>F_tdIq+0>MfBj_yE~MkoWD^1P=6Y
zuZXUPY`aVyr7H%%MyyYcP~o#HlU#=vdDGg=eS>BZr!vgAwef}}3hmfxKVw=^+*?W3
z=&g<Je4p-6hkXFn_pOb;-Mj4|-V^Q#nRz+d)R5}cglU=Fkeb^ewC!gD*5DGz+Hsxr
zB$+43_c at J}7#Al63a6Yr2RcY&*wEHG0dUm<&t*B0|GG@#Pvz7 at 7n{2(n>`sA#a=#x
zz2TCEt#$Y`lKlv5-xcsDIKgRFO6mYR^+)8nGSh-0@?1v|jdNJ!{rX{fn}Snt_DkLs
z{(1q=(TMf<E{Q?3Em>Oq;vszY%6fTMkWXw=35Qe2AdeAz-5apymUsh*e~i4BZEL&%
zJZ at W7x-C#d=Tuv=F6DzGkE1_bL_NlNk?hSOkM9uMIL3n=_3b9>inViHP#t7DW6_x~
zzm2(3-3`?B=rfCKz`m^LZII|=F6HKFb0uQlB<ILGIq(y91f;V$0n4=)1(vJdmEX}`
ze9(;F5AizEo~3~?zjR*En5m-_Y=!PRJD*aAmIz1L)CrxpL!fz6KD5KH)BAU<QTlNB
z5T|?)m<?=zq3ap=QPQk+L2`Uw*Y-N^1=!%Sne%K>!1AC%*kSfVZ^~Njhd#r1!hMB3
zR1w)rk at cur&&8SrEGgnx=X92-Mp_ZikwkP&v={p0oX)w2Jd<bCdunIw#k*|kY*r*c
zZbZCEZOofY4)!6nh$DI at Hh$Oa{P!s3BJetGZNfNeaD#h+l=xi-{giyKbDR4lW(g;m
z*p;y!;CWo9R~6LZohMTHnSs$MBRp-u`IKZTfa}yjmNX3JVh(-49+NJf3_j|ujf5B8
zoX5>ZT^d%8aPwnZ at 0JNGNG`GgWo&CN<e>-n*i%m|t&Vwf$>Oa|rHHXVaX>p91kS;;
zHM~YyP9(U?ij9Hif#J6$PKN#~9ECoOc4niUdA?jtHb2(d$9u_P5#>H;hW!b)K{M?1
z<5-iecG7R)??@d^;2sWZxP1V;G?fxVP>DA at Xs7dMTn9eH2=HnKn0PU5$VW4&H%JFe
zh>Gjx=6j`BYpRj6M4w2v8No}4lH|wAH8 at n#kAxZ$S35cnJ{cQypYO)`P>?er9{4Ee
zGUS+#pQR9-_Nss==saS23#rS{E6Wr;M&2Fx>se31M6NFJe3N&Cp4DOmk7VPE8D;-k
zGZ0gMah5<S?9nY3HTzd*h8u!}orY<C at G}TIVDnHJ<k;&WFV+n&@__fG1sSGo4i$*n
zJFT|34E<*C5aFKS)ZgwMNpBaG$4oEoPrG0}muZw3 at XXd_L(U(9r>{{7>S%q}8l at Ne
z8ymR(Ea9sB3v`o&*zIS9&qDtVfx9I~mdx}^{}n739PL(0bBq0`^Da5gmpdvV`$ktL
zUi6N1S1_i;Vfi~TYl=@SyW0z{55|nPRN}n)@GS%Vp_713o=I1*xd(gWAd5r8#|-%!
zrTnOj0Y|a@{=B$11d{Gn?1^)MYgFiL;akvO84UPkA+sAHH>bhxq4bKthY%jVgpB95
zb)=1vvzcU91C<ob)h(KS at Jut^6eDI0gGO*Sz;8yr<5>YQ^`WV&FVM=RqFaw$`^zH5
zYCXLR{B)0BGejXTXIbvl9<+B8_Bi9uQDDDif&MwoUCF!Iw$6uvCfNT5PcXeU&<5Z8
z1-1fMYQ(69FZNeLH&w1v9a%?Y#*Ad|EXej;<n_wtzDr~z_U}!O*D$6{5k)e|JQe&E
zyGJL(&br?4wIiPM%4jcZqBL|yvu;`$^luxHsV%<>=XjP2*Sfa at bEbMYJ8UuGeT2@v
zhv?i9 at LkNCMr^h%x)4R%Zl7NLKEcwVt<NR2`mopWM8*etv7a5^i&qNdPI;h*J&rxO
zax?{Nqb+ib=){o!r-22BE(~1B^YO%=vK#Zh1O7cX!;hpOv%dNYTq91{u6-QJ%Oe-d
zdbC49$es7Vo=0~=A5<X5Rfm1|CD<lQk at NhVJAYOk`qH<LYJ-0iYwtm64_CV_B4q~Q
zZ5(Jw&WSt9YD$AJm(ma;auDaltBwUim&S3qO#Eu7=MIk7kZXh8ZFrwCtt>e05C^p~
zIKH5V7r=anHTbD-a;fX|EwXO`mt_$8rG&%`kEXybmV*9!gthyx1g=>Df6^UZzttR5
zbYnL-*{U!fTj3+iP8<T?$-wr%&>6>T*t+fiaW3{$2X*G4N}?YR?@8=L9ICo`w~t4a
zFF4t)OGsch3cwTFE4jL}=u at oumE6KXYqYKHAP2e?7udP#R7V}J(Q|fPDmc(oZLbr~
zN!)8n(BIuAtoN0EF6=2ZvJ|`ze)vet1+=d<akg~wg4xo3Ketp|T&T%Qlfv$Lx}|x8
zN|Fr!q!D`8Zodw}>P+3^Pt$})Nm-y at _bBw*Xz-Vw^KoJ>ef}cDU!<cNSp6BhFr&b*
zezv<$wB!LgND&**{RQ+tz2kMxC$Rypjm&OEvhbJnGohbMb-xms<GjV2Bop}^J+^mY
zA^k?Ee?mN6-BXi!HP#-g6&Z#l>k0^eQOqUGn?l*jUGY>MNAqRy$I95JLkqvE#{1d}
zpO4M&IN^(8ESRHf#WW?}pmLi;D+0&cn^s_8C6o#_xq=zQPM|xs8|U;SD$s^DqWAk^
zISRm=dZT+bWzK(xk}lHRJkYI#oV8Qmi4F`M21WrsP{eqQ*H;3&Ss{6D_k60{@3;*1
zGT-xe)0e%%w4HB!1Ydr0a}fo-|7X|(e at 2W71I!NDliq$}fkswCALb{?Z;#&(IVi^>
z=8Tm`6fxiPK4`8*-4La)B`JNU_wGV<fg!C(*1WlLX)WGKQe1{r2N_q#o?s-rN86D@
z_#acCt5`#J#HrX+i_Wjpssn#{^JdGcCs-Y9+2gjQk2VxhUUq*=?Q3=3+1iT{zwNPX
z>rw@(L2!*)fB`@}aZjS1F~I+FCz8wjrFcMgK1hyx8QuGM|CaV-8qo)Zz<(D3JJAAs
z$H%c<F8FKNgPs;(YP(=Z$M-no1LUHdkOBDu^~-XL68m~^Fp_cQc`EW-VEQdG&*rO!
z^P4?f5o<SeZtiW)Io(g$@Y#z`BR);|)B)!u!w2!pB%jkz5WasIzQl1bayE1!y>+;`
zlPMQ<23E$mz%Qab0^Xf~<#Wq`#m}Wq at b*C#r$RnWCcJ0(ZX$d*-WM}3k+DT|7|8mY
z$lC at C9NmHQ<`6p?iPI-*?r0l3OsUI`V;+B7ey7;^`1ybGu;*y*Ef0>qc4ZOKv$hD@
z+mfX{eykvv&KnDXeEY6g6qJ`ZBF*NV(y?jMGbZvL*SslcU8&byk8!s&^G?D4jyWid
z1Gm>(o`+Vbdn*zW+(y_u)o9<;p!9?{>DZp~goNe~35OGOsE=tIxsH5CzRWG7kj0+o
zp+CSs?c=Au2A$|FA}f)L1b%zz@);%~KSn+bD#e<z<#(BQkfQ at GICZEy=xxmVnQkA(
zW1hcM%-v-`<O at IPscGKRWqp*A$VZNNU?q;l7q0c5&eTJ1xDa<9d;B}_n}8$ym&cGh
z at GtN!iotixPpp@<YK=-G>^-|_8*`nWf!wasfOB6v+Pe^Zf8+0*;luazWi;DbfqT>t
zo+0RN9|xtwe|xY%!Xx}P2N{!}n~Wi$n3kX34ciIf>DG5CNRCM|rrZ_S^Ozvh#0%g%
z40~ZTh1)o)C+ijbsduoZsYT5J4P|!3Yrf(M&b${~3uK)*7$?D)HHn%7Ev%jS5<F%G
z;9bAu?IW^rXe!Y;xN>WFT$AA{WHkJm&TH657_oMOUl#t9^YBX!g>`JLhpzt<@u`5v
z{TFJ63%V7?&ThZs(f5X?s?CYB==(c9L at f14K#lhPkaE8c*rCPJ*13nna<<m%_NwGm
zE-%5mnfs;gsp(>YaZux3<@3`S;a at 7bZOFWea+gemcR9A%2z|C5 at zNUT#`RVu{0!H*
ziiu-nZ&pvf!%tOMx?u<5e=cOKnOB_G>5SUfg|m)T=q^+GVTl>f)7{{`6eHf=BG4O<
zJM7YQLDXIF_jTvWOxp8W?9US_z!L+GA?&k<7k{*sa4625XyfBlt80r?OxFLzVd$Ak
z=dG9J(s?=+>_MvgHfWbp<?pEI6N$yKxuMQL?3ezqNx^;;MXS7T;~f)Q(gj+ at RFV1x
z)p_6Mz0_8@;<KJ+(bRxL at SEGgbp~vgMvVPXPm0Pprk!L(+&zwa)${3DLuud-86ZBP
z?faL?cT5s^*FaXitFi`Zd*>KpUAs2KOe%h9O*^m?pOJez_K<7m?z*;eQ7L%F6oQ8C
z&Rj{1t2l4-mGL?t{=Jfy;Ip|u`^EdRdDyp`Nq_MYO4HC+=o`WP-^L0q9-B_Ej&E%b
zwK#k7<>+G#V*p+l^N;L9;NQl28MF)MfD;VoNrXd)8Lz<p^@MNlzI+C(Aebv_FqSGd
zTYyKyep3FWH!agb=9A|R_6 at n<>Ormvb1vsg;PY3VZOHuIr_a=Xn}gpkmp=b$*zw)O
zj_~A at 6ZV0n#CHJSMLcvMC;WQI`QsZ0xsY415v`u?<A65P=ZA;<E+s?}Sq*<@d16D1
zetR?a%<YVW<Vt_$3F0>zZ%d+`w1r6yD*mG_^dQww+Cua;UI6Oypl7nMQ_$9?gs!DM
zTiY#SOqfd+QS$@+*yj=)8u)vUA0WEQQ&)i{Rm6E&&EwFmN+p~_gny3zXXxi9iIXye
zcgXT;1GACCfXjK+R|kFfBKOFBppNYe`1DmlY2wVCM6dYCga2&7k77UcviBayrB8{x
z5k4wQA+}`t5YtBwqAgwSK<HiXfG0aSaR~Yi&fzGWUS5b}L*%as7uX`FSN0~8gx}Wm
zSrcRFfUGUD+u5_BQ at V}m52yjQ at o;9XKs;Jh_N+FCYxQ&HOBBh8l0<u1Z)UA?q<I!)
zAUw;yacB~#={(C$`2H)pXEWvWVWM~B_0o1nm1^nGzcOo??XE^<FZ}I0IWJ-pn?PZG
z88kl8=_b5>7WxuD>6NDoJnVe`m4rtfzNen9cBfZ+RbU}<5o1aAMY}*Vf}BUdn3C~T
zuf6yb<|<<$<Bwj8_%o^V7I-$lOP2yaXGb60FRWurV)Qe2fX|iqZ_c+glkv&zgpKBe
zkBid?-Ss5z4eV)eLg#h*=B=g62*0ivJ{5aQv#xI_$?rIQe(i at t?~*x0E4-`Hq)cvR
zC47eYUSY({7F{NhRg#wGg+(ayJ!^vGRwewQl~|9A=~C!%XAR1Uag8`ab8h%r$4!zu
z!H<=R5x at K$ui1Gkvu9iAJFtP#x at ZM#*vj}RffDwT?$_QN*lhzAN#ayx*W>GeDYtu{
z^*dT;Ywl-&-yXM*@csl_h at 7%@JyY5P8%e)5&uWRjG*tb&kF*1EQWgJU3yJsHLiWNI
zqEGbMLQt-2dlR;{<=l4#=GAJfsqtjZceIl6bM+x>x!>0Xt(j`6Nc#kE_{~xey~TOW
z7qgl{A*SEk8-2%NynX!l9MQjqst|9TBPbNgsot&!iJe8 at IS8%*nVd=rRS+ADb3l9X
zfquN#LZO1#Md#yP#!d|_j8S|C|4y0dPli|bKwknE`}WFl9(LFUQbn`qjiOnb-dBYW
zz2o;au{EBlggku+eQgy*4ROnI{l~PbT4Q(y^py<KhSBVWGa3GZIX?yaxjeJVM3f#J
zzU7Z1UQ?l(d at M)~8$_YIirBD&J|?nhNKQCc!<Tx>gFYI)hgOUk7HEDV`*4?5O&P<N
z()C at Pl!9ikhD!Z=Xx+oWiC#P6>SU at M$k~fERC2nLsaYgPZs%6WB*aeBP1cBS?9?sb
z0IPt()YE&h#{;H^*E9y~CefAXqlukVRM&$9n+fcu(Wm3U1`57P?1zOKgB)voKgZ$2
zZZ`A2z<x*#|585I(&96FFt45iPP;0$DX at Y*2mDH<tYWj-X9Jh;zVIp$(~*zsMI0+^
zu2sHkw7{g~M~fU)zI7kpfyKGXJ7p;3><2!hWXJ^hj~GdVoTKyAMS{8)a#GH;V84*<
zGBeLXZ;{|0;;`5?;<%!1VJXM!uZH=1g(<JY*QTd=iN$9szELw*@VSL`G==D8;lmVc
z`s29;U{kRAx!WqQ1^`=7CJ2X}N!%SqeFuBiE&8x?B(XDgR%ltm8{am-M$_os9Hhqk
zz<yNt8TOU?Wh=AZ8yG2WkQj<{0u3*IWx7aowJQRX#_xo0eNsv)_UX0fW?@WKYakz>
zzj#W63dUtR(F-5VZpi at -WG{S`@W1-joC-2G$MqXoIbun?Wpb>4tD)y0*MM&=Aa;TJ
zHFa}z%oT82g+ at N;#ySK&pp)XcK6Cy+>W_XVIw(KAUAOq*5B-DLseFT|S7-Q>sy9J2
zZ|F^)hhe&xP~YM at UpukZKgY}usEL_`oF|_WJB245c8V;5H;G&a+eHla)8t(ElgPO-
z_gw2)w2Jb&woKrp$ow!fPx_IVp$hC at hv63pqx4xt1wBFPKtEaoAEcT(LCXt6Ay=;@
z#*=+(>5RlBt6pT4OCLQ{oL;4!=6#E+^im?-CW0xOhkOX}+l!?0x|IxgLSc96Ci)!g
zCr26hCK*-GHl`MNANsI|9sm~o3ixCB^ab~oKe>7>#o0l5!p{WaO|7~pPF0M!t5cBQ
z-de_so+5jhQ|@nPr<Pq`*3$b5&XtJ1AF>vEg7UN{4$cy0=>j-=6XM<&>WSx>+sxRP
zALf+u4eh{g5w7iJWj&3Y6i+!f3w!01u|q+hx@*dg2lQx<JU;8SJGy{iaDihT=W{UT
zf;W;juW4&5T2sdsi3rZSlB~gfG_bIRxIT6009Q at EPskUeK*N^{t{x|xB{&!3MJz;2
zAo9N at FUp4B9QGHY?{SOqj&rG77&oRzl>Qa;RK#`{_rMPhf9mJh`z(RXSwi-Uo)97*
z*#QRQIRAZxN^?Kg2EX>+mMW2on=MlLi^-Vgs;xRsz6{)ejGEvQf_4#`lk9uZuN-rk
zJwQ)<2HY}(?hECOszrsdXWVjGD*RgS at EV;r|292FEQNiatzgFJAna4)k$b@&TmO|d
zR{v`;U2lBnMs}1URzIqw^~N_zeo*kb`ux4v)BU5Za#eYPo|VIPS~NP3$=&iM@&TGe
zs&FH)MDLJX4?eB|$bR^xZ1ks|!o-G=LEd1Xm(|{Qf@|+FV!j!KeGfzS`rnT^ja-_t
zXw4FEP!u&I?-TYdr-6?F)+F?0$6n$useH}72Ux5<X$p5ml(IR at hZ#AIobC<Hxtz~&
zZVAqPlJF(t+!*f)thKq|mD_^zDruF>3Vb>r@&0XBXmc0gOaP|X0PLyZV_&=<v(o2h
zP>h8z*<04F*e{s99Jw#Men1W}S6qD3q($}(MS?fp_r-8tE}yCq>ZfXg at Nt#<<FiQR
zD*p^P)UDn#Igyp#W0G?sJ#bGqiC!b!8>8TZ*9vv77TRx=^BTd^Lh{JnPh!~2PM<Hx
zGg1LIpmN5-7*Yv-^CseZYCJBXZQO3o=17;%wP8<p+F>SrfOiOa6u5#e^4W><5tIAe
zCFC&eQ-%nxj)}C8t-sI;PdG0TdaWPg6wprO*Z_VI`SVt~!JQHiiCo4O;M>7n!kE4Z
zU<{GdylD=U&<A<KU9jP#0~4>s7%24=@&+Bg_qA>+aKA-fk!b2%6ZD>EXY9mzg0x0j
zgIpcD*r at Z$oRa68z(f6_ at 0z_X+|T!(HLIi8LSi>|SCaaJ_t=0n<qoHA{27bX;I~kZ
zg^a&b%$rPyJw+93c!ppTV}5JraFDN^N^&1EJ|<%KOUi%wzuN1|V~p6=tzPUaM-dM#
zF+02Ss68ZaC3#0&*ozfK+jfv~z-vTaUj=l5Nv$M*@x^8l>>s%ti)hLu<J#&UvVk!>
z?Yk!5pY%DoZn<U(u<<I?yO4}i at az_mI=S=4pV3=^wpJ{hXeaPFuX4pUy{PCek&n)9
z(l3xFVVBz~L{lFG at 5k*B(jUL&=>5bo{$70V1n+}mL;YGv{m$h4cU!$8q0RF)uOG4?
z&o at 3Q#{2j8KC_RH4b(YhSk2M+>WOzapy$Bu1|Kdj7&vL+PUsm5#8sd#$etN~|Juy*
z7RVUb&VTWWFqd*Lm$s7Yd5O0Tn~R|jo^81=@<+kdzY!nfNixpI{fyyT@=08)I-v;h
zFoDP`+JI|9uy+w#D_~P=B5No1ZY1A0Vu6 at n;1e;Sou|pT3tx;edk1575 at Jd0keO>4
z134#h+P2VSf>oGgv$^sZ- at JY&N0t*p^uVcJo}(z>Iq1HIu1Rae-TlDx*=b4Fl<Edx
zsv4k|RIkw3Y*8AY&pML)h8-sWYYyhiXMcyhMSWn;(K0I+%;f9&uSmsYt}0ZDzoW13
z#+3pafLzYd(Z}dR{IyH&7=ZhwMC?hc5_=IP{GbNUK??cSz-yQN+k4v<=Buxt&4%~m
z;`PHfGo|{<j$Fo&(LS0opYZ40NAjNmb1Nq at lG>Blgl8{CPNMN=|9RyNK_l!SRj^f=
zg)_1DQZw_Ar)j*e>q-9;OdjliD#HKbr~)QMe*yBkqcGPzp7UgM9#<JCX3Hemu&u*R
z?l8jcx;w53?{pXO2N67{2m0e-!a1c&9HuLcn}FrCjJH+TbUOrgTLW}DwAZSHu6C36
zK}*hNBlfCd;2KYURR_Lq1MCF-uYDwFKbd^vFHyi*ulfOPdmZt}rMZT<jD`rIyxF+!
zF&pB0z*UwTuqY+R_Z}WbNygt}uyH=;Qo^1smsO-GE$Z|^pYK}vH+k_w;2v(4*%P-%
zzbf$jLTst9)6F;i6p|J|d^V5`LrivJ6Vs3N_)cP{qsKQlN<HE09;vrsJU#nvj?9R7
z(P!xkYs7Rv#>azgz#&T`vG1tm7y~C^yu<D`8jd*<a4CnXNW9-s3tcXsTL%A~ZVF;w
zU=y;Dxih+C-6Le|jjt)cJ!gDO4j9tFGs4+sRi<08e|s5mnPYfo#lU*!!v=cjXXxO=
zX~Mb9p%d+qvSw-w``nk12NN7REjgkc+)AH6-i9&J!6avPFlNGQPk%zKp!dVR(`;3y
zDOz;2(swT^z1|uWQ6}mImyTFaiZOSx>^k9wPlL at B_Mb}hhuN186Bul^4YE#0WE8Q<
z6WPVgfsNuQ9q$QAY#=rl*vktLUpU*dUy&+)z-Kd8JI6jAy!`}IIJ9m>vA|DIDtwkM
z!FqURd_8<~$#1!!gY-$N_sc1Ka*KlW3yNaPZ>Y#;d~Fj=^{<|<{uz6p;Tx=)(U7<?
z<kf5u?rb)Oyo&tkJ5aw<h|x5UfGZmEaQ8&%!LdUVbBes at GXsW@Q>%DgQv8p(6V~ke
zPw&gg$#>Ty*U(J(=#8AeU at VdI=fR(%o48j#;`J at DQOF~5FZLdHfj8QKI)Te-xN at Q_
z#j)3gWw`FmaXsRR2VtiK{zs8=)fq8|9FvJxXuP7|WC$-2`&|lhM<sn;G$nw@^!AB+
z9pFL-BWvn!vfFpxAYh|!uBr$Pvnm&AoY(QZW%MDd((mke9p}f(7N!MF%<bm!xs7{1
z<&y=eH*a#mry*?OuU)$D_7ix&#pBN!`3uH;gKsSUzSjHJ0~bBKMhOhNE%CwDl<~Em
zI?7q_`?K$&zYanE8Pk;5fBa`XuE`L`C%yik<1`(*A*Vey%Ga-F+@)C0^{*ZQCuZ at W
zmb~9hh0V?1JV(}f>@zO>RPl`F0OsTH^PJ0g2gT#E1og!j82M3Hf;rKI_g+KZyF)e6
zj^2s#Tkb(Jmw+Mgx~u=VAKtgp=PxuVQ- at ar%X}Df)HyD{%@>(QraxVSK5v6gbzjT4
zZuLLpo!vN)uIVlJ;cXW{Pb7E<586>k#`);X;dZk#eGt3 at _djKJIVp?QXeRy}B5$@q
z-t@!E3f~P?4~$jrB1Kq(@vq<!`C!~v?9+pXC-l2|#IT+n2q8JY;NR#W^NPe%rYmFh
zoxnyo8nL&{A!7pj^GRe})Y~>>khQGd=EDF_V%mz0kf%k`<-n8Z6Ysxaa7>Xt8>Pcs
zO&v;sEQh}kAMlO?JL1haN3aKrA~MRWmE5v0Bi#evo1(ffqnyk+rZcM?K3_ZV%DoYV
zk3i>&yxe9AUjocs$=P*SFYZOW%*_?`z0lvNyUT1OxAu6>ZQv`!!?uXR>4m^n9B|al
zC;@NnTF>`ft*;Mci%L<Rx|Xv;0ekH%rkwb6&|b+E8aa~J0xQ&Xv<5nxrK?+3so3;I
zAom=~)VCLNI!^6}&rU2-Jpw%M(^X6n_6nMwN|8O>ENXsskKfm_m5#oE2YJnWgXx<k
z9b5PMWJeD2l&r6P+~JF3+S^Ys9FD`hJF+YAt at 0vY0d_htR@x;(zv^4-(}!<dh}tRp
zCJi~7gNHB<{G2~;j;)`UJclWdTnJr4<(<jZRHMG*`w~`#Tn<*`a?ss42ETH}qG8Cj
zZ{y<My0%D_pc2H5>-kfU9e<(X6r1Z`6W^fwey&pUG-PZM@`rd3w~)O`c;m>T?Xr^&
zlYeRO09WDa#HT~KHGW8-6!fmizF5Z<yDXI0g*Xvc;ad_`ggBz3IM(5OUbG`nO7;LQ
ztMmD}G5AEs)^~q|I(1ODT%G3*#+}dY)i!X4!g%B!xL$W-_M$lCF}Wz3jM&%%->$te
zCn|#cmP~dW_wOa+kzg`W*HZ8YNWdx4g6|b*n+|rJN__7{y?e0N>KT at 7`F_RDR#VhY
z<m#*J+08?aiYUd6!%@ls at ZAoWCwOmr*(ty-W$X!NmtZdpj1bpAe1k`P``}QaTfw^^
zs2ePTjWtd8eb)cP_H;GHmUQh!8}d$>wVnA(VAl_3kE0I5{#Egd&%)pBZ_%D)W^#!C
zsaQ}>hm at XqNb_xFalZCq^kwLu_BHi!Me at On@7xtxHKsCRpZ`JPi(gB@`;$c~5MQbi
z-;Xip;aQ|Tu6~ODNIO;Gswci@*o-QeK47X#IMBshkOwYZE^=oELO%M}M60fekq@@Q
zwG+9e$~LVg{BqFyD}gnra+#@&G%4abW-(R3m)RL7wJX)h*T1=x#O^b>@09#h;p$>A
zrt|KDkE7-bB{-Q(u%)SyBc${3rK|$FS)ObqU54CQ6rQ__V7cK#kjt{MPXkVpBKhEY
zHrUB=LHo<dbj|9VzeayV>`d#5NRB?>Z{POelqX^CHUYO`84ErwMg61`^|LU1#I(%&
zulk+zwwL8nZ~alfTq=Ai$%8V)M<3xH at C}~uFGu?=@rwmFg(0Y0ap{@(h6{O-JBg1&
z)(U-wk9$_rv%NC3uZVZ0z8d9ADTDcjl+B~}VlPu2a?4Q(POZBMMYb;pu1|O|P>#L!
z`d4c3zlv(|jpOssCsiKcJ+~Vk-i5jO33$@Mm;ToI(`I2O7bT at ge0QlVDeZ_!IK;(w
zU~eR_^XGscbKiIzJkKJ7F2WVLs)0>x<|myUAb!x8C^prq!t<X_(b=L>nr!!`G}<P!
zYJbG$`h#OCz=ZGGAT{66_z$#CgLkZ at r?Zb<6N6j#@FGA{gUWpG9sW)1HS_rE*L?1%
zCf6rmzlPYaI at eD8ucJgR>}gzTcLDkf+{gZwxq0~S{29br`tM;I{mYj%^;9J^aO-dl
zITzQ-+Bn%5H!i;Zbph_(6x$3e1L69-C#4bn_bhVyH9U^v&<!^*3+Na4`UDwdx at zi0
zF44m_W$Td-Tnx;C8rT5~YxXZ+^C)zHGcn?AChz)j-vsP&cCQX=Se*;J1$eiJy9{^(
z?Y0Oth{@atd$THpVx5edTp#J4xV{p0mJ+OAOGZy5c1lkq&ipy}$?4AC?pah5;y}z@
z$+w at -7DiaKODLPRP-}@+z4AUQr_Jn*+u at 8nU|K{_v_3SI)^~hJZ)N-Fm%GAlhl#=h
z%%Z0QbJ+_264y~GGx`-l=|#DJKf8P4nfpk*kh4ehbO118)Bs}U%<Kub5#L9A-;Yve
zS2ge{ACug^*dyr3Z}_2!zP3(Qj+i8sL+)RK^KZsu5BUvBVv`L6N1#hfjkweW;?)f#
zAFqES%WoI6a(^$k0QV at P)UG{&d2BOud%6FCzo>^AIm$pYduYg9+#$IbvX8%h-MfUV
z!9Q16$5=S_^s0lA;PjXJkFc-B^mKoQbHzgiAq6<^ulT+l^%nb^+31JOET0-dUzIy1
zk!#z_;TyArJP$k6d5Vc&Os->oq;GFa3f+%u7jmC<)yw9AXA1H5z`v@*Z_%^DhHf83
zeWNAeXxHHdg+JlFZv!s{b=W1M{>ju)Zl)q&Htu&7$DdDchRiJ`7%cA){D4*P0q)kS
zCYgEuz=-HtEZrjNaDvWz6*h-Pc02Y3$+A4$>yY2kF;ke<^H>`6E#L36V-;ydhYRR>
z*oRVn=o*jDMISN#YW7to49}XeP+n<4e_>A^P?=tgHt(2tkNe3vf&DClcRBvf!SNx>
z4%z2>UlvyZ<P-c&u;KWy4q>4!H9o(U7Vn`N{_pbp&Au^Qqst_ at 3Zb*T9R4ZEnYXkh
zDa|Vbp7Id*IDs8;n6P&h at h$*UR!e at 999h7s9oMD!o$<-WY;ryH9)baBnjyz}X>spE
zYzi<Z{=gjgTiH(k(q&G8<oyDyJC^*m=xD6Lme`(e3$7iBDlA*He6+Vx*fhS*3L8lY
zyuuFu8s9p(;{glN4PBOjJhC>D=lcOGr%(mHMDTr>Ywsdn7V9eHnreF~?9>OjW#9so
zL9SUS{ac-qauPoRy!}5!y2;fzhxFy{VP(iDS217>p9P((P==gXzpttKEGLtkaSl0a
zU#O0wJ58F0%B;?^jR7TEQ&VT=)oY?1df<e<wVH)Xgr4iFYDH$hz$3sM2#s)*L*LUt
zuD8({z!FS{Oz8MSR-U4Nla<(a|1TK{`-uvD2LAB?;QskZqYq&nEqZ&DnNR(jtSLm+
z(QbMYdvpwK7azfID==T*;rkum`l0sUGr4#|z9Fyff5<mGxfXcm3RkJ)4UU3Fu0v*f
z$fs?I94)@rG221}Z7*|l`I2w)DC9;X^41L;y+3e$`4R_8aAPEp{lvHbaF|i9kL!U9
z)<BPd-U|7y{!jV%yKFT6E*n>dV~yZhyrXDat?OBetdaj_`l-XHw*`J+BWIWYBz6mA
z^ildeTSpDJN~!5C1!MZ3X at iS`+;=Kf&r(&SUR@~#ZDmWqO`75EgM1}<MNMeuQLK3{
z0;dRDWxz|&8N#45)NWGv%US;I5a<s3BIX>rOali=`mr0Bi;#b}^zovYZBHuvZ_qpW
z>)&_?cCS^nM(ha(#@D8HEAD#|_g&4A$K1=p*Nx})`*>AS3R*efiQO<v>O=lx)}StH
zQI|c$R(P|Ixejh2v118k$rN+JFXXQL#><!-&oU&Y{#WP{YHj&^Gd;s+7Xt4L#?2Mz
z6X!j(Jm`>JyL|n?o9Ks0E`^)a``--s#(n+utiN$K!C%F~?pAsy9DFIkK_C5}ZT=OR
zE1)mIKPzS;{-=<yk6Ssei=<!r$pl at gR<TKRG(6U)i at Z&A5$uU-c^6OzrDY at Hqxq0u
z7uZt&dUlJfmDkMl(X;XHlf6>99(@)Ce6EVrxwRrQ89IWQvI0{Cy at S90%_8zH{MF&J
zs(WO1rW$z at 4`8fhXLLHBhhCSDIV_HR0vwW0(iLwRn4AzGXW!B at Ihf0W@Fl)$-XPaF
z3I`Mu*PJBR_;e+8KwMC%?_J07F2TPqM!ZmikE>@N?}}4`ckvqG8b-N3sEn>~A)c4q
z-=!z<K|`Nnt!+&lhWyq`d%K63Cf37%KPW&d>hssG*xFku>I<mBp1w`g$F+%WMBD|}
zJp2-aQbtWhk?|wEJg5z+8Cc0VLHZW+XR7S`5cq?GE at 12w4l0A+cdK!)THMQwdo^-u
zVlOzh$9CPWhAkJie at 7vs58jBi^m%gM0Y0AfEbjf>#JzV1HTv#T%W0ap{}kExSR0aP
zds_qEzZrA6d~(jVq~On(szkCrTM)nh9&8-yfLOMWQlTvaoGKZ)Z)otl_-`}xZs<E?
zZeUEGz?goS=)j at Sx4Pc(UH9h1b at iEgAI=ke`H)XK=thsap??`vA?5Ds$fw5t!#yHW
z%JARgBo{L9VWoq0ICc#8eTj1zfX0#`GIy%J at uRFb_9RCR9YIZzW7d@WY*i`uZ%g9j
zSydC~S#X{S=Pg7WxnZ;Z4;^w{D(Y|w&-tscg3bk}lCS^K{ziWzbSMk!^xwmrpbm3#
z at xR?sJ>G}@mH6L;|E&}M=P6V>VvvtOEmR2PZ%&8qL-e+0>M9Li5ApwzF-7Jz^fs`m
z`WO8%R)%9RhW?ih7jzkNQ9VNhS!#CJ{*b%gcHu?j&Sm-QU!Of#TV~q(@cS%$jQxzd
z`vg@@bUxTFvM1(0V*9)g5*-X<@o1u5+MhV|bI6l(e$)E|=1iR+ip>#JI&?aHNi1VV
zj9OR3?C50ZdgiY1-*vtDOx%4NL`$IWtq9!i)AzjphrVY+93ikiq80yt`X2PWCamp^
zL~nrJw`N at L3&(!)cfBv_zx6)$ynjXfmL2+pB0<+lC3KRLMAt)1bir at B+TelE{fAa4
zHf<p~=3(fFc9)#`=V>{W0b5zq#{qNoE(<<Zcdc6v9c|_xI$H5XL7rk$#%sb^v0YsX
z)Wy!%Z)joW4Yx&nNp!KeX+-z?x#CGVf4ylV`A+mUI*+|ZtGj}s51qsDbuCi(Dy;;g
z#cP9}RtCJyE`k2M-1}#YJ4?Eb=w<m9-Z}WWpsN8l9WSiIy%^_+R<*o5azQilwfTOJ
zEi7s_q`QF~)BGH+NV#_30@%^gEljzqg39c!qYeS at x!&~GvGUJ!RHI8xu7RwR6Ftq}
z$-Y`@n9z~(asE!<dl-LT40O5@*je*|K|#z^bF;94*pY_0>APBV at Fg5bKMV}hQKG9c
zd~HQOv3ZfTV`ucMgtrRw;I*=fWf|$~4k%Y9g{6+Z$Sob!U){DNk+(0fp58|GYQ9+B
zCf103(J}w>grRS(h~+lBiiliCeC`(P<#i-yBtz^CRfyRw4=O<2Ybk?kPs<T)E>puc
zF#BHB3Ci0wZN})!z$G;d56vj#_R=!qV;-L3!2h`30KKIleU!4f_D~X91`JlQ?)!)3
zf}S{V0XlNXIm5%Gq!Am=7Ws5pW4ea;6{vmVu~uFk=GFeWuoJn|s6!52=i1Is`c>xB
zFZNILVF_#i{e))(YZbAh=pfHuCUcbdQNmSB3Ut6{c}HT;I7wb>(nf*10`1M>%7M{R
z1(<mo!8`ETC@`G&UPn&GBj5vFfbaVxD*x~Bo#anCjN<|L9)a~nKhA|UP*1o_KQRv|
z=nf~a5JP{#^TD;mBnO{AXyBa(*6z83zMQe&n~<MiNGb-7AeqFm at m^Ttr2Bz?>5#U9
z&*#}q$brC1fPav`=3XJ;<nqe0;akaoudUz5Lm?-A;*3$~5&AA6)>0|Aj^1Y|<t4yY
z_9<EO7%}gtp_u50q4C~RKAxXCr`N9u at z)2TZ?a)UxA%I!j2kBLhhbN4GcjVOMfXp?
zPS^_fA|A^Ixu-|m-HW>K<LqIf#>?pI>~HE+v#GuGuh>@*F2%zH_bAJzFEeM#I#UDa
z6 at 2~DG`ASzkMIE%(7!_0?<6vVIa1d7#Ow4@{GSDRxD{M7g+z7`JRAr7gV<XYh5B*S
zz~Y?uzU_AeF{CW+UoBLwMeLr|sGtAO8sw3>E6eXTQTb(dDhc*05qw8&iNj7{ke9yj
z$!UUN at o^!I!WKW^>pu^0ll;<;UQPR|D3ZHosj%PYr}Fh7?v>qbr}F%q&TP7D at CNw8
z(|KXCa^OPHm%wAHTXK-+uoB}H7)O4R+0Q3mk{;ho`p;31bx;HDjq&!6#`GLm!Q7)z
zU1cZQaMACGzk>Bg8-Q2S8rAcK$Xmm^>*bRA(;cX5BXGnG1n=j6fsHr_epKhr at V~zd
zzRQ2DumS7d;JHKI^{Xq%Tz^XQh#LL|8EgQ*#SFpL!(I${8Sw&>(GHu-NIeq0@>C7>
zU#;Njc$wGZeF=Q}h%bK%d9Ps0X#ie{^>1Y(5L?A9T^w`CyYXtlyr+Eq)QEBRDTy^Z
zYo4pll|-H<?_qQ at cN>ZGBG_hre2v0?AaS%E`;9>pcPBr-_T#oHV5zb9-F=Nq%GBXM
zA@&R9kScr$=B~+q<<)(@aV??yt1Tkky}*DxY+$qT5rH!x8*@(N{Ty at 0i+sNDTOPz-
z(c6#r0h<xV$QF{T*Yi}dJ&@#;Yo<lsshLNS>q<wk=ExnTBm4z235g3uo+wMi%v=fY
z)a at rCO=LdD=({tZhpW<B!6{n<{FQN22W)x0;5)S+3{j*m7d}%&9d&K-|CL5e?QI?6
zvGhLQBpJ7(kq-$xUlCuyo7jVH`7Iv8lSS-a^nS!Q=8~8QZ?<0t*;95n$oP1^o{VSA
zwZQ+5p%9*F?u}gBYJ|)Y3yZxoeD6ZF_ at nZyX#E9Qoc`Mdwr9rW%G4Pt5962%{6AA{
zMArNpxfZ at A`H6hT7LlAqKKb)R%A+{;E%MPWvCYS^?<A at zule!|cgN{Fx_$YDe}tU6
z;^PGdmta?z_bf25cY;f!>)Z9<LU`XBg!lA_&lh?EK9plVEX6I72bbX8glCrS_ at tZU
zXu+N&OqPAxP7Oo;1`%0$h5lP2o{9TUQTXbHdUOu>>V{)}JAbR2bAc at k=luXK<tI{L
zdm{C9Q?~H&YdH`2xQ%hF`wJhpF|Oq(eB8!3b|J~fZH#00{%gDq=+{`E+)hSb#$Miq
zZS#@`4Cj*v4bJ47hKtD~hK}TK44uiR9!EU0?GDi)QP&>$Y!G)K1LmAM$*YCTn+blX
z?3QGq)}$yy?(__!%#cwjYsxUo4rf#ph=pZb<ZCb$xzx<o41KZ1ff&wpGwN?bU$pYh
z)eoSoMLB}fhH?~T6Urf!2T=~AY(Y7OQiAeVl=&!sLdl@~8Kn&69h6FxcTs9kwxQIb
zJc6<e<x!NqC}BmUuA)4N@;b_6D1YQZXL;{w==;ZbBnRR8_nyM{BjkJiFZlm9?;Q3S
zr;u}Eh!=I&&M;oTXT-uH?={$?!TCb`O{D*1$?Im>KiT-Qee1@**tcxt+yA*S#{Q3u
zYwTZa6xg#iX4qG5{LKF1#!v05H*U7CQfz8;;WG~ycks}7nX4u0C?Uo(_Jk>k!|2zu
zhsBs<!>kvWqa%U~CxBlEkNrWe0-Txk$ODx$kjAMHOxj!;8*pX(n7;j8cYdFC+H1Y4
z5WOsKThg+ko)YL at d9()nKf!H<&v*CM_tDc5dzHcE++D;bI_V?idaUiW1((yMOfHGz
zpzC3O-URs_ at 2C_F1(@fny?#QKH<`Bk=L4H3B0Sx1U>ywF>1FZ0%djSkI0_~i*KPtn
zK82Ho*qe+|B{;y6%T)JEVV}1 at _0Z~iZQ+uRBU$b%IHuC%QVl3|np}Y{0kPWP`!*C7
z-hPJII6nL9c)3+|&_LI_w}1ZrSEj6rJ+Z6%1?Lmx;QLZMe3_Q;<D+N57NYRp;z&rp
z?0Ow>NQim&|0{{n%tDS{?GOjK at gSE}KY(ZF;iHKIz_V&@KeMR_b~)mM424`x=68pO
zj^p((cS|w8C3O5)2oLf3FHfp2%nJ3+*Q)L{XN3*hv*ru*=j1qkPxb69vjF at S{P@@A
zjbR=H)@gDCIe30<*4yxP+2EV{=p5q8y at +c^{*zA6(;V3PUGLB~<4cGWQ^*h>7FfsQ
zp$>~_iIKk1AC=6A6h#Z~<-RvM8GR5ho;o at i@z#@(19)=yNhW#WOyBreoK;yJ#G6i@
zT|FaATs>W at y2p%hv&7FeW=OQh=-cJ1>)9hHbI{+ns at 16T<SsekUEXyBwkrPV=a_wX
zAN&1W6tDuiJzQgT$LAhkbaaBf8|3h(m+k4)Hi==6rmWgZaG_|v%1u{5uTUbc_5^%a
z+hckVSG<>%t<Gk5tS&@cV?RCfo2qDu!-Dz!TujmRo~WJITcdnqtMdbnZot4%%4#_B
z0pznAsE?Q{6K_&`d*G-2BrCXDPWpD?O!Oo8^tkyg$qS207e9*r;ql1W?06-7wXBB6
za|=kH<X;{A1by;Jc+q%&^c~Dntea!|AM{B(Z at PClt8chEtKa+Ql!pla4(#Faz!U%X
zxljE+=g#$=8xLO8knm$<z4Z0-pa1uH=;Ig27z8H~#vJN<3GuloW9GG0a+Hh-oS8Iu
zNz2LjDpNgf(o7M6YXKO*9n~6O3bjJ}LBr_)#(w&HrolJ%ULtrGetcf+=w{fT;&bOf
z2HY4?C{&xLB*uepaEY%T_x at 228XRTg?L%EA&okoQmEK#4!wwUVaNo`XPqQlE&xx~0
zzx|m4-oYp=zO`UOr?)5M-5CAtZx~9`M?IJSp7rNNwfJ4P`a)N3LTu*V-o`RjM2)5|
z;79ydOY&FWE?j+q9UClT-s^}KHeA~QOy9~71CH0=I3L&S?ybc&GF-C{<xWlCD?dik
zs87Y<2l(y5 at j{fhalDsSFiePJkc;0Pc>eu(M&}~L0^L4^dp(SMIeNi)67e(syMgi!
z%2Q}ZKE9vCeOgeS#(i4oLkEE~do7i&_xgoAg6n_4^^fBEAANP{#C2|*+l6yYM0YRZ
z4PM6YZ*d$lD#E4d6TC%^t9XOwbt<lc_a3chEyH_M>Hu?}c4kz<`pJ9gB9aHYa|7(0
zM*3U#PEvP;>a8G-3~|tJQ<d}wx;@Z=Uxls0$UatGl;uG#P$kuqr3Y8*K^%KDrvCQV
zOtV528V&xHkAUq4PHnJQ6;5r*D#!ni4DQ4E9^MN0;&r}jy}T7T{&>soVpX~&ZI?_R
zQdcc^fJ-#1yxQsKco;srYE at RR^Otq0_%8R%#((Az at xf}09lh%IV6CrB3yCcY`xezp
z(?iJqMMWPZn3!NW>U9PGJz6b~*XZ>58!4gcJt|V6s&S)!3o%X{B>yHm+nh`vlJzC1
zNzMYk{@*|1np at ttviiw$={Jm at RCi=Ofw<@`o+6BebBuj>ZuEUIijvFMj^KW$z-jRP
zX(dy8TEgt1i+Z6S27I5tQ51z^z)zCjlgRgaU>z6n_|f%<0=O~*8FhnTt2JCi4BN$O
zIqGtngP6k)BH`z%k?DmtzJBE4HVx;W6vq7z*^Bm8JHZ8-P1?&Gavx-oYw7b|%FF7i
z=VT=_)-10;^0nM^O`-b#_<HxasH**MJT)oYIh1%gI$0qiC7li<k;lv~c+7AlLL`hW
zjzVQZW+mt;Lzx+wQMNG5Fc*elgt>uS1{kh#lLRlvCQ}qJ*fq?6K<cq?1V~Bc at 4W^)
z-}Ag)&-43Zzt-CKwbx$jvp(1NC#Dq`rs#u^W)1@^=D1hAW4ato at Y^$U#lSb!Fed^y
zph3A<Lkf??^12+w+pZxOrq&VdlkbQSXdIC~X^t>De<Fs=%S;);yy$*OpEl#JIPK__
zz>9y at We5MOzKGNZb%o14sNk|A7VzoFdl7aQeBKfGf-s05O-G$^#tGA!Du^wGZNb)z
ztrgoTYy^t{vIM>P*QvFK$2Y7-?x)uSBYGXu^3GxPquLn^@*-zGszsj0mk_sy++32E
z2E}WxaikHw-)6(d^5gajjyj at u;&`jsTVJ76sAQ14oxX}h?F@|N!-!dpYIz6i31a2%
zuO|<JX4iwB%<MVG)Ju1k{uY!I{nml62O6Y1brmZl(Qol{`+=VpkipU7_>Th?T+<t*
z#rzu}a=@M6DA2y;cy3z5#CBXaIYSK_Za!V`V9;%YK;2(Nu9+d174aT%i1Jn3iWxZ}
zCfi)Zg~_bOaHZb3zFS<HqI6E<Al}2SyIQJH?zjlwf#MXEv;g<O7EQO%xuBCrGeyXs
zXBA-Wj=t>5!946HZQc`wwtT~C(5^p%4x`@4Dp6MiDd at MJe_v)=l{+xR>A~?!tdR4)
z`x_eF-*6PiF0jCe3+S9tJPKPeqqc)DMLC4B6y-3=6P%`S<1+izqX&M}D50xLLx0sJ
zn~<m62pwvztWCfP&saJ$yo$XB{xILHOpZf5xt@#M;9M|AmUw#|@}x+p3Qj&^i1H{a
zovZ1L!gtf(xsDKina#yF)k+OhJTu}PQZ4dOy+s`;u^@Mx>xO^yM4N6VWz&s_OQPRS
zH^y|Pe at Xg)zUs;WzaiN(p0?dbZD~w;MBQMY%OL-tzG+q7K>a|Lhbg%>sHj^hT^6e6
z7MMQ>DtcRqGLe+hcK5La#~b8XJmj|0sWgOVBR&y{L>^JZZD&!o4N_(g-3a*o{rndM
zQJMX8wY3a%L==?QI)L2FZ$u{3MXWL}hW9S;tGj*>2f=<UsMY+1S79I6qq6G*AF%Wb
z>Mc&#Vhl-}HACCJvMSy8H)D)eS=Drsw}FN)0&CJQTL}DbUbzKvs^GmX4s%Mu{knd1
zONz;o$1Gzk(9xHr_(IOV2AZ^lV5M7 at tncJbW3$1Vcl~fU=pW?$t{WsS2z+ at 6;-+gR
zHSk9hwiPntvq-*+w%#2?F96++()Df6AXUKzQ>T7K9M7*aDZ{T(l!@pEbZV3Fm7{sy
zK|;NJZWi=J@|&U{Ex$fdc}o<ezxhp&J~i{j+5y9h<NXHMUDpnG$8HbXE%n`4v+_np
zG;}|jaFM-<58qs;#_jJ0e_R at 4l`VDqPDix{f$qLW_|H9k7|Xk%o7#iixp$!lyt*n1
zaRHH2n6-U>4O-EzLViB at Jf9AvMLob$Nr{Y(q-zI?_KbfCeTM!fqoVpX%B0P6F!%g7
z-%b;#`pts6(IU`zN+6dJn at g+z=7_H@%kYf(v;xoQ-&SwEE=(IM-ct+xlb)`l)1(8k
znM`chOstDt>rG2{p0;u}0=o$K#NBzNI$%>7zdV&L5{?54>Guaqb#lgr=l%r$U<;nz
z)(d>24&tBiD-BtL`~!Uu#=u*9YQNe986huO&s{+)%}>Lp{6z9`jPo2zImUSf=9x5E
zM^6X7yMeAoo=9LHC+D`N!9EftJVUQ!vm?Ihu;E-~NbF9QKF at 0HC4Ca6coF0jl6#rR
zE09I6BgZ%H2al9}yMWH_x8R!cMRJlO8vcy#^LS at I;*eC3KM_lfd0dRL0P_GkDV)=y
zl)KLrp-mE;gWg+a!rTDH7JN at Z<C>G<b4+Z7N5QK>Ujkd*1BpuLR?c9ZZE@;h^Ry;*
z%KCle&RGA&6WznVNM2l=gS at -bUFQW+1UKcP8MOOFk^}7R=`xG2C|xAbkJd%z<;4r~
zMytlfYpzBr^rl7f8>VeF1D3^EnIhdZg2A1BSa3XK>!&=wn%je472~?gi_|wvLF$V|
zTzO<6t#S3qMi>*uP?rGM1ioAB$juAgj%uZ?a|3icY2eK)kjpgibp+O_uj0mr6<WW!
zXSVq*JtL5XFfojX*}$}INpOgPlO+mzU!RNE-F~i?U<}AC^r=w~ZnkHA??lkzwfa#e
zIw_ClYycKT?Le_kz5rN<u8f$j_9}9G)xrL^$Grnu$0Gwy(R(xd at mvw}In&0eYejAq
z#89QqD)arp9!koA^lTCbaBe_6r*t4&QA%RF(1t_O_Zd-;6!-)xy)jUc-sY_*G=>k%
z?H_Kg*y$)bq-vk!#4-Pn;s1rH?9J}$Gi1er+R>k5YTZ8m)sUO31hqje>-Dgm)-{z3
zq|Gl)%m`X>E>EN5y^DDCE9pm&lV&ic7O`UA)4S>Mrkiv=^CNt3zlSYLsC%8VZ5!u5
z#7gpL&_A0lm9Zg~u4dKAehYFsT7YqHY1Pc~7bq~k^1$~W4{F)33OalT7)LS7B<-A(
ziMQQ3H at +h|HzwW|<WcpIS-0+edR at U%FH(26t)7+#)x4e;WI2~d at b3`^vT)+<@$5Ah
zfis0%kB at 3deApnf=8r?UX{P<T-7n!-7Ib_4z(4zucWR~W%Yv1LFAHyoz?c1^h)doI
z9eXkFwe}KVd`ZW}0f!@N;g8wlXTE*cev9#-OzaDk5q`l#ypO1ET7_6ejYI;O2JvZQ
zu^T_+pYBz`?-q0qeNZHjQ&sOI!Dk#Y_MiJPI!6iiJ+WT_pWG^1%v at I_rst5hMn<i?
z at MVFc8gh}5UWpv at TG<KuDz0fqpCG65mnL!C at E?yVnXIH(`~&#&1KX^6%|)&P=L)3A
zb%yVy$aPXv7<Xmym!{J+@@}7?lR~!A4>NIGDKMt;UEk8lgnoP4XsuLy0rUJ&k<_%m
zXiB%*s-cF7Pj6r;<VnOW5sbxuD;(A6k5j9noZqde6pL1G1|NwSLmu+l_3i}?PCVFg
zzt1ZJ*WHK@{G`7qQh6&*kd62=Ic(yI%xl9Ee4i3+Dj?UxKNdP!^6c9}$7_U7tX at s@
zXec*Nl?9&RM*si8+L}Q2p{G at OR>CG;yZ&)&b;@_$zondaeUWm`^)mE_cDKGT*ikZk
za!Y?op7jThdWK+Xf?t|YPu-7aJ#+tA%|!Ms+wRs+tb~5zx@#G)&3ffI<$q+uX}IqR
z%~>jbRaXBG<Qb^PqE4QdhWZ-R%TO;u-3O&mb9O^Bt<ZERRGv$GpTWBt*8j{7qdd9(
z=iI}ZEcp36=j(_4VI1Faqi6-<{Qb+;|J<ubIkx_1U4pecr4YFqRI at JllJEAwb-$y0
z7Ns}J|G_o?)X1 at 3bo(v at KXnJsu!V10HgRJ%#_f9Wh>d8=!)O=e%855nKZ|1q%~}4(
z>kDCrnKybB`%O50h47O&{x0N{t<leqp2z<4R0W=wgXjK?_boy>5AS=5wEJPX?`iCN
zvX!{*6{;2W**LcX>(ou0|KQ>_-ww3vgRf1#U4KANwDCF6 at WRAvvN8d3s2gwmVWP8e
zZ9lGw`%LExe3<n^A;zA%QHID#Jr_r%h-(!IIzl$DdVuIbSGG2<a}C2rIny`8{k;-j
zA$k7AZr?Q6Qgf^%=DbLuqL%yW5d#H(5cacC$S9xPfxPxhBK|pV?;pM-w+ru!ky74F
zS!*C<x9615y=$E&<Y|8izBJI4%5DjCO- at cuM2Q3TS*(pF`8tQrN8_w<x4i>xXB;~4
zMoJE_c+lopzvT{QeG&YJ(i~FE1(JX5M2f-Mp;M*9W*NhVDZ9n!BjoXO#d3tu8$tF<
zabk=PkTLqN3+|Wz#M}-lJmw7MdT<nRf9-|71O9uA6uCY<F<wpnFOfL0!iUKm&Im#N
z3KA3aiu)Mlw&isJpXDs at nI4n1(+j$<yU)Lb`2oF^|Fh`F?vTwdzKeOQ1;45EHn7T&
z%}+0}=)fmrE8=eoV5{$!&3q6xD(5LWiYeut#kI#<<2KH?SjKDU9#DMn&6kK*4dLWp
zEP?GHYJ56$lJb#P(Y99!pDXyzmBY<w6 at l-DACRR~ptPI-Z_=K89K1=k?9>}Amhz-6
zs4KW_u!p$$NMNmEop*V1C9X6 at +*9!+1_)!c-Q8A>y*O!}HX&)Qc{|$Yb>B`i8|^gy
z=Y2<}^x}A5Hr|&7TL5=TFD^484xu2~gc#0EXltk5^rvooitm_`JJD}qLG4{%Znw36
zjcuSGc~XBC$ECl`bLZOjIwc%MKH+BTK%m*`Oi{aZiAv{d3gw;_PP1Q)-;S at 2q+BcW
z)!l&}6#BEb#?W7SVqbyoub|z)8v!lP#<!(b^uy2I#;dYdfzLCwmQTz`xn?!-+E9NP
zb?9bK%>~ARd<1^lBV?QyK$j3JU at h^^w%$U#=q$R{QHHTyu1IXC4^!R7THFsh*<cOp
zauoQ~W8Qg9;dbKQm+*aqiuhaGNNi)^B);1Mc?z<>dCZa({r1X=f4t6vKR(6+Vy68u
z_Pb=0zQf;cfw37nn9bl%PmiSQYbT9 at -?}9MN|IZAWvfBeE#_pclpQGnPGbFpFE at kO
zlB}kbLB26Yr8g<!gs*z5M-YoaY)`Tu2XiJuv`TSD$}r>;_$K;jh+npKxv+K?Fl9U|
zQlMuzJ`;Hs^j at Xwp{H275i}W?2>AX~LNncTxr^uv8TZ(VzMAd=zgxLy-lghG!ITMO
zOqBEj at TZj+A4!(fBpx at A&5|w!54MDsPsF7xMofkg<D at J2@V-~Dy%bUMUA?tD<q5vH
zR~{WXICtP=iq5)6r%W$o-b;E at 8kZppI&4i$=?hlwTM8^%zm-QbLV%~g78oXHk?U|F
z+NOp)+JL!KB^v;(eH1>G;^eN7&8x at VKBH~h#;NJ7M(y*(+qd2T-Mx}>U6Zw at 0kXy&
z#B`jEj1rvv at 7Qf`<1H01dsG%<^8Kw^m12BN<>DZQJtXYA=uLETzhT>$!!?+_Mat>I
z at md^zFglV=9*D*<3CCp3TGx475_BNge5A&afjmKPK%d#6NC<q5`-$rnl-oEq=q~E8
zjtzl^{maq1uFTa3-tA;cQHV*SKrC7+bVJJZHNu&mRVfA>t9KMns;PoW#PBMVuP;Hp
z5T&nQxpZx0zW6=fyJee*o(bdZdHNK_9Q=#Eh_Vi>dsZJPSh-HhR;G!=zK^I{dN at dQ
zNhQc;Z|Vb8l~keN8hE(Q(9vr{(it0ncWjJ$zOxFn1i7JGb7ALN;&DZDmA(>Owg)+*
zFkYt5C1WWVvJYsIJN^SY+b`Y?iLD*^cPd at muTJs5aCc1y;{02 at Ca{LVFV&$56Sf;(
zFLc;a-dAf<4F9rlvu_wy$b*%W6^<gGv|#gOh3j49f2|tK4$y{iFI1)k!)KrZ{siS0
zPHdE}8)Wlu7=jeSw(!HZ3_<GP!_{TMos(ty&T&&fPT2Rjwj67W2>I%Ok%l&(^Yi3K
z_QpYP=YTv28oO*B`XlPAZO{d!;d_e~#mQjbV)_-T4_i3zjVL&uPn>~IMTpPkCNuLQ
z{B}A<`ssYENgV`l+^S9a8$YO5ZatpzH2;Nn<kno>wA8{iSp$WF%aAR8vg)>t-!2SF
z6U?V`1utxVk6##>#~dMR;~(H9Q_5sJ5X%JID60<l3{KIpj5r?kXTImzjlZ7WWfYD-
zobS^`Tj?Xr5szyl!<@2+wr>qVMH4CqlVXi1`DUBuJArD3h*kzkS at _2Z_1t#^8Yrb*
z|NFk*o$aU4rZ`Tf75+W5A5AI6{dz|@@-2KK=nUC>ZxC2h$6be at mv0qZb(G-Rk2qPf
zVa%Ul!Q1fh$YmO_E}TW#Bsc=uPG;4iek$>*tjvCwX;8!+yy(9d@!FUl{=je}v;cG(
z_)9ac&`RqqV1lo3$mxis at iOtM#{Sg6!SyS2z!u__jcgC}3NhBMwo7<b5xpJq(PEBf
zw2Y2&M5Aq<++0_h at b)x|BH`|B*yMnZ6%xDrRreaU9c$Qj=ynwFQ@=$6!(I`0=xfN`
zy&Z9oNeRE(ArljSAzlc4f21p0w!R5{R9^S+o@{#wFs;fIs{IcO^h_FjF-Sh$>26G%
zad+;#xoj8pR|exH%m%&7 at 9n1oKN?L(9R4ZjzrI4*nw*EcWgT`#FdAI8 at 10OX^bphL
zRN4!jO1>zC<hK3Y+5}AV-ZbQyJ~ML^_`-8vxPR|TP7c~}&v}Mi3ru4JJ4vobdDl`J
zxE;R63jz(?TI~Oh<KEU%+~>CjIEW~{iEbG(i$l<f^IV2W+{~;|#Q!kcw at 6@QgWFRB
z;E&8M=2uPTLErW`ze<;<ZNz=gK&M9Te-0)5b*R4~-&_-Pa8D2FmYfnaxH_OiS{|KE
zbOU(qQkgR>9nV?HFszz-_WnEi5X0^5C(^syL9k5Ov+cme!*vVpzi<A3-sgY+eM|4Z
z&+q>Gmi_rYy2`DGF!<!&$L3KI`Ni){@>L?Uz*ahUq77Jv?S#ilh8}|@u^vV4c)erZ
z*&~JchTLtPkXbvylO&UC($fZM*&q4qW~qJCBWCsHGv!)!YX_^M*5cY at oa6kW^<CBi
zQirZ>(+c%ZsT>lUt$J=WI*I=REzgTVP72^Al6Tz*3CcJUtIN{#r$lq*Y?E~;Wxg}%
zLLF6+k_A1}d#;^9N$z{)(ZJ$Ejy589gRWvsT)~>z&4eUob>AE}Ssn%6Z15T- at Xe49
z<n*_E)!Xuw|FiW?_~(R#t+1>3#(Ns@$o;s_-(C at r)jfp#8jZr+o)x at aK^2=DT$cQl
z19&kz>oE2sIeD(zvNXy%sI$zEtafGjza0`=xoxt at qeBKgPl&Os+&)C!=PmS8Cj0ZV
z59nnEf?svIhvfbJ^S$Jqc0KYbtyid)BnHg)JDmJAXrz9n?bvy7>iDQ-E_mqPo;>Vd
zo!S at h97V&Dtv^N9%VrFpC<qo at p-eHldxqT`=xo}GHXtUzZRb-?;cX}T<9-EcJDzcQ
zw1~79_m5%?nn}LV|84v)*ao2Eqx}B>u5%T^6h=Qh?_9vE^%|isdb;RU;iB`co^tw?
z?mq--&&TM4-TlOW2zI7In#h}~mA3=mBmOrb#`-(RZK&FLhUh4HD?(y at pMb3+aqm1F
zlX@#!)9fmyc25;>uMjW(PJz9UQ6JTKT*iOSY_GtW7Cn|<p$^=Oec9x4$O=WzEN~s$
z*2SF`^B%T$E7bNEs0QNiIh05h(#7^dk52A%wiwroLX1v-5)Vez2JUGE?m2Uc3*2zL
z?-Y~EpiL{!u<D~ZM7|NIWQRdZjXu`y$-wv83GZpNy}}f``E{EslXnaH|Jv3xt?FJe
z_b7E5Hsm|>%lv+Bo^u?z$VB<I3jhk?-0RVWHoV+k%$qA~=M_M9xD#0wv5@${cVG8E
zh_TlJTrcz|ucRWMcNV%dl`9Xvh_kkMS1EW8z_<D(+hv}BZ#<Ca;@caU3Y{{bH1sSt
zgU&@<+F|Eop%&=K^0WhSX3%(@bO3(cWh9mm*V;lYxJK%lP2x7}=}dXx$5kDumtq~L
z4Fx^w$tFHi(g8dJHeT#2 at GL2wEyVsYPXn6_om&pdBw0UX$}+^leKw^Z94VzIn5THp
zkeoHd*8(|CRUc0v1_1tcBwvWEAGWPpw866Yd#4Cx3F2j%crPN3M&~7>hw=Oz)b*sz
zD03EO&{?k4p=VLoa at Wv#XoD8#(hwgVg_7XTZT769-$eT)+H|zP65mrNh-!S7tcN_v
zFz!ACf77F)_6?{Nr5hJJBG_K0-Y4g{7-Qt$^v?n(o9KGNe;Y9BPRT;pajKSA#r>XE
zBNt9BO8F7rc#G{azRwVv=I-m#slIkDNBfJ>{xZZnR^#0jsF$EDLm#5;uGP_`)VkYz
zk<R+F-JT+}_kP<^l72-V$9FQcH}SkW-iv5^Hr+z2U8}fS(r50tqgvp(?~76f*<$h>
zk)-{JoyWyK*O;@iYt&Ys<7ofOWXy~V#niUw6Op%s*Wq=JPIa&Mr+6#yo+I#gzYM(?
zA`{H_WJ>}bl}X~6w6(h71!j-aVIuf`i#vCX*91O;9HceX%^nwl9iyIHhBX<nW9NUF
ziXF2x!$<Z2 at ky@sxIYHoY;uJwQP);C$IotUQ6xNih{SvdPL385TZ^Cx{NYnX4tAvh
z%W9yn3o*JAo at HAet7Oog)Se9GRpD)qQ+_^-NGp|g_&xSyDtnBX!PdhEU+P(k9GZsk
zGmZk}bP#J*(vC~#sgtXM`2{;O9aUQ%s~W_8@!B!O&DVRn-h1RiL8LOYAbRM at 0#<fp
zSv<!RxxSG{yB0L4vAzj at kJCvzh#xO<!+bAJOAqN&QpW^Q%-TbO_0WfSjk1lG74VDv
z;^6TcJ}czqKd$;|palCVtLFDh4r*_lTTugi`2FP-*e^WD-Z&qm$NoNCn_6DBYNWps
zzR<<2g(-U==l*+Z!WBz*%GT)aWH0gPYJHGnmBvR~BEI^5EAHFiIl%H|qDR$CJ9wZk
zSK0X4JLUS%H+o(?(Q}4+H9zg)4NH6YKhaCZh9Fx#DC=YjHr8G$N4#tXF!Eo^S3SJJ
zPslg+iN?!uz7Y8;&8xEbKM!X*iss4r1$G%TJ at 7el|2XmzOo(|^E&6BX5}E=Vsj{_Y
zi+8<@siUqig|p@;5<mPh{%CbD=JMyrLy%13#RT)(NS+R3o!5Q;cnR^3$2dAl3)$PW
zyw^WuYqP!j6yk?J$8#Kb&itM5HETZ6diej>KRz3AWN!a>_ at PRs{Nw$fCwVwYeD|bp
z;6G&*;N{wRbEkAFZ&AOR5Sy&=xC%d(F7p3egH!+SXn)^X^8eDsho0;Z!rt}8p(kz(
zu3##jTeZKxp{I*__0V5#46P7XJiBT^KkRP!H?>Te#>_9fPm9I*mb;OGef)E4;cL4m
z$Wal!S*j5J?)6W^C%x+KUoGEwNi;U}pMH#*F!HL1FSt9-zIcxQY$0gN7aXmpk=@`Z
zohL_0{K8dKN_3VUIT5IBD{|;6c2Bs7{Rp_5CjHHIkBbXPOnMkF(}-Q1S9RByj>g=u
zQ1#1|XG__!qt$cNjD?fuX`+)I#n`W$16#C!_=-jopL1rd at b_6o(YkyCClB_sEU7hI
z<0uRVM%%Y%^~hl`aW-ZmeLDU@&F+%!ftN;+i>hSZTi<#@7CsXhwdF#PWgl?NhTS-3
z4;lZa88IBndeVGPLFVuH6`}{)la6;S#JW>Mj*a<2b{dFLx$CoHf at K51BNgHJ1K;kW
zzKDr>c!b>`GwM`(&0!juQ+W>dsxQa=;ByX~MydgMg-+<=UNO^L{`H-idEz%~90uLh
zY9rR16U?<)nE~_dz~k|3%qgNI9L>>lVM0MXtC?IX%cf!j=Fo-a#K{0ApD7A>61g4|
zC!b+*Dd6N}=mQqg1?GE4E$^JU`_%HeN7vG0%v$>SBfjs<o&4MJ at rO4kv#Ao{*;xi(
zO-37ZkRPff53_hr at s^pB%e-Y+qjKQe*%aEn-ln3p*1a9N>zXL=fCcmyz;`c4e0yW4
z`kIZ7Uz!k_ARBTtKz1(+I8N>vdp|%+?xFtAduk?25vP{n7cqH)**q4jjm3G>LtSBE
z$fY2rA`o9P(j%eYqm|Mb+V}G%+RaT8U0jnTNGlj)6CCi7j}Uz;pEPr`$#v2hOK&(V
z0SffZInTQ2=g0oo`1^=ed!8|^`k684)b$OSGpSgeR#p<Q_()NJp1+OF?!P;yecQ_{
zWRaeX(2w{w!5?hG8`oLeq<?y!*Q<Y@*6$2Zb6V&u{&qIgE0)fo%kgcSG((4HXyd~>
zE+sIgUWunJKpDC at -?^bmr<yFpu>waOb*%4wD#JT#L%O#zbv8#W+PmpRd{e$>1iL>p
zYKDy;<(=JM&&fgCNuK8Yp;a?%H?lHBz;(`_v>;Eejos%ymd%Mz4^Cg06#LF+j+ug*
zTwm~##}+jJ7kWRxxz9Lhx*(xGLoC-ELCs{rH-!{)!Gj99FrQj`;dScZg?-eaZ at Q`L
zJKy4t^ys)9J$kOZ2l7!*Ha5i*9c)Xr_cwLa<!>ZZN4CoIJDGur)tO6>qu$MTrG{<f
zU*AFOxO35-H=PS}q8N#wOD5ivPQBKn^YmepJ$Y;ra-n2XJ9>aS;a4aV#{@GN>!_dP
zD{0lysWEF#&&;W*mLLYKk(>2KHQ&Y<fXh|+P91-Yt5UTy=b7hwyFH7wXT3TYQBth-
zqO7C0&{Ky#Jcjtt4DGE25-qb at qU@&35uc0KN7OqCBT+`yi>1PpS%%nJ(y!s7Z&N~}
zBGI?&vj<M~yidKRtrAOs<58n+=1R7B*Ue#Syk6CwU4ISV%aH#0mzp}XBeHU5{F*xN
zcXt9i at FRhmP2guA1g4gI4XoE6&|SR%EYp!F_ at U9j<vamfToKCBLrTz<Y$gr9o3CnT
zdP(+VQ$Mp(=u##8pJL?BD>J&m?;Ujg%no at r#zgUV2=sP&-~ob>?qy-~DuCPPnZ{P3
zF3%4Ne9&2`n at 8EU%wy6K^8oDq#CG-y;#ZUT|NiRFwvcu4-6_0r=nxPG`hz7Xn_tFC
z<hiT017 at 9TwQ=Kzn2X7+W?))ZhNf_ at u#!x3ew61`wDWXdJ5v~`*OT158+rzq)4(+S
zEJESgNmu0u`4#go(_O7*tz at _u@;~T4RT=1j?XQ~u8dtymitcE{^2^8abh>Lne~t~T
z17jPpJ|8B}VY?XH`U+t4O5NXbBd{9nP-MOL<}U5)+My;1*1HX%Nqpg<HoYmbKJ at B6
zCqHCBj$F(s|F!1tV4n5pI%7d>or&~?aPdPAA_hr^v7HVXK&%~PI`&l8c)j~_4F`0(
z5;6WZ5=Y2u6Bs)akjLvWmq?)2AE3Dyugej`aVq+)zWx2Bh;Pf3zUTE?kleWtKI at r1
zVtjicwPF2VZn<c6zhOPCKY(LtuVsvvyZ>damxS==e%cF#y2F$Td_t=BEF)R9a-bl(
zX1pBoL}r9WEQ*vbl(Q*SocNdVzQw=~$Yu&XE&^|_!FIIgDswurb3=7so~Mva(VWpD
z2lT21d5Pa*ysXHVKcKDQOTr(LZ(pU>{tl0>;@4ga#f;4Vr|!(eiOBIAZMv#_WByss
zt2s6K_8jw*9l8&_N_BB(Ue{G!GOp_7k1r^`;TQH at f75GYp;fr=hgX$13PVeT8Ts%R
z(MD5t?K-9-x7w>TxA~>lb4{{RS`)saZ@;7IRc)wKXFHy%lkPteIq$}j$VSIH&DRXU
zXZuW>Rw2nv^D^q9CQkf4Sj?dhi)a7+<AF$y`iHon_ribf+aG%Ol1*5tOM6nK)yS?z
zCgqKyKV`^^vEfhNAZ#O%(_nMCgYO2t(Efvx2r6a$pcfrII?fKZneqXx;PoiHcCZ%2
zIA*5D2`XD#pofd~PvzILs+g*nhBr#q+i-mbzfqtM?LBYfZ|%#D5eoLpL~a~031Z{0
zZSk%-maCUFpkDlbW9an*w$Q_eY;6{uX at MzngkN(>=`f>ibk|klRM5hM82g7n at 2+G1
z4}YVk(k~TKmoI_#VQrQnC(ljJ3lTp9 at 2ntpd~NKqv%pz2c#g1d^0O25k=dJ7o-Q_p
zpS}M-^KlBd1K3dOLRGNAC%e)JE*xUUU;G}i@{pTjpLz^5LQRDr1{OGep7qEF0c`qN
zh0!`-8s&o*kpk}}4?Z_?sg<LV7K0}#4F{%uZx;BHbq)ig^86G$Pn`eQlq^8-d-^<>
z<5-h*x`^RYZ{$*@=Lu?9<Wq+otTJG(=VJIz5&WH_ii9XVo$R~<U)OTR$rNt<@Xxu%
zoF(`Wd$K_vq}mOj6}COu<bP2F2T;LEr=ExTUyAu(bx)c9W2h}$(Q`di6m3I1U>V|S
zTgLxDeuU%sRY^Nmbyj%^YM{%lZM_a`0xNr%s$>a1D(0pxO;jjLI~=RCNS19>lKBa_
zq6Re8or`f|EpTPe?@o86Eua7EGQ^c3_II){D*JYkYUeCZ=!8ebangN(#y|P4X+}?F
zxFKJyDIn{M&jXW72~Irz+ukknWQX^p|2*33;dvrpZj6YX at eh&%*4C5pMpK{7QSeTY
zEM&}NS;Xj)whF#Vx5TVq(%$(r{cOw?=4`;@+X9exa>=UMf0(g$m#EsQ(#=V4sg{y;
z?{RD|pQi~A6mxm<De&IMzEx9ScxQ(;_t|K~|2oV8c at lrW4pI-@&K*L22c!OGI&xCH
zG-u#UfSz-aR))fZO=gfKF|mj{w&kj-jnQM{A8GZJBrI%;kp at 0OPRd$|Rv#`&SB}NT
z%%Akn`8~WNr?XuWpx|$275&ZyU9(1dGB%h8l%ao-**27XFQyl4yM4n`W};#<Z&R@=
zTGAiYh3`4ZwBmko=+elc$pVZy9i0-|8R-<<WD|fn(9~{t?G;Bs<mC;fSP}oGT^V|d
zZwohK%}l*Cgt5I}d~>P%##0$r7*jwN|J^?2h6}7}!w)7Ed^6_iW`OVLR$Uvrkl*F?
zs_rs3II!*s8{53l#lHEM9nfzeP8oU2u0A1TFN4R>E%NEfS=7;^1)rgR@)Ne at Ngvko
zWCv at 0QpgTF?k(Vx^^|&o(4D~NLg%1=(xzwx=tB;82`x3PM?Y#O^PD+LJ)cvgaq|v~
zvffDL+m04-)JJXaTvl<{jfFB-ZK3JF?34E#7xxohjQpcV^Z4?;{laf_kmt3oha?<5
z+2>zPREm#kUEn1oMIFGwdNtnyd2p9Fb=BCwBG86|+B_Zj1lt@&#p%_ygkJ-#VB#a|
zb`n~#V`<e}umd~~nl~tDBI9mUft)x5qcMx~<rIIUCHzrqYYW!=vcA`;^uB!*13Zli
zc0RCEUhph|KT$aTOXIqKhYp;#r449nUXf^Pt2 at Xy;#+k~8^rw>BgOA%-Z1WQ(oV;1
z$bC&;mg)*kT at k-yY$-#pMcW)DWM6l^)D+nedTqTe)Rs6z`d<uNB=tPjr?=ua)xZ1x
zTedl9cQ$C-G35RDCr7=<K>q}Nje$`I$O%m&wCzv2HvS&3R%RgUY}iJU)19&Se+<7*
zRl>{eTm$o_^eTIl;BSO!hBcaj&CuP{!-i_}p9eq2a>!*9keRA}^;wR%c_J?poTZ)?
ztcOM5t)VYG)oaR%D<atcAN{bmkQ!#i1V??;K;nn*uOFFP5=tXH`hYz}Vw)1CuV&^`
zA3;BV at IVoBlUYXXLu`n#mR~AI><WCl-#ZX!fsfxO?IjHS_Ho_Y$Yo)yS%UYaKFMQq
zGDUx{<wo at W6Jzf<#-^6E1OMp|+Oo-69I7`d-EoZhxV9c!9kyC*H8K;^O)VFU(If0p
ze1jSr!A1KI-qk($hV0%8nozP_3Ar9PRxNj!6U#Nf8kYQ(wEMS~srbkcW8+Vbdi3E1
zGS0CM at C8>x`y*}nJ66x{H-~>Weh0jJ7)PF8h_M$2y}{PH5~3>vzMP}Kcu%$~4K^}E
zpv7JkcrJQV-~IuM8w;jFhWIFl8Tw#DPsK>CK-oPBtk at I&`w^>zHRzeSEqZrMp3OA~
zJBJ1_P}PWO=JQTLrbe8wBH<Ag4NTN$l%uC0_aeTD=r~*otQF4_Jr9j>06nheK)I<H
zevyqAR1CbR at eJjxHxOrUhVNtS(&MoA|BUtS`CkJ(IyrI3%l%SMF6^`NkuqS98G9S3
z=AMkZ%Yd6yw)|1lbM7uhy?pr`s<}7n?o&Ms^~LTI&t~>et!(*RoIlJz&4y^j%jcth
z{O<CeTi_{a&yv0Xis at U8dBml%`VLUX7=~ItPZ8eMw}0#j-5n|kn0U~o!akDEm=YHv
zPBih;CunWckKozL6Q9I?$;J6h=)LWpr{L at RTMy*Tr?Zj2G8>p5M-kVd6cp0Re6w!m
zg4cCwSt*Ve2FL{+QL21{Zg9RPAd7p3*67oKLEwRN=6uzdQI`ro(H6n!>ni at akW_9B
z@`h9)51tg`{S2)>{<7Vdu{^EdKh}}Tm$Dk|%{M){hk<n<?bC1{r1SaHI#Q_&T90Fh
zYqnQ2WjY&G5c)m#)51iZ at A1!F)o4H6a}&=x%s-3!6YQf*olfLc at TMo<_C0xDDkBWF
zp%hasv>c`AuF3ArSVLQK8tntnSNk%h_8_Jl$13f68Jk_qG^YHH>yBCNsGm%^hkB;<
z0_vwye*MJ|_A|dKnulXY?w-K0W<MSLUbC4NKkj64s1?U+?v{iZp)>nL`!m`r!nssd
z=ULCqp_|!I*-a*!5qeys&Gaek?-=R#xHhrQzkAYWcL~AJ2r(Z1kqH3}iGxo7^iW<a
z5F1(w9Y-B>95oojR$4?AzLVN+ at Od3E1ml!8Kn-242)f)<lK%s8<P1j?{4UnAayPv}
z&Ykc!ww%Nn0E;$})^KuLO9eK>ObCho%Z0xMpP00?bMzI)$Kxtv!I- at c8vQWhDtGt~
zQZs-T8kdqbxjg21Yh}v0^e=Ul3!tB-B*4Y7ApQ*b2H{sCM_j&wza%=3A9pDa_9${J
zYcinsE#`zy!z~S1fc?D5r*%5i=cAr8`3#%Ilm#qAJ$LeNs8=nYJNYb|3OOYUa!Msr
z9cU7W*j#>9gdFoCm8lDrqfZ~BkUxW(fWPy3`uL<juB{JPglC8+f&0$XLN|UFWh1U{
zKz$PRCX~ORJc;sGnTlya`A2A_%%n^6Di707F2%WKT;ED!;831o9vpkuFBd+h>CrC$
zgZ|}!*?4{}zUijcviy-rKj>&GnN&tB_`d1n(;j~W{_VkTXW~)1o^B at p@)z54(tFiH
z3(qXHJX6 at JX8cwADYJb#6=a`71+wW(;h?wq%%IqO7V+W6;mob`ajax8()=$RyMTH*
z%5QYbDBE)R%7w?4tZex>6mjMGD;tje4dXW>xF%@;<x!OV!Oth%UiUE@>}jTfhuTN@
zFR#f`%)`Qf{Ja+3M0%l2M_F}ufVGj$)aZt^ut&KDm+M=N+K;_qSD at +xo`el5ml>C3
zQF;%1#0JEuSM at f)=csACJYex;#qwPKbe(>(Y}@n5sU at E*)&)|90b2e;z4FN_5Bp?5
zKt9G^8^+$h$XF$G?bi~}E#0cUp~Ai)v|F{X8GJICcg?`ogU!e0Wk29)wR1fi?Vwlh
zzJ%jBwX=fY2WV$JPjJ-SFMzYx0vk+okM?e1+-maecm^M(6y>3XkF&{5W0zJ_S&9U&
z3$PhC+I61QgwBDEy{J%qu;4$qWbiq_xnk8rV~-?W!gEvUGBW=#_sZBEO at H`w!T&vY
zViV$d;<yzpdc+*9i0McdJ~J2oEx=D#sNSB7+%F<JyY=^{m80d4w^YC%;^D)beE39X
z>O1GulH-_fcPF;PcD5RR?=^0nE$~OVQp&*2MBn7PRw2#={#>#jz;_F2#Kh5kklpx>
zO^8kTZ+&#xfArDkBda#e{4ag9%4vbGmsK$4@|~Ki(zkd8$m;?-9{ldaSTCDl2N9FJ
zX56E|AsO=2JWljspVNk(g8UzOMI?8u(*jw?z<v&W_jqL0Ti5anpHae(a8CDi;9P02
zt|2cPc at J#rofm;^h3o9F7y7hX;DZbrBx}do76!ZsTz^ypT`h1v9+txo#24+lPeUYe
z^i at Jbh@U^&qHu~B)lm)XN?~Zjl0lvMoS>`dsbudWf9S+Sd*?3{v3l7+ at ->Sq8Tr)g
zwNxeI`EA(h-2NaWw(ft(xJnnn{(CL(DVM149CNp)o8h?SqEk~gUym;04}ftjXAtw#
zV*b<CD;XoU-nY;FY3p6_0I~JP#k<cRZnePgs9vCA`bjLH^bw}tHxu?h)kryA;t(Dx
za7J-~xx+5{3UVoE<sz9L?OL%%0Uxkb`2DmJzn|#uVrtu~VACbE#k3`XJDVo)4SyLa
zqf6jt;<i%~UySrk*dp;9*pVyL3YA~j|IOA*?7XSIA;#~v*{k7$ZiWB3G_Xl*3RATs
z9xr;GH}Y at qTGozln)w58)xRXZ`iN(GidQC!W0o@|#5YD#Yp<HJN5V$%=Eb6Q*Mlau
zDcOjDtf}|_&Vh@$bTYk|hJR+*?Hh-KvV-bhSB{QECpqZ9cl8 at qX$MLZG_vU(8p?$I
z;#J!I(hG9N=)eC)dC;zW(*;dZY!9}-cMZgFvVU*|>9y?_if|0uqaQlVtA6c|xnLmI
z6F;!7L*TJq^}j}ZcVux1(ayi)J9cx^$Uk)r!hZ4D;w;tGfpeKA>ir-?NS-u)qn~5r
zJQ9Z!&4e(sfH$Yq_pYiQunY**Cis~<(9Rgl8`wv{GhcDzrfecMKw$P-;IoyFF?13(
zgGd}pof^-0_ahfuF$QowW$fL9yi#ef<%zH+o<KZQI%9<mx57T|zHdJ#4!rpZ{3n8+
znlQEpIJY9?hImz>TDHQCPu<W~3_5XSksf2C=&K^#9j|29ootame9e;oNqivv%t;sQ
zh#xTDL7rrDQagApl*#`jn8GU__MhiIFLR%7^)v4we$09tyR_TL!rwRPlKY;Lo+A_R
zxi|lUI7Q?aH2*?;TawzbeHn~<keB2y;nrpCu!)Mmd*(9mTMdail|K=Ld1J&pd&T2&
za9I-7J&gJqkITqC`!N|euk1#@n22x0_^A1NGB2>kBgT8mpC;+%#lm%FyyND7{A#AI
z%{G4 at P1@!@KH-aJdf+|K-&hM{YHk<N(F3QTd-zElC;5>_xs)EcvrlwM7aM)l4y#X=
zqrykyDE3h~NK9ZJ<ey>=u*!SnBPaG7toiV<vGP8n<!qY0l&xcwVbd-Y(Q4X8Tacrc
zlzQU(0~@oNBD at d$C}b_D6aTXBQ8uNNfG5QK+wW_2Flwq9x+37{GAi)#t&D`p4czTq
z0=m@<d7(Nvz+tx6QLUiGh<CE);XVnjA-HVPlz?vMCBy*1U%4%K&~=pezAMmA*A8Fv
zcV0(K>kW*Buen$7zpTOECGqUyZ7qo9+m!iz%0NWpQoU6vRE-temr-UnHl;4anERuB
z^R~{zV&)Fjuksk%2>izqJnL~hXB_ at 7Lipayes%%+AypQ)wsb0%Eb(m9nt%nMAE#v%
ziDzZ~fe9ogFXCV9yN=gLT$JFrGuB;doUxp6ndya at 6CuJ358z!>l4u!xZ8ILUxa+`N
zLk=ZuB%gbPsOv<8sB=6*)J^z<+rSnntSC=5z-PDs7=pPLWwb?heZ8^UN!Bm)Nri72
zY-<_l>s*w_P^O`jp*&nc`m7Q$U&sT6V at FU5@sAkV0GjCb2cvB`mWlnNj(jp^U%!p(
zj#}i0PFU3NL)YLPjmah)%eAP`_f>(P-oH<T`*cTQ50#?K1wXCE{8EF5!++x(si;UU
zM0*Wr?=d_>#hk=5j4_8TD%6Re9eg|xbB4H61~I32t`uWQf^ma56XcgYOD(0NpsSm9
z-?yp{I1L^|X2%-s0lk}dyJ1}(@_Q<Qxu1{!iTH7LT3UfSw+VckxnCoPMKb7VaXQx8
z_-lyO0uIK+YXmodyNeRBV`%F*f5|4q`>><fALh>qCm8nEf#1`p{~bQjrNUZIi{R}D
zQC}ALdJVIkt)vn_|N7yNQG|LTuMFSZh<t^}FGVx16`^|gexx(S417NDJqp29uAbI*
zJK;ZRyRe8kVPDQ*K196ODJL<Jz_u)H8u006e0=oq)7U2~z`vI+vxFG?UPfD06AuXo
zXOP?x%OO)A4~)aQ`ZjohV&@#JT~3|=-;4B>f^-)j`&VF3j#&Xc5aK6l0~Z6|Dbrr$
z3)~7e&h-Rr3k{5lii+ppo<V78;4n%jp>e>gh0hWXF`(?Ab2-+s*rgrF&72Edu`951
zW*&)UyQwR at XTX<a3Ph2rb*a6-jdp>?odNwSLwT0>$V$U8AJ8;H5AQ+Fk)r$qC32)D
z{pwsZtlm10_oB8W at MF-k(A`y$D%e9Zab84x3bj>uP7|*A3;bx1TgBXoedKR2ccE-W
z*^B;cM7=q&d!*8*+aVX;enbgdN3-w4X!G~3)q$VmS!pzEIW&A{rp6`vs4N8d-FOH3
zs{w6;PK5mm`?ArrMcJcAK!@@IVb`+XWXh+;JGX;<0NZp~Sz@>BwqTs`;XQ-?zdii~
z>3iP95kSL?7~wx0!KlaHf?h}@9GqFqyCkUURUL_4l)u~9t8&F}Ng#X!wGvzKpYw?I
zK<ry4-aiec2(kGI<MaIkX~WX(w+$<@RL9q7;ENvMir_s2Tm}ur6)2r1{Ldl8st}){
z3b*X2bAT5mzHs=49JD)~slZkyyzONUP-{zgD at iOj)y>VCG=%D1cYSqupA*+-lYQp_
zPBv(k)?Jr{k$%a+xW)h5lHd&EJtDgfI%r9hlRgA*EpI~XX!l^C&AA?9^~z=7;<INF
zn>HoGqR(+Ze81RhD377+Mkzx+4Kd10_j6CV+d|sV6k%L?9LJB~*%h>vX2|~m?f`k#
z5t)d=e?>g&;COaxE@;yge3Qf*xm(yl=!W+8Gta8StxG at FZrJ!CuD9(rAQ$!lm1=AT
z{!xX`chJvgVtjw>dV-99{L6~yOy}kJOzj4Y_4U{<i|05j7%L45Rq(T1tz(}cr^)5>
z9U0e at iycJVVJ>)<K&*-5;fD7WH;}KFd1{4R7UDxAzA-7ht+#>yWqU~8Re`#DB)|5t
zTe?C?Vc<Wy`|Tr4NoZ`|Ox>LY9;lc4N3E-5w at iEqtTAJZE?vyKg}E95+SBQba$`*d
zWWu-c$=Sf0x*4GKnh$@XWxymHVms1-**Ri_elY0s!tQ=wuBV#TdkxW9-Ti@||Im-`
zx*3+vpFaE;cN(1un)m2!VGwc&!AGPVn0%+83ls^i(gr%c+ZkAaKE8-}$ugOfLA){K
zB^!H5Hk7C#YXn7dp#2_J1zDWuG{L`Z7}u1$uNjvOp<a#pG&%$KjL2NrulKmdfF at I&
zf@`>6o?hXdP0weQUcjXQ<}PwK`&#)L<l~ilbdAb&2FCU|@)rO7)IcicOQx=%!W6FI
zXVd)zbDKYZzcSRD9;(pk9%O8hc||(3wT0G*OEKq70=&oL+GsWXo2LtS5dDa4J_<a(
zJ2B(fFCQ&B^kH{D?3gG1{0CbSm}fk?N)`n69{1L%y^^&*$vOmTZ9K+BBy6?uBv&Ei
zgEaaoXqj;0RnSz(NZmiiAm6eg?sEhDYzb|R=hc%Oz*G5gffM&LT?Onn$*gwhrPu1r
znT0W3$ln4xPFo{vt-wsqubq>DHvDwxJ(3Hv^}4V&;0s|b_aM1P*gsYz-9CFDC_AF+
zyDWj2%{sjs^4wZs+9SyI3SDX3llw_*)}`a!F4U`i)WEOp?7j`Z(b7HDf+}v*SHN0j
zu6Y1&>suZC*Q>i-V%So5SBF<!MSSI at O)`t1VWFXSEV#lyIn*E+vbuPiEG{B at ys@0b
zzq_#udVF#q|DB7hinY0buSW8uoNOX_83(f)W_wT=llLatWKoFINm;i8>-3v4KdJyY
zEtYZd$?oWSF=BBA(^)-YgXPlAsIOpa;R_>|zOivPi3 at Y%8w>(_!n!oYqDXod&yY*E
zbC8Q0xM$!`f}20MtWhiCWEIf at V8;l7YvPh_CwUaii8A<QC&kj)xW?gk_ybqBb3FTG
zcVraar5!0sw#W*T&B4vPQZ!jU9o^38wRmrutQ5!1<aoj=+0go;Zs&Rv>T6^}gtsJk
z2mZ-~cLyeyBFw_VmdKu!-R9&+lyv6Y-#<N)sc)o=B#ugOr&~f~j_Y*etauf$;#Ad3
z6p51az+E(WTnZPR at sPFeZ0qhP=dR)$2Qg|Nq+*RswHJdHpCre1I3C{?vi0#B4&)z<
zgdgzz{gVzW*`NG#|67LzW966p+POTzgu{w&tpg9q0p8cvx0`YQkN<gR8+j+;?@1gi
z@&Pi)F`bIKp7`N;)UT}Ae=pQn3QUy!_rUXyJ^x|Cn((&oyGZU)^rIK@>LjHLVQ<yq
z9jkY=$=U|l#yPU3Ozhvs2h!;}X}j+HLv4NM$F@$34=zjaL!88T#fhhCLs#5WjudKN
zpd at sXEN<1-fwDtCPC~bqT^81ZdGj}EJg^9&ORUH{y0h9SR#BpO<SO{!k at XYYbh7Vh
z<cM)y5b@^)FEfH`>%qv#$JL7MpSK>Bz_zB;-^4esj8{2j`m}(i;oPEs0b|oRK00>?
zSsTwF=57DINF$p at z72gX0xwc?+Ypp%w_#p1<9jMGE^Whgo0jV>(?`T+u>yYU#%17H
z{Bj)N75?|UU>t23g5Druta=d7C-T|{;_jEmvl|{ozR at p8Jo){4%2fU2bi!v3PBv^K
zc%hI%JqB+zO!q*n)2<Ym2xD*%7-r=7O>!*34{?;=cMrN{8NyQ^m9^~7Hj%u?L`Ese
zS50r*dt#(OP-4pSIm{*ejScIejYU2Xwhmh*Hejl<_1J9Ks<G8#3+CGB4s2SkftCUv
zt(KaOe!74-gcGE{6p7MG!V8a&o~)gx^Q-wl@=g`4#J5RF-;S>vzFYJ!Y!@(o&RwS)
z=Erowhd22)S;w}o$c~tP3$jD+K}V@@O#sRH7Jyhj(1eEBjBsqLZYERxR9f)kyLJVC
znBccAxOYAE39GV3GTCFXVM at Kv>pLTIbwu{yBOao2U`S|PPI%Err0+7RL75S`c5=@9
z_SK-{>$2Ee5eky0qu0}#1)5XK3yaA8ikzPtkvmDs$8e4tk$aESAHee}2P%ZtXUOxO
z7FwPr7+&8aAL+;O9<I-Y*5}Ca7loF;lH(oj<MTAi!1dL><hj{+My~|V_-;Tbw7x;E
zjY6A-f{sVz=91^nj>y%L@&#OXIwJQtsUM6`=*fLOBbC}3$`m#;`0xkQWk%fls?Zuk
z-cyZd{1lWEk*grrzZIci$n^&I_q<Hr+eG&D5sF4qwz!W^=Y_e;n)_vCN at 1}11Bph>
zTeY%SwAl4|N)h&jRyq2lo)-qZv{lGkcUaaAec*^V?bs>c*+TDzYmVK&HpBI~`+FZk
zKLiIDcwyDIhmUXiDgG>;ch0Iyx!wI+d<-ywldYN*7wYR!Px|v(KXc5PVDqk3R_Ive
zPF`53cv7ifF<5<4C{XG9SCPD{uk))WR5RqXk_&_(sfn{)Pu7T2;5*+<84j-bKn9*s
zjkb{Q$V6M<%jt90H8kFS^3=N4DJ-oO68AT^Vw?!vyz5Ku?`ugh$Rt{o7uK4SVqTcc
z_>Lkt?}H<ZDAqRPCaVm(P3!GNz%nvM*6VMs{Y%<Y{dHpFngw&jv~r*%@=95C(lKkG
zwkF(^%mJ at C@5b<okI{}YYp;jh`Yn%d?csS=ubk>b^u?U}{q&;i^RTWPB>(CeU7Ek~
zY9V5uEDRg1bVLjEBu5rC=A+Z|$UjFvtakqougvL$R_fvzb5I}uAJKZ+!Yaj<!1Y1q
zf9Io~Me6*T0hOr~HXoC09Tm$-iI_E65E5HjivIls{hR0$#A%3_b?X%7j9R1qVyE+C
zx^~?sY#uOt75wTx$WhBO91X&-S?0lklXcJ?n1x}Ub?&+{Of-26{hM0#f+Aspi<}OI
z{KHfs)`~!q>nX)@I2Bk)CY_Kmg{h?lWS&Mw0c+cWHo*6A*&c at hSX~9+VP2oY`E#$$
zk0K7YVvj1kW$CAu{-n8gP0<?0t%Gr|lXJ0F)Lj7PQt-cb?b0W#ni#M|*JOXho?+5v
zd<c9<V12>9`jY<ySzji7(LXhyA+N^V34UbPE{utMzp at WH))n;<+H*9bWGV7*;6Edl
z>15Mld9{&O?r0oVZ}Q_F|KG7arBfzj8~1oZ4oJiL!C{dD4m5ur;)sqBx(|I`1?JnE
z;1 at gyUl3gOfrB~faSiq97t+T~C%eb8PhJzuyWxX>{QlZ{U at Xe`MRpZ at 5PR3()un=;
z7?4emem?Ij&%+z4_^MfrOV?UUqHA8Sx*qq9AqvMMd3ov4bMr);4dfg6_0Y9c(F|+_
z+92qWSB at ZoLSekhb(gbbWrN6D)X!#7V#q^3!qzK9uCzu$t++TY#QAYdmtXS-9atZB
ziIK;Ok&;;VaE}mErVDw*vZ#Xi5Jx8AqXb?08!8c%_E;sQfo>vqsVGc=Z_U`hnVMiL
z^`9bcpnUB*@r9J|<2IdHSH81NI^g$dWisb|*#LW)F-Fy=0Z&ON*;priD$F4|#|f_<
z_m)@R<!Y*vAJ1VdP8Gj!kU2Tb+hKJKiccc$5`El<J{Cb{N&r?F at a}@7SVyZJr|?gf
z@@4`{7J1B&yBWCiGIQcJ*gigX)c!xug~&`(^hq at 5870$3!*&pV4*3vXcUXL497X7>
zU*RKz+&&YpVojY*atwYTwwp0#YNaYlFqH=!YkQQwkmmvHmYkxv3>8(PRXtP;j07By
z#hM>#w38gOs-I7fSD&mIK2o$8@#jUna=now*FU#V<9arX{mLLyQCkVm#ydsc0bUHa
zLi?9HJLf1?%C^1<U7y%>d at 9f2{qy<cy#AQCd`hqD#(1v<W>K<i2)I`{bk_*tjKLG!
z84Fn`Y)u6&!9SAqz$3_$l_ckzpF!RY3owO8fW<D^dw7b+46}qp2k#>}M?#__ at 7YTr
z6I8Pr at Qc$zHYc1PslvMY>3v>rr6RuZ7TSB^{{HjWA0T{(P~~3hUK$^mn;_WylW^6h
zfjVHZ+~De3`yoS=<NF^M!*+FPCN(geUi7#^CE4fB`Tm(-=NSR861M$xI#S{4dn!BA
zchwi5<9D%^G`izh&+JjT at fpALI0HP)uI^DqT-=Tr!dExIKknuBq620D_*T1w#EESS
zMts=GrU4!YI7gYSqNsZPtu=K6n-5-IKW^Ufr!DZw6k3CP7INo5NUWTo>&d?YAN!b{
zp0$aSM0C#3<CL#&(;bEX?Xp?*yl-H;DRCkvQa9wtSyrOA-XDNDuEG2c7%>DaaL3&B
z3$k3tI69)EzJDH=vik$LkM*XKSig@?14k(a;|e&93%6p-JPw|-1UwMYy$<;wM7+=x
zKOL-yZwhwzss5Q0_phtEf1Lt-Px7`VAlIwWe?j+;flGk(nlCFP`q?)-fl(QkxKp5?
zc*>*43$d4BMu%#=jC;_1T^{$Jj(-rGD?c9Mq=6gJ)WtWjz$gZtB^WocelH_$j285N
z>3RbToGf20-hr_>KHA`|i2LXl%{YZQK<c~67{HjtJx}6UI#;qjjcfGN*-t1`9<PDl
zOjX1MxBB3@?q}D!;KMlnSNOCf=Of-r5H)^XC-E{5iW?q=UgQMEt0&?^x1#g{Ub<v(
z)V!LmhD at n?Ry0>FD<t?EghwQ}NTTy!m1ACyaPwBS?B4|&bTaz*1HvP~2DJ(_SRN7^
zR)G57L$>~Ql9aFyJc9BQ_qnaVRl6ec&r!yuERMYbe7v*yW-80CX4lIh#^1j{KXe6u
zEw~W;(ynzQuWuvq$%pI}koPZ!RYe%j$+;d&Kf^J^i1?m>j!HiECgKu_A31CYR0!;7
z9>mTj at gV0w=kULoJG0bp*PJ=%&Qm=e{PnJ9g1-}7_(`&j=y-+cXCMbur3}JP6h28Y
z`P^x&(D at B)awj0WBG=v9U&HQijNVMJ+ at PCI=1wywgcv(25et&w>SKn|)zIM|BKUsj
z8$uVFxl&hhn9+_LT!nGKjB at 91-i6q3U!lW*{+)xd1}y4{B^XzW!x(!Ru?y|;vs;L~
zg6m*gp7nQJ!*S!TD-p~5&)_q=R%1<$Uf;&*U3swQ7;kPLsq&wTu`w6-uJ#*C{wHhk
zSKdGO>4Y!QM~u&yn}D^maih;ggCNRLCrG-%4?4_PJREj{O;=^li>R7ZIN$fFL!QYc
zvUoB#IG=;YW$4Si>;I$)VhisF+$STn0P|VWY7EoatB9RQP)il{!k%IO!9Cw(z!^T_
zQ`em;*i7)Y9RE<L7M<`jy6wG0MtxDB4%wXi8P>LC-NS-0=nzgvR&7ZEFEbzgwi<D#
zz(1#>B8+Zc{w%)BKf-vI at X5c8R1$iMJ_(Mg#drtCCdTq_OE;nZGs#0c-si3_8uP<7
z`Ag?OPWx$GwNcsq3(>8dd4#W~CC(o_x*$j9x_O5?z#Dx5{qOZBZ at g>SMBL-rKhGW6
zK!3;h;QS-7SI6C-|Dvh+e at EdT6;X0G-QB*D$;=VkRNKZg(2lEke+ at Pj(Q*67jbIIJ
z*q})GsZ9VM+h<+)kNy*J&<kgSC))sf622Guk~1Mj at djB44;X+Lza71`pjB}zk!L$3
zcE*pbhqY;=CA+Kr%==>Pz*U5dcm-HHrdH7+gRBMXN>OqiWaBR_zy^4$F8R3mqn<kI
zT=HMEH<P(jYs<K}Fd?c2xF)e)u$zS%WykGB!$*!+V{H)Ury=i`0zPkuuLA8n=y3)*
z_>qvUIqTgReFLzOFF-rR`LzKhbkzE4#QO*ZU6g`7Sz^L>{H93I=W%r5qRBj*15Olc
zcb}KzJibx?G~&my6{=4jp_AKXn4g)7gnTK=qrfs+j4~Z%97+b|`~yR!>PV#)SY@$a
z06Tq6z+AtYeanHL-TaG*%q2xa&TG(p!cUgG2gh4m&nOa(FT=c^0h|W(-^xo{-;{|q
zF5$PW&Hh at Vx&th>8#0r}*M4LBqFfOIC0}t#JO2A{`mxUjM++aPv>1b#kyUSpA#cMZ
zbB6FBXh-~bbzz*KCJp`J{E<_0k>H>^@Qj*$QByim-uuo^0zZ(!_FDM3Z#C=~n78`^
z at PDFrV?9DW8dwgSF~)0UMRcd@;1u0-(}Y5-kN?kS;rq_Rm!lHj`nV1@=l|<-{~8iI
zbIJeteDFjMO~r<TM+*d<#yq-C&;2F_G at p*DF$(78MbUZu%jcoT`z{!BpySMSykkE6
zRS@?^{SV}_G1wfx_RhsOL?J)B8va80 at Ha4nrcc^$36LYWH^=25zLDeYg>i8z^n>Ne
za=)*tmbml92e1|3<r>6klFyMp<7?P8mJoS!-)6-7<GG5&760?!eaZ`koeN`o=>YII
zG_sF&s_ at T@{0^@E2JrIA3U%+-7jCpbcSSG<&V(x_^ZA1t<Rov4qY(Du0(VXTr8__K
z4!6A;{e^FVuBLE1)^qY-wi7-9^KjUIE}>0CrxpD8zQ4Ba3YZK0?|C%*&0zmtJ+}(9
zy+n|7<mq at 3qSdqn-y>5LH+|$M_ at V;8q4}u&0odIP at aJ!K#)o^f9wxG0;E}We=uYgr
ztBnz#?p(+NzD5Vuj{06P0|YKEDa#LBV*<2k_e%C&bH;<m->g$DD5tNEm!qHB#c8P$
zkE_V9m&-67XGji9`13Rqp8`W5_6H6)TSUu{Uq0opE?;+SKImlR#XGhsf1Ft&f2^|~
z at TO!bB2WFlHh+C^bE**bff3lIa;>E)v9O2dGWm&}BL&Yq0h?j58%whqIK9A7C;kFW
zrsaQe_4_|K at voS1neol7-S=YPi$kY7gSXX&Eios!h6pwWy_H_pnXrB(T|=3%Hn+0b
zvsxAL=DiX5`O88(ekfQWlo{t8Z~2|03u<{sb7LS#9+dG;J~I%lgnpp9fAc`2`~=}U
znbVMaA7Wye$XROP>?aQ_J_X;IuDt$LK?5fT(vKFbN*b`eCV&oRUcdFVT*w_=1BJ}s
zSRCiLJO}beKX8bzB6lJ3v at rvmkGsmFo)5ByX>M48vgEze_n7`5HGPEze<jG9cmo(c
zie5wTzXcZ<5A9iLN7!QIbxmT;(KQi`mv*~e at t_#kMX|<L1(yjfj7S7GVN;(6`R@>N
zw30PwKEXEPD%d3WB~5Zgy_rw;vyBV;**~!V3%18_ES;<9WssA`(Dpi!36SFx4t~xA
z$a!D#{^?r4+Xox<A;`IM8FF0HikJ**1F#F<VaAz7z;);s%%Xp$!%W%O|J2^atlj^L
zW!3(|BI-gdvn+X*8Gc+5jeR27bUG_IPjDez)Si}o0Y1oY2)kyP*|hW%VWVFmpPk;w
zoKIIzd!M|2woMSs6b&{3&m_&eYV9E^8}H9Wd<^Vt^iMH{D^cW|9WT3|c?{32!ZY9K
zGcz?p%WU-P)U&3?b-%=;!AEK#OO4(24IBww(Ptw(6o1+wReD?BPssIgDt!rL+BZN;
zW at Eg2gGVn2>-nmP5i(aIs~iQ(mBc3J8l|g3>*=A)>9i7gyqaz+R%l at h|1@(NFw$VB
zr#5U0BD$f>hj?c~AEIrUVx8J#M1G;xO;@^ynUARrc*oj7taB`|+ELc~oWE;=T|bv+
zXf<QqV|e8)W_K>l9GMY1)2{+I=kv&%jp|$|WPf`Sb|q{Y<dDh(CR8<(c_5#$YgLCz
z_T~f2INKR7m<L=FEpy$EtPNxEg|iW#wpq|=bdP$Ro%H?x7<>D;sLJ$zytHWLY?xx2
zjy)g}6}2%Cx$fp}VMc^xC`56>Nl<GcmrAfLoP-$=oTCgg%mXkCFpoS81M)DSBBEfL
zPNpbecyyRy1T(Wlz$w|S at B2PbpKZVU{e6Ca%<I0-ne%v``?~Jy at qIy8m6CON>toSL
z#+3fCOlNr9`FH4zy(wJHfy5nAQ*zC^Q;5O)Clds}JUL$kx`)h>H;=}($$qbMl!;Y$
z*Rh4($WNYCLzDY~&f_D0`QJ5G;$(URO2kkI>7Il=rs|A()L)v8$H_Q16_4|8I5*Sr
zIHt=a9%pJl_?{N=D&fF`FOqf)7n#0BY{C=Zi`#hw6Xw$7lN_e5%9$vT;2gvrE{%dr
z`5=5f4|>E;%;V-R?AOwtf=8Llq^=RY74ga~)XNJCfqQXV``z3;=dqHB**gX2ipsz<
z_3Y36&UI@^OpbR4WZapUH!}q#`2An>H~R*C at jvO$<3ucmo^5AV1}7qa>5yayyr~Se
z3UsJ#pbgakS6q)=%{^$XX!oKuM4T<1bZBwh5UFXfJY!W18;<>7q6R}3Y^W14e_E;<
zdx`%KLf2!>ydv-u+mOyr?Rnc at 8lL#dE1tKr?;Y3qzvNmotdagyA`|z(hq)W^d at B)y
zaf&rl(&*;=L>_SCfD0Xgy2vCKE1Nac7QK-Yo*22?^EUC1S$}4RhObF~%D#KNeu)fv
z!j4tC3-B=~RG at 8iv`xJ~V<H$51PdB at p)0d5jaNY~GWpB$#Myfujv at A8Wve&h`R)}@
z?xgkv&5Jo;B=fRVs*|T4dz>aQf(IV2LR{q68s*HEbv9goH|+W!*kSu4F{YAz%v8);
zJ&A!!=nKMs+_~S`3#k&HP0)8t at BzF}TEw~)N`ZgGL_h|BkAYc5TCAhMro}NI;+S@{
z>1g+({RnLp+U+h0j(vg1YL6+zhDg{DPpg=3pr6&BP%)=)4H<nfN`FneP)AP^*$wAG
zM~#}#gkxM8jNi1}rtyZ{HZ}HHzZrWq at +%JFST%R-KFd0J%F49Bczj2~hp)O8_={&5
z*xSI3GOyAt&9}s4>cqN81!S*M<l`!+C7Bz5<tEE(B7Oc*#$D3L^pISbfnI9K@=>?$
zgppcOlFjshU(|!Q`ultp6SDL(*FU)L2Vbc_ay)STCfeL}*+*@+_-m==3&fUJn45(<
z3FV-L;gUuvu1PmTCls?gOw|i3 at Lu{8rr;k<)pQxDv6XlOJPh^m5ZiJ~Qhk2`lY{yS
ziF?jMu5N^G at Mia3{$|uJ=p%Sy7>B#Zt-+&Yjz*dVBZx(;(B|+^s|B%+m4WfD_X6Xw
zX2b&%FP>Y+z^jozIKn-roX!DHm(LQjKLH<bqq{cxX3T+O+FXMDup|Unda#v|c(3k+
zK0;g06!tz!iTcfturI=Xb*39~$7mG63(YtabAcP<wPDW*PPoPr{uw!k9+{QL7Sj>5
zaMnBYZNjqz>1>MkJ2+p*e$7<UHDeCwFgo@*#KA9eJqbCqmMxTYK<_0!lRwg^b2#H$
z at co0%RKzkVX$7$Cg{H>__EHT at oVVzNjXF74L>cg(CgY**1}SXeJjk8}n;$l^3g|}P
zadDgtQ*yj31M=Na at Vk;AjO_-jBT2}AJ;ki_J`ml+dyz)&%CX(yu{;{*nrI^{<b|^`
zseyLzdf5!{*Td_Y-tv`lwnpS#z~<yIA*Z8?)DmG|l0x1G-W*^GnL8!5Y&KJgc)^`m
zZ<IXSDC)N3U11k5xanx8)lB*0^S~=>V0YR7qv6C}<|K~O*by5B%m}>u{3`oR%Iw4C
zUFG~Z{axWtk9xFSi*K-_Os<(T%j|WG<cQ4~t1ty=G(C%u7Z0pLwPz*d+m*0;uFTes
zo54R<4pY*f_(vr{C9g9*OcC{p at cc=&{eG%a(8$z6x4hd|MRbZaGcM>P_L4^pJpwho
zAYl&=v63WzD!K?dMGf*8bW=J7w;x!de`PR+d@?^7nWWR}j1;yz<k;TNh?J^vZ$TmB
z##mJP#Up;@8P6Vef{LUwPLVbG)#XLfq!5xff}DK%U){O~s~oNJWP2lU;pH(3U`PL}
z!W=29_#XAKVh~?BWw-eR$JdZ`fq9>c%h7{JrX${_9rm)6i8-*ftb}aZ&(-xgg#SLq
zf6n&neroB^Q@?k at r|-Epun!nthY)LZTZ&32_}015$zo2Lr!dZtlX(feCPSQs`8*T0
zSfXdH#Q4|}Yymk(f22m)^r#!J$)aw2Dl036osY!Y$XT=ZeiCa#*7T*k?h>+A^31FF
zEMg5v>^Jj>y#TR2Ex<Y?7<Mo7_PXv2eu&KqcCjLCze?f`SYnR~)!O8W at cGewYeeUi
z<T=6<B?)%3-OGDF>VM;zwYiuVX5^Yx3XlVLq2P-u$Vi>2xl;)J`Xq7*lI6<Bgb6k!
zFdSifT??#~!|USK&2cLEh8Of#ly~Z9Do6E`3O|F;Xg!Pkia?>+dIs&ILLJ6xKgsi@
zd=P8v5hsZk{YR{AtzWUj2;IqySldd!Ldg0Wu67d9$?GxhyCFk01kJ;9 at 5HqZpe0ya
zCg(HwPbN?nbfZ<^S6Y!9q)1gD7QTx2Ag#l%5`8`RStApUnh0O8e`2J=Zqo>2TCK>T
zP7$07o0riOc5vI9t`}%U(HRo&69_-og)bOOgnLZlb7U$;nVS<0Gl5Ht`x?ph|Mf_!
z0yTg1j%JLPm9FD*QHsy0D1sqb1V2OJQw!P+c%D*x<A^{Z at V=Tce?vX52nlXjz4O at A
zdM at oD$C9-?TRXoBHj5?DIrRiDjJs!by8(HmJ-#{Cxx`L_7zcBFi=#5G1^zSS(`-xh
zyaJkh1#8tSkxDzT8%<Yudp!g{4)*|lU at 241@lMpIBkM=S-QFtXos=(+bJx-GNZrpP
zdC8y|GPet1w at ZA~f>?)5M0Yh^2~31MJs}yQ6~x}@JjUx~UMz6}v*S_b74{CM5_NTs
z*bAA;-|{}t+--V8!X9m|eI}*DoNAXR+dNo<<pSX5P4PHp7<#K2HQB=<YeE-C9VGBJ
z(DXHaB;?8)R1a*TwZbdVcdABFPY^ZCQr>(cFat8)Uf|2*P%kgqE8Qti0mS$eZwa}e
zBhU79&-w{kM+<p#Sv8SK;nS!m=f0fCQ}O12-xx~@pY9>@I{1lbiidc at ncUcSR~#Cu
z#<!YO0|TE?#(KerL)InK+2!I6?zz8+Zpul!o);o=G!bke|Kjdi9}%#Hw6q at kt3p*o
zXCk(6(CKR61gaf6Y{Q2X)D9ovJ>U;ZlzEg_;J9RnRZ8j-#$6Yoi!8_3KM|Zr##ge0
z{|`K0(afHNX6PJCsk7`N?a}B<U1rU&8g(Gb)|ZUUgd7{SZKaYj(jP{(u0(Bgb{E#G
z1*nmL*tdZq<_l)Nw?48Y>g at 43yz^|qEF-- at WQkKOL=6Q-A~=uZD*Bzw2$i78E<#0i
zNsZu)IEpEx5CaEX*dF|!ga4nW4n$l<{97SK;@=vWYzi2;1p5|rsiLY9io4B&z!>mR
z%{~wOIWcgV>gc!d-NvXMuVb at Zh|?zP#y7x+fK78YVs#^QJSpsU_rpf}A(QKMgyvsR
zGD!nivrZJE-Z9oPx)^x=5=Mt-?10 at 5@t5Q{V4Ge*E><IWU1yY-Ee=l%{<CK#`6lv|
z>>q|T`@A8yiV&|kjIkC82H<O7!RShq;-2m5<7PpN$>~KA*>!dt=L1tRZhYI- at CBEj
z%b^VN<nwOWqQ>Zq210MP;MZn%vH5}{eae#52TP=t(1|>-8I{v#rQIZVXuS>f5G4KI
zM10o(njZg00`LgDdW;XGDwv$p-oR$>Lk#4Lc(&yJkBRR?p4<^W)%O1bZQl0Nb?utt
z_FB#HQuFpbb$?xYvu;0onXzb&7n`>;KP~0|G0NE`tNY7ReccMp`TNZ5I8*)f+^8cO
zZPbxtGU^<y9e)tV*Jy6dGo!70>OrcTE+%%VsGe{c`X%FWILE3n7n&biY<++GU1P1=
z at 1BU;?iE$^yzGZZge&Wo`Ipx{8<12NrZM7}`BV{GL3OibQAIqh^J!qTcC*?ET!X41
z|D&yYYz~eoo_dCU8TuvTD_A4)@>=gQKYm}dl>aI%?)#)ir^Y;aVqQmwJo(IP$dfmu
zE@<C~aX20r3_n0H8H?Vc>9Igu5_}OK!;fM^?pj^AUbPf<zzh;I>@CXtF0yGs`N=Bq
zG58CA*OFEg-O4IaGc1?boc~ls*1`F`#0Cr>Uux)<wC2bre{DxjX8nJ$8*8WS#&XxE
zB)$o_Bl=wwe3;xiEfGD)K-O)!*@boCkC`syC?2!)Ag2-Wk5n_-3A9aUZ=<b4>p^Qp
zI}UpO6m`~6a}x63)n%97pF#YvYfuL&Qrxaxwg)y|*mO^+uy(<oEJ9oXPnS?^xi7Qw
zYGnv~vXgT0(3L}Pjb&CYtJ!@V`dVk_WgN at MQ}Xtccq_>LO^Eeu{?ssQl+}joEu)rl
z)Qb2MWR=gZl)r^qs#G0x83|ge5Bwf<^Rn#Sr<TcfcP(@6KC*0d_c5F^_}g<3Tkav}
zpdE+JV+eglfH+I~NWW8_@(N;bT>i92N^<lL!3X;}zmnLRfoE!dYwSwvTQ>wPQj?}d
zJOSINJ}?e)ew at cmY`9l`s0`yD0uC(vE%<i&1?6^gN$zpWR>aYH^)%~Cl&LkojgaHv
zEBT7(M<-6Tq&1&x)ygP+z`3p_e9yRRT)xur at n3BF-+lmWBIVZFEk)cqbRSm-e1 at Y8
zz5wu`{>fxzq`tkZdC7w^V&gW!?;>uXGsrz)UyklJWnZ5MyRo;3CwEjXp1ub17Q!Da
zqxcsz#Lr4+0S}o$&SKJ)+m&Gix0U1^Wjq3#IBKP#zSgJMHwXKA-(3xyIW>5DEcXtz
zU+pA0O60$3{Jn0(nSSh2|Kg{~c$C9~)^9JX`$luV)cm2ku4emSl=BstzG{1M-FMtR
zS)Fw|%k9&_K4xJ*V`|C%6Ma-2wrj9mJ-uzkb_2HSr?;E2T?Z^At0vFKd?FVy9H<S|
z`VY|3&&YEuW0K&vzl6BNB~E38J|$Mt?NlA->=X=YysVI~dhNm=LPtMUM0gf0K`wkD
z;;<gI%CYtj2?-8rwY3oaGOQ2P5$4H2x~aWN&^z{MLI`XG%LMZw2N>UtM2rgd1H07i
zKZN}=Cry}>V?h;UE>Bv}*92+NZ<vMnc(nCsccZOATY$D2trV?=?qQ{leZso2^W=R0
z>)3aEY>=GqzX1J)u>kZ-{1>8MGZu<|h5t-)9-dom??^4gdet|kKn+JvP#N~uPS)a>
zp#kL7qIIKfN9#npAFT`RKC~n8n;eb)gXH)z#FV`?<bMSH-myt?tiK)o{;?zEIN%(c
z5hI+ajHh;T_v*#EF2?&Z-1}bP-uE2$zQf%6UYdU2i_`BrIQ_m3^1hBT<S-jxGpP2m
z=O^O&S3vI#*sh=6CiHK`cHQ*$Ft&jqL?KU^JN_GNH)4D5^!7Duw_&?=di!f^+pyg-
zy?r(K0FK{7YB&<CV!YQt*fSZ(&s3r=2IP(h$h_x=gO0RL0Y_H^S0V#4abI|1;$Jy`
zK?iO5u?n(c1$fvN at B!DA{<ns%9D7S^AMtJ={1kj)1h^b+nL24W_|u=kk3Rcw1Ma0q
zE=(^lN;=S<2WE$rzK87_%h4)ln^2Sb7G#Qi!I^0Npd9t9hx?tl_ElW_8(e$%Q5AR@
zFg99uSX8*?AAh~371z2rea%6%2N}licz)vaHRZp#=0LxbyN(4su^K$F0Xz}wOlur>
zP4H2Q<D=k(C9uH~o>-2Sp*u-F0EOoZPaO8bJTK;AfCxW4LjyZ#%Kv7Xk2%o*Kj+Xi
zulx$RvYbB&IMA})NAdi}A<N36#Ou0TpTfrYvY!I>eYxjlU~}$*e>hI`3HJ?_bKhXI
zG`uADS}pPU{rVl0xK2NwyARJ at 3tg-jK8_+>w+HWF=icG}HP&}xte>TSJJ#Uy|I1kG
z{@1b2|Btc$pKD^Q@!d2S?_b6`d$$G8S at FM&^+8(49+6%lG3--g3*BHB>cd?5f2}*f
zsF_-K^!!7lwz_G~gcvfyp5N_9yxFIu79QfjK7~)inAr~*qRikT{>h9$#OeGAHhZiC
z at M!~c7j#?=e%Z@}leG)AFn6JL+6n03WQ{^@C)TJ at _^%?bSB3)jkGq!E;2O+^T$y{k
zW|2y&TMYdSa{U3a_HZ;*<`n$<8uEl<l+-u>t<4`Yz=dMsqk|mVEnO+NKiB=CaiNR-
z7qR>6U;A(~<bu6o6Y4+Y(FZN4okil^4b>CkAY*VW^BM8a{in?z*u$`m6~#~EU_e&Q
zo%iTYCV=zZ*$~&z!K at _lQT#)vzMgkzOwP$v+TUH_zt!zbYmPQUuB!8`CS%lT)B-CS
z>oHd=#&f)X4C{a-xR&_kkOS8 at Y7T}k0rJl=*k#(%iX!y}ZHF;%1 at P3F&K#*tVxF_x
z0=YY)hL;6<qRM+8FK2qa)I?Wt@>^M03+{6{K-6I*Yre<k at h0&^e?B~_10CG}jg9ah
z8Z}S#r5Dk!n(FU<1AXIEU!+IhG}RaX5&i1veiHh`cZutWzD1w-d(qE&2>rV0{)haB
z at ZF(z2vjj5%m*W4?Q{ZJP!s(@_*)ChVJ9KDMiT+Ole?TRt&bydB{wc7Ocr!h#CfZR
zqohAA-|j9#Tr$Bk$cNsR4O`*?@ZCeaR at fsdoGJ9a$fj!}C!s$|4%h==2Y?OC{w%c*
z at 2ekq!(oLV#meR87eYT>#9PANjaVK|_PG|fekvwq3$5YmRvw+)h3CjG=w7$AEFs~c
z8%D&+mC{8{Q-aN2MD87@!2H}#nQ1Yw3S_g9*N++jeFyElw$5tU2D4cX9{~Du*%U^=
zmAPXkzY<3S-AC#gFIz(Qb=TMzF;%cVnBPbltxN4?4$})<57}SyUdzSYCBm13v4V}U
z6MFIII|?I2yi(NUON5{BAFdY`<<L#gul0x-?8vBaR0k)a<{Rw6z!G{&AOQyb-9*j`
zo=s%^9ZJ-<C~836so97xfS*o{ac*IfQ19#sez$Wju{$iy1a6Gfna%%;9r)sSr);Mv
z7?|~MmV?*BM@(m;70=ewpBZEe3(+1msC?A=*J1aVDZC$c<xQ|jed7^*5*saIQ&4|H
z0laSI)$5^!V+}j*T9wT at Yah|ts6=LSx`AoA3%H8z+Du>R=Owm0*vT7$=ZqrvwdDFY
zp%Z9}uRB9epw*x~HA~KFm4D6Kc-LP-WMg}G+;!yoS4!mScBH>Ky{~r1Jx8vvHmWsm
zBkCviS(XYOjub_~Zb`RUL$GgcsG;7H_YO}VTGjAa-bS?T$14}^ulsg&*O$55FO*F@
z)VQYUE8)c7m)~?(F0e%&7;FT#f%?dPIxbv)Wj^wH_E_b}^Eb1 at R6CJlgMm-QW{VBM
z*RoB2whh%_OlOc9Mp$RidS<|%H3L578G%1bx at ZNHd@dJr5!fukUaN2LN~;s~T_hUC
zz2=}fh at W>`=kvQ=+k@`2DnauHg8d)|?sj>jzYlY}1~LU?7GjUX952RwOHjKSwkiBq
zhhs#i|HN2$x1{>@Hk_xHSk^yR at R+~H?E?Q2rHwG3mzdgnSOsOx*aI7S4&`QZqbe`R
zs at k!yk?p1SYSiB5kEHl7+jJ27+A<{Qi+KiGi&liTtexbuG{FzG53)!l-AQPyA$7;Y
zS6y^lR5S3BEz1{2wZ2mj6+-X)T(?kN03S1X7U0-r1XR7aKerNjs>Un%@0%B?7>ifS
zsvb57xb<qM1-__Cj4NUY`IA2HjXn>5fG^&ua{a>vGl6AOiTjC`+wv1(x4b8~EL`u>
zpk6g_)!++2-X2q3qHOOG76Io+eWWT{)(yWD at +C?9hl2UK#Ma)EA-3A2HmY(?q1NmR
zUl#ICDxpgl=)p))>WIk}T*fogB5M<D_Xo(m(6+NO4u?fc?hkxLjeQlRgq?(7hHaxO
zBK4^wj7W&JWIzO24gR))J(FhSHUB=Su=!qG12s^9?*iEuZ8h3`Xlo$*LSLkwM{7m<
z!j3Y~QdC1V`a+=w*T}J2aok?yp(A%4y0sFRQmR?4X~1Uz58Dsyv*v8bZosVD8`l_*
z+#4EppzzqIG=@UlqcZi*C<AMo)k at 12HW}9-M&cmwMN$T?`)cuw>O5i(twc=gZNx^A
zXRe|v+YN6#)cgqEzlzqi{DCe99)BO!_Z at ZmymzRz81KQ%d1JMqMPqy5%dJ<oQs*-l
zM9V?f>x>E-*qm2Sy^-Rs^0&daRea<qXs>?ZEkd^^x^~RX9m(5x&tT}6*v<t#ccIO>
z?g~AIHV^Fuw8)!5{nD>9?~{HpMgP{Dh{sqP+H2h!H-7z6Xm!KZyp0-tXkEjNyiI5;
z>qqn6Vb+Hl>u+)GK57iSVs7X`w8d!m9<E%}N^B|Gj0alqOy%0Jh54j*9LA!NV6B9t
z(6;Utp$S++GT8NY6Wm^BC1|U0ox*uBMt)5cQU<*`jQGMvVRMAO878$LF6+yLKE^=D
z&O~i`9%{K--NL2Lbm4h=1>F&4xFmy(y%M#M{aoYxsL7>VE&5%k6OWv6&?j(HDGNut
zz(Qb2{xSTqEU6FCLTK6b^fV1;!**rivB-ZH6nx?TnY*mSR<%<j6YJNV!#kCll3?#?
z%7{fj5A>T8RoE}9O2)oc&~Kxr%FFywJpL2ozbx_}+C3N-5z%j}Hf)p8;Gdx7-KKq@
z?|m5s=ogp{p?@eNzugSlHgUeX#IeOb@#GmWM{<b`5Mu>wefL5~g5O7w$)0k(yMD63
z0J<<@&Sg*2r4RZ|a%HF+{6W{L0?r`*r^_PsAHhe-R&cawjFw49crvLQwC9}qFRwOZ
zfmQckY4c*F=%W#yfh{M`0e>=~PvAa~d!lWJABf;25&AT8^m#v}+))F1dV#T&D64ve
zeZasJfj=PM4VZXUz-RpZ6Gct;;`l>2-iWpntqJ&9R)Xb?Z4tJCImU?5R-?^ATO;hn
z`I-hdj at iEBJg@>@X>g$*j#^E%J7l<DI>9ruZWG=?=oiQ40f$q|%Lcxzey}KaXCC6{
z at xEf<>cl?Xz|pBO_1*@DMnQ>A<fd;E^g at 4z{6$^Gx=U)47v&lFg8W3#=}k@#Y~@w4
zmF<;pJly;U8Dl$esy8lVs$n}tZja~HyiIo at 7RtRdZ&Qvwv;}dZ3g&H6<Au}|Ot5{i
zkGDHqKeQM2Jz^J+>ty0u5o6yr1Y8VB1AMP>{6oao3w-R2hzE at 0e882E?`vRJI?RSK
zdQvBLg~WaJrNvSXODEcTwHh_>iiE at c{}hf`?+Z4BT2VW<^(9iD?+<w^<74d6K9$m>
z^_~KM6eq{};kua+7itYxpk8gps^{5!`~LSP79s|S!(^JlKie<}`$;4#_pak#vs(wn
zOdI&fEH-zSMkAhGAJ7Hdq`x>Yr<i-<W3}?-6+<7%m202CTKhcK*yndB<Ja~o-SvS)
zwkdC@;(ulbCYg7GublV+rr(G22YAH4k#pXMO}iE6<dSok at cT>bHSk9?B40rI>OqFg
zi%QghO at hB*rmzon_BOe%3wycts&IjFY(=emI5QR)gy4lsm2^{F%GEs~mWGkImiV=?
zDQ?ZDh4HWTKH~-sBvrq{<Ss&6hnN5<S}R%xZ4=r&QadAH^lEm94ZenA?ZhI+d2xB$
zP$!Z3g4NbDgfBt1unCQbv6=GoE)fn}iv)c)gTTw+B6ltKt(dBv=tpAwit#HWF<6l8
zezFo=1(mQ2yr$AxjlM!yVtrb;KFW{)9K0Uc<decu>yvzf0mLBYtc()jdyPY`=)l at T
zj)#u~HM&a~H(KKVbE0iP>q1N9j*<8SqeDz71O2hR0X*bOj)&~PJnnUR%`MWJ1&wyt
z|FIUgfp7Ls(F5kOV#)H3jwOFYZdakAAWjV#TE48aQg+geweg@=3(oJc*QBa$dZiZL
zyoX#r^-Oz^T>0vw at S!b+53Hpk%v<%wL(U&Tr;6n^#PS5-oJwa(!b6f7C2{^exCbz@
z{z4}pzrIr?A@&pX3DmA6`|WbnPx`XJfR^wR1=@D|T&e at VY*r524fsle&H3Z1d7$Gu
z-lMdBmW at TM3%AxAxV63xc(l98vtsSuj<y5s^SG89>vc2QA#VM~c%dchzYA>*+7YyE
zX%g^}7m#yb1^!g&%mzP+#Q85n4uajo+e|R!$g#ZKc9-B1^z%qy175^9tEiWNi=bmS
zv|k~|&>E&da4tOYcTzj-uBf>!#u(_pv&+G=o5J<q1v(Ofzl6>WKVym5(8C^JRPZ$&
z$avUf!8-%<W|oUR$tY$PcA{22=qy{R+k$Ii9_*oeZ!QY{GS3h!hF_nBOz^37h+CU)
zT9c8Rx;FGyUFE9r>)Ozh7B?r)ZyMJ#Eq5m_zc4huqX*x4Q{G_cQOxOzTrp_nyB+6p
z#o$qip=TS0360QycRN7?&7grYw0qGOqiu|9xt<$ZiSx2?-T}89``SQ11!!Avj3oHl
z)tw<tq^>BV3r<AtpA0cC_gl{jjZ&=dE80O52^>v`u(oDlUS&bP-HGp-jqQqwKm1ue
zR1eHX8}QI-r};wzx6a=`YJiUPrI6HgvZ4lFDWefqpx=OcpbuF8Mrwd+ly{ng7Fn%A
z9!Dc0&;X$?LKD@<!Lx95)CM{#0Uecd$7D~_%Qw^Xat*B&=X{NpV9i`bOKLKGhjuU8
z at 6k4*{Wf05(baX(RUPQc#nIIkeBVp|g|06BN>{~@p^aN4kdccg{V|8Wg>GDzDht<_
zY;T7i7#Yo!GS^ejwLd0TzPx>kmRx_Hq9t6r6!WnGb<8(Y8*r`$v2~9pgheKejo?3P
zxc>X&k|ZK`C+x*`-9qH1lKngrOJv|uw0j^IlrqJ?(9{3W68T^0ZwEHEeGa1p9U-0!
zG)0a at J(ZwR&_X-xvo@@!uj1JApfL@$+lYLOwiPXrSuc?_7VSl}6=(<168XS^mdLnY
z5xPRZ81GSs?E!3mitQ5gS+rT59iZF7U~;`3ppy%<4%oTC+a&)ZSEUEIs=%Yhn1Aip
z2Ri!zK3Em?dg?iH3{yw%N6p-n3rBdxz*#17bck~R%@XXle7W+EZ~Bn$Q~Gc8)<oI<
z3%wQpS9-gIypJJrKGy%=gXS7Qb02$-3vA9gQ|k}(>T9SMI3XEk3mHBCCD(GUhTSlH
z#R}KDU-T8|C`7+Uz8urRyNNswnLy8O>OKtIm2am0`yJw5J1iB$)JTxJe<b_*ntyQD
z`xELVnVLxbu$stR%=<my*Sn)ox2=TuCHC1R4ADPO_hJ^AuaIjwJfMS-kYNXkal9l?
zjD7Vu?hvqUT5$~GUc8ggV!wAX|AATfwm7b}q?TZAWB*PZe*iwVZRqEvszODMGWcL5
z3^4eDK40=zjKKq|?nEBbdx7tx&g=VF&)<)^P*Fl%r}vK5yxIaDc)ooDsVl~R9Aou9
z)_3GQ3Cmo|I6KBD<f%QbSbUdQ*omM^QPscNOb|l=n at LCdTc+yZ&tY#OwjbqRlQ<j3
z)LMUaM{NAMSfzV-yG+>){^iO%e?2R-5AvY~yvyb;8NfOo*BQTdW0G5q+D^6fnVHS3
zg5!147Y=K`S>8C55NJcrQk;ti9ZmoBEoO+5!NMAf_)lVce)k(YjKGK7(@+GPO*pR*
za at bw9XJ+O}MTCEWkG;HDV^slzEO>dJyJpI!z{OY3 at XPYdz_TJY8n%TSuq!AT1K)zU
z{iPhw(Fx6yei5#AtRoMhPB+#P71fIG+7vt!yfBNi8#D)B13whGqPVqlakr5hv-$QW
zjI$o!pmw>!9fyE25xwWO#cgA1NsPD8h5~UyU%?#-Wd(#k)GjZ>y8BPir^*?Za6cLA
z<!*v!gZ1_b)<oS$m9AJj{2 at VQbnDWTQ2ikEW#}Zp=0dw0Ha7|H1Gd%qOu~4-`-w8=
zg0<to%T<mJ#Q~?{%{tx;R^On4e{>tU7TQQMPk|ds_y+XjUF|`Lk9so;_lJJ)CgB%3
zh$Y?Lj=WEa8T4udy#klw=;K)9YSl;Vb?_I|V=Q2~qeASy)Km8PSOe$pas at y4@C&Tc
zH3*se8OW6pf?`iZ;3%+U5eM-r?foQ8O6ZduMNA0nsNfx_dk0L`AA_HB4NmDIh-+6d
zB%bj$@xksuo!qa0jkE>0*=!H-!N#1d_+WMmo5edt=XM$fZOj?W$u`XWW?;G#eBn;C
zbzF@>tuq4sh7$*%|C3sWQ*{NW>Kg8ut|_>it0_2Dqfbg#(F(*_zknKj1%f0trR1Ab
zb!gKqQipICW5V}D97xcY@|2%GP599<1Mxz&h!=bb^7BiO6JN^y*P41324t?*V2||M
z)cC1dgOGh+B5^W=t^^tF2GBL)1jqaFjrZ~E3OW*+ZXD$&llq02zd5cQSZgdhsxhYv
zc_Gtw)j2f$;_{SBSA9Nq#UjR}<@61z9 at ph;n#3Nt1K3)ivl3nn(FdH*vN_(XvvbGI
z!Ye1$=trYph4`bU3kRs?fezSFr7jQdQzNV*z68Xql-b2TZQZCl-rd2)DHY*3?Ma(Y
zK^OGgSr(s?m;(blt!H3AHS!PRoMMM%ZiUOkD{@%y{+tbz$jZbX3VK=+cq?HGeThj<
zuz{W~fmSr>p9-sZb;hTyvIrO2KfpJoNq>mLsw%SrZ<4YI2Z`SQaGh}@XsQIqB+_+8
z<X<gaL>)9HGU1Duyxfjl#*}dKl|+H!p|^~irLbwHr!2R*YgQUz2PvLiXWSer8r0??
zcf=7h$fU=}6;HoOXXL*;@BFMfV<dFBK6?cht33goSCjq#%cL*#HSyZmeDL26UgL#K
z_)M}pk>5eJ&n+Rbuv9x&YedA=C2B&wk!At0S0R5$&@#rt7XH?ZSHKqw870OO`rxce
zw4je!r95r8p?j92%AQ3XwD0te9>5r!fIaNAi>XI8%3H=&u#H1!UHTKo3wp}GeaF2#
z_)6J);2#!R&qNP&)nSewgx=C1tkTv&<}&(dN&R;z`Ax at Zc@Te&v3`)$T(?&91?>jR
zd*n at zZ%eRs%ZZK#Ix8UWj(Ke4*J{681iTx&3i`Xsdo`X{0(*WF>OeKIyD>jxn0vs1
zqk#vs`3VxsGHVy{k;+rg4w3Vb$8UsP9QcUv1APM7o6N~OFel4M{wdz+Y4T1DdOFrM
z3;5}H&W0hxEeXi|gYTq at 20E0JkV9Y3wt9<Tk3XxPu-C9TvufwcoDINdXhq-RQ;c}T
z%Mo3?Qq0A&E^}}(=C7R0%dRT^VPLLfo{{+$sIUeJ6RlrsT14jHZCG2frrzCu58{Qj
z$W0gqUbPysc+prpXa*Ro|NVH3l{aY8g4~94L~n(hkM(SJ2zSo(_u<K4_gBL1k2$}?
zG$!L|8{~53tOqc5oG*YpQ(zktKBXf=9|XoZuKPT$+l1N#-=!*CBjCgORK)HKgiac^
z)=yS$t(nwqt%luT8Ii{u^za#&cPL@^fPEF?My~%Tuv#HklXyH*C&5}PycpHwkl{V?
zoVb1ju5Su%CHT{`0<caSPv0VQjI%=;fhRrXvmp8N+?@HZ*NDb78n}64vs;L4M`t4*
zLrnP2zHyAf%)rLc at 91>+n{4d{eh;aYdaCkMKjgUGW~x$qOHv5NvR at haauIMZ`JT$4
zd9Z)|e$p^4+ZlH#k?Z&#o?!v<T^4w{g?-W_q6^`CQ)m`!Ey%Tn47itU3#}YKOyU)D
z<4x8Z5ic2YJstBt9pjSjSs6UD-#r*WwP8J0Cv1wEnSeYHR#dOj+~fVI(26-2N4eMv
zVxKQFXznB!4_sZi-Sp2<&YzLr$Q|=%dphFh*YXmbf5SD05^ThdftW_lZY at m?exxH+
zxePQ>$k|okKY%^u*6e!lhgq75qP_MB*jQwY4c{P$m)&U+)I$Hu!*6FN>{0L=iMTq(
z2h#8 at z)PC&Ylcl|gy2O7r*U=#J&j!DrQbu&YIDA^p2*O at tc!8>_B2~=R`f;4Ou4|b
zmN`fGceuO}+w?AS3a4xD5})Zf;xWVZ6LtsDoeB1~YKq5rHU}DEd%^d at F`MX&7z;42
za9^_S5+4lgSv#pAR at AV0x_*jOV+1b!AgQI{8b&QhJ)ZZF522wOn9Cxm2=kZN%X|ZS
ztwG>7wHn(Dv#<isqd at Imb$H at aFN5ZG6TcVMvMg>aMW_w|Y^Q$IB*1%qhWVrnumrE;
zWK^Tyh5l?hZkm5gt!c at D<5U;onqYeik1M)F<N-+?J73bqC$*Npf_z8tFTMr7p7P{n
z)O)^{mKSv67%7qEx%}>9o%%Sn*04h5j{npdF>c&U-e>lQY}VNK$S-PP&q>yzMvM`1
z3-GB2W^!{&1v$z_851^ke=KMtV><CzTJ!YSmvh at OoUIQvp~+a^S`n^SY;TZ5N7xLk
z;r%{wodG549W}hBHS#d!bge4WL>%ggP1QC1wcayV*K}o?JhG{w{A3e*1OWYgQI_fP
zmjk<Vg2cyTPR-(NBkOxW&SXCF^|wf8%*tbu7=n?Ln;t&5j4=k!0CpLPhc}TNWP<VS
zh$j4SqB*D&*dqyouz@=KCkKx;4w#r`wTZG2OdTedxd~hv<ft&P&D(DU9-Xe`-8UQ9
z^1wt-84t%=F${gbMNk(0mh)eT&8h4 at w5T0&uUKjcmgNT}9cbJgueh3}v9;|Bz7Vy}
zktFSoMjYFfM#MdwLf*%Z42Ovy_~OY%@Y5d1%{IjQHKT1wlTSXHSvMJ&*+6PwP36Fn
zHI+7z973j<tSc<RGiG?^giQQC at oWuzk>JW;{&;~$)R46W{Riwitcz0Olci&^eV^Tw
zW<%^`ui;##+E9r7z=)K%xw$xHCl&dqC88kWpS_K_-;dnv^Ir at J6tkbDv*<=vhkMo_
zFBI=AY9nhNMdI~$^JFyi>i#R>1IUvC)^C~9{Kn#@J)7F|49lCNy55mGuLIjdiTCe9
zY;QL`pCSJJ+rR?*l0Msinf7&%y1I!=2c#>ed61;Sr28G_hCVPBye!r}64-||S59}a
zyAb!*>8N5RaId?mT?0z0nNEj&)kx$z`|e;He8?R!k_#HdDipdrzU7W8)Sa*AAGR9@
zY>d!Hj+$(RvqW?hY=wO>Ap<!vf4Y!|W6K-lFZGt$XQ|9*VVB<d(Xb~8=b1hVK)zF)
zRR0mip0p%y3AqvA7Zck#TB0BWlu>iInj7z)tS0{R9YOG^<)S7XWE7vQ&RpSQYl_Aw
zG7BG$DvFU=AJ^n$nYTI{E|UK-hYIGZEEl)Bh~E;rw;MeA&}=?iIE&zno9|O0F6l??
z+uv=*Sj%`fq*-*)5B~n&P^0XA$xx>22gCeA at Nsh#P)=9P!MX7LMDGbw(qcAcVkz<m
zYEJ{V^u1<YHr8vBGqQ`PfqYsP5yH#4ek?>oaPb`k>#<sWx4l+f8D&g6m*?Jc&QX&Y
znCIRa=rCm(^9);!$UDx(Sf28>;JAI6I_%Toenq&BEJDpn%Pgeso4 at +kdQS}Ei)E~l
z;D&luGL4L3s~_&0scwf2((1F_v(gtn?7#`w8W0<>zL%cM>gXi4Pl~z+A at g{*fblU7
zT|T?JDbozQO)mO*u%|Rifx!fvjV<W!#4r2V4ZWcS`t{Eiyp1 at o)`4U2QKeGG5bZg$
zeH-<iPdRkI0Y~jj8P5-`4)Gb^(YrvWU*X)n$WPXyR-a6ZJRnNVVTBu*U4k;^J9+9`
zzT|q#cMa)cc44k4$-T()5G;{yg8$O$`xlEWUSW`-zc*fi|MMJo5ZV~(vaegdeTe6i
z3HfzG0(oCzNbnFp35UfU&dJw(_BUxQ at -P0tBn>*LHs5{dll5j3^gcpoMoRZ4{G?l&
z4d=FA!S?=ze(<MPv3e)LPpukMF}o3uucHqDBS6pP7VpJ7>=7spz%8eCZ*|+v3|g-<
zM81=X)NxUd+p~!;O0t^dkP3R&8EC>A_emcGZ)s#%?R&7z&S5(ZvJ?IA^{c4w?5))I
zuwymjdo|+MYTrqzuwQwf3UjGu>;n3lU^VcaXWWozdYEUV_fUy=Hr>lDQVVjfRl%~W
zmh}^Ei=YhrQRg&kWXP`%ppZMo?DBt#3Pde(3*F%~SM-f1YR*4t=KDpdZpo(Ch7RBY
zcVoVklXpfd8$0Tw9=q*tcj)}b$Bt{1sGkEH8{W0h7ddsLPw=a!_)4yxK4(#QokQ(}
z##y7FF&SG`ufQ?8r`Hh)|IhtD`JCppLOyRy_yqK|5AS|xT@$OuSnNZ+4;S$%z^+#+
z&GJ=YpB~>n2jgWeseK~_+cmCt7>tJi*mv^O#O0`wAsH|;AHR`;XU&^_X5jO at SvI?o
zK9HY?XEz4)I2Q)&Lcaw2wb<XDpIBj={d_=Aq+wlSe&X~y$q1cKzmsg5A2Rr6MQlGM
z<9H(U6oM}jjLcNOj;JnrCB}OvQ?xq3X<lCBuElsa(nhEG1ydQxErPv?$pOFmdf*t-
z$eNj=Pc6TUvGZxK6aBFFGrKddA at 3`UtRbX^+mcY8ssXWc&a*_OMozwdX%Wf$y($VR
z3^N`>z7YJ@@Ldz1H{@~nwV)^K2jtc>ajlTWG>%&M`<mE8$j45CTps4y1$l5+wEg58
z!Yi;{HM(OL6InY9ygdy36f!fxnwi2qbj}qv5P1pfK?Gzz_$~OK5#2;8j_ZvQtt*iX
zX%w?7rAw(q-!g##IqS92Go at 7v5#NP)3mx9qj2JqrJk?l&^@z-oEA*i$T%aLfT(CWl
z??j!3d`- at 51@e{Q2gSGS!G0ZVd%$U(dLO(;%k`b1GJ6$~7dSnN#4wFphal4#yzIcD
z2lgG&At4K_O0Yo>8*+KU-cbzw;3hDw3i#J3$oU2Saj{WHyGzRECQKmC9RBU0u^7Fv
zf-%ttrA~T`fv+jJ#fPyJXDgqm0R~Qu{RXoPxl+&2 at _w<8jPlTT^cf)w>GQN5CZ7t|
z#;N(8(@PIBUjjGrGW5xnWG*1qN6+ta-4uR{I4i4bg8vumSKI50{*b%TTOV3#T`zp>
z>fw-b`2Whpu9(JaSs{g=84;s`@rS+;M!to|iEAtgHY`N_BdZfOscK<AY_sLo5%lYY
zXV5RUUKYwZyPhc(vh32=kY{U$Jxm7QtIh7=qs9Pqt5N8`)sQ>9VN<Ecnp4BCm%Y2L
zjVEKD!B~emD*5kYyjQ?>UhK5IFi&g%pScs?=?>_9CbV~9{(JMS+%Y=VTie3xkcxrD
zU5B`efgoT!B5zsmj%UKTeaYAV_=2 at 830YA(HVpoVAgqgg$q=Q%oGqSZrbn4v)G*S!
zYaqY!aZCte{*|bKgnWCVfAc@%c=8hR?5K~RXIH>SJ*5Z2Zs0jA?1NoO(f?1r2Q;mQ
zU0K7$C%uIDg9<#a5pzF at H$c8OWbcdAgNU0NV!dM)U9hYJemD<(;5q_NX^4^NX at aAq
z3_YH$Om8N*DueJt(Xc1bpW*pVPx_<oA^s1(<dbVD#C&Mt=EEG!2N&i8u#rd{W;^0A
zp<g@?xp<lS$TJC;50m0t$;n5vm;nB|{>wh^Y?;2VV@=>k_`V-;y6w&BcY?l*ylb14
zd#B(43bFOBcOgsb_;uV|j`STM^akDJ40$Ia0}>j+dg)Dguxpc#+F6I3N)y(C72roJ
zvR8OZ#pe<Ch(6tk{D0tYxmO?#jo^PPpNr1cri(KhfSU!}IPQH^)HBcrmT~iYC%)Ak
z5gydWYdZVIx~4a4P>1Me=@RZe3h^Flo{ROy+?>*94VUSCYe|e;K?vny4~AV%({#6B
zt^l*C(~|j!<;?QlA at hVG$h5AN!=3~dT%&)I61;zZxPJ19N&g at PY#Y6|{Rs}ym9G$g
zjhK<8Tct}hR~8tbP(aq*d2|=%?f1T at fs=;$^OZ$9G%W6{hTd+W7u*a3X4%2TyD&$-
z>PEg&XC3mDqype8ks3FMv+SbpzZr=6UyuK4HPd)WX<EdHy@?#x1mN8D<9>)sUM`F3
zTP2I?*)A)SPv`yKM9y`+roR+9*U(jBL6fn-gDmOn!rJ)es##Yb3CXtjFZT>Jujm=F
zMt5t!S){Qzf&2dEs)eBIB8zT0FeFyU+`y55UmjR5f&I_C_wJ^;w}D at F;R1<qJ`!_*
ztGV`b%vlH79*k+?YOIiYSqf?f{DHuEcxdaeyR%+s!aHdQzHO%k at kae#_U0u*y|ovu
zf3P3^11=r%$Qs!)VDT<MTaInS2`0}6j_D>Q7d-J!<XC-+aj*n?H|vAuH5-B!U`&f$
z_a>_+{gPFakK(`j;P)9O6|r-2<r9%UhEao$F6O|w)ZaW$(Es*4K5KE#2fsPz)PJ1Q
zF#QgXAofuS+xzUm*FEkh<}q(?`G&*jsz5Fm{HGJot+z!zyRN8n#S at AzMBwG>2j!=Y
zn#~I=%NN1_Fu{Fy)Jp2C<MRkDU<|vLo!X{cc72;7tR<}icwKVj$jkwjlo at l$7}lFs
zPV$vHYw4S)7v0MQ_yb>xx0lpWiaJ6|Nv>08txx_b<HLnfF~`fUJ{7W$+yi)@ax(vb
zU7+;NyK>vCzjDEB;O5~Nxz5-q9ru6Dr!b)`s{h5`&L`(@=My6$b$n3IKy=sJ*ImeK
zZHBC7WO92ST+s=fUew({KOVT4I)bZ1=FrrCLuUA`#aLIfw6>rFS0t79V%<lrE6js(
z;3k%gCkAMof?w&tCUw&j%o4eBUONwTLEaJZ<c8E<g6)Ld*~hQj5brkwHo#=$hEIx<
z_Miqdsl&8f->lrE*C{Rf2bBT(&lL9?{$IZZ%09iH(sPGUOLV58CL!uTy$gI|<ms&z
zoKyE8PxKYymyxGrMg=Z|?4gA0(cZm=)ISMa7M at t6C+AwP@w<R+ywr0?sya`MdK}Kw
z1<v>Z*ffPEYn-#xE+Y0}mqd&_f{(`nmoXjjEd(>D-HHG7<QV>jS+MEAu2aNEeHUD}
z+j9qwwFfRE_D9!5aFRV&cm=jDUk7}K<bFgp;MSWvxU~{G0DL(D;1{;RPGMjlvdV;4
zu)Zp&A)(W%;&&}Hu)VnMpyv*(S$Dvfa))09>GwZ}n&hIe0N~E`U`;xO{DlwD9zmNa
z4Tmr1DzI{2N!=;EoU&-)CAt+c9H>1d(C|=8%nWUs+W*u%VC*PIZjxGH?|uS)aa1Bk
zti$vCLzWHF9HwcJl*xfzqC;>gJT^KX^R{5j;zA87dGgR6o-8~z#ON at iU-W{NuVZaE
zrqNMNjwg1ERK>rZKH<$A-~+2mP#CViHVFHK>h>eR74v&+&d-7TL#~XH+^scpfro3D
z%13e$EVm%V?aIehKbW5`437=n<ni+>_4py)3V1;{uH4=zPj;`N<JL5>{g6MuaK!+J
z&_eQP9t2OtdV?6$@#nC<5nt%^Io&%^GpTC(hHtakXDMT-L|MFI=TPOmg1k+jZwusN
z)Hh^~%2WO at 78plY8B>Aj)eI~i)MTeCkb{Gmm!CiFrhPshwUU at M*d_JCK8Dz2C5TOP
zuIO;r3Hz_-g_c7WTGw5Tcqw1uJ9RQV$76{3Xu`8BAy{aE%4gooPrT};?`OJ0%-45@
z7_X0n9AL754>E*WL_-5Pj{J#c;}6j<9G1)}YBZcyP?pm<RP_esY%yEvIKchKJF;(s
z;^88;?BQm%BH(EH=|=r(Kl1;nTHrwnV9#3b)i!GK(e`Kg0Aqz<-h*Z#!z^o9vpFCq
z{lx4hwtV(Y#LS9uy;}<z?CXY|q=4W>AG0tfN|e at L`_K5^NO4tJhij24S3FmXb2Mko
zkW=b$Ez#**s^;`(R0GM!4*s*n>}7NQK2y~%3cMe&SAACzZz&1y+&p_JPjd2LpmJHo
zn$7us8_JriH7&C<G at s4BpT6%@WqdF6Rgt~&rGuzNp2Qe%{9OWNzF+b~jekgfpzTQx
zWAvcaxqV*L5r at n=vi<d_p7k>85M)r5 at Ql@nxm}v7hAdk7ufQiC?1$g=l~-U#H~N=4
ze@~yAjW`~}IVy<Fw7V)5n01eAWs-<Jt2BJF(yQmQO24&OU!U`wyi5ZvC(i26hJoka
zO;rokb at 7^|-e#d$eO~j(F0)V<wcrhzRiPP?n1#Rsd{btvp$|p%ydi7W(`U(jP`9ep
zekfbJ_;Rw6j75_{pnO;lpYsg*b6yBNE)}CT>iC4%_yclXD$)M|wecqKyX~_dv})pF
z?xpL2pM|`Pg40hh#wX|Fd3lKc-v!Lolp8*Hhn6Iz<vXvICd26o_ at cv@pY3-u-KfdR
zT{k!%byZJ?9Zm1T?-brk7|?=mdf<Z5BO>=*z3`L?{y^^DesbW%WRUg92ww%!2X8nQ
z17DG=<p&vtyG}Q*b2#j1nikgzv!kXXYWhu|PjD4c)2}7{Fmev$nA2fQmk|Dn&;wTD
zrz#+Gl$Wb*^*y-GFjX7S3LJ#aYN>*%j8 at t^xpS15Z>4z0TDuO<Q|VWV=RFO~A*`S2
zr#(wLIJ|n)4^)K5uI?N)O~*~uW4;y9>CmytBhK;=zqjTcV728qYTy^ER}V90$YpI;
z at +)2&%w_g^!Is3^5~Dv_48Dij8ehmJpZ0+~AM`*wshu(eKaFpoE$oYozajs3i>sF|
zLSCxY)f=HhU+(G^*nl4#kKgOdPQ4$4T<_PACmw=dD3d&Vt^cK!mau~vTk<~PSI3;-
z{heTJeB(v-r7P(p>=9Q*_Rp3#piAkm6j#ImJGF^Df#2u&jg#?1dlJ8i(c6f}Ogdqs
zq=-qC2rjK at 8VCbs-~NS7>_PBp8~TUv>*R at 8PyUjm2b&&CT0A-e+jhCvSz_BIG|koN
zI7aGpczr<nze^(hKk-R_7HWEcHr0eSN$r<6QowV$T3fz|(K_;?16Ueg{KRWPuH0L8
zQg_S)+`on-_|(3VL$)cOjTlXbaS$@0m#tYJoY^nJ95;F)XD<CTavKn5a^z3piHk3h
zXF=`8p8hMio{H|Xo4^;UylnWd!LwvaH_3er`4Px9B6)ts5j;;9{GIy1jFWE-x0}|h
z6_hFdQiQ>{rC`WMUEoGt7g1UqJ(t$fNwg;7*v60R5cfdU%`8BDxt&z4;GFAW-z?yK
z%WKa=p4m9F)X^lYfiJMcS_U6^tJ)T2Vvs9K?{~e%Q+00ic?EMh1K&gSmKQGz^R27P
ziu}{N{Vq-X<<F=YO5~XIF07+R!sBk_LskbK4Xr>fX7K4|%>UbSHORvZT_b0Y;P{>)
z)M&@?rx=|)=@Ix8?7B2t7l}i^hvYYrcnsJkW7iHy!+m9)FQ&;mj0E=+`r1rRCRaLt
zKd3|wu+6iCu|d{4 at 7@c#`DtM(c=3 at F_2`c;EW at +z!(48m8ok>3Ct!bp4+7(U!fwNN
zy2Z;T_$0=0)F?Z7LC#&T#tV8Sp;h1;BEJ4qoB%#nFDlotqR`z28S4je5>q;jzf*r6
zwJss+w|P;BAGGy9C)D6qHYM)?PsX-rXV~uaTwv!G(xRmwJE|gHh-l`O<bJ1CL|M{W
zI%fv#>z|nNix3+S at dq-=^hb8%BKYq#xniS_iV^uJ(i#WhzoMJR9_duge(}AgPUDu0
zju)|h0+XIeMr^)5c)!EYsq%p?%jEdqPSZJn?HzpCZcS^B(DRBxPr2}G7v*k4&g|yE
zu-pR3o$nC38fHxE>9~TGz-_6D at 0hr<q9rZHaSpOxvN%*=>uyME?womV1(ikT;{9^3
z4r%h*_NN6q;<%U#vJSt=%)m7gX5=*K;Sbm~kjqGy_qq?^-upKw5mS2zxFk8$E}!f?
z$@DS#IHmx{RO1*6cT6XDOg`2`;&0XuPhuXU9uAqGYNg#2AI<qETJe7p!2nv?9fdlR
zpp_OfR+xidO!{};^4U1IVyu<6;oY}R8o0V$r#&<06f)37T@~<2&kR&d9Xq!I*Ps~@
z#_KN5H)Hqs!_Po!+ptrZ+xGTFdx-7I+5r1WHG?>+;J4MP;QJe%{AdBm^`YwJ$+E|{
zpeFCFld!9lllkEpS`R*$&X-)nyt;@Qxf-DkbYzD9VdQFr?hgJllao0YeDZJoS-c9w
zkK_h5vT|`&6!3T1Tt_EzU=#2R<B(}<(O-|gH=R)+=H-H~tTR;5&FXUOn}h4*0yCzT
zzQ|oG`}JP%%09<Cm=9fqH*wDqSa33-jM5pmkXT#jRx{8~rtdVq!{JDUOwHqb{gke7
zMc=2mqK^ay)kM+v-;g{*<Z at k{=>8sg^67CibzyaX9Z>diyrLcaiTJ{Ro$jkeA6W29
z4>RHGTkPV9ny`a^?ZLJuAm^`xylgrf+sA1goke2V(i0H-p`x3qY~vQ}tL%3sqrTcN
z?~yL+&mPu%KY}&oMX$3CE&j_VV}<=$zSH*%c<bNpS-{<MS40hyk1>HChP!_2uh+*t
zla)L_S_j!e%jBYNt(m^qpY4+ed85-3K(@Ww>_&EHI!*lKK1F!P9wwi^)uoCZC*!$l
z&Qgyj9C`uA?}-e&BHk at dR=^*6;?jPB;xkjSlE`!5CoPQ8&rEPNEIKb6*8C%<YNl$)
z+D(`XKLFDX^=wETU#!uvdxE!&&#fXd<cU3;?6}{$1bL3fLp$pX$lp31+H8FrvD(K&
z+rTGB3BKt)<G?%d_B%D<HQlGStJjFWiu-ljONi}(u!&ZU@}3spBiw@;fzJ`Wlh`j{
z$7q90(TMy0v?v=iaO7k&*7q3TV*E^%V7vRI$ybYbD=qNpa{HhA<=nuQx+LIrA{Ly)
zWQ=e3)eu?XXcgpwI<FQ7X at O(VkJ{r7#9mAqKx0I%=s<1a4q616`UK>%y3fpl637g!
z(hWPcc52=gT;K=0>|Uj_>rdIN1Pkc;6qX)|QFD}XzRTBv9en_N`UtR~;vAsO&#(Lb
zP5O7C6?|Ad1l&4O0~uHe&p at ttLkg@|;}xM5YstCKEb`={hk<>th4{4szi`;5)=)<y
z>`O+(($x9I11l}wTI#DhW${V;*VC|#$Bq4rdN^v2 at 02`KYuQ0t9_#GC*C@%Q%;DRZ
ztxi>xnGOlA<TZNN(y~Q5T2|+q{+#NcuwzuO{%7dn(^}QP(65>5(__fL>|#sG>~7D)
zwP{Lhmt_O%l$xPYP`1_o)EeCChil`1Dydy}pGo`?&0*?<C-frrM^XP|r`NqXv~8xI
zR*cmOpXzrCpMp=+CVqSM(opkCE$U=1jWVx9y-?JK6(i16gg9vOf6|E?6mo&E-hE#A
z_CrO>D&BuxI<&kWdCl*q#auck9fEzrM&AhgHsf!{bja_lx+itnp7-M&E$S*t5?`L@
zj#hRaiM~6g_MZ1fM|_xNKfnKa*th92?${RY*w>j#pFHSvNp36aVOrTLMit*HJ{tdn
zSQmY_R-YCeBl=2per?8sgf}A=r*2A?fn4#nZy|Wt6TlmfNBep=!3|HwH`;)915bv1
z@!e*>QvCl0`fqfjwu138|0VE}*?H#G_fx3rh5AA<(r|*0AMuE*7#JM?OtVSrGPHRc
z1PW7i`eNW)JY%Xso#A?1GcBVSbLWhS)Rw)RQ7X0AhZ%xzG6U=0dyDJ2dzA9)aLhT#
zXIaZmzaJlVG2?Hp9V at ck)#_V}<-tO=YM3#q{IkXm`Mixe7Vi+jrqcn;gAK#ijAs7J
zsEv~qafHr3RUe_l`l^Eu^?lgG!ShIe>2BAKv~`FHuY-ST2hM+e3acM>hnc{#m>D>M
zwUZD29pmZ+um3yWjs7aGzm4lhbNx^GZfR0Q0Hu1wdgE5I@@f)nJ;Nm<fjg76VpDvs
ztCwr{Ot-tHTFA8`zPq`0og8?*jlb at bU?1u~M(PGfAalpKDoRG4-kFSAiWzSrSHHTs
z3hVfXs1H+-EQ{2Qkz-y!UsWE9{hx6A)z}w_`^LH|RtF%?`$_m?ZFrBcM*VQJ=~cfE
zq at sYwn=6UjoFU|%|0V8SGN1><HS2+ySDmbm)Ey_+&d5vVR|6~WZQvXv+f5jQSYQGX
z+`L%eEX4EVxW?PWw*Y*Fw?Q9>hm)tA{GO-!tkVB7<`=myA9_a|;v#KpM69)c_-!Rx
z-Nav#wNjDS*+#wKNAw{_k-p!SiHDLAPe}TB#wt>q_HE_pt$<n0T%Fnt%4VIwR`CpX
z9@=E}be%rbH_7K?jR#gPdjLNZen$L&mCKs(Bj5TP^1aD32DD^kLYLT{Ygi81-Ya9s
z#4DBR$=X0_clnk{4O|~Mev<`Z_}{Zc*cX7>9v7_S{T3BY=@>rHvzH#W$}tveh`)@J
zb^9dlD?e1MtH^~P_$y$-<kr5fb}@Bi{lmKanr{&`N>{+AQp9$oedvh6cy1293?GV=
z{GW%oYVsfQr7PgSDRWgo2PojME%#&mKgq at VWFoOVN#KD=9RB_U?)UZ7{Yr*8%)+Km
z9+&J=-(YqE`>_qRV=Tdo!FTrKTgK$VUyS^tB3A{zT{MSJ{RxxmQ?6D46Xr7ioo*w0
zjH-r@&q#eB$w^!1*nxY6<DC(s3 at nM_6DD9uGze^Cb>w~HTk!siNjnCe0CpnCgaYV5
zOP6r+VOPTVveRoe!fvH=ejnE_t<+qmViQ^gess#`M&@<uz;Kl5?>>d}26k82_Ka16
z7wD8j-<7`BtXGFpdznJY%w$omw1aWbyztnBSG%j&!_-do5lZ#<K}R%vXy*{KyJz(l
z)Q>$&#*MCGv!mJ~l+3W#d0rsf$W$xup_(C^9^hBQPLG%z$b-A_-fQEa%VfZp8<;^i
zvb$Ur!Jlyd?ZJQRxc at dfUc>l?V|+;*ga4J^O^t8Dv%p&)`P|I#nFBs5+Kb+$_&{(z
zs%Kp?dG at k|G=b!Ejqd`z`UX|1e4T2c%bA?u#jD<DC6t+N$N0aA at s}~Xr^kOSH~yO(
zoe?@bM>g{v{Vyg!o-8@)n+5++W5k3e&mn}5Y7e3JI0fbesXbned9X2$%!76GddX3I
zqg3u2DQ^3d+98iA#(+UhVp*9bkIl2z0+YV};i8yt28wSRmdy3|bKgui-FkWa at t&M-
z=zr#Hu1k6s at FSk3M1v!c>z!0XL=Ak87cqAWF?U-cZqZEVDxVFY`xm%xZ~*?hYw<GJ
zTAO&w*cPUm8*dXgrUZ-SHEvAb!FY529bl@(db$$kEgPJg8<A%RM{- at j+7yxd4&GvF
z6C4r8=~mR6&4TZ^!Wjfxu^eNt4P$^<u<0>)hZ}>}Xn~_TLWem${d_E*Z{t?UWsJ-A
zsksY#X7AWuGG8%|yD*RC7s@}c%C^p`Us5(bhv!YV{v^*6$4yAO|9w0J>Zo&UvLstN
zpGkb62=lcA^EDE>&g;}p%;8U at +nB_^54`eDvNGZ>HV^Z#kZxn!n5*<v=1F-na}nd_
zVPz4w*vdm+`+UMQfZm6Arm_V35HlQKh#aUwDoc~4hJ6jS<L|><sem6P2Xmr>qyIvV
z{;TlaH*oa-I(aY5>z&*<BSs1Hx(MSO!;SN1$GU%;yWPL=hJ^WKoH2Jt7zyTX4>0|+
zUfhXz*O`J~HbwA0o6 at -{;cQgI4kgygeTZ+$VXEn7XAp8a+A;RP736rv>)f2(;IKth
z;`zusPQsU;%+&jq*7d8q?F~NfW1dG(f1}OZH;SPJ-1peVeUJYi^VGj#dVW?<x4)a3
zrxhkj1$lT~N$x#8!o<(_Ku^rc$jozNO<OJKlXhi1Se5#b!1P|mA|CQ=tJ3T?<kZ at j
zhK~}kZJzW8zN~MMLMrxGO~NKdY8H`pOebiWB=HRMiH;etee7#Ir~j1w8gjjEnRLy@
zNYVKbX|izD;j#&XX?5Iqm?9%n+MTh=nz~)f;RI|IuCJ at +Fajd1f6rKHP0I+kzGpX5
zwb>?bVy6RkCsVt<lson#^ey<W9&I(+2DJ6SyQ|^O4~Jj8nAgmj at opcZX2(ZkS%S5Y
zk3(S3A^bIttXo%;fZ1e>j~#1W9pFfqp4(GAy5t1G`>DtKL?ZT6j26BD at Z?*+&TajK
zyR%d|pMuTD6TUb#Y<rp&m?Aln)5;m+34%C!GpqPQ6(1|OlT8UVZdD4p*l$jmkl(3a
z-ki9K25xe~I&Gy=Mp?n14Rnck7jOh$Q+`BM!M<e(%n-lpQ at H8{RvUG^+m^d>bpUEv
zt)}x>U=FW4#MG~IFx|9oc&ur2_gbIr6tJ0c#F}iz5U&vFHK=__p3UcRLbK9tci+90
z*%!u*nqFyrK!`Sk)CjqlMCyZBH|{{K*$Z0j{jjm`%~MdY6=_3Yb2Y)<UOBT2HMy^!
zs14vrQ44RT5q><_Y=}MSWDUNDRnS7>X*xw3n|SY*zW(PPkV&;$U=!Lh0sHQ_^wMMV
z8j_<UKbJDlsbJ at +Pw+_G^5pa##C`)EN<8Rd%&5WC%jT=gr`Anr7qA7eu1mYshncEX
zJK~FwFVsq_+YQkJ%w>PX^JmM)@x99CV$FXE{`i%+&x)t#eJ*3dr~~WgG$d;b_f$S$
zLTqz|<c@^#@K|Fgd<)7+f1l<<`MB3I*!XVIjnXdlVLNbYnO1t7M(!c=J^c{I@~e0`
zt7!NtRT0%Ph&rJDlidBd+Ae=T=y)FYIJEvj$9vQFoqE5mpXXygu}f7aERb~L{Z3E6
z-@!pIrk1;>6!&c5?rC9w%|h>IuJYgc<zCvO^tmxjkRrykv<SLRz#+!xL+F<2o^FBn
z&;Hq_pel?X;WbHYW4&Q1bGm>V%V#Br6MFG}hUxcf>3o$NOQx<|F!A+BNCoO_v at zWg
z)y!3S^0x3i6LOG%n at iqJfOo@u?)aa3VjbExb<Z8KR0v&2&83S_pZH$pZ91LMyTi>R
zwc-qjZIR)+CWj8XSZxs2D_o~OtvPA|oikwt{$@vfrlCl=ggTSZG!x&=s)=g>jzdM%
z3_8bMvqJ0Mv!ci?ULjlc8aoQx|4GNqY~{Qo!1Wh}YGd?YcE;#WSz`33PdP at gFDnFb
zdrSMY-;n$G4UefaofForl at 7%tO2K9}WvopwKDIA2P$UTu84CRi90}2vU<bPh8Z}$`
z14 at DS)N(^FjR7WO2-Qhn#DDwq6G_eMfDbKm)^<$Twwj}=CKXXL*c|9AnN#-xZzO&|
zSEd{HGFVGvJ-LQxMN}KD(CXsVQFG}WaX4ZCLITqZDt#U+F#G%gEsgd~5=#ylJrO$A
z2|H>x!PbfzpXrAY*M at rNUy*#<YzOQLf1S^h5g)w+HC<=x*)j*QtDq$|a_4Gd+YOvx
zRwkU6WT(Z_zO)wW2#IsiMtC&Ev<{e^yMB>>*;1@=g=`hp=+%S=L6?V|#e^rcNDimP
zO5EyEraJSoMHAoBf6Z6MtsQZ6Coq+(5%1EA at 0pXmYt2AOp05ltNHS{qX-x6_DqN$F
z<PA&2+KKT*ug~iR at iO{I at 88CkzWO(5wPu8gg)D5O&$<Ms5s!&;Ucvl|;pJex0%keC
zn!`E#5wY3t!Ztf?w>QQ56fqX8f3IM!zXo5mna=Sf{l|S0|G(}79iNALy+qqCSdb%G
zh58Gq%gt25Hk&~9;~9K;72G{u;#U)0ipj;hB++Gft`9)VOK?9eY>-;`+e>dhz6e++
z at CizoT*?CfKFM{@hmFkZiFuQcr1rv|-yI%zw9 at kgWSB1KBmal7caLkb?*GR<BnqpU
zf|~9wML<eAFp0Rm%MN%O84(f^#-%R7${?Z=>`o#XW1w8h*kGG5#$YFKFpvSFBBJ0S
zouwdPupAo`@DLROawnPJ=lcS?yFb6j=kfdeaXqf{`?{|8^*+3g&*y#L+nIV=n7&yt
zV|MYtW2$heH%r&|qHaBHOI*j!@qak!ed>yKXVV9C7_CvQVacFVi=YDl>mBje7|*94
zD$k{kbl&3Zv(2X(*P4Fm$C#ndbYNZ;OP8^b^MLvEcM{`g^Pz~2nq*fcykp&!e2p#(
zJEr=1?Lm7E8#(RW2Vt9v*^$qY(Pd7Th)yBWc!-HiM(_$pW?^oFO&$L1^_};DpL7U0
z{)m0P0h}?!vPo>GL&e#<C%)s^yvWZ-KA}vs4l*BayB7A3=TL7cbefB at Lr-Lu$@--x
z>sQ14<Ijmq^5;MPj4J%|A4jq!v=;yPb*c at 0>`9`hqA#`q4<9kW-Vyj-A at jW^OC4Ra
z>XIYP8!}9M7I*=^2QPrXpD<h+96lf=+yIZ5hD9D~f(wnf)5pBsni`iwrtq9P<}rEf
zb#FJ+Mb4N9?3IYA%u1yap-YqY)kB*-B!tI;`R~`M-|;RNuwRY#t~Y1mTLOKr!N(^e
z`_v%{ydu!$zzG1|R*0O07g&bvMBfFsG?jyOf#@1711{1Pg6+ZzBK`){^GafSj_L^9
z6umVoO%iLq0Q*cEJw#W)c2P)A-BYnSkJYM;j|@W&_I(mJB8i^0h4US-<)de<<ebcW
z`>pt}X<bT&gZeRU6|muRh|N(N?HUcaJ_%fi+c<M6sWuKi+hX%Px&-##^-1}_hiH_4
z@)n;`Q>u%m{MzXU1huT<q{k?}rGB^)b6Yyv6Txv3vI}5$j at CW5#={nA%QL4TmY%PT
zgZzfLD{ZXKLF~t`zo|P$I8iN!5~GMsO&gDMpZHZHzLoeoZ_syGz4D=vSIF3cZ`cn%
z7-B|XO9DP-S9aj0tsk0^-(zZ{BB-`5DP!|L0N=1OZV~F`o~Vk%jQGY9+j7uJ&yV06
zBQc-DBxYnxL*%%p+ at M3KzSZ+}&Siwx4)wa-+YQ(38^fG)=ilCLV`r~XM_nYbD-TE2
z1uPET>ZOgt9N{U!J9uSkU{3 at 0XzdIVhZJ)fT+3^$CHxsKdf=`f!}#mM<+Qwq^&13_
z2KN1Lu>B_Np*5tRqu=)u+c${?z4CXA)2r-HyM7M8!A5-7EsWI#^}|jVGd(`~r&nI$
zE5W(nAT}7BpMMW|tFss7%$h87?&c1{Lv^@6>Xob~DPCwG<XlFsgx$)6`etpbqu*G7
zw$Z_>8~Qm;X79)QlK6Y%76)!x6a+l*`-q=uCGtIZ!4+EP at egU;iv@@mGy8;5`)>g^
zk2d(_;C+Zs<7A5-`tUFt`(0x2rgzag*zBC*;P>~ghOVPz_FrfA_mDW#Uo}j;D{^C&
zAnuu?N1F$qJnVX<o1eE9Z$@2jRif-eu!*k%k3AdfSFpC5evPa(eb(2YWe2S$?fv|U
z_oek3&#Zcnm@|id_5Ed%hm@^MCb?8RY0c7QGWh+t_;-9F!@yQ{%L}~WnCA*j>X^Jy
zBiC5tL9T->r4})81)NOSO1;VR0ynvTZ-y_PCCgt1J}$)e<GD`g_aPGLl$U{*0Q}ZT
z-!o!?E;%746>@mYZZrDJD7chrGKt(ye3m3<=@WM|e3&C^CicNmn}b-0_dUNOF#)kY
zxTY?&?T3`%e|mf|{ARv%fw^zIX^}^IQ+jw_qt at f=Va%5T<f;t6;gM4gOe4q at AFNfM
z{XO5PkUo+D&ZX9H*s`p*G-3h9iatftH<)9lc}s_*$u{hHy-F$jNBFHV|7C6vU|uIV
zn}j<uVXc2f!ZXOnsM9#MU(wjNw`vBqU)J;?CI<K}L}qBI0=M473DQoCC-=ZXF_Osm
ziqA2=HsqwzF;BVqw-3%h9q$@^6Ya|i-@<Q#=!~6?UYQ0QlWL~|j`}xgfLeq&xG-sz
z`U5G6VY_$J$Bo$5R{5b1oS|xnojq{V(#OU<NSx;2Oz6YOXj`Z0bb`-->mQ!H-WR%X
z2)lFQ_)~eJ77t*x{CUp@*1U<be$x<{>gj*~<=j?l)`N4B*x%pyOL^<q;Ef{BL3z#p
zRo;iziU;@bMgli^Jp7mPw!nUvj&}tIvb&s#!<|mXeO2GAH-V45J}ww_QiSza<X`z;
zNO)$rBB4g0iH9#e?z3U-#6QLMm;d!Ing1(^Y4}%u-2!uRf3RktFj(DDEzl&pH>K|^
zE)VxwxHk1lzacOABaJw}er9WOG_aTJX0~o{tzHgJtbT4E(H+V!^IGj~$;-+wLAE!9
z*H0eLHyOxrrI7t2X&a=y#BW!JfANtzj9ZFa0r)NY=nc!=uV!kUt}ydA#@wNwxK-w3
z2@%K%w|dp?=7<e_xf`D5DRdI|d|fW={y7+jhm!Q7rlb;JsTPy}JF<)T2)I^aE5zJE
zblZ7EZzBA|{>Ku8<>ispqp&O6vf;B;i$+;I at R5L9H}R}%KI-iQb2)fOOI?wlq5btd
zc-gK8F)~DZa|!xYH1*{<UQ}I}p+hX=vXx#VyXOSm;Yhqr?Vbn!j2B`ZBAGetQM`9>
z!sxea%n#A(#D~NF(NQGQB#8n_Zm-uJfsf*N&~EGD(UuL%BFAulYQQg{Z^F(zZ?LrK
z!$-DKGO_!pV8hao8PL-u%4sciEX~@-t?MZny_?u_CcjUEI<rIfSxrTfSe&7LZmS4*
zBETEIgtF#<V<!hOJ2K=)BQMI+e{73)YgQWKbYG2=iPGF#=`Fav*f;O4#@9!54LG({
zh{d$?dYF5!QheN(iu>jur?*ZNNJVhkEQNAgN}h2pY2Ti2LyjskYat69aJqyzND{NG
zGLu*l$YD$_V;L_?CmFb|KY;(8P1OapQ9_FE*%#EJD5QnHe<NdalZ0DFFj1gyZN<1z
z58W!-dq0&luK8Q4{WkI`h)i0^&S3I$wNCBj1H3#N!NaUV&UOXP8QFUgXX4aS?n^LB
z37!o&1T8nMRhCib)$mO^c(vuFz`r2)Hq1TThY^3jANeo&$d^#qN03ip<OT<;FNw#d
zARon%GB3EsDkWH`KG7Dr4|0JK%PnRhKLzpJu_JR8!r=0?N~KzqL~r6WAjUBk{;&g%
zJ(<z0Cj7g9_PzPa6AnRj@!V>E<Ig(3<{qgecAnruBaxHbuaf*(U4i*sk_(KO{}&L0
zwu~-6=R}t}9MxseS5`+F!w$!6x9X5ju^RTa)xfx5_`=9P=*vRcqtfEXQ!B4b&oIh3
zGP%s at l2MMe-02dLFNbbAwP744*GZ*i-u{`Z`GfNbzY)e{I(oFFspgUN!T0?NPNThV
z at CI)w=8TQE2{+{KM-iu%&h#0Qr=dxn1B`VOOP8DzoOZcI>C4WoBJmLtMO_^DkgKk2
zFV at IB?nC}6gdN^rF84Z#d?z>Xl*Ep_M*18T0o(bdsw?A%z+)yI9t$caz8u{Ihe_;6
zIIzDw78V-47fQ;#!|OEz$*q}!?X8_JjS8}cMM9c~c#I6>;Y5GE4tynx&A=XF<&k(C
z*e4~>{i`iXVDyX;*<VB}8#$VubQTx+uqGcR;yIa|UCc4X!0{z<)y2d{gIJlwLHwhK
zwG;KYr}*(sV{YO{EyD2+S=twO_9}MS=swJ$qxeU;+*QzXfl+9QbBI!k%_Zdh at eaUh
zU`_MNr>|j7`$HhyeUpsM%hu at RBu{XAiM4KA#?qy1xusiCaDwm;7<_|A!3&IhjC0^Z
z{|(nZr<1Y8-<AZGbPf;>V9#6lH=~#f`NUt=bd>nZ65z+fHhg&4hX0NifpsI|>9+f?
z`bFm-a{Z)#%8j-D at i$KUKYoL6TN7SrZ%4m7G`X&vT$^BPKT5XI&yFg at 8a20U=s4A2
zi;G+fdASi|A$%0>N?PQ*5q2{8EfebODqNeP$o0UrqDtyGu1&-_ at C@VmD*hn*W5~R{
zcsB{;glw(@x{o8^mmNhxc17VNpR*-Y^7)I9fg=1 at -J28Ic4-E5^ce!^x=j+u&o6Mx
zAp6Ec_e7jqf>0El=%ytc)5c$P at ZBx!?CUG|`yIxgx0Y<L{D#>cWVUZJ+srj94*_3m
ziWBrI&pTM2LE9}RbB5Qcgp$(-`wCu`P&J5$c!u2f$`fSUV(-Mi9ofpXhZ4kK<Tlli
zm>tOKD=bRGI{4Dcp!>n6#f(eGxn<V%v=ggx=Z8U^6FxKOp^}L at V#oaHe>2h<ux&~M
z*KbcFeznPKs_iQFR$Rk3ME;L*vq-sQ9<fNr&d~meo2d0a^$$F$FXbgI-bBf8PhQ9u
zZ8yUc-+Ki0!w;HknL1tqdHHF`Hh&<tf4)PaQ7b+OfNV4S*@a0)$!2L|BRIfZ=yfCS
zBxG3%QubCHg?w??X92aElCkSOKaP4|8~1vxrG|CXGlVjDh6Ei{&_>5od5B398H<<8
z5g#VN at weeWI(OgeN!LHTzt5ue+>hAETl=H*$=v%o*BnZ3$>S}x#2$BLza5oo$&=IJ
z1BJcpO+iaI?V{D}a-)R)Y~<YtU`?%(?Op08Td|dr&i3})7UYGz+dJB?jFRa}O0WGF
z;=|9u-y;{T{#0pQhkK%W9v#^zpUXN%ixc0ZYKD5 at D=g+E9yg$lgFHV*8L=p%0A<8a
zmhlOAcZk1pvW!pvfNcF6<cH74nyHBCb1ZqHKso}rQ8qdQ?esX})xrG;%-s2`V#Yrr
zqSV?Dv&lRqac59J=L<_7XDPVOGCbojmcI>OlZwvfmSqSc69sW^#ZUMtC;W94(NT5y
zCv{mZjK0jL(zIWlOT#}5C9&<mb?oE!Ial)g5M$EkQU-ZD(7nT|CHL}Lk?(v3x^*6>
zRr?j}6v(BZQ|U_dG58A629rqt&Jr-?W}@8qb5)dy$fX?UprUJQ)OfF4+|ReGNZVoj
zv$Zss3>mJP6~4p1MowK-F?|PEVP5vZ_$*q<Lku6DlTO-Z%0}2xz`wz?(*sI1;&g02
zZg^%j^UOdn%r<LNXzk<mcQpi`@;~J^6#LE#QMcW6R(JQ<PjI_o3%Ww|{}JfNjI8xH
zN`m(iGVk?1-s^qu$g$?}B$j%74eC6CRcx6DxxgQ`1M-dgU=NP985#V$U&%AqoUq&>
zavSOYVu?aHy-Zp3p&KoAn&*|D8H9Xujrny}vH4wA39vKt at B`{SQwSg3=t<WD>5i9L
z9Rm~nBJESh3iONjnSOETeu+^|)z}Ll4-%aylD&`F&!5;IInEX``*$bzyVy!*f6C;(
z0`Yeh7_Sa7esb~1o8ahEGvkKPYUF)IYnQ%E>}nXR%P>!W0j!1Xh)qef5-k0|ly%Cl
zA4`J`rk-96JNTiUj|QE!C|E<<_;$k@^<>+Xi5h|FyOm&K00W^B<52V0IfWSuWZ6pg
z!7O*;7ogX$3_BNy0yi77W8}m15n7hG^XvAYF^&Ruix8tN;!1AWKRS9Le<gkuPGWO+
z1nbV`XRcOEr4POpkFvLeODzfcmY1^c0XqrTD_8ImfeDa5dxb?7ToRto`@*6F=2*Vc
z=(Aw(+LLa;{yk5|pzM;(k-NR*Q)t>pW)?_aXB~o$eZWU<K5{;6<ZbXEg at Wtb##V4%
z_xy^|d;aUL2JKsCp7Y=w(}zomPXa!IT?$!lrNWnWkR1<R$S=nRHY2xo`J9Gwp5Zs|
z<&PsyZ2#g_$X&b{rxeBbxKZHxp~RH%x6)V%{Sb9*d`bM9<H(EI{Ri|tt%u4Mj2P;t
zJYxvA2XX_RfJ_!6YV|4X>~|~r%lz~A`v&Cw>Acs$x3$jrQON3VYrPqp7&Q%X6U*R7
zuR^`OiSeG;>*pbtbK-w&`SX9Y07JQyo&kTwm&Eo at -vVcQ1=U1s|0Aa4PwCxWS(<!e
zL&yI1<X>PLuYz5(hBXzoQ+G=qkqhlT at Z%N(%l#(x8*`m8!9?HmDriKmGHmaV1w2d3
zE$`Nk8WpJ?rQ0ilOL<b>TuZDVj{P=l=N;%DeOUs_^Q=-jon at E@Tj!6LV28ep at oRwS
z0LZ_^_+TltjhSU5ZSd#o&4^3In%Ebs82g<H=ZgsD7ONJ^2-<8mV)9jxGo!t0sWuoV
zqhU`eTkb~W_QW41<aXH0Wb^@!geuYgOk_6r#+fn_+o+mx4dzGO#>nl{y*r>=9?41@
z_*Q>_+WupuMLyCd7n`+I4xPSqE_9)FO%Ji($FoNLe at x)xx_|3SquS6P_M$(eP;;~?
z(0zoAT>T9=dN+Aj{m0&$un+I~4*gHq^4}ye;0Jn$UkBsi$IO^%x6Gi`;9<bHf*4>j
z{<hltU(&&k@&R)FN{~nWDQrBS{3L;0V9mrBk at 1d0QmL8XTJ=#2q+h9DlipCb<b`Wu
z@@oETc}*JD)-4-83!iWb at Ini@Q=n5A76Pvm`rbUwJxU=`zeqS-mnfGjidkxNEwDEm
zGd1iO=Gn!T7sJ|qlnoCAX<=6g1O{K8^&sR88Rqfnm>-Dk?Uj^L<7I_3OC18+gL?+9
zk=p~v at yY9+TlEEOUW=he0bhwS$a7);8w-&_XTkeGS1a}1L1N^fvnsu`QKuMQX1yft
z$}{wNT8DBjPnKiGoJ5{?HU;nESqA+`9B_XJxD>ckFdp-RZY#jmqx}_jw^8Ib(d7Nj
zKLMxZm#;m^_<sAJAyQE$x7?QN+D+~w_gJ)#7m|C-;MDw1Pu>B%rdm9En2i_`+`pGU
zI7{@`?^~K0Y#J|A-i*&OKDu_FF?<pJm+vuAy04a_1YW>C#P%I<m!l4H?Ez*3bfcrd
z5|y&9a=)hTA#b9L2Jb?+Km0wwW#pFQSWa;2_B?ub$P5uMc8A5@@8Vdlb^S{^$2$}M
zI{h1m#8}MLbQ;%6U)ksxy9>)cEIKUruy}9sjQt49+5ew~TtCLNZ(b5)za#Vq)W{D9
z#_LDAU+i$`fwS-tC8smtb6Nj*2Jp5r5-sRQZFENBCD at SLc%w#)55w1pobUA`eAxaN
zkNn5f{(S+W&;BvK1pf5$xYG@*B(b`2-u{N$$g3%iYbQ41{uRXLfcW!DV7a^sJx$>X
zuFs|4TV=k};RD<c=|RRa5qmAxx8ZwaY`4%o4C7~z(>m0mSCnS9vt_}OD-Mx6Pdxg%
z;w<eJ5<+xz!CAAOWpFJ(o^d|fwf}G<bea3mWip5^^Ynd;87ky>7oE^~6inzXQM9$5
z*kQ-vFMaW-qZ-eI&X4=|+rB2c5aCE8`b`uqYKDF57RDOFse*o=1)a+W`aNqYl|y|&
zDFZI<DDwX#;YiRa at Er_k`)p(Mvc$IO`+>`l7j#FV!k9Baix~M1V-ULz^Vl~&?^1a;
z2UpOUAA-N<va5v5|07b40C-f_AWuRESoQ}U9dyOG)B?Pz6!fR3AER|182d5y5}E%#
z-X+j`EO67ko8aRCZ~6aX5C3-39&Y+CdpNMSx{+f%VGkdBHL3>NuiziR_G)=`>{X0?
zrF}0p9g?32Mt;kmx+~%twN4(zW-TxSV9Rcjdw&_wvm+<FMQ(dOh`uxO=Hoi_m2`6!
zboO2<%id3XT!~!zo`;07TVssXzD}LTm`Gw4p7%3ul7|^Rb1_HckMzBDZ-SFGrFi5T
z3vrUf&g}84S?B#F8Jmf%c%&ck03Q>qg1_2|E!QV(#XBU#Ry@)ziPalXH;k>A=tCR@
zqrb1gww!|;Q1adn&NKRRgdH5$BLYcm>Be#Bwp0?Q8XPm#mS+1up_iMuC5Y?qfNp-;
z{!eZR^L_BKq3u6D=_5g|l%*0jgM4B$fL^E?y~8d2&-~==A24)#eXEw(t(OVWU*?hc
z3a|8pl5@;45BTvWkJTompVy^yoG<MYZ1CpQ>3Z>gYVMD-)s~{pG!iqK_y}@k<$>yR
z?j(K^`?vfH6S*Qa?|iNu at v*&0oUk&>$0V0Dq#3+vC$E+a87BL|hukM1H>>PVQ8l7U
z at L!eV_z-dq!GDGPG=+AldmX3Qvad01dpp*9v52tj#zJGs!cs^6x%MjR_`|+oZ4bl0
z88WsM$9^RLM*&+5&!D?T-g%%5xCsQu0DWiW5azgCM<rX~C>uCjyn3LlIFJWFDB%r7
z{%IO7mvFX2&us_Bo-9j1eR&`9$eOmka_v$o_pZh~LN|PJNS!Q+jdEsU;qvTZ)Q(Uw
za`8XeT$j}xb>%uAb5JW4hPmYh<l=4vPIC@?4i8(6$U|5e!biS>K>MPH(jMkjVB>{M
zKL`Fa?aSORgOLxmdlUD=QKRoR{JVD8Q!e;>Ce8*weaz=PrhadrtO7gXKgC!gc#>O8
zUkCPt2eI`h&a&nX+$??_xko|hV=F_%=1SNw3I89t))#ghhW{^d7Wx(&_$2wTp>|+Q
z`8M1XJ{$g2a0jFAUXu2+EU5ogglja>pXA6rvxo-{aZ4MCucgxn_oC-_qG*p&haUbD
z2gzyvYd(GABY~T)j>6Z8IWzH*VEi}I#<l-InXfoqLJnL3%4Ky9{Ph_;>HjFd5q{;E
z&)qSn-dT8*)B$oDKMxrE>@(c!!rVIzWnJ?0Q5E6)z at e5I%X2%eqb}2 at n7VMWN~s at d
z^TalN3)g at jao>{)nYV%ZeX_p%q0_QNpR()!s|>?`%E0+~#QxQJjn{$tb)irEwH%%s
zQ(w~%m(fP#sug!I??BHS&Gk`4wbNVRZ_60ipZB>)I#a{R9n#0khmOX}tPP`=efEz!
zeDW9bFI10Ck5R-gXnYN^t`#fiIu5*gAXv{+-qQQ!+6NVN&((z^|BUbNeAKDSzGpPo
zqllAZ-+^*X?3}=jJ@;ESct-%==%8(HIBWvQ-P4B3!FLxy^v-}D at cWifbLkjxTwilK
z1ApQpoxR+d!FEc%#%3YDpGTPZe=Gl<GkkL{>Fiwi_YMJ5?VfWPw_Di=Zi-?Gx_BbX
z3T%+Xe_%}i at 8h%VIcR5AU}lW-N5N6I9yvKTfKfxnfg2c$lE&S6b)sU4l;g%JN8TUF
z6?k~K3T?dyxdW?tUkHG&VLgoJL2lE&EQx(GW%Ar>6X#IIm*ei6tF7gK-jhV`$rd0s
zCmr0)ThRA!`N%~=^sB$aKI0{cWgjM(G00&foaW#@)c%8fAKKbWY#F{~*4+~L&VZpK
zO7l=M{tv-q978I~I!kP_R79f^`o%%qyApQkgYXv{tOPqmi0^v1NelmPV6qlD6p7Xf
z)LRv<G2z-56LN7ZsXQ0wSF?$o9=@YQ=kgrvznZMaxgAZwj1BskT)!OiXWl}@?n;^Q
z{~O%@2Z=*R4h?dfCdSeP<U1q?b>&G)GJcXVQTIoD#KLCFAuL%~YO&N|smEB at f^{|4
z%~-y}asdl+thcR2|K0<>$~mHPjIo3(d;~EvIT(8hmLd8?)?FMoP8=81a-Z-&m2?5i
zcg#B++xEdwZ+yGP2Yh))u{2;g%;XyX1OD1%f?wf(Y+H)XkW{EEODfV;ChhmH*xe@*
zBz5Q<WZdQL$MdtpO%Z<fr}`B7MZ7khmkK#IUoIf|!i~MWJDfC2p~#VRnS=Z>Y^ylP
z_xG>e;qITeW1WBcjxgpQk at r3#5T<{Rxq<L7-obVmwh0d-z5#OC6T}~`yH4x}Nta2T
z9-c{LJ8(WnOQf>~c}dWVZtnf6&*7tR$A28JvTp^4WqzL{Mj?q)Emz6fpV_VtNrO#L
z(B+Idv&paKtTc0Vi;$(^4^DrNdpS%UM`Buz3xTc9+T&5g_+CV8363>{t1aLsvov7)
zh?3}s*&AZLv^7;2V^tH^;h*nqB=J62^RgPXD(S3Eyd({HY9JfVBe5*-?GXRYWh_6S
z&PKu4yk?=El9KbC*ARDJ>~0M;way4tcVAt|x9rD~4xBe37Ctci6j%xfmLHZ3_?}}7
z9mEb*`cGVc1m%dcdwDWWCna0x1YeaC1-=#wA4 at 70!NRG)<p#zEbD!Dw!`+_I9Mdzr
zdf?M#0H3Y~&k*4{E0!)SdR(u>Qt02ld^B+VLd0Eg7D5KN1MK5jm>Upd;Aw(9l8D6@
zI2y<$ef&JbQ47o`!LQ)Aj3&A4w6iEMamz654&T=$ZV8O&J{zb`g-><IK%hG9w?K9A
zuE2<kV}TK7Vt?L)vU;)n9vIP)jOSz!UkiL__RbqrMCZ at k<H#!vo5*8{<$hP@)ET&`
zE3DHliB<gU)E%hiAF%ImO(%6}|IGJ2`)AMvws8voGIm0D`1BO?t8MG<s0v0th5xe?
z?dKeFB|qxB<#rT)A01*-J_L4V35n4<Q^RoM-i59VT>VgW*9nYC^Rt_~WG*M3cD4Nz
zxCq5goizPPjqQ--1?Sa$ej7T?PR_5|WM(y;;ruV|mVlCW&cc%JyLO3r21`z<IvtSn
zR#=KdrnR2${E7BuZ86Vq2>{<^8RXOTHM3!_X>BT5p4W6QzC+_kkS(5OkvEm#niUB$
z&Wi3u#7CoY<zB;gSBgsFt{~R4q0>%cp(LgFuhMs3A$=njvRPklQXBG5Kja|(j;XUr
z86eUEjMD`HRc|ZFy!Ok7-rtO=Q5U;NU66W!-J%8k4YEY$T*4zhu)nCB%&)JkV|)Vm
z7h#44d<Lsr(@k=OkS94%P*k2$1PpKJ;9heA_PtGfq^m>K%Yg03jV1Sm7|gk|o56v0
z($bgz;hNGxtzWLF(sPb*C;Yr6s!<j&;USZ?+V^u5O=`#+gGn8t)TH*%M$h+jw#4~3
zmuJ6$e??+p at tuFnKn|%7aw&A&4n_}ra6IOJ9Cz at Nko)dNYbZnGrl;Kk)z7|$9R4hg
z*e6dTy9l4eGMT-X!99m94dp)cKkirWTo9s$o!~QI9b!zIpBl1NwA861p!!UJa%7P#
zFye#`&nJFysqH2wvndU{Vn&OQ_3Nsd-g5rFM+ny3eO{fgnBd+%kpI1<q%GTbaB@&j
zpSP5;fvGfpuw?^-6&_7wb-UDc8*pf(+YgYk2ky+D@)oDibzTOp-(faMV$8pQe?{v7
zAA5J7GMxh(1Y)hOan~|(KE{Rp2PLsCC*hAb&BHlfEpra?KE}#!-U`dj&Yyu*w#oCg
z7Ew<I%c$(5)n2!njRXU*BO;*WOu$<8#iBr-lON=}T-0$8^N;pV)&W0cYk>XC3!S|K
zviVaV$d>D!1?9YviFg#-)v at S_bEK^ah|G`nl>RblN4BfON0d@<w*+B)kecgp-4w{M
zh at 0}g`Jc9z{xW3sUTQvRqrNv0n}0yEtrM|e{uQ>X=>K*2-gZ0k9Z1_6su?JnKSd>V
z>BV{~kxOh>MP#nSGlidWJ?+={N^r+xF816=d{uZ3nX|+prppG*S!eC8yc}$IVE$~y
zcJ9P>6wmIelulO)z;}fFgGy`{38XXr0B?YH;`o%gy!ycPe_P4ST?Z!SsO--sczyA#
zHCWz<o}&0=rxOc(@IB1$9nXLA@)5$Ni!o}3{ks^qAvO1I%~JC2+`9or;6z6+DG8ls
zIep^;UY)}jlef0ye*e%Nr#6BiP4Wm~>j7?b<a+BnF;dlI+&<FJf8K*-Hx?R87UaSc
zK5kwQjqer(F0tQu!%r1(F}iE*$uIlAE7_$pmqsQsKC at Ss6W+{%z>QxhvXxX_OC<5#
zL#91W_lwkF9RXF*R=?&}6>_mp5<hz*;W;GpS}k{0seH#44i`Ea*FvN1e`&5J{&21-
zaO2mn+P?6e9w3UgiXA+upXRDcBa6?)Tp}QGMv?FINNqo^kWi)#vA5FpNeF&5qm$+V
zBfBZOOEhg(;rWtXkDoM5;#_C2<H`A|XXSN?Q6!JrcMTsrvr091S-_!cy5W%SL7u_?
zr3}P}?h8uO0 at DZo9{LcmlX+bm-`!lyeSK(t%BCA<{4(+0U26rQ{h2KbRh26qSF&0x
zX+h1399=Ah{Hvr*R+2yHfn3~X*wu8SEj~?iWE9F7+VQpUhPR(EK!y8rTKY3R9#dBC
zgxwAnxyoJgK9)97$Y6U<=kFUSO%&24-p{ixQ)xkMp6^?!|9g3}|4-#j;D?)j27Y+u
zqTH(3$HXiNwdcft>hyh5UpST)B$=!a0dEwxLy6bO`0kS>H0*`$uT_{<KI*6#C^P+>
zU+UT#>GrMmn~)3oZ{7%Mv*c<`?5(gJOn$@G1g(jZjZFu(A#lsdbAKpbB&%9JN0|vs
zb0A+<liZiimk^g*i~kt03wiXTf}eMfqTPlAL*nIQ0uA=Fh;Bo$L|$&hd7NXmk4<co
ze5RL=GuykF<4q){@n^DK`*IWRIW9na0dt;auAR6qi`kwmkK|oFD1+H<nz)|Xp1hvf
z#`WHa1B0#lMV~yXktzU>Tn at t*y#ap6B~1P9$9LA<NcAf;>vu(jNqzul3G5&l>}XQA
zOnd}lh-`C6ow&+ve|Mj1T)MK;QAz42Kb_MW*?wOC&DF5mJ-NE2jNi&lw-gv4$nj&D
zfbri8n=SG4)mdh+4ll|Ur7p!0g5Tnv1pA6P{A8PeE<<#A3HTPuk~<+!h=5Zh*Vw-Z
zQ+u#KBs at F#KkLU at fQf&c`L{CGQcK!7G2)m7OHY~ik+L?sh0H}+3*LcWW}+;N^>qZN
z96qg7%IUp57j#69u_0z9<$$%Edz>;^I&4v7A9Gs2S-dALxqtB%i`Z7Ny?-%$#nx{K
zo(%d3auv##%~6!QhnzZpK$OlZUPN#$oW_=hOg%^VlNVqfYQa29xNa77b+XEOGU(K(
zQRH!CkXRwu)9XUh{wM*)xH8x_1g?i<dzk6+ok7}96=v!>9A at e%1D6PiS+zko6Z&KT
z^Gx6;4l|jR)^mJe at Ls-<{+T^&vp{b<#gkHZkQb)_##)_XCS6Ub2secpISLC`SXAdr
zfV~jWBtCF9`PzA4iFSggD=UImo2dzbEiNjaQxX*o9;Vi@)lFhUX&3Ttksn~hwTLh3
z6d+C|*DT8d7RR1`@5BWC&V#cDsMN{#Kk5uwj%DjgL;MDOOHuJ-tGf`-C7;2nSy|}N
zDUg??s!QDXV!Ole_c}*Sm at 3qyjk}fRmtTH)5%R{Ikn_J?%RF}g&pwNs9q6nL8mFrh
z{0<hWa|yoh0LnCQ#Ek!Vl*Ijdc9Q=;=D`84e2+LmpZqB5IuY~6GS&)98s?UHzn)ai
zoA$e4&a_(iWC?FkH0Q7=)#H-68rY|YQ>u&>@bto-ST4RepQYh`rV(F!0sdlAc7%0J
z@|Lgyif{ZOrNY?`eh%=M1od+A?P)wQ{+Sy8s-J0#t?VE?+jnd=d5_EFJ=Xp8Jwm3T
z?agePft(J8_ra`SaK}d({B+*)W9B10IdnZEM+=>gbGI0+W}$OhO1ZJe$z0wFyzeq!
zg~+hIWHJ198pQSD-3F}xBJXxN!}w!L*<aqR=&$ca+NyPHlej#{JJBp(R5IqEBC-TL
zV2E1;zj<)0fQcf(+<Yo<y>B?lfo)PV`)9H51Dw6}BEC6;E`KVIrkxPeZV_P2+!LDi
zqAUmTOmro9LYluRDLgNUo3mk}O#2P=hZy$)j465L{lGgljT7#)T1P1#NQLe~E81#s
z8ro|Xn_yD!Id9_C+6XV|VPCB?utF9#QZiA0T>J1XjtuSVQ9M%=X81N|NQ=4nFgM&v
zxP^{$B=+cu=ZX5A4w1HCs7KqBA&)`7(|1hppsyvD0PjQTP{6PAyC6DkK9?2z&O}bc
z^h#kz#P7nh-~?~PGxnHk8J$N;Rlm0fTu%j<H?II=Tm>Ex84W)Z;S?KbVcuySxWow`
z`yR878zF*T3f_sUoqW>f-^)fDE*YDS_8YWTT49K+9bB>k-|<z>n1-Vw_=3>&wpuYJ
zjL!NK_rwjhwPBy*zPDQB;WfM!RP2p7KNI{D65#$a<5N|4k3Xv(d_;#)=f at Wb7%r?s
z;3Qx;kS4|{ymOATfcudd{EW^=T*c-2kTDrQI{Pie3(07cYXZ^rU>hH|MnYzC0C$%e
zk1VZ(<3bdT at weWoMWk2NJtrc34}{ldGjQK0#}9+~&K@~*I^-yn-($ysHwoM`;Ci?X
zjNRIuS6Gs6g`s5P{%7+Dp1V^AaFdl!>3N9zPS%GRegiK2c0KglyrCg4zNi^o%DY3B
z20N}O3Nsw-V}{5PwB-cER!UieR9<jysWLcsT^JTFmN{64f(7eZS@;*hf^VyX1?}Qs
z$GOjOeGZO^gKe$cU|Yu=Y|F4F*U5v6JE}*kNZ!NdI>ZU&QI8;&b^WL3Nj_F^HML*)
zvqR_sj=M0!cmi^v3s|KVArKH!S+y<=K_<mv>}LcObB?j#b3UC3{DC@*KdB)V=C332
zMhin^=70HqeoMQe2(eqFKTc_IM2!Y+Ob#b;`nK02^MaZ!={6Skx^?Tbc|l{I at g$bt
zy5^;t-oGh(g}*}X<Ra!H2%HNa=40GZ&0uZXJSvQNoF2}AU1w=j+x4;)1-w#AES-(E
zcMAV*eSGT;okCWBgi6YAu(w_pj^;kPUEx%JSm6<Hcx7Slt5gwuRe1z=Y$TDvftWLi
zvn;g_h9IV2A!P$UcC5E&1~3 at bv-Iy3KyKcT_Z1Jl#g>J(bsxd8M&#J#Bfsez`)!WW
zo(*oDCFpb4*>bup;YZ_e%9`L at U_kz=(C*WxoC(g|C=OG4)<K5=kILqIev+s>KlK-R
zvky^+1tqjl^r}}rOZHwPIFq-iG_-I}@7td62c#iaMI3zcEO2Mo^}BsO+G87hZHMX`
zMZ2QhYp9-HTYJO9FZItddnd}wKNT*{Z1LJNM2F_(mnx*Q>lCA|X|RcYY7y@#0j^Jp
zdxjP9WynE8%!5Lhg}5_TnL at aStPd!JyY>9Ek(v#Et3DpnC>{>Yqtsp3R6hfs55Dy2
zb!)4UPnI-WPaR_&darS|jJo9id(9D6f7C8u8>xojSst;yHv7h_ibM5>*@e7=mN-G?
zuEoI7(T=iTo1GuCG9tKSAp6GqijjcB$hYMC$%m>5Pi6R{RVP;Q1ZjS9(YEmQi_cKI
z5eGhMu19>ThWZlu!V)fYX|ATHZfx3H4+DQ~TzZ+3C~v_xx$$Dr*fij~^>UPmiOmB>
zX$Oumcyh>>syhKrv&M3gH|U*|)sp->{W|q7HC-Fqd??{yaN4`m8hev}*Epz-;Cf3&
z;Kpx1ljbV!<R&SEFKY7pa<8!YG at r_$Z+Qe{EydhiO%)=ZCGN4$_GGX$%yqf5)%ks{
zt!5jII5T03qMdGkYxKsH6_UbcuU7FaV3SJ1`;`r7PsPtIXnfqq4SgVa+<kf8cyYq{
z;RDDmgFg??eQ9iociy-Mg;;Tv at 9ynZzWq^U(+Nc$T^FBMUb7u|chIL!Q0?%+$cBG|
ztaNg at 8)6l%A}6<V_9`ml_d|2VjkmsxAA61429-t1`s$el_uQYEbI)5fI{Q`6IpqS^
z+@@uUvy10FyTGbnCU02cVI0 at QU1?b6QPH3W7I?Zx)p)6EA$<V(nzyLi_w|x(!^7S?
zFfKnjcG7prT at Ua@R7J_NPDWkA^D<jX<1a0gQPQ#3coFxOJTw2^vS%K3K1sc8TS%S-
zPAvoTyeqT)pId<VEpfvVN!-G<aq_#GxH<UVnu%xPTkCvsTFNOUut1PU_nbJ8_jK&o
zYmmKWlGtP}!RJphS6Vt<D!?aU at U@EcPA#En_s<z}nXwbTX84INCVPTcVIJaQa_yXf
z!$s9>9WU3C|1HDo^xGBdA0a2t;~dS$xeB&~a4?W-!Dn6o?Aaf98if=&JkmLDu-n#Z
za*N3J{CC*xyc&z}Jjw`YdOO{kgB<lV*gdo;!{k&?_MO!nVBY~FzKMMZWp<b+uFbL@
z7v;G;I45AI at -*Yp$#XT<iu}Cb1C#e1U`y6&REY6sp0OYN36iyffueInu2MI at egS+a
zG#fdW)A|&=0%D)w9yK3Gz9LLtRo$yimI<|)QWiKbh<#@)je8U_+cB29yTJ_p8RS?g
zI)^dFtwDZ!Yd8NCo)M@%b%N8{-OxD<oP78(%m;UthTZHIUO?T_>_?029^7KspU=bQ
zQA%HP0`~;95_3 at py_%FQmAlj>n2ZKjvor85MB2#O(SFF8CnM{Xw|ZV+l|xt4fHP2^
z&<0#+RldQD at dO;U!sHV8pucbij)2WC^dV<CxY^QtYl2Pp^He`WM$e_ at Ika7ndqaP;
z->2pUA0)@u)(8b%IV?@ck2f^uQdy;blHfF|d9CTPZDBp;Zj{kE+;xJb7irTsDYRM3
z-m0B!7vC$Boxl&0U~&eQhpr5HAO|ofRdFjhrI!8RM^d_gYsMuT`b8EeM-B|_(L-!S
zrU$Ra7UP*8n$|rdSYr`ny1!L>W2r(Oa2T at v$&frj>05d7^mCo8vyd at QP0s%+?hj=C
zZW5vn&L%1H4M_#8lJ0%>d~h!w^^OQLwA2{OU1i2Hj)2scSGuS%Q$XsA+YdSVCtSOi
zPRDy;jqTlm>K>c56y;lRe*><wB$y_!wn$lLFOq+Te7X~p-`T>FTb^*XTke2YES2>X
zDR)s3iJyWzc83bE$cGWbQT`OW0LKKA$Bqa!;HoT!O|X1JY~ZGZq9z^i2n_C5GE1DU
z;5)>$8a|$Sa0;m at 0kf~cejT&FuL(F3^bs at R&XlkYQG4L45i$2SMrIR?am<DCCLyjD
zFxS_^j at J&X`XgBa?k)3v%#F?*HNh)$E}@24)lr9ujfBLJOz>B74Qqh6MEE+<Za=^^
z$53Z)tCqaj-uou%B!vALIIli;9<qEx?!Wvs?CD3KlU0y;7dG|dkdq30-?zVu=M;h0
zGL5|fvX|UOZ<uGw at zv&MF&vU6+nlwHoJLA%I)w3&hP|f|@#M8 at 8_`z5|KXe0;2^nk
zuxCEuy#TQu at Doz)7_Z-8^5I%0`@nJTkxmENb$$=<xVth~C(-tclRpg0`a|Ljjv-1=
z{JvGkKmIZNsjMQp_OsAc?bh<mNnu&a$@4XF)(Cn@;zm&~z3HW~Uj3TcgEqfb=R1_R
z%>nGAsu0dO6>t+u&t<UEEn?)=$XGYR>ufPy)wCuYm{;SuYilh1;O8z--9l^!;RdX7
zll*jom**(iUTQ7gu5U_L!MEt8FdGtb<JCRVaA0XPYT1Z4v>0hxB6azgvt at V|@*|&w
z99zf}+kZiSFk>8@&G(<J=No4iq1~UIW at PcZ_bHzSYh-n|@~#K+*3McoT*}dZ3<~gW
zDW>iQzn9B_<$1v`P~d6oR*41_Q?m$%(;cTP#P{WL)J-DN at K?>&PrMg+v{fv7x5A!p
z(YsW}EVkX?i91K|4!zXhtQYwHi}374-{aYqY4=#w-FuZkEgFK|0dZdzcX}B5MZaYZ
z{i{U!a24uhkpIkV_^xN0*fL;%?uRaVI&66luz-6coMqH$tATKRL*LL-XV$oT#v^uA
z%$ZMhqn(OGuzJu9m`k-?ud}}EdY9GSHJ^34YZ<FUvds~S=YI!0oEog#<t at QgSYMW(
z3@*pI0~j8NAthxp-`6nleT)9`eVrp4V(oWh7GsXO0-gT{^wE2rz0lK(yM(MWgxeGA
z at 31bxx}DbnT}}+0?wYgO(u?gJ`w94c;1d+-xKBYQsI%{5INM$%GUn_yONMPfU-_&K
z{k at 2meun(_umeYw=-&q at b@9IjHSEIdK)y0$@_fujcJ%COi%R5B=mf<g2{4eVY!w$X
zSY;e#c}|2Jco;Ixqinfm4%#tI%Uq11UG^OKPqZFJ`$DHnD3|m at ld1%AWNifD3;VrE
zD-s5)7b)VIHpLtH&z!;Yn&1bV{HIFh+kdwXiga}GV`)VHUyOG#>yk_HkHizt<vt4z
zNyOhE_VSI%`y6aNPeO^ml>x_F&%CRI=t!tzZ?x at Y<h__Y|MlFp$Spo&)-ig;S at J(<
z at MgJG%~j#}Y0?g0ia_on)eda+T=<GE1*)wdOpc$OOq)Lso;NbTMRN>Iy|78?7ge%M
z-TRvhk|V<;U7B)xMEzju3N37TIz!A`AD_zZ(y at f}4A%K`CA0?H>F0DT1!CfEn02g9
z?9(_-{%cl#EoC@|SU&1D{M=1+A2pYrA(1}0o$%q%g^fgps6d{b0`bvWr+V1sBAjnq
zimH637Gb@=>Zz#`=QK-xRhd^R!7e8DLwpag&zFxXjT{yH6m`tE-67vb@{S4S(FE?1
zeNVEChjHAjLyo~cfpq%cCDLa}Y(pCK{XLdG*6s&9K5r$n)Kqt26#5C_hP(7P*lO};
z0HeHa>WX~nbPYT8!a;HzKKq+wALH;P?4MKBvEG~9KgZ5te9|SB0hC4ReE$W#O1gFh
zy9jNkpZKiTs(bRR2mS`W(aTrSe)?fY`P8a~Z{sG)YjrQevET3yh^%*<4#c=zh2!TK
zUP&42d*=MVam_ennV7?G<6X;f&P3itC7rs0Ex~+1eBT3;?_p=ILmyzSJ4BxG=XHd8
z56_1Wy~JX}*q$qLNVW||B3`tGN(x-hYcmf?q8~cTIelS}aC>o|rW<*!oqg^F_QEA6
z0wdZH_q2H=thrkfcD at Vo(!8UHzm|x46{lvF_ZFzsA}vd&*f+BRIdsQXSyjV+vdmPr
zJToKYs<~Ftky-BOzzis)wTjHy6(QYWrXTWy<&pWp1y?eudTp$qGE~W%M#TanbVgX(
zAL5?|{9Yrva9HyXWP2S&WOOC(Qm2h at ei3{SDuVb2&BW*N3qNZ_$3`5|b9cf0P$0fc
zFjg`@$lkT05Wd!*0=|p>fp(xT{OWWFekte~;LIoyNoT7$xlG(VV%$cOyxjtf(LZ#)
zBoeapbCt?|Ea0U!Yk7p9M?BfS@@V9nGdVF%zQZJMg{AIVH8?=HN4VvVs#OOa2OI{0
z`Z1Ls;vUUqD at S{EAxdC!!AAmrfCurJ08 at H3p7%+77Q?-?ejDBgzHP+EjC at A8h{(Jy
zi8-=fKFZQj$m!&D1oBqZ1J6_1d4sdRsaG{Vu-|j~>2mHf=gTG0Gg=igmX at 6}frHM2
zzW{Ar?bL<15H;{a6<)Qrg*-JSGwXWtSjK%)XLY{xxdS02CKHSI2=RFaG({xBhxj;&
zY4XYBNNoS$C~g11`+U!ajrz%TEm5R?I2E%`S_-_LKeY*Q2xrGV^6$hPfPeA?F!ZiT
z;?hQ=Iz+2gJ|i1ee(g9GVkEH%=A*tjEw#WZGJPp;K8UgDW$?*WfR}rNYY}4Mpi4-k
z&$Y615UUWER_6Li=4$qrURvA2c(p|af91ll)qRRjUVxu)@3E<~Yb*t$#*6p{CssgH
z;Fe$$mB~|gNdp=Kx0sQ~kC?eQ)^hmlwA`Q2$I562`PW2eaI%_fdQP+EEAs-{;E(WN
zNkTNMb(v+X946M2#DD_d0QD|){%1&Qb7 at Eoi6@)*-|q0Apnct51V7Nrk6hOGDSqyq
z7>`0t9a7}A<-#X;x`puVV2tvwc)6qVC0Af&M4vVz?&`s{;NG~3b_icL at CI%Yeh-`n
z_76F4E`iK8f^{)?IbPz(Fb^Igx^Cd6!_R_uhKy~pv87ZUOKrKx%)M&rBI8TJKSujM
zYBoru?*s4IXJ2IAXq8hlc?QOkZg9L*+Xun_l7{wxT*<67g*{iz?aurV5#4G0dmO~i
z(NlOGe!byR)#nP`%qp+X{BpvTnGSyA><DkEJUg-)eQlnond<cGy(|sR4X*Z+kn at Vt
z1?BukPJ|Onx;<P*^-=|*<`>5ty33~%H?^Ei+!Q%t1-vB77+yzDdBqD{lG4@^^u47m
z(veM(&s%Zdn9j$o at gB8)2ysviT9Q-VmwUGeF>Tj?W4Cbte9mNl9K1AA;CaT$p_}is
zR>jF1u6yu@)Ktx6tkRl>Z4&9fE{ubllw3#UHYpL$=0)W;Tt|DI=`L+jD(lc!Yn{J{
z;{~eAE{u73pUq08N06VL)Tngt5T(V*6dyk6Rydd2+Tc$~8isJ+98ooGd|Yx;=Pqry
z5$Du&m8}xRBxE%V;+zk2Y+6G+o|^;P=SAd6e9wz$I1--gSG`)A8IyD+?7TT4+tKHT
z?`dl&NjTr|l_c)&%*}NTTl%JxW3)Ez3A{^&|3k|UH1x$GM_Ur-JC!*H9|Z+YBk!Ow
z%~Njw*0^^J*TOEzZ1Y-&P1x3hk7tQ{$G_dFykKRx^sdGur$N75F6w_0F+A`kE%VOB
zShC<Z*jE~sO^#F1c<<ymal>->;;#yXd!E34Qk?Q`@nqewnR{Ow^YrfUYCp9(RDE%t
z{kwqz;SO#%v;LeH5xS!LD&u=E8`v-0kuQ6$RaNJLJn+mI_WP>GaO`vV+|w{`2KFfi
z|KPTcMUM*HwuR*>5fAG2 at ya@f0dwZV<XpZ~&^pmqz;|-l?c>oFw`~Kvg*y;qdSTVM
z&^F79H~RfDXTL*9S&}G)qde at _tbgWjmA7`OX$QET4Uz4XDe5YNy)_NK!D;9x5m)v?
zet``VdR8fuzx!fmABlnB<RI2OdTJlxr$HavD3Y?kne_;8a2bB7y&($pFN}fQ<LFxr
zHWS)9`tX>B<c9D%Y;%2g&_otp;x2?fguHWVJ@^K*rI*1WR0m%{vmiPvkn0=#&PNP>
z()5ax{5gkD at _p2ng=0&{rL5<?=V6;OG0qa~48k!9oG=^1(YFuJWGO2+0>lfjk!R&B
z%E%X1X_&D;cI0E&R0uD?D}-|o?--3-{b+Xulhd0<tq14RE%VVe*9Nm-|9l7WauM&{
zv(Hp~P>-D5=@l(}*P|_bU at 0sdn`Z9Ad-!9UGd7Lj%yW;>F}U|IbFX0XUaoy6_jiH;
z^_Op0#C*dF<{KXR^BdC0{nVGJhcu=h4o%d<p4TU^*8lSCMa;8TFwcJIe}DFdy8roX
z)XU7VrTAZ5?|Ims`scHetHSVb!6ud^h`NGzNGQL=7cM6}r7wkaHK&hiVhTnbG17=3
z;Ts{Lg&P916dqxVZ`$FH2rzfBo?jup^@blfXkZ7Umkuc_Tt9(b3q0sfwXn64W8g{Q
zz*miY$x8S>{+Dmv{l)+1TW2!g%4NQFD)X(ttEX2xA%@;}>V+!!e;wQf_!c4`W`gTE
z17ke$87+A(z)6~2j`c&}azX4faJ$8r=OG{XxOF;uMp at P5UX)?5$XLKInr(vo*?_o9
zP50L*s}O50?C at fd!TWiU9yzy;sP-nvxylRFm*)?_f8^<^oRs%Zh^{*IjKxs5AMAHt
zk4Wqsc4{9CLayvO%i at W)z;pNOcs(yTY@$t1RhLQ?>Lh8a8gg?!;-$3c$H+Mt<w15#
zo!pL~auM%#Q<Q<@;gku!E+>}?N!+e6j8)+MB)ZM$3>?=_9=|nt95KhED{)+Fxx-wq
z0w+`kmHV3p$Di?D55J0_6aFXYzB#N~k0v^h&7a(^hHs{}bJ(K}=)(<zudk4c-d-lN
zW}=SUET=AHIGrMVhNCpfD?y&LmX{mW-6a$05qG??>}%+*m18mFevE at ZQ+2TAXW-wQ
zG8<r1Ean}7Zq)(*Thmy~M4wew^4 at JJ7fI=2URX<MNQ>wr;Mi>?I-(@*U#~^gA&wH9
zqS)T`50j(x#iZU+(pNEWN0WZ*JpydNysT8}-K;a*<Fmz7DPl_U^3NkyrWhPjYRn%c
z=H;|b>cpy#f(?42|KIuew^Z=v^aPv2H6(_^9zfM7i}Ai3wu<C0;{EoJV@&Sx7?;N@
zv4~r=BF5(}`VhX3Er?N65?hXYIxtqm7{4Gh6I(I|+@%(ltpau|V5_o#&1c*a!cneR
zIdZNF{Af#7*7xdD+<*zQ->3#ZWhIe){c?=O*alC`gE$WRD;OtFN at Dv3yE-z9xxn{5
zwRzkFWBoS7r>CisN at n@w1+B37jTeU(Dq*u_;zd_Z*s_raIK4?5BEWhk at yXsHIg8IF
zmkt*v>xITuGUSc8?%o9c)%Bmv&FY=_Pov{e^I-Rf|7 at 9mmKs=|*Qwm$dzoJF!!u*I
z@)+khbY8+cYr=X(O9p>lB45Gx(7=8?E#xZZ#)Z&>xt62IEdswVJyVcM>wVYr=2Efn
zY50knL-QsvG!T0nUQW9+w%--78y~qK;Yk^OzPb%_ZA!?nBE$mK;oIj%`J4H~Kfhrf
z+GQ?Xi#Au<!(r9?%!e!@!26q6JGvToFI_GR+u8j&OW(cK94Hq&pMtUG4}ABF3I~0d
z9k|;|v0{l{WI?Rwge~a0La)~=E-eJFDDev-599l>*U*llIjs!8Yar*cNPzm;w2YeM
zpN+j!A5};6zLK{T at bhr5)39aG)6iaO=ojc2_~s1DGJ2-mE4a$nfP6M9a=thO%aAjN
z;)+_>$d#qImrD_cJHQ*W9)vAK2+oIxLVtw)+jsO1e7iZkJ60`oeh50>=;Ro3vhzCH
z)#SVeKShK&Z9;b`nWf;<nvkooxA~*3QiydU`1ZcgRZWN~cu?PM6S3Y8>f5pceFpqn
z-RZ#MlZdV%K3{FFbEzlzwicmF74TXN;L#GjojpW5)suOF at d-sw+N1Y!e=y__u5H-e
z4kqN<e~V}0Anp4&x#c$gK8&x2G>~T*A3|wD9dZe!jYKvkJ_X%m`G{$>l}#Q4R{vkN
zYngk2XWKbKVmj_0vj4KPl;E(zel2X$axgaePNN&0+J at FSood`9iGE~^I|h9<U)0NO
zXwsVdUFx~tBR}O8#txAUpZJdnm(Nv+YF*TGRK{*|hD$x~h^CbzhP~-dDas|X4QyW>
z<}$9EsD<%MjD?#bBT3tYjNe2*_-_7RzT1?LYd+$hY1>8G$CLNX2QB?BRc-~qLYjED
zgYj8tC()1Sn0HgsedOIH-;3#|9AG7P?{BFgaSGjh_~J{Ow20kb8lOw%iolJ7XUcQA
z-)R_(o&U8i@`n!kzCmnOPQ?GT=^5naFwa0;|F8F?PuvqxFj%}oTrTD-IgsavawIV~
z&42z&Vk1F+^IbCe4-SV)-hY;5$2`IOhxdxVtKFq*0XH`6>sy-%j!q$DsKewPo_`Yh
zu at Y@iM8+IN4Qw8$Upfu{PaP#}A~{OGa=+)KMWr at sx}@|OUI*}#4+n1Yoq~R+!h6IX
ze4CW>(M58<tr~3v^DNWWs!``hiNEP=>csd!<`3VW5SKx&ze2`n`+L6Oh#9RL8gx1Y
zoDM14&VcQQo%+d`sQL+?4Y9*utPI3>I7CZbOo;o1zaZOFwY&uSaF&R~1Vz=EfB6P>
zN%#OFEMmGA_J1Y+*Awd?Q^@BgH<d at ol;Ey$1e0?;^I3IHr?Yx7$CX&p;J20#p8{<N
z?diN5B_-Rz`r$m)t$blaMyQy+rI6B3 at J1&3<hm<}=f2Dmccld*h9@}pOXN&+6)TfH
zB*C`d5PQac#%AQXOul~&#_Nu;)yY)`*tN4NxbD_>y`=^l6=49Eg-gZcxHd%mQWO1!
z at xL{5>YLIR)sg?cRz0)GT$wMtQXXH!*rjY1Ege9?SL{8~q|Fz`9avPjR^0%*A@^yU
zlGLyJgLVtu7BLFbs6t>UtBCEA4xF1q#)!^T$Z_BUwY|bAL4Dl`&iq3xHiaOUkHnL$
zs0OC;#l`SvFXU5NqXcupDddy8a$8{SFEz?imf1(XEHvh&EWui3o1d~2>mtl8w~2oX
zI45#VKAGPWBp7ETLq`$sRu3GlXzwfZYT$o^%hLAB<|CNntk}-AAucXZ{p|?aj`Xo}
z$fYjhk+IPk`1u+1L0&7iS9aPU^VgI3xv099eY~r*5PpRDB%TW227FL(%*t3T=+_ZF
zjkdXvn{Fch2>2`b4yDNE>jV52<or>86P3ob+n+!gRVt}J;qz-22-DK3%ZND#_dLeN
z8pQR#@7+VMPPqyn)-Q-zd)k%<PQ(0^8^(p;k~din5E&9aP+?<Q@|Ccom&Bq<_I^<|
z)rPwK6mvJ-5=DH##BS|W4;g&ll;b3RhuE?=V;=g%5E${pYWoRr+CMiLH)o_Wj72Fw
zGd%PMfl*os{M)_WyfICD)?L`*Ab)j1w$CS6vqPy*<>5IAkj?3)MiTD_-K#gMmUg%w
zrUQLvAvS(@k&x&`&<B7cG2sJ)Z%z%F<~mzq+lsh|HuoQ3^NwJNqZEc8c2?S+n{0#E
zfF%l_CE~M5Y*Q`TO-{upWbCIRnu$&N2;_}a#Ip&gAMp+iu;JbbzH&w^F8H(Ez-HII
zkER*F<vx*qyIwSKuAg-lz5 at fW?GT3uAKjgHLl0u{pkM0AIQ-NQi9N)3te+SM-S^pc
z;ad?KRlWqVZ&_DqdNuD5+6eilGL{p3NBvmOMcY7`P1kt0c at 9g5X59kVn#UXL(|sQ%
z?P#%|w?Fh0|1tGWIdaZBrj_pO47=O5yK at +E`FFV+5mS&W;`^#lk9!#%2R8D_F<t-P
zWBT>qk at wg!vl8=~sXH$;ZTzVHmkEqf*qs=hV?#0O60uuhH-9AYg{7z;*>E~!Fd_a$
z9ci=Bo%K#9aIX&e4~Rd&*e!=$pWwWep$(ZX=ak#|`=%F7)HUK%CH6S at qD|ZN)`Q$5
zf$MiznZ7anpgdQT^&Qfth at 9=KY69*Y^33MZj(B1-+;(XtX=}a)_~-cc6TDGiHq2<e
zx-iE+i!#u5$f*X(VBZT_qPm+u_9W{1N!Zs{f8Aqz>aYLWy%GP~-`G7j-DsIxQ0 at +!
z7W`!zF}t`NxCtEOW_9c#@4!CHw1Z#Y5nCExYgB4fLd2)m^)@8;4`~puh&BMfOeyha
zFC4P`#Q47(Qhp-xSm_+6Q^szr7m at iKby9#bH52pM&{5wv$XG|i27gJ6cSOt^=C>on
z&!{mG3<1&~@DF!S^atoAXd|ef2ByB<#;#Kl<;798LhUNKD9{giZ`(^B_=ap{z6SdV
z-xH0Em}^#`zk$!&zL!cWe>CC>e62;~I&wYh5G9?^cYMAf^Yv^ksaNvNh&kJacx8;?
zVMos?kl*&ogL|5^0;!K0xbv_xGym6yzRCD5+-qnp({H-%ajxYkPddAN&4NK&azA{$
ziwEs~h{tuWvX*0xFIgcL?gMW*d{;wa-|(Spm=_V3z<L~5_a&C6tR;|N52eh*`{gNj
zJSsEBc$s;*7C9?}lAb6 at k&k-9#<#_z#8!^+tjS%f5u?pvoNcfpE~RFmtSA-ZfriQ@
z*LU)vi$kw+X_Ca=??>CHWO(Ev$ADkW%oov+D|MvryPFUTa|p+F8>1|BF2}yE7=6iW
z7<snR$E#C}6_)8jDUG=mIj=5FUJd3_tdDtKJ_CQ~1YYES-hqjyn*#rT4AnlgFRIS=
z3g+}T2|mh8M(8xhkw>>3HYg!$Z%EgggO)dp5=rc!E0u)#;w at 20yaYblp;A=}c%Y~>
zBVwuPqlnGKT+f+iQQOjX9ayNQUL)6F{SD4b_td3mIqLT+j5*k at Nzr3F(<o1IS2kik
zQ&Yi4`C18%6&a-|9+Su3w7Xaiu?*Z6U?r%Os}#uR+2B_5F#Z9-v_8Nb-#>9Y<{vEN
zSK>Ow<h at DQPshG+az7FKnJAycyQbnee>e+eRC}e>uzaU08}UvC-|6{!tl>Ln)nTpm
z{R!8T{816E-)kQ^C#Ao_xhC9q+ at lc3vPbJ;R^ogewzKTZ6w+yWf~Revar|W*ug7*R
zbKjd2bz at gr#E?C1VXjQ$9Ev(D5}5f}*_<L4zpDcH20}q4%5wH<#+>)^P~}Bn7){KL
zsb5e(iduN{Le+gtu4z{Ft}?{)N~?;%iw=7nU5CC?i1ktK6k6%7BED(+6Ue<PcW;6$
zXTp3_NaQ-;9F=5MP=yBDP8peR?68ME%l~t}S&x`%;0VFLcgB*DB_cA+s at qvaU#fB~
zB=QRKOSGM-K5mHLcLP4hb(Wrj{R7;U^~sfChSO)h9YWo}cfzVt)J at aF2Y8ZxA<Goj
zq4ZNpF&@c#^9ddfcaD8DrEk=j(r<rxyU5s{vShd>#eH;i!+g_h3$P_ohQUK=oafbS
znu~qrU;Fw6o8A%c-h^{yIPQw$6VDN{_2<&*H+h$!Gs5PeGZLL~=-~EBW}o+PmX&67
z!aPmBdx%x<9*X*iB(f=qZxQuMVt-x_c@^?<<Kw{m-t_Vy4Sw0cP4R7pABdc|vvN{?
zthGHyWW#6NfN>UKT?ej at 7=k~+0}du7g<O|cv5i~tr|u1T`sa0=0 at iKhA&qHcu-+GR
z$MYlDI7NY*!m34quz$R|a{w~-1Nr)({b5o*#<Upkv8?InlVT#Dp--kbowENJHHv<>
zo%K8=b=gYg at es$uYNzC|r*P>?X#jXTm5jZ3Ply=Tt+z%p^2%}LG2H){NK6~Cc2n%2
zP5hK35{tJ5_mpg|Ml3w${^z!5Eya5MziPA8mK^$}&7GJZu*Q8FR~30ycE4*b*5d2|
zjy(Gs=DRXU+?ILp=fFq7Y`ZFGmMQ$mEsdXyU&-d*68eexZ at -mbHHjRoO^S?hbx03$
zot42IR|RgYeuS at kD{}J|DmHlUEotX4bxi4tu`dX74NX}BH$6)eUCzG5a+)=Wyp5W_
z6_EX`rPMKE6TAQ1pXHq4Xo00t3cHG)qq<N|=3=Uym4`V4cm?-f!1$NVX at ZXO@Sp$2
zh<}q2HP75g^t7%PRw--=XQKS=ebaWbOo(kd+WpmqH!P=Jg5 at Vi)=WMRcEY<FioAC=
zbiPXDE0l(*@78-&)EKjS*L2?0tl0gY+9DPhxLd79-F4`1xkE$fZ-G1eD`k^%-A^H(
zFmfI6Y2eHIa%eC6U!l`1u|qZ6^^^ah9&%7Vr<8h_bA at _@Gn1Oe37}>Zxd`oLEp&(o
zVw-1TEpKDqsHUd)WKh7)f9`P_{H=5V;*!)J|0cRf<bg%|*Qzt2i;()@U15o-DXe~i
z at BK{Cf9opaB>n+9;M0AO;ay<s&tOfZra(TcMY$gYO;hBP`z{(V$EWeyNjdm8Uz2&(
zAVyyA?CqtKdhTgav)~F#Lu?z+X^J7cHUk&R;a&{;@~oE1ztqF8yirmQxGsr_muu!|
zvU at kX1#5@%?L8^RV6-<gP1?cuA at E_x-iItf(<x8meHI(@`O>8Nlq%Q^a_Chd3Uh_i
zDPp_5zmgga(sRHskNi@{*Hw7OX=oEHW&a|vJ(slQciY2Ude&GM!|oaA-2~Y%$yUab
zU<^=%WLc!P0@#HN$bryd+^g8-0e;+%XdSpN$}onVA$ADr@{oqx0Ga%izt{&3|HZyi
z0Q<^*Tl-v at Er1P-c)oCEDX$T-UFv^qJl^xrH?Na99UO;;NiH;Je)51Y6`Zu%gc_cS
zCtXu*xr=%CE at a7C#Goh}wOxm3=rG7fO0O*JIs=>;=|YbO at hNz>3g}z=ur^{XA+odO
zHtaiBQ4h7YbBM`xU at Sfj6=oer*`%fWS^p;3^YOXXGK`~F7S=RrsqG~8Y(WVnYHGaL
z4?YX%0Nir4g?xL!t_sXC;;Q}skFGC|YwFCxZgr$WYOF%tqO}M}g)WJdI<~b7j$<ul
zECpP+Vp{2nwM<*79g#|au;i*Cfq)po5=c-&P{QVhsJK*8>q-=&F#(af))Wwn+J4Wu
z!L~Es_x-`|hUDhvz3+XObDr~@=U|ViSYOR?p324TVM at eua^CBbPZK?8sY<+zyqwDe
zkBDAmpDtDf%7u@^A3BA6n_2SIuX_d_iI;J8${!IUcMw>|X8&0OUDI`rEX3iH;d34n
z?0|;B7FJ7nDwFeADL)Uj-P+_m at GlPHxohBKdW#+)w<iOBOobr_`EHcgloOvL?<r8t
zuRNN^v%}W3gVP_vt(}+H714FgA!B9YQbuat2b at czj2)OO8o+-1v*QKfcHC1sY~^h@
zX5hJAfVR;d!x?!!n=-Kq{HOY|GydYjb(4W3`-?5N#Jj*hR54oXQR8Ls56jk{1^+8|
zdx_AGEtib)Fu-oT%>2Uoi5~P;`HP)O;cw=Da_v6D9 at ezMuRS;HWAqbhA;DMGG^L?d
zz!`9+Qog<{&qDuv>fbnImy!?hn>ksu40V3h*rPO#Likph at WG7?YS<x%w{qoKa1Jz%
zQ1Jyk-~O=9(|r;4HkG5*Qz_5<x`(^2iJpajqx|Z09ciIEuDBf%Tx1j>k^cRmDfbE;
zvk*5dhep*B;b{3a^l_(H5sLeB*$a3!|9|Z354`MA;APHip96p3Wu2r!n0Ss|F=t2T
zMz+2$VveOVYo6fdl^_kH?MUOeV=2O7TdHK^qvhVsy(%WbwokJ0v2x%?JKRp%kPqb6
zK-wAL{G?d#!MC^Lco#>9ybHM^;?c42r{a1P;smnSJ+`8bb17mGfAs^PS7CTs{GV{y
zDGB!Ei+En~(1t{x0$)Clm?qY%<}`6Go<V(C_A10A;FBg3*NRDi?ur5UL^Jg>^$D#>
zW*xBQOxV6WzZQFrRmN6|`!O~&#7jkN{H**sGtSXUW0}@u!bzcpf7(|8-gYuK_qIaE
z5cU}GROHfN?X+uj7z^bo0pceet<Y6XrOzaq33~4w`+E50=m(6+y)Inqy_Vt<!a~Gk
z>)|tT0enp4D?)>)9I>?n;6-Y=v7U!mR21e=Db}+g{N|Jw?pgKd3}}hKK7<CDH;2Kv
za=`i=GZ$#=0eJqeapS6pupJ&B*be3dY3ssvJS{)y8n=($z_`_kYs*e1UdFvEFfYap
zq=JLZiqG!p8oHmCAD)XoZUxps>nCC0R8xp_+=u(a?-whE+9G<`7PQL`_`wzy^>eUa
zSIU3p#&ds!{gf5sIZrP8`pUr5iI(u)XVe2_;vKHv{OdXXUQTdq(4HpXEx(y}L#M0|
zad4gZ>|fiD`aT76!`IslYH=OSoia7G3v0y+u5G#UEcD-B?ng50;r)n++qxOHKsGR+
zy=A9};~+kd+;fFJM||#&`{&d1#Am>HXdHyZ1m&{_J&V8#Mg0MK?#wvMzigcIBG!`^
z>AY~+AufLm`-uV9%eKEM?hlup&ly@*XLH|k&~<^CpIocAWBd;7v1Kj{7SDcodp-MO
zf>*({gz at ev%oUyYf{VK8c<)%k6L`<l-Nf|hx)(Ire?uRYh^}G}{>{9p{RnaPc*lnq
z0{`j3c<VYt+~6ip4sW)9;H_{JGPQfke4q_LWBiZ)o`+|$SuP)1V>+?MJe^pM{%nIj
zjtczOyn8<0+4eH<IVeYXoVXu3E0&=-GH#$O9+-I8z1AkorzK&%t-FMGF=jV7ONRQW
zi~F6d2>XR*`W<Jo>vyuWUtexcYmyqYt7=i7vKXAST&G0b?|NR`{PO}Qkoc16yeX5A
zvCH}7-MohQ9L)yUyMaknH!D at 2@cffrxOojnADp)|Z0Y`TbvaKT#>`V#f7aX|o84cJ
zIA5vNf%VtNehl9`lVsd<P(FfJhBamzVp3&f8~?*Aw1UYC9mnJtJHo8Q0ff#QwDy^N
z!ccP0Bc at fVeuP(!nq3CW(=E&EY<koJ%UfRWEEgGw*KAbt72LVMi5{{4PM84B(<g1W
z5&jnWj~^VLVvR4y`+G5t%f*(5<M<IhxBt}wugH at dNzbSwlWOnuD1j+t`xM*uB$kV{
z9bE2;JVhC6lhCv2z<RMHZu@!8u74KxV~%q!U*UXfXrG)*z6&ssH^ApS2pfSg4F&qI
zWU<4Ev1{BVP#SlKDO&VN8yvIvc~nEg)#jv4W?j-o at Ddcpog%TV6g4GCU*iAM?v_&T
zddwa2D_1*Z*gv&NH?fB1$`2;pz%gIm11!uN&#*PRttBhT2<$J at sHQ%kScN$o(a-|m
zEN;BYBx6f;(v5>#iI;p9`8>+lOQWD|Vc<)hWvdD;y-7FWzgTg+f#VV6ouF2RGInb}
zQ#=qWs2#|l`APXS=))3!Avgk3R!i%KcY&i2_EV?mk%CH*nC70-IkdJ-qB-cPbZ(^a
zSRidQVB9}Ov1V`|RtR(pP4`q7$1F5KHoJV4m1p7KU2tv}88Gj2xaYS&^&EdW`ly0?
zhK0_pWWzK8oBFyOG0Fsru~aHVuMEX1PyIQ+VW$ok$Xx3R`9b1-;LjJF8-#luq&ehG
zYm4ZC>-)l=*^r_5V$YB-ufuu+eGRNxQ4f5Cdq<nB74{s_F3PbWp2wapEAk*kRp5g6
zvcBNXa at -*<t|=v4z18S_RFKk<ydY(C(J}ZFmkg`wo!QgaKlc2T#PPs$o5s|Oc2&hu
z`@rG(=^-u$`_v>aYOO9%i4DNufFJ%+#?Q8Y=&g7D<km2BucsY9V}C=e1(;$Rr+Kmh
zden`iV-k_0(Q-M%#iZTfUb%iN@;4O}A05Zl_~icw8Z|qMWb3b5lHt2Yk>8(?!0O}@
zHU_#;-}4h;$J8V4rIMNAbIs-6M;*VK>t&6rkPF5*<(*ckOs<TxEP>4rKVA0$*)ura
zz}oc`u;8E8#n9XcKYhIVW>k<myo1v#_;}t)>w at sp=jGuYCrH1*z1LUL?R7olV>TrS
z+>Imj-mPAn<YplG*L{+k&(JZ*=Zc{uD(7Yi)}J+mSyCV2*})#NYeWN%rK at DHw@1Lv
zZIf4u_6&TQn9rEXKfEcKS%_TLyxu$D8<fn+2lvJ2A-3sS at 5W|hJfvXVdL8o*IHEH4
zywqo_p+uq at SL##s at Z8=#xKCf)C-RJRH|abE3`sFCh;Kr`H#pgwo`}4R!+E_aL(fh@
z+yNo#vr+Dm+kK7`VWsbl&3A4jKk=LA$)?i5KMRR at Y)!8|F+W^;fbPBb;ct?EDc+{a
z;Qj7;{)CUxclsytkDz at Tx88^2gl`+-3Y;cfH=u{!kFO=nmy5M+cg5OV_vi9q<<pdL
z-6P{`7ieGMVsY0Ii*qcMXaaS>k_CiU&B8iPzOak;)3cPn0sT)o6o18&(H=VYwM7O6
z_ZjkEfRA(ca%no*{pOnZdTDalg`3Gius_ykWBe65HwyPIG+9sCb5@=OUm$V72lETQ
zjJwtfEUAOTlFoe<UC+e~420EUTq)g9%ZGmvSlLMzR+iY~=*Bo!CH-s^_$ZB&{0?SL
zTQS>sDQSlNZ)#}@@I&K7;9KrV*Nl_7I9C#Iw`SzPNLamFBjU9Mq!X?uJ?nC&Py_AS
zig(es2VJ&;<MAO(FWt2c-1p%Zb6CV?@52^}cf9Ql at fuqwhh3e74V3F}R}JvSaCHda
z&j>%}_P<w|y|jLX#B9g at MEIWYQKwO4XfA0l=dHuK0h^ZB)n0_Uu_>8Puh`@Gl=AzK
z(^f003e9=@OT3 at q2n~BDRJ&3G9#J9I`OO8bYAIs?pJ*%gfGS)kX~ph>eWJ(3IgxQg
z=M@#~Tkrtq7r?*Lz+TJ%Z!8K&<nVSx+UK<A^5%+OE~pg#8`oFk{ghf3erfdrDPGI*
zo`zT3UZ`n84$O4;le^HKavb;JsKc=t-~SKJH^%OQ-zP0Fi6+!$;eCl(8ff6IvBSO0
znuNC2kblVS19v#PWFW$RF^03*cZl<v4Bnfe0f7Bgjs4ZCV8PSzkaIDsT at TlD$K!us
zdV5{#IbnUU**+m(kNSK{HJ)P?;`$bv7vCniuwnR)d+jOW{!E|PU5;7mdTN(L9lH<h
zQ52ZSZxc at 8X`|=a>#Qo-*IXW4j{LgIUVTK!?Js%Gs;~95C;X)i&HvSgM-cmUwV^|n
zA~;XF3Gkcu%CFG#-a2};gh_VRCLTqfsu&~M+OuT*4mqA%g*w+ at 5Qz&;$LdILXh#nE
zQolfI51{w)`8Hv0!D;mI+jzYlpXso#mwUIlY}&;&gcV@#Ed(xG0emkfL_B^gxIx+f
z(^k`ewe@}fdeYmHugJf{{&inS5fo$Xt20wPBx`*E>Uqm8$y8?n`@%4Pn>+=vj4{mW
zO`X8nIX(i`zdhh1AQk~W0=VXa54I~2*W13n)cz0rzcX;k9=kYO-g)9>wnVfCI*awT
zH?bGI at 4uY5iVk<gsY}I+d#h+2U=mz&LXhw1My{V$(&SMgUW)ba!4F}mEfF;5T$j;$
zN4EV*HKzf*A93wU!tNPQN50z`+nqU<F1=Od5h3`x`6Kxq5ABne44WmY$F2iE*Pc5A
zEJVSknnmnRM!B#7xYRMhF6R#5F?uG&F$?2uw at A$TGD_4oJLT%z at Cv~w)G{F7%P5&M
zq4eo9sC|y_E8`L(INTn-2CkWsShYZ#Q&^@3w?WU;VXO|torM!B3x?K=O|CTq*h3U>
zF0$ENT-Mm)G#=SXa>Aj3DMeA<4Xv at TEn{ZJ%s{PF`A>*l<VMsxYdGxa5wtareNiOF
zbI75#KD1>YduM1I)RG-kpb9m(?4Zh1-<1y81?M%)LmXVN-{oKbVYfvBH>wBjIXbYE
zc^v$eF at OFx{PkBbpUWZ|fnAN#T=PDFF`O at lZOaCm)A8AE#NJ7F$pFj;*b(^;c&@v}
zeP!Wv4%O^|*1 at tM<Oef6mmePUWIt*~u&)Xu*~<&_*+925e`#k&XdZlKiqjhqizi#_
z&;H7w{=%3^uoZFGeZ3iYe4vFHDeJ^uI-BejVeO1Y)b4Wi+iGV%*~Vyp34M;|{2H{M
zU?<y`&^$tH!y7iF%MVDWep`rs!<Zn<n+d$axS#lJdLG+tEoEoFQ;%zJ_)9wv{n?-X
zxyHCauf-8eTi3R3tN6XHb0bQo<^<oD`vu)ztZL`ti_q<rAU;`&+R*7-4AKjBmvnTw
zMCz`WY at ASzv5Wi-<ehN5HpJU^2XByn6qMQqyQM>iST%8uR<p^>X~KQYjo=6 at A<n=M
zuA+ziZ?e7$oI8VX?dCLS!=}K$8|I2F^HMrCA8>IT5cftL^qS8WE=~#Gk3I{Rbtowg
zCEtKH>cxl?_=;VhCs~Y73+EbplAyB!O^@z%IiWjjiYjeVZfHq|Lb?mjc5YC*v_0cP
zc5cuXCRO(w#iZW8Haowwl9l#Pq8#>_9Cy at da^o2TlVU<s-%}7CWt@>D9(rvzzL2zZ
z==ELWvq>EsC&hwi-x2^Gv3Cu3&#J)OUJWpw4ahkvN6zYT<gA`;e+jv(ZoD?1Hd^z4
zMqML3*RvtwC#Ik;fK$2EVSU^LzkCq-|7sk&P~)Z;$IJ6k?*Yfo`F9xbz?E at VM{)d-
z9Onk_Q^+fX-3xvre%}=bx0G<XV!#YqGDr*ke}5nAnrM0+<<#xJ3OwLAa%QV=Jd2#!
ztvH^^-yd3zV_W_KXiQ*Fn0?b$&hf(bID6b09@==&gq9+1F21=xaa^Y!@p?y45oc#8
zyiZyri2pZH{2zI*rgJ&4`*+iKVOK#1YgOxApD?e5%FA)r_s`7fzY{Mj{>kmQP3M=d
zDf2tk+yvg&omDcb>uebWuCm|i$2M4l*+$N9TSMFf=p0<f-u3yOQt(*5wBET_dTAW5
z;?g3X-tAOq&sU1jCw|WDJ*+NaYt-lFfS-zeXcyZp90~0GvCs at AeW3}zogAcGh}x~G
z;0%My>%~e at mrBn(2|P^1_Ras<X=fGeePB~tfx$M2&v6{6I_{j~z+w?+#hQ8s$2~Zn
z#5p at rk4Defx${!+-MjQ1%;g7|%lFm6e0_l`XIp`^c$-}46*D#uv7bEPox2t^UaHxY
zg1tzu8R0${vA6ho at d#+RjHp)m<gnj^3)KmZjBzM_)W0Ndp>n;7eIEC;jrgxjyRDYX
z6OF=}rC~R at 9q6rAmtlRJf;eIkxO1jo%c#z^@0oi(L;fMI!G8ZjF2xxg!)G8K^n1s^
z8-L+?RHIfxV}I}R_xf`_4-!ZzcQ8WRo*>j_sP<g%R)4x2IW=0l>Kt%}UXPy58t`LA
zZR}RBdYhH5KF`*#{(G^`1G at 0P{3>}cvO=r~F5me at aMj*jjHzNC>Uqszlw}UqR~#Io
zZTJBBnOVDisNTcgUCv*GJHQ*Ng{@;kzEk1gtmmF`boxIc??lYt2x8y|P$yL{?jw!T
zfmwphgi|{<DPuLCqwhFv4;R0OxVFTXIH+g)d3?kY4q8zMY$(4>OT3z~3cTkIOrf9W
z_CNV&+%-klTab^hDHH(Hz&PFweJri at H8bo65BQ81{w?@~_$1tC4amtr9vd)pw9D1T
zjqd{=xJ+94_jWkk;M?MJ=(|e;@8|cM%dMy_-JSY*5PO){)XlDXIx2T~wr`w3>6^gI
zX6ihZOzs)ftpDG>>>clVkB3-2`gR4+<hdC&H1lzNh2?H>y-#MbZsKle-FJfjMzsW7
zeU%TJV?4D5`V}I~y(d-nIgRimy9aI+cYA1~>t|gId3IL&Pb%0E*CKM3Cd|4xw_aHG
zn2PHDMGmuX;hyoE{W+1ZGH<suFf!yT#P;GCyf-ZY^+aOtiv)`1rUki8O=utVD(D#o
zSMB_aP2<`bd;jJBmdIDfZ3?bx5-}$IaVEw86r+4v#0H`m(PGIc_e^{*nU(UM_C9P!
z{q<G$hp+vYy2jmk6*um#xpKrtrqH;H8$s_mf1&T%^A at MLox}A}-wpna-Jf(?3;hml
z`e at enuw~(u7i+^?&ntot?fin)%|0J!;8)Q72(T8348a?kkkh^L?C>0GZbn&`Zgi#f
zEU#&9jG&7_UE6!Ha?}-o&V&Zo$mG9{Lp)>GI1IcbWw$0+@~+ at nCbQ6xJOdr1mPWP=
zdYMhw`I?5Wvb^d#C%7<qV+MHJIWw$vj}0!a^GvbkhVQ-?@4}LpHG at 9hZL9>>uz^bl
z&KlwrZR1VWo$_l~2kl8!#tu%`uMe1zl*T^z&sk<Yo9D65?IiHPP2B5U(4d)yy@<wf
zmQ}^OD!{&i`+ggk?|E at Q>+KpFsjbYJV!a!5V>+^c0soA=0tISmxx?nU6JZhux%2_x
z*X+Vxu0@{wc_ym(7GgE~L={+5erE7{_+Q%h8g%+GzTK5p6T1SO5!u40GRpk2G(oSl
zbyh<cgTo#dehRG+#7xkR|M2siC6vF0Jk~n at Vp_{XA{Ty(&$l#Rme&Pp$0!LCVKtcZ
z{S<4(cVhjgqK|+di*teRP7E#&*v58K`~r4`O}Www^)Bc=@CQsGks)I&y%f(-#wr6u
zc>W!v355DMn5W>a5$_T83aaI?f}G|R8}IO at 72FxWjdU*&3-Ix;fFBh3tB+4r%bxz)
z!GlbHM5;A6I4z(*xGJD6ctgP9pqg{4pjw#tHH%e2rgNH%7Ku?1g&dkENVl8XMf*M4
zgq&*B0zhsk;-U5Mg?0f`FMV#(eSc9KX#)T^r}O(^WBXG~AM5k<mhJsHg9lSpyb^rx
z;FM<Kuenp4He(9-Xg(RJNiiIGh(TVT&R*74qt5o!BHv~sZ1HXJ^<vXfRV#3;z8~V1
ztB`Blq=UxrLb_hl(Dkqmak)Ok-NSRN4e+w`1mw0>Qy)^D!}uJ#oZ~D~?#>3nLNKNz
z=5pA{Y4EXXIE}z~d0JSinX?7N7R1L%Q)y?>PQo{UC!kIOr+a`HJl9`)0}iv`*7WsJ
zI}oSWL+d`qcPixwn|CC7iBs>X4xsJfrUQl0;x2?vc4ko;t)~<thE5o1{T_>dk_{Q3
z)5~f2fxErH8thR84o2il@!+X|%WR!4+b*gipJ3LBe-AsZ1NL4)d0OzdS6Dls^P8i4
zLVa#!rO4Z_{L=-Qfgk5NLJE!^-KN%0(}%s&w{d7+9b6J;>12^lNwI%%euy|QmiX|!
z-yxSwCoBeUC2r*svf2N>5Aj%yW9*8&1*Y*ut<YT7Jt5JItj>QabSr+lQuJ1MWjAyY
z-;&yPh*kHVJ~oNIyZVqI&soaPcdUQtXNvaB8)KDnx&V68t-Xi3O3)Cmxdh#x0#%}c
zUtr%LP)Lz)9GE8D)1q^|zn=8bN{XetE3m!q;kugzMbOOuAC3Iw0RszMIt|CS#Mh#4
zOQ7%bqP$YM^0=m0+85KV=bZwlU`IacL<l<;{Bo(LVEF8px at z<5%qEHzyp at ccz3heB
zQzM`o{)hg9%`kgbrzyXjXFS$`@8_|#;2Zo%b{_o6(heENQPKJbBRBkFYd7TqMfb@|
zMK8*(FyD|ir!3{6Hs_>O(B at qIr#9!LkH8gJ4Q);dr_Gt=cJ5Gxrh8aR>XqcXCmdKy
zk9btY7fN}srK*eTua}AY-5pjZbUHsBOe4GyJf>~MD&$)?vzNtvln;RRNa?pZ{m!|h
z-wB>l#-w_KW1e7f#JO8t&57ZvS2I3*tUYKW^gFgN5#_OqqZW5|)y{6{G-4gA%J^tx
zXizcMvQx#P*=La}2VaNy3*LnNBQIC<F|-P<nNjmi_KT;~A%uocIbQdQ1f-Yf_=+ at r
z at c(VH>)_W+BRfE%!I}qKK-57s;B?A_%b_N9VZrW%9-Tte0j>NfT^=;}8xv5!7h}H@
zZB84 at 8n1wt5HcpqIBiU}(PvDa@#%><n8PD at sFQ1}NE&xw$t1Nc`b-`VT#}1#MI_8W
z;`_zTH-d7&Q3KB(^{&BB8(5LJSoK=QhcAkQat!{n2RcjVoa!nWyX%kskp9shjsMjj
zyU-td+I8rU4`qvkB+x57#`Onj<Y&&Q>DrDXi=zR1%_eY8xqhNP@|Mz?UHLxkLzmE>
zvz1+?RC_zI;--G)XO-}U?N82Dc19(Z;QtQ{Cy}=Ytb!-QHMZf%BEGM~aTCS)(f(oH
z(t%;<5A`I(h57kTW#XcRoodxp at 0l{g^x5M(_u-y)&hG2njb~MdHp!rG(J<6D6W7+p
zu4)`Np{<o at YZf&3kwfi-&rZG`n?m(~#22Bjn%`OCec13tV$s#onegEmofv#L^LDF>
z&56prsSncNJ^f8nkmBlov8t=YJD-=r>;=!E0LNx<mNhu;!v6{!_Z=wlmLd*YAWmVV
z2Ml<QrIPxQ6=CLs^t*%?bSAaQyX1#io%+z!>IDs<x0fpl&BfBuWgg(TUurwun3QX7
zELM#!8(zTe=kl=HmhBv`Z>MI1AjhV|XPv_pjx2BFabkb?w7<*iGjY`X159yf>F+Aa
zX>4)DOa9Ck?u at R-*v)6(U>1RAl5f+86<}@7)hYQ(O<&kWxn3<Dy({53SHDvqtqzHN
zI~yD at 1!~jkz^BO{`p!1)J2`x1;p%r*$*-s{kKeWW!>S12ZO{Z!FUs!@#d?n#=TQU5
zC-!J$qB=^=QjbQ$LIlZVPq$Q1%u=l~SHbrfUZ7fEi8xWE$gh`b-VCNnH!TC75juC7
zF)o`$@;q#=%T!YUHpxNMZVFj49`#{sWJlfF5r-{e4lq{cO~%G}GwsZm3}f4knz&n0
z2lzMk8}<-8jy=NulfBE|jPriSc at CV{gYzDQdz_-!MQ5mfjY?g%M(0onvO=^<(M>(m
z-+5<!cWBC`Ld{HdTWa4sY0&YsDV}+GpzGQj1%;{K=!Wnr%8P2V5%*Rcw#U4C==r1x
z(!)JEGQcwhFLohxc9?A~I+32uQbV7O$+cx1Lp^4GgS|vh_>(zE2 at b?w_Np>&{VV(p
zz$R5w^%Bja`o*~wO4UoeO35f6qvScy?cOOigJh0}K{ATbNuHZsfxYs^8r^@Nzh3uK
zN>JWJkyRBw>2yx`%jXpII<)FK?(bL*YB%gdyh1(^7$nA&l$UKz;c3_FkZXkf#;oLN
zUp>`XDw*@B6!&4W>bENwUMMaL%XLp<R3XczZUXMd>At8D#~EGzYHgQcc`b6px%blE
z1D8G;eyEhW1TAG9%TumAco_AzLj3#v{&r|NJGbA*>r-g_f;SLaIv>}<SUqaJ5L!CG
zja74Jd_DH7tsDll8NOOoe;M={8Z_7D=(@JS4n2Ui=+K+XHUCkS at G6iCbVv-H1?vI%
z!LGv at +OAU>+Q)LpCgU#=2Lr==v9d(cHo87>QMmGw#Ly-Gh%K49Mf&ud at txIC12^~2
zEY#c at t2|cz6y;$d_t348)3lvL`}|1WK!|6KUmf&hcVAH3pvT~W^*nI9XAU%5EUtZk
z_JsAS#qXU}byace`eAc5 at eTyYzp{Rc9A72bxirs7x5Y{Mnq^6a#sE=^eXQs(yFwt{
zQ${>v-?v+!Enfti-;(O7Y)(V0wUYP_i2p)U-dKrPya5~{<eT3K1zy<<E|Ol|pJ9-9
zqqfIB9<<2NpUnpi5mCe+&#zwh5#oCp&{aboYDAO~wWRZ_{Z8vnQ=OFVJzl2vG~Qle
z5d4cT${cvzWUb?E=Hg7LoUTL{>QB6QXn9EF%#+ON4%kuoP8Jwm|FU=$xS^;^>6_E6
z6`-yNY9C(~J!7sU+?~B5yT<<y?l%$|myyVW;xsyN9kG1H?Dx71YDErbuevq2=wX{i
z(Vj&6C~08bb7^25NL4-ZA?(FBsh`%tzsBoM&*U)eJt;kh!@wi)93FV+qUz|qV7vz(
z at lJ&H6zW;}#thk@{iOS|P<wPDrwOv!TjDq_j+$kRdSl_R^Sfk+U_0;V`ANFE;EK<w
z`P)Lo_mh#wQIQdQEKha>n$Yvj(^)M)an|;zH{>bm8gO~L2SQLUq$^c5?E9WADrV^Q
zX}pdedOg^)MY4M6^;x`LgLS=(`~myq-UWi<-q2ODkjS(jUD`?FOBTB_)}a#=g+z)J
zO-;(!$Q#5fj+e=QA}v1DOL<=0W?u(glex?Q{4r>JE*?Hqmt_jZ-c4Nh80pXmTYP4i
zD}7#QYKpIfCei at +{T1E4!e_81bav;ASBYzb>y8?O%a2w$jrf1FxE<$>K>Tt)YJ$jc
zoe at sDP7uB`1AYB0<*!-0-RDNv!}eVn?<Oem`<s0#UdL{EQXCmtYApzDwB{eoWX=Yo
z(z3mFnvpy2Wz3hzw}YVHG?mWj$8QOr>E0v!4e<-)=!IyVADioN&a!6LwSv^h-RMU<
z!&Epw1MQefT1v>9qCT65aRGbB$BOwOqu-7iHAm99Z?fi2DfOLbjz(q9;~7u~=6U!^
z)c)r+($z80cM1 at VM*cV5*HajW!LTWV;cEt)4VarNl(C&ZqlP8=n6s^b(>s!JUp>MX
zZ%Tp;&1vjQBPG!Ms+d$NpR2yYR`;h0XUN^y7_~%RGN~E&<{sK0&OeyplW*RQYXKJ@
zEW>XKm7i8O3br6uGtJ__J<n9CylrUPYiiV>M%!M4kA(UNJa5t-us;=g`e;V*S^HDa
zw<w0*-#ACMf26yq<3afDvuW-o>nP+f0oM|tE=}lbnl#Tm`#OK*dt8O>C=7)?)hFvh
zUNrQoz^^?!dYUzD-hQhW=Ir-PP1qxJZkAcby#?`l>$}ZqVJ)qW{^83b2*356=NfzL
zB9Cgf<L+mz$+ClUzV0etyjs3V-JKr^UuiDd=tS+Kt%&_2UgFU*J2zDO$)?a#Og(BH
z>CFZ=i^I#aAhaPuLz?b3o#=@c<n{6nVV_zQvF_%)Af<bnHA9{jFYCX<&v37^W;8eX
zUA1lR?;1P;f90U)d)YxZ3(%Uc7nqLLG&gCw`(i}jGp8ay3!Qm1AMwB<%XRf5z)<T@
zQ{bxtdIp8S$G0kDZ-+6>`Okwd4(+YaZoprAP+b3v)T(!%`>!g}Yoxibd^zTv_7bo)
zVR(qP`vYj|AZCx>RbVc$-r&8M>qpiiX0IJ=8}MmX at G>;%k7<#)s_|2k-WB?`pAGq<
zt<uNp$E$K{r#+6Xo|6X+Zg9o%dOPgUrLQ8qqsi*1W~CXs{kmGi<>|b+V?ScIio)3x
zfuwnu<gj3e<Zz&=81<2O1&%j(#qQeZzVONm$V>H4;AxkxYe61L at ZLikLn5Ev-SVYX
z!JZd<>`-_ at i<h}#Ht{o{PZ4i^OR4&2k7sI#wrCwRQ$8T=td<b|TAbr(`K~`z^ksjJ
z=-<#PT8%X{L|lZwLhP>%&MOc3zR)Y2Bi!T|1^f9nu!l-(I`8+ya%jnYfA48=?hnYj
z4Oym(8hDhc-{YfP$#(m{G*A}k)eC-9iwS-93-k%^_3YeW2+WlygKw~cY-M`i?FZl$
zUIUfFllD=FRizULRMa?eBkEAx@}ENb3YJ^k+7Z`x7aT|J$-I^vaPd3gyOws<k4F7~
z at ZCONgtwkdYle0|)oC;D5<Mp{wXX$dEv^sT7(wZIlda~jZGdhca(B at N4c3yw80$aS
zbl%Z6<UdZ-GmUcMaIS!j5C?6h)#6~(t9dfaZdIL!z1|0Z%cCOxZ2#ZJC|$K|mh7 at E
zqCMOHES|5_eXcmq0bC2V&}MVf+K)GNPR=5HXol0Ono(-aKU1-uYUrsdvI!r8mhPRU
zYmA*?6Xz!j6fwQfNUri5)OD`?%r+nU9dZfS*co1yTa)YEOYzLL7wVvOl3?Cdtm<p>
zD{HA2y-9ijc(1;tM)<&7D*Db`i at B*S$}=0GC8jMFn^C78x;o%|VayGO?>5{!9mhf(
zH-kglc1IcA7!p%uK>bhXwyk*~qpW93#RTfJ_BGHr%rxtT_<VR2_J}8OoI&;EW}I_z
zh_R2{ho1cjdlC7@=QCKHT@|W#)wn}#j&%2RNpzjJ?NaO=ies4nt7<Kd6K=dRp at g&p
z+(SuIM;SL!g=cez#s}<rj2Y<s6(QCXo05xrh<tC`y)xvCM2160P_U&rg<DUHMw_g%
zf}*iXXd%|onw!Fq&K0fkR4<k4{Lx%<vvEA5550|aj&wV?%<qb2W%=Gln)e4{*T&o9
zQS(-WI#ONG3a&lY%}$9;n|j)+vD`#nKpEQjhB&tux)QLv^5kVcX(5qI+{`<;J}I+R
zF-pNH^pp12%cSXIrdrI}U!Srki{{gP^+%IFDl-oK^dQ2t1UQ1I!~)*+NZ@$E<(odk
z`%dVsKsS}}1=Q5L;C4o?6)p)`_MeexUu?<>0dT#{J?3K649XDhNj>OeT9|UTQL`3x
zWcRwY!G7WDzv9Shv=OM$(2-2-?yW_P&gi4=HDXPZSS{{vP^?Pa$aXWoEbQDp$F>9a
zJ{T5hc_2pK8_r30odaANx<<^v!p_^Du#YHJGq<~0plhU>nZ}pePb*h$yZwjWE8WkG
zhj{KtBlVA`l-itr5?W5saCBb+n;pIexI~=3>!cpe-`)beRE4z>d(nIKTnuA{TRTr{
zy at IxHwA_N<a8NGYSUDDbjps at K?}wh|66_zZLOU at Mdq_Z-!U1h8vVlq45Oa7Vqdl*-
z^w2&aZWz+Bxs4ib*B|oSM^=fF%oVs7#FkQnm9Yg4_%7m_wC7RHJ?wW+px?4BzxM|P
zR`9{0bF)}}!E3#G#AxhM_PpqRtd}}7o?A%F7Oh#2I7cUcD|3#K&MGbY4*PGtEth at 2
zFDhdN%LZjqKcv1PP=ua~(AYA8FVM3q!*OqzDzyyj$JUJZSsC*k{QOmNhwq!V-D-PA
zB|rK9 at jRDs*Lun`X7OT1-}#C7n+50Q*Q`osa#On(J{lTiE`(;@-jGP2DQp(%UM?GZ
zoGCrO#nPir9$g9Fy3*}HSw8t49nhFew1>o)%@*irdEl8K7hCm`cxd0tqkV5}38z!+
z>eCc?idj0+sEoa_oa$+sZ=fA<<7I*(IqE(SFTt28rtcKD at kRnaod)g5B?8PvW!w`n
zH21i<*v76{7ei~e<81+cpK5a~3v(~+pmnUWxm=<OEW&*J0N0OPc7*P8!#z>!)Kk{8
z7RT6ZJj<{9KIRwM^T6ACQ!X{H at C|R(BmQ~L?Ii9I&-;%xh<nzoj$4D&&EVe-*FyIe
z7&mv#Wt^?zE7#Hb1KSKWY+wt5+rMrK##cku8>m$fy0MN|W^Tv|8>>LxEdCca+V>~5
z9j}-j*$EvSTSa*7&l{n$wE_E+MEJ6?6UPkbAEqZlGdv>7apXBK$1PmfgVQL at K(1dr
z@%!b;s86&6d%|eS^%g^&sl5eu#CI6?&;?*s?%xKE8T2EqDy)yit6HH6F_rW at j+KL3
zHdo{W%`f07N>$jw==u<?<~F!~Iluumm>W?)luuDoE}Xm+I+i;8k)}f>6Uj3zUF&!b
z?Ms%Zd{V(pV8J2PexDq!y`MS|AW{82MWT8g+So5|aO=?MMH6gk^nBa?W&elp3!70a
zyZ1Cd)Bcw5SFGFL+210ahxYF*h|%!wq81PG$Q)Bd6Nc8Uh=tns=lzL|o`<ap?G4(q
zwXXdaoP|a5Qmmm%giAwW_&nFx!@cGq|81&w9-Ah7hSq at I3+Ox4T)(3v8_8!lupsC|
zSkp&lAV0judc`r!b2FzcQQGlaxb}w}ZVXla0PR}jgVp*+(y=)W`$GBHFNek#a<bdw
zTh_xyFv=0{@cfqSA=p7*m<@c?qQ-F*XL~NSMNY>1_v*ppj6iH+6mU6c(Dzmw6k#&-
z^)t9$FSszzS#GNJz}bu*O6wJOW^xVA9jU2%C+dgY!r-G at i&b6}A3dHbmDr$Rd07+>
zt#jD|?RHJ=9JdY!LwmBU%;m=-4)fIXybx{u=eB5WZ2k`WVGHU(flrP-I<{Tv(ISyP
zz776GiZB~_;%lAt!e?l`lUKtYMP341CY(?Eoa~@7?)KwUV>Y_pT<V=RFn1+txS<a1
zF^Oif{+OG`F|sj4!7bs?CKG!q{IKVk7vl34iE8p&m$HZY=F2eM4c%y`)f at i)MeBOy
zr}i5Hh2<vl6+RX33f}IYu%P176{A+78u^td<^a}o4;^0&zKjBP<a_9!2jP{cz$fXr
zzfk+@^VX at ws=x2z7l&7NK7233I;I%556>^GgdIV at lhMq3J*@17VEmrfnJUp-BeXG=
z7}lLKR;Z84pdVcu$;+FU?E5&c=KK!Ljj)UJYJA-eAa~R9J3r6jfTj=ZX!mzS0a!!O
z7TnJv<P%izGx5y7uq~&(N4%@0ncG)R05?eohjx_M#328+w;(iKTzIuRNUfNV@!_+z
zK}z6qN at oso7&4K=pu~JjNz`kaa9urWyAR at 8j4H414*GAYr;_#v$2Y{8_O%@>=4_;R
z`xnZ%OF3>G*uM&4BbCya2IpL1E2X`J);FxR5@>&Si|er-tvv2WYxBY?%bl-FLQB_g
z4O!-=b*;^o5r18qg%m>~pX86V8FOSV=EYp-e$MsR at RaRq!Ix}w+KyGS25^MDCG`_3
zPSo?da35(Wq`WT7#bi<YK!CqS?l`uaHF*CBo0{^>8s*$);H at d?bE at h6$=%?(fM?AT
zvY$ka4lmfyRp4*KCPbWSA8eZUp?{|Is|$D at e&0Jh#nRQs%hv+KQ at 2gjqtAT7^Ftln
z=h8_}9b;6+L^*efCgFLkb-Vzcz}x^YaOQM-x-jQ%O(q?oqllqvERJI7$Q0sBUq67g
zvyTmt!#`vqWy#C$w15{HXpsByN`b?kv|gru?<{S)!%LBev!(JNUJT-O+RKMgGY2_$
z#5eK&J-qTr_WVy64eHBfhgaS`2LEU^G;kglmoXZ1uN?eL&&{xv+st}-E^2)#@%l+~
z4_>DT&fy$s3thjH{`bsVb-?;0aMo;1<b+b&cF7#~^00;T@~pdUI{3upz$O14rZ7vH
zy$)z)VQpR|OA$bmVd)w+jrI|7KiW2$)nRXr@%@>1VCkB}<?ze;l&W{m^EK{zrUo|p
zZ1AmBVLQ3!nm;fX^M5Yv^0^dCMI9g?tBxHIwT5Wb`QX at eIHqth;J7{~H`Wxm{yeM+
zUc8j{wNiU`?cm42VbTKLMSLIw#|RwLaeU7>W8vR$j4?igb5<rz!E3QG5U)QIo;*;V
zI2r#hH9W)5Hqhr^Bu)-f-pj;$OZ at PDxa@+`k=(Q8^Xg`WM}>cVxa@~)c{iPhICi|G
zX>x`5G at Z+atXH$KSl2#Zph5gOdb<j*zv5p1!@bn1(HNDg;C8$Ro1E8x<Coog20s=#
z?OE_8Oi4N#3l8}6uCdT(B^!~(w{(AZ+29KCUGQ*^1m^}sVvH`v?=1>X`96DUiuEis
z7iy=PtY?9fY(^ZNuoqRp+t^z(#jBe%&w3qfV4|8r7?UGeD8V{4;Mgykdv7}CbO`by
z%E5coC{<q{=NG~k*@8R?m1F;mF~lq9awbYedmJyK9`Q)74oDQ+#q{A>zB#nNpyooy
zgBCrl>qqCJF7sa4`>L0T*B1Hrv9!i5EVrqx$no}QMLh<+TZil1y9TTw>M(5(x86d7
zo4Zc9RzrD5szt?a7WbMCxZdx31IK9#+vHKeq at GjtKii-4%a)00;uLHCu_}zaChRpw
zP)~i5%Lc-_<Fs7nZ`9~LKM320 at 0b>Er0e;PTH<Ny^gB&$HLVzGM+MrnU#Xh&0_<U|
zOMl-&I+*S2`=2w{yT2uA8Y#ybFjrjHl;YBNb6*Pkw?VjGY_jHs?>?UqSkvJ#uK_i?
zP1XY9-~nGNARB at FoxUIagOSscgFFq@T*O^0H$?&9&!pI=Qv4Qn&|A={Ek}Q*`fTR*
zGsMcs-y1B0O#pNceja>H-xnw!54J-#w6WYAQ`mHmm&KZ2%S6r2-DEe!=U}asb8BV2
zaJ}7aQo81fMCws{FWqB~O2XSJm-4ESBM+Vf54BU=7jS#547Ln%z}ml~IWtgO4BQ}K
z0&t7^J!M!M>qTv0;5Wc-{Tuh$&j0=FjO(*o(9)S3-AJ18_9qKei&4i3ZLUX~zcwfW
zpE^`3^tR~|^`r&Oi*`HBjjP>+XRpk+*jMJ?3lOVNd!TX86|qv@`Ro|S2IK)&XjG%A
z?)4Y`m&pF9JQH2dJlei+q4tn!>L^C>oBy+3XArBr=P$X5IG07fse9)@NJ0JRQ=+TJ
zFH_6el7xRYr3oc$CSrC5<)=>+ at Fj-~@$j?3f1S3f7Wl at Ki0#~T-|BkLjGRY%xH2~D
zBywYsqwUxL8%dAxbQpS*- at 3*Vd{o%k{$k>g$V<pi$ND1 at 1%$-ZH4otg&vQ7zMD`{3
zZ<%7l8Kr9Ma3%rvKw-ERc}%F4huD|hmIZBG#ClM7Du%|#FI$0Uluypa+V`#9i at y>5
zmXGsV$=?cDHZdMLRsry*xjohD_s~uR|EpB^j9p6Dfly-W79;2UvzC?$^A-0{?>uNi
zTioY%kHn-YVA+BU-l<6i#;al0R>RQ#nSnZuTEx+^m|`|v8GHQ+a9dKXI`_HAO{gwN
zV^1a7kaL+!IhW1d@;Y9{#DXELrI2#@fc4qX{&BW#;(`T1%oS+IO4w4DPunNM+712-
z#??Bxkz$hMPsRs1#tbipT>*OwxSOj!$+3ZHXzMiW-_r!uq+P|EX>9>U)F2NL4cK=D
zctSJt(>4V-+1=u7$A%@IjfVFN<oY+i;r7)G at aH=}DcrFgdu+y=-)ItPzlBdPg|3X)
zXAAa`SW}+WjW<Z^QNf2S3;m3-j1sz+{vq1fKKKV>jz^B?=}5MYfX)GY3%8CKlQmaR
z)4ukHns^iZl{~_Zri!d*okdF3lVOM(68C4Mx77Y0x=+&I26nW<zpV=SqRuM#94p9H
z5XHz+T>g`LnBaYRve2I`hu%XMbi%gdI%|QqBCn{=_u+N?_t7}#0WUJ^*u0U*Pp7r&
ziC4*X<#3ilCwSZRtT7(2{~dgs?0d&Iu*oPcIZZSl@!a_qhsejQ1HRmaYY)=3F*nkb
zs#m_E^-cJ-ymRF_dBu$J_XCjo=1w`O6oVlDLbQ+UMgir}Efy<SsmM=Wjy+<mIG=l6
zL9fYYJ`+cnPKyDrBbO^NwzDZN(Hh*YfN!PoXtJX1f=%#6Gb}xrLq={rD5kj!eM77X
z(-+{_Xw$iMn2`%TQYy&qJwdk4^iaaSMoO^{LH~Lrbn39ypT%6TV=ny8t7%^ceYk4B
z+<SYGM?5fE&um$sl^2<}b91eM-TI6dt`W at PIX^v<YfFZ<>rK}@w8txB&)QKV!-bI*
z+WQ~Q0mQdE`PI<DJlmr8-ZB+Oww(Hoxde^N1n5jYux)~EpUK?^X}lD0_mRvL|LTMI
zU>j2`hc2NFH7rK%7^~!^Gn!+1(OkBR4_(UCBIujUrF+PX;qLEVn3mQ{*SbbyXkGyA
zi+>BY+!W*tVPmmpzXIRs-^B4bzk{BC;<IiYA=;K+@|%kF3lz0;L~pj#x}LZF3(@?L
zn8vkc!$T}3Ox1#X at NdteUxBB%>o5oP%+F4f3wOIe0lz0cc$dSM at 3{Q{-6PZvflXUG
z)E`BJU0{xNK`W**Hj>t+{`Y{lRl;__zK8Wafv_=PZ9CCFt4BM4Ng$sTZB=96QF#Cp
z0uE>=o{m?9C+*#F{a^8=qidKgVOs3hRh}ydhZqeUf;3SGhgdxUn9y2iL%=q+SBNGc
zkAKpjH{v=wT^Jdjf4HrVuqGzKg>Q&+;Ai(Do;s($=#O<dZ)DX<;3J}T`px^7{pWBw
z5x~&c?lWh3&?YvjnVRe?ufN=tZO&yYUqS7GwVQ?mR}Q*;3H8YNtK^;1kJ#uS<k&Hq
zj50bWaZ^wV_t^)q*Vm1%Wwu~{EnZ-Htmq)}YvH at Z^^M?f0{7_5!3xn_ at cZKiE{Wzj
z{>@Kgc0d#DTKM>!hF5aCbZdVceg?mDlF_*Q+7~uruMHkZnXYqTJi0#WhlImq%PQkO
zspPn8so@=M*@XGnYLu#JFQG4hIa<2htl*)(0Gv(5bMO^%9k at B=C-Qh*@S9_N`(YoR
zz2_5M7ZNir5cr?T?gJb!L{Mk1K+Wwi at 0_Wn%vpoN6EUiBiNF$ao5~ZfP<>M5x%tB;
zuSE^dIOkV<#F|~Nf4K`>Px}G%W(i9WX5m_!n&IyX_5h=*Z%>zzKOPQVLN(fG2fkT(
z!i}{P*8AI6wtrxqWzk13 at K+-)2+STfLaZ{bZk9mPyX{gvuQ{w6>sRBzaKf at 5`N>?R
zjQe3HlW?z0blAK-aeR2nxy^>DVcp1Yc at bD1#qHf(cs*+6Kns7+hsGl~l{(bILJm3d
zLlbO`Oaj)hLf#Hw+!jHR{e)}1WGO$@qEsz-k<ZoszU{=iJv_cYe6w|nYn)7???-X{
zjrnuifzO9=v5R6BHS7n!VRi1`uJS-lpM+!0;x=d}=JxJ{pNQxrn+rQ>AO4^tc%)RI
z0A{-%T!?)5b=zF_GgIl at CvLNC6OBNgWzOB{GrTfm at I8$fwV|;FKjU8v4p at Vs1lK5E
zRY|#$WM?C%oj$9_{7kST*UYS*Y-~pDYkoa=84_S)v<E!_zX85e=y$?RuoVvXHVA8>
z55dI_ejUqaxj4_i!J}vZ245<Qz<yP4-{p3gS7SZQlUR at P6xKtT$ctj9eO>PGqj~+H
z5$_$xoX&?Pb at 0Ge%*l^M15FPC#>%&mT|~Ojuwl26?i0p}mUNMFpm_y+?vHaP6&fqy
zHxwroq7MwH^^^_YdMo}6gMQxWbZ?Fg-1o3P(sP^k7I#hLt>b?0$Wo$TlszqKM7-;q
ztTfsw>v=W<KHZyKyrLiNe?s^j at -!~8e#~p^CbJ?djM*HbwI4yPj33x-C;rJRKe33X
zJ2sA&fxQ;mO~K~nZF?Nxv!4Lp;pB;zSrB|g39t{eSN!k?f73C^oGkos;#jK&I*Jnf
zC9@&GfX at rRBOO_u6ZvQuPrUm$*5F<qWis%WZjT`Q9M_5QSt{3J9+n96kej;&>ypCs
zoc}j+ga0=JS5{U2>hsKa*_G$Vg~UAZ0kl!_5GN0(c?rK59C>I);eLKCc_#076Z85Y
z@&>cQ;$>*lcZkKRg10?v_sWwG{Lt=pwBt7NaZ9b=qi<8NZ>b%lz%@@p+_8G)N$@l7
zMrco7#P at sg*I;f|s%DMBy$!Q!Hg%eVkr$qTd)|!iAAyEs299PN({Vq^_6Xzv!N<e>
zI5FSD2hsz_4tmcRbJw2<|IL@?zVJayD%SNd!hj0y%&J_eZfXk1yQlMk4(OE+S{ee>
zO`6GAJAA;$_01e`3ser4&QRQ~U_5^-r`&emp9kDvC%O6e%Y32- at N8??`Og*D_kp`o
zerPS$R>gvsKGC556X6famI`nXLr6P}FvR>Qo?a5&7oG2iV?f`cR~4N#Lowwohz%RL
z=Q-RwZ=s!qp95a`1?a2Y9tfd$a at 6X=XlMp3n;B+Xh&oIA1Wmx96AtR(cSVk^8;y9`
z0#jho!F~9D$s`5l*hWEp|CzxbMUA2R at 1f>*MPF!V3+zg6el#ppwx(G+`%?#hgudq{
zV2_B$4D4?o!7B&;Xb@(}R(KYXU3Wn2%Aew%^$Nik_Q{w2$<tn1guLl-JRNe=Dy`Fb
zJJx;@5;^HHb7}j_;6f`$g2U8Xh3{4QuUUo64VvTkjtJ6#Pp$;kS{PP(j&!k%{e?^7
zS`fb$momy0BR|7gBCZ1l at McTBMjF@*9N~ojnqHmHX7gen)amlQV2fB42aUy@>@DWO
zoeb_-WZ32*???--c&i`<v6?q=-WBr>`k(mG0S}<VMVjB(XCtm6{xxnia(Rdg2(G#N
zFOOpnmx)BcrrX%L)--6k)$_`%8IFEtF?3b>p)Fo$-^bKD3Danuqz3lB+IeTODY&ZF
zdx19M3dMl&8^790yU~w5{IAE84Z*Z!`ki<Qxy)|tzN9YblupZE>{G}ntc9VbcNL}?
zNk2F|l17J`Y>H4*xWYJlNgVh7^N6?qsY{v8HsgQz<UFIAbSl%?y?9-Vxm$>P`$13?
zhMWS#t&O1-m-4}>%*XE<V7ntnn+-<YwYpz at V1qYWbJ>t2J?`gB at ZNxK^v#4Y#W~fi
z?VsFdau{R(hZB;y{jk$>H|72v(0Q8Zv#_FP;+UMs_xeBVscbZJc at nSCwTueULF_M!
zuqSVpw_HM<KKPY~fK%A8jzhN}V`wqguO+MCTlp{M_U%qV2wn4 at cTe8et5;eyMz+r5
zWu at xX20@7JQ!8?=tQ(<m*~mjK$mkU7X6!qes5 at 47vT06GS2ODG97<gwY3))LYt<jk
zLj9jn<rj0tmk*PM58BfH7)N#B1r(u%qN!b}`Xk4b>Lo6q>o?+>8^bGY*{bS?`KQoI
zO~&3~nsa8M$v3X67VFc+RMp7NF4eFy at Y}aVy{Pd3*BSNIr+yrU>mYtiHI_`s_3Z=~
zxME?B{V951*iF0ub_KZK`!Huxu(sSBT3e`g?A~JN)A>>TLKeDJrA->Far?ldZ*I5n
z_F9kd3W48j`=9{p{&Ow4^d5ai at 56TA4vnAGRlt6S&WZ64L7r!$y%v5^3Vi0 at 5VJWb
zDwSg&*mX{++WLOCy6+m|=-Tzq&f320mL-K>;QGCX-=EGR{*Vq15$S~1gWD9>=MXf|
z{?~WB7`z(K0`9dXAGwL(=<h|2$0nal8#DwlZpO_oC0-)UNwO*EbJzRkNbsdh*kj8u
zF2{NjKKKfa0r)TrZKx+VczRmyU-CR2nCmePzJbp%OaR_Wzyr!v7;JTGm$$gaQbsb3
zrAz2*sslma_gM{2^Hzr&)~8Nr8rNF4$vUmMyaLfd_I+h+-V3OqgE&6h$rS%(u0kt+
z>1x>EKmYd}T{3p6h}k^xQ6_7ad)d=2{rmZL<C8vxwKI_aV at M)x-a<!T(p2MB(hL^4
zXU4=%#Qw4!wnkN`DOxeHhCv*{x|Qaeyy;jTyO*1fnm^_v=3+~W at CMFLvD{y?4d=@7
zdIMf>WuW_Oto2DX-e!-WW_761$u{tsMD9(xB&<DFndN at c(Tso7`y%%;HRk(1tO2{+
z%$YH3psQ$QaZV<#Q;F9y{Js>&dK}YmtizG^!A2a at acsa*f at 2Mi$&R<sKXtfX8jkg6
z@>%My-ATLfStfjnWE>lDl;dd1m^<PlU>@9hVtXCy;)>`x%dI4btn<Itk!?l`{SRN^
zsegVvv>s&hhSmeuGvwBTD2xTHJATWW;0I%UDgdVp_1jh|2FqsT-z^3A;JcNl<elDG
zh>cDptdREa5N+2C)QeQj+!vVJtbs=7MdBC|S0)-ca$|HM+MkExIhoNPKRS*mW54mj
zy}^DIKE>?)U%SwrW^Lfz7B`pW_#JTkZq3WA6Tr`h9j>ii?O1?4svJDFYH-L?X*|Dl
z!-h7AkmHIvMA&<MUzI}-$o|B%#b`Thx&W^b?TyK at PT_~hD^oe1vnsOQAzKHzBqO1R
zGE%8}?F(=-wqf7M@`k^A+zb0vv-2jfh_l4kx$&J*nRMCUxjr^Tduw#z3a`|#l4~PI
z-(kEVXni>J`Sm(zIpp<LCYFb5ALRAw*O!HBdkAa0CZCIYYyh5MO1f-RCi)uQ1;*Pb
zn)HWFh+2WKt(v^ckb`-2Ayq1!872#w#;6S0*q_Vr`ZS{=t~lCo*t{bmDRf}I%3dpO
zbY4&Tq)PeD1G at t4hAs?Y_D{XTujhE>KZ*PBESA|wM>SKa3c_!`_8a<- at SZHb8g{}y
z=Pl at mS7ALbhb>L_dW$~88u4aNW}~^gYjCWl;BE}7`rAi->RHB5?vp(@b0#n&ozVZ6
z`e_(nnl=yU{Bbx~a<MM8%~xyboRVPs7B<tH-dhIV#BV06^8224-M<Iwg7X at Y?@>qn
znD_~_#Z|8b5r1Ra8o#<}-_U#L+bKUCoSBXBpPT{xDAdkWy#^gbXq+aa-q81?y+gbO
zt}f#@Os!BWPza5JdSjl8GY#D-8S%`ZVVIA#r`h3#u^WqgIjultu61z~nxT2aAP=Fb
zoUnqb=n(DApOCAB`fFj=TMe))GDRY`3Au$@s|@QdxSn(!eyRgIYYg%O1(No)_AKUf
zi1x?9 at YCiT!ZNt;5TCyrctariFxJ1WNdvwV at CtcKU@q4tik%N<^N1(WoF>^ATIIrE
zn;+o0r3g(;i1*tY at ZI6yc~6 at xXH33N(tCsxqn)=bH{)9g>va}jyla0{%2VQ7Y2ELA
zPxt`OdXbH|7}`n9y|Va9jQ?M4|M6EjQ;5re=Q_cKpWt4V at S(T-_q{+<LHlDN__oki
zKz*@c|My&f^&i|^&qVD4ihcVJJnxSjU?%cFHIoY*N;TV^uvRP8pi${RpMjdOoWJ~*
zYYyTWev5SgdT{q}?rR at 1QFzYFWhqk%?Gf0U8$3<ePwtx2{UclU%JbMTL2~$M3wUVQ
zU&hi{{GV}%-w4839e7NjJYEj%iZnb6)SPntmVe|tq3_$|uhX;Wdz}CNKnnIH<awe`
zW;zytE4Cf$hK at AKgqtkCV4ePj))}jw*UR~?m_Mkaa~u02@@B~QMO*J4s_5~cSQ~FX
z#uo5vZp^1L_gP=WRafAijxeZ^#wZWyu|Ed#^LuN&Rrdc7XO7myTj#m^zD at a;Oj~o)
z7}&(qyRcrNrl+evom%0)5L>~Vl5F%R{PWq2k63w-CVcnzw1x~1H{CAnRYFg_I$z2=
zisN=1e~?K3Uh1<0m=yF at 3A4n#p*|qB|4Om|b{y8ja-olFT)A+EyY+4z&=13Ss{7Q%
zADkM@@qd<muEFm(cr)AA%oF*BVm-h*d+i5|75G-ye#N at G7yit*;A2R at x2t!2DEybL
zSqOa}a1nl`dqs_x^7eEVnACj_W-sE%$Ej~w^ev0NWvOqW$4UMKa at g~mbo{N at 3zm^a
zS|93fzy1`~iAOoR<be(A!s|~_-9g0pU%~6g1qylBsy3T}iLzA_u8sRlT~%*ybz#iE
zry-_o68?*LHs&3~cfwi=9Rgtg at xaaYqt-CAz7Q+vqj@v%Iebf(R<#|vKHB!RY-|*C
zTgCaZWMCo{!fzbvu^RAd>Unp?8q&$NZ39PWn_GKmN=v`IQVq=(wvKmK)NHF*nGb#J
zi<WL{Ue*G{n;!wjwP2+e_BGXnlm3ebw8izSOQ&TIOl#MH*P(lStH0`)UU*V~xG=`z
zClqsV*`VONVNGMeg^*Xy$aQ3*X3_$x>xaHQfujjW^Q9xaanKMp73YnzgTJ|8IAZnZ
zYr`wgX>gD0Tex`Vi3P~hT!%Q{1{XG+QPgq^I9;(awt9x3Ft8NyLA^ESPAPM`*Nsma
zGr+<{8Me*Pq1H0l=550D8YB7+n8;um;l<CMv&j%2twRj2 at m?NccnV%M;*E$aVy^>F
z7kf*W&ox^eenUa=KYp71EyVarCDM`Ghhl!^a>V*1n#Z_UU%=kK#QGu!4z7!lby3WN
zaI|?hWCz1E;QADX)?7kAvr<_AyMtFEY9{OxzPW6424T2oRQ<kVY*#~rl*oC^&bKl-
znrr;6h_h}DiTrM(8T>i);}qBf&@-j`n>ot{o*H+5TYWZBe_?-YrWybbLir}deA9sG
zOL097<xsk=Cq8Ry_~V|EaZk91C2_cCI<FY#X@<^2ANi)+sPAI}pKqpnt?*Q&rM|MR
zvqHGuF-S2^tmh&As)Z@#nDc%y<gZo*MAtbcF$pmyCYQL-z(iEI&RSJO*hbg=FMfFc
zHPEKQ{V)BFu9ZdCB3oufz!>NZVV at Reo5fZo@zG=lVarYu#Lj!d_x;h(EJZA^(H at a>
zZqO&mGWc}jS?E1nkI0D{fxN^m276ausy3`Os8+11T9K5S8XFN+I98pPQ;)sbsJ<gN
z$nWqj at QZmB%%OWe)@;mSJ9|5Dy!`#;!5Ve(h`yL56E<}PJ^{=m=BG|*9KM2D3s<8_
z=X?^czkT)m0qaxETCR at bSjM-bz`enmaj$~YT)7sionHpt*e(0%{1Kt4xb~pi;k#u4
z`Os>qz30tb7%ZjtMAz&=%xT#$VMgdotj`r#OS+URGdw(%tMp86#{23Kyqb6Xc;)SD
zFfO)?Zm{M%PFi!&5BOet4R1$uuzklnXKkhJ2Y9vbG>P+=IK&H at L$fUk<nOhzFFcQ!
zi at 5E#(%EOa^3}O7z&{;d&+NEbp_b0tIXgJC<daQ`O0{adYHW?)<$!08)^OOyv&g$b
z4pPAL><!pyN0G1icZ`u?;y%meo-K_h82Ew*{!Z7&Z|&pdwy$=-V$HC0E<^2z#pi6F
zvDv&b(TA{Mdf9!z<**k*v#gQq0*=E6n*dzbpE<iA*K332rqJY=GK3vVDFz#F{FARY
zDFS*M;OYsVahB4&^MS4s#Y3SjKbOX$2sH=<z|_gMd$|5%Pq{8MSsaKlH*n)M!`6wl
zWg6`0YX8Xpwl%h%1m2rqUep90Km4S0VA%uM<CbH6PbZ(4sev7-dTj at Mk$!vz`~9`=
z{)}1TnW$+G>gRi+CKA at NFziRq(;fj0qgD>HBzt`ZVfx at nMh={$+)l(vR#>0r>8+%3
z`2?@Ri{o>3HS$rHap at YwK&i&X+8YNj-u^|tfGUsomdNSwf{tOSb(rlf<l@&%CLHK-
z%yrcEfFD$0RczXi9M?mWva$Xn=VE!EQ^_b%^Syw*ri|-q!Zi{^-x;hTH$myrwM^;K
zg(2Eg#j+IA1w*~hcdgGm765BRZJ4ZgD8>m+#v}YZ at MfA;0pDRO-<gcP{c>oHRiU{q
za$-$Uy&lWe?0AuQMd7U-dhoEDd)r_$$VA`q9$lJ<zR6*Zmd7nVV9jOpzAN!N$UmN<
z#{Sxj^&!2bf>FX=kLy`P{e@?CA)a!oo}?O6O*)Y?By!swR>zmK+t8Lz@%a(e9o~<W
z2k&zV+D&IhH$wlcMX8$3vNe6n!baRgETpTH*=LiIJ@(>A+tvQsz>UzayCeFp1(*l$
zU|{h}*TiVC7NHM#cbEgb$E?}Vp*rpSg((b89VlSG$Ms$S<}$$4&mT~4r9Hf7J--&`
z9)b3P>P!yx55;$wX5=iY{HeYfUB}2AKO=cELte3}5Za2syKjF1j4?e6<KfP$7#l;c
zdoI96e-|<Acg6TaEdE__G5%C|Ex}(pUMq0iJn$~^I64F1XM*R2SSj$31k~|Z&2i!w
z!m&~J>xIO!aHDTAG)rpj>--AfXC4jJUP?8zNo0N7+8cOj#nMroeg`P_Ks9XLCDt8?
zH~fG&qQ>261s2~o2<?q!c*b~rbt1061~oo%1r_aUfwQSzdHWJH=ow}2fAUB0wgI=u
z@`mkv_BVDbaGe|c?Zz!hHw=RHD?_yXQ_R(f&8Fa95m#*4Nare5f7{D%#%IHTy=S=}
zutNXnd{W=^q#MR9iO(9AfEQ$V1-xPKne~`k4d5*`QY`BlFlG27F|)!@Bbt5_{^{9r
z?l)lvJB!d)vHlh|g!+cKL83{Akmo({fop!4m%_h2ine18``raL4BnvgCfZ`cSYy3A
zVE1)!_jW!>XFQYWyFC);v7!&byU?JmXU%%z^YstHCzFI%o|hWWB<WnfTED;Jxs{e7
z%pY~^`+sH2;ZN6*@6;F19u(lWXb<+E+0q0JcHIAnSNU?-9~W>>w-76XPkT*>?`<(-
z+{4}o#r@$t at AeRFTO`?><dgpL1&y7)&#+!BLhNGE!2akqSy}Wzrg!uh*(aCYW=$A#
zahS_f(SI+KZX?FV8|3E;J_~=&SJ7J$tqPywOZC}QzOP63v%fL-*eqrO%V+5RI$6XH
zUk(;04Bbc1o~~!d;r$$*o-t3I4&KE$MmgbQW{2RP%nwt)VKfszW@>tqt=aBxVBNsD
z=!LyHJxBm;H_Tye-*q$h8P*FUcr8-+DR}-^qwca>iLcp~iT*x8*M`58jw9kA)(phw
z$$yei8(+D=M?C at VTE~GKN*>}4nKAgC-vxyAsb2Y!a2}kGaR=?crM6<i6$oFzIrF0X
zjY^T&m?Nq}P1HxW=OQ+vUwQV=*vy?#A=*3pu}7q!y<c+Iy8`Y+26%pN`<;@PzOoPX
zreQzh`e}IfF+z9r{TgaNjT^T`xGxsZDCSv-Z4ofZH;5DF)(-v|AN(^tYTvnQ?o7&a
zLbpLK3lkhGCA~jugU9Rga$d at WV$HuPm%BiErjoA+%ekcLe}MNp at xD;CgWf+!?<d2~
z>u+!4$yQa$q20)K3AZf##Y!<8<Vbsy_DmhSg6w8dtK6O?1ulktrX4yE*ekWyR^r}v
z!@u*VaqU~h at iL3xYf5=F=5+Qxd`{ZCoQanmtCgz9YelWn61v8meB#`&<v|p)7zV9D
zaNb_ZbEKjEm{D}R_Bl at T2iyhdY;T3Ge+w|pu?*FM+D!hP-(BRwNeL_J--)r8ft&y(
z<$$o4VQXIe3r-TqctVRUXJ9UHViVS~D&PZ?#%9B|xa+L(Urpa}I`N&O(EdY>J=A6k
zZy`SyW2w*Ae>L_Hx-Qm(=N=iDOB at T=XLnB0XXl4LoBlaCtKcR3Yr?u-2p;_lIOKM#
z7r2|NgXR7S=PJb$*+&WvsZUv<cQ-zj*V(>CU^-tU=xkr>+$)*{{#6}&3S$yDh at i|`
zjP*NDaFc1I90Ic`z6~66HK$2sIuE<&?kBX*kA&_`-=|!DNi*UBGIm8l`TA`WvdgZ(
z4}F|}+V1Y>c`Q}<SeXU64!bF at Np#U(IUc;Q_SJ~<3`UsVb+DHy)<!lJIJ3>*x7S2m
z(E&%VZ6dvhSdW2`#1nPvXwnF$Oq6u=IZLRXqKnHZgO;I(8Q=ejrvyjOY~}27-`9aH
z%rG|-U)(c=;+-Md4TbQXB&44;vcc^n&TVu3e)!dgITMa0{;zZR!&6lIC-D at G2iWfQ
z)KBsdCQ5Mn{Fb9~;!VQW*=cTb4|CaHkEMe97Do2fYkg+mrr1MH+P#MOaj2n+xzu8-
zg^wBuu1d8=iac{^S|o8ukYffN8^oh>2G at YYhJB;&K5VBx!oJ$$Tep$_%I3Lat$RKJ
z$5tG_1V*7H`;pE;ZV}}V{U5%*Kdz~I|GzW|Sk4kPb(O(DZkowNGA%3dnir94Q;Fn+
zyFpeL^Lk6kdoz+TekeyBY-~8j82ic3 at nbM36cO-8xJ*$%VLBNTNKKO;bER3|=lcx1
z_w#vtAD=(Y<NQA7ectE&<MreDdcGvvrG&o(^2WR%{Q+=_*o-8GAAE?IGtT`B>&Ec7
zuvvEG!Nk4*eLwMbrN>sVZ2d!7(PJy<gI^%d7)4u4nEiy4k1_VDBGd)!);<5QRw7QA
z<d2PeIZIr`+b!0jzices0Gw1Ca0kHp&z7L<ZDf3TsQ~t;0EP>BF~8AGY#Kc=>){W4
zGc;q|#&P_X9Pu!a^Kfq2=!o#Zi^L8xQ<(m|g?kw|V)^P3>h0^9;7A|&K|b0~%e-s7
z&f!|`zJ0z&*J<^KYzMhTBrYRdJNhx~Tb33x2RJ)P;<XT9LkwIqJwVF3_`5#TUEo1(
z7UmrEp~W*sk%yVsimu(}raZJM^lfHmt47cVCvgjjZDF)*tGxRL+R(dx+4nVG9eD3^
zecJ_6$JF_9#BrSNcFfKf-yYcO4(EMdelyAjf0n9GJ}&EOe-<G&qO<!)hHHNlgHta1
z7Pd_i_k=cRLe9&k9YvlxBQaW at e~5V(F_G*V@*m-Ql at M&mUD%8Ur@$8ZENO4#A9f^@
zfB4hh at qbwHKmVbliTQ^jYYxHZ1Qpp2pzTGXos<zAAUXE3pFI=(dM9-bdV|%Dd>uX!
zQN6$uGi~si6YrWmdk^$zJ7SMs!2kTp4h|sLC(`LklFx_C?~6O^8t9@)7;hd4hAzla
z63j+W+O6-~_0Ut41h)YmI34M$!E;#JOQP~0IO;!qfQ-KxoEZdj+``y*!^*Sg&!8}W
z9=&#T2K?1?;jczM2-`cXYDvO33Xa?dxhckNz>*NHGUxCh?|sCzW+69cu46K=!$!nt
zhjUEuo%)O}MQn0e7kmd?AG>(Fnb?Bc#IW at a|A8fVw4rRiTxH?(kg;I(1X~V&a^U$N
zPcG^pdd^%Q&WXO$oKpBXTkdHDospu83fGHKkG0FT<`CJLV3tN;XLqk4c5hnB*mn)%
zHfBa<Z}9$ae8FKyk38!bb)`u~{YLMlo}t-z#}Yrwea*Hk>`UkyI6j|R8XoujEId;I
zTRNUg;^CfBseg*PLLZw4`Q%rVJz;Ck at Im-k{sElA3h0#Do)eHsqx;TJ1eces48F_4
z(`7xftYfSFJwD|5zvXqnFZViEhrT$Ll}hE(D<z5dnq#Mft7ac?5G3E=De6(`8=`}Z
ziJ5wnK-Wn8eFggBO<4?Uh{$R4H0!1YCNlWTxOo+;i>a#7GA at aKA?NJa*FZ<45#z6h
z%#t`}p}N`*QU&Bc!Pb$}NB8AhQ}LgcP~c1C at vU`?O)rB^_iqQbz~zt&(1-t(9IpLq
zQCLOb736x8sSXYu+TY`4!Q8tOI^$0GEqB7+w-fW540+X5h`V>^%^0BXoyYh5eYJ7i
zXFeO)UNvlNvWgqCa!m7;$DcFySbW>^8mz^Fu34#wcO1Fi6Z1A at bT%)4(P>&9;QV3v
zTxZ$xWzK%#iHR!ViAU7z%lwgVb at pqSAHg0g!L>)7`-La`53x)5BQCA|5RN-SGjP1i
zNn`sEbB)P)P<R5dR!6C~1K$xlm-afpVOPTjbm;ofqJnkn^@{70LkqEA*wet?kFl-#
ze4RwLa0WYr&O}|m$IcJeW>2+4E?sqk4cYhmlXi at u^ER;M;Tsd)L>(Z$R?szSWY(P+
zj~~PTl+kU;S6VcypRgO0C(6r`zbmk=p5i)_JjrJS-`N-_iOk+zz|Ysq>C6c^;?{Oz
zlROZp;R-Ph8=R`;Rj30kblzFF4u&4Ol?6R}F3IVH|9(|?fKApfaGUw&Z=D#Y<+l#7
zFYp_`Cu6l^v`Kj2C32n%n{`@f;Vrf7Lze&Yvi{@P7h(GhS4qZtXF2xwg&yOZe{JEL
zhsQ=?Ck*-(_npP at zEBIU>2kJV`%q{mwoOhq?At2r%R_Vc=IbT)d-RsEzYC^aUl4lE
zen*(jlVksVX8*AL2en~m75Ko+>Mc7fmo_@#kJ_opOQV~xF2#DUFg-%X)~=K2_ph#{
z8n3r4Qe!&>+d`~Uu|8zaQa94c8#={pOWn>?HZY9Aui1|Pv-fZIL4MZH((&uT)6gD+
zIBnUqBji7w3&np*s7)dN>1sXsPphQ(Pui3R|DXTV2wSk8#Q1UVF!7%U`P#GJ-fBRd
z6^BY;r`7_?e5Ly}p=@$LFcI4CPTgw6w`;$@OpZ<cNhn)T;Kf?kug|+4uqYGlDEGQ4
zw1%&}X^2^G(>skq+4DHh*Zy#rukGtV?!EM#b-+XnVf{7M1y~#NWMexH=*KkdN)uvD
z$4Vj|P}0C$yF6KCx(O~iZP45H{n2;q2WkD-ZuXJ%Ha1WMfq%AVVE^CjI&8mdKN8(%
zKPoiMF|k$YUF=kTeyiG!_{--FHoecA(POvT*m(!T#qo3;TaD{C*!6hdVYWO at 8klmc
zE%Y(Bmd+*Ea<tj5tkeh<{iaa0vsRo#$DvNdp at m`l52!*#J$dcWv%8V6%~}a;+sA*{
z7=V4JE`)0 at 2QqQB{mF5vudD{2wO>A~NXYz<We?4vfQ_^p=t*=@^5w|Za9M%hc-*Fi
za8KSB#_(-7vS9mnnsNP4q0+F5122SXTk_h<nEdQl@$Byorm}~jgE9WRu`K4fSE7pU
z1Wg&H5Q}MFd7)nTAh1T9%@Pnj51g1^;#z}O1N8dOVXxgyY$<dayB_xHGaIy*p9&pm
zmBDtRVBVG5LikVcZHNv12RrZ1e)4Tm1LPilW1AYjZ3%zb&#;e3WRofI$ry;fd^sP-
z#W=p7TxV~HBLBSBSqfX^6;b-$Zs&<CZQe1K@%h7c=*=kmd5jCkF~%3bW;`Y?!aOaA
z55}BW+Z+#jKo at kNQi1`59jlbrnAJ+wA(E{AJ at Z%bY=^*AX>J?fMI(2b1 at Q^>!zT38
zUvW(dksXjT6VC$=xy(Kc`}>GsY+Y*L-+cyS-QdjF87}ZUN&H7FA#9>?fd+fN?HKY8
zOVe3VC&X=p&#~tmeRAysT!$PIl0 at 6zIfW+hpZS#Ye#E?W0d;d3T%)UD&l-OQ%h!(l
z7pyv0+x(+~vFxF!6R>w$ZfbgvUxj(jL81qH-uHQ^BYyrg_+|2{p7E-`uR{zZ<_XC1
z<-h+%bx9pDLJqk3_$3tV36QmS6S-rc{N7jp^Bl%k!Z8~)`bO|{#M?!+9}4aayS(s3
z7BIxapAp+%^hWE!<Z{H*NUez5_Nio7PtgQ!jjX5SSSJE!zSmyQ=w%5PvY}_k9Xt!0
zykbf7t`{;zLs`Yo30!m<(e3tsIh=tx`74EdN(a8t6udG0o$0GkX7FlxvGDG-?P<YX
zVV4)I%5uh9{&;uY_`B<vcjq(jZm>Okx5QpT6+re)xcrV^HlDYG^c51DPM%4bdk|M<
zOK&MAaqqy?y%r-}tqt79$Y1 at iRl$cj*2UHlZbYXHIgw8HW`|WQY=>@wa^l=d*oJ9a
z4qX8qrj~<v;vV=QDHVmB5aAo22(mYUvkU)qY=A9nF5f1BFDh53WD8;I$Old(ANp8S
zCczGUL7o9UyaIA#yg-5&7I0VMUczI$JBDBY*V>~HA8>nUuY3o%-)N=9THbD9?ZZC-
zuSTY50K5%;5)va$o;N=g`KD%)`|fA;%|tvx%8JgQwEGsEufJZTWH3<kGrU-B;E0_M
z8!xT{e?Z7WhI6%vw}M$830a6|H{>{BCr!n5!likU2GSPp*ML*BcD^X4Gc4_Xo%QRf
z<h}LGdxdN%wi}r3l>h5~PJS!lloN6anRf}<<QWZC4<Bp;w(G{X>kwm7kFq!P&0KL2
z$1T at eAC~_~Nekli))~R&$8b5|J5y1vCXOnd)JG~)zAU>Tnv^q(siV~Yt4z3Gi2GB<
z?-w%nBQ}P)zk#`5_<!9`<S(zDup=)<>5#WGRCra^UM5T*t=hdYR3spA4e at +4S6ZIn
ztP_{P9+aO1P72RG<<1>LCg_Q*JjgL+Ozg!x$3p)U#{#b&$bqNsb3O4Ch?53yG_k!b
zh+wc5%{<<CtY<9~>uDx&3&49H at lOGEUBdWN?m(7Sk(g$7296>3Ywxd!Stnfc;AiZ0
zlUQrVF+rEOk}7L at z&nh&dX76Q<QyH(#7kLxqWnel%8+IMDGMc;$i!q_s&%lTx1C;H
z$*is8W%LbhCb7Zv$_wc%*rL4C2+sp=DS7uS#CYZ at nC(n#|4QEPIOdW*_)5^#^nfD`
zOIr{DOuB+#E8O0YrK*F~M1K-%x1A>UI~KxzSIxu(dan5s6Bm#No5c-qz4U}=pO(=N
z`tnbuqW)n|3zd+V5nzZn1wZZXCw>)htpAMsc2`9Dy}t=$p(09_35FsX at i~5*T+)O?
z1e-4?K+HfPY<_33d<R_-b`jeJ=n&1&iNbVpV2zQZkJW*t+n?ZZZix-pwh3yX_m4%2
z1d4;Api~hZmCJ9mZWo6GXDA#{{`$oZJ#y;|A*L63FeC{x7YGjEUhqXPNYdq~Wv^;s
z+gXTfGd6dHJ;q%H{-tUT&-N4UafWr?r?F&Vv0$mg(txENOAVH4EVWn~u^6!Eu at qx5
zV$rNK1 at iHp+gR_y`Z}KZG^Mct10Q&27{2Y=7onF1;Js;>Kifs=2cAdyc<nE<Qpj<_
z0q+IgB->4~Het577}urquGB8F4zjLb3BbY~l0Wt at 9M2k<xOp=$s1HOkuil}2*(Qv!
z&|^uSQs^DI;CdSq_k)Y9T5K89&Qe6C?k)f;4)TeDqihA_hPhii?S_ye!`UHva8k}i
z9DakFYm-%NgDe`ip*v=Str{}<Po5YNU}~+R_=C?m%_6Px1A?htkUe?jm7Qc!j;|-L
zjJmdEe%#oW`Ic|Xot9?|b4=PjN<~>xaaBc<(LV5>?eY?g$>317e`Ax;`;v;0Cr at F>
ziBQ?4*w0HU#yOKA2ivkFjUC+b$kQyvu_Jbk=X$${97`(B>p<?}O3yJoqky?5B}tQa
zQJ`oZ08WB%>Eijgx5<#xBLjcFrrfr=$T7614COMYb$f28z%^^Q0KCYNpnQXb#3V<^
z#1jao{;Nxz<=Z<$MQ3H9sb^K06NP6cZQKwhPK{C8jBS~;j{Pyg_o99_vPLMH)lVtK
ztxNAj$|5c4+{}+yeXBbS at z7=7qmrW5gA*${?(d-kYjPvs9+Iul4#}#tpUOm->#yrJ
z<z{NFxg5k at JzRF_OxRuu4*8|I*RiY`Uz2UJ=yW at n^>tlwu0k6jBlit!{bkSUl(~=U
zI&f~)_<26FwrZE=wqU8jy=Qe3b1yK9HMc64?ZT2*o}E<Tp0Is`DL1L2>cZ-((MzjK
ztIn|rHq>HAz9Lp?QU$i_42P)NJO$?03&CNu4p`+%?j838oZp{R(HE6eg=-831@@&$
z1jAZvP-8nMsoas3R0hA8lFZfiRa7pv6{E0eu~H!0oxobij+WI%$?SdGFR;MDZBW|u
ztdVtV4e#1=S))mnICjcVi0!*cCD=Y at C<qQ~)<b3)PO3oJt5Ak|R#r@&I at D^}8HaL}
zaQEjGVqMNn$t%FRl$*x9dlKH2!QGFtnMdoGa;Qg-GHb{W-v1WsSKn^F#sdzGw+CfF
zA7!t`wMXDPzeekJU&A$#?g`BGhj460vp!j7P;Qr+bV*g%&NC>2!^n5w8Ds7VLJM+*
zG%`F1L&0H{1Hv;;7|>r&ie!`SvTyP4otD5aa({#Ne3kuz at XR!Fu3aR1;%)Zt{CoGw
zx!)kaZ?Lxr&n&??!V5a-6Lvdv!L)OF?Drv-y^r03eG%E8 at U2Mps5iTZe@{W~9f039
z+CC&a;av<pRQE_{<u&1n=f$uS91K<PN4`72A8D)O-}_dFYwzIN9rgpjc9pW4V9!+8
zQiW$0(RhanaYIwt4Gj0to4`J4+50@@x>Rhpc*^UoM?2BlzOkCIe;l!mN7!myGqOQ@
z>3|(^>=V8RpXu5i1sIcDmD}Jy<9c<*@Tu;s_)z3~@#rX#=2I3Hbf?gOld`DK&{uZG
z@$Jo-A7*J69f;Jxc2K5IQRPENOT#^$xyKQiN?BN;h%F3=9lvMuqjn8&a_~2L1uTb+
zGgQ?5d#nrmY!y=sh|}orUC6|=XuE$K{aRG?rdD||2>E*Wy+b+ny<D?c17G$HaL2d$
zRd at eRB{BE3_AU(9cAt!FxvwH|Fx_qv2XkM)H%?UamNw*SH~j8igOGzu8U0}$e0x`+
zo8;l1Qt-|vHK$I6KftC5-x%Q!|6vkv6u`kk-!yZw>9XxTj=j*abcp9V==C*SLU_xl
zqjV*7%($REXN*1FzQ>Tar#~>UxfF3(;G-Yg4B6dV^6}|##Lw;J+0SI)Sw)<5mg7?9
ztd8EXQ>7uLs2_%ZkN6Y139no=t}$}t<h;O0sjP_WLX5Hm*geE36Yc at b6I$>lm)RhD
zge)WZ5XFSEDFrck<sPmWa6#<uo7|4P<iM5b{>QndyAt7nXG)N#tB?b32frNH=XYbA
zmit5 at p4AAfG5B3(U7=LJ`15-Bz26a^%dX>yS at A7^j}|tIM}HWPzm*EyG~(C6`SJ&k
z4JixScOJw2i1;k>48mR0cWi4Xc>c+ at OiVbuAAqNzmG_*uczk;%whf-`{khmK^K6Ub
zdCv_Kz4dqKt*_%a^f1F9v1LKOm?5Y$3<@lUAwdD^5FC6lqYgiEj*52BL;3PKUOk*v
zTmQOLTUb~{un;ka=a)1`)gbpvtvG%|t{NPPb>L5nojr6<wPj#*<7)$>NPRPUyAUxo
zW}6!v0pP83NjKc#DDiywoT$f_XxvTYKLN{mAxs~fPH^M_ at w_8TOmEF6JpN&N?uxJ@
z+$cktRYqH|?8h<$TeWuJe)3->iI+$`##-JH$VkxV0+%}I9mGd61?`UqUg`G{Cl8y^
zzCaxNd6?AAQRD~o<pmCtIwRZh*d}#@cpUmNwo9;m8Zya`*sj1f_(amk^(N1D`XX!-
zygrWae+Ap5j`18}Ahv6;eHPDY#C9#VJ#`#7T#fAxJV(w8B)m}!55`^Iz;FYOe~bTM
z<OM=52lpE9&vZhRvdzPzBeFKLQ=*DaO(%Ab%#w)--M6_)E1&lju|YT%?k4(gnzagj
z&%|y7XPb=mi&*AcgxIhsaOU_vE4ODnTMv849&k^{PaF~C=?a+tFy=TZPTy~wT?o96
zFZjQKanWb>9kbq}#q5GJ8vjOnk-wqu82lwo)YoWtJ?I<D-8X<Mk at W1s7*ZN1LY~T$
zkY#5H at 0Zb9?-ND1Hw3 at X&nvnfhrG!Guf~`W-1sX6zeJ>79K;x<;x7x7A52ZY0=!?!
zX(Mvm9bwmu@?Wtyjo>Fp<?iTqaQ{ts)Q5{<lZE}<UdR3Px*;@&;A2PUd3BHOLH>fb
z{l)eYY$qYV0r*#N-)%bu|C@<w#F%XX9)gJhM|tB&e08|?;<xCF$);XTo+2fxSFFW*
z^@3c!`4Vzc?;yNmVMO;~>h9;LT5A>h<T9+wiB7|tIo#ywy9|fjyx=Q@*8yX+jQDWH
z2MO1R?b?67m3NwzgSvrTzi;wPaKiNFFj)18;Q2M!>V4vx>R3gnt2h_!_v#zf{q^w4
zzZ%79G5e=IEH}8*o<N at O6ymQEXP~br*!iPv_-?cZpE%@niC`<b9l&k8_nOlh4S7)0
zlju;u*B6I6`3ZHxT*vz-{6vY&IVm{@y(TgE3dXOUz<5ofwF8InufB0~*apCJe`^dm
z6Tt&k+I?#_aEra*kmSvC$OtZq+XTPK$~NHiN1K)=IUCuT;Tx~duu@*VXcJ!06*Hlq
zLB}IyV>o0I$-hC&_tqcf;MheO;5XYtV%xX7aKC}MPEX3VH;&n6%1Qne^0LZw6|e<~
zc7W#-ecPjtg5w6)Mf#C^nuKcw@$b9k at Na&hC?fiuShh1xP}_G5`dQ^4{~a8Ah{M$J
zmeQ%v6HgKB-fL>S13E5m0rX3PRY=FU{05_gE&$*4chFsFtdC*6_rIQ#O5$dC4W=91
z*^ZOR*G3ni9w&srf7+Ynm<`+fQKCl+@?e`df?O|&##xetrbN7NWBLgB=IFC1JGj{3
z12z#Kq5D(ZAK)*94A2GJ!jW5ji$r}xz=DB`$&rGX{f#w`0B>@r&keh<k#ImT{@x1M
z!MW&<?-MRVcS#5z`m!5yLONnH%Z4kN7;zQwtkDF^>PVUD;W5h$ag%;)FZb#!cL=%^
zDU?)zc)d}?a$vq7u>-jdHt~;w2fZKjKDdAA0Ac$4v|#Y-Q+0Gae8Fb>LB9ETgS}Lk
z9#{!Kz=1_lYJK2lv2JO;vl$ql0A2&WZF~5}4D?+=GuCVEwZtD8_$qk8EKgMka&>9!
zG=5e~&Zq%g1==08WIT6+6VvyVCK=0U&GUWb-9+-g#V-w%fV;=Q>9D5JWma%fqYXF(
z(f7H}pAUPD8x_$pS`%tqEd$pF^5ASJxCaj06W5 at -S8$_5hL~J;Ld-_~>8tR81J76j
z9C_J8{z!jt#=y4V6eRuetd<>k)=HVRo<>~g__I<uhnQ!@BZr2>B^~{o*r&KF$n!E+
z3U5tWMeuF{=<EZBN57!PLY-G-{2RSe<S^4uDT|V2%7h1Eq6L<)I_?Vm-%k2X!gb)P
zot8K|O&qU$4CCyD>sv$9p#vAIz at uQ*Si^iag2&&F{Wr&l90{kjC&5naexI?yn}jvX
zs}(*x<OkqA18iBBIG)-;>VYYD2`TsLYohWEN5syUouiFww`C>?A3&aj4KKLvRtn)_
zqGFu2vq>EG=i*fON#X*}g3Aru!N`9Z7dU|2i at D$kLoPOUu6Pjng;HQkxCS1D%HYLv
zXH42ejA4E$$c;yMzS{)Ri1VIy$1uPe{X#J~KV#t4(J!1idD__DtredCfmpMIlb1P?
z$l_D7dpd3g>TPFcg7CqVzX&YD1_iQ*G56fb(@sx`<n54wmygWVo9ObGH0EA6ur5YQ
z7KAz{cD&Kg*=vXmWy)KyOA;UB-%uxWfR)veb_Bi)@K+JL6~?q(uqSK!K5UoK^<FIa
z+8!*axw9Ryi<8f5hUCvvDE|-JU0EXdAdX>NcoXuQe%on&es4DTj%9Z6qwpm?*{Yp0
zF(2?I4I7D_r`?w}6P^RuWh#ZYUMNMJL*H!V3y~ytr3+->h`H$gI9QHYr|99qt+|dt
z!v75}u1buBlc8T%V>~MJaM6{QLa!{DKMl*%$n%2O1<6)wR`3kB(7)rZWNR+?emlgv
z5MS_?ECc3oBJ52n#PnZ9+~?C&ORqv){7m*?V6Ul(!7tOPTc?G;x39_l=zw%258tJw
zUA~pTut}y$F&AsZ2ZI#ATw{EMU8EZ0T|XHIshz}b2A{Gd!VLRTO>YUYo3X+?_A}Np
zO6_3NUNo_>ya8TuV1~sa<dIuSC4tuv`#8Q-uoE)yQk4er2L|Xzam=wK at UZ{SV{ZtO
zx*gCnmq`+~+JOTEeq!_+>Pr@{w-i2&G*W+K(w>v7Wvs$T^Th(y&83U`^?25@&B%?s
z+2Zr4Z89*A1Sg1msnj0S$7I#u>}-dWTq8)r{)9jFffpp_p+mD3(C3i{Ns1g)rS=<y
zOVaCv<H6Jd)^Kl0gth^UHpr`|rr at uZY?ZvhQKNqSqb>{$P#x4XmpXF*_y&|2^%k}?
z7q~m}+$q;}p*gU<O%{ja_^aeR_}`75asXE*7l%s{W!E_Hx97)_TrF*S_Mz~&RhQdh
z*##)m<VZ7>s?rf%5%EA6x9NTk&HS%^qEGv!B5(RGO4qAsEk^uv^*Xt|7}&XLf!YO3
z5|IZp>mKISvSG}`zb->=mckhL3wlezUGN2&yO48}aB6(xW45s|9~{Ek8*3%j6R=ib
zJsIo5;q(x<BL(^j;h$}#q9e5%fM<!V%j)y%`c~!Dn{~3?$Xe>B1h?Hc*Z;Ce9Vrx`
z?0#}pA*VQf<=Ri|8<96>nIuvE3G=<J<KLSS9{1Lt at x5t3q%O**BbV;!FHzRhvZ%|g
znyBlio58t2u at jI7XEKrBx<?eUkAR`_RkzPYJClaLw=xmj3`%!6<OTRiHlE~AvpQ^(
z?c2xqf8%`4?7vCo*xhm;a5ttG!5?Bo{fUB}Dlb`g-0}MkJ!IwwSzN+{&oct!`MS?=
z>=@+0lndp+R~u|6_eBxk9^ykMYzI%(RpKxArdndVV9%(hK8;oQET+J<g at 0VNv;g_C
zl<qaOJnJ}klp#m;{Zkn>rHqy$ZeS at Z&?d`jmCaz4jO%IHYQwrglK&I&^C!Jd(0jcu
zM`Y}-ah!}oKDYFbt^a=LFSX7<obp$|l}l+c_hWl8Fv%itPXn{f5_0m<)(%B#e@}(2
zlg4(z^-^WflCM!munh+3_irJ`BfyD?wg_(C03FugI40+ at lw%Ccz;lkk?$fk1&uLHy
z=?rBZ%M~=sZk#2J$k<RbOK4NtHTZuOkZlg&JIgRORgk*btw%Y|D0K6mwj2M_2|m3%
z)SC!#xxkV0W<qutW at O$q{(IePfB|0vEclw>tB5nPbl(PUGB>u1GRBVjbW at WV{n;2h
z2A%^abuzXqQ)EqHbz)p1ybDdpGgi#W9{W(4PRjx}`50qidq+7c=Fh_Ss(yU|<vGgq
zIW at +<y|l`orU$kq!WN$k8+45>2V8q?Jp(M at it|dTjeY-&?aGt#mR3k&T at f{rHGQ>F
zmw)F%)*4)xYn9T&S^em%<<@Sz_h at 9pM+axs*wm-W{`1dX$?+opp2UM^p^vLP<qEov
z>y-B5*?D9CXdh%%gnVVyE3>DR3F^Q_tM9ADcr+Js%SyD5mBCl2MZF5DwHGms$m at 8#
zheyMgPTG^TjA=*eexp*xwXo$6{~!FRz`X@|llKxmg?u- at RVfzj)_32F$i4qO##F>3
zLr;TFhkkkzIz2Mf5{wBawRd#1g<v{uUA}LuRh~VyeLBCtH>aR(j at zdnxRU<Mr?DQz
z{#oScYS at N(J8~j&Dz-s(-3tz#_azDMOyk%h2Uq4q7Dwhdq*1w)Betupv^|eig{2Hj
zxit at bLb-NuXtIP&HMFkDh`8s+RJ%C}pF6fgtKG^1tW_PwJ*QaZ0@<ZX<brs_c4$@#
zz9ZXKfJMzILfm|jt)@90c~GisnXHW2>M1Q$_Zjp<#uslu9iBuTh7*j^+ at I{52rh`k
z-w}Qmf?p;acg);+^1hC~>)Y?u0gN&FK6tVr`}-ECWwYXWw=wr#CUI{g6G>cddo+n7
zoAN&9x>nl>pLd^=GC4sA7RGiJ`F<6relL}sWOdv>;k!)M!a8R=;aiCP^V`GtBfav`
z;+_-0f}DARTz?$f$Je&4x?>yL2ClBYinX6aE}}B%`1VPxSK0?yuksqQ24n9+#+6w0
z7%Pm>$$pAOJP&m~UAHdhW;nrs_Lh==9hvdbLAsrqGt!8-a3C;9o`6YCiR|%GqEq^1
zLB}hnc)g0YuhCwXVNO|0;W>npska325R-j!Y!mv@;FtLr-<dkzb|r$bh95|-0`3;a
z1F!DW;F|YN1ui2Wb6NzuaNT)ZvAxWHk6kbLH{`lq&=<B~-bq3(xOCqFA}37UOXdT}
z_D%hb{-#-G+r;t<w1qAU8KKM@|Lz)#u2bKRr~zl})zLry at y@$tGQwdW4E=)WOwchf
z?+j;!xFNfd*gb|zYYcqh<2Hh45myy`7&6BnT-(S`2;16kgr|`B3c-h+;luD at w|{8^
zhuN%E6V)ERLV~&VZvp16*^V(DocZ$M`rwV2s|i<lVcWaF7PrB68;!nF$@-8r+_T&9
zz&9Ju97R0rSE$oct9~lcIlow4#97SnU#|o=Y at S~}IoH-G$imn;MNH=KR|PeY1 at L9;
zL(IF^6Im#8%jEt=p67hX{)|p1efD`5 at EVA}J$HDt)F1H$lEmMTGZFJJVg(>;9P;RQ
zM3?m~T%PSrlO*O8B7c01Z3^P+(pkV<;D0`0H<ROje<N}Ma3P&`=!!4TSa%Wg=rq+$
zT$5vC`#5ag(DRDPJKUx0L-5xP`W6Zh1Jhk|SL1&I9L~s_7`&0iBk{quYK$S1 at jVl1
zn&e}!W%#NQTeGak$O;RoMIX6J+E^QMdSKi+JsuNh5FfkR%|aW(93&;YY{Sojul-H0
z?(YnwElIXYx1fI}_?yr-!F9s)y^jbc*0&(!U2!qEAi+gSJ0*$UrRZ<_h%7Bkf99v<
zCZ|Do;5pKVtXR5*>3&UQJj+Xu{LaHSiL$<Oe<9lX6Z1LPUXHQPg7q7}Jdd$o1TM;c
ze;TqbIKkNU1mAtCl(gB|DvaxiW6yAF#K%eQbnu0l)rF at G3fVgFgh9XFDt#av_){s9
zZ&f~Cx4_)^6J7sx<~hijiRUPo=e#oBrlrWm-pb at +2eudW0Pb<{k8NSTvry1P+QsAT
zu*c at H|I+t1p8s#sE(w+=AQIU12H2C@?Vmvx^a*ZYo$uL2VjzwKkBj#pP9tz+ysq`)
z7HTRfGq`}Kx0Z=zky^n{t6n`2sf8{3ylwhnjn@^&17fdS9Dr|0oahi`&^ixJo#31C
zt|q*zHe7pt3xg|X`jO2CWs&{@{ct4As|UQ2C&A at vnS(WKtIl*0>_wgb(N!+*@aQUH
zW5~OXsRTbwY!fMsz_?|S`YS-Z7I5xcJBu0oG_dNIEEqRT;qR at Dfy`DNuDudK%Hn=x
zdl&2-O;gf>Rj{APU|RuB0J(e?EUz0T@<f?6k(PMI0E`KT!0%w*ptX+kI~>?d+VtHy
z1j7zH-ZN-p^QNj;BZ#}z_UyK4{4+2I5Ss|NZoKT`)TNf~@4UMMJe?NW$Xn2EoGKsn
z3Z4d=3vwFZU%j{1fq9{Ua8?2<>qoc<8H^;C9)vC=rzMEh?m at 2HYOK4if)`P!nh3st
z(NVSGl^nrz<ndS{PKBNe3^3h*SQH83E5R+v#L7!aj@}+4T?;Oiv>jEB2e9!Vo*A}=
z#3}0$d)cs~QhjrG739teMh6{6zi%Nj954+++Z$>fa&VVH{_uU(($B;`_)E!u7QY3~
z*$0xufk%jJyKP5bJ;AJ#_=~5}&lgTZAGHI!M&efCQxS~)t|Q~TBysdJ^1p<w_+Q|I
zmuyw75-9q%d-`Gcdr at 0Ryg&4!F7UNY0`6O8x`F;!jQ*!*=Q~ok`|Ks#EfJDA$o0I<
zb=pYUdC(&Cjp^{gOt+dz|MtSz03Q7VY6ELC;R^QZB5iT(4iiHHd@}L{<&eBmy*c7y
zg5kRAPtORsf-&(EhSRLyc9Omql6C?1Z%!(mzHe$?khQ=i+Bsu(T{9ik)_TONv#AOH
z<epcjCm)(*>lPj-W69Y+f6!O!)wvp&8t at dHx@A}-w0}1Ab1ueKa_#EYYYCp?q3XT}
zKOy+w5QE&atIZ^kyH_qh<eVAu70UFFRgVO6$#K{$gYA6e1SjLY+=~^a573}J$(A&~
z_1Y3g-wD`Ga;zoWJ6klw-h$Xt9rBQ6u;bBJj}brCI>c=C<&iq~=*)z30ye2{BN6-j
zoe4Q23FoG{cOkfs-DKVc?`EDDaSc~qCBBIO4S5E6)`pzDvdBS>3T-UfeS_fWF+Z&F
z6OP-KbF3QSfcH_ at -w}U?m=HPtyd69ny%`5Z{#)#*YaF)<v{$Dy*Of8*rv+Mju04X`
zZ&Z?8rq-j&clCb_ec8jE+~~OairHBW+o0aRoWxN4@|^J2LS}p?{S7fez%ctRW-F1K
zc|7NUKTT{5oQ_MdBNLqv{V_4v)qNZKXBv31F7t}JZ{MH9>Onl&1l#p+t?XJ`37s>x
zNjZsSrn7f$REDw4?3{!BYTvOp8DGK;hirC!TM6R#o;)=@=!4^NS(7&BW_$~Mcw=Kv
zTTF10l^>jh_6@(DpCohT+HI>l_1mF`J%B!=6(8cr*EKEP-mDK&wvqW%;HSmhH3d17
z5F<ov;haXo8IO3_Z;<Qc2x~>p`>R&iYSB&;-ktkufwRITdT--~+?(Zs23n7}O%XSZ
z<KOeK;}$#ZMt^8JFq~V1D at Z&s{HE!PV8fvfhsXWtlII#;Z+R|sN{#g`9|2>p35Lxl
z747NOaKX9 at ecL(tv`&Cn%B#rDehD}`yL=S!Hez7JZ`X0*vm|5m)oS>_ClZbU#9d^N
z+(15p`{_RK$x>Ox(a_g>w$5MQvo$(8 at B=5)2NzBv_$yqS at 3|JS9Ph={seX9FK(6ig
zT=Ns`q!#Q0TS3M}YGe29 at irhr8)yPQKxwq#*55+KkgG_ZCsEL~fQnN!@M%_Y(#1O1
z5P+#kokm at tTZvCC0Jw!qhmdO)=b5oI^;Tb~kn!mS;~Vu}b}Mo<`>X(8ayjO*rI6u`
zf at -|~bH?_7Sj=e at Y)<(eU-!f#L;1Nn{~Y-5egik)fWyyUi0xnC%aby`LfBgA1Uk%j
zne&mSwO&0U1LFRECV3s58Sb)}o&4Sle?x4tOf@()n{e`H<_B{6yi|%_?bIB~eDT28
zi$OZ;ep^0rS){Y{v#Y^lubkgR<*aJ3<wUg97JvsJ8+l|^5iPm`_|^|v;&@ZWUWBc#
z>OSHuWr#CZ-2JFL<Xdq57e=%c7ud^Gk`Ln8 at +gff(UBMEN3fmXd60uUHwXEpbHwEe
z<bNhSb%;$kEwrqxhHrHUIi4!vV at UTeA$%cy$9N5goxr1!{sON0@%aklBZu(Z*J1Ae
zocK{klnmb%{4B8-yKgVw;T%!PSn-5A1bwS*v*m(D_2?RKoBOOm>=|+{i|%@LPsy=$
zg_`+!-<1bZik0KXe{-hGih``jftfRU at U@H1VltK}Ls<RRmwi at Xdj;gpMrMroUV!o0
zT8+8ly+^bxVbACI7X+6UO`hqxHXHe+l<8GQZUJzNLevS#>q2r)HR1YdaKsyY3#l&C
zjhV<p47-x9XZP^e#I^_?_%{#e;VUr^{(!r$Vr=yIWM-l*5nQngGWb7jN0+PN&-tgb
zc)7}{_b;{+9)#nNam=<3)!e6Y&?Z!N5`Sv;7eaS9`q0mXdFa_c{BFc&Y2*+&{RznO
zg~*LCbGYUYzZ>Fgdr-Hyz74+lHMTIH6<<EvVvO=vB(PPHLf8=(#B}phuY9lg$Y$^^
zSv&jI at z54Je3kx|MiqoQeqQuj=n?gW=sE%NXkNE2BD~!nD_k$+S`9Yi-jb!i_G at PD
z&k};u0C_{{{)pVr;!Sz33PF8D+ttA+Gq4%v4T|&xXL?Q%a?B%-9Zj<{ST*mer{qvw
zkn0MV>yM1%`{JE?VNnom1utjcHrP^D<YBx7KQiL0#UeIxuh<Kim~5^3c{|B<>4^~~
zb8!#ze=0bP{nOnS1v#B(6pQ at w#F>m7KbOfjuo`}_x6lRy;LmG?{23m5 at kEW)h4 at Dq
zOQxJeGxf$B=A5A#W-X_bj@!Ipn&ujTE!>286gf3w-Lr~q!a1jGh+__p^GWR;ZgPh3
zXK5+$J>kEX5IcE~%=aX*lS8&M3p_cv@;y1Yh`k-Lrx|4IFqJ1?0k5A-b+bLg_au>3
z4&Enn%UCigACc))`&gCW#x7TZ7YjK&wHV`(M-qB}HWoRVqiM!>kNinyp^Oc_Z(pH8
zzO~e^E<!^Wwu#n;o=8EgaezYpQK?^6gr>Hz4P)O#?er}8hktYj$nLO?DC9dz{q{z*
z3>BVeMjeEE^55b7Np}GDb0P0QUs<Q^X(Ic+XUMiKfNXmUnB$9><HN*;5IcQ})>e?^
zq;_Qq{p54fYz46O9*k<Wy-&6Dbip>AJw<N=50XvfT?t&!J>*jR%_*B)gl~R5NE6xr
z`-JO3%AqCS{IztQR+e?$D2Q<y)UH*jO1EFqUjqyL)Up at NxNfSo;QxG9C&Q7TxE`UD
z`B at faUoT%IS4rV-CioQCZ?i<P7wHwT!{98M4jrI?KO1&r&DlX#mDS5zOJbUZ%f^nd
zGnixLIHrT#3IFD18aXwL_&4DpFSbSP*0!x<Z|5)T*$drA%DUvA9v=7Sv-SqU?EpVg
zIAmwoR>mZ%bk;kN?fQd&og8hw{w5`f)D4N<;mFMzWvllt3F*yr!ru5!@YpY0!F1a3
zr`)Vm+&5)iM^?XDwyFuX`4XlMTvDbEmcQ++hWzw5rF=?xbnbZnYFBBUvVBEYg>-+A
zQl(?drx>ZOb at 9KZM?7`226F4a)}6o7<tqHk at DJCO1AftqgnhM$yWc1d4$|NF)M^Mx
z>ys;FuVyHNIOS*k>GHD<^f6+uONG4-7#Zqw+98<svktsx7`N1e<K-&DI+fTZ*IicK
zM43`t(q(U<Ew_U2stCU0)*dh4R<*_Ff}%#0akidSCF~!of?Wpn;_~wRBVxO)eSs}U
zY-l0=&qg=>0(nmd)2=^+{invO7kO)33_f}<=FtT7t7`u$Vy}lS at bF;=@t>o<S;4S1
zfG-ky4eYCK-?NkiJX;0OZ;;0;q;)hVD6#v8;H02y_i6C%?}~inuqyJYcXAxT$_|~8
z=ReNLUq-ikbusy%B*MwQ2VA4m64mp at w9&{HKJczPeDl&XLddhQ;aZP!UsCN3Z0zob
zEM3+sB5@;^tG5 at ZEF_+WYA!DqbUE^O6d>ni0ewu}^`e<tg1UP=Jz;H-{mbAaw40`&
z<H-B{Y?zE33)>!?bdde*J|asX1}A0orKq)I2fVua2!D&o*0OKq6NSy?jBKSE^@5yH
z%w2@%{mwjZb#M|@ANcXDlu#jbu5 at 1w_ZWD|K4eAko`jB<jJz(uD=6gRj at _M(Ejv2x
z`-PL)KQa1BZ)9J&D(sEmB**61%ZQnOneMnm{#!Py2)RaPs14m(?wQE^i#en$j2?ZM
z$&n*s>ZqFcq}9y*7X0_}(W5-moMKxpeCp$QK7UPzjJk-)X`takr-h!W;TGT>UUbLR
z9ORkfA;y^a6DB)WpT#~U#rAXjWmkGU_44$8*9&wDrd}#wm)Mzg8+>G~ikIK$2+1bp
zcWh?L`<i2hQeSKww^OLzP4xU9lE*f5FH?`-F!h)^UXQ{lC~uz^c(EFLl#bPcE>eE_
z7*#;>n9`3Bj_06-O#LR1|8<#W^jRmTjNp$(Q-w`F`ks2<R-xr_S=20kYOh9oTOk*9
z at Yaj_cXZ-8s0Ve|jN9xQ{;~_T%)LTRog>&Ui@`4)q`D%6g2D1p=;^>4 at w0k_s+WNE
ztQGV`Xf_OPGgEmwC!Qg~{DJn9=u6s9&=BmuUE9n*e5NW_q*0|)^Bf9A+E%i at r$|d6
z>t7UUAC*p(Z$QqWh+17?t41W_Xu(Ti6v^g$<|m8qv8%|p?%~Qu8(Ir}=D+#!8SFk}
z4HbirC}r>wT@{JIE-kvG?!FCvLjkcF2yd}7AWN4)pVAZAT2Ke93i6y#QX)fP?mp>V
z@`Mz6lA6SPkL at J<3a`{TOFdi%kAkBuJnpd!%;CuWg0Uu^aQOGSn^afRS>?MW$R{Vg
z_rm;Hh%4w4S21N^&XeO!s;MHD`BGkM3G(V5p7)&DGH;d`wi|B)`_SHi__TX3#OL38
ziNpq7Qh@`*a_<G4Cpky;WG)6)h~ODosiZ9D+|I0%V;iO=Zk{HNS0{O=Die0=LywT$
zzF8B%MV!i^nepSOO|-WR@{M6?p0$A^0pChO>_!|b;exyFU6r+zQuN8OUkQEO5>war
z)7rqjam4Q>j%LNNS55&hH*AwfH?>^pB63fGpYraMok1F4wF>9>Q+ww;MeXA}`ffJ(
zfe(^7ieNn5r)dLSmiz?kJf({4Sf68h#nwevDhGweWHu$C6p<Zo=a^o#1<`ut(-Vxz
zQ-B*!kDS{9PH)_2RzCHJ5%<Ppu6g7<?uF0tadHlM-|Ceij~HRMu1`Kr|4I4SL1XeM
z6Hoc*0i*KK6eHrMZ&D*@6GK at OfFad`6Y&J>sST9H`UCi>GQ4^@PhHAutHv1LLh^}_
zF&;UW51)OR)o6Xk+jw>c>ub!T7B-DsKYQmqYTL(o|5ElGe;bYQ9loSqm%UcFz}Gx}
zUjy!|$9)>ySBLv*taH7KWN)z=;JeaX0uHnXa|yAPjgR{k{#C%(<<n^%j1gTGoE!;x
zgDmjxSbY8*wc^`i5y6OIo9v7AEc49l4I*$Ar}pfC?6t$?f`0jDFBaKWef}glm-FzP
zKx#`rM(#(vgXex_+LUU~_3kYAN7l?W^nNW#%zhQ^-|`HwW4&x}RY;*b^g0&8W?Ks0
z5%^X(SE$3Iu^xLKa!!4Qf4Y3Q1o*#i!QHbG_lJ)A07nr&b`Nc>AGWqDkQv*AD#n*$
zLmvxAo`a&`J>Uq>a$TPK5Af7?S at pIQ;N3=7Roi~Y{`B$v``C9w_H86wl&oI}Cl<Jb
zT<{ZVFQ{4IvATfVOW=UbcX+kW!#^#X(@o{k*ZdDPCAZ%oI1T$C1wI^NqkRUPLw+Tm
zYuOcur`!kKSo<*Vo9puI06`74vvmgHo#4Jo!?%wz%bpM+$GkS^ruJ>3W6jQPBRal_
zor8JNgGFdz9~sx3GNLLu3X0^hDc~G}9#x2Tff%OXJ*b~Okf-+`HhvHAX~`Z;_l1^F
z?Ug)N0c`DdGM-Qt8|;bUagWENPWO~&Q`N}n6HUe&<X?$p>@~Xg3(BLBf8=M_nE%4q
z=z4<cpts$gS{QW{?>5KCA~jdRThB9gyT)@5^pmlTa2T#wiZYY at +}Y60K3jd4(+>F+
z at eBCR=WWvCm9UTHN9jn;4d6WshkukL_J6{*!**oB*o<61h)+h`VE;?DlRj(mT4<Hk
z%V&)sm%%#}qmD?<xD}A&8_73tm2^1syu;w}V7Myo=6v=MI3Aj_Qg;_4)=LdPMAskR
z2LIp4yW at 3G>Z(OKLfZ|HRXz1_&yF%NTwS%`si+|_Jg}kRy9j<Is}JL^9b7DHVlDr>
zUPnF~e`cjiH<GWce!OUw1m$J^+r>e)syrK5A^7NtUgBOs{wucwV>SGZFHGZ`T`BN~
zH98H5V^0!vUcVK(5BPt}PQ<H69^8Eq80YC2OXk}%cV8sDJ at Acnc{oNw)`<IKnhbv;
z7^dI__68fq=GocAPJFk54SsIC>s{#hz*CU9(gC>z^PwE^c{1YDgzYD17&5Y}3HT*5
z@~@^+c`e1r|A%-`jQ7>h)#_Ozm(;z*!T6_-?DW`R!0Y-XbQI`a-M61T06SHVwZUT(
zvNCn}(h(Z*myR4kwH3J_Si_eTz4$LG at a+A%nAkOmJrWp+W43Gj-mCJ_=2#2=`~~~1
zNZ|a=_m=R__nbrQ=fM2E!hy(QA!4Dq3QwEoNPkROlsak(iM7|`IPvq0;J^I{IZBJ%
z*@W|^l+-J}cg4GjecRY_ey_C*|DXiE$`*G#FhHZwJ8~Jh%gD6x5^`-wtUG=#Fc8dK
zEBCGh-c&eOZg0Z1=<ld^2WdmNp1Bs=id!j*z_Z9!u2TidTyYQOq^Py9<?rk!a+?U>
znu>OV7~!DK<8k8nrR$yLQ3g`q<e!XPiP>n625*#>$i+k^eirsX*uFO5oSVIksb}a2
zggX;*d-pxy3RW!xwi^6Z_jLG9&AQ9P4&T$}X{(dOu=R-0M&Bek+hxCCto#>pvuTK}
zo6&>+9lUs4Up6B?ifPLZHcxMw8P&<0UqR*|^#F9j(#Z4Hg1vzsJVSJg(a!(qT;f!v
z>}ksmExG>AXJ|hY7~4}F!6766b;2qsdB#Id$G|1%`|{&PVrKyM80A4fTI{|NaxP8^
z4n2t{FRqUSxPkm(dAsyKWl}k(LjOr#$dv1!&|5Nze}^ewI?AVrTx2c4oLB&VY!~`|
zb(9%8v3XM$a>|>D4y2QjfA;*1;jf85$TPn|Hp*}(Lbpi-9x^4in|4sc;^&DD#$~Ao
zsU${61_lFb3-D4}_06cuX!{N8Qh!Z%y+rg+<zpP=?<Ks)*CXfU_U~7BP3~6=a59vG
z;%MNF(qQi_^2;Z-;I|e-FFTqrx%LQ|&p((@`wE$R*{IV5VeO&>5z3xcw;<th=Gw6T
zQD-XD(Z*p5bT{Xhz;_GJ>@5EB@`gKsGVqJ2fr%+xJ!1QjKQb&I?PE8A6CVAV8B at ml
zwr$Y6G)5&(O}a?h@?A|xEc%}MGW at sRC4}F{|3%{W!kXt9->=p~K8!~l{5txz&C6Sl
zzH}I}Wf3K91xDPv_+7v1Z$8><N4xjdV7ulc;H(12#-FhUIz}tWyC$w2_yIc6HM*mx
z+qZRhg^J{!u6)=hyt>MjJiSA)qr$ENSEvT{)BNAx9K=DrC~N<O_i8C=P1WBDQJy-?
zt>BpU_qJzZ9$ZD{0G1rKw`BO#lfieJi+__%Y;myLn~*yix!suWGL^xPO8P4Kelj2S
zZJR3}MmxSMLVHaJzM7Q^&Z99uDRpww1FCydI&xdwA1S1E&`rqY6y|l_g9!pwsGkR(
z;lONh6K at i*3^jc};aCZ85^ytxee>WO>WA#41~ytR$b#-%ZZGk#i8z0C5WXTc*~hvN
z>oOv9!^U$4a<Tvz8VknpGw3e^;wIpwhOqQw0Tzu_f`uGAf+Yt_HW^<Blp}>04_0H_
z2`<M}UIX&|J%E2O1u|+<R+ at iK#3E{tRln&PD`V4u>u$R+ONOzV at H7`A<|!s*s$E0;
zi9I!0viZ{@I+hf+=&jW(2kZy0u+s=XU0*f0P#u(uZ2M%yYE at r^)Mn};axq^{;as$J
zGVQSf?J*TN3fKdzCX{EEp925kH4=~K<C9bcyU!HFASTovM*IS}1X%r>EZ~?Sc;9F3
z?cmF{`sdI)6fSVcg|Rwp1uTb6wXc}Ev+vpy2O`VQwu65_A*iP0>YI=eE24T^jWJ`Y
zFW3^|XQj$)xtq1N#LS6nAJ`+G%%O!;w>?!5MrTszt{zpY)W0EaU_hKlYu4pPc2LTK
zZNgjL#qeR=V5`7=ot-I)x?(RzUR7gEr)p8m;)2uce^z$PkaC7?g;>;fi$cZ8Si6=E
zP;`qrh+ZGHSfx{UvEqVwF5uVZj3IYSoweTcj|A|YUzCz at kK{h4<H4tI=5on6<@%h=
zYxIDR8S;;Y>L4<ZfaC$zpihaZPDeht4F>59AD2MM;ZYYeoxEm7#u37Q^R;lY4>NBD
zhGSlv><jLZ(HF=V7WA6El0NBEFOb3JcfxcUK448!Q|63G{~$66$?a*HC$x-R5ALE`
z;WHbyo$I;wd<REp>xvMK)*uJ2#dLE+9(*SUOqU>gA5PwGvIVuzGWQlr&j}Qw)YUIJ
z_9kyXhFAzzzrw}sNP6GijDLi2mA<C1a66Q_bAH4BtQ at ajEu~bMI8yR2&aD;XVO)^2
z1~K;oTW_d`u5Z at EKK903PuURnjPjxFce>+~<8r at QYl(T=_V<2Au;o?@?eZ~)N`?n1
zzX<1sL6g_4DozgG8IBxn$a!fZeZjH1u<xH|<@8+0ftduS^~O}Do_E0iI>?dtHM8YJ
zujka*IvghnrW5w^xe<u14VC8*ZUG&WFA9F3=tz11c{Q(*Z^UyEU+13SuY{jpN&X at 5
zU-8IKb9m&d<jbMDOL;CP?-1Ev*Dc-gB~2fjBO%9;#{)9>cZDM1o~y$Zu+v!t7L|@y
z3fnPk$mDuwns-r?fld_~o~ab3F90*{*gMPJ{qTVY8-)j6HY;;kt$Qw#n4jr5zXWj%
z{Bk;dY+lGWo at X#I;uh15sj9H=0wN+cHkZl3D at AN;H2Ohi*nS+-*<2M{rpZluzvfWg
zvAl3W(RH;BbFv{g49`8_lQM7<<&b9=Nk0DPnRU5^PepB%79{(%mnTa|PR`Bm1hq$M
zDT&=k<zf8H6>UlG7dl@>8R4&<fPD262#4S`>UO_Cw#2k$v^HQsdV6ug%VKaz+)5cZ
zoLu?-lToQx3pR)@B`-Pf){HRy at -v7Xk+m2HYM0+<gR}D1cVYTlXNd3V9{R(Qs`wMP
ziWVWi?(2`^8{wxy4ELzj!WzZ;4%T;e&(S at P?Yr2%i?thTH`XIqkJ!@bVPHsx;Rk?y
z$hSB-jw7+1G;Q?{ijV?3F0q}c_}GddfG@#QX**^5ht<Hkt2~ui`PoJI1XPiCt`=mr
zdCP~vsRP+-s<X&{v*{;1&;5s=O4U~656(k;Gx1SgxtdOIoHtEn+S=K753&^EZQv_+
zv3?WZ_0c_>C;sq{`?{<e(Os5~@i%`jFvm_mP4<hJ{dR$QlZx2~UNh3XS~2#bQvP&B
z6x!U-A at d02N(0uzexyzw?S75t4ZlMt!8Ty5guVzF`oQL$R_HzIQ=6084E`q~MQw^m
z(eHWJi{S6Pg4|YLg^WgN&)@LT_HH4$PWq-Ul8fWnb&!vX#R;6f;G<lB(CIA8(<-wc
zuT;tw7I73}tuiZ5n|zr at -Zb$<$<|$$g!yAe;18z8?Be%c`HJ6qDT(+Yi9C;Tyn=Zz
zU!bu~Zz~aJu==NF7d-JS{L3Ew4mu_AO?1Mi*pSr%J_*9}x%#c#LJ^gOzT3ia*iL~j
zr~sI%8sw8t97DcBmK(N-BFNH>Q~~0DEyNF=bwly!5SjNztzN7V^4-MuEgbMM at wSA=
z{iPi-VT4zL at ZlcEasqziXdLSbD|o$YUB7J>tx*7zyWNs|b9snUA6*Z5TyEXy#cBa3
zpB=Fj#GeDXQ*s(y1pB~=?+zIH+T1Zq(n<{|Z~r5BI{6+N-y+ry<(oT*kCEsylr-$f
z>zgp{zT!Df%0*-uj2(Buty;|6LU>jj>m`YY;KyO`R7Qo&uM{yuMR-O(WY{A3Yecc#
zsK<}Q;Px?hyp=1SFwl0Z`LA_h*Ot>uuEh7D-&n#PTV988_9V8m_{(|=!p4^G^Xvyi
zBMwB?{X4;^4 at hqvWy%}vPDS7T5PmMi*Re*Dt4O_=FsHEYBv)Yj+j1pj&KGxA)h^gm
z4lG`6l?vFxbl{50q7ZKr1de<v6JzB`tTV8-0;7hUQnq767X;oI*uKjd<e1A8m5cka
zf8_|yw<2a<_QVmP>~WJ&=7nVeme=4P3$7KaUap1 at D<0!KY at x$uaFJ;*0UHcoRzKP9
ziAJASdHVf*Jxc?gU!y<9$}fegw`R(RPorO+28LLJ+~}!arU>rXEZ>)`b+2;UvLmDu
zVQW+!pP~)=0>`^>ykXT4IsP~~esQ8U=(A?-oE+DmXGS%_&V#WbO_ht-uCgA<e4Q<K
zl at YvTrGD9_J5fESw}1n!>{7O=8r-D`OuNXv$K96Y$>}i<xoOZwpXB5X>(J-5w83{7
zl}o2k<o_+Q79nmmU^!xZLXl51x?Xhyac7&!_8++(IW0y0dEKvZ()ilT>6BUjKH6a+
z<_a}m>sIl#KT0XB{+(_Y+6TCnNE;)ufG0Fwt?mHfgC`6G|C1?W9SNS!KYdY>j at XSD
zt?d>$=k at U1407(l!*iwNT=4ig-_zvWj}OnCCFfoqKj(AQ<9mcW2H*LY?}_`Dc3+P|
zJZnX8*sV38AJYj!gRefh_*PkHyxl-_#sdE8^ZHNh>zC*BYohWE*~vz}HgFGo^q-mJ
zt1dF%E(qO;{WYe%sGPR1zD$69MQ;5fS&O=wX8jzN)Eb*=w3riXk|75h85ibr-b0&K
z0N3y~)`!4rw-K^ISkN_5&sj^bEbPaC2=RpN{MBvB!pcYT#;j#uh60C`T`?)oMVG`Z
z&YUMa6Ggb+0~kLoe6KF4yApMoIzHc)kU4eNMZ>kE^FjJx1>sR5=Yy^VE27`FU2vKP
zte6iQ4wWbyl&wjkOzyx1cjd0t1{Y}uf-EvdF!O5dRTr6C#W%bz5<E=wdfPdt;jL+O
z8opsYCAG)GcRPgbkBA%|Yq`gDIo*|l=$l(Y6)MTR+-}<ACm(w&dS^Of|KNYz7*>G!
zT12 at j#=cZvtopLGqV#cfMY;3%-lE5)RUv!Su7-y>3<t_bzEXD5t;wP76~VGl>AQL2
ziM!QwO7bGwU$XTxub5n7TcgSNf_Gzl+4wV8vh_DD$xSTT`uk=<S7iN4+4TWsdP8bV
z1Nz-HS7j7p5b<p&L#XK8yhthJ`-EiL^nfB*>By=M$Q1#>!^CE`;WicXGdH%zTDJB#
z^gZdi0NbrQ-?4Mn1@!DY*d`ldg~>8mVbDXqBDzbDp?iSf%z_n!tKKEwmKFBh{%r>b
z)Jc>33!{B5Y?nqtwt%1P_sVm;<<}=HG6m^HJyy*t+5HC;nY9_p^gN4SbKeYcG##f*
zVCfgt2tK0{VNbNgY_wH7o4?dXUbE(+ukSZ?ZO;;kH`E{(YRygEB894zx<gkcbAR`L
z>1ljJ`fo)G<!!~uT4BK2dixq>Ua<~2KDO`@`j$V;JA3ISu4^Xz3T-9+6366+$9ocR
zoW}8V;KUUF>v$%PTX6i)|2i&BbH;31^=RN@;aY7N!A)Qe{uz84(!*#Mu4vLOgFgkv
z{Zq^<pSqpfe1GGTIhOEO3$w6JpVqJL8jH(oh|~yr`T2ozaocuZp9jD>gri**LI?dS
z)=b*)jnvTm=Hv5oO`XXBw7+0+_<OpS`G!Dw=E`^KG85Tf9M|~oL+mHfWgD8B1hV`7
z$x1rGHb7S*&+W$MJ=jNooNLDRr}s2L`S<;a?fPo<eJ)i?#=5(dAL1^zVtkwXLz{kk
z);-<U8Q6Zx{m9TE%NZ{g<i2}Lnzr2UehvHI0l!!gz-Rgi*1*Igzfth?szAoy++srB
zG~iWP)^g;}o}o%>*3vS%Dkz1FchFapXdTJ at 9rzLK;9_twr$KKO?t61;c0~`F+a{(}
z%tX%brsM^*KKT=I>K7HDE8qI%r$I$Atu~_HZzM8FbLvo*<*dNcl!~%7Z~1wA{R{f7
zPpFP?TjBioc%MTMjhqKFewjOT&+<K0i*ox6_x<U~gCei<*SCbG9RY7V!A}3IS(x)%
zG2XL0&lO2xT>l*tQ!thNh5LPyOEZ~ZC|8=Kz)mG4zaKOfz&Aae>^xWNY8(0JQRR}~
zw+t0Ln4n&Ab<3bhwsy_fN6-h)pOT`iJ5AXN*%ZvzBU_S<c*cgX+yH)9TEN?=%OR6&
zDBsc{Jn%%ZznSdw%PwaR8^|%<a>V|qx_=!i+!YBKqZGPLiI;UrX>sxrP4S*>TALi(
zd&n3XuD#T~q^5X}%Y<wHf@`brt}mWZ!~VfXzPz`Wh_?(aQEwR>1rN`X;o at Dm|APya
zL*H7?;Xigwlq{**GB^g^=Xx>tI0-iOP2B$>)+ at 07h+Kp6oFio#lJ8oNcdQ|03KiqN
zdsd9q1Y>KhMtoU{*9j8Gh;Ll~zu%32T~6$lVMhXdeyR;c-g;QGwJWD_r20gAEZ*^b
zbS~Q0FKACBhBztgwE!Rd(_d~TgcgL}T`B8iaLR$ZG82%eEk3ww$s1el!FF3uhkJZG
z)@E?i30>gw6GV$rpbM9~M(1bZSlWgdl0${qM?A58NtN)yNWitfbyrSu)#$O{Xu^3P
zrL{$aOK$8!jldF=7ObG#$hh`ugR}HYDgVY5X at x;}#YdC0K2sE<vd3Va3D|jnp0G1r
zU$zsub{So!p6D{xlwg at 53v&FgDi?Az-kr2ae1c`d{sZU9Ia+ZS%jA at Ew5|)c-`J2X
zGA5~T&tnF&OL}`*(gBj6nP8hx2gnHs-5T-szi`0=fjEq at d7eBD_DWJ$G6|~!|L1jU
z2CF`)7<D`1$)opv1aie^AuooVULi^BmXkj0Z~qQ$`OI+e;_x`XO5~%r_?)Mz>3GOu
zYXbRy<miYCPC{&u{9!%^_k?XO*iF~@NNx4HK|w?D2Rk~Em-Q5QAd9g67HgePt<8-1
zoPAi=V!ao~kKuSJ at d2|`UM$4nW|MMmxXn?!wa`(J*W5do*y4hJA#EYTe6|oA8#!X+
ze;7`U$WvKXs8slVv}*yz82PS`(RWj+Xy!Q<u^bq-&)ba3!TIHD;e%Q`8{eG-{Y1?_
ze<}Moa1Wf~OgT#jeHV-S<UGG$g8uXr@|iz*-~XyFVy=7cYe;TzL3CT?e0g}>J5OWm
zK`eFfr%VpxaLzyO8|P&=gQNRSonN)!Y1r{f89QTq+Yz*veI!??|JJrflIJ3jYpr><
z at W_Mt(t8GyH+=gu^kW!5Yl1&TOdPlE9r)`>Zko6JbKP$Z;QKKSLZ^;0-`}^y6n}z@
znFL37W{}L6^L|D?Q at dET<C-{iTWxvA)KvJ<8c!Rekth3pqt(n?04_+;e97!WhPP1y
zF37t3`tkGna*Q25B95 at HnAqKH*6 at u(MBg)7O9?N)eWRUlSjss$43DHd<RHeB?{N*`
zkSw-(_#}(5-PmR%`U at M}O}#4ESYL#^oYOaxlR(PSsv)`xo|C-+_+&|fO8JNW-r!Dk
zjouDn^j5XF$R)ZRqRf~g3sR`Gerb$e`>W*Rf61sM^byb?l at tfnz3weCkms=Xxbh(D
zGJb-nZsY^W1{QNV#!HI;z69~3Pvu08+%G7&CAP3MEB72LA?;&%cBJkjah%pBahceK
z1*fCZZTRor#lkb*2EWV=T8e2ue95K4lf?&QEKQ8sUhJoeE289?l|lL7MmBiA2YGEC
z+EpvDWyD%Yei-nEzG5B`L<8$)6Fc9ZzU0~XlS^JG<wFlUvrgM3TT)v3PFULOUf_DL
zBc`B&;2FVnniKZe>t11tU!P2q{y72mkTCK;Uw=%T8vj&S-Rms#i}ACUd{ep}%LeRw
zW0}IA+EYtxAh(xbd09{<j*p*ac^<q&A=qC8eQtt(yW{+pXDol(@|@+REi+d=X)}a<
z_j(up1M{Cmx+q!r#=qXe{Fij1R+12shWlPa><GAGNZYc%ga4GnaGM(K1TP|Iwl(0V
zPY7wmwM)r=WR4XB5B>uA_Y5ED0TOGAa}ws9!TtfZrOdY84nJg56XGe56C8X6u;T?D
z8IP0r_-n-GglkK_guf8&`}~b5X6loB+^BqDkk1ewqBy`grqnu*bF_hdp(By1Ozx}G
z`=g1hOn5E^Snm42zR<VI!);Ogq at R><SUegFn^VGo(p|qHx;bsP9(kE8j#G%SGuteu
z8-w%ccq%JA=Jij8wa_L0L7jHA`KLNE1i(@7uF_XRP5}42pV(Br4+lSuzJ{@m<bR=(
z9BV>&r%QQfV86DII4W;&@#9-ox*y*v#q<75p65GZtDj@<ZlkKnPu at qd<x~wNJgled
zeg3sIrcuLf5*u;N`mIloUn3D$!fvZoHqu&N^YAyk8u307_q26G-$-zXTSG-Rsb0Xl
zcMqx_O!Yj^Y!luGH^;O_@;u~WlQQpOp5yzD=Q;3KeAE13YYd(-13KD(&&FvY#-5D)
ztlfX7y4os39_MRa;F{spz$b1N_lL|TV;*vYe&X26*q^22bu>aZZG9^2$ngWn19g3v
zDJRN5mDhau23_y_8Fgb=i?+KT@(<0sdN?uUggbC(Z=E=%Zb{PzUt517c}B<c!qSXg
ze-HSX&cSzgk-RrN?xX8=bx7E$5{AbN99f>cDBah1+Z~xg73cqP_U>^_*8Tr at TA{L<
zDX6!sQXGhf>fR)>lih`x8FCu}qFmxsv;$~%(7HdjdB+$7<PryiaT?<=2Ix4*X{byj
zK`oi4$U$W}HYTE$6#|ly^?Saqp?O#L_mAHndtBSK>+n9mUx(-G`O>+k*-oN7>k;eq
zq^9SgF!pkc)`K|;eh1r0U^y7B{U1h7-R;QZJ!}KRxb-4`2XG1R!mb&sIpnWGEX`r$
z+Sy>cgS<V<CHwLHUE=?Rjh1+Tv&ctooq(8t0N}f#r=|eMod%osI~FN$DJv%IZ<Lwa
z$6_D-t1|W-5^4G>MONUrH`%@bX22KkUx&6x6o)Yy;G%D!>_X&Kz&NJ$n&b8fao=f+
z<;vYj`XJ}`sDkgMvNIUIq;SzLa6JLTD#{V>Fp<on9jbC%2drlF3Ayvv82gBI9k+sP
zw^uZMz|4$W4%@<LeojE$k2$s|ckt_2<I%qRZC50N7z2}rF86#l^fB3>LJgFUmpvvq
zV7<XOBR|)szHZ4Naz#CZz6ECo)6AqXQrL9PU<?^;5s?Ab8{3O)ca|k<wBj=2QRQ70
z52FnclO?(~^bTY<9c=$^i?5>1Hk8<y;M^blFBaHDXRsC*D;h<|sBK`UZ?T=EIlIPy
zIs4L3t=gv6vo~3NAZ(<-76g6tYLjk7O~8vSYk{c>a`3GMZmXAn@;zJdSx at 1aZI_GB
zz=jB)HL&~dpl{VB6a1ZFi%nBRffq4KWJQ^_fip!3Zo_KpIkN9v*k)6^vsU0OM*5`7
z(I>FQ<WXC&g*<mg&qzBL(HOq at 0s1Z8G5?3Ad$s$I_K5H~=_TDA&x#%buT;b9PG6U_
zBE~;2Fjrcz?5V4H^Rhz%!rEm~0qNcOOSW2qCEH?Tn?EUN4OxV|wx45MwJE?4?(?!2
z+S6mHU(v!zaeA(<%|73HNt<ej$EPKnUB4{fyOK$7Ea_o~YC|-#0`8h~79IEhJJcRI
zlNZiyh{F8;oUh3($t^q?_QIgOI9JuA-JEX8U)EJ0MK-;_<pn96?uK{_W}D|jzy%;j
zbzk=dCsry6wp~vDiHH0%6uW~QP%*&p-SB%ZFx{`9OAS0=ig%d=T)p-zg+8PPyt?6W
zgnxx^l<j1afO2s4s|{2`m)@<Z;%|bjchLKKpeoJ#g~@C3%@N&ury&-YsYRYUT%#@?
ze^9L%e~@VnXf|#4L(cf2wIq`R_y6qCuyNq-WM6+_wY`kPD`cZAN^sZS at Y~;&-V9v_
z at Aa?*!k4}tT&sI9&fgBM0Cr_RxM^Ppuj+7MaL5sF!<tmT<?nL5s>`%Sl|s8sB`pX@
zrO#_x$MNp(|330mJ>Xt_p+Lc1>-g_c6&Lfp9Pu2vz${lIzaJ~oS)USps)!NBD8NPI
z^L<oe$_Hj$e3ZRV=4hWS*7 at AERq#{)=(9_H8rKCqXa_%KcZi19uk%$J!C?X}fq=T!
zaQJ0QfQO8+z?Wnc_L$$UTeymsva;A)8R+0oUMYG2IO!M#%Rm0-vPkw at Q^Z%Tuel$v
zT)zMQ)!u)+zi$`6=>GEVdiIay1>arNe?24cPtQ>D|EtcsT>tb89p?JG;AYtf>}j#l
zKIbuTuABkq%Ct<amwZ?_;!AkTs*-3UCi|2|9Ry>K!8d5}3{PDQkBij~S`3by9`@~T
zl;KG>L2`p`Nou{0^lG`H at 0zH>r!)@v;P7AXU{lb`5pKt8df1R!_`HC}Vxm2s{;dG}
z-WKlqV#oFJF5{s4MQfbb!{omR)OM+i-_iRWWf@;*RdvC>Akr#Sct<gnr^AXoir0G7
z!B=3Ho9ESj3HdP-y1lcPHJXFxpBTuz^GNUQ?0mjvS!1Va{)ua?cb at 3Iof1vH9B>$-
zZe3c(cZJfL)fF8PDAJBmB_I>ixo9ROpjnXQb13Q{c<kAr(aP}jQ-di%FT2QaK8nkC
z9rUU*i~0WcH{kvZdX+U5ZAr*P{%)#2^4*~x-1X4`CbNt!B>exY6WKyM%a^-8#Z)vm
z1$-thKBWf*h}$}5jT5E?0LzcD_$|j>xe at VjY>zsm7HwF>@k at qz9*yB0GjiWo`y7gs
z_J7BC8<BHFz;fp#eb*vQ)Hc>QYLm!*YFEqQk at nM4TSl5k+BQ+79dD?6md?3f{JlNt
zK5A2^b6gqTC;Sxm>{ZL6JHg-FqmG=T3{QTNJGauaEryr5&NYF%c2f@<Ifwd}H4L~h
z)8fOJdB#MPt$L{k_y1<5)p)8${r)2~HV!hzcBa)D$B!Q=&oPlUPG$Ulq^xI`dY~^1
zbz7~f5G~V+>t7P(k3oOq{!L63dugP6A3sM}=2S&2?7zdD-BHfHD;)Yr?xdaE_qAfk
zsZOVtMfdOjxd51xE5LaDEI!nKDAypA%}VXK0=+wzWZYNwaM!QH?;ICLo!+^3Z<XU-
zNqT>d<D8;sCGrIKSN~k#)CK*0FUik8;6LzyA~7AfM>j|+p~s(u+<<%xG5PHJ#jR`)
zxT`L^t87h>S!<YY`?TT#*u;@lMxvnaoGhEld~0h0E=;>4%?EQ$fqiW-3s{XXPs-b4
z at HvTR`QllZ=sE5x$fhzzioLmse6vh&$qymvzCoWS$3^sJWN){D2byG!T-DGtaGPCI
zuI=s+D18pm9CbS98#2!Y&rJ0>DIYZ~WMj8(!rYYVK3S$T2m1!SHVry_taA}Qg)IE|
zZ0x5qm{uma_)&%M8RRW&-wwHG(EG+Y71m4DIbF!W)i395B0mNfn?><=t3>_AJ)%kT
z^V<Z#y~~VOM4OG*#OsW6fV-*?tu<Z}ufusY at I9xkixHpRA%3y?SCR94>CLIOt(*13
zLg^u1RS)~#uGv$J<*Z={8R3Uw*mlrCoB`j!7Rx@&r^At%Of-Xxp-dUm&D^T%1y{yy
z%)JGI7-M-48+hEk-TIXvrB54q!DpB3h^5$FW&EMX7<k-)ui)7s^L`*Y)~6R&f@{#A
zSl{#A+jZj3l=hH-Y1+^n?0+A?@0|wjM3qgA=e`6#-#(!e*1 at s!8<s8w7A!;a1N`(e
zL^FYNF&OjUQ!4FY-+u(S?{1X$S+<ic%su9;1y at 5YKL>4JjPe#T%FsCGI at w;&ohO_J
zPlIx-h3xI_1zx$BM<8P(|4Ynu*i_p)dV19F{eu4Mb~=l5PdLtvl;wc9^De#(I at 0L*
z*OxB!$&Q)OcTFAl;6DG0F4at`{F*6-Ei=W$FP7Hz2hn(7g8P$%MYcF_hdOX25A|u`
zZ!1L`V2r^>9PHB;Gqyjf#~$=Nux&r1&LxDyHRnUm$m}cOXCcl5d7Dx0Oi8=7TwI|!
zBtQ%|^oVaHYFn&hEJ9{NZUB!*&@Ro5#XahvPO1y|KRS at Vvh;w7>O*>P&@18!+pli1
z!0UbE!26o>xcBVgBi>hh)pn()B<M2wC=dCWV+1L5UDGm*|5((e2zb`R6DfCLuq96<
z^p75noqzD=RA5zYuq&nDI03SzMj`Ey1-*pwP2scgGu91O{p#7M`N1s~-%nTlA~lQy
zFUUCXK#tuDOekU*6j3ABpXURsIr9Ch``1!Nk9BjX?;7)#sBF9eV+^_&>hki)H8;4m
z3;W^0?R___X(7>~pG-xRmm-EYG?V5W`c^A0MVqZ{f0m8i_BS?d>yu0ydz8kDQuTlp
zGH$#>R=!^zhTfG7SzKqyha8_SLVkMD3L1C7TWtiMthm_-EZnOP%52x?y5cj%cAdS<
z`{&%r_&$M^N4nBF!}XgLa`G{Zx3R#|8!#WMBhP?e=EBfe!W$!BVlDJ#*n_QGz~d)*
z6S)n<mGgh|U*29KNts{fznc8tnvK0VGoKMxz|Wo7Smb{W_8T4gF$K06P5+l}>HS}c
zUPFFuxv5gT16Zfz6M4cD$YU=jU5?`!nC=2Sc`C*Ycu}98o7z;3XTb&wK3n1!7=lcj
ztk6Lx3t>|F5-`r52Cn)|aRv2Hf4Kv<T7T2aRdbnmQh~Y2cB_R=Ji&GnJe at J5gNukq
zU=#dJ6M!optEnOEKm6eJBA+GNVomjeDW%pN$N;Cnhisv|nog~@mHawuo0}SSNVc66
z at 36M5jA$;b2mhydKG_W7!!XvZDk)Eiar_U&o*zb;7`I*V9_tg9R0%az3#1zM$G_Hx
zhYLQ*=jO<M#I@@Y2cVN2qB2 at P&CME^fjH!PkKn<5;^847V#&MR4nYUr)LbNP#`sM_
zdD@{z0~0no)%x_D)W#Zf(KrTt#s*;dYVp33`}J?C2l+FAWB<;}m2!yqhJ9ecUZjD{
zw+*;axpTDmX~=*Z@%tU<%lk=RrnsJQzM>TvW57!)RexLT^@Q!32yr(THgYi+b$8>O
z5#M|T>pSv}fRkLxF5Il=#tPzg#swh1M^#t0W~RDreBQKJl)Kh?PP_x-BKxSG+6s30
zV$o7+ONv!G{H&KGOlD3U9DpBj12})`GvmJ4>y}9U)}(W#azqq=>LuwHi;dLA{^j6>
zg<ZiJdNpz4_=Y`sap=9wxKH-F?V<K+tag=KKb0l|A4+ze$A{i?=$5u?rXti$GxVNt
z*tTn>OI5ulcOXohH&`0(Oz(;hyZcPhYXNo0qw*Hl2Pqg&?NnCcAyTm0-K|fHUPGRc
zNtl0G1M59Apc6|LT{a^>0m_^AcwoOqY{Yy_ at Yi`De&17#d%>Y~VH5F^5FQru_1&TO
zG%-A_hx&9nwa3Kjqj6M5$_Fa4f-`9=wK;2-WG;ziE(?;;UwJ#munVWA#pOAjfqe}&
zmbb at K?nxFr<O<}01-G+J(Sn=`?_s{4L*C4>l6H(!Bi2dqQI%v{9 at nH#pGa~2A-MwE
zg?CzsGaP*2ahGV!gV*d5KaI+T at mSCHh}?$WgPkRS at TjC?ql_!0iO;JM<AwGmnPA)s
zoD1+DZdSo2o#z&BowQ`9>3{_O70I`@3_(<bR-!NLmQ)qm-OCHDRL5-{=$m&6FT(~@
zAChG2rEA5A<=}W;mT={)D#>Xs%T#SI0bUug2C#!<lYMR+<A{eCjKo^sP3z%#tS7)y
z*9wwp>~-{#5B2^z4Bi~ro}hc8jDz;uPbz${Hax5-c|1GpoEaF<FVasI0e|+SWUJ$T
zjM+C~KL$rhUy?GSVK?81eX#}WR4VrNl4guEMGSwx#_C^y^-bMWPUFD+E38FnV`~H$
zXG+y99bamyR7LSBX#4{MQ at Xt<_p<**tYsU4r+c6vndU9s0~z9^xUw&a#-`_B7-ArS
zM^87EVUMlPlz)Mk!jmP)UCgzCJIAl}^%<{Vio;ZVL*pYeZcK}0urRVqPS^jo*DYy?
z<ii?{bFUCF99$k`>kdhK;jA6sHXefRy>jC2q3Eu5UcIIlWA2lqm6>td_qxe3 at 7D!X
zUCFq|tCQ{24h%kUUa+GqrJO3XM;++l<ic+`xsbO^*-3Wi?`RD0=9pqX+ex-K^OH=z
zxrM1LN at OpwMV~1plYfP7HwtUqP!SVM^8I*iXXUU^^nvwgWQuhLa^XCM{iZas)fyVv
zVp}2l1jlo>72;;wmt>EGtobC{G45Xzla2Ps5MUAejP?lRXJ~bSoM^D!4)?+SS;elW
zeYQ*G95;6|Cui#K$(eD+YmhTXWJ_ykM1Uw?V6fd0ePVkHSlNI1CpQ{5&oS*2t?@Z@
zz=--mu8hoOlwQ?!`OG|vfs-k7 at 5+?ixw_2}rqcVakKwMDk?r=84wC6&b{h9U-pfKf
zU_u1)Iez;b*<p>d!~?ds{9Bs!V&K~`uAx_AO|p{?jT}ngyBF_3&U1BB9{5WtFRb;f
ziFrgG1^)H2l`fTy>rV_0k}Qci^E1{=;`RLn$3pP5>iJ4VF+T~<P{LP&-0K(C4n0hK
zS6mzC-fQEU$S$<)McazVCm?6XSwkXQZ7Znlu?PMl`mp*A<n2b0Gi2?A+d at bEm}swR
zw1tf6_Uam*9&yG9PM$}4(I(CA?Z$G^Pqr(N`RoE at d=!6VixZz{29JtWM=~H+w>(=M
z=G}7fDceb$zv%S@<h2SKQ#Tl|CotcCvOV5=bLKPBUw8*0)1GDJTfb!uTVH1SeS?;L
z1(~pifqfr-+3=)Cm`P2<h50k|wD{b at uRZ{`-yE+)gh_dCRnPF-b(pierK<5)5%WTE
zKED8q at +-+#2R8TJVACF~VPhYBMN|Qv%69|w-*n=*0ecYgBcd!5_^l{c3;KbNcrajx
zJ#JcZ-NDJb>RpSPO?zMu8~eaBq?6-&JihbkJLYaSd-DMny<F^m?7>Q1gxubQ{9XRQ
z&Y2PaYEC#3B+(e{{3s^>+$pB=oV4$Tr~-0RiP0`mr7VB#30_J_x4dB6>j7miZBZa*
z9dXN3Y)_Kjdf)@Z)Yt$2?Z4`1@=f?B*Wa1rYU1=I(VF4u7}qh-jYj&C^rA<b_!-<-
zg)Ze7tI(x>C0**GQ(t#vCjPr){Yu<riXOBFEpUbXnfm(verC=(`q{JX5B<CV?WyDX
zx!7xg<38$ZZfu;fmiJyppI<kj&x4;spKn5+zmC|~pf^uJh91TBc at OLglke;EIQ01z
zr*=+1Sb#M*PCOZTMqq>IWavks2kiu&ZZ_FCY@?-`Cu=z!f|D2e!Lf<*0Q<o8FU>jd
zYq+P7zTjBbewV#l|9w~X7D5-ZOk^t07hqpl$l95H($C_<9J(7nm2A$Jn4u@<PBs)c
zohB|ap|rPXrs(f!9o at Ydnn)Kl`w&~ptNXvtOHKvW$_hrk-?Y~uD<j{j=20E_n?0Vj
z7;x>O%?Z`{>(eU>)~e?J=pXO%OBC7GR&iWNXTd+SW_B9eNc$LavPC)GS#$TD3HRRl
zvnFy<l%jw!bPO}|U<WYl<!!H%<pl<xT{9_Lp at V!LN$>Q$fjG2m<UCm&pud<s44G^2
z7l{gdx+ni1WpTM%mV~qS$})ebTQVWFU;UNZb(xc5#^%XdBf at PD`ahgl0CwUOM$XJL
zXL>jKr~5TGr5}Ue%d&4(JG-u97q8%h*0=WOrcJIir!F>mY_bG&#Nu4wTXho6TXm1U
z|0L$p;^Q9c_3k0AIW8evweCw1?>C(Emc9#k&fsSg3nbgFPM`M%Y(0juS(1qBH|8ZX
zt-6is#ga*yhyQbteP`iontw|RUCY$P`%BaVDbXRWxqeGMvWKM?1uGbD;GZ|Hl9>}U
z^Zs$HJD;uD>YH89)8?pn7sCu??>#@c`-&Qv;VpfBfiCIxXtl1XVsqc37_&6sqDO8z
zqb?lNy=AhW^;BBDJ3q#+`>Xbb<Nx?{Fl2L|eGh*F{XYDLx;QysT^g6axzEqmtI3wB
zi>KuTw`sOd%?Xgh&KJ%+rwQc4uPNzNj7E;p2NV~1_0!Ta!ud+(8k4%F!W^+Q!K`Ag
z=_1zTnIqVB{OJ^X at W1?~ibi|e7_GfMP9HMxUE{nh7}JA2 at Nd?6Zca#ua#yi2vr`jn
z&~=x=hf>BItos0Y{G?_TxTp>e4uL0Xw>_4pwacgILsA3urgaK!HuzzpHDhi|+Py1V
zRes84*?!fMK77~2*`@Vv!3=U{E)E)eCCebtO9tX(3v}K2!8(h?_jGo%{nRvVckFmA
z9o213+Q5l2myiL$Pr3;IiLIvsr-Yme$ZFn!_q at TfTbeNk<`d`I()F#UmTx+9it%SM
z{qa3;L(3^PlC5T|nCID&9XrapL&Sr>*^%eo9LJW2B+H~G`PMb&!mSc>+<-)=<W(>k
zgTLXNM0i{#^}pzy-K7GzX&hVX30#UUl9%KW!K>0m+<Qh at U@gu^v>>kq8*P_+JL>+P
zLTlIZ5O?JlV^-yqlaJcoqR at uaEJ^aaj4_oc2*&@8YySnzkU5rOGwtj`#Bod-%}Spb
z`>=F@^BCskhI+P=t=bV>)=cF##SN_45yY$TcrUI9 at 5Pa)M42i)BICoj-;wwof!`<}
zt_>UY5&ZB|7+?;0(oj{|*^mJAQ!MIRn^0hm-6{$BNEU_P68K$K<M--7$X$4zl!@SB
z?r_(Jr4Md>?YVYvyPZjhVm>uamkc6rM$m6UVWiQDF=5|w4Qqifu>OWADto>{8+p#V
zicuM-2iAI5n}NlGuXe?b!m`%jXpEUe=r|t^?lWbv#vR3FEv#zm4tzfVohRIrxL|gd
zrR}f+yF3%$cjDT4+_eom3d-7X?R;E&2-muMW?*mB;F<(n^Er1-G>2)+l^?`4GF-C*
zI at I6I4s2UF?hVIzDb7#e-ct!Y3q3=Pcg at 3dD)5{KxaY*+p0dbRoS%&IRf;Ai{Z at hS
ziJ^CaQ_#$EWuqjw8t(i(wf{M++q&7VY?Cz=zSv-6o at i28xhS>Fi1+M^Y*CbPxw}r`
zJ>a+lUPOoU^-P;l9~t5eUz~Re{6AHeWaK7IM;^hpfCST8<K@|@iYDP#LmpmdZ%>a1
z1a>k6xZA2*d7-txxnq4zfsOGB<?Ho4_~U!tN!LGKTwsp{f7{3234O?kDAEd&jWeyO
ze$nPiwg~w at YIl4KKTMROdtqeCz)J at Eo&~LTU1W=QRiMhd8vZ3ae=X)uGHi5NiqTAk
zN at y?2)!K^``f+J-529S7Ie*`J%x~?je6HQVU=^9GXo4)i!fW|Z(dKKv37H{Lfgrgq
z&zkNRy<-&eN at kY5gm>?g^s|>El2O(V8#Iv<6u^ny{6vxo+~;G!eXfG64V!34CUb+4
z=gnm%DH>b%^9s6p2Ex=eW6A^1#x<Wd41`I`<^}~PFRt*|2rSP{_Cc&8-R<dq*4B);
zYfa~nJG6c-6Fd+XE7cDK0C!VN`9_e}qRym2%=~`hh`s6K^_Y=j=idtsa_}q#>@?=7
z<tg3xPv_vT8r^I+xWH#aTy)WM)N)z3#(?iNqdOzhy=6@*;|9dCKN^{W939}|^?D3g
zDno%?BP)5Cl_wti<edM(%|9|#!H*T#G_j}rS$X`KPg?vBC?c4uHTw#BHBo}a;EuZZ
zNvppxvWck*oLbPMiRsT}<<a9#%XxZDl%brJ#~SgygfMA7KEMiA0!wyVaV at ybuQ9N_
zG{t^Qsue%)XFZu*+Tu}HdPY4M*DYRCcg=oIy2suw*M5H4&-!L^X{*zT(ld_p@;&D|
z2Ey!}(mlZgN4{WwT8jL7%k`~yB-Li+s%|C=djlOaon%aEw!wa9RGz&#GtYkQR9 at iX
zx01h7`JMSJ$M4I9IRn$wy+7{V+0K at F%vyDp$;dV=_4U5KB;EVsqIB6u9v=>T>+zE^
z-J@$&Ba at B)bF&ARj`qIepYDC?we;+5_G_xVtm2fSopN at sf1{syar(d`9&@}ehNZ{Z
z13$ts*YC`h9KVXdoWU;jSFL+J&dZ!uPTs#S(A)1!I^Lg~<9+9e+*<vX+JR|-UVgUb
zW|^0IuxYRQSo&TMt6zoWnk;s`TR?*PK}AAvO+%x-E-^2#V at k9xqLF!S5PRJqyLPHJ
zA$p4{!LI1xX#x??v^m>e%p58y2}vy|c|2~_1g8D!`|~ItWj!0uSY#zm=hzZf$|eXi
zrSC7dD11Zv{VIo2LqeE#Sv<HiOE3l!+35r8`D-^<n)MQ?Sucy9nnd^0y;vs?*<PPn
zXav^Gc6m!H)|E*%Kj4h2_krVt>GP{HX6Jr{y;7@|`<38WAll+rHJt5N at KUxd+y6zs
z0ztNIe%uCLmO8bB{?8Lj1i*{fi+0xVviNC`H-OKIJa=O)uo at c4#T$>aH+iuVO<7BD
zs(0lo%{~`3`1`g!&K^BiyESad#ll%zItpjIY=9ncEFpT1>#ga`hsGk<{BO*f%)TRT
z2{<cA3TQPekY_Bqqi0Ske0`Z6);a0M3Sh3SI|{J|4#EbmGnTs#-pW^Z#%X83kIauU
zmQ&pF$_VbB8zcABx*r?4rw8}68O!;f7>n#G?BU5H*nurWA0uz{4fuh=Jf4D2-~wTo
zxIA!5W}C5m)|B7eL(hym#he?z0P-i52l at k*2S+)MX^P8{(hlpA6-**?QW0%W8n10i
z-5Q4HV{a`qNE06o6$y;xTbkLU5y}0Z!=LSVKXhAeE!#5mfmiAs-R8H*mwQKuzFd!W
z{5rJ@`s;O+p>)>d-)27Z7|L*L{G&`Y%29=K(EHW&ejMX)OvX`$V-oTsDyTfhSCIF(
zxJ%_ypo{P>0$xJ4Ejpm?;%2mi-dH+273E3ke-`D at aqaPYc{Y2c-_dV=>rTnju3VX>
zqf7$G=fuCO->knS<ghnq5~NH3`Q`lT8P%-<@qkfJemAGH4H`*{QSWpP?Qsb0fp*~9
zBW?V>_5imy`n2vTr*nM?ks9Mn_d(V}cvKPnnhv(`Ebn~Ej}3WbrPrFF at 8-C&zLBkc
z+R$2zjR6|N<V(3-fOq6^?|}dRuioKqsGG&$`bZZ%yB62r{r0<c{9q`O;@_FAG-lYf
z?#F%>{(Z`??s#q<>HbdVZs+4zh4MAh_=?QzQ(}*kTso|1j7;_h&y06bh$gN{S~h+q
zQ$_tbMjJBVqGeJ8vRb#Wmm-s8`8$;IrlwS0!DCyHlSuCvQ;2z59GMAx#o*7=|30~+
zCo;1^16{F{#x*z2(T|adR0bS(TFPnc;`|L7Uy(aU&Ksy~_zhg*%oJm6B=S}YlC3_l
zspGjg_d3qCV2 at Ms5}5<wb3KT?vd&MY*7(WJCl5YtPGEOw3VAC;3z_Ow?S9o=jrEtj
z=D=@yjJF>B%!lpqkGfy%Jw5ENb-&X4biWcV*QkdgYIa(Olph6MjIFN^PpisXms+9i
zJ+Eo#F})qF49|JLch9OV at as&F?7x-oR0|AK`m>w7W)Hh>OzrrY@|gA?nxA}g%y0Ql
z?WE5&l``J&{TlZAZNDv(2Bx;GaZx+;KKQVp>)FhB)?<!mS@!=gz4M<B&(Gbt5<Vq&
zNBJ<Oxw<|xSuwh|SrZvPxoY}4*NPcaqB$K>dr|&B%YTCZZ_WqyBJ#mpl3hJra<4u$
zR3A$T;h&M`wu*WGRz5Sx>9>D)*RmU(s%ePrrFTxf5t?2x<MdH*L|z<MM>@7t^=Q at q
ztj9r%zr+4xsTphyv`A7<?<L)MqzuRv%9Vj~XF|tz=(SF*L(_p#>Xs%xP%N#Vs1r^M
zsI#T@&*c1W>k^_MkACQ{x~^xo+JA&!qkze at JtepZzM{|0luPSpAx8Tl9r at 3YKLGeG
z8^b>c4vy%>XVtp{Ui^)G0`F+vAzoT_Dw{2kJM8iMa!h++C-!xL?@k%<n-B4CUD##;
zc8iXblLMU3U)ka~|3fn5+hD>;Htl0$2Li#BfH>{jpSh&~GyW>>58st0h8&_>dc6XC
zR36Cr-6~t3z!zz4sZLpc*Sf3vwA)pG*FLCf<-XJJ`#;-Mwma~r0gD&#;?J1 at oo8}6
zADIQ?CQDoie?_<I(t`bVa2P(S5YI<B$S*f2(O%S;4&L+8$>3Y#!T(F#O;5mQr=G9y
zUw#61^S%WBG31l2q<sngg-pwJ at U+CbSHlhnUmpKrz`UQ4GY&TXAaSKd&2d`mQI0(*
zM>%ZpG81 at O;5XO^JZLe;-Lph`{XsweLGJrv>7%n=!|#Qh-Dkh14Ex+Sgbx)DTMkOE
zKY*N=#4Ce$L<P*drD5_t*28C=i{B2vLJ;<4Ry^5K%w8T?2VT7(39ux<VZMr3@))mV
zc0K7#w59{os|C_g%i#=te8c8F(x>fVH#q}y42*DYk-rMulSK}Eq*G_dAcvJK0~T2|
zG?U^8DZUbZx>&DDUN`y5fJ6PWuTIbQz at HuO-tGrX9$PQkq-cbl@<Z$+i3~6vojx3<
z*NL9Tv;*g#4c|;EyH at -H@|D~`%p?~xGPkO8JbV-xL)demPf)%?aJUf{H09le%=-KJ
za_g79vCl69{;llp|L_&OO7>;qJn;CxyU!fb;~Ly&eH1c|QbM^?_5%l(P5HUtLwL72
zUz#`_TyEqedPPC at Iq;_}6~j+N9J{|h<M81C2U|?}PnF@%OoiX1f%DzOcl6?Wy+8?j
zTLSqH1^MT}eI at SdixPk2@D0sj?v{gcxgrl<HTf+Xqwv0fi3z~aI&i&zYR~OO;CI<h
zeFMC!oCkl4?G14t{HOH%$#<VQq!+!Y=!OoYz$axv9WVz&sGG*VcfkRB{et at LLkkXe
zAB5kl3i%EVQn_2rf?|6K=6osk;p!cy(8l%P-`F at 1F6jUtSBgc)ojYvFo8?OF#N{x<
zJAez+Kpq;&&pc}~cm6o`aE!4LIiUf3 at yWp1I@uW3iT59jJ$81gtx3GlH_Uq&{_7R6
zajKpIZ;tpf+RP{}M_cUzMuf9>+S at 5N3b=lj!uP-2Rd!*Y`MGg#OBXyv+;BVHFWVjm
z5BJ-!k&lLNWiqfwZo)l`&AiIeJ1&=Or%&k<(-3#OiPj at Kv_YO5UB^`Q$1{&JeP+bF
zPhZ=wV$Rx#OKP{c%aQ|M=^o(?TRh=D;8X7a*T;7*dEEVQ_93^~uf+fCz}9=$^ClpF
z+$i(Y at DsUXzZ%CRn`eWw at i=h%4d4RMuwKl|c*lx9BfpxRi`bjT-4kuGksXAwVz0o5
z0=%<gx9EbO2L8<({JjDCpA at z@k-b?ZK4FWPn5 at Y|uD|lB at RyPAA##G1;yW_2rpTuv
zH at X>fk-sxQZ_nh`lm?;9y87O_A`8&=Q9DN8!^MwY8DWd3HQ2kg2|hurKiiEn!4<X|
z^Z5;MM7<$N8G6I37F=0h9MNrQm&nem7DbsYw}s$F(4Jm_*bwl!0so5_)S*$Z16a|I
z at zjqmPirz#AAz$_dg0&bmm9Xn3HJ|vLml}b7o<VoN$Ha-BldknNA%ZkV#Jbm=JuP#
z4JbQnGDy-<mvc?~g*}ckzPzp}Uud_k#u~0yXLIW!{N9c=6XhKx)l8Rh7>r~SqfoK>
zrNJH7U6VCefM3{ye*02be6Owi at cU=Sx=(e6?lQ%?nxBbw%i!8=yYSra?FMWwo-IC1
zYwtwJ8j{@peWFOhh)~WKn>#-Qm=Jj*?B1v01EBI4r&AlIAeLULa!-KoCMGx;>oN5S
zyC~1&m5%EIw!c{1fM*O_41{az^r3r3>N$z^RizEQIMN??pEVEtF$(=L%3U!u%BzC<
zfNWj23eaAdFJr40B- at Jx)$qM5`fH at B>6ucMw_2)kCx20s5cLwD0H5Q-wmbe=*JYwx
zf`AJf`?JLj*!Ns)al(pz7JG1!Tk;4Nq{6aWT!FED-8y<o?w at fZPMuWd>jkEFFb1ap
zXM=r%Utx<AP+px(yypab^3B&}^#95T&zkC##wt9&+$~vCCc1 at OHt-E2E@L#t3|DWy
z1~?S_C!P-<p9X8!{d*_;Y#0woG~Y3Hmh!-(i2eiLzm1V>#r4}fb=4_Nu{|ZObrC7X
zJUrJIV-H-7cbwf-R)*qRg!Q&JoH|X!#Z~CaaS(n#kDq-~k2#I<*iK?BsL`KVFA>II
z?8)j#@I_5&8;OrW><h30SgRd#5_ztdV2&n;yW+##@7NwkIbz-E|H&3#^wAjDvg0Yn
z!To!1Tg~Oh3GG?k_G1rfflbyvkV1Cm at hiDFe(Z6G7mil#=ec{;zz-7){W;mz1R1CZ
z>yjHkjn)xXBXnu1!TiwL!J}YJu{|YK&Bzz#D11$qAx|vq{}+zHhmhY0{dt0m+o1Dj
z5I3X$zN`WEL&S^7*<!aO;H&mq&+(Pk?Gy*HAeF`eH|ELrA1$7Y@%s+uR^sep$A3-x
z#s9GCxw#8&39Om%ls~UJ6Y|^UJ{td5*rIWvqGOh5_XMk+A5UXZSS!`cFw#2h8s*5X
z3SZG=!eSw}^_9pV>y4Rd{W?x&L0?D=um_9K_Rn%y$|!0N#6UhZ$MpooB%eWEprXhQ
z8s|)Y=SCyh`fmxE?$!}&jnOKSYF^ITQcW_bq>4#uE_UExEQO+_)^kpsj&X{<t|8nW
zbZU3POW^%=w~`$HxkTB<iZmt3{t4)RaCN;r!;(Lk5>C9Dq3+y1%_LvgjP<yzuU at 3F
zq;q|dg}%tZ`dmwMi{`(g1mh?JYq61gmyF(JsSx{MPW(Hd>L+j}*)#6;8Q$?NFbIT0
zsj#_kFOr-!XB{n(WMW>eW26@#A7R~j0PETVURAe+Y!70Wg4tt{UAGF{A+!8rC4BI)
zh|zNK4SPmov;s>o5pxMP!5 at L$MBl6h&Kh$|+yGxWI6fdlyiM^pLs`i0L^!DJoh9O@
zAqy*k?>Nq3HDakwLm45<%?Ip7m|uNDa9-Rr1Zca9`*+=&d)T+}UkBx05)S>@-~a4)
z{pAzE|G}j7*CL1855oPJJ0$b3<z)Q2l at VAQj@xdFhiRRJoO})A)q?SqgLcoRJ at tpf
z+_Up7rL-?Cn80z9xFhaIOY5WKS=i_HVQ(;crsBS=&N}pacvF!u19|COv0i20zg`hO
z=I%I$e=}>~9Wj>+;m5b=Js3+riFY8E4SWT6_wZ+TT8Ph4h`B6umjOpc`BV_+7g~K=
z*u%QkIq(+qD}nQ^XVgXyV0$_HHe|;=_&%L%-T1EC-hmi6)`tAwOmycWru)J&M%x(-
z8Dm^yQDmEOE%E>zk8G<$j)Gr?Fh4^jh99fEQ&J|HVw~59q*_*bO&HQ|pN!Z-XXIc!
zb7UW4rdHTfW#HpSOb2Z9=RTlVAWO6;$y7u>aekW5uA_-;o>k>n6uAQSZ$sI0koBr|
zq{3bnqtM!GSgjp-1%2WF*yatLd6UnsLkorrBEz7Ay=f%8T4>}{->|<g;MTqMkyCB)
zz`jXIc8fgMr=`7}o3j_KTO^r2U0&OkoMkSjtDVlIXE>d~98|qfOndlGW$2IXSevQe
zH`(42K=+G0*Z)2GQ`@`?7?%{IRcPt3VVz#@-tHSToKcdDcl#plwalsG2>8Lq<s)xP
z&~PkpL^ZZ6;*U7p@*c0@{CyN_=U0q1GEY3*Vat^}`%2n<S3fotYshm$Q4H~{715f-
zv~>C)u2I9*E7vyu3^`NIG!rHo*nZ<CH|(2lk^I8wA-`l<iii`^<07jQ9;cjLka^x=
z*ZaRzc5P}KzOQ3sy4R7Lr`$89I`gW1-cB4du13w1LtfsD|2OtUi$5B{5=IO>!A~Gu
zo8>T<D`;JxQW;_0;VwsB_TSf1U^9N0N$U$g4KmVZ)YWizExoT!$OG=k3pS*6Zvvn6
zJFxNO<G2oMKoe}0`^&D;yfzWu?)LQ*$_?MTGoY%iz5k>%aVqWo^A;2 at 3NZf`P<1t}
z|M>O}N4%Q at 4{5Ui0~tu`p|BBgY8!yzN`(CV6xLZEtV7$NS0F>zg=OplWyH_ev#kv2
zfn2|ab9flYaK2&B|EE98zZ&<AMZ1^UVud<uFV-9135rHqzsCp<^&5ZRKYrNr`~E>|
z?)`g6e=V at hT63PI40=_7zY)*8j6F61oIFo+&#DxrQM;n9H*8TfW|ZNsTEsX+VXyH8
zuOVXZT{qqxSI4$`>W(g_9LAHDI(0&pIqz9B=hf!#fQS1G<qpziSdjnN7KQ&mr+Ul>
z7X9dQ(%U9&#rmBpNZ_!Ig=W=Ysmm_pI7<9$S;#TYiJu#NqOrxnj<O!Hoo{iue1LU0
z_B7&i<1t5}3sOGX^9d%z7>uoVI>W6w(cBtuxT)l945vAp#8X%gg0Rlc`F!)yy%#9I
z=BepL?omUdVSg!qFvhZK!Ka8X`vK*V- at n$4V0uZuQ9ZoEWrt<?-91b+##Ag-dG5t{
z_>yD+7w`i+_IKEKHqv}GV?RcFe+hYI)7^a#oRMjYS0Td#E9ZzwB$;0P(Xy&e<P)bk
zH*vA;j%!vUHx4{KEy?t3?7cA}t5t+!I=|8?a>;DaDO9{-0eH=UzlHn(`A=>=H}Ma9
z?(^^ck3Cnz?YYH>OC1dks?lh#(O8>DL&kbrYTy at 1>!%#V_dtK%i5k+$cW8i}^D8R}
zf2$06n4M?t$gTEu=*5JyXLU1x?{?S_NGB$Jby>77{jRS6vpd-j9M2wwXV2b^?@Phk
zzI;a*_L?ffiI$Z>jx61Qykp<haQL5G at kffiu>EL(%io9ifg1V`J`cha;XmX|s<ghZ
zk<YCp3^~d_gKQfkyo-oIK<qNOMS-VZK<nqvG?%AfAFi~6TWri>aE$@`^+3LGm~1h@
zUyBF&J at CGA;o|}NU+LPbxV8dwyeB|^hkj4$A7+p8%6innvqH{32*0}v^322kz6qEB
z-<DA5vTsN-`oDHpAwJ_rThj<$=@72}FT7GH#h%^6E6IL!$>i*v3xEZRBdi*1!p~5i
z?ZMWd1ygc43=Od52_HIgn}IJISg#nqBW?gVsE-LxCrBbZAja7(?EMee-VoZGF?RZ0
zFfO~eHRMOEzb`3t!rfHY_gAB?RcOCjVJ!E1DSqqmd%rM;e!q8!WJ)~e3S@&f+-0cy
zN$z~9cwm0Z&8Y!qGwZ<F>Aqv4bv)!82xsRzuy~L$&-w<f-q3`c$tb5Y?9C0x6?hsp
z=cx*zQ at iJ-80W9{a5h}RAb-JLA{#Crz6|u!3y95H>V6EEtY8j920jzS%OPi^<R|NV
z at m!QCMbS%RjbuBD>!7-l{s{S}(&KU9wP4E-?(5sf=^Q>~*AP>)Zb1d+G{=jExY6Fg
z;IOIx9XHydno=ND^=d_?0PR`%^*!Fn*9*O)`;7}&^!+4^ftqfNmpQdUIkz_FLr<;d
z+O(JCs_U-_A^R#Lu0D#kHgR^ucl#=6J;3wyCt5i9tjet%{qqQ9vD*24H>U!3))z2r
z&S0v}Ph+CbcQH!cMy6Z04f4VxmOZR|+iKRZZ4+C#bvfI<)py2OZoDTGKGHqel8$+>
z7wz(o5O7~CkfM#pDoW=y;Q5a>6#>^6iaf$P{{FsVz5(`BU<Jr-@%7HW0)8U57e$*j
znt4-`$Y$eG&HoSDEQ9;LmvDB}w#o=wheO`JH=l{$4RS8>-<I*qV6!d}5#M$S?9{s!
zSD6umAVOYQemdQMGoQ1Kf$x&!8(==uI9+;x8{^N at JZzV8?TA<)n?>A(IHMNp4fk|Q
zDdLE@{JpRIj4~?&^ljiO$6kKaJ(aVALSDQlZ&z{qvIJ}DBex2eRA3H|*qXTUHjePG
z$Pbh08H3oWeTc2nwq|IGuy at Q5KZ3q6@T#U7IUZ9Z<kKQSuFs)^+l at uSR`MD6hRylO
zg80hdFC&xt!QXQGfyiV$JHM}6^b<YTcEts8Jr{DIlU~If%eq_k{zFt3^tm_LA<Ux#
z>dphxO)*C_e|pn^Thy5LpwC_;nGL$cd|W$In#$9-Ct+?4(wHz7Nl)@9=4&ZpAJ-%1
zi(+`nD5uSw-4?{41%HY29|Ifw_Pz7R9c7D5rnzFX2*5ut{>U-TE=1utHVzyg*K0Aa
z{^8B(=Fnl(mINw?%Pdb|TrC2ux81$RXFh|ts^fS+#@^T~tYPddA-G#+ABSC1j&W$f
zcr4uNi?Ils1I|Bs|9FJHz+yi3+aBjD0_u)%>qpQ{vO7BZ!%`+qbSo8KC0S1K)gR|D
z*6f+Iw=iwZdRjMQ?u^{Wr!o1&!I8ErrZR)$y~LbF<u>i*<{4+Vw9VnmFova;mF`I>
ziyZv9SQj|VY1d!A53!1hnBD|Uq~wfMhrGAtb5lvb$5?kA+Cv-_b0?JP#Sg<?K%Clp
zZM#s$SzelD%XPc1CW>CPemPHpeNA!Iju_!+9lN+%9b0xAcI};fb%PW~_4bpn>Fxuk
ze<qH5OMb?=%t+X6Y5xP?RG0tqMJ?t#Xpb)tLsLICE3}5Qffq^T{4_r0P*w376{<(|
zT#S}>2=VeGaZH<RaW00xmX(}3VW%&4=-jY5#giRK(vEqF`HZ$mp|u0{k66 at YJ!Hs0
za9rr8Zn5 at Gt=3$pT!kdBLJw*-^^8OO`_==LTf}3cbqE;m&&3~9 at 4z@-MSH$EnavB|
z27QmSha=7-Q?ZBtD%z=RXgy>HdUg<EaDMX21r9k0F-5SGTubWT|6rGe^q_!=Nzf;?
z;2VLRShRxXLZ6*qhP9-DYz?o- at 9M)VBh1lUJcH_sy at K7a?IT75>(kp5cg5(DA3eKz
z0hecez_xYnguY5}ZC)2WfxO!3wp}DIezfDR90r+%;#Ux-1v at a!Ju~$u;#FQod1q01
z-5SUrfH;N<;uRma5OIsp!I1Z=hizG0+R?jsAAAh3xjdeRyeB>+Ybj)82O&R^gKy$)
zU2dF$Z2 at u=cpve6$TvZ-KYi(yLv3+e=)zJRU(^W`7T-{xw3Ku0k=>-HIw597AMSj&
zUAP$Df0ABEb(!I50SCPEPHM{^>hH>x at nO80d%nQKkb7&L&Y&FcQhkk9ivPg#w8+~7
z`~R?qd+hLZ<N^YI|GqYA>bMR&{y!b^D&2Rhz)=peJ5pO+c at 1qfd!(&q3vzhT=M9>h
zuyx7I=>mKwyHZ~*IH at WTKUw1@AJU7ThHY}=xaG)?9fffeB^m-JfFtMb94_ZI=DHxB
z#=D}?REQjiiDL~UV=7{JdjE^fMaaGRHa|!6(9|3&@{x{vTXaE at Kx+$ZXfeQU&+yVA
zR}O5<Be{1VyJG!3#k4?|g5Gy#mB5Vt*=9m+%W;gL>-V`NP~f|q_a$N>_9N!*Wq(t1
zHI8%ed*4V59-?U#;CS#2TgSKLL$3db<C;-{Yew}D<#CiEK5lPsMorfJaY7U$Cs85)
zPK?b-lKVRs&6qCm&7>esrx|^6%~FE>t;ij57Vfbl*Q$nGXx($VfLwV40d?OdD|Qn$
z5OcrXCA}{dcB^P}mhCO%7o+?OK~s&5O3`bL3XGYz-O>W;embN{#rjay6=ie!>o`FU
zi*%AWX72LijM>fc7FCEpv}I8o3Fj- at W!WP+h;r58dEj5pm5<*q7Sq0uIH|3QXz;|m
z!vs$gGpVL1l4s5vc1JVF2YT9xEf=?24?ypdLccA5OaVNiKz!j{%O2#psTPM}t%2=U
zbfK at A)_nJR$ZIKza`EG^?JI5FBCHi&KP7ZCpWYUR?gt;uAkOD<?;6FVf|EMkHkYYp
z3rVITx$Hd2--Gl%rpP1WdX>ar*PM=J%jsE6HtE!4$FzQm{5`?sqj1q^j$$49!JNdN
z!Q81PUM9Ds5xX<&)($(faRcIk5AYM4RGf`Fo%HkD1;o!L(sHpku=6?Wp$<E>?G1-L
z+fvV!kLp3Osa)O39*w&9H{Vxx#Zjuer20>FUkvWN=*|IJ{~swL{R_FO80S*#3E?Lg
zveWv%bRwVhQf6zw4azy=l52tP`G~9FgOefrO}=4HUnBO&=c}sw<25A%WRtU$jo1X<
z=D%hYK|lBeu|TDee>Q=0cMmrfs%UPXyMw$#dBo|CIP31v8uWEL^11}D>rX$&7Pu(;
z^2Cp`F^m%J&a?i47#Xs8JSS3g^oqW`UId)L8Sw|)@g(gD3sN9s|3Z1 at 9epDD66?t_
z+p6$?f_pH%>Ob&L6=FTVMLHZ`4j=zRki9l at zWzgkb=*At621t3iON!o7=CYX|LW*^
z!Devz<cwUm`QCNQ`0onxJ8h_k>XF^BFLFL4H!1n}VDs6C909wS<jy<b2Sn`7`JJXB
z_e{tJv5I2!kqUBVI>n*u6l522ZU)}70(n6WWB$gv)uY at 7TUNM_Me3f89Et7LPiZ{)
zs}Oe$e*`~6bJR^{iy%CLZWoPj at Em{(RrmzA&#K_7C<Nc at T=<9!v1dBQc{{sMVn~SQ
z+SUnen{u~pEjcu&P8ZO){=Mxu*(PRwKJ+X-r`J7-+!EP587JE#o<<qbb`G+AjDY>q
zHD%m2IgtG*CJB4TE1N8PDQ1PQfj;owALd_sf}P66e0Fz^H|g%qJN{nuxn^SO8UvM$
zEo2U14al^0_r93DojF9D0)!Qtp9`LVUEm2wP^T*P`2!DUPL(H^Qh8;j)Uk`D3H?F8
z%V}-X`I#tl49Yg%1fM8!34V`#rqZH^Oe(qCW at vBZ!Wxo^W at 0_q25drrHc&u0A6Swf
ziMI(p-g1oDXNTf1F at ZC|6|#B3uQ!$6XQA6&4h)vu at m3*USfGOwXiSv-^#7eLxc*6J
ziHgx)ST;P9#&38!?9P{wv*9C44Lj)ENitvL!=n6j)iCVMi=+89_gza^BV4;iayL#E
zK6AOH${{CG+f)<(ON&gN_yGUk^>^5t<No#Z1hki4(TyC4W0wFI^vAgcK7F+9_(KxI
zv`QwEEp)7- at D){?O2lC_j<y;_7g!VQ*T3~T*Ca!?(m__Gm{G{77Tq7(>W}NRk{eS-
ztkZ|s!r#~FyE+%zayRD5FW{gYZ7IV$8zfvTJ~w8{IDUpU at P*wMcQx|f67U<x{%H-T
z{rn(eIpt&FtA*Vt5jlkK%9k2?m$etXVqxwBcvpY3K~g=x-hVZ8DSmSq$>`Yom;d=)
zh_k}G{$dZ>MRjXD_?LA<3?bDE at 7#&^9m3qa-&Vls2nsHq3A)7dWS>?>v}d^!2XNN^
zs24Dnzt?M`^j^KPs7{Xe%vk&1??KGiQMU|-elaKudfp8_uZNSMd#5YPI9`m_dJQ+{
zKD{Npw;tTT)|zOooj_~t5Z0TQXuNWI(G%F;1{&_b_jC=mnL^lCyB&HeYiA1+Vn`>1
z-hPFfZ<+l at 2iFDS4_ZifZK`umv&5sX6H)h9+}lkJk-(9X-AH`ZgmGni!=a1Ehu!1I
zfQ{|X{bDHtrt~s6DDvG^kQtzt|6x3A0MFllt#yKG8tW5c*BFQ^*Rh6Bow#zsFNLw*
z01gR^^&2<%8mtd^FX_#H@$Ns4`<~5ul26#h$Uh9s=e;%Te%awX$qq+IcDMwaa29L$
z at Ad?rOIO1k*tBS^EipT6U%$*wBkV0=FVcZkflMfF=k#+O^keAZ?=NNA7$wt#xV~uM
zxXxSlP(RSQ(CU$M6S=uoF5Km?4 at Bk~FA;x?OJZL>zX5fu!(1EJ*DZ)QUW&{e(cPh^
z5njn*Gq`J4uvB91{Yhu$XBqb(?)fX&dBC^Q2kyo{tO?79u3&APH?uGy%IQKvx3p(e
z?t=f=_egslG%Wbsu9o&ZO5^JkKR at 8?$urkOy^{jYp0c2g`UB236$YH$b%<mw+FQqd
z3we_fBsCWSGcphUlzJxHQ#WU}$$&f?`zCVwcU%H=?z+w_vftf)lAnw3 at 6+6hJIr5C
z_HNre<edCcJakCI&x3rmXxJ07c?kL<4SLDU5g9arzTdw#zrD{=clVs=HO((>nY><e
z?^h+^Dy+x7fmJJj1(pn0O2TP<zW1AW3}}76xBkBO$MFc=VOV667a$La4)bd+y^{~U
z4zdn6r{JFeSELDeNZ>tSYrb%n!wv0(9s*hJK7C^6h%Az9GC*E=8L|ub1fWkOo633*
zXf{qo+i)^(^?zX(>;DUXkqAG?Z2uc=5zJ3Ps)6rw!RIhqO|k`Xe_DUwY$}}0Omdj5
zn{;>58Gs#)hW^B at O^c2qhjcsisSTQ6pg+YU$8n+PjN;GbmE9|E^+<X5jg+^9>;hyX
zz*vJFA2#&+Fd|-)#z)^*#(~@#o_3Vxo^H02%7}H^ItRG^(EY5hH~{;0aQxg2u2s*V
zt%DqG4cTx5TQaiGZB<5C<j|)Bm-->!{pOR<$FOh6oq>ttVz6Hq7WN$z&$Y$5SM|fD
zPaK&xchr5Y at DB9mg|-O7WC#=J8cPV`wSOU-BFBqyHb9HK)?W(Gkw3L*KV%H;1^9=A
zKSS2=!<=mHKaO_2NPDd0u=R(P5q&M<x&2qT>#~8lit6tdHsaba+nq#}1Is45#^FTd
z!V|!{Eg>8m=EkqYFA5*APYC!OtgA(@vATLWTMv6cAahm`BXaAHCZFEyRA6<0xe{V8
zQmUN)ElBQ9fb8}X>T^eQt-loV?UR~g&@aCNmuai*RoFaqH0}mzy at K9|dma~UGTFHL
zwGlpnuyRa``Dx&J5F5WTf|FG<!+lsC+2tO(<-p51bWYnH4yRYkdxb6HJ-IR>G~ZGF
z#uDZ+_-j3ZO*_zM#M;4v3vC|oCovAZ9NR-U8F83mH;qBHUZDjB1z0N5ugE6n%*ny@
zjyUk;03R`06iG7gv?3-GeV=XX?n-9My+V+uAY|xhXgkM2>2WkHz`3&yIg-LK7KSxS
z at VxIO+?zS+1o<F~QP*ps22(!rTKE$u at 47l;k#cS2ZswOdJ(FO(41admKVTPTW7*os
zCv5TH^!*tB!|uVx;#jxF;6Je~g7ssk$7r9gw`VGn*)VV{uNUMufa{M}EGUEyMO-Gc
z{j@{rO>D^4>`>`-=VIu)2C?|BZEC9Lc>73~a>=@De^SIVUBDdYqAr~LU>OG10BfCP
z`idIMyRJ!!a>w%^pMFCAEK?l$sm~Kn26$+ at 5-@K!NDwEfx#k8gDY9=!+WRnGhGsx#
zE)$)B&--2L4<!HP7V=ceh+DsL@|f1<jya}fg235H&)U?yPdW&$>cR0kuSv+43jen#
zK(R|1k!9gx(=`pzz~CN)O(xnc8F{yBnroS0YccS&GV$MFvj+#ud4ug~N6t#<M>V9|
zVBM^NeUjFfXxw7}KN4|uHTL}^a)XWH7TO>__XlzD$oGU?;wyVaTs$;G5QXby%@tnA
zQ`dP5Jf;^I?fH0H67o at gL;hI&uJRaXL#{#Ou#pXExqiV~cV32^ZUZ)<IL{$t2Qlyk
zA%_}Q7Q+yD-NE~DIZ)fSWq#S~s*&#}=9evsK&&!+Xi<q)*IWZ{{b~6)6+SVi<zx5b
zgLtQD;2E42ZT`2Q>fHCRWBL&v8Di{IQ?(5I{-;%l4-P^;H((*!oNdQp=c!VLKQv0*
zhZxagI5&^trpY$Lt1|xzuG2L1=OnD3WIr-BuY|qG8+M~0T0b*YW00eXau*PvD(qvj
z6IIaP>zAB3QciljLdWZVObL5gJIZ4~UQZ>}Yp7tZt8dV0H`AWE;JiKU6tcWi)m?<|
zVIE6{gn|sNJ@<6UaX<LqrY0eOQu{P;TA=-Ex&NZ6d|kj&-1UXG6{8>jAHHzleZj4U
zK4d$3xiMnk?ym<<_c`$H=p-6e4lLO}`AG^rQ$_e%*hs1<cj&ZVfx%wwzk%!^V{0Te
z+__u#<FAFWBmFnt(SNwE;m??C at JHQJG%ia9W>>ZK6^G6g^9y{M?%bZ8;PBbwUKu`7
zUOpy0@)FCCml!#MF^6h63|lw2x1*Sl1esG?$M>d(o&ODe|H#VSzS`^z at Ky)YoI~Eh
zTin>%$D$m|F8p~MVlSBie7g4QPff at ZI{HbhC5wAwy}qZhjPnwo=Y1v5*7!<ZFynK{
zH|Xpx at XdFFi};iIl|!90j)$}}%II1;2h2Ig!GSig1y-#Jo}WL|*>R~SW$1N!F7$fh
z73z at 5cTVq3^ZK3{Vy8Q`BDc+lT%Msf1RCOCn!k6bljNtNH!wD|PHn!DXJYXDfrQaa
zkY~-&HNa0uc6SrkeP~F1{hHK-ueT&fI?NGQeJNgpQFhovCxOGc#8d}4A(1h_2X(#Q
zU{)pUqxcZ?Y_>9dTf^!pmImxwRZN+0P@!y>J0F~)n2XWar<=?vymTCY>w1t^f?Sfr
zD<hoOulkJc-T5zN_@`lrH~XP^1y8qF+hK*hr_7XwxsuH8$FUa28XWgSH<#>Pk2q!=
z_hiGaKu5)G>=C>gH?3bSSXjR^fwOW+ePO>pFihseOg-*14$53NzCf6gux>?Q>NTx*
z15anpGs#KU_xKUlDVSpOZd)J=`=r8?7v|JVycx5s>U`uG8yEL~PVKP;zyx=igsj#y
zkEiw8>Q~Fe`pw&(4PGIcz#Dm9A|(ly|9G|cgd)Ew`0`+9|J+ZzJ=;2mRqb5rpL#tn
zw5 at I}{4^!r`G`rs>^CnonRxEk at u4S{h>w|i#RtLNm2EvNXh&|6HpoQTCo*$YH!F9n
zT|8PHBS<mFl%>M%QL#fSK&-uWGQQV}7vQ_xQnE9Z-Q%x<AK74+k!>VmvgM%iz02*N
z?emp9_eF80^1W*{pOyGZUMwrtunFw`$Rxz~QQcE{@Fy6HLxN<89~+zu+gN_Y<i5Pu
zW)vbTx at Mk4?HiOh>9QW<9=_HNJMiL?SzCasGay%w-1!A&o8$(QEa_&_;eT&l7X9-+
z_Ndc|j&5^W!VAdvoIfdD5e{ztJi%_{u{0<yiT9amwipz5wms1hEomv7y9K$J%+|tL
z7h)5>+|pjyhkm=cMWu+|`WV{Jf;Dm=p;5d);ek1>H~xNMkhd at QVV@as?>O7dJ=o`b
zc%|x54Z3+rAwmCf-7WM^UL-QN?4Dsx+PRQ;t<SkF5}Qj-<){|(GF2fwwYpYO;yFem
zdO^b5zv{z*551F!|M}{B^AZq0+P9?lbfw>yO$#+CaT|HL-s<2$-7EGYd{6e)T(9+3
z;`a;PMH0kJfFlce4J*Neo1MbX9;tVphFKZmXX{Ju==R#0Fqi-K&_cutuSeNsp&{&R
zp)I~a9We<rki*vQWadrm{CLq?v+}1(k)W?6bb&>mJ86LYU88|#`Pi(boWB9lT`2+4
z7Cq#&Bj2ZaAG+%6T@@UHGQ_ at Mv`5i%gvjpPxrB0SfYT?Z!$#|sd6M%Y)np#`zmr)J
zWs*BDg57Zs<nCTkD4RewF^}55Wd4Egzw}mrpFS`1YN2=T$i29BWkejf^_&;E7h4WH
z%BqM`hwlULy7QuWX;%up;rFEHNm{I%CBV;M%&bAVlaM1_fEdOqb5VBa&NDo%`m#x{
zzMN5{F04Zil%gU<3wt-Wc$WXt0S!2ke7%OKed4FjaqV9aYM?TVA8n4IwSSBy)W?|b
zbaC7pjAmR1lRZp0>gWrP at s@YJ&1-jRSvLCDNq*9Bm7ljc)^AKn%Aya=umfFe at 6%$h
zR`OHeEA&}bb#4;d{ld5Q{1^6i=f9w|=dXFzQly&C%UA>ZyHiKM+erPoS-JCnJ_Cm=
z;^o^_Q+V;X23SU$K<GNsw`I$eYoGD6t)ssE4DZ^7=l2b~<J19;ws1|S at Mp!I%mQAl
z`i!DPtt)9qet0wUt!BH&e#CJ`484kbfQ2JYI8HyhrBFE&M%N_PUeCkY`W3|=ol66s
zPd0cTQu~yU_uwOO?iLp}AYX_x>Ct`2pOeM;{mm4w<bT#9qT>eg6RhzFr1l!MI+S=d
zKZS16(D0qKYG6O?@W{dB`~q;}I>a#Rgca!bZ!HICzZI5KTlW|8V_7-cA?>f)0dd$i
z at lz;2;l4hCjv6;U7V)uikKE+HEgN++e at RPx82UcRE4ahPRQU$AEQJplTm$Bwu_dkv
z)UPzo6`B)0yyd5R&}XP)%S?raJFei${9&$Y%nZlAC3|LOEbGbb(b<^usqFgRj9p(K
zhpB;V)4B0YI)1KiP at bS^rI+imV))07Gu8dbwYfD%kkbEaZURs1nPtfnHum4{{kjCU
zQfICB#@VV#S)MhzpPI{i<4fT8Rzvq2RS0><4qvpMpEMrv<dAtZka^mCwWkp84-SV?
zwQ76?a+YXMAwSxwscek!IC9g4Z#@Mbh!{yKcsq_@?fa|p<)C~eT={e;-x0`t5()Cw
z==PfM{?t&7$}bxJJ)JOVSv at d`W&AW;-{2dv at zMFeZHK*~Q)N3gI`<f2Cbxd&mO^Di
z?5W05Oyz~%r^nc|D^*XNl+^oGEmVU)Hx9XNR8Jhi2W^4pe9x8h5LZs{izrp2%YZd#
z46R{(XC7tWQASSR!eQ9H&W#t;jxS=82eSnlUM~Y3R6XQU?$K>gL8mJAEHM?C&#(pj
z!?-2|*CgYbbW1G$EA$9FN&n^Z;}uWycQ=$cuH|X at QMfkMaV_@2Qe2xi@*j9`@n71&
zhQ~jKZ6yusYvw?^Mg=Tgb8fuXHkuRG7R|MRGK^*LT8`VLR6Q9KYOs#?2%LX$S%b|k
zKHw`+E;W at p`p_A1tb&r>jM$gqyV<K59IxerJBzVjKjfX_cjUKZOTK3CL10RK4$ai~
z?8 at -=$(~u?H)F=j{rkkN0ouq6o604Zp6w65!-0*x*K*@Ax4y(XpX`m_wZl_8c!|p5
zR^+SwMqtaLaq!LGtmCO{j`A$YSLc|3e|qy_elh-g7XHjFID%h!^;?6b0=cIy!+U<i
zvIalxs^ld{(sSmQEo(THLKu~dBS at O0;>|#=wpwvf(?9ug+;;+)-AEk2x&IybZ8hof
z4(HzZ+<3KWXAwWs=GA)u{g&)mld%9eOWB(|b?T!<Tz_Vv9fQ%1+t7};hr`&L58Z9Y
zpSX5(nSbhDJLZ}8iI2nPguI?6 at NBK%AqQrTzqU(dDIZK>+ZM3)LUnR_5kJXa+X~w&
z1O9EU9shxLJlHpLM$#YJ(ZyferW)|<z0I}bX_Wb<VAqm-mmE_K=I;(cEaJ?*uw_y^
zp8lNL#lLJW$2CgrvLs)S(^SUK#((c|?Wgf<ZG4Mgi{EQCss7-=!SlxP51`IRnoBZc
zoAy#HamEp}@jon4O4YPixjt*Pj(4MW`3Ki7e6{M)ncOp8vOR at s9-%hWWDRrtsl8|`
zoZBEk9<z)WM*3-jrCj{je8sW`yifKfANb~)jOYCdE>1xHt5_=MQE(?t<D-qE9b@&O
zyJPjB at NWa2qUU`MdF>e3Kx3)L_~s)Rd)YG!`{oF5Q_g{*x9D6?$xWsEr2eD)7TYDM
z%2+PeHkF8;AK0K#4KMdtPUGC765c=?d^V`^Y;8V__njA)(fpp)qDgqDO!U0%`OKSJ
z_IkFSqBePyFxVL{`9*^hpa7fzJ-rFJ at q8KDt=Tc2PM^a69)4B$U%N7y>gHeHmSub1
zvk5u(XuKe|Jy(|=j2FkeJ1ngFQ(Ye8>XP60j1V^Tk-9vFx}>>J08hbdmdo6n%EX+?
z=H^rx#sW8|_*#_Z at PE~(LR`+(XRk&+9QKF$OyKI{<rmFTeI|_5CkndLdg{Z!1)|PV
z)N)3zR>jYxc|gw)j~^WH%%c7wJvu-;d;qx0itBrrAiExWX04z`UIhE=A>hTd>RphF
z+w4Wixu)kw1!!61*Ja`?`<{rhy{ddaX_3=6JZ<NgCggs{JEvLp<R)WHOH!cU{|1|&
z at 0wQ^Dzw7yp)0kqzO*kfK^nts*955`Ns at 0)F;()Bud<*WYk!cfRa|G<ec at rA9QO*A
zK$m*nU at sK4TWU3F*rN(e`Qk;EQjK9a6WJzjcnVJxik at 6N@6vi(NczLiuHfD!M&G?=
z(gFVv1I`Mqr3lz`Wq+2i6nQe+Szjgy?fPbd)W5O0Sdqrl31Th9%J5GLT)-nMzGO=j
zRE=viSD_w1W)}FjUk&$GTD$pC{*~Bs+T7A?AM>;Pqvw`0vW{bZm96Q`j`xRi?+ at VK
ze+Tw8 at C&y7hW+V%vIRf8Y34<LgCNtit4qbEg-;o;WsX$~MK0Ad=yz_dNh>a&re*T!
zeC7dl>e$P$ecTYa1ZqtxoOiQ&$W-IW9`dxvWr;R7+i|X5<u`K9c8jm6&cpv{;i>rV
zST%Q^^xsR&%^Xd%sa#;hv-7K`<9#>6U9BGBljyg9v^f}DrMQpIFHvCZw9x(ZKEcSd
zDL04XeVM9ddPf-ok?YfOPW+8UAD)iy`PBvZ??yOx9{p^X-}TlRiIkBaDejHWx&)tM
zTo3!n3i}|dr5u|R((r#P#`uKn9qQOIB}+$}^pYHFq=Wm(>7U>{-78v+HS|=VwtbX$
zRTt{I5P5IJPQY4FZhGW{+zz>B=BXwfd>rM>YSxcmPx%uD-f`IsoZ>c1irCpyEV`|!
z5pS^Mg|^!s77I<+x2S+w-h4gQ`z+yH-`pw*QoJFa=PS{CYbq2w!zLVJYZ1TRv<EiD
z5?bdiDFIp|;?`JYU<;$k4wVF1@}5Xm6l2V1DZ at W&A8dMa8?Op$s;}QXqsC at e7nSId
z!#YfS!0$mO7SD}u%4di_x{asJRSjr8Cej{@ya~sbMYkSdzxL2}bn}(+QplQa$XWV2
z|L?HJ2K$uGJn{b#_T_O+Tx<WW3srLsRkXHJt1OYW-u8l&Qrp at EYn8^7A|RC!!=i1)
zs&(P^zEbXmL_`@eBw+}U3?Y-S1)>l at tcVL}tw!qxxTJ<nq}JMsA#y9V{e91XZST8$
zet(?LIWu$4nK at _9@|@@SKF`zsI_50#hX^{%U3Ep~-hD-;%MQ3GRj*)lX`v4!8J_y0
z7OaI89or_n2>Rw*EzXZ;b0 at qgWZjKdXTX;AEmt<KpNF1hzrKF--*H|5FQn^uhiiO2
z`swo}uj(Gh_?LMqfkBEI5K(IKyc2X|?#A?t#s-PeR*iMm>VE^Yt2V60lL?b+nXXNs
zzmV?irdlztFJV1q8>>j3%SGt_#Lumm1CeDkNq+{vZ*x?3=GKuwO^Nr=Y617!fu7>z
zHo_OA6F at Uu_0UPImvj`jl#!cMan at +Rsgf+4(!JLH2=PTe6S1gn_JdPP$XI4G9;<|X
zE-oTBBs$?=;LFGtze2Tj$-!T%0)}Wz-wy3U#E<lqYhxC*!c^=>f;U`px`x><c-4=Q
z6xx^_UI}cyIrJUf3o~|ArYbTTxB`=+BJ}VPgXEf{ge`&pPE$sA4|K&Or*7|(egI$c
zhi|7zBYTRa%fe-6_2F5k^N*VXYT@(FLi`u<K9_2w(T-Zka~kmesCl`-qPv_s)3bRT
z&d)ye3v29W&Zwx`uHX6!wNb(^!?P}?b#3c_O;)B_klD8%Wi;K_1MXIqNMzw$$0f{5
zJ!|nyga7WPNd^47^z3cerO)#}QF&X^4BO=y?%Bid>M4aDM;v6<;14Wb;|aUoK2ccv
zme|bxU0pAY*1)eSIji=I2J%;ma`TsnuIGp1`FL^X5Zm<x%Dm$CRo6<4jT6$`t`%e~
zqMyO{#6FPIwJ4nxb_djfj at F`#yG`q#ZDa7gF^hEYrBxQZSDbKDHn$NrspDE=Jr0VF
zQQMJkCGov#GeD=|3hGbsWINjfMqez(*v2_`pb7J3jmx+=#dUG<Kk at tx?WH;9054L1
zdw;+h%n2uW7HbC>GFCD6n*;3blPN9e33upC{t|pxyb1B0V1;-c)j;LlOv69^h4jTM
z1L*hD$hWeY&>$((PXu?QD1#5D<ed7cBZF?34qHc{6*y6)`zWfxmfN>4dA#;<L5(zg
zk&ite|MOy4^OftNhBu4E%?m<o#bk}r9vM}tExlDqd^L~Ep<~)ow^G8J>3b%5JaBIn
z0bd7O#0h7hcZL4vWel#D`F3aW=lZdJ$-#z_Hwu<&&rK+G`$}O%Umv4>5qE`>b1>*l
z(Cd4_%Z&W+Y)gsilQ7IheqH*U at P7GoSp5XfCBOIY@%uX4J=L9W2(r3 at Mynl%(vOe-
zGX40RMx0HhleatT3Nm`kK8jGQAL~3=kkNv(&V)}o5JJnuRu7!du1bN=+6 at _Gwxq;U
z?{2*cnHS1bBA*fYj2|YUtPc5d at k~mdwUB3 at NP)o_+7V=$eO8o<FfjY{<wne<<G|zR
z&OYtlbv4(C^=^oRz6hS<8t)li+faw8!94OGL0bo(O##h?^}00u_H?XyWUU at t;;{kt
zS}(Q#ggIPMz-*}SxOUu(vtFrJZoAwAyh&kER~FXos0~cGxg&0P&0bm8wJoI}lsi$>
zQi6S}Lcs)cp?csP80Z-n!rxTl?asNn+q(i)ILoUswibYQ&>!&?rO{1ZS?6d>?;VeC
z82zzJeeb?UB(P`i1K-#CB<{_qkl!PCOWkC$H>_-M7^G3VWvaD*+w7Uq)t}A?tJ0aZ
zd(s&SIs%Kgc&H<e+S^cPg9GPjZHilcOAO>$M%e6zy>2OdpF>`w3|YBgUq~c3h&dQy
zPeZ-Q+Mu=OfL2|M_J*o7V84!1eX_XRBabFNA$sggShFu9{%V0zeAM~JK5?9%n^E*y
z;opc|T<``ygWqvA>^H8_EfeNoE-q=8d3=hteg?Y{Ovs9|+?E=?eY)Vo at 2pdl5gx{5
zR#6HZ2y}i2b3Ec429({B{$N}#pO3}=So_&KkcFA0QN(r=`X#F+Qdrydxb~jFBn_e$
z1<VTLS~ApvjygddY*reGY>qyWl{Y#eWQG1pi`l>ZHu#90!ujg%;- at udaE8x~flSYY
zF^&CFHwrXXD!*T5lKm2EU<u8HK9H(?8Q1EOxiKhN68zIU>o7M6*0G-drZ+N!1V-$~
zrP9wGIJffsyj=Qs at FnvU3lw>DG5Wh$sAP-q9?~ZGDBC=Vib8)&uGRE97jIRqeRiYk
zBHgOJ^g^lj(&ME8$?g5pT&y)MV&x_>4~aY?vg>hA1%D1c6u6!I>ru7o3~j;wXwlb?
zgZ)cEl_cF(67`OvTbt`)!kWwZ>>l)nucnntO3A)SCkFW08u&BdPFU*%UFo5h!2W6k
z&Vk|@JM#Mjzf1bn_tBAZvO#ayqvEKj;s1wq>+|XRTB_!U_sC$|>5 at Dl?ZuwEYEJu6
zFy~e{wX}o$zhRoEOqvt2Qj*{(BlXR40RED=S<Uw?{7B`840;34hI%m`q&Bn9_7>QV
zN?la|+~1OE at FP2w^ljHsDze28&}zHU(JQEYx-}$v-4t7`YE5;V{|R^Nav6I@(jk>m
z^(Ra92jKgn*%Q8}9Po2VCwVpq43xH0=Rt==QlHzt#9a8qGaGZ;X=_j=X8jlqJq=L-
zb5X+FGS1Cej<&0Ogn1cp;ZeHD^TT%M&(-YK+1%(lyz52#cDgPcG6o8M*6<%7Z=(~b
zTwX7I^uzDv?W at cWHQ006V!tV3&<nSB1QrGDqN4(9I~cZJ%g|L4Wmf>9l_(eJfi^+a
z$ar!Ro8o>``7)V&nR)-;GIxf{WE4x7VLC;sho8e7XEjfMFrYuw&T90b at wq9YZF>4-
z6=dyuiOqielj!yHB^;q=E`UZ^KMs61V at uhb+`F?8{J=|+xoQ``f<4VjX;0q3Ub^t9
zR<f66%I7t7!_Ln1gKn3x-xh^h-z;j*OF18ET~yRu(%}+RDDGj6lVXjF!g;Cic9rzA
zo{A{_ZTMg8DUtpixKno0VXsK&s;U%n?6YG~kIJt9pZmQerfcO$-^}oTlIJ0hf)A==
zdgH>Q_A_0Kr#9%AekTIKuO at y$^co_oEPT4Q at 7{A&%%FgAIl~Uk*sd`8>_ynapU261
z!L?4p+QN)^5&V1-pAZ6D<I{w2knkUER-DEEEzJd1m++CuI>d~b#ji)qn4g6jr<L${
z^w2r+Veu^P5c(M3!QtI;hX_U_di^y%4VxQC6B%H`kdKrZnl<MMQI+1(*tzzJe;e5c
zp1>p2&77lwFP8S9;<I^z-Z^<lUmh|beb=Q8)2_YL==CiA&#E{1=QsGg*ZAi@@Oh7+
zzP-csp{^kQ`8huCE&lmcKJOjWRq%UVllbS?`Me$c^L{?>QPfrOdtDdF^Q&t}-U(9j
z{OVegcS0=NZ7c8CN5cnmSb at G`Oe}20uuZvRVnv0bgZjPi*UVw`KPWP`CGgi(u7ld_
z-Lpg&M5px at N%kBwC2vhy!nH=Z2DA?*b+T8+#JX%@Mf9aHvA)v>#<1-}oc7Yw#lGCk
zE-Hej*JZAjFnvcJKyvrjaji+>?z2j~r)~HhT8(?Dh!*MemEyu>(_Bp=4?HuA4_v$C
zdg1IodW~Q3VA`B1_@^B9)v>^u6^2Ca9R<1l0m?!ZD*AoyI$MYC(-sf#?-u0h9!HyU
znLNP|<mS;Ec7Vqkcett78CHOhkG<!fXZAz>Eul at Wnh8AuJz9>?CPJQ8S!a!52yLRM
z=~aj2qg)Y!7D11oLtqiQefHQ&5f=*gbshD{>*|62I%n6}4%r!jWhW!pBhg at dSvnKa
zvl~f0ENivxVYd%)9i|Ca!51lJca9-EkzYiGGmTeoEBd7ef-tV2*As+qPI7%>2X+%}
z$#?aH6~gZCkt0g+`4}a}y-IxasuF#WrsGEDRzG!@r(t17fleT_p@$M{@e;@;K#zO-
zqwnBDlB8#^!~M60)3b)cPaV~RPoQ__Vsh7Uz(yeE_m=-rhgZp;%6%Gs>can8E+n$<
zDVtdpSHGLhcoO{m5bnJDptlEb5<>R2B`^>BiSl++;HQc*@Ik9_K3PWAP%@Y8-9$%q
z at g|}tPR?GcHTem^m at T!Zb<LWtx0Rt!Z^IWyZD58VBjyW7rDu+SvmXb&#rBlgtyzns
zF5T`CYIZMBsDST5o!SzrQrq^L+5Zwx15cME6udZm9+l`!&<2Q1lE^8>^{KXQ+!1M=
zYkt7B5UK1-zU?xs7v{Bvl3mD$aqb%E+rRu1J#e=L8GUBA2JEF|PhI?{yxC$dScfx|
z5`0>mX|W!DigV at vS>BHs-hYABEh24&ZLi4s)$nmtr!cAF*Y3jk;vX~E<}&b6obVmS
zLB3luIS2pg82n!|3c~l;D^-UqYb+$+fVC at WAQgQ#$Fs2WfM>pflh#2#8w-q^uHOnd
zUlQyFa2GmA-j_b5mJ>R7U^SoLjQr)0cZkEy?R$gwZcHF&5^-}&NU&>n0q{UcnTdk@
zn;(Nti0RdG%K~%K$IPqlDVF>ivf?gudsS<_=3q>%=szhk#iZLx6LoS^;?uQUL{z=E
zOKr%*Sp)P!kZGeqgaG=HRqW|i8#GcSxrgt8oY?=yeIMA;GWaN+yVBV$L~eG|=U_Nz
zy4H2nb5~beN06ZMN-zENl91D7_TH at If*XnoRosJ#OV(w{o-T0Kzot_x2xOgmA-`WB
zR0CU(oYf89X9DDbrM5eQIu-N8f5o8vU%i#(jr3Lt_&P_F(gu5yc+ at qe^g80cQ%a{v
zUt$>N)+W9|VV~j86JJ4>v84Jb{|@j=v_nSf5a=H0Ws<eU6Ewb_vl(1NVFei<ZCN^3
z8QyGCgVtI|Z-f7ZodmBldp_>re1>a$@0b79+#&LTFoxIN{C;o&cpnRJo#iH=jni}Z
zb4Cgox1iTkRB;C;k#R9y#ovDy_udia1l8qlMA+PUTE&e1ihs_R3p)fmG<Eu&&hkIq
zJIvqP0h-!D{yXO38XNrnjrthAlkyR4z1pzdecPXFAlMe3CTzp}o`dzZ<@WWy19d+`
z#_6PTp*ztN5w$WPFe3uG6Meit<%v1zT^nbC|H55C8TmZWfAbMY{5rxb2y+qMKzJ2l
zHZW);Z;`@+c1%DJAP5oM(T;ye8f}MwHIRGka#R8PR|mYntGFL6$-QZso7c5UsOq;0
zbHac-29_CX-$g&nKN5Ql)0{Y~m8Im_$^s&ApCxk>?QJ8xp2ucEUMuQ*Mf+~wxXMcQ
zz>o#BJVn<*XV2s0K}tvOaQhbiAP>^zZbzdp*wYkp_$dpa>P4nat867Ra9-?Ha}nUR
zz!&(b;-?Sb?3JsVEIfoWG<*U{mpMRt-?M=hGy4>`0H^raK(G4VDcpk(U-;d;TTm%s
z&<3R<PMYihEi(FLkM)GNlmUN__fAQp=@4O#^MFSv;T?9uZa3`JK?i2jY8yG*r{HXX
zdHP at m%YX;Pi~`T2alSMX^&X(TdoSLzf%aYmzQ#hF)lcD!pXeVbzVNPcAPRhgI{|CO
zU5jzf09_6LU|lc!PM+CJJ%V#w8=V-_5UiIRY&I~Zg0JzONY5<bFK9T1tL^H*+16ZO
zx?~RB##%fwhxtMtTEu(VdJpUoRD~k3Aj7XhQV3b*d0VkG8e=BGW+*USH0v2Tr|nX4
zzDq^d^)%Ka at Lc>Im`f*c?&+sR?0nBsw>I}O`(vTpZ$&MKd7cUE|GZ%5<*j8>W+t9F
zOq335Yu(IC_Q%dt0B=+deh_EZ!j`Iu=V!%W&K&eC08cSP5Kxe at w_-AMUm$0F8S?4?
z{#=E%wBe|&N0s>Tea}jKU!tu5{7kF;F)6p4vDHhiohhB3mm!y2gPq}n&cnVc3VZ#4
zCE)JNZoIPue5pI=&xw>1b~fZ;2T``$?slqCkvX25F4xKE%n2ND+%((v7$?6p8aA>9
z>U|4Q*6sJQ6G&OVsd%@$t)Z`+r612Edt5uIcZ^#{*KvKuXwVu0e^+hT!Kd;d%XTBY
zC(!o$!?UgsjPGNR^=uK<$zMMOUbZ%N{=V)ympX#XnXw4t5hfx`lET-B|1L$7YR$Hv
zrCA{>BTu4i59V;!!gKaM;Nrd}GI?z*Y`b$;Wq9@*_MP?gHn(q)r@!+6FzJ<jdCyY;
zKZ4J-vHce2%aF9yVMdwdR4sq)l(q$Di<3|;Dd=GS1NbC3AE=7S6&o(qXBfkj1*O=-
zm-qc!8#@DQ;8m?-+yC~R!rfRW$a?S}>jL`c(~}jR+I~y2rTq@@tg?#%ie|SCM_Hyz
zK=fh~zp#LZxTf>wNZ&oycUimK4Z7>lO(cGRjflI2(Zp9Mz5(rojZ64I1%C`UP+b2L
zynqBZ0j at W-nEX#bX7Ct-Tl?$&*^o08^c;}Zb;T$$#&DAhz{gqLYyu~k&|9VW7bd-$
z at WaDQ7z3pRjQfb+;m!lFE4e3d7x1#{q}EoZc at OC3rIXcc6Okk9bNDhPC|{>17zou(
zqn2s-a>Qpb=RZXJmqOmxYTHBBDwOS>oCA4oPQMj&58<sAV+}tN(<YiiU7-!nKau4H
zdtw!Ct=QL!faMD!V`^dX6)pb9XW}xu25GkQz{1ws+04fiwo12%YorBInegb*ZiP$!
z>{Ny8TPAbDr(W>qM-?e<s2E`{<Q<$gM^Mb<O<1pYwQ$-y9>vnn7aqC#0iB>`CU|<k
z++FH37uP;_HB{81kAZDl3Os>{;#v&;-#AyS&7)A)-2!QHODTNg)k#z73i|}Q!uyhw
zLjCpf8+579C%|xs!>#QY%U5rPHe?oohk6sbx^&2jF5panE3a at n9)8AGxmza8ch+gg
zPAkTGjB#m;(Qf~n(U%ejNXa^||2x^-9OTJUB*fH`@k}r at nZ=NQuE4xo)hAm?^n8D#
z>Vuoa8-ZE;*4Bvm^6uM(gm0 at a4b1^oIURhPB6g|%cs1vJ!X at duTv-e{@U3||@!Y=M
zjxv3(pj()iCG%SCoEZb&5!z|Sx>G_c1;)raskc1|eg4wT%0T$S%8aLD=RDDE(2o_Y
zpo%=_Q$^0z>#}%EVX1xl;Rh<lJ;(<(rbxe_AH03c&XsfFA6~?WPqb)u#4>{u_QD3h
zZ>(z|Hd;d+ZCyLy%eO)OunnCD(%Eqtl)C+vr#e_K-l#l?IaY?XGHNnx&iVMADvrtp
z&pGI(EKm#iXc8@(OYmE3ozwB|A!$_Dg{zFS)JGb2;R=KK{yzEd<P4i<UY7-2Q1Fn?
z^SOs%n=Owc{e=G7G5kNB{rI0{<h%8~qd6Z7ouK)EuJT_ET#1 at yJlM{kJ=K|sQP}_d
z<?y{;Bp_|SwJwXMC8om<pku&wC?d{F$vcl7ZW^ikC(IqQ9pjf$%hObGnpNaJ at Km=v
zRb;)%`Rn^$1s{VxO2Ap?d<=uJru}`anMwaErV3*HzsWHA%Nq^AKLWpZ at 5~?H>B(XL
z8U@?>74y_R7OF@`Z2MC9rfpiKpk~9V5bpBAi1R6+oxL*1*dMo6e#6Fr*La&!53hIV
zV+H!S?)N?}vX!$tZ3cM;{1~OV7efZ}M}KesbARIuTGVfqe5<%Y+J1SwB0=9vbHWDa
zUj22*p=n?&fSH)5-w``kDLrwUIa4Ezdf;WdPglUNd%K-+?8SE!Q<0FrvHc;yzMaE8
z1KTSA{lf1PXMju8Bq_yRZ%@KLp8aow)<n<7d9Xqv8QD{Z#5wIs`dO at p<<IBA??4e~
zy={YU5q=MBOPug)%j)jSd(IeBXS>7i^Xb?#nF+AtAg=JxN;yi?1)E6N)7gSrVIE at 0
zfTW+pSL7B2^oi*o-HzkGtPT90h5sGUOe><J2VM$Si<>WM#F|D{dV at +TNYu6#fWP at f
zsbuxYH@)IoNc`332j4UW=0u0vlX^;_6LHFS$H?<HfivwGOi-lL#gp?o*TXJQ8t|%<
zh0q-X9~rhhM-QJ}*3w_&Uv~hf_PU+H9^k$($KE^G4VohI$u!8-l<w-7+)%Y=(UGc2
z`L}ob=XIBXM{Eu~<}e^GmrPf at HA$mb5L2JkL)rpt`dyr{R{XF<BJ(9 at y0w{czN6Dk
zTG!}et>Kngkt2u=jTEbwD|M=X*G9f|-v82;0<`52eQe|(jZ>}J|3L2&tcd*fhwlSv
z(8}ErQPje~v6~rj^f0YFx~i at Ah3b|}NiqJf+5ZiPi6uCNJc-#3n}`w-(Qmv5J|y-H
zBmP^N;HaM~tDA*wiGbpp#+ZhzmcZkZ3yqBU!XnM-9~a6&BVI#aCEBc at OSr4Kp`5m;
zrM!UYsqobCGL2!{4SZ_spKnR)L?-IWNZap8y3zJdzU_ge?ViQj;<aY9J1|u#e)(M`
zyL6;of6*E;OaI4z)S~U%|7g2g2mF+*g}fq}UX3+|v<3eRc9N6P7L38Cng at II^`4w&
zo4};67b6y%{PW!9cD-Y-zJAWgeVW{_<nOZu&WHc)`6*3Js<p3|$JB?H_-2wez at Omp
z-~U}P|KIx6M&Ho|iI8F7J4XK58;7s`Ef;i~dhsJz6Us6_62t~79Tn*h2CNk1d^|1s
zX8U*KpUuf7-+cHQzWJ74B-yudel`pmd$o(7$2t`fPzJj6UP}hfu?Jmp!{K?kJ*Cm)
zEK7 at yZKS*I&6(1Ehv(_L(Z|R;i43IfX`FLwuuhbASAjQg at G5W=2V8?ZD;wo%27UOm
zFg at rq%=3T`#)G15$Ec7Mj_BaMZ|kMp5CgrJHs}j<Lth{@c<+08iWX`b(HRJXE(v%;
zMMOt~$UhC<7|+ogpE$E8bM^Rh{#U!p-eyA$9XAHOeV<aQ{H6}`-248mEO!Nl?Sm{M
zANmo>n0m4=g5IwN at 4VM$>J1DlRxtE($i{$82rHH|G;G>;uEcpP+cS at xcSNS4GOUO9
z1l>M`;K82&KTA0h=Qu3Aqle4;uff^4QqhDuN}KKpdT<{$1_l$P^+CI&C;Q!~DFWkF
zJ at i{OnLby5U6<6hRCMGDvKL0*J~9{fy&X9koRzR1=4Omu at _>?GHPEsrHlg1jx6wnM
z6gEqgd+fu@`>xc}UrHW5SpmAaGP*Trn_dT-au(3cd6_=ZFF}7{qVAONAA_9B7*^SP
zF{~W>PsI|KxVw>69?)JA5?=~WxE<m7K_?;e%^v2v54O0BQ`Wd at r+hMJio8qVD~P4G
z1fP9d5BlRJ&~Q3i{qPwi*z%qdG<s3Q(IMvOm%zZbL3iW5zWhRibYNI_Ltg}&R<|br
z_gHAa{Zh9xT|Yn;T!nqs&~$GO=NcVWF3m!l)Z}a#R<g29v0&amd%7tVWE;DP&V`NH
zP|prbH;m`(6G8va-`<092U0G~w5;x?F%YsAy&ANo>ZVM%1NH$9*qV_4hv~45DxW{z
zYPS~j%xl=*6PS+gRO at fO*05cUGIe at 2>a&t^dL#V5 at w_+kej-m3MlF2AuEf74ID9$I
zr at fsAz;}@K%EJtxpQA7~<gjUECf8(aU at Vx0+wL3jkKtpuv(Z0$-BCLWnl_<x<#5}A
zUec>D{<cV9BbD$KVN-_50{#5^wR-p(vJPJN3g?2)5H^9X*(fzo?5QkI6X=PT$yf!Q
zOmLWZuFs3$?Wy>$Q6vf*r0Ef5Co9kfd?Ou&djwmv2xs*Mo~Qpu-j9R at HrNy-<vR~Z
zW4j(9ZNS=?0GjF@$ntuoAF}0vcKQZ$ej#{gq at IPS_xHJg_F9Geq~{~bPJ?&#aJ&!a
zBeGi|=)(V&zgq}8f`6x`^8oUA2b^I!|23Vik at YoElo0%rcoUI12Jc;Us- at JAar%Px
zm-S`UJ;2%knN<5ASzBJy^f!~Wh47PJoCORsc)Q@;9n<E$W)6isS^-;ZzQeebX5evD
zkW0<R_cxRCN4|?agX at n*u1)!__SYXiJJE?f#O12`{Te=_|F{mWx&JCKhegj%#Muey
z&W$7Kiu<qPT$M-e<DU%Ug?{Dpyu#;qA5Qc6NxI_xD|~*Wk^c<8#@@$$%iDT#K2w&H
zbC!HQ(nZPSoMtG&J_ue_?Ci0 at mQ|+)y at AR8nXHurPu9_vRoGFImCvdMminq)t3t;X
zTxhx^FgC&e&Afj4Bke%L{u$fCIPfoz+CwrE=S#bbr7Og0G2}i0ga`2=?aQAX$@-Zz
zkla^TX!e_mHI_xc(2Gxj_pvLAVA&dBql>{@$9>FU_~IkyUeHGeG6~-`o1EoP7WYX#
z4`iOe<i5w+2-f5agiykNVp&g92Q$tbn$`X~(xt!}!0wi~f-kd1{sz|YX6QDpf$iK+
zR<_BF`j`Q4#X>=B%y0B3)W5QJ#1w>u*!vfap(?<eYVABaJ<olzUAORY`+ at P7D9!1L
zE7i2|DOKqC#2WGWh(yd`4gJ=YJ9OEMqVbuO@?=TDy}<3-d!x535n)Y at zA4taHS7mY
zAa<U5P8lT^2lVZ}wMX$N4cauEJC>K_ZF`)qqmO{z4yI#;AJDWSLIC_p$jXQo at p;%K
z+|8%E#LBneBkJO_V)eg(69_ob{vBwRPh9Hv6<QPYMh142LRU9PTRNdM-~_+MKCLx1
zf{uXBNZUhQHAO;1ZdXUlMXY;Y^gt)A6L at y4d!&s;c;9CZ*xG9E at xONpGPTZ`F>RqI
zT5>ZNEb&7dQ;!?;_XoTsz2JARk$*YDr+EgvmhZs#k+~`(Mrp6#g6!eI66}q!&o00_
zH;R?gN#y at wpZMODY_F#sT9f=M#2tulApTanO}<_0QkH7-CXnxc5jX(g$P%}C03TXg
z(ozW?-C at u5L?+>E^eAwY`Bd9hlCwMVWO+gcQ`^>J at WQnhuRG{00Z*mOM<;Ez7dpz3
z=deVpSm#OVDlI5oGSz9q^HLub+a!eULG5nXL05;YT=7u>_9kL)1avcap1;dL;w*Mg
z4dD%tJ>PQ8Gaqv!HMpiE%2qb7zPn7S1iw>*0GY#omno<cx9%q6TO7*j_;HuGb(nTY
z+?vkUm$-G8-&DePY<IZ{5Nk+`b)dHZ{0qE~5yXJzFwM5KzYacr121Pt-1Hsh1S at H5
zDZ_t<z0nB-4-m=S!9Pjd^ec}c%CBodeX~83kgXl-v`H(W=kx=3E|XeHS(VM{{|n?c
zxF&1a$X>jouk^WZDUbGU_V^aA?|xm2Z;u4;w_E4sbeFKqliX+pYzY5`c?DZNf(!|l
z#n|@>GsK2lYyteokDVyZqGePY-K<)Z{WIhdk$Ybr^d_-o5zqUM^<7EU677Exzee7>
zhv}>66UG~m(eShuN&oqqA#2JYvKi73(0eH9I6m&5Eb{{FOh3vAbQ13SQ55H3E)x5R
zc|v7>A#82zAQ;4&0P;S5Z~q(m-wCV+e7}c8Rw at yP0(*K8 at v~U-ueZyF|3OkT at M^#J
z72f+izA3{~U+L5`K4t|lxJ@{ViY^$P*gr?^2jadM_ig`i- at ix-`5lp4x_UPs!@6U&
zm8TpNbH8D4zJmM9|J(grxNpOK at gMj10N44WmU$EPuSNa0Q2)%@t5>iNLLT*p{0VDh
z9luUT*8L4M#eQPr1ABGYAMz?Y>_!5gP#th)(0j7>e|=Wk#0bFe8tm4ZZke at p>809M
zL1|1~R`<x5z*#RWR(t71 at Qj1czGs$jbC^yAu-F>KJwb>nan;jg?p3ORDM}i6#&@!)
zRlgsy$JyfZDXea}wv;Y?SdU~0S@(kvzh~yhOP)5v4orGhFxGJPKgMJ_Y(=Of+)>8G
zs1pAr1iqyxeg3!_e%#~%oBbX9#-59?M%s-xi2Uz4 at S}Rw?`H|OLFYf?kAEm7dVT4N
zV)6`QBKEmV*pwYR&XPWHLah|o_xH{P*ZlmLgzJVrk!p?N1s?API=2Xzg`%bw$S4X~
z^iB7Fejl;vA=rmGM|-HS-<W~5or=251nV6V*|^A7`5$e0dPELFo`nOO`RBPelb;ij
zjW7JS`_GKrpZDMHKQ(e6de?u{1A6iTf1hhvj=A+8<HM7KuKs_{_a_Oh7gUx1K;b5x
zq4-7`>Dg at WK)8r-38B*SuHAuf0ihki?AdL<f^ZGtJVKkN%6=K)TZD56t<Zmo3feWB
z1wZ;nV=dun5?zPQ+Z85h^82-RW(jwT$?n-)1YC2|beX*X?_f={w at gLd`3O2w-<DR?
zt3CM0rbSH)zJWf~H}!O}txZtAMQtj!mB3C}iJ&5RX-PcfzRjD{fU$|n{BpBQQS!|;
zLFuLi+<KHL+e8^HenEV at GNo7X-^p5MMriYt*;^4`LTE=gk89X)KzprdqZRFvp)FSQ
zffenxqOCHt&uX_Lka~_I978yP at D=**5_pQ!hP=R!hWrp`lC+jARb2UtbEW{hQrC5y
z9{U##XWDSO_b=@(t;eg9zFXj%imF=v63S7z1PjuCRTWoqa*k#ibiRgQOJim!wNp1)
z<2JCEU?l$Wn<!VGc4RNkG*^LxfF4kxN!m*E??E at G4aPxM2&{3T39`aCtl_Xf at MoN-
zyX<PNq{-7vbX6p>PR8XL!FXZ~p<|)9_dc#Ulu5#QiC`>}NV+K_YX#o5m0V+;h1?c)
zN9LR^r=sW#X$N%4w+kvI-O$s9KRv&o=F&;|8;thPj at I<F!5>H4X!zq`=gu4Kq1*(4
zJsnJ7cL)5JO0L~(3H+3-O$zUx0r*-!uH}4t0`J<`OrIt7H@^x@#J&K0!MxUPtF|Pw
zvZw4ZPH~(r(VFyClF+XWiz3+r(RJ+i!qsHF^8RRlprV{>f#ujIX;XAdx18Fi%^U6b
zqD`u{tHhnrTHW?(DzP%Uz$J;QD at l-C%j}Vi4bRF=fxZCFwO7?aRkWAlJGV=XhF+R_
zqPLMskpAMFw>EFMZlCc#?F&>kk~Qp;wZs?3Ex~O{JLF?8q%A(_ot3clve$l}w)(1|
z%gVT-0#<^D0e$U at zR=aaO4lIYzJOP{R(_ZSpQGCZ52(z666nAa%&&*tOg99qBxi>~
zuii>(J#54OKu3+PrE)E=hBk<;5#fQ=!+zNxjdH1}wGuAKM6V!yhi{&zkV((A_d-{J
z>$Oqqd+n4EeX}*}H2b}_9{tuJ=Lo)2yUo2y0-rvY3&gTZy1?p-1RIwp*dr<oEWXIn
zhIEV1JCK9b(XWV1^gP%hQl2spogx=aO@@y!LjcYMesz%lv*Y*lYN at ROe^uOcyMXsg
z;A_^=-idqb(QjL&Z3^&~T(RU at +Rzz<{yO+(I`G%<x$5hNFxOc!XUcse=ISr1wQp$f
ze6?z=@2}8ZCv<rcaEYz-LeX`a!gs_t>(SozkoR-GD$xM_p)2;!{p#wWwz!Pc=dO#?
zM&$eZaQ~v*JM9nn{EJBcgZ_Q3YYl&%cuCO&n}eVkKibCI&tNRz-|^U&Snr)=jl`KP
zag82p<Wl$p&Ty_Ch<z=l+k`Pyg7epUp)%8$&W?`6^N9cD`G$wj(;sXxNSEs- at 4QEB
zjlKGwlw~K|OJHxIp02?>Fd()>L3b(I(h}Y4d^{d|s~oy^h45KsbgP5y(&XmSzN}p{
zgo=>J?SBjYZN>ApiX~oWDxYTW8z*EaihWcq<~g~Jl4taaVjllktbqQ*9O$0ynt}Go
zpx5&Z`Vsp**3@}{7p`f7Pu?fz_4*dG#DH~TXDtUlfh=(<?zOd47Ua2;^ZDUK2L317
zYQ1sRF7?O=HC!yhS#V>h;Sz~A^JPjCrvlTE^vj0 at d7db<c#R at 2i}TQh8qShDZ;?C`
zxWuWtFQ({1kG2#A9m`+Bmoq0$g+12y2S-VOCz<WUSjvShnD3!KG~OS&FLYC9;aQm~
z?(CMeSmS1<5}!0DpIVzsry^btY$W^|D{igL?ZSTEr49I^Ypzt&`Mkfp)5z!ltg#qn
zqcAU{pV2h}Lw0gC at lp2F63o}QlcB_q?ZfgU|5N`U`A^1@{7-HhoRu1F at d*=))e-#`
zZ&8TFOKXyCPn{%IFP&uZL;BrR53xG at yhWrnrMubd1!iq-TIsr6wBbHz((faz(g3=r
zGdHZ1%0gReEOV2mQmL>BY3yWhFQ42i at up+w15_^3u&ado+mUAmRWp*OXe7_8v}z<z
z`ADAmI9CqWqa%3^e3m at bpPLC?;gRPO>gY&6iuk&B`RES3$}*#_K_~1P{{6McUt{5t
z*&VT2G4wasH?BculGMqZ#lAx7w0xi3M*92gIVvB0?@8}LdK_dF(K93Ha-`paoIiTz
zTG(ce`({6-MIRf9oa&o9#KzN8-Sl4cCG3hK{VKuFoLocck=_K`8*yJ7pz9X>WENe8
zbOGr6=qH<L=sMn;>ytwtLi}P3WL>_kgA%faOTQ(UI;>?lr&O$m3~Vc&5qi8qQLg&L
zzK_R-<^Uga1hgdcXir$K&ikEs-G}@;I>`5ZeV at +TvP6P^|71U9F#Q*c|NQmWxVM$R
zcLVpN{Jm=`=8>RxqER-AZ&wAW<C$G}o<N>|lZi5sq|7si9 at g_s9_}sT at 3j#OYGo6?
zGdkrkupe=i8h<fpJYe?xi2hkU?j<I at 0$xaYicZou#6T~PHCAFj-jfw2d^tfQx!chO
z9i|fNEToT7pzWywK7GL<BDziRd8~mRJMe4?)2ubvoAJ-+9}?US|2l$0{A)p7ih141
z!wz6&Sjc>0MFNTHN|b9pxu^e<Tt~<onWkSioD8-4=+?<wqlo<?a=lJ&HzQrq^lN+`
z(%&O}t;UO_O-zJb&(wIu<w>%A3VA%;7J?Uvd!pJPqFf6RmwL;qXU8em0hb at 4p2U!}
zYl~<riP5GY*QW(0r#Ws?b(#Ot2sKqv?H89boOdci(tKXTl6#H7^P!wyoEqhNJ6A(5
z?sl9<wW-N8z{yQVIFc4Ea7jqa9?^1mKS`Ic$K5yabswn~#i at qtp1_baUpHdOJ)DzB
z-J&>Fa at SG9*WDL4quM-N_qQBL^K~O;k3#Q<)IFoRl07bL=Igdq&xz9w*Zn9%(tO<{
z{#2BJYrV5OZf144PkZ&Vae6#UBC+IBC3!DN7fCK$%i!PJANNdk#qfK7<VYItjU_SL
zX(#U`={;<(u$zDH$?6y53Wnc1njvYvZp4yHTGZ`3q5j3Vd`Yt-nXmh+50k3 at 7MDMq
z|21YuY}}L8dr^NBiP<}qq<)gFVqFu5>u;(4Yn*mCe;`BBs6T<kl4ExA?Ic|&Y3^9f
z*YAp(UTyKIseU1 at kk3bA(!LkshTC>GZfv!6xNRpmk`^r(c<>R4sez`C$5z+!ZL;IL
z##Gl1=erCHPIX}1HrMMS at 0!5)ZLR^frjZjhTLTl)aUNa`n+(UTFDIlUE*OdPtS=LN
zYAMkxD!>_uU?>wKQ-IOx$yz3SbwdT4jrqZf3Y(zUJ^K3%6`j!ec?tAv9nQo}MZnQL
zy5Xjz$q#zDmsf-CwTX>aG%m}!owaqaYZ2STOu?Qd<Pt~M*0CjzayZX5VQ(zM^?vAm
zlIvJpUrThy_3=kTMA`_>#MHhLuYj(7VV6ea;hG=sUbCP5=@#cBt9d1UcUbol2J<Qj
z^J-$vy!hR&zl!FPSkisI&E-3i{_YkdmJhMwv<qoFV5`37kiJdBHPzu=b%Igx<7*Cy
zJY8e?*u#|^hii7PfYkp+{Ejfy=7;saS at UN64%9z^#1hr{UerIF&Zmd#moFvtkE=PT
zFR6N1|Co3|%|X;ZpN~CU6XONd2mK{t<+8Nu*W<F*si`E)-Pfw;f1DMjN at fPCe6t#m
z9x(ad-8VlzE37+ixbF0&X*KiX>m_&3iJaB(K{Yb|n at LRSM9hBE$oa@?M#a}jer<gC
z%`f76UaFCcJO}DOMht9LGxCom_q26$%-RN7!-q*VqvIP!`Y at vAk@yDJfWH0=87Cy|
z>nm$`B%wjl-P$I$rm*7bm1)*T5 at c96lQ3>X)*zBz!9-YN8Ea6yEUf8UtfTUbi(JAe
zYrRM-v7W<uJ`riQa2s#8fX!G7{BvzkqD<02G5Rv_;- at 8!s@<XAIRWEi0{Q=$iEq~K
zApc&@)Q*dXodwFw|NF7=Z`SN=szaVS!4L6o)a*nbB*!6UOP&UH5q<nd&2D{ZKl+~J
znIMgySF at Y%d&F$X_-;PWyc)$w9VPLv)F?zP5!PtN>YlLQRRvos!1dR<CmsMF0rZkR
zzjh)?U!O|!ziTHZ90)UCPjXcyzG}^eEZQ4+aZgf3Fb$-wSPLzQuMUn%Z94^BLdz^R
z<5BdZ#V6pJ*t!&anHrq4+ys{H>G^|P>NLJ at T&YvKzSm~RN?|)|A)%B1C_Cyu%Sw1X
zOkkod9P~j69 at uZbx~GEJmqgm;seo=U!N@&u)}%92D$<!bd()Yz2A=|r8npg&AC`~f
zeUyCsDaxEnHGz%{M3`&I0ev|kwG`>sEqO?fLl~c0jO%%pT%_GoaSqCV4dK<!CvZJE
zfM8pF1qQnwu^+;0qzPT>g}4CmEZ95C2QK$HTti=6n;|4Jn3=@BgZ~NWwh{T&9LNvG
zbQKDTEsWtbWMFilu*RYRjl54-Z&6Di7tDViI6YwHy|+Vd$k6_&e)vC0u6pG47iujY
zsULUVd5TpOYnjLP1Xu`G-(fggpM`VJ;BxRQV+l`@^c%5-1w7a}=yciT30c4Tb6vS^
zg&To?)N%`%3T`9wB^S?}<i=}`a*r`ripOjI2=keFMs;qKalB at yQIh+|{oy=c8sl?M
z;@LH0F#l|P at o~*mlouB_X;vdnMJV`FeahmGHD`-cO(Bu{UUzOFeKGqscovW!2zP^?
zVMhOj_$-@!+c`r@>}><5d~u4?6ZyG|FFL33 at f@cIAG<l-`8dicNHw9KfN8vfzJe{x
zR-cm=HTrygs>zX-YO<VjvjOwBn7uJssQ}hCY at dHXb0x7s0h!-SoLQ^+f78=!=!HHv
z>^gDK75OL1e?sJ!`OAmp&iNlYFQt}QE(T2MdLy;VWl6o!<$`=*v(ImqoYd=GvjfIk
z+C_zy^8wAE(b}C4hVzQKZy`Hcv8D44{@L8rQcF8{jhqCS#1)@Af5LxSi8I6ZsyKBB
z-Z_A=>Bcq*xQ^TjoHj#TnQH2+z`D>FAcj5&<J6FGJNqwAH6KrODhLg`?{$kBwlWNa
z-+VaJnf^b&ar91~>_7OCslE!?yavyucB^wQKMy{&<UpRco}UAW{2YkFcl<i?Z9Vul
zf8apx6P-L at Y^;ezCEd6;T4?{D?OyS@!Yr)|iIk`G1Gj_tUk--<)<+ylK7Q1Zo!Vzn
z1DkC9Pzn2avt7Mp4S=piWbH<Wod2FBj>G8B<I`c=>B`j3!^FnZm8n>FH8T-gFsIvI
z5f<?AMj>lav)P`eFkYrimk)n48TSPoFE`vw&f6CFY;)f|Kc@%l!uSL8!D|U5K8E)I
zBbXG%T@^X1)0v4`&>4kq^wB%g*@0bBCBck37$W!M^VE|u0Qu#*ezUM?xSU<$h<y0m
z?&ZK)emJjvtYh)->7O0%{+_-Dy!yjDuHWmk;!ItQ{-^NmX(MyC`#MFh_beiEWcq#8
z+82R?8eC7F3BiA({;U1B)v9#U`;!Vjo>6EufyeQc=sfI6aney#l9dw`h`AP7R|hbR
z+hQ(;aem7cGOx=a(Mw*1-QwDS=9U_(Dd3#d2z$6@#0JEB5Emo12Arb|RJxT5IOq8&
zmF*co?dm*D>@QLZVt<i_p5>Mn#D`RIy3vraeIHXt1Jgk_1#Bi~X7~(ZEK1u1+PJuh
zjzwIIHF{4#W$@u;0_bJsboJ2(=t`-}0lf|({jPy_i(ak(evCHG&+jhw8f;tscs;Ra
z6v`RdV9PQAY(G7)$Y2Lims$_|h?n^E_2_}o#n8jtiu>Qe2XA4=YDKe9+34dn=qO%0
zCB1jp-eJjdRidcGFBaI3>dFLd#>bWLXMH=psnG)a(bcdYT{l at Sv6>k1-44ywVjo~4
zh49;Ym4(kXU2`RHtA8c-a_8?Nx;sC<P4=f at os6(7UXKEHKERJRBS7x^`?G_P4cF=E
zhu4cgC)fFJ{eJy-{`&3TuRrClso$^H at z*i9P9Nm_Z!n$n8+t0Gb*S at 6>~WCo|LrdL
z_*ftHPa;hX?~Bsh=3>Z|q<*|U56<a55!~ezg$n%OW02=1z>WslCm&&te*xRk66+Oa
z(OpmBU^8UgSGDz(W-3Zz(88|Sg|tIyi=J{;Z}=Sg>+76V8wSBopXw~X5-H&5dU~2q
zj=;yxP%`Q`Pg5fQj at T={c$Pum2Om?y(^VOjW^Mhb2JCqaeP3(;IrI|NvV}A^P9?D(
zg&a(DAAUx at bs98Lf^t>TP%WF`3;LO?*+1%lX;EmV(q^_kgp-12jC*-~+n;||BO>?S
zd3bM!Dly^_O%Tc_M!e2uJpQo!LGa6#X%>>aFF(w?4}9xBt&%oKa)4{!ul<6}c;(?U
z=!O?w_x(U8eOd?1=X(<Cci;nyVAK1}PdiU*@4W_@(BxoM()CIHLm{y*T^<bKWq**}
zgNODnVD)=a&V^b%S!16nsrOCD?LQ#$rvn$jGe}IjN#r~)eMQ=J{S2Q5_8w{IisJqx
z{KNVnom`}UvFDha8=VtWB^Swy-2|EP^lY~%;u8$EYkm`leO1ObL*MHJ^t~d*pe=Uz
zIT~oIBa=Sl(9ruFW%L2xWr~EtgVTx&vo*zq?6hK-f-L?9c~*~krkdJW|K>NyxB8K~
zS6Bb#R9WFcK`D9ml<K_$l#)E3d4$^Wbx9$M`^a~8kZzcn<6=L2ycYQfN5MvvP}(Xs
z+6w~Zu^Lx>Pi{8w8H3Hx75@*}9(2V!q4TJK-97JK?LA>fFKz8%CKZF{?CHC7<^?JP
zywS;Q1U0$6JN?0UV0M3ANo35>jk)g$9{00bcFTH)A||gK$hwtUA}*r}#MToUaYF~N
zxU23r8$@zjMXJeGnOa(MP9leH&qoR_#kW1(|Mjkp=!N00wr>i)w(9<12;_r`UVFr3
zX+75Vydza%PX*q&2$^iJHezx_o27cBe_<a9{mUpSeAdH$wHExK0YwD`*@n*=%$*-1
zxN9?wN@;G1n$S*C#`zxX5mZ4Bk3*goYKl_~zL#CjOpM%IsxT&-$o>NQ<t at H0Bat~n
zo*?sCFj7~*pXwqyg0J%V4L;BQ{%!;R?m5Hrwj=&e`8CdQ{JZNF#gM&_caO)rTXBxu
z^QU*0`HUK=D~Il(1{6L%6Nl?^eEFxk)Xv!>b(u!m;WtuO_aAlP`<5U8KZG`w`usXl
zZ>yq|0-nw1=aDuA{;6Kpd4Hr{GpScP#W^(6KU4mwS5fJ6Zlo^V$TwabsVm}-x<IR^
zAS~wlUFF<8Qg4q`g|<&~!tNg5?_2&<Z at JH|- at mb(|3<|~y_^4!dJDntYe$(v{P)7)
zZ-E@)yWzV3BKxCm^aGLAZ%6)rBDNwx57!s#m+uXPHxb at Oz}W=yk<<C`ALYAA(XD63
z$xh}8TEPEom1pc8AlJiooMD?doY--`2V4`dmQm51{Sd)l-HT^ATlrRnq-l;>Gb_Ly
zIPoYkcm9&=n5fXWpU=CD&lktb?@weFhe2PYHENwTGRkGyoJlZL_u{Z`m}W;xfCrF3
zPrLH7|I{TmV(bqZp{MS%wlxfTwZOi|Ul{Tz>WV~vC-{GjZ+{2!BJdS`#rU>mEu~&s
zq-P@?J(7+ at IudEpC(A)Ijfc)ho}vf!XdqWIz=zs?209^%T>2W?lmJ;&SwLc!d%&8m
ze-Zx#kXJQt#602gw#$gz3Rt%(gWaH?fwvuKM*p|Tna3Q^+aY6Myk1p(O`1$-_Mq1M
zr}53l6_9^x7l76oMfwxzkP*D)Ww(op1kmcw_ubb<_5BK)I2Y+-lm~d`mI!M^VDR3s
z0D_mLli;IOBh~DdBkwc4qZdDoFcY>pW)R%8eGIWdxBEeFPgpT9u%(F05StK}5ZzQg
z8`P>#2R}NgZ+vgh;#cslf8twK5V{%Zx4p0@=L>_+h&Li^3VJC&2;n7!U`09J7lU_2
zB1Ex;P7BS9HQ at Ufp&kllm!qC$)Dz>C0s8V&#U7+T#Qj*j+las+-zU9+i`OG;=+#aE
z-JxBI7_^5r0z9hCL>_}YpCYV7Sc9_5`hI=>U9|1*2%jTtK}bf}ijaapo-IOn2Vo)B
z?n;DmgbF<q<PDm}fOIy33g-*%Ds&95WcM4<--qNGX{Q5x`-?}?A0TZQPNzQ;;0s#`
zyxj)GX`oLWh-qHeAN}^*IAG(PkQ=X5C0-|b8A1dX*$-cS8@#rp8=w0{kugTb`cki6
z`O;YgFE|*5 at vU9zg?UgVo5rWXM}VGTu0%$#!1<plxXG|N#?#P+TIhKLuk>`wcC24G
z=Pky2x(`b86>{%yfEf-5s-j}Ma#U*{iF7#^zu`Y5K03teCP^5v(vI^dKQ at 11Q=n7!
z&tV)eu_I6Fv+eN94Uzt>5OT9?*vHrO|3YZ6{HKSEZs!$yrS*4rgEl`7n!q0+;Qy at q
z!Jq1$!rQ0^O>pA_tamc(sU70Qot->>{5LjY_#33Kn|{hf<YcffL-gM`wth}E#?vcA
zmrYd6)_JOci%S|1!47S#?>vI-a%l(_$Wtc;O{b8Pa#TH at JplewDm7eXn#(=Yq|mK7
zUCr|$q>2(@P783X<g7b#&i(zoOPhSY3yI9w2ERrXA<<zbjO|b&cX)`?x>f8oK(I6t
z at G8aqcGzk9j=9=Auew{#0vDw at E|>+pRyoUzCus-fIEk<N1xdIgjD0uD_>${ySY{Gp
z@!y6qtoYWS21l_O at 8BN&Z`6hIFOz(CS?~f7|BCX~EYPsjZ;S5Q2P7Pgw04Nax$tM`
z0qQ<b+?&A7P=#MG0q4o{6`=pF`Xu7k2u{HWoB?mw0leN}yHZCXn at PH#3x6x){DMHk
zeM<TfzLcRG32aWq?%lk75q&}4qKYN6Y^J{Zh1W61Qi0VygXd?&V#pg!@ToFtIDWos
zI1ZQqJAqhJz1jvx at iHZr#~bazxPJgW#l6y6hn2T00J*s;aV_30J_`KWdTDj|De!!@
zOY=ik{xuH$&Dda<BqTPdS;C#ie3`p}$VR(L2`;FBS!)&oe|CY~Pa!y<P_7a7>~K~k
zSRm|8&<DY}VQw->W8XvGGbFD>!nHA(R_L8 at -;nEt<QtN*h at DmFJ<J at j$%!%&Ya78O
zC3Vjr`!abS(w-!Zc$(kT+ogdlv5OZ%Y&*mPfPwi5o%KJ<?w5CYLU!MadkK)|f5*%7
zy>PFCzbC}KK5}pN$>DosKF}_~0V)~i*5mMVbslF at 3&tQhW2%ihFCEUKz*^xPnnAFc
z`qksP%mg|l5VnqZS?}9n)~jhD%WmBo^adX9D`FSn`jfE##7yku)88owPVXyK{7bVi
zCY<a8<ue_}$9vQF+$0klu-8;bU{_%#w|q)}Ib>^28<W0=<m+I@&m!0U&*9m$VJsur
ztH`snuJOQJ;yqX4qmaZ7)YBibtaFCKI8w(x;P~#En1SnrH##BnX69U+iLNkL3C4!Q
zKeX;(u9mPF;oJnJ#QHUJ!9vQ}Gtvoet{hlS#i~A9hP`5t*qb2xIsAfv{s=z2suSx_
z9dt>6EylWZaCW#vcHyT8x#Mu4Y`LCb2}Vi%>d`kpK at MII9QF0#bo-k~_em~X_z`v`
z6G20FOPZ1As3SZ0%&IQTnRtoXlf^#z6MSgRZ<1|_<Yq}3oC~z~J|bt{;b5!vW6VCP
z_%|4;9vF89b|!8#88_>U&u)4qWZ4g}N8u*84V!Nm6OH%Yqo%<JrX;lc(hd46eVZV+
zAj9)~M=q_z88WYD+r(m3{C6>Uhc{`9UmMP!sqp(s{)r^C!G0r1CySzuDIIj&`;__t
z^eD<>_MIy0U<7$6_jJS;?ln}=De!;<Td9konf4p*MtgC{vR8Zu6ZFRgg$0cM{JTdf
zV5y9A&K?)k(HVmK^f7^T)3=n<UNZBpJsZzlNT+kRaQ`my>_?tcNMAsnTKiZ$JBoZe
z<t_Aa!G+Dg$i49V>e&*(!A&~NyU}B3s_gZs<C-#U^V3G0l at 7}~N(AP41KozVceTHs
zGDW>VoXGPr-+bfSU4By!cXwn6%qfvK)8;DGHBsPqF5H%GoR<fjI%&V_Q1{lzELr%!
zZoVBeK*v)W`Hs2RQ2kFYI_jCD;MVB|Ln5ROGj*YJD152BggQiD_dngV7WTNCQLZO^
z%guLV2D8$sa5`O^>%+}e(Kkq0DqsGIu!!yrU)niD6^ZvPVn{jgTBD$&k=(LxL!I<4
zbPa)H7vEX2hMgM`ES7E7u at fVL3ksKXvuzV#OKn(xx#h55o8l|t%ZrMvEKj-OtR?<_
zF(*=Cr>=U#FA8($Z>(hgot}!6vdVV4h9-N}OYnQ0z at NdQ2AlC;w)&nAIz2m8rRlgN
zFn9C`YSV9zQzBiNer;T~*T&Ebi)ymEBj(D-bWEeGV(!uAm}yzWzSPlqMcuM=)j(56
zy1)#5rizHov>En`tklo+b9jD at s^`aA=B1kc(t;ZLe8feJ2Q75#VQ0=SSy6&eOl+3}
zC%4si67pJT--5Qx^S!TOoc7DV?l92 at o|MxeUdqsB>PA+YHpheW_r|}gYuT$!^Wfmw
z&q^8STX<K81pd~5yG{VsKf&Y3V0YiY>%NUSmnC0hpwp;!`fdNy at BuJiSXRJ%4x9Di
z6FPE2xiVdoX+!OZd{2vco7!a3j@{eckxo~zW5+Djre_yx_ZiKi!my^xNo=4<>#A>J
z#>K9~`qE=8DBn;k<t`^d#;6`DkKWi6vcW at gpfyRFb~#CG{CbTz$Eg#i{iYGi&hKO;
ztZImZi-A|P^^X*boMK~#vdKhr3_XqwcFn&-za7|qI}J9MJNv$?n?>61*iP4`WslQ$
z+ at LG*KeW(^E{r)GI(N|x_jW4#bk3Fg^r3a{!RJWD1D~YFAIze*WXaGEv!Sz{(YL?u
z+h^g+(l?V%@W{$stnHlEo$^DbeDe=jtERcjsBPi0%gX*Lzh$sNrUO=N4Y3z?PXe1=
zX1`?$6G90>vEMR`$7TIhZUU?+64>KT4OLydVg9+JjyCH{RvvpKhmzatjZWyws;Xw3
zt2nz&Q0t*5@(vo`a&I-UB`bx_J{fBsd&s+ke_Qok7`NMbaUZLM<tb*=^>w+xOK2u|
z)8PMZ)`PbNo8qE^l6_c at WW@hO)r^Y=k?w|{DUK?T6knZ6aTn8?aF#Nbr_6-xHP`qo
zA1g=VjFDJld=_)W#IJpA<ojLwz)yK^!9+9c;I2IO=yqoVbv~@yZVBbYH=K<N-iDo7
zt at H3!ov|@R&+R{(E2tGVgvqLAoR at o@r at af><maI$e3#@8yFuTGXqOwXc6|9^64hh3
z7+bIod1D<s_+e7zTDnzGxK3GFzWMLQG}3m`2Y$IPeVPvYl~)=ShbA{R8mY*TW$Q$>
z9HSPL0PneM-Fu3|!Uouwif{UdDt?}ms#i2kS76=sFqZqb87tOBa>TCBvY)IiRlqha
zTlW~sssyD`xwYPW`R8HJNuxN3GaUzcMzK#B&qEM+s1F;Z{tL_OdBFL)VC%=ebap`<
zy}f5}bn#eVab=U_-S%9889E=vlw<93zp0rm=@#Kq&;UKyqqp`B-Fwgfa^|L#>!%9m
zOxc|!P2MJlt>u#Ea}~uHZ!ZZOZ@)D+5B2~K55X@@rH4-jc-*QCqlCF#yt1v^B-}M*
zOu6pdyRsF}>nc5P)~}?JTi{Ep@}k^dK<fAl^YTEl at V((Ob2lJg_1)KmiFdLo9c*<o
zz<53t^owj#C at h2r9*Nd0YSyy+cQ at O%(a;yl>`8ADhJ&^R7D`yE&v@*%D&DWhZ|XvW
zy=Snw at 9Vk_Dk{vn+X;;S%?l5DZ!JyG-k=jO`oL3iwzx*S_Rz|K*!h}ngH$~j(mUtg
zdodTOc#3r|qq1#9DOG{i7R~J(*vT^cCGU7HaW{CgtDCwLcOvX)l5Hp$em-{<p3x)E
zvhb|FNtU?d at F<k$S~T{`Kfdpg6RP-G5gj?SY(voDJw1#^G0|Tjbdy6FW<B>y$g(@1
zQ)S?<bMti6G|H0s(aP5DC$T4o=rg`}e$<+vZ)H*9^Hh|(0e05NI($L+F&XC=W19P3
zeLL!A!LBfD5s$0I{#==!J#O#1EX7xZ_aLon^rD_nJchZs%5NIx__RvX+tXmjH{+~D
z+v*uKuOIt_F5N41N?`XHePwx1+YHbX7{99a*C87_={F!6BPyUWO-Z*q at gB$AJggO4
zf}Y0r%w52WKmHf!TPm6IwX^8!DdL8I;hib^mGSnZK<=nU{PsmQ=!@B at Eg2~~a&6n+
zVH6lQz*jC+A at A)m)fV?$3M>X~69f8uaYQm*M9!w7hWAW~;9H+%1r<UXb`>myCJ9aN
zxG~dc&vrDV7Y=+u>g&;jTYQ&@`zmuO6O}>t!YALTCH3?(=${unmpg>fk*sQ-zWWL2
zug&&U-Yl8>GWMV?q~Acl)`MP&0{xo`EaVM$nVqGK_WH_1=)=}d-Ud6=+ptEe5$j;P
zBJVhS06Ae3(Fwnw&fUUnMJ9B;Wa$?8_+!Ua!M|$Zm7<nPJUf8Uh_GL}&tcGH2w>|C
z@<Py79{UHmzRPv9=t}}w$`<z{c3pD?Y3uC!ghxH_Bj4^|*!O)ft|Yx=Tw}Ur{2rk;
zyxFn!cnQ)b_$i5<mF?Jrb4sB at 3Hk%HIR0riY;qV0T|mwTR8)(VjD3EsBiOp74wJtA
zi{~FDzN%(mU7reDEmQITpzi@&Uu6p)zug&FMCiMszb+6|)yA}kcVAX341Q6>SDR%M
z)`UIm1 at OWzJ;s4wc1Ld7$%XeD{|=kJdnHq|<XFdWPJB2ANA;=Vy{<_Ig4tC+fv){A
zc>b!JWZeh7`<=L~g{kyPIVVqpZl!mMhpN2qYMl?#v%b&--(K~^4)2c&f*-89)vy=$
zul1Sh+~Zi(^ICN!(i2m{sb+ij*Oe(I<tuMz+yoz|Zgya%!+>YApTRgL`-U{nSV{WO
z>m~4v>z!)!c>?Bk0(7$y{FvJ%fojo!47gcY<OKuK4b*7pQVj#YdiCg=pRi{^cTAhH
z7ISBOrhidOnqMxkrt$kz`tn)tH#J1(JlG<cO4jPbrBa;n at y~8~<o~|6W?g1S_Eq%z
zY#aW^Ft0(Thpmg=%4y!xr{1$la|S*wtQVARczIDVr98G at s5cKi^U2|lwfDk`pVABj
zt^45EzV%Ot?{{dv*|YWZH|5%Oql-6u&|Rv%x1d<484#`eAOraM%u~~nF(>+ojk>^p
zf=3Q4M+|R=u4g6Q8$`y#ppl9qc<yoKtV&QuGlIL)FT-SW7)N<J>sCE- at 19qUMApg#
z|FolBVRNeqR_rj-rss3p)BL7jKVD^nu9;|?X!TL({^C4x6X%hB`Uo|Z at bz5SD}t&-
zt6_f!dk!!rko8U|gS;0yYeYs at m%z_4W>7dRTP5^2&XPaSJvb-0-1c>5Kpzu!reSBJ
zFl5=9QJw$za7t}ez at uG-iJoK+V-s<vv35ZB_DV4AJ!~(q^B=%sB*D&SC3HB6KY}F4
zpk*CQ)-2$-N}<a<D_|ztUI!ndJbnhYKc|L7fA){ANoVr}-Z%#yu<3yRn7VG*w*tAY
zhhFrwuKT2{e;A&H<J?YsEQFKqCG)2rytwuuGPlSX&-WU9ujxw4lZ#6BBu_6f_o_qk
zFb+O{SXR%HvM9q0mvPk&+)8hPZr+ukZN44B7SG>;n^tY=vP<i+$2ZeGZu at xtKw@8^
z?d(+b!#=3}tF#dP{UdA-oWPk97*2;JWZB)P6&8%uWl3uk7FGP0@)<?oSLB3QPtS0e
zy~wxTRlq(EuAh>aZ8}PJg=tFL(9n5!9nP(=ic|?Y&BrCj_he5fA^##p<8<&i`CMX4
zZ{WM<r-Yj?u_4^i2*uuBTnmX!WnlKF=564HKC|S(cBC;G_5*#tg`7vPfX?#3cmA7r
zd%d4wtdqRk2p!T}I1c;_8}tMQ{to*GJ&?K8`Rey{>q|x(6(_dEJ_7rBzL2q#@ga at O
zb-wmNPt}5pmZWsc1oIa<T~qqC(WO&Wj=j;5u<`aWY=pC-0pFr)CB52#J>eJIJ7I&d
zwAVOLPUQt1^DTnT(|+5 at -mG!=rHoW%R~{+tC>e;|_)exVx+dIgTn8Qr#u>inB*vN#
z>X-n0M655bGX=g3OY}b`76$ZE2K$%BJhD#v)rZM0Clep(u(b^x*W?lf at qvgv(G-Dr
z59|sYkRE_O4BNj0*HyOdg1v|<^cg|k7~5C3d~6Ee67PB5t}|YOOu`&6AN{2Sou(qP
zWMGuEuqm7exkOQr<#H3g<yovDA;C>gHKT8j1(jSlgZ3U3UH3f^{AJ8UQLgXtAlGH1
zXq)empx(=*|Gx at iE|&#mT;_sGE*IMjQVq_Kn4d#5u1ldOq8e8OTn=<z6y?cf{guh3
z;AK6i`q*AC*u&fqtSZd)sMOVu{!Mo95eJJ{UiawA!h>RO>b;$^!d&sF<#%@%%xc?x
zB=w0~Z^8DUd#Z;Z!LAIKUCmK=Q~i#5X&ZgywJSZe_L`itUlQ!?X at 9i5z@+7(TOHBb
zCM{?Gf3>}NT+>JQFRoBgjDm_wkv_Ewl&ZC|lu~Q0HEI<?ND&bw#kjXZ)jle<R;`c_
zPy&Q3A7TgrlCUVqPQ<E66*o++hyp??TSNrh5K>fX`+Ls^?9)EK`@OGw|G0mg*UV==
zvoB}PoH=t&DWhP#)WfYREyi)aeOsVSq<?60qQ^j$qDf=AW}og~y;Nvat4yX7_DCnt
z+I;5`S(OIajoO$><5ET at cS?db;D&sF`>$XVSJjp8k?gVPxuW}L*r-}<lD1_8O>D|i
z?1mlUDbYHcO)N(P)m7k;B)V+#%`ztkiToM&ws?kUib!|Bzk9le&_hzC=+d}L+@;VH
zpXvYP at l92_*GW^R at +k6Qb0><=2fdH>NxL7pOGK8uNlhZ-W=7Wh7pB$qQy4nY`rTiE
z$93F87OlHJWp at bLm~WaqB3&`XkSl^NjgOS3tm`fauaBv;S)R9L{$x}B-u;hjU>mXW
zdNy=R-HLHMu%f%weM`(@vPX%ar(o5B#UW0Y`hBK at xA^w!{XT)WU>7d&*v5Z<(X_^j
zq4wbQb+)>zj_S5e<e9jV>l)rTjPFFjC6!Rs#%4Et4qQ7!eG%h!nZGu^l#yr37HAJl
zWVHpQnHQ4xKtV~ux2PIM?#)bwE^y*tn9a81TArF!%rz~gj4D?8%_L<e-ZK}d^p=r+
zrD}Iyy|B_|iwJk&{a2y4Q^13KoYQTx)?-_Yt3>I>$#_Gg9(_D5xzE-h5djxE;Qbo+
z5;qAh<{$S9R^&c&%*LQ<QEaMSqz&m83L^P^hxd1~Cg9?hrMfIWAJCs_Q2Zn+|Gq#t
zEMVN>d>$3$7$NP;eG<bcJ`yj|z{ZT$X2Y^vm4xU!70*acQRRO$3A*MdHm#|=)fZy3
zN7!ZaDR`1c#BIUm?k<n$<EdP|WO0BQZA!J2autlHPNA&Cph<QT*il=BzR$7wE-wvq
zPKJXN`{hOG7z6JKx{ls;{rG7C+M(g*h%#qHugNkha&9LJ9df3(i}`E!#5;-tc85f+
z=<8qe$KkHvSy3A!iu)cn;yxhucabi5Y48)S;xI?F6LEI-QT0tC9r`=Ycy at QlvuS-H
zDybkpAl_$&LCMND%41smdsy0=M^Hx at OIxorx7);<KUCFP7C1j;warh-kg948xw|tm
zZ>VZ>b5&x?{J>IJfYqCi?}q(`dS%R(*gqJ$*z2Nnn~=QJ6`R*+jcP%$YO$eBbs1;n
zw*_`K3t^)$bM|SKzB_l}!^{cpNiiF3q6i=9aZR{Wn<glz=_uq)au>eL9EX4FZIWWP
zgx5ueZR7R(xI7kZ0I$jvCda*OL+iaydU8H at 2fbi~O{itCq3|ti4MQ)_5o01lM{pnZ
ziEhk;yzne>9>I6v+2Wi%?U_kDeb3QwQ)Yd*Hn0AG27JfFyh$AY?w{P%!U)LH<Q!;A
z%bpLtJv{KlU7|-v8YQD8uxA%`Q|(=<C_;I1)|4PM*PW|xP5J0|d at EYL+$Hhax13>*
z0BPR(`iXRUc~ks~dC`s^S(y&0*dueeuZb<@yKo~iwwZ!dijhZ6=?tw{!N|mWt}K;Y
zbX=8Pp=HMkE*RvZ0#(Myqil;c0;2?Dp*-zqDjlf}8gJHzP4v*!t79x}yknA$;~1JS
zxe)f>&Ap0AjLgVMzhu*8zbDEFyMeWOwMW|?J9=tJZG3E?+#tf8{|xR4|F)akPv2{!
zl<7Z}igY~BCF#b5?g<|8U523d+pemLuFFk at mfFKYQ6~LHuYnbNU5+<@N^5~rXtcoj
zynTsNXp;}-_}-w^;!0lq>3b&O;q=f*RtZlj6qsVHkD8(x+R!3aNwd<Uuz}_)Te5lP
z_v4)I96pyeTBJ?$+#M1tKU|X>9m8KS(q9V8AZ=lh9>q5lOZCQ5kDQt)mi95;=NfQ7
z)hsxD$y6JeE~55nmG$7U_FHP_`HNx#PT`Iug{8eS9y&pBchM{N$XSunq-o3JL%)xI
z>`mX88XIo^YGS)_Th4Pw*iHNw_I2!EA`|x6!e*H)^m?i2sLhU+r8{z9KQYw&?Q|({
zNE608gXl{EE@|-m+361Uz#rjHGem$kI at T`gJASy7aYU5FIAv9jJuY>P&Uo3Y!r{5l
z6d<c>A#pm68h%-JSrCc6n~rORH at KiZj@k%GJnY-?F%e{My`4h*Bn*6?<9M?OIt2Nj
z$2m_0TEq(UD*B93VyuFWqh!dnRf+EcC&KOyOVC_qcIL^=cb(6(io?{nzsB7Qp-(!V
z(R9qR at JwY+cn0d{>RH}&EhxZvT#@LJCTy{)N11wrwUU3Z^@OrW{jgS)pc!?pWnRbD
zEJQzLa*G?vPdnng);n8{uuq&XfR4J_Sco|VItumMIvp~(PR+2J37d>gP5wF8QwY8M
z7o7-NepV(A^3G1pJ-N_x0NL@`6-e9J-rM(xrn^q}b>Zy#QF9byUITQnVcqUUzPLXs
z(2AkQOhoMuu{saBw$?fGw%+q&G8T<|=h}w%SXs*`*yC=;_euCYVH^Ho?=KF;F^hRg
zEDd)f>(Vl+=_KBUo-wys+w)c_R4SoesVY*WH3|>a5d8v>^|BCAqZ%DA81k1DKyS5x
zb%{&C-g&!FXLTNDFr39O2TGkF7vQka|5Qh+m)L%ze{3UkJ5Aq=b{?a3bx$7Bx6uZA
zZIrp#dfI}zwgR&hW&Rce-V*R<n<v%qp3u~ee;uQ$R^s0 at yyuTwkmUKR(;ZV6zTcdF
z5p|~9(3%8%^}zhp`b`HFOS6~`1HJVay5cQH at j>6FgI3~WUUdb?#DbueuwmYwG68Kq
zXXJZkHq31L5&2 at yn$D7ZdC*&6r1R)`>elXz|Kf;%z!;q&dQ=UY5=W{iTdJLJ{U)gs
z^pj;ayn{B^I$vyfhwkgEx3$jt+t9Ow{wgr at t?j29d-a&}XirR~N-mRwhj6N)kbL(%
z2<l^*7VCO5 at n4AlEvgJVxhhg@Arc;H1n*J974<yEzfAmt4mP{ecJvV`H&8KHF3waT
zGp?e1ln0x4<qm)NH(ns~%ELeBVyX!1vu`r&FKmc>I6JF-VDhZ#khO4X5~oMDPlPV1
z!TVXKhHILR7lvQR*#Pz_a&V3_lCvB4R$ZivC&to<vHavb&JsOO!3X8LL67**nz6+>
z1Nun}Hj(kevw3Gh?>8fUv;V2;_ at Q&nMbxhYe4Y)4jOodw?4CRu=w2oBdAd*(HMm|O
zhby%@PtIOL=ct%S$}uxiJp*U&rz)38xyNvBve~D^x$48*T==c`rNO^259czByR7fE
zNcAMhK$wYa3xmuBBKPLxOlW-32FE8}1>OywDUu(>ZQ!ZKsr9xR(89 at FFVXZC#pA3N
z#g6C}MZLB~5yTfoGrD+_xPmO9=kZJa(x09wVn6xx##_Z)`OGKWWRDs{l=llxk at t(s
z_oP3tK8ks(>XIlr^3H4y at Ieyi0`{GUveTT`1W~R(d!CWt9B$mq);1>vXm8}f92bRh
zsWDyX!xd?I>lM;<Z19D=^1K_!9kkb<>~X*y`*5CXXG at VrwsHi!4Q@;Ih`JbpV{jj-
zy)J<sFcmWu<*ji2nY1fL*O9DzguS{H;jxe{=?9;tNkEPI0e<tVGSM$PiJXm7LsLZu
zf9?mc2 at 4%_W4ct)wm27!#(PUrAHVgYXlvAs0r{6j39diG=6p1%>!=s_H-$c at 3vo_&
z7oG38t$c*DI*sq88bb;C9CffJXSdNP>#j{I at N}Bzai;|s2REGK2Kq)ruJ>mN*%KOI
z11$k_>JL#ADa%dMTIbel$bdd#=mchJtC(WEN$$HpJ%ygDkkRgY1Ur$?)6%b<t|np7
z4bt+|K)!+ZyTB`$@9G7fj16#1Bg)%H&e|x4oL^(%Hv4O9Q~b48({S$PGeaDqGY0ti
zPoggx_*eTg{te*Yb?CpvyKDUGgKaJ{@A}X40@<JV*0XCc4mUm at 5qm)}{LqTEayIzO
z0h?}(IHo%M86(6lY1(wBP>+mriltdbq8DG^o1ygFbJRxGn+e$v?UmuN7{|U4={gSX
zaLHR-pK$J(*f!}_;bFq#4}KPVC}^d>!N?IEa|!1 at ZJ@Yq4V%-td2(@EPqs*>%z%8Y
zpP+T|{+Tl8P;VJGNuXgT)%(-(z;Z^Za5H0rdt%^<MvV#ghS*1N at 03Q3mSByZM_U$v
zC)B1I!6 at mlnfn3v%;0?d^$z-J4eJt59j{fj?>VaW#C&ia)73tknR+*O@|LtoyF=1~
zMOsz7qt=veC`pbp=uEY;64Mz&$+L1%p0d{As<XAv>FhL?EIV!aDOS<))7S5{e6Oru
zY*1xHl##jxI0 at dGH$`wc-~}rpCWR%aE9y#55!!0_ at o`;uPfy<BF6(~eA>+hzp@%h1
zzdK~r6nlQ~!_RXDR`l at GYEk}Gl&>$)n#%bl&f`^G^QW|B%&#_Oq at 9A^*CY-<Bb1fQ
z)5i#^N at E)%<9GS-^nTKeP|gA_<&(psSh1DVOiSZK4^eXzOOc&s-lD8^G$^xlHv&E&
zbvA#d%$RmVS#N1jow3zD$N4JY1MirdMdV-0_jDV|EVT1(koqgls#2 at ykM^MaU;kcy
zOhi at r=oOLiv%^&JGRSGi7Gpkl4X(Licyq#m&O-F7Ff#c+YwA`1;~sl6_z%~ZL1}7n
zHa*8f&CguI*)I$!(;~Qm)1a$%S|K-RS|WGFv=(lNZ8~=q^!h18>j~}!KP(sXev^{g
zb<9o*e%9yYt`agSzYNh5m4xRs#0Oi|O5Q#}KY>@C{dLHHsr=et?`b=)G;;>8R at WLn
zF|#FnTxM(d_{{cjyOuv*$sV}edgiFgwB!f&cTUHh-=`kQi59GtF&kA at wmIBiV@<9<
zOWv3*XO;a)rFqyW(mY&$#(fT*MlhIWC7s6dZ)w^{8dc(4?JW7<(qOHo-ZVh(Px1@!
z7BjIXPArtPWfNUmUsQqjdnB&k3hU_VZ$!S6ndBgW9M1VceNN^Qzq|IoI!C3}`o}uK
z=1?=vGEEi0J+)1-)3YH1_A|{(+%ja>bPLY4+o30 at jmVd!-X!|}l6%?(ejNxi at v1$e
zQg4V&?InI);P;*4HG3YH9&UxsD%c*2uF&nb_o`rzs1u-`Jp|Wv98%AL-e`dh>ce)Z
z<I}tuA{TUt>^rRzhr-?&kg<(uXlF$G246S>{<4RaKKDku$*%*v=M0o<!W*n(6QURz
z<2lgFO6-HE2cQKsALP*d?vl3<sW<8VDM5R5R>1jR+(B7*H<emT>!0l+Z=LLaZpuuH
zMcV{^ZAjMvxgG2m&KFW|`Co0&BYkz{Nyp=cQw`9w6{+^hZtwML!JR`+q(rR2yNn#2
z1a at K+kfj+c7jkmQzZx=e&_UY>eM%iy;#z>a+TM|aM_cGzn)>p5M#ssx){a9}&mb at 3
z2t7%69nN6??)5W42E82L9d-%KkaO(+>oTG1KdzOl2XA^3p<yx4IHC=h>!I8|<o!MP
zt|3Fb(i=U{sjYSjKEYgd at q5TJQOs5Q`+Fc)bKF^d$01i#HtN(41+VOO=r(eX- at dJ^
zB0`<q2YI$pA<ilu?t57^mu{4Qx<kP}YYb&eoG832z6ssDQ&>qnN%>DZ%2?-gYIc?p
z^k`)ad4CUC0LUP~>P)Wa)*<b-8#=+R{@h46u*Aulyc=wB)huA1GRr1A&(oVA7w=cc
z)3*$ByMg|HSy|LB@~hiO;agLJIxtc<PNMfc?3sRb;8);{^J~w at o|Z=S^Iq}N2iKx!
zUX3- at ZL)<sdE+ at j?O9&)9DKw+&-j{2O}NJx{bPHq#jTFms&nn9EM^_JmDzisKJ&?h
zBq9ST<{wzr8R at ZIwsC(#?k>|UaSp9-XJZd|K!k^A at d>#DbfM}V8Sy4fOj+w3ppOLM
z9spP5>xwz5f$Pqz&YaDw&wPhhn>mxvy)`4qT at +mg%IOzCH`2XXa at -ZH$9Ya*4#Zhl
zXO@{)va#2^GoPJlOeFUYT&?k3PqbS9nwHngzG|qbi{|a&o@>-sK<_`~mNV3k at CG~s
z{QaX=rOu_!8!9qLKJ128*?+?QYrtn+Y_qf9(&YqgAMEYf<LvSN>9mHsvaSnd2C-v_
zT_EVcPsh8}e%x_vB(`fw9Z>#7aYCAYK+Efgo?^9C!9VXv#1}eluWq#}VmBHpxYL96
z6*+&aSI$tqqEN3KoM(0H;iwnCJSQx%?$2$p0~)Iv1G*hK*74l5(_2K1qN9#8#ke;Y
zKX5BB at OMz+xbRwWLijDQAiQ228D1w&3%?=ehgVyda}zV1T&t9!-sKt21|cJNmL%q=
z8`dA at L8na;$rpN_d&KJC+7~Xf?Ci_AvKP)(vCv2R31mQI9O&qO5|1}XZf?bf)mFC{
z<BbBtO1GSAt9Hm3S|i`EB1}@(#Y+(#mVPyUENoxb7*z~SLpdW7d}>L9l2O#40RBmq
zcdIT7Ci=eY9_|q%tQ^K?X#=$Ct_jgipv6a*7?Z3CZ?FJvGTdDMJt<t+i9y*3LfC=g
z|JCn!Cwe=x={^~I+)Ew%=e?BpCqf(69T^&nzvcp&8+FmRzc{pdN=es$`n)8R_&45J
z0~%cY$Sni!phHe)SX~)#oGq!l*F2daZC=IDH~hv3=cc~UHJlRVhkbrZBMq|{0o^T8
zVH3D&u1YjZ`jv$R`Y{Xg#OTwWyBLqe9eVNcaCJ{sIBeO4r-?P;sp5)orF9-x3R#pi
zyvOqtWf<B;IR at Atohju)KIKT4_W=iYZlZ$);?!_c-1s;3ExGs)o1~%wxFtc^1KF*x
z5dzwc at 7B~0J3{6FtPK;7Y6Wj%*e^s+X7zJHhVP`*&x7{B)->WRo7;NCA)|tiJ((T;
zuL?fzRz}zkeF8sxS_MD&*NmAv0%Nwg+9KV2$X<vso`?LkPSFh5Y82<XJuYYpZ&${K
z-^F)XW;O78L3kG47Q(J+tJPe7kbl!69`tUbE|9e#wn?f2h|IF9lXGVMwaOo%^Q*6&
zKWrzj6!>HlbO2AKaS~)-)mBz|^i?g+aow<iCBwTLq8D2_^2PK_vJVZ>*mn%s)8oW^
zoYNv<qh&5nBIa9_;VtpOLEP4Hay7eM^{9;peD2oTdV%cSY_~c-^#4N7!`NSt7xrk9
zmsf at TCfI1jz6iSk_&4TE$BQZ=yRDlwvCd at Xk8GZxCUJ0fPQ+alHO9+j;?TE>+=ruI
zDqAn$?g}^wvbNOlnnB#;oLT(?&H*Jvzor%FLQj07?cE4VsC&F`JgqM}Pg!brjD7pu
z(U{GLZ+fJ8RlIJF5p={}!Mn$x6>B<7!TV}#i;XF{(4PogDfcR{-vazX?s*`W`)e2W
zKmITu)XANk(dysC-7#gQ!(Cars}ngRq0J+Q^iPI91 at 8m<C-!uy2KGIEg!~0$7TtW1
zS2XN^x3+XSMCG<lNJe|kJxq6(2sH~Jx43q9NG5Ee&j?H;Iz!3be(M3U=ioheC#e(h
zI}{_GkfcMutb<%?{HSbRg*hMmk3-JNG`uZ`z3F&j!@4RcQaI{Zq|l}a-vyX6Q5?Bi
zXOjdSgC(3|r_g0u+?VCMI+4D_d15meA43t&659sTT4x|_7V^mQMmoHGH at YVx-b2`~
zgkGV~wDfqUv7Ny`pz8_xWF7V|>Bwfhqsgn8BW?+wByQ#Db#L?f#il*g+4sWhGfjKy
zv+wSy(Yfpj&^cd+ekO7 at ejRe19ZBL(9g>7P&{-OukCM<RXF5{FpA!AWyl)K}$aQ8R
z&VFzDZp`Z#?_0V*A#Z~|6+36vyo<3GfX9b?>|igN{RwEeBry~I0=9b{-}NT3BM1M-
zWQ_inHUeqqB5f3%b}=1)0f`UY+e!mjBcrVJgcsthM;WIYV_WWu^$d+YUwv<CnpY7o
z{5;;ako!8czoqVDw#tyxaY at WX*#|6>KzD5cUAYPC4*w=>LK#QYBdy5WItljHchQIP
z0mqI6 at qV+^;&nU7+^{|B_`tha*q2`?VetQmG`3cHlq+Q9PmON5HC2Xkcb^Aur>TG~
zqRU%M`Ud5}e(qm1-kFZ%s#~C)CeM~bCXB2jlTfgr$Rr|VLWe=KV8da)n`^7VD%s^^
zb2fMm$re9!oDlD~sz;x*(8s&`9kJfWk#MrMF;)nJY?r=CGg~eekbi_Ov|^BV;?DZ&
zrQ&0*=zIItLHm1HFFSc at EqLo$RX0yQIJaS!{x0tKA at gzNH2pu7{$D*$-j?Nh6S^Ft
z{+7=@*d>>=+;z)u%Am(m3jgrIzJ5K9%s)D>{J-)VEbCQXFKlAyypGa!dX<+~Qzr6S
z4BIQD9{Kb<LtTJ_On15dQ at OjJJ6hesT`|@u-s?A-rNfrDiyXJRe$c`^C}+9fk$5%m
zd`fgydV0=j8;Q=0KD4=o^zG8mjaOl>;(kEj>dw}Ys?BAv_q+E&^I>t at 7D|-c9y@#|
z_bGJR7lPJK6*Fz_)II0*<-QF$ykn|TLB4CAp=5{tY96olgqAzSGw;Sy(M7Am)(t%D
zdEA=1$c{&1rqwSArhVg~$1jx?b5q%pjI&3~j!D;}xhbCIh<~5^w5i1E7jflK96`Wf
zoFe2~h`ZigQvMdIF2*fTd~B9n)NXZx*aj2xxizgdwCwUqrM4qFp5pwfo^6*3yn4{{
zOz)bO;jZBYIyY7&WUVlFbFsd?fj{GT#oWZJg`5k*Xr??SB0xX$iIKuCN(nCWyjU`h
zDVzB`n~}aJWGHUhRlb_v2iu&22+kYSHv#6ECN6YLHl<L%A#E?0n%Rc5Z2{xN!&LRt
z-v2h9<TX=}@s;ePikeos2fD+_{zl`^Vn(s?95p$p(7zZs;M7fNuEtIhq%#8lVgLJ_
zXQpjYL5~7#QBfmhJTptil|6jqktP<XC_z36b4X<Acu9~IB60%A7djrb;DbeXWF;(b
zsAEK1)mm$eMX=dM))l#vNNgoC*_kv?m8|!5{WIE=hi&1NITRZ+ at m?a-zSxL;a#szh
zr{O4QZ8LNsWCHKgc<MIM&!K>v7nE`lzSJc<Lk7KX*bm~Q!SgE0P+KD$yc^(Tg7Zmx
zX`CEy1A8Q}M^FMDtShlS06v)q><sD|PugRLZMm)&MeQTH){9X-bO5~m2Qz4$ndE14
z)=>;zwc578 at htXV&~;pC?;&1NFKEnOzD*k5_=o`sy=MvT;VF90@=}{Br0a at GxPh?O
zuIw$Q)5u`kH>o!p?|Cz9$a|o5MY#862CZ*l25s0xa2njrV!XeYU4}b>+9B6ymd%FF
z8S5gm)M^6G{&`lnx%@_RMT9^o(3107Iqf1(==fXzknl<2I*Kz%9sncmdh)9M#Xs?G
zL0 at ksBg&v>M1p=6z#jvD1pLv2{+d0}s~|*#^M?Fv)c2ckenx(a&S0Mo?f(GswINQp
zK{Ti#0~o?dH!1?4Z-<q|mEhe*66A(M%3+_7&`-=D<{r$4{!?$YCfV}cT4R4Ad`p4{
z%<jWjHj=zV;|C1QXOm;n#qA7 at 2sXdOBWPFWJC(P=nB;k}dZ%Y?^*50JOj75yONT9K
zw;1L_#t`)o;0(Be*ga#*J$-xE3^=-mvuZEv3slhMv9npi%B<AqJG!;@&2j4$`PxO$
zW0%7{;&~?W963`qomGFcwqLZ<rk{I66gN}eTEmrz;%xN1Y;K~V{I7W?6cx0K{C{)x
zYE2?E$L(aI$8Yf4M#(Nq_(@bC5+?KyrWf;x+wt493#*D)ZU^<Pb*g)(`3;jr*$s<C
zI at E({r(~T|saY9|@xp|}RY~l!xW!GU#jp$Q5Kr)fSLF3xR`D)<K|w>0NT(`g<v8>E
zJbC)(I=6PZyo^`nx$Nn0!<!`9h92pYV7(zKvVHWiH)Q^e4XIw&UYEi){EI8uHZu63
zhq{8A{bk3YE3kV~_nR?N^n^Ppts8qqe#g-(IaXI=Dm!wn<Y3K4 at hJ5^@T!UIQ<np5
z#5s8g&(QZ{)YGj<ueVbu1wo~r`s#mUy- at ua*Oo3qtJ=lV{FTS5_Kmq>^QbR;gO#V)
z$r!(bpdt5z2Hd9Hh<$2R$BBeBSo`Y8-}_1x?S>PIK31VkJv~0T9nY$QC#id|r&R^p
zB#N_%3tYMccqn*5yeVmLujRkz#vuBF>|R{dc%=%i1-$qVuwF=Ndw;?iJQK8Z8xOWY
ztjffA6ABuL<Qa`UUAC-d(+Y7m?g}$rh12nmT%lzdUx!RmdmHNcN5UExPo)-Zr11u6
zW5>y=U^_u;RP#mAV^xePSA6-<7wkr*rCE#kb!eB~=6>YQeFcgr!?BSmO{qN3bJ;v8
z at Y^=gFm55~gNH>Py1{+T|6J?Gs?EfX{j_J7ulqlXyzUL~PgGv_m$wp}^(%0k6tai4
z;!N0wir^g?qK&q}hKQ<Z^>js32F at a@I(|u5GkuVjLpg-j1-^pLR_x_j1RpD+O5Y at V
za&WDe=6df7$G0;)Kki*qiM at N;MM9&6i0b&TMSIdU9RL65jh}^iN&BDoivIFH>y7-&
zKhRr2{Qo+EF{7*t9Rn-#xPdK9l|-gJC~w{G>P6OA%sMxX|J9ot`#16eQ-ZNJvldfi
z- at _fxde~<xj#+0_ga7M*C(NGLs{KV7kp1H~Znm9nl-Q0pK4uIzDj9CZcNsSt_hLVl
zvlR(HVQ;PF%GUlg4RNL+jsxO2AdUm#pua}Ijst~#_8Z)ZCS%UMa(5zZ*HGB57!CdJ
z0Da!V9qO>9L2??mEQjAGNJ0Bq;OF7oL+^jVxZ_i}P;~rk(2)+n-}#8UY$)9;cPYY_
z423NT8pKz?RXD>%4bjwU)MMvRJr2TuASRuz%YJg7H_RL7FWM#hl%v2v-X^UhI$xYD
z$exO|Rm*rhw6DfsU-ctzf|1S-_jn1=^%3GcpXi!5tH{2Cv<C*uChKYxbhcNm1kIZ_
zAqBMf=E at ARW_e{yp2?+u2I3Fyk->v|B-#Irlqd>1@?)S^ClB(Wu?Bg?PwLn{wTOxe
zQALT;+j9^{E{aswGB&6b)-BG-j1q3qHqiNL_n~(g`jyMUFT;J)U|s^`6(L=BkiL^b
z-N?P8KP`7EuYkQbP7cv43m(00hrCru{O00eOWSinD~7WK0r~<DR}b@?U6Y-K)d%Qr
zFXyScw-IL<Xg&VH*YIzm*JJx__`l1)t11!us=n!H;4SqW`u{Mqc~||R5b*EYP$$T;
zpih_doC>>zH?`*e>7X0LY`n)LbUD at uaB6E^a4F7}DYkrLGE4AhQc$H)egXIbx`lQ_
z<}4gKUc<f{4;#yw^^Xji$d{wbCPvpiUOlO}Kp+&QZ+IQ_d~DUqjd5xr#^)e?RwXj$
ztNS;ge4Qv+l+MlJ#&cz-H%ixi=i_<;{H!FRuL~~ZD;i?4SDf#6w3B)s?_I+xZq^s%
z!bV+ABi?xoeHReg$2GilKWr|5-(m}!r=IcE{%Psn0#@<O6qd9;CGl8Q6yu4vTo74x
zi_ruBZ&h-<)r21NK^nZk5$pc~ZzW66An_^+(WZ5?VaMwAIF at v=;>rogG2{mp$#w;m
z$x5E%jQqS*qzxz&x2S{y`JQVtOSp>cHk&f>r_SA11w(YGj<ZsJGGNNgLL=o-(wIX1
z5l}WW9W?Ay(4nmXo~$R!9J9_pr$oqWH!ncJ(q0y1=d?e?J+|i{U3_pH!B78PAD)ye
zxl+WrC5&FYL>RF+YGyI=6d=zCUOnW6blGjs<s#jlc$^mvSHEzf(l#y;3*LGj!_b<d
zM&~ZA5=78tUS?={K>`caW!c1U&4Sjy*P{~kAbb<TYjVmSaD?q!;7!~$olpnRcGKkG
zN$3eJRFR>i4(4o=wY~!$gn)NYxHz({@93axHU00H-G&Rq=9C?I2TbTWzy8)J$Zr?8
zeN!@*mW^Mxm%PFF4sSZruvR+(pviC#@M73!)KkW(z?CWE+Mf>lY*GyB5>9ZQD2gi+
zn?xB2{kVgrb?^G+iPOnmM$(aW?2we>NakioQhbpE>|EGy1^(x^3|E*Lu$>!U2>JYD
zAu-}CS0}G)_}3Z|4PEo4UY#M)EfEUnk_12dCHDQ;j;#1Xf>V(9+K$wC=m3i^LK%Wq
z=q4e!gc}Op=_xNwNCe{!S7FFQ-WdenDcTuF;Xgr_6DiJib;251>D3S-Ls=0+Wkt|s
z6%LgpL|G^3vQpzSP|gWJ8RqmxypgkXDRqN9cWWKjNAxL8FBXGdJP&#?5jG?h&>^1$
zo1s*mEa-&#p+axSBskj=Z|iN6D>B{knlwA4z#&r9Q-D1%HNKQ5Yq7(5yC{SY9#ulT
z9(UFegr4B(@eY8p2VUCyEOg4iTeBv+X`0Et`!5kQY~qmry`MD>iT%T7%UfT}ro)H~
zSI<YJKkRS at A^6wD3%rQm64s&*PCFd&(yaX|MmN;=r|3S37iXgHtJZ#n{)ijuk2tTM
zwOd;v7)i_8RJbo9x*i(Ncu7Ly>u}fRb!_ccz*iWzcmRDqNBtAL&aDkY{-Ia%(eJOy
zI7ycw7U$4qgrbaup)wLsM%aIqQGqhVLuG`aj8Nn+1|*O at 27PwOaJ=JEJa|9xx*)kR
z2ku!q|HI;3<gW=q-9qFf9^JPUWDX)uxr559Cq#kpq!=AT4Oc|}KLehH9sZ|d95f^z
zomcEoS*3JY;6=q}50%BI|Lei~AZ1BVRwCR|Ixhh!3+u%h>qkK2RAT=Q@`vwjHxwfb
z{7cyBQxY1>Ut0y)NT)FX7r<JSXO6|){>x0V#^2i-i#~qP0{&W~d&+}*?kWDGn`Hjy
zXUlr<X0QjmUc7ZntYE&;gtfFy7_%VT)U~#hb%LklM2Hg2?~YI7=!`=1aXT%qcpt?&
z&l5MPU_;vuHYTG8Z-MJsd!pT9WFy|!^2t1lRF8ptXH!<B`t?)OU-7rLi7g<frwJ*e
z+ZJJ#jx;*J&J<+p?^@M+de%P_y at q~?r2FH9=t~<l9k$L!BHD~~vH|M^v<}8vhkj4T
zm}-TUY~N)%u4GvW-eMmIA9cn&Nn4(yu=T}8Zp&ThY$WvHY2=wq=b6`ZVxDJPAvk&3
z)sssetPX7*HWUxIg^s79;~np`bWb2Stn5Kr7DJn+><e)&VF~;dX6N<Xk_T>iC11PV
z4A2^(pYZiKw5Nb>&k>hNozd=bBwgVHw~=`BtKj52g__SePbm6&qp?*vR2Fo`&}Av<
zvhs)MEy`ZyA}90~-XSD{k2eoz`iZ9<MR<e5jfI{c=qJxTj=fSrL0%CuC}VNHiKF-5
z2hfR}1>?=c%^|L<s`%>-Mxv{+`0Ivbk(TVOu=fkur at o(X2LZQ#y~{+L at o$M1;T&{&
z)<pHT*YhENrzN&&#h(Tji8t6KIbW=q;}yvZugc=4z0iTDm-c#``YiZ+Ob3<h3&-TT
z7Q$2Wb?VG;PfB#M5sLGG1M}G2D+P<fSlKrzk!X?ap%9uE7%te*@dtRCNIP3DxgBr@
zGU7FLEiNlX?T{1O=u#_UcAUI&I=GYvJ!b|b;TPh*Qqd7DUc?JLuQ5Nhm at 0;Sm#L9n
z65ejqi6zhk+!P7@>*zWx{;Li#bRA0AjH<kjEb(H(iwsDLyvr?)Y^Ce5o301pbuO|?
zBs^X*-UoSJtMNvCR)~-C^dxWGvj{{{J1FAE`;s(rN8|rdBOl+ptBO#k{iJ^WWdfm9
zeg6hG;~~d&MBb^S>^OTlr?^1 at ol1fJT9euzwi5icH`By9w7g9Sk+)$4(|*|Q!uiS+
z3?5+hLD9xR+QjR|_1*%Vs(n%x`sx69wqs{btm6;S-uJ-2sShlD812!3b5wUg;1|}f
z_=Ah%nnlpdbVWUeE2VjO7jOp?L-Sh0o8;UQMi#fyGycZXUhFqwrcom5<CZ+vIUb4S
z)BHrK*u?GqQ)hF8#1lo$lrwpT at sO$4gJ&p(4kx_VX3rOeSrtN03gHD{z5c}ukPfb0
zw|4A(fi%sXi~3H+JaYv9d2;x1yfFknkft@?rs+)32fdRBPUFdY#}hiaff50i+iSUE
z;43}uQ{|vD6cwATN-HwGeU#-2^KR~>4ZvpyXueL!J6+((vJC}O6?jugWE!>%y`Q=^
z_<m|aGC5=X#dFMdV-fxVw|MPOJulqaA^Y_!@>)%BG2FTME`a+f`6l(Z&PLr=(Kr>f
z>-65icyHIjuOFm!vBp5_7U$9KRGdFfpuD}6<h>J<oHy99mEbkU$I@%N9Jt{OjT=N5
zk34(m!mM77GnRLchS1392i>+<gn1KMyfuZJBi0apINoEWI~IACSNmIQxrbwPRg~x~
z-DgxU_{>A$*lQ4ehJN!)f%m2y3fI%&^c at As2lhJ*L;V~<_cPvqxyWJ1H}v_M*%RsW
z9b`0Cvv<T|jh8{TUJw07>1+G(_I!x`>U~LQI at Uv4jt}>Nke5v!`NFEYwa)bpa8){F
z<!lH}`C~uPv-944fCXST3400skv)NgZg7y$_-6~^jR8zTcsaRetA7A^4Co{@*p&;s
zGIGaA&i at E|1RlT{@Bm<Yft5%2E<Sv261xko$e>8u$obVrH$TOvcz#OS0!}hy?N5HL
zb<&zg$YU5O5yC#ox!7B0{5^orm9zL<@#8l4q%@C}6S*&(rtn?lQU(>X4R(kNp}$}f
zWVk2s=cq2s&h>pR@#4Iu>{h9Rz=L9GWs<s&?bR|@<t9ev=TljN4rS9W<Xy^*X<DTy
zV--#netybHvMgPNyJ|<O$;V;6Osm|CxF4~!h`T|Z+^@CqS#!!L4_d+1o0c8ED8jp{
zY5A&B+XA_Qkp*4i>CkO5BT4~zwfCwD4`(p=l#Y?<%n{@L>BxK=HO at 6h$QuDx+fAkU
zB^UKkM}UV1{+miDN>QKqP$DWFCGp2Qf}0BHi8Kgs_cgFWB#g>aQH)QBUT}ku3!TB{
zd~ci=jFe^WO|?aCjoLD&Mr{E;597a}zrRsY4=4k404 at Wv0SZ72fW&tgN;4WR_{fwE
zU at Tw^z!LBVU?ji_FbCiQ_!#g30OvO7r7}{(03!ge0Z2XO0;U6;0UiKX!25uYv|Tii
zaz~|dr-<P?$MyApS%0>5)3t(^PB*mo4qiTSYRBatTfUAz`rx~lWiP&dSv+v?^0D5~
zb7!w^zg~R$E2NnZn3vRj{6lG12FZ)_IJw}x#v9cB%EBi<)C^qWbj$U=Po<5sf6jmA
z#{Z+og<taf*H@#SZ>nw8zjvu$zvFUQ-_Dl>zi+wRTDSx0g(=>YzQvmwuJ)$(w0Tou
zY2K6t?1zudXjF_UY^1(wI{xT+Rq5yRb!X0+!@n_|duzh|o`ICjS>NvcNMUs>@C<Kx
z$pZDeYZi|DWYhQGcSYE4ezwZ){U+Nnh1 at +Y!mTY9)BDBaevb59qa6G8j75FpSMM@@
zH+ya9FYC8%KECLYAlS(M_x9zF?~n82Hgs`Qmn;Y#u9~V`Xj)e`ad at di$UDm}<zLym
z(ld>JeMIKb9e<v`7v?DUo_UD%FShT-$lBkl{kjud)0i25R#p9bPk*x4!UqpRA3TfR
zLw)>Z-`s=SZ-=Xk8vi&w<+U9Frh^5spHBOH+P;+Sy^A$-RH2HvcjGr+Vsr&Bj at qy<
zaCqXGFZN&T at AZkXTydmyiSnh-{NIvK|F%xR&^1Ubiw9~&KRyH<){rze`=!<+w<q5v
z&74E}-(Gu_S^(Ee8%eF!UZOVXdKDXWmlem;-%fh<e;jmeP19b){J2Ez)P7Cv((a(T
zwTI-Rb&W%CJ86`rDUspvVaJ&F7q*O8 at Ij}=M{bX%%yk+V_m1Q5_S0vX-+X({QxC?l
z=J&^pyuDzA&5e&Ntn21Zd86{3aSj)z+fTUm_M4Ng?pwTEv406CF`WIGa;MLt)Gv7}
zMe9}v#BKEt7H(e^!e6}an}Q|#_Z(%1|Df^Nxi^dV<<}*v*M*h(Z{1M7YWwC>-8XNK
zd~mCISo at ti>$b)lHvQKxI6S#h`Ns2eS10{(>Dq*w-7O1mJ?QxGPWvOb#<tE6uJ`}$
zc;(4})4AtQ=Un>3JWHiJx+f*0;2SD0Yp*m%^FvHUX;{R`lCKXJo!XpmqI`o+mB`6R
zQ7q4+QWxb&m7i6_#08v;5Unga%nvz{APgq`We50(?oT82CS0<Pd;v=dJXSO<>Xy|w
zNw4ugimQxZpT2%_Uc&wVb-4D*kAAvyS at wt16yuVvRxH<CPInL~C6nd1%6+mgYDWlF
zvWdxcCGTer93L6euAX(Iy6A)4=lR1UJE)4OUj|+eo3!Z0Vk71K+rXVK_|nV4{F1)S
zm&%^(MLkG8|0iJC`%o2ty>I$ZBX)7<cn3!LP}fHLP at N1P>LK9r7 at z+!{i}TYC;3oI
zr}|JE9gx at h!F<R+F~W3!cEAWoS(7jk;#L7}0tNuD^7x<Jig`ZNVM`y%_7fj!8sNY}
zAIfqehZ?(NIkojDhbmaQoND)3PJOw2Ih|Jw!b^t2BU#HS!%%pnkVCZ|;!r=rou0^{
z`r(o?4~$1U$N5k%;r=+8L&Z-Stkb^FIMkQlaj1 at c9Li%chq??uiBH10-*Bik09H7M
z+V$_jaBIBp8m+yFw{QRK at 4gVH(7q7h(fsZ}7wG at f>5PbHq#m1%)Ut|)@=vuD)Tj8K
zUk at BFd?@!C`gRbK?_SDL8%3?e|G{q&#U1*V9eI`hI*rc<|C9U%zh^%f%<t9rtNcIJ
zCR1<!qx`||!So#{?*_e}Fkt_4ytapi>DpFm?Z|I`Y5Wd*PnLoDjpr0f_7O&UGu at UC
z+okn?AHR9{{^-BL;z<0zLGwy!j>pS4Ke#`BLMvBoSoY0%r)KFS)em`7nb%I7>{vZ}
z!tG_xJvaXtn6TQtjr+s9cUSpDWv_bM at 3N-x&IrY4yXt2w`*r&v*JocPE}G^4<d>=g
z=Td{BINe1D&jv1ibGG%HqhW^z at 1KCzZYRCD&|>}j>qnK}eZ8KotDJtmG-Xv-bx8Vz
zSM{;Ud{wt*?5p)LBf<N7^$+P44u#F&^I at +ot|xLl_*bK_&^BNnZc^B!6SsjHrM(Sk
zP*?-UPK91V%X{emS-=t74Xeri%+MNcAnhC0uxnwHen&DU1M?u=m=yogNBZs$t6sYk
z5KX;xqCWWUH^TnDQ$MVKlb at R+yZ6E);M$T^=3kGTX_&Fpb!v>`cc&LB=ZyPu3ne!$
zd at ITR-{W?Fwf04Epj+Yp>;BwYSMkTzx-!72KWvWPikxufS-DMiQz8v$pLIIf7j7pJ
zTEjXW{XpPv;iKRO4e{Hi%evpct2;aJ)#bk5H`kr**j9P+iPOuIFZN!>zn}G2zq)qz
z;mUI-o;jcUzl*=}`pMt7#hs*9w;a)Ltkm~>dHEQ{eRM?cbMEAmFDnaP?EM=~WOfy9
zV48MqW}4#cA#b^x*>$3rX-fDWFcM+z%&xL6Ow*yS5YLg>Qh$?q-`Qq}{|%Y&hCNJE
zIFF%eRN?HYhK>w1;&wxp0DglS`i<rIe$4EemB=YEs-X)biq&#W!ZZ~Qu(ZL at HFOj4
z2Gqz8bX~)4=o5-^&@_CBd^h1;0GW3J$enALZ8dCW%YcM=e>Uc6qYB{~=6&sMW=nMe
z>b?_qASfq3nrS-xBkDYbtGyM<TG0WS{ed&!lMtH(Qf8M^5c~?37Uu+$;4H!<w&#rz
z%=?-MuY!F^NVlEj&ouq6cLV?5IeT9q#xH`SHD=?!ZX4uKH#58MOks8^HZUZOD%4NG
zH1Ut44(Fi at S;HyjLjGwVX<HrYr)B9H at xHf7f--U6x1<2F7zqKe#ms~5IrK at 3SKbmW
zWLozyyXPdLZATy*EJON4hGxxf{C8k>zubm?kuW<ima<lS3HiK`jkZO`DC7;fJgyP_
zw25gF*Q4H+3=LPq;X8$T>zeQ3Jh#*~+ZcuLFvtT&F<Z8L<&}1LEwjrR at edjBeyNt{
zZVY918rzuN at 7thmTIg;KMO&kpotjN7qARrP{ZMB2p|PA|6?CCxET5*~D!nQ~%9y6G
zcCWmB67*de?zFx_om1e)8z`=kqcKt;=xdBc62cPMXe$SAx4jDfJqO>(+~Sp?%=@!0
z!WN1IeH!YK$)#+wV4swXcTuAX{iOE#b07M2jF*QVXFk-Ak;T<u{8P{`3Z%(I`grtJ
z9IFNQ`LfSQJtCOh2bZH>Pnq3s_;JX);+6)9=NVoV=IL at T@!@bral;<8Ih1KCJ;>EG
z3YquQOPHpYCT6GqSoGod=o=q<j1BmYQOxeMpEA3oGaWR><0!8dHlE}d_dS^3M^KiG
z)$$AGptB9h8~^K}Ych(BGBGE|Aj|`NGAZVq$TOp|m#b;u;2nhD;`>W}ch0DMigsu@
zCouNiv&x`nTZ;G1m>2fzSS^sj>Uzfy{7uTc_~t!k=ZbCULj~?^YcXDLV9n at Jwi@XR
zF*o)wO=suh&Q`<hp6r8vryvVL at hnLD;^ul)eBtM+b<lHwPf>=1*<EoI^IeH{Zg$Yz
zjzoXTSuM9QM-K(CWPWfR>o5<uA%7+F{>&)cIZ{|B8mvXqXFBxvNu*tmyp+tAO;1_c
z0X4I8Q5j^HwBYZ_Ia16y?afq17MZi+BUrymjKvLR_ttsHGZkZh33_yQGCQ}<<Z5mU
z(S~clAs5iE3e2NKX7_^z%+Uzc!JngrZq+>8HE4{tm at QYXp^nfig!*(x%N@$mmM+gf
zImH>UYtk&kT&YDrmmqE&=DrsH6EOy_F}vM>4|d#SwVac%N}41dnZa^qcf;!#&laq|
ze5`vbj&|K7W|zlHrs>;Cg!Qns17waa=D_Z)bH=XWSYK)ezhMvVbK;=0M}To%hjoa4
zyC`AFd?Z28_vd}S`5v=782WA+?qVMGGEKWvfDa at XkCT|gN$6+Pd+S5=56+VCn_dow
zjFlGsm<m at 77xiuU(i7!j{mmwMKwdrt{hAKksbO|%rLI~P^zJ%gofbCYZ6@*%<TATH
z{1|N)qFk(xb?dOF%;snj=l(>0w6PsFph@`>jM*088LYDb)FbB+`YE0z3zjhWjaJO=
z at 3u0#k3~3_4jf{39{mO7=+WkD=z}A;dyT?)aez}#;l0*Wtc!e%V;ahS#O(gQf`d09
zo*5baEEyBH8|$%inKRQ=B=asVOT{`~&+OiYx0=A2uz8I#1(?GZnWi-dnB9g8T+Df-
zP353n%&vtoOw(7f$UBnJdOH$zIfJ;zFjw`cw*q;@v0zt&***RO at J|XC^Oo5?<qI~}
zh;zm=Z|HNc0DS2X&n*KEQZPH;-^=VQr7#bqC|7M;L+a2-&ictrQ<){kB?a>(7ISP5
z`Y(yu+3SM(sDR at hJD2SX#5^cQ-wbDV{+<Y$q#xt0_Db_R4EuCl%=-s+dlzx<0gna&
z&qFT=WRZ&+cEg{??2I{px*uk>cuRnnic$X<{M*FrmX2i!ny~%?uCQeL)F at Mr`GK`_
zb^+%6H3v;2_LV!e-X#I|yo#>(k~Qa<@l6-%FGD>Kp<e`OR~i>>L3 at rPtsMRP1J)VV
zKR+3Ido*ZU8vdQaT+^cM$ou69;A at O`&wW>&3ig^a4>0d{Xn_wXZc*b><eB7o{6ajl
zb9)8sPWfT%$1?9{zum8Wn=)&isNXcsNqrh)(r8TsXqQHrb;fPk$o!fV0 at g<x(g;`{
z2Y&_dil$-Y*HMh4)xb5)iDNTs;DYx69t0z&CVBX=>LVkG456+ec~sVI*_iCx at ZU;)
zE$@GT^xMhgoX*HHCNeUNQshAmKUPm at 0K6A4stBKk{I|`%Bel%Ekvg)VHrb)1Dtel}
zGInCwHTs`Tew}J;#;@wJxizw}S<MpLtmd>~8FvQrK>G23sU#nOm$p&C%4np<lll&Z
z?Gx3UzP9)zXi>~F&KHde(`*%GnyI45xdmr_$lKN*8<|?K_6n`PNYaefA-v8=^}%nQ
zeuuK0uo34Qr%*!Q^@R+m`ih()`|_QX!;d=Y7v?)1A^!P=oyvLngJqCBM`2EpGm)dV
z6SzW&GqZ?F)HX|A<s(Xgy-faTMVQn%b8K;U=Coqb#jx{6Dy+C$Xm0Bkj?FL#=fgkk
z1mUxZgkk4To9S~FsULuaz2M7V2l;0HKXIt;bAxBJdX&r1G)adS7^2_QpHG-1__KI=
zf;n?u(u0Bz+KyEFb|)I?cBePW9q2u-0d-;}j!mzx<<4jhWS>`?r>8ekr6Ep9mqXqU
zeLut{_IaL1*!zJiL#F_jhXy)@?oKwY>)Sxid`|psa`sF6tFK at 6Io;QnQBU!fMnyaN
z!CKq>73q&@+S4+IZUEy7z<+?8xU+|#`-4VBm?vNXU__&$+Zr$dFa_U}8Wl!KqoViS
zMumByAGLU-A0_(GkIIGL6R>84A2ol0A653TA60JYM{$PvQI!A}e7hhXYn~rv_lX~+
zf<JS<A5{xijPC&eV>Qn07?ZK6$H+J~B?NfIv#GEj+0>4+Y^n;dw}MS|oMBV*%h^;W
zU=1Jf0J8z70quY(0ygCV2m|mU*c1h5hJOLv(}31UHWd)fe${qrP7Lw at w2IhN;9)k^
z32+dzsgXGid at Eg}!Xmd(J~q83-cHjfx5&MnWTR=2zmwijWKrBKvB|DZwLSL#?|agp
z0R?PImB*$mk3wH6{Px9cstC{vSco=+OYseNW+Cc>FyV1F#f4vjaFU*Yt&mMkLmodO
z+(X8uN&q+ER}~?B37hiF{ZCv~BKiw)9i!OPbNru=_ApA>kiTbB at c_kXHnr^Jf8xI?
z<NuXA3iJ~>o6QFOI{IlNRfV-rc*nJ~*i_kUjOk1^wYio}?YhOL!$|ml11l8mc4SlM
z{`}9sgM1$42>5$kPX^|IHJiF|*q4e- at TGbV`BGG*FBJ~=70BS%eT=?dz^061U#cA7
zwF`3s5c19czF$aL!ly`E$)+k$_aM}LnkDArF!c39jM*t)>e^XfYQafgYOLOuI{2e6
zHLu8*sx9=T)<>W|<-U|HVB`s3YH`nh+CuWZJcdmj8~4w!zqd_;`fjseQ?@8?B*6Mj
zjIllDl^dI41Du~>F4VKB`mLDr+u4-pHuRLBzqYPN`0H$HBhtu7I>g(B@*n?!d4}&-
zWn?42Ong5F+(4ZV1M<%Bs2=p+wrIo`qFu4R)Clz7L-g(c>3kXebRfwc^c4eiiI?`J
z!WQFCcodVgKhu5&=r at 1u1KLmS9d>E!WtOpnc&I{KC$mhY*MM-NuK$%^KPCO1%(8J1
z|K<YE?yLXt`G#|aPj(vgrqExCd$ylD+5W>%Wxszl^iA+|3DzfZ86ATlvLEu-Hd3^|
z%}C{HjrVtxIN-_T>YAiB#E<jk-`k2j{_%~u{f}?#P5<}?9r2HE<oS<p;JJT%kNK}}
z^wmH9<1XbN-`KbR at r}Eee|+N}<{#h6kc=+U9@)sjF%;AqDanu at b)|BL{G{#Fke}?o
zidW&925RJyMujbaaki=RRp0DGoI&2xU_YO>_N54z_G8Zgki1Er1Q(DrWbb?Bs=oB4
zDgfg*`BF;({{q+nrU61W`%-0a*`dDFP53(y?>XQw!VG)Y(qlS0=Ua;LCCT^rv+{$(
zo}IZh>{;E!VQpI`TKR36l;^kQ;5NVg*S9UNzW%kT`nr{4b?phqy1gf69N1e%?c3=~
zZT$vo6%Yxy12~4TGJx~9_=ao03+^&siUW7<zkMm*QeP@?i7zF=w=Lo`-t(bE4gaBo
zUiHcUsVh39iCI+awY4N-9OLndcG)+TyB{6$_<lqpW4z_A&sClizTdtsa%vuHPxk0J
zo#i3d59B)Wo`<CznrDtREZt+PIW0T;?uMze_!Vy{-4eIiQV(5L#$H+*Ib->Vbxy0t
zm*>nKZQ-)ZahIlPs!QKJulE at bzFCuIo*Oj&wehzj?H+I4Chomf^68wr!4q<~PPrGA
z^;Vy$WyZ4&zcs%IJu&$~;Dj|rqsOnfH+RFEzb<st6(!}3Q2gnb)Kl~<@O-+e;KHPc
z=ih(rc=lexoB1`l+KatY>s9YK4(xkyY0g_)?%S-Cmd><VA~+OMEj>3kV_0yC!>&;d
zkw4#ijdeA;`N!IEb5=^fxy18Z`uWO0zok4TXT>7kVs9QZ(A#$jZ{?z8Ja50xIJ~zO
zytRAI_RZhy4&T0c&bIYix6j$O+iTtjZkyfbxVyS}&0()3UpzQoA9(PVy7SnJy#08K
z0=yUVR&dz76^qzBHizl$yOg(hv7g%qJh$~o=l;IyJP%hlH`fn6KN!7g^UhsccWnP?
Mqo at 0p_g&rpKV4zJH2?qr

literal 0
HcmV?d00001

-- 
2.18.0



From linyunsheng at huawei.com  Mon Sep 30 01:38:42 2024
From: linyunsheng at huawei.com (Yunsheng Lin)
Date: Mon, 30 Sep 2024 16:38:42 +0800
Subject: [PATCH net v2 2/2] page_pool: fix IOMMU crash when driver has
 already unbound
In-Reply-To: <CAC_iWj+Shb6buVf+wZaWe-NZ+UVxmW9DYqsTiL27U+V_Ko_65w@mail.gmail.com>
References: <20240925075707.3970187-1-linyunsheng@huawei.com>
 <20240925075707.3970187-3-linyunsheng@huawei.com>
 <CAHS8izOxugzWJDTc-4CWqaKABTj=J4OHs=Lcb=SE9r8gX0J+yg@mail.gmail.com>
 <842c8cc6-f716-437a-bc98-70bc26d6fd38@huawei.com>
 <CAC_iWjLgNOtsbhqrhvvEz2C3S668qB8KatL_W+tPHMSkDrNS=w@mail.gmail.com>
 <0ef315df-e8e9-41e8-9ba8-dcb69492c616@huawei.com>
 <CAC_iWjKeajwn3otjdEekE6VDLHGEvqmnQRwpN5R3yHj8UpEiDw@mail.gmail.com>
 <934d601f-be43-4e04-b126-dc86890a4bfa@huawei.com>
 <CAC_iWjL7m4ZL2W2OZM5F22dLvZhxU6fyCXV_xjyGf+W7UP43EQ@mail.gmail.com>
 <ac2eec69-8f44-4adb-8182-02c78625851d@huawei.com>
 <CAC_iWj+Shb6buVf+wZaWe-NZ+UVxmW9DYqsTiL27U+V_Ko_65w@mail.gmail.com>
Message-ID: <ed399e31-cfe5-4504-9537-88879afac53d@huawei.com>

On 2024/9/30 16:09, Ilias Apalodimas wrote:
> On Sun, 29 Sept 2024 at 05:44, Yunsheng Lin <linyunsheng at huawei.com> wrote:
>>
>> On 2024/9/28 15:34, Ilias Apalodimas wrote:
>>
>> ...
>>
>>>
>>> Yes, that wasn't very clear indeed, apologies for any confusion. I was
>>> trying to ask on a linked list that only lives in struct page_pool.
>>> But I now realize this was a bad idea since the lookup would be way
>>> slower.
>>>
>>>> If I understand question correctly, the single/doubly linked list
>>>> is more costly than array as the page_pool case as my understanding.
>>>>
>>>> For single linked list, it doesn't allow deleting a specific entry but
>>>> only support deleting the first entry and all the entries. It does support
>>>> lockless operation using llist, but have limitation as below:
>>>> https://elixir.bootlin.com/linux/v6.7-rc8/source/include/linux/llist.h#L13
>>>>
>>>> For doubly linked list, it needs two pointer to support deleting a specific
>>>> entry and it does not support lockless operation.
>>>
>>> I didn't look at the patch too carefully at first. Looking a bit
>>> closer now, the array is indeed better, since the lookup is faster.
>>> You just need the stored index in struct page to find the page we need
>>> to unmap. Do you remember if we can reduce the atomic pp_ref_count to
>>> 32bits? If so we can reuse that space for the index. Looking at it
>>
>> For 64 bits system, yes, we can reuse that.
>> But for 32 bits system, we may have only 16 bits for each of them, and it
>> seems that there is no atomic operation for variable that is less than 32
>> bits.
>>
>>> requires a bit more work in netmem, but that's mostly swapping all the
>>> atomic64 calls to atomic ones.
>>>
>>>>
>>>> For pool->items, as the alloc side is protected by NAPI context, and the
>>>> free side use item->pp_idx to ensure there is only one producer for each
>>>> item, which means for each item in pool->items, there is only one consumer
>>>> and one producer, which seems much like the case when the page is not
>>>> recyclable in __page_pool_put_page, we don't need a lock protection when
>>>> calling page_pool_return_page(), the 'struct page' is also one consumer
>>>> and one producer as the pool->items[item->pp_idx] does:
>>>> https://elixir.bootlin.com/linux/v6.7-rc8/source/net/core/page_pool.c#L645
>>>>
>>>> We only need a lock protection when page_pool_destroy() is called to
>>>> check if there is inflight page to be unmapped as a consumer, and the
>>>> __page_pool_put_page() may also called to unmapped the inflight page as
>>>> another consumer,
>>>
>>> Thanks for the explanation. On the locking side, page_pool_destroy is
>>> called once from the driver and then it's either the workqueue for
>>> inflight packets or an SKB that got freed and tried to recycle right?
>>> But do we still need to do all the unmapping etc from the delayed
>>> work? Since the new function will unmap all packets in
>>> page_pool_destroy, we can just skip unmapping when the delayed work
>>> runs
>>
>> Yes, the pool->dma_map is clear in page_pool_item_uninit() after it does
>> the unmapping for all inflight pages with the protection of pool->destroy_lock,
>> so that the unmapping is skipped in page_pool_return_page() when those inflight
>> pages are returned back to page_pool.
> 
> Ah yes, the entire destruction path is protected which seems correct.
> Instead of that WARN_ONCE in page_pool_item_uninit() can we instead
> check the number of inflight packets vs what we just unmapped? IOW
> check 'mask' against what page_pool_inflight() gives you and warn if
> those aren't equal.
Yes, it seems it is quite normal to trigger the warning from testing,
it makes sense to check it against page_pool_inflight() to catch some
bug of tracking/calculating inflight pages.

> 
> 
> Thanks
> /Ilias
>>
>>>


From macpaul.lin at mediatek.com  Mon Sep 30 01:38:52 2024
From: macpaul.lin at mediatek.com (Macpaul Lin)
Date: Mon, 30 Sep 2024 16:38:52 +0800
Subject: [PATCH v4 3/5] arm64: dts: mediatek: mt8395-genio-1200-evk: Fix dtbs_check error for phy
In-Reply-To: <20240930083854.7267-1-macpaul.lin@mediatek.com>
References: <20240930083854.7267-1-macpaul.lin@mediatek.com>
Message-ID: <20240930083854.7267-3-macpaul.lin@mediatek.com>

The ethernet-phy node in mt8395-genio-1200-evk.dts was triggering a
dtbs_check error. The error message was:
  eth-phy0 at 1: $nodename:0: 'eth-phy0 at 1' does not match
              '^ethernet-phy(@[a-f0-9]+)?$'
Fix this issue by replacing 'eth-phy' node to generic 'ethernet-phy'.

Fixes: f2b543a191b6 ("arm64: dts: mediatek: add device-tree for Genio 1200 EVK board")
Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
---
 arch/arm64/boot/dts/mediatek/mt8395-genio-1200-evk.dts | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Changes for v2, v3 and v4:
 - No change.

diff --git a/arch/arm64/boot/dts/mediatek/mt8395-genio-1200-evk.dts b/arch/arm64/boot/dts/mediatek/mt8395-genio-1200-evk.dts
index 1ef6262b65c9..b4b48eb93f3c 100644
--- a/arch/arm64/boot/dts/mediatek/mt8395-genio-1200-evk.dts
+++ b/arch/arm64/boot/dts/mediatek/mt8395-genio-1200-evk.dts
@@ -187,7 +187,7 @@ mdio {
 		compatible = "snps,dwmac-mdio";
 		#address-cells = <1>;
 		#size-cells = <0>;
-		eth_phy0: eth-phy0 at 1 {
+		eth_phy0: ethernet-phy at 1 {
 			compatible = "ethernet-phy-id001c.c916";
 			reg = <0x1>;
 		};
-- 
2.45.2



From macpaul.lin at mediatek.com  Mon Sep 30 01:38:50 2024
From: macpaul.lin at mediatek.com (Macpaul Lin)
Date: Mon, 30 Sep 2024 16:38:50 +0800
Subject: [PATCH v4 1/5] arm64: dts: mt8195: Fix dtbs_check error for infracfg_ao node
Message-ID: <20240930083854.7267-1-macpaul.lin@mediatek.com>

The infracfg_ao node in mt8195.dtsi was causing a dtbs_check error.
The error message was:

syscon at 10001000: compatible: ['mediatek,mt8195-infracfg_ao', 'syscon',
                 'simple-mfd'] is too long

To resolve this, remove 'simple-mfd' from the 'compatible' property of the
infracfg_ao node.

Fixes: 37f2582883be ("arm64: dts: Add mediatek SoC mt8195 and evaluation board")
Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
---
 arch/arm64/boot/dts/mediatek/mt8195.dtsi | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Changes for v2, v3, and v4:
 - no change.

diff --git a/arch/arm64/boot/dts/mediatek/mt8195.dtsi b/arch/arm64/boot/dts/mediatek/mt8195.dtsi
index e89ba384c4aa..2e1b41359b43 100644
--- a/arch/arm64/boot/dts/mediatek/mt8195.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8195.dtsi
@@ -487,7 +487,7 @@ topckgen: syscon at 10000000 {
 		};
 
 		infracfg_ao: syscon at 10001000 {
-			compatible = "mediatek,mt8195-infracfg_ao", "syscon", "simple-mfd";
+			compatible = "mediatek,mt8195-infracfg_ao", "syscon";
 			reg = <0 0x10001000 0 0x1000>;
 			#clock-cells = <1>;
 			#reset-cells = <1>;
-- 
2.45.2



From macpaul.lin at mediatek.com  Mon Sep 30 01:38:53 2024
From: macpaul.lin at mediatek.com (Macpaul Lin)
Date: Mon, 30 Sep 2024 16:38:53 +0800
Subject: [PATCH v4 4/5] arm64: dts: mt8195: Fix dtbs_check error for mutex node
In-Reply-To: <20240930083854.7267-1-macpaul.lin@mediatek.com>
References: <20240930083854.7267-1-macpaul.lin@mediatek.com>
Message-ID: <20240930083854.7267-4-macpaul.lin@mediatek.com>

The mutex node in mt8195.dtsi was triggering a dtbs_check error:
  mutex at 1c101000: 'clock-names', 'reg-names' do not match any of the
                  regexes: 'pinctrl-[0-9]+'

This seems no need by inspecting the DT schemas and other reference boards,
so drop 'clock-names' and 'reg-names' in mt8195.dtsi.

Fixes: 92d2c23dc269 ("arm64: dts: mt8195: add display node for vdosys1")
Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
---
 arch/arm64/boot/dts/mediatek/mt8195.dtsi | 2 --
 1 file changed, 2 deletions(-)

Changes for v2, v3 and v4:
 - No change.

diff --git a/arch/arm64/boot/dts/mediatek/mt8195.dtsi b/arch/arm64/boot/dts/mediatek/mt8195.dtsi
index 2e1b41359b43..ade685ed2190 100644
--- a/arch/arm64/boot/dts/mediatek/mt8195.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8195.dtsi
@@ -3331,11 +3331,9 @@ &larb19 &larb21 &larb24 &larb25
 		mutex1: mutex at 1c101000 {
 			compatible = "mediatek,mt8195-disp-mutex";
 			reg = <0 0x1c101000 0 0x1000>;
-			reg-names = "vdo1_mutex";
 			interrupts = <GIC_SPI 494 IRQ_TYPE_LEVEL_HIGH 0>;
 			power-domains = <&spm MT8195_POWER_DOMAIN_VDOSYS1>;
 			clocks = <&vdosys1 CLK_VDO1_DISP_MUTEX>;
-			clock-names = "vdo1_mutex";
 			mediatek,gce-client-reg = <&gce0 SUBSYS_1c10XXXX 0x1000 0x1000>;
 			mediatek,gce-events = <CMDQ_EVENT_VDO1_STREAM_DONE_ENG_0>;
 		};
-- 
2.45.2



From macpaul.lin at mediatek.com  Mon Sep 30 01:38:54 2024
From: macpaul.lin at mediatek.com (Macpaul Lin)
Date: Mon, 30 Sep 2024 16:38:54 +0800
Subject: [PATCH v4 5/5] dt-bindings: display: mediatek: dpi: correct power-domains property
In-Reply-To: <20240930083854.7267-1-macpaul.lin@mediatek.com>
References: <20240930083854.7267-1-macpaul.lin@mediatek.com>
Message-ID: <20240930083854.7267-5-macpaul.lin@mediatek.com>

The MediaTek DPI module is typically associated with one of the
following multimedia power domains:
 - POWER_DOMAIN_DISPLAY
 - POWER_DOMAIN_VDOSYS
 - POWER_DOMAIN_MM
The specific power domain used varies depending on the SoC design.

These power domains are shared by multiple devices within the SoC.
In most cases, these power domains are enabled by other devices.
As a result, the DPI module of legacy SoCs often functions correctly
even without explicit configuration.

It is recommended to explicitly add the appropriate power domain
property to the DPI node in the device tree. Hence drop the
compatible checking for specific SoCs.

Fixes: 5474d49b2f79 ("dt-bindings: display: mediatek: dpi: Add power domains")
Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
Signed-off-by: Jitao Shi <jitao.shi at mediatek.com>
Signed-off-by: Pablo Sun <pablo.sun at mediatek.com>
---
 .../display/mediatek/mediatek,dpi.yaml        | 24 ++++++++-----------
 1 file changed, 10 insertions(+), 14 deletions(-)

Changes for v2:
 - Because of the corresponding dts fix has been reviewed with a Reviewed-by: tag.
   [1] https://lore.kernel.org/all/20240925080515.16377-1-macpaul.lin at mediatek.com/
   We still need this change to fix the 2 dtbs_check errors.
   So keeps no change here.

Changes for v3:
 - The origin patch is [2]
   https://lore.kernel.org/all/20240926111449.9245-2-macpaul.lin at mediatek.com/
 - Thanks for Conor's reminding, after MediaTek's internal discussion,
   This patch v3 is the replacement of [2] v2.
   Because the DPI module should has a explicit configuration with power domain.
 - Drop Acked-by: tag since v3 is nearly a new patch for different approach.

Changes for v4:
 - No change. Please help to review it again.

diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml b/Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml
index 3a82aec9021c..497c0eb4ed0b 100644
--- a/Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml
+++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.yaml
@@ -63,6 +63,16 @@ properties:
       - const: sleep
 
   power-domains:
+    description: |
+      The MediaTek DPI module is typically associated with one of the
+      following multimedia power domains:
+        POWER_DOMAIN_DISPLAY
+        POWER_DOMAIN_VDOSYS
+        POWER_DOMAIN_MM
+      The specific power domain used varies depending on the SoC design.
+
+      It is recommended to explicitly add the appropriate power domain
+      property to the DPI node in the device tree.
     maxItems: 1
 
   port:
@@ -79,20 +89,6 @@ required:
   - clock-names
   - port
 
-allOf:
-  - if:
-      not:
-        properties:
-          compatible:
-            contains:
-              enum:
-                - mediatek,mt6795-dpi
-                - mediatek,mt8173-dpi
-                - mediatek,mt8186-dpi
-    then:
-      properties:
-        power-domains: false
-
 additionalProperties: false
 
 examples:
-- 
2.45.2



From macpaul.lin at mediatek.com  Mon Sep 30 01:38:51 2024
From: macpaul.lin at mediatek.com (Macpaul Lin)
Date: Mon, 30 Sep 2024 16:38:51 +0800
Subject: [PATCH v4 2/5] dt-bindings: iommu: mediatek: Fix interrupt count constraint for new SoCs
In-Reply-To: <20240930083854.7267-1-macpaul.lin@mediatek.com>
References: <20240930083854.7267-1-macpaul.lin@mediatek.com>
Message-ID: <20240930083854.7267-2-macpaul.lin@mediatek.com>

The infra-iommu node in mt8195.dtsi was triggering a CHECK_DTBS error due
to an excessively long 'interrupts' property. The error message was:

  infra-iommu at 10315000: interrupts: [[0, 795, 4, 0], [0, 796, 4, 0],
                     [0, 797, 4, 0], [0, 798, 4, 0], [0, 799, 4, 0]]
                     is too long

To address this issue, update the compatbile matching rule for
'interrupts' property. This change allows flexibility in the number
of interrupts for new SoCs like MT8195.
The purpose of these 5 interrupts is also added into description.

Fixes: bca28426805d ("dt-bindings: iommu: mediatek: Convert IOMMU to DT schema")
Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
---
 .../bindings/iommu/mediatek,iommu.yaml        | 28 ++++++++++++++++++-
 1 file changed, 27 insertions(+), 1 deletion(-)

Changes for v2:
 - commit message: re-formatting and add a description of adding 5 interrupts.
 - add 'description' and 'maxItems: 5' for 'interrupt' property of
   'mt8195-iommu-infra'
 - others keeps 'maxItems: 1'

Changes for v3:
 - Refine the description for 'interrupts' property and fixes the compatible
   matching rules.
 - Refine commit message.

Changes for v4:
  - add missing 'minItems: 5' to 'mediatek,mt8195-iommu-infra'.
    Thanks the explanation from Conor and Krzysztof. 

diff --git a/Documentation/devicetree/bindings/iommu/mediatek,iommu.yaml b/Documentation/devicetree/bindings/iommu/mediatek,iommu.yaml
index ea6b0f5f24de..33b330d83e01 100644
--- a/Documentation/devicetree/bindings/iommu/mediatek,iommu.yaml
+++ b/Documentation/devicetree/bindings/iommu/mediatek,iommu.yaml
@@ -96,7 +96,15 @@ properties:
     maxItems: 1
 
   interrupts:
-    maxItems: 1
+    description: |
+      Usually, the IOMMU requires only 1 interrupt.
+
+      The IOMMU of MT8195 has 5 banks: 0/1/2/3/4.
+      Each bank has a set of APB registers corresponding to the
+      normal world, protected world 1/2/3, and secure world, respectively.
+      Therefore, 5 interrupt numbers are needed for MT8195.
+    minItems: 1
+    maxItems: 5
 
   clocks:
     items:
@@ -210,6 +218,24 @@ allOf:
       required:
         - mediatek,larbs
 
+  - if:
+      properties:
+        compatible:
+          contains:
+            enum:
+              - mediatek,mt8195-iommu-infra
+
+    then:
+      properties:
+        interrupts:
+          minItems: 5
+          maxItems: 5
+
+    else:
+      properties:
+        interrupts:
+          maxItems: 1
+
 additionalProperties: false
 
 examples:
-- 
2.45.2



From angelogioacchino.delregno at collabora.com  Mon Sep 30 01:49:06 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Mon, 30 Sep 2024 10:49:06 +0200
Subject: [PATCH v2 2/5] dt-bindings: iommu: mediatek: Fix interrupt count
 constraint for new SoCs
In-Reply-To: <20240926111449.9245-2-macpaul.lin@mediatek.com>
References: <20240926111449.9245-1-macpaul.lin@mediatek.com>
 <20240926111449.9245-2-macpaul.lin@mediatek.com>
Message-ID: <8883c84d-8333-4b04-83b5-022be5b6153c@collabora.com>

Il 26/09/24 13:14, Macpaul Lin ha scritto:
> The infra-iommu node in mt8195.dtsi was triggering a CHECK_DTBS error due
> to an excessively long 'interrupts' property. The error message was:
> 
>    infra-iommu at 10315000: interrupts: [[0, 795, 4, 0], [0, 796, 4, 0],
>                       [0, 797, 4, 0], [0, 798, 4, 0], [0, 799, 4, 0]]
>                       is too long
> 
> To address this issue, add "minItems: 1" and "maxItems: 5" constraints to
> the 'interrupts' property in the DT binding schema. This change allows for
> flexibility in the number of interrupts for new SoCs.
> The purpose of these 5 interrupts is also added.
> 
> Fixes: bca28426805d ("dt-bindings: iommu: mediatek: Convert IOMMU to DT schema")
> Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
> ---
>   .../bindings/iommu/mediatek,iommu.yaml        | 25 ++++++++++++++++++-
>   1 file changed, 24 insertions(+), 1 deletion(-)
> 
> Changes for v2:
>   - commit message: re-formatting and add a description of adding 5 interrupts.
>   - add 'description' and 'maxItems: 5' for 'interrupt' property of
>     'mt8195-iommu-infra'
>   - others keeps 'maxItems: 1'
> 
> diff --git a/Documentation/devicetree/bindings/iommu/mediatek,iommu.yaml b/Documentation/devicetree/bindings/iommu/mediatek,iommu.yaml
> index ea6b0f5f24de..fdd2996d2a31 100644
> --- a/Documentation/devicetree/bindings/iommu/mediatek,iommu.yaml
> +++ b/Documentation/devicetree/bindings/iommu/mediatek,iommu.yaml
> @@ -96,7 +96,8 @@ properties:
>       maxItems: 1
>   
>     interrupts:
> -    maxItems: 1
> +    minItems: 1
> +    maxItems: 5
>   
>     clocks:
>       items:
> @@ -210,6 +211,28 @@ allOf:
>         required:
>           - mediatek,larbs
>   
> +  - if:
> +      properties:
> +        compatible:
> +          contains:
> +            enum:
> +              - mediatek,mt8195-iommu-infra
> +
> +    then:
> +      properties:
> +        interrupts:
> +          description: |

Do you really need to keep the formatting?

If you rephrase that as:

The infra IOMMU in MT8195 has five banks: each features one set
of APB registers for the normal world (set 0), one for the protected
world (sets 1-3) and one for the secure world (set 4), and each set
has its own interrupt. Therefore, five interrupts are needed.

...you won't need the bar :-)

> +            The IOMMU of MT8195 has 5 banks: 0/1/2/3/4.
> +            Each bank has a set of APB registers corresponding to the
> +            normal world, protected world 1/2/3, and secure world, respectively.
> +            Therefore, 5 interrupt numbers are needed.
> +          maxItems: 5

minItems: 5

Cheers,
Angelo




From angelogioacchino.delregno at collabora.com  Mon Sep 30 01:57:00 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Mon, 30 Sep 2024 10:57:00 +0200
Subject: [PATCH v9 2/3] regulator: Add devres version of
 of_regulator_get_optional()
In-Reply-To: <20240930044525.2043884-3-wenst@chromium.org>
References: <20240930044525.2043884-1-wenst@chromium.org>
 <20240930044525.2043884-3-wenst@chromium.org>
Message-ID: <70779c00-7f2a-4038-9241-b8bb2004948f@collabora.com>

Il 30/09/24 06:45, Chen-Yu Tsai ha scritto:
> There are existing uses for a devres version of of_regulator_get_optional()
> in power domain drivers. On MediaTek platforms, power domains may have
> regulator supplies tied to them. The driver currently tries to use
> devm_regulator_get() to not have to manage the lifecycle, but ends up
> doing it in a very hacky way by replacing the device node of the power
> domain controller device to the device node of the power domain that is
> currently being registered, getting the supply, and reverting the device
> node.
> 
> Provide a better API so that the hack can be replaced.
> 
> Signed-off-by: Chen-Yu Tsai <wenst at chromium.org>

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>




From angelogioacchino.delregno at collabora.com  Mon Sep 30 01:57:01 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Mon, 30 Sep 2024 10:57:01 +0200
Subject: [PATCH v9 1/3] regulator: Add of_regulator_get_optional() for
 pure DT regulator lookup
In-Reply-To: <20240930044525.2043884-2-wenst@chromium.org>
References: <20240930044525.2043884-1-wenst@chromium.org>
 <20240930044525.2043884-2-wenst@chromium.org>
Message-ID: <b261e9b1-826a-456a-bf69-b15bf50c3fa8@collabora.com>

Il 30/09/24 06:45, Chen-Yu Tsai ha scritto:
> The to-be-introduced I2C component prober needs to enable regulator
> supplies (and toggle GPIO pins) for the various components it intends
> to probe. To support this, a new "pure DT lookup" method for getting
> regulator supplies is needed, since the device normally requesting
> the supply won't get created until after the component is probed to
> be available.
> 
> Add a new of_regulator_get_optional() function for this. This mirrors
> the existing regulator_get_optional() function, but is OF-specific.
> The underlying code that supports the existing regulator_get*()
> functions has been reworked in previous patches to support this
> specific case.
> 
> Also convert an existing usage of "dev && dev->of_node" to
> "dev_of_node(dev)".
> 
> Link: https://lore.kernel.org/all/20231220203537.83479-2-jernej.skrabec at gmail.com/ [1]
> Signed-off-by: Chen-Yu Tsai <wenst at chromium.org>
> Reviewed-by: Andy Shevchenko <andriy.shevchenko at linux.intel.com>

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>




From angelogioacchino.delregno at collabora.com  Mon Sep 30 02:01:56 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Mon, 30 Sep 2024 11:01:56 +0200
Subject: [PATCH v2] mmc: mtk-sd: Implement Host Software Queue for eMMC and SD Card
Message-ID: <20240930090156.33537-1-angelogioacchino.delregno@collabora.com>

Add support for Host Software Queue (HSQ) and enable it when the
controller instance does not have Command Queue Engine HW support.

It was chosen to enable HSQ only for eMMC and SD/MicroSD cards
and not for SDIO as performance improvements are seen only for
the former.

Performance was measured with a SanDisk Extreme Ultra A2 MicroSD
card in a MediaTek MT8195T Acer Chromebook Spin 513 (CP513-2H),
by running FIO (bs=4k) on an ArchLinux userspace.

.... Summarizing ....
Random read:     +24.28% IOPS, +24.29% BW
Sequential read: +3.14%  IOPS, +3.49%  BW
Random RW (avg): +50.53% IOPS, +50.68% BW

Below, more data from the benchmarks.

Before:
 - Random read: IOPS=1643, BW=6574KiB/s
   bw (  KiB/s): min= 4578, max= 7440, per=99.95%, avg=6571.55, stdev=74.16, samples=953
   iops        : min= 1144, max= 1860, avg=1642.14, stdev=18.54, samples=953
   lat (msec)  : 100=0.01%, 250=0.12%, 500=0.38%, 750=97.89%, 1000=1.44%, 2000=0.16%
 - Sequential read: IOPS=19.1k, BW=74.4MiB/s
   bw (  KiB/s): min=12288, max=118483, per=100.00%, avg=76293.38, stdev=1971.42, samples=956
   iops        : min= 3072, max=29620, avg=19072.14, stdev=492.87, samples=956
   lat (msec)  : 4=0.01%, 10=0.01%, 20=0.21%, 50=23.95%, 100=75.67%, 250=0.05%, 500=0.03%, 750=0.08%
 - Random R/W: read: IOPS=282, BW=1129KiB/s (1156kB/s)  write: IOPS=284, BW=1136KiB/s
   read bw (  KiB/s): min=   31, max= 3496, per=100.00%, avg=1703.67, stdev=155.42, samples=630
   read iops        : min=    7, max=  873, avg=425.22, stdev=38.85, samples=630
   wri  bw (  KiB/s): min=   31, max= 3443, per=100.00%, avg=1674.27, stdev=164.23, samples=644
   wri  iops        : min=    7, max=  860, avg=417.87, stdev=41.03, samples=644
   lat (msec)   : 250=0.13%, 500=0.44%, 750=0.84%, 1000=22.29%, 2000=74.01%, >=2000=2.30%

After:
 - Random read: IOPS=2042, BW=8171KiB/s
   bw (  KiB/s): min= 4907, max= 9072, per=99.94%, avg=8166.80, stdev=93.77, samples=954
   iops        : min= 1226, max= 2268, avg=2040.78, stdev=23.41, samples=954
   lat (msec)   : 100=0.03%, 250=0.13%, 500=52.88%, 750=46.64%, 1000=0.32%
 - Sequential read: IOPS=19.7k, BW=77.0MiB/s
   bw (  KiB/s): min=67980, max=94248, per=100.00%, avg=78894.27, stdev=1475.07, samples=956
   iops        : min=16994, max=23562, avg=19722.45, stdev=368.76, samples=956
   lat (msec)   : 4=0.01%, 10=0.01%, 20=0.05%, 50=28.78%, 100=71.14%, 250=0.01%, 500=0.02%
 - Random R/W: read: IOPS=424, BW=1699KiB/s  write: IOPS=428, BW=1714KiB/s
   read bw (  KiB/s): min=  228, max= 2856, per=100.00%, avg=1796.60, stdev=112.59, samples=901
   read iops        : min=   54, max=  712, avg=447.81, stdev=28.21, samples=901
   wri  bw (  KiB/s): min=   28, max= 2904, per=100.00%, avg=1780.11, stdev=128.27, samples=916
   wri  iops        : min=    4, max=  724, avg=443.69, stdev=32.14, samples=916

Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
---

Changes in v2:
 - Added missing `select MMC_HSQ` for MMC_MTK Kconfig

 drivers/mmc/host/Kconfig  |  1 +
 drivers/mmc/host/mtk-sd.c | 49 +++++++++++++++++++++++++++++++++++++--
 2 files changed, 48 insertions(+), 2 deletions(-)

diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig
index 7199cb0bd0b9..0ba5a9f769fb 100644
--- a/drivers/mmc/host/Kconfig
+++ b/drivers/mmc/host/Kconfig
@@ -1009,6 +1009,7 @@ config MMC_MTK
 	depends on COMMON_CLK
 	select REGULATOR
 	select MMC_CQHCI
+	select MMC_HSQ
 	help
 	  This selects the MediaTek(R) Secure digital and Multimedia card Interface.
 	  If you have a machine with a integrated SD/MMC card reader, say Y or M here.
diff --git a/drivers/mmc/host/mtk-sd.c b/drivers/mmc/host/mtk-sd.c
index 5165a33bf74b..a9a554bd3f44 100644
--- a/drivers/mmc/host/mtk-sd.c
+++ b/drivers/mmc/host/mtk-sd.c
@@ -33,6 +33,7 @@
 #include <linux/mmc/slot-gpio.h>
 
 #include "cqhci.h"
+#include "mmc_hsq.h"
 
 #define MAX_BD_NUM          1024
 #define MSDC_NR_CLOCKS      3
@@ -473,6 +474,7 @@ struct msdc_host {
 	bool hs400_tuning;	/* hs400 mode online tuning */
 	bool internal_cd;	/* Use internal card-detect logic */
 	bool cqhci;		/* support eMMC hw cmdq */
+	bool hsq_en;		/* Host Software Queue is enabled */
 	struct msdc_save_para save_para; /* used when gate HCLK */
 	struct msdc_tune_para def_tune_para; /* default tune setting */
 	struct msdc_tune_para saved_tune_para; /* tune result of CMD21/CMD19 */
@@ -1170,7 +1172,9 @@ static void msdc_track_cmd_data(struct msdc_host *host, struct mmc_command *cmd)
 
 static void msdc_request_done(struct msdc_host *host, struct mmc_request *mrq)
 {
+	struct mmc_host *mmc = mmc_from_priv(host);
 	unsigned long flags;
+	bool hsq_req_done;
 
 	/*
 	 * No need check the return value of cancel_delayed_work, as only ONE
@@ -1178,6 +1182,27 @@ static void msdc_request_done(struct msdc_host *host, struct mmc_request *mrq)
 	 */
 	cancel_delayed_work(&host->req_timeout);
 
+	/*
+	 * If the request was handled from Host Software Queue, there's almost
+	 * nothing to do here, and we also don't need to reset mrq as any race
+	 * condition would not have any room to happen, since HSQ stores the
+	 * "scheduled" mrqs in an internal array of mrq slots anyway.
+	 * However, if the controller experienced an error, we still want to
+	 * reset it as soon as possible.
+	 *
+	 * Note that non-HSQ requests will still be happening at times, even
+	 * though it is enabled, and that's what is going to reset host->mrq.
+	 * Also, msdc_unprepare_data() is going to be called by HSQ when needed
+	 * as HSQ request finalization will eventually call the .post_req()
+	 * callback of this driver which, in turn, unprepares the data.
+	 */
+	hsq_req_done = host->hsq_en ? mmc_hsq_finalize_request(mmc, mrq) : false;
+	if (hsq_req_done) {
+		if (host->error)
+			msdc_reset_hw(host);
+		return;
+	}
+
 	spin_lock_irqsave(&host->lock, flags);
 	host->mrq = NULL;
 	spin_unlock_irqrestore(&host->lock, flags);
@@ -1187,7 +1212,7 @@ static void msdc_request_done(struct msdc_host *host, struct mmc_request *mrq)
 		msdc_unprepare_data(host, mrq->data);
 	if (host->error)
 		msdc_reset_hw(host);
-	mmc_request_done(mmc_from_priv(host), mrq);
+	mmc_request_done(mmc, mrq);
 	if (host->dev_comp->recheck_sdio_irq)
 		msdc_recheck_sdio_irq(host);
 }
@@ -1347,7 +1372,7 @@ static void msdc_ops_request(struct mmc_host *mmc, struct mmc_request *mrq)
 	struct msdc_host *host = mmc_priv(mmc);
 
 	host->error = 0;
-	WARN_ON(host->mrq);
+	WARN_ON(!host->hsq_en && host->mrq);
 	host->mrq = mrq;
 
 	if (mrq->data)
@@ -2916,6 +2941,19 @@ static int msdc_drv_probe(struct platform_device *pdev)
 		mmc->max_seg_size = 64 * 1024;
 		/* Reduce CIT to 0x40 that corresponds to 2.35us */
 		msdc_cqe_cit_cal(host, 2350);
+	} else if (mmc->caps2 & MMC_CAP2_NO_SDIO) {
+		/* Use HSQ on eMMC/SD (but not on SDIO) if HW CQE not supported */
+		struct mmc_hsq *hsq = devm_kzalloc(&pdev->dev, sizeof(*hsq), GFP_KERNEL);
+		if (!hsq) {
+			ret = -ENOMEM;
+			goto release;
+		}
+
+		ret = mmc_hsq_init(hsq, mmc);
+		if (ret)
+			goto release;
+
+		host->hsq_en = true;
 	}
 
 	ret = devm_request_irq(&pdev->dev, host->irq, msdc_irq,
@@ -3043,6 +3081,9 @@ static int __maybe_unused msdc_runtime_suspend(struct device *dev)
 	struct mmc_host *mmc = dev_get_drvdata(dev);
 	struct msdc_host *host = mmc_priv(mmc);
 
+	if (host->hsq_en)
+		mmc_hsq_suspend(mmc);
+
 	msdc_save_reg(host);
 
 	if (sdio_irq_claimed(mmc)) {
@@ -3073,6 +3114,10 @@ static int __maybe_unused msdc_runtime_resume(struct device *dev)
 		pinctrl_select_state(host->pinctrl, host->pins_uhs);
 		enable_irq(host->irq);
 	}
+
+	if (host->hsq_en)
+		mmc_hsq_resume(mmc);
+
 	return 0;
 }
 
-- 
2.46.1



From angelogioacchino.delregno at collabora.com  Mon Sep 30 02:13:50 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Mon, 30 Sep 2024 11:13:50 +0200
Subject: [PATCH v2 1/2] mmc: mtk-sd: Add support for MT8196
In-Reply-To: <20240929074558.2076-2-andy-ld.lu@mediatek.com>
References: <20240929074558.2076-1-andy-ld.lu@mediatek.com>
 <20240929074558.2076-2-andy-ld.lu@mediatek.com>
Message-ID: <e969918b-3af4-4880-9dc6-fba868a9937a@collabora.com>

Il 29/09/24 09:44, Andy-ld Lu ha scritto:
> Mediatek SoC MT8196 features a new design for tx/rx path. The new tx
> path incorporates register settings that are closely associated with
> bus timing. And the difference between new rx path and older versions
> is the usage of distinct register bits when setting the data sampling
> edge as part of the tuning process.
> 
> Besides, there are modified register settings for STOP_DLY_SEL and
> POP_EN_CNT, with two new fields added to the compatibility structure
> to reflect the modifications.
> 
> For the changes mentioned in relation to the MT8196, the new compatible
> string 'mediatek,mt8196-mmc' is introduced. This is to accommodate
> different settings and workflows specific to the MT8196.
> 
> Signed-off-by: Andy-ld Lu <andy-ld.lu at mediatek.com>
> ---
>   drivers/mmc/host/mtk-sd.c | 162 +++++++++++++++++++++++++++++++++-----
>   1 file changed, 141 insertions(+), 21 deletions(-)
> 
> diff --git a/drivers/mmc/host/mtk-sd.c b/drivers/mmc/host/mtk-sd.c
> index 89018b6c97b9..4254b3012aeb 100644
> --- a/drivers/mmc/host/mtk-sd.c
> +++ b/drivers/mmc/host/mtk-sd.c
> @@ -65,6 +65,7 @@
>   #define SDC_RESP3        0x4c
>   #define SDC_BLK_NUM      0x50
>   #define SDC_ADV_CFG0     0x64
> +#define MSDC_NEW_RX_CFG  0x68
>   #define EMMC_IOCON       0x7c
>   #define SDC_ACMD_RESP    0x80
>   #define DMA_SA_H4BIT     0x8c
> @@ -91,6 +92,7 @@
>   #define EMMC_TOP_CONTROL	0x00
>   #define EMMC_TOP_CMD		0x04
>   #define EMMC50_PAD_DS_TUNE	0x0c
> +#define LOOP_TEST_CONTROL	0x30
>   
>   /*--------------------------------------------------------------------------*/
>   /* Register Mask                                                            */
> @@ -202,9 +204,13 @@
>   #define SDC_STS_CMDBUSY         BIT(1)	/* RW */
>   #define SDC_STS_SWR_COMPL       BIT(31)	/* RW */
>   
> -#define SDC_DAT1_IRQ_TRIGGER	BIT(19)	/* RW */
>   /* SDC_ADV_CFG0 mask */
> +#define SDC_DAT1_IRQ_TRIGGER	BIT(19)	/* RW */
>   #define SDC_RX_ENHANCE_EN	BIT(20)	/* RW */
> +#define SDC_NEW_TX_EN		BIT(31)	/* RW */
> +
> +/* MSDC_NEW_RX_CFG mask */
> +#define MSDC_NEW_RX_PATH_SEL	BIT(0)	/* RW */
>   
>   /* DMA_SA_H4BIT mask */
>   #define DMA_ADDR_HIGH_4BIT      GENMASK(3, 0)	/* RW */
> @@ -226,6 +232,7 @@
>   
>   /* MSDC_PATCH_BIT mask */
>   #define MSDC_PATCH_BIT_ODDSUPP    BIT(1)	/* RW */
> +#define MSDC_PATCH_BIT_RD_DAT_SEL BIT(3)	/* RW */
>   #define MSDC_INT_DAT_LATCH_CK_SEL GENMASK(9, 7)
>   #define MSDC_CKGEN_MSDC_DLY_SEL   GENMASK(14, 10)
>   #define MSDC_PATCH_BIT_IODSSEL    BIT(16)	/* RW */
> @@ -247,6 +254,8 @@
>   #define MSDC_PB2_SUPPORT_64G      BIT(1)    /* RW */
>   #define MSDC_PB2_RESPWAIT         GENMASK(3, 2)   /* RW */
>   #define MSDC_PB2_RESPSTSENSEL     GENMASK(18, 16) /* RW */
> +#define MSDC_PB2_POP_EN_CNT       GENMASK(23, 20) /* RW */
> +#define MSDC_PB2_CFGCRCSTSEDGE    BIT(25)   /* RW */
>   #define MSDC_PB2_CRCSTSENSEL      GENMASK(31, 29) /* RW */
>   
>   #define MSDC_PAD_TUNE_DATWRDLY	  GENMASK(4, 0)		/* RW */
> @@ -311,6 +320,12 @@
>   #define PAD_DS_DLY1		GENMASK(14, 10)	/* RW */
>   #define PAD_DS_DLY3		GENMASK(4, 0)	/* RW */
>   
> +/* LOOP_TEST_CONTROL mask */
> +#define TEST_LOOP_DSCLK_MUX_SEL        BIT(0)	/* RW */
> +#define TEST_LOOP_LATCH_MUX_SEL        BIT(1)	/* RW */
> +#define LOOP_EN_SEL_CLK                BIT(20)	/* RW */
> +#define TEST_HS400_CMD_LOOP_MUX_SEL    BIT(31)	/* RW */
> +
>   #define REQ_CMD_EIO  BIT(0)
>   #define REQ_CMD_TMO  BIT(1)
>   #define REQ_DAT_ERR  BIT(2)
> @@ -391,6 +406,7 @@ struct msdc_save_para {
>   	u32 emmc_top_control;
>   	u32 emmc_top_cmd;
>   	u32 emmc50_pad_ds_tune;
> +	u32 loop_test_control;
>   };
>   
>   struct mtk_mmc_compatible {
> @@ -402,9 +418,13 @@ struct mtk_mmc_compatible {
>   	bool data_tune;
>   	bool busy_check;
>   	bool stop_clk_fix;
> +	u8 stop_dly_sel;
> +	u8 pop_en_cnt;
>   	bool enhance_rx;
>   	bool support_64g;
>   	bool use_internal_cd;
> +	bool support_new_tx;
> +	bool support_new_rx;

Is there really any platform that supports new_tx but *not* new_rx, or vice-versa?

If not, you can add just one `bool support_new_rx_tx` member to this structure.

>   };
>   
>   struct msdc_tune_para {
> @@ -621,6 +641,23 @@ static const struct mtk_mmc_compatible mt8516_compat = {
>   	.stop_clk_fix = true,
>   };
>   
> +static const struct mtk_mmc_compatible mt8196_compat = {
> +	.clk_div_bits = 12,
> +	.recheck_sdio_irq = false,
> +	.hs400_tune = false,
> +	.pad_tune_reg = MSDC_PAD_TUNE0,
> +	.async_fifo = true,
> +	.data_tune = true,
> +	.busy_check = true,
> +	.stop_clk_fix = true,
> +	.stop_dly_sel = 1,
> +	.pop_en_cnt = 2,
> +	.enhance_rx = true,
> +	.support_64g = true,
> +	.support_new_tx = true,
> +	.support_new_rx = true,
> +};
> +
>   static const struct of_device_id msdc_of_ids[] = {
>   	{ .compatible = "mediatek,mt2701-mmc", .data = &mt2701_compat},
>   	{ .compatible = "mediatek,mt2712-mmc", .data = &mt2712_compat},
> @@ -632,6 +669,7 @@ static const struct of_device_id msdc_of_ids[] = {
>   	{ .compatible = "mediatek,mt8135-mmc", .data = &mt8135_compat},
>   	{ .compatible = "mediatek,mt8173-mmc", .data = &mt8173_compat},
>   	{ .compatible = "mediatek,mt8183-mmc", .data = &mt8183_compat},
> +	{ .compatible = "mediatek,mt8196-mmc", .data = &mt8196_compat},
>   	{ .compatible = "mediatek,mt8516-mmc", .data = &mt8516_compat},
>   
>   	{}
> @@ -872,6 +910,42 @@ static int msdc_ungate_clock(struct msdc_host *host)
>   				  (val & MSDC_CFG_CKSTB), 1, 20000);
>   }
>   
> +static void msdc_new_tx_setting(struct msdc_host *host)
> +{

That's simpler:

	if (!host->top_base)
		return;

> +	if (host->top_base) {
> +		sdr_set_bits(host->top_base + LOOP_TEST_CONTROL,
> +			     TEST_LOOP_DSCLK_MUX_SEL);
> +		sdr_set_bits(host->top_base + LOOP_TEST_CONTROL,
> +			     TEST_LOOP_LATCH_MUX_SEL);
> +		sdr_clr_bits(host->top_base + LOOP_TEST_CONTROL,
> +			     TEST_HS400_CMD_LOOP_MUX_SEL);
> +	}
> +
> +	switch (host->timing) {
> +	case MMC_TIMING_LEGACY:
> +	case MMC_TIMING_MMC_HS:
> +	case MMC_TIMING_SD_HS:
> +	case MMC_TIMING_UHS_SDR12:
> +	case MMC_TIMING_UHS_SDR25:
> +	case MMC_TIMING_UHS_DDR50:
> +	case MMC_TIMING_MMC_DDR52:
> +		if (host->top_base)
> +			sdr_clr_bits(host->top_base + LOOP_TEST_CONTROL,
> +				     LOOP_EN_SEL_CLK);
> +		break;
> +	case MMC_TIMING_UHS_SDR50:
> +	case MMC_TIMING_UHS_SDR104:
> +	case MMC_TIMING_MMC_HS200:
> +	case MMC_TIMING_MMC_HS400:
> +		if (host->top_base)
> +			sdr_set_bits(host->top_base + LOOP_TEST_CONTROL,
> +				     LOOP_EN_SEL_CLK);
> +		break;
> +	default:
> +		break;
> +	}
> +}
> +
>   static void msdc_set_mclk(struct msdc_host *host, unsigned char timing, u32 hz)
>   {
>   	struct mmc_host *mmc = mmc_from_priv(host);
> @@ -881,6 +955,7 @@ static void msdc_set_mclk(struct msdc_host *host, unsigned char timing, u32 hz)
>   	u32 sclk;
>   	u32 tune_reg = host->dev_comp->pad_tune_reg;
>   	u32 val;
> +	bool timing_changed = false;

bool timing_changed;

>   
>   	if (!hz) {
>   		dev_dbg(host->dev, "set mclk to 0\n");
> @@ -890,6 +965,9 @@ static void msdc_set_mclk(struct msdc_host *host, unsigned char timing, u32 hz)
>   		return;
>   	}
>   
> +	if (host->timing != timing)
> +		timing_changed = true;

	else
		timing_changed = false;

> +
>   	flags = readl(host->base + MSDC_INTEN);
>   	sdr_clr_bits(host->base + MSDC_INTEN, flags);
>   	if (host->dev_comp->clk_div_bits == 8)
> @@ -996,6 +1074,9 @@ static void msdc_set_mclk(struct msdc_host *host, unsigned char timing, u32 hz)
>   		sdr_set_field(host->base + tune_reg,
>   			      MSDC_PAD_TUNE_CMDRRDLY,
>   			      host->hs400_cmd_int_delay);
> +	if (timing_changed && host->dev_comp->support_new_tx)

I would invert this to (host->dev_comp->support_new_tx && timing_changed)
as that, at least to me, reads as "if this is new_tx - and the timing changed"
maning that the primary reason why we're checking is "if this is new_tx".

It's a personal preference though, so the final choice is yours.

> +		msdc_new_tx_setting(host);
> +
>   	dev_dbg(host->dev, "sclk: %d, timing: %d\n", mmc->actual_clock,
>   		timing);
>   }
> @@ -1704,6 +1785,17 @@ static void msdc_init_hw(struct msdc_host *host)
>   		reset_control_deassert(host->reset);
>   	}
>   
> +	/* New tx/rx enable bit need to be 0->1 for hardware check */
> +	if (host->dev_comp->support_new_tx) {
> +		sdr_clr_bits(host->base + SDC_ADV_CFG0, SDC_NEW_TX_EN);
> +		sdr_set_bits(host->base + SDC_ADV_CFG0, SDC_NEW_TX_EN);
> +		msdc_new_tx_setting(host);
> +	}
> +	if (host->dev_comp->support_new_rx) {
> +		sdr_clr_bits(host->base + MSDC_NEW_RX_CFG, MSDC_NEW_RX_PATH_SEL);
> +		sdr_set_bits(host->base + MSDC_NEW_RX_CFG, MSDC_NEW_RX_PATH_SEL);
> +	}
> +
>   	/* Configure to MMC/SD mode, clock free running */
>   	sdr_set_bits(host->base + MSDC_CFG, MSDC_CFG_MODE | MSDC_CFG_CKPDN);
>   
> @@ -1742,8 +1834,19 @@ static void msdc_init_hw(struct msdc_host *host)
>   	sdr_set_bits(host->base + EMMC50_CFG0, EMMC50_CFG_CFCSTS_SEL);
>   
>   	if (host->dev_comp->stop_clk_fix) {
> -		sdr_set_field(host->base + MSDC_PATCH_BIT1,
> -			      MSDC_PATCH_BIT1_STOP_DLY, 3);
> +		if (host->dev_comp->stop_dly_sel)
> +			sdr_set_field(host->base + MSDC_PATCH_BIT1,
> +				      MSDC_PATCH_BIT1_STOP_DLY,
> +				      host->dev_comp->stop_dly_sel & 0xf);

This doesn't look like being something to support new_tx and new_rx, but rather
a way to specify a different STOP_DLY depending on the SoC and its platdata.

So this one goes to a different commit, and you won't need either the 0xf masking
nor the `else`, as you will have to add the value to all SoCs' platdata instead.

> +		else
> +			sdr_set_field(host->base + MSDC_PATCH_BIT1,
> +				      MSDC_PATCH_BIT1_STOP_DLY, 3);
> +
> +		if (host->dev_comp->pop_en_cnt)
> +			sdr_set_field(host->base + MSDC_PATCH_BIT2,
> +				      MSDC_PB2_POP_EN_CNT,
> +				      host->dev_comp->pop_en_cnt & 0xf);
> +
>   		sdr_clr_bits(host->base + SDC_FIFO_CFG,
>   			     SDC_FIFO_CFG_WRVALIDSEL);
>   		sdr_clr_bits(host->base + SDC_FIFO_CFG,
> @@ -2055,6 +2158,19 @@ static inline void msdc_set_data_delay(struct msdc_host *host, u32 value)
>   	}
>   }
>   

Regards,
Angelo


From liankun.yang at mediatek.com  Mon Sep 30 02:17:41 2024
From: liankun.yang at mediatek.com (Liankun Yang)
Date: Mon, 30 Sep 2024 17:17:41 +0800
Subject: [PATCH v1 1/1] drm/mediatek: Add return value check when reading DPCD
Message-ID: <20240930092000.5385-1-liankun.yang@mediatek.com>

Returns the number of bytes transferred (1) on success.
Check the return value to confirm that AUX communication is successful.

Fixes: f70ac097a2cf ("drm/mediatek: Add MT8195 Embedded DisplayPort driver")

Signed-off-by: Liankun Yang <liankun.yang at mediatek.com>
---
 drivers/gpu/drm/mediatek/mtk_dp.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/mediatek/mtk_dp.c b/drivers/gpu/drm/mediatek/mtk_dp.c
index d8796a904eca..3cab65345d1e 100644
--- a/drivers/gpu/drm/mediatek/mtk_dp.c
+++ b/drivers/gpu/drm/mediatek/mtk_dp.c
@@ -2018,6 +2018,7 @@ static enum drm_connector_status mtk_dp_bdg_detect(struct drm_bridge *bridge)
 	enum drm_connector_status ret = connector_status_disconnected;
 	bool enabled = mtk_dp->enabled;
 	u8 sink_count = 0;
+	size_t value;
 
 	if (!mtk_dp->train_info.cable_plugged_in)
 		return ret;
@@ -2032,7 +2033,12 @@ static enum drm_connector_status mtk_dp_bdg_detect(struct drm_bridge *bridge)
 	 * function, we just need to check the HPD connection to check
 	 * whether we connect to a sink device.
 	 */
-	drm_dp_dpcd_readb(&mtk_dp->aux, DP_SINK_COUNT, &sink_count);
+	value = drm_dp_dpcd_readb(&mtk_dp->aux, DP_SINK_COUNT, &sink_count);
+	if (value < 0) {
+		drm_err(mtk_dp->drm_dev, "Failed to read DP Sink Count: %zd\n", value);
+		return ret;
+	}
+
 	if (DP_GET_SINK_COUNT(sink_count))
 		ret = connector_status_connected;
 
-- 
2.45.2



From angelogioacchino.delregno at collabora.com  Mon Sep 30 02:23:23 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Mon, 30 Sep 2024 11:23:23 +0200
Subject: [PATCH v2 2/2] arm64: dts: mediate: Introduce MT8186
 Chinchou/Chinchou360 Chromebooks
In-Reply-To: <20240927122940.4190949-2-jakiela@google.com>
References: <20240927122940.4190949-1-jakiela@google.com>
 <20240927122940.4190949-2-jakiela@google.com>
Message-ID: <2c5614f7-0ada-453a-bd81-2f0054a919a0@collabora.com>

Il 27/09/24 14:29, Albert Jakie?a ha scritto:
> The MT8186 Chinchou/Chinchou360, also known as the Asus Chromebook
> CZ12/CZ11 Flip, is a clamshell or convertible device with touchscreen,
> stylus and extra buttons.
> 

You have a typo in your commit title `mediate` -> `mediatek`

> Signed-off-by: Albert Jakie?a <jakiela at google.com>
> ---
> Changes in v2:
> - PATCH 2/2: Remove sku2147483647, remove duplicate nodes, add model
> 	and remove uneccecery nodes from sound card.
> - Link to v1: https://lore.kernel.org/all/20240925080353.2362879-2-jakiela at google.com/
> 
> ---
>   arch/arm64/boot/dts/mediatek/Makefile         |   3 +
>   .../mediatek/mt8186-corsola-chinchou-sku0.dts |  18 +
>   .../mediatek/mt8186-corsola-chinchou-sku1.dts |  34 ++
>   .../mt8186-corsola-chinchou-sku16.dts         |  28 ++
>   .../dts/mediatek/mt8186-corsola-chinchou.dtsi | 432 ++++++++++++++++++
>   5 files changed, 515 insertions(+)
>   create mode 100644 arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku0.dts
>   create mode 100644 arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku1.dts
>   create mode 100644 arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou-sku16.dts
>   create mode 100644 arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou.dtsi
> 

..snip..


> diff --git a/arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou.dtsi b/arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou.dtsi
> new file mode 100644
> index 000000000000..96cc3c267c20
> --- /dev/null
> +++ b/arch/arm64/boot/dts/mediatek/mt8186-corsola-chinchou.dtsi
> @@ -0,0 +1,432 @@
> +// SPDX-License-Identifier: (GPL-2.0 OR MIT)
> +/*
> + * Copyright 2023 Google LLC
> + */
> +
> +/dts-v1/;
> +#include "mt8186-corsola.dtsi"
> +
> +/ {

..snip..

> +
> +&sound {
> +	status = "okay";
> +
> +	compatible = "mediatek,mt8186-mt6366-rt5650-sound";

Why did you keep the compatible string override?

> +	model = "mt8186_rt5650";
> +

Regards,
Angelo






From angelogioacchino.delregno at collabora.com  Mon Sep 30 02:26:08 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Mon, 30 Sep 2024 11:26:08 +0200
Subject: [PATCH v2 2/2] arm64: dts: mediatek: mt6359: fix dtbs_check error
 for audio-codec
In-Reply-To: <20240930075451.14196-2-macpaul.lin@mediatek.com>
References: <20240930075451.14196-1-macpaul.lin@mediatek.com>
 <20240930075451.14196-2-macpaul.lin@mediatek.com>
Message-ID: <9260a488-e386-4103-bdd0-04bdc2db8f0f@collabora.com>

Il 30/09/24 09:54, Macpaul Lin ha scritto:
> This change fixes these dtbs_check errors for audio-codec:
> 1. pmic: 'mt6359codec' does not match any of the regexes: 'pinctrl-[0-9]+'
>   - Replace device node name to generic 'audio-codec'
> 2. pmic: regulators: 'compatible' is a required property
>   - Add 'mediatek,mt6359-codec' to compatible.
> 
> Fixes: 3b7d143be4b7 ("arm64: dts: mt6359: add PMIC MT6359 related nodes")
> Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>




From angelogioacchino.delregno at collabora.com  Mon Sep 30 02:26:10 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Mon, 30 Sep 2024 11:26:10 +0200
Subject: [PATCH v2 1/2] ASoC: dt-bindings: mt6359: Update generic node
 name and dmic-mode
In-Reply-To: <20240930075451.14196-1-macpaul.lin@mediatek.com>
References: <20240930075451.14196-1-macpaul.lin@mediatek.com>
Message-ID: <2782dd71-25ae-44ae-a8df-6af995ef7413@collabora.com>

Il 30/09/24 09:54, Macpaul Lin ha scritto:
> Some fix and updates in the following items:
> 1. examples:
>     Update generic node name to 'audio-codec' to comply with the
>     coming change in 'mt6359.dtsi'. This change is necessary to fix the
>     dtbs_check error:
>     pmic: 'mt6359codec' does not match any of the regexes: 'pinctrl-[0-9]+'
> 
> 2. mediatek,dmic-mode:
>     After inspecting the .dts and .dtsi files using 'mt6359-codec', it was
>     discovered that the definitions of 'two wires' and 'one wire' are
>     inverted compared to the DT schema.
>     For example, the following boards using MT6359 PMIC:
>      - mt8192-asurada.dtsi
>      - mt8195-cherry.dtsi
>     These boards use the same definitions of 'dmic-mode' as other boards
>     using MT6358 PMIC. The meaning of '0' or '1' has been noted as comments
>     in the device trees.
> 
>     Upon examining the code in [1] and [2], it was confirmed that the
>     definitions of 'dmic-mode' are consistent between "MT6359 PMIC" and
>     "MT6358 PMIC". Therefore, the DT Schema should be correct as is.
> 
> References:
> [1] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/sound/soc/codecs/mt6358.c#n1875
> [2] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/sound/soc/codecs/mt6359.c#L1515
> 
> Fixes: 539237d1c609 ("dt-bindings: mediatek: mt6359: add codec document")
> Signed-off-by: Jiaxin Yu <jiaxin.yu at mediatek.com>
> Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>


Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>




From angelogioacchino.delregno at collabora.com  Mon Sep 30 02:29:20 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Mon, 30 Sep 2024 11:29:20 +0200
Subject: [PATCH v2 5/6] soc: mediatek: mediatek-regulator-coupler: Support
 mt8188
In-Reply-To: <20240927103005.17605-6-pablo.sun@mediatek.com>
References: <20240927103005.17605-1-pablo.sun@mediatek.com>
 <20240927103005.17605-6-pablo.sun@mediatek.com>
Message-ID: <d73ebca6-9254-42c6-958d-e45432de1b1d@collabora.com>

Il 27/09/24 12:30, Pablo Sun ha scritto:
> The Mali GPU in mt8188 also requires coupled power supplies,
> that is, the "vsram" voltage should follow the "vgpu" voltage.
> Therefore add the compatible to enable this coupling behavior.
> 
> Signed-off-by: Pablo Sun <pablo.sun at mediatek.com>

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>




From angelogioacchino.delregno at collabora.com  Mon Sep 30 02:30:06 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Mon, 30 Sep 2024 11:30:06 +0200
Subject: [PATCH v2 6/6] arm64: dts: mediatek: mt8390-genio-700-evk: Enable
 Mali GPU
In-Reply-To: <20240927103005.17605-7-pablo.sun@mediatek.com>
References: <20240927103005.17605-1-pablo.sun@mediatek.com>
 <20240927103005.17605-7-pablo.sun@mediatek.com>
Message-ID: <fc9d8eee-8d6d-4f1c-82bc-873765dfb458@collabora.com>

Il 27/09/24 12:30, Pablo Sun ha scritto:
> Configure GPU regulator supplies and enable GPU for GENIO 700 EVK.
> 
> The GPU in MT8390 & MT8188 has two power inputs: "DVDD_GPU" and
> "DVDD_SRAM_GPU". In Genio 700 EVK, DVDD_GPU is supplied by
> mt6359_vproc2_buck_reg, and DVDD_SRAM_GPU is supplied by
> mt6359_vsram_others_ldo_reg.
> 
> According to section 5.2 "Recommended Operating Conditions" in
> MT8390 IoT Application Processor Datasheet v1.9, The recommended
> operating voltage ranges are:
> 
> - DVDD_GPU: min 0.55V, max 0.86V, typical 0.75V
> - DVDD_SRAM_GPU: min 0.71V, max 0.92V, typical 0.85V
> 
> To further optimize power saving, we couple DVDD_SRAM_GPU to
> DVDD_GPU according to the following relation:
> 
> - For opp-880000000 or lower frequency, keep 0.75V
> - For opp-915000000 and higher, DVDD_SRAM_GPU should follow
>    DVDD_GPU. The exact voltage for DVDD_GPU should be decided by
>    speed binning.
> 
> This rule is derived from the OPP table in the link.
> 
> In addition, set the voltage spread to 6250 uV, the step size of
> 'ldo_vsram_others' regulator of mt6359, otherwise the regulator
> set_voltage operation fails.
> 
> Link: https://gitlab.com/mediatek/aiot/rity/meta-mediatek-bsp/-/blob/eedd6aedd4b0cfc0ee79b9c9b9650dfa73cf87f6/recipes-kernel/dtbo/mt8390/gpu-mali.dts
> Signed-off-by: Pablo Sun <pablo.sun at mediatek.com>
> Suggested-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>



From fshao at chromium.org  Mon Sep 30 02:35:38 2024
From: fshao at chromium.org (Fei Shao)
Date: Mon, 30 Sep 2024 17:35:38 +0800
Subject: [PATCH 5/6] arm64: dts: mediatek: mt8188: Move vdec1 power domain
 under vdec0
In-Reply-To: <CAC=S1nhs4EUR78HunNnz=Z-cG4GgAZ=7JFyJmj6he96Z=GuxOQ@mail.gmail.com>
References: <20240925110044.3678055-1-fshao@chromium.org> <20240925110044.3678055-6-fshao@chromium.org>
 <b3842173-7074-4bcb-80f4-1f6f8cb38a52@collabora.com> <CAC=S1nhs4EUR78HunNnz=Z-cG4GgAZ=7JFyJmj6he96Z=GuxOQ@mail.gmail.com>
Message-ID: <CAC=S1nhAr2vMYUnhw973RuCe1JzefKdugp-Ls1HktZdsnDTEuQ@mail.gmail.com>

On Thu, Sep 26, 2024 at 6:42?PM Fei Shao <fshao at chromium.org> wrote:
>
> On Thu, Sep 26, 2024 at 4:33?PM AngeloGioacchino Del Regno
> <angelogioacchino.delregno at collabora.com> wrote:
> >
> > Il 25/09/24 12:57, Fei Shao ha scritto:
> > > There are two hardware IP blocks in MT8188 video decoder pipeline:
> > > vdec-lat and vdec-core, which are powered by vdec0 and vdec1 power
> > > domains respectively.
> > >
> > > We noticed that vdec-core needs to be powered down before vdec-lat
> > > during suspend to prevent failures. It's unclear if it's an intended
> > > hardware design or due to power isolation glitch. But in any case, we
> > > observed a power-off sequence here, and it can be considered as an
> > > indirect dependency implication between the vdec0 and vdec1 domains.
> > >
> > > Given that, update vdec1 as a sub-domain of vdec0 to enforce the
> > > sequence. Also, use more specific clock names for both power domains.
> > >
> >
> > As far as I know, yes, there is a sequence:
> >   - Cores (mtk-vcodec-core) gets suspended first
> >   - Then the LATs gets suspended (mtk-vcodec-lat)
> >   - Finally, the LAT SoC gets suspended (mtk-vcodec-lat-soc)
> >
> > ...but you checked that downstream, and your downstream misses the lat-soc HW
> > instance, and only has the lat one.
> >
> > Are you sure that this is not the reason why you're getting this issue? :-)
> >
> > Otherwise, I feel like we must ask for some clarification from MediaTek, as
> > I'm mostly sure that the two cores are independent from each other (but I
> > might, of course, be wrong!).
>
> Yes I think I should... this is actually based on a downstream patch of theirs.
> My understanding is that LAT SoC is not always in the vdec pipeline
> for every MediaTek SoCs. Although the MT8188 and MT8195 have much in
> common, I have a vague impression that MT8188 doesn't have a LAT SoC
> HW, so the downstream video decoding works smoothly without describing
> that in DT... but still, I could be wrong, and things just happen to work.
>
> Anyway, I'll find someone on the MediaTek side for clarification. The
> datasheet I have doesn't seem to contain such information.
>

MediaTek confirmed that MT8188 doesn't have a LAT SoC block. Its vdec
pipeline is (mostly if not exactly) the same as MT8192 which is
composed of Core + LAT only.
Also, there *is* a hardware dependency between Core and LAT's power
domains in both MT8192 and MT8188.
And for reference, MT8192 DT described that dependency correctly. That
suggests how the power domain tree should be like in MT8188 DT.

I plan to send a v3 of this series to include more fixs I found last
week and exclude the invalid patch, and I'll refine the commit message
of this patch all together. I'll also update the bindings to document
the information above so people can reference that easier in the
future.

Regards,
Fei


From angelogioacchino.delregno at collabora.com  Mon Sep 30 02:40:14 2024
From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno)
Date: Mon, 30 Sep 2024 11:40:14 +0200
Subject: [PATCH v2 3/6] nvmem: mtk-efuse: Enable postprocess for mt8188
 GPU speed binning
In-Reply-To: <20240927103005.17605-4-pablo.sun@mediatek.com>
References: <20240927103005.17605-1-pablo.sun@mediatek.com>
 <20240927103005.17605-4-pablo.sun@mediatek.com>
Message-ID: <57dfe684-c9a1-4cb3-8c87-9d2fef09aed7@collabora.com>

Il 27/09/24 12:30, Pablo Sun ha scritto:
> Similar to mt8186, the efuse data for mt8188's GPU speed binning
> requires post-process to convert the bit field format expected
> by the OPP table.
> 
> Since mt8188 efuse is not compatible to mt8186, add a new compatible
> entry for mt8188 and enable postprocess.
> 
> Signed-off-by: Pablo Sun <pablo.sun at mediatek.com>

I know I told you to just reuse the pdata from 8186, but there's something else
that came to mind, here...

...actually, the efuse block from 8188 is indeed compatible with 8186, meaning
that the register r/w, etc, are all the same (bar the addresses, yes)

So, I wonder if it's not just a better idea to not even add mt8188-efuse in this
driver's of_device_id array, and just add that to the binding so that we permit
using
		efuse: efuse at 11f20000 {
			compatible = "mediatek,mt8188-efuse",
				     "mediatek,mt8186-efuse", "mediatek,efuse";
			[etc]
		}

Means that in mediatek,efuse.yaml you'll have to add...

       - items:
           - enum:
               - mediatek,mt8188-efuse
           - const: mediatek,mt8186-efuse
           - const: mediatek,efuse <---- or without this, even.

In the end, the "mediatek,efuse" property is somewhat deprecated, so that'd
also be a good time to start the dropping process, as I imagine that future SoCs
would also need the same speedbin transformations - which means that they'll all
be compatible with 8186....

Cheers,
Angelo

> ---
>   drivers/nvmem/mtk-efuse.c | 1 +
>   1 file changed, 1 insertion(+)
> 
> diff --git a/drivers/nvmem/mtk-efuse.c b/drivers/nvmem/mtk-efuse.c
> index 9caf04667341..38d26e5c097a 100644
> --- a/drivers/nvmem/mtk-efuse.c
> +++ b/drivers/nvmem/mtk-efuse.c
> @@ -112,6 +112,7 @@ static const struct mtk_efuse_pdata mtk_efuse_pdata = {
>   static const struct of_device_id mtk_efuse_of_match[] = {
>   	{ .compatible = "mediatek,mt8173-efuse", .data = &mtk_efuse_pdata },
>   	{ .compatible = "mediatek,mt8186-efuse", .data = &mtk_mt8186_efuse_pdata },
> +	{ .compatible = "mediatek,mt8188-efuse", .data = &mtk_mt8186_efuse_pdata },
>   	{ .compatible = "mediatek,efuse", .data = &mtk_efuse_pdata },
>   	{/* sentinel */},
>   };




From vignesh.raman at collabora.com  Mon Sep 30 02:52:47 2024
From: vignesh.raman at collabora.com (Vignesh Raman)
Date: Mon, 30 Sep 2024 15:22:47 +0530
Subject: [PATCH v4] docs/gpu: ci: update flake tests requirements
Message-ID: <20240930095255.2071586-1-vignesh.raman@collabora.com>

Update the documentation to specify linking to a relevant GitLab
issue or email report for each new flake entry. Added specific
GitLab issue urls for amdgpu, i915, msm and xe driver.

Acked-by: Maxime Ripard <mripard at kernel.org>
Acked-by: Rodrigo Vivi <rodrigo.vivi at intel.com> #intel and xe
Acked-by: Abhinav Kumar <quic_abhinavk at quicinc.com> # msm
Acked-by: Dmitry Baryshkov <dmitry.baryshkov at linaro.org> # msm
Signed-off-by: Vignesh Raman <vignesh.raman at collabora.com>
---

v2:
- Add gitlab issue link for msm driver.

v3:
- Update docs to specify we use email reporting or GitLab issues for flake entries.

v4:
- Add gitlab issue link for xe driver.

---
 Documentation/gpu/automated_testing.rst | 14 ++++++++++----
 1 file changed, 10 insertions(+), 4 deletions(-)

diff --git a/Documentation/gpu/automated_testing.rst b/Documentation/gpu/automated_testing.rst
index 2d5a28866afe..6d7c6086034d 100644
--- a/Documentation/gpu/automated_testing.rst
+++ b/Documentation/gpu/automated_testing.rst
@@ -68,19 +68,25 @@ known to behave unreliably. These tests won't cause a job to fail regardless of
 the result. They will still be run.
 
 Each new flake entry must be associated with a link to the email reporting the
-bug to the author of the affected driver, the board name or Device Tree name of
-the board, the first kernel version affected, the IGT version used for tests,
-and an approximation of the failure rate.
+bug to the author of the affected driver or the relevant GitLab issue. The entry
+must also include the board name or Device Tree name, the first kernel version
+affected, the IGT version used for tests, and an approximation of the failure rate.
 
 They should be provided under the following format::
 
-  # Bug Report: $LORE_OR_PATCHWORK_URL
+  # Bug Report: $LORE_URL_OR_GITLAB_ISSUE
   # Board Name: broken-board.dtb
   # Linux Version: 6.6-rc1
   # IGT Version: 1.28-gd2af13d9f
   # Failure Rate: 100
   flaky-test
 
+Use the appropriate link below to create a GitLab issue:
+amdgpu driver: https://gitlab.freedesktop.org/drm/amd/-/issues
+i915 driver: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues
+msm driver: https://gitlab.freedesktop.org/drm/msm/-/issues
+xe driver: https://gitlab.freedesktop.org/drm/xe/kernel/-/issues
+
 drivers/gpu/drm/ci/${DRIVER_NAME}-${HW_REVISION}-skips.txt
 -----------------------------------------------------------
 
-- 
2.43.0



From jiande.lu at mediatek.com  Mon Sep 30 03:47:50 2024
From: jiande.lu at mediatek.com (Jiande Lu)
Date: Mon, 30 Sep 2024 18:47:50 +0800
Subject: [PATCH v2] Bluetooth: btusb: Add USB HW IDs for MT7920/MT7925
Message-ID: <20240930104750.18872-1-jiande.lu@mediatek.com>

Add HW IDs for wireless module. These HW IDs are extracted from
Windows driver inf file and the test for card bring up successful.
MT7920 HW IDs test with below patch.
https://patchwork.kernel.org/project/bluetooth/
patch/20240930081257.23975-1-chris.lu at mediatek.com/

Patch has been tested successfully and controller is recognized
devices pair successfully.

MT7920 module bring up message as below.
Bluetooth: Core ver 2.22
Bluetooth: HCI device and connection manager initialized
Bluetooth: HCI socket layer initialized
Bluetooth: L2CAP socket layer initialized
Bluetooth: SCO socket layer initialized
Bluetooth: hci0: HW/SW Version: 0x008a008a, Build Time: 20240930111457
Bluetooth: hci0: Device setup in 143004 usecs
Bluetooth: hci0: HCI Enhanced Setup Synchronous Connection
command is advertised, but not supported.
Bluetooth: hci0: AOSP extensions version v1.00
Bluetooth: hci0: AOSP quality report is supported
Bluetooth: BNEP (Ethernet Emulation) ver 1.3
Bluetooth: BNEP filters: protocol multicast
Bluetooth: BNEP socket layer initialized
Bluetooth: MGMT ver 1.22
Bluetooth: RFCOMM TTY layer initialized
Bluetooth: RFCOMM socket layer initialized
Bluetooth: RFCOMM ver 1.11

MT7925 module bring up message as below.
Bluetooth: Core ver 2.22
Bluetooth: HCI device and connection manager initialized
Bluetooth: HCI socket layer initialized
Bluetooth: L2CAP socket layer initialized
Bluetooth: SCO socket layer initialized
Bluetooth: hci0: HW/SW Version: 0x00000000, Build Time: 20240816133202
Bluetooth: hci0: Device setup in 286558 usecs
Bluetooth: hci0: HCI Enhanced Setup Synchronous
Connection command is advertised, but not supported.
Bluetooth: hci0: AOSP extensions version v1.00
Bluetooth: BNEP (Ethernet Emulation) ver 1.3
Bluetooth: BNEP filters: protocol multicast
Bluetooth: BNEP socket layer initialized
Bluetooth: MGMT ver 1.22
Bluetooth: RFCOMM TTY layer initialized
Bluetooth: RFCOMM socket layer initialized
Bluetooth: RFCOMM ver 1.11

Signed-off-by: Jiande Lu <jiande.lu at mediatek.com>
---
v2: Rebase and add MT7920/MT7925 module bring up message
---
---
 drivers/bluetooth/btusb.c | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
index 080d68004a08..f3566ee2a220 100644
--- a/drivers/bluetooth/btusb.c
+++ b/drivers/bluetooth/btusb.c
@@ -569,6 +569,16 @@ static const struct usb_device_id quirks_table[] = {
 	{ USB_DEVICE(0x043e, 0x3109), .driver_info = BTUSB_MEDIATEK |
 						     BTUSB_WIDEBAND_SPEECH },
 
+	/* Additional MediaTek MT7920 Bluetooth devices */
+	{ USB_DEVICE(0x0489, 0xe134), .driver_info = BTUSB_MEDIATEK |
+						     BTUSB_WIDEBAND_SPEECH },
+	{ USB_DEVICE(0x13d3, 0x3620), .driver_info = BTUSB_MEDIATEK |
+						     BTUSB_WIDEBAND_SPEECH },
+	{ USB_DEVICE(0x13d3, 0x3621), .driver_info = BTUSB_MEDIATEK |
+						     BTUSB_WIDEBAND_SPEECH },
+	{ USB_DEVICE(0x13d3, 0x3622), .driver_info = BTUSB_MEDIATEK |
+						     BTUSB_WIDEBAND_SPEECH },
+
 	/* Additional MediaTek MT7921 Bluetooth devices */
 	{ USB_DEVICE(0x0489, 0xe0c8), .driver_info = BTUSB_MEDIATEK |
 						     BTUSB_WIDEBAND_SPEECH },
@@ -642,6 +652,8 @@ static const struct usb_device_id quirks_table[] = {
 						     BTUSB_WIDEBAND_SPEECH },
 	{ USB_DEVICE(0x0489, 0xe11e), .driver_info = BTUSB_MEDIATEK |
 						     BTUSB_WIDEBAND_SPEECH },
+	{ USB_DEVICE(0x0489, 0xe139), .driver_info = BTUSB_MEDIATEK |
+						     BTUSB_WIDEBAND_SPEECH },
 	{ USB_DEVICE(0x13d3, 0x3602), .driver_info = BTUSB_MEDIATEK |
 						     BTUSB_WIDEBAND_SPEECH },
 	{ USB_DEVICE(0x13d3, 0x3603), .driver_info = BTUSB_MEDIATEK |
-- 
2.45.2



From andriy.shevchenko at linux.intel.com  Mon Sep 30 05:23:13 2024
From: andriy.shevchenko at linux.intel.com (Andy Shevchenko)
Date: Mon, 30 Sep 2024 15:23:13 +0300
Subject: [PATCH v1] serial: 8250: Fix typos in comments across various
 files
In-Reply-To: <20240929100931.530620-1-yujiaoliang@vivo.com>
References: <20240929100931.530620-1-yujiaoliang@vivo.com>
Message-ID: <ZvqYMV9s41DyVOnK@smile.fi.intel.com>

On Sun, Sep 29, 2024 at 06:09:31PM +0800, Yu Jiaoliang wrote:
> This patch fixes several typos in the comments within the tty/8250
> directory to improve readability and code documentation.
> 
> Detected using codespell.

LGTM,
Reviewed-by: Andy Shevchenko <andriy.shevchenko at linux.intel.com>

-- 
With Best Regards,
Andy Shevchenko




From lorenzo at kernel.org  Mon Sep 30 05:33:47 2024
From: lorenzo at kernel.org (Lorenzo Bianconi)
Date: Mon, 30 Sep 2024 14:33:47 +0200
Subject: [PATCH net-next 0/2] net: airoha: Fix PSE memory configuration
Message-ID: <20240930-airoha-eth-pse-fix-v1-0-f41f2f35abb9@kernel.org>

Align PSE memory configuration to vendor SDK.
Increase initial value of PSE reserved memory in
airoha_fe_pse_ports_init() by the value used for the second Packet
Processor Engine (PPE2).
Do not overwrite the default value for the number of PSE reserved pages
in airoha_fe_set_pse_oq_rsv().
Post this series to net-next since these are not issues visible to the
user.

---
Lorenzo Bianconi (2):
      net: airoha: read default PSE reserved pages value before updating
      net: airoha: fix PSE memory configuration in airoha_fe_pse_ports_init()

 drivers/net/ethernet/mediatek/airoha_eth.c | 20 ++++++++++++++------
 1 file changed, 14 insertions(+), 6 deletions(-)
---
base-commit: c824deb1a89755f70156b5cdaf569fca80698719
change-id: 20240923-airoha-eth-pse-fix-f303134e0ccf

Best regards,
-- 
Lorenzo Bianconi <lorenzo at kernel.org>



From lorenzo at kernel.org  Mon Sep 30 05:33:48 2024
From: lorenzo at kernel.org (Lorenzo Bianconi)
Date: Mon, 30 Sep 2024 14:33:48 +0200
Subject: [PATCH net-next 1/2] net: airoha: read default PSE reserved pages
 value before updating
In-Reply-To: <20240930-airoha-eth-pse-fix-v1-0-f41f2f35abb9@kernel.org>
References: <20240930-airoha-eth-pse-fix-v1-0-f41f2f35abb9@kernel.org>
Message-ID: <20240930-airoha-eth-pse-fix-v1-1-f41f2f35abb9@kernel.org>

Store the default value for the number of PSE reserved pages in orig_val
at the beginning of airoha_fe_set_pse_oq_rsv routine, before updating it
with airoha_fe_set_pse_queue_rsv_pages().
Introduce airoha_fe_get_pse_all_rsv utility routine.

commit 23020f049327 ("net: airoha: Introduce ethernet support for EN7581 SoC")
Signed-off-by: Lorenzo Bianconi <lorenzo at kernel.org>
---
 drivers/net/ethernet/mediatek/airoha_eth.c | 14 ++++++++++----
 1 file changed, 10 insertions(+), 4 deletions(-)

diff --git a/drivers/net/ethernet/mediatek/airoha_eth.c b/drivers/net/ethernet/mediatek/airoha_eth.c
index 930f180688e5..480540526bdb 100644
--- a/drivers/net/ethernet/mediatek/airoha_eth.c
+++ b/drivers/net/ethernet/mediatek/airoha_eth.c
@@ -1116,17 +1116,23 @@ static void airoha_fe_set_pse_queue_rsv_pages(struct airoha_eth *eth,
 		      PSE_CFG_WR_EN_MASK | PSE_CFG_OQRSV_SEL_MASK);
 }
 
+static u32 airoha_fe_get_pse_all_rsv(struct airoha_eth *eth)
+{
+	u32 val = airoha_fe_rr(eth, REG_FE_PSE_BUF_SET);
+
+	return FIELD_GET(PSE_ALLRSV_MASK, val);
+}
+
 static int airoha_fe_set_pse_oq_rsv(struct airoha_eth *eth,
 				    u32 port, u32 queue, u32 val)
 {
-	u32 orig_val, tmp, all_rsv, fq_limit;
+	u32 orig_val = airoha_fe_get_pse_queue_rsv_pages(eth, port, queue);
+	u32 tmp, all_rsv, fq_limit;
 
 	airoha_fe_set_pse_queue_rsv_pages(eth, port, queue, val);
 
 	/* modify all rsv */
-	orig_val = airoha_fe_get_pse_queue_rsv_pages(eth, port, queue);
-	tmp = airoha_fe_rr(eth, REG_FE_PSE_BUF_SET);
-	all_rsv = FIELD_GET(PSE_ALLRSV_MASK, tmp);
+	all_rsv = airoha_fe_get_pse_all_rsv(eth);
 	all_rsv += (val - orig_val);
 	airoha_fe_rmw(eth, REG_FE_PSE_BUF_SET, PSE_ALLRSV_MASK,
 		      FIELD_PREP(PSE_ALLRSV_MASK, all_rsv));

-- 
2.46.2



From lorenzo at kernel.org  Mon Sep 30 05:33:49 2024
From: lorenzo at kernel.org (Lorenzo Bianconi)
Date: Mon, 30 Sep 2024 14:33:49 +0200
Subject: [PATCH net-next 2/2] net: airoha: fix PSE memory configuration in
 airoha_fe_pse_ports_init()
In-Reply-To: <20240930-airoha-eth-pse-fix-v1-0-f41f2f35abb9@kernel.org>
References: <20240930-airoha-eth-pse-fix-v1-0-f41f2f35abb9@kernel.org>
Message-ID: <20240930-airoha-eth-pse-fix-v1-2-f41f2f35abb9@kernel.org>

Align PSE memory configuration to vendor SDK. In particular, increase
initial value of PSE reserved memory in airoha_fe_pse_ports_init()
routine by the value used for the second Packet Processor Engine (PPE2)
and do not overwrite the default value.

commit 23020f049327 ("net: airoha: Introduce ethernet support for EN7581 SoC")
Signed-off-by: Lorenzo Bianconi <lorenzo at kernel.org>
---
 drivers/net/ethernet/mediatek/airoha_eth.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/mediatek/airoha_eth.c b/drivers/net/ethernet/mediatek/airoha_eth.c
index 480540526bdb..2e01abc70c17 100644
--- a/drivers/net/ethernet/mediatek/airoha_eth.c
+++ b/drivers/net/ethernet/mediatek/airoha_eth.c
@@ -1172,11 +1172,13 @@ static void airoha_fe_pse_ports_init(struct airoha_eth *eth)
 		[FE_PSE_PORT_GDM4] = 2,
 		[FE_PSE_PORT_CDM5] = 2,
 	};
+	u32 all_rsv;
 	int q;
 
+	all_rsv = airoha_fe_get_pse_all_rsv(eth);
 	/* hw misses PPE2 oq rsv */
-	airoha_fe_set(eth, REG_FE_PSE_BUF_SET,
-		      PSE_RSV_PAGES * pse_port_num_queues[FE_PSE_PORT_PPE2]);
+	all_rsv += PSE_RSV_PAGES * pse_port_num_queues[FE_PSE_PORT_PPE2];
+	airoha_fe_set(eth, REG_FE_PSE_BUF_SET, all_rsv);
 
 	/* CMD1 */
 	for (q = 0; q < pse_port_num_queues[FE_PSE_PORT_CDM1]; q++)

-- 
2.46.2



From lorenzo at kernel.org  Mon Sep 30 05:58:35 2024
From: lorenzo at kernel.org (Lorenzo Bianconi)
Date: Mon, 30 Sep 2024 14:58:35 +0200
Subject: [PATCH net-next] net: airoha: Implement BQL support
Message-ID: <20240930-en7581-bql-v1-1-064cdd570068@kernel.org>

Introduce BQL support in the airoha_eth driver to avoid queuing to much
packets into the device hw queues and keep the latency small.

Signed-off-by: Lorenzo Bianconi <lorenzo at kernel.org>
---
 drivers/net/ethernet/mediatek/airoha_eth.c | 27 ++++++++++++++++++---------
 1 file changed, 18 insertions(+), 9 deletions(-)

diff --git a/drivers/net/ethernet/mediatek/airoha_eth.c b/drivers/net/ethernet/mediatek/airoha_eth.c
index 930f180688e5..6dfde2828d93 100644
--- a/drivers/net/ethernet/mediatek/airoha_eth.c
+++ b/drivers/net/ethernet/mediatek/airoha_eth.c
@@ -786,6 +786,7 @@ struct airoha_hw_stats {
 };
 
 struct airoha_qdma {
+	struct airoha_gdm_port *port;
 	struct airoha_eth *eth;
 	void __iomem *regs;
 
@@ -1658,6 +1659,7 @@ static int airoha_qdma_tx_napi_poll(struct napi_struct *napi, int budget)
 
 	while (irq_q->queued > 0 && done < budget) {
 		u32 qid, last, val = irq_q->q[irq_q->head];
+		u32 bytes = 0, count = 0;
 		struct airoha_queue *q;
 
 		if (val == 0xff)
@@ -1684,7 +1686,6 @@ static int airoha_qdma_tx_napi_poll(struct napi_struct *napi, int budget)
 			struct airoha_qdma_desc *desc = &q->desc[q->tail];
 			struct airoha_queue_entry *e = &q->entry[q->tail];
 			u32 desc_ctrl = le32_to_cpu(desc->ctrl);
-			struct sk_buff *skb = e->skb;
 			u16 index = q->tail;
 
 			if (!(desc_ctrl & QDMA_DESC_DONE_MASK) &&
@@ -1700,15 +1701,11 @@ static int airoha_qdma_tx_napi_poll(struct napi_struct *napi, int budget)
 			WRITE_ONCE(desc->msg0, 0);
 			WRITE_ONCE(desc->msg1, 0);
 
-			if (skb) {
-				struct netdev_queue *txq;
-
-				txq = netdev_get_tx_queue(skb->dev, qid);
-				if (netif_tx_queue_stopped(txq) &&
-				    q->ndesc - q->queued >= q->free_thr)
-					netif_tx_wake_queue(txq);
+			if (e->skb) {
+				bytes += e->skb->len;
+				count++;
 
-				dev_kfree_skb_any(skb);
+				dev_kfree_skb_any(e->skb);
 				e->skb = NULL;
 			}
 
@@ -1716,6 +1713,16 @@ static int airoha_qdma_tx_napi_poll(struct napi_struct *napi, int budget)
 				break;
 		}
 
+		if (qdma->port) {
+			struct netdev_queue *txq;
+
+			txq = netdev_get_tx_queue(qdma->port->dev, qid);
+			netdev_tx_completed_queue(txq, count, bytes);
+			if (netif_tx_queue_stopped(txq) &&
+			    q->ndesc - q->queued >= q->free_thr)
+				netif_tx_wake_queue(txq);
+		}
+
 		spin_unlock_bh(&q->lock);
 	}
 
@@ -2482,6 +2489,7 @@ static netdev_tx_t airoha_dev_xmit(struct sk_buff *skb,
 	q->head = index;
 	q->queued += i;
 
+	netdev_tx_sent_queue(txq, skb->len);
 	skb_tx_timestamp(skb);
 	if (q->ndesc - q->queued < q->free_thr)
 		netif_tx_stop_queue(txq);
@@ -2650,6 +2658,7 @@ static int airoha_alloc_gdm_port(struct airoha_eth *eth, struct device_node *np)
 	port->dev = dev;
 	port->id = id;
 	eth->ports[index] = port;
+	qdma->port = port;
 
 	return register_netdev(dev);
 }

---
base-commit: c824deb1a89755f70156b5cdaf569fca80698719
change-id: 20240930-en7581-bql-552566f2078e

Best regards,
-- 
Lorenzo Bianconi <lorenzo at kernel.org>



From neil.armstrong at linaro.org  Mon Sep 30 07:28:31 2024
From: neil.armstrong at linaro.org (Neil Armstrong)
Date: Mon, 30 Sep 2024 16:28:31 +0200
Subject: [PATCH 5/6] drm/panel: ili9322: Constify struct regmap_bus
In-Reply-To: <20240925-drm-const-regmap-v1-5-e609d502401b@gmail.com>
References: <20240925-drm-const-regmap-v1-0-e609d502401b@gmail.com>
 <20240925-drm-const-regmap-v1-5-e609d502401b@gmail.com>
Message-ID: <76f38f99-79af-4015-b07b-6ff3ec070cdb@linaro.org>

On 25/09/2024 17:42, Javier Carrasco wrote:
> `ili9322_regmap_bus` is not modified and can be declared as const to
> move its data to a read-only section.
> 
> Signed-off-by: Javier Carrasco <javier.carrasco.cruz at gmail.com>
> ---
>   drivers/gpu/drm/panel/panel-ilitek-ili9322.c | 2 +-
>   1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/panel/panel-ilitek-ili9322.c b/drivers/gpu/drm/panel/panel-ilitek-ili9322.c
> index 4a6dcfd781e8..94b7dfef3b5e 100644
> --- a/drivers/gpu/drm/panel/panel-ilitek-ili9322.c
> +++ b/drivers/gpu/drm/panel/panel-ilitek-ili9322.c
> @@ -318,7 +318,7 @@ static int ili9322_regmap_spi_read(void *context, const void *reg,
>   	return spi_write_then_read(spi, buf, 1, val, 1);
>   }
>   
> -static struct regmap_bus ili9322_regmap_bus = {
> +static const struct regmap_bus ili9322_regmap_bus = {
>   	.write = ili9322_regmap_spi_write,
>   	.read = ili9322_regmap_spi_read,
>   	.reg_format_endian_default = REGMAP_ENDIAN_BIG,
> 

Reviewed-by: Neil Armstrong <neil.armstrong at linaro.org>


From horms at kernel.org  Mon Sep 30 09:56:37 2024
From: horms at kernel.org (Simon Horman)
Date: Mon, 30 Sep 2024 17:56:37 +0100
Subject: [PATCH net-next 1/2] net: airoha: read default PSE reserved
 pages value before updating
In-Reply-To: <20240930-airoha-eth-pse-fix-v1-1-f41f2f35abb9@kernel.org>
References: <20240930-airoha-eth-pse-fix-v1-0-f41f2f35abb9@kernel.org>
 <20240930-airoha-eth-pse-fix-v1-1-f41f2f35abb9@kernel.org>
Message-ID: <20240930165637.GI1310185@kernel.org>

On Mon, Sep 30, 2024 at 02:33:48PM +0200, Lorenzo Bianconi wrote:
> Store the default value for the number of PSE reserved pages in orig_val
> at the beginning of airoha_fe_set_pse_oq_rsv routine, before updating it
> with airoha_fe_set_pse_queue_rsv_pages().
> Introduce airoha_fe_get_pse_all_rsv utility routine.
> 
> commit 23020f049327 ("net: airoha: Introduce ethernet support for EN7581 SoC")
> Signed-off-by: Lorenzo Bianconi <lorenzo at kernel.org>

Hi Lorenzo,

Sorry, but I think the above syntax is due to me not explaining things
properly. I think you want something more like. In particular, commit, is
not a tag, so you should have a blank line between it and the tags:

...

Introduce airoha_fe_get_pse_all_rsv utility routine.

Introduced by commit 23020f049327 ("net: airoha: Introduce ethernet support
for EN7581 SoC").

Signed-off-by: ...


From me at adamthiede.com  Mon Sep 30 10:48:27 2024
From: me at adamthiede.com (Adam Thiede)
Date: Mon, 30 Sep 2024 12:48:27 -0500
Subject: [PATCH v3 13/14] drm/mediatek: Support DRM plane alpha in OVL
In-Reply-To: <20240620-igt-v3-13-a9d62d2e2c7e@mediatek.com>
References: <20240620-igt-v3-0-a9d62d2e2c7e@mediatek.com>
 <20240620-igt-v3-13-a9d62d2e2c7e@mediatek.com>
Message-ID: <1a3af354-bd15-4219-960e-089b6a6e673c@adamthiede.com>

On 6/19/24 11:38, Hsiao Chien Sung via B4 Relay wrote:
> From: Hsiao Chien Sung <shawn.sung at mediatek.com>
> 
> Set the plane alpha according to DRM plane property.
> 
> Reviewed-by: CK Hu <ck.hu at mediatek.com>
> Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno at collabora.com>
> Fixes: 119f5173628a ("drm/mediatek: Add DRM Driver for Mediatek SoC MT8173.")
> Signed-off-by: Hsiao Chien Sung <shawn.sung at mediatek.com>
> ---
>   drivers/gpu/drm/mediatek/mtk_disp_ovl.c | 6 ++++--
>   1 file changed, 4 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
> index 943db4f1bd6b..4b370bc0746d 100644
> --- a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
> +++ b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
> @@ -458,8 +458,10 @@ void mtk_ovl_layer_config(struct device *dev, unsigned int idx,
>   	}
>   
>   	con = ovl_fmt_convert(ovl, fmt);
> -	if (state->base.fb && state->base.fb->format->has_alpha)
> -		con |= OVL_CON_AEN | OVL_CON_ALPHA;
> +	if (state->base.fb) {
> +		con |= OVL_CON_AEN;
> +		con |= state->base.alpha & OVL_CON_ALPHA;
> +	}
>   
>   	/* CONST_BLD must be enabled for XRGB formats although the alpha channel
>   	 * can be ignored, or OVL will still read the value from memory.
> 
Hello, I believe that this commit has caused a problem for my Lenovo 
C330 Chromebook running postmarketOS.

With kernel 6.11 this device didn't show any text on the tty or splash 
screen during booting, but graphical environments (wayland, xorg) do 
appear. With a few bisects I found it to be this commit. With it 
reverted I'm able to get text on the tty again.

The kernel config is here: 
https://gitlab.com/adamthiede/pmaports/-/tree/mt8173-611/device/community/linux-postmarketos-mediatek-mt8173/
To be perfectly clear, this device is not running Chrome OS.

I'm still rather new at this so it's also likely I got something wrong 
or have a bad configuration option. If there is any more information I 
can provide please let me know. Thank you.

- Adam Thiede


From zichenxie0106 at gmail.com  Mon Sep 30 11:51:04 2024
From: zichenxie0106 at gmail.com (Gax-c)
Date: Mon, 30 Sep 2024 13:51:04 -0500
Subject: [PATCH] mt76: mt7925: main.c: Avoid possible NULL Pointer Dereference in mt7925_change_vif_links()
Message-ID: <20240930185104.19107-1-zichenxie0106@gmail.com>

'mconf = devm_kzalloc()' and 'mlink = devm_kzalloc()' may return NULL.
NULL Pointer Dereference may be triggered in the statement 'mconf->link_id = link_id;' below.
Add a null check for the returned pointer.

Fixes: 69acd6d910b0 ("wifi: mt76: mt7925: add mt7925_change_vif_links")
Signed-off-by: Zichen Xie <zichenxie0106 at gmail.com>
Reported-by: Zichen Xie <zichenxie0106 at gmail.com>
Reported-by: Zijie Zhao <zzjas98 at gmail.com>
Reported-by: Chenyuan Yang <chenyuan0y at gmail.com>
---
 drivers/net/wireless/mediatek/mt76/mt7925/main.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/drivers/net/wireless/mediatek/mt76/mt7925/main.c b/drivers/net/wireless/mediatek/mt76/mt7925/main.c
index 791c8b00e112..ea635169497f 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7925/main.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7925/main.c
@@ -1948,6 +1948,12 @@ mt7925_change_vif_links(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
 					     GFP_KERNEL);
 		}
 
+		if (!mconf || !mlink) {
+			err = -ENOMEM;
+			goto free;
+		}
+
+
 		mconfs[link_id] = mconf;
 		mlinks[link_id] = mlink;
 		mconf->link_id = link_id;
-- 
2.25.1



From andrew at lunn.ch  Mon Sep 30 12:06:30 2024
From: andrew at lunn.ch (Andrew Lunn)
Date: Mon, 30 Sep 2024 21:06:30 +0200
Subject: [PATCH] [net,v2] net: wwan: t7xx: add
 PM_AUTOSUSPEND_MS_BY_DW5933E for Dell DW5933e
In-Reply-To: <20240930031624.2116592-1-wojackbb@gmail.com>
References: <20240930031624.2116592-1-wojackbb@gmail.com>
Message-ID: <e2f390c7-4d58-47fb-ba86-b1e5ccd6e546@lunn.ch>

On Mon, Sep 30, 2024 at 11:16:24AM +0800, wojackbb at gmail.com wrote:
> From: Jack Wu <wojackbb at gmail.com>
> 
> Because optimizing the power consumption of Dell DW5933e,
> Add a new auto suspend time for Dell DW5933e.

Please don't send new versions of a patch within 24 hours.

https://www.kernel.org/doc/html/latest/process/maintainer-netdev.html#netdev-faq

You commit message is not very good. What makes this machine special?
What is wrong with the current code? Do you have any benchmark data to
show the improvement?

     Andrew


From helgaas at kernel.org  Mon Sep 30 12:37:56 2024
From: helgaas at kernel.org (Bjorn Helgaas)
Date: Mon, 30 Sep 2024 14:37:56 -0500
Subject: [PATCH] PCI: mediatek-gen3: Avoid PCIe resetting for Airoha
 EN7581 SoC
In-Reply-To: <d8941149-9125-4fe2-a1c0-ab29223a0c87@collabora.com>
Message-ID: <20240930193756.GA187798@bhelgaas>

On Mon, Sep 23, 2024 at 11:41:41AM +0200, AngeloGioacchino Del Regno wrote:
> Il 20/09/24 10:26, Lorenzo Bianconi ha scritto:
> > The PCIe controller available on the EN7581 SoC does not support reset
> > via the following lines:
> > - PCIE_MAC_RSTB
> > - PCIE_PHY_RSTB
> > - PCIE_BRG_RSTB
> > - PCIE_PE_RSTB
> > 
> > Introduce the reset callback in order to avoid resetting the PCIe port
> > for Airoha EN7581 SoC.
> 
> EN7581 doesn't support pulling up/down PERST#?!  That looks
> definitely odd, as that signal is part of the PCI-Express CEM spec.
> 
> Besides, there's another PERST# assertion at
> mtk_pcie_suspend_noirq()...

I agree, it doesn't smell right that this SoC doesn't have a way to
assert PERST#.

The response at
https://lore.kernel.org/r/SG2PR03MB63415DB5791C58C7EA69FF01FF682 at SG2PR03MB6341.apcprd03.prod.outlook.com
suggests that maybe there's a hardware defect that means asserting
PERST# doesn't work correctly?  But surely firmware must have a way of
asserting PERST#, at least at boot time.

If this is truly a hardware defect and we really can't assert PERST#,
please say that this is a defect in the commit log so people don't
think that lack of PERST# is an acceptable thing.

Bjorn


From broonie at kernel.org  Mon Sep 30 14:17:49 2024
From: broonie at kernel.org (Mark Brown)
Date: Mon, 30 Sep 2024 22:17:49 +0100
Subject: [PATCH v9 0/3] Add of_regulator_get_optional() and Fix MTK Power
 Domain Driver
In-Reply-To: <20240930044525.2043884-1-wenst@chromium.org>
References: <20240930044525.2043884-1-wenst@chromium.org>
Message-ID: <ZvsVfQ1fuSVZpF6A@finisterre.sirena.org.uk>

On Mon, Sep 30, 2024 at 12:45:20PM +0800, Chen-Yu Tsai wrote:

> Patch 1 adds a new of_regulator_get_optional() function to look up
> regulator supplies using device tree nodes.

> Patch 2 adds a devres version of the aforementioned function at
> Sebastian's request for the two power domain drivers.

The following changes since commit 9852d85ec9d492ebef56dc5f229416c925758edc:

  Linux 6.12-rc1 (2024-09-29 15:06:19 -0700)

are available in the Git repository at:

  https://git.kernel.org/pub/scm/linux/kernel/git/broonie/regulator.git tags/regulator-of-get-optional

for you to fetch changes up to 36ec3f437227470568e5f460997f367f5446a34d:

  regulator: Add devres version of of_regulator_get_optional() (2024-09-30 01:11:41 +0200)

----------------------------------------------------------------
regulator: Add of_regulator_get_optional() APIs

Add of_regulator_get_optional() APIs, which can be used by generic code
to improve integration of regulator management helpers for their users.

----------------------------------------------------------------
Chen-Yu Tsai (2):
      regulator: Add of_regulator_get_optional() for pure DT regulator lookup
      regulator: Add devres version of of_regulator_get_optional()

 drivers/regulator/core.c           |  4 +--
 drivers/regulator/devres.c         | 39 +++++++++++++++++++++++++++++
 drivers/regulator/internal.h       | 18 +++++++++-----
 drivers/regulator/of_regulator.c   | 51 +++++++++++++++++++++++++++++++++-----
 include/linux/regulator/consumer.h | 37 +++++++++++++++++++++++++++
 5 files changed, 135 insertions(+), 14 deletions(-)
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-mediatek/attachments/20240930/04f69de1/attachment.sig>

From zichenxie0106 at gmail.com  Mon Sep 30 14:20:14 2024
From: zichenxie0106 at gmail.com (Gax-c)
Date: Mon, 30 Sep 2024 16:20:14 -0500
Subject: [PATCH] wifi: mt76: Fix NULL Pointer Dereference caused by mt76_connac_get_he_phy_cap()
Message-ID: <20240930212014.30607-1-zichenxie0106@gmail.com>

like commit f503ae90c735 ("wifi: mt76: mt7996: fix NULL pointer dereference in mt7996_mcu_sta_bfer_he"), mt76_connac_get_he_phy_cap() may return a NULL pointer, leading to NULL Pointer Dereference.
Add a null check for the returned pointer.

Fixes: a5c372f77aa7 ("wifi: mt76: mt7925: extend mt7925_mcu_bss_he_tlv for per-link BSS")
Fixes: e6d557a78b60 ("mt76: mt7915: rely on mt76_connac_get_phy utilities")
Fixes: 98686cd21624 ("wifi: mt76: mt7996: add driver for MediaTek Wi-Fi 7 (802.11be) devices")
Signed-off-by: Zichen Xie <zichenxie0106 at gmail.com>
Reported-by: Zichen Xie <zichenxie0106 at gmail.com>
Reported-by: Zijie Zhao <zzjas98 at gmail.com>
Reported-by: Chenyuan Yang <chenyuan0y at gmail.com>
---
 drivers/net/wireless/mediatek/mt76/mt7915/mcu.c | 6 ++++++
 drivers/net/wireless/mediatek/mt76/mt7925/mcu.c | 3 +++
 drivers/net/wireless/mediatek/mt76/mt7996/mcu.c | 3 +++
 3 files changed, 12 insertions(+)

diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c
index 87d0dd040001..941a6e40e94c 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c
@@ -552,6 +552,9 @@ mt7915_mcu_bss_he_tlv(struct sk_buff *skb, struct ieee80211_vif *vif,
 
 	cap = mt76_connac_get_he_phy_cap(phy->mt76, vif);
 
+	if (!cap)
+		return;
+
 	tlv = mt76_connac_mcu_add_tlv(skb, BSS_INFO_HE_BASIC, sizeof(*he));
 
 	he = (struct bss_info_he *)tlv;
@@ -1145,6 +1148,9 @@ mt7915_mcu_sta_bfer_he(struct ieee80211_sta *sta, struct ieee80211_vif *vif,
 	u8 nss_mcs = mt7915_mcu_get_sta_nss(mcs_map);
 	u8 snd_dim, sts;
 
+	if (!vc)
+		return;
+
 	bf->tx_mode = MT_PHY_TYPE_HE_SU;
 
 	mt7915_mcu_sta_sounding_rate(bf);
diff --git a/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c
index 748ea6adbc6b..1caf3e3e0e87 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c
@@ -2509,6 +2509,9 @@ mt7925_mcu_bss_he_tlv(struct sk_buff *skb, struct ieee80211_bss_conf *link_conf,
 
 	cap = mt76_connac_get_he_phy_cap(phy->mt76, link_conf->vif);
 
+	if (!cap)
+		return;
+
 	tlv = mt76_connac_mcu_add_tlv(skb, UNI_BSS_INFO_HE_BASIC, sizeof(*he));
 
 	he = (struct bss_info_uni_he *)tlv;
diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c
index 6c445a9dbc03..e547729701b7 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c
@@ -799,6 +799,9 @@ mt7996_mcu_bss_he_tlv(struct sk_buff *skb, struct ieee80211_vif *vif,
 
 	cap = mt76_connac_get_he_phy_cap(phy->mt76, vif);
 
+	if (!cap)
+		return;
+
 	tlv = mt7996_mcu_add_uni_tlv(skb, UNI_BSS_INFO_HE_BASIC, sizeof(*he));
 
 	he = (struct bss_info_uni_he *)tlv;
-- 
2.25.1



From broonie at kernel.org  Mon Sep 30 14:42:04 2024
From: broonie at kernel.org (Mark Brown)
Date: Mon, 30 Sep 2024 22:42:04 +0100
Subject: [PATCH] spi: slave-mt27xx: Call clk_disable_unprepare() only
 once in mtk_spi_slave_probe()
In-Reply-To: <9e736d33-b07f-40a0-8fb6-8c3212593b77@web.de>
References: <9e736d33-b07f-40a0-8fb6-8c3212593b77@web.de>
Message-ID: <172773252496.2210210.475643542831503313.b4-ty@kernel.org>

On Tue, 24 Sep 2024 20:56:08 +0200, Markus Elfring wrote:
> A clk_disable_unprepare(mdata->spi_clk) call was immediately used
> after a return value check for a devm_spi_register_controller() call
> in this function implementation.
> Thus call such a function only once instead directly before the check.
> 
> This issue was transformed by using the Coccinelle software.
> 
> [...]

Applied to

   https://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi.git for-next

Thanks!

[1/1] spi: slave-mt27xx: Call clk_disable_unprepare() only once in mtk_spi_slave_probe()
      commit: 610442f85c12ff662e3dec50c53d92f7a8e5a783

All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.

You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.

If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.

Please add any relevant lists and maintainers to the CCs when replying
to this mail.

Thanks,
Mark



From broonie at kernel.org  Mon Sep 30 15:29:10 2024
From: broonie at kernel.org (Mark Brown)
Date: Mon, 30 Sep 2024 23:29:10 +0100
Subject: (subset) [PATCH v8 0/3] Add of_regulator_get_optional() and
 Fix MTK Power Domain Driver
In-Reply-To: <20240925093807.1026949-1-wenst@chromium.org>
References: <20240925093807.1026949-1-wenst@chromium.org>
Message-ID: <172773535067.2224406.9733965694288102381.b4-ty@kernel.org>

On Wed, 25 Sep 2024 17:38:03 +0800, Chen-Yu Tsai wrote:
> This series is split off from my "DT hardware prober" series [1].
> 
> Changes since v7:
> - Added stub versions for of_regulator_get_optional() for !CONFIG_OF
>   and !CONFIG_REGULATOR
> - Added new patches for devres version and converting MTK pmdomain
>   driver
> 
> [...]

Applied to

   https://git.kernel.org/pub/scm/linux/kernel/git/broonie/regulator.git for-next

Thanks!

[1/3] regulator: Add of_regulator_get_optional() for pure DT regulator lookup
      commit: 5441b6975adc26aeaca316b9075e04a98238b1b3
[2/3] regulator: Add devres version of of_regulator_get_optional()
      commit: 36ec3f437227470568e5f460997f367f5446a34d

All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.

You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.

If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.

Please add any relevant lists and maintainers to the CCs when replying
to this mail.

Thanks,
Mark



From rosenp at gmail.com  Mon Sep 30 15:35:48 2024
From: rosenp at gmail.com (Rosen Penev)
Date: Mon, 30 Sep 2024 15:35:48 -0700
Subject: [PATCH 0/2] ARN: dts: some dtc warning fixes
Message-ID: <20240930223550.353882-1-rosenp@gmail.com>

dtc unfortunately outputs a lot of warnings when building ARM. These are
two basic fixes.

Rosen Penev (2):
  ARM: dts: replace gpio = with gpios =
  ARM: dts: assign reg to memory nodes

 .../boot/dts/allwinner/sun4i-a10-a1000.dts    |  2 +-
 .../dts/allwinner/sun4i-a10-ba10-tvbox.dts    |  2 +-
 .../allwinner/sun4i-a10-dserve-dsrv9703c.dts  |  2 +-
 .../dts/allwinner/sun4i-a10-hackberry.dts     |  4 +--
 .../dts/allwinner/sun4i-a10-hyundai-a7hd.dts  |  2 +-
 .../dts/allwinner/sun4i-a10-jesurun-q5.dts    |  2 +-
 .../boot/dts/allwinner/sun4i-a10-mk802.dts    |  2 +-
 .../allwinner/sun4i-a10-olinuxino-lime.dts    |  2 +-
 .../boot/dts/allwinner/sun4i-a10-pcduino2.dts |  2 +-
 .../dts/allwinner/sun4i-a10-topwise-a721.dts  |  2 +-
 .../dts/allwinner/sun5i-a10s-auxtek-t003.dts  |  4 +--
 .../dts/allwinner/sun5i-a10s-auxtek-t004.dts  |  4 +--
 .../boot/dts/allwinner/sun5i-a10s-mk802.dts   |  2 +-
 .../allwinner/sun5i-a10s-olinuxino-micro.dts  |  4 +--
 .../dts/allwinner/sun5i-a10s-r7-tv-dongle.dts |  2 +-
 .../boot/dts/allwinner/sun5i-a10s-wobo-i5.dts |  4 +--
 .../sun5i-a13-empire-electronix-d709.dts      |  2 +-
 .../boot/dts/allwinner/sun5i-a13-hsg-h702.dts |  2 +-
 .../dts/allwinner/sun5i-a13-licheepi-one.dts  |  2 +-
 .../allwinner/sun5i-a13-olinuxino-micro.dts   |  4 +--
 .../dts/allwinner/sun5i-a13-olinuxino.dts     |  4 +--
 .../sun5i-a13-pocketbook-614-plus.dts         |  6 ++---
 .../sun5i-a13-pocketbook-touch-lux-3.dts      |  8 +++---
 .../boot/dts/allwinner/sun5i-a13-utoo-p66.dts |  2 +-
 arch/arm/boot/dts/allwinner/sun5i-gr8-evb.dts |  2 +-
 arch/arm/boot/dts/allwinner/sun5i-r8-chip.dts |  2 +-
 .../sun5i-reference-design-tablet.dtsi        |  2 +-
 .../dts/allwinner/sun6i-a31-app4-evb1.dts     |  2 +-
 .../boot/dts/allwinner/sun6i-a31-colombus.dts |  2 +-
 .../dts/allwinner/sun6i-a31-hummingbird.dts   |  4 +--
 arch/arm/boot/dts/allwinner/sun6i-a31-i7.dts  |  2 +-
 arch/arm/boot/dts/allwinner/sun6i-a31-m9.dts  |  2 +-
 .../allwinner/sun6i-a31-mele-a1000g-quad.dts  |  2 +-
 .../allwinner/sun7i-a20-bananapi-m1-plus.dts  |  2 +-
 .../boot/dts/allwinner/sun7i-a20-bananapi.dts |  2 +-
 .../dts/allwinner/sun7i-a20-bananapro.dts     |  6 ++---
 .../dts/allwinner/sun7i-a20-cubietruck.dts    |  4 +--
 .../dts/allwinner/sun7i-a20-hummingbird.dts   |  8 +++---
 .../dts/allwinner/sun7i-a20-i12-tvbox.dts     |  6 ++---
 .../dts/allwinner/sun7i-a20-lamobo-r1.dts     |  6 ++---
 .../allwinner/sun7i-a20-olimex-som-evb.dts    |  2 +-
 .../allwinner/sun7i-a20-olimex-som204-evb.dts |  4 +--
 .../allwinner/sun7i-a20-olinuxino-lime.dts    |  2 +-
 .../allwinner/sun7i-a20-olinuxino-lime2.dts   |  4 +--
 .../dts/allwinner/sun7i-a20-orangepi-mini.dts |  6 ++---
 .../boot/dts/allwinner/sun7i-a20-orangepi.dts |  6 ++---
 .../dts/allwinner/sun7i-a20-pcduino3-nano.dts |  4 +--
 .../boot/dts/allwinner/sun7i-a20-pcduino3.dts |  2 +-
 .../sun8i-a83t-allwinner-h8homlet-v2.dts      |  4 +--
 .../dts/allwinner/sun8i-a83t-bananapi-m3.dts  |  4 +--
 .../allwinner/sun8i-a83t-cubietruck-plus.dts  |  4 +--
 .../dts/allwinner/sun8i-a83t-tbs-a711.dts     |  2 +-
 .../sun8i-h2-plus-bananapi-m2-zero.dts        |  4 +--
 .../allwinner/sun8i-h2-plus-orangepi-r1.dts   |  2 +-
 .../allwinner/sun8i-h2-plus-orangepi-zero.dts |  2 +-
 .../dts/allwinner/sun8i-h3-beelink-x2.dts     |  2 +-
 .../dts/allwinner/sun8i-h3-nanopi-duo2.dts    |  6 ++---
 .../dts/allwinner/sun8i-h3-nanopi-m1-plus.dts |  2 +-
 .../boot/dts/allwinner/sun8i-h3-nanopi-r1.dts |  4 +--
 .../dts/allwinner/sun8i-h3-orangepi-2.dts     |  2 +-
 .../dts/allwinner/sun8i-h3-orangepi-one.dts   |  2 +-
 .../dts/allwinner/sun8i-h3-orangepi-pc.dts    |  2 +-
 .../dts/allwinner/sun8i-h3-orangepi-plus.dts  |  4 +--
 .../allwinner/sun8i-h3-orangepi-plus2e.dts    |  2 +-
 .../boot/dts/allwinner/sun8i-h3-zeropi.dts    |  2 +-
 .../boot/dts/allwinner/sun8i-r16-parrot.dts   |  2 +-
 .../allwinner/sun8i-r40-bananapi-m2-ultra.dts |  2 +-
 .../boot/dts/allwinner/sun8i-s3-pinecube.dts  |  2 +-
 .../boot/dts/allwinner/sun8i-t3-cqa3t-bv3.dts |  2 +-
 .../allwinner/sun8i-v40-bananapi-m2-berry.dts |  2 +-
 .../boot/dts/allwinner/sun9i-a80-optimus.dts  |  4 +--
 .../dts/allwinner/sunxi-bananapi-m2-plus.dtsi |  4 +--
 .../allwinner/sunxi-common-regulators.dtsi    |  8 +++---
 .../allwinner/sunxi-h3-h5-emlid-neutis.dtsi   |  2 +-
 .../allwinner/sunxi-libretech-all-h3-cc.dtsi  |  8 +++---
 .../allwinner/sunxi-libretech-all-h3-it.dtsi  |  8 +++---
 .../dts/alphascale/alphascale-asm9260.dtsi    |  2 +-
 arch/arm/boot/dts/amazon/alpine.dtsi          |  2 +-
 arch/arm/boot/dts/amlogic/meson6-atv1200.dts  |  2 +-
 .../boot/dts/amlogic/meson8-minix-neo-x8.dts  |  2 +-
 arch/arm/boot/dts/amlogic/meson8b-ec100.dts   |  6 ++---
 arch/arm/boot/dts/amlogic/meson8b-mxq.dts     |  2 +-
 .../arm/boot/dts/amlogic/meson8b-odroidc1.dts |  4 +--
 .../boot/dts/amlogic/meson8m2-mxiii-plus.dts  |  2 +-
 arch/arm/boot/dts/arm/arm-realview-eb.dtsi    |  2 +-
 arch/arm/boot/dts/arm/arm-realview-pb1176.dts |  2 +-
 arch/arm/boot/dts/arm/arm-realview-pb11mp.dts |  2 +-
 arch/arm/boot/dts/arm/arm-realview-pbx.dtsi   |  2 +-
 arch/arm/boot/dts/arm/integrator.dtsi         |  2 +-
 arch/arm/boot/dts/arm/versatile-ab.dts        |  2 +-
 .../aspeed/aspeed-bmc-facebook-bletchley.dts  | 12 ++++-----
 .../dts/aspeed/aspeed-bmc-inspur-on5263m5.dts |  2 +-
 arch/arm/boot/dts/axis/artpec6-devboard.dts   |  2 +-
 .../arm/boot/dts/broadcom/bcm2711-rpi-4-b.dts |  4 +--
 .../boot/dts/broadcom/bcm2711-rpi-cm4.dtsi    |  2 +-
 arch/arm/boot/dts/cirrus/ep7211-edb7211.dts   |  4 +--
 .../boot/dts/gemini/gemini-dlink-dir-685.dts  |  2 +-
 .../boot/dts/intel/axm/axm5516-amarillo.dts   |  2 +-
 .../dts/intel/pxa/pxa300-raumfeld-common.dtsi |  4 +--
 .../intel/pxa/pxa300-raumfeld-controller.dts  |  2 +-
 .../socfpga/socfpga_cyclone5_vining_fpga.dts  |  2 +-
 .../boot/dts/marvell/armada-370-c200-v2.dts   |  2 +-
 .../dts/marvell/armada-370-dlink-dns327l.dts  |  6 ++---
 .../marvell/armada-370-seagate-nas-4bay.dts   |  4 +--
 .../marvell/armada-370-seagate-nas-xbay.dtsi  |  4 +--
 ...armada-370-seagate-personal-cloud-2bay.dts |  2 +-
 .../armada-370-seagate-personal-cloud.dtsi    |  4 +--
 .../marvell/armada-370-synology-ds213j.dts    |  4 +--
 .../marvell/armada-381-netgear-gs110emx.dts   |  2 +-
 .../marvell/armada-382-rd-ac3x-48g4x2xl.dts   |  2 +-
 .../boot/dts/marvell/armada-385-atl-x530.dts  |  2 +-
 .../dts/marvell/armada-385-clearfog-gtr.dtsi  |  4 +--
 .../dts/marvell/armada-385-db-88f6820-amc.dts |  2 +-
 .../arm/boot/dts/marvell/armada-385-db-ap.dts |  4 +--
 .../dts/marvell/armada-385-linksys-rango.dts  |  2 +-
 .../boot/dts/marvell/armada-385-linksys.dtsi  |  4 +--
 .../dts/marvell/armada-385-synology-ds116.dts |  8 +++---
 .../dts/marvell/armada-385-turris-omnia.dts   |  2 +-
 arch/arm/boot/dts/marvell/armada-388-db.dts   |  2 +-
 arch/arm/boot/dts/marvell/armada-388-gp.dts   | 16 ++++++------
 .../boot/dts/marvell/armada-388-helios4.dts   |  4 +--
 arch/arm/boot/dts/marvell/armada-388-rd.dts   |  2 +-
 .../marvell/armada-38x-solidrun-microsom.dtsi |  2 +-
 arch/arm/boot/dts/marvell/armada-390-db.dts   |  2 +-
 arch/arm/boot/dts/marvell/armada-395-gp.dts   |  2 +-
 arch/arm/boot/dts/marvell/armada-398-db.dts   |  2 +-
 .../dts/marvell/armada-xp-crs305-1g-4s.dtsi   |  2 +-
 .../dts/marvell/armada-xp-crs326-24g-2s.dtsi  |  2 +-
 .../marvell/armada-xp-crs328-4c-20s-4s.dtsi   |  2 +-
 .../boot/dts/marvell/armada-xp-db-dxbc2.dts   |  2 +-
 .../dts/marvell/armada-xp-db-xc3-24g4xg.dts   |  2 +-
 .../dts/marvell/armada-xp-synology-ds414.dts  |  8 +++---
 arch/arm/boot/dts/marvell/dove-cm-a510.dtsi   |  4 +--
 arch/arm/boot/dts/marvell/dove-cubox.dts      |  4 +--
 arch/arm/boot/dts/marvell/dove-d2plug.dts     |  2 +-
 arch/arm/boot/dts/marvell/dove-d3plug.dts     |  4 +--
 arch/arm/boot/dts/marvell/dove-dove-db.dts    |  2 +-
 arch/arm/boot/dts/marvell/dove-sbc-a510.dts   |  4 +--
 .../boot/dts/marvell/kirkwood-4i-edge-200.dts |  2 +-
 arch/arm/boot/dts/marvell/kirkwood-b3.dts     |  2 +-
 .../marvell/kirkwood-blackarmor-nas220.dts    |  6 ++---
 .../boot/dts/marvell/kirkwood-cloudbox.dts    |  2 +-
 arch/arm/boot/dts/marvell/kirkwood-d2net.dts  |  2 +-
 arch/arm/boot/dts/marvell/kirkwood-db.dtsi    |  2 +-
 arch/arm/boot/dts/marvell/kirkwood-dir665.dts |  2 +-
 arch/arm/boot/dts/marvell/kirkwood-dns320.dts |  2 +-
 arch/arm/boot/dts/marvell/kirkwood-dns325.dts |  2 +-
 arch/arm/boot/dts/marvell/kirkwood-dnskw.dtsi |  4 +--
 .../boot/dts/marvell/kirkwood-dockstar.dts    |  4 +--
 .../boot/dts/marvell/kirkwood-dreamplug.dts   |  2 +-
 arch/arm/boot/dts/marvell/kirkwood-ds109.dts  |  2 +-
 .../boot/dts/marvell/kirkwood-ds110jv10.dts   |  2 +-
 arch/arm/boot/dts/marvell/kirkwood-ds111.dts  |  2 +-
 arch/arm/boot/dts/marvell/kirkwood-ds112.dts  |  2 +-
 arch/arm/boot/dts/marvell/kirkwood-ds209.dts  |  2 +-
 arch/arm/boot/dts/marvell/kirkwood-ds210.dts  |  2 +-
 arch/arm/boot/dts/marvell/kirkwood-ds212.dts  |  2 +-
 arch/arm/boot/dts/marvell/kirkwood-ds212j.dts |  2 +-
 arch/arm/boot/dts/marvell/kirkwood-ds409.dts  |  2 +-
 .../boot/dts/marvell/kirkwood-ds409slim.dts   |  2 +-
 arch/arm/boot/dts/marvell/kirkwood-ds411.dts  |  2 +-
 arch/arm/boot/dts/marvell/kirkwood-ds411j.dts |  2 +-
 .../boot/dts/marvell/kirkwood-ds411slim.dts   |  2 +-
 .../boot/dts/marvell/kirkwood-goflexnet.dts   |  4 +--
 .../marvell/kirkwood-guruplug-server-plus.dts |  2 +-
 arch/arm/boot/dts/marvell/kirkwood-ib62x0.dts |  2 +-
 .../boot/dts/marvell/kirkwood-iconnect.dts    |  2 +-
 .../dts/marvell/kirkwood-iomega_ix2_200.dts   |  2 +-
 arch/arm/boot/dts/marvell/kirkwood-is2.dts    |  2 +-
 .../boot/dts/marvell/kirkwood-km_fixedeth.dts |  2 +-
 .../boot/dts/marvell/kirkwood-km_kirkwood.dts |  2 +-
 arch/arm/boot/dts/marvell/kirkwood-l-50.dts   | 10 +++----
 arch/arm/boot/dts/marvell/kirkwood-laplug.dts |  8 +++---
 .../marvell/kirkwood-linkstation-6282.dtsi    |  4 +--
 .../kirkwood-linkstation-duo-6281.dtsi        |  6 ++---
 .../marvell/kirkwood-linkstation-lsqvl.dts    |  4 +--
 .../dts/marvell/kirkwood-linkstation-lsvl.dts |  2 +-
 .../marvell/kirkwood-linkstation-lswsxl.dts   |  2 +-
 .../marvell/kirkwood-linkstation-lswvl.dts    |  4 +--
 .../marvell/kirkwood-linkstation-lswxl.dts    |  2 +-
 .../dts/marvell/kirkwood-linksys-viper.dts    |  2 +-
 .../arm/boot/dts/marvell/kirkwood-lschlv2.dts |  2 +-
 arch/arm/boot/dts/marvell/kirkwood-lsxhl.dts  |  2 +-
 arch/arm/boot/dts/marvell/kirkwood-lsxl.dtsi  |  4 +--
 .../arm/boot/dts/marvell/kirkwood-mplcec4.dts |  2 +-
 .../dts/marvell/kirkwood-mv88f6281gtw-ge.dts  |  2 +-
 .../arm/boot/dts/marvell/kirkwood-nas2big.dts |  4 +--
 .../arm/boot/dts/marvell/kirkwood-net2big.dts |  4 +--
 .../arm/boot/dts/marvell/kirkwood-net5big.dts | 10 +++----
 .../kirkwood-netgear_readynas_duo_v2.dts      |  4 +--
 .../kirkwood-netgear_readynas_nv+_v2.dts      |  4 +--
 .../boot/dts/marvell/kirkwood-netxbig.dtsi    |  2 +-
 arch/arm/boot/dts/marvell/kirkwood-ns2.dts    |  2 +-
 .../arm/boot/dts/marvell/kirkwood-ns2lite.dts |  2 +-
 arch/arm/boot/dts/marvell/kirkwood-ns2max.dts |  2 +-
 .../arm/boot/dts/marvell/kirkwood-ns2mini.dts |  2 +-
 arch/arm/boot/dts/marvell/kirkwood-nsa310.dts |  2 +-
 .../arm/boot/dts/marvell/kirkwood-nsa310a.dts |  2 +-
 .../arm/boot/dts/marvell/kirkwood-nsa310s.dts |  6 ++---
 arch/arm/boot/dts/marvell/kirkwood-nsa320.dts |  2 +-
 arch/arm/boot/dts/marvell/kirkwood-nsa325.dts |  4 +--
 .../dts/marvell/kirkwood-nsa3x0-common.dtsi   |  2 +-
 .../dts/marvell/kirkwood-openblocks_a6.dts    |  2 +-
 .../dts/marvell/kirkwood-openblocks_a7.dts    |  2 +-
 .../arm/boot/dts/marvell/kirkwood-openrd.dtsi |  2 +-
 .../boot/dts/marvell/kirkwood-pogo_e02.dts    |  4 +--
 .../marvell/kirkwood-pogoplug-series-4.dts    |  2 +-
 .../boot/dts/marvell/kirkwood-rd88f6192.dts   |  4 +--
 .../boot/dts/marvell/kirkwood-rd88f6281.dtsi  |  2 +-
 arch/arm/boot/dts/marvell/kirkwood-rs212.dts  |  2 +-
 arch/arm/boot/dts/marvell/kirkwood-rs409.dts  |  2 +-
 arch/arm/boot/dts/marvell/kirkwood-rs411.dts  |  2 +-
 .../marvell/kirkwood-sheevaplug-common.dtsi   |  4 +--
 .../boot/dts/marvell/kirkwood-synology.dtsi   | 26 +++++++++----------
 arch/arm/boot/dts/marvell/kirkwood-t5325.dts  |  4 +--
 .../arm/boot/dts/marvell/kirkwood-topkick.dts |  4 +--
 arch/arm/boot/dts/marvell/kirkwood-ts219.dtsi |  2 +-
 arch/arm/boot/dts/marvell/mmp2-brownstone.dts |  2 +-
 .../boot/dts/marvell/mmp2-olpc-xo-1-75.dts    |  2 +-
 .../boot/dts/marvell/orion5x-kuroboxpro.dts   |  2 +-
 .../dts/marvell/orion5x-lacie-d2-network.dts  |  6 ++---
 .../orion5x-lacie-ethernet-disk-mini-v2.dts   |  2 +-
 .../dts/marvell/orion5x-linkstation-lschl.dts |  2 +-
 .../dts/marvell/orion5x-linkstation-lsgl.dts  |  2 +-
 .../marvell/orion5x-linkstation-lswtgl.dts    |  2 +-
 arch/arm/boot/dts/marvell/orion5x-lswsgl.dts  |  8 +++---
 .../orion5x-maxtor-shared-storage-2.dts       |  2 +-
 .../dts/marvell/orion5x-netgear-wnr854t.dts   |  2 +-
 .../dts/marvell/orion5x-rd88f5182-nas.dts     |  2 +-
 arch/arm/boot/dts/marvell/pxa168-aspenite.dts |  2 +-
 arch/arm/boot/dts/marvell/pxa910-dkb.dts      |  2 +-
 arch/arm/boot/dts/mediatek/mt2701-evb.dts     |  4 +--
 arch/arm/boot/dts/mediatek/mt6580-evbp1.dts   |  2 +-
 .../mediatek/mt6582-prestigio-pmt5008-3g.dts  |  2 +-
 .../arm/boot/dts/mediatek/mt6589-aquaris5.dts |  2 +-
 arch/arm/boot/dts/mediatek/mt6592-evb.dts     |  2 +-
 arch/arm/boot/dts/mediatek/mt8127-moose.dts   |  2 +-
 arch/arm/boot/dts/mediatek/mt8135-evbp1.dts   |  2 +-
 .../boot/dts/microchip/at91-kizbox3-hs.dts    | 22 ++++++++--------
 arch/arm/boot/dts/microchip/at91-lmu5000.dts  |  2 +-
 arch/arm/boot/dts/microchip/at91-q5xr5.dts    |  2 +-
 .../boot/dts/microchip/at91-sama5d3_eds.dts   |  2 +-
 .../microchip/at91-sama5d3_ksz9477_evb.dts    |  2 +-
 .../dts/microchip/at91-sama5d3_xplained.dts   |  2 +-
 .../dts/microchip/at91-sama5d4_ma5d4.dtsi     |  2 +-
 .../dts/microchip/at91-sama5d4_ma5d4evk.dts   |  2 +-
 .../dts/microchip/at91-sama5d4_xplained.dts   |  2 +-
 arch/arm/boot/dts/moxa/moxart-uc7112lx.dts    |  2 +-
 arch/arm/boot/dts/nspire/nspire-classic.dtsi  |  2 +-
 arch/arm/boot/dts/nspire/nspire-cx.dts        |  2 +-
 .../boot/dts/nuvoton/nuvoton-npcm730-gbs.dts  |  2 +-
 .../boot/dts/nuvoton/nuvoton-npcm730-gsj.dts  |  2 +-
 .../boot/dts/nuvoton/nuvoton-npcm730-kudo.dts |  2 +-
 .../boot/dts/nuvoton/nuvoton-npcm750-evb.dts  |  2 +-
 .../nuvoton-npcm750-runbmc-olympus.dts        |  2 +-
 .../boot/dts/nvidia/tegra114-asus-tf701t.dts  | 20 +++++++-------
 arch/arm/boot/dts/nvidia/tegra114-dalmore.dts | 10 +++----
 arch/arm/boot/dts/nvidia/tegra114-roth.dts    | 10 +++----
 arch/arm/boot/dts/nvidia/tegra114-tn7.dts     |  4 +--
 .../boot/dts/nvidia/tegra124-apalis-eval.dts  |  4 +--
 .../dts/nvidia/tegra124-apalis-v1.2-eval.dts  |  4 +--
 .../boot/dts/nvidia/tegra124-apalis-v1.2.dtsi |  4 +--
 arch/arm/boot/dts/nvidia/tegra124-apalis.dtsi |  4 +--
 .../boot/dts/nvidia/tegra124-jetson-tk1.dts   | 16 ++++++------
 arch/arm/boot/dts/nvidia/tegra124-nyan.dtsi   | 20 +++++++-------
 arch/arm/boot/dts/nvidia/tegra124-venice2.dts | 18 ++++++-------
 .../dts/nvidia/tegra20-acer-a500-picasso.dts  |  2 +-
 .../boot/dts/nvidia/tegra20-asus-tf101.dts    |  6 ++---
 .../dts/nvidia/tegra20-colibri-eval-v3.dts    |  2 +-
 .../boot/dts/nvidia/tegra20-colibri-iris.dts  |  2 +-
 arch/arm/boot/dts/nvidia/tegra20-colibri.dtsi |  2 +-
 arch/arm/boot/dts/nvidia/tegra20-harmony.dts  | 12 ++++-----
 arch/arm/boot/dts/nvidia/tegra20-paz00.dts    |  2 +-
 arch/arm/boot/dts/nvidia/tegra20-seaboard.dts | 12 ++++-----
 .../arm/boot/dts/nvidia/tegra20-tamonten.dtsi |  2 +-
 .../arm/boot/dts/nvidia/tegra20-trimslice.dts |  2 +-
 arch/arm/boot/dts/nvidia/tegra20-ventana.dts  |  8 +++---
 .../boot/dts/nvidia/tegra30-apalis-eval.dts   |  4 +--
 .../dts/nvidia/tegra30-apalis-v1.1-eval.dts   |  4 +--
 .../boot/dts/nvidia/tegra30-apalis-v1.1.dtsi  |  4 +--
 arch/arm/boot/dts/nvidia/tegra30-apalis.dtsi  |  4 +--
 .../tegra30-asus-nexus7-grouper-common.dtsi   |  2 +-
 ...egra30-asus-nexus7-grouper-maxim-pmic.dtsi |  4 +--
 .../tegra30-asus-nexus7-grouper-ti-pmic.dtsi  |  2 +-
 .../boot/dts/nvidia/tegra30-asus-tf700t.dts   |  2 +-
 .../tegra30-asus-transformer-common.dtsi      | 16 ++++++------
 arch/arm/boot/dts/nvidia/tegra30-beaver.dts   | 14 +++++-----
 .../boot/dts/nvidia/tegra30-cardhu-a02.dts    | 12 ++++-----
 .../boot/dts/nvidia/tegra30-cardhu-a04.dts    | 14 +++++-----
 arch/arm/boot/dts/nvidia/tegra30-cardhu.dtsi  | 24 ++++++++---------
 .../dts/nvidia/tegra30-colibri-eval-v3.dts    |  2 +-
 arch/arm/boot/dts/nvidia/tegra30-colibri.dtsi |  6 ++---
 arch/arm/boot/dts/nvidia/tegra30-lg-p895.dts  |  2 +-
 arch/arm/boot/dts/nvidia/tegra30-lg-x3.dtsi   | 18 ++++++-------
 arch/arm/boot/dts/nvidia/tegra30-ouya.dts     | 16 ++++++------
 .../dts/nvidia/tegra30-pegatron-chagall.dts   | 12 ++++-----
 arch/arm/boot/dts/nxp/imx/e60k02.dtsi         |  2 +-
 arch/arm/boot/dts/nxp/imx/e70k02.dtsi         |  2 +-
 ...25-eukrea-mbimxsd25-baseboard-cmo-qvga.dts |  2 +-
 arch/arm/boot/dts/nxp/imx/imx25-karo-tx25.dts |  2 +-
 arch/arm/boot/dts/nxp/imx/imx25-pdk.dts       |  4 +--
 .../imx/imx27-eukrea-mbimxsd27-baseboard.dts  |  2 +-
 .../dts/nxp/imx/imx27-phytec-phycore-rdk.dts  |  2 +-
 arch/arm/boot/dts/nxp/imx/imx51-babbage.dts   |  2 +-
 .../imx/imx51-eukrea-mbimxsd51-baseboard.dts  |  2 +-
 arch/arm/boot/dts/nxp/imx/imx51-ts4800.dts    |  2 +-
 .../boot/dts/nxp/imx/imx51-zii-scu2-mezz.dts  |  2 +-
 .../boot/dts/nxp/imx/imx51-zii-scu3-esb.dts   |  2 +-
 arch/arm/boot/dts/nxp/imx/imx53-cx9020.dts    |  2 +-
 arch/arm/boot/dts/nxp/imx/imx53-m53evk.dts    |  4 +--
 arch/arm/boot/dts/nxp/imx/imx53-m53menlo.dts  |  2 +-
 arch/arm/boot/dts/nxp/imx/imx53-mba53.dts     |  2 +-
 arch/arm/boot/dts/nxp/imx/imx53-ppd.dts       |  6 ++---
 .../boot/dts/nxp/imx/imx53-qsb-common.dtsi    |  2 +-
 arch/arm/boot/dts/nxp/imx/imx53-sk-imx53.dts  |  4 +--
 arch/arm/boot/dts/nxp/imx/imx53-tx53-x03x.dts |  4 +--
 arch/arm/boot/dts/nxp/imx/imx53-tx53-x13x.dts |  4 +--
 arch/arm/boot/dts/nxp/imx/imx53-tx53.dtsi     |  6 ++---
 .../dts/nxp/imx/imx53-voipac-dmm-668.dtsi     |  2 +-
 .../dts/nxp/imx/imx6-logicpd-baseboard.dtsi   | 20 +++++++-------
 .../boot/dts/nxp/imx/imx6-logicpd-som.dtsi    |  2 +-
 arch/arm/boot/dts/nxp/imx/imx6dl-alti6p.dts   |  4 +--
 arch/arm/boot/dts/nxp/imx/imx6dl-b1x5pv2.dtsi |  8 +++---
 .../dts/nxp/imx/imx6dl-colibri-iris-v2.dts    |  2 +-
 .../dts/nxp/imx/imx6dl-eckelmann-ci4x10.dts   |  2 +-
 arch/arm/boot/dts/nxp/imx/imx6dl-lanmcu.dts   |  2 +-
 arch/arm/boot/dts/nxp/imx/imx6dl-mamoj.dts    | 18 ++++++-------
 arch/arm/boot/dts/nxp/imx/imx6dl-prtmvt.dts   |  4 +--
 arch/arm/boot/dts/nxp/imx/imx6dl-prtvt7.dts   |  2 +-
 .../arm/boot/dts/nxp/imx/imx6dl-riotboard.dts |  2 +-
 arch/arm/boot/dts/nxp/imx/imx6dl-sielaff.dts  |  4 +--
 .../boot/dts/nxp/imx/imx6dl-yapp4-common.dtsi |  6 ++---
 .../dts/nxp/imx/imx6dl-yapp43-common.dtsi     |  4 +--
 .../dts/nxp/imx/imx6q-apalis-eval-v1.2.dts    |  8 +++---
 .../boot/dts/nxp/imx/imx6q-apalis-eval.dts    |  2 +-
 .../dts/nxp/imx/imx6q-apalis-ixora-v1.2.dts   |  6 ++---
 arch/arm/boot/dts/nxp/imx/imx6q-arm2.dts      |  2 +-
 arch/arm/boot/dts/nxp/imx/imx6q-ba16.dtsi     |  4 +--
 arch/arm/boot/dts/nxp/imx/imx6q-bosch-acc.dts |  2 +-
 arch/arm/boot/dts/nxp/imx/imx6q-bx50v3.dtsi   |  4 +--
 arch/arm/boot/dts/nxp/imx/imx6q-cm-fx6.dts    |  6 ++---
 arch/arm/boot/dts/nxp/imx/imx6q-display5.dtsi |  4 +--
 .../boot/dts/nxp/imx/imx6q-dmo-edmqmx6.dts    |  4 +--
 arch/arm/boot/dts/nxp/imx/imx6q-dms-ba16.dts  |  2 +-
 arch/arm/boot/dts/nxp/imx/imx6q-evi.dts       |  4 +--
 arch/arm/boot/dts/nxp/imx/imx6q-gw5400-a.dts  |  2 +-
 arch/arm/boot/dts/nxp/imx/imx6q-h100.dts      |  6 ++---
 arch/arm/boot/dts/nxp/imx/imx6q-kp.dtsi       |  2 +-
 arch/arm/boot/dts/nxp/imx/imx6q-logicpd.dts   |  4 +--
 arch/arm/boot/dts/nxp/imx/imx6q-marsboard.dts |  2 +-
 arch/arm/boot/dts/nxp/imx/imx6q-mccmon6.dts   |  2 +-
 arch/arm/boot/dts/nxp/imx/imx6q-novena.dts    | 10 +++----
 arch/arm/boot/dts/nxp/imx/imx6q-pistachio.dts |  4 +--
 arch/arm/boot/dts/nxp/imx/imx6q-prti6q.dts    |  2 +-
 .../dts/nxp/imx/imx6q-var-dt6customboard.dts  |  4 +--
 arch/arm/boot/dts/nxp/imx/imx6qdl-apalis.dtsi |  6 ++---
 .../dts/nxp/imx/imx6qdl-aristainetos.dtsi     |  4 +--
 .../dts/nxp/imx/imx6qdl-aristainetos2.dtsi    |  4 +--
 .../arm/boot/dts/nxp/imx/imx6qdl-colibri.dtsi |  2 +-
 .../arm/boot/dts/nxp/imx/imx6qdl-cubox-i.dtsi |  4 +--
 .../dts/nxp/imx/imx6qdl-dfi-fs700-m60.dtsi    |  2 +-
 .../boot/dts/nxp/imx/imx6qdl-dhcom-som.dtsi   |  6 ++---
 .../boot/dts/nxp/imx/imx6qdl-emcon-avari.dtsi |  2 +-
 arch/arm/boot/dts/nxp/imx/imx6qdl-emcon.dtsi  |  4 +--
 arch/arm/boot/dts/nxp/imx/imx6qdl-gw51xx.dtsi |  2 +-
 arch/arm/boot/dts/nxp/imx/imx6qdl-gw52xx.dtsi |  4 +--
 arch/arm/boot/dts/nxp/imx/imx6qdl-gw53xx.dtsi |  4 +--
 arch/arm/boot/dts/nxp/imx/imx6qdl-gw54xx.dtsi |  4 +--
 arch/arm/boot/dts/nxp/imx/imx6qdl-gw553x.dtsi |  2 +-
 arch/arm/boot/dts/nxp/imx/imx6qdl-gw560x.dtsi |  4 +--
 arch/arm/boot/dts/nxp/imx/imx6qdl-gw5903.dtsi |  6 ++---
 arch/arm/boot/dts/nxp/imx/imx6qdl-gw5904.dtsi |  2 +-
 arch/arm/boot/dts/nxp/imx/imx6qdl-gw5907.dtsi |  2 +-
 arch/arm/boot/dts/nxp/imx/imx6qdl-gw5910.dtsi |  2 +-
 .../dts/nxp/imx/imx6qdl-hummingboard.dtsi     |  6 ++---
 .../dts/nxp/imx/imx6qdl-hummingboard2.dtsi    | 10 +++----
 .../boot/dts/nxp/imx/imx6qdl-icore-rqs.dtsi   |  2 +-
 .../dts/nxp/imx/imx6qdl-kontron-samx6i.dtsi   |  6 ++---
 arch/arm/boot/dts/nxp/imx/imx6qdl-mba6.dtsi   |  2 +-
 .../boot/dts/nxp/imx/imx6qdl-nit6xlite.dtsi   |  4 +--
 .../dts/nxp/imx/imx6qdl-nitrogen6_max.dtsi    |  8 +++---
 .../dts/nxp/imx/imx6qdl-nitrogen6_som2.dtsi   |  8 +++---
 .../boot/dts/nxp/imx/imx6qdl-nitrogen6x.dtsi  |  8 +++---
 .../imx/imx6qdl-phytec-mira-peb-wlbt-05.dtsi  |  2 +-
 .../boot/dts/nxp/imx/imx6qdl-phytec-mira.dtsi | 10 +++----
 .../dts/nxp/imx/imx6qdl-phytec-pfla02.dtsi    |  4 +--
 arch/arm/boot/dts/nxp/imx/imx6qdl-pico.dtsi   |  4 +--
 arch/arm/boot/dts/nxp/imx/imx6qdl-prti6q.dtsi |  2 +-
 arch/arm/boot/dts/nxp/imx/imx6qdl-rex.dtsi    |  4 +--
 .../boot/dts/nxp/imx/imx6qdl-sabreauto.dtsi   |  8 +++---
 .../boot/dts/nxp/imx/imx6qdl-sabrelite.dtsi   |  6 ++---
 .../arm/boot/dts/nxp/imx/imx6qdl-sabresd.dtsi | 10 +++----
 .../boot/dts/nxp/imx/imx6qdl-skov-cpu.dtsi    |  6 ++---
 .../boot/dts/nxp/imx/imx6qdl-sr-som-brcm.dtsi |  2 +-
 arch/arm/boot/dts/nxp/imx/imx6qdl-ts4900.dtsi |  2 +-
 arch/arm/boot/dts/nxp/imx/imx6qdl-ts7970.dtsi |  8 +++---
 arch/arm/boot/dts/nxp/imx/imx6qdl-tx6.dtsi    | 12 ++++-----
 arch/arm/boot/dts/nxp/imx/imx6qdl-udoo.dtsi   |  2 +-
 .../boot/dts/nxp/imx/imx6qdl-var-dart.dtsi    |  2 +-
 .../arm/boot/dts/nxp/imx/imx6qdl-var-som.dtsi |  2 +-
 arch/arm/boot/dts/nxp/imx/imx6qdl-vicut1.dtsi |  2 +-
 .../dts/nxp/imx/imx6qdl-wandboard-revd1.dtsi  |  2 +-
 .../boot/dts/nxp/imx/imx6qdl-wandboard.dtsi   |  2 +-
 .../boot/dts/nxp/imx/imx6qdl-zii-rdu2.dtsi    |  2 +-
 arch/arm/boot/dts/nxp/imx/imx6qp-prtwd3.dts   |  2 +-
 arch/arm/boot/dts/nxp/imx/imx6sl-evk.dts      |  6 ++---
 .../boot/dts/nxp/imx/imx6sl-kobo-aura2.dts    |  2 +-
 .../dts/nxp/imx/imx6sl-tolino-shine2hd.dts    |  4 +--
 .../boot/dts/nxp/imx/imx6sl-tolino-vision.dts |  4 +--
 arch/arm/boot/dts/nxp/imx/imx6sll-evk.dts     | 10 +++----
 .../boot/dts/nxp/imx/imx6sx-nitrogen6sx.dts   |  8 +++---
 .../arm/boot/dts/nxp/imx/imx6sx-sabreauto.dts |  8 +++---
 arch/arm/boot/dts/nxp/imx/imx6sx-sdb-reva.dts |  4 +--
 arch/arm/boot/dts/nxp/imx/imx6sx-sdb.dts      |  2 +-
 arch/arm/boot/dts/nxp/imx/imx6sx-sdb.dtsi     | 14 +++++-----
 .../nxp/imx/imx6sx-softing-vining-2000.dts    |  2 +-
 .../arm/boot/dts/nxp/imx/imx6sx-udoo-neo.dtsi |  8 +++---
 .../boot/dts/nxp/imx/imx6ul-14x14-evk.dtsi    |  4 +--
 .../dts/nxp/imx/imx6ul-ccimx6ulsbcpro.dts     |  2 +-
 .../nxp/imx/imx6ul-imx6ull-opos6uldev.dtsi    |  4 +--
 .../dts/nxp/imx/imx6ul-kontron-bl-common.dtsi |  2 +-
 .../arm/boot/dts/nxp/imx/imx6ul-liteboard.dts |  2 +-
 .../imx/imx6ul-phytec-segin-peb-av-02.dtsi    |  2 +-
 .../imx/imx6ul-phytec-segin-peb-wlbt-05.dtsi  |  2 +-
 .../boot/dts/nxp/imx/imx6ul-phytec-segin.dtsi |  2 +-
 arch/arm/boot/dts/nxp/imx/imx6ul-pico.dtsi    |  6 ++---
 arch/arm/boot/dts/nxp/imx/imx6ul-tx6ul.dtsi   | 10 +++----
 .../dts/nxp/imx/imx6ull-colibri-aster.dtsi    |  2 +-
 .../dts/nxp/imx/imx6ull-colibri-eval-v3.dtsi  |  2 +-
 .../dts/nxp/imx/imx6ull-colibri-iris-v2.dtsi  |  2 +-
 .../dts/nxp/imx/imx6ull-colibri-iris.dtsi     |  2 +-
 .../boot/dts/nxp/imx/imx6ull-dhcom-som.dtsi   |  2 +-
 arch/arm/boot/dts/nxp/imx/imx6ull-jozacp.dts  |  2 +-
 .../dts/nxp/imx/imx6ull-phytec-tauri.dtsi     |  6 ++---
 .../dts/nxp/imx/imx6ull-tarragon-master.dts   |  2 +-
 .../dts/nxp/imx/imx6ull-tarragon-slavext.dts  |  2 +-
 .../dts/nxp/imx/imx7-colibri-iris-v2.dtsi     |  2 +-
 arch/arm/boot/dts/nxp/imx/imx7-colibri.dtsi   |  2 +-
 arch/arm/boot/dts/nxp/imx/imx7-mba7.dtsi      | 16 ++++++------
 .../boot/dts/nxp/imx/imx7d-cl-som-imx7.dts    |  2 +-
 .../dts/nxp/imx/imx7d-flex-concentrator.dts   |  2 +-
 arch/arm/boot/dts/nxp/imx/imx7d-meerkat96.dts |  4 +--
 arch/arm/boot/dts/nxp/imx/imx7d-nitrogen7.dts |  8 +++---
 arch/arm/boot/dts/nxp/imx/imx7d-pico.dtsi     |  6 ++---
 .../boot/dts/nxp/imx/imx7d-remarkable2.dts    |  6 ++---
 arch/arm/boot/dts/nxp/imx/imx7d-sdb-reva.dts  |  2 +-
 arch/arm/boot/dts/nxp/imx/imx7d-sdb.dts       | 14 +++++-----
 arch/arm/boot/dts/nxp/imx/imx7d-smegw01.dts   | 10 +++----
 arch/arm/boot/dts/nxp/imx/imx7d-zii-rpu2.dts  |  4 +--
 arch/arm/boot/dts/nxp/imx/imx7s-warp.dts      |  4 +--
 arch/arm/boot/dts/nxp/imx/imx7ulp-evk.dts     |  4 +--
 arch/arm/boot/dts/nxp/imx/mba6ulx.dtsi        |  6 ++---
 arch/arm/boot/dts/nxp/lpc/lpc3250-phy3250.dts |  6 ++---
 arch/arm/boot/dts/nxp/mxs/imx23-evk.dts       |  4 +--
 arch/arm/boot/dts/nxp/mxs/imx23-olinuxino.dts |  2 +-
 arch/arm/boot/dts/nxp/mxs/imx23-sansa.dts     |  8 +++---
 .../boot/dts/nxp/mxs/imx23-stmp378x_devb.dts  |  2 +-
 arch/arm/boot/dts/nxp/mxs/imx23-xfi3.dts      |  2 +-
 arch/arm/boot/dts/nxp/mxs/imx28-apf28dev.dts  |  2 +-
 arch/arm/boot/dts/nxp/mxs/imx28-cfa10036.dts  |  2 +-
 arch/arm/boot/dts/nxp/mxs/imx28-cfa10037.dts  |  2 +-
 arch/arm/boot/dts/nxp/mxs/imx28-cfa10049.dts  |  2 +-
 arch/arm/boot/dts/nxp/mxs/imx28-cfa10057.dts  |  2 +-
 arch/arm/boot/dts/nxp/mxs/imx28-cfa10058.dts  |  2 +-
 .../dts/nxp/mxs/imx28-eukrea-mbmx28lc.dtsi    |  6 ++---
 arch/arm/boot/dts/nxp/mxs/imx28-evk.dts       | 12 ++++-----
 arch/arm/boot/dts/nxp/mxs/imx28-m28cu3.dts    |  6 ++---
 arch/arm/boot/dts/nxp/mxs/imx28-m28evk.dts    |  6 ++---
 arch/arm/boot/dts/nxp/mxs/imx28-sps1.dts      |  2 +-
 arch/arm/boot/dts/nxp/mxs/imx28-ts4600.dts    |  2 +-
 arch/arm/boot/dts/nxp/mxs/imx28-tx28.dts      | 10 +++----
 arch/arm/boot/dts/nxp/mxs/imx28-xea.dts       |  4 +--
 .../boot/dts/nxp/vf/vf-colibri-eval-v3.dtsi   |  2 +-
 arch/arm/boot/dts/nxp/vf/vf610-zii-dev.dtsi   |  2 +-
 .../boot/dts/qcom/msm8226-motorola-falcon.dts |  2 +-
 .../dts/qcom/qcom-apq8026-asus-sparrow.dts    |  2 +-
 .../dts/qcom/qcom-apq8026-huawei-sturgeon.dts |  2 +-
 .../boot/dts/qcom/qcom-apq8026-lg-lenok.dts   |  2 +-
 .../qcom-apq8026-samsung-matisse-wifi.dts     |  2 +-
 .../qcom/qcom-apq8026-samsung-milletwifi.dts  |  6 ++---
 .../dts/qcom/qcom-apq8060-dragonboard.dts     |  2 +-
 .../dts/qcom/qcom-apq8064-asus-nexus7-flo.dts |  2 +-
 .../boot/dts/qcom/qcom-apq8064-ifc6410.dts    |  2 +-
 .../dts/qcom/qcom-apq8074-dragonboard.dts     |  2 +-
 arch/arm/boot/dts/qcom/qcom-apq8084.dtsi      |  2 +-
 .../boot/dts/qcom/qcom-ipq4019-ap.dk04.1.dtsi |  2 +-
 .../boot/dts/qcom/qcom-ipq4019-ap.dk07.1.dtsi |  2 +-
 arch/arm/boot/dts/qcom/qcom-ipq4019.dtsi      |  2 +-
 arch/arm/boot/dts/qcom/qcom-ipq8064.dtsi      |  2 +-
 .../qcom-msm8226-samsung-matisse-common.dtsi  |  2 +-
 .../dts/qcom/qcom-msm8226-samsung-ms013g.dts  |  4 +--
 arch/arm/boot/dts/qcom/qcom-msm8660.dtsi      |  2 +-
 .../qcom/qcom-msm8926-motorola-peregrine.dts  |  2 +-
 .../qcom/qcom-msm8926-samsung-matisselte.dts  |  2 +-
 arch/arm/boot/dts/qcom/qcom-msm8960-cdp.dts   |  2 +-
 .../qcom-msm8974-lge-nexus5-hammerhead.dts    |  4 +--
 .../dts/qcom/qcom-msm8974-samsung-hlte.dts    |  2 +-
 .../qcom/qcom-msm8974-sony-xperia-rhine.dtsi  |  2 +-
 .../qcom/qcom-msm8974pro-fairphone-fp2.dts    |  2 +-
 .../boot/dts/qcom/qcom-msm8974pro-htc-m8.dts  |  2 +-
 .../qcom/qcom-msm8974pro-oneplus-bacon.dts    |  2 +-
 .../qcom-msm8974pro-samsung-klte-common.dtsi  |  4 +--
 ...-msm8974pro-sony-xperia-shinano-castor.dts |  2 +-
 ...msm8974pro-sony-xperia-shinano-common.dtsi |  6 ++---
 arch/arm/boot/dts/qcom/qcom-sdx55.dtsi        |  2 +-
 arch/arm/boot/dts/qcom/qcom-sdx65.dtsi        |  2 +-
 .../boot/dts/renesas/iwg20d-q7-common.dtsi    |  4 +--
 arch/arm/boot/dts/renesas/r8a73a4-ape6evm.dts |  2 +-
 .../dts/renesas/r8a7740-armadillo800eva.dts   |  2 +-
 .../boot/dts/renesas/r8a7742-iwg21d-q7.dts    |  4 +--
 .../dts/renesas/r8a7745-iwg22d-sodimm.dts     |  2 +-
 arch/arm/boot/dts/renesas/r8a7790-lager.dts   |  4 +--
 arch/arm/boot/dts/renesas/r8a7790-stout.dts   |  2 +-
 arch/arm/boot/dts/renesas/r8a7791-koelsch.dts |  6 ++---
 arch/arm/boot/dts/renesas/r8a7792-blanche.dts |  2 +-
 arch/arm/boot/dts/renesas/r8a7792-wheat.dts   |  2 +-
 arch/arm/boot/dts/renesas/r8a7793-gose.dts    |  6 ++---
 arch/arm/boot/dts/renesas/r8a7794-alt.dts     |  4 +--
 arch/arm/boot/dts/renesas/r8a7794-silk.dts    |  2 +-
 arch/arm/boot/dts/renesas/sh73a0-kzm9g.dts    |  4 +--
 .../boot/dts/rockchip/rk3066a-bqcurie2.dts    |  2 +-
 .../boot/dts/rockchip/rk3066a-marsboard.dts   |  2 +-
 arch/arm/boot/dts/rockchip/rk3066a-mk808.dts  |  8 +++---
 .../boot/dts/rockchip/rk3066a-rayeager.dts    |  8 +++---
 arch/arm/boot/dts/rockchip/rk3128-evb.dts     |  4 +--
 .../arm/boot/dts/rockchip/rk3128-xpi-3128.dts |  4 +--
 .../boot/dts/rockchip/rk3188-bqedison2qc.dts  | 10 +++----
 .../boot/dts/rockchip/rk3188-radxarock.dts    |  6 ++---
 arch/arm/boot/dts/rockchip/rk3229-evb.dts     |  2 +-
 arch/arm/boot/dts/rockchip/rk3229-xms6.dts    |  2 +-
 .../boot/dts/rockchip/rk3288-evb-act8846.dts  |  4 +--
 arch/arm/boot/dts/rockchip/rk3288-evb.dtsi    |  6 ++---
 .../dts/rockchip/rk3288-firefly-reload.dts    | 14 +++++-----
 .../arm/boot/dts/rockchip/rk3288-firefly.dtsi |  8 +++---
 arch/arm/boot/dts/rockchip/rk3288-miqi.dts    |  4 +--
 .../boot/dts/rockchip/rk3288-phycore-rdk.dts  |  6 ++---
 .../boot/dts/rockchip/rk3288-phycore-som.dtsi |  2 +-
 .../arm/boot/dts/rockchip/rk3288-popmetal.dts |  4 +--
 arch/arm/boot/dts/rockchip/rk3288-r89.dts     |  6 ++---
 .../boot/dts/rockchip/rk3288-rock2-square.dts |  6 ++---
 arch/arm/boot/dts/rockchip/rk3288-tinker.dtsi |  4 +--
 .../boot/dts/rockchip/rk3288-veyron-brain.dts |  4 +--
 .../rockchip/rk3288-veyron-chromebook.dtsi    |  4 +--
 .../boot/dts/rockchip/rk3288-veyron-edp.dtsi  |  6 ++---
 .../dts/rockchip/rk3288-veyron-fievel.dts     | 10 +++----
 .../boot/dts/rockchip/rk3288-veyron-jaq.dts   |  4 +--
 .../boot/dts/rockchip/rk3288-veyron-jerry.dts |  4 +--
 .../dts/rockchip/rk3288-veyron-mickey.dts     |  2 +-
 .../dts/rockchip/rk3288-veyron-minnie.dts     |  4 +--
 .../dts/rockchip/rk3288-veyron-speedy.dts     |  4 +--
 arch/arm/boot/dts/rockchip/rk3288-veyron.dtsi |  2 +-
 .../boot/dts/rockchip/rk3288-vmarc-som.dtsi   |  4 +--
 arch/arm/boot/dts/rockchip/rk3288-vyasa.dts   |  8 +++---
 .../dts/rockchip/rv1126-edgeble-neu2.dtsi     |  2 +-
 arch/arm/boot/dts/samsung/exynos3250-monk.dts |  2 +-
 .../arm/boot/dts/samsung/exynos4210-i9100.dts | 12 ++++-----
 .../boot/dts/samsung/exynos4210-origen.dts    |  2 +-
 .../arm/boot/dts/samsung/exynos4210-trats.dts | 12 ++++-----
 .../dts/samsung/exynos4210-universal_c210.dts |  6 ++---
 .../arm/boot/dts/samsung/exynos4212-tab3.dtsi |  4 +--
 .../dts/samsung/exynos4412-galaxy-s3.dtsi     | 12 ++++-----
 .../boot/dts/samsung/exynos4412-midas.dtsi    |  8 +++---
 .../arm/boot/dts/samsung/exynos4412-n710x.dts |  8 +++---
 .../boot/dts/samsung/exynos4412-odroidu3.dts  |  2 +-
 .../boot/dts/samsung/exynos4412-odroidx.dts   |  2 +-
 .../boot/dts/samsung/exynos4412-origen.dts    |  2 +-
 .../dts/samsung/exynos5250-snow-common.dtsi   |  2 +-
 .../boot/dts/samsung/exynos5420-peach-pit.dts |  4 +--
 .../boot/dts/samsung/exynos5420-smdk5420.dts  |  4 +--
 .../dts/samsung/exynos5422-samsung-k3g.dts    |  2 +-
 .../boot/dts/samsung/exynos5800-peach-pi.dts  |  4 +--
 arch/arm/boot/dts/samsung/s5pv210-aquila.dts  |  2 +-
 arch/arm/boot/dts/samsung/s5pv210-aries.dtsi  |  6 ++---
 .../boot/dts/samsung/s5pv210-fascinate4g.dts  |  4 +--
 arch/arm/boot/dts/samsung/s5pv210-galaxys.dts |  2 +-
 arch/arm/boot/dts/samsung/s5pv210-goni.dts    |  4 +--
 .../sigmastar/mstar-infinity2m-ssd202d.dtsi   |  2 +-
 arch/arm/boot/dts/st/spear1310-evb.dts        |  2 +-
 arch/arm/boot/dts/st/spear1340-evb.dts        |  2 +-
 arch/arm/boot/dts/st/spear13xx.dtsi           |  2 +-
 arch/arm/boot/dts/st/spear300-evb.dts         |  2 +-
 arch/arm/boot/dts/st/spear310-evb.dts         |  2 +-
 arch/arm/boot/dts/st/spear320-evb.dts         |  2 +-
 arch/arm/boot/dts/st/spear320-hmi.dts         |  2 +-
 arch/arm/boot/dts/st/spear3xx.dtsi            |  2 +-
 arch/arm/boot/dts/st/spear600-evb.dts         |  2 +-
 arch/arm/boot/dts/st/spear600.dtsi            |  2 +-
 arch/arm/boot/dts/st/ste-href.dtsi            |  2 +-
 arch/arm/boot/dts/st/ste-nomadik-stn8815.dtsi |  2 +-
 arch/arm/boot/dts/st/ste-snowball.dts         |  4 +--
 .../dts/st/ste-ux500-samsung-codina-tmo.dts   |  4 +--
 .../boot/dts/st/ste-ux500-samsung-codina.dts  | 10 +++----
 .../boot/dts/st/ste-ux500-samsung-gavini.dts  | 12 ++++-----
 .../boot/dts/st/ste-ux500-samsung-golden.dts  |  8 +++---
 .../boot/dts/st/ste-ux500-samsung-janice.dts  | 16 ++++++------
 .../boot/dts/st/ste-ux500-samsung-kyle.dts    |  8 +++---
 .../boot/dts/st/ste-ux500-samsung-skomer.dts  |  4 +--
 arch/arm/boot/dts/st/stm32f429-disco.dts      |  2 +-
 arch/arm/boot/dts/st/stm32f469-disco.dts      |  2 +-
 arch/arm/boot/dts/st/stm32f746-disco.dts      |  2 +-
 arch/arm/boot/dts/st/stm32mp151a-prtt1c.dts   |  4 +--
 ...157a-microgea-stm32mp1-microdev2.0-of7.dts |  4 +--
 .../boot/dts/st/stm32mp157c-lxa-tac-gen1.dts  |  2 +-
 .../boot/dts/st/stm32mp157c-lxa-tac-gen2.dts  |  2 +-
 .../boot/dts/st/stm32mp15xx-dhcom-som.dtsi    |  2 +-
 .../dts/st/stm32mp15xx-dhcor-avenger96.dtsi   |  2 +-
 .../dts/st/stm32mp15xx-dhcor-drc-compact.dtsi |  2 +-
 .../dts/synaptics/berlin2q-marvell-dmp.dts    |  8 +++---
 arch/arm/boot/dts/ti/davinci/da850-evm.dts    |  2 +-
 .../boot/dts/ti/davinci/da850-lego-ev3.dts    |  4 +--
 .../boot/dts/ti/keystone/keystone-k2g-ice.dts |  2 +-
 arch/arm/boot/dts/ti/omap/am335x-baltos.dtsi  |  2 +-
 .../dts/ti/omap/am335x-boneblack-wireless.dts |  2 +-
 arch/arm/boot/dts/ti/omap/am335x-boneblue.dts |  2 +-
 .../dts/ti/omap/am335x-bonegreen-wireless.dts |  2 +-
 arch/arm/boot/dts/ti/omap/am335x-cm-t335.dts  |  2 +-
 arch/arm/boot/dts/ti/omap/am335x-evm.dts      |  2 +-
 arch/arm/boot/dts/ti/omap/am335x-evmsk.dts    |  4 +--
 arch/arm/boot/dts/ti/omap/am335x-icev2.dts    |  2 +-
 .../dts/ti/omap/am335x-moxa-uc-8100-me-t.dts  |  2 +-
 arch/arm/boot/dts/ti/omap/am335x-pdu001.dts   |  2 +-
 arch/arm/boot/dts/ti/omap/am3517-som.dtsi     |  4 +--
 arch/arm/boot/dts/ti/omap/am437x-gp-evm.dts   |  4 +--
 arch/arm/boot/dts/ti/omap/am437x-sk-evm.dts   |  2 +-
 .../dts/ti/omap/am57xx-beagle-x15-common.dtsi |  2 +-
 arch/arm/boot/dts/ti/omap/dm8148-t410.dts     |  2 +-
 arch/arm/boot/dts/ti/omap/dra7-evm.dts        |  6 ++---
 arch/arm/boot/dts/ti/omap/dra71-evm.dts       |  2 +-
 .../boot/dts/ti/omap/dra72-evm-common.dtsi    |  4 +--
 arch/arm/boot/dts/ti/omap/dra76-evm.dts       |  4 +--
 arch/arm/boot/dts/ti/omap/logicpd-som-lv.dtsi |  2 +-
 .../ti/omap/logicpd-torpedo-37xx-devkit.dts   |  2 +-
 .../dts/ti/omap/motorola-mapphone-common.dtsi |  6 ++---
 .../dts/ti/omap/motorola-mapphone-xt8xx.dtsi  |  2 +-
 arch/arm/boot/dts/ti/omap/omap3-beagle-xm.dts |  2 +-
 arch/arm/boot/dts/ti/omap/omap3-beagle.dts    |  2 +-
 arch/arm/boot/dts/ti/omap/omap3-cm-t3517.dts  |  2 +-
 arch/arm/boot/dts/ti/omap/omap3-cm-t3530.dts  |  2 +-
 arch/arm/boot/dts/ti/omap/omap3-cm-t3730.dts  |  2 +-
 .../boot/dts/ti/omap/omap3-evm-common.dtsi    |  6 ++---
 arch/arm/boot/dts/ti/omap/omap3-gta04a5.dts   |  2 +-
 .../dts/ti/omap/omap3-igep0020-common.dtsi    |  2 +-
 .../boot/dts/ti/omap/omap3-igep0020-rev-f.dts |  2 +-
 .../boot/dts/ti/omap/omap3-igep0030-rev-g.dts |  2 +-
 arch/arm/boot/dts/ti/omap/omap3-n950-n9.dtsi  |  4 +--
 .../boot/dts/ti/omap/omap3-overo-base.dtsi    |  6 ++---
 .../dts/ti/omap/omap3-pandora-common.dtsi     |  6 ++---
 arch/arm/boot/dts/ti/omap/omap3-sb-t35.dtsi   |  2 +-
 arch/arm/boot/dts/ti/omap/omap3-tao3530.dtsi  |  4 +--
 arch/arm/boot/dts/ti/omap/omap3-zoom3.dts     |  2 +-
 arch/arm/boot/dts/ti/omap/omap4-duovero.dtsi  |  2 +-
 .../boot/dts/ti/omap/omap4-epson-embt2ws.dts  |  2 +-
 .../boot/dts/ti/omap/omap4-panda-common.dtsi  |  4 +--
 arch/arm/boot/dts/ti/omap/omap4-sdp.dts       |  4 +--
 .../dts/ti/omap/omap4-var-som-om44-wlan.dtsi  |  2 +-
 .../boot/dts/ti/omap/omap5-board-common.dtsi  |  2 +-
 arch/arm/boot/dts/ti/omap/omap5-cm-t54.dts    |  4 +--
 arch/arm/boot/dts/vt8500/vt8500.dtsi          |  2 +-
 arch/arm/boot/dts/vt8500/wm8505.dtsi          |  2 +-
 arch/arm/boot/dts/vt8500/wm8650.dtsi          |  2 +-
 arch/arm/boot/dts/vt8500/wm8750.dtsi          |  2 +-
 arch/arm/boot/dts/vt8500/wm8850.dtsi          |  2 +-
 662 files changed, 1283 insertions(+), 1283 deletions(-)

-- 
2.46.2



From rosenp at gmail.com  Mon Sep 30 15:35:49 2024
From: rosenp at gmail.com (Rosen Penev)
Date: Mon, 30 Sep 2024 15:35:49 -0700
Subject: [PATCH 1/2] ARM: dts: replace gpio = with gpios =
In-Reply-To: <20240930223550.353882-1-rosenp@gmail.com>
References: <20240930223550.353882-1-rosenp@gmail.com>
Message-ID: <20240930223550.353882-2-rosenp@gmail.com>

Found with dtc:

Warning (deprecated_gpio_property): '[*-]gpio' is deprecated, use
'[*-]gpios' instead

Transformation performed with

find -name "*.dts" -exec sed -i 's/\tgpio = </\tgpios = </g' '{}' \
find -name "*.dtsi" -exec sed -i 's/\tgpio = </\tgpios = </g' '{}' \

Signed-off-by: Rosen Penev <rosenp at gmail.com>
---
 .../boot/dts/allwinner/sun4i-a10-a1000.dts    |  2 +-
 .../dts/allwinner/sun4i-a10-ba10-tvbox.dts    |  2 +-
 .../allwinner/sun4i-a10-dserve-dsrv9703c.dts  |  2 +-
 .../dts/allwinner/sun4i-a10-hackberry.dts     |  4 +--
 .../dts/allwinner/sun4i-a10-hyundai-a7hd.dts  |  2 +-
 .../dts/allwinner/sun4i-a10-jesurun-q5.dts    |  2 +-
 .../boot/dts/allwinner/sun4i-a10-mk802.dts    |  2 +-
 .../allwinner/sun4i-a10-olinuxino-lime.dts    |  2 +-
 .../boot/dts/allwinner/sun4i-a10-pcduino2.dts |  2 +-
 .../dts/allwinner/sun4i-a10-topwise-a721.dts  |  2 +-
 .../dts/allwinner/sun5i-a10s-auxtek-t003.dts  |  4 +--
 .../dts/allwinner/sun5i-a10s-auxtek-t004.dts  |  4 +--
 .../boot/dts/allwinner/sun5i-a10s-mk802.dts   |  2 +-
 .../allwinner/sun5i-a10s-olinuxino-micro.dts  |  4 +--
 .../dts/allwinner/sun5i-a10s-r7-tv-dongle.dts |  2 +-
 .../boot/dts/allwinner/sun5i-a10s-wobo-i5.dts |  4 +--
 .../sun5i-a13-empire-electronix-d709.dts      |  2 +-
 .../boot/dts/allwinner/sun5i-a13-hsg-h702.dts |  2 +-
 .../dts/allwinner/sun5i-a13-licheepi-one.dts  |  2 +-
 .../allwinner/sun5i-a13-olinuxino-micro.dts   |  4 +--
 .../dts/allwinner/sun5i-a13-olinuxino.dts     |  4 +--
 .../sun5i-a13-pocketbook-614-plus.dts         |  6 ++---
 .../sun5i-a13-pocketbook-touch-lux-3.dts      |  8 +++---
 .../boot/dts/allwinner/sun5i-a13-utoo-p66.dts |  2 +-
 arch/arm/boot/dts/allwinner/sun5i-gr8-evb.dts |  2 +-
 arch/arm/boot/dts/allwinner/sun5i-r8-chip.dts |  2 +-
 .../sun5i-reference-design-tablet.dtsi        |  2 +-
 .../dts/allwinner/sun6i-a31-app4-evb1.dts     |  2 +-
 .../boot/dts/allwinner/sun6i-a31-colombus.dts |  2 +-
 .../dts/allwinner/sun6i-a31-hummingbird.dts   |  4 +--
 arch/arm/boot/dts/allwinner/sun6i-a31-i7.dts  |  2 +-
 arch/arm/boot/dts/allwinner/sun6i-a31-m9.dts  |  2 +-
 .../allwinner/sun6i-a31-mele-a1000g-quad.dts  |  2 +-
 .../allwinner/sun7i-a20-bananapi-m1-plus.dts  |  2 +-
 .../boot/dts/allwinner/sun7i-a20-bananapi.dts |  2 +-
 .../dts/allwinner/sun7i-a20-bananapro.dts     |  6 ++---
 .../dts/allwinner/sun7i-a20-cubietruck.dts    |  4 +--
 .../dts/allwinner/sun7i-a20-hummingbird.dts   |  8 +++---
 .../dts/allwinner/sun7i-a20-i12-tvbox.dts     |  6 ++---
 .../dts/allwinner/sun7i-a20-lamobo-r1.dts     |  6 ++---
 .../allwinner/sun7i-a20-olimex-som-evb.dts    |  2 +-
 .../allwinner/sun7i-a20-olimex-som204-evb.dts |  4 +--
 .../allwinner/sun7i-a20-olinuxino-lime.dts    |  2 +-
 .../allwinner/sun7i-a20-olinuxino-lime2.dts   |  4 +--
 .../dts/allwinner/sun7i-a20-orangepi-mini.dts |  6 ++---
 .../boot/dts/allwinner/sun7i-a20-orangepi.dts |  6 ++---
 .../dts/allwinner/sun7i-a20-pcduino3-nano.dts |  4 +--
 .../boot/dts/allwinner/sun7i-a20-pcduino3.dts |  2 +-
 .../sun8i-a83t-allwinner-h8homlet-v2.dts      |  4 +--
 .../dts/allwinner/sun8i-a83t-bananapi-m3.dts  |  4 +--
 .../allwinner/sun8i-a83t-cubietruck-plus.dts  |  4 +--
 .../dts/allwinner/sun8i-a83t-tbs-a711.dts     |  2 +-
 .../sun8i-h2-plus-bananapi-m2-zero.dts        |  4 +--
 .../allwinner/sun8i-h2-plus-orangepi-r1.dts   |  2 +-
 .../allwinner/sun8i-h2-plus-orangepi-zero.dts |  2 +-
 .../dts/allwinner/sun8i-h3-beelink-x2.dts     |  2 +-
 .../dts/allwinner/sun8i-h3-nanopi-duo2.dts    |  6 ++---
 .../dts/allwinner/sun8i-h3-nanopi-m1-plus.dts |  2 +-
 .../boot/dts/allwinner/sun8i-h3-nanopi-r1.dts |  4 +--
 .../dts/allwinner/sun8i-h3-orangepi-2.dts     |  2 +-
 .../dts/allwinner/sun8i-h3-orangepi-one.dts   |  2 +-
 .../dts/allwinner/sun8i-h3-orangepi-pc.dts    |  2 +-
 .../dts/allwinner/sun8i-h3-orangepi-plus.dts  |  4 +--
 .../allwinner/sun8i-h3-orangepi-plus2e.dts    |  2 +-
 .../boot/dts/allwinner/sun8i-h3-zeropi.dts    |  2 +-
 .../boot/dts/allwinner/sun8i-r16-parrot.dts   |  2 +-
 .../allwinner/sun8i-r40-bananapi-m2-ultra.dts |  2 +-
 .../boot/dts/allwinner/sun8i-s3-pinecube.dts  |  2 +-
 .../boot/dts/allwinner/sun8i-t3-cqa3t-bv3.dts |  2 +-
 .../allwinner/sun8i-v40-bananapi-m2-berry.dts |  2 +-
 .../boot/dts/allwinner/sun9i-a80-optimus.dts  |  4 +--
 .../dts/allwinner/sunxi-bananapi-m2-plus.dtsi |  4 +--
 .../allwinner/sunxi-common-regulators.dtsi    |  8 +++---
 .../allwinner/sunxi-h3-h5-emlid-neutis.dtsi   |  2 +-
 .../allwinner/sunxi-libretech-all-h3-cc.dtsi  |  8 +++---
 .../allwinner/sunxi-libretech-all-h3-it.dtsi  |  8 +++---
 arch/arm/boot/dts/amlogic/meson8b-ec100.dts   |  4 +--
 .../arm/boot/dts/amlogic/meson8b-odroidc1.dts |  2 +-
 .../aspeed/aspeed-bmc-facebook-bletchley.dts  | 12 ++++-----
 .../arm/boot/dts/broadcom/bcm2711-rpi-4-b.dts |  4 +--
 .../boot/dts/broadcom/bcm2711-rpi-cm4.dtsi    |  2 +-
 arch/arm/boot/dts/cirrus/ep7211-edb7211.dts   |  4 +--
 .../boot/dts/gemini/gemini-dlink-dir-685.dts  |  2 +-
 .../dts/intel/pxa/pxa300-raumfeld-common.dtsi |  2 +-
 .../intel/pxa/pxa300-raumfeld-controller.dts  |  2 +-
 .../socfpga/socfpga_cyclone5_vining_fpga.dts  |  2 +-
 .../dts/marvell/armada-370-dlink-dns327l.dts  |  6 ++---
 .../marvell/armada-370-seagate-nas-4bay.dts   |  4 +--
 .../marvell/armada-370-seagate-nas-xbay.dtsi  |  4 +--
 ...armada-370-seagate-personal-cloud-2bay.dts |  2 +-
 .../armada-370-seagate-personal-cloud.dtsi    |  4 +--
 .../marvell/armada-370-synology-ds213j.dts    |  4 +--
 .../dts/marvell/armada-385-clearfog-gtr.dtsi  |  2 +-
 .../arm/boot/dts/marvell/armada-385-db-ap.dts |  2 +-
 .../dts/marvell/armada-385-linksys-rango.dts  |  2 +-
 .../boot/dts/marvell/armada-385-linksys.dtsi  |  2 +-
 .../dts/marvell/armada-385-synology-ds116.dts |  6 ++---
 arch/arm/boot/dts/marvell/armada-388-gp.dts   | 14 +++++-----
 .../boot/dts/marvell/armada-388-helios4.dts   |  2 +-
 .../dts/marvell/armada-xp-synology-ds414.dts  |  8 +++---
 arch/arm/boot/dts/marvell/dove-cm-a510.dtsi   |  2 +-
 arch/arm/boot/dts/marvell/dove-cubox.dts      |  2 +-
 arch/arm/boot/dts/marvell/dove-d3plug.dts     |  2 +-
 arch/arm/boot/dts/marvell/dove-sbc-a510.dts   |  4 +--
 .../marvell/kirkwood-blackarmor-nas220.dts    |  4 +--
 arch/arm/boot/dts/marvell/kirkwood-dnskw.dtsi |  4 +--
 .../boot/dts/marvell/kirkwood-dockstar.dts    |  2 +-
 .../boot/dts/marvell/kirkwood-goflexnet.dts   |  2 +-
 arch/arm/boot/dts/marvell/kirkwood-l-50.dts   |  8 +++---
 arch/arm/boot/dts/marvell/kirkwood-laplug.dts |  6 ++---
 .../marvell/kirkwood-linkstation-6282.dtsi    |  4 +--
 .../kirkwood-linkstation-duo-6281.dtsi        |  6 ++---
 .../marvell/kirkwood-linkstation-lsqvl.dts    |  2 +-
 .../marvell/kirkwood-linkstation-lswvl.dts    |  2 +-
 arch/arm/boot/dts/marvell/kirkwood-lsxl.dtsi  |  4 +--
 .../arm/boot/dts/marvell/kirkwood-nas2big.dts |  2 +-
 .../arm/boot/dts/marvell/kirkwood-net2big.dts |  2 +-
 .../arm/boot/dts/marvell/kirkwood-net5big.dts |  8 +++---
 .../kirkwood-netgear_readynas_duo_v2.dts      |  2 +-
 .../kirkwood-netgear_readynas_nv+_v2.dts      |  2 +-
 .../boot/dts/marvell/kirkwood-netxbig.dtsi    |  2 +-
 .../arm/boot/dts/marvell/kirkwood-nsa310s.dts |  4 +--
 arch/arm/boot/dts/marvell/kirkwood-nsa325.dts |  2 +-
 .../dts/marvell/kirkwood-nsa3x0-common.dtsi   |  2 +-
 .../boot/dts/marvell/kirkwood-pogo_e02.dts    |  2 +-
 .../boot/dts/marvell/kirkwood-rd88f6192.dts   |  2 +-
 .../marvell/kirkwood-sheevaplug-common.dtsi   |  2 +-
 .../boot/dts/marvell/kirkwood-synology.dtsi   | 26 +++++++++----------
 arch/arm/boot/dts/marvell/kirkwood-t5325.dts  |  2 +-
 .../arm/boot/dts/marvell/kirkwood-topkick.dts |  2 +-
 .../boot/dts/marvell/mmp2-olpc-xo-1-75.dts    |  2 +-
 .../dts/marvell/orion5x-lacie-d2-network.dts  |  4 +--
 arch/arm/boot/dts/marvell/orion5x-lswsgl.dts  |  6 ++---
 arch/arm/boot/dts/mediatek/mt2701-evb.dts     |  2 +-
 .../boot/dts/microchip/at91-kizbox3-hs.dts    | 22 ++++++++--------
 .../boot/dts/microchip/at91-sama5d3_eds.dts   |  2 +-
 .../microchip/at91-sama5d3_ksz9477_evb.dts    |  2 +-
 .../dts/microchip/at91-sama5d3_xplained.dts   |  2 +-
 .../dts/microchip/at91-sama5d4_ma5d4.dtsi     |  2 +-
 .../dts/microchip/at91-sama5d4_ma5d4evk.dts   |  2 +-
 .../dts/microchip/at91-sama5d4_xplained.dts   |  2 +-
 arch/arm/boot/dts/nspire/nspire-classic.dtsi  |  2 +-
 arch/arm/boot/dts/nspire/nspire-cx.dts        |  2 +-
 .../boot/dts/nvidia/tegra114-asus-tf701t.dts  | 20 +++++++-------
 arch/arm/boot/dts/nvidia/tegra114-dalmore.dts | 10 +++----
 arch/arm/boot/dts/nvidia/tegra114-roth.dts    | 10 +++----
 arch/arm/boot/dts/nvidia/tegra114-tn7.dts     |  4 +--
 .../boot/dts/nvidia/tegra124-apalis-eval.dts  |  4 +--
 .../dts/nvidia/tegra124-apalis-v1.2-eval.dts  |  4 +--
 .../boot/dts/nvidia/tegra124-apalis-v1.2.dtsi |  4 +--
 arch/arm/boot/dts/nvidia/tegra124-apalis.dtsi |  4 +--
 .../boot/dts/nvidia/tegra124-jetson-tk1.dts   | 16 ++++++------
 arch/arm/boot/dts/nvidia/tegra124-nyan.dtsi   | 18 ++++++-------
 arch/arm/boot/dts/nvidia/tegra124-venice2.dts | 18 ++++++-------
 .../dts/nvidia/tegra20-acer-a500-picasso.dts  |  2 +-
 .../boot/dts/nvidia/tegra20-asus-tf101.dts    |  6 ++---
 .../dts/nvidia/tegra20-colibri-eval-v3.dts    |  2 +-
 .../boot/dts/nvidia/tegra20-colibri-iris.dts  |  2 +-
 arch/arm/boot/dts/nvidia/tegra20-colibri.dtsi |  2 +-
 arch/arm/boot/dts/nvidia/tegra20-harmony.dts  | 12 ++++-----
 arch/arm/boot/dts/nvidia/tegra20-paz00.dts    |  2 +-
 arch/arm/boot/dts/nvidia/tegra20-seaboard.dts | 12 ++++-----
 .../arm/boot/dts/nvidia/tegra20-tamonten.dtsi |  2 +-
 .../arm/boot/dts/nvidia/tegra20-trimslice.dts |  2 +-
 arch/arm/boot/dts/nvidia/tegra20-ventana.dts  |  8 +++---
 .../boot/dts/nvidia/tegra30-apalis-eval.dts   |  4 +--
 .../dts/nvidia/tegra30-apalis-v1.1-eval.dts   |  4 +--
 .../boot/dts/nvidia/tegra30-apalis-v1.1.dtsi  |  4 +--
 arch/arm/boot/dts/nvidia/tegra30-apalis.dtsi  |  4 +--
 .../tegra30-asus-nexus7-grouper-common.dtsi   |  2 +-
 ...egra30-asus-nexus7-grouper-maxim-pmic.dtsi |  4 +--
 .../tegra30-asus-nexus7-grouper-ti-pmic.dtsi  |  2 +-
 .../boot/dts/nvidia/tegra30-asus-tf700t.dts   |  2 +-
 .../tegra30-asus-transformer-common.dtsi      | 16 ++++++------
 arch/arm/boot/dts/nvidia/tegra30-beaver.dts   | 14 +++++-----
 .../boot/dts/nvidia/tegra30-cardhu-a02.dts    | 12 ++++-----
 .../boot/dts/nvidia/tegra30-cardhu-a04.dts    | 14 +++++-----
 arch/arm/boot/dts/nvidia/tegra30-cardhu.dtsi  | 24 ++++++++---------
 .../dts/nvidia/tegra30-colibri-eval-v3.dts    |  2 +-
 arch/arm/boot/dts/nvidia/tegra30-colibri.dtsi |  6 ++---
 arch/arm/boot/dts/nvidia/tegra30-lg-p895.dts  |  2 +-
 arch/arm/boot/dts/nvidia/tegra30-lg-x3.dtsi   | 18 ++++++-------
 arch/arm/boot/dts/nvidia/tegra30-ouya.dts     | 16 ++++++------
 .../dts/nvidia/tegra30-pegatron-chagall.dts   | 12 ++++-----
 arch/arm/boot/dts/nxp/imx/e60k02.dtsi         |  2 +-
 arch/arm/boot/dts/nxp/imx/e70k02.dtsi         |  2 +-
 ...25-eukrea-mbimxsd25-baseboard-cmo-qvga.dts |  2 +-
 arch/arm/boot/dts/nxp/imx/imx25-karo-tx25.dts |  2 +-
 arch/arm/boot/dts/nxp/imx/imx25-pdk.dts       |  4 +--
 .../imx/imx27-eukrea-mbimxsd27-baseboard.dts  |  2 +-
 .../dts/nxp/imx/imx27-phytec-phycore-rdk.dts  |  2 +-
 arch/arm/boot/dts/nxp/imx/imx51-babbage.dts   |  2 +-
 .../imx/imx51-eukrea-mbimxsd51-baseboard.dts  |  2 +-
 arch/arm/boot/dts/nxp/imx/imx51-ts4800.dts    |  2 +-
 .../boot/dts/nxp/imx/imx51-zii-scu2-mezz.dts  |  2 +-
 .../boot/dts/nxp/imx/imx51-zii-scu3-esb.dts   |  2 +-
 arch/arm/boot/dts/nxp/imx/imx53-cx9020.dts    |  2 +-
 arch/arm/boot/dts/nxp/imx/imx53-m53evk.dts    |  4 +--
 arch/arm/boot/dts/nxp/imx/imx53-m53menlo.dts  |  2 +-
 arch/arm/boot/dts/nxp/imx/imx53-mba53.dts     |  2 +-
 arch/arm/boot/dts/nxp/imx/imx53-ppd.dts       |  6 ++---
 .../boot/dts/nxp/imx/imx53-qsb-common.dtsi    |  2 +-
 arch/arm/boot/dts/nxp/imx/imx53-sk-imx53.dts  |  4 +--
 arch/arm/boot/dts/nxp/imx/imx53-tx53-x03x.dts |  4 +--
 arch/arm/boot/dts/nxp/imx/imx53-tx53-x13x.dts |  4 +--
 arch/arm/boot/dts/nxp/imx/imx53-tx53.dtsi     |  6 ++---
 .../dts/nxp/imx/imx53-voipac-dmm-668.dtsi     |  2 +-
 .../dts/nxp/imx/imx6-logicpd-baseboard.dtsi   | 20 +++++++-------
 .../boot/dts/nxp/imx/imx6-logicpd-som.dtsi    |  2 +-
 arch/arm/boot/dts/nxp/imx/imx6dl-alti6p.dts   |  4 +--
 arch/arm/boot/dts/nxp/imx/imx6dl-b1x5pv2.dtsi |  8 +++---
 .../dts/nxp/imx/imx6dl-colibri-iris-v2.dts    |  2 +-
 .../dts/nxp/imx/imx6dl-eckelmann-ci4x10.dts   |  2 +-
 arch/arm/boot/dts/nxp/imx/imx6dl-lanmcu.dts   |  2 +-
 arch/arm/boot/dts/nxp/imx/imx6dl-mamoj.dts    | 18 ++++++-------
 arch/arm/boot/dts/nxp/imx/imx6dl-prtmvt.dts   |  4 +--
 arch/arm/boot/dts/nxp/imx/imx6dl-prtvt7.dts   |  2 +-
 .../arm/boot/dts/nxp/imx/imx6dl-riotboard.dts |  2 +-
 arch/arm/boot/dts/nxp/imx/imx6dl-sielaff.dts  |  4 +--
 .../boot/dts/nxp/imx/imx6dl-yapp4-common.dtsi |  6 ++---
 .../dts/nxp/imx/imx6dl-yapp43-common.dtsi     |  4 +--
 .../dts/nxp/imx/imx6q-apalis-eval-v1.2.dts    |  8 +++---
 .../boot/dts/nxp/imx/imx6q-apalis-eval.dts    |  2 +-
 .../dts/nxp/imx/imx6q-apalis-ixora-v1.2.dts   |  6 ++---
 arch/arm/boot/dts/nxp/imx/imx6q-arm2.dts      |  2 +-
 arch/arm/boot/dts/nxp/imx/imx6q-ba16.dtsi     |  4 +--
 arch/arm/boot/dts/nxp/imx/imx6q-bosch-acc.dts |  2 +-
 arch/arm/boot/dts/nxp/imx/imx6q-bx50v3.dtsi   |  4 +--
 arch/arm/boot/dts/nxp/imx/imx6q-cm-fx6.dts    |  6 ++---
 arch/arm/boot/dts/nxp/imx/imx6q-display5.dtsi |  4 +--
 .../boot/dts/nxp/imx/imx6q-dmo-edmqmx6.dts    |  4 +--
 arch/arm/boot/dts/nxp/imx/imx6q-dms-ba16.dts  |  2 +-
 arch/arm/boot/dts/nxp/imx/imx6q-evi.dts       |  4 +--
 arch/arm/boot/dts/nxp/imx/imx6q-gw5400-a.dts  |  2 +-
 arch/arm/boot/dts/nxp/imx/imx6q-h100.dts      |  6 ++---
 arch/arm/boot/dts/nxp/imx/imx6q-kp.dtsi       |  2 +-
 arch/arm/boot/dts/nxp/imx/imx6q-logicpd.dts   |  4 +--
 arch/arm/boot/dts/nxp/imx/imx6q-marsboard.dts |  2 +-
 arch/arm/boot/dts/nxp/imx/imx6q-mccmon6.dts   |  2 +-
 arch/arm/boot/dts/nxp/imx/imx6q-novena.dts    | 10 +++----
 arch/arm/boot/dts/nxp/imx/imx6q-pistachio.dts |  4 +--
 arch/arm/boot/dts/nxp/imx/imx6q-prti6q.dts    |  2 +-
 .../dts/nxp/imx/imx6q-var-dt6customboard.dts  |  4 +--
 arch/arm/boot/dts/nxp/imx/imx6qdl-apalis.dtsi |  6 ++---
 .../dts/nxp/imx/imx6qdl-aristainetos.dtsi     |  4 +--
 .../dts/nxp/imx/imx6qdl-aristainetos2.dtsi    |  4 +--
 .../arm/boot/dts/nxp/imx/imx6qdl-colibri.dtsi |  2 +-
 .../arm/boot/dts/nxp/imx/imx6qdl-cubox-i.dtsi |  4 +--
 .../dts/nxp/imx/imx6qdl-dfi-fs700-m60.dtsi    |  2 +-
 .../boot/dts/nxp/imx/imx6qdl-dhcom-som.dtsi   |  6 ++---
 .../boot/dts/nxp/imx/imx6qdl-emcon-avari.dtsi |  2 +-
 arch/arm/boot/dts/nxp/imx/imx6qdl-emcon.dtsi  |  4 +--
 arch/arm/boot/dts/nxp/imx/imx6qdl-gw51xx.dtsi |  2 +-
 arch/arm/boot/dts/nxp/imx/imx6qdl-gw52xx.dtsi |  4 +--
 arch/arm/boot/dts/nxp/imx/imx6qdl-gw53xx.dtsi |  4 +--
 arch/arm/boot/dts/nxp/imx/imx6qdl-gw54xx.dtsi |  4 +--
 arch/arm/boot/dts/nxp/imx/imx6qdl-gw553x.dtsi |  2 +-
 arch/arm/boot/dts/nxp/imx/imx6qdl-gw560x.dtsi |  4 +--
 arch/arm/boot/dts/nxp/imx/imx6qdl-gw5903.dtsi |  6 ++---
 arch/arm/boot/dts/nxp/imx/imx6qdl-gw5904.dtsi |  2 +-
 arch/arm/boot/dts/nxp/imx/imx6qdl-gw5907.dtsi |  2 +-
 arch/arm/boot/dts/nxp/imx/imx6qdl-gw5910.dtsi |  2 +-
 .../dts/nxp/imx/imx6qdl-hummingboard.dtsi     |  6 ++---
 .../dts/nxp/imx/imx6qdl-hummingboard2.dtsi    | 10 +++----
 .../boot/dts/nxp/imx/imx6qdl-icore-rqs.dtsi   |  2 +-
 .../dts/nxp/imx/imx6qdl-kontron-samx6i.dtsi   |  6 ++---
 arch/arm/boot/dts/nxp/imx/imx6qdl-mba6.dtsi   |  2 +-
 .../boot/dts/nxp/imx/imx6qdl-nit6xlite.dtsi   |  4 +--
 .../dts/nxp/imx/imx6qdl-nitrogen6_max.dtsi    |  8 +++---
 .../dts/nxp/imx/imx6qdl-nitrogen6_som2.dtsi   |  8 +++---
 .../boot/dts/nxp/imx/imx6qdl-nitrogen6x.dtsi  |  8 +++---
 .../imx/imx6qdl-phytec-mira-peb-wlbt-05.dtsi  |  2 +-
 .../boot/dts/nxp/imx/imx6qdl-phytec-mira.dtsi | 10 +++----
 .../dts/nxp/imx/imx6qdl-phytec-pfla02.dtsi    |  4 +--
 arch/arm/boot/dts/nxp/imx/imx6qdl-pico.dtsi   |  4 +--
 arch/arm/boot/dts/nxp/imx/imx6qdl-prti6q.dtsi |  2 +-
 arch/arm/boot/dts/nxp/imx/imx6qdl-rex.dtsi    |  4 +--
 .../boot/dts/nxp/imx/imx6qdl-sabreauto.dtsi   |  8 +++---
 .../boot/dts/nxp/imx/imx6qdl-sabrelite.dtsi   |  6 ++---
 .../arm/boot/dts/nxp/imx/imx6qdl-sabresd.dtsi | 10 +++----
 .../boot/dts/nxp/imx/imx6qdl-skov-cpu.dtsi    |  6 ++---
 .../boot/dts/nxp/imx/imx6qdl-sr-som-brcm.dtsi |  2 +-
 arch/arm/boot/dts/nxp/imx/imx6qdl-ts4900.dtsi |  2 +-
 arch/arm/boot/dts/nxp/imx/imx6qdl-ts7970.dtsi |  8 +++---
 arch/arm/boot/dts/nxp/imx/imx6qdl-tx6.dtsi    | 12 ++++-----
 arch/arm/boot/dts/nxp/imx/imx6qdl-udoo.dtsi   |  2 +-
 .../boot/dts/nxp/imx/imx6qdl-var-dart.dtsi    |  2 +-
 .../arm/boot/dts/nxp/imx/imx6qdl-var-som.dtsi |  2 +-
 arch/arm/boot/dts/nxp/imx/imx6qdl-vicut1.dtsi |  2 +-
 .../dts/nxp/imx/imx6qdl-wandboard-revd1.dtsi  |  2 +-
 .../boot/dts/nxp/imx/imx6qdl-wandboard.dtsi   |  2 +-
 .../boot/dts/nxp/imx/imx6qdl-zii-rdu2.dtsi    |  2 +-
 arch/arm/boot/dts/nxp/imx/imx6qp-prtwd3.dts   |  2 +-
 arch/arm/boot/dts/nxp/imx/imx6sl-evk.dts      |  6 ++---
 .../boot/dts/nxp/imx/imx6sl-kobo-aura2.dts    |  2 +-
 .../dts/nxp/imx/imx6sl-tolino-shine2hd.dts    |  4 +--
 .../boot/dts/nxp/imx/imx6sl-tolino-vision.dts |  4 +--
 arch/arm/boot/dts/nxp/imx/imx6sll-evk.dts     | 10 +++----
 .../boot/dts/nxp/imx/imx6sx-nitrogen6sx.dts   |  8 +++---
 .../arm/boot/dts/nxp/imx/imx6sx-sabreauto.dts |  8 +++---
 arch/arm/boot/dts/nxp/imx/imx6sx-sdb-reva.dts |  4 +--
 arch/arm/boot/dts/nxp/imx/imx6sx-sdb.dts      |  2 +-
 arch/arm/boot/dts/nxp/imx/imx6sx-sdb.dtsi     | 14 +++++-----
 .../nxp/imx/imx6sx-softing-vining-2000.dts    |  2 +-
 .../arm/boot/dts/nxp/imx/imx6sx-udoo-neo.dtsi |  8 +++---
 .../boot/dts/nxp/imx/imx6ul-14x14-evk.dtsi    |  4 +--
 .../dts/nxp/imx/imx6ul-ccimx6ulsbcpro.dts     |  2 +-
 .../nxp/imx/imx6ul-imx6ull-opos6uldev.dtsi    |  4 +--
 .../dts/nxp/imx/imx6ul-kontron-bl-common.dtsi |  2 +-
 .../arm/boot/dts/nxp/imx/imx6ul-liteboard.dts |  2 +-
 .../imx/imx6ul-phytec-segin-peb-av-02.dtsi    |  2 +-
 .../imx/imx6ul-phytec-segin-peb-wlbt-05.dtsi  |  2 +-
 .../boot/dts/nxp/imx/imx6ul-phytec-segin.dtsi |  2 +-
 arch/arm/boot/dts/nxp/imx/imx6ul-pico.dtsi    |  6 ++---
 arch/arm/boot/dts/nxp/imx/imx6ul-tx6ul.dtsi   | 10 +++----
 .../dts/nxp/imx/imx6ull-colibri-aster.dtsi    |  2 +-
 .../dts/nxp/imx/imx6ull-colibri-eval-v3.dtsi  |  2 +-
 .../dts/nxp/imx/imx6ull-colibri-iris-v2.dtsi  |  2 +-
 .../dts/nxp/imx/imx6ull-colibri-iris.dtsi     |  2 +-
 .../boot/dts/nxp/imx/imx6ull-dhcom-som.dtsi   |  2 +-
 arch/arm/boot/dts/nxp/imx/imx6ull-jozacp.dts  |  2 +-
 .../dts/nxp/imx/imx6ull-phytec-tauri.dtsi     |  6 ++---
 .../dts/nxp/imx/imx6ull-tarragon-master.dts   |  2 +-
 .../dts/nxp/imx/imx6ull-tarragon-slavext.dts  |  2 +-
 .../dts/nxp/imx/imx7-colibri-iris-v2.dtsi     |  2 +-
 arch/arm/boot/dts/nxp/imx/imx7-colibri.dtsi   |  2 +-
 arch/arm/boot/dts/nxp/imx/imx7-mba7.dtsi      | 16 ++++++------
 .../boot/dts/nxp/imx/imx7d-cl-som-imx7.dts    |  2 +-
 .../dts/nxp/imx/imx7d-flex-concentrator.dts   |  2 +-
 arch/arm/boot/dts/nxp/imx/imx7d-meerkat96.dts |  4 +--
 arch/arm/boot/dts/nxp/imx/imx7d-nitrogen7.dts |  8 +++---
 arch/arm/boot/dts/nxp/imx/imx7d-pico.dtsi     |  6 ++---
 .../boot/dts/nxp/imx/imx7d-remarkable2.dts    |  6 ++---
 arch/arm/boot/dts/nxp/imx/imx7d-sdb-reva.dts  |  2 +-
 arch/arm/boot/dts/nxp/imx/imx7d-sdb.dts       | 14 +++++-----
 arch/arm/boot/dts/nxp/imx/imx7d-smegw01.dts   | 10 +++----
 arch/arm/boot/dts/nxp/imx/imx7d-zii-rpu2.dts  |  4 +--
 arch/arm/boot/dts/nxp/imx/imx7s-warp.dts      |  4 +--
 arch/arm/boot/dts/nxp/imx/imx7ulp-evk.dts     |  4 +--
 arch/arm/boot/dts/nxp/imx/mba6ulx.dtsi        |  6 ++---
 arch/arm/boot/dts/nxp/lpc/lpc3250-phy3250.dts |  6 ++---
 arch/arm/boot/dts/nxp/mxs/imx23-evk.dts       |  4 +--
 arch/arm/boot/dts/nxp/mxs/imx23-olinuxino.dts |  2 +-
 arch/arm/boot/dts/nxp/mxs/imx23-sansa.dts     |  8 +++---
 .../boot/dts/nxp/mxs/imx23-stmp378x_devb.dts  |  2 +-
 arch/arm/boot/dts/nxp/mxs/imx23-xfi3.dts      |  2 +-
 arch/arm/boot/dts/nxp/mxs/imx28-apf28dev.dts  |  2 +-
 arch/arm/boot/dts/nxp/mxs/imx28-cfa10036.dts  |  2 +-
 arch/arm/boot/dts/nxp/mxs/imx28-cfa10037.dts  |  2 +-
 arch/arm/boot/dts/nxp/mxs/imx28-cfa10049.dts  |  2 +-
 arch/arm/boot/dts/nxp/mxs/imx28-cfa10057.dts  |  2 +-
 arch/arm/boot/dts/nxp/mxs/imx28-cfa10058.dts  |  2 +-
 .../dts/nxp/mxs/imx28-eukrea-mbmx28lc.dtsi    |  6 ++---
 arch/arm/boot/dts/nxp/mxs/imx28-evk.dts       | 12 ++++-----
 arch/arm/boot/dts/nxp/mxs/imx28-m28cu3.dts    |  6 ++---
 arch/arm/boot/dts/nxp/mxs/imx28-m28evk.dts    |  6 ++---
 arch/arm/boot/dts/nxp/mxs/imx28-sps1.dts      |  2 +-
 arch/arm/boot/dts/nxp/mxs/imx28-ts4600.dts    |  2 +-
 arch/arm/boot/dts/nxp/mxs/imx28-tx28.dts      | 10 +++----
 arch/arm/boot/dts/nxp/mxs/imx28-xea.dts       |  4 +--
 .../boot/dts/nxp/vf/vf-colibri-eval-v3.dtsi   |  2 +-
 arch/arm/boot/dts/nxp/vf/vf610-zii-dev.dtsi   |  2 +-
 .../boot/dts/qcom/msm8226-motorola-falcon.dts |  2 +-
 .../dts/qcom/qcom-apq8026-asus-sparrow.dts    |  2 +-
 .../dts/qcom/qcom-apq8026-huawei-sturgeon.dts |  2 +-
 .../boot/dts/qcom/qcom-apq8026-lg-lenok.dts   |  2 +-
 .../qcom-apq8026-samsung-matisse-wifi.dts     |  2 +-
 .../qcom/qcom-apq8026-samsung-milletwifi.dts  |  6 ++---
 .../dts/qcom/qcom-apq8060-dragonboard.dts     |  2 +-
 .../dts/qcom/qcom-apq8064-asus-nexus7-flo.dts |  2 +-
 .../boot/dts/qcom/qcom-apq8064-ifc6410.dts    |  2 +-
 .../dts/qcom/qcom-apq8074-dragonboard.dts     |  2 +-
 .../qcom-msm8226-samsung-matisse-common.dtsi  |  2 +-
 .../dts/qcom/qcom-msm8226-samsung-ms013g.dts  |  4 +--
 .../qcom/qcom-msm8926-motorola-peregrine.dts  |  2 +-
 .../qcom/qcom-msm8926-samsung-matisselte.dts  |  2 +-
 arch/arm/boot/dts/qcom/qcom-msm8960-cdp.dts   |  2 +-
 .../qcom-msm8974-lge-nexus5-hammerhead.dts    |  4 +--
 .../dts/qcom/qcom-msm8974-samsung-hlte.dts    |  2 +-
 .../qcom/qcom-msm8974-sony-xperia-rhine.dtsi  |  2 +-
 .../qcom/qcom-msm8974pro-fairphone-fp2.dts    |  2 +-
 .../boot/dts/qcom/qcom-msm8974pro-htc-m8.dts  |  2 +-
 .../qcom/qcom-msm8974pro-oneplus-bacon.dts    |  2 +-
 .../qcom-msm8974pro-samsung-klte-common.dtsi  |  4 +--
 ...-msm8974pro-sony-xperia-shinano-castor.dts |  2 +-
 ...msm8974pro-sony-xperia-shinano-common.dtsi |  6 ++---
 .../boot/dts/renesas/iwg20d-q7-common.dtsi    |  4 +--
 arch/arm/boot/dts/renesas/r8a73a4-ape6evm.dts |  2 +-
 .../dts/renesas/r8a7740-armadillo800eva.dts   |  2 +-
 .../boot/dts/renesas/r8a7742-iwg21d-q7.dts    |  4 +--
 .../dts/renesas/r8a7745-iwg22d-sodimm.dts     |  2 +-
 arch/arm/boot/dts/renesas/r8a7790-lager.dts   |  4 +--
 arch/arm/boot/dts/renesas/r8a7790-stout.dts   |  2 +-
 arch/arm/boot/dts/renesas/r8a7791-koelsch.dts |  6 ++---
 arch/arm/boot/dts/renesas/r8a7792-blanche.dts |  2 +-
 arch/arm/boot/dts/renesas/r8a7792-wheat.dts   |  2 +-
 arch/arm/boot/dts/renesas/r8a7793-gose.dts    |  6 ++---
 arch/arm/boot/dts/renesas/r8a7794-alt.dts     |  4 +--
 arch/arm/boot/dts/renesas/r8a7794-silk.dts    |  2 +-
 arch/arm/boot/dts/renesas/sh73a0-kzm9g.dts    |  4 +--
 .../boot/dts/rockchip/rk3066a-bqcurie2.dts    |  2 +-
 .../boot/dts/rockchip/rk3066a-marsboard.dts   |  2 +-
 arch/arm/boot/dts/rockchip/rk3066a-mk808.dts  |  8 +++---
 .../boot/dts/rockchip/rk3066a-rayeager.dts    |  8 +++---
 arch/arm/boot/dts/rockchip/rk3128-evb.dts     |  4 +--
 .../arm/boot/dts/rockchip/rk3128-xpi-3128.dts |  4 +--
 .../boot/dts/rockchip/rk3188-bqedison2qc.dts  | 10 +++----
 .../boot/dts/rockchip/rk3188-radxarock.dts    |  6 ++---
 arch/arm/boot/dts/rockchip/rk3229-evb.dts     |  2 +-
 arch/arm/boot/dts/rockchip/rk3229-xms6.dts    |  2 +-
 .../boot/dts/rockchip/rk3288-evb-act8846.dts  |  4 +--
 arch/arm/boot/dts/rockchip/rk3288-evb.dtsi    |  6 ++---
 .../dts/rockchip/rk3288-firefly-reload.dts    | 14 +++++-----
 .../arm/boot/dts/rockchip/rk3288-firefly.dtsi |  8 +++---
 arch/arm/boot/dts/rockchip/rk3288-miqi.dts    |  4 +--
 .../boot/dts/rockchip/rk3288-phycore-rdk.dts  |  6 ++---
 .../arm/boot/dts/rockchip/rk3288-popmetal.dts |  4 +--
 arch/arm/boot/dts/rockchip/rk3288-r89.dts     |  6 ++---
 .../boot/dts/rockchip/rk3288-rock2-square.dts |  6 ++---
 arch/arm/boot/dts/rockchip/rk3288-tinker.dtsi |  2 +-
 .../boot/dts/rockchip/rk3288-veyron-brain.dts |  4 +--
 .../rockchip/rk3288-veyron-chromebook.dtsi    |  4 +--
 .../boot/dts/rockchip/rk3288-veyron-edp.dtsi  |  6 ++---
 .../dts/rockchip/rk3288-veyron-fievel.dts     | 10 +++----
 .../boot/dts/rockchip/rk3288-veyron-jaq.dts   |  4 +--
 .../boot/dts/rockchip/rk3288-veyron-jerry.dts |  4 +--
 .../dts/rockchip/rk3288-veyron-mickey.dts     |  2 +-
 .../dts/rockchip/rk3288-veyron-minnie.dts     |  4 +--
 .../dts/rockchip/rk3288-veyron-speedy.dts     |  4 +--
 .../boot/dts/rockchip/rk3288-vmarc-som.dtsi   |  4 +--
 arch/arm/boot/dts/rockchip/rk3288-vyasa.dts   |  6 ++---
 .../dts/rockchip/rv1126-edgeble-neu2.dtsi     |  2 +-
 arch/arm/boot/dts/samsung/exynos3250-monk.dts |  2 +-
 .../arm/boot/dts/samsung/exynos4210-i9100.dts | 12 ++++-----
 .../boot/dts/samsung/exynos4210-origen.dts    |  2 +-
 .../arm/boot/dts/samsung/exynos4210-trats.dts | 12 ++++-----
 .../dts/samsung/exynos4210-universal_c210.dts |  6 ++---
 .../arm/boot/dts/samsung/exynos4212-tab3.dtsi |  4 +--
 .../dts/samsung/exynos4412-galaxy-s3.dtsi     | 12 ++++-----
 .../boot/dts/samsung/exynos4412-midas.dtsi    |  8 +++---
 .../arm/boot/dts/samsung/exynos4412-n710x.dts |  8 +++---
 .../boot/dts/samsung/exynos4412-odroidu3.dts  |  2 +-
 .../boot/dts/samsung/exynos4412-odroidx.dts   |  2 +-
 .../boot/dts/samsung/exynos4412-origen.dts    |  2 +-
 .../dts/samsung/exynos5250-snow-common.dtsi   |  2 +-
 .../boot/dts/samsung/exynos5420-peach-pit.dts |  4 +--
 .../boot/dts/samsung/exynos5420-smdk5420.dts  |  4 +--
 .../dts/samsung/exynos5422-samsung-k3g.dts    |  2 +-
 .../boot/dts/samsung/exynos5800-peach-pi.dts  |  4 +--
 arch/arm/boot/dts/samsung/s5pv210-aquila.dts  |  2 +-
 arch/arm/boot/dts/samsung/s5pv210-aries.dtsi  |  6 ++---
 .../boot/dts/samsung/s5pv210-fascinate4g.dts  |  4 +--
 arch/arm/boot/dts/samsung/s5pv210-galaxys.dts |  2 +-
 arch/arm/boot/dts/samsung/s5pv210-goni.dts    |  4 +--
 arch/arm/boot/dts/st/ste-snowball.dts         |  2 +-
 .../dts/st/ste-ux500-samsung-codina-tmo.dts   |  4 +--
 .../boot/dts/st/ste-ux500-samsung-codina.dts  | 10 +++----
 .../boot/dts/st/ste-ux500-samsung-gavini.dts  | 12 ++++-----
 .../boot/dts/st/ste-ux500-samsung-golden.dts  |  8 +++---
 .../boot/dts/st/ste-ux500-samsung-janice.dts  | 16 ++++++------
 .../boot/dts/st/ste-ux500-samsung-kyle.dts    |  8 +++---
 .../boot/dts/st/ste-ux500-samsung-skomer.dts  |  4 +--
 arch/arm/boot/dts/st/stm32f429-disco.dts      |  2 +-
 arch/arm/boot/dts/st/stm32f469-disco.dts      |  2 +-
 arch/arm/boot/dts/st/stm32f746-disco.dts      |  2 +-
 arch/arm/boot/dts/st/stm32mp151a-prtt1c.dts   |  4 +--
 ...157a-microgea-stm32mp1-microdev2.0-of7.dts |  4 +--
 .../boot/dts/st/stm32mp157c-lxa-tac-gen1.dts  |  2 +-
 .../boot/dts/st/stm32mp157c-lxa-tac-gen2.dts  |  2 +-
 .../boot/dts/st/stm32mp15xx-dhcom-som.dtsi    |  2 +-
 .../dts/st/stm32mp15xx-dhcor-avenger96.dtsi   |  2 +-
 .../dts/st/stm32mp15xx-dhcor-drc-compact.dtsi |  2 +-
 .../dts/synaptics/berlin2q-marvell-dmp.dts    |  8 +++---
 arch/arm/boot/dts/ti/davinci/da850-evm.dts    |  2 +-
 .../boot/dts/ti/davinci/da850-lego-ev3.dts    |  4 +--
 .../boot/dts/ti/keystone/keystone-k2g-ice.dts |  2 +-
 arch/arm/boot/dts/ti/omap/am335x-baltos.dtsi  |  2 +-
 .../dts/ti/omap/am335x-boneblack-wireless.dts |  2 +-
 arch/arm/boot/dts/ti/omap/am335x-boneblue.dts |  2 +-
 .../dts/ti/omap/am335x-bonegreen-wireless.dts |  2 +-
 arch/arm/boot/dts/ti/omap/am335x-cm-t335.dts  |  2 +-
 arch/arm/boot/dts/ti/omap/am335x-evm.dts      |  2 +-
 arch/arm/boot/dts/ti/omap/am335x-evmsk.dts    |  4 +--
 arch/arm/boot/dts/ti/omap/am335x-icev2.dts    |  2 +-
 arch/arm/boot/dts/ti/omap/am3517-som.dtsi     |  4 +--
 arch/arm/boot/dts/ti/omap/am437x-gp-evm.dts   |  4 +--
 arch/arm/boot/dts/ti/omap/am437x-sk-evm.dts   |  2 +-
 .../dts/ti/omap/am57xx-beagle-x15-common.dtsi |  2 +-
 arch/arm/boot/dts/ti/omap/dm8148-t410.dts     |  2 +-
 arch/arm/boot/dts/ti/omap/dra7-evm.dts        |  6 ++---
 .../boot/dts/ti/omap/dra72-evm-common.dtsi    |  4 +--
 arch/arm/boot/dts/ti/omap/dra76-evm.dts       |  4 +--
 arch/arm/boot/dts/ti/omap/logicpd-som-lv.dtsi |  2 +-
 .../ti/omap/logicpd-torpedo-37xx-devkit.dts   |  2 +-
 .../dts/ti/omap/motorola-mapphone-common.dtsi |  4 +--
 .../dts/ti/omap/motorola-mapphone-xt8xx.dtsi  |  2 +-
 arch/arm/boot/dts/ti/omap/omap3-beagle-xm.dts |  2 +-
 arch/arm/boot/dts/ti/omap/omap3-beagle.dts    |  2 +-
 arch/arm/boot/dts/ti/omap/omap3-cm-t3517.dts  |  2 +-
 arch/arm/boot/dts/ti/omap/omap3-cm-t3530.dts  |  2 +-
 arch/arm/boot/dts/ti/omap/omap3-cm-t3730.dts  |  2 +-
 .../boot/dts/ti/omap/omap3-evm-common.dtsi    |  6 ++---
 arch/arm/boot/dts/ti/omap/omap3-gta04a5.dts   |  2 +-
 .../dts/ti/omap/omap3-igep0020-common.dtsi    |  2 +-
 .../boot/dts/ti/omap/omap3-igep0020-rev-f.dts |  2 +-
 .../boot/dts/ti/omap/omap3-igep0030-rev-g.dts |  2 +-
 arch/arm/boot/dts/ti/omap/omap3-n950-n9.dtsi  |  4 +--
 .../boot/dts/ti/omap/omap3-overo-base.dtsi    |  6 ++---
 .../dts/ti/omap/omap3-pandora-common.dtsi     |  6 ++---
 arch/arm/boot/dts/ti/omap/omap3-sb-t35.dtsi   |  2 +-
 arch/arm/boot/dts/ti/omap/omap3-tao3530.dtsi  |  4 +--
 arch/arm/boot/dts/ti/omap/omap3-zoom3.dts     |  2 +-
 arch/arm/boot/dts/ti/omap/omap4-duovero.dtsi  |  2 +-
 .../boot/dts/ti/omap/omap4-epson-embt2ws.dts  |  2 +-
 .../boot/dts/ti/omap/omap4-panda-common.dtsi  |  4 +--
 arch/arm/boot/dts/ti/omap/omap4-sdp.dts       |  4 +--
 .../dts/ti/omap/omap4-var-som-om44-wlan.dtsi  |  2 +-
 .../boot/dts/ti/omap/omap5-board-common.dtsi  |  2 +-
 arch/arm/boot/dts/ti/omap/omap5-cm-t54.dts    |  4 +--
 519 files changed, 1101 insertions(+), 1101 deletions(-)

diff --git a/arch/arm/boot/dts/allwinner/sun4i-a10-a1000.dts b/arch/arm/boot/dts/allwinner/sun4i-a10-a1000.dts
index 20f9ed244851..97281e4c64ae 100644
--- a/arch/arm/boot/dts/allwinner/sun4i-a10-a1000.dts
+++ b/arch/arm/boot/dts/allwinner/sun4i-a10-a1000.dts
@@ -93,7 +93,7 @@ reg_emac_3v3: emac-3v3 {
 		regulator-max-microvolt = <3300000>;
 		startup-delay-us = <20000>;
 		enable-active-high;
-		gpio = <&pio 7 15 GPIO_ACTIVE_HIGH>;
+		gpios = <&pio 7 15 GPIO_ACTIVE_HIGH>;
 	};
 
 	sound {
diff --git a/arch/arm/boot/dts/allwinner/sun4i-a10-ba10-tvbox.dts b/arch/arm/boot/dts/allwinner/sun4i-a10-ba10-tvbox.dts
index 816d534ac093..f6781253735a 100644
--- a/arch/arm/boot/dts/allwinner/sun4i-a10-ba10-tvbox.dts
+++ b/arch/arm/boot/dts/allwinner/sun4i-a10-ba10-tvbox.dts
@@ -128,7 +128,7 @@ &reg_usb1_vbus {
 };
 
 &reg_usb2_vbus {
-	gpio = <&pio 7 12 GPIO_ACTIVE_HIGH>;
+	gpios = <&pio 7 12 GPIO_ACTIVE_HIGH>;
 	status = "okay";
 };
 
diff --git a/arch/arm/boot/dts/allwinner/sun4i-a10-dserve-dsrv9703c.dts b/arch/arm/boot/dts/allwinner/sun4i-a10-dserve-dsrv9703c.dts
index 63e77c05bfda..fa27484d48ee 100644
--- a/arch/arm/boot/dts/allwinner/sun4i-a10-dserve-dsrv9703c.dts
+++ b/arch/arm/boot/dts/allwinner/sun4i-a10-dserve-dsrv9703c.dts
@@ -82,7 +82,7 @@ reg_motor: reg-motor {
 		regulator-min-microvolt = <3000000>;
 		regulator-max-microvolt = <3000000>;
 		enable-active-high;
-		gpio = <&pio 1 3 GPIO_ACTIVE_HIGH>; /* PB3 */
+		gpios = <&pio 1 3 GPIO_ACTIVE_HIGH>; /* PB3 */
 	};
 };
 
diff --git a/arch/arm/boot/dts/allwinner/sun4i-a10-hackberry.dts b/arch/arm/boot/dts/allwinner/sun4i-a10-hackberry.dts
index 47dea0922501..8ed62cc821e9 100644
--- a/arch/arm/boot/dts/allwinner/sun4i-a10-hackberry.dts
+++ b/arch/arm/boot/dts/allwinner/sun4i-a10-hackberry.dts
@@ -67,7 +67,7 @@ reg_emac_3v3: emac-3v3 {
 		regulator-max-microvolt = <3300000>;
 		startup-delay-us = <20000>;
 		enable-active-high;
-		gpio = <&pio 7 19 GPIO_ACTIVE_HIGH>;
+		gpios = <&pio 7 19 GPIO_ACTIVE_HIGH>;
 	};
 };
 
@@ -123,7 +123,7 @@ &reg_usb1_vbus {
 };
 
 &reg_usb2_vbus {
-	gpio = <&pio 7 12 GPIO_ACTIVE_HIGH>;
+	gpios = <&pio 7 12 GPIO_ACTIVE_HIGH>;
 	status = "okay";
 };
 
diff --git a/arch/arm/boot/dts/allwinner/sun4i-a10-hyundai-a7hd.dts b/arch/arm/boot/dts/allwinner/sun4i-a10-hyundai-a7hd.dts
index bf2044bac42f..1f654c3cf248 100644
--- a/arch/arm/boot/dts/allwinner/sun4i-a10-hyundai-a7hd.dts
+++ b/arch/arm/boot/dts/allwinner/sun4i-a10-hyundai-a7hd.dts
@@ -91,7 +91,7 @@ &reg_usb0_vbus {
 };
 
 &reg_usb2_vbus {
-	gpio = <&pio 7 6 GPIO_ACTIVE_HIGH>; /* PH6 */
+	gpios = <&pio 7 6 GPIO_ACTIVE_HIGH>; /* PH6 */
 	status = "okay";
 };
 
diff --git a/arch/arm/boot/dts/allwinner/sun4i-a10-jesurun-q5.dts b/arch/arm/boot/dts/allwinner/sun4i-a10-jesurun-q5.dts
index 1aeb0bd5519e..3242701bc863 100644
--- a/arch/arm/boot/dts/allwinner/sun4i-a10-jesurun-q5.dts
+++ b/arch/arm/boot/dts/allwinner/sun4i-a10-jesurun-q5.dts
@@ -77,7 +77,7 @@ reg_emac_3v3: emac-3v3 {
 		regulator-max-microvolt = <3300000>;
 		startup-delay-us = <20000>;
 		enable-active-high;
-		gpio = <&pio 7 19 GPIO_ACTIVE_HIGH>;   /* PH19 */
+		gpios = <&pio 7 19 GPIO_ACTIVE_HIGH>;   /* PH19 */
 	};
 };
 
diff --git a/arch/arm/boot/dts/allwinner/sun4i-a10-mk802.dts b/arch/arm/boot/dts/allwinner/sun4i-a10-mk802.dts
index 059fe9c5d024..7686a30359fb 100644
--- a/arch/arm/boot/dts/allwinner/sun4i-a10-mk802.dts
+++ b/arch/arm/boot/dts/allwinner/sun4i-a10-mk802.dts
@@ -119,7 +119,7 @@ &reg_usb1_vbus {
 };
 
 &reg_usb2_vbus {
-	gpio = <&pio 7 12 GPIO_ACTIVE_HIGH>; /* PH12 */
+	gpios = <&pio 7 12 GPIO_ACTIVE_HIGH>; /* PH12 */
 	status = "okay";
 };
 
diff --git a/arch/arm/boot/dts/allwinner/sun4i-a10-olinuxino-lime.dts b/arch/arm/boot/dts/allwinner/sun4i-a10-olinuxino-lime.dts
index 83d283cf6633..dfbe0e280c70 100644
--- a/arch/arm/boot/dts/allwinner/sun4i-a10-olinuxino-lime.dts
+++ b/arch/arm/boot/dts/allwinner/sun4i-a10-olinuxino-lime.dts
@@ -188,7 +188,7 @@ led_pins_olinuxinolime: led-pin {
 };
 
 &reg_ahci_5v {
-	gpio = <&pio 2 3 GPIO_ACTIVE_HIGH>;
+	gpios = <&pio 2 3 GPIO_ACTIVE_HIGH>;
 	status = "okay";
 };
 
diff --git a/arch/arm/boot/dts/allwinner/sun4i-a10-pcduino2.dts b/arch/arm/boot/dts/allwinner/sun4i-a10-pcduino2.dts
index bc4f128965ed..2d6c346afdcb 100644
--- a/arch/arm/boot/dts/allwinner/sun4i-a10-pcduino2.dts
+++ b/arch/arm/boot/dts/allwinner/sun4i-a10-pcduino2.dts
@@ -56,7 +56,7 @@ / {
 };
 
 &reg_usb2_vbus {
-	gpio = <&pio 3 2 GPIO_ACTIVE_HIGH>;
+	gpios = <&pio 3 2 GPIO_ACTIVE_HIGH>;
 	status = "okay";
 };
 
diff --git a/arch/arm/boot/dts/allwinner/sun4i-a10-topwise-a721.dts b/arch/arm/boot/dts/allwinner/sun4i-a10-topwise-a721.dts
index 3628f12d2521..f06f6f2f384d 100644
--- a/arch/arm/boot/dts/allwinner/sun4i-a10-topwise-a721.dts
+++ b/arch/arm/boot/dts/allwinner/sun4i-a10-topwise-a721.dts
@@ -48,7 +48,7 @@ panel_input: endpoint {
 	reg_lcd_power: reg-lcd-power {
 		compatible = "regulator-fixed";
 		regulator-name = "reg-lcd-power";
-		gpio = <&pio 7 8 GPIO_ACTIVE_HIGH>; /* PH8 */
+		gpios = <&pio 7 8 GPIO_ACTIVE_HIGH>; /* PH8 */
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/allwinner/sun5i-a10s-auxtek-t003.dts b/arch/arm/boot/dts/allwinner/sun5i-a10s-auxtek-t003.dts
index 04b0e6d28769..8694ea4583d5 100644
--- a/arch/arm/boot/dts/allwinner/sun5i-a10s-auxtek-t003.dts
+++ b/arch/arm/boot/dts/allwinner/sun5i-a10s-auxtek-t003.dts
@@ -110,12 +110,12 @@ led_pins_t003: led-pin {
 };
 
 &reg_usb0_vbus {
-	gpio = <&pio 6 13 GPIO_ACTIVE_HIGH>; /* PG13 */
+	gpios = <&pio 6 13 GPIO_ACTIVE_HIGH>; /* PG13 */
 	status = "okay";
 };
 
 &reg_usb1_vbus {
-	gpio = <&pio 1 10 GPIO_ACTIVE_HIGH>; /* PB10 */
+	gpios = <&pio 1 10 GPIO_ACTIVE_HIGH>; /* PB10 */
 	status = "okay";
 };
 
diff --git a/arch/arm/boot/dts/allwinner/sun5i-a10s-auxtek-t004.dts b/arch/arm/boot/dts/allwinner/sun5i-a10s-auxtek-t004.dts
index 667bc2dc1ea9..ebfbffa0f51a 100644
--- a/arch/arm/boot/dts/allwinner/sun5i-a10s-auxtek-t004.dts
+++ b/arch/arm/boot/dts/allwinner/sun5i-a10s-auxtek-t004.dts
@@ -75,7 +75,7 @@ reg_vmmc1: vmmc1 {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 		enable-active-high;
-		gpio = <&pio 1 18 GPIO_ACTIVE_HIGH>; /* PB18 */
+		gpios = <&pio 1 18 GPIO_ACTIVE_HIGH>; /* PB18 */
 	};
 };
 
@@ -127,7 +127,7 @@ led_pins_t004: led-pin {
 };
 
 &reg_usb1_vbus {
-	gpio = <&pio 6 13 GPIO_ACTIVE_HIGH>; /* PG13 */
+	gpios = <&pio 6 13 GPIO_ACTIVE_HIGH>; /* PG13 */
 	status = "okay";
 };
 
diff --git a/arch/arm/boot/dts/allwinner/sun5i-a10s-mk802.dts b/arch/arm/boot/dts/allwinner/sun5i-a10s-mk802.dts
index d0219404c231..ebbb96f80717 100644
--- a/arch/arm/boot/dts/allwinner/sun5i-a10s-mk802.dts
+++ b/arch/arm/boot/dts/allwinner/sun5i-a10s-mk802.dts
@@ -106,7 +106,7 @@ &otg_sram {
 };
 
 &reg_usb1_vbus {
-	gpio = <&pio 1 10 GPIO_ACTIVE_HIGH>; /* PB10 */
+	gpios = <&pio 1 10 GPIO_ACTIVE_HIGH>; /* PB10 */
 	status = "okay";
 };
 
diff --git a/arch/arm/boot/dts/allwinner/sun5i-a10s-olinuxino-micro.dts b/arch/arm/boot/dts/allwinner/sun5i-a10s-olinuxino-micro.dts
index 5832bb31fc51..6ac858d1c63e 100644
--- a/arch/arm/boot/dts/allwinner/sun5i-a10s-olinuxino-micro.dts
+++ b/arch/arm/boot/dts/allwinner/sun5i-a10s-olinuxino-micro.dts
@@ -221,12 +221,12 @@ led_pins_olinuxino: led-pin {
 };
 
 &reg_usb0_vbus {
-	gpio = <&pio 6 11 GPIO_ACTIVE_HIGH>; /* PG11 */
+	gpios = <&pio 6 11 GPIO_ACTIVE_HIGH>; /* PG11 */
 	status = "okay";
 };
 
 &reg_usb1_vbus {
-	gpio = <&pio 1 10 GPIO_ACTIVE_HIGH>;
+	gpios = <&pio 1 10 GPIO_ACTIVE_HIGH>;
 	status = "okay";
 };
 
diff --git a/arch/arm/boot/dts/allwinner/sun5i-a10s-r7-tv-dongle.dts b/arch/arm/boot/dts/allwinner/sun5i-a10s-r7-tv-dongle.dts
index 964360f0610a..398e12f84f1c 100644
--- a/arch/arm/boot/dts/allwinner/sun5i-a10s-r7-tv-dongle.dts
+++ b/arch/arm/boot/dts/allwinner/sun5i-a10s-r7-tv-dongle.dts
@@ -102,7 +102,7 @@ led_pins_r7: led-pin {
 };
 
 &reg_usb1_vbus {
-	gpio = <&pio 6 13 GPIO_ACTIVE_HIGH>;
+	gpios = <&pio 6 13 GPIO_ACTIVE_HIGH>;
 	status = "okay";
 };
 
diff --git a/arch/arm/boot/dts/allwinner/sun5i-a10s-wobo-i5.dts b/arch/arm/boot/dts/allwinner/sun5i-a10s-wobo-i5.dts
index ef8baa992687..ef96fec00030 100644
--- a/arch/arm/boot/dts/allwinner/sun5i-a10s-wobo-i5.dts
+++ b/arch/arm/boot/dts/allwinner/sun5i-a10s-wobo-i5.dts
@@ -76,7 +76,7 @@ reg_emac_3v3: emac-3v3 {
 		regulator-max-microvolt = <3300000>;
 		startup-delay-us = <20000>;
 		enable-active-high;
-		gpio = <&pio 0 2 GPIO_ACTIVE_HIGH>;
+		gpios = <&pio 0 2 GPIO_ACTIVE_HIGH>;
 	};
 };
 
@@ -174,7 +174,7 @@ &reg_ldo4 {
 };
 
 &reg_usb1_vbus {
-	gpio = <&pio 6 12 GPIO_ACTIVE_HIGH>;
+	gpios = <&pio 6 12 GPIO_ACTIVE_HIGH>;
 	status = "okay";
 };
 
diff --git a/arch/arm/boot/dts/allwinner/sun5i-a13-empire-electronix-d709.dts b/arch/arm/boot/dts/allwinner/sun5i-a13-empire-electronix-d709.dts
index d059388d7252..25ff0a6ff2d2 100644
--- a/arch/arm/boot/dts/allwinner/sun5i-a13-empire-electronix-d709.dts
+++ b/arch/arm/boot/dts/allwinner/sun5i-a13-empire-electronix-d709.dts
@@ -166,7 +166,7 @@ &reg_ldo3 {
 };
 
 &reg_usb0_vbus {
-	gpio = <&pio 6 12 GPIO_ACTIVE_HIGH>; /* PG12 */
+	gpios = <&pio 6 12 GPIO_ACTIVE_HIGH>; /* PG12 */
 	status = "okay";
 };
 
diff --git a/arch/arm/boot/dts/allwinner/sun5i-a13-hsg-h702.dts b/arch/arm/boot/dts/allwinner/sun5i-a13-hsg-h702.dts
index 9b9f2a574851..9a451c76bb01 100644
--- a/arch/arm/boot/dts/allwinner/sun5i-a13-hsg-h702.dts
+++ b/arch/arm/boot/dts/allwinner/sun5i-a13-hsg-h702.dts
@@ -158,7 +158,7 @@ &reg_ldo3 {
 };
 
 &reg_usb0_vbus {
-	gpio = <&pio 6 12 GPIO_ACTIVE_HIGH>; /* PG12 */
+	gpios = <&pio 6 12 GPIO_ACTIVE_HIGH>; /* PG12 */
 	status = "okay";
 };
 
diff --git a/arch/arm/boot/dts/allwinner/sun5i-a13-licheepi-one.dts b/arch/arm/boot/dts/allwinner/sun5i-a13-licheepi-one.dts
index 3a6c4bd0a44f..29065687b15e 100644
--- a/arch/arm/boot/dts/allwinner/sun5i-a13-licheepi-one.dts
+++ b/arch/arm/boot/dts/allwinner/sun5i-a13-licheepi-one.dts
@@ -190,7 +190,7 @@ &reg_ldo4 {
 };
 
 &reg_usb0_vbus {
-	gpio = <&pio 2 12 GPIO_ACTIVE_HIGH>; /* PC12 */
+	gpios = <&pio 2 12 GPIO_ACTIVE_HIGH>; /* PC12 */
 	status = "okay";
 };
 
diff --git a/arch/arm/boot/dts/allwinner/sun5i-a13-olinuxino-micro.dts b/arch/arm/boot/dts/allwinner/sun5i-a13-olinuxino-micro.dts
index bfe1075e62cc..8b888e984b0b 100644
--- a/arch/arm/boot/dts/allwinner/sun5i-a13-olinuxino-micro.dts
+++ b/arch/arm/boot/dts/allwinner/sun5i-a13-olinuxino-micro.dts
@@ -112,12 +112,12 @@ led_pins_olinuxinom: led-pin {
 };
 
 &reg_usb0_vbus {
-	gpio = <&pio 6 12 GPIO_ACTIVE_HIGH>;
+	gpios = <&pio 6 12 GPIO_ACTIVE_HIGH>;
 	status = "okay";
 };
 
 &reg_usb1_vbus {
-	gpio = <&pio 6 11 GPIO_ACTIVE_HIGH>;
+	gpios = <&pio 6 11 GPIO_ACTIVE_HIGH>;
 	status = "okay";
 };
 
diff --git a/arch/arm/boot/dts/allwinner/sun5i-a13-olinuxino.dts b/arch/arm/boot/dts/allwinner/sun5i-a13-olinuxino.dts
index fadeae3cd8bb..c324a3910b3b 100644
--- a/arch/arm/boot/dts/allwinner/sun5i-a13-olinuxino.dts
+++ b/arch/arm/boot/dts/allwinner/sun5i-a13-olinuxino.dts
@@ -206,11 +206,11 @@ led_pins_olinuxino: led-pin {
 
 &reg_usb0_vbus {
 	status = "okay";
-	gpio = <&pio 6 12 GPIO_ACTIVE_HIGH>; /* PG12 */
+	gpios = <&pio 6 12 GPIO_ACTIVE_HIGH>; /* PG12 */
 };
 
 &reg_usb1_vbus {
-	gpio = <&pio 6 11 GPIO_ACTIVE_HIGH>;
+	gpios = <&pio 6 11 GPIO_ACTIVE_HIGH>;
 	status = "okay";
 };
 
diff --git a/arch/arm/boot/dts/allwinner/sun5i-a13-pocketbook-614-plus.dts b/arch/arm/boot/dts/allwinner/sun5i-a13-pocketbook-614-plus.dts
index ab8d138dc11d..7473f34b4b54 100644
--- a/arch/arm/boot/dts/allwinner/sun5i-a13-pocketbook-614-plus.dts
+++ b/arch/arm/boot/dts/allwinner/sun5i-a13-pocketbook-614-plus.dts
@@ -56,7 +56,7 @@ reg_3v3_mmc0: regulator-mmc0 {
 		regulator-name = "vdd-mmc0";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&pio 4 4 GPIO_ACTIVE_LOW>; /* PE4 */
+		gpios = <&pio 4 4 GPIO_ACTIVE_LOW>; /* PE4 */
 		vin-supply = <&reg_vcc3v3>;
 	};
 };
@@ -182,11 +182,11 @@ &reg_ldo2 {
 
 &reg_usb0_vbus {
 	status = "okay";
-	gpio = <&pio 6 12 GPIO_ACTIVE_HIGH>; /* PG12 */
+	gpios = <&pio 6 12 GPIO_ACTIVE_HIGH>; /* PG12 */
 };
 
 &reg_usb1_vbus {
-	gpio = <&pio 6 11 GPIO_ACTIVE_HIGH>; /* PG11 */
+	gpios = <&pio 6 11 GPIO_ACTIVE_HIGH>; /* PG11 */
 	status = "okay";
 };
 
diff --git a/arch/arm/boot/dts/allwinner/sun5i-a13-pocketbook-touch-lux-3.dts b/arch/arm/boot/dts/allwinner/sun5i-a13-pocketbook-touch-lux-3.dts
index d60407772e5d..68a37d24d6c6 100644
--- a/arch/arm/boot/dts/allwinner/sun5i-a13-pocketbook-touch-lux-3.dts
+++ b/arch/arm/boot/dts/allwinner/sun5i-a13-pocketbook-touch-lux-3.dts
@@ -67,7 +67,7 @@ reg_1v8: regulator-1v8 {
 		regulator-name = "vdd-1v8-nor-ctp";
 		regulator-min-microvolt = <1800000>;
 		regulator-max-microvolt = <1800000>;
-		gpio = <&pio 2 15 GPIO_ACTIVE_HIGH>;
+		gpios = <&pio 2 15 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -76,7 +76,7 @@ reg_1v8_nor: regulator-nor {
 		regulator-name = "vdd-nor";
 		regulator-min-microvolt = <1800000>;
 		regulator-max-microvolt = <1800000>;
-		gpio = <&pio 2 14 GPIO_ACTIVE_HIGH>;
+		gpios = <&pio 2 14 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&reg_1v8>;
 		regulator-always-on;
@@ -87,7 +87,7 @@ reg_1v8_ctp: regulator-ctp {
 		regulator-name = "vdd-ctp";
 		regulator-min-microvolt = <1800000>;
 		regulator-max-microvolt = <1800000>;
-		gpio = <&pio 2 13 GPIO_ACTIVE_HIGH>;
+		gpios = <&pio 2 13 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&reg_1v8>;
 	};
@@ -97,7 +97,7 @@ reg_3v3_mmc0: regulator-mmc0 {
 		regulator-name = "vdd-mmc0";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&pio 4 4 GPIO_ACTIVE_LOW>; /* PE4 */
+		gpios = <&pio 4 4 GPIO_ACTIVE_LOW>; /* PE4 */
 		vin-supply = <&reg_vcc3v3>;
 	};
 };
diff --git a/arch/arm/boot/dts/allwinner/sun5i-a13-utoo-p66.dts b/arch/arm/boot/dts/allwinner/sun5i-a13-utoo-p66.dts
index be486d28d04f..c782f6fb2af4 100644
--- a/arch/arm/boot/dts/allwinner/sun5i-a13-utoo-p66.dts
+++ b/arch/arm/boot/dts/allwinner/sun5i-a13-utoo-p66.dts
@@ -93,7 +93,7 @@ mmccard: mmccard at 0 {
 };
 
 &reg_usb0_vbus {
-	gpio = <&pio 1 4 GPIO_ACTIVE_HIGH>; /* PB4 */
+	gpios = <&pio 1 4 GPIO_ACTIVE_HIGH>; /* PB4 */
 };
 
 &touchscreen {
diff --git a/arch/arm/boot/dts/allwinner/sun5i-gr8-evb.dts b/arch/arm/boot/dts/allwinner/sun5i-gr8-evb.dts
index f4fe258ef06d..0156f2364c0d 100644
--- a/arch/arm/boot/dts/allwinner/sun5i-gr8-evb.dts
+++ b/arch/arm/boot/dts/allwinner/sun5i-gr8-evb.dts
@@ -280,7 +280,7 @@ &reg_ldo2 {
 };
 
 &reg_usb1_vbus {
-	gpio = <&pio 6 13 GPIO_ACTIVE_HIGH>;
+	gpios = <&pio 6 13 GPIO_ACTIVE_HIGH>;
 	status = "okay";
 };
 
diff --git a/arch/arm/boot/dts/allwinner/sun5i-r8-chip.dts b/arch/arm/boot/dts/allwinner/sun5i-r8-chip.dts
index 8c784a2c086e..88c5550e0839 100644
--- a/arch/arm/boot/dts/allwinner/sun5i-r8-chip.dts
+++ b/arch/arm/boot/dts/allwinner/sun5i-r8-chip.dts
@@ -226,7 +226,7 @@ &reg_ldo5 {
 
 &reg_usb0_vbus {
 	vin-supply = <&reg_vcc5v0>;
-	gpio = <&pio 1 10 GPIO_ACTIVE_HIGH>; /* PB10 */
+	gpios = <&pio 1 10 GPIO_ACTIVE_HIGH>; /* PB10 */
 	status = "okay";
 };
 
diff --git a/arch/arm/boot/dts/allwinner/sun5i-reference-design-tablet.dtsi b/arch/arm/boot/dts/allwinner/sun5i-reference-design-tablet.dtsi
index 6847f66699ac..cc6bea6e1969 100644
--- a/arch/arm/boot/dts/allwinner/sun5i-reference-design-tablet.dtsi
+++ b/arch/arm/boot/dts/allwinner/sun5i-reference-design-tablet.dtsi
@@ -165,7 +165,7 @@ &reg_ldo3 {
 };
 
 &reg_usb0_vbus {
-	gpio = <&pio 6 12 GPIO_ACTIVE_HIGH>; /* PG12 */
+	gpios = <&pio 6 12 GPIO_ACTIVE_HIGH>; /* PG12 */
 	status = "okay";
 };
 
diff --git a/arch/arm/boot/dts/allwinner/sun6i-a31-app4-evb1.dts b/arch/arm/boot/dts/allwinner/sun6i-a31-app4-evb1.dts
index 32d22025ac99..cfbc4f2de35c 100644
--- a/arch/arm/boot/dts/allwinner/sun6i-a31-app4-evb1.dts
+++ b/arch/arm/boot/dts/allwinner/sun6i-a31-app4-evb1.dts
@@ -66,7 +66,7 @@ &ehci0 {
 };
 
 &reg_usb1_vbus {
-	gpio = <&pio 7 27 GPIO_ACTIVE_HIGH>;
+	gpios = <&pio 7 27 GPIO_ACTIVE_HIGH>;
 	status = "okay";
 };
 
diff --git a/arch/arm/boot/dts/allwinner/sun6i-a31-colombus.dts b/arch/arm/boot/dts/allwinner/sun6i-a31-colombus.dts
index 93a15eaaa8cb..7fde64986bc4 100644
--- a/arch/arm/boot/dts/allwinner/sun6i-a31-colombus.dts
+++ b/arch/arm/boot/dts/allwinner/sun6i-a31-colombus.dts
@@ -114,7 +114,7 @@ &mmc0 {
 };
 
 &reg_usb2_vbus {
-	gpio = <&pio 7 24 GPIO_ACTIVE_HIGH>;
+	gpios = <&pio 7 24 GPIO_ACTIVE_HIGH>;
 	status = "okay";
 };
 
diff --git a/arch/arm/boot/dts/allwinner/sun6i-a31-hummingbird.dts b/arch/arm/boot/dts/allwinner/sun6i-a31-hummingbird.dts
index 5bce7a32651e..98056ab99016 100644
--- a/arch/arm/boot/dts/allwinner/sun6i-a31-hummingbird.dts
+++ b/arch/arm/boot/dts/allwinner/sun6i-a31-hummingbird.dts
@@ -116,7 +116,7 @@ reg_vga_3v3: vga-3v3-regulator {
 		regulator-max-microvolt = <3300000>;
 		regulator-boot-on;
 		enable-active-high;
-		gpio = <&pio 7 25 GPIO_ACTIVE_HIGH>; /* PH25 */
+		gpios = <&pio 7 25 GPIO_ACTIVE_HIGH>; /* PH25 */
 	};
 
 	wifi_pwrseq: pwrseq {
@@ -297,7 +297,7 @@ &reg_drivevbus {
 };
 
 &reg_usb1_vbus {
-	gpio = <&pio 7 24 GPIO_ACTIVE_HIGH>; /* PH24 */
+	gpios = <&pio 7 24 GPIO_ACTIVE_HIGH>; /* PH24 */
 	status = "okay";
 };
 
diff --git a/arch/arm/boot/dts/allwinner/sun6i-a31-i7.dts b/arch/arm/boot/dts/allwinner/sun6i-a31-i7.dts
index 744723d956f0..879ad6593a67 100644
--- a/arch/arm/boot/dts/allwinner/sun6i-a31-i7.dts
+++ b/arch/arm/boot/dts/allwinner/sun6i-a31-i7.dts
@@ -152,7 +152,7 @@ &mmc0 {
 };
 
 &reg_usb1_vbus {
-	gpio = <&pio 2 27 GPIO_ACTIVE_HIGH>;
+	gpios = <&pio 2 27 GPIO_ACTIVE_HIGH>;
 	status = "okay";
 };
 
diff --git a/arch/arm/boot/dts/allwinner/sun6i-a31-m9.dts b/arch/arm/boot/dts/allwinner/sun6i-a31-m9.dts
index 7d2eaaf5c33e..bf28d000818f 100644
--- a/arch/arm/boot/dts/allwinner/sun6i-a31-m9.dts
+++ b/arch/arm/boot/dts/allwinner/sun6i-a31-m9.dts
@@ -195,7 +195,7 @@ &reg_dldo4 {
 };
 
 &reg_usb1_vbus {
-	gpio = <&pio 2 27 GPIO_ACTIVE_HIGH>;
+	gpios = <&pio 2 27 GPIO_ACTIVE_HIGH>;
 	status = "okay";
 };
 
diff --git a/arch/arm/boot/dts/allwinner/sun6i-a31-mele-a1000g-quad.dts b/arch/arm/boot/dts/allwinner/sun6i-a31-mele-a1000g-quad.dts
index 83611434270c..9d5f05bc1872 100644
--- a/arch/arm/boot/dts/allwinner/sun6i-a31-mele-a1000g-quad.dts
+++ b/arch/arm/boot/dts/allwinner/sun6i-a31-mele-a1000g-quad.dts
@@ -195,7 +195,7 @@ &reg_dldo4 {
 };
 
 &reg_usb1_vbus {
-	gpio = <&pio 2 27 GPIO_ACTIVE_HIGH>;
+	gpios = <&pio 2 27 GPIO_ACTIVE_HIGH>;
 	status = "okay";
 };
 
diff --git a/arch/arm/boot/dts/allwinner/sun7i-a20-bananapi-m1-plus.dts b/arch/arm/boot/dts/allwinner/sun7i-a20-bananapi-m1-plus.dts
index f2d7fab9978d..e6d68fb43a43 100644
--- a/arch/arm/boot/dts/allwinner/sun7i-a20-bananapi-m1-plus.dts
+++ b/arch/arm/boot/dts/allwinner/sun7i-a20-bananapi-m1-plus.dts
@@ -98,7 +98,7 @@ reg_gmac_3v3: gmac-3v3 {
 		regulator-max-microvolt = <3300000>;
 		startup-delay-us = <100000>;
 		enable-active-high;
-		gpio = <&pio 7 23 GPIO_ACTIVE_HIGH>;
+		gpios = <&pio 7 23 GPIO_ACTIVE_HIGH>;
 	};
 };
 
diff --git a/arch/arm/boot/dts/allwinner/sun7i-a20-bananapi.dts b/arch/arm/boot/dts/allwinner/sun7i-a20-bananapi.dts
index 46ecf9db2324..82c04783e807 100644
--- a/arch/arm/boot/dts/allwinner/sun7i-a20-bananapi.dts
+++ b/arch/arm/boot/dts/allwinner/sun7i-a20-bananapi.dts
@@ -90,7 +90,7 @@ reg_gmac_3v3: gmac-3v3 {
 		regulator-max-microvolt = <3300000>;
 		startup-delay-us = <100000>;
 		enable-active-high;
-		gpio = <&pio 7 23 GPIO_ACTIVE_HIGH>;
+		gpios = <&pio 7 23 GPIO_ACTIVE_HIGH>;
 	};
 };
 
diff --git a/arch/arm/boot/dts/allwinner/sun7i-a20-bananapro.dts b/arch/arm/boot/dts/allwinner/sun7i-a20-bananapro.dts
index e22f0e8bb17a..eee883c21633 100644
--- a/arch/arm/boot/dts/allwinner/sun7i-a20-bananapro.dts
+++ b/arch/arm/boot/dts/allwinner/sun7i-a20-bananapro.dts
@@ -86,7 +86,7 @@ reg_gmac_3v3: gmac-3v3 {
 		regulator-max-microvolt = <3300000>;
 		startup-delay-us = <100000>;
 		enable-active-high;
-		gpio = <&pio 7 23 GPIO_ACTIVE_HIGH>;
+		gpios = <&pio 7 23 GPIO_ACTIVE_HIGH>;
 	};
 };
 
@@ -177,12 +177,12 @@ &ohci1 {
 };
 
 &reg_usb1_vbus {
-	gpio = <&pio 7 0 GPIO_ACTIVE_HIGH>; /* PH0 */
+	gpios = <&pio 7 0 GPIO_ACTIVE_HIGH>; /* PH0 */
 	status = "okay";
 };
 
 &reg_usb2_vbus {
-	gpio = <&pio 7 1 GPIO_ACTIVE_HIGH>; /* PH1 */
+	gpios = <&pio 7 1 GPIO_ACTIVE_HIGH>; /* PH1 */
 	status = "okay";
 };
 
diff --git a/arch/arm/boot/dts/allwinner/sun7i-a20-cubietruck.dts b/arch/arm/boot/dts/allwinner/sun7i-a20-cubietruck.dts
index be9b31d0f4b5..386122f6e053 100644
--- a/arch/arm/boot/dts/allwinner/sun7i-a20-cubietruck.dts
+++ b/arch/arm/boot/dts/allwinner/sun7i-a20-cubietruck.dts
@@ -244,7 +244,7 @@ &pwm {
 };
 
 &reg_ahci_5v {
-	gpio = <&pio 7 12 GPIO_ACTIVE_HIGH>;
+	gpios = <&pio 7 12 GPIO_ACTIVE_HIGH>;
 	status = "okay";
 };
 
@@ -284,7 +284,7 @@ &reg_ldo2 {
 };
 
 &reg_usb0_vbus {
-	gpio = <&pio 7 17 GPIO_ACTIVE_HIGH>;
+	gpios = <&pio 7 17 GPIO_ACTIVE_HIGH>;
 	status = "okay";
 };
 
diff --git a/arch/arm/boot/dts/allwinner/sun7i-a20-hummingbird.dts b/arch/arm/boot/dts/allwinner/sun7i-a20-hummingbird.dts
index f1e26b75cd90..b9e5a43254ad 100644
--- a/arch/arm/boot/dts/allwinner/sun7i-a20-hummingbird.dts
+++ b/arch/arm/boot/dts/allwinner/sun7i-a20-hummingbird.dts
@@ -71,7 +71,7 @@ reg_mmc3_vdd: regulator-mmc3-vdd {
 		regulator-min-microvolt = <3000000>;
 		regulator-max-microvolt = <3000000>;
 		enable-active-high;
-		gpio = <&pio 7 9 GPIO_ACTIVE_HIGH>; /* PH9 */
+		gpios = <&pio 7 9 GPIO_ACTIVE_HIGH>; /* PH9 */
 	};
 
 	reg_gmac_vdd: regulator-gmac-vdd {
@@ -80,7 +80,7 @@ reg_gmac_vdd: regulator-gmac-vdd {
 		regulator-min-microvolt = <3000000>;
 		regulator-max-microvolt = <3000000>;
 		enable-active-high;
-		gpio = <&pio 7 16 GPIO_ACTIVE_HIGH>; /* PH16 */
+		gpios = <&pio 7 16 GPIO_ACTIVE_HIGH>; /* PH16 */
 	};
 };
 
@@ -176,12 +176,12 @@ &pwm {
 };
 
 &reg_ahci_5v {
-	gpio = <&pio 7 15 GPIO_ACTIVE_HIGH>; /* PH15 */
+	gpios = <&pio 7 15 GPIO_ACTIVE_HIGH>; /* PH15 */
 	status = "okay";
 };
 
 &reg_usb1_vbus {
-	gpio = <&pio 7 2 GPIO_ACTIVE_HIGH>; /* PH2 */
+	gpios = <&pio 7 2 GPIO_ACTIVE_HIGH>; /* PH2 */
 	status = "okay";
 };
 
diff --git a/arch/arm/boot/dts/allwinner/sun7i-a20-i12-tvbox.dts b/arch/arm/boot/dts/allwinner/sun7i-a20-i12-tvbox.dts
index b21ddd0ec1c2..4d8a62aec0b6 100644
--- a/arch/arm/boot/dts/allwinner/sun7i-a20-i12-tvbox.dts
+++ b/arch/arm/boot/dts/allwinner/sun7i-a20-i12-tvbox.dts
@@ -79,7 +79,7 @@ reg_vmmc3: vmmc3 {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 		enable-active-high;
-		gpio = <&pio 7 2 GPIO_ACTIVE_HIGH>;
+		gpios = <&pio 7 2 GPIO_ACTIVE_HIGH>;
 	};
 
 	reg_vmmc3_io: vmmc3-io {
@@ -90,7 +90,7 @@ reg_vmmc3_io: vmmc3-io {
 		/* This controls VCC-PI, must be always on! */
 		regulator-always-on;
 		enable-active-high;
-		gpio = <&pio 7 12 GPIO_ACTIVE_HIGH>;
+		gpios = <&pio 7 12 GPIO_ACTIVE_HIGH>;
 	};
 
 	reg_gmac_3v3: gmac-3v3 {
@@ -100,7 +100,7 @@ reg_gmac_3v3: gmac-3v3 {
 		regulator-max-microvolt = <3300000>;
 		startup-delay-us = <50000>;
 		enable-active-high;
-		gpio = <&pio 7 21 GPIO_ACTIVE_HIGH>;
+		gpios = <&pio 7 21 GPIO_ACTIVE_HIGH>;
 	};
 };
 
diff --git a/arch/arm/boot/dts/allwinner/sun7i-a20-lamobo-r1.dts b/arch/arm/boot/dts/allwinner/sun7i-a20-lamobo-r1.dts
index 97518afe4658..868680776562 100644
--- a/arch/arm/boot/dts/allwinner/sun7i-a20-lamobo-r1.dts
+++ b/arch/arm/boot/dts/allwinner/sun7i-a20-lamobo-r1.dts
@@ -88,7 +88,7 @@ reg_gmac_3v3: gmac-3v3 {
 		regulator-max-microvolt = <3300000>;
 		startup-delay-us = <100000>;
 		enable-active-high;
-		gpio = <&pio 7 23 GPIO_ACTIVE_HIGH>; /* PH23 */
+		gpios = <&pio 7 23 GPIO_ACTIVE_HIGH>; /* PH23 */
 	};
 };
 
@@ -238,7 +238,7 @@ &battery_power_supply {
 };
 
 &reg_ahci_5v {
-	gpio = <&pio 1 3 GPIO_ACTIVE_HIGH>; /* PB3 */
+	gpios = <&pio 1 3 GPIO_ACTIVE_HIGH>; /* PB3 */
 	status = "okay";
 };
 
@@ -272,7 +272,7 @@ &reg_usb0_vbus {
 };
 
 &reg_usb2_vbus {
-	gpio = <&pio 7 12 GPIO_ACTIVE_HIGH>; /* PH12 */
+	gpios = <&pio 7 12 GPIO_ACTIVE_HIGH>; /* PH12 */
 	status = "okay";
 };
 
diff --git a/arch/arm/boot/dts/allwinner/sun7i-a20-olimex-som-evb.dts b/arch/arm/boot/dts/allwinner/sun7i-a20-olimex-som-evb.dts
index f05ee32bc9cb..7bf39b551afb 100644
--- a/arch/arm/boot/dts/allwinner/sun7i-a20-olimex-som-evb.dts
+++ b/arch/arm/boot/dts/allwinner/sun7i-a20-olimex-som-evb.dts
@@ -239,7 +239,7 @@ led_pins_olimex_som_evb: led-pins {
 };
 
 &reg_ahci_5v {
-	gpio = <&pio 2 3 GPIO_ACTIVE_HIGH>;
+	gpios = <&pio 2 3 GPIO_ACTIVE_HIGH>;
 	status = "okay";
 };
 
diff --git a/arch/arm/boot/dts/allwinner/sun7i-a20-olimex-som204-evb.dts b/arch/arm/boot/dts/allwinner/sun7i-a20-olimex-som204-evb.dts
index a55406657449..225e045f9e34 100644
--- a/arch/arm/boot/dts/allwinner/sun7i-a20-olimex-som204-evb.dts
+++ b/arch/arm/boot/dts/allwinner/sun7i-a20-olimex-som204-evb.dts
@@ -212,7 +212,7 @@ &battery_power_supply {
 };
 
 &reg_ahci_5v {
-	gpio = <&pio 2 3 GPIO_ACTIVE_HIGH>;
+	gpios = <&pio 2 3 GPIO_ACTIVE_HIGH>;
 	status = "okay";
 };
 
@@ -251,7 +251,7 @@ &reg_ldo4 {
 };
 
 &reg_usb0_vbus {
-	gpio = <&pio 2 17 GPIO_ACTIVE_HIGH>;
+	gpios = <&pio 2 17 GPIO_ACTIVE_HIGH>;
 	status = "okay";
 };
 
diff --git a/arch/arm/boot/dts/allwinner/sun7i-a20-olinuxino-lime.dts b/arch/arm/boot/dts/allwinner/sun7i-a20-olinuxino-lime.dts
index 92938d022295..9c6e8953c9e7 100644
--- a/arch/arm/boot/dts/allwinner/sun7i-a20-olinuxino-lime.dts
+++ b/arch/arm/boot/dts/allwinner/sun7i-a20-olinuxino-lime.dts
@@ -179,7 +179,7 @@ led_pins_olinuxinolime: led-pins {
 };
 
 &reg_ahci_5v {
-	gpio = <&pio 2 3 GPIO_ACTIVE_HIGH>;
+	gpios = <&pio 2 3 GPIO_ACTIVE_HIGH>;
 	status = "okay";
 };
 
diff --git a/arch/arm/boot/dts/allwinner/sun7i-a20-olinuxino-lime2.dts b/arch/arm/boot/dts/allwinner/sun7i-a20-olinuxino-lime2.dts
index 435a189332e8..266d679ce92b 100644
--- a/arch/arm/boot/dts/allwinner/sun7i-a20-olinuxino-lime2.dts
+++ b/arch/arm/boot/dts/allwinner/sun7i-a20-olinuxino-lime2.dts
@@ -190,7 +190,7 @@ led_pins_olinuxinolime: led-pins {
 };
 
 &reg_ahci_5v {
-	gpio = <&pio 2 3 GPIO_ACTIVE_HIGH>;
+	gpios = <&pio 2 3 GPIO_ACTIVE_HIGH>;
 	status = "okay";
 };
 
@@ -247,7 +247,7 @@ &reg_ldo4 {
 };
 
 &reg_usb0_vbus {
-	gpio = <&pio 2 17 GPIO_ACTIVE_HIGH>;
+	gpios = <&pio 2 17 GPIO_ACTIVE_HIGH>;
 	status = "okay";
 };
 
diff --git a/arch/arm/boot/dts/allwinner/sun7i-a20-orangepi-mini.dts b/arch/arm/boot/dts/allwinner/sun7i-a20-orangepi-mini.dts
index 84efa01e7cba..fe35ca267e5a 100644
--- a/arch/arm/boot/dts/allwinner/sun7i-a20-orangepi-mini.dts
+++ b/arch/arm/boot/dts/allwinner/sun7i-a20-orangepi-mini.dts
@@ -93,7 +93,7 @@ reg_gmac_3v3: gmac-3v3 {
 		regulator-max-microvolt = <3300000>;
 		startup-delay-us = <100000>;
 		enable-active-high;
-		gpio = <&pio 7 23 GPIO_ACTIVE_HIGH>; /* PH23 */
+		gpios = <&pio 7 23 GPIO_ACTIVE_HIGH>; /* PH23 */
 	};
 };
 
@@ -208,12 +208,12 @@ &reg_usb0_vbus {
 };
 
 &reg_usb1_vbus {
-	gpio = <&pio 7 26 GPIO_ACTIVE_HIGH>; /* PH26 */
+	gpios = <&pio 7 26 GPIO_ACTIVE_HIGH>; /* PH26 */
 	status = "okay";
 };
 
 &reg_usb2_vbus {
-	gpio = <&pio 7 22 GPIO_ACTIVE_HIGH>; /* PH22 */
+	gpios = <&pio 7 22 GPIO_ACTIVE_HIGH>; /* PH22 */
 	status = "okay";
 };
 
diff --git a/arch/arm/boot/dts/allwinner/sun7i-a20-orangepi.dts b/arch/arm/boot/dts/allwinner/sun7i-a20-orangepi.dts
index 5d77f1d9818f..fe6110f14e32 100644
--- a/arch/arm/boot/dts/allwinner/sun7i-a20-orangepi.dts
+++ b/arch/arm/boot/dts/allwinner/sun7i-a20-orangepi.dts
@@ -77,7 +77,7 @@ reg_gmac_3v3: gmac-3v3 {
 		regulator-max-microvolt = <3300000>;
 		startup-delay-us = <100000>;
 		enable-active-high;
-		gpio = <&pio 7 23 GPIO_ACTIVE_HIGH>; /* PH23 */
+		gpios = <&pio 7 23 GPIO_ACTIVE_HIGH>; /* PH23 */
 	};
 };
 
@@ -167,12 +167,12 @@ &reg_usb0_vbus {
 };
 
 &reg_usb1_vbus {
-	gpio = <&pio 7 26 GPIO_ACTIVE_HIGH>; /* PH26 */
+	gpios = <&pio 7 26 GPIO_ACTIVE_HIGH>; /* PH26 */
 	status = "okay";
 };
 
 &reg_usb2_vbus {
-	gpio = <&pio 7 22 GPIO_ACTIVE_HIGH>; /* PH22 */
+	gpios = <&pio 7 22 GPIO_ACTIVE_HIGH>; /* PH22 */
 	status = "okay";
 };
 
diff --git a/arch/arm/boot/dts/allwinner/sun7i-a20-pcduino3-nano.dts b/arch/arm/boot/dts/allwinner/sun7i-a20-pcduino3-nano.dts
index e40ecb48d726..174c3bb6598e 100644
--- a/arch/arm/boot/dts/allwinner/sun7i-a20-pcduino3-nano.dts
+++ b/arch/arm/boot/dts/allwinner/sun7i-a20-pcduino3-nano.dts
@@ -169,7 +169,7 @@ &otg_sram {
 };
 
 &reg_ahci_5v {
-	gpio = <&pio 7 2 GPIO_ACTIVE_HIGH>; /* PH2 */
+	gpios = <&pio 7 2 GPIO_ACTIVE_HIGH>; /* PH2 */
 	status = "okay";
 };
 
@@ -202,7 +202,7 @@ &reg_ldo2 {
 
 /* A single regulator (U24) powers both USB host ports. */
 &reg_usb1_vbus {
-	gpio = <&pio 3 2 GPIO_ACTIVE_HIGH>; /* PD2 */
+	gpios = <&pio 3 2 GPIO_ACTIVE_HIGH>; /* PD2 */
 	status = "okay";
 };
 
diff --git a/arch/arm/boot/dts/allwinner/sun7i-a20-pcduino3.dts b/arch/arm/boot/dts/allwinner/sun7i-a20-pcduino3.dts
index 928b86a95f34..1251157519f3 100644
--- a/arch/arm/boot/dts/allwinner/sun7i-a20-pcduino3.dts
+++ b/arch/arm/boot/dts/allwinner/sun7i-a20-pcduino3.dts
@@ -171,7 +171,7 @@ &otg_sram {
 };
 
 &reg_ahci_5v {
-	gpio = <&pio 7 2 GPIO_ACTIVE_HIGH>;
+	gpios = <&pio 7 2 GPIO_ACTIVE_HIGH>;
 	status = "okay";
 };
 
diff --git a/arch/arm/boot/dts/allwinner/sun8i-a83t-allwinner-h8homlet-v2.dts b/arch/arm/boot/dts/allwinner/sun8i-a83t-allwinner-h8homlet-v2.dts
index c31c97d16024..793b00430646 100644
--- a/arch/arm/boot/dts/allwinner/sun8i-a83t-allwinner-h8homlet-v2.dts
+++ b/arch/arm/boot/dts/allwinner/sun8i-a83t-allwinner-h8homlet-v2.dts
@@ -65,7 +65,7 @@ reg_usb0_vbus: reg-usb0-vbus {
 		regulator-max-microvolt = <5000000>;
 		regulator-boot-on;
 		enable-active-high;
-		gpio = <&r_pio 0 5 GPIO_ACTIVE_HIGH>; /* PL5 */
+		gpios = <&r_pio 0 5 GPIO_ACTIVE_HIGH>; /* PL5 */
 	};
 
 	reg_usb1_vbus: reg-usb1-vbus {
@@ -75,7 +75,7 @@ reg_usb1_vbus: reg-usb1-vbus {
 		regulator-max-microvolt = <5000000>;
 		regulator-boot-on;
 		enable-active-high;
-		gpio = <&r_pio 0 6 GPIO_ACTIVE_HIGH>; /* PL6 */
+		gpios = <&r_pio 0 6 GPIO_ACTIVE_HIGH>; /* PL6 */
 	};
 };
 
diff --git a/arch/arm/boot/dts/allwinner/sun8i-a83t-bananapi-m3.dts b/arch/arm/boot/dts/allwinner/sun8i-a83t-bananapi-m3.dts
index 32e811fa23e2..b661c80a1aa2 100644
--- a/arch/arm/boot/dts/allwinner/sun8i-a83t-bananapi-m3.dts
+++ b/arch/arm/boot/dts/allwinner/sun8i-a83t-bananapi-m3.dts
@@ -92,7 +92,7 @@ reg_usb1_vbus: reg-usb1-vbus {
 		regulator-max-microvolt = <5000000>;
 		regulator-boot-on;
 		enable-active-high;
-		gpio = <&pio 3 24 GPIO_ACTIVE_HIGH>; /* PD24 */
+		gpios = <&pio 3 24 GPIO_ACTIVE_HIGH>; /* PD24 */
 	};
 
 	wifi_pwrseq: pwrseq {
@@ -118,7 +118,7 @@ regulator-sata-disk-pwr {
 		regulator-max-microvolt = <5000000>;
 		regulator-always-on;
 		enable-active-high;
-		gpio = <&pio 3 25 GPIO_ACTIVE_HIGH>; /* PD25 */
+		gpios = <&pio 3 25 GPIO_ACTIVE_HIGH>; /* PD25 */
 	};
 };
 
diff --git a/arch/arm/boot/dts/allwinner/sun8i-a83t-cubietruck-plus.dts b/arch/arm/boot/dts/allwinner/sun8i-a83t-cubietruck-plus.dts
index d5e6ddaffbce..d70ff729f3aa 100644
--- a/arch/arm/boot/dts/allwinner/sun8i-a83t-cubietruck-plus.dts
+++ b/arch/arm/boot/dts/allwinner/sun8i-a83t-cubietruck-plus.dts
@@ -113,7 +113,7 @@ reg_usb1_vbus: reg-usb1-vbus {
 		regulator-max-microvolt = <5000000>;
 		regulator-boot-on;
 		enable-active-high;
-		gpio = <&pio 3 29 GPIO_ACTIVE_HIGH>; /* PD29 */
+		gpios = <&pio 3 29 GPIO_ACTIVE_HIGH>; /* PD29 */
 	};
 
 	reg_usb2_vbus: reg-usb2-vbus {
@@ -123,7 +123,7 @@ reg_usb2_vbus: reg-usb2-vbus {
 		regulator-max-microvolt = <5000000>;
 		regulator-boot-on;
 		enable-active-high;
-		gpio = <&r_pio 0 6 GPIO_ACTIVE_HIGH>; /* PL6 */
+		gpios = <&r_pio 0 6 GPIO_ACTIVE_HIGH>; /* PL6 */
 	};
 
 	sound {
diff --git a/arch/arm/boot/dts/allwinner/sun8i-a83t-tbs-a711.dts b/arch/arm/boot/dts/allwinner/sun8i-a83t-tbs-a711.dts
index 43982b106a4d..6575d110fb13 100644
--- a/arch/arm/boot/dts/allwinner/sun8i-a83t-tbs-a711.dts
+++ b/arch/arm/boot/dts/allwinner/sun8i-a83t-tbs-a711.dts
@@ -118,7 +118,7 @@ reg_vmain: reg-vmain {
 		regulator-name = "vmain";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&r_pio 0 9 GPIO_ACTIVE_HIGH>;
+		gpios = <&r_pio 0 9 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&reg_vbat>;
 	};
diff --git a/arch/arm/boot/dts/allwinner/sun8i-h2-plus-bananapi-m2-zero.dts b/arch/arm/boot/dts/allwinner/sun8i-h2-plus-bananapi-m2-zero.dts
index d3a7c9fa23e4..02ff39b56034 100644
--- a/arch/arm/boot/dts/allwinner/sun8i-h2-plus-bananapi-m2-zero.dts
+++ b/arch/arm/boot/dts/allwinner/sun8i-h2-plus-bananapi-m2-zero.dts
@@ -82,7 +82,7 @@ reg_vcc_dram: vcc-dram {
 		regulator-always-on;
 		regulator-boot-on;
 		enable-active-high;
-		gpio = <&r_pio 0 9 GPIO_ACTIVE_HIGH>; /* PL9 */
+		gpios = <&r_pio 0 9 GPIO_ACTIVE_HIGH>; /* PL9 */
 		vin-supply = <&reg_vcc5v0>;
 	};
 
@@ -94,7 +94,7 @@ reg_vcc1v2: vcc1v2 {
 		regulator-always-on;
 		regulator-boot-on;
 		enable-active-high;
-		gpio = <&r_pio 0 8 GPIO_ACTIVE_HIGH>; /* PL8 */
+		gpios = <&r_pio 0 8 GPIO_ACTIVE_HIGH>; /* PL8 */
 		vin-supply = <&reg_vcc5v0>;
 	};
 
diff --git a/arch/arm/boot/dts/allwinner/sun8i-h2-plus-orangepi-r1.dts b/arch/arm/boot/dts/allwinner/sun8i-h2-plus-orangepi-r1.dts
index 79b03b31c5eb..e779e21d96b5 100644
--- a/arch/arm/boot/dts/allwinner/sun8i-h2-plus-orangepi-r1.dts
+++ b/arch/arm/boot/dts/allwinner/sun8i-h2-plus-orangepi-r1.dts
@@ -61,7 +61,7 @@ reg_vcc_usb_eth: reg-vcc-usb-ethernet {
 		regulator-max-microvolt = <3300000>;
 		regulator-name = "vcc-usb-ethernet";
 		enable-active-high;
-		gpio = <&pio 0 20 GPIO_ACTIVE_HIGH>;
+		gpios = <&pio 0 20 GPIO_ACTIVE_HIGH>;
 	};
 
 	aliases {
diff --git a/arch/arm/boot/dts/allwinner/sun8i-h2-plus-orangepi-zero.dts b/arch/arm/boot/dts/allwinner/sun8i-h2-plus-orangepi-zero.dts
index 1b001f2ad0ef..6447fe4a8722 100644
--- a/arch/arm/boot/dts/allwinner/sun8i-h2-plus-orangepi-zero.dts
+++ b/arch/arm/boot/dts/allwinner/sun8i-h2-plus-orangepi-zero.dts
@@ -86,7 +86,7 @@ reg_vcc_wifi: reg-vcc-wifi {
 		regulator-max-microvolt = <3300000>;
 		regulator-name = "vcc-wifi";
 		enable-active-high;
-		gpio = <&pio 0 20 GPIO_ACTIVE_HIGH>;
+		gpios = <&pio 0 20 GPIO_ACTIVE_HIGH>;
 	};
 
 	reg_vdd_cpux: vdd-cpux-regulator {
diff --git a/arch/arm/boot/dts/allwinner/sun8i-h3-beelink-x2.dts b/arch/arm/boot/dts/allwinner/sun8i-h3-beelink-x2.dts
index 5b77300307de..3a15dc573f23 100644
--- a/arch/arm/boot/dts/allwinner/sun8i-h3-beelink-x2.dts
+++ b/arch/arm/boot/dts/allwinner/sun8i-h3-beelink-x2.dts
@@ -209,7 +209,7 @@ &ohci1 {
 };
 
 &reg_usb0_vbus {
-	gpio = <&r_pio 0 2 GPIO_ACTIVE_HIGH>; /* PL2 */
+	gpios = <&r_pio 0 2 GPIO_ACTIVE_HIGH>; /* PL2 */
 	status = "okay";
 };
 
diff --git a/arch/arm/boot/dts/allwinner/sun8i-h3-nanopi-duo2.dts b/arch/arm/boot/dts/allwinner/sun8i-h3-nanopi-duo2.dts
index 2b0566d4b386..b674463fe494 100644
--- a/arch/arm/boot/dts/allwinner/sun8i-h3-nanopi-duo2.dts
+++ b/arch/arm/boot/dts/allwinner/sun8i-h3-nanopi-duo2.dts
@@ -71,7 +71,7 @@ reg_vcc_dram: vcc-dram {
 		regulator-always-on;
 		regulator-boot-on;
 		enable-active-high;
-		gpio = <&r_pio 0 9 GPIO_ACTIVE_HIGH>; /* PL9 */
+		gpios = <&r_pio 0 9 GPIO_ACTIVE_HIGH>; /* PL9 */
 		vin-supply = <&reg_vcc5v0>;
         };
 
@@ -83,7 +83,7 @@ reg_vdd_sys: vdd-sys {
 		regulator-always-on;
 		regulator-boot-on;
 		enable-active-high;
-		gpio = <&r_pio 0 8 GPIO_ACTIVE_HIGH>; /* PL8 */
+		gpios = <&r_pio 0 8 GPIO_ACTIVE_HIGH>; /* PL8 */
 		vin-supply = <&reg_vcc5v0>;
         };
 
@@ -133,7 +133,7 @@ &ohci0 {
 };
 
 &reg_usb0_vbus {
-	gpio = <&r_pio 0 2 GPIO_ACTIVE_HIGH>; /* PL2 */
+	gpios = <&r_pio 0 2 GPIO_ACTIVE_HIGH>; /* PL2 */
 	status = "okay";
 };
 
diff --git a/arch/arm/boot/dts/allwinner/sun8i-h3-nanopi-m1-plus.dts b/arch/arm/boot/dts/allwinner/sun8i-h3-nanopi-m1-plus.dts
index 59bd0746acf8..17fa7b3f94bf 100644
--- a/arch/arm/boot/dts/allwinner/sun8i-h3-nanopi-m1-plus.dts
+++ b/arch/arm/boot/dts/allwinner/sun8i-h3-nanopi-m1-plus.dts
@@ -59,7 +59,7 @@ reg_gmac_3v3: gmac-3v3 {
 		regulator-max-microvolt = <3300000>;
 		startup-delay-us = <100000>;
 		enable-active-high;
-		gpio = <&pio 3 6 GPIO_ACTIVE_HIGH>;
+		gpios = <&pio 3 6 GPIO_ACTIVE_HIGH>;
 	};
 
 	wifi_pwrseq: pwrseq {
diff --git a/arch/arm/boot/dts/allwinner/sun8i-h3-nanopi-r1.dts b/arch/arm/boot/dts/allwinner/sun8i-h3-nanopi-r1.dts
index 870649760f70..52d1655f3f42 100644
--- a/arch/arm/boot/dts/allwinner/sun8i-h3-nanopi-r1.dts
+++ b/arch/arm/boot/dts/allwinner/sun8i-h3-nanopi-r1.dts
@@ -25,7 +25,7 @@ reg_gmac_3v3: gmac-3v3 {
 		regulator-max-microvolt = <3300000>;
 		startup-delay-us = <100000>;
 		enable-active-high;
-		gpio = <&pio 3 6 GPIO_ACTIVE_HIGH>; /* PD6 */
+		gpios = <&pio 3 6 GPIO_ACTIVE_HIGH>; /* PD6 */
 	};
 
 	reg_vdd_cpux: gpio-regulator {
@@ -129,7 +129,7 @@ &ohci2 {
 };
 
 &reg_usb0_vbus {
-	gpio = <&r_pio 0 2 GPIO_ACTIVE_HIGH>; /* PL2 */
+	gpios = <&r_pio 0 2 GPIO_ACTIVE_HIGH>; /* PL2 */
 	status = "okay";
 };
 
diff --git a/arch/arm/boot/dts/allwinner/sun8i-h3-orangepi-2.dts b/arch/arm/boot/dts/allwinner/sun8i-h3-orangepi-2.dts
index d2ae47b074bf..aff6cba05eb2 100644
--- a/arch/arm/boot/dts/allwinner/sun8i-h3-orangepi-2.dts
+++ b/arch/arm/boot/dts/allwinner/sun8i-h3-orangepi-2.dts
@@ -175,7 +175,7 @@ rtl8189: wifi at 1 {
 };
 
 &reg_usb1_vbus {
-	gpio = <&pio 6 13 GPIO_ACTIVE_HIGH>;
+	gpios = <&pio 6 13 GPIO_ACTIVE_HIGH>;
 	status = "okay";
 };
 
diff --git a/arch/arm/boot/dts/allwinner/sun8i-h3-orangepi-one.dts b/arch/arm/boot/dts/allwinner/sun8i-h3-orangepi-one.dts
index 59f6f6d5e7ca..b70dcb456c45 100644
--- a/arch/arm/boot/dts/allwinner/sun8i-h3-orangepi-one.dts
+++ b/arch/arm/boot/dts/allwinner/sun8i-h3-orangepi-one.dts
@@ -162,7 +162,7 @@ &ohci1 {
 };
 
 &reg_usb0_vbus {
-	gpio = <&r_pio 0 2 GPIO_ACTIVE_HIGH>; /* PL2 */
+	gpios = <&r_pio 0 2 GPIO_ACTIVE_HIGH>; /* PL2 */
 	status = "okay";
 };
 
diff --git a/arch/arm/boot/dts/allwinner/sun8i-h3-orangepi-pc.dts b/arch/arm/boot/dts/allwinner/sun8i-h3-orangepi-pc.dts
index b96e015f54ee..9f208e4d8aa8 100644
--- a/arch/arm/boot/dts/allwinner/sun8i-h3-orangepi-pc.dts
+++ b/arch/arm/boot/dts/allwinner/sun8i-h3-orangepi-pc.dts
@@ -201,7 +201,7 @@ reg_vdd_cpux: regulator at 65 {
 };
 
 &reg_usb0_vbus {
-	gpio = <&r_pio 0 2 GPIO_ACTIVE_HIGH>; /* PL2 */
+	gpios = <&r_pio 0 2 GPIO_ACTIVE_HIGH>; /* PL2 */
 	status = "okay";
 };
 
diff --git a/arch/arm/boot/dts/allwinner/sun8i-h3-orangepi-plus.dts b/arch/arm/boot/dts/allwinner/sun8i-h3-orangepi-plus.dts
index d05fa679dcd3..beeb3f4b3154 100644
--- a/arch/arm/boot/dts/allwinner/sun8i-h3-orangepi-plus.dts
+++ b/arch/arm/boot/dts/allwinner/sun8i-h3-orangepi-plus.dts
@@ -58,7 +58,7 @@ reg_gmac_3v3: gmac-3v3 {
 		regulator-max-microvolt = <3300000>;
 		startup-delay-us = <100000>;
 		enable-active-high;
-		gpio = <&pio 3 6 GPIO_ACTIVE_HIGH>;
+		gpios = <&pio 3 6 GPIO_ACTIVE_HIGH>;
 	};
 
 	reg_usb3_vbus: usb3-vbus {
@@ -68,7 +68,7 @@ reg_usb3_vbus: usb3-vbus {
 		regulator-max-microvolt = <5000000>;
 		regulator-boot-on;
 		enable-active-high;
-		gpio = <&pio 6 11 GPIO_ACTIVE_HIGH>;
+		gpios = <&pio 6 11 GPIO_ACTIVE_HIGH>;
 	};
 };
 
diff --git a/arch/arm/boot/dts/allwinner/sun8i-h3-orangepi-plus2e.dts b/arch/arm/boot/dts/allwinner/sun8i-h3-orangepi-plus2e.dts
index b6ca45d18e51..cc1fef82b334 100644
--- a/arch/arm/boot/dts/allwinner/sun8i-h3-orangepi-plus2e.dts
+++ b/arch/arm/boot/dts/allwinner/sun8i-h3-orangepi-plus2e.dts
@@ -58,7 +58,7 @@ reg_gmac_3v3: gmac-3v3 {
 		regulator-max-microvolt = <3300000>;
 		startup-delay-us = <100000>;
 		enable-active-high;
-		gpio = <&pio 3 6 GPIO_ACTIVE_HIGH>; /* PD6 */
+		gpios = <&pio 3 6 GPIO_ACTIVE_HIGH>; /* PD6 */
 	};
 };
 
diff --git a/arch/arm/boot/dts/allwinner/sun8i-h3-zeropi.dts b/arch/arm/boot/dts/allwinner/sun8i-h3-zeropi.dts
index 7d3e7323b661..fbc3f713d831 100644
--- a/arch/arm/boot/dts/allwinner/sun8i-h3-zeropi.dts
+++ b/arch/arm/boot/dts/allwinner/sun8i-h3-zeropi.dts
@@ -57,7 +57,7 @@ reg_gmac_3v3: gmac-3v3 {
 		regulator-max-microvolt = <3300000>;
 		startup-delay-us = <100000>;
 		enable-active-high;
-		gpio = <&pio 3 6 GPIO_ACTIVE_HIGH>; /* PD6 */
+		gpios = <&pio 3 6 GPIO_ACTIVE_HIGH>; /* PD6 */
 	};
 };
 
diff --git a/arch/arm/boot/dts/allwinner/sun8i-r16-parrot.dts b/arch/arm/boot/dts/allwinner/sun8i-r16-parrot.dts
index 75067522ff59..76baf61ab9de 100644
--- a/arch/arm/boot/dts/allwinner/sun8i-r16-parrot.dts
+++ b/arch/arm/boot/dts/allwinner/sun8i-r16-parrot.dts
@@ -281,7 +281,7 @@ &reg_eldo3 {
 };
 
 &reg_usb1_vbus {
-	gpio = <&pio 3 12 GPIO_ACTIVE_HIGH>; /* PD12 */
+	gpios = <&pio 3 12 GPIO_ACTIVE_HIGH>; /* PD12 */
 	status = "okay";
 };
 
diff --git a/arch/arm/boot/dts/allwinner/sun8i-r40-bananapi-m2-ultra.dts b/arch/arm/boot/dts/allwinner/sun8i-r40-bananapi-m2-ultra.dts
index cd2351acc32f..737ffc2470f6 100644
--- a/arch/arm/boot/dts/allwinner/sun8i-r40-bananapi-m2-ultra.dts
+++ b/arch/arm/boot/dts/allwinner/sun8i-r40-bananapi-m2-ultra.dts
@@ -96,7 +96,7 @@ reg_vcc5v0: vcc5v0 {
 		regulator-name = "vcc5v0";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&pio 7 23 GPIO_ACTIVE_HIGH>; /* PH23 */
+		gpios = <&pio 7 23 GPIO_ACTIVE_HIGH>; /* PH23 */
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/allwinner/sun8i-s3-pinecube.dts b/arch/arm/boot/dts/allwinner/sun8i-s3-pinecube.dts
index e0d4404b5957..80c0271b6e81 100644
--- a/arch/arm/boot/dts/allwinner/sun8i-s3-pinecube.dts
+++ b/arch/arm/boot/dts/allwinner/sun8i-s3-pinecube.dts
@@ -46,7 +46,7 @@ reg_vcc_wifi: vcc-wifi {
 		regulator-name = "vcc-wifi";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&pio 1 2 GPIO_ACTIVE_LOW>; /* PB2 WIFI-EN */
+		gpios = <&pio 1 2 GPIO_ACTIVE_LOW>; /* PB2 WIFI-EN */
 		vin-supply = <&reg_dcdc3>;
 		startup-delay-us = <200000>;
 	};
diff --git a/arch/arm/boot/dts/allwinner/sun8i-t3-cqa3t-bv3.dts b/arch/arm/boot/dts/allwinner/sun8i-t3-cqa3t-bv3.dts
index 9f472521f4a4..d8cbad257083 100644
--- a/arch/arm/boot/dts/allwinner/sun8i-t3-cqa3t-bv3.dts
+++ b/arch/arm/boot/dts/allwinner/sun8i-t3-cqa3t-bv3.dts
@@ -78,7 +78,7 @@ reg_vcc5v0: vcc5v0 {
 		regulator-name = "vcc5v0";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&pio 7 23 GPIO_ACTIVE_HIGH>; /* PH23 */
+		gpios = <&pio 7 23 GPIO_ACTIVE_HIGH>; /* PH23 */
 		enable-active-high;
 	};
 };
diff --git a/arch/arm/boot/dts/allwinner/sun8i-v40-bananapi-m2-berry.dts b/arch/arm/boot/dts/allwinner/sun8i-v40-bananapi-m2-berry.dts
index 6575ef274453..59fb9ce57cc9 100644
--- a/arch/arm/boot/dts/allwinner/sun8i-v40-bananapi-m2-berry.dts
+++ b/arch/arm/boot/dts/allwinner/sun8i-v40-bananapi-m2-berry.dts
@@ -90,7 +90,7 @@ reg_vcc5v0: vcc5v0 {
 		regulator-name = "vcc5v0";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&pio 7 23 GPIO_ACTIVE_HIGH>; /* PH23 */
+		gpios = <&pio 7 23 GPIO_ACTIVE_HIGH>; /* PH23 */
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/allwinner/sun9i-a80-optimus.dts b/arch/arm/boot/dts/allwinner/sun9i-a80-optimus.dts
index 5c3580d712e4..784e0eef7d1b 100644
--- a/arch/arm/boot/dts/allwinner/sun9i-a80-optimus.dts
+++ b/arch/arm/boot/dts/allwinner/sun9i-a80-optimus.dts
@@ -86,7 +86,7 @@ reg_usb1_vbus: usb1-vbus {
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
 		enable-active-high;
-		gpio = <&pio 7 4 GPIO_ACTIVE_HIGH>; /* PH4 */
+		gpios = <&pio 7 4 GPIO_ACTIVE_HIGH>; /* PH4 */
 	};
 
 	reg_usb3_vbus: usb3-vbus {
@@ -95,7 +95,7 @@ reg_usb3_vbus: usb3-vbus {
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
 		enable-active-high;
-		gpio = <&pio 7 5 GPIO_ACTIVE_HIGH>; /* PH5 */
+		gpios = <&pio 7 5 GPIO_ACTIVE_HIGH>; /* PH5 */
 	};
 
 	wifi_pwrseq: wifi-pwrseq {
diff --git a/arch/arm/boot/dts/allwinner/sunxi-bananapi-m2-plus.dtsi b/arch/arm/boot/dts/allwinner/sunxi-bananapi-m2-plus.dtsi
index 873817ddb4ea..f8f083622bfe 100644
--- a/arch/arm/boot/dts/allwinner/sunxi-bananapi-m2-plus.dtsi
+++ b/arch/arm/boot/dts/allwinner/sunxi-bananapi-m2-plus.dtsi
@@ -95,7 +95,7 @@ reg_gmac_3v3: gmac-3v3 {
 		regulator-max-microvolt = <3300000>;
 		startup-delay-us = <100000>;
 		enable-active-high;
-		gpio = <&pio 3 6 GPIO_ACTIVE_HIGH>;
+		gpios = <&pio 3 6 GPIO_ACTIVE_HIGH>;
 	};
 
 	wifi_pwrseq: pwrseq {
@@ -202,7 +202,7 @@ &ohci2 {
 };
 
 &reg_usb0_vbus {
-	gpio = <&pio 3 11 GPIO_ACTIVE_HIGH>; /* PD11 */
+	gpios = <&pio 3 11 GPIO_ACTIVE_HIGH>; /* PD11 */
 	status = "okay";
 };
 
diff --git a/arch/arm/boot/dts/allwinner/sunxi-common-regulators.dtsi b/arch/arm/boot/dts/allwinner/sunxi-common-regulators.dtsi
index d8e5826fb3de..0c61252a7008 100644
--- a/arch/arm/boot/dts/allwinner/sunxi-common-regulators.dtsi
+++ b/arch/arm/boot/dts/allwinner/sunxi-common-regulators.dtsi
@@ -52,7 +52,7 @@ reg_ahci_5v: ahci-5v {
 		regulator-max-microvolt = <5000000>;
 		regulator-boot-on;
 		enable-active-high;
-		gpio = <&pio 1 8 GPIO_ACTIVE_HIGH>;
+		gpios = <&pio 1 8 GPIO_ACTIVE_HIGH>;
 		status = "disabled";
 	};
 
@@ -62,7 +62,7 @@ reg_usb0_vbus: usb0-vbus {
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
 		enable-active-high;
-		gpio = <&pio 1 9 GPIO_ACTIVE_HIGH>;
+		gpios = <&pio 1 9 GPIO_ACTIVE_HIGH>;
 		status = "disabled";
 	};
 
@@ -73,7 +73,7 @@ reg_usb1_vbus: usb1-vbus {
 		regulator-max-microvolt = <5000000>;
 		regulator-boot-on;
 		enable-active-high;
-		gpio = <&pio 7 6 GPIO_ACTIVE_HIGH>;
+		gpios = <&pio 7 6 GPIO_ACTIVE_HIGH>;
 		status = "disabled";
 	};
 
@@ -84,7 +84,7 @@ reg_usb2_vbus: usb2-vbus {
 		regulator-max-microvolt = <5000000>;
 		regulator-boot-on;
 		enable-active-high;
-		gpio = <&pio 7 3 GPIO_ACTIVE_HIGH>;
+		gpios = <&pio 7 3 GPIO_ACTIVE_HIGH>;
 		status = "disabled";
 	};
 
diff --git a/arch/arm/boot/dts/allwinner/sunxi-h3-h5-emlid-neutis.dtsi b/arch/arm/boot/dts/allwinner/sunxi-h3-h5-emlid-neutis.dtsi
index be5f5528a118..41a5a7496639 100644
--- a/arch/arm/boot/dts/allwinner/sunxi-h3-h5-emlid-neutis.dtsi
+++ b/arch/arm/boot/dts/allwinner/sunxi-h3-h5-emlid-neutis.dtsi
@@ -32,7 +32,7 @@ &cpu0 {
 };
 
 &reg_usb0_vbus {
-	gpio = <&r_pio 0 9 GPIO_ACTIVE_HIGH>;   /* PL9 */
+	gpios = <&r_pio 0 9 GPIO_ACTIVE_HIGH>;   /* PL9 */
 	status = "okay";
 };
 
diff --git a/arch/arm/boot/dts/allwinner/sunxi-libretech-all-h3-cc.dtsi b/arch/arm/boot/dts/allwinner/sunxi-libretech-all-h3-cc.dtsi
index 89731bb34c6b..640d5f9ae47e 100644
--- a/arch/arm/boot/dts/allwinner/sunxi-libretech-all-h3-cc.dtsi
+++ b/arch/arm/boot/dts/allwinner/sunxi-libretech-all-h3-cc.dtsi
@@ -61,7 +61,7 @@ reg_vcc1v2: vcc1v2 {
 		regulator-always-on;
 		regulator-boot-on;
 		vin-supply = <&reg_vcc5v0>;
-		gpio = <&r_pio 0 8 GPIO_ACTIVE_HIGH>; /* PL8 */
+		gpios = <&r_pio 0 8 GPIO_ACTIVE_HIGH>; /* PL8 */
 		enable-active-high;
 	};
 
@@ -89,7 +89,7 @@ reg_vcc_dram: vcc-dram {
 		regulator-always-on;
 		regulator-boot-on;
 		vin-supply = <&reg_vcc5v0>;
-		gpio = <&r_pio 0 9 GPIO_ACTIVE_HIGH>; /* PL9 */
+		gpios = <&r_pio 0 9 GPIO_ACTIVE_HIGH>; /* PL9 */
 		enable-active-high;
 	};
 
@@ -101,7 +101,7 @@ reg_vcc_io: vcc-io {
 		regulator-always-on;
 		regulator-boot-on;
 		vin-supply = <&reg_vcc3v3>;
-		gpio = <&r_pio 0 5 GPIO_ACTIVE_LOW>; /* PL5 */
+		gpios = <&r_pio 0 5 GPIO_ACTIVE_LOW>; /* PL5 */
 	};
 
 	reg_vdd_cpux: vdd-cpux {
@@ -112,7 +112,7 @@ reg_vdd_cpux: vdd-cpux {
 		regulator-always-on;
 		regulator-boot-on;
 		vin-supply = <&reg_vcc5v0>;
-		gpio = <&r_pio 0 8 GPIO_ACTIVE_HIGH>; /* PL8 */
+		gpios = <&r_pio 0 8 GPIO_ACTIVE_HIGH>; /* PL8 */
 		enable-active-high;
 	};
 };
diff --git a/arch/arm/boot/dts/allwinner/sunxi-libretech-all-h3-it.dtsi b/arch/arm/boot/dts/allwinner/sunxi-libretech-all-h3-it.dtsi
index 50d328c2a84d..8f82f8990e7d 100644
--- a/arch/arm/boot/dts/allwinner/sunxi-libretech-all-h3-it.dtsi
+++ b/arch/arm/boot/dts/allwinner/sunxi-libretech-all-h3-it.dtsi
@@ -62,7 +62,7 @@ reg_vcc_dram: vcc-dram {
 		regulator-always-on;
 		regulator-boot-on;
 		vin-supply = <&reg_vcc5v0>;
-		gpio = <&r_pio 0 9 GPIO_ACTIVE_HIGH>; /* PL9 */
+		gpios = <&r_pio 0 9 GPIO_ACTIVE_HIGH>; /* PL9 */
 		enable-active-high;
 	};
 
@@ -73,7 +73,7 @@ reg_vcc_io: vcc-io {
 		regulator-always-on;
 		regulator-boot-on;
 		vin-supply = <&reg_vcc3v3>;
-		gpio = <&r_pio 0 5 GPIO_ACTIVE_LOW>; /* PL5 */
+		gpios = <&r_pio 0 5 GPIO_ACTIVE_LOW>; /* PL5 */
 	};
 
 	reg_vcc_usbwifi: vcc-usbwifi {
@@ -82,7 +82,7 @@ reg_vcc_usbwifi: vcc-usbwifi {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 		vin-supply = <&reg_vcc5v0>;
-		gpio = <&pio 6 4 GPIO_ACTIVE_HIGH>; /* PG4 */
+		gpios = <&pio 6 4 GPIO_ACTIVE_HIGH>; /* PG4 */
 		enable-active-high;
 	};
 
@@ -94,7 +94,7 @@ reg_vdd_cpux: vdd-cpux {
 		regulator-always-on;
 		regulator-boot-on;
 		vin-supply = <&reg_vcc5v0>;
-		gpio = <&r_pio 0 8 GPIO_ACTIVE_HIGH>; /* PL8 */
+		gpios = <&r_pio 0 8 GPIO_ACTIVE_HIGH>; /* PL8 */
 		enable-active-high;
 	};
 };
diff --git a/arch/arm/boot/dts/amlogic/meson8b-ec100.dts b/arch/arm/boot/dts/amlogic/meson8b-ec100.dts
index 49890eb12781..77a9a3dfaa69 100644
--- a/arch/arm/boot/dts/amlogic/meson8b-ec100.dts
+++ b/arch/arm/boot/dts/amlogic/meson8b-ec100.dts
@@ -136,7 +136,7 @@ usb_vbus: regulator-usb-vbus {
 		/*
 		 * signal name from the schematics: USB_PWR_EN
 		 */
-		gpio = <&gpio_ao GPIOAO_5 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio_ao GPIOAO_5 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -155,7 +155,7 @@ vcc_5v: regulator-vcc5v {
 		/*
 		 * signal name from the schematics: 3V3_5V_EN
 		 */
-		gpio = <&gpio GPIODV_29 GPIO_ACTIVE_LOW>;
+		gpios = <&gpio GPIODV_29 GPIO_ACTIVE_LOW>;
 
 		regulator-boot-on;
 		regulator-always-on;
diff --git a/arch/arm/boot/dts/amlogic/meson8b-odroidc1.dts b/arch/arm/boot/dts/amlogic/meson8b-odroidc1.dts
index 941682844faf..926a9063c8a3 100644
--- a/arch/arm/boot/dts/amlogic/meson8b-odroidc1.dts
+++ b/arch/arm/boot/dts/amlogic/meson8b-odroidc1.dts
@@ -62,7 +62,7 @@ tflash_vdd: regulator-tflash_vdd {
 
 		vin-supply = <&vcc_3v3>;
 
-		gpio = <&gpio GPIOY_12 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio GPIOY_12 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/aspeed/aspeed-bmc-facebook-bletchley.dts b/arch/arm/boot/dts/aspeed/aspeed-bmc-facebook-bletchley.dts
index 5be0e8fd2633..90f569f41e16 100644
--- a/arch/arm/boot/dts/aspeed/aspeed-bmc-facebook-bletchley.dts
+++ b/arch/arm/boot/dts/aspeed/aspeed-bmc-facebook-bletchley.dts
@@ -232,7 +232,7 @@ vbus_sled1: vbus_sled1 {
 		regulator-name = "vbus_sled1";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&sled1_ioexp 1 GPIO_ACTIVE_HIGH>;
+		gpios = <&sled1_ioexp 1 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -241,7 +241,7 @@ vbus_sled2: vbus_sled2 {
 		regulator-name = "vbus_sled2";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&sled2_ioexp 1 GPIO_ACTIVE_HIGH>;
+		gpios = <&sled2_ioexp 1 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -250,7 +250,7 @@ vbus_sled3: vbus_sled3 {
 		regulator-name = "vbus_sled3";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&sled3_ioexp 1 GPIO_ACTIVE_HIGH>;
+		gpios = <&sled3_ioexp 1 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -259,7 +259,7 @@ vbus_sled4: vbus_sled4 {
 		regulator-name = "vbus_sled4";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&sled4_ioexp 1 GPIO_ACTIVE_HIGH>;
+		gpios = <&sled4_ioexp 1 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -268,7 +268,7 @@ vbus_sled5: vbus_sled5 {
 		regulator-name = "vbus_sled5";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&sled5_ioexp 1 GPIO_ACTIVE_HIGH>;
+		gpios = <&sled5_ioexp 1 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -277,7 +277,7 @@ vbus_sled6: vbus_sled6 {
 		regulator-name = "vbus_sled6";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&sled6_ioexp 1 GPIO_ACTIVE_HIGH>;
+		gpios = <&sled6_ioexp 1 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 };
diff --git a/arch/arm/boot/dts/broadcom/bcm2711-rpi-4-b.dts b/arch/arm/boot/dts/broadcom/bcm2711-rpi-4-b.dts
index 353bb50ce542..a8a4bc6b155f 100644
--- a/arch/arm/boot/dts/broadcom/bcm2711-rpi-4-b.dts
+++ b/arch/arm/boot/dts/broadcom/bcm2711-rpi-4-b.dts
@@ -20,7 +20,7 @@ cam1_reg: regulator-cam1 {
 		compatible = "regulator-fixed";
 		regulator-name = "cam1-reg";
 		enable-active-high;
-		gpio = <&expgpio 5 GPIO_ACTIVE_HIGH>;
+		gpios = <&expgpio 5 GPIO_ACTIVE_HIGH>;
 	};
 
 	sd_io_1v8_reg: regulator-sd-io-1v8 {
@@ -44,7 +44,7 @@ sd_vcc_reg: regulator-sd-vcc {
 		regulator-max-microvolt = <3300000>;
 		regulator-boot-on;
 		enable-active-high;
-		gpio = <&expgpio 6 GPIO_ACTIVE_HIGH>;
+		gpios = <&expgpio 6 GPIO_ACTIVE_HIGH>;
 	};
 };
 
diff --git a/arch/arm/boot/dts/broadcom/bcm2711-rpi-cm4.dtsi b/arch/arm/boot/dts/broadcom/bcm2711-rpi-cm4.dtsi
index 48e63ab7848c..07e1f9c31a20 100644
--- a/arch/arm/boot/dts/broadcom/bcm2711-rpi-cm4.dtsi
+++ b/arch/arm/boot/dts/broadcom/bcm2711-rpi-cm4.dtsi
@@ -33,7 +33,7 @@ sd_vcc_reg: regulator-sd-vcc {
 		regulator-max-microvolt = <3300000>;
 		regulator-boot-on;
 		enable-active-high;
-		gpio = <&expgpio 6 GPIO_ACTIVE_HIGH>;
+		gpios = <&expgpio 6 GPIO_ACTIVE_HIGH>;
 	};
 };
 
diff --git a/arch/arm/boot/dts/cirrus/ep7211-edb7211.dts b/arch/arm/boot/dts/cirrus/ep7211-edb7211.dts
index 808cd5778e27..2db8e03b99d5 100644
--- a/arch/arm/boot/dts/cirrus/ep7211-edb7211.dts
+++ b/arch/arm/boot/dts/cirrus/ep7211-edb7211.dts
@@ -59,7 +59,7 @@ lcddc: lcddc {
 		regulator-name = "BACKLIGHT ENABLE";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&portd 1 GPIO_ACTIVE_HIGH>;
+		gpios = <&portd 1 GPIO_ACTIVE_HIGH>;
 	};
 
 	blen: blen {
@@ -67,7 +67,7 @@ blen: blen {
 		regulator-name = "BACKLIGHT ENABLE";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&portd 3 GPIO_ACTIVE_HIGH>;
+		gpios = <&portd 3 GPIO_ACTIVE_HIGH>;
 	};
 };
 
diff --git a/arch/arm/boot/dts/gemini/gemini-dlink-dir-685.dts b/arch/arm/boot/dts/gemini/gemini-dlink-dir-685.dts
index b4dbcf8f168e..df12f7eb68ea 100644
--- a/arch/arm/boot/dts/gemini/gemini-dlink-dir-685.dts
+++ b/arch/arm/boot/dts/gemini/gemini-dlink-dir-685.dts
@@ -51,7 +51,7 @@ vdisp: regulator {
 		regulator-min-microvolt = <3600000>;
 		regulator-max-microvolt = <3600000>;
 		/* Collides with LCD E */
-		gpio = <&gpio0 16 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio0 16 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/intel/pxa/pxa300-raumfeld-common.dtsi b/arch/arm/boot/dts/intel/pxa/pxa300-raumfeld-common.dtsi
index 147c99191dc2..f9bc3b56c4b9 100644
--- a/arch/arm/boot/dts/intel/pxa/pxa300-raumfeld-common.dtsi
+++ b/arch/arm/boot/dts/intel/pxa/pxa300-raumfeld-common.dtsi
@@ -40,7 +40,7 @@ reg_va_5v0: regulator-va-5v0 {
 		regulator-name = "va-5v0-fixed-supply";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio 124 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio 124 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/intel/pxa/pxa300-raumfeld-controller.dts b/arch/arm/boot/dts/intel/pxa/pxa300-raumfeld-controller.dts
index 12b15945ac6d..b2a2c6d42b03 100644
--- a/arch/arm/boot/dts/intel/pxa/pxa300-raumfeld-controller.dts
+++ b/arch/arm/boot/dts/intel/pxa/pxa300-raumfeld-controller.dts
@@ -21,7 +21,7 @@ lcd_supply: regulator-va-tft {
 		regulator-name = "va-tft-fixed-supply";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio 33 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio 33 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/intel/socfpga/socfpga_cyclone5_vining_fpga.dts b/arch/arm/boot/dts/intel/socfpga/socfpga_cyclone5_vining_fpga.dts
index 84f39dec3c42..83fe39337146 100644
--- a/arch/arm/boot/dts/intel/socfpga/socfpga_cyclone5_vining_fpga.dts
+++ b/arch/arm/boot/dts/intel/socfpga/socfpga_cyclone5_vining_fpga.dts
@@ -70,7 +70,7 @@ regulator-usb-nrst {
 		regulator-name = "usb_nrst";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&portb 5 GPIO_ACTIVE_HIGH>;
+		gpios = <&portb 5 GPIO_ACTIVE_HIGH>;
 		startup-delay-us = <70000>;
 		enable-active-high;
 		regulator-always-on;
diff --git a/arch/arm/boot/dts/marvell/armada-370-dlink-dns327l.dts b/arch/arm/boot/dts/marvell/armada-370-dlink-dns327l.dts
index d4c4efabd254..3667dd6baa3e 100644
--- a/arch/arm/boot/dts/marvell/armada-370-dlink-dns327l.dts
+++ b/arch/arm/boot/dts/marvell/armada-370-dlink-dns327l.dts
@@ -115,7 +115,7 @@ usb_power: regulator-1 {
 		enable-active-high;
 		regulator-boot-on;
 		regulator-always-on;
-		gpio = <&gpio0 13 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio0 13 GPIO_ACTIVE_HIGH>;
 	};
 
 	sata_r_power: regulator-2 {
@@ -129,7 +129,7 @@ sata_r_power: regulator-2 {
 		enable-active-high;
 		regulator-always-on;
 		regulator-boot-on;
-		gpio = <&gpio1 22 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 22 GPIO_ACTIVE_HIGH>;
 	};
 
 	sata_l_power: regulator-3 {
@@ -143,7 +143,7 @@ sata_l_power: regulator-3 {
 		enable-active-high;
 		regulator-always-on;
 		regulator-boot-on;
-		gpio = <&gpio1 24 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 24 GPIO_ACTIVE_HIGH>;
 	};
 };
 
diff --git a/arch/arm/boot/dts/marvell/armada-370-seagate-nas-4bay.dts b/arch/arm/boot/dts/marvell/armada-370-seagate-nas-4bay.dts
index 3011578a3124..1d8629ab8d93 100644
--- a/arch/arm/boot/dts/marvell/armada-370-seagate-nas-4bay.dts
+++ b/arch/arm/boot/dts/marvell/armada-370-seagate-nas-4bay.dts
@@ -54,7 +54,7 @@ regulator-3 {
 		enable-active-high;
 		regulator-always-on;
 		regulator-boot-on;
-		gpio = <&pca9554 6 GPIO_ACTIVE_HIGH>;
+		gpios = <&pca9554 6 GPIO_ACTIVE_HIGH>;
 	};
 
 	regulator-4 {
@@ -65,7 +65,7 @@ regulator-4 {
 		enable-active-high;
 		regulator-always-on;
 		regulator-boot-on;
-		gpio = <&pca9554 7 GPIO_ACTIVE_HIGH>;
+		gpios = <&pca9554 7 GPIO_ACTIVE_HIGH>;
 	};
 
 	gpio-leds {
diff --git a/arch/arm/boot/dts/marvell/armada-370-seagate-nas-xbay.dtsi b/arch/arm/boot/dts/marvell/armada-370-seagate-nas-xbay.dtsi
index ffb3179033e7..78f308e58d6e 100644
--- a/arch/arm/boot/dts/marvell/armada-370-seagate-nas-xbay.dtsi
+++ b/arch/arm/boot/dts/marvell/armada-370-seagate-nas-xbay.dtsi
@@ -78,7 +78,7 @@ regulator-1 {
 		enable-active-high;
 		regulator-always-on;
 		regulator-boot-on;
-		gpio = <&gpio1 18 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 18 GPIO_ACTIVE_HIGH>;
 	};
 
 	regulator-2 {
@@ -89,7 +89,7 @@ regulator-2 {
 		enable-active-high;
 		regulator-always-on;
 		regulator-boot-on;
-		gpio = <&gpio1 22 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 22 GPIO_ACTIVE_HIGH>;
 	};
 
 	gpio-fan {
diff --git a/arch/arm/boot/dts/marvell/armada-370-seagate-personal-cloud-2bay.dts b/arch/arm/boot/dts/marvell/armada-370-seagate-personal-cloud-2bay.dts
index 45d8ec5dfeb7..4e60177198a9 100644
--- a/arch/arm/boot/dts/marvell/armada-370-seagate-personal-cloud-2bay.dts
+++ b/arch/arm/boot/dts/marvell/armada-370-seagate-personal-cloud-2bay.dts
@@ -40,6 +40,6 @@ regulator-2 {
 		enable-active-high;
 		regulator-always-on;
 		regulator-boot-on;
-		gpio = <&gpio1 22 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 22 GPIO_ACTIVE_HIGH>;
 	};
 };
diff --git a/arch/arm/boot/dts/marvell/armada-370-seagate-personal-cloud.dtsi b/arch/arm/boot/dts/marvell/armada-370-seagate-personal-cloud.dtsi
index 054124857235..0b250930f41e 100644
--- a/arch/arm/boot/dts/marvell/armada-370-seagate-personal-cloud.dtsi
+++ b/arch/arm/boot/dts/marvell/armada-370-seagate-personal-cloud.dtsi
@@ -60,7 +60,7 @@ regulator-0 {
 		regulator-max-microvolt = <5000000>;
 		regulator-always-on;
 		regulator-boot-on;
-		gpio = <&gpio1 27 GPIO_ACTIVE_LOW>;
+		gpios = <&gpio1 27 GPIO_ACTIVE_LOW>;
 	};
 
 	regulator-1 {
@@ -71,7 +71,7 @@ regulator-1 {
 		enable-active-high;
 		regulator-always-on;
 		regulator-boot-on;
-		gpio = <&gpio1 18 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 18 GPIO_ACTIVE_HIGH>;
 	};
 
 	gpio-keys {
diff --git a/arch/arm/boot/dts/marvell/armada-370-synology-ds213j.dts b/arch/arm/boot/dts/marvell/armada-370-synology-ds213j.dts
index 02599a3e9816..3fd09e6745f8 100644
--- a/arch/arm/boot/dts/marvell/armada-370-synology-ds213j.dts
+++ b/arch/arm/boot/dts/marvell/armada-370-synology-ds213j.dts
@@ -151,7 +151,7 @@ sata1_regulator: sata1-regulator-1 {
 		enable-active-high;
 		regulator-always-on;
 		regulator-boot-on;
-		gpio = <&gpio1 5 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 5 GPIO_ACTIVE_HIGH>;
 		pinctrl-0 = <&sata1_pwr_pin>;
 		pinctrl-names = "default";
 	};
@@ -165,7 +165,7 @@ sata2_regulator: sata2-regulator-2 {
 		enable-active-high;
 		regulator-always-on;
 		regulator-boot-on;
-		gpio = <&gpio1 30 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 30 GPIO_ACTIVE_HIGH>;
 		pinctrl-0 = <&sata2_pwr_pin>;
 		pinctrl-names = "default";
 	};
diff --git a/arch/arm/boot/dts/marvell/armada-385-clearfog-gtr.dtsi b/arch/arm/boot/dts/marvell/armada-385-clearfog-gtr.dtsi
index 8208c6a9627a..323786853203 100644
--- a/arch/arm/boot/dts/marvell/armada-385-clearfog-gtr.dtsi
+++ b/arch/arm/boot/dts/marvell/armada-385-clearfog-gtr.dtsi
@@ -104,7 +104,7 @@ reg_5p0v: regulator-5p0v {
 
 	v_usb3_con: regulator-v-usb3-con {
 		compatible = "regulator-fixed";
-		gpio = <&gpio0 22 GPIO_ACTIVE_LOW>;
+		gpios = <&gpio0 22 GPIO_ACTIVE_LOW>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&cf_gtr_usb3_con_vbus>;
 		regulator-max-microvolt = <5000000>;
diff --git a/arch/arm/boot/dts/marvell/armada-385-db-ap.dts b/arch/arm/boot/dts/marvell/armada-385-db-ap.dts
index 332f8fce77dc..112a4b35b81f 100644
--- a/arch/arm/boot/dts/marvell/armada-385-db-ap.dts
+++ b/arch/arm/boot/dts/marvell/armada-385-db-ap.dts
@@ -183,7 +183,7 @@ reg_xhci0_vbus: xhci0-vbus {
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
 		enable-active-high;
-		gpio = <&gpio1 12 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 12 GPIO_ACTIVE_HIGH>;
 	};
 };
 
diff --git a/arch/arm/boot/dts/marvell/armada-385-linksys-rango.dts b/arch/arm/boot/dts/marvell/armada-385-linksys-rango.dts
index 4ab45f294de2..3b226b182d3f 100644
--- a/arch/arm/boot/dts/marvell/armada-385-linksys-rango.dts
+++ b/arch/arm/boot/dts/marvell/armada-385-linksys-rango.dts
@@ -168,7 +168,7 @@ &sdhci {
 };
 
 &usb3_1_vbus {
-	gpio = <&gpio1 12 GPIO_ACTIVE_HIGH>;
+	gpios = <&gpio1 12 GPIO_ACTIVE_HIGH>;
 };
 
 &usb3_1_vbus_pins {
diff --git a/arch/arm/boot/dts/marvell/armada-385-linksys.dtsi b/arch/arm/boot/dts/marvell/armada-385-linksys.dtsi
index 4116ed60f709..b98c4da01cea 100644
--- a/arch/arm/boot/dts/marvell/armada-385-linksys.dtsi
+++ b/arch/arm/boot/dts/marvell/armada-385-linksys.dtsi
@@ -45,7 +45,7 @@ usb3_1_vbus: usb3_1-vbus {
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
 		enable-active-high;
-		gpio = <&gpio1 18 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 18 GPIO_ACTIVE_HIGH>;
 	};
 
 	gpio_keys: gpio-keys {
diff --git a/arch/arm/boot/dts/marvell/armada-385-synology-ds116.dts b/arch/arm/boot/dts/marvell/armada-385-synology-ds116.dts
index 6caa5c50175a..752e92fc8d25 100644
--- a/arch/arm/boot/dts/marvell/armada-385-synology-ds116.dts
+++ b/arch/arm/boot/dts/marvell/armada-385-synology-ds116.dts
@@ -177,7 +177,7 @@ reg_usb3_0_vbus: usb3-vbus0 {
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
 		enable-active-high;
-		gpio = <&gpio1 26 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 26 GPIO_ACTIVE_HIGH>;
 	};
 
 	reg_usb3_1_vbus: usb3-vbus1 {
@@ -188,7 +188,7 @@ reg_usb3_1_vbus: usb3-vbus1 {
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
 		enable-active-high;
-		gpio = <&gpio1 27 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 27 GPIO_ACTIVE_HIGH>;
 	};
 
 	reg_sata0: pwr-sata0 {
@@ -198,7 +198,7 @@ reg_sata0: pwr-sata0 {
 		regulator-max-microvolt = <12000000>;
 		enable-active-high;
 		regulator-boot-on;
-		gpio = <&gpio0 15 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio0 15 GPIO_ACTIVE_HIGH>;
 	};
 
 	reg_5v_sata0: v5-sata0 {
diff --git a/arch/arm/boot/dts/marvell/armada-388-gp.dts b/arch/arm/boot/dts/marvell/armada-388-gp.dts
index 1de0a172aa5f..5155ab40d6a3 100644
--- a/arch/arm/boot/dts/marvell/armada-388-gp.dts
+++ b/arch/arm/boot/dts/marvell/armada-388-gp.dts
@@ -260,7 +260,7 @@ reg_usb3_vbus: usb3-vbus {
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
 		enable-active-high;
-		gpio = <&expander1 15 GPIO_ACTIVE_HIGH>;
+		gpios = <&expander1 15 GPIO_ACTIVE_HIGH>;
 	};
 
 	reg_usb2_0_vbus: v5-vbus0 {
@@ -270,7 +270,7 @@ reg_usb2_0_vbus: v5-vbus0 {
 		regulator-max-microvolt = <5000000>;
 		enable-active-high;
 		regulator-always-on;
-		gpio = <&expander1 14 GPIO_ACTIVE_HIGH>;
+		gpios = <&expander1 14 GPIO_ACTIVE_HIGH>;
 	};
 
 	reg_usb2_1_vbus: v5-vbus1 {
@@ -279,7 +279,7 @@ reg_usb2_1_vbus: v5-vbus1 {
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
 		enable-active-high;
-		gpio = <&expander0 4 GPIO_ACTIVE_HIGH>;
+		gpios = <&expander0 4 GPIO_ACTIVE_HIGH>;
 	};
 
 	reg_sata0: pwr-sata0 {
@@ -289,7 +289,7 @@ reg_sata0: pwr-sata0 {
 		regulator-max-microvolt = <12000000>;
 		enable-active-high;
 		regulator-boot-on;
-		gpio = <&expander0 2 GPIO_ACTIVE_HIGH>;
+		gpios = <&expander0 2 GPIO_ACTIVE_HIGH>;
 	};
 
 	reg_5v_sata0: v5-sata0 {
@@ -315,7 +315,7 @@ reg_sata1: pwr-sata1 {
 		regulator-max-microvolt = <12000000>;
 		enable-active-high;
 		regulator-boot-on;
-		gpio = <&expander0 3 GPIO_ACTIVE_HIGH>;
+		gpios = <&expander0 3 GPIO_ACTIVE_HIGH>;
 	};
 
 	reg_5v_sata1: v5-sata1 {
@@ -339,7 +339,7 @@ reg_sata2: pwr-sata2 {
 		regulator-name = "pwr_en_sata2";
 		enable-active-high;
 		regulator-boot-on;
-		gpio = <&expander0 11 GPIO_ACTIVE_HIGH>;
+		gpios = <&expander0 11 GPIO_ACTIVE_HIGH>;
 	};
 
 	reg_5v_sata2: v5-sata2 {
@@ -363,7 +363,7 @@ reg_sata3: pwr-sata3 {
 		regulator-name = "pwr_en_sata3";
 		enable-active-high;
 		regulator-boot-on;
-		gpio = <&expander0 12 GPIO_ACTIVE_HIGH>;
+		gpios = <&expander0 12 GPIO_ACTIVE_HIGH>;
 	};
 
 	reg_5v_sata3: v5-sata3 {
diff --git a/arch/arm/boot/dts/marvell/armada-388-helios4.dts b/arch/arm/boot/dts/marvell/armada-388-helios4.dts
index ec134e22bae3..d26235d6843c 100644
--- a/arch/arm/boot/dts/marvell/armada-388-helios4.dts
+++ b/arch/arm/boot/dts/marvell/armada-388-helios4.dts
@@ -64,7 +64,7 @@ reg_5p0v_usb: regulator-5v-usb {
 		regulator-boot-on;
 		regulator-always-on;
 		enable-active-high;
-		gpio = <&expander0 6 GPIO_ACTIVE_HIGH>;
+		gpios = <&expander0 6 GPIO_ACTIVE_HIGH>;
 		vin-supply = <&reg_12v>;
 	};
 
diff --git a/arch/arm/boot/dts/marvell/armada-xp-synology-ds414.dts b/arch/arm/boot/dts/marvell/armada-xp-synology-ds414.dts
index 1b65059794bf..1c7c22dc680d 100644
--- a/arch/arm/boot/dts/marvell/armada-xp-synology-ds414.dts
+++ b/arch/arm/boot/dts/marvell/armada-xp-synology-ds414.dts
@@ -118,7 +118,7 @@ sata1_regulator: sata1-regulator-1 {
 		enable-active-high;
 		regulator-always-on;
 		regulator-boot-on;
-		gpio = <&gpio1 10 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 10 GPIO_ACTIVE_HIGH>;
 		pinctrl-0 = <&sata1_pwr_pin>;
 		pinctrl-names = "default";
 	};
@@ -132,7 +132,7 @@ sata2_regulator: sata2-regulator-2 {
 		enable-active-high;
 		regulator-always-on;
 		regulator-boot-on;
-		gpio = <&gpio1 12 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 12 GPIO_ACTIVE_HIGH>;
 		pinctrl-0 = <&sata2_pwr_pin>;
 		pinctrl-names = "default";
 	};
@@ -146,7 +146,7 @@ sata3_regulator: sata3-regulator-3 {
 		enable-active-high;
 		regulator-always-on;
 		regulator-boot-on;
-		gpio = <&gpio1 13 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 13 GPIO_ACTIVE_HIGH>;
 		pinctrl-0 = <&sata3_pwr_pin>;
 		pinctrl-names = "default";
 	};
@@ -160,7 +160,7 @@ sata4_regulator: sata4-regulator-4 {
 		enable-active-high;
 		regulator-always-on;
 		regulator-boot-on;
-		gpio = <&gpio1 14 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 14 GPIO_ACTIVE_HIGH>;
 		pinctrl-0 = <&sata4_pwr_pin>;
 		pinctrl-names = "default";
 	};
diff --git a/arch/arm/boot/dts/marvell/dove-cm-a510.dtsi b/arch/arm/boot/dts/marvell/dove-cm-a510.dtsi
index 621cb145a8f6..f2119efc1e6f 100644
--- a/arch/arm/boot/dts/marvell/dove-cm-a510.dtsi
+++ b/arch/arm/boot/dts/marvell/dove-cm-a510.dtsi
@@ -113,7 +113,7 @@ wifi_power: regulator-1 {
 		regulator-name = "WiFi Power";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio2 7 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio2 7 GPIO_ACTIVE_HIGH>;
 	};
 };
 
diff --git a/arch/arm/boot/dts/marvell/dove-cubox.dts b/arch/arm/boot/dts/marvell/dove-cubox.dts
index bcaaf8320c45..ff2470c95fb9 100644
--- a/arch/arm/boot/dts/marvell/dove-cubox.dts
+++ b/arch/arm/boot/dts/marvell/dove-cubox.dts
@@ -36,7 +36,7 @@ usb_power: regulator-1 {
 		enable-active-high;
 		regulator-always-on;
 		regulator-boot-on;
-		gpio = <&gpio0 1 0>;
+		gpios = <&gpio0 1 0>;
 		pinctrl-0 = <&pmx_gpio_1>;
 		pinctrl-names = "default";
 	};
diff --git a/arch/arm/boot/dts/marvell/dove-d3plug.dts b/arch/arm/boot/dts/marvell/dove-d3plug.dts
index a451fd576990..7c119a977a60 100644
--- a/arch/arm/boot/dts/marvell/dove-d3plug.dts
+++ b/arch/arm/boot/dts/marvell/dove-d3plug.dts
@@ -45,7 +45,7 @@ usb_power: regulator-1 {
 		enable-active-high;
 		regulator-always-on;
 		regulator-boot-on;
-		gpio = <&gpio0 8 0>;
+		gpios = <&gpio0 8 0>;
 		pinctrl-0 = <&pmx_gpio_8>;
 		pinctrl-names = "default";
 	};
diff --git a/arch/arm/boot/dts/marvell/dove-sbc-a510.dts b/arch/arm/boot/dts/marvell/dove-sbc-a510.dts
index 8585ee5533bf..87515d644943 100644
--- a/arch/arm/boot/dts/marvell/dove-sbc-a510.dts
+++ b/arch/arm/boot/dts/marvell/dove-sbc-a510.dts
@@ -81,7 +81,7 @@ usb0_power: regulator-2 {
 		regulator-name = "USB Power";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio_ext 0 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio_ext 0 GPIO_ACTIVE_HIGH>;
 	};
 
 	mmc_power: regulator-3 {
@@ -89,7 +89,7 @@ mmc_power: regulator-3 {
 		regulator-name = "MMC Power";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio_ext 13 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio_ext 13 GPIO_ACTIVE_HIGH>;
 	};
 };
 
diff --git a/arch/arm/boot/dts/marvell/kirkwood-blackarmor-nas220.dts b/arch/arm/boot/dts/marvell/kirkwood-blackarmor-nas220.dts
index 36b90c632fd6..96978e8a4cc1 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-blackarmor-nas220.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-blackarmor-nas220.dts
@@ -74,7 +74,7 @@ sata0_power: regulator at 1 {
 			enable-active-high;
 			regulator-always-on;
 			regulator-boot-on;
-			gpio = <&gpio0 24 GPIO_ACTIVE_LOW>;
+			gpios = <&gpio0 24 GPIO_ACTIVE_LOW>;
 		};
 
 		sata1_power: regulator at 2 {
@@ -86,7 +86,7 @@ sata1_power: regulator at 2 {
 			enable-active-high;
 			regulator-always-on;
 			regulator-boot-on;
-			gpio = <&gpio0 28 GPIO_ACTIVE_LOW>;
+			gpios = <&gpio0 28 GPIO_ACTIVE_LOW>;
 		};
 	};
 };
diff --git a/arch/arm/boot/dts/marvell/kirkwood-dnskw.dtsi b/arch/arm/boot/dts/marvell/kirkwood-dnskw.dtsi
index 20bcd031f3f5..9863919f9637 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-dnskw.dtsi
+++ b/arch/arm/boot/dts/marvell/kirkwood-dnskw.dtsi
@@ -165,7 +165,7 @@ sata0_power: regulator at 1 {
 			enable-active-high;
 			regulator-always-on;
 			regulator-boot-on;
-			gpio = <&gpio1 7 0>;
+			gpios = <&gpio1 7 0>;
 		};
 		sata1_power: regulator at 2 {
 			compatible = "regulator-fixed";
@@ -176,7 +176,7 @@ sata1_power: regulator at 2 {
 			enable-active-high;
 			regulator-always-on;
 			regulator-boot-on;
-			gpio = <&gpio1 8 0>;
+			gpios = <&gpio1 8 0>;
 		};
 	};
 };
diff --git a/arch/arm/boot/dts/marvell/kirkwood-dockstar.dts b/arch/arm/boot/dts/marvell/kirkwood-dockstar.dts
index 090f1e2e5bb6..f5af8822d57a 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-dockstar.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-dockstar.dts
@@ -68,7 +68,7 @@ usb_power: regulator at 1 {
 			enable-active-high;
 			regulator-always-on;
 			regulator-boot-on;
-			gpio = <&gpio0 29 0>;
+			gpios = <&gpio0 29 0>;
 		};
 	};
 };
diff --git a/arch/arm/boot/dts/marvell/kirkwood-goflexnet.dts b/arch/arm/boot/dts/marvell/kirkwood-goflexnet.dts
index d5ac4e3974da..c68fca9e77c7 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-goflexnet.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-goflexnet.dts
@@ -143,7 +143,7 @@ usb_power: regulator at 1 {
 			enable-active-high;
 			regulator-always-on;
 			regulator-boot-on;
-			gpio = <&gpio0 29 GPIO_ACTIVE_HIGH>;
+			gpios = <&gpio0 29 GPIO_ACTIVE_HIGH>;
 		};
 	};
 };
diff --git a/arch/arm/boot/dts/marvell/kirkwood-l-50.dts b/arch/arm/boot/dts/marvell/kirkwood-l-50.dts
index 974bc9de4702..abe432277dac 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-l-50.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-l-50.dts
@@ -154,7 +154,7 @@ usb2_pwr {
 
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio3 3 GPIO_ACTIVE_LOW>;
+		gpios = <&gpio3 3 GPIO_ACTIVE_LOW>;
 		regulator-always-on;
 	};
 
@@ -164,7 +164,7 @@ usb1_pwr {
 
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio3 4 GPIO_ACTIVE_LOW>;
+		gpios = <&gpio3 4 GPIO_ACTIVE_LOW>;
 		regulator-always-on;
 	};
 
@@ -174,7 +174,7 @@ mpcie_pwr {
 
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio3 5 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 5 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		regulator-always-on;
 	};
@@ -185,7 +185,7 @@ express_card_pwr {
 
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio3 7 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 7 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		regulator-always-on;
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-laplug.dts b/arch/arm/boot/dts/marvell/kirkwood-laplug.dts
index 90ea6cdee8e0..dff87be3afa6 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-laplug.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-laplug.dts
@@ -93,7 +93,7 @@ usb_power_back1: regulator at 1 {
 			enable-active-high;
 			regulator-always-on;
 			regulator-boot-on;
-			gpio = <&gpio0 15 GPIO_ACTIVE_HIGH>;
+			gpios = <&gpio0 15 GPIO_ACTIVE_HIGH>;
 		};
 
 		usb_power_back2: regulator at 2 {
@@ -105,7 +105,7 @@ usb_power_back2: regulator at 2 {
 			enable-active-high;
 			regulator-always-on;
 			regulator-boot-on;
-			gpio = <&gpio0 28 GPIO_ACTIVE_HIGH>;
+			gpios = <&gpio0 28 GPIO_ACTIVE_HIGH>;
 		};
 
 		usb_power_front: regulator at 3 {
@@ -117,7 +117,7 @@ usb_power_front: regulator at 3 {
 			enable-active-high;
 			regulator-always-on;
 			regulator-boot-on;
-			gpio = <&gpio1 3 GPIO_ACTIVE_HIGH>;
+			gpios = <&gpio1 3 GPIO_ACTIVE_HIGH>;
 		};
 	};
 };
diff --git a/arch/arm/boot/dts/marvell/kirkwood-linkstation-6282.dtsi b/arch/arm/boot/dts/marvell/kirkwood-linkstation-6282.dtsi
index dfac2045a1eb..164e50bad9ae 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-linkstation-6282.dtsi
+++ b/arch/arm/boot/dts/marvell/kirkwood-linkstation-6282.dtsi
@@ -129,11 +129,11 @@ gpio_fan {
 
 	regulators {
 		usb_power: regulator at 1 {
-			gpio = <&gpio0 12 GPIO_ACTIVE_HIGH>;
+			gpios = <&gpio0 12 GPIO_ACTIVE_HIGH>;
 		};
 
 		hdd_power0: regulator at 2 {
-			gpio = <&gpio0 8 GPIO_ACTIVE_HIGH>;
+			gpios = <&gpio0 8 GPIO_ACTIVE_HIGH>;
 		};
 	};
 };
diff --git a/arch/arm/boot/dts/marvell/kirkwood-linkstation-duo-6281.dtsi b/arch/arm/boot/dts/marvell/kirkwood-linkstation-duo-6281.dtsi
index ba629e02ba31..60ae04ca9e4a 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-linkstation-duo-6281.dtsi
+++ b/arch/arm/boot/dts/marvell/kirkwood-linkstation-duo-6281.dtsi
@@ -110,11 +110,11 @@ regulators {
 		pinctrl-0 = <&pmx_power_hdd0 &pmx_power_hdd1 &pmx_usb_vbus>;
 
 		usb_power: regulator at 1 {
-			gpio = <&gpio1 5 GPIO_ACTIVE_HIGH>;
+			gpios = <&gpio1 5 GPIO_ACTIVE_HIGH>;
 		};
 
 		hdd_power0: regulator at 2 {
-			gpio = <&gpio0 28 GPIO_ACTIVE_HIGH>;
+			gpios = <&gpio0 28 GPIO_ACTIVE_HIGH>;
 		};
 
 		hdd_power1: regulator at 3 {
@@ -126,7 +126,7 @@ hdd_power1: regulator at 3 {
 			enable-active-high;
 			regulator-always-on;
 			regulator-boot-on;
-			gpio = <&gpio0 29 GPIO_ACTIVE_HIGH>;
+			gpios = <&gpio0 29 GPIO_ACTIVE_HIGH>;
 		};
 	};
 };
diff --git a/arch/arm/boot/dts/marvell/kirkwood-linkstation-lsqvl.dts b/arch/arm/boot/dts/marvell/kirkwood-linkstation-lsqvl.dts
index 8bb381088910..2807942d39f1 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-linkstation-lsqvl.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-linkstation-lsqvl.dts
@@ -92,7 +92,7 @@ hdd_power1: regulator at 3 {
 			enable-active-high;
 			regulator-always-on;
 			regulator-boot-on;
-			gpio = <&gpio0 9 GPIO_ACTIVE_HIGH>;
+			gpios = <&gpio0 9 GPIO_ACTIVE_HIGH>;
 		};
 	};
 };
diff --git a/arch/arm/boot/dts/marvell/kirkwood-linkstation-lswvl.dts b/arch/arm/boot/dts/marvell/kirkwood-linkstation-lswvl.dts
index e0f62adc0d5d..0969619549f6 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-linkstation-lswvl.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-linkstation-lswvl.dts
@@ -69,7 +69,7 @@ hdd_power1: regulator at 3 {
 			enable-active-high;
 			regulator-always-on;
 			regulator-boot-on;
-			gpio = <&gpio0 9 GPIO_ACTIVE_HIGH>;
+			gpios = <&gpio0 9 GPIO_ACTIVE_HIGH>;
 		};
 	};
 };
diff --git a/arch/arm/boot/dts/marvell/kirkwood-lsxl.dtsi b/arch/arm/boot/dts/marvell/kirkwood-lsxl.dtsi
index 5e0b139dd4fb..d1b154eb3135 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-lsxl.dtsi
+++ b/arch/arm/boot/dts/marvell/kirkwood-lsxl.dtsi
@@ -198,7 +198,7 @@ usb_power: regulator at 1 {
 			enable-active-high;
 			regulator-always-on;
 			regulator-boot-on;
-			gpio = <&gpio0 11 0>;
+			gpios = <&gpio0 11 0>;
 		};
 		hdd_power: regulator at 2 {
 			compatible = "regulator-fixed";
@@ -209,7 +209,7 @@ hdd_power: regulator at 2 {
 			enable-active-high;
 			regulator-always-on;
 			regulator-boot-on;
-			gpio = <&gpio0 10 0>;
+			gpios = <&gpio0 10 0>;
 		};
 	};
 };
diff --git a/arch/arm/boot/dts/marvell/kirkwood-nas2big.dts b/arch/arm/boot/dts/marvell/kirkwood-nas2big.dts
index 0b0a15093146..b8c594ca9a29 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-nas2big.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-nas2big.dts
@@ -65,7 +65,7 @@ regulator at 2 {
 			enable-active-high;
 			regulator-always-on;
 			regulator-boot-on;
-			gpio = <&gpio0 17 GPIO_ACTIVE_HIGH>;
+			gpios = <&gpio0 17 GPIO_ACTIVE_HIGH>;
 		};
 		clocks {
 			g762_clk: g762-oscillator {
diff --git a/arch/arm/boot/dts/marvell/kirkwood-net2big.dts b/arch/arm/boot/dts/marvell/kirkwood-net2big.dts
index d5f6bb50ba11..06d80cb1187b 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-net2big.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-net2big.dts
@@ -42,7 +42,7 @@ regulator at 2 {
 		enable-active-high;
 		regulator-always-on;
 		regulator-boot-on;
-		gpio = <&gpio0 17 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio0 17 GPIO_ACTIVE_HIGH>;
 	};
 
 	clocks {
diff --git a/arch/arm/boot/dts/marvell/kirkwood-net5big.dts b/arch/arm/boot/dts/marvell/kirkwood-net5big.dts
index 2497ad26b5b6..0d36528af27a 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-net5big.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-net5big.dts
@@ -38,7 +38,7 @@ regulator at 2 {
 		enable-active-high;
 		regulator-always-on;
 		regulator-boot-on;
-		gpio = <&gpio0 17 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio0 17 GPIO_ACTIVE_HIGH>;
 	};
 
 	regulator at 3 {
@@ -50,7 +50,7 @@ regulator at 3 {
 		enable-active-high;
 		regulator-always-on;
 		regulator-boot-on;
-		gpio = <&gpio1 9 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 9 GPIO_ACTIVE_HIGH>;
 	};
 
 	regulator at 4 {
@@ -62,7 +62,7 @@ regulator at 4 {
 		enable-active-high;
 		regulator-always-on;
 		regulator-boot-on;
-		gpio = <&gpio1 10 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 10 GPIO_ACTIVE_HIGH>;
 	};
 
 	regulator at 5 {
@@ -74,7 +74,7 @@ regulator at 5 {
 		enable-active-high;
 		regulator-always-on;
 		regulator-boot-on;
-		gpio = <&gpio1 11 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 11 GPIO_ACTIVE_HIGH>;
 	};
 
 	clocks {
diff --git a/arch/arm/boot/dts/marvell/kirkwood-netgear_readynas_duo_v2.dts b/arch/arm/boot/dts/marvell/kirkwood-netgear_readynas_duo_v2.dts
index cb564c3bcdc4..94249336d7ed 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-netgear_readynas_duo_v2.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-netgear_readynas_duo_v2.dts
@@ -188,7 +188,7 @@ usb3_regulator: usb3-regulator at 1 {
 			enable-active-high;
 			regulator-always-on;
 			regulator-boot-on;
-			gpio = <&gpio1 14 GPIO_ACTIVE_HIGH>;
+			gpios = <&gpio1 14 GPIO_ACTIVE_HIGH>;
 		};
 	};
 };
diff --git a/arch/arm/boot/dts/marvell/kirkwood-netgear_readynas_nv+_v2.dts b/arch/arm/boot/dts/marvell/kirkwood-netgear_readynas_nv+_v2.dts
index 6cf76430cfab..e1f7952e0ee3 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-netgear_readynas_nv+_v2.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-netgear_readynas_nv+_v2.dts
@@ -212,7 +212,7 @@ usb3_regulator: usb3-regulator at 1 {
 			enable-active-high;
 			regulator-always-on;
 			regulator-boot-on;
-			gpio = <&gpio1 14 GPIO_ACTIVE_HIGH>;
+			gpios = <&gpio1 14 GPIO_ACTIVE_HIGH>;
 		};
 	};
 };
diff --git a/arch/arm/boot/dts/marvell/kirkwood-netxbig.dtsi b/arch/arm/boot/dts/marvell/kirkwood-netxbig.dtsi
index d4edf2727388..e06da354e692 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-netxbig.dtsi
+++ b/arch/arm/boot/dts/marvell/kirkwood-netxbig.dtsi
@@ -99,7 +99,7 @@ regulator at 1 {
 			enable-active-high;
 			regulator-always-on;
 			regulator-boot-on;
-			gpio = <&gpio0 16 GPIO_ACTIVE_HIGH>;
+			gpios = <&gpio0 16 GPIO_ACTIVE_HIGH>;
 		};
 	};
 
diff --git a/arch/arm/boot/dts/marvell/kirkwood-nsa310s.dts b/arch/arm/boot/dts/marvell/kirkwood-nsa310s.dts
index 47deb93c90a5..8db7198741e2 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-nsa310s.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-nsa310s.dts
@@ -116,7 +116,7 @@ usb0_power: regulator at 1 {
 		regulator-max-microvolt = <5000000>;
 		regulator-always-on;
 		regulator-boot-on;
-		gpio = <&gpio0 21 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio0 21 GPIO_ACTIVE_HIGH>;
 	};
 
 	sata1_power: regulator at 2 {
@@ -127,7 +127,7 @@ sata1_power: regulator at 2 {
 		regulator-max-microvolt = <5000000>;
 		regulator-always-on;
 		regulator-boot-on;
-		gpio = <&gpio1 1 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 1 GPIO_ACTIVE_HIGH>;
 	};
 
 	thermal-zones {
diff --git a/arch/arm/boot/dts/marvell/kirkwood-nsa325.dts b/arch/arm/boot/dts/marvell/kirkwood-nsa325.dts
index f0786a5f2ce6..a6f8a4a72eb8 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-nsa325.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-nsa325.dts
@@ -149,7 +149,7 @@ sata1_power: regulator at 2 {
 			regulator-always-on;
 			regulator-boot-on;
 			enable-active-high;
-			gpio = <&gpio1 15 GPIO_ACTIVE_HIGH>;
+			gpios = <&gpio1 15 GPIO_ACTIVE_HIGH>;
 		};
 	};
 
diff --git a/arch/arm/boot/dts/marvell/kirkwood-nsa3x0-common.dtsi b/arch/arm/boot/dts/marvell/kirkwood-nsa3x0-common.dtsi
index e9bd9c551af5..b97b79827b16 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-nsa3x0-common.dtsi
+++ b/arch/arm/boot/dts/marvell/kirkwood-nsa3x0-common.dtsi
@@ -99,7 +99,7 @@ usb0_power: regulator at 1 {
 			regulator-max-microvolt = <5000000>;
 			regulator-always-on;
 			regulator-boot-on;
-			gpio = <&gpio0 21 GPIO_ACTIVE_HIGH>;
+			gpios = <&gpio0 21 GPIO_ACTIVE_HIGH>;
 		};
 	};
 };
diff --git a/arch/arm/boot/dts/marvell/kirkwood-pogo_e02.dts b/arch/arm/boot/dts/marvell/kirkwood-pogo_e02.dts
index 39a5345332da..e37df043d98a 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-pogo_e02.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-pogo_e02.dts
@@ -60,7 +60,7 @@ usb_power: regulator at 1 {
 			enable-active-high;
 			regulator-always-on;
 			regulator-boot-on;
-			gpio = <&gpio0 29 GPIO_ACTIVE_HIGH>;
+			gpios = <&gpio0 29 GPIO_ACTIVE_HIGH>;
 		};
 	};
 };
diff --git a/arch/arm/boot/dts/marvell/kirkwood-rd88f6192.dts b/arch/arm/boot/dts/marvell/kirkwood-rd88f6192.dts
index f00325ffde07..40610e1db167 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-rd88f6192.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-rd88f6192.dts
@@ -77,7 +77,7 @@ usb_power: regulator at 0 {
 			enable-active-high;
 			regulator-always-on;
 			regulator-boot-on;
-			gpio = <&gpio0 10 GPIO_ACTIVE_HIGH>;
+			gpios = <&gpio0 10 GPIO_ACTIVE_HIGH>;
 		};
 	};
 };
diff --git a/arch/arm/boot/dts/marvell/kirkwood-sheevaplug-common.dtsi b/arch/arm/boot/dts/marvell/kirkwood-sheevaplug-common.dtsi
index 0a698d3b7393..76e4d97491c7 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-sheevaplug-common.dtsi
+++ b/arch/arm/boot/dts/marvell/kirkwood-sheevaplug-common.dtsi
@@ -64,7 +64,7 @@ usb_power: regulator at 1 {
 			enable-active-high;
 			regulator-always-on;
 			regulator-boot-on;
-			gpio = <&gpio0 29 0>;
+			gpios = <&gpio0 29 0>;
 		};
 	};
 };
diff --git a/arch/arm/boot/dts/marvell/kirkwood-synology.dtsi b/arch/arm/boot/dts/marvell/kirkwood-synology.dtsi
index 6b7c5218b1fb..e7179fca80db 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-synology.dtsi
+++ b/arch/arm/boot/dts/marvell/kirkwood-synology.dtsi
@@ -614,7 +614,7 @@ regulator at 1 {
 			regulator-always-on;
 			regulator-boot-on;
 			startup-delay-us = <5000000>;
-			gpio = <&gpio0 29 GPIO_ACTIVE_HIGH>;
+			gpios = <&gpio0 29 GPIO_ACTIVE_HIGH>;
 		};
 
 		regulator at 2 {
@@ -627,7 +627,7 @@ regulator at 2 {
 			regulator-always-on;
 			regulator-boot-on;
 			startup-delay-us = <5000000>;
-			gpio = <&gpio0 31 GPIO_ACTIVE_HIGH>;
+			gpios = <&gpio0 31 GPIO_ACTIVE_HIGH>;
 		};
 	};
 
@@ -649,7 +649,7 @@ regulator at 1 {
 			regulator-always-on;
 			regulator-boot-on;
 			startup-delay-us = <5000000>;
-			gpio = <&gpio0 30 GPIO_ACTIVE_HIGH>;
+			gpios = <&gpio0 30 GPIO_ACTIVE_HIGH>;
 		};
 	};
 
@@ -671,7 +671,7 @@ regulator at 1 {
 			regulator-always-on;
 			regulator-boot-on;
 			startup-delay-us = <5000000>;
-			gpio = <&gpio0 30 GPIO_ACTIVE_HIGH>;
+			gpios = <&gpio0 30 GPIO_ACTIVE_HIGH>;
 		};
 
 		regulator at 2 {
@@ -684,7 +684,7 @@ regulator at 2 {
 			regulator-always-on;
 			regulator-boot-on;
 			startup-delay-us = <5000000>;
-			gpio = <&gpio1 2 GPIO_ACTIVE_HIGH>;
+			gpios = <&gpio1 2 GPIO_ACTIVE_HIGH>;
 		};
 	};
 
@@ -707,7 +707,7 @@ regulator at 1 {
 			regulator-always-on;
 			regulator-boot-on;
 			startup-delay-us = <5000000>;
-			gpio = <&gpio0 30 GPIO_ACTIVE_HIGH>;
+			gpios = <&gpio0 30 GPIO_ACTIVE_HIGH>;
 		};
 
 		regulator at 2 {
@@ -720,7 +720,7 @@ regulator at 2 {
 			regulator-always-on;
 			regulator-boot-on;
 			startup-delay-us = <5000000>;
-			gpio = <&gpio1 2 GPIO_ACTIVE_HIGH>;
+			gpios = <&gpio1 2 GPIO_ACTIVE_HIGH>;
 		};
 
 		regulator at 3 {
@@ -733,7 +733,7 @@ regulator at 3 {
 			regulator-always-on;
 			regulator-boot-on;
 			startup-delay-us = <5000000>;
-			gpio = <&gpio1 12 GPIO_ACTIVE_HIGH>;
+			gpios = <&gpio1 12 GPIO_ACTIVE_HIGH>;
 		};
 
 		regulator at 4 {
@@ -746,7 +746,7 @@ regulator at 4 {
 			regulator-always-on;
 			regulator-boot-on;
 			startup-delay-us = <5000000>;
-			gpio = <&gpio1 13 GPIO_ACTIVE_HIGH>;
+			gpios = <&gpio1 13 GPIO_ACTIVE_HIGH>;
 		};
 	};
 
@@ -768,7 +768,7 @@ regulator at 1 {
 			regulator-always-on;
 			regulator-boot-on;
 			startup-delay-us = <5000000>;
-			gpio = <&gpio0 31 GPIO_ACTIVE_HIGH>;
+			gpios = <&gpio0 31 GPIO_ACTIVE_HIGH>;
 		};
 	};
 
@@ -791,7 +791,7 @@ regulator at 2 {
 			regulator-always-on;
 			regulator-boot-on;
 			startup-delay-us = <5000000>;
-			gpio = <&gpio1 2 GPIO_ACTIVE_HIGH>;
+			gpios = <&gpio1 2 GPIO_ACTIVE_HIGH>;
 		};
 
 		regulator at 3 {
@@ -804,7 +804,7 @@ regulator at 3 {
 			regulator-always-on;
 			regulator-boot-on;
 			startup-delay-us = <5000000>;
-			gpio = <&gpio1 12 GPIO_ACTIVE_HIGH>;
+			gpios = <&gpio1 12 GPIO_ACTIVE_HIGH>;
 		};
 
 		regulator at 4 {
@@ -817,7 +817,7 @@ regulator at 4 {
 			regulator-always-on;
 			regulator-boot-on;
 			startup-delay-us = <5000000>;
-			gpio = <&gpio1 13 GPIO_ACTIVE_HIGH>;
+			gpios = <&gpio1 13 GPIO_ACTIVE_HIGH>;
 		};
 	};
 };
diff --git a/arch/arm/boot/dts/marvell/kirkwood-t5325.dts b/arch/arm/boot/dts/marvell/kirkwood-t5325.dts
index a6e77a487d00..7163fc819675 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-t5325.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-t5325.dts
@@ -150,7 +150,7 @@ usb_power: regulator at 1 {
 			enable-active-high;
 			regulator-always-on;
 			regulator-boot-on;
-			gpio = <&gpio1 12 GPIO_ACTIVE_HIGH>;
+			gpios = <&gpio1 12 GPIO_ACTIVE_HIGH>;
 		};
 	};
 
diff --git a/arch/arm/boot/dts/marvell/kirkwood-topkick.dts b/arch/arm/boot/dts/marvell/kirkwood-topkick.dts
index a5b51e29f63e..024a792c42c1 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-topkick.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-topkick.dts
@@ -166,7 +166,7 @@ sata0_power: regulator at 1 {
 			enable-active-high;
 			regulator-always-on;
 			regulator-boot-on;
-			gpio = <&gpio1 4 0>;
+			gpios = <&gpio1 4 0>;
 		};
 	};
 };
diff --git a/arch/arm/boot/dts/marvell/mmp2-olpc-xo-1-75.dts b/arch/arm/boot/dts/marvell/mmp2-olpc-xo-1-75.dts
index 55ea87870af3..83a4e9403be5 100644
--- a/arch/arm/boot/dts/marvell/mmp2-olpc-xo-1-75.dts
+++ b/arch/arm/boot/dts/marvell/mmp2-olpc-xo-1-75.dts
@@ -95,7 +95,7 @@ wlan_reg: fixedregulator0 {
 		regulator-name = "wlan";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio 34 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio 34 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/marvell/orion5x-lacie-d2-network.dts b/arch/arm/boot/dts/marvell/orion5x-lacie-d2-network.dts
index 12a4aac2633e..3024ef765a4c 100644
--- a/arch/arm/boot/dts/marvell/orion5x-lacie-d2-network.dts
+++ b/arch/arm/boot/dts/marvell/orion5x-lacie-d2-network.dts
@@ -73,7 +73,7 @@ sata0_power: regulator at 0 {
 			enable-active-high;
 			regulator-always-on;
 			regulator-boot-on;
-			gpio = <&gpio0 3 GPIO_ACTIVE_HIGH>;
+			gpios = <&gpio0 3 GPIO_ACTIVE_HIGH>;
 		};
 
 		sata1_power: regulator at 1 {
@@ -85,7 +85,7 @@ sata1_power: regulator at 1 {
 			enable-active-high;
 			regulator-always-on;
 			regulator-boot-on;
-			gpio = <&gpio0 12 GPIO_ACTIVE_HIGH>;
+			gpios = <&gpio0 12 GPIO_ACTIVE_HIGH>;
 		};
 	};
 };
diff --git a/arch/arm/boot/dts/marvell/orion5x-lswsgl.dts b/arch/arm/boot/dts/marvell/orion5x-lswsgl.dts
index e0da406c430f..938360157f44 100644
--- a/arch/arm/boot/dts/marvell/orion5x-lswsgl.dts
+++ b/arch/arm/boot/dts/marvell/orion5x-lswsgl.dts
@@ -144,7 +144,7 @@ sata0_power: regulator at 0 {
 			enable-active-high;
 			regulator-always-on;
 			regulator-boot-on;
-			gpio = <&gpio0 1 GPIO_ACTIVE_HIGH>;
+			gpios = <&gpio0 1 GPIO_ACTIVE_HIGH>;
 		};
 
 		sata1_power: regulator at 1 {
@@ -156,7 +156,7 @@ sata1_power: regulator at 1 {
 			enable-active-high;
 			regulator-always-on;
 			regulator-boot-on;
-			gpio = <&gpio0 19 GPIO_ACTIVE_HIGH>;
+			gpios = <&gpio0 19 GPIO_ACTIVE_HIGH>;
 		};
 
 		usb_power: regulator at 2 {
@@ -168,7 +168,7 @@ usb_power: regulator at 2 {
 			enable-active-high;
 			regulator-always-on;
 			regulator-boot-on;
-			gpio = <&gpio0 16 GPIO_ACTIVE_HIGH>;
+			gpios = <&gpio0 16 GPIO_ACTIVE_HIGH>;
 		};
 	};
 };
diff --git a/arch/arm/boot/dts/mediatek/mt2701-evb.dts b/arch/arm/boot/dts/mediatek/mt2701-evb.dts
index 4c76366aa938..d1a4d2e3825d 100644
--- a/arch/arm/boot/dts/mediatek/mt2701-evb.dts
+++ b/arch/arm/boot/dts/mediatek/mt2701-evb.dts
@@ -68,7 +68,7 @@ usb_vbus: regulator at 0 {
 		regulator-name = "usb_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&pio 45 GPIO_ACTIVE_HIGH>;
+		gpios = <&pio 45 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 };
diff --git a/arch/arm/boot/dts/microchip/at91-kizbox3-hs.dts b/arch/arm/boot/dts/microchip/at91-kizbox3-hs.dts
index fec7269088d1..5f183f4c7839 100644
--- a/arch/arm/boot/dts/microchip/at91-kizbox3-hs.dts
+++ b/arch/arm/boot/dts/microchip/at91-kizbox3-hs.dts
@@ -110,75 +110,75 @@ gpios {
 
 		rf_on {
 			label = "rf on";
-			gpio = <&pioA PIN_PC19 GPIO_ACTIVE_HIGH>;
+			gpios = <&pioA PIN_PC19 GPIO_ACTIVE_HIGH>;
 			output;
 			init-low;
 		};
 
 		wifi_on {
 			label = "wifi on";
-			gpio = <&pioA PIN_PC20 GPIO_ACTIVE_HIGH>;
+			gpios = <&pioA PIN_PC20 GPIO_ACTIVE_HIGH>;
 			output;
 			init-low;
 		};
 
 		zbe_test_radio {
 			label = "zbe test radio";
-			gpio = <&pioA PIN_PB21 GPIO_ACTIVE_HIGH>;
+			gpios = <&pioA PIN_PB21 GPIO_ACTIVE_HIGH>;
 			output;
 			init-low;
 		};
 
 		zbe_rst {
 			label = "zbe rst";
-			gpio = <&pioA PIN_PB25 GPIO_ACTIVE_HIGH>;
+			gpios = <&pioA PIN_PB25 GPIO_ACTIVE_HIGH>;
 			output;
 			init-low;
 		};
 
 		io_reset {
 			label = "io reset";
-			gpio = <&pioA PIN_PB30 GPIO_ACTIVE_HIGH>;
+			gpios = <&pioA PIN_PB30 GPIO_ACTIVE_HIGH>;
 			output;
 			init-low;
 		};
 
 		io_test_radio {
 			label = "io test radio";
-			gpio = <&pioA PIN_PC9 GPIO_ACTIVE_HIGH>;
+			gpios = <&pioA PIN_PC9 GPIO_ACTIVE_HIGH>;
 			output;
 			init-low;
 		};
 
 		io_boot_0 {
 			label = "io boot 0";
-			gpio = <&pioA PIN_PC11 GPIO_ACTIVE_HIGH>;
+			gpios = <&pioA PIN_PC11 GPIO_ACTIVE_HIGH>;
 			output;
 			init-low;
 		};
 
 		io_boot_1 {
 			label = "io boot 1";
-			gpio = <&pioA PIN_PC17 GPIO_ACTIVE_HIGH>;
+			gpios = <&pioA PIN_PC17 GPIO_ACTIVE_HIGH>;
 			output;
 			init-low;
 		};
 
 		verbose_bootloader {
 			label = "verbose bootloader";
-			gpio = <&pioA PIN_PB11 GPIO_ACTIVE_HIGH>;
+			gpios = <&pioA PIN_PB11 GPIO_ACTIVE_HIGH>;
 			input;
 		};
 
 		 nail_bed_detection  {
 			label = "nail bed detection";
-			gpio = <&pioA PIN_PB12 GPIO_ACTIVE_HIGH>;
+			gpios = <&pioA PIN_PB12 GPIO_ACTIVE_HIGH>;
 			input;
 		};
 
 		 id_usba {
 			label = "id usba";
-			gpio = <&pioA PIN_PC0 GPIO_ACTIVE_LOW>;
+			gpios = <&pioA PIN_PC0 GPIO_ACTIVE_LOW>;
 			input;
 		};
 	};
diff --git a/arch/arm/boot/dts/microchip/at91-sama5d3_eds.dts b/arch/arm/boot/dts/microchip/at91-sama5d3_eds.dts
index c287b03d768b..03ba2e724b83 100644
--- a/arch/arm/boot/dts/microchip/at91-sama5d3_eds.dts
+++ b/arch/arm/boot/dts/microchip/at91-sama5d3_eds.dts
@@ -79,7 +79,7 @@ vcc_mmc0_reg: regulator-5 {
 		regulator-always-on;
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_vcc_mmc0_reg_gpio>;
-		gpio = <&pioE 2 GPIO_ACTIVE_LOW>;
+		gpios = <&pioE 2 GPIO_ACTIVE_LOW>;
 	};
 };
 
diff --git a/arch/arm/boot/dts/microchip/at91-sama5d3_ksz9477_evb.dts b/arch/arm/boot/dts/microchip/at91-sama5d3_ksz9477_evb.dts
index b66570080894..17a9f77666b8 100644
--- a/arch/arm/boot/dts/microchip/at91-sama5d3_ksz9477_evb.dts
+++ b/arch/arm/boot/dts/microchip/at91-sama5d3_ksz9477_evb.dts
@@ -28,7 +28,7 @@ reg_vcc_mmc0: regulator-mmc0 {
 		regulator-name = "mmc0-vcc";
 		regulator-max-microvolt = <3300000>;
 		regulator-min-microvolt = <3300000>;
-		gpio = <&pioE 2 GPIO_ACTIVE_LOW>;
+		gpios = <&pioE 2 GPIO_ACTIVE_LOW>;
 	};
 };
 
diff --git a/arch/arm/boot/dts/microchip/at91-sama5d3_xplained.dts b/arch/arm/boot/dts/microchip/at91-sama5d3_xplained.dts
index 820033727088..35b8c973ede3 100644
--- a/arch/arm/boot/dts/microchip/at91-sama5d3_xplained.dts
+++ b/arch/arm/boot/dts/microchip/at91-sama5d3_xplained.dts
@@ -365,7 +365,7 @@ vcc_mmc0_reg: fixedregulator_mmc0 {
 		compatible = "regulator-fixed";
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_vcc_mmc0_reg_gpio>;
-		gpio = <&pioE 2 GPIO_ACTIVE_LOW>;
+		gpios = <&pioE 2 GPIO_ACTIVE_LOW>;
 		regulator-name = "mmc0-card-supply";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
diff --git a/arch/arm/boot/dts/microchip/at91-sama5d4_ma5d4.dtsi b/arch/arm/boot/dts/microchip/at91-sama5d4_ma5d4.dtsi
index fd1086f52b40..0ff9ce658369 100644
--- a/arch/arm/boot/dts/microchip/at91-sama5d4_ma5d4.dtsi
+++ b/arch/arm/boot/dts/microchip/at91-sama5d4_ma5d4.dtsi
@@ -126,7 +126,7 @@ vcc_3v3_reg: fixedregulator_3v3 {
 
 	vcc_mmc0_reg: fixedregulator_mmc0 {
 		compatible = "regulator-fixed";
-		gpio = <&pioE 15 GPIO_ACTIVE_HIGH>;
+		gpios = <&pioE 15 GPIO_ACTIVE_HIGH>;
 		regulator-name = "RST_n MCI0";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
diff --git a/arch/arm/boot/dts/microchip/at91-sama5d4_ma5d4evk.dts b/arch/arm/boot/dts/microchip/at91-sama5d4_ma5d4evk.dts
index 8adf567f2f0f..20f0dd0774cc 100644
--- a/arch/arm/boot/dts/microchip/at91-sama5d4_ma5d4evk.dts
+++ b/arch/arm/boot/dts/microchip/at91-sama5d4_ma5d4evk.dts
@@ -155,7 +155,7 @@ panel_input: endpoint at 0 {
 
 	vcc_mmc1_reg: fixedregulator_mmc1 {
 		compatible = "regulator-fixed";
-		gpio = <&pioE 17 GPIO_ACTIVE_LOW>;
+		gpios = <&pioE 17 GPIO_ACTIVE_LOW>;
 		regulator-name = "VDD MCI1";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
diff --git a/arch/arm/boot/dts/microchip/at91-sama5d4_xplained.dts b/arch/arm/boot/dts/microchip/at91-sama5d4_xplained.dts
index 95d701d13fef..e207e75d85de 100644
--- a/arch/arm/boot/dts/microchip/at91-sama5d4_xplained.dts
+++ b/arch/arm/boot/dts/microchip/at91-sama5d4_xplained.dts
@@ -288,7 +288,7 @@ vcc_mmc1_reg: fixedregulator_mmc1 {
 		compatible = "regulator-fixed";
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_vcc_mmc1_reg>;
-		gpio = <&pioE 4 GPIO_ACTIVE_LOW>;
+		gpios = <&pioE 4 GPIO_ACTIVE_LOW>;
 		regulator-name = "VDD MCI1";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
diff --git a/arch/arm/boot/dts/nspire/nspire-classic.dtsi b/arch/arm/boot/dts/nspire/nspire-classic.dtsi
index 0ee53d3ecd54..fc1a42af082d 100644
--- a/arch/arm/boot/dts/nspire/nspire-classic.dtsi
+++ b/arch/arm/boot/dts/nspire/nspire-classic.dtsi
@@ -51,7 +51,7 @@ &ahb_clk {
 
 
 &vbus_reg {
-	gpio = <&gpio 5 0>;
+	gpios = <&gpio 5 0>;
 };
 
 / {
diff --git a/arch/arm/boot/dts/nspire/nspire-cx.dts b/arch/arm/boot/dts/nspire/nspire-cx.dts
index debeff0ec010..aea761adf8f6 100644
--- a/arch/arm/boot/dts/nspire/nspire-cx.dts
+++ b/arch/arm/boot/dts/nspire/nspire-cx.dts
@@ -115,7 +115,7 @@ MATRIX_KEY(7, 10, 0x33)
 };
 
 &vbus_reg {
-	gpio = <&gpio 2 0>;
+	gpios = <&gpio 2 0>;
 };
 
 / {
diff --git a/arch/arm/boot/dts/nvidia/tegra114-asus-tf701t.dts b/arch/arm/boot/dts/nvidia/tegra114-asus-tf701t.dts
index f02e2cf65fe8..905709fcf8fe 100644
--- a/arch/arm/boot/dts/nvidia/tegra114-asus-tf701t.dts
+++ b/arch/arm/boot/dts/nvidia/tegra114-asus-tf701t.dts
@@ -1858,7 +1858,7 @@ dvdd_1v8_lcd: regulator-vdd-lcd {
 		regulator-min-microvolt = <1800000>;
 		regulator-max-microvolt = <1800000>;
 		regulator-boot-on;
-		gpio = <&palmas_gpio 4 GPIO_ACTIVE_HIGH>;
+		gpios = <&palmas_gpio 4 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&vdd_1v8_vio>;
 	};
@@ -1869,7 +1869,7 @@ vdd_3v7_bl: regulator-bl-en {
 		regulator-min-microvolt = <3700000>;
 		regulator-max-microvolt = <3700000>;
 		regulator-boot-on;
-		gpio = <&gpio TEGRA_GPIO(H, 2) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(H, 2) GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&vdd_5v0_sys>;
 	};
@@ -1880,7 +1880,7 @@ hdmi_5v0_sys: regulator-hdmi {
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
 		regulator-boot-on;
-		gpio = <&gpio TEGRA_GPIO(P, 2) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(P, 2) GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&vdd_smps10_out2>;
 	};
@@ -1891,7 +1891,7 @@ vdd_2v9_usd: regulator-vdd-usd {
 		regulator-min-microvolt = <2900000>;
 		regulator-max-microvolt = <2900000>;
 		regulator-boot-on;
-		gpio = <&gpio TEGRA_GPIO(K, 1) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(K, 1) GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&vcore_emmc>;
 	};
@@ -1902,7 +1902,7 @@ vdd_1v8_cam: regulator-cam-vio {
 		regulator-min-microvolt = <1800000>;
 		regulator-max-microvolt = <1800000>;
 		regulator-boot-on;
-		gpio = <&palmas_gpio 6 GPIO_ACTIVE_HIGH>;
+		gpios = <&palmas_gpio 6 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&vdd_1v8_vio>;
 	};
@@ -1913,7 +1913,7 @@ vdd_1v2_xusb: regulator-xusb-vio {
 		regulator-min-microvolt = <1200000>;
 		regulator-max-microvolt = <1200000>;
 		regulator-boot-on;
-		gpio = <&palmas_gpio 3 GPIO_ACTIVE_HIGH>;
+		gpios = <&palmas_gpio 3 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -1923,7 +1923,7 @@ vdd_3v3_xusb: regulator-xusb-vdd {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 		regulator-boot-on;
-		gpio = <&palmas_gpio 1 GPIO_ACTIVE_HIGH>;
+		gpios = <&palmas_gpio 1 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -1934,7 +1934,7 @@ vdd_3v3_com: regulator-com {
 		regulator-max-microvolt = <3300000>;
 		regulator-always-on;
 		regulator-boot-on;
-		gpio = <&gpio TEGRA_GPIO(U, 1) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(U, 1) GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&vdd_3v3_sys>;
 	};
@@ -1945,7 +1945,7 @@ vdd_3v3_touch: regulator-touch-pwr {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 		regulator-boot-on;
-		gpio = <&gpio TEGRA_GPIO(H, 0) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(H, 0) GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&vdd_3v3_sys>;
 	};
@@ -1956,7 +1956,7 @@ vdd_1v8_touch: regulator-touch-vio {
 		regulator-min-microvolt = <1800000>;
 		regulator-max-microvolt = <1800000>;
 		regulator-boot-on;
-		gpio = <&gpio TEGRA_GPIO(H, 4) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(H, 4) GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&vdd_3v3_sys>;
 	};
diff --git a/arch/arm/boot/dts/nvidia/tegra114-dalmore.dts b/arch/arm/boot/dts/nvidia/tegra114-dalmore.dts
index c06b52fe330a..3814a3a64c2c 100644
--- a/arch/arm/boot/dts/nvidia/tegra114-dalmore.dts
+++ b/arch/arm/boot/dts/nvidia/tegra114-dalmore.dts
@@ -1203,7 +1203,7 @@ dvdd_ts_reg: regulator-ts {
 		regulator-min-microvolt = <1800000>;
 		regulator-max-microvolt = <1800000>;
 		enable-active-high;
-		gpio = <&gpio TEGRA_GPIO(H, 5) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(H, 5) GPIO_ACTIVE_HIGH>;
 	};
 
 	usb1_vbus_reg: regulator-usb1 {
@@ -1212,7 +1212,7 @@ usb1_vbus_reg: regulator-usb1 {
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
 		enable-active-high;
-		gpio = <&gpio TEGRA_GPIO(N, 4) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(N, 4) GPIO_ACTIVE_HIGH>;
 		gpio-open-drain;
 		vin-supply = <&tps65090_dcdc1_reg>;
 	};
@@ -1223,7 +1223,7 @@ usb3_vbus_reg: regulator-usb3 {
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
 		enable-active-high;
-		gpio = <&gpio TEGRA_GPIO(K, 6) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(K, 6) GPIO_ACTIVE_HIGH>;
 		gpio-open-drain;
 		vin-supply = <&tps65090_dcdc1_reg>;
 	};
@@ -1242,7 +1242,7 @@ vdd_cam_1v8_reg: regulator-cam {
 		regulator-min-microvolt = <1800000>;
 		regulator-max-microvolt = <1800000>;
 		enable-active-high;
-		gpio = <&palmas_gpio 6 0>;
+		gpios = <&palmas_gpio 6 0>;
 	};
 
 	vdd_5v0_hdmi: regulator-hdmicon {
@@ -1250,7 +1250,7 @@ vdd_5v0_hdmi: regulator-hdmicon {
 		regulator-name = "VDD_5V0_HDMI_CON";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio TEGRA_GPIO(K, 1) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(K, 1) GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&tps65090_dcdc1_reg>;
 	};
diff --git a/arch/arm/boot/dts/nvidia/tegra114-roth.dts b/arch/arm/boot/dts/nvidia/tegra114-roth.dts
index a89b16573b42..e66181cedf3d 100644
--- a/arch/arm/boot/dts/nvidia/tegra114-roth.dts
+++ b/arch/arm/boot/dts/nvidia/tegra114-roth.dts
@@ -1062,7 +1062,7 @@ vdd_lcd: regulator-lcd {
 		regulator-max-microvolt = <1800000>;
 		vin-supply = <&vdd_1v8>;
 		enable-active-high;
-		gpio = <&gpio TEGRA_GPIO(U, 4) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(U, 4) GPIO_ACTIVE_HIGH>;
 		regulator-boot-on;
 	};
 
@@ -1071,7 +1071,7 @@ regulator-1v8ts {
 		regulator-name = "vdd_1v8_ts";
 		regulator-min-microvolt = <1800000>;
 		regulator-max-microvolt = <1800000>;
-		gpio = <&gpio TEGRA_GPIO(K, 3) GPIO_ACTIVE_LOW>;
+		gpios = <&gpio TEGRA_GPIO(K, 3) GPIO_ACTIVE_LOW>;
 		regulator-boot-on;
 	};
 
@@ -1081,7 +1081,7 @@ regulator-3v3ts {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 		enable-active-high;
-		gpio = <&gpio TEGRA_GPIO(H, 5) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(H, 5) GPIO_ACTIVE_HIGH>;
 		regulator-boot-on;
 	};
 
@@ -1092,7 +1092,7 @@ regulator-1v8com {
 		regulator-max-microvolt = <1800000>;
 		vin-supply = <&vdd_1v8>;
 		enable-active-high;
-		gpio = <&gpio TEGRA_GPIO(X, 1) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(X, 1) GPIO_ACTIVE_HIGH>;
 		regulator-boot-on;
 	};
 
@@ -1103,7 +1103,7 @@ regulator-3v3com {
 		regulator-max-microvolt = <3300000>;
 		vin-supply = <&vdd_3v3_sys>;
 		enable-active-high;
-		gpio = <&gpio TEGRA_GPIO(X, 7) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(X, 7) GPIO_ACTIVE_HIGH>;
 		regulator-always-on;
 		regulator-boot-on;
 	};
diff --git a/arch/arm/boot/dts/nvidia/tegra114-tn7.dts b/arch/arm/boot/dts/nvidia/tegra114-tn7.dts
index bfbdb345575a..a83964b7cbcf 100644
--- a/arch/arm/boot/dts/nvidia/tegra114-tn7.dts
+++ b/arch/arm/boot/dts/nvidia/tegra114-tn7.dts
@@ -319,7 +319,7 @@ lcd_bl_en: regulator-lcden {
 		regulator-name = "VDD_LCD_BL";
 		regulator-min-microvolt = <16500000>;
 		regulator-max-microvolt = <16500000>;
-		gpio = <&gpio TEGRA_GPIO(H, 2) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(H, 2) GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&vs_sys>;
 		regulator-boot-on;
@@ -330,7 +330,7 @@ vdd_lcd: regulator-lcd {
 		regulator-name = "VD_LCD_1V8";
 		regulator-min-microvolt = <1800000>;
 		regulator-max-microvolt = <1800000>;
-		gpio = <&palmas_gpio 4 GPIO_ACTIVE_HIGH>;
+		gpios = <&palmas_gpio 4 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&vdd_1v8>;
 		regulator-boot-on;
diff --git a/arch/arm/boot/dts/nvidia/tegra124-apalis-eval.dts b/arch/arm/boot/dts/nvidia/tegra124-apalis-eval.dts
index 0f3debeb294b..6b6b00e281e2 100644
--- a/arch/arm/boot/dts/nvidia/tegra124-apalis-eval.dts
+++ b/arch/arm/boot/dts/nvidia/tegra124-apalis-eval.dts
@@ -239,7 +239,7 @@ reg_usbo1_vbus: regulator-usbo1-vbus {
 		regulator-name = "VCC_USBO1";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio TEGRA_GPIO(N, 4) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(N, 4) GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&reg_5v0>;
 	};
@@ -250,7 +250,7 @@ reg_usbh_vbus: regulator-usbh-vbus {
 		regulator-name = "VCC_USBH(2A|2C|2D|3|4)";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio TEGRA_GPIO(N, 5) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(N, 5) GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&reg_5v0>;
 	};
diff --git a/arch/arm/boot/dts/nvidia/tegra124-apalis-v1.2-eval.dts b/arch/arm/boot/dts/nvidia/tegra124-apalis-v1.2-eval.dts
index d13b8d25ca6a..45767a1df2c9 100644
--- a/arch/arm/boot/dts/nvidia/tegra124-apalis-v1.2-eval.dts
+++ b/arch/arm/boot/dts/nvidia/tegra124-apalis-v1.2-eval.dts
@@ -241,7 +241,7 @@ reg_usbo1_vbus: regulator-usbo1-vbus {
 		regulator-name = "VCC_USBO1";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio TEGRA_GPIO(T, 5) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(T, 5) GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&reg_5v0>;
 	};
@@ -252,7 +252,7 @@ reg_usbh_vbus: regulator-usbh-vbus {
 		regulator-name = "VCC_USBH(2A|2C|2D|3|4)";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio TEGRA_GPIO(T, 6) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(T, 6) GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&reg_5v0>;
 	};
diff --git a/arch/arm/boot/dts/nvidia/tegra124-apalis-v1.2.dtsi b/arch/arm/boot/dts/nvidia/tegra124-apalis-v1.2.dtsi
index 54b7da4b6920..3dee1a2ad1a5 100644
--- a/arch/arm/boot/dts/nvidia/tegra124-apalis-v1.2.dtsi
+++ b/arch/arm/boot/dts/nvidia/tegra124-apalis-v1.2.dtsi
@@ -1981,7 +1981,7 @@ reg_1v05_avdd_hdmi_pll: regulator-1v05-avdd-hdmi-pll {
 		regulator-name = "+V1.05_AVDD_HDMI_PLL";
 		regulator-min-microvolt = <1050000>;
 		regulator-max-microvolt = <1050000>;
-		gpio = <&gpio TEGRA_GPIO(H, 7) GPIO_ACTIVE_LOW>;
+		gpios = <&gpio TEGRA_GPIO(H, 7) GPIO_ACTIVE_LOW>;
 		vin-supply = <&reg_1v05_vdd>;
 	};
 
@@ -2010,7 +2010,7 @@ reg_module_3v3: regulator-module-3v3 {
 		regulator-always-on;
 		regulator-boot-on;
 		/* PWR_EN_+V3.3 */
-		gpio = <&pmic 2 GPIO_ACTIVE_HIGH>;
+		gpios = <&pmic 2 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&reg_3v3_mxm>;
 	};
diff --git a/arch/arm/boot/dts/nvidia/tegra124-apalis.dtsi b/arch/arm/boot/dts/nvidia/tegra124-apalis.dtsi
index c5a0d6aebaec..76d0566d0565 100644
--- a/arch/arm/boot/dts/nvidia/tegra124-apalis.dtsi
+++ b/arch/arm/boot/dts/nvidia/tegra124-apalis.dtsi
@@ -1973,7 +1973,7 @@ reg_1v05_avdd_hdmi_pll: regulator-1v05-avdd-hdmi-pll {
 		regulator-name = "+V1.05_AVDD_HDMI_PLL";
 		regulator-min-microvolt = <1050000>;
 		regulator-max-microvolt = <1050000>;
-		gpio = <&gpio TEGRA_GPIO(H, 7) GPIO_ACTIVE_LOW>;
+		gpios = <&gpio TEGRA_GPIO(H, 7) GPIO_ACTIVE_LOW>;
 		vin-supply = <&reg_1v05_vdd>;
 	};
 
@@ -2002,7 +2002,7 @@ reg_module_3v3: regulator-module-3v3 {
 		regulator-always-on;
 		regulator-boot-on;
 		/* PWR_EN_+V3.3 */
-		gpio = <&pmic 2 GPIO_ACTIVE_HIGH>;
+		gpios = <&pmic 2 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&reg_3v3_mxm>;
 	};
diff --git a/arch/arm/boot/dts/nvidia/tegra124-jetson-tk1.dts b/arch/arm/boot/dts/nvidia/tegra124-jetson-tk1.dts
index f09109be1152..81bfeeff2904 100644
--- a/arch/arm/boot/dts/nvidia/tegra124-jetson-tk1.dts
+++ b/arch/arm/boot/dts/nvidia/tegra124-jetson-tk1.dts
@@ -1935,7 +1935,7 @@ vdd_3v3_run: regulator-3v3run {
 		regulator-max-microvolt = <3300000>;
 		regulator-always-on;
 		regulator-boot-on;
-		gpio = <&pmic 1 GPIO_ACTIVE_HIGH>;
+		gpios = <&pmic 1 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&vdd_3v3_sys>;
 	};
@@ -1953,7 +1953,7 @@ vdd_usb1_vbus: regulator-usb1 {
 		regulator-name = "+USB0_VBUS_SW";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio TEGRA_GPIO(N, 4) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(N, 4) GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		gpio-open-drain;
 		vin-supply = <&vdd_5v0_sys>;
@@ -1964,7 +1964,7 @@ vdd_usb3_vbus: regulator-usb3 {
 		regulator-name = "+5V_USB_HS";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio TEGRA_GPIO(N, 5) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(N, 5) GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		gpio-open-drain;
 		vin-supply = <&vdd_5v0_sys>;
@@ -1977,7 +1977,7 @@ vdd_3v3_lp0: regulator-lp0 {
 		regulator-max-microvolt = <3300000>;
 		regulator-always-on;
 		regulator-boot-on;
-		gpio = <&pmic 2 GPIO_ACTIVE_HIGH>;
+		gpios = <&pmic 2 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&vdd_3v3_sys>;
 	};
@@ -1987,7 +1987,7 @@ vdd_hdmi_pll: regulator-hdmipll {
 		regulator-name = "+1.05V_RUN_AVDD_HDMI_PLL";
 		regulator-min-microvolt = <1050000>;
 		regulator-max-microvolt = <1050000>;
-		gpio = <&gpio TEGRA_GPIO(H, 7) GPIO_ACTIVE_LOW>;
+		gpios = <&gpio TEGRA_GPIO(H, 7) GPIO_ACTIVE_LOW>;
 		vin-supply = <&vdd_1v05_run>;
 	};
 
@@ -1996,7 +1996,7 @@ vdd_5v0_hdmi: regulator-hdmicon {
 		regulator-name = "+5V_HDMI_CON";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio TEGRA_GPIO(K, 6) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(K, 6) GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&vdd_5v0_sys>;
 	};
@@ -2007,7 +2007,7 @@ vdd_5v0_sata: regulator-5v0sata {
 		regulator-name = "+5V_SATA";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio TEGRA_GPIO(EE, 2) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(EE, 2) GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&vdd_5v0_sys>;
 	};
@@ -2017,7 +2017,7 @@ vdd_12v0_sata: regulator-12v0sata {
 		regulator-name = "+12V_SATA";
 		regulator-min-microvolt = <12000000>;
 		regulator-max-microvolt = <12000000>;
-		gpio = <&gpio TEGRA_GPIO(EE, 2) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(EE, 2) GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&vdd_mux>;
 	};
diff --git a/arch/arm/boot/dts/nvidia/tegra124-nyan.dtsi b/arch/arm/boot/dts/nvidia/tegra124-nyan.dtsi
index 8125c1b3e8d7..587b71ed29d9 100644
--- a/arch/arm/boot/dts/nvidia/tegra124-nyan.dtsi
+++ b/arch/arm/boot/dts/nvidia/tegra124-nyan.dtsi
@@ -679,7 +679,7 @@ vdd_3v3_run: regulator-3v3run {
 		regulator-max-microvolt = <3300000>;
 		regulator-always-on;
 		regulator-boot-on;
-		gpio = <&pmic 1 GPIO_ACTIVE_HIGH>;
+		gpios = <&pmic 1 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&vdd_3v3_sys>;
 	};
@@ -695,7 +695,7 @@ vdd_3v3_hdmi: regulator-3v3hdmi {
 	vdd_led: regulator-led {
 		compatible = "regulator-fixed";
 		regulator-name = "+VDD_LED";
-		gpio = <&gpio TEGRA_GPIO(P, 2) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(P, 2) GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&vdd_mux>;
 	};
@@ -706,7 +706,7 @@ vdd_5v0_ts: regulator-ts {
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
 		regulator-boot-on;
-		gpio = <&gpio TEGRA_GPIO(K, 1) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(K, 1) GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&vdd_5v0_sys>;
 	};
@@ -716,7 +716,7 @@ vdd_usb1_vbus: regulator-usb1 {
 		regulator-name = "+5V_USB_HS";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio TEGRA_GPIO(N, 4) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(N, 4) GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		gpio-open-drain;
 		vin-supply = <&vdd_5v0_sys>;
@@ -727,7 +727,7 @@ vdd_usb3_vbus: regulator-usb3 {
 		regulator-name = "+5V_USB_SS";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio TEGRA_GPIO(N, 5) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(N, 5) GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		gpio-open-drain;
 		vin-supply = <&vdd_5v0_sys>;
@@ -738,7 +738,7 @@ vdd_3v3_panel: regulator-panel {
 		regulator-name = "+3.3V_PANEL";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&pmic 4 GPIO_ACTIVE_HIGH>;
+		gpios = <&pmic 4 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&vdd_3v3_run>;
 	};
@@ -753,7 +753,7 @@ vdd_3v3_lp0: regulator-lp0 {
 		 * controllers so that it can be enabled on demand.
 		 */
 		regulator-always-on;
-		gpio = <&pmic 2 GPIO_ACTIVE_HIGH>;
+		gpios = <&pmic 2 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&vdd_3v3_sys>;
 	};
@@ -763,7 +763,7 @@ vdd_hdmi_pll: regulator-hdmipll {
 		regulator-name = "+1.05V_RUN_AVDD_HDMI_PLL";
 		regulator-min-microvolt = <1050000>;
 		regulator-max-microvolt = <1050000>;
-		gpio = <&gpio TEGRA_GPIO(H, 7) GPIO_ACTIVE_LOW>;
+		gpios = <&gpio TEGRA_GPIO(H, 7) GPIO_ACTIVE_LOW>;
 		vin-supply = <&vdd_1v05_run>;
 	};
 
@@ -772,7 +772,7 @@ vdd_5v0_hdmi: regulator-hdmicon {
 		regulator-name = "+5V_HDMI_CON";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio TEGRA_GPIO(K, 6) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(K, 6) GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&vdd_5v0_sys>;
 	};
diff --git a/arch/arm/boot/dts/nvidia/tegra124-venice2.dts b/arch/arm/boot/dts/nvidia/tegra124-venice2.dts
index df98dc2a67b8..58147f1b70c9 100644
--- a/arch/arm/boot/dts/nvidia/tegra124-venice2.dts
+++ b/arch/arm/boot/dts/nvidia/tegra124-venice2.dts
@@ -1127,7 +1127,7 @@ vdd_3v3_run: regulator-3v3run {
 		regulator-max-microvolt = <3300000>;
 		regulator-always-on;
 		regulator-boot-on;
-		gpio = <&pmic 1 GPIO_ACTIVE_HIGH>;
+		gpios = <&pmic 1 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&vdd_3v3_sys>;
 	};
@@ -1145,7 +1145,7 @@ vdd_led: regulator-led {
 		regulator-name = "+VDD_LED";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio TEGRA_GPIO(P, 2) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(P, 2) GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&vdd_mux>;
 	};
@@ -1156,7 +1156,7 @@ vdd_5v0_ts: regulator-ts {
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
 		regulator-boot-on;
-		gpio = <&gpio TEGRA_GPIO(K, 1) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(K, 1) GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&vdd_5v0_sys>;
 	};
@@ -1166,7 +1166,7 @@ vdd_usb1_vbus: regulator-usb1 {
 		regulator-name = "+5V_USB_HS";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio TEGRA_GPIO(N, 4) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(N, 4) GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		gpio-open-drain;
 		vin-supply = <&vdd_5v0_sys>;
@@ -1177,7 +1177,7 @@ vdd_usb3_vbus: regulator-usb3 {
 		regulator-name = "+5V_USB_SS";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio TEGRA_GPIO(N, 5) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(N, 5) GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		gpio-open-drain;
 		vin-supply = <&vdd_5v0_sys>;
@@ -1188,7 +1188,7 @@ vdd_3v3_panel: regulator-panel {
 		regulator-name = "+3.3V_PANEL";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&pmic 4 GPIO_ACTIVE_HIGH>;
+		gpios = <&pmic 4 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&vdd_3v3_run>;
 	};
@@ -1203,7 +1203,7 @@ vdd_3v3_lp0: regulator-lp0 {
 		 * controllers so that it can be enabled on demand.
 		 */
 		regulator-always-on;
-		gpio = <&pmic 2 GPIO_ACTIVE_HIGH>;
+		gpios = <&pmic 2 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&vdd_3v3_sys>;
 	};
@@ -1213,7 +1213,7 @@ vdd_hdmi_pll: regulator-hdmipll {
 		regulator-name = "+1.05V_RUN_AVDD_HDMI_PLL";
 		regulator-min-microvolt = <1050000>;
 		regulator-max-microvolt = <1050000>;
-		gpio = <&gpio TEGRA_GPIO(H, 7) GPIO_ACTIVE_LOW>;
+		gpios = <&gpio TEGRA_GPIO(H, 7) GPIO_ACTIVE_LOW>;
 		vin-supply = <&vdd_1v05_run>;
 	};
 
@@ -1222,7 +1222,7 @@ vdd_5v0_hdmi: regulator-hdmicon {
 		regulator-name = "+5V_HDMI_CON";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio TEGRA_GPIO(K, 6) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(K, 6) GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&vdd_5v0_sys>;
 	};
diff --git a/arch/arm/boot/dts/nvidia/tegra20-acer-a500-picasso.dts b/arch/arm/boot/dts/nvidia/tegra20-acer-a500-picasso.dts
index a619ea83ed3b..87ddb3d2fd1a 100644
--- a/arch/arm/boot/dts/nvidia/tegra20-acer-a500-picasso.dts
+++ b/arch/arm/boot/dts/nvidia/tegra20-acer-a500-picasso.dts
@@ -1402,7 +1402,7 @@ vdd_pnl: regulator-panel {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 		regulator-enable-ramp-delay = <300000>;
-		gpio = <&gpio TEGRA_GPIO(C, 6) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(C, 6) GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&vdd_5v0_sys>;
 	};
diff --git a/arch/arm/boot/dts/nvidia/tegra20-asus-tf101.dts b/arch/arm/boot/dts/nvidia/tegra20-asus-tf101.dts
index e118809dc6d9..49a2351df03a 100644
--- a/arch/arm/boot/dts/nvidia/tegra20-asus-tf101.dts
+++ b/arch/arm/boot/dts/nvidia/tegra20-asus-tf101.dts
@@ -1143,7 +1143,7 @@ regulator-pcie {
 		regulator-name = "pcie_vdd";
 		regulator-min-microvolt = <1500000>;
 		regulator-max-microvolt = <1500000>;
-		gpio = <&pmic 0 GPIO_ACTIVE_HIGH>;
+		gpios = <&pmic 0 GPIO_ACTIVE_HIGH>;
 		regulator-always-on;
 	};
 
@@ -1152,7 +1152,7 @@ vdd_pnl_reg: regulator-panel {
 		regulator-name = "vdd_pnl";
 		regulator-min-microvolt = <2800000>;
 		regulator-max-microvolt = <2800000>;
-		gpio = <&gpio TEGRA_GPIO(C, 6) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(C, 6) GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -1172,7 +1172,7 @@ vdd_hdmi_en: regulator-hdmi {
 		regulator-max-microvolt = <5000000>;
 		regulator-always-on;
 		vin-supply = <&vdd_5v0_sys>;
-		gpio = <&gpio TEGRA_GPIO(V, 5) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(V, 5) GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/nvidia/tegra20-colibri-eval-v3.dts b/arch/arm/boot/dts/nvidia/tegra20-colibri-eval-v3.dts
index be2ead4147f2..8ffae82596da 100644
--- a/arch/arm/boot/dts/nvidia/tegra20-colibri-eval-v3.dts
+++ b/arch/arm/boot/dts/nvidia/tegra20-colibri-eval-v3.dts
@@ -258,7 +258,7 @@ reg_usbh_vbus: regulator-usbh-vbus {
 		regulator-name = "VCC_USB[1-4]";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio TEGRA_GPIO(W, 2) GPIO_ACTIVE_LOW>;
+		gpios = <&gpio TEGRA_GPIO(W, 2) GPIO_ACTIVE_LOW>;
 		vin-supply = <&reg_5v0>;
 	};
 };
diff --git a/arch/arm/boot/dts/nvidia/tegra20-colibri-iris.dts b/arch/arm/boot/dts/nvidia/tegra20-colibri-iris.dts
index 1da202ad1ded..e61144f3086d 100644
--- a/arch/arm/boot/dts/nvidia/tegra20-colibri-iris.dts
+++ b/arch/arm/boot/dts/nvidia/tegra20-colibri-iris.dts
@@ -240,7 +240,7 @@ reg_usbh_vbus: regulator-usbh-vbus {
 		regulator-name = "VCC_USB1";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio TEGRA_GPIO(W, 2) GPIO_ACTIVE_LOW>;
+		gpios = <&gpio TEGRA_GPIO(W, 2) GPIO_ACTIVE_LOW>;
 		vin-supply = <&reg_5v0>;
 	};
 };
diff --git a/arch/arm/boot/dts/nvidia/tegra20-colibri.dtsi b/arch/arm/boot/dts/nvidia/tegra20-colibri.dtsi
index 2ff7be8f1382..f4da5408db3e 100644
--- a/arch/arm/boot/dts/nvidia/tegra20-colibri.dtsi
+++ b/arch/arm/boot/dts/nvidia/tegra20-colibri.dtsi
@@ -748,7 +748,7 @@ reg_lan_v_bus: regulator-lan-v-bus {
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
 		enable-active-high;
-		gpio = <&gpio TEGRA_GPIO(BB, 1) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(BB, 1) GPIO_ACTIVE_HIGH>;
 	};
 
 	reg_module_3v3: regulator-module-3v3 {
diff --git a/arch/arm/boot/dts/nvidia/tegra20-harmony.dts b/arch/arm/boot/dts/nvidia/tegra20-harmony.dts
index 5c31a6c8dabe..79a4370cfc7d 100644
--- a/arch/arm/boot/dts/nvidia/tegra20-harmony.dts
+++ b/arch/arm/boot/dts/nvidia/tegra20-harmony.dts
@@ -680,7 +680,7 @@ regulator-1v5 {
 		regulator-name = "vdd_1v5";
 		regulator-min-microvolt = <1500000>;
 		regulator-max-microvolt = <1500000>;
-		gpio = <&pmic 0 GPIO_ACTIVE_HIGH>;
+		gpios = <&pmic 0 GPIO_ACTIVE_HIGH>;
 	};
 
 	regulator-1v2 {
@@ -688,7 +688,7 @@ regulator-1v2 {
 		regulator-name = "vdd_1v2";
 		regulator-min-microvolt = <1200000>;
 		regulator-max-microvolt = <1200000>;
-		gpio = <&pmic 1 GPIO_ACTIVE_HIGH>;
+		gpios = <&pmic 1 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -697,7 +697,7 @@ pci_vdd_reg: regulator-1v05 {
 		regulator-name = "vdd_1v05";
 		regulator-min-microvolt = <1050000>;
 		regulator-max-microvolt = <1050000>;
-		gpio = <&pmic 2 GPIO_ACTIVE_HIGH>;
+		gpios = <&pmic 2 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -706,7 +706,7 @@ vdd_pnl_reg: regulator-pn1 {
 		regulator-name = "vdd_pnl";
 		regulator-min-microvolt = <2800000>;
 		regulator-max-microvolt = <2800000>;
-		gpio = <&gpio TEGRA_GPIO(C, 6) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(C, 6) GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -715,7 +715,7 @@ vdd_bl_reg: regulator-bl {
 		regulator-name = "vdd_bl";
 		regulator-min-microvolt = <2800000>;
 		regulator-max-microvolt = <2800000>;
-		gpio = <&gpio TEGRA_GPIO(W, 0) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(W, 0) GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -724,7 +724,7 @@ vdd_5v0_hdmi: regulator-hdmi {
 		regulator-name = "VDDIO_HDMI";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio TEGRA_GPIO(T, 2) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(T, 2) GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&vdd_5v0_reg>;
 	};
diff --git a/arch/arm/boot/dts/nvidia/tegra20-paz00.dts b/arch/arm/boot/dts/nvidia/tegra20-paz00.dts
index 1408e1e00759..d6005de85189 100644
--- a/arch/arm/boot/dts/nvidia/tegra20-paz00.dts
+++ b/arch/arm/boot/dts/nvidia/tegra20-paz00.dts
@@ -702,7 +702,7 @@ vdd_pnl_reg: regulator-3v0 {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 		regulator-boot-on;
-		gpio = <&gpio TEGRA_GPIO(A, 4) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(A, 4) GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/nvidia/tegra20-seaboard.dts b/arch/arm/boot/dts/nvidia/tegra20-seaboard.dts
index e944ae9b86c2..3943ec37bd51 100644
--- a/arch/arm/boot/dts/nvidia/tegra20-seaboard.dts
+++ b/arch/arm/boot/dts/nvidia/tegra20-seaboard.dts
@@ -842,7 +842,7 @@ regulator-1v5 {
 		regulator-name = "vdd_1v5";
 		regulator-min-microvolt = <1500000>;
 		regulator-max-microvolt = <1500000>;
-		gpio = <&pmic 0 GPIO_ACTIVE_HIGH>;
+		gpios = <&pmic 0 GPIO_ACTIVE_HIGH>;
 	};
 
 	regulator-1v2 {
@@ -850,7 +850,7 @@ regulator-1v2 {
 		regulator-name = "vdd_1v2";
 		regulator-min-microvolt = <1200000>;
 		regulator-max-microvolt = <1200000>;
-		gpio = <&pmic 1 GPIO_ACTIVE_HIGH>;
+		gpios = <&pmic 1 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -860,7 +860,7 @@ vbus_reg: regulator-vbus {
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
 		enable-active-high;
-		gpio = <&gpio TEGRA_GPIO(D, 0) 0>;
+		gpios = <&gpio TEGRA_GPIO(D, 0) 0>;
 		regulator-always-on;
 		regulator-boot-on;
 	};
@@ -870,7 +870,7 @@ vdd_pnl_reg: regulator-pnl {
 		regulator-name = "vdd_pnl";
 		regulator-min-microvolt = <2800000>;
 		regulator-max-microvolt = <2800000>;
-		gpio = <&gpio TEGRA_GPIO(C, 6) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(C, 6) GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -879,7 +879,7 @@ vdd_bl_reg: regulator-bl {
 		regulator-name = "vdd_bl";
 		regulator-min-microvolt = <2800000>;
 		regulator-max-microvolt = <2800000>;
-		gpio = <&gpio TEGRA_GPIO(W, 0) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(W, 0) GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -888,7 +888,7 @@ vdd_hdmi: regulator-hdmi {
 		regulator-name = "VDDIO_HDMI";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio TEGRA_GPIO(V, 5) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(V, 5) GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&vdd_5v0_reg>;
 	};
diff --git a/arch/arm/boot/dts/nvidia/tegra20-tamonten.dtsi b/arch/arm/boot/dts/nvidia/tegra20-tamonten.dtsi
index 5c214dd060bb..b443fbd2e971 100644
--- a/arch/arm/boot/dts/nvidia/tegra20-tamonten.dtsi
+++ b/arch/arm/boot/dts/nvidia/tegra20-tamonten.dtsi
@@ -516,7 +516,7 @@ pci_vdd_reg: regulator-1v05 {
 		regulator-name = "vdd_1v05";
 		regulator-min-microvolt = <1050000>;
 		regulator-max-microvolt = <1050000>;
-		gpio = <&pmic 2 0>;
+		gpios = <&pmic 2 0>;
 		enable-active-high;
 	};
 };
diff --git a/arch/arm/boot/dts/nvidia/tegra20-trimslice.dts b/arch/arm/boot/dts/nvidia/tegra20-trimslice.dts
index 4caeeb9f1e1d..9438f05310c4 100644
--- a/arch/arm/boot/dts/nvidia/tegra20-trimslice.dts
+++ b/arch/arm/boot/dts/nvidia/tegra20-trimslice.dts
@@ -455,7 +455,7 @@ vbus_reg: regulator-vbus {
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
 		enable-active-high;
-		gpio = <&gpio TEGRA_GPIO(V, 2) 0>;
+		gpios = <&gpio TEGRA_GPIO(V, 2) 0>;
 		regulator-always-on;
 		regulator-boot-on;
 	};
diff --git a/arch/arm/boot/dts/nvidia/tegra20-ventana.dts b/arch/arm/boot/dts/nvidia/tegra20-ventana.dts
index f3273941437c..ff627c6781e5 100644
--- a/arch/arm/boot/dts/nvidia/tegra20-ventana.dts
+++ b/arch/arm/boot/dts/nvidia/tegra20-ventana.dts
@@ -661,7 +661,7 @@ regulator-1v5 {
 		regulator-name = "vdd_1v5";
 		regulator-min-microvolt = <1500000>;
 		regulator-max-microvolt = <1500000>;
-		gpio = <&pmic 0 GPIO_ACTIVE_HIGH>;
+		gpios = <&pmic 0 GPIO_ACTIVE_HIGH>;
 	};
 
 	regulator-1v2 {
@@ -669,7 +669,7 @@ regulator-1v2 {
 		regulator-name = "vdd_1v2";
 		regulator-min-microvolt = <1200000>;
 		regulator-max-microvolt = <1200000>;
-		gpio = <&pmic 1 GPIO_ACTIVE_HIGH>;
+		gpios = <&pmic 1 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -678,7 +678,7 @@ vdd_pnl_reg: regulator-pnl {
 		regulator-name = "vdd_pnl";
 		regulator-min-microvolt = <2800000>;
 		regulator-max-microvolt = <2800000>;
-		gpio = <&gpio TEGRA_GPIO(C, 6) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(C, 6) GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -687,7 +687,7 @@ vdd_bl_reg: regulator-bl {
 		regulator-name = "vdd_bl";
 		regulator-min-microvolt = <2800000>;
 		regulator-max-microvolt = <2800000>;
-		gpio = <&gpio TEGRA_GPIO(W, 0) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(W, 0) GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/nvidia/tegra30-apalis-eval.dts b/arch/arm/boot/dts/nvidia/tegra30-apalis-eval.dts
index fc284155cd76..447c047071c8 100644
--- a/arch/arm/boot/dts/nvidia/tegra30-apalis-eval.dts
+++ b/arch/arm/boot/dts/nvidia/tegra30-apalis-eval.dts
@@ -232,7 +232,7 @@ reg_usbo1_vbus: regulator-usbo1-vbus {
 		regulator-name = "VCC_USBO1";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio TEGRA_GPIO(T, 5) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(T, 5) GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&reg_5v0>;
 	};
@@ -243,7 +243,7 @@ reg_usbh_vbus: regulator-usbh-vbus {
 		regulator-name = "VCC_USBH(2A|2C|2D|3|4)";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio TEGRA_GPIO(DD, 1) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(DD, 1) GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&reg_5v0>;
 	};
diff --git a/arch/arm/boot/dts/nvidia/tegra30-apalis-v1.1-eval.dts b/arch/arm/boot/dts/nvidia/tegra30-apalis-v1.1-eval.dts
index 9d08e2b094b4..c1300cfe7853 100644
--- a/arch/arm/boot/dts/nvidia/tegra30-apalis-v1.1-eval.dts
+++ b/arch/arm/boot/dts/nvidia/tegra30-apalis-v1.1-eval.dts
@@ -233,7 +233,7 @@ reg_usbo1_vbus: regulator-usbo1-vbus {
 		regulator-name = "VCC_USBO1";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio TEGRA_GPIO(T, 5) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(T, 5) GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&reg_5v0>;
 	};
@@ -244,7 +244,7 @@ reg_usbh_vbus: regulator-usbh-vbus {
 		regulator-name = "VCC_USBH(2A|2C|2D|3|4)";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio TEGRA_GPIO(DD, 1) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(DD, 1) GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&reg_5v0>;
 	};
diff --git a/arch/arm/boot/dts/nvidia/tegra30-apalis-v1.1.dtsi b/arch/arm/boot/dts/nvidia/tegra30-apalis-v1.1.dtsi
index ff0d684622f7..041475011174 100644
--- a/arch/arm/boot/dts/nvidia/tegra30-apalis-v1.1.dtsi
+++ b/arch/arm/boot/dts/nvidia/tegra30-apalis-v1.1.dtsi
@@ -1142,7 +1142,7 @@ reg_1v8_avdd_hdmi_pll: regulator-1v8-avdd-hdmi-pll {
 		regulator-min-microvolt = <1800000>;
 		regulator-max-microvolt = <1800000>;
 		enable-active-high;
-		gpio = <&pmic 6 GPIO_ACTIVE_HIGH>;
+		gpios = <&pmic 6 GPIO_ACTIVE_HIGH>;
 		vin-supply = <&reg_1v8_vio>;
 	};
 
@@ -1152,7 +1152,7 @@ reg_3v3_avdd_hdmi: regulator-3v3-avdd-hdmi {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 		enable-active-high;
-		gpio = <&pmic 6 GPIO_ACTIVE_HIGH>;
+		gpios = <&pmic 6 GPIO_ACTIVE_HIGH>;
 		vin-supply = <&reg_module_3v3>;
 	};
 
diff --git a/arch/arm/boot/dts/nvidia/tegra30-apalis.dtsi b/arch/arm/boot/dts/nvidia/tegra30-apalis.dtsi
index d38f1dd38a90..ac4fc3d0c82c 100644
--- a/arch/arm/boot/dts/nvidia/tegra30-apalis.dtsi
+++ b/arch/arm/boot/dts/nvidia/tegra30-apalis.dtsi
@@ -1125,7 +1125,7 @@ reg_1v8_avdd_hdmi_pll: regulator-1v8-avdd-hdmi-pll {
 		regulator-min-microvolt = <1800000>;
 		regulator-max-microvolt = <1800000>;
 		enable-active-high;
-		gpio = <&pmic 6 GPIO_ACTIVE_HIGH>;
+		gpios = <&pmic 6 GPIO_ACTIVE_HIGH>;
 		vin-supply = <&reg_1v8_vio>;
 	};
 
@@ -1135,7 +1135,7 @@ reg_3v3_avdd_hdmi: regulator-3v3-avdd-hdmi {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 		enable-active-high;
-		gpio = <&pmic 6 GPIO_ACTIVE_HIGH>;
+		gpios = <&pmic 6 GPIO_ACTIVE_HIGH>;
 		vin-supply = <&reg_module_3v3>;
 	};
 
diff --git a/arch/arm/boot/dts/nvidia/tegra30-asus-nexus7-grouper-common.dtsi b/arch/arm/boot/dts/nvidia/tegra30-asus-nexus7-grouper-common.dtsi
index 15f53babdc21..cfec282b30db 100644
--- a/arch/arm/boot/dts/nvidia/tegra30-asus-nexus7-grouper-common.dtsi
+++ b/arch/arm/boot/dts/nvidia/tegra30-asus-nexus7-grouper-common.dtsi
@@ -1188,7 +1188,7 @@ vdd_pnl: regulator-panel {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 		regulator-enable-ramp-delay = <300000>;
-		gpio = <&gpio TEGRA_GPIO(W, 1) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(W, 1) GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&vdd_3v3_sys>;
 	};
diff --git a/arch/arm/boot/dts/nvidia/tegra30-asus-nexus7-grouper-maxim-pmic.dtsi b/arch/arm/boot/dts/nvidia/tegra30-asus-nexus7-grouper-maxim-pmic.dtsi
index 694c7fe37eb8..f71563451688 100644
--- a/arch/arm/boot/dts/nvidia/tegra30-asus-nexus7-grouper-maxim-pmic.dtsi
+++ b/arch/arm/boot/dts/nvidia/tegra30-asus-nexus7-grouper-maxim-pmic.dtsi
@@ -167,7 +167,7 @@ ldo8 {
 	};
 
 	vdd_3v3_sys: regulator-3v3 {
-		gpio = <&pmic 3 GPIO_ACTIVE_HIGH>;
+		gpios = <&pmic 3 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -178,7 +178,7 @@ regulator-usb {
 		regulator-max-microvolt = <3300000>;
 		regulator-always-on;
 		regulator-boot-on;
-		gpio = <&pmic 2 GPIO_ACTIVE_HIGH>;
+		gpios = <&pmic 2 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&vdd_3v3_sys>;
 	};
diff --git a/arch/arm/boot/dts/nvidia/tegra30-asus-nexus7-grouper-ti-pmic.dtsi b/arch/arm/boot/dts/nvidia/tegra30-asus-nexus7-grouper-ti-pmic.dtsi
index ee4a3f482769..a5b359522488 100644
--- a/arch/arm/boot/dts/nvidia/tegra30-asus-nexus7-grouper-ti-pmic.dtsi
+++ b/arch/arm/boot/dts/nvidia/tegra30-asus-nexus7-grouper-ti-pmic.dtsi
@@ -144,7 +144,7 @@ vdd_core: core-regulator at 60 {
 	};
 
 	vdd_3v3_sys: regulator-3v3 {
-		gpio = <&pmic 6 GPIO_ACTIVE_HIGH>;
+		gpios = <&pmic 6 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/nvidia/tegra30-asus-tf700t.dts b/arch/arm/boot/dts/nvidia/tegra30-asus-tf700t.dts
index 9c480fde2e76..73d6716947a4 100644
--- a/arch/arm/boot/dts/nvidia/tegra30-asus-tf700t.dts
+++ b/arch/arm/boot/dts/nvidia/tegra30-asus-tf700t.dts
@@ -816,7 +816,7 @@ vdd_1v2_mipi: regulator-mipi {
 		regulator-max-microvolt = <1200000>;
 		regulator-enable-ramp-delay = <10000>;
 		regulator-boot-on;
-		gpio = <&gpio TEGRA_GPIO(BB, 3) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(BB, 3) GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&vdd_3v3_sys>;
 	};
diff --git a/arch/arm/boot/dts/nvidia/tegra30-asus-transformer-common.dtsi b/arch/arm/boot/dts/nvidia/tegra30-asus-transformer-common.dtsi
index ead95306840f..b76a3f5d7ad8 100644
--- a/arch/arm/boot/dts/nvidia/tegra30-asus-transformer-common.dtsi
+++ b/arch/arm/boot/dts/nvidia/tegra30-asus-transformer-common.dtsi
@@ -1588,7 +1588,7 @@ vdd_5v0_cp: regulator-sby {
 		regulator-max-microvolt = <5000000>;
 		regulator-always-on;
 		regulator-boot-on;
-		gpio = <&pmic 0 GPIO_ACTIVE_HIGH>;
+		gpios = <&pmic 0 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&vdd_5v0_bat>;
 	};
@@ -1600,7 +1600,7 @@ vdd_5v0_sys: regulator-5v {
 		regulator-max-microvolt = <5000000>;
 		regulator-always-on;
 		regulator-boot-on;
-		gpio = <&pmic 8 GPIO_ACTIVE_HIGH>;
+		gpios = <&pmic 8 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&vdd_5v0_bat>;
 	};
@@ -1612,7 +1612,7 @@ vdd_1v5_ddr: regulator-ddr {
 		regulator-max-microvolt = <1500000>;
 		regulator-always-on;
 		regulator-boot-on;
-		gpio = <&pmic 7 GPIO_ACTIVE_HIGH>;
+		gpios = <&pmic 7 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&vdd_5v0_bat>;
 	};
@@ -1624,7 +1624,7 @@ vdd_3v3_sys: regulator-3v {
 		regulator-max-microvolt = <3300000>;
 		regulator-always-on;
 		regulator-boot-on;
-		gpio = <&pmic 6 GPIO_ACTIVE_HIGH>;
+		gpios = <&pmic 6 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&vdd_5v0_bat>;
 	};
@@ -1635,7 +1635,7 @@ vdd_pnl: regulator-panel {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 		regulator-enable-ramp-delay = <20000>;
-		gpio = <&gpio TEGRA_GPIO(W, 1) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(W, 1) GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&vdd_3v3_sys>;
 	};
@@ -1646,7 +1646,7 @@ vdd_3v3_com: regulator-com {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 		regulator-always-on;
-		gpio = <&gpio TEGRA_GPIO(D, 0) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(D, 0) GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&vdd_3v3_sys>;
 	};
@@ -1657,7 +1657,7 @@ vdd_5v0_bl: regulator-bl {
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
 		regulator-boot-on;
-		gpio = <&gpio TEGRA_GPIO(H, 3) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(H, 3) GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&vdd_5v0_bat>;
 	};
@@ -1667,7 +1667,7 @@ hdmi_5v0_sys: regulator-hdmi {
 		regulator-name = "hdmi_5v0_sys";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio TEGRA_GPIO(P, 2) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(P, 2) GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&vdd_5v0_sys>;
 	};
diff --git a/arch/arm/boot/dts/nvidia/tegra30-beaver.dts b/arch/arm/boot/dts/nvidia/tegra30-beaver.dts
index 1d74179dde79..d80a69750d2b 100644
--- a/arch/arm/boot/dts/nvidia/tegra30-beaver.dts
+++ b/arch/arm/boot/dts/nvidia/tegra30-beaver.dts
@@ -2027,7 +2027,7 @@ chargepump_5v_reg: regulator-chargepump {
 		regulator-boot-on;
 		regulator-always-on;
 		enable-active-high;
-		gpio = <&pmic 0 GPIO_ACTIVE_HIGH>;
+		gpios = <&pmic 0 GPIO_ACTIVE_HIGH>;
 	};
 
 	ddr_reg: regulator-ddr {
@@ -2038,7 +2038,7 @@ ddr_reg: regulator-ddr {
 		regulator-always-on;
 		regulator-boot-on;
 		enable-active-high;
-		gpio = <&pmic 7 GPIO_ACTIVE_HIGH>;
+		gpios = <&pmic 7 GPIO_ACTIVE_HIGH>;
 		vin-supply = <&vdd_5v_in_reg>;
 	};
 
@@ -2050,7 +2050,7 @@ vdd_5v_sata_reg: regulator-sata {
 		regulator-always-on;
 		regulator-boot-on;
 		enable-active-high;
-		gpio = <&gpio TEGRA_GPIO(D, 6) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(D, 6) GPIO_ACTIVE_HIGH>;
 		vin-supply = <&vdd_5v_in_reg>;
 	};
 
@@ -2060,7 +2060,7 @@ usb1_vbus_reg: regulator-usb1 {
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
 		enable-active-high;
-		gpio = <&gpio TEGRA_GPIO(DD, 6) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(DD, 6) GPIO_ACTIVE_HIGH>;
 		gpio-open-drain;
 		vin-supply = <&vdd_5v_in_reg>;
 	};
@@ -2071,7 +2071,7 @@ usb3_vbus_reg: regulator-usb3 {
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
 		enable-active-high;
-		gpio = <&gpio TEGRA_GPIO(DD, 4) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(DD, 4) GPIO_ACTIVE_HIGH>;
 		gpio-open-drain;
 		vin-supply = <&vdd_5v_in_reg>;
 	};
@@ -2084,7 +2084,7 @@ sys_3v3_reg: regulator-3v3 {
 		regulator-always-on;
 		regulator-boot-on;
 		enable-active-high;
-		gpio = <&pmic 6 GPIO_ACTIVE_HIGH>;
+		gpios = <&pmic 6 GPIO_ACTIVE_HIGH>;
 		vin-supply = <&vdd_5v_in_reg>;
 	};
 
@@ -2096,7 +2096,7 @@ sys_3v3_pexs_reg: regulator-pexs {
 		regulator-always-on;
 		regulator-boot-on;
 		enable-active-high;
-		gpio = <&gpio TEGRA_GPIO(L, 7) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(L, 7) GPIO_ACTIVE_HIGH>;
 		vin-supply = <&sys_3v3_reg>;
 	};
 
diff --git a/arch/arm/boot/dts/nvidia/tegra30-cardhu-a02.dts b/arch/arm/boot/dts/nvidia/tegra30-cardhu-a02.dts
index 247185314f46..fb47ed49cac3 100644
--- a/arch/arm/boot/dts/nvidia/tegra30-cardhu-a02.dts
+++ b/arch/arm/boot/dts/nvidia/tegra30-cardhu-a02.dts
@@ -24,7 +24,7 @@ ddr_reg: regulator-ddr {
 		regulator-always-on;
 		regulator-boot-on;
 		enable-active-high;
-		gpio = <&pmic 6 GPIO_ACTIVE_HIGH>;
+		gpios = <&pmic 6 GPIO_ACTIVE_HIGH>;
 	};
 
 	sys_3v3_reg: regulator-3v3 {
@@ -35,7 +35,7 @@ sys_3v3_reg: regulator-3v3 {
 		regulator-always-on;
 		regulator-boot-on;
 		enable-active-high;
-		gpio = <&pmic 7 GPIO_ACTIVE_HIGH>;
+		gpios = <&pmic 7 GPIO_ACTIVE_HIGH>;
 	};
 
 	usb1_vbus_reg: regulator-usb1 {
@@ -44,7 +44,7 @@ usb1_vbus_reg: regulator-usb1 {
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
 		enable-active-high;
-		gpio = <&gpio TEGRA_GPIO(I, 4) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(I, 4) GPIO_ACTIVE_HIGH>;
 		gpio-open-drain;
 		vin-supply = <&vdd_5v0_reg>;
 	};
@@ -55,7 +55,7 @@ usb3_vbus_reg: regulator-usb3 {
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
 		enable-active-high;
-		gpio = <&gpio TEGRA_GPIO(H, 7) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(H, 7) GPIO_ACTIVE_HIGH>;
 		gpio-open-drain;
 		vin-supply = <&vdd_5v0_reg>;
 	};
@@ -66,7 +66,7 @@ vdd_5v0_reg: regulator-5v0 {
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
 		enable-active-high;
-		gpio = <&pmic 2 GPIO_ACTIVE_HIGH>;
+		gpios = <&pmic 2 GPIO_ACTIVE_HIGH>;
 	};
 
 	vdd_bl_reg: regulator-bl {
@@ -77,7 +77,7 @@ vdd_bl_reg: regulator-bl {
 		regulator-always-on;
 		regulator-boot-on;
 		enable-active-high;
-		gpio = <&gpio TEGRA_GPIO(K, 3) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(K, 3) GPIO_ACTIVE_HIGH>;
 	};
 };
 
diff --git a/arch/arm/boot/dts/nvidia/tegra30-cardhu-a04.dts b/arch/arm/boot/dts/nvidia/tegra30-cardhu-a04.dts
index 2911f08863a0..c724152bf377 100644
--- a/arch/arm/boot/dts/nvidia/tegra30-cardhu-a04.dts
+++ b/arch/arm/boot/dts/nvidia/tegra30-cardhu-a04.dts
@@ -24,7 +24,7 @@ ddr_reg: regulator-ddr {
 		regulator-always-on;
 		regulator-boot-on;
 		enable-active-high;
-		gpio = <&pmic 7 GPIO_ACTIVE_HIGH>;
+		gpios = <&pmic 7 GPIO_ACTIVE_HIGH>;
 	};
 
 	sys_3v3_reg: regulator-3v3 {
@@ -35,7 +35,7 @@ sys_3v3_reg: regulator-3v3 {
 		regulator-always-on;
 		regulator-boot-on;
 		enable-active-high;
-		gpio = <&pmic 6 GPIO_ACTIVE_HIGH>;
+		gpios = <&pmic 6 GPIO_ACTIVE_HIGH>;
 	};
 
 	usb1_vbus_reg: regulator-usb1 {
@@ -44,7 +44,7 @@ usb1_vbus_reg: regulator-usb1 {
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
 		enable-active-high;
-		gpio = <&gpio TEGRA_GPIO(DD, 6) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(DD, 6) GPIO_ACTIVE_HIGH>;
 		gpio-open-drain;
 		vin-supply = <&vdd_5v0_reg>;
 	};
@@ -55,7 +55,7 @@ usb3_vbus_reg: regulator-usb3 {
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
 		enable-active-high;
-		gpio = <&gpio TEGRA_GPIO(DD, 4) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(DD, 4) GPIO_ACTIVE_HIGH>;
 		gpio-open-drain;
 		vin-supply = <&vdd_5v0_reg>;
 	};
@@ -66,7 +66,7 @@ vdd_5v0_reg: regulator-5v0 {
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
 		enable-active-high;
-		gpio = <&pmic 8 GPIO_ACTIVE_HIGH>;
+		gpios = <&pmic 8 GPIO_ACTIVE_HIGH>;
 	};
 
 	vdd_bl_reg: regulator-bl {
@@ -77,7 +77,7 @@ vdd_bl_reg: regulator-bl {
 		regulator-always-on;
 		regulator-boot-on;
 		enable-active-high;
-		gpio = <&gpio TEGRA_GPIO(DD, 2) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(DD, 2) GPIO_ACTIVE_HIGH>;
 	};
 
 	vdd_bl2_reg: regulator-bl2 {
@@ -88,6 +88,6 @@ vdd_bl2_reg: regulator-bl2 {
 		regulator-always-on;
 		regulator-boot-on;
 		enable-active-high;
-		gpio = <&gpio TEGRA_GPIO(DD, 0) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(DD, 0) GPIO_ACTIVE_HIGH>;
 	};
 };
diff --git a/arch/arm/boot/dts/nvidia/tegra30-cardhu.dtsi b/arch/arm/boot/dts/nvidia/tegra30-cardhu.dtsi
index 0120859d6d72..c6b9c2982ae3 100644
--- a/arch/arm/boot/dts/nvidia/tegra30-cardhu.dtsi
+++ b/arch/arm/boot/dts/nvidia/tegra30-cardhu.dtsi
@@ -522,7 +522,7 @@ cam_1v8_reg: regulator-cam {
 		regulator-min-microvolt = <1800000>;
 		regulator-max-microvolt = <1800000>;
 		enable-active-high;
-		gpio = <&gpio TEGRA_GPIO(BB, 4) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(BB, 4) GPIO_ACTIVE_HIGH>;
 		vin-supply = <&vio_reg>;
 	};
 
@@ -534,7 +534,7 @@ cp_5v_reg: regulator-5v0cp {
 		regulator-boot-on;
 		regulator-always-on;
 		enable-active-high;
-		gpio = <&pmic 0 GPIO_ACTIVE_HIGH>;
+		gpios = <&pmic 0 GPIO_ACTIVE_HIGH>;
 	};
 
 	emmc_3v3_reg: regulator-emmc {
@@ -545,7 +545,7 @@ emmc_3v3_reg: regulator-emmc {
 		regulator-always-on;
 		regulator-boot-on;
 		enable-active-high;
-		gpio = <&gpio TEGRA_GPIO(D, 1) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(D, 1) GPIO_ACTIVE_HIGH>;
 		vin-supply = <&sys_3v3_reg>;
 	};
 
@@ -555,7 +555,7 @@ modem_3v3_reg: regulator-modem {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 		enable-active-high;
-		gpio = <&gpio TEGRA_GPIO(D, 6) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(D, 6) GPIO_ACTIVE_HIGH>;
 	};
 
 	pex_hvdd_3v3_reg: regulator-pex {
@@ -564,7 +564,7 @@ pex_hvdd_3v3_reg: regulator-pex {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 		enable-active-high;
-		gpio = <&gpio TEGRA_GPIO(L, 7) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(L, 7) GPIO_ACTIVE_HIGH>;
 		vin-supply = <&sys_3v3_reg>;
 	};
 
@@ -574,7 +574,7 @@ vdd_cam1_ldo_reg: regulator-cam1 {
 		regulator-min-microvolt = <2800000>;
 		regulator-max-microvolt = <2800000>;
 		enable-active-high;
-		gpio = <&gpio TEGRA_GPIO(R, 6) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(R, 6) GPIO_ACTIVE_HIGH>;
 		vin-supply = <&sys_3v3_reg>;
 	};
 
@@ -584,7 +584,7 @@ vdd_cam2_ldo_reg: regulator-cam2 {
 		regulator-min-microvolt = <2800000>;
 		regulator-max-microvolt = <2800000>;
 		enable-active-high;
-		gpio = <&gpio TEGRA_GPIO(R, 7) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(R, 7) GPIO_ACTIVE_HIGH>;
 		vin-supply = <&sys_3v3_reg>;
 	};
 
@@ -594,7 +594,7 @@ vdd_cam3_ldo_reg: regulator-cam3 {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 		enable-active-high;
-		gpio = <&gpio TEGRA_GPIO(S, 0) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(S, 0) GPIO_ACTIVE_HIGH>;
 		vin-supply = <&sys_3v3_reg>;
 	};
 
@@ -606,7 +606,7 @@ vdd_com_reg: regulator-com {
 		regulator-always-on;
 		regulator-boot-on;
 		enable-active-high;
-		gpio = <&gpio TEGRA_GPIO(D, 0) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(D, 0) GPIO_ACTIVE_HIGH>;
 		vin-supply = <&sys_3v3_reg>;
 	};
 
@@ -616,7 +616,7 @@ vdd_fuse_3v3_reg: regulator-fuse {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 		enable-active-high;
-		gpio = <&gpio TEGRA_GPIO(L, 6) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(L, 6) GPIO_ACTIVE_HIGH>;
 		vin-supply = <&sys_3v3_reg>;
 	};
 
@@ -628,7 +628,7 @@ vdd_pnl1_reg: regulator-pnl1 {
 		regulator-always-on;
 		regulator-boot-on;
 		enable-active-high;
-		gpio = <&gpio TEGRA_GPIO(L, 4) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(L, 4) GPIO_ACTIVE_HIGH>;
 		vin-supply = <&sys_3v3_reg>;
 	};
 
@@ -638,7 +638,7 @@ vdd_vid_reg: regulator-vid {
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
 		enable-active-high;
-		gpio = <&gpio TEGRA_GPIO(T, 0) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(T, 0) GPIO_ACTIVE_HIGH>;
 		gpio-open-drain;
 		vin-supply = <&vdd_5v0_reg>;
 	};
diff --git a/arch/arm/boot/dts/nvidia/tegra30-colibri-eval-v3.dts b/arch/arm/boot/dts/nvidia/tegra30-colibri-eval-v3.dts
index 1990bf8e122d..2a3797e00014 100644
--- a/arch/arm/boot/dts/nvidia/tegra30-colibri-eval-v3.dts
+++ b/arch/arm/boot/dts/nvidia/tegra30-colibri-eval-v3.dts
@@ -194,7 +194,7 @@ reg_usbh_vbus: regulator-usbh-vbus {
 		regulator-name = "VCC_USB[1-4]";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio TEGRA_GPIO(W, 2) GPIO_ACTIVE_LOW>;
+		gpios = <&gpio TEGRA_GPIO(W, 2) GPIO_ACTIVE_LOW>;
 		vin-supply = <&reg_5v0>;
 	};
 };
diff --git a/arch/arm/boot/dts/nvidia/tegra30-colibri.dtsi b/arch/arm/boot/dts/nvidia/tegra30-colibri.dtsi
index 81c8a5fd92cc..a12adad63c2d 100644
--- a/arch/arm/boot/dts/nvidia/tegra30-colibri.dtsi
+++ b/arch/arm/boot/dts/nvidia/tegra30-colibri.dtsi
@@ -994,7 +994,7 @@ reg_1v8_avdd_hdmi_pll: regulator-1v8-avdd-hdmi-pll {
 		regulator-min-microvolt = <1800000>;
 		regulator-max-microvolt = <1800000>;
 		enable-active-high;
-		gpio = <&pmic 6 GPIO_ACTIVE_HIGH>;
+		gpios = <&pmic 6 GPIO_ACTIVE_HIGH>;
 		vin-supply = <&reg_1v8_vio>;
 	};
 
@@ -1004,7 +1004,7 @@ reg_3v3_avdd_hdmi: regulator-3v3-avdd-hdmi {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 		enable-active-high;
-		gpio = <&pmic 6 GPIO_ACTIVE_HIGH>;
+		gpios = <&pmic 6 GPIO_ACTIVE_HIGH>;
 		vin-supply = <&reg_module_3v3>;
 	};
 
@@ -1022,7 +1022,7 @@ reg_lan_v_bus: regulator-lan-v-bus {
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
 		enable-active-high;
-		gpio = <&gpio TEGRA_GPIO(DD, 2) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(DD, 2) GPIO_ACTIVE_HIGH>;
 	};
 
 	reg_module_3v3: regulator-module-3v3 {
diff --git a/arch/arm/boot/dts/nvidia/tegra30-lg-p895.dts b/arch/arm/boot/dts/nvidia/tegra30-lg-p895.dts
index e32fafc7f5e0..61bc44d9c4f4 100644
--- a/arch/arm/boot/dts/nvidia/tegra30-lg-p895.dts
+++ b/arch/arm/boot/dts/nvidia/tegra30-lg-p895.dts
@@ -482,7 +482,7 @@ led-power {
 	};
 
 	regulator-lcd3v {
-		gpio = <&gpio TEGRA_GPIO(BB, 0) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(BB, 0) GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/nvidia/tegra30-lg-x3.dtsi b/arch/arm/boot/dts/nvidia/tegra30-lg-x3.dtsi
index 909260a5d0fb..23915a5c32d9 100644
--- a/arch/arm/boot/dts/nvidia/tegra30-lg-x3.dtsi
+++ b/arch/arm/boot/dts/nvidia/tegra30-lg-x3.dtsi
@@ -1590,7 +1590,7 @@ vdd_3v0_sen: regulator-sen3v {
 		regulator-min-microvolt = <3000000>;
 		regulator-max-microvolt = <3000000>;
 		regulator-boot-on;
-		gpio = <&gpio TEGRA_GPIO(X, 7) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(X, 7) GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&vdd_3v3_vbat>;
 	};
@@ -1601,7 +1601,7 @@ vdd_3v0_proxi: regulator-proxi {
 		regulator-min-microvolt = <3000000>;
 		regulator-max-microvolt = <3000000>;
 		regulator-boot-on;
-		gpio = <&gpio TEGRA_GPIO(X, 1) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(X, 1) GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&vdd_3v3_vbat>;
 	};
@@ -1612,7 +1612,7 @@ vdd_1v8_sen: regulator-sen1v8 {
 		regulator-min-microvolt = <1800000>;
 		regulator-max-microvolt = <1800000>;
 		regulator-boot-on;
-		gpio = <&gpio TEGRA_GPIO(D, 2) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(D, 2) GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&vdd_3v3_vbat>;
 	};
@@ -1632,7 +1632,7 @@ iovcc_1v8_lcd: regulator-lcd1v8 {
 		regulator-min-microvolt = <1800000>;
 		regulator-max-microvolt = <1800000>;
 		regulator-boot-on;
-		gpio = <&gpio TEGRA_GPIO(Y, 0) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(Y, 0) GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&vdd_3v3_vbat>;
 	};
@@ -1643,7 +1643,7 @@ vio_1v8_mhl: regulator-mhl1v8 {
 		regulator-min-microvolt = <1800000>;
 		regulator-max-microvolt = <1800000>;
 		regulator-boot-on;
-		gpio = <&gpio TEGRA_GPIO(V, 2) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(V, 2) GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&vdd_3v3_vbat>;
 	};
@@ -1654,7 +1654,7 @@ vdd_3v0_touch: regulator-touchpwr {
 		regulator-min-microvolt = <3000000>;
 		regulator-max-microvolt = <3000000>;
 		regulator-boot-on;
-		gpio = <&gpio TEGRA_GPIO(Q, 1) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(Q, 1) GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&vdd_3v3_vbat>;
 	};
@@ -1665,7 +1665,7 @@ vdd_1v8_touch: regulator-touchvio {
 		regulator-min-microvolt = <1800000>;
 		regulator-max-microvolt = <1800000>;
 		regulator-boot-on;
-		gpio = <&gpio TEGRA_GPIO(X, 4) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(X, 4) GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&vdd_3v3_vbat>;
 	};
@@ -1676,7 +1676,7 @@ vcc_1v8_gps: regulator-gps {
 		regulator-min-microvolt = <1800000>;
 		regulator-max-microvolt = <1800000>;
 		regulator-boot-on;
-		gpio = <&gpio TEGRA_GPIO(Y, 1) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(Y, 1) GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&vdd_3v3_vbat>;
 	};
@@ -1686,7 +1686,7 @@ vio_1v8_front: regulator-frontvio {
 		regulator-name = "vt_1v8_cam_vio";
 		regulator-min-microvolt = <1800000>;
 		regulator-max-microvolt = <1800000>;
-		gpio = <&gpio TEGRA_GPIO(Y, 2) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(Y, 2) GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&vdd_3v3_vbat>;
 	};
diff --git a/arch/arm/boot/dts/nvidia/tegra30-ouya.dts b/arch/arm/boot/dts/nvidia/tegra30-ouya.dts
index 7e3de26ca960..8c0f9f66d438 100644
--- a/arch/arm/boot/dts/nvidia/tegra30-ouya.dts
+++ b/arch/arm/boot/dts/nvidia/tegra30-ouya.dts
@@ -4674,7 +4674,7 @@ sdmmc_3v3_reg: regulator-sdmmc-3v3 {
 		regulator-max-microvolt = <3300000>;
 		enable-active-high;
 		regulator-always-on;
-		gpio = <&gpio TEGRA_GPIO(D, 4) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(D, 4) GPIO_ACTIVE_HIGH>;
 		vin-supply = <&sys_3v3_reg>;
 	};
 
@@ -4684,7 +4684,7 @@ vdd_fuse_3v3_reg: regulator-vdd-fuse-3v3 {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 		enable-active-high;
-		gpio = <&gpio TEGRA_GPIO(L, 6) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(L, 6) GPIO_ACTIVE_HIGH>;
 		vin-supply = <&sys_3v3_reg>;
 		regulator-always-on;
 	};
@@ -4695,7 +4695,7 @@ vdd_vid_reg: regulator-vdd-vid {
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
 		enable-active-high;
-		gpio = <&gpio TEGRA_GPIO(T, 0) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(T, 0) GPIO_ACTIVE_HIGH>;
 		vin-supply = <&vdd_5v0_reg>;
 		regulator-boot-on;
 	};
@@ -4707,7 +4707,7 @@ ddr_reg: regulator-ddr {
 		regulator-max-microvolt = <1500000>;
 		regulator-always-on;
 		enable-active-high;
-		gpio = <&pmic 7 GPIO_ACTIVE_HIGH>;
+		gpios = <&pmic 7 GPIO_ACTIVE_HIGH>;
 		regulator-boot-on;
 		vin-supply = <&vdd_12v_in>;
 	};
@@ -4718,7 +4718,7 @@ sys_3v3_reg: regulator-sys-3v3 {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 		enable-active-high;
-		gpio = <&pmic 6 GPIO_ACTIVE_HIGH>;
+		gpios = <&pmic 6 GPIO_ACTIVE_HIGH>;
 		regulator-always-on;
 		regulator-boot-on;
 		vin-supply = <&vdd_12v_in>;
@@ -4730,7 +4730,7 @@ vdd_5v0_reg: regulator-vdd-5v0 {
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
 		enable-active-high;
-		gpio = <&pmic 0 GPIO_ACTIVE_HIGH>;
+		gpios = <&pmic 0 GPIO_ACTIVE_HIGH>;
 		regulator-always-on;
 		regulator-boot-on;
 		vin-supply = <&vdd_12v_in>;
@@ -4740,7 +4740,7 @@ vdd_smsc: regulator-vdd-smsc {
 		compatible = "regulator-fixed";
 		regulator-name = "vdd_smsc";
 		enable-active-high;
-		gpio = <&gpio TEGRA_GPIO(DD, 5) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(DD, 5) GPIO_ACTIVE_HIGH>;
 	};
 
 	usb3_vbus_reg: regulator-usb3-vbus {
@@ -4749,7 +4749,7 @@ usb3_vbus_reg: regulator-usb3-vbus {
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
 		enable-active-high;
-		gpio = <&gpio TEGRA_GPIO(DD, 4) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(DD, 4) GPIO_ACTIVE_HIGH>;
 		vin-supply = <&vdd_5v0_reg>;
 	};
 
diff --git a/arch/arm/boot/dts/nvidia/tegra30-pegatron-chagall.dts b/arch/arm/boot/dts/nvidia/tegra30-pegatron-chagall.dts
index 4012f9c799a8..dd6deb0e86df 100644
--- a/arch/arm/boot/dts/nvidia/tegra30-pegatron-chagall.dts
+++ b/arch/arm/boot/dts/nvidia/tegra30-pegatron-chagall.dts
@@ -1454,7 +1454,7 @@ vdd_pnl: regulator-panel {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 		regulator-enable-ramp-delay = <300000>;
-		gpio = <&gpio TEGRA_GPIO(W, 1) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(W, 1) GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&vdd_3v3_sys>;
 	};
@@ -1464,7 +1464,7 @@ vdd_3v3_sen: regulator-sensors {
 		regulator-name = "sen_3v3_en";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio TEGRA_GPIO(K, 5) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(K, 5) GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&vdd_3v3_sys>;
 	};
@@ -1475,7 +1475,7 @@ vdd_5v0_bl: regulator-bl {
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
 		regulator-boot-on;
-		gpio = <&gpio TEGRA_GPIO(C, 6) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(C, 6) GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&vdd_5v0_sys>;
 	};
@@ -1485,7 +1485,7 @@ hdmi_5v0_sys: regulator-hdmi {
 		regulator-name = "hdmi_5v0_sys";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio TEGRA_GPIO(P, 2) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(P, 2) GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&vdd_5v0_sys>;
 	};
@@ -1495,7 +1495,7 @@ vdd_vbus_usb1: regulator-usb1 {
 		regulator-name = "vdd_vbus_micro_usb";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio TEGRA_GPIO(DD, 3) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(DD, 3) GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&vdd_5v0_sys>;
 	};
@@ -1505,7 +1505,7 @@ vdd_vbus_usb3: regulator-usb3 {
 		regulator-name = "vdd_vbus_typea_usb";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio TEGRA_GPIO(CC, 6) GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio TEGRA_GPIO(CC, 6) GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&vdd_5v0_sys>;
 	};
diff --git a/arch/arm/boot/dts/nxp/imx/e60k02.dtsi b/arch/arm/boot/dts/nxp/imx/e60k02.dtsi
index 0029c12f16c8..d601826737a2 100644
--- a/arch/arm/boot/dts/nxp/imx/e60k02.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/e60k02.dtsi
@@ -62,7 +62,7 @@ reg_wifi: regulator-wifi {
 		regulator-name = "SD3_SPWR";
 		regulator-min-microvolt = <3000000>;
 		regulator-max-microvolt = <3000000>;
-		gpio = <&gpio4 29 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio4 29 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/nxp/imx/e70k02.dtsi b/arch/arm/boot/dts/nxp/imx/e70k02.dtsi
index dcc3c9d488a8..f5d9578cdb4c 100644
--- a/arch/arm/boot/dts/nxp/imx/e70k02.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/e70k02.dtsi
@@ -74,7 +74,7 @@ reg_wifi: regulator-wifi {
 		regulator-name = "SD3_SPWR";
 		regulator-min-microvolt = <3000000>;
 		regulator-max-microvolt = <3000000>;
-		gpio = <&gpio4 29 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio4 29 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/nxp/imx/imx25-eukrea-mbimxsd25-baseboard-cmo-qvga.dts b/arch/arm/boot/dts/nxp/imx/imx25-eukrea-mbimxsd25-baseboard-cmo-qvga.dts
index 6cddb2cc36fe..3562ed4e9091 100644
--- a/arch/arm/boot/dts/nxp/imx/imx25-eukrea-mbimxsd25-baseboard-cmo-qvga.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx25-eukrea-mbimxsd25-baseboard-cmo-qvga.dts
@@ -37,7 +37,7 @@ reg_lcd_3v3: regulator-0 {
 		regulator-name = "lcd-3v3";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio1 26 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 26 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 };
diff --git a/arch/arm/boot/dts/nxp/imx/imx25-karo-tx25.dts b/arch/arm/boot/dts/nxp/imx/imx25-karo-tx25.dts
index 458b94d3d4ed..00607a17fffc 100644
--- a/arch/arm/boot/dts/nxp/imx/imx25-karo-tx25.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx25-karo-tx25.dts
@@ -19,7 +19,7 @@ reg_fec_phy: regulator-0 {
 		regulator-name = "fec-phy";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio4 9 0>;
+		gpios = <&gpio4 9 0>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/nxp/imx/imx25-pdk.dts b/arch/arm/boot/dts/nxp/imx/imx25-pdk.dts
index dd176fb54e58..8b55306cdbfb 100644
--- a/arch/arm/boot/dts/nxp/imx/imx25-pdk.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx25-pdk.dts
@@ -21,7 +21,7 @@ reg_fec_3v3: regulator-0 {
 		regulator-name = "fec-3v3";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio2 3 0>;
+		gpios = <&gpio2 3 0>;
 		enable-active-high;
 	};
 
@@ -44,7 +44,7 @@ reg_can_3v3: regulator-3 {
 		regulator-name = "can-3v3";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio4 6 0>;
+		gpios = <&gpio4 6 0>;
 	};
 
 	sound {
diff --git a/arch/arm/boot/dts/nxp/imx/imx27-eukrea-mbimxsd27-baseboard.dts b/arch/arm/boot/dts/nxp/imx/imx27-eukrea-mbimxsd27-baseboard.dts
index d78793601306..02fe4de256f8 100644
--- a/arch/arm/boot/dts/nxp/imx/imx27-eukrea-mbimxsd27-baseboard.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx27-eukrea-mbimxsd27-baseboard.dts
@@ -61,7 +61,7 @@ reg_lcd: regulator-0 {
 		regulator-name = "LCD";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio1 25 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 25 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 };
diff --git a/arch/arm/boot/dts/nxp/imx/imx27-phytec-phycore-rdk.dts b/arch/arm/boot/dts/nxp/imx/imx27-phytec-phycore-rdk.dts
index b8048e12e3d9..c739f2d16205 100644
--- a/arch/arm/boot/dts/nxp/imx/imx27-phytec-phycore-rdk.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx27-phytec-phycore-rdk.dts
@@ -44,7 +44,7 @@ regulator-2 {
 		regulator-name = "CSI_EN";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio2 24 GPIO_ACTIVE_LOW>;
+		gpios = <&gpio2 24 GPIO_ACTIVE_LOW>;
 		regulator-always-on;
 	};
 
diff --git a/arch/arm/boot/dts/nxp/imx/imx51-babbage.dts b/arch/arm/boot/dts/nxp/imx/imx51-babbage.dts
index f4a47e8348b2..86f929f4da77 100644
--- a/arch/arm/boot/dts/nxp/imx/imx51-babbage.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx51-babbage.dts
@@ -180,7 +180,7 @@ reg_hub_reset: regulator-hub-reset {
 		regulator-name = "hub_reset";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio1 7 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 7 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/nxp/imx/imx51-eukrea-mbimxsd51-baseboard.dts b/arch/arm/boot/dts/nxp/imx/imx51-eukrea-mbimxsd51-baseboard.dts
index aff380e999c7..10c1bb0bf102 100644
--- a/arch/arm/boot/dts/nxp/imx/imx51-eukrea-mbimxsd51-baseboard.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx51-eukrea-mbimxsd51-baseboard.dts
@@ -50,7 +50,7 @@ reg_can: regulator-can {
 		regulator-name = "CAN_RST";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio4 15 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio4 15 GPIO_ACTIVE_HIGH>;
 		startup-delay-us = <20000>;
 		enable-active-high;
 	};
diff --git a/arch/arm/boot/dts/nxp/imx/imx51-ts4800.dts b/arch/arm/boot/dts/nxp/imx/imx51-ts4800.dts
index 079bd3d14999..3ea72aa678c4 100644
--- a/arch/arm/boot/dts/nxp/imx/imx51-ts4800.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx51-ts4800.dts
@@ -39,7 +39,7 @@ backlight_reg: regulator-backlight {
 		regulator-name = "enable_lcd_reg";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio4 9 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio4 9 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/nxp/imx/imx51-zii-scu2-mezz.dts b/arch/arm/boot/dts/nxp/imx/imx51-zii-scu2-mezz.dts
index 625f9ac671ae..0d702d9c7348 100644
--- a/arch/arm/boot/dts/nxp/imx/imx51-zii-scu2-mezz.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx51-zii-scu2-mezz.dts
@@ -30,7 +30,7 @@ usb_vbus: regulator-usb-vbus {
 		compatible = "regulator-fixed";
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_usb_mmc_reset>;
-		gpio = <&gpio3 13 GPIO_ACTIVE_LOW>;
+		gpios = <&gpio3 13 GPIO_ACTIVE_LOW>;
 		startup-delay-us = <150000>;
 		regulator-name = "usb_vbus";
 		regulator-min-microvolt = <5000000>;
diff --git a/arch/arm/boot/dts/nxp/imx/imx51-zii-scu3-esb.dts b/arch/arm/boot/dts/nxp/imx/imx51-zii-scu3-esb.dts
index 19a3b142c964..5859c6451c94 100644
--- a/arch/arm/boot/dts/nxp/imx/imx51-zii-scu3-esb.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx51-zii-scu3-esb.dts
@@ -30,7 +30,7 @@ usb_vbus: regulator-usb-vbus {
 
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_usb_mmc_reset>;
-		gpio = <&gpio4 19 GPIO_ACTIVE_LOW>;
+		gpios = <&gpio4 19 GPIO_ACTIVE_LOW>;
 		startup-delay-us = <150000>;
 	};
 };
diff --git a/arch/arm/boot/dts/nxp/imx/imx53-cx9020.dts b/arch/arm/boot/dts/nxp/imx/imx53-cx9020.dts
index 0814f5665a59..19498bd09527 100644
--- a/arch/arm/boot/dts/nxp/imx/imx53-cx9020.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx53-cx9020.dts
@@ -125,7 +125,7 @@ reg_usb_vbus: regulator-vbus {
 		regulator-name = "usb_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio7 8 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio7 8 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 };
diff --git a/arch/arm/boot/dts/nxp/imx/imx53-m53evk.dts b/arch/arm/boot/dts/nxp/imx/imx53-m53evk.dts
index ba0c62994f75..87117f190ddb 100644
--- a/arch/arm/boot/dts/nxp/imx/imx53-m53evk.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx53-m53evk.dts
@@ -70,7 +70,7 @@ reg_usbh1_vbus: regulator-usbh1-vbus {
 		regulator-name = "vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio1 2 0>;
+		gpios = <&gpio1 2 0>;
 	};
 
 	reg_usb_otg_vbus: regulator-usb-otg-vbus {
@@ -78,7 +78,7 @@ reg_usb_otg_vbus: regulator-usb-otg-vbus {
 		regulator-name = "usb_otg_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio1 4 0>;
+		gpios = <&gpio1 4 0>;
 	};
 
 	sound {
diff --git a/arch/arm/boot/dts/nxp/imx/imx53-m53menlo.dts b/arch/arm/boot/dts/nxp/imx/imx53-m53menlo.dts
index 558751e730f3..7f7fd3e9e217 100644
--- a/arch/arm/boot/dts/nxp/imx/imx53-m53menlo.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx53-m53menlo.dts
@@ -103,7 +103,7 @@ reg_usbh1_vbus: regulator-usbh1-vbus {
 		regulator-name = "vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio1 2 0>;
+		gpios = <&gpio1 2 0>;
 	};
 };
 
diff --git a/arch/arm/boot/dts/nxp/imx/imx53-mba53.dts b/arch/arm/boot/dts/nxp/imx/imx53-mba53.dts
index 0d336cbdb451..08bcba19d628 100644
--- a/arch/arm/boot/dts/nxp/imx/imx53-mba53.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx53-mba53.dts
@@ -41,7 +41,7 @@ display1_in: endpoint {
 	reg_backlight: regulator-backlight {
 		compatible = "regulator-fixed";
 		regulator-name = "lcd-supply";
-		gpio = <&gpio2 5 0>;
+		gpios = <&gpio2 5 0>;
 		startup-delay-us = <5000>;
 	};
 
diff --git a/arch/arm/boot/dts/nxp/imx/imx53-ppd.dts b/arch/arm/boot/dts/nxp/imx/imx53-ppd.dts
index e939acc1c88b..e2347e29c9d3 100644
--- a/arch/arm/boot/dts/nxp/imx/imx53-ppd.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx53-ppd.dts
@@ -104,7 +104,7 @@ reg_usb_otg_vbus: regulator-usb-otg-vbus {
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
 		pinctrl-0 = <&pinctrl_usb_otg_vbus>;
-		gpio = <&gpio4 15 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio4 15 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -123,7 +123,7 @@ reg_usbh2_vbus: regulator-usbh2-vbus {
 		regulator-max-microvolt = <5000000>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_usbh2_vbus>;
-		gpio = <&gpio3 31 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 31 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -134,7 +134,7 @@ reg_usbh3_vbus: regulator-usbh3-vbus {
 		regulator-max-microvolt = <5000000>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_usbh3_vbus>;
-		gpio = <&gpio5 27 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio5 27 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/nxp/imx/imx53-qsb-common.dtsi b/arch/arm/boot/dts/nxp/imx/imx53-qsb-common.dtsi
index 05d7a462ea25..d213c110d761 100644
--- a/arch/arm/boot/dts/nxp/imx/imx53-qsb-common.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx53-qsb-common.dtsi
@@ -112,7 +112,7 @@ reg_usb_vbus: regulator-usb-vbus {
 		regulator-name = "usb_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio7 8 0>;
+		gpios = <&gpio7 8 0>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/nxp/imx/imx53-sk-imx53.dts b/arch/arm/boot/dts/nxp/imx/imx53-sk-imx53.dts
index 1a00d290092a..15c2c8dd6732 100644
--- a/arch/arm/boot/dts/nxp/imx/imx53-sk-imx53.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx53-sk-imx53.dts
@@ -34,7 +34,7 @@ reg_usb1_vbus: regulator-usb-vbus {
 		regulator-name = "usb_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio2 29 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio2 29 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -43,7 +43,7 @@ reg_usb_otg_vbus: regulator-otg-vbus {
 		regulator-name = "usb_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio2 24 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio2 24 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 };
diff --git a/arch/arm/boot/dts/nxp/imx/imx53-tx53-x03x.dts b/arch/arm/boot/dts/nxp/imx/imx53-tx53-x03x.dts
index a02d77bb5672..88aa541e675c 100644
--- a/arch/arm/boot/dts/nxp/imx/imx53-tx53-x03x.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx53-tx53-x03x.dts
@@ -206,7 +206,7 @@ reg_lcd_pwr: regulator-lcd-pwr {
 		regulator-name = "LCD POWER";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio2 31 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio2 31 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		regulator-boot-on;
 	};
@@ -216,7 +216,7 @@ reg_lcd_reset: regulator-lcd-reset {
 		regulator-name = "LCD RESET";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio3 29 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 29 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		regulator-boot-on;
 	};
diff --git a/arch/arm/boot/dts/nxp/imx/imx53-tx53-x13x.dts b/arch/arm/boot/dts/nxp/imx/imx53-tx53-x13x.dts
index e10c179dbdb3..9610d733f115 100644
--- a/arch/arm/boot/dts/nxp/imx/imx53-tx53-x13x.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx53-tx53-x13x.dts
@@ -104,7 +104,7 @@ reg_lcd_pwr0: regulator-lvds0-pwr {
 		regulator-name = "LVDS0 POWER";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio3 29 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 29 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		regulator-boot-on;
 	};
@@ -114,7 +114,7 @@ reg_lcd_pwr1: regulator-lvds1-pwr {
 		regulator-name = "LVDS1 POWER";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio2 31 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio2 31 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		regulator-boot-on;
 	};
diff --git a/arch/arm/boot/dts/nxp/imx/imx53-tx53.dtsi b/arch/arm/boot/dts/nxp/imx/imx53-tx53.dtsi
index a439a47fb65a..fbd9264b4f93 100644
--- a/arch/arm/boot/dts/nxp/imx/imx53-tx53.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx53-tx53.dtsi
@@ -122,7 +122,7 @@ reg_can_xcvr: regulator-can-xcvr {
 		regulator-max-microvolt = <3300000>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_can_xcvr>;
-		gpio = <&gpio4 21 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio4 21 GPIO_ACTIVE_HIGH>;
 	};
 
 	reg_usbh1_vbus: regulator-usbh1-vbus {
@@ -132,7 +132,7 @@ reg_usbh1_vbus: regulator-usbh1-vbus {
 		regulator-max-microvolt = <5000000>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_usbh1_vbus>;
-		gpio = <&gpio3 31 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 31 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -143,7 +143,7 @@ reg_usbotg_vbus: regulator-usbotg-vbus {
 		regulator-max-microvolt = <5000000>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_usbotg_vbus>;
-		gpio = <&gpio1 7 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 7 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/nxp/imx/imx53-voipac-dmm-668.dtsi b/arch/arm/boot/dts/nxp/imx/imx53-voipac-dmm-668.dtsi
index c0622cf7188c..53628f70f6cf 100644
--- a/arch/arm/boot/dts/nxp/imx/imx53-voipac-dmm-668.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx53-voipac-dmm-668.dtsi
@@ -28,7 +28,7 @@ reg_usb_vbus: regulator-usb-vbus {
 		regulator-name = "usb_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio3 31 0>; /* PEN */
+		gpios = <&gpio3 31 0>; /* PEN */
 		enable-active-high;
 	};
 };
diff --git a/arch/arm/boot/dts/nxp/imx/imx6-logicpd-baseboard.dtsi b/arch/arm/boot/dts/nxp/imx/imx6-logicpd-baseboard.dtsi
index d477a937b47a..034c325f9770 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6-logicpd-baseboard.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6-logicpd-baseboard.dtsi
@@ -76,7 +76,7 @@ reg_usb_otg_vbus: regulator-otg-vbus {
 		regulator-name = "usb_otg_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio4 15 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio4 15 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -87,7 +87,7 @@ reg_usb_h1_vbus: regulator-usb-h1-vbus {
 		regulator-name = "usb_h1_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio7 12 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio7 12 GPIO_ACTIVE_HIGH>;
 		startup-delay-us = <70000>;
 		enable-active-high;
 	};
@@ -99,7 +99,7 @@ reg_3v3: regulator-3v3 {
 		regulator-name = "reg_3v3";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio1 26 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 26 GPIO_ACTIVE_HIGH>;
 		startup-delay-us = <70000>;
 		enable-active-high;
 		regulator-always-on;
@@ -112,7 +112,7 @@ reg_enet: regulator-ethernet {
 		regulator-name = "ethernet-supply";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio3 31 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 31 GPIO_ACTIVE_HIGH>;
 		startup-delay-us = <70000>;
 		enable-active-high;
 		vin-supply = <&sw4_reg>;
@@ -125,7 +125,7 @@ reg_audio: regulator-audio {
 		regulator-name = "3v3_aud";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio1 29 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 29 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&reg_3v3>;
 	};
@@ -137,7 +137,7 @@ reg_hdmi: regulator-hdmi {
 		regulator-name = "hdmi-supply";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio3 20 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 20 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&reg_3v3>;
 	};
@@ -147,7 +147,7 @@ reg_uart3: regulator-uart3 {
 		pinctrl-0 = <&pinctrl_reg_uart3>;
 		compatible = "regulator-fixed";
 		regulator-name = "uart3-supply";
-		gpio = <&gpio1 28 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 28 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		regulator-always-on;
 		vin-supply = <&reg_3v3>;
@@ -158,7 +158,7 @@ reg_1v8: regulator-1v8 {
 		pinctrl-0 = <&pinctrl_reg_1v8>;
 		compatible = "regulator-fixed";
 		regulator-name = "1v8-supply";
-		gpio = <&gpio3 30 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 30 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		regulator-always-on;
 		vin-supply = <&reg_3v3>;
@@ -171,7 +171,7 @@ reg_pcie: regulator-pcie {
 		regulator-name = "mpcie_3v3";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio1 2 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 2 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -182,7 +182,7 @@ reg_mipi: regulator-mipi {
 		regulator-name = "mipi_pwr_en";
 		regulator-min-microvolt = <2800000>;
 		regulator-max-microvolt = <2800000>;
-		gpio = <&gpio3 19 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 19 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/nxp/imx/imx6-logicpd-som.dtsi b/arch/arm/boot/dts/nxp/imx/imx6-logicpd-som.dtsi
index 547fb141ec0c..2eec0ac5e9e8 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6-logicpd-som.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6-logicpd-som.dtsi
@@ -20,7 +20,7 @@ reg_wl18xx_vmmc: regulator-wl18xx {
 		regulator-name = "vwl1837";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio7 0 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio7 0 GPIO_ACTIVE_HIGH>;
 		startup-delay-us = <70000>;
 		enable-active-high;
 	};
diff --git a/arch/arm/boot/dts/nxp/imx/imx6dl-alti6p.dts b/arch/arm/boot/dts/nxp/imx/imx6dl-alti6p.dts
index 4989e8d069a1..0a782052926a 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6dl-alti6p.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx6dl-alti6p.dts
@@ -119,7 +119,7 @@ reg_h1_vbus: regulator-h1-vbus {
 		regulator-name = "h1-vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio1 0 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 0 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -128,7 +128,7 @@ reg_otg_vbus: regulator-otg-vbus {
 		regulator-name = "otg-vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio3 22 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 22 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/nxp/imx/imx6dl-b1x5pv2.dtsi b/arch/arm/boot/dts/nxp/imx/imx6dl-b1x5pv2.dtsi
index 9f1655540cb9..799065b6e3b8 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6dl-b1x5pv2.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6dl-b1x5pv2.dtsi
@@ -80,7 +80,7 @@ reg_5v0_audio: regulator-5v0-audio {
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
 		vin-supply = <&reg_5v>;
-		gpio = <&tca6424a 16 GPIO_ACTIVE_HIGH>;
+		gpios = <&tca6424a 16 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		/*
 		 * This must be always-on for da7212, which has some not
@@ -99,7 +99,7 @@ reg_3v3_audio: regulator-3v3-audio {
 		vin-supply = <&reg_3v3>;
 		pinctrl-0 = <&pinctrl_q7_hda_reset>;
 		pinctrl-names = "default";
-		gpio = <&gpio6 8 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio6 8 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -121,7 +121,7 @@ reg_wlan: regulator-wlan {
 		vin-supply = <&reg_3v3>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_q7_sdio_power>;
-		gpio = <&gpio4 30 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio4 30 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		startup-delay-us = <70000>;
 	};
@@ -134,7 +134,7 @@ reg_bl: regulator-backlight {
 		vin-supply = <&reg_syspwr>;
 		pinctrl-0 = <&pinctrl_q7_lcd_power>;
 		pinctrl-names = "default";
-		gpio = <&gpio1 7 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 7 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/nxp/imx/imx6dl-colibri-iris-v2.dts b/arch/arm/boot/dts/nxp/imx/imx6dl-colibri-iris-v2.dts
index 3a6d3889760d..3d44ffe9413d 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6dl-colibri-iris-v2.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx6dl-colibri-iris-v2.dts
@@ -19,7 +19,7 @@ reg_3v3_vmmc: regulator-3v3-vmmc {
 		regulator-name = "3v3_vmmc";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio2 11 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio2 11 GPIO_ACTIVE_HIGH>;
 		startup-delay-us = <100>;
 		enable-active-high;
 	};
diff --git a/arch/arm/boot/dts/nxp/imx/imx6dl-eckelmann-ci4x10.dts b/arch/arm/boot/dts/nxp/imx/imx6dl-eckelmann-ci4x10.dts
index 33825b5a8f26..d9e35270c695 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6dl-eckelmann-ci4x10.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx6dl-eckelmann-ci4x10.dts
@@ -38,7 +38,7 @@ reg_usb_h1_vbus: regulator-usb-h1-vbus {
 		regulator-name = "usb_h1_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio3 31 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 31 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/nxp/imx/imx6dl-lanmcu.dts b/arch/arm/boot/dts/nxp/imx/imx6dl-lanmcu.dts
index 7c62db91173b..9ff275acc1dd 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6dl-lanmcu.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx6dl-lanmcu.dts
@@ -85,7 +85,7 @@ reg_otg_vbus: regulator-otg-vbus {
 		regulator-name = "otg-vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio3 22 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 22 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/nxp/imx/imx6dl-mamoj.dts b/arch/arm/boot/dts/nxp/imx/imx6dl-mamoj.dts
index 72ee236d2f5e..8a4a71ad2f3b 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6dl-mamoj.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx6dl-mamoj.dts
@@ -71,7 +71,7 @@ reg_lcd_3v3: regulator-lcd-dvdd {
 		regulator-name = "lcd-dvdd";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio3 1 0>;
+		gpios = <&gpio3 1 0>;
 		enable-active-high;
 		startup-delay-us = <21000>;
 	};
@@ -81,7 +81,7 @@ reg_lcd_power: regulator-lcd-power {
 		regulator-name = "lcd-enable";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio3 6 0>;
+		gpios = <&gpio3 6 0>;
 		enable-active-high;
 		vin-supply = <&reg_lcd_3v3>;
 	};
@@ -91,7 +91,7 @@ reg_lcd_vgl: regulator-lcd-vgl {
 		regulator-name = "lcd-vgl";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio2 20 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio2 20 GPIO_ACTIVE_HIGH>;
 		startup-delay-us = <6000>;
 		enable-active-high;
 		vin-supply = <&reg_lcd_power>;
@@ -102,7 +102,7 @@ reg_lcd_vgh: regulator-lcd-vgh {
 		regulator-name = "lcd-vgh";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio3 31 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 31 GPIO_ACTIVE_HIGH>;
 		startup-delay-us = <6000>;
 		enable-active-high;
 		vin-supply = <&reg_lcd_avdd>;
@@ -113,7 +113,7 @@ reg_lcd_vcom: regulator-lcd-vcom {
 		regulator-name = "lcd-vcom";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio4 14 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio4 14 GPIO_ACTIVE_HIGH>;
 		startup-delay-us = <11000>;
 		enable-active-high;
 		vin-supply = <&reg_lcd_vgh>;
@@ -124,7 +124,7 @@ reg_lcd_lr: regulator-lcd-lr {
 		regulator-name = "lcd-lr";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio4 15 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio4 15 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&reg_lcd_vcom>;
 	};
@@ -134,7 +134,7 @@ reg_lcd_avdd: regulator-lcd-avdd {
 		regulator-name = "lcd-avdd";
 		regulator-min-microvolt = <10280000>;
 		regulator-max-microvolt = <10280000>;
-		gpio = <&gpio2 13 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio2 13 GPIO_ACTIVE_HIGH>;
 		startup-delay-us = <6000>;
 		enable-active-high;
 		vin-supply = <&reg_lcd_vgl>;
@@ -147,7 +147,7 @@ reg_usb_host: regulator-usb-vbus {
 		pinctrl-0 = <&pinctrl_usbhost>;
 		regulator-min-microvolt = <50000000>;
 		regulator-max-microvolt = <50000000>;
-		gpio = <&gpio6 6 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio6 6 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -158,7 +158,7 @@ reg_wl18xx_vmmc:  regulator-wl18xx-vmcc {
 		pinctrl-0 = <&pinctrl_wlan>;
 		regulator-min-microvolt = <1800000>;
 		regulator-max-microvolt = <1800000>;
-		gpio = <&gpio6 21 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio6 21 GPIO_ACTIVE_HIGH>;
 		startup-delay-us = <70000>;
 		enable-active-high;
 	};
diff --git a/arch/arm/boot/dts/nxp/imx/imx6dl-prtmvt.dts b/arch/arm/boot/dts/nxp/imx/imx6dl-prtmvt.dts
index 773a84a5739d..be20bbbc440f 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6dl-prtmvt.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx6dl-prtmvt.dts
@@ -215,7 +215,7 @@ reg_h1_vbus: regulator-h1-vbus {
 		regulator-name = "h1-vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio1 0 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 0 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -224,7 +224,7 @@ reg_otg_vbus: regulator-otg-vbus {
 		regulator-name = "otg-vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio3 22 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 22 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/nxp/imx/imx6dl-prtvt7.dts b/arch/arm/boot/dts/nxp/imx/imx6dl-prtvt7.dts
index 568e98cb62aa..f5fed2e2914c 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6dl-prtvt7.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx6dl-prtvt7.dts
@@ -196,7 +196,7 @@ reg_bl_12v0: regulator-bl-12v0 {
 		regulator-name = "bl-12v0";
 		regulator-min-microvolt = <12000000>;
 		regulator-max-microvolt = <12000000>;
-		gpio = <&gpio1 7 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 7 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/nxp/imx/imx6dl-riotboard.dts b/arch/arm/boot/dts/nxp/imx/imx6dl-riotboard.dts
index 114739d10447..f293d75ec415 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6dl-riotboard.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx6dl-riotboard.dts
@@ -71,7 +71,7 @@ reg_usb_otg_vbus: regulator-usbotgvbus {
 		regulator-name = "usb_otg_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio3 22 GPIO_ACTIVE_LOW>;
+		gpios = <&gpio3 22 GPIO_ACTIVE_LOW>;
 	};
 };
 
diff --git a/arch/arm/boot/dts/nxp/imx/imx6dl-sielaff.dts b/arch/arm/boot/dts/nxp/imx/imx6dl-sielaff.dts
index 7de8d5f26518..fbb3d6a3bfe6 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6dl-sielaff.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx6dl-sielaff.dts
@@ -117,7 +117,7 @@ reg_backlight: regulator-backlight {
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_reg_backlight>;
 		enable-active-high;
-		gpio = <&gpio1 23 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 23 GPIO_ACTIVE_HIGH>;
 		regulator-name = "backlight";
 		regulator-min-microvolt = <12000000>;
 		regulator-max-microvolt = <12000000>;
@@ -128,7 +128,7 @@ reg_usb_otg_vbus: regulator-usb-otg-vbus {
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_reg_usbotg_vbus>;
 		enable-active-high;
-		gpio = <&gpio4 15 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio4 15 GPIO_ACTIVE_HIGH>;
 		regulator-name = "usb_otg_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
diff --git a/arch/arm/boot/dts/nxp/imx/imx6dl-yapp4-common.dtsi b/arch/arm/boot/dts/nxp/imx/imx6dl-yapp4-common.dtsi
index c32ea040fecd..680841adb12f 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6dl-yapp4-common.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6dl-yapp4-common.dtsi
@@ -72,7 +72,7 @@ reg_pcie: regulator-pcie {
 		regulator-name = "MPCIE_3V3";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio3 19 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 19 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		status = "disabled";
 	};
@@ -84,7 +84,7 @@ reg_usb_h1_vbus: regulator-usb-h1-vbus {
 		regulator-name = "usb_h1_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio1 29 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 29 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		status = "disabled";
 	};
@@ -96,7 +96,7 @@ reg_usb_otg_vbus: regulator-usb-otg-vbus {
 		regulator-name = "usb_otg_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio3 22 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 22 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 };
diff --git a/arch/arm/boot/dts/nxp/imx/imx6dl-yapp43-common.dtsi b/arch/arm/boot/dts/nxp/imx/imx6dl-yapp43-common.dtsi
index bcf4d9c870ec..8ebf1603cf69 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6dl-yapp43-common.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6dl-yapp43-common.dtsi
@@ -86,7 +86,7 @@ reg_usb_h1_vbus: regulator-usb-h1-vbus {
 		regulator-name = "usb_h1_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio1 29 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 29 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		status = "disabled";
 	};
@@ -98,7 +98,7 @@ reg_usb_otg_vbus: regulator-usb-otg-vbus {
 		regulator-name = "usb_otg_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio3 22 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 22 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 };
diff --git a/arch/arm/boot/dts/nxp/imx/imx6q-apalis-eval-v1.2.dts b/arch/arm/boot/dts/nxp/imx/imx6q-apalis-eval-v1.2.dts
index 15d4a98ee976..fbca21fea5dc 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6q-apalis-eval-v1.2.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx6q-apalis-eval-v1.2.dts
@@ -15,7 +15,7 @@ / {
 	reg_3v3_mmc: regulator-3v3-mmc {
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpio2 0 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio2 0 GPIO_ACTIVE_HIGH>;
 		off-on-delay-us = <100000>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_enable_3v3_mmc>;
@@ -28,7 +28,7 @@ reg_3v3_mmc: regulator-3v3-mmc {
 	reg_3v3_sd: regulator-3v3-sd {
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpio2 1 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio2 1 GPIO_ACTIVE_HIGH>;
 		off-on-delay-us = <100000>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_enable_3v3_sd>;
@@ -41,7 +41,7 @@ reg_3v3_sd: regulator-3v3-sd {
 	reg_can1: regulator-can1 {
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpio2 3 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio2 3 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_enable_can1_power>;
 		regulator-name = "5V_SW_CAN1";
@@ -51,7 +51,7 @@ reg_can1: regulator-can1 {
 	reg_can2: regulator-can2 {
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpio2 2 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio2 2 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_enable_can2_power>;
 		regulator-name = "5V_SW_CAN2";
diff --git a/arch/arm/boot/dts/nxp/imx/imx6q-apalis-eval.dts b/arch/arm/boot/dts/nxp/imx/imx6q-apalis-eval.dts
index e1077e2da5f4..a06de8d064e5 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6q-apalis-eval.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx6q-apalis-eval.dts
@@ -17,7 +17,7 @@ / {
 	reg_pcie_switch: regulator-pcie-switch {
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpio1 2 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 2 GPIO_ACTIVE_HIGH>;
 		regulator-max-microvolt = <1800000>;
 		regulator-min-microvolt = <1800000>;
 		regulator-name = "pcie_switch";
diff --git a/arch/arm/boot/dts/nxp/imx/imx6q-apalis-ixora-v1.2.dts b/arch/arm/boot/dts/nxp/imx/imx6q-apalis-ixora-v1.2.dts
index 3ac7a4501620..a664d787ea61 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6q-apalis-ixora-v1.2.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx6q-apalis-ixora-v1.2.dts
@@ -60,7 +60,7 @@ led5-red {
 	reg_3v3_vmmc: regulator-3v3-vmmc {
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpio2 0 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio2 0 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_enable_3v3_vmmc>;
 		regulator-max-microvolt = <3300000>;
@@ -72,7 +72,7 @@ reg_3v3_vmmc: regulator-3v3-vmmc {
 	reg_can1_supply: regulator-can1-supply {
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpio2 3 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio2 3 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_enable_can1_power>;
 		regulator-name = "can1_supply";
@@ -82,7 +82,7 @@ reg_can1_supply: regulator-can1-supply {
 	reg_can2_supply: regulator-can2-supply {
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpio3 15 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 15 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_enable_can2_power>;
 		regulator-name = "can2_supply";
diff --git a/arch/arm/boot/dts/nxp/imx/imx6q-arm2.dts b/arch/arm/boot/dts/nxp/imx/imx6q-arm2.dts
index 631d6d690959..6de1e1be735c 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6q-arm2.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx6q-arm2.dts
@@ -30,7 +30,7 @@ reg_usb_otg_vbus: regulator-usb-otg-vbus {
 		regulator-name = "usb_otg_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio3 22 0>;
+		gpios = <&gpio3 22 0>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/nxp/imx/imx6q-ba16.dtsi b/arch/arm/boot/dts/nxp/imx/imx6q-ba16.dtsi
index 09d9ca0cb332..1351c5de3893 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6q-ba16.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6q-ba16.dtsi
@@ -108,7 +108,7 @@ reg_lvds: regulator-lvds {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 		regulator-boot-on;
-		gpio = <&gpio3 22 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 22 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -125,7 +125,7 @@ reg_usb_otg_vbus: regulator-usbotgvbus {
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
 		pinctrl-0 = <&pinctrl_usbotg_vbus>;
-		gpio = <&gpio4 15 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio4 15 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 };
diff --git a/arch/arm/boot/dts/nxp/imx/imx6q-bosch-acc.dts b/arch/arm/boot/dts/nxp/imx/imx6q-bosch-acc.dts
index d3f14b4d3b51..5a335319fe39 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6q-bosch-acc.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx6q-bosch-acc.dts
@@ -196,7 +196,7 @@ reg_lcd: regulator-lcd {
 		regulator-max-microvolt = <5000000>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_lcd_enable>;
-		gpio = <&gpio3 23 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 23 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		regulator-boot-on;
 	};
diff --git a/arch/arm/boot/dts/nxp/imx/imx6q-bx50v3.dtsi b/arch/arm/boot/dts/nxp/imx/imx6q-bx50v3.dtsi
index c1ae7c47b442..8d9c59934f32 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6q-bx50v3.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6q-bx50v3.dtsi
@@ -60,7 +60,7 @@ reg_wl18xx_vmmc: regulator-wl18xx {
 		regulator-name = "vwl1807";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&pca9539 3 GPIO_ACTIVE_HIGH>;
+		gpios = <&pca9539 3 GPIO_ACTIVE_HIGH>;
 		startup-delay-us = <70000>;
 		enable-active-high;
 	};
@@ -72,7 +72,7 @@ reg_wlan: regulator-wlan {
 		regulator-max-microvolt = <3300000>;
 		regulator-always-on;
 		regulator-boot-on;
-		gpio = <&gpio6 14 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio6 14 GPIO_ACTIVE_HIGH>;
 	};
 
 	sound {
diff --git a/arch/arm/boot/dts/nxp/imx/imx6q-cm-fx6.dts b/arch/arm/boot/dts/nxp/imx/imx6q-cm-fx6.dts
index 299106fbe51c..b4854a0f01ce 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6q-cm-fx6.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx6q-cm-fx6.dts
@@ -78,7 +78,7 @@ reg_pcie_power_on_gpio: regulator-pcie-power-on-gpio {
 		regulator-name = "regulator-pcie-power-on-gpio";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio2 24 GPIO_ACTIVE_LOW>;
+		gpios = <&gpio2 24 GPIO_ACTIVE_LOW>;
 	};
 
 	reg_usb_h1_vbus: usb_h1_vbus {
@@ -86,7 +86,7 @@ reg_usb_h1_vbus: usb_h1_vbus {
 		regulator-name = "usb_h1_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio7 8 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio7 8 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -95,7 +95,7 @@ reg_usb_otg_vbus: usb_otg_vbus {
 		regulator-name = "usb_otg_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio3 22 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 22 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/nxp/imx/imx6q-display5.dtsi b/arch/arm/boot/dts/nxp/imx/imx6q-display5.dtsi
index 4ab31f2217cd..ca0dca6344ac 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6q-display5.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6q-display5.dtsi
@@ -96,13 +96,13 @@ reg_lvds: regulator-lvds {
 		regulator-always-on;
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_reg_lvds>;
-		gpio = <&gpio5 13 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio5 13 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
 	reg_usbh1_vbus: usb-h1-vbus {
 		compatible = "regulator-fixed";
-		gpio = <&gpio3 31 GPIO_ACTIVE_LOW>;
+		gpios = <&gpio3 31 GPIO_ACTIVE_LOW>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_usbh1_vbus>;
 		regulator-name = "usb_h1_vbus";
diff --git a/arch/arm/boot/dts/nxp/imx/imx6q-dmo-edmqmx6.dts b/arch/arm/boot/dts/nxp/imx/imx6q-dmo-edmqmx6.dts
index 9f7ac7158c46..14cc35d185b6 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6q-dmo-edmqmx6.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx6q-dmo-edmqmx6.dts
@@ -41,7 +41,7 @@ reg_usb_otg_switch: regulator-usb-otg-switch {
 		regulator-name = "usb_otg_switch";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio7 12 0>;
+		gpios = <&gpio7 12 0>;
 		regulator-boot-on;
 		regulator-always-on;
 	};
@@ -51,7 +51,7 @@ reg_usb_host1: regulator-usb-host1 {
 		regulator-name = "usb_host1_en";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio3 31 0>;
+		gpios = <&gpio3 31 0>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/nxp/imx/imx6q-dms-ba16.dts b/arch/arm/boot/dts/nxp/imx/imx6q-dms-ba16.dts
index d2d0a82ea178..08810a21efab 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6q-dms-ba16.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx6q-dms-ba16.dts
@@ -16,7 +16,7 @@ reg_usb_otg_vbus: regulator-usbotgvbus {
 		regulator-max-microvolt = <5000000>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_usbotgvbus>;
-		gpio = <&gpio4 15 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio4 15 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/nxp/imx/imx6q-evi.dts b/arch/arm/boot/dts/nxp/imx/imx6q-evi.dts
index 78d941fef5df..d91d2b0598c8 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6q-evi.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx6q-evi.dts
@@ -64,7 +64,7 @@ reg_usbh1_vbus: regulator-usbhubreset {
 		startup-delay-us = <2>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_usbh1_hubreset>;
-		gpio = <&gpio7 12 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio7 12 GPIO_ACTIVE_HIGH>;
 	};
 
 	reg_usb_otg_vbus: regulator-usbotgvbus {
@@ -74,7 +74,7 @@ reg_usb_otg_vbus: regulator-usbotgvbus {
 		regulator-max-microvolt = <5000000>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_usbotgvbus>;
-		gpio = <&gpio4 15 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio4 15 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		regulator-always-on;
 	};
diff --git a/arch/arm/boot/dts/nxp/imx/imx6q-gw5400-a.dts b/arch/arm/boot/dts/nxp/imx/imx6q-gw5400-a.dts
index c5c144879fa6..a4b666c08418 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6q-gw5400-a.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx6q-gw5400-a.dts
@@ -96,7 +96,7 @@ reg_usb_otg_vbus: regulator-usb-otg-vbus {
 		regulator-name = "usb_otg_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio3 22 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 22 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/nxp/imx/imx6q-h100.dts b/arch/arm/boot/dts/nxp/imx/imx6q-h100.dts
index a603562ea49a..ce952d32daed 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6q-h100.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx6q-h100.dts
@@ -107,7 +107,7 @@ reg_hdmi: regulator-hdmi {
 		pinctrl-0 = <&pinctrl_h100_reg_hdmi>;
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpio2 20 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio2 20 GPIO_ACTIVE_HIGH>;
 		regulator-name = "V_HDMI";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
@@ -117,7 +117,7 @@ reg_hdmi: regulator-hdmi {
 	reg_usbh1_vbus: regulator-usb-h1-vbus {
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpio1 0 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 0 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_h100_usbh1_vbus>;
 		regulator-name = "USB_H1_VBUS";
@@ -128,7 +128,7 @@ reg_usbh1_vbus: regulator-usb-h1-vbus {
 	reg_usbotg_vbus: regulator-usb-otg-vbus {
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpio3 22 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 22 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_h100_usbotg_vbus>;
 		regulator-name = "USB_OTG_VBUS";
diff --git a/arch/arm/boot/dts/nxp/imx/imx6q-kp.dtsi b/arch/arm/boot/dts/nxp/imx/imx6q-kp.dtsi
index c425d427663d..586498a59c8f 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6q-kp.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6q-kp.dtsi
@@ -92,7 +92,7 @@ reg_3p3v: regulator-3p3v {
 	reg_audio: regulator-audio {
 		compatible = "regulator-fixed";
 		regulator-name = "sgtl5000-supply";
-		gpio = <&gpio6 31 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio6 31 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		regulator-always-on;
 	};
diff --git a/arch/arm/boot/dts/nxp/imx/imx6q-logicpd.dts b/arch/arm/boot/dts/nxp/imx/imx6q-logicpd.dts
index 46a4ddedb423..2096cca5a24d 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6q-logicpd.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx6q-logicpd.dts
@@ -38,7 +38,7 @@ reg_lcd: regulator-lcd {
 		regulator-name = "lcd_panel_pwr";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio4 17 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio4 17 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&reg_3v3>;
 		startup-delay-us = <500000>;
@@ -51,7 +51,7 @@ reg_lcd_reset: regulator-lcd-reset {
 		regulator-name = "nLCD_RESET";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio5 2 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio5 2 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&reg_lcd>;
 	};
diff --git a/arch/arm/boot/dts/nxp/imx/imx6q-marsboard.dts b/arch/arm/boot/dts/nxp/imx/imx6q-marsboard.dts
index 2c9961333b0a..b4e3fed18095 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6q-marsboard.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx6q-marsboard.dts
@@ -64,7 +64,7 @@ reg_usb_otg_vbus: regulator-usb-otg-vbus {
 		regulator-name = "usb_otg_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio3 22 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 22 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/nxp/imx/imx6q-mccmon6.dts b/arch/arm/boot/dts/nxp/imx/imx6q-mccmon6.dts
index f08b37010291..caaf1f93fd71 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6q-mccmon6.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx6q-mccmon6.dts
@@ -63,7 +63,7 @@ reg_lvds: regulator-lvds {
 		regulator-boot-on;
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_reg_lvds>;
-		gpio = <&gpio1 19 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 19 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/nxp/imx/imx6q-novena.dts b/arch/arm/boot/dts/nxp/imx/imx6q-novena.dts
index d392b5bd2eea..d362e95cf5d8 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6q-novena.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx6q-novena.dts
@@ -134,7 +134,7 @@ reg_audio_codec: regulator-audio-codec {
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
 		startup-delay-us = <400000>;
-		gpio = <&gpio5 17 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio5 17 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -144,7 +144,7 @@ reg_display: regulator-display {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 		startup-delay-us = <200000>;
-		gpio = <&gpio5 28 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio5 28 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -153,7 +153,7 @@ reg_lvds_lcd: regulator-lvds-lcd {
 		regulator-name = "lcd-lvds-power";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio4 15 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio4 15 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -162,7 +162,7 @@ reg_pcie: regulator-pcie {
 		regulator-name = "pcie-bus-power";
 		regulator-min-microvolt = <1500000>;
 		regulator-max-microvolt = <1500000>;
-		gpio = <&gpio7 12 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio7 12 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -173,7 +173,7 @@ reg_sata: regulator-sata {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 		startup-delay-us = <10000>;
-		gpio = <&gpio3 30 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 30 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/nxp/imx/imx6q-pistachio.dts b/arch/arm/boot/dts/nxp/imx/imx6q-pistachio.dts
index 56b77cc0af2b..20226b9b7790 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6q-pistachio.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx6q-pistachio.dts
@@ -80,7 +80,7 @@ wlan_en_reg: regulator-wlan_en {
 		regulator-name = "wlan-en-regulator";
 		regulator-min-microvolt = <1800000>;
 		regulator-max-microvolt = <1800000>;
-		gpio = <&gpio2 24 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio2 24 GPIO_ACTIVE_HIGH>;
 		startup-delay-us = <70000>;
 		enable-active-high;
 	};
@@ -90,7 +90,7 @@ reg_usb_otg_vbus: regulator-usb_vbus {
 		regulator-name = "usb_otg_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio3 22 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 22 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&swbst_reg>;
 	};
diff --git a/arch/arm/boot/dts/nxp/imx/imx6q-prti6q.dts b/arch/arm/boot/dts/nxp/imx/imx6q-prti6q.dts
index 8d2b608e0b90..7c3c66c31032 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6q-prti6q.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx6q-prti6q.dts
@@ -77,7 +77,7 @@ reg_wifi: regulator-wifi {
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_wifi_npd>;
 		enable-active-high;
-		gpio = <&gpio1 26 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 26 GPIO_ACTIVE_HIGH>;
 		regulator-max-microvolt = <1800000>;
 		regulator-min-microvolt = <1800000>;
 		regulator-name = "regulator-WL12xx";
diff --git a/arch/arm/boot/dts/nxp/imx/imx6q-var-dt6customboard.dts b/arch/arm/boot/dts/nxp/imx/imx6q-var-dt6customboard.dts
index 0225a621ec7a..eb1eb01ac479 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6q-var-dt6customboard.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx6q-var-dt6customboard.dts
@@ -102,7 +102,7 @@ reg_usb_h1_vbus: regulator-usbh1vbus {
 		regulator-name = "usb_h1_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio1 28 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 28 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -111,7 +111,7 @@ reg_usb_otg_vbus: regulator-usbotgvbus {
 		regulator-name = "usb_otg_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio4 15 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio4 15 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/nxp/imx/imx6qdl-apalis.dtsi b/arch/arm/boot/dts/nxp/imx/imx6qdl-apalis.dtsi
index edf55760a5c1..cf464b142ff0 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6qdl-apalis.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6qdl-apalis.dtsi
@@ -147,7 +147,7 @@ reg_ov5640_2v8_a_vdd: regulator-ov5640-2v8-a-vdd {
 	reg_usb_otg_vbus: regulator-usb-otg-vbus {
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpio3 22 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 22 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_regulator_usbotg_pwr>;
 		regulator-max-microvolt = <5000000>;
@@ -160,7 +160,7 @@ reg_usb_otg_vbus: regulator-usb-otg-vbus {
 	reg_usb_host_vbus_hub: regulator-usb-host-vbus-hub {
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpio3 28 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 28 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_regulator_usbhub_pwr>;
 		regulator-max-microvolt = <5000000>;
@@ -173,7 +173,7 @@ reg_usb_host_vbus_hub: regulator-usb-host-vbus-hub {
 	reg_usb_host_vbus: regulator-usb-host-vbus {
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpio1 0 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 0 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_regulator_usbh_pwr>;
 		regulator-max-microvolt = <5000000>;
diff --git a/arch/arm/boot/dts/nxp/imx/imx6qdl-aristainetos.dtsi b/arch/arm/boot/dts/nxp/imx/imx6qdl-aristainetos.dtsi
index baa197c90060..ae595b398436 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6qdl-aristainetos.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6qdl-aristainetos.dtsi
@@ -28,7 +28,7 @@ reg_3p3v: regulator-3p3v {
 	reg_usbh1_vbus: regulator-usbh1-vbus {
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpio3 31 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 31 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_aristainetos_usbh1_vbus>;
 		regulator-name = "usb_h1_vbus";
@@ -39,7 +39,7 @@ reg_usbh1_vbus: regulator-usbh1-vbus {
 	reg_usbotg_vbus: regulator-usbotg-vbus {
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpio4 15 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio4 15 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_aristainetos_usbotg_vbus>;
 		regulator-name = "usb_otg_vbus";
diff --git a/arch/arm/boot/dts/nxp/imx/imx6qdl-aristainetos2.dtsi b/arch/arm/boot/dts/nxp/imx/imx6qdl-aristainetos2.dtsi
index f7fac86f0a6b..7eecfe67d16c 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6qdl-aristainetos2.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6qdl-aristainetos2.dtsi
@@ -71,7 +71,7 @@ reg_3p3v: regulator-3p3v {
 	reg_usbh1_vbus: regulator-usbh1-vbus {
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpio1 0 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 0 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_aristainetos2_usbh1_vbus>;
 		regulator-name = "usb_h1_vbus";
@@ -82,7 +82,7 @@ reg_usbh1_vbus: regulator-usbh1-vbus {
 	reg_usbotg_vbus: regulator-usbotg-vbus {
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpio4 15 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio4 15 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_aristainetos2_usbotg_vbus>;
 		regulator-name = "usb_otg_vbus";
diff --git a/arch/arm/boot/dts/nxp/imx/imx6qdl-colibri.dtsi b/arch/arm/boot/dts/nxp/imx/imx6qdl-colibri.dtsi
index b01670cdd52c..33457edab3e1 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6qdl-colibri.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6qdl-colibri.dtsi
@@ -119,7 +119,7 @@ reg_module_3v3_audio: regulator-module-3v3-audio {
 
 	reg_usb_host_vbus: regulator-usb-host-vbus {
 		compatible = "regulator-fixed";
-		gpio = <&gpio3 31 GPIO_ACTIVE_LOW>; /* SODIMM 129 / USBH_PEN */
+		gpios = <&gpio3 31 GPIO_ACTIVE_LOW>; /* SODIMM 129 / USBH_PEN */
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_regulator_usbh_pwr>;
 		regulator-max-microvolt = <5000000>;
diff --git a/arch/arm/boot/dts/nxp/imx/imx6qdl-cubox-i.dtsi b/arch/arm/boot/dts/nxp/imx/imx6qdl-cubox-i.dtsi
index bd66430c1d78..3407456f250a 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6qdl-cubox-i.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6qdl-cubox-i.dtsi
@@ -79,7 +79,7 @@ v_5v0: regulator-v-5v0 {
 	v_usb2: regulator-v-usb2 {
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpio1 0 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 0 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_cubox_i_usbh1_vbus>;
 		regulator-max-microvolt = <5000000>;
@@ -91,7 +91,7 @@ v_usb2: regulator-v-usb2 {
 	v_usb1: regulator-v-usb1 {
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpio3 22 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 22 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_cubox_i_usbotg_vbus>;
 		regulator-max-microvolt = <5000000>;
diff --git a/arch/arm/boot/dts/nxp/imx/imx6qdl-dfi-fs700-m60.dtsi b/arch/arm/boot/dts/nxp/imx/imx6qdl-dfi-fs700-m60.dtsi
index 0a6c3a092b34..73bf8cbab4a9 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6qdl-dfi-fs700-m60.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6qdl-dfi-fs700-m60.dtsi
@@ -12,7 +12,7 @@ reg_usb_otg_vbus: regulator-usb-otg-vbus {
 		regulator-name = "usb_otg_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio3 22 0>;
+		gpios = <&gpio3 22 0>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/nxp/imx/imx6qdl-dhcom-som.dtsi b/arch/arm/boot/dts/nxp/imx/imx6qdl-dhcom-som.dtsi
index eaa87b333164..3842df202adb 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6qdl-dhcom-som.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6qdl-dhcom-som.dtsi
@@ -42,7 +42,7 @@ reg_3p3v: regulator-3P3V {
 
 	reg_eth_vio: regulator-eth-vio {
 		compatible = "regulator-fixed";
-		gpio = <&gpio1 7 0>;
+		gpios = <&gpio1 7 0>;
 		pinctrl-0 = <&pinctrl_enet_vio>;
 		pinctrl-names = "default";
 		regulator-always-on;
@@ -56,7 +56,7 @@ reg_eth_vio: regulator-eth-vio {
 	/* OE pin of the latch is low active */
 	reg_latch_oe_on: regulator-latch-oe-on {
 		compatible = "regulator-fixed";
-		gpio = <&gpio3 22 0>;
+		gpios = <&gpio3 22 0>;
 		regulator-always-on;
 		regulator-name = "latch_oe_on";
 	};
@@ -64,7 +64,7 @@ reg_latch_oe_on: regulator-latch-oe-on {
 	reg_usb_h1_vbus: regulator-usb-h1-vbus {
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpio3 31 0>;
+		gpios = <&gpio3 31 0>;
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
 		regulator-name = "usb_h1_vbus";
diff --git a/arch/arm/boot/dts/nxp/imx/imx6qdl-emcon-avari.dtsi b/arch/arm/boot/dts/nxp/imx/imx6qdl-emcon-avari.dtsi
index 5587069b6052..1828b874b72d 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6qdl-emcon-avari.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6qdl-emcon-avari.dtsi
@@ -47,7 +47,7 @@ reg_usb_otg: reg-otgvbus {
 		regulator-name = "OTG_VBUS";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio1 8 GPIO_ACTIVE_LOW>;
+		gpios = <&gpio1 8 GPIO_ACTIVE_LOW>;
 		regulator-always-on;
 	};
 
diff --git a/arch/arm/boot/dts/nxp/imx/imx6qdl-emcon.dtsi b/arch/arm/boot/dts/nxp/imx/imx6qdl-emcon.dtsi
index a308a3584b62..d4d82245865b 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6qdl-emcon.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6qdl-emcon.dtsi
@@ -127,7 +127,7 @@ reg_parallel_disp: reg-parallel-display {
 		regulator-name = "LCD-Supply";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio7 9 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio7 9 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -136,7 +136,7 @@ reg_lvds_disp: reg-lvds-display {
 		regulator-name = "LVDS-Supply";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio7 10 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio7 10 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/nxp/imx/imx6qdl-gw51xx.dtsi b/arch/arm/boot/dts/nxp/imx/imx6qdl-gw51xx.dtsi
index e75e1a5364b8..d091df6c327b 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6qdl-gw51xx.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6qdl-gw51xx.dtsi
@@ -119,7 +119,7 @@ reg_usb_otg_vbus: regulator-usb-otg-vbus {
 		regulator-name = "usb_otg_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio3 22 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 22 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 };
diff --git a/arch/arm/boot/dts/nxp/imx/imx6qdl-gw52xx.dtsi b/arch/arm/boot/dts/nxp/imx/imx6qdl-gw52xx.dtsi
index b57f4073f881..d29b70eba428 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6qdl-gw52xx.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6qdl-gw52xx.dtsi
@@ -142,7 +142,7 @@ reg_can1_stby: regulator-can1-stby {
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_reg_can1>;
 		regulator-name = "can1_stby";
-		gpio = <&gpio1 9 GPIO_ACTIVE_LOW>;
+		gpios = <&gpio1 9 GPIO_ACTIVE_LOW>;
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 	};
@@ -152,7 +152,7 @@ reg_usb_otg_vbus: regulator-usb-otg-vbus {
 		regulator-name = "usb_otg_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio3 22 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 22 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/nxp/imx/imx6qdl-gw53xx.dtsi b/arch/arm/boot/dts/nxp/imx/imx6qdl-gw53xx.dtsi
index 090c0057d117..07c7deed3b78 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6qdl-gw53xx.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6qdl-gw53xx.dtsi
@@ -134,7 +134,7 @@ reg_can1_stby: regulator-can1-stby {
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_reg_can1>;
 		regulator-name = "can1_stby";
-		gpio = <&gpio1 2 GPIO_ACTIVE_LOW>;
+		gpios = <&gpio1 2 GPIO_ACTIVE_LOW>;
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 	};
@@ -152,7 +152,7 @@ reg_usb_otg_vbus: regulator-usb-otg-vbus {
 		regulator-name = "usb_otg_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio3 22 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 22 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/nxp/imx/imx6qdl-gw54xx.dtsi b/arch/arm/boot/dts/nxp/imx/imx6qdl-gw54xx.dtsi
index 0ed6d25024a2..be8ca8967bbb 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6qdl-gw54xx.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6qdl-gw54xx.dtsi
@@ -135,7 +135,7 @@ reg_can1_stby: regulator-can1-stby {
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_reg_can1>;
 		regulator-name = "can1_stby";
-		gpio = <&gpio1 2 GPIO_ACTIVE_LOW>;
+		gpios = <&gpio1 2 GPIO_ACTIVE_LOW>;
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 	};
@@ -153,7 +153,7 @@ reg_usb_otg_vbus: regulator-usb-otg-vbus {
 		regulator-name = "usb_otg_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio3 22 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 22 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/nxp/imx/imx6qdl-gw553x.dtsi b/arch/arm/boot/dts/nxp/imx/imx6qdl-gw553x.dtsi
index c6e231de674a..b41ad4939d1a 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6qdl-gw553x.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6qdl-gw553x.dtsi
@@ -153,7 +153,7 @@ reg_usb_otg_vbus: regulator-usb-otg-vbus {
 		regulator-name = "usb_otg_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio3 22 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 22 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 };
diff --git a/arch/arm/boot/dts/nxp/imx/imx6qdl-gw560x.dtsi b/arch/arm/boot/dts/nxp/imx/imx6qdl-gw560x.dtsi
index d0f648938cae..5b1c6d31bd30 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6qdl-gw560x.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6qdl-gw560x.dtsi
@@ -200,7 +200,7 @@ reg_12p0v: regulator-12p0v {
 		regulator-name = "12P0V";
 		regulator-min-microvolt = <12000000>;
 		regulator-max-microvolt = <12000000>;
-		gpio = <&gpio4 25 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio4 25 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -225,7 +225,7 @@ reg_usb_otg_vbus: regulator-usb-otg-vbus {
 		regulator-name = "usb_otg_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio3 22 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 22 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/nxp/imx/imx6qdl-gw5903.dtsi b/arch/arm/boot/dts/nxp/imx/imx6qdl-gw5903.dtsi
index 71911df881cc..388cd2cea9c6 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6qdl-gw5903.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6qdl-gw5903.dtsi
@@ -164,7 +164,7 @@ reg_usb_h1_vbus: regulator-usb-h1-vbus {
 		regulator-name = "usb_h1_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio3 30 0>;
+		gpios = <&gpio3 30 0>;
 		enable-active-high;
 	};
 
@@ -173,7 +173,7 @@ reg_usb_otg_vbus: regulator-usb-otg-vbus {
 		regulator-name = "usb_otg_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio4 15 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio4 15 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -182,7 +182,7 @@ reg_12p0: regulator-12p0v {
 		regulator-name = "12P0V";
 		regulator-min-microvolt = <12000000>;
 		regulator-max-microvolt = <12000000>;
-		gpio = <&gpio1 7 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 7 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/nxp/imx/imx6qdl-gw5904.dtsi b/arch/arm/boot/dts/nxp/imx/imx6qdl-gw5904.dtsi
index 716c324a7458..aa283317d671 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6qdl-gw5904.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6qdl-gw5904.dtsi
@@ -186,7 +186,7 @@ reg_usb_otg_vbus: regulator-usb-otg-vbus {
 		regulator-name = "usb_otg_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio3 22 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 22 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 };
diff --git a/arch/arm/boot/dts/nxp/imx/imx6qdl-gw5907.dtsi b/arch/arm/boot/dts/nxp/imx/imx6qdl-gw5907.dtsi
index 955a51226eda..c96950e1e0d7 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6qdl-gw5907.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6qdl-gw5907.dtsi
@@ -119,7 +119,7 @@ reg_usb_otg_vbus: regulator-usb-otg-vbus {
 		regulator-name = "usb_otg_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio3 22 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 22 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 };
diff --git a/arch/arm/boot/dts/nxp/imx/imx6qdl-gw5910.dtsi b/arch/arm/boot/dts/nxp/imx/imx6qdl-gw5910.dtsi
index 453dee4d9227..9746e5df3d21 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6qdl-gw5910.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6qdl-gw5910.dtsi
@@ -123,7 +123,7 @@ reg_wl: regulator-wl {
 		pinctrl-0 = <&pinctrl_reg_wl>;
 		compatible = "regulator-fixed";
 		regulator-name = "wl";
-		gpio = <&gpio1 5 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 5 GPIO_ACTIVE_HIGH>;
 		startup-delay-us = <100>;
 		enable-active-high;
 		regulator-min-microvolt = <3300000>;
diff --git a/arch/arm/boot/dts/nxp/imx/imx6qdl-hummingboard.dtsi b/arch/arm/boot/dts/nxp/imx/imx6qdl-hummingboard.dtsi
index d1ad65ab6b72..1dc42f2e5da9 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6qdl-hummingboard.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6qdl-hummingboard.dtsi
@@ -82,7 +82,7 @@ v_5v0: regulator-v-5v0 {
 
 	v_sd: regulator-v-sd {
 		compatible = "regulator-fixed";
-		gpio = <&gpio4 30 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio4 30 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_hummingboard_vmmc>;
 		regulator-boot-on;
@@ -96,7 +96,7 @@ v_sd: regulator-v-sd {
 	v_usb2: regulator-v-usb2 {
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpio1 0 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 0 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_hummingboard_usbh1_vbus>;
 		regulator-max-microvolt = <5000000>;
@@ -108,7 +108,7 @@ v_usb2: regulator-v-usb2 {
 	v_usb1: regulator-v-usb1 {
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpio3 22 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 22 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_hummingboard_usbotg_vbus>;
 		regulator-max-microvolt = <5000000>;
diff --git a/arch/arm/boot/dts/nxp/imx/imx6qdl-hummingboard2.dtsi b/arch/arm/boot/dts/nxp/imx/imx6qdl-hummingboard2.dtsi
index e6017f9bf640..3f6732ccbd2c 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6qdl-hummingboard2.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6qdl-hummingboard2.dtsi
@@ -91,7 +91,7 @@ vcc_1p8: regulator-vcc-1p8 {
 
 	v_sd: regulator-v-sd {
 		compatible = "regulator-fixed";
-		gpio = <&gpio4 30 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio4 30 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_hummingboard2_vmmc>;
 		regulator-boot-on;
@@ -105,7 +105,7 @@ v_sd: regulator-v-sd {
 	v_usb1: regulator-v-usb1 {
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpio3 22 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 22 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_hummingboard2_usbotg_vbus>;
 		regulator-always-on;
@@ -119,7 +119,7 @@ v_usb2: regulator-v-usb2 {
 		/* USB hub port 1 */
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpio1 0 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 0 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_hummingboard2_usbh1_vbus>;
 		regulator-always-on;
@@ -133,7 +133,7 @@ v_usb3: regulator-v-usb3 {
 		/* USB hub port 3 */
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpio2 13 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio2 13 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_hummingboard2_usbh2_vbus>;
 		regulator-always-on;
@@ -147,7 +147,7 @@ v_usb4: regulator-v-usb4 {
 		/* USB hub port 4 */
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpio7 10 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio7 10 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_hummingboard2_usbh3_vbus>;
 		regulator-always-on;
diff --git a/arch/arm/boot/dts/nxp/imx/imx6qdl-icore-rqs.dtsi b/arch/arm/boot/dts/nxp/imx/imx6qdl-icore-rqs.dtsi
index dff184a119f3..d707e8442c9c 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6qdl-icore-rqs.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6qdl-icore-rqs.dtsi
@@ -46,7 +46,7 @@ reg_sd3_vmmc: regulator-sd3-vmmc {
 		regulator-name = "P3V3_SD3_SWITCHED";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio1 4 GPIO_ACTIVE_LOW>;
+		gpios = <&gpio1 4 GPIO_ACTIVE_LOW>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/nxp/imx/imx6qdl-kontron-samx6i.dtsi b/arch/arm/boot/dts/nxp/imx/imx6qdl-kontron-samx6i.dtsi
index 99b5e78458aa..457736aa2898 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6qdl-kontron-samx6i.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6qdl-kontron-samx6i.dtsi
@@ -68,7 +68,7 @@ reg_sdio: regulator-sdio {
 		regulator-name = "V_3V3_SD";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio1 29 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 29 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		off-on-delay-us = <20000>;
 	};
@@ -80,7 +80,7 @@ reg_smarc_lcdbklt: regulator-smarc-lcdbklt {
 		regulator-name = "LCD_BKLT_EN";
 		regulator-min-microvolt = <1800000>;
 		regulator-max-microvolt = <1800000>;
-		gpio = <&gpio1 16 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 16 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -91,7 +91,7 @@ reg_smarc_lcdvdd: regulator-smarc-lcdvdd {
 		regulator-name = "LCD_VDD_EN";
 		regulator-min-microvolt = <1800000>;
 		regulator-max-microvolt = <1800000>;
-		gpio = <&gpio1 17 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 17 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/nxp/imx/imx6qdl-mba6.dtsi b/arch/arm/boot/dts/nxp/imx/imx6qdl-mba6.dtsi
index 60aa1e947f62..be82c723fc5d 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6qdl-mba6.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6qdl-mba6.dtsi
@@ -92,7 +92,7 @@ reg_pcie: regulator-pcie {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 		/* PCIE.PWR_EN */
-		gpio = <&gpio2 0 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio2 0 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		regulator-always-on;
 		vin-supply = <&reg_mba6_3p3v>;
diff --git a/arch/arm/boot/dts/nxp/imx/imx6qdl-nit6xlite.dtsi b/arch/arm/boot/dts/nxp/imx/imx6qdl-nit6xlite.dtsi
index a30cf0d06206..9753ddbe8dba 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6qdl-nit6xlite.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6qdl-nit6xlite.dtsi
@@ -36,7 +36,7 @@ reg_usb_otg_vbus: regulator-usb-otg-vbus {
 		regulator-name = "usb_otg_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio3 22 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 22 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -47,7 +47,7 @@ reg_wlan_vmmc: regulator-wlan-vmmc {
 		regulator-name = "reg_wlan_vmmc";
 		regulator-min-microvolt = <1800000>;
 		regulator-max-microvolt = <1800000>;
-		gpio = <&gpio6 7 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio6 7 GPIO_ACTIVE_HIGH>;
 		startup-delay-us = <70000>;
 		enable-active-high;
 	};
diff --git a/arch/arm/boot/dts/nxp/imx/imx6qdl-nitrogen6_max.dtsi b/arch/arm/boot/dts/nxp/imx/imx6qdl-nitrogen6_max.dtsi
index 33174febf410..063f2a9dec17 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6qdl-nitrogen6_max.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6qdl-nitrogen6_max.dtsi
@@ -44,7 +44,7 @@ reg_usb_otg_vbus: regulator-usb-otg {
 		regulator-name = "usb_otg_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio3 22 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 22 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -55,7 +55,7 @@ reg_usb_h1_vbus: regulator-usb-h1-vbus {
 		regulator-name = "usb_h1_vbus";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio7 12 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio7 12 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -66,7 +66,7 @@ reg_wlan_vmmc: regulator-wlan-vmmc {
 		regulator-name = "reg_wlan_vmmc";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio6 15 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio6 15 GPIO_ACTIVE_HIGH>;
 		startup-delay-us = <70000>;
 		enable-active-high;
 	};
@@ -78,7 +78,7 @@ reg_can_xcvr: regulator-can-xcvr {
 		regulator-max-microvolt = <3300000>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_can_xcvr>;
-		gpio = <&gpio1 2 GPIO_ACTIVE_LOW>;
+		gpios = <&gpio1 2 GPIO_ACTIVE_LOW>;
 	};
 
 	gpio-keys {
diff --git a/arch/arm/boot/dts/nxp/imx/imx6qdl-nitrogen6_som2.dtsi b/arch/arm/boot/dts/nxp/imx/imx6qdl-nitrogen6_som2.dtsi
index 8e64314fa8b2..c69fa85135ff 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6qdl-nitrogen6_som2.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6qdl-nitrogen6_som2.dtsi
@@ -175,7 +175,7 @@ reg_can_xcvr: regulator-can-xcvr {
 		regulator-max-microvolt = <3300000>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_can_xcvr>;
-		gpio = <&gpio1 2 GPIO_ACTIVE_LOW>;
+		gpios = <&gpio1 2 GPIO_ACTIVE_LOW>;
 	};
 
 	reg_usb_h1_vbus: regulator-usb-h1-vbus {
@@ -185,7 +185,7 @@ reg_usb_h1_vbus: regulator-usb-h1-vbus {
 		regulator-name = "usb_h1_vbus";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio7 12 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio7 12 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		regulator-always-on;
 	};
@@ -195,7 +195,7 @@ reg_usb_otg_vbus: regulator-usb-otg-vbus {
 		regulator-name = "usb_otg_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio3 22 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 22 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -206,7 +206,7 @@ reg_wlan_vmmc: regulator-wlan-vmmc {
 		regulator-name = "reg_wlan_vmmc";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio6 15 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio6 15 GPIO_ACTIVE_HIGH>;
 		startup-delay-us = <70000>;
 		enable-active-high;
 	};
diff --git a/arch/arm/boot/dts/nxp/imx/imx6qdl-nitrogen6x.dtsi b/arch/arm/boot/dts/nxp/imx/imx6qdl-nitrogen6x.dtsi
index 121177273dd0..e73b4ab4fbd1 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6qdl-nitrogen6x.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6qdl-nitrogen6x.dtsi
@@ -38,7 +38,7 @@ reg_usb_otg_vbus: regulator-usb-otg-vbus {
 		regulator-name = "usb_otg_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio3 22 0>;
+		gpios = <&gpio3 22 0>;
 		enable-active-high;
 	};
 
@@ -49,7 +49,7 @@ reg_can_xcvr: regulator-can-xcvr {
 		regulator-max-microvolt = <3300000>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_can_xcvr>;
-		gpio = <&gpio1 2 GPIO_ACTIVE_LOW>;
+		gpios = <&gpio1 2 GPIO_ACTIVE_LOW>;
 	};
 
 	reg_wlan_vmmc: regulator-wlan-vmmc {
@@ -59,7 +59,7 @@ reg_wlan_vmmc: regulator-wlan-vmmc {
 		regulator-name = "reg_wlan_vmmc";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio6 15 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio6 15 GPIO_ACTIVE_HIGH>;
 		startup-delay-us = <70000>;
 		enable-active-high;
 	};
@@ -71,7 +71,7 @@ reg_usb_h1_vbus: regulator-usb-h1-vbus {
 		regulator-name = "usb_h1_vbus";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio7 12 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio7 12 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/nxp/imx/imx6qdl-phytec-mira-peb-wlbt-05.dtsi b/arch/arm/boot/dts/nxp/imx/imx6qdl-phytec-mira-peb-wlbt-05.dtsi
index 84f884d6e55b..46243ff88953 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6qdl-phytec-mira-peb-wlbt-05.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6qdl-phytec-mira-peb-wlbt-05.dtsi
@@ -15,7 +15,7 @@ reg_wl_en: regulator-wl-en {
 		regulator-max-microvolt = <3300000>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_wl>;
-		gpio = <&gpio5 2 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio5 2 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		startup-delay-us = <100>;
 		status = "disabled";
diff --git a/arch/arm/boot/dts/nxp/imx/imx6qdl-phytec-mira.dtsi b/arch/arm/boot/dts/nxp/imx/imx6qdl-phytec-mira.dtsi
index 0b4c09b09c03..b817740c97dc 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6qdl-phytec-mira.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6qdl-phytec-mira.dtsi
@@ -58,7 +58,7 @@ reg_en_switch: regulator-en-switch {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 		enable-active-high;
-		gpio = <&gpio3 4 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 4 GPIO_ACTIVE_HIGH>;
 		regulator-always-on;
 	};
 
@@ -69,7 +69,7 @@ reg_flexcan1: regulator-flexcan1 {
 		regulator-name = "flexcan1-reg";
 		regulator-min-microvolt = <1500000>;
 		regulator-max-microvolt = <1500000>;
-		gpio = <&gpio2 20 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio2 20 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -88,7 +88,7 @@ reg_pcie: regulator-pcie {
 		regulator-name = "mPCIe_1V5";
 		regulator-min-microvolt = <1500000>;
 		regulator-max-microvolt = <1500000>;
-		gpio = <&gpio3 0 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 0 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -99,7 +99,7 @@ reg_usb_h1_vbus: usb-h1-vbus {
 		regulator-name = "usb_h1_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio2 18 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio2 18 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -110,7 +110,7 @@ reg_usbotg_vbus: usbotg-vbus {
 		regulator-name = "usb_otg_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio2 19 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio2 19 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/nxp/imx/imx6qdl-phytec-pfla02.dtsi b/arch/arm/boot/dts/nxp/imx/imx6qdl-phytec-pfla02.dtsi
index c0c47adc5866..d916e7cee6be 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6qdl-phytec-pfla02.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6qdl-phytec-pfla02.dtsi
@@ -19,7 +19,7 @@ reg_usb_otg_vbus: regulator-usb-otg-vbus {
 		regulator-name = "usb_otg_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio4 15 0>;
+		gpios = <&gpio4 15 0>;
 		enable-active-high;
 	};
 
@@ -30,7 +30,7 @@ reg_usb_h1_vbus: regulator-usb-h1-vbus {
 		regulator-name = "usb_h1_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio1 0 0>;
+		gpios = <&gpio1 0 0>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/nxp/imx/imx6qdl-pico.dtsi b/arch/arm/boot/dts/nxp/imx/imx6qdl-pico.dtsi
index c39a9ebdaba1..bffa2312f656 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6qdl-pico.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6qdl-pico.dtsi
@@ -60,7 +60,7 @@ reg_usb_otg_vbus: regulator-usb-otg-vbus {
 		regulator-name = "usb_otg_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio3 22 GPIO_ACTIVE_LOW>;
+		gpios = <&gpio3 22 GPIO_ACTIVE_LOW>;
 	};
 
 	codec_osc: clock {
@@ -97,7 +97,7 @@ reg_lcd_3v3: regulator-lcd-3v3 {
 		regulator-name = "lcd-3v3";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio2 11 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio2 11 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/nxp/imx/imx6qdl-prti6q.dtsi b/arch/arm/boot/dts/nxp/imx/imx6qdl-prti6q.dtsi
index 36f84f4da6b0..3ef4fa9936d1 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6qdl-prti6q.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6qdl-prti6q.dtsi
@@ -30,7 +30,7 @@ reg_usb_otg_vbus: regulator-otg-vbus {
 		regulator-name = "otg-vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio3 22 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 22 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 };
diff --git a/arch/arm/boot/dts/nxp/imx/imx6qdl-rex.dtsi b/arch/arm/boot/dts/nxp/imx/imx6qdl-rex.dtsi
index eba698d04243..d226f32887ea 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6qdl-rex.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6qdl-rex.dtsi
@@ -27,7 +27,7 @@ reg_usbh1_vbus: regulator-usbh1-vbus {
 		regulator-name = "usbh1_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio3 31 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 31 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -37,7 +37,7 @@ reg_usb_otg_vbus: regulator-otg-vbus {
 		regulator-name = "usb_otg_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio3 22 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 22 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/nxp/imx/imx6qdl-sabreauto.dtsi b/arch/arm/boot/dts/nxp/imx/imx6qdl-sabreauto.dtsi
index 35b6bec7a3fa..0945fc0313af 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6qdl-sabreauto.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6qdl-sabreauto.dtsi
@@ -89,7 +89,7 @@ reg_usb_h1_vbus: regulator-usb-h1-vbus {
 		regulator-name = "usb_h1_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&max7310_b 7 GPIO_ACTIVE_HIGH>;
+		gpios = <&max7310_b 7 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -98,7 +98,7 @@ reg_usb_otg_vbus: regulator-usb-otg-vbus {
 		regulator-name = "usb_otg_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&max7310_c 1 GPIO_ACTIVE_HIGH>;
+		gpios = <&max7310_c 1 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -107,7 +107,7 @@ reg_can_en: regulator-can-en {
 		regulator-name = "can-en";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&max7310_b 6 GPIO_ACTIVE_HIGH>;
+		gpios = <&max7310_b 6 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -116,7 +116,7 @@ reg_can_stby: regulator-can-stby {
 		regulator-name = "can-stby";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&max7310_b 5 GPIO_ACTIVE_HIGH>;
+		gpios = <&max7310_b 5 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&reg_can_en>;
 	};
diff --git a/arch/arm/boot/dts/nxp/imx/imx6qdl-sabrelite.dtsi b/arch/arm/boot/dts/nxp/imx/imx6qdl-sabrelite.dtsi
index 9c502bf77d0b..a180598a4b8a 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6qdl-sabrelite.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6qdl-sabrelite.dtsi
@@ -45,7 +45,7 @@ reg_usb_otg_vbus: regulator-usb-otg-vbus {
 		regulator-name = "usb_otg_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio3 22 0>;
+		gpios = <&gpio3 22 0>;
 		enable-active-high;
 	};
 
@@ -56,7 +56,7 @@ reg_can_xcvr: regulator-can-xcvr {
 		regulator-max-microvolt = <3300000>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_can_xcvr>;
-		gpio = <&gpio1 2 GPIO_ACTIVE_LOW>;
+		gpios = <&gpio1 2 GPIO_ACTIVE_LOW>;
 	};
 
 	reg_1p5v: regulator-1p5v {
@@ -90,7 +90,7 @@ reg_usb_h1_vbus: regulator-usb-h1-vbus {
 		regulator-name = "usb_h1_vbus";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio7 12 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio7 12 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/nxp/imx/imx6qdl-sabresd.dtsi b/arch/arm/boot/dts/nxp/imx/imx6qdl-sabresd.dtsi
index 8f4f5fba68cc..3204c82aa564 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6qdl-sabresd.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6qdl-sabresd.dtsi
@@ -22,7 +22,7 @@ reg_usb_otg_vbus: regulator-usb-otg-vbus {
 		regulator-name = "usb_otg_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio3 22 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 22 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&swbst_reg>;
 	};
@@ -32,7 +32,7 @@ reg_usb_h1_vbus: regulator-usb-h1-vbus {
 		regulator-name = "usb_h1_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio1 29 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 29 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&swbst_reg>;
 	};
@@ -40,7 +40,7 @@ reg_usb_h1_vbus: regulator-usb-h1-vbus {
 	reg_audio: regulator-audio {
 		compatible = "regulator-fixed";
 		regulator-name = "wm8962-supply";
-		gpio = <&gpio4 10 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio4 10 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -51,7 +51,7 @@ reg_pcie: regulator-pcie {
 		regulator-name = "MPCIE_3V3";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio3 19 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 19 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -62,7 +62,7 @@ reg_sensors: regulator-sensors {
 		regulator-name = "sensors-supply";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio2 31 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio2 31 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/nxp/imx/imx6qdl-skov-cpu.dtsi b/arch/arm/boot/dts/nxp/imx/imx6qdl-skov-cpu.dtsi
index 6ab71a729fd8..e83d4818990a 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6qdl-skov-cpu.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6qdl-skov-cpu.dtsi
@@ -141,7 +141,7 @@ reg_can1_stby: regulator-can1-stby {
 		regulator-name = "can1-3v3";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio3 31 GPIO_ACTIVE_LOW>;
+		gpios = <&gpio3 31 GPIO_ACTIVE_LOW>;
 	};
 
 	reg_can2_stby: regulator-can2-stby {
@@ -151,7 +151,7 @@ reg_can2_stby: regulator-can2-stby {
 		regulator-name = "can2-3v3";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio4 11 GPIO_ACTIVE_LOW>;
+		gpios = <&gpio4 11 GPIO_ACTIVE_LOW>;
 	};
 
 	reg_tft_vcom: regulator-tft-vcom {
@@ -174,7 +174,7 @@ reg_vcc_mmc: regulator-vcc-mmc {
 		regulator-max-microvolt = <3300000>;
 		regulator-always-on;
 		regulator-boot-on;
-		gpio = <&gpio7 8 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio7 8 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		startup-delay-us = <100>;
 	};
diff --git a/arch/arm/boot/dts/nxp/imx/imx6qdl-sr-som-brcm.dtsi b/arch/arm/boot/dts/nxp/imx/imx6qdl-sr-som-brcm.dtsi
index b55af61dfeca..722df7aab344 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6qdl-sr-som-brcm.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6qdl-sr-som-brcm.dtsi
@@ -51,7 +51,7 @@ clk_brcm: brcm-clock {
 	reg_brcm: brcm-reg {
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpio3 19 0>;
+		gpios = <&gpio3 19 0>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_microsom_brcm_reg>;
 		regulator-name = "brcm_reg";
diff --git a/arch/arm/boot/dts/nxp/imx/imx6qdl-ts4900.dtsi b/arch/arm/boot/dts/nxp/imx/imx6qdl-ts4900.dtsi
index f88da757edda..f0d5aff6816b 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6qdl-ts4900.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6qdl-ts4900.dtsi
@@ -77,7 +77,7 @@ reg_usb_otg_vbus: regulator-usb-otg-vbus {
 		regulator-name = "usb_otg_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio3 22 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 22 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 };
diff --git a/arch/arm/boot/dts/nxp/imx/imx6qdl-ts7970.dtsi b/arch/arm/boot/dts/nxp/imx/imx6qdl-ts7970.dtsi
index e2db875b61c4..d72462898ec9 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6qdl-ts7970.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6qdl-ts7970.dtsi
@@ -100,7 +100,7 @@ reg_can1_3v3: reg_can1_3v3 {
 		regulator-name = "reg_can1_3v3";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio4 21 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio4 21 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -109,7 +109,7 @@ reg_can2_3v3: en-reg_can2_3v3 {
 		regulator-name = "reg_can2_3v3";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio6 31 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio6 31 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -118,7 +118,7 @@ reg_usb_otg_vbus: regulator-usb-otg-vbus {
 		regulator-name = "usb_otg_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio3 22 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 22 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -127,7 +127,7 @@ reg_wlan_vmmc: regulator_wlan_vmmc {
 		regulator-name = "wlan_vmmc";
 		regulator-min-microvolt = <1800000>;
 		regulator-max-microvolt = <1800000>;
-		gpio = <&gpio8 14 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio8 14 GPIO_ACTIVE_HIGH>;
 		startup-delay-us = <70000>;
 		enable-active-high;
 	};
diff --git a/arch/arm/boot/dts/nxp/imx/imx6qdl-tx6.dtsi b/arch/arm/boot/dts/nxp/imx/imx6qdl-tx6.dtsi
index 5a194f4c0cb9..2ae8a18b9de7 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6qdl-tx6.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6qdl-tx6.dtsi
@@ -108,7 +108,7 @@ reg_3v3_etn: regulator-3v3-etn {
 		regulator-max-microvolt = <3300000>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_etnphy_power>;
-		gpio = <&gpio3 20 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 20 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -135,7 +135,7 @@ reg_can_xcvr: regulator-can-xcvr {
 		regulator-max-microvolt = <3300000>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_flexcan_xcvr>;
-		gpio = <&gpio4 21 GPIO_ACTIVE_LOW>;
+		gpios = <&gpio4 21 GPIO_ACTIVE_LOW>;
 	};
 
 	reg_lcd0_pwr: regulator-lcd0-pwr {
@@ -145,7 +145,7 @@ reg_lcd0_pwr: regulator-lcd0-pwr {
 		regulator-max-microvolt = <3300000>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_lcd0_pwr>;
-		gpio = <&gpio3 29 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 29 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		status = "disabled";
 	};
@@ -157,7 +157,7 @@ reg_lcd1_pwr: regulator-lcd1-pwr {
 		regulator-max-microvolt = <3300000>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_lcd1_pwr>;
-		gpio = <&gpio2 31 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio2 31 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		status = "disabled";
 	};
@@ -169,7 +169,7 @@ reg_usbh1_vbus: regulator-usbh1-vbus {
 		regulator-max-microvolt = <5000000>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_usbh1_vbus>;
-		gpio = <&gpio3 31 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 31 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -180,7 +180,7 @@ reg_usbotg_vbus: regulator-usbotg-vbus {
 		regulator-max-microvolt = <5000000>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_usbotg_vbus>;
-		gpio = <&gpio1 7 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 7 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/nxp/imx/imx6qdl-udoo.dtsi b/arch/arm/boot/dts/nxp/imx/imx6qdl-udoo.dtsi
index 14272b42f9a1..50e6040de6c2 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6qdl-udoo.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6qdl-udoo.dtsi
@@ -63,7 +63,7 @@ reg_panel: regulator-panel {
 		compatible = "regulator-fixed";
 		regulator-name = "lcd_panel";
 		enable-active-high;
-		gpio = <&gpio1 2 0>;
+		gpios = <&gpio1 2 0>;
 	};
 
 	sound {
diff --git a/arch/arm/boot/dts/nxp/imx/imx6qdl-var-dart.dtsi b/arch/arm/boot/dts/nxp/imx/imx6qdl-var-dart.dtsi
index d8283eade43e..b1c1a14bfe5a 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6qdl-var-dart.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6qdl-var-dart.dtsi
@@ -28,7 +28,7 @@ reg_wl18xx_vmmc: regulator-wl18xx {
 		regulator-name = "vwl1807";
 		regulator-min-microvolt = <1800000>;
 		regulator-max-microvolt = <1800000>;
-		gpio = <&gpio7 8 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio7 8 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		startup-delay-us = <70000>;
 	};
diff --git a/arch/arm/boot/dts/nxp/imx/imx6qdl-var-som.dtsi b/arch/arm/boot/dts/nxp/imx/imx6qdl-var-som.dtsi
index 59833e8d11d8..6b83108f87c6 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6qdl-var-som.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6qdl-var-som.dtsi
@@ -64,7 +64,7 @@ reg_wl18xx_vmmc: regulator-wl18xx {
 		regulator-name = "vwl1807";
 		regulator-min-microvolt = <1800000>;
 		regulator-max-microvolt = <1800000>;
-		gpio = <&gpio7 8 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio7 8 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		startup-delay-us = <70000>;
 	};
diff --git a/arch/arm/boot/dts/nxp/imx/imx6qdl-vicut1.dtsi b/arch/arm/boot/dts/nxp/imx/imx6qdl-vicut1.dtsi
index 96e4f4b0b248..051faf8b5661 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6qdl-vicut1.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6qdl-vicut1.dtsi
@@ -133,7 +133,7 @@ reg_otg_vbus: regulator-otg-vbus {
 		regulator-name = "otg-vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio3 22 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 22 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/nxp/imx/imx6qdl-wandboard-revd1.dtsi b/arch/arm/boot/dts/nxp/imx/imx6qdl-wandboard-revd1.dtsi
index 9b8c9c23ab54..1ada447457d2 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6qdl-wandboard-revd1.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6qdl-wandboard-revd1.dtsi
@@ -12,7 +12,7 @@ reg_eth_phy: regulator-eth-phy {
 		regulator-name = "ETH_PHY";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio7 13 GPIO_ACTIVE_LOW>;
+		gpios = <&gpio7 13 GPIO_ACTIVE_LOW>;
 	};
 };
 
diff --git a/arch/arm/boot/dts/nxp/imx/imx6qdl-wandboard.dtsi b/arch/arm/boot/dts/nxp/imx/imx6qdl-wandboard.dtsi
index 7130b9c3b3aa..d90308c49d9b 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6qdl-wandboard.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6qdl-wandboard.dtsi
@@ -85,7 +85,7 @@ reg_usb_otg_vbus: regulator-usbotgvbus {
 		regulator-max-microvolt = <5000000>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_usbotgvbus>;
-		gpio = <&gpio3 22 GPIO_ACTIVE_LOW>;
+		gpios = <&gpio3 22 GPIO_ACTIVE_LOW>;
 	};
 };
 
diff --git a/arch/arm/boot/dts/nxp/imx/imx6qdl-zii-rdu2.dtsi b/arch/arm/boot/dts/nxp/imx/imx6qdl-zii-rdu2.dtsi
index 9ff183e4e069..2b01e46d69df 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6qdl-zii-rdu2.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6qdl-zii-rdu2.dtsi
@@ -86,7 +86,7 @@ reg_3p3v_sd: regulator-3p3v-sd {
 		regulator-name = "3V3_SD";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio7 8 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio7 8 GPIO_ACTIVE_HIGH>;
 		startup-delay-us = <1000>;
 		enable-active-high;
 		regulator-always-on;
diff --git a/arch/arm/boot/dts/nxp/imx/imx6qp-prtwd3.dts b/arch/arm/boot/dts/nxp/imx/imx6qp-prtwd3.dts
index ae00d538a4df..8d7fbae4f2dd 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6qp-prtwd3.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx6qp-prtwd3.dts
@@ -103,7 +103,7 @@ reg_otg_vbus: regulator-otg-vbus {
 		regulator-name = "otg-vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio3 22 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 22 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/nxp/imx/imx6sl-evk.dts b/arch/arm/boot/dts/nxp/imx/imx6sl-evk.dts
index 7c899291ab0d..76315b932592 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6sl-evk.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx6sl-evk.dts
@@ -45,7 +45,7 @@ reg_usb_otg1_vbus: regulator-usb-otg1-vbus {
 		regulator-name = "usb_otg1_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio4 0 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio4 0 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&swbst_reg>;
 	};
@@ -55,7 +55,7 @@ reg_usb_otg2_vbus: regulator-usb-otg2-vbus {
 		regulator-name = "usb_otg2_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio4 2 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio4 2 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&swbst_reg>;
 	};
@@ -81,7 +81,7 @@ reg_lcd_3v3: regulator-lcd-3v3 {
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_reg_lcd_3v3>;
 		regulator-name = "lcd-3v3";
-		gpio = <&gpio4 3 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio4 3 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/nxp/imx/imx6sl-kobo-aura2.dts b/arch/arm/boot/dts/nxp/imx/imx6sl-kobo-aura2.dts
index 657d0f1b6115..7a0f35469f48 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6sl-kobo-aura2.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx6sl-kobo-aura2.dts
@@ -74,7 +74,7 @@ reg_wifi: regulator-wifi {
 		regulator-name = "SD3_SPWR";
 		regulator-min-microvolt = <3000000>;
 		regulator-max-microvolt = <3000000>;
-		gpio = <&gpio4 29 GPIO_ACTIVE_LOW>;
+		gpios = <&gpio4 29 GPIO_ACTIVE_LOW>;
 	};
 
 	wifi_pwrseq: wifi-pwrseq {
diff --git a/arch/arm/boot/dts/nxp/imx/imx6sl-tolino-shine2hd.dts b/arch/arm/boot/dts/nxp/imx/imx6sl-tolino-shine2hd.dts
index 03d6965f0149..b2ec2ffb9183 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6sl-tolino-shine2hd.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx6sl-tolino-shine2hd.dts
@@ -29,7 +29,7 @@ backlight_regulator: regulator-backlight {
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_backlight_power>;
 		regulator-name = "backlight";
-		gpio = <&gpio2 10 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio2 10 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -100,7 +100,7 @@ reg_wifi: regulator-wifi {
 		regulator-name = "SD3_SPWR";
 		regulator-min-microvolt = <3000000>;
 		regulator-max-microvolt = <3000000>;
-		gpio = <&gpio4 29 GPIO_ACTIVE_LOW>;
+		gpios = <&gpio4 29 GPIO_ACTIVE_LOW>;
 	};
 
 	wifi_pwrseq: wifi_pwrseq {
diff --git a/arch/arm/boot/dts/nxp/imx/imx6sl-tolino-vision.dts b/arch/arm/boot/dts/nxp/imx/imx6sl-tolino-vision.dts
index 2694fe18a91b..1b28fb3365b4 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6sl-tolino-vision.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx6sl-tolino-vision.dts
@@ -35,7 +35,7 @@ backlight_regulator: regulator-backlight {
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_backlight_power>;
 		regulator-name = "backlight";
-		gpio = <&gpio2 10 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio2 10 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -104,7 +104,7 @@ reg_wifi: regulator-wifi {
 		regulator-name = "SD3_SPWR";
 		regulator-min-microvolt = <3000000>;
 		regulator-max-microvolt = <3000000>;
-		gpio = <&gpio4 29 GPIO_ACTIVE_LOW>;
+		gpios = <&gpio4 29 GPIO_ACTIVE_LOW>;
 	};
 
 
diff --git a/arch/arm/boot/dts/nxp/imx/imx6sll-evk.dts b/arch/arm/boot/dts/nxp/imx/imx6sll-evk.dts
index febc2dd9967d..5edb48135861 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6sll-evk.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx6sll-evk.dts
@@ -51,7 +51,7 @@ reg_usb_otg1_vbus: regulator-otg1-vbus {
 		regulator-name = "usb_otg1_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio4 0 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio4 0 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -62,7 +62,7 @@ reg_usb_otg2_vbus: regulator-otg2-vbus {
 		regulator-name = "usb_otg2_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio4 2 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio4 2 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -87,7 +87,7 @@ reg_lcd_3v3: regulator-lcd-3v3 {
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_reg_lcd_3v3>;
 		regulator-name = "lcd-3v3";
-		gpio = <&gpio4 3 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio4 3 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -105,7 +105,7 @@ reg_sd1_vmmc: regulator-sd1-vmmc {
 		regulator-name = "SD1_SPWR";
 		regulator-min-microvolt = <3000000>;
 		regulator-max-microvolt = <3000000>;
-		gpio = <&gpio3 30 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 30 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -124,7 +124,7 @@ reg_sd3_vmmc: regulator-sd3-vmmc {
 		regulator-name = "SD3_WIFI";
 		regulator-min-microvolt = <3000000>;
 		regulator-max-microvolt = <3000000>;
-		gpio = <&gpio4 4 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio4 4 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/nxp/imx/imx6sx-nitrogen6sx.dts b/arch/arm/boot/dts/nxp/imx/imx6sx-nitrogen6sx.dts
index 1c1515a854c8..db7cf0ad3c93 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6sx-nitrogen6sx.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx6sx-nitrogen6sx.dts
@@ -45,7 +45,7 @@ reg_can1_3v3: regulator-can1-3v3 {
 		regulator-name = "can1-3v3";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio4 27 GPIO_ACTIVE_LOW>;
+		gpios = <&gpio4 27 GPIO_ACTIVE_LOW>;
 	};
 
 	reg_can2_3v3: regulator-can2-3v3 {
@@ -53,7 +53,7 @@ reg_can2_3v3: regulator-can2-3v3 {
 		regulator-name = "can2-3v3";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio4 24 GPIO_ACTIVE_LOW>;
+		gpios = <&gpio4 24 GPIO_ACTIVE_LOW>;
 	};
 
 	reg_usb_otg1_vbus: regulator-usb-otg1-vbus {
@@ -63,7 +63,7 @@ reg_usb_otg1_vbus: regulator-usb-otg1-vbus {
 		regulator-name = "usb_otg1_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio1 9 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 9 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -76,7 +76,7 @@ reg_wlan: regulator-wlan {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 		startup-delay-us = <70000>;
-		gpio = <&gpio7 6 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio7 6 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/nxp/imx/imx6sx-sabreauto.dts b/arch/arm/boot/dts/nxp/imx/imx6sx-sabreauto.dts
index dfbfb8119bf3..69709d016b22 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6sx-sabreauto.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx6sx-sabreauto.dts
@@ -34,7 +34,7 @@ vcc_sd3: regulator-vcc-sd3 {
 		regulator-name = "VCC_SD3";
 		regulator-min-microvolt = <3000000>;
 		regulator-max-microvolt = <3000000>;
-		gpio = <&gpio2 11 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio2 11 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -43,7 +43,7 @@ reg_can_wake: regulator-can-wake {
 		regulator-name = "can-wake";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&max7310_b 7 GPIO_ACTIVE_HIGH>;
+		gpios = <&max7310_b 7 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -52,7 +52,7 @@ reg_can_en: regulator-can-en {
 		regulator-name = "can-en";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&max7310_b 5 GPIO_ACTIVE_HIGH>;
+		gpios = <&max7310_b 5 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&reg_can_wake>;
 	};
@@ -62,7 +62,7 @@ reg_can_stby: regulator-can-stby {
 		regulator-name = "can-stby";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&max7310_b 4 GPIO_ACTIVE_HIGH>;
+		gpios = <&max7310_b 4 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&reg_can_en>;
 	};
diff --git a/arch/arm/boot/dts/nxp/imx/imx6sx-sdb-reva.dts b/arch/arm/boot/dts/nxp/imx/imx6sx-sdb-reva.dts
index 48f19dede467..84db419745c5 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6sx-sdb-reva.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx6sx-sdb-reva.dts
@@ -146,12 +146,12 @@ flash1: flash at 2 {
 
 &reg_can_en {
 	/* Transceiver EN/STBY is active high on RevA board */
-	gpio = <&gpio4 25 GPIO_ACTIVE_HIGH>;
+	gpios = <&gpio4 25 GPIO_ACTIVE_HIGH>;
 	enable-active-high;
 };
 
 &reg_can_stby {
-	gpio = <&gpio4 27 GPIO_ACTIVE_HIGH>;
+	gpios = <&gpio4 27 GPIO_ACTIVE_HIGH>;
 	enable-active-high;
 	vin-supply = <&reg_can_en>;
 };
diff --git a/arch/arm/boot/dts/nxp/imx/imx6sx-sdb.dts b/arch/arm/boot/dts/nxp/imx/imx6sx-sdb.dts
index e05a1be5553c..db96d64344db 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6sx-sdb.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx6sx-sdb.dts
@@ -147,7 +147,7 @@ &reg_vdd2p5 {
 
 &reg_can_stby {
 	/* Transceiver EN/STBY is active low on RevB board */
-	gpio = <&gpio4 27 GPIO_ACTIVE_LOW>;
+	gpios = <&gpio4 27 GPIO_ACTIVE_LOW>;
 };
 
 &snvs_pwrkey {
diff --git a/arch/arm/boot/dts/nxp/imx/imx6sx-sdb.dtsi b/arch/arm/boot/dts/nxp/imx/imx6sx-sdb.dtsi
index 277a6e039045..e3e0e870a6d1 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6sx-sdb.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6sx-sdb.dtsi
@@ -55,7 +55,7 @@ vcc_sd3: regulator-vcc-sd3 {
 		regulator-name = "VCC_SD3";
 		regulator-min-microvolt = <3000000>;
 		regulator-max-microvolt = <3000000>;
-		gpio = <&gpio2 11 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio2 11 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -66,7 +66,7 @@ reg_usb_otg1_vbus: regulator-usb-otg1-vbus {
 		regulator-name = "usb_otg1_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio1 9 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 9 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -77,7 +77,7 @@ reg_usb_otg2_vbus: regulator-usb-otg2-vbus {
 		regulator-name = "usb_otg2_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio1 12 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 12 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -91,7 +91,7 @@ reg_psu_5v: regulator-psu-5v {
 	reg_lcd_3v3: regulator-lcd-3v3 {
 		compatible = "regulator-fixed";
 		regulator-name = "lcd-3v3";
-		gpio = <&gpio3 27 0>;
+		gpios = <&gpio3 27 0>;
 		enable-active-high;
 	};
 
@@ -102,7 +102,7 @@ reg_peri_3v3: regulator-peri-3v3 {
 		regulator-name = "peri_3v3";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio4 16 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio4 16 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		regulator-always-on;
 	};
@@ -114,7 +114,7 @@ reg_enet_3v3: regulator-enet-3v3 {
 		regulator-name = "enet_3v3";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio2 6 GPIO_ACTIVE_LOW>;
+		gpios = <&gpio2 6 GPIO_ACTIVE_LOW>;
 		regulator-boot-on;
 		regulator-always-on;
 	};
@@ -126,7 +126,7 @@ reg_pcie_gpio: regulator-pcie-gpio {
 		regulator-name = "MPCIE_3V3";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio2 1 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio2 1 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/nxp/imx/imx6sx-softing-vining-2000.dts b/arch/arm/boot/dts/nxp/imx/imx6sx-softing-vining-2000.dts
index f999eb244373..bd86699ba739 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6sx-softing-vining-2000.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx6sx-softing-vining-2000.dts
@@ -29,7 +29,7 @@ reg_usb_otg1_vbus: regulator-usb_otg1_vbus {
 		pinctrl-0 = <&pinctrl_usb_otg1>;
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio1 9 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 9 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/nxp/imx/imx6sx-udoo-neo.dtsi b/arch/arm/boot/dts/nxp/imx/imx6sx-udoo-neo.dtsi
index bbf792ac4896..0c302a9ad53f 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6sx-udoo-neo.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6sx-udoo-neo.dtsi
@@ -31,7 +31,7 @@ led-orange {
 
 	reg_sdio_pwr: regulator-sdio-pwr {
 		compatible = "regulator-fixed";
-		gpio = <&gpio6 1 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio6 1 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		regulator-name = "SDIO_PWR";
 		regulator-min-microvolt = <3300000>;
@@ -46,7 +46,7 @@ reg_usb_otg1_vbus: regulator-usb-otg1-vbus {
 		regulator-name = "usb_otg1_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio1 9 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 9 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -57,7 +57,7 @@ reg_usb_otg2_vbus: regulator-usb-otg2-vbus {
 		regulator-name = "usb_otg2_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio4 12 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio4 12 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -66,7 +66,7 @@ reg_wlan: regulator-wlan {
 		regulator-name = "wlan-en-regulator";
 		regulator-min-microvolt = <1800000>;
 		regulator-max-microvolt = <1800000>;
-		gpio = <&gpio2 12 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio2 12 GPIO_ACTIVE_HIGH>;
 		startup-delay-us = <70000>;
 		enable-active-high;
 	};
diff --git a/arch/arm/boot/dts/nxp/imx/imx6ul-14x14-evk.dtsi b/arch/arm/boot/dts/nxp/imx/imx6ul-14x14-evk.dtsi
index b74ee8948a78..a4da10e096eb 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6ul-14x14-evk.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6ul-14x14-evk.dtsi
@@ -28,7 +28,7 @@ reg_sd1_vmmc: regulator-sd1-vmmc {
 		regulator-name = "VSD_3V3";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio1 9 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 9 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -39,7 +39,7 @@ reg_peri_3v3: regulator-peri-3v3 {
 		regulator-name = "VPERI_3V3";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio5 2 GPIO_ACTIVE_LOW>;
+		gpios = <&gpio5 2 GPIO_ACTIVE_LOW>;
 		/*
 		 * If you want to want to make this dynamic please
 		 * check schematics and test all affected peripherals:
diff --git a/arch/arm/boot/dts/nxp/imx/imx6ul-ccimx6ulsbcpro.dts b/arch/arm/boot/dts/nxp/imx/imx6ul-ccimx6ulsbcpro.dts
index 8aea8c99e2af..0959e0987993 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6ul-ccimx6ulsbcpro.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx6ul-ccimx6ulsbcpro.dts
@@ -41,7 +41,7 @@ reg_usb_otg1_vbus: regulator-usb-otg1 {
 		regulator-name = "usb_otg1_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio1 4 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 4 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 };
diff --git a/arch/arm/boot/dts/nxp/imx/imx6ul-imx6ull-opos6uldev.dtsi b/arch/arm/boot/dts/nxp/imx/imx6ul-imx6ull-opos6uldev.dtsi
index be3cacb4fa7a..1a086b04959d 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6ul-imx6ull-opos6uldev.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6ul-imx6ull-opos6uldev.dtsi
@@ -74,7 +74,7 @@ reg_usbotg1_vbus: regulator-usbotg1vbus {
 		regulator-max-microvolt = <5000000>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_usbotg1_vbus>;
-		gpio = <&gpio1 5 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 5 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -85,7 +85,7 @@ reg_usbotg2_vbus: regulator-usbotg2vbus {
 		regulator-max-microvolt = <5000000>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_usbotg2_vbus>;
-		gpio = <&gpio5 9 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio5 9 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 };
diff --git a/arch/arm/boot/dts/nxp/imx/imx6ul-kontron-bl-common.dtsi b/arch/arm/boot/dts/nxp/imx/imx6ul-kontron-bl-common.dtsi
index 29d2f86d5e34..b242681abcc6 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6ul-kontron-bl-common.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6ul-kontron-bl-common.dtsi
@@ -57,7 +57,7 @@ reg_usb_otg1_vbus: regulator-usb-otg1-vbus {
 		regulator-name = "usb_otg1_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio1 4 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 4 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/nxp/imx/imx6ul-liteboard.dts b/arch/arm/boot/dts/nxp/imx/imx6ul-liteboard.dts
index 5e62272acfba..828d819a11c4 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6ul-liteboard.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx6ul-liteboard.dts
@@ -61,7 +61,7 @@ reg_usb_otg1_vbus: regulator-usb-otg1-vbus {
 		regulator-name = "usb_otg1_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio2 8 GPIO_ACTIVE_LOW>;
+		gpios = <&gpio2 8 GPIO_ACTIVE_LOW>;
 	};
 };
 
diff --git a/arch/arm/boot/dts/nxp/imx/imx6ul-phytec-segin-peb-av-02.dtsi b/arch/arm/boot/dts/nxp/imx/imx6ul-phytec-segin-peb-av-02.dtsi
index ec042648bd98..a29041a0e430 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6ul-phytec-segin-peb-av-02.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6ul-phytec-segin-peb-av-02.dtsi
@@ -34,7 +34,7 @@ reg_backlight_en: regulator-backlight-en {
 		regulator-name = "backlight-lcd";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio1 18 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 18 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 };
diff --git a/arch/arm/boot/dts/nxp/imx/imx6ul-phytec-segin-peb-wlbt-05.dtsi b/arch/arm/boot/dts/nxp/imx/imx6ul-phytec-segin-peb-wlbt-05.dtsi
index 4a45fb784ff7..65d33e9d0947 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6ul-phytec-segin-peb-wlbt-05.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6ul-phytec-segin-peb-wlbt-05.dtsi
@@ -15,7 +15,7 @@ reg_wl_en: regulator-wl-en {
 		regulator-max-microvolt = <3300000>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_wl>;
-		gpio = <&gpio5 9 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio5 9 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		startup-delay-us = <100>;
 		status = "disabled";
diff --git a/arch/arm/boot/dts/nxp/imx/imx6ul-phytec-segin.dtsi b/arch/arm/boot/dts/nxp/imx/imx6ul-phytec-segin.dtsi
index bef5eb38a90d..bb48f35d4680 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6ul-phytec-segin.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6ul-phytec-segin.dtsi
@@ -36,7 +36,7 @@ reg_can1_en: regulator-can1 {
 		regulator-name = "Can";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio5 2 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio5 2 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		status = "disabled";
 	};
diff --git a/arch/arm/boot/dts/nxp/imx/imx6ul-pico.dtsi b/arch/arm/boot/dts/nxp/imx/imx6ul-pico.dtsi
index fe307f49b9e5..c188eef36f59 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6ul-pico.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6ul-pico.dtsi
@@ -47,7 +47,7 @@ reg_sd1_vmmc: regulator-sd1-vmmc {
 		regulator-name = "VSD_3V3";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio1 9 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 9 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -58,13 +58,13 @@ reg_usb_otg_vbus: regulator-usb-otg-vbus {
 		regulator-name = "usb_otg_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio1 6 0>;
+		gpios = <&gpio1 6 0>;
 	};
 
 	reg_brcm: regulator-brcm {
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpio4 8 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio4 8 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_brcm_reg>;
 		regulator-name = "brcm_reg";
diff --git a/arch/arm/boot/dts/nxp/imx/imx6ul-tx6ul.dtsi b/arch/arm/boot/dts/nxp/imx/imx6ul-tx6ul.dtsi
index 278120404d31..e0afc929903c 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6ul-tx6ul.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6ul-tx6ul.dtsi
@@ -145,7 +145,7 @@ reg_3v3_etn: regulator-3v3etn {
 		regulator-max-microvolt = <3300000>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_etnphy_power>;
-		gpio = <&gpio5 7 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio5 7 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -172,7 +172,7 @@ reg_can_xcvr: regulator-canxcvr {
 		regulator-max-microvolt = <3300000>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_flexcan_xcvr>;
-		gpio = <&gpio3 5 GPIO_ACTIVE_LOW>;
+		gpios = <&gpio3 5 GPIO_ACTIVE_LOW>;
 	};
 
 	reg_lcd_pwr: regulator-lcdpwr {
@@ -182,7 +182,7 @@ reg_lcd_pwr: regulator-lcdpwr {
 		regulator-max-microvolt = <3300000>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_lcd_pwr>;
-		gpio = <&gpio5 4 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio5 4 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		regulator-boot-on;
 		regulator-always-on;
@@ -195,7 +195,7 @@ reg_usbh1_vbus: regulator-usbh1vbus {
 		regulator-max-microvolt = <5000000>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_usbh1_vbus &pinctrl_usbh1_oc>;
-		gpio = <&gpio1 2 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 2 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -206,7 +206,7 @@ reg_usbotg_vbus: regulator-usbotgvbus {
 		regulator-max-microvolt = <5000000>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_usbotg_vbus &pinctrl_usbotg_oc>;
-		gpio = <&gpio1 26 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 26 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/nxp/imx/imx6ull-colibri-aster.dtsi b/arch/arm/boot/dts/nxp/imx/imx6ull-colibri-aster.dtsi
index de4dc7c1a03a..4c88f9bbeed1 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6ull-colibri-aster.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6ull-colibri-aster.dtsi
@@ -43,7 +43,7 @@ reg_usbh_vbus: regulator-usbh-vbus {
 		regulator-name = "VCC_USB[1-4]";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio1 2 GPIO_ACTIVE_LOW>;
+		gpios = <&gpio1 2 GPIO_ACTIVE_LOW>;
 		vin-supply = <&reg_5v0>;
 	};
 };
diff --git a/arch/arm/boot/dts/nxp/imx/imx6ull-colibri-eval-v3.dtsi b/arch/arm/boot/dts/nxp/imx/imx6ull-colibri-eval-v3.dtsi
index 692ef26fbab3..20bd4021b2fb 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6ull-colibri-eval-v3.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6ull-colibri-eval-v3.dtsi
@@ -36,7 +36,7 @@ reg_usbh_vbus: regulator-usbh-vbus {
 		regulator-name = "VCC_USB[1-4]";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio1 2 GPIO_ACTIVE_LOW>;
+		gpios = <&gpio1 2 GPIO_ACTIVE_LOW>;
 		vin-supply = <&reg_5v0>;
 	};
 };
diff --git a/arch/arm/boot/dts/nxp/imx/imx6ull-colibri-iris-v2.dtsi b/arch/arm/boot/dts/nxp/imx/imx6ull-colibri-iris-v2.dtsi
index 93649cad0cc0..fdb9927b87fd 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6ull-colibri-iris-v2.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6ull-colibri-iris-v2.dtsi
@@ -11,7 +11,7 @@ reg_3v3_vmmc: regulator-3v3-vmmc {
 		regulator-name = "3v3_vmmc";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio1 26 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 26 GPIO_ACTIVE_HIGH>;
 		startup-delay-us = <100>;
 		enable-active-high;
 	};
diff --git a/arch/arm/boot/dts/nxp/imx/imx6ull-colibri-iris.dtsi b/arch/arm/boot/dts/nxp/imx/imx6ull-colibri-iris.dtsi
index f52f8b5ad8a6..abb22c48f8f2 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6ull-colibri-iris.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6ull-colibri-iris.dtsi
@@ -43,7 +43,7 @@ reg_usbh_vbus: regulator-usbh-vbus {
 		regulator-name = "VCC_USB[1-4]";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio1 2 GPIO_ACTIVE_LOW>;
+		gpios = <&gpio1 2 GPIO_ACTIVE_LOW>;
 		vin-supply = <&reg_5v0>;
 	};
 };
diff --git a/arch/arm/boot/dts/nxp/imx/imx6ull-dhcom-som.dtsi b/arch/arm/boot/dts/nxp/imx/imx6ull-dhcom-som.dtsi
index a74f5273f9b3..5529fced46b0 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6ull-dhcom-som.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6ull-dhcom-som.dtsi
@@ -45,7 +45,7 @@ reg_usb_otg1_vbus: regulator-usb-otg1-vbus {
 
 	reg_usb_otg2_vbus: regulator-usb-otg2-vbus {
 		compatible = "regulator-fixed";
-		gpio = <&gpio1 5 GPIO_ACTIVE_LOW>;
+		gpios = <&gpio1 5 GPIO_ACTIVE_LOW>;
 		regulator-max-microvolt = <5000000>;
 		regulator-min-microvolt = <5000000>;
 		regulator-name = "usb-otg2-vbus";
diff --git a/arch/arm/boot/dts/nxp/imx/imx6ull-jozacp.dts b/arch/arm/boot/dts/nxp/imx/imx6ull-jozacp.dts
index a152eeb78e88..9edae2efa8c1 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6ull-jozacp.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx6ull-jozacp.dts
@@ -100,7 +100,7 @@ reg_vbus: regulator-vbus {
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
 		vin-supply = <&reg_5v0>;
-		gpio = <&gpio1 2 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 2 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/nxp/imx/imx6ull-phytec-tauri.dtsi b/arch/arm/boot/dts/nxp/imx/imx6ull-phytec-tauri.dtsi
index d12fb44aeb14..74081658a282 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6ull-phytec-tauri.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx6ull-phytec-tauri.dtsi
@@ -41,7 +41,7 @@ reg_s25fl064_hold: regulator-s25fl064-hold {
 		regulator-name = "s25fl064_hold";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio3 17 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 17 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		regulator-always-on;
 	};
@@ -53,7 +53,7 @@ reg_usb_hub_vbus: regulator-hub-otg1-vbus {
 		regulator-name = "usb_hub_vbus";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio5 5 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio5 5 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		regulator-always-on;
 	};
@@ -65,7 +65,7 @@ reg_usb_otg1_vbus: regulator-usb-otg1-vbus {
 		regulator-name = "usb_otg1_vbus";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio4 28 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio4 28 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		regulator-always-on;
 	};
diff --git a/arch/arm/boot/dts/nxp/imx/imx6ull-tarragon-master.dts b/arch/arm/boot/dts/nxp/imx/imx6ull-tarragon-master.dts
index f9bbd589b66d..09a19dbef021 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6ull-tarragon-master.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx6ull-tarragon-master.dts
@@ -25,7 +25,7 @@ reg_fan: regulator {
 		pinctrl-0 = <&pinctrl_fan_enable>;
 		regulator-min-microvolt = <12000000>;
 		regulator-max-microvolt = <12000000>;
-		gpio = <&gpio3 5 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 5 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		regulator-boot-on;
 	};
diff --git a/arch/arm/boot/dts/nxp/imx/imx6ull-tarragon-slavext.dts b/arch/arm/boot/dts/nxp/imx/imx6ull-tarragon-slavext.dts
index 83db65bf630f..d2050a98cd69 100644
--- a/arch/arm/boot/dts/nxp/imx/imx6ull-tarragon-slavext.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx6ull-tarragon-slavext.dts
@@ -25,7 +25,7 @@ reg_fan: regulator {
 		pinctrl-0 = <&pinctrl_fan_enable>;
 		regulator-min-microvolt = <12000000>;
 		regulator-max-microvolt = <12000000>;
-		gpio = <&gpio3 5 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 5 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		regulator-boot-on;
 	};
diff --git a/arch/arm/boot/dts/nxp/imx/imx7-colibri-iris-v2.dtsi b/arch/arm/boot/dts/nxp/imx/imx7-colibri-iris-v2.dtsi
index b687727f956a..8ab1ebeaebb2 100644
--- a/arch/arm/boot/dts/nxp/imx/imx7-colibri-iris-v2.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx7-colibri-iris-v2.dtsi
@@ -7,7 +7,7 @@ / {
 	reg_3v3_vmmc: regulator-3v3-vmmc {
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpio5 16 GPIO_ACTIVE_HIGH>; /* SODIMM 100 */
+		gpios = <&gpio5 16 GPIO_ACTIVE_HIGH>; /* SODIMM 100 */
 		regulator-max-microvolt = <3300000>;
 		regulator-min-microvolt = <3300000>;
 		regulator-name = "3v3_vmmc";
diff --git a/arch/arm/boot/dts/nxp/imx/imx7-colibri.dtsi b/arch/arm/boot/dts/nxp/imx/imx7-colibri.dtsi
index 62e41edcaf1d..7a40e4be36e3 100644
--- a/arch/arm/boot/dts/nxp/imx/imx7-colibri.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx7-colibri.dtsi
@@ -106,7 +106,7 @@ reg_module_3v3_eth: regulator-module-3v3-eth {
 
 	reg_usbh_vbus: regulator-usbh-vbus {
 		compatible = "regulator-fixed";
-		gpio = <&gpio4 7 GPIO_ACTIVE_LOW>; /* SODIMM 129 / USBH_PEN */
+		gpios = <&gpio4 7 GPIO_ACTIVE_LOW>; /* SODIMM 129 / USBH_PEN */
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_usbh_reg>;
 		regulator-max-microvolt = <5000000>;
diff --git a/arch/arm/boot/dts/nxp/imx/imx7-mba7.dtsi b/arch/arm/boot/dts/nxp/imx/imx7-mba7.dtsi
index e1c401f468e1..15dee63e9211 100644
--- a/arch/arm/boot/dts/nxp/imx/imx7-mba7.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx7-mba7.dtsi
@@ -101,7 +101,7 @@ reg_fec1_pwdn: regulator-fec1-pwdn {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 		regulator-always-on;
-		gpio = <&gpio1 9 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 9 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -111,7 +111,7 @@ reg_fec2_pwdn: regulator-fec2-pwdn {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 		regulator-always-on;
-		gpio = <&gpio2 31 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio2 31 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -120,7 +120,7 @@ reg_usb_otg1_vbus: regulator-usb-otg1-vbus {
 		regulator-name = "VBUS_USBOTG1";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio1 5 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 5 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -129,7 +129,7 @@ reg_usb_otg2_vbus: regulator-usb-otg2-vbus {
 		regulator-name = "VBUS_USBOTG2";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio1 7 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 7 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -138,7 +138,7 @@ reg_mpcie_1v5: regulator-mpcie-1v5 {
 		regulator-name = "VCC1V5_MPCIE";
 		regulator-min-microvolt = <1500000>;
 		regulator-max-microvolt = <1500000>;
-		gpio = <&pca9555 12 GPIO_ACTIVE_HIGH>;
+		gpios = <&pca9555 12 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		regulator-always-on;
 	};
@@ -148,7 +148,7 @@ reg_mpcie_3v3: regulator-mpcie-3v3 {
 		regulator-name = "VCC3V3_MPCIE";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&pca9555 10 GPIO_ACTIVE_HIGH>;
+		gpios = <&pca9555 10 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		regulator-always-on;
 	};
@@ -158,7 +158,7 @@ reg_mba_12v0: regulator-mba-12v0 {
 		regulator-name = "VCC12V0_MBA7";
 		regulator-min-microvolt = <12000000>;
 		regulator-max-microvolt = <12000000>;
-		gpio = <&pca9555 11 GPIO_ACTIVE_HIGH>;
+		gpios = <&pca9555 11 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -167,7 +167,7 @@ reg_lvds_transmitter: regulator-lvds-transmitter {
 		regulator-name = "#SHTDN_LVDS";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&pca9555 1 GPIO_ACTIVE_HIGH>;
+		gpios = <&pca9555 1 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/nxp/imx/imx7d-cl-som-imx7.dts b/arch/arm/boot/dts/nxp/imx/imx7d-cl-som-imx7.dts
index 713483c39c9d..83b6783a808f 100644
--- a/arch/arm/boot/dts/nxp/imx/imx7d-cl-som-imx7.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx7d-cl-som-imx7.dts
@@ -28,7 +28,7 @@ reg_usb_otg1_vbus: regulator-vbus {
 		regulator-name = "usb_otg1_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio1 5 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 5 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 };
diff --git a/arch/arm/boot/dts/nxp/imx/imx7d-flex-concentrator.dts b/arch/arm/boot/dts/nxp/imx/imx7d-flex-concentrator.dts
index 9984b343cdf0..fe3a50746640 100644
--- a/arch/arm/boot/dts/nxp/imx/imx7d-flex-concentrator.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx7d-flex-concentrator.dts
@@ -28,7 +28,7 @@ reg_usb_otg2_vbus: regulator-usb-otg2-vbus {
 		regulator-name = "VBUS_USBOTG2";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio1 7 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 7 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/nxp/imx/imx7d-meerkat96.dts b/arch/arm/boot/dts/nxp/imx/imx7d-meerkat96.dts
index f0fda15f3020..c27124d7c3e5 100644
--- a/arch/arm/boot/dts/nxp/imx/imx7d-meerkat96.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx7d-meerkat96.dts
@@ -28,7 +28,7 @@ reg_wlreg_on: regulator-wlreg-on {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 		startup-delay-us = <100>;
-		gpio = <&gpio6 15 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio6 15 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		regulator-always-on;
 	};
@@ -53,7 +53,7 @@ reg_usb_otg2_vbus: regulator-usb-otg2-vbus {
 		regulator-name = "usb_otg2_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio1 2 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 2 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/nxp/imx/imx7d-nitrogen7.dts b/arch/arm/boot/dts/nxp/imx/imx7d-nitrogen7.dts
index 7ee66be8bccb..867b7fbe975d 100644
--- a/arch/arm/boot/dts/nxp/imx/imx7d-nitrogen7.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx7d-nitrogen7.dts
@@ -48,7 +48,7 @@ reg_usb_otg1_vbus: regulator-usb-otg1-vbus {
 		regulator-name = "usb_otg1_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio1 5 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 5 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -57,7 +57,7 @@ reg_usb_otg2_vbus: regulator-usb-otg2-vbus {
 		regulator-name = "usb_otg2_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio4 7 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio4 7 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -66,7 +66,7 @@ reg_can2_3v3: regulator-can2-3v3 {
 		regulator-name = "can2-3v3";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio2 14 GPIO_ACTIVE_LOW>;
+		gpios = <&gpio2 14 GPIO_ACTIVE_LOW>;
 	};
 
 	reg_vref_1v8: regulator-vref-1v8 {
@@ -89,7 +89,7 @@ reg_wlan: regulator-wlan {
 		regulator-max-microvolt = <3300000>;
 		regulator-name = "reg_wlan";
 		startup-delay-us = <70000>;
-		gpio = <&gpio4 21 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio4 21 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/nxp/imx/imx7d-pico.dtsi b/arch/arm/boot/dts/nxp/imx/imx7d-pico.dtsi
index a1574ccec89c..ecc89c760477 100644
--- a/arch/arm/boot/dts/nxp/imx/imx7d-pico.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/imx7d-pico.dtsi
@@ -39,7 +39,7 @@ reg_lcd_3v3: regulator-lcd-3v3 {
 		regulator-name = "lcd-3v3";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio1 6 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 6 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -50,7 +50,7 @@ reg_wlreg_on: regulator-wlreg_on {
 		regulator-name = "wlreg_on";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio4 16 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio4 16 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -77,7 +77,7 @@ reg_usb_otg1_vbus: regulator-usb-otg1-vbus {
 		regulator-name = "usb_otg1_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio4 5 GPIO_ACTIVE_LOW>;
+		gpios = <&gpio4 5 GPIO_ACTIVE_LOW>;
 	};
 
 	reg_usb_otg2_vbus: regulator-usb-otg2-vbus {
diff --git a/arch/arm/boot/dts/nxp/imx/imx7d-remarkable2.dts b/arch/arm/boot/dts/nxp/imx/imx7d-remarkable2.dts
index eec526a96311..5a9f79e5a6d2 100644
--- a/arch/arm/boot/dts/nxp/imx/imx7d-remarkable2.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx7d-remarkable2.dts
@@ -52,7 +52,7 @@ reg_brcm: regulator-brcm {
 		regulator-max-microvolt = <3300000>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_brcm_reg>;
-		gpio = <&gpio6 13 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio6 13 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		startup-delay-us = <150>;
 	};
@@ -65,7 +65,7 @@ reg_digitizer: regulator-digitizer {
 		pinctrl-names = "default", "sleep";
 		pinctrl-0 = <&pinctrl_digitizer_reg>;
 		pinctrl-1 = <&pinctrl_digitizer_reg>;
-		gpio = <&gpio1 6 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 6 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		startup-delay-us = <100000>; /* 100 ms */
 	};
@@ -77,7 +77,7 @@ reg_touch: regulator-touch {
 		regulator-max-microvolt = <3300000>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_touch_reg>;
-		gpio = <&gpio1 11 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 11 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/nxp/imx/imx7d-sdb-reva.dts b/arch/arm/boot/dts/nxp/imx/imx7d-sdb-reva.dts
index 40156cd9195f..df2169be0df7 100644
--- a/arch/arm/boot/dts/nxp/imx/imx7d-sdb-reva.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx7d-sdb-reva.dts
@@ -12,7 +12,7 @@ / {
 
 	reg_usb_otg2_vbus: regulator-usb-otg2-vbus {
 		pinctrl-0 = <&pinctrl_usb_otg2_vbus_reg_reva>;
-		gpio = <&gpio4 7 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio4 7 GPIO_ACTIVE_HIGH>;
 	};
 };
 
diff --git a/arch/arm/boot/dts/nxp/imx/imx7d-sdb.dts b/arch/arm/boot/dts/nxp/imx/imx7d-sdb.dts
index f712537fca16..c60ef286fb63 100644
--- a/arch/arm/boot/dts/nxp/imx/imx7d-sdb.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx7d-sdb.dts
@@ -70,7 +70,7 @@ reg_sd1_vmmc: regulator-sd1-vmmc {
 		regulator-name = "VDD_SD1";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio5 2 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio5 2 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		startup-delay-us = <200000>;
 		off-on-delay-us = <20000>;
@@ -81,7 +81,7 @@ reg_usb_otg1_vbus: regulator-usb-otg1-vbus {
 		regulator-name = "usb_otg1_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio1 5 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 5 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -92,7 +92,7 @@ reg_usb_otg2_vbus: regulator-usb-otg2-vbus {
 		pinctrl-0 = <&pinctrl_usb_otg2_vbus_reg>;
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio1 7 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 7 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -105,7 +105,7 @@ reg_vref_1v8: regulator-vref-1v8 {
 
 	reg_brcm: regulator-brcm {
 		compatible = "regulator-fixed";
-		gpio = <&gpio4 21 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio4 21 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		regulator-name = "brcm_reg";
 		pinctrl-names = "default";
@@ -120,7 +120,7 @@ reg_lcd_3v3: regulator-lcd-3v3 {
 		regulator-name = "lcd-3v3";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&extended_io 7 GPIO_ACTIVE_LOW>;
+		gpios = <&extended_io 7 GPIO_ACTIVE_LOW>;
 	};
 
 	reg_can2_3v3: regulator-can2-3v3 {
@@ -130,7 +130,7 @@ reg_can2_3v3: regulator-can2-3v3 {
 		pinctrl-0 = <&pinctrl_flexcan2_reg>;
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio2 14 GPIO_ACTIVE_LOW>;
+		gpios = <&gpio2 14 GPIO_ACTIVE_LOW>;
 	};
 
 	reg_fec2_3v3: regulator-fec2-3v3 {
@@ -140,7 +140,7 @@ reg_fec2_3v3: regulator-fec2-3v3 {
 		pinctrl-0 = <&pinctrl_enet2_reg>;
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio1 4 GPIO_ACTIVE_LOW>;
+		gpios = <&gpio1 4 GPIO_ACTIVE_LOW>;
 	};
 
 	backlight: backlight {
diff --git a/arch/arm/boot/dts/nxp/imx/imx7d-smegw01.dts b/arch/arm/boot/dts/nxp/imx/imx7d-smegw01.dts
index 7ed27c7ad726..07f039fde96c 100644
--- a/arch/arm/boot/dts/nxp/imx/imx7d-smegw01.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx7d-smegw01.dts
@@ -38,7 +38,7 @@ reg_lte_on: regulator-lte-on {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 		regulator-name = "lte_on";
-		gpio = <&gpio7 12 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio7 12 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		regulator-always-on;
 	};
@@ -50,14 +50,14 @@ reg_lte_nreset: regulator-lte-nreset {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 		regulator-name = "LTE_nReset";
-		gpio = <&gpio6 21 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio6 21 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		regulator-always-on;
 	};
 
 	reg_wifi: regulator-wifi {
 		compatible = "regulator-fixed";
-		gpio = <&gpio2 30 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio2 30 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_wifi>;
@@ -73,7 +73,7 @@ reg_wlan_rfkill: regulator-wlan-rfkill {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 		regulator-name = "wlan_rfkill";
-		gpio = <&gpio2 11 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio2 11 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		regulator-always-on;
 	};
@@ -85,7 +85,7 @@ reg_usbotg_vbus: regulator-usbotg-vbus {
 		regulator-name = "usb_otg_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio1 05 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 05 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 };
diff --git a/arch/arm/boot/dts/nxp/imx/imx7d-zii-rpu2.dts b/arch/arm/boot/dts/nxp/imx/imx7d-zii-rpu2.dts
index decc19af3b83..7b27c0868a3e 100644
--- a/arch/arm/boot/dts/nxp/imx/imx7d-zii-rpu2.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx7d-zii-rpu2.dts
@@ -56,7 +56,7 @@ reg_can1_stby: regulator-can1-stby {
 		regulator-name = "can1-3v3";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio1 9 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 9 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -67,7 +67,7 @@ reg_can2_stby: regulator-can2-stby {
 		regulator-name = "can2-3v3";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio1 8 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 8 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/nxp/imx/imx7s-warp.dts b/arch/arm/boot/dts/nxp/imx/imx7s-warp.dts
index af4acc311572..b1e6f8e3e53e 100644
--- a/arch/arm/boot/dts/nxp/imx/imx7s-warp.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx7s-warp.dts
@@ -34,7 +34,7 @@ back {
 	reg_brcm: regulator-brcm {
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpio5 10 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio5 10 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_brcm_reg>;
 		regulator-name = "brcm_reg";
@@ -48,7 +48,7 @@ reg_bt: regulator-bt {
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_bt_reg>;
 		enable-active-high;
-		gpio = <&gpio5 17 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio5 17 GPIO_ACTIVE_HIGH>;
 		regulator-name = "bt_reg";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
diff --git a/arch/arm/boot/dts/nxp/imx/imx7ulp-evk.dts b/arch/arm/boot/dts/nxp/imx/imx7ulp-evk.dts
index eff51e113db4..d840646dcc94 100644
--- a/arch/arm/boot/dts/nxp/imx/imx7ulp-evk.dts
+++ b/arch/arm/boot/dts/nxp/imx/imx7ulp-evk.dts
@@ -37,7 +37,7 @@ reg_usb_otg1_vbus: regulator-usb-otg1-vbus {
 		regulator-name = "usb_otg1_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio_ptc 0 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio_ptc 0 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -48,7 +48,7 @@ reg_vsd_3v3: regulator-vsd-3v3 {
 		regulator-max-microvolt = <3300000>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_usdhc0_rst>;
-		gpio = <&gpio_ptd 0 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio_ptd 0 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 };
diff --git a/arch/arm/boot/dts/nxp/imx/mba6ulx.dtsi b/arch/arm/boot/dts/nxp/imx/mba6ulx.dtsi
index 941d9860218e..688ba8a0c18c 100644
--- a/arch/arm/boot/dts/nxp/imx/mba6ulx.dtsi
+++ b/arch/arm/boot/dts/nxp/imx/mba6ulx.dtsi
@@ -84,7 +84,7 @@ led2 {
 	reg_lcd_pwr: regulator-lcd-pwr {
 		compatible = "regulator-fixed";
 		regulator-name = "lcd-pwr";
-		gpio = <&expander_out0 1 GPIO_ACTIVE_HIGH>;
+		gpios = <&expander_out0 1 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		status = "disabled";
 	};
@@ -110,7 +110,7 @@ reg_mpcie: regulator-mpcie-3v3 {
 		regulator-name = "mpcie-3v3";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&expander_out0 2 GPIO_ACTIVE_HIGH>;
+		gpios = <&expander_out0 2 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		regulator-always-on;
 		startup-delay-us = <500000>;
@@ -119,7 +119,7 @@ reg_mpcie: regulator-mpcie-3v3 {
 
 	reg_otg2vbus_5v0: regulator-otg2-vbus-5v0 {
 		compatible = "regulator-fixed";
-		gpio = <&expander_out1 0 GPIO_ACTIVE_HIGH>;
+		gpios = <&expander_out1 0 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		regulator-name = "otg2-vbus-supply-5v0";
 		regulator-min-microvolt = <5000000>;
diff --git a/arch/arm/boot/dts/nxp/lpc/lpc3250-phy3250.dts b/arch/arm/boot/dts/nxp/lpc/lpc3250-phy3250.dts
index 21a6d0bca1e8..eb24a32ed66d 100644
--- a/arch/arm/boot/dts/nxp/lpc/lpc3250-phy3250.dts
+++ b/arch/arm/boot/dts/nxp/lpc/lpc3250-phy3250.dts
@@ -48,7 +48,7 @@ reg_backlight: regulator-backlight {
 		regulator-name = "backlight";
 		regulator-min-microvolt = <1800000>;
 		regulator-max-microvolt = <1800000>;
-		gpio = <&gpio 5 4 0>;
+		gpios = <&gpio 5 4 0>;
 		enable-active-high;
 		regulator-boot-on;
 	};
@@ -58,7 +58,7 @@ reg_lcd: regulator-lcd {
 		regulator-name = "lcd";
 		regulator-min-microvolt = <1800000>;
 		regulator-max-microvolt = <1800000>;
-		gpio = <&gpio 5 0 0>;
+		gpios = <&gpio 5 0 0>;
 		enable-active-high;
 		regulator-boot-on;
 	};
@@ -68,7 +68,7 @@ reg_sd: regulator-sd {
 		regulator-name = "sd";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio 5 5 0>;
+		gpios = <&gpio 5 5 0>;
 		enable-active-high;
 		regulator-boot-on;
 	};
diff --git a/arch/arm/boot/dts/nxp/mxs/imx23-evk.dts b/arch/arm/boot/dts/nxp/mxs/imx23-evk.dts
index 33b36af1656f..89a1dd093b05 100644
--- a/arch/arm/boot/dts/nxp/mxs/imx23-evk.dts
+++ b/arch/arm/boot/dts/nxp/mxs/imx23-evk.dts
@@ -19,7 +19,7 @@ reg_vddio_sd0: regulator-vddio-sd0 {
 		regulator-name = "vddio-sd0";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio1 29 0>;
+		gpios = <&gpio1 29 0>;
 	};
 
 	reg_lcd_3v3: regulator-lcd-3v3 {
@@ -27,7 +27,7 @@ reg_lcd_3v3: regulator-lcd-3v3 {
 		regulator-name = "lcd-3v3";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio1 18 0>;
+		gpios = <&gpio1 18 0>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/nxp/mxs/imx23-olinuxino.dts b/arch/arm/boot/dts/nxp/mxs/imx23-olinuxino.dts
index e372e9327a47..4be0a6b885f1 100644
--- a/arch/arm/boot/dts/nxp/mxs/imx23-olinuxino.dts
+++ b/arch/arm/boot/dts/nxp/mxs/imx23-olinuxino.dts
@@ -108,7 +108,7 @@ reg_usb0_vbus: regulator-0 {
 		regulator-max-microvolt = <5000000>;
 		enable-active-high;
 		startup-delay-us = <300>; /* LAN9215 requires a POR of 200us minimum */
-		gpio = <&gpio0 17 0>;
+		gpios = <&gpio0 17 0>;
 	};
 
 	leds {
diff --git a/arch/arm/boot/dts/nxp/mxs/imx23-sansa.dts b/arch/arm/boot/dts/nxp/mxs/imx23-sansa.dts
index cb661bf2d157..5d942da12505 100644
--- a/arch/arm/boot/dts/nxp/mxs/imx23-sansa.dts
+++ b/arch/arm/boot/dts/nxp/mxs/imx23-sansa.dts
@@ -135,7 +135,7 @@ reg_vddio_sd0: regulator-vddio-sd0 {
 		regulator-name = "vddio-sd0";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio0 8 0>;
+		gpios = <&gpio0 8 0>;
 	};
 
 	reg_vddio_sd1: regulator-vddio-sd1 {
@@ -143,7 +143,7 @@ reg_vddio_sd1: regulator-vddio-sd1 {
 		regulator-name = "vddio-sd1";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio1 29 0>;
+		gpios = <&gpio1 29 0>;
 	};
 
 	reg_vdd_touchpad: regulator-vdd-touchpad0 {
@@ -151,7 +151,7 @@ reg_vdd_touchpad: regulator-vdd-touchpad0 {
 		regulator-name = "vdd-touchpad0";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio0 26 GPIO_ACTIVE_LOW>;
+		gpios = <&gpio0 26 GPIO_ACTIVE_LOW>;
 		regulator-always-on;
 	};
 
@@ -160,7 +160,7 @@ reg_vdd_tuner: regulator-vdd-tuner0 {
 		regulator-name = "vdd-tuner0";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio0 29 GPIO_ACTIVE_LOW>;
+		gpios = <&gpio0 29 GPIO_ACTIVE_LOW>;
 		regulator-always-on;
 	};
 
diff --git a/arch/arm/boot/dts/nxp/mxs/imx23-stmp378x_devb.dts b/arch/arm/boot/dts/nxp/mxs/imx23-stmp378x_devb.dts
index b2b6f8514999..267dc86e95dd 100644
--- a/arch/arm/boot/dts/nxp/mxs/imx23-stmp378x_devb.dts
+++ b/arch/arm/boot/dts/nxp/mxs/imx23-stmp378x_devb.dts
@@ -64,6 +64,6 @@ reg_vddio_sd0: regulator-0 {
 		regulator-name = "vddio-sd0";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio1 29 0>;
+		gpios = <&gpio1 29 0>;
 	};
 };
diff --git a/arch/arm/boot/dts/nxp/mxs/imx23-xfi3.dts b/arch/arm/boot/dts/nxp/mxs/imx23-xfi3.dts
index 0b088c8ab6b6..198932cb75ff 100644
--- a/arch/arm/boot/dts/nxp/mxs/imx23-xfi3.dts
+++ b/arch/arm/boot/dts/nxp/mxs/imx23-xfi3.dts
@@ -148,7 +148,7 @@ reg_vddio_sd0: regulator-vddio-sd0 {
 		regulator-name = "vddio-sd0";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio0 7 0>;
+		gpios = <&gpio0 7 0>;
 	};
 
 	backlight {
diff --git a/arch/arm/boot/dts/nxp/mxs/imx28-apf28dev.dts b/arch/arm/boot/dts/nxp/mxs/imx28-apf28dev.dts
index 6c87266eb135..6c75e9a46df6 100644
--- a/arch/arm/boot/dts/nxp/mxs/imx28-apf28dev.dts
+++ b/arch/arm/boot/dts/nxp/mxs/imx28-apf28dev.dts
@@ -15,7 +15,7 @@ reg_usb0_vbus: regulator-0 {
 		regulator-name = "usb0_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio1 23 1>;
+		gpios = <&gpio1 23 1>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/nxp/mxs/imx28-cfa10036.dts b/arch/arm/boot/dts/nxp/mxs/imx28-cfa10036.dts
index d004b1cbb4ae..a5bb7c84ae79 100644
--- a/arch/arm/boot/dts/nxp/mxs/imx28-cfa10036.dts
+++ b/arch/arm/boot/dts/nxp/mxs/imx28-cfa10036.dts
@@ -34,7 +34,7 @@ reg_vddio_sd0: vddio-sd0 {
 		regulator-name = "vddio-sd0";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio3 28 0>;
+		gpios = <&gpio3 28 0>;
 	};
 };
 
diff --git a/arch/arm/boot/dts/nxp/mxs/imx28-cfa10037.dts b/arch/arm/boot/dts/nxp/mxs/imx28-cfa10037.dts
index fd177daa6385..0ecd2f8e586b 100644
--- a/arch/arm/boot/dts/nxp/mxs/imx28-cfa10037.dts
+++ b/arch/arm/boot/dts/nxp/mxs/imx28-cfa10037.dts
@@ -71,6 +71,6 @@ reg_usb1_vbus: regulator-0 {
 		regulator-name = "usb1_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio0 7 1>;
+		gpios = <&gpio0 7 1>;
 	};
 };
diff --git a/arch/arm/boot/dts/nxp/mxs/imx28-cfa10049.dts b/arch/arm/boot/dts/nxp/mxs/imx28-cfa10049.dts
index f0ce897b9d5c..99872b44fdd1 100644
--- a/arch/arm/boot/dts/nxp/mxs/imx28-cfa10049.dts
+++ b/arch/arm/boot/dts/nxp/mxs/imx28-cfa10049.dts
@@ -85,7 +85,7 @@ reg_usb1_vbus: regulator-0 {
 		regulator-name = "usb1_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio0 7 1>;
+		gpios = <&gpio0 7 1>;
 	};
 
 	spi-2 {
diff --git a/arch/arm/boot/dts/nxp/mxs/imx28-cfa10057.dts b/arch/arm/boot/dts/nxp/mxs/imx28-cfa10057.dts
index 5875c3d7ba97..a6f5e3680a91 100644
--- a/arch/arm/boot/dts/nxp/mxs/imx28-cfa10057.dts
+++ b/arch/arm/boot/dts/nxp/mxs/imx28-cfa10057.dts
@@ -21,7 +21,7 @@ reg_usb1_vbus: regulator-0 {
 		regulator-name = "usb1_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio0 7 1>;
+		gpios = <&gpio0 7 1>;
 	};
 
 	backlight {
diff --git a/arch/arm/boot/dts/nxp/mxs/imx28-cfa10058.dts b/arch/arm/boot/dts/nxp/mxs/imx28-cfa10058.dts
index b414e67ef379..86e9b345ac54 100644
--- a/arch/arm/boot/dts/nxp/mxs/imx28-cfa10058.dts
+++ b/arch/arm/boot/dts/nxp/mxs/imx28-cfa10058.dts
@@ -21,7 +21,7 @@ reg_usb1_vbus: regulator-0 {
 		regulator-name = "usb1_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio0 7 1>;
+		gpios = <&gpio0 7 1>;
 	};
 
 	backlight {
diff --git a/arch/arm/boot/dts/nxp/mxs/imx28-eukrea-mbmx28lc.dtsi b/arch/arm/boot/dts/nxp/mxs/imx28-eukrea-mbmx28lc.dtsi
index 652fc9e57a55..47829b8e7ed9 100644
--- a/arch/arm/boot/dts/nxp/mxs/imx28-eukrea-mbmx28lc.dtsi
+++ b/arch/arm/boot/dts/nxp/mxs/imx28-eukrea-mbmx28lc.dtsi
@@ -84,7 +84,7 @@ reg_lcd_3v3: regulator-1 {
 		regulator-name = "lcd-3v3";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio3 30 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 30 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -95,7 +95,7 @@ reg_usb0_vbus: regulator-2 {
 		regulator-name = "usb0_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio1 18 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 18 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -106,7 +106,7 @@ reg_usb1_vbus: regulator-3 {
 		regulator-name = "usb1_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio1 19 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 19 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/nxp/mxs/imx28-evk.dts b/arch/arm/boot/dts/nxp/mxs/imx28-evk.dts
index 330d3aff6b6c..0af6070bbd1f 100644
--- a/arch/arm/boot/dts/nxp/mxs/imx28-evk.dts
+++ b/arch/arm/boot/dts/nxp/mxs/imx28-evk.dts
@@ -28,7 +28,7 @@ reg_vddio_sd0: regulator-vddio-sd0 {
 		regulator-name = "vddio-sd0";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio3 28 0>;
+		gpios = <&gpio3 28 0>;
 	};
 
 	reg_fec_3v3: regulator-fec-3v3 {
@@ -36,7 +36,7 @@ reg_fec_3v3: regulator-fec-3v3 {
 		regulator-name = "fec-3v3";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio2 15 0>;
+		gpios = <&gpio2 15 0>;
 	};
 
 	reg_usb0_vbus: regulator-usb0-vbus {
@@ -44,7 +44,7 @@ reg_usb0_vbus: regulator-usb0-vbus {
 		regulator-name = "usb0_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio3 9 0>;
+		gpios = <&gpio3 9 0>;
 		enable-active-high;
 	};
 
@@ -53,7 +53,7 @@ reg_usb1_vbus: regulator-usb1-vbus {
 		regulator-name = "usb1_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio3 8 0>;
+		gpios = <&gpio3 8 0>;
 		enable-active-high;
 	};
 
@@ -62,7 +62,7 @@ reg_lcd_3v3: regulator-lcd-3v3 {
 		regulator-name = "lcd-3v3";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio3 30 0>;
+		gpios = <&gpio3 30 0>;
 		enable-active-high;
 	};
 
@@ -71,7 +71,7 @@ reg_can_3v3: regulator-can-3v3 {
 		regulator-name = "can-3v3";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio2 13 0>;
+		gpios = <&gpio2 13 0>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/nxp/mxs/imx28-m28cu3.dts b/arch/arm/boot/dts/nxp/mxs/imx28-m28cu3.dts
index 34b4d3246db1..83649529aeb2 100644
--- a/arch/arm/boot/dts/nxp/mxs/imx28-m28cu3.dts
+++ b/arch/arm/boot/dts/nxp/mxs/imx28-m28cu3.dts
@@ -53,7 +53,7 @@ reg_vddio_sd0: regulator-1 {
 		regulator-name = "vddio-sd0";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio3 29 0>;
+		gpios = <&gpio3 29 0>;
 	};
 
 	reg_vddio_sd1: regulator-2 {
@@ -61,7 +61,7 @@ reg_vddio_sd1: regulator-2 {
 		regulator-name = "vddio-sd1";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio2 19 0>;
+		gpios = <&gpio2 19 0>;
 	};
 
 	reg_usb1_vbus: regulator-3 {
@@ -69,7 +69,7 @@ reg_usb1_vbus: regulator-3 {
 		regulator-name = "usb1_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio3 8 0>;
+		gpios = <&gpio3 8 0>;
 		enable-active-high;
 	};
 };
diff --git a/arch/arm/boot/dts/nxp/mxs/imx28-m28evk.dts b/arch/arm/boot/dts/nxp/mxs/imx28-m28evk.dts
index 13070ca08cff..a7642d080d2b 100644
--- a/arch/arm/boot/dts/nxp/mxs/imx28-m28evk.dts
+++ b/arch/arm/boot/dts/nxp/mxs/imx28-m28evk.dts
@@ -23,7 +23,7 @@ reg_vddio_sd0: regulator-1 {
 		regulator-name = "vddio-sd0";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio3 28 0>;
+		gpios = <&gpio3 28 0>;
 	};
 
 	reg_usb0_vbus: regulator-2 {
@@ -31,7 +31,7 @@ reg_usb0_vbus: regulator-2 {
 		regulator-name = "usb0_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio3 12 0>;
+		gpios = <&gpio3 12 0>;
 	};
 
 	reg_usb1_vbus: regulator-3 {
@@ -39,7 +39,7 @@ reg_usb1_vbus: regulator-3 {
 		regulator-name = "usb1_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio3 13 0>;
+		gpios = <&gpio3 13 0>;
 	};
 
 	sound {
diff --git a/arch/arm/boot/dts/nxp/mxs/imx28-sps1.dts b/arch/arm/boot/dts/nxp/mxs/imx28-sps1.dts
index 0f01dded4e3d..009fbe0415c9 100644
--- a/arch/arm/boot/dts/nxp/mxs/imx28-sps1.dts
+++ b/arch/arm/boot/dts/nxp/mxs/imx28-sps1.dts
@@ -20,7 +20,7 @@ reg_usb0_vbus: regulator-0 {
 		regulator-name = "usb0_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio3 9 0>;
+		gpios = <&gpio3 9 0>;
 	};
 
 	leds {
diff --git a/arch/arm/boot/dts/nxp/mxs/imx28-ts4600.dts b/arch/arm/boot/dts/nxp/mxs/imx28-ts4600.dts
index ae6ed5c41be3..830f808398b7 100644
--- a/arch/arm/boot/dts/nxp/mxs/imx28-ts4600.dts
+++ b/arch/arm/boot/dts/nxp/mxs/imx28-ts4600.dts
@@ -24,7 +24,7 @@ reg_vddio_sd0: regulator-vddio-sd0 {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 		regulator-boot-on;
-		gpio = <&gpio3 28 GPIO_ACTIVE_LOW>;
+		gpios = <&gpio3 28 GPIO_ACTIVE_LOW>;
 	};
 
 };
diff --git a/arch/arm/boot/dts/nxp/mxs/imx28-tx28.dts b/arch/arm/boot/dts/nxp/mxs/imx28-tx28.dts
index 9290635352f1..f85289ca83af 100644
--- a/arch/arm/boot/dts/nxp/mxs/imx28-tx28.dts
+++ b/arch/arm/boot/dts/nxp/mxs/imx28-tx28.dts
@@ -45,7 +45,7 @@ reg_usb0_vbus: regulator-usb0-vbus {
 		regulator-name = "usb0_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio0 18 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio0 18 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -54,7 +54,7 @@ reg_usb1_vbus: regulator-usb1-vbus {
 		regulator-name = "usb1_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio3 27 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 27 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -79,7 +79,7 @@ reg_can_xcvr: regulator-can-xcvr {
 		regulator-name = "CAN XCVR";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio1 0 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 0 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&tx28_flexcan_xcvr_pins>;
 	};
@@ -89,7 +89,7 @@ reg_lcd: regulator-lcd-power {
 		regulator-name = "LCD POWER";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio1 31 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 31 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -98,7 +98,7 @@ reg_lcd_reset: regulator-lcd-reset {
 		regulator-name = "LCD RESET";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio3 30 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 30 GPIO_ACTIVE_HIGH>;
 		startup-delay-us = <300000>;
 		enable-active-high;
 		regulator-always-on;
diff --git a/arch/arm/boot/dts/nxp/mxs/imx28-xea.dts b/arch/arm/boot/dts/nxp/mxs/imx28-xea.dts
index 6c5e6856648a..6633c0998f0c 100644
--- a/arch/arm/boot/dts/nxp/mxs/imx28-xea.dts
+++ b/arch/arm/boot/dts/nxp/mxs/imx28-xea.dts
@@ -83,11 +83,11 @@ MX28_PAD_GPMI_D07__GPIO_0_7
 };
 
 &reg_fec_3v3 {
-	gpio = <&gpio0 0 0>;
+	gpios = <&gpio0 0 0>;
 };
 
 &reg_usb_5v {
-	gpio = <&gpio0 2 0>;
+	gpios = <&gpio0 2 0>;
 };
 
 &spi2_pins_a {
diff --git a/arch/arm/boot/dts/nxp/vf/vf-colibri-eval-v3.dtsi b/arch/arm/boot/dts/nxp/vf/vf-colibri-eval-v3.dtsi
index 5a19da9313ae..bb5be154be28 100644
--- a/arch/arm/boot/dts/nxp/vf/vf-colibri-eval-v3.dtsi
+++ b/arch/arm/boot/dts/nxp/vf/vf-colibri-eval-v3.dtsi
@@ -46,7 +46,7 @@ reg_usbh_vbus: regulator-usbh-vbus {
 		regulator-name = "VCC_USB[1-4]";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio2 19 GPIO_ACTIVE_LOW>; /* USBH_PEN resp. USBH_P_EN */
+		gpios = <&gpio2 19 GPIO_ACTIVE_LOW>; /* USBH_PEN resp. USBH_P_EN */
 		vin-supply = <&reg_5v0>;
 	};
 };
diff --git a/arch/arm/boot/dts/nxp/vf/vf610-zii-dev.dtsi b/arch/arm/boot/dts/nxp/vf/vf610-zii-dev.dtsi
index ce5e52896b19..acae7a5f5b4d 100644
--- a/arch/arm/boot/dts/nxp/vf/vf610-zii-dev.dtsi
+++ b/arch/arm/boot/dts/nxp/vf/vf610-zii-dev.dtsi
@@ -82,7 +82,7 @@ usb0_vbus: regulator-usb0-vbus {
 		enable-active-high;
 		regulator-always-on;
 		regulator-boot-on;
-		gpio = <&gpio0 6 0>;
+		gpios = <&gpio0 6 0>;
 	};
 
 	supply-voltage-monitor {
diff --git a/arch/arm/boot/dts/qcom/msm8226-motorola-falcon.dts b/arch/arm/boot/dts/qcom/msm8226-motorola-falcon.dts
index 5dbca83f2230..8e7b04c20779 100644
--- a/arch/arm/boot/dts/qcom/msm8226-motorola-falcon.dts
+++ b/arch/arm/boot/dts/qcom/msm8226-motorola-falcon.dts
@@ -56,7 +56,7 @@ key-volume-up {
 	vddio_disp_vreg: regulator-vddio-disp {
 		compatible = "regulator-fixed";
 		regulator-name = "vddio_disp";
-		gpio = <&tlmm 34 GPIO_ACTIVE_HIGH>;
+		gpios = <&tlmm 34 GPIO_ACTIVE_HIGH>;
 		vin-supply = <&pm8226_l8>;
 		startup-delay-us = <300>;
 		enable-active-high;
diff --git a/arch/arm/boot/dts/qcom/qcom-apq8026-asus-sparrow.dts b/arch/arm/boot/dts/qcom/qcom-apq8026-asus-sparrow.dts
index a2ca456012f1..8740562ec416 100644
--- a/arch/arm/boot/dts/qcom/qcom-apq8026-asus-sparrow.dts
+++ b/arch/arm/boot/dts/qcom/qcom-apq8026-asus-sparrow.dts
@@ -51,7 +51,7 @@ vreg_wlan: wlan-regulator {
 		regulator-min-microvolt = <2950000>;
 		regulator-max-microvolt = <2950000>;
 
-		gpio = <&tlmm 35 GPIO_ACTIVE_HIGH>;
+		gpios = <&tlmm 35 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 
 		pinctrl-names = "default";
diff --git a/arch/arm/boot/dts/qcom/qcom-apq8026-huawei-sturgeon.dts b/arch/arm/boot/dts/qcom/qcom-apq8026-huawei-sturgeon.dts
index ac228965a485..cb3f148a4491 100644
--- a/arch/arm/boot/dts/qcom/qcom-apq8026-huawei-sturgeon.dts
+++ b/arch/arm/boot/dts/qcom/qcom-apq8026-huawei-sturgeon.dts
@@ -57,7 +57,7 @@ vreg_wlan: wlan-regulator {
 		regulator-min-microvolt = <2950000>;
 		regulator-max-microvolt = <2950000>;
 
-		gpio = <&tlmm 110 GPIO_ACTIVE_HIGH>;
+		gpios = <&tlmm 110 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 
 		pinctrl-names = "default";
diff --git a/arch/arm/boot/dts/qcom/qcom-apq8026-lg-lenok.dts b/arch/arm/boot/dts/qcom/qcom-apq8026-lg-lenok.dts
index a70de21bf139..66758d076954 100644
--- a/arch/arm/boot/dts/qcom/qcom-apq8026-lg-lenok.dts
+++ b/arch/arm/boot/dts/qcom/qcom-apq8026-lg-lenok.dts
@@ -51,7 +51,7 @@ vreg_wlan: wlan-regulator {
 		regulator-min-microvolt = <2950000>;
 		regulator-max-microvolt = <2950000>;
 
-		gpio = <&tlmm 46 GPIO_ACTIVE_HIGH>;
+		gpios = <&tlmm 46 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 
 		pinctrl-names = "default";
diff --git a/arch/arm/boot/dts/qcom/qcom-apq8026-samsung-matisse-wifi.dts b/arch/arm/boot/dts/qcom/qcom-apq8026-samsung-matisse-wifi.dts
index da3be658e822..0ef99c0ad78d 100644
--- a/arch/arm/boot/dts/qcom/qcom-apq8026-samsung-matisse-wifi.dts
+++ b/arch/arm/boot/dts/qcom/qcom-apq8026-samsung-matisse-wifi.dts
@@ -18,7 +18,7 @@ reg_tsp_3p3v: regulator-tsp-3p3v {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 
-		gpio = <&tlmm 73 GPIO_ACTIVE_HIGH>;
+		gpios = <&tlmm 73 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 
 		pinctrl-names = "default";
diff --git a/arch/arm/boot/dts/qcom/qcom-apq8026-samsung-milletwifi.dts b/arch/arm/boot/dts/qcom/qcom-apq8026-samsung-milletwifi.dts
index 7d519156d91d..5c5d4adf0d92 100644
--- a/arch/arm/boot/dts/qcom/qcom-apq8026-samsung-milletwifi.dts
+++ b/arch/arm/boot/dts/qcom/qcom-apq8026-samsung-milletwifi.dts
@@ -140,7 +140,7 @@ reg_backlight_vddio: regulator-backlight-vddio {
 		regulator-min-microvolt = <1800000>;
 		regulator-max-microvolt = <1800000>;
 
-		gpio = <&tlmm 74 GPIO_ACTIVE_HIGH>;
+		gpios = <&tlmm 74 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 
 		pinctrl-0 = <&backlight_vddio_default_state>;
@@ -153,7 +153,7 @@ reg_tsp_1p8v: regulator-tsp-1p8v {
 		regulator-min-microvolt = <1800000>;
 		regulator-max-microvolt = <1800000>;
 
-		gpio = <&tlmm 114 GPIO_ACTIVE_HIGH>;
+		gpios = <&tlmm 114 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 
 		pinctrl-0 = <&tsp_en1_default_state>;
@@ -166,7 +166,7 @@ reg_tsp_3p3v: regulator-tsp-3p3v {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 
-		gpio = <&tlmm 31 GPIO_ACTIVE_HIGH>;
+		gpios = <&tlmm 31 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 
 		pinctrl-0 = <&tsp_en_default_state>;
diff --git a/arch/arm/boot/dts/qcom/qcom-apq8060-dragonboard.dts b/arch/arm/boot/dts/qcom/qcom-apq8060-dragonboard.dts
index 009afd8212c2..5b1e9672c1a8 100644
--- a/arch/arm/boot/dts/qcom/qcom-apq8060-dragonboard.dts
+++ b/arch/arm/boot/dts/qcom/qcom-apq8060-dragonboard.dts
@@ -36,7 +36,7 @@ dragon_veth: xc622a331mrg {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 		vin-supply = <&vph>;
-		gpio = <&pm8058_gpio 40 GPIO_ACTIVE_HIGH>;
+		gpios = <&pm8058_gpio 40 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		pinctrl-names = "default";
 		pinctrl-0 = <&dragon_veth_gpios>;
diff --git a/arch/arm/boot/dts/qcom/qcom-apq8064-asus-nexus7-flo.dts b/arch/arm/boot/dts/qcom/qcom-apq8064-asus-nexus7-flo.dts
index 947183992850..29b78ac6d22a 100644
--- a/arch/arm/boot/dts/qcom/qcom-apq8064-asus-nexus7-flo.dts
+++ b/arch/arm/boot/dts/qcom/qcom-apq8064-asus-nexus7-flo.dts
@@ -41,7 +41,7 @@ ext_3p3v: regulator-ext-3p3v {
 		regulator-max-microvolt = <3300000>;
 		regulator-name = "ext_3p3v";
 		startup-delay-us = <0>;
-		gpio = <&tlmm_pinmux 77 GPIO_ACTIVE_HIGH>;
+		gpios = <&tlmm_pinmux 77 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		regulator-boot-on;
 	};
diff --git a/arch/arm/boot/dts/qcom/qcom-apq8064-ifc6410.dts b/arch/arm/boot/dts/qcom/qcom-apq8064-ifc6410.dts
index b3ff8010b149..b033bc3e9f9e 100644
--- a/arch/arm/boot/dts/qcom/qcom-apq8064-ifc6410.dts
+++ b/arch/arm/boot/dts/qcom/qcom-apq8064-ifc6410.dts
@@ -62,7 +62,7 @@ ext_3p3v: regulator-ext-3p3v {
 		regulator-max-microvolt = <3300000>;
 		regulator-name = "ext_3p3v";
 		startup-delay-us = <0>;
-		gpio = <&tlmm_pinmux 77 GPIO_ACTIVE_HIGH>;
+		gpios = <&tlmm_pinmux 77 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		regulator-boot-on;
 	};
diff --git a/arch/arm/boot/dts/qcom/qcom-apq8074-dragonboard.dts b/arch/arm/boot/dts/qcom/qcom-apq8074-dragonboard.dts
index 6fce0112361f..69dabd59c865 100644
--- a/arch/arm/boot/dts/qcom/qcom-apq8074-dragonboard.dts
+++ b/arch/arm/boot/dts/qcom/qcom-apq8074-dragonboard.dts
@@ -60,7 +60,7 @@ vreg_boost: vreg-boost {
 		regulator-always-on;
 		regulator-boot-on;
 
-		gpio = <&pm8941_gpios 21 GPIO_ACTIVE_HIGH>;
+		gpios = <&pm8941_gpios 21 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 
 		pinctrl-names = "default";
diff --git a/arch/arm/boot/dts/qcom/qcom-msm8226-samsung-matisse-common.dtsi b/arch/arm/boot/dts/qcom/qcom-msm8226-samsung-matisse-common.dtsi
index a15a44fc0181..1d13e6dbdc2d 100644
--- a/arch/arm/boot/dts/qcom/qcom-msm8226-samsung-matisse-common.dtsi
+++ b/arch/arm/boot/dts/qcom/qcom-msm8226-samsung-matisse-common.dtsi
@@ -128,7 +128,7 @@ reg_tsp_1p8v: regulator-tsp-1p8v {
 		regulator-min-microvolt = <1800000>;
 		regulator-max-microvolt = <1800000>;
 
-		gpio = <&tlmm 31 GPIO_ACTIVE_HIGH>;
+		gpios = <&tlmm 31 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 
 		pinctrl-names = "default";
diff --git a/arch/arm/boot/dts/qcom/qcom-msm8226-samsung-ms013g.dts b/arch/arm/boot/dts/qcom/qcom-msm8226-samsung-ms013g.dts
index 2ecc5983d365..57cf7f0073c4 100644
--- a/arch/arm/boot/dts/qcom/qcom-msm8226-samsung-ms013g.dts
+++ b/arch/arm/boot/dts/qcom/qcom-msm8226-samsung-ms013g.dts
@@ -72,7 +72,7 @@ reg_motor_vdd: regulator-motor-vdd {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 
-		gpio = <&tlmm 111 GPIO_ACTIVE_HIGH>;
+		gpios = <&tlmm 111 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 
 		pinctrl-0 = <&motor_en_default>;
@@ -85,7 +85,7 @@ reg_vdd_tsp_a: regulator-vdd-tsp-a {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 
-		gpio = <&tlmm 31 GPIO_ACTIVE_HIGH>;
+		gpios = <&tlmm 31 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 
 		pinctrl-0 = <&tsp_en_default>;
diff --git a/arch/arm/boot/dts/qcom/qcom-msm8926-motorola-peregrine.dts b/arch/arm/boot/dts/qcom/qcom-msm8926-motorola-peregrine.dts
index 376a33125941..4ed71c58c2f4 100644
--- a/arch/arm/boot/dts/qcom/qcom-msm8926-motorola-peregrine.dts
+++ b/arch/arm/boot/dts/qcom/qcom-msm8926-motorola-peregrine.dts
@@ -58,7 +58,7 @@ key-volume-up {
 	vddio_disp_vreg: regulator-vddio-disp {
 		compatible = "regulator-fixed";
 		regulator-name = "vddio_disp";
-		gpio = <&tlmm 34 GPIO_ACTIVE_HIGH>;
+		gpios = <&tlmm 34 GPIO_ACTIVE_HIGH>;
 		startup-delay-us = <300>;
 		enable-active-high;
 		regulator-boot-on;
diff --git a/arch/arm/boot/dts/qcom/qcom-msm8926-samsung-matisselte.dts b/arch/arm/boot/dts/qcom/qcom-msm8926-samsung-matisselte.dts
index d0e1bc39f8ef..2f0f11b1bd45 100644
--- a/arch/arm/boot/dts/qcom/qcom-msm8926-samsung-matisselte.dts
+++ b/arch/arm/boot/dts/qcom/qcom-msm8926-samsung-matisselte.dts
@@ -19,7 +19,7 @@ reg_tsp_3p3v: regulator-tsp-3p3v {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 
-		gpio = <&tlmm 32 GPIO_ACTIVE_HIGH>;
+		gpios = <&tlmm 32 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 
 		pinctrl-names = "default";
diff --git a/arch/arm/boot/dts/qcom/qcom-msm8960-cdp.dts b/arch/arm/boot/dts/qcom/qcom-msm8960-cdp.dts
index 36f4c997b0b3..c0f6841779de 100644
--- a/arch/arm/boot/dts/qcom/qcom-msm8960-cdp.dts
+++ b/arch/arm/boot/dts/qcom/qcom-msm8960-cdp.dts
@@ -19,7 +19,7 @@ chosen {
 	ext_l2: gpio-regulator {
 		compatible = "regulator-fixed";
 		regulator-name = "ext_l2";
-		gpio = <&msmgpio 91 0>;
+		gpios = <&msmgpio 91 0>;
 		startup-delay-us = <10000>;
 		enable-active-high;
 	};
diff --git a/arch/arm/boot/dts/qcom/qcom-msm8974-lge-nexus5-hammerhead.dts b/arch/arm/boot/dts/qcom/qcom-msm8974-lge-nexus5-hammerhead.dts
index fdb6e22986cf..60521c4f5d02 100644
--- a/arch/arm/boot/dts/qcom/qcom-msm8974-lge-nexus5-hammerhead.dts
+++ b/arch/arm/boot/dts/qcom/qcom-msm8974-lge-nexus5-hammerhead.dts
@@ -70,7 +70,7 @@ vreg_boost: vreg-boost {
 		regulator-always-on;
 		regulator-boot-on;
 
-		gpio = <&pm8941_gpios 21 GPIO_ACTIVE_HIGH>;
+		gpios = <&pm8941_gpios 21 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 
 		pinctrl-names = "default";
@@ -94,7 +94,7 @@ vreg_wlan: wlan-regulator {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 
-		gpio = <&tlmm 26 GPIO_ACTIVE_HIGH>;
+		gpios = <&tlmm 26 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 
 		pinctrl-names = "default";
diff --git a/arch/arm/boot/dts/qcom/qcom-msm8974-samsung-hlte.dts b/arch/arm/boot/dts/qcom/qcom-msm8974-samsung-hlte.dts
index 903bb4d12513..d0194bd60cc1 100644
--- a/arch/arm/boot/dts/qcom/qcom-msm8974-samsung-hlte.dts
+++ b/arch/arm/boot/dts/qcom/qcom-msm8974-samsung-hlte.dts
@@ -54,7 +54,7 @@ touch_ldo: regulator-touch {
 		compatible = "regulator-fixed";
 		regulator-name = "touch-ldo";
 
-		gpio = <&pm8941_gpios 9 GPIO_ACTIVE_HIGH>;
+		gpios = <&pm8941_gpios 9 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		regulator-boot-on;
 
diff --git a/arch/arm/boot/dts/qcom/qcom-msm8974-sony-xperia-rhine.dtsi b/arch/arm/boot/dts/qcom/qcom-msm8974-sony-xperia-rhine.dtsi
index d34659ebac22..320c7ad238c5 100644
--- a/arch/arm/boot/dts/qcom/qcom-msm8974-sony-xperia-rhine.dtsi
+++ b/arch/arm/boot/dts/qcom/qcom-msm8974-sony-xperia-rhine.dtsi
@@ -76,7 +76,7 @@ vreg_boost: vreg-boost {
 		regulator-always-on;
 		regulator-boot-on;
 
-		gpio = <&pm8941_gpios 21 GPIO_ACTIVE_HIGH>;
+		gpios = <&pm8941_gpios 21 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 
 		pinctrl-names = "default";
diff --git a/arch/arm/boot/dts/qcom/qcom-msm8974pro-fairphone-fp2.dts b/arch/arm/boot/dts/qcom/qcom-msm8974pro-fairphone-fp2.dts
index fe227fd3f908..c84fb224b874 100644
--- a/arch/arm/boot/dts/qcom/qcom-msm8974pro-fairphone-fp2.dts
+++ b/arch/arm/boot/dts/qcom/qcom-msm8974pro-fairphone-fp2.dts
@@ -68,7 +68,7 @@ vreg_boost: vreg-boost {
 		regulator-always-on;
 		regulator-boot-on;
 
-		gpio = <&pm8941_gpios 21 GPIO_ACTIVE_HIGH>;
+		gpios = <&pm8941_gpios 21 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 
 		pinctrl-names = "default";
diff --git a/arch/arm/boot/dts/qcom/qcom-msm8974pro-htc-m8.dts b/arch/arm/boot/dts/qcom/qcom-msm8974pro-htc-m8.dts
index b896cc1ad6f7..876b31fe8101 100644
--- a/arch/arm/boot/dts/qcom/qcom-msm8974pro-htc-m8.dts
+++ b/arch/arm/boot/dts/qcom/qcom-msm8974pro-htc-m8.dts
@@ -46,7 +46,7 @@ vreg_boost: vreg-boost {
 		regulator-always-on;
 		regulator-boot-on;
 
-		gpio = <&pm8941_gpios 21 GPIO_ACTIVE_HIGH>;
+		gpios = <&pm8941_gpios 21 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 
 		pinctrl-0 = <&boost_bypass_n_pin>;
diff --git a/arch/arm/boot/dts/qcom/qcom-msm8974pro-oneplus-bacon.dts b/arch/arm/boot/dts/qcom/qcom-msm8974pro-oneplus-bacon.dts
index 4c8edadea0ac..29107a8eecd9 100644
--- a/arch/arm/boot/dts/qcom/qcom-msm8974pro-oneplus-bacon.dts
+++ b/arch/arm/boot/dts/qcom/qcom-msm8974pro-oneplus-bacon.dts
@@ -62,7 +62,7 @@ vreg_boost: vreg-boost {
 		regulator-always-on;
 		regulator-boot-on;
 
-		gpio = <&pm8941_gpios 21 GPIO_ACTIVE_HIGH>;
+		gpios = <&pm8941_gpios 21 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 
 		pinctrl-names = "default";
diff --git a/arch/arm/boot/dts/qcom/qcom-msm8974pro-samsung-klte-common.dtsi b/arch/arm/boot/dts/qcom/qcom-msm8974pro-samsung-klte-common.dtsi
index d3959741d2ea..8f3d8dc8a92a 100644
--- a/arch/arm/boot/dts/qcom/qcom-msm8974pro-samsung-klte-common.dtsi
+++ b/arch/arm/boot/dts/qcom/qcom-msm8974pro-samsung-klte-common.dtsi
@@ -133,7 +133,7 @@ vreg_wlan: wlan-regulator {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 
-		gpio = <&gpio_expander 8 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio_expander 8 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -147,7 +147,7 @@ vreg_panel: panel-regulator {
 		regulator-min-microvolt = <1500000>;
 		regulator-max-microvolt = <1500000>;
 
-		gpio = <&pma8084_gpios 14 GPIO_ACTIVE_HIGH>;
+		gpios = <&pma8084_gpios 14 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/qcom/qcom-msm8974pro-sony-xperia-shinano-castor.dts b/arch/arm/boot/dts/qcom/qcom-msm8974pro-sony-xperia-shinano-castor.dts
index 409d1798de34..fc77b9f3d5fa 100644
--- a/arch/arm/boot/dts/qcom/qcom-msm8974pro-sony-xperia-shinano-castor.dts
+++ b/arch/arm/boot/dts/qcom/qcom-msm8974pro-sony-xperia-shinano-castor.dts
@@ -12,7 +12,7 @@ vreg_bl_vddio: lcd-backlight-vddio {
 		regulator-min-microvolt = <3150000>;
 		regulator-max-microvolt = <3150000>;
 
-		gpio = <&tlmm 69 0>;
+		gpios = <&tlmm 69 0>;
 		enable-active-high;
 
 		vin-supply = <&pm8941_s3>;
diff --git a/arch/arm/boot/dts/qcom/qcom-msm8974pro-sony-xperia-shinano-common.dtsi b/arch/arm/boot/dts/qcom/qcom-msm8974pro-sony-xperia-shinano-common.dtsi
index 6af7c71c7158..5205314a45be 100644
--- a/arch/arm/boot/dts/qcom/qcom-msm8974pro-sony-xperia-shinano-common.dtsi
+++ b/arch/arm/boot/dts/qcom/qcom-msm8974pro-sony-xperia-shinano-common.dtsi
@@ -45,7 +45,7 @@ vreg_vsp: lcd-dcdc-regulator {
 		regulator-min-microvolt = <5600000>;
 		regulator-max-microvolt = <5600000>;
 
-		gpio = <&pm8941_gpios 20 GPIO_ACTIVE_HIGH>;
+		gpios = <&pm8941_gpios 20 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 
 		pinctrl-0 = <&lcd_dcdc_en_pin_a>;
@@ -62,7 +62,7 @@ vreg_boost: vreg-boost {
 		regulator-always-on;
 		regulator-boot-on;
 
-		gpio = <&pm8941_gpios 21 GPIO_ACTIVE_HIGH>;
+		gpios = <&pm8941_gpios 21 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 
 		pinctrl-names = "default";
@@ -86,7 +86,7 @@ vreg_wlan: wlan-regulator {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 
-		gpio = <&pm8941_gpios 18 GPIO_ACTIVE_HIGH>;
+		gpios = <&pm8941_gpios 18 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 
 		pinctrl-0 = <&wlan_regulator_pin>;
diff --git a/arch/arm/boot/dts/renesas/iwg20d-q7-common.dtsi b/arch/arm/boot/dts/renesas/iwg20d-q7-common.dtsi
index 4351c5a02fa5..a5f7e0973c88 100644
--- a/arch/arm/boot/dts/renesas/iwg20d-q7-common.dtsi
+++ b/arch/arm/boot/dts/renesas/iwg20d-q7-common.dtsi
@@ -122,7 +122,7 @@ vcc_3v3_tft1: regulator-panel {
 		regulator-max-microvolt = <3300000>;
 		enable-active-high;
 		startup-delay-us = <500>;
-		gpio = <&gpio7 25 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio7 25 GPIO_ACTIVE_HIGH>;
 	};
 
 	vcc_sdhi1: regulator-vcc-sdhi1 {
@@ -132,7 +132,7 @@ vcc_sdhi1: regulator-vcc-sdhi1 {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 
-		gpio = <&gpio1 16 GPIO_ACTIVE_LOW>;
+		gpios = <&gpio1 16 GPIO_ACTIVE_LOW>;
 	};
 
 	vccq_sdhi1: regulator-vccq-sdhi1 {
diff --git a/arch/arm/boot/dts/renesas/r8a73a4-ape6evm.dts b/arch/arm/boot/dts/renesas/r8a73a4-ape6evm.dts
index 3d02f065f71c..3f3d905bc5ba 100644
--- a/arch/arm/boot/dts/renesas/r8a73a4-ape6evm.dts
+++ b/arch/arm/boot/dts/renesas/r8a73a4-ape6evm.dts
@@ -48,7 +48,7 @@ vcc_sdhi0: regulator-sdhi0 {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 
-		gpio = <&pfc 76 GPIO_ACTIVE_HIGH>;
+		gpios = <&pfc 76 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/renesas/r8a7740-armadillo800eva.dts b/arch/arm/boot/dts/renesas/r8a7740-armadillo800eva.dts
index e1ac2c161e73..8c2329ad35da 100644
--- a/arch/arm/boot/dts/renesas/r8a7740-armadillo800eva.dts
+++ b/arch/arm/boot/dts/renesas/r8a7740-armadillo800eva.dts
@@ -46,7 +46,7 @@ vcc_sdhi0: regulator-vcc-sdhi0 {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 
-		gpio = <&pfc 75 GPIO_ACTIVE_HIGH>;
+		gpios = <&pfc 75 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/renesas/r8a7742-iwg21d-q7.dts b/arch/arm/boot/dts/renesas/r8a7742-iwg21d-q7.dts
index 64102b664055..c8760d6169c9 100644
--- a/arch/arm/boot/dts/renesas/r8a7742-iwg21d-q7.dts
+++ b/arch/arm/boot/dts/renesas/r8a7742-iwg21d-q7.dts
@@ -139,7 +139,7 @@ vcc_3v3_tft1: regulator-panel {
 		regulator-max-microvolt = <3300000>;
 		enable-active-high;
 		startup-delay-us = <500>;
-		gpio = <&gpio5 28 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio5 28 GPIO_ACTIVE_HIGH>;
 	};
 
 	vcc_sdhi2: regulator-vcc-sdhi2 {
@@ -149,7 +149,7 @@ vcc_sdhi2: regulator-vcc-sdhi2 {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 
-		gpio = <&gpio1 27 GPIO_ACTIVE_LOW>;
+		gpios = <&gpio1 27 GPIO_ACTIVE_LOW>;
 	};
 
 	vccq_sdhi2: regulator-vccq-sdhi2 {
diff --git a/arch/arm/boot/dts/renesas/r8a7745-iwg22d-sodimm.dts b/arch/arm/boot/dts/renesas/r8a7745-iwg22d-sodimm.dts
index 24411044ef6c..cf67b0b0ac17 100644
--- a/arch/arm/boot/dts/renesas/r8a7745-iwg22d-sodimm.dts
+++ b/arch/arm/boot/dts/renesas/r8a7745-iwg22d-sodimm.dts
@@ -77,7 +77,7 @@ vccq_panel: regulator-vccq-panel {
 		regulator-name = "Panel VccQ";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio1 13 GPIO_ACTIVE_LOW>;
+		gpios = <&gpio1 13 GPIO_ACTIVE_LOW>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/renesas/r8a7790-lager.dts b/arch/arm/boot/dts/renesas/r8a7790-lager.dts
index 8590981245a6..7a15bc686432 100644
--- a/arch/arm/boot/dts/renesas/r8a7790-lager.dts
+++ b/arch/arm/boot/dts/renesas/r8a7790-lager.dts
@@ -147,7 +147,7 @@ vcc_sdhi0: regulator-vcc-sdhi0 {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 
-		gpio = <&gpio5 24 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio5 24 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -170,7 +170,7 @@ vcc_sdhi2: regulator-vcc-sdhi2 {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 
-		gpio = <&gpio5 25 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio5 25 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/renesas/r8a7790-stout.dts b/arch/arm/boot/dts/renesas/r8a7790-stout.dts
index 683f7395fab0..f21477e3fb28 100644
--- a/arch/arm/boot/dts/renesas/r8a7790-stout.dts
+++ b/arch/arm/boot/dts/renesas/r8a7790-stout.dts
@@ -69,7 +69,7 @@ vcc_sdhi0: regulator-vcc-sdhi0 {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 
-		gpio = <&gpio5 24 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio5 24 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/renesas/r8a7791-koelsch.dts b/arch/arm/boot/dts/renesas/r8a7791-koelsch.dts
index 0efd9f98c75a..7dca5c5b3636 100644
--- a/arch/arm/boot/dts/renesas/r8a7791-koelsch.dts
+++ b/arch/arm/boot/dts/renesas/r8a7791-koelsch.dts
@@ -199,7 +199,7 @@ vcc_sdhi0: regulator-vcc-sdhi0 {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 
-		gpio = <&gpio7 17 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio7 17 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -222,7 +222,7 @@ vcc_sdhi1: regulator-vcc-sdhi1 {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 
-		gpio = <&gpio7 18 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio7 18 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -245,7 +245,7 @@ vcc_sdhi2: regulator-vcc-sdhi2 {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 
-		gpio = <&gpio7 19 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio7 19 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/renesas/r8a7792-blanche.dts b/arch/arm/boot/dts/renesas/r8a7792-blanche.dts
index 540a9ad28f28..70f81a57c04f 100644
--- a/arch/arm/boot/dts/renesas/r8a7792-blanche.dts
+++ b/arch/arm/boot/dts/renesas/r8a7792-blanche.dts
@@ -177,7 +177,7 @@ vcc_sdhi0: regulator-vcc-sdhi0 {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 
-		gpio = <&gpio11 12 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio11 12 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 };
diff --git a/arch/arm/boot/dts/renesas/r8a7792-wheat.dts b/arch/arm/boot/dts/renesas/r8a7792-wheat.dts
index 000f21a2a863..4854e4d78bba 100644
--- a/arch/arm/boot/dts/renesas/r8a7792-wheat.dts
+++ b/arch/arm/boot/dts/renesas/r8a7792-wheat.dts
@@ -73,7 +73,7 @@ vcc_sdhi0: regulator-vcc-sdhi0 {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 
-		gpio = <&gpio11 12 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio11 12 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/renesas/r8a7793-gose.dts b/arch/arm/boot/dts/renesas/r8a7793-gose.dts
index 1ea6c757893b..f3f7890fab28 100644
--- a/arch/arm/boot/dts/renesas/r8a7793-gose.dts
+++ b/arch/arm/boot/dts/renesas/r8a7793-gose.dts
@@ -190,7 +190,7 @@ vcc_sdhi0: regulator-vcc-sdhi0 {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 
-		gpio = <&gpio7 17 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio7 17 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -213,7 +213,7 @@ vcc_sdhi1: regulator-vcc-sdhi1 {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 
-		gpio = <&gpio7 18 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio7 18 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -236,7 +236,7 @@ vcc_sdhi2: regulator-vcc-sdhi2 {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 
-		gpio = <&gpio7 19 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio7 19 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/renesas/r8a7794-alt.dts b/arch/arm/boot/dts/renesas/r8a7794-alt.dts
index b5ecafbb2e4d..c31228074098 100644
--- a/arch/arm/boot/dts/renesas/r8a7794-alt.dts
+++ b/arch/arm/boot/dts/renesas/r8a7794-alt.dts
@@ -51,7 +51,7 @@ vcc_sdhi0: regulator-vcc-sdhi0 {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 
-		gpio = <&gpio2 26 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio2 26 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -74,7 +74,7 @@ vcc_sdhi1: regulator-vcc-sdhi1 {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 
-		gpio = <&gpio4 26 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio4 26 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/renesas/r8a7794-silk.dts b/arch/arm/boot/dts/renesas/r8a7794-silk.dts
index 595e074085eb..4aae7e95ab45 100644
--- a/arch/arm/boot/dts/renesas/r8a7794-silk.dts
+++ b/arch/arm/boot/dts/renesas/r8a7794-silk.dts
@@ -127,7 +127,7 @@ vcc_sdhi1: regulator-vcc-sdhi1 {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 
-		gpio = <&gpio4 26 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio4 26 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/renesas/sh73a0-kzm9g.dts b/arch/arm/boot/dts/renesas/sh73a0-kzm9g.dts
index 98897f710063..efb1794e3fe5 100644
--- a/arch/arm/boot/dts/renesas/sh73a0-kzm9g.dts
+++ b/arch/arm/boot/dts/renesas/sh73a0-kzm9g.dts
@@ -65,7 +65,7 @@ vmmc_sdhi0: regulator-vmmc-sdhi0 {
 		regulator-name = "SDHI0 Vcc";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&pfc 15 GPIO_ACTIVE_HIGH>;
+		gpios = <&pfc 15 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -74,7 +74,7 @@ vmmc_sdhi2: regulator-vmmc-sdhi2 {
 		regulator-name = "SDHI2 Vcc";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&pfc 14 GPIO_ACTIVE_HIGH>;
+		gpios = <&pfc 14 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/rockchip/rk3066a-bqcurie2.dts b/arch/arm/boot/dts/rockchip/rk3066a-bqcurie2.dts
index f924d4d64c3d..030558bdd33a 100644
--- a/arch/arm/boot/dts/rockchip/rk3066a-bqcurie2.dts
+++ b/arch/arm/boot/dts/rockchip/rk3066a-bqcurie2.dts
@@ -39,7 +39,7 @@ vcc_sd0: fixed-regulator {
 		regulator-name = "sdmmc-supply";
 		regulator-min-microvolt = <3000000>;
 		regulator-max-microvolt = <3000000>;
-		gpio = <&gpio3 RK_PA7 GPIO_ACTIVE_LOW>;
+		gpios = <&gpio3 RK_PA7 GPIO_ACTIVE_LOW>;
 		startup-delay-us = <100000>;
 		vin-supply = <&vcc_io>;
 	};
diff --git a/arch/arm/boot/dts/rockchip/rk3066a-marsboard.dts b/arch/arm/boot/dts/rockchip/rk3066a-marsboard.dts
index f6e8d49a02ef..b3a78cd56a54 100644
--- a/arch/arm/boot/dts/rockchip/rk3066a-marsboard.dts
+++ b/arch/arm/boot/dts/rockchip/rk3066a-marsboard.dts
@@ -36,7 +36,7 @@ vcc_sd0: sdmmc-regulator {
 		regulator-name = "sdmmc-supply";
 		regulator-min-microvolt = <3000000>;
 		regulator-max-microvolt = <3000000>;
-		gpio = <&gpio3 RK_PA7 GPIO_ACTIVE_LOW>;
+		gpios = <&gpio3 RK_PA7 GPIO_ACTIVE_LOW>;
 		startup-delay-us = <100000>;
 		vin-supply = <&vcc_io>;
 	};
diff --git a/arch/arm/boot/dts/rockchip/rk3066a-mk808.dts b/arch/arm/boot/dts/rockchip/rk3066a-mk808.dts
index 4de9a45c4883..8a28c7cb15df 100644
--- a/arch/arm/boot/dts/rockchip/rk3066a-mk808.dts
+++ b/arch/arm/boot/dts/rockchip/rk3066a-mk808.dts
@@ -78,7 +78,7 @@ vcc_io: vcc-io {
 	vcc_host: usb-host-regulator {
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpio0 RK_PA6 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio0 RK_PA6 GPIO_ACTIVE_HIGH>;
 		pinctrl-0 = <&host_drv>;
 		pinctrl-names = "default";
 		regulator-always-on;
@@ -92,7 +92,7 @@ vcc_host: usb-host-regulator {
 	vcc_otg: usb-otg-regulator {
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpio0 RK_PA5 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio0 RK_PA5 GPIO_ACTIVE_HIGH>;
 		pinctrl-0 = <&otg_drv>;
 		pinctrl-names = "default";
 		regulator-always-on;
@@ -105,7 +105,7 @@ vcc_otg: usb-otg-regulator {
 
 	vcc_sd: sdmmc-regulator {
 		compatible = "regulator-fixed";
-		gpio = <&gpio3 RK_PA7 GPIO_ACTIVE_LOW>;
+		gpios = <&gpio3 RK_PA7 GPIO_ACTIVE_LOW>;
 		pinctrl-0 = <&sdmmc_pwr>;
 		pinctrl-names = "default";
 		regulator-name = "vcc_sd";
@@ -118,7 +118,7 @@ vcc_sd: sdmmc-regulator {
 	vcc_wifi: sdio-regulator {
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpio3 RK_PD0 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 RK_PD0 GPIO_ACTIVE_HIGH>;
 		pinctrl-0 = <&wifi_pwr>;
 		pinctrl-names = "default";
 		regulator-name = "vcc_wifi";
diff --git a/arch/arm/boot/dts/rockchip/rk3066a-rayeager.dts b/arch/arm/boot/dts/rockchip/rk3066a-rayeager.dts
index 29d8e5bf88f5..704485174ef3 100644
--- a/arch/arm/boot/dts/rockchip/rk3066a-rayeager.dts
+++ b/arch/arm/boot/dts/rockchip/rk3066a-rayeager.dts
@@ -84,7 +84,7 @@ vcc_emmc: emmc-regulator {
 	vcc_sata: sata-regulator {
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpio4 RK_PC6 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio4 RK_PC6 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&sata_pwr>;
 		regulator-name = "usb_5v";
@@ -96,7 +96,7 @@ vcc_sata: sata-regulator {
 
 	vcc_sd: sdmmc-regulator {
 		compatible = "regulator-fixed";
-		gpio = <&gpio3 RK_PA7 GPIO_ACTIVE_LOW>;
+		gpios = <&gpio3 RK_PA7 GPIO_ACTIVE_LOW>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&sdmmc_pwr>;
 		regulator-name = "vcc_sd";
@@ -109,7 +109,7 @@ vcc_sd: sdmmc-regulator {
 	vcc_host: usb-host-regulator {
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpio0 RK_PA6 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio0 RK_PA6 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&host_drv>;
 		regulator-name = "host-pwr";
@@ -122,7 +122,7 @@ vcc_host: usb-host-regulator {
 	vcc_otg: usb-otg-regulator {
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpio0 RK_PA5 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio0 RK_PA5 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&otg_drv>;
 		regulator-name = "vcc_otg";
diff --git a/arch/arm/boot/dts/rockchip/rk3128-evb.dts b/arch/arm/boot/dts/rockchip/rk3128-evb.dts
index c7ab7fcdb436..d60c05693343 100644
--- a/arch/arm/boot/dts/rockchip/rk3128-evb.dts
+++ b/arch/arm/boot/dts/rockchip/rk3128-evb.dts
@@ -26,7 +26,7 @@ memory at 60000000 {
 
 	vcc5v0_otg: vcc5v0-otg-regulator {
 		compatible = "regulator-fixed";
-		gpio = <&gpio0 26 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio0 26 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&otg_vbus_drv>;
 		regulator-name = "vcc5v0_otg";
@@ -36,7 +36,7 @@ vcc5v0_otg: vcc5v0-otg-regulator {
 
 	vcc5v0_host: vcc5v0-host-regulator {
 		compatible = "regulator-fixed";
-		gpio = <&gpio2 23 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio2 23 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&host_vbus_drv>;
 		regulator-name = "vcc5v0_host";
diff --git a/arch/arm/boot/dts/rockchip/rk3128-xpi-3128.dts b/arch/arm/boot/dts/rockchip/rk3128-xpi-3128.dts
index 21c1678f4e91..321d8464c107 100644
--- a/arch/arm/boot/dts/rockchip/rk3128-xpi-3128.dts
+++ b/arch/arm/boot/dts/rockchip/rk3128-xpi-3128.dts
@@ -64,7 +64,7 @@ hdmi_connector_in: endpoint {
 	 */
 	host_pwr_5v: host-pwr-5v-regulator {
 		compatible = "regulator-fixed";
-		gpio = <&gpio3 RK_PC4 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 RK_PC4 GPIO_ACTIVE_HIGH>;
 		startup-delay-us = <1500>;
 		regulator-name = "HOST_PWR_5V";
 		regulator-min-microvolt = <5000000>;
@@ -153,7 +153,7 @@ vcc_lan: vcc-lan-regulator {
 
 	vcc_sd: vcc-sd-regulator {
 		compatible = "regulator-fixed";
-		gpio = <&gpio1 RK_PB6 GPIO_ACTIVE_LOW>;
+		gpios = <&gpio1 RK_PB6 GPIO_ACTIVE_LOW>;
 		startup-delay-us = <500>;
 		regulator-name = "VCC_SD";
 		regulator-min-microvolt = <3300000>;
diff --git a/arch/arm/boot/dts/rockchip/rk3188-bqedison2qc.dts b/arch/arm/boot/dts/rockchip/rk3188-bqedison2qc.dts
index 9312be362a7a..378e78761319 100644
--- a/arch/arm/boot/dts/rockchip/rk3188-bqedison2qc.dts
+++ b/arch/arm/boot/dts/rockchip/rk3188-bqedison2qc.dts
@@ -135,7 +135,7 @@ avdd_cif: cif-avdd-regulator {
 		regulator-name = "avdd-cif";
 		regulator-min-microvolt = <2800000>;
 		regulator-max-microvolt = <2800000>;
-		gpio = <&gpio1 RK_PA6 GPIO_ACTIVE_LOW>;
+		gpios = <&gpio1 RK_PA6 GPIO_ACTIVE_LOW>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&cif_avdd_en>;
 		startup-delay-us = <100000>;
@@ -148,7 +148,7 @@ vcc_5v: vcc-5v-regulator {
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
 		enable-active-high;
-		gpio = <&gpio0 RK_PA3 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio0 RK_PA3 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&v5_drv>;
 		vin-supply = <&vsys>;
@@ -157,7 +157,7 @@ vcc_5v: vcc-5v-regulator {
 	vcc_lcd: lcd-regulator {
 		compatible = "regulator-fixed";
 		regulator-name = "vcc-lcd";
-		gpio = <&gpio0 RK_PB0 GPIO_ACTIVE_LOW>;
+		gpios = <&gpio0 RK_PB0 GPIO_ACTIVE_LOW>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&lcd_en>;
 		startup-delay-us = <50000>;
@@ -170,7 +170,7 @@ vcc_otg: usb-otg-regulator {
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
 		enable-active-high;
-		gpio = <&gpio3 RK_PB1 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 RK_PB1 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&otg_drv>;
 		startup-delay-us = <100000>;
@@ -182,7 +182,7 @@ vcc_sd: sdmmc-regulator {
 		regulator-name = "vcc-sd";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio3 RK_PA1 GPIO_ACTIVE_LOW>;
+		gpios = <&gpio3 RK_PA1 GPIO_ACTIVE_LOW>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&sdmmc_pwr>;
 		startup-delay-us = <100000>;
diff --git a/arch/arm/boot/dts/rockchip/rk3188-radxarock.dts b/arch/arm/boot/dts/rockchip/rk3188-radxarock.dts
index 118deacd38c4..a24d58ee7687 100644
--- a/arch/arm/boot/dts/rockchip/rk3188-radxarock.dts
+++ b/arch/arm/boot/dts/rockchip/rk3188-radxarock.dts
@@ -81,7 +81,7 @@ ir_recv: ir-receiver {
 	vcc_otg: usb-otg-regulator {
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpio2 RK_PD7 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio2 RK_PD7 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&otg_vbus_drv>;
 		regulator-name = "otg-vbus";
@@ -96,7 +96,7 @@ vcc_sd0: sdmmc-regulator {
 		regulator-name = "sdmmc-supply";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio3 RK_PA1 GPIO_ACTIVE_LOW>;
+		gpios = <&gpio3 RK_PA1 GPIO_ACTIVE_LOW>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&sdmmc_pwr>;
 		startup-delay-us = <100000>;
@@ -106,7 +106,7 @@ vcc_sd0: sdmmc-regulator {
 	vcc_host: usb-host-regulator {
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpio0 RK_PA3 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio0 RK_PA3 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&host_vbus_drv>;
 		regulator-name = "host-pwr";
diff --git a/arch/arm/boot/dts/rockchip/rk3229-evb.dts b/arch/arm/boot/dts/rockchip/rk3229-evb.dts
index 5c3d08e3eea3..718882e7ef21 100644
--- a/arch/arm/boot/dts/rockchip/rk3229-evb.dts
+++ b/arch/arm/boot/dts/rockchip/rk3229-evb.dts
@@ -37,7 +37,7 @@ ext_gmac: ext_gmac {
 	vcc_host: vcc-host-regulator {
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpio3 RK_PC4 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 RK_PC4 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&host_vbus_drv>;
 		regulator-name = "vcc_host";
diff --git a/arch/arm/boot/dts/rockchip/rk3229-xms6.dts b/arch/arm/boot/dts/rockchip/rk3229-xms6.dts
index 7bfbfd11fb55..7e588eb3add7 100644
--- a/arch/arm/boot/dts/rockchip/rk3229-xms6.dts
+++ b/arch/arm/boot/dts/rockchip/rk3229-xms6.dts
@@ -54,7 +54,7 @@ sdio_pwrseq: sdio-pwrseq {
 	vcc_host: vcc-host-regulator {
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpio3 RK_PC4 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 RK_PC4 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&host_vbus_drv>;
 		regulator-name = "vcc_host";
diff --git a/arch/arm/boot/dts/rockchip/rk3288-evb-act8846.dts b/arch/arm/boot/dts/rockchip/rk3288-evb-act8846.dts
index 8a635c243127..e8d69c88ed3f 100644
--- a/arch/arm/boot/dts/rockchip/rk3288-evb-act8846.dts
+++ b/arch/arm/boot/dts/rockchip/rk3288-evb-act8846.dts
@@ -10,7 +10,7 @@ / {
 	vcc_lcd: vcc-lcd {
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpio7 RK_PA3 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio7 RK_PA3 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&lcd_en>;
 		regulator-name = "vcc_lcd";
@@ -20,7 +20,7 @@ vcc_lcd: vcc-lcd {
 	vcc_wl: vcc-wl {
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpio7 RK_PB1 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio7 RK_PB1 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&wifi_pwr>;
 		regulator-name = "vcc_wl";
diff --git a/arch/arm/boot/dts/rockchip/rk3288-evb.dtsi b/arch/arm/boot/dts/rockchip/rk3288-evb.dtsi
index 382d2839cf47..505f7350f36e 100644
--- a/arch/arm/boot/dts/rockchip/rk3288-evb.dtsi
+++ b/arch/arm/boot/dts/rockchip/rk3288-evb.dtsi
@@ -132,7 +132,7 @@ key-power {
 	vcc_host: vcc-host-regulator {
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpio0 RK_PB6 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio0 RK_PB6 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&host_vbus_drv>;
 		regulator-name = "vcc_host";
@@ -143,7 +143,7 @@ vcc_host: vcc-host-regulator {
 	vcc_phy: vcc-phy-regulator {
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpio0 RK_PA6 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio0 RK_PA6 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&eth_phy_pwr>;
 		regulator-name = "vcc_phy";
@@ -169,7 +169,7 @@ vcc_sys: vsys-regulator {
 	 */
 	vcc_sd: sdmmc-regulator {
 		compatible = "regulator-fixed";
-		gpio = <&gpio7 RK_PB3 GPIO_ACTIVE_LOW>;
+		gpios = <&gpio7 RK_PB3 GPIO_ACTIVE_LOW>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&sdmmc_pwr>;
 		regulator-name = "vcc_sd";
diff --git a/arch/arm/boot/dts/rockchip/rk3288-firefly-reload.dts b/arch/arm/boot/dts/rockchip/rk3288-firefly-reload.dts
index a5a0826341e6..c665530d8481 100644
--- a/arch/arm/boot/dts/rockchip/rk3288-firefly-reload.dts
+++ b/arch/arm/boot/dts/rockchip/rk3288-firefly-reload.dts
@@ -88,7 +88,7 @@ spdif_out: spdif-out {
 	vcc_host_5v: usb-host-regulator {
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpio0 RK_PB6 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio0 RK_PB6 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&host_vbus_drv>;
 		regulator-name = "vcc_host_5v";
@@ -109,7 +109,7 @@ vcc_5v: vcc_sys: vsys-regulator {
 
 	vcc_sd: sdmmc-regulator {
 		compatible = "regulator-fixed";
-		gpio = <&gpio7 RK_PB3 GPIO_ACTIVE_LOW>;
+		gpios = <&gpio7 RK_PB3 GPIO_ACTIVE_LOW>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&sdmmc_pwr>;
 		regulator-name = "vcc_sd";
@@ -122,7 +122,7 @@ vcc_sd: sdmmc-regulator {
 	vcc_otg_5v: usb-otg-regulator {
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpio0 RK_PB4 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio0 RK_PB4 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&otg_vbus_drv>;
 		regulator-name = "vcc_otg_5v";
@@ -135,7 +135,7 @@ vcc_otg_5v: usb-otg-regulator {
 	dovdd_1v8: dovdd-1v8-regulator {
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpio0 RK_PB3 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio0 RK_PB3 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&dvp_pwr>;
 		regulator-name = "dovdd_1v8";
@@ -147,7 +147,7 @@ dovdd_1v8: dovdd-1v8-regulator {
 	vcc28_dvp: vcc28-dvp-regulator {
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpio0 RK_PB3 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio0 RK_PB3 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&dvp_pwr>;
 		regulator-name = "vcc28_dvp";
@@ -159,7 +159,7 @@ vcc28_dvp: vcc28-dvp-regulator {
 	af_28: af_28-regulator {
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpio0 RK_PB3 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio0 RK_PB3 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&dvp_pwr>;
 		regulator-name = "af_28";
@@ -171,7 +171,7 @@ af_28: af_28-regulator {
 	dvdd_1v2: af_28-regulator {
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpio7 RK_PB4 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio7 RK_PB4 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&cif_pwr>;
 		regulator-name = "dvdd_1v2";
diff --git a/arch/arm/boot/dts/rockchip/rk3288-firefly.dtsi b/arch/arm/boot/dts/rockchip/rk3288-firefly.dtsi
index 3836c61cfb76..724a21d29fe1 100644
--- a/arch/arm/boot/dts/rockchip/rk3288-firefly.dtsi
+++ b/arch/arm/boot/dts/rockchip/rk3288-firefly.dtsi
@@ -90,7 +90,7 @@ vbat_wl: vcc_sys: vsys-regulator {
 
 	vcc_sd: sdmmc-regulator {
 		compatible = "regulator-fixed";
-		gpio = <&gpio7 RK_PB3 GPIO_ACTIVE_LOW>;
+		gpios = <&gpio7 RK_PB3 GPIO_ACTIVE_LOW>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&sdmmc_pwr>;
 		regulator-name = "vcc_sd";
@@ -121,7 +121,7 @@ vcc_5v: usb-regulator {
 	vcc_host_5v: usb-host-regulator {
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpio0 RK_PB6 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio0 RK_PB6 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&host_vbus_drv>;
 		regulator-name = "vcc_host_5v";
@@ -134,7 +134,7 @@ vcc_host_5v: usb-host-regulator {
 	vcc_otg_5v: usb-otg-regulator {
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpio0 RK_PB4 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio0 RK_PB4 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&otg_vbus_drv>;
 		regulator-name = "vcc_otg_5v";
@@ -151,7 +151,7 @@ vcc_otg_5v: usb-otg-regulator {
 	vcc28_dvp: vcc28-dvp-regulator {
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpio0 RK_PB3 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio0 RK_PB3 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&dvp_pwr>;
 		regulator-name = "vcc28_dvp";
diff --git a/arch/arm/boot/dts/rockchip/rk3288-miqi.dts b/arch/arm/boot/dts/rockchip/rk3288-miqi.dts
index db1eb648e0e1..f3b5f66cecab 100644
--- a/arch/arm/boot/dts/rockchip/rk3288-miqi.dts
+++ b/arch/arm/boot/dts/rockchip/rk3288-miqi.dts
@@ -48,7 +48,7 @@ vcc_flash: flash-regulator {
 	vcc_host: usb-host-regulator {
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpio0 RK_PB6 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio0 RK_PB6 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&host_vbus_drv>;
 		regulator-name = "vcc_host";
@@ -60,7 +60,7 @@ vcc_host: usb-host-regulator {
 
 	vcc_sd: sdmmc-regulator {
 		compatible = "regulator-fixed";
-		gpio = <&gpio7 RK_PB3 GPIO_ACTIVE_LOW>;
+		gpios = <&gpio7 RK_PB3 GPIO_ACTIVE_LOW>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&sdmmc_pwr>;
 		regulator-name = "vcc_sd";
diff --git a/arch/arm/boot/dts/rockchip/rk3288-phycore-rdk.dts b/arch/arm/boot/dts/rockchip/rk3288-phycore-rdk.dts
index 1a5156951492..bb6231151800 100644
--- a/arch/arm/boot/dts/rockchip/rk3288-phycore-rdk.dts
+++ b/arch/arm/boot/dts/rockchip/rk3288-phycore-rdk.dts
@@ -37,7 +37,7 @@ button-1 {
 
 	vcc_host0_5v: usb-host0-regulator {
 		compatible = "regulator-fixed";
-		gpio = <&gpio2 13 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio2 13 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&host0_vbus_drv>;
 		regulator-name = "vcc_host0_5v";
@@ -49,7 +49,7 @@ vcc_host0_5v: usb-host0-regulator {
 
 	vcc_host1_5v: usb-host1-regulator {
 		compatible = "regulator-fixed";
-		gpio = <&gpio2 0 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio2 0 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&host1_vbus_drv>;
 		regulator-name = "vcc_host1_5v";
@@ -61,7 +61,7 @@ vcc_host1_5v: usb-host1-regulator {
 
 	vcc_otg_5v: usb-otg-regulator {
 		compatible = "regulator-fixed";
-		gpio = <&gpio2 12 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio2 12 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&otg_vbus_drv>;
 		regulator-name = "vcc_otg_5v";
diff --git a/arch/arm/boot/dts/rockchip/rk3288-popmetal.dts b/arch/arm/boot/dts/rockchip/rk3288-popmetal.dts
index fd90f3b8fc32..bcfa6d818c8d 100644
--- a/arch/arm/boot/dts/rockchip/rk3288-popmetal.dts
+++ b/arch/arm/boot/dts/rockchip/rk3288-popmetal.dts
@@ -57,7 +57,7 @@ vcc_flash: flash-regulator {
 
 	vcc_sd: sdmmc-regulator {
 		compatible = "regulator-fixed";
-		gpio = <&gpio7 RK_PB3 GPIO_ACTIVE_LOW>;
+		gpios = <&gpio7 RK_PB3 GPIO_ACTIVE_LOW>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&sdmmc_pwr>;
 		regulator-name = "vcc_sd";
@@ -91,7 +91,7 @@ vcc18_dvp: vcc18-dvp-regulator {
 	vcc28_dvp: vcc28-dvp-regulator {
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpio0 RK_PC1 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio0 RK_PC1 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&dvp_pwr>;
 		regulator-name = "vcc28_dvp";
diff --git a/arch/arm/boot/dts/rockchip/rk3288-r89.dts b/arch/arm/boot/dts/rockchip/rk3288-r89.dts
index 633e5a032463..a63c01c37517 100644
--- a/arch/arm/boot/dts/rockchip/rk3288-r89.dts
+++ b/arch/arm/boot/dts/rockchip/rk3288-r89.dts
@@ -51,7 +51,7 @@ ir: ir-receiver {
 	vcc_host: vcc-host-regulator {
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpio0 RK_PB6 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio0 RK_PB6 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&host_vbus_drv>;
 		regulator-name = "vcc_host";
@@ -62,7 +62,7 @@ vcc_host: vcc-host-regulator {
 	vcc_otg: vcc-otg-regulator {
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpio0 RK_PB4 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio0 RK_PB4 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&otg_vbus_drv>;
 		regulator-name = "vcc_otg";
@@ -75,7 +75,7 @@ vcc_sdmmc: sdmmc-regulator {
 		regulator-name = "sdmmc-supply";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio7 RK_PB3 GPIO_ACTIVE_LOW>;
+		gpios = <&gpio7 RK_PB3 GPIO_ACTIVE_LOW>;
 		startup-delay-us = <100000>;
 		vin-supply = <&vcc_io>;
 	};
diff --git a/arch/arm/boot/dts/rockchip/rk3288-rock2-square.dts b/arch/arm/boot/dts/rockchip/rk3288-rock2-square.dts
index 13cfdaa95cc7..9d38056f2352 100644
--- a/arch/arm/boot/dts/rockchip/rk3288-rock2-square.dts
+++ b/arch/arm/boot/dts/rockchip/rk3288-rock2-square.dts
@@ -73,7 +73,7 @@ simple-audio-card,dai-link at 1 {  /* S/PDIF - S/PDIF */
 	sata_pwr: sata-prw-regulator {
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpio0 13 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio0 13 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&sata_pwr_en>;
 		/* Always turn on the 5V sata power connector */
@@ -111,7 +111,7 @@ sdio_pwrseq: sdio-pwrseq {
 	vcc_usb_host: vcc-host-regulator {
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpio0 RK_PB6 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio0 RK_PB6 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&host_vbus_drv>;
 		regulator-name = "vcc_host";
@@ -119,7 +119,7 @@ vcc_usb_host: vcc-host-regulator {
 
 	vcc_sd: sdmmc-regulator {
 		compatible = "regulator-fixed";
-		gpio = <&gpio7 RK_PB3 GPIO_ACTIVE_LOW>;
+		gpios = <&gpio7 RK_PB3 GPIO_ACTIVE_LOW>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&sdmmc_pwr>;
 		regulator-name = "vcc_sd";
diff --git a/arch/arm/boot/dts/rockchip/rk3288-tinker.dtsi b/arch/arm/boot/dts/rockchip/rk3288-tinker.dtsi
index 09618bb7d872..e6bc55e73fb0 100644
--- a/arch/arm/boot/dts/rockchip/rk3288-tinker.dtsi
+++ b/arch/arm/boot/dts/rockchip/rk3288-tinker.dtsi
@@ -96,7 +96,7 @@ vcc_sys: vsys-regulator {
 
 	vcc_sd: sdmmc-regulator {
 		compatible = "regulator-fixed";
-		gpio = <&gpio7 11 GPIO_ACTIVE_LOW>;
+		gpios = <&gpio7 11 GPIO_ACTIVE_LOW>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&sdmmc_pwr>;
 		regulator-name = "vcc_sd";
diff --git a/arch/arm/boot/dts/rockchip/rk3288-veyron-brain.dts b/arch/arm/boot/dts/rockchip/rk3288-veyron-brain.dts
index aa33d09184ad..a048575bd874 100644
--- a/arch/arm/boot/dts/rockchip/rk3288-veyron-brain.dts
+++ b/arch/arm/boot/dts/rockchip/rk3288-veyron-brain.dts
@@ -31,7 +31,7 @@ vcc33_io: vcc33_io {
 	vcc5_host2: vcc5-host2-regulator {
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpio0 RK_PB4 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio0 RK_PB4 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&usb2_pwr_en>;
 		regulator-name = "vcc5_host2";
@@ -105,7 +105,7 @@ vcc18_hdmi: SWITCH_REG2 {
 
 &vcc50_hdmi {
 	enable-active-high;
-	gpio = <&gpio7 RK_PA2 GPIO_ACTIVE_HIGH>;
+	gpios = <&gpio7 RK_PA2 GPIO_ACTIVE_HIGH>;
 	pinctrl-names = "default";
 	pinctrl-0 = <&vcc50_hdmi_en>;
 };
diff --git a/arch/arm/boot/dts/rockchip/rk3288-veyron-chromebook.dtsi b/arch/arm/boot/dts/rockchip/rk3288-veyron-chromebook.dtsi
index 092316be67f7..c8a907682410 100644
--- a/arch/arm/boot/dts/rockchip/rk3288-veyron-chromebook.dtsi
+++ b/arch/arm/boot/dts/rockchip/rk3288-veyron-chromebook.dtsi
@@ -62,7 +62,7 @@ vcc_5v: vcc-5v {
 	vcc5_host1: vcc5-host1-regulator {
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpio0 RK_PB3 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio0 RK_PB3 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&host1_pwr_en>;
 		regulator-name = "vcc5_host1";
@@ -74,7 +74,7 @@ vcc5_host1: vcc5-host1-regulator {
 	vcc5v_otg: vcc5v-otg-regulator {
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpio0 RK_PB4 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio0 RK_PB4 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&usbotg_pwren_h>;
 		regulator-name = "vcc5_host2";
diff --git a/arch/arm/boot/dts/rockchip/rk3288-veyron-edp.dtsi b/arch/arm/boot/dts/rockchip/rk3288-veyron-edp.dtsi
index 32c0f10765dd..3126db32c898 100644
--- a/arch/arm/boot/dts/rockchip/rk3288-veyron-edp.dtsi
+++ b/arch/arm/boot/dts/rockchip/rk3288-veyron-edp.dtsi
@@ -9,7 +9,7 @@ / {
 	backlight_regulator: backlight-regulator {
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpio2 RK_PB4 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio2 RK_PB4 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&bl_pwr_en>;
 		regulator-name = "backlight_regulator";
@@ -20,7 +20,7 @@ backlight_regulator: backlight-regulator {
 	panel_regulator: panel-regulator {
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpio7 RK_PB6 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio7 RK_PB6 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&lcd_enable_h>;
 		regulator-name = "panel_regulator";
@@ -30,7 +30,7 @@ panel_regulator: panel-regulator {
 	vcc18_lcd: vcc18-lcd {
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpio2 RK_PB5 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio2 RK_PB5 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&avdd_1v8_disp_en>;
 		regulator-name = "vcc18_lcd";
diff --git a/arch/arm/boot/dts/rockchip/rk3288-veyron-fievel.dts b/arch/arm/boot/dts/rockchip/rk3288-veyron-fievel.dts
index 309b122b4d0d..635a139b8a4b 100644
--- a/arch/arm/boot/dts/rockchip/rk3288-veyron-fievel.dts
+++ b/arch/arm/boot/dts/rockchip/rk3288-veyron-fievel.dts
@@ -39,7 +39,7 @@ vcc33_io: vcc33-io {
 	vcc5_host1: vcc5-host1-regulator {
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpio5 RK_PC2 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio5 RK_PC2 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&hub_usb1_pwr_en>;
 		regulator-name = "vcc5_host1";
@@ -50,7 +50,7 @@ vcc5_host1: vcc5-host1-regulator {
 	vcc5_host2: vcc5-host2-regulator {
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpio5 RK_PB6 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio5 RK_PB6 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&hub_usb2_pwr_en>;
 		regulator-name = "vcc5_host2";
@@ -61,7 +61,7 @@ vcc5_host2: vcc5-host2-regulator {
 	vcc5v_otg: vcc5v-otg-regulator {
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpio0 RK_PB4 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio0 RK_PB4 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&usb_otg_pwr_en>;
 		regulator-name = "vcc5_otg";
@@ -190,14 +190,14 @@ btmrvl: btmrvl at 2 {
 
 &vcc50_hdmi {
 	enable-active-high;
-	gpio = <&gpio5 RK_PC3 GPIO_ACTIVE_HIGH>;
+	gpios = <&gpio5 RK_PC3 GPIO_ACTIVE_HIGH>;
 	pinctrl-names = "default";
 	pinctrl-0 = <&vcc50_hdmi_en>;
 };
 
 &vcc_5v {
 	enable-active-high;
-	gpio = <&gpio7 RK_PC5 GPIO_ACTIVE_HIGH>;
+	gpios = <&gpio7 RK_PC5 GPIO_ACTIVE_HIGH>;
 	pinctrl-names = "default";
 	pinctrl-0 = <&drv_5v>;
 };
diff --git a/arch/arm/boot/dts/rockchip/rk3288-veyron-jaq.dts b/arch/arm/boot/dts/rockchip/rk3288-veyron-jaq.dts
index 0d4c50e05558..01f564cb3ab7 100644
--- a/arch/arm/boot/dts/rockchip/rk3288-veyron-jaq.dts
+++ b/arch/arm/boot/dts/rockchip/rk3288-veyron-jaq.dts
@@ -68,14 +68,14 @@ &sdmmc {
 
 &vcc_5v {
 	enable-active-high;
-	gpio = <&gpio7 RK_PC5 GPIO_ACTIVE_HIGH>;
+	gpios = <&gpio7 RK_PC5 GPIO_ACTIVE_HIGH>;
 	pinctrl-names = "default";
 	pinctrl-0 = <&drv_5v>;
 };
 
 &vcc50_hdmi {
 	enable-active-high;
-	gpio = <&gpio5 RK_PC3 GPIO_ACTIVE_HIGH>;
+	gpios = <&gpio5 RK_PC3 GPIO_ACTIVE_HIGH>;
 	pinctrl-names = "default";
 	pinctrl-0 = <&vcc50_hdmi_en>;
 };
diff --git a/arch/arm/boot/dts/rockchip/rk3288-veyron-jerry.dts b/arch/arm/boot/dts/rockchip/rk3288-veyron-jerry.dts
index 6894763979f0..9a0853f76966 100644
--- a/arch/arm/boot/dts/rockchip/rk3288-veyron-jerry.dts
+++ b/arch/arm/boot/dts/rockchip/rk3288-veyron-jerry.dts
@@ -198,14 +198,14 @@ &sdmmc {
 
 &vcc_5v {
 	enable-active-high;
-	gpio = <&gpio7 RK_PC5 GPIO_ACTIVE_HIGH>;
+	gpios = <&gpio7 RK_PC5 GPIO_ACTIVE_HIGH>;
 	pinctrl-names = "default";
 	pinctrl-0 = <&drv_5v>;
 };
 
 &vcc50_hdmi {
 	enable-active-high;
-	gpio = <&gpio5 RK_PC3 GPIO_ACTIVE_HIGH>;
+	gpios = <&gpio5 RK_PC3 GPIO_ACTIVE_HIGH>;
 	pinctrl-names = "default";
 	pinctrl-0 = <&vcc50_hdmi_en>;
 };
diff --git a/arch/arm/boot/dts/rockchip/rk3288-veyron-mickey.dts b/arch/arm/boot/dts/rockchip/rk3288-veyron-mickey.dts
index ffd1121d19be..f711604e5fbd 100644
--- a/arch/arm/boot/dts/rockchip/rk3288-veyron-mickey.dts
+++ b/arch/arm/boot/dts/rockchip/rk3288-veyron-mickey.dts
@@ -447,7 +447,7 @@ &usb_host1 {
 
 &vcc50_hdmi {
 	enable-active-high;
-	gpio = <&gpio7 RK_PB3 GPIO_ACTIVE_HIGH>;
+	gpios = <&gpio7 RK_PB3 GPIO_ACTIVE_HIGH>;
 	pinctrl-names = "default";
 	pinctrl-0 = <&power_hdmi_on>;
 };
diff --git a/arch/arm/boot/dts/rockchip/rk3288-veyron-minnie.dts b/arch/arm/boot/dts/rockchip/rk3288-veyron-minnie.dts
index dcdcc55c4098..a02ab9f12a58 100644
--- a/arch/arm/boot/dts/rockchip/rk3288-veyron-minnie.dts
+++ b/arch/arm/boot/dts/rockchip/rk3288-veyron-minnie.dts
@@ -120,14 +120,14 @@ &sdmmc {
 
 &vcc_5v {
 	enable-active-high;
-	gpio = <&gpio7 RK_PC5 GPIO_ACTIVE_HIGH>;
+	gpios = <&gpio7 RK_PC5 GPIO_ACTIVE_HIGH>;
 	pinctrl-names = "default";
 	pinctrl-0 = <&drv_5v>;
 };
 
 &vcc50_hdmi {
 	enable-active-high;
-	gpio = <&gpio5 RK_PC3 GPIO_ACTIVE_HIGH>;
+	gpios = <&gpio5 RK_PC3 GPIO_ACTIVE_HIGH>;
 	pinctrl-names = "default";
 	pinctrl-0 = <&vcc50_hdmi_en>;
 };
diff --git a/arch/arm/boot/dts/rockchip/rk3288-veyron-speedy.dts b/arch/arm/boot/dts/rockchip/rk3288-veyron-speedy.dts
index 336cd2be5265..50d2b3f62571 100644
--- a/arch/arm/boot/dts/rockchip/rk3288-veyron-speedy.dts
+++ b/arch/arm/boot/dts/rockchip/rk3288-veyron-speedy.dts
@@ -60,14 +60,14 @@ &sdmmc {
 
 &vcc_5v {
 	enable-active-high;
-	gpio = <&gpio7 RK_PC5 GPIO_ACTIVE_HIGH>;
+	gpios = <&gpio7 RK_PC5 GPIO_ACTIVE_HIGH>;
 	pinctrl-names = "default";
 	pinctrl-0 = <&drv_5v>;
 };
 
 &vcc50_hdmi {
 	enable-active-high;
-	gpio = <&gpio5 RK_PC3 GPIO_ACTIVE_HIGH>;
+	gpios = <&gpio5 RK_PC3 GPIO_ACTIVE_HIGH>;
 	pinctrl-names = "default";
 	pinctrl-0 = <&vcc50_hdmi_en>;
 };
diff --git a/arch/arm/boot/dts/rockchip/rk3288-vmarc-som.dtsi b/arch/arm/boot/dts/rockchip/rk3288-vmarc-som.dtsi
index 793951655b73..7836c897f371 100644
--- a/arch/arm/boot/dts/rockchip/rk3288-vmarc-som.dtsi
+++ b/arch/arm/boot/dts/rockchip/rk3288-vmarc-som.dtsi
@@ -352,10 +352,10 @@ &usb_otg {
 
 &vbus_host {
 	enable-active-high;
-	gpio = <&gpio0 RK_PC1 GPIO_ACTIVE_HIGH>; /* USB1_EN_OC# */
+	gpios = <&gpio0 RK_PC1 GPIO_ACTIVE_HIGH>; /* USB1_EN_OC# */
 };
 
 &vbus_typec {
 	enable-active-high;
-	gpio = <&gpio0 RK_PB5 GPIO_ACTIVE_HIGH>; /* USB0_EN_OC# */
+	gpios = <&gpio0 RK_PB5 GPIO_ACTIVE_HIGH>; /* USB0_EN_OC# */
 };
diff --git a/arch/arm/boot/dts/rockchip/rk3288-vyasa.dts b/arch/arm/boot/dts/rockchip/rk3288-vyasa.dts
index b156a83eb7d7..ee702d24f010 100644
--- a/arch/arm/boot/dts/rockchip/rk3288-vyasa.dts
+++ b/arch/arm/boot/dts/rockchip/rk3288-vyasa.dts
@@ -82,7 +82,7 @@ vcc50_hdmi: vcc50-hdmi {
 		compatible = "regulator-fixed";
 		regulator-name = "vcc50_hdmi";
 		enable-active-high;
-		gpio = <&gpio7 RK_PB4 GPIO_ACTIVE_HIGH>; /* HDMI_EN */
+		gpios = <&gpio7 RK_PB4 GPIO_ACTIVE_HIGH>; /* HDMI_EN */
 		pinctrl-names = "default";
 		pinctrl-0 = <&vcc50_hdmi_en>;
 		regulator-always-on;
@@ -94,7 +94,7 @@ vusb1_5v: vusb1-5v {
 		compatible = "regulator-fixed";
 		regulator-name = "vusb1_5v";
 		enable-active-high;
-		gpio = <&gpio0 RK_PB4 GPIO_ACTIVE_HIGH>; /* OTG_VBUS_DRV */
+		gpios = <&gpio0 RK_PB4 GPIO_ACTIVE_HIGH>; /* OTG_VBUS_DRV */
 		pinctrl-names = "default";
 		pinctrl-0 = <&otg_vbus_drv>;
 		regulator-min-microvolt = <5000000>;
@@ -106,7 +106,7 @@ vusb2_5v: vusb2-5v {
 		compatible = "regulator-fixed";
 		regulator-name = "vusb2_5v";
 		enable-active-high;
-		gpio = <&gpio8 RK_PB1 GPIO_ACTIVE_HIGH>; /* USB2_PWR_EN */
+		gpios = <&gpio8 RK_PB1 GPIO_ACTIVE_HIGH>; /* USB2_PWR_EN */
 		pinctrl-names = "default";
 		pinctrl-0 = <&usb2_pwr_en>;
 		regulator-min-microvolt = <5000000>;
diff --git a/arch/arm/boot/dts/rockchip/rv1126-edgeble-neu2.dtsi b/arch/arm/boot/dts/rockchip/rv1126-edgeble-neu2.dtsi
index 7ea8d7d16f5f..496636a06e60 100644
--- a/arch/arm/boot/dts/rockchip/rv1126-edgeble-neu2.dtsi
+++ b/arch/arm/boot/dts/rockchip/rv1126-edgeble-neu2.dtsi
@@ -14,7 +14,7 @@ aliases {
 	vccio_flash: vccio-flash-regulator {
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpio0 RK_PB3 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio0 RK_PB3 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&flash_vol_sel>;
 		regulator-name = "vccio_flash";
diff --git a/arch/arm/boot/dts/samsung/exynos3250-monk.dts b/arch/arm/boot/dts/samsung/exynos3250-monk.dts
index 2de877d4ccc5..dfae751bbf83 100644
--- a/arch/arm/boot/dts/samsung/exynos3250-monk.dts
+++ b/arch/arm/boot/dts/samsung/exynos3250-monk.dts
@@ -52,7 +52,7 @@ vemmc_reg: voltage-regulator-0 {
 		regulator-name = "V_EMMC_2.8V-fixed";
 		regulator-min-microvolt = <2800000>;
 		regulator-max-microvolt = <2800000>;
-		gpio = <&gpk0 2 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpk0 2 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/samsung/exynos4210-i9100.dts b/arch/arm/boot/dts/samsung/exynos4210-i9100.dts
index 0d8495792a70..f12f427650bc 100644
--- a/arch/arm/boot/dts/samsung/exynos4210-i9100.dts
+++ b/arch/arm/boot/dts/samsung/exynos4210-i9100.dts
@@ -40,7 +40,7 @@ vemmc_reg: regulator-0 {
 		regulator-name = "VMEM_VDD_2.8V";
 		regulator-min-microvolt = <2800000>;
 		regulator-max-microvolt = <2800000>;
-		gpio = <&gpk0 2 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpk0 2 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -49,7 +49,7 @@ tsp_reg: regulator-1 {
 		regulator-name = "TSP_FIXED_VOLTAGES";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpl0 3 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpl0 3 GPIO_ACTIVE_HIGH>;
 		startup-delay-us = <70000>;
 		enable-active-high;
 		regulator-boot-on;
@@ -61,7 +61,7 @@ cam_af_28v_reg: regulator-2 {
 		regulator-name = "8M_AF_2.8V_EN";
 		regulator-min-microvolt = <2800000>;
 		regulator-max-microvolt = <2800000>;
-		gpio = <&gpk1 1 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpk1 1 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -70,7 +70,7 @@ cam_io_en_reg: regulator-3 {
 		regulator-name = "CAM_IO_EN";
 		regulator-min-microvolt = <2800000>;
 		regulator-max-microvolt = <2800000>;
-		gpio = <&gpe2 1 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpe2 1 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -79,7 +79,7 @@ cam_io_12v_reg: regulator-4 {
 		regulator-name = "8M_1.2V_EN";
 		regulator-min-microvolt = <1200000>;
 		regulator-max-microvolt = <1200000>;
-		gpio = <&gpe2 5 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpe2 5 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -88,7 +88,7 @@ vt_core_15v_reg: regulator-5 {
 		regulator-name = "VT_CORE_1.5V";
 		regulator-min-microvolt = <1500000>;
 		regulator-max-microvolt = <1500000>;
-		gpio = <&gpe2 2 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpe2 2 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/samsung/exynos4210-origen.dts b/arch/arm/boot/dts/samsung/exynos4210-origen.dts
index f1927ca15e08..5a550ac4b899 100644
--- a/arch/arm/boot/dts/samsung/exynos4210-origen.dts
+++ b/arch/arm/boot/dts/samsung/exynos4210-origen.dts
@@ -45,7 +45,7 @@ mmc_reg: voltage-regulator {
 		regulator-name = "VMEM_VDD_2.8V";
 		regulator-min-microvolt = <2800000>;
 		regulator-max-microvolt = <2800000>;
-		gpio = <&gpx1 1 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpx1 1 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/samsung/exynos4210-trats.dts b/arch/arm/boot/dts/samsung/exynos4210-trats.dts
index 95e0e01b6ff6..aad31baaf146 100644
--- a/arch/arm/boot/dts/samsung/exynos4210-trats.dts
+++ b/arch/arm/boot/dts/samsung/exynos4210-trats.dts
@@ -42,7 +42,7 @@ vemmc_reg: regulator-0 {
 		regulator-name = "VMEM_VDD_2.8V";
 		regulator-min-microvolt = <2800000>;
 		regulator-max-microvolt = <2800000>;
-		gpio = <&gpk0 2 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpk0 2 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -51,7 +51,7 @@ tsp_reg: regulator-1 {
 		regulator-name = "TSP_FIXED_VOLTAGES";
 		regulator-min-microvolt = <2800000>;
 		regulator-max-microvolt = <2800000>;
-		gpio = <&gpl0 3 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpl0 3 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -60,7 +60,7 @@ cam_af_28v_reg: regulator-2 {
 		regulator-name = "8M_AF_2.8V_EN";
 		regulator-min-microvolt = <2800000>;
 		regulator-max-microvolt = <2800000>;
-		gpio = <&gpk1 1 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpk1 1 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -69,7 +69,7 @@ cam_io_en_reg: regulator-3 {
 		regulator-name = "CAM_IO_EN";
 		regulator-min-microvolt = <2800000>;
 		regulator-max-microvolt = <2800000>;
-		gpio = <&gpe2 1 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpe2 1 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -78,7 +78,7 @@ cam_io_12v_reg: regulator-4 {
 		regulator-name = "8M_1.2V_EN";
 		regulator-min-microvolt = <1200000>;
 		regulator-max-microvolt = <1200000>;
-		gpio = <&gpe2 5 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpe2 5 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -87,7 +87,7 @@ vt_core_15v_reg: regulator-5 {
 		regulator-name = "VT_CORE_1.5V";
 		regulator-min-microvolt = <1500000>;
 		regulator-max-microvolt = <1500000>;
-		gpio = <&gpe2 2 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpe2 2 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/samsung/exynos4210-universal_c210.dts b/arch/arm/boot/dts/samsung/exynos4210-universal_c210.dts
index bdc30f8cf748..1c86d68a58c0 100644
--- a/arch/arm/boot/dts/samsung/exynos4210-universal_c210.dts
+++ b/arch/arm/boot/dts/samsung/exynos4210-universal_c210.dts
@@ -60,7 +60,7 @@ vemmc_reg: voltage-regulator {
 		regulator-name = "VMEM_VDD_2_8V";
 		regulator-min-microvolt = <2800000>;
 		regulator-max-microvolt = <2800000>;
-		gpio = <&gpe1 3 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpe1 3 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -122,7 +122,7 @@ tsp_reg: voltage-regulator {
 		regulator-name = "TSP_2_8V";
 		regulator-min-microvolt = <2800000>;
 		regulator-max-microvolt = <2800000>;
-		gpio = <&gpe2 3 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpe2 3 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -177,7 +177,7 @@ hdmi_en: voltage-regulator-hdmi-5v {
 		regulator-name = "HDMI_5V";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpe0 1 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpe0 1 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/samsung/exynos4212-tab3.dtsi b/arch/arm/boot/dts/samsung/exynos4212-tab3.dtsi
index 9bc05961577d..09c8b085e89e 100644
--- a/arch/arm/boot/dts/samsung/exynos4212-tab3.dtsi
+++ b/arch/arm/boot/dts/samsung/exynos4212-tab3.dtsi
@@ -271,7 +271,7 @@ backlight_reset_supply: voltage-regulator-2 {
 		regulator-name = "BACKLIGHT_ENVDDIO";
 		pinctrl-names = "default";
 		pinctrl-0 = <&backlight_reset>;
-		gpio = <&gpm0 1 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpm0 1 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -282,7 +282,7 @@ display_3v3_supply: voltage-regulator-3 {
 		regulator-max-microvolt = <3300000>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&lcd_en>;
-		gpio = <&gpc0 1 GPIO_ACTIVE_HIGH>; /* LCD_EN */
+		gpios = <&gpc0 1 GPIO_ACTIVE_HIGH>; /* LCD_EN */
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/samsung/exynos4412-galaxy-s3.dtsi b/arch/arm/boot/dts/samsung/exynos4412-galaxy-s3.dtsi
index 54e1a57ae886..f3d804409ce5 100644
--- a/arch/arm/boot/dts/samsung/exynos4412-galaxy-s3.dtsi
+++ b/arch/arm/boot/dts/samsung/exynos4412-galaxy-s3.dtsi
@@ -40,7 +40,7 @@ lcd_vdd3_reg: voltage-regulator-10 {
 		regulator-name = "LCD_VDD_2.2V";
 		regulator-min-microvolt = <2200000>;
 		regulator-max-microvolt = <2200000>;
-		gpio = <&gpc0 1 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpc0 1 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -49,7 +49,7 @@ ps_als_reg: voltage-regulator-11 {
 		regulator-name = "LED_A_3.0V";
 		regulator-min-microvolt = <3000000>;
 		regulator-max-microvolt = <3000000>;
-		gpio = <&gpj0 5 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpj0 5 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -91,12 +91,12 @@ &buck9_reg {
 };
 
 &cam_af_reg {
-	gpio = <&gpm0 4 GPIO_ACTIVE_HIGH>;
+	gpios = <&gpm0 4 GPIO_ACTIVE_HIGH>;
 	status = "okay";
 };
 
 &cam_io_reg {
-	gpio = <&gpm0 2 GPIO_ACTIVE_HIGH>;
+	gpios = <&gpm0 2 GPIO_ACTIVE_HIGH>;
 	status = "okay";
 };
 
@@ -205,11 +205,11 @@ &sound {
 };
 
 &submic_bias_reg {
-	gpio = <&gpf2 0 GPIO_ACTIVE_HIGH>;
+	gpios = <&gpf2 0 GPIO_ACTIVE_HIGH>;
 	enable-active-high;
 };
 
 &touchkey_reg {
-	gpio = <&gpm0 0 GPIO_ACTIVE_HIGH>;
+	gpios = <&gpm0 0 GPIO_ACTIVE_HIGH>;
 	status = "okay";
 };
diff --git a/arch/arm/boot/dts/samsung/exynos4412-midas.dtsi b/arch/arm/boot/dts/samsung/exynos4412-midas.dtsi
index 3d5aace668dc..6e01fdc0a893 100644
--- a/arch/arm/boot/dts/samsung/exynos4412-midas.dtsi
+++ b/arch/arm/boot/dts/samsung/exynos4412-midas.dtsi
@@ -74,7 +74,7 @@ vsil12: voltage-regulator-3 {
 		regulator-name = "VSIL_1.2V";
 		regulator-min-microvolt = <1200000>;
 		regulator-max-microvolt = <1200000>;
-		gpio = <&gpl0 4 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpl0 4 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		vin-supply = <&buck7_reg>;
 	};
@@ -84,7 +84,7 @@ vcc33mhl: voltage-regulator-4 {
 		regulator-name = "VCC_3.3_MHL";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpl0 4 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpl0 4 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -93,7 +93,7 @@ vcc18mhl: voltage-regulator-5 {
 		regulator-name = "VCC_1.8_MHL";
 		regulator-min-microvolt = <1800000>;
 		regulator-max-microvolt = <1800000>;
-		gpio = <&gpl0 4 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpl0 4 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -119,7 +119,7 @@ mic_bias_reg: voltage-regulator-8 {
 		regulator-name = "MICBIAS_LDO_2.8V";
 		regulator-min-microvolt = <2800000>;
 		regulator-max-microvolt = <2800000>;
-		gpio = <&gpf1 7 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpf1 7 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/samsung/exynos4412-n710x.dts b/arch/arm/boot/dts/samsung/exynos4412-n710x.dts
index eee1000dea92..d1fb7eb6322f 100644
--- a/arch/arm/boot/dts/samsung/exynos4412-n710x.dts
+++ b/arch/arm/boot/dts/samsung/exynos4412-n710x.dts
@@ -19,7 +19,7 @@ cam_vdda_reg: voltage-regulator-10 {
 		regulator-name = "CAM_SENSOR_CORE_1.2V";
 		regulator-min-microvolt = <1200000>;
 		regulator-max-microvolt = <1200000>;
-		gpio = <&gpm4 1 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpm4 1 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 };
@@ -29,12 +29,12 @@ &buck9_reg {
 };
 
 &cam_af_reg {
-	gpio = <&gpm1 1 GPIO_ACTIVE_HIGH>;
+	gpios = <&gpm1 1 GPIO_ACTIVE_HIGH>;
 	status = "okay";
 };
 
 &cam_io_reg {
-	gpio = <&gpm0 7 GPIO_ACTIVE_HIGH>;
+	gpios = <&gpm0 7 GPIO_ACTIVE_HIGH>;
 	status = "okay";
 };
 
@@ -110,6 +110,6 @@ &submic_bias_reg {
 };
 
 &touchkey_reg {
-	gpio = <&gpm0 5 GPIO_ACTIVE_HIGH>;
+	gpios = <&gpm0 5 GPIO_ACTIVE_HIGH>;
 	status = "okay";
 };
diff --git a/arch/arm/boot/dts/samsung/exynos4412-odroidu3.dts b/arch/arm/boot/dts/samsung/exynos4412-odroidu3.dts
index b1b0916b1505..81a5a2b67361 100644
--- a/arch/arm/boot/dts/samsung/exynos4412-odroidu3.dts
+++ b/arch/arm/boot/dts/samsung/exynos4412-odroidu3.dts
@@ -31,7 +31,7 @@ vbus_otg_reg: regulator-1 {
 		regulator-name = "VBUS_VDD_5.0V";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpl2 0 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpl2 0 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/samsung/exynos4412-odroidx.dts b/arch/arm/boot/dts/samsung/exynos4412-odroidx.dts
index 0eb8a2680a20..4048de82dad1 100644
--- a/arch/arm/boot/dts/samsung/exynos4412-odroidx.dts
+++ b/arch/arm/boot/dts/samsung/exynos4412-odroidx.dts
@@ -48,7 +48,7 @@ regulator-1 {
 		regulator-name = "p3v3_en";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpa1 1 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpa1 1 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		regulator-always-on;
 	};
diff --git a/arch/arm/boot/dts/samsung/exynos4412-origen.dts b/arch/arm/boot/dts/samsung/exynos4412-origen.dts
index 10ab7bc90f50..9317191d5da6 100644
--- a/arch/arm/boot/dts/samsung/exynos4412-origen.dts
+++ b/arch/arm/boot/dts/samsung/exynos4412-origen.dts
@@ -44,7 +44,7 @@ mmc_reg: regulator-0 {
 		regulator-name = "VMEM_VDD_2.8V";
 		regulator-min-microvolt = <2800000>;
 		regulator-max-microvolt = <2800000>;
-		gpio = <&gpx1 1 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpx1 1 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/samsung/exynos5250-snow-common.dtsi b/arch/arm/boot/dts/samsung/exynos5250-snow-common.dtsi
index 65b000df176e..7b77177e6d52 100644
--- a/arch/arm/boot/dts/samsung/exynos5250-snow-common.dtsi
+++ b/arch/arm/boot/dts/samsung/exynos5250-snow-common.dtsi
@@ -180,7 +180,7 @@ usb3_vbus_reg: regulator-usb3 {
 		regulator-name = "P5.0V_USB3CON";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpx2 7 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpx2 7 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&usb3_vbus_en>;
 		enable-active-high;
diff --git a/arch/arm/boot/dts/samsung/exynos5420-peach-pit.dts b/arch/arm/boot/dts/samsung/exynos5420-peach-pit.dts
index 3759742d38ca..47ee2ef914e3 100644
--- a/arch/arm/boot/dts/samsung/exynos5420-peach-pit.dts
+++ b/arch/arm/boot/dts/samsung/exynos5420-peach-pit.dts
@@ -106,7 +106,7 @@ usb300_vbus_reg: regulator-usb300 {
 		regulator-name = "P5.0V_USB3CON0";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gph0 0 GPIO_ACTIVE_HIGH>;
+		gpios = <&gph0 0 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&usb300_vbus_en>;
 		enable-active-high;
@@ -117,7 +117,7 @@ usb301_vbus_reg: regulator-usb301 {
 		regulator-name = "P5.0V_USB3CON1";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gph0 1 GPIO_ACTIVE_HIGH>;
+		gpios = <&gph0 1 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&usb301_vbus_en>;
 		enable-active-high;
diff --git a/arch/arm/boot/dts/samsung/exynos5420-smdk5420.dts b/arch/arm/boot/dts/samsung/exynos5420-smdk5420.dts
index e299344e427a..4927ba98588c 100644
--- a/arch/arm/boot/dts/samsung/exynos5420-smdk5420.dts
+++ b/arch/arm/boot/dts/samsung/exynos5420-smdk5420.dts
@@ -67,7 +67,7 @@ usb300_vbus_reg: regulator-3 {
 		regulator-name = "VBUS0";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpg0 5 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpg0 5 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&usb300_vbus_en>;
 		enable-active-high;
@@ -78,7 +78,7 @@ usb301_vbus_reg: regulator-4 {
 		regulator-name = "VBUS1";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpg1 4 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpg1 4 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&usb301_vbus_en>;
 		enable-active-high;
diff --git a/arch/arm/boot/dts/samsung/exynos5422-samsung-k3g.dts b/arch/arm/boot/dts/samsung/exynos5422-samsung-k3g.dts
index c35261a338ff..ba3a62ceef58 100644
--- a/arch/arm/boot/dts/samsung/exynos5422-samsung-k3g.dts
+++ b/arch/arm/boot/dts/samsung/exynos5422-samsung-k3g.dts
@@ -45,7 +45,7 @@ tsp_vdd: regulator-tsp-vdd-en {
 		regulator-name = "tsp_vdd_en";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpy3 5 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpy3 5 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 };
diff --git a/arch/arm/boot/dts/samsung/exynos5800-peach-pi.dts b/arch/arm/boot/dts/samsung/exynos5800-peach-pi.dts
index bb019868b996..6cae9a4a331b 100644
--- a/arch/arm/boot/dts/samsung/exynos5800-peach-pi.dts
+++ b/arch/arm/boot/dts/samsung/exynos5800-peach-pi.dts
@@ -106,7 +106,7 @@ usb300_vbus_reg: regulator-usb300 {
 		regulator-name = "P5.0V_USB3CON0";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gph0 0 GPIO_ACTIVE_HIGH>;
+		gpios = <&gph0 0 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&usb300_vbus_en>;
 		enable-active-high;
@@ -117,7 +117,7 @@ usb301_vbus_reg: regulator-usb301 {
 		regulator-name = "P5.0V_USB3CON1";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gph0 1 GPIO_ACTIVE_HIGH>;
+		gpios = <&gph0 1 GPIO_ACTIVE_HIGH>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&usb301_vbus_en>;
 		enable-active-high;
diff --git a/arch/arm/boot/dts/samsung/s5pv210-aquila.dts b/arch/arm/boot/dts/samsung/s5pv210-aquila.dts
index 0f5c6cd0f3a1..2e31bb875475 100644
--- a/arch/arm/boot/dts/samsung/s5pv210-aquila.dts
+++ b/arch/arm/boot/dts/samsung/s5pv210-aquila.dts
@@ -44,7 +44,7 @@ vtf_reg: regulator-0 {
 		regulator-name = "V_TF_2.8V";
 		regulator-min-microvolt = <2800000>;
 		regulator-max-microvolt = <2800000>;
-		gpio = <&mp05 4 GPIO_ACTIVE_HIGH>;
+		gpios = <&mp05 4 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/samsung/s5pv210-aries.dtsi b/arch/arm/boot/dts/samsung/s5pv210-aries.dtsi
index f628d3660493..54c950009563 100644
--- a/arch/arm/boot/dts/samsung/s5pv210-aries.dtsi
+++ b/arch/arm/boot/dts/samsung/s5pv210-aries.dtsi
@@ -63,7 +63,7 @@ vibrator_pwr: regulator-fixed-0 {
 		compatible = "regulator-fixed";
 		regulator-name = "vibrator-en";
 		enable-active-high;
-		gpio = <&gpj1 1 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpj1 1 GPIO_ACTIVE_HIGH>;
 
 		pinctrl-names = "default";
 		pinctrl-0 = <&vibrator_ena>;
@@ -75,7 +75,7 @@ touchkey_vdd: regulator-fixed-1 {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 		enable-active-high;
-		gpio = <&gpj3 2 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpj3 2 GPIO_ACTIVE_HIGH>;
 
 		pinctrl-names = "default";
 		pinctrl-0 = <&touchkey_vdd_ena>;
@@ -85,7 +85,7 @@ gp2a_vled: regulator-fixed-2 {
 		compatible = "regulator-fixed";
 		regulator-name = "VLED";
 		enable-active-high;
-		gpio = <&gpj1 4 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpj1 4 GPIO_ACTIVE_HIGH>;
 		regulator-min-microvolt = <2800000>;
 		regulator-max-microvolt = <2800000>;
 
diff --git a/arch/arm/boot/dts/samsung/s5pv210-fascinate4g.dts b/arch/arm/boot/dts/samsung/s5pv210-fascinate4g.dts
index 149e488f8e74..4990b7197f2c 100644
--- a/arch/arm/boot/dts/samsung/s5pv210-fascinate4g.dts
+++ b/arch/arm/boot/dts/samsung/s5pv210-fascinate4g.dts
@@ -40,7 +40,7 @@ key-vol-up {
 	headset_micbias_reg: regulator-fixed-3 {
 		compatible = "regulator-fixed";
 		regulator-name = "Headset_Micbias";
-		gpio = <&gpj2 5 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpj2 5 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 
 		pinctrl-names = "default";
@@ -50,7 +50,7 @@ headset_micbias_reg: regulator-fixed-3 {
 	main_micbias_reg: regulator-fixed-4 {
 		compatible = "regulator-fixed";
 		regulator-name = "Main_Micbias";
-		gpio = <&gpj4 2 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpj4 2 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 
 		pinctrl-names = "default";
diff --git a/arch/arm/boot/dts/samsung/s5pv210-galaxys.dts b/arch/arm/boot/dts/samsung/s5pv210-galaxys.dts
index 879294412381..8dbc873678ab 100644
--- a/arch/arm/boot/dts/samsung/s5pv210-galaxys.dts
+++ b/arch/arm/boot/dts/samsung/s5pv210-galaxys.dts
@@ -77,7 +77,7 @@ fmradio at 10 {
 	micbias_reg: regulator-fixed-3 {
 		compatible = "regulator-fixed";
 		regulator-name = "MICBIAS";
-		gpio = <&gpj4 2 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpj4 2 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 
 		pinctrl-names = "default";
diff --git a/arch/arm/boot/dts/samsung/s5pv210-goni.dts b/arch/arm/boot/dts/samsung/s5pv210-goni.dts
index d32f42dd1bf5..c9e785e9f3c3 100644
--- a/arch/arm/boot/dts/samsung/s5pv210-goni.dts
+++ b/arch/arm/boot/dts/samsung/s5pv210-goni.dts
@@ -47,7 +47,7 @@ vtf_reg: regulator-0 {
 		regulator-name = "V_TF_2.8V";
 		regulator-min-microvolt = <2800000>;
 		regulator-max-microvolt = <2800000>;
-		gpio = <&mp05 4 GPIO_ACTIVE_HIGH>;
+		gpios = <&mp05 4 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -70,7 +70,7 @@ tsp_reg: regulator-3 {
 		regulator-name = "TSP_VDD";
 		regulator-min-microvolt = <2800000>;
 		regulator-max-microvolt = <2800000>;
-		gpio = <&gpj1 3 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpj1 3 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/st/ste-snowball.dts b/arch/arm/boot/dts/st/ste-snowball.dts
index 1322abfc7acf..2d9f1128f555 100644
--- a/arch/arm/boot/dts/st/ste-snowball.dts
+++ b/arch/arm/boot/dts/st/ste-snowball.dts
@@ -54,7 +54,7 @@ en_3v3_reg: en_3v3 {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 		/* AB8500 GPIOs start from 1 - offset 25 is GPIO26. */
-		gpio = <&ab8500_gpio 25 0x4>;
+		gpios = <&ab8500_gpio 25 0x4>;
 		startup-delay-us = <5000>;
 		enable-active-high;
 	};
diff --git a/arch/arm/boot/dts/st/ste-ux500-samsung-codina-tmo.dts b/arch/arm/boot/dts/st/ste-ux500-samsung-codina-tmo.dts
index c623cc35c5ea..3b0a399dff7f 100644
--- a/arch/arm/boot/dts/st/ste-ux500-samsung-codina-tmo.dts
+++ b/arch/arm/boot/dts/st/ste-ux500-samsung-codina-tmo.dts
@@ -108,7 +108,7 @@ lcd_3v0_reg: regulator-gpio-lcd-3v0 {
 		regulator-min-microvolt = <3000000>;
 		regulator-max-microvolt = <3000000>;
 		/* GPIO219 controls this regulator */
-		gpio = <&gpio6 27 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio6 27 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		pinctrl-names = "default";
 		pinctrl-0 = <&lcd_pwr_en_default_mode>;
@@ -131,7 +131,7 @@ wl_reg: regulator-gpio-wlan {
 		regulator-max-microvolt = <3000000>;
 		startup-delay-us = <100000>;
 		/* GPIO215 (WLAN_RST_N to WL_REG_ON) */
-		gpio = <&gpio6 23 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio6 23 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		pinctrl-names = "default";
 		pinctrl-0 = <&wlan_ldo_en_default>;
diff --git a/arch/arm/boot/dts/st/ste-ux500-samsung-codina.dts b/arch/arm/boot/dts/st/ste-ux500-samsung-codina.dts
index 2355ca6e9ad6..a3149a381b58 100644
--- a/arch/arm/boot/dts/st/ste-ux500-samsung-codina.dts
+++ b/arch/arm/boot/dts/st/ste-ux500-samsung-codina.dts
@@ -122,7 +122,7 @@ ldo_tsp_3v3_reg: regulator-gpio-tsp-ldo-3v3 {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 		/* GPIO94 controls this regulator */
-		gpio = <&gpio2 30 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio2 30 GPIO_ACTIVE_HIGH>;
 		/* 70 ms power-on delay */
 		startup-delay-us = <70000>;
 		enable-active-high;
@@ -136,7 +136,7 @@ ldo_tsp_1v8_reg: regulator-gpio-tsp-ldo-1v8 {
 		regulator-min-microvolt = <1800000>;
 		regulator-max-microvolt = <1800000>;
 		/* GPIO94 controls this regulator */
-		gpio = <&gpio2 30 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio2 30 GPIO_ACTIVE_HIGH>;
 		/* 70 ms power-on delay */
 		startup-delay-us = <70000>;
 		enable-active-high;
@@ -155,7 +155,7 @@ lcd_3v0_reg: regulator-gpio-lcd-3v0 {
 		regulator-min-microvolt = <3000000>;
 		regulator-max-microvolt = <3000000>;
 		/* GPIO219 controls this regulator */
-		gpio = <&gpio6 27 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio6 27 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		pinctrl-names = "default";
 		pinctrl-0 = <&lcd_pwr_en_default_mode>;
@@ -167,7 +167,7 @@ lcd_1v8_reg: regulator-gpio-lcd-1v8 {
 		regulator-min-microvolt = <1800000>;
 		regulator-max-microvolt = <1800000>;
 		/* GPIO219 controls this regulator too */
-		gpio = <&gpio6 27 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio6 27 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		pinctrl-names = "default";
 		pinctrl-0 = <&lcd_pwr_en_default_mode>;
@@ -190,7 +190,7 @@ wl_reg: regulator-gpio-wlan {
 		regulator-max-microvolt = <3000000>;
 		startup-delay-us = <100000>;
 		/* GPIO215 (WLAN_RST_N to WL_REG_ON) */
-		gpio = <&gpio6 23 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio6 23 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		pinctrl-names = "default";
 		pinctrl-0 = <&wlan_ldo_en_default>;
diff --git a/arch/arm/boot/dts/st/ste-ux500-samsung-gavini.dts b/arch/arm/boot/dts/st/ste-ux500-samsung-gavini.dts
index ad9a20ccaaeb..8f4e80bf35fc 100644
--- a/arch/arm/boot/dts/st/ste-ux500-samsung-gavini.dts
+++ b/arch/arm/boot/dts/st/ste-ux500-samsung-gavini.dts
@@ -76,7 +76,7 @@ ldo_3v3_reg: regulator-gpio-ldo-3v3 {
 		regulator-name = "VMEM_3V3";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio0 6 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio0 6 GPIO_ACTIVE_HIGH>;
 		startup-delay-us = <5000>; // FIXME
 		enable-active-high;
 		pinctrl-names = "default";
@@ -95,7 +95,7 @@ ldo_tsp_3v3_reg: regulator-gpio-tsp-ldo-3v3 {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 		/* GPIO94 controls this regulator */
-		gpio = <&gpio2 30 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio2 30 GPIO_ACTIVE_HIGH>;
 		/* 70 ms power-on delay */
 		startup-delay-us = <70000>;
 		enable-active-high;
@@ -109,7 +109,7 @@ ldo_tsp_1v8_reg: regulator-gpio-tsp-ldo-1v8 {
 		regulator-min-microvolt = <1800000>;
 		regulator-max-microvolt = <1800000>;
 		/* GPIO94 controls this regulator */
-		gpio = <&gpio2 30 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio2 30 GPIO_ACTIVE_HIGH>;
 		/* 70 ms power-on delay */
 		startup-delay-us = <70000>;
 		enable-active-high;
@@ -128,7 +128,7 @@ lcd_3v0_reg: regulator-gpio-lcd-3v0 {
 		regulator-min-microvolt = <3000000>;
 		regulator-max-microvolt = <3000000>;
 		/* GPIO219 controls this regulator */
-		gpio = <&gpio6 27 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio6 27 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		pinctrl-names = "default";
 		pinctrl-0 = <&lcd_pwr_en_default_mode>;
@@ -140,7 +140,7 @@ lcd_1v8_reg: regulator-gpio-lcd-1v8 {
 		regulator-min-microvolt = <1800000>;
 		regulator-max-microvolt = <1800000>;
 		/* GPIO219 controls this regulator too */
-		gpio = <&gpio6 27 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio6 27 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		pinctrl-names = "default";
 		pinctrl-0 = <&lcd_pwr_en_default_mode>;
@@ -163,7 +163,7 @@ wl_reg: regulator-gpio-wlan {
 		regulator-max-microvolt = <3000000>;
 		startup-delay-us = <100000>;
 		/* GPIO215 (WLAN_RST_N to WL_REG_ON) */
-		gpio = <&gpio6 23 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio6 23 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		pinctrl-names = "default";
 		pinctrl-0 = <&wlan_ldo_en_default>;
diff --git a/arch/arm/boot/dts/st/ste-ux500-samsung-golden.dts b/arch/arm/boot/dts/st/ste-ux500-samsung-golden.dts
index f736888474e7..8da5222c57b9 100644
--- a/arch/arm/boot/dts/st/ste-ux500-samsung-golden.dts
+++ b/arch/arm/boot/dts/st/ste-ux500-samsung-golden.dts
@@ -459,7 +459,7 @@ vmem_3v3: regulator-vmem {
 		startup-delay-us = <200>;
 
 		/* GPIO223 (MEM_LDO_EN) */
-		gpio = <&gpio6 31 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio6 31 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 
 		pinctrl-names = "default";
@@ -499,7 +499,7 @@ wl_reg_on: regulator-wl-reg-on {
 		startup-delay-us = <100000>;
 
 		/* GPIO215 (WLAN_EN) */
-		gpio = <&gpio6 23 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio6 23 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 
 		pinctrl-names = "default";
@@ -514,7 +514,7 @@ panel_reg_1v8: regulator-panel-1v8 {
 		regulator-min-microvolt = <1800000>;
 		regulator-max-microvolt = <1800000>;
 		/* GPIO219 */
-		gpio = <&gpio6 27 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio6 27 GPIO_ACTIVE_HIGH>;
 
 		startup-delay-us = <200>;
 		enable-active-high;
@@ -531,7 +531,7 @@ panel_reg_3v0: regulator-panel-3v0 {
 		regulator-min-microvolt = <3000000>;
 		regulator-max-microvolt = <3000000>;
 		/* GPIO219 */
-		gpio = <&gpio6 27 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio6 27 GPIO_ACTIVE_HIGH>;
 
 		startup-delay-us = <200>;
 		enable-active-high;
diff --git a/arch/arm/boot/dts/st/ste-ux500-samsung-janice.dts b/arch/arm/boot/dts/st/ste-ux500-samsung-janice.dts
index 229f7c32103c..10b2c1ae9c6b 100644
--- a/arch/arm/boot/dts/st/ste-ux500-samsung-janice.dts
+++ b/arch/arm/boot/dts/st/ste-ux500-samsung-janice.dts
@@ -57,7 +57,7 @@ ldo_3v3_reg: regulator-gpio-ldo-3v3 {
 		regulator-name = "VMEM_3V3";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio0 6 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio0 6 GPIO_ACTIVE_HIGH>;
 		startup-delay-us = <5000>; // FIXME
 		enable-active-high;
 		pinctrl-names = "default";
@@ -76,7 +76,7 @@ ldo_tsp_3v3_reg: regulator-gpio-tsp-ldo-3v3 {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 		/* GPIO94 controls this regulator */
-		gpio = <&gpio2 30 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio2 30 GPIO_ACTIVE_HIGH>;
 		/* 70 ms power-on delay */
 		startup-delay-us = <70000>;
 		enable-active-high;
@@ -90,7 +90,7 @@ ldo_tsp_1v8_reg: regulator-gpio-tsp-ldo-1v8 {
 		regulator-min-microvolt = <1800000>;
 		regulator-max-microvolt = <1800000>;
 		/* GPIO94 controls this regulator */
-		gpio = <&gpio2 30 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio2 30 GPIO_ACTIVE_HIGH>;
 		/* 70 ms power-on delay */
 		startup-delay-us = <70000>;
 		enable-active-high;
@@ -111,7 +111,7 @@ ldo_kled_3v3_reg: regulator-gpio-vreg-kled-3v3 {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 		/* GPIO68 controls this regulator */
-		gpio = <&gpio2 4 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio2 4 GPIO_ACTIVE_HIGH>;
 		/* 70 ms power-on delay */
 		startup-delay-us = <70000>;
 		enable-active-high;
@@ -125,7 +125,7 @@ ldo_touchkey_1v8_reg: regulator-gpio-vreg-touchkey-1v8 {
 		regulator-min-microvolt = <1800000>;
 		regulator-max-microvolt = <1800000>;
 		/* GPIO89 controls this regulator */
-		gpio = <&gpio2 25 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio2 25 GPIO_ACTIVE_HIGH>;
 		/* 70 ms power-on delay */
 		startup-delay-us = <70000>;
 		enable-active-high;
@@ -145,7 +145,7 @@ lcd_3v0_reg: regulator-gpio-lcd-3v0 {
 		regulator-min-microvolt = <3000000>;
 		regulator-max-microvolt = <3000000>;
 		/* GPIO219 controls this regulator */
-		gpio = <&gpio6 27 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio6 27 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		pinctrl-names = "default";
 		pinctrl-0 = <&lcd_pwr_en_default_mode>;
@@ -157,7 +157,7 @@ lcd_1v8_reg: regulator-gpio-lcd-1v8 {
 		regulator-min-microvolt = <1800000>;
 		regulator-max-microvolt = <1800000>;
 		/* GPIO219 controls this regulator */
-		gpio = <&gpio6 27 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio6 27 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		pinctrl-names = "default";
 		pinctrl-0 = <&lcd_pwr_en_default_mode>;
@@ -180,7 +180,7 @@ wl_reg: regulator-gpio-wlan {
 		regulator-max-microvolt = <3000000>;
 		startup-delay-us = <100000>;
 		/* GPIO215 (WLAN_RST_N to WL_REG_ON) */
-		gpio = <&gpio6 23 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio6 23 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		pinctrl-names = "default";
 		pinctrl-0 = <&wlan_ldo_en_default>;
diff --git a/arch/arm/boot/dts/st/ste-ux500-samsung-kyle.dts b/arch/arm/boot/dts/st/ste-ux500-samsung-kyle.dts
index cdb147dcc1db..e2f2003b1dd8 100644
--- a/arch/arm/boot/dts/st/ste-ux500-samsung-kyle.dts
+++ b/arch/arm/boot/dts/st/ste-ux500-samsung-kyle.dts
@@ -79,7 +79,7 @@ ldo_3v3_reg: regulator-gpio-ldo-3v3 {
 		regulator-name = "en-3v3-fixed-supply";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio6 31 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio6 31 GPIO_ACTIVE_HIGH>;
 		startup-delay-us = <5000>;
 		enable-active-high;
 		pinctrl-names = "default";
@@ -97,7 +97,7 @@ lcd_3v0_reg: regulator-gpio-lcd-3v0 {
 		regulator-min-microvolt = <3000000>;
 		regulator-max-microvolt = <3000000>;
 		/* GPIO219 controls this regulator */
-		gpio = <&gpio6 27 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio6 27 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		pinctrl-names = "default";
 		pinctrl-0 = <&lcd_pwr_en_default_mode>;
@@ -109,7 +109,7 @@ lcd_1v8_reg: regulator-gpio-lcd-1v8 {
 		regulator-min-microvolt = <1800000>;
 		regulator-max-microvolt = <1800000>;
 		/* GPIO219 controls this regulator too */
-		gpio = <&gpio6 27 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio6 27 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		pinctrl-names = "default";
 		pinctrl-0 = <&lcd_pwr_en_default_mode>;
@@ -122,7 +122,7 @@ wlan_en: regulator-gpio-wlan-en {
 		regulator-max-microvolt = <3000000>;
 		startup-delay-us = <200000>;
 		/* GPIO215 WLAN_EN */
-		gpio = <&gpio6 23 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio6 23 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		pinctrl-names = "default";
 		pinctrl-0 = <&wlan_en_default_mode>;
diff --git a/arch/arm/boot/dts/st/ste-ux500-samsung-skomer.dts b/arch/arm/boot/dts/st/ste-ux500-samsung-skomer.dts
index 064d6fee8821..392a24f1e1e2 100644
--- a/arch/arm/boot/dts/st/ste-ux500-samsung-skomer.dts
+++ b/arch/arm/boot/dts/st/ste-ux500-samsung-skomer.dts
@@ -75,7 +75,7 @@ ldo_3v3_reg: regulator-gpio-ldo-3v3 {
 		regulator-name = "en-3v3-fixed-supply";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio6 31 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio6 31 GPIO_ACTIVE_HIGH>;
 		startup-delay-us = <5000>;
 		enable-active-high;
 		pinctrl-names = "default";
@@ -89,7 +89,7 @@ wlan_en: regulator-gpio-wlan-en {
 		regulator-max-microvolt = <3000000>;
 		startup-delay-us = <200000>;
 		/* GPIO215 WLAN_EN */
-		gpio = <&gpio6 23 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio6 23 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		pinctrl-names = "default";
 		pinctrl-0 = <&wlan_en_default_mode>;
diff --git a/arch/arm/boot/dts/st/stm32f429-disco.dts b/arch/arm/boot/dts/st/stm32f429-disco.dts
index a3cb4aabdd5a..28dfb65b194d 100644
--- a/arch/arm/boot/dts/st/stm32f429-disco.dts
+++ b/arch/arm/boot/dts/st/stm32f429-disco.dts
@@ -94,7 +94,7 @@ button-0 {
 	/* This turns on vbus for otg for host mode (dwc2) */
 	vcc5v_otg: vcc5v-otg-regulator {
 		compatible = "regulator-fixed";
-		gpio = <&gpioc 4 0>;
+		gpios = <&gpioc 4 0>;
 		regulator-name = "vcc5_host1";
 		regulator-always-on;
 	};
diff --git a/arch/arm/boot/dts/st/stm32f469-disco.dts b/arch/arm/boot/dts/st/stm32f469-disco.dts
index 8a4f8ddd083d..fb30ccfa810f 100644
--- a/arch/arm/boot/dts/st/stm32f469-disco.dts
+++ b/arch/arm/boot/dts/st/stm32f469-disco.dts
@@ -111,7 +111,7 @@ button-0 {
 	vcc5v_otg: vcc5v-otg-regulator {
 		compatible = "regulator-fixed";
 		enable-active-high;
-		gpio = <&gpiob 2 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpiob 2 GPIO_ACTIVE_HIGH>;
 		regulator-name = "vcc5_host1";
 		regulator-always-on;
 	};
diff --git a/arch/arm/boot/dts/st/stm32f746-disco.dts b/arch/arm/boot/dts/st/stm32f746-disco.dts
index 087de6f09629..b64eb9f14eea 100644
--- a/arch/arm/boot/dts/st/stm32f746-disco.dts
+++ b/arch/arm/boot/dts/st/stm32f746-disco.dts
@@ -88,7 +88,7 @@ usbotg_hs_phy: usb-phy {
 	/* This turns on vbus for otg fs for host mode (dwc2) */
 	vcc5v_otg_fs: vcc5v-otg-fs-regulator {
 		compatible = "regulator-fixed";
-		gpio = <&gpiod 5 0>;
+		gpios = <&gpiod 5 0>;
 		regulator-name = "vcc5_host1";
 		regulator-always-on;
 	};
diff --git a/arch/arm/boot/dts/st/stm32mp151a-prtt1c.dts b/arch/arm/boot/dts/st/stm32mp151a-prtt1c.dts
index 3b33b7093b68..8ef5d6c1d5d4 100644
--- a/arch/arm/boot/dts/st/stm32mp151a-prtt1c.dts
+++ b/arch/arm/boot/dts/st/stm32mp151a-prtt1c.dts
@@ -49,7 +49,7 @@ reg_t1l1: regulator-pse-t1l1 {
 		regulator-name = "pse-t1l1";
 		regulator-min-microvolt = <12000000>;
 		regulator-max-microvolt = <12000000>;
-		gpio = <&gpiog 13 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpiog 13 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
@@ -58,7 +58,7 @@ reg_t1l2: regulator-pse-t1l2 {
 		regulator-name = "pse-t1l2";
 		regulator-min-microvolt = <12000000>;
 		regulator-max-microvolt = <12000000>;
-		gpio = <&gpiog 14 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpiog 14 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/st/stm32mp157a-microgea-stm32mp1-microdev2.0-of7.dts b/arch/arm/boot/dts/st/stm32mp157a-microgea-stm32mp1-microdev2.0-of7.dts
index 5116a7785201..65f36a7ed056 100644
--- a/arch/arm/boot/dts/st/stm32mp157a-microgea-stm32mp1-microdev2.0-of7.dts
+++ b/arch/arm/boot/dts/st/stm32mp157a-microgea-stm32mp1-microdev2.0-of7.dts
@@ -37,7 +37,7 @@ lcd_3v3: regulator-lcd-3v3 {
 		regulator-name = "lcd_3v3";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpiof 10 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpiof 10 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		regulator-always-on;
 		power-supply = <&panel_pwr>;
@@ -48,7 +48,7 @@ panel_pwr: regulator-panel-pwr {
 		regulator-name = "panel_pwr";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpiob 10 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpiob 10 GPIO_ACTIVE_HIGH>;
 		regulator-always-on;
 	};
 
diff --git a/arch/arm/boot/dts/st/stm32mp157c-lxa-tac-gen1.dts b/arch/arm/boot/dts/st/stm32mp157c-lxa-tac-gen1.dts
index 81f254fb88b0..4636a248920d 100644
--- a/arch/arm/boot/dts/st/stm32mp157c-lxa-tac-gen1.dts
+++ b/arch/arm/boot/dts/st/stm32mp157c-lxa-tac-gen1.dts
@@ -27,7 +27,7 @@ reg_iobus_12v: regulator-iobus-12v {
 		compatible = "regulator-fixed";
 		vin-supply = <&reg_12v>;
 
-		gpio = <&gpioh 13 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpioh 13 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		regulator-max-microvolt = <12000000>;
 		regulator-min-microvolt = <12000000>;
diff --git a/arch/arm/boot/dts/st/stm32mp157c-lxa-tac-gen2.dts b/arch/arm/boot/dts/st/stm32mp157c-lxa-tac-gen2.dts
index 4cc177031661..8fc518cd6e80 100644
--- a/arch/arm/boot/dts/st/stm32mp157c-lxa-tac-gen2.dts
+++ b/arch/arm/boot/dts/st/stm32mp157c-lxa-tac-gen2.dts
@@ -26,7 +26,7 @@ backlight: backlight {
 	reg_iobus_12v: regulator-iobus-12v {
 		compatible = "regulator-fixed";
 		vin-supply = <&reg_12v>;
-		gpio = <&gpioh 13 GPIO_ACTIVE_LOW>;
+		gpios = <&gpioh 13 GPIO_ACTIVE_LOW>;
 		regulator-max-microvolt = <12000000>;
 		regulator-min-microvolt = <12000000>;
 		regulator-name = "12V_IOBUS";
diff --git a/arch/arm/boot/dts/st/stm32mp15xx-dhcom-som.dtsi b/arch/arm/boot/dts/st/stm32mp15xx-dhcom-som.dtsi
index 74a11ccc5333..ea97efc06e14 100644
--- a/arch/arm/boot/dts/st/stm32mp15xx-dhcom-som.dtsi
+++ b/arch/arm/boot/dts/st/stm32mp15xx-dhcom-som.dtsi
@@ -68,7 +68,7 @@ ethernet_vio: vioregulator {
 		regulator-name = "vio";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpiog 3 GPIO_ACTIVE_LOW>;
+		gpios = <&gpiog 3 GPIO_ACTIVE_LOW>;
 		regulator-always-on;
 		regulator-boot-on;
 		vin-supply = <&vdd>;
diff --git a/arch/arm/boot/dts/st/stm32mp15xx-dhcor-avenger96.dtsi b/arch/arm/boot/dts/st/stm32mp15xx-dhcor-avenger96.dtsi
index 343a4613dfca..56eb9a84990d 100644
--- a/arch/arm/boot/dts/st/stm32mp15xx-dhcor-avenger96.dtsi
+++ b/arch/arm/boot/dts/st/stm32mp15xx-dhcor-avenger96.dtsi
@@ -99,7 +99,7 @@ wlan_pwr: regulator-wlan {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 
-		gpio = <&gpioz 3 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpioz 3 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 };
diff --git a/arch/arm/boot/dts/st/stm32mp15xx-dhcor-drc-compact.dtsi b/arch/arm/boot/dts/st/stm32mp15xx-dhcor-drc-compact.dtsi
index bc4ddcbdd5cf..4cd2949078f5 100644
--- a/arch/arm/boot/dts/st/stm32mp15xx-dhcor-drc-compact.dtsi
+++ b/arch/arm/boot/dts/st/stm32mp15xx-dhcor-drc-compact.dtsi
@@ -41,7 +41,7 @@ ethernet_vio: vioregulator {
 		regulator-name = "vio";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpioh 2 GPIO_ACTIVE_LOW>;
+		gpios = <&gpioh 2 GPIO_ACTIVE_LOW>;
 		regulator-always-on;
 		regulator-boot-on;
 		vin-supply = <&vdd>;
diff --git a/arch/arm/boot/dts/synaptics/berlin2q-marvell-dmp.dts b/arch/arm/boot/dts/synaptics/berlin2q-marvell-dmp.dts
index c162f98cb8e8..e43e53ebcc7a 100644
--- a/arch/arm/boot/dts/synaptics/berlin2q-marvell-dmp.dts
+++ b/arch/arm/boot/dts/synaptics/berlin2q-marvell-dmp.dts
@@ -32,7 +32,7 @@ reg_usb0_vbus: regulator_usb0 {
 			regulator-name = "usb0_vbus";
 			regulator-min-microvolt = <5000000>;
 			regulator-max-microvolt = <5000000>;
-			gpio = <&portb 8 GPIO_ACTIVE_HIGH>;
+			gpios = <&portb 8 GPIO_ACTIVE_HIGH>;
 			enable-active-high;
 		};
 
@@ -41,7 +41,7 @@ reg_usb1_vbus: regulator_usb1 {
 			regulator-name = "usb1_vbus";
 			regulator-min-microvolt = <5000000>;
 			regulator-max-microvolt = <5000000>;
-			gpio = <&portb 10 GPIO_ACTIVE_HIGH>;
+			gpios = <&portb 10 GPIO_ACTIVE_HIGH>;
 			enable-active-high;
 		};
 
@@ -50,7 +50,7 @@ reg_usb2_vbus: regulator_usb2 {
 			regulator-name = "usb2_vbus";
 			regulator-min-microvolt = <5000000>;
 			regulator-max-microvolt = <5000000>;
-			gpio = <&portb 12 GPIO_ACTIVE_HIGH>;
+			gpios = <&portb 12 GPIO_ACTIVE_HIGH>;
 			enable-active-high;
 		};
 
@@ -61,7 +61,7 @@ reg_sdio1_vmmc: regulator_sdio1_vmmc {
 			regulator-name = "sdio1_vmmc";
 			enable-active-high;
 			regulator-boot-on;
-			gpio = <&portb 21 GPIO_ACTIVE_HIGH>;
+			gpios = <&portb 21 GPIO_ACTIVE_HIGH>;
 		};
 
 		reg_sdio1_vqmmc: regulator_sido1_vqmmc {
diff --git a/arch/arm/boot/dts/ti/davinci/da850-evm.dts b/arch/arm/boot/dts/ti/davinci/da850-evm.dts
index 1f5cd35f8b74..7105e70ea34c 100644
--- a/arch/arm/boot/dts/ti/davinci/da850-evm.dts
+++ b/arch/arm/boot/dts/ti/davinci/da850-evm.dts
@@ -118,7 +118,7 @@ backlight_lcd: backlight-regulator {
 		regulator-name = "lcd_backlight_pwr";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio 47 GPIO_ACTIVE_HIGH>; /* lcd_backlight_pwr */
+		gpios = <&gpio 47 GPIO_ACTIVE_HIGH>; /* lcd_backlight_pwr */
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/ti/davinci/da850-lego-ev3.dts b/arch/arm/boot/dts/ti/davinci/da850-lego-ev3.dts
index 4df10379ff22..84bf63f5121d 100644
--- a/arch/arm/boot/dts/ti/davinci/da850-lego-ev3.dts
+++ b/arch/arm/boot/dts/ti/davinci/da850-lego-ev3.dts
@@ -140,7 +140,7 @@ vcc5v: regulator1 {
 		regulator-name = "vcc5v";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio 101 0>;
+		gpios = <&gpio 101 0>;
 		over-current-gpios = <&gpio 99 GPIO_ACTIVE_LOW>;
 		enable-active-high;
 		regulator-boot-on;
@@ -165,7 +165,7 @@ adc_ref: regulator2 {
 	amp: regulator3 {
 		compatible = "regulator-fixed";
 		regulator-name = "amp";
-		gpio = <&gpio 111 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio 111 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/ti/keystone/keystone-k2g-ice.dts b/arch/arm/boot/dts/ti/keystone/keystone-k2g-ice.dts
index 264e1e0d23c8..e058f8bee584 100644
--- a/arch/arm/boot/dts/ti/keystone/keystone-k2g-ice.dts
+++ b/arch/arm/boot/dts/ti/keystone/keystone-k2g-ice.dts
@@ -116,7 +116,7 @@ vddb: fixedregulator-vddb {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 
-		gpio = <&gpio1 53 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 53 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/ti/omap/am335x-baltos.dtsi b/arch/arm/boot/dts/ti/omap/am335x-baltos.dtsi
index a4beb718559c..5f0c5910cc28 100644
--- a/arch/arm/boot/dts/ti/omap/am335x-baltos.dtsi
+++ b/arch/arm/boot/dts/ti/omap/am335x-baltos.dtsi
@@ -41,7 +41,7 @@ wl12xx_vmmc: fixedregulator2 {
 		regulator-name = "vwl1271";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio3 8 0>;
+		gpios = <&gpio3 8 0>;
 		startup-delay-us = <70000>;
 		enable-active-high;
 	};
diff --git a/arch/arm/boot/dts/ti/omap/am335x-boneblack-wireless.dts b/arch/arm/boot/dts/ti/omap/am335x-boneblack-wireless.dts
index b4b4b80df08c..caef1c23e433 100644
--- a/arch/arm/boot/dts/ti/omap/am335x-boneblack-wireless.dts
+++ b/arch/arm/boot/dts/ti/omap/am335x-boneblack-wireless.dts
@@ -22,7 +22,7 @@ wlan_en_reg: fixedregulator at 2 {
 		startup-delay-us = <70000>;
 
 		/* WL_EN */
-		gpio = <&gpio3 9 0>;
+		gpios = <&gpio3 9 0>;
 		enable-active-high;
 	};
 };
diff --git a/arch/arm/boot/dts/ti/omap/am335x-boneblue.dts b/arch/arm/boot/dts/ti/omap/am335x-boneblue.dts
index 8878da773d67..a5eae0ce3b07 100644
--- a/arch/arm/boot/dts/ti/omap/am335x-boneblue.dts
+++ b/arch/arm/boot/dts/ti/omap/am335x-boneblue.dts
@@ -109,7 +109,7 @@ wlan_en_reg: fixedregulator at 2 {
 		startup-delay-us = <70000>;
 
 		/* WL_EN */
-		gpio = <&gpio3 9 0>;
+		gpios = <&gpio3 9 0>;
 		enable-active-high;
 	};
 };
diff --git a/arch/arm/boot/dts/ti/omap/am335x-bonegreen-wireless.dts b/arch/arm/boot/dts/ti/omap/am335x-bonegreen-wireless.dts
index a4f5b5262645..c86079b40bb0 100644
--- a/arch/arm/boot/dts/ti/omap/am335x-bonegreen-wireless.dts
+++ b/arch/arm/boot/dts/ti/omap/am335x-bonegreen-wireless.dts
@@ -21,7 +21,7 @@ wlan_en_reg: fixedregulator at 2 {
 		startup-delay-us = <70000>;
 
 		/* WL_EN */
-		gpio = <&gpio0 26 0>;
+		gpios = <&gpio0 26 0>;
 		enable-active-high;
 	};
 };
diff --git a/arch/arm/boot/dts/ti/omap/am335x-cm-t335.dts b/arch/arm/boot/dts/ti/omap/am335x-cm-t335.dts
index 06767ea164b5..0bf973bee02a 100644
--- a/arch/arm/boot/dts/ti/omap/am335x-cm-t335.dts
+++ b/arch/arm/boot/dts/ti/omap/am335x-cm-t335.dts
@@ -42,7 +42,7 @@ vmmc_fixed: fixedregulator0 {
 	vwlan_fixed: fixedregulator2 {
 		compatible = "regulator-fixed";
 		regulator-name = "vwlan_fixed";
-		gpio = <&gpio0 20 GPIO_ACTIVE_HIGH>; /* gpio0_20 */
+		gpios = <&gpio0 20 GPIO_ACTIVE_HIGH>; /* gpio0_20 */
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/ti/omap/am335x-evm.dts b/arch/arm/boot/dts/ti/omap/am335x-evm.dts
index 61bf8bcd4c4e..61f6ba68e473 100644
--- a/arch/arm/boot/dts/ti/omap/am335x-evm.dts
+++ b/arch/arm/boot/dts/ti/omap/am335x-evm.dts
@@ -47,7 +47,7 @@ wlan_en_reg: fixedregulator2 {
 		regulator-max-microvolt = <1800000>;
 
 		/* WLAN_EN GPIO for this board - Bank1, pin16 */
-		gpio = <&gpio1 16 0>;
+		gpios = <&gpio1 16 0>;
 
 		/* WLAN card specific delay */
 		startup-delay-us = <70000>;
diff --git a/arch/arm/boot/dts/ti/omap/am335x-evmsk.dts b/arch/arm/boot/dts/ti/omap/am335x-evmsk.dts
index eba888dcd60e..cb79c5845556 100644
--- a/arch/arm/boot/dts/ti/omap/am335x-evmsk.dts
+++ b/arch/arm/boot/dts/ti/omap/am335x-evmsk.dts
@@ -54,7 +54,7 @@ wl12xx_vmmc: fixedregulator2 {
 		regulator-name = "vwl1271";
 		regulator-min-microvolt = <1800000>;
 		regulator-max-microvolt = <1800000>;
-		gpio = <&gpio1 29 0>;
+		gpios = <&gpio1 29 0>;
 		startup-delay-us = <70000>;
 		enable-active-high;
 	};
@@ -64,7 +64,7 @@ vtt_fixed: fixedregulator3 {
 		regulator-name = "vtt";
 		regulator-min-microvolt = <1500000>;
 		regulator-max-microvolt = <1500000>;
-		gpio = <&gpio0 7 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio0 7 GPIO_ACTIVE_HIGH>;
 		regulator-always-on;
 		regulator-boot-on;
 		enable-active-high;
diff --git a/arch/arm/boot/dts/ti/omap/am335x-icev2.dts b/arch/arm/boot/dts/ti/omap/am335x-icev2.dts
index 6f0f4fba043b..8e9d4b3cf859 100644
--- a/arch/arm/boot/dts/ti/omap/am335x-icev2.dts
+++ b/arch/arm/boot/dts/ti/omap/am335x-icev2.dts
@@ -38,7 +38,7 @@ vtt_fixed: fixedregulator1 {
 		regulator-name = "vtt";
 		regulator-min-microvolt = <1500000>;
 		regulator-max-microvolt = <1500000>;
-		gpio = <&gpio0 18 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio0 18 GPIO_ACTIVE_HIGH>;
 		regulator-always-on;
 		regulator-boot-on;
 		enable-active-high;
diff --git a/arch/arm/boot/dts/ti/omap/am3517-som.dtsi b/arch/arm/boot/dts/ti/omap/am3517-som.dtsi
index bd0a6c95afa1..e5c72b1ed929 100644
--- a/arch/arm/boot/dts/ti/omap/am3517-som.dtsi
+++ b/arch/arm/boot/dts/ti/omap/am3517-som.dtsi
@@ -19,7 +19,7 @@ wl12xx_buffer: wl12xx_buf {
 		regulator-max-microvolt = <1800000>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&wl12xx_buffer_pins>;
-		gpio = <&gpio5 1 GPIO_ACTIVE_LOW>; /* gpio 129 */
+		gpios = <&gpio5 1 GPIO_ACTIVE_LOW>; /* gpio 129 */
 		regulator-always-on;
 		vin-supply = <&vdd_1v8_reg>;
 	};
@@ -31,7 +31,7 @@ wl12xx_vmmc2: wl12xx_vmmc2 {
 		regulator-max-microvolt = <1800000>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&wl12xx_wkup_pins>;
-		gpio = <&gpio1 3 GPIO_ACTIVE_HIGH >; /* gpio 3 */
+		gpios = <&gpio1 3 GPIO_ACTIVE_HIGH >; /* gpio 3 */
 		startup-delay-us = <70000>;
 		enable-active-high;
 		regulator-always-on;
diff --git a/arch/arm/boot/dts/ti/omap/am437x-gp-evm.dts b/arch/arm/boot/dts/ti/omap/am437x-gp-evm.dts
index f7aad0323d19..87a51e10da8b 100644
--- a/arch/arm/boot/dts/ti/omap/am437x-gp-evm.dts
+++ b/arch/arm/boot/dts/ti/omap/am437x-gp-evm.dts
@@ -40,7 +40,7 @@ vtt_fixed: fixedregulator-vtt {
 		regulator-always-on;
 		regulator-boot-on;
 		enable-active-high;
-		gpio = <&gpio5 7 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio5 7 GPIO_ACTIVE_HIGH>;
 	};
 
 	vmmcwl_fixed: fixedregulator-mmcwl {
@@ -48,7 +48,7 @@ vmmcwl_fixed: fixedregulator-mmcwl {
 		regulator-name = "vmmcwl_fixed";
 		regulator-min-microvolt = <1800000>;
 		regulator-max-microvolt = <1800000>;
-		gpio = <&gpio1 20 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 20 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/ti/omap/am437x-sk-evm.dts b/arch/arm/boot/dts/ti/omap/am437x-sk-evm.dts
index 9c97006ffd5b..a6e2146f1f7a 100644
--- a/arch/arm/boot/dts/ti/omap/am437x-sk-evm.dts
+++ b/arch/arm/boot/dts/ti/omap/am437x-sk-evm.dts
@@ -153,7 +153,7 @@ vmmcwl_fixed: fixedregulator-mmcwl {
 		regulator-name = "vmmcwl_fixed";
 		regulator-min-microvolt = <1800000>;
 		regulator-max-microvolt = <1800000>;
-		gpio = <&gpio4 8 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio4 8 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 };
diff --git a/arch/arm/boot/dts/ti/omap/am57xx-beagle-x15-common.dtsi b/arch/arm/boot/dts/ti/omap/am57xx-beagle-x15-common.dtsi
index 994e69ab38d7..99628a4be5c6 100644
--- a/arch/arm/boot/dts/ti/omap/am57xx-beagle-x15-common.dtsi
+++ b/arch/arm/boot/dts/ti/omap/am57xx-beagle-x15-common.dtsi
@@ -111,7 +111,7 @@ vtt_fixed: fixedregulator-vtt {
 		regulator-always-on;
 		regulator-boot-on;
 		enable-active-high;
-		gpio = <&gpio7 11 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio7 11 GPIO_ACTIVE_HIGH>;
 	};
 
 	leds {
diff --git a/arch/arm/boot/dts/ti/omap/dm8148-t410.dts b/arch/arm/boot/dts/ti/omap/dm8148-t410.dts
index f3e2ecf6d723..032c4ad410f8 100644
--- a/arch/arm/boot/dts/ti/omap/dm8148-t410.dts
+++ b/arch/arm/boot/dts/ti/omap/dm8148-t410.dts
@@ -18,7 +18,7 @@ usb_power: regulator at 9 {
 		regulator-name = "usb_power";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio1 9 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 9 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 		regulator-always-on;
 	};
diff --git a/arch/arm/boot/dts/ti/omap/dra7-evm.dts b/arch/arm/boot/dts/ti/omap/dra7-evm.dts
index 46efbaa67a8e..340417780025 100644
--- a/arch/arm/boot/dts/ti/omap/dra7-evm.dts
+++ b/arch/arm/boot/dts/ti/omap/dra7-evm.dts
@@ -75,7 +75,7 @@ evm_3v3_sd: fixedregulator-sd {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 		enable-active-high;
-		gpio = <&pcf_gpio_21 5 GPIO_ACTIVE_HIGH>;
+		gpios = <&pcf_gpio_21 5 GPIO_ACTIVE_HIGH>;
 	};
 
 	evm_3v3_sw: fixedregulator-evm_3v3_sw {
@@ -132,7 +132,7 @@ vmmcwl_fixed: fixedregulator-mmcwl {
 		regulator-name = "vmmcwl_fixed";
 		regulator-min-microvolt = <1800000>;
 		regulator-max-microvolt = <1800000>;
-		gpio = <&gpio5 8 0>;
+		gpios = <&gpio5 8 0>;
 		startup-delay-us = <70000>;
 		enable-active-high;
 	};
@@ -146,7 +146,7 @@ vtt_fixed: fixedregulator-vtt {
 		regulator-boot-on;
 		enable-active-high;
 		vin-supply = <&sysen2>;
-		gpio = <&gpio7 11 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio7 11 GPIO_ACTIVE_HIGH>;
 	};
 
 };
diff --git a/arch/arm/boot/dts/ti/omap/dra72-evm-common.dtsi b/arch/arm/boot/dts/ti/omap/dra72-evm-common.dtsi
index f8151c61488e..e6d9da119d6d 100644
--- a/arch/arm/boot/dts/ti/omap/dra72-evm-common.dtsi
+++ b/arch/arm/boot/dts/ti/omap/dra72-evm-common.dtsi
@@ -91,7 +91,7 @@ evm_3v3_sd: fixedregulator-sd {
 		regulator-max-microvolt = <3300000>;
 		vin-supply = <&evm_3v3_sw>;
 		enable-active-high;
-		gpio = <&pcf_gpio_21 5 GPIO_ACTIVE_HIGH>;
+		gpios = <&pcf_gpio_21 5 GPIO_ACTIVE_HIGH>;
 	};
 
 	extcon_usb1: extcon_usb1 {
@@ -185,7 +185,7 @@ vmmcwl_fixed: fixedregulator-mmcwl {
 		regulator-name = "vmmcwl_fixed";
 		regulator-min-microvolt = <1800000>;
 		regulator-max-microvolt = <1800000>;
-		gpio = <&gpio5 8 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio5 8 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/ti/omap/dra76-evm.dts b/arch/arm/boot/dts/ti/omap/dra76-evm.dts
index cf9c3d35b049..60bc1c09142b 100644
--- a/arch/arm/boot/dts/ti/omap/dra76-evm.dts
+++ b/arch/arm/boot/dts/ti/omap/dra76-evm.dts
@@ -118,7 +118,7 @@ vio_3v3_sd: fixedregulator-sd {
 		regulator-max-microvolt = <3300000>;
 		vin-supply = <&vio_3v3>;
 		enable-active-high;
-		gpio = <&gpio4 21 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio4 21 GPIO_ACTIVE_HIGH>;
 	};
 
 	vio_1v8: fixedregulator-vio_1v8 {
@@ -134,7 +134,7 @@ vmmcwl_fixed: fixedregulator-mmcwl {
 		regulator-name = "vmmcwl_fixed";
 		regulator-min-microvolt = <1800000>;
 		regulator-max-microvolt = <1800000>;
-		gpio = <&gpio5 8 0>;	/* gpio5_8 */
+		gpios = <&gpio5 8 0>;	/* gpio5_8 */
 		startup-delay-us = <70000>;
 		enable-active-high;
 	};
diff --git a/arch/arm/boot/dts/ti/omap/logicpd-som-lv.dtsi b/arch/arm/boot/dts/ti/omap/logicpd-som-lv.dtsi
index c0e6b73fa472..a4f5907e990f 100644
--- a/arch/arm/boot/dts/ti/omap/logicpd-som-lv.dtsi
+++ b/arch/arm/boot/dts/ti/omap/logicpd-som-lv.dtsi
@@ -19,7 +19,7 @@ wl12xx_vmmc: wl12xx_vmmc {
 		regulator-name = "vwl1271";
 		regulator-min-microvolt = <1800000>;
 		regulator-max-microvolt = <1800000>;
-		gpio = <&gpio1 3 0>;   /* gpio_3 */
+		gpios = <&gpio1 3 0>;   /* gpio_3 */
 		startup-delay-us = <70000>;
 		enable-active-high;
 		vin-supply = <&vaux3>;
diff --git a/arch/arm/boot/dts/ti/omap/logicpd-torpedo-37xx-devkit.dts b/arch/arm/boot/dts/ti/omap/logicpd-torpedo-37xx-devkit.dts
index fbff15a0a0fe..91a83f5b5ad4 100644
--- a/arch/arm/boot/dts/ti/omap/logicpd-torpedo-37xx-devkit.dts
+++ b/arch/arm/boot/dts/ti/omap/logicpd-torpedo-37xx-devkit.dts
@@ -16,7 +16,7 @@ wl12xx_vmmc: wl12xx_vmmc {
 		regulator-name = "vwl1271";
 		regulator-min-microvolt = <1800000>;
 		regulator-max-microvolt = <1800000>;
-		gpio = <&gpio5 29 0>;   /* gpio157 */
+		gpios = <&gpio5 29 0>;   /* gpio157 */
 		startup-delay-us = <70000>;
 		enable-active-high;
 		vin-supply = <&vmmc2>;
diff --git a/arch/arm/boot/dts/ti/omap/motorola-mapphone-common.dtsi b/arch/arm/boot/dts/ti/omap/motorola-mapphone-common.dtsi
index a0c53d9c2625..128a158e7ec9 100644
--- a/arch/arm/boot/dts/ti/omap/motorola-mapphone-common.dtsi
+++ b/arch/arm/boot/dts/ti/omap/motorola-mapphone-common.dtsi
@@ -49,7 +49,7 @@ hdmi_regulator: regulator-hdmi {
 		regulator-name = "hdmi";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio2 27 GPIO_ACTIVE_HIGH>;	/* gpio59 */
+		gpios = <&gpio2 27 GPIO_ACTIVE_HIGH>;	/* gpio59 */
 		enable-active-high;
 		regulator-always-on;
 	};
@@ -60,7 +60,7 @@ wl12xx_vmmc: regulator-wl12xx {
 		regulator-name = "vwl1271";
 		regulator-min-microvolt = <1650000>;
 		regulator-max-microvolt = <1650000>;
-		gpio = <&gpio3 30 GPIO_ACTIVE_HIGH>;	/* gpio94 */
+		gpios = <&gpio3 30 GPIO_ACTIVE_HIGH>;	/* gpio94 */
 		startup-delay-us = <70000>;
 		enable-active-high;
 	};
diff --git a/arch/arm/boot/dts/ti/omap/motorola-mapphone-xt8xx.dtsi b/arch/arm/boot/dts/ti/omap/motorola-mapphone-xt8xx.dtsi
index 8b8de92b5424..90f5f454a767 100644
--- a/arch/arm/boot/dts/ti/omap/motorola-mapphone-xt8xx.dtsi
+++ b/arch/arm/boot/dts/ti/omap/motorola-mapphone-xt8xx.dtsi
@@ -18,7 +18,7 @@ lcd_regulator: regulator-lcd {
 		regulator-name = "lcd";
 		regulator-min-microvolt = <5050000>;
 		regulator-max-microvolt = <5050000>;
-		gpio = <&gpio4 0 GPIO_ACTIVE_HIGH>;	/* gpio96 */
+		gpios = <&gpio4 0 GPIO_ACTIVE_HIGH>;	/* gpio96 */
 		enable-active-high;
 		vin-supply = <&sw5>;
 	};
diff --git a/arch/arm/boot/dts/ti/omap/omap3-beagle-xm.dts b/arch/arm/boot/dts/ti/omap/omap3-beagle-xm.dts
index 08ee0f8ea68f..48e81421e083 100644
--- a/arch/arm/boot/dts/ti/omap/omap3-beagle-xm.dts
+++ b/arch/arm/boot/dts/ti/omap/omap3-beagle-xm.dts
@@ -85,7 +85,7 @@ hsusb2_power: hsusb2_power_reg {
 		regulator-name = "hsusb2_vbus";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&twl_gpio 18 GPIO_ACTIVE_HIGH>;	/* GPIO LEDA */
+		gpios = <&twl_gpio 18 GPIO_ACTIVE_HIGH>;	/* GPIO LEDA */
 		startup-delay-us = <70000>;
 	};
 
diff --git a/arch/arm/boot/dts/ti/omap/omap3-beagle.dts b/arch/arm/boot/dts/ti/omap/omap3-beagle.dts
index 4d9a8eab6abf..9c359f4a8bd8 100644
--- a/arch/arm/boot/dts/ti/omap/omap3-beagle.dts
+++ b/arch/arm/boot/dts/ti/omap/omap3-beagle.dts
@@ -52,7 +52,7 @@ hsusb2_power: hsusb2_power_reg {
 		regulator-name = "hsusb2_vbus";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&twl_gpio 18 GPIO_ACTIVE_HIGH>;	/* GPIO LEDA */
+		gpios = <&twl_gpio 18 GPIO_ACTIVE_HIGH>;	/* GPIO LEDA */
 		startup-delay-us = <70000>;
 	};
 
diff --git a/arch/arm/boot/dts/ti/omap/omap3-cm-t3517.dts b/arch/arm/boot/dts/ti/omap/omap3-cm-t3517.dts
index f776e0527049..618ca6597589 100644
--- a/arch/arm/boot/dts/ti/omap/omap3-cm-t3517.dts
+++ b/arch/arm/boot/dts/ti/omap/omap3-cm-t3517.dts
@@ -28,7 +28,7 @@ &wl12xx_core_pins
 			    >;
 		regulator-min-microvolt = <1800000>;
 		regulator-max-microvolt = <1800000>;
-		gpio = <&gpio1 6 GPIO_ACTIVE_HIGH >; /* gpio6 */
+		gpios = <&gpio1 6 GPIO_ACTIVE_HIGH >; /* gpio6 */
 		startup-delay-us = <20000>;
 		enable-active-high;
 	};
diff --git a/arch/arm/boot/dts/ti/omap/omap3-cm-t3530.dts b/arch/arm/boot/dts/ti/omap/omap3-cm-t3530.dts
index 0c6f14963e5e..46919b860187 100644
--- a/arch/arm/boot/dts/ti/omap/omap3-cm-t3530.dts
+++ b/arch/arm/boot/dts/ti/omap/omap3-cm-t3530.dts
@@ -17,7 +17,7 @@ mmc2_sdio_reset: regulator-mmc2-sdio-reset {
 		regulator-name = "regulator-mmc2-sdio-reset";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&twl_gpio 2 GPIO_ACTIVE_HIGH>;
+		gpios = <&twl_gpio 2 GPIO_ACTIVE_HIGH>;
 		enable-active-high;
 	};
 };
diff --git a/arch/arm/boot/dts/ti/omap/omap3-cm-t3730.dts b/arch/arm/boot/dts/ti/omap/omap3-cm-t3730.dts
index f1a8f0fd7a83..129ae7a20db9 100644
--- a/arch/arm/boot/dts/ti/omap/omap3-cm-t3730.dts
+++ b/arch/arm/boot/dts/ti/omap/omap3-cm-t3730.dts
@@ -18,7 +18,7 @@ wl12xx_vmmc2: wl12xx_vmmc2 {
 		pinctrl-0 = <&wl12xx_gpio>;
 		regulator-min-microvolt = <1800000>;
 		regulator-max-microvolt = <1800000>;
-		gpio = <&gpio3 9 GPIO_ACTIVE_HIGH>;   /* gpio73 */
+		gpios = <&gpio3 9 GPIO_ACTIVE_HIGH>;   /* gpio73 */
 		startup-delay-us = <20000>;
 		enable-active-high;
 	};
diff --git a/arch/arm/boot/dts/ti/omap/omap3-evm-common.dtsi b/arch/arm/boot/dts/ti/omap/omap3-evm-common.dtsi
index 1b6023c4cdf3..5b4bcf2d0386 100644
--- a/arch/arm/boot/dts/ti/omap/omap3-evm-common.dtsi
+++ b/arch/arm/boot/dts/ti/omap/omap3-evm-common.dtsi
@@ -19,7 +19,7 @@ hsusb2_power: hsusb2_power_reg {
 		regulator-name = "hsusb2_vbus";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio1 22 GPIO_ACTIVE_HIGH>; /* gpio_22 */
+		gpios = <&gpio1 22 GPIO_ACTIVE_HIGH>; /* gpio_22 */
 		startup-delay-us = <70000>;
 		enable-active-high;
 	};
@@ -46,7 +46,7 @@ wl12xx_vmmc: wl12xx_vmmc {
 		regulator-name = "vwl1271";
 		regulator-min-microvolt = <1800000>;
 		regulator-max-microvolt = <1800000>;
-		gpio = <&gpio5 22 GPIO_ACTIVE_HIGH>;	/* gpio150 */
+		gpios = <&gpio5 22 GPIO_ACTIVE_HIGH>;	/* gpio150 */
 		startup-delay-us = <70000>;
 		enable-active-high;
 		vin-supply = <&vmmc2>;
@@ -95,7 +95,7 @@ tvp5146 at 5c {
 };
 
 &lcd_3v3 {
-	gpio = <&gpio5 25 GPIO_ACTIVE_LOW>;	/* gpio153 */
+	gpios = <&gpio5 25 GPIO_ACTIVE_LOW>;	/* gpio153 */
 };
 
 &lcd0 {
diff --git a/arch/arm/boot/dts/ti/omap/omap3-gta04a5.dts b/arch/arm/boot/dts/ti/omap/omap3-gta04a5.dts
index 8bd6b4b1f30b..6049926adf7a 100644
--- a/arch/arm/boot/dts/ti/omap/omap3-gta04a5.dts
+++ b/arch/arm/boot/dts/ti/omap/omap3-gta04a5.dts
@@ -20,7 +20,7 @@ wlan_en: wlan_en_regulator {
 		regulator-min-microvolt = <1800000>;
 		regulator-max-microvolt = <1800000>;
 
-		gpio = <&gpio5 10 GPIO_ACTIVE_HIGH>;	/* GPIO_138 */
+		gpios = <&gpio5 10 GPIO_ACTIVE_HIGH>;	/* GPIO_138 */
 
 		startup-delay-us = <70000>;
 		enable-active-high;
diff --git a/arch/arm/boot/dts/ti/omap/omap3-igep0020-common.dtsi b/arch/arm/boot/dts/ti/omap/omap3-igep0020-common.dtsi
index 13f434625407..6422509d0982 100644
--- a/arch/arm/boot/dts/ti/omap/omap3-igep0020-common.dtsi
+++ b/arch/arm/boot/dts/ti/omap/omap3-igep0020-common.dtsi
@@ -46,7 +46,7 @@ hsusb1_power: hsusb1_power_reg {
 		regulator-name = "hsusb1_vbus";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&twl_gpio 18 GPIO_ACTIVE_LOW>;	/* GPIO LEDA */
+		gpios = <&twl_gpio 18 GPIO_ACTIVE_LOW>;	/* GPIO LEDA */
 		startup-delay-us = <70000>;
 	};
 
diff --git a/arch/arm/boot/dts/ti/omap/omap3-igep0020-rev-f.dts b/arch/arm/boot/dts/ti/omap/omap3-igep0020-rev-f.dts
index 316e8e6b39cd..cb3e7bae8ed1 100644
--- a/arch/arm/boot/dts/ti/omap/omap3-igep0020-rev-f.dts
+++ b/arch/arm/boot/dts/ti/omap/omap3-igep0020-rev-f.dts
@@ -18,7 +18,7 @@ lbep5clwmc_wlen: regulator-lbep5clwmc-wlen {
 		regulator-name = "regulator-lbep5clwmc-wlen";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio5 11 GPIO_ACTIVE_HIGH>;		/* gpio_139 - WL_EN */
+		gpios = <&gpio5 11 GPIO_ACTIVE_HIGH>;		/* gpio_139 - WL_EN */
 		enable-active-high;
 	};
 };
diff --git a/arch/arm/boot/dts/ti/omap/omap3-igep0030-rev-g.dts b/arch/arm/boot/dts/ti/omap/omap3-igep0030-rev-g.dts
index fddd7c86fec4..37192dea3d10 100644
--- a/arch/arm/boot/dts/ti/omap/omap3-igep0030-rev-g.dts
+++ b/arch/arm/boot/dts/ti/omap/omap3-igep0030-rev-g.dts
@@ -18,7 +18,7 @@ lbep5clwmc_wlen: regulator-lbep5clwmc-wlen {
 		regulator-name = "regulator-lbep5clwmc-wlen";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio5 11 GPIO_ACTIVE_HIGH>;		/* gpio_139 - WL_EN */
+		gpios = <&gpio5 11 GPIO_ACTIVE_HIGH>;		/* gpio_139 - WL_EN */
 		enable-active-high;
 	};
 };
diff --git a/arch/arm/boot/dts/ti/omap/omap3-n950-n9.dtsi b/arch/arm/boot/dts/ti/omap/omap3-n950-n9.dtsi
index aa4fcdbedd8f..edc4e90d1b13 100644
--- a/arch/arm/boot/dts/ti/omap/omap3-n950-n9.dtsi
+++ b/arch/arm/boot/dts/ti/omap/omap3-n950-n9.dtsi
@@ -24,7 +24,7 @@ vemmc: fixedregulator0 {
 		regulator-name = "VEMMC";
 		regulator-min-microvolt = <2900000>;
 		regulator-max-microvolt = <2900000>;
-		gpio = <&gpio5 29 GPIO_ACTIVE_HIGH>; /* gpio line 157 */
+		gpios = <&gpio5 29 GPIO_ACTIVE_HIGH>; /* gpio line 157 */
 		startup-delay-us = <150>;
 		enable-active-high;
 	};
@@ -32,7 +32,7 @@ vemmc: fixedregulator0 {
 	vwlan_fixed: fixedregulator2 {
 		compatible = "regulator-fixed";
 		regulator-name = "VWLAN";
-		gpio = <&gpio2 3 GPIO_ACTIVE_HIGH>; /* gpio 35 */
+		gpios = <&gpio2 3 GPIO_ACTIVE_HIGH>; /* gpio 35 */
 		enable-active-high;
 	};
 
diff --git a/arch/arm/boot/dts/ti/omap/omap3-overo-base.dtsi b/arch/arm/boot/dts/ti/omap/omap3-overo-base.dtsi
index cc57626ea607..dcb770f8affb 100644
--- a/arch/arm/boot/dts/ti/omap/omap3-overo-base.dtsi
+++ b/arch/arm/boot/dts/ti/omap/omap3-overo-base.dtsi
@@ -38,7 +38,7 @@ hsusb2_power: hsusb2_power_reg {
 		regulator-name = "hsusb2_vbus";
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
-		gpio = <&gpio6 8 GPIO_ACTIVE_HIGH>;		/* gpio_168: vbus enable */
+		gpios = <&gpio6 8 GPIO_ACTIVE_HIGH>;		/* gpio_168: vbus enable */
 		startup-delay-us = <70000>;
 		enable-active-high;
 	};
@@ -57,7 +57,7 @@ w3cbw003c_npoweron: regulator-w3cbw003c-npoweron {
 		regulator-name = "regulator-w3cbw003c-npoweron";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio2 22 GPIO_ACTIVE_HIGH>;		/* gpio_54: nPoweron */
+		gpios = <&gpio2 22 GPIO_ACTIVE_HIGH>;		/* gpio_54: nPoweron */
 		enable-active-high;
 	};
 
@@ -69,7 +69,7 @@ w3cbw003c_wifi_nreset: regulator-w3cbw003c-wifi-nreset {
 		regulator-name = "regulator-w3cbw003c-wifi-nreset";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio1 16 GPIO_ACTIVE_HIGH>;		/* gpio_16: WiFi nReset */
+		gpios = <&gpio1 16 GPIO_ACTIVE_HIGH>;		/* gpio_16: WiFi nReset */
 		startup-delay-us = <10000>;
 	};
 };
diff --git a/arch/arm/boot/dts/ti/omap/omap3-pandora-common.dtsi b/arch/arm/boot/dts/ti/omap/omap3-pandora-common.dtsi
index 06c5b2358999..7a0a2ab9c2a6 100644
--- a/arch/arm/boot/dts/ti/omap/omap3-pandora-common.dtsi
+++ b/arch/arm/boot/dts/ti/omap/omap3-pandora-common.dtsi
@@ -223,7 +223,7 @@ usb_host_5v: fixed-regulator-usb_host_5v {
 		regulator-always-on;
 		regulator-boot-on;
 		enable-active-high;
-		gpio = <&gpio6 4 GPIO_ACTIVE_HIGH>;	/* GPIO_164 */
+		gpios = <&gpio6 4 GPIO_ACTIVE_HIGH>;	/* GPIO_164 */
 	};
 
 	/* wl1251 wifi+bt module */
@@ -234,7 +234,7 @@ wlan_en: fixed-regulator-wg7210_en {
 		regulator-max-microvolt = <1800000>;
 		startup-delay-us = <50000>;
 		enable-active-high;
-		gpio = <&gpio1 23 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 23 GPIO_ACTIVE_HIGH>;
 	};
 
 	/* wg7210 (wifi+bt module) 32k clock buffer */
@@ -245,7 +245,7 @@ wg7210_32k: fixed-regulator-wg7210_32k {
 		regulator-max-microvolt = <1800000>;
 		regulator-always-on;
 		enable-active-high;
-		gpio = <&twl_gpio 13 GPIO_ACTIVE_HIGH>;
+		gpios = <&twl_gpio 13 GPIO_ACTIVE_HIGH>;
 	};
 };
 
diff --git a/arch/arm/boot/dts/ti/omap/omap3-sb-t35.dtsi b/arch/arm/boot/dts/ti/omap/omap3-sb-t35.dtsi
index 6730c749d5ea..636b0e046667 100644
--- a/arch/arm/boot/dts/ti/omap/omap3-sb-t35.dtsi
+++ b/arch/arm/boot/dts/ti/omap/omap3-sb-t35.dtsi
@@ -50,7 +50,7 @@ audio_amp: audio_amp {
 		regulator-name = "audio_amp";
 		pinctrl-names = "default";
 		pinctrl-0 = <&sb_t35_audio_amp>;
-		gpio = <&gpio2 29 GPIO_ACTIVE_LOW>;   /* gpio_61 */
+		gpios = <&gpio2 29 GPIO_ACTIVE_LOW>;   /* gpio_61 */
 		regulator-always-on;
 	};
 };
diff --git a/arch/arm/boot/dts/ti/omap/omap3-tao3530.dtsi b/arch/arm/boot/dts/ti/omap/omap3-tao3530.dtsi
index 92a5846048bd..49e5eddae096 100644
--- a/arch/arm/boot/dts/ti/omap/omap3-tao3530.dtsi
+++ b/arch/arm/boot/dts/ti/omap/omap3-tao3530.dtsi
@@ -38,7 +38,7 @@ hsusb2_power: hsusb2_power_reg {
 		regulator-name = "hsusb2_vbus";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&twl_gpio 18 GPIO_ACTIVE_HIGH>;	/* GPIO LEDA */
+		gpios = <&twl_gpio 18 GPIO_ACTIVE_HIGH>;	/* GPIO LEDA */
 		startup-delay-us = <70000>;
 	};
 
@@ -64,7 +64,7 @@ mmc2_sdio_poweron: regulator-mmc2-sdio-poweron {
 		regulator-name = "regulator-mmc2-sdio-poweron";
 		regulator-min-microvolt = <3150000>;
 		regulator-max-microvolt = <3150000>;
-		gpio = <&gpio5 29 GPIO_ACTIVE_LOW>;		/* gpio_157 */
+		gpios = <&gpio5 29 GPIO_ACTIVE_LOW>;		/* gpio_157 */
 		startup-delay-us = <10000>;
 	};
 };
diff --git a/arch/arm/boot/dts/ti/omap/omap3-zoom3.dts b/arch/arm/boot/dts/ti/omap/omap3-zoom3.dts
index 9f1e125fd77b..d75eea6b4dee 100644
--- a/arch/arm/boot/dts/ti/omap/omap3-zoom3.dts
+++ b/arch/arm/boot/dts/ti/omap/omap3-zoom3.dts
@@ -41,7 +41,7 @@ wl12xx_vmmc: wl12xx_vmmc {
 		regulator-name = "vwl1271";
 		regulator-min-microvolt = <1800000>;
 		regulator-max-microvolt = <1800000>;
-		gpio = <&gpio4 5 GPIO_ACTIVE_HIGH>;	/* gpio101 */
+		gpios = <&gpio4 5 GPIO_ACTIVE_HIGH>;	/* gpio101 */
 		startup-delay-us = <70000>;
 		enable-active-high;
 	};
diff --git a/arch/arm/boot/dts/ti/omap/omap4-duovero.dtsi b/arch/arm/boot/dts/ti/omap/omap4-duovero.dtsi
index b8af455b411a..814405fa1a98 100644
--- a/arch/arm/boot/dts/ti/omap/omap4-duovero.dtsi
+++ b/arch/arm/boot/dts/ti/omap/omap4-duovero.dtsi
@@ -59,7 +59,7 @@ w2cbw0015_vmmc: w2cbw0015_vmmc {
 		regulator-name = "w2cbw0015";
 		regulator-min-microvolt = <3000000>;
 		regulator-max-microvolt = <3000000>;
-		gpio = <&gpio2 11 GPIO_ACTIVE_LOW>;		/* gpio_43 */
+		gpios = <&gpio2 11 GPIO_ACTIVE_LOW>;		/* gpio_43 */
 		startup-delay-us = <70000>;
 		enable-active-high;
 		regulator-boot-on;
diff --git a/arch/arm/boot/dts/ti/omap/omap4-epson-embt2ws.dts b/arch/arm/boot/dts/ti/omap/omap4-epson-embt2ws.dts
index 339e52ba3614..ce42d25a7fba 100644
--- a/arch/arm/boot/dts/ti/omap/omap4-epson-embt2ws.dts
+++ b/arch/arm/boot/dts/ti/omap/omap4-epson-embt2ws.dts
@@ -65,7 +65,7 @@ wl12xx_vmmc: wl12xx-vmmc {
 		regulator-name = "vwl1271";
 		regulator-min-microvolt = <1800000>;
 		regulator-max-microvolt = <1800000>;
-		gpio = <&gpio1 24 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio1 24 GPIO_ACTIVE_HIGH>;
 		startup-delay-us = <70000>;
 		enable-active-high;
 	};
diff --git a/arch/arm/boot/dts/ti/omap/omap4-panda-common.dtsi b/arch/arm/boot/dts/ti/omap/omap4-panda-common.dtsi
index 97706d6296a6..38b421008a5c 100644
--- a/arch/arm/boot/dts/ti/omap/omap4-panda-common.dtsi
+++ b/arch/arm/boot/dts/ti/omap/omap4-panda-common.dtsi
@@ -107,7 +107,7 @@ hsusb1_power: hsusb1_power_reg {
 		regulator-name = "hsusb1_vbus";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio1 1 GPIO_ACTIVE_HIGH>;	/* gpio_1 */
+		gpios = <&gpio1 1 GPIO_ACTIVE_HIGH>;	/* gpio_1 */
 		startup-delay-us = <70000>;
 		enable-active-high;
 		/*
@@ -138,7 +138,7 @@ wl12xx_vmmc: wl12xx_vmmc {
 		regulator-name = "vwl1271";
 		regulator-min-microvolt = <1800000>;
 		regulator-max-microvolt = <1800000>;
-		gpio = <&gpio2 11 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio2 11 GPIO_ACTIVE_HIGH>;
 		startup-delay-us = <70000>;
 		enable-active-high;
 	};
diff --git a/arch/arm/boot/dts/ti/omap/omap4-sdp.dts b/arch/arm/boot/dts/ti/omap/omap4-sdp.dts
index b535d24c6140..d0ec40d521af 100644
--- a/arch/arm/boot/dts/ti/omap/omap4-sdp.dts
+++ b/arch/arm/boot/dts/ti/omap/omap4-sdp.dts
@@ -31,7 +31,7 @@ vdd_eth: fixedregulator-vdd-eth {
 		regulator-name = "VDD_ETH";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		gpio = <&gpio2 16 GPIO_ACTIVE_HIGH>;  /* gpio line 48 */
+		gpios = <&gpio2 16 GPIO_ACTIVE_HIGH>;  /* gpio line 48 */
 		enable-active-high;
 		regulator-boot-on;
 		startup-delay-us = <25000>;
@@ -159,7 +159,7 @@ wl12xx_vmmc: wl12xx_vmmc {
 		regulator-name = "vwl1271";
 		regulator-min-microvolt = <1800000>;
 		regulator-max-microvolt = <1800000>;
-		gpio = <&gpio2 22 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio2 22 GPIO_ACTIVE_HIGH>;
 		startup-delay-us = <70000>;
 		enable-active-high;
 	};
diff --git a/arch/arm/boot/dts/ti/omap/omap4-var-som-om44-wlan.dtsi b/arch/arm/boot/dts/ti/omap/omap4-var-som-om44-wlan.dtsi
index de779d2d7c3e..162cb8f818ef 100644
--- a/arch/arm/boot/dts/ti/omap/omap4-var-som-om44-wlan.dtsi
+++ b/arch/arm/boot/dts/ti/omap/omap4-var-som-om44-wlan.dtsi
@@ -12,7 +12,7 @@ wl12xx_vmmc: wl12xx_vmmc {
 		regulator-name = "vwl1271";
 		regulator-min-microvolt = <1800000>;
 		regulator-max-microvolt = <1800000>;
-		gpio = <&gpio2 11 GPIO_ACTIVE_HIGH>;	/* gpio 43 */
+		gpios = <&gpio2 11 GPIO_ACTIVE_HIGH>;	/* gpio 43 */
 		startup-delay-us = <70000>;
 		enable-active-high;
 	};
diff --git a/arch/arm/boot/dts/ti/omap/omap5-board-common.dtsi b/arch/arm/boot/dts/ti/omap/omap5-board-common.dtsi
index 8946b5580cd9..9851547f984b 100644
--- a/arch/arm/boot/dts/ti/omap/omap5-board-common.dtsi
+++ b/arch/arm/boot/dts/ti/omap/omap5-board-common.dtsi
@@ -48,7 +48,7 @@ vmmcsdio_fixed: fixedregulator-mmcsdio {
 		regulator-name = "vmmcsdio_fixed";
 		regulator-min-microvolt = <1800000>;
 		regulator-max-microvolt = <1800000>;
-		gpio = <&gpio5 12 GPIO_ACTIVE_HIGH>;	/* gpio140 WLAN_EN */
+		gpios = <&gpio5 12 GPIO_ACTIVE_HIGH>;	/* gpio140 WLAN_EN */
 		enable-active-high;
 		startup-delay-us = <70000>;
 		pinctrl-names = "default";
diff --git a/arch/arm/boot/dts/ti/omap/omap5-cm-t54.dts b/arch/arm/boot/dts/ti/omap/omap5-cm-t54.dts
index 6767382996ab..2e356336f192 100644
--- a/arch/arm/boot/dts/ti/omap/omap5-cm-t54.dts
+++ b/arch/arm/boot/dts/ti/omap/omap5-cm-t54.dts
@@ -36,7 +36,7 @@ vwlan_pdn_fixed: fixed-regulator-vwlan-pdn {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 		vin-supply = <&ldo2_reg>;
-		gpio = <&gpio4 13 GPIO_ACTIVE_HIGH>;   /* gpio4_109 */
+		gpios = <&gpio4 13 GPIO_ACTIVE_HIGH>;   /* gpio4_109 */
 		startup-delay-us = <1000>;
 		enable-active-high;
 	};
@@ -47,7 +47,7 @@ vwlan_fixed: fixed-regulator-vwlan {
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 		vin-supply = <&vwlan_pdn_fixed>;
-		gpio = <&gpio4 14 GPIO_ACTIVE_HIGH>;   /* gpio4_110 */
+		gpios = <&gpio4 14 GPIO_ACTIVE_HIGH>;   /* gpio4_110 */
 		startup-delay-us = <1000>;
 		enable-active-high;
 	};
-- 
2.46.2



From rosenp at gmail.com  Mon Sep 30 15:35:50 2024
From: rosenp at gmail.com (Rosen Penev)
Date: Mon, 30 Sep 2024 15:35:50 -0700
Subject: [PATCH 2/2] ARM: dts: assign reg to memory nodes
In-Reply-To: <20240930223550.353882-1-rosenp@gmail.com>
References: <20240930223550.353882-1-rosenp@gmail.com>
Message-ID: <20240930223550.353882-3-rosenp@gmail.com>

Fixes dtc warnings:

Signed-off-by: Rosen Penev <rosenp at gmail.com>
---
 arch/arm/boot/dts/alphascale/alphascale-asm9260.dtsi            | 2 +-
 arch/arm/boot/dts/amazon/alpine.dtsi                            | 2 +-
 arch/arm/boot/dts/amlogic/meson6-atv1200.dts                    | 2 +-
 arch/arm/boot/dts/amlogic/meson8-minix-neo-x8.dts               | 2 +-
 arch/arm/boot/dts/amlogic/meson8b-ec100.dts                     | 2 +-
 arch/arm/boot/dts/amlogic/meson8b-mxq.dts                       | 2 +-
 arch/arm/boot/dts/amlogic/meson8b-odroidc1.dts                  | 2 +-
 arch/arm/boot/dts/amlogic/meson8m2-mxiii-plus.dts               | 2 +-
 arch/arm/boot/dts/arm/arm-realview-eb.dtsi                      | 2 +-
 arch/arm/boot/dts/arm/arm-realview-pb1176.dts                   | 2 +-
 arch/arm/boot/dts/arm/arm-realview-pb11mp.dts                   | 2 +-
 arch/arm/boot/dts/arm/arm-realview-pbx.dtsi                     | 2 +-
 arch/arm/boot/dts/arm/integrator.dtsi                           | 2 +-
 arch/arm/boot/dts/arm/versatile-ab.dts                          | 2 +-
 arch/arm/boot/dts/aspeed/aspeed-bmc-inspur-on5263m5.dts         | 2 +-
 arch/arm/boot/dts/axis/artpec6-devboard.dts                     | 2 +-
 arch/arm/boot/dts/intel/axm/axm5516-amarillo.dts                | 2 +-
 arch/arm/boot/dts/intel/pxa/pxa300-raumfeld-common.dtsi         | 2 +-
 arch/arm/boot/dts/marvell/armada-370-c200-v2.dts                | 2 +-
 arch/arm/boot/dts/marvell/armada-381-netgear-gs110emx.dts       | 2 +-
 arch/arm/boot/dts/marvell/armada-382-rd-ac3x-48g4x2xl.dts       | 2 +-
 arch/arm/boot/dts/marvell/armada-385-atl-x530.dts               | 2 +-
 arch/arm/boot/dts/marvell/armada-385-clearfog-gtr.dtsi          | 2 +-
 arch/arm/boot/dts/marvell/armada-385-db-88f6820-amc.dts         | 2 +-
 arch/arm/boot/dts/marvell/armada-385-db-ap.dts                  | 2 +-
 arch/arm/boot/dts/marvell/armada-385-linksys.dtsi               | 2 +-
 arch/arm/boot/dts/marvell/armada-385-synology-ds116.dts         | 2 +-
 arch/arm/boot/dts/marvell/armada-385-turris-omnia.dts           | 2 +-
 arch/arm/boot/dts/marvell/armada-388-db.dts                     | 2 +-
 arch/arm/boot/dts/marvell/armada-388-gp.dts                     | 2 +-
 arch/arm/boot/dts/marvell/armada-388-helios4.dts                | 2 +-
 arch/arm/boot/dts/marvell/armada-388-rd.dts                     | 2 +-
 arch/arm/boot/dts/marvell/armada-38x-solidrun-microsom.dtsi     | 2 +-
 arch/arm/boot/dts/marvell/armada-390-db.dts                     | 2 +-
 arch/arm/boot/dts/marvell/armada-395-gp.dts                     | 2 +-
 arch/arm/boot/dts/marvell/armada-398-db.dts                     | 2 +-
 arch/arm/boot/dts/marvell/armada-xp-crs305-1g-4s.dtsi           | 2 +-
 arch/arm/boot/dts/marvell/armada-xp-crs326-24g-2s.dtsi          | 2 +-
 arch/arm/boot/dts/marvell/armada-xp-crs328-4c-20s-4s.dtsi       | 2 +-
 arch/arm/boot/dts/marvell/armada-xp-db-dxbc2.dts                | 2 +-
 arch/arm/boot/dts/marvell/armada-xp-db-xc3-24g4xg.dts           | 2 +-
 arch/arm/boot/dts/marvell/dove-cm-a510.dtsi                     | 2 +-
 arch/arm/boot/dts/marvell/dove-cubox.dts                        | 2 +-
 arch/arm/boot/dts/marvell/dove-d2plug.dts                       | 2 +-
 arch/arm/boot/dts/marvell/dove-d3plug.dts                       | 2 +-
 arch/arm/boot/dts/marvell/dove-dove-db.dts                      | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-4i-edge-200.dts              | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-b3.dts                       | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-blackarmor-nas220.dts        | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-cloudbox.dts                 | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-d2net.dts                    | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-db.dtsi                      | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-dir665.dts                   | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-dns320.dts                   | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-dns325.dts                   | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-dockstar.dts                 | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-dreamplug.dts                | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-ds109.dts                    | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-ds110jv10.dts                | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-ds111.dts                    | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-ds112.dts                    | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-ds209.dts                    | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-ds210.dts                    | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-ds212.dts                    | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-ds212j.dts                   | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-ds409.dts                    | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-ds409slim.dts                | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-ds411.dts                    | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-ds411j.dts                   | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-ds411slim.dts                | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-goflexnet.dts                | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-guruplug-server-plus.dts     | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-ib62x0.dts                   | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-iconnect.dts                 | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-iomega_ix2_200.dts           | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-is2.dts                      | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-km_fixedeth.dts              | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-km_kirkwood.dts              | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-l-50.dts                     | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-laplug.dts                   | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-linkstation-lsqvl.dts        | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-linkstation-lsvl.dts         | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-linkstation-lswsxl.dts       | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-linkstation-lswvl.dts        | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-linkstation-lswxl.dts        | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-linksys-viper.dts            | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-lschlv2.dts                  | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-lsxhl.dts                    | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-mplcec4.dts                  | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-mv88f6281gtw-ge.dts          | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-nas2big.dts                  | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-net2big.dts                  | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-net5big.dts                  | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-netgear_readynas_duo_v2.dts  | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-netgear_readynas_nv+_v2.dts  | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-ns2.dts                      | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-ns2lite.dts                  | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-ns2max.dts                   | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-ns2mini.dts                  | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-nsa310.dts                   | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-nsa310a.dts                  | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-nsa310s.dts                  | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-nsa320.dts                   | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-nsa325.dts                   | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-openblocks_a6.dts            | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-openblocks_a7.dts            | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-openrd.dtsi                  | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-pogo_e02.dts                 | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-pogoplug-series-4.dts        | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-rd88f6192.dts                | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-rd88f6281.dtsi               | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-rs212.dts                    | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-rs409.dts                    | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-rs411.dts                    | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-sheevaplug-common.dtsi       | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-t5325.dts                    | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-topkick.dts                  | 2 +-
 arch/arm/boot/dts/marvell/kirkwood-ts219.dtsi                   | 2 +-
 arch/arm/boot/dts/marvell/mmp2-brownstone.dts                   | 2 +-
 arch/arm/boot/dts/marvell/orion5x-kuroboxpro.dts                | 2 +-
 arch/arm/boot/dts/marvell/orion5x-lacie-d2-network.dts          | 2 +-
 .../boot/dts/marvell/orion5x-lacie-ethernet-disk-mini-v2.dts    | 2 +-
 arch/arm/boot/dts/marvell/orion5x-linkstation-lschl.dts         | 2 +-
 arch/arm/boot/dts/marvell/orion5x-linkstation-lsgl.dts          | 2 +-
 arch/arm/boot/dts/marvell/orion5x-linkstation-lswtgl.dts        | 2 +-
 arch/arm/boot/dts/marvell/orion5x-lswsgl.dts                    | 2 +-
 arch/arm/boot/dts/marvell/orion5x-maxtor-shared-storage-2.dts   | 2 +-
 arch/arm/boot/dts/marvell/orion5x-netgear-wnr854t.dts           | 2 +-
 arch/arm/boot/dts/marvell/orion5x-rd88f5182-nas.dts             | 2 +-
 arch/arm/boot/dts/marvell/pxa168-aspenite.dts                   | 2 +-
 arch/arm/boot/dts/marvell/pxa910-dkb.dts                        | 2 +-
 arch/arm/boot/dts/mediatek/mt2701-evb.dts                       | 2 +-
 arch/arm/boot/dts/mediatek/mt6580-evbp1.dts                     | 2 +-
 arch/arm/boot/dts/mediatek/mt6582-prestigio-pmt5008-3g.dts      | 2 +-
 arch/arm/boot/dts/mediatek/mt6589-aquaris5.dts                  | 2 +-
 arch/arm/boot/dts/mediatek/mt6592-evb.dts                       | 2 +-
 arch/arm/boot/dts/mediatek/mt8127-moose.dts                     | 2 +-
 arch/arm/boot/dts/mediatek/mt8135-evbp1.dts                     | 2 +-
 arch/arm/boot/dts/microchip/at91-lmu5000.dts                    | 2 +-
 arch/arm/boot/dts/microchip/at91-q5xr5.dts                      | 2 +-
 arch/arm/boot/dts/moxa/moxart-uc7112lx.dts                      | 2 +-
 arch/arm/boot/dts/nuvoton/nuvoton-npcm730-gbs.dts               | 2 +-
 arch/arm/boot/dts/nuvoton/nuvoton-npcm730-gsj.dts               | 2 +-
 arch/arm/boot/dts/nuvoton/nuvoton-npcm730-kudo.dts              | 2 +-
 arch/arm/boot/dts/nuvoton/nuvoton-npcm750-evb.dts               | 2 +-
 arch/arm/boot/dts/nuvoton/nuvoton-npcm750-runbmc-olympus.dts    | 2 +-
 arch/arm/boot/dts/nvidia/tegra124-nyan.dtsi                     | 2 +-
 arch/arm/boot/dts/qcom/qcom-apq8084.dtsi                        | 2 +-
 arch/arm/boot/dts/qcom/qcom-ipq4019-ap.dk04.1.dtsi              | 2 +-
 arch/arm/boot/dts/qcom/qcom-ipq4019-ap.dk07.1.dtsi              | 2 +-
 arch/arm/boot/dts/qcom/qcom-ipq4019.dtsi                        | 2 +-
 arch/arm/boot/dts/qcom/qcom-ipq8064.dtsi                        | 2 +-
 arch/arm/boot/dts/qcom/qcom-msm8660.dtsi                        | 2 +-
 arch/arm/boot/dts/qcom/qcom-sdx55.dtsi                          | 2 +-
 arch/arm/boot/dts/qcom/qcom-sdx65.dtsi                          | 2 +-
 arch/arm/boot/dts/rockchip/rk3288-phycore-som.dtsi              | 2 +-
 arch/arm/boot/dts/rockchip/rk3288-tinker.dtsi                   | 2 +-
 arch/arm/boot/dts/rockchip/rk3288-veyron.dtsi                   | 2 +-
 arch/arm/boot/dts/rockchip/rk3288-vyasa.dts                     | 2 +-
 arch/arm/boot/dts/sigmastar/mstar-infinity2m-ssd202d.dtsi       | 2 +-
 arch/arm/boot/dts/st/spear1310-evb.dts                          | 2 +-
 arch/arm/boot/dts/st/spear1340-evb.dts                          | 2 +-
 arch/arm/boot/dts/st/spear13xx.dtsi                             | 2 +-
 arch/arm/boot/dts/st/spear300-evb.dts                           | 2 +-
 arch/arm/boot/dts/st/spear310-evb.dts                           | 2 +-
 arch/arm/boot/dts/st/spear320-evb.dts                           | 2 +-
 arch/arm/boot/dts/st/spear320-hmi.dts                           | 2 +-
 arch/arm/boot/dts/st/spear3xx.dtsi                              | 2 +-
 arch/arm/boot/dts/st/spear600-evb.dts                           | 2 +-
 arch/arm/boot/dts/st/spear600.dtsi                              | 2 +-
 arch/arm/boot/dts/st/ste-href.dtsi                              | 2 +-
 arch/arm/boot/dts/st/ste-nomadik-stn8815.dtsi                   | 2 +-
 arch/arm/boot/dts/st/ste-snowball.dts                           | 2 +-
 arch/arm/boot/dts/ti/omap/am335x-moxa-uc-8100-me-t.dts          | 2 +-
 arch/arm/boot/dts/ti/omap/am335x-pdu001.dts                     | 2 +-
 arch/arm/boot/dts/ti/omap/dra71-evm.dts                         | 2 +-
 arch/arm/boot/dts/ti/omap/motorola-mapphone-common.dtsi         | 2 +-
 arch/arm/boot/dts/vt8500/vt8500.dtsi                            | 2 +-
 arch/arm/boot/dts/vt8500/wm8505.dtsi                            | 2 +-
 arch/arm/boot/dts/vt8500/wm8650.dtsi                            | 2 +-
 arch/arm/boot/dts/vt8500/wm8750.dtsi                            | 2 +-
 arch/arm/boot/dts/vt8500/wm8850.dtsi                            | 2 +-
 182 files changed, 182 insertions(+), 182 deletions(-)

diff --git a/arch/arm/boot/dts/alphascale/alphascale-asm9260.dtsi b/arch/arm/boot/dts/alphascale/alphascale-asm9260.dtsi
index 2ce6038536fd..18e89541637a 100644
--- a/arch/arm/boot/dts/alphascale/alphascale-asm9260.dtsi
+++ b/arch/arm/boot/dts/alphascale/alphascale-asm9260.dtsi
@@ -11,7 +11,7 @@ / {
 	#size-cells = <1>;
 	interrupt-parent = <&icoll>;
 
-	memory {
+	memory at 20000000 {
 		device_type = "memory";
 		reg = <0x20000000 0x2000000>;
 	};
diff --git a/arch/arm/boot/dts/amazon/alpine.dtsi b/arch/arm/boot/dts/amazon/alpine.dtsi
index 90bd12feac01..048ae360ad50 100644
--- a/arch/arm/boot/dts/amazon/alpine.dtsi
+++ b/arch/arm/boot/dts/amazon/alpine.dtsi
@@ -32,7 +32,7 @@ / {
 	/* SOC compatibility */
 	compatible = "al,alpine";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0 0 0 0>;
 	};
diff --git a/arch/arm/boot/dts/amlogic/meson6-atv1200.dts b/arch/arm/boot/dts/amlogic/meson6-atv1200.dts
index 98e1c94c0261..735bd977c5a5 100644
--- a/arch/arm/boot/dts/amlogic/meson6-atv1200.dts
+++ b/arch/arm/boot/dts/amlogic/meson6-atv1200.dts
@@ -18,7 +18,7 @@ chosen {
 		stdout-path = "serial0:115200n8";
 	};
 
-	memory {
+	memory at 40000000 {
 		device_type = "memory";
 		reg = <0x40000000 0x80000000>;
 	};
diff --git a/arch/arm/boot/dts/amlogic/meson8-minix-neo-x8.dts b/arch/arm/boot/dts/amlogic/meson8-minix-neo-x8.dts
index c6d1c5a8a3bf..b97531000d55 100644
--- a/arch/arm/boot/dts/amlogic/meson8-minix-neo-x8.dts
+++ b/arch/arm/boot/dts/amlogic/meson8-minix-neo-x8.dts
@@ -19,7 +19,7 @@ chosen {
 		stdout-path = "serial0:115200n8";
 	};
 
-	memory {
+	memory at 40000000 {
 		device_type = "memory";
 		reg = <0x40000000 0x80000000>;
 	};
diff --git a/arch/arm/boot/dts/amlogic/meson8b-ec100.dts b/arch/arm/boot/dts/amlogic/meson8b-ec100.dts
index 77a9a3dfaa69..e508fc1e5eb4 100644
--- a/arch/arm/boot/dts/amlogic/meson8b-ec100.dts
+++ b/arch/arm/boot/dts/amlogic/meson8b-ec100.dts
@@ -22,7 +22,7 @@ chosen {
 		stdout-path = "serial0:115200n8";
 	};
 
-	memory {
+	memory at 40000000 {
 		device_type = "memory";
 		reg = <0x40000000 0x40000000>;
 	};
diff --git a/arch/arm/boot/dts/amlogic/meson8b-mxq.dts b/arch/arm/boot/dts/amlogic/meson8b-mxq.dts
index 7adedd3258c3..fb28cb330f17 100644
--- a/arch/arm/boot/dts/amlogic/meson8b-mxq.dts
+++ b/arch/arm/boot/dts/amlogic/meson8b-mxq.dts
@@ -22,7 +22,7 @@ chosen {
 		stdout-path = "serial0:115200n8";
 	};
 
-	memory {
+	memory at 40000000 {
 		device_type = "memory";
 		reg = <0x40000000 0x40000000>;
 	};
diff --git a/arch/arm/boot/dts/amlogic/meson8b-odroidc1.dts b/arch/arm/boot/dts/amlogic/meson8b-odroidc1.dts
index 926a9063c8a3..397ac7ec3a41 100644
--- a/arch/arm/boot/dts/amlogic/meson8b-odroidc1.dts
+++ b/arch/arm/boot/dts/amlogic/meson8b-odroidc1.dts
@@ -22,7 +22,7 @@ chosen {
 		stdout-path = "serial0:115200n8";
 	};
 
-	memory {
+	memory at 40000000 {
 		device_type = "memory";
 		reg = <0x40000000 0x40000000>;
 	};
diff --git a/arch/arm/boot/dts/amlogic/meson8m2-mxiii-plus.dts b/arch/arm/boot/dts/amlogic/meson8m2-mxiii-plus.dts
index aa4d4bf70629..08aa661e17ad 100644
--- a/arch/arm/boot/dts/amlogic/meson8m2-mxiii-plus.dts
+++ b/arch/arm/boot/dts/amlogic/meson8m2-mxiii-plus.dts
@@ -26,7 +26,7 @@ chosen {
 		stdout-path = "serial0:115200n8";
 	};
 
-	memory {
+	memory at 40000000 {
 		device_type = "memory";
 		reg = <0x40000000 0x80000000>;
 	};
diff --git a/arch/arm/boot/dts/arm/arm-realview-eb.dtsi b/arch/arm/boot/dts/arm/arm-realview-eb.dtsi
index 16f784da5a55..c2e6c47b2555 100644
--- a/arch/arm/boot/dts/arm/arm-realview-eb.dtsi
+++ b/arch/arm/boot/dts/arm/arm-realview-eb.dtsi
@@ -38,7 +38,7 @@ aliases {
 		i2c0 = &i2c;
 	};
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		/* 128 MiB memory @ 0x0 */
 		reg = <0x00000000 0x08000000>;
diff --git a/arch/arm/boot/dts/arm/arm-realview-pb1176.dts b/arch/arm/boot/dts/arm/arm-realview-pb1176.dts
index b9b10cbd65aa..8cd0cde2e946 100644
--- a/arch/arm/boot/dts/arm/arm-realview-pb1176.dts
+++ b/arch/arm/boot/dts/arm/arm-realview-pb1176.dts
@@ -40,7 +40,7 @@ aliases {
 		serial4 = &fpga_serial;
 	};
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		/* 128 MiB memory @ 0x0 */
 		reg = <0x00000000 0x08000000>;
diff --git a/arch/arm/boot/dts/arm/arm-realview-pb11mp.dts b/arch/arm/boot/dts/arm/arm-realview-pb11mp.dts
index db1b6793cd2c..647dd5cdb2ed 100644
--- a/arch/arm/boot/dts/arm/arm-realview-pb11mp.dts
+++ b/arch/arm/boot/dts/arm/arm-realview-pb11mp.dts
@@ -39,7 +39,7 @@ aliases {
 		serial3 = &pb11mp_serial3;
 	};
 
-	memory {
+	memory at 70000000 {
 		device_type = "memory";
 		/*
 		 * The PB11MPCore has 512 MiB memory @ 0x70000000
diff --git a/arch/arm/boot/dts/arm/arm-realview-pbx.dtsi b/arch/arm/boot/dts/arm/arm-realview-pbx.dtsi
index e625403a9456..4966cf408ea9 100644
--- a/arch/arm/boot/dts/arm/arm-realview-pbx.dtsi
+++ b/arch/arm/boot/dts/arm/arm-realview-pbx.dtsi
@@ -39,7 +39,7 @@ aliases {
 		i2c1 = &i2c1;
 	};
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		/* 128 MiB memory @ 0x0 */
 		reg = <0x00000000 0x08000000>;
diff --git a/arch/arm/boot/dts/arm/integrator.dtsi b/arch/arm/boot/dts/arm/integrator.dtsi
index 7f1c8ee9dd8a..a4e394be34e7 100644
--- a/arch/arm/boot/dts/arm/integrator.dtsi
+++ b/arch/arm/boot/dts/arm/integrator.dtsi
@@ -7,7 +7,7 @@ / {
 	#address-cells = <1>;
 	#size-cells = <1>;
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x0 0x0>;
 	};
diff --git a/arch/arm/boot/dts/arm/versatile-ab.dts b/arch/arm/boot/dts/arm/versatile-ab.dts
index 635ab9268899..0ece75ad9bf7 100644
--- a/arch/arm/boot/dts/arm/versatile-ab.dts
+++ b/arch/arm/boot/dts/arm/versatile-ab.dts
@@ -19,7 +19,7 @@ chosen {
 		stdout-path = &uart0;
 	};
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x0 0x08000000>;
 	};
diff --git a/arch/arm/boot/dts/aspeed/aspeed-bmc-inspur-on5263m5.dts b/arch/arm/boot/dts/aspeed/aspeed-bmc-inspur-on5263m5.dts
index 7a78c34cff40..22e19584fff9 100644
--- a/arch/arm/boot/dts/aspeed/aspeed-bmc-inspur-on5263m5.dts
+++ b/arch/arm/boot/dts/aspeed/aspeed-bmc-inspur-on5263m5.dts
@@ -14,7 +14,7 @@ chosen {
 		bootargs = "earlycon";
 	};
 
-	memory {
+	memory at 80000000 {
 		reg = <0x80000000 0x20000000>;
 	};
 
diff --git a/arch/arm/boot/dts/axis/artpec6-devboard.dts b/arch/arm/boot/dts/axis/artpec6-devboard.dts
index 042a9cc920c6..4c9a63cef3fb 100644
--- a/arch/arm/boot/dts/axis/artpec6-devboard.dts
+++ b/arch/arm/boot/dts/axis/artpec6-devboard.dts
@@ -19,7 +19,7 @@ chosen {
 		stdout-path = "serial3:115200n8";
 	};
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x0 0x40000000>;
 	};
diff --git a/arch/arm/boot/dts/intel/axm/axm5516-amarillo.dts b/arch/arm/boot/dts/intel/axm/axm5516-amarillo.dts
index 2e2ad3c7ee77..49f42169cc2e 100644
--- a/arch/arm/boot/dts/intel/axm/axm5516-amarillo.dts
+++ b/arch/arm/boot/dts/intel/axm/axm5516-amarillo.dts
@@ -16,7 +16,7 @@ / {
 	model = "Amarillo AXM5516";
 	compatible = "lsi,axm5516-amarillo", "lsi,axm5516";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0 0x00000000 0x02 0x00000000>;
 	};
diff --git a/arch/arm/boot/dts/intel/pxa/pxa300-raumfeld-common.dtsi b/arch/arm/boot/dts/intel/pxa/pxa300-raumfeld-common.dtsi
index f9bc3b56c4b9..41d99cd6874e 100644
--- a/arch/arm/boot/dts/intel/pxa/pxa300-raumfeld-common.dtsi
+++ b/arch/arm/boot/dts/intel/pxa/pxa300-raumfeld-common.dtsi
@@ -14,7 +14,7 @@ chosen {
 		stdout-path = &ffuart;
 	};
 
-	memory {
+	memory at a0000000 {
 		device_type = "memory";
 		reg = <0xa0000000 0x8000000>;	/* 128 MB */
 	};
diff --git a/arch/arm/boot/dts/marvell/armada-370-c200-v2.dts b/arch/arm/boot/dts/marvell/armada-370-c200-v2.dts
index 84d40e1d70ef..53b231d1657c 100644
--- a/arch/arm/boot/dts/marvell/armada-370-c200-v2.dts
+++ b/arch/arm/boot/dts/marvell/armada-370-c200-v2.dts
@@ -22,7 +22,7 @@ chosen {
 		stdout-path = "serial0:115200n8";
 	};
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x40000000>; /* 1024 MB */
 	};
diff --git a/arch/arm/boot/dts/marvell/armada-381-netgear-gs110emx.dts b/arch/arm/boot/dts/marvell/armada-381-netgear-gs110emx.dts
index 5baf83e5253d..66482f015c6f 100644
--- a/arch/arm/boot/dts/marvell/armada-381-netgear-gs110emx.dts
+++ b/arch/arm/boot/dts/marvell/armada-381-netgear-gs110emx.dts
@@ -31,7 +31,7 @@ key-factory-default {
 		};
 	};
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x08000000>; /* 128 MB */
 	};
diff --git a/arch/arm/boot/dts/marvell/armada-382-rd-ac3x-48g4x2xl.dts b/arch/arm/boot/dts/marvell/armada-382-rd-ac3x-48g4x2xl.dts
index 6ab65d21861a..cd59a0d96cdf 100644
--- a/arch/arm/boot/dts/marvell/armada-382-rd-ac3x-48g4x2xl.dts
+++ b/arch/arm/boot/dts/marvell/armada-382-rd-ac3x-48g4x2xl.dts
@@ -24,7 +24,7 @@ aliases {
 		ethernet0 = &eth1;
 	};
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x20000000>; /* 512MB */
 	};
diff --git a/arch/arm/boot/dts/marvell/armada-385-atl-x530.dts b/arch/arm/boot/dts/marvell/armada-385-atl-x530.dts
index 2fb7304039be..49c14a1fb7f6 100644
--- a/arch/arm/boot/dts/marvell/armada-385-atl-x530.dts
+++ b/arch/arm/boot/dts/marvell/armada-385-atl-x530.dts
@@ -19,7 +19,7 @@ chosen {
 		stdout-path = "serial1:115200n8";
 	};
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x40000000>; /* 1GB */
 	};
diff --git a/arch/arm/boot/dts/marvell/armada-385-clearfog-gtr.dtsi b/arch/arm/boot/dts/marvell/armada-385-clearfog-gtr.dtsi
index 323786853203..2060d370d964 100644
--- a/arch/arm/boot/dts/marvell/armada-385-clearfog-gtr.dtsi
+++ b/arch/arm/boot/dts/marvell/armada-385-clearfog-gtr.dtsi
@@ -81,7 +81,7 @@ chosen {
 		stdout-path = "serial0:115200n8";
 	};
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x10000000>; /* 256 MB */
 	};
diff --git a/arch/arm/boot/dts/marvell/armada-385-db-88f6820-amc.dts b/arch/arm/boot/dts/marvell/armada-385-db-88f6820-amc.dts
index 389d9c75d546..4cb7d59b40a8 100644
--- a/arch/arm/boot/dts/marvell/armada-385-db-88f6820-amc.dts
+++ b/arch/arm/boot/dts/marvell/armada-385-db-88f6820-amc.dts
@@ -25,7 +25,7 @@ aliases {
 		spi1 = &spi1;
 	};
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x80000000>; /* 2GB */
 	};
diff --git a/arch/arm/boot/dts/marvell/armada-385-db-ap.dts b/arch/arm/boot/dts/marvell/armada-385-db-ap.dts
index 112a4b35b81f..1c09f81d5aa1 100644
--- a/arch/arm/boot/dts/marvell/armada-385-db-ap.dts
+++ b/arch/arm/boot/dts/marvell/armada-385-db-ap.dts
@@ -21,7 +21,7 @@ chosen {
 		stdout-path = "serial1:115200n8";
 	};
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x80000000>; /* 2GB */
 	};
diff --git a/arch/arm/boot/dts/marvell/armada-385-linksys.dtsi b/arch/arm/boot/dts/marvell/armada-385-linksys.dtsi
index b98c4da01cea..829a9048ddb5 100644
--- a/arch/arm/boot/dts/marvell/armada-385-linksys.dtsi
+++ b/arch/arm/boot/dts/marvell/armada-385-linksys.dtsi
@@ -18,7 +18,7 @@ chosen {
 		stdout-path = "serial0:115200n8";
 	};
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x20000000>; /* 512 MiB */
 	};
diff --git a/arch/arm/boot/dts/marvell/armada-385-synology-ds116.dts b/arch/arm/boot/dts/marvell/armada-385-synology-ds116.dts
index 752e92fc8d25..1df071cf00df 100644
--- a/arch/arm/boot/dts/marvell/armada-385-synology-ds116.dts
+++ b/arch/arm/boot/dts/marvell/armada-385-synology-ds116.dts
@@ -17,7 +17,7 @@ chosen {
 		stdout-path = "serial0:115200n8";
 	};
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x40000000>; /* 1 GB */
 	};
diff --git a/arch/arm/boot/dts/marvell/armada-385-turris-omnia.dts b/arch/arm/boot/dts/marvell/armada-385-turris-omnia.dts
index 43202890c959..3a3ccfe46b10 100644
--- a/arch/arm/boot/dts/marvell/armada-385-turris-omnia.dts
+++ b/arch/arm/boot/dts/marvell/armada-385-turris-omnia.dts
@@ -29,7 +29,7 @@ aliases {
 		ethernet2 = &eth2;
 	};
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x40000000>; /* 1024 MB */
 	};
diff --git a/arch/arm/boot/dts/marvell/armada-388-db.dts b/arch/arm/boot/dts/marvell/armada-388-db.dts
index 45cc784659fd..bff3643457c5 100644
--- a/arch/arm/boot/dts/marvell/armada-388-db.dts
+++ b/arch/arm/boot/dts/marvell/armada-388-db.dts
@@ -20,7 +20,7 @@ chosen {
 		stdout-path = "serial0:115200n8";
 	};
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x10000000>; /* 256 MB */
 	};
diff --git a/arch/arm/boot/dts/marvell/armada-388-gp.dts b/arch/arm/boot/dts/marvell/armada-388-gp.dts
index 5155ab40d6a3..48f4c3a75ac2 100644
--- a/arch/arm/boot/dts/marvell/armada-388-gp.dts
+++ b/arch/arm/boot/dts/marvell/armada-388-gp.dts
@@ -20,7 +20,7 @@ chosen {
 		stdout-path = "serial0:115200n8";
 	};
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x80000000>; /* 2 GB */
 	};
diff --git a/arch/arm/boot/dts/marvell/armada-388-helios4.dts b/arch/arm/boot/dts/marvell/armada-388-helios4.dts
index d26235d6843c..edd8a512e870 100644
--- a/arch/arm/boot/dts/marvell/armada-388-helios4.dts
+++ b/arch/arm/boot/dts/marvell/armada-388-helios4.dts
@@ -16,7 +16,7 @@ / {
 	compatible = "kobol,helios4", "marvell,armada388",
 		"marvell,armada385", "marvell,armada380";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x80000000>; /* 2 GB */
 	};
diff --git a/arch/arm/boot/dts/marvell/armada-388-rd.dts b/arch/arm/boot/dts/marvell/armada-388-rd.dts
index c0efafd45b33..6ad975ede53b 100644
--- a/arch/arm/boot/dts/marvell/armada-388-rd.dts
+++ b/arch/arm/boot/dts/marvell/armada-388-rd.dts
@@ -21,7 +21,7 @@ chosen {
 		stdout-path = "serial0:115200n8";
 	};
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x10000000>; /* 256 MB */
 	};
diff --git a/arch/arm/boot/dts/marvell/armada-38x-solidrun-microsom.dtsi b/arch/arm/boot/dts/marvell/armada-38x-solidrun-microsom.dtsi
index 2c64bc6e5a17..51d0b7952976 100644
--- a/arch/arm/boot/dts/marvell/armada-38x-solidrun-microsom.dtsi
+++ b/arch/arm/boot/dts/marvell/armada-38x-solidrun-microsom.dtsi
@@ -8,7 +8,7 @@
 #include <dt-bindings/gpio/gpio.h>
 
 / {
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x10000000>; /* 256 MB */
 	};
diff --git a/arch/arm/boot/dts/marvell/armada-390-db.dts b/arch/arm/boot/dts/marvell/armada-390-db.dts
index 20f518dbac97..92b96d4d94ae 100644
--- a/arch/arm/boot/dts/marvell/armada-390-db.dts
+++ b/arch/arm/boot/dts/marvell/armada-390-db.dts
@@ -19,7 +19,7 @@ chosen {
 		stdout-path = "serial0:115200n8";
 	};
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x80000000>; /* 2 GB */
 	};
diff --git a/arch/arm/boot/dts/marvell/armada-395-gp.dts b/arch/arm/boot/dts/marvell/armada-395-gp.dts
index 6dd9e9077f84..853f90003f85 100644
--- a/arch/arm/boot/dts/marvell/armada-395-gp.dts
+++ b/arch/arm/boot/dts/marvell/armada-395-gp.dts
@@ -19,7 +19,7 @@ chosen {
 		stdout-path = "serial0:115200n8";
 	};
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x40000000>; /* 1 GB */
 	};
diff --git a/arch/arm/boot/dts/marvell/armada-398-db.dts b/arch/arm/boot/dts/marvell/armada-398-db.dts
index ec6cdbeedde7..6ed1d6ee73ce 100644
--- a/arch/arm/boot/dts/marvell/armada-398-db.dts
+++ b/arch/arm/boot/dts/marvell/armada-398-db.dts
@@ -18,7 +18,7 @@ chosen {
 		stdout-path = "serial0:115200n8";
 	};
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x80000000>; /* 2 GB */
 	};
diff --git a/arch/arm/boot/dts/marvell/armada-xp-crs305-1g-4s.dtsi b/arch/arm/boot/dts/marvell/armada-xp-crs305-1g-4s.dtsi
index 47b003a81bd4..fee603e04048 100644
--- a/arch/arm/boot/dts/marvell/armada-xp-crs305-1g-4s.dtsi
+++ b/arch/arm/boot/dts/marvell/armada-xp-crs305-1g-4s.dtsi
@@ -28,7 +28,7 @@ chosen {
 		bootargs = "console=ttyS0,115200 earlyprintk";
 	};
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0 0x00000000 0 0x20000000>; /* 512 MB */
 	};
diff --git a/arch/arm/boot/dts/marvell/armada-xp-crs326-24g-2s.dtsi b/arch/arm/boot/dts/marvell/armada-xp-crs326-24g-2s.dtsi
index cab99d8e2911..453581b66bcd 100644
--- a/arch/arm/boot/dts/marvell/armada-xp-crs326-24g-2s.dtsi
+++ b/arch/arm/boot/dts/marvell/armada-xp-crs326-24g-2s.dtsi
@@ -28,7 +28,7 @@ chosen {
 		bootargs = "console=ttyS0,115200 earlyprintk";
 	};
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0 0x00000000 0 0x20000000>; /* 512 MB */
 	};
diff --git a/arch/arm/boot/dts/marvell/armada-xp-crs328-4c-20s-4s.dtsi b/arch/arm/boot/dts/marvell/armada-xp-crs328-4c-20s-4s.dtsi
index 7028482ce4b2..ce37a8532f5d 100644
--- a/arch/arm/boot/dts/marvell/armada-xp-crs328-4c-20s-4s.dtsi
+++ b/arch/arm/boot/dts/marvell/armada-xp-crs328-4c-20s-4s.dtsi
@@ -28,7 +28,7 @@ chosen {
 		bootargs = "console=ttyS0,115200 earlyprintk";
 	};
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0 0x00000000 0 0x20000000>; /* 512 MB */
 	};
diff --git a/arch/arm/boot/dts/marvell/armada-xp-db-dxbc2.dts b/arch/arm/boot/dts/marvell/armada-xp-db-dxbc2.dts
index 02bef8dc4270..33db8c58cb6e 100644
--- a/arch/arm/boot/dts/marvell/armada-xp-db-dxbc2.dts
+++ b/arch/arm/boot/dts/marvell/armada-xp-db-dxbc2.dts
@@ -27,7 +27,7 @@ chosen {
 		bootargs = "console=ttyS0,115200 earlyprintk";
 	};
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0 0x00000000 0 0x20000000>; /* 512 MB */
 	};
diff --git a/arch/arm/boot/dts/marvell/armada-xp-db-xc3-24g4xg.dts b/arch/arm/boot/dts/marvell/armada-xp-db-xc3-24g4xg.dts
index d1b61dad0c46..89d54dfb3a44 100644
--- a/arch/arm/boot/dts/marvell/armada-xp-db-xc3-24g4xg.dts
+++ b/arch/arm/boot/dts/marvell/armada-xp-db-xc3-24g4xg.dts
@@ -27,7 +27,7 @@ chosen {
 		bootargs = "console=ttyS0,115200 earlyprintk";
 	};
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0 0x00000000 0 0x40000000>; /* 1 GB */
 	};
diff --git a/arch/arm/boot/dts/marvell/dove-cm-a510.dtsi b/arch/arm/boot/dts/marvell/dove-cm-a510.dtsi
index f2119efc1e6f..a2fc30d1b6e1 100644
--- a/arch/arm/boot/dts/marvell/dove-cm-a510.dtsi
+++ b/arch/arm/boot/dts/marvell/dove-cm-a510.dtsi
@@ -90,7 +90,7 @@ / {
 	 * Set the minimum memory size here and let the
 	 * bootloader set the real size.
 	 */
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x20000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/dove-cubox.dts b/arch/arm/boot/dts/marvell/dove-cubox.dts
index ff2470c95fb9..86e0f9a9cad5 100644
--- a/arch/arm/boot/dts/marvell/dove-cubox.dts
+++ b/arch/arm/boot/dts/marvell/dove-cubox.dts
@@ -7,7 +7,7 @@ / {
 	model = "SolidRun CuBox";
 	compatible = "solidrun,cubox", "marvell,dove";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x40000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/dove-d2plug.dts b/arch/arm/boot/dts/marvell/dove-d2plug.dts
index 79ee2b32409d..7ee5e6cfdb5b 100644
--- a/arch/arm/boot/dts/marvell/dove-d2plug.dts
+++ b/arch/arm/boot/dts/marvell/dove-d2plug.dts
@@ -7,7 +7,7 @@ / {
 	model = "Globalscale D2Plug";
 	compatible = "globalscale,d2plug", "marvell,dove";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x40000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/dove-d3plug.dts b/arch/arm/boot/dts/marvell/dove-d3plug.dts
index 7c119a977a60..2bd0bd06ffdb 100644
--- a/arch/arm/boot/dts/marvell/dove-d3plug.dts
+++ b/arch/arm/boot/dts/marvell/dove-d3plug.dts
@@ -7,7 +7,7 @@ / {
 	model = "Globalscale D3Plug";
 	compatible = "globalscale,d3plug", "marvell,dove";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x40000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/dove-dove-db.dts b/arch/arm/boot/dts/marvell/dove-dove-db.dts
index c1912dc6bfc3..906c1ac5a58c 100644
--- a/arch/arm/boot/dts/marvell/dove-dove-db.dts
+++ b/arch/arm/boot/dts/marvell/dove-dove-db.dts
@@ -7,7 +7,7 @@ / {
 	model = "Marvell DB-MV88AP510-BP Development Board";
 	compatible = "marvell,dove-db", "marvell,dove";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x40000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-4i-edge-200.dts b/arch/arm/boot/dts/marvell/kirkwood-4i-edge-200.dts
index b1749d3f60b7..db5da7718f48 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-4i-edge-200.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-4i-edge-200.dts
@@ -15,7 +15,7 @@ / {
 	model = "Endian 4i Edge 200";
 	compatible = "endian,4i-edge-200", "marvell,kirkwood-88f6281", "marvell,kirkwood";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x20000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-b3.dts b/arch/arm/boot/dts/marvell/kirkwood-b3.dts
index 681343c1357a..80f081019a4e 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-b3.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-b3.dts
@@ -20,7 +20,7 @@
 / {
 	model = "Excito B3";
 	compatible = "excito,b3", "marvell,kirkwood-88f6281", "marvell,kirkwood";
-	memory { /* 512 MB */
+	memory at 0 { /* 512 MB */
 		device_type = "memory";
 		reg = <0x00000000 0x20000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-blackarmor-nas220.dts b/arch/arm/boot/dts/marvell/kirkwood-blackarmor-nas220.dts
index 96978e8a4cc1..9506a6c6d64e 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-blackarmor-nas220.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-blackarmor-nas220.dts
@@ -17,7 +17,7 @@ / {
 	compatible = "seagate,blackarmor-nas220","marvell,kirkwood-88f6192",
 		     "marvell,kirkwood";
 
-	memory { /* 128 MB */
+	memory at 0 { /* 128 MB */
 		device_type = "memory";
 		reg = <0x00000000 0x8000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-cloudbox.dts b/arch/arm/boot/dts/marvell/kirkwood-cloudbox.dts
index 151edcd140a0..6adceea3add6 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-cloudbox.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-cloudbox.dts
@@ -8,7 +8,7 @@ / {
 	model = "LaCie CloudBox";
 	compatible = "lacie,cloudbox", "marvell,kirkwood-88f6702", "marvell,kirkwood";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x10000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-d2net.dts b/arch/arm/boot/dts/marvell/kirkwood-d2net.dts
index fcce8730d3e3..7b6106558440 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-d2net.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-d2net.dts
@@ -15,7 +15,7 @@ / {
 	model = "LaCie d2 Network v2";
 	compatible = "lacie,d2net_v2", "lacie,netxbig", "marvell,kirkwood-88f6281", "marvell,kirkwood";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x10000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-db.dtsi b/arch/arm/boot/dts/marvell/kirkwood-db.dtsi
index 6fe2e31534af..b716183b7823 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-db.dtsi
+++ b/arch/arm/boot/dts/marvell/kirkwood-db.dtsi
@@ -12,7 +12,7 @@
 #include "kirkwood.dtsi"
 
 / {
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x20000000>; /* 512 MB */
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-dir665.dts b/arch/arm/boot/dts/marvell/kirkwood-dir665.dts
index 2f6793f794cd..d58c804c99c4 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-dir665.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-dir665.dts
@@ -13,7 +13,7 @@ / {
 	model = "D-Link DIR-665";
 	compatible = "dlink,dir-665", "marvell,kirkwood-88f6281", "marvell,kirkwood";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x8000000>; /* 128 MB */
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-dns320.dts b/arch/arm/boot/dts/marvell/kirkwood-dns320.dts
index d8279e0c4c4f..f97ed11b2ea7 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-dns320.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-dns320.dts
@@ -7,7 +7,7 @@ / {
 	model = "D-Link DNS-320 NAS (Rev A1)";
 	compatible = "dlink,dns-320-a1", "dlink,dns-320", "dlink,dns-kirkwood", "marvell,kirkwood-88f6281", "marvell,kirkwood";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x8000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-dns325.dts b/arch/arm/boot/dts/marvell/kirkwood-dns325.dts
index 7f396195e977..a81f57a0ed29 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-dns325.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-dns325.dts
@@ -7,7 +7,7 @@ / {
 	model = "D-Link DNS-325 NAS (Rev A1)";
 	compatible = "dlink,dns-325-a1", "dlink,dns-325", "dlink,dns-kirkwood", "marvell,kirkwood-88f6281", "marvell,kirkwood";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x10000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-dockstar.dts b/arch/arm/boot/dts/marvell/kirkwood-dockstar.dts
index f5af8822d57a..e8c2485ad0fe 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-dockstar.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-dockstar.dts
@@ -8,7 +8,7 @@ / {
 	model = "Seagate FreeAgent Dockstar";
 	compatible = "seagate,dockstar", "marvell,kirkwood-88f6281", "marvell,kirkwood";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x8000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-dreamplug.dts b/arch/arm/boot/dts/marvell/kirkwood-dreamplug.dts
index 590bee3c561c..f38ae13aa474 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-dreamplug.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-dreamplug.dts
@@ -8,7 +8,7 @@ / {
 	model = "Globalscale Technologies Dreamplug";
 	compatible = "globalscale,dreamplug-003-ds2001", "globalscale,dreamplug", "marvell,kirkwood-88f6281", "marvell,kirkwood";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x20000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-ds109.dts b/arch/arm/boot/dts/marvell/kirkwood-ds109.dts
index 29982e7acb7f..a2c7e56de4d1 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-ds109.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-ds109.dts
@@ -16,7 +16,7 @@ / {
 	compatible = "synology,ds109", "synology,ds110jv20",
 		     "synology,ds110", "marvell,kirkwood";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x8000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-ds110jv10.dts b/arch/arm/boot/dts/marvell/kirkwood-ds110jv10.dts
index d68c616e9309..c6611ae6075d 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-ds110jv10.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-ds110jv10.dts
@@ -16,7 +16,7 @@ / {
 	compatible = "synology,ds110jv10", "synology,ds110jv30",
 		     "marvell,kirkwood";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x8000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-ds111.dts b/arch/arm/boot/dts/marvell/kirkwood-ds111.dts
index e1420cbcd7e4..c9a1270a442c 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-ds111.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-ds111.dts
@@ -15,7 +15,7 @@ / {
 	model = "Synology DS111";
 	compatible = "synology,ds111", "marvell,kirkwood";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x8000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-ds112.dts b/arch/arm/boot/dts/marvell/kirkwood-ds112.dts
index 3912f1b525b6..aea52285da8c 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-ds112.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-ds112.dts
@@ -15,7 +15,7 @@ / {
 	model = "Synology DS112";
 	compatible = "synology,ds111", "marvell,kirkwood";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x8000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-ds209.dts b/arch/arm/boot/dts/marvell/kirkwood-ds209.dts
index f41fe95e055f..c327cd56c2c3 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-ds209.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-ds209.dts
@@ -15,7 +15,7 @@ / {
 	model = "Synology DS209";
 	compatible = "synology,ds209", "marvell,kirkwood";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x8000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-ds210.dts b/arch/arm/boot/dts/marvell/kirkwood-ds210.dts
index 729f959a7838..fa312e9cda66 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-ds210.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-ds210.dts
@@ -17,7 +17,7 @@ / {
 		     "synology,ds210jv30", "synology,ds211j",
 		     "marvell,kirkwood";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x8000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-ds212.dts b/arch/arm/boot/dts/marvell/kirkwood-ds212.dts
index 416bab50d170..0e90d74a048e 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-ds212.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-ds212.dts
@@ -18,7 +18,7 @@ / {
 		     "synology,ds213airv10", "synology,ds213v10",
 		     "marvell,kirkwood";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x8000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-ds212j.dts b/arch/arm/boot/dts/marvell/kirkwood-ds212j.dts
index 14cf4d8afaf3..dd31c0614a2c 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-ds212j.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-ds212j.dts
@@ -16,7 +16,7 @@ / {
 	compatible = "synology,ds212jv10", "synology,ds212jv20",
 		     "marvell,kirkwood";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x8000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-ds409.dts b/arch/arm/boot/dts/marvell/kirkwood-ds409.dts
index a8650f9e3eb7..bb0bcc6a36e0 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-ds409.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-ds409.dts
@@ -15,7 +15,7 @@ / {
 	model = "Synology DS409, DS410j";
 	compatible = "synology,ds409", "synology,ds410j", "marvell,kirkwood";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x8000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-ds409slim.dts b/arch/arm/boot/dts/marvell/kirkwood-ds409slim.dts
index 27a1d840bd15..01d1e23a0baa 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-ds409slim.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-ds409slim.dts
@@ -15,7 +15,7 @@ / {
 	model = "Synology 409slim";
 	compatible = "synology,ds409slim", "marvell,kirkwood";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x8000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-ds411.dts b/arch/arm/boot/dts/marvell/kirkwood-ds411.dts
index 1d4256ef325d..e027b710af21 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-ds411.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-ds411.dts
@@ -15,7 +15,7 @@ / {
 	model = "Synology DS411, DS413jv10";
 	compatible = "synology,ds411", "synology,ds413jv10", "marvell,kirkwood";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x8000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-ds411j.dts b/arch/arm/boot/dts/marvell/kirkwood-ds411j.dts
index bb3200daea1e..c6c26a0842d2 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-ds411j.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-ds411j.dts
@@ -15,7 +15,7 @@ / {
 	model = "Synology DS411j";
 	compatible = "synology,ds411j", "marvell,kirkwood";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x8000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-ds411slim.dts b/arch/arm/boot/dts/marvell/kirkwood-ds411slim.dts
index 9c5364a4e0a8..28b619ff9caa 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-ds411slim.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-ds411slim.dts
@@ -15,7 +15,7 @@ / {
 	model = "Synology DS411slim";
 	compatible = "synology,ds411slim", "marvell,kirkwood";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x8000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-goflexnet.dts b/arch/arm/boot/dts/marvell/kirkwood-goflexnet.dts
index c68fca9e77c7..b51b557bdf2b 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-goflexnet.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-goflexnet.dts
@@ -8,7 +8,7 @@ / {
 	model = "Seagate GoFlex Net";
 	compatible = "seagate,goflexnet", "marvell,kirkwood-88f6281", "marvell,kirkwood";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x8000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-guruplug-server-plus.dts b/arch/arm/boot/dts/marvell/kirkwood-guruplug-server-plus.dts
index d5aa8b505cc0..ddbb5c4e265e 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-guruplug-server-plus.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-guruplug-server-plus.dts
@@ -8,7 +8,7 @@ / {
 	model = "Globalscale Technologies Guruplug Server Plus";
 	compatible = "globalscale,guruplug-server-plus", "globalscale,guruplug", "marvell,kirkwood-88f6281", "marvell,kirkwood";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x20000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-ib62x0.dts b/arch/arm/boot/dts/marvell/kirkwood-ib62x0.dts
index 018c6b8f3e8a..5133b3f73d3e 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-ib62x0.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-ib62x0.dts
@@ -8,7 +8,7 @@ / {
 	model = "RaidSonic ICY BOX IB-NAS62x0 (Rev B)";
 	compatible = "raidsonic,ib-nas6210-b", "raidsonic,ib-nas6220-b", "raidsonic,ib-nas6210", "raidsonic,ib-nas6220", "raidsonic,ib-nas62x0", "marvell,kirkwood-88f6281", "marvell,kirkwood";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x10000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-iconnect.dts b/arch/arm/boot/dts/marvell/kirkwood-iconnect.dts
index 91b46e77e0b6..76468d71e8bf 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-iconnect.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-iconnect.dts
@@ -8,7 +8,7 @@ / {
 	model = "Iomega Iconnect";
 	compatible = "iom,iconnect-1.1", "iom,iconnect", "marvell,kirkwood-88f6281", "marvell,kirkwood";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x10000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-iomega_ix2_200.dts b/arch/arm/boot/dts/marvell/kirkwood-iomega_ix2_200.dts
index 039362152650..b0b955b968f1 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-iomega_ix2_200.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-iomega_ix2_200.dts
@@ -8,7 +8,7 @@ / {
 	model = "Iomega StorCenter ix2-200";
 	compatible = "iom,ix2-200", "marvell,kirkwood-88f6281", "marvell,kirkwood";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x10000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-is2.dts b/arch/arm/boot/dts/marvell/kirkwood-is2.dts
index 1bc16a5cdbaa..0160befaa177 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-is2.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-is2.dts
@@ -8,7 +8,7 @@ / {
 	model = "LaCie Internet Space v2";
 	compatible = "lacie,inetspace_v2", "marvell,kirkwood-88f6281", "marvell,kirkwood";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x8000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-km_fixedeth.dts b/arch/arm/boot/dts/marvell/kirkwood-km_fixedeth.dts
index 515be7bccc0a..0e2eceb8d2d8 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-km_fixedeth.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-km_fixedeth.dts
@@ -9,7 +9,7 @@ / {
 	model = "Keymile Kirkwood Fixed Eth";
 	compatible = "keymile,km_fixedeth", "marvell,kirkwood-98DX4122", "marvell,kirkwood";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x10000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-km_kirkwood.dts b/arch/arm/boot/dts/marvell/kirkwood-km_kirkwood.dts
index f035eff1c111..b906344ea406 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-km_kirkwood.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-km_kirkwood.dts
@@ -9,7 +9,7 @@ / {
 	model = "Keymile Kirkwood Reference Design";
 	compatible = "keymile,km_kirkwood", "marvell,kirkwood-98DX4122", "marvell,kirkwood";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x08000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-l-50.dts b/arch/arm/boot/dts/marvell/kirkwood-l-50.dts
index abe432277dac..f7b5f7aa2ee2 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-l-50.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-l-50.dts
@@ -13,7 +13,7 @@ / {
 	model = "Check Point L-50";
 	compatible = "checkpoint,l-50", "marvell,kirkwood-88f6281", "marvell,kirkwood";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x20000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-laplug.dts b/arch/arm/boot/dts/marvell/kirkwood-laplug.dts
index dff87be3afa6..6c27502f876e 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-laplug.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-laplug.dts
@@ -15,7 +15,7 @@ / {
 	model = "LaCie LaPlug";
 	compatible = "lacie,laplug", "marvell,kirkwood-88f6192", "marvell,kirkwood";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x8000000>; /* 128 MB */
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-linkstation-lsqvl.dts b/arch/arm/boot/dts/marvell/kirkwood-linkstation-lsqvl.dts
index 2807942d39f1..d14df0538422 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-linkstation-lsqvl.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-linkstation-lsqvl.dts
@@ -16,7 +16,7 @@ / {
 	model = "Buffalo Linkstation LS-QVL";
 	compatible = "buffalo,lsqvl", "marvell,kirkwood-88f6282", "marvell,kirkwood";
 
-	memory { /* 256 MB */
+	memory at 0 { /* 256 MB */
 		device_type = "memory";
 		reg = <0x00000000 0x10000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-linkstation-lsvl.dts b/arch/arm/boot/dts/marvell/kirkwood-linkstation-lsvl.dts
index 3f2a0bfe03ed..7eab7a8501f2 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-linkstation-lsvl.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-linkstation-lsvl.dts
@@ -13,7 +13,7 @@ / {
 	model = "Buffalo Linkstation LS-VL";
 	compatible = "buffalo,lsvl", "marvell,kirkwood-88f6282", "marvell,kirkwood";
 
-	memory { /* 256 MB */
+	memory at 0 { /* 256 MB */
 		device_type = "memory";
 		reg = <0x00000000 0x10000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-linkstation-lswsxl.dts b/arch/arm/boot/dts/marvell/kirkwood-linkstation-lswsxl.dts
index c42d0da38fe7..e37c05cfd974 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-linkstation-lswsxl.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-linkstation-lswsxl.dts
@@ -13,7 +13,7 @@ / {
 	model = "Buffalo Linkstation LS-WSXL";
 	compatible = "buffalo,lswsxl", "marvell,kirkwood-88f6281", "marvell,kirkwood";
 
-	memory { /* 128 MB */
+	memory at 0 { /* 128 MB */
 		device_type = "memory";
 		reg = <0x00000000 0x8000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-linkstation-lswvl.dts b/arch/arm/boot/dts/marvell/kirkwood-linkstation-lswvl.dts
index 0969619549f6..57e022b6932c 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-linkstation-lswvl.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-linkstation-lswvl.dts
@@ -13,7 +13,7 @@ / {
 	model = "Buffalo Linkstation LS-WVL";
 	compatible = "buffalo,lswvl","marvell,kirkwood-88f6282", "marvell,kirkwood";
 
-	memory { /* 256 MB */
+	memory at 0 { /* 256 MB */
 		device_type = "memory";
 		reg = <0x00000000 0x10000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-linkstation-lswxl.dts b/arch/arm/boot/dts/marvell/kirkwood-linkstation-lswxl.dts
index 0425df8cb91c..6f9fd3fdc389 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-linkstation-lswxl.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-linkstation-lswxl.dts
@@ -13,7 +13,7 @@ / {
 	model = "Buffalo Linkstation LS-WXL";
 	compatible = "buffalo,lswxl", "marvell,kirkwood-88f6281", "marvell,kirkwood";
 
-	memory { /* 128 MB */
+	memory at 0 { /* 128 MB */
 		device_type = "memory";
 		reg = <0x00000000 0x8000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-linksys-viper.dts b/arch/arm/boot/dts/marvell/kirkwood-linksys-viper.dts
index 8a1c38ab6111..230b1a7461e8 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-linksys-viper.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-linksys-viper.dts
@@ -18,7 +18,7 @@ / {
 	model = "Linksys Viper (E4200v2 / EA4500)";
 	compatible = "linksys,viper", "marvell,kirkwood-88f6282", "marvell,kirkwood";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x8000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-lschlv2.dts b/arch/arm/boot/dts/marvell/kirkwood-lschlv2.dts
index 1d737d903f5f..f024ea374206 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-lschlv2.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-lschlv2.dts
@@ -7,7 +7,7 @@ / {
 	model = "Buffalo Linkstation LS-CHLv2";
 	compatible = "buffalo,lschlv2", "buffalo,lsxl", "marvell,kirkwood-88f6281", "marvell,kirkwood";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x4000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-lsxhl.dts b/arch/arm/boot/dts/marvell/kirkwood-lsxhl.dts
index a56e0d797778..483a06d248ba 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-lsxhl.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-lsxhl.dts
@@ -7,7 +7,7 @@ / {
 	model = "Buffalo Linkstation LS-XHL";
 	compatible = "buffalo,lsxhl", "buffalo,lsxl", "marvell,kirkwood-88f6281", "marvell,kirkwood";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x10000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-mplcec4.dts b/arch/arm/boot/dts/marvell/kirkwood-mplcec4.dts
index 6533b49a15b2..fb269d909acb 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-mplcec4.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-mplcec4.dts
@@ -8,7 +8,7 @@ / {
 	model = "MPL CEC4";
 	compatible = "mpl,cec4-10", "mpl,cec4", "marvell,kirkwood-88f6281", "marvell,kirkwood";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x20000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-mv88f6281gtw-ge.dts b/arch/arm/boot/dts/marvell/kirkwood-mv88f6281gtw-ge.dts
index e3b41784c876..033eb310730b 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-mv88f6281gtw-ge.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-mv88f6281gtw-ge.dts
@@ -18,7 +18,7 @@ / {
 	model = "Marvell 88F6281 GTW GE Board";
 	compatible = "marvell,mv88f6281gtw-ge", "marvell,kirkwood-88f6281", "marvell,kirkwood";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x20000000>; /* 512 MB */
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-nas2big.dts b/arch/arm/boot/dts/marvell/kirkwood-nas2big.dts
index b8c594ca9a29..8ea4bcd7f9f4 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-nas2big.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-nas2big.dts
@@ -16,7 +16,7 @@ / {
 	model = "LaCie 2Big NAS";
 	compatible = "lacie,nas2big", "lacie,netxbig", "marvell,kirkwood-88f6282", "marvell,kirkwood";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x10000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-net2big.dts b/arch/arm/boot/dts/marvell/kirkwood-net2big.dts
index 06d80cb1187b..8adeba7fd744 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-net2big.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-net2big.dts
@@ -21,7 +21,7 @@ / {
 	model = "LaCie 2Big Network v2";
 	compatible = "lacie,net2big_v2", "lacie,netxbig", "marvell,kirkwood-88f6281", "marvell,kirkwood";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x10000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-net5big.dts b/arch/arm/boot/dts/marvell/kirkwood-net5big.dts
index 0d36528af27a..59c7ccb3a785 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-net5big.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-net5big.dts
@@ -21,7 +21,7 @@ / {
 	model = "LaCie 5Big Network v2";
 	compatible = "lacie,net5big_v2", "lacie,netxbig", "marvell,kirkwood-88f6281", "marvell,kirkwood";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x20000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-netgear_readynas_duo_v2.dts b/arch/arm/boot/dts/marvell/kirkwood-netgear_readynas_duo_v2.dts
index 94249336d7ed..f0957c7ea15c 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-netgear_readynas_duo_v2.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-netgear_readynas_duo_v2.dts
@@ -14,7 +14,7 @@ / {
 	model = "NETGEAR ReadyNAS Duo v2";
 	compatible = "netgear,readynas-duo-v2", "netgear,readynas", "marvell,kirkwood-88f6282", "marvell,kirkwood";
 
-	memory { /* 256 MB */
+	memory at 0 { /* 256 MB */
 		device_type = "memory";
 		reg = <0x00000000 0x10000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-netgear_readynas_nv+_v2.dts b/arch/arm/boot/dts/marvell/kirkwood-netgear_readynas_nv+_v2.dts
index e1f7952e0ee3..6bada0ef96cc 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-netgear_readynas_nv+_v2.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-netgear_readynas_nv+_v2.dts
@@ -14,7 +14,7 @@ / {
 	model = "NETGEAR ReadyNAS NV+ v2";
 	compatible = "netgear,readynas-nv+-v2", "netgear,readynas", "marvell,kirkwood-88f6282", "marvell,kirkwood";
 
-	memory { /* 256 MB */
+	memory at 0 { /* 256 MB */
 		device_type = "memory";
 		reg = <0x00000000 0x10000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-ns2.dts b/arch/arm/boot/dts/marvell/kirkwood-ns2.dts
index 7b67083e1ec0..fc7dcbafa4a0 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-ns2.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-ns2.dts
@@ -8,7 +8,7 @@ / {
 	model = "LaCie Network Space v2";
 	compatible = "lacie,netspace_v2", "marvell,kirkwood-88f6281", "marvell,kirkwood";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x10000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-ns2lite.dts b/arch/arm/boot/dts/marvell/kirkwood-ns2lite.dts
index 686bcd6f0f3c..bec1fd56a5b3 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-ns2lite.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-ns2lite.dts
@@ -7,7 +7,7 @@ / {
 	model = "LaCie Network Space Lite v2";
 	compatible = "lacie,netspace_lite_v2", "marvell,kirkwood-88f6192", "marvell,kirkwood";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x8000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-ns2max.dts b/arch/arm/boot/dts/marvell/kirkwood-ns2max.dts
index 044958bc55da..710cc1ed7dc6 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-ns2max.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-ns2max.dts
@@ -8,7 +8,7 @@ / {
 	model = "LaCie Network Space Max v2";
 	compatible = "lacie,netspace_max_v2", "marvell,kirkwood-88f6281", "marvell,kirkwood";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x10000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-ns2mini.dts b/arch/arm/boot/dts/marvell/kirkwood-ns2mini.dts
index 3fbe008f9141..c613795d8e42 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-ns2mini.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-ns2mini.dts
@@ -9,7 +9,7 @@ / {
 	model = "LaCie Network Space Mini v2";
 	compatible = "lacie,netspace_mini_v2", "marvell,kirkwood-88f6192", "marvell,kirkwood";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x8000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-nsa310.dts b/arch/arm/boot/dts/marvell/kirkwood-nsa310.dts
index 3555ac1c3b15..3b20b81bb0a6 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-nsa310.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-nsa310.dts
@@ -6,7 +6,7 @@
 / {
 	compatible = "zyxel,nsa310", "marvell,kirkwood-88f6281", "marvell,kirkwood";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x10000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-nsa310a.dts b/arch/arm/boot/dts/marvell/kirkwood-nsa310a.dts
index ddf84092aade..7e89abeb5be4 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-nsa310a.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-nsa310a.dts
@@ -11,7 +11,7 @@
 / {
 	compatible = "zyxel,nsa310a", "zyxel,nsa310", "marvell,kirkwood-88f6281", "marvell,kirkwood";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x10000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-nsa310s.dts b/arch/arm/boot/dts/marvell/kirkwood-nsa310s.dts
index 8db7198741e2..36cbda2fe271 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-nsa310s.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-nsa310s.dts
@@ -16,7 +16,7 @@ / {
 	model = "ZyXEL NSA310S";
 	compatible = "zyxel,nsa310s", "marvell,kirkwood-88f6702", "marvell,kirkwood";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x10000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-nsa320.dts b/arch/arm/boot/dts/marvell/kirkwood-nsa320.dts
index dd5c8ffc8781..7c4b2e786c52 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-nsa320.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-nsa320.dts
@@ -14,7 +14,7 @@ / {
 	model = "Zyxel NSA320";
 	compatible = "zyxel,nsa320", "marvell,kirkwood-88f6281", "marvell,kirkwood";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x20000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-nsa325.dts b/arch/arm/boot/dts/marvell/kirkwood-nsa325.dts
index a6f8a4a72eb8..6516af249eea 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-nsa325.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-nsa325.dts
@@ -15,7 +15,7 @@ / {
 	model = "ZyXEL NSA325";
 	compatible = "zyxel,nsa325", "marvell,kirkwood-88f6282", "marvell,kirkwood";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x20000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-openblocks_a6.dts b/arch/arm/boot/dts/marvell/kirkwood-openblocks_a6.dts
index 20c6290d2037..ed37514dfe76 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-openblocks_a6.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-openblocks_a6.dts
@@ -8,7 +8,7 @@ / {
 	model = "Plat'Home OpenBlocksA6";
 	compatible = "plathome,openblocks-a6", "marvell,kirkwood-88f6283", "marvell,kirkwood";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x20000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-openblocks_a7.dts b/arch/arm/boot/dts/marvell/kirkwood-openblocks_a7.dts
index 9c438f10f737..f8260e7d15e1 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-openblocks_a7.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-openblocks_a7.dts
@@ -17,7 +17,7 @@ / {
 	model = "Plat'Home OpenBlocksA7";
 	compatible = "plathome,openblocks-a7", "marvell,kirkwood-88f6283", "marvell,kirkwood";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x40000000>; /* 1 GB */
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-openrd.dtsi b/arch/arm/boot/dts/marvell/kirkwood-openrd.dtsi
index 47f03c69c55a..16b75963d3b7 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-openrd.dtsi
+++ b/arch/arm/boot/dts/marvell/kirkwood-openrd.dtsi
@@ -12,7 +12,7 @@
 #include "kirkwood-6281.dtsi"
 
 / {
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x20000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-pogo_e02.dts b/arch/arm/boot/dts/marvell/kirkwood-pogo_e02.dts
index e37df043d98a..635a77d2d4aa 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-pogo_e02.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-pogo_e02.dts
@@ -20,7 +20,7 @@ / {
 	compatible = "cloudengines,pogoe02", "marvell,kirkwood-88f6281",
 		     "marvell,kirkwood";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x10000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-pogoplug-series-4.dts b/arch/arm/boot/dts/marvell/kirkwood-pogoplug-series-4.dts
index 0e9c4cf79822..eb6f714e6ef1 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-pogoplug-series-4.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-pogoplug-series-4.dts
@@ -18,7 +18,7 @@ / {
 	compatible = "cloudengines,pogoplugv4", "marvell,kirkwood-88f6192",
 		     "marvell,kirkwood";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x08000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-rd88f6192.dts b/arch/arm/boot/dts/marvell/kirkwood-rd88f6192.dts
index 40610e1db167..837b1a139b3f 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-rd88f6192.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-rd88f6192.dts
@@ -16,7 +16,7 @@ / {
 	model = "Marvell RD88F6192 reference design";
 	compatible = "marvell,rd88f6192", "marvell,kirkwood-88f6192", "marvell,kirkwood";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x20000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-rd88f6281.dtsi b/arch/arm/boot/dts/marvell/kirkwood-rd88f6281.dtsi
index 9d62f910cddf..4a96f40bbd8f 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-rd88f6281.dtsi
+++ b/arch/arm/boot/dts/marvell/kirkwood-rd88f6281.dtsi
@@ -12,7 +12,7 @@
 #include "kirkwood-6281.dtsi"
 
 / {
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x20000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-rs212.dts b/arch/arm/boot/dts/marvell/kirkwood-rs212.dts
index 4ad412115a24..42f06080a2bc 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-rs212.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-rs212.dts
@@ -15,7 +15,7 @@ / {
 	model = "Synology RS212";
 	compatible = "synology,rs212", "marvell,kirkwood";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x8000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-rs409.dts b/arch/arm/boot/dts/marvell/kirkwood-rs409.dts
index 43673b03cb35..bb00d909cf9d 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-rs409.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-rs409.dts
@@ -15,7 +15,7 @@ / {
 	model = "Synology RS409";
 	compatible = "synology,rs409", "marvell,kirkwood";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x8000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-rs411.dts b/arch/arm/boot/dts/marvell/kirkwood-rs411.dts
index 41fa63cec839..553419bf2c4a 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-rs411.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-rs411.dts
@@ -15,7 +15,7 @@ / {
 	model = "Synology RS411 RS812";
 	compatible = "synology,rs411", "synology,rs812", "marvell,kirkwood";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x8000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-sheevaplug-common.dtsi b/arch/arm/boot/dts/marvell/kirkwood-sheevaplug-common.dtsi
index 76e4d97491c7..865919dadd25 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-sheevaplug-common.dtsi
+++ b/arch/arm/boot/dts/marvell/kirkwood-sheevaplug-common.dtsi
@@ -9,7 +9,7 @@
 #include "kirkwood-6281.dtsi"
 
 / {
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x20000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-t5325.dts b/arch/arm/boot/dts/marvell/kirkwood-t5325.dts
index 7163fc819675..05618a38189c 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-t5325.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-t5325.dts
@@ -18,7 +18,7 @@ / {
 	model = "HP t5325 Thin Client";
 	compatible = "hp,t5325", "marvell,kirkwood-88f6281", "marvell,kirkwood";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x20000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-topkick.dts b/arch/arm/boot/dts/marvell/kirkwood-topkick.dts
index 024a792c42c1..1fbbed7d2f0a 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-topkick.dts
+++ b/arch/arm/boot/dts/marvell/kirkwood-topkick.dts
@@ -8,7 +8,7 @@ / {
 	model = "Universal Scientific Industrial Co. Topkick-1281P2";
 	compatible = "usi,topkick-1281P2", "usi,topkick", "marvell,kirkwood-88f6282", "marvell,kirkwood";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x10000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/kirkwood-ts219.dtsi b/arch/arm/boot/dts/marvell/kirkwood-ts219.dtsi
index 1939462a5f48..dd7cc8acb6c2 100644
--- a/arch/arm/boot/dts/marvell/kirkwood-ts219.dtsi
+++ b/arch/arm/boot/dts/marvell/kirkwood-ts219.dtsi
@@ -3,7 +3,7 @@ / {
 	model = "QNAP TS219 family";
 	compatible = "qnap,ts219", "marvell,kirkwood";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x20000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/mmp2-brownstone.dts b/arch/arm/boot/dts/marvell/mmp2-brownstone.dts
index bc64348b8218..54e24d04bf42 100644
--- a/arch/arm/boot/dts/marvell/mmp2-brownstone.dts
+++ b/arch/arm/boot/dts/marvell/mmp2-brownstone.dts
@@ -15,7 +15,7 @@ chosen {
 		bootargs = "console=ttyS2,38400 root=/dev/nfs nfsroot=192.168.1.100:/nfsroot/ ip=192.168.1.101:192.168.1.100::255.255.255.0::eth0:on";
 	};
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x08000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/orion5x-kuroboxpro.dts b/arch/arm/boot/dts/marvell/orion5x-kuroboxpro.dts
index e28b568e741a..e5f4f37cbeca 100644
--- a/arch/arm/boot/dts/marvell/orion5x-kuroboxpro.dts
+++ b/arch/arm/boot/dts/marvell/orion5x-kuroboxpro.dts
@@ -62,7 +62,7 @@ soc {
 				 <MBUS_ID(0x01, 0x1e) 0 0xfc000000 0x1000000>;
 	};
 
-	memory { /* 128 MB */
+	memory at 0 { /* 128 MB */
 		device_type = "memory";
 		reg = <0x00000000 0x8000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/orion5x-lacie-d2-network.dts b/arch/arm/boot/dts/marvell/orion5x-lacie-d2-network.dts
index 3024ef765a4c..195677394f3f 100644
--- a/arch/arm/boot/dts/marvell/orion5x-lacie-d2-network.dts
+++ b/arch/arm/boot/dts/marvell/orion5x-lacie-d2-network.dts
@@ -15,7 +15,7 @@ / {
 	model = "LaCie d2 Network";
 	compatible = "lacie,d2-network", "marvell,orion5x-88f5182", "marvell,orion5x";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x4000000>; /* 64 MB */
 	};
diff --git a/arch/arm/boot/dts/marvell/orion5x-lacie-ethernet-disk-mini-v2.dts b/arch/arm/boot/dts/marvell/orion5x-lacie-ethernet-disk-mini-v2.dts
index f81acb9b7223..135c5c622c3a 100644
--- a/arch/arm/boot/dts/marvell/orion5x-lacie-ethernet-disk-mini-v2.dts
+++ b/arch/arm/boot/dts/marvell/orion5x-lacie-ethernet-disk-mini-v2.dts
@@ -19,7 +19,7 @@ / {
 	model = "LaCie Ethernet Disk mini V2";
 	compatible = "lacie,ethernet-disk-mini-v2", "marvell,orion5x-88f5182", "marvell,orion5x";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x4000000>; /* 64 MB */
 	};
diff --git a/arch/arm/boot/dts/marvell/orion5x-linkstation-lschl.dts b/arch/arm/boot/dts/marvell/orion5x-linkstation-lschl.dts
index 79fee048c900..913448cf79e1 100644
--- a/arch/arm/boot/dts/marvell/orion5x-linkstation-lschl.dts
+++ b/arch/arm/boot/dts/marvell/orion5x-linkstation-lschl.dts
@@ -55,7 +55,7 @@ / {
 	model = "Buffalo Linkstation LiveV3 (LS-CHL)";
 	compatible = "buffalo,lschl", "marvell,orion5x-88f5182", "marvell,orion5x";
 
-	memory { /* 128 MB */
+	memory at 0 { /* 128 MB */
 		device_type = "memory";
 		reg = <0x00000000 0x8000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/orion5x-linkstation-lsgl.dts b/arch/arm/boot/dts/marvell/orion5x-linkstation-lsgl.dts
index 9f6fedd39170..f874f0182d12 100644
--- a/arch/arm/boot/dts/marvell/orion5x-linkstation-lsgl.dts
+++ b/arch/arm/boot/dts/marvell/orion5x-linkstation-lsgl.dts
@@ -56,7 +56,7 @@ / {
 	model = "Buffalo Linkstation Pro/Live";
 	compatible = "buffalo,lsgl", "marvell,orion5x-88f5182", "marvell,orion5x";
 
-	memory { /* 128 MB */
+	memory at 0 { /* 128 MB */
 		device_type = "memory";
 		reg = <0x00000000 0x8000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/orion5x-linkstation-lswtgl.dts b/arch/arm/boot/dts/marvell/orion5x-linkstation-lswtgl.dts
index 7f77ce8cc1fc..3d69b21f51e5 100644
--- a/arch/arm/boot/dts/marvell/orion5x-linkstation-lswtgl.dts
+++ b/arch/arm/boot/dts/marvell/orion5x-linkstation-lswtgl.dts
@@ -54,7 +54,7 @@ / {
 	model = "Buffalo Linkstation LS-WTGL";
 	compatible = "buffalo,lswtgl", "marvell,orion5x-88f5182", "marvell,orion5x";
 
-	memory { /* 64 MB */
+	memory at 0 { /* 64 MB */
 		device_type = "memory";
 		reg = <0x00000000 0x4000000>;
 	};
diff --git a/arch/arm/boot/dts/marvell/orion5x-lswsgl.dts b/arch/arm/boot/dts/marvell/orion5x-lswsgl.dts
index 938360157f44..fdc5a3132020 100644
--- a/arch/arm/boot/dts/marvell/orion5x-lswsgl.dts
+++ b/arch/arm/boot/dts/marvell/orion5x-lswsgl.dts
@@ -54,7 +54,7 @@ / {
 	model = "Buffalo Linkstation Mini (LS-WSGL)";
 	compatible = "buffalo,lswsgl", "marvell,orion5x-88f5182", "marvell,orion5x";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x8000000>; /* 128 MB */
 	};
diff --git a/arch/arm/boot/dts/marvell/orion5x-maxtor-shared-storage-2.dts b/arch/arm/boot/dts/marvell/orion5x-maxtor-shared-storage-2.dts
index cb1bd24b7ae3..4cfabd4fa628 100644
--- a/arch/arm/boot/dts/marvell/orion5x-maxtor-shared-storage-2.dts
+++ b/arch/arm/boot/dts/marvell/orion5x-maxtor-shared-storage-2.dts
@@ -15,7 +15,7 @@ / {
 	model = "Maxtor Shared Storage II";
 	compatible = "maxtor,shared-storage-2", "marvell,orion5x-88f5182", "marvell,orion5x";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x4000000>; /* 64 MB */
 	};
diff --git a/arch/arm/boot/dts/marvell/orion5x-netgear-wnr854t.dts b/arch/arm/boot/dts/marvell/orion5x-netgear-wnr854t.dts
index d63ea15539aa..cf66436d8e00 100644
--- a/arch/arm/boot/dts/marvell/orion5x-netgear-wnr854t.dts
+++ b/arch/arm/boot/dts/marvell/orion5x-netgear-wnr854t.dts
@@ -15,7 +15,7 @@ aliases {
 		serial0 = &uart0;
 	};
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x2000000>; /* 32 MB */
 	};
diff --git a/arch/arm/boot/dts/marvell/orion5x-rd88f5182-nas.dts b/arch/arm/boot/dts/marvell/orion5x-rd88f5182-nas.dts
index 75ab913b21e5..1b8b14fcc0fc 100644
--- a/arch/arm/boot/dts/marvell/orion5x-rd88f5182-nas.dts
+++ b/arch/arm/boot/dts/marvell/orion5x-rd88f5182-nas.dts
@@ -10,7 +10,7 @@ / {
 	model = "Marvell Reference Design 88F5182 NAS";
 	compatible = "marvell,rd-88f5182-nas", "marvell,orion5x-88f5182", "marvell,orion5x";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x4000000>; /* 64 MB */
 	};
diff --git a/arch/arm/boot/dts/marvell/pxa168-aspenite.dts b/arch/arm/boot/dts/marvell/pxa168-aspenite.dts
index 8bade6bf395b..080d1600ac02 100644
--- a/arch/arm/boot/dts/marvell/pxa168-aspenite.dts
+++ b/arch/arm/boot/dts/marvell/pxa168-aspenite.dts
@@ -15,7 +15,7 @@ chosen {
 		bootargs = "console=ttyS0,115200 root=/dev/nfs nfsroot=192.168.1.100:/nfsroot/ ip=192.168.1.101:192.168.1.100::255.255.255.0::eth0:on";
 	};
 
-	memory {
+	memory at 0 {
 		reg = <0x00000000 0x04000000>;
 	};
 };
diff --git a/arch/arm/boot/dts/marvell/pxa910-dkb.dts b/arch/arm/boot/dts/marvell/pxa910-dkb.dts
index ce76158867c7..11d1fdfa40f7 100644
--- a/arch/arm/boot/dts/marvell/pxa910-dkb.dts
+++ b/arch/arm/boot/dts/marvell/pxa910-dkb.dts
@@ -15,7 +15,7 @@ chosen {
 		bootargs = "console=ttyS0,115200 root=/dev/nfs nfsroot=192.168.1.100:/nfsroot/ ip=192.168.1.101:192.168.1.100::255.255.255.0::eth0:on";
 	};
 
-	memory {
+	memory at 0 {
 		reg = <0x00000000 0x10000000>;
 	};
 };
diff --git a/arch/arm/boot/dts/mediatek/mt2701-evb.dts b/arch/arm/boot/dts/mediatek/mt2701-evb.dts
index d1a4d2e3825d..796a475b1e5b 100644
--- a/arch/arm/boot/dts/mediatek/mt2701-evb.dts
+++ b/arch/arm/boot/dts/mediatek/mt2701-evb.dts
@@ -13,7 +13,7 @@ / {
 	model = "MediaTek MT2701 evaluation board";
 	compatible = "mediatek,mt2701-evb", "mediatek,mt2701";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0 0x80000000 0 0x40000000>;
 	};
diff --git a/arch/arm/boot/dts/mediatek/mt6580-evbp1.dts b/arch/arm/boot/dts/mediatek/mt6580-evbp1.dts
index 755a0774a8ee..39a1f54117b5 100644
--- a/arch/arm/boot/dts/mediatek/mt6580-evbp1.dts
+++ b/arch/arm/boot/dts/mediatek/mt6580-evbp1.dts
@@ -21,7 +21,7 @@ chosen {
 		stdout-path = "serial0:921600n8";
 	};
 
-	memory {
+	memory at 80000000 {
 		device_type = "memory";
 		reg = <0x80000000 0x20000000>;
 	};
diff --git a/arch/arm/boot/dts/mediatek/mt6582-prestigio-pmt5008-3g.dts b/arch/arm/boot/dts/mediatek/mt6582-prestigio-pmt5008-3g.dts
index b057e037f940..6bb3976e1500 100644
--- a/arch/arm/boot/dts/mediatek/mt6582-prestigio-pmt5008-3g.dts
+++ b/arch/arm/boot/dts/mediatek/mt6582-prestigio-pmt5008-3g.dts
@@ -20,7 +20,7 @@ chosen {
 		stdout-path = "serial0:921600n8";
 	};
 
-	memory {
+	memory at 80000000 {
 		device_type = "memory";
 		reg = <0x80000000 0x40000000>;
 	};
diff --git a/arch/arm/boot/dts/mediatek/mt6589-aquaris5.dts b/arch/arm/boot/dts/mediatek/mt6589-aquaris5.dts
index 1e7079a3b449..ebd06752750a 100644
--- a/arch/arm/boot/dts/mediatek/mt6589-aquaris5.dts
+++ b/arch/arm/boot/dts/mediatek/mt6589-aquaris5.dts
@@ -17,7 +17,7 @@ chosen {
 		stdout-path = &uart0;
 	};
 
-	memory {
+	memory at 80000000 {
 		device_type = "memory";
 		reg = <0x80000000 0x40000000>;
 	};
diff --git a/arch/arm/boot/dts/mediatek/mt6592-evb.dts b/arch/arm/boot/dts/mediatek/mt6592-evb.dts
index 5e00c1cca2d1..745723d6f838 100644
--- a/arch/arm/boot/dts/mediatek/mt6592-evb.dts
+++ b/arch/arm/boot/dts/mediatek/mt6592-evb.dts
@@ -12,7 +12,7 @@ / {
 	model = "mt6592 evb";
 	compatible = "mediatek,mt6592-evb", "mediatek,mt6592";
 
-	memory {
+	memory at 80000000 {
 		device_type = "memory";
 		reg = <0x80000000 0x40000000>;
 	};
diff --git a/arch/arm/boot/dts/mediatek/mt8127-moose.dts b/arch/arm/boot/dts/mediatek/mt8127-moose.dts
index 560687af87dc..c44d5e94aa7a 100644
--- a/arch/arm/boot/dts/mediatek/mt8127-moose.dts
+++ b/arch/arm/boot/dts/mediatek/mt8127-moose.dts
@@ -12,7 +12,7 @@ / {
 	model = "MediaTek MT8127 Moose Board";
 	compatible = "mediatek,mt8127-moose", "mediatek,mt8127";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0 0x80000000 0 0x40000000>;
 	};
diff --git a/arch/arm/boot/dts/mediatek/mt8135-evbp1.dts b/arch/arm/boot/dts/mediatek/mt8135-evbp1.dts
index f6147fe62f41..d117074f8c66 100644
--- a/arch/arm/boot/dts/mediatek/mt8135-evbp1.dts
+++ b/arch/arm/boot/dts/mediatek/mt8135-evbp1.dts
@@ -12,7 +12,7 @@ / {
 	model = "MediaTek MT8135 evaluation board";
 	compatible = "mediatek,mt8135-evbp1", "mediatek,mt8135";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0 0x80000000 0 0x40000000>;
 	};
diff --git a/arch/arm/boot/dts/microchip/at91-lmu5000.dts b/arch/arm/boot/dts/microchip/at91-lmu5000.dts
index f8863d7c0798..aba6c590c3a9 100644
--- a/arch/arm/boot/dts/microchip/at91-lmu5000.dts
+++ b/arch/arm/boot/dts/microchip/at91-lmu5000.dts
@@ -16,7 +16,7 @@ chosen {
 		bootargs = "mem=64M console=ttyS0,115200 rootfstype=jffs2";
 	};
 
-	memory {
+	memory at 20000000 {
 		reg = <0x20000000 0x4000000>;
 	};
 
diff --git a/arch/arm/boot/dts/microchip/at91-q5xr5.dts b/arch/arm/boot/dts/microchip/at91-q5xr5.dts
index 9cf60b6f695c..09deae9e2b25 100644
--- a/arch/arm/boot/dts/microchip/at91-q5xr5.dts
+++ b/arch/arm/boot/dts/microchip/at91-q5xr5.dts
@@ -16,7 +16,7 @@ chosen {
 		bootargs = "console=ttyS0,115200 rootfstype=squashfs,jffs2";
 	};
 
-	memory {
+	memory at 20000000 {
 		reg = <0x20000000 0x0>;
 	};
 
diff --git a/arch/arm/boot/dts/moxa/moxart-uc7112lx.dts b/arch/arm/boot/dts/moxa/moxart-uc7112lx.dts
index e07b807b4cec..e747fb418f24 100644
--- a/arch/arm/boot/dts/moxa/moxart-uc7112lx.dts
+++ b/arch/arm/boot/dts/moxa/moxart-uc7112lx.dts
@@ -11,7 +11,7 @@ / {
 	model = "MOXA UC-7112-LX";
 	compatible = "moxa,moxart-uc-7112-lx", "moxa,moxart";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x0 0x2000000>;
 	};
diff --git a/arch/arm/boot/dts/nuvoton/nuvoton-npcm730-gbs.dts b/arch/arm/boot/dts/nuvoton/nuvoton-npcm730-gbs.dts
index 9f64c85e1c20..696bb9a04118 100644
--- a/arch/arm/boot/dts/nuvoton/nuvoton-npcm730-gbs.dts
+++ b/arch/arm/boot/dts/nuvoton/nuvoton-npcm730-gbs.dts
@@ -71,7 +71,7 @@ chosen {
 		stdout-path = &serial0;
 	};
 
-	memory {
+	memory at 0 {
 		reg = <0 0x40000000>;
 	};
 
diff --git a/arch/arm/boot/dts/nuvoton/nuvoton-npcm730-gsj.dts b/arch/arm/boot/dts/nuvoton/nuvoton-npcm730-gsj.dts
index cd7843339c24..e5596e13287f 100644
--- a/arch/arm/boot/dts/nuvoton/nuvoton-npcm730-gsj.dts
+++ b/arch/arm/boot/dts/nuvoton/nuvoton-npcm730-gsj.dts
@@ -31,7 +31,7 @@ chosen {
 		stdout-path = &serial3;
 	};
 
-	memory {
+	memory at 0 {
 		reg = <0 0x40000000>;
 	};
 
diff --git a/arch/arm/boot/dts/nuvoton/nuvoton-npcm730-kudo.dts b/arch/arm/boot/dts/nuvoton/nuvoton-npcm730-kudo.dts
index 886a87dfcd0d..dc130a6ab9df 100644
--- a/arch/arm/boot/dts/nuvoton/nuvoton-npcm730-kudo.dts
+++ b/arch/arm/boot/dts/nuvoton/nuvoton-npcm730-kudo.dts
@@ -41,7 +41,7 @@ chosen {
 		stdout-path = &serial3;
 	};
 
-	memory {
+	memory at 0 {
 		reg = <0 0x40000000>;
 	};
 
diff --git a/arch/arm/boot/dts/nuvoton/nuvoton-npcm750-evb.dts b/arch/arm/boot/dts/nuvoton/nuvoton-npcm750-evb.dts
index bcdcb30c7bf6..954d16830aa4 100644
--- a/arch/arm/boot/dts/nuvoton/nuvoton-npcm750-evb.dts
+++ b/arch/arm/boot/dts/nuvoton/nuvoton-npcm750-evb.dts
@@ -45,7 +45,7 @@ chosen {
 		stdout-path = &serial3;
 	};
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x0 0x20000000>;
 	};
diff --git a/arch/arm/boot/dts/nuvoton/nuvoton-npcm750-runbmc-olympus.dts b/arch/arm/boot/dts/nuvoton/nuvoton-npcm750-runbmc-olympus.dts
index 087f4ac43187..c362ca47c941 100644
--- a/arch/arm/boot/dts/nuvoton/nuvoton-npcm750-runbmc-olympus.dts
+++ b/arch/arm/boot/dts/nuvoton/nuvoton-npcm750-runbmc-olympus.dts
@@ -43,7 +43,7 @@ chosen {
 		stdout-path = &serial3;
 	};
 
-	memory {
+	memory at 0 {
 		reg = <0 0x40000000>;
 	};
 
diff --git a/arch/arm/boot/dts/nvidia/tegra124-nyan.dtsi b/arch/arm/boot/dts/nvidia/tegra124-nyan.dtsi
index 587b71ed29d9..04f873a41988 100644
--- a/arch/arm/boot/dts/nvidia/tegra124-nyan.dtsi
+++ b/arch/arm/boot/dts/nvidia/tegra124-nyan.dtsi
@@ -26,7 +26,7 @@ chosen {
 	 *
 	 * The name of this node is effectively ABI and must not be changed.
 	 */
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x0 0x80000000 0x0 0x80000000>;
 	};
diff --git a/arch/arm/boot/dts/qcom/qcom-apq8084.dtsi b/arch/arm/boot/dts/qcom/qcom-apq8084.dtsi
index 014e6c5ee889..c0d8747d0b81 100644
--- a/arch/arm/boot/dts/qcom/qcom-apq8084.dtsi
+++ b/arch/arm/boot/dts/qcom/qcom-apq8084.dtsi
@@ -89,7 +89,7 @@ CPU_SPC: cpu-spc {
 		};
 	};
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x0 0x0>;
 	};
diff --git a/arch/arm/boot/dts/qcom/qcom-ipq4019-ap.dk04.1.dtsi b/arch/arm/boot/dts/qcom/qcom-ipq4019-ap.dk04.1.dtsi
index 91e296d2ea82..c433f44e5eb1 100644
--- a/arch/arm/boot/dts/qcom/qcom-ipq4019-ap.dk04.1.dtsi
+++ b/arch/arm/boot/dts/qcom/qcom-ipq4019-ap.dk04.1.dtsi
@@ -17,7 +17,7 @@ chosen {
 		stdout-path = "serial0:115200n8";
 	};
 
-	memory {
+	memory at 80000000 {
 		device_type = "memory";
 		reg = <0x80000000 0x10000000>; /* 256MB */
 	};
diff --git a/arch/arm/boot/dts/qcom/qcom-ipq4019-ap.dk07.1.dtsi b/arch/arm/boot/dts/qcom/qcom-ipq4019-ap.dk07.1.dtsi
index cc88cf5f0d9b..adb79f66a4af 100644
--- a/arch/arm/boot/dts/qcom/qcom-ipq4019-ap.dk07.1.dtsi
+++ b/arch/arm/boot/dts/qcom/qcom-ipq4019-ap.dk07.1.dtsi
@@ -8,7 +8,7 @@
 / {
 	model = "Qualcomm Technologies, Inc. IPQ4019/AP-DK07.1";
 
-	memory {
+	memory at 80000000 {
 		device_type = "memory";
 		reg = <0x80000000 0x20000000>; /* 512MB */
 	};
diff --git a/arch/arm/boot/dts/qcom/qcom-ipq4019.dtsi b/arch/arm/boot/dts/qcom/qcom-ipq4019.dtsi
index 56415ab34083..2b14b2c93f72 100644
--- a/arch/arm/boot/dts/qcom/qcom-ipq4019.dtsi
+++ b/arch/arm/boot/dts/qcom/qcom-ipq4019.dtsi
@@ -129,7 +129,7 @@ opp-716000000 {
  		};
 	};
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x0 0x0>;
 	};
diff --git a/arch/arm/boot/dts/qcom/qcom-ipq8064.dtsi b/arch/arm/boot/dts/qcom/qcom-ipq8064.dtsi
index 759a59c2bdbc..a3432a31f27f 100644
--- a/arch/arm/boot/dts/qcom/qcom-ipq8064.dtsi
+++ b/arch/arm/boot/dts/qcom/qcom-ipq8064.dtsi
@@ -271,7 +271,7 @@ cpu-hot {
 		};
 	};
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x0 0x0>;
 	};
diff --git a/arch/arm/boot/dts/qcom/qcom-msm8660.dtsi b/arch/arm/boot/dts/qcom/qcom-msm8660.dtsi
index a66c474cd1aa..1c7080e9e2ac 100644
--- a/arch/arm/boot/dts/qcom/qcom-msm8660.dtsi
+++ b/arch/arm/boot/dts/qcom/qcom-msm8660.dtsi
@@ -40,7 +40,7 @@ L2: l2-cache {
 		};
 	};
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x0 0x0>;
 	};
diff --git a/arch/arm/boot/dts/qcom/qcom-sdx55.dtsi b/arch/arm/boot/dts/qcom/qcom-sdx55.dtsi
index 68fa5859d263..4bc38667c777 100644
--- a/arch/arm/boot/dts/qcom/qcom-sdx55.dtsi
+++ b/arch/arm/boot/dts/qcom/qcom-sdx55.dtsi
@@ -20,7 +20,7 @@ / {
 	qcom,msm-id = <357 0x10000>, <368 0x10000>, <418 0x10000>;
 	interrupt-parent = <&intc>;
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0 0>;
 	};
diff --git a/arch/arm/boot/dts/qcom/qcom-sdx65.dtsi b/arch/arm/boot/dts/qcom/qcom-sdx65.dtsi
index a949454212e9..b9014af215c0 100644
--- a/arch/arm/boot/dts/qcom/qcom-sdx65.dtsi
+++ b/arch/arm/boot/dts/qcom/qcom-sdx65.dtsi
@@ -20,7 +20,7 @@ / {
 	qcom,msm-id = <458 0x10000>, <483 0x10000>, <509 0x10000>;
 	interrupt-parent = <&intc>;
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0 0>;
 	};
diff --git a/arch/arm/boot/dts/rockchip/rk3288-phycore-som.dtsi b/arch/arm/boot/dts/rockchip/rk3288-phycore-som.dtsi
index e43887c9635f..deef421c8699 100644
--- a/arch/arm/boot/dts/rockchip/rk3288-phycore-som.dtsi
+++ b/arch/arm/boot/dts/rockchip/rk3288-phycore-som.dtsi
@@ -16,7 +16,7 @@ / {
 	 * Set the minimum memory size here and
 	 * let the bootloader set the real size.
 	 */
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x0 0x0 0x0 0x8000000>;
 	};
diff --git a/arch/arm/boot/dts/rockchip/rk3288-tinker.dtsi b/arch/arm/boot/dts/rockchip/rk3288-tinker.dtsi
index e6bc55e73fb0..3ffec299d212 100644
--- a/arch/arm/boot/dts/rockchip/rk3288-tinker.dtsi
+++ b/arch/arm/boot/dts/rockchip/rk3288-tinker.dtsi
@@ -12,7 +12,7 @@ chosen {
 		stdout-path = "serial2:115200n8";
 	};
 
-	memory {
+	memory at 0 {
 		reg = <0x0 0x0 0x0 0x80000000>;
 		device_type = "memory";
 	};
diff --git a/arch/arm/boot/dts/rockchip/rk3288-veyron.dtsi b/arch/arm/boot/dts/rockchip/rk3288-veyron.dtsi
index d838bf0d5d9a..22ea830efe07 100644
--- a/arch/arm/boot/dts/rockchip/rk3288-veyron.dtsi
+++ b/arch/arm/boot/dts/rockchip/rk3288-veyron.dtsi
@@ -22,7 +22,7 @@ chosen {
 	 * The default coreboot on veyron devices ignores memory at 0 nodes
 	 * and would instead create another memory node.
 	 */
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x0 0x0 0x0 0x80000000>;
 	};
diff --git a/arch/arm/boot/dts/rockchip/rk3288-vyasa.dts b/arch/arm/boot/dts/rockchip/rk3288-vyasa.dts
index ee702d24f010..1edd7dc28ee3 100644
--- a/arch/arm/boot/dts/rockchip/rk3288-vyasa.dts
+++ b/arch/arm/boot/dts/rockchip/rk3288-vyasa.dts
@@ -14,7 +14,7 @@ chosen {
 		stdout-path = &uart2;
 	};
 
-	memory {
+	memory at 0 {
 		reg = <0x0 0x0 0x0 0x80000000>;
 		device_type = "memory";
 	};
diff --git a/arch/arm/boot/dts/sigmastar/mstar-infinity2m-ssd202d.dtsi b/arch/arm/boot/dts/sigmastar/mstar-infinity2m-ssd202d.dtsi
index 176e10a29896..74621a7628b2 100644
--- a/arch/arm/boot/dts/sigmastar/mstar-infinity2m-ssd202d.dtsi
+++ b/arch/arm/boot/dts/sigmastar/mstar-infinity2m-ssd202d.dtsi
@@ -7,7 +7,7 @@
 #include "mstar-infinity2m-ssd20xd.dtsi"
 
 / {
-	memory {
+	memory at 20000000 {
 		device_type = "memory";
 		reg = <0x20000000 0x8000000>;
 	};
diff --git a/arch/arm/boot/dts/st/spear1310-evb.dts b/arch/arm/boot/dts/st/spear1310-evb.dts
index 18191a87f07c..a84c66b02b5c 100644
--- a/arch/arm/boot/dts/st/spear1310-evb.dts
+++ b/arch/arm/boot/dts/st/spear1310-evb.dts
@@ -14,7 +14,7 @@ / {
 	#address-cells = <1>;
 	#size-cells = <1>;
 
-	memory {
+	memory at 0 {
 		reg = <0 0x40000000>;
 	};
 
diff --git a/arch/arm/boot/dts/st/spear1340-evb.dts b/arch/arm/boot/dts/st/spear1340-evb.dts
index cea624fc745c..b3456235a801 100644
--- a/arch/arm/boot/dts/st/spear1340-evb.dts
+++ b/arch/arm/boot/dts/st/spear1340-evb.dts
@@ -14,7 +14,7 @@ / {
 	#address-cells = <1>;
 	#size-cells = <1>;
 
-	memory {
+	memory at 0 {
 		reg = <0 0x40000000>;
 	};
 
diff --git a/arch/arm/boot/dts/st/spear13xx.dtsi b/arch/arm/boot/dts/st/spear13xx.dtsi
index 3b6897084e26..7e0563c2c8b6 100644
--- a/arch/arm/boot/dts/st/spear13xx.dtsi
+++ b/arch/arm/boot/dts/st/spear13xx.dtsi
@@ -50,7 +50,7 @@ L2: cache-controller {
 		    cache-level = <2>;
 	};
 
-	memory {
+	memory at 0 {
 		name = "memory";
 		device_type = "memory";
 		reg = <0 0x40000000>;
diff --git a/arch/arm/boot/dts/st/spear300-evb.dts b/arch/arm/boot/dts/st/spear300-evb.dts
index 303ef29fb805..d730bddad981 100644
--- a/arch/arm/boot/dts/st/spear300-evb.dts
+++ b/arch/arm/boot/dts/st/spear300-evb.dts
@@ -14,7 +14,7 @@ / {
 	#address-cells = <1>;
 	#size-cells = <1>;
 
-	memory {
+	memory at 0 {
 		reg = <0 0x40000000>;
 	};
 
diff --git a/arch/arm/boot/dts/st/spear310-evb.dts b/arch/arm/boot/dts/st/spear310-evb.dts
index ea0b53036f7b..f584b0833c38 100644
--- a/arch/arm/boot/dts/st/spear310-evb.dts
+++ b/arch/arm/boot/dts/st/spear310-evb.dts
@@ -14,7 +14,7 @@ / {
 	#address-cells = <1>;
 	#size-cells = <1>;
 
-	memory {
+	memory at 0 {
 		reg = <0 0x40000000>;
 	};
 
diff --git a/arch/arm/boot/dts/st/spear320-evb.dts b/arch/arm/boot/dts/st/spear320-evb.dts
index 3c026d021c92..76ff6508af7e 100644
--- a/arch/arm/boot/dts/st/spear320-evb.dts
+++ b/arch/arm/boot/dts/st/spear320-evb.dts
@@ -14,7 +14,7 @@ / {
 	#address-cells = <1>;
 	#size-cells = <1>;
 
-	memory {
+	memory at 0 {
 		reg = <0 0x40000000>;
 	};
 
diff --git a/arch/arm/boot/dts/st/spear320-hmi.dts b/arch/arm/boot/dts/st/spear320-hmi.dts
index 721e5ee7b680..4e21b0cc911e 100644
--- a/arch/arm/boot/dts/st/spear320-hmi.dts
+++ b/arch/arm/boot/dts/st/spear320-hmi.dts
@@ -14,7 +14,7 @@ / {
 	#address-cells = <1>;
 	#size-cells = <1>;
 
-	memory {
+	memory at 0 {
 		reg = <0 0x40000000>;
 	};
 
diff --git a/arch/arm/boot/dts/st/spear3xx.dtsi b/arch/arm/boot/dts/st/spear3xx.dtsi
index cc88ebe7a60c..647c922f93b4 100644
--- a/arch/arm/boot/dts/st/spear3xx.dtsi
+++ b/arch/arm/boot/dts/st/spear3xx.dtsi
@@ -20,7 +20,7 @@ cpu {
 		};
 	};
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0 0x40000000>;
 	};
diff --git a/arch/arm/boot/dts/st/spear600-evb.dts b/arch/arm/boot/dts/st/spear600-evb.dts
index a25b86d149ad..1d8a2ed0369b 100644
--- a/arch/arm/boot/dts/st/spear600-evb.dts
+++ b/arch/arm/boot/dts/st/spear600-evb.dts
@@ -12,7 +12,7 @@ / {
 	#address-cells = <1>;
 	#size-cells = <1>;
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0 0x10000000>;
 	};
diff --git a/arch/arm/boot/dts/st/spear600.dtsi b/arch/arm/boot/dts/st/spear600.dtsi
index 6b67c0ceaed9..ead1b75db09d 100644
--- a/arch/arm/boot/dts/st/spear600.dtsi
+++ b/arch/arm/boot/dts/st/spear600.dtsi
@@ -18,7 +18,7 @@ cpu {
 		};
 	};
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0 0x40000000>;
 	};
diff --git a/arch/arm/boot/dts/st/ste-href.dtsi b/arch/arm/boot/dts/st/ste-href.dtsi
index fbf0309e108f..750925c4ef1f 100644
--- a/arch/arm/boot/dts/st/ste-href.dtsi
+++ b/arch/arm/boot/dts/st/ste-href.dtsi
@@ -8,7 +8,7 @@
 #include "ste-href-family-pinctrl.dtsi"
 
 / {
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x20000000>;
 	};
diff --git a/arch/arm/boot/dts/st/ste-nomadik-stn8815.dtsi b/arch/arm/boot/dts/st/ste-nomadik-stn8815.dtsi
index 4d37c5fb553c..b90c15352c13 100644
--- a/arch/arm/boot/dts/st/ste-nomadik-stn8815.dtsi
+++ b/arch/arm/boot/dts/st/ste-nomadik-stn8815.dtsi
@@ -9,7 +9,7 @@ / {
 	#address-cells = <1>;
 	#size-cells = <1>;
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x04000000>,
 		    <0x08000000 0x04000000>;
diff --git a/arch/arm/boot/dts/st/ste-snowball.dts b/arch/arm/boot/dts/st/ste-snowball.dts
index 2d9f1128f555..38013c66fc68 100644
--- a/arch/arm/boot/dts/st/ste-snowball.dts
+++ b/arch/arm/boot/dts/st/ste-snowball.dts
@@ -12,7 +12,7 @@ / {
 	model = "Calao Systems Snowball platform with device tree";
 	compatible = "calaosystems,snowball-a9500", "st-ericsson,u9500";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x00000000 0x20000000>;
 	};
diff --git a/arch/arm/boot/dts/ti/omap/am335x-moxa-uc-8100-me-t.dts b/arch/arm/boot/dts/ti/omap/am335x-moxa-uc-8100-me-t.dts
index 0c7949d21bd9..4565c32c0077 100644
--- a/arch/arm/boot/dts/ti/omap/am335x-moxa-uc-8100-me-t.dts
+++ b/arch/arm/boot/dts/ti/omap/am335x-moxa-uc-8100-me-t.dts
@@ -12,7 +12,7 @@ / {
 	model = "Moxa UC-8100-ME-T";
 	compatible = "moxa,uc-8100-me-t", "ti,am33xx";
 
-	memory {
+	memory at 80000000 {
 		device_type = "memory";
 		reg = <0x80000000 0x20000000>; /* 512 MB */
 	};
diff --git a/arch/arm/boot/dts/ti/omap/am335x-pdu001.dts b/arch/arm/boot/dts/ti/omap/am335x-pdu001.dts
index 17574d0d0525..10f8eea5a746 100644
--- a/arch/arm/boot/dts/ti/omap/am335x-pdu001.dts
+++ b/arch/arm/boot/dts/ti/omap/am335x-pdu001.dts
@@ -30,7 +30,7 @@ cpu at 0 {
 		};
 	};
 
-	memory {
+	memory at 80000000 {
 		device_type = "memory";
 		reg = <0x80000000 0x10000000>; /* 256 MB */
 	};
diff --git a/arch/arm/boot/dts/ti/omap/dra71-evm.dts b/arch/arm/boot/dts/ti/omap/dra71-evm.dts
index f747ac56eb92..3b6bcdb58af6 100644
--- a/arch/arm/boot/dts/ti/omap/dra71-evm.dts
+++ b/arch/arm/boot/dts/ti/omap/dra71-evm.dts
@@ -12,7 +12,7 @@ / {
 	compatible = "ti,dra718-evm", "ti,dra718", "ti,dra722", "ti,dra72", "ti,dra7";
 	model = "TI DRA718 EVM";
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x0 0x80000000 0x0 0x80000000>; /* 2GB */
 	};
diff --git a/arch/arm/boot/dts/ti/omap/motorola-mapphone-common.dtsi b/arch/arm/boot/dts/ti/omap/motorola-mapphone-common.dtsi
index 128a158e7ec9..e096d8f46249 100644
--- a/arch/arm/boot/dts/ti/omap/motorola-mapphone-common.dtsi
+++ b/arch/arm/boot/dts/ti/omap/motorola-mapphone-common.dtsi
@@ -10,7 +10,7 @@ / {
 	 * We seem to have only 1021 MB accessible, 1021 - 1022 is locked,
 	 * then 1023 - 1024 seems to contain mbm.
 	 */
-	memory {
+	memory at 80000000 {
 		device_type = "memory";
 		reg = <0x80000000 0x3fd00000>;	/* 1021 MB */
 	};
diff --git a/arch/arm/boot/dts/vt8500/vt8500.dtsi b/arch/arm/boot/dts/vt8500/vt8500.dtsi
index f23cb5ee11ae..fa4e4eef09f7 100644
--- a/arch/arm/boot/dts/vt8500/vt8500.dtsi
+++ b/arch/arm/boot/dts/vt8500/vt8500.dtsi
@@ -20,7 +20,7 @@ cpu {
 		};
 	};
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x0 0x0>;
 	};
diff --git a/arch/arm/boot/dts/vt8500/wm8505.dtsi b/arch/arm/boot/dts/vt8500/wm8505.dtsi
index d9e1280372c5..58341fc5641c 100644
--- a/arch/arm/boot/dts/vt8500/wm8505.dtsi
+++ b/arch/arm/boot/dts/vt8500/wm8505.dtsi
@@ -20,7 +20,7 @@ cpu {
 		};
 	};
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x0 0x0>;
 	};
diff --git a/arch/arm/boot/dts/vt8500/wm8650.dtsi b/arch/arm/boot/dts/vt8500/wm8650.dtsi
index 35d12d77efc0..9a54100754b0 100644
--- a/arch/arm/boot/dts/vt8500/wm8650.dtsi
+++ b/arch/arm/boot/dts/vt8500/wm8650.dtsi
@@ -20,7 +20,7 @@ cpu {
 		};
 	};
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x0 0x0>;
 	};
diff --git a/arch/arm/boot/dts/vt8500/wm8750.dtsi b/arch/arm/boot/dts/vt8500/wm8750.dtsi
index b292f85d4e69..1f7bc1417027 100644
--- a/arch/arm/boot/dts/vt8500/wm8750.dtsi
+++ b/arch/arm/boot/dts/vt8500/wm8750.dtsi
@@ -20,7 +20,7 @@ cpu {
 		};
 	};
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x0 0x0>;
 	};
diff --git a/arch/arm/boot/dts/vt8500/wm8850.dtsi b/arch/arm/boot/dts/vt8500/wm8850.dtsi
index c61717ebb4f1..003e59fc4da3 100644
--- a/arch/arm/boot/dts/vt8500/wm8850.dtsi
+++ b/arch/arm/boot/dts/vt8500/wm8850.dtsi
@@ -21,7 +21,7 @@ cpu at 0 {
 		};
 	};
 
-	memory {
+	memory at 0 {
 		device_type = "memory";
 		reg = <0x0 0x0>;
 	};
-- 
2.46.2



From rosenp at gmail.com  Mon Sep 30 15:49:16 2024
From: rosenp at gmail.com (Rosen Penev)
Date: Mon, 30 Sep 2024 15:49:16 -0700
Subject: [PATCH 0/3] mmc: mtk-sd: add some devm
Message-ID: <20240930224919.355359-1-rosenp@gmail.com>

Simplifies the code. Also a bugfix with devm_clk_get_optional.

Rosen Penev (3):
  mmc: mtk-sd: use devm_mmc_alloc_host
  mmc: mtd-sd: use devm_platform_ioremap_resource
  mmc: mtk-sd: fix devm_clk_get_optional usage

 drivers/mmc/host/mtk-sd.c | 70 ++++++++++++++-------------------------
 1 file changed, 25 insertions(+), 45 deletions(-)

-- 
2.46.2



From rosenp at gmail.com  Mon Sep 30 15:49:17 2024
From: rosenp at gmail.com (Rosen Penev)
Date: Mon, 30 Sep 2024 15:49:17 -0700
Subject: [PATCH 1/3] mmc: mtk-sd: use devm_mmc_alloc_host
In-Reply-To: <20240930224919.355359-1-rosenp@gmail.com>
References: <20240930224919.355359-1-rosenp@gmail.com>
Message-ID: <20240930224919.355359-2-rosenp@gmail.com>

Allows removing several gotos.

Also fixed some wrong ones.

Added dev_err_probe where EPROBE_DEFER is possible.

Signed-off-by: Rosen Penev <rosenp at gmail.com>
---
 drivers/mmc/host/mtk-sd.c | 55 ++++++++++++++-------------------------
 1 file changed, 20 insertions(+), 35 deletions(-)

diff --git a/drivers/mmc/host/mtk-sd.c b/drivers/mmc/host/mtk-sd.c
index 89018b6c97b9..c607312dfe07 100644
--- a/drivers/mmc/host/mtk-sd.c
+++ b/drivers/mmc/host/mtk-sd.c
@@ -2736,20 +2736,18 @@ static int msdc_drv_probe(struct platform_device *pdev)
 	}
 
 	/* Allocate MMC host for this device */
-	mmc = mmc_alloc_host(sizeof(struct msdc_host), &pdev->dev);
+	mmc = devm_mmc_alloc_host(&pdev->dev, sizeof(struct msdc_host));
 	if (!mmc)
 		return -ENOMEM;
 
 	host = mmc_priv(mmc);
 	ret = mmc_of_parse(mmc);
 	if (ret)
-		goto host_free;
+		return ret;
 
 	host->base = devm_platform_ioremap_resource(pdev, 0);
-	if (IS_ERR(host->base)) {
-		ret = PTR_ERR(host->base);
-		goto host_free;
-	}
+	if (IS_ERR(host->base))
+		return PTR_ERR(host->base);
 
 	res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
 	if (res) {
@@ -2760,18 +2758,16 @@ static int msdc_drv_probe(struct platform_device *pdev)
 
 	ret = mmc_regulator_get_supply(mmc);
 	if (ret)
-		goto host_free;
+		return ret;
 
 	ret = msdc_of_clock_parse(pdev, host);
 	if (ret)
-		goto host_free;
+		return ret;
 
 	host->reset = devm_reset_control_get_optional_exclusive(&pdev->dev,
 								"hrst");
-	if (IS_ERR(host->reset)) {
-		ret = PTR_ERR(host->reset);
-		goto host_free;
-	}
+	if (IS_ERR(host->reset))
+		return PTR_ERR(host->reset);
 
 	/* only eMMC has crypto property */
 	if (!(mmc->caps2 & MMC_CAP2_NO_MMC)) {
@@ -2783,30 +2779,24 @@ static int msdc_drv_probe(struct platform_device *pdev)
 	}
 
 	host->irq = platform_get_irq(pdev, 0);
-	if (host->irq < 0) {
-		ret = host->irq;
-		goto host_free;
-	}
+	if (host->irq < 0)
+		return host->irq;
 
 	host->pinctrl = devm_pinctrl_get(&pdev->dev);
-	if (IS_ERR(host->pinctrl)) {
-		ret = PTR_ERR(host->pinctrl);
-		dev_err(&pdev->dev, "Cannot find pinctrl!\n");
-		goto host_free;
-	}
+	if (IS_ERR(host->pinctrl))
+		return dev_err_probe(&pdev->dev, PTR_ERR(host->pinctrl),
+				     "Cannot find pinctrl");
 
 	host->pins_default = pinctrl_lookup_state(host->pinctrl, "default");
 	if (IS_ERR(host->pins_default)) {
-		ret = PTR_ERR(host->pins_default);
 		dev_err(&pdev->dev, "Cannot find pinctrl default!\n");
-		goto host_free;
+		return PTR_ERR(host->pins_default);
 	}
 
 	host->pins_uhs = pinctrl_lookup_state(host->pinctrl, "state_uhs");
 	if (IS_ERR(host->pins_uhs)) {
-		ret = PTR_ERR(host->pins_uhs);
 		dev_err(&pdev->dev, "Cannot find pinctrl uhs!\n");
-		goto host_free;
+		return PTR_ERR(host->pins_uhs);
 	}
 
 	/* Support for SDIO eint irq ? */
@@ -2895,14 +2885,14 @@ static int msdc_drv_probe(struct platform_device *pdev)
 					     GFP_KERNEL);
 		if (!host->cq_host) {
 			ret = -ENOMEM;
-			goto host_free;
+			goto release_mem;
 		}
 		host->cq_host->caps |= CQHCI_TASK_DESC_SZ_128;
 		host->cq_host->mmio = host->base + 0x800;
 		host->cq_host->ops = &msdc_cmdq_ops;
 		ret = cqhci_init(host->cq_host, mmc, true);
 		if (ret)
-			goto host_free;
+			goto release_mem;
 		mmc->max_segs = 128;
 		/* cqhci 16bit length */
 		/* 0 size, means 65536 so we don't have to -1 here */
@@ -2939,11 +2929,8 @@ static int msdc_drv_probe(struct platform_device *pdev)
 			host->dma.gpd, host->dma.gpd_addr);
 	if (host->dma.bd)
 		dma_free_coherent(&pdev->dev,
-			MAX_BD_NUM * sizeof(struct mt_bdma_desc),
-			host->dma.bd, host->dma.bd_addr);
-host_free:
-	mmc_free_host(mmc);
-
+				  MAX_BD_NUM * sizeof(struct mt_bdma_desc),
+				  host->dma.bd, host->dma.bd_addr);
 	return ret;
 }
 
@@ -2968,9 +2955,7 @@ static void msdc_drv_remove(struct platform_device *pdev)
 			2 * sizeof(struct mt_gpdma_desc),
 			host->dma.gpd, host->dma.gpd_addr);
 	dma_free_coherent(&pdev->dev, MAX_BD_NUM * sizeof(struct mt_bdma_desc),
-			host->dma.bd, host->dma.bd_addr);
-
-	mmc_free_host(mmc);
+			  host->dma.bd, host->dma.bd_addr);
 }
 
 static void msdc_save_reg(struct msdc_host *host)
-- 
2.46.2



From rosenp at gmail.com  Mon Sep 30 15:49:18 2024
From: rosenp at gmail.com (Rosen Penev)
Date: Mon, 30 Sep 2024 15:49:18 -0700
Subject: [PATCH 2/3] mmc: mtd-sd: use devm_platform_ioremap_resource
In-Reply-To: <20240930224919.355359-1-rosenp@gmail.com>
References: <20240930224919.355359-1-rosenp@gmail.com>
Message-ID: <20240930224919.355359-3-rosenp@gmail.com>

My guess is some automated tool missed this transformation. Now looks
clearer as do what's happening. Also allows removal of struct resource.

Signed-off-by: Rosen Penev <rosenp at gmail.com>
---
 drivers/mmc/host/mtk-sd.c | 10 +++-------
 1 file changed, 3 insertions(+), 7 deletions(-)

diff --git a/drivers/mmc/host/mtk-sd.c b/drivers/mmc/host/mtk-sd.c
index c607312dfe07..4be13b9c2d71 100644
--- a/drivers/mmc/host/mtk-sd.c
+++ b/drivers/mmc/host/mtk-sd.c
@@ -2727,7 +2727,6 @@ static int msdc_drv_probe(struct platform_device *pdev)
 {
 	struct mmc_host *mmc;
 	struct msdc_host *host;
-	struct resource *res;
 	int ret;
 
 	if (!pdev->dev.of_node) {
@@ -2749,12 +2748,9 @@ static int msdc_drv_probe(struct platform_device *pdev)
 	if (IS_ERR(host->base))
 		return PTR_ERR(host->base);
 
-	res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
-	if (res) {
-		host->top_base = devm_ioremap_resource(&pdev->dev, res);
-		if (IS_ERR(host->top_base))
-			host->top_base = NULL;
-	}
+	host->top_base = devm_platform_ioremap_resource(pdev, 1);
+	if (IS_ERR(host->top_base))
+		host->top_base = NULL;
 
 	ret = mmc_regulator_get_supply(mmc);
 	if (ret)
-- 
2.46.2



From rosenp at gmail.com  Mon Sep 30 15:49:19 2024
From: rosenp at gmail.com (Rosen Penev)
Date: Mon, 30 Sep 2024 15:49:19 -0700
Subject: [PATCH 3/3] mmc: mtk-sd: fix devm_clk_get_optional usage
In-Reply-To: <20240930224919.355359-1-rosenp@gmail.com>
References: <20240930224919.355359-1-rosenp@gmail.com>
Message-ID: <20240930224919.355359-4-rosenp@gmail.com>

This already returns NULL when not found. However, it can return
EPROBE_DEFER and should thus return here.

Signed-off-by: Rosen Penev <rosenp at gmail.com>
---
 drivers/mmc/host/mtk-sd.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/drivers/mmc/host/mtk-sd.c b/drivers/mmc/host/mtk-sd.c
index 4be13b9c2d71..b02cbae96e89 100644
--- a/drivers/mmc/host/mtk-sd.c
+++ b/drivers/mmc/host/mtk-sd.c
@@ -2769,9 +2769,8 @@ static int msdc_drv_probe(struct platform_device *pdev)
 	if (!(mmc->caps2 & MMC_CAP2_NO_MMC)) {
 		host->crypto_clk = devm_clk_get_optional(&pdev->dev, "crypto");
 		if (IS_ERR(host->crypto_clk))
-			host->crypto_clk = NULL;
-		else
-			mmc->caps2 |= MMC_CAP2_CRYPTO;
+			return PTR_ERR(host->crypto_clk);
+		mmc->caps2 |= MMC_CAP2_CRYPTO;
 	}
 
 	host->irq = platform_get_irq(pdev, 0);
-- 
2.46.2



From pablo.sun at mediatek.com  Mon Sep 30 20:38:33 2024
From: pablo.sun at mediatek.com (Pablo Sun)
Date: Tue, 1 Oct 2024 11:38:33 +0800
Subject: [PATCH v2 3/6] nvmem: mtk-efuse: Enable postprocess for mt8188
 GPU speed binning
In-Reply-To: <57dfe684-c9a1-4cb3-8c87-9d2fef09aed7@collabora.com>
References: <20240927103005.17605-1-pablo.sun@mediatek.com>
 <20240927103005.17605-4-pablo.sun@mediatek.com>
 <57dfe684-c9a1-4cb3-8c87-9d2fef09aed7@collabora.com>
Message-ID: <329b554b-e029-0dfe-7c18-67c7c58f8302@mediatek.com>

Hi Angelo,


On 9/30/24 17:40, AngeloGioacchino Del Regno wrote:
> Il 27/09/24 12:30, Pablo Sun ha scritto:
>> Similar to mt8186, the efuse data for mt8188's GPU speed binning
>> requires post-process to convert the bit field format expected
>> by the OPP table.
>>
>> Since mt8188 efuse is not compatible to mt8186, add a new compatible
>> entry for mt8188 and enable postprocess.
>>
>> Signed-off-by: Pablo Sun <pablo.sun at mediatek.com>
> 
> I know I told you to just reuse the pdata from 8186, but there's something else
> that came to mind, here...
> 
> ...actually, the efuse block from 8188 is indeed compatible with 8186, meaning
> that the register r/w, etc, are all the same (bar the addresses, yes)
> 
> So, I wonder if it's not just a better idea to not even add mt8188-efuse in this
> driver's of_device_id array, and just add that to the binding so that we permit
> using
>  ??????? efuse: efuse at 11f20000 {
>  ??????????? compatible = "mediatek,mt8188-efuse",
>  ???????????????????? "mediatek,mt8186-efuse", "mediatek,efuse";
>  ??????????? [etc]
>  ??????? }

Thanks for proposing this. I agree that in the case of Mali GPU speed binning
info, mt8188 behaves exactly the same as mt8186, only the cell addresses are
different.

I wrote "mt8188 efuse is not compatible to mt8186" because I thought
different eFuse cell layout leads to incompatibility, but it is correct that
the cell layout differences can be expressed by the device tree nodes,
so they are actually compatible in terms of hardware interface.

I'll drop this patch ("nvmem: mtk-efuse: Enable postprocess for mt8188 GPU speed binning")
in v3 and update dt-binding "mediatek,efuse.yaml" instead.

> Means that in mediatek,efuse.yaml you'll have to add...
> 
>  ????? - items:
>  ????????? - enum:
>  ????????????? - mediatek,mt8188-efuse
>  ????????? - const: mediatek,mt8186-efuse
>  ????????? - const: mediatek,efuse <---- or without this, even.
> 
> In the end, the "mediatek,efuse" property is somewhat deprecated, so that'd
> also be a good time to start the dropping process, as I imagine that future SoCs
> would also need the same speedbin transformations - which means that they'll all
> be compatible with 8186....
[snip]

But I am not sure if we should now drop "mediatek,efuse". The post-process for
GPU speed binning info is only applicable to ARM Mali. Since there are MediaTek
SoCs that are not using ARM Mali, or not having GPU at all, would it make more sense
to keep the "mediatek,efuse" fallback compatible for those cases?


Best regards,
Pablo


From krzk at kernel.org  Mon Sep 30 23:16:38 2024
From: krzk at kernel.org (Krzysztof Kozlowski)
Date: Tue, 1 Oct 2024 08:16:38 +0200
Subject: [PATCH 1/2] ARM: dts: replace gpio = with gpios =
In-Reply-To: <20240930223550.353882-2-rosenp@gmail.com>
References: <20240930223550.353882-1-rosenp@gmail.com>
 <20240930223550.353882-2-rosenp@gmail.com>
Message-ID: <2915d4aa-a01d-4d00-ada9-43bbc227f9eb@kernel.org>

On 01/10/2024 00:35, Rosen Penev wrote:
> Found with dtc:
> 
> Warning (deprecated_gpio_property): '[*-]gpio' is deprecated, use
> '[*-]gpios' instead
> 
> Transformation performed with
> 
> find -name "*.dts" -exec sed -i 's/\tgpio = </\tgpios = </g' '{}' \
> find -name "*.dtsi" -exec sed -i 's/\tgpio = </\tgpios = </g' '{}' \

Uh, no, please check if each is correct and already handled by bindings.

> 
> Signed-off-by: Rosen Penev <rosenp at gmail.com>



Best regards,
Krzysztof



From krzk at kernel.org  Mon Sep 30 23:17:53 2024
From: krzk at kernel.org (Krzysztof Kozlowski)
Date: Tue, 1 Oct 2024 08:17:53 +0200
Subject: [PATCH 2/2] ARM: dts: assign reg to memory nodes
In-Reply-To: <20240930223550.353882-3-rosenp@gmail.com>
References: <20240930223550.353882-1-rosenp@gmail.com>
 <20240930223550.353882-3-rosenp@gmail.com>
Message-ID: <62220abe-196a-4434-a200-5e39af1d184d@kernel.org>

On 01/10/2024 00:35, Rosen Penev wrote:
> Fixes dtc warnings:

What warnings?

Anyway, please list platforms where you tested this. This patch might
break several of them.

Such one huge patch, not split per subach, is another problem. There is
no reason to make it one huge chunk.


Best regards,
Krzysztof



From krzk at kernel.org  Mon Sep 30 23:29:07 2024
From: krzk at kernel.org (Krzysztof Kozlowski)
Date: Tue, 1 Oct 2024 08:29:07 +0200
Subject: [PATCH v7 3/3] dt-bindings: mfd: mediatek: mt6397: Convert to DT
 schema format
In-Reply-To: <20240930073311.1486-3-macpaul.lin@mediatek.com>
References: <20240930073311.1486-1-macpaul.lin@mediatek.com>
 <20240930073311.1486-3-macpaul.lin@mediatek.com>
Message-ID: <psjwbo2vecr54vmz5ib2eurhpcaynpc67rc2nwuj2gtej6gqiu@4ysahn2ghthf>

On Mon, Sep 30, 2024 at 03:33:11PM +0800, Macpaul Lin wrote:
> Convert the mfd: mediatek: mt6397 binding to DT schema format.
> 
> MT6323, MT6358, and MT6397 are PMIC devices with multiple function
> subdevices. They share a common PMIC design but have variations in
> subdevice combinations.
> 
> Key updates in this conversion:
> 
> 1. RTC:
>    - Convert rtc-mt6397.txt and merge into parent MT6397 PMIC DT schema.
> 
> 2. Regulators:
>    - Align to generic name "regulators".
>    - Update references from .txt to .yaml for mt6323, mt6358, and mt6397
>      regulators.
>    - Simplify regulator name labels in device tree examples.
>    - Add a new 'mt6359-regulator' to the compatibles of regulators.

Why?

>      Merge from the other patch [1].
> 
> 3. ADC:
>    - Add a new 'adc' property and include a $ref for sub-device node of
>      MT6359 PMIC AUXADC: 'mediatek,mt6359-auxadc'.
>      Merge from the other patch [1].
> 
> 4. Audio Codec:
>    - Simplify Audio Codec part with updating compatible items.
>    - Add 'mt6359-codec' to the compatible

Why?
.
> 
> 5. Clocks:
>    - Align to generic name "clocks" for clockbuffer subdevices.
> 
> 6. LEDs:
>    - Convert leds-mt6323.txt and merge into parent MT6397 PMIC DT schema.
>    - Update LED binding.
> 
> 7. Keys:
>    - Add detailed descriptions for power and home keys.
>    - Add compatible: mediatek,mt6358-keys.
> 
> 8. Power Controller:
>    - Convert mt6323-poweroff.txt and merge into parent MT6397 PMIC DT
>      schema.
>    - Add #power-domain-cells property to fix dt-binding check error.
>    - Clarify "BBPU" as "Baseband power up".
> 
> 9. Pinctrl:
>    - Align to generic name "pinctrl" instead of "pin-controller".
> 
> 10. Compatible:
>    - Drop "mediatek,mt6357" since there is a separated DT Schema
>      for PMIC MT6357.
> 
> 11. Examples:
>    - MT6323: Retain complete examples for this PMIC.
>    - MT6358 and MT6397: simplify settings in regulators.
>     - Preserve "audio-codec", "clocks", "pinctrl", "rtc", and "keys"
>       sections as they contain typical settings for different PMICs.
> 
> Additional updates:
> - MAINTAINERS: Add co-maintainers and reference to
>   mfd/mediatek,mt6397.yaml for LED and power-controller drivers.
> - input/mediatek,pmic-keys.yaml: Update reference to
>   mfd/mediatek,mt6397.yaml.
> 
> References:
> [1] https://lore.kernel.org/all/20240925171156.9115-1-macpaul.lin at mediatek.com/
> 
> Signed-off-by: Sen Chu <sen.chu at mediatek.com>
> Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
> ---

> +
> +  adc:
> +    type: object
> +    $ref: /schemas/iio/adc/mediatek,mt6359-auxadc.yaml#
> +    unevaluatedProperties: false
> +
> +  audio-codec:
> +    type: object
> +    description:
> +      Audio codec support with MT6358, MT6359, and MT6397.
> +    additionalProperties: true

No, this cannot be true. Schema is incomplete for listed compatibles.

> +
> +    properties:
> +      compatible:
> +        oneOf:
> +          - enum:
> +              - mediatek,mt6358-sound
> +              - mediatek,mt6359-codec

There was no such compatible.

Why do you add non-existing compatibles during conversion?



From krzk at kernel.org  Mon Sep 30 23:34:35 2024
From: krzk at kernel.org (Krzysztof Kozlowski)
Date: Tue, 1 Oct 2024 08:34:35 +0200
Subject: [PATCH v7 2/3] ASoC: dt-bindings: mt6358: Convert to DT Schema
In-Reply-To: <20240930073311.1486-2-macpaul.lin@mediatek.com>
References: <20240930073311.1486-1-macpaul.lin@mediatek.com>
 <20240930073311.1486-2-macpaul.lin@mediatek.com>
Message-ID: <6l6hb264yvhd6e6neurd5t4gmv5z5c5gpg27icijif3hq4cuu7@pbhfkdxb2eam>

On Mon, Sep 30, 2024 at 03:33:10PM +0800, Macpaul Lin wrote:
> Convert the MediaTek MT6358 Audio CODEC bindings to DT schema.
> 
> This change implements the following updates:
> 1. Compatible property: Added the const 'mediatek,mt6358-sound'
>    to ensure alignment with the schema in the actual (DTS) file
>    "mt8186-corsola.dtsi" with 'mediatek,mt6366-sound'.
> 2. Example: Removed the example section, as it should be relocated to
>    the MT6397 PMIC file 'mfd/mediatek,mt6397.yaml'.
> 
> Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
> ---
>  .../devicetree/bindings/sound/mt6358.txt      | 26 ------------
>  .../devicetree/bindings/sound/mt6358.yaml     | 41 +++++++++++++++++++
>  2 files changed, 41 insertions(+), 26 deletions(-)
>  delete mode 100644 Documentation/devicetree/bindings/sound/mt6358.txt
>  create mode 100644 Documentation/devicetree/bindings/sound/mt6358.yaml
> 
> Changess for v1~v6:
>  - It was not in the origin patch set.
> 
> Changes for v7:
>  - It is seperated from the origin patch set (2/2, v6).
>    It could simplifies the audio-codec node in next patch (3/3, v7)
>    of 'mfd/mediatek,mt6397.yaml'
> 
> diff --git a/Documentation/devicetree/bindings/sound/mt6358.txt b/Documentation/devicetree/bindings/sound/mt6358.txt
> deleted file mode 100644
> index fbe9e55c68f5..000000000000
> --- a/Documentation/devicetree/bindings/sound/mt6358.txt
> +++ /dev/null
> @@ -1,26 +0,0 @@
> -Mediatek MT6358 Audio Codec
> -
> -The communication between MT6358 and SoC is through Mediatek PMIC wrapper.
> -For more detail, please visit Mediatek PMIC wrapper documentation.
> -
> -Must be a child node of PMIC wrapper.
> -
> -Required properties:
> -
> -- compatible - "string" - One of:
> -    "mediatek,mt6358-sound"
> -    "mediatek,mt6366-sound"
> -- Avdd-supply : power source of AVDD
> -
> -Optional properties:
> -- mediatek,dmic-mode : Indicates how many data pins are used to transmit two
> -	channels of PDM signal. 0 means two wires, 1 means one wire. Default
> -	value is 0.
> -
> -Example:
> -
> -mt6358_snd {
> -	compatible = "mediatek,mt6358-sound";
> -	Avdd-supply = <&mt6358_vaud28_reg>;
> -	mediatek,dmic-mode = <0>;
> -};
> diff --git a/Documentation/devicetree/bindings/sound/mt6358.yaml b/Documentation/devicetree/bindings/sound/mt6358.yaml
> new file mode 100644
> index 000000000000..5f7611e26a89
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/sound/mt6358.yaml
> @@ -0,0 +1,41 @@
> +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
> +%YAML 1.2
> +---
> +$id: http://devicetree.org/schemas/sound/mt6358.yaml#
> +$schema: http://devicetree.org/meta-schemas/core.yaml#
> +
> +title: Mediatek MT6358 Audio Codec
> +
> +maintainers:
> +  - Jiaxin Yu <jiaxin.yu at mediatek.com>
> +  - Macpaul Lin <macpaul.lin at mediatek.com>
> +
> +description: |
> +  The communication between MT6358 and SoC is through Mediatek PMIC wrapper.
> +  For more detail, please visit Mediatek PMIC wrapper documentation.
> +  Must be a child node of PMIC wrapper.
> +
> +properties:
> +  compatible:
> +    enum:
> +      - mediatek,mt6366-sound
> +      - mediatek,mt6358-sound
> +    const: mediatek,mt6358-sound

This wasn't ever tested.

Do not send untested code, it's a waste of reviewers' time.

Best regards,
Krzysztof



From krzk at kernel.org  Mon Sep 30 23:35:58 2024
From: krzk at kernel.org (Krzysztof Kozlowski)
Date: Tue, 1 Oct 2024 08:35:58 +0200
Subject: [PATCH v7 3/3] dt-bindings: mfd: mediatek: mt6397: Convert to DT
 schema format
In-Reply-To: <psjwbo2vecr54vmz5ib2eurhpcaynpc67rc2nwuj2gtej6gqiu@4ysahn2ghthf>
References: <20240930073311.1486-1-macpaul.lin@mediatek.com>
 <20240930073311.1486-3-macpaul.lin@mediatek.com>
 <psjwbo2vecr54vmz5ib2eurhpcaynpc67rc2nwuj2gtej6gqiu@4ysahn2ghthf>
Message-ID: <5a29ddaf-cc01-498c-943c-b65736e2899e@kernel.org>

On 01/10/2024 08:29, Krzysztof Kozlowski wrote:
> On Mon, Sep 30, 2024 at 03:33:11PM +0800, Macpaul Lin wrote:
>> Convert the mfd: mediatek: mt6397 binding to DT schema format.
>>
>> MT6323, MT6358, and MT6397 are PMIC devices with multiple function
>> subdevices. They share a common PMIC design but have variations in
>> subdevice combinations.
>>
>> Key updates in this conversion:
>>
>> 1. RTC:
>>    - Convert rtc-mt6397.txt and merge into parent MT6397 PMIC DT schema.
>>
>> 2. Regulators:
>>    - Align to generic name "regulators".
>>    - Update references from .txt to .yaml for mt6323, mt6358, and mt6397
>>      regulators.
>>    - Simplify regulator name labels in device tree examples.
>>    - Add a new 'mt6359-regulator' to the compatibles of regulators.
> 
> Why?
> 
>>      Merge from the other patch [1].
>>
>> 3. ADC:
>>    - Add a new 'adc' property and include a $ref for sub-device node of
>>      MT6359 PMIC AUXADC: 'mediatek,mt6359-auxadc'.
>>      Merge from the other patch [1].
>>
>> 4. Audio Codec:
>>    - Simplify Audio Codec part with updating compatible items.
>>    - Add 'mt6359-codec' to the compatible
> 
> Why?
> .
>>
>> 5. Clocks:
>>    - Align to generic name "clocks" for clockbuffer subdevices.
>>
>> 6. LEDs:
>>    - Convert leds-mt6323.txt and merge into parent MT6397 PMIC DT schema.
>>    - Update LED binding.
>>
>> 7. Keys:
>>    - Add detailed descriptions for power and home keys.
>>    - Add compatible: mediatek,mt6358-keys.
>>
>> 8. Power Controller:
>>    - Convert mt6323-poweroff.txt and merge into parent MT6397 PMIC DT
>>      schema.
>>    - Add #power-domain-cells property to fix dt-binding check error.
>>    - Clarify "BBPU" as "Baseband power up".
>>
>> 9. Pinctrl:
>>    - Align to generic name "pinctrl" instead of "pin-controller".
>>
>> 10. Compatible:
>>    - Drop "mediatek,mt6357" since there is a separated DT Schema
>>      for PMIC MT6357.
>>
>> 11. Examples:
>>    - MT6323: Retain complete examples for this PMIC.
>>    - MT6358 and MT6397: simplify settings in regulators.
>>     - Preserve "audio-codec", "clocks", "pinctrl", "rtc", and "keys"
>>       sections as they contain typical settings for different PMICs.
>>
>> Additional updates:
>> - MAINTAINERS: Add co-maintainers and reference to
>>   mfd/mediatek,mt6397.yaml for LED and power-controller drivers.
>> - input/mediatek,pmic-keys.yaml: Update reference to
>>   mfd/mediatek,mt6397.yaml.
>>
>> References:
>> [1] https://lore.kernel.org/all/20240925171156.9115-1-macpaul.lin at mediatek.com/
>>
>> Signed-off-by: Sen Chu <sen.chu at mediatek.com>
>> Signed-off-by: Macpaul Lin <macpaul.lin at mediatek.com>
>> ---
> 
>> +
>> +  adc:
>> +    type: object
>> +    $ref: /schemas/iio/adc/mediatek,mt6359-auxadc.yaml#
>> +    unevaluatedProperties: false
>> +
>> +  audio-codec:
>> +    type: object
>> +    description:
>> +      Audio codec support with MT6358, MT6359, and MT6397.
>> +    additionalProperties: true
> 
> No, this cannot be true. Schema is incomplete for listed compatibles.

I saw now your patch for ASoC, so this is fine.

All my other questions stay valid - why are you adding new devices in
patch which is supposed to be ONLY conversion.

> 
>> +
>> +    properties:
>> +      compatible:
>> +        oneOf:
>> +          - enum:
>> +              - mediatek,mt6358-sound
>> +              - mediatek,mt6359-codec
> 
> There was no such compatible.
> 
> Why do you add non-existing compatibles during conversion?
> 

Best regards,
Krzysztof



From viresh.kumar at linaro.org  Mon Sep 30 23:39:19 2024
From: viresh.kumar at linaro.org (Viresh Kumar)
Date: Tue, 1 Oct 2024 12:09:19 +0530
Subject: [PATCH v1 1/2] PM / devfreq: mediatek: protect oop in critical
 session
In-Reply-To: <20240913103933.30895-2-chun-jen.tseng@mediatek.com>
References: <20240913103933.30895-1-chun-jen.tseng@mediatek.com>
 <20240913103933.30895-2-chun-jen.tseng@mediatek.com>
Message-ID: <20241001063919.ekqfd4epcefh5eci@vireshk-i7>

On 13-09-24, 18:39, Mark Tseng wrote:
> mtk_ccifreq_target() & mtk_ccifreq_opp_notifier() is re-enter funtion
> when cpufreq governor is more than one. It should add global mutex to
> protect OPP , avoid get wrong frequency & voltage.

I am not sure I understood the problem well. Can you explain clearly
why the current locking doesn't work with details call chain ?

-- 
viresh


From viresh.kumar at linaro.org  Mon Sep 30 23:41:45 2024
From: viresh.kumar at linaro.org (Viresh Kumar)
Date: Tue, 1 Oct 2024 12:11:45 +0530
Subject: [PATCH v1 1/2] PM / devfreq: mediatek: protect oop in critical
 session
In-Reply-To: <20241001063919.ekqfd4epcefh5eci@vireshk-i7>
References: <20240913103933.30895-1-chun-jen.tseng@mediatek.com>
 <20240913103933.30895-2-chun-jen.tseng@mediatek.com>
 <20241001063919.ekqfd4epcefh5eci@vireshk-i7>
Message-ID: <20241001064145.fnnzcsrewz6pttoe@vireshk-i7>

On 01-10-24, 12:09, Viresh Kumar wrote:
> On 13-09-24, 18:39, Mark Tseng wrote:
> > mtk_ccifreq_target() & mtk_ccifreq_opp_notifier() is re-enter funtion
> > when cpufreq governor is more than one. It should add global mutex to
> > protect OPP , avoid get wrong frequency & voltage.
> 
> I am not sure I understood the problem well. Can you explain clearly
> why the current locking doesn't work with details call chain ?

Ended up replying to the wrong email. This comment is for patch 2/2.

-- 
viresh


From viresh.kumar at linaro.org  Mon Sep 30 23:43:51 2024
From: viresh.kumar at linaro.org (Viresh Kumar)
Date: Tue, 1 Oct 2024 12:13:51 +0530
Subject: [PATCH v1 2/2] cpufreq: mediatek: Fixed cpufreq has 2 policy
 will cause concurrency
In-Reply-To: <20240913103933.30895-3-chun-jen.tseng@mediatek.com>
References: <20240913103933.30895-1-chun-jen.tseng@mediatek.com>
 <20240913103933.30895-3-chun-jen.tseng@mediatek.com>
Message-ID: <20241001064351.vpahvdwzmvjblnd7@vireshk-i7>

On 13-09-24, 18:39, Mark Tseng wrote:
> mtk_cpufreq_set_target() is re-enter function but the mutex lock decalre
> in mtk_cpu_dvfs_info structure for each policy. It should change to
> global variable for critical session avoid policy get wrong OPP.

I am not sure I understood the problem well. Can you explain clearly
why the current locking doesn't work with details call chain ?

It is normally okay to have per-policy locks otherwise. Are there any
common resources being used between policies that need locking ?

> SoC with CCI architecture should set transition_delay to 10 ms
> because cpufreq need to call devfreq notifier in async mode. if delay
> less than 10ms may get wrong OPP-level in CCI driver.
> 
> Add CPUFREQ_ASYNC_NOTIFICATION flages for cpufreq policy because some of
> process will get CPU frequency by cpufreq sysfs node. It may get wrong
> frequency then call cpufreq_out_of_sync() to fixed frequency.

Don't do so much in a single commit. Separate commits for each logical
change so they can be reviewed well. Also don't send cpufreq along
with devfreq changes, unless they are dependent on each other.

-- 
viresh


